Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# Agent Speed

**AI agent が全力で走る瞬間を、目で感じる。** Codex・Claude Code・Claude Desktop・DSH(DeepSeek Harness)・OpenCode・Gemini CLI・omp・Antigravity・WorkBuddy・WorkBuddy AI・ZCode・Kimi Code CLI・Grok Build のトークン速度をリアルタイムに映し出すネイティブ計器。待機中は静かに、レッドラインでは燃え上がる。
**AI agent が全力で走る瞬間を、目で感じる。** Codex・Claude Code・Claude Desktop・DSH(DeepSeek Harness)・OpenCode・Gemini CLI・omp・Antigravity・WorkBuddy・WorkBuddy AI・ZCode・Kimi Code CLI・Grok Build・Hermes のトークン速度をリアルタイムに映し出すネイティブ計器。待機中は静かに、レッドラインでは燃え上がる。

[English](README.md) · [繁體中文](README.zh-TW.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md)

Expand Down Expand Up @@ -88,6 +88,9 @@ Agent Speed は、agent がすでにローカルに書き出している記録
| ZCode | `~/.zcode/cli/db/db.sqlite`(または `$ZCODE_DATA_BASE_DIR/.zcode/cli/db`) |
| Kimi Code CLI(TypeScript v2) | `~/.kimi-code/sessions`(または `$KIMI_CODE_HOME/sessions`) |
| Grok Build | `~/.grok/sessions`(または `$GROK_HOME/sessions`) |
| Hermes(デスクトップと CLI) | `~/.hermes/logs/agent.log` と番号付きローテーションログ。名前付きプロファイルを含む(または `$HERMES_HOME`。Windows: `%LOCALAPPDATA%/hermes`) |

Hermes はローカルログから完了した API 呼び出しの使用量を読み取り、完了後に速度を更新します。ログに保存された 0.1 秒単位の所要時間を使用し、ツール実行やメッセージ間の待機時間は含めません。使用量のない古いログは復元できません。設定で Hermes のデータまたは `logs` フォルダを選択できます。

Grok Build のターン別・モデル別バッチに保存されたトークン数、API 所要時間、実際の呼び出し回数を、既存の速度エンジンで計算します。サブエージェントの使用量は親に集約されるため一度だけ計上し、子の動作状態も表示します。個々の呼び出しのタイムラインは保存されないため、バッチ内の並列実行速度は復元できません。

Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# Agent Speed

**Feel your AI agents run.** A native racing instrument for the live token speed of Codex, Claude Code, Claude Desktop, DSH (DeepSeek Harness), OpenCode, Gemini CLI, omp, Antigravity, WorkBuddy, WorkBuddy AI, ZCode, Kimi Code CLI and Grok Build — calm when idle, on fire at the redline.
**Feel your AI agents run.** A native racing instrument for the live token speed of Codex, Claude Code, Claude Desktop, DSH (DeepSeek Harness), OpenCode, Gemini CLI, omp, Antigravity, WorkBuddy, WorkBuddy AI, ZCode, Kimi Code CLI, Grok Build and Hermes — calm when idle, on fire at the redline.

[English](README.md) · [繁體中文](README.zh-TW.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md)

Expand Down Expand Up @@ -93,6 +93,9 @@ Agent Speed reads the transcripts your agents already write on your disk:
| ZCode | `~/.zcode/cli/db/db.sqlite` (or `$ZCODE_DATA_BASE_DIR/.zcode/cli/db`) |
| Kimi Code CLI (TypeScript v2) | `~/.kimi-code/sessions` (or `$KIMI_CODE_HOME/sessions`) |
| Grok Build | `~/.grok/sessions` (or `$GROK_HOME/sessions`) |
| Hermes (desktop and CLI) | `~/.hermes/logs/agent.log` and numbered rotations, including named profiles (or `$HERMES_HOME`; Windows: `%LOCALAPPDATA%/hermes`) |

Hermes reads completed API-call usage from its local logs. Speed updates after each call finishes; it uses the logged latency (rounded to 0.1 seconds), not time spent on tools or between messages. Older logs without usage records cannot be reconstructed. Hermes home or `logs` folders can be selected in Settings.

Grok Build supplies native per-turn model batches: token counts, API duration and the actual number of model calls enter the same speed engine. Child usage is already included in its parent and is counted once; child activity remains visible. Its individual-call timeline is not stored, so intra-batch concurrency cannot be reconstructed.

Expand Down
5 changes: 4 additions & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# Agent Speed

**看见你的 AI agent 全速奔跑。** 为 Codex、Claude Code、Claude Desktop、DSH(DeepSeek Harness)、OpenCode、Gemini CLI、omp、Antigravity、WorkBuddy、WorkBuddy AI、ZCode、Kimi Code CLI 与 Grok Build 打造的原生实时 token 速度仪表——空闲时安静,冲到红线时全面燃烧。
**看见你的 AI agent 全速奔跑。** 为 Codex、Claude Code、Claude Desktop、DSH(DeepSeek Harness)、OpenCode、Gemini CLI、omp、Antigravity、WorkBuddy、WorkBuddy AI、ZCode、Kimi Code CLI、Grok Build 与 Hermes 打造的原生实时 token 速度仪表——空闲时安静,冲到红线时全面燃烧。

[English](README.md) · [繁體中文](README.zh-TW.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md)

Expand Down Expand Up @@ -88,6 +88,9 @@ Agent Speed 只读取 agent 本来就写在你电脑上的记录:
| ZCode | `~/.zcode/cli/db/db.sqlite`(或 `$ZCODE_DATA_BASE_DIR/.zcode/cli/db`) |
| Kimi Code CLI(TypeScript v2) | `~/.kimi-code/sessions`(或 `$KIMI_CODE_HOME/sessions`) |
| Grok Build | `~/.grok/sessions`(或 `$GROK_HOME/sessions`) |
| Hermes(桌面端和 CLI) | `~/.hermes/logs/agent.log` 及数字轮转日志,含命名配置(或 `$HERMES_HOME`;Windows:`%LOCALAPPDATA%/hermes`) |

Hermes 从本地日志读取已完成 API 调用的用量,速度在每次调用结束后更新,采用日志中精确到 0.1 秒的耗时,不计入工具执行或消息之间的等待。没有用量记录的旧日志无法还原。可以在设置中选择 Hermes 数据或 `logs` 文件夹。

Grok Build 提供每回合、每模型的原生批次记录:Token、API 耗时与实际调用数交给同一套速度引擎计算。子 agent 用量已合并在父会话中,因此只计算一次,仍会显示子 agent 的活动状态;上游未保存每次调用的独立时间线,无法重建批次内的并行速度。

Expand Down
5 changes: 4 additions & 1 deletion README.zh-TW.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# Agent Speed

**看見你的 AI agent 全速奔跑。** 為 Codex、Claude Code、Claude Desktop、DSH(DeepSeek Harness)、OpenCode、Gemini CLI、omp、Antigravity、WorkBuddy、WorkBuddy AI、ZCode、Kimi Code CLI 與 Grok Build 打造的原生即時 token 速度儀表——閒置時安靜,衝到紅線時全面燃燒。
**看見你的 AI agent 全速奔跑。** 為 Codex、Claude Code、Claude Desktop、DSH(DeepSeek Harness)、OpenCode、Gemini CLI、omp、Antigravity、WorkBuddy、WorkBuddy AI、ZCode、Kimi Code CLI、Grok Build 與 Hermes 打造的原生即時 token 速度儀表——閒置時安靜,衝到紅線時全面燃燒。

[English](README.md) · [繁體中文](README.zh-TW.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md)

Expand Down Expand Up @@ -88,6 +88,9 @@ Agent Speed 只讀取 agent 本來就寫在你電腦上的紀錄:
| ZCode | `~/.zcode/cli/db/db.sqlite`(或 `$ZCODE_DATA_BASE_DIR/.zcode/cli/db`) |
| Kimi Code CLI(TypeScript v2) | `~/.kimi-code/sessions`(或 `$KIMI_CODE_HOME/sessions`) |
| Grok Build | `~/.grok/sessions`(或 `$GROK_HOME/sessions`) |
| Hermes(桌面版和 CLI) | `~/.hermes/logs/agent.log` 及數字輪轉日誌,含具名設定檔(或 `$HERMES_HOME`;Windows:`%LOCALAPPDATA%/hermes`) |

Hermes 從本機日誌讀取已完成 API 呼叫的用量,速度在每次呼叫結束後更新,採用日誌中精確至 0.1 秒的耗時,不計入工具執行或訊息之間的等待。沒有用量紀錄的舊日誌無法還原。可在設定中選擇 Hermes 資料或 `logs` 資料夾。

Grok Build 提供每回合、每模型的原生批次紀錄:Token、API 耗時與實際呼叫數交給同一套速度引擎計算。子 agent 用量已合併在父工作階段中,因此只計算一次,仍會顯示子 agent 的活動狀態;上游未保存每次呼叫的獨立時間線,無法重建批次內的並行速度。

Expand Down
6 changes: 6 additions & 0 deletions macos/Resources/strings.macos.json
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,12 @@
"en": "Traffic",
"ja": "通信量"
},
"mac.settings.sources.chooseHermes": {
"zh-Hant": "選擇 Hermes 資料夾",
"zh-Hans": "选择 Hermes 文件夹",
"en": "Choose Hermes Folder",
"ja": "Hermes フォルダを選択"
},
"mac.settings.sources.chooseZcode": {
"zh-Hant": "選擇 ZCode 資料夾",
"zh-Hans": "选择 ZCode 文件夹",
Expand Down
3 changes: 2 additions & 1 deletion macos/Sources/AgentSpeed/App/PreviewData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ enum PreviewData {
switch source.kind {
case .deepseek: source.available = false
case .claudeDesktop: source.enabled = false
case .codex, .claudeCode, .opencode, .gemini, .omp, .antigravity, .workbuddy, .workbuddyAi, .zcode, .kimi, .grokBuild: return source
case .codex, .claudeCode, .opencode, .gemini, .omp, .antigravity, .workbuddy, .workbuddyAi, .zcode, .kimi, .grokBuild, .hermes: return source
}
source.sessionCount = 0
source.live = .zero
Expand Down Expand Up @@ -209,6 +209,7 @@ enum PreviewData {
case .zcode: 3
case .kimi: 2
case .grokBuild: 1
case .hermes: 1
}
}
}
1 change: 1 addition & 0 deletions macos/Sources/AgentSpeed/History/Model/HistoryCSV.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ enum HistoryCSV {
case .zcode: "zcode"
case .kimi: "kimi"
case .grokBuild: "grokBuild"
case .hermes: "hermes"
}
}

Expand Down
3 changes: 3 additions & 0 deletions macos/Sources/AgentSpeed/Localization/StringTable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ enum StringTable {
"mac.settings.sources.chooseDsh": Entry("選擇 DeepSeek Harness 的 sessions 資料夾", "选择 DeepSeek Harness 的 sessions 文件夹", "Choose the DeepSeek Harness sessions folder", "DeepSeek Harness の sessions フォルダを選択"),
"mac.settings.sources.chooseGemini": Entry("選擇 Gemini CLI 的 tmp 資料夾", "选择 Gemini CLI 的 tmp 文件夹", "Choose the Gemini CLI tmp folder", "Gemini CLI の tmp フォルダを選択"),
"mac.settings.sources.chooseGrokBuild": Entry("選擇 Grok Build 資料夾", "选择 Grok Build 文件夹", "Choose Grok Build Folder", "Grok Build フォルダを選択"),
"mac.settings.sources.chooseHermes": Entry("選擇 Hermes 資料夾", "选择 Hermes 文件夹", "Choose Hermes Folder", "Hermes フォルダを選択"),
"mac.settings.sources.chooseKimi": Entry("選擇 Kimi Code CLI 資料夾", "选择 Kimi Code CLI 文件夹", "Choose Kimi Code CLI Folder", "Kimi Code CLI フォルダを選択"),
"mac.settings.sources.chooseOmp": Entry("選擇 omp 的 sessions 資料夾", "选择 omp 的 sessions 文件夹", "Choose the omp sessions folder", "omp の sessions フォルダを選択"),
"mac.settings.sources.chooseOpencode": Entry("選擇內含 opencode.db 的 OpenCode 資料夾", "选择包含 opencode.db 的 OpenCode 文件夹", "Choose the OpenCode folder that contains opencode.db", "opencode.db を含む OpenCode のフォルダを選択"),
Expand Down Expand Up @@ -625,6 +626,7 @@ enum StringTable {
"settings.sources.dshHint": Entry("DeepSeek Harness(dsh)桌面版與命令列共用這個資料夾。", "DeepSeek Harness(dsh)桌面版与命令行共用这个文件夹。", "The DeepSeek Harness (dsh) desktop app and CLI share this folder.", "DeepSeek Harness(dsh)のデスクトップアプリと CLI はこのフォルダを共有します。"),
"settings.sources.geminiHint": Entry("Gemini CLI 的對話紀錄資料夾。", "Gemini CLI 的对话记录文件夹。", "The Gemini CLI conversation folder.", "Gemini CLI の会話記録フォルダです。"),
"settings.sources.grokBuildHint": Entry("讀取 Grok Build 的 sessions 資料夾,包含各工作階段的更新紀錄。", "读取 Grok Build 的 sessions 文件夹,包括各会话的更新记录。", "Reads Grok Build’s sessions folder and its session update records.", "Grok Build の sessions フォルダと各セッションの更新記録を読み取ります。"),
"settings.sources.hermesHint": Entry("讀取 Hermes 的本機 API 呼叫日誌(含具名設定檔);每次呼叫完成後更新速度。可選擇 Hermes 資料或 logs 資料夾。", "读取 Hermes 的本地 API 调用日志(含命名配置);每次调用完成后更新速度。可选择 Hermes 数据或 logs 文件夹。", "Reads Hermes’s local API call logs, including named profiles. Speed updates after each call completes. Choose the Hermes home or logs folder.", "名前付きプロファイルを含む Hermes のローカル API ログを読み取り、呼び出し完了後に速度を更新します。Hermes のデータまたは logs フォルダを選択できます。"),
"settings.sources.kimiHint": Entry("讀取 Kimi Code CLI 的 sessions 資料夾,包含主 agent 與子 agent 的紀錄。", "读取 Kimi Code CLI 的 sessions 文件夹,包括主 agent 和子 agent 的记录。", "Reads Kimi Code CLI’s sessions folder, including main agents and subagents.", "Kimi Code CLI の sessions フォルダから、メインエージェントとサブエージェントの記録を読み取ります。"),
"settings.sources.ompHint": Entry("omp(oh-my-pi)的 sessions 資料夾,通常是 ~/.omp/agent/sessions。未選擇資料夾時,也會自動讀取各個具名設定檔。", "omp(oh-my-pi)的 sessions 文件夹,通常是 ~/.omp/agent/sessions。未选择文件夹时,也会自动读取各个命名配置文件。", "The sessions folder of omp (oh-my-pi), usually ~/.omp/agent/sessions. Unless you choose a folder, named profiles are included automatically.", "omp(oh-my-pi)の sessions フォルダです。通常は ~/.omp/agent/sessions です。フォルダを選ばない場合は、名前付きプロファイルも自動で読み込みます。"),
"settings.sources.opencodeHint": Entry("OpenCode 命令列與桌面版共用這個資料庫,只會以唯讀方式讀取。", "OpenCode 命令行与桌面版共用这个数据库,只会以只读方式读取。", "The OpenCode CLI and desktop app share this database; it is only ever read.", "OpenCode の CLI とデスクトップ版はこのデータベースを共有します。読み取り専用で開きます。"),
Expand Down Expand Up @@ -652,6 +654,7 @@ enum StringTable {
"source.folderMissing": Entry("未找到資料夾", "未找到文件夹", "Folder not found", "フォルダが見つかりません"),
"source.gemini": Entry("Gemini CLI", "Gemini CLI", "Gemini CLI", "Gemini CLI"),
"source.grokBuild": Entry("Grok Build", "Grok Build", "Grok Build", "Grok Build"),
"source.hermes": Entry("Hermes", "Hermes", "Hermes", "Hermes"),
"source.kimi": Entry("Kimi Code CLI", "Kimi Code CLI", "Kimi Code CLI", "Kimi Code CLI"),
"source.notFound": Entry("未偵測到", "未检测到", "Not detected", "未検出"),
"source.omp": Entry("omp", "omp", "omp", "omp"),
Expand Down
7 changes: 5 additions & 2 deletions macos/Sources/AgentSpeed/Settings/AppSettings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ final class AppSettings {
var workbuddyRoot: URL? { didSet { store(workbuddyRoot?.path, .workbuddyRoot) } }
/// WorkBuddy AI's data folder (or its `projects` folder), replacing `~/.workbuddy-ai`.
var workbuddyAiRoot: URL? { didSet { store(workbuddyAiRoot?.path, .workbuddyAiRoot) } }
var hermesRoot: URL? { didSet { store(hermesRoot?.path, .hermesRoot) } }
var zcodeRoot: URL? { didSet { store(zcodeRoot?.path, .zcodeRoot) } }
var kimiRoot: URL? { didSet { store(kimiRoot?.path, .kimiRoot) } }
var grokBuildRoot: URL? { didSet { store(grokBuildRoot?.path, .grokBuildRoot) } }
Expand Down Expand Up @@ -157,6 +158,7 @@ final class AppSettings {
antigravityRoot = Self.url(defaults.string(forKey: Key.antigravityRoot.rawValue))
workbuddyRoot = Self.url(defaults.string(forKey: Key.workbuddyRoot.rawValue))
workbuddyAiRoot = Self.url(defaults.string(forKey: Key.workbuddyAiRoot.rawValue))
hermesRoot = Self.url(defaults.string(forKey: Key.hermesRoot.rawValue))
zcodeRoot = Self.url(defaults.string(forKey: Key.zcodeRoot.rawValue))
kimiRoot = Self.url(defaults.string(forKey: Key.kimiRoot.rawValue))
grokBuildRoot = Self.url(defaults.string(forKey: Key.grokBuildRoot.rawValue))
Expand Down Expand Up @@ -191,7 +193,8 @@ final class AppSettings {
workbuddyAiRoot: workbuddyAiRoot,
zcodeRoot: zcodeRoot,
kimiRoot: kimiRoot,
grokBuildRoot: grokBuildRoot
grokBuildRoot: grokBuildRoot,
hermesRoot: hermesRoot
)
}

Expand Down Expand Up @@ -256,7 +259,7 @@ final class AppSettings {
case effects, celebratePeaks, responsePulses
case enabledSources, knownSources
case codexRoot, claudeRoot, dshRoot, opencodeRoot, geminiRoot, ompRoot, antigravityRoot, workbuddyRoot, workbuddyAiRoot
case zcodeRoot, kimiRoot, grokBuildRoot
case zcodeRoot, kimiRoot, grokBuildRoot, hermesRoot
case autoCheckUpdates
case networkEnabled, syncPrices, currency, liveUnit, subscriptionSources, includeSubscriptions
case heroLastTitle
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ enum TranscriptFolder: CaseIterable {
case zcode
case kimi
case grokBuild
case hermes

/// Every default location, in reading order.
var defaultURLs: [URL] {
Expand All @@ -33,6 +34,7 @@ enum TranscriptFolder: CaseIterable {
case .zcode: [LiveMonitor.defaultZcodeRoot]
case .kimi: [LiveMonitor.defaultKimiRoot]
case .grokBuild: [LiveMonitor.defaultGrokBuildRoot]
case .hermes: [LiveMonitor.defaultHermesRoot]
case .workbuddyAi: [LiveMonitor.defaultWorkBuddyAiDataFolder]
}
}
Expand All @@ -52,6 +54,7 @@ enum TranscriptFolder: CaseIterable {
case .zcode: "mac.settings.sources.chooseZcode"
case .kimi: "mac.settings.sources.chooseKimi"
case .grokBuild: "mac.settings.sources.chooseGrokBuild"
case .hermes: "mac.settings.sources.chooseHermes"
case .workbuddyAi: "mac.settings.sources.chooseWorkbuddyAi"
}
}
Expand All @@ -70,6 +73,7 @@ enum TranscriptFolder: CaseIterable {
case .zcode: "settings.sources.zcodeHint"
case .kimi: "settings.sources.kimiHint"
case .grokBuild: "settings.sources.grokBuildHint"
case .hermes: "settings.sources.hermesHint"
case .workbuddyAi: "settings.sources.workbuddyAiHint"
}
}
Expand All @@ -88,6 +92,7 @@ enum TranscriptFolder: CaseIterable {
case .zcode: settings.zcodeRoot
case .kimi: settings.kimiRoot
case .grokBuild: settings.grokBuildRoot
case .hermes: settings.hermesRoot
case .workbuddyAi: settings.workbuddyAiRoot
}
}
Expand All @@ -114,7 +119,7 @@ enum TranscriptFolder: CaseIterable {
case .antigravity:
let found = defaultURLs.filter(isReadable)
return found.isEmpty ? defaultURLs : found
case .codex, .claude, .dsh, .opencode, .gemini, .workbuddy, .workbuddyAi, .zcode, .kimi, .grokBuild:
case .codex, .claude, .dsh, .opencode, .gemini, .workbuddy, .workbuddyAi, .zcode, .kimi, .grokBuild, .hermes:
return defaultURLs
}
}
Expand Down Expand Up @@ -142,6 +147,7 @@ enum TranscriptFolder: CaseIterable {
case .zcode: settings.zcodeRoot = value
case .kimi: settings.kimiRoot = value
case .grokBuild: settings.grokBuildRoot = value
case .hermes: settings.hermesRoot = value
case .workbuddyAi: settings.workbuddyAiRoot = value
}
}
Expand All @@ -152,7 +158,7 @@ enum TranscriptFolder: CaseIterable {
switch self {
case .workbuddy, .workbuddyAi:
Self.isSameFolder(LiveMonitor.workbuddyProjectsFolder(url), LiveMonitor.workbuddyProjectsFolder(defaultURL))
case .codex, .claude, .dsh, .opencode, .gemini, .omp, .antigravity, .zcode, .kimi, .grokBuild:
case .codex, .claude, .dsh, .opencode, .gemini, .omp, .antigravity, .zcode, .kimi, .grokBuild, .hermes:
Self.isSameFolder(url, defaultURL)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ extension SourceKind {
case .zcode: .zcode
case .kimi: .kimi
case .grokBuild: .grokBuild
case .hermes: .hermes
}
}
}
Expand Down
Loading