cli-jaw 2.0.5 → 2.0.6

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 (614) hide show
  1. package/README.ja.md +229 -315
  2. package/README.ko.md +248 -315
  3. package/README.md +103 -186
  4. package/README.zh-CN.md +282 -296
  5. package/dist/bin/commands/browser-web-ai.js +4 -2
  6. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  7. package/dist/bin/commands/browser.js +76 -0
  8. package/dist/bin/commands/browser.js.map +1 -1
  9. package/dist/bin/commands/doctor.js +122 -4
  10. package/dist/bin/commands/doctor.js.map +1 -1
  11. package/dist/bin/commands/skill.js +5 -3
  12. package/dist/bin/commands/skill.js.map +1 -1
  13. package/dist/bin/postinstall.js +507 -89
  14. package/dist/bin/postinstall.js.map +1 -1
  15. package/dist/lib/mcp/format-converters.js +32 -4
  16. package/dist/lib/mcp/format-converters.js.map +1 -1
  17. package/dist/lib/mcp/mcp-install.js +5 -0
  18. package/dist/lib/mcp/mcp-install.js.map +1 -1
  19. package/dist/lib/mcp/skills-distribution.js +52 -53
  20. package/dist/lib/mcp/skills-distribution.js.map +1 -1
  21. package/dist/lib/mcp/skills-reset.js +29 -16
  22. package/dist/lib/mcp/skills-reset.js.map +1 -1
  23. package/dist/lib/mcp/skills-utils.js +64 -2
  24. package/dist/lib/mcp/skills-utils.js.map +1 -1
  25. package/dist/lib/mcp/unified-config.js +7 -3
  26. package/dist/lib/mcp/unified-config.js.map +1 -1
  27. package/dist/scripts/fresh-install-smoke.js +1 -1
  28. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  29. package/dist/server.js +44 -4
  30. package/dist/server.js.map +1 -1
  31. package/dist/src/agent/args.js +148 -1
  32. package/dist/src/agent/args.js.map +1 -1
  33. package/dist/src/agent/claude-e-runtime.js +42 -0
  34. package/dist/src/agent/claude-e-runtime.js.map +1 -0
  35. package/dist/src/agent/claude-i-runtime.js +42 -0
  36. package/dist/src/agent/claude-i-runtime.js.map +1 -0
  37. package/dist/src/agent/cli-helpers.js +9 -0
  38. package/dist/src/agent/cli-helpers.js.map +1 -0
  39. package/dist/src/agent/codex-app-client.js +240 -0
  40. package/dist/src/agent/codex-app-client.js.map +1 -0
  41. package/dist/src/agent/codex-app-events.js +268 -0
  42. package/dist/src/agent/codex-app-events.js.map +1 -0
  43. package/dist/src/agent/error-classifier.js +8 -2
  44. package/dist/src/agent/error-classifier.js.map +1 -1
  45. package/dist/src/agent/events/acp.js +200 -0
  46. package/dist/src/agent/events/acp.js.map +1 -0
  47. package/dist/src/agent/events/claude.js +200 -0
  48. package/dist/src/agent/events/claude.js.map +1 -0
  49. package/dist/src/agent/events/codex.js +118 -0
  50. package/dist/src/agent/events/codex.js.map +1 -0
  51. package/dist/src/agent/events/gemini.js +100 -0
  52. package/dist/src/agent/events/gemini.js.map +1 -0
  53. package/dist/src/agent/events/grok.js +298 -0
  54. package/dist/src/agent/events/grok.js.map +1 -0
  55. package/dist/src/agent/events/helpers.js +237 -0
  56. package/dist/src/agent/events/helpers.js.map +1 -0
  57. package/dist/src/agent/events/index.js +315 -0
  58. package/dist/src/agent/events/index.js.map +1 -0
  59. package/dist/src/agent/events/opencode.js +171 -0
  60. package/dist/src/agent/events/opencode.js.map +1 -0
  61. package/dist/src/agent/events/summary.js +128 -0
  62. package/dist/src/agent/events/summary.js.map +1 -0
  63. package/dist/src/agent/events/tool-labels.js +299 -0
  64. package/dist/src/agent/events/tool-labels.js.map +1 -0
  65. package/dist/src/agent/events/types.js +3 -0
  66. package/dist/src/agent/events/types.js.map +1 -0
  67. package/dist/src/agent/events.js +2 -1487
  68. package/dist/src/agent/events.js.map +1 -1
  69. package/dist/src/agent/grok-trace-backfill.js +153 -0
  70. package/dist/src/agent/grok-trace-backfill.js.map +1 -0
  71. package/dist/src/agent/lifecycle-handler.js +60 -16
  72. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  73. package/dist/src/agent/live-run-state.js +1 -1
  74. package/dist/src/agent/live-run-state.js.map +1 -1
  75. package/dist/src/agent/memory-flush-controller.js +26 -0
  76. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  77. package/dist/src/agent/resume-classifier.js +9 -0
  78. package/dist/src/agent/resume-classifier.js.map +1 -1
  79. package/dist/src/agent/session-persistence.js +7 -2
  80. package/dist/src/agent/session-persistence.js.map +1 -1
  81. package/dist/src/agent/spawn/process-kill.js +29 -0
  82. package/dist/src/agent/spawn/process-kill.js.map +1 -0
  83. package/dist/src/agent/spawn/queue.js +273 -0
  84. package/dist/src/agent/spawn/queue.js.map +1 -0
  85. package/dist/src/agent/spawn/resume.js +56 -0
  86. package/dist/src/agent/spawn/resume.js.map +1 -0
  87. package/dist/src/agent/spawn.js +435 -371
  88. package/dist/src/agent/spawn.js.map +1 -1
  89. package/dist/src/agent/watchdog.js +5 -1
  90. package/dist/src/agent/watchdog.js.map +1 -1
  91. package/dist/src/browser/adaptive-fetch/browser-escalation.js +177 -0
  92. package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -0
  93. package/dist/src/browser/adaptive-fetch/browser-runtime.js +38 -0
  94. package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -0
  95. package/dist/src/browser/adaptive-fetch/browser-session.js +97 -0
  96. package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -0
  97. package/dist/src/browser/adaptive-fetch/challenge-detector.js +88 -0
  98. package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -0
  99. package/dist/src/browser/adaptive-fetch/content-scorer.js +145 -0
  100. package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -0
  101. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +382 -0
  102. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -0
  103. package/dist/src/browser/adaptive-fetch/fetcher.js +105 -0
  104. package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -0
  105. package/dist/src/browser/adaptive-fetch/human-loop.js +101 -0
  106. package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -0
  107. package/dist/src/browser/adaptive-fetch/index.js +586 -0
  108. package/dist/src/browser/adaptive-fetch/index.js.map +1 -0
  109. package/dist/src/browser/adaptive-fetch/metadata.js +169 -0
  110. package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -0
  111. package/dist/src/browser/adaptive-fetch/output.js +71 -0
  112. package/dist/src/browser/adaptive-fetch/output.js.map +1 -0
  113. package/dist/src/browser/adaptive-fetch/reader-adapters.js +135 -0
  114. package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -0
  115. package/dist/src/browser/adaptive-fetch/safety.js +296 -0
  116. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -0
  117. package/dist/src/browser/adaptive-fetch/third-party-readers.js +43 -0
  118. package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -0
  119. package/dist/src/browser/adaptive-fetch/trace.js +61 -0
  120. package/dist/src/browser/adaptive-fetch/trace.js.map +1 -0
  121. package/dist/src/browser/adaptive-fetch/transforms.js +81 -0
  122. package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -0
  123. package/dist/src/browser/adaptive-fetch/validators.js +108 -0
  124. package/dist/src/browser/adaptive-fetch/validators.js.map +1 -0
  125. package/dist/src/browser/adaptive-fetch/waf-profiles.js +135 -0
  126. package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -0
  127. package/dist/src/browser/index.js +1 -0
  128. package/dist/src/browser/index.js.map +1 -1
  129. package/dist/src/browser/web-ai/gemini-model.js +42 -15
  130. package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
  131. package/dist/src/cli/claude-models.js +1 -1
  132. package/dist/src/cli/claude-models.js.map +1 -1
  133. package/dist/src/cli/compact.js +2 -0
  134. package/dist/src/cli/compact.js.map +1 -1
  135. package/dist/src/cli/handlers-completions.js +3 -0
  136. package/dist/src/cli/handlers-completions.js.map +1 -1
  137. package/dist/src/cli/handlers-runtime.js +5 -2
  138. package/dist/src/cli/handlers-runtime.js.map +1 -1
  139. package/dist/src/cli/readiness.js +43 -1
  140. package/dist/src/cli/readiness.js.map +1 -1
  141. package/dist/src/cli/registry.js +58 -0
  142. package/dist/src/cli/registry.js.map +1 -1
  143. package/dist/src/core/browser-open.js +4 -1
  144. package/dist/src/core/browser-open.js.map +1 -1
  145. package/dist/src/core/claude-install.js +4 -0
  146. package/dist/src/core/claude-install.js.map +1 -1
  147. package/dist/src/core/cli-detect.js +61 -13
  148. package/dist/src/core/cli-detect.js.map +1 -1
  149. package/dist/src/core/compact.js +295 -63
  150. package/dist/src/core/compact.js.map +1 -1
  151. package/dist/src/core/config.js +151 -11
  152. package/dist/src/core/config.js.map +1 -1
  153. package/dist/src/core/db.js +10 -1
  154. package/dist/src/core/db.js.map +1 -1
  155. package/dist/src/core/employees.js +1 -1
  156. package/dist/src/core/employees.js.map +1 -1
  157. package/dist/src/core/logger.js +28 -9
  158. package/dist/src/core/logger.js.map +1 -1
  159. package/dist/src/core/runtime-settings.js +32 -5
  160. package/dist/src/core/runtime-settings.js.map +1 -1
  161. package/dist/src/manager/memory/embedding/state-machine.js +2 -1
  162. package/dist/src/manager/memory/embedding/state-machine.js.map +1 -1
  163. package/dist/src/manager/memory/embedding/sync.js +52 -33
  164. package/dist/src/manager/memory/embedding/sync.js.map +1 -1
  165. package/dist/src/manager/memory/embedding/vec-store.js +10 -10
  166. package/dist/src/manager/memory/embedding/vec-store.js.map +1 -1
  167. package/dist/src/manager/routes/dashboard-memory.js +43 -16
  168. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  169. package/dist/src/manager/server.js +11 -0
  170. package/dist/src/manager/server.js.map +1 -1
  171. package/dist/src/memory/indexing.js +6 -1
  172. package/dist/src/memory/indexing.js.map +1 -1
  173. package/dist/src/orchestrator/distribute.js +5 -4
  174. package/dist/src/orchestrator/distribute.js.map +1 -1
  175. package/dist/src/prompt/builder.js +12 -1
  176. package/dist/src/prompt/builder.js.map +1 -1
  177. package/dist/src/prompt/runtime-context.js +69 -0
  178. package/dist/src/prompt/runtime-context.js.map +1 -0
  179. package/dist/src/routes/browser.js +33 -0
  180. package/dist/src/routes/browser.js.map +1 -1
  181. package/dist/src/routes/employees.js +1 -1
  182. package/dist/src/routes/employees.js.map +1 -1
  183. package/dist/src/routes/memory.js +1 -1
  184. package/dist/src/routes/memory.js.map +1 -1
  185. package/dist/src/routes/orchestrate.js +37 -10
  186. package/dist/src/routes/orchestrate.js.map +1 -1
  187. package/dist/src/routes/quota.js +91 -1
  188. package/dist/src/routes/quota.js.map +1 -1
  189. package/dist/src/routes/runtime-context.js +43 -0
  190. package/dist/src/routes/runtime-context.js.map +1 -0
  191. package/dist/src/routes/security-audit.js +14 -0
  192. package/dist/src/routes/security-audit.js.map +1 -0
  193. package/dist/src/routes/settings.js +8 -1
  194. package/dist/src/routes/settings.js.map +1 -1
  195. package/dist/src/security/security-audit-log.js +99 -0
  196. package/dist/src/security/security-audit-log.js.map +1 -0
  197. package/dist/src/telegram/bot.js +4 -2
  198. package/dist/src/telegram/bot.js.map +1 -1
  199. package/dist/src/types/cli-engine.js +4 -0
  200. package/dist/src/types/cli-engine.js.map +1 -1
  201. package/dist/src/types/cli-events.js +1 -1
  202. package/dist/src/types/cli-events.js.map +1 -1
  203. package/package.json +9 -3
  204. package/public/assets/providers/antigravity-color.svg +1 -0
  205. package/public/assets/providers/antigravity.svg +1 -0
  206. package/public/assets/providers/copilot-color.svg +1 -1
  207. package/public/assets/providers/copilot.svg +1 -1
  208. package/public/assets/providers/grok-color.svg +1 -0
  209. package/public/assets/providers/grok.svg +1 -0
  210. package/public/css/chat-search.css +168 -0
  211. package/public/css/chat.css +43 -1
  212. package/public/css/modals.css +41 -0
  213. package/public/dist/assets/{AdvancedExport-BAdZUC-6.js → AdvancedExport-CBvz4_IZ.js} +1 -1
  214. package/public/dist/assets/Agent-DlUqCMXJ.js +1 -0
  215. package/public/dist/assets/{Browser-BsdxDVgM.js → Browser-66BpLQck.js} +1 -1
  216. package/public/dist/assets/{ChannelsDiscord-Dg_jto6l.js → ChannelsDiscord-BifT2Dum.js} +1 -1
  217. package/public/dist/assets/{ChannelsTelegram-DGyZfJGS.js → ChannelsTelegram-CK6tYQ8k.js} +1 -1
  218. package/public/dist/assets/DashboardEmbeddingSection-6F8zSSja.js +2 -0
  219. package/public/dist/assets/{DashboardMeta-CAH9ONTb.js → DashboardMeta-Cc03HT5R.js} +1 -1
  220. package/public/dist/assets/{Display-DM_yvyKL.js → Display-arOjcMQZ.js} +1 -1
  221. package/public/dist/assets/Employees-YbW-mI67.js +1 -0
  222. package/public/dist/assets/{HealthBadge-Dtr-dDnw.js → HealthBadge-DEPFkcA0.js} +1 -1
  223. package/public/dist/assets/Heartbeat-CW4eIhtJ.js +1 -0
  224. package/public/dist/assets/{InlineWarn-E64UaKFh.js → InlineWarn-DoJS7AgM.js} +1 -1
  225. package/public/dist/assets/{Mcp-Dlp2X7X7.js → Mcp-ZQ6ARQb6.js} +1 -1
  226. package/public/dist/assets/Memory-BAUWJMqc.js +1 -0
  227. package/public/dist/assets/{MilkdownWysiwygEditor-Ctww8i0L.js → MilkdownWysiwygEditor-IAqFtXvM.js} +1 -1
  228. package/public/dist/assets/ModelProvider-DUtmFh0J.js +1 -0
  229. package/public/dist/assets/{Network-Df1R2YcQ.js → Network-B_4E82zQ.js} +1 -1
  230. package/public/dist/assets/{Permissions-BKJ5K6EL.js → Permissions-BkADXjQ4.js} +1 -1
  231. package/public/dist/assets/{Permissions-CcWZoOVP.js → Permissions-DvUCB8wA.js} +1 -1
  232. package/public/dist/assets/{Profile-DZ7xf1WZ.js → Profile-BcnTCSYM.js} +1 -1
  233. package/public/dist/assets/{Prompts-Bh5DYt8e.js → Prompts-CUs_RoRE.js} +1 -1
  234. package/public/dist/assets/{SpeechKeys-CQwtVxOP.js → SpeechKeys-qxc-ROWN.js} +1 -1
  235. package/public/dist/assets/agent-meta-Du8y6mSM.js +1 -0
  236. package/public/dist/assets/app-CGqTcIeF.js +39 -0
  237. package/public/dist/assets/app-Dpk6cE6C.css +1 -0
  238. package/public/dist/assets/architecture-7EHR7CIX-wVaUQezY.js +1 -0
  239. package/public/dist/assets/architectureDiagram-3BPJPVTR-kYIVzmWe.js +36 -0
  240. package/public/dist/assets/blockDiagram-GPEHLZMM-B204CPhe.js +132 -0
  241. package/public/dist/assets/{c4Diagram-AHTNJAMY-Bp2QLC-s.js → c4Diagram-AAUBKEIU-DAv6TAjg.js} +6 -6
  242. package/public/dist/assets/channel-CCQujL1n.js +1 -0
  243. package/public/dist/assets/{chunk-EDXVE4YY-COudQKkJ.js → chunk-2J33WTMH-xiPJWKcl.js} +1 -1
  244. package/public/dist/assets/chunk-3OPIFGDE-DOAvk9x8.js +62 -0
  245. package/public/dist/assets/{chunk-4BX2VUAB-Cm3KqBkS.js → chunk-4BX2VUAB-6lTRwyT0.js} +1 -1
  246. package/public/dist/assets/chunk-4EGX6M5U-DXtAEgX6.js +1 -0
  247. package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +1 -0
  248. package/public/dist/assets/chunk-5DO6E6H7-DDcMHB95.js +1 -0
  249. package/public/dist/assets/chunk-5ZQYHXKU-Bd-RFO5i.js +2 -0
  250. package/public/dist/assets/chunk-727SXJPM-BrsRzj8z.js +206 -0
  251. package/public/dist/assets/{chunk-AGHRB4JF-DIMn8T3_.js → chunk-AGHRB4JF-CYdXVA2-.js} +1 -1
  252. package/public/dist/assets/chunk-AQP2D5EJ-Di6Gstk-.js +231 -0
  253. package/public/dist/assets/{chunk-LIHQZDEY-Xw9ZX8of.js → chunk-BR22UD5L-CVuYkAd1.js} +1 -1
  254. package/public/dist/assets/{chunk-BSJP7CBP-DnSYKjii.js → chunk-BSJP7CBP-B47GpxcW.js} +1 -1
  255. package/public/dist/assets/chunk-CSCIHK7Q-CAE1p4Em.js +123 -0
  256. package/public/dist/assets/chunk-FHYWG6QK-CxZt-yZZ.js +1 -0
  257. package/public/dist/assets/{chunk-FMBD7UC4-6yXYicjw.js → chunk-FMBD7UC4-CwqBlx0l.js} +1 -1
  258. package/public/dist/assets/chunk-KSCS5N6A-D9a4ZkOy.js +10 -0
  259. package/public/dist/assets/{chunk-ZZ45TVLE-D5oxCC1O.js → chunk-L5ZTLDWV-D208QbfC.js} +1 -1
  260. package/public/dist/assets/{chunk-336JU56O-CAt5aBOe.js → chunk-LZXEDZCA-CE2KFduj.js} +1 -1
  261. package/public/dist/assets/chunk-MPE355IW-Bp4qAOUf.js +1 -0
  262. package/public/dist/assets/chunk-MZUSXYTE-DAU-v-0c.js +1 -0
  263. package/public/dist/assets/chunk-N66VUXT2-CpPz1L5u.js +1 -0
  264. package/public/dist/assets/chunk-ND2GUHAM-zZ7h1CPf.js +1 -0
  265. package/public/dist/assets/chunk-NNHCCRGN-BaiX9a5F.js +159 -0
  266. package/public/dist/assets/{chunk-X2U36JSP-CoMFMVNF.js → chunk-NZK2D7GU-CTqFQ8K5.js} +1 -1
  267. package/public/dist/assets/chunk-O5CBEL6O-BTuvXKFi.js +11 -0
  268. package/public/dist/assets/chunk-PUPMXCY4-ppZvktf-.js +1 -0
  269. package/public/dist/assets/chunk-QZHKN3VN-CBAtPPT7.js +1 -0
  270. package/public/dist/assets/chunk-UIBZB4QT-rJZEVBX0.js +1 -0
  271. package/public/dist/assets/chunk-WCWK7LTN-CGvUyB8h.js +1 -0
  272. package/public/dist/assets/chunk-WU5MYG2G-C3fKlSvP.js +1 -0
  273. package/public/dist/assets/{chunk-XPW4576I-CmAz5C-j.js → chunk-XPW4576I-BaQfzRci.js} +1 -1
  274. package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +1 -0
  275. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +1 -0
  276. package/public/dist/assets/constants-BxG09J6S.js +1 -0
  277. package/public/dist/assets/cose-bilkent-S5V4N54A-D1zmarou.js +1 -0
  278. package/public/dist/assets/dagre-BM42HDAG-BVkBttzA.js +4 -0
  279. package/public/dist/assets/dagre-DnoxfNXr.js +1 -0
  280. package/public/dist/assets/diagram-2AECGRRQ-Bs32KPnT.js +43 -0
  281. package/public/dist/assets/{diagram-5BDNPKRD-Cl4PzCD0.js → diagram-5GNKFQAL-YDYgPOQj.js} +2 -2
  282. package/public/dist/assets/diagram-KO2AKTUF-1tIdFl26.js +3 -0
  283. package/public/dist/assets/{diagram-TYMM5635-B_Xoa1Gp.js → diagram-LMA3HP47-B1y15kav.js} +1 -1
  284. package/public/dist/assets/diagram-OG6HWLK6-C25j1jGg.js +24 -0
  285. package/public/dist/assets/{dist-C9LWf2uC.js → dist-0v1UKkQ3.js} +1 -1
  286. package/public/dist/assets/dist-BMi_buEb.js +1 -0
  287. package/public/dist/assets/{dist-B6G8pbap.js → dist-BQNQk-1M.js} +1 -1
  288. package/public/dist/assets/{dist-CCKktDoF.js → dist-BVpa_e6W.js} +1 -1
  289. package/public/dist/assets/dist-BkrbW_LS.js +1 -0
  290. package/public/dist/assets/{dist-CkMC2PPt.js → dist-C1VqWrYZ.js} +1 -1
  291. package/public/dist/assets/{dist-BA7sRne4.js → dist-C3vh7d65.js} +1 -1
  292. package/public/dist/assets/{dist-BhzKO6nt2.js → dist-CE4s7vg82.js} +1 -1
  293. package/public/dist/assets/{dist-BDMNMdPF.js → dist-CjPin7Mr.js} +1 -1
  294. package/public/dist/assets/{dist-W7IGn2ug.js → dist-Ck6PnIlo.js} +1 -1
  295. package/public/dist/assets/{dist-B1rKu9eP.js → dist-CnIrGAPx.js} +1 -1
  296. package/public/dist/assets/{dist-CEDX2HGI.js → dist-Cv8S3FhF.js} +1 -1
  297. package/public/dist/assets/{dist-55MYVjjj.js → dist-D0PYXGt2.js} +1 -1
  298. package/public/dist/assets/{dist-C0sOT_UM.js → dist-D5GUqT-6.js} +1 -1
  299. package/public/dist/assets/{dist-C5S-Rbvc.js → dist-D66X8iAn.js} +1 -1
  300. package/public/dist/assets/dist-D815C1Fv.js +1 -0
  301. package/public/dist/assets/{dist-Ch6JG5jE.js → dist-DDDFJ8jG.js} +1 -1
  302. package/public/dist/assets/{dist-2oDfqE98.js → dist-DHQI31dn.js} +1 -1
  303. package/public/dist/assets/{dist-BTp_Oy_x.js → dist-DTQW91xt.js} +1 -1
  304. package/public/dist/assets/{dist-BuaQLcgQ.js → dist-Dm7RAaUo.js} +1 -1
  305. package/public/dist/assets/{dist-BJyDhGpS.js → dist-DrIWh2fi.js} +1 -1
  306. package/public/dist/assets/{dist-BGzHP3f8.js → dist-DzT7frM2.js} +1 -1
  307. package/public/dist/assets/{dist-wdLr2dSH.js → dist-Qs7HHNCC.js} +1 -1
  308. package/public/dist/assets/{dist-BjqyutOM.js → dist-Rs_Khtjb.js} +1 -1
  309. package/public/dist/assets/{dist-DdhWu7OM.js → dist-fJAyK82z.js} +1 -1
  310. package/public/dist/assets/{dist-G7QUHtDS.js → dist-jcptfm_T.js} +1 -1
  311. package/public/dist/assets/dist-sOV2kBhQ.js +1 -0
  312. package/public/dist/assets/{dist-BoG5I6U5.js → dist-vQskrHxt.js} +1 -1
  313. package/public/dist/assets/{dockerfile-CrC2HXHP.js → dockerfile-DAfh5qoE.js} +1 -1
  314. package/public/dist/assets/{employees-CIkIyvtL.js → employees-DRmX2RDd.js} +2 -2
  315. package/public/dist/assets/{erDiagram-SMLLAGMA-BvtqhMsS.js → erDiagram-TEJ5UH35-CRvCbztR.js} +6 -6
  316. package/public/dist/assets/{error-normalize-CkhPeQYx.js → error-normalize-CNbPE4lO.js} +1 -1
  317. package/public/dist/assets/eventmodeling-FCH6USID-Cq0nylxO.js +1 -0
  318. package/public/dist/assets/{factor-1CttFx2G.js → factor-BpoYJieo.js} +1 -1
  319. package/public/dist/assets/fields-DUawAHWZ.js +1 -0
  320. package/public/dist/assets/flowDiagram-I6XJVG4X-CzvVnib_.js +162 -0
  321. package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +292 -0
  322. package/public/dist/assets/gitGraph-WXDBUCRP-DDq6-3D3.js +1 -0
  323. package/public/dist/assets/gitGraphDiagram-PVQCEYII-CbKdM7nW.js +106 -0
  324. package/public/dist/assets/graphlib-BLOO0H5r.js +1 -0
  325. package/public/dist/assets/info-J43DQDTF-OUnqwpUV.js +1 -0
  326. package/public/dist/assets/infoDiagram-5YYISTIA-BrZmg1At.js +2 -0
  327. package/public/dist/assets/{ishikawaDiagram-UXIWVN3A-DZW-Nqsf.js → ishikawaDiagram-YF4QCWOH-BDWXqJi5.js} +2 -2
  328. package/public/dist/assets/javascript-CZjRNq5R.js +1 -0
  329. package/public/dist/assets/{journeyDiagram-VCZTEJTY-ByVRJxVF.js → journeyDiagram-JHISSGLW-CPFRd_M3.js} +6 -6
  330. package/public/dist/assets/{jsx-runtime-BjL7qHh8.js → jsx-runtime-BZmCptaP.js} +1 -1
  331. package/public/dist/assets/{kanban-definition-6JOO6SKY-xwN0YCW2.js → kanban-definition-UN3LZRKU-BcQbBplS.js} +10 -10
  332. package/public/dist/assets/katex-CF5bGce6.js +1 -0
  333. package/public/dist/assets/manager-B5OmizBL.css +1 -0
  334. package/public/dist/assets/manager-Cs3eMBcx.js +25 -0
  335. package/public/dist/assets/{memory-CnBc2_Va.js → memory-BA-ki3gn.js} +1 -1
  336. package/public/dist/assets/memory-DLQbyBA3.js +1 -0
  337. package/public/dist/assets/mermaid-loader-BVPsKrpr.js +1 -0
  338. package/public/dist/assets/mermaid-parser.core-C62NUJRb.js +3 -0
  339. package/public/dist/assets/mermaid.core-ArqR5iFa.js +9 -0
  340. package/public/dist/assets/mermaid.core-BAwu4U2Y.js +1 -0
  341. package/public/dist/assets/{mindmap-definition-QFDTVHPH-Chqgsh1N.js → mindmap-definition-RKZ34NQL-C35cGkNU.js} +29 -29
  342. package/public/dist/assets/{nsis-_CjIiUyF.js → nsis-Ch4QINLN.js} +1 -1
  343. package/public/dist/assets/packet-YPE3B663-Bb9hBQ06.js +1 -0
  344. package/public/dist/assets/{page-shell-CTxVDJ8Y.js → page-shell-CVAobxbP.js} +1 -1
  345. package/public/dist/assets/pie-LRSECV5Y-CNRQnRNZ.js +1 -0
  346. package/public/dist/assets/pieDiagram-4H26LBE5-B8C_hoqJ.js +30 -0
  347. package/public/dist/assets/provider-icons-dxT69zGg.js +8 -0
  348. package/public/dist/assets/{pug-CbR8lCtK.js → pug-CXYqmmpP.js} +1 -1
  349. package/public/dist/assets/quadrantDiagram-W4KKPZXB-BEPrine5.js +7 -0
  350. package/public/dist/assets/radar-GUYGQ44K-BxngU2v0.js +1 -0
  351. package/public/dist/assets/{render-lpTpN1El.js → render-C7_e0J_X.js} +3 -3
  352. package/public/dist/assets/{requirementDiagram-MS252O5E-wnPtv0LG.js → requirementDiagram-4Y6WPE33-ClDDon9c.js} +4 -4
  353. package/public/dist/assets/rolldown-runtime-XQCOJYun.js +1 -0
  354. package/public/dist/assets/sankeyDiagram-5OEKKPKP-Bjs3OE-1.js +40 -0
  355. package/public/dist/assets/sequenceDiagram-3UESZ5HK-BM8IAaEe.js +162 -0
  356. package/public/dist/assets/settings-DjyKdqev.js +1 -0
  357. package/public/dist/assets/settings-pUJzyeX2.js +42 -0
  358. package/public/dist/assets/{sidebar-Cwt0FxQl.js → sidebar-CO9Qjj6v.js} +2 -2
  359. package/public/dist/assets/skills-CX3qJ77s.js +1 -0
  360. package/public/dist/assets/{skills-DDmTyywh.js → skills-Dq7fD8I3.js} +1 -1
  361. package/public/dist/assets/{slash-commands-D5y5AVvS.js → slash-commands-DRsKtuGT.js} +1 -1
  362. package/public/dist/assets/slash-commands-UbS8w9ij.js +1 -0
  363. package/public/dist/assets/stateDiagram-AJRCARHV-BvNABuXE.js +1 -0
  364. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +1 -0
  365. package/public/dist/assets/{timeline-definition-GMOUNBTQ-DUz1-iOx.js → timeline-definition-PNZ67QCA-CIvTvac3.js} +8 -8
  366. package/public/dist/assets/trace-drawer-DDFdU07_.js +15 -0
  367. package/public/dist/assets/treeView-BLDUP644-cXRzPGzz.js +1 -0
  368. package/public/dist/assets/treemap-LRROVOQU-BsZE5HPE.js +1 -0
  369. package/public/dist/assets/ui-CeBmBBZM.js +140 -0
  370. package/public/dist/assets/ui-TMXjvH0r.js +1 -0
  371. package/public/dist/assets/{vendor-render-DEStnpJ8.js → vendor-render-DCb9B75Q.js} +38 -37
  372. package/public/dist/assets/vendor-utils-BnxL60_-.js +1 -0
  373. package/public/dist/assets/vennDiagram-CIIHVFJN-C5cbS2KC.js +34 -0
  374. package/public/dist/assets/wardley-L42UT6IY-D_qm0cZD.js +1 -0
  375. package/public/dist/assets/{wardleyDiagram-NUSXRM2D-CLAhOzap.js → wardleyDiagram-YWT4CUSO-BsRBBGFP.js} +61 -3
  376. package/public/dist/assets/{wiki-link-suggestions-LQuYT22G.js → wiki-link-suggestions-BHwNQXT_.js} +2 -2
  377. package/public/dist/assets/{xychartDiagram-5P7HB3ND-DLnY9i8z.js → xychartDiagram-2RQKCTM6-B6rqui6F.js} +6 -6
  378. package/public/dist/index.html +102 -3
  379. package/public/dist/manager/index.html +2 -2
  380. package/public/index.html +101 -1
  381. package/public/js/constants.ts +72 -0
  382. package/public/js/diagram/iframe-renderer.ts +7 -0
  383. package/public/js/features/chat-scroll.ts +31 -0
  384. package/public/js/features/chat-search.ts +223 -0
  385. package/public/js/features/help-content.ts +20 -2
  386. package/public/js/features/help-dialog.ts +38 -2
  387. package/public/js/features/pending-queue.ts +6 -0
  388. package/public/js/features/process-block.ts +20 -0
  389. package/public/js/features/settings-channel.ts +3 -1
  390. package/public/js/features/settings-cli-status.ts +24 -3
  391. package/public/js/features/settings-core.ts +134 -21
  392. package/public/js/features/settings-types.ts +12 -1
  393. package/public/js/features/settings.ts +1 -1
  394. package/public/js/features/trace-drawer.ts +2 -1
  395. package/public/js/features/voice-recorder.ts +222 -42
  396. package/public/js/main.ts +58 -4
  397. package/public/js/provider-icons.ts +46 -27
  398. package/public/js/render/markdown.ts +6 -0
  399. package/public/js/ui.ts +33 -7
  400. package/public/js/ws.ts +5 -1
  401. package/public/locales/en.json +31 -7
  402. package/public/locales/ja.json +31 -7
  403. package/public/locales/ko.json +31 -7
  404. package/public/locales/zh.json +31 -7
  405. package/public/manager/src/App.tsx +19 -55
  406. package/public/manager/src/InstancePreview.tsx +46 -1
  407. package/public/manager/src/components/InstanceDetailPanel.tsx +7 -2
  408. package/public/manager/src/components/InstanceLogsPanel.tsx +138 -0
  409. package/public/manager/src/dashboard-settings/DashboardEmbeddingSection.tsx +37 -7
  410. package/public/manager/src/jaw-ceo/useJawCeoDashboardBridge.tsx +1 -0
  411. package/public/manager/src/manager-components.css +76 -0
  412. package/public/manager/src/preview.ts +26 -3
  413. package/public/manager/src/settings/fields/SelectField.tsx +51 -17
  414. package/public/manager/src/settings/pages/Agent.tsx +37 -2
  415. package/public/manager/src/settings/pages/Heartbeat.tsx +3 -2
  416. package/public/manager/src/settings/pages/Memory.tsx +3 -2
  417. package/public/manager/src/settings/pages/components/EmployeeRow.tsx +8 -4
  418. package/public/manager/src/settings/pages/components/PerCliRow.tsx +31 -5
  419. package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +4 -2
  420. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +1 -1
  421. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +23 -1
  422. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +49 -0
  423. package/public/manager/src/settings/pages/components/employees-helpers.ts +6 -1
  424. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +11 -1
  425. package/public/manager/src/settings-controls.css +25 -0
  426. package/public/manager/src/usePreviewShortcutMessages.ts +30 -0
  427. package/public/manager/src/usePreviewSttLifecycle.ts +31 -0
  428. package/scripts/fresh-install-smoke.ts +1 -1
  429. package/scripts/install-officecli.ps1 +33 -5
  430. package/scripts/install-officecli.sh +52 -8
  431. package/scripts/install-wsl.sh +96 -24
  432. package/scripts/install.sh +82 -11
  433. package/scripts/postinstall-guard.cjs +57 -30
  434. package/public/dist/assets/Agent-DNpehKB2.js +0 -1
  435. package/public/dist/assets/DashboardEmbeddingSection-BYdGgqg7.js +0 -2
  436. package/public/dist/assets/Employees-CuYuTy0R.js +0 -1
  437. package/public/dist/assets/Heartbeat-C-vq02MW.js +0 -1
  438. package/public/dist/assets/Memory-BPKWJDXK.js +0 -1
  439. package/public/dist/assets/ModelProvider-Bd6vGkXT.js +0 -1
  440. package/public/dist/assets/agent-meta-C1pQzExf.js +0 -1
  441. package/public/dist/assets/app-BxsIleo0.js +0 -32
  442. package/public/dist/assets/app-CB9n5A77.css +0 -1
  443. package/public/dist/assets/architecture-YZFGNWBL-BRI-0IaU.js +0 -1
  444. package/public/dist/assets/architectureDiagram-Q4EWVU46-z0JCgZrJ.js +0 -36
  445. package/public/dist/assets/blockDiagram-DXYQGD6D-KaOz3aFS.js +0 -132
  446. package/public/dist/assets/channel-jLopKIgm.js +0 -1
  447. package/public/dist/assets/chunk-2KRD3SAO-C8hJZPJu.js +0 -1
  448. package/public/dist/assets/chunk-426QAEUC-atJRhvKN.js +0 -1
  449. package/public/dist/assets/chunk-4TB4RGXK-BD7UhIN8.js +0 -206
  450. package/public/dist/assets/chunk-55IACEB6-CAWcPDdr.js +0 -1
  451. package/public/dist/assets/chunk-5FUZZQ4R-Cg1pzs6p.js +0 -62
  452. package/public/dist/assets/chunk-5PVQY5BW-otv3HwE_.js +0 -2
  453. package/public/dist/assets/chunk-67CJDMHE-AU2iOKLT.js +0 -1
  454. package/public/dist/assets/chunk-7N4EOEYR-BTIS4jBw.js +0 -1
  455. package/public/dist/assets/chunk-AA7GKIK3-c9UUJO_T.js +0 -1
  456. package/public/dist/assets/chunk-CIAEETIT-Dwbln6rM.js +0 -1
  457. package/public/dist/assets/chunk-ENJZ2VHE-PT_jAckw.js +0 -10
  458. package/public/dist/assets/chunk-FOC6F5B3-BqDmFFeg.js +0 -1
  459. package/public/dist/assets/chunk-ICPOFSXX-P6V6jqiT.js +0 -122
  460. package/public/dist/assets/chunk-K5T4RW27-C42sOmZR.js +0 -27
  461. package/public/dist/assets/chunk-KGLVRYIC-K-BVa8b2.js +0 -1
  462. package/public/dist/assets/chunk-ORNJ4GCN-CEXU6WaD.js +0 -1
  463. package/public/dist/assets/chunk-OYMX7WX6-DmJG2z1S.js +0 -231
  464. package/public/dist/assets/chunk-QZHKN3VN-BkVLii_3.js +0 -1
  465. package/public/dist/assets/chunk-U2HBQHQK-Ny6UwUgK.js +0 -11
  466. package/public/dist/assets/chunk-YZCP3GAM-c7FYtZME.js +0 -1
  467. package/public/dist/assets/classDiagram-6PBFFD2Q-BgOyAynm.js +0 -1
  468. package/public/dist/assets/classDiagram-v2-HSJHXN6E-5gBdoVH9.js +0 -1
  469. package/public/dist/assets/constants-4A2GptQT.js +0 -1
  470. package/public/dist/assets/cose-bilkent-S5V4N54A-CvH6qY_r.js +0 -1
  471. package/public/dist/assets/dagre--20B2-ZQ.js +0 -1
  472. package/public/dist/assets/dagre-KV5264BT-CQ0wo0ma.js +0 -4
  473. package/public/dist/assets/diagram-G4DWMVQ6-_aP6kMTh.js +0 -24
  474. package/public/dist/assets/diagram-MMDJMWI5-J1l6Q0JG.js +0 -43
  475. package/public/dist/assets/dist-B1p80u1b.js +0 -1
  476. package/public/dist/assets/dist-BKyzWv22.js +0 -1
  477. package/public/dist/assets/dist-CxJpXP6s.js +0 -1
  478. package/public/dist/assets/dist-DNLFuTrS.js +0 -1
  479. package/public/dist/assets/fields-BISouxp2.js +0 -1
  480. package/public/dist/assets/flowDiagram-DWJPFMVM-C_F0rqqT.js +0 -162
  481. package/public/dist/assets/ganttDiagram-T4ZO3ILL-B5S8EZRg.js +0 -292
  482. package/public/dist/assets/gitGraph-7Q5UKJZL-DTTW6pxr.js +0 -1
  483. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-DMGzYJeb.js +0 -106
  484. package/public/dist/assets/graphlib-CZk_Ii16.js +0 -1
  485. package/public/dist/assets/info-OMHHGYJF-BU-iuaSm.js +0 -1
  486. package/public/dist/assets/infoDiagram-42DDH7IO-dzSaYFFK.js +0 -2
  487. package/public/dist/assets/javascript-BhB45e0W.js +0 -1
  488. package/public/dist/assets/katex-DamPUmTE.js +0 -1
  489. package/public/dist/assets/manager-B84u-pcn.js +0 -25
  490. package/public/dist/assets/manager-DMg_sTEP.css +0 -1
  491. package/public/dist/assets/memory-BV62wlsG.js +0 -1
  492. package/public/dist/assets/mermaid-loader-DxFGz4EE.js +0 -1
  493. package/public/dist/assets/mermaid-parser.core-CMIZ0my_.js +0 -3
  494. package/public/dist/assets/mermaid.core-CicVBD9l.js +0 -1
  495. package/public/dist/assets/mermaid.core-Dj6viEzN.js +0 -11
  496. package/public/dist/assets/packet-4T2RLAQJ-DzmBsAf0.js +0 -1
  497. package/public/dist/assets/pie-ZZUOXDRM-DyG1KzTn.js +0 -1
  498. package/public/dist/assets/pieDiagram-DEJITSTG-DJLiSymi.js +0 -30
  499. package/public/dist/assets/quadrantDiagram-34T5L4WZ-qcnWmcRr.js +0 -7
  500. package/public/dist/assets/radar-PYXPWWZC-CEBZARUu.js +0 -1
  501. package/public/dist/assets/rolldown-runtime-DE9SaGGd.js +0 -1
  502. package/public/dist/assets/sankeyDiagram-XADWPNL6-Bn3pUd_K.js +0 -10
  503. package/public/dist/assets/sequenceDiagram-FGHM5R23-DfxcHSdj.js +0 -157
  504. package/public/dist/assets/settings-CfAXLa8a.js +0 -1
  505. package/public/dist/assets/settings-FWgmcubl.js +0 -40
  506. package/public/dist/assets/skills-D-qUVJ-e.js +0 -1
  507. package/public/dist/assets/slash-commands-BfI19vIz.js +0 -1
  508. package/public/dist/assets/stateDiagram-FHFEXIEX-CiR7P2OG.js +0 -1
  509. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-BaWWpysK.js +0 -1
  510. package/public/dist/assets/trace-drawer-DVF5F1df.js +0 -15
  511. package/public/dist/assets/treeView-SZITEDCU-D5-TP7Qp.js +0 -1
  512. package/public/dist/assets/treemap-W4RFUUIX-BQhm_ZSp.js +0 -1
  513. package/public/dist/assets/ui-BJXY16Dk.js +0 -140
  514. package/public/dist/assets/ui-BXm3OPPh.js +0 -1
  515. package/public/dist/assets/vendor-utils-IVTPs69f.js +0 -68
  516. package/public/dist/assets/vennDiagram-DHZGUBPP-CYu7SDdG.js +0 -34
  517. package/public/dist/assets/wardley-RL74JXVD-CpnBMRe0.js +0 -1
  518. package/public/manager/src/settings/pages/Embedding.tsx +0 -382
  519. /package/public/dist/assets/{apl-HYRstREL.js → apl-CieDeb7B.js} +0 -0
  520. /package/public/dist/assets/{asciiarmor-BDXCrhAK.js → asciiarmor-BRTyulZY.js} +0 -0
  521. /package/public/dist/assets/{asn1-CnSBhb0M.js → asn1-DoNAtQ5o.js} +0 -0
  522. /package/public/dist/assets/{asterisk-AqV7rnIi.js → asterisk-CR7oKPxi.js} +0 -0
  523. /package/public/dist/assets/{brainfuck-Dv46-iL9.js → brainfuck-abzPcrOz.js} +0 -0
  524. /package/public/dist/assets/{clike-GRffz5hY.js → clike-B71Zq38G.js} +0 -0
  525. /package/public/dist/assets/{clojure-DzgT_fqE.js → clojure-Zm0UzHPq.js} +0 -0
  526. /package/public/dist/assets/{cmake-Co1237r5.js → cmake-D3UNdg6L.js} +0 -0
  527. /package/public/dist/assets/{cobol-rUaLketb.js → cobol-4fYvwQR0.js} +0 -0
  528. /package/public/dist/assets/{coffeescript-DQyfHE86.js → coffeescript-Ct6bZdRU.js} +0 -0
  529. /package/public/dist/assets/{commonlisp-Buue1PGW.js → commonlisp-CrgXVPcd.js} +0 -0
  530. /package/public/dist/assets/{crystal-BMWO0kOJ.js → crystal-bGOl67VM.js} +0 -0
  531. /package/public/dist/assets/{css-DaxibPo5.js → css-B_EV3Xq2.js} +0 -0
  532. /package/public/dist/assets/{cypher-CmpGfiBR.js → cypher-DXDlHTYf.js} +0 -0
  533. /package/public/dist/assets/{cytoscape.esm-zT8GwLFm.js → cytoscape.esm-BK7ao2Ti.js} +0 -0
  534. /package/public/dist/assets/{d-qmdtoIzU.js → d-RL5ynsiz.js} +0 -0
  535. /package/public/dist/assets/{diff-B40m6u1h.js → diff-B5McBGjz.js} +0 -0
  536. /package/public/dist/assets/{dtd-569ynYVj.js → dtd-l3sK4p_C.js} +0 -0
  537. /package/public/dist/assets/{dylan-Dxolp30i.js → dylan-WjJGY-rW.js} +0 -0
  538. /package/public/dist/assets/{ebnf-BZiX9Iq3.js → ebnf-BGY79HOS.js} +0 -0
  539. /package/public/dist/assets/{ecl-B8F1Q0oZ.js → ecl-BKh7OE1d.js} +0 -0
  540. /package/public/dist/assets/{eiffel-Bv8Kvgh1.js → eiffel-Bzvlg3oK.js} +0 -0
  541. /package/public/dist/assets/{elm-QWXQaIis.js → elm-5_BqNmKu.js} +0 -0
  542. /package/public/dist/assets/{erlang-CuDGzTGm.js → erlang-BdVwz8I8.js} +0 -0
  543. /package/public/dist/assets/{fcl-BiFeqtHf.js → fcl-B9cnfODD.js} +0 -0
  544. /package/public/dist/assets/{forth-R7Uc2VcL.js → forth-wZbbnGzb.js} +0 -0
  545. /package/public/dist/assets/{fortran-kDRG6BzW.js → fortran-BAJZrRfU.js} +0 -0
  546. /package/public/dist/assets/{gas-CyRkuC5T.js → gas-D60ZhBat.js} +0 -0
  547. /package/public/dist/assets/{gherkin-BE0p00ey.js → gherkin-B8tKjAAi.js} +0 -0
  548. /package/public/dist/assets/{groovy-B_Sh3D1t.js → groovy-BAG9eJUD.js} +0 -0
  549. /package/public/dist/assets/{haskell-DWXgCy4o.js → haskell-Cj4TmWbg.js} +0 -0
  550. /package/public/dist/assets/{haxe-xGxZ54Hv.js → haxe-8chnvz-o.js} +0 -0
  551. /package/public/dist/assets/{http-CKv9cSBA.js → http-DDYeO71z.js} +0 -0
  552. /package/public/dist/assets/{idl-DmlI3XzS.js → idl-D1hY-Gp_.js} +0 -0
  553. /package/public/dist/assets/{javascript-j6r5uf_k.js → javascript-Sh0ZUMP2.js} +0 -0
  554. /package/public/dist/assets/{julia-CQSp9Qa0.js → julia-BibioBF2.js} +0 -0
  555. /package/public/dist/assets/{livescript-CqvtVTlb.js → livescript-CSZrB6F4.js} +0 -0
  556. /package/public/dist/assets/{lua-DazQKUZ0.js → lua-BvTlo5w3.js} +0 -0
  557. /package/public/dist/assets/{mathematica-DqhJVCs9.js → mathematica-Bexv8BWZ.js} +0 -0
  558. /package/public/dist/assets/{mbox-Dsyo1_UL.js → mbox-BAhbA8z2.js} +0 -0
  559. /package/public/dist/assets/{mirc-D7ThhoF-.js → mirc-BzT5Kh4S.js} +0 -0
  560. /package/public/dist/assets/{mllike-EPZ6pqQD.js → mllike-DeoJnUZQ.js} +0 -0
  561. /package/public/dist/assets/{modelica-PU45hbqg.js → modelica-FD_-Fxlc.js} +0 -0
  562. /package/public/dist/assets/{mscgen-DEnh2Ojr.js → mscgen-C-OyhbwB.js} +0 -0
  563. /package/public/dist/assets/{mumps-8GhR7rRa.js → mumps-BxkCDTK7.js} +0 -0
  564. /package/public/dist/assets/{nginx-CXwagpwp.js → nginx-2JaV__gC.js} +0 -0
  565. /package/public/dist/assets/{ntriples-BDQxxstw.js → ntriples--rhhCzqb.js} +0 -0
  566. /package/public/dist/assets/{octave-2c90WnyU.js → octave-rS4nMzRe.js} +0 -0
  567. /package/public/dist/assets/{oz-CO0rQ8EL.js → oz-I4fMb_NC.js} +0 -0
  568. /package/public/dist/assets/{pascal-CcVwOGeN.js → pascal-BEghJs8t.js} +0 -0
  569. /package/public/dist/assets/{path-utils-DySmCVZK.js → path-utils-r2bJIu28.js} +0 -0
  570. /package/public/dist/assets/{perl-B9UvGoAV.js → perl-BRO9ZFo9.js} +0 -0
  571. /package/public/dist/assets/{pig-Cd1f86ZJ.js → pig-L4Ii6KI0.js} +0 -0
  572. /package/public/dist/assets/{powershell-DV4cOnkJ.js → powershell-BBeqUCRp.js} +0 -0
  573. /package/public/dist/assets/{properties-DaSVPhrZ.js → properties-Boi0jF2J.js} +0 -0
  574. /package/public/dist/assets/{protobuf-CEtFnY22.js → protobuf-fB2aGypX.js} +0 -0
  575. /package/public/dist/assets/{puppet-Ca0DHfcW.js → puppet-BRmsErtO.js} +0 -0
  576. /package/public/dist/assets/{python-ydzCwWG-.js → python-Be4P9Dgp.js} +0 -0
  577. /package/public/dist/assets/{q-Cl8kzQmk.js → q-DZGhDLYt.js} +0 -0
  578. /package/public/dist/assets/{r-DKZPJFrD.js → r-B4NERjRM.js} +0 -0
  579. /package/public/dist/assets/{rough.esm-Dnk3WN4D.js → rough.esm-C0Gkx4O1.js} +0 -0
  580. /package/public/dist/assets/{rpm-D0lqeHoZ.js → rpm-e-QbHJ1q.js} +0 -0
  581. /package/public/dist/assets/{ruby-RVmtmNDw.js → ruby-BSVP_v59.js} +0 -0
  582. /package/public/dist/assets/{sas-CEzodAB7.js → sas-DHlU4v4g.js} +0 -0
  583. /package/public/dist/assets/{scheme-Pqmt6dh3.js → scheme-BGXbz5Hz.js} +0 -0
  584. /package/public/dist/assets/{settings-client-BN3XzwEo.js → settings-client-DPuJroyk.js} +0 -0
  585. /package/public/dist/assets/{shell-CLG3zy-u.js → shell-yonx6xY2.js} +0 -0
  586. /package/public/dist/assets/{sieve-C95IWC3O.js → sieve-ClPJUZyi.js} +0 -0
  587. /package/public/dist/assets/{simple-mode-B9ErAHMD.js → simple-mode-CjViblDK.js} +0 -0
  588. /package/public/dist/assets/{smalltalk-4cL-gRJb.js → smalltalk-CHXubeqS.js} +0 -0
  589. /package/public/dist/assets/{solr-CEA7oOx_.js → solr-C6q6YwPz.js} +0 -0
  590. /package/public/dist/assets/{sparql-w8kHjP6I.js → sparql-CcspZvEd.js} +0 -0
  591. /package/public/dist/assets/{spreadsheet-C8bDfTgC.js → spreadsheet-DH3a4LBS.js} +0 -0
  592. /package/public/dist/assets/{sql-BrKz8968.js → sql-meoY6gNi.js} +0 -0
  593. /package/public/dist/assets/{stex-xFw1nXeT.js → stex-D2bn6Zsh.js} +0 -0
  594. /package/public/dist/assets/{stylus-gS_68vPk.js → stylus-DbXGih0S.js} +0 -0
  595. /package/public/dist/assets/{swift-D5lXmY2d.js → swift-Ch391uOd.js} +0 -0
  596. /package/public/dist/assets/{tcl-D-41REtC.js → tcl-CQBgGWDP.js} +0 -0
  597. /package/public/dist/assets/{textile-D-Znao0j.js → textile-4i3oG3tg.js} +0 -0
  598. /package/public/dist/assets/{tiddlywiki-Co8lXJKd.js → tiddlywiki-CXG1-CcK.js} +0 -0
  599. /package/public/dist/assets/{tiki-DsiNRYMP.js → tiki-DJqKUhA-.js} +0 -0
  600. /package/public/dist/assets/{toml-CaVZGou4.js → toml-C1FnyICQ.js} +0 -0
  601. /package/public/dist/assets/{troff-DJvDVr-d.js → troff-Cp8NvRO0.js} +0 -0
  602. /package/public/dist/assets/{ttcn-DAC92l4d.js → ttcn-NlmW_fji.js} +0 -0
  603. /package/public/dist/assets/{ttcn-cfg-C0X-mYlr.js → ttcn-cfg-BVuxfGZf.js} +0 -0
  604. /package/public/dist/assets/{turtle-D6WHyCrL.js → turtle-Ba9ERlnm.js} +0 -0
  605. /package/public/dist/assets/{vb-CEo_ccq3.js → vb-DDs4gjJb.js} +0 -0
  606. /package/public/dist/assets/{vbscript-B_PKDV1v.js → vbscript-gOFmdMJN.js} +0 -0
  607. /package/public/dist/assets/{velocity-ClKnKBLH.js → velocity-DtSNZA7i.js} +0 -0
  608. /package/public/dist/assets/{verilog-Pnuspgw6.js → verilog-Pldmtxe7.js} +0 -0
  609. /package/public/dist/assets/{vhdl-CZnyY4fs.js → vhdl-BFfSgWGp.js} +0 -0
  610. /package/public/dist/assets/{w3c-keyname-DJlC6DTY.js → w3c-keyname-BggQEPNo.js} +0 -0
  611. /package/public/dist/assets/{webidl-DHr762Dm.js → webidl-B6ZFYE2L.js} +0 -0
  612. /package/public/dist/assets/{xquery-5-FiyUtN.js → xquery-DhxUT98N.js} +0 -0
  613. /package/public/dist/assets/{yacas-GlqsXIeT.js → yacas-jSkQeF1Q.js} +0 -0
  614. /package/public/dist/assets/{z80-CI7N40Oo.js → z80-D7Lt6v61.js} +0 -0
@@ -225,11 +225,52 @@
225
225
  padding-left: 18px;
226
226
  }
227
227
 
228
+ /* Numbered steps for setup guides (Telegram/Discord howTo) */
229
+ .help-howto-list {
230
+ list-style: decimal;
231
+ padding-left: 1.6em;
232
+ margin: 0;
233
+ }
234
+ .help-howto-list li {
235
+ margin-bottom: 3px;
236
+ line-height: 1.5;
237
+ }
238
+
228
239
  .help-dialog-done {
229
240
  width: auto;
230
241
  padding: 6px 18px;
231
242
  }
232
243
 
244
+ .help-doc-links-nav {
245
+ display: flex;
246
+ gap: 8px;
247
+ flex-wrap: wrap;
248
+ margin-bottom: 4px;
249
+ }
250
+
251
+ .help-doc-link {
252
+ display: inline-flex;
253
+ align-items: center;
254
+ gap: 4px;
255
+ padding: 6px 14px;
256
+ border-radius: 6px;
257
+ background: var(--accent, #22d3ee);
258
+ color: var(--surface, #1a1a2e);
259
+ font-size: 0.85rem;
260
+ font-weight: 600;
261
+ text-decoration: none;
262
+ transition: opacity 0.15s;
263
+ }
264
+
265
+ .help-doc-link:hover {
266
+ opacity: 0.85;
267
+ }
268
+
269
+ .help-doc-link-icon {
270
+ font-size: 0.75rem;
271
+ opacity: 0.7;
272
+ }
273
+
233
274
  @media (max-width: 768px) {
234
275
  .help-trigger {
235
276
  position: relative;
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{t as r}from"./error-normalize-CkhPeQYx.js";import{a as i,i as a,n as o,r as s,t as c}from"./page-shell-CTxVDJ8Y.js";var l=e(t(),1),u=n();function d(e,t){let n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}function f(e){let t;try{t=JSON.parse(e)}catch(e){return{ok:!1,error:`Invalid JSON: ${e.message}`}}return!t||typeof t!=`object`||Array.isArray(t)?{ok:!1,error:`Import payload must be a JSON object.`}:{ok:!0,value:t}}function p({port:e,client:t,triggerDownload:n}){let{state:p}=i(t,`/api/settings`),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(``),[v,y]=(0,l.useState)(null),[b,x]=(0,l.useState)(!1),[S,C]=(0,l.useState)(null),w=n||d;(0,l.useEffect)(()=>{_(``),y(null),C(null)},[e]);let T=(0,l.useCallback)(()=>{p.kind===`ready`&&w(`cli-jaw-settings-${e}.json`,JSON.stringify(p.data,null,2))},[p,e,w]),E=(0,l.useCallback)(async()=>{let e=f(g);if(!e.ok){y(e.error),C(null);return}y(null),C(null),x(!0);try{await t.put(`/api/settings`,e.value),C(`Imported. Reload the page to refresh other tabs.`)}catch(e){y(r(e))}finally{x(!1)}},[t,g]);return p.kind===`loading`?(0,u.jsx)(o,{}):p.kind===`offline`?(0,u.jsx)(s,{port:e}):p.kind===`error`?(0,u.jsx)(c,{message:p.message}):(0,u.jsxs)(`div`,{className:`settings-page-form`,children:[(0,u.jsx)(a,{title:`Export`,hint:`Download the resolved /i/${e}/api/settings document as JSON.`,children:(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,onClick:T,children:`Download settings JSON`})}),(0,u.jsxs)(a,{title:`Import (advanced)`,hint:`Replaces matching keys via PUT. Only enable when you understand the impact.`,children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-toggle`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Show import controls`}),(0,u.jsx)(`input`,{id:`advanced-toggle`,type:`checkbox`,checked:m,onChange:e=>h(e.target.checked)})]}),m?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-import`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Settings JSON`}),(0,u.jsx)(`textarea`,{id:`advanced-import`,rows:8,value:g,placeholder:`{"cli":"codex","tui":{"themeSeed":"jaw-dark"}}`,onChange:e=>_(e.target.value),"aria-invalid":!!v}),v?(0,u.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:v}):null,S?(0,u.jsx)(`span`,{className:`settings-field-description`,role:`status`,children:S}):null]}),(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void E(),disabled:b||g.trim()===``,children:b?`Importing…`:`Apply import`})]}):null]})]})}export{p as default,f as validateImportPayload};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{t as r}from"./error-normalize-CNbPE4lO.js";import{a as i,i as a,n as o,r as s,t as c}from"./page-shell-CVAobxbP.js";var l=e(t(),1),u=n();function d(e,t){let n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}function f(e){let t;try{t=JSON.parse(e)}catch(e){return{ok:!1,error:`Invalid JSON: ${e.message}`}}return!t||typeof t!=`object`||Array.isArray(t)?{ok:!1,error:`Import payload must be a JSON object.`}:{ok:!0,value:t}}function p({port:e,client:t,triggerDownload:n}){let{state:p}=i(t,`/api/settings`),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(``),[v,y]=(0,l.useState)(null),[b,x]=(0,l.useState)(!1),[S,C]=(0,l.useState)(null),w=n||d;(0,l.useEffect)(()=>{_(``),y(null),C(null)},[e]);let T=(0,l.useCallback)(()=>{p.kind===`ready`&&w(`cli-jaw-settings-${e}.json`,JSON.stringify(p.data,null,2))},[p,e,w]),E=(0,l.useCallback)(async()=>{let e=f(g);if(!e.ok){y(e.error),C(null);return}y(null),C(null),x(!0);try{await t.put(`/api/settings`,e.value),C(`Imported. Reload the page to refresh other tabs.`)}catch(e){y(r(e))}finally{x(!1)}},[t,g]);return p.kind===`loading`?(0,u.jsx)(o,{}):p.kind===`offline`?(0,u.jsx)(s,{port:e}):p.kind===`error`?(0,u.jsx)(c,{message:p.message}):(0,u.jsxs)(`div`,{className:`settings-page-form`,children:[(0,u.jsx)(a,{title:`Export`,hint:`Download the resolved /i/${e}/api/settings document as JSON.`,children:(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,onClick:T,children:`Download settings JSON`})}),(0,u.jsxs)(a,{title:`Import (advanced)`,hint:`Replaces matching keys via PUT. Only enable when you understand the impact.`,children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-toggle`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Show import controls`}),(0,u.jsx)(`input`,{id:`advanced-toggle`,type:`checkbox`,checked:m,onChange:e=>h(e.target.checked)})]}),m?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-import`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Settings JSON`}),(0,u.jsx)(`textarea`,{id:`advanced-import`,rows:8,value:g,placeholder:`{"cli":"codex","tui":{"themeSeed":"jaw-dark"}}`,onChange:e=>_(e.target.value),"aria-invalid":!!v}),v?(0,u.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:v}):null,S?(0,u.jsx)(`span`,{className:`settings-field-description`,role:`status`,children:S}):null]}),(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void E(),disabled:b||g.trim()===``,children:b?`Importing…`:`Apply import`})]}):null]})]})}export{p as default,f as validateImportPayload};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{i as c,s as l}from"./fields-DUawAHWZ.js";import{a as u,n as d,o as f}from"./Permissions-BkADXjQ4.js";import{a as p,i as m,n as h,r as g,t as _}from"./agent-meta-Du8y6mSM.js";import{t as v}from"./path-utils-r2bJIu28.js";var y=e(t(),1),b=n();function x({cli:e,cliOptions:t,provider:n=``,providerOptions:r=[],model:a,modelOptions:o,effort:s,effortOptions:u,workingDir:d,workingDirError:f,onCliChange:p,onProviderChange:m,onModelChange:g,onEffortChange:v,onWorkingDirChange:y}){return(0,b.jsx)(i,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-cli`,label:`Active CLI`,value:e,options:[...t.filter(e=>_.includes(e)).map(e=>({value:e,label:h(e).label||e})),...t.filter(e=>!_.includes(e)).map(e=>({value:e,label:h(e).label||e}))],collapsedAfter:t.filter(e=>_.includes(e)).length,onChange:p}),e===`ai-e`&&r.length>0?(0,b.jsx)(c,{id:`agent-ai-e-provider`,label:`AI-E provider`,value:n,options:r.map(e=>({value:e,label:e})),onChange:e=>m?.(e)}):null,(0,b.jsx)(c,{id:`agent-model`,label:`Active model`,value:a,options:o.length>0?o:[{value:``,label:`(default)`}],onChange:g}),(0,b.jsx)(c,{id:`agent-effort`,label:`Effort`,value:s,options:[{value:``,label:`(default)`},...u.map(e=>({value:e,label:e}))],disabled:u.length===0,onChange:v}),(0,b.jsx)(l,{id:`agent-workingDir`,label:`Working directory`,value:d,error:f,placeholder:`/path/to/project`,onChange:y})]})})}var S=[{value:`auto`,label:`Auto`},{value:`custom`,label:`Custom allowlist`}];function C({value:e,onChange:t}){let n=u(e),r=n.mode===`custom`?`custom`:`auto`,a=n.mode===`custom`?n.tokens:[],o=n.mode===`custom`?`${a.length} explicit token${a.length===1?``:`s`}`:`Runtime resolves allowed capabilities`;return(0,b.jsxs)(i,{title:`Permissions`,hint:`Quick runtime mode. Open Permissions for detailed allowlist editing.`,children:[(0,b.jsx)(c,{id:`agent-permissions-mode`,label:`Mode`,value:r,options:S,onChange:e=>{t(e===`auto`?`auto`:a.length>0&&d(a)?a:f(null))}}),(0,b.jsx)(`p`,{className:`settings-agent-note`,children:o})]})}function w({activeCli:e,flushCli:t,flushModel:n,cliOptions:r,modelOptions:a,loading:o,error:s,onFlushCliChange:l,onFlushModelChange:u}){let d=t||e,f=d?h(d).label||d:`active`;return(0,b.jsx)(i,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,b.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,b.jsxs)(`summary`,{children:[(0,b.jsx)(`span`,{children:`Flush runtime`}),(0,b.jsxs)(`code`,{children:[f,n&&n!==`default`?` / ${n}`:``]})]}),o?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,s?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:s}):null,(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-flush-cli`,label:`Flush CLI`,value:t,options:[{value:``,label:`(active CLI)`},...r.map(e=>({value:e,label:h(e).label||e}))],onChange:l}),(0,b.jsx)(c,{id:`agent-flush-model`,label:`Flush model`,value:n,options:[{value:``,label:`(default)`},...a],onChange:u})]})]})})}function T(e){return e.source===`static`||e.id.startsWith(`static:`)}function E(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function D(e){let t=e[0]||`claude`;return{id:E(),name:`New Agent`,cli:t,model:`default`,role:``,status:`idle`,source:`db`}}function ee(e){return Array.isArray(e)?e.map(O).filter(Boolean):e.data.map(O).filter(Boolean)}function O(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function k(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function A(e){return e.some(e=>k(e)!==null)}function j(e,t){return JSON.stringify(e.map(L))===JSON.stringify(t.map(L))}function M(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=F(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!T(t)&&o.push(t);return{added:i,updated:a,removed:o}}function N(e,t){let n=M(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function P(e,t,n){let r=M(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,I(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function F(e,t){if(T(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function I(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function L(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function R({employee:e,index:t,cliOptions:n,onChange:r,onRemove:i}){let a=T(e),o=g(h(e.cli).models,e.model),s=k(e),u=Array.from(new Set([...n,e.cli,`claude`])).filter(Boolean);return(0,b.jsxs)(`fieldset`,{className:`settings-runtime-employee-row`,children:[(0,b.jsxs)(`legend`,{children:[e.name||`Employee ${t+1}`,a?(0,b.jsx)(`span`,{children:`static`}):null]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,b.jsx)(l,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:a,error:s===`Name is required`?s:null,onChange:e=>r({name:e})}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,disabled:a,options:u.map(e=>({value:e,label:h(e).label||e})),onChange:e=>{r({cli:e,model:h(e).models[0]||`default`})}}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,options:o.length>0?o:[{value:`default`,label:`default`}],onChange:e=>r({model:e})}),(0,b.jsx)(l,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:a,onChange:e=>r({role:e})})]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-footer`,children:[(0,b.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:a,onClick:i,"aria-label":`Remove employee ${e.name||t+1}`,children:`Remove`})]})]})}function z({roster:e,original:t,cliOptions:n,loading:r,error:a,onRosterChange:o}){let s=N(t,e),c=A(e);function l(t,n){o(e.map((e,r)=>r===t?{...e,...n}:e))}function u(t){o(e.filter((e,n)=>n!==t))}return(0,b.jsxs)(i,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,b.jsxs)(`div`,{className:`settings-runtime-employee-summary`,children:[(0,b.jsxs)(`span`,{children:[`+`,s.added]}),(0,b.jsxs)(`span`,{children:[`~`,s.updated]}),(0,b.jsxs)(`span`,{children:[`-`,s.removed]}),c?(0,b.jsx)(`strong`,{children:`Fix invalid rows before saving.`}):null]}),r?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading employees...`}):null,a?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:a}):null,e.length===0?(0,b.jsx)(`p`,{className:`settings-empty`,children:`No runtime employees configured.`}):(0,b.jsx)(`div`,{className:`settings-runtime-employee-list`,children:e.map((e,t)=>(0,b.jsx)(R,{employee:e,index:t,cliOptions:n,onChange:e=>l(t,e),onRemove:()=>u(t)},e.id))}),(0,b.jsx)(`div`,{className:`settings-employee-footer-bar`,children:(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>o([...e,D(n)]),children:`+ Add employee`})})]})}var B=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function V(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):B.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function H(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(A(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=V(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,v(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{s&&await P(t,i,s)}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function U({port:e,client:t,dirty:n,registerSave:i}){let{state:c,refresh:l,setData:d}=r(t,`/api/settings`),[f,_]=(0,y.useState)({cli:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[v,S]=(0,y.useState)({}),[T,E]=(0,y.useState)({}),[D,O]=(0,y.useState)(!0),[k,M]=(0,y.useState)(null),[N,P]=(0,y.useState)([]),[F,I]=(0,y.useState)([]),[L,R]=(0,y.useState)(!0),[B,V]=(0,y.useState)(null),U=(0,y.useCallback)(async()=>{O(!0),M(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};S(n),E(n)}catch(e){M(e instanceof Error?e.message:String(e))}finally{O(!1)}},[t]),W=(0,y.useCallback)(async()=>{R(!0),V(null);try{let e=ee(await t.get(`/api/employees`));P(e),I(e)}catch(e){V(e instanceof Error?e.message:String(e))}finally{R(!1)}},[t]);(0,y.useEffect)(()=>{U(),W()},[W,U]),(0,y.useEffect)(()=>{if(c.kind!==`ready`)return;let e=Object.keys(c.data.perCli||{}),t=c.data.cli||e[0]||``,n=u(c.data.permissions);_({cli:t,provider:c.data.perCli?.[t]?.provider||h(t).defaultProvider||``,model:p(t,c.data.perCli,c.data.activeOverrides),effort:m(t,c.data.perCli,c.data.activeOverrides),workingDir:c.data.workingDir||``,permissions:n.mode===`custom`?n.tokens:`auto`})},[c]),(0,y.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`cli`||e===`workingDir`||e===`permissions`||e===`runtimeEmployees`||e===`flushCli`||e===`flushModel`||e.startsWith(`activeOverrides.`))&&n.remove(e)},[n]);let G=(0,y.useCallback)((e,t)=>n.set(e,t),[n]),K=(0,y.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await H({client:t,bundle:e,employeeDraft:F,employeeOriginal:N});n.clear(),r&&d(r),await l(),await U(),await W()},[t,n,F,N,W,U,l,d]);(0,y.useEffect)(()=>{if(i)return i(K),()=>i(null)},[i,K]);let q=c.kind===`ready`?c.data:{},J=q.perCli||{},Y=q.activeOverrides||{},X=(0,y.useMemo)(()=>Object.keys(J),[J]),Z=h(f.cli),Q=f.provider||Z.defaultProvider||Z.providers?.[0]||``,te=f.cli===`ai-e`?g(Z.modelsByProvider?.[Q]||Z.models,f.model):g(Z.models,f.model),ne=f.cli===`ai-e`&&Z.effortsByProvider?.[Q]||Z.efforts,re=f.workingDir.trim()?null:`Required`;if(c.kind===`loading`)return(0,b.jsx)(a,{});if(c.kind===`offline`)return(0,b.jsx)(o,{port:e});if(c.kind===`error`)return(0,b.jsx)(s,{message:c.message});function ie(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){_(e)}return(0,b.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),K()},children:[(0,b.jsx)(x,{cli:f.cli,cliOptions:X.length>0?X:[f.cli||`claude`],provider:Q,providerOptions:Z.providers||[],model:f.model,modelOptions:te,effort:f.effort,effortOptions:ne,workingDir:f.workingDir,workingDirError:re,onCliChange:e=>{let t={...f,cli:e,provider:J[e]?.provider||h(e).defaultProvider||``,model:p(e,J,Y),effort:m(e,J,Y)};ie(),$(t),G(`cli`,{value:e,original:q.cli||``,valid:!0})},onProviderChange:e=>{let t=Z.modelsByProvider?.[e]||[],n=Z.effortsByProvider?.[e]||[],r=t.includes(f.model)?f.model:t[0]||``,i=n.includes(f.effort)?f.effort:``;$({...f,provider:e,model:r,effort:i}),G(`perCli.ai-e.provider`,{value:e,original:J[`ai-e`]?.provider||Z.defaultProvider||`claude`,valid:!0}),G(`activeOverrides.ai-e.model`,{value:r,original:p(`ai-e`,J,Y),valid:r.trim().length>0}),G(`activeOverrides.ai-e.effort`,{value:i,original:m(`ai-e`,J,Y),valid:!0})},onModelChange:e=>{$({...f,model:e}),G(`activeOverrides.${f.cli}.model`,{value:e,original:p(f.cli,J,Y),valid:e.trim().length>0})},onEffortChange:e=>{$({...f,effort:e}),G(`activeOverrides.${f.cli}.effort`,{value:e,original:m(f.cli,J,Y),valid:!0})},onWorkingDirChange:e=>{$({...f,workingDir:e}),G(`workingDir`,{value:e,original:q.workingDir||``,valid:e.trim().length>0})}}),(0,b.jsx)(C,{value:f.permissions,onChange:e=>{$({...f,permissions:e}),G(`permissions`,{value:e,original:q.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,b.jsx)(w,{activeCli:f.cli,flushCli:T.cli||``,flushModel:T.model||``,cliOptions:X,modelOptions:g(h(T.cli||f.cli).models,T.model||``),loading:D,error:k,onFlushCliChange:e=>{let t=e&&h(e).models[0]||``;E({cli:e,model:t}),G(`flushCli`,{value:e,original:v.cli||``,valid:!0}),G(`flushModel`,{value:t,original:v.model||``,valid:!0})},onFlushModelChange:e=>{E({...T,model:e}),G(`flushModel`,{value:e,original:v.model||``,valid:!0})}}),(0,b.jsx)(z,{roster:F,original:N,cliOptions:X,loading:L,error:B,onRosterChange:e=>{if(I(e),j(e,N)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:N,valid:!A(e)})}})]})}export{U as default,V as splitAgentSaveBundle};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{t as r}from"./settings-client-BN3XzwEo.js";import{i,n as a,t as o}from"./page-shell-CTxVDJ8Y.js";import{t as s}from"./InlineWarn-E64UaKFh.js";var c=e(t(),1),l=n(),u=3e3;function d(e){if(!e||typeof e!=`object`)return{running:!1,tabs:0};let t=e,n={running:t.running===!0,tabs:typeof t.tabs==`number`&&Number.isFinite(t.tabs)?t.tabs:0};return typeof t.cdpUrl==`string`&&(n.cdpUrl=t.cdpUrl),n}function f(e){if(!e||typeof e!=`object`)return null;let t=e,n=t.tab&&typeof t.tab==`object`?t.tab:null,r={ok:t.ok===!0};if(typeof t.reason==`string`&&(r.reason=t.reason),n){let e={};typeof n.url==`string`&&(e.url=n.url),typeof n.title==`string`&&(e.title=n.title),typeof n.targetId==`string`&&(e.targetId=n.targetId),r.tab=e}else r.tab=null;return r}function p(e){return e?e.running?`running`:`stopped`:`unknown`}function m({port:e,client:t}){let[n,p]=(0,c.useState)({kind:`loading`}),[m,h]=(0,c.useState)({kind:`idle`}),g=(0,c.useRef)(0),_=(0,c.useRef)(0),v=(0,c.useCallback)(async e=>{try{let[n,r]=await Promise.all([t.get(`/api/browser/status`),t.get(`/api/browser/active-tab`).catch(()=>null)]);if(e!==g.current)return;let i=d(n);p({kind:`ready`,status:i,activeTab:i.running?f(r):null})}catch(t){if(e!==g.current)return;p({kind:`error`,message:t instanceof r||t instanceof Error?t.message:String(t)})}},[t]);(0,c.useEffect)(()=>{let e=g.current+1;g.current=e,p({kind:`loading`}),v(e);let t=setInterval(()=>{v(e)},u);return()=>{g.current=e+1,clearInterval(t)}},[v]);let y=(0,c.useCallback)(async(e,t)=>{let n=_.current+1;_.current=n,h({kind:`pending`,label:e});try{if(await t(),n!==_.current)return;h({kind:`success`,message:`${e} succeeded`}),v(g.current)}catch(e){if(n!==_.current)return;h({kind:`error`,message:e instanceof Error?e.message:String(e)})}},[v]),b=(0,c.useCallback)(()=>{y(`Start visible browser`,()=>t.post(`/api/browser/start`,{mode:`manual`,headless:!1}))},[t,y]),x=(0,c.useCallback)(()=>{y(`Start agent browser`,()=>t.post(`/api/browser/start`,{mode:`agent`,headless:!0}))},[t,y]),S=(0,c.useCallback)(()=>{y(`Stop`,()=>t.post(`/api/browser/stop`,{}))},[t,y]),C=(0,c.useCallback)(()=>{typeof window<`u`&&!window.confirm(`Reset the browser profile? Stops the browser and clears the persisted profile directory. Re-launch will start fresh.`)||y(`Reset profile`,()=>t.post(`/api/browser/stop`,{}))},[t,y]);if(n.kind===`loading`)return(0,l.jsx)(a,{label:`Polling browser status…`});if(n.kind===`error`)return(0,l.jsx)(o,{message:n.message});let{status:w,activeTab:T}=n,E=m.kind===`pending`;return(0,l.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,l.jsxs)(i,{title:`Status`,hint:`Polled every ${u/1e3}s while this page is open.`,children:[(0,l.jsxs)(`dl`,{className:`settings-readonly-grid`,children:[(0,l.jsx)(`dt`,{children:`Running`}),(0,l.jsx)(`dd`,{children:w.running?`✅ yes`:`❌ no`}),(0,l.jsx)(`dt`,{children:`Tabs`}),(0,l.jsx)(`dd`,{children:w.tabs}),(0,l.jsx)(`dt`,{children:`CDP URL`}),(0,l.jsx)(`dd`,{children:(0,l.jsx)(`code`,{children:w.cdpUrl||`—`})}),(0,l.jsx)(`dt`,{children:`Instance port`}),(0,l.jsx)(`dd`,{children:(0,l.jsx)(`code`,{children:e})})]}),(0,l.jsxs)(`div`,{className:`browser-actions`,children:[(0,l.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:w.running||E,onClick:b,children:`Start visible browser`}),(0,l.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:w.running||E,onClick:x,children:`Start agent browser`}),(0,l.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:!w.running||E,onClick:S,children:`Stop`}),(0,l.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:E,onClick:C,children:`Reset profile`})]}),m.kind===`pending`&&(0,l.jsxs)(`p`,{className:`settings-section-hint`,role:`status`,children:[m.label,`…`]}),m.kind===`success`&&(0,l.jsxs)(`p`,{className:`settings-section-hint`,role:`status`,children:[`✅ `,m.message]}),m.kind===`error`&&(0,l.jsx)(s,{role:`alert`,children:m.message})]}),(0,l.jsx)(i,{title:`Active tab`,hint:`Tab the agent currently targets. Empty when the browser is stopped.`,children:w.running?T&&T.ok&&T.tab?(0,l.jsxs)(`dl`,{className:`settings-readonly-grid`,children:[(0,l.jsx)(`dt`,{children:`URL`}),(0,l.jsx)(`dd`,{children:(0,l.jsx)(`code`,{children:T.tab.url||`—`})}),(0,l.jsx)(`dt`,{children:`Title`}),(0,l.jsx)(`dd`,{children:T.tab.title||`—`}),(0,l.jsx)(`dt`,{children:`Target ID`}),(0,l.jsx)(`dd`,{children:(0,l.jsx)(`code`,{children:T.tab.targetId||`—`})})]}):(0,l.jsxs)(`p`,{className:`settings-section-hint`,children:[`No verified active tab`,T?.reason?` (${T.reason})`:``,`.`]}):(0,l.jsx)(`p`,{className:`settings-section-hint`,children:`Browser is not running.`})})]})}export{m as default,p as describeStatus,f as normalizeActiveTab,d as normalizeBrowserStatus};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{t as r}from"./settings-client-DPuJroyk.js";import{i,n as a,t as o}from"./page-shell-CVAobxbP.js";import{t as s}from"./InlineWarn-DoJS7AgM.js";var c=e(t(),1),l=n(),u=3e3;function d(e){if(!e||typeof e!=`object`)return{running:!1,tabs:0};let t=e,n={running:t.running===!0,tabs:typeof t.tabs==`number`&&Number.isFinite(t.tabs)?t.tabs:0};return typeof t.cdpUrl==`string`&&(n.cdpUrl=t.cdpUrl),n}function f(e){if(!e||typeof e!=`object`)return null;let t=e,n=t.tab&&typeof t.tab==`object`?t.tab:null,r={ok:t.ok===!0};if(typeof t.reason==`string`&&(r.reason=t.reason),n){let e={};typeof n.url==`string`&&(e.url=n.url),typeof n.title==`string`&&(e.title=n.title),typeof n.targetId==`string`&&(e.targetId=n.targetId),r.tab=e}else r.tab=null;return r}function p(e){return e?e.running?`running`:`stopped`:`unknown`}function m({port:e,client:t}){let[n,p]=(0,c.useState)({kind:`loading`}),[m,h]=(0,c.useState)({kind:`idle`}),g=(0,c.useRef)(0),_=(0,c.useRef)(0),v=(0,c.useCallback)(async e=>{try{let[n,r]=await Promise.all([t.get(`/api/browser/status`),t.get(`/api/browser/active-tab`).catch(()=>null)]);if(e!==g.current)return;let i=d(n);p({kind:`ready`,status:i,activeTab:i.running?f(r):null})}catch(t){if(e!==g.current)return;p({kind:`error`,message:t instanceof r||t instanceof Error?t.message:String(t)})}},[t]);(0,c.useEffect)(()=>{let e=g.current+1;g.current=e,p({kind:`loading`}),v(e);let t=setInterval(()=>{v(e)},u);return()=>{g.current=e+1,clearInterval(t)}},[v]);let y=(0,c.useCallback)(async(e,t)=>{let n=_.current+1;_.current=n,h({kind:`pending`,label:e});try{if(await t(),n!==_.current)return;h({kind:`success`,message:`${e} succeeded`}),v(g.current)}catch(e){if(n!==_.current)return;h({kind:`error`,message:e instanceof Error?e.message:String(e)})}},[v]),b=(0,c.useCallback)(()=>{y(`Start visible browser`,()=>t.post(`/api/browser/start`,{mode:`manual`,headless:!1}))},[t,y]),x=(0,c.useCallback)(()=>{y(`Start agent browser`,()=>t.post(`/api/browser/start`,{mode:`agent`,headless:!0}))},[t,y]),S=(0,c.useCallback)(()=>{y(`Stop`,()=>t.post(`/api/browser/stop`,{}))},[t,y]),C=(0,c.useCallback)(()=>{typeof window<`u`&&!window.confirm(`Reset the browser profile? Stops the browser and clears the persisted profile directory. Re-launch will start fresh.`)||y(`Reset profile`,()=>t.post(`/api/browser/stop`,{}))},[t,y]);if(n.kind===`loading`)return(0,l.jsx)(a,{label:`Polling browser status…`});if(n.kind===`error`)return(0,l.jsx)(o,{message:n.message});let{status:w,activeTab:T}=n,E=m.kind===`pending`;return(0,l.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,l.jsxs)(i,{title:`Status`,hint:`Polled every ${u/1e3}s while this page is open.`,children:[(0,l.jsxs)(`dl`,{className:`settings-readonly-grid`,children:[(0,l.jsx)(`dt`,{children:`Running`}),(0,l.jsx)(`dd`,{children:w.running?`✅ yes`:`❌ no`}),(0,l.jsx)(`dt`,{children:`Tabs`}),(0,l.jsx)(`dd`,{children:w.tabs}),(0,l.jsx)(`dt`,{children:`CDP URL`}),(0,l.jsx)(`dd`,{children:(0,l.jsx)(`code`,{children:w.cdpUrl||`—`})}),(0,l.jsx)(`dt`,{children:`Instance port`}),(0,l.jsx)(`dd`,{children:(0,l.jsx)(`code`,{children:e})})]}),(0,l.jsxs)(`div`,{className:`browser-actions`,children:[(0,l.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:w.running||E,onClick:b,children:`Start visible browser`}),(0,l.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:w.running||E,onClick:x,children:`Start agent browser`}),(0,l.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:!w.running||E,onClick:S,children:`Stop`}),(0,l.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:E,onClick:C,children:`Reset profile`})]}),m.kind===`pending`&&(0,l.jsxs)(`p`,{className:`settings-section-hint`,role:`status`,children:[m.label,`…`]}),m.kind===`success`&&(0,l.jsxs)(`p`,{className:`settings-section-hint`,role:`status`,children:[`✅ `,m.message]}),m.kind===`error`&&(0,l.jsx)(s,{role:`alert`,children:m.message})]}),(0,l.jsx)(i,{title:`Active tab`,hint:`Tab the agent currently targets. Empty when the browser is stopped.`,children:w.running?T&&T.ok&&T.tab?(0,l.jsxs)(`dl`,{className:`settings-readonly-grid`,children:[(0,l.jsx)(`dt`,{children:`URL`}),(0,l.jsx)(`dd`,{children:(0,l.jsx)(`code`,{children:T.tab.url||`—`})}),(0,l.jsx)(`dt`,{children:`Title`}),(0,l.jsx)(`dd`,{children:T.tab.title||`—`}),(0,l.jsx)(`dt`,{children:`Target ID`}),(0,l.jsx)(`dd`,{children:(0,l.jsx)(`code`,{children:T.tab.targetId||`—`})})]}):(0,l.jsxs)(`p`,{className:`settings-section-hint`,children:[`No verified active tab`,T?.reason?` (${T.reason})`:``,`.`]}):(0,l.jsx)(`p`,{className:`settings-section-hint`,children:`Browser is not running.`})})]})}export{m as default,p as describeStatus,f as normalizeActiveTab,d as normalizeBrowserStatus};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{a as c,n as l,o as u,s as d}from"./fields-BISouxp2.js";import{t as f}from"./path-utils-DySmCVZK.js";import{i as p,n as m,t as h}from"./HealthBadge-Dtr-dDnw.js";var g=e(t(),1),_=n(),v=[`channel`,`discord.enabled`,`discord.token`,`discord.guildId`,`discord.channelIds`,`discord.forwardAll`,`discord.allowBots`,`discord.mentionOnly`];function y(e){return e?/^\d{5,32}$/.test(e.trim()):!1}function b({port:e,client:t,dirty:n,registerSave:b}){let{state:x,refresh:S,setData:C}=r(t,`/api/settings`),[w,T]=(0,g.useState)(!1),[E,D]=(0,g.useState)(``),[O,k]=(0,g.useState)(``),[A,j]=(0,g.useState)([]),[M,N]=(0,g.useState)(!0),[P,F]=(0,g.useState)(!1),[I,L]=(0,g.useState)(!1);(0,g.useEffect)(()=>{if(x.kind!==`ready`)return;let e=x.data.discord||{};T(!!e.enabled),D(``),k(e.guildId??``),j(Array.isArray(e.channelIds)?[...e.channelIds]:[]),N(e.forwardAll!==!1),F(!!e.allowBots),L(!!e.mentionOnly)},[x]),(0,g.useEffect)(()=>()=>{for(let e of v)n.remove(e)},[n]);let R=(0,g.useCallback)((e,t)=>n.set(e,t),[n]),z=(0,g.useMemo)(()=>x.kind===`ready`&&x.data.discord||{},[x]),B=x.kind===`ready`?x.data.channel:void 0,V=(0,g.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=f(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),C(a);let o=a.discord||{};T(!!o.enabled),D(``),k(o.guildId??``),j(Array.isArray(o.channelIds)?[...o.channelIds]:[]),N(o.forwardAll!==!1),F(!!o.allowBots),L(!!o.mentionOnly),await S()},[t,n,S,C]);if((0,g.useEffect)(()=>{if(b)return b(V),()=>b(null)},[b,V]),x.kind===`loading`)return(0,_.jsx)(a,{});if(x.kind===`offline`)return(0,_.jsx)(o,{port:e});if(x.kind===`error`)return(0,_.jsx)(s,{message:x.message});let H=z.token?z.token.slice(-4):``,U=z.token?`••••••••${H}`:`(empty)`,W=O&&!y(O)?`Guild ID must be a numeric snowflake.`:null,G=A.filter(e=>!y(e)),K=G.length>0?`Snowflake IDs only — invalid: ${G.join(`, `)}`:null;return(0,_.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),V()},children:[(0,_.jsx)(i,{title:`Channels`,hint:`Choose which channel forwards bot replies to you.`,children:(0,_.jsx)(p,{original:B,dirty:n,idPrefix:`dc-channel`})}),(0,_.jsxs)(i,{title:`Discord`,hint:`Bot token, guild + channels, forwarding rules.`,children:[(0,_.jsx)(c,{id:`dc-enabled`,label:`Discord enabled`,value:w,onChange:e=>{T(e),R(`discord.enabled`,{value:e,original:!!z.enabled,valid:!0})}}),(0,_.jsx)(u,{id:`dc-token`,label:`Bot token`,value:E,placeholder:U,onChange:e=>{if(D(e),e.length===0){n.remove(`discord.token`);return}R(`discord.token`,{value:e,original:z.token??``,valid:!0})}}),(0,_.jsx)(d,{id:`dc-guildId`,label:`Guild ID`,value:O,placeholder:`123456789012345678`,error:W,onChange:e=>{k(e);let t=e.length===0||y(e);R(`discord.guildId`,{value:e,original:z.guildId??``,valid:t})}}),(0,_.jsx)(l,{id:`dc-channelIds`,label:`Channel IDs`,value:A,placeholder:`987654321098765432`,error:K,onChange:e=>{j(e);let t=e.every(y);R(`discord.channelIds`,{value:e,original:z.channelIds??[],valid:t})}}),(0,_.jsx)(c,{id:`dc-forwardAll`,label:`Forward all`,value:M,onChange:e=>{N(e),R(`discord.forwardAll`,{value:e,original:z.forwardAll!==!1,valid:!0})}}),(0,_.jsx)(c,{id:`dc-allowBots`,label:`Allow other bots`,value:P,onChange:e=>{F(e),R(`discord.allowBots`,{value:e,original:!!z.allowBots,valid:!0})}}),(0,_.jsx)(c,{id:`dc-mentionOnly`,label:`Mention only`,value:I,onChange:e=>{L(e),R(`discord.mentionOnly`,{value:e,original:!!z.mentionOnly,valid:!0})}})]}),(0,_.jsx)(i,{title:`Health`,hint:`Probes /api/health for Discord readiness. Degraded mode means the bot is missing the MESSAGE_CONTENT intent (slash commands only).`,children:(0,_.jsx)(h,{client:t,label:`Discord`,endpoint:`/api/health`,method:`GET`,interpret:m})})]})}export{b as default,y as isValidSnowflake};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{a as c,n as l,o as u,s as d}from"./fields-DUawAHWZ.js";import{t as f}from"./path-utils-r2bJIu28.js";import{i as p,n as m,t as h}from"./HealthBadge-DEPFkcA0.js";var g=e(t(),1),_=n(),v=[`channel`,`discord.enabled`,`discord.token`,`discord.guildId`,`discord.channelIds`,`discord.forwardAll`,`discord.allowBots`,`discord.mentionOnly`];function y(e){return e?/^\d{5,32}$/.test(e.trim()):!1}function b({port:e,client:t,dirty:n,registerSave:b}){let{state:x,refresh:S,setData:C}=r(t,`/api/settings`),[w,T]=(0,g.useState)(!1),[E,D]=(0,g.useState)(``),[O,k]=(0,g.useState)(``),[A,j]=(0,g.useState)([]),[M,N]=(0,g.useState)(!0),[P,F]=(0,g.useState)(!1),[I,L]=(0,g.useState)(!1);(0,g.useEffect)(()=>{if(x.kind!==`ready`)return;let e=x.data.discord||{};T(!!e.enabled),D(``),k(e.guildId??``),j(Array.isArray(e.channelIds)?[...e.channelIds]:[]),N(e.forwardAll!==!1),F(!!e.allowBots),L(!!e.mentionOnly)},[x]),(0,g.useEffect)(()=>()=>{for(let e of v)n.remove(e)},[n]);let R=(0,g.useCallback)((e,t)=>n.set(e,t),[n]),z=(0,g.useMemo)(()=>x.kind===`ready`&&x.data.discord||{},[x]),B=x.kind===`ready`?x.data.channel:void 0,V=(0,g.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=f(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),C(a);let o=a.discord||{};T(!!o.enabled),D(``),k(o.guildId??``),j(Array.isArray(o.channelIds)?[...o.channelIds]:[]),N(o.forwardAll!==!1),F(!!o.allowBots),L(!!o.mentionOnly),await S()},[t,n,S,C]);if((0,g.useEffect)(()=>{if(b)return b(V),()=>b(null)},[b,V]),x.kind===`loading`)return(0,_.jsx)(a,{});if(x.kind===`offline`)return(0,_.jsx)(o,{port:e});if(x.kind===`error`)return(0,_.jsx)(s,{message:x.message});let H=z.token?z.token.slice(-4):``,U=z.token?`••••••••${H}`:`(empty)`,W=O&&!y(O)?`Guild ID must be a numeric snowflake.`:null,G=A.filter(e=>!y(e)),K=G.length>0?`Snowflake IDs only — invalid: ${G.join(`, `)}`:null;return(0,_.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),V()},children:[(0,_.jsx)(i,{title:`Channels`,hint:`Choose which channel forwards bot replies to you.`,children:(0,_.jsx)(p,{original:B,dirty:n,idPrefix:`dc-channel`})}),(0,_.jsxs)(i,{title:`Discord`,hint:`Bot token, guild + channels, forwarding rules.`,children:[(0,_.jsx)(c,{id:`dc-enabled`,label:`Discord enabled`,value:w,onChange:e=>{T(e),R(`discord.enabled`,{value:e,original:!!z.enabled,valid:!0})}}),(0,_.jsx)(u,{id:`dc-token`,label:`Bot token`,value:E,placeholder:U,onChange:e=>{if(D(e),e.length===0){n.remove(`discord.token`);return}R(`discord.token`,{value:e,original:z.token??``,valid:!0})}}),(0,_.jsx)(d,{id:`dc-guildId`,label:`Guild ID`,value:O,placeholder:`123456789012345678`,error:W,onChange:e=>{k(e);let t=e.length===0||y(e);R(`discord.guildId`,{value:e,original:z.guildId??``,valid:t})}}),(0,_.jsx)(l,{id:`dc-channelIds`,label:`Channel IDs`,value:A,placeholder:`987654321098765432`,error:K,onChange:e=>{j(e);let t=e.every(y);R(`discord.channelIds`,{value:e,original:z.channelIds??[],valid:t})}}),(0,_.jsx)(c,{id:`dc-forwardAll`,label:`Forward all`,value:M,onChange:e=>{N(e),R(`discord.forwardAll`,{value:e,original:z.forwardAll!==!1,valid:!0})}}),(0,_.jsx)(c,{id:`dc-allowBots`,label:`Allow other bots`,value:P,onChange:e=>{F(e),R(`discord.allowBots`,{value:e,original:!!z.allowBots,valid:!0})}}),(0,_.jsx)(c,{id:`dc-mentionOnly`,label:`Mention only`,value:I,onChange:e=>{L(e),R(`discord.mentionOnly`,{value:e,original:!!z.mentionOnly,valid:!0})}})]}),(0,_.jsx)(i,{title:`Health`,hint:`Probes /api/health for Discord readiness. Degraded mode means the bot is missing the MESSAGE_CONTENT intent (slash commands only).`,children:(0,_.jsx)(h,{client:t,label:`Discord`,endpoint:`/api/health`,method:`GET`,interpret:m})})]})}export{b as default,y as isValidSnowflake};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{a as c,n as l,o as u}from"./fields-BISouxp2.js";import{t as d}from"./path-utils-DySmCVZK.js";import{i as f,r as p,t as m}from"./HealthBadge-Dtr-dDnw.js";var h=e(t(),1),g=n(),_=[`channel`,`telegram.enabled`,`telegram.token`,`telegram.allowedChatIds`,`telegram.forwardAll`,`telegram.mentionOnly`];function v(e){return e?/^-?\d+$/.test(e.trim()):!1}function y(e){let t=[],n=[];for(let r of e)v(r)?t.push(r.trim()):n.push(r);return{valid:t,invalid:n}}function b(e){return e?e.filter(e=>Number.isFinite(e)).map(e=>String(e)):[]}function x(e){let t=[];for(let n of e){if(!v(n))continue;let e=Number(n);Number.isFinite(e)&&t.push(e)}return t}function S({port:e,client:t,dirty:n,registerSave:S}){let{state:C,refresh:w,setData:T}=r(t,`/api/settings`),[E,D]=(0,h.useState)(!1),[O,k]=(0,h.useState)(``),[A,j]=(0,h.useState)([]),[M,N]=(0,h.useState)(!0),[P,F]=(0,h.useState)(!0);(0,h.useEffect)(()=>{if(C.kind!==`ready`)return;let e=C.data.telegram||{};D(!!e.enabled),k(``),j(b(e.allowedChatIds)),N(e.forwardAll!==!1),F(e.mentionOnly!==!1)},[C]),(0,h.useEffect)(()=>()=>{for(let e of _)n.remove(e)},[n]);let I=(0,h.useCallback)((e,t)=>n.set(e,t),[n]),L=(0,h.useMemo)(()=>C.kind===`ready`&&C.data.telegram||{},[C]),R=C.kind===`ready`?C.data.channel:void 0,z=(0,h.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=d(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),T(a);let o=a.telegram||{};D(!!o.enabled),k(``),j(b(o.allowedChatIds)),N(o.forwardAll!==!1),F(o.mentionOnly!==!1),await w()},[t,n,w,T]);if((0,h.useEffect)(()=>{if(S)return S(z),()=>S(null)},[S,z]),C.kind===`loading`)return(0,g.jsx)(a,{});if(C.kind===`offline`)return(0,g.jsx)(o,{port:e});if(C.kind===`error`)return(0,g.jsx)(s,{message:C.message});let B=L.token?L.token.slice(-4):``,V=L.token?`••••••••${B}`:`(empty)`,{invalid:H}=y(A),U=H.length>0?`Numeric chat IDs only — invalid: ${H.join(`, `)}`:null;return(0,g.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),z()},children:[(0,g.jsx)(i,{title:`Channels`,hint:`Choose which channel forwards bot replies to you.`,children:(0,g.jsx)(f,{original:R,dirty:n,idPrefix:`tg-channel`})}),(0,g.jsxs)(i,{title:`Telegram`,hint:`Bot token, allow-list, and forwarding rules.`,children:[(0,g.jsx)(c,{id:`tg-enabled`,label:`Telegram enabled`,value:E,onChange:e=>{D(e),I(`telegram.enabled`,{value:e,original:!!L.enabled,valid:!0})}}),(0,g.jsx)(u,{id:`tg-token`,label:`Bot token`,value:O,placeholder:V,onChange:e=>{if(k(e),e.length===0){n.remove(`telegram.token`);return}I(`telegram.token`,{value:e,original:L.token??``,valid:!0})}}),(0,g.jsx)(l,{id:`tg-allowedChatIds`,label:`Allowed chat IDs`,value:A,placeholder:`123456789`,error:U,onChange:e=>{j(e);let t=e.every(v);I(`telegram.allowedChatIds`,{value:x(e),original:L.allowedChatIds??[],valid:t})}}),(0,g.jsx)(c,{id:`tg-forwardAll`,label:`Forward all responses`,value:M,onChange:e=>{N(e),I(`telegram.forwardAll`,{value:e,original:L.forwardAll!==!1,valid:!0})}}),(0,g.jsx)(c,{id:`tg-mentionOnly`,label:`Mention only`,value:P,onChange:e=>{F(e),I(`telegram.mentionOnly`,{value:e,original:L.mentionOnly!==!1,valid:!0})}})]}),(0,g.jsx)(i,{title:`Health`,hint:`Probe the bot to confirm token + connectivity. 404 means the instance hasn't shipped the probe endpoint yet.`,children:(0,g.jsx)(m,{client:t,label:`Telegram`,endpoint:`/api/telegram/probe`,method:`POST`,interpret:p})})]})}export{b as chatIdsToChips,x as chipsToChatIds,S as default,v as isValidChatId,y as partitionChatIds};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{a as c,n as l,o as u}from"./fields-DUawAHWZ.js";import{t as d}from"./path-utils-r2bJIu28.js";import{i as f,r as p,t as m}from"./HealthBadge-DEPFkcA0.js";var h=e(t(),1),g=n(),_=[`channel`,`telegram.enabled`,`telegram.token`,`telegram.allowedChatIds`,`telegram.forwardAll`,`telegram.mentionOnly`];function v(e){return e?/^-?\d+$/.test(e.trim()):!1}function y(e){let t=[],n=[];for(let r of e)v(r)?t.push(r.trim()):n.push(r);return{valid:t,invalid:n}}function b(e){return e?e.filter(e=>Number.isFinite(e)).map(e=>String(e)):[]}function x(e){let t=[];for(let n of e){if(!v(n))continue;let e=Number(n);Number.isFinite(e)&&t.push(e)}return t}function S({port:e,client:t,dirty:n,registerSave:S}){let{state:C,refresh:w,setData:T}=r(t,`/api/settings`),[E,D]=(0,h.useState)(!1),[O,k]=(0,h.useState)(``),[A,j]=(0,h.useState)([]),[M,N]=(0,h.useState)(!0),[P,F]=(0,h.useState)(!0);(0,h.useEffect)(()=>{if(C.kind!==`ready`)return;let e=C.data.telegram||{};D(!!e.enabled),k(``),j(b(e.allowedChatIds)),N(e.forwardAll!==!1),F(e.mentionOnly!==!1)},[C]),(0,h.useEffect)(()=>()=>{for(let e of _)n.remove(e)},[n]);let I=(0,h.useCallback)((e,t)=>n.set(e,t),[n]),L=(0,h.useMemo)(()=>C.kind===`ready`&&C.data.telegram||{},[C]),R=C.kind===`ready`?C.data.channel:void 0,z=(0,h.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=d(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),T(a);let o=a.telegram||{};D(!!o.enabled),k(``),j(b(o.allowedChatIds)),N(o.forwardAll!==!1),F(o.mentionOnly!==!1),await w()},[t,n,w,T]);if((0,h.useEffect)(()=>{if(S)return S(z),()=>S(null)},[S,z]),C.kind===`loading`)return(0,g.jsx)(a,{});if(C.kind===`offline`)return(0,g.jsx)(o,{port:e});if(C.kind===`error`)return(0,g.jsx)(s,{message:C.message});let B=L.token?L.token.slice(-4):``,V=L.token?`••••••••${B}`:`(empty)`,{invalid:H}=y(A),U=H.length>0?`Numeric chat IDs only — invalid: ${H.join(`, `)}`:null;return(0,g.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),z()},children:[(0,g.jsx)(i,{title:`Channels`,hint:`Choose which channel forwards bot replies to you.`,children:(0,g.jsx)(f,{original:R,dirty:n,idPrefix:`tg-channel`})}),(0,g.jsxs)(i,{title:`Telegram`,hint:`Bot token, allow-list, and forwarding rules.`,children:[(0,g.jsx)(c,{id:`tg-enabled`,label:`Telegram enabled`,value:E,onChange:e=>{D(e),I(`telegram.enabled`,{value:e,original:!!L.enabled,valid:!0})}}),(0,g.jsx)(u,{id:`tg-token`,label:`Bot token`,value:O,placeholder:V,onChange:e=>{if(k(e),e.length===0){n.remove(`telegram.token`);return}I(`telegram.token`,{value:e,original:L.token??``,valid:!0})}}),(0,g.jsx)(l,{id:`tg-allowedChatIds`,label:`Allowed chat IDs`,value:A,placeholder:`123456789`,error:U,onChange:e=>{j(e);let t=e.every(v);I(`telegram.allowedChatIds`,{value:x(e),original:L.allowedChatIds??[],valid:t})}}),(0,g.jsx)(c,{id:`tg-forwardAll`,label:`Forward all responses`,value:M,onChange:e=>{N(e),I(`telegram.forwardAll`,{value:e,original:L.forwardAll!==!1,valid:!0})}}),(0,g.jsx)(c,{id:`tg-mentionOnly`,label:`Mention only`,value:P,onChange:e=>{F(e),I(`telegram.mentionOnly`,{value:e,original:L.mentionOnly!==!1,valid:!0})}})]}),(0,g.jsx)(i,{title:`Health`,hint:`Probe the bot to confirm token + connectivity. 404 means the instance hasn't shipped the probe endpoint yet.`,children:(0,g.jsx)(m,{client:t,label:`Telegram`,endpoint:`/api/telegram/probe`,method:`POST`,interpret:p})})]})}export{b as chatIdsToChips,x as chipsToChatIds,S as default,v as isValidChatId,y as partitionChatIds};
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";var r=e(t(),1),i=n(),a=`/api/dashboard/memory`,o=[`provider`,`apikey`,`test`,`indexing`,`active`],s={provider:`Provider`,apikey:`API Key`,test:`Test connection`,indexing:`Indexing`,active:`Active`},c=[{value:``,label:`(select)`},{value:`openai`,label:`OpenAI`},{value:`gemini`,label:`Gemini`},{value:`voyage`,label:`Voyage AI`},{value:`vertex`,label:`Vertex AI`},{value:`local`,label:`Local (Ollama)`}],l=[{value:`hybrid`,label:`Hybrid (FTS5 + Embedding)`},{value:`embedding`,label:`Embedding only`},{value:`fts5`,label:`FTS5 only (no vectors)`}],u={openai:{model:`text-embedding-3-small`,dimensions:1536},gemini:{model:`gemini-embedding-001`,dimensions:768},voyage:{model:`voyage-3-lite`,dimensions:512},vertex:{model:`text-embedding-005`,dimensions:768},local:{model:`nomic-embed-text`,dimensions:768}};async function d(e,t){let n=await fetch(`${a}${e}`,{credentials:`same-origin`,headers:{"Content-Type":`application/json`},...t});if(!n.ok)throw Error(`HTTP ${n.status}`);return n.json()}function f(e,t,n){return e?.provider?e.provider!==`local`&&!e.apiKey&&!e.apiKeyPresent?`apikey`:t?.state===`ACTIVE_HYBRID`||t?.state===`ACTIVE_EMBEDDING`?`active`:t?.state===`INDEXING`?`indexing`:n?!t?.active&&(t?.indexedChunks??0)<(t?.totalChunks??1)?`indexing`:`active`:`test`:`provider`}function p({current:e}){let t=o.indexOf(e);return(0,i.jsx)(`div`,{className:`embed-stepper`,role:`list`,children:o.map((e,n)=>{let r=n<t,a=n===t;return(0,i.jsxs)(`div`,{className:r?`embed-step is-done`:a?`embed-step is-active`:`embed-step`,role:`listitem`,"aria-current":a?`step`:void 0,children:[(0,i.jsx)(`span`,{className:`embed-step-badge`,children:r?`✓`:n+1}),(0,i.jsx)(`span`,{className:`embed-step-label`,children:s[e]})]},e)})})}function m(){let[e,t]=(0,r.useState)(null),[n,o]=(0,r.useState)(null),[s,m]=(0,r.useState)(null),[h,g]=(0,r.useState)(!0),[_,v]=(0,r.useState)(``),[y,b]=(0,r.useState)(``),[x,S]=(0,r.useState)(1536),[C,w]=(0,r.useState)(``),[T,E]=(0,r.useState)(`hybrid`),[D,O]=(0,r.useState)(``),[k,A]=(0,r.useState)(null),[j,M]=(0,r.useState)(``),[N,P]=(0,r.useState)(!1),[F,I]=(0,r.useState)(!1),[L,R]=(0,r.useState)({done:0,total:0}),[z,B]=(0,r.useState)(null),V=(0,r.useRef)(null),H=(0,r.useCallback)(async()=>{try{let[e,n,r]=await Promise.all([d(`/embed-config`),d(`/embed-state`),d(`/embed-estimate`)]);t(e.config),o(n.status);let{ok:i,...a}=r;m(a)}catch{B(`Failed to load embedding state`)}finally{g(!1)}},[]);(0,r.useEffect)(()=>{H()},[H]),(0,r.useEffect)(()=>{e&&(v(e.provider||``),b(e.model||u[e.provider||``]?.model||``),S(e.dimensions??u[e.provider||``]?.dimensions??1536),w(e.apiKey||``),E(e.searchMode||`hybrid`),O(e.baseUrl||``))},[e]);let U=f(e,n,k),W=(0,r.useCallback)(async e=>{P(!0),B(null);try{await d(`/embed-config`,{method:`POST`,body:JSON.stringify(e)}),await H()}catch(e){B(e instanceof Error?e.message:String(e))}finally{P(!1)}},[H]),G=(0,r.useCallback)(()=>{if(!_)return;A(null),M(``);let e={provider:_,model:y,dimensions:x,searchMode:T};D&&(e.baseUrl=D),W(e)},[_,y,x,T,D,W]),K=(0,r.useCallback)(()=>{W({apiKey:C})},[C,W]),q=(0,r.useCallback)(async()=>{A(null),M(`Testing...`),B(null);try{let e={provider:_,model:y,dimensions:x,test:!0};C.trim()&&(e.apiKey=C.trim());let t=await d(`/embed-config`,{method:`POST`,body:JSON.stringify(e)});t.testResult===`ok`?(A(!0),M(`Connection successful`)):(A(!1),M(t.testError||`Connection failed`))}catch(e){A(!1),M(e instanceof Error?e.message:String(e))}},[_,y,x,C]),J=(0,r.useCallback)(async()=>{I(!0),R({done:0,total:0}),B(null);let e=new AbortController;V.current=e;try{let t=await fetch(`${a}/reindex-stream`,{signal:e.signal,credentials:`same-origin`});if(!t.ok||!t.body)throw Error(`HTTP ${t.status}`);let n=t.body.getReader(),r=new TextDecoder,i=``;for(;;){let{done:e,value:t}=await n.read();if(e)break;i+=r.decode(t,{stream:!0});let a=i.split(`
2
+ `);i=a.pop()||``;for(let e of a)if(e.startsWith(`data: `))try{let t=JSON.parse(e.slice(6));if(t.complete){I(!1),await H();return}if(t.error){B(String(t.error)),I(!1);return}typeof t.done==`number`&&R({done:t.done,total:t.total||0})}catch{}}I(!1),await H()}catch(e){e.name!==`AbortError`&&B(e instanceof Error?e.message:String(e)),I(!1)}},[H]);if((0,r.useEffect)(()=>()=>V.current?.abort(),[]),h)return(0,i.jsx)(`p`,{className:`dashboard-settings-row-description`,children:`Loading...`});let Y=n?.state===`NEEDS_REINDEX`,X=n?.state===`ACTIVE_HYBRID`||n?.state===`ACTIVE_EMBEDDING`;return(0,i.jsxs)(`div`,{className:`dashboard-embed-section`,children:[(0,i.jsx)(p,{current:U}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsx)(`legend`,{children:`Provider`}),(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-provider`,children:`Provider`}),(0,i.jsx)(`select`,{id:`embed-provider`,value:_,onChange:e=>{let t=e.target.value;v(t),A(null);let n=u[t];n&&(b(n.model),S(n.dimensions))},children:c.map(e=>(0,i.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-search-mode`,children:`Search mode`}),(0,i.jsx)(`select`,{id:`embed-search-mode`,value:T,onChange:e=>E(e.target.value),children:l.map(e=>(0,i.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-model`,children:`Model`}),(0,i.jsx)(`input`,{id:`embed-model`,type:`text`,value:y,onChange:e=>b(e.target.value),placeholder:u[_]?.model||`model name`})]}),(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-dimensions`,children:`Dimensions`}),(0,i.jsx)(`input`,{id:`embed-dimensions`,type:`number`,min:64,max:4096,value:x,onChange:e=>S(Number(e.target.value)||1536)})]}),(_===`local`||_===`vertex`)&&(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-base-url`,children:_===`vertex`?`Project ID / Region`:`Base URL`}),(0,i.jsx)(`input`,{id:`embed-base-url`,type:`text`,value:D,onChange:e=>O(e.target.value),placeholder:_===`local`?`http://localhost:11434`:`project-id/us-central1`})]}),(0,i.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!_||N,onClick:G,children:N?`Saving...`:`Save provider`})]}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsx)(`legend`,{children:`API Key`}),_===`local`?(0,i.jsx)(`p`,{className:`dashboard-settings-row-description`,children:`Local provider uses Ollama — no API key needed.`}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-api-key`,children:`API Key`}),(0,i.jsx)(`input`,{id:`embed-api-key`,type:`password`,value:C,onChange:e=>w(e.target.value),placeholder:`sk-...`,disabled:!_})]}),(0,i.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!C||N,onClick:K,children:`Save key`})]})]}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsx)(`legend`,{children:`Connection test`}),(0,i.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!_||!C&&!e?.apiKeyPresent&&_!==`local`,onClick:()=>void q(),children:`Test connection`}),j&&(0,i.jsxs)(`p`,{className:k?`dashboard-embed-ok`:`dashboard-embed-err`,role:`status`,children:[k?`✓ `:`✗ `,j]})]}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsxs)(`legend`,{children:[`Indexing`,s&&(0,i.jsxs)(`small`,{children:[` — `,s.totalChunks,` chunks · ~`,s.batches,` batches · ~`,Math.ceil(s.estimatedSeconds),`s · $`,s.estimatedCost.toFixed(4)]})]}),F?(0,i.jsxs)(`div`,{className:`embed-progress`,children:[(0,i.jsx)(`div`,{className:`embed-progress-bar`,children:(0,i.jsx)(`div`,{className:`embed-progress-fill`,style:{width:L.total>0?`${Math.round(L.done/L.total*100)}%`:`0%`}})}),(0,i.jsxs)(`span`,{className:`dashboard-settings-row-description`,children:[L.done,`/`,L.total,` batches`]})]}):(0,i.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!k&&!X&&!Y,onClick:()=>void J(),children:Y?`Re-index (provider changed)`:X?`Re-index`:`Start indexing`})]}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsx)(`legend`,{children:`Status`}),n?(0,i.jsxs)(`dl`,{className:`embed-status-grid`,children:[(0,i.jsx)(`dt`,{children:`State`}),(0,i.jsx)(`dd`,{children:(0,i.jsx)(`code`,{children:n.state})}),(0,i.jsx)(`dt`,{children:`Mode`}),(0,i.jsx)(`dd`,{children:n.mode}),(0,i.jsx)(`dt`,{children:`Provider`}),(0,i.jsxs)(`dd`,{children:[n.provider||`-`,` / `,n.model||`-`]}),(0,i.jsx)(`dt`,{children:`Indexed`}),(0,i.jsxs)(`dd`,{children:[n.indexedChunks,` chunks`]}),(0,i.jsx)(`dt`,{children:`DB size`}),(0,i.jsx)(`dd`,{children:n.dbSizeBytes>0?`${(n.dbSizeBytes/1024/1024).toFixed(1)} MB`:`-`}),(0,i.jsx)(`dt`,{children:`Last sync`}),(0,i.jsx)(`dd`,{children:n.lastSyncAt||`never`}),(0,i.jsx)(`dt`,{children:`Fallback`}),(0,i.jsx)(`dd`,{children:n.fallback?`Yes (${n.reason})`:`No`})]}):(0,i.jsx)(`p`,{className:`dashboard-settings-row-description`,children:`No state available`})]}),z&&(0,i.jsx)(`p`,{className:`dashboard-embed-err`,role:`alert`,children:z})]})}export{m as DashboardEmbeddingSection};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,t as o}from"./page-shell-CTxVDJ8Y.js";import{a as s,s as c}from"./fields-BISouxp2.js";var l=e(t(),1),u=n();function d(){return{async get(e){let t=await fetch(e);if(!t.ok)throw Error(`GET ${e} → ${t.status}`);return await t.json()},async patch(e,t){let n=await fetch(e,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(t)});if(!n.ok)throw Error(`PATCH ${e} → ${n.status}`);return await n.json()}}}var f=[`meta.label`,`meta.group`,`meta.favorite`,`meta.hidden`,`meta.notes`];function p(e,t){let n=e?.registry?.instances?.[String(t)];return{label:n?.label??null,favorite:n?.favorite===!0,group:n?.group??null,hidden:n?.hidden===!0,notes:n?.notes??null}}function m(e){return{label:e.label||``,group:e.group||``,favorite:e.favorite,hidden:e.hidden,notes:e.notes||``}}function h({port:e,client:t,dirty:n,registerSave:h,managerClient:g}){let{state:_,refresh:v,setData:y}=r(t,`__dashboard_meta_unused__`,[e]),[b,x]=(0,l.useState)(null),[S,C]=(0,l.useState)(null),[w,T]=(0,l.useState)({label:``,group:``,favorite:!1,hidden:!1,notes:``}),E=g||d();(0,l.useEffect)(()=>{let t=!1;return C(null),E.get(`/api/dashboard/registry`).then(n=>{t||(x(n),T(m(p(n,e))))}).catch(e=>{t||C(e instanceof Error?e.message:String(e))}),()=>{t=!0}},[e]),(0,l.useEffect)(()=>()=>{for(let e of f)n.remove(e)},[n]);let D=p(b,e),O=(0,l.useCallback)((e,t)=>n.set(e,t),[n]),k=(0,l.useCallback)(async()=>{let t=w.label.trim()||null,r=w.group.trim()||null,i=w.notes.trim()||null,a={instances:{[String(e)]:{label:t,group:r,favorite:w.favorite,hidden:w.hidden,notes:i}}},o=await E.patch(`/api/dashboard/registry`,a);x(o),T(m(p(o,e)));for(let e of f)n.remove(e)},[w,E,n,e]);return(0,l.useEffect)(()=>{if(h)return h(k),()=>h(null)},[h,k]),S?(0,u.jsx)(o,{message:S}):b?(0,u.jsx)(`form`,{className:`settings-page-form settings-form`,onSubmit:e=>{e.preventDefault(),k()},children:(0,u.jsxs)(i,{title:`Dashboard meta`,hint:`Manager-side metadata for this instance. Stored in the dashboard registry.`,children:[(0,u.jsx)(c,{id:`dashmeta-label`,label:`Label`,value:w.label,placeholder:`(unset — falls back to home folder name)`,onChange:e=>{T({...w,label:e}),O(`meta.label`,{value:e,original:D.label||``,valid:!0})}}),(0,u.jsx)(c,{id:`dashmeta-group`,label:`Group`,value:w.group,placeholder:`e.g. work, personal`,onChange:e=>{T({...w,group:e}),O(`meta.group`,{value:e,original:D.group||``,valid:!0})}}),(0,u.jsx)(s,{id:`dashmeta-favorite`,label:`Pin favorite`,value:w.favorite,onChange:e=>{T({...w,favorite:e}),O(`meta.favorite`,{value:e,original:D.favorite,valid:!0})}}),(0,u.jsx)(s,{id:`dashmeta-hidden`,label:`Hide by default`,description:`Hide from the default instance list.`,value:w.hidden,onChange:e=>{T({...w,hidden:e}),O(`meta.hidden`,{value:e,original:D.hidden,valid:!0})}}),(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`dashmeta-notes`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Notes`}),(0,u.jsx)(`textarea`,{id:`dashmeta-notes`,rows:4,value:w.notes,placeholder:`Free-form notes only the dashboard remembers.`,onChange:e=>{let t=e.target.value;T({...w,notes:t}),O(`meta.notes`,{value:t,original:D.notes||``,valid:!0})}})]})]})}):(0,u.jsx)(a,{label:`Loading dashboard registry…`})}var g={readInstance:p,toDraft:m,META_KEYS:f};export{g as __test__,h as default};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,t as o}from"./page-shell-CVAobxbP.js";import{a as s,s as c}from"./fields-DUawAHWZ.js";var l=e(t(),1),u=n();function d(){return{async get(e){let t=await fetch(e);if(!t.ok)throw Error(`GET ${e} → ${t.status}`);return await t.json()},async patch(e,t){let n=await fetch(e,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(t)});if(!n.ok)throw Error(`PATCH ${e} → ${n.status}`);return await n.json()}}}var f=[`meta.label`,`meta.group`,`meta.favorite`,`meta.hidden`,`meta.notes`];function p(e,t){let n=e?.registry?.instances?.[String(t)];return{label:n?.label??null,favorite:n?.favorite===!0,group:n?.group??null,hidden:n?.hidden===!0,notes:n?.notes??null}}function m(e){return{label:e.label||``,group:e.group||``,favorite:e.favorite,hidden:e.hidden,notes:e.notes||``}}function h({port:e,client:t,dirty:n,registerSave:h,managerClient:g}){let{state:_,refresh:v,setData:y}=r(t,`__dashboard_meta_unused__`,[e]),[b,x]=(0,l.useState)(null),[S,C]=(0,l.useState)(null),[w,T]=(0,l.useState)({label:``,group:``,favorite:!1,hidden:!1,notes:``}),E=g||d();(0,l.useEffect)(()=>{let t=!1;return C(null),E.get(`/api/dashboard/registry`).then(n=>{t||(x(n),T(m(p(n,e))))}).catch(e=>{t||C(e instanceof Error?e.message:String(e))}),()=>{t=!0}},[e]),(0,l.useEffect)(()=>()=>{for(let e of f)n.remove(e)},[n]);let D=p(b,e),O=(0,l.useCallback)((e,t)=>n.set(e,t),[n]),k=(0,l.useCallback)(async()=>{let t=w.label.trim()||null,r=w.group.trim()||null,i=w.notes.trim()||null,a={instances:{[String(e)]:{label:t,group:r,favorite:w.favorite,hidden:w.hidden,notes:i}}},o=await E.patch(`/api/dashboard/registry`,a);x(o),T(m(p(o,e)));for(let e of f)n.remove(e)},[w,E,n,e]);return(0,l.useEffect)(()=>{if(h)return h(k),()=>h(null)},[h,k]),S?(0,u.jsx)(o,{message:S}):b?(0,u.jsx)(`form`,{className:`settings-page-form settings-form`,onSubmit:e=>{e.preventDefault(),k()},children:(0,u.jsxs)(i,{title:`Dashboard meta`,hint:`Manager-side metadata for this instance. Stored in the dashboard registry.`,children:[(0,u.jsx)(c,{id:`dashmeta-label`,label:`Label`,value:w.label,placeholder:`(unset — falls back to home folder name)`,onChange:e=>{T({...w,label:e}),O(`meta.label`,{value:e,original:D.label||``,valid:!0})}}),(0,u.jsx)(c,{id:`dashmeta-group`,label:`Group`,value:w.group,placeholder:`e.g. work, personal`,onChange:e=>{T({...w,group:e}),O(`meta.group`,{value:e,original:D.group||``,valid:!0})}}),(0,u.jsx)(s,{id:`dashmeta-favorite`,label:`Pin favorite`,value:w.favorite,onChange:e=>{T({...w,favorite:e}),O(`meta.favorite`,{value:e,original:D.favorite,valid:!0})}}),(0,u.jsx)(s,{id:`dashmeta-hidden`,label:`Hide by default`,description:`Hide from the default instance list.`,value:w.hidden,onChange:e=>{T({...w,hidden:e}),O(`meta.hidden`,{value:e,original:D.hidden,valid:!0})}}),(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`dashmeta-notes`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Notes`}),(0,u.jsx)(`textarea`,{id:`dashmeta-notes`,rows:4,value:w.notes,placeholder:`Free-form notes only the dashboard remembers.`,onChange:e=>{let t=e.target.value;T({...w,notes:t}),O(`meta.notes`,{value:t,original:D.notes||``,valid:!0})}})]})]})}):(0,u.jsx)(a,{label:`Loading dashboard registry…`})}var g={readInstance:p,toDraft:m,META_KEYS:f};export{g as __test__,h as default};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{i as c,r as l}from"./fields-BISouxp2.js";import{t as u}from"./path-utils-DySmCVZK.js";var d=e(t(),1),f=n(),p=[{value:`jaw-default`,label:`Jaw default`},{value:`jaw-dark`,label:`Jaw dark`},{value:`jaw-light`,label:`Jaw light`},{value:`jaw-contrast`,label:`High contrast`}],m=[{value:`default`,label:`default`},{value:`vim`,label:`vim`},{value:`emacs`,label:`emacs`}],h=[{value:`summary`,label:`summary`},{value:`unified`,label:`unified`},{value:`side-by-side`,label:`side-by-side`}],g=[`tui.themeSeed`,`tui.keymapPreset`,`tui.pasteCollapseLines`,`tui.pasteCollapseChars`,`tui.diffStyle`];function _({port:e,client:t,dirty:n,registerSave:_}){let{state:v,refresh:y,setData:b}=r(t,`/api/settings`),[x,S]=(0,d.useState)({});(0,d.useEffect)(()=>{v.kind===`ready`&&S({...v.data.tui||{}})},[v]),(0,d.useEffect)(()=>()=>{for(let e of g)n.remove(e)},[n]);let C=(0,d.useCallback)((e,t)=>n.set(e,t),[n]),w=(0,d.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=u(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),S({...a.tui||{}}),b(a),await y()},[t,n,y,b]);if((0,d.useEffect)(()=>{if(_)return _(w),()=>_(null)},[_,w]),v.kind===`loading`)return(0,f.jsx)(a,{});if(v.kind===`offline`)return(0,f.jsx)(o,{port:e});if(v.kind===`error`)return(0,f.jsx)(s,{message:v.message});let T=v.data.tui||{};return(0,f.jsx)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),w()},children:(0,f.jsxs)(i,{title:`Display`,hint:`TUI options applied to /i/${e}.`,children:[(0,f.jsx)(c,{id:`display-themeSeed`,label:`Theme seed`,value:x.themeSeed??T.themeSeed??`jaw-default`,options:p,onChange:e=>{S({...x,themeSeed:e}),C(`tui.themeSeed`,{value:e,original:T.themeSeed??`jaw-default`,valid:!0})}}),(0,f.jsx)(c,{id:`display-keymapPreset`,label:`Keymap preset`,value:x.keymapPreset??T.keymapPreset??`default`,options:m,onChange:e=>{S({...x,keymapPreset:e}),C(`tui.keymapPreset`,{value:e,original:T.keymapPreset??`default`,valid:!0})}}),(0,f.jsx)(l,{id:`display-pasteCollapseLines`,label:`Paste collapse — lines`,value:x.pasteCollapseLines??T.pasteCollapseLines??2,min:0,step:1,onChange:e=>{S({...x,pasteCollapseLines:e}),C(`tui.pasteCollapseLines`,{value:e,original:T.pasteCollapseLines??2,valid:Number.isFinite(e)&&e>=0})}}),(0,f.jsx)(l,{id:`display-pasteCollapseChars`,label:`Paste collapse — chars`,value:x.pasteCollapseChars??T.pasteCollapseChars??160,min:0,step:10,onChange:e=>{S({...x,pasteCollapseChars:e}),C(`tui.pasteCollapseChars`,{value:e,original:T.pasteCollapseChars??160,valid:Number.isFinite(e)&&e>=0})}}),(0,f.jsx)(c,{id:`display-diffStyle`,label:`Diff style`,value:x.diffStyle??T.diffStyle??`summary`,options:h,onChange:e=>{S({...x,diffStyle:e}),C(`tui.diffStyle`,{value:e,original:T.diffStyle??`summary`,valid:!0})}})]})})}export{_ as default};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{i as c,r as l}from"./fields-DUawAHWZ.js";import{t as u}from"./path-utils-r2bJIu28.js";var d=e(t(),1),f=n(),p=[{value:`jaw-default`,label:`Jaw default`},{value:`jaw-dark`,label:`Jaw dark`},{value:`jaw-light`,label:`Jaw light`},{value:`jaw-contrast`,label:`High contrast`}],m=[{value:`default`,label:`default`},{value:`vim`,label:`vim`},{value:`emacs`,label:`emacs`}],h=[{value:`summary`,label:`summary`},{value:`unified`,label:`unified`},{value:`side-by-side`,label:`side-by-side`}],g=[`tui.themeSeed`,`tui.keymapPreset`,`tui.pasteCollapseLines`,`tui.pasteCollapseChars`,`tui.diffStyle`];function _({port:e,client:t,dirty:n,registerSave:_}){let{state:v,refresh:y,setData:b}=r(t,`/api/settings`),[x,S]=(0,d.useState)({});(0,d.useEffect)(()=>{v.kind===`ready`&&S({...v.data.tui||{}})},[v]),(0,d.useEffect)(()=>()=>{for(let e of g)n.remove(e)},[n]);let C=(0,d.useCallback)((e,t)=>n.set(e,t),[n]),w=(0,d.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=u(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),S({...a.tui||{}}),b(a),await y()},[t,n,y,b]);if((0,d.useEffect)(()=>{if(_)return _(w),()=>_(null)},[_,w]),v.kind===`loading`)return(0,f.jsx)(a,{});if(v.kind===`offline`)return(0,f.jsx)(o,{port:e});if(v.kind===`error`)return(0,f.jsx)(s,{message:v.message});let T=v.data.tui||{};return(0,f.jsx)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),w()},children:(0,f.jsxs)(i,{title:`Display`,hint:`TUI options applied to /i/${e}.`,children:[(0,f.jsx)(c,{id:`display-themeSeed`,label:`Theme seed`,value:x.themeSeed??T.themeSeed??`jaw-default`,options:p,onChange:e=>{S({...x,themeSeed:e}),C(`tui.themeSeed`,{value:e,original:T.themeSeed??`jaw-default`,valid:!0})}}),(0,f.jsx)(c,{id:`display-keymapPreset`,label:`Keymap preset`,value:x.keymapPreset??T.keymapPreset??`default`,options:m,onChange:e=>{S({...x,keymapPreset:e}),C(`tui.keymapPreset`,{value:e,original:T.keymapPreset??`default`,valid:!0})}}),(0,f.jsx)(l,{id:`display-pasteCollapseLines`,label:`Paste collapse — lines`,value:x.pasteCollapseLines??T.pasteCollapseLines??2,min:0,step:1,onChange:e=>{S({...x,pasteCollapseLines:e}),C(`tui.pasteCollapseLines`,{value:e,original:T.pasteCollapseLines??2,valid:Number.isFinite(e)&&e>=0})}}),(0,f.jsx)(l,{id:`display-pasteCollapseChars`,label:`Paste collapse — chars`,value:x.pasteCollapseChars??T.pasteCollapseChars??160,min:0,step:10,onChange:e=>{S({...x,pasteCollapseChars:e}),C(`tui.pasteCollapseChars`,{value:e,original:T.pasteCollapseChars??160,valid:Number.isFinite(e)&&e>=0})}}),(0,f.jsx)(c,{id:`display-diffStyle`,label:`Diff style`,value:x.diffStyle??T.diffStyle??`summary`,options:h,onChange:e=>{S({...x,diffStyle:e}),C(`tui.diffStyle`,{value:e,original:T.diffStyle??`summary`,valid:!0})}})]})})}export{_ as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{i as r}from"./page-shell-CVAobxbP.js";var i=e(t(),1),a=n(),o=[`employees`],s=[`ai-e`,`claude`,`claude-e`,`codex`,`codex-app`,`copilot`,`gemini`,`grok`,`opencode`],c=0;function l(){return c+=1,`emp_${Date.now().toString(36)}_${c}`}function u(){let e=globalThis.crypto;if(e&&typeof e.randomUUID==`function`)try{return e.randomUUID()}catch{}return l()}function d(e=u()){return{id:e,name:``,cli:`claude`,role:``,prompt:``,active:!0}}function f(e){if(!Array.isArray(e))return[];let t=[],n=0;for(let r of e){if(typeof r==`string`){n+=1,t.push({...d(`emp_legacy_${n}`),name:r});continue}if(!r||typeof r!=`object`)continue;let e=r,i=typeof e.name==`string`?e.name:``;if(!i&&!e.id)continue;n+=1;let a=typeof e.id==`string`&&e.id.trim()?e.id.trim():`emp_unknown_${n}`,o=typeof e.cli==`string`&&e.cli.trim()?e.cli.trim():`claude`,s=typeof e.role==`string`?e.role:``,c=typeof e.prompt==`string`?e.prompt:``,l=e.active!==!1;t.push({id:a,name:i,cli:o,role:s,prompt:c,active:l})}return t}function p(e){return e.name.trim()?e.cli.trim()?null:`CLI is required`:`Name is required`}function m(e){return e.some(e=>p(e)!==null)}function h(e){let t=new Map;for(let n of e){let e=n.name.trim().toLowerCase();e&&t.set(e,(t.get(e)??0)+1)}let n=new Set;for(let[e,r]of t)r>1&&n.add(e);return n}function g(e){return e.map(e=>{let t={id:e.id,name:e.name.trim(),cli:e.cli.trim()||`claude`,role:e.role.trim(),active:e.active};return e.prompt.trim()&&(t.prompt=e.prompt),t})}function _({registerSave:e}){return(0,i.useEffect)(()=>{if(e)return e(null),()=>e(null)},[e]),(0,a.jsx)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:(0,a.jsx)(r,{title:`Employees`,hint:`Runtime employees are now managed from the Agent page.`,children:(0,a.jsx)(`p`,{className:`settings-section-hint`,children:`Open Runtime / Agent to edit dispatchable employees, static employee model overrides, and database-backed employees in one place.`})})})}export{s as DEFAULT_CLI_OPTIONS,o as EMPLOYEE_KEYS,_ as default,h as duplicateNameSet,p as employeeRowError,m as employeesHaveErrors,d as makeDefaultEmployee,u as newEmployeeId,f as normalizeEmployees,g as toPersistShape};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{t as r}from"./settings-client-BN3XzwEo.js";var i=e(t(),1),a=n(),o=[{value:`telegram`,label:`Telegram`},{value:`discord`,label:`Discord`}];function s({original:e,dirty:t,idPrefix:n=`channel`}){let[r,s]=(0,i.useState)(e??`telegram`),c=(0,i.useCallback)(n=>{s(n),t.set(`channel`,{value:n,original:e??`telegram`,valid:!0})},[t,e]);return(0,a.jsxs)(`fieldset`,{className:`settings-field settings-field-active-channel`,"aria-label":`Active channel`,children:[(0,a.jsx)(`legend`,{className:`settings-field-label`,children:`Active channel`}),(0,a.jsx)(`div`,{className:`settings-active-channel-options`,role:`radiogroup`,children:o.map(e=>{let t=`${n}-${e.value}`,i=r===e.value;return(0,a.jsxs)(`label`,{htmlFor:t,className:`settings-radio`,children:[(0,a.jsx)(`input`,{id:t,type:`radio`,name:n,value:e.value,checked:i,onChange:()=>c(e.value)}),(0,a.jsx)(`span`,{children:e.label})]},e.value)})})]})}function c({client:e,label:t,endpoint:n,method:o=`GET`,interpret:s,auto:c=!1}){let[d,f]=(0,i.useState)({kind:`idle`}),p=(0,i.useRef)(null),m=(0,i.useRef)(!0),h=(0,i.useCallback)(async()=>{p.current?.abort();let t=new AbortController;p.current=t,f({kind:`checking`});try{let r=o===`POST`?await e.post(n,{},{signal:t.signal}):await e.get(n,{signal:t.signal});if(!m.current||t.signal.aborted)return;f(s(r))}catch(e){if(!m.current||t.signal.aborted)return;if(e instanceof r&&e.status===404){f({kind:`unknown`,reason:`Probe endpoint not implemented on this instance.`});return}f({kind:`error`,reason:e instanceof Error?e.message:String(e)})}},[e,n,s,o]);return(0,i.useEffect)(()=>(m.current=!0,c&&h(),()=>{m.current=!1,p.current?.abort()}),[c,h]),(0,a.jsxs)(`div`,{className:`settings-health-badge`,role:`status`,"aria-live":`polite`,children:[(0,a.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>void h(),disabled:d.kind===`checking`,children:d.kind===`checking`?`Checking…`:`Check ${t}`}),(0,a.jsx)(`span`,{className:`settings-health-pill is-${d.kind}`,children:l(d)}),u(d)?(0,a.jsx)(`span`,{className:`settings-health-detail`,children:u(d)}):null]})}function l(e){switch(e.kind){case`idle`:return`Not checked`;case`checking`:return`Checking`;case`ok`:return`Healthy`;case`degraded`:return`Degraded`;case`unknown`:return`Unknown`;case`error`:return`Error`}}function u(e){return e.kind===`ok`&&e.detail||e.kind===`degraded`?e.detail:e.kind===`unknown`||e.kind===`error`?e.reason:null}function d(e){if(!e||typeof e!=`object`)return{kind:`unknown`,reason:`Empty probe response.`};let t=e;if(t.ok===!0){let e=typeof t.username==`string`?t.username:void 0;return e?{kind:`ok`,detail:`@${e}`}:{kind:`ok`}}return{kind:`error`,reason:typeof t.error==`string`?t.error:`Probe failed.`}}function f(e){if(!e||typeof e!=`object`)return{kind:`unknown`,reason:`Empty health response.`};let t=e,n=t.discord&&typeof t.discord==`object`?t.discord:null;return n?n.ready===!0&&n.degraded!==!0?{kind:`ok`}:n.degraded===!0?{kind:`degraded`,detail:typeof n.degradedReason==`string`?n.degradedReason:`MESSAGE_CONTENT intent missing — slash commands only.`}:n.ready===!1?{kind:`error`,reason:typeof n.error==`string`?n.error:`Bot not connected.`}:{kind:`unknown`,reason:`Discord status indeterminate.`}:{kind:`unknown`,reason:`No discord block in /api/health.`}}export{s as i,f as n,d as r,c as t};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{t as r}from"./settings-client-DPuJroyk.js";var i=e(t(),1),a=n(),o=[{value:`telegram`,label:`Telegram`},{value:`discord`,label:`Discord`}];function s({original:e,dirty:t,idPrefix:n=`channel`}){let[r,s]=(0,i.useState)(e??`telegram`),c=(0,i.useCallback)(n=>{s(n),t.set(`channel`,{value:n,original:e??`telegram`,valid:!0})},[t,e]);return(0,a.jsxs)(`fieldset`,{className:`settings-field settings-field-active-channel`,"aria-label":`Active channel`,children:[(0,a.jsx)(`legend`,{className:`settings-field-label`,children:`Active channel`}),(0,a.jsx)(`div`,{className:`settings-active-channel-options`,role:`radiogroup`,children:o.map(e=>{let t=`${n}-${e.value}`,i=r===e.value;return(0,a.jsxs)(`label`,{htmlFor:t,className:`settings-radio`,children:[(0,a.jsx)(`input`,{id:t,type:`radio`,name:n,value:e.value,checked:i,onChange:()=>c(e.value)}),(0,a.jsx)(`span`,{children:e.label})]},e.value)})})]})}function c({client:e,label:t,endpoint:n,method:o=`GET`,interpret:s,auto:c=!1}){let[d,f]=(0,i.useState)({kind:`idle`}),p=(0,i.useRef)(null),m=(0,i.useRef)(!0),h=(0,i.useCallback)(async()=>{p.current?.abort();let t=new AbortController;p.current=t,f({kind:`checking`});try{let r=o===`POST`?await e.post(n,{},{signal:t.signal}):await e.get(n,{signal:t.signal});if(!m.current||t.signal.aborted)return;f(s(r))}catch(e){if(!m.current||t.signal.aborted)return;if(e instanceof r&&e.status===404){f({kind:`unknown`,reason:`Probe endpoint not implemented on this instance.`});return}f({kind:`error`,reason:e instanceof Error?e.message:String(e)})}},[e,n,s,o]);return(0,i.useEffect)(()=>(m.current=!0,c&&h(),()=>{m.current=!1,p.current?.abort()}),[c,h]),(0,a.jsxs)(`div`,{className:`settings-health-badge`,role:`status`,"aria-live":`polite`,children:[(0,a.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>void h(),disabled:d.kind===`checking`,children:d.kind===`checking`?`Checking…`:`Check ${t}`}),(0,a.jsx)(`span`,{className:`settings-health-pill is-${d.kind}`,children:l(d)}),u(d)?(0,a.jsx)(`span`,{className:`settings-health-detail`,children:u(d)}):null]})}function l(e){switch(e.kind){case`idle`:return`Not checked`;case`checking`:return`Checking`;case`ok`:return`Healthy`;case`degraded`:return`Degraded`;case`unknown`:return`Unknown`;case`error`:return`Error`}}function u(e){return e.kind===`ok`&&e.detail||e.kind===`degraded`?e.detail:e.kind===`unknown`||e.kind===`error`?e.reason:null}function d(e){if(!e||typeof e!=`object`)return{kind:`unknown`,reason:`Empty probe response.`};let t=e;if(t.ok===!0){let e=typeof t.username==`string`?t.username:void 0;return e?{kind:`ok`,detail:`@${e}`}:{kind:`ok`}}return{kind:`error`,reason:typeof t.error==`string`?t.error:`Probe failed.`}}function f(e){if(!e||typeof e!=`object`)return{kind:`unknown`,reason:`Empty health response.`};let t=e,n=t.discord&&typeof t.discord==`object`?t.discord:null;return n?n.ready===!0&&n.degraded!==!0?{kind:`ok`}:n.degraded===!0?{kind:`degraded`,detail:typeof n.degradedReason==`string`?n.degradedReason:`MESSAGE_CONTENT intent missing — slash commands only.`}:n.ready===!1?{kind:`error`,reason:typeof n.error==`string`?n.error:`Bot not connected.`}:{kind:`unknown`,reason:`Discord status indeterminate.`}:{kind:`unknown`,reason:`No discord block in /api/health.`}}export{s as i,f as n,d as r,c as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{a as c,i as l,s as u}from"./fields-DUawAHWZ.js";import{n as d}from"./agent-meta-Du8y6mSM.js";import{t as f}from"./path-utils-r2bJIu28.js";var p=e(t(),1),m=n(),h=[{value:`every`,label:`every (interval)`},{value:`cron`,label:`cron expression`}];function g({job:e,index:t,bodyError:n,timeZoneError:r,onChange:i,onRemove:a}){let o=(0,p.useId)(),s=e.schedule.kind,d=e.schedule.timeZone??``;return(0,m.jsxs)(`fieldset`,{className:`settings-heartbeat-job`,"aria-label":`Heartbeat job ${t+1}${e.name?` (${e.name})`:``}`,children:[(0,m.jsx)(`legend`,{className:`settings-heartbeat-job-legend`,children:e.name||`Job ${t+1}`}),(0,m.jsx)(c,{id:`${o}-enabled`,label:`Enabled`,value:e.enabled,onChange:e=>i({enabled:e})}),(0,m.jsx)(u,{id:`${o}-name`,label:`Name`,value:e.name,placeholder:`Morning summary`,onChange:e=>i({name:e})}),(0,m.jsx)(l,{id:`${o}-kind`,label:`Schedule kind`,value:s,options:h,onChange:e=>{e===`every`&&s!==`every`?i({schedule:{kind:`every`,minutes:30,...d?{timeZone:d}:{}}}):e===`cron`&&s!==`cron`&&i({schedule:{kind:`cron`,cron:`0 9 * * *`,...d?{timeZone:d}:{}}})}}),s===`every`?(0,m.jsx)(u,{id:`${o}-minutes`,label:`Every (minutes)`,value:String(e.schedule.minutes??``),placeholder:`30`,error:n??null,onChange:e=>{let t=e.trim(),n=Number(t);i({schedule:{kind:`every`,minutes:Number.isFinite(n)?n:NaN,...d?{timeZone:d}:{}}})}}):(0,m.jsx)(u,{id:`${o}-cron`,label:`Cron expression`,value:e.schedule.cron??``,placeholder:`0 9 * * *`,error:n??null,onChange:e=>i({schedule:{kind:`cron`,cron:e,...d?{timeZone:d}:{}}})}),(0,m.jsx)(u,{id:`${o}-tz`,label:`Time zone (optional)`,value:d,placeholder:`Asia/Seoul`,error:r??null,onChange:t=>{let n=t.trim();i(s===`every`?{schedule:{kind:`every`,minutes:e.schedule.minutes,...n?{timeZone:n}:{}}}:{schedule:{kind:`cron`,cron:e.schedule.cron,...n?{timeZone:n}:{}}})}}),(0,m.jsxs)(`label`,{className:`settings-field settings-field-textarea`,htmlFor:`${o}-prompt`,children:[(0,m.jsx)(`span`,{className:`settings-field-label`,children:`Prompt`}),(0,m.jsx)(`textarea`,{id:`${o}-prompt`,rows:3,value:e.prompt,placeholder:`What should this heartbeat do?`,onChange:e=>i({prompt:e.target.value})})]}),(0,m.jsx)(`div`,{className:`settings-heartbeat-job-footer`,children:(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:a,children:`Remove job`})})]})}var _=/^\d+[smh]$/,v=/^([01]\d|2[0-3]):[0-5]\d$/,y=[`ai-e`,`claude`,`claude-e`,`codex`,`codex-app`,`copilot`,`gemini`,`grok`,`opencode`],b=[`heartbeat.enabled`,`heartbeat.every`,`heartbeat.activeHours.start`,`heartbeat.activeHours.end`,`heartbeat.target`],x=[`heartbeat.jobs`,`heartbeat.md`];function S(e){return _.test(e.trim())}function C(e){return v.test(e.trim())}function w(e=Date.now()){return{id:`hb_${e}`,name:``,enabled:!0,schedule:{kind:`every`,minutes:30},prompt:``}}function T(e){return e.startsWith(`heartbeat.`)&&e!==`heartbeat.jobs`&&e!==`heartbeat.md`}function E(e,t){if(!e||typeof e!=`object`)return null;let n=e,r=typeof n.id==`string`&&n.id.trim()?n.id.trim():`hb_unknown_${t}`,i=typeof n.name==`string`?n.name:``,a=n.enabled!==!1,o=typeof n.prompt==`string`?n.prompt:``,s=n.schedule,c;if(s&&typeof s==`object`){let e=s;c=e.kind===`cron`&&typeof e.cron==`string`?{kind:`cron`,cron:e.cron,...typeof e.timeZone==`string`&&e.timeZone?{timeZone:e.timeZone}:{}}:{kind:`every`,minutes:typeof e.minutes==`number`?e.minutes:30,...typeof e.timeZone==`string`&&e.timeZone?{timeZone:e.timeZone}:{}}}else c={kind:`every`,minutes:30};return{id:r,name:i,enabled:a,schedule:c,prompt:o}}function D(e){if(!e||typeof e!=`object`)return[];let t=e.jobs;return Array.isArray(t)?t.map((e,t)=>E(e,t)).filter(e=>e!==null):[]}function O(e){if(e.kind===`every`){let t=e.minutes;return!Number.isFinite(t)||t<=0||!Number.isInteger(t)?`Minutes must be a positive integer`:null}let t=e.cron?.trim()??``;return t?t.split(/\s+/).length<5?`Cron must have at least 5 fields`:null:`Cron expression required`}function k(e){return e.some(e=>O(e.schedule)!==null)}function A({port:e,client:t,dirty:n,snapshot:r}){let[i,a]=(0,p.useState)([]),[c,l]=(0,p.useState)([]),[u,d]=(0,p.useState)(!1),[f,h]=(0,p.useState)(null);(0,p.useEffect)(()=>{if(r.kind!==`ready`)return;let e=D(r.data);a(e),l(e)},[r]),(0,p.useEffect)(()=>{n.set(`heartbeat.jobs`,{value:i,original:c,valid:!k(i)})},[i,c,n]),(0,p.useEffect)(()=>()=>{n.remove(`heartbeat.jobs`)},[n]);let _=(0,p.useCallback)(async()=>{if(k(i)){h(`Fix invalid schedules before saving.`);return}d(!0),h(null);try{let e=D(await t.put(`/api/heartbeat`,{jobs:i}));a(e),l(e),n.remove(`heartbeat.jobs`)}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}},[t,n,i]);if(r.kind===`loading`)return(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`Loading jobs…`});if(r.kind===`offline`)return(0,m.jsx)(o,{port:e});if(r.kind===`error`)return(0,m.jsx)(s,{message:r.message});let v=n.pending.has(`heartbeat.jobs`),y=k(i);function b(e,t){a(n=>n.map((n,r)=>r===e?{...n,...t}:n))}function x(){a(e=>[...e,w()])}function S(e){a(t=>t.filter((t,n)=>n!==e))}return(0,m.jsxs)(m.Fragment,{children:[i.length===0?(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`No jobs configured. Add one below.`}):(0,m.jsx)(`div`,{className:`settings-heartbeat-jobs-list`,children:i.map((e,t)=>(0,m.jsx)(g,{job:e,index:t,bodyError:O(e.schedule),onChange:e=>b(t,e),onRemove:()=>S(t)},e.id))}),(0,m.jsxs)(`div`,{className:`settings-heartbeat-jobs-footer`,children:[(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:x,children:`+ Add job`}),(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void _(),disabled:u||!v||y,children:u?`Saving…`:`Apply jobs`})]}),f?(0,m.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:f}):null]})}function j({port:e,client:t,dirty:n,snapshot:r}){let[i,a]=(0,p.useState)(``),[c,l]=(0,p.useState)(``),[u,d]=(0,p.useState)(!1),[f,h]=(0,p.useState)(null);(0,p.useEffect)(()=>{if(r.kind!==`ready`)return;let e=r.data.content??``;a(e),l(e)},[r]),(0,p.useEffect)(()=>{n.set(`heartbeat.md`,{value:i,original:c,valid:!0})},[i,c,n]),(0,p.useEffect)(()=>()=>{n.remove(`heartbeat.md`)},[n]);let g=(0,p.useCallback)(async()=>{d(!0),h(null);try{await t.put(`/api/heartbeat-md`,{content:i}),l(i),n.remove(`heartbeat.md`)}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}},[t,n,i]);if(r.kind===`loading`)return(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`Loading template…`});if(r.kind===`offline`)return(0,m.jsx)(o,{port:e});if(r.kind===`error`)return(0,m.jsx)(s,{message:r.message});let _=n.pending.has(`heartbeat.md`);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(`label`,{className:`settings-field settings-field-textarea`,htmlFor:`hb-md`,children:[(0,m.jsx)(`span`,{className:`settings-field-label`,children:`Template`}),(0,m.jsx)(`textarea`,{id:`hb-md`,rows:10,spellCheck:!1,value:i,onChange:e=>a(e.target.value),style:{fontFamily:`ui-monospace, monospace`}})]}),(0,m.jsx)(`div`,{className:`settings-heartbeat-md-footer`,children:(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void g(),disabled:u||!_,children:u?`Saving…`:`Save template`})}),f?(0,m.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:f}):null]})}function M({port:e,client:t,dirty:n,registerSave:h}){let g=r(t,`/api/settings`),_=r(t,`/api/heartbeat`),v=r(t,`/api/heartbeat-md`),[x,w]=(0,p.useState)(!1),[E,D]=(0,p.useState)(`30m`),[O,k]=(0,p.useState)(`08:00`),[M,N]=(0,p.useState)(`22:00`),[P,F]=(0,p.useState)(`all`);(0,p.useEffect)(()=>{if(g.state.kind!==`ready`)return;let e=g.state.data.heartbeat||{};w(!!e.enabled),D(typeof e.every==`string`?e.every:`30m`),k(e.activeHours?.start??`08:00`),N(e.activeHours?.end??`22:00`),F(typeof e.target==`string`?e.target:`all`)},[g.state]),(0,p.useEffect)(()=>()=>{for(let e of b)n.remove(e)},[n]);let I=(0,p.useMemo)(()=>g.state.kind===`ready`&&g.state.data.heartbeat||{},[g.state]),L=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),R=(0,p.useRef)(0),z=(0,p.useCallback)(async()=>{let e=n.saveBundle(),r={};for(let[t,n]of Object.entries(e))T(t)&&(r[t]=n);if(Object.keys(r).length===0)return;let i=++R.current,a=f(r),o=await t.put(`/api/settings`,a);if(i!==R.current)return;let s=o&&typeof o==`object`&&`data`in o?o.data:o;for(let e of b)n.remove(e);g.setData(s);let c=s.heartbeat||{};w(!!c.enabled),D(typeof c.every==`string`?c.every:`30m`),k(c.activeHours?.start??`08:00`),N(c.activeHours?.end??`22:00`),F(typeof c.target==`string`?c.target:`all`),await g.refresh()},[t,n,g]);if((0,p.useEffect)(()=>{if(h)return h(z),()=>h(null)},[h,z]),g.state.kind===`loading`)return(0,m.jsx)(a,{});if(g.state.kind===`offline`)return(0,m.jsx)(o,{port:e});if(g.state.kind===`error`)return(0,m.jsx)(s,{message:g.state.message});let B=S(E)?null:"Use the form `<n>s|m|h`, e.g. `30m`",V=C(O)?null:`Use HH:MM (24h)`,H=C(M)?null:`Use HH:MM (24h)`,U=g.state.data.perCli||{},W=Object.keys(U),G=[{value:`all`,label:`all (broadcast)`},...(W.length>0?W:[...y]).map(e=>({value:e,label:d(e).label||e}))];return G.some(e=>e.value===P)||G.push({value:P,label:`${d(P).label||P} (legacy)`}),(0,m.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),z()},children:[(0,m.jsxs)(i,{title:`Heartbeat`,hint:`Background prompts the agent runs on a schedule.`,children:[(0,m.jsx)(c,{id:`hb-enabled`,label:`Heartbeat enabled`,value:x,onChange:e=>{w(e),L(`heartbeat.enabled`,{value:e,original:!!I.enabled,valid:!0})}}),(0,m.jsx)(u,{id:`hb-every`,label:`Default interval`,value:E,placeholder:`30m`,error:B,onChange:e=>{D(e),L(`heartbeat.every`,{value:e,original:I.every??`30m`,valid:S(e)})}}),(0,m.jsx)(u,{id:`hb-start`,label:`Active hours start`,value:O,placeholder:`08:00`,error:V,onChange:e=>{k(e),L(`heartbeat.activeHours.start`,{value:e,original:I.activeHours?.start??`08:00`,valid:C(e)})}}),(0,m.jsx)(u,{id:`hb-end`,label:`Active hours end`,value:M,placeholder:`22:00`,error:H,onChange:e=>{N(e),L(`heartbeat.activeHours.end`,{value:e,original:I.activeHours?.end??`22:00`,valid:C(e)})}}),(0,m.jsx)(l,{id:`hb-target`,label:`Target`,value:P,options:G,onChange:e=>{F(e),L(`heartbeat.target`,{value:e,original:I.target??`all`,valid:!0})}})]}),(0,m.jsx)(i,{title:`Jobs`,hint:`Each job replaces the entire heartbeat.json on save. Concurrent edits from multiple browsers will overwrite — last write wins.`,children:(0,m.jsx)(A,{port:e,client:t,dirty:n,snapshot:_.state})}),(0,m.jsx)(i,{title:`Default heartbeat prompt template`,hint:`Markdown shown to the agent when a heartbeat fires without a job-specific prompt.`,children:(0,m.jsx)(j,{port:e,client:t,dirty:n,snapshot:v.state})})]})}export{x as PAGE_LOCAL_KEYS,b as SECTION_A_KEYS,y as TARGET_FALLBACK,M as default,T as isHeartbeatSettingsKey,O as jobScheduleBodyError,k as jobsHaveErrors,w as makeDefaultJob,D as normalizeJobsResponse,C as validateHHMM,S as validateInterval};
@@ -1 +1 @@
1
- import{t as e}from"./jsx-runtime-BjL7qHh8.js";var t=e();function n({children:e,tone:n=`warn`,role:r=`note`}){let i=`settings-inline-warn settings-inline-warn-${n}`;return r===`alert`?(0,t.jsx)(`p`,{className:i,role:`alert`,children:e}):(0,t.jsx)(`p`,{className:i,role:`note`,children:e})}export{n as t};
1
+ import{t as e}from"./jsx-runtime-BZmCptaP.js";var t=e();function n({children:e,tone:n=`warn`,role:r=`note`}){let i=`settings-inline-warn settings-inline-warn-${n}`;return r===`alert`?(0,t.jsx)(`p`,{className:i,role:`alert`,children:e}):(0,t.jsx)(`p`,{className:i,role:`note`,children:e})}export{n as t};
@@ -1,3 +1,3 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{t as c}from"./fields-BISouxp2.js";import{t as l}from"./InlineWarn-E64UaKFh.js";var u=e(t(),1),d=/^[a-zA-Z0-9._-]+$/;function f(e){return typeof e!=`string`||e.length===0||e.length>64?!1:d.test(e)}function p(e){if(!e||typeof e!=`object`)return{servers:{}};let t=e,n=t.servers,r={};if(n&&typeof n==`object`&&!Array.isArray(n))for(let[e,t]of Object.entries(n))r[e]=m(t);return{...t,servers:r}}function m(e){if(!e||typeof e!=`object`)return{command:``};let t=e,n=typeof t.command==`string`?t.command:``,r=Array.isArray(t.args)?t.args.filter(e=>typeof e==`string`):void 0,i=t.env&&typeof t.env==`object`&&!Array.isArray(t.env)?Object.fromEntries(Object.entries(t.env).filter(e=>typeof e[1]==`string`)):void 0,a=typeof t.autostart==`boolean`?t.autostart:void 0,o={command:n};r&&r.length>0&&(o.args=r),i&&Object.keys(i).length>0&&(o.env=i),a!==void 0&&(o.autostart=a);for(let[e,n]of Object.entries(t))e===`command`||e===`args`||e===`env`||e===`autostart`||(o[e]=n);return o}function h(){return{command:``}}function g(e){return!e||e.length===0?``:e.join(`
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{t as c}from"./fields-DUawAHWZ.js";import{t as l}from"./InlineWarn-DoJS7AgM.js";var u=e(t(),1),d=/^[a-zA-Z0-9._-]+$/;function f(e){return typeof e!=`string`||e.length===0||e.length>64?!1:d.test(e)}function p(e){if(!e||typeof e!=`object`)return{servers:{}};let t=e,n=t.servers,r={};if(n&&typeof n==`object`&&!Array.isArray(n))for(let[e,t]of Object.entries(n))r[e]=m(t);return{...t,servers:r}}function m(e){if(!e||typeof e!=`object`)return{command:``};let t=e,n=typeof t.command==`string`?t.command:``,r=Array.isArray(t.args)?t.args.filter(e=>typeof e==`string`):void 0,i=t.env&&typeof t.env==`object`&&!Array.isArray(t.env)?Object.fromEntries(Object.entries(t.env).filter(e=>typeof e[1]==`string`)):void 0,a=typeof t.autostart==`boolean`?t.autostart:void 0,o={command:n};r&&r.length>0&&(o.args=r),i&&Object.keys(i).length>0&&(o.env=i),a!==void 0&&(o.autostart=a);for(let[e,n]of Object.entries(t))e===`command`||e===`args`||e===`env`||e===`autostart`||(o[e]=n);return o}function h(){return{command:``}}function g(e){return!e||e.length===0?``:e.join(`
2
2
  `)}function _(e){if(!e)return[];let t=e.split(/\r?\n|,/),n=[];for(let e of t){let t=e.trim();t.length>0&&n.push(t)}return n}var v=/^[A-Za-z_][A-Za-z0-9_]*$/;function y(e){let t={};if(!e)return t;for(let n of e.split(/\r?\n/)){let e=n.trim();if(e===``||e.startsWith(`#`))continue;let r=e.indexOf(`=`);if(r===-1)continue;let i=e.slice(0,r).trim(),a=e.slice(r+1);v.test(i)&&(t[i]=a)}return t}function b(e){return e?Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
3
3
  `):``}function x(e,t){return f(e)?!t.command||t.command.trim()===``?{kind:`invalid`,reason:`Command is required.`}:{kind:`ok`}:{kind:`invalid`,reason:`Server name must match [a-zA-Z0-9._-] (1–64 chars).`}}function S(e){let t=new Set,n=new Set;for(let r of e){let e=r.toLowerCase();t.has(e)?n.add(e):t.add(e)}return n}function C(e){let t={};for(let[n,r]of Object.entries(e.servers)){let e={command:r.command};r.args&&r.args.length>0&&(e.args=[...r.args]),r.env&&Object.keys(r.env).length>0&&(e.env={...r.env}),r.autostart!==void 0&&(e.autostart=r.autostart);for(let[t,n]of Object.entries(r))t===`command`||t===`args`||t===`env`||t===`autostart`||(e[t]=n);t[n]=e}return{...e,servers:t}}function w(e){let t=1;for(;e.includes(`server-${t}`);)t+=1;return`server-${t}`}var T=n();function E({name:e,server:t,onRename:n,onChange:r,onRemove:i,nameError:a}){let o=`mcp-${e||`unnamed`}`,s=g(t.args),c=b(t.env);return(0,T.jsxs)(`article`,{className:`mcp-server-card`,"aria-label":`MCP server ${e||`(unnamed)`}`,children:[(0,T.jsxs)(`header`,{className:`mcp-server-card-header`,children:[(0,T.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`${o}-name`,children:[(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Server name`}),(0,T.jsx)(`input`,{id:`${o}-name`,type:`text`,value:e,spellCheck:!1,placeholder:`my-server`,"aria-invalid":!!a,onChange:e=>n(e.target.value)}),a?(0,T.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:a}):null]}),(0,T.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:i,"aria-label":`Remove ${e||`server`}`,children:`Remove`})]}),(0,T.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`${o}-command`,children:[(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Command`}),(0,T.jsx)(`input`,{id:`${o}-command`,type:`text`,value:t.command||``,placeholder:`npx`,spellCheck:!1,onChange:e=>r({...t,command:e.target.value})})]}),(0,T.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`${o}-args`,children:[(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Args (one per line, or comma-separated)`}),(0,T.jsx)(`textarea`,{id:`${o}-args`,value:s,rows:3,spellCheck:!1,onChange:e=>r({...t,args:_(e.target.value)})})]}),(0,T.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`${o}-env`,children:[(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Env (KEY=value per line)`}),(0,T.jsx)(`textarea`,{id:`${o}-env`,value:c,rows:3,spellCheck:!1,onChange:e=>r({...t,env:y(e.target.value)})})]}),(0,T.jsxs)(`label`,{className:`settings-field settings-field-toggle`,htmlFor:`${o}-autostart`,children:[(0,T.jsx)(`input`,{id:`${o}-autostart`,type:`checkbox`,checked:!!t.autostart,onChange:e=>r({...t,autostart:e.target.checked})}),(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Autostart`})]})]})}var D=`mcp.config`;function O({port:e,client:t,dirty:n,registerSave:d}){let{state:f,refresh:m,setData:g}=r(t,`/api/mcp`),[_,v]=(0,u.useState)({servers:{}}),[y,b]=(0,u.useState)([]),[O,k]=(0,u.useState)(!1),[A,j]=(0,u.useState)(!0),[M,N]=(0,u.useState)({kind:`idle`}),P=(0,u.useRef)(0),F=(0,u.useMemo)(()=>f.kind===`ready`?p(f.data):{servers:{}},[f]);(0,u.useEffect)(()=>{if(f.kind===`ready`){let e=p(f.data);v(e),b(Object.keys(e.servers))}},[f]),(0,u.useEffect)(()=>()=>{n.remove(D)},[n]);let I=(0,u.useMemo)(()=>Object.keys(_.servers),[_]),L=(0,u.useMemo)(()=>S(I),[I]),R=(0,u.useMemo)(()=>I.map(e=>({name:e,result:x(e,_.servers[e]??h())})),[_,I]).some(e=>e.result.kind===`invalid`),z=L.size>0,B=!R&&!z&&A,V=(0,u.useCallback)((e,t)=>{n.set(D,{value:C(e),original:C(F),valid:t})},[n,F]),H=(0,u.useCallback)((e,t)=>{v(e),t&&b(t);let n=t??Object.keys(e.servers),r=S(n);V(e,n.every(t=>x(t,e.servers[t]??h()).kind===`ok`)&&r.size===0&&A)},[A,V]),U=(0,u.useCallback)((e,t)=>{if(e===t)return;let n=y.map(n=>n===e?t:n),r={};for(let i of n)i===t?r[i]=_.servers[e]??h():r[i]=_.servers[i]??h();H({..._,servers:r},n)},[_,y,H]),W=(0,u.useCallback)((e,t)=>{H({..._,servers:{..._.servers,[e]:t}},y)},[_,y,H]),G=(0,u.useCallback)(e=>{let t={..._.servers};delete t[e];let n=y.filter(t=>t!==e);H({..._,servers:t},n)},[_,y,H]),K=(0,u.useCallback)(()=>{let e=w(y);H({..._,servers:{..._.servers,[e]:h()}},[...y,e])},[_,y,H]),q=(0,u.useCallback)((e,t)=>{if(j(t),!t){V(_,!1);return}if(e&&typeof e==`object`&&!Array.isArray(e)){let t=p(e);v(t),b(Object.keys(t.servers));let n=S(Object.keys(t.servers));V(t,Object.entries(t.servers).every(([e,t])=>x(e,t).kind===`ok`)&&n.size===0)}},[_,V]),J=(0,u.useCallback)(async()=>{let e=n.saveBundle();if(!(D in e))return;let r=e[D],i=await t.put(`/api/mcp`,r);n.clear();let a=await t.get(`/api/mcp`).catch(()=>i),o=p(a);v(o),b(Object.keys(o.servers)),g(a),await m()},[t,n,m,g]);(0,u.useEffect)(()=>{if(d)return d(J),()=>d(null)},[d,J]);let Y=(0,u.useCallback)(async(e,r)=>{if(n.isDirty()&&typeof window<`u`&&!window.confirm(`You have unsaved MCP edits. ${e} will use the on-disk config, not your unsaved changes. Continue?`))return;let i=P.current+1;P.current=i,N({kind:`pending`,label:e});try{let n=await t.post(r,{});if(P.current!==i)return;N({kind:`success`,message:`${e} succeeded${n?.servers?`: ${JSON.stringify(n.servers)}`:``}`})}catch(e){if(P.current!==i)return;N({kind:`error`,message:e instanceof Error?e.message:String(e)})}},[t,n]);if(f.kind===`loading`)return(0,T.jsx)(a,{});if(f.kind===`offline`)return(0,T.jsx)(o,{port:e});if(f.kind===`error`)return(0,T.jsx)(s,{message:f.message});let X=Array.from(L).sort();return(0,T.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,T.jsxs)(i,{title:`MCP servers`,hint:`Edit each server's command/args/env. Save writes back to mcp.json; Sync pushes the saved config to all CLIs.`,children:[(0,T.jsxs)(`div`,{className:`mcp-servers-list`,children:[y.length===0&&(0,T.jsxs)(`p`,{className:`settings-section-hint`,children:[`No servers configured. Add one or run `,(0,T.jsx)(`code`,{children:`Reset to defaults`}),`.`]}),y.map(e=>{let t=_.servers[e]??h(),n=e.toLowerCase(),r=L.has(n),i=x(e,t);return(0,T.jsx)(E,{name:e,server:t,onRename:t=>U(e,t),onChange:t=>W(e,t),onRemove:()=>G(e),nameError:r?`Duplicate server name (case-insensitive).`:i.kind===`invalid`?i.reason:null},e)})]}),(0,T.jsx)(`div`,{className:`mcp-servers-actions`,children:(0,T.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:K,children:`Add server`})}),z&&(0,T.jsxs)(l,{role:`alert`,children:[`Duplicate server name`,X.length===1?``:`s`,`: `,X.join(`, `),`. Saving is blocked until names are unique.`]}),R&&!z&&(0,T.jsx)(l,{role:`alert`,children:`Some servers have errors (missing command or invalid name). Saving is blocked until they are fixed.`})]}),(0,T.jsxs)(i,{title:`Actions`,hint:`These act on the saved config. Save edits first if you want them included.`,children:[(0,T.jsxs)(`div`,{className:`mcp-action-buttons`,children:[(0,T.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:M.kind===`pending`,onClick:()=>void Y(`Sync to all CLIs`,`/api/mcp/sync`),children:`Sync to all CLIs`}),(0,T.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:M.kind===`pending`,onClick:()=>void Y(`Install bundle`,`/api/mcp/install`),children:`Install bundle`}),(0,T.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:M.kind===`pending`,onClick:()=>{typeof window<`u`&&!window.confirm(`Reset MCP config to defaults? Your custom servers will be removed.`)||Y(`Reset to defaults`,`/api/mcp/reset`)},children:`Reset to defaults`})]}),M.kind===`pending`&&(0,T.jsxs)(`p`,{className:`settings-section-hint`,role:`status`,children:[M.label,`…`]}),M.kind===`success`&&(0,T.jsxs)(`p`,{className:`settings-section-hint`,role:`status`,children:[`✅ `,M.message]}),M.kind===`error`&&(0,T.jsx)(l,{role:`alert`,children:M.message})]}),(0,T.jsxs)(i,{title:`Advanced (raw JSON)`,hint:`Edit the entire config object. Useful for fields not surfaced in the structured editor.`,children:[(0,T.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:()=>k(e=>!e),"aria-expanded":O,children:O?`Hide raw JSON`:`Show raw JSON`}),O&&(0,T.jsx)(c,{id:`mcp-raw`,label:`mcp.json`,value:C(_),rows:16,onChange:q}),!B&&(0,T.jsx)(`p`,{className:`settings-section-hint`,children:`Save is disabled while validation errors are present.`})]})]})}export{O as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{a as c,i as l,r as u}from"./fields-DUawAHWZ.js";import{n as d}from"./agent-meta-Du8y6mSM.js";import{t as f}from"./path-utils-r2bJIu28.js";var p=e(t(),1),m=[`memory.enabled`,`memory.flushEvery`,`memory.cli`,`memory.retentionDays`,`memory.autoReflectAfterFlush`,`memory.flushLanguage`],h=[{value:`en`,label:`English (en)`},{value:`ko`,label:`한국어 (ko)`},{value:`ja`,label:`日本語 (ja)`},{value:`zh`,label:`中文 (zh)`}],g=50;function _(e){return m.includes(e)}function v(e){let t=y(e);if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=b(e);t&&n.push(t)}return n}function y(e){if(!e||typeof e!=`object`)return e;let t=e;return Array.isArray(t)?t:`data`in t?t.data:e}function b(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.key==`string`?t.key:null;return n?{key:n,value:typeof t.value==`string`?t.value:``,source:typeof t.source==`string`?t.source:`manual`}:null}function x(e,t){return!Number.isFinite(e)||!Number.isInteger(e)||e<=0?`${t} must be a positive integer`:null}function S(e,t,n=50){let r=Math.max(0,Math.floor(t))*n,i=e.slice(r,r+n),a=Math.max(1,Math.ceil(e.length/n));return{slice:i,hasMore:r+n<e.length,pageCount:a}}function C(e,t=80){return e.length<=t?e:`${e.slice(0,t)}…`}var w=n();function T({row:e,onOpen:t}){return(0,w.jsxs)(`tr`,{className:`settings-memory-row`,children:[(0,w.jsx)(`td`,{className:`settings-memory-key`,children:(0,w.jsx)(`button`,{type:`button`,className:`settings-memory-link`,onClick:()=>t(e),"aria-label":`Open memory entry ${e.key}`,children:e.key})}),(0,w.jsx)(`td`,{className:`settings-memory-source`,children:e.source}),(0,w.jsx)(`td`,{className:`settings-memory-length`,children:e.value.length}),(0,w.jsx)(`td`,{className:`settings-memory-preview`,title:e.value,children:C(e.value)})]})}var E={busy:null,notice:null,error:null};function D({port:e,client:t,dirty:n,registerSave:g}){let y=r(t,`/api/settings`),b=r(t,`/api/memory`),[C,D]=(0,p.useState)(!0),[O,k]=(0,p.useState)(10),[A,j]=(0,p.useState)(``),[M,N]=(0,p.useState)(30),[ee,P]=(0,p.useState)(!1),[F,I]=(0,p.useState)(`en`),[L,R]=(0,p.useState)(0),[z,B]=(0,p.useState)(null),[V,H]=(0,p.useState)(E);(0,p.useEffect)(()=>{if(y.state.kind!==`ready`)return;let e=y.state.data.memory||{};D(e.enabled!==!1),k(typeof e.flushEvery==`number`?e.flushEvery:10),j(typeof e.cli==`string`?e.cli:``),N(typeof e.retentionDays==`number`?e.retentionDays:30),P(!!e.autoReflectAfterFlush),I(typeof e.flushLanguage==`string`&&e.flushLanguage?e.flushLanguage:`en`)},[y.state]),(0,p.useEffect)(()=>()=>{for(let e of m)n.remove(e)},[n]),(0,p.useEffect)(()=>{if(!z)return;let e=e=>{e.key===`Escape`&&B(null)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[z]);let U=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),W=(0,p.useMemo)(()=>y.state.kind===`ready`&&y.state.data.memory||{},[y.state]),G=(0,p.useCallback)(async()=>{let e=n.saveBundle(),r={};for(let[t,n]of Object.entries(e))_(t)&&(r[t]=n);if(Object.keys(r).length===0)return;let i=f(r),a=await t.put(`/api/settings`,i),o=a&&typeof a==`object`&&`data`in a?a.data:a;for(let e of m)n.remove(e);y.setData(o);let s=o.memory||{};D(s.enabled!==!1),k(typeof s.flushEvery==`number`?s.flushEvery:10),j(typeof s.cli==`string`?s.cli:``),N(typeof s.retentionDays==`number`?s.retentionDays:30),P(!!s.autoReflectAfterFlush),I(typeof s.flushLanguage==`string`&&s.flushLanguage?s.flushLanguage:`en`),await y.refresh()},[t,n,y]);(0,p.useEffect)(()=>{if(g)return g(G),()=>g(null)},[g,G]);let K=(0,p.useCallback)(async()=>{H({busy:`flush`,notice:null,error:null});try{await t.post(`/api/jaw-memory/flush`,{}),H({busy:null,notice:`Memory flush queued. Browse refreshes when it completes.`,error:null}),await b.refresh()}catch(e){H({busy:null,notice:null,error:e instanceof Error?e.message:String(e)})}},[t,b]),q=(0,p.useCallback)(async()=>{H({busy:`reflect`,notice:null,error:null});try{await t.post(`/api/jaw-memory/reflect`,{}),H({busy:null,notice:`Reflect complete.`,error:null}),await b.refresh()}catch(e){H({busy:null,notice:null,error:e instanceof Error?e.message:String(e)})}},[t,b]),J=(0,p.useCallback)(()=>{if(b.state.kind!==`ready`)return;let t=v(b.state.data),n=new Blob([JSON.stringify(t,null,2)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`jaw-memory-${e}-${Date.now()}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)},[b.state,e]);if(y.state.kind===`loading`)return(0,w.jsx)(a,{});if(y.state.kind===`offline`)return(0,w.jsx)(o,{port:e});if(y.state.kind===`error`)return(0,w.jsx)(s,{message:y.state.message});let Y=x(O,`Flush every`),X=x(M,`Retention days`),Z=y.state.data.perCli||{},Q=[{value:``,label:`(profile default)`},...Object.keys(Z).map(e=>({value:e,label:d(e).label||e}))];A&&!Q.some(e=>e.value===A)&&Q.push({value:A,label:`${d(A).label||A} (legacy)`});let $=b.state.kind===`ready`?v(b.state.data):[],{slice:te,hasMore:ne,pageCount:re}=S($,Math.min(L,Math.max(0,Math.ceil($.length/50)-1)));return(0,w.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),G()},children:[(0,w.jsxs)(i,{title:`Memory engine`,hint:`Background memory flush and reflection cadence.`,children:[(0,w.jsx)(c,{id:`memory-enabled`,label:`Memory enabled`,value:C,onChange:e=>{D(e),U(`memory.enabled`,{value:e,original:W.enabled!==!1,valid:!0})}}),(0,w.jsx)(u,{id:`memory-flush-every`,label:`Flush every (sessions)`,value:O,min:1,error:Y,onChange:e=>{k(e),U(`memory.flushEvery`,{value:e,original:typeof W.flushEvery==`number`?W.flushEvery:10,valid:x(e,`Flush every`)===null})}}),(0,w.jsx)(l,{id:`memory-cli`,label:`Flush CLI`,value:A,options:Q,onChange:e=>{j(e),U(`memory.cli`,{value:e,original:W.cli??``,valid:!0})}}),(0,w.jsx)(u,{id:`memory-retention`,label:`Retention days`,value:M,min:1,error:X,onChange:e=>{N(e),U(`memory.retentionDays`,{value:e,original:typeof W.retentionDays==`number`?W.retentionDays:30,valid:x(e,`Retention days`)===null})}}),(0,w.jsx)(c,{id:`memory-auto-reflect`,label:`Auto-reflect after flush`,value:ee,onChange:e=>{P(e),U(`memory.autoReflectAfterFlush`,{value:e,original:!!W.autoReflectAfterFlush,valid:!0})}}),(0,w.jsx)(l,{id:`memory-flush-language`,label:`Flush language`,value:F,options:[...h],onChange:e=>{I(e),U(`memory.flushLanguage`,{value:e,original:W.flushLanguage??`en`,valid:!0})}})]}),(0,w.jsx)(i,{title:`Stored entries`,hint:`Read-only browse of the key/value memory table (50/page).`,children:b.state.kind===`loading`?(0,w.jsx)(`p`,{className:`settings-section-hint`,children:`Loading entries…`}):b.state.kind===`offline`?(0,w.jsx)(o,{port:e}):b.state.kind===`error`?(0,w.jsx)(s,{message:b.state.message}):$.length===0?(0,w.jsx)(`p`,{className:`settings-section-hint`,children:`No memory entries yet.`}):(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`table`,{className:`settings-memory-table`,children:[(0,w.jsx)(`thead`,{children:(0,w.jsxs)(`tr`,{children:[(0,w.jsx)(`th`,{scope:`col`,children:`Key`}),(0,w.jsx)(`th`,{scope:`col`,children:`Source`}),(0,w.jsx)(`th`,{scope:`col`,children:`Length`}),(0,w.jsx)(`th`,{scope:`col`,children:`Preview`})]})}),(0,w.jsx)(`tbody`,{children:te.map(e=>(0,w.jsx)(T,{row:e,onOpen:B},e.key))})]}),(0,w.jsxs)(`div`,{className:`settings-memory-pagination`,children:[(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:L===0,onClick:()=>R(e=>Math.max(0,e-1)),children:`Prev`}),(0,w.jsxs)(`span`,{className:`settings-memory-pageinfo`,children:[`Page `,L+1,` / `,re]}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:!ne,onClick:()=>R(e=>e+1),children:`Next`})]})]})}),(0,w.jsxs)(i,{title:`Actions`,hint:`Flush runs async — the browse list refreshes when it finishes.`,children:[(0,w.jsxs)(`div`,{className:`settings-memory-actions`,children:[(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:V.busy!==null,onClick:()=>void K(),children:V.busy===`flush`?`Queuing…`:`Flush now`}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:V.busy!==null,onClick:()=>void q(),children:V.busy===`reflect`?`Reflecting…`:`Reflect soul`}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:b.state.kind!==`ready`,onClick:J,children:`Export memory`})]}),V.notice?(0,w.jsx)(`p`,{className:`settings-section-hint`,role:`status`,children:V.notice}):null,V.error?(0,w.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:V.error}):null]}),z?(0,w.jsx)(`div`,{className:`settings-memory-modal`,role:`dialog`,"aria-modal":`true`,"aria-label":`Memory entry ${z.key}`,onClick:e=>{e.target===e.currentTarget&&B(null)},children:(0,w.jsxs)(`div`,{className:`settings-memory-modal-card`,children:[(0,w.jsxs)(`header`,{className:`settings-memory-modal-header`,children:[(0,w.jsx)(`h3`,{children:z.key}),(0,w.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>B(null),"aria-label":`Close memory entry`,children:`Close`})]}),(0,w.jsx)(`pre`,{className:`settings-memory-modal-body`,children:z.value})]})}):null]})}export{h as FLUSH_LANGUAGE_OPTIONS,g as MEMORY_PAGE_SIZE,m as MEMORY_SECTION_A_KEYS,D as default,_ as isMemorySettingsKey,v as normalizeMemoryRows,S as paginate,C as previewValue,x as validatePositiveInt};
@@ -1,4 +1,4 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{A as t}from"./vendor-render-DEStnpJ8.js";import{n,t as r}from"./jsx-runtime-BjL7qHh8.js";import{A as i,C as a,F as o,M as s,O as c,P as l,S as u,T as d,_ as f,b as p,c as m,d as h,f as g,g as _,j as v,n as y,o as ee,p as b,r as x,s as te,t as ne,v as re,w as ie,x as ae,y as oe}from"./wiki-link-suggestions-LQuYT22G.js";import{n as S,t as se}from"./w3c-keyname-DJlC6DTY.js";import{T as ce}from"./vendor-utils-IVTPs69f.js";var le={}.hasOwnProperty;function ue(e,t){let n=t||{};function r(t,...n){let i=r.invalid,a=r.handlers;if(t&&le.call(t,e)){let n=String(t[e]);i=le.call(a,n)?a[n]:r.unknown}if(i)return i.call(this,t,...n)}return r.handlers=n.handlers||{},r.invalid=n.invalid,r.unknown=n.unknown,r}var de={}.hasOwnProperty;function fe(e,t){let n=-1,r;if(t.extensions)for(;++n<t.extensions.length;)fe(e,t.extensions[n]);for(r in t)if(de.call(t,r))switch(r){case`extensions`:break;case`unsafe`:pe(e[r],t[r]);break;case`join`:pe(e[r],t[r]);break;case`handlers`:me(e[r],t[r]);break;default:e.options[r]=t[r]}return e}function pe(e,t){t&&e.push(...t)}function me(e,t){t&&Object.assign(e,t)}var he=[ge];function ge(e,t,n,r){if(t.type===`code`&&ie(t,r)&&(e.type===`list`||e.type===t.type&&ie(e,r)))return!1;if(`spread`in n&&typeof n.spread==`boolean`)return e.type===`paragraph`&&(e.type===t.type||t.type===`definition`||t.type===`heading`&&u(t,r))?void 0:+!!n.spread}var _e=[`autolink`,`destinationLiteral`,`destinationRaw`,`reference`,`titleQuote`,`titleApostrophe`],ve=[{character:` `,after:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,before:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`]},{character:`\r`,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`,`codeFencedMetaGraveAccent`,`codeFencedMetaTilde`,`destinationLiteral`,`headingAtx`]},{character:`
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{A as t}from"./vendor-render-DCb9B75Q.js";import{n,t as r}from"./jsx-runtime-BZmCptaP.js";import{A as i,C as a,F as o,M as s,O as c,P as l,S as u,T as d,_ as f,b as p,c as m,d as h,f as g,g as _,j as v,n as y,o as ee,p as b,r as x,s as te,t as ne,v as re,w as ie,x as ae,y as oe}from"./wiki-link-suggestions-BHwNQXT_.js";import{n as S,t as se}from"./w3c-keyname-BggQEPNo.js";import{M as ce}from"./vendor-utils-BnxL60_-.js";var le={}.hasOwnProperty;function ue(e,t){let n=t||{};function r(t,...n){let i=r.invalid,a=r.handlers;if(t&&le.call(t,e)){let n=String(t[e]);i=le.call(a,n)?a[n]:r.unknown}if(i)return i.call(this,t,...n)}return r.handlers=n.handlers||{},r.invalid=n.invalid,r.unknown=n.unknown,r}var de={}.hasOwnProperty;function fe(e,t){let n=-1,r;if(t.extensions)for(;++n<t.extensions.length;)fe(e,t.extensions[n]);for(r in t)if(de.call(t,r))switch(r){case`extensions`:break;case`unsafe`:pe(e[r],t[r]);break;case`join`:pe(e[r],t[r]);break;case`handlers`:me(e[r],t[r]);break;default:e.options[r]=t[r]}return e}function pe(e,t){t&&e.push(...t)}function me(e,t){t&&Object.assign(e,t)}var he=[ge];function ge(e,t,n,r){if(t.type===`code`&&ie(t,r)&&(e.type===`list`||e.type===t.type&&ie(e,r)))return!1;if(`spread`in n&&typeof n.spread==`boolean`)return e.type===`paragraph`&&(e.type===t.type||t.type===`definition`||t.type===`heading`&&u(t,r))?void 0:+!!n.spread}var _e=[`autolink`,`destinationLiteral`,`destinationRaw`,`reference`,`titleQuote`,`titleApostrophe`],ve=[{character:` `,after:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,before:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`]},{character:`\r`,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`,`codeFencedMetaGraveAccent`,`codeFencedMetaTilde`,`destinationLiteral`,`headingAtx`]},{character:`
2
2
  `,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`,`codeFencedMetaGraveAccent`,`codeFencedMetaTilde`,`destinationLiteral`,`headingAtx`]},{character:` `,after:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,before:`[\\r\\n]`,inConstruct:`phrasing`},{character:` `,inConstruct:[`codeFencedLangGraveAccent`,`codeFencedLangTilde`]},{character:`!`,after:`\\[`,inConstruct:`phrasing`,notInConstruct:_e},{character:`"`,inConstruct:`titleQuote`},{atBreak:!0,character:`#`},{character:`#`,inConstruct:`headingAtx`,after:`(?:[\r
3
3
  ]|$)`},{character:`&`,after:`[#A-Za-z]`,inConstruct:`phrasing`},{character:`'`,inConstruct:`titleApostrophe`},{character:`(`,inConstruct:`destinationRaw`},{before:`\\]`,character:`(`,inConstruct:`phrasing`,notInConstruct:_e},{atBreak:!0,before:`\\d+`,character:`)`},{character:`)`,inConstruct:`destinationRaw`},{atBreak:!0,character:`*`,after:`(?:[ \r
4
4
  *])`},{character:`*`,inConstruct:`phrasing`,notInConstruct:_e},{atBreak:!0,character:`+`,after:`(?:[ \r
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{a as c,i as l,n as u,r as d,s as f}from"./fields-DUawAHWZ.js";import{n as p}from"./agent-meta-Du8y6mSM.js";import{t as m}from"./path-utils-r2bJIu28.js";var h=e(t(),1),g=n();function _(e,t,n=!0){return{value:e,original:t,valid:n}}function v({cli:e,meta:t,original:n,value:r,setValue:i,setEntry:a}){let o=`percli-${e}-models`,s=e===`ai-e`,u=r.provider||t.defaultProvider||t.providers?.[0]||`claude`,d=s?t.modelsByProvider?.[u]??t.models:t.models,p=s?t.effortsByProvider?.[u]??t.efforts:t.efforts;return(0,g.jsxs)(`div`,{className:`settings-percli-row`,"data-cli":e,children:[(0,g.jsx)(`h3`,{className:`settings-percli-title`,children:t.label}),(0,g.jsxs)(`div`,{className:`settings-percli-grid`,children:[s&&t.providers?.length?(0,g.jsx)(l,{id:`percli-${e}-provider`,label:`Provider`,value:u,options:t.providers.map(e=>({value:e,label:e})),onChange:o=>{let s=t.modelsByProvider?.[o]??[],c=t.effortsByProvider?.[o]??[],l=s.includes(r.model||``)?r.model||``:s[0]||``,u=c.includes(r.effort||``)&&r.effort||``;i({...r,provider:o,model:l,effort:u}),a(`perCli.${e}.provider`,_(o,n.provider??t.defaultProvider??`claude`)),a(`perCli.${e}.model`,_(l,n.model??``)),a(`perCli.${e}.effort`,_(u,n.effort??``))}}):null,(0,g.jsxs)(`div`,{className:`settings-percli-model`,children:[(0,g.jsx)(f,{id:`percli-${e}-model`,label:`Model`,value:r.model??``,onChange:t=>{i({...r,model:t}),a(`perCli.${e}.model`,_(t,n.model??``))},placeholder:d[0]??`model id`}),d.length>0?(0,g.jsx)(`datalist`,{id:o,children:d.map(e=>(0,g.jsx)(`option`,{value:e},e))}):null]}),p.length>0?(0,g.jsx)(l,{id:`percli-${e}-effort`,label:`Effort`,value:r.effort??``,options:[{value:``,label:`(default)`},...p.map(e=>({value:e,label:e}))],onChange:t=>{i({...r,effort:t}),a(`perCli.${e}.effort`,_(t,n.effort??``))}}):null,(0,g.jsx)(c,{id:`percli-${e}-fastmode`,label:`Fast mode`,value:!!r.fastMode,onChange:t=>{i({...r,fastMode:t}),a(`perCli.${e}.fastMode`,_(t,!!n.fastMode))}})]})]})}function y(e){let t=new Set;for(let n of Object.keys(e.activeOverrides||{}))t.add(n);for(let n of Object.keys(e.perCli||{}))t.add(n);let n={};for(let e of t)n[e]={model:``,effort:``};return{activeOverrides:n}}function b({port:e,client:t,dirty:n,registerSave:c}){let{state:l,refresh:f,setData:_}=r(t,`/api/settings`),[b,x]=(0,h.useState)({}),[S,C]=(0,h.useState)([]),[w,T]=(0,h.useState)({}),[E,D]=(0,h.useState)(!1),[O,k]=(0,h.useState)(null);(0,h.useEffect)(()=>{if(l.kind!==`ready`)return;x({...l.data.perCli||{}}),C([...l.data.fallbackOrder||[]]);let e=l.data.perCli?.codex||{},t={};typeof e.contextWindowSize==`number`&&(t.contextWindowSize=e.contextWindowSize),typeof e.contextWindowCompactLimit==`number`&&(t.contextWindowCompactLimit=e.contextWindowCompactLimit),T(t)},[l]),(0,h.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`fallbackOrder`||e.startsWith(`perCli.`))&&n.remove(e)},[n]);let A=(0,h.useCallback)((e,t)=>n.set(e,t),[n]),j=(0,h.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=m(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),_(a),x({...a.perCli||{}}),C([...a.fallbackOrder||[]]),await f()},[t,n,f,_]);(0,h.useEffect)(()=>{if(c)return c(j),()=>c(null)},[c,j]);let M=(0,h.useCallback)(async()=>{if(l.kind===`ready`&&window.confirm(`Reset all active overrides?`)){D(!0),k(null);try{let e=y(l.data),n=await t.put(`/api/settings`,e);_(n&&typeof n==`object`&&`data`in n?n.data:n),await f()}catch(e){k(e instanceof Error?e.message:String(e))}finally{D(!1)}}},[t,f,_,l]);if(l.kind===`loading`)return(0,g.jsx)(a,{});if(l.kind===`offline`)return(0,g.jsx)(o,{port:e});if(l.kind===`error`)return(0,g.jsx)(s,{message:l.message});let N=l.data,P=N.perCli||{},F=Object.keys(P),I=P.codex||{},L=N.activeOverrides||{},R=Object.entries(L);return(0,g.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),j()},children:[(0,g.jsx)(i,{title:`Model defaults`,hint:`Per-CLI defaults applied when no active override is set on the Agent page.`,children:F.length===0?(0,g.jsx)(`p`,{className:`settings-empty`,children:`No CLIs registered for this instance.`}):F.map(e=>(0,g.jsx)(v,{cli:e,meta:p(e),original:P[e]||{},value:b[e]||P[e]||{},setValue:t=>x({...b,[e]:t}),setEntry:A},e))}),P.codex?(0,g.jsxs)(i,{title:`Codex context window`,hint:`Codex-only sliders. Other CLIs ignore these values.`,children:[(0,g.jsx)(d,{id:`model-codex-ctx`,label:`Context window size`,value:w.contextWindowSize??(typeof I.contextWindowSize==`number`?I.contextWindowSize:1e6),min:0,step:1e4,onChange:e=>{T({...w,contextWindowSize:e}),A(`perCli.codex.contextWindowSize`,{value:e,original:I.contextWindowSize??1e6,valid:Number.isFinite(e)&&e>=0})}}),(0,g.jsx)(d,{id:`model-codex-compact`,label:`Compact limit`,value:w.contextWindowCompactLimit??(typeof I.contextWindowCompactLimit==`number`?I.contextWindowCompactLimit:9e5),min:0,step:1e4,onChange:e=>{T({...w,contextWindowCompactLimit:e}),A(`perCli.codex.contextWindowCompactLimit`,{value:e,original:I.contextWindowCompactLimit??9e5,valid:Number.isFinite(e)&&e>=0})}})]}):null,(0,g.jsx)(i,{title:`Fallback order`,hint:`Order of CLIs used when the active CLI fails. Press Enter to add a chip; Backspace to remove the last.`,children:(0,g.jsx)(u,{id:`model-fallbackOrder`,label:`Fallback order`,value:S,onChange:e=>{C(e),A(`fallbackOrder`,{value:e,original:N.fallbackOrder||[],valid:!0})},placeholder:`cli name`})}),(0,g.jsxs)(i,{title:`Active overrides`,hint:`Per-session overrides applied on top of per-CLI defaults.`,children:[R.length===0?(0,g.jsx)(`p`,{className:`settings-empty`,children:`No active overrides.`}):(0,g.jsxs)(`table`,{className:`settings-overrides-table`,children:[(0,g.jsx)(`thead`,{children:(0,g.jsxs)(`tr`,{children:[(0,g.jsx)(`th`,{scope:`col`,children:`CLI`}),(0,g.jsx)(`th`,{scope:`col`,children:`Model`}),(0,g.jsx)(`th`,{scope:`col`,children:`Effort`})]})}),(0,g.jsx)(`tbody`,{children:R.map(([e,t])=>(0,g.jsxs)(`tr`,{children:[(0,g.jsx)(`td`,{children:e}),(0,g.jsx)(`td`,{children:(0,g.jsx)(`code`,{children:t?.model||`—`})}),(0,g.jsx)(`td`,{children:(0,g.jsx)(`code`,{children:t?.effort||`—`})})]},e))})]}),(0,g.jsxs)(`div`,{className:`settings-overrides-actions`,children:[(0,g.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>void M(),disabled:E||R.length===0,children:E?`Resetting…`:`Reset overrides`}),O?(0,g.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:O}):null]})]})]})}export{y as buildResetOverridesPatch,b as default};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{a as c,i as l,s as u}from"./fields-BISouxp2.js";import{t as d}from"./InlineWarn-E64UaKFh.js";import{t as f}from"./path-utils-DySmCVZK.js";var p=e(t(),1),m=n(),h=[`off`,`http-only`,`full`];function g(e){return e===`off`||e===`http-only`||e===`full`}var _=[`network.bindHost`,`network.lanBypass`,`network.remoteAccess.mode`,`network.remoteAccess.trustProxies`,`network.remoteAccess.trustForwardedFor`,`network.remoteAccess.publicOriginHint`],v=[{value:`127.0.0.1`,label:`127.0.0.1 — loopback only (recommended)`},{value:`0.0.0.0`,label:`0.0.0.0 — all interfaces (LAN exposed)`}],y=[{value:`off`,label:`off — block remote requests`},{value:`http-only`,label:`http-only — read-only HTTP from remote`},{value:`full`,label:`full — HTTP + WebSocket from remote`}];function b(e){let t={};return e.bindHost!==void 0&&(t.bindHost=e.bindHost),e.lanBypass!==void 0&&(t.lanBypass=e.lanBypass),t.remoteAccess={...e.remoteAccess??{}},t}function x(e){let t=(e||``).trim();if(t===``)return{kind:`empty`};let n;try{n=new URL(t)}catch{return{kind:`invalid`,reason:`Must be an absolute URL (https://… or http://…).`}}return n.protocol!==`http:`&&n.protocol!==`https:`?{kind:`invalid`,reason:`Only http:// or https:// origins are accepted.`}:n.hostname?n.pathname&&n.pathname!==`/`?{kind:`invalid`,reason:`Origin must not include a path.`}:n.search||n.hash?{kind:`invalid`,reason:`Origin must not include query or hash.`}:{kind:`valid`,origin:n.origin}:{kind:`invalid`,reason:`Origin must include a host.`}}function S(e){let t=(e.locationHost||``).toLowerCase().split(`:`)[0]||``;return t===``||t===`localhost`||t===`127.0.0.1`||t===`::1`||e.currentMode===e.nextMode?!1:e.nextMode===`off`}function C({port:e,client:t,dirty:n,registerSave:h}){let{state:C,refresh:w,setData:T}=r(t,`/api/settings`),[E,D]=(0,p.useState)({});(0,p.useEffect)(()=>{C.kind===`ready`&&D(b(C.data.network??{}))},[C]),(0,p.useEffect)(()=>()=>{for(let e of _)n.remove(e)},[n]);let O=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),k=(0,p.useMemo)(()=>C.kind===`ready`?C.data.network??{}:{},[C]),A=k.remoteAccess??{},j=E.remoteAccess??{},M=E.bindHost??k.bindHost??`127.0.0.1`,N=!!(E.lanBypass??k.lanBypass),P=g(j.mode)?j.mode:g(A.mode)?A.mode:`off`,F=P!==`off`,I=!!(j.trustProxies??A.trustProxies),L=!!(j.trustForwardedFor??A.trustForwardedFor),R=j.publicOriginHint??A.publicOriginHint??``,z=x(R),B=S({currentMode:g(A.mode)?A.mode:`off`,nextMode:P,locationHost:typeof window<`u`?window.location.host:``}),V=(0,p.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0||B&&typeof window<`u`&&!window.confirm(`You are accessing this dashboard over a remote origin. Saving with remote access "off" will lock you out. Continue?`))return;let r=f(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),D(b(a.network??{})),T(a),await w()},[t,n,B,w,T]);if((0,p.useEffect)(()=>{if(h)return h(V),()=>h(null)},[h,V]),C.kind===`loading`)return(0,m.jsx)(a,{});if(C.kind===`offline`)return(0,m.jsx)(o,{port:e});if(C.kind===`error`)return(0,m.jsx)(s,{message:C.message});let H=(E.bindHost??k.bindHost)!==(k.bindHost??`127.0.0.1`);return(0,m.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),V()},children:[(0,m.jsxs)(i,{title:`Bind`,hint:`Listening interface for /i/${e}. Changes require an instance restart.`,children:[(0,m.jsx)(l,{id:`network-bindHost`,label:`Bind host`,value:M,options:v,onChange:e=>{D({...E,bindHost:e}),O(`network.bindHost`,{value:e,original:k.bindHost??`127.0.0.1`,valid:!0})}}),M===`0.0.0.0`&&(0,m.jsxs)(d,{children:[`Listening on `,(0,m.jsx)(`code`,{children:`0.0.0.0`}),` exposes this instance's API to anyone on your LAN. Pair with auth + firewall rules.`]}),H&&(0,m.jsx)(d,{tone:`info`,children:`Restart the instance for the new bind host to take effect.`}),(0,m.jsx)(c,{id:`network-lanBypass`,label:`LAN bypass`,description:`Skip auth checks for clients on the same LAN.`,value:N,onChange:e=>{D({...E,lanBypass:e}),O(`network.lanBypass`,{value:e,original:!!k.lanBypass,valid:!0})}}),N&&(0,m.jsx)(d,{children:`LAN bypass disables auth for any client on the same network. Only enable on a trusted network.`})]}),(0,m.jsxs)(i,{title:`Remote access`,hint:`Mode controls what reaches the API from outside the loopback interface.`,children:[(0,m.jsx)(l,{id:`network-remoteAccess-mode`,label:`Remote access mode`,value:P,options:y,onChange:e=>{g(e)&&(D({...E,remoteAccess:{...j,mode:e}}),O(`network.remoteAccess.mode`,{value:e,original:g(A.mode)?A.mode:`off`,valid:!0}))}}),(0,m.jsxs)(`p`,{className:`settings-section-hint`,children:[(0,m.jsx)(`strong`,{children:`off`}),` — only loopback can talk to the API.`,` `,(0,m.jsx)(`strong`,{children:`http-only`}),` — remote can issue HTTP requests but no WebSocket upgrades. `,(0,m.jsx)(`strong`,{children:`full`}),` — HTTP + WebSocket open to remote (use with auth).`]}),B&&(0,m.jsxs)(d,{role:`alert`,children:[`Saving will close remote access while you're connected from`,(0,m.jsxs)(`code`,{children:[` `,typeof window<`u`?window.location.host:``,` `]}),`— you will be locked out. Reach the dashboard over loopback first.`]}),F&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(c,{id:`network-remoteAccess-trustProxies`,label:`Trust proxies`,description:`Honor proxy headers when computing the client origin.`,value:I,onChange:e=>{D({...E,remoteAccess:{...j,trustProxies:e}}),O(`network.remoteAccess.trustProxies`,{value:e,original:!!A.trustProxies,valid:!0})}}),(0,m.jsx)(c,{id:`network-remoteAccess-trustForwardedFor`,label:`Trust X-Forwarded-For`,description:`Use X-Forwarded-For for the client IP. Only enable behind a known proxy.`,value:L,onChange:e=>{D({...E,remoteAccess:{...j,trustForwardedFor:e}}),O(`network.remoteAccess.trustForwardedFor`,{value:e,original:!!A.trustForwardedFor,valid:!0})}}),L&&!I&&(0,m.jsx)(d,{children:`Trusting X-Forwarded-For without trusting the proxy chain lets any client spoof its IP. Enable "Trust proxies" too.`}),(0,m.jsx)(u,{id:`network-remoteAccess-publicOriginHint`,label:`Public origin hint`,value:R,placeholder:`https://your-tunnel-url`,error:z.kind===`invalid`?z.reason:null,onChange:e=>{D({...E,remoteAccess:{...j,publicOriginHint:e}});let t=x(e);O(`network.remoteAccess.publicOriginHint`,{value:t.kind===`valid`?t.origin:e,original:A.publicOriginHint??``,valid:t.kind!==`invalid`})}})]})]})]})}export{h as REMOTE_ACCESS_MODES,C as default,S as detectSelfLockoutRisk,g as isRemoteAccessMode,x as parsePublicOriginHint};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{a as c,i as l,s as u}from"./fields-DUawAHWZ.js";import{t as d}from"./InlineWarn-DoJS7AgM.js";import{t as f}from"./path-utils-r2bJIu28.js";var p=e(t(),1),m=n(),h=[`off`,`http-only`,`full`];function g(e){return e===`off`||e===`http-only`||e===`full`}var _=[`network.bindHost`,`network.lanBypass`,`network.remoteAccess.mode`,`network.remoteAccess.trustProxies`,`network.remoteAccess.trustForwardedFor`,`network.remoteAccess.publicOriginHint`],v=[{value:`127.0.0.1`,label:`127.0.0.1 — loopback only (recommended)`},{value:`0.0.0.0`,label:`0.0.0.0 — all interfaces (LAN exposed)`}],y=[{value:`off`,label:`off — block remote requests`},{value:`http-only`,label:`http-only — read-only HTTP from remote`},{value:`full`,label:`full — HTTP + WebSocket from remote`}];function b(e){let t={};return e.bindHost!==void 0&&(t.bindHost=e.bindHost),e.lanBypass!==void 0&&(t.lanBypass=e.lanBypass),t.remoteAccess={...e.remoteAccess??{}},t}function x(e){let t=(e||``).trim();if(t===``)return{kind:`empty`};let n;try{n=new URL(t)}catch{return{kind:`invalid`,reason:`Must be an absolute URL (https://… or http://…).`}}return n.protocol!==`http:`&&n.protocol!==`https:`?{kind:`invalid`,reason:`Only http:// or https:// origins are accepted.`}:n.hostname?n.pathname&&n.pathname!==`/`?{kind:`invalid`,reason:`Origin must not include a path.`}:n.search||n.hash?{kind:`invalid`,reason:`Origin must not include query or hash.`}:{kind:`valid`,origin:n.origin}:{kind:`invalid`,reason:`Origin must include a host.`}}function S(e){let t=(e.locationHost||``).toLowerCase().split(`:`)[0]||``;return t===``||t===`localhost`||t===`127.0.0.1`||t===`::1`||e.currentMode===e.nextMode?!1:e.nextMode===`off`}function C({port:e,client:t,dirty:n,registerSave:h}){let{state:C,refresh:w,setData:T}=r(t,`/api/settings`),[E,D]=(0,p.useState)({});(0,p.useEffect)(()=>{C.kind===`ready`&&D(b(C.data.network??{}))},[C]),(0,p.useEffect)(()=>()=>{for(let e of _)n.remove(e)},[n]);let O=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),k=(0,p.useMemo)(()=>C.kind===`ready`?C.data.network??{}:{},[C]),A=k.remoteAccess??{},j=E.remoteAccess??{},M=E.bindHost??k.bindHost??`127.0.0.1`,N=!!(E.lanBypass??k.lanBypass),P=g(j.mode)?j.mode:g(A.mode)?A.mode:`off`,F=P!==`off`,I=!!(j.trustProxies??A.trustProxies),L=!!(j.trustForwardedFor??A.trustForwardedFor),R=j.publicOriginHint??A.publicOriginHint??``,z=x(R),B=S({currentMode:g(A.mode)?A.mode:`off`,nextMode:P,locationHost:typeof window<`u`?window.location.host:``}),V=(0,p.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0||B&&typeof window<`u`&&!window.confirm(`You are accessing this dashboard over a remote origin. Saving with remote access "off" will lock you out. Continue?`))return;let r=f(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),D(b(a.network??{})),T(a),await w()},[t,n,B,w,T]);if((0,p.useEffect)(()=>{if(h)return h(V),()=>h(null)},[h,V]),C.kind===`loading`)return(0,m.jsx)(a,{});if(C.kind===`offline`)return(0,m.jsx)(o,{port:e});if(C.kind===`error`)return(0,m.jsx)(s,{message:C.message});let H=(E.bindHost??k.bindHost)!==(k.bindHost??`127.0.0.1`);return(0,m.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),V()},children:[(0,m.jsxs)(i,{title:`Bind`,hint:`Listening interface for /i/${e}. Changes require an instance restart.`,children:[(0,m.jsx)(l,{id:`network-bindHost`,label:`Bind host`,value:M,options:v,onChange:e=>{D({...E,bindHost:e}),O(`network.bindHost`,{value:e,original:k.bindHost??`127.0.0.1`,valid:!0})}}),M===`0.0.0.0`&&(0,m.jsxs)(d,{children:[`Listening on `,(0,m.jsx)(`code`,{children:`0.0.0.0`}),` exposes this instance's API to anyone on your LAN. Pair with auth + firewall rules.`]}),H&&(0,m.jsx)(d,{tone:`info`,children:`Restart the instance for the new bind host to take effect.`}),(0,m.jsx)(c,{id:`network-lanBypass`,label:`LAN bypass`,description:`Skip auth checks for clients on the same LAN.`,value:N,onChange:e=>{D({...E,lanBypass:e}),O(`network.lanBypass`,{value:e,original:!!k.lanBypass,valid:!0})}}),N&&(0,m.jsx)(d,{children:`LAN bypass disables auth for any client on the same network. Only enable on a trusted network.`})]}),(0,m.jsxs)(i,{title:`Remote access`,hint:`Mode controls what reaches the API from outside the loopback interface.`,children:[(0,m.jsx)(l,{id:`network-remoteAccess-mode`,label:`Remote access mode`,value:P,options:y,onChange:e=>{g(e)&&(D({...E,remoteAccess:{...j,mode:e}}),O(`network.remoteAccess.mode`,{value:e,original:g(A.mode)?A.mode:`off`,valid:!0}))}}),(0,m.jsxs)(`p`,{className:`settings-section-hint`,children:[(0,m.jsx)(`strong`,{children:`off`}),` — only loopback can talk to the API.`,` `,(0,m.jsx)(`strong`,{children:`http-only`}),` — remote can issue HTTP requests but no WebSocket upgrades. `,(0,m.jsx)(`strong`,{children:`full`}),` — HTTP + WebSocket open to remote (use with auth).`]}),B&&(0,m.jsxs)(d,{role:`alert`,children:[`Saving will close remote access while you're connected from`,(0,m.jsxs)(`code`,{children:[` `,typeof window<`u`?window.location.host:``,` `]}),`— you will be locked out. Reach the dashboard over loopback first.`]}),F&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(c,{id:`network-remoteAccess-trustProxies`,label:`Trust proxies`,description:`Honor proxy headers when computing the client origin.`,value:I,onChange:e=>{D({...E,remoteAccess:{...j,trustProxies:e}}),O(`network.remoteAccess.trustProxies`,{value:e,original:!!A.trustProxies,valid:!0})}}),(0,m.jsx)(c,{id:`network-remoteAccess-trustForwardedFor`,label:`Trust X-Forwarded-For`,description:`Use X-Forwarded-For for the client IP. Only enable behind a known proxy.`,value:L,onChange:e=>{D({...E,remoteAccess:{...j,trustForwardedFor:e}}),O(`network.remoteAccess.trustForwardedFor`,{value:e,original:!!A.trustForwardedFor,valid:!0})}}),L&&!I&&(0,m.jsx)(d,{children:`Trusting X-Forwarded-For without trusting the proxy chain lets any client spoof its IP. Enable "Trust proxies" too.`}),(0,m.jsx)(u,{id:`network-remoteAccess-publicOriginHint`,label:`Public origin hint`,value:R,placeholder:`https://your-tunnel-url`,error:z.kind===`invalid`?z.reason:null,onChange:e=>{D({...E,remoteAccess:{...j,publicOriginHint:e}});let t=x(e);O(`network.remoteAccess.publicOriginHint`,{value:t.kind===`valid`?t.origin:e,original:A.publicOriginHint??``,valid:t.kind!==`invalid`})}})]})]})]})}export{h as REMOTE_ACCESS_MODES,C as default,S as detectSelfLockoutRisk,g as isRemoteAccessMode,x as parsePublicOriginHint};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{i as c,n as l}from"./fields-BISouxp2.js";import{t as u}from"./InlineWarn-E64UaKFh.js";var d=e(t(),1),f=n(),p=/^[a-zA-Z0-9._:*-]+$/,m=[`bash`,`read`,`write`,`edit`,`mcp.*`];function h(e){return e===`auto`}function g(e){return h(e)?{mode:`auto`}:Array.isArray(e)?{mode:`custom`,tokens:e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e.length>0)}:{mode:`unknown`}}function _(e){return typeof e!=`string`||e.length===0||e.length>64?!1:p.test(e)}function v(e){return Array.isArray(e)&&e.length>0?Array.from(new Set(e.filter(_))):[...m]}function y(e){return e.length===0?!1:e.every(_)}var b=[{value:`auto`,label:`Auto — runtime resolves the allowlist`},{value:`custom`,label:`Custom — explicit allowlist below`}];function x({port:e,client:t,dirty:n,registerSave:p}){let{state:m,refresh:h,setData:x}=r(t,`/api/settings`),[S,C]=(0,d.useState)(`auto`),[w,T]=(0,d.useState)([]),E=(0,d.useMemo)(()=>m.kind===`ready`?g(m.data.permissions):null,[m]);(0,d.useEffect)(()=>{if(m.kind!==`ready`)return;let e=g(m.data.permissions);e.mode===`custom`?(C(`custom`),T(e.tokens)):(C(`auto`),T([]))},[m]),(0,d.useEffect)(()=>()=>{n.remove(`permissions`)},[n]);let D=(0,d.useCallback)(e=>n.set(`permissions`,e),[n]),O=(0,d.useMemo)(()=>E&&E.mode===`custom`?E.tokens:`auto`,[E]),k=(0,d.useCallback)(e=>{if(e===`auto`){C(`auto`),T([]),D({value:`auto`,original:O,valid:!0});return}if(e===`custom`){C(`custom`);let e=E&&E.mode===`custom`&&E.tokens.length>0?[...E.tokens]:v(null);T(e),D({value:e,original:O,valid:y(e)})}},[E,O,D]),A=(0,d.useCallback)(e=>{let t=e.map(e=>e.trim()).filter(e=>e.length>0);T(t),D({value:t,original:O,valid:y(t)})},[O,D]),j=(0,d.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await t.put(`/api/settings`,e),i=r&&typeof r==`object`&&`data`in r?r.data:r;n.clear();let a=g(i.permissions);a.mode===`custom`?(C(`custom`),T(a.tokens)):(C(`auto`),T([])),x(i),await h()},[t,n,h,x]);if((0,d.useEffect)(()=>{if(p)return p(j),()=>p(null)},[p,j]),m.kind===`loading`)return(0,f.jsx)(a,{});if(m.kind===`offline`)return(0,f.jsx)(o,{port:e});if(m.kind===`error`)return(0,f.jsx)(s,{message:m.message});let M=w.filter(e=>!_(e)),N=M.length>0,P=S===`custom`&&w.length===0,F=E?.mode===`custom`?`${E.tokens.length} explicit token${E.tokens.length===1?``:`s`}: ${E.tokens.join(`, `)}`:E?.mode===`auto`?`auto (runtime decides)`:`unknown shape — saved value will overwrite on next save`;return(0,f.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,f.jsxs)(i,{title:`Permissions`,hint:`Controls which capabilities the CLI can use. Auto delegates to the runtime; Custom freezes the list to your allowlist.`,children:[(0,f.jsx)(c,{id:`permissions-mode`,label:`Mode`,value:S,options:b,onChange:k}),S===`custom`&&(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(l,{id:`permissions-allowlist`,label:`Allowlist`,value:w,onChange:A,placeholder:`bash, read, mcp.*`,error:N?`Invalid token${M.length===1?``:`s`}: ${M.join(`, `)}`:P?`Allowlist cannot be empty in Custom mode.`:null}),(0,f.jsxs)(`p`,{className:`settings-section-hint`,children:[`Each chip is a permission token. Examples: `,(0,f.jsx)(`code`,{children:`bash`}),`,`,(0,f.jsx)(`code`,{children:` read`}),`, `,(0,f.jsx)(`code`,{children:` write`}),`, `,(0,f.jsx)(`code`,{children:` mcp.*`}),`.`]}),P&&(0,f.jsx)(u,{role:`alert`,children:`Saving with an empty Custom allowlist would deny every action. Add at least one token or switch back to Auto.`})]})]}),(0,f.jsx)(i,{title:`Currently active`,hint:`Reflects the saved snapshot from /api/settings.`,children:(0,f.jsxs)(`p`,{className:`settings-readonly-line`,children:[(0,f.jsx)(`span`,{className:`settings-field-label`,children:`Resolved permissions`}),(0,f.jsx)(`span`,{children:F})]})})]})}export{g as a,h as i,y as n,v as o,_ as r,x as t};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{i as c,n as l}from"./fields-DUawAHWZ.js";import{t as u}from"./InlineWarn-DoJS7AgM.js";var d=e(t(),1),f=n(),p=/^[a-zA-Z0-9._:*-]+$/,m=[`bash`,`read`,`write`,`edit`,`mcp.*`];function h(e){return e===`auto`}function g(e){return h(e)?{mode:`auto`}:Array.isArray(e)?{mode:`custom`,tokens:e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e.length>0)}:{mode:`unknown`}}function _(e){return typeof e!=`string`||e.length===0||e.length>64?!1:p.test(e)}function v(e){return Array.isArray(e)&&e.length>0?Array.from(new Set(e.filter(_))):[...m]}function y(e){return e.length===0?!1:e.every(_)}var b=[{value:`auto`,label:`Auto — runtime resolves the allowlist`},{value:`custom`,label:`Custom — explicit allowlist below`}];function x({port:e,client:t,dirty:n,registerSave:p}){let{state:m,refresh:h,setData:x}=r(t,`/api/settings`),[S,C]=(0,d.useState)(`auto`),[w,T]=(0,d.useState)([]),E=(0,d.useMemo)(()=>m.kind===`ready`?g(m.data.permissions):null,[m]);(0,d.useEffect)(()=>{if(m.kind!==`ready`)return;let e=g(m.data.permissions);e.mode===`custom`?(C(`custom`),T(e.tokens)):(C(`auto`),T([]))},[m]),(0,d.useEffect)(()=>()=>{n.remove(`permissions`)},[n]);let D=(0,d.useCallback)(e=>n.set(`permissions`,e),[n]),O=(0,d.useMemo)(()=>E&&E.mode===`custom`?E.tokens:`auto`,[E]),k=(0,d.useCallback)(e=>{if(e===`auto`){C(`auto`),T([]),D({value:`auto`,original:O,valid:!0});return}if(e===`custom`){C(`custom`);let e=E&&E.mode===`custom`&&E.tokens.length>0?[...E.tokens]:v(null);T(e),D({value:e,original:O,valid:y(e)})}},[E,O,D]),A=(0,d.useCallback)(e=>{let t=e.map(e=>e.trim()).filter(e=>e.length>0);T(t),D({value:t,original:O,valid:y(t)})},[O,D]),j=(0,d.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await t.put(`/api/settings`,e),i=r&&typeof r==`object`&&`data`in r?r.data:r;n.clear();let a=g(i.permissions);a.mode===`custom`?(C(`custom`),T(a.tokens)):(C(`auto`),T([])),x(i),await h()},[t,n,h,x]);if((0,d.useEffect)(()=>{if(p)return p(j),()=>p(null)},[p,j]),m.kind===`loading`)return(0,f.jsx)(a,{});if(m.kind===`offline`)return(0,f.jsx)(o,{port:e});if(m.kind===`error`)return(0,f.jsx)(s,{message:m.message});let M=w.filter(e=>!_(e)),N=M.length>0,P=S===`custom`&&w.length===0,F=E?.mode===`custom`?`${E.tokens.length} explicit token${E.tokens.length===1?``:`s`}: ${E.tokens.join(`, `)}`:E?.mode===`auto`?`auto (runtime decides)`:`unknown shape — saved value will overwrite on next save`;return(0,f.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,f.jsxs)(i,{title:`Permissions`,hint:`Controls which capabilities the CLI can use. Auto delegates to the runtime; Custom freezes the list to your allowlist.`,children:[(0,f.jsx)(c,{id:`permissions-mode`,label:`Mode`,value:S,options:b,onChange:k}),S===`custom`&&(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(l,{id:`permissions-allowlist`,label:`Allowlist`,value:w,onChange:A,placeholder:`bash, read, mcp.*`,error:N?`Invalid token${M.length===1?``:`s`}: ${M.join(`, `)}`:P?`Allowlist cannot be empty in Custom mode.`:null}),(0,f.jsxs)(`p`,{className:`settings-section-hint`,children:[`Each chip is a permission token. Examples: `,(0,f.jsx)(`code`,{children:`bash`}),`,`,(0,f.jsx)(`code`,{children:` read`}),`, `,(0,f.jsx)(`code`,{children:` write`}),`, `,(0,f.jsx)(`code`,{children:` mcp.*`}),`.`]}),P&&(0,f.jsx)(u,{role:`alert`,children:`Saving with an empty Custom allowlist would deny every action. Add at least one token or switch back to Auto.`})]})]}),(0,f.jsx)(i,{title:`Currently active`,hint:`Reflects the saved snapshot from /api/settings.`,children:(0,f.jsxs)(`p`,{className:`settings-readonly-line`,children:[(0,f.jsx)(`span`,{className:`settings-field-label`,children:`Resolved permissions`}),(0,f.jsx)(`span`,{children:F})]})})]})}export{g as a,h as i,y as n,v as o,_ as r,x as t};
@@ -1 +1 @@
1
- import{a as e,i as t,n,o as r,r as i,t as a}from"./Permissions-BKJ5K6EL.js";export{a as default,n as isAllowlistValid,i as isPermissionToken,t as isPermissionsAuto,e as parsePermissionsValue,r as seedAutoAllowlist};
1
+ import{a as e,i as t,n,o as r,r as i,t as a}from"./Permissions-BkADXjQ4.js";export{a as default,n as isAllowlistValid,i as isPermissionToken,t as isPermissionsAuto,e as parsePermissionsValue,r as seedAutoAllowlist};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{a as c,i as l}from"./fields-BISouxp2.js";import{t as u}from"./path-utils-DySmCVZK.js";var d=e(t(),1),f=n(),p=`image/png,image/jpeg,image/webp,image/gif`;function m({kind:e,port:t}){let[n,r]=(0,d.useState)(null),[i,a]=(0,d.useState)(!1),[o,s]=(0,d.useState)(null),c=(0,d.useRef)(null);(0,d.useEffect)(()=>{let n=!1;return s(null),r(null),fetch(`/i/${t}/api/avatar`).then(e=>e.ok?e.json():Promise.reject(Error(`avatar HTTP ${e.status}`))).then(t=>{n||r((`data`in t&&t.data?t.data:t)[e]||null)}).catch(e=>{n||s(e instanceof Error?e.message:String(e))}),()=>{n=!0}},[e,t]);let l=()=>c.current?.click(),u=async n=>{a(!0),s(null);try{let i=await n.arrayBuffer(),a=n.type||`application/octet-stream`,o=await fetch(`/i/${t}/api/avatar/${e}/upload`,{method:`POST`,headers:{"content-type":a,"x-filename":encodeURIComponent(n.name)},body:i});if(!o.ok){let e=await o.text().catch(()=>``);throw Error(`upload failed: ${o.status} ${e}`)}let s=await o.json();r(`data`in s&&s.data?s.data:s)}catch(e){s(e instanceof Error?e.message:String(e))}finally{a(!1),c.current&&(c.current.value=``)}},m=async()=>{a(!0),s(null);try{let n=await fetch(`/i/${t}/api/avatar/${e}/image`,{method:`DELETE`});if(!n.ok)throw Error(`clear failed: ${n.status}`);let i=await n.json();r(`data`in i&&i.data?i.data:i)}catch(e){s(e instanceof Error?e.message:String(e))}finally{a(!1)}},h=n&&n.kind===`image`?`/i/${t}${n.imageUrl}`:null,g=e===`agent`?`Agent avatar`:`User avatar`;return(0,f.jsxs)(`div`,{className:`settings-avatar-card`,children:[(0,f.jsx)(`div`,{className:`settings-avatar-preview`,"aria-label":`${g} preview`,children:h?(0,f.jsx)(`img`,{src:h,alt:`${g} current`}):(0,f.jsx)(`span`,{className:`settings-avatar-placeholder`,"aria-hidden":`true`,children:e===`agent`?`🦈`:`👤`})}),(0,f.jsxs)(`div`,{className:`settings-avatar-controls`,children:[(0,f.jsx)(`span`,{className:`settings-field-label`,children:g}),(0,f.jsx)(`input`,{ref:c,type:`file`,accept:p,style:{display:`none`},onChange:e=>{let t=e.target.files?.[0];t&&u(t)}}),(0,f.jsxs)(`div`,{className:`settings-avatar-buttons`,children:[(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,onClick:l,disabled:i,children:i?`Working…`:`Upload image`}),h?(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>void m(),disabled:i,children:`Clear`}):null]}),o?(0,f.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:o}):null]})]})}var h=[{value:`ko`,label:`한국어 (ko)`},{value:`en`,label:`English (en)`},{value:`ja`,label:`日本語 (ja)`},{value:`zh`,label:`中文 (zh)`}];function g({port:e,client:t,dirty:n,registerSave:p}){let{state:g,refresh:_,setData:v}=r(t,`/api/settings`),[y,b]=(0,d.useState)({});(0,d.useEffect)(()=>{g.kind===`ready`&&b(g.data)},[g]),(0,d.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`locale`||e===`showReasoning`)&&n.remove(e)},[n]);let x=(0,d.useCallback)((e,t)=>n.set(e,t),[n]),S=(0,d.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=u(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),b(a),v(a),await _()},[t,n,_,v]);if((0,d.useEffect)(()=>{if(p)return p(S),()=>p(null)},[p,S]),g.kind===`loading`)return(0,f.jsx)(a,{});if(g.kind===`offline`)return(0,f.jsx)(o,{port:e});if(g.kind===`error`)return(0,f.jsx)(s,{message:g.message});let C=g.data;return(0,f.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),S()},children:[(0,f.jsxs)(i,{title:`Profile`,hint:`Identity and display preferences for this instance.`,children:[(0,f.jsx)(l,{id:`profile-locale`,label:`Locale`,value:y.locale??C.locale??`ko`,options:h,onChange:e=>{b({...y,locale:e}),x(`locale`,{value:e,original:C.locale??`ko`,valid:!0})}}),(0,f.jsx)(c,{id:`profile-showReasoning`,label:`Show reasoning traces`,value:!!(y.showReasoning??C.showReasoning),onChange:e=>{b({...y,showReasoning:e}),x(`showReasoning`,{value:e,original:!!C.showReasoning,valid:!0})}})]}),(0,f.jsxs)(i,{title:`Avatars`,hint:`Uploads write to the instance's home folder.`,children:[(0,f.jsx)(m,{kind:`agent`,port:e}),(0,f.jsx)(m,{kind:`user`,port:e})]})]})}export{g as default};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{a as c,i as l}from"./fields-DUawAHWZ.js";import{t as u}from"./path-utils-r2bJIu28.js";var d=e(t(),1),f=n(),p=`image/png,image/jpeg,image/webp,image/gif`;function m({kind:e,port:t}){let[n,r]=(0,d.useState)(null),[i,a]=(0,d.useState)(!1),[o,s]=(0,d.useState)(null),c=(0,d.useRef)(null);(0,d.useEffect)(()=>{let n=!1;return s(null),r(null),fetch(`/i/${t}/api/avatar`).then(e=>e.ok?e.json():Promise.reject(Error(`avatar HTTP ${e.status}`))).then(t=>{n||r((`data`in t&&t.data?t.data:t)[e]||null)}).catch(e=>{n||s(e instanceof Error?e.message:String(e))}),()=>{n=!0}},[e,t]);let l=()=>c.current?.click(),u=async n=>{a(!0),s(null);try{let i=await n.arrayBuffer(),a=n.type||`application/octet-stream`,o=await fetch(`/i/${t}/api/avatar/${e}/upload`,{method:`POST`,headers:{"content-type":a,"x-filename":encodeURIComponent(n.name)},body:i});if(!o.ok){let e=await o.text().catch(()=>``);throw Error(`upload failed: ${o.status} ${e}`)}let s=await o.json();r(`data`in s&&s.data?s.data:s)}catch(e){s(e instanceof Error?e.message:String(e))}finally{a(!1),c.current&&(c.current.value=``)}},m=async()=>{a(!0),s(null);try{let n=await fetch(`/i/${t}/api/avatar/${e}/image`,{method:`DELETE`});if(!n.ok)throw Error(`clear failed: ${n.status}`);let i=await n.json();r(`data`in i&&i.data?i.data:i)}catch(e){s(e instanceof Error?e.message:String(e))}finally{a(!1)}},h=n&&n.kind===`image`?`/i/${t}${n.imageUrl}`:null,g=e===`agent`?`Agent avatar`:`User avatar`;return(0,f.jsxs)(`div`,{className:`settings-avatar-card`,children:[(0,f.jsx)(`div`,{className:`settings-avatar-preview`,"aria-label":`${g} preview`,children:h?(0,f.jsx)(`img`,{src:h,alt:`${g} current`}):(0,f.jsx)(`span`,{className:`settings-avatar-placeholder`,"aria-hidden":`true`,children:e===`agent`?`🦈`:`👤`})}),(0,f.jsxs)(`div`,{className:`settings-avatar-controls`,children:[(0,f.jsx)(`span`,{className:`settings-field-label`,children:g}),(0,f.jsx)(`input`,{ref:c,type:`file`,accept:p,style:{display:`none`},onChange:e=>{let t=e.target.files?.[0];t&&u(t)}}),(0,f.jsxs)(`div`,{className:`settings-avatar-buttons`,children:[(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,onClick:l,disabled:i,children:i?`Working…`:`Upload image`}),h?(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>void m(),disabled:i,children:`Clear`}):null]}),o?(0,f.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:o}):null]})]})}var h=[{value:`ko`,label:`한국어 (ko)`},{value:`en`,label:`English (en)`},{value:`ja`,label:`日本語 (ja)`},{value:`zh`,label:`中文 (zh)`}];function g({port:e,client:t,dirty:n,registerSave:p}){let{state:g,refresh:_,setData:v}=r(t,`/api/settings`),[y,b]=(0,d.useState)({});(0,d.useEffect)(()=>{g.kind===`ready`&&b(g.data)},[g]),(0,d.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`locale`||e===`showReasoning`)&&n.remove(e)},[n]);let x=(0,d.useCallback)((e,t)=>n.set(e,t),[n]),S=(0,d.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=u(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),b(a),v(a),await _()},[t,n,_,v]);if((0,d.useEffect)(()=>{if(p)return p(S),()=>p(null)},[p,S]),g.kind===`loading`)return(0,f.jsx)(a,{});if(g.kind===`offline`)return(0,f.jsx)(o,{port:e});if(g.kind===`error`)return(0,f.jsx)(s,{message:g.message});let C=g.data;return(0,f.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),S()},children:[(0,f.jsxs)(i,{title:`Profile`,hint:`Identity and display preferences for this instance.`,children:[(0,f.jsx)(l,{id:`profile-locale`,label:`Locale`,value:y.locale??C.locale??`ko`,options:h,onChange:e=>{b({...y,locale:e}),x(`locale`,{value:e,original:C.locale??`ko`,valid:!0})}}),(0,f.jsx)(c,{id:`profile-showReasoning`,label:`Show reasoning traces`,value:!!(y.showReasoning??C.showReasoning),onChange:e=>{b({...y,showReasoning:e}),x(`showReasoning`,{value:e,original:!!C.showReasoning,valid:!0})}})]}),(0,f.jsxs)(i,{title:`Avatars`,hint:`Uploads write to the instance's home folder.`,children:[(0,f.jsx)(m,{kind:`agent`,port:e}),(0,f.jsx)(m,{kind:`user`,port:e})]})]})}export{g as default};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{t as c}from"./InlineWarn-E64UaKFh.js";var l=e(t(),1),u=n(),d=`prompt.system`;function f(e){return`prompt.template.${e}`}function p(e){return!e||!Array.isArray(e.templates)?[]:e.templates.filter(e=>!!e&&typeof e.id==`string`&&typeof e.content==`string`)}function m(e){let t=p(e),n=e?.tree,r=[],i=new Set;if(Array.isArray(n)){for(let e of n)if(!(!e||!Array.isArray(e.children)))for(let n of e.children){if(i.has(n))continue;let a=t.find(e=>e.id===n);if(!a)continue;let o=e.emoji?`${e.emoji} ${e.label} · `:`${e.label} · `;r.push({value:a.id,label:`${o}${a.id}`}),i.add(n)}}for(let e of t)i.has(e.id)||(r.push({value:e.id,label:e.id}),i.add(e.id));return r}function h(e,t){return p(e).find(e=>e.id===t)??null}function g({port:e,client:t,dirty:n,registerSave:g}){let _=r(t,`/api/prompt`),v=r(t,`/api/prompt-templates`),[y,b]=(0,l.useState)(``),[x,S]=(0,l.useState)(null),[C,w]=(0,l.useState)(``),T=(0,l.useMemo)(()=>_.state.kind===`ready`?_.state.data?.content??``:``,[_.state]),E=(0,l.useMemo)(()=>v.state.kind===`ready`?v.state.data:null,[v.state]),D=(0,l.useMemo)(()=>m(E),[E]),O=(0,l.useRef)(new Set);(0,l.useEffect)(()=>{_.state.kind===`ready`&&b(_.state.data?.content??``)},[_.state]),(0,l.useEffect)(()=>{if(!E||x!==null)return;let e=p(E);if(e.length===0)return;let t=D[0]?.value??e[0].id;S(t),w(h(E,t)?.content??``)},[E,D,x]),(0,l.useEffect)(()=>()=>{n.remove(d);for(let e of O.current)n.remove(e)},[n]);let k=(0,l.useCallback)((e,t)=>{n.set(e,t),O.current.add(e)},[n]),A=(0,l.useCallback)(e=>{b(e),n.set(d,{value:e,original:T,valid:!0})},[n,T]),j=(0,l.useCallback)(e=>{if(!x)return;w(e);let t=h(E,x)?.content??``;k(f(x),{value:e,original:t,valid:!0})},[x,k,E]),M=(0,l.useCallback)(e=>{if(!x||e===x)return;let t=f(x);if(n.pending.get(t)&&typeof window<`u`&&!window.confirm(`You have unsaved edits to "${x}". Switching will keep them pending — Save will write all dirty templates.`))return;S(e);let r=f(e),i=n.pending.get(r),a=h(E,e)?.content??``;w(i&&typeof i.value==`string`?i.value:a)},[x,n,E]),N=(0,l.useCallback)(async()=>{let e=n.saveBundle(),r=[];d in e&&r.push(t.put(`/api/prompt`,{content:e[d]}));for(let[n,i]of Object.entries(e)){if(!n.startsWith(`prompt.template.`))continue;let e=n.slice(16);r.push(t.put(`/api/prompt-templates/${e}`,{content:i}))}if(r.length!==0){for(let e of r)await e;n.clear(),O.current.clear(),await Promise.all([_.refresh(),v.refresh()])}},[t,n,_,v]);if((0,l.useEffect)(()=>{if(g)return g(N),()=>g(null)},[g,N]),_.state.kind===`loading`||v.state.kind===`loading`)return(0,u.jsx)(a,{});if(_.state.kind===`offline`||v.state.kind===`offline`)return(0,u.jsx)(o,{port:e});if(_.state.kind===`error`)return(0,u.jsx)(s,{message:_.state.message});if(v.state.kind===`error`)return(0,u.jsx)(s,{message:v.state.message});let P=p(E),F=x?h(E,x)?.content??``:``,I=x!==null&&C!==F;return(0,u.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,u.jsxs)(i,{title:`System prompt`,hint:`The agent's a2/system prompt. Saved to a2.md; regenerates the merged b prompt.`,children:[(0,u.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`prompt-system-body`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`a2.md`}),(0,u.jsx)(`textarea`,{id:`prompt-system-body`,className:`settings-field-monospace`,value:y,rows:14,spellCheck:!1,onChange:e=>A(e.target.value)})]}),y!==T&&(0,u.jsx)(`p`,{className:`settings-section-hint`,children:`Pending edits to a2.md.`})]}),(0,u.jsx)(i,{title:`Templates`,hint:`Edit individual prompt template bodies. Saving regenerates b automatically.`,children:P.length===0?(0,u.jsx)(c,{tone:`info`,children:`No templates returned by /api/prompt-templates.`}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(`label`,{className:`settings-field settings-field-select`,htmlFor:`prompt-template-select`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Template`}),(0,u.jsx)(`select`,{id:`prompt-template-select`,value:x??``,onChange:e=>M(e.target.value),children:D.map(e=>(0,u.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,u.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`prompt-template-body`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:x?`${x}.md`:`Template body`}),(0,u.jsx)(`textarea`,{id:`prompt-template-body`,className:`settings-field-monospace`,value:C,rows:16,spellCheck:!1,disabled:!x,onChange:e=>j(e.target.value)})]}),I&&(0,u.jsxs)(`p`,{className:`settings-section-hint`,children:[`Pending edits to `,x,`.md.`]})]})})]})}export{m as buildTemplateOptions,g as default,h as findTemplate,p as flattenTemplates,f as templateDirtyKey};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{t as c}from"./InlineWarn-DoJS7AgM.js";var l=e(t(),1),u=n(),d=`prompt.system`;function f(e){return`prompt.template.${e}`}function p(e){return!e||!Array.isArray(e.templates)?[]:e.templates.filter(e=>!!e&&typeof e.id==`string`&&typeof e.content==`string`)}function m(e){let t=p(e),n=e?.tree,r=[],i=new Set;if(Array.isArray(n)){for(let e of n)if(!(!e||!Array.isArray(e.children)))for(let n of e.children){if(i.has(n))continue;let a=t.find(e=>e.id===n);if(!a)continue;let o=e.emoji?`${e.emoji} ${e.label} · `:`${e.label} · `;r.push({value:a.id,label:`${o}${a.id}`}),i.add(n)}}for(let e of t)i.has(e.id)||(r.push({value:e.id,label:e.id}),i.add(e.id));return r}function h(e,t){return p(e).find(e=>e.id===t)??null}function g({port:e,client:t,dirty:n,registerSave:g}){let _=r(t,`/api/prompt`),v=r(t,`/api/prompt-templates`),[y,b]=(0,l.useState)(``),[x,S]=(0,l.useState)(null),[C,w]=(0,l.useState)(``),T=(0,l.useMemo)(()=>_.state.kind===`ready`?_.state.data?.content??``:``,[_.state]),E=(0,l.useMemo)(()=>v.state.kind===`ready`?v.state.data:null,[v.state]),D=(0,l.useMemo)(()=>m(E),[E]),O=(0,l.useRef)(new Set);(0,l.useEffect)(()=>{_.state.kind===`ready`&&b(_.state.data?.content??``)},[_.state]),(0,l.useEffect)(()=>{if(!E||x!==null)return;let e=p(E);if(e.length===0)return;let t=D[0]?.value??e[0].id;S(t),w(h(E,t)?.content??``)},[E,D,x]),(0,l.useEffect)(()=>()=>{n.remove(d);for(let e of O.current)n.remove(e)},[n]);let k=(0,l.useCallback)((e,t)=>{n.set(e,t),O.current.add(e)},[n]),A=(0,l.useCallback)(e=>{b(e),n.set(d,{value:e,original:T,valid:!0})},[n,T]),j=(0,l.useCallback)(e=>{if(!x)return;w(e);let t=h(E,x)?.content??``;k(f(x),{value:e,original:t,valid:!0})},[x,k,E]),M=(0,l.useCallback)(e=>{if(!x||e===x)return;let t=f(x);if(n.pending.get(t)&&typeof window<`u`&&!window.confirm(`You have unsaved edits to "${x}". Switching will keep them pending — Save will write all dirty templates.`))return;S(e);let r=f(e),i=n.pending.get(r),a=h(E,e)?.content??``;w(i&&typeof i.value==`string`?i.value:a)},[x,n,E]),N=(0,l.useCallback)(async()=>{let e=n.saveBundle(),r=[];d in e&&r.push(t.put(`/api/prompt`,{content:e[d]}));for(let[n,i]of Object.entries(e)){if(!n.startsWith(`prompt.template.`))continue;let e=n.slice(16);r.push(t.put(`/api/prompt-templates/${e}`,{content:i}))}if(r.length!==0){for(let e of r)await e;n.clear(),O.current.clear(),await Promise.all([_.refresh(),v.refresh()])}},[t,n,_,v]);if((0,l.useEffect)(()=>{if(g)return g(N),()=>g(null)},[g,N]),_.state.kind===`loading`||v.state.kind===`loading`)return(0,u.jsx)(a,{});if(_.state.kind===`offline`||v.state.kind===`offline`)return(0,u.jsx)(o,{port:e});if(_.state.kind===`error`)return(0,u.jsx)(s,{message:_.state.message});if(v.state.kind===`error`)return(0,u.jsx)(s,{message:v.state.message});let P=p(E),F=x?h(E,x)?.content??``:``,I=x!==null&&C!==F;return(0,u.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,u.jsxs)(i,{title:`System prompt`,hint:`The agent's a2/system prompt. Saved to a2.md; regenerates the merged b prompt.`,children:[(0,u.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`prompt-system-body`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`a2.md`}),(0,u.jsx)(`textarea`,{id:`prompt-system-body`,className:`settings-field-monospace`,value:y,rows:14,spellCheck:!1,onChange:e=>A(e.target.value)})]}),y!==T&&(0,u.jsx)(`p`,{className:`settings-section-hint`,children:`Pending edits to a2.md.`})]}),(0,u.jsx)(i,{title:`Templates`,hint:`Edit individual prompt template bodies. Saving regenerates b automatically.`,children:P.length===0?(0,u.jsx)(c,{tone:`info`,children:`No templates returned by /api/prompt-templates.`}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(`label`,{className:`settings-field settings-field-select`,htmlFor:`prompt-template-select`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Template`}),(0,u.jsx)(`select`,{id:`prompt-template-select`,value:x??``,onChange:e=>M(e.target.value),children:D.map(e=>(0,u.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,u.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`prompt-template-body`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:x?`${x}.md`:`Template body`}),(0,u.jsx)(`textarea`,{id:`prompt-template-body`,className:`settings-field-monospace`,value:C,rows:16,spellCheck:!1,disabled:!x,onChange:e=>j(e.target.value)})]}),I&&(0,u.jsxs)(`p`,{className:`settings-section-hint`,children:[`Pending edits to `,x,`.md.`]})]})})]})}export{m as buildTemplateOptions,g as default,h as findTemplate,p as flattenTemplates,f as templateDirtyKey};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{i as c,o as l,s as u,t as d}from"./fields-BISouxp2.js";import{t as f}from"./path-utils-DySmCVZK.js";var p=e(t(),1),m=n();function h({title:e,hint:t,children:n}){return(0,m.jsxs)(`fieldset`,{className:`settings-engine-subsection`,children:[(0,m.jsx)(`legend`,{className:`settings-engine-subsection-legend`,children:e}),t?(0,m.jsx)(`p`,{className:`settings-engine-subsection-hint`,children:t}):null,(0,m.jsx)(`div`,{className:`settings-engine-subsection-body`,children:n})]})}var g=[`auto`,`gemini`,`openai`,`whisper`,`vertex`],_={auto:`Auto (try in order)`,gemini:`Gemini`,openai:`OpenAI`,whisper:`Whisper (local MLX)`,vertex:`Vertex AI`};function v(e){return e===`auto`?[`gemini`,`openai`,`whisper`,`vertex`]:[e]}function y(e){if(e.trim()===``)return{valid:!0,error:null};try{return JSON.parse(e),{valid:!0,error:null}}catch(e){return{valid:!1,error:e instanceof Error?e.message:`Invalid JSON`}}}var b=[`stt.engine`,`stt.geminiApiKey`,`stt.geminiModel`,`stt.openaiApiKey`,`stt.openaiBaseUrl`,`stt.openaiModel`,`stt.whisperModel`,`stt.vertexConfig`];function x(e){return g.includes(e)?e:`auto`}function S({port:e,client:t,dirty:n,registerSave:S}){let{state:C,refresh:w,setData:T}=r(t,`/api/settings`),[E,D]=(0,p.useState)(`auto`),[O,k]=(0,p.useState)(``),[A,j]=(0,p.useState)(``),[M,N]=(0,p.useState)(``),[P,F]=(0,p.useState)(``),[I,L]=(0,p.useState)(``),[R,z]=(0,p.useState)(``),[B,V]=(0,p.useState)(``),[H,U]=(0,p.useState)(null);(0,p.useEffect)(()=>{if(C.kind!==`ready`)return;let e=C.data.stt||{};D(x(e.engine)),k(``),j(e.geminiModel??``),N(``),F(e.openaiBaseUrl??``),L(e.openaiModel??``),z(e.whisperModel??``),V(e.vertexConfig??``),U(null)},[C]),(0,p.useEffect)(()=>()=>{for(let e of b)n.remove(e)},[n]);let W=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),G=(0,p.useMemo)(()=>C.kind===`ready`&&C.data.stt||{},[C]),K=(0,p.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=f(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),T(a);let o=a.stt||{};D(x(o.engine)),k(``),j(o.geminiModel??``),N(``),F(o.openaiBaseUrl??``),L(o.openaiModel??``),z(o.whisperModel??``),V(o.vertexConfig??``),U(null),await w()},[t,n,w,T]);if((0,p.useEffect)(()=>{if(S)return S(K),()=>S(null)},[S,K]),C.kind===`loading`)return(0,m.jsx)(a,{});if(C.kind===`offline`)return(0,m.jsx)(o,{port:e});if(C.kind===`error`)return(0,m.jsx)(s,{message:C.message});let q=v(E),J=q.includes(`gemini`),Y=q.includes(`openai`),X=q.includes(`whisper`),Z=q.includes(`vertex`),Q=G.geminiKeySet?`••••••••${G.geminiKeyLast4??``}`:`(empty)`,$=G.openaiKeySet?`••••••••${G.openaiKeyLast4??``}`:`(empty)`;return(0,m.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),K()},children:[(0,m.jsx)(i,{title:`Engine`,hint:`Pick a single engine, or 'auto' to fall back through the ladder.`,children:(0,m.jsx)(c,{id:`stt-engine`,label:`Speech-to-text engine`,value:E,options:g.map(e=>({value:e,label:_[e]})),onChange:e=>{let t=x(e);D(t),W(`stt.engine`,{value:t,original:x(G.engine),valid:!0})}})}),J?(0,m.jsx)(i,{title:`Gemini`,hint:`Google AI Studio key. Used by the Gemini transcription path.`,children:(0,m.jsxs)(h,{title:`Credentials`,children:[(0,m.jsx)(l,{id:`stt-gemini-key`,label:`API key`,value:O,placeholder:Q,onChange:e=>{if(k(e),e.length===0){n.remove(`stt.geminiApiKey`);return}W(`stt.geminiApiKey`,{value:e,original:``,valid:!0})}}),(0,m.jsx)(u,{id:`stt-gemini-model`,label:`Model`,value:A,placeholder:`gemini-2.5-flash-lite`,onChange:e=>{j(e),W(`stt.geminiModel`,{value:e,original:G.geminiModel??``,valid:!0})}})]})}):null,Y?(0,m.jsx)(i,{title:`OpenAI`,hint:`Compatible with OpenAI-style transcription endpoints (incl. self-hosted).`,children:(0,m.jsxs)(h,{title:`Credentials`,children:[(0,m.jsx)(l,{id:`stt-openai-key`,label:`API key`,value:M,placeholder:$,onChange:e=>{if(N(e),e.length===0){n.remove(`stt.openaiApiKey`);return}W(`stt.openaiApiKey`,{value:e,original:``,valid:!0})}}),(0,m.jsx)(u,{id:`stt-openai-base-url`,label:`Base URL (optional)`,value:P,placeholder:`https://api.openai.com/v1`,onChange:e=>{F(e),W(`stt.openaiBaseUrl`,{value:e,original:G.openaiBaseUrl??``,valid:!0})}}),(0,m.jsx)(u,{id:`stt-openai-model`,label:`Model`,value:I,placeholder:`whisper-1`,onChange:e=>{L(e),W(`stt.openaiModel`,{value:e,original:G.openaiModel??``,valid:!0})}})]})}):null,X?(0,m.jsx)(i,{title:`Whisper (local MLX)`,hint:`Runs on-device via mlx-whisper. No API key required.`,children:(0,m.jsx)(h,{title:`Model`,children:(0,m.jsx)(u,{id:`stt-whisper-model`,label:`Model identifier`,value:R,placeholder:`mlx-community/whisper-large-v3-mlx`,onChange:e=>{z(e),W(`stt.whisperModel`,{value:e,original:G.whisperModel??``,valid:!0})}})})}):null,Z?(0,m.jsx)(i,{title:`Vertex AI`,hint:`Service-account credentials JSON for Google Cloud Vertex transcription.`,children:(0,m.jsxs)(h,{title:`Service account`,hint:`Paste the service-account credentials JSON. Treated as a secret — invalid JSON refuses to save.`,children:[(0,m.jsx)(d,{id:`stt-vertex-config`,label:`Credentials JSON`,value:B,onChange:(e,t)=>{let n=typeof e==`string`?e:e==null?``:JSON.stringify(e);V(n);let r=y(n);U(t?null:r.error),W(`stt.vertexConfig`,{value:n,original:G.vertexConfig??``,valid:t&&r.valid})}}),H?(0,m.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:H}):null]})}):null,(0,m.jsx)(i,{title:`Probe`,hint:`A live mic-test isn't available yet — verify by triggering speech-to-text from the active channel.`,children:(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`No backend self-test endpoint is exposed for speech today; this lands as a Phase 9 polish.`})})]})}export{g as STT_ENGINES,S as default,v as revealsForEngine,y as validateVertexConfig};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CVAobxbP.js";import{i as c,o as l,s as u,t as d}from"./fields-DUawAHWZ.js";import{t as f}from"./path-utils-r2bJIu28.js";var p=e(t(),1),m=n();function h({title:e,hint:t,children:n}){return(0,m.jsxs)(`fieldset`,{className:`settings-engine-subsection`,children:[(0,m.jsx)(`legend`,{className:`settings-engine-subsection-legend`,children:e}),t?(0,m.jsx)(`p`,{className:`settings-engine-subsection-hint`,children:t}):null,(0,m.jsx)(`div`,{className:`settings-engine-subsection-body`,children:n})]})}var g=[`auto`,`gemini`,`openai`,`whisper`,`vertex`],_={auto:`Auto (try in order)`,gemini:`Gemini`,openai:`OpenAI`,whisper:`Whisper (local MLX)`,vertex:`Vertex AI`};function v(e){return e===`auto`?[`gemini`,`openai`,`whisper`,`vertex`]:[e]}function y(e){if(e.trim()===``)return{valid:!0,error:null};try{return JSON.parse(e),{valid:!0,error:null}}catch(e){return{valid:!1,error:e instanceof Error?e.message:`Invalid JSON`}}}var b=[`stt.engine`,`stt.geminiApiKey`,`stt.geminiModel`,`stt.openaiApiKey`,`stt.openaiBaseUrl`,`stt.openaiModel`,`stt.whisperModel`,`stt.vertexConfig`];function x(e){return g.includes(e)?e:`auto`}function S({port:e,client:t,dirty:n,registerSave:S}){let{state:C,refresh:w,setData:T}=r(t,`/api/settings`),[E,D]=(0,p.useState)(`auto`),[O,k]=(0,p.useState)(``),[A,j]=(0,p.useState)(``),[M,N]=(0,p.useState)(``),[P,F]=(0,p.useState)(``),[I,L]=(0,p.useState)(``),[R,z]=(0,p.useState)(``),[B,V]=(0,p.useState)(``),[H,U]=(0,p.useState)(null);(0,p.useEffect)(()=>{if(C.kind!==`ready`)return;let e=C.data.stt||{};D(x(e.engine)),k(``),j(e.geminiModel??``),N(``),F(e.openaiBaseUrl??``),L(e.openaiModel??``),z(e.whisperModel??``),V(e.vertexConfig??``),U(null)},[C]),(0,p.useEffect)(()=>()=>{for(let e of b)n.remove(e)},[n]);let W=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),G=(0,p.useMemo)(()=>C.kind===`ready`&&C.data.stt||{},[C]),K=(0,p.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=f(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),T(a);let o=a.stt||{};D(x(o.engine)),k(``),j(o.geminiModel??``),N(``),F(o.openaiBaseUrl??``),L(o.openaiModel??``),z(o.whisperModel??``),V(o.vertexConfig??``),U(null),await w()},[t,n,w,T]);if((0,p.useEffect)(()=>{if(S)return S(K),()=>S(null)},[S,K]),C.kind===`loading`)return(0,m.jsx)(a,{});if(C.kind===`offline`)return(0,m.jsx)(o,{port:e});if(C.kind===`error`)return(0,m.jsx)(s,{message:C.message});let q=v(E),J=q.includes(`gemini`),Y=q.includes(`openai`),X=q.includes(`whisper`),Z=q.includes(`vertex`),Q=G.geminiKeySet?`••••••••${G.geminiKeyLast4??``}`:`(empty)`,$=G.openaiKeySet?`••••••••${G.openaiKeyLast4??``}`:`(empty)`;return(0,m.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),K()},children:[(0,m.jsx)(i,{title:`Engine`,hint:`Pick a single engine, or 'auto' to fall back through the ladder.`,children:(0,m.jsx)(c,{id:`stt-engine`,label:`Speech-to-text engine`,value:E,options:g.map(e=>({value:e,label:_[e]})),onChange:e=>{let t=x(e);D(t),W(`stt.engine`,{value:t,original:x(G.engine),valid:!0})}})}),J?(0,m.jsx)(i,{title:`Gemini`,hint:`Google AI Studio key. Used by the Gemini transcription path.`,children:(0,m.jsxs)(h,{title:`Credentials`,children:[(0,m.jsx)(l,{id:`stt-gemini-key`,label:`API key`,value:O,placeholder:Q,onChange:e=>{if(k(e),e.length===0){n.remove(`stt.geminiApiKey`);return}W(`stt.geminiApiKey`,{value:e,original:``,valid:!0})}}),(0,m.jsx)(u,{id:`stt-gemini-model`,label:`Model`,value:A,placeholder:`gemini-2.5-flash-lite`,onChange:e=>{j(e),W(`stt.geminiModel`,{value:e,original:G.geminiModel??``,valid:!0})}})]})}):null,Y?(0,m.jsx)(i,{title:`OpenAI`,hint:`Compatible with OpenAI-style transcription endpoints (incl. self-hosted).`,children:(0,m.jsxs)(h,{title:`Credentials`,children:[(0,m.jsx)(l,{id:`stt-openai-key`,label:`API key`,value:M,placeholder:$,onChange:e=>{if(N(e),e.length===0){n.remove(`stt.openaiApiKey`);return}W(`stt.openaiApiKey`,{value:e,original:``,valid:!0})}}),(0,m.jsx)(u,{id:`stt-openai-base-url`,label:`Base URL (optional)`,value:P,placeholder:`https://api.openai.com/v1`,onChange:e=>{F(e),W(`stt.openaiBaseUrl`,{value:e,original:G.openaiBaseUrl??``,valid:!0})}}),(0,m.jsx)(u,{id:`stt-openai-model`,label:`Model`,value:I,placeholder:`whisper-1`,onChange:e=>{L(e),W(`stt.openaiModel`,{value:e,original:G.openaiModel??``,valid:!0})}})]})}):null,X?(0,m.jsx)(i,{title:`Whisper (local MLX)`,hint:`Runs on-device via mlx-whisper. No API key required.`,children:(0,m.jsx)(h,{title:`Model`,children:(0,m.jsx)(u,{id:`stt-whisper-model`,label:`Model identifier`,value:R,placeholder:`mlx-community/whisper-large-v3-mlx`,onChange:e=>{z(e),W(`stt.whisperModel`,{value:e,original:G.whisperModel??``,valid:!0})}})})}):null,Z?(0,m.jsx)(i,{title:`Vertex AI`,hint:`Service-account credentials JSON for Google Cloud Vertex transcription.`,children:(0,m.jsxs)(h,{title:`Service account`,hint:`Paste the service-account credentials JSON. Treated as a secret — invalid JSON refuses to save.`,children:[(0,m.jsx)(d,{id:`stt-vertex-config`,label:`Credentials JSON`,value:B,onChange:(e,t)=>{let n=typeof e==`string`?e:e==null?``:JSON.stringify(e);V(n);let r=y(n);U(t?null:r.error),W(`stt.vertexConfig`,{value:n,original:G.vertexConfig??``,valid:t&&r.valid})}}),H?(0,m.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:H}):null]})}):null,(0,m.jsx)(i,{title:`Probe`,hint:`A live mic-test isn't available yet — verify by triggering speech-to-text from the active channel.`,children:(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`No backend self-test endpoint is exposed for speech today; this lands as a Phase 9 polish.`})})]})}export{g as STT_ENGINES,S as default,v as revealsForEngine,y as validateVertexConfig};
@@ -0,0 +1 @@
1
+ var e=[`claude`,`codex`,`gemini`],t={"ai-e":{label:`AI-E`,defaultProvider:`claude`,providers:[`claude`,`codex`,`gemini`,`grok`,`copilot`],models:[`opus`,`sonnet`,`haiku`,`gpt-5.4`,`gpt-5.4-mini`,`gemini-3-flash-preview`,`grok-build`,`gpt-5-mini`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`],modelsByProvider:{claude:[`opus`,`sonnet`,`haiku`],codex:[`gpt-5.4`,`gpt-5.4-mini`],gemini:[`gemini-3-flash-preview`],grok:[`grok-build`],copilot:[`gpt-5-mini`]},effortsByProvider:{claude:[`low`,`medium`,`high`,`xhigh`,`max`],codex:[`low`,`medium`,`high`,`xhigh`],gemini:[],grok:[],copilot:[`low`,`medium`,`high`]}},claude:{label:`Claude`,models:[`opus`,`sonnet`,`sonnet[1m]`,`haiku`,`claude-opus-4-7`,`claude-opus-4-7[1m]`,`claude-opus-4-6`,`claude-opus-4-6[1m]`,`claude-sonnet-4-6`,`claude-sonnet-4-6[1m]`,`claude-haiku-4-5`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`]},"claude-e":{label:`Claude E`,models:[`opus`,`sonnet`,`haiku`,`claude-opus-4-7`,`claude-sonnet-4-6`,`claude-haiku-4-5`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`]},codex:{label:`Codex`,models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gpt-5.3-codex`],efforts:[`low`,`medium`,`high`,`xhigh`]},"codex-app":{label:`Codex App`,models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gpt-5.3-codex`],efforts:[`low`,`medium`,`high`,`xhigh`]},gemini:{label:`Gemini`,models:[`gemini-3-pro-preview`,`gemini-2.5-pro`,`gemini-3-flash-preview`],efforts:[]},grok:{label:`Grok`,models:[`grok-build`],efforts:[],effortNote:`unsupported by grok-build; do not pass --effort`},opencode:{label:`OpenCode`,models:[`opencode-go/kimi-k2.6`,`opencode-go/glm-5.1`],efforts:[`minimal`,`low`,`high`,`max`]},copilot:{label:`Copilot`,models:[`gpt-5.5`,`claude-opus-4.7`,`claude-sonnet-4.6`,`gpt-5.4`],efforts:[`low`,`medium`,`high`]}};function n(e){return t[e]||{label:e,models:[],efforts:[]}}function r(e,t={},n={}){return n[e]?.model||t[e]?.model||``}function i(e,t={},n={}){return n[e]?.effort||t[e]?.effort||``}function a(e,t=``){let n=new Set;t&&n.add(t);for(let t of e)n.add(t);return Array.from(n).map(e=>({value:e,label:e}))}export{r as a,i,n,a as r,e as t};