@armadra/agent 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +177 -304
- package/CHANGELOG.zh-CN.md +442 -0
- package/README.md +408 -364
- package/README.zh-CN.md +705 -0
- package/dist/agent/session-plan.js +2 -2
- package/dist/agent/session-state.d.ts +3 -0
- package/dist/agent/session-state.js +20 -0
- package/dist/agent/session-subagent.d.ts +15 -1
- package/dist/agent/session-subagent.js +26 -3
- package/dist/agent/session-telemetry.d.ts +16 -2
- package/dist/agent/session-telemetry.js +29 -7
- package/dist/agent/session-tools.js +5 -2
- package/dist/agent/session-trace-writer.d.ts +27 -0
- package/dist/agent/session-trace-writer.js +253 -0
- package/dist/agent/session.d.ts +2 -0
- package/dist/agent/session.js +12 -0
- package/dist/agent/subagent-direct.d.ts +20 -0
- package/dist/agent/subagent-direct.js +76 -0
- package/dist/agent/subagent-registry.d.ts +8 -1
- package/dist/agent/subagent-registry.js +28 -1
- package/dist/agent/system-prompt.d.ts +3 -1
- package/dist/agent/system-prompt.js +3 -0
- package/dist/agent/tool-runner.d.ts +2 -1
- package/dist/agent/tool-runner.js +5 -4
- package/dist/agent/types-w6.d.ts +39 -0
- package/dist/agent/types-w6.js +4 -0
- package/dist/agent/types.d.ts +5 -2
- package/dist/agents/external.js +1 -1
- package/dist/agents/task-record.d.ts +74 -1
- package/dist/agents/task-record.js +100 -0
- package/dist/ai/apis/cache-params.js +2 -1
- package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
- package/dist/ai/apis/chatgpt-backend.js +224 -0
- package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
- package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
- package/dist/ai/apis/openai-responses-request.d.ts +2 -1
- package/dist/ai/apis/openai-responses-request.js +8 -2
- package/dist/ai/apis/openai-responses.d.ts +2 -0
- package/dist/ai/apis/openai-responses.js +51 -16
- package/dist/ai/overflow.d.ts +1 -1
- package/dist/ai/overflow.js +10 -7
- package/dist/ai/providers/auth.d.ts +15 -2
- package/dist/ai/providers/auth.js +69 -2
- package/dist/ai/providers/builtin.js +27 -0
- package/dist/ai/providers/catalog-data.js +1 -0
- package/dist/ai/providers/enrich.js +2 -7
- package/dist/ai/providers/models-dev-cache.js +15 -19
- package/dist/ai/providers/models-dev-snapshot.js +8 -7
- package/dist/ai/providers/models-dev.js +5 -15
- package/dist/ai/providers/suggest.js +2 -16
- package/dist/ai/types.d.ts +27 -1
- package/dist/auth/chatgpt/backend-client.d.ts +26 -0
- package/dist/auth/chatgpt/backend-client.js +74 -0
- package/dist/auth/chatgpt/claims.d.ts +17 -0
- package/dist/auth/chatgpt/claims.js +46 -0
- package/dist/auth/chatgpt/cli.d.ts +33 -0
- package/dist/auth/chatgpt/cli.js +252 -0
- package/dist/auth/chatgpt/doctor.d.ts +17 -0
- package/dist/auth/chatgpt/doctor.js +36 -0
- package/dist/auth/chatgpt/host-id.d.ts +7 -0
- package/dist/auth/chatgpt/host-id.js +26 -0
- package/dist/auth/chatgpt/login.d.ts +30 -0
- package/dist/auth/chatgpt/login.js +130 -0
- package/dist/auth/chatgpt/presets.d.ts +66 -0
- package/dist/auth/chatgpt/presets.js +120 -0
- package/dist/auth/chatgpt/quota-text.d.ts +13 -0
- package/dist/auth/chatgpt/quota-text.js +36 -0
- package/dist/auth/oauth/browser.d.ts +12 -0
- package/dist/auth/oauth/browser.js +27 -0
- package/dist/auth/oauth/callback-server.d.ts +47 -0
- package/dist/auth/oauth/callback-server.js +147 -0
- package/dist/auth/oauth/flows.d.ts +62 -0
- package/dist/auth/oauth/flows.js +113 -0
- package/dist/auth/oauth/jwt.d.ts +24 -0
- package/dist/auth/oauth/jwt.js +81 -0
- package/dist/auth/oauth/live.d.ts +21 -0
- package/dist/auth/oauth/live.js +25 -0
- package/dist/auth/oauth/oidc.d.ts +26 -0
- package/dist/auth/oauth/oidc.js +72 -0
- package/dist/auth/oauth/pkce.d.ts +15 -0
- package/dist/auth/oauth/pkce.js +20 -0
- package/dist/auth/oauth/refresh.d.ts +35 -0
- package/dist/auth/oauth/refresh.js +129 -0
- package/dist/auth/oauth/token-client.d.ts +33 -0
- package/dist/auth/oauth/token-client.js +121 -0
- package/dist/auth/oauth/token-store.d.ts +23 -0
- package/dist/auth/oauth/token-store.js +125 -0
- package/dist/auth/testing/fake-oauth.d.ts +73 -0
- package/dist/auth/testing/fake-oauth.js +271 -0
- package/dist/auth/testing/refresh-child.d.ts +5 -0
- package/dist/auth/testing/refresh-child.js +16 -0
- package/dist/bundle/ama.cjs +25928 -11144
- package/dist/checkpoints/backend.js +6 -5
- package/dist/checkpoints/restore.js +3 -2
- package/dist/checkpoints/settings.js +2 -1
- package/dist/checkpoints/shadow-git.js +7 -6
- package/dist/checkpoints/shadow-restore.js +3 -2
- package/dist/checkpoints/tracker.js +4 -3
- package/dist/cli/args.d.ts +9 -2
- package/dist/cli/args.js +74 -27
- package/dist/cli/bootstrap.js +53 -31
- package/dist/cli/choice-prompt.js +8 -6
- package/dist/cli/codemode-notice.js +2 -2
- package/dist/cli/compose-agents.js +2 -1
- package/dist/cli/compose-extensions.js +2 -0
- package/dist/cli/compose-memory.d.ts +53 -0
- package/dist/cli/compose-memory.js +127 -0
- package/dist/cli/compose-providers.d.ts +5 -0
- package/dist/cli/compose-providers.js +32 -2
- package/dist/cli/compose-session.d.ts +5 -0
- package/dist/cli/compose-session.js +27 -13
- package/dist/cli/compose-store.d.ts +2 -0
- package/dist/cli/compose-store.js +9 -5
- package/dist/cli/compose.d.ts +2 -0
- package/dist/cli/compose.js +13 -5
- package/dist/cli/default-model.d.ts +0 -2
- package/dist/cli/default-model.js +5 -8
- package/dist/cli/deps.d.ts +5 -1
- package/dist/cli/exit-codes.d.ts +1 -1
- package/dist/cli/exit-codes.js +7 -16
- package/dist/cli/from-prompt.js +3 -2
- package/dist/cli/help-text.d.ts +2 -1
- package/dist/cli/help-text.js +5 -99
- package/dist/cli/main.d.ts +5 -0
- package/dist/cli/main.js +21 -2
- package/dist/cli/proxy.js +14 -9
- package/dist/cli/runtime.d.ts +5 -0
- package/dist/cli/startup-screen.js +20 -27
- package/dist/cli/startup-steps.js +6 -8
- package/dist/cli/subcommands/auth.d.ts +6 -3
- package/dist/cli/subcommands/auth.js +52 -22
- package/dist/cli/subcommands/config-set.d.ts +21 -0
- package/dist/cli/subcommands/config-set.js +137 -0
- package/dist/cli/subcommands/config.d.ts +2 -1
- package/dist/cli/subcommands/config.js +51 -37
- package/dist/cli/subcommands/doctor.d.ts +2 -1
- package/dist/cli/subcommands/doctor.js +97 -58
- package/dist/cli/subcommands/init.d.ts +1 -1
- package/dist/cli/subcommands/init.js +8 -7
- package/dist/cli/subcommands/memory.d.ts +18 -0
- package/dist/cli/subcommands/memory.js +189 -0
- package/dist/cli/subcommands/model-meta.js +11 -9
- package/dist/cli/subcommands/models-cache-probe.js +23 -20
- package/dist/cli/subcommands/models-discover.d.ts +3 -0
- package/dist/cli/subcommands/models-discover.js +44 -21
- package/dist/cli/subcommands/models.d.ts +1 -1
- package/dist/cli/subcommands/models.js +29 -22
- package/dist/cli/subcommands/probe-runner.js +8 -7
- package/dist/cli/subcommands/providers-list.js +32 -21
- package/dist/cli/subcommands/providers-plan.js +24 -25
- package/dist/cli/subcommands/providers-probe.js +5 -6
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +45 -50
- package/dist/cli/subcommands/sessions-export.d.ts +1 -1
- package/dist/cli/subcommands/sessions-export.js +10 -9
- package/dist/cli/subcommands/sessions-search.d.ts +1 -1
- package/dist/cli/subcommands/sessions-search.js +11 -10
- package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
- package/dist/cli/subcommands/sessions-trace.js +156 -0
- package/dist/cli/subcommands/sessions.d.ts +4 -3
- package/dist/cli/subcommands/sessions.js +40 -37
- package/dist/cli/subcommands/stats.d.ts +1 -1
- package/dist/cli/subcommands/stats.js +49 -30
- package/dist/cli/system-prompt-arg.js +3 -2
- package/dist/codemode/capability.js +3 -2
- package/dist/compaction/post-compact.d.ts +1 -0
- package/dist/compaction/post-compact.js +15 -1
- package/dist/compaction/prune-tier.d.ts +1 -1
- package/dist/compaction/prune-tier.js +3 -3
- package/dist/compaction/serialize.js +2 -1
- package/dist/config/auth-file.d.ts +12 -2
- package/dist/config/auth-file.js +32 -10
- package/dist/config/checker.js +12 -11
- package/dist/config/context-files.js +3 -2
- package/dist/config/edit.d.ts +106 -0
- package/dist/config/edit.js +350 -0
- package/dist/config/init.d.ts +4 -3
- package/dist/config/init.js +10 -18
- package/dist/config/json-schema.d.ts +2 -1
- package/dist/config/json-schema.js +101 -68
- package/dist/config/key-docs.d.ts +18 -7
- package/dist/config/key-docs.js +43 -128
- package/dist/config/load.js +7 -6
- package/dist/config/merge.d.ts +4 -1
- package/dist/config/merge.js +42 -22
- package/dist/config/paths.js +6 -5
- package/dist/config/profile.d.ts +5 -1
- package/dist/config/profile.js +7 -2
- package/dist/config/schema-w5.js +3 -2
- package/dist/config/schema-w6.d.ts +19 -0
- package/dist/config/schema-w6.js +115 -0
- package/dist/config/schema.js +34 -20
- package/dist/config/settings-registry.d.ts +78 -0
- package/dist/config/settings-registry.js +184 -0
- package/dist/config/types-w6.d.ts +109 -0
- package/dist/config/types-w6.js +19 -0
- package/dist/config/types.d.ts +11 -8
- package/dist/config/types.js +1 -0
- package/dist/drivers/acp/client.js +1 -1
- package/dist/drivers/acp/driver.js +13 -8
- package/dist/drivers/agents.js +4 -3
- package/dist/drivers/base.js +3 -2
- package/dist/drivers/host-runners.js +2 -1
- package/dist/drivers/native/claude-stream.js +12 -11
- package/dist/drivers/native/codex-app-server.js +17 -12
- package/dist/drivers/native/oneshot.js +8 -7
- package/dist/drivers/pool.js +1 -1
- package/dist/drivers/runner.d.ts +3 -1
- package/dist/drivers/runner.js +68 -20
- package/dist/drivers/turn.js +1 -1
- package/dist/hooks/config.js +3 -2
- package/dist/hooks/protocol.js +18 -12
- package/dist/host/api-impl.js +11 -10
- package/dist/host/loader.js +9 -8
- package/dist/host/types.d.ts +3 -0
- package/dist/i18n/catalog.d.ts +2169 -0
- package/dist/i18n/catalog.js +72 -0
- package/dist/i18n/format.d.ts +21 -0
- package/dist/i18n/format.js +58 -0
- package/dist/i18n/index.d.ts +58 -0
- package/dist/i18n/index.js +72 -0
- package/dist/i18n/messages/agents.d.ts +84 -0
- package/dist/i18n/messages/agents.js +85 -0
- package/dist/i18n/messages/approval.d.ts +99 -0
- package/dist/i18n/messages/approval.js +100 -0
- package/dist/i18n/messages/auth.d.ts +187 -0
- package/dist/i18n/messages/auth.js +189 -0
- package/dist/i18n/messages/cli-args.d.ts +46 -0
- package/dist/i18n/messages/cli-args.js +46 -0
- package/dist/i18n/messages/cli-help.d.ts +12 -0
- package/dist/i18n/messages/cli-help.js +244 -0
- package/dist/i18n/messages/cli.d.ts +336 -0
- package/dist/i18n/messages/cli.js +311 -0
- package/dist/i18n/messages/config-keys.d.ts +289 -0
- package/dist/i18n/messages/config-keys.js +292 -0
- package/dist/i18n/messages/config.d.ts +502 -0
- package/dist/i18n/messages/config.js +239 -0
- package/dist/i18n/messages/drivers.d.ts +123 -0
- package/dist/i18n/messages/drivers.js +124 -0
- package/dist/i18n/messages/errors.d.ts +83 -0
- package/dist/i18n/messages/errors.js +171 -0
- package/dist/i18n/messages/interactive-line.d.ts +61 -0
- package/dist/i18n/messages/interactive-line.js +69 -0
- package/dist/i18n/messages/interactive-startup.d.ts +103 -0
- package/dist/i18n/messages/interactive-startup.js +104 -0
- package/dist/i18n/messages/interactive-view.d.ts +140 -0
- package/dist/i18n/messages/interactive-view.js +141 -0
- package/dist/i18n/messages/interactive.d.ts +493 -0
- package/dist/i18n/messages/interactive.js +248 -0
- package/dist/i18n/messages/memory.d.ts +123 -0
- package/dist/i18n/messages/memory.js +128 -0
- package/dist/i18n/messages/panels.d.ts +190 -0
- package/dist/i18n/messages/panels.js +189 -0
- package/dist/i18n/messages/permissions.d.ts +126 -0
- package/dist/i18n/messages/permissions.js +151 -0
- package/dist/i18n/messages/plan.d.ts +123 -0
- package/dist/i18n/messages/plan.js +124 -0
- package/dist/i18n/messages/print.d.ts +86 -0
- package/dist/i18n/messages/print.js +91 -0
- package/dist/i18n/messages/report.d.ts +391 -0
- package/dist/i18n/messages/report.js +490 -0
- package/dist/i18n/messages/rewind.d.ts +198 -0
- package/dist/i18n/messages/rewind.js +217 -0
- package/dist/i18n/messages/session.d.ts +230 -0
- package/dist/i18n/messages/session.js +258 -0
- package/dist/i18n/messages/settings.d.ts +348 -0
- package/dist/i18n/messages/settings.js +336 -0
- package/dist/i18n/messages/subcommands-config.d.ts +111 -0
- package/dist/i18n/messages/subcommands-config.js +127 -0
- package/dist/i18n/messages/subcommands.d.ts +548 -0
- package/dist/i18n/messages/subcommands.js +474 -0
- package/dist/i18n/messages/trace.d.ts +243 -0
- package/dist/i18n/messages/trace.js +238 -0
- package/dist/i18n/types.d.ts +15 -0
- package/dist/i18n/types.js +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/memory/edit.d.ts +24 -0
- package/dist/memory/edit.js +63 -0
- package/dist/memory/frontmatter.d.ts +37 -0
- package/dist/memory/frontmatter.js +79 -0
- package/dist/memory/index.d.ts +28 -0
- package/dist/memory/index.js +126 -0
- package/dist/memory/lock.d.ts +17 -0
- package/dist/memory/lock.js +62 -0
- package/dist/memory/paths.d.ts +57 -0
- package/dist/memory/paths.js +175 -0
- package/dist/memory/report.d.ts +36 -0
- package/dist/memory/report.js +86 -0
- package/dist/memory/runtime.d.ts +42 -0
- package/dist/memory/runtime.js +36 -0
- package/dist/memory/secrets.d.ts +8 -0
- package/dist/memory/secrets.js +27 -0
- package/dist/memory/section.d.ts +28 -0
- package/dist/memory/section.js +59 -0
- package/dist/memory/store.d.ts +70 -0
- package/dist/memory/store.js +284 -0
- package/dist/memory/tool.d.ts +31 -0
- package/dist/memory/tool.js +94 -0
- package/dist/modes/acp/acp-events.js +2 -1
- package/dist/modes/acp/acp-server.js +13 -12
- package/dist/modes/commands-core.d.ts +11 -0
- package/dist/modes/commands-core.js +93 -62
- package/dist/modes/image-input.js +20 -6
- package/dist/modes/interactive/agent-bar.d.ts +95 -0
- package/dist/modes/interactive/agent-bar.js +248 -0
- package/dist/modes/interactive/agent-panels.js +27 -26
- package/dist/modes/interactive/agent-transcript.d.ts +47 -0
- package/dist/modes/interactive/agent-transcript.js +191 -0
- package/dist/modes/interactive/agent-ui.d.ts +36 -1
- package/dist/modes/interactive/agent-ui.js +180 -14
- package/dist/modes/interactive/agent-view.d.ts +72 -0
- package/dist/modes/interactive/agent-view.js +281 -0
- package/dist/modes/interactive/approval-dialog.js +46 -34
- package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
- package/dist/modes/interactive/clipboard-paste.js +9 -4
- package/dist/modes/interactive/commands.d.ts +19 -1
- package/dist/modes/interactive/commands.js +84 -40
- package/dist/modes/interactive/completion.js +2 -1
- package/dist/modes/interactive/config-panel.d.ts +70 -0
- package/dist/modes/interactive/config-panel.js +319 -0
- package/dist/modes/interactive/config-ui.d.ts +96 -0
- package/dist/modes/interactive/config-ui.js +397 -0
- package/dist/modes/interactive/confirm-dialog.js +6 -7
- package/dist/modes/interactive/event-notices.js +11 -9
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.js +19 -22
- package/dist/modes/interactive/key-dispatch.d.ts +12 -0
- package/dist/modes/interactive/key-dispatch.js +24 -9
- package/dist/modes/interactive/line/line-editor.js +2 -1
- package/dist/modes/interactive/line/line-mode.js +18 -7
- package/dist/modes/interactive/line/line-render.js +25 -24
- package/dist/modes/interactive/memory-panel.d.ts +64 -0
- package/dist/modes/interactive/memory-panel.js +221 -0
- package/dist/modes/interactive/message-view.d.ts +4 -2
- package/dist/modes/interactive/message-view.js +42 -33
- package/dist/modes/interactive/panels.js +39 -31
- package/dist/modes/interactive/pickers.d.ts +2 -1
- package/dist/modes/interactive/pickers.js +10 -6
- package/dist/modes/interactive/plan-command.d.ts +1 -1
- package/dist/modes/interactive/plan-command.js +24 -27
- package/dist/modes/interactive/plan-dialog.js +18 -17
- package/dist/modes/interactive/plan-flow.js +6 -5
- package/dist/modes/interactive/rewind-command.d.ts +1 -1
- package/dist/modes/interactive/rewind-command.js +18 -16
- package/dist/modes/interactive/rewind-flow.d.ts +0 -1
- package/dist/modes/interactive/rewind-flow.js +13 -14
- package/dist/modes/interactive/rewind-list.js +7 -6
- package/dist/modes/interactive/rewind-panel.js +40 -40
- package/dist/modes/interactive/rewind-text.d.ts +5 -3
- package/dist/modes/interactive/rewind-text.js +48 -38
- package/dist/modes/interactive/run-indicator.js +15 -12
- package/dist/modes/interactive/session-events.js +3 -2
- package/dist/modes/interactive/startup-header.js +22 -23
- package/dist/modes/interactive/startup-ui.js +38 -30
- package/dist/modes/interactive/status-area.d.ts +2 -0
- package/dist/modes/interactive/status-area.js +8 -2
- package/dist/modes/interactive/status-bar.js +4 -3
- package/dist/modes/interactive/subagent-view.js +9 -7
- package/dist/modes/interactive/tasks-report.d.ts +6 -0
- package/dist/modes/interactive/tasks-report.js +28 -31
- package/dist/modes/interactive/terminal-setup.d.ts +9 -0
- package/dist/modes/interactive/terminal-setup.js +23 -0
- package/dist/modes/interactive/tool-summary.js +19 -17
- package/dist/modes/interactive/tool-view.js +7 -4
- package/dist/modes/interactive/trace-view.d.ts +89 -0
- package/dist/modes/interactive/trace-view.js +332 -0
- package/dist/modes/print/print-mode.js +14 -15
- package/dist/modes/rpc/commands.js +7 -3
- package/dist/modes/rpc/rpc-mode.js +9 -3
- package/dist/modes/session-report.d.ts +2 -0
- package/dist/modes/session-report.js +101 -105
- package/dist/modes/startup-ui-text.js +11 -6
- package/dist/permissions/bypass.d.ts +8 -10
- package/dist/permissions/bypass.js +19 -10
- package/dist/permissions/memory-class.d.ts +23 -0
- package/dist/permissions/memory-class.js +54 -0
- package/dist/permissions/modes.d.ts +3 -3
- package/dist/permissions/modes.js +21 -16
- package/dist/permissions/pipeline.d.ts +1 -1
- package/dist/permissions/pipeline.js +9 -2
- package/dist/permissions/preview.js +49 -42
- package/dist/permissions/rules.js +5 -2
- package/dist/permissions/types.d.ts +4 -0
- package/dist/plan/store.js +2 -1
- package/dist/rpc.d.ts +39 -1
- package/dist/rpc.js +3 -0
- package/dist/sandbox/bash.js +11 -8
- package/dist/sandbox/detect.js +14 -11
- package/dist/sdk.d.ts +17 -1
- package/dist/sdk.js +29 -7
- package/dist/session/export.js +31 -30
- package/dist/session/manager.d.ts +1 -1
- package/dist/session/manager.js +5 -3
- package/dist/session/reuse.js +5 -4
- package/dist/session/scan.js +3 -2
- package/dist/session/stats-aggregate.d.ts +3 -1
- package/dist/session/stats-aggregate.js +5 -1
- package/dist/session/stats-index.js +2 -1
- package/dist/session/stats-scan.d.ts +4 -1
- package/dist/session/stats-scan.js +6 -2
- package/dist/session/store.d.ts +11 -0
- package/dist/session/store.js +48 -1
- package/dist/session/types.d.ts +2 -0
- package/dist/skills/builtin.js +2 -1
- package/dist/tools/image-file.d.ts +26 -1
- package/dist/tools/image-file.js +55 -13
- package/dist/tools/presets.d.ts +14 -1
- package/dist/tools/presets.js +3 -3
- package/dist/tools/registry.js +1 -1
- package/dist/tools/truncate.d.ts +1 -1
- package/dist/tools/truncate.js +2 -2
- package/dist/tools/types.d.ts +17 -1
- package/dist/trace/build-index.d.ts +91 -0
- package/dist/trace/build-index.js +127 -0
- package/dist/trace/build-nodes.d.ts +24 -0
- package/dist/trace/build-nodes.js +279 -0
- package/dist/trace/build-util.d.ts +43 -0
- package/dist/trace/build-util.js +120 -0
- package/dist/trace/build.d.ts +82 -0
- package/dist/trace/build.js +382 -0
- package/dist/trace/detail.d.ts +35 -0
- package/dist/trace/detail.js +205 -0
- package/dist/trace/flatten.d.ts +69 -0
- package/dist/trace/flatten.js +173 -0
- package/dist/trace/format.d.ts +47 -0
- package/dist/trace/format.js +329 -0
- package/dist/trace/html-template.d.ts +19 -0
- package/dist/trace/html-template.js +150 -0
- package/dist/trace/html.d.ts +104 -0
- package/dist/trace/html.js +292 -0
- package/dist/trace/preview.d.ts +29 -0
- package/dist/trace/preview.js +59 -0
- package/dist/trace/query-session.d.ts +14 -0
- package/dist/trace/query-session.js +38 -0
- package/dist/trace/query.d.ts +55 -0
- package/dist/trace/query.js +188 -0
- package/dist/trace/session.d.ts +40 -0
- package/dist/trace/session.js +168 -0
- package/dist/trace/types.d.ts +243 -0
- package/dist/trace/types.js +13 -0
- package/dist/tui/components/editor-paste.d.ts +2 -0
- package/dist/tui/components/editor-paste.js +6 -3
- package/dist/tui/components/editor.js +2 -2
- package/dist/tui/components/loader.d.ts +3 -0
- package/dist/tui/components/loader.js +14 -0
- package/dist/tui/components/settings-list.d.ts +61 -0
- package/dist/tui/components/settings-list.js +135 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +17 -5
- package/dist/tui.d.ts +1 -0
- package/dist/tui.js +2 -0
- package/docs/en/host-api.md +167 -0
- package/docs/en/permissions.md +214 -0
- package/docs/en/providers.md +625 -0
- package/docs/en/rpc.md +361 -0
- package/docs/en/sessions.md +219 -0
- package/docs/en/tui.md +527 -0
- package/docs/host-api.md +18 -17
- package/docs/memory.md +172 -0
- package/docs/permissions.md +2 -2
- package/docs/providers.md +67 -1
- package/docs/rpc.md +31 -3
- package/docs/session-format.md +8 -2
- package/docs/sessions.md +29 -1
- package/docs/tui.md +132 -3
- package/package.json +8 -3
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 轨迹构建器的节点构造(`build.ts` 用):step / tool / subcall / compaction / retry_wait / subagent /
|
|
3
|
+
* external_turn。精确时间来自 `ama.trace`,缺失时按条目时间推算并标 `approx`。[W6-T1]
|
|
4
|
+
*/
|
|
5
|
+
import { cacheHitRatio, isObject, num, putNum, splitRef, zeroUsage, } from "./build-index.js";
|
|
6
|
+
import { statusOfTask } from "./build-util.js";
|
|
7
|
+
import {} from "./types.js";
|
|
8
|
+
export function stepStatus(message, retried, data) {
|
|
9
|
+
if (retried)
|
|
10
|
+
return "retried";
|
|
11
|
+
if (data?.status === "aborted" || message.stopReason === "aborted")
|
|
12
|
+
return "aborted";
|
|
13
|
+
if (message.stopReason === "error")
|
|
14
|
+
return "error";
|
|
15
|
+
return "ok";
|
|
16
|
+
}
|
|
17
|
+
export function pushUsage(state, turnId, usage) {
|
|
18
|
+
const list = state.extraUsage.get(turnId) ?? [];
|
|
19
|
+
list.push(usage);
|
|
20
|
+
state.extraUsage.set(turnId, list);
|
|
21
|
+
}
|
|
22
|
+
export function assistantStep(entryId, m, at, turn, state, index) {
|
|
23
|
+
const trace = index.stepByAssistant.get(entryId);
|
|
24
|
+
const data = trace?.data;
|
|
25
|
+
const previous = [...turn.steps].reverse().find((s) => s.kind === "step");
|
|
26
|
+
const failedBefore = previous !== undefined && (previous.status === "retried" || previous.status === "error");
|
|
27
|
+
const ref = `${m.provider}/${m.model}`;
|
|
28
|
+
const step = {
|
|
29
|
+
id: entryId,
|
|
30
|
+
kind: "step",
|
|
31
|
+
status: stepStatus(m, index.retried.has(entryId), data),
|
|
32
|
+
entryIds: trace === undefined ? [entryId] : [entryId, trace.entryId],
|
|
33
|
+
provider: m.provider,
|
|
34
|
+
model: m.model,
|
|
35
|
+
attempt: num(data?.attempt) ?? (failedBefore ? (previous?.attempt ?? 0) + 1 : 1),
|
|
36
|
+
usage: m.usage ?? zeroUsage(),
|
|
37
|
+
stopReason: m.stopReason,
|
|
38
|
+
tools: [],
|
|
39
|
+
};
|
|
40
|
+
const fallbackFrom = data !== undefined
|
|
41
|
+
? data.fallbackFrom
|
|
42
|
+
: failedBefore && state.turnModel !== undefined && state.turnModel !== ref
|
|
43
|
+
? state.turnModel
|
|
44
|
+
: undefined;
|
|
45
|
+
if (fallbackFrom !== undefined)
|
|
46
|
+
step.fallbackFrom = fallbackFrom;
|
|
47
|
+
if (m.errorMessage !== undefined)
|
|
48
|
+
step.errorMessage = m.errorMessage;
|
|
49
|
+
if (m.thinkingLevel !== undefined)
|
|
50
|
+
step.thinkingLevel = m.thinkingLevel;
|
|
51
|
+
const hit = cacheHitRatio(step.usage);
|
|
52
|
+
if (hit !== undefined)
|
|
53
|
+
step.cacheHitRatio = hit;
|
|
54
|
+
const requestAt = num(data?.requestAt);
|
|
55
|
+
if (data !== undefined && requestAt !== undefined) {
|
|
56
|
+
step.requestAt = requestAt;
|
|
57
|
+
step.startedAt = requestAt;
|
|
58
|
+
const first = num(data.firstTokenAt);
|
|
59
|
+
const done = num(data.doneAt);
|
|
60
|
+
if (first !== undefined) {
|
|
61
|
+
step.firstTokenAt = first;
|
|
62
|
+
step.ttftMs = Math.max(0, first - requestAt);
|
|
63
|
+
}
|
|
64
|
+
if (done !== undefined) {
|
|
65
|
+
step.doneAt = done;
|
|
66
|
+
step.endedAt = done;
|
|
67
|
+
}
|
|
68
|
+
const tps = num(data.tps);
|
|
69
|
+
if (tps !== undefined)
|
|
70
|
+
step.tps = tps;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// 回退推算:assistant.timestamp ≈ 请求发出,条目时间 ≈ 请求结束
|
|
74
|
+
const start = num(m.timestamp) ?? at;
|
|
75
|
+
const end = at ?? start;
|
|
76
|
+
if (start !== undefined) {
|
|
77
|
+
step.requestAt = start;
|
|
78
|
+
step.startedAt = start;
|
|
79
|
+
}
|
|
80
|
+
if (end !== undefined) {
|
|
81
|
+
step.doneAt = end;
|
|
82
|
+
step.endedAt = end;
|
|
83
|
+
}
|
|
84
|
+
step.approx = true;
|
|
85
|
+
}
|
|
86
|
+
for (const block of m.content ?? []) {
|
|
87
|
+
if (block.type !== "toolCall")
|
|
88
|
+
continue;
|
|
89
|
+
const tool = toolNode(block.id, block.name, entryId, step, index);
|
|
90
|
+
step.tools.push(tool);
|
|
91
|
+
state.tools.set(tool.id, tool);
|
|
92
|
+
}
|
|
93
|
+
return step;
|
|
94
|
+
}
|
|
95
|
+
export function toolNode(id, name, assistantEntryId, step, index) {
|
|
96
|
+
const timing = index.toolTiming.get(id);
|
|
97
|
+
const tool = {
|
|
98
|
+
id,
|
|
99
|
+
kind: "tool",
|
|
100
|
+
name,
|
|
101
|
+
status: "running",
|
|
102
|
+
isError: false,
|
|
103
|
+
entryIds: [assistantEntryId],
|
|
104
|
+
children: [],
|
|
105
|
+
};
|
|
106
|
+
if (timing !== undefined && num(timing.startedAt) !== undefined) {
|
|
107
|
+
tool.startedAt = timing.startedAt;
|
|
108
|
+
putNum(tool, "endedAt", timing.endedAt);
|
|
109
|
+
putNum(tool, "approvalMs", timing.approvalMs);
|
|
110
|
+
if (timing.denied === true) {
|
|
111
|
+
tool.denied = true;
|
|
112
|
+
tool.status = "denied";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
if (step.doneAt !== undefined)
|
|
117
|
+
tool.startedAt = step.doneAt;
|
|
118
|
+
tool.approx = true;
|
|
119
|
+
}
|
|
120
|
+
for (const { data, entryId } of index.subcalls.get(id) ?? []) {
|
|
121
|
+
const sub = {
|
|
122
|
+
id: data.id,
|
|
123
|
+
kind: "subcall",
|
|
124
|
+
name: typeof data.name === "string" ? data.name : "",
|
|
125
|
+
parentToolCallId: id,
|
|
126
|
+
isError: data.isError === true,
|
|
127
|
+
status: data.isError === true ? "error" : "ok",
|
|
128
|
+
entryIds: [entryId],
|
|
129
|
+
};
|
|
130
|
+
putNum(sub, "startedAt", data.startedAt);
|
|
131
|
+
putNum(sub, "endedAt", data.endedAt);
|
|
132
|
+
if (sub.endedAt === undefined && data.isError !== true)
|
|
133
|
+
sub.status = "running";
|
|
134
|
+
tool.children.push(sub);
|
|
135
|
+
}
|
|
136
|
+
return tool;
|
|
137
|
+
}
|
|
138
|
+
export function compactionNode(id, at, trace) {
|
|
139
|
+
const node = {
|
|
140
|
+
id,
|
|
141
|
+
kind: "compaction",
|
|
142
|
+
status: trace?.data.aborted === true ? "aborted" : "ok",
|
|
143
|
+
entryIds: trace === undefined || trace.entryId === id ? [id] : [id, trace.entryId],
|
|
144
|
+
};
|
|
145
|
+
const started = num(trace?.data.startedAt);
|
|
146
|
+
const ended = num(trace?.data.endedAt);
|
|
147
|
+
if (trace !== undefined && started !== undefined && ended !== undefined) {
|
|
148
|
+
node.startedAt = started;
|
|
149
|
+
node.endedAt = ended;
|
|
150
|
+
}
|
|
151
|
+
else if (at !== undefined) {
|
|
152
|
+
node.startedAt = at;
|
|
153
|
+
node.endedAt = at;
|
|
154
|
+
node.approx = true;
|
|
155
|
+
}
|
|
156
|
+
const trigger = trace?.data.trigger;
|
|
157
|
+
if (trigger === "threshold" || trigger === "overflow" || trigger === "manual")
|
|
158
|
+
node.trigger = trigger;
|
|
159
|
+
return node;
|
|
160
|
+
}
|
|
161
|
+
export function compactionAsAux(node, usage) {
|
|
162
|
+
const aux = {
|
|
163
|
+
id: node.id,
|
|
164
|
+
kind: "aux",
|
|
165
|
+
purpose: "compaction",
|
|
166
|
+
status: node.status,
|
|
167
|
+
entryIds: node.entryIds,
|
|
168
|
+
};
|
|
169
|
+
if (node.startedAt !== undefined)
|
|
170
|
+
aux.startedAt = node.startedAt;
|
|
171
|
+
if (node.endedAt !== undefined)
|
|
172
|
+
aux.endedAt = node.endedAt;
|
|
173
|
+
if (node.approx === true)
|
|
174
|
+
aux.approx = true;
|
|
175
|
+
if (usage !== undefined)
|
|
176
|
+
aux.usage = usage;
|
|
177
|
+
return aux;
|
|
178
|
+
}
|
|
179
|
+
export function retryNode(id, data) {
|
|
180
|
+
const d = data;
|
|
181
|
+
const delayMs = num(d.delayMs) ?? 0;
|
|
182
|
+
const node = {
|
|
183
|
+
id,
|
|
184
|
+
kind: "retry_wait",
|
|
185
|
+
status: "ok",
|
|
186
|
+
entryIds: [id],
|
|
187
|
+
attempt: num(d.attempt) ?? 0,
|
|
188
|
+
delayMs,
|
|
189
|
+
};
|
|
190
|
+
const started = num(d.startedAt);
|
|
191
|
+
if (started !== undefined) {
|
|
192
|
+
node.startedAt = started;
|
|
193
|
+
node.endedAt = started + delayMs;
|
|
194
|
+
}
|
|
195
|
+
if (typeof d.reason === "string")
|
|
196
|
+
node.reason = d.reason;
|
|
197
|
+
return node;
|
|
198
|
+
}
|
|
199
|
+
/** 中断兜底的 step(没有 assistant 条目):请求在途时补一个 aborted 的 step。 */
|
|
200
|
+
export function abortedRequest(entryId, data, state) {
|
|
201
|
+
const requestAt = num(data.requestAt);
|
|
202
|
+
if (requestAt === undefined || state.turn === undefined)
|
|
203
|
+
return;
|
|
204
|
+
const { provider, model } = splitRef(state.model);
|
|
205
|
+
const step = {
|
|
206
|
+
id: entryId,
|
|
207
|
+
kind: "step",
|
|
208
|
+
status: "aborted",
|
|
209
|
+
entryIds: [entryId],
|
|
210
|
+
provider,
|
|
211
|
+
model,
|
|
212
|
+
attempt: num(data.attempt) ?? 1,
|
|
213
|
+
usage: zeroUsage(),
|
|
214
|
+
stopReason: "aborted",
|
|
215
|
+
requestAt,
|
|
216
|
+
startedAt: requestAt,
|
|
217
|
+
tools: [],
|
|
218
|
+
};
|
|
219
|
+
const first = num(data.firstTokenAt);
|
|
220
|
+
if (first !== undefined) {
|
|
221
|
+
step.firstTokenAt = first;
|
|
222
|
+
step.ttftMs = Math.max(0, first - requestAt);
|
|
223
|
+
}
|
|
224
|
+
const done = num(data.doneAt);
|
|
225
|
+
if (done !== undefined) {
|
|
226
|
+
step.doneAt = done;
|
|
227
|
+
step.endedAt = done;
|
|
228
|
+
}
|
|
229
|
+
if (data.fallbackFrom !== undefined)
|
|
230
|
+
step.fallbackFrom = data.fallbackFrom;
|
|
231
|
+
state.turn.steps.push(step);
|
|
232
|
+
}
|
|
233
|
+
export function externalNodes(taskId, list) {
|
|
234
|
+
return list.map(({ data, entryId }) => {
|
|
235
|
+
const node = {
|
|
236
|
+
id: `${taskId}#${num(data.turn) ?? 0}`,
|
|
237
|
+
kind: "external_turn",
|
|
238
|
+
status: /error|fail/i.test(String(data.stopReason))
|
|
239
|
+
? "error"
|
|
240
|
+
: /abort|cancel/i.test(String(data.stopReason))
|
|
241
|
+
? "aborted"
|
|
242
|
+
: "ok",
|
|
243
|
+
entryIds: [entryId],
|
|
244
|
+
turn: num(data.turn) ?? 0,
|
|
245
|
+
stopReason: String(data.stopReason ?? ""),
|
|
246
|
+
tools: Array.isArray(data.tools) ? data.tools : [],
|
|
247
|
+
toolCount: num(data.toolCount) ?? 0,
|
|
248
|
+
filesTouched: num(data.filesTouched) ?? 0,
|
|
249
|
+
};
|
|
250
|
+
putNum(node, "startedAt", data.startedAt);
|
|
251
|
+
putNum(node, "endedAt", data.endedAt);
|
|
252
|
+
return node;
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
export function subagentNode(data, entryId, live) {
|
|
256
|
+
const node = {
|
|
257
|
+
id: data.taskId,
|
|
258
|
+
kind: "subagent",
|
|
259
|
+
taskId: data.taskId,
|
|
260
|
+
agent: typeof data.agent === "string" ? data.agent : "",
|
|
261
|
+
runner: typeof data.runner === "string" ? data.runner : "ama",
|
|
262
|
+
background: data.background === true,
|
|
263
|
+
status: statusOfTask(data.status, live),
|
|
264
|
+
entryIds: [entryId],
|
|
265
|
+
};
|
|
266
|
+
putNum(node, "startedAt", data.startedAt);
|
|
267
|
+
putNum(node, "endedAt", data.endedAt);
|
|
268
|
+
if (isObject(data.usage))
|
|
269
|
+
node.usage = data.usage;
|
|
270
|
+
putNum(node, "costUsd", data.costUsd);
|
|
271
|
+
putNum(node, "turns", data.turns);
|
|
272
|
+
const ref = data.sessionRef;
|
|
273
|
+
if (isObject(ref) && typeof ref.sessionId === "string") {
|
|
274
|
+
node.childRef = { sessionId: ref.sessionId };
|
|
275
|
+
if (typeof ref.sessionFile === "string")
|
|
276
|
+
node.childRef.sessionFile = ref.sessionFile;
|
|
277
|
+
}
|
|
278
|
+
return node;
|
|
279
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 轨迹构建器的汇总小工具(`build.ts` 用;单独成文件以守住 600 行上限)。[W6-T1]
|
|
3
|
+
*/
|
|
4
|
+
import type { Usage } from "../ai/types.js";
|
|
5
|
+
import type { TraceNodeStatus, TraceTotals } from "./types.js";
|
|
6
|
+
/** 汇总累加器:`finishTotals` 转成 `TraceTotals`。 */
|
|
7
|
+
export interface TotalsAcc {
|
|
8
|
+
requests: number;
|
|
9
|
+
input: number;
|
|
10
|
+
output: number;
|
|
11
|
+
cacheRead: number;
|
|
12
|
+
cacheWrite: number;
|
|
13
|
+
toolCalls: number;
|
|
14
|
+
costSum: number;
|
|
15
|
+
costed: number;
|
|
16
|
+
/** 精确 step 的 ttft 样本。 */
|
|
17
|
+
ttfts: number[];
|
|
18
|
+
/** 精确 step 的 Σoutput 与 Σ(doneAt − firstTokenAt)。 */
|
|
19
|
+
tpsOutput: number;
|
|
20
|
+
tpsMs: number;
|
|
21
|
+
durationMs?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function emptyTotals(): TotalsAcc;
|
|
24
|
+
/** 计一次请求(进行中的 step 不计:用量还没有)。 */
|
|
25
|
+
export declare function accumulate(acc: TotalsAcc, node: {
|
|
26
|
+
usage?: Usage | undefined;
|
|
27
|
+
status?: TraceNodeStatus;
|
|
28
|
+
approx?: boolean;
|
|
29
|
+
ttftMs?: number;
|
|
30
|
+
firstTokenAt?: number;
|
|
31
|
+
doneAt?: number;
|
|
32
|
+
}): void;
|
|
33
|
+
/** 最近秩分位(确定性;空样本 undefined)。 */
|
|
34
|
+
export declare function percentile(sorted: readonly number[], p: number): number | undefined;
|
|
35
|
+
export declare function finishTotals(acc: TotalsAcc): TraceTotals;
|
|
36
|
+
export declare function maxDefined(a: number | undefined, b: number | undefined): number | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* `ama.task` 的 status → 节点状态。文件里的 `running`:有 live 叠加(会话在本进程运行)时仍是 running,
|
|
39
|
+
* 否则视为 `interrupted`(与 resume 重建任务表同一口径)。
|
|
40
|
+
*/
|
|
41
|
+
export declare function statusOfTask(status: unknown, live: boolean): TraceNodeStatus;
|
|
42
|
+
/** 把 `from` 的计数并进 `into`(含 ttft 样本)。 */
|
|
43
|
+
export declare function mergeTotals(into: TotalsAcc, from: TotalsAcc): void;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 轨迹构建器的汇总小工具(`build.ts` 用;单独成文件以守住 600 行上限)。[W6-T1]
|
|
3
|
+
*/
|
|
4
|
+
export function emptyTotals() {
|
|
5
|
+
return {
|
|
6
|
+
requests: 0,
|
|
7
|
+
input: 0,
|
|
8
|
+
output: 0,
|
|
9
|
+
cacheRead: 0,
|
|
10
|
+
cacheWrite: 0,
|
|
11
|
+
toolCalls: 0,
|
|
12
|
+
costSum: 0,
|
|
13
|
+
costed: 0,
|
|
14
|
+
ttfts: [],
|
|
15
|
+
tpsOutput: 0,
|
|
16
|
+
tpsMs: 0,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** 计一次请求(进行中的 step 不计:用量还没有)。 */
|
|
20
|
+
export function accumulate(acc, node) {
|
|
21
|
+
const usage = node.usage;
|
|
22
|
+
if (usage === undefined || node.status === "running")
|
|
23
|
+
return;
|
|
24
|
+
acc.requests++;
|
|
25
|
+
acc.input += usage.input;
|
|
26
|
+
acc.output += usage.output;
|
|
27
|
+
acc.cacheRead += usage.cacheRead;
|
|
28
|
+
acc.cacheWrite += usage.cacheWrite;
|
|
29
|
+
if (usage.cost !== undefined) {
|
|
30
|
+
acc.costSum += usage.cost.total;
|
|
31
|
+
acc.costed++;
|
|
32
|
+
}
|
|
33
|
+
if (node.approx === true)
|
|
34
|
+
return;
|
|
35
|
+
if (node.ttftMs !== undefined)
|
|
36
|
+
acc.ttfts.push(node.ttftMs);
|
|
37
|
+
if (node.firstTokenAt !== undefined &&
|
|
38
|
+
node.doneAt !== undefined &&
|
|
39
|
+
node.doneAt > node.firstTokenAt &&
|
|
40
|
+
usage.output > 0) {
|
|
41
|
+
acc.tpsOutput += usage.output;
|
|
42
|
+
acc.tpsMs += node.doneAt - node.firstTokenAt;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** 最近秩分位(确定性;空样本 undefined)。 */
|
|
46
|
+
export function percentile(sorted, p) {
|
|
47
|
+
if (sorted.length === 0)
|
|
48
|
+
return undefined;
|
|
49
|
+
const rank = Math.max(1, Math.ceil(p * sorted.length));
|
|
50
|
+
return sorted[Math.min(sorted.length, rank) - 1];
|
|
51
|
+
}
|
|
52
|
+
export function finishTotals(acc) {
|
|
53
|
+
const totals = {
|
|
54
|
+
requests: acc.requests,
|
|
55
|
+
input: acc.input,
|
|
56
|
+
output: acc.output,
|
|
57
|
+
cacheRead: acc.cacheRead,
|
|
58
|
+
cacheWrite: acc.cacheWrite,
|
|
59
|
+
toolCalls: acc.toolCalls,
|
|
60
|
+
};
|
|
61
|
+
if (acc.costed > 0)
|
|
62
|
+
totals.cost = acc.costSum;
|
|
63
|
+
if (acc.durationMs !== undefined)
|
|
64
|
+
totals.durationMs = acc.durationMs;
|
|
65
|
+
const sorted = [...acc.ttfts].sort((a, b) => a - b);
|
|
66
|
+
const p50 = percentile(sorted, 0.5);
|
|
67
|
+
const p90 = percentile(sorted, 0.9);
|
|
68
|
+
if (p50 !== undefined)
|
|
69
|
+
totals.ttftP50 = p50;
|
|
70
|
+
if (p90 !== undefined)
|
|
71
|
+
totals.ttftP90 = p90;
|
|
72
|
+
if (acc.tpsMs > 0)
|
|
73
|
+
totals.avgTps = Math.round((acc.tpsOutput / (acc.tpsMs / 1000)) * 10) / 10;
|
|
74
|
+
const prompt = acc.input + acc.cacheRead + acc.cacheWrite;
|
|
75
|
+
if (prompt > 0)
|
|
76
|
+
totals.cacheHitRatio = acc.cacheRead / prompt;
|
|
77
|
+
return totals;
|
|
78
|
+
}
|
|
79
|
+
export function maxDefined(a, b) {
|
|
80
|
+
if (a === undefined)
|
|
81
|
+
return b;
|
|
82
|
+
if (b === undefined)
|
|
83
|
+
return a;
|
|
84
|
+
return Math.max(a, b);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* `ama.task` 的 status → 节点状态。文件里的 `running`:有 live 叠加(会话在本进程运行)时仍是 running,
|
|
88
|
+
* 否则视为 `interrupted`(与 resume 重建任务表同一口径)。
|
|
89
|
+
*/
|
|
90
|
+
export function statusOfTask(status, live) {
|
|
91
|
+
switch (status) {
|
|
92
|
+
case "completed":
|
|
93
|
+
return "ok";
|
|
94
|
+
case "failed":
|
|
95
|
+
case "max_turns":
|
|
96
|
+
return "error";
|
|
97
|
+
case "aborted":
|
|
98
|
+
return "aborted";
|
|
99
|
+
case "interrupted":
|
|
100
|
+
return "interrupted";
|
|
101
|
+
case "running":
|
|
102
|
+
return live ? "running" : "interrupted";
|
|
103
|
+
default:
|
|
104
|
+
return "ok";
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** 把 `from` 的计数并进 `into`(含 ttft 样本)。 */
|
|
108
|
+
export function mergeTotals(into, from) {
|
|
109
|
+
into.requests += from.requests;
|
|
110
|
+
into.input += from.input;
|
|
111
|
+
into.output += from.output;
|
|
112
|
+
into.cacheRead += from.cacheRead;
|
|
113
|
+
into.cacheWrite += from.cacheWrite;
|
|
114
|
+
into.toolCalls += from.toolCalls;
|
|
115
|
+
into.costSum += from.costSum;
|
|
116
|
+
into.costed += from.costed;
|
|
117
|
+
into.ttfts.push(...from.ttfts);
|
|
118
|
+
into.tpsOutput += from.tpsOutput;
|
|
119
|
+
into.tpsMs += from.tpsMs;
|
|
120
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 轨迹构建器(docs/wave6-plan.md §2.3、D6)。[W6-T1]
|
|
3
|
+
*
|
|
4
|
+
* `buildTrace(input, opts)` 把会话条目重建成 `Trace`(Turn → Step → Tool → Subcall / Subagent):
|
|
5
|
+
* TUI `/trace`、`ama sessions trace`、RPC `get_trace` 三方共用同一棵树。
|
|
6
|
+
*
|
|
7
|
+
* 性质:
|
|
8
|
+
* - **纯函数**:不读时钟、不做 I/O;子会话经 `opts.loadChild` 回调读取(深度 ≤ 1:子轨迹里不再展开孙任务)。
|
|
9
|
+
* - **确定性**:同样的输入(含 `opts.now` / `opts.live`)得到逐字节相同的 JSON;节点顺序 = 条目顺序。
|
|
10
|
+
* - **不改历史**:老会话没有 `ama.trace` 时按条目时间回退推算并标 `approx`;推算出的时间不写回文件。
|
|
11
|
+
* - **容忍**:未知条目、未知 customType、损坏的 data 一律跳过;子会话缺失或读取抛错标 `childMissing`。
|
|
12
|
+
* - **不含正文**:只有 id、时间、计数与用量;提示 / 参数 / 结果的预览由调用方按 `entryIds` 回条目取。
|
|
13
|
+
*
|
|
14
|
+
* 算法:选分支(leaf = 根 → 叶子;all = 文件顺序)→ 预建索引(`ama.trace` 按 assistant / toolCall /
|
|
15
|
+
* compaction / usage 条目 id,`ama.task` 按父 toolCallId,`external_turn` 按 taskId,`context_edit` 的
|
|
16
|
+
* retry / overflow 目标)→ 顺序扫描建节点 → 叠加 `live` → 汇总。推算规则:`requestAt = assistant.timestamp`、
|
|
17
|
+
* `doneAt = 条目时间`、工具 `startedAt = assistant 条目时间`、`endedAt = toolResult.timestamp`;ttft 分位与
|
|
18
|
+
* 平均吞吐只用精确(非 approx)的 step。
|
|
19
|
+
*
|
|
20
|
+
* 汇总口径:`requests` 与 token / 费用和 `usageTotals`(session/export.ts)一致(assistant + 压缩 / 分支摘要 +
|
|
21
|
+
* `usage` 条目;进行中的请求不计);`durationMs` = 各回合耗时之和(不含回合之间的空闲);回合的 `endedAt`
|
|
22
|
+
* 不被后台子 Agent 拉长;文件里 `status: "running"` 的任务在没有 `live` 时视为 `interrupted`。
|
|
23
|
+
*/
|
|
24
|
+
import type { SessionEntry, SessionHeader } from "../session/types.js";
|
|
25
|
+
import { type Trace, type TraceSubagentNode } from "./types.js";
|
|
26
|
+
/** `buildTrace` 的输入:与 `ExportInput`(session/export.ts)同形,另可带会话文件路径。 */
|
|
27
|
+
export interface TraceInput {
|
|
28
|
+
header: SessionHeader;
|
|
29
|
+
entries: readonly SessionEntry[];
|
|
30
|
+
/** 当前叶子;`undefined` = 最后一条条目,`null` = 空分支。`branch: "all"` 时不用。 */
|
|
31
|
+
leaf?: string | null | undefined;
|
|
32
|
+
/** 写进 `Trace.sessionFile`。 */
|
|
33
|
+
sessionFile?: string;
|
|
34
|
+
}
|
|
35
|
+
/** 进行中的模型请求(还没有 assistant 条目)。 */
|
|
36
|
+
export interface LiveRequest {
|
|
37
|
+
requestAt: number;
|
|
38
|
+
firstTokenAt?: number;
|
|
39
|
+
provider?: string;
|
|
40
|
+
model?: string;
|
|
41
|
+
/** 流式期间估算的输出 token。 */
|
|
42
|
+
outputTokens?: number;
|
|
43
|
+
}
|
|
44
|
+
/** 正在执行的工具;`parentId` = codemode 外层调用(内层调用)。 */
|
|
45
|
+
export interface LiveTool {
|
|
46
|
+
id: string;
|
|
47
|
+
name: string;
|
|
48
|
+
startedAt: number;
|
|
49
|
+
parentId?: string;
|
|
50
|
+
}
|
|
51
|
+
/** 运行中的叠加层(TUI / RPC 进行中时给;CLI 读文件不给)。 */
|
|
52
|
+
export interface LiveOverlay {
|
|
53
|
+
/** 会话正在运行:没有结果的工具算 `running`(否则算 `interrupted`),最后一个回合算进行中。 */
|
|
54
|
+
running: boolean;
|
|
55
|
+
request?: LiveRequest;
|
|
56
|
+
tools?: readonly LiveTool[];
|
|
57
|
+
}
|
|
58
|
+
export interface BuildTraceOptions {
|
|
59
|
+
/** 缺省 `leaf`。 */
|
|
60
|
+
branch?: "leaf" | "all";
|
|
61
|
+
/** 注入的当前时刻:只在会话头与条目都没有可用时间时作 `startedAt` 兜底;构建器不读时钟。 */
|
|
62
|
+
now?: number;
|
|
63
|
+
/**
|
|
64
|
+
* 读取 ama 子会话(`ama.task.sessionRef.sessionFile`);返回 undefined 或抛错 → `childMissing`。
|
|
65
|
+
* 不给时子 Agent 只有 `childRef`(懒加载:调用方之后用 `loadSubagentTrace`)。
|
|
66
|
+
*/
|
|
67
|
+
loadChild?: (sessionFile: string) => TraceInput | undefined;
|
|
68
|
+
live?: LiveOverlay;
|
|
69
|
+
}
|
|
70
|
+
/** 所选分支的条目。 */
|
|
71
|
+
export declare function selectTraceEntries(input: TraceInput, branch?: "leaf" | "all"): SessionEntry[];
|
|
72
|
+
/**
|
|
73
|
+
* 从会话条目构建轨迹树。见文件头的性质与算法;选项见 `BuildTraceOptions`。
|
|
74
|
+
*/
|
|
75
|
+
export declare function buildTrace(input: TraceInput, opts?: BuildTraceOptions): Trace;
|
|
76
|
+
/**
|
|
77
|
+
* 懒加载 ama 子 Agent 的子轨迹(就地写 `node.child` / `node.childMissing`,返回子轨迹)。深度 ≤ 1:
|
|
78
|
+
* 子轨迹里的任务不再展开。外部 runner 或没有会话文件时返回 undefined 且不标缺失。
|
|
79
|
+
*/
|
|
80
|
+
export declare function loadSubagentTrace(node: TraceSubagentNode, loadChild: (sessionFile: string) => TraceInput | undefined, now?: number): Trace | undefined;
|
|
81
|
+
/** 在轨迹里找任务(子 Agent 节点);深度优先,先找到的为准。 */
|
|
82
|
+
export declare function findSubagent(trace: Trace, taskId: string): TraceSubagentNode | undefined;
|