@armadra/agent 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +177 -304
- package/CHANGELOG.zh-CN.md +442 -0
- package/README.md +408 -364
- package/README.zh-CN.md +705 -0
- package/dist/agent/session-plan.js +2 -2
- package/dist/agent/session-state.d.ts +3 -0
- package/dist/agent/session-state.js +20 -0
- package/dist/agent/session-subagent.d.ts +15 -1
- package/dist/agent/session-subagent.js +26 -3
- package/dist/agent/session-telemetry.d.ts +16 -2
- package/dist/agent/session-telemetry.js +29 -7
- package/dist/agent/session-tools.js +5 -2
- package/dist/agent/session-trace-writer.d.ts +27 -0
- package/dist/agent/session-trace-writer.js +253 -0
- package/dist/agent/session.d.ts +2 -0
- package/dist/agent/session.js +12 -0
- package/dist/agent/subagent-direct.d.ts +20 -0
- package/dist/agent/subagent-direct.js +76 -0
- package/dist/agent/subagent-registry.d.ts +8 -1
- package/dist/agent/subagent-registry.js +28 -1
- package/dist/agent/system-prompt.d.ts +3 -1
- package/dist/agent/system-prompt.js +3 -0
- package/dist/agent/tool-runner.d.ts +2 -1
- package/dist/agent/tool-runner.js +5 -4
- package/dist/agent/types-w6.d.ts +39 -0
- package/dist/agent/types-w6.js +4 -0
- package/dist/agent/types.d.ts +5 -2
- package/dist/agents/external.js +1 -1
- package/dist/agents/task-record.d.ts +74 -1
- package/dist/agents/task-record.js +100 -0
- package/dist/ai/apis/cache-params.js +2 -1
- package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
- package/dist/ai/apis/chatgpt-backend.js +224 -0
- package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
- package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
- package/dist/ai/apis/openai-responses-request.d.ts +2 -1
- package/dist/ai/apis/openai-responses-request.js +8 -2
- package/dist/ai/apis/openai-responses.d.ts +2 -0
- package/dist/ai/apis/openai-responses.js +51 -16
- package/dist/ai/overflow.d.ts +1 -1
- package/dist/ai/overflow.js +10 -7
- package/dist/ai/providers/auth.d.ts +15 -2
- package/dist/ai/providers/auth.js +69 -2
- package/dist/ai/providers/builtin.js +27 -0
- package/dist/ai/providers/catalog-data.js +1 -0
- package/dist/ai/providers/enrich.js +2 -7
- package/dist/ai/providers/models-dev-cache.js +15 -19
- package/dist/ai/providers/models-dev-snapshot.js +8 -7
- package/dist/ai/providers/models-dev.js +5 -15
- package/dist/ai/providers/suggest.js +2 -16
- package/dist/ai/types.d.ts +27 -1
- package/dist/auth/chatgpt/backend-client.d.ts +26 -0
- package/dist/auth/chatgpt/backend-client.js +74 -0
- package/dist/auth/chatgpt/claims.d.ts +17 -0
- package/dist/auth/chatgpt/claims.js +46 -0
- package/dist/auth/chatgpt/cli.d.ts +33 -0
- package/dist/auth/chatgpt/cli.js +252 -0
- package/dist/auth/chatgpt/doctor.d.ts +17 -0
- package/dist/auth/chatgpt/doctor.js +36 -0
- package/dist/auth/chatgpt/host-id.d.ts +7 -0
- package/dist/auth/chatgpt/host-id.js +26 -0
- package/dist/auth/chatgpt/login.d.ts +30 -0
- package/dist/auth/chatgpt/login.js +130 -0
- package/dist/auth/chatgpt/presets.d.ts +66 -0
- package/dist/auth/chatgpt/presets.js +120 -0
- package/dist/auth/chatgpt/quota-text.d.ts +13 -0
- package/dist/auth/chatgpt/quota-text.js +36 -0
- package/dist/auth/oauth/browser.d.ts +12 -0
- package/dist/auth/oauth/browser.js +27 -0
- package/dist/auth/oauth/callback-server.d.ts +47 -0
- package/dist/auth/oauth/callback-server.js +147 -0
- package/dist/auth/oauth/flows.d.ts +62 -0
- package/dist/auth/oauth/flows.js +113 -0
- package/dist/auth/oauth/jwt.d.ts +24 -0
- package/dist/auth/oauth/jwt.js +81 -0
- package/dist/auth/oauth/live.d.ts +21 -0
- package/dist/auth/oauth/live.js +25 -0
- package/dist/auth/oauth/oidc.d.ts +26 -0
- package/dist/auth/oauth/oidc.js +72 -0
- package/dist/auth/oauth/pkce.d.ts +15 -0
- package/dist/auth/oauth/pkce.js +20 -0
- package/dist/auth/oauth/refresh.d.ts +35 -0
- package/dist/auth/oauth/refresh.js +129 -0
- package/dist/auth/oauth/token-client.d.ts +33 -0
- package/dist/auth/oauth/token-client.js +121 -0
- package/dist/auth/oauth/token-store.d.ts +23 -0
- package/dist/auth/oauth/token-store.js +125 -0
- package/dist/auth/testing/fake-oauth.d.ts +73 -0
- package/dist/auth/testing/fake-oauth.js +271 -0
- package/dist/auth/testing/refresh-child.d.ts +5 -0
- package/dist/auth/testing/refresh-child.js +16 -0
- package/dist/bundle/ama.cjs +25928 -11144
- package/dist/checkpoints/backend.js +6 -5
- package/dist/checkpoints/restore.js +3 -2
- package/dist/checkpoints/settings.js +2 -1
- package/dist/checkpoints/shadow-git.js +7 -6
- package/dist/checkpoints/shadow-restore.js +3 -2
- package/dist/checkpoints/tracker.js +4 -3
- package/dist/cli/args.d.ts +9 -2
- package/dist/cli/args.js +74 -27
- package/dist/cli/bootstrap.js +53 -31
- package/dist/cli/choice-prompt.js +8 -6
- package/dist/cli/codemode-notice.js +2 -2
- package/dist/cli/compose-agents.js +2 -1
- package/dist/cli/compose-extensions.js +2 -0
- package/dist/cli/compose-memory.d.ts +53 -0
- package/dist/cli/compose-memory.js +127 -0
- package/dist/cli/compose-providers.d.ts +5 -0
- package/dist/cli/compose-providers.js +32 -2
- package/dist/cli/compose-session.d.ts +5 -0
- package/dist/cli/compose-session.js +27 -13
- package/dist/cli/compose-store.d.ts +2 -0
- package/dist/cli/compose-store.js +9 -5
- package/dist/cli/compose.d.ts +2 -0
- package/dist/cli/compose.js +13 -5
- package/dist/cli/default-model.d.ts +0 -2
- package/dist/cli/default-model.js +5 -8
- package/dist/cli/deps.d.ts +5 -1
- package/dist/cli/exit-codes.d.ts +1 -1
- package/dist/cli/exit-codes.js +7 -16
- package/dist/cli/from-prompt.js +3 -2
- package/dist/cli/help-text.d.ts +2 -1
- package/dist/cli/help-text.js +5 -99
- package/dist/cli/main.d.ts +5 -0
- package/dist/cli/main.js +21 -2
- package/dist/cli/proxy.js +14 -9
- package/dist/cli/runtime.d.ts +5 -0
- package/dist/cli/startup-screen.js +20 -27
- package/dist/cli/startup-steps.js +6 -8
- package/dist/cli/subcommands/auth.d.ts +6 -3
- package/dist/cli/subcommands/auth.js +52 -22
- package/dist/cli/subcommands/config-set.d.ts +21 -0
- package/dist/cli/subcommands/config-set.js +137 -0
- package/dist/cli/subcommands/config.d.ts +2 -1
- package/dist/cli/subcommands/config.js +51 -37
- package/dist/cli/subcommands/doctor.d.ts +2 -1
- package/dist/cli/subcommands/doctor.js +97 -58
- package/dist/cli/subcommands/init.d.ts +1 -1
- package/dist/cli/subcommands/init.js +8 -7
- package/dist/cli/subcommands/memory.d.ts +18 -0
- package/dist/cli/subcommands/memory.js +189 -0
- package/dist/cli/subcommands/model-meta.js +11 -9
- package/dist/cli/subcommands/models-cache-probe.js +23 -20
- package/dist/cli/subcommands/models-discover.d.ts +3 -0
- package/dist/cli/subcommands/models-discover.js +44 -21
- package/dist/cli/subcommands/models.d.ts +1 -1
- package/dist/cli/subcommands/models.js +29 -22
- package/dist/cli/subcommands/probe-runner.js +8 -7
- package/dist/cli/subcommands/providers-list.js +32 -21
- package/dist/cli/subcommands/providers-plan.js +24 -25
- package/dist/cli/subcommands/providers-probe.js +5 -6
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +45 -50
- package/dist/cli/subcommands/sessions-export.d.ts +1 -1
- package/dist/cli/subcommands/sessions-export.js +10 -9
- package/dist/cli/subcommands/sessions-search.d.ts +1 -1
- package/dist/cli/subcommands/sessions-search.js +11 -10
- package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
- package/dist/cli/subcommands/sessions-trace.js +156 -0
- package/dist/cli/subcommands/sessions.d.ts +4 -3
- package/dist/cli/subcommands/sessions.js +40 -37
- package/dist/cli/subcommands/stats.d.ts +1 -1
- package/dist/cli/subcommands/stats.js +49 -30
- package/dist/cli/system-prompt-arg.js +3 -2
- package/dist/codemode/capability.js +3 -2
- package/dist/compaction/post-compact.d.ts +1 -0
- package/dist/compaction/post-compact.js +15 -1
- package/dist/compaction/prune-tier.d.ts +1 -1
- package/dist/compaction/prune-tier.js +3 -3
- package/dist/compaction/serialize.js +2 -1
- package/dist/config/auth-file.d.ts +12 -2
- package/dist/config/auth-file.js +32 -10
- package/dist/config/checker.js +12 -11
- package/dist/config/context-files.js +3 -2
- package/dist/config/edit.d.ts +106 -0
- package/dist/config/edit.js +350 -0
- package/dist/config/init.d.ts +4 -3
- package/dist/config/init.js +10 -18
- package/dist/config/json-schema.d.ts +2 -1
- package/dist/config/json-schema.js +101 -68
- package/dist/config/key-docs.d.ts +18 -7
- package/dist/config/key-docs.js +43 -128
- package/dist/config/load.js +7 -6
- package/dist/config/merge.d.ts +4 -1
- package/dist/config/merge.js +42 -22
- package/dist/config/paths.js +6 -5
- package/dist/config/profile.d.ts +5 -1
- package/dist/config/profile.js +7 -2
- package/dist/config/schema-w5.js +3 -2
- package/dist/config/schema-w6.d.ts +19 -0
- package/dist/config/schema-w6.js +115 -0
- package/dist/config/schema.js +34 -20
- package/dist/config/settings-registry.d.ts +78 -0
- package/dist/config/settings-registry.js +184 -0
- package/dist/config/types-w6.d.ts +109 -0
- package/dist/config/types-w6.js +19 -0
- package/dist/config/types.d.ts +11 -8
- package/dist/config/types.js +1 -0
- package/dist/drivers/acp/client.js +1 -1
- package/dist/drivers/acp/driver.js +13 -8
- package/dist/drivers/agents.js +4 -3
- package/dist/drivers/base.js +3 -2
- package/dist/drivers/host-runners.js +2 -1
- package/dist/drivers/native/claude-stream.js +12 -11
- package/dist/drivers/native/codex-app-server.js +17 -12
- package/dist/drivers/native/oneshot.js +8 -7
- package/dist/drivers/pool.js +1 -1
- package/dist/drivers/runner.d.ts +3 -1
- package/dist/drivers/runner.js +68 -20
- package/dist/drivers/turn.js +1 -1
- package/dist/hooks/config.js +3 -2
- package/dist/hooks/protocol.js +18 -12
- package/dist/host/api-impl.js +11 -10
- package/dist/host/loader.js +9 -8
- package/dist/host/types.d.ts +3 -0
- package/dist/i18n/catalog.d.ts +2169 -0
- package/dist/i18n/catalog.js +72 -0
- package/dist/i18n/format.d.ts +21 -0
- package/dist/i18n/format.js +58 -0
- package/dist/i18n/index.d.ts +58 -0
- package/dist/i18n/index.js +72 -0
- package/dist/i18n/messages/agents.d.ts +84 -0
- package/dist/i18n/messages/agents.js +85 -0
- package/dist/i18n/messages/approval.d.ts +99 -0
- package/dist/i18n/messages/approval.js +100 -0
- package/dist/i18n/messages/auth.d.ts +187 -0
- package/dist/i18n/messages/auth.js +189 -0
- package/dist/i18n/messages/cli-args.d.ts +46 -0
- package/dist/i18n/messages/cli-args.js +46 -0
- package/dist/i18n/messages/cli-help.d.ts +12 -0
- package/dist/i18n/messages/cli-help.js +244 -0
- package/dist/i18n/messages/cli.d.ts +336 -0
- package/dist/i18n/messages/cli.js +311 -0
- package/dist/i18n/messages/config-keys.d.ts +289 -0
- package/dist/i18n/messages/config-keys.js +292 -0
- package/dist/i18n/messages/config.d.ts +502 -0
- package/dist/i18n/messages/config.js +239 -0
- package/dist/i18n/messages/drivers.d.ts +123 -0
- package/dist/i18n/messages/drivers.js +124 -0
- package/dist/i18n/messages/errors.d.ts +83 -0
- package/dist/i18n/messages/errors.js +171 -0
- package/dist/i18n/messages/interactive-line.d.ts +61 -0
- package/dist/i18n/messages/interactive-line.js +69 -0
- package/dist/i18n/messages/interactive-startup.d.ts +103 -0
- package/dist/i18n/messages/interactive-startup.js +104 -0
- package/dist/i18n/messages/interactive-view.d.ts +140 -0
- package/dist/i18n/messages/interactive-view.js +141 -0
- package/dist/i18n/messages/interactive.d.ts +493 -0
- package/dist/i18n/messages/interactive.js +248 -0
- package/dist/i18n/messages/memory.d.ts +123 -0
- package/dist/i18n/messages/memory.js +128 -0
- package/dist/i18n/messages/panels.d.ts +190 -0
- package/dist/i18n/messages/panels.js +189 -0
- package/dist/i18n/messages/permissions.d.ts +126 -0
- package/dist/i18n/messages/permissions.js +151 -0
- package/dist/i18n/messages/plan.d.ts +123 -0
- package/dist/i18n/messages/plan.js +124 -0
- package/dist/i18n/messages/print.d.ts +86 -0
- package/dist/i18n/messages/print.js +91 -0
- package/dist/i18n/messages/report.d.ts +391 -0
- package/dist/i18n/messages/report.js +490 -0
- package/dist/i18n/messages/rewind.d.ts +198 -0
- package/dist/i18n/messages/rewind.js +217 -0
- package/dist/i18n/messages/session.d.ts +230 -0
- package/dist/i18n/messages/session.js +258 -0
- package/dist/i18n/messages/settings.d.ts +348 -0
- package/dist/i18n/messages/settings.js +336 -0
- package/dist/i18n/messages/subcommands-config.d.ts +111 -0
- package/dist/i18n/messages/subcommands-config.js +127 -0
- package/dist/i18n/messages/subcommands.d.ts +548 -0
- package/dist/i18n/messages/subcommands.js +474 -0
- package/dist/i18n/messages/trace.d.ts +243 -0
- package/dist/i18n/messages/trace.js +238 -0
- package/dist/i18n/types.d.ts +15 -0
- package/dist/i18n/types.js +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/memory/edit.d.ts +24 -0
- package/dist/memory/edit.js +63 -0
- package/dist/memory/frontmatter.d.ts +37 -0
- package/dist/memory/frontmatter.js +79 -0
- package/dist/memory/index.d.ts +28 -0
- package/dist/memory/index.js +126 -0
- package/dist/memory/lock.d.ts +17 -0
- package/dist/memory/lock.js +62 -0
- package/dist/memory/paths.d.ts +57 -0
- package/dist/memory/paths.js +175 -0
- package/dist/memory/report.d.ts +36 -0
- package/dist/memory/report.js +86 -0
- package/dist/memory/runtime.d.ts +42 -0
- package/dist/memory/runtime.js +36 -0
- package/dist/memory/secrets.d.ts +8 -0
- package/dist/memory/secrets.js +27 -0
- package/dist/memory/section.d.ts +28 -0
- package/dist/memory/section.js +59 -0
- package/dist/memory/store.d.ts +70 -0
- package/dist/memory/store.js +284 -0
- package/dist/memory/tool.d.ts +31 -0
- package/dist/memory/tool.js +94 -0
- package/dist/modes/acp/acp-events.js +2 -1
- package/dist/modes/acp/acp-server.js +13 -12
- package/dist/modes/commands-core.d.ts +11 -0
- package/dist/modes/commands-core.js +93 -62
- package/dist/modes/image-input.js +20 -6
- package/dist/modes/interactive/agent-bar.d.ts +95 -0
- package/dist/modes/interactive/agent-bar.js +248 -0
- package/dist/modes/interactive/agent-panels.js +27 -26
- package/dist/modes/interactive/agent-transcript.d.ts +47 -0
- package/dist/modes/interactive/agent-transcript.js +191 -0
- package/dist/modes/interactive/agent-ui.d.ts +36 -1
- package/dist/modes/interactive/agent-ui.js +180 -14
- package/dist/modes/interactive/agent-view.d.ts +72 -0
- package/dist/modes/interactive/agent-view.js +281 -0
- package/dist/modes/interactive/approval-dialog.js +46 -34
- package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
- package/dist/modes/interactive/clipboard-paste.js +9 -4
- package/dist/modes/interactive/commands.d.ts +19 -1
- package/dist/modes/interactive/commands.js +84 -40
- package/dist/modes/interactive/completion.js +2 -1
- package/dist/modes/interactive/config-panel.d.ts +70 -0
- package/dist/modes/interactive/config-panel.js +319 -0
- package/dist/modes/interactive/config-ui.d.ts +96 -0
- package/dist/modes/interactive/config-ui.js +397 -0
- package/dist/modes/interactive/confirm-dialog.js +6 -7
- package/dist/modes/interactive/event-notices.js +11 -9
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.js +19 -22
- package/dist/modes/interactive/key-dispatch.d.ts +12 -0
- package/dist/modes/interactive/key-dispatch.js +24 -9
- package/dist/modes/interactive/line/line-editor.js +2 -1
- package/dist/modes/interactive/line/line-mode.js +18 -7
- package/dist/modes/interactive/line/line-render.js +25 -24
- package/dist/modes/interactive/memory-panel.d.ts +64 -0
- package/dist/modes/interactive/memory-panel.js +221 -0
- package/dist/modes/interactive/message-view.d.ts +4 -2
- package/dist/modes/interactive/message-view.js +42 -33
- package/dist/modes/interactive/panels.js +39 -31
- package/dist/modes/interactive/pickers.d.ts +2 -1
- package/dist/modes/interactive/pickers.js +10 -6
- package/dist/modes/interactive/plan-command.d.ts +1 -1
- package/dist/modes/interactive/plan-command.js +24 -27
- package/dist/modes/interactive/plan-dialog.js +18 -17
- package/dist/modes/interactive/plan-flow.js +6 -5
- package/dist/modes/interactive/rewind-command.d.ts +1 -1
- package/dist/modes/interactive/rewind-command.js +18 -16
- package/dist/modes/interactive/rewind-flow.d.ts +0 -1
- package/dist/modes/interactive/rewind-flow.js +13 -14
- package/dist/modes/interactive/rewind-list.js +7 -6
- package/dist/modes/interactive/rewind-panel.js +40 -40
- package/dist/modes/interactive/rewind-text.d.ts +5 -3
- package/dist/modes/interactive/rewind-text.js +48 -38
- package/dist/modes/interactive/run-indicator.js +15 -12
- package/dist/modes/interactive/session-events.js +3 -2
- package/dist/modes/interactive/startup-header.js +22 -23
- package/dist/modes/interactive/startup-ui.js +38 -30
- package/dist/modes/interactive/status-area.d.ts +2 -0
- package/dist/modes/interactive/status-area.js +8 -2
- package/dist/modes/interactive/status-bar.js +4 -3
- package/dist/modes/interactive/subagent-view.js +9 -7
- package/dist/modes/interactive/tasks-report.d.ts +6 -0
- package/dist/modes/interactive/tasks-report.js +28 -31
- package/dist/modes/interactive/terminal-setup.d.ts +9 -0
- package/dist/modes/interactive/terminal-setup.js +23 -0
- package/dist/modes/interactive/tool-summary.js +19 -17
- package/dist/modes/interactive/tool-view.js +7 -4
- package/dist/modes/interactive/trace-view.d.ts +89 -0
- package/dist/modes/interactive/trace-view.js +332 -0
- package/dist/modes/print/print-mode.js +14 -15
- package/dist/modes/rpc/commands.js +7 -3
- package/dist/modes/rpc/rpc-mode.js +9 -3
- package/dist/modes/session-report.d.ts +2 -0
- package/dist/modes/session-report.js +101 -105
- package/dist/modes/startup-ui-text.js +11 -6
- package/dist/permissions/bypass.d.ts +8 -10
- package/dist/permissions/bypass.js +19 -10
- package/dist/permissions/memory-class.d.ts +23 -0
- package/dist/permissions/memory-class.js +54 -0
- package/dist/permissions/modes.d.ts +3 -3
- package/dist/permissions/modes.js +21 -16
- package/dist/permissions/pipeline.d.ts +1 -1
- package/dist/permissions/pipeline.js +9 -2
- package/dist/permissions/preview.js +49 -42
- package/dist/permissions/rules.js +5 -2
- package/dist/permissions/types.d.ts +4 -0
- package/dist/plan/store.js +2 -1
- package/dist/rpc.d.ts +39 -1
- package/dist/rpc.js +3 -0
- package/dist/sandbox/bash.js +11 -8
- package/dist/sandbox/detect.js +14 -11
- package/dist/sdk.d.ts +17 -1
- package/dist/sdk.js +29 -7
- package/dist/session/export.js +31 -30
- package/dist/session/manager.d.ts +1 -1
- package/dist/session/manager.js +5 -3
- package/dist/session/reuse.js +5 -4
- package/dist/session/scan.js +3 -2
- package/dist/session/stats-aggregate.d.ts +3 -1
- package/dist/session/stats-aggregate.js +5 -1
- package/dist/session/stats-index.js +2 -1
- package/dist/session/stats-scan.d.ts +4 -1
- package/dist/session/stats-scan.js +6 -2
- package/dist/session/store.d.ts +11 -0
- package/dist/session/store.js +48 -1
- package/dist/session/types.d.ts +2 -0
- package/dist/skills/builtin.js +2 -1
- package/dist/tools/image-file.d.ts +26 -1
- package/dist/tools/image-file.js +55 -13
- package/dist/tools/presets.d.ts +14 -1
- package/dist/tools/presets.js +3 -3
- package/dist/tools/registry.js +1 -1
- package/dist/tools/truncate.d.ts +1 -1
- package/dist/tools/truncate.js +2 -2
- package/dist/tools/types.d.ts +17 -1
- package/dist/trace/build-index.d.ts +91 -0
- package/dist/trace/build-index.js +127 -0
- package/dist/trace/build-nodes.d.ts +24 -0
- package/dist/trace/build-nodes.js +279 -0
- package/dist/trace/build-util.d.ts +43 -0
- package/dist/trace/build-util.js +120 -0
- package/dist/trace/build.d.ts +82 -0
- package/dist/trace/build.js +382 -0
- package/dist/trace/detail.d.ts +35 -0
- package/dist/trace/detail.js +205 -0
- package/dist/trace/flatten.d.ts +69 -0
- package/dist/trace/flatten.js +173 -0
- package/dist/trace/format.d.ts +47 -0
- package/dist/trace/format.js +329 -0
- package/dist/trace/html-template.d.ts +19 -0
- package/dist/trace/html-template.js +150 -0
- package/dist/trace/html.d.ts +104 -0
- package/dist/trace/html.js +292 -0
- package/dist/trace/preview.d.ts +29 -0
- package/dist/trace/preview.js +59 -0
- package/dist/trace/query-session.d.ts +14 -0
- package/dist/trace/query-session.js +38 -0
- package/dist/trace/query.d.ts +55 -0
- package/dist/trace/query.js +188 -0
- package/dist/trace/session.d.ts +40 -0
- package/dist/trace/session.js +168 -0
- package/dist/trace/types.d.ts +243 -0
- package/dist/trace/types.js +13 -0
- package/dist/tui/components/editor-paste.d.ts +2 -0
- package/dist/tui/components/editor-paste.js +6 -3
- package/dist/tui/components/editor.js +2 -2
- package/dist/tui/components/loader.d.ts +3 -0
- package/dist/tui/components/loader.js +14 -0
- package/dist/tui/components/settings-list.d.ts +61 -0
- package/dist/tui/components/settings-list.js +135 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +17 -5
- package/dist/tui.d.ts +1 -0
- package/dist/tui.js +2 -0
- package/docs/en/host-api.md +167 -0
- package/docs/en/permissions.md +214 -0
- package/docs/en/providers.md +625 -0
- package/docs/en/rpc.md +361 -0
- package/docs/en/sessions.md +219 -0
- package/docs/en/tui.md +527 -0
- package/docs/host-api.md +18 -17
- package/docs/memory.md +172 -0
- package/docs/permissions.md +2 -2
- package/docs/providers.md +67 -1
- package/docs/rpc.md +31 -3
- package/docs/session-format.md +8 -2
- package/docs/sessions.md +29 -1
- package/docs/tui.md +132 -3
- package/package.json +8 -3
|
@@ -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;
|
package/dist/rpc.js
CHANGED
|
@@ -16,5 +16,8 @@
|
|
|
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
|
export const RPC_PROTOCOL_VERSION = 1;
|
package/dist/sandbox/bash.js
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import { homedir, tmpdir } from "node:os";
|
|
14
14
|
import { isAbsolute, join, resolve } from "node:path";
|
|
15
15
|
import { wrapCommand } from "./wrap.js";
|
|
16
|
+
import { msg } from "../i18n/index.js";
|
|
16
17
|
export const DEFAULT_BASH_SANDBOX_MODE = "off";
|
|
17
18
|
export const DEFAULT_SANDBOX_NETWORK = "deny";
|
|
18
19
|
export const NO_BASH_SANDBOX = Object.freeze({
|
|
@@ -21,12 +22,16 @@ export const NO_BASH_SANDBOX = Object.freeze({
|
|
|
21
22
|
kind: "none",
|
|
22
23
|
isolatesNetwork: false,
|
|
23
24
|
restrictsWrites: false,
|
|
24
|
-
detail
|
|
25
|
+
get detail() {
|
|
26
|
+
return msg().session.sandbox.notConfigured;
|
|
27
|
+
},
|
|
25
28
|
}),
|
|
26
29
|
network: DEFAULT_SANDBOX_NETWORK,
|
|
27
30
|
writable: [],
|
|
28
31
|
hidden: [],
|
|
29
|
-
detail
|
|
32
|
+
get detail() {
|
|
33
|
+
return msg().session.sandbox.notConfigured;
|
|
34
|
+
},
|
|
30
35
|
});
|
|
31
36
|
/** 用户主目录下的凭据路径(与 permissions/protected.ts 的机密路径同一批)。 */
|
|
32
37
|
export const HIDDEN_HOME_PATHS = [
|
|
@@ -66,16 +71,14 @@ export function resolveBashSandbox(config, deps) {
|
|
|
66
71
|
const active = mode === "auto" && usable && status.restrictsWrites;
|
|
67
72
|
let detail;
|
|
68
73
|
if (mode === "off")
|
|
69
|
-
detail =
|
|
74
|
+
detail = msg().session.sandbox.bashOff;
|
|
70
75
|
else if (!active)
|
|
71
76
|
detail =
|
|
72
77
|
status.kind === "unshare"
|
|
73
|
-
?
|
|
74
|
-
:
|
|
78
|
+
? msg().session.sandbox.bashUnshareOnly
|
|
79
|
+
: msg().session.sandbox.bashUnavailable(status.detail);
|
|
75
80
|
else
|
|
76
|
-
detail =
|
|
77
|
-
`${status.kind},网络 ${network},可写:工作区、临时目录、输出目录` +
|
|
78
|
-
(writable.length > 0 ? `、${writable.join("、")}` : "");
|
|
81
|
+
detail = msg().session.sandbox.bashActive(status.kind, network, writable);
|
|
79
82
|
return { active, status, network, writable, hidden, detail };
|
|
80
83
|
}
|
|
81
84
|
/** 一次 bash 调用的沙箱策略(路径未 realpath,wrapCommand 再解析)。 */
|
package/dist/sandbox/detect.js
CHANGED
|
@@ -13,11 +13,14 @@ import { spawnSync } from "node:child_process";
|
|
|
13
13
|
import { accessSync, constants } from "node:fs";
|
|
14
14
|
import { posix, win32 } from "node:path";
|
|
15
15
|
import { buildBwrapArgs, buildSbplProfile, buildUnshareArgs, } from "./profile.js";
|
|
16
|
+
import { msg } from "../i18n/index.js";
|
|
16
17
|
export const NO_OS_SANDBOX = Object.freeze({
|
|
17
18
|
kind: "none",
|
|
18
19
|
isolatesNetwork: false,
|
|
19
20
|
restrictsWrites: false,
|
|
20
|
-
detail
|
|
21
|
+
get detail() {
|
|
22
|
+
return msg().session.sandbox.noOsSandbox;
|
|
23
|
+
},
|
|
21
24
|
});
|
|
22
25
|
export const SANDBOX_EXEC_PATH = "/usr/bin/sandbox-exec";
|
|
23
26
|
export const PROBE_TIMEOUT_MS = 5000;
|
|
@@ -67,10 +70,10 @@ export function resolveSandboxEnabled(configured, env = process.env) {
|
|
|
67
70
|
/** 不缓存的探测(测试注入 deps)。 */
|
|
68
71
|
export function probeOsSandbox(enabled, deps = REAL_PROBE_DEPS) {
|
|
69
72
|
if (enabled === "off")
|
|
70
|
-
return { ...NO_OS_SANDBOX, detail:
|
|
73
|
+
return { ...NO_OS_SANDBOX, detail: msg().session.sandbox.disabled };
|
|
71
74
|
if (deps.platform === "darwin") {
|
|
72
75
|
if (!deps.isExecutable(SANDBOX_EXEC_PATH))
|
|
73
|
-
return { ...NO_OS_SANDBOX, detail:
|
|
76
|
+
return { ...NO_OS_SANDBOX, detail: msg().session.sandbox.missing(SANDBOX_EXEC_PATH) };
|
|
74
77
|
const code = deps.run(SANDBOX_EXEC_PATH, [
|
|
75
78
|
"-p",
|
|
76
79
|
buildSbplProfile(PROBE_POLICY),
|
|
@@ -86,7 +89,7 @@ export function probeOsSandbox(enabled, deps = REAL_PROBE_DEPS) {
|
|
|
86
89
|
};
|
|
87
90
|
return {
|
|
88
91
|
...NO_OS_SANDBOX,
|
|
89
|
-
detail:
|
|
92
|
+
detail: msg().session.sandbox.sandboxExecFailed(code),
|
|
90
93
|
};
|
|
91
94
|
}
|
|
92
95
|
if (deps.platform === "linux") {
|
|
@@ -102,10 +105,10 @@ export function probeOsSandbox(enabled, deps = REAL_PROBE_DEPS) {
|
|
|
102
105
|
restrictsWrites: true,
|
|
103
106
|
detail: "Linux bubblewrap",
|
|
104
107
|
};
|
|
105
|
-
failures.push(
|
|
108
|
+
failures.push(msg().session.sandbox.bwrapFailed(code));
|
|
106
109
|
}
|
|
107
110
|
else
|
|
108
|
-
failures.push(
|
|
111
|
+
failures.push(msg().session.sandbox.noBwrap);
|
|
109
112
|
const unshare = findExecutable("unshare", deps.env, deps.isExecutable, deps.platform);
|
|
110
113
|
if (unshare !== undefined) {
|
|
111
114
|
const code = deps.run(unshare, [...buildUnshareArgs(), "true"]);
|
|
@@ -115,15 +118,15 @@ export function probeOsSandbox(enabled, deps = REAL_PROBE_DEPS) {
|
|
|
115
118
|
path: unshare,
|
|
116
119
|
isolatesNetwork: true,
|
|
117
120
|
restrictsWrites: false,
|
|
118
|
-
detail:
|
|
121
|
+
detail: msg().session.sandbox.unshareOnly(failures),
|
|
119
122
|
};
|
|
120
|
-
failures.push(
|
|
123
|
+
failures.push(msg().session.sandbox.unshareFailed(code));
|
|
121
124
|
}
|
|
122
125
|
else
|
|
123
|
-
failures.push(
|
|
124
|
-
return { ...NO_OS_SANDBOX, detail: failures
|
|
126
|
+
failures.push(msg().session.sandbox.noUnshare);
|
|
127
|
+
return { ...NO_OS_SANDBOX, detail: msg().session.sandbox.failures(failures) };
|
|
125
128
|
}
|
|
126
|
-
return { ...NO_OS_SANDBOX, detail:
|
|
129
|
+
return { ...NO_OS_SANDBOX, detail: msg().session.sandbox.unsupportedPlatform(deps.platform) };
|
|
127
130
|
}
|
|
128
131
|
const cache = new Map();
|
|
129
132
|
let configured;
|
package/dist/sdk.d.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* - [W5-F] 计划(docs/plan.md):`CreateSessionOptions.plan`(plan.* 配置 + `onProposed` 审批回调);
|
|
14
14
|
* 返回的会话带 `plan.current() / respond() / todos()`。没有 `onProposed` 时按 `plan.unattended`
|
|
15
15
|
* (缺省 stop:计划落盘后停下,不替人批准)。
|
|
16
|
+
* - [W6-C0] `language`(两个入口都有):界面语言,跟随宿主界面(docs/i18n.md);进程级,`AMA_LANG` 仍优先。
|
|
16
17
|
*/
|
|
17
18
|
import type { ApiRegistry } from "./ai/apis/api.js";
|
|
18
19
|
import type { ModelThinkingLevel, ProviderData } from "./ai/types.js";
|
|
@@ -23,7 +24,9 @@ import type { PlanConfig } from "./config/types-w5.js";
|
|
|
23
24
|
import { type LogFn } from "./cli/compose-session.js";
|
|
24
25
|
import { type ComposeOptions } from "./cli/compose.js";
|
|
25
26
|
import type { Runtime } from "./cli/runtime.js";
|
|
26
|
-
import { type AmaConfig, type ToolsPresetInput } from "./config/types.js";
|
|
27
|
+
import { type AmaConfig, type ProfileMemoryOptions, type ToolsPresetInput } from "./config/types.js";
|
|
28
|
+
import type { Trace, TraceOptions } from "./trace/types.js";
|
|
29
|
+
import { type Locale } from "./i18n/index.js";
|
|
27
30
|
import type { HookConfig } from "./hooks/types.js";
|
|
28
31
|
import type { InstructionSource } from "./host/types.js";
|
|
29
32
|
import type { ApprovalDecision, ApprovalRequest, PermissionMode } from "./permissions/types.js";
|
|
@@ -53,6 +56,10 @@ export interface RuntimeOptions {
|
|
|
53
56
|
stderr?: (text: string) => void;
|
|
54
57
|
/** 组装根选项:追加供应商 / 协议 / 工具 / 工具工厂。 */
|
|
55
58
|
compose?: ComposeOptions;
|
|
59
|
+
/** [W6-C0] 界面语言(等价 `--lang`);进程级。 */
|
|
60
|
+
language?: Locale;
|
|
61
|
+
/** [W6-C0] 记忆开关(等价 `--memory` / `--no-memory`;W6-M 实现)。 */
|
|
62
|
+
memory?: boolean;
|
|
56
63
|
}
|
|
57
64
|
export declare function createRuntime(options?: RuntimeOptions): Promise<Runtime>;
|
|
58
65
|
/** [W5-F] 计划:类型与 RPC 同形(`plan_proposed` / `plan_response`)。 */
|
|
@@ -74,6 +81,8 @@ export interface SessionPlanApi {
|
|
|
74
81
|
}
|
|
75
82
|
export type SdkAgentSession = AgentSessionImpl & {
|
|
76
83
|
readonly plan: SessionPlanApi;
|
|
84
|
+
/** [W6-C0] 本会话的轨迹([W6-T2] 实现,见 trace/query-session.ts)。 */
|
|
85
|
+
trace?(options?: TraceOptions): Trace;
|
|
77
86
|
};
|
|
78
87
|
export type SessionAuth = {
|
|
79
88
|
kind: "file";
|
|
@@ -131,5 +140,12 @@ export interface CreateSessionOptions {
|
|
|
131
140
|
unattended?: boolean;
|
|
132
141
|
onWarning?: (message: string) => void;
|
|
133
142
|
log?: LogFn;
|
|
143
|
+
/** [W6-C0] 界面语言(跟随宿主界面);进程级,`AMA_LANG` 仍优先。不影响发给模型的文本。 */
|
|
144
|
+
language?: Locale;
|
|
145
|
+
/**
|
|
146
|
+
* [W6-C0] 记忆(W6-M 实现,D11):缺省禁用;`enabled: true` 时 `dir` 必填(按工作空间隔离的绝对路径),
|
|
147
|
+
* 作用域只有 workspace,不读用户级记忆。
|
|
148
|
+
*/
|
|
149
|
+
memory?: ProfileMemoryOptions;
|
|
134
150
|
}
|
|
135
151
|
export declare function createAgentSession(options?: CreateSessionOptions): Promise<SdkAgentSession>;
|