@armadra/agent 0.4.0 → 0.5.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 +184 -1
- package/README.md +202 -83
- package/THIRD_PARTY_NOTICES.md +34 -0
- package/dist/acp.d.ts +18 -0
- package/dist/acp.js +19 -0
- package/dist/agent/limits.d.ts +38 -0
- package/dist/agent/limits.js +127 -0
- package/dist/agent/loop-guard.d.ts +38 -0
- package/dist/agent/loop-guard.js +95 -0
- package/dist/agent/loop.d.ts +4 -0
- package/dist/agent/loop.js +7 -0
- package/dist/agent/prompt-rules.d.ts +12 -0
- package/dist/agent/prompt-rules.js +18 -0
- package/dist/agent/reminders.d.ts +59 -0
- package/dist/agent/reminders.js +327 -0
- package/dist/agent/session-cache.d.ts +5 -0
- package/dist/agent/session-cache.js +17 -1
- package/dist/agent/session-classifier.d.ts +1 -1
- package/dist/agent/session-classifier.js +3 -1
- package/dist/agent/session-compaction.d.ts +35 -6
- package/dist/agent/session-compaction.js +157 -31
- package/dist/agent/session-core.d.ts +27 -1
- package/dist/agent/session-extensions.d.ts +61 -0
- package/dist/agent/session-extensions.js +129 -0
- package/dist/agent/session-images.d.ts +23 -0
- package/dist/agent/session-images.js +97 -0
- package/dist/agent/session-plan.d.ts +21 -0
- package/dist/agent/session-plan.js +524 -0
- package/dist/agent/session-rewind.d.ts +81 -0
- package/dist/agent/session-rewind.js +354 -0
- package/dist/agent/session-run.d.ts +28 -1
- package/dist/agent/session-run.js +157 -6
- package/dist/agent/session-settings.d.ts +49 -0
- package/dist/agent/session-settings.js +95 -0
- package/dist/agent/session-subagent.d.ts +36 -24
- package/dist/agent/session-subagent.js +259 -129
- package/dist/agent/session-sync.d.ts +10 -3
- package/dist/agent/session-sync.js +37 -8
- package/dist/agent/session-telemetry.d.ts +39 -0
- package/dist/agent/session-telemetry.js +231 -0
- package/dist/agent/session-tools.js +40 -1
- package/dist/agent/session.d.ts +30 -29
- package/dist/agent/session.js +79 -123
- package/dist/agent/subagent-registry.d.ts +91 -0
- package/dist/agent/subagent-registry.js +494 -0
- package/dist/agent/system-prompt.d.ts +6 -3
- package/dist/agent/system-prompt.js +7 -2
- package/dist/agent/tool-runner.d.ts +8 -1
- package/dist/agent/tool-runner.js +57 -4
- package/dist/agent/types-w5.d.ts +192 -0
- package/dist/agent/types-w5.js +10 -0
- package/dist/agent/types.d.ts +47 -4
- package/dist/agent/types.js +2 -0
- package/dist/agent/worktree.d.ts +36 -0
- package/dist/agent/worktree.js +86 -0
- package/dist/agents/builtin.d.ts +14 -0
- package/dist/agents/builtin.js +39 -0
- package/dist/agents/catalog.d.ts +43 -0
- package/dist/agents/catalog.js +82 -0
- package/dist/agents/discover.d.ts +35 -0
- package/dist/agents/discover.js +83 -0
- package/dist/agents/external.d.ts +82 -0
- package/dist/agents/external.js +326 -0
- package/dist/agents/parse.d.ts +18 -0
- package/dist/agents/parse.js +116 -0
- package/dist/agents/result.d.ts +32 -0
- package/dist/agents/result.js +67 -0
- package/dist/agents/task-control.d.ts +17 -0
- package/dist/agents/task-control.js +17 -0
- package/dist/agents/task-record.d.ts +78 -0
- package/dist/agents/task-record.js +141 -0
- package/dist/agents/types.d.ts +46 -0
- package/dist/agents/types.js +8 -0
- package/dist/ai/apis/anthropic-compat.d.ts +36 -0
- package/dist/ai/apis/anthropic-compat.js +92 -0
- package/dist/ai/apis/anthropic-request.d.ts +7 -6
- package/dist/ai/apis/anthropic-request.js +10 -28
- package/dist/ai/apis/cache-params.d.ts +11 -2
- package/dist/ai/apis/cache-params.js +25 -6
- package/dist/ai/apis/openai-compat.d.ts +4 -1
- package/dist/ai/apis/openai-compat.js +8 -1
- package/dist/ai/image-limits.d.ts +45 -0
- package/dist/ai/image-limits.js +68 -0
- package/dist/ai/providers/builtin.d.ts +18 -6
- package/dist/ai/providers/builtin.js +135 -6
- package/dist/ai/providers/catalog-data.js +17 -13
- package/dist/ai/providers/catalog.d.ts +60 -7
- package/dist/ai/providers/catalog.js +197 -38
- package/dist/ai/providers/channels.d.ts +33 -3
- package/dist/ai/providers/channels.js +108 -7
- package/dist/ai/providers/enrich.d.ts +6 -3
- package/dist/ai/providers/enrich.js +19 -4
- package/dist/ai/providers/models-dev-cache.d.ts +28 -24
- package/dist/ai/providers/models-dev-cache.js +92 -78
- package/dist/ai/providers/models-dev-data.d.ts +7 -0
- package/dist/ai/providers/models-dev-data.js +32 -0
- package/dist/ai/providers/models-dev-snapshot.d.ts +50 -0
- package/dist/ai/providers/models-dev-snapshot.js +137 -0
- package/dist/ai/providers/models-dev.d.ts +51 -10
- package/dist/ai/providers/models-dev.js +132 -39
- package/dist/ai/providers/registry.d.ts +20 -10
- package/dist/ai/providers/registry.js +82 -43
- package/dist/ai/types.d.ts +28 -2
- package/dist/ai/types.js +5 -0
- package/dist/bundle/ama.cjs +37605 -21619
- package/dist/checkpoints/backend.d.ts +61 -0
- package/dist/checkpoints/backend.js +135 -0
- package/dist/checkpoints/blobs.d.ts +60 -0
- package/dist/checkpoints/blobs.js +203 -0
- package/dist/checkpoints/gc.d.ts +47 -0
- package/dist/checkpoints/gc.js +144 -0
- package/dist/checkpoints/git-head.d.ts +15 -0
- package/dist/checkpoints/git-head.js +89 -0
- package/dist/checkpoints/index.d.ts +17 -0
- package/dist/checkpoints/index.js +17 -0
- package/dist/checkpoints/replay.d.ts +48 -0
- package/dist/checkpoints/replay.js +154 -0
- package/dist/checkpoints/restore.d.ts +86 -0
- package/dist/checkpoints/restore.js +263 -0
- package/dist/checkpoints/settings.d.ts +14 -0
- package/dist/checkpoints/settings.js +23 -0
- package/dist/checkpoints/shadow-git.d.ts +108 -0
- package/dist/checkpoints/shadow-git.js +491 -0
- package/dist/checkpoints/shadow-restore.d.ts +25 -0
- package/dist/checkpoints/shadow-restore.js +128 -0
- package/dist/checkpoints/tracker.d.ts +64 -0
- package/dist/checkpoints/tracker.js +192 -0
- package/dist/checkpoints/types.d.ts +99 -0
- package/dist/checkpoints/types.js +12 -0
- package/dist/cli/args.d.ts +8 -4
- package/dist/cli/args.js +17 -97
- package/dist/cli/bootstrap.js +13 -1
- package/dist/cli/choice-prompt.d.ts +58 -0
- package/dist/cli/choice-prompt.js +140 -0
- package/dist/cli/codemode-notice.d.ts +3 -2
- package/dist/cli/codemode-notice.js +3 -2
- package/dist/cli/compose-agents.d.ts +27 -0
- package/dist/cli/compose-agents.js +111 -0
- package/dist/cli/compose-extensions.d.ts +29 -0
- package/dist/cli/compose-extensions.js +44 -0
- package/dist/cli/compose-session.d.ts +3 -0
- package/dist/cli/compose-session.js +47 -4
- package/dist/cli/compose.d.ts +3 -0
- package/dist/cli/compose.js +33 -6
- package/dist/cli/deps.d.ts +6 -0
- package/dist/cli/exit-codes.d.ts +10 -0
- package/dist/cli/exit-codes.js +12 -0
- package/dist/cli/help-text.d.ts +4 -0
- package/dist/cli/help-text.js +102 -0
- package/dist/cli/startup-screen.js +5 -3
- package/dist/cli/startup-steps.js +7 -1
- package/dist/cli/subcommands/config.d.ts +4 -1
- package/dist/cli/subcommands/config.js +17 -6
- package/dist/cli/subcommands/doctor.js +21 -0
- package/dist/cli/subcommands/models-cache-probe.d.ts +1 -1
- package/dist/cli/subcommands/models-cache-probe.js +3 -12
- package/dist/cli/subcommands/models-discover.js +5 -6
- package/dist/cli/subcommands/models.d.ts +2 -0
- package/dist/cli/subcommands/models.js +33 -14
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +8 -15
- package/dist/cli/subcommands/sessions.d.ts +3 -1
- package/dist/cli/subcommands/sessions.js +36 -2
- package/dist/codemode/capability.d.ts +24 -7
- package/dist/codemode/capability.js +38 -10
- package/dist/codemode/host-side.d.ts +14 -0
- package/dist/codemode/host-side.js +24 -1
- package/dist/codemode/tool.d.ts +1 -1
- package/dist/codemode/tool.js +6 -4
- package/dist/compaction/breaker.d.ts +25 -9
- package/dist/compaction/breaker.js +47 -17
- package/dist/compaction/estimate.d.ts +11 -3
- package/dist/compaction/estimate.js +64 -22
- package/dist/compaction/image-budget.d.ts +45 -0
- package/dist/compaction/image-budget.js +115 -0
- package/dist/compaction/post-compact.d.ts +38 -0
- package/dist/compaction/post-compact.js +152 -0
- package/dist/compaction/protect.d.ts +27 -0
- package/dist/compaction/protect.js +56 -0
- package/dist/compaction/prune-tier.d.ts +58 -12
- package/dist/compaction/prune-tier.js +120 -54
- package/dist/compaction/summarize-tier.d.ts +23 -4
- package/dist/compaction/summarize-tier.js +100 -29
- package/dist/config/checker.d.ts +28 -0
- package/dist/config/checker.js +97 -0
- package/dist/config/json-schema.js +63 -2
- package/dist/config/key-docs.js +72 -3
- package/dist/config/merge.d.ts +5 -3
- package/dist/config/merge.js +81 -7
- package/dist/config/profile.d.ts +2 -0
- package/dist/config/profile.js +2 -0
- package/dist/config/schema-w5.d.ts +18 -0
- package/dist/config/schema-w5.js +109 -0
- package/dist/config/schema.d.ts +5 -9
- package/dist/config/schema.js +68 -114
- package/dist/config/types-w5.d.ts +118 -0
- package/dist/config/types-w5.js +20 -0
- package/dist/config/types.d.ts +50 -1
- package/dist/config/types.js +12 -0
- package/dist/drivers/acp/client.d.ts +57 -0
- package/dist/drivers/acp/client.js +160 -0
- package/dist/drivers/acp/driver.d.ts +31 -0
- package/dist/drivers/acp/driver.js +274 -0
- package/dist/drivers/acp/testing/fake-agent-main.d.ts +5 -0
- package/dist/drivers/acp/testing/fake-agent-main.js +7 -0
- package/dist/drivers/acp/testing/fake-agent.d.ts +27 -0
- package/dist/drivers/acp/testing/fake-agent.js +211 -0
- package/dist/drivers/acp/types.d.ts +285 -0
- package/dist/drivers/acp/types.js +36 -0
- package/dist/drivers/agents.d.ts +58 -0
- package/dist/drivers/agents.js +142 -0
- package/dist/drivers/base.d.ts +35 -0
- package/dist/drivers/base.js +59 -0
- package/dist/drivers/catalog.d.ts +46 -0
- package/dist/drivers/catalog.js +167 -0
- package/dist/drivers/env.d.ts +20 -0
- package/dist/drivers/env.js +46 -0
- package/dist/drivers/host-runners.d.ts +18 -0
- package/dist/drivers/host-runners.js +45 -0
- package/dist/drivers/jsonrpc.d.ts +58 -0
- package/dist/drivers/jsonrpc.js +180 -0
- package/dist/drivers/native/claude-normalize.d.ts +46 -0
- package/dist/drivers/native/claude-normalize.js +106 -0
- package/dist/drivers/native/claude-stream.d.ts +29 -0
- package/dist/drivers/native/claude-stream.js +456 -0
- package/dist/drivers/native/codex-app-server.d.ts +26 -0
- package/dist/drivers/native/codex-app-server.js +407 -0
- package/dist/drivers/native/codex-normalize.d.ts +38 -0
- package/dist/drivers/native/codex-normalize.js +124 -0
- package/dist/drivers/native/oneshot.d.ts +28 -0
- package/dist/drivers/native/oneshot.js +312 -0
- package/dist/drivers/permissions.d.ts +40 -0
- package/dist/drivers/permissions.js +92 -0
- package/dist/drivers/pids.d.ts +32 -0
- package/dist/drivers/pids.js +93 -0
- package/dist/drivers/pool.d.ts +28 -0
- package/dist/drivers/pool.js +96 -0
- package/dist/drivers/probe.d.ts +47 -0
- package/dist/drivers/probe.js +172 -0
- package/dist/drivers/process.d.ts +48 -0
- package/dist/drivers/process.js +100 -0
- package/dist/drivers/runner.d.ts +61 -0
- package/dist/drivers/runner.js +388 -0
- package/dist/drivers/store.d.ts +49 -0
- package/dist/drivers/store.js +91 -0
- package/dist/drivers/turn.d.ts +41 -0
- package/dist/drivers/turn.js +99 -0
- package/dist/drivers/types.d.ts +122 -0
- package/dist/drivers/types.js +11 -0
- package/dist/git/info.d.ts +75 -0
- package/dist/git/info.js +191 -0
- package/dist/hooks/protocol.js +6 -1
- package/dist/hooks/types.d.ts +10 -1
- package/dist/hooks/types.js +2 -0
- package/dist/host/api-impl.d.ts +7 -0
- package/dist/host/api-impl.js +15 -0
- package/dist/host/types.d.ts +24 -2
- package/dist/host/types.js +4 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/modes/acp/acp-events.d.ts +46 -0
- package/dist/modes/acp/acp-events.js +233 -0
- package/dist/modes/acp/acp-mode.d.ts +17 -0
- package/dist/modes/acp/acp-mode.js +47 -0
- package/dist/modes/acp/acp-server.d.ts +79 -0
- package/dist/modes/acp/acp-server.js +315 -0
- package/dist/modes/commands-core.d.ts +13 -1
- package/dist/modes/commands-core.js +64 -0
- package/dist/modes/image-input.d.ts +12 -4
- package/dist/modes/image-input.js +22 -5
- package/dist/modes/interactive/agent-panels.d.ts +14 -0
- package/dist/modes/interactive/agent-panels.js +103 -0
- package/dist/modes/interactive/agent-ui.d.ts +73 -0
- package/dist/modes/interactive/agent-ui.js +234 -0
- package/dist/modes/interactive/approval-dialog.d.ts +21 -4
- package/dist/modes/interactive/approval-dialog.js +98 -20
- package/dist/modes/interactive/approval-merge.d.ts +41 -0
- package/dist/modes/interactive/approval-merge.js +89 -0
- package/dist/modes/interactive/clipboard-paste.d.ts +18 -0
- package/dist/modes/interactive/clipboard-paste.js +28 -0
- package/dist/modes/interactive/commands.d.ts +12 -1
- package/dist/modes/interactive/commands.js +31 -1
- package/dist/modes/interactive/confirm-dialog.d.ts +49 -0
- package/dist/modes/interactive/confirm-dialog.js +121 -0
- package/dist/modes/interactive/double-esc.d.ts +20 -0
- package/dist/modes/interactive/double-esc.js +34 -0
- package/dist/modes/interactive/event-notices.d.ts +32 -0
- package/dist/modes/interactive/event-notices.js +79 -0
- package/dist/modes/interactive/external-editor.d.ts +16 -0
- package/dist/modes/interactive/external-editor.js +39 -0
- package/dist/modes/interactive/interactive-mode.d.ts +14 -1
- package/dist/modes/interactive/interactive-mode.js +140 -136
- package/dist/modes/interactive/key-dispatch.d.ts +22 -2
- package/dist/modes/interactive/key-dispatch.js +66 -7
- package/dist/modes/interactive/line/line-mode.d.ts +4 -1
- package/dist/modes/interactive/line/line-mode.js +31 -5
- package/dist/modes/interactive/line/line-render.d.ts +2 -1
- package/dist/modes/interactive/line/line-render.js +40 -4
- package/dist/modes/interactive/message-view.d.ts +1 -1
- package/dist/modes/interactive/message-view.js +24 -2
- package/dist/modes/interactive/panels.d.ts +18 -1
- package/dist/modes/interactive/panels.js +19 -5
- package/dist/modes/interactive/plan-command.d.ts +40 -0
- package/dist/modes/interactive/plan-command.js +129 -0
- package/dist/modes/interactive/plan-dialog.d.ts +98 -0
- package/dist/modes/interactive/plan-dialog.js +290 -0
- package/dist/modes/interactive/plan-flow.d.ts +34 -0
- package/dist/modes/interactive/plan-flow.js +98 -0
- package/dist/modes/interactive/rewind-command.d.ts +31 -0
- package/dist/modes/interactive/rewind-command.js +106 -0
- package/dist/modes/interactive/rewind-flow.d.ts +37 -0
- package/dist/modes/interactive/rewind-flow.js +151 -0
- package/dist/modes/interactive/rewind-list.d.ts +36 -0
- package/dist/modes/interactive/rewind-list.js +123 -0
- package/dist/modes/interactive/rewind-panel.d.ts +77 -0
- package/dist/modes/interactive/rewind-panel.js +309 -0
- package/dist/modes/interactive/rewind-text.d.ts +40 -0
- package/dist/modes/interactive/rewind-text.js +139 -0
- package/dist/modes/interactive/session-events.d.ts +24 -0
- package/dist/modes/interactive/session-events.js +96 -0
- package/dist/modes/interactive/startup-ui.js +5 -1
- package/dist/modes/interactive/status-area.d.ts +73 -0
- package/dist/modes/interactive/status-area.js +190 -0
- package/dist/modes/interactive/status-bar.d.ts +99 -11
- package/dist/modes/interactive/status-bar.js +273 -90
- package/dist/modes/interactive/status-line.d.ts +33 -0
- package/dist/modes/interactive/status-line.js +113 -0
- package/dist/modes/interactive/subagent-view.d.ts +56 -0
- package/dist/modes/interactive/subagent-view.js +154 -0
- package/dist/modes/interactive/tasks-report.d.ts +27 -0
- package/dist/modes/interactive/tasks-report.js +114 -0
- package/dist/modes/interactive/tool-view.d.ts +12 -2
- package/dist/modes/interactive/tool-view.js +34 -4
- package/dist/modes/print/print-mode.d.ts +13 -4
- package/dist/modes/print/print-mode.js +56 -12
- package/dist/modes/rpc/commands.d.ts +9 -0
- package/dist/modes/rpc/commands.js +44 -0
- package/dist/modes/rpc/rpc-mode.js +7 -1
- package/dist/modes/session-report.d.ts +11 -0
- package/dist/modes/session-report.js +48 -1
- package/dist/permissions/auto-safe.d.ts +5 -0
- package/dist/permissions/auto-safe.js +18 -0
- package/dist/permissions/bypass.d.ts +32 -0
- package/dist/permissions/bypass.js +36 -0
- package/dist/permissions/classifier.d.ts +4 -0
- package/dist/permissions/classifier.js +2 -0
- package/dist/permissions/modes.js +1 -1
- package/dist/permissions/pipeline.d.ts +43 -4
- package/dist/permissions/pipeline.js +114 -9
- package/dist/permissions/readonly-bash.d.ts +30 -0
- package/dist/permissions/readonly-bash.js +118 -0
- package/dist/permissions/types.d.ts +42 -0
- package/dist/plan/compose.d.ts +9 -0
- package/dist/plan/compose.js +19 -0
- package/dist/plan/controller.d.ts +71 -0
- package/dist/plan/controller.js +27 -0
- package/dist/plan/done-markers.d.ts +17 -0
- package/dist/plan/done-markers.js +51 -0
- package/dist/plan/extract.d.ts +29 -0
- package/dist/plan/extract.js +160 -0
- package/dist/plan/prompts.d.ts +36 -0
- package/dist/plan/prompts.js +89 -0
- package/dist/plan/store.d.ts +37 -0
- package/dist/plan/store.js +90 -0
- package/dist/rpc.d.ts +58 -2
- package/dist/rpc.js +7 -0
- package/dist/sandbox/bash.d.ts +74 -0
- package/dist/sandbox/bash.js +126 -0
- package/dist/sandbox/detect.d.ts +48 -0
- package/dist/sandbox/detect.js +149 -0
- package/dist/sandbox/index.d.ts +5 -0
- package/dist/sandbox/index.js +5 -0
- package/dist/sandbox/profile.d.ts +33 -0
- package/dist/sandbox/profile.js +76 -0
- package/dist/sandbox/wrap.d.ts +29 -0
- package/dist/sandbox/wrap.js +117 -0
- package/dist/sdk.d.ts +33 -2
- package/dist/sdk.js +24 -2
- package/dist/session/types.d.ts +3 -1
- package/dist/session/types.js +1 -0
- package/dist/skills/builtin.d.ts +31 -0
- package/dist/skills/builtin.js +109 -0
- package/dist/skills/discover.d.ts +2 -1
- package/dist/skills/index-prompt.js +5 -8
- package/dist/tools/background-jobs.d.ts +71 -0
- package/dist/tools/background-jobs.js +198 -0
- package/dist/tools/bash.d.ts +53 -1
- package/dist/tools/bash.js +158 -7
- package/dist/tools/clipboard-image.d.ts +44 -0
- package/dist/tools/clipboard-image.js +148 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +18 -3
- package/dist/tools/image-file.d.ts +38 -3
- package/dist/tools/image-file.js +81 -10
- package/dist/tools/image-resize.d.ts +58 -0
- package/dist/tools/image-resize.js +97 -0
- package/dist/tools/presets.d.ts +7 -2
- package/dist/tools/presets.js +11 -4
- package/dist/tools/read.d.ts +5 -2
- package/dist/tools/read.js +13 -10
- package/dist/tools/registry.d.ts +7 -1
- package/dist/tools/registry.js +27 -4
- package/dist/tools/task-ctl.d.ts +22 -0
- package/dist/tools/task-ctl.js +116 -0
- package/dist/tools/task.d.ts +22 -10
- package/dist/tools/task.js +66 -26
- package/dist/tools/todo.d.ts +22 -2
- package/dist/tools/todo.js +58 -14
- package/dist/tools/truncate.d.ts +15 -0
- package/dist/tools/truncate.js +25 -0
- package/dist/tools/types.d.ts +113 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/write.js +3 -0
- package/dist/tui/glyphs.d.ts +4 -0
- package/dist/tui/glyphs.js +4 -0
- package/dist/tui/keybindings.d.ts +6 -1
- package/dist/tui/keybindings.js +6 -1
- package/docs/acp.md +78 -0
- package/docs/agents.md +250 -0
- package/docs/codemode.md +12 -8
- package/docs/hooks.md +26 -22
- package/docs/permissions.md +78 -13
- package/docs/plan.md +107 -0
- package/docs/providers.md +228 -52
- package/docs/rewind-plan.md +181 -0
- package/docs/rpc.md +92 -5
- package/docs/sandbox.md +215 -0
- package/docs/session-format.md +41 -21
- package/docs/sessions.md +41 -1
- package/docs/tui-design.md +751 -0
- package/docs/tui.md +179 -21
- package/package.json +13 -2
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* 让宿主访问、Hook 公共字段与退出 dispose 跟随新会话。
|
|
17
17
|
*/
|
|
18
18
|
import type { ProviderRegistryApi } from "../ai/types.js";
|
|
19
|
+
import type { BashSandbox } from "../sandbox/bash.js";
|
|
19
20
|
import { AgentSessionImpl } from "../agent/session.js";
|
|
20
21
|
import type { AgentSession, CacheSettings, SessionEvent } from "../agent/types.js";
|
|
21
22
|
import { type AmaConfig } from "../config/types.js";
|
|
@@ -35,6 +36,8 @@ export interface ComposeState {
|
|
|
35
36
|
session: AgentSession | undefined;
|
|
36
37
|
/** 第 11 步建好的供应商注册表(read 工具判断当前模型收不收图片)。 */
|
|
37
38
|
providers?: ProviderRegistryApi;
|
|
39
|
+
/** [S2] tools.create 算出的 bash 沙箱设定,permissions.create 用同一份。 */
|
|
40
|
+
bashSandbox?: BashSandbox;
|
|
38
41
|
}
|
|
39
42
|
export declare function emptyComposeState(): ComposeState;
|
|
40
43
|
export type LogFn = (level: "debug" | "info" | "warn" | "error", message: string) => void;
|
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
* 让宿主访问、Hook 公共字段与退出 dispose 跟随新会话。
|
|
17
17
|
*/
|
|
18
18
|
import { readFileSync } from "node:fs";
|
|
19
|
+
import { resolveLimits } from "../agent/limits.js";
|
|
19
20
|
import { AgentSessionImpl } from "../agent/session.js";
|
|
21
|
+
import { DEFAULT_SUBAGENT_CONCURRENCY } from "../agent/session-subagent.js";
|
|
20
22
|
import { WARMING_MODES } from "../ai/cache/types.js";
|
|
21
23
|
import { isOverflowErrorText } from "../ai/overflow.js";
|
|
22
24
|
import { CACHE_RETENTIONS } from "../config/types.js";
|
|
@@ -25,11 +27,13 @@ import { ApprovalBrokerChain, DEFAULT_APPROVAL_TIMEOUT_MS } from "../permissions
|
|
|
25
27
|
import { PermissionPipeline } from "../permissions/pipeline.js";
|
|
26
28
|
import { SessionManager } from "../session/manager.js";
|
|
27
29
|
import { sessionDirForCwd } from "../session/store.js";
|
|
30
|
+
import { createCheckpointBackendFactory, resolveCheckpointSettings } from "../checkpoints/index.js";
|
|
28
31
|
import { expandSkillCommand } from "../skills/expand.js";
|
|
29
32
|
import { formatSkillIndex } from "../skills/index-prompt.js";
|
|
30
33
|
import { expandPromptCommand } from "../skills/templates.js";
|
|
31
34
|
import { PresetToolRegistry } from "../tools/presets.js";
|
|
32
35
|
import { openSession } from "./compose-store.js";
|
|
36
|
+
import { composeExtensions } from "./compose-extensions.js";
|
|
33
37
|
import { ExitCode } from "./exit-codes.js";
|
|
34
38
|
export function emptyComposeState() {
|
|
35
39
|
return { skills: [], templates: [], warnings: [], session: undefined };
|
|
@@ -225,6 +229,27 @@ export function bridgeEvent(event, bus) {
|
|
|
225
229
|
void bus.emit("context_pressure", pressure);
|
|
226
230
|
return;
|
|
227
231
|
}
|
|
232
|
+
// [W5-C0] 子 Agent 与计划事件
|
|
233
|
+
case "subagent_start": {
|
|
234
|
+
const { type: _type, ...payload } = event;
|
|
235
|
+
void bus.emit("subagent_start", payload);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
case "subagent_end": {
|
|
239
|
+
const { type: _type, ...payload } = event;
|
|
240
|
+
void bus.emit("subagent_end", payload);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
case "plan_proposed": {
|
|
244
|
+
const { type: _type, ...payload } = event;
|
|
245
|
+
void bus.emit("plan_proposed", payload);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
case "plan_resolved": {
|
|
249
|
+
const { type: _type, ...payload } = event;
|
|
250
|
+
void bus.emit("plan_resolved", payload);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
228
253
|
default:
|
|
229
254
|
return;
|
|
230
255
|
}
|
|
@@ -256,14 +281,24 @@ function buildSession(record, manager, model, thinkingLevel) {
|
|
|
256
281
|
retry: { ...config.retry },
|
|
257
282
|
expandPrompt: (text) => expandPrompt(record, session, text),
|
|
258
283
|
isContextOverflow: isOverflowErrorText,
|
|
259
|
-
subagents: registry.get("task") === undefined
|
|
284
|
+
subagents: registry.get("task") === undefined
|
|
285
|
+
? false
|
|
286
|
+
: { maxConcurrent: config.subagents?.maxConcurrent ?? DEFAULT_SUBAGENT_CONCURRENCY },
|
|
260
287
|
log: record.log,
|
|
261
288
|
cache: cacheSettingsFrom(config, process.env, (message) => record.log("warn", message)),
|
|
262
289
|
warmingDecider: () => assembly.host.warmingDecider?.(),
|
|
290
|
+
// [W5-C0] 会话扩展(组装表在 compose-extensions.ts)
|
|
291
|
+
extensions: composeExtensions({ assembly, env: process.env, log: record.log }),
|
|
263
292
|
};
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
293
|
+
// [W5-H2] 预算:--max-turns / --max-cost 覆盖 config limits.*,由 limits 扩展执行(agent/limits.ts)
|
|
294
|
+
const limits = resolveLimits(config.limits, {
|
|
295
|
+
maxTurns: assembly.overrides?.maxTurns,
|
|
296
|
+
maxCostUsd: assembly.overrides?.maxCostUsd,
|
|
297
|
+
});
|
|
298
|
+
if (limits !== undefined)
|
|
299
|
+
options.limits = limits;
|
|
300
|
+
if (config.fallbackModel !== undefined)
|
|
301
|
+
options.fallbackModel = config.fallbackModel;
|
|
267
302
|
const idle = idleTimeoutFrom(config, process.env, (message) => record.log("warn", message));
|
|
268
303
|
if (idle !== undefined)
|
|
269
304
|
options.idleTimeoutMs = idle;
|
|
@@ -276,6 +311,14 @@ function buildSession(record, manager, model, thinkingLevel) {
|
|
|
276
311
|
const hostId = assembly.host.handle?.adapter.id;
|
|
277
312
|
if (hostId !== undefined)
|
|
278
313
|
options.hostId = hostId;
|
|
314
|
+
// [RW-B] 回滚:中断即撤回与检查点后端(内存会话不调工厂;mode off 时工厂返回 undefined)
|
|
315
|
+
if (config.ui?.restoreOnCancel === false)
|
|
316
|
+
options.restoreOnCancel = false;
|
|
317
|
+
options.checkpoints = createCheckpointBackendFactory({
|
|
318
|
+
...resolveCheckpointSettings(config, process.env, (message) => record.log("warn", message)),
|
|
319
|
+
dataDir: assembly.paths.dataDir,
|
|
320
|
+
sessionsRoot: assembly.paths.sessionDir,
|
|
321
|
+
});
|
|
279
322
|
session = new AgentSessionImpl(options);
|
|
280
323
|
session.subscribe((event) => bridgeEvent(event, assembly.events));
|
|
281
324
|
records.set(session, record);
|
package/dist/cli/compose.d.ts
CHANGED
|
@@ -28,6 +28,7 @@ import type { AgentSession } from "../agent/types.js";
|
|
|
28
28
|
import type { AmaConfig } from "../config/types.js";
|
|
29
29
|
import type { Rule } from "../permissions/types.js";
|
|
30
30
|
import { type SandboxCapability } from "../codemode/capability.js";
|
|
31
|
+
import { type BashSandbox } from "../sandbox/bash.js";
|
|
31
32
|
import { PresetToolRegistry } from "../tools/presets.js";
|
|
32
33
|
import type { ToolDefinition, ToolRegistryApi } from "../tools/types.js";
|
|
33
34
|
import { type ComposeState, type LogFn } from "./compose-session.js";
|
|
@@ -62,6 +63,8 @@ export interface ComposeOptions {
|
|
|
62
63
|
* `toolFactories` 时 codemode 工厂也用它(测试据此不随 Node 版本变化)。
|
|
63
64
|
*/
|
|
64
65
|
sandboxCapability?: SandboxCapability;
|
|
66
|
+
/** [S2] bash 的 OS 沙箱设定(缺省按 `sandbox.*` 配置与本机探测;测试注入)。 */
|
|
67
|
+
bashSandbox?: BashSandbox;
|
|
65
68
|
/** 覆盖启动期问答;缺省见 `defaultStartupUi`。 */
|
|
66
69
|
ui?: InteractiveUi;
|
|
67
70
|
modes?: Partial<Record<RuntimeMode, ModeRunner>>;
|
package/dist/cli/compose.js
CHANGED
|
@@ -25,11 +25,16 @@
|
|
|
25
25
|
import { formatModelRef } from "../ai/providers/channels.js";
|
|
26
26
|
import { PermissionPipeline } from "../permissions/pipeline.js";
|
|
27
27
|
import { BUILTIN_DENY_RULES, parseRule } from "../permissions/rules.js";
|
|
28
|
+
import { withBuiltinSkills } from "../skills/builtin.js";
|
|
28
29
|
import { discoverSkills, skillSources } from "../skills/discover.js";
|
|
29
30
|
import { discoverPromptTemplates, promptSources } from "../skills/templates.js";
|
|
30
31
|
import { applyCodemodeMode } from "../codemode/modes.js";
|
|
31
|
-
import {
|
|
32
|
+
import { sandboxCapabilityFor } from "../codemode/capability.js";
|
|
32
33
|
import { codemodeToolFactory } from "../codemode/tool.js";
|
|
34
|
+
import { configureOsSandbox } from "../sandbox/detect.js";
|
|
35
|
+
import { resolveBashSandbox } from "../sandbox/bash.js";
|
|
36
|
+
import { join } from "node:path";
|
|
37
|
+
import { AUTH_FILE } from "../config/paths.js";
|
|
33
38
|
import { PresetToolRegistry, resolvePreset } from "../tools/presets.js";
|
|
34
39
|
import { builtinTools } from "../tools/registry.js";
|
|
35
40
|
import { takeCodemodeNotice } from "./codemode-notice.js";
|
|
@@ -37,6 +42,7 @@ import { buildProviderRegistry } from "./compose-providers.js";
|
|
|
37
42
|
import { composeSession, emptyComposeState, } from "./compose-session.js";
|
|
38
43
|
import { createSessionStore } from "./compose-store.js";
|
|
39
44
|
import { defaultSendUser } from "./startup-steps.js";
|
|
45
|
+
import { imageFitOptionsFor } from "../modes/image-input.js";
|
|
40
46
|
/** 缺省工具工厂:codemode(生效模式为 off 时不注册;缺省跟随预设,见 tools/presets.ts)。 */
|
|
41
47
|
export const DEFAULT_TOOL_FACTORIES = [codemodeToolFactory()];
|
|
42
48
|
export function lazyMode(load) {
|
|
@@ -58,17 +64,32 @@ export const DEFAULT_MODES = {
|
|
|
58
64
|
*/
|
|
59
65
|
export function createTools(input, options, state) {
|
|
60
66
|
const registry = new PresetToolRegistry();
|
|
61
|
-
|
|
67
|
+
// 记下 sandbox.enabled:拿不到配置的只读调用方(状态栏)与这里得到同一结论。
|
|
68
|
+
const osStatus = configureOsSandbox(input.config.sandbox?.enabled);
|
|
69
|
+
// [S2] bash 沙箱:工具与权限管线用同一份设定(tools.create 先于 permissions.create)
|
|
70
|
+
const bashSandbox = options.bashSandbox ??
|
|
71
|
+
resolveBashSandbox(input.config.sandbox, {
|
|
72
|
+
status: osStatus,
|
|
73
|
+
...(input.paths === undefined ? {} : { hidden: [join(input.paths.configDir, AUTH_FILE)] }),
|
|
74
|
+
});
|
|
75
|
+
state.bashSandbox = bashSandbox;
|
|
76
|
+
const capability = options.sandboxCapability ?? sandboxCapabilityFor(input.config);
|
|
62
77
|
const factories = options.toolFactories ??
|
|
63
78
|
(options.sandboxCapability !== undefined
|
|
64
79
|
? [codemodeToolFactory({ capability })]
|
|
65
80
|
: DEFAULT_TOOL_FACTORIES);
|
|
66
|
-
const bash =
|
|
67
|
-
|
|
68
|
-
|
|
81
|
+
const bash = {
|
|
82
|
+
...(input.config.tools?.bashTimeoutMs !== undefined
|
|
83
|
+
? { defaultTimeoutMs: input.config.tools.bashTimeoutMs }
|
|
84
|
+
: {}),
|
|
85
|
+
...(bashSandbox.active ? { sandbox: bashSandbox } : {}),
|
|
86
|
+
};
|
|
69
87
|
const builtins = builtinTools({
|
|
70
88
|
bash,
|
|
71
|
-
read: {
|
|
89
|
+
read: {
|
|
90
|
+
supportsImages: (ctx) => modelAcceptsImages(state, ctx.model),
|
|
91
|
+
imageOptions: (ctx) => imageFitOptionsFor(state.providers, ctx.model, input.config.images),
|
|
92
|
+
},
|
|
72
93
|
});
|
|
73
94
|
const ctx = {
|
|
74
95
|
...input,
|
|
@@ -192,6 +213,7 @@ export function createRuntimeDeps(options = {}) {
|
|
|
192
213
|
...(input.autoSafeCommands !== undefined
|
|
193
214
|
? { autoSafeCommands: input.autoSafeCommands }
|
|
194
215
|
: {}),
|
|
216
|
+
...(state.bashSandbox?.active === true ? { bashSandbox: state.bashSandbox } : {}),
|
|
195
217
|
}),
|
|
196
218
|
},
|
|
197
219
|
resources: {
|
|
@@ -201,6 +223,11 @@ export function createRuntimeDeps(options = {}) {
|
|
|
201
223
|
configDir: input.configDir,
|
|
202
224
|
cliDirs: input.extraSkillDirs,
|
|
203
225
|
}), { trusted: input.trusted });
|
|
226
|
+
if (input.dataDir !== undefined) {
|
|
227
|
+
const builtin = await withBuiltinSkills(skills.skills, input.dataDir);
|
|
228
|
+
skills.skills = builtin.skills;
|
|
229
|
+
skills.warnings.push(...builtin.warnings);
|
|
230
|
+
}
|
|
204
231
|
const prompts = await discoverPromptTemplates(promptSources({
|
|
205
232
|
cwd: input.cwd,
|
|
206
233
|
configDir: input.configDir,
|
package/dist/cli/deps.d.ts
CHANGED
|
@@ -65,6 +65,8 @@ export interface ResourceDiscoveryInput {
|
|
|
65
65
|
/** 按 §5.3 顺序:`--skill-dir` → profile.skillDirs → config.skills.dirs。 */
|
|
66
66
|
extraSkillDirs: readonly string[];
|
|
67
67
|
promptDirs: readonly string[];
|
|
68
|
+
/** 数据目录:内置 Skill 的正文写在 `<dataDir>/builtin/`;缺省不加内置 Skill。 */
|
|
69
|
+
dataDir?: string;
|
|
68
70
|
}
|
|
69
71
|
export interface ResourceDiscoveryResult {
|
|
70
72
|
skills: LoadedResources["skills"];
|
|
@@ -118,10 +120,14 @@ export interface SessionAssembly {
|
|
|
118
120
|
export interface SessionOverrides {
|
|
119
121
|
/** 一次运行(prompt)的回合上限。 */
|
|
120
122
|
maxTurns?: number;
|
|
123
|
+
/** [W5-C0] `--max-cost`:并入会话 `limits.maxCostUsd`(W5-H2 实现)。 */
|
|
124
|
+
maxCostUsd?: number;
|
|
121
125
|
/** `--system-prompt`:追加进 rules 节,或替换 preamble。 */
|
|
122
126
|
systemPrompt?: SystemPromptOverride;
|
|
123
127
|
/** `--no-session`:`/new` 等切换出的新会话也只在内存里。 */
|
|
124
128
|
noSession?: boolean;
|
|
129
|
+
/** [W5-G] `--agent-dir`(可重复)与 profile `agentDirs`,按此顺序:子 Agent 定义目录。 */
|
|
130
|
+
agentDirs?: string[];
|
|
125
131
|
}
|
|
126
132
|
export interface SystemPromptOverride {
|
|
127
133
|
text: string;
|
package/dist/cli/exit-codes.d.ts
CHANGED
|
@@ -18,6 +18,16 @@ export declare const ExitCode: {
|
|
|
18
18
|
readonly HostOrHook: 6;
|
|
19
19
|
/** `-p` 运行中有工具调用被拒(无人审批、deny 规则、plan 等),要求的动作没有完成。 */
|
|
20
20
|
readonly ToolDenied: 7;
|
|
21
|
+
/**
|
|
22
|
+
* [W5-C0] `-p` 到达 `--max-turns` / `--max-cost` / `limits.*` 上限(`limit_reached`,W5-H2)。
|
|
23
|
+
* 设计稿写的是 7,但 7 已发布为 ToolDenied,这里用 8。
|
|
24
|
+
*/
|
|
25
|
+
readonly LimitReached: 8;
|
|
26
|
+
/**
|
|
27
|
+
* [W5-H2] `-p` 在 plan 模式产出计划、已落盘但没有人审批(`plan.unattended: stop`,缺省):
|
|
28
|
+
* 计划还没执行。不复用 7(7 已发布为「工具调用被拒」)。
|
|
29
|
+
*/
|
|
30
|
+
readonly PlanPending: 9;
|
|
21
31
|
/** HOST_API_VERSION 不匹配。 */
|
|
22
32
|
readonly HostVersion: 78;
|
|
23
33
|
/** SIGINT 退出(两次 Ctrl+C)。 */
|
package/dist/cli/exit-codes.js
CHANGED
|
@@ -18,6 +18,16 @@ export const ExitCode = {
|
|
|
18
18
|
HostOrHook: 6,
|
|
19
19
|
/** `-p` 运行中有工具调用被拒(无人审批、deny 规则、plan 等),要求的动作没有完成。 */
|
|
20
20
|
ToolDenied: 7,
|
|
21
|
+
/**
|
|
22
|
+
* [W5-C0] `-p` 到达 `--max-turns` / `--max-cost` / `limits.*` 上限(`limit_reached`,W5-H2)。
|
|
23
|
+
* 设计稿写的是 7,但 7 已发布为 ToolDenied,这里用 8。
|
|
24
|
+
*/
|
|
25
|
+
LimitReached: 8,
|
|
26
|
+
/**
|
|
27
|
+
* [W5-H2] `-p` 在 plan 模式产出计划、已落盘但没有人审批(`plan.unattended: stop`,缺省):
|
|
28
|
+
* 计划还没执行。不复用 7(7 已发布为「工具调用被拒」)。
|
|
29
|
+
*/
|
|
30
|
+
PlanPending: 9,
|
|
21
31
|
/** HOST_API_VERSION 不匹配。 */
|
|
22
32
|
HostVersion: 78,
|
|
23
33
|
/** SIGINT 退出(两次 Ctrl+C)。 */
|
|
@@ -34,6 +44,8 @@ export const EXIT_CODE_DESCRIPTIONS = {
|
|
|
34
44
|
5: "会话不存在 / 损坏 / cwd 不匹配",
|
|
35
45
|
6: "宿主 / Hook 加载或启动失败",
|
|
36
46
|
7: "-p 运行中有工具调用被拒(没有人审批)",
|
|
47
|
+
8: "-p 到达预算上限(--max-turns / --max-cost / limits)",
|
|
48
|
+
9: "-p 产出的计划已落盘、待审批(未执行)",
|
|
37
49
|
78: "HOST_API_VERSION 不匹配",
|
|
38
50
|
130: "SIGINT 退出(两次 Ctrl+C)",
|
|
39
51
|
143: "SIGTERM",
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama --help` 的文本(从 args.ts 搬出,args.ts 再导出)。[W5-C0]
|
|
3
|
+
*/
|
|
4
|
+
export declare const HELP_TEXT = "\u7528\u6CD5\uFF1Aama [\u9009\u9879] [\u63D0\u793A]\n ama <\u5B50\u547D\u4EE4> \u2026\n\n\u6A21\u5F0F\n \uFF08\u7F3A\u7701\uFF09 \u7EC8\u7AEF\u754C\u9762\uFF1Bstdin / stdout \u975E TTY \u6216 TERM=dumb \u65F6\u81EA\u52A8\u964D\u7EA7\u4E3A\u884C\u5F0F\n --no-tui \u884C\u5F0F\u754C\u9762\uFF08readline + \u62EC\u53F7\u7C98\u8D34\uFF09\n -p, --print \u975E\u4EA4\u4E92\uFF1A\u6267\u884C\u63D0\u793A\u540E\u9000\u51FA\u3002\u63D0\u793A = \u53C2\u6570 + stdin \u7BA1\u9053\u5185\u5BB9\uFF1B\u6709\u63D0\u793A\u53C2\u6570\u65F6\n \u53EA\u7B49\u7BA1\u9053\u9996\u5B57\u8282 2 s\uFF08AMA_STDIN_WAIT_MS\uFF09\uFF0C\u6CA1\u6536\u5230\u5C31\u5FFD\u7565\u5E76\u63D0\u793A\uFF1B\n \u672B\u5C3E\u52A0 - \u5219\u4E00\u76F4\u7B49\u5230 EOF\uFF08\u5982 npm test | ama -p \u627E\u539F\u56E0 -\uFF09\n --no-stdin -p \u4E0D\u8BFB stdin\uFF08\u7236\u8FDB\u7A0B\u7559\u7740\u7BA1\u9053\u3001\u53C8\u4E0D\u60F3\u7B49 2 s \u65F6\uFF09\n --output-format <\u683C\u5F0F> -p \u7684\u8F93\u51FA\uFF1Atext\uFF08\u7F3A\u7701\uFF09| json | stream-json\n --max-turns <N> -p \u6700\u591A\u8DD1 N \u8F6E\uFF08\u4E00\u6B21\u6A21\u578B\u8BF7\u6C42\u52A0\u5176\u5DE5\u5177\u6267\u884C\u7B97\u4E00\u8F6E\uFF09\uFF1B\u5230\u8FBE\u4E0A\u9650\u4ECD\u6709\n \u672A\u5B8C\u6210\u7684\u5DE5\u5177\u8C03\u7528\u65F6\u63D0\u524D\u7ED3\u675F\uFF0C\u9000\u51FA\u7801 8\n --image <\u6587\u4EF6> -p \u968F\u63D0\u793A\u53D1\u9001\u56FE\u7247\uFF08\u53EF\u91CD\u590D\uFF1Bpng / jpg / gif / webp\uFF0C\u5355\u5F20 \u2264 5 MB\uFF09\uFF1B\n \u4EA4\u4E92\u754C\u9762\u91CC\u5199 @\u56FE\u7247\u8DEF\u5F84 \u6216\u7C98\u8D34\u56FE\u7247\u8DEF\u5F84\n --mode rpc stdio JSONL \u534F\u8BAE\uFF08\u4F9B\u5D4C\u5165\uFF09\n --mode acp ACP \u670D\u52A1\u7AEF\uFF08\u4F9B Zed / JetBrains / Armadra \u9A71\u52A8\uFF09\n --max-cost <USD> \u4E00\u6B21\u8FD0\u884C\u7684\u7F8E\u5143\u4E0A\u9650\uFF08\u6309\u76EE\u5F55\u4EF7\u4F30\u7B97\uFF09\uFF1B\u5230\u9650\u7ED3\u675F\u8FD0\u884C\uFF0C-p \u9000\u51FA\u7801 8\n --tui-mode <\u6A21\u5F0F> \u663E\u793A\u6A21\u5F0F\uFF0C\u7B2C\u4E00\u671F\u53EA\u6709 regular\uFF08\u4E3B\u5C4F\uFF09\n --quiet-startup <\u6863> \u542F\u52A8\u753B\u9762\uFF1Anormal | header | silent\n\n\u6A21\u578B\n --model <provider/id> \u6A21\u578B\uFF08\u53EF\u914D\u5408 --provider \u53EA\u5199 id\uFF1B@\u6E20\u9053 \u6307\u5B9A\u6E20\u9053\uFF0C\u5982 packy/kimi-k2.5@messages\uFF09\n --provider <id> \u4F9B\u5E94\u5546\uFF08\u5FC5\u987B\u540C\u65F6\u7ED9 --model\uFF09\n --api-key <key> \u53EA\u7528\u4E8E\u672C\u6B21\u542F\u52A8\u7684 key\uFF08\u9700\u8981 --model\uFF1B\u4F18\u5148\u7528 ama auth set\uFF09\n --thinking <\u7EA7\u522B> off | minimal | low | medium | high | xhigh\n\n\u4F1A\u8BDD\n -c, --continue \u7EE7\u7EED\u672C\u76EE\u5F55\u6700\u8FD1\u7684\u4F1A\u8BDD\n -r, --resume [id] \u6062\u590D\u4F1A\u8BDD\uFF08\u4EA4\u4E92\u6A21\u5F0F\u65E0 id \u65F6\u5F39\u9009\u62E9\u5668\uFF09\n --session-id <id> \u4F7F\u7528\u6307\u5B9A id \u7684\u4F1A\u8BDD\uFF08\u4E0D\u5B58\u5728\u5219\u65B0\u5EFA\uFF09\n --fork <id> \u4ECE\u6307\u5B9A\u4F1A\u8BDD\u5206\u53C9\u51FA\u65B0\u4F1A\u8BDD\n --session-dir <\u76EE\u5F55> \u4F1A\u8BDD\u76EE\u5F55\uFF08\u7F3A\u7701 ~/.local/share/ama/sessions\uFF09\n --no-session \u4F1A\u8BDD\u53EA\u5728\u5185\u5B58\u91CC\uFF0C\u4E0D\u5199\u4F1A\u8BDD\u6587\u4EF6\uFF08\u4E4B\u540E\u65E0\u6CD5 --resume\uFF09\n --from <id>[#\u7F16\u53F7] \u7528\u65E7\u4F1A\u8BDD\u7684\u4E00\u6761\u7528\u6237\u6D88\u606F\u4F5C\u63D0\u793A\uFF08\u7F3A\u7701\u6700\u540E\u4E00\u6761\uFF1B-p \u65F6\u8FDE\u56FE\u7247\u4E00\u8D77\uFF1B\n \u7F16\u53F7\u89C1 ama sessions show\uFF09\n\n\u6743\u9650\u4E0E\u4FE1\u4EFB\n --permission-mode <\u6A21\u5F0F> default | auto-edit | plan | auto | full-auto | allowlist\n \uFF08auto \u7531 ama \u5224\u65AD\u6BCF\u4E00\u6B65\uFF1Ballowlist \u53EA\u653E\u884C allow \u89C4\u5219\u547D\u4E2D\u7684\uFF0C\u9002\u5408 CI\uFF09\n --allow <\u89C4\u5219> \u8FFD\u52A0\u5141\u8BB8\u89C4\u5219\uFF0C\u53EF\u91CD\u590D\uFF08\u5982 \"bash(git status*)\"\uFF09\n --deny <\u89C4\u5219> \u8FFD\u52A0\u62D2\u7EDD\u89C4\u5219\uFF0C\u53EF\u91CD\u590D\uFF08\u5982 \"write(**/.env*)\"\uFF09\n --trust / --no-trust \u4FE1\u4EFB / \u4E0D\u4FE1\u4EFB\u5F53\u524D\u9879\u76EE\uFF08\u9879\u76EE\u7EA7 Hook\u3001Skill\u3001\u63D0\u793A\u6A21\u677F\uFF09\n\n\u8D44\u6E90\n --system-prompt <\u6587\u672C|@\u6587\u4EF6> \u8FFD\u52A0\u7CFB\u7EDF\u63D0\u793A\uFF1A\u7F3A\u7701\u4F5C\u4E3A\u6700\u540E\u4E00\u6761\u89C4\u5219\u8FFD\u52A0\uFF08\u5DE5\u5177\u8868\u7B49\u524D\u7F00\u4E0D\u53D8\uFF0C\u5229\u4E8E\u7F13\u5B58\uFF09\n --system-prompt-mode <\u65B9\u5F0F> append\uFF08\u7F3A\u7701\uFF09| replace\uFF08\u66FF\u6362\u5F00\u5934\u7684\u89D2\u8272\u8BF4\u660E\uFF0C\u5DE5\u5177\u4E0E\u9879\u76EE\u4E0A\u4E0B\u6587\u4FDD\u7559\uFF09\n --profile <\u6587\u4EF6> \u5BBF\u4E3B profile.json\uFF08\u5B57\u6BB5\u7B49\u4EF7\u4E8E\u5BF9\u5E94\u53C2\u6570\uFF0C\u547D\u4EE4\u884C\u4F18\u5148\uFF09\n --host <\u6A21\u5757> \u5BBF\u4E3B\u9002\u914D\u5668\u6A21\u5757\uFF08CJS / ESM\uFF09\n --instructions <\u6587\u4EF6> \u8FFD\u52A0\u6307\u4EE4\u6587\u4EF6\uFF0C\u53EF\u91CD\u590D\n --skill-dir <\u76EE\u5F55> \u8FFD\u52A0 Skill \u76EE\u5F55\uFF0C\u53EF\u91CD\u590D\n --agent-dir <\u76EE\u5F55> \u8FFD\u52A0\u5B50 Agent \u5B9A\u4E49\u76EE\u5F55\uFF0C\u53EF\u91CD\u590D\n --auth-file <\u6587\u4EF6> auth.json \u4F4D\u7F6E\uFF08\u7F3A\u7701 ~/.config/ama/auth.json\uFF09\n --tools <a,b,\u2026> \u53EA\u542F\u7528\u8FD9\u4E9B\u5DE5\u5177\n --exclude-tools <a,b,\u2026> \u7981\u7528\u8FD9\u4E9B\u5DE5\u5177\n --tools-preset <\u540D> \u5DE5\u5177\u9884\u8BBE\uFF1Adefault\uFF08\u7F3A\u7701\uFF09| minimal | codemode-only | coordinator\n \uFF08codemode \u662F codemode-only \u7684\u65E7\u540D\uFF0C\u4ECD\u53EF\u7528\uFF09\n --codemode <\u6A21\u5F0F> codemode \u8C03\u7528\u65B9\u5F0F\uFF1Aoff | on | only\uFF08\u7F3A\u7701\u968F\u9884\u8BBE\uFF09\n\n\u5B50\u547D\u4EE4\n ama auth set <provider> \u4ECE stdin \u8BFB\u53D6 key \u5199\u5165 auth.json\uFF080600\uFF09\n ama auth list \u5217\u51FA\u5DF2\u4FDD\u5B58 key \u7684\u4F9B\u5E94\u5546\uFF08\u4E0D\u663E\u793A key\uFF09\n ama auth remove <provider> \u5220\u9664\u5DF2\u4FDD\u5B58\u7684 key\n ama sessions list|show|prune \u4F1A\u8BDD\u7BA1\u7406\n ama sessions search <\u5173\u952E\u8BCD|/\u6B63\u5219/> [--all] [--role user|assistant|tool] [--since 7d] [--limit N]\n \u8DE8\u4F1A\u8BDD\u5168\u6587\u68C0\u7D22\n ama sessions export <id> [--format md|json|jsonl] [--output <\u6587\u4EF6>] [--branch leaf|all]\n \u5BFC\u51FA\u4F1A\u8BDD\uFF08\u5DF2\u8131\u654F\uFF09\n ama models list [--provider <id>] \u5217\u51FA\u6A21\u578B\uFF08\u542B\u6765\u6E90\u4E0E key \u72B6\u6001\uFF09\n ama models check <provider/id> \u53D1\u4E00\u6B21\u6700\u5C0F\u8BF7\u6C42\u68C0\u67E5\u53EF\u7528\u6027\n ama models discover <provider> [--probe] [--write] [--limit N]\n \u4ECE\u4E2D\u8F6C /v1/models \u5217\u51FA\u6A21\u578B\uFF0C\u63A2\u6D4B\u534F\u8BAE\u5E76\u5199\u5165\u914D\u7F6E\n ama models refresh [--provider <id>] \u8054\u7F51\u5237\u65B0 models.dev \u5143\u6570\u636E\u5230\u6570\u636E\u76EE\u5F55\uFF08\u542F\u52A8\u4E0D\u8054\u7F51\uFF1B\n \u65E7\u540D refresh-catalog\uFF09\n ama providers add <id> --base-url <url> [--key-env VAR] [--probe] [--channel n=api@url] [--yes]\n \u4E00\u952E\u63A5\u5165\uFF1A\u5217\u6A21\u578B\u3001\u8865 models.dev \u5143\u6570\u636E\u3001\u63A2\u6D4B\u6E20\u9053\u3001\u5199\u5165\u914D\u7F6E\n ama providers list|channels <id>|remove <id>|refresh <id>\n \u4F9B\u5E94\u5546 \u2192 \u6E20\u9053 \u2192 \u6A21\u578B\uFF1B\u5220\u9664\uFF1B\u91CD\u62C9\u6A21\u578B\u5217\u8868\n ama models cache-probe <provider/id> [--tokens N] [--gap-ms MS] [--yes] [--json]\n \u5224\u65AD\u7AEF\u70B9\u662F\u5426\u62A5\u544A\u7F13\u5B58\u547D\u4E2D\n ama doctor \u914D\u7F6E\u5C42\u7EA7\u3001\u4FE1\u4EFB\u3001key \u6765\u6E90\u3001Hook\u3001\u7EC8\u7AEF\u80FD\u529B\n ama config show [--json] \u751F\u6548\u914D\u7F6E\u4E0E\u6BCF\u9879\u6765\u6E90\u3001\u5C06\u4F7F\u7528\u7684\u6A21\u578B\n ama config path \u914D\u7F6E\u76EE\u5F55\u3001\u6570\u636E\u76EE\u5F55\u4E0E\u5404\u6587\u4EF6\u8DEF\u5F84\n ama config edit \u7528 $VISUAL / $EDITOR \u6253\u5F00 config.json\n ama init [--force] \u5EFA\u914D\u7F6E\u76EE\u5F55\uFF080700\uFF09\u4E0E config.json\u3001config.schema.json\uFF1B\u5DF2\u6709\u7684\u4E0D\u8986\u76D6\n ama stats [--since 7d] [--by day|week|month|provider|channel|model|project] [--all] [--json]\n \u8DE8\u4F1A\u8BDD\u7EDF\u8BA1\uFF1A\u8BF7\u6C42\u3001token\u3001\u7F13\u5B58\u547D\u4E2D\u7387\u3001\u8D39\u7528\u3001\u5DE5\u5177\u8C03\u7528\n\n\u5176\u5B83\n -h, --help \u8F93\u51FA\u672C\u5E2E\u52A9\n -v, --version \u8F93\u51FA\u7248\u672C\n\n\u9000\u51FA\u7801\uFF1A0 \u6B63\u5E38 \u00B7 1 \u8FD0\u884C\u671F\u9519\u8BEF \u00B7 2 \u7528\u6CD5\u9519\u8BEF \u00B7 3 \u914D\u7F6E\u9519\u8BEF \u00B7 4 \u65E0\u53EF\u7528\u6A21\u578B\u6216 key \u00B7\n 5 \u4F1A\u8BDD\u9519\u8BEF \u00B7 6 \u5BBF\u4E3B / Hook \u542F\u52A8\u5931\u8D25 \u00B7 7 -p \u6709\u5DE5\u5177\u8C03\u7528\u88AB\u62D2\uFF08\u65E0\u4EBA\u5BA1\u6279\uFF1B\u7528\n --permission-mode auto-edit|auto \u6216 --allow \u653E\u884C\uFF09\u00B7 8 -p \u5230\u8FBE\u9884\u7B97\u4E0A\u9650 \u00B7\n 9 -p \u7684\u8BA1\u5212\u5DF2\u843D\u76D8\u5F85\u5BA1\u6279\uFF08plan.unattended: approve \u5219\u81EA\u52A8\u6279\u51C6\u6267\u884C\uFF09\u00B7\n 78 \u5BBF\u4E3B API \u7248\u672C\u4E0D\u5339\u914D \u00B7\n 130 SIGINT \u00B7 143 SIGTERM\n";
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama --help` 的文本(从 args.ts 搬出,args.ts 再导出)。[W5-C0]
|
|
3
|
+
*/
|
|
4
|
+
export const HELP_TEXT = `用法:ama [选项] [提示]
|
|
5
|
+
ama <子命令> …
|
|
6
|
+
|
|
7
|
+
模式
|
|
8
|
+
(缺省) 终端界面;stdin / stdout 非 TTY 或 TERM=dumb 时自动降级为行式
|
|
9
|
+
--no-tui 行式界面(readline + 括号粘贴)
|
|
10
|
+
-p, --print 非交互:执行提示后退出。提示 = 参数 + stdin 管道内容;有提示参数时
|
|
11
|
+
只等管道首字节 2 s(AMA_STDIN_WAIT_MS),没收到就忽略并提示;
|
|
12
|
+
末尾加 - 则一直等到 EOF(如 npm test | ama -p 找原因 -)
|
|
13
|
+
--no-stdin -p 不读 stdin(父进程留着管道、又不想等 2 s 时)
|
|
14
|
+
--output-format <格式> -p 的输出:text(缺省)| json | stream-json
|
|
15
|
+
--max-turns <N> -p 最多跑 N 轮(一次模型请求加其工具执行算一轮);到达上限仍有
|
|
16
|
+
未完成的工具调用时提前结束,退出码 8
|
|
17
|
+
--image <文件> -p 随提示发送图片(可重复;png / jpg / gif / webp,单张 ≤ 5 MB);
|
|
18
|
+
交互界面里写 @图片路径 或粘贴图片路径
|
|
19
|
+
--mode rpc stdio JSONL 协议(供嵌入)
|
|
20
|
+
--mode acp ACP 服务端(供 Zed / JetBrains / Armadra 驱动)
|
|
21
|
+
--max-cost <USD> 一次运行的美元上限(按目录价估算);到限结束运行,-p 退出码 8
|
|
22
|
+
--tui-mode <模式> 显示模式,第一期只有 regular(主屏)
|
|
23
|
+
--quiet-startup <档> 启动画面:normal | header | silent
|
|
24
|
+
|
|
25
|
+
模型
|
|
26
|
+
--model <provider/id> 模型(可配合 --provider 只写 id;@渠道 指定渠道,如 packy/kimi-k2.5@messages)
|
|
27
|
+
--provider <id> 供应商(必须同时给 --model)
|
|
28
|
+
--api-key <key> 只用于本次启动的 key(需要 --model;优先用 ama auth set)
|
|
29
|
+
--thinking <级别> off | minimal | low | medium | high | xhigh
|
|
30
|
+
|
|
31
|
+
会话
|
|
32
|
+
-c, --continue 继续本目录最近的会话
|
|
33
|
+
-r, --resume [id] 恢复会话(交互模式无 id 时弹选择器)
|
|
34
|
+
--session-id <id> 使用指定 id 的会话(不存在则新建)
|
|
35
|
+
--fork <id> 从指定会话分叉出新会话
|
|
36
|
+
--session-dir <目录> 会话目录(缺省 ~/.local/share/ama/sessions)
|
|
37
|
+
--no-session 会话只在内存里,不写会话文件(之后无法 --resume)
|
|
38
|
+
--from <id>[#编号] 用旧会话的一条用户消息作提示(缺省最后一条;-p 时连图片一起;
|
|
39
|
+
编号见 ama sessions show)
|
|
40
|
+
|
|
41
|
+
权限与信任
|
|
42
|
+
--permission-mode <模式> default | auto-edit | plan | auto | full-auto | allowlist
|
|
43
|
+
(auto 由 ama 判断每一步;allowlist 只放行 allow 规则命中的,适合 CI)
|
|
44
|
+
--allow <规则> 追加允许规则,可重复(如 "bash(git status*)")
|
|
45
|
+
--deny <规则> 追加拒绝规则,可重复(如 "write(**/.env*)")
|
|
46
|
+
--trust / --no-trust 信任 / 不信任当前项目(项目级 Hook、Skill、提示模板)
|
|
47
|
+
|
|
48
|
+
资源
|
|
49
|
+
--system-prompt <文本|@文件> 追加系统提示:缺省作为最后一条规则追加(工具表等前缀不变,利于缓存)
|
|
50
|
+
--system-prompt-mode <方式> append(缺省)| replace(替换开头的角色说明,工具与项目上下文保留)
|
|
51
|
+
--profile <文件> 宿主 profile.json(字段等价于对应参数,命令行优先)
|
|
52
|
+
--host <模块> 宿主适配器模块(CJS / ESM)
|
|
53
|
+
--instructions <文件> 追加指令文件,可重复
|
|
54
|
+
--skill-dir <目录> 追加 Skill 目录,可重复
|
|
55
|
+
--agent-dir <目录> 追加子 Agent 定义目录,可重复
|
|
56
|
+
--auth-file <文件> auth.json 位置(缺省 ~/.config/ama/auth.json)
|
|
57
|
+
--tools <a,b,…> 只启用这些工具
|
|
58
|
+
--exclude-tools <a,b,…> 禁用这些工具
|
|
59
|
+
--tools-preset <名> 工具预设:default(缺省)| minimal | codemode-only | coordinator
|
|
60
|
+
(codemode 是 codemode-only 的旧名,仍可用)
|
|
61
|
+
--codemode <模式> codemode 调用方式:off | on | only(缺省随预设)
|
|
62
|
+
|
|
63
|
+
子命令
|
|
64
|
+
ama auth set <provider> 从 stdin 读取 key 写入 auth.json(0600)
|
|
65
|
+
ama auth list 列出已保存 key 的供应商(不显示 key)
|
|
66
|
+
ama auth remove <provider> 删除已保存的 key
|
|
67
|
+
ama sessions list|show|prune 会话管理
|
|
68
|
+
ama sessions search <关键词|/正则/> [--all] [--role user|assistant|tool] [--since 7d] [--limit N]
|
|
69
|
+
跨会话全文检索
|
|
70
|
+
ama sessions export <id> [--format md|json|jsonl] [--output <文件>] [--branch leaf|all]
|
|
71
|
+
导出会话(已脱敏)
|
|
72
|
+
ama models list [--provider <id>] 列出模型(含来源与 key 状态)
|
|
73
|
+
ama models check <provider/id> 发一次最小请求检查可用性
|
|
74
|
+
ama models discover <provider> [--probe] [--write] [--limit N]
|
|
75
|
+
从中转 /v1/models 列出模型,探测协议并写入配置
|
|
76
|
+
ama models refresh [--provider <id>] 联网刷新 models.dev 元数据到数据目录(启动不联网;
|
|
77
|
+
旧名 refresh-catalog)
|
|
78
|
+
ama providers add <id> --base-url <url> [--key-env VAR] [--probe] [--channel n=api@url] [--yes]
|
|
79
|
+
一键接入:列模型、补 models.dev 元数据、探测渠道、写入配置
|
|
80
|
+
ama providers list|channels <id>|remove <id>|refresh <id>
|
|
81
|
+
供应商 → 渠道 → 模型;删除;重拉模型列表
|
|
82
|
+
ama models cache-probe <provider/id> [--tokens N] [--gap-ms MS] [--yes] [--json]
|
|
83
|
+
判断端点是否报告缓存命中
|
|
84
|
+
ama doctor 配置层级、信任、key 来源、Hook、终端能力
|
|
85
|
+
ama config show [--json] 生效配置与每项来源、将使用的模型
|
|
86
|
+
ama config path 配置目录、数据目录与各文件路径
|
|
87
|
+
ama config edit 用 $VISUAL / $EDITOR 打开 config.json
|
|
88
|
+
ama init [--force] 建配置目录(0700)与 config.json、config.schema.json;已有的不覆盖
|
|
89
|
+
ama stats [--since 7d] [--by day|week|month|provider|channel|model|project] [--all] [--json]
|
|
90
|
+
跨会话统计:请求、token、缓存命中率、费用、工具调用
|
|
91
|
+
|
|
92
|
+
其它
|
|
93
|
+
-h, --help 输出本帮助
|
|
94
|
+
-v, --version 输出版本
|
|
95
|
+
|
|
96
|
+
退出码:0 正常 · 1 运行期错误 · 2 用法错误 · 3 配置错误 · 4 无可用模型或 key ·
|
|
97
|
+
5 会话错误 · 6 宿主 / Hook 启动失败 · 7 -p 有工具调用被拒(无人审批;用
|
|
98
|
+
--permission-mode auto-edit|auto 或 --allow 放行)· 8 -p 到达预算上限 ·
|
|
99
|
+
9 -p 的计划已落盘待审批(plan.unattended: approve 则自动批准执行)·
|
|
100
|
+
78 宿主 API 版本不匹配 ·
|
|
101
|
+
130 SIGINT · 143 SIGTERM
|
|
102
|
+
`;
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* 交互模式(终端界面视觉设计 v1 §3.1)用结构化的 `startupInfo()` 自己排版(框 / 无框两态);
|
|
11
11
|
* `buildStartupScreen` 的纯文本行保留给 line 模式与测试。
|
|
12
12
|
*/
|
|
13
|
+
import { isBuiltinSkill } from "../skills/builtin.js";
|
|
13
14
|
import { basename } from "node:path";
|
|
14
15
|
import { formatModelRef } from "../ai/providers/channels.js";
|
|
15
16
|
import { effectiveCodemodeMode } from "../tools/presets.js";
|
|
@@ -45,8 +46,9 @@ export function buildStartupScreen(runtime, level = startupScreenLevel(runtime))
|
|
|
45
46
|
if (resources.contextFiles.length > 0) {
|
|
46
47
|
lines.push(`上下文:${resources.contextFiles.map((f) => f.path).join(", ")}`);
|
|
47
48
|
}
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
const skills = resources.skills.filter((s) => !isBuiltinSkill(s));
|
|
50
|
+
if (skills.length > 0) {
|
|
51
|
+
lines.push(`Skill:${skills.map((s) => s.name).join(", ")}`);
|
|
50
52
|
}
|
|
51
53
|
if (resources.prompts.length > 0) {
|
|
52
54
|
lines.push(`提示模板:${resources.prompts.map((p) => `/${p.name}`).join(" ")}`);
|
|
@@ -92,7 +94,7 @@ export function startupInfo(runtime, home) {
|
|
|
92
94
|
preset: runtime.config.tools?.preset ?? "default",
|
|
93
95
|
codemode: effectiveCodemodeMode(runtime.config),
|
|
94
96
|
contextFiles: resources.contextFiles.map((f) => basename(f.path)),
|
|
95
|
-
skills: resources.skills.length,
|
|
97
|
+
skills: resources.skills.filter((s) => !isBuiltinSkill(s)).length,
|
|
96
98
|
prompts: resources.prompts.length,
|
|
97
99
|
hooks: runtime.hooks.list().length,
|
|
98
100
|
warnings: runtime.warnings.length,
|
|
@@ -45,7 +45,9 @@ export function toStartupError(error, exitCode, label) {
|
|
|
45
45
|
}
|
|
46
46
|
/** 第 4 步。 */
|
|
47
47
|
export function decideMode(args, io) {
|
|
48
|
-
|
|
48
|
+
// [W5-EG] --mode acp 与 rpc 同一装配(宿主看到的 mode 也是 rpc);ACP 服务端由调用方
|
|
49
|
+
// (runCli 或 SDK 自己的 runAcpMode)接在 Runtime 上
|
|
50
|
+
if (args.mode === "rpc" || args.mode === "acp")
|
|
49
51
|
return "rpc";
|
|
50
52
|
if (args.print)
|
|
51
53
|
return "print";
|
|
@@ -66,6 +68,10 @@ export function applyProfile(args, profile) {
|
|
|
66
68
|
merged.trust = true;
|
|
67
69
|
merged.instructions = [...profile.instructions, ...args.instructions];
|
|
68
70
|
merged.skillDirs = [...args.skillDirs, ...profile.skillDirs];
|
|
71
|
+
// [W5-C0] 子 Agent 目录:--agent-dir 在前、profile agentDirs 在后(W5-G 接入发现)
|
|
72
|
+
const agentDirs = [...(args.agentDirs ?? []), ...(profile.agentDirs ?? [])];
|
|
73
|
+
if (agentDirs.length > 0)
|
|
74
|
+
merged.agentDirs = agentDirs;
|
|
69
75
|
return merged;
|
|
70
76
|
}
|
|
71
77
|
export function sessionRequestOf(args) {
|
|
@@ -63,7 +63,10 @@ export interface CodemodeDescription {
|
|
|
63
63
|
/** 生效模式不是 off 但 codemode 工具不可用(requireStrict)时的说明。 */
|
|
64
64
|
unavailable?: string;
|
|
65
65
|
}
|
|
66
|
-
/**
|
|
66
|
+
/**
|
|
67
|
+
* codemode 生效模式与原因(跟随预设时写明预设与网络由谁隔离)。传 `nodeVersion` 是假设性计算(不探测
|
|
68
|
+
* 操作系统沙箱);不传按配置的 `sandbox.enabled` 用运行时能力。
|
|
69
|
+
*/
|
|
67
70
|
export declare function describeCodemode(config: AmaConfig, nodeVersion?: string): CodemodeDescription;
|
|
68
71
|
export declare function runConfig(argv: readonly string[], io: CliIo, deps: Pick<RuntimeDeps, "providers"> | undefined): Promise<number>;
|
|
69
72
|
export {};
|
|
@@ -23,7 +23,7 @@ import { modelsDevCachePath } from "../../ai/providers/models-dev-cache.js";
|
|
|
23
23
|
import { initConfigDir } from "../../config/init.js";
|
|
24
24
|
import { CONFIG_SCHEMA_FILE } from "../../config/json-schema.js";
|
|
25
25
|
import { CODEMODE_MODES, TOOLS_PRESET_ALIASES, TOOLS_PRESET_INPUTS, canonicalPreset, } from "../../config/types.js";
|
|
26
|
-
import { codemodeAvailability, detectSandboxCapability } from "../../codemode/capability.js";
|
|
26
|
+
import { codemodeAvailability, detectSandboxCapability, sandboxCapabilityFor, } from "../../codemode/capability.js";
|
|
27
27
|
import { baseUrlEnvOf } from "../../ai/providers/registry.js";
|
|
28
28
|
import { classifyKeyValue } from "../../config/auth-file.js";
|
|
29
29
|
import { CODEMODE_TOOL, resolveCodemodeMode, resolvePreset } from "../../tools/presets.js";
|
|
@@ -32,6 +32,8 @@ import { parseSubArgs, UsageError } from "../args.js";
|
|
|
32
32
|
import { noModelGuidance, pickDefaultModel } from "../default-model.js";
|
|
33
33
|
import { ExitCode } from "../exit-codes.js";
|
|
34
34
|
import { buildRegistry, loadUserLevel } from "./context.js";
|
|
35
|
+
import { osSandboxStatus } from "../../sandbox/detect.js";
|
|
36
|
+
import { resolveBashSandbox } from "../../sandbox/bash.js";
|
|
35
37
|
export const CONFIG_USAGE = `用法:ama config show [--json] [--profile <文件>] [--auth-file <文件>]
|
|
36
38
|
[--tools-preset <名>] [--codemode off|on|only]
|
|
37
39
|
ama config path 配置目录、数据目录与各文件路径
|
|
@@ -234,13 +236,18 @@ export function sourcesOf(effective, layers) {
|
|
|
234
236
|
}
|
|
235
237
|
return sources;
|
|
236
238
|
}
|
|
237
|
-
/**
|
|
239
|
+
/**
|
|
240
|
+
* codemode 生效模式与原因(跟随预设时写明预设与网络由谁隔离)。传 `nodeVersion` 是假设性计算(不探测
|
|
241
|
+
* 操作系统沙箱);不传按配置的 `sandbox.enabled` 用运行时能力。
|
|
242
|
+
*/
|
|
238
243
|
export function describeCodemode(config, nodeVersion) {
|
|
239
|
-
const capability = detectSandboxCapability(nodeVersion);
|
|
244
|
+
const capability = nodeVersion === undefined ? sandboxCapabilityFor(config) : detectSandboxCapability(nodeVersion);
|
|
240
245
|
const resolved = resolveCodemodeMode(config, capability.strict);
|
|
241
|
-
const sandbox = capability.
|
|
246
|
+
const sandbox = capability.nodeMajor >= 25
|
|
242
247
|
? `Node ${capability.nodeMajor} 网络已隔离`
|
|
243
|
-
:
|
|
248
|
+
: capability.strict
|
|
249
|
+
? `Node ${capability.nodeMajor} 网络由操作系统沙箱 ${capability.os.kind} 隔离`
|
|
250
|
+
: `Node ${capability.nodeMajor} < 25 网络未隔离`;
|
|
244
251
|
const reason = resolved.source === "config"
|
|
245
252
|
? `codemode.mode 显式设置(${sandbox})`
|
|
246
253
|
: `跟随预设 ${resolved.preset}(${sandbox})`;
|
|
@@ -309,6 +316,9 @@ export async function runConfig(argv, io, deps) {
|
|
|
309
316
|
const model = await describeModel(config, registry);
|
|
310
317
|
const providers = describeProviders(config, registry);
|
|
311
318
|
const codemode = describeCodemode(config);
|
|
319
|
+
const bashSandbox = resolveBashSandbox(config.sandbox, {
|
|
320
|
+
status: osSandboxStatus(config.sandbox?.enabled ?? "auto"),
|
|
321
|
+
});
|
|
312
322
|
const builtin = new Set(builtinTools().map((tool) => tool.name));
|
|
313
323
|
if (codemode.mode !== "off" && codemode.unavailable === undefined)
|
|
314
324
|
builtin.add(CODEMODE_TOOL);
|
|
@@ -337,7 +347,7 @@ export async function runConfig(argv, io, deps) {
|
|
|
337
347
|
value: path.endsWith(".apiKey") ? display(path, value) : value,
|
|
338
348
|
source,
|
|
339
349
|
}));
|
|
340
|
-
io.stdout(`${JSON.stringify({ model, providers, tools: preset.builtin, preset: preset.preset, codemode, entries, layers: layers.map((l) => ({ name: l.name, file: l.label })), notes, warnings }, null, 2)}\n`);
|
|
350
|
+
io.stdout(`${JSON.stringify({ model, providers, tools: preset.builtin, preset: preset.preset, codemode, bashSandbox: { active: bashSandbox.active, detail: bashSandbox.detail }, entries, layers: layers.map((l) => ({ name: l.name, file: l.label })), notes, warnings }, null, 2)}\n`);
|
|
341
351
|
return ExitCode.Ok;
|
|
342
352
|
}
|
|
343
353
|
const lines = ["生效配置(来源:default 内置 ← user ← profile ← project 只能收紧 ← cli)"];
|
|
@@ -355,6 +365,7 @@ export async function runConfig(argv, io, deps) {
|
|
|
355
365
|
lines.push(`codemode:${codemode.mode} ${codemode.reason}`);
|
|
356
366
|
if (codemode.unavailable !== undefined)
|
|
357
367
|
lines.push(` ${codemode.unavailable}`);
|
|
368
|
+
lines.push(`bash 沙箱:${bashSandbox.detail}`);
|
|
358
369
|
for (const note of notes)
|
|
359
370
|
lines.push(`提示:${note}`);
|
|
360
371
|
for (const warning of [...warnings, ...preset.warnings])
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* [W3-B12] baseUrl 来自 `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL` 时在 key 行后标出变量与地址。
|
|
8
8
|
*/
|
|
9
9
|
import { existsSync } from "node:fs";
|
|
10
|
+
import { blobUsage, fileHistoryDir } from "../../checkpoints/blobs.js";
|
|
11
|
+
import { shadowUsage } from "../../checkpoints/shadow-git.js";
|
|
12
|
+
import { formatBytes } from "../../checkpoints/gc.js";
|
|
10
13
|
import { baseUrlEnvOf } from "../../ai/providers/registry.js";
|
|
11
14
|
import { classifyKeyValue, isModeTooOpen, fileMode, readAuthFile } from "../../config/auth-file.js";
|
|
12
15
|
import { findContextFiles } from "../../config/context-files.js";
|
|
@@ -15,6 +18,8 @@ import { mergeProjectAndCli } from "../../config/merge.js";
|
|
|
15
18
|
import { CONFIG_FILE, HOOKS_FILE, projectFile, userFile } from "../../config/paths.js";
|
|
16
19
|
import { findTrustEntry, readTrustFile, trustGatedResources } from "../../config/trust.js";
|
|
17
20
|
import { loadHookConfigs } from "../../hooks/config.js";
|
|
21
|
+
import { osSandboxStatus } from "../../sandbox/detect.js";
|
|
22
|
+
import { resolveBashSandbox } from "../../sandbox/bash.js";
|
|
18
23
|
import { AMA_VERSION } from "../../version.js";
|
|
19
24
|
import { parseSubArgs } from "../args.js";
|
|
20
25
|
import { ExitCode } from "../exit-codes.js";
|
|
@@ -190,6 +195,18 @@ function proxySection(report, io) {
|
|
|
190
195
|
for (const line of describeProxy(inspectProxy(io.env)))
|
|
191
196
|
report.item(line);
|
|
192
197
|
}
|
|
198
|
+
/** 检查点备份占用(docs/rewind-plan.md §1.4)。 */
|
|
199
|
+
async function fileHistoryLine(report, dataDir) {
|
|
200
|
+
try {
|
|
201
|
+
const usage = await blobUsage(dataDir);
|
|
202
|
+
const shadow = await shadowUsage(dataDir);
|
|
203
|
+
const shadowText = shadow.repos === 0 ? "" : `;影子仓库 ${shadow.repos} 个,${formatBytes(shadow.bytes)}`;
|
|
204
|
+
report.item(`file-history:${usage.blobs} 个备份,${formatBytes(usage.bytes)}${shadowText}(${fileHistoryDir(dataDir)};ama sessions prune 清理)`);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
report.item(`file-history:读取失败(${error.message})`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
193
210
|
export async function runDoctor(argv, io, deps) {
|
|
194
211
|
const { values, flags } = parseSubArgs(argv, ["profile", "auth-file"], ["trust", "no-trust"]);
|
|
195
212
|
if (flags.has("help")) {
|
|
@@ -213,6 +230,7 @@ export async function runDoctor(argv, io, deps) {
|
|
|
213
230
|
report.section("目录");
|
|
214
231
|
report.item(`配置目录:${level.configDir}`);
|
|
215
232
|
report.item(`数据目录:${level.dataDir}${existsSync(level.dataDir) ? "" : "(尚未创建)"}`);
|
|
233
|
+
await fileHistoryLine(report, level.dataDir);
|
|
216
234
|
report.section("配置层级(缺省 ← 用户级 ← profile ← 项目级(只能收紧)← 命令行)");
|
|
217
235
|
report.item("缺省:内置");
|
|
218
236
|
probeLine(report, "用户级", "config", level.userConfigPath);
|
|
@@ -233,6 +251,9 @@ export async function runDoctor(argv, io, deps) {
|
|
|
233
251
|
report.item(`codemode:${codemode.mode}(${codemode.reason})`);
|
|
234
252
|
if (codemode.unavailable !== undefined)
|
|
235
253
|
report.item(` ${codemode.unavailable}`);
|
|
254
|
+
const os = osSandboxStatus(merged.config.sandbox?.enabled ?? "auto");
|
|
255
|
+
report.item(`操作系统沙箱:${os.kind === "none" ? "无" : os.kind}(${os.detail}${os.kind !== "none" && !os.restrictsWrites ? ";只隔离网络" : ""})`);
|
|
256
|
+
report.item(`bash 沙箱:${resolveBashSandbox(merged.config.sandbox, { status: os }).detail}`);
|
|
236
257
|
}
|
|
237
258
|
catch {
|
|
238
259
|
// probeLine 已报告
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* (字段缺失或恒 0);其余(读到一点、只有写入)→ `inconclusive`(粒度或 TTL 问题)。
|
|
8
8
|
*
|
|
9
9
|
* 计费动作:执行前打印预估(两次 × `--tokens` × 目录输入价,无价 `$?`);非 TTY 必须 `--yes`
|
|
10
|
-
* (否则退出 2),TTY
|
|
10
|
+
* (否则退出 2),TTY 下方向键选一次「继续 / 取消」(choice-prompt.ts)。`--json` 时预估写 stderr,stdout 只有一个结果对象。
|
|
11
11
|
* 协议层不保留原始响应,「usage 字段」列的是该协议解析时读取的字段名。
|
|
12
12
|
*/
|
|
13
13
|
import type { Api, Model, Usage } from "../../ai/types.js";
|