@armadra/agent 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +203 -304
  2. package/CHANGELOG.zh-CN.md +462 -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/discovered-cache.d.ts +48 -0
  47. package/dist/ai/providers/discovered-cache.js +102 -0
  48. package/dist/ai/providers/enrich.js +2 -7
  49. package/dist/ai/providers/model-visibility.d.ts +33 -0
  50. package/dist/ai/providers/model-visibility.js +70 -0
  51. package/dist/ai/providers/models-dev-cache.js +15 -19
  52. package/dist/ai/providers/models-dev-snapshot.js +8 -7
  53. package/dist/ai/providers/models-dev.js +5 -15
  54. package/dist/ai/providers/registry.d.ts +2 -0
  55. package/dist/ai/providers/registry.js +6 -1
  56. package/dist/ai/providers/suggest.js +2 -16
  57. package/dist/ai/types.d.ts +27 -1
  58. package/dist/auth/chatgpt/backend-client.d.ts +26 -0
  59. package/dist/auth/chatgpt/backend-client.js +74 -0
  60. package/dist/auth/chatgpt/claims.d.ts +17 -0
  61. package/dist/auth/chatgpt/claims.js +46 -0
  62. package/dist/auth/chatgpt/cli.d.ts +35 -0
  63. package/dist/auth/chatgpt/cli.js +279 -0
  64. package/dist/auth/chatgpt/doctor.d.ts +17 -0
  65. package/dist/auth/chatgpt/doctor.js +36 -0
  66. package/dist/auth/chatgpt/host-id.d.ts +7 -0
  67. package/dist/auth/chatgpt/host-id.js +26 -0
  68. package/dist/auth/chatgpt/login.d.ts +30 -0
  69. package/dist/auth/chatgpt/login.js +130 -0
  70. package/dist/auth/chatgpt/presets.d.ts +66 -0
  71. package/dist/auth/chatgpt/presets.js +120 -0
  72. package/dist/auth/chatgpt/quota-text.d.ts +13 -0
  73. package/dist/auth/chatgpt/quota-text.js +36 -0
  74. package/dist/auth/oauth/browser.d.ts +12 -0
  75. package/dist/auth/oauth/browser.js +27 -0
  76. package/dist/auth/oauth/callback-server.d.ts +47 -0
  77. package/dist/auth/oauth/callback-server.js +147 -0
  78. package/dist/auth/oauth/flows.d.ts +62 -0
  79. package/dist/auth/oauth/flows.js +113 -0
  80. package/dist/auth/oauth/jwt.d.ts +24 -0
  81. package/dist/auth/oauth/jwt.js +81 -0
  82. package/dist/auth/oauth/live.d.ts +21 -0
  83. package/dist/auth/oauth/live.js +25 -0
  84. package/dist/auth/oauth/oidc.d.ts +26 -0
  85. package/dist/auth/oauth/oidc.js +72 -0
  86. package/dist/auth/oauth/pkce.d.ts +15 -0
  87. package/dist/auth/oauth/pkce.js +20 -0
  88. package/dist/auth/oauth/refresh.d.ts +35 -0
  89. package/dist/auth/oauth/refresh.js +129 -0
  90. package/dist/auth/oauth/token-client.d.ts +33 -0
  91. package/dist/auth/oauth/token-client.js +121 -0
  92. package/dist/auth/oauth/token-store.d.ts +23 -0
  93. package/dist/auth/oauth/token-store.js +125 -0
  94. package/dist/auth/testing/fake-oauth.d.ts +73 -0
  95. package/dist/auth/testing/fake-oauth.js +271 -0
  96. package/dist/auth/testing/refresh-child.d.ts +5 -0
  97. package/dist/auth/testing/refresh-child.js +16 -0
  98. package/dist/bundle/ama.cjs +26532 -11045
  99. package/dist/checkpoints/backend.js +6 -5
  100. package/dist/checkpoints/restore.js +3 -2
  101. package/dist/checkpoints/settings.js +2 -1
  102. package/dist/checkpoints/shadow-git.js +7 -6
  103. package/dist/checkpoints/shadow-restore.js +3 -2
  104. package/dist/checkpoints/tracker.js +4 -3
  105. package/dist/cli/args.d.ts +9 -2
  106. package/dist/cli/args.js +74 -27
  107. package/dist/cli/bootstrap.js +53 -31
  108. package/dist/cli/choice-prompt.js +8 -6
  109. package/dist/cli/codemode-notice.js +2 -2
  110. package/dist/cli/compose-agents.js +2 -1
  111. package/dist/cli/compose-extensions.js +2 -0
  112. package/dist/cli/compose-memory.d.ts +53 -0
  113. package/dist/cli/compose-memory.js +127 -0
  114. package/dist/cli/compose-providers.d.ts +6 -0
  115. package/dist/cli/compose-providers.js +38 -2
  116. package/dist/cli/compose-session.d.ts +5 -0
  117. package/dist/cli/compose-session.js +27 -13
  118. package/dist/cli/compose-store.d.ts +2 -0
  119. package/dist/cli/compose-store.js +9 -5
  120. package/dist/cli/compose.d.ts +2 -0
  121. package/dist/cli/compose.js +13 -5
  122. package/dist/cli/default-model.d.ts +0 -2
  123. package/dist/cli/default-model.js +5 -8
  124. package/dist/cli/deps.d.ts +5 -1
  125. package/dist/cli/exit-codes.d.ts +1 -1
  126. package/dist/cli/exit-codes.js +7 -16
  127. package/dist/cli/from-prompt.js +3 -2
  128. package/dist/cli/help-text.d.ts +2 -1
  129. package/dist/cli/help-text.js +5 -99
  130. package/dist/cli/main.d.ts +5 -0
  131. package/dist/cli/main.js +21 -2
  132. package/dist/cli/proxy.js +14 -9
  133. package/dist/cli/runtime.d.ts +5 -0
  134. package/dist/cli/startup-screen.js +20 -27
  135. package/dist/cli/startup-steps.js +6 -8
  136. package/dist/cli/subcommands/auth.d.ts +6 -3
  137. package/dist/cli/subcommands/auth.js +52 -22
  138. package/dist/cli/subcommands/config-set.d.ts +21 -0
  139. package/dist/cli/subcommands/config-set.js +145 -0
  140. package/dist/cli/subcommands/config.d.ts +2 -1
  141. package/dist/cli/subcommands/config.js +51 -37
  142. package/dist/cli/subcommands/doctor.d.ts +2 -1
  143. package/dist/cli/subcommands/doctor.js +97 -58
  144. package/dist/cli/subcommands/init.d.ts +1 -1
  145. package/dist/cli/subcommands/init.js +8 -7
  146. package/dist/cli/subcommands/memory.d.ts +18 -0
  147. package/dist/cli/subcommands/memory.js +189 -0
  148. package/dist/cli/subcommands/model-meta.js +11 -9
  149. package/dist/cli/subcommands/models-cache-probe.js +23 -20
  150. package/dist/cli/subcommands/models-discover.d.ts +4 -0
  151. package/dist/cli/subcommands/models-discover.js +60 -21
  152. package/dist/cli/subcommands/models-enable.d.ts +13 -0
  153. package/dist/cli/subcommands/models-enable.js +145 -0
  154. package/dist/cli/subcommands/models.d.ts +3 -1
  155. package/dist/cli/subcommands/models.js +39 -24
  156. package/dist/cli/subcommands/probe-runner.js +8 -7
  157. package/dist/cli/subcommands/providers-list.js +32 -21
  158. package/dist/cli/subcommands/providers-plan.js +24 -25
  159. package/dist/cli/subcommands/providers-probe.js +5 -6
  160. package/dist/cli/subcommands/providers.d.ts +1 -1
  161. package/dist/cli/subcommands/providers.js +45 -50
  162. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  163. package/dist/cli/subcommands/sessions-export.js +10 -9
  164. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  165. package/dist/cli/subcommands/sessions-search.js +11 -10
  166. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  167. package/dist/cli/subcommands/sessions-trace.js +156 -0
  168. package/dist/cli/subcommands/sessions.d.ts +4 -3
  169. package/dist/cli/subcommands/sessions.js +40 -37
  170. package/dist/cli/subcommands/stats.d.ts +1 -1
  171. package/dist/cli/subcommands/stats.js +49 -30
  172. package/dist/cli/system-prompt-arg.js +3 -2
  173. package/dist/codemode/capability.js +3 -2
  174. package/dist/compaction/post-compact.d.ts +1 -0
  175. package/dist/compaction/post-compact.js +15 -1
  176. package/dist/compaction/prune-tier.d.ts +1 -1
  177. package/dist/compaction/prune-tier.js +3 -3
  178. package/dist/compaction/serialize.js +2 -1
  179. package/dist/config/auth-file.d.ts +12 -2
  180. package/dist/config/auth-file.js +32 -10
  181. package/dist/config/checker.js +12 -11
  182. package/dist/config/context-files.js +3 -2
  183. package/dist/config/edit.d.ts +106 -0
  184. package/dist/config/edit.js +350 -0
  185. package/dist/config/init.d.ts +4 -3
  186. package/dist/config/init.js +10 -18
  187. package/dist/config/json-schema.d.ts +2 -1
  188. package/dist/config/json-schema.js +102 -69
  189. package/dist/config/key-docs.d.ts +18 -7
  190. package/dist/config/key-docs.js +43 -128
  191. package/dist/config/load.js +7 -6
  192. package/dist/config/merge.d.ts +4 -1
  193. package/dist/config/merge.js +42 -22
  194. package/dist/config/paths.js +6 -5
  195. package/dist/config/profile.d.ts +5 -1
  196. package/dist/config/profile.js +7 -2
  197. package/dist/config/schema-w5.js +12 -4
  198. package/dist/config/schema-w6.d.ts +19 -0
  199. package/dist/config/schema-w6.js +115 -0
  200. package/dist/config/schema.js +34 -20
  201. package/dist/config/settings-registry.d.ts +81 -0
  202. package/dist/config/settings-registry.js +185 -0
  203. package/dist/config/types-w5.d.ts +7 -0
  204. package/dist/config/types-w5.js +2 -0
  205. package/dist/config/types-w6.d.ts +109 -0
  206. package/dist/config/types-w6.js +19 -0
  207. package/dist/config/types.d.ts +11 -8
  208. package/dist/config/types.js +1 -0
  209. package/dist/drivers/acp/client.js +1 -1
  210. package/dist/drivers/acp/driver.js +13 -8
  211. package/dist/drivers/agents.js +4 -3
  212. package/dist/drivers/base.js +3 -2
  213. package/dist/drivers/host-runners.js +2 -1
  214. package/dist/drivers/native/claude-stream.js +12 -11
  215. package/dist/drivers/native/codex-app-server.js +17 -12
  216. package/dist/drivers/native/oneshot.js +8 -7
  217. package/dist/drivers/pool.js +1 -1
  218. package/dist/drivers/runner.d.ts +3 -1
  219. package/dist/drivers/runner.js +68 -20
  220. package/dist/drivers/turn.js +1 -1
  221. package/dist/hooks/config.js +3 -2
  222. package/dist/hooks/protocol.js +18 -12
  223. package/dist/host/api-impl.js +11 -10
  224. package/dist/host/loader.js +9 -8
  225. package/dist/host/types.d.ts +3 -0
  226. package/dist/i18n/catalog.d.ts +2209 -0
  227. package/dist/i18n/catalog.js +72 -0
  228. package/dist/i18n/format.d.ts +21 -0
  229. package/dist/i18n/format.js +58 -0
  230. package/dist/i18n/index.d.ts +58 -0
  231. package/dist/i18n/index.js +72 -0
  232. package/dist/i18n/messages/agents.d.ts +84 -0
  233. package/dist/i18n/messages/agents.js +85 -0
  234. package/dist/i18n/messages/approval.d.ts +99 -0
  235. package/dist/i18n/messages/approval.js +100 -0
  236. package/dist/i18n/messages/auth.d.ts +189 -0
  237. package/dist/i18n/messages/auth.js +201 -0
  238. package/dist/i18n/messages/cli-args.d.ts +46 -0
  239. package/dist/i18n/messages/cli-args.js +46 -0
  240. package/dist/i18n/messages/cli-help.d.ts +12 -0
  241. package/dist/i18n/messages/cli-help.js +248 -0
  242. package/dist/i18n/messages/cli.d.ts +336 -0
  243. package/dist/i18n/messages/cli.js +311 -0
  244. package/dist/i18n/messages/config-keys.d.ts +293 -0
  245. package/dist/i18n/messages/config-keys.js +296 -0
  246. package/dist/i18n/messages/config.d.ts +508 -0
  247. package/dist/i18n/messages/config.js +241 -0
  248. package/dist/i18n/messages/drivers.d.ts +123 -0
  249. package/dist/i18n/messages/drivers.js +124 -0
  250. package/dist/i18n/messages/errors.d.ts +83 -0
  251. package/dist/i18n/messages/errors.js +171 -0
  252. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  253. package/dist/i18n/messages/interactive-line.js +69 -0
  254. package/dist/i18n/messages/interactive-startup.d.ts +99 -0
  255. package/dist/i18n/messages/interactive-startup.js +100 -0
  256. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  257. package/dist/i18n/messages/interactive-view.js +141 -0
  258. package/dist/i18n/messages/interactive.d.ts +489 -0
  259. package/dist/i18n/messages/interactive.js +248 -0
  260. package/dist/i18n/messages/memory.d.ts +123 -0
  261. package/dist/i18n/messages/memory.js +128 -0
  262. package/dist/i18n/messages/panels.d.ts +233 -0
  263. package/dist/i18n/messages/panels.js +232 -0
  264. package/dist/i18n/messages/permissions.d.ts +126 -0
  265. package/dist/i18n/messages/permissions.js +151 -0
  266. package/dist/i18n/messages/plan.d.ts +123 -0
  267. package/dist/i18n/messages/plan.js +124 -0
  268. package/dist/i18n/messages/print.d.ts +86 -0
  269. package/dist/i18n/messages/print.js +91 -0
  270. package/dist/i18n/messages/report.d.ts +391 -0
  271. package/dist/i18n/messages/report.js +490 -0
  272. package/dist/i18n/messages/rewind.d.ts +198 -0
  273. package/dist/i18n/messages/rewind.js +217 -0
  274. package/dist/i18n/messages/session.d.ts +230 -0
  275. package/dist/i18n/messages/session.js +258 -0
  276. package/dist/i18n/messages/settings.d.ts +355 -0
  277. package/dist/i18n/messages/settings.js +343 -0
  278. package/dist/i18n/messages/subcommands-config.d.ts +113 -0
  279. package/dist/i18n/messages/subcommands-config.js +129 -0
  280. package/dist/i18n/messages/subcommands-models.d.ts +34 -0
  281. package/dist/i18n/messages/subcommands-models.js +34 -0
  282. package/dist/i18n/messages/subcommands.d.ts +576 -0
  283. package/dist/i18n/messages/subcommands.js +477 -0
  284. package/dist/i18n/messages/trace.d.ts +243 -0
  285. package/dist/i18n/messages/trace.js +238 -0
  286. package/dist/i18n/types.d.ts +15 -0
  287. package/dist/i18n/types.js +7 -0
  288. package/dist/index.d.ts +6 -0
  289. package/dist/index.js +2 -0
  290. package/dist/memory/edit.d.ts +24 -0
  291. package/dist/memory/edit.js +63 -0
  292. package/dist/memory/frontmatter.d.ts +37 -0
  293. package/dist/memory/frontmatter.js +79 -0
  294. package/dist/memory/index.d.ts +28 -0
  295. package/dist/memory/index.js +126 -0
  296. package/dist/memory/lock.d.ts +17 -0
  297. package/dist/memory/lock.js +62 -0
  298. package/dist/memory/paths.d.ts +57 -0
  299. package/dist/memory/paths.js +175 -0
  300. package/dist/memory/report.d.ts +36 -0
  301. package/dist/memory/report.js +86 -0
  302. package/dist/memory/runtime.d.ts +42 -0
  303. package/dist/memory/runtime.js +36 -0
  304. package/dist/memory/secrets.d.ts +8 -0
  305. package/dist/memory/secrets.js +27 -0
  306. package/dist/memory/section.d.ts +28 -0
  307. package/dist/memory/section.js +59 -0
  308. package/dist/memory/store.d.ts +70 -0
  309. package/dist/memory/store.js +284 -0
  310. package/dist/memory/tool.d.ts +31 -0
  311. package/dist/memory/tool.js +94 -0
  312. package/dist/modes/acp/acp-events.js +2 -1
  313. package/dist/modes/acp/acp-server.js +13 -12
  314. package/dist/modes/commands-core.d.ts +11 -0
  315. package/dist/modes/commands-core.js +93 -62
  316. package/dist/modes/image-input.js +20 -6
  317. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  318. package/dist/modes/interactive/agent-bar.js +248 -0
  319. package/dist/modes/interactive/agent-panels.js +27 -26
  320. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  321. package/dist/modes/interactive/agent-transcript.js +191 -0
  322. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  323. package/dist/modes/interactive/agent-ui.js +180 -14
  324. package/dist/modes/interactive/agent-view.d.ts +72 -0
  325. package/dist/modes/interactive/agent-view.js +281 -0
  326. package/dist/modes/interactive/approval-dialog.js +46 -34
  327. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  328. package/dist/modes/interactive/clipboard-paste.js +9 -4
  329. package/dist/modes/interactive/commands.d.ts +22 -1
  330. package/dist/modes/interactive/commands.js +100 -49
  331. package/dist/modes/interactive/completion.js +2 -1
  332. package/dist/modes/interactive/config-panel.d.ts +70 -0
  333. package/dist/modes/interactive/config-panel.js +319 -0
  334. package/dist/modes/interactive/config-ui.d.ts +96 -0
  335. package/dist/modes/interactive/config-ui.js +397 -0
  336. package/dist/modes/interactive/confirm-dialog.js +6 -7
  337. package/dist/modes/interactive/event-notices.js +11 -9
  338. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  339. package/dist/modes/interactive/interactive-mode.js +21 -22
  340. package/dist/modes/interactive/key-dispatch.d.ts +12 -0
  341. package/dist/modes/interactive/key-dispatch.js +24 -9
  342. package/dist/modes/interactive/line/line-editor.js +2 -1
  343. package/dist/modes/interactive/line/line-mode.js +18 -7
  344. package/dist/modes/interactive/line/line-render.js +25 -24
  345. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  346. package/dist/modes/interactive/memory-panel.js +221 -0
  347. package/dist/modes/interactive/message-view.d.ts +4 -2
  348. package/dist/modes/interactive/message-view.js +42 -33
  349. package/dist/modes/interactive/model-items.d.ts +45 -0
  350. package/dist/modes/interactive/model-items.js +134 -0
  351. package/dist/modes/interactive/model-picker.d.ts +57 -0
  352. package/dist/modes/interactive/model-picker.js +191 -0
  353. package/dist/modes/interactive/panels.js +39 -31
  354. package/dist/modes/interactive/pickers.d.ts +2 -1
  355. package/dist/modes/interactive/pickers.js +10 -6
  356. package/dist/modes/interactive/plan-command.d.ts +1 -1
  357. package/dist/modes/interactive/plan-command.js +24 -27
  358. package/dist/modes/interactive/plan-dialog.js +18 -17
  359. package/dist/modes/interactive/plan-flow.js +6 -5
  360. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  361. package/dist/modes/interactive/rewind-command.js +18 -16
  362. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  363. package/dist/modes/interactive/rewind-flow.js +13 -14
  364. package/dist/modes/interactive/rewind-list.js +7 -6
  365. package/dist/modes/interactive/rewind-panel.js +40 -40
  366. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  367. package/dist/modes/interactive/rewind-text.js +48 -38
  368. package/dist/modes/interactive/run-indicator.js +15 -12
  369. package/dist/modes/interactive/session-events.js +3 -2
  370. package/dist/modes/interactive/startup-header.js +22 -23
  371. package/dist/modes/interactive/startup-ui.d.ts +3 -9
  372. package/dist/modes/interactive/startup-ui.js +44 -88
  373. package/dist/modes/interactive/status-area.d.ts +2 -0
  374. package/dist/modes/interactive/status-area.js +8 -2
  375. package/dist/modes/interactive/status-bar.js +4 -3
  376. package/dist/modes/interactive/subagent-view.js +9 -7
  377. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  378. package/dist/modes/interactive/tasks-report.js +28 -31
  379. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  380. package/dist/modes/interactive/terminal-setup.js +23 -0
  381. package/dist/modes/interactive/tool-summary.js +19 -17
  382. package/dist/modes/interactive/tool-view.js +7 -4
  383. package/dist/modes/interactive/trace-view.d.ts +89 -0
  384. package/dist/modes/interactive/trace-view.js +332 -0
  385. package/dist/modes/print/print-mode.js +14 -15
  386. package/dist/modes/rpc/commands.js +7 -3
  387. package/dist/modes/rpc/rpc-mode.js +9 -3
  388. package/dist/modes/session-report.d.ts +2 -0
  389. package/dist/modes/session-report.js +101 -105
  390. package/dist/modes/startup-ui-text.js +11 -6
  391. package/dist/permissions/bypass.d.ts +8 -10
  392. package/dist/permissions/bypass.js +19 -10
  393. package/dist/permissions/memory-class.d.ts +23 -0
  394. package/dist/permissions/memory-class.js +54 -0
  395. package/dist/permissions/modes.d.ts +3 -3
  396. package/dist/permissions/modes.js +21 -16
  397. package/dist/permissions/pipeline.d.ts +1 -1
  398. package/dist/permissions/pipeline.js +9 -2
  399. package/dist/permissions/preview.js +49 -42
  400. package/dist/permissions/rules.js +5 -2
  401. package/dist/permissions/types.d.ts +4 -0
  402. package/dist/plan/store.js +2 -1
  403. package/dist/rpc.d.ts +39 -1
  404. package/dist/rpc.js +3 -0
  405. package/dist/sandbox/bash.js +11 -8
  406. package/dist/sandbox/detect.js +14 -11
  407. package/dist/sdk.d.ts +17 -1
  408. package/dist/sdk.js +29 -7
  409. package/dist/session/export.js +31 -30
  410. package/dist/session/manager.d.ts +1 -1
  411. package/dist/session/manager.js +5 -3
  412. package/dist/session/reuse.js +5 -4
  413. package/dist/session/scan.js +3 -2
  414. package/dist/session/stats-aggregate.d.ts +3 -1
  415. package/dist/session/stats-aggregate.js +5 -1
  416. package/dist/session/stats-index.js +2 -1
  417. package/dist/session/stats-scan.d.ts +4 -1
  418. package/dist/session/stats-scan.js +6 -2
  419. package/dist/session/store.d.ts +11 -0
  420. package/dist/session/store.js +48 -1
  421. package/dist/session/types.d.ts +2 -0
  422. package/dist/skills/builtin.js +2 -1
  423. package/dist/tools/image-file.d.ts +26 -1
  424. package/dist/tools/image-file.js +55 -13
  425. package/dist/tools/presets.d.ts +14 -1
  426. package/dist/tools/presets.js +3 -3
  427. package/dist/tools/registry.js +1 -1
  428. package/dist/tools/truncate.d.ts +1 -1
  429. package/dist/tools/truncate.js +2 -2
  430. package/dist/tools/types.d.ts +17 -1
  431. package/dist/trace/build-index.d.ts +91 -0
  432. package/dist/trace/build-index.js +127 -0
  433. package/dist/trace/build-nodes.d.ts +24 -0
  434. package/dist/trace/build-nodes.js +279 -0
  435. package/dist/trace/build-util.d.ts +43 -0
  436. package/dist/trace/build-util.js +120 -0
  437. package/dist/trace/build.d.ts +82 -0
  438. package/dist/trace/build.js +382 -0
  439. package/dist/trace/detail.d.ts +35 -0
  440. package/dist/trace/detail.js +205 -0
  441. package/dist/trace/flatten.d.ts +69 -0
  442. package/dist/trace/flatten.js +173 -0
  443. package/dist/trace/format.d.ts +47 -0
  444. package/dist/trace/format.js +329 -0
  445. package/dist/trace/html-template.d.ts +19 -0
  446. package/dist/trace/html-template.js +150 -0
  447. package/dist/trace/html.d.ts +104 -0
  448. package/dist/trace/html.js +292 -0
  449. package/dist/trace/preview.d.ts +29 -0
  450. package/dist/trace/preview.js +59 -0
  451. package/dist/trace/query-session.d.ts +14 -0
  452. package/dist/trace/query-session.js +38 -0
  453. package/dist/trace/query.d.ts +55 -0
  454. package/dist/trace/query.js +188 -0
  455. package/dist/trace/session.d.ts +40 -0
  456. package/dist/trace/session.js +168 -0
  457. package/dist/trace/types.d.ts +243 -0
  458. package/dist/trace/types.js +13 -0
  459. package/dist/tui/components/editor-paste.d.ts +2 -0
  460. package/dist/tui/components/editor-paste.js +6 -3
  461. package/dist/tui/components/editor.js +2 -2
  462. package/dist/tui/components/loader.d.ts +3 -0
  463. package/dist/tui/components/loader.js +14 -0
  464. package/dist/tui/components/select-list.d.ts +2 -0
  465. package/dist/tui/components/select-list.js +7 -0
  466. package/dist/tui/components/settings-list.d.ts +61 -0
  467. package/dist/tui/components/settings-list.js +135 -0
  468. package/dist/tui/keybindings.d.ts +5 -0
  469. package/dist/tui/keybindings.js +17 -5
  470. package/dist/tui.d.ts +1 -0
  471. package/dist/tui.js +2 -0
  472. package/docs/en/host-api.md +167 -0
  473. package/docs/en/permissions.md +214 -0
  474. package/docs/en/providers.md +627 -0
  475. package/docs/en/rpc.md +361 -0
  476. package/docs/en/sessions.md +219 -0
  477. package/docs/en/tui.md +534 -0
  478. package/docs/host-api.md +18 -17
  479. package/docs/memory.md +172 -0
  480. package/docs/permissions.md +2 -2
  481. package/docs/providers.md +73 -1
  482. package/docs/rpc.md +31 -3
  483. package/docs/session-format.md +8 -2
  484. package/docs/sessions.md +29 -1
  485. package/docs/tui.md +140 -4
  486. package/package.json +8 -3
@@ -0,0 +1,219 @@
1
+ # Session stats, search, reuse, export and checkpoints
2
+
3
+ English · [简体中文](../sessions.md)
4
+
5
+ > Translated from the Chinese [docs/sessions.md](../sessions.md) as of commit `9ec9f5a`. When the two differ, the Chinese
6
+ > version is authoritative. Sample command output below is illustrative; exact wording follows the interface language.
7
+
8
+ These commands only read the session directory (`<data dir>/sessions`, changeable with `--session-dir`; the file format is in [session-format.md](../session-format.md), Chinese): no locks, no repair of half-written lines, no file changes, so sessions that are still running can be read too. By default the scope is the sessions of the **current directory**; `--all` covers everything.
9
+
10
+ ## Stats: `ama stats`
11
+
12
+ ```
13
+ ama stats [--since 7d|30d|today|YYYY-MM-DD] [--until …]
14
+ [--by day|week|month|provider|channel|model|project]
15
+ [--project <dir> | --all] [--top N] [--json] [--no-cache]
16
+ ```
17
+
18
+ ```
19
+ $ ama stats --by model
20
+ All time · project /home/me/proj · 2 sessions
21
+ Requests 9 (chat 7 · permission_classify 1 · cache_warm 1)
22
+ Turns 3 · average 23.3s
23
+ Tokens input 8.7k · output 1.7k · cache read 74.3k · cache write 0
24
+ Cache hit rate 89.5% (endpoints reporting cache 2/2; others are left out of the denominator)
25
+ Cost $0.0398 (3 more requests have no price and are not counted)
26
+ Errors / retries 0 / 0
27
+
28
+ sessions requests turns input output cache read cache write hit rate cost
29
+ anthropic/claude-sonnet-4-5 1 6 2 4.1k 731 72.3k 0 94.6% $0.0398
30
+ packy/deepseek-v4-flash 1 3 1 4.6k 980 2k 0 30.8% —
31
+
32
+ Top 5 tool calls
33
+ read 3
34
+ edit 2
35
+ …
36
+ ```
37
+
38
+ - `--since` / `--until`: `7d` is the last 7 days including today, `today` is today, dates are local dates; both ends are inclusive.
39
+ - `--by project` without `--project` covers all projects. `--json` prints the same data (plus `files`: the number of scanned / cache-hit / invalid files).
40
+
41
+ ### How the numbers are computed
42
+
43
+ | Item | How |
44
+ | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
45
+ | Requests | One per model request: assistant messages in turns count as "chat"; `usage` entries are split by `kind` (`cache_warm` warming, `permission_classify` auto classification…); usage carried by `compaction` / `branch_summary` counts under the kind of the same name. A retried failed attempt also counts as a request |
46
+ | Turns | A non-`steer` user message starts a turn that lasts until the next one; it counts only with at least one assistant message. Duration = time the last assistant message was written − time the user message was written |
47
+ | Tokens | `input` excludes the cached part (as in the session layer); cache reads / writes are listed separately |
48
+ | Cache hit rate | cacheRead / (input + cacheRead + cacheWrite), only over endpoints that **report cache usage**: a `provider/model@channel` counts once any non-zero cache read or write appears for it in the scanned range; other endpoints are left out of the denominator (consistent with the session layer's three states, so relays that do not report cache usage never drag the hit rate to 0) |
49
+ | Cost | Only requests carrying `usage.cost` (the model has a price) are summed; the number of unpriced requests is reported separately, and when nothing is priced only tokens are shown; requests billed to a subscription (ChatGPT sign-in, `usage.billing: "subscription"`) get their own "Subscription" row and are neither in the cost nor counted as unpriced |
50
+ | Tool calls | Tool call blocks in assistant messages, counted by name; calls inside codemode scripts are not expanded |
51
+ | Errors / retries | Assistant messages with `stopReason: "error"`; `context_edit{reason:"retry"}` (failed attempts removed by automatic retry) |
52
+ | Channel | The `channel` of the latest `model_change` with the same provider / model as the request |
53
+
54
+ `task` sub-sessions are separate files and count under their own cwd.
55
+
56
+ ### Performance and index
57
+
58
+ - Scanning is line by line; lines irrelevant to stats such as `toolResult`, `custom` and `label` are skipped by the leading `{"type":…,"message":{"role":…` without parsing (in lines written by ama, type is always the first key; lines written by other programs fall back to a full parse).
59
+ - A per-file summary is cached in `<data dir>/stats-index.json`, invalidated by file mtime and size; a time-zone change invalidates the whole index; a full scan also drops files that no longer exist. `--no-cache` neither reads nor writes it.
60
+ - Measured (local machine, `src/session/stats-perf.test.ts`): 1000 sessions, 67 MB (12 turns, 24 tool calls and 2 KB tool results each), about 160 ms cold and about 15 ms with the index.
61
+
62
+ ## Search: `ama sessions search`
63
+
64
+ ```
65
+ ama sessions search <keyword|/regex/flags> [--all] [--role user|assistant|tool] [--since 7d] [--limit N] [--json]
66
+ ```
67
+
68
+ ```
69
+ $ ama sessions search parser
70
+ 3f9a1c2e#1 2026-09-29 01:00 /home/me/proj user fix the parser crash on empty input
71
+ 3f9a1c2e@4 2026-09-29 01:00 /home/me/proj tool src/parser.ts:42: if (input.length === 0)
72
+ ```
73
+
74
+ - Keywords are case-insensitive; `/…/` is a JavaScript regular expression (write flags as usual, e.g. `/todo|fixme/i`).
75
+ - User text, assistant text, tool calls (`name argument-JSON`) and tool results are searched; thinking, system and custom entries are not. `--role` accepts several comma-separated values.
76
+ - Each line: the first 8 characters of the session id + a number (`#n` for user messages, usable directly with `--from`; otherwise the entry index `@k`, i.e. the k-th entry in the file), time, project, role, snippet. When stdout is a terminal and `NO_COLOR` is unset, matches are highlighted; otherwise plain text. `--json` prints one line per match.
77
+ - Newest sessions first; `--limit` defaults to 20. When the keyword contains no quotes or backslashes, raw lines are pre-filtered and non-matching lines are not parsed.
78
+
79
+ ## Reuse: `sessions show` numbers and `--from`
80
+
81
+ `ama sessions show <id>` lists the user messages at the end, numbered in file order (including steers, queued `followUp` messages and host injections, with origin and image count marked):
82
+
83
+ ```
84
+ User messages (reuse with ama --from 3f9a1c2e#<number>):
85
+ #1 2026-09-29 01:00:06 fix the parser crash on empty input
86
+ #2 2026-09-29 01:00:44 also make the error message clearer
87
+ ```
88
+
89
+ `--from <id>[#number]` uses that message as the new prompt (the last one when no number is given). It starts a new session, and you may switch models:
90
+
91
+ ```sh
92
+ ama -p --from 3f9a1c2e#1 --model packy/deepseek-v4-flash # ask the same question with another model
93
+ ama -p --from 3f9a1c2e "only change the tests, not the code" # a positional argument is appended after the original (blank line between)
94
+ ama --from 3f9a1c2e#2 # interactive UI: sent right away as the initial prompt
95
+ ```
96
+
97
+ - With `-p`, images in the original message are sent too (written to a temp directory, validated like `--image`, exit 2 when the model does not accept images; deleted after the run). Interactive / line mode carry only the text and print one line on stderr when images are present.
98
+ - A number out of range or malformed → exit 2; a missing session → exit 5. Not supported with `--mode rpc`.
99
+
100
+ ## Export: `ama sessions export`
101
+
102
+ ```
103
+ ama sessions export <id> [--format md|json|jsonl] [--output <file>] [--branch leaf|all]
104
+ ```
105
+
106
+ | Format | Contents |
107
+ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
108
+ | `md` (default) | For people: user messages (numbered), assistant text, tool calls (argument JSON cut to 500 characters) and results (cut to 2000 characters), compaction / branch summaries, model switches, and a usage table at the end; thinking and system are omitted, images become placeholders |
109
+ | `json` | `{ format: "ama.session-export", version: 1, session, branch, leafId, userMessages, usage, entries }`, where `entries` are the original entries |
110
+ | `jsonl` | A header + the selected entries, in the same shape as session files, so ama can read it back (without the `leaf` line) |
111
+
112
+ - `--branch leaf` (default) is the branch from the root to the current leaf (matching the current position in `/tree`); `all` is every entry in the file.
113
+ - `--output` writes a file (permission 0600); otherwise stdout.
114
+ - **Redaction**: before export, key / token-shaped strings are replaced with `[REDACTED]`: `sk-…`, `sk-ant-…`, `ghp_…`, `github_pat_…`, `xox?-…`, `AIza…`, `AKIA…`, `npm_…`, JWTs, `Bearer` / `Basic` credentials, PEM private key blocks, and values directly after `apiKey` / `secret` / `token` / `password` / `authorization` followed by `:` or `=`; in json / jsonl, string values under secret-looking key names are masked whole. Image base64 is kept. Detection is by shape only and cannot guarantee completeness, so review before sharing.
115
+
116
+ ## Traces: `ama sessions trace`
117
+
118
+ ```
119
+ ama sessions trace <id|file> [--html [file]] [--json] [--output <file>] [--open]
120
+ [--branch leaf|all] [--no-content] [--children] [--now <ms>]
121
+ ```
122
+
123
+ Exports a session's trace (the same tree as `/trace`, see [tui.md](tui.md) "Traces") as a **single HTML file**, for sharing or
124
+ for finding out where a reply spent its time. `<id>` may be an id prefix or the path of a session file. Read-only and lock-free;
125
+ running sessions can be exported too.
126
+
127
+ - **HTML** (default, `--html` / `--format html`): a summary at the top (turns, requests, tool calls, total time, tokens, cache
128
+ hits, ttft p50 / p90, average throughput, cost); a tree on the left (turn → request → tool → sub-call / subagent / external
129
+ agent turn) and a waterfall on the right — the horizontal axis is session time, with separate colors for waiting for the first
130
+ token, decoding, tools, subagents, retry waits and compaction / auxiliary requests; running nodes only get a start mark. Idle
131
+ time longer than 2 seconds between turns is compressed to 2 seconds (the ticks still show real time). Details below (the same
132
+ as the `/trace` detail card, including prompt, reply, argument and result previews). Search with `/` (Enter / Shift+Enter to
133
+ move between matches), jump to a turn, zoom (buttons or Ctrl + wheel), expand / collapse all, `↑↓` to select and `←→` to
134
+ collapse / expand. Light and dark follow the system. However many rows there are, only one screen of DOM is built (a virtual
135
+ list).
136
+ - **Self-contained**: styles and script are inline, nothing external is loaded, and the page carries a CSP
137
+ (`default-src 'none'`), so it opens offline; the footer records the ama version and the generation time.
138
+ - **Redaction**: the whole data set and the content are redacted with the `sessions export` rules, and content previews are
139
+ redacted once more; `<`, `>` and `&` in the data block are always escaped, so `</script>` or HTML tags in prompts or tool
140
+ output only ever show as text. Matching is by shape only — check before sharing.
141
+ - `--no-content`: keeps only structure, times and numbers (no prompts, arguments, results or error text) for sharing a
142
+ performance problem.
143
+ - `--children`: embeds previews of nodes inside ama subagent child sessions; by default only their structure and numbers are
144
+ embedded. External agents only have skeletons anyway.
145
+ - Previews are truncated per item (arguments 500, others 2000 characters) with a 4 M-character budget for the whole file; past
146
+ the budget, earlier previews are dropped and the details say so.
147
+ - `--json` (or `--format json`): JSON in the same shape as RPC `get_trace` ([rpc.md](rpc.md) "Traces"), with every turn, the
148
+ loaded child-session traces and `previews` for this session's nodes (none with `--no-content`).
149
+ - Output: `--html <file>` (taken as the value only when the name ends in `.html` / `.htm`; otherwise use `--output`) or
150
+ `--output <file>` writes a file (mode 0600), otherwise stdout. `--open` opens the written file in the system browser (a
151
+ temporary file when no file is given).
152
+ - `--now <ms>` pins the generation time in the footer: the same session with the same options gives byte-identical output.
153
+ - Sessions from before 0.6 have no timing records; times are estimated from entry timestamps (the details say "estimated") and
154
+ session files are not changed.
155
+
156
+ ## Checkpoints and file backups
157
+
158
+ Rolling back code (`/rewind`, design in [rewind-plan.md](../rewind-plan.md), Chinese) relies on checkpoints: at the start of each new turn, ama records the contents of the files changed by edit / write at that moment.
159
+
160
+ - **Storage**: backups are stored by content sha256 at `<data dir>/file-history/blobs/<first 2 chars>/<sha256>`, raw bytes, uncompressed; shared across sessions and checkpoints, so identical content is stored once. Session files only hold two kinds of `custom` entries, `ama.checkpoint` / `ama.checkpoint-track` (hashes only, never in the context). When the session directory is not in the default location (`--session-dir`, the host profile's `sessionDir`), the directory is registered in `file-history/roots.json` and scanned during cleanup as well.
161
+ - **What is tracked**: edit / write (including codemode inner calls and task sub-sessions) back up a file before writing it the first time; afterwards each new turn re-snapshots the tracked files from the current disk contents, so bash or manual changes to those files also enter the next checkpoint. Other files created or changed by bash are not tracked.
162
+ - **Cleanup**: after `ama sessions prune` finishes, it scans checkpoint references in all session files (including those still recoverable in `.trash/`) and deletes backups that are unreferenced and older than 1 day; `--dry-run` only reports. The "Directories" section of `ama doctor` shows the backup count and size.
163
+ - **Config**: `checkpoints.mode` (`tools` default / `shadow-git` / `off`; the `AMA_CHECKPOINTS` environment variable overrides; see below for `shadow-git`), `checkpoints.maxFileBytes` (default 5 MiB), `checkpoints.keep` (default 100; older checkpoints are no longer listed as rewind points). The project-level `.ama/config.json` can only set `mode` to `off` and lower `maxFileBytes`.
164
+ - **Limitations**:
165
+ - Files above `maxFileBytes`, symbolic links and non-regular files are not backed up, and rollback reports them as unrecoverable.
166
+ - On restore, targets that are symbolic links, hard links (link count > 1) or non-regular files, or whose parent directory was moved / replaced by a link, are skipped with the reason listed; when a backup was already cleaned up, `backup_missing` is reported.
167
+ - Conflict detection: a file whose current content is neither what ama last wrote nor what the latest checkpoint recorded is treated as a manual change outside the turn and skipped by default. "What ama last wrote" lives only in process memory; after resuming a session the latest checkpoint is the reference, so a file ama wrote in the previous turn with no checkpoint since then is treated as a conflict (overwriting is an option).
168
+ - git state is left alone: only HEAD is recorded, and rollback shows a hint when HEAD has changed.
169
+ - In-memory sessions (not written to disk) have no checkpoints.
170
+
171
+ ### Shadow git mode (`checkpoints.mode: "shadow-git"`)
172
+
173
+ `tools` mode only sees files touched by edit / write; shadow git additionally snapshots the whole working directory into a separate git repository at every new turn, so additions, changes, deletions and renames made by bash or by hand can be rolled back too.
174
+
175
+ - **Repository**: `<data dir>/file-history/shadow/<first 16 chars of sha256(working dir)>/`, using `--git-dir` / `--work-tree` to point at the working directory, never touching your own repository's objects, index, refs or HEAD. Sessions in the same working directory share one shadow repository (each process uses its own index file); `ama sessions prune` does not clean shadow repositories, so delete the directory when no longer needed (afterwards those checkpoints restore from the `tools` records). `ama doctor` shows the number and size of shadow repositories on the file-history line.
176
+ - **Snapshots**: at the start of a new turn, `git add -A` + `write-tree` + `commit-tree` (parent: the previous shadow commit), with the commit id recorded as the checkpoint's `shadowCommit`. The shadow repository uses a fixed identity and empty global / system config (your signing, hooks, filters and templates are not read), `core.autocrlf=false` with line-ending conversion off, so raw disk bytes are stored; `gc.auto=0`.
177
+ - **Ignores**: `.gitignore` in the working directory applies; when the working directory is inside a git repository, paths your repository ignores (parent `.gitignore` files, `info/exclude`, the global ignore file) stay out of the shadow repository too; `.git` is always excluded.
178
+ - **Restore**: the current working directory is written as a tree and compared with the target commit, so only differing files are processed; conflict and safety checks are the same as in `tools` (symbolic links, hard links, non-regular files and directories on the path replaced by links are skipped). The "known" current content = what is in the latest shadow snapshot, what ama last wrote or what the latest checkpoint recorded; anything else counts as a change outside the turn and is skipped by default. Ignored files are left alone; files changed by edit / write but not in the shadow repository (outside the working directory, ignored) restore from the `tools` records. When the target checkpoint has no shadow commit (after a downgrade, or the shadow repository was deleted) the whole restore follows `tools`.
179
+ - **Guards**: in these cases the session downgrades to `tools` with a one-time notice: `git` is not on PATH; the working directory (ignored files excluded) has more than 20 000 files (checked before the first snapshot); a single snapshot takes longer than 3 seconds (that commit is kept). It is not enabled when the working directory is the home directory or the file-system root.
180
+ - **Limitations**:
181
+ - bash changes in the latest turn enter a snapshot only when the next turn starts; rolling back before that, they cannot be told apart from manual changes and count as conflicts (overwriting is an option).
182
+ - git only records the executable bit: restore only adjusts the executable bit and keeps other permission bits; symbolic links and submodules are not restored.
183
+ - The shadow repository stores every non-ignored file, large files included (not limited by `maxFileBytes`; on restore, files above it are reported as unrecoverable); for large directories without `.gitignore`, `tools` is recommended.
184
+
185
+ ## Rewind (within a session)
186
+
187
+ `/rewind`, RPC `rewind` and SDK `session.rewind()` return to before a user message (design in [rewind-plan.md](../rewind-plan.md), Chinese):
188
+
189
+ - Rewind points are the user messages on the active path that start new turns, oldest first; steers, queued messages and messages continued by the Stop hook belong to the current turn and are not listed separately. Rewinding while running reports `busy`.
190
+ - Conversation rewind reuses the `/tree` leaf switch: the abandoned branch stays in the file and can be revisited from `/tree`; the model, thinking level and permission mode stay as they are and do not change with the rewind. The system prompt, tool table and messages before the target of the next request are byte-identical to before the rewind, so the prompt cache hits as usual.
191
+ - The "read" set is recomputed from successful read / write calls on the new path, minus files that were restored, deleted or differ from the target checkpoint; the model has to read those files again before editing them.
192
+ - For conversation-only or code-only rewinds, an `ama.rewind-note` is appended at the end before the next prompt to tell the model which files disagree with the conversation; nothing is appended for conversation + code.
193
+ - In-memory sessions and `checkpoints.mode: "off"` create no checkpoints, so only conversation rewinds are possible.
194
+ - When Esc interrupts a run before this turn produced any reply or tool call, the turn is withdrawn and the original message put back (`ui.restoreOnCancel`, default true).
195
+
196
+ ## Request details (design, not implemented)
197
+
198
+ The plan is to append `custom{customType:"ama.request"}` entries to the session (never in the context), one per model request:
199
+
200
+ ```json
201
+ {
202
+ "type": "custom",
203
+ "customType": "ama.request",
204
+ "data": {
205
+ "purpose": "turn",
206
+ "provider": "packy",
207
+ "model": "kimi-k2.5",
208
+ "channel": "messages",
209
+ "startedAt": "…",
210
+ "firstByteMs": 820,
211
+ "durationMs": 6400,
212
+ "httpStatus": 200,
213
+ "attempt": 1,
214
+ "stopReason": "toolUse"
215
+ }
216
+ }
217
+ ```
218
+
219
+ Why it is not implemented yet: the HTTP status and time to first byte are only visible in the protocol layer (`src/ai/http.ts`, the `apis/*` modules), while retries live in `agent/session-run.ts`, so recording needs to touch all of these at once, overlapping with the timeout / retry feedback changes. For now `ama stats` approximates with existing data: turn duration from write-time differences, retries from `context_edit{reason:"retry"}`, failures from `stopReason: "error"`. The implementation would add a request-finished callback next to `StreamOptions.onResponse`, letting the session layer write the fields above as a `custom` entry; once `ama stats` reads them it can show per-request duration distributions and HTTP status counts.