@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
|
@@ -25,42 +25,32 @@ import { AgentSessionImpl } from "../../agent/session.js";
|
|
|
25
25
|
import { taskRegistryView } from "../../agent/subagent-registry.js";
|
|
26
26
|
import { currentSession, switchSession } from "../../cli/compose-session.js";
|
|
27
27
|
import { startupInfo, startupScreenLevel, tildePath } from "../../cli/startup-screen.js";
|
|
28
|
-
import { KEYBINDINGS_FILE } from "../../config/paths.js";
|
|
29
28
|
import { AmaError, isAmaError } from "../../errors.js";
|
|
30
|
-
import {
|
|
29
|
+
import { msg } from "../../i18n/index.js";
|
|
30
|
+
import { Container, Editor, Loader, Spacer, TUI, Text, createTheme, detectCapabilities, resolveAscii, resolveThemeName, } from "../../tui.js";
|
|
31
31
|
import { BYPASS_MODE, createBypassGate } from "../../permissions/bypass.js";
|
|
32
32
|
import { onTerminationSignals } from "../shared.js";
|
|
33
|
-
import { AgentUi } from "./agent-ui.js";
|
|
33
|
+
import { AgentUi, agentCommandHooks } from "./agent-ui.js";
|
|
34
34
|
import { ApprovalDialogBroker, approvalOutcomeText } from "./approval-dialog.js";
|
|
35
35
|
import { mergingBroker } from "./approval-merge.js";
|
|
36
36
|
import { ALL_COMMANDS, runInteractiveCommand } from "./commands.js";
|
|
37
|
+
import { memoryPanelFor } from "./memory-panel.js";
|
|
37
38
|
import { InteractiveCompletion } from "./completion.js";
|
|
38
39
|
import { confirmBypass } from "./confirm-dialog.js";
|
|
40
|
+
import { configUiFor } from "./config-ui.js";
|
|
39
41
|
import { createKeyDispatch } from "./key-dispatch.js";
|
|
40
42
|
import { MessageView, exitSummaryLines } from "./message-view.js";
|
|
41
43
|
import { openPicker } from "./pickers.js";
|
|
42
44
|
import { createRewindFlow } from "./rewind-flow.js";
|
|
45
|
+
import { openTraceView } from "./trace-view.js";
|
|
43
46
|
import { StartupHeader } from "./startup-header.js";
|
|
44
47
|
import { QueueView, RunIndicator } from "./run-indicator.js";
|
|
45
48
|
import { StatusArea, statusLineSlash } from "./status-area.js";
|
|
46
49
|
import { createSessionEventHandler } from "./session-events.js";
|
|
47
50
|
import { SubagentTracker } from "./subagent-view.js";
|
|
51
|
+
import { loadKeys, processTerminal } from "./terminal-setup.js";
|
|
48
52
|
import { ToolTracker } from "./tool-view.js";
|
|
49
53
|
const HINT_MS = 2500;
|
|
50
|
-
const EDITOR_PLACEHOLDER = "输入消息,/ 命令,@ 文件,Shift+Enter 换行";
|
|
51
|
-
function processTerminal() {
|
|
52
|
-
const stdin = process.stdin;
|
|
53
|
-
if (stdin.isTTY !== true || typeof stdin.setRawMode !== "function" || !process.stdout.isTTY) {
|
|
54
|
-
throw new AmaError("terminal_init_failed", "stdin / stdout 不是终端");
|
|
55
|
-
}
|
|
56
|
-
return new ProcessTerminal();
|
|
57
|
-
}
|
|
58
|
-
function loadKeys(runtime, warn) {
|
|
59
|
-
const parsed = loadKeybindingsFile(join(runtime.paths.configDir, KEYBINDINGS_FILE));
|
|
60
|
-
for (const w of parsed.warnings)
|
|
61
|
-
warn(`keybindings.json:${w}`);
|
|
62
|
-
return new Keybindings(parsed.overrides);
|
|
63
|
-
}
|
|
64
54
|
export function runInteractiveMode(runtime, context, options = {}) {
|
|
65
55
|
const terminal = options.terminal ?? processTerminal();
|
|
66
56
|
const ui = runtime.config.ui ?? {};
|
|
@@ -95,7 +85,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
|
|
|
95
85
|
const loaderSlot = new Container();
|
|
96
86
|
const loader = new Loader(() => tui.requestRender(), {
|
|
97
87
|
theme,
|
|
98
|
-
message:
|
|
88
|
+
message: msg().interactive.view.run.thinking,
|
|
99
89
|
now,
|
|
100
90
|
...(ui.animation === false ? { animation: false } : {}),
|
|
101
91
|
...(options.spinnerIntervalMs !== undefined ? { intervalMs: options.spinnerIntervalMs } : {}),
|
|
@@ -126,7 +116,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
|
|
|
126
116
|
theme,
|
|
127
117
|
keybindings: keys,
|
|
128
118
|
maxVisibleLines: 8,
|
|
129
|
-
placeholder:
|
|
119
|
+
placeholder: msg().interactive.app.placeholder,
|
|
130
120
|
autocomplete: completion,
|
|
131
121
|
requestRender: () => tui.requestRender(),
|
|
132
122
|
...(historyFile !== undefined ? { historyFile } : {}),
|
|
@@ -196,7 +186,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
|
|
|
196
186
|
const replay = () => {
|
|
197
187
|
view.replay(session.messages, {
|
|
198
188
|
tool: (call, result) => tools.completed(call.id, call.name, call.arguments, result === undefined
|
|
199
|
-
? { content:
|
|
189
|
+
? { content: msg().interactive.app.noResult, isError: true }
|
|
200
190
|
: {
|
|
201
191
|
content: result.content,
|
|
202
192
|
isError: result.isError,
|
|
@@ -285,6 +275,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
|
|
|
285
275
|
setDraft,
|
|
286
276
|
editorEmpty: () => editor.isEmpty(),
|
|
287
277
|
});
|
|
278
|
+
const configUi = configUiFor(pickerHost, { runtime, context, view, loader, area, tui, notice });
|
|
288
279
|
const commandUi = {
|
|
289
280
|
runtime,
|
|
290
281
|
session: () => session,
|
|
@@ -314,6 +305,10 @@ export function runInteractiveMode(runtime, context, options = {}) {
|
|
|
314
305
|
exit: (code) => exit(code),
|
|
315
306
|
now,
|
|
316
307
|
extra: (name, args) => agentUi.command(name, args),
|
|
308
|
+
...agentCommandHooks(() => agentUi),
|
|
309
|
+
configPanel: (args) => configUi.open(args),
|
|
310
|
+
traceView: (id) => openTraceView({ ...pickerHost, session: () => session, now, notice, render }, id),
|
|
311
|
+
memoryPanel: memoryPanelFor(() => commandUi, pickerHost, tui, env), // [W6-M]
|
|
317
312
|
};
|
|
318
313
|
const runCommand = (line) => (statusLineSlash(area, line, notice)
|
|
319
314
|
? Promise.resolve(true)
|
|
@@ -360,6 +355,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
|
|
|
360
355
|
runCommand: (line) => void runCommand(line),
|
|
361
356
|
exit: (code) => exit(code),
|
|
362
357
|
onInterrupted: (empty) => void rewind.afterInterrupt(empty),
|
|
358
|
+
agents: () => agentUi.keys,
|
|
363
359
|
}));
|
|
364
360
|
// ---- 晚绑定 ---------------------------------------------------------------
|
|
365
361
|
const overlayHooks = {
|
|
@@ -395,6 +391,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
|
|
|
395
391
|
dialog: { theme, keybindings: keys, ...overlayHooks },
|
|
396
392
|
displayPath: (path) => tildePath(path, home),
|
|
397
393
|
...(options.clipboard !== undefined ? { clipboard: options.clipboard } : {}),
|
|
394
|
+
area,
|
|
398
395
|
});
|
|
399
396
|
const taskAgent = (taskId) => taskRegistryView(session.state.sessionId)?.get(taskId)?.agent;
|
|
400
397
|
const broker = mergingBroker(new ApprovalDialogBroker({
|
|
@@ -411,7 +408,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
|
|
|
411
408
|
notice(outcome === "deny" ? "info" : "warn", text);
|
|
412
409
|
}
|
|
413
410
|
},
|
|
414
|
-
}), agentUi.merge, (request) => notice("info",
|
|
411
|
+
}), agentUi.merge, (request) => notice("info", msg().interactive.app.followed(approvalOutcomeText(request, "allow", taskAgent))));
|
|
415
412
|
// ---- 启动与退出 -----------------------------------------------------------
|
|
416
413
|
let offSignals = () => undefined;
|
|
417
414
|
function exit(code) {
|
|
@@ -453,7 +450,7 @@ export function runInteractiveMode(runtime, context, options = {}) {
|
|
|
453
450
|
}
|
|
454
451
|
catch (error) {
|
|
455
452
|
unsubscribe();
|
|
456
|
-
reject(new AmaError("terminal_init_failed",
|
|
453
|
+
reject(new AmaError("terminal_init_failed", msg().interactive.app.terminalInitFailed(error instanceof Error ? error.message : String(error)), { cause: error }));
|
|
457
454
|
return;
|
|
458
455
|
}
|
|
459
456
|
runtime.approvals.setUiBroker(broker);
|
|
@@ -9,12 +9,22 @@
|
|
|
9
9
|
*
|
|
10
10
|
* [RW-C] 空闲时双击 Esc(`app.rewind`,double-esc.ts):输入框为空打开回滚列表,有字则清空并存进
|
|
11
11
|
* 输入历史;运行中 Esc 仍为中断,中断后交给 `onInterrupted`(中断即撤回)。
|
|
12
|
+
*
|
|
13
|
+
* [W6-A] Agent 栏(agent-ui.ts):栏聚焦时它先收键(Esc 是「返回」,不中断、不回滚);输入为空、补全没开时
|
|
14
|
+
* `app.agents.focus`(缺省 `Ctrl+B` / `↓`)先问它要不要进栏,不要就照常交给编辑器(光标左移、历史下一条)。
|
|
12
15
|
*/
|
|
13
16
|
import type { AgentSession } from "../../agent/types.js";
|
|
14
17
|
import type { PermissionMode } from "../../permissions/types.js";
|
|
15
18
|
import type { Editor, Keybindings } from "../../tui.js";
|
|
16
19
|
import type { StatusBar } from "./status-bar.js";
|
|
17
20
|
import type { ToolTracker } from "./tool-view.js";
|
|
21
|
+
/** [W6-A] Agent 栏的按键入口。 */
|
|
22
|
+
export interface AgentKeys {
|
|
23
|
+
/** 栏聚焦时先消费按键;返回 true 已处理。 */
|
|
24
|
+
handleKey(data: string): boolean;
|
|
25
|
+
/** `app.agents.focus`(输入为空):进栏返回 true,否则交给编辑器。 */
|
|
26
|
+
focus(data: string): boolean;
|
|
27
|
+
}
|
|
18
28
|
export interface KeyDispatchDeps {
|
|
19
29
|
keys: Keybindings;
|
|
20
30
|
editor: Editor;
|
|
@@ -46,6 +56,8 @@ export interface KeyDispatchDeps {
|
|
|
46
56
|
onInterrupted?(editorWasEmpty: boolean): void;
|
|
47
57
|
/** 双击 Esc 的间隔(测试注入)。 */
|
|
48
58
|
doubleEscMs?: number;
|
|
59
|
+
/** [W6-A] Agent 栏(晚绑定)。 */
|
|
60
|
+
agents?(): AgentKeys | undefined;
|
|
49
61
|
}
|
|
50
62
|
/** 返回输入监听器:已处理返回 true,交给编辑器返回 false。 */
|
|
51
63
|
export declare function createKeyDispatch(deps: KeyDispatchDeps): (data: string) => boolean;
|
|
@@ -9,7 +9,11 @@
|
|
|
9
9
|
*
|
|
10
10
|
* [RW-C] 空闲时双击 Esc(`app.rewind`,double-esc.ts):输入框为空打开回滚列表,有字则清空并存进
|
|
11
11
|
* 输入历史;运行中 Esc 仍为中断,中断后交给 `onInterrupted`(中断即撤回)。
|
|
12
|
+
*
|
|
13
|
+
* [W6-A] Agent 栏(agent-ui.ts):栏聚焦时它先收键(Esc 是「返回」,不中断、不回滚);输入为空、补全没开时
|
|
14
|
+
* `app.agents.focus`(缺省 `Ctrl+B` / `↓`)先问它要不要进栏,不要就照常交给编辑器(光标左移、历史下一条)。
|
|
12
15
|
*/
|
|
16
|
+
import { msg } from "../../i18n/index.js";
|
|
13
17
|
import { ExitCode } from "../../cli/exit-codes.js";
|
|
14
18
|
import { nextCycleMode, permissionModeLabel } from "../../permissions/modes.js";
|
|
15
19
|
import { DOUBLE_ESC_HINT_MS, DoubleEscape } from "./double-esc.js";
|
|
@@ -23,10 +27,10 @@ export function createKeyDispatch(deps) {
|
|
|
23
27
|
const doubleEscape = () => {
|
|
24
28
|
switch (esc.press(deps.now(), editor.isEmpty())) {
|
|
25
29
|
case "arm-rewind":
|
|
26
|
-
deps.showHint(
|
|
30
|
+
deps.showHint(msg().interactive.keys.escRewind, DOUBLE_ESC_HINT_MS);
|
|
27
31
|
return;
|
|
28
32
|
case "arm-clear":
|
|
29
|
-
deps.showHint(
|
|
33
|
+
deps.showHint(msg().interactive.keys.escClear, DOUBLE_ESC_HINT_MS);
|
|
30
34
|
return;
|
|
31
35
|
case "rewind":
|
|
32
36
|
deps.showHint("");
|
|
@@ -38,7 +42,7 @@ export function createKeyDispatch(deps) {
|
|
|
38
42
|
if (text.trim() !== "")
|
|
39
43
|
editor.addToHistory(text);
|
|
40
44
|
editor.clear();
|
|
41
|
-
deps.showHint(
|
|
45
|
+
deps.showHint(msg().interactive.keys.cleared);
|
|
42
46
|
return;
|
|
43
47
|
}
|
|
44
48
|
}
|
|
@@ -71,8 +75,8 @@ export function createKeyDispatch(deps) {
|
|
|
71
75
|
const applyMode = (mode, skipped) => {
|
|
72
76
|
deps.session().setPermissionMode(mode);
|
|
73
77
|
status.refresh();
|
|
74
|
-
const label =
|
|
75
|
-
deps.showHint(skipped ?
|
|
78
|
+
const label = msg().interactive.commands.modeSet(permissionModeLabel(mode));
|
|
79
|
+
deps.showHint(skipped ? msg().interactive.keys.bypassSkipped(label) : label);
|
|
76
80
|
};
|
|
77
81
|
const cyclePermission = () => {
|
|
78
82
|
const next = nextCycleMode(deps.session().state.permissionMode);
|
|
@@ -90,18 +94,29 @@ export function createKeyDispatch(deps) {
|
|
|
90
94
|
const is = (action) => keys.matches(data, action);
|
|
91
95
|
if (!is("app.rewind"))
|
|
92
96
|
esc.reset();
|
|
97
|
+
const agents = deps.agents?.();
|
|
98
|
+
if (agents?.handleKey(data) === true) {
|
|
99
|
+
esc.reset();
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
if (agents !== undefined &&
|
|
103
|
+
is("app.agents.focus") &&
|
|
104
|
+
editor.isEmpty() &&
|
|
105
|
+
!editor.isCompletionOpen &&
|
|
106
|
+
agents.focus(data))
|
|
107
|
+
return true;
|
|
93
108
|
if (is("app.clear")) {
|
|
94
109
|
if (!editor.isEmpty()) {
|
|
95
110
|
editor.clear();
|
|
96
111
|
ctrlCArmedAt = deps.now();
|
|
97
|
-
deps.showHint(
|
|
112
|
+
deps.showHint(msg().interactive.keys.clearedCtrlC);
|
|
98
113
|
}
|
|
99
114
|
else if (deps.now() - ctrlCArmedAt < DOUBLE_CTRL_C_MS) {
|
|
100
115
|
deps.exit(ExitCode.Sigint);
|
|
101
116
|
}
|
|
102
117
|
else {
|
|
103
118
|
ctrlCArmedAt = deps.now();
|
|
104
|
-
deps.showHint(
|
|
119
|
+
deps.showHint(msg().interactive.keys.ctrlCAgain);
|
|
105
120
|
}
|
|
106
121
|
return true;
|
|
107
122
|
}
|
|
@@ -109,7 +124,7 @@ export function createKeyDispatch(deps) {
|
|
|
109
124
|
if (is("app.interrupt") && !editor.isCompletionOpen && deps.busy()) {
|
|
110
125
|
esc.reset();
|
|
111
126
|
interrupt();
|
|
112
|
-
deps.showHint(
|
|
127
|
+
deps.showHint(msg().interactive.keys.interrupted);
|
|
113
128
|
deps.onInterrupted?.(editor.isEmpty());
|
|
114
129
|
return true;
|
|
115
130
|
}
|
|
@@ -140,7 +155,7 @@ export function createKeyDispatch(deps) {
|
|
|
140
155
|
if (is("app.tools.expand")) {
|
|
141
156
|
const expanded = tools.toggleExpanded();
|
|
142
157
|
deps.onExpandToggle?.(expanded);
|
|
143
|
-
deps.showHint(expanded ?
|
|
158
|
+
deps.showHint(expanded ? msg().interactive.keys.toolsExpanded : msg().interactive.keys.toolsCollapsed);
|
|
144
159
|
return true;
|
|
145
160
|
}
|
|
146
161
|
if (is("app.model.select")) {
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* 空行 Ctrl+D 结束。括号粘贴:单行原样插入,多行折叠成 `[粘贴 #n +k 行]` 标记,提交时展开。
|
|
7
7
|
* `ask()`:审批等单键问答,下一个可见字符(或 Enter = 缺省答案)作答。
|
|
8
8
|
*/
|
|
9
|
+
import { msg } from "../../../i18n/index.js";
|
|
9
10
|
import { visibleWidth } from "../../../tui/ansi.js";
|
|
10
11
|
import { PasteState } from "./paste-state.js";
|
|
11
12
|
const KEYS = {
|
|
@@ -205,7 +206,7 @@ export class LineEditor {
|
|
|
205
206
|
this.insert(text);
|
|
206
207
|
}
|
|
207
208
|
else {
|
|
208
|
-
const marker =
|
|
209
|
+
const marker = msg().interactive.line.pasteMarker(this.pastes.size + 1, lines);
|
|
209
210
|
this.pastes.set(marker, text);
|
|
210
211
|
this.insert(marker);
|
|
211
212
|
}
|
|
@@ -11,16 +11,20 @@
|
|
|
11
11
|
* - 斜杠命令走 commands-core(与 B7 同一语义),`pick` 退化为列出候选;`/rewind` 列编号、
|
|
12
12
|
* `/rewind <n> …` 执行,回到的单行原消息放回编辑行。
|
|
13
13
|
*/
|
|
14
|
+
import { msg } from "../../../i18n/index.js";
|
|
14
15
|
import { promptImages, sessionModel } from "../../image-input.js";
|
|
15
16
|
import { taskRegistryView } from "../../../agent/subagent-registry.js";
|
|
16
17
|
import { currentSession, switchSession } from "../../../cli/compose-session.js";
|
|
17
18
|
import { ExitCode } from "../../../cli/exit-codes.js";
|
|
18
|
-
import {
|
|
19
|
+
import { BYPASS_MODE, bypassLineQuestion, bypassRiskLines, createBypassGate, } from "../../../permissions/bypass.js";
|
|
19
20
|
import { previewDisplayLines } from "../../../permissions/preview.js";
|
|
20
21
|
import { AMA_VERSION } from "../../../version.js";
|
|
21
22
|
import { runSlashCommand } from "../../commands-core.js";
|
|
23
|
+
import { configCommand } from "../config-ui.js";
|
|
24
|
+
import { lineTraceCommand } from "../../../trace/session.js";
|
|
22
25
|
import { createLineReader } from "../../rpc/jsonl.js";
|
|
23
26
|
import { errorText, onTerminationSignals } from "../../shared.js";
|
|
27
|
+
import { memoryLineCommand } from "../memory-panel.js";
|
|
24
28
|
import { LineEditor } from "./line-editor.js";
|
|
25
29
|
import { cacheNoticesEnabled } from "../../session-report.js";
|
|
26
30
|
import { EventPrinter, approvalQuestion, logsInfo, pickHint } from "./line-render.js";
|
|
@@ -46,6 +50,11 @@ export async function runLineMode(runtime, context, options = {}) {
|
|
|
46
50
|
let unsubscribe = session.subscribe((event) => printer.handle(event));
|
|
47
51
|
const commands = {
|
|
48
52
|
runtime,
|
|
53
|
+
extra: {
|
|
54
|
+
config: configCommand(runtime, context),
|
|
55
|
+
trace: lineTraceCommand,
|
|
56
|
+
memory: memoryLineCommand, // [W6-M]
|
|
57
|
+
},
|
|
49
58
|
session: () => session,
|
|
50
59
|
async switchSession(request) {
|
|
51
60
|
const next = await switchSession(runtime, request);
|
|
@@ -106,13 +115,15 @@ export async function runLineMode(runtime, context, options = {}) {
|
|
|
106
115
|
const ed = editor;
|
|
107
116
|
if (runtime.config.ui?.quietStartup !== "silent") {
|
|
108
117
|
const model = session.state.model;
|
|
109
|
-
io.stdout(
|
|
118
|
+
io.stdout(`${msg().interactive.line.banner(AMA_VERSION, `${model?.provider}/${model?.id}`)}\n`);
|
|
110
119
|
}
|
|
111
120
|
// /permission full-auto:进入 Bypass 前文本确认一次(管道里没有这一步,命令本身就是显式选择)
|
|
112
121
|
commands.confirmPermissionMode = createBypassGate(() => {
|
|
113
122
|
ed.hide();
|
|
114
|
-
io.stdout(`\n${
|
|
115
|
-
|
|
123
|
+
io.stdout(`\n${bypassRiskLines()
|
|
124
|
+
.map((l) => ` ${l}\n`)
|
|
125
|
+
.join("")}`);
|
|
126
|
+
return ed.ask(bypassLineQuestion(), "n").then((answer) => answer === "y");
|
|
116
127
|
}, session.state.permissionMode === BYPASS_MODE);
|
|
117
128
|
runtime.approvals.setUiBroker({
|
|
118
129
|
ask: (request, signal) => new Promise((resolve) => {
|
|
@@ -170,14 +181,14 @@ export async function runLineMode(runtime, context, options = {}) {
|
|
|
170
181
|
if (action.kind === "interrupt") {
|
|
171
182
|
if (busy) {
|
|
172
183
|
void session.abort();
|
|
173
|
-
err(
|
|
184
|
+
err(`${msg().interactive.line.interrupted}\n`);
|
|
174
185
|
}
|
|
175
186
|
else if (Date.now() - lastInterrupt < DOUBLE_INTERRUPT_MS) {
|
|
176
187
|
return finish(ExitCode.Sigint);
|
|
177
188
|
}
|
|
178
189
|
else {
|
|
179
190
|
lastInterrupt = Date.now();
|
|
180
|
-
io.stdout(
|
|
191
|
+
io.stdout(`\n${msg().interactive.line.ctrlCAgain}\n`);
|
|
181
192
|
ed.render();
|
|
182
193
|
}
|
|
183
194
|
continue;
|
|
@@ -185,7 +196,7 @@ export async function runLineMode(runtime, context, options = {}) {
|
|
|
185
196
|
if (busy) {
|
|
186
197
|
if (action.text.trim() !== "") {
|
|
187
198
|
void session.steer(action.text).catch(() => undefined);
|
|
188
|
-
out(
|
|
199
|
+
out(`${msg().interactive.line.steer(action.text)}\n`);
|
|
189
200
|
}
|
|
190
201
|
continue;
|
|
191
202
|
}
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* 行式界面的输出:会话事件 → 纯文本(助手文本流式写 stdout,工具 / 重试 / 压缩一行提示)。[B6]
|
|
3
3
|
* 选择器在行式界面里退化为列出候选、提示带参数重发。
|
|
4
4
|
*/
|
|
5
|
+
import { msg } from "../../../i18n/index.js";
|
|
5
6
|
import { THINKING_LEVELS } from "../../../ai/thinking.js";
|
|
6
7
|
import { listSessions } from "../../../cli/compose-store.js";
|
|
7
|
-
import {
|
|
8
|
+
import { autoLayerText, permissionModeLines } from "../../../permissions/modes.js";
|
|
8
9
|
import { cacheEventNotice, warmSentNotice } from "../../session-report.js";
|
|
9
10
|
import { isFirstRunRequest, sourceLabel } from "../approval-dialog.js";
|
|
10
11
|
import { LIMIT_WARNING, backgroundJobText, limitReachedText, modelFallbackText, } from "../event-notices.js";
|
|
@@ -25,27 +26,27 @@ export function argsSummary(args) {
|
|
|
25
26
|
return "";
|
|
26
27
|
}
|
|
27
28
|
export function approvalQuestion(request, taskAgent) {
|
|
29
|
+
const m = msg().interactive.line;
|
|
28
30
|
const label = sourceLabel(request, taskAgent);
|
|
29
31
|
const task = label === undefined ? "" : `${label} `;
|
|
30
32
|
const origin = request.context?.origin;
|
|
31
33
|
if (origin !== undefined) {
|
|
32
|
-
|
|
33
|
-
return `${task}允许 ${origin.toolCall.title}${where !== undefined ? ` ${where}` : ""}?[y 允许 / a 本会话都允许 / N 拒绝] `;
|
|
34
|
+
return m.approvalOrigin(task, origin.toolCall.title, origin.toolCall.locations?.[0]);
|
|
34
35
|
}
|
|
35
36
|
if (isFirstRunRequest(request)) {
|
|
36
37
|
const input = request.input;
|
|
37
|
-
return
|
|
38
|
+
return m.approvalFirstRun(task, String(input["note"]));
|
|
38
39
|
}
|
|
39
40
|
const summary = argsSummary(request.input);
|
|
40
41
|
const auto = request.autoDecision;
|
|
41
42
|
const why = request.reason === "dangerous"
|
|
42
|
-
? "
|
|
43
|
+
? { kind: "dangerous" }
|
|
43
44
|
: request.hookReason !== undefined
|
|
44
|
-
?
|
|
45
|
+
? { kind: "hook", reason: request.hookReason }
|
|
45
46
|
: auto !== undefined
|
|
46
|
-
?
|
|
47
|
-
:
|
|
48
|
-
return
|
|
47
|
+
? { kind: "auto", layer: autoLayerText(auto.layer), reason: auto.reason }
|
|
48
|
+
: undefined;
|
|
49
|
+
return m.approvalTool(task, request.toolName, summary, why);
|
|
49
50
|
}
|
|
50
51
|
/** `AMA_LOG=info|debug`。 */
|
|
51
52
|
export function logsInfo(env) {
|
|
@@ -92,7 +93,8 @@ export class EventPrinter {
|
|
|
92
93
|
if (event.message.role === "assistant") {
|
|
93
94
|
this.endLine();
|
|
94
95
|
if (event.message.stopReason === "error")
|
|
95
|
-
this.pendingError =
|
|
96
|
+
this.pendingError =
|
|
97
|
+
event.message.errorMessage ?? msg().interactive.view.message.modelError;
|
|
96
98
|
}
|
|
97
99
|
return;
|
|
98
100
|
case "agent_end":
|
|
@@ -114,14 +116,14 @@ export class EventPrinter {
|
|
|
114
116
|
}
|
|
115
117
|
return;
|
|
116
118
|
case "auto_retry_start":
|
|
117
|
-
this.line(
|
|
119
|
+
this.line(msg().interactive.line.retry(event.attempt, event.maxAttempts, Math.round(event.delayMs / 1000), event.errorMessage), true);
|
|
118
120
|
return;
|
|
119
121
|
case "compaction_start":
|
|
120
|
-
this.line(
|
|
122
|
+
this.line(msg().interactive.line.compacting, true);
|
|
121
123
|
return;
|
|
122
124
|
case "compaction_end":
|
|
123
125
|
if (event.error !== undefined)
|
|
124
|
-
this.line(
|
|
126
|
+
this.line(msg().interactive.events.compactionFailed(event.error), true);
|
|
125
127
|
return;
|
|
126
128
|
case "cache_miss":
|
|
127
129
|
case "context_pressure": {
|
|
@@ -142,7 +144,7 @@ export class EventPrinter {
|
|
|
142
144
|
this.pendingError = undefined;
|
|
143
145
|
if (error !== undefined) {
|
|
144
146
|
this.failures++;
|
|
145
|
-
this.line(
|
|
147
|
+
this.line(msg().interactive.line.error(error), true);
|
|
146
148
|
}
|
|
147
149
|
// 失败时 warning 就是同一条错误文本,不再重复打印;预算到限已由 limit_reached 说明
|
|
148
150
|
if (event.warning !== undefined &&
|
|
@@ -153,12 +155,11 @@ export class EventPrinter {
|
|
|
153
155
|
}
|
|
154
156
|
// [W5-U] 第五波事件
|
|
155
157
|
case "plan_proposed": {
|
|
156
|
-
|
|
157
|
-
this.line(`◇ 计划 v${event.version} 待审批${file}:/plan approve [模式|fresh] 批准 · /plan reject 放弃 · 直接输入修改意见`);
|
|
158
|
+
this.line(msg().interactive.line.planProposed(event.version, event.filePath));
|
|
158
159
|
return;
|
|
159
160
|
}
|
|
160
161
|
case "subagent_start":
|
|
161
|
-
this.line(
|
|
162
|
+
this.line(msg().interactive.line.subagentStart(event.taskId, event.agent, event.background === true));
|
|
162
163
|
return;
|
|
163
164
|
case "subagent_end":
|
|
164
165
|
this.line(` ↳ ${event.taskId} ${taskStatusText(event.status)}`);
|
|
@@ -189,14 +190,14 @@ export async function pickHint(what, runtime, session) {
|
|
|
189
190
|
for (const model of provider.models)
|
|
190
191
|
refs.push(` ${provider.id}/${model.id}`);
|
|
191
192
|
}
|
|
192
|
-
return [
|
|
193
|
+
return [msg().interactive.line.modelsHeading, ...refs.slice(0, 40)].join("\n");
|
|
193
194
|
}
|
|
194
195
|
case "session": {
|
|
195
196
|
const items = listSessions({ sessionDir: runtime.paths.sessionDir, cwd: session.state.cwd });
|
|
196
197
|
if (items.length === 0)
|
|
197
|
-
return
|
|
198
|
+
return msg().interactive.line.noSessions;
|
|
198
199
|
return [
|
|
199
|
-
|
|
200
|
+
msg().interactive.line.sessionsHeading,
|
|
200
201
|
...items
|
|
201
202
|
.slice(0, 15)
|
|
202
203
|
.map((i) => ` ${i.id.slice(0, 8)} ${i.modifiedAt.slice(0, 16).replace("T", " ")} ${(i.name ?? i.firstPrompt ?? "").replace(/\s+/g, " ").slice(0, 50)}`),
|
|
@@ -205,9 +206,9 @@ export async function pickHint(what, runtime, session) {
|
|
|
205
206
|
case "tree": {
|
|
206
207
|
const users = session.entries.filter((e) => e.type === "message" && e.message.role === "user");
|
|
207
208
|
if (users.length === 0)
|
|
208
|
-
return
|
|
209
|
+
return msg().interactive.line.noForkable;
|
|
209
210
|
return [
|
|
210
|
-
|
|
211
|
+
msg().interactive.line.forkHeading,
|
|
211
212
|
...users.slice(-15).map((e) => {
|
|
212
213
|
const message = e.type === "message" ? e.message : undefined;
|
|
213
214
|
const content = message?.role === "user" ? message.content : "";
|
|
@@ -220,10 +221,10 @@ export async function pickHint(what, runtime, session) {
|
|
|
220
221
|
}
|
|
221
222
|
case "permission":
|
|
222
223
|
return [
|
|
223
|
-
|
|
224
|
+
msg().interactive.line.modeHeading,
|
|
224
225
|
...permissionModeLines(session.state.permissionMode, runtime.config.permission?.mode ?? "default").map((line) => ` ${line}`),
|
|
225
226
|
].join("\n");
|
|
226
227
|
case "thinking":
|
|
227
|
-
return
|
|
228
|
+
return msg().interactive.line.thinking(THINKING_LEVELS.join(" | "), session.state.thinkingLevel);
|
|
228
229
|
}
|
|
229
230
|
}
|
|
@@ -0,0 +1,64 @@
|
|
|
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 { type EditText } from "../../memory/edit.js";
|
|
16
|
+
import type { MemoryRuntime } from "../../memory/runtime.js";
|
|
17
|
+
import { type Component, type Theme } from "../../tui.js";
|
|
18
|
+
import type { CommandContext, CommandResult } from "../commands-core.js";
|
|
19
|
+
import type { CommandUi } from "./commands.js";
|
|
20
|
+
import { type ChoiceHost } from "./confirm-dialog.js";
|
|
21
|
+
export type MemoryAction = {
|
|
22
|
+
kind: "list";
|
|
23
|
+
} | {
|
|
24
|
+
kind: "show";
|
|
25
|
+
name: string;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "edit";
|
|
28
|
+
target?: string;
|
|
29
|
+
} | {
|
|
30
|
+
kind: "rm";
|
|
31
|
+
name: string;
|
|
32
|
+
yes: boolean;
|
|
33
|
+
} | {
|
|
34
|
+
kind: "writes";
|
|
35
|
+
on: boolean;
|
|
36
|
+
} | {
|
|
37
|
+
kind: "reload";
|
|
38
|
+
} | {
|
|
39
|
+
kind: "usage";
|
|
40
|
+
};
|
|
41
|
+
export declare function parseMemoryArgs(args: string): MemoryAction;
|
|
42
|
+
/** 行式界面(`CommandContext.extra.memory`)。 */
|
|
43
|
+
export declare function memoryLineCommand(args: string, ctx: CommandContext): Promise<CommandResult>;
|
|
44
|
+
/** `/memory` 面板:每个作用域一段,条目一行(名字、说明、更新日期;> 90 天标灰)。 */
|
|
45
|
+
export declare function memoryListPanel(runtime: MemoryRuntime, theme: Theme, now: number): Component;
|
|
46
|
+
export interface MemoryPanelDeps {
|
|
47
|
+
ui(): CommandUi;
|
|
48
|
+
/** 删除前的确认框。 */
|
|
49
|
+
choice: ChoiceHost;
|
|
50
|
+
/** 编辑器期间挂起 / 恢复界面。 */
|
|
51
|
+
suspend(): void;
|
|
52
|
+
resume(): void;
|
|
53
|
+
env: Readonly<Record<string, string | undefined>>;
|
|
54
|
+
/** 测试注入:代替真实编辑器。 */
|
|
55
|
+
edit?: EditText;
|
|
56
|
+
}
|
|
57
|
+
/** 交互界面的 `CommandUi.memoryPanel`。 */
|
|
58
|
+
export declare function createMemoryPanel(deps: MemoryPanelDeps): (args: string) => Promise<void>;
|
|
59
|
+
/** interactive-mode.ts 的一行装配(编辑器期间停掉 TUI,回来整屏重画)。 */
|
|
60
|
+
export declare function memoryPanelFor(ui: () => CommandUi, choice: ChoiceHost, tui: {
|
|
61
|
+
stop(): void;
|
|
62
|
+
start(): void;
|
|
63
|
+
forceFullRedraw(): void;
|
|
64
|
+
}, env: Readonly<Record<string, string | undefined>>): (args: string) => Promise<void>;
|