@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
@@ -57,7 +57,7 @@ export declare function planDecision(input: Pick<PermissionCheckInput, "toolName
57
57
  message?: string;
58
58
  };
59
59
  export declare const UNATTENDED_MESSAGE = "This tool call requires approval, but no one is available to approve it (unattended mode).";
60
- export declare const ALLOWLIST_MESSAGE = "Not in the allowlist (\u4E0D\u5728\u5141\u8BB8\u540D\u5355): permission mode \"allowlist\" only runs read-only tools and calls matched by an allow rule, and never asks.";
60
+ export declare const ALLOWLIST_MESSAGE = "Not in the allowlist: permission mode \"allowlist\" only runs read-only tools and calls matched by an allow rule, and never asks.";
61
61
  interface SessionGrant {
62
62
  toolName: string;
63
63
  kind: "command" | "dir" | "any";
@@ -35,6 +35,7 @@
35
35
  */
36
36
  import { dirname, sep } from "node:path";
37
37
  import { isBackgroundJobQuery } from "../tools/background-jobs.js";
38
+ import { memoryEffectivePermission } from "./memory-class.js";
38
39
  import { findAllowRule, findDenyRule, inputCommand, inputPath, normalizeCommand, splitShellSegments, } from "./rules.js";
39
40
  import { collectNestedCommands, matchDangerous } from "./dangerous.js";
40
41
  import { analyzeBashForAuto, secretReferenceReason } from "./auto-safe.js";
@@ -103,7 +104,7 @@ export function planDecision(input, planBash, cwd, projectRoot = cwd) {
103
104
  return { decision: "deny", message: PLAN_MODE_MESSAGE };
104
105
  }
105
106
  export const UNATTENDED_MESSAGE = "This tool call requires approval, but no one is available to approve it (unattended mode).";
106
- export const ALLOWLIST_MESSAGE = 'Not in the allowlist (不在允许名单): permission mode "allowlist" only runs read-only tools and calls matched by an allow rule, and never asks.';
107
+ export const ALLOWLIST_MESSAGE = 'Not in the allowlist: permission mode "allowlist" only runs read-only tools and calls matched by an allow rule, and never asks.';
107
108
  /** 审计摘要:bash 取命令,带 path 的取路径,其它取工具名;单行、截断。 */
108
109
  function auditSummary(toolName, input) {
109
110
  const command = inputCommand(input);
@@ -115,6 +116,8 @@ function auditSummary(toolName, input) {
115
116
  return text.length > 80 ? `${text.slice(0, 79)}…` : text;
116
117
  }
117
118
  export function sessionGrantFor(toolName, input, cwd) {
119
+ if (toolName === "memory")
120
+ return { toolName, kind: "any", prefix: "" }; // [W6-M] 本会话允许全部写命令
118
121
  const command = inputCommand(input);
119
122
  if (command !== undefined) {
120
123
  const words = normalizeCommand(command).split(" ").slice(0, 2);
@@ -213,7 +216,11 @@ export class PermissionPipeline {
213
216
  }
214
217
  return verdict;
215
218
  }
216
- evaluate(input) {
219
+ evaluate(raw) {
220
+ // [W6-C0] 权限类 memory 按命令折成 read / execute(memory-class.ts)
221
+ const input = raw.permission === "memory"
222
+ ? { ...raw, permission: memoryEffectivePermission(raw.input) }
223
+ : raw;
217
224
  const { toolName, permission } = input;
218
225
  // ① deny
219
226
  const layers = layeredInputs(toolName, input.input);
@@ -21,6 +21,7 @@ import { normalizeToLF, splitBom } from "../tools/edit-fuzzy.js";
21
21
  import { displayPath, resolvePath } from "../tools/paths.js";
22
22
  import { collectNestedCommands, commandWords, matchDangerous, shellWords } from "./dangerous.js";
23
23
  import { splitShellSegments } from "./rules.js";
24
+ import { msg } from "../i18n/index.js";
24
25
  export const PREVIEW_MAX_ENTRIES = 2000;
25
26
  export const PREVIEW_BUDGET_MS = 200;
26
27
  /** 超过它的文件不读内容,只报大小。 */
@@ -91,9 +92,9 @@ class Collector {
91
92
  }
92
93
  finish(kind) {
93
94
  if (this.hidden > 0)
94
- this.lines.push(`… 另 ${this.hidden} 处未列出`);
95
+ this.lines.push(msg().permissions.preview.moreHidden(this.hidden));
95
96
  if (this.timedOut) {
96
- this.lines.push(`统计超时(> ${this.options.budgetMs ?? PREVIEW_BUDGET_MS} ms),实际范围可能更大`);
97
+ this.lines.push(msg().permissions.preview.timedOut(this.options.budgetMs ?? PREVIEW_BUDGET_MS));
97
98
  this.raise("warn");
98
99
  }
99
100
  const preview = { kind, lines: this.lines, severity: this.severity };
@@ -142,37 +143,38 @@ function tally(root, c) {
142
143
  }
143
144
  /** 统计一个路径:返回目标与「:」之后的说明。 */
144
145
  function inspect(abs, c) {
146
+ const m = msg().permissions.preview;
145
147
  const shown = displayPath(abs, c.root);
146
148
  const info = tryStat(abs);
147
149
  if (info === undefined)
148
- return { target: { path: shown, exists: false }, text: "不存在" };
150
+ return { target: { path: shown, exists: false }, text: m.missing };
149
151
  if (info.isSymbolicLink())
150
- return { target: { path: shown, exists: true }, text: "符号链接" };
152
+ return { target: { path: shown, exists: true }, text: m.symlink };
151
153
  if (!info.isDirectory()) {
152
154
  return {
153
155
  target: { path: shown, exists: true, bytes: info.size },
154
- text: `文件,${formatBytes(info.size)}`,
156
+ text: m.file(formatBytes(info.size)),
155
157
  };
156
158
  }
157
159
  const t = tally(abs, c);
158
160
  const target = { path: `${shown}/`, exists: true, files: t.files };
159
161
  if (t.capped)
160
- return { target, text: `目录,> ${c.maxEntries} 项` };
162
+ return { target, text: m.dirCapped(c.maxEntries) };
161
163
  target.bytes = t.bytes;
162
- const partial = c.timedOut ? "(统计未完成)" : "";
163
- return { target, text: `目录,${t.files} 个文件,${formatBytes(t.bytes)}${partial}` };
164
+ return { target, text: m.dir(t.files, formatBytes(t.bytes), c.timedOut) };
164
165
  }
165
166
  /** 一个路径参数一行;含通配 / 变量的原样显示不展开。 */
166
- function pathLine(verb, word, c, note = "") {
167
+ function pathLine(verb, word, c, note) {
168
+ const m = msg().permissions.preview;
167
169
  if (UNEXPANDED.test(word)) {
168
- c.target(`${verb} ${word}:含通配符或变量,未展开,实际范围可能更大`);
170
+ c.target(m.pathUnexpanded(verb, word));
169
171
  c.raise("warn");
170
172
  return;
171
173
  }
172
174
  const { target, text } = inspect(resolvePath(word, c.cwd), c);
173
175
  if (target.exists)
174
176
  c.raise("warn");
175
- c.target(`${verb} ${target.path}:${text}${note}`, target);
177
+ c.target(m.pathTarget(verb, target.path, text, note), target);
176
178
  }
177
179
  /** 段里的 `>` / `>>` 重定向:返回目标与去掉重定向后的文本。 */
178
180
  export function splitRedirects(segment) {
@@ -250,7 +252,7 @@ function previewSegment(segment, c) {
250
252
  for (const { word, append } of targets) {
251
253
  if (NULL_DEVICES.has(word.toLowerCase()))
252
254
  continue;
253
- pathLine(append ? "追加写入" : "覆盖写入", word, c);
255
+ pathLine(append ? "append" : "overwrite", word, c);
254
256
  }
255
257
  const argv = commandWords(rest);
256
258
  const name = basename(argv[0] ?? "");
@@ -261,20 +263,20 @@ function previewSegment(segment, c) {
261
263
  if (name === "rm" || name === "rmdir" || name === "unlink") {
262
264
  const paths = operands(argv);
263
265
  if (paths.length === 0)
264
- c.target(`${name}:路径来自管道或展开,范围未知`);
266
+ c.target(msg().permissions.preview.rmUnknown(name));
265
267
  for (const p of paths)
266
- pathLine("删除", p, c);
268
+ pathLine("delete", p, c);
267
269
  }
268
270
  else if (name === "mv") {
269
271
  const paths = operands(argv, ["-t", "-S", "--target-directory", "--suffix"]);
270
272
  const t = argv.indexOf("-t");
271
273
  const dest = t > 0 ? argv[t + 1] : paths.pop();
272
274
  for (const p of paths)
273
- pathLine("移动", p, c);
275
+ pathLine("move", p, c);
274
276
  if (dest !== undefined && paths.length > 0) {
275
277
  const info = UNEXPANDED.test(dest) ? undefined : tryStat(resolvePath(dest, c.cwd));
276
- const note = info?.isDirectory() ? "(已存在的目录,移入其中)" : "(已存在,将被覆盖)";
277
- pathLine("移到", dest, c, info === undefined ? "" : note);
278
+ const note = info?.isDirectory() ? "intoDir" : "overwritten";
279
+ pathLine("moveTo", dest, c, info === undefined ? undefined : note);
278
280
  }
279
281
  }
280
282
  else if (name === "git") {
@@ -299,7 +301,7 @@ function previewGit(argv, c) {
299
301
  !args.some((a) => a === "-n" || a === "--dry-run" || /^-[a-z]*n/.test(a))) {
300
302
  const paths = operands(args, ["-e", "--exclude"]);
301
303
  for (const p of paths.length > 0 ? paths : ["."]) {
302
- pathLine("git clean 范围", p, c, "(计数含已跟踪文件,实际只删未跟踪的)");
304
+ pathLine("gitClean", p, c, "gitCleanTracked");
303
305
  }
304
306
  // 与危险规则无关地标红:`git -C 目录 clean -f` 之类危险表认不出的写法也算
305
307
  if (args.some((a) => a === "--force" || /^-[A-Za-z]*f/.test(a)))
@@ -307,10 +309,10 @@ function previewGit(argv, c) {
307
309
  }
308
310
  else if (sub === "checkout" && args.includes("--")) {
309
311
  for (const p of args.slice(args.indexOf("--") + 1))
310
- pathLine("丢弃改动", p, c);
312
+ pathLine("discard", p, c);
311
313
  }
312
314
  else if (sub === "reset" && args.includes("--hard")) {
313
- c.lines.push("git reset --hard:丢弃工作区与暂存区的全部未提交改动");
315
+ c.lines.push(msg().permissions.preview.gitResetHard);
314
316
  c.raise("danger");
315
317
  }
316
318
  }
@@ -321,7 +323,7 @@ function previewGit(argv, c) {
321
323
  function previewBash(command, c, dangerous) {
322
324
  const hit = matchDangerous(command);
323
325
  if (hit !== undefined)
324
- c.lines.push(`危险:${hit.description}`);
326
+ c.lines.push(msg().permissions.preview.dangerous(hit.description));
325
327
  if (hit !== undefined || dangerous)
326
328
  c.raise("danger");
327
329
  const nested = collectNestedCommands(command);
@@ -336,7 +338,7 @@ function previewBash(command, c, dangerous) {
336
338
  }
337
339
  c.cwd = start;
338
340
  if (nested.tooDeep) {
339
- c.lines.push("嵌套过深,内层命令未展开");
341
+ c.lines.push(msg().permissions.preview.tooDeep);
340
342
  c.raise("warn");
341
343
  }
342
344
  }
@@ -347,55 +349,58 @@ function unread(abs, request, c, tool) {
347
349
  const readFiles = request.context?.readFiles;
348
350
  if (readFiles === undefined || readFiles.has(abs))
349
351
  return;
350
- c.lines.push(`本会话未 read 过此文件,${tool} 会被拒绝(先 read)`);
352
+ c.lines.push(msg().permissions.preview.unread(tool));
351
353
  c.raise("warn");
352
354
  }
353
355
  function previewWrite(input, request, c) {
354
356
  const abs = resolvePath(String(input["path"] ?? ""), c.cwd);
355
357
  const content = typeof input["content"] === "string" ? input["content"] : "";
356
- const next = `${countLines(content)} 行,${formatBytes(Buffer.byteLength(content, "utf8"))}`;
358
+ const m = msg().permissions.preview;
359
+ const next = m.size(countLines(content), formatBytes(Buffer.byteLength(content, "utf8")));
357
360
  const shown = displayPath(abs, c.root);
358
361
  const info = tryStat(abs, true);
359
362
  if (info === undefined) {
360
- c.target(`新建 ${shown}:${next}`, { path: shown, exists: false });
363
+ c.target(m.writeNew(shown, next), { path: shown, exists: false });
361
364
  return;
362
365
  }
363
366
  if (info.isDirectory()) {
364
- c.target(`${shown} 是目录,write 会失败`, { path: `${shown}/`, exists: true });
367
+ c.target(m.writeIsDir(shown), { path: `${shown}/`, exists: true });
365
368
  c.raise("warn");
366
369
  return;
367
370
  }
368
371
  const old = readSmall(abs, info);
369
- const before = old === undefined ? formatBytes(info.size) : `${countLines(old)} 行,${formatBytes(info.size)}`;
370
- c.target(`覆盖 ${shown}:${before} → ${next}`, { path: shown, exists: true, bytes: info.size });
372
+ const before = old === undefined ? formatBytes(info.size) : m.size(countLines(old), formatBytes(info.size));
373
+ c.target(m.writeOverwrite(shown, before, next), { path: shown, exists: true, bytes: info.size });
371
374
  unread(abs, request, c, "write");
372
375
  }
373
376
  function editFailure(message) {
377
+ const m = msg().permissions.preview;
374
378
  const many = /^(\S+) matches (\d+) times/.exec(message);
375
379
  if (many)
376
- return `${many[1]} 匹配不唯一(${many[2]} 处)`;
380
+ return m.editNotUnique(many[1], many[2]);
377
381
  const missing = /^Could not find (\S+)/.exec(message);
378
382
  if (missing)
379
- return `未找到 ${missing[1]}`;
383
+ return m.editNotFound(missing[1]);
380
384
  if (message.includes("overlap"))
381
- return "多处修改的区间重叠";
385
+ return m.editOverlap;
382
386
  if (message.includes("no change"))
383
- return "修改前后内容相同";
387
+ return m.editNoChange;
384
388
  return message;
385
389
  }
386
390
  function previewEdit(input, request, c) {
391
+ const m = msg().permissions.preview;
387
392
  const abs = resolvePath(String(input["path"] ?? ""), c.cwd);
388
393
  const shown = displayPath(abs, c.root);
389
394
  const info = tryStat(abs, true);
390
395
  if (info === undefined || !info.isFile()) {
391
- c.target(`${shown} 不存在或不是文件,edit 会失败`, { path: shown, exists: info !== undefined });
396
+ c.target(m.editMissing(shown), { path: shown, exists: info !== undefined });
392
397
  c.raise("warn");
393
398
  return;
394
399
  }
395
400
  const target = { path: shown, exists: true, bytes: info.size };
396
401
  const raw = readSmall(abs, info);
397
402
  if (raw === undefined) {
398
- c.target(`修改 ${shown}:${formatBytes(info.size)},文件过大,未干跑`, target);
403
+ c.target(m.editTooLarge(shown, formatBytes(info.size)), target);
399
404
  unread(abs, request, c, "edit");
400
405
  return;
401
406
  }
@@ -403,19 +408,18 @@ function previewEdit(input, request, c) {
403
408
  const edits = Array.isArray(input["edits"]) ? input["edits"] : [];
404
409
  try {
405
410
  const plan = planEdits(content, edits, input["replaceAll"] === true);
406
- const fuzzy = plan.fuzzy ? "(空白 / 引号归一后匹配)" : "";
407
- c.target(`修改 ${shown}:${plan.replacements} 处替换${fuzzy}`, target);
411
+ c.target(m.editPlan(shown, plan.replacements, plan.fuzzy === true), target);
408
412
  edits.slice(0, 5).forEach((e, i) => {
409
- c.lines.push(` #${i + 1} −${countLines(e.oldText)}/+${countLines(e.newText)} 行`);
413
+ c.lines.push(m.editOp(i + 1, countLines(e.oldText), countLines(e.newText)));
410
414
  });
411
415
  if (edits.length > 5)
412
- c.lines.push(` … 另 ${edits.length - 5} 处`);
413
- c.lines.push(` 共 ${countLines(content)} → ${countLines(plan.result)} 行`);
416
+ c.lines.push(m.editMore(edits.length - 5));
417
+ c.lines.push(m.editTotal(countLines(content), countLines(plan.result)));
414
418
  }
415
419
  catch (err) {
416
420
  if (!(err instanceof EditError))
417
421
  throw err;
418
- c.target(`修改 ${shown}:干跑失败——${editFailure(err.message)}`, target);
422
+ c.target(m.editDryRunFailed(shown, editFailure(err.message)), target);
419
423
  c.raise("warn");
420
424
  }
421
425
  unread(abs, request, c, "edit");
@@ -449,7 +453,7 @@ export function previewAction(request, options) {
449
453
  }
450
454
  }
451
455
  catch (err) {
452
- c.lines.push(`预览失败:${err instanceof Error ? err.message : String(err)}`);
456
+ c.lines.push(msg().permissions.preview.failed(err instanceof Error ? err.message : String(err)));
453
457
  }
454
458
  return c.finish(kind);
455
459
  }
@@ -459,5 +463,8 @@ export function previewDisplayLines(preview, max = 10) {
459
463
  return [];
460
464
  if (preview.lines.length <= max)
461
465
  return preview.lines;
462
- return [...preview.lines.slice(0, max - 1), `… 另 ${preview.lines.length - max + 1} 行`];
466
+ return [
467
+ ...preview.lines.slice(0, max - 1),
468
+ msg().permissions.preview.moreLines(preview.lines.length - max + 1),
469
+ ];
463
470
  }
@@ -18,6 +18,7 @@ import { AmaError } from "../errors.js";
18
18
  import { PERMISSION_MODES_STRICT_FIRST } from "./types.js";
19
19
  import { globBody } from "../tools/glob.js";
20
20
  import { expandHome, resolvePath, toPosix } from "../tools/paths.js";
21
+ import { memoryRuleMatches } from "./memory-class.js";
21
22
  /** 内置缺省 deny 表(用户可经 `builtinDeny` 选项移除)。 */
22
23
  export const BUILTIN_DENY_RULES = [
23
24
  "write(**/.git/**)",
@@ -147,6 +148,8 @@ function matchesSubject(rule, toolName, input, cwd, command) {
147
148
  return false;
148
149
  if (rule.pattern === undefined)
149
150
  return true;
151
+ if (toolName === "memory")
152
+ return memoryRuleMatches(rule.pattern, input); // [W6-M] 逻辑路径 / 命令名
150
153
  if (command !== undefined)
151
154
  return wildcardToRegExp(rule.pattern).test(command);
152
155
  const abs = inputPath(toolName, input, cwd);
@@ -154,7 +157,7 @@ function matchesSubject(rule, toolName, input, cwd, command) {
154
157
  }
155
158
  /** 第一条命中的 deny 规则。 */
156
159
  export function findDenyRule(rules, toolName, input, cwd) {
157
- const command = inputCommand(input);
160
+ const command = toolName === "memory" ? undefined : inputCommand(input);
158
161
  for (const rule of rules) {
159
162
  if (rule.effect !== "deny")
160
163
  continue;
@@ -172,7 +175,7 @@ export function findDenyRule(rules, toolName, input, cwd) {
172
175
  /** 覆盖本次调用的 allow 规则(复合命令返回第一段的覆盖者);不覆盖返回 undefined。 */
173
176
  export function findAllowRule(rules, toolName, input, cwd) {
174
177
  const allows = rules.filter((r) => r.effect === "allow");
175
- const command = inputCommand(input);
178
+ const command = toolName === "memory" ? undefined : inputCommand(input);
176
179
  if (command === undefined)
177
180
  return allows.find((r) => matchesSubject(r, toolName, input, cwd));
178
181
  const unconditional = allows.find((r) => r.pattern === undefined && toolNameMatches(r.tool, toolName));
@@ -79,6 +79,8 @@ export interface ApprovalRequestContext {
79
79
  * 无人值守拒绝),auto 分类器与模型都不参与;RPC `permission_request` 原样带出。
80
80
  */
81
81
  origin?: ExternalPermissionOrigin;
82
+ /** [W6-C0] 触发审批的工具调用 id(`gateToolCall` 填;轨迹据此算 `approvalMs`)。 */
83
+ toolCallId?: string;
82
84
  }
83
85
  /** [W5-C0] 外部 Agent 权限选项的种类(ACP 词汇)。 */
84
86
  export type ExternalPermissionOptionKind = "allow_once" | "allow_always" | "reject_once" | "reject_always";
@@ -109,6 +111,8 @@ export interface PermissionRequestContext {
109
111
  taskId?: string;
110
112
  /** 外部 Agent 的权限请求(对话框标 `[claude · 会话 abc1]`)。 */
111
113
  origin?: ExternalPermissionOrigin;
114
+ /** [W6-C0] 触发审批的工具调用 id(本会话的 toolCallId;外部 Agent 的请求不带)。 */
115
+ toolCallId?: string;
112
116
  }
113
117
  /** [W3-C0] 预览涉及的路径(bash 的 rm / mv / 重定向目标,write / edit 的目标文件)。 */
114
118
  export interface ActionPreviewTarget {
@@ -9,6 +9,7 @@
9
9
  import { mkdirSync, writeFileSync } from "node:fs";
10
10
  import { isAbsolute, join, relative, resolve } from "node:path";
11
11
  import { TODO_CUSTOM_TYPE, parseTodoState } from "../tools/todo.js";
12
+ import { msg } from "../i18n/index.js";
12
13
  export const PLAN_CUSTOM_TYPE = "ama.plan";
13
14
  export const PLAN_STATE_CUSTOM_TYPE = "ama.plan_state";
14
15
  function customData(entry, customType) {
@@ -76,7 +77,7 @@ export function resolvePlanDirectory(configured, projectRoot, dataDir) {
76
77
  if (rel.startsWith("..") || isAbsolute(rel)) {
77
78
  return {
78
79
  dir: fallback,
79
- warning: `plan.directory ${configured} 不在项目根 ${projectRoot} 之内,计划文件改写到 ${fallback}`,
80
+ warning: msg().session.plan.directoryOutside(configured, projectRoot, fallback),
80
81
  };
81
82
  }
82
83
  return { dir };
package/dist/rpc.d.ts CHANGED
@@ -16,6 +16,9 @@
16
16
  * get_tasks / get_agents`(返回形状见 `RpcW5Results`),客户端能力 `plans`(声明后计划审批交客户端);
17
17
  * 新事件由 `SessionEvent` 派生自动包含。命令实现归 W5-F(C0 时返回 `not_implemented`),
18
18
  * `RPC_PROTOCOL_VERSION` 不变。
19
+ * - [W6-C0] 第六波(docs/wave6-plan.md §2.6、§4.4):命令 `get_trace`(参数 `RpcGetTraceParams`、返回
20
+ * `RpcW6Results`,W6-T2 实现,之前回 `not_implemented`);事件 `quota_update`;`permission_request.context`
21
+ * 可带 `toolCallId`;`keySource` 可为 `oauth`。`RPC_PROTOCOL_VERSION` 不变。
19
22
  */
20
23
  import type { AssistantEvent, ImageBlock, ModelThinkingLevel, Usage } from "./ai/types.js";
21
24
  import type { PlanData, PlanDecisionKind, QueueMode, SessionEvent, TodoItemView } from "./agent/types.js";
@@ -23,6 +26,8 @@ import type { AgentInfo } from "./agents/types.js";
23
26
  import type { TaskInfo } from "./tools/types.js";
24
27
  import type { RewindRequest } from "./checkpoints/types.js";
25
28
  import type { ApprovalDecision, PermissionMode } from "./permissions/types.js";
29
+ import type { TracePreview } from "./trace/preview.js";
30
+ import type { Trace, TraceSubagentNode } from "./trace/types.js";
26
31
  export type { SessionEvent } from "./agent/types.js";
27
32
  export declare const RPC_PROTOCOL_VERSION: 1;
28
33
  /** `plans`(W5-C0):客户端声明后计划审批交给客户端(`plan_proposed` → `plan_response`)。 */
@@ -133,6 +138,38 @@ export interface RpcCommandMap {
133
138
  get_todos: NoParams;
134
139
  get_tasks: NoParams;
135
140
  get_agents: NoParams;
141
+ get_trace: RpcGetTraceParams;
142
+ }
143
+ /** [W6-C0] `get_trace` 的参数。 */
144
+ export interface RpcGetTraceParams {
145
+ /** 缺省 leaf。 */
146
+ branch?: "leaf" | "all";
147
+ /** 尾部优先的回合数,缺省 50,上限 500。 */
148
+ turnLimit?: number;
149
+ /** 回合游标(turn id),向前翻页。 */
150
+ before?: string;
151
+ /** 条目游标(同 `get_entries.since`):只返回从包含该条目的回合起的回合。 */
152
+ since?: string;
153
+ /** 该任务的子轨迹(ama 子会话或外部骨架)。 */
154
+ taskId?: string;
155
+ /** 缺省 none(只有结构与数字)。 */
156
+ content?: "none" | "preview";
157
+ }
158
+ /** [W6-C0] 第六波命令成功时的 `data` 形状;错误 `task_not_found` / `invalid_arguments`。 */
159
+ export interface RpcW6Results {
160
+ get_trace: {
161
+ trace: Trace;
162
+ hasMoreBefore: boolean;
163
+ cursor: {
164
+ before?: string;
165
+ since: string;
166
+ };
167
+ leafId: string | null;
168
+ /** [W6-T2] `taskId` 时:子 Agent 节点本身(不含 `child`;外部 Agent 的骨架在 `external`)。 */
169
+ task?: TraceSubagentNode;
170
+ /** [W6-T2] `content:"preview"` 时:`<kind>:<id>` → 已脱敏、已截断的正文预览(只含窗口内节点)。 */
171
+ previews?: Record<string, TracePreview>;
172
+ };
136
173
  }
137
174
  /** [W5-C0] 计划审批的回答(与 `permission_response` 同构)。 */
138
175
  export interface RpcPlanResponse {
@@ -179,7 +216,8 @@ export interface RpcModelInfo {
179
216
  name: string;
180
217
  /** 只报有无,不回密钥。 */
181
218
  hasKey: boolean;
182
- keySource: "cli" | "auth-file" | "config" | "env" | "none";
219
+ /** [W6-C0] 加 `oauth`(ChatGPT 登录,W6-O)。 */
220
+ keySource: "cli" | "auth-file" | "config" | "env" | "oauth" | "none";
183
221
  contextWindow?: number;
184
222
  maxTokens: number;
185
223
  reasoning: boolean;
package/dist/rpc.js CHANGED
@@ -16,5 +16,8 @@
16
16
  * get_tasks / get_agents`(返回形状见 `RpcW5Results`),客户端能力 `plans`(声明后计划审批交客户端);
17
17
  * 新事件由 `SessionEvent` 派生自动包含。命令实现归 W5-F(C0 时返回 `not_implemented`),
18
18
  * `RPC_PROTOCOL_VERSION` 不变。
19
+ * - [W6-C0] 第六波(docs/wave6-plan.md §2.6、§4.4):命令 `get_trace`(参数 `RpcGetTraceParams`、返回
20
+ * `RpcW6Results`,W6-T2 实现,之前回 `not_implemented`);事件 `quota_update`;`permission_request.context`
21
+ * 可带 `toolCallId`;`keySource` 可为 `oauth`。`RPC_PROTOCOL_VERSION` 不变。
19
22
  */
20
23
  export const RPC_PROTOCOL_VERSION = 1;
@@ -13,6 +13,7 @@
13
13
  import { homedir, tmpdir } from "node:os";
14
14
  import { isAbsolute, join, resolve } from "node:path";
15
15
  import { wrapCommand } from "./wrap.js";
16
+ import { msg } from "../i18n/index.js";
16
17
  export const DEFAULT_BASH_SANDBOX_MODE = "off";
17
18
  export const DEFAULT_SANDBOX_NETWORK = "deny";
18
19
  export const NO_BASH_SANDBOX = Object.freeze({
@@ -21,12 +22,16 @@ export const NO_BASH_SANDBOX = Object.freeze({
21
22
  kind: "none",
22
23
  isolatesNetwork: false,
23
24
  restrictsWrites: false,
24
- detail: "未配置",
25
+ get detail() {
26
+ return msg().session.sandbox.notConfigured;
27
+ },
25
28
  }),
26
29
  network: DEFAULT_SANDBOX_NETWORK,
27
30
  writable: [],
28
31
  hidden: [],
29
- detail: "未配置",
32
+ get detail() {
33
+ return msg().session.sandbox.notConfigured;
34
+ },
30
35
  });
31
36
  /** 用户主目录下的凭据路径(与 permissions/protected.ts 的机密路径同一批)。 */
32
37
  export const HIDDEN_HOME_PATHS = [
@@ -66,16 +71,14 @@ export function resolveBashSandbox(config, deps) {
66
71
  const active = mode === "auto" && usable && status.restrictsWrites;
67
72
  let detail;
68
73
  if (mode === "off")
69
- detail = "关闭(sandbox.bash: off)";
74
+ detail = msg().session.sandbox.bashOff;
70
75
  else if (!active)
71
76
  detail =
72
77
  status.kind === "unshare"
73
- ? "不可用:unshare 只隔离网络、不能限制写入"
74
- : `不可用:${status.detail}`;
78
+ ? msg().session.sandbox.bashUnshareOnly
79
+ : msg().session.sandbox.bashUnavailable(status.detail);
75
80
  else
76
- detail =
77
- `${status.kind},网络 ${network},可写:工作区、临时目录、输出目录` +
78
- (writable.length > 0 ? `、${writable.join("、")}` : "");
81
+ detail = msg().session.sandbox.bashActive(status.kind, network, writable);
79
82
  return { active, status, network, writable, hidden, detail };
80
83
  }
81
84
  /** 一次 bash 调用的沙箱策略(路径未 realpath,wrapCommand 再解析)。 */
@@ -13,11 +13,14 @@ import { spawnSync } from "node:child_process";
13
13
  import { accessSync, constants } from "node:fs";
14
14
  import { posix, win32 } from "node:path";
15
15
  import { buildBwrapArgs, buildSbplProfile, buildUnshareArgs, } from "./profile.js";
16
+ import { msg } from "../i18n/index.js";
16
17
  export const NO_OS_SANDBOX = Object.freeze({
17
18
  kind: "none",
18
19
  isolatesNetwork: false,
19
20
  restrictsWrites: false,
20
- detail: "没有可用的操作系统沙箱",
21
+ get detail() {
22
+ return msg().session.sandbox.noOsSandbox;
23
+ },
21
24
  });
22
25
  export const SANDBOX_EXEC_PATH = "/usr/bin/sandbox-exec";
23
26
  export const PROBE_TIMEOUT_MS = 5000;
@@ -67,10 +70,10 @@ export function resolveSandboxEnabled(configured, env = process.env) {
67
70
  /** 不缓存的探测(测试注入 deps)。 */
68
71
  export function probeOsSandbox(enabled, deps = REAL_PROBE_DEPS) {
69
72
  if (enabled === "off")
70
- return { ...NO_OS_SANDBOX, detail: "已关闭(sandbox.enabled: off 或 AMA_SANDBOX=off)" };
73
+ return { ...NO_OS_SANDBOX, detail: msg().session.sandbox.disabled };
71
74
  if (deps.platform === "darwin") {
72
75
  if (!deps.isExecutable(SANDBOX_EXEC_PATH))
73
- return { ...NO_OS_SANDBOX, detail: `没有 ${SANDBOX_EXEC_PATH}` };
76
+ return { ...NO_OS_SANDBOX, detail: msg().session.sandbox.missing(SANDBOX_EXEC_PATH) };
74
77
  const code = deps.run(SANDBOX_EXEC_PATH, [
75
78
  "-p",
76
79
  buildSbplProfile(PROBE_POLICY),
@@ -86,7 +89,7 @@ export function probeOsSandbox(enabled, deps = REAL_PROBE_DEPS) {
86
89
  };
87
90
  return {
88
91
  ...NO_OS_SANDBOX,
89
- detail: `sandbox-exec 探针失败(${code === null ? "无法启动" : `退出码 ${code}`};可能已在别的沙箱里)`,
92
+ detail: msg().session.sandbox.sandboxExecFailed(code),
90
93
  };
91
94
  }
92
95
  if (deps.platform === "linux") {
@@ -102,10 +105,10 @@ export function probeOsSandbox(enabled, deps = REAL_PROBE_DEPS) {
102
105
  restrictsWrites: true,
103
106
  detail: "Linux bubblewrap",
104
107
  };
105
- failures.push(`bwrap 探针失败(${code === null ? "无法启动" : `退出码 ${code}`})`);
108
+ failures.push(msg().session.sandbox.bwrapFailed(code));
106
109
  }
107
110
  else
108
- failures.push("没有 bwrap");
111
+ failures.push(msg().session.sandbox.noBwrap);
109
112
  const unshare = findExecutable("unshare", deps.env, deps.isExecutable, deps.platform);
110
113
  if (unshare !== undefined) {
111
114
  const code = deps.run(unshare, [...buildUnshareArgs(), "true"]);
@@ -115,15 +118,15 @@ export function probeOsSandbox(enabled, deps = REAL_PROBE_DEPS) {
115
118
  path: unshare,
116
119
  isolatesNetwork: true,
117
120
  restrictsWrites: false,
118
- detail: `Linux unshare -r -n(只隔离网络;${failures.join(",")})`,
121
+ detail: msg().session.sandbox.unshareOnly(failures),
119
122
  };
120
- failures.push(`unshare 探针失败(${code === null ? "无法启动" : `退出码 ${code}`};可能不允许非特权用户命名空间)`);
123
+ failures.push(msg().session.sandbox.unshareFailed(code));
121
124
  }
122
125
  else
123
- failures.push("没有 unshare");
124
- return { ...NO_OS_SANDBOX, detail: failures.join(",") };
126
+ failures.push(msg().session.sandbox.noUnshare);
127
+ return { ...NO_OS_SANDBOX, detail: msg().session.sandbox.failures(failures) };
125
128
  }
126
- return { ...NO_OS_SANDBOX, detail: `${deps.platform} 上没有操作系统沙箱实现` };
129
+ return { ...NO_OS_SANDBOX, detail: msg().session.sandbox.unsupportedPlatform(deps.platform) };
127
130
  }
128
131
  const cache = new Map();
129
132
  let configured;
package/dist/sdk.d.ts CHANGED
@@ -13,6 +13,7 @@
13
13
  * - [W5-F] 计划(docs/plan.md):`CreateSessionOptions.plan`(plan.* 配置 + `onProposed` 审批回调);
14
14
  * 返回的会话带 `plan.current() / respond() / todos()`。没有 `onProposed` 时按 `plan.unattended`
15
15
  * (缺省 stop:计划落盘后停下,不替人批准)。
16
+ * - [W6-C0] `language`(两个入口都有):界面语言,跟随宿主界面(docs/i18n.md);进程级,`AMA_LANG` 仍优先。
16
17
  */
17
18
  import type { ApiRegistry } from "./ai/apis/api.js";
18
19
  import type { ModelThinkingLevel, ProviderData } from "./ai/types.js";
@@ -23,7 +24,9 @@ import type { PlanConfig } from "./config/types-w5.js";
23
24
  import { type LogFn } from "./cli/compose-session.js";
24
25
  import { type ComposeOptions } from "./cli/compose.js";
25
26
  import type { Runtime } from "./cli/runtime.js";
26
- import { type AmaConfig, type ToolsPresetInput } from "./config/types.js";
27
+ import { type AmaConfig, type ProfileMemoryOptions, type ToolsPresetInput } from "./config/types.js";
28
+ import type { Trace, TraceOptions } from "./trace/types.js";
29
+ import { type Locale } from "./i18n/index.js";
27
30
  import type { HookConfig } from "./hooks/types.js";
28
31
  import type { InstructionSource } from "./host/types.js";
29
32
  import type { ApprovalDecision, ApprovalRequest, PermissionMode } from "./permissions/types.js";
@@ -53,6 +56,10 @@ export interface RuntimeOptions {
53
56
  stderr?: (text: string) => void;
54
57
  /** 组装根选项:追加供应商 / 协议 / 工具 / 工具工厂。 */
55
58
  compose?: ComposeOptions;
59
+ /** [W6-C0] 界面语言(等价 `--lang`);进程级。 */
60
+ language?: Locale;
61
+ /** [W6-C0] 记忆开关(等价 `--memory` / `--no-memory`;W6-M 实现)。 */
62
+ memory?: boolean;
56
63
  }
57
64
  export declare function createRuntime(options?: RuntimeOptions): Promise<Runtime>;
58
65
  /** [W5-F] 计划:类型与 RPC 同形(`plan_proposed` / `plan_response`)。 */
@@ -74,6 +81,8 @@ export interface SessionPlanApi {
74
81
  }
75
82
  export type SdkAgentSession = AgentSessionImpl & {
76
83
  readonly plan: SessionPlanApi;
84
+ /** [W6-C0] 本会话的轨迹([W6-T2] 实现,见 trace/query-session.ts)。 */
85
+ trace?(options?: TraceOptions): Trace;
77
86
  };
78
87
  export type SessionAuth = {
79
88
  kind: "file";
@@ -131,5 +140,12 @@ export interface CreateSessionOptions {
131
140
  unattended?: boolean;
132
141
  onWarning?: (message: string) => void;
133
142
  log?: LogFn;
143
+ /** [W6-C0] 界面语言(跟随宿主界面);进程级,`AMA_LANG` 仍优先。不影响发给模型的文本。 */
144
+ language?: Locale;
145
+ /**
146
+ * [W6-C0] 记忆(W6-M 实现,D11):缺省禁用;`enabled: true` 时 `dir` 必填(按工作空间隔离的绝对路径),
147
+ * 作用域只有 workspace,不读用户级记忆。
148
+ */
149
+ memory?: ProfileMemoryOptions;
134
150
  }
135
151
  export declare function createAgentSession(options?: CreateSessionOptions): Promise<SdkAgentSession>;