@armadra/agent 0.5.1 → 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 (467) hide show
  1. package/CHANGELOG.md +177 -304
  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 +25928 -11144
  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.js +8 -6
  103. package/dist/cli/codemode-notice.js +2 -2
  104. package/dist/cli/compose-agents.js +2 -1
  105. package/dist/cli/compose-extensions.js +2 -0
  106. package/dist/cli/compose-memory.d.ts +53 -0
  107. package/dist/cli/compose-memory.js +127 -0
  108. package/dist/cli/compose-providers.d.ts +5 -0
  109. package/dist/cli/compose-providers.js +32 -2
  110. package/dist/cli/compose-session.d.ts +5 -0
  111. package/dist/cli/compose-session.js +27 -13
  112. package/dist/cli/compose-store.d.ts +2 -0
  113. package/dist/cli/compose-store.js +9 -5
  114. package/dist/cli/compose.d.ts +2 -0
  115. package/dist/cli/compose.js +13 -5
  116. package/dist/cli/default-model.d.ts +0 -2
  117. package/dist/cli/default-model.js +5 -8
  118. package/dist/cli/deps.d.ts +5 -1
  119. package/dist/cli/exit-codes.d.ts +1 -1
  120. package/dist/cli/exit-codes.js +7 -16
  121. package/dist/cli/from-prompt.js +3 -2
  122. package/dist/cli/help-text.d.ts +2 -1
  123. package/dist/cli/help-text.js +5 -99
  124. package/dist/cli/main.d.ts +5 -0
  125. package/dist/cli/main.js +21 -2
  126. package/dist/cli/proxy.js +14 -9
  127. package/dist/cli/runtime.d.ts +5 -0
  128. package/dist/cli/startup-screen.js +20 -27
  129. package/dist/cli/startup-steps.js +6 -8
  130. package/dist/cli/subcommands/auth.d.ts +6 -3
  131. package/dist/cli/subcommands/auth.js +52 -22
  132. package/dist/cli/subcommands/config-set.d.ts +21 -0
  133. package/dist/cli/subcommands/config-set.js +137 -0
  134. package/dist/cli/subcommands/config.d.ts +2 -1
  135. package/dist/cli/subcommands/config.js +51 -37
  136. package/dist/cli/subcommands/doctor.d.ts +2 -1
  137. package/dist/cli/subcommands/doctor.js +97 -58
  138. package/dist/cli/subcommands/init.d.ts +1 -1
  139. package/dist/cli/subcommands/init.js +8 -7
  140. package/dist/cli/subcommands/memory.d.ts +18 -0
  141. package/dist/cli/subcommands/memory.js +189 -0
  142. package/dist/cli/subcommands/model-meta.js +11 -9
  143. package/dist/cli/subcommands/models-cache-probe.js +23 -20
  144. package/dist/cli/subcommands/models-discover.d.ts +3 -0
  145. package/dist/cli/subcommands/models-discover.js +44 -21
  146. package/dist/cli/subcommands/models.d.ts +1 -1
  147. package/dist/cli/subcommands/models.js +29 -22
  148. package/dist/cli/subcommands/probe-runner.js +8 -7
  149. package/dist/cli/subcommands/providers-list.js +32 -21
  150. package/dist/cli/subcommands/providers-plan.js +24 -25
  151. package/dist/cli/subcommands/providers-probe.js +5 -6
  152. package/dist/cli/subcommands/providers.d.ts +1 -1
  153. package/dist/cli/subcommands/providers.js +45 -50
  154. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  155. package/dist/cli/subcommands/sessions-export.js +10 -9
  156. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  157. package/dist/cli/subcommands/sessions-search.js +11 -10
  158. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  159. package/dist/cli/subcommands/sessions-trace.js +156 -0
  160. package/dist/cli/subcommands/sessions.d.ts +4 -3
  161. package/dist/cli/subcommands/sessions.js +40 -37
  162. package/dist/cli/subcommands/stats.d.ts +1 -1
  163. package/dist/cli/subcommands/stats.js +49 -30
  164. package/dist/cli/system-prompt-arg.js +3 -2
  165. package/dist/codemode/capability.js +3 -2
  166. package/dist/compaction/post-compact.d.ts +1 -0
  167. package/dist/compaction/post-compact.js +15 -1
  168. package/dist/compaction/prune-tier.d.ts +1 -1
  169. package/dist/compaction/prune-tier.js +3 -3
  170. package/dist/compaction/serialize.js +2 -1
  171. package/dist/config/auth-file.d.ts +12 -2
  172. package/dist/config/auth-file.js +32 -10
  173. package/dist/config/checker.js +12 -11
  174. package/dist/config/context-files.js +3 -2
  175. package/dist/config/edit.d.ts +106 -0
  176. package/dist/config/edit.js +350 -0
  177. package/dist/config/init.d.ts +4 -3
  178. package/dist/config/init.js +10 -18
  179. package/dist/config/json-schema.d.ts +2 -1
  180. package/dist/config/json-schema.js +101 -68
  181. package/dist/config/key-docs.d.ts +18 -7
  182. package/dist/config/key-docs.js +43 -128
  183. package/dist/config/load.js +7 -6
  184. package/dist/config/merge.d.ts +4 -1
  185. package/dist/config/merge.js +42 -22
  186. package/dist/config/paths.js +6 -5
  187. package/dist/config/profile.d.ts +5 -1
  188. package/dist/config/profile.js +7 -2
  189. package/dist/config/schema-w5.js +3 -2
  190. package/dist/config/schema-w6.d.ts +19 -0
  191. package/dist/config/schema-w6.js +115 -0
  192. package/dist/config/schema.js +34 -20
  193. package/dist/config/settings-registry.d.ts +78 -0
  194. package/dist/config/settings-registry.js +184 -0
  195. package/dist/config/types-w6.d.ts +109 -0
  196. package/dist/config/types-w6.js +19 -0
  197. package/dist/config/types.d.ts +11 -8
  198. package/dist/config/types.js +1 -0
  199. package/dist/drivers/acp/client.js +1 -1
  200. package/dist/drivers/acp/driver.js +13 -8
  201. package/dist/drivers/agents.js +4 -3
  202. package/dist/drivers/base.js +3 -2
  203. package/dist/drivers/host-runners.js +2 -1
  204. package/dist/drivers/native/claude-stream.js +12 -11
  205. package/dist/drivers/native/codex-app-server.js +17 -12
  206. package/dist/drivers/native/oneshot.js +8 -7
  207. package/dist/drivers/pool.js +1 -1
  208. package/dist/drivers/runner.d.ts +3 -1
  209. package/dist/drivers/runner.js +68 -20
  210. package/dist/drivers/turn.js +1 -1
  211. package/dist/hooks/config.js +3 -2
  212. package/dist/hooks/protocol.js +18 -12
  213. package/dist/host/api-impl.js +11 -10
  214. package/dist/host/loader.js +9 -8
  215. package/dist/host/types.d.ts +3 -0
  216. package/dist/i18n/catalog.d.ts +2169 -0
  217. package/dist/i18n/catalog.js +72 -0
  218. package/dist/i18n/format.d.ts +21 -0
  219. package/dist/i18n/format.js +58 -0
  220. package/dist/i18n/index.d.ts +58 -0
  221. package/dist/i18n/index.js +72 -0
  222. package/dist/i18n/messages/agents.d.ts +84 -0
  223. package/dist/i18n/messages/agents.js +85 -0
  224. package/dist/i18n/messages/approval.d.ts +99 -0
  225. package/dist/i18n/messages/approval.js +100 -0
  226. package/dist/i18n/messages/auth.d.ts +187 -0
  227. package/dist/i18n/messages/auth.js +189 -0
  228. package/dist/i18n/messages/cli-args.d.ts +46 -0
  229. package/dist/i18n/messages/cli-args.js +46 -0
  230. package/dist/i18n/messages/cli-help.d.ts +12 -0
  231. package/dist/i18n/messages/cli-help.js +244 -0
  232. package/dist/i18n/messages/cli.d.ts +336 -0
  233. package/dist/i18n/messages/cli.js +311 -0
  234. package/dist/i18n/messages/config-keys.d.ts +289 -0
  235. package/dist/i18n/messages/config-keys.js +292 -0
  236. package/dist/i18n/messages/config.d.ts +502 -0
  237. package/dist/i18n/messages/config.js +239 -0
  238. package/dist/i18n/messages/drivers.d.ts +123 -0
  239. package/dist/i18n/messages/drivers.js +124 -0
  240. package/dist/i18n/messages/errors.d.ts +83 -0
  241. package/dist/i18n/messages/errors.js +171 -0
  242. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  243. package/dist/i18n/messages/interactive-line.js +69 -0
  244. package/dist/i18n/messages/interactive-startup.d.ts +103 -0
  245. package/dist/i18n/messages/interactive-startup.js +104 -0
  246. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  247. package/dist/i18n/messages/interactive-view.js +141 -0
  248. package/dist/i18n/messages/interactive.d.ts +493 -0
  249. package/dist/i18n/messages/interactive.js +248 -0
  250. package/dist/i18n/messages/memory.d.ts +123 -0
  251. package/dist/i18n/messages/memory.js +128 -0
  252. package/dist/i18n/messages/panels.d.ts +190 -0
  253. package/dist/i18n/messages/panels.js +189 -0
  254. package/dist/i18n/messages/permissions.d.ts +126 -0
  255. package/dist/i18n/messages/permissions.js +151 -0
  256. package/dist/i18n/messages/plan.d.ts +123 -0
  257. package/dist/i18n/messages/plan.js +124 -0
  258. package/dist/i18n/messages/print.d.ts +86 -0
  259. package/dist/i18n/messages/print.js +91 -0
  260. package/dist/i18n/messages/report.d.ts +391 -0
  261. package/dist/i18n/messages/report.js +490 -0
  262. package/dist/i18n/messages/rewind.d.ts +198 -0
  263. package/dist/i18n/messages/rewind.js +217 -0
  264. package/dist/i18n/messages/session.d.ts +230 -0
  265. package/dist/i18n/messages/session.js +258 -0
  266. package/dist/i18n/messages/settings.d.ts +348 -0
  267. package/dist/i18n/messages/settings.js +336 -0
  268. package/dist/i18n/messages/subcommands-config.d.ts +111 -0
  269. package/dist/i18n/messages/subcommands-config.js +127 -0
  270. package/dist/i18n/messages/subcommands.d.ts +548 -0
  271. package/dist/i18n/messages/subcommands.js +474 -0
  272. package/dist/i18n/messages/trace.d.ts +243 -0
  273. package/dist/i18n/messages/trace.js +238 -0
  274. package/dist/i18n/types.d.ts +15 -0
  275. package/dist/i18n/types.js +7 -0
  276. package/dist/index.d.ts +6 -0
  277. package/dist/index.js +2 -0
  278. package/dist/memory/edit.d.ts +24 -0
  279. package/dist/memory/edit.js +63 -0
  280. package/dist/memory/frontmatter.d.ts +37 -0
  281. package/dist/memory/frontmatter.js +79 -0
  282. package/dist/memory/index.d.ts +28 -0
  283. package/dist/memory/index.js +126 -0
  284. package/dist/memory/lock.d.ts +17 -0
  285. package/dist/memory/lock.js +62 -0
  286. package/dist/memory/paths.d.ts +57 -0
  287. package/dist/memory/paths.js +175 -0
  288. package/dist/memory/report.d.ts +36 -0
  289. package/dist/memory/report.js +86 -0
  290. package/dist/memory/runtime.d.ts +42 -0
  291. package/dist/memory/runtime.js +36 -0
  292. package/dist/memory/secrets.d.ts +8 -0
  293. package/dist/memory/secrets.js +27 -0
  294. package/dist/memory/section.d.ts +28 -0
  295. package/dist/memory/section.js +59 -0
  296. package/dist/memory/store.d.ts +70 -0
  297. package/dist/memory/store.js +284 -0
  298. package/dist/memory/tool.d.ts +31 -0
  299. package/dist/memory/tool.js +94 -0
  300. package/dist/modes/acp/acp-events.js +2 -1
  301. package/dist/modes/acp/acp-server.js +13 -12
  302. package/dist/modes/commands-core.d.ts +11 -0
  303. package/dist/modes/commands-core.js +93 -62
  304. package/dist/modes/image-input.js +20 -6
  305. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  306. package/dist/modes/interactive/agent-bar.js +248 -0
  307. package/dist/modes/interactive/agent-panels.js +27 -26
  308. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  309. package/dist/modes/interactive/agent-transcript.js +191 -0
  310. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  311. package/dist/modes/interactive/agent-ui.js +180 -14
  312. package/dist/modes/interactive/agent-view.d.ts +72 -0
  313. package/dist/modes/interactive/agent-view.js +281 -0
  314. package/dist/modes/interactive/approval-dialog.js +46 -34
  315. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  316. package/dist/modes/interactive/clipboard-paste.js +9 -4
  317. package/dist/modes/interactive/commands.d.ts +19 -1
  318. package/dist/modes/interactive/commands.js +84 -40
  319. package/dist/modes/interactive/completion.js +2 -1
  320. package/dist/modes/interactive/config-panel.d.ts +70 -0
  321. package/dist/modes/interactive/config-panel.js +319 -0
  322. package/dist/modes/interactive/config-ui.d.ts +96 -0
  323. package/dist/modes/interactive/config-ui.js +397 -0
  324. package/dist/modes/interactive/confirm-dialog.js +6 -7
  325. package/dist/modes/interactive/event-notices.js +11 -9
  326. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  327. package/dist/modes/interactive/interactive-mode.js +19 -22
  328. package/dist/modes/interactive/key-dispatch.d.ts +12 -0
  329. package/dist/modes/interactive/key-dispatch.js +24 -9
  330. package/dist/modes/interactive/line/line-editor.js +2 -1
  331. package/dist/modes/interactive/line/line-mode.js +18 -7
  332. package/dist/modes/interactive/line/line-render.js +25 -24
  333. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  334. package/dist/modes/interactive/memory-panel.js +221 -0
  335. package/dist/modes/interactive/message-view.d.ts +4 -2
  336. package/dist/modes/interactive/message-view.js +42 -33
  337. package/dist/modes/interactive/panels.js +39 -31
  338. package/dist/modes/interactive/pickers.d.ts +2 -1
  339. package/dist/modes/interactive/pickers.js +10 -6
  340. package/dist/modes/interactive/plan-command.d.ts +1 -1
  341. package/dist/modes/interactive/plan-command.js +24 -27
  342. package/dist/modes/interactive/plan-dialog.js +18 -17
  343. package/dist/modes/interactive/plan-flow.js +6 -5
  344. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  345. package/dist/modes/interactive/rewind-command.js +18 -16
  346. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  347. package/dist/modes/interactive/rewind-flow.js +13 -14
  348. package/dist/modes/interactive/rewind-list.js +7 -6
  349. package/dist/modes/interactive/rewind-panel.js +40 -40
  350. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  351. package/dist/modes/interactive/rewind-text.js +48 -38
  352. package/dist/modes/interactive/run-indicator.js +15 -12
  353. package/dist/modes/interactive/session-events.js +3 -2
  354. package/dist/modes/interactive/startup-header.js +22 -23
  355. package/dist/modes/interactive/startup-ui.js +38 -30
  356. package/dist/modes/interactive/status-area.d.ts +2 -0
  357. package/dist/modes/interactive/status-area.js +8 -2
  358. package/dist/modes/interactive/status-bar.js +4 -3
  359. package/dist/modes/interactive/subagent-view.js +9 -7
  360. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  361. package/dist/modes/interactive/tasks-report.js +28 -31
  362. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  363. package/dist/modes/interactive/terminal-setup.js +23 -0
  364. package/dist/modes/interactive/tool-summary.js +19 -17
  365. package/dist/modes/interactive/tool-view.js +7 -4
  366. package/dist/modes/interactive/trace-view.d.ts +89 -0
  367. package/dist/modes/interactive/trace-view.js +332 -0
  368. package/dist/modes/print/print-mode.js +14 -15
  369. package/dist/modes/rpc/commands.js +7 -3
  370. package/dist/modes/rpc/rpc-mode.js +9 -3
  371. package/dist/modes/session-report.d.ts +2 -0
  372. package/dist/modes/session-report.js +101 -105
  373. package/dist/modes/startup-ui-text.js +11 -6
  374. package/dist/permissions/bypass.d.ts +8 -10
  375. package/dist/permissions/bypass.js +19 -10
  376. package/dist/permissions/memory-class.d.ts +23 -0
  377. package/dist/permissions/memory-class.js +54 -0
  378. package/dist/permissions/modes.d.ts +3 -3
  379. package/dist/permissions/modes.js +21 -16
  380. package/dist/permissions/pipeline.d.ts +1 -1
  381. package/dist/permissions/pipeline.js +9 -2
  382. package/dist/permissions/preview.js +49 -42
  383. package/dist/permissions/rules.js +5 -2
  384. package/dist/permissions/types.d.ts +4 -0
  385. package/dist/plan/store.js +2 -1
  386. package/dist/rpc.d.ts +39 -1
  387. package/dist/rpc.js +3 -0
  388. package/dist/sandbox/bash.js +11 -8
  389. package/dist/sandbox/detect.js +14 -11
  390. package/dist/sdk.d.ts +17 -1
  391. package/dist/sdk.js +29 -7
  392. package/dist/session/export.js +31 -30
  393. package/dist/session/manager.d.ts +1 -1
  394. package/dist/session/manager.js +5 -3
  395. package/dist/session/reuse.js +5 -4
  396. package/dist/session/scan.js +3 -2
  397. package/dist/session/stats-aggregate.d.ts +3 -1
  398. package/dist/session/stats-aggregate.js +5 -1
  399. package/dist/session/stats-index.js +2 -1
  400. package/dist/session/stats-scan.d.ts +4 -1
  401. package/dist/session/stats-scan.js +6 -2
  402. package/dist/session/store.d.ts +11 -0
  403. package/dist/session/store.js +48 -1
  404. package/dist/session/types.d.ts +2 -0
  405. package/dist/skills/builtin.js +2 -1
  406. package/dist/tools/image-file.d.ts +26 -1
  407. package/dist/tools/image-file.js +55 -13
  408. package/dist/tools/presets.d.ts +14 -1
  409. package/dist/tools/presets.js +3 -3
  410. package/dist/tools/registry.js +1 -1
  411. package/dist/tools/truncate.d.ts +1 -1
  412. package/dist/tools/truncate.js +2 -2
  413. package/dist/tools/types.d.ts +17 -1
  414. package/dist/trace/build-index.d.ts +91 -0
  415. package/dist/trace/build-index.js +127 -0
  416. package/dist/trace/build-nodes.d.ts +24 -0
  417. package/dist/trace/build-nodes.js +279 -0
  418. package/dist/trace/build-util.d.ts +43 -0
  419. package/dist/trace/build-util.js +120 -0
  420. package/dist/trace/build.d.ts +82 -0
  421. package/dist/trace/build.js +382 -0
  422. package/dist/trace/detail.d.ts +35 -0
  423. package/dist/trace/detail.js +205 -0
  424. package/dist/trace/flatten.d.ts +69 -0
  425. package/dist/trace/flatten.js +173 -0
  426. package/dist/trace/format.d.ts +47 -0
  427. package/dist/trace/format.js +329 -0
  428. package/dist/trace/html-template.d.ts +19 -0
  429. package/dist/trace/html-template.js +150 -0
  430. package/dist/trace/html.d.ts +104 -0
  431. package/dist/trace/html.js +292 -0
  432. package/dist/trace/preview.d.ts +29 -0
  433. package/dist/trace/preview.js +59 -0
  434. package/dist/trace/query-session.d.ts +14 -0
  435. package/dist/trace/query-session.js +38 -0
  436. package/dist/trace/query.d.ts +55 -0
  437. package/dist/trace/query.js +188 -0
  438. package/dist/trace/session.d.ts +40 -0
  439. package/dist/trace/session.js +168 -0
  440. package/dist/trace/types.d.ts +243 -0
  441. package/dist/trace/types.js +13 -0
  442. package/dist/tui/components/editor-paste.d.ts +2 -0
  443. package/dist/tui/components/editor-paste.js +6 -3
  444. package/dist/tui/components/editor.js +2 -2
  445. package/dist/tui/components/loader.d.ts +3 -0
  446. package/dist/tui/components/loader.js +14 -0
  447. package/dist/tui/components/settings-list.d.ts +61 -0
  448. package/dist/tui/components/settings-list.js +135 -0
  449. package/dist/tui/keybindings.d.ts +5 -0
  450. package/dist/tui/keybindings.js +17 -5
  451. package/dist/tui.d.ts +1 -0
  452. package/dist/tui.js +2 -0
  453. package/docs/en/host-api.md +167 -0
  454. package/docs/en/permissions.md +214 -0
  455. package/docs/en/providers.md +625 -0
  456. package/docs/en/rpc.md +361 -0
  457. package/docs/en/sessions.md +219 -0
  458. package/docs/en/tui.md +527 -0
  459. package/docs/host-api.md +18 -17
  460. package/docs/memory.md +172 -0
  461. package/docs/permissions.md +2 -2
  462. package/docs/providers.md +67 -1
  463. package/docs/rpc.md +31 -3
  464. package/docs/session-format.md +8 -2
  465. package/docs/sessions.md +29 -1
  466. package/docs/tui.md +132 -3
  467. package/package.json +8 -3
@@ -0,0 +1,96 @@
1
+ /**
2
+ * `/config` controller (docs/wave6-plan.md §6.3, D24-D26). [W6-S]
3
+ *
4
+ * - `open("")` shows the panel (config-panel.ts); `open("key=value")` / `open("key value")` sets one key
5
+ * in the user config without the panel (same path as `ama config set`).
6
+ * - Every change is written at once (config/edit.ts) and then applied: keys of the "now" tier go to the
7
+ * running session / view (`applySetting`), and `runtime.replaceConfig()` hands the re-merged config to
8
+ * `/new`. `defaultModel`, `thinkingLevel` and `permission.mode` also switch the current session.
9
+ * - `permission.mode: full-auto` in the user config always asks the Bypass confirmation first.
10
+ * - The first change of a cache-prefix key in a conversation that already has replies shows a notice once
11
+ * per panel; closing the panel posts one summary (`from → to (scope)`, plus restart / new-session lists).
12
+ * - `configCommand()` is the line mode `/config` (`CommandContext.extra.config`).
13
+ */
14
+ import type { AgentSession } from "../../agent/types.js";
15
+ import type { ModeContext } from "../../cli/deps.js";
16
+ import type { Runtime } from "../../cli/runtime.js";
17
+ import { type ConfigLayerInput } from "../../config/edit.js";
18
+ import type { StatusLineMode } from "../../config/types.js";
19
+ import type { CommandContext, CommandResult } from "../commands-core.js";
20
+ import type { NoticeLevel, ThinkingDisplay } from "./message-view.js";
21
+ import { type PickerHost } from "./pickers.js";
22
+ /** Where "now" settings land in the running UI (every target optional). */
23
+ export interface ConfigApplyTargets {
24
+ session(): AgentSession;
25
+ view?: {
26
+ setOptions(options: {
27
+ showThinking?: ThinkingDisplay;
28
+ markdown?: boolean;
29
+ compact?: boolean;
30
+ }): void;
31
+ };
32
+ loader?: {
33
+ setAnimation(on: boolean): void;
34
+ };
35
+ area?: {
36
+ setLayout(mode: StatusLineMode): void;
37
+ };
38
+ redraw?(): void;
39
+ }
40
+ /** Apply one "now" key to the running session / view; returns false when nothing applies. */
41
+ export declare function applySetting(key: string, value: unknown, targets: ConfigApplyTargets): Promise<boolean>;
42
+ /** Layer inputs of this process: user / project files, the profile and the command line flags. */
43
+ export declare function layerInputFor(runtime: Runtime, context: ModeContext): ConfigLayerInput;
44
+ /** `key=value` / `key value` → [key, raw]. */
45
+ export declare function splitAssignment(args: string): [string, string] | undefined;
46
+ export interface ConfigUiDeps extends PickerHost, ConfigApplyTargets {
47
+ runtime: Runtime;
48
+ context: ModeContext;
49
+ rows(): number;
50
+ notice(level: NoticeLevel, text: string): void;
51
+ render(): void;
52
+ /** Home directory for ~ in paths. */
53
+ home?: string;
54
+ }
55
+ export declare class ConfigUi {
56
+ private readonly deps;
57
+ private panel;
58
+ private handle;
59
+ private changes;
60
+ private prefixNoticeShown;
61
+ constructor(deps: ConfigUiDeps);
62
+ private input;
63
+ /** `/config [key=value]`. */
64
+ open(args: string): Promise<void>;
65
+ private close;
66
+ /** Closing summary (undefined when nothing changed). */
67
+ summary(): string | undefined;
68
+ private activate;
69
+ private pick;
70
+ private commitText;
71
+ /**
72
+ * Write one key and apply it. Errors become panel notices (or are rethrown with `rethrow`, for the
73
+ * inline editor). Returns the edit result, undefined when refused / cancelled.
74
+ */
75
+ private write;
76
+ private afterWrite;
77
+ /** `/config key=value`: user scope, no panel. */
78
+ private direct;
79
+ }
80
+ /** Line mode `/config`: no args lists the settings, `key=value` sets one (user scope). */
81
+ export declare function configCommand(runtime: Runtime, context: ModeContext): (args: string, ctx: CommandContext) => Promise<CommandResult>;
82
+ /** Wiring for interactive-mode.ts (one line there): the session follows `/new` `/resume` `/fork`. */
83
+ export declare function configUiFor(host: PickerHost & {
84
+ rows(): number;
85
+ }, parts: {
86
+ runtime: Runtime;
87
+ context: ModeContext;
88
+ view: NonNullable<ConfigApplyTargets["view"]>;
89
+ loader: NonNullable<ConfigApplyTargets["loader"]>;
90
+ area: NonNullable<ConfigApplyTargets["area"]>;
91
+ tui: {
92
+ forceFullRedraw(): void;
93
+ requestRender(): void;
94
+ };
95
+ notice(level: NoticeLevel, text: string): void;
96
+ }): ConfigUi;
@@ -0,0 +1,397 @@
1
+ /**
2
+ * `/config` controller (docs/wave6-plan.md §6.3, D24-D26). [W6-S]
3
+ *
4
+ * - `open("")` shows the panel (config-panel.ts); `open("key=value")` / `open("key value")` sets one key
5
+ * in the user config without the panel (same path as `ama config set`).
6
+ * - Every change is written at once (config/edit.ts) and then applied: keys of the "now" tier go to the
7
+ * running session / view (`applySetting`), and `runtime.replaceConfig()` hands the re-merged config to
8
+ * `/new`. `defaultModel`, `thinkingLevel` and `permission.mode` also switch the current session.
9
+ * - `permission.mode: full-auto` in the user config always asks the Bypass confirmation first.
10
+ * - The first change of a cache-prefix key in a conversation that already has replies shows a notice once
11
+ * per panel; closing the panel posts one summary (`from → to (scope)`, plus restart / new-session lists).
12
+ * - `configCommand()` is the line mode `/config` (`CommandContext.extra.config`).
13
+ */
14
+ import { AgentSessionImpl } from "../../agent/session.js";
15
+ import { currentSession } from "../../cli/compose-session.js";
16
+ import { hideFakeProvider } from "../../cli/fake-visibility.js";
17
+ import { tildePath } from "../../cli/startup-screen.js";
18
+ import { ConfigEditError, formatSettingValue, getConfigValue, parseValue, readSnapshot, setConfigValue, } from "../../config/edit.js";
19
+ import { loadProfile } from "../../config/profile.js";
20
+ import { settingSpec, settingsRegistry } from "../../config/settings-registry.js";
21
+ import { msg } from "../../i18n/index.js";
22
+ import { ConfigPanel, blockedReason } from "./config-panel.js";
23
+ import { bypassChoiceSpec, openChoice } from "./confirm-dialog.js";
24
+ import { modelItems, openPicker, permissionItems, thinkingItems, } from "./pickers.js";
25
+ /** Apply one "now" key to the running session / view; returns false when nothing applies. */
26
+ export async function applySetting(key, value, targets) {
27
+ const session = targets.session();
28
+ const impl = session instanceof AgentSessionImpl ? session : undefined;
29
+ switch (key) {
30
+ case "ui.markdown":
31
+ targets.view?.setOptions({ markdown: value !== false });
32
+ break;
33
+ case "ui.showThinking":
34
+ targets.view?.setOptions({ showThinking: (value ?? "collapsed") });
35
+ break;
36
+ case "ui.compact":
37
+ targets.view?.setOptions({ compact: value === true });
38
+ break;
39
+ case "ui.animation":
40
+ targets.loader?.setAnimation(value !== false);
41
+ break;
42
+ case "ui.statusLine":
43
+ targets.area?.setLayout((value ?? "full"));
44
+ break;
45
+ case "thinkingLevel":
46
+ session.setThinkingLevel((value ?? "medium"));
47
+ return true;
48
+ case "permission.mode":
49
+ session.setPermissionMode((value ?? "default"));
50
+ return true;
51
+ case "defaultModel":
52
+ if (typeof value !== "string")
53
+ return false;
54
+ await session.setModel(value);
55
+ return true;
56
+ case "compaction.enabled":
57
+ impl?.setAutoCompaction(value !== false);
58
+ return impl !== undefined;
59
+ case "retry.enabled":
60
+ impl?.setAutoRetry(value !== false);
61
+ return impl !== undefined;
62
+ case "cache.warming":
63
+ if (typeof value === "string")
64
+ impl?.cache.setWarming(value);
65
+ return impl !== undefined;
66
+ default:
67
+ return false;
68
+ }
69
+ targets.redraw?.();
70
+ return true;
71
+ }
72
+ /** Layer inputs of this process: user / project files, the profile and the command line flags. */
73
+ export function layerInputFor(runtime, context) {
74
+ const { args, io } = context;
75
+ const cli = {};
76
+ if (args.thinking !== undefined)
77
+ cli.thinkingLevel = args.thinking;
78
+ if (args.permissionMode !== undefined)
79
+ cli.permissionMode = args.permissionMode;
80
+ if (args.allow.length > 0)
81
+ cli.allow = args.allow;
82
+ if (args.deny.length > 0)
83
+ cli.deny = args.deny;
84
+ if (args.quietStartup !== undefined)
85
+ cli.quietStartup = args.quietStartup;
86
+ if (args.tuiMode !== undefined)
87
+ cli.tuiMode = args.tuiMode;
88
+ if (args.toolsPreset !== undefined)
89
+ cli.toolsPreset = args.toolsPreset;
90
+ if (args.codemode !== undefined)
91
+ cli.codemode = args.codemode;
92
+ if (args.memory !== undefined)
93
+ cli.memory = args.memory;
94
+ const input = {
95
+ configDir: runtime.paths.configDir,
96
+ cwd: runtime.paths.cwd,
97
+ env: io.env,
98
+ cli,
99
+ };
100
+ if (args.profile !== undefined) {
101
+ input.profile = { config: loadProfile(args.profile, io.cwd).config };
102
+ input.hasProfile = true;
103
+ }
104
+ return input;
105
+ }
106
+ /** `key=value` / `key value` → [key, raw]. */
107
+ export function splitAssignment(args) {
108
+ const text = args.trim();
109
+ const eq = text.indexOf("=");
110
+ const space = text.search(/\s/);
111
+ const at = eq !== -1 && (space === -1 || eq < space) ? eq : space;
112
+ if (at <= 0)
113
+ return undefined;
114
+ return [text.slice(0, at).trim(), text.slice(at + 1).trim()];
115
+ }
116
+ const PROJECT_FILE = ".ama/config.json";
117
+ const labelOf = (key) => msg().settings.labels[key] ?? key;
118
+ const hasReplies = (session) => session.messages.some((m) => m.role === "assistant");
119
+ export class ConfigUi {
120
+ deps;
121
+ panel;
122
+ handle;
123
+ changes = new Map();
124
+ prefixNoticeShown = false;
125
+ constructor(deps) {
126
+ this.deps = deps;
127
+ }
128
+ input() {
129
+ return layerInputFor(this.deps.runtime, this.deps.context);
130
+ }
131
+ /** `/config [key=value]`. */
132
+ async open(args) {
133
+ if (args.trim() !== "")
134
+ return this.direct(args);
135
+ if (this.panel !== undefined)
136
+ return;
137
+ const snapshot = readSnapshot(this.input());
138
+ const home = this.deps.home;
139
+ this.changes = new Map();
140
+ this.prefixNoticeShown = false;
141
+ const panel = new ConfigPanel(snapshot, {
142
+ theme: this.deps.theme,
143
+ ...(this.deps.keybindings !== undefined ? { keybindings: this.deps.keybindings } : {}),
144
+ rows: () => this.deps.rows(),
145
+ // project file is always <cwd>/.ama/config.json; forward slashes on every platform
146
+ paths: {
147
+ user: tildePath(snapshot.userPath, home).replace(/\\/g, "/"),
148
+ project: PROJECT_FILE,
149
+ },
150
+ embedded: this.input().hasProfile === true,
151
+ activate: (key, scope) => this.activate(key, scope),
152
+ unset: (key, scope) => this.write(key, undefined, scope).then(() => undefined),
153
+ commit: (key, text, scope) => this.commitText(key, text, scope),
154
+ close: () => this.close(),
155
+ requestRender: () => this.deps.render(),
156
+ });
157
+ this.panel = panel;
158
+ this.handle = this.deps.showOverlay(panel, { anchor: "bottom" });
159
+ this.deps.render();
160
+ }
161
+ close() {
162
+ this.handle?.hide();
163
+ this.handle = undefined;
164
+ this.panel = undefined;
165
+ const summary = this.summary();
166
+ if (summary !== undefined)
167
+ this.deps.notice("info", summary);
168
+ this.deps.render();
169
+ }
170
+ /** Closing summary (undefined when nothing changed). */
171
+ summary() {
172
+ const s = msg().settings;
173
+ const changed = [...this.changes.values()].filter((c) => c.from !== c.to);
174
+ if (changed.length === 0)
175
+ return undefined;
176
+ const lines = [s.summaryTitle];
177
+ for (const c of changed)
178
+ lines.push(` ${s.summaryLine(labelOf(c.key), c.from, c.to, s.scope[c.scope])}`);
179
+ const tier = (apply) => changed
180
+ .filter((c) => c.spec?.apply === apply)
181
+ .map((c) => labelOf(c.key))
182
+ .join(", ");
183
+ if (tier("restart") !== "")
184
+ lines.push(s.summaryRestart(tier("restart")));
185
+ if (tier("nextSession") !== "")
186
+ lines.push(s.summaryNextSession(tier("nextSession")));
187
+ return lines.join("\n");
188
+ }
189
+ async activate(key, scope) {
190
+ const panel = this.panel;
191
+ const spec = settingSpec(key);
192
+ if (panel === undefined || spec === undefined)
193
+ return;
194
+ const current = getConfigValue(readSnapshot(this.input()), key);
195
+ const blocked = blockedReason(spec, current, scope);
196
+ if (blocked !== undefined)
197
+ return panel.setNotice(blocked, "warning");
198
+ const value = current.value;
199
+ switch (spec.kind) {
200
+ case "bool":
201
+ await this.write(key, value !== true, scope);
202
+ return;
203
+ case "enum": {
204
+ const options = spec.options ?? [];
205
+ if (options.length <= 4) {
206
+ const next = options[(options.indexOf(String(value)) + 1) % options.length];
207
+ await this.write(key, next, scope);
208
+ return;
209
+ }
210
+ const picked = await this.pick(spec, value);
211
+ if (picked !== undefined)
212
+ await this.write(key, picked === "" ? undefined : picked, scope);
213
+ return;
214
+ }
215
+ case "model": {
216
+ const picked = await this.pick(spec, value);
217
+ if (picked !== undefined)
218
+ await this.write(key, picked === "" ? undefined : picked, scope);
219
+ return;
220
+ }
221
+ default:
222
+ panel.startEdit(key, value === undefined ? "" : formatSettingValue(value));
223
+ }
224
+ }
225
+ async pick(spec, value) {
226
+ const s = msg().settings;
227
+ const current = typeof value === "string" ? value : undefined;
228
+ let items;
229
+ if (spec.key === "permission.mode")
230
+ items = permissionItems((current ?? "default"));
231
+ else if (spec.key.endsWith("thinkingLevel"))
232
+ items = thinkingItems(true);
233
+ else if (spec.kind === "model")
234
+ items = [
235
+ ...(await modelItems(hideFakeProvider(this.deps.runtime.providers, this.deps.context.io.env))),
236
+ { value: "", label: s.defaultChoice },
237
+ ];
238
+ else
239
+ items = (spec.options ?? []).map((o) => ({ value: o, label: o }));
240
+ const picked = await openPicker(this.deps, {
241
+ title: s.pickTitle(labelOf(spec.key)),
242
+ items,
243
+ filterable: spec.kind === "model",
244
+ ...(current !== undefined ? { selected: current, currentValue: current } : {}),
245
+ ...(spec.key === "permission.mode" ? { stacked: true } : {}),
246
+ });
247
+ return picked?.value;
248
+ }
249
+ async commitText(key, text, scope) {
250
+ try {
251
+ await this.write(key, parseValue(key, text), scope, true);
252
+ return undefined;
253
+ }
254
+ catch (error) {
255
+ return error instanceof Error ? error.message : String(error);
256
+ }
257
+ }
258
+ /**
259
+ * Write one key and apply it. Errors become panel notices (or are rethrown with `rethrow`, for the
260
+ * inline editor). Returns the edit result, undefined when refused / cancelled.
261
+ */
262
+ async write(key, value, scope, rethrow = false) {
263
+ const s = msg().settings;
264
+ if (key === "permission.mode" && value === "full-auto" && scope === "user") {
265
+ const spec = bypassChoiceSpec(this.deps.theme);
266
+ const body = [...spec.body, this.deps.theme.fg("warning", s.bypassPersist)];
267
+ if ((await openChoice(this.deps, { ...spec, body })) !== 0)
268
+ return undefined;
269
+ }
270
+ let result;
271
+ try {
272
+ result = setConfigValue({ ...this.input(), scope, key, value });
273
+ }
274
+ catch (error) {
275
+ if (rethrow)
276
+ throw error;
277
+ const text = error instanceof Error ? error.message : String(error);
278
+ if (this.panel !== undefined)
279
+ this.panel.setNotice(text, "error");
280
+ else
281
+ this.deps.notice("error", text);
282
+ return undefined;
283
+ }
284
+ await this.afterWrite(result);
285
+ return result;
286
+ }
287
+ async afterWrite(result) {
288
+ const s = msg().settings;
289
+ const spec = settingSpec(result.key);
290
+ const from = formatSettingValue(result.before.value);
291
+ const to = formatSettingValue(result.after.value);
292
+ const previous = this.changes.get(result.key);
293
+ this.changes.set(result.key, {
294
+ key: result.key,
295
+ from: previous?.from ?? from,
296
+ to,
297
+ scope: result.scope,
298
+ spec,
299
+ });
300
+ this.deps.runtime.replaceConfig?.(result.snapshot.config);
301
+ let warning;
302
+ if (result.apply === "now" && result.before.value !== result.after.value)
303
+ await applySetting(result.key, result.after.value, this.deps).catch((error) => {
304
+ warning = error instanceof Error ? error.message : String(error);
305
+ });
306
+ if (result.overriddenBy !== undefined)
307
+ warning ??= s.stillOverridden(result.key, result.after.envName ?? result.overriddenBy);
308
+ if (result.prefixChanged && !this.prefixNoticeShown && hasReplies(this.deps.session())) {
309
+ this.prefixNoticeShown = true;
310
+ warning ??= s.prefixNotice;
311
+ }
312
+ if (this.panel !== undefined) {
313
+ this.panel.refresh(result.snapshot);
314
+ this.panel.setNotice(warning, "warning");
315
+ }
316
+ else {
317
+ const line = s.setDone(result.key, to, s.scope[result.scope]);
318
+ this.deps.notice(warning === undefined ? "info" : "warn", warning === undefined ? line : `${line}\n${warning}`);
319
+ }
320
+ this.deps.render();
321
+ }
322
+ /** `/config key=value`: user scope, no panel. */
323
+ async direct(args) {
324
+ const s = msg().settings;
325
+ const parts = splitAssignment(args);
326
+ if (parts === undefined || parts[1] === "")
327
+ return this.deps.notice("warn", s.slashUsage);
328
+ try {
329
+ const value = parseValue(parts[0], parts[1]);
330
+ await this.write(parts[0], value, "user", true);
331
+ }
332
+ catch (error) {
333
+ const text = error instanceof Error ? error.message : String(error);
334
+ this.deps.notice(error instanceof ConfigEditError ? "warn" : "error", text);
335
+ }
336
+ }
337
+ }
338
+ /** Line mode `/config`: no args lists the settings, `key=value` sets one (user scope). */
339
+ export function configCommand(runtime, context) {
340
+ return async (args, ctx) => {
341
+ const s = msg().settings;
342
+ const input = layerInputFor(runtime, context);
343
+ if (args.trim() === "") {
344
+ const snapshot = readSnapshot(input);
345
+ const lines = settingsRegistry().map((spec) => {
346
+ const value = getConfigValue(snapshot, spec.key);
347
+ return ` ${spec.key} = ${formatSettingValue(value.value)} ${value.envName ?? value.source}`;
348
+ });
349
+ return { kind: "handled", message: [s.cli.listHeader, ...lines].join("\n") };
350
+ }
351
+ const parts = splitAssignment(args);
352
+ if (parts === undefined || parts[1] === "")
353
+ return { kind: "handled", message: s.slashUsage };
354
+ try {
355
+ const value = parseValue(parts[0], parts[1]);
356
+ if (parts[0] === "permission.mode" && value === "full-auto") {
357
+ const confirmed = ctx.confirmPermissionMode === undefined
358
+ ? false
359
+ : await ctx.confirmPermissionMode("full-auto");
360
+ if (!confirmed)
361
+ return { kind: "handled", message: s.cli.needYes };
362
+ }
363
+ const result = setConfigValue({ ...input, scope: "user", key: parts[0], value });
364
+ runtime.replaceConfig?.(result.snapshot.config);
365
+ if (result.apply === "now" && result.before.value !== result.after.value)
366
+ await applySetting(result.key, result.after.value, { session: () => ctx.session() });
367
+ const lines = [s.setDone(result.key, formatSettingValue(result.after.value), s.scope.user)];
368
+ if (result.overriddenBy !== undefined)
369
+ lines.push(s.stillOverridden(result.key, result.after.envName ?? result.overriddenBy));
370
+ return { kind: "handled", message: lines.join("\n") };
371
+ }
372
+ catch (error) {
373
+ if (error instanceof ConfigEditError)
374
+ return { kind: "handled", message: error.message };
375
+ throw error;
376
+ }
377
+ };
378
+ }
379
+ /** Wiring for interactive-mode.ts (one line there): the session follows `/new` `/resume` `/fork`. */
380
+ export function configUiFor(host, parts) {
381
+ const { runtime, context, tui } = parts;
382
+ const env = context.io.env;
383
+ const home = env["HOME"] ?? env["USERPROFILE"];
384
+ return new ConfigUi({
385
+ ...host,
386
+ runtime,
387
+ context,
388
+ view: parts.view,
389
+ loader: parts.loader,
390
+ area: parts.area,
391
+ session: () => currentSession(runtime),
392
+ notice: parts.notice,
393
+ render: () => tui.requestRender(),
394
+ redraw: () => tui.forceFullRedraw(),
395
+ ...(home !== undefined ? { home } : {}),
396
+ });
397
+ }
@@ -8,7 +8,8 @@
8
8
  *
9
9
  * 用途:进入 Bypass permissions 前的确认(`confirmBypass`,permissions/bypass.ts)。
10
10
  */
11
- import { BYPASS_CHOICES, BYPASS_CONFIRM_TITLE, BYPASS_DEFAULT_CHOICE, BYPASS_RISK_LINES, } from "../../permissions/bypass.js";
11
+ import { msg } from "../../i18n/index.js";
12
+ import { BYPASS_DEFAULT_CHOICE, bypassChoices, bypassConfirmTitle, bypassRiskLines, } from "../../permissions/bypass.js";
12
13
  import { Box, defaultKeybindings, matchesKey, padToWidth, truncateToWidth, visibleWidth, wrapTextWithAnsi, } from "../../tui.js";
13
14
  /** 宽度低于它(Box 外宽)时用紧凑布局。 */
14
15
  const COMPACT_WIDTH = 56;
@@ -64,9 +65,7 @@ export class ChoiceDialog {
64
65
  const g = theme.glyphs;
65
66
  const arrows = g.arrowUp + g.arrowDown;
66
67
  const n = this.spec.options.length;
67
- lines.push(theme.fg("dim", compact
68
- ? `${arrows} Enter · 1-${n} · Esc`
69
- : `${arrows} 选择 · Enter 确认 · 1-${n} 直接选 · Esc 取消`));
68
+ lines.push(theme.fg("dim", compact ? `${arrows} Enter · 1-${n} · Esc` : msg().approval.choiceHint(arrows, n)));
70
69
  return lines.map((l) => truncateToWidth(l, width));
71
70
  }
72
71
  optionLines(width, compact) {
@@ -108,9 +107,9 @@ export function openChoice(host, spec) {
108
107
  /** Bypass 确认框的内容(缺省选中「取消」,边框 warning)。 */
109
108
  export function bypassChoiceSpec(theme) {
110
109
  return {
111
- title: BYPASS_CONFIRM_TITLE,
112
- body: BYPASS_RISK_LINES.map((line, i) => (i === 0 ? theme.fg("warning", line) : line)),
113
- options: BYPASS_CHOICES,
110
+ title: bypassConfirmTitle(),
111
+ body: bypassRiskLines().map((line, i) => (i === 0 ? theme.fg("warning", line) : line)),
112
+ options: bypassChoices(),
114
113
  selected: BYPASS_DEFAULT_CHOICE,
115
114
  borderColor: "warning",
116
115
  };
@@ -5,11 +5,12 @@
5
5
  * 合并成一条「已省略 N 张早期图片以符合请求上限」,N 按占位文本数;
6
6
  * - W5-H1:`compaction_end.error` 的「compaction did not shrink」换成中文说明(其余错误原样)。
7
7
  */
8
+ import { msg } from "../../i18n/index.js";
8
9
  import { IMAGE_OMITTED_FOR_BUDGET, IMAGE_OMITTED_TOO_LARGE, } from "../../compaction/image-budget.js";
9
10
  /** `compaction_end.error` 的显示文本。 */
10
11
  export function compactionErrorText(error) {
11
12
  if (/compaction did not shrink/i.test(error)) {
12
- return "压缩后上下文没有变小,已保留原对话(不写摘要)";
13
+ return msg().interactive.events.compactionNoShrink;
13
14
  }
14
15
  return error;
15
16
  }
@@ -43,7 +44,7 @@ export class ImageBudgetNotices {
43
44
  const n = this.pending;
44
45
  this.pending = 0;
45
46
  this.scheduled = false;
46
- this.notify(`已省略 ${n} 张早期图片以符合请求上限`);
47
+ this.notify(msg().interactive.events.imagesOmitted(n));
47
48
  });
48
49
  }
49
50
  }
@@ -54,26 +55,27 @@ export class ImageBudgetNotices {
54
55
  export const LIMIT_WARNING = "limit_reached";
55
56
  /** `limit_reached`:回合 / 费用到限(每次运行每类一次)。 */
56
57
  export function limitReachedText(event) {
58
+ const m = msg().interactive.events;
57
59
  if (event.kind === "turns")
58
- return `已到回合上限(${event.limit} 回合),本次运行停止;发新消息继续(--max-turns / limits.maxTurns)`;
59
- const spent = `$${event.value.toFixed(2)}`;
60
- return `已到费用上限 $${event.limit.toFixed(2)}(本次运行已用 ${spent}),本次运行停止;发新消息继续(--max-cost / limits.maxCostUsd)`;
60
+ return m.limitTurns(event.limit);
61
+ return m.limitCost(`$${event.limit.toFixed(2)}`, `$${event.value.toFixed(2)}`);
61
62
  }
62
63
  /** `model_fallback`:主模型失败后改用回退模型重试一次。 */
63
64
  export function modelFallbackText(event) {
64
65
  const ref = (m) => `${m.provider}/${m.id}`;
65
- return `${ref(event.from)} 不可用(${event.reason}),本次请求改用 ${ref(event.to)},回复后切回`;
66
+ return msg().interactive.events.modelFallback(ref(event.from), event.reason, ref(event.to));
66
67
  }
67
68
  /** `background_job`:后台命令启动 / 退出 / 停止。 */
68
69
  export function backgroundJobText(event) {
69
70
  const command = event.command.replace(/\s+/g, " ").trim();
70
71
  const short = command.length > 60 ? `${command.slice(0, 59)}…` : command;
72
+ const m = msg().interactive.events;
71
73
  switch (event.phase) {
72
74
  case "started":
73
- return `后台命令 ${event.jobId} 已启动:${short}`;
75
+ return m.backgroundStarted(event.jobId, short);
74
76
  case "exited":
75
- return `后台命令 ${event.jobId} 已退出(码 ${event.exitCode ?? "?"}):${short}`;
77
+ return m.backgroundExited(event.jobId, String(event.exitCode ?? "?"), short);
76
78
  case "stopped":
77
- return `后台命令 ${event.jobId} 已停止:${short}`;
79
+ return m.backgroundStopped(event.jobId, short);
78
80
  }
79
81
  }
@@ -24,7 +24,7 @@ import type { ModeContext } from "../../cli/deps.js";
24
24
  import type { Runtime } from "../../cli/runtime.js";
25
25
  import type { StatusLineMode } from "../../config/types.js";
26
26
  import type { ClipboardDeps } from "../../tools/clipboard-image.js";
27
- import { Editor, Keybindings, TUI, type Terminal, type Theme } from "../../tui.js";
27
+ import { Editor, TUI, type Keybindings, type Terminal, type Theme } from "../../tui.js";
28
28
  import { MessageView } from "./message-view.js";
29
29
  import { StatusArea } from "./status-area.js";
30
30
  import type { StatusBar } from "./status-bar.js";