@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,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/memory`(docs/wave6-plan.md §3.5)。[W6-M]
|
|
3
|
+
*
|
|
4
|
+
* | 输入 | 交互界面 | 行式界面 |
|
|
5
|
+
* | ---------------------------- | ------------------------------------------ | ------------------------------ |
|
|
6
|
+
* | `/memory` | 消息区面板:各作用域条目(> 90 天标灰) | 文本列表 |
|
|
7
|
+
* | `/memory show <名字>` | 面板显示正文 | 打印正文 |
|
|
8
|
+
* | `/memory edit [名字\|作用域]`| `$EDITOR` 编辑副本,存回时检查凭据与上限 | 提示用 `ama memory edit` |
|
|
9
|
+
* | `/memory rm <名字>` | 确认框后删除 | 需 `--yes` |
|
|
10
|
+
* | `/memory on\|off` | 本会话允许 / 禁止写 | 同左 |
|
|
11
|
+
* | `/memory reload` | 重渲染 memory 节(提示断一次缓存) | 同左 |
|
|
12
|
+
*
|
|
13
|
+
* 会话未开启记忆时一律提示如何开启。写入后的索引在下次会话(或 reload)才进系统提示。
|
|
14
|
+
*/
|
|
15
|
+
import { formatBytes } from "../../checkpoints/gc.js";
|
|
16
|
+
import { memoryOf, reloadMemorySection } from "../../cli/compose-memory.js";
|
|
17
|
+
import { msg } from "../../i18n/index.js";
|
|
18
|
+
import { editMemory } from "../../memory/edit.js";
|
|
19
|
+
import { logicalPath } from "../../memory/paths.js";
|
|
20
|
+
import { findOne, isStale, listText, memoryErrorText, runtimeNotes, scopeLabel, scopeSummaries, } from "../../memory/report.js";
|
|
21
|
+
import { Card, wrapTextWithAnsi } from "../../tui.js";
|
|
22
|
+
import { openChoice } from "./confirm-dialog.js";
|
|
23
|
+
import { editExternally } from "./external-editor.js";
|
|
24
|
+
export function parseMemoryArgs(args) {
|
|
25
|
+
const words = args
|
|
26
|
+
.trim()
|
|
27
|
+
.split(/\s+/)
|
|
28
|
+
.filter((w) => w !== "");
|
|
29
|
+
const [sub, ...rest] = words;
|
|
30
|
+
const yes = rest.includes("--yes");
|
|
31
|
+
const name = rest.filter((w) => w !== "--yes").join(" ");
|
|
32
|
+
switch (sub) {
|
|
33
|
+
case undefined:
|
|
34
|
+
case "list":
|
|
35
|
+
return { kind: "list" };
|
|
36
|
+
case "show":
|
|
37
|
+
return name === "" ? { kind: "usage" } : { kind: "show", name };
|
|
38
|
+
case "edit":
|
|
39
|
+
return name === "" ? { kind: "edit" } : { kind: "edit", target: name };
|
|
40
|
+
case "rm":
|
|
41
|
+
return name === "" ? { kind: "usage" } : { kind: "rm", name, yes };
|
|
42
|
+
case "on":
|
|
43
|
+
case "off":
|
|
44
|
+
return rest.length === 0 ? { kind: "writes", on: sub === "on" } : { kind: "usage" };
|
|
45
|
+
case "reload":
|
|
46
|
+
return rest.length === 0 ? { kind: "reload" } : { kind: "usage" };
|
|
47
|
+
default:
|
|
48
|
+
return { kind: "usage" };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** 不需要界面能力的动作(两种界面共用);需要编辑器 / 确认框的返回 undefined。 */
|
|
52
|
+
function simpleAction(runtime, session, action) {
|
|
53
|
+
const m = msg().memory.command;
|
|
54
|
+
switch (action.kind) {
|
|
55
|
+
case "usage":
|
|
56
|
+
return m.usage;
|
|
57
|
+
case "writes":
|
|
58
|
+
runtime.writesEnabled = action.on;
|
|
59
|
+
return action.on ? m.writesOn : m.writesOff;
|
|
60
|
+
case "reload":
|
|
61
|
+
return reloadMemorySection(session)?.changed === true ? m.reloaded : m.reloadUnchanged;
|
|
62
|
+
case "show": {
|
|
63
|
+
const found = findOne(runtime.store, action.name);
|
|
64
|
+
if (!found.ok)
|
|
65
|
+
return found.message;
|
|
66
|
+
const text = runtime.store.readRaw(found.entry) ?? "";
|
|
67
|
+
return `${logicalPath(found.entry.scope, found.entry.file)}\n${text.trimEnd()}`;
|
|
68
|
+
}
|
|
69
|
+
default:
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** 行式界面(`CommandContext.extra.memory`)。 */
|
|
74
|
+
export async function memoryLineCommand(args, ctx) {
|
|
75
|
+
const m = msg().memory;
|
|
76
|
+
const session = ctx.session();
|
|
77
|
+
const runtime = memoryOf(session);
|
|
78
|
+
if (runtime === undefined)
|
|
79
|
+
return { kind: "handled", message: m.panel.disabled };
|
|
80
|
+
const action = parseMemoryArgs(args);
|
|
81
|
+
const simple = simpleAction(runtime, session, action);
|
|
82
|
+
if (simple !== undefined)
|
|
83
|
+
return { kind: "handled", message: simple };
|
|
84
|
+
if (action.kind === "list")
|
|
85
|
+
return { kind: "handled", message: listText(runtime.store, { notes: runtimeNotes(runtime) }) };
|
|
86
|
+
if (action.kind === "edit")
|
|
87
|
+
return { kind: "handled", message: m.command.lineNoEditor };
|
|
88
|
+
if (action.kind !== "rm")
|
|
89
|
+
return { kind: "handled", message: m.command.usage };
|
|
90
|
+
const found = findOne(runtime.store, action.name);
|
|
91
|
+
if (!found.ok)
|
|
92
|
+
return { kind: "handled", message: found.message };
|
|
93
|
+
if (!action.yes)
|
|
94
|
+
return { kind: "handled", message: m.command.lineNeedsYes(action.name) };
|
|
95
|
+
try {
|
|
96
|
+
return {
|
|
97
|
+
kind: "handled",
|
|
98
|
+
message: m.command.deleted((await runtime.store.remove(found.entry)).path),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return { kind: "handled", message: memoryErrorText(error) };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** 按行折行的简单正文组件。 */
|
|
106
|
+
class Lines {
|
|
107
|
+
lines;
|
|
108
|
+
constructor(lines) {
|
|
109
|
+
this.lines = lines;
|
|
110
|
+
}
|
|
111
|
+
render(width) {
|
|
112
|
+
return this.lines.flatMap((line) => (line === "" ? [""] : wrapTextWithAnsi(line, width)));
|
|
113
|
+
}
|
|
114
|
+
invalidate() { }
|
|
115
|
+
}
|
|
116
|
+
/** `/memory` 面板:每个作用域一段,条目一行(名字、说明、更新日期;> 90 天标灰)。 */
|
|
117
|
+
export function memoryListPanel(runtime, theme, now) {
|
|
118
|
+
const m = msg().memory.panel;
|
|
119
|
+
const store = runtime.store;
|
|
120
|
+
const lines = [];
|
|
121
|
+
for (const s of scopeSummaries(store)) {
|
|
122
|
+
if (lines.length > 0)
|
|
123
|
+
lines.push("");
|
|
124
|
+
lines.push(theme.bold(m.scopeLine(`${scopeLabel(s.scope)} ${logicalPath(s.scope)}/`, s.entries.length, formatBytes(s.indexBytes), formatBytes(store.limits.indexMaxBytes))));
|
|
125
|
+
if (s.entries.length === 0)
|
|
126
|
+
lines.push(theme.fg("dim", ` ${m.noEntries}`));
|
|
127
|
+
for (const e of s.entries) {
|
|
128
|
+
const description = e.description === "" ? "" : ` — ${e.description}`;
|
|
129
|
+
const text = ` ${e.name}${description} ${m.entryUpdated(e.updated)}`;
|
|
130
|
+
lines.push(isStale(e, now) ? theme.fg("dim", text) : text);
|
|
131
|
+
}
|
|
132
|
+
if (s.omitted > 0)
|
|
133
|
+
lines.push(theme.fg("warning", ` ${m.truncated(s.omitted)}`));
|
|
134
|
+
}
|
|
135
|
+
for (const note of runtimeNotes(runtime))
|
|
136
|
+
lines.push("", theme.fg("warning", note));
|
|
137
|
+
return new Card(new Lines(lines), { theme, title: m.title, subtitle: m.hint });
|
|
138
|
+
}
|
|
139
|
+
/** 交互界面的 `CommandUi.memoryPanel`。 */
|
|
140
|
+
export function createMemoryPanel(deps) {
|
|
141
|
+
const edit = deps.edit ??
|
|
142
|
+
((text, name) => editExternally(text, name, {
|
|
143
|
+
env: deps.env,
|
|
144
|
+
suspend: () => deps.suspend(),
|
|
145
|
+
resume: () => deps.resume(),
|
|
146
|
+
}));
|
|
147
|
+
return async (args) => {
|
|
148
|
+
const ui = deps.ui();
|
|
149
|
+
const m = msg().memory;
|
|
150
|
+
const session = ui.session();
|
|
151
|
+
const runtime = memoryOf(session);
|
|
152
|
+
if (runtime === undefined)
|
|
153
|
+
return ui.notice("info", m.panel.disabled);
|
|
154
|
+
const action = parseMemoryArgs(args);
|
|
155
|
+
const theme = ui.theme?.();
|
|
156
|
+
if (action.kind === "list") {
|
|
157
|
+
if (ui.panel !== undefined && theme !== undefined)
|
|
158
|
+
return ui.panel(memoryListPanel(runtime, theme, ui.now()));
|
|
159
|
+
return ui.notice("info", listText(runtime.store, { notes: runtimeNotes(runtime) }));
|
|
160
|
+
}
|
|
161
|
+
if (action.kind === "show" && ui.panel !== undefined && theme !== undefined) {
|
|
162
|
+
const found = findOne(runtime.store, action.name);
|
|
163
|
+
if (!found.ok)
|
|
164
|
+
return ui.notice("warn", found.message);
|
|
165
|
+
const body = (runtime.store.readRaw(found.entry) ?? "").trimEnd().split("\n");
|
|
166
|
+
const title = logicalPath(found.entry.scope, found.entry.file);
|
|
167
|
+
return ui.panel(new Card(new Lines(body), { theme, title }));
|
|
168
|
+
}
|
|
169
|
+
const simple = simpleAction(runtime, session, action);
|
|
170
|
+
if (simple !== undefined)
|
|
171
|
+
return ui.notice("info", simple);
|
|
172
|
+
try {
|
|
173
|
+
if (action.kind === "edit") {
|
|
174
|
+
const outcome = await editMemory(runtime.store, action.target, edit);
|
|
175
|
+
if (outcome.status === "saved")
|
|
176
|
+
return ui.notice("info", m.command.saved(outcome.path));
|
|
177
|
+
if (outcome.status === "not_found")
|
|
178
|
+
return ui.notice("warn", outcome.message);
|
|
179
|
+
return ui.notice("info", outcome.status === "cancelled" ? m.command.editCancelled : m.command.unchanged);
|
|
180
|
+
}
|
|
181
|
+
if (action.kind !== "rm")
|
|
182
|
+
return ui.notice("info", m.command.usage);
|
|
183
|
+
const found = findOne(runtime.store, action.name);
|
|
184
|
+
if (!found.ok)
|
|
185
|
+
return ui.notice("warn", found.message);
|
|
186
|
+
const path = logicalPath(found.entry.scope, found.entry.file);
|
|
187
|
+
const choice = action.yes
|
|
188
|
+
? 0
|
|
189
|
+
: await openChoice(deps.choice, {
|
|
190
|
+
title: m.command.confirmTitle,
|
|
191
|
+
body: [path],
|
|
192
|
+
options: [
|
|
193
|
+
{ label: m.command.confirmDelete, keys: "y" },
|
|
194
|
+
{ label: m.command.confirmCancel, keys: "n Esc" },
|
|
195
|
+
],
|
|
196
|
+
selected: 1,
|
|
197
|
+
borderColor: "warning",
|
|
198
|
+
});
|
|
199
|
+
if (choice !== 0)
|
|
200
|
+
return;
|
|
201
|
+
await runtime.store.remove(found.entry);
|
|
202
|
+
ui.notice("info", m.command.deleted(path));
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
ui.notice("error", memoryErrorText(error));
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/** interactive-mode.ts 的一行装配(编辑器期间停掉 TUI,回来整屏重画)。 */
|
|
210
|
+
export function memoryPanelFor(ui, choice, tui, env) {
|
|
211
|
+
return createMemoryPanel({
|
|
212
|
+
ui,
|
|
213
|
+
choice,
|
|
214
|
+
env,
|
|
215
|
+
suspend: () => tui.stop(),
|
|
216
|
+
resume: () => {
|
|
217
|
+
tui.start();
|
|
218
|
+
tui.forceFullRedraw();
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
}
|
|
@@ -35,8 +35,8 @@ export interface MessageViewOptions {
|
|
|
35
35
|
export declare function exitSummaryLines(stats: Pick<SessionStats, "sessionId" | "sessionFile" | "userMessages" | "tokens" | "cost" | "cache" | "cacheHitRate">, elapsedMs: number, theme: Theme): string[];
|
|
36
36
|
/** 思考块展开时的正文行数上限(`full` 不限)。 */
|
|
37
37
|
export declare const THINKING_EXPANDED_LINES = 60;
|
|
38
|
-
/** origin →
|
|
39
|
-
export declare
|
|
38
|
+
/** origin → 界面语言的标签(未知 origin 原样显示)。 */
|
|
39
|
+
export declare function originLabel(origin: string): string;
|
|
40
40
|
/** 首行带前缀、续行按 `indent` 缩进的文本(用户消息、排队消息)。 */
|
|
41
41
|
export declare class PrefixedText implements Component {
|
|
42
42
|
private readonly prefix;
|
|
@@ -80,6 +80,8 @@ export declare class MessageView extends Container {
|
|
|
80
80
|
private thinkingExpanded;
|
|
81
81
|
constructor(options: MessageViewOptions);
|
|
82
82
|
private get theme();
|
|
83
|
+
/** [W6-S] `/config` 热应用:之后渲染的块按新选项(共享同一个 options 对象)。 */
|
|
84
|
+
setOptions(options: Partial<Omit<MessageViewOptions, "theme">>): void;
|
|
83
85
|
/** 追加一块(与上一块之间空一行;`compact` 不空行)。 */
|
|
84
86
|
add(component: Component): void;
|
|
85
87
|
/** 追加工具调用块:紧跟在另一个工具调用后面时不空行。 */
|
|
@@ -14,27 +14,28 @@
|
|
|
14
14
|
*
|
|
15
15
|
* 滚动交给终端回滚:消息区只追加,切换会话时整体清空重画。
|
|
16
16
|
*/
|
|
17
|
+
import { msg } from "../../i18n/index.js";
|
|
17
18
|
import { Card, Container, Markdown, Spacer, Text, visibleWidth, wrapTextWithAnsi, } from "../../tui.js";
|
|
18
19
|
import { formatCost, formatTokens } from "./status-bar.js";
|
|
19
20
|
import { notificationSummary } from "./subagent-view.js";
|
|
20
21
|
import { PLAN_APPROVED_PROMPT } from "../../plan/prompts.js";
|
|
21
22
|
/** 退出摘要的时长:不足 1 分钟按秒,否则按分钟。 */
|
|
22
23
|
function sessionDuration(ms) {
|
|
23
|
-
|
|
24
|
-
return seconds < 60 ? `${seconds} 秒` : `${Math.round(seconds / 60)} 分钟`;
|
|
24
|
+
return msg().interactive.view.message.duration(Math.max(0, Math.round(ms / 1000)));
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* 退出摘要(§3.14):`─ 会话 <id> · 时长 · N 回合 · ↑in ↓out · cache x% · $y(重计费 $z)` 与
|
|
28
28
|
* ` 恢复:ama --resume <id>`。整体 dim,会话 id 与恢复命令正文色;0 回合只到「回合」;会话没落盘不给恢复行。
|
|
29
29
|
*/
|
|
30
30
|
export function exitSummaryLines(stats, elapsedMs, theme) {
|
|
31
|
+
const m = msg().interactive.view.message;
|
|
31
32
|
const g = theme.glyphs;
|
|
32
33
|
const dim = (s) => theme.fg("dim", s);
|
|
33
34
|
const id = stats.sessionId.slice(0, 8);
|
|
34
35
|
const parts = [
|
|
35
|
-
dim(
|
|
36
|
+
dim(m.sessionPrefix(g.rule)) + theme.fg("text", id),
|
|
36
37
|
dim(sessionDuration(elapsedMs)),
|
|
37
|
-
dim(
|
|
38
|
+
dim(m.turns(stats.userMessages)),
|
|
38
39
|
];
|
|
39
40
|
const t = stats.tokens;
|
|
40
41
|
const prompt = t.input + t.cacheRead + t.cacheWrite;
|
|
@@ -45,28 +46,23 @@ export function exitSummaryLines(stats, elapsedMs, theme) {
|
|
|
45
46
|
parts.push(dim(`cache ${Math.round(rate * 100)}%`));
|
|
46
47
|
if (stats.cost !== undefined && stats.cost > 0) {
|
|
47
48
|
const rebill = stats.cache?.reBilledUsd;
|
|
48
|
-
const extra = rebill !== undefined && rebill > 0 ?
|
|
49
|
+
const extra = rebill !== undefined && rebill > 0 ? m.rebill(formatCost(rebill)) : "";
|
|
49
50
|
parts.push(dim(formatCost(stats.cost) + extra));
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
53
|
const lines = [parts.join(dim(" · "))];
|
|
53
54
|
if (stats.userMessages > 0 && stats.sessionFile !== undefined) {
|
|
54
|
-
lines.push(dim(
|
|
55
|
+
lines.push(dim(m.resume) + theme.fg("text", `ama --resume ${id}`));
|
|
55
56
|
}
|
|
56
57
|
return lines;
|
|
57
58
|
}
|
|
58
59
|
/** 思考块展开时的正文行数上限(`full` 不限)。 */
|
|
59
60
|
export const THINKING_EXPANDED_LINES = 60;
|
|
60
|
-
/** origin →
|
|
61
|
-
export
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
task: "子 Agent 通知",
|
|
66
|
-
plan: "计划",
|
|
67
|
-
};
|
|
68
|
-
/** [W5-U] origin 为 plan 的交接消息(给模型的英文开场)在消息区的说法。 */
|
|
69
|
-
const PLAN_HANDOFF_TEXT = "按批准的计划开始执行";
|
|
61
|
+
/** origin → 界面语言的标签(未知 origin 原样显示)。 */
|
|
62
|
+
export function originLabel(origin) {
|
|
63
|
+
const labels = msg().interactive.view.message.origin;
|
|
64
|
+
return labels[origin] ?? origin;
|
|
65
|
+
}
|
|
70
66
|
/** 首行带前缀、续行按 `indent` 缩进的文本(用户消息、排队消息)。 */
|
|
71
67
|
export class PrefixedText {
|
|
72
68
|
prefix;
|
|
@@ -135,9 +131,10 @@ class ThinkingView {
|
|
|
135
131
|
const t = this.theme;
|
|
136
132
|
const g = t.glyphs;
|
|
137
133
|
const style = (s) => t.fg("dim", t.italic(s));
|
|
134
|
+
const m = msg().interactive.view.message;
|
|
138
135
|
const title = this.streaming
|
|
139
|
-
?
|
|
140
|
-
:
|
|
136
|
+
? m.thinkingStreaming(g.thinking, g.ellipsis)
|
|
137
|
+
: m.thinking(g.thinking, formatTokens(this.tokens));
|
|
141
138
|
const lines = [
|
|
142
139
|
style(title) + (this.open && !this.streaming ? " " + t.fg("dim", g.collapse) : ""),
|
|
143
140
|
];
|
|
@@ -150,7 +147,7 @@ class ThinkingView {
|
|
|
150
147
|
for (const line of all.slice(0, limit))
|
|
151
148
|
lines.push(" " + t.fg("muted", t.italic(line)));
|
|
152
149
|
if (all.length > limit) {
|
|
153
|
-
lines.push(" " + t.fg("dim",
|
|
150
|
+
lines.push(" " + t.fg("dim", m.moreLines(g.ellipsis, all.length - limit)));
|
|
154
151
|
}
|
|
155
152
|
}
|
|
156
153
|
this.cache = { width, lines };
|
|
@@ -173,7 +170,11 @@ export function contentText(content) {
|
|
|
173
170
|
if (typeof content === "string")
|
|
174
171
|
return content;
|
|
175
172
|
return content
|
|
176
|
-
.map((block) =>
|
|
173
|
+
.map((block) => block.type === "text"
|
|
174
|
+
? block.text
|
|
175
|
+
: block.type === "image"
|
|
176
|
+
? msg().interactive.view.message.image
|
|
177
|
+
: "")
|
|
177
178
|
.join("");
|
|
178
179
|
}
|
|
179
180
|
/** 一条助手消息:按内容块(思考 / 文本)同步子组件;工具调用块由 tool-view 单独显示。 */
|
|
@@ -247,14 +248,15 @@ export class AssistantView extends Container {
|
|
|
247
248
|
finish(message) {
|
|
248
249
|
this.streaming = false;
|
|
249
250
|
const { theme } = this.options;
|
|
251
|
+
const m = msg().interactive.view.message;
|
|
250
252
|
if (message.stopReason === "error") {
|
|
251
|
-
this.status.setText(theme.fg("error", `${theme.glyphs.fail} ${message.errorMessage ??
|
|
253
|
+
this.status.setText(theme.fg("error", `${theme.glyphs.fail} ${message.errorMessage ?? m.modelError}`));
|
|
252
254
|
}
|
|
253
255
|
else if (message.stopReason === "aborted") {
|
|
254
|
-
this.status.setText(theme.fg("dim",
|
|
256
|
+
this.status.setText(theme.fg("dim", m.interrupted));
|
|
255
257
|
}
|
|
256
258
|
else if (message.stopReason === "length") {
|
|
257
|
-
this.status.setText(theme.fg("warning",
|
|
259
|
+
this.status.setText(theme.fg("warning", m.lengthLimit));
|
|
258
260
|
}
|
|
259
261
|
this.update(message);
|
|
260
262
|
}
|
|
@@ -285,6 +287,10 @@ export class MessageView extends Container {
|
|
|
285
287
|
get theme() {
|
|
286
288
|
return this.options.theme;
|
|
287
289
|
}
|
|
290
|
+
/** [W6-S] `/config` 热应用:之后渲染的块按新选项(共享同一个 options 对象)。 */
|
|
291
|
+
setOptions(options) {
|
|
292
|
+
Object.assign(this.options, options);
|
|
293
|
+
}
|
|
288
294
|
/** 追加一块(与上一块之间空一行;`compact` 不空行)。 */
|
|
289
295
|
add(component) {
|
|
290
296
|
this.push(component, this.options.compact !== true);
|
|
@@ -350,12 +356,12 @@ export class MessageView extends Container {
|
|
|
350
356
|
this.add(new PrefixedText(t.fg("user", t.bold(t.glyphs.prompt)) + " ", text));
|
|
351
357
|
return;
|
|
352
358
|
}
|
|
353
|
-
const label =
|
|
359
|
+
const label = originLabel(origin);
|
|
354
360
|
// [W5-U] 后台子 Agent 的 <task-notification> 是给模型的全文,消息区只留一行
|
|
355
361
|
const summary = origin === "task"
|
|
356
362
|
? notificationSummary(text)
|
|
357
363
|
: origin === "plan" && text === PLAN_APPROVED_PROMPT
|
|
358
|
-
?
|
|
364
|
+
? msg().interactive.view.message.planHandoff
|
|
359
365
|
: undefined;
|
|
360
366
|
if (summary !== undefined) {
|
|
361
367
|
this.add(new PrefixedText(t.fg("dim", t.glyphs.queued) + " " + t.fg("muted", `${label} `), t.fg("muted", summary)));
|
|
@@ -398,23 +404,24 @@ export class MessageView extends Container {
|
|
|
398
404
|
}
|
|
399
405
|
addHookBlocked(reason) {
|
|
400
406
|
const glyph = this.theme.glyphs.blocked;
|
|
401
|
-
this.add(new Text(this.theme.fg("warning",
|
|
407
|
+
this.add(new Text(this.theme.fg("warning", msg().interactive.view.message.hookBlocked(glyph, reason))));
|
|
402
408
|
}
|
|
403
409
|
addRetry(attempt, maxAttempts, delayMs, error) {
|
|
404
410
|
const seconds = Math.max(1, Math.round(delayMs / 1000));
|
|
405
411
|
const glyph = this.theme.glyphs.retry;
|
|
406
|
-
this.add(new Text(this.theme.fg("warning",
|
|
412
|
+
this.add(new Text(this.theme.fg("warning", msg().interactive.view.message.retry(glyph, attempt, maxAttempts, seconds, error))));
|
|
407
413
|
}
|
|
408
414
|
/** 退出前追加的会话摘要(留在终端回滚里)。 */
|
|
409
415
|
addExitSummary(lines) {
|
|
410
416
|
this.add(new Text(lines.join("\n")));
|
|
411
417
|
}
|
|
412
418
|
addRetryFailed(error) {
|
|
413
|
-
this.addNotice("error",
|
|
419
|
+
this.addNotice("error", msg().interactive.view.message.retryFailed(error));
|
|
414
420
|
}
|
|
415
421
|
/** 压缩 / 分支摘要卡(左竖条):标题 + token 变化(有则显示)+ 摘要前 3 行。 */
|
|
416
422
|
addSummaryCard(summary, options = {}) {
|
|
417
423
|
const t = this.theme;
|
|
424
|
+
const m = msg().interactive.view.message;
|
|
418
425
|
const lines = summary
|
|
419
426
|
.trim()
|
|
420
427
|
.split("\n")
|
|
@@ -422,16 +429,16 @@ export class MessageView extends Container {
|
|
|
422
429
|
const head = lines.slice(0, 3);
|
|
423
430
|
const body = head.map((l) => t.fg("muted", l));
|
|
424
431
|
if (lines.length > head.length) {
|
|
425
|
-
body.push(t.fg("dim",
|
|
432
|
+
body.push(t.fg("dim", m.moreLines(t.glyphs.ellipsis, lines.length - head.length)));
|
|
426
433
|
}
|
|
427
434
|
let subtitle;
|
|
428
435
|
if (options.tokensBefore !== undefined) {
|
|
429
|
-
const after = options.tokensAfter !== undefined ?
|
|
430
|
-
subtitle =
|
|
436
|
+
const after = options.tokensAfter !== undefined ? formatTokens(options.tokensAfter) : undefined;
|
|
437
|
+
subtitle = m.summaryTokens(formatTokens(options.tokensBefore), after);
|
|
431
438
|
}
|
|
432
439
|
this.add(new Card(new Text(body.join("\n")), {
|
|
433
440
|
theme: t,
|
|
434
|
-
title: options.title ??
|
|
441
|
+
title: options.title ?? m.compacted,
|
|
435
442
|
...(subtitle !== undefined ? { subtitle } : {}),
|
|
436
443
|
}));
|
|
437
444
|
}
|
|
@@ -471,7 +478,9 @@ export class MessageView extends Container {
|
|
|
471
478
|
this.addSummaryCard(message.summary, { tokensBefore: message.tokensBefore });
|
|
472
479
|
break;
|
|
473
480
|
case "branchSummary":
|
|
474
|
-
this.addSummaryCard(message.summary, {
|
|
481
|
+
this.addSummaryCard(message.summary, {
|
|
482
|
+
title: msg().interactive.view.message.branchSummary,
|
|
483
|
+
});
|
|
475
484
|
break;
|
|
476
485
|
case "custom":
|
|
477
486
|
if (message.display)
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* - `/permissions`:权限模式、判定顺序(折行对齐值列)、规则(allow success、deny error、来源 dim)、
|
|
9
9
|
* 最近的 auto 判定。
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
11
|
+
import { msg } from "../../i18n/index.js";
|
|
12
|
+
import { autoLayerText, permissionModeLabel } from "../../permissions/modes.js";
|
|
12
13
|
import { Card, KeyValue, Meter, } from "../../tui.js";
|
|
13
14
|
import { cacheRows, externalRows, formatTokenCount, formatUsd, taskStatsText, } from "../session-report.js";
|
|
14
15
|
import { tildePath } from "../../cli/startup-screen.js";
|
|
@@ -49,9 +50,13 @@ export function keyValue(rows, theme, wrap = false) {
|
|
|
49
50
|
return new KeyValue(rows, { theme, maxKeyRatio: 0.3, ...(wrap ? { wrap: true } : {}) });
|
|
50
51
|
}
|
|
51
52
|
function cacheSection(session, theme, now) {
|
|
52
|
-
return [
|
|
53
|
+
return [
|
|
54
|
+
theme.bold(msg().panels.cache.title),
|
|
55
|
+
new Indent(keyValue(cacheRows(session, now), theme), 2),
|
|
56
|
+
];
|
|
53
57
|
}
|
|
54
58
|
export function sessionPanel(session, theme, options = {}) {
|
|
59
|
+
const m = msg().panels.session;
|
|
55
60
|
const now = options.now ?? Date.now();
|
|
56
61
|
const state = session.state;
|
|
57
62
|
const stats = session.getStats();
|
|
@@ -67,41 +72,41 @@ export function sessionPanel(session, theme, options = {}) {
|
|
|
67
72
|
`${stats.contextWindow === undefined ? "?" : formatTokenCount(stats.contextWindow)}`;
|
|
68
73
|
const rows = [
|
|
69
74
|
{
|
|
70
|
-
key:
|
|
75
|
+
key: m.model,
|
|
71
76
|
value: theme.fg("accent", model) +
|
|
72
77
|
sep +
|
|
73
|
-
|
|
78
|
+
m.thinking(state.thinkingLevel) +
|
|
74
79
|
sep +
|
|
75
|
-
|
|
80
|
+
m.permission(permissionModeLabel(state.permissionMode)),
|
|
76
81
|
},
|
|
77
82
|
{
|
|
78
|
-
key:
|
|
83
|
+
key: m.messages,
|
|
79
84
|
value: [
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
m.user(stats.userMessages),
|
|
86
|
+
m.assistant(stats.assistantMessages),
|
|
87
|
+
m.toolCalls(stats.toolCalls),
|
|
83
88
|
].join(sep),
|
|
84
89
|
},
|
|
85
90
|
{
|
|
86
|
-
key:
|
|
91
|
+
key: m.usage,
|
|
87
92
|
value: [
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
93
|
+
m.input(formatTokenCount(t.input)),
|
|
94
|
+
m.output(formatTokenCount(t.output)),
|
|
95
|
+
m.cacheRead(formatTokenCount(t.cacheRead)),
|
|
96
|
+
m.cacheWrite(formatTokenCount(t.cacheWrite)),
|
|
92
97
|
formatUsd(stats.cost),
|
|
93
98
|
].join(sep),
|
|
94
99
|
},
|
|
95
|
-
{ key:
|
|
100
|
+
{ key: m.context, value: meter + window },
|
|
96
101
|
];
|
|
97
102
|
const tasks = taskStatsText(session);
|
|
98
103
|
if (tasks !== undefined)
|
|
99
|
-
rows.push({ key:
|
|
104
|
+
rows.push({ key: m.subagents, value: tasks });
|
|
100
105
|
const external = externalRows(session);
|
|
101
106
|
const externalSection = external.length > 0
|
|
102
|
-
? ["", theme.bold(
|
|
107
|
+
? ["", theme.bold(m.external), new Indent(keyValue(external, theme), 2)]
|
|
103
108
|
: [];
|
|
104
|
-
const file = state.sessionFile === undefined ?
|
|
109
|
+
const file = state.sessionFile === undefined ? m.notSaved : tildePath(state.sessionFile, options.home);
|
|
105
110
|
const parts = [
|
|
106
111
|
keyValue(rows, theme),
|
|
107
112
|
"",
|
|
@@ -110,12 +115,15 @@ export function sessionPanel(session, theme, options = {}) {
|
|
|
110
115
|
];
|
|
111
116
|
return new Card(new Stack(parts), {
|
|
112
117
|
theme,
|
|
113
|
-
title:
|
|
118
|
+
title: m.title(state.sessionId.slice(0, 8)),
|
|
114
119
|
subtitle: file,
|
|
115
120
|
});
|
|
116
121
|
}
|
|
117
122
|
export function cachePanel(session, theme, now = Date.now()) {
|
|
118
|
-
return new Card(keyValue(cacheRows(session, now), theme), {
|
|
123
|
+
return new Card(keyValue(cacheRows(session, now), theme), {
|
|
124
|
+
theme,
|
|
125
|
+
title: msg().panels.cache.title,
|
|
126
|
+
});
|
|
119
127
|
}
|
|
120
128
|
const DECISION_COLOR = {
|
|
121
129
|
allow: "success",
|
|
@@ -123,20 +131,20 @@ const DECISION_COLOR = {
|
|
|
123
131
|
ask: "warning",
|
|
124
132
|
};
|
|
125
133
|
export function permissionsPanel(runtime, session, theme) {
|
|
134
|
+
const m = msg().panels.permissions;
|
|
126
135
|
const rules = runtime.permission.rules;
|
|
127
136
|
const mode = session.state.permissionMode;
|
|
128
|
-
const order = mode === "auto"
|
|
129
|
-
? "deny 规则 → Hook deny → 危险命令确认 → 规则层(受保护路径、项目外写入、网络、删除类)→ Hook ask → allow 规则 / Hook allow / 本会话记忆 → 静态判定(只读、项目内写入、安全名单)→ 模型分类器 → 询问"
|
|
130
|
-
: mode === "allowlist"
|
|
131
|
-
? "deny 规则 → Hook deny → 危险命令(拒绝)→ 只读工具 / allow 规则 / Hook allow 放行 → 其余拒绝(从不询问)"
|
|
132
|
-
: "deny 规则 → Hook deny → 危险命令确认 → 权限模式 → allow 规则 / Hook allow / 本会话记忆 → 询问";
|
|
137
|
+
const order = mode === "auto" ? m.orderAuto : mode === "allowlist" ? m.orderAllowlist : m.orderDefault;
|
|
133
138
|
const effect = (decision) => theme.fg(DECISION_COLOR[decision] ?? "text", decision.padEnd(5));
|
|
134
139
|
const parts = [
|
|
135
140
|
keyValue([
|
|
136
|
-
{
|
|
137
|
-
|
|
141
|
+
{
|
|
142
|
+
key: m.mode,
|
|
143
|
+
value: m.modeValue(permissionModeLabel(mode), mode, (t) => theme.fg("dim", t)),
|
|
144
|
+
},
|
|
145
|
+
{ key: m.order, value: order },
|
|
138
146
|
], theme, true),
|
|
139
|
-
theme.bold(rules.length === 0 ?
|
|
147
|
+
theme.bold(rules.length === 0 ? m.rulesNone : m.rules(rules.length)),
|
|
140
148
|
];
|
|
141
149
|
if (rules.length > 0) {
|
|
142
150
|
parts.push(new Indent(keyValue(rules.map((r) => ({
|
|
@@ -146,11 +154,11 @@ export function permissionsPanel(runtime, session, theme) {
|
|
|
146
154
|
}
|
|
147
155
|
const recent = runtime.permission.autoDecisions?.() ?? [];
|
|
148
156
|
if (recent.length > 0) {
|
|
149
|
-
parts.push(theme.bold(
|
|
157
|
+
parts.push(theme.bold(m.recentAuto(recent.length)));
|
|
150
158
|
parts.push(new Indent(keyValue(recent.map((d) => ({
|
|
151
|
-
key:
|
|
159
|
+
key: autoLayerText(d.layer),
|
|
152
160
|
value: `${effect(d.decision)} ${d.toolName} ${d.summary} — ${d.reason}` +
|
|
153
|
-
(d.cached === true ? theme.fg("dim",
|
|
161
|
+
(d.cached === true ? theme.fg("dim", m.cached) : ""),
|
|
154
162
|
})), theme), 2));
|
|
155
163
|
}
|
|
156
164
|
return new Card(new Stack(parts), { theme });
|
|
@@ -39,7 +39,8 @@ export interface PickerSpec {
|
|
|
39
39
|
/** 框内上下留白行数。 */
|
|
40
40
|
paddingY?: number;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
/** 列表下的缺省按键提示(`arrows` 缺省 `↑↓`)。 */
|
|
43
|
+
export declare function pickerFooter(arrows?: string): string;
|
|
43
44
|
/** 打开一个居中选择器;Enter 返回选中项,Esc / Ctrl+C 返回 undefined。 */
|
|
44
45
|
export declare function openPicker(host: PickerHost, spec: PickerSpec): Promise<SelectItem | undefined>;
|
|
45
46
|
/**
|