@armadra/agent 0.0.0-stage → 0.3.0

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