@armadra/agent 0.5.1 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +203 -304
- package/CHANGELOG.zh-CN.md +462 -0
- package/README.md +408 -364
- package/README.zh-CN.md +705 -0
- package/dist/agent/session-plan.js +2 -2
- package/dist/agent/session-state.d.ts +3 -0
- package/dist/agent/session-state.js +20 -0
- package/dist/agent/session-subagent.d.ts +15 -1
- package/dist/agent/session-subagent.js +26 -3
- package/dist/agent/session-telemetry.d.ts +16 -2
- package/dist/agent/session-telemetry.js +29 -7
- package/dist/agent/session-tools.js +5 -2
- package/dist/agent/session-trace-writer.d.ts +27 -0
- package/dist/agent/session-trace-writer.js +253 -0
- package/dist/agent/session.d.ts +2 -0
- package/dist/agent/session.js +12 -0
- package/dist/agent/subagent-direct.d.ts +20 -0
- package/dist/agent/subagent-direct.js +76 -0
- package/dist/agent/subagent-registry.d.ts +8 -1
- package/dist/agent/subagent-registry.js +28 -1
- package/dist/agent/system-prompt.d.ts +3 -1
- package/dist/agent/system-prompt.js +3 -0
- package/dist/agent/tool-runner.d.ts +2 -1
- package/dist/agent/tool-runner.js +5 -4
- package/dist/agent/types-w6.d.ts +39 -0
- package/dist/agent/types-w6.js +4 -0
- package/dist/agent/types.d.ts +5 -2
- package/dist/agents/external.js +1 -1
- package/dist/agents/task-record.d.ts +74 -1
- package/dist/agents/task-record.js +100 -0
- package/dist/ai/apis/cache-params.js +2 -1
- package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
- package/dist/ai/apis/chatgpt-backend.js +224 -0
- package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
- package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
- package/dist/ai/apis/openai-responses-request.d.ts +2 -1
- package/dist/ai/apis/openai-responses-request.js +8 -2
- package/dist/ai/apis/openai-responses.d.ts +2 -0
- package/dist/ai/apis/openai-responses.js +51 -16
- package/dist/ai/overflow.d.ts +1 -1
- package/dist/ai/overflow.js +10 -7
- package/dist/ai/providers/auth.d.ts +15 -2
- package/dist/ai/providers/auth.js +69 -2
- package/dist/ai/providers/builtin.js +27 -0
- package/dist/ai/providers/catalog-data.js +1 -0
- package/dist/ai/providers/discovered-cache.d.ts +48 -0
- package/dist/ai/providers/discovered-cache.js +102 -0
- package/dist/ai/providers/enrich.js +2 -7
- package/dist/ai/providers/model-visibility.d.ts +33 -0
- package/dist/ai/providers/model-visibility.js +70 -0
- package/dist/ai/providers/models-dev-cache.js +15 -19
- package/dist/ai/providers/models-dev-snapshot.js +8 -7
- package/dist/ai/providers/models-dev.js +5 -15
- package/dist/ai/providers/registry.d.ts +2 -0
- package/dist/ai/providers/registry.js +6 -1
- package/dist/ai/providers/suggest.js +2 -16
- package/dist/ai/types.d.ts +27 -1
- package/dist/auth/chatgpt/backend-client.d.ts +26 -0
- package/dist/auth/chatgpt/backend-client.js +74 -0
- package/dist/auth/chatgpt/claims.d.ts +17 -0
- package/dist/auth/chatgpt/claims.js +46 -0
- package/dist/auth/chatgpt/cli.d.ts +35 -0
- package/dist/auth/chatgpt/cli.js +279 -0
- package/dist/auth/chatgpt/doctor.d.ts +17 -0
- package/dist/auth/chatgpt/doctor.js +36 -0
- package/dist/auth/chatgpt/host-id.d.ts +7 -0
- package/dist/auth/chatgpt/host-id.js +26 -0
- package/dist/auth/chatgpt/login.d.ts +30 -0
- package/dist/auth/chatgpt/login.js +130 -0
- package/dist/auth/chatgpt/presets.d.ts +66 -0
- package/dist/auth/chatgpt/presets.js +120 -0
- package/dist/auth/chatgpt/quota-text.d.ts +13 -0
- package/dist/auth/chatgpt/quota-text.js +36 -0
- package/dist/auth/oauth/browser.d.ts +12 -0
- package/dist/auth/oauth/browser.js +27 -0
- package/dist/auth/oauth/callback-server.d.ts +47 -0
- package/dist/auth/oauth/callback-server.js +147 -0
- package/dist/auth/oauth/flows.d.ts +62 -0
- package/dist/auth/oauth/flows.js +113 -0
- package/dist/auth/oauth/jwt.d.ts +24 -0
- package/dist/auth/oauth/jwt.js +81 -0
- package/dist/auth/oauth/live.d.ts +21 -0
- package/dist/auth/oauth/live.js +25 -0
- package/dist/auth/oauth/oidc.d.ts +26 -0
- package/dist/auth/oauth/oidc.js +72 -0
- package/dist/auth/oauth/pkce.d.ts +15 -0
- package/dist/auth/oauth/pkce.js +20 -0
- package/dist/auth/oauth/refresh.d.ts +35 -0
- package/dist/auth/oauth/refresh.js +129 -0
- package/dist/auth/oauth/token-client.d.ts +33 -0
- package/dist/auth/oauth/token-client.js +121 -0
- package/dist/auth/oauth/token-store.d.ts +23 -0
- package/dist/auth/oauth/token-store.js +125 -0
- package/dist/auth/testing/fake-oauth.d.ts +73 -0
- package/dist/auth/testing/fake-oauth.js +271 -0
- package/dist/auth/testing/refresh-child.d.ts +5 -0
- package/dist/auth/testing/refresh-child.js +16 -0
- package/dist/bundle/ama.cjs +26532 -11045
- package/dist/checkpoints/backend.js +6 -5
- package/dist/checkpoints/restore.js +3 -2
- package/dist/checkpoints/settings.js +2 -1
- package/dist/checkpoints/shadow-git.js +7 -6
- package/dist/checkpoints/shadow-restore.js +3 -2
- package/dist/checkpoints/tracker.js +4 -3
- package/dist/cli/args.d.ts +9 -2
- package/dist/cli/args.js +74 -27
- package/dist/cli/bootstrap.js +53 -31
- package/dist/cli/choice-prompt.js +8 -6
- package/dist/cli/codemode-notice.js +2 -2
- package/dist/cli/compose-agents.js +2 -1
- package/dist/cli/compose-extensions.js +2 -0
- package/dist/cli/compose-memory.d.ts +53 -0
- package/dist/cli/compose-memory.js +127 -0
- package/dist/cli/compose-providers.d.ts +6 -0
- package/dist/cli/compose-providers.js +38 -2
- package/dist/cli/compose-session.d.ts +5 -0
- package/dist/cli/compose-session.js +27 -13
- package/dist/cli/compose-store.d.ts +2 -0
- package/dist/cli/compose-store.js +9 -5
- package/dist/cli/compose.d.ts +2 -0
- package/dist/cli/compose.js +13 -5
- package/dist/cli/default-model.d.ts +0 -2
- package/dist/cli/default-model.js +5 -8
- package/dist/cli/deps.d.ts +5 -1
- package/dist/cli/exit-codes.d.ts +1 -1
- package/dist/cli/exit-codes.js +7 -16
- package/dist/cli/from-prompt.js +3 -2
- package/dist/cli/help-text.d.ts +2 -1
- package/dist/cli/help-text.js +5 -99
- package/dist/cli/main.d.ts +5 -0
- package/dist/cli/main.js +21 -2
- package/dist/cli/proxy.js +14 -9
- package/dist/cli/runtime.d.ts +5 -0
- package/dist/cli/startup-screen.js +20 -27
- package/dist/cli/startup-steps.js +6 -8
- package/dist/cli/subcommands/auth.d.ts +6 -3
- package/dist/cli/subcommands/auth.js +52 -22
- package/dist/cli/subcommands/config-set.d.ts +21 -0
- package/dist/cli/subcommands/config-set.js +145 -0
- package/dist/cli/subcommands/config.d.ts +2 -1
- package/dist/cli/subcommands/config.js +51 -37
- package/dist/cli/subcommands/doctor.d.ts +2 -1
- package/dist/cli/subcommands/doctor.js +97 -58
- package/dist/cli/subcommands/init.d.ts +1 -1
- package/dist/cli/subcommands/init.js +8 -7
- package/dist/cli/subcommands/memory.d.ts +18 -0
- package/dist/cli/subcommands/memory.js +189 -0
- package/dist/cli/subcommands/model-meta.js +11 -9
- package/dist/cli/subcommands/models-cache-probe.js +23 -20
- package/dist/cli/subcommands/models-discover.d.ts +4 -0
- package/dist/cli/subcommands/models-discover.js +60 -21
- package/dist/cli/subcommands/models-enable.d.ts +13 -0
- package/dist/cli/subcommands/models-enable.js +145 -0
- package/dist/cli/subcommands/models.d.ts +3 -1
- package/dist/cli/subcommands/models.js +39 -24
- package/dist/cli/subcommands/probe-runner.js +8 -7
- package/dist/cli/subcommands/providers-list.js +32 -21
- package/dist/cli/subcommands/providers-plan.js +24 -25
- package/dist/cli/subcommands/providers-probe.js +5 -6
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +45 -50
- package/dist/cli/subcommands/sessions-export.d.ts +1 -1
- package/dist/cli/subcommands/sessions-export.js +10 -9
- package/dist/cli/subcommands/sessions-search.d.ts +1 -1
- package/dist/cli/subcommands/sessions-search.js +11 -10
- package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
- package/dist/cli/subcommands/sessions-trace.js +156 -0
- package/dist/cli/subcommands/sessions.d.ts +4 -3
- package/dist/cli/subcommands/sessions.js +40 -37
- package/dist/cli/subcommands/stats.d.ts +1 -1
- package/dist/cli/subcommands/stats.js +49 -30
- package/dist/cli/system-prompt-arg.js +3 -2
- package/dist/codemode/capability.js +3 -2
- package/dist/compaction/post-compact.d.ts +1 -0
- package/dist/compaction/post-compact.js +15 -1
- package/dist/compaction/prune-tier.d.ts +1 -1
- package/dist/compaction/prune-tier.js +3 -3
- package/dist/compaction/serialize.js +2 -1
- package/dist/config/auth-file.d.ts +12 -2
- package/dist/config/auth-file.js +32 -10
- package/dist/config/checker.js +12 -11
- package/dist/config/context-files.js +3 -2
- package/dist/config/edit.d.ts +106 -0
- package/dist/config/edit.js +350 -0
- package/dist/config/init.d.ts +4 -3
- package/dist/config/init.js +10 -18
- package/dist/config/json-schema.d.ts +2 -1
- package/dist/config/json-schema.js +102 -69
- package/dist/config/key-docs.d.ts +18 -7
- package/dist/config/key-docs.js +43 -128
- package/dist/config/load.js +7 -6
- package/dist/config/merge.d.ts +4 -1
- package/dist/config/merge.js +42 -22
- package/dist/config/paths.js +6 -5
- package/dist/config/profile.d.ts +5 -1
- package/dist/config/profile.js +7 -2
- package/dist/config/schema-w5.js +12 -4
- package/dist/config/schema-w6.d.ts +19 -0
- package/dist/config/schema-w6.js +115 -0
- package/dist/config/schema.js +34 -20
- package/dist/config/settings-registry.d.ts +81 -0
- package/dist/config/settings-registry.js +185 -0
- package/dist/config/types-w5.d.ts +7 -0
- package/dist/config/types-w5.js +2 -0
- package/dist/config/types-w6.d.ts +109 -0
- package/dist/config/types-w6.js +19 -0
- package/dist/config/types.d.ts +11 -8
- package/dist/config/types.js +1 -0
- package/dist/drivers/acp/client.js +1 -1
- package/dist/drivers/acp/driver.js +13 -8
- package/dist/drivers/agents.js +4 -3
- package/dist/drivers/base.js +3 -2
- package/dist/drivers/host-runners.js +2 -1
- package/dist/drivers/native/claude-stream.js +12 -11
- package/dist/drivers/native/codex-app-server.js +17 -12
- package/dist/drivers/native/oneshot.js +8 -7
- package/dist/drivers/pool.js +1 -1
- package/dist/drivers/runner.d.ts +3 -1
- package/dist/drivers/runner.js +68 -20
- package/dist/drivers/turn.js +1 -1
- package/dist/hooks/config.js +3 -2
- package/dist/hooks/protocol.js +18 -12
- package/dist/host/api-impl.js +11 -10
- package/dist/host/loader.js +9 -8
- package/dist/host/types.d.ts +3 -0
- package/dist/i18n/catalog.d.ts +2209 -0
- package/dist/i18n/catalog.js +72 -0
- package/dist/i18n/format.d.ts +21 -0
- package/dist/i18n/format.js +58 -0
- package/dist/i18n/index.d.ts +58 -0
- package/dist/i18n/index.js +72 -0
- package/dist/i18n/messages/agents.d.ts +84 -0
- package/dist/i18n/messages/agents.js +85 -0
- package/dist/i18n/messages/approval.d.ts +99 -0
- package/dist/i18n/messages/approval.js +100 -0
- package/dist/i18n/messages/auth.d.ts +189 -0
- package/dist/i18n/messages/auth.js +201 -0
- package/dist/i18n/messages/cli-args.d.ts +46 -0
- package/dist/i18n/messages/cli-args.js +46 -0
- package/dist/i18n/messages/cli-help.d.ts +12 -0
- package/dist/i18n/messages/cli-help.js +248 -0
- package/dist/i18n/messages/cli.d.ts +336 -0
- package/dist/i18n/messages/cli.js +311 -0
- package/dist/i18n/messages/config-keys.d.ts +293 -0
- package/dist/i18n/messages/config-keys.js +296 -0
- package/dist/i18n/messages/config.d.ts +508 -0
- package/dist/i18n/messages/config.js +241 -0
- package/dist/i18n/messages/drivers.d.ts +123 -0
- package/dist/i18n/messages/drivers.js +124 -0
- package/dist/i18n/messages/errors.d.ts +83 -0
- package/dist/i18n/messages/errors.js +171 -0
- package/dist/i18n/messages/interactive-line.d.ts +61 -0
- package/dist/i18n/messages/interactive-line.js +69 -0
- package/dist/i18n/messages/interactive-startup.d.ts +99 -0
- package/dist/i18n/messages/interactive-startup.js +100 -0
- package/dist/i18n/messages/interactive-view.d.ts +140 -0
- package/dist/i18n/messages/interactive-view.js +141 -0
- package/dist/i18n/messages/interactive.d.ts +489 -0
- package/dist/i18n/messages/interactive.js +248 -0
- package/dist/i18n/messages/memory.d.ts +123 -0
- package/dist/i18n/messages/memory.js +128 -0
- package/dist/i18n/messages/panels.d.ts +233 -0
- package/dist/i18n/messages/panels.js +232 -0
- package/dist/i18n/messages/permissions.d.ts +126 -0
- package/dist/i18n/messages/permissions.js +151 -0
- package/dist/i18n/messages/plan.d.ts +123 -0
- package/dist/i18n/messages/plan.js +124 -0
- package/dist/i18n/messages/print.d.ts +86 -0
- package/dist/i18n/messages/print.js +91 -0
- package/dist/i18n/messages/report.d.ts +391 -0
- package/dist/i18n/messages/report.js +490 -0
- package/dist/i18n/messages/rewind.d.ts +198 -0
- package/dist/i18n/messages/rewind.js +217 -0
- package/dist/i18n/messages/session.d.ts +230 -0
- package/dist/i18n/messages/session.js +258 -0
- package/dist/i18n/messages/settings.d.ts +355 -0
- package/dist/i18n/messages/settings.js +343 -0
- package/dist/i18n/messages/subcommands-config.d.ts +113 -0
- package/dist/i18n/messages/subcommands-config.js +129 -0
- package/dist/i18n/messages/subcommands-models.d.ts +34 -0
- package/dist/i18n/messages/subcommands-models.js +34 -0
- package/dist/i18n/messages/subcommands.d.ts +576 -0
- package/dist/i18n/messages/subcommands.js +477 -0
- package/dist/i18n/messages/trace.d.ts +243 -0
- package/dist/i18n/messages/trace.js +238 -0
- package/dist/i18n/types.d.ts +15 -0
- package/dist/i18n/types.js +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/memory/edit.d.ts +24 -0
- package/dist/memory/edit.js +63 -0
- package/dist/memory/frontmatter.d.ts +37 -0
- package/dist/memory/frontmatter.js +79 -0
- package/dist/memory/index.d.ts +28 -0
- package/dist/memory/index.js +126 -0
- package/dist/memory/lock.d.ts +17 -0
- package/dist/memory/lock.js +62 -0
- package/dist/memory/paths.d.ts +57 -0
- package/dist/memory/paths.js +175 -0
- package/dist/memory/report.d.ts +36 -0
- package/dist/memory/report.js +86 -0
- package/dist/memory/runtime.d.ts +42 -0
- package/dist/memory/runtime.js +36 -0
- package/dist/memory/secrets.d.ts +8 -0
- package/dist/memory/secrets.js +27 -0
- package/dist/memory/section.d.ts +28 -0
- package/dist/memory/section.js +59 -0
- package/dist/memory/store.d.ts +70 -0
- package/dist/memory/store.js +284 -0
- package/dist/memory/tool.d.ts +31 -0
- package/dist/memory/tool.js +94 -0
- package/dist/modes/acp/acp-events.js +2 -1
- package/dist/modes/acp/acp-server.js +13 -12
- package/dist/modes/commands-core.d.ts +11 -0
- package/dist/modes/commands-core.js +93 -62
- package/dist/modes/image-input.js +20 -6
- package/dist/modes/interactive/agent-bar.d.ts +95 -0
- package/dist/modes/interactive/agent-bar.js +248 -0
- package/dist/modes/interactive/agent-panels.js +27 -26
- package/dist/modes/interactive/agent-transcript.d.ts +47 -0
- package/dist/modes/interactive/agent-transcript.js +191 -0
- package/dist/modes/interactive/agent-ui.d.ts +36 -1
- package/dist/modes/interactive/agent-ui.js +180 -14
- package/dist/modes/interactive/agent-view.d.ts +72 -0
- package/dist/modes/interactive/agent-view.js +281 -0
- package/dist/modes/interactive/approval-dialog.js +46 -34
- package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
- package/dist/modes/interactive/clipboard-paste.js +9 -4
- package/dist/modes/interactive/commands.d.ts +22 -1
- package/dist/modes/interactive/commands.js +100 -49
- package/dist/modes/interactive/completion.js +2 -1
- package/dist/modes/interactive/config-panel.d.ts +70 -0
- package/dist/modes/interactive/config-panel.js +319 -0
- package/dist/modes/interactive/config-ui.d.ts +96 -0
- package/dist/modes/interactive/config-ui.js +397 -0
- package/dist/modes/interactive/confirm-dialog.js +6 -7
- package/dist/modes/interactive/event-notices.js +11 -9
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.js +21 -22
- package/dist/modes/interactive/key-dispatch.d.ts +12 -0
- package/dist/modes/interactive/key-dispatch.js +24 -9
- package/dist/modes/interactive/line/line-editor.js +2 -1
- package/dist/modes/interactive/line/line-mode.js +18 -7
- package/dist/modes/interactive/line/line-render.js +25 -24
- package/dist/modes/interactive/memory-panel.d.ts +64 -0
- package/dist/modes/interactive/memory-panel.js +221 -0
- package/dist/modes/interactive/message-view.d.ts +4 -2
- package/dist/modes/interactive/message-view.js +42 -33
- package/dist/modes/interactive/model-items.d.ts +45 -0
- package/dist/modes/interactive/model-items.js +134 -0
- package/dist/modes/interactive/model-picker.d.ts +57 -0
- package/dist/modes/interactive/model-picker.js +191 -0
- package/dist/modes/interactive/panels.js +39 -31
- package/dist/modes/interactive/pickers.d.ts +2 -1
- package/dist/modes/interactive/pickers.js +10 -6
- package/dist/modes/interactive/plan-command.d.ts +1 -1
- package/dist/modes/interactive/plan-command.js +24 -27
- package/dist/modes/interactive/plan-dialog.js +18 -17
- package/dist/modes/interactive/plan-flow.js +6 -5
- package/dist/modes/interactive/rewind-command.d.ts +1 -1
- package/dist/modes/interactive/rewind-command.js +18 -16
- package/dist/modes/interactive/rewind-flow.d.ts +0 -1
- package/dist/modes/interactive/rewind-flow.js +13 -14
- package/dist/modes/interactive/rewind-list.js +7 -6
- package/dist/modes/interactive/rewind-panel.js +40 -40
- package/dist/modes/interactive/rewind-text.d.ts +5 -3
- package/dist/modes/interactive/rewind-text.js +48 -38
- package/dist/modes/interactive/run-indicator.js +15 -12
- package/dist/modes/interactive/session-events.js +3 -2
- package/dist/modes/interactive/startup-header.js +22 -23
- package/dist/modes/interactive/startup-ui.d.ts +3 -9
- package/dist/modes/interactive/startup-ui.js +44 -88
- package/dist/modes/interactive/status-area.d.ts +2 -0
- package/dist/modes/interactive/status-area.js +8 -2
- package/dist/modes/interactive/status-bar.js +4 -3
- package/dist/modes/interactive/subagent-view.js +9 -7
- package/dist/modes/interactive/tasks-report.d.ts +6 -0
- package/dist/modes/interactive/tasks-report.js +28 -31
- package/dist/modes/interactive/terminal-setup.d.ts +9 -0
- package/dist/modes/interactive/terminal-setup.js +23 -0
- package/dist/modes/interactive/tool-summary.js +19 -17
- package/dist/modes/interactive/tool-view.js +7 -4
- package/dist/modes/interactive/trace-view.d.ts +89 -0
- package/dist/modes/interactive/trace-view.js +332 -0
- package/dist/modes/print/print-mode.js +14 -15
- package/dist/modes/rpc/commands.js +7 -3
- package/dist/modes/rpc/rpc-mode.js +9 -3
- package/dist/modes/session-report.d.ts +2 -0
- package/dist/modes/session-report.js +101 -105
- package/dist/modes/startup-ui-text.js +11 -6
- package/dist/permissions/bypass.d.ts +8 -10
- package/dist/permissions/bypass.js +19 -10
- package/dist/permissions/memory-class.d.ts +23 -0
- package/dist/permissions/memory-class.js +54 -0
- package/dist/permissions/modes.d.ts +3 -3
- package/dist/permissions/modes.js +21 -16
- package/dist/permissions/pipeline.d.ts +1 -1
- package/dist/permissions/pipeline.js +9 -2
- package/dist/permissions/preview.js +49 -42
- package/dist/permissions/rules.js +5 -2
- package/dist/permissions/types.d.ts +4 -0
- package/dist/plan/store.js +2 -1
- package/dist/rpc.d.ts +39 -1
- package/dist/rpc.js +3 -0
- package/dist/sandbox/bash.js +11 -8
- package/dist/sandbox/detect.js +14 -11
- package/dist/sdk.d.ts +17 -1
- package/dist/sdk.js +29 -7
- package/dist/session/export.js +31 -30
- package/dist/session/manager.d.ts +1 -1
- package/dist/session/manager.js +5 -3
- package/dist/session/reuse.js +5 -4
- package/dist/session/scan.js +3 -2
- package/dist/session/stats-aggregate.d.ts +3 -1
- package/dist/session/stats-aggregate.js +5 -1
- package/dist/session/stats-index.js +2 -1
- package/dist/session/stats-scan.d.ts +4 -1
- package/dist/session/stats-scan.js +6 -2
- package/dist/session/store.d.ts +11 -0
- package/dist/session/store.js +48 -1
- package/dist/session/types.d.ts +2 -0
- package/dist/skills/builtin.js +2 -1
- package/dist/tools/image-file.d.ts +26 -1
- package/dist/tools/image-file.js +55 -13
- package/dist/tools/presets.d.ts +14 -1
- package/dist/tools/presets.js +3 -3
- package/dist/tools/registry.js +1 -1
- package/dist/tools/truncate.d.ts +1 -1
- package/dist/tools/truncate.js +2 -2
- package/dist/tools/types.d.ts +17 -1
- package/dist/trace/build-index.d.ts +91 -0
- package/dist/trace/build-index.js +127 -0
- package/dist/trace/build-nodes.d.ts +24 -0
- package/dist/trace/build-nodes.js +279 -0
- package/dist/trace/build-util.d.ts +43 -0
- package/dist/trace/build-util.js +120 -0
- package/dist/trace/build.d.ts +82 -0
- package/dist/trace/build.js +382 -0
- package/dist/trace/detail.d.ts +35 -0
- package/dist/trace/detail.js +205 -0
- package/dist/trace/flatten.d.ts +69 -0
- package/dist/trace/flatten.js +173 -0
- package/dist/trace/format.d.ts +47 -0
- package/dist/trace/format.js +329 -0
- package/dist/trace/html-template.d.ts +19 -0
- package/dist/trace/html-template.js +150 -0
- package/dist/trace/html.d.ts +104 -0
- package/dist/trace/html.js +292 -0
- package/dist/trace/preview.d.ts +29 -0
- package/dist/trace/preview.js +59 -0
- package/dist/trace/query-session.d.ts +14 -0
- package/dist/trace/query-session.js +38 -0
- package/dist/trace/query.d.ts +55 -0
- package/dist/trace/query.js +188 -0
- package/dist/trace/session.d.ts +40 -0
- package/dist/trace/session.js +168 -0
- package/dist/trace/types.d.ts +243 -0
- package/dist/trace/types.js +13 -0
- package/dist/tui/components/editor-paste.d.ts +2 -0
- package/dist/tui/components/editor-paste.js +6 -3
- package/dist/tui/components/editor.js +2 -2
- package/dist/tui/components/loader.d.ts +3 -0
- package/dist/tui/components/loader.js +14 -0
- package/dist/tui/components/select-list.d.ts +2 -0
- package/dist/tui/components/select-list.js +7 -0
- package/dist/tui/components/settings-list.d.ts +61 -0
- package/dist/tui/components/settings-list.js +135 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +17 -5
- package/dist/tui.d.ts +1 -0
- package/dist/tui.js +2 -0
- package/docs/en/host-api.md +167 -0
- package/docs/en/permissions.md +214 -0
- package/docs/en/providers.md +627 -0
- package/docs/en/rpc.md +361 -0
- package/docs/en/sessions.md +219 -0
- package/docs/en/tui.md +534 -0
- package/docs/host-api.md +18 -17
- package/docs/memory.md +172 -0
- package/docs/permissions.md +2 -2
- package/docs/providers.md +73 -1
- package/docs/rpc.md +31 -3
- package/docs/session-format.md +8 -2
- package/docs/sessions.md +29 -1
- package/docs/tui.md +140 -4
- package/package.json +8 -3
|
@@ -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>;
|
|
@@ -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
|
/** 追加工具调用块:紧跟在另一个工具调用后面时不空行。 */
|