@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,221 @@
1
+ /**
2
+ * 组装根(composition root,实施计划 §1):`createRuntimeDeps()` 把各批次的实现装成 bootstrap 要的
3
+ * `RuntimeDeps`。CLI(main.ts 动态 import)与 SDK(sdk.ts)共用。[B6]
4
+ *
5
+ * | 字段 | 实现 |
6
+ * | -------------------- | -------------------------------------------------------------------- |
7
+ * | providers.create | compose-providers.ts(ProviderRegistry + auth + 零配置本地探测) |
8
+ * | sessions.* | compose-store.ts(SessionManager 五种请求、list / show / prune) |
9
+ * | tools.create | PresetToolRegistry:内置 + 工具工厂 + extraTools,按预设定活动集 |
10
+ * | permissions.create | 内置 deny(按 builtinDeny 过滤)+ 逐条 parseRule → PermissionPipeline |
11
+ * | resources.discover | skills / 提示模板发现,完整对象存进闭包状态 |
12
+ * | session.create | compose-session.ts |
13
+ * | modes | line / print / rpc 懒加载;interactive 在 B7 之前回落到 line |
14
+ * | ui | 传了 io 时:终端 → 迷你 TUI(懒加载),否则文本问答;stdin 非 TTY 不问 |
15
+ *
16
+ * **跨步骤状态走闭包(表 B·B13,有意保留)**:`RuntimeDeps.tools.create` 的入参没有 skills / 提示模板,
17
+ * 第 13 步 `resources.discover` 把完整对象存进 `ComposeState`,组装会话时(compose-session.ts 的技能
18
+ * 索引与 `/skill:` 展开)再取。不为此扩契约:两步都在同一个 `createRuntimeDeps()` 闭包里,顺序由
19
+ * bootstrap 固定。
20
+ *
21
+ * **工具注册点(给 B10 等)**:`ComposeOptions.toolFactories` 与 `DEFAULT_TOOL_FACTORIES`。工厂在
22
+ * 第 12 步建注册表时调用,产物以 `builtin` 来源注册(受预设管理);工厂拿不到会话对象本身,执行期
23
+ * 需要会话时用 `ctx.session()`,嵌套调用其它工具用 `ToolContext.tools.executeTool`(走完整门禁)。
24
+ */
25
+ import { formatModelRef } from "../ai/providers/channels.js";
26
+ import { PermissionPipeline } from "../permissions/pipeline.js";
27
+ import { BUILTIN_DENY_RULES, parseRule } from "../permissions/rules.js";
28
+ import { discoverSkills, skillSources } from "../skills/discover.js";
29
+ import { discoverPromptTemplates, promptSources } from "../skills/templates.js";
30
+ import { applyCodemodeMode, decorateForMode } from "../codemode/modes.js";
31
+ import { codemodeToolFactory } from "../codemode/tool.js";
32
+ import { PresetToolRegistry, resolvePreset } from "../tools/presets.js";
33
+ import { builtinTools } from "../tools/registry.js";
34
+ import { buildProviderRegistry } from "./compose-providers.js";
35
+ import { composeSession, emptyComposeState, } from "./compose-session.js";
36
+ import { createSessionStore } from "./compose-store.js";
37
+ import { defaultSendUser } from "./startup-steps.js";
38
+ /** 缺省工具工厂:codemode(`codemode.mode` 生效值为 off 时不注册)。 */
39
+ export const DEFAULT_TOOL_FACTORIES = [codemodeToolFactory()];
40
+ export function lazyMode(load) {
41
+ return async (runtime, context) => (await load())(runtime, context);
42
+ }
43
+ /** 缺省模式(懒加载:子命令与 --version 不加载模式实现)。 */
44
+ export const DEFAULT_MODES = {
45
+ print: lazyMode(async () => (await import("../modes/print/print-mode.js")).runPrintMode),
46
+ rpc: lazyMode(async () => (await import("../modes/rpc/rpc-mode.js")).runRpcMode),
47
+ line: lazyMode(async () => (await import("../modes/interactive/line/line-mode.js")).runLineMode),
48
+ interactive: lazyMode(async () => (await import("../modes/interactive/interactive-mode.js")).runInteractiveMode),
49
+ };
50
+ /**
51
+ * 第 12 步:内置工具 + 工厂 + extraTools,按预设定活动集;warning 留给组装会话时报告。
52
+ *
53
+ * 先跑工厂(产物暂不注册)再解析预设:codemode 是否可用决定预设与模式;`on` 模式下注册时给
54
+ * 其它工具的描述追加 codemode 提示,`only` 模式活动集独占(codemode/modes.ts)。工厂拿到的
55
+ * `registry` 在执行期才读,此时已登记完全部工具。
56
+ */
57
+ export function createTools(input, options, state) {
58
+ const registry = new PresetToolRegistry();
59
+ const bash = input.config.tools?.bashTimeoutMs !== undefined
60
+ ? { defaultTimeoutMs: input.config.tools.bashTimeoutMs }
61
+ : {};
62
+ const builtins = builtinTools({
63
+ bash,
64
+ read: { supportsImages: (ctx) => modelAcceptsImages(state, ctx.model) },
65
+ });
66
+ const ctx = {
67
+ ...input,
68
+ registry,
69
+ session: () => state.session,
70
+ warn: (message) => state.warnings.push(message),
71
+ };
72
+ const produced = [];
73
+ for (const factory of options.toolFactories ?? DEFAULT_TOOL_FACTORIES) {
74
+ try {
75
+ const tool = factory(ctx);
76
+ if (tool !== undefined)
77
+ produced.push(tool);
78
+ }
79
+ catch (error) {
80
+ state.warnings.push(`工具工厂失败:${error.message}`);
81
+ }
82
+ }
83
+ const extra = options.extraTools ?? [];
84
+ const names = new Set([...builtins, ...produced, ...extra].map((tool) => tool.name));
85
+ const preset = resolvePreset({ config: input.config, available: (name) => names.has(name) });
86
+ const decorate = decorateForMode(preset.codemode);
87
+ for (const tool of [...builtins, ...produced]) {
88
+ try {
89
+ registry.register(decorate(tool), "builtin");
90
+ }
91
+ catch (error) {
92
+ state.warnings.push(`工具 ${tool.name} 注册失败:${error.message}`);
93
+ }
94
+ }
95
+ for (const tool of extra)
96
+ registry.register(decorate(tool), "sdk");
97
+ applyCodemodeMode(registry, preset);
98
+ state.warnings.push(...preset.warnings);
99
+ return registry;
100
+ }
101
+ /** 当前模型是否收图片(read 工具用);查不到模型时按收(交给协议层过滤)。 */
102
+ export function modelAcceptsImages(state, model) {
103
+ if (model === undefined || state.providers === undefined)
104
+ return true;
105
+ const found = state.providers.findModel(formatModelRef(model));
106
+ return found.ok ? found.model.input.includes("image") : true;
107
+ }
108
+ /** 第 14 步前:内置 deny(builtinDeny 过滤)+ 用户规则;非法规则 warning 后跳过。 */
109
+ export function buildRules(specs, builtinDeny, warn) {
110
+ const rules = [];
111
+ if (builtinDeny !== false) {
112
+ for (const raw of BUILTIN_DENY_RULES) {
113
+ if (Array.isArray(builtinDeny) && builtinDeny.includes(raw))
114
+ continue;
115
+ rules.push(parseRule(raw, "deny", "builtin"));
116
+ }
117
+ }
118
+ for (const spec of specs) {
119
+ try {
120
+ rules.push(parseRule(spec.raw, spec.effect, spec.source));
121
+ }
122
+ catch (error) {
123
+ warn(`权限规则(${spec.source}):${error.message},已忽略`);
124
+ }
125
+ }
126
+ return rules;
127
+ }
128
+ /** 回调先于模式运行;终端界面只在加载时 import,文本回退不加载终端组件库。 */
129
+ function lazyUi(load) {
130
+ let ui;
131
+ const get = () => (ui ??= load());
132
+ return {
133
+ promptTrust: async (cwd, resources) => (await get()).promptTrust(cwd, resources),
134
+ pickSession: async (items) => (await get()).pickSession(items),
135
+ pickModel: async (providers, reason) => (await get()).pickModel(providers, reason),
136
+ askCwd: async (missing) => (await get()).askCwd(missing),
137
+ };
138
+ }
139
+ /**
140
+ * CLI 缺省的启动期问答(第 7 / 8 / 11 步,只在 interactive / line 模式被调用):
141
+ * stdin 非 TTY 时不问(管道里的输入留给行式界面,保持非交互分支);stdout 也是终端、
142
+ * `TERM` 不是 dumb 且没有 `--no-tui` 时用迷你 TUI,否则写 stderr、从 stdin 读一行。
143
+ */
144
+ export function defaultStartupUi(io, options = {}) {
145
+ if (!io.stdinIsTTY)
146
+ return undefined;
147
+ if (io.stdoutIsTTY && io.env["TERM"] !== "dumb" && options.noTui !== true) {
148
+ return lazyUi(async () => (await import("../modes/interactive/startup-ui.js")).createStartupUi(options.tui));
149
+ }
150
+ return lazyUi(async () => (await import("../modes/startup-ui-text.js")).createTextStartupUi(options.text ?? { stdin: process.stdin, write: (text) => process.stderr.write(text) }));
151
+ }
152
+ export function createRuntimeDeps(options = {}) {
153
+ const state = emptyComposeState();
154
+ const deps = {
155
+ providers: {
156
+ create: async (input) => {
157
+ const registry = await buildProviderRegistry(input, {
158
+ providers: options.providers,
159
+ apis: options.apis,
160
+ env: options.env,
161
+ includeFake: options.includeFake,
162
+ probeLocal: options.probeLocal,
163
+ warn: (message) => state.warnings.push(message),
164
+ });
165
+ state.providers = registry;
166
+ return registry;
167
+ },
168
+ },
169
+ sessions: createSessionStore(),
170
+ tools: { create: (input) => createTools(input, options, state) },
171
+ permissions: {
172
+ create: (input) => new PermissionPipeline({
173
+ mode: input.mode,
174
+ rules: buildRules(input.rules, input.builtinDeny, (m) => state.warnings.push(m)),
175
+ cwd: input.cwd,
176
+ }),
177
+ },
178
+ resources: {
179
+ async discover(input) {
180
+ const skills = await discoverSkills(skillSources({
181
+ cwd: input.cwd,
182
+ configDir: input.configDir,
183
+ cliDirs: input.extraSkillDirs,
184
+ }), { trusted: input.trusted });
185
+ const prompts = await discoverPromptTemplates(promptSources({
186
+ cwd: input.cwd,
187
+ configDir: input.configDir,
188
+ profileDirs: input.promptDirs,
189
+ }), { trusted: input.trusted });
190
+ state.skills = skills.skills;
191
+ state.templates = prompts.templates;
192
+ const skipped = [...new Set([...skills.skippedUntrusted, ...prompts.skippedUntrusted])];
193
+ const warnings = [...skills.warnings, ...prompts.warnings];
194
+ if (skipped.length > 0)
195
+ warnings.push(`${skipped.length} 个项目级目录因未信任被跳过(--trust 加载)`);
196
+ return {
197
+ skills: skills.skills.map((s) => ({
198
+ name: s.name,
199
+ description: s.description,
200
+ location: s.location,
201
+ })),
202
+ prompts: prompts.templates.map((t) => ({ name: t.name, path: t.path })),
203
+ warnings,
204
+ };
205
+ },
206
+ },
207
+ session: {
208
+ create: (assembly) => composeSession(assembly, state, {
209
+ approvalTimeoutMs: options.approvalTimeoutMs,
210
+ log: options.log,
211
+ }),
212
+ },
213
+ modes: { ...DEFAULT_MODES, ...options.modes },
214
+ sendUser: defaultSendUser,
215
+ };
216
+ const ui = options.ui ??
217
+ (options.io !== undefined ? defaultStartupUi(options.io, { noTui: options.noTui }) : undefined);
218
+ if (ui !== undefined)
219
+ deps.ui = ui;
220
+ return deps;
221
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 零配置选模型(设计 §10.0、§11.1 第 11 步):没有 `--model`、续会话的 model_change 与
3
+ * `config.defaultModel` 时,按内置供应商顺序(§3.3)选第一个**可用**供应商的缺省模型(目录首条)。
4
+ *
5
+ * 可用 = 有 key(`requiresApiKey`)或本地服务已探测到模型(ollama / lmstudio,组装根在
6
+ * 无 key 时探测)。跳过 `fake`(测试供应商只能显式 `--model fake/…`)与协议尚未实现的供应商。
7
+ */
8
+ import type { Model, ProviderData, ProviderRegistryApi } from "../ai/types.js";
9
+ export interface DefaultModelChoice {
10
+ model: Model;
11
+ provider: ProviderData;
12
+ /** 选中原因:`key`(有 key,来源见 keySource)或 `local`(本地服务)。 */
13
+ via: "key" | "local";
14
+ keySource?: string;
15
+ }
16
+ export declare function pickDefaultModel(registry: ProviderRegistryApi): Promise<DefaultModelChoice | undefined>;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 零配置选模型(设计 §10.0、§11.1 第 11 步):没有 `--model`、续会话的 model_change 与
3
+ * `config.defaultModel` 时,按内置供应商顺序(§3.3)选第一个**可用**供应商的缺省模型(目录首条)。
4
+ *
5
+ * 可用 = 有 key(`requiresApiKey`)或本地服务已探测到模型(ollama / lmstudio,组装根在
6
+ * 无 key 时探测)。跳过 `fake`(测试供应商只能显式 `--model fake/…`)与协议尚未实现的供应商。
7
+ */
8
+ export async function pickDefaultModel(registry) {
9
+ for (const provider of registry.list()) {
10
+ if (provider.id === "fake" && !provider.requiresApiKey)
11
+ continue;
12
+ const model = provider.models[0];
13
+ if (model === undefined)
14
+ continue;
15
+ if (registry.getApi(model.api) === undefined)
16
+ continue;
17
+ if (!provider.requiresApiKey)
18
+ return { model, provider, via: "local" };
19
+ const key = await registry.resolveApiKey(provider.id);
20
+ if (key.apiKey !== undefined)
21
+ return { model, provider, via: "key", keySource: key.source };
22
+ }
23
+ return undefined;
24
+ }
@@ -0,0 +1,207 @@
1
+ /**
2
+ * RuntimeDeps:bootstrap 对其它批次能力的依赖注入接口。[B5]
3
+ *
4
+ * 第一波各批次并行实施,B5 不 import B1 / B2 / B3 / B6 / B7 的实现文件;bootstrap 只编排流程、
5
+ * 失败处理与退出码,具体实现由集成批次在 cli/main.ts 用 `registerRuntimeDeps()` 注入
6
+ * (SDK 的 `createRuntime()` 直接把 deps 传给 `bootstrap()`)。测试用桩。
7
+ *
8
+ * 错误约定:注入实现抛 `StartupError` 时原样透传(用它的退出码);抛 `AmaError` 时按 code
9
+ * 映射(`session_not_found / session_corrupt` → 5、`model_not_found / provider_not_found /
10
+ * no_api_key` → 4、`config_invalid` → 3、`tool_not_found` → 2);其它异常按所在步骤的缺省退出码。
11
+ */
12
+ import type { ModelThinkingLevel, Model, ProviderData, ProviderRegistryApi } from "../ai/types.js";
13
+ import type { AgentSession } from "../agent/types.js";
14
+ import type { AmaConfig } from "../config/types.js";
15
+ import type { PermissionRuleSpec } from "../config/merge.js";
16
+ import type { TrustPromptAnswer } from "../config/trust.js";
17
+ import type { HookDispatcherApi } from "../hooks/types.js";
18
+ import type { WarmingDecisionHandler } from "../ai/cache/types.js";
19
+ import type { AgentEventBus } from "../host/api-impl.js";
20
+ import type { ApprovalBroker, HostAdapterHandle, InstructionSource } from "../host/types.js";
21
+ import type { PermissionMode, PermissionPipelineApi } from "../permissions/types.js";
22
+ import type { SessionEntry, SessionListItem, SessionManagerApi } from "../session/types.js";
23
+ import type { ToolRegistryApi } from "../tools/types.js";
24
+ import type { LoadedResources, ResolvedPaths, Runtime, RuntimeMode, TrustState } from "./runtime.js";
25
+ import type { ParsedArgs } from "./args.js";
26
+ /** 第 7 步的会话请求。 */
27
+ export type SessionRequest = {
28
+ kind: "new";
29
+ } | {
30
+ kind: "continue";
31
+ } | {
32
+ kind: "resume";
33
+ id: string;
34
+ } | {
35
+ kind: "session-id";
36
+ id: string;
37
+ } | {
38
+ kind: "fork";
39
+ id: string;
40
+ };
41
+ export interface ProviderBuildInput {
42
+ config: AmaConfig;
43
+ cwd: string;
44
+ /** 解析后的 auth.json 路径:`--auth-file` > profile.authFile > `<configDir>/auth.json`。 */
45
+ authFile: string;
46
+ /** 是否读环境变量(profile.authEnv=false 时为 false,§11.2)。 */
47
+ authEnv: boolean;
48
+ /** `--api-key`:只作用于 `modelRef` 所属的供应商(§3.5 ①)。 */
49
+ cliApiKey?: {
50
+ apiKey: string;
51
+ modelRef: string;
52
+ provider?: string;
53
+ };
54
+ /** 数据目录:读 models.dev 缓存(`<dataDir>/models-dev.json`,只读不联网);缺省不补元数据。 */
55
+ dataDir?: string;
56
+ }
57
+ export interface ResourceDiscoveryInput {
58
+ cwd: string;
59
+ configDir: string;
60
+ trusted: boolean;
61
+ /** 按 §5.3 顺序:`--skill-dir` → profile.skillDirs → config.skills.dirs。 */
62
+ extraSkillDirs: readonly string[];
63
+ promptDirs: readonly string[];
64
+ }
65
+ export interface ResourceDiscoveryResult {
66
+ skills: LoadedResources["skills"];
67
+ prompts: LoadedResources["prompts"];
68
+ warnings: string[];
69
+ }
70
+ /** 第 14 步交给 AgentSession 实现(B2)的全部装配材料。 */
71
+ export interface SessionAssembly {
72
+ mode: RuntimeMode;
73
+ paths: ResolvedPaths;
74
+ config: AmaConfig;
75
+ trust: TrustState;
76
+ resources: LoadedResources;
77
+ providers: ProviderRegistryApi;
78
+ model: Model;
79
+ provider: ProviderData;
80
+ thinkingLevel: ModelThinkingLevel;
81
+ sessionManager: SessionManagerApi;
82
+ /** session_start 的 reason。 */
83
+ source: "startup" | "resume" | "new" | "fork";
84
+ hooks: HookDispatcherApi;
85
+ permission: PermissionPipelineApi;
86
+ tools: ToolRegistryApi;
87
+ /** 宿主事件总线:AgentSession 把 AgentEvents 发到这里(session_start 由 bootstrap 发)。 */
88
+ events: AgentEventBus;
89
+ host: {
90
+ handle: HostAdapterHandle | undefined;
91
+ /** 宿主 broker(链首);undefined 交给 UI / 无人值守。 */
92
+ broker(): ApprovalBroker | undefined;
93
+ /** 系统提示 host 节。 */
94
+ instructions: readonly InstructionSource[];
95
+ /** [W3-C1b] 宿主 `cache.onWarmingDecision` 的当前处理器(每次保温前现取)。 */
96
+ warmingDecider?(): WarmingDecisionHandler | undefined;
97
+ };
98
+ /** `Runtime.approvals.setUiBroker` 设置的 UI broker(链尾);每次审批现取,未设置为 undefined。 */
99
+ uiBroker(): ApprovalBroker | undefined;
100
+ /**
101
+ * 模式层把当前会话换成另一个(`/new`、`/resume`、`/fork`、RPC `switch_session`)后调用:
102
+ * bootstrap 让 HostApi.session.*、宿主 sendUser、Hook 公共字段与退出时的 dispose 跟随 `next`。
103
+ * 旧会话由调用方自行 dispose;`Runtime.session` 仍指初始会话。
104
+ */
105
+ onSessionReplaced(next: AgentSession): void;
106
+ /** SessionStart Hook 的 additionalContext(系统提示 hooks 节);首次装配系统提示时读取。 */
107
+ sessionStartContext(): string | undefined;
108
+ /** print:ask → deny。 */
109
+ unattended: boolean;
110
+ warn(message: string): void;
111
+ }
112
+ export interface ModeContext {
113
+ args: ParsedArgs;
114
+ /** 位置参数拼成的首条提示。 */
115
+ prompt: string | undefined;
116
+ io: CliIo;
117
+ }
118
+ /** 第 15–16 步:模式实现(B6 line / print / rpc,B7 interactive);返回退出码。 */
119
+ export type ModeRunner = (runtime: Runtime, context: ModeContext) => Promise<number>;
120
+ /** 交互 UI 回调(B7 / B6 line 提供);全部可选,缺省按非交互处理。 */
121
+ export interface InteractiveUi {
122
+ promptTrust?(cwd: string, resources: readonly string[]): Promise<TrustPromptAnswer>;
123
+ /** `--resume` 无 id:返回会话 id,undefined = 用户取消(退出码 5)。 */
124
+ pickSession?(items: readonly SessionListItem[]): Promise<string | undefined>;
125
+ /** 无 key / 无模型时选择模型;返回 `provider/id`,undefined = 取消(退出码 4)。 */
126
+ pickModel?(providers: ProviderRegistryApi, reason: string): Promise<string | undefined>;
127
+ /** 会话 cwd 不存在:返回新 cwd,undefined = 取消(退出码 5)。 */
128
+ askCwd?(missing: string): Promise<string | undefined>;
129
+ }
130
+ export interface RuntimeDeps {
131
+ /** B1:ProviderRegistry.build(builtin, config.providers) + auth。 */
132
+ providers: {
133
+ create(input: ProviderBuildInput): ProviderRegistryApi | Promise<ProviderRegistryApi>;
134
+ };
135
+ /** B2:SessionManager。 */
136
+ sessions: {
137
+ open(request: SessionRequest, context: {
138
+ sessionDir: string;
139
+ cwd: string;
140
+ }): SessionManagerApi | Promise<SessionManagerApi>;
141
+ /** `--resume` 选择器与 `ama sessions` 用。 */
142
+ list?(context: {
143
+ sessionDir: string;
144
+ cwd?: string;
145
+ }): Promise<SessionListItem[]>;
146
+ /** `ama sessions show`:id 可为前缀;找不到抛 AmaError{code:"session_not_found"}。 */
147
+ show?(id: string, context: {
148
+ sessionDir: string;
149
+ }): Promise<{
150
+ item: SessionListItem;
151
+ entries: readonly SessionEntry[];
152
+ }>;
153
+ /** `ama sessions prune`:把超过 olderThanDays 天未修改的会话移到 trash(§8)。 */
154
+ prune?(context: {
155
+ sessionDir: string;
156
+ cwd?: string;
157
+ olderThanDays: number;
158
+ dryRun: boolean;
159
+ }): Promise<{
160
+ moved: string[];
161
+ }>;
162
+ };
163
+ /** B3:ToolRegistry(内置工具已注册)。 */
164
+ tools: {
165
+ create(input: {
166
+ config: AmaConfig;
167
+ cwd: string;
168
+ mode: RuntimeMode;
169
+ }): ToolRegistryApi;
170
+ };
171
+ /** B3:权限管线。 */
172
+ permissions: {
173
+ create(input: {
174
+ mode: PermissionMode;
175
+ rules: readonly PermissionRuleSpec[];
176
+ unattended: boolean;
177
+ /** 会话 cwd:规则里的相对路径以它为基准。 */
178
+ cwd: string;
179
+ /** config `permission.builtinDeny`(只来自用户级 / profile);缺省 = 启用全部内置 deny。 */
180
+ builtinDeny?: boolean | string[];
181
+ }): PermissionPipelineApi;
182
+ };
183
+ /** B3:skills / prompts 发现;缺省为空。 */
184
+ resources?: {
185
+ discover(input: ResourceDiscoveryInput): ResourceDiscoveryResult | Promise<ResourceDiscoveryResult>;
186
+ };
187
+ /** B2:组装 AgentSession。 */
188
+ session: {
189
+ create(assembly: SessionAssembly): AgentSession | Promise<AgentSession>;
190
+ };
191
+ /** B6 / B7。 */
192
+ modes: Partial<Record<RuntimeMode, ModeRunner>>;
193
+ ui?: InteractiveUi;
194
+ /** 宿主 `messages.sendUser` 的实现;缺省:运行中 steer,空闲时 prompt。 */
195
+ sendUser?(session: AgentSession, text: string, origin: string): Promise<"started" | "queued">;
196
+ }
197
+ /** 进程 I/O(测试注入)。 */
198
+ export interface CliIo {
199
+ stdout: (text: string) => void;
200
+ stderr: (text: string) => void;
201
+ stdinIsTTY: boolean;
202
+ stdoutIsTTY: boolean;
203
+ env: Readonly<Record<string, string | undefined>>;
204
+ cwd: string;
205
+ /** 读取 stdin 全部内容(auth set)。 */
206
+ readStdin(): Promise<string>;
207
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * RuntimeDeps:bootstrap 对其它批次能力的依赖注入接口。[B5]
3
+ *
4
+ * 第一波各批次并行实施,B5 不 import B1 / B2 / B3 / B6 / B7 的实现文件;bootstrap 只编排流程、
5
+ * 失败处理与退出码,具体实现由集成批次在 cli/main.ts 用 `registerRuntimeDeps()` 注入
6
+ * (SDK 的 `createRuntime()` 直接把 deps 传给 `bootstrap()`)。测试用桩。
7
+ *
8
+ * 错误约定:注入实现抛 `StartupError` 时原样透传(用它的退出码);抛 `AmaError` 时按 code
9
+ * 映射(`session_not_found / session_corrupt` → 5、`model_not_found / provider_not_found /
10
+ * no_api_key` → 4、`config_invalid` → 3、`tool_not_found` → 2);其它异常按所在步骤的缺省退出码。
11
+ */
12
+ export {};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 进程退出码(设计 §11.3)。[B0] 契约文件。
3
+ */
4
+ export declare const ExitCode: {
5
+ /** 正常。 */
6
+ readonly Ok: 0;
7
+ /** 运行期错误(模型最终失败等)。 */
8
+ readonly RuntimeError: 1;
9
+ /** 参数用法错误。 */
10
+ readonly Usage: 2;
11
+ /** 配置 / profile / 路径错误。 */
12
+ readonly Config: 3;
13
+ /** 无可用模型或密钥。 */
14
+ readonly NoModel: 4;
15
+ /** 会话不存在 / 损坏 / cwd 不匹配。 */
16
+ readonly Session: 5;
17
+ /** 宿主 / Hook 加载或启动失败。 */
18
+ readonly HostOrHook: 6;
19
+ /** HOST_API_VERSION 不匹配。 */
20
+ readonly HostVersion: 78;
21
+ /** SIGINT 退出(两次 Ctrl+C)。 */
22
+ readonly Sigint: 130;
23
+ /** SIGTERM。 */
24
+ readonly Sigterm: 143;
25
+ };
26
+ export type ExitCodeName = keyof typeof ExitCode;
27
+ export type ExitCode = (typeof ExitCode)[ExitCodeName];
28
+ export declare const EXIT_CODE_DESCRIPTIONS: Readonly<Record<ExitCode, string>>;
29
+ export declare function describeExitCode(code: number): string;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 进程退出码(设计 §11.3)。[B0] 契约文件。
3
+ */
4
+ export const ExitCode = {
5
+ /** 正常。 */
6
+ Ok: 0,
7
+ /** 运行期错误(模型最终失败等)。 */
8
+ RuntimeError: 1,
9
+ /** 参数用法错误。 */
10
+ Usage: 2,
11
+ /** 配置 / profile / 路径错误。 */
12
+ Config: 3,
13
+ /** 无可用模型或密钥。 */
14
+ NoModel: 4,
15
+ /** 会话不存在 / 损坏 / cwd 不匹配。 */
16
+ Session: 5,
17
+ /** 宿主 / Hook 加载或启动失败。 */
18
+ HostOrHook: 6,
19
+ /** HOST_API_VERSION 不匹配。 */
20
+ HostVersion: 78,
21
+ /** SIGINT 退出(两次 Ctrl+C)。 */
22
+ Sigint: 130,
23
+ /** SIGTERM。 */
24
+ Sigterm: 143,
25
+ };
26
+ export const EXIT_CODE_DESCRIPTIONS = {
27
+ 0: "正常",
28
+ 1: "运行期错误(模型最终失败等)",
29
+ 2: "参数用法错误",
30
+ 3: "配置 / profile / 路径错误",
31
+ 4: "无可用模型或密钥",
32
+ 5: "会话不存在 / 损坏 / cwd 不匹配",
33
+ 6: "宿主 / Hook 加载或启动失败",
34
+ 78: "HOST_API_VERSION 不匹配",
35
+ 130: "SIGINT 退出(两次 Ctrl+C)",
36
+ 143: "SIGTERM",
37
+ };
38
+ export function describeExitCode(code) {
39
+ return EXIT_CODE_DESCRIPTIONS[code] ?? "未知退出码";
40
+ }
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * bin 入口(设计 §11.1 第 1–2 步)。[B5]
4
+ *
5
+ * - 设 `AMA=1`、`AI_AGENT=ama`;直接执行时装 `uncaughtException` / `unhandledRejection` →
6
+ * stderr 一行 + 退出码 1;SIGINT / SIGTERM 交给当前模式。
7
+ * - `--version` / `--help` 短路;子命令 `auth / sessions / models / providers / doctor / config /
8
+ * init` 分派后返回;其余命令启动前若配置目录不存在则静默初始化(`AMA_NO_INIT=1` 关闭);
9
+ * 其余交给 `runCli()`(bootstrap → 模式)。
10
+ * - 运行时实现(RuntimeDeps):`MainOptions.deps` > `registerRuntimeDeps()` > 组装根
11
+ * `createRuntimeDeps()`(cli/compose.ts,动态 import)。
12
+ * - 签名 `main(argv): Promise<number>` 与「直接执行才自动运行」判定保持不变:
13
+ * src/bundle.ts 显式调用 `main()`。
14
+ */
15
+ import type { CliIo, RuntimeDeps } from "./deps.js";
16
+ /** 集成批次注入运行时实现(B1 / B2 / B3 / B6 / B7)。 */
17
+ export declare function registerRuntimeDeps(deps: RuntimeDeps | undefined): void;
18
+ export interface MainOptions {
19
+ deps?: RuntimeDeps;
20
+ io?: Partial<CliIo>;
21
+ /** 装进程级异常处理器(缺省 true;测试传 false)。 */
22
+ processHooks?: boolean;
23
+ }
24
+ /** 读 stdin 全部内容;TTY 下只读一行且不回显(auth set)。 */
25
+ export declare function readStdinDefault(): Promise<string>;
26
+ export declare function defaultIo(): CliIo;
27
+ export declare function main(argv: readonly string[], options?: MainOptions): Promise<number>;