@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,37 @@
1
+ # 更新记录
2
+
3
+ ## 0.3.0(2026-10-02)
4
+
5
+ 自定义供应商与多渠道、models.dev 模型元数据、图像输入、默认配置目录。
6
+
7
+ - **一键接入**:`ama providers add <id> --base-url <url>` 只要 baseUrl 与 key——列出中转的模型、按提示或 `--probe` 逐渠道
8
+ 探测、写进配置;`list` / `channels` / `remove` / `refresh`。
9
+ - **渠道**:一个供应商可挂多个渠道(协议 + 地址 + 可选 key / headers / compat),模型声明 `channels`,
10
+ `provider/model@channel` 指定渠道;旧配置按隐式 `default` 渠道处理,不用改。
11
+ - **models.dev 元数据**:上下文、输出上限、图像输入、推理、价格缺省从 models.dev 补(数据目录缓存,启动不联网),
12
+ `ama models refresh-catalog` 刷新;`models list` / `config show` 标出每个字段的来源。
13
+ - **图像输入**:`-p --image`、界面里 `@图片路径`;与 read 工具共用 MIME 检测与 5 MB 上限;模型不收图片时拒绝。
14
+ - **配置目录**:首次运行自动建 `~/.config/ama/` 与最小 `config.json`、`config.schema.json`;`ama init`、
15
+ `ama config path`、`ama config edit`。
16
+ - **修复**:Responses 的 `incomplete_details.reason: "length"` 按输出截断处理(中转转发 DeepSeek 时出现)。
17
+
18
+ ## 0.2.1(2026-10-02)
19
+
20
+ npm 首发:`npm i -g @armadra/agent`。功能与 0.2.0 相同。
21
+
22
+ - **npm 发布**:包名 `@armadra/agent`;打 `v*` tag 时 CI 在生成 GitHub Release 之后执行 `npm publish --provenance`(仓库未配置 `NPM_TOKEN` 时跳过)。
23
+ - **包元数据**:仓库地址改为 `Owlbay/armadra-agent`,补 keywords、homepage、bugs、author、`sideEffects`;包里带用户文档(providers / tui / codemode / hooks / host-api / rpc / session-format)与 CHANGELOG,不再带源映射与测试辅助,解包体积约 2.9 MB。
24
+ - **README**:重写为完整介绍——定位、特性、安装、配置、中转站、工具预设、缓存、安全、各入口与 SDK、嵌入 Armadra。
25
+
26
+ ## 0.2.0(2026-10-02)
27
+
28
+ 首个可用版本。
29
+
30
+ - **模型接入**:协议与供应商数据分离,四条协议线(Anthropic Messages、OpenAI Chat Completions、OpenAI Responses、Google Generative AI),13 家内置供应商与自定义供应商、模型级协议;只用 API Key;`ama models discover` 从中转站 `/v1/models` 探测协议并写入配置,`OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL` 零配置接入。
31
+ - **调用**:内置工具与工具预设(`default` / `minimal` / `codemode` / `coordinator`),codemode(`node --permission` 子进程 + vm 沙箱,脚本内调用照样走权限管线),`task` 子 Agent,Skill(`/skill:`),不接 MCP。
32
+ - **安全**:权限管线(拒绝 → 危险命令 → 模式 → 允许)、危险命令识别穿透 `sh -c` / `eval` / `xargs` / `find -exec` 与 git 全局选项、项目级配置只能收紧、项目信任、审批时的执行前预览。
33
+ - **Hook**:命令式 Hook(9 个事件)与进程内宿主适配器 HostApi。
34
+ - **缓存**:前缀逐字节稳定、各协议缓存字段与兼容开关(400 自动剥离)、前缀指纹与未命中归因、不报缓存的三态与分块粒度推断、`off / streaming / idle` 保温、压缩摘要按会话前缀续写、状态栏 / `/session` / `/cache` / `ama models cache-probe`。
35
+ - **会话**:JSONL 条目树、分叉与 `/tree`、两档压缩与熔断。
36
+ - **入口**:差分渲染终端界面(主屏模式)、`--no-tui` 行式、`-p`(text / json / stream-json)、`--mode rpc`、SDK。
37
+ - **发布物**:`ama.cjs` 与 `ama-sandbox.cjs` 两个单文件 bundle、`package.tgz`、`SHA256SUMS`;暂不发布 npm。
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 yovinchen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,471 @@
1
- # Temporary Holding Version
1
+ # ama
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [![CI](https://github.com/Owlbay/armadra-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/Owlbay/armadra-agent/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/@armadra/agent)](https://www.npmjs.com/package/@armadra/agent)
5
+ [![license](https://img.shields.io/npm/l/@armadra/agent)](LICENSE)
6
+
7
+ 一个在终端里写代码的 Agent,也可以嵌进 [Armadra](https://github.com/yovinchen/Armadra) 画布当协调者。用 TypeScript 写成,运行时零依赖,也提供单文件发行版。
8
+
9
+ ```sh
10
+ npm i -g @armadra/agent
11
+ export ANTHROPIC_API_KEY=sk-... # 任一家的 key 即可
12
+ ama
13
+ ```
14
+
15
+ ## 目录
16
+
17
+ - [为什么做 ama](#为什么做-ama)
18
+ - [特性一览](#特性一览)
19
+ - [安装](#安装)
20
+ - [快速开始](#快速开始)
21
+ - [配置](#配置)
22
+ - [接入中转站](#接入中转站)
23
+ - [工具与预设](#工具与预设)
24
+ - [缓存](#缓存)
25
+ - [安全](#安全)
26
+ - [界面与入口](#界面与入口)
27
+ - [嵌入 Armadra](#嵌入-armadra)
28
+ - [文档](#文档)
29
+ - [开发](#开发)
30
+
31
+ ## 为什么做 ama
32
+
33
+ - **调用型 Agent**:ama 被别的程序调用的时候和被人使用的时候一样多——`-p` 一次性运行、`--mode rpc`、SDK、宿主适配器都是一等入口,退出码与 JSON 形状是契约。
34
+ - **分层清楚**:参考 Pi 的分层,协议实现与供应商数据分开。四条协议线(Anthropic Messages、OpenAI Chat Completions、OpenAI Responses、Google Generative AI)只写一次,供应商只是「baseUrl + key + 模型表 + compat 开关」。
35
+ - **配置精简**:设一个环境变量就能用;常用配置只有五个键,其余都有缺省。只用 API Key(官方或中转站),只做 Skill 与内置工具,不接 MCP。
36
+ - **缓存优先**:长任务的大部分用量是缓存读取。ama 保证请求前缀逐字节稳定,按各家写法打缓存断点,并把缓存是否生效、为什么没命中显示出来。
37
+ - **两种用法**:独立用就是一个终端编码 Agent;嵌入 Armadra 时作为画布上的协调者,驱动 Claude Code、Codex、OpenCode 等 CLI Agent 分工、汇报与汇总。
38
+
39
+ ## 特性一览
40
+
41
+ | 方面 | 内容 |
42
+ | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
43
+ | 多协议与供应商 | 4 条协议线、13 家内置供应商(Anthropic、OpenAI、Google、DeepSeek、Moonshot、智谱、通义、OpenRouter、Groq、xAI、Mistral、Ollama、LM Studio)、自定义供应商、模型级协议 |
44
+ | 零配置与中转站 | 有 key 就选第一个可用的供应商;识别 `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL`;`ama providers add` 只给 baseUrl 与 key 一键接入:列模型、探测渠道、写回配置 |
45
+ | 模型元数据 | 上下文、输出上限、图像输入、推理、价格缺省从 models.dev 补(本地缓存,启动不联网);一个供应商可挂多个渠道(Chat / Responses / Messages),`provider/model@渠道` |
46
+ | 图像输入 | `-p --image`、界面里 `@图片路径`;四条协议都映射;模型不收图片时直接拒绝并提示换模型 |
47
+ | 工具与预设 | read / edit / write / bash / grep / glob,另有 ls、todo、task(子 Agent)、codemode;四个预设 `default` / `minimal` / `codemode` / `coordinator` |
48
+ | codemode | 模型写一段 JS,在受 Node 权限模型约束的子进程里编排多次工具调用,只有输出回到模型 |
49
+ | Skill | `SKILL.md` 目录,模型按索引自行读取,用户用 `/skill:<名字>` 调用;另有提示模板 |
50
+ | 两层 Hook | 命令式 Hook(`hooks.json`,9 个事件,用户策略)与进程内宿主适配器 HostApi(嵌入方) |
51
+ | 权限 | 四种模式、allow / deny 规则、危险命令识别(穿透 `sh -c` / `eval` / `xargs` / `find -exec`)、项目信任、审批时的执行前预览 |
52
+ | 缓存 | 前缀稳定、缓存字段与兼容开关、未命中归因、「报 / 不报缓存」三态、长工具运行时保温、压缩摘要按会话前缀续写 |
53
+ | 会话 | JSONL 条目树,分叉与 `/tree` 回溯;两档压缩(裁剪大工具结果 → 摘要)与熔断 |
54
+ | 入口 | 差分渲染终端界面、`--no-tui` 行式、`-p`(text / json / stream-json)、`--mode rpc`、SDK |
55
+
56
+ ## 安装
57
+
58
+ 需要 **Node ≥ 22**。
59
+
60
+ ### npm
61
+
62
+ ```sh
63
+ npm i -g @armadra/agent
64
+ ama --version
65
+ ```
66
+
67
+ ### Release 单文件
68
+
69
+ [Releases](https://github.com/Owlbay/armadra-agent/releases) 附带 `ama.cjs`、`ama-sandbox.cjs`、`package.tgz` 与 `SHA256SUMS`。`ama.cjs` 是全部内联的单文件,`ama-sandbox.cjs` 是 codemode 的沙箱子进程入口,两者放在**同一目录**:
70
+
71
+ ```sh
72
+ sha256sum -c --ignore-missing SHA256SUMS # macOS:shasum -a 256 -c --ignore-missing SHA256SUMS
73
+ node ama.cjs --version
74
+ alias ama="node /path/to/ama.cjs"
75
+ ```
76
+
77
+ `package.tgz` 与 npm 上的包内容相同,可以离线安装:`npm i -g ./package.tgz`。
78
+
79
+ ### 从源码构建
80
+
81
+ ```sh
82
+ git clone https://github.com/Owlbay/armadra-agent.git && cd armadra-agent
83
+ corepack enable && pnpm install
84
+ pnpm build # 产出 dist/ 与 dist/bundle/ama.cjs、dist/bundle/ama-sandbox.cjs
85
+ node dist/bundle/ama.cjs --version
86
+ ```
87
+
88
+ ### Node 版本与 codemode
89
+
90
+ | Node | codemode 沙箱 |
91
+ | ------- | -------------------------------------------------------------------------------------------- |
92
+ | ≥ 25 | 文件系统与网络都隔离;`codemode` 按只读类工具处理,`default` 权限模式下免审批 |
93
+ | 22 / 24 | 隔离文件系统,**不隔离网络**;`codemode` 按执行类处理,每次都要审批(状态栏显示红色 `net!`) |
94
+
95
+ 其余功能在 Node 22 起都一样。`codemode.requireStrict: true` 可以在网络未隔离时直接禁用 codemode。
96
+
97
+ ## 快速开始
98
+
99
+ **零配置**:设好任一家的标准环境变量就能用,ama 按内置顺序选第一个有 key 的供应商和它的缺省模型。
100
+
101
+ ```sh
102
+ export ANTHROPIC_API_KEY=sk-... # 或 OPENAI_API_KEY、GEMINI_API_KEY、DEEPSEEK_API_KEY、MOONSHOT_API_KEY ……
103
+ cd your-project
104
+ ama # 终端界面
105
+ ```
106
+
107
+ **把 key 存起来**:不想放在环境变量里,就存进 `~/.config/ama/auth.json`(0600)。key 从 stdin 读取,不经命令行参数、不进 shell 历史:
108
+
109
+ ```sh
110
+ ama auth set deepseek # 终端里输入(不回显)
111
+ ama auth list # 只列供应商与 key 形态,不显示 key
112
+ ama auth remove deepseek
113
+ ```
114
+
115
+ **一次性运行**:`-p` 执行完就退出,适合脚本与管道。
116
+
117
+ ```sh
118
+ ama -p "解释一下 src/index.ts"
119
+ git diff | ama -p "审阅这段改动" # 提示也可以来自 stdin
120
+ ama -p "列出 TODO" --model deepseek/deepseek-v4-pro --output-format json
121
+ ```
122
+
123
+ **常用参数**:
124
+
125
+ | 参数 | 作用 |
126
+ | ------------------------------------------------------- | ---------------------------------------------- |
127
+ | `--model provider/id` | 选模型(配置、命令行、`/model`、SDK 写法一致) |
128
+ | `--thinking off\|minimal\|low\|medium\|high\|xhigh` | 思考级别(缺省 `medium`) |
129
+ | `--permission-mode plan\|default\|auto-edit\|full-auto` | 权限模式(缺省 `default`) |
130
+ | `-c` / `-r [id]` | 继续本目录最近的会话 / 选择会话恢复 |
131
+ | `--tools-preset <名>` | 工具预设(见下文) |
132
+ | `--allow <规则>` / `--deny <规则>` | 追加权限规则,可重复 |
133
+
134
+ 本地 Ollama / LM Studio 不需要 key:`ama --model ollama/<模型名>`。`ama --help` 列出全部参数与子命令;测试或排查时可用不花钱的 `--model fake/echo`(回显最后一条用户消息)。
135
+
136
+ ## 配置
137
+
138
+ 一个文件 `~/.config/ama/config.json`。第一次运行 ama 时自动建好目录(0700)、最小的 `config.json` 与给编辑器用的
139
+ `config.schema.json`;也可以 `ama init` 手动建(已有文件不覆盖)。`ama config path` 打印各文件位置,`ama config edit`
140
+ 用 `$VISUAL` / `$EDITOR` 打开。常用的只有五个键:
141
+
142
+ ```json
143
+ {
144
+ "$schema": "./config.schema.json",
145
+ "version": 1,
146
+ "defaultModel": "anthropic/<model-id>",
147
+ "thinkingLevel": "medium",
148
+ "permission": { "mode": "default", "allow": ["bash(git status*)"], "deny": ["write(**/.env*)"] },
149
+ "tools": { "preset": "default" },
150
+ "providers": {}
151
+ }
152
+ ```
153
+
154
+ 其余(`compaction`、`retry`、`codemode`、`hooks`、`ui`、`skills`、`cache`)都有缺省,`ama config show` 会列出来。
155
+
156
+ ### 文件位置与层级
157
+
158
+ | 位置 | 内容 |
159
+ | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
160
+ | `~/.config/ama/` | 用户级:`config.json`、`config.schema.json`(ama 生成)、`auth.json`(0600)、`hooks.json`、`keybindings.json`、`trust.json`、`AGENTS.md`、`skills/` |
161
+ | `~/.local/share/ama/` | 数据:`sessions/`(会话 JSONL)、`models-dev.json`(模型元数据缓存)、输入历史 |
162
+ | `<项目>/.ama/` | 项目级:`config.json`(只能收紧)、`hooks.json` / `skills/` / `prompts/`(需信任) |
163
+ | `<项目>/AGENTS.md` | 项目约定,从 cwd 向上查找,自动进系统提示 |
164
+ | `--profile <文件>` | 宿主 profile(嵌入方用,见「嵌入 Armadra」) |
165
+
166
+ `AMA_CONFIG_DIR` / `AMA_DATA_DIR` 可改两个目录;也遵循 `XDG_CONFIG_HOME` / `XDG_DATA_HOME`,Windows 下是 `%APPDATA%\ama` 与 `%LOCALAPPDATA%\ama`。
167
+
168
+ 合并顺序是 **内置缺省 ← 用户级 ← profile ← 项目级**,但项目级只能收紧:可以追加 deny、把权限模式改严、把工具预设改窄、关掉 codemode;`allow` 规则、放宽模式、`cache`、`tools.default` 等放宽项被忽略并给出 warning。这样克隆一个陌生仓库不会因为它的配置而放开权限。
169
+
170
+ ### 检查
171
+
172
+ ```sh
173
+ ama config show # 每一项的生效值与来源、供应商、将使用的模型、工具
174
+ ama config show --json
175
+ ama doctor # 配置层级、项目信任、key 来源、Hook、终端能力
176
+ ```
177
+
178
+ ## 接入中转站
179
+
180
+ **一键接入**:只给 baseUrl 与 key。
181
+
182
+ ```sh
183
+ export PACKY_API_KEY=sk-...
184
+ ama providers add packy --base-url https://proxy.example/v1 --key-env PACKY_API_KEY --probe --limit 8 --yes
185
+ ama -p "hi" --model packy/kimi-k2.5 # 首选渠道
186
+ ama -p "hi" --model packy/kimi-k2.5@messages # 指定渠道(Anthropic Messages)
187
+ ama -p "图里有什么颜色" --image shot.png --model packy/kimi-k2.5
188
+ ama providers list # 供应商 → 渠道 → 模型数、key 来源
189
+ ```
190
+
191
+ `add` 列出 `GET {baseUrl}/models` 的模型,从 baseUrl 推出 chat / responses / messages 三个候选渠道,`--probe` 逐渠道发最小
192
+ 请求,把能用的渠道写进每个模型的 `channels`;上下文、输出上限、图像、推理与价格不写进配置,运行时从 models.dev 缓存补
193
+ (`ama models list` 标出每个字段的来源)。不给 `--key-env` 时 key 从 stdin 读(不回显)存进 `auth.json`。写入后的配置:
194
+
195
+ ```json
196
+ {
197
+ "providers": {
198
+ "packy": {
199
+ "apiKey": "$PACKY_API_KEY",
200
+ "channels": {
201
+ "chat": { "api": "openai-completions", "baseUrl": "https://proxy.example/v1" },
202
+ "responses": { "api": "openai-responses", "baseUrl": "https://proxy.example/v1" },
203
+ "messages": { "api": "anthropic-messages", "baseUrl": "https://proxy.example" }
204
+ },
205
+ "defaultChannel": "chat",
206
+ "models": [
207
+ { "id": "kimi-k2.5", "channels": ["chat", "messages"] },
208
+ { "id": "grok-4.7", "channels": ["responses"] }
209
+ ]
210
+ }
211
+ }
212
+ }
213
+ ```
214
+
215
+ **零配置**:内置的 `openai` / `anthropic` 识别 `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL`。baseUrl 不在官方主机时接受目录外的 model id,缓存相关字段按保守缺省。
216
+
217
+ ```sh
218
+ OPENAI_BASE_URL=https://proxy.example/v1 OPENAI_API_KEY=$PACKY_API_KEY \
219
+ ama -p "hi" --model openai/qwen3.8-flash
220
+ ```
221
+
222
+ **一个供应商 + 模型级协议**:同一个中转站下,不同模型支持的协议常常不同。不必为每种协议建一个供应商,把 `api` 写在模型上即可:
223
+
224
+ ```json
225
+ {
226
+ "version": 1,
227
+ "providers": {
228
+ "packy": {
229
+ "baseUrl": "https://proxy.example/v1",
230
+ "apiKey": "$PACKY_API_KEY",
231
+ "models": [
232
+ { "id": "deepseek-v4-flash" },
233
+ { "id": "grok-4.7", "api": "openai-responses" },
234
+ { "id": "MiniMax-M2.7", "api": "anthropic-messages" }
235
+ ]
236
+ }
237
+ }
238
+ }
239
+ ```
240
+
241
+ - `api` 缺省 `openai-completions`;可选 `openai-responses`、`anthropic-messages`、`google-generative-ai`。
242
+ - `apiKey` 支持 `$ENV` / `${ENV}`(读环境变量)与 `!command`(执行命令取值),不要把 key 明文写进配置。
243
+ - 自定义模型的元数据缺省从 models.dev 补(`ama models refresh-catalog` 刷新缓存);匹配不到时不猜 `contextWindow`,自动
244
+ 压缩关闭,需要时在模型条目里补上或写 `"modelsDev": "provider/model"` 指定条目。
245
+
246
+ **不想手写模型表**:让 ama 去问中转站。
247
+
248
+ ```sh
249
+ ama models discover packy # 列出 GET {baseUrl}/models
250
+ ama models discover packy --probe --write --limit 8 # 逐个探测可用协议并写回配置
251
+ ama models check packy/grok-4.7 # 一次最小请求确认连通
252
+ ama models cache-probe packy/grok-4.7 # 这个端点报不报缓存
253
+ ```
254
+
255
+ `--probe` 对每个模型依次试几种协议,记第一个成功的;`--write` 合并进用户级 `config.json`(原文件备份为 `config.json.bak`,已有条目不覆盖)。`--probe` 与 `cache-probe` 都会发真实请求:执行前打印预估,401 / 403 / 429 即停,`cache-probe` 在非交互环境需要 `--yes`。细节见 [docs/providers.md](docs/providers.md)。
256
+
257
+ ## 工具与预设
258
+
259
+ | 预设 | 模型直接看到的工具 | 适合 |
260
+ | ------------- | ----------------------------------- | ------------------------------------------ |
261
+ | `default` | read、edit、write、bash、grep、glob | 缺省 |
262
+ | `minimal` | read、edit、write、bash | 小模型、小上下文;`full-auto` |
263
+ | `codemode` | 只有 `codemode` | 长流程、工具调用密集的任务 |
264
+ | `coordinator` | read 与宿主注册的画布工具 | 嵌入 Armadra 的协调者:不写文件、不跑 bash |
265
+
266
+ - `--tools-preset <名>` 或 `tools.preset` 选预设。
267
+ - `tools.default` 在预设上微调:`["+todo", "+task", "-glob"]`;不带前缀的名字整组替换。
268
+ - 另有 `--tools a,b,c`(只启用这些)、`--exclude-tools a,b`、交互模式的 `/tools`。
269
+
270
+ **codemode** 让模型写一段 JavaScript,用 `tools.<name>(args)` 编排多次工具调用(可以 `Promise.all` 并发),只有脚本输出回到模型。`--tools-preset codemode` 只留它,`--codemode on` 在现有工具之外加上它。脚本跑在 `node --permission` 子进程的 vm 里:没有 `require` / `import` / `process` / `fetch`,每次内层调用仍逐个经过 Hook、权限与审批。
271
+
272
+ **什么时候用 codemode**:[三预设基准](docs/benchmarks/presets-2026-10-02.md)(三个模型 × 三类小任务)里,codemode 每组输入 token 比 default 多约 45%(工具声明每轮都在前缀里),顶层轮数却没有明显减少——这些任务本来只需要 2–4 次调用。所以缺省保持 `default`,只读检索多、调用次数多的长流程再用 codemode。
273
+
274
+ ## 缓存
275
+
276
+ 长任务的主要用量是缓存读取:前缀一旦变化,此后每次请求都按全价重读。ama 分三层处理:
277
+
278
+ - **协议层**:系统提示节顺序固定、不含时间戳,工具按名排序,中途变化只追加在末尾;按各家写法打缓存断点(Anthropic `cache_control`、OpenAI `prompt_cache_key` 等),端点 400 拒收某个缓存字段时自动去掉重发。
279
+ - **会话层**:每次请求记前缀指纹,检测未命中并归因(空闲超时、子任务、切换模型、系统提示 / 工具表变化、服务端淘汰),判定端点报不报缓存,长工具运行期间保温。
280
+ - **展示层**:状态栏、`/session`、`/cache`、RPC 统计与 `ama models cache-probe`。
281
+
282
+ ### 读状态栏
283
+
284
+ ```
285
+ anthropic/<model-id> · think:medium · ↑412k ↓8.1k · cache 83% ♨ · $0.84 · rebill $0.11 · ctx 34% · mode:default
286
+ ```
287
+
288
+ | 项 | 怎么读 |
289
+ | -------------- | -------------------------------------------------------------------------- |
290
+ | `cache 83%` | **最近一次**请求的命中率;会话累计在 `/session` |
291
+ | `cache —` | 端点还没报过缓存(还没有足够长的可比请求) |
292
+ | `cache 未报告` | 端点不报缓存(连续 3 次读写都是 0);这类请求不算进命中率,而不是显示成 0% |
293
+ | `♨` | 保温计时中 |
294
+ | `rebill $0.11` | 本会话因缓存未命中多付的钱(无价格的模型显示 token);为 0 不显示 |
295
+ | `ctx 34%` | 上下文占用;≥ 70% 黄、≥ 90% 红,跨过时消息区提示「约剩 N 回合」 |
296
+
297
+ 一次未命中重计费 ≥ 20k token 或 ≥ $0.10 时,消息区写一行原因。`/cache` 看缓存统计,`/cache fingerprint` 查前缀指纹(两次之间哈希变了,就是系统提示或工具表被改了)。
298
+
299
+ ### 三态、保温与摘要续写
300
+
301
+ - **三态**:每个端点(供应商 + 主机 + 模型)在 `unknown` / `reported` / `silent` 之间判定。只有 `reported` 才显示命中率、检测未命中、保温;不报缓存的中转不会被误报成 0%。中转上已知不报的模型可以设 `compat.cacheReporting: "silent"`。
302
+ - **保温**:工具长时间运行(长测试、`task` 子任务、codemode 脚本)时,在缓存 TTL 到期前重放一次上一个请求(`maxTokens: 1`),只付读价把缓存续上。`cache.warming` 取 `off` / `streaming`(缺省,只在运行中)/ `idle`(空闲也保温,适合贵模型),`/cache warm …` 本会话切换;期望节省低于 `cache.minSavingsUsd`(缺省 $0.05)不发。
303
+ - **摘要续写**:上下文压缩的摘要请求接在与上一次真实请求逐字节相同的前缀后面,整段历史按读价计费;失败时回落为独立摘要请求。
304
+
305
+ ### 实测
306
+
307
+ [缓存验收实验](docs/benchmarks/cache-2026-10-02.md)(2026-10-02,经一家测试中转站):
308
+
309
+ | 场景 | 结果 |
310
+ | --------------------------- | ---------------------------------------------------------------------------------------------- |
311
+ | Kimi 摘要续写 | 摘要请求读缓存 20.2k / 20.5k,**命中 98.8%**(修复前 0%:发 `tool_choice` 时前缀在工具段断开) |
312
+ | DeepSeek 按 2048 粒度报缓存 | 假未命中 3 次 → **0 次**(自动推断端点缓存粒度) |
313
+ | 基线命中率(5 轮编码任务) | Kimi 累计 86%、MiniMax 75%,均 0 次未命中 |
314
+
315
+ 缓存相关的全部配置与各协议字段见 [docs/providers.md](docs/providers.md)「缓存」。
316
+
317
+ ## 安全
318
+
319
+ **权限模式**(`--permission-mode`、`/permission`、交互模式 `Shift+Tab` 循环):
320
+
321
+ | 模式 | 读 | 写 | 执行(bash 等) |
322
+ | ----------- | --- | ---- | --------------- |
323
+ | `plan` | ✓ | 拒绝 | 拒绝 |
324
+ | `default` | ✓ | 询问 | 询问 |
325
+ | `auto-edit` | ✓ | ✓ | 询问 |
326
+ | `full-auto` | ✓ | ✓ | ✓ |
327
+
328
+ **判定顺序**:deny 规则(含 Hook deny)→ 危险命令 → 模式 → allow 规则把「询问」变「允许」。前两步之后的规则不能放宽它们。无人值守(`-p`、RPC 未接审批)时「询问」一律按拒绝。
329
+
330
+ - **规则**:`bash(git push*)`、`write(src/**)`、`read(**)`、`canvas_*`;`--allow` / `--deny` 可重复。内置 deny:写 `.git/**`、读写 `.ssh/**`。
331
+ - **危险命令**:`rm -rf /`、`sudo`、`git push --force`、`git reset --hard`、`git clean -f`、`curl … | sh`、`chmod -R 777`、`npm publish`、`shutdown` 等,即使有 allow 规则也要询问。识别会穿透 `sh -c '…'`、`eval`、`xargs`、`find -exec` 与 git 全局选项。
332
+ - **项目信任**:`.ama/hooks.json`、`.ama/skills/`、`.ama/prompts/` 会执行或注入项目里的内容,需要先信任目录(交互模式问一次,可记住;`--trust` / `--no-trust`;非交互缺省不信任)。`AGENTS.md` 与 `.ama/config.json` 不需要信任,因为后者只能收紧。
333
+ - **执行前预览**:审批对话框除了输入摘要,还列出这一步会碰到什么——bash 里 `rm` / `mv` / `git clean` / `git reset --hard` / 重定向的目标路径是否存在、大小、目录里有多少文件;write 显示路径与行数,edit 显示每处修改的 −/+ 摘要。`y` 允许、`n` 拒绝、`a` 本会话同类不再问、`v` 看完整输入。
334
+ - **Hook**:`hooks.json` 在 `PreToolUse`、`PostToolUse`、`UserPromptSubmit`、`Stop` 等 9 个事件运行 shell 命令,可以否决工具调用、改写输入、追加上下文、让运行再跑一轮。见 [docs/hooks.md](docs/hooks.md)。
335
+
336
+ ## 界面与入口
337
+
338
+ ### 终端界面
339
+
340
+ 直接运行 `ama`(stdin / stdout 都是 TTY)进入交互模式。界面只用主屏,对话历史留在终端回滚里,tmux `capture-pane` 能读到完整对话。
341
+
342
+ | 按键 | 作用 |
343
+ | -------------------- | ------------------------------------------ |
344
+ | Enter | 发送;运行中插话(steer) |
345
+ | Alt+Enter | 运行中排到本轮之后(followUp) |
346
+ | Shift+Enter / Ctrl+J | 换行 |
347
+ | Esc | 中断当前运行 |
348
+ | Shift+Tab | 循环权限模式 |
349
+ | Ctrl+O | 展开 / 折叠工具输出 |
350
+ | Ctrl+L / Ctrl+T | 选择模型 / 思考级别 |
351
+ | Ctrl+C | 清空输入;输入为空时 1.5 秒内再按一次退出 |
352
+ | Tab | 补全:`/` 命令、模板与 Skill,`@` 文件路径 |
353
+
354
+ 常用命令:`/model`、`/thinking`、`/permission`、`/tools`、`/compact`、`/tree`(回到某条消息之前重新分支)、`/fork`、`/resume`、`/new`、`/session`、`/cache`、`/hooks`、`/skill:<名字>`、`/help`。输入里的 `@图片路径`(或粘贴 / 拖入的图片路径)作为图片附件发给模型;`/model` 按「供应商 · 渠道」分组,标出上下文与 `img`。按键可在 `~/.config/ama/keybindings.json` 覆盖。见 [docs/tui.md](docs/tui.md)。
355
+
356
+ `--no-tui`(或 stdin / stdout 不是 TTY、`TERM=dumb`)进入行式界面:readline + 括号粘贴,命令相同。
357
+
358
+ ### `-p` 一次性运行
359
+
360
+ | `--output-format` | stdout |
361
+ | ----------------- | ----------------------------------------------------------------------------- |
362
+ | `text`(缺省) | 最后一条回答的文本 |
363
+ | `json` | 一个 `result` 对象:会话 id、模型、`stopReason`、`text`、用量、费用、缓存统计 |
364
+ | `stream-json` | 每行一个事件,与 RPC 事件同形状 |
365
+
366
+ `--image <文件>` 可重复,随提示发送图片(PNG / JPEG / GIF / WebP,单张 ≤ 5 MB);提示里的 `@图片路径` 同样作为附件。当前
367
+ 模型不收图片时直接退出 2,不发请求。
368
+
369
+ 退出码:0 正常 · 1 运行期错误 · 2 用法错误 · 3 配置错误 · 4 无可用模型或 key · 5 会话错误 · 6 宿主 / Hook 启动失败 · 78 宿主 API 版本不匹配 · 130 / 143 信号。
370
+
371
+ ### RPC
372
+
373
+ `ama --mode rpc` 在 stdin / stdout 上说 JSONL:先发 `hello` 与 `session_start`,之后收 `prompt`、`steer`、`abort`、`set_model`、`get_session_stats`、`fork` 等命令,推送流事件与审批请求。
374
+
375
+ ```sh
376
+ printf '{"id":"1","type":"prompt","message":"hi"}\n' | ama --mode rpc --model fake/echo
377
+ ```
378
+
379
+ 协议见 [docs/rpc.md](docs/rpc.md),类型从 `@armadra/agent/rpc` 导入。
380
+
381
+ ### SDK
382
+
383
+ ```sh
384
+ npm i @armadra/agent
385
+ ```
386
+
387
+ ```ts
388
+ import { createAgentSession } from "@armadra/agent";
389
+
390
+ const session = await createAgentSession({
391
+ cwd: process.cwd(),
392
+ model: "anthropic/<model-id>", // 试跑可用 "fake/echo"
393
+ auth: { kind: "env" },
394
+ permission: {
395
+ mode: "default",
396
+ ask: async (request) => (request.toolName === "read" ? "allow" : "deny"),
397
+ },
398
+ });
399
+ session.subscribe((event) => {
400
+ if (event.type === "tool_execution_start") console.error(`→ ${event.toolName}`);
401
+ });
402
+ await session.prompt("列出 src 下的入口文件");
403
+ console.log(session.getLastAssistantText());
404
+ console.log(session.getStats().cache?.hitRate);
405
+ await session.dispose();
406
+ ```
407
+
408
+ - `createAgentSession` 不读文件系统配置:内存会话、指定工具、回调审批,适合嵌在别的程序里。
409
+ - `createRuntime({ argv })` 走与 `ama` 命令行相同的启动序列(读配置、AGENTS.md、Skill、hooks.json、auth.json)。
410
+ - 子路径:`@armadra/agent/host`(宿主适配器类型)、`@armadra/agent/rpc`(RPC 类型)、`@armadra/agent/tui`(终端组件库)、`@armadra/agent/bundle`(单文件 `ama.cjs`,`require.resolve` 可取路径交给 `node` 或 `ELECTRON_RUN_AS_NODE=1` 启动)。
411
+
412
+ 完整示例见 [examples/sdk-demo.ts](examples/sdk-demo.ts)(自定义工具、流式输出、用量统计)。
413
+
414
+ ## 嵌入 Armadra
415
+
416
+ Armadra 以 `ama --profile <path>` 启动 ama。profile 是一个 JSON 文件,指定宿主适配器(`host`)、指令(`instructions`)、Skill 与提示模板目录、Hook 文件、key 文件(`authFile`,可配 `authEnv: false` 不读环境变量)、会话目录与 `trustProject`。
417
+
418
+ 宿主适配器是一个本地 JS 模块,导出 `hostApi` 与 `create(api)`,经 `HostApi` 注册画布工具(`canvas_*` / `context_*`)、追加系统提示、接管审批、注入消息、显示状态。同一个 profile 在画布外运行时适配器不激活,ama 退化为普通独立模式。配合 `coordinator` 预设,协调者只读文件、调用画布工具,不自己改代码。
419
+
420
+ - ama 一侧的接口:[docs/host-api.md](docs/host-api.md)
421
+ - 协调者的设计与契约:Armadra 仓库 [docs/design/coordinator-agent.md](https://github.com/yovinchen/Armadra/blob/main/docs/design/coordinator-agent.md)
422
+
423
+ ## 文档
424
+
425
+ | 文档 | 内容 |
426
+ | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
427
+ | [docs/providers.md](docs/providers.md) | 内置供应商、API Key、自定义供应商与中转站、compat、缓存 |
428
+ | [docs/tui.md](docs/tui.md) | 终端界面:布局、按键、命令、审批预览、缓存显示、组件库 |
429
+ | [docs/codemode.md](docs/codemode.md) | codemode 脚本、沙箱与权限 |
430
+ | [docs/hooks.md](docs/hooks.md) | 命令式 Hook(hooks.json) |
431
+ | [docs/host-api.md](docs/host-api.md) | 宿主适配器 API |
432
+ | [docs/rpc.md](docs/rpc.md) | RPC 协议(stdio JSONL) |
433
+ | [docs/session-format.md](docs/session-format.md) | 会话文件格式 |
434
+ | [docs/extensions.md](docs/extensions.md) | 本地扩展(设计草案,未实现) |
435
+ | [docs/design.md](docs/design.md) | 总体设计与决策记录 |
436
+ | [docs/benchmarks/](docs/benchmarks/) | 三预设基准与缓存验收实验(报告与原始数据) |
437
+ | [docs/implementation-plan.md](docs/implementation-plan.md)、[docs/wave3-plan.md](docs/wave3-plan.md) | 实施计划(追溯用) |
438
+
439
+ ## 开发
440
+
441
+ 需要 Node ≥ 22 与 pnpm(版本见 `package.json` 的 `packageManager`,`corepack enable` 即可)。
442
+
443
+ ```sh
444
+ pnpm install
445
+ pnpm run ci # typecheck、fmt:check、check:deps、release:check、test、build,再跑 bundle --version
446
+ AMA_E2E=1 pnpm test:e2e # bundle 级端到端:print / rpc / codemode / cache / host(fake 供应商,不花钱)
447
+ ```
448
+
449
+ pnpm 10 起 `pnpm ci` 是内置的「清理后安装」,跑检查要写 `pnpm run ci`。常用单项:`pnpm test`、`pnpm typecheck`、`pnpm fmt`、`pnpm build`。测试一律用 fake 供应商:`AMA_FAKE_SCRIPT=<脚本.json>` 让它按脚本产出文本、工具调用、429、断流等,示例在 `test/fixtures/scripts/`。
450
+
451
+ **真实模型脚本**(本地跑,CI 不跑;先 `pnpm build`):
452
+
453
+ | 脚本 | 用途 |
454
+ | --------------------------------------------------------- | ------------------------------------- |
455
+ | `node scripts/bench-presets.mjs`(`pnpm bench:presets`) | 三预设基准 |
456
+ | `node scripts/cache-experiment.mjs`(`pnpm bench:cache`) | 缓存验收实验 E1–E5 |
457
+ | `node scripts/record-sse.mjs` | 录制各协议的 SSE 样本作为测试 fixture |
458
+
459
+ 前两个共用预算控制:`--config` / `AMA_REAL_CONFIG`(含 key 引用的 config.json)、`--models` / `AMA_REAL_MODELS`、`--max-requests` / `AMA_REAL_MAX_REQUESTS`(缺省 60)、`--budget-usd` / `AMA_REAL_BUDGET_USD`(缺省 3)。超过请求数或预算立即停止并输出已有数据;配置与数据目录指向临时目录,不碰你的用户配置。
460
+
461
+ **约束**:运行时依赖必须为零,`src/` 只允许 `node:` 内置模块与相对路径(`pnpm check:deps` 守住)。`src/` 按层分目录(`ai` 模型接入、`agent` 循环、`session` 会话树、`tools`、`codemode`、`permissions`、`hooks`、`host` 宿主契约、`tui` 组件库、`modes` 各入口、`cli` 启动),各目录的 `types.ts` 是模块之间的契约。
462
+
463
+ **发布**:改 `package.json` 版本与 [CHANGELOG.md](CHANGELOG.md),合入 main 后打 `v<版本>` tag。CI 全绿后 release job 生成 GitHub Release(`ama.cjs`、`ama-sandbox.cjs`、`package.tgz`、`SHA256SUMS`),再以 provenance 发布到 npm(需要仓库 secret `NPM_TOKEN`,没有时跳过)。`pnpm release:check` 检查 tag 与版本一致,协议常量变化要求破坏性版本升级。
464
+
465
+ ## 更新记录
466
+
467
+ 见 [CHANGELOG.md](CHANGELOG.md)。
468
+
469
+ ## 许可证
470
+
471
+ [MIT](LICENSE)
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 有状态 Agent(设计 §4.1–§4.3):持有上下文消息、两条队列、当前 run,发 agent_start / agent_end。[B2]
3
+ *
4
+ * - `run(prompts)`:运行中再调用 → `AmaError{code:"busy"}`;空 prompts = continue(末条须能转成
5
+ * user / toolResult)。返回 RunOutcome;`agent_end.willRetry` 由 `onRunEnd` 决定(会话层重试 /
6
+ * 溢出恢复在 agent_end 之前就要知道是否会重试)。
7
+ * - 监听器按订阅顺序被 await,计入本 run 的收尾;监听器抛错只记录不中断。
8
+ * - `abort()` 只中断当前 run(不清队列);`waitForIdle()` 在 run 与 agent_end 监听器都结束后 resolve。
9
+ * - 消息在 `message_end` 时进入 `messages`;会话层可在 run 之间(或 run 中、请求之前)整体替换。
10
+ */
11
+ import type { Model, ModelThinkingLevel, StreamOptions } from "../ai/types.js";
12
+ import type { AgentMessage } from "../session/types.js";
13
+ import { type LoopCallbacks, type RunOutcome, type StreamFn } from "./loop.js";
14
+ import { PendingMessageQueue } from "./queue.js";
15
+ import type { ToolRunnerOptions } from "./tool-runner.js";
16
+ import type { QueueMode, SessionEvent } from "./types.js";
17
+ export type AgentListener = (event: SessionEvent) => void | Promise<void>;
18
+ export interface AgentOptions {
19
+ hooks: LoopCallbacks;
20
+ stream: StreamFn;
21
+ getModel(): Model;
22
+ getThinkingLevel(): ModelThinkingLevel;
23
+ streamOptions?(model: Model): Promise<Partial<StreamOptions>> | Partial<StreamOptions>;
24
+ beforeRequest?(signal: AbortSignal): Promise<void>;
25
+ tools: ToolRunnerOptions;
26
+ messages?: AgentMessage[];
27
+ steeringMode?: QueueMode;
28
+ followUpMode?: QueueMode;
29
+ /** 监听器抛错时的记录口。 */
30
+ onListenerError?(error: unknown, event: SessionEvent): void;
31
+ }
32
+ export interface AgentRunOptions {
33
+ /** 外部取消(会话级 AbortController);与本 run 自己的控制器联动。 */
34
+ signal?: AbortSignal;
35
+ skipInitialSteering?: boolean;
36
+ /** 在 agent_end 之前调用,返回是否会重试(写进 agent_end.willRetry)。 */
37
+ onRunEnd?(outcome: RunOutcome): boolean | Promise<boolean>;
38
+ }
39
+ export declare class Agent {
40
+ messages: AgentMessage[];
41
+ readonly steeringQueue: PendingMessageQueue;
42
+ readonly followUpQueue: PendingMessageQueue;
43
+ private readonly listeners;
44
+ private readonly options;
45
+ private active;
46
+ constructor(options: AgentOptions);
47
+ subscribe(listener: AgentListener): () => void;
48
+ get isRunning(): boolean;
49
+ get signal(): AbortSignal | undefined;
50
+ steer(message: AgentMessage): void;
51
+ followUp(message: AgentMessage): void;
52
+ abort(): void;
53
+ waitForIdle(): Promise<void>;
54
+ private emit;
55
+ run(prompts: readonly AgentMessage[], runOptions?: AgentRunOptions): Promise<RunOutcome>;
56
+ }