@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
@@ -6,8 +6,10 @@
6
6
  * (未知字段等)。`path` 是 JSON 指针风格的字段路径(`permission.mode`、`hooks.PreToolUse[0]`)。
7
7
  */
8
8
  import { isAbsolute } from "node:path";
9
+ import { msg } from "../i18n/index.js";
9
10
  import { Checker, THINKING_LEVELS, checkSection, join, } from "./checker.js";
10
11
  import { W5_COMPACTION_KEYS, W5_CONFIG_KEYS, W5_UI_KEYS, checkCompactionW5, checkUiW5, validateConfigW5, } from "./schema-w5.js";
12
+ import { W6_CONFIG_KEYS, W6_UI_KEYS, checkOAuthEntry, checkProfileMemory, checkUiW6, validateConfigW6, } from "./schema-w6.js";
11
13
  import { HOOK_EVENTS } from "../hooks/types.js";
12
14
  import { PERMISSION_MODES_STRICT_FIRST } from "../permissions/types.js";
13
15
  import { WARMING_MODES } from "../ai/cache/types.js";
@@ -40,6 +42,7 @@ const CONFIG_KEYS = [
40
42
  "checkpoints",
41
43
  "sandbox",
42
44
  ...W5_CONFIG_KEYS,
45
+ ...W6_CONFIG_KEYS,
43
46
  "$schema",
44
47
  ];
45
48
  const PROVIDER_KEYS = [
@@ -69,7 +72,7 @@ function checkModels(c, value, path, channels) {
69
72
  if (value === undefined)
70
73
  return;
71
74
  if (!Array.isArray(value)) {
72
- c.error(path, "应为数组");
75
+ c.error(path, msg().config.schema.array);
73
76
  return;
74
77
  }
75
78
  value.forEach((item, index) => {
@@ -88,7 +91,7 @@ function checkModels(c, value, path, channels) {
88
91
  if (modelsDev !== undefined &&
89
92
  modelsDev !== false &&
90
93
  (typeof modelsDev !== "string" || !/^[^/]+\/.+$/.test(modelsDev))) {
91
- c.error(join(p, "modelsDev"), `应为 "provider/model" 或 false`);
94
+ c.error(join(p, "modelsDev"), msg().config.schema.modelsDev);
92
95
  }
93
96
  c.stringArray(item, "channels", p);
94
97
  const used = item["channels"];
@@ -97,9 +100,9 @@ function checkModels(c, value, path, channels) {
97
100
  if (typeof name !== "string")
98
101
  return;
99
102
  if (channels === undefined)
100
- c.error(join(join(p, "channels"), i), "供应商没有 channels");
103
+ c.error(join(join(p, "channels"), i), msg().config.schema.noChannels);
101
104
  else if (!channels.has(name))
102
- c.error(join(join(p, "channels"), i), `渠道 "${name}" 不存在(可用:${[...channels].join(", ")})`);
105
+ c.error(join(join(p, "channels"), i), msg().config.schema.unknownChannelOf(name, [...channels]));
103
106
  });
104
107
  }
105
108
  const promptCache = item["promptCache"];
@@ -112,7 +115,7 @@ function checkModels(c, value, path, channels) {
112
115
  const input = item["input"];
113
116
  if (input !== undefined &&
114
117
  (!Array.isArray(input) || input.some((m) => m !== "text" && m !== "image"))) {
115
- c.error(join(p, "input"), `应为 ("text" | "image")[]`);
118
+ c.error(join(p, "input"), msg().config.schema.modelInput);
116
119
  }
117
120
  });
118
121
  }
@@ -142,7 +145,7 @@ function checkChannels(c, value, path, builtin) {
142
145
  for (const [name, channel] of Object.entries(channels)) {
143
146
  const p = join(cp, name);
144
147
  if (!CHANNEL_NAME_PATTERN.test(name)) {
145
- c.error(p, "渠道名只能含字母、数字、_ 与 -(不含 / 与 @),最长 32");
148
+ c.error(p, msg().config.schema.channelName);
146
149
  continue;
147
150
  }
148
151
  names.add(name);
@@ -158,7 +161,7 @@ function checkChannels(c, value, path, builtin) {
158
161
  checkCompat(c, channel["compat"], join(p, "compat"));
159
162
  }
160
163
  if (names.size === 0 && Object.keys(channels).length === 0)
161
- c.error(cp, "至少要有一个渠道");
164
+ c.error(cp, msg().config.schema.atLeastOneChannel);
162
165
  checkDefaultChannel(c, value, path, names);
163
166
  return names;
164
167
  }
@@ -167,9 +170,9 @@ function checkDefaultChannel(c, value, path, names) {
167
170
  if (preferred === undefined)
168
171
  return;
169
172
  if (typeof preferred !== "string")
170
- c.error(join(path, "defaultChannel"), "应为字符串");
173
+ c.error(join(path, "defaultChannel"), msg().config.schema.string);
171
174
  else if (!names.has(preferred))
172
- c.error(join(path, "defaultChannel"), `渠道 "${preferred}" 不存在`);
175
+ c.error(join(path, "defaultChannel"), msg().config.schema.unknownChannel(preferred));
173
176
  }
174
177
  function checkProvider(c, value, path, id) {
175
178
  if (!c.object(value, path))
@@ -186,7 +189,7 @@ function checkProvider(c, value, path, id) {
186
189
  const builtin = BUILTIN_PROVIDERS.find((p) => p.id === id)?.channels?.map((ch) => ch.name);
187
190
  const channels = checkChannels(c, value, path, builtin ?? []);
188
191
  if (channels === undefined && value["defaultChannel"] !== undefined)
189
- c.error(join(path, "defaultChannel"), "没有 channels 时不能设 defaultChannel");
192
+ c.error(join(path, "defaultChannel"), msg().config.schema.defaultChannelWithoutChannels);
190
193
  checkModels(c, value["models"], join(path, "models"), channels);
191
194
  checkModels(c, value["modelOverrides"], join(path, "modelOverrides"), channels);
192
195
  }
@@ -215,7 +218,7 @@ export function validateConfig(value) {
215
218
  if (builtinDeny !== undefined &&
216
219
  typeof builtinDeny !== "boolean" &&
217
220
  (!Array.isArray(builtinDeny) || builtinDeny.some((item) => typeof item !== "string"))) {
218
- c.error(join(p, "builtinDeny"), "应为布尔值或字符串数组");
221
+ c.error(join(p, "builtinDeny"), msg().config.schema.builtinDeny);
219
222
  }
220
223
  });
221
224
  const compactionKeys = ["enabled", "reserveTokens", "keepRecentTokens", ...W5_COMPACTION_KEYS];
@@ -257,6 +260,7 @@ export function validateConfig(value) {
257
260
  "animation",
258
261
  "restoreOnCancel",
259
262
  ...W5_UI_KEYS,
263
+ ...W6_UI_KEYS,
260
264
  ], (s, p) => {
261
265
  c.oneOf(s, "theme", p, ["dark", "light", "auto"]);
262
266
  c.boolean(s, "markdown", p);
@@ -268,6 +272,7 @@ export function validateConfig(value) {
268
272
  c.boolean(s, "animation", p);
269
273
  c.boolean(s, "restoreOnCancel", p);
270
274
  checkUiW5(c, s, p);
275
+ checkUiW6(c, s, p);
271
276
  });
272
277
  checkSection(c, value, "skills", ["dirs"], (s, p) => c.stringArray(s, "dirs", p));
273
278
  checkSection(c, value, "request", ["idleTimeoutMs"], (s, p) => {
@@ -287,7 +292,7 @@ export function validateConfig(value) {
287
292
  if (Array.isArray(writable))
288
293
  writable.forEach((item, i) => {
289
294
  if (typeof item === "string" && !isAbsolute(item) && item !== "~" && !item.startsWith("~/"))
290
- c.warn(`${p}.writable[${i}]`, "应为绝对路径或 ~/…,已忽略");
295
+ c.warn(`${p}.writable[${i}]`, msg().config.schema.writablePath);
291
296
  });
292
297
  });
293
298
  checkSection(c, value, "cache", ["warming", "retention", "minSavingsUsd", "missNotices", "warmSubagents"], (s, p) => {
@@ -298,6 +303,7 @@ export function validateConfig(value) {
298
303
  c.boolean(s, "warmSubagents", p);
299
304
  });
300
305
  validateConfigW5(c, value);
306
+ validateConfigW6(c, value);
301
307
  return c.diagnostics;
302
308
  }
303
309
  // ---------------------------------------------------------------------------
@@ -311,7 +317,7 @@ export function validateAuthFile(value) {
311
317
  c.keys(value, "", ["version", "providers"]);
312
318
  const providers = value["providers"];
313
319
  if (providers === undefined) {
314
- c.error("providers", "缺少 providers");
320
+ c.error("providers", msg().config.schema.providersMissing);
315
321
  return c.diagnostics;
316
322
  }
317
323
  if (!c.object(providers, "providers"))
@@ -320,6 +326,10 @@ export function validateAuthFile(value) {
320
326
  const p = join("providers", id);
321
327
  if (!c.object(entry, p))
322
328
  continue;
329
+ if (entry["type"] === "oauth") {
330
+ checkOAuthEntry(c, entry, p);
331
+ continue;
332
+ }
323
333
  c.keys(entry, p, ["apiKey", "env", "baseUrl"]);
324
334
  c.string(entry, "apiKey", p, true);
325
335
  c.stringRecord(entry, "env", p);
@@ -351,6 +361,8 @@ export function validateProfile(value) {
351
361
  ...PROFILE_PATH_LIST_FIELDS,
352
362
  "authEnv",
353
363
  "trustProject",
364
+ "language",
365
+ "memory",
354
366
  "$schema",
355
367
  ]);
356
368
  for (const key of PROFILE_PATH_FIELDS)
@@ -359,6 +371,8 @@ export function validateProfile(value) {
359
371
  c.stringArray(value, key, "");
360
372
  c.boolean(value, "authEnv", "");
361
373
  c.boolean(value, "trustProject", "");
374
+ c.oneOf(value, "language", "", ["zh", "en"]);
375
+ checkProfileMemory(c, value);
362
376
  return c.diagnostics;
363
377
  }
364
378
  export function validateTrustFile(value) {
@@ -368,7 +382,7 @@ export function validateTrustFile(value) {
368
382
  c.version(value, "");
369
383
  const entries = value["entries"];
370
384
  if (!Array.isArray(entries)) {
371
- c.error("entries", "应为数组");
385
+ c.error("entries", msg().config.schema.array);
372
386
  return c.diagnostics;
373
387
  }
374
388
  entries.forEach((entry, index) => {
@@ -378,7 +392,7 @@ export function validateTrustFile(value) {
378
392
  c.string(entry, "path", p, true);
379
393
  c.string(entry, "at", p, true);
380
394
  if (typeof entry["trusted"] !== "boolean")
381
- c.error(join(p, "trusted"), "应为布尔值");
395
+ c.error(join(p, "trusted"), msg().config.schema.boolean);
382
396
  });
383
397
  return c.diagnostics;
384
398
  }
@@ -396,11 +410,11 @@ export function validateHookConfig(value) {
396
410
  for (const [event, groups] of Object.entries(hooks)) {
397
411
  const p = join("hooks", event);
398
412
  if (!HOOK_EVENTS.includes(event)) {
399
- c.error(p, `未知事件(可用:${HOOK_EVENTS.join(", ")})`);
413
+ c.error(p, msg().config.schema.hookEvent(HOOK_EVENTS));
400
414
  continue;
401
415
  }
402
416
  if (!Array.isArray(groups)) {
403
- c.error(p, "应为数组");
417
+ c.error(p, msg().config.schema.array);
404
418
  continue;
405
419
  }
406
420
  groups.forEach((group, gi) => {
@@ -411,7 +425,7 @@ export function validateHookConfig(value) {
411
425
  c.string(group, "matcher", gp);
412
426
  const commands = group["hooks"];
413
427
  if (!Array.isArray(commands)) {
414
- c.error(join(gp, "hooks"), "应为数组");
428
+ c.error(join(gp, "hooks"), msg().config.schema.array);
415
429
  return;
416
430
  }
417
431
  commands.forEach((command, ci) => {
@@ -420,10 +434,10 @@ export function validateHookConfig(value) {
420
434
  return;
421
435
  c.keys(command, cp, ["type", "command", "timeoutMs"]);
422
436
  if (command["type"] !== "command")
423
- c.error(join(cp, "type"), `type 必须为 "command"`);
437
+ c.error(join(cp, "type"), msg().config.schema.hookType);
424
438
  c.string(command, "command", cp, true);
425
439
  if (typeof command["command"] === "string" && command["command"].trim() === "") {
426
- c.error(join(cp, "command"), "命令为空");
440
+ c.error(join(cp, "command"), msg().config.schema.hookCommandEmpty);
427
441
  }
428
442
  c.number(command, "timeoutMs", cp, 1, HOOK_TIMEOUT_MAX_MS);
429
443
  });
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Settings registry (docs/wave6-plan.md §6.1, D24-D26). [W6-S]
3
+ *
4
+ * One row per key that the `/config` panel and `ama config set` treat as a scalar setting: group, apply
5
+ * tier (now / next session / restart), whether it changes the cache prefix, project-level writability
6
+ * (same rule as `restrictProjectConfig`, cross-checked by settings-registry.test.ts) and the env var that
7
+ * overrides it. Kind and enum options are derived from `buildConfigJsonSchema()` -- the table never
8
+ * repeats them; only `model` / `text` / `optionalNumber` refine the schema type.
9
+ *
10
+ * Keys that are lists or objects (providers, permission rules, tool lists, dirs, agents.<id>, hooks,
11
+ * auth) are not panel rows; `SETTING_HINTS` points to where they are edited instead.
12
+ */
13
+ export type SettingGroup = "ui" | "model" | "permission" | "tools" | "context" | "session" | "sandbox" | "agents" | "memory";
14
+ export declare const SETTING_GROUPS: readonly SettingGroup[];
15
+ /** `text` is a free string (`ui.replyLanguage`); `optionalNumber` may also be unset / a keyword. */
16
+ export type SettingKind = "bool" | "enum" | "number" | "optionalNumber" | "model" | "text";
17
+ export type SettingApply = "now" | "nextSession" | "restart";
18
+ /** deny: user / profile only; tighten: project may only make it stricter; any: project may set it. */
19
+ export type ProjectWritability = "deny" | "tighten" | "any";
20
+ export interface SettingSpec {
21
+ key: string;
22
+ group: SettingGroup;
23
+ kind: SettingKind;
24
+ /** Enum values (from the JSON Schema). */
25
+ options?: readonly string[];
26
+ /** Words accepted besides numbers (`compaction.prune.clearAtLeast: "auto"`). */
27
+ keywords?: readonly string[];
28
+ minimum?: number;
29
+ maximum?: number;
30
+ apply: SettingApply;
31
+ /** Changing it changes the cache prefix (system prompt, tool table or model). */
32
+ prefix?: boolean;
33
+ project: ProjectWritability;
34
+ /** Env var that overrides the value (the row shows as locked while it is set). */
35
+ envOverride?: string;
36
+ }
37
+ /** Keys edited elsewhere: key prefix -> hint id (messages `settings.hints`). */
38
+ export declare const SETTING_HINTS: readonly [{
39
+ readonly key: "providers";
40
+ readonly hint: "providers";
41
+ }, {
42
+ readonly key: "permission.allow";
43
+ readonly hint: "permissionRules";
44
+ }, {
45
+ readonly key: "tools.default";
46
+ readonly hint: "tools";
47
+ }, {
48
+ readonly key: "skills.dirs";
49
+ readonly hint: "dirs";
50
+ }, {
51
+ readonly key: "sandbox.writable";
52
+ readonly hint: "sandboxWritable";
53
+ }, {
54
+ readonly key: "agents.<id>";
55
+ readonly hint: "agents";
56
+ }, {
57
+ readonly key: "hooks";
58
+ readonly hint: "hooks";
59
+ }, {
60
+ readonly key: "auth.chatgpt";
61
+ readonly hint: "auth";
62
+ }];
63
+ export type SettingHintId = (typeof SETTING_HINTS)[number]["hint"];
64
+ type Schema = Record<string, unknown>;
65
+ /** Schema node of a dotted key (undefined when the key is not in the schema). */
66
+ export declare function schemaAt(key: string, root?: Schema): Schema | undefined;
67
+ /** All settings, panel order. */
68
+ export declare function settingsRegistry(): readonly SettingSpec[];
69
+ export declare function settingSpec(key: string): SettingSpec | undefined;
70
+ /** Keys `ama config set` accepts (documented leaves minus file metadata). */
71
+ export declare function settableKeys(): string[];
72
+ /** Built-in default of a key (undefined when it is unset or decided at run time). */
73
+ export declare function settingDefault(key: string): unknown;
74
+ /** Description of a key in the UI language (`keyDoc`, [W6-I4]). */
75
+ export declare function settingDoc(key: string): string | undefined;
76
+ /** Rule text for a key whose default is decided at run time, in the UI language. */
77
+ export declare function settingDynamicDefault(key: string): string | undefined;
78
+ export {};
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Settings registry (docs/wave6-plan.md §6.1, D24-D26). [W6-S]
3
+ *
4
+ * One row per key that the `/config` panel and `ama config set` treat as a scalar setting: group, apply
5
+ * tier (now / next session / restart), whether it changes the cache prefix, project-level writability
6
+ * (same rule as `restrictProjectConfig`, cross-checked by settings-registry.test.ts) and the env var that
7
+ * overrides it. Kind and enum options are derived from `buildConfigJsonSchema()` -- the table never
8
+ * repeats them; only `model` / `text` / `optionalNumber` refine the schema type.
9
+ *
10
+ * Keys that are lists or objects (providers, permission rules, tool lists, dirs, agents.<id>, hooks,
11
+ * auth) are not panel rows; `SETTING_HINTS` points to where they are edited instead.
12
+ */
13
+ import { buildConfigJsonSchema } from "./json-schema.js";
14
+ import { defaultFor, documentedLeaves, dynamicDefaults, isDynamicDefault, keyDoc, } from "./key-docs.js";
15
+ export const SETTING_GROUPS = [
16
+ "ui",
17
+ "model",
18
+ "permission",
19
+ "tools",
20
+ "context",
21
+ "session",
22
+ "sandbox",
23
+ "agents",
24
+ "memory",
25
+ ];
26
+ const row = (key, group, apply, project, extra = {}) => ({ key, group, apply, project, ...extra });
27
+ /** Panel order = table order. */
28
+ const ROWS = [
29
+ row("ui.theme", "ui", "restart", "any"),
30
+ row("ui.markdown", "ui", "now", "any"),
31
+ row("ui.showThinking", "ui", "now", "any"),
32
+ row("ui.compact", "ui", "now", "any"),
33
+ row("ui.animation", "ui", "now", "any"),
34
+ row("ui.statusLine", "ui", "now", "any"),
35
+ row("ui.restoreOnCancel", "ui", "nextSession", "any"),
36
+ row("ui.quietStartup", "ui", "restart", "any"),
37
+ row("ui.ascii", "ui", "restart", "any", { envOverride: "AMA_ASCII" }),
38
+ row("ui.language", "ui", "restart", "any", { envOverride: "AMA_LANG" }),
39
+ row("ui.replyLanguage", "ui", "nextSession", "deny", { kind: "text", prefix: true }),
40
+ row("ui.agentBar", "ui", "restart", "any"),
41
+ row("defaultModel", "model", "now", "deny", { kind: "model", prefix: true }),
42
+ row("thinkingLevel", "model", "now", "deny", { prefix: true }),
43
+ row("fallbackModel", "model", "nextSession", "deny", { kind: "model" }),
44
+ row("plan.model", "model", "nextSession", "deny", { kind: "model" }),
45
+ row("plan.thinkingLevel", "model", "nextSession", "deny"),
46
+ row("subagents.defaultModel", "model", "nextSession", "deny", { kind: "model" }),
47
+ row("models.aliases.fast", "model", "nextSession", "deny", { kind: "model" }),
48
+ row("models.aliases.strong", "model", "nextSession", "deny", { kind: "model" }),
49
+ row("permission.mode", "permission", "now", "tighten"),
50
+ row("permission.autoModel", "permission", "nextSession", "deny", { kind: "model" }),
51
+ row("plan.bash", "permission", "nextSession", "tighten"),
52
+ row("plan.unattended", "permission", "nextSession", "deny"),
53
+ row("tools.preset", "tools", "restart", "tighten", { prefix: true }),
54
+ row("codemode.mode", "tools", "restart", "tighten", { prefix: true }),
55
+ row("codemode.inlineBudget", "tools", "restart", "deny", { prefix: true }),
56
+ row("codemode.requireStrict", "tools", "restart", "deny"),
57
+ row("tools.maxToolResultChars", "tools", "nextSession", "deny"),
58
+ row("tools.bashTimeoutMs", "tools", "restart", "deny"),
59
+ row("images.resize", "tools", "restart", "deny"),
60
+ row("hooks.timeoutMs", "tools", "restart", "deny"),
61
+ row("compaction.enabled", "context", "now", "any"),
62
+ row("compaction.reserveTokens", "context", "nextSession", "any"),
63
+ row("compaction.keepRecentTokens", "context", "nextSession", "any"),
64
+ row("compaction.prune.keepResults", "context", "nextSession", "deny"),
65
+ row("compaction.prune.clearAtLeast", "context", "nextSession", "deny"),
66
+ row("cache.warming", "context", "now", "deny", { envOverride: "AMA_CACHE_WARMING" }),
67
+ row("cache.retention", "context", "nextSession", "deny", { envOverride: "AMA_CACHE_RETENTION" }),
68
+ row("cache.minSavingsUsd", "context", "nextSession", "deny"),
69
+ row("cache.missNotices", "context", "nextSession", "deny"),
70
+ row("cache.warmSubagents", "context", "nextSession", "deny"),
71
+ row("request.idleTimeoutMs", "context", "nextSession", "deny", {
72
+ envOverride: "AMA_IDLE_TIMEOUT_MS",
73
+ }),
74
+ row("retry.enabled", "context", "now", "deny"),
75
+ row("retry.maxRetries", "context", "nextSession", "deny"),
76
+ row("retry.baseDelayMs", "context", "nextSession", "deny"),
77
+ row("retry.maxDelayMs", "context", "nextSession", "deny"),
78
+ row("limits.maxTurns", "session", "nextSession", "deny", { kind: "optionalNumber" }),
79
+ row("limits.maxCostUsd", "session", "nextSession", "deny", { kind: "optionalNumber" }),
80
+ row("reminders.todo", "session", "nextSession", "any"),
81
+ row("reminders.fileChanges", "session", "nextSession", "any"),
82
+ row("reminders.contextPressure", "session", "nextSession", "any"),
83
+ row("reminders.budget", "session", "nextSession", "any"),
84
+ row("todo.reminder", "session", "nextSession", "deny"),
85
+ row("checkpoints.mode", "session", "restart", "tighten", { envOverride: "AMA_CHECKPOINTS" }),
86
+ row("checkpoints.maxFileBytes", "session", "restart", "tighten"),
87
+ row("checkpoints.keep", "session", "restart", "deny"),
88
+ row("sandbox.enabled", "sandbox", "restart", "deny", { envOverride: "AMA_SANDBOX" }),
89
+ row("sandbox.bash", "sandbox", "restart", "deny"),
90
+ row("sandbox.network", "sandbox", "restart", "tighten"),
91
+ row("agents.maxConcurrent", "agents", "restart", "deny"),
92
+ row("agents.sessionBudgetUsd", "agents", "nextSession", "deny", { kind: "optionalNumber" }),
93
+ row("subagents.maxConcurrent", "agents", "nextSession", "deny"),
94
+ row("subagents.maxPending", "agents", "nextSession", "deny"),
95
+ // [W6-M]
96
+ row("memory.enabled", "memory", "nextSession", "tighten", { envOverride: "AMA_MEMORY" }),
97
+ row("memory.subagents", "memory", "nextSession", "deny"),
98
+ ];
99
+ /** Keys edited elsewhere: key prefix -> hint id (messages `settings.hints`). */
100
+ export const SETTING_HINTS = [
101
+ { key: "providers", hint: "providers" },
102
+ { key: "permission.allow", hint: "permissionRules" },
103
+ { key: "tools.default", hint: "tools" },
104
+ { key: "skills.dirs", hint: "dirs" },
105
+ { key: "sandbox.writable", hint: "sandboxWritable" },
106
+ { key: "agents.<id>", hint: "agents" },
107
+ { key: "hooks", hint: "hooks" },
108
+ { key: "auth.chatgpt", hint: "auth" },
109
+ ];
110
+ /** Schema node of a dotted key (undefined when the key is not in the schema). */
111
+ export function schemaAt(key, root = buildConfigJsonSchema()) {
112
+ let node = root;
113
+ for (const part of key.split(".")) {
114
+ const properties = node?.["properties"];
115
+ node = properties?.[part];
116
+ if (node === undefined)
117
+ return undefined;
118
+ }
119
+ return node;
120
+ }
121
+ function numberBounds(schema) {
122
+ const out = {};
123
+ if (typeof schema["minimum"] === "number")
124
+ out.minimum = schema["minimum"];
125
+ if (typeof schema["maximum"] === "number")
126
+ out.maximum = schema["maximum"];
127
+ return out;
128
+ }
129
+ /** Fill kind / options / bounds from the schema node. */
130
+ function derive(entry, root) {
131
+ const schema = schemaAt(entry.key, root);
132
+ if (schema === undefined)
133
+ throw new Error(`settings registry: ${entry.key} is not in the schema`);
134
+ const spec = { ...entry, kind: entry.kind ?? "text" };
135
+ const anyOf = schema["anyOf"];
136
+ if (schema["type"] === "boolean")
137
+ spec.kind = "bool";
138
+ else if (Array.isArray(schema["enum"])) {
139
+ spec.kind = "enum";
140
+ spec.options = schema["enum"];
141
+ }
142
+ else if (schema["type"] === "number") {
143
+ if (entry.kind !== "optionalNumber")
144
+ spec.kind = "number";
145
+ Object.assign(spec, numberBounds(schema));
146
+ }
147
+ else if (anyOf !== undefined) {
148
+ spec.kind = "optionalNumber";
149
+ spec.keywords = anyOf.flatMap((s) => (typeof s["const"] === "string" ? [s["const"]] : []));
150
+ const numeric = anyOf.find((s) => s["type"] === "number");
151
+ if (numeric !== undefined)
152
+ Object.assign(spec, numberBounds(numeric));
153
+ }
154
+ return spec;
155
+ }
156
+ let cache;
157
+ /** All settings, panel order. */
158
+ export function settingsRegistry() {
159
+ if (cache === undefined) {
160
+ const root = buildConfigJsonSchema();
161
+ cache = Object.freeze(ROWS.map((entry) => Object.freeze(derive(entry, root))));
162
+ }
163
+ return cache;
164
+ }
165
+ export function settingSpec(key) {
166
+ return settingsRegistry().find((spec) => spec.key === key);
167
+ }
168
+ /** Keys `ama config set` accepts (documented leaves minus file metadata). */
169
+ export function settableKeys() {
170
+ return documentedLeaves().filter((key) => key !== "$schema" && key !== "version");
171
+ }
172
+ /** Built-in default of a key (undefined when it is unset or decided at run time). */
173
+ export function settingDefault(key) {
174
+ return isDynamicDefault(key) ? undefined : defaultFor(key);
175
+ }
176
+ /** Description of a key in the UI language (`keyDoc`, [W6-I4]). */
177
+ export function settingDoc(key) {
178
+ return keyDoc(key);
179
+ }
180
+ /** Rule text for a key whose default is decided at run time, in the UI language. */
181
+ export function settingDynamicDefault(key) {
182
+ const rules = dynamicDefaults();
183
+ return Object.hasOwn(rules, key) ? rules[key] : undefined;
184
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * 第六波配置键的形状(docs/wave6-plan.md §7、§1.3、§3.1、§4.3、§4.4、§5.2)。[W6-C0] 契约文件:C0 只定形状、
3
+ * 校验(schema-w6.ts)、说明与缺省(key-docs.ts)、JSON Schema;行为由各批次实现,未实现前这些键被接受但不起作用。
4
+ *
5
+ * 层级(merge.ts):项目级可设 `ui.language`、`ui.agentBar`,`memory` 只接受 `enabled: false`;`ui.replyLanguage`、
6
+ * `memory` 其余键、`auth` 只认用户级 / profile(项目级忽略并 warning)。
7
+ */
8
+ /** `ui.language`:auto 按 `LC_ALL` / `LC_MESSAGES` / `LANG` 判断,判断不出用 en(docs/i18n.md)。 */
9
+ export type LanguageSetting = "auto" | "zh" | "en";
10
+ export declare const LANGUAGE_SETTINGS: readonly LanguageSetting[];
11
+ /** [W6-A] Agent 栏:auto 有任务时显示;off 不显示(嵌入宿主缺省 off)。 */
12
+ export type AgentBarMode = "auto" | "off";
13
+ export declare const AGENT_BAR_MODES: readonly AgentBarMode[];
14
+ /** 第六波在 `ui` 段新增的键。 */
15
+ export interface UiConfigW6 {
16
+ /** 界面语言,缺省 auto;`AMA_LANG` / `--lang` 覆盖;项目级可设。 */
17
+ language?: LanguageSetting;
18
+ /**
19
+ * [D22] 模型回复语言(如 `Chinese`):设置时会话开始在 `rules` 节末尾追加一句英文规则;不设零字节变化。
20
+ * 只认用户级 / profile。
21
+ */
22
+ replyLanguage?: string;
23
+ /** [W6-A] Agent 栏,缺省 auto;嵌入宿主(有 profile)缺省 off。 */
24
+ agentBar?: AgentBarMode;
25
+ }
26
+ /** [W6-M] 记忆作用域:独立终端 user / project;嵌入宿主只有 workspace(profile.memory.dir)。 */
27
+ export type MemoryScopeName = "user" | "project";
28
+ export declare const MEMORY_SCOPES: readonly MemoryScopeName[];
29
+ export declare const MEMORY_SUBAGENT_MODES: readonly ["off", "read"];
30
+ /** [W6-M] `memory` 段(docs/wave6-plan.md §3.1)。缺省关闭;关闭时系统提示、工具表、请求体逐字节不变。 */
31
+ export interface MemoryConfig {
32
+ /** 总开关,缺省 false;项目级只能设为 false;`--memory` / `--no-memory`、`AMA_MEMORY=0|1` 覆盖。 */
33
+ enabled?: boolean;
34
+ /** 启用的作用域,缺省 ["user", "project"]。 */
35
+ scopes?: MemoryScopeName[];
36
+ /** 每作用域索引注入的硬顶(字节),缺省 4096。 */
37
+ indexMaxBytes?: number;
38
+ /** 单条记忆上限(字节),超出拒写,缺省 16384。 */
39
+ fileMaxBytes?: number;
40
+ /** 每作用域条目上限,缺省 200。 */
41
+ maxFiles?: number;
42
+ /** 子会话:read(缺省,写命令执行层拒绝)/ off(view 也拒绝)。 */
43
+ subagents?: (typeof MEMORY_SUBAGENT_MODES)[number];
44
+ }
45
+ /** [W6-O] ChatGPT 登录的两条路径(docs/wave6-plan.md §4.1、D13)。 */
46
+ export type ChatGptFlavor = "siwc" | "codex";
47
+ export declare const CHATGPT_FLAVORS: readonly ChatGptFlavor[];
48
+ /** [W6-O] `auth.chatgpt`:不含密钥;只认用户级 / profile。 */
49
+ export interface ChatGptAuthConfig {
50
+ /** 缺省 siwc(官方动态注册);codex 是显式开启的备用。 */
51
+ flavor?: ChatGptFlavor;
52
+ clientId?: string;
53
+ issuer?: string;
54
+ /** codex flavor 的 `originator` 请求头,缺省 codex_cli_rs。 */
55
+ originator?: string;
56
+ /** 本地回调端口(依次尝试;0 = 任意空闲端口)。 */
57
+ redirectPorts?: number[];
58
+ }
59
+ /** [W6-O] `auth` 段。 */
60
+ export interface AuthConfig {
61
+ chatgpt?: ChatGptAuthConfig;
62
+ }
63
+ /** 第六波并入 `AmaConfig` 的顶层段。 */
64
+ export interface AmaConfigW6 {
65
+ memory?: MemoryConfig;
66
+ auth?: AuthConfig;
67
+ }
68
+ /**
69
+ * [W6-M] profile / SDK 的 `memory`(D11):嵌入宿主缺省禁用;`enabled: true` 时 `dir` 必填(绝对路径),
70
+ * 作用域只有 `workspace`,不读用户级记忆。
71
+ */
72
+ export interface ProfileMemoryOptions {
73
+ enabled: boolean;
74
+ dir?: string;
75
+ }
76
+ /** auth.json 里的 API key 条目(第一期起的形态)。 */
77
+ export interface ApiKeyAuthEntry {
78
+ apiKey: string;
79
+ env?: Record<string, string>;
80
+ baseUrl?: string;
81
+ }
82
+ /**
83
+ * [W6-O] auth.json 里的 OAuth 条目(docs/wave6-plan.md §4.3、D15)。token 与 id_token 原文绝不进日志、错误、
84
+ * 事件、会话;`describeAuthFile` 只给 `{ kind: "oauth", flavor, plan, expiresIn, needsLogin }`。
85
+ */
86
+ export interface OAuthAuthEntry {
87
+ type: "oauth";
88
+ flavor: ChatGptFlavor;
89
+ clientId?: string;
90
+ issuer?: string;
91
+ accountId?: string;
92
+ planType?: string;
93
+ email?: string;
94
+ accessToken: string;
95
+ refreshToken: string;
96
+ idToken?: string;
97
+ /** epoch ms。 */
98
+ expiresAt: number;
99
+ /** ISO 8601。 */
100
+ lastRefresh?: string;
101
+ /** codex flavor 首次登录的非官方用法确认时刻(ISO 8601)。 */
102
+ acknowledgedAt?: string;
103
+ /** 刷新永久失败:保留 token,等用户重新登录(错误 `auth_expired`)。 */
104
+ needsLogin?: boolean;
105
+ }
106
+ export type AuthFileEntry = ApiKeyAuthEntry | OAuthAuthEntry;
107
+ export declare function isOAuthEntry(entry: AuthFileEntry | undefined): entry is OAuthAuthEntry;
108
+ /** API key 条目(OAuth 条目返回 undefined)。 */
109
+ export declare function apiKeyEntry(entry: AuthFileEntry | undefined): ApiKeyAuthEntry | undefined;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 第六波配置键的形状(docs/wave6-plan.md §7、§1.3、§3.1、§4.3、§4.4、§5.2)。[W6-C0] 契约文件:C0 只定形状、
3
+ * 校验(schema-w6.ts)、说明与缺省(key-docs.ts)、JSON Schema;行为由各批次实现,未实现前这些键被接受但不起作用。
4
+ *
5
+ * 层级(merge.ts):项目级可设 `ui.language`、`ui.agentBar`,`memory` 只接受 `enabled: false`;`ui.replyLanguage`、
6
+ * `memory` 其余键、`auth` 只认用户级 / profile(项目级忽略并 warning)。
7
+ */
8
+ export const LANGUAGE_SETTINGS = ["auto", "zh", "en"];
9
+ export const AGENT_BAR_MODES = ["auto", "off"];
10
+ export const MEMORY_SCOPES = ["user", "project"];
11
+ export const MEMORY_SUBAGENT_MODES = ["off", "read"];
12
+ export const CHATGPT_FLAVORS = ["siwc", "codex"];
13
+ export function isOAuthEntry(entry) {
14
+ return entry !== undefined && entry.type === "oauth";
15
+ }
16
+ /** API key 条目(OAuth 条目返回 undefined)。 */
17
+ export function apiKeyEntry(entry) {
18
+ return entry === undefined || isOAuthEntry(entry) ? undefined : entry;
19
+ }