agim-cli 1.2.45 → 1.2.49

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 (434) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/README.md +40 -6
  3. package/README.zh-CN.md +40 -6
  4. package/dist/cli-ui/config-wizard.js +16 -2
  5. package/dist/cli-ui/config-wizard.js.map +1 -1
  6. package/dist/cli-ui/diag.d.ts +29 -0
  7. package/dist/cli-ui/diag.d.ts.map +1 -0
  8. package/dist/cli-ui/diag.js +135 -0
  9. package/dist/cli-ui/diag.js.map +1 -0
  10. package/dist/cli-ui/i18n.d.ts +38 -0
  11. package/dist/cli-ui/i18n.d.ts.map +1 -1
  12. package/dist/cli-ui/i18n.js +101 -0
  13. package/dist/cli-ui/i18n.js.map +1 -1
  14. package/dist/cli-ui/setup-llm.d.ts +30 -0
  15. package/dist/cli-ui/setup-llm.d.ts.map +1 -0
  16. package/dist/cli-ui/setup-llm.js +460 -0
  17. package/dist/cli-ui/setup-llm.js.map +1 -0
  18. package/dist/cli-ui/setup-mcp.d.ts +19 -0
  19. package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
  20. package/dist/cli-ui/setup-mcp.js +308 -0
  21. package/dist/cli-ui/setup-mcp.js.map +1 -0
  22. package/dist/cli-ui/token-menu.js +2 -2
  23. package/dist/cli-ui/token-menu.js.map +1 -1
  24. package/dist/cli.js +121 -22
  25. package/dist/cli.js.map +1 -1
  26. package/dist/core/access-token.d.ts +16 -5
  27. package/dist/core/access-token.d.ts.map +1 -1
  28. package/dist/core/access-token.js +82 -13
  29. package/dist/core/access-token.js.map +1 -1
  30. package/dist/core/agent-cwd.d.ts.map +1 -1
  31. package/dist/core/agent-cwd.js +74 -0
  32. package/dist/core/agent-cwd.js.map +1 -1
  33. package/dist/core/approval-bus.d.ts +22 -0
  34. package/dist/core/approval-bus.d.ts.map +1 -1
  35. package/dist/core/approval-bus.js +93 -0
  36. package/dist/core/approval-bus.js.map +1 -1
  37. package/dist/core/ask-user-router.d.ts +24 -0
  38. package/dist/core/ask-user-router.d.ts.map +1 -0
  39. package/dist/core/ask-user-router.js +84 -0
  40. package/dist/core/ask-user-router.js.map +1 -0
  41. package/dist/core/ask-user-rpc.d.ts +80 -0
  42. package/dist/core/ask-user-rpc.d.ts.map +1 -0
  43. package/dist/core/ask-user-rpc.js +388 -0
  44. package/dist/core/ask-user-rpc.js.map +1 -0
  45. package/dist/core/audit-log.d.ts +1 -1
  46. package/dist/core/audit-log.d.ts.map +1 -1
  47. package/dist/core/audit-log.js.map +1 -1
  48. package/dist/core/commands/builtin.d.ts.map +1 -1
  49. package/dist/core/commands/builtin.js +21 -5
  50. package/dist/core/commands/builtin.js.map +1 -1
  51. package/dist/core/commands/goal.d.ts +3 -0
  52. package/dist/core/commands/goal.d.ts.map +1 -0
  53. package/dist/core/commands/goal.js +240 -0
  54. package/dist/core/commands/goal.js.map +1 -0
  55. package/dist/core/commands/heartbeat.d.ts +3 -0
  56. package/dist/core/commands/heartbeat.d.ts.map +1 -0
  57. package/dist/core/commands/heartbeat.js +219 -0
  58. package/dist/core/commands/heartbeat.js.map +1 -0
  59. package/dist/core/commands/router-compare.d.ts +3 -0
  60. package/dist/core/commands/router-compare.d.ts.map +1 -0
  61. package/dist/core/commands/router-compare.js +81 -0
  62. package/dist/core/commands/router-compare.js.map +1 -0
  63. package/dist/core/commands/router.d.ts.map +1 -1
  64. package/dist/core/commands/router.js +9 -1
  65. package/dist/core/commands/router.js.map +1 -1
  66. package/dist/core/commands/skill.d.ts +3 -0
  67. package/dist/core/commands/skill.d.ts.map +1 -0
  68. package/dist/core/commands/skill.js +91 -0
  69. package/dist/core/commands/skill.js.map +1 -0
  70. package/dist/core/config-schema.d.ts +28 -0
  71. package/dist/core/config-schema.d.ts.map +1 -1
  72. package/dist/core/config-schema.js +124 -0
  73. package/dist/core/config-schema.js.map +1 -1
  74. package/dist/core/goals.d.ts +81 -0
  75. package/dist/core/goals.d.ts.map +1 -0
  76. package/dist/core/goals.js +361 -0
  77. package/dist/core/goals.js.map +1 -0
  78. package/dist/core/heartbeat-store.d.ts +90 -0
  79. package/dist/core/heartbeat-store.d.ts.map +1 -0
  80. package/dist/core/heartbeat-store.js +302 -0
  81. package/dist/core/heartbeat-store.js.map +1 -0
  82. package/dist/core/heartbeat.d.ts +35 -0
  83. package/dist/core/heartbeat.d.ts.map +1 -0
  84. package/dist/core/heartbeat.js +332 -0
  85. package/dist/core/heartbeat.js.map +1 -0
  86. package/dist/core/intent-llm.d.ts +9 -0
  87. package/dist/core/intent-llm.d.ts.map +1 -1
  88. package/dist/core/intent-llm.js +77 -32
  89. package/dist/core/intent-llm.js.map +1 -1
  90. package/dist/core/llm/agent-loop.d.ts +112 -0
  91. package/dist/core/llm/agent-loop.d.ts.map +1 -0
  92. package/dist/core/llm/agent-loop.js +313 -0
  93. package/dist/core/llm/agent-loop.js.map +1 -0
  94. package/dist/core/llm/anthropic-provider.d.ts +53 -0
  95. package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
  96. package/dist/core/llm/anthropic-provider.js +339 -0
  97. package/dist/core/llm/anthropic-provider.js.map +1 -0
  98. package/dist/core/llm/auto-compact.d.ts +35 -0
  99. package/dist/core/llm/auto-compact.d.ts.map +1 -0
  100. package/dist/core/llm/auto-compact.js +149 -0
  101. package/dist/core/llm/auto-compact.js.map +1 -0
  102. package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
  103. package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
  104. package/dist/core/llm/builtin-dispatcher.js +196 -0
  105. package/dist/core/llm/builtin-dispatcher.js.map +1 -0
  106. package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
  107. package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
  108. package/dist/core/llm/imhub-dispatcher.js +308 -0
  109. package/dist/core/llm/imhub-dispatcher.js.map +1 -0
  110. package/dist/core/llm/index.d.ts +11 -0
  111. package/dist/core/llm/index.d.ts.map +1 -0
  112. package/dist/core/llm/index.js +16 -0
  113. package/dist/core/llm/index.js.map +1 -0
  114. package/dist/core/llm/introspection.d.ts +73 -0
  115. package/dist/core/llm/introspection.d.ts.map +1 -0
  116. package/dist/core/llm/introspection.js +90 -0
  117. package/dist/core/llm/introspection.js.map +1 -0
  118. package/dist/core/llm/mcp-client.d.ts +80 -0
  119. package/dist/core/llm/mcp-client.d.ts.map +1 -0
  120. package/dist/core/llm/mcp-client.js +270 -0
  121. package/dist/core/llm/mcp-client.js.map +1 -0
  122. package/dist/core/llm/mcp-registry.d.ts +57 -0
  123. package/dist/core/llm/mcp-registry.d.ts.map +1 -0
  124. package/dist/core/llm/mcp-registry.js +155 -0
  125. package/dist/core/llm/mcp-registry.js.map +1 -0
  126. package/dist/core/llm/openai-compat-provider.d.ts +65 -0
  127. package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
  128. package/dist/core/llm/openai-compat-provider.js +451 -0
  129. package/dist/core/llm/openai-compat-provider.js.map +1 -0
  130. package/dist/core/llm/policy-approval-gate.d.ts +30 -0
  131. package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
  132. package/dist/core/llm/policy-approval-gate.js +86 -0
  133. package/dist/core/llm/policy-approval-gate.js.map +1 -0
  134. package/dist/core/llm/provider-base.d.ts +302 -0
  135. package/dist/core/llm/provider-base.d.ts.map +1 -0
  136. package/dist/core/llm/provider-base.js +222 -0
  137. package/dist/core/llm/provider-base.js.map +1 -0
  138. package/dist/core/llm/registry.d.ts +44 -0
  139. package/dist/core/llm/registry.d.ts.map +1 -0
  140. package/dist/core/llm/registry.js +160 -0
  141. package/dist/core/llm/registry.js.map +1 -0
  142. package/dist/core/llm/secrets.d.ts +46 -0
  143. package/dist/core/llm/secrets.d.ts.map +1 -0
  144. package/dist/core/llm/secrets.js +157 -0
  145. package/dist/core/llm/secrets.js.map +1 -0
  146. package/dist/core/llm/tool-dispatcher.d.ts +37 -0
  147. package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
  148. package/dist/core/llm/tool-dispatcher.js +85 -0
  149. package/dist/core/llm/tool-dispatcher.js.map +1 -0
  150. package/dist/core/memory-consolidate.d.ts.map +1 -1
  151. package/dist/core/memory-consolidate.js +38 -23
  152. package/dist/core/memory-consolidate.js.map +1 -1
  153. package/dist/core/memory-distill.d.ts.map +1 -1
  154. package/dist/core/memory-distill.js +51 -25
  155. package/dist/core/memory-distill.js.map +1 -1
  156. package/dist/core/memory-rpc.d.ts.map +1 -1
  157. package/dist/core/memory-rpc.js +6 -0
  158. package/dist/core/memory-rpc.js.map +1 -1
  159. package/dist/core/message-sink.d.ts.map +1 -1
  160. package/dist/core/message-sink.js +76 -0
  161. package/dist/core/message-sink.js.map +1 -1
  162. package/dist/core/notification-evaluator.d.ts +49 -0
  163. package/dist/core/notification-evaluator.d.ts.map +1 -0
  164. package/dist/core/notification-evaluator.js +232 -0
  165. package/dist/core/notification-evaluator.js.map +1 -0
  166. package/dist/core/onboarding.d.ts.map +1 -1
  167. package/dist/core/onboarding.js +10 -0
  168. package/dist/core/onboarding.js.map +1 -1
  169. package/dist/core/persona.d.ts +10 -0
  170. package/dist/core/persona.d.ts.map +1 -1
  171. package/dist/core/persona.js +28 -14
  172. package/dist/core/persona.js.map +1 -1
  173. package/dist/core/push-rpc.d.ts +8 -0
  174. package/dist/core/push-rpc.d.ts.map +1 -1
  175. package/dist/core/push-rpc.js +41 -1
  176. package/dist/core/push-rpc.js.map +1 -1
  177. package/dist/core/registry.d.ts.map +1 -1
  178. package/dist/core/registry.js +11 -0
  179. package/dist/core/registry.js.map +1 -1
  180. package/dist/core/render-router.d.ts.map +1 -1
  181. package/dist/core/render-router.js +23 -6
  182. package/dist/core/render-router.js.map +1 -1
  183. package/dist/core/router-compare.d.ts +76 -0
  184. package/dist/core/router-compare.d.ts.map +1 -0
  185. package/dist/core/router-compare.js +253 -0
  186. package/dist/core/router-compare.js.map +1 -0
  187. package/dist/core/router.d.ts.map +1 -1
  188. package/dist/core/router.js +25 -1
  189. package/dist/core/router.js.map +1 -1
  190. package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
  191. package/dist/core/skills/loader.d.ts +120 -0
  192. package/dist/core/skills/loader.d.ts.map +1 -0
  193. package/dist/core/skills/loader.js +577 -0
  194. package/dist/core/skills/loader.js.map +1 -0
  195. package/dist/core/skills-rpc.d.ts +44 -0
  196. package/dist/core/skills-rpc.d.ts.map +1 -0
  197. package/dist/core/skills-rpc.js +71 -0
  198. package/dist/core/skills-rpc.js.map +1 -0
  199. package/dist/core/types.d.ts +35 -0
  200. package/dist/core/types.d.ts.map +1 -1
  201. package/dist/core/util/format-age.d.ts +20 -0
  202. package/dist/core/util/format-age.d.ts.map +1 -0
  203. package/dist/core/util/format-age.js +86 -0
  204. package/dist/core/util/format-age.js.map +1 -0
  205. package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
  206. package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
  207. package/dist/plugins/agents/acp/acp-adapter.js +12 -0
  208. package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
  209. package/dist/plugins/agents/antigravity/index.d.ts +1 -0
  210. package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
  211. package/dist/plugins/agents/antigravity/index.js +1 -0
  212. package/dist/plugins/agents/antigravity/index.js.map +1 -1
  213. package/dist/plugins/agents/claude-code/index.d.ts +1 -0
  214. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
  215. package/dist/plugins/agents/claude-code/index.js +1 -0
  216. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  217. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
  218. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
  219. package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
  220. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
  221. package/dist/plugins/agents/codex/index.d.ts +1 -0
  222. package/dist/plugins/agents/codex/index.d.ts.map +1 -1
  223. package/dist/plugins/agents/codex/index.js +1 -0
  224. package/dist/plugins/agents/codex/index.js.map +1 -1
  225. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +43 -0
  226. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -0
  227. package/dist/plugins/agents/cursor/ensure-mcp-config.js +99 -0
  228. package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -0
  229. package/dist/plugins/agents/cursor/index.d.ts +28 -0
  230. package/dist/plugins/agents/cursor/index.d.ts.map +1 -0
  231. package/dist/plugins/agents/cursor/index.js +290 -0
  232. package/dist/plugins/agents/cursor/index.js.map +1 -0
  233. package/dist/plugins/agents/native/index.d.ts +34 -0
  234. package/dist/plugins/agents/native/index.d.ts.map +1 -0
  235. package/dist/plugins/agents/native/index.js +598 -0
  236. package/dist/plugins/agents/native/index.js.map +1 -0
  237. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
  238. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
  239. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
  240. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
  241. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
  242. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
  243. package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
  244. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  245. package/dist/web/agim-skills-api.d.ts +4 -0
  246. package/dist/web/agim-skills-api.d.ts.map +1 -0
  247. package/dist/web/agim-skills-api.js +150 -0
  248. package/dist/web/agim-skills-api.js.map +1 -0
  249. package/dist/web/background-tasks-api.d.ts +7 -0
  250. package/dist/web/background-tasks-api.d.ts.map +1 -0
  251. package/dist/web/background-tasks-api.js +225 -0
  252. package/dist/web/background-tasks-api.js.map +1 -0
  253. package/dist/web/llm-api.d.ts +8 -0
  254. package/dist/web/llm-api.d.ts.map +1 -0
  255. package/dist/web/llm-api.js +300 -0
  256. package/dist/web/llm-api.js.map +1 -0
  257. package/dist/web/mcp-api.d.ts +8 -0
  258. package/dist/web/mcp-api.d.ts.map +1 -0
  259. package/dist/web/mcp-api.js +205 -0
  260. package/dist/web/mcp-api.js.map +1 -0
  261. package/dist/web/public/assets/{a2a-Cdl8iY0e.js → a2a-06bnQicA.js} +3 -3
  262. package/dist/web/public/assets/{a2a-Cdl8iY0e.js.map → a2a-06bnQicA.js.map} +1 -1
  263. package/dist/web/public/assets/{activity-DXahuK1C.js → activity-Bhc6Esfy.js} +2 -2
  264. package/dist/web/public/assets/{activity-DXahuK1C.js.map → activity-Bhc6Esfy.js.map} +1 -1
  265. package/dist/web/public/assets/{admins-C8fJsuHC.js → admins-BVpnOw3o.js} +3 -3
  266. package/dist/web/public/assets/{admins-C8fJsuHC.js.map → admins-BVpnOw3o.js.map} +1 -1
  267. package/dist/web/public/assets/agents-Cn7D3UMz.js +7 -0
  268. package/dist/web/public/assets/agents-Cn7D3UMz.js.map +1 -0
  269. package/dist/web/public/assets/{approvals-CpyL90ef.js → approvals-BJiLyoLf.js} +3 -3
  270. package/dist/web/public/assets/{approvals-CpyL90ef.js.map → approvals-BJiLyoLf.js.map} +1 -1
  271. package/dist/web/public/assets/asks-C7gKbna1.js +7 -0
  272. package/dist/web/public/assets/asks-C7gKbna1.js.map +1 -0
  273. package/dist/web/public/assets/{audit-DDqpiC3z.js → audit-DgWZD8l5.js} +2 -2
  274. package/dist/web/public/assets/{audit-DDqpiC3z.js.map → audit-DgWZD8l5.js.map} +1 -1
  275. package/dist/web/public/assets/bell-pWZT2wlM.js +7 -0
  276. package/dist/web/public/assets/bell-pWZT2wlM.js.map +1 -0
  277. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js → bgjobs-DkAJdzHf.js} +2 -2
  278. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js.map → bgjobs-DkAJdzHf.js.map} +1 -1
  279. package/dist/web/public/assets/{brain-CJyZe3Oa.js → brain-B0mM-ro_.js} +2 -2
  280. package/dist/web/public/assets/{brain-CJyZe3Oa.js.map → brain-B0mM-ro_.js.map} +1 -1
  281. package/dist/web/public/assets/{briefcase-DcLbQF2I.js → briefcase-CUQlj33_.js} +2 -2
  282. package/dist/web/public/assets/{briefcase-DcLbQF2I.js.map → briefcase-CUQlj33_.js.map} +1 -1
  283. package/dist/web/public/assets/{chevron-right-BhKELKvM.js → chevron-right-CJuDP_fx.js} +2 -2
  284. package/dist/web/public/assets/{chevron-right-BhKELKvM.js.map → chevron-right-CJuDP_fx.js.map} +1 -1
  285. package/dist/web/public/assets/{circle-check-D1qST9RS.js → circle-check-CYse8LRx.js} +2 -2
  286. package/dist/web/public/assets/{circle-check-D1qST9RS.js.map → circle-check-CYse8LRx.js.map} +1 -1
  287. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js → circle-check-big-9NpJLA1Z.js} +2 -2
  288. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js.map → circle-check-big-9NpJLA1Z.js.map} +1 -1
  289. package/dist/web/public/assets/{circle-x-DtePUX5x.js → circle-x-BxZ24SVG.js} +2 -2
  290. package/dist/web/public/assets/{circle-x-DtePUX5x.js.map → circle-x-BxZ24SVG.js.map} +1 -1
  291. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js → confirm-dialog-CmHeZ7ei.js} +2 -2
  292. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js.map → confirm-dialog-CmHeZ7ei.js.map} +1 -1
  293. package/dist/web/public/assets/{data-table-BRLUxacD.js → data-table-tu4BIahS.js} +5 -5
  294. package/dist/web/public/assets/{data-table-BRLUxacD.js.map → data-table-tu4BIahS.js.map} +1 -1
  295. package/dist/web/public/assets/{dialog-By4YA8bm.js → dialog-D8QAkLhI.js} +3 -3
  296. package/dist/web/public/assets/{dialog-By4YA8bm.js.map → dialog-D8QAkLhI.js.map} +1 -1
  297. package/dist/web/public/assets/{download-CiTB2sCh.js → download-DBS0ZPTh.js} +2 -2
  298. package/dist/web/public/assets/{download-CiTB2sCh.js.map → download-DBS0ZPTh.js.map} +1 -1
  299. package/dist/web/public/assets/{email-H-b2AExg.js → email-DgbAEEvZ.js} +3 -3
  300. package/dist/web/public/assets/{email-H-b2AExg.js.map → email-DgbAEEvZ.js.map} +1 -1
  301. package/dist/web/public/assets/{empty-state-DZJTUlvz.js → empty-state-B1S_EYNJ.js} +2 -2
  302. package/dist/web/public/assets/{empty-state-DZJTUlvz.js.map → empty-state-B1S_EYNJ.js.map} +1 -1
  303. package/dist/web/public/assets/{external-link-CfU6Rttn.js → external-link-Dkmwlv6p.js} +2 -2
  304. package/dist/web/public/assets/{external-link-CfU6Rttn.js.map → external-link-Dkmwlv6p.js.map} +1 -1
  305. package/dist/web/public/assets/{eye-BvWcd0pJ.js → eye-Ch0DLviZ.js} +4 -4
  306. package/dist/web/public/assets/{eye-BvWcd0pJ.js.map → eye-Ch0DLviZ.js.map} +1 -1
  307. package/dist/web/public/assets/{facts-BRDbQLSI.js → facts-C3YV1Mkp.js} +2 -2
  308. package/dist/web/public/assets/{facts-BRDbQLSI.js.map → facts-C3YV1Mkp.js.map} +1 -1
  309. package/dist/web/public/assets/goals-DEt5gGry.js +17 -0
  310. package/dist/web/public/assets/goals-DEt5gGry.js.map +1 -0
  311. package/dist/web/public/assets/{health-DJPFOiKw.js → health-DuB9uNiZ.js} +2 -2
  312. package/dist/web/public/assets/{health-DJPFOiKw.js.map → health-DuB9uNiZ.js.map} +1 -1
  313. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js +7 -0
  314. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js.map +1 -0
  315. package/dist/web/public/assets/heartbeat-DbR8VwmG.js +7 -0
  316. package/dist/web/public/assets/heartbeat-DbR8VwmG.js.map +1 -0
  317. package/dist/web/public/assets/hot-izk3vGQB.js +17 -0
  318. package/dist/web/public/assets/hot-izk3vGQB.js.map +1 -0
  319. package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
  320. package/dist/web/public/assets/index-BY1vfCja.js +166 -0
  321. package/dist/web/public/assets/index-BY1vfCja.js.map +1 -0
  322. package/dist/web/public/assets/installed-BXB3-YIy.js +31 -0
  323. package/dist/web/public/assets/installed-BXB3-YIy.js.map +1 -0
  324. package/dist/web/public/assets/{jobs-DdWaBgOh.js → jobs-DkbM4mIQ.js} +2 -2
  325. package/dist/web/public/assets/{jobs-DdWaBgOh.js.map → jobs-DkbM4mIQ.js.map} +1 -1
  326. package/dist/web/public/assets/{layout-Dr12u0W_.js → layout-5ePj6Bek.js} +2 -2
  327. package/dist/web/public/assets/{layout-Dr12u0W_.js.map → layout-5ePj6Bek.js.map} +1 -1
  328. package/dist/web/public/assets/layout-B5Dzy_Zc.js +2 -0
  329. package/dist/web/public/assets/layout-B5Dzy_Zc.js.map +1 -0
  330. package/dist/web/public/assets/layout-BZpbNQFb.js +2 -0
  331. package/dist/web/public/assets/layout-BZpbNQFb.js.map +1 -0
  332. package/dist/web/public/assets/layout-DY9Xq34u.js +2 -0
  333. package/dist/web/public/assets/layout-DY9Xq34u.js.map +1 -0
  334. package/dist/web/public/assets/{layout-BybpkTy0.js → layout-DxzBaeTv.js} +2 -2
  335. package/dist/web/public/assets/{layout-BybpkTy0.js.map → layout-DxzBaeTv.js.map} +1 -1
  336. package/dist/web/public/assets/llm-Dg4W7eRM.js +7 -0
  337. package/dist/web/public/assets/llm-Dg4W7eRM.js.map +1 -0
  338. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js → loader-circle-pGNYdPoE.js} +2 -2
  339. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js.map → loader-circle-pGNYdPoE.js.map} +1 -1
  340. package/dist/web/public/assets/{map-pin-B8hea8yW.js → map-pin-D1UX9mg7.js} +2 -2
  341. package/dist/web/public/assets/{map-pin-B8hea8yW.js.map → map-pin-D1UX9mg7.js.map} +1 -1
  342. package/dist/web/public/assets/mcp-uoOzu4_J.js +7 -0
  343. package/dist/web/public/assets/mcp-uoOzu4_J.js.map +1 -0
  344. package/dist/web/public/assets/{memos-C0_I1Uzt.js → memos-CAWASHg5.js} +2 -2
  345. package/dist/web/public/assets/{memos-C0_I1Uzt.js.map → memos-CAWASHg5.js.map} +1 -1
  346. package/dist/web/public/assets/{messengers-DuS5_JlE.js → messengers-B1-mZms8.js} +3 -3
  347. package/dist/web/public/assets/{messengers-DuS5_JlE.js.map → messengers-B1-mZms8.js.map} +1 -1
  348. package/dist/web/public/assets/native-agent-UuVvvzsW.js +7 -0
  349. package/dist/web/public/assets/native-agent-UuVvvzsW.js.map +1 -0
  350. package/dist/web/public/assets/{network-CpkocMHV.js → network-DpjSgAwW.js} +2 -2
  351. package/dist/web/public/assets/{network-CpkocMHV.js.map → network-DpjSgAwW.js.map} +1 -1
  352. package/dist/web/public/assets/{outbox-mGqTV2Ex.js → outbox-DeAgiXkY.js} +3 -3
  353. package/dist/web/public/assets/{outbox-mGqTV2Ex.js.map → outbox-DeAgiXkY.js.map} +1 -1
  354. package/dist/web/public/assets/{pagination-BAYvy11u.js → pagination-5GD_he3L.js} +3 -3
  355. package/dist/web/public/assets/{pagination-BAYvy11u.js.map → pagination-5GD_he3L.js.map} +1 -1
  356. package/dist/web/public/assets/{persona-CM0TLPJa.js → persona-BhkDCmeB.js} +2 -2
  357. package/dist/web/public/assets/{persona-CM0TLPJa.js.map → persona-BhkDCmeB.js.map} +1 -1
  358. package/dist/web/public/assets/{play-DMgMpe7N.js → play-B7o6cJ8W.js} +2 -2
  359. package/dist/web/public/assets/{play-DMgMpe7N.js.map → play-B7o6cJ8W.js.map} +1 -1
  360. package/dist/web/public/assets/plus-C5d4C6Zp.js +7 -0
  361. package/dist/web/public/assets/plus-C5d4C6Zp.js.map +1 -0
  362. package/dist/web/public/assets/policy-Ct_sKm3Y.js +2 -0
  363. package/dist/web/public/assets/{policy-Ch-xirrA.js.map → policy-Ct_sKm3Y.js.map} +1 -1
  364. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js → refresh-ccw-BlXMN3UX.js} +2 -2
  365. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js.map → refresh-ccw-BlXMN3UX.js.map} +1 -1
  366. package/dist/web/public/assets/{reminders-Dbe7Rc4h.js → reminders-gb1Y0S3t.js} +4 -9
  367. package/dist/web/public/assets/reminders-gb1Y0S3t.js.map +1 -0
  368. package/dist/web/public/assets/{save-1aALBaZc.js → save-DAFuApnY.js} +2 -2
  369. package/dist/web/public/assets/{save-1aALBaZc.js.map → save-DAFuApnY.js.map} +1 -1
  370. package/dist/web/public/assets/{schedules-BBQ2wcnS.js → schedules-CtFumT2B.js} +3 -3
  371. package/dist/web/public/assets/{schedules-BBQ2wcnS.js.map → schedules-CtFumT2B.js.map} +1 -1
  372. package/dist/web/public/assets/{search-DDYjsJ7-.js → search-BWuZE0YD.js} +2 -2
  373. package/dist/web/public/assets/{search-DDYjsJ7-.js.map → search-BWuZE0YD.js.map} +1 -1
  374. package/dist/web/public/assets/{service-DMp11TKF.js → service-lah7RWEc.js} +3 -3
  375. package/dist/web/public/assets/{service-DMp11TKF.js.map → service-lah7RWEc.js.map} +1 -1
  376. package/dist/web/public/assets/{status-badge-Cvj81JKi.js → status-badge-BgmFa_8z.js} +2 -2
  377. package/dist/web/public/assets/{status-badge-Cvj81JKi.js.map → status-badge-BgmFa_8z.js.map} +1 -1
  378. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js → subtasks-CgqrOGhl.js} +3 -3
  379. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js.map → subtasks-CgqrOGhl.js.map} +1 -1
  380. package/dist/web/public/assets/{table-B6nK6k3L.js → table-BhDzIBvB.js} +2 -2
  381. package/dist/web/public/assets/{table-B6nK6k3L.js.map → table-BhDzIBvB.js.map} +1 -1
  382. package/dist/web/public/assets/{topn-BwFh2jKv.js → topn-DXgTCdM_.js} +3 -3
  383. package/dist/web/public/assets/{topn-BwFh2jKv.js.map → topn-DXgTCdM_.js.map} +1 -1
  384. package/dist/web/public/assets/{trash-2-CqpMjbu5.js → trash-2-i4F_Rzh3.js} +3 -3
  385. package/dist/web/public/assets/{trash-2-CqpMjbu5.js.map → trash-2-i4F_Rzh3.js.map} +1 -1
  386. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js +2 -0
  387. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js.map +1 -0
  388. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js +2 -0
  389. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js.map +1 -0
  390. package/dist/web/public/assets/{use-memory-jxZdt-RL.js → use-memory-B_RQWQyG.js} +2 -2
  391. package/dist/web/public/assets/{use-memory-jxZdt-RL.js.map → use-memory-B_RQWQyG.js.map} +1 -1
  392. package/dist/web/public/assets/{use-observability-9TDgLO9y.js → use-observability-CCTN-a71.js} +2 -2
  393. package/dist/web/public/assets/{use-observability-9TDgLO9y.js.map → use-observability-CCTN-a71.js.map} +1 -1
  394. package/dist/web/public/assets/{use-settings-DFB_c2pr.js → use-settings-D4EdDLiK.js} +2 -2
  395. package/dist/web/public/assets/{use-settings-DFB_c2pr.js.map → use-settings-D4EdDLiK.js.map} +1 -1
  396. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js → use-workspace-BhTEp_QH.js} +2 -2
  397. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js.map → use-workspace-BhTEp_QH.js.map} +1 -1
  398. package/dist/web/public/assets/useQuery-DmoWKLw3.js +2 -0
  399. package/dist/web/public/assets/{useQuery-rLmHxFp4.js.map → useQuery-DmoWKLw3.js.map} +1 -1
  400. package/dist/web/public/assets/{vector-D9UqmLi6.js → vector-By-cheMu.js} +2 -2
  401. package/dist/web/public/assets/{vector-D9UqmLi6.js.map → vector-By-cheMu.js.map} +1 -1
  402. package/dist/web/public/assets/{viewer-_OpObeWr.js → viewer-CJNrz2iw.js} +3 -3
  403. package/dist/web/public/assets/{viewer-_OpObeWr.js.map → viewer-CJNrz2iw.js.map} +1 -1
  404. package/dist/web/public/assets/{workspace-DSHRdspq.js → workspace-DvYlIAhu.js} +4 -4
  405. package/dist/web/public/assets/{workspace-DSHRdspq.js.map → workspace-DvYlIAhu.js.map} +1 -1
  406. package/dist/web/public/assets/{workspaces-CsBdhbXz.js → workspaces-2pn73O-K.js} +3 -3
  407. package/dist/web/public/assets/{workspaces-CsBdhbXz.js.map → workspaces-2pn73O-K.js.map} +1 -1
  408. package/dist/web/public/assets/{x-D1re-vBd.js → x-5Z_de5zo.js} +2 -2
  409. package/dist/web/public/assets/{x-D1re-vBd.js.map → x-5Z_de5zo.js.map} +1 -1
  410. package/dist/web/public/index.html +2 -2
  411. package/dist/web/server.d.ts.map +1 -1
  412. package/dist/web/server.js +45 -0
  413. package/dist/web/server.js.map +1 -1
  414. package/package.json +2 -2
  415. package/dist/web/public/assets/agents-lrzFDGgX.js +0 -12
  416. package/dist/web/public/assets/agents-lrzFDGgX.js.map +0 -1
  417. package/dist/web/public/assets/hot-CFGHGkqL.js +0 -17
  418. package/dist/web/public/assets/hot-CFGHGkqL.js.map +0 -1
  419. package/dist/web/public/assets/index-C4hk1i67.js +0 -166
  420. package/dist/web/public/assets/index-C4hk1i67.js.map +0 -1
  421. package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
  422. package/dist/web/public/assets/installed-UONWfKHS.js +0 -7
  423. package/dist/web/public/assets/installed-UONWfKHS.js.map +0 -1
  424. package/dist/web/public/assets/layout-C8_IQRGM.js +0 -2
  425. package/dist/web/public/assets/layout-C8_IQRGM.js.map +0 -1
  426. package/dist/web/public/assets/layout-CxRHLqvi.js +0 -2
  427. package/dist/web/public/assets/layout-CxRHLqvi.js.map +0 -1
  428. package/dist/web/public/assets/layout-LC5zjw1h.js +0 -2
  429. package/dist/web/public/assets/layout-LC5zjw1h.js.map +0 -1
  430. package/dist/web/public/assets/policy-Ch-xirrA.js +0 -2
  431. package/dist/web/public/assets/reminders-Dbe7Rc4h.js.map +0 -1
  432. package/dist/web/public/assets/use-skills-OZKB5x-S.js +0 -2
  433. package/dist/web/public/assets/use-skills-OZKB5x-S.js.map +0 -1
  434. package/dist/web/public/assets/useQuery-rLmHxFp4.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"workspaces-CsBdhbXz.js","sources":["../../node_modules/lucide-react/dist/esm/icons/pencil.js","../../src/routes/settings/workspaces.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pencil = createLucideIcon(\"Pencil\", [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n]);\n\nexport { Pencil as default };\n//# sourceMappingURL=pencil.js.map\n","/**\n * /settings/workspaces — multi-tenant workspace registry editor.\n *\n * Lists every workspace (id / name / agent whitelist count / member\n * count / rate-limit) and provides an inline form to add new ones\n * or upsert existing. The backend's POST handler is upsert-by-id, so\n * editing means \"click Edit on a row → form pre-fills → tweak → Save\"\n * — same endpoint, same semantics as Add.\n *\n * Open vs gated workspaces:\n * * `members: []` (empty array) means the workspace is open to any\n * user. The backend treats `undefined` and `[]` identically; we\n * normalise to `[]` for the round-trip.\n * * `agents: []` means \"allow every registered agent\".\n *\n * Rate-limit fields are optional triple (rate / intervalSec / burst).\n * Leaving them blank submits `rateLimit: undefined` and the backend\n * falls back to defaults.\n */\n\nimport { useEffect, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Briefcase, Loader2, Pencil, RefreshCcw, Save } from 'lucide-react'\n\nimport { EmptyState } from '@/components/common/empty-state'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { useUpsertWorkspace, useWorkspaces } from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport type { WorkspaceConfig } from '@/types/api'\n\ninterface DraftFields {\n id: string\n name: string\n agents: string // comma-separated\n members: string // comma-separated\n rate: string\n intervalSec: string\n burst: string\n}\n\nconst EMPTY_DRAFT: DraftFields = {\n id: '', name: '',\n agents: '', members: '',\n rate: '', intervalSec: '', burst: '',\n}\n\nfunction toDraft(ws: WorkspaceConfig): DraftFields {\n return {\n id: ws.id,\n name: ws.name,\n agents: ws.agents.join(', '),\n members: (ws.members ?? []).join(', '),\n rate: ws.rateLimit ? String(ws.rateLimit.rate) : '',\n intervalSec: ws.rateLimit ? String(ws.rateLimit.intervalSec) : '',\n burst: ws.rateLimit ? String(ws.rateLimit.burst) : '',\n }\n}\n\nfunction fromDraft(d: DraftFields): WorkspaceConfig {\n const splitCsv = (s: string): string[] =>\n s.split(',').map((x) => x.trim()).filter(Boolean)\n const cfg: WorkspaceConfig = {\n id: d.id.trim(),\n name: d.name.trim() || d.id.trim(),\n agents: splitCsv(d.agents),\n members: splitCsv(d.members),\n }\n // Rate limit only when all three fields parse as positive numbers.\n const rate = Number(d.rate)\n const ivl = Number(d.intervalSec)\n const burst = Number(d.burst)\n if (Number.isFinite(rate) && rate > 0\n && Number.isFinite(ivl) && ivl > 0\n && Number.isFinite(burst) && burst > 0) {\n cfg.rateLimit = { rate, intervalSec: ivl, burst }\n }\n return cfg\n}\n\nexport default function SettingsWorkspacesRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const list = useWorkspaces()\n const upsert = useUpsertWorkspace()\n\n const [draft, setDraft] = useState<DraftFields>(EMPTY_DRAFT)\n const [editing, setEditing] = useState<string | null>(null)\n\n useEffect(() => {\n if (draft.id || draft.name) return\n // Keep the form blank on first paint; pre-fill happens via Edit.\n }, [draft.id, draft.name])\n\n function startEdit(ws: WorkspaceConfig): void {\n setDraft(toDraft(ws))\n setEditing(ws.id)\n }\n\n function resetForm(): void {\n setDraft(EMPTY_DRAFT)\n setEditing(null)\n }\n\n async function onSubmit(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n const cfg = fromDraft(draft)\n if (!cfg.id) return\n try {\n await upsert.mutateAsync(cfg)\n toast.success(t('workspaces.toast.saved'))\n resetForm()\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n const workspaces = list.data?.workspaces ?? []\n const hasOnlyDefault = workspaces.length <= 1\n && workspaces.every((w) => w.id === 'default')\n\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('workspaces.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => list.refetch()}\n disabled={list.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {list.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('workspaces.subtitle')}</p>\n </header>\n\n {list.isLoading ? (\n <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n ) : hasOnlyDefault ? (\n <EmptyState\n icon={<Briefcase />}\n title={t('workspaces.empty.title')}\n description={t('workspaces.empty.description')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-32\">{t('workspaces.col.id')}</TableHead>\n <TableHead>{t('workspaces.col.name')}</TableHead>\n <TableHead>{t('workspaces.col.agents')}</TableHead>\n <TableHead>{t('workspaces.col.members')}</TableHead>\n <TableHead>{t('workspaces.col.rateLimit')}</TableHead>\n <TableHead className=\"w-20\" />\n </TableRow>\n </TableHeader>\n <TableBody>\n {workspaces.map((ws) => (\n <TableRow key={ws.id}>\n <TableCell className=\"font-mono text-xs\">{ws.id}</TableCell>\n <TableCell className=\"font-medium\">{ws.name}</TableCell>\n <TableCell>\n {ws.agents.length === 0 ? (\n <span className=\"text-text-muted text-xs\">—</span>\n ) : (\n <div className=\"flex flex-wrap gap-1\">\n {ws.agents.map((a) => (\n <Badge key={a} variant=\"secondary\">{a}</Badge>\n ))}\n </div>\n )}\n </TableCell>\n <TableCell>\n {(ws.members ?? []).length === 0 ? (\n <span className=\"text-text-muted text-xs\">{t('workspaces.membersOpen')}</span>\n ) : (\n <span className=\"text-text-dim text-xs\">\n {t('workspaces.membersCount', { count: ws.members!.length })}\n </span>\n )}\n </TableCell>\n <TableCell className=\"text-xs text-text-dim\">\n {ws.rateLimit\n ? t('workspaces.rateLimitFormat', {\n rate: ws.rateLimit.rate,\n intervalSec: ws.rateLimit.intervalSec,\n burst: ws.rateLimit.burst,\n })\n : '—'}\n </TableCell>\n <TableCell>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => startEdit(ws)}\n >\n <Pencil className=\"h-3 w-3\" />\n {t('workspaces.edit')}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n\n {/* Form */}\n <form\n onSubmit={(e) => void onSubmit(e)}\n className=\"rounded-md border border-border bg-surface p-4\"\n >\n <div className=\"mb-1 text-sm font-medium\">{t('workspaces.form.title')}</div>\n {editing && (\n <p className=\"mb-3 text-xs text-text-dim\">{t('workspaces.form.subtitleEdit')}</p>\n )}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormField\n id=\"ws-id\"\n label={t('workspaces.form.id')}\n hint={t('workspaces.form.idHint')}\n value={draft.id}\n onChange={(v) => setDraft((d) => ({ ...d, id: v }))}\n placeholder=\"team-foo\"\n mono\n />\n <FormField\n id=\"ws-name\"\n label={t('workspaces.form.name')}\n value={draft.name}\n onChange={(v) => setDraft((d) => ({ ...d, name: v }))}\n placeholder=\"Team Foo\"\n />\n <FormField\n id=\"ws-agents\"\n label={t('workspaces.form.agents')}\n hint={t('workspaces.form.agentsHint')}\n value={draft.agents}\n onChange={(v) => setDraft((d) => ({ ...d, agents: v }))}\n placeholder=\"claude-code, codex\"\n mono\n />\n <FormField\n id=\"ws-members\"\n label={t('workspaces.form.members')}\n hint={t('workspaces.form.membersHint')}\n value={draft.members}\n onChange={(v) => setDraft((d) => ({ ...d, members: v }))}\n placeholder=\"wechat:wxid_abc, telegram:12345\"\n mono\n />\n </div>\n <div className=\"mt-3\">\n <div className=\"text-xs font-medium text-text-dim\">{t('workspaces.form.rateLimit')}</div>\n <div className=\"mt-1 grid grid-cols-3 gap-2\">\n <FormField\n id=\"ws-rate\"\n label={t('workspaces.form.rate')}\n value={draft.rate}\n onChange={(v) => setDraft((d) => ({ ...d, rate: v }))}\n placeholder=\"10\"\n mono\n />\n <FormField\n id=\"ws-ivl\"\n label={t('workspaces.form.intervalSec')}\n value={draft.intervalSec}\n onChange={(v) => setDraft((d) => ({ ...d, intervalSec: v }))}\n placeholder=\"60\"\n mono\n />\n <FormField\n id=\"ws-burst\"\n label={t('workspaces.form.burst')}\n value={draft.burst}\n onChange={(v) => setDraft((d) => ({ ...d, burst: v }))}\n placeholder=\"15\"\n mono\n />\n </div>\n </div>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={resetForm}\n disabled={upsert.isPending}\n >\n {t('workspaces.form.reset')}\n </Button>\n <Button\n type=\"submit\"\n size=\"sm\"\n className=\"ml-auto\"\n disabled={upsert.isPending || !draft.id.trim()}\n >\n {upsert.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {t('workspaces.form.submit')}\n </Button>\n </div>\n </form>\n </div>\n )\n}\n\ninterface FormFieldProps {\n id: string\n label: string\n hint?: string\n value: string\n onChange: (v: string) => void\n placeholder?: string\n mono?: boolean\n}\n\nfunction FormField({ id, label, hint, value, onChange, placeholder, mono }: FormFieldProps): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={id} className=\"text-xs text-text-dim\">{label}</Label>\n <Input\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className={mono ? 'font-mono text-xs' : ''}\n />\n {hint && <span className=\"text-[10px] text-text-muted\">{hint}</span>}\n </div>\n )\n}\n"],"names":["Pencil","createLucideIcon","EMPTY_DRAFT","toDraft","ws","fromDraft","d","splitCsv","s","x","cfg","rate","ivl","burst","SettingsWorkspacesRoute","t","useTranslation","list","useWorkspaces","upsert","useUpsertWorkspace","draft","setDraft","useState","editing","setEditing","useEffect","startEdit","resetForm","onSubmit","e","toast","err","describeError","workspaces","hasOnlyDefault","w","jsxs","jsx","Button","Loader2","RefreshCcw","EmptyState","Briefcase","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","a","Badge","FormField","v","Save","id","label","hint","value","onChange","placeholder","mono","Label","Input"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"workspaces-2pn73O-K.js","sources":["../../node_modules/lucide-react/dist/esm/icons/pencil.js","../../src/routes/settings/workspaces.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pencil = createLucideIcon(\"Pencil\", [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n]);\n\nexport { Pencil as default };\n//# sourceMappingURL=pencil.js.map\n","/**\n * /settings/workspaces — multi-tenant workspace registry editor.\n *\n * Lists every workspace (id / name / agent whitelist count / member\n * count / rate-limit) and provides an inline form to add new ones\n * or upsert existing. The backend's POST handler is upsert-by-id, so\n * editing means \"click Edit on a row → form pre-fills → tweak → Save\"\n * — same endpoint, same semantics as Add.\n *\n * Open vs gated workspaces:\n * * `members: []` (empty array) means the workspace is open to any\n * user. The backend treats `undefined` and `[]` identically; we\n * normalise to `[]` for the round-trip.\n * * `agents: []` means \"allow every registered agent\".\n *\n * Rate-limit fields are optional triple (rate / intervalSec / burst).\n * Leaving them blank submits `rateLimit: undefined` and the backend\n * falls back to defaults.\n */\n\nimport { useEffect, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Briefcase, Loader2, Pencil, RefreshCcw, Save } from 'lucide-react'\n\nimport { EmptyState } from '@/components/common/empty-state'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { useUpsertWorkspace, useWorkspaces } from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport type { WorkspaceConfig } from '@/types/api'\n\ninterface DraftFields {\n id: string\n name: string\n agents: string // comma-separated\n members: string // comma-separated\n rate: string\n intervalSec: string\n burst: string\n}\n\nconst EMPTY_DRAFT: DraftFields = {\n id: '', name: '',\n agents: '', members: '',\n rate: '', intervalSec: '', burst: '',\n}\n\nfunction toDraft(ws: WorkspaceConfig): DraftFields {\n return {\n id: ws.id,\n name: ws.name,\n agents: ws.agents.join(', '),\n members: (ws.members ?? []).join(', '),\n rate: ws.rateLimit ? String(ws.rateLimit.rate) : '',\n intervalSec: ws.rateLimit ? String(ws.rateLimit.intervalSec) : '',\n burst: ws.rateLimit ? String(ws.rateLimit.burst) : '',\n }\n}\n\nfunction fromDraft(d: DraftFields): WorkspaceConfig {\n const splitCsv = (s: string): string[] =>\n s.split(',').map((x) => x.trim()).filter(Boolean)\n const cfg: WorkspaceConfig = {\n id: d.id.trim(),\n name: d.name.trim() || d.id.trim(),\n agents: splitCsv(d.agents),\n members: splitCsv(d.members),\n }\n // Rate limit only when all three fields parse as positive numbers.\n const rate = Number(d.rate)\n const ivl = Number(d.intervalSec)\n const burst = Number(d.burst)\n if (Number.isFinite(rate) && rate > 0\n && Number.isFinite(ivl) && ivl > 0\n && Number.isFinite(burst) && burst > 0) {\n cfg.rateLimit = { rate, intervalSec: ivl, burst }\n }\n return cfg\n}\n\nexport default function SettingsWorkspacesRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const list = useWorkspaces()\n const upsert = useUpsertWorkspace()\n\n const [draft, setDraft] = useState<DraftFields>(EMPTY_DRAFT)\n const [editing, setEditing] = useState<string | null>(null)\n\n useEffect(() => {\n if (draft.id || draft.name) return\n // Keep the form blank on first paint; pre-fill happens via Edit.\n }, [draft.id, draft.name])\n\n function startEdit(ws: WorkspaceConfig): void {\n setDraft(toDraft(ws))\n setEditing(ws.id)\n }\n\n function resetForm(): void {\n setDraft(EMPTY_DRAFT)\n setEditing(null)\n }\n\n async function onSubmit(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n const cfg = fromDraft(draft)\n if (!cfg.id) return\n try {\n await upsert.mutateAsync(cfg)\n toast.success(t('workspaces.toast.saved'))\n resetForm()\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n const workspaces = list.data?.workspaces ?? []\n const hasOnlyDefault = workspaces.length <= 1\n && workspaces.every((w) => w.id === 'default')\n\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('workspaces.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => list.refetch()}\n disabled={list.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {list.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('workspaces.subtitle')}</p>\n </header>\n\n {list.isLoading ? (\n <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n ) : hasOnlyDefault ? (\n <EmptyState\n icon={<Briefcase />}\n title={t('workspaces.empty.title')}\n description={t('workspaces.empty.description')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-32\">{t('workspaces.col.id')}</TableHead>\n <TableHead>{t('workspaces.col.name')}</TableHead>\n <TableHead>{t('workspaces.col.agents')}</TableHead>\n <TableHead>{t('workspaces.col.members')}</TableHead>\n <TableHead>{t('workspaces.col.rateLimit')}</TableHead>\n <TableHead className=\"w-20\" />\n </TableRow>\n </TableHeader>\n <TableBody>\n {workspaces.map((ws) => (\n <TableRow key={ws.id}>\n <TableCell className=\"font-mono text-xs\">{ws.id}</TableCell>\n <TableCell className=\"font-medium\">{ws.name}</TableCell>\n <TableCell>\n {ws.agents.length === 0 ? (\n <span className=\"text-text-muted text-xs\">—</span>\n ) : (\n <div className=\"flex flex-wrap gap-1\">\n {ws.agents.map((a) => (\n <Badge key={a} variant=\"secondary\">{a}</Badge>\n ))}\n </div>\n )}\n </TableCell>\n <TableCell>\n {(ws.members ?? []).length === 0 ? (\n <span className=\"text-text-muted text-xs\">{t('workspaces.membersOpen')}</span>\n ) : (\n <span className=\"text-text-dim text-xs\">\n {t('workspaces.membersCount', { count: ws.members!.length })}\n </span>\n )}\n </TableCell>\n <TableCell className=\"text-xs text-text-dim\">\n {ws.rateLimit\n ? t('workspaces.rateLimitFormat', {\n rate: ws.rateLimit.rate,\n intervalSec: ws.rateLimit.intervalSec,\n burst: ws.rateLimit.burst,\n })\n : '—'}\n </TableCell>\n <TableCell>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => startEdit(ws)}\n >\n <Pencil className=\"h-3 w-3\" />\n {t('workspaces.edit')}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n\n {/* Form */}\n <form\n onSubmit={(e) => void onSubmit(e)}\n className=\"rounded-md border border-border bg-surface p-4\"\n >\n <div className=\"mb-1 text-sm font-medium\">{t('workspaces.form.title')}</div>\n {editing && (\n <p className=\"mb-3 text-xs text-text-dim\">{t('workspaces.form.subtitleEdit')}</p>\n )}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <FormField\n id=\"ws-id\"\n label={t('workspaces.form.id')}\n hint={t('workspaces.form.idHint')}\n value={draft.id}\n onChange={(v) => setDraft((d) => ({ ...d, id: v }))}\n placeholder=\"team-foo\"\n mono\n />\n <FormField\n id=\"ws-name\"\n label={t('workspaces.form.name')}\n value={draft.name}\n onChange={(v) => setDraft((d) => ({ ...d, name: v }))}\n placeholder=\"Team Foo\"\n />\n <FormField\n id=\"ws-agents\"\n label={t('workspaces.form.agents')}\n hint={t('workspaces.form.agentsHint')}\n value={draft.agents}\n onChange={(v) => setDraft((d) => ({ ...d, agents: v }))}\n placeholder=\"claude-code, codex\"\n mono\n />\n <FormField\n id=\"ws-members\"\n label={t('workspaces.form.members')}\n hint={t('workspaces.form.membersHint')}\n value={draft.members}\n onChange={(v) => setDraft((d) => ({ ...d, members: v }))}\n placeholder=\"wechat:wxid_abc, telegram:12345\"\n mono\n />\n </div>\n <div className=\"mt-3\">\n <div className=\"text-xs font-medium text-text-dim\">{t('workspaces.form.rateLimit')}</div>\n <div className=\"mt-1 grid grid-cols-3 gap-2\">\n <FormField\n id=\"ws-rate\"\n label={t('workspaces.form.rate')}\n value={draft.rate}\n onChange={(v) => setDraft((d) => ({ ...d, rate: v }))}\n placeholder=\"10\"\n mono\n />\n <FormField\n id=\"ws-ivl\"\n label={t('workspaces.form.intervalSec')}\n value={draft.intervalSec}\n onChange={(v) => setDraft((d) => ({ ...d, intervalSec: v }))}\n placeholder=\"60\"\n mono\n />\n <FormField\n id=\"ws-burst\"\n label={t('workspaces.form.burst')}\n value={draft.burst}\n onChange={(v) => setDraft((d) => ({ ...d, burst: v }))}\n placeholder=\"15\"\n mono\n />\n </div>\n </div>\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={resetForm}\n disabled={upsert.isPending}\n >\n {t('workspaces.form.reset')}\n </Button>\n <Button\n type=\"submit\"\n size=\"sm\"\n className=\"ml-auto\"\n disabled={upsert.isPending || !draft.id.trim()}\n >\n {upsert.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {t('workspaces.form.submit')}\n </Button>\n </div>\n </form>\n </div>\n )\n}\n\ninterface FormFieldProps {\n id: string\n label: string\n hint?: string\n value: string\n onChange: (v: string) => void\n placeholder?: string\n mono?: boolean\n}\n\nfunction FormField({ id, label, hint, value, onChange, placeholder, mono }: FormFieldProps): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={id} className=\"text-xs text-text-dim\">{label}</Label>\n <Input\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className={mono ? 'font-mono text-xs' : ''}\n />\n {hint && <span className=\"text-[10px] text-text-muted\">{hint}</span>}\n </div>\n )\n}\n"],"names":["Pencil","createLucideIcon","EMPTY_DRAFT","toDraft","ws","fromDraft","d","splitCsv","s","x","cfg","rate","ivl","burst","SettingsWorkspacesRoute","t","useTranslation","list","useWorkspaces","upsert","useUpsertWorkspace","draft","setDraft","useState","editing","setEditing","useEffect","startEdit","resetForm","onSubmit","e","toast","err","describeError","workspaces","hasOnlyDefault","w","jsxs","jsx","Button","Loader2","RefreshCcw","EmptyState","Briefcase","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","a","Badge","FormField","v","Save","id","label","hint","value","onChange","placeholder","mono","Label","Input"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,7 +1,7 @@
1
- import{x as e}from"./index-C4hk1i67.js";/**
1
+ import{y as e}from"./index-BY1vfCja.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const o=e("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);export{o as X};
7
- //# sourceMappingURL=x-D1re-vBd.js.map
7
+ //# sourceMappingURL=x-5Z_de5zo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"x-D1re-vBd.js","sources":["../../node_modules/lucide-react/dist/esm/icons/x.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n"],"names":["X","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAIC,EAAiB,IAAK,CAC9B,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,EAC3C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"x-5Z_de5zo.js","sources":["../../node_modules/lucide-react/dist/esm/icons/x.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n"],"names":["X","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAIC,EAAiB,IAAK,CAC9B,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,EAC3C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC","x_google_ignoreList":[0]}
@@ -35,9 +35,9 @@
35
35
  } catch (e) { /* private-mode storage exceptions: noop */ }
36
36
  })()
37
37
  </script>
38
- <script type="module" crossorigin src="/assets/index-C4hk1i67.js"></script>
38
+ <script type="module" crossorigin src="/assets/index-BY1vfCja.js"></script>
39
39
  <link rel="modulepreload" crossorigin href="/assets/react-C9F3QeMB.js">
40
- <link rel="stylesheet" crossorigin href="/assets/index-Cvacw7Jg.css">
40
+ <link rel="stylesheet" crossorigin href="/assets/index-B7QRVy9N.css">
41
41
  </head>
42
42
  <body>
43
43
  <div id="root"></div>
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAqQA,wBAAgB,iBAAiB,IAAI,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAOrE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA0oC/C"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAyQA,wBAAgB,iBAAiB,IAAI,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAOrE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA2qC/C"}
@@ -13,6 +13,10 @@ import { sink, resolveMessenger } from '../core/message-sink.js';
13
13
  import { generateTraceId, createLogger, logger as rootLogger, sanitizeUserText } from '../core/logger.js';
14
14
  import { validateConfig } from '../core/config-schema.js';
15
15
  import { isMasked, maskSecret } from './env-mask.js';
16
+ import { handleLlmApi } from './llm-api.js';
17
+ import { handleMcpApi } from './mcp-api.js';
18
+ import { handleBackgroundTasksApi } from './background-tasks-api.js';
19
+ import { handleAgimSkillsApi } from './agim-skills-api.js';
16
20
  import { consumeToken, peekToken } from '../core/location-token.js';
17
21
  import { createMemo, updateMemo, getMemo, mapUrls } from '../core/memos.js';
18
22
  import { normalizeIncomingCoords } from '../core/coord-systems.js';
@@ -950,6 +954,47 @@ export async function startWebServer(options) {
950
954
  return;
951
955
  return handleNotify(req, res);
952
956
  }
957
+ // Stage 4 — native LLM backend admin. GET is open (no secret
958
+ // VALUES surfaced — only source); writes require admin.
959
+ if (url.pathname === '/api/llm' || url.pathname.startsWith('/api/llm/')) {
960
+ const writeMethod = req.method !== 'GET';
961
+ if (writeMethod && !requireAdmin(req, res))
962
+ return;
963
+ const handled = await handleLlmApi(req, res, url);
964
+ if (handled)
965
+ return;
966
+ }
967
+ // Stage 6 — external MCP servers admin. Headers may contain bearer
968
+ // tokens; require admin even on GET.
969
+ if (url.pathname === '/api/mcp' || url.pathname.startsWith('/api/mcp/')) {
970
+ if (!requireAdmin(req, res))
971
+ return;
972
+ const handled = await handleMcpApi(req, res, url);
973
+ if (handled)
974
+ return;
975
+ }
976
+ // P1 follow-up — admin overview of the three per-thread background
977
+ // primitives (heartbeat bindings / goals / pending asks). Cross-
978
+ // thread, user-typed content — require admin on every method.
979
+ if (url.pathname.startsWith('/api/heartbeat/')
980
+ || url.pathname === '/api/goals' || url.pathname.startsWith('/api/goals/')
981
+ || url.pathname.startsWith('/api/asks/')) {
982
+ if (!requireAdmin(req, res))
983
+ return;
984
+ const handled = await handleBackgroundTasksApi(req, res, url);
985
+ if (handled)
986
+ return;
987
+ }
988
+ // P1 follow-up — agim skills editor (SKILL.md CRUD). SKILL.md
989
+ // bodies are injected into every agent prompt; admin-gated even
990
+ // on GET because the dir paths reveal install layout.
991
+ if (url.pathname === '/api/agim-skills' || url.pathname.startsWith('/api/agim-skills/')) {
992
+ if (!requireAdmin(req, res))
993
+ return;
994
+ const handled = await handleAgimSkillsApi(req, res, url);
995
+ if (handled)
996
+ return;
997
+ }
953
998
  if (url.pathname === '/api/invoke' && req.method === 'POST') {
954
999
  if (!requireAdmin(req, res))
955
1000
  return;