@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
|
@@ -7,21 +7,30 @@
|
|
|
7
7
|
* - 离开 Bypass、切到其它模式都不问。
|
|
8
8
|
* - 只管「要不要问」与记住确认;怎么问(对话框 / 行式 y/N)由各界面提供 `ask`。
|
|
9
9
|
*/
|
|
10
|
+
import { msg } from "../i18n/index.js";
|
|
10
11
|
export const BYPASS_MODE = "full-auto";
|
|
11
|
-
|
|
12
|
+
/** 确认框标题(随界面语言)。 */
|
|
13
|
+
export function bypassConfirmTitle() {
|
|
14
|
+
return msg().permissions.bypass.title;
|
|
15
|
+
}
|
|
12
16
|
/** 确认框正文:Bypass 意味着什么(一两条关键风险)。 */
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
export function bypassRiskLines() {
|
|
18
|
+
const m = msg().permissions.bypass;
|
|
19
|
+
return [m.riskAllowAll, m.riskDangerous];
|
|
20
|
+
}
|
|
17
21
|
/** 选项:缺省选中「取消」。 */
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
export function bypassChoices() {
|
|
23
|
+
const m = msg().permissions.bypass;
|
|
24
|
+
return [
|
|
25
|
+
{ label: m.choiceEnter, keys: "y" },
|
|
26
|
+
{ label: m.choiceCancel, keys: "n Esc" },
|
|
27
|
+
];
|
|
28
|
+
}
|
|
22
29
|
export const BYPASS_DEFAULT_CHOICE = 1;
|
|
23
30
|
/** 行式界面的问句(单键 y/N,缺省 N)。 */
|
|
24
|
-
export
|
|
31
|
+
export function bypassLineQuestion() {
|
|
32
|
+
return msg().permissions.bypass.lineQuestion;
|
|
33
|
+
}
|
|
25
34
|
/**
|
|
26
35
|
* 返回「切到 `mode` 前要不要放行」的闸门:不是 Bypass 直接放行;Bypass 首次调用 `ask`,
|
|
27
36
|
* 确认后本闸门内不再问。`confirmed` 为 true 表示启动时已在 Bypass(视为已确认)。
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 权限类 `memory`(docs/wave6-plan.md §3.3、D10)。[W6-C0] 管线判定;`memory` 工具本身由 W6-M 实现。
|
|
3
|
+
*
|
|
4
|
+
* 管线按命令把它折成已有的类再走通常的真值表:
|
|
5
|
+
* - `view` → `read`:所有模式放行;
|
|
6
|
+
* - 写命令(`create` / `str_replace` / `delete`,以及无法识别的命令)→ `execute`:default / auto-edit 询问
|
|
7
|
+
* (审批可选「本会话允许」)、plan 拒绝、full-auto 放行、allowlist 只放行 allow 规则命中的
|
|
8
|
+
* (`memory` 不带括号即全部放行)、auto 交给分类器。
|
|
9
|
+
* 写入前的脱敏拒写、子会话写命令拒绝在工具执行层(W6-M),不在这里。
|
|
10
|
+
*/
|
|
11
|
+
import type { ToolPermission } from "../tools/types.js";
|
|
12
|
+
export declare const MEMORY_COMMANDS: readonly ["view", "create", "str_replace", "delete"];
|
|
13
|
+
export type MemoryCommand = (typeof MEMORY_COMMANDS)[number];
|
|
14
|
+
/** 调用的 `command`(不是字符串返回 undefined)。 */
|
|
15
|
+
export declare function memoryCommand(input: unknown): string | undefined;
|
|
16
|
+
/** `memory` 类在真值表里按哪一类判定。 */
|
|
17
|
+
export declare function memoryEffectivePermission(input: unknown): Exclude<ToolPermission, "memory">;
|
|
18
|
+
/**
|
|
19
|
+
* [W6-M] `memory(pattern)` 规则:pattern 是命令名(`view` / `create` / `str_replace` / `delete`)时比对命令;
|
|
20
|
+
* 否则按 glob 比对逻辑路径(`/memories/user/**`,`*` 不跨 `/`,`**` 跨);单独的 `*` / `**` 命中全部。
|
|
21
|
+
* 记忆路径是逻辑路径,不按文件系统解析(`rules.ts` 对 memory 不走 bash 命令与真实路径的匹配)。
|
|
22
|
+
*/
|
|
23
|
+
export declare function memoryRuleMatches(pattern: string, input: unknown): boolean;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 权限类 `memory`(docs/wave6-plan.md §3.3、D10)。[W6-C0] 管线判定;`memory` 工具本身由 W6-M 实现。
|
|
3
|
+
*
|
|
4
|
+
* 管线按命令把它折成已有的类再走通常的真值表:
|
|
5
|
+
* - `view` → `read`:所有模式放行;
|
|
6
|
+
* - 写命令(`create` / `str_replace` / `delete`,以及无法识别的命令)→ `execute`:default / auto-edit 询问
|
|
7
|
+
* (审批可选「本会话允许」)、plan 拒绝、full-auto 放行、allowlist 只放行 allow 规则命中的
|
|
8
|
+
* (`memory` 不带括号即全部放行)、auto 交给分类器。
|
|
9
|
+
* 写入前的脱敏拒写、子会话写命令拒绝在工具执行层(W6-M),不在这里。
|
|
10
|
+
*/
|
|
11
|
+
export const MEMORY_COMMANDS = ["view", "create", "str_replace", "delete"];
|
|
12
|
+
/** 调用的 `command`(不是字符串返回 undefined)。 */
|
|
13
|
+
export function memoryCommand(input) {
|
|
14
|
+
const raw = typeof input === "object" && input !== null
|
|
15
|
+
? input["command"]
|
|
16
|
+
: undefined;
|
|
17
|
+
return typeof raw === "string" ? raw : undefined;
|
|
18
|
+
}
|
|
19
|
+
/** `memory` 类在真值表里按哪一类判定。 */
|
|
20
|
+
export function memoryEffectivePermission(input) {
|
|
21
|
+
return memoryCommand(input) === "view" ? "read" : "execute";
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* [W6-M] `memory(pattern)` 规则:pattern 是命令名(`view` / `create` / `str_replace` / `delete`)时比对命令;
|
|
25
|
+
* 否则按 glob 比对逻辑路径(`/memories/user/**`,`*` 不跨 `/`,`**` 跨);单独的 `*` / `**` 命中全部。
|
|
26
|
+
* 记忆路径是逻辑路径,不按文件系统解析(`rules.ts` 对 memory 不走 bash 命令与真实路径的匹配)。
|
|
27
|
+
*/
|
|
28
|
+
export function memoryRuleMatches(pattern, input) {
|
|
29
|
+
const p = pattern.trim();
|
|
30
|
+
if (p === "*" || p === "**")
|
|
31
|
+
return true;
|
|
32
|
+
if (MEMORY_COMMANDS.includes(p))
|
|
33
|
+
return memoryCommand(input) === p;
|
|
34
|
+
const raw = typeof input === "object" && input !== null
|
|
35
|
+
? input["path"]
|
|
36
|
+
: undefined;
|
|
37
|
+
if (typeof raw !== "string")
|
|
38
|
+
return false;
|
|
39
|
+
let body = "";
|
|
40
|
+
for (let i = 0; i < p.length; i++) {
|
|
41
|
+
const ch = p[i];
|
|
42
|
+
if (ch === "*" && p[i + 1] === "*") {
|
|
43
|
+
body += ".*";
|
|
44
|
+
i++;
|
|
45
|
+
}
|
|
46
|
+
else if (ch === "*")
|
|
47
|
+
body += "[^/]*";
|
|
48
|
+
else if (ch === "?")
|
|
49
|
+
body += "[^/]";
|
|
50
|
+
else
|
|
51
|
+
body += ch.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
52
|
+
}
|
|
53
|
+
return new RegExp(`^${body}$`).test(raw.replace(/\/+$/, ""));
|
|
54
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 六种权限模式的显示名、一行说明、界面顺序与 Shift+Tab 循环(§7.4)。
|
|
3
3
|
*
|
|
4
|
-
* 显示名用英文(与常见编码 Agent
|
|
4
|
+
* 显示名用英文(与常见编码 Agent 的叫法一致),说明随界面语言(`msg().permissions`)。界面顺序就是选择器里
|
|
5
5
|
* 数字快捷键 1–6 的顺序;`allowlist` 不在 Shift+Tab 循环里,只能显式选。
|
|
6
6
|
*/
|
|
7
7
|
import { type PermissionMode } from "./types.js";
|
|
@@ -22,8 +22,8 @@ export declare function isPermissionMode(value: unknown): value is PermissionMod
|
|
|
22
22
|
export declare function nextCycleMode(mode: PermissionMode): PermissionMode;
|
|
23
23
|
/** line 模式 `/permission` 与 `/permissions` 用的纯文本列表(与选择器同一顺序与标注)。 */
|
|
24
24
|
export declare function permissionModeLines(current: PermissionMode, configDefault: PermissionMode): string[];
|
|
25
|
-
/** 审批对话框与提示里 auto
|
|
26
|
-
export declare
|
|
25
|
+
/** 审批对话框与提示里 auto 判定层的名字(随界面语言)。 */
|
|
26
|
+
export declare function autoLayerText(layer: "rule" | "static" | "classifier"): string;
|
|
27
27
|
/**
|
|
28
28
|
* 命令参数里的模式:接受值(`auto-edit`)或显示名(`Accept edits`、`accept-edits`,大小写不敏感)。
|
|
29
29
|
*/
|
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 六种权限模式的显示名、一行说明、界面顺序与 Shift+Tab 循环(§7.4)。
|
|
3
3
|
*
|
|
4
|
-
* 显示名用英文(与常见编码 Agent
|
|
4
|
+
* 显示名用英文(与常见编码 Agent 的叫法一致),说明随界面语言(`msg().permissions`)。界面顺序就是选择器里
|
|
5
5
|
* 数字快捷键 1–6 的顺序;`allowlist` 不在 Shift+Tab 循环里,只能显式选。
|
|
6
6
|
*/
|
|
7
|
+
import { msg } from "../i18n/index.js";
|
|
7
8
|
import { PERMISSION_MODES_STRICT_FIRST } from "./types.js";
|
|
9
|
+
/** 说明随界面语言(取用时求值,不在 import 时定死)。 */
|
|
10
|
+
function info(label, key) {
|
|
11
|
+
return {
|
|
12
|
+
label,
|
|
13
|
+
get description() {
|
|
14
|
+
return msg().permissions.modeDescription[key];
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
8
18
|
export const PERMISSION_MODE_INFO = {
|
|
9
|
-
default:
|
|
10
|
-
"auto-edit":
|
|
11
|
-
plan:
|
|
12
|
-
auto:
|
|
13
|
-
"full-auto":
|
|
14
|
-
allowlist:
|
|
15
|
-
label: "Allowlist only",
|
|
16
|
-
description: "只放行 allow 规则命中的,其余拒绝,从不询问",
|
|
17
|
-
},
|
|
19
|
+
default: info("Manual", "default"),
|
|
20
|
+
"auto-edit": info("Accept edits", "autoEdit"),
|
|
21
|
+
plan: info("Plan", "plan"),
|
|
22
|
+
auto: info("Auto", "auto"),
|
|
23
|
+
"full-auto": info("Bypass permissions", "fullAuto"),
|
|
24
|
+
allowlist: info("Allowlist only", "allowlist"),
|
|
18
25
|
};
|
|
19
26
|
/** 选择器顺序(数字快捷键 1–6)。 */
|
|
20
27
|
export const PERMISSION_MODE_ORDER = [
|
|
@@ -60,12 +67,10 @@ export function permissionModeLines(current, configDefault) {
|
|
|
60
67
|
return `${mark} ${i + 1}. ${info.label} (${mode}) — ${info.description}${tail}`;
|
|
61
68
|
});
|
|
62
69
|
}
|
|
63
|
-
/** 审批对话框与提示里 auto
|
|
64
|
-
export
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
classifier: "分类器",
|
|
68
|
-
};
|
|
70
|
+
/** 审批对话框与提示里 auto 判定层的名字(随界面语言)。 */
|
|
71
|
+
export function autoLayerText(layer) {
|
|
72
|
+
return msg().permissions.autoLayer[layer];
|
|
73
|
+
}
|
|
69
74
|
/**
|
|
70
75
|
* 命令参数里的模式:接受值(`auto-edit`)或显示名(`Accept edits`、`accept-edits`,大小写不敏感)。
|
|
71
76
|
*/
|
|
@@ -57,7 +57,7 @@ export declare function planDecision(input: Pick<PermissionCheckInput, "toolName
|
|
|
57
57
|
message?: string;
|
|
58
58
|
};
|
|
59
59
|
export declare const UNATTENDED_MESSAGE = "This tool call requires approval, but no one is available to approve it (unattended mode).";
|
|
60
|
-
export declare const ALLOWLIST_MESSAGE = "Not in the allowlist
|
|
60
|
+
export declare const ALLOWLIST_MESSAGE = "Not in the allowlist: permission mode \"allowlist\" only runs read-only tools and calls matched by an allow rule, and never asks.";
|
|
61
61
|
interface SessionGrant {
|
|
62
62
|
toolName: string;
|
|
63
63
|
kind: "command" | "dir" | "any";
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
*/
|
|
36
36
|
import { dirname, sep } from "node:path";
|
|
37
37
|
import { isBackgroundJobQuery } from "../tools/background-jobs.js";
|
|
38
|
+
import { memoryEffectivePermission } from "./memory-class.js";
|
|
38
39
|
import { findAllowRule, findDenyRule, inputCommand, inputPath, normalizeCommand, splitShellSegments, } from "./rules.js";
|
|
39
40
|
import { collectNestedCommands, matchDangerous } from "./dangerous.js";
|
|
40
41
|
import { analyzeBashForAuto, secretReferenceReason } from "./auto-safe.js";
|
|
@@ -103,7 +104,7 @@ export function planDecision(input, planBash, cwd, projectRoot = cwd) {
|
|
|
103
104
|
return { decision: "deny", message: PLAN_MODE_MESSAGE };
|
|
104
105
|
}
|
|
105
106
|
export const UNATTENDED_MESSAGE = "This tool call requires approval, but no one is available to approve it (unattended mode).";
|
|
106
|
-
export const ALLOWLIST_MESSAGE = 'Not in the allowlist
|
|
107
|
+
export const ALLOWLIST_MESSAGE = 'Not in the allowlist: permission mode "allowlist" only runs read-only tools and calls matched by an allow rule, and never asks.';
|
|
107
108
|
/** 审计摘要:bash 取命令,带 path 的取路径,其它取工具名;单行、截断。 */
|
|
108
109
|
function auditSummary(toolName, input) {
|
|
109
110
|
const command = inputCommand(input);
|
|
@@ -115,6 +116,8 @@ function auditSummary(toolName, input) {
|
|
|
115
116
|
return text.length > 80 ? `${text.slice(0, 79)}…` : text;
|
|
116
117
|
}
|
|
117
118
|
export function sessionGrantFor(toolName, input, cwd) {
|
|
119
|
+
if (toolName === "memory")
|
|
120
|
+
return { toolName, kind: "any", prefix: "" }; // [W6-M] 本会话允许全部写命令
|
|
118
121
|
const command = inputCommand(input);
|
|
119
122
|
if (command !== undefined) {
|
|
120
123
|
const words = normalizeCommand(command).split(" ").slice(0, 2);
|
|
@@ -213,7 +216,11 @@ export class PermissionPipeline {
|
|
|
213
216
|
}
|
|
214
217
|
return verdict;
|
|
215
218
|
}
|
|
216
|
-
evaluate(
|
|
219
|
+
evaluate(raw) {
|
|
220
|
+
// [W6-C0] 权限类 memory 按命令折成 read / execute(memory-class.ts)
|
|
221
|
+
const input = raw.permission === "memory"
|
|
222
|
+
? { ...raw, permission: memoryEffectivePermission(raw.input) }
|
|
223
|
+
: raw;
|
|
217
224
|
const { toolName, permission } = input;
|
|
218
225
|
// ① deny
|
|
219
226
|
const layers = layeredInputs(toolName, input.input);
|
|
@@ -21,6 +21,7 @@ import { normalizeToLF, splitBom } from "../tools/edit-fuzzy.js";
|
|
|
21
21
|
import { displayPath, resolvePath } from "../tools/paths.js";
|
|
22
22
|
import { collectNestedCommands, commandWords, matchDangerous, shellWords } from "./dangerous.js";
|
|
23
23
|
import { splitShellSegments } from "./rules.js";
|
|
24
|
+
import { msg } from "../i18n/index.js";
|
|
24
25
|
export const PREVIEW_MAX_ENTRIES = 2000;
|
|
25
26
|
export const PREVIEW_BUDGET_MS = 200;
|
|
26
27
|
/** 超过它的文件不读内容,只报大小。 */
|
|
@@ -91,9 +92,9 @@ class Collector {
|
|
|
91
92
|
}
|
|
92
93
|
finish(kind) {
|
|
93
94
|
if (this.hidden > 0)
|
|
94
|
-
this.lines.push(
|
|
95
|
+
this.lines.push(msg().permissions.preview.moreHidden(this.hidden));
|
|
95
96
|
if (this.timedOut) {
|
|
96
|
-
this.lines.push(
|
|
97
|
+
this.lines.push(msg().permissions.preview.timedOut(this.options.budgetMs ?? PREVIEW_BUDGET_MS));
|
|
97
98
|
this.raise("warn");
|
|
98
99
|
}
|
|
99
100
|
const preview = { kind, lines: this.lines, severity: this.severity };
|
|
@@ -142,37 +143,38 @@ function tally(root, c) {
|
|
|
142
143
|
}
|
|
143
144
|
/** 统计一个路径:返回目标与「:」之后的说明。 */
|
|
144
145
|
function inspect(abs, c) {
|
|
146
|
+
const m = msg().permissions.preview;
|
|
145
147
|
const shown = displayPath(abs, c.root);
|
|
146
148
|
const info = tryStat(abs);
|
|
147
149
|
if (info === undefined)
|
|
148
|
-
return { target: { path: shown, exists: false }, text:
|
|
150
|
+
return { target: { path: shown, exists: false }, text: m.missing };
|
|
149
151
|
if (info.isSymbolicLink())
|
|
150
|
-
return { target: { path: shown, exists: true }, text:
|
|
152
|
+
return { target: { path: shown, exists: true }, text: m.symlink };
|
|
151
153
|
if (!info.isDirectory()) {
|
|
152
154
|
return {
|
|
153
155
|
target: { path: shown, exists: true, bytes: info.size },
|
|
154
|
-
text:
|
|
156
|
+
text: m.file(formatBytes(info.size)),
|
|
155
157
|
};
|
|
156
158
|
}
|
|
157
159
|
const t = tally(abs, c);
|
|
158
160
|
const target = { path: `${shown}/`, exists: true, files: t.files };
|
|
159
161
|
if (t.capped)
|
|
160
|
-
return { target, text:
|
|
162
|
+
return { target, text: m.dirCapped(c.maxEntries) };
|
|
161
163
|
target.bytes = t.bytes;
|
|
162
|
-
|
|
163
|
-
return { target, text: `目录,${t.files} 个文件,${formatBytes(t.bytes)}${partial}` };
|
|
164
|
+
return { target, text: m.dir(t.files, formatBytes(t.bytes), c.timedOut) };
|
|
164
165
|
}
|
|
165
166
|
/** 一个路径参数一行;含通配 / 变量的原样显示不展开。 */
|
|
166
|
-
function pathLine(verb, word, c, note
|
|
167
|
+
function pathLine(verb, word, c, note) {
|
|
168
|
+
const m = msg().permissions.preview;
|
|
167
169
|
if (UNEXPANDED.test(word)) {
|
|
168
|
-
c.target(
|
|
170
|
+
c.target(m.pathUnexpanded(verb, word));
|
|
169
171
|
c.raise("warn");
|
|
170
172
|
return;
|
|
171
173
|
}
|
|
172
174
|
const { target, text } = inspect(resolvePath(word, c.cwd), c);
|
|
173
175
|
if (target.exists)
|
|
174
176
|
c.raise("warn");
|
|
175
|
-
c.target(
|
|
177
|
+
c.target(m.pathTarget(verb, target.path, text, note), target);
|
|
176
178
|
}
|
|
177
179
|
/** 段里的 `>` / `>>` 重定向:返回目标与去掉重定向后的文本。 */
|
|
178
180
|
export function splitRedirects(segment) {
|
|
@@ -250,7 +252,7 @@ function previewSegment(segment, c) {
|
|
|
250
252
|
for (const { word, append } of targets) {
|
|
251
253
|
if (NULL_DEVICES.has(word.toLowerCase()))
|
|
252
254
|
continue;
|
|
253
|
-
pathLine(append ? "
|
|
255
|
+
pathLine(append ? "append" : "overwrite", word, c);
|
|
254
256
|
}
|
|
255
257
|
const argv = commandWords(rest);
|
|
256
258
|
const name = basename(argv[0] ?? "");
|
|
@@ -261,20 +263,20 @@ function previewSegment(segment, c) {
|
|
|
261
263
|
if (name === "rm" || name === "rmdir" || name === "unlink") {
|
|
262
264
|
const paths = operands(argv);
|
|
263
265
|
if (paths.length === 0)
|
|
264
|
-
c.target(
|
|
266
|
+
c.target(msg().permissions.preview.rmUnknown(name));
|
|
265
267
|
for (const p of paths)
|
|
266
|
-
pathLine("
|
|
268
|
+
pathLine("delete", p, c);
|
|
267
269
|
}
|
|
268
270
|
else if (name === "mv") {
|
|
269
271
|
const paths = operands(argv, ["-t", "-S", "--target-directory", "--suffix"]);
|
|
270
272
|
const t = argv.indexOf("-t");
|
|
271
273
|
const dest = t > 0 ? argv[t + 1] : paths.pop();
|
|
272
274
|
for (const p of paths)
|
|
273
|
-
pathLine("
|
|
275
|
+
pathLine("move", p, c);
|
|
274
276
|
if (dest !== undefined && paths.length > 0) {
|
|
275
277
|
const info = UNEXPANDED.test(dest) ? undefined : tryStat(resolvePath(dest, c.cwd));
|
|
276
|
-
const note = info?.isDirectory() ? "
|
|
277
|
-
pathLine("
|
|
278
|
+
const note = info?.isDirectory() ? "intoDir" : "overwritten";
|
|
279
|
+
pathLine("moveTo", dest, c, info === undefined ? undefined : note);
|
|
278
280
|
}
|
|
279
281
|
}
|
|
280
282
|
else if (name === "git") {
|
|
@@ -299,7 +301,7 @@ function previewGit(argv, c) {
|
|
|
299
301
|
!args.some((a) => a === "-n" || a === "--dry-run" || /^-[a-z]*n/.test(a))) {
|
|
300
302
|
const paths = operands(args, ["-e", "--exclude"]);
|
|
301
303
|
for (const p of paths.length > 0 ? paths : ["."]) {
|
|
302
|
-
pathLine("
|
|
304
|
+
pathLine("gitClean", p, c, "gitCleanTracked");
|
|
303
305
|
}
|
|
304
306
|
// 与危险规则无关地标红:`git -C 目录 clean -f` 之类危险表认不出的写法也算
|
|
305
307
|
if (args.some((a) => a === "--force" || /^-[A-Za-z]*f/.test(a)))
|
|
@@ -307,10 +309,10 @@ function previewGit(argv, c) {
|
|
|
307
309
|
}
|
|
308
310
|
else if (sub === "checkout" && args.includes("--")) {
|
|
309
311
|
for (const p of args.slice(args.indexOf("--") + 1))
|
|
310
|
-
pathLine("
|
|
312
|
+
pathLine("discard", p, c);
|
|
311
313
|
}
|
|
312
314
|
else if (sub === "reset" && args.includes("--hard")) {
|
|
313
|
-
c.lines.push(
|
|
315
|
+
c.lines.push(msg().permissions.preview.gitResetHard);
|
|
314
316
|
c.raise("danger");
|
|
315
317
|
}
|
|
316
318
|
}
|
|
@@ -321,7 +323,7 @@ function previewGit(argv, c) {
|
|
|
321
323
|
function previewBash(command, c, dangerous) {
|
|
322
324
|
const hit = matchDangerous(command);
|
|
323
325
|
if (hit !== undefined)
|
|
324
|
-
c.lines.push(
|
|
326
|
+
c.lines.push(msg().permissions.preview.dangerous(hit.description));
|
|
325
327
|
if (hit !== undefined || dangerous)
|
|
326
328
|
c.raise("danger");
|
|
327
329
|
const nested = collectNestedCommands(command);
|
|
@@ -336,7 +338,7 @@ function previewBash(command, c, dangerous) {
|
|
|
336
338
|
}
|
|
337
339
|
c.cwd = start;
|
|
338
340
|
if (nested.tooDeep) {
|
|
339
|
-
c.lines.push(
|
|
341
|
+
c.lines.push(msg().permissions.preview.tooDeep);
|
|
340
342
|
c.raise("warn");
|
|
341
343
|
}
|
|
342
344
|
}
|
|
@@ -347,55 +349,58 @@ function unread(abs, request, c, tool) {
|
|
|
347
349
|
const readFiles = request.context?.readFiles;
|
|
348
350
|
if (readFiles === undefined || readFiles.has(abs))
|
|
349
351
|
return;
|
|
350
|
-
c.lines.push(
|
|
352
|
+
c.lines.push(msg().permissions.preview.unread(tool));
|
|
351
353
|
c.raise("warn");
|
|
352
354
|
}
|
|
353
355
|
function previewWrite(input, request, c) {
|
|
354
356
|
const abs = resolvePath(String(input["path"] ?? ""), c.cwd);
|
|
355
357
|
const content = typeof input["content"] === "string" ? input["content"] : "";
|
|
356
|
-
const
|
|
358
|
+
const m = msg().permissions.preview;
|
|
359
|
+
const next = m.size(countLines(content), formatBytes(Buffer.byteLength(content, "utf8")));
|
|
357
360
|
const shown = displayPath(abs, c.root);
|
|
358
361
|
const info = tryStat(abs, true);
|
|
359
362
|
if (info === undefined) {
|
|
360
|
-
c.target(
|
|
363
|
+
c.target(m.writeNew(shown, next), { path: shown, exists: false });
|
|
361
364
|
return;
|
|
362
365
|
}
|
|
363
366
|
if (info.isDirectory()) {
|
|
364
|
-
c.target(
|
|
367
|
+
c.target(m.writeIsDir(shown), { path: `${shown}/`, exists: true });
|
|
365
368
|
c.raise("warn");
|
|
366
369
|
return;
|
|
367
370
|
}
|
|
368
371
|
const old = readSmall(abs, info);
|
|
369
|
-
const before = old === undefined ? formatBytes(info.size) :
|
|
370
|
-
c.target(
|
|
372
|
+
const before = old === undefined ? formatBytes(info.size) : m.size(countLines(old), formatBytes(info.size));
|
|
373
|
+
c.target(m.writeOverwrite(shown, before, next), { path: shown, exists: true, bytes: info.size });
|
|
371
374
|
unread(abs, request, c, "write");
|
|
372
375
|
}
|
|
373
376
|
function editFailure(message) {
|
|
377
|
+
const m = msg().permissions.preview;
|
|
374
378
|
const many = /^(\S+) matches (\d+) times/.exec(message);
|
|
375
379
|
if (many)
|
|
376
|
-
return
|
|
380
|
+
return m.editNotUnique(many[1], many[2]);
|
|
377
381
|
const missing = /^Could not find (\S+)/.exec(message);
|
|
378
382
|
if (missing)
|
|
379
|
-
return
|
|
383
|
+
return m.editNotFound(missing[1]);
|
|
380
384
|
if (message.includes("overlap"))
|
|
381
|
-
return
|
|
385
|
+
return m.editOverlap;
|
|
382
386
|
if (message.includes("no change"))
|
|
383
|
-
return
|
|
387
|
+
return m.editNoChange;
|
|
384
388
|
return message;
|
|
385
389
|
}
|
|
386
390
|
function previewEdit(input, request, c) {
|
|
391
|
+
const m = msg().permissions.preview;
|
|
387
392
|
const abs = resolvePath(String(input["path"] ?? ""), c.cwd);
|
|
388
393
|
const shown = displayPath(abs, c.root);
|
|
389
394
|
const info = tryStat(abs, true);
|
|
390
395
|
if (info === undefined || !info.isFile()) {
|
|
391
|
-
c.target(
|
|
396
|
+
c.target(m.editMissing(shown), { path: shown, exists: info !== undefined });
|
|
392
397
|
c.raise("warn");
|
|
393
398
|
return;
|
|
394
399
|
}
|
|
395
400
|
const target = { path: shown, exists: true, bytes: info.size };
|
|
396
401
|
const raw = readSmall(abs, info);
|
|
397
402
|
if (raw === undefined) {
|
|
398
|
-
c.target(
|
|
403
|
+
c.target(m.editTooLarge(shown, formatBytes(info.size)), target);
|
|
399
404
|
unread(abs, request, c, "edit");
|
|
400
405
|
return;
|
|
401
406
|
}
|
|
@@ -403,19 +408,18 @@ function previewEdit(input, request, c) {
|
|
|
403
408
|
const edits = Array.isArray(input["edits"]) ? input["edits"] : [];
|
|
404
409
|
try {
|
|
405
410
|
const plan = planEdits(content, edits, input["replaceAll"] === true);
|
|
406
|
-
|
|
407
|
-
c.target(`修改 ${shown}:${plan.replacements} 处替换${fuzzy}`, target);
|
|
411
|
+
c.target(m.editPlan(shown, plan.replacements, plan.fuzzy === true), target);
|
|
408
412
|
edits.slice(0, 5).forEach((e, i) => {
|
|
409
|
-
c.lines.push(
|
|
413
|
+
c.lines.push(m.editOp(i + 1, countLines(e.oldText), countLines(e.newText)));
|
|
410
414
|
});
|
|
411
415
|
if (edits.length > 5)
|
|
412
|
-
c.lines.push(
|
|
413
|
-
c.lines.push(
|
|
416
|
+
c.lines.push(m.editMore(edits.length - 5));
|
|
417
|
+
c.lines.push(m.editTotal(countLines(content), countLines(plan.result)));
|
|
414
418
|
}
|
|
415
419
|
catch (err) {
|
|
416
420
|
if (!(err instanceof EditError))
|
|
417
421
|
throw err;
|
|
418
|
-
c.target(
|
|
422
|
+
c.target(m.editDryRunFailed(shown, editFailure(err.message)), target);
|
|
419
423
|
c.raise("warn");
|
|
420
424
|
}
|
|
421
425
|
unread(abs, request, c, "edit");
|
|
@@ -449,7 +453,7 @@ export function previewAction(request, options) {
|
|
|
449
453
|
}
|
|
450
454
|
}
|
|
451
455
|
catch (err) {
|
|
452
|
-
c.lines.push(
|
|
456
|
+
c.lines.push(msg().permissions.preview.failed(err instanceof Error ? err.message : String(err)));
|
|
453
457
|
}
|
|
454
458
|
return c.finish(kind);
|
|
455
459
|
}
|
|
@@ -459,5 +463,8 @@ export function previewDisplayLines(preview, max = 10) {
|
|
|
459
463
|
return [];
|
|
460
464
|
if (preview.lines.length <= max)
|
|
461
465
|
return preview.lines;
|
|
462
|
-
return [
|
|
466
|
+
return [
|
|
467
|
+
...preview.lines.slice(0, max - 1),
|
|
468
|
+
msg().permissions.preview.moreLines(preview.lines.length - max + 1),
|
|
469
|
+
];
|
|
463
470
|
}
|
|
@@ -18,6 +18,7 @@ import { AmaError } from "../errors.js";
|
|
|
18
18
|
import { PERMISSION_MODES_STRICT_FIRST } from "./types.js";
|
|
19
19
|
import { globBody } from "../tools/glob.js";
|
|
20
20
|
import { expandHome, resolvePath, toPosix } from "../tools/paths.js";
|
|
21
|
+
import { memoryRuleMatches } from "./memory-class.js";
|
|
21
22
|
/** 内置缺省 deny 表(用户可经 `builtinDeny` 选项移除)。 */
|
|
22
23
|
export const BUILTIN_DENY_RULES = [
|
|
23
24
|
"write(**/.git/**)",
|
|
@@ -147,6 +148,8 @@ function matchesSubject(rule, toolName, input, cwd, command) {
|
|
|
147
148
|
return false;
|
|
148
149
|
if (rule.pattern === undefined)
|
|
149
150
|
return true;
|
|
151
|
+
if (toolName === "memory")
|
|
152
|
+
return memoryRuleMatches(rule.pattern, input); // [W6-M] 逻辑路径 / 命令名
|
|
150
153
|
if (command !== undefined)
|
|
151
154
|
return wildcardToRegExp(rule.pattern).test(command);
|
|
152
155
|
const abs = inputPath(toolName, input, cwd);
|
|
@@ -154,7 +157,7 @@ function matchesSubject(rule, toolName, input, cwd, command) {
|
|
|
154
157
|
}
|
|
155
158
|
/** 第一条命中的 deny 规则。 */
|
|
156
159
|
export function findDenyRule(rules, toolName, input, cwd) {
|
|
157
|
-
const command = inputCommand(input);
|
|
160
|
+
const command = toolName === "memory" ? undefined : inputCommand(input);
|
|
158
161
|
for (const rule of rules) {
|
|
159
162
|
if (rule.effect !== "deny")
|
|
160
163
|
continue;
|
|
@@ -172,7 +175,7 @@ export function findDenyRule(rules, toolName, input, cwd) {
|
|
|
172
175
|
/** 覆盖本次调用的 allow 规则(复合命令返回第一段的覆盖者);不覆盖返回 undefined。 */
|
|
173
176
|
export function findAllowRule(rules, toolName, input, cwd) {
|
|
174
177
|
const allows = rules.filter((r) => r.effect === "allow");
|
|
175
|
-
const command = inputCommand(input);
|
|
178
|
+
const command = toolName === "memory" ? undefined : inputCommand(input);
|
|
176
179
|
if (command === undefined)
|
|
177
180
|
return allows.find((r) => matchesSubject(r, toolName, input, cwd));
|
|
178
181
|
const unconditional = allows.find((r) => r.pattern === undefined && toolNameMatches(r.tool, toolName));
|
|
@@ -79,6 +79,8 @@ export interface ApprovalRequestContext {
|
|
|
79
79
|
* 无人值守拒绝),auto 分类器与模型都不参与;RPC `permission_request` 原样带出。
|
|
80
80
|
*/
|
|
81
81
|
origin?: ExternalPermissionOrigin;
|
|
82
|
+
/** [W6-C0] 触发审批的工具调用 id(`gateToolCall` 填;轨迹据此算 `approvalMs`)。 */
|
|
83
|
+
toolCallId?: string;
|
|
82
84
|
}
|
|
83
85
|
/** [W5-C0] 外部 Agent 权限选项的种类(ACP 词汇)。 */
|
|
84
86
|
export type ExternalPermissionOptionKind = "allow_once" | "allow_always" | "reject_once" | "reject_always";
|
|
@@ -109,6 +111,8 @@ export interface PermissionRequestContext {
|
|
|
109
111
|
taskId?: string;
|
|
110
112
|
/** 外部 Agent 的权限请求(对话框标 `[claude · 会话 abc1]`)。 */
|
|
111
113
|
origin?: ExternalPermissionOrigin;
|
|
114
|
+
/** [W6-C0] 触发审批的工具调用 id(本会话的 toolCallId;外部 Agent 的请求不带)。 */
|
|
115
|
+
toolCallId?: string;
|
|
112
116
|
}
|
|
113
117
|
/** [W3-C0] 预览涉及的路径(bash 的 rm / mv / 重定向目标,write / edit 的目标文件)。 */
|
|
114
118
|
export interface ActionPreviewTarget {
|
package/dist/plan/store.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
10
10
|
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
11
11
|
import { TODO_CUSTOM_TYPE, parseTodoState } from "../tools/todo.js";
|
|
12
|
+
import { msg } from "../i18n/index.js";
|
|
12
13
|
export const PLAN_CUSTOM_TYPE = "ama.plan";
|
|
13
14
|
export const PLAN_STATE_CUSTOM_TYPE = "ama.plan_state";
|
|
14
15
|
function customData(entry, customType) {
|
|
@@ -76,7 +77,7 @@ export function resolvePlanDirectory(configured, projectRoot, dataDir) {
|
|
|
76
77
|
if (rel.startsWith("..") || isAbsolute(rel)) {
|
|
77
78
|
return {
|
|
78
79
|
dir: fallback,
|
|
79
|
-
warning:
|
|
80
|
+
warning: msg().session.plan.directoryOutside(configured, projectRoot, fallback),
|
|
80
81
|
};
|
|
81
82
|
}
|
|
82
83
|
return { dir };
|
package/dist/rpc.d.ts
CHANGED
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
* get_tasks / get_agents`(返回形状见 `RpcW5Results`),客户端能力 `plans`(声明后计划审批交客户端);
|
|
17
17
|
* 新事件由 `SessionEvent` 派生自动包含。命令实现归 W5-F(C0 时返回 `not_implemented`),
|
|
18
18
|
* `RPC_PROTOCOL_VERSION` 不变。
|
|
19
|
+
* - [W6-C0] 第六波(docs/wave6-plan.md §2.6、§4.4):命令 `get_trace`(参数 `RpcGetTraceParams`、返回
|
|
20
|
+
* `RpcW6Results`,W6-T2 实现,之前回 `not_implemented`);事件 `quota_update`;`permission_request.context`
|
|
21
|
+
* 可带 `toolCallId`;`keySource` 可为 `oauth`。`RPC_PROTOCOL_VERSION` 不变。
|
|
19
22
|
*/
|
|
20
23
|
import type { AssistantEvent, ImageBlock, ModelThinkingLevel, Usage } from "./ai/types.js";
|
|
21
24
|
import type { PlanData, PlanDecisionKind, QueueMode, SessionEvent, TodoItemView } from "./agent/types.js";
|
|
@@ -23,6 +26,8 @@ import type { AgentInfo } from "./agents/types.js";
|
|
|
23
26
|
import type { TaskInfo } from "./tools/types.js";
|
|
24
27
|
import type { RewindRequest } from "./checkpoints/types.js";
|
|
25
28
|
import type { ApprovalDecision, PermissionMode } from "./permissions/types.js";
|
|
29
|
+
import type { TracePreview } from "./trace/preview.js";
|
|
30
|
+
import type { Trace, TraceSubagentNode } from "./trace/types.js";
|
|
26
31
|
export type { SessionEvent } from "./agent/types.js";
|
|
27
32
|
export declare const RPC_PROTOCOL_VERSION: 1;
|
|
28
33
|
/** `plans`(W5-C0):客户端声明后计划审批交给客户端(`plan_proposed` → `plan_response`)。 */
|
|
@@ -133,6 +138,38 @@ export interface RpcCommandMap {
|
|
|
133
138
|
get_todos: NoParams;
|
|
134
139
|
get_tasks: NoParams;
|
|
135
140
|
get_agents: NoParams;
|
|
141
|
+
get_trace: RpcGetTraceParams;
|
|
142
|
+
}
|
|
143
|
+
/** [W6-C0] `get_trace` 的参数。 */
|
|
144
|
+
export interface RpcGetTraceParams {
|
|
145
|
+
/** 缺省 leaf。 */
|
|
146
|
+
branch?: "leaf" | "all";
|
|
147
|
+
/** 尾部优先的回合数,缺省 50,上限 500。 */
|
|
148
|
+
turnLimit?: number;
|
|
149
|
+
/** 回合游标(turn id),向前翻页。 */
|
|
150
|
+
before?: string;
|
|
151
|
+
/** 条目游标(同 `get_entries.since`):只返回从包含该条目的回合起的回合。 */
|
|
152
|
+
since?: string;
|
|
153
|
+
/** 该任务的子轨迹(ama 子会话或外部骨架)。 */
|
|
154
|
+
taskId?: string;
|
|
155
|
+
/** 缺省 none(只有结构与数字)。 */
|
|
156
|
+
content?: "none" | "preview";
|
|
157
|
+
}
|
|
158
|
+
/** [W6-C0] 第六波命令成功时的 `data` 形状;错误 `task_not_found` / `invalid_arguments`。 */
|
|
159
|
+
export interface RpcW6Results {
|
|
160
|
+
get_trace: {
|
|
161
|
+
trace: Trace;
|
|
162
|
+
hasMoreBefore: boolean;
|
|
163
|
+
cursor: {
|
|
164
|
+
before?: string;
|
|
165
|
+
since: string;
|
|
166
|
+
};
|
|
167
|
+
leafId: string | null;
|
|
168
|
+
/** [W6-T2] `taskId` 时:子 Agent 节点本身(不含 `child`;外部 Agent 的骨架在 `external`)。 */
|
|
169
|
+
task?: TraceSubagentNode;
|
|
170
|
+
/** [W6-T2] `content:"preview"` 时:`<kind>:<id>` → 已脱敏、已截断的正文预览(只含窗口内节点)。 */
|
|
171
|
+
previews?: Record<string, TracePreview>;
|
|
172
|
+
};
|
|
136
173
|
}
|
|
137
174
|
/** [W5-C0] 计划审批的回答(与 `permission_response` 同构)。 */
|
|
138
175
|
export interface RpcPlanResponse {
|
|
@@ -179,7 +216,8 @@ export interface RpcModelInfo {
|
|
|
179
216
|
name: string;
|
|
180
217
|
/** 只报有无,不回密钥。 */
|
|
181
218
|
hasKey: boolean;
|
|
182
|
-
|
|
219
|
+
/** [W6-C0] 加 `oauth`(ChatGPT 登录,W6-O)。 */
|
|
220
|
+
keySource: "cli" | "auth-file" | "config" | "env" | "oauth" | "none";
|
|
183
221
|
contextWindow?: number;
|
|
184
222
|
maxTokens: number;
|
|
185
223
|
reasoning: boolean;
|