@armadra/agent 0.0.0-stage → 0.2.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 +22 -0
- package/LICENSE +21 -0
- package/README.md +426 -2
- package/dist/agent/agent.d.ts +56 -0
- package/dist/agent/agent.js +129 -0
- package/dist/agent/loop.d.ts +51 -0
- package/dist/agent/loop.js +158 -0
- package/dist/agent/queue.d.ts +25 -0
- package/dist/agent/queue.js +55 -0
- package/dist/agent/retry.d.ts +22 -0
- package/dist/agent/retry.js +92 -0
- package/dist/agent/schema.d.ts +27 -0
- package/dist/agent/schema.js +186 -0
- package/dist/agent/session-cache.d.ts +100 -0
- package/dist/agent/session-cache.js +511 -0
- package/dist/agent/session-compaction.d.ts +49 -0
- package/dist/agent/session-compaction.js +251 -0
- package/dist/agent/session-core.d.ts +103 -0
- package/dist/agent/session-core.js +7 -0
- package/dist/agent/session-run.d.ts +55 -0
- package/dist/agent/session-run.js +246 -0
- package/dist/agent/session-state.d.ts +39 -0
- package/dist/agent/session-state.js +118 -0
- package/dist/agent/session-subagent.d.ts +54 -0
- package/dist/agent/session-subagent.js +157 -0
- package/dist/agent/session-sync.d.ts +20 -0
- package/dist/agent/session-sync.js +104 -0
- package/dist/agent/session-tools.d.ts +24 -0
- package/dist/agent/session-tools.js +277 -0
- package/dist/agent/session.d.ts +117 -0
- package/dist/agent/session.js +484 -0
- package/dist/agent/system-prompt.d.ts +49 -0
- package/dist/agent/system-prompt.js +121 -0
- package/dist/agent/tool-runner.d.ts +64 -0
- package/dist/agent/tool-runner.js +309 -0
- package/dist/agent/transform.d.ts +26 -0
- package/dist/agent/transform.js +171 -0
- package/dist/agent/types.d.ts +378 -0
- package/dist/agent/types.js +21 -0
- package/dist/ai/apis/anthropic-messages.d.ts +26 -0
- package/dist/ai/apis/anthropic-messages.js +214 -0
- package/dist/ai/apis/anthropic-request.d.ts +42 -0
- package/dist/ai/apis/anthropic-request.js +282 -0
- package/dist/ai/apis/api.d.ts +28 -0
- package/dist/ai/apis/api.js +102 -0
- package/dist/ai/apis/cache-params.d.ts +48 -0
- package/dist/ai/apis/cache-params.js +163 -0
- package/dist/ai/apis/google-generative-ai.d.ts +32 -0
- package/dist/ai/apis/google-generative-ai.js +249 -0
- package/dist/ai/apis/google-request.d.ts +40 -0
- package/dist/ai/apis/google-request.js +255 -0
- package/dist/ai/apis/openai-compat.d.ts +35 -0
- package/dist/ai/apis/openai-compat.js +142 -0
- package/dist/ai/apis/openai-completions.d.ts +28 -0
- package/dist/ai/apis/openai-completions.js +246 -0
- package/dist/ai/apis/openai-request.d.ts +35 -0
- package/dist/ai/apis/openai-request.js +303 -0
- package/dist/ai/apis/openai-responses-request.d.ts +52 -0
- package/dist/ai/apis/openai-responses-request.js +266 -0
- package/dist/ai/apis/openai-responses.d.ts +28 -0
- package/dist/ai/apis/openai-responses.js +303 -0
- package/dist/ai/apis/shared.d.ts +56 -0
- package/dist/ai/apis/shared.js +179 -0
- package/dist/ai/cache/economics.d.ts +24 -0
- package/dist/ai/cache/economics.js +69 -0
- package/dist/ai/cache/fingerprint.d.ts +17 -0
- package/dist/ai/cache/fingerprint.js +39 -0
- package/dist/ai/cache/miss.d.ts +49 -0
- package/dist/ai/cache/miss.js +96 -0
- package/dist/ai/cache/reporting.d.ts +39 -0
- package/dist/ai/cache/reporting.js +102 -0
- package/dist/ai/cache/types.d.ts +94 -0
- package/dist/ai/cache/types.js +19 -0
- package/dist/ai/cache/warmer.d.ts +94 -0
- package/dist/ai/cache/warmer.js +224 -0
- package/dist/ai/context.d.ts +35 -0
- package/dist/ai/context.js +114 -0
- package/dist/ai/cost.d.ts +21 -0
- package/dist/ai/cost.js +60 -0
- package/dist/ai/event-stream.d.ts +33 -0
- package/dist/ai/event-stream.js +101 -0
- package/dist/ai/fake/fake-provider.d.ts +68 -0
- package/dist/ai/fake/fake-provider.js +278 -0
- package/dist/ai/fake/fake-script.d.ts +69 -0
- package/dist/ai/fake/fake-script.js +142 -0
- package/dist/ai/http.d.ts +54 -0
- package/dist/ai/http.js +212 -0
- package/dist/ai/json-partial.d.ts +17 -0
- package/dist/ai/json-partial.js +243 -0
- package/dist/ai/overflow.d.ts +22 -0
- package/dist/ai/overflow.js +61 -0
- package/dist/ai/providers/auth.d.ts +71 -0
- package/dist/ai/providers/auth.js +202 -0
- package/dist/ai/providers/builtin.d.ts +23 -0
- package/dist/ai/providers/builtin.js +148 -0
- package/dist/ai/providers/catalog-data.d.ts +5 -0
- package/dist/ai/providers/catalog-data.js +19 -0
- package/dist/ai/providers/catalog.d.ts +28 -0
- package/dist/ai/providers/catalog.js +166 -0
- package/dist/ai/providers/registry.d.ts +83 -0
- package/dist/ai/providers/registry.js +305 -0
- package/dist/ai/sse.d.ts +32 -0
- package/dist/ai/sse.js +140 -0
- package/dist/ai/thinking.d.ts +42 -0
- package/dist/ai/thinking.js +101 -0
- package/dist/ai/types.d.ts +428 -0
- package/dist/ai/types.js +19 -0
- package/dist/bundle/ama-sandbox.cjs +324 -0
- package/dist/bundle/ama.cjs +25770 -0
- package/dist/bundle.d.ts +9 -0
- package/dist/bundle.js +15 -0
- package/dist/cli/args.d.ts +82 -0
- package/dist/cli/args.js +381 -0
- package/dist/cli/bootstrap.d.ts +18 -0
- package/dist/cli/bootstrap.js +398 -0
- package/dist/cli/compose-providers.d.ts +37 -0
- package/dist/cli/compose-providers.js +104 -0
- package/dist/cli/compose-session.d.ts +69 -0
- package/dist/cli/compose-session.js +370 -0
- package/dist/cli/compose-store.d.ts +24 -0
- package/dist/cli/compose-store.js +125 -0
- package/dist/cli/compose.d.ts +106 -0
- package/dist/cli/compose.js +206 -0
- package/dist/cli/default-model.d.ts +16 -0
- package/dist/cli/default-model.js +24 -0
- package/dist/cli/deps.d.ts +205 -0
- package/dist/cli/deps.js +12 -0
- package/dist/cli/exit-codes.d.ts +29 -0
- package/dist/cli/exit-codes.js +40 -0
- package/dist/cli/main.d.ts +26 -0
- package/dist/cli/main.js +165 -0
- package/dist/cli/runtime.d.ts +90 -0
- package/dist/cli/runtime.js +8 -0
- package/dist/cli/startup-screen.d.ts +15 -0
- package/dist/cli/startup-screen.js +56 -0
- package/dist/cli/startup-steps.d.ts +35 -0
- package/dist/cli/startup-steps.js +197 -0
- package/dist/cli/subcommands/auth.d.ts +12 -0
- package/dist/cli/subcommands/auth.js +91 -0
- package/dist/cli/subcommands/config.d.ts +44 -0
- package/dist/cli/subcommands/config.js +201 -0
- package/dist/cli/subcommands/context.d.ts +21 -0
- package/dist/cli/subcommands/context.js +41 -0
- package/dist/cli/subcommands/doctor.d.ts +11 -0
- package/dist/cli/subcommands/doctor.js +246 -0
- package/dist/cli/subcommands/models-cache-probe.d.ts +34 -0
- package/dist/cli/subcommands/models-cache-probe.js +190 -0
- package/dist/cli/subcommands/models-discover.d.ts +40 -0
- package/dist/cli/subcommands/models-discover.js +204 -0
- package/dist/cli/subcommands/models.d.ts +40 -0
- package/dist/cli/subcommands/models.js +144 -0
- package/dist/cli/subcommands/sessions.d.ts +11 -0
- package/dist/cli/subcommands/sessions.js +100 -0
- package/dist/codemode/capability.d.ts +37 -0
- package/dist/codemode/capability.js +55 -0
- package/dist/codemode/declarations.d.ts +44 -0
- package/dist/codemode/declarations.js +111 -0
- package/dist/codemode/host-side.d.ts +59 -0
- package/dist/codemode/host-side.js +253 -0
- package/dist/codemode/modes.d.ts +23 -0
- package/dist/codemode/modes.js +40 -0
- package/dist/codemode/protocol.d.ts +91 -0
- package/dist/codemode/protocol.js +114 -0
- package/dist/codemode/sandbox-entry.d.ts +25 -0
- package/dist/codemode/sandbox-entry.js +323 -0
- package/dist/codemode/store.d.ts +26 -0
- package/dist/codemode/store.js +53 -0
- package/dist/codemode/tool.d.ts +105 -0
- package/dist/codemode/tool.js +283 -0
- package/dist/compaction/branch-summary.d.ts +30 -0
- package/dist/compaction/branch-summary.js +79 -0
- package/dist/compaction/breaker.d.ts +32 -0
- package/dist/compaction/breaker.js +65 -0
- package/dist/compaction/cut-point.d.ts +23 -0
- package/dist/compaction/cut-point.js +70 -0
- package/dist/compaction/estimate.d.ts +30 -0
- package/dist/compaction/estimate.js +114 -0
- package/dist/compaction/prune-tier.d.ts +31 -0
- package/dist/compaction/prune-tier.js +83 -0
- package/dist/compaction/serialize.d.ts +20 -0
- package/dist/compaction/serialize.js +115 -0
- package/dist/compaction/summarize-tier.d.ts +111 -0
- package/dist/compaction/summarize-tier.js +305 -0
- package/dist/config/auth-file.d.ts +39 -0
- package/dist/config/auth-file.js +92 -0
- package/dist/config/context-files.d.ts +30 -0
- package/dist/config/context-files.js +77 -0
- package/dist/config/load.d.ts +45 -0
- package/dist/config/load.js +97 -0
- package/dist/config/merge.d.ts +73 -0
- package/dist/config/merge.js +248 -0
- package/dist/config/paths.d.ts +38 -0
- package/dist/config/paths.js +108 -0
- package/dist/config/profile.d.ts +27 -0
- package/dist/config/profile.js +65 -0
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.js +413 -0
- package/dist/config/trust.d.ts +42 -0
- package/dist/config/trust.js +122 -0
- package/dist/config/types.d.ts +172 -0
- package/dist/config/types.js +27 -0
- package/dist/config/write.d.ts +10 -0
- package/dist/config/write.js +25 -0
- package/dist/errors.d.ts +28 -0
- package/dist/errors.js +30 -0
- package/dist/hooks/config.d.ts +49 -0
- package/dist/hooks/config.js +102 -0
- package/dist/hooks/dispatcher.d.ts +41 -0
- package/dist/hooks/dispatcher.js +104 -0
- package/dist/hooks/matcher.d.ts +22 -0
- package/dist/hooks/matcher.js +108 -0
- package/dist/hooks/protocol.d.ts +33 -0
- package/dist/hooks/protocol.js +240 -0
- package/dist/hooks/runner.d.ts +30 -0
- package/dist/hooks/runner.js +143 -0
- package/dist/hooks/types.d.ts +147 -0
- package/dist/hooks/types.js +20 -0
- package/dist/host/api-impl.d.ts +75 -0
- package/dist/host/api-impl.js +173 -0
- package/dist/host/loader.d.ts +31 -0
- package/dist/host/loader.js +147 -0
- package/dist/host/types.d.ts +169 -0
- package/dist/host/types.js +14 -0
- package/dist/host.d.ts +5 -0
- package/dist/host.js +4 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +28 -0
- package/dist/modes/commands-core.d.ts +44 -0
- package/dist/modes/commands-core.js +171 -0
- package/dist/modes/interactive/approval-dialog.d.ts +48 -0
- package/dist/modes/interactive/approval-dialog.js +202 -0
- package/dist/modes/interactive/commands.d.ts +41 -0
- package/dist/modes/interactive/commands.js +202 -0
- package/dist/modes/interactive/completion.d.ts +53 -0
- package/dist/modes/interactive/completion.js +157 -0
- package/dist/modes/interactive/interactive-mode.d.ts +46 -0
- package/dist/modes/interactive/interactive-mode.js +487 -0
- package/dist/modes/interactive/key-dispatch.d.ts +29 -0
- package/dist/modes/interactive/key-dispatch.js +107 -0
- package/dist/modes/interactive/line/line-editor.d.ts +50 -0
- package/dist/modes/interactive/line/line-editor.js +232 -0
- package/dist/modes/interactive/line/line-mode.d.ts +20 -0
- package/dist/modes/interactive/line/line-mode.js +216 -0
- package/dist/modes/interactive/line/line-render.d.ts +35 -0
- package/dist/modes/interactive/line/line-render.js +171 -0
- package/dist/modes/interactive/line/paste-state.d.ts +26 -0
- package/dist/modes/interactive/line/paste-state.js +72 -0
- package/dist/modes/interactive/message-view.d.ts +77 -0
- package/dist/modes/interactive/message-view.js +269 -0
- package/dist/modes/interactive/pickers.d.ts +42 -0
- package/dist/modes/interactive/pickers.js +115 -0
- package/dist/modes/interactive/startup-ui.d.ts +28 -0
- package/dist/modes/interactive/startup-ui.js +238 -0
- package/dist/modes/interactive/status-bar.d.ts +48 -0
- package/dist/modes/interactive/status-bar.js +139 -0
- package/dist/modes/interactive/tool-view.d.ts +95 -0
- package/dist/modes/interactive/tool-view.js +344 -0
- package/dist/modes/print/json-event.d.ts +15 -0
- package/dist/modes/print/json-event.js +39 -0
- package/dist/modes/print/print-mode.d.ts +15 -0
- package/dist/modes/print/print-mode.js +96 -0
- package/dist/modes/rpc/commands.d.ts +40 -0
- package/dist/modes/rpc/commands.js +258 -0
- package/dist/modes/rpc/jsonl.d.ts +16 -0
- package/dist/modes/rpc/jsonl.js +55 -0
- package/dist/modes/rpc/rpc-mode.d.ts +22 -0
- package/dist/modes/rpc/rpc-mode.js +153 -0
- package/dist/modes/session-report.d.ts +55 -0
- package/dist/modes/session-report.js +278 -0
- package/dist/modes/shared.d.ts +13 -0
- package/dist/modes/shared.js +52 -0
- package/dist/modes/startup-ui-text.d.ts +16 -0
- package/dist/modes/startup-ui-text.js +103 -0
- package/dist/permissions/broker.d.ts +47 -0
- package/dist/permissions/broker.js +107 -0
- package/dist/permissions/dangerous.d.ts +47 -0
- package/dist/permissions/dangerous.js +370 -0
- package/dist/permissions/pipeline.d.ts +51 -0
- package/dist/permissions/pipeline.js +181 -0
- package/dist/permissions/preview.d.ts +43 -0
- package/dist/permissions/preview.js +463 -0
- package/dist/permissions/rules.d.ts +58 -0
- package/dist/permissions/rules.js +249 -0
- package/dist/permissions/types.d.ts +100 -0
- package/dist/permissions/types.js +18 -0
- package/dist/rpc.d.ts +171 -0
- package/dist/rpc.js +13 -0
- package/dist/sdk.d.ts +98 -0
- package/dist/sdk.js +195 -0
- package/dist/session/manager.d.ts +70 -0
- package/dist/session/manager.js +278 -0
- package/dist/session/migrate.d.ts +19 -0
- package/dist/session/migrate.js +53 -0
- package/dist/session/projection.d.ts +50 -0
- package/dist/session/projection.js +180 -0
- package/dist/session/store.d.ts +47 -0
- package/dist/session/store.js +210 -0
- package/dist/session/tree.d.ts +21 -0
- package/dist/session/tree.js +88 -0
- package/dist/session/types.d.ts +199 -0
- package/dist/session/types.js +18 -0
- package/dist/skills/discover.d.ts +60 -0
- package/dist/skills/discover.js +160 -0
- package/dist/skills/expand.d.ts +35 -0
- package/dist/skills/expand.js +46 -0
- package/dist/skills/frontmatter.d.ts +27 -0
- package/dist/skills/frontmatter.js +157 -0
- package/dist/skills/index-prompt.d.ts +13 -0
- package/dist/skills/index-prompt.js +42 -0
- package/dist/skills/templates.d.ts +52 -0
- package/dist/skills/templates.js +177 -0
- package/dist/tools/bash.d.ts +49 -0
- package/dist/tools/bash.js +222 -0
- package/dist/tools/edit-fuzzy.d.ts +36 -0
- package/dist/tools/edit-fuzzy.js +129 -0
- package/dist/tools/edit.d.ts +38 -0
- package/dist/tools/edit.js +241 -0
- package/dist/tools/file-mutex.d.ts +8 -0
- package/dist/tools/file-mutex.js +29 -0
- package/dist/tools/glob.d.ts +44 -0
- package/dist/tools/glob.js +217 -0
- package/dist/tools/grep.d.ts +39 -0
- package/dist/tools/grep.js +179 -0
- package/dist/tools/ignore.d.ts +40 -0
- package/dist/tools/ignore.js +174 -0
- package/dist/tools/ls.d.ts +21 -0
- package/dist/tools/ls.js +96 -0
- package/dist/tools/output-accumulator.d.ts +48 -0
- package/dist/tools/output-accumulator.js +106 -0
- package/dist/tools/paths.d.ts +20 -0
- package/dist/tools/paths.js +58 -0
- package/dist/tools/presets.d.ts +71 -0
- package/dist/tools/presets.js +128 -0
- package/dist/tools/process-tree.d.ts +35 -0
- package/dist/tools/process-tree.js +125 -0
- package/dist/tools/read.d.ts +28 -0
- package/dist/tools/read.js +181 -0
- package/dist/tools/registry.d.ts +43 -0
- package/dist/tools/registry.js +106 -0
- package/dist/tools/shell.d.ts +38 -0
- package/dist/tools/shell.js +91 -0
- package/dist/tools/task.d.ts +29 -0
- package/dist/tools/task.js +107 -0
- package/dist/tools/todo.d.ts +28 -0
- package/dist/tools/todo.js +107 -0
- package/dist/tools/truncate.d.ts +44 -0
- package/dist/tools/truncate.js +175 -0
- package/dist/tools/types.d.ts +135 -0
- package/dist/tools/types.js +19 -0
- package/dist/tools/write.d.ts +20 -0
- package/dist/tools/write.js +84 -0
- package/dist/tui/ansi.d.ts +29 -0
- package/dist/tui/ansi.js +420 -0
- package/dist/tui/component.d.ts +38 -0
- package/dist/tui/component.js +13 -0
- package/dist/tui/components/box.d.ts +26 -0
- package/dist/tui/components/box.js +65 -0
- package/dist/tui/components/container.d.ts +14 -0
- package/dist/tui/components/container.js +39 -0
- package/dist/tui/components/editor-buffer.d.ts +67 -0
- package/dist/tui/components/editor-buffer.js +300 -0
- package/dist/tui/components/editor-paste.d.ts +29 -0
- package/dist/tui/components/editor-paste.js +64 -0
- package/dist/tui/components/editor.d.ts +114 -0
- package/dist/tui/components/editor.js +530 -0
- package/dist/tui/components/key-value.d.ts +29 -0
- package/dist/tui/components/key-value.js +48 -0
- package/dist/tui/components/loader.d.ts +35 -0
- package/dist/tui/components/loader.js +71 -0
- package/dist/tui/components/markdown.d.ts +90 -0
- package/dist/tui/components/markdown.js +462 -0
- package/dist/tui/components/meter.d.ts +29 -0
- package/dist/tui/components/meter.js +47 -0
- package/dist/tui/components/overlay.d.ts +24 -0
- package/dist/tui/components/overlay.js +52 -0
- package/dist/tui/components/select-list.d.ts +57 -0
- package/dist/tui/components/select-list.js +179 -0
- package/dist/tui/components/spacer.d.ts +11 -0
- package/dist/tui/components/spacer.js +16 -0
- package/dist/tui/components/text.d.ts +30 -0
- package/dist/tui/components/text.js +65 -0
- package/dist/tui/keybindings.d.ts +66 -0
- package/dist/tui/keybindings.js +120 -0
- package/dist/tui/keys.d.ts +38 -0
- package/dist/tui/keys.js +275 -0
- package/dist/tui/stdin-buffer.d.ts +41 -0
- package/dist/tui/stdin-buffer.js +206 -0
- package/dist/tui/terminal.d.ts +79 -0
- package/dist/tui/terminal.js +153 -0
- package/dist/tui/theme.d.ts +31 -0
- package/dist/tui/theme.js +199 -0
- package/dist/tui/tui.d.ts +103 -0
- package/dist/tui/tui.js +363 -0
- package/dist/tui/vt-screen.d.ts +46 -0
- package/dist/tui/vt-screen.js +251 -0
- package/dist/tui.d.ts +30 -0
- package/dist/tui.js +31 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.js +24 -0
- package/docs/codemode.md +102 -0
- package/docs/hooks.md +196 -0
- package/docs/host-api.md +161 -0
- package/docs/providers.md +316 -0
- package/docs/rpc.md +253 -0
- package/docs/session-format.md +119 -0
- package/docs/tui.md +168 -0
- package/package.json +101 -4
package/dist/bundle.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 单文件入口(dist/bundle/ama.cjs)。[B0] 所有。
|
|
3
|
+
*
|
|
4
|
+
* esbuild 以本文件为入口打成 CJS:`import.meta.url` 由构建脚本替换为 `__filename` 的
|
|
5
|
+
* file URL,`__AMA_BUNDLED__` 定义为 true(cli/main.ts 据此不自动运行,改由这里调用)。
|
|
6
|
+
* CJS 产物里原生 `require` 可用,宿主适配器(`--host`)的 CJS 模块由 host/loader.ts(B5)
|
|
7
|
+
* 用 `createRequire` 加载,不依赖这里。
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
package/dist/bundle.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 单文件入口(dist/bundle/ama.cjs)。[B0] 所有。
|
|
3
|
+
*
|
|
4
|
+
* esbuild 以本文件为入口打成 CJS:`import.meta.url` 由构建脚本替换为 `__filename` 的
|
|
5
|
+
* file URL,`__AMA_BUNDLED__` 定义为 true(cli/main.ts 据此不自动运行,改由这里调用)。
|
|
6
|
+
* CJS 产物里原生 `require` 可用,宿主适配器(`--host`)的 CJS 模块由 host/loader.ts(B5)
|
|
7
|
+
* 用 `createRequire` 加载,不依赖这里。
|
|
8
|
+
*/
|
|
9
|
+
import { main } from "./cli/main.js";
|
|
10
|
+
main(process.argv.slice(2)).then((code) => {
|
|
11
|
+
process.exitCode = code;
|
|
12
|
+
}, (error) => {
|
|
13
|
+
process.stderr.write(`ama: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
14
|
+
process.exitCode = 1;
|
|
15
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 手写参数解析(设计 §11.1 第 2 步、§12.10、§13)。[B5]
|
|
3
|
+
*
|
|
4
|
+
* - 支持 `--opt value` 与 `--opt=value`;`--` 之后全部作为提示文本;可重复的参数累加。
|
|
5
|
+
* - 子命令只在第一个参数是 `auth / sessions / models / doctor / config` 时识别,其余参数原样交给子命令。
|
|
6
|
+
* - 互斥:`-p` 与 `--mode rpc`;`--continue` / `--resume` / `--session-id` / `--fork` 两两互斥;
|
|
7
|
+
* `--trust` 与 `--no-trust`;`--api-key` 需要 `--model`;`--output-format` 需要 `-p`。
|
|
8
|
+
* - `--resume [id]`:下一个参数形如会话 id(无空白、不以 `-` 开头)才被当作 id;
|
|
9
|
+
* 否则仍作为提示文本。显式写法 `--resume=<id>`。
|
|
10
|
+
* - `--provider` 不带 `--model` 不在这里报错,由 bootstrap 第 11 步报(退出码 2)。
|
|
11
|
+
*/
|
|
12
|
+
import { AmaError } from "../errors.js";
|
|
13
|
+
import type { ModelThinkingLevel } from "../ai/types.js";
|
|
14
|
+
import type { PermissionMode } from "../permissions/types.js";
|
|
15
|
+
import type { CodemodeMode, ToolsPreset } from "../config/types.js";
|
|
16
|
+
export declare const SUBCOMMANDS: readonly ["auth", "sessions", "models", "doctor", "config"];
|
|
17
|
+
export type SubcommandName = (typeof SUBCOMMANDS)[number];
|
|
18
|
+
export type OutputFormat = "text" | "json" | "stream-json";
|
|
19
|
+
export type QuietStartup = "normal" | "header" | "silent";
|
|
20
|
+
export interface ParsedArgs {
|
|
21
|
+
help: boolean;
|
|
22
|
+
version: boolean;
|
|
23
|
+
profile?: string;
|
|
24
|
+
host?: string;
|
|
25
|
+
instructions: string[];
|
|
26
|
+
skillDirs: string[];
|
|
27
|
+
authFile?: string;
|
|
28
|
+
permissionMode?: PermissionMode;
|
|
29
|
+
allow: string[];
|
|
30
|
+
deny: string[];
|
|
31
|
+
model?: string;
|
|
32
|
+
provider?: string;
|
|
33
|
+
apiKey?: string;
|
|
34
|
+
thinking?: ModelThinkingLevel;
|
|
35
|
+
continue: boolean;
|
|
36
|
+
/** `--resume` 出现即为 true;`resumeId` 为可选 id。 */
|
|
37
|
+
resume: boolean;
|
|
38
|
+
resumeId?: string;
|
|
39
|
+
sessionId?: string;
|
|
40
|
+
fork?: string;
|
|
41
|
+
sessionDir?: string;
|
|
42
|
+
print: boolean;
|
|
43
|
+
outputFormat?: OutputFormat;
|
|
44
|
+
/** `--mode rpc`。 */
|
|
45
|
+
mode?: "rpc";
|
|
46
|
+
noTui: boolean;
|
|
47
|
+
tuiMode?: "regular";
|
|
48
|
+
quietStartup?: QuietStartup;
|
|
49
|
+
/** `--trust` → true、`--no-trust` → false。 */
|
|
50
|
+
trust?: boolean;
|
|
51
|
+
tools?: string[];
|
|
52
|
+
excludeTools?: string[];
|
|
53
|
+
/** `--tools-preset`:覆盖 config `tools.preset`。 */
|
|
54
|
+
toolsPreset?: ToolsPreset;
|
|
55
|
+
/** `--codemode`:覆盖 config `codemode.mode`。 */
|
|
56
|
+
codemode?: CodemodeMode;
|
|
57
|
+
/** 位置参数拼成的提示(空格连接)。 */
|
|
58
|
+
prompt?: string;
|
|
59
|
+
/** 原始位置参数。 */
|
|
60
|
+
positionals: string[];
|
|
61
|
+
}
|
|
62
|
+
export type ParseResult = {
|
|
63
|
+
kind: "run";
|
|
64
|
+
args: ParsedArgs;
|
|
65
|
+
} | {
|
|
66
|
+
kind: "subcommand";
|
|
67
|
+
name: SubcommandName;
|
|
68
|
+
argv: string[];
|
|
69
|
+
};
|
|
70
|
+
export declare class UsageError extends AmaError {
|
|
71
|
+
constructor(message: string);
|
|
72
|
+
}
|
|
73
|
+
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\uFF08\u63D0\u793A\u53EF\u6765\u81EA\u53C2\u6570\u4E0E stdin \u7BA1\u9053\uFF09\n --output-format <\u683C\u5F0F> -p \u7684\u8F93\u51FA\uFF1Atext\uFF08\u7F3A\u7701\uFF09| json | stream-json\n --mode rpc stdio JSONL \u534F\u8BAE\uFF08\u4F9B\u5D4C\u5165\uFF09\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\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\n\u6743\u9650\u4E0E\u4FE1\u4EFB\n --permission-mode <\u6A21\u5F0F> plan | default | auto-edit | full-auto\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 --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 --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 | coordinator\n --codemode <\u6A21\u5F0F> codemode \u8C03\u7528\u65B9\u5F0F\uFF1Aoff | on | only\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 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 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\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 78 \u5BBF\u4E3B API \u7248\u672C\u4E0D\u5339\u914D \u00B7 130 SIGINT \u00B7 143 SIGTERM\n";
|
|
74
|
+
export declare function emptyArgs(): ParsedArgs;
|
|
75
|
+
/** 解析 argv(不含 node 与脚本路径);用法错误抛 UsageError(退出码 2)。 */
|
|
76
|
+
export declare function parseArgs(argv: readonly string[]): ParseResult;
|
|
77
|
+
/** 子命令内部的小解析器:`--name value` / `--name=value` / 位置参数。 */
|
|
78
|
+
export declare function parseSubArgs(argv: readonly string[], valueOptions: readonly string[], flagOptions?: readonly string[]): {
|
|
79
|
+
positionals: string[];
|
|
80
|
+
values: Map<string, string>;
|
|
81
|
+
flags: Set<string>;
|
|
82
|
+
};
|
package/dist/cli/args.js
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 手写参数解析(设计 §11.1 第 2 步、§12.10、§13)。[B5]
|
|
3
|
+
*
|
|
4
|
+
* - 支持 `--opt value` 与 `--opt=value`;`--` 之后全部作为提示文本;可重复的参数累加。
|
|
5
|
+
* - 子命令只在第一个参数是 `auth / sessions / models / doctor / config` 时识别,其余参数原样交给子命令。
|
|
6
|
+
* - 互斥:`-p` 与 `--mode rpc`;`--continue` / `--resume` / `--session-id` / `--fork` 两两互斥;
|
|
7
|
+
* `--trust` 与 `--no-trust`;`--api-key` 需要 `--model`;`--output-format` 需要 `-p`。
|
|
8
|
+
* - `--resume [id]`:下一个参数形如会话 id(无空白、不以 `-` 开头)才被当作 id;
|
|
9
|
+
* 否则仍作为提示文本。显式写法 `--resume=<id>`。
|
|
10
|
+
* - `--provider` 不带 `--model` 不在这里报错,由 bootstrap 第 11 步报(退出码 2)。
|
|
11
|
+
*/
|
|
12
|
+
import { AmaError } from "../errors.js";
|
|
13
|
+
import { CODEMODE_MODES } from "../config/types.js";
|
|
14
|
+
export const SUBCOMMANDS = ["auth", "sessions", "models", "doctor", "config"];
|
|
15
|
+
export class UsageError extends AmaError {
|
|
16
|
+
constructor(message) {
|
|
17
|
+
super("invalid_arguments", message, { exitCode: 2 });
|
|
18
|
+
this.name = "UsageError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const PERMISSION_MODES = ["plan", "default", "auto-edit", "full-auto"];
|
|
22
|
+
const THINKING_LEVELS = [
|
|
23
|
+
"off",
|
|
24
|
+
"minimal",
|
|
25
|
+
"low",
|
|
26
|
+
"medium",
|
|
27
|
+
"high",
|
|
28
|
+
"xhigh",
|
|
29
|
+
];
|
|
30
|
+
const OUTPUT_FORMATS = ["text", "json", "stream-json"];
|
|
31
|
+
const QUIET_LEVELS = ["normal", "header", "silent"];
|
|
32
|
+
/** 帮助与报错按常用顺序列出(校验集合同 TOOLS_PRESETS_STRICT_FIRST)。 */
|
|
33
|
+
const PRESET_CHOICES = ["default", "minimal", "codemode", "coordinator"];
|
|
34
|
+
const SESSION_ID_LIKE = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
|
|
35
|
+
export const HELP_TEXT = `用法:ama [选项] [提示]
|
|
36
|
+
ama <子命令> …
|
|
37
|
+
|
|
38
|
+
模式
|
|
39
|
+
(缺省) 终端界面;stdin / stdout 非 TTY 或 TERM=dumb 时自动降级为行式
|
|
40
|
+
--no-tui 行式界面(readline + 括号粘贴)
|
|
41
|
+
-p, --print 非交互:执行提示后退出(提示可来自参数与 stdin 管道)
|
|
42
|
+
--output-format <格式> -p 的输出:text(缺省)| json | stream-json
|
|
43
|
+
--mode rpc stdio JSONL 协议(供嵌入)
|
|
44
|
+
--tui-mode <模式> 显示模式,第一期只有 regular(主屏)
|
|
45
|
+
--quiet-startup <档> 启动画面:normal | header | silent
|
|
46
|
+
|
|
47
|
+
模型
|
|
48
|
+
--model <provider/id> 模型(可配合 --provider 只写 id)
|
|
49
|
+
--provider <id> 供应商(必须同时给 --model)
|
|
50
|
+
--api-key <key> 只用于本次启动的 key(需要 --model;优先用 ama auth set)
|
|
51
|
+
--thinking <级别> off | minimal | low | medium | high | xhigh
|
|
52
|
+
|
|
53
|
+
会话
|
|
54
|
+
-c, --continue 继续本目录最近的会话
|
|
55
|
+
-r, --resume [id] 恢复会话(交互模式无 id 时弹选择器)
|
|
56
|
+
--session-id <id> 使用指定 id 的会话(不存在则新建)
|
|
57
|
+
--fork <id> 从指定会话分叉出新会话
|
|
58
|
+
--session-dir <目录> 会话目录(缺省 ~/.local/share/ama/sessions)
|
|
59
|
+
|
|
60
|
+
权限与信任
|
|
61
|
+
--permission-mode <模式> plan | default | auto-edit | full-auto
|
|
62
|
+
--allow <规则> 追加允许规则,可重复(如 "bash(git status*)")
|
|
63
|
+
--deny <规则> 追加拒绝规则,可重复(如 "write(**/.env*)")
|
|
64
|
+
--trust / --no-trust 信任 / 不信任当前项目(项目级 Hook、Skill、提示模板)
|
|
65
|
+
|
|
66
|
+
资源
|
|
67
|
+
--profile <文件> 宿主 profile.json(字段等价于对应参数,命令行优先)
|
|
68
|
+
--host <模块> 宿主适配器模块(CJS / ESM)
|
|
69
|
+
--instructions <文件> 追加指令文件,可重复
|
|
70
|
+
--skill-dir <目录> 追加 Skill 目录,可重复
|
|
71
|
+
--auth-file <文件> auth.json 位置(缺省 ~/.config/ama/auth.json)
|
|
72
|
+
--tools <a,b,…> 只启用这些工具
|
|
73
|
+
--exclude-tools <a,b,…> 禁用这些工具
|
|
74
|
+
--tools-preset <名> 工具预设:default(缺省)| minimal | codemode | coordinator
|
|
75
|
+
--codemode <模式> codemode 调用方式:off | on | only
|
|
76
|
+
|
|
77
|
+
子命令
|
|
78
|
+
ama auth set <provider> 从 stdin 读取 key 写入 auth.json(0600)
|
|
79
|
+
ama auth list 列出已保存 key 的供应商(不显示 key)
|
|
80
|
+
ama auth remove <provider> 删除已保存的 key
|
|
81
|
+
ama sessions list|show|prune 会话管理
|
|
82
|
+
ama models list [--provider <id>] 列出模型(含来源与 key 状态)
|
|
83
|
+
ama models check <provider/id> 发一次最小请求检查可用性
|
|
84
|
+
ama models discover <provider> [--probe] [--write] [--limit N]
|
|
85
|
+
从中转 /v1/models 列出模型,探测协议并写入配置
|
|
86
|
+
ama models cache-probe <provider/id> [--tokens N] [--gap-ms MS] [--yes] [--json]
|
|
87
|
+
判断端点是否报告缓存命中
|
|
88
|
+
ama doctor 配置层级、信任、key 来源、Hook、终端能力
|
|
89
|
+
ama config show [--json] 生效配置与每项来源、将使用的模型
|
|
90
|
+
|
|
91
|
+
其它
|
|
92
|
+
-h, --help 输出本帮助
|
|
93
|
+
-v, --version 输出版本
|
|
94
|
+
|
|
95
|
+
退出码:0 正常 · 1 运行期错误 · 2 用法错误 · 3 配置错误 · 4 无可用模型或 key ·
|
|
96
|
+
5 会话错误 · 6 宿主 / Hook 启动失败 · 78 宿主 API 版本不匹配 · 130 SIGINT · 143 SIGTERM
|
|
97
|
+
`;
|
|
98
|
+
const VALUE_OPTIONS = new Set([
|
|
99
|
+
"profile",
|
|
100
|
+
"host",
|
|
101
|
+
"instructions",
|
|
102
|
+
"skill-dir",
|
|
103
|
+
"auth-file",
|
|
104
|
+
"permission-mode",
|
|
105
|
+
"allow",
|
|
106
|
+
"deny",
|
|
107
|
+
"model",
|
|
108
|
+
"provider",
|
|
109
|
+
"api-key",
|
|
110
|
+
"thinking",
|
|
111
|
+
"session-id",
|
|
112
|
+
"fork",
|
|
113
|
+
"session-dir",
|
|
114
|
+
"output-format",
|
|
115
|
+
"mode",
|
|
116
|
+
"tui-mode",
|
|
117
|
+
"quiet-startup",
|
|
118
|
+
"tools",
|
|
119
|
+
"exclude-tools",
|
|
120
|
+
"tools-preset",
|
|
121
|
+
"codemode",
|
|
122
|
+
]);
|
|
123
|
+
const FLAG_ALIASES = {
|
|
124
|
+
"-h": "help",
|
|
125
|
+
"-v": "version",
|
|
126
|
+
"-p": "print",
|
|
127
|
+
"-c": "continue",
|
|
128
|
+
"-r": "resume",
|
|
129
|
+
};
|
|
130
|
+
function choice(option, value, choices) {
|
|
131
|
+
if (choices.includes(value))
|
|
132
|
+
return value;
|
|
133
|
+
throw new UsageError(`--${option} 的取值应为 ${choices.join(" | ")}(收到 ${value})`);
|
|
134
|
+
}
|
|
135
|
+
function list(value) {
|
|
136
|
+
return value
|
|
137
|
+
.split(",")
|
|
138
|
+
.map((s) => s.trim())
|
|
139
|
+
.filter((s) => s !== "");
|
|
140
|
+
}
|
|
141
|
+
export function emptyArgs() {
|
|
142
|
+
return {
|
|
143
|
+
help: false,
|
|
144
|
+
version: false,
|
|
145
|
+
instructions: [],
|
|
146
|
+
skillDirs: [],
|
|
147
|
+
allow: [],
|
|
148
|
+
deny: [],
|
|
149
|
+
continue: false,
|
|
150
|
+
resume: false,
|
|
151
|
+
print: false,
|
|
152
|
+
noTui: false,
|
|
153
|
+
positionals: [],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function applyValue(args, option, value) {
|
|
157
|
+
if (value === "")
|
|
158
|
+
throw new UsageError(`--${option} 的值不能为空`);
|
|
159
|
+
switch (option) {
|
|
160
|
+
case "profile":
|
|
161
|
+
args.profile = value;
|
|
162
|
+
break;
|
|
163
|
+
case "host":
|
|
164
|
+
args.host = value;
|
|
165
|
+
break;
|
|
166
|
+
case "instructions":
|
|
167
|
+
args.instructions.push(value);
|
|
168
|
+
break;
|
|
169
|
+
case "skill-dir":
|
|
170
|
+
args.skillDirs.push(value);
|
|
171
|
+
break;
|
|
172
|
+
case "auth-file":
|
|
173
|
+
args.authFile = value;
|
|
174
|
+
break;
|
|
175
|
+
case "permission-mode":
|
|
176
|
+
args.permissionMode = choice(option, value, PERMISSION_MODES);
|
|
177
|
+
break;
|
|
178
|
+
case "allow":
|
|
179
|
+
args.allow.push(value);
|
|
180
|
+
break;
|
|
181
|
+
case "deny":
|
|
182
|
+
args.deny.push(value);
|
|
183
|
+
break;
|
|
184
|
+
case "model":
|
|
185
|
+
args.model = value;
|
|
186
|
+
break;
|
|
187
|
+
case "provider":
|
|
188
|
+
args.provider = value;
|
|
189
|
+
break;
|
|
190
|
+
case "api-key":
|
|
191
|
+
args.apiKey = value;
|
|
192
|
+
break;
|
|
193
|
+
case "thinking":
|
|
194
|
+
args.thinking = choice(option, value, THINKING_LEVELS);
|
|
195
|
+
break;
|
|
196
|
+
case "session-id":
|
|
197
|
+
args.sessionId = value;
|
|
198
|
+
break;
|
|
199
|
+
case "fork":
|
|
200
|
+
args.fork = value;
|
|
201
|
+
break;
|
|
202
|
+
case "session-dir":
|
|
203
|
+
args.sessionDir = value;
|
|
204
|
+
break;
|
|
205
|
+
case "output-format":
|
|
206
|
+
args.outputFormat = choice(option, value, OUTPUT_FORMATS);
|
|
207
|
+
break;
|
|
208
|
+
case "mode":
|
|
209
|
+
args.mode = choice(option, value, ["rpc"]);
|
|
210
|
+
break;
|
|
211
|
+
case "tui-mode":
|
|
212
|
+
if (value === "fullscreen")
|
|
213
|
+
throw new UsageError("--tui-mode fullscreen 尚未支持(第一期只有 regular)");
|
|
214
|
+
args.tuiMode = choice(option, value, ["regular"]);
|
|
215
|
+
break;
|
|
216
|
+
case "quiet-startup":
|
|
217
|
+
args.quietStartup = choice(option, value, QUIET_LEVELS);
|
|
218
|
+
break;
|
|
219
|
+
case "tools":
|
|
220
|
+
args.tools = [...(args.tools ?? []), ...list(value)];
|
|
221
|
+
break;
|
|
222
|
+
case "exclude-tools":
|
|
223
|
+
args.excludeTools = [...(args.excludeTools ?? []), ...list(value)];
|
|
224
|
+
break;
|
|
225
|
+
case "tools-preset":
|
|
226
|
+
args.toolsPreset = choice(option, value, PRESET_CHOICES);
|
|
227
|
+
break;
|
|
228
|
+
case "codemode":
|
|
229
|
+
args.codemode = choice(option, value, CODEMODE_MODES);
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function applyFlag(args, name) {
|
|
234
|
+
switch (name) {
|
|
235
|
+
case "help":
|
|
236
|
+
args.help = true;
|
|
237
|
+
return true;
|
|
238
|
+
case "version":
|
|
239
|
+
args.version = true;
|
|
240
|
+
return true;
|
|
241
|
+
case "print":
|
|
242
|
+
args.print = true;
|
|
243
|
+
return true;
|
|
244
|
+
case "continue":
|
|
245
|
+
args.continue = true;
|
|
246
|
+
return true;
|
|
247
|
+
case "no-tui":
|
|
248
|
+
args.noTui = true;
|
|
249
|
+
return true;
|
|
250
|
+
case "trust":
|
|
251
|
+
case "no-trust": {
|
|
252
|
+
const value = name === "trust";
|
|
253
|
+
if (args.trust !== undefined && args.trust !== value) {
|
|
254
|
+
throw new UsageError("--trust 与 --no-trust 不能同时使用");
|
|
255
|
+
}
|
|
256
|
+
args.trust = value;
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
default:
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function validate(args) {
|
|
264
|
+
if (args.print && args.mode === "rpc")
|
|
265
|
+
throw new UsageError("-p 与 --mode rpc 不能同时使用");
|
|
266
|
+
const sessionFlags = [
|
|
267
|
+
args.continue ? "--continue" : undefined,
|
|
268
|
+
args.resume ? "--resume" : undefined,
|
|
269
|
+
args.sessionId !== undefined ? "--session-id" : undefined,
|
|
270
|
+
args.fork !== undefined ? "--fork" : undefined,
|
|
271
|
+
].filter((f) => f !== undefined);
|
|
272
|
+
if (sessionFlags.length > 1)
|
|
273
|
+
throw new UsageError(`${sessionFlags.join(" 与 ")} 不能同时使用`);
|
|
274
|
+
if (args.apiKey !== undefined && args.model === undefined) {
|
|
275
|
+
throw new UsageError("--api-key 需要同时给出 --model");
|
|
276
|
+
}
|
|
277
|
+
if (args.outputFormat !== undefined && !args.print) {
|
|
278
|
+
throw new UsageError("--output-format 只用于 -p / --print");
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/** 解析 argv(不含 node 与脚本路径);用法错误抛 UsageError(退出码 2)。 */
|
|
282
|
+
export function parseArgs(argv) {
|
|
283
|
+
const first = argv[0];
|
|
284
|
+
if (first !== undefined && SUBCOMMANDS.includes(first)) {
|
|
285
|
+
return { kind: "subcommand", name: first, argv: argv.slice(1) };
|
|
286
|
+
}
|
|
287
|
+
const args = emptyArgs();
|
|
288
|
+
for (let i = 0; i < argv.length; i++) {
|
|
289
|
+
const token = argv[i] ?? "";
|
|
290
|
+
if (token === "--") {
|
|
291
|
+
args.positionals.push(...argv.slice(i + 1));
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
if (!token.startsWith("-") || token === "-") {
|
|
295
|
+
args.positionals.push(token);
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
let name;
|
|
299
|
+
let inline;
|
|
300
|
+
if (token.startsWith("--")) {
|
|
301
|
+
const eq = token.indexOf("=");
|
|
302
|
+
name = eq === -1 ? token.slice(2) : token.slice(2, eq);
|
|
303
|
+
inline = eq === -1 ? undefined : token.slice(eq + 1);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
const alias = FLAG_ALIASES[token];
|
|
307
|
+
if (alias === undefined)
|
|
308
|
+
throw new UsageError(`未知选项:${token}`);
|
|
309
|
+
name = alias;
|
|
310
|
+
}
|
|
311
|
+
if (name === "resume") {
|
|
312
|
+
args.resume = true;
|
|
313
|
+
const next = argv[i + 1];
|
|
314
|
+
if (inline !== undefined) {
|
|
315
|
+
if (inline === "")
|
|
316
|
+
throw new UsageError("--resume= 的 id 不能为空");
|
|
317
|
+
args.resumeId = inline;
|
|
318
|
+
}
|
|
319
|
+
else if (next !== undefined && SESSION_ID_LIKE.test(next)) {
|
|
320
|
+
args.resumeId = next;
|
|
321
|
+
i++;
|
|
322
|
+
}
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (VALUE_OPTIONS.has(name)) {
|
|
326
|
+
let value = inline;
|
|
327
|
+
if (value === undefined) {
|
|
328
|
+
value = argv[i + 1];
|
|
329
|
+
if (value === undefined)
|
|
330
|
+
throw new UsageError(`--${name} 需要一个值`);
|
|
331
|
+
i++;
|
|
332
|
+
}
|
|
333
|
+
applyValue(args, name, value);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
if (inline !== undefined)
|
|
337
|
+
throw new UsageError(`--${name} 不接受值`);
|
|
338
|
+
if (!applyFlag(args, name))
|
|
339
|
+
throw new UsageError(`未知选项:${token}`);
|
|
340
|
+
}
|
|
341
|
+
if (args.positionals.length > 0)
|
|
342
|
+
args.prompt = args.positionals.join(" ");
|
|
343
|
+
if (!args.help && !args.version)
|
|
344
|
+
validate(args);
|
|
345
|
+
return { kind: "run", args };
|
|
346
|
+
}
|
|
347
|
+
/** 子命令内部的小解析器:`--name value` / `--name=value` / 位置参数。 */
|
|
348
|
+
export function parseSubArgs(argv, valueOptions, flagOptions = []) {
|
|
349
|
+
const positionals = [];
|
|
350
|
+
const values = new Map();
|
|
351
|
+
const flags = new Set();
|
|
352
|
+
for (let i = 0; i < argv.length; i++) {
|
|
353
|
+
const token = argv[i] ?? "";
|
|
354
|
+
if (!token.startsWith("--")) {
|
|
355
|
+
if (token === "-h")
|
|
356
|
+
flags.add("help");
|
|
357
|
+
else
|
|
358
|
+
positionals.push(token);
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
const eq = token.indexOf("=");
|
|
362
|
+
const name = eq === -1 ? token.slice(2) : token.slice(2, eq);
|
|
363
|
+
if (name === "help") {
|
|
364
|
+
flags.add("help");
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
if (valueOptions.includes(name)) {
|
|
368
|
+
const value = eq === -1 ? argv[++i] : token.slice(eq + 1);
|
|
369
|
+
if (value === undefined || value === "")
|
|
370
|
+
throw new UsageError(`--${name} 需要一个值`);
|
|
371
|
+
values.set(name, value);
|
|
372
|
+
}
|
|
373
|
+
else if (flagOptions.includes(name) && eq === -1) {
|
|
374
|
+
flags.add(name);
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
throw new UsageError(`未知选项:${token}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return { positionals, values, flags };
|
|
381
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 启动序列编排(设计 §11.1 第 3–16 步、§11.2)。[B5]
|
|
3
|
+
*
|
|
4
|
+
* `bootstrap(args, deps, io)` 跑第 3–14 步并返回 Runtime(SDK `createRuntime()` 复用);
|
|
5
|
+
* `runCli(argv, deps, io)` 在其前后加上第 2 步(参数)与第 15–16 步(模式分派),返回退出码。
|
|
6
|
+
* 每步失败抛 `StartupError{exitCode}`;具体实现经 RuntimeDeps 注入(见 cli/deps.ts)。
|
|
7
|
+
*/
|
|
8
|
+
import { type ParsedArgs } from "./args.js";
|
|
9
|
+
import type { CliIo, RuntimeDeps } from "./deps.js";
|
|
10
|
+
import type { Runtime } from "./runtime.js";
|
|
11
|
+
/** §11.1 第 3–14 步。 */
|
|
12
|
+
export declare function bootstrap(argsIn: ParsedArgs, deps: RuntimeDeps, io: CliIo): Promise<Runtime>;
|
|
13
|
+
/** 非交互模式接管 stdout:console.log / info / debug 改写到 stderr;返回还原函数。 */
|
|
14
|
+
export declare function takeOverStdout(): () => void;
|
|
15
|
+
export declare function isTerminalInitError(error: unknown): boolean;
|
|
16
|
+
/** 第 2–16 步:参数 → bootstrap → 模式;返回退出码(不含子命令)。 */
|
|
17
|
+
export declare function runCli(argv: readonly string[], deps: RuntimeDeps | undefined, io: CliIo): Promise<number>;
|
|
18
|
+
export declare function reportError(error: unknown, io: Pick<CliIo, "stderr">, fallback?: number): number;
|