@armadra/agent 0.5.0 → 0.6.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 (471) hide show
  1. package/CHANGELOG.md +177 -294
  2. package/CHANGELOG.zh-CN.md +442 -0
  3. package/README.md +408 -364
  4. package/README.zh-CN.md +705 -0
  5. package/dist/agent/session-plan.js +2 -2
  6. package/dist/agent/session-state.d.ts +3 -0
  7. package/dist/agent/session-state.js +20 -0
  8. package/dist/agent/session-subagent.d.ts +15 -1
  9. package/dist/agent/session-subagent.js +26 -3
  10. package/dist/agent/session-telemetry.d.ts +16 -2
  11. package/dist/agent/session-telemetry.js +29 -7
  12. package/dist/agent/session-tools.js +5 -2
  13. package/dist/agent/session-trace-writer.d.ts +27 -0
  14. package/dist/agent/session-trace-writer.js +253 -0
  15. package/dist/agent/session.d.ts +2 -0
  16. package/dist/agent/session.js +12 -0
  17. package/dist/agent/subagent-direct.d.ts +20 -0
  18. package/dist/agent/subagent-direct.js +76 -0
  19. package/dist/agent/subagent-registry.d.ts +8 -1
  20. package/dist/agent/subagent-registry.js +28 -1
  21. package/dist/agent/system-prompt.d.ts +3 -1
  22. package/dist/agent/system-prompt.js +3 -0
  23. package/dist/agent/tool-runner.d.ts +2 -1
  24. package/dist/agent/tool-runner.js +5 -4
  25. package/dist/agent/types-w6.d.ts +39 -0
  26. package/dist/agent/types-w6.js +4 -0
  27. package/dist/agent/types.d.ts +5 -2
  28. package/dist/agents/external.js +1 -1
  29. package/dist/agents/task-record.d.ts +74 -1
  30. package/dist/agents/task-record.js +100 -0
  31. package/dist/ai/apis/cache-params.js +2 -1
  32. package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
  33. package/dist/ai/apis/chatgpt-backend.js +224 -0
  34. package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
  35. package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
  36. package/dist/ai/apis/openai-responses-request.d.ts +2 -1
  37. package/dist/ai/apis/openai-responses-request.js +8 -2
  38. package/dist/ai/apis/openai-responses.d.ts +2 -0
  39. package/dist/ai/apis/openai-responses.js +51 -16
  40. package/dist/ai/overflow.d.ts +1 -1
  41. package/dist/ai/overflow.js +10 -7
  42. package/dist/ai/providers/auth.d.ts +15 -2
  43. package/dist/ai/providers/auth.js +69 -2
  44. package/dist/ai/providers/builtin.js +27 -0
  45. package/dist/ai/providers/catalog-data.js +1 -0
  46. package/dist/ai/providers/enrich.js +2 -7
  47. package/dist/ai/providers/models-dev-cache.js +15 -19
  48. package/dist/ai/providers/models-dev-snapshot.js +8 -7
  49. package/dist/ai/providers/models-dev.js +5 -15
  50. package/dist/ai/providers/suggest.js +2 -16
  51. package/dist/ai/types.d.ts +27 -1
  52. package/dist/auth/chatgpt/backend-client.d.ts +26 -0
  53. package/dist/auth/chatgpt/backend-client.js +74 -0
  54. package/dist/auth/chatgpt/claims.d.ts +17 -0
  55. package/dist/auth/chatgpt/claims.js +46 -0
  56. package/dist/auth/chatgpt/cli.d.ts +33 -0
  57. package/dist/auth/chatgpt/cli.js +252 -0
  58. package/dist/auth/chatgpt/doctor.d.ts +17 -0
  59. package/dist/auth/chatgpt/doctor.js +36 -0
  60. package/dist/auth/chatgpt/host-id.d.ts +7 -0
  61. package/dist/auth/chatgpt/host-id.js +26 -0
  62. package/dist/auth/chatgpt/login.d.ts +30 -0
  63. package/dist/auth/chatgpt/login.js +130 -0
  64. package/dist/auth/chatgpt/presets.d.ts +66 -0
  65. package/dist/auth/chatgpt/presets.js +120 -0
  66. package/dist/auth/chatgpt/quota-text.d.ts +13 -0
  67. package/dist/auth/chatgpt/quota-text.js +36 -0
  68. package/dist/auth/oauth/browser.d.ts +12 -0
  69. package/dist/auth/oauth/browser.js +27 -0
  70. package/dist/auth/oauth/callback-server.d.ts +47 -0
  71. package/dist/auth/oauth/callback-server.js +147 -0
  72. package/dist/auth/oauth/flows.d.ts +62 -0
  73. package/dist/auth/oauth/flows.js +113 -0
  74. package/dist/auth/oauth/jwt.d.ts +24 -0
  75. package/dist/auth/oauth/jwt.js +81 -0
  76. package/dist/auth/oauth/live.d.ts +21 -0
  77. package/dist/auth/oauth/live.js +25 -0
  78. package/dist/auth/oauth/oidc.d.ts +26 -0
  79. package/dist/auth/oauth/oidc.js +72 -0
  80. package/dist/auth/oauth/pkce.d.ts +15 -0
  81. package/dist/auth/oauth/pkce.js +20 -0
  82. package/dist/auth/oauth/refresh.d.ts +35 -0
  83. package/dist/auth/oauth/refresh.js +129 -0
  84. package/dist/auth/oauth/token-client.d.ts +33 -0
  85. package/dist/auth/oauth/token-client.js +121 -0
  86. package/dist/auth/oauth/token-store.d.ts +23 -0
  87. package/dist/auth/oauth/token-store.js +125 -0
  88. package/dist/auth/testing/fake-oauth.d.ts +73 -0
  89. package/dist/auth/testing/fake-oauth.js +271 -0
  90. package/dist/auth/testing/refresh-child.d.ts +5 -0
  91. package/dist/auth/testing/refresh-child.js +16 -0
  92. package/dist/bundle/ama.cjs +28307 -13241
  93. package/dist/checkpoints/backend.js +6 -5
  94. package/dist/checkpoints/restore.js +3 -2
  95. package/dist/checkpoints/settings.js +2 -1
  96. package/dist/checkpoints/shadow-git.js +7 -6
  97. package/dist/checkpoints/shadow-restore.js +3 -2
  98. package/dist/checkpoints/tracker.js +4 -3
  99. package/dist/cli/args.d.ts +9 -2
  100. package/dist/cli/args.js +74 -27
  101. package/dist/cli/bootstrap.js +53 -31
  102. package/dist/cli/choice-prompt.d.ts +58 -0
  103. package/dist/cli/choice-prompt.js +142 -0
  104. package/dist/cli/codemode-notice.js +2 -2
  105. package/dist/cli/compose-agents.js +2 -1
  106. package/dist/cli/compose-extensions.js +2 -0
  107. package/dist/cli/compose-memory.d.ts +53 -0
  108. package/dist/cli/compose-memory.js +127 -0
  109. package/dist/cli/compose-providers.d.ts +5 -0
  110. package/dist/cli/compose-providers.js +32 -2
  111. package/dist/cli/compose-session.d.ts +5 -0
  112. package/dist/cli/compose-session.js +27 -13
  113. package/dist/cli/compose-store.d.ts +2 -0
  114. package/dist/cli/compose-store.js +9 -5
  115. package/dist/cli/compose.d.ts +2 -0
  116. package/dist/cli/compose.js +13 -5
  117. package/dist/cli/default-model.d.ts +0 -2
  118. package/dist/cli/default-model.js +5 -8
  119. package/dist/cli/deps.d.ts +5 -1
  120. package/dist/cli/exit-codes.d.ts +1 -1
  121. package/dist/cli/exit-codes.js +7 -16
  122. package/dist/cli/from-prompt.js +3 -2
  123. package/dist/cli/help-text.d.ts +2 -1
  124. package/dist/cli/help-text.js +5 -99
  125. package/dist/cli/main.d.ts +5 -0
  126. package/dist/cli/main.js +21 -2
  127. package/dist/cli/proxy.js +14 -9
  128. package/dist/cli/runtime.d.ts +5 -0
  129. package/dist/cli/startup-screen.js +20 -27
  130. package/dist/cli/startup-steps.js +6 -8
  131. package/dist/cli/subcommands/auth.d.ts +6 -3
  132. package/dist/cli/subcommands/auth.js +52 -22
  133. package/dist/cli/subcommands/config-set.d.ts +21 -0
  134. package/dist/cli/subcommands/config-set.js +137 -0
  135. package/dist/cli/subcommands/config.d.ts +2 -1
  136. package/dist/cli/subcommands/config.js +51 -37
  137. package/dist/cli/subcommands/doctor.d.ts +2 -1
  138. package/dist/cli/subcommands/doctor.js +97 -58
  139. package/dist/cli/subcommands/init.d.ts +1 -1
  140. package/dist/cli/subcommands/init.js +8 -7
  141. package/dist/cli/subcommands/memory.d.ts +18 -0
  142. package/dist/cli/subcommands/memory.js +189 -0
  143. package/dist/cli/subcommands/model-meta.js +11 -9
  144. package/dist/cli/subcommands/models-cache-probe.d.ts +1 -1
  145. package/dist/cli/subcommands/models-cache-probe.js +26 -32
  146. package/dist/cli/subcommands/models-discover.d.ts +3 -0
  147. package/dist/cli/subcommands/models-discover.js +44 -21
  148. package/dist/cli/subcommands/models.d.ts +1 -1
  149. package/dist/cli/subcommands/models.js +29 -22
  150. package/dist/cli/subcommands/probe-runner.js +8 -7
  151. package/dist/cli/subcommands/providers-list.js +32 -21
  152. package/dist/cli/subcommands/providers-plan.js +24 -25
  153. package/dist/cli/subcommands/providers-probe.js +5 -6
  154. package/dist/cli/subcommands/providers.d.ts +2 -2
  155. package/dist/cli/subcommands/providers.js +48 -59
  156. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  157. package/dist/cli/subcommands/sessions-export.js +10 -9
  158. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  159. package/dist/cli/subcommands/sessions-search.js +11 -10
  160. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  161. package/dist/cli/subcommands/sessions-trace.js +156 -0
  162. package/dist/cli/subcommands/sessions.d.ts +4 -3
  163. package/dist/cli/subcommands/sessions.js +40 -37
  164. package/dist/cli/subcommands/stats.d.ts +1 -1
  165. package/dist/cli/subcommands/stats.js +49 -30
  166. package/dist/cli/system-prompt-arg.js +3 -2
  167. package/dist/codemode/capability.js +3 -2
  168. package/dist/compaction/post-compact.d.ts +1 -0
  169. package/dist/compaction/post-compact.js +15 -1
  170. package/dist/compaction/prune-tier.d.ts +1 -1
  171. package/dist/compaction/prune-tier.js +3 -3
  172. package/dist/compaction/serialize.js +2 -1
  173. package/dist/config/auth-file.d.ts +12 -2
  174. package/dist/config/auth-file.js +32 -10
  175. package/dist/config/checker.js +12 -11
  176. package/dist/config/context-files.js +3 -2
  177. package/dist/config/edit.d.ts +106 -0
  178. package/dist/config/edit.js +350 -0
  179. package/dist/config/init.d.ts +4 -3
  180. package/dist/config/init.js +10 -18
  181. package/dist/config/json-schema.d.ts +2 -1
  182. package/dist/config/json-schema.js +101 -68
  183. package/dist/config/key-docs.d.ts +18 -7
  184. package/dist/config/key-docs.js +43 -128
  185. package/dist/config/load.js +7 -6
  186. package/dist/config/merge.d.ts +4 -1
  187. package/dist/config/merge.js +42 -22
  188. package/dist/config/paths.js +6 -5
  189. package/dist/config/profile.d.ts +5 -1
  190. package/dist/config/profile.js +7 -2
  191. package/dist/config/schema-w5.js +3 -2
  192. package/dist/config/schema-w6.d.ts +19 -0
  193. package/dist/config/schema-w6.js +115 -0
  194. package/dist/config/schema.js +34 -20
  195. package/dist/config/settings-registry.d.ts +78 -0
  196. package/dist/config/settings-registry.js +184 -0
  197. package/dist/config/types-w6.d.ts +109 -0
  198. package/dist/config/types-w6.js +19 -0
  199. package/dist/config/types.d.ts +11 -8
  200. package/dist/config/types.js +1 -0
  201. package/dist/drivers/acp/client.js +1 -1
  202. package/dist/drivers/acp/driver.js +13 -8
  203. package/dist/drivers/agents.js +4 -3
  204. package/dist/drivers/base.js +3 -2
  205. package/dist/drivers/host-runners.js +2 -1
  206. package/dist/drivers/native/claude-stream.js +12 -11
  207. package/dist/drivers/native/codex-app-server.js +17 -12
  208. package/dist/drivers/native/oneshot.js +8 -7
  209. package/dist/drivers/pool.js +1 -1
  210. package/dist/drivers/runner.d.ts +3 -1
  211. package/dist/drivers/runner.js +68 -20
  212. package/dist/drivers/turn.js +1 -1
  213. package/dist/hooks/config.js +3 -2
  214. package/dist/hooks/protocol.js +18 -12
  215. package/dist/host/api-impl.js +11 -10
  216. package/dist/host/loader.js +9 -8
  217. package/dist/host/types.d.ts +3 -0
  218. package/dist/i18n/catalog.d.ts +2169 -0
  219. package/dist/i18n/catalog.js +72 -0
  220. package/dist/i18n/format.d.ts +21 -0
  221. package/dist/i18n/format.js +58 -0
  222. package/dist/i18n/index.d.ts +58 -0
  223. package/dist/i18n/index.js +72 -0
  224. package/dist/i18n/messages/agents.d.ts +84 -0
  225. package/dist/i18n/messages/agents.js +85 -0
  226. package/dist/i18n/messages/approval.d.ts +99 -0
  227. package/dist/i18n/messages/approval.js +100 -0
  228. package/dist/i18n/messages/auth.d.ts +187 -0
  229. package/dist/i18n/messages/auth.js +189 -0
  230. package/dist/i18n/messages/cli-args.d.ts +46 -0
  231. package/dist/i18n/messages/cli-args.js +46 -0
  232. package/dist/i18n/messages/cli-help.d.ts +12 -0
  233. package/dist/i18n/messages/cli-help.js +244 -0
  234. package/dist/i18n/messages/cli.d.ts +336 -0
  235. package/dist/i18n/messages/cli.js +311 -0
  236. package/dist/i18n/messages/config-keys.d.ts +289 -0
  237. package/dist/i18n/messages/config-keys.js +292 -0
  238. package/dist/i18n/messages/config.d.ts +502 -0
  239. package/dist/i18n/messages/config.js +239 -0
  240. package/dist/i18n/messages/drivers.d.ts +123 -0
  241. package/dist/i18n/messages/drivers.js +124 -0
  242. package/dist/i18n/messages/errors.d.ts +83 -0
  243. package/dist/i18n/messages/errors.js +171 -0
  244. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  245. package/dist/i18n/messages/interactive-line.js +69 -0
  246. package/dist/i18n/messages/interactive-startup.d.ts +103 -0
  247. package/dist/i18n/messages/interactive-startup.js +104 -0
  248. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  249. package/dist/i18n/messages/interactive-view.js +141 -0
  250. package/dist/i18n/messages/interactive.d.ts +493 -0
  251. package/dist/i18n/messages/interactive.js +248 -0
  252. package/dist/i18n/messages/memory.d.ts +123 -0
  253. package/dist/i18n/messages/memory.js +128 -0
  254. package/dist/i18n/messages/panels.d.ts +190 -0
  255. package/dist/i18n/messages/panels.js +189 -0
  256. package/dist/i18n/messages/permissions.d.ts +126 -0
  257. package/dist/i18n/messages/permissions.js +151 -0
  258. package/dist/i18n/messages/plan.d.ts +123 -0
  259. package/dist/i18n/messages/plan.js +124 -0
  260. package/dist/i18n/messages/print.d.ts +86 -0
  261. package/dist/i18n/messages/print.js +91 -0
  262. package/dist/i18n/messages/report.d.ts +391 -0
  263. package/dist/i18n/messages/report.js +490 -0
  264. package/dist/i18n/messages/rewind.d.ts +198 -0
  265. package/dist/i18n/messages/rewind.js +217 -0
  266. package/dist/i18n/messages/session.d.ts +230 -0
  267. package/dist/i18n/messages/session.js +258 -0
  268. package/dist/i18n/messages/settings.d.ts +348 -0
  269. package/dist/i18n/messages/settings.js +336 -0
  270. package/dist/i18n/messages/subcommands-config.d.ts +111 -0
  271. package/dist/i18n/messages/subcommands-config.js +127 -0
  272. package/dist/i18n/messages/subcommands.d.ts +548 -0
  273. package/dist/i18n/messages/subcommands.js +474 -0
  274. package/dist/i18n/messages/trace.d.ts +243 -0
  275. package/dist/i18n/messages/trace.js +238 -0
  276. package/dist/i18n/types.d.ts +15 -0
  277. package/dist/i18n/types.js +7 -0
  278. package/dist/index.d.ts +6 -0
  279. package/dist/index.js +2 -0
  280. package/dist/memory/edit.d.ts +24 -0
  281. package/dist/memory/edit.js +63 -0
  282. package/dist/memory/frontmatter.d.ts +37 -0
  283. package/dist/memory/frontmatter.js +79 -0
  284. package/dist/memory/index.d.ts +28 -0
  285. package/dist/memory/index.js +126 -0
  286. package/dist/memory/lock.d.ts +17 -0
  287. package/dist/memory/lock.js +62 -0
  288. package/dist/memory/paths.d.ts +57 -0
  289. package/dist/memory/paths.js +175 -0
  290. package/dist/memory/report.d.ts +36 -0
  291. package/dist/memory/report.js +86 -0
  292. package/dist/memory/runtime.d.ts +42 -0
  293. package/dist/memory/runtime.js +36 -0
  294. package/dist/memory/secrets.d.ts +8 -0
  295. package/dist/memory/secrets.js +27 -0
  296. package/dist/memory/section.d.ts +28 -0
  297. package/dist/memory/section.js +59 -0
  298. package/dist/memory/store.d.ts +70 -0
  299. package/dist/memory/store.js +284 -0
  300. package/dist/memory/tool.d.ts +31 -0
  301. package/dist/memory/tool.js +94 -0
  302. package/dist/modes/acp/acp-events.js +2 -1
  303. package/dist/modes/acp/acp-server.js +13 -12
  304. package/dist/modes/commands-core.d.ts +17 -0
  305. package/dist/modes/commands-core.js +101 -61
  306. package/dist/modes/image-input.js +20 -6
  307. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  308. package/dist/modes/interactive/agent-bar.js +248 -0
  309. package/dist/modes/interactive/agent-panels.js +27 -26
  310. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  311. package/dist/modes/interactive/agent-transcript.js +191 -0
  312. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  313. package/dist/modes/interactive/agent-ui.js +180 -14
  314. package/dist/modes/interactive/agent-view.d.ts +72 -0
  315. package/dist/modes/interactive/agent-view.js +281 -0
  316. package/dist/modes/interactive/approval-dialog.js +46 -34
  317. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  318. package/dist/modes/interactive/clipboard-paste.js +9 -4
  319. package/dist/modes/interactive/commands.d.ts +22 -1
  320. package/dist/modes/interactive/commands.js +93 -38
  321. package/dist/modes/interactive/completion.js +2 -1
  322. package/dist/modes/interactive/config-panel.d.ts +70 -0
  323. package/dist/modes/interactive/config-panel.js +319 -0
  324. package/dist/modes/interactive/config-ui.d.ts +96 -0
  325. package/dist/modes/interactive/config-ui.js +397 -0
  326. package/dist/modes/interactive/confirm-dialog.d.ts +49 -0
  327. package/dist/modes/interactive/confirm-dialog.js +120 -0
  328. package/dist/modes/interactive/event-notices.js +11 -9
  329. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  330. package/dist/modes/interactive/interactive-mode.js +25 -22
  331. package/dist/modes/interactive/key-dispatch.d.ts +18 -0
  332. package/dist/modes/interactive/key-dispatch.js +39 -13
  333. package/dist/modes/interactive/line/line-editor.js +2 -1
  334. package/dist/modes/interactive/line/line-mode.d.ts +2 -0
  335. package/dist/modes/interactive/line/line-mode.js +24 -4
  336. package/dist/modes/interactive/line/line-render.js +25 -24
  337. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  338. package/dist/modes/interactive/memory-panel.js +221 -0
  339. package/dist/modes/interactive/message-view.d.ts +4 -2
  340. package/dist/modes/interactive/message-view.js +42 -33
  341. package/dist/modes/interactive/panels.js +39 -31
  342. package/dist/modes/interactive/pickers.d.ts +2 -1
  343. package/dist/modes/interactive/pickers.js +10 -6
  344. package/dist/modes/interactive/plan-command.d.ts +1 -1
  345. package/dist/modes/interactive/plan-command.js +24 -27
  346. package/dist/modes/interactive/plan-dialog.js +18 -17
  347. package/dist/modes/interactive/plan-flow.js +6 -5
  348. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  349. package/dist/modes/interactive/rewind-command.js +18 -16
  350. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  351. package/dist/modes/interactive/rewind-flow.js +13 -14
  352. package/dist/modes/interactive/rewind-list.js +7 -6
  353. package/dist/modes/interactive/rewind-panel.js +40 -40
  354. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  355. package/dist/modes/interactive/rewind-text.js +48 -38
  356. package/dist/modes/interactive/run-indicator.js +15 -12
  357. package/dist/modes/interactive/session-events.js +3 -2
  358. package/dist/modes/interactive/startup-header.js +22 -23
  359. package/dist/modes/interactive/startup-ui.js +41 -29
  360. package/dist/modes/interactive/status-area.d.ts +2 -0
  361. package/dist/modes/interactive/status-area.js +8 -2
  362. package/dist/modes/interactive/status-bar.js +4 -3
  363. package/dist/modes/interactive/subagent-view.js +9 -7
  364. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  365. package/dist/modes/interactive/tasks-report.js +28 -31
  366. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  367. package/dist/modes/interactive/terminal-setup.js +23 -0
  368. package/dist/modes/interactive/tool-summary.js +19 -17
  369. package/dist/modes/interactive/tool-view.js +7 -4
  370. package/dist/modes/interactive/trace-view.d.ts +89 -0
  371. package/dist/modes/interactive/trace-view.js +332 -0
  372. package/dist/modes/print/print-mode.js +14 -15
  373. package/dist/modes/rpc/commands.js +7 -3
  374. package/dist/modes/rpc/rpc-mode.js +9 -3
  375. package/dist/modes/session-report.d.ts +2 -0
  376. package/dist/modes/session-report.js +101 -105
  377. package/dist/modes/startup-ui-text.js +11 -6
  378. package/dist/permissions/bypass.d.ts +30 -0
  379. package/dist/permissions/bypass.js +45 -0
  380. package/dist/permissions/memory-class.d.ts +23 -0
  381. package/dist/permissions/memory-class.js +54 -0
  382. package/dist/permissions/modes.d.ts +3 -3
  383. package/dist/permissions/modes.js +21 -16
  384. package/dist/permissions/pipeline.d.ts +1 -1
  385. package/dist/permissions/pipeline.js +9 -2
  386. package/dist/permissions/preview.js +49 -42
  387. package/dist/permissions/rules.js +5 -2
  388. package/dist/permissions/types.d.ts +4 -0
  389. package/dist/plan/store.js +2 -1
  390. package/dist/rpc.d.ts +39 -1
  391. package/dist/rpc.js +3 -0
  392. package/dist/sandbox/bash.js +11 -8
  393. package/dist/sandbox/detect.js +14 -11
  394. package/dist/sdk.d.ts +17 -1
  395. package/dist/sdk.js +29 -7
  396. package/dist/session/export.js +31 -30
  397. package/dist/session/manager.d.ts +1 -1
  398. package/dist/session/manager.js +5 -3
  399. package/dist/session/reuse.js +5 -4
  400. package/dist/session/scan.js +3 -2
  401. package/dist/session/stats-aggregate.d.ts +3 -1
  402. package/dist/session/stats-aggregate.js +5 -1
  403. package/dist/session/stats-index.js +2 -1
  404. package/dist/session/stats-scan.d.ts +4 -1
  405. package/dist/session/stats-scan.js +6 -2
  406. package/dist/session/store.d.ts +11 -0
  407. package/dist/session/store.js +48 -1
  408. package/dist/session/types.d.ts +2 -0
  409. package/dist/skills/builtin.js +2 -1
  410. package/dist/tools/image-file.d.ts +26 -1
  411. package/dist/tools/image-file.js +55 -13
  412. package/dist/tools/presets.d.ts +14 -1
  413. package/dist/tools/presets.js +3 -3
  414. package/dist/tools/registry.js +1 -1
  415. package/dist/tools/truncate.d.ts +1 -1
  416. package/dist/tools/truncate.js +2 -2
  417. package/dist/tools/types.d.ts +17 -1
  418. package/dist/trace/build-index.d.ts +91 -0
  419. package/dist/trace/build-index.js +127 -0
  420. package/dist/trace/build-nodes.d.ts +24 -0
  421. package/dist/trace/build-nodes.js +279 -0
  422. package/dist/trace/build-util.d.ts +43 -0
  423. package/dist/trace/build-util.js +120 -0
  424. package/dist/trace/build.d.ts +82 -0
  425. package/dist/trace/build.js +382 -0
  426. package/dist/trace/detail.d.ts +35 -0
  427. package/dist/trace/detail.js +205 -0
  428. package/dist/trace/flatten.d.ts +69 -0
  429. package/dist/trace/flatten.js +173 -0
  430. package/dist/trace/format.d.ts +47 -0
  431. package/dist/trace/format.js +329 -0
  432. package/dist/trace/html-template.d.ts +19 -0
  433. package/dist/trace/html-template.js +150 -0
  434. package/dist/trace/html.d.ts +104 -0
  435. package/dist/trace/html.js +292 -0
  436. package/dist/trace/preview.d.ts +29 -0
  437. package/dist/trace/preview.js +59 -0
  438. package/dist/trace/query-session.d.ts +14 -0
  439. package/dist/trace/query-session.js +38 -0
  440. package/dist/trace/query.d.ts +55 -0
  441. package/dist/trace/query.js +188 -0
  442. package/dist/trace/session.d.ts +40 -0
  443. package/dist/trace/session.js +168 -0
  444. package/dist/trace/types.d.ts +243 -0
  445. package/dist/trace/types.js +13 -0
  446. package/dist/tui/components/editor-paste.d.ts +2 -0
  447. package/dist/tui/components/editor-paste.js +6 -3
  448. package/dist/tui/components/editor.js +2 -2
  449. package/dist/tui/components/loader.d.ts +3 -0
  450. package/dist/tui/components/loader.js +14 -0
  451. package/dist/tui/components/settings-list.d.ts +61 -0
  452. package/dist/tui/components/settings-list.js +135 -0
  453. package/dist/tui/keybindings.d.ts +6 -1
  454. package/dist/tui/keybindings.js +18 -6
  455. package/dist/tui.d.ts +1 -0
  456. package/dist/tui.js +2 -0
  457. package/docs/en/host-api.md +167 -0
  458. package/docs/en/permissions.md +214 -0
  459. package/docs/en/providers.md +625 -0
  460. package/docs/en/rpc.md +361 -0
  461. package/docs/en/sessions.md +219 -0
  462. package/docs/en/tui.md +527 -0
  463. package/docs/host-api.md +18 -17
  464. package/docs/memory.md +172 -0
  465. package/docs/permissions.md +3 -2
  466. package/docs/providers.md +67 -1
  467. package/docs/rpc.md +31 -3
  468. package/docs/session-format.md +8 -2
  469. package/docs/sessions.md +29 -1
  470. package/docs/tui.md +189 -21
  471. package/package.json +8 -3
@@ -138,22 +138,53 @@ export async function fitImage(buf, mimeType, options = {}, path) {
138
138
  resized: { tool: resized.tool, ...(fit.size !== undefined ? { from: fit.size } : {}) },
139
139
  };
140
140
  }
141
+ const HINT_TEXT = {
142
+ resize_off: " (images.resize is off)",
143
+ no_tool: " (no resize tool found: install ImageMagick, or sips on macOS)",
144
+ still_too_large: " (resizing did not bring it under the limit)",
145
+ };
146
+ function imageError(message, detail) {
147
+ return new AmaError("invalid_arguments", message, { detail });
148
+ }
149
+ /** `AmaError.detail` 是否是读图失败的说明。 */
150
+ export function isImageFileErrorDetail(detail) {
151
+ return (typeof detail === "object" &&
152
+ detail !== null &&
153
+ typeof detail.path === "string" &&
154
+ ["missing", "not_file", "unsupported", "too_large", "too_wide"].includes(String(detail.reason)));
155
+ }
141
156
  function fitError(path, fit, limit, bytes, resizeOff) {
142
157
  const hint = resizeOff
143
- ? "(images.resize 为 off)"
158
+ ? "resize_off"
144
159
  : fit.note.includes("no resize tool")
145
- ? "(没找到缩放工具:装 ImageMagick,macOS 自带 sips)"
160
+ ? "no_tool"
146
161
  : fit.note.includes("resizing did not")
147
- ? "(缩放后仍超限)"
148
- : "";
162
+ ? "still_too_large"
163
+ : undefined;
164
+ const hintText = hint === undefined ? "" : HINT_TEXT[hint];
149
165
  if (fit.reason === "too_wide") {
150
- const dims = fit.size !== undefined ? `(${fit.size.width}×${fit.size.height})` : "";
151
- return new AmaError("invalid_arguments", `图片任一边超过 ${MAX_IMAGE_EDGE} px:${path}${dims}${hint}`);
166
+ const dims = fit.size !== undefined ? ` (${fit.size.width}x${fit.size.height})` : "";
167
+ return imageError(`Image edge exceeds ${MAX_IMAGE_EDGE} px: ${path}${dims}${hintText}`, {
168
+ reason: "too_wide",
169
+ path,
170
+ maxEdge: MAX_IMAGE_EDGE,
171
+ ...(fit.size !== undefined ? { size: fit.size } : {}),
172
+ ...(hint !== undefined ? { hint } : {}),
173
+ });
152
174
  }
153
- return new AmaError("invalid_arguments", `图片超过 ${formatMb(limit)} 上限(按 base64 后计算):${path}(${formatMb(base64Size(bytes))})${hint}`);
175
+ const limitMb = formatMb(limit);
176
+ const sizeMb = formatMb(base64Size(bytes));
177
+ return imageError(`Image exceeds the ${limitMb} limit (base64): ${path} (${sizeMb})${hintText}`, {
178
+ reason: "too_large",
179
+ path,
180
+ limitMb,
181
+ sizeMb,
182
+ ...(hint !== undefined ? { hint } : {}),
183
+ });
154
184
  }
155
185
  /**
156
- * 读一张图片作为附件。文件不存在、不是图片、超过上限 → AmaError(`invalid_arguments`),文案给用户看。
186
+ * 读一张图片作为附件。文件不存在、不是图片、超过上限 → AmaError(`invalid_arguments`,英文 message,
187
+ * `detail` 为 `ImageFileErrorDetail`,界面层据此本地化)。
157
188
  */
158
189
  export async function loadImageFile(path, options = {}) {
159
190
  let info;
@@ -161,17 +192,28 @@ export async function loadImageFile(path, options = {}) {
161
192
  info = await stat(path);
162
193
  }
163
194
  catch {
164
- throw new AmaError("invalid_arguments", `图片不存在:${path}`);
195
+ throw imageError(`Image not found: ${path}`, { reason: "missing", path });
165
196
  }
166
197
  if (!info.isFile())
167
- throw new AmaError("invalid_arguments", `不是文件:${path}`);
198
+ throw imageError(`Not a file: ${path}`, { reason: "not_file", path });
168
199
  const limit = options.maxBase64Bytes ?? DEFAULT_IMAGE_BASE64_LIMIT;
169
- if (info.size > MAX_IMAGE_FILE_BYTES)
170
- throw new AmaError("invalid_arguments", `图片超过 ${formatMb(limit)} 上限(按 base64 后计算):${path}(${formatMb(base64Size(info.size))})`);
200
+ if (info.size > MAX_IMAGE_FILE_BYTES) {
201
+ const limitMb = formatMb(limit);
202
+ const sizeMb = formatMb(base64Size(info.size));
203
+ throw imageError(`Image exceeds the ${limitMb} limit (base64): ${path} (${sizeMb})`, {
204
+ reason: "too_large",
205
+ path,
206
+ limitMb,
207
+ sizeMb,
208
+ });
209
+ }
171
210
  const buf = await readFile(path);
172
211
  const mimeType = sniffImageMime(buf) ?? imageMimeFromPath(path);
173
212
  if (mimeType === undefined)
174
- throw new AmaError("invalid_arguments", `不是支持的图片(PNG / JPEG / GIF / WebP):${path}`);
213
+ throw imageError(`Unsupported image (PNG / JPEG / GIF / WebP): ${path}`, {
214
+ reason: "unsupported",
215
+ path,
216
+ });
175
217
  const fit = await fitImage(buf, mimeType, options, path);
176
218
  if (!fit.ok)
177
219
  throw fitError(path, fit, limit, buf.length, options.resize === "off");
@@ -61,13 +61,26 @@ export declare function codemodeCallableFilter(config: Pick<AmaConfig, "tools">)
61
61
  * 返回去重后的名字(保持首次出现顺序)。
62
62
  */
63
63
  export declare function applyToolAdjustments(base: readonly string[], adjustments: readonly string[] | undefined): string[];
64
+ /**
65
+ * [W6-I3] 预设解析的警告(给人看):本模块在模型侧目录里、不 import i18n,返回结构,
66
+ * 由调用方经 `msg().session.codemode.presetWarning()` 渲染。
67
+ */
68
+ export type PresetWarning = {
69
+ kind: "codemode_only_fallback";
70
+ } | {
71
+ kind: "codemode_unavailable";
72
+ mode: CodemodeMode;
73
+ } | {
74
+ kind: "unknown_tool";
75
+ name: string;
76
+ };
64
77
  export interface PresetResolution {
65
78
  /** 生效的预设(codemode 工具缺失时回退为 default)。 */
66
79
  preset: ToolsPreset;
67
80
  codemode: CodemodeMode;
68
81
  /** 活动的内置工具名(按名排序)。 */
69
82
  builtin: string[];
70
- warnings: string[];
83
+ warnings: PresetWarning[];
71
84
  }
72
85
  export declare function resolvePreset(input: {
73
86
  config: Pick<AmaConfig, "tools" | "codemode">;
@@ -104,8 +104,8 @@ export function resolvePreset(input) {
104
104
  }
105
105
  if (codemode !== "off" && !input.available(CODEMODE_TOOL)) {
106
106
  warnings.push(preset === "codemode-only"
107
- ? "工具预设 codemode-only 需要 codemode 工具(不可用),已回退到 default"
108
- : `codemode.mode ${codemode} 需要 codemode 工具(不可用),已忽略`);
107
+ ? { kind: "codemode_only_fallback" }
108
+ : { kind: "codemode_unavailable", mode: codemode });
109
109
  if (preset === "codemode-only")
110
110
  preset = "default";
111
111
  codemode = "off";
@@ -124,7 +124,7 @@ export function resolvePreset(input) {
124
124
  if (input.available(name))
125
125
  names.push(name);
126
126
  else
127
- warnings.push(`tools.default:未知工具 ${name},已忽略`);
127
+ warnings.push({ kind: "unknown_tool", name });
128
128
  }
129
129
  return { preset, codemode, builtin: names.sort(), warnings };
130
130
  }
@@ -49,7 +49,7 @@ export function validateToolDefinition(tool) {
49
49
  if (typeof tool.name !== "string" || !TOOL_NAME_RE.test(tool.name)) {
50
50
  throw new AmaError("invalid_arguments", `Invalid tool name "${String(tool.name)}"`);
51
51
  }
52
- if (!["read", "write", "execute"].includes(tool.permission)) {
52
+ if (!["read", "write", "execute", "memory"].includes(tool.permission)) {
53
53
  throw new AmaError("invalid_arguments", `Tool ${tool.name}: invalid permission`);
54
54
  }
55
55
  if (typeof tool.execute !== "function") {
@@ -45,7 +45,7 @@ export interface MiddleTruncation {
45
45
  }
46
46
  /**
47
47
  * 头 + 尾截断([W5-H2] §8.3 H5):超过 `maxChars` 时保留前 70% 与后 30%,中间换成
48
- * `marker(省略字符数)` 的文本(缺省 `[… N 字符已省略]`)。
48
+ * `marker(省略字符数)` 的文本(缺省 `[… N chars omitted]`;[W6-C0] 进模型的标记固定英文)。
49
49
  */
50
50
  export declare function truncateMiddle(text: string, maxChars: number, marker?: (omitted: number) => string): MiddleTruncation;
51
51
  /** 单行按字符截断,附省略提示。 */
@@ -155,9 +155,9 @@ function charBoundary(text, index) {
155
155
  }
156
156
  /**
157
157
  * 头 + 尾截断([W5-H2] §8.3 H5):超过 `maxChars` 时保留前 70% 与后 30%,中间换成
158
- * `marker(省略字符数)` 的文本(缺省 `[… N 字符已省略]`)。
158
+ * `marker(省略字符数)` 的文本(缺省 `[… N chars omitted]`;[W6-C0] 进模型的标记固定英文)。
159
159
  */
160
- export function truncateMiddle(text, maxChars, marker = (omitted) => `[… ${omitted} 字符已省略]`) {
160
+ export function truncateMiddle(text, maxChars, marker = (omitted) => `[… ${omitted} chars omitted]`) {
161
161
  if (text.length <= maxChars)
162
162
  return { content: text, omitted: 0 };
163
163
  const limit = Math.max(0, Math.floor(maxChars));
@@ -21,9 +21,13 @@
21
21
  import type { ContentBlock, JsonSchema, ModelRef, ModelThinkingLevel, Usage } from "../ai/types.js";
22
22
  import type { CheckpointHooks } from "../checkpoints/types.js";
23
23
  import type { PermissionMode } from "../permissions/types.js";
24
+ import type { TraceExternalTurnData } from "../trace/types.js";
24
25
  export type { JsonSchema } from "../ai/types.js";
25
26
  /** 权限管线的粗分类(§7)。 */
26
- export type ToolPermission = "read" | "write" | "execute";
27
+ /**
28
+ * [W6-C0] `memory`:记忆工具专用(`permissions/memory-class.ts`)——`view` 按 read、写命令按 execute 判定。
29
+ */
30
+ export type ToolPermission = "read" | "write" | "execute" | "memory";
27
31
  export type ToolExecutionMode = "sequential" | "parallel";
28
32
  export interface ToolAnnotations {
29
33
  readOnly?: boolean;
@@ -130,9 +134,21 @@ export type SubagentEvent = {
130
134
  type: "tool";
131
135
  toolName: string;
132
136
  status: "started" | "completed" | "failed";
137
+ /** [W6-C0] runner 内的调用 id(外部 Agent 的 tool_call id;配对 started / 结束)。 */
138
+ id?: string;
139
+ /** [W6-C0] 事件时刻(epoch ms)。 */
140
+ at?: number;
133
141
  } | {
134
142
  type: "turn";
135
143
  turn: number;
144
+ }
145
+ /**
146
+ * [W6-C0] 外部 Agent 一个回合结束时的骨架(docs/wave6-plan.md §2.2):任务注册表写成父会话的
147
+ * `ama.trace{kind:"external_turn"}`。只有种类、状态、时间与计数——不含工具标题、命令行、路径。
148
+ */
149
+ | {
150
+ type: "turn_trace";
151
+ trace: Omit<TraceExternalTurnData, "kind" | "taskId" | "agent">;
136
152
  } | {
137
153
  type: "usage";
138
154
  usage?: Usage;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * 轨迹构建器的索引与扫描状态(`build.ts` 用)。[W6-T1]
3
+ *
4
+ * 预建索引:`ama.trace` 按 assistant / toolCall / compaction / usage 条目 id,`ama.task` 按父 toolCallId(同一
5
+ * taskId 取分支上最后一条),`external_turn` 按 taskId,`context_edit{retry|overflow}` 的目标。
6
+ */
7
+ import type { Usage } from "../ai/types.js";
8
+ import type { SessionEntry } from "../session/types.js";
9
+ import { type TraceAuxData, type TraceAuxNode, type TraceCompactionData, type TraceEntryData, type TraceExternalTurnData, type TraceStepData, type TraceSubcallTiming, type TraceToolNode, type TraceToolTiming, type TraceTurnNode } from "./types.js";
10
+ /** 父会话 `ama.task` 的 customType(与 agents/task-record.ts 相同;这里不 import 运行时模块)。 */
11
+ export declare const TASK_CUSTOM_TYPE = "ama.task";
12
+ /** 父会话里一个任务的最后一条快照(`TaskInfo + parentToolCallId`)。 */
13
+ export interface TaskData {
14
+ taskId: string;
15
+ agent?: string;
16
+ runner?: string;
17
+ background?: boolean;
18
+ status?: string;
19
+ startedAt?: number;
20
+ endedAt?: number;
21
+ turns?: number;
22
+ usage?: Usage;
23
+ costUsd?: number;
24
+ parentToolCallId?: string;
25
+ sessionRef?: {
26
+ runner?: string;
27
+ sessionId?: string;
28
+ sessionFile?: string;
29
+ };
30
+ }
31
+ export interface Index {
32
+ stepByAssistant: Map<string, {
33
+ data: TraceStepData;
34
+ entryId: string;
35
+ }>;
36
+ toolTiming: Map<string, TraceToolTiming>;
37
+ subcalls: Map<string, {
38
+ data: TraceSubcallTiming;
39
+ entryId: string;
40
+ }[]>;
41
+ compactionByEntry: Map<string, {
42
+ data: TraceCompactionData;
43
+ entryId: string;
44
+ }>;
45
+ auxByUsage: Map<string, {
46
+ data: TraceAuxData;
47
+ entryId: string;
48
+ }>;
49
+ external: Map<string, {
50
+ data: TraceExternalTurnData;
51
+ entryId: string;
52
+ }[]>;
53
+ /** 父 toolCallId → taskId → 最后一条快照。 */
54
+ tasks: Map<string, Map<string, {
55
+ data: TaskData;
56
+ entryId: string;
57
+ }>>;
58
+ /** 被 context_edit{retry|overflow} 剔除的 assistant。 */
59
+ retried: Set<string>;
60
+ }
61
+ export interface ScanState {
62
+ turns: TraceTurnNode[];
63
+ aux: TraceAuxNode[];
64
+ turn: TraceTurnNode | undefined;
65
+ /** 回合开始时的模型(推算回退用)。 */
66
+ turnModel: string | undefined;
67
+ model: string | undefined;
68
+ tools: Map<string, TraceToolNode>;
69
+ /** 有 toolResult 的调用。 */
70
+ resolved: Set<string>;
71
+ /** 回合 id → 压缩 / 分支摘要等不属于 step 的用量。 */
72
+ extraUsage: Map<string, Usage[]>;
73
+ }
74
+ export declare function isObject(value: unknown): value is Record<string, unknown>;
75
+ /** ISO 时间 → epoch ms;不合法返回 undefined。 */
76
+ export declare function entryTime(entry: {
77
+ timestamp: string;
78
+ }): number | undefined;
79
+ export declare function num(value: unknown): number | undefined;
80
+ /** 是有限数字时写入 `target[key]`。 */
81
+ export declare function putNum<T extends object>(target: T, key: keyof T, value: unknown): void;
82
+ /** `ama.trace` 的 data(形状不对返回 undefined)。 */
83
+ export declare function traceData(entry: SessionEntry): TraceEntryData | undefined;
84
+ export declare function buildIndex(entries: readonly SessionEntry[]): Index;
85
+ export declare function zeroUsage(): Usage;
86
+ /** cacheRead / (input + cacheRead + cacheWrite);分母为 0 时 undefined。 */
87
+ export declare function cacheHitRatio(usage: Usage | undefined): number | undefined;
88
+ export declare function splitRef(ref: string | undefined): {
89
+ provider: string;
90
+ model: string;
91
+ };
@@ -0,0 +1,127 @@
1
+ /**
2
+ * 轨迹构建器的索引与扫描状态(`build.ts` 用)。[W6-T1]
3
+ *
4
+ * 预建索引:`ama.trace` 按 assistant / toolCall / compaction / usage 条目 id,`ama.task` 按父 toolCallId(同一
5
+ * taskId 取分支上最后一条),`external_turn` 按 taskId,`context_edit{retry|overflow}` 的目标。
6
+ */
7
+ import { TRACE_CUSTOM_TYPE, } from "./types.js";
8
+ /** 父会话 `ama.task` 的 customType(与 agents/task-record.ts 相同;这里不 import 运行时模块)。 */
9
+ export const TASK_CUSTOM_TYPE = "ama.task";
10
+ export function isObject(value) {
11
+ return typeof value === "object" && value !== null;
12
+ }
13
+ /** ISO 时间 → epoch ms;不合法返回 undefined。 */
14
+ export function entryTime(entry) {
15
+ const t = Date.parse(entry.timestamp);
16
+ return Number.isFinite(t) ? t : undefined;
17
+ }
18
+ export function num(value) {
19
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
20
+ }
21
+ /** 是有限数字时写入 `target[key]`。 */
22
+ export function putNum(target, key, value) {
23
+ const v = num(value);
24
+ if (v !== undefined)
25
+ target[key] = v;
26
+ }
27
+ /** `ama.trace` 的 data(形状不对返回 undefined)。 */
28
+ export function traceData(entry) {
29
+ if (entry.type !== "custom" || entry.customType !== TRACE_CUSTOM_TYPE)
30
+ return undefined;
31
+ const data = entry.data;
32
+ return isObject(data) && typeof data["kind"] === "string"
33
+ ? data
34
+ : undefined;
35
+ }
36
+ export function buildIndex(entries) {
37
+ const index = {
38
+ stepByAssistant: new Map(),
39
+ toolTiming: new Map(),
40
+ subcalls: new Map(),
41
+ compactionByEntry: new Map(),
42
+ auxByUsage: new Map(),
43
+ external: new Map(),
44
+ tasks: new Map(),
45
+ retried: new Set(),
46
+ };
47
+ for (const entry of entries) {
48
+ if (entry.type === "context_edit") {
49
+ if (entry.reason === "retry" || entry.reason === "overflow")
50
+ index.retried.add(entry.targetId);
51
+ continue;
52
+ }
53
+ if (entry.type === "custom" && entry.customType === TASK_CUSTOM_TYPE) {
54
+ const data = entry.data;
55
+ // 子会话自己的首条没有 status,不是父会话的快照
56
+ if (!isObject(data) || typeof data["taskId"] !== "string" || data["status"] === undefined)
57
+ continue;
58
+ const parent = typeof data["parentToolCallId"] === "string" ? data["parentToolCallId"] : "";
59
+ const byTask = index.tasks.get(parent) ?? new Map();
60
+ byTask.set(data["taskId"], { data: data, entryId: entry.id });
61
+ index.tasks.set(parent, byTask);
62
+ continue;
63
+ }
64
+ const data = traceData(entry);
65
+ if (data === undefined)
66
+ continue;
67
+ switch (data.kind) {
68
+ case "step": {
69
+ if (typeof data.assistantEntryId === "string")
70
+ index.stepByAssistant.set(data.assistantEntryId, { data, entryId: entry.id });
71
+ for (const tool of Array.isArray(data.tools) ? data.tools : []) {
72
+ if (!isObject(tool) || typeof tool.id !== "string")
73
+ continue;
74
+ const known = index.toolTiming.get(tool.id);
75
+ // 同一调用出现两次(中断兜底 + 正常)时留有结束时间的那条
76
+ if (known === undefined || (known.endedAt === undefined && tool.endedAt !== undefined))
77
+ index.toolTiming.set(tool.id, tool);
78
+ }
79
+ for (const sub of Array.isArray(data.subcalls) ? data.subcalls : []) {
80
+ if (!isObject(sub) || typeof sub.id !== "string" || typeof sub.parentId !== "string")
81
+ continue;
82
+ const list = index.subcalls.get(sub.parentId) ?? [];
83
+ if (!list.some((s) => s.data.id === sub.id))
84
+ list.push({ data: sub, entryId: entry.id });
85
+ index.subcalls.set(sub.parentId, list);
86
+ }
87
+ break;
88
+ }
89
+ case "compaction":
90
+ if (typeof data.compactionEntryId === "string")
91
+ index.compactionByEntry.set(data.compactionEntryId, { data, entryId: entry.id });
92
+ break;
93
+ case "aux":
94
+ if (typeof data.usageEntryId === "string")
95
+ index.auxByUsage.set(data.usageEntryId, { data, entryId: entry.id });
96
+ break;
97
+ case "external_turn":
98
+ if (typeof data.taskId === "string") {
99
+ const list = index.external.get(data.taskId) ?? [];
100
+ list.push({ data, entryId: entry.id });
101
+ index.external.set(data.taskId, list);
102
+ }
103
+ break;
104
+ default:
105
+ break;
106
+ }
107
+ }
108
+ return index;
109
+ }
110
+ export function zeroUsage() {
111
+ return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0 };
112
+ }
113
+ /** cacheRead / (input + cacheRead + cacheWrite);分母为 0 时 undefined。 */
114
+ export function cacheHitRatio(usage) {
115
+ if (usage === undefined)
116
+ return undefined;
117
+ const prompt = usage.input + usage.cacheRead + usage.cacheWrite;
118
+ return prompt > 0 ? usage.cacheRead / prompt : undefined;
119
+ }
120
+ export function splitRef(ref) {
121
+ if (ref === undefined)
122
+ return { provider: "", model: "" };
123
+ const at = ref.indexOf("/");
124
+ return at < 0
125
+ ? { provider: "", model: ref }
126
+ : { provider: ref.slice(0, at), model: ref.slice(at + 1) };
127
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 轨迹构建器的节点构造(`build.ts` 用):step / tool / subcall / compaction / retry_wait / subagent /
3
+ * external_turn。精确时间来自 `ama.trace`,缺失时按条目时间推算并标 `approx`。[W6-T1]
4
+ */
5
+ import type { AssistantMessage, Usage } from "../ai/types.js";
6
+ import { type Index, type ScanState, type TaskData } from "./build-index.js";
7
+ import { type TraceAuxNode, type TraceCompactionData, type TraceCompactionNode, type TraceExternalTurnData, type TraceExternalTurnNode, type TraceNodeStatus, type TraceRetryWaitData, type TraceRetryWaitNode, type TraceStepData, type TraceStepNode, type TraceSubagentNode, type TraceToolNode, type TraceTurnNode } from "./types.js";
8
+ export declare function stepStatus(message: AssistantMessage, retried: boolean, data: TraceStepData | undefined): TraceNodeStatus;
9
+ export declare function pushUsage(state: ScanState, turnId: string, usage: Usage): void;
10
+ export declare function assistantStep(entryId: string, m: AssistantMessage, at: number | undefined, turn: TraceTurnNode, state: ScanState, index: Index): TraceStepNode;
11
+ export declare function toolNode(id: string, name: string, assistantEntryId: string, step: TraceStepNode, index: Index): TraceToolNode;
12
+ export declare function compactionNode(id: string, at: number | undefined, trace: {
13
+ data: TraceCompactionData;
14
+ entryId: string;
15
+ } | undefined): TraceCompactionNode;
16
+ export declare function compactionAsAux(node: TraceCompactionNode, usage: Usage | undefined): TraceAuxNode;
17
+ export declare function retryNode(id: string, data: TraceRetryWaitData): TraceRetryWaitNode;
18
+ /** 中断兜底的 step(没有 assistant 条目):请求在途时补一个 aborted 的 step。 */
19
+ export declare function abortedRequest(entryId: string, data: TraceStepData, state: ScanState): void;
20
+ export declare function externalNodes(taskId: string, list: readonly {
21
+ data: TraceExternalTurnData;
22
+ entryId: string;
23
+ }[]): TraceExternalTurnNode[];
24
+ export declare function subagentNode(data: TaskData, entryId: string, live: boolean): TraceSubagentNode;