@armadra/agent 0.5.1 → 0.6.1
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 +203 -304
- package/CHANGELOG.zh-CN.md +462 -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/discovered-cache.d.ts +48 -0
- package/dist/ai/providers/discovered-cache.js +102 -0
- package/dist/ai/providers/enrich.js +2 -7
- package/dist/ai/providers/model-visibility.d.ts +33 -0
- package/dist/ai/providers/model-visibility.js +70 -0
- 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/registry.d.ts +2 -0
- package/dist/ai/providers/registry.js +6 -1
- 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 +35 -0
- package/dist/auth/chatgpt/cli.js +279 -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 +26532 -11045
- 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 +6 -0
- package/dist/cli/compose-providers.js +38 -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 +145 -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 +4 -0
- package/dist/cli/subcommands/models-discover.js +60 -21
- package/dist/cli/subcommands/models-enable.d.ts +13 -0
- package/dist/cli/subcommands/models-enable.js +145 -0
- package/dist/cli/subcommands/models.d.ts +3 -1
- package/dist/cli/subcommands/models.js +39 -24
- 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 +102 -69
- 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 +12 -4
- 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 +81 -0
- package/dist/config/settings-registry.js +185 -0
- package/dist/config/types-w5.d.ts +7 -0
- package/dist/config/types-w5.js +2 -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 +2209 -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 +189 -0
- package/dist/i18n/messages/auth.js +201 -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 +248 -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 +293 -0
- package/dist/i18n/messages/config-keys.js +296 -0
- package/dist/i18n/messages/config.d.ts +508 -0
- package/dist/i18n/messages/config.js +241 -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 +99 -0
- package/dist/i18n/messages/interactive-startup.js +100 -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 +489 -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 +233 -0
- package/dist/i18n/messages/panels.js +232 -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 +355 -0
- package/dist/i18n/messages/settings.js +343 -0
- package/dist/i18n/messages/subcommands-config.d.ts +113 -0
- package/dist/i18n/messages/subcommands-config.js +129 -0
- package/dist/i18n/messages/subcommands-models.d.ts +34 -0
- package/dist/i18n/messages/subcommands-models.js +34 -0
- package/dist/i18n/messages/subcommands.d.ts +576 -0
- package/dist/i18n/messages/subcommands.js +477 -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 +22 -1
- package/dist/modes/interactive/commands.js +100 -49
- 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 +21 -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/model-items.d.ts +45 -0
- package/dist/modes/interactive/model-items.js +134 -0
- package/dist/modes/interactive/model-picker.d.ts +57 -0
- package/dist/modes/interactive/model-picker.js +191 -0
- 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.d.ts +3 -9
- package/dist/modes/interactive/startup-ui.js +44 -88
- 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/select-list.d.ts +2 -0
- package/dist/tui/components/select-list.js +7 -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 +627 -0
- package/docs/en/rpc.md +361 -0
- package/docs/en/sessions.md +219 -0
- package/docs/en/tui.md +534 -0
- package/docs/host-api.md +18 -17
- package/docs/memory.md +172 -0
- package/docs/permissions.md +2 -2
- package/docs/providers.md +73 -1
- package/docs/rpc.md +31 -3
- package/docs/session-format.md +8 -2
- package/docs/sessions.md +29 -1
- package/docs/tui.md +140 -4
- package/package.json +8 -3
|
@@ -28,19 +28,12 @@ import { DISCOVER_TIMEOUT_MS } from "./models-discover.js";
|
|
|
28
28
|
import { describeProbePlan, parseProbeTuning } from "./probe-runner.js";
|
|
29
29
|
import { probeChannels } from "./providers-probe.js";
|
|
30
30
|
import { DEFAULT_PREFER, capRequests, defaultChannels, hintedChannels, listingTarget, mergeProvider, orderChannels, parseChannelSpec, parseModelList, probeSelection, renderTable, } from "./providers-plan.js";
|
|
31
|
+
import { msg } from "../../i18n/index.js";
|
|
31
32
|
export const DEFAULT_MAX_REQUESTS = 60;
|
|
32
33
|
export const DEFAULT_LIMIT = 30;
|
|
33
|
-
export
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
[--max-requests N] [--concurrency N] [--probe-timeout ms]
|
|
37
|
-
[--prefer chat,responses,messages] [--include-no-tools] [--yes]
|
|
38
|
-
ama providers list
|
|
39
|
-
ama providers channels <id>
|
|
40
|
-
ama providers remove <id>
|
|
41
|
-
ama providers refresh <id> [--probe] [--limit N] [--probe-models a,b,…] [--max-requests N]
|
|
42
|
-
[--concurrency N] [--probe-timeout ms] [--yes]
|
|
43
|
-
`;
|
|
34
|
+
export function providersUsage() {
|
|
35
|
+
return msg().subcommands.providers.usage;
|
|
36
|
+
}
|
|
44
37
|
const VALUE_OPTIONS = [
|
|
45
38
|
"base-url",
|
|
46
39
|
"api",
|
|
@@ -62,7 +55,7 @@ function intValue(ctx, name, fallback) {
|
|
|
62
55
|
return fallback;
|
|
63
56
|
const n = Number(raw);
|
|
64
57
|
if (!Number.isInteger(n) || n < 1)
|
|
65
|
-
throw new UsageError(
|
|
58
|
+
throw new UsageError(msg().subcommands.providers.positiveInt(name, raw));
|
|
66
59
|
return n;
|
|
67
60
|
}
|
|
68
61
|
function list(raw) {
|
|
@@ -83,7 +76,7 @@ async function approved(ctx, what) {
|
|
|
83
76
|
if (ctx.flags.has("yes"))
|
|
84
77
|
return true;
|
|
85
78
|
if (!ctx.io.stdinIsTTY) {
|
|
86
|
-
ctx.io.stderr(
|
|
79
|
+
ctx.io.stderr(msg().subcommands.providers.needsYes(what));
|
|
87
80
|
return "usage";
|
|
88
81
|
}
|
|
89
82
|
return confirm(ctx.io, `${what}\n`);
|
|
@@ -138,10 +131,8 @@ async function plan(ctx, input) {
|
|
|
138
131
|
const max = intValue(ctx, "max-requests", DEFAULT_MAX_REQUESTS);
|
|
139
132
|
const capped = capRequests(selected, tryChannels, max);
|
|
140
133
|
const tuning = parseProbeTuning(ctx.values);
|
|
141
|
-
io.stdout(
|
|
142
|
-
|
|
143
|
-
`${describeProbePlan(capped.requests, tuning.concurrency, tuning.timeoutMs)}\n`);
|
|
144
|
-
const ok = await approved(ctx, `将发 ${capped.requests} 次计费请求并写入 ${ctx.level.userConfigPath}`);
|
|
134
|
+
io.stdout(msg().subcommands.providers.probePlan(capped.ids.length, capped.requests, max, capped.dropped) + `${describeProbePlan(capped.requests, tuning.concurrency, tuning.timeoutMs)}\n`);
|
|
135
|
+
const ok = await approved(ctx, msg().subcommands.providers.confirmProbe(capped.requests, ctx.level.userConfigPath));
|
|
145
136
|
if (ok === "usage")
|
|
146
137
|
return { plans: [], cancelled: ExitCode.Usage };
|
|
147
138
|
if (!ok)
|
|
@@ -197,10 +188,10 @@ async function obtainKey(ctx, id, registry) {
|
|
|
197
188
|
const keyEnv = ctx.values.get("key-env");
|
|
198
189
|
if (keyEnv !== undefined) {
|
|
199
190
|
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(keyEnv))
|
|
200
|
-
throw new UsageError(
|
|
191
|
+
throw new UsageError(msg().subcommands.providers.invalidKeyEnv(keyEnv));
|
|
201
192
|
const value = ctx.io.env[keyEnv]?.trim();
|
|
202
193
|
if (!value)
|
|
203
|
-
ctx.io.stderr(
|
|
194
|
+
ctx.io.stderr(msg().subcommands.providers.keyEnvUnset(keyEnv));
|
|
204
195
|
return { apiKey: value || undefined, configValue: `$${keyEnv}` };
|
|
205
196
|
}
|
|
206
197
|
if (registry.get(id) !== undefined) {
|
|
@@ -209,22 +200,23 @@ async function obtainKey(ctx, id, registry) {
|
|
|
209
200
|
return { apiKey: existing.apiKey };
|
|
210
201
|
}
|
|
211
202
|
if (ctx.io.stdinIsTTY)
|
|
212
|
-
ctx.io.stderr(
|
|
203
|
+
ctx.io.stderr(msg().subcommands.providers.keyPrompt(id));
|
|
213
204
|
const key = extractKey(await ctx.io.readStdin());
|
|
214
205
|
if (ctx.io.stdinIsTTY)
|
|
215
206
|
ctx.io.stderr("\n");
|
|
216
207
|
if (key === "")
|
|
217
|
-
throw new UsageError(
|
|
208
|
+
throw new UsageError(msg().subcommands.providers.noKeyOnStdin);
|
|
218
209
|
return { apiKey: key, store: key };
|
|
219
210
|
}
|
|
220
211
|
async function add(ctx, id, refresh) {
|
|
221
212
|
const { io, level } = ctx;
|
|
213
|
+
const m = msg().subcommands.providers;
|
|
222
214
|
if (!PROVIDER_ID_PATTERN.test(id) || id.includes("@"))
|
|
223
|
-
throw new UsageError(
|
|
215
|
+
throw new UsageError(m.invalidId(id));
|
|
224
216
|
const config = userConfig(level);
|
|
225
217
|
const existing = config.providers?.[id];
|
|
226
218
|
if (refresh && existing === undefined) {
|
|
227
|
-
io.stderr(
|
|
219
|
+
io.stderr(m.missingInConfig(level.userConfigPath, id));
|
|
228
220
|
return ExitCode.Usage;
|
|
229
221
|
}
|
|
230
222
|
const registry = await buildRegistry(level, io, ctx.deps);
|
|
@@ -236,28 +228,28 @@ async function add(ctx, id, refresh) {
|
|
|
236
228
|
else {
|
|
237
229
|
const baseUrl = ctx.values.get("base-url");
|
|
238
230
|
if (baseUrl === undefined)
|
|
239
|
-
throw new UsageError(
|
|
231
|
+
throw new UsageError(m.needsBaseUrl);
|
|
240
232
|
if (!/^https?:\/\//.test(baseUrl))
|
|
241
|
-
throw new UsageError(
|
|
233
|
+
throw new UsageError(m.baseUrlNotHttp(baseUrl));
|
|
242
234
|
candidates = defaultChannels(baseUrl, ctx.values.get("api"));
|
|
243
235
|
}
|
|
244
236
|
const target = listingTarget(candidates);
|
|
245
237
|
if (target === undefined)
|
|
246
|
-
throw new UsageError(
|
|
238
|
+
throw new UsageError(m.noChannel(id));
|
|
247
239
|
const key = await obtainKey(ctx, id, registry);
|
|
248
240
|
let listed;
|
|
249
241
|
try {
|
|
250
242
|
listed = await fetchModelList(target, key.apiKey);
|
|
251
243
|
}
|
|
252
244
|
catch (error) {
|
|
253
|
-
io.stderr(
|
|
245
|
+
io.stderr(m.listFailed(id, error.message));
|
|
254
246
|
return ExitCode.RuntimeError;
|
|
255
247
|
}
|
|
256
|
-
io.stdout(
|
|
248
|
+
io.stdout(m.discovered(id, listed.length, target.url));
|
|
257
249
|
// models.dev 只读本地(快照 ⊕ `ama models refresh` 的覆盖),不联网。
|
|
258
250
|
const mdIndex = loadModelsDevIndex(level.dataDir);
|
|
259
251
|
io.stdout(`${describeModelsDev(level.dataDir)}\n`);
|
|
260
|
-
io.stdout(
|
|
252
|
+
io.stdout(m.candidates(candidates));
|
|
261
253
|
const existingIds = new Set((existing?.models ?? []).map((m) => m.id));
|
|
262
254
|
const result = await plan(ctx, {
|
|
263
255
|
id,
|
|
@@ -275,7 +267,7 @@ async function add(ctx, id, refresh) {
|
|
|
275
267
|
if (refresh) {
|
|
276
268
|
const gone = [...existingIds].filter((m) => !listed.some((l) => l.id === m));
|
|
277
269
|
if (gone.length > 0)
|
|
278
|
-
io.stdout(
|
|
270
|
+
io.stdout(m.goneUpstream(gone));
|
|
279
271
|
}
|
|
280
272
|
const writable = result.plans.filter((p) => p.status === "ok" || p.status === "unprobed");
|
|
281
273
|
const legacy = existing !== undefined && existing.channels === undefined;
|
|
@@ -290,7 +282,6 @@ async function add(ctx, id, refresh) {
|
|
|
290
282
|
models: writable,
|
|
291
283
|
prefer: list(ctx.values.get("prefer")) ?? [...DEFAULT_PREFER],
|
|
292
284
|
});
|
|
293
|
-
const keyNote = key.store !== undefined ? `;key → ${level.authFile}(0600)` : "";
|
|
294
285
|
// 还没有缺省模型时按价格规则挑一个写进 defaultModel(default-model.ts 的 pickByPrice);
|
|
295
286
|
// 探测过时只在探测通过的模型里挑
|
|
296
287
|
const verified = writable.filter((p) => p.status === "ok");
|
|
@@ -302,26 +293,30 @@ async function add(ctx, id, refresh) {
|
|
|
302
293
|
toolCall: p.fields.toolCall,
|
|
303
294
|
})))
|
|
304
295
|
: undefined;
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
296
|
+
io.stdout(m.writeSummary({
|
|
297
|
+
path: level.userConfigPath,
|
|
298
|
+
id,
|
|
299
|
+
channels: merged.addedChannels,
|
|
300
|
+
models: merged.addedModels.length,
|
|
301
|
+
authFile: key.store !== undefined ? level.authFile : undefined,
|
|
302
|
+
defaultModel: defaultPick !== undefined ? `${id}/${defaultPick.id}` : undefined,
|
|
303
|
+
}));
|
|
309
304
|
if (defaultPick !== undefined)
|
|
310
|
-
io.stdout(
|
|
305
|
+
io.stdout(m.defaultPick(defaultPick.id, defaultPick.reason));
|
|
311
306
|
else if (level.merged.config.defaultModel === undefined && writable.length > 0)
|
|
312
|
-
io.stdout(
|
|
307
|
+
io.stdout(m.noDefaultPick);
|
|
313
308
|
if (merged.addedModels.length === 0 &&
|
|
314
309
|
merged.addedChannels.length === 0 &&
|
|
315
310
|
key.store === undefined) {
|
|
316
|
-
io.stdout(
|
|
311
|
+
io.stdout(m.nothingToWrite);
|
|
317
312
|
return result.stopped !== undefined ? ExitCode.RuntimeError : ExitCode.Ok;
|
|
318
313
|
}
|
|
319
314
|
if (!ctx.flags.has("probe")) {
|
|
320
|
-
const ok = await approved(ctx,
|
|
315
|
+
const ok = await approved(ctx, m.confirmWrite);
|
|
321
316
|
if (ok === "usage")
|
|
322
317
|
return ExitCode.Usage;
|
|
323
318
|
if (!ok) {
|
|
324
|
-
io.stderr(
|
|
319
|
+
io.stderr(msg().subcommands.common.cancelled);
|
|
325
320
|
return ExitCode.Ok;
|
|
326
321
|
}
|
|
327
322
|
}
|
|
@@ -333,14 +328,14 @@ async function add(ctx, id, refresh) {
|
|
|
333
328
|
writeConfigFile(level.userConfigPath, config, { backup: true });
|
|
334
329
|
if (key.store !== undefined)
|
|
335
330
|
setAuthKey(level.authFile, id, key.store);
|
|
336
|
-
io.stdout(
|
|
331
|
+
io.stdout(m.written(level.userConfigPath, backup));
|
|
337
332
|
const sample = defaultPick?.id ??
|
|
338
333
|
result.plans.find((p) => p.status === "ok" && merged.addedModels.includes(p.id))?.id ??
|
|
339
334
|
merged.addedModels[0];
|
|
340
335
|
if (sample !== undefined)
|
|
341
|
-
io.stdout(
|
|
336
|
+
io.stdout(m.tryIt(`${id}/${sample}`));
|
|
342
337
|
if (result.stopped !== undefined) {
|
|
343
|
-
io.stderr(
|
|
338
|
+
io.stderr(m.probeStopped(result.stopped));
|
|
344
339
|
return ExitCode.RuntimeError;
|
|
345
340
|
}
|
|
346
341
|
return ExitCode.Ok;
|
|
@@ -375,7 +370,7 @@ function takeChannels(argv) {
|
|
|
375
370
|
if (token === "--channel") {
|
|
376
371
|
const value = argv[++i];
|
|
377
372
|
if (value === undefined || value === "")
|
|
378
|
-
throw new UsageError(
|
|
373
|
+
throw new UsageError(msg().subcommands.providers.channelNeedsValue);
|
|
379
374
|
specs.push(value);
|
|
380
375
|
}
|
|
381
376
|
else if (token.startsWith("--channel="))
|
|
@@ -390,11 +385,11 @@ export async function runProviders(argv, io, deps) {
|
|
|
390
385
|
const { positionals, values, flags } = parseSubArgs(rest, VALUE_OPTIONS, FLAG_OPTIONS);
|
|
391
386
|
const action = positionals[0];
|
|
392
387
|
if (flags.has("help") || action === undefined) {
|
|
393
|
-
io.stdout(
|
|
388
|
+
io.stdout(providersUsage());
|
|
394
389
|
return flags.has("help") ? ExitCode.Ok : ExitCode.Usage;
|
|
395
390
|
}
|
|
396
391
|
if (deps === undefined) {
|
|
397
|
-
io.stderr("
|
|
392
|
+
io.stderr(msg().subcommands.common.notAssembled("providers"));
|
|
398
393
|
return ExitCode.RuntimeError;
|
|
399
394
|
}
|
|
400
395
|
const level = loadUserLevel(io, {
|
|
@@ -402,14 +397,14 @@ export async function runProviders(argv, io, deps) {
|
|
|
402
397
|
authFile: values.get("auth-file"),
|
|
403
398
|
});
|
|
404
399
|
for (const warning of level.warnings)
|
|
405
|
-
io.stderr(
|
|
400
|
+
io.stderr(msg().subcommands.common.warning(warning));
|
|
406
401
|
const ctx = { io, deps, level, values, flags, channelSpecs: specs };
|
|
407
402
|
const target = positionals[1];
|
|
408
403
|
const need = () => {
|
|
409
404
|
if (target === undefined)
|
|
410
|
-
throw new UsageError(`ama providers ${action}
|
|
405
|
+
throw new UsageError(msg().subcommands.common.needsArg(`ama providers ${action}`, "<id>"));
|
|
411
406
|
if (positionals.length > 2)
|
|
412
|
-
throw new UsageError(
|
|
407
|
+
throw new UsageError(msg().subcommands.common.extraArgs(positionals.slice(2).join(" ")));
|
|
413
408
|
return target;
|
|
414
409
|
};
|
|
415
410
|
switch (action) {
|
|
@@ -424,6 +419,6 @@ export async function runProviders(argv, io, deps) {
|
|
|
424
419
|
case "remove":
|
|
425
420
|
return removeProvider(ctx, need());
|
|
426
421
|
default:
|
|
427
|
-
throw new UsageError(
|
|
422
|
+
throw new UsageError(msg().subcommands.common.unknownSubcommand("providers", action));
|
|
428
423
|
}
|
|
429
424
|
}
|
|
@@ -6,5 +6,5 @@
|
|
|
6
6
|
* - 导出内容先脱敏(session/redact.ts),格式说明见 docs/sessions.md「导出」。
|
|
7
7
|
*/
|
|
8
8
|
import type { CliIo } from "../deps.js";
|
|
9
|
-
export declare
|
|
9
|
+
export declare function sessionsExportUsage(): string;
|
|
10
10
|
export declare function runSessionsExport(argv: readonly string[], io: CliIo): Promise<number>;
|
|
@@ -12,9 +12,10 @@ import { renderExport } from "../../session/export.js";
|
|
|
12
12
|
import { findSessionFileReadOnly, readSessionReadOnly } from "../../session/scan.js";
|
|
13
13
|
import { parseSubArgs, UsageError } from "../args.js";
|
|
14
14
|
import { ExitCode } from "../exit-codes.js";
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
import { msg } from "../../i18n/index.js";
|
|
16
|
+
export function sessionsExportUsage() {
|
|
17
|
+
return msg().subcommands.sessionsExport.usage;
|
|
18
|
+
}
|
|
18
19
|
const FORMATS = ["md", "json", "jsonl"];
|
|
19
20
|
const BRANCHES = ["leaf", "all"];
|
|
20
21
|
export async function runSessionsExport(argv, io) {
|
|
@@ -25,21 +26,21 @@ export async function runSessionsExport(argv, io) {
|
|
|
25
26
|
"session-dir",
|
|
26
27
|
]);
|
|
27
28
|
if (flags.has("help")) {
|
|
28
|
-
io.stdout(
|
|
29
|
+
io.stdout(sessionsExportUsage());
|
|
29
30
|
return ExitCode.Ok;
|
|
30
31
|
}
|
|
31
32
|
const [id, extra] = positionals;
|
|
32
33
|
if (id === undefined)
|
|
33
|
-
throw new UsageError("ama sessions export
|
|
34
|
+
throw new UsageError(msg().subcommands.common.needsArg("ama sessions export", "<id>"));
|
|
34
35
|
if (extra !== undefined)
|
|
35
|
-
throw new UsageError(
|
|
36
|
+
throw new UsageError(msg().subcommands.common.extraArgs(extra));
|
|
36
37
|
const format = (values.get("format") ?? "md");
|
|
37
38
|
if (!FORMATS.includes(format)) {
|
|
38
|
-
throw new UsageError(
|
|
39
|
+
throw new UsageError(msg().subcommands.common.invalidChoice("--format", FORMATS, format));
|
|
39
40
|
}
|
|
40
41
|
const branch = (values.get("branch") ?? "leaf");
|
|
41
42
|
if (!BRANCHES.includes(branch)) {
|
|
42
|
-
throw new UsageError(
|
|
43
|
+
throw new UsageError(msg().subcommands.common.invalidChoice("--branch", BRANCHES, branch));
|
|
43
44
|
}
|
|
44
45
|
const dirFlag = values.get("session-dir");
|
|
45
46
|
const root = dirFlag !== undefined
|
|
@@ -54,6 +55,6 @@ export async function runSessionsExport(argv, io) {
|
|
|
54
55
|
}
|
|
55
56
|
const target = resolve(io.cwd, expandHome(output, { env: io.env }));
|
|
56
57
|
writeFileSync(target, text, { mode: 0o600 });
|
|
57
|
-
io.stderr(
|
|
58
|
+
io.stderr(msg().subcommands.sessionsExport.exported(target));
|
|
58
59
|
return ExitCode.Ok;
|
|
59
60
|
}
|
|
@@ -8,6 +8,6 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { type SearchHit } from "../../session/search.js";
|
|
10
10
|
import type { CliIo } from "../deps.js";
|
|
11
|
-
export declare
|
|
11
|
+
export declare function sessionsSearchUsage(): string;
|
|
12
12
|
export declare function renderHit(hit: SearchHit, color: boolean): string;
|
|
13
13
|
export declare function runSessionsSearch(argv: readonly string[], io: CliIo): Promise<number>;
|
|
@@ -13,9 +13,10 @@ import { compileQuery, searchSessions, } from "../../session/search.js";
|
|
|
13
13
|
import { parseSubArgs, UsageError } from "../args.js";
|
|
14
14
|
import { ExitCode } from "../exit-codes.js";
|
|
15
15
|
import { parseDaySpec } from "./stats.js";
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
import { msg } from "../../i18n/index.js";
|
|
17
|
+
export function sessionsSearchUsage() {
|
|
18
|
+
return msg().subcommands.sessionsSearch.usage;
|
|
19
|
+
}
|
|
19
20
|
const ROLES = ["user", "assistant", "tool"];
|
|
20
21
|
function highlight(text, ranges, color) {
|
|
21
22
|
if (!color || ranges.length === 0)
|
|
@@ -44,18 +45,18 @@ export function renderHit(hit, color) {
|
|
|
44
45
|
export async function runSessionsSearch(argv, io) {
|
|
45
46
|
const { positionals, values, flags } = parseSubArgs(argv, ["role", "since", "limit", "session-dir"], ["all", "json"]);
|
|
46
47
|
if (flags.has("help")) {
|
|
47
|
-
io.stdout(
|
|
48
|
+
io.stdout(sessionsSearchUsage());
|
|
48
49
|
return ExitCode.Ok;
|
|
49
50
|
}
|
|
50
51
|
const pattern = positionals.join(" ");
|
|
51
52
|
if (pattern.trim() === "")
|
|
52
|
-
throw new UsageError(
|
|
53
|
+
throw new UsageError(msg().subcommands.sessionsSearch.needsPattern);
|
|
53
54
|
let query;
|
|
54
55
|
try {
|
|
55
56
|
query = compileQuery(pattern);
|
|
56
57
|
}
|
|
57
58
|
catch (error) {
|
|
58
|
-
throw new UsageError(
|
|
59
|
+
throw new UsageError(msg().subcommands.sessionsSearch.invalidRegex(error.message));
|
|
59
60
|
}
|
|
60
61
|
let roles;
|
|
61
62
|
const roleRaw = values.get("role");
|
|
@@ -63,14 +64,14 @@ export async function runSessionsSearch(argv, io) {
|
|
|
63
64
|
roles = new Set();
|
|
64
65
|
for (const role of roleRaw.split(",").map((r) => r.trim())) {
|
|
65
66
|
if (!ROLES.includes(role)) {
|
|
66
|
-
throw new UsageError(
|
|
67
|
+
throw new UsageError(msg().subcommands.common.invalidChoice("--role", ROLES, role));
|
|
67
68
|
}
|
|
68
69
|
roles.add(role);
|
|
69
70
|
}
|
|
70
71
|
}
|
|
71
72
|
const limit = Number(values.get("limit") ?? "20");
|
|
72
73
|
if (!Number.isInteger(limit) || limit < 1)
|
|
73
|
-
throw new UsageError(
|
|
74
|
+
throw new UsageError(msg().subcommands.sessionsSearch.limitPositive);
|
|
74
75
|
const sinceRaw = values.get("since");
|
|
75
76
|
const sinceIso = sinceRaw === undefined
|
|
76
77
|
? undefined
|
|
@@ -91,13 +92,13 @@ export async function runSessionsSearch(argv, io) {
|
|
|
91
92
|
return ExitCode.Ok;
|
|
92
93
|
}
|
|
93
94
|
if (hits.length === 0) {
|
|
94
|
-
io.stdout(flags.has("all")
|
|
95
|
+
io.stdout(msg().subcommands.sessionsSearch.noHits(flags.has("all")));
|
|
95
96
|
return ExitCode.Ok;
|
|
96
97
|
}
|
|
97
98
|
const color = io.stdoutIsTTY && (io.env["NO_COLOR"] ?? "") === "";
|
|
98
99
|
for (const hit of hits)
|
|
99
100
|
io.stdout(renderHit(hit, color));
|
|
100
101
|
if (truncated)
|
|
101
|
-
io.stdout(
|
|
102
|
+
io.stdout(msg().subcommands.sessionsSearch.truncated(limit));
|
|
102
103
|
return ExitCode.Ok;
|
|
103
104
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama sessions trace <id|文件>`:会话轨迹导出(docs/wave6-plan.md §2.5、D7)。[W6-T2]
|
|
3
|
+
*
|
|
4
|
+
* - 缺省 / `--html [文件]` / `--format html`:自包含 HTML(`trace/html.ts`);`--json` / `--format json`:与 RPC
|
|
5
|
+
* `get_trace` 同形的 JSON(全部回合、已加载子会话、`previews` 只含本会话节点;`--no-content` 时没有)。
|
|
6
|
+
* - 输出:`--html <文件>` 或 `--output <文件>` 写文件(0600),否则 stdout;`--open` 写好后用系统浏览器打开
|
|
7
|
+
* (没给文件时写到临时目录)。
|
|
8
|
+
* - `--branch leaf|all`、`--no-content`(只留结构与数字)、`--children`(HTML 内嵌子会话预览)、
|
|
9
|
+
* `--now <ms>`(生成时间,确定性)。
|
|
10
|
+
* - 只读:不加锁、不改会话文件(推算出的时间不写回);子会话缺失只标 childMissing。
|
|
11
|
+
*/
|
|
12
|
+
import { type TraceInput } from "../../trace/build.js";
|
|
13
|
+
import type { CliIo } from "../deps.js";
|
|
14
|
+
export declare function sessionsTraceUsage(): string;
|
|
15
|
+
export interface SessionsTraceDeps {
|
|
16
|
+
/** 打开浏览器(测试替身;缺省 detached spawn)。 */
|
|
17
|
+
open?: (command: OpenCommand) => Promise<void>;
|
|
18
|
+
/** 生成时间(缺省 `Date.now()`;`--now` 优先)。 */
|
|
19
|
+
now?: () => number;
|
|
20
|
+
platform?: NodeJS.Platform;
|
|
21
|
+
/** 读子会话(测试替身)。 */
|
|
22
|
+
readChild?: (file: string) => TraceInput | undefined;
|
|
23
|
+
}
|
|
24
|
+
export interface OpenCommand {
|
|
25
|
+
command: string;
|
|
26
|
+
args: string[];
|
|
27
|
+
}
|
|
28
|
+
/** 各平台「用缺省程序打开文件」的命令。 */
|
|
29
|
+
export declare function openCommand(platform: NodeJS.Platform, file: string): OpenCommand;
|
|
30
|
+
export declare function runSessionsTrace(argv: readonly string[], io: CliIo, deps?: SessionsTraceDeps): Promise<number>;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama sessions trace <id|文件>`:会话轨迹导出(docs/wave6-plan.md §2.5、D7)。[W6-T2]
|
|
3
|
+
*
|
|
4
|
+
* - 缺省 / `--html [文件]` / `--format html`:自包含 HTML(`trace/html.ts`);`--json` / `--format json`:与 RPC
|
|
5
|
+
* `get_trace` 同形的 JSON(全部回合、已加载子会话、`previews` 只含本会话节点;`--no-content` 时没有)。
|
|
6
|
+
* - 输出:`--html <文件>` 或 `--output <文件>` 写文件(0600),否则 stdout;`--open` 写好后用系统浏览器打开
|
|
7
|
+
* (没给文件时写到临时目录)。
|
|
8
|
+
* - `--branch leaf|all`、`--no-content`(只留结构与数字)、`--children`(HTML 内嵌子会话预览)、
|
|
9
|
+
* `--now <ms>`(生成时间,确定性)。
|
|
10
|
+
* - 只读:不加锁、不改会话文件(推算出的时间不写回);子会话缺失只标 childMissing。
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from "node:child_process";
|
|
13
|
+
import { existsSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { join, resolve } from "node:path";
|
|
16
|
+
import { expandHome, resolveDataDir } from "../../config/paths.js";
|
|
17
|
+
import { msg } from "../../i18n/index.js";
|
|
18
|
+
import { findSessionFileReadOnly, readSessionReadOnly } from "../../session/scan.js";
|
|
19
|
+
import { buildTrace } from "../../trace/build.js";
|
|
20
|
+
import { entryLookup } from "../../trace/detail.js";
|
|
21
|
+
import { renderTraceHtml } from "../../trace/html.js";
|
|
22
|
+
import { queryTrace } from "../../trace/query.js";
|
|
23
|
+
import { childLoader } from "../../trace/session.js";
|
|
24
|
+
import { AMA_VERSION } from "../../version.js";
|
|
25
|
+
import { parseSubArgs, UsageError } from "../args.js";
|
|
26
|
+
import { ExitCode } from "../exit-codes.js";
|
|
27
|
+
export function sessionsTraceUsage() {
|
|
28
|
+
return msg().trace.cli.usage;
|
|
29
|
+
}
|
|
30
|
+
/** 各平台「用缺省程序打开文件」的命令。 */
|
|
31
|
+
export function openCommand(platform, file) {
|
|
32
|
+
if (platform === "darwin")
|
|
33
|
+
return { command: "open", args: [file] };
|
|
34
|
+
if (platform === "win32")
|
|
35
|
+
return { command: "explorer", args: [file] };
|
|
36
|
+
return { command: "xdg-open", args: [file] };
|
|
37
|
+
}
|
|
38
|
+
function spawnOpen({ command, args }) {
|
|
39
|
+
return new Promise((done, fail) => {
|
|
40
|
+
const child = spawn(command, args, { detached: true, stdio: "ignore" });
|
|
41
|
+
child.once("error", fail);
|
|
42
|
+
child.once("spawn", () => {
|
|
43
|
+
child.unref();
|
|
44
|
+
done();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** `--html [文件]`:值可省略,只在下一个参数像 HTML 文件名时才当作文件。 */
|
|
49
|
+
function splitHtmlFlag(argv) {
|
|
50
|
+
const rest = [];
|
|
51
|
+
let html = false;
|
|
52
|
+
let file;
|
|
53
|
+
for (let i = 0; i < argv.length; i++) {
|
|
54
|
+
const token = argv[i] ?? "";
|
|
55
|
+
if (token.startsWith("--html=")) {
|
|
56
|
+
html = true;
|
|
57
|
+
file = token.slice("--html=".length) || undefined;
|
|
58
|
+
}
|
|
59
|
+
else if (token === "--html") {
|
|
60
|
+
html = true;
|
|
61
|
+
const next = argv[i + 1];
|
|
62
|
+
if (next !== undefined && !next.startsWith("-") && /\.html?$/i.test(next)) {
|
|
63
|
+
file = next;
|
|
64
|
+
i++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else
|
|
68
|
+
rest.push(token);
|
|
69
|
+
}
|
|
70
|
+
return { rest, html, ...(file !== undefined ? { file } : {}) };
|
|
71
|
+
}
|
|
72
|
+
function locate(io, target, dirFlag) {
|
|
73
|
+
const asPath = resolve(io.cwd, expandHome(target, { env: io.env }));
|
|
74
|
+
if (/[\\/]|\.jsonl$/.test(target) && existsSync(asPath))
|
|
75
|
+
return asPath;
|
|
76
|
+
const root = dirFlag !== undefined
|
|
77
|
+
? resolve(io.cwd, expandHome(dirFlag, { env: io.env }))
|
|
78
|
+
: join(resolveDataDir({ env: io.env }), "sessions");
|
|
79
|
+
return findSessionFileReadOnly(root, target, io.cwd);
|
|
80
|
+
}
|
|
81
|
+
export async function runSessionsTrace(argv, io, deps = {}) {
|
|
82
|
+
const common = msg().subcommands.common;
|
|
83
|
+
const m = msg().trace.cli;
|
|
84
|
+
const split = splitHtmlFlag(argv);
|
|
85
|
+
const { positionals, values, flags } = parseSubArgs(split.rest, ["format", "output", "branch", "session-dir", "now"], ["json", "open", "no-content", "children"]);
|
|
86
|
+
if (flags.has("help")) {
|
|
87
|
+
io.stdout(sessionsTraceUsage());
|
|
88
|
+
return ExitCode.Ok;
|
|
89
|
+
}
|
|
90
|
+
const [target, extra] = positionals;
|
|
91
|
+
if (target === undefined)
|
|
92
|
+
throw new UsageError(common.needsArg("ama sessions trace", "<id|file>"));
|
|
93
|
+
if (extra !== undefined)
|
|
94
|
+
throw new UsageError(common.extraArgs(extra));
|
|
95
|
+
const formatFlag = values.get("format");
|
|
96
|
+
if (formatFlag !== undefined && formatFlag !== "html" && formatFlag !== "json")
|
|
97
|
+
throw new UsageError(common.invalidChoice("--format", ["html", "json"], formatFlag));
|
|
98
|
+
const wantsJson = flags.has("json") || formatFlag === "json";
|
|
99
|
+
if (wantsJson && (split.html || formatFlag === "html"))
|
|
100
|
+
throw new UsageError(m.formatConflict);
|
|
101
|
+
const branch = values.get("branch") ?? "leaf";
|
|
102
|
+
if (branch !== "leaf" && branch !== "all")
|
|
103
|
+
throw new UsageError(common.invalidChoice("--branch", ["leaf", "all"], branch));
|
|
104
|
+
const rawNow = values.get("now");
|
|
105
|
+
const nowFlag = rawNow === undefined ? undefined : Number(rawNow);
|
|
106
|
+
if (nowFlag !== undefined && (!Number.isInteger(nowFlag) || nowFlag < 0))
|
|
107
|
+
throw new UsageError(m.badNow(rawNow ?? ""));
|
|
108
|
+
const content = !flags.has("no-content");
|
|
109
|
+
const file = locate(io, target, values.get("session-dir"));
|
|
110
|
+
const read = readSessionReadOnly(file);
|
|
111
|
+
const input = {
|
|
112
|
+
header: read.header,
|
|
113
|
+
entries: read.entries,
|
|
114
|
+
leaf: read.leaf,
|
|
115
|
+
sessionFile: file,
|
|
116
|
+
};
|
|
117
|
+
const loadChild = childLoader(deps.readChild);
|
|
118
|
+
const base = nowFlag !== undefined ? { now: nowFlag } : {};
|
|
119
|
+
let text;
|
|
120
|
+
if (wantsJson) {
|
|
121
|
+
const result = queryTrace(input, { branch, content: content ? "preview" : "none" }, { loadChild, loadChildren: true, unlimited: true, ...base });
|
|
122
|
+
text = `${JSON.stringify(result, null, 2)}\n`;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const trace = buildTrace(input, { branch, loadChild, ...base });
|
|
126
|
+
const children = loadChild.inputs().flatMap((i) => i.entries);
|
|
127
|
+
text = renderTraceHtml(trace, {
|
|
128
|
+
content,
|
|
129
|
+
children: flags.has("children"),
|
|
130
|
+
generatedAt: nowFlag ?? (deps.now ?? Date.now)(),
|
|
131
|
+
version: AMA_VERSION,
|
|
132
|
+
lookup: entryLookup([...input.entries, ...children], read.header.cwd),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const outFlag = split.file ?? values.get("output");
|
|
136
|
+
const open = flags.has("open");
|
|
137
|
+
let outPath = outFlag === undefined ? undefined : resolve(io.cwd, expandHome(outFlag, { env: io.env }));
|
|
138
|
+
if (outPath === undefined && open)
|
|
139
|
+
outPath = join(tmpdir(), `ama-trace-${read.header.id}.${wantsJson ? "json" : "html"}`);
|
|
140
|
+
if (outPath === undefined) {
|
|
141
|
+
io.stdout(text);
|
|
142
|
+
return ExitCode.Ok;
|
|
143
|
+
}
|
|
144
|
+
writeFileSync(outPath, text, { mode: 0o600 });
|
|
145
|
+
io.stderr(m.wrote(outPath));
|
|
146
|
+
if (open) {
|
|
147
|
+
try {
|
|
148
|
+
await (deps.open ?? spawnOpen)(openCommand(deps.platform ?? process.platform, outPath));
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
io.stderr(m.openFailed(error instanceof Error ? error.message : String(error)));
|
|
152
|
+
return ExitCode.RuntimeError;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return ExitCode.Ok;
|
|
156
|
+
}
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
* `ama sessions list|show|prune`(设计 §1.2、§8)。[B5]
|
|
3
3
|
*
|
|
4
4
|
* 会话存储是 B2 的实现,经 RuntimeDeps.sessions 注入;这里只做参数、目录解析与输出格式。
|
|
5
|
-
* - list [--all]
|
|
5
|
+
* - list [--all]:缺省只列当前目录的会话、不列子 Agent 会话;`--all` 列全部目录并带上子 Agent 会话(标 `↳`)。
|
|
6
6
|
* - show <id>:头信息 + 条目类型统计 + 首条提示 + 用户消息编号(`--from <id>#<编号>` 复用)。
|
|
7
|
-
* - search / export:见 sessions-search.ts、sessions-export.ts(只读扫描,不经会话存储)。
|
|
7
|
+
* - search / export / trace:见 sessions-search.ts、sessions-export.ts、sessions-trace.ts(只读扫描,不经会话存储)。
|
|
8
8
|
* - prune [--older-than <天>] [--dry-run]:缺省 30 天,移到 trash(不删除);之后清理检查点备份
|
|
9
9
|
* (未被任何会话引用且超过 1 天的 blob,docs/rewind-plan.md §1.4)与超过 7 天的剪贴板图片
|
|
10
10
|
* (`<数据目录>/clipboard/`,W5-I),`--dry-run` 时只报告。
|
|
11
11
|
*/
|
|
12
12
|
import type { CliIo, RuntimeDeps } from "../deps.js";
|
|
13
|
-
|
|
13
|
+
/** 用法(随界面语言)。 */
|
|
14
|
+
export declare function sessionsUsage(): string;
|
|
14
15
|
export declare function runSessions(argv: readonly string[], io: CliIo, deps: Pick<RuntimeDeps, "sessions"> | undefined): Promise<number>;
|