@armadra/agent 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +203 -304
  2. package/CHANGELOG.zh-CN.md +462 -0
  3. package/README.md +408 -364
  4. package/README.zh-CN.md +705 -0
  5. package/dist/agent/session-plan.js +2 -2
  6. package/dist/agent/session-state.d.ts +3 -0
  7. package/dist/agent/session-state.js +20 -0
  8. package/dist/agent/session-subagent.d.ts +15 -1
  9. package/dist/agent/session-subagent.js +26 -3
  10. package/dist/agent/session-telemetry.d.ts +16 -2
  11. package/dist/agent/session-telemetry.js +29 -7
  12. package/dist/agent/session-tools.js +5 -2
  13. package/dist/agent/session-trace-writer.d.ts +27 -0
  14. package/dist/agent/session-trace-writer.js +253 -0
  15. package/dist/agent/session.d.ts +2 -0
  16. package/dist/agent/session.js +12 -0
  17. package/dist/agent/subagent-direct.d.ts +20 -0
  18. package/dist/agent/subagent-direct.js +76 -0
  19. package/dist/agent/subagent-registry.d.ts +8 -1
  20. package/dist/agent/subagent-registry.js +28 -1
  21. package/dist/agent/system-prompt.d.ts +3 -1
  22. package/dist/agent/system-prompt.js +3 -0
  23. package/dist/agent/tool-runner.d.ts +2 -1
  24. package/dist/agent/tool-runner.js +5 -4
  25. package/dist/agent/types-w6.d.ts +39 -0
  26. package/dist/agent/types-w6.js +4 -0
  27. package/dist/agent/types.d.ts +5 -2
  28. package/dist/agents/external.js +1 -1
  29. package/dist/agents/task-record.d.ts +74 -1
  30. package/dist/agents/task-record.js +100 -0
  31. package/dist/ai/apis/cache-params.js +2 -1
  32. package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
  33. package/dist/ai/apis/chatgpt-backend.js +224 -0
  34. package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
  35. package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
  36. package/dist/ai/apis/openai-responses-request.d.ts +2 -1
  37. package/dist/ai/apis/openai-responses-request.js +8 -2
  38. package/dist/ai/apis/openai-responses.d.ts +2 -0
  39. package/dist/ai/apis/openai-responses.js +51 -16
  40. package/dist/ai/overflow.d.ts +1 -1
  41. package/dist/ai/overflow.js +10 -7
  42. package/dist/ai/providers/auth.d.ts +15 -2
  43. package/dist/ai/providers/auth.js +69 -2
  44. package/dist/ai/providers/builtin.js +27 -0
  45. package/dist/ai/providers/catalog-data.js +1 -0
  46. package/dist/ai/providers/discovered-cache.d.ts +48 -0
  47. package/dist/ai/providers/discovered-cache.js +102 -0
  48. package/dist/ai/providers/enrich.js +2 -7
  49. package/dist/ai/providers/model-visibility.d.ts +33 -0
  50. package/dist/ai/providers/model-visibility.js +70 -0
  51. package/dist/ai/providers/models-dev-cache.js +15 -19
  52. package/dist/ai/providers/models-dev-snapshot.js +8 -7
  53. package/dist/ai/providers/models-dev.js +5 -15
  54. package/dist/ai/providers/registry.d.ts +2 -0
  55. package/dist/ai/providers/registry.js +6 -1
  56. package/dist/ai/providers/suggest.js +2 -16
  57. package/dist/ai/types.d.ts +27 -1
  58. package/dist/auth/chatgpt/backend-client.d.ts +26 -0
  59. package/dist/auth/chatgpt/backend-client.js +74 -0
  60. package/dist/auth/chatgpt/claims.d.ts +17 -0
  61. package/dist/auth/chatgpt/claims.js +46 -0
  62. package/dist/auth/chatgpt/cli.d.ts +35 -0
  63. package/dist/auth/chatgpt/cli.js +279 -0
  64. package/dist/auth/chatgpt/doctor.d.ts +17 -0
  65. package/dist/auth/chatgpt/doctor.js +36 -0
  66. package/dist/auth/chatgpt/host-id.d.ts +7 -0
  67. package/dist/auth/chatgpt/host-id.js +26 -0
  68. package/dist/auth/chatgpt/login.d.ts +30 -0
  69. package/dist/auth/chatgpt/login.js +130 -0
  70. package/dist/auth/chatgpt/presets.d.ts +66 -0
  71. package/dist/auth/chatgpt/presets.js +120 -0
  72. package/dist/auth/chatgpt/quota-text.d.ts +13 -0
  73. package/dist/auth/chatgpt/quota-text.js +36 -0
  74. package/dist/auth/oauth/browser.d.ts +12 -0
  75. package/dist/auth/oauth/browser.js +27 -0
  76. package/dist/auth/oauth/callback-server.d.ts +47 -0
  77. package/dist/auth/oauth/callback-server.js +147 -0
  78. package/dist/auth/oauth/flows.d.ts +62 -0
  79. package/dist/auth/oauth/flows.js +113 -0
  80. package/dist/auth/oauth/jwt.d.ts +24 -0
  81. package/dist/auth/oauth/jwt.js +81 -0
  82. package/dist/auth/oauth/live.d.ts +21 -0
  83. package/dist/auth/oauth/live.js +25 -0
  84. package/dist/auth/oauth/oidc.d.ts +26 -0
  85. package/dist/auth/oauth/oidc.js +72 -0
  86. package/dist/auth/oauth/pkce.d.ts +15 -0
  87. package/dist/auth/oauth/pkce.js +20 -0
  88. package/dist/auth/oauth/refresh.d.ts +35 -0
  89. package/dist/auth/oauth/refresh.js +129 -0
  90. package/dist/auth/oauth/token-client.d.ts +33 -0
  91. package/dist/auth/oauth/token-client.js +121 -0
  92. package/dist/auth/oauth/token-store.d.ts +23 -0
  93. package/dist/auth/oauth/token-store.js +125 -0
  94. package/dist/auth/testing/fake-oauth.d.ts +73 -0
  95. package/dist/auth/testing/fake-oauth.js +271 -0
  96. package/dist/auth/testing/refresh-child.d.ts +5 -0
  97. package/dist/auth/testing/refresh-child.js +16 -0
  98. package/dist/bundle/ama.cjs +26532 -11045
  99. package/dist/checkpoints/backend.js +6 -5
  100. package/dist/checkpoints/restore.js +3 -2
  101. package/dist/checkpoints/settings.js +2 -1
  102. package/dist/checkpoints/shadow-git.js +7 -6
  103. package/dist/checkpoints/shadow-restore.js +3 -2
  104. package/dist/checkpoints/tracker.js +4 -3
  105. package/dist/cli/args.d.ts +9 -2
  106. package/dist/cli/args.js +74 -27
  107. package/dist/cli/bootstrap.js +53 -31
  108. package/dist/cli/choice-prompt.js +8 -6
  109. package/dist/cli/codemode-notice.js +2 -2
  110. package/dist/cli/compose-agents.js +2 -1
  111. package/dist/cli/compose-extensions.js +2 -0
  112. package/dist/cli/compose-memory.d.ts +53 -0
  113. package/dist/cli/compose-memory.js +127 -0
  114. package/dist/cli/compose-providers.d.ts +6 -0
  115. package/dist/cli/compose-providers.js +38 -2
  116. package/dist/cli/compose-session.d.ts +5 -0
  117. package/dist/cli/compose-session.js +27 -13
  118. package/dist/cli/compose-store.d.ts +2 -0
  119. package/dist/cli/compose-store.js +9 -5
  120. package/dist/cli/compose.d.ts +2 -0
  121. package/dist/cli/compose.js +13 -5
  122. package/dist/cli/default-model.d.ts +0 -2
  123. package/dist/cli/default-model.js +5 -8
  124. package/dist/cli/deps.d.ts +5 -1
  125. package/dist/cli/exit-codes.d.ts +1 -1
  126. package/dist/cli/exit-codes.js +7 -16
  127. package/dist/cli/from-prompt.js +3 -2
  128. package/dist/cli/help-text.d.ts +2 -1
  129. package/dist/cli/help-text.js +5 -99
  130. package/dist/cli/main.d.ts +5 -0
  131. package/dist/cli/main.js +21 -2
  132. package/dist/cli/proxy.js +14 -9
  133. package/dist/cli/runtime.d.ts +5 -0
  134. package/dist/cli/startup-screen.js +20 -27
  135. package/dist/cli/startup-steps.js +6 -8
  136. package/dist/cli/subcommands/auth.d.ts +6 -3
  137. package/dist/cli/subcommands/auth.js +52 -22
  138. package/dist/cli/subcommands/config-set.d.ts +21 -0
  139. package/dist/cli/subcommands/config-set.js +145 -0
  140. package/dist/cli/subcommands/config.d.ts +2 -1
  141. package/dist/cli/subcommands/config.js +51 -37
  142. package/dist/cli/subcommands/doctor.d.ts +2 -1
  143. package/dist/cli/subcommands/doctor.js +97 -58
  144. package/dist/cli/subcommands/init.d.ts +1 -1
  145. package/dist/cli/subcommands/init.js +8 -7
  146. package/dist/cli/subcommands/memory.d.ts +18 -0
  147. package/dist/cli/subcommands/memory.js +189 -0
  148. package/dist/cli/subcommands/model-meta.js +11 -9
  149. package/dist/cli/subcommands/models-cache-probe.js +23 -20
  150. package/dist/cli/subcommands/models-discover.d.ts +4 -0
  151. package/dist/cli/subcommands/models-discover.js +60 -21
  152. package/dist/cli/subcommands/models-enable.d.ts +13 -0
  153. package/dist/cli/subcommands/models-enable.js +145 -0
  154. package/dist/cli/subcommands/models.d.ts +3 -1
  155. package/dist/cli/subcommands/models.js +39 -24
  156. package/dist/cli/subcommands/probe-runner.js +8 -7
  157. package/dist/cli/subcommands/providers-list.js +32 -21
  158. package/dist/cli/subcommands/providers-plan.js +24 -25
  159. package/dist/cli/subcommands/providers-probe.js +5 -6
  160. package/dist/cli/subcommands/providers.d.ts +1 -1
  161. package/dist/cli/subcommands/providers.js +45 -50
  162. package/dist/cli/subcommands/sessions-export.d.ts +1 -1
  163. package/dist/cli/subcommands/sessions-export.js +10 -9
  164. package/dist/cli/subcommands/sessions-search.d.ts +1 -1
  165. package/dist/cli/subcommands/sessions-search.js +11 -10
  166. package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
  167. package/dist/cli/subcommands/sessions-trace.js +156 -0
  168. package/dist/cli/subcommands/sessions.d.ts +4 -3
  169. package/dist/cli/subcommands/sessions.js +40 -37
  170. package/dist/cli/subcommands/stats.d.ts +1 -1
  171. package/dist/cli/subcommands/stats.js +49 -30
  172. package/dist/cli/system-prompt-arg.js +3 -2
  173. package/dist/codemode/capability.js +3 -2
  174. package/dist/compaction/post-compact.d.ts +1 -0
  175. package/dist/compaction/post-compact.js +15 -1
  176. package/dist/compaction/prune-tier.d.ts +1 -1
  177. package/dist/compaction/prune-tier.js +3 -3
  178. package/dist/compaction/serialize.js +2 -1
  179. package/dist/config/auth-file.d.ts +12 -2
  180. package/dist/config/auth-file.js +32 -10
  181. package/dist/config/checker.js +12 -11
  182. package/dist/config/context-files.js +3 -2
  183. package/dist/config/edit.d.ts +106 -0
  184. package/dist/config/edit.js +350 -0
  185. package/dist/config/init.d.ts +4 -3
  186. package/dist/config/init.js +10 -18
  187. package/dist/config/json-schema.d.ts +2 -1
  188. package/dist/config/json-schema.js +102 -69
  189. package/dist/config/key-docs.d.ts +18 -7
  190. package/dist/config/key-docs.js +43 -128
  191. package/dist/config/load.js +7 -6
  192. package/dist/config/merge.d.ts +4 -1
  193. package/dist/config/merge.js +42 -22
  194. package/dist/config/paths.js +6 -5
  195. package/dist/config/profile.d.ts +5 -1
  196. package/dist/config/profile.js +7 -2
  197. package/dist/config/schema-w5.js +12 -4
  198. package/dist/config/schema-w6.d.ts +19 -0
  199. package/dist/config/schema-w6.js +115 -0
  200. package/dist/config/schema.js +34 -20
  201. package/dist/config/settings-registry.d.ts +81 -0
  202. package/dist/config/settings-registry.js +185 -0
  203. package/dist/config/types-w5.d.ts +7 -0
  204. package/dist/config/types-w5.js +2 -0
  205. package/dist/config/types-w6.d.ts +109 -0
  206. package/dist/config/types-w6.js +19 -0
  207. package/dist/config/types.d.ts +11 -8
  208. package/dist/config/types.js +1 -0
  209. package/dist/drivers/acp/client.js +1 -1
  210. package/dist/drivers/acp/driver.js +13 -8
  211. package/dist/drivers/agents.js +4 -3
  212. package/dist/drivers/base.js +3 -2
  213. package/dist/drivers/host-runners.js +2 -1
  214. package/dist/drivers/native/claude-stream.js +12 -11
  215. package/dist/drivers/native/codex-app-server.js +17 -12
  216. package/dist/drivers/native/oneshot.js +8 -7
  217. package/dist/drivers/pool.js +1 -1
  218. package/dist/drivers/runner.d.ts +3 -1
  219. package/dist/drivers/runner.js +68 -20
  220. package/dist/drivers/turn.js +1 -1
  221. package/dist/hooks/config.js +3 -2
  222. package/dist/hooks/protocol.js +18 -12
  223. package/dist/host/api-impl.js +11 -10
  224. package/dist/host/loader.js +9 -8
  225. package/dist/host/types.d.ts +3 -0
  226. package/dist/i18n/catalog.d.ts +2209 -0
  227. package/dist/i18n/catalog.js +72 -0
  228. package/dist/i18n/format.d.ts +21 -0
  229. package/dist/i18n/format.js +58 -0
  230. package/dist/i18n/index.d.ts +58 -0
  231. package/dist/i18n/index.js +72 -0
  232. package/dist/i18n/messages/agents.d.ts +84 -0
  233. package/dist/i18n/messages/agents.js +85 -0
  234. package/dist/i18n/messages/approval.d.ts +99 -0
  235. package/dist/i18n/messages/approval.js +100 -0
  236. package/dist/i18n/messages/auth.d.ts +189 -0
  237. package/dist/i18n/messages/auth.js +201 -0
  238. package/dist/i18n/messages/cli-args.d.ts +46 -0
  239. package/dist/i18n/messages/cli-args.js +46 -0
  240. package/dist/i18n/messages/cli-help.d.ts +12 -0
  241. package/dist/i18n/messages/cli-help.js +248 -0
  242. package/dist/i18n/messages/cli.d.ts +336 -0
  243. package/dist/i18n/messages/cli.js +311 -0
  244. package/dist/i18n/messages/config-keys.d.ts +293 -0
  245. package/dist/i18n/messages/config-keys.js +296 -0
  246. package/dist/i18n/messages/config.d.ts +508 -0
  247. package/dist/i18n/messages/config.js +241 -0
  248. package/dist/i18n/messages/drivers.d.ts +123 -0
  249. package/dist/i18n/messages/drivers.js +124 -0
  250. package/dist/i18n/messages/errors.d.ts +83 -0
  251. package/dist/i18n/messages/errors.js +171 -0
  252. package/dist/i18n/messages/interactive-line.d.ts +61 -0
  253. package/dist/i18n/messages/interactive-line.js +69 -0
  254. package/dist/i18n/messages/interactive-startup.d.ts +99 -0
  255. package/dist/i18n/messages/interactive-startup.js +100 -0
  256. package/dist/i18n/messages/interactive-view.d.ts +140 -0
  257. package/dist/i18n/messages/interactive-view.js +141 -0
  258. package/dist/i18n/messages/interactive.d.ts +489 -0
  259. package/dist/i18n/messages/interactive.js +248 -0
  260. package/dist/i18n/messages/memory.d.ts +123 -0
  261. package/dist/i18n/messages/memory.js +128 -0
  262. package/dist/i18n/messages/panels.d.ts +233 -0
  263. package/dist/i18n/messages/panels.js +232 -0
  264. package/dist/i18n/messages/permissions.d.ts +126 -0
  265. package/dist/i18n/messages/permissions.js +151 -0
  266. package/dist/i18n/messages/plan.d.ts +123 -0
  267. package/dist/i18n/messages/plan.js +124 -0
  268. package/dist/i18n/messages/print.d.ts +86 -0
  269. package/dist/i18n/messages/print.js +91 -0
  270. package/dist/i18n/messages/report.d.ts +391 -0
  271. package/dist/i18n/messages/report.js +490 -0
  272. package/dist/i18n/messages/rewind.d.ts +198 -0
  273. package/dist/i18n/messages/rewind.js +217 -0
  274. package/dist/i18n/messages/session.d.ts +230 -0
  275. package/dist/i18n/messages/session.js +258 -0
  276. package/dist/i18n/messages/settings.d.ts +355 -0
  277. package/dist/i18n/messages/settings.js +343 -0
  278. package/dist/i18n/messages/subcommands-config.d.ts +113 -0
  279. package/dist/i18n/messages/subcommands-config.js +129 -0
  280. package/dist/i18n/messages/subcommands-models.d.ts +34 -0
  281. package/dist/i18n/messages/subcommands-models.js +34 -0
  282. package/dist/i18n/messages/subcommands.d.ts +576 -0
  283. package/dist/i18n/messages/subcommands.js +477 -0
  284. package/dist/i18n/messages/trace.d.ts +243 -0
  285. package/dist/i18n/messages/trace.js +238 -0
  286. package/dist/i18n/types.d.ts +15 -0
  287. package/dist/i18n/types.js +7 -0
  288. package/dist/index.d.ts +6 -0
  289. package/dist/index.js +2 -0
  290. package/dist/memory/edit.d.ts +24 -0
  291. package/dist/memory/edit.js +63 -0
  292. package/dist/memory/frontmatter.d.ts +37 -0
  293. package/dist/memory/frontmatter.js +79 -0
  294. package/dist/memory/index.d.ts +28 -0
  295. package/dist/memory/index.js +126 -0
  296. package/dist/memory/lock.d.ts +17 -0
  297. package/dist/memory/lock.js +62 -0
  298. package/dist/memory/paths.d.ts +57 -0
  299. package/dist/memory/paths.js +175 -0
  300. package/dist/memory/report.d.ts +36 -0
  301. package/dist/memory/report.js +86 -0
  302. package/dist/memory/runtime.d.ts +42 -0
  303. package/dist/memory/runtime.js +36 -0
  304. package/dist/memory/secrets.d.ts +8 -0
  305. package/dist/memory/secrets.js +27 -0
  306. package/dist/memory/section.d.ts +28 -0
  307. package/dist/memory/section.js +59 -0
  308. package/dist/memory/store.d.ts +70 -0
  309. package/dist/memory/store.js +284 -0
  310. package/dist/memory/tool.d.ts +31 -0
  311. package/dist/memory/tool.js +94 -0
  312. package/dist/modes/acp/acp-events.js +2 -1
  313. package/dist/modes/acp/acp-server.js +13 -12
  314. package/dist/modes/commands-core.d.ts +11 -0
  315. package/dist/modes/commands-core.js +93 -62
  316. package/dist/modes/image-input.js +20 -6
  317. package/dist/modes/interactive/agent-bar.d.ts +95 -0
  318. package/dist/modes/interactive/agent-bar.js +248 -0
  319. package/dist/modes/interactive/agent-panels.js +27 -26
  320. package/dist/modes/interactive/agent-transcript.d.ts +47 -0
  321. package/dist/modes/interactive/agent-transcript.js +191 -0
  322. package/dist/modes/interactive/agent-ui.d.ts +36 -1
  323. package/dist/modes/interactive/agent-ui.js +180 -14
  324. package/dist/modes/interactive/agent-view.d.ts +72 -0
  325. package/dist/modes/interactive/agent-view.js +281 -0
  326. package/dist/modes/interactive/approval-dialog.js +46 -34
  327. package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
  328. package/dist/modes/interactive/clipboard-paste.js +9 -4
  329. package/dist/modes/interactive/commands.d.ts +22 -1
  330. package/dist/modes/interactive/commands.js +100 -49
  331. package/dist/modes/interactive/completion.js +2 -1
  332. package/dist/modes/interactive/config-panel.d.ts +70 -0
  333. package/dist/modes/interactive/config-panel.js +319 -0
  334. package/dist/modes/interactive/config-ui.d.ts +96 -0
  335. package/dist/modes/interactive/config-ui.js +397 -0
  336. package/dist/modes/interactive/confirm-dialog.js +6 -7
  337. package/dist/modes/interactive/event-notices.js +11 -9
  338. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  339. package/dist/modes/interactive/interactive-mode.js +21 -22
  340. package/dist/modes/interactive/key-dispatch.d.ts +12 -0
  341. package/dist/modes/interactive/key-dispatch.js +24 -9
  342. package/dist/modes/interactive/line/line-editor.js +2 -1
  343. package/dist/modes/interactive/line/line-mode.js +18 -7
  344. package/dist/modes/interactive/line/line-render.js +25 -24
  345. package/dist/modes/interactive/memory-panel.d.ts +64 -0
  346. package/dist/modes/interactive/memory-panel.js +221 -0
  347. package/dist/modes/interactive/message-view.d.ts +4 -2
  348. package/dist/modes/interactive/message-view.js +42 -33
  349. package/dist/modes/interactive/model-items.d.ts +45 -0
  350. package/dist/modes/interactive/model-items.js +134 -0
  351. package/dist/modes/interactive/model-picker.d.ts +57 -0
  352. package/dist/modes/interactive/model-picker.js +191 -0
  353. package/dist/modes/interactive/panels.js +39 -31
  354. package/dist/modes/interactive/pickers.d.ts +2 -1
  355. package/dist/modes/interactive/pickers.js +10 -6
  356. package/dist/modes/interactive/plan-command.d.ts +1 -1
  357. package/dist/modes/interactive/plan-command.js +24 -27
  358. package/dist/modes/interactive/plan-dialog.js +18 -17
  359. package/dist/modes/interactive/plan-flow.js +6 -5
  360. package/dist/modes/interactive/rewind-command.d.ts +1 -1
  361. package/dist/modes/interactive/rewind-command.js +18 -16
  362. package/dist/modes/interactive/rewind-flow.d.ts +0 -1
  363. package/dist/modes/interactive/rewind-flow.js +13 -14
  364. package/dist/modes/interactive/rewind-list.js +7 -6
  365. package/dist/modes/interactive/rewind-panel.js +40 -40
  366. package/dist/modes/interactive/rewind-text.d.ts +5 -3
  367. package/dist/modes/interactive/rewind-text.js +48 -38
  368. package/dist/modes/interactive/run-indicator.js +15 -12
  369. package/dist/modes/interactive/session-events.js +3 -2
  370. package/dist/modes/interactive/startup-header.js +22 -23
  371. package/dist/modes/interactive/startup-ui.d.ts +3 -9
  372. package/dist/modes/interactive/startup-ui.js +44 -88
  373. package/dist/modes/interactive/status-area.d.ts +2 -0
  374. package/dist/modes/interactive/status-area.js +8 -2
  375. package/dist/modes/interactive/status-bar.js +4 -3
  376. package/dist/modes/interactive/subagent-view.js +9 -7
  377. package/dist/modes/interactive/tasks-report.d.ts +6 -0
  378. package/dist/modes/interactive/tasks-report.js +28 -31
  379. package/dist/modes/interactive/terminal-setup.d.ts +9 -0
  380. package/dist/modes/interactive/terminal-setup.js +23 -0
  381. package/dist/modes/interactive/tool-summary.js +19 -17
  382. package/dist/modes/interactive/tool-view.js +7 -4
  383. package/dist/modes/interactive/trace-view.d.ts +89 -0
  384. package/dist/modes/interactive/trace-view.js +332 -0
  385. package/dist/modes/print/print-mode.js +14 -15
  386. package/dist/modes/rpc/commands.js +7 -3
  387. package/dist/modes/rpc/rpc-mode.js +9 -3
  388. package/dist/modes/session-report.d.ts +2 -0
  389. package/dist/modes/session-report.js +101 -105
  390. package/dist/modes/startup-ui-text.js +11 -6
  391. package/dist/permissions/bypass.d.ts +8 -10
  392. package/dist/permissions/bypass.js +19 -10
  393. package/dist/permissions/memory-class.d.ts +23 -0
  394. package/dist/permissions/memory-class.js +54 -0
  395. package/dist/permissions/modes.d.ts +3 -3
  396. package/dist/permissions/modes.js +21 -16
  397. package/dist/permissions/pipeline.d.ts +1 -1
  398. package/dist/permissions/pipeline.js +9 -2
  399. package/dist/permissions/preview.js +49 -42
  400. package/dist/permissions/rules.js +5 -2
  401. package/dist/permissions/types.d.ts +4 -0
  402. package/dist/plan/store.js +2 -1
  403. package/dist/rpc.d.ts +39 -1
  404. package/dist/rpc.js +3 -0
  405. package/dist/sandbox/bash.js +11 -8
  406. package/dist/sandbox/detect.js +14 -11
  407. package/dist/sdk.d.ts +17 -1
  408. package/dist/sdk.js +29 -7
  409. package/dist/session/export.js +31 -30
  410. package/dist/session/manager.d.ts +1 -1
  411. package/dist/session/manager.js +5 -3
  412. package/dist/session/reuse.js +5 -4
  413. package/dist/session/scan.js +3 -2
  414. package/dist/session/stats-aggregate.d.ts +3 -1
  415. package/dist/session/stats-aggregate.js +5 -1
  416. package/dist/session/stats-index.js +2 -1
  417. package/dist/session/stats-scan.d.ts +4 -1
  418. package/dist/session/stats-scan.js +6 -2
  419. package/dist/session/store.d.ts +11 -0
  420. package/dist/session/store.js +48 -1
  421. package/dist/session/types.d.ts +2 -0
  422. package/dist/skills/builtin.js +2 -1
  423. package/dist/tools/image-file.d.ts +26 -1
  424. package/dist/tools/image-file.js +55 -13
  425. package/dist/tools/presets.d.ts +14 -1
  426. package/dist/tools/presets.js +3 -3
  427. package/dist/tools/registry.js +1 -1
  428. package/dist/tools/truncate.d.ts +1 -1
  429. package/dist/tools/truncate.js +2 -2
  430. package/dist/tools/types.d.ts +17 -1
  431. package/dist/trace/build-index.d.ts +91 -0
  432. package/dist/trace/build-index.js +127 -0
  433. package/dist/trace/build-nodes.d.ts +24 -0
  434. package/dist/trace/build-nodes.js +279 -0
  435. package/dist/trace/build-util.d.ts +43 -0
  436. package/dist/trace/build-util.js +120 -0
  437. package/dist/trace/build.d.ts +82 -0
  438. package/dist/trace/build.js +382 -0
  439. package/dist/trace/detail.d.ts +35 -0
  440. package/dist/trace/detail.js +205 -0
  441. package/dist/trace/flatten.d.ts +69 -0
  442. package/dist/trace/flatten.js +173 -0
  443. package/dist/trace/format.d.ts +47 -0
  444. package/dist/trace/format.js +329 -0
  445. package/dist/trace/html-template.d.ts +19 -0
  446. package/dist/trace/html-template.js +150 -0
  447. package/dist/trace/html.d.ts +104 -0
  448. package/dist/trace/html.js +292 -0
  449. package/dist/trace/preview.d.ts +29 -0
  450. package/dist/trace/preview.js +59 -0
  451. package/dist/trace/query-session.d.ts +14 -0
  452. package/dist/trace/query-session.js +38 -0
  453. package/dist/trace/query.d.ts +55 -0
  454. package/dist/trace/query.js +188 -0
  455. package/dist/trace/session.d.ts +40 -0
  456. package/dist/trace/session.js +168 -0
  457. package/dist/trace/types.d.ts +243 -0
  458. package/dist/trace/types.js +13 -0
  459. package/dist/tui/components/editor-paste.d.ts +2 -0
  460. package/dist/tui/components/editor-paste.js +6 -3
  461. package/dist/tui/components/editor.js +2 -2
  462. package/dist/tui/components/loader.d.ts +3 -0
  463. package/dist/tui/components/loader.js +14 -0
  464. package/dist/tui/components/select-list.d.ts +2 -0
  465. package/dist/tui/components/select-list.js +7 -0
  466. package/dist/tui/components/settings-list.d.ts +61 -0
  467. package/dist/tui/components/settings-list.js +135 -0
  468. package/dist/tui/keybindings.d.ts +5 -0
  469. package/dist/tui/keybindings.js +17 -5
  470. package/dist/tui.d.ts +1 -0
  471. package/dist/tui.js +2 -0
  472. package/docs/en/host-api.md +167 -0
  473. package/docs/en/permissions.md +214 -0
  474. package/docs/en/providers.md +627 -0
  475. package/docs/en/rpc.md +361 -0
  476. package/docs/en/sessions.md +219 -0
  477. package/docs/en/tui.md +534 -0
  478. package/docs/host-api.md +18 -17
  479. package/docs/memory.md +172 -0
  480. package/docs/permissions.md +2 -2
  481. package/docs/providers.md +73 -1
  482. package/docs/rpc.md +31 -3
  483. package/docs/session-format.md +8 -2
  484. package/docs/sessions.md +29 -1
  485. package/docs/tui.md +140 -4
  486. package/package.json +8 -3
@@ -7,21 +7,30 @@
7
7
  * - 离开 Bypass、切到其它模式都不问。
8
8
  * - 只管「要不要问」与记住确认;怎么问(对话框 / 行式 y/N)由各界面提供 `ask`。
9
9
  */
10
+ import { msg } from "../i18n/index.js";
10
11
  export const BYPASS_MODE = "full-auto";
11
- export const BYPASS_CONFIRM_TITLE = "进入 Bypass permissions?";
12
+ /** 确认框标题(随界面语言)。 */
13
+ export function bypassConfirmTitle() {
14
+ return msg().permissions.bypass.title;
15
+ }
12
16
  /** 确认框正文:Bypass 意味着什么(一两条关键风险)。 */
13
- export const BYPASS_RISK_LINES = [
14
- "所有工具调用都不再询问:写文件、执行命令、联网直接放行",
15
- "只有危险命令仍会询问,deny 规则照常生效;只建议在一次性沙箱、容器里用",
16
- ];
17
+ export function bypassRiskLines() {
18
+ const m = msg().permissions.bypass;
19
+ return [m.riskAllowAll, m.riskDangerous];
20
+ }
17
21
  /** 选项:缺省选中「取消」。 */
18
- export const BYPASS_CHOICES = [
19
- { label: "进入 Bypass", keys: "y" },
20
- { label: "取消", keys: "n Esc" },
21
- ];
22
+ export function bypassChoices() {
23
+ const m = msg().permissions.bypass;
24
+ return [
25
+ { label: m.choiceEnter, keys: "y" },
26
+ { label: m.choiceCancel, keys: "n Esc" },
27
+ ];
28
+ }
22
29
  export const BYPASS_DEFAULT_CHOICE = 1;
23
30
  /** 行式界面的问句(单键 y/N,缺省 N)。 */
24
- export const BYPASS_LINE_QUESTION = "确认进入 Bypass?[y/N] ";
31
+ export function bypassLineQuestion() {
32
+ return msg().permissions.bypass.lineQuestion;
33
+ }
25
34
  /**
26
35
  * 返回「切到 `mode` 前要不要放行」的闸门:不是 Bypass 直接放行;Bypass 首次调用 `ask`,
27
36
  * 确认后本闸门内不再问。`confirmed` 为 true 表示启动时已在 Bypass(视为已确认)。
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 权限类 `memory`(docs/wave6-plan.md §3.3、D10)。[W6-C0] 管线判定;`memory` 工具本身由 W6-M 实现。
3
+ *
4
+ * 管线按命令把它折成已有的类再走通常的真值表:
5
+ * - `view` → `read`:所有模式放行;
6
+ * - 写命令(`create` / `str_replace` / `delete`,以及无法识别的命令)→ `execute`:default / auto-edit 询问
7
+ * (审批可选「本会话允许」)、plan 拒绝、full-auto 放行、allowlist 只放行 allow 规则命中的
8
+ * (`memory` 不带括号即全部放行)、auto 交给分类器。
9
+ * 写入前的脱敏拒写、子会话写命令拒绝在工具执行层(W6-M),不在这里。
10
+ */
11
+ import type { ToolPermission } from "../tools/types.js";
12
+ export declare const MEMORY_COMMANDS: readonly ["view", "create", "str_replace", "delete"];
13
+ export type MemoryCommand = (typeof MEMORY_COMMANDS)[number];
14
+ /** 调用的 `command`(不是字符串返回 undefined)。 */
15
+ export declare function memoryCommand(input: unknown): string | undefined;
16
+ /** `memory` 类在真值表里按哪一类判定。 */
17
+ export declare function memoryEffectivePermission(input: unknown): Exclude<ToolPermission, "memory">;
18
+ /**
19
+ * [W6-M] `memory(pattern)` 规则:pattern 是命令名(`view` / `create` / `str_replace` / `delete`)时比对命令;
20
+ * 否则按 glob 比对逻辑路径(`/memories/user/**`,`*` 不跨 `/`,`**` 跨);单独的 `*` / `**` 命中全部。
21
+ * 记忆路径是逻辑路径,不按文件系统解析(`rules.ts` 对 memory 不走 bash 命令与真实路径的匹配)。
22
+ */
23
+ export declare function memoryRuleMatches(pattern: string, input: unknown): boolean;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 权限类 `memory`(docs/wave6-plan.md §3.3、D10)。[W6-C0] 管线判定;`memory` 工具本身由 W6-M 实现。
3
+ *
4
+ * 管线按命令把它折成已有的类再走通常的真值表:
5
+ * - `view` → `read`:所有模式放行;
6
+ * - 写命令(`create` / `str_replace` / `delete`,以及无法识别的命令)→ `execute`:default / auto-edit 询问
7
+ * (审批可选「本会话允许」)、plan 拒绝、full-auto 放行、allowlist 只放行 allow 规则命中的
8
+ * (`memory` 不带括号即全部放行)、auto 交给分类器。
9
+ * 写入前的脱敏拒写、子会话写命令拒绝在工具执行层(W6-M),不在这里。
10
+ */
11
+ export const MEMORY_COMMANDS = ["view", "create", "str_replace", "delete"];
12
+ /** 调用的 `command`(不是字符串返回 undefined)。 */
13
+ export function memoryCommand(input) {
14
+ const raw = typeof input === "object" && input !== null
15
+ ? input["command"]
16
+ : undefined;
17
+ return typeof raw === "string" ? raw : undefined;
18
+ }
19
+ /** `memory` 类在真值表里按哪一类判定。 */
20
+ export function memoryEffectivePermission(input) {
21
+ return memoryCommand(input) === "view" ? "read" : "execute";
22
+ }
23
+ /**
24
+ * [W6-M] `memory(pattern)` 规则:pattern 是命令名(`view` / `create` / `str_replace` / `delete`)时比对命令;
25
+ * 否则按 glob 比对逻辑路径(`/memories/user/**`,`*` 不跨 `/`,`**` 跨);单独的 `*` / `**` 命中全部。
26
+ * 记忆路径是逻辑路径,不按文件系统解析(`rules.ts` 对 memory 不走 bash 命令与真实路径的匹配)。
27
+ */
28
+ export function memoryRuleMatches(pattern, input) {
29
+ const p = pattern.trim();
30
+ if (p === "*" || p === "**")
31
+ return true;
32
+ if (MEMORY_COMMANDS.includes(p))
33
+ return memoryCommand(input) === p;
34
+ const raw = typeof input === "object" && input !== null
35
+ ? input["path"]
36
+ : undefined;
37
+ if (typeof raw !== "string")
38
+ return false;
39
+ let body = "";
40
+ for (let i = 0; i < p.length; i++) {
41
+ const ch = p[i];
42
+ if (ch === "*" && p[i + 1] === "*") {
43
+ body += ".*";
44
+ i++;
45
+ }
46
+ else if (ch === "*")
47
+ body += "[^/]*";
48
+ else if (ch === "?")
49
+ body += "[^/]";
50
+ else
51
+ body += ch.replace(/[.+^${}()|[\]\\]/g, "\\$&");
52
+ }
53
+ return new RegExp(`^${body}$`).test(raw.replace(/\/+$/, ""));
54
+ }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * 六种权限模式的显示名、一行说明、界面顺序与 Shift+Tab 循环(§7.4)。
3
3
  *
4
- * 显示名用英文(与常见编码 Agent 的叫法一致),说明用界面语言(中文)。界面顺序就是选择器里
4
+ * 显示名用英文(与常见编码 Agent 的叫法一致),说明随界面语言(`msg().permissions`)。界面顺序就是选择器里
5
5
  * 数字快捷键 1–6 的顺序;`allowlist` 不在 Shift+Tab 循环里,只能显式选。
6
6
  */
7
7
  import { type PermissionMode } from "./types.js";
@@ -22,8 +22,8 @@ export declare function isPermissionMode(value: unknown): value is PermissionMod
22
22
  export declare function nextCycleMode(mode: PermissionMode): PermissionMode;
23
23
  /** line 模式 `/permission` 与 `/permissions` 用的纯文本列表(与选择器同一顺序与标注)。 */
24
24
  export declare function permissionModeLines(current: PermissionMode, configDefault: PermissionMode): string[];
25
- /** 审批对话框与提示里 auto 判定层的中文名。 */
26
- export declare const AUTO_LAYER_TEXT: Readonly<Record<"rule" | "static" | "classifier", string>>;
25
+ /** 审批对话框与提示里 auto 判定层的名字(随界面语言)。 */
26
+ export declare function autoLayerText(layer: "rule" | "static" | "classifier"): string;
27
27
  /**
28
28
  * 命令参数里的模式:接受值(`auto-edit`)或显示名(`Accept edits`、`accept-edits`,大小写不敏感)。
29
29
  */
@@ -1,20 +1,27 @@
1
1
  /**
2
2
  * 六种权限模式的显示名、一行说明、界面顺序与 Shift+Tab 循环(§7.4)。
3
3
  *
4
- * 显示名用英文(与常见编码 Agent 的叫法一致),说明用界面语言(中文)。界面顺序就是选择器里
4
+ * 显示名用英文(与常见编码 Agent 的叫法一致),说明随界面语言(`msg().permissions`)。界面顺序就是选择器里
5
5
  * 数字快捷键 1–6 的顺序;`allowlist` 不在 Shift+Tab 循环里,只能显式选。
6
6
  */
7
+ import { msg } from "../i18n/index.js";
7
8
  import { PERMISSION_MODES_STRICT_FIRST } from "./types.js";
9
+ /** 说明随界面语言(取用时求值,不在 import 时定死)。 */
10
+ function info(label, key) {
11
+ return {
12
+ label,
13
+ get description() {
14
+ return msg().permissions.modeDescription[key];
15
+ },
16
+ };
17
+ }
8
18
  export const PERMISSION_MODE_INFO = {
9
- default: { label: "Manual", description: "写文件、执行命令前询问" },
10
- "auto-edit": { label: "Accept edits", description: "自动接受文件编辑,执行命令仍询问" },
11
- plan: { label: "Plan", description: "只读调研,只跑只读命令,出计划后审批执行" },
12
- auto: { label: "Auto", description: "由 ama 判断每一步:安全的自动放行,有风险的才问" },
13
- "full-auto": { label: "Bypass permissions", description: "全部放行(危险命令仍询问)" },
14
- allowlist: {
15
- label: "Allowlist only",
16
- description: "只放行 allow 规则命中的,其余拒绝,从不询问",
17
- },
19
+ default: info("Manual", "default"),
20
+ "auto-edit": info("Accept edits", "autoEdit"),
21
+ plan: info("Plan", "plan"),
22
+ auto: info("Auto", "auto"),
23
+ "full-auto": info("Bypass permissions", "fullAuto"),
24
+ allowlist: info("Allowlist only", "allowlist"),
18
25
  };
19
26
  /** 选择器顺序(数字快捷键 1–6)。 */
20
27
  export const PERMISSION_MODE_ORDER = [
@@ -60,12 +67,10 @@ export function permissionModeLines(current, configDefault) {
60
67
  return `${mark} ${i + 1}. ${info.label} (${mode}) — ${info.description}${tail}`;
61
68
  });
62
69
  }
63
- /** 审批对话框与提示里 auto 判定层的中文名。 */
64
- export const AUTO_LAYER_TEXT = {
65
- rule: "规则层",
66
- static: "静态判定",
67
- classifier: "分类器",
68
- };
70
+ /** 审批对话框与提示里 auto 判定层的名字(随界面语言)。 */
71
+ export function autoLayerText(layer) {
72
+ return msg().permissions.autoLayer[layer];
73
+ }
69
74
  /**
70
75
  * 命令参数里的模式:接受值(`auto-edit`)或显示名(`Accept edits`、`accept-edits`,大小写不敏感)。
71
76
  */
@@ -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;