cli-jaw 2.0.1 → 2.0.2

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 (607) hide show
  1. package/README.ko.md +3 -2
  2. package/README.md +41 -12
  3. package/dist/bin/_http-client.js +34 -0
  4. package/dist/bin/_http-client.js.map +1 -0
  5. package/dist/bin/cli-jaw.js +10 -5
  6. package/dist/bin/cli-jaw.js.map +1 -1
  7. package/dist/bin/commands/browser-web-ai.js +155 -38
  8. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  9. package/dist/bin/commands/browser.js +265 -37
  10. package/dist/bin/commands/browser.js.map +1 -1
  11. package/dist/bin/commands/chat.js +18 -14
  12. package/dist/bin/commands/chat.js.map +1 -1
  13. package/dist/bin/commands/clone.js +3 -2
  14. package/dist/bin/commands/clone.js.map +1 -1
  15. package/dist/bin/commands/dashboard.js +22 -18
  16. package/dist/bin/commands/dashboard.js.map +1 -1
  17. package/dist/bin/commands/dispatch.js +9 -11
  18. package/dist/bin/commands/dispatch.js.map +1 -1
  19. package/dist/bin/commands/doctor.js +26 -14
  20. package/dist/bin/commands/doctor.js.map +1 -1
  21. package/dist/bin/commands/employee.js +12 -7
  22. package/dist/bin/commands/employee.js.map +1 -1
  23. package/dist/bin/commands/init.js +9 -9
  24. package/dist/bin/commands/init.js.map +1 -1
  25. package/dist/bin/commands/launchd.js +17 -7
  26. package/dist/bin/commands/launchd.js.map +1 -1
  27. package/dist/bin/commands/mcp.js +7 -4
  28. package/dist/bin/commands/mcp.js.map +1 -1
  29. package/dist/bin/commands/memory.js +7 -5
  30. package/dist/bin/commands/memory.js.map +1 -1
  31. package/dist/bin/commands/orchestrate.js +6 -3
  32. package/dist/bin/commands/orchestrate.js.map +1 -1
  33. package/dist/bin/commands/reset.js +4 -3
  34. package/dist/bin/commands/reset.js.map +1 -1
  35. package/dist/bin/commands/serve.js +3 -2
  36. package/dist/bin/commands/serve.js.map +1 -1
  37. package/dist/bin/commands/service.js +2 -2
  38. package/dist/bin/commands/service.js.map +1 -1
  39. package/dist/bin/commands/status.js +10 -9
  40. package/dist/bin/commands/status.js.map +1 -1
  41. package/dist/bin/commands/tui/api.js +26 -18
  42. package/dist/bin/commands/tui/api.js.map +1 -1
  43. package/dist/bin/commands/tui/overlays.js +3 -1
  44. package/dist/bin/commands/tui/overlays.js.map +1 -1
  45. package/dist/bin/commands/tui/simple-mode.js +1 -1
  46. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  47. package/dist/bin/commands/tui/types.js.map +1 -1
  48. package/dist/bin/postinstall.js +153 -65
  49. package/dist/bin/postinstall.js.map +1 -1
  50. package/dist/bin/star-prompt.js +4 -3
  51. package/dist/bin/star-prompt.js.map +1 -1
  52. package/dist/lib/mcp/format-converters.js +15 -10
  53. package/dist/lib/mcp/format-converters.js.map +1 -1
  54. package/dist/lib/mcp/mcp-install.js +2 -2
  55. package/dist/lib/mcp/mcp-install.js.map +1 -1
  56. package/dist/lib/mcp/skills-distribution.js +2 -2
  57. package/dist/lib/mcp/skills-distribution.js.map +1 -1
  58. package/dist/lib/mcp/skills-reset.js +5 -4
  59. package/dist/lib/mcp/skills-reset.js.map +1 -1
  60. package/dist/lib/mcp/skills-symlinks.js +9 -9
  61. package/dist/lib/mcp/skills-symlinks.js.map +1 -1
  62. package/dist/lib/mcp/skills-utils.js +5 -4
  63. package/dist/lib/mcp/skills-utils.js.map +1 -1
  64. package/dist/lib/mcp/unified-config.js +3 -2
  65. package/dist/lib/mcp/unified-config.js.map +1 -1
  66. package/dist/lib/mime-detect.js +65 -0
  67. package/dist/lib/mime-detect.js.map +1 -0
  68. package/dist/lib/quota-copilot.js +12 -10
  69. package/dist/lib/quota-copilot.js.map +1 -1
  70. package/dist/lib/stt.js +3 -3
  71. package/dist/lib/stt.js.map +1 -1
  72. package/dist/lib/upload.js +14 -5
  73. package/dist/lib/upload.js.map +1 -1
  74. package/dist/scripts/i18n-registry.js +4 -4
  75. package/dist/scripts/i18n-registry.js.map +1 -1
  76. package/dist/server.js +61 -57
  77. package/dist/server.js.map +1 -1
  78. package/dist/src/agent/alert-escalation.js +61 -0
  79. package/dist/src/agent/alert-escalation.js.map +1 -0
  80. package/dist/src/agent/args.js +71 -2
  81. package/dist/src/agent/args.js.map +1 -1
  82. package/dist/src/agent/error-classifier.js +9 -4
  83. package/dist/src/agent/error-classifier.js.map +1 -1
  84. package/dist/src/agent/events.js +130 -101
  85. package/dist/src/agent/events.js.map +1 -1
  86. package/dist/src/agent/lifecycle-handler.js +44 -19
  87. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  88. package/dist/src/agent/live-run-state.js +7 -3
  89. package/dist/src/agent/live-run-state.js.map +1 -1
  90. package/dist/src/agent/memory-flush-controller.js +6 -4
  91. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  92. package/dist/src/agent/opencode-diagnostics.js +7 -6
  93. package/dist/src/agent/opencode-diagnostics.js.map +1 -1
  94. package/dist/src/agent/session-persistence.js +1 -1
  95. package/dist/src/agent/session-persistence.js.map +1 -1
  96. package/dist/src/agent/spawn-env.js +33 -16
  97. package/dist/src/agent/spawn-env.js.map +1 -1
  98. package/dist/src/agent/spawn.js +176 -110
  99. package/dist/src/agent/spawn.js.map +1 -1
  100. package/dist/src/agent/watchdog.js +56 -0
  101. package/dist/src/agent/watchdog.js.map +1 -0
  102. package/dist/src/browser/actions.js +179 -70
  103. package/dist/src/browser/actions.js.map +1 -1
  104. package/dist/src/browser/connection.js +296 -19
  105. package/dist/src/browser/connection.js.map +1 -1
  106. package/dist/src/browser/index.js +4 -1
  107. package/dist/src/browser/index.js.map +1 -1
  108. package/dist/src/browser/launch-policy.js +1 -1
  109. package/dist/src/browser/launch-policy.js.map +1 -1
  110. package/dist/src/browser/primitives.js +11 -7
  111. package/dist/src/browser/primitives.js.map +1 -1
  112. package/dist/src/browser/runtime-diagnostics.js +45 -0
  113. package/dist/src/browser/runtime-diagnostics.js.map +1 -0
  114. package/dist/src/browser/runtime-orphans.js +127 -0
  115. package/dist/src/browser/runtime-orphans.js.map +1 -0
  116. package/dist/src/browser/runtime-owner-store.js +51 -0
  117. package/dist/src/browser/runtime-owner-store.js.map +1 -0
  118. package/dist/src/browser/runtime-owner.js +2 -2
  119. package/dist/src/browser/runtime-owner.js.map +1 -1
  120. package/dist/src/browser/tab-lifecycle.js +157 -0
  121. package/dist/src/browser/tab-lifecycle.js.map +1 -0
  122. package/dist/src/browser/vision.js +35 -11
  123. package/dist/src/browser/vision.js.map +1 -1
  124. package/dist/src/browser/web-ai/action-breadth.js +56 -0
  125. package/dist/src/browser/web-ai/action-breadth.js.map +1 -0
  126. package/dist/src/browser/web-ai/action-cache.js +9 -8
  127. package/dist/src/browser/web-ai/action-cache.js.map +1 -1
  128. package/dist/src/browser/web-ai/action-intent.js +64 -0
  129. package/dist/src/browser/web-ai/action-intent.js.map +1 -0
  130. package/dist/src/browser/web-ai/action-memory.js +82 -0
  131. package/dist/src/browser/web-ai/action-memory.js.map +1 -0
  132. package/dist/src/browser/web-ai/action-trace.js +11 -6
  133. package/dist/src/browser/web-ai/action-trace.js.map +1 -1
  134. package/dist/src/browser/web-ai/annotated-screenshot.js +2 -1
  135. package/dist/src/browser/web-ai/annotated-screenshot.js.map +1 -1
  136. package/dist/src/browser/web-ai/answer-artifact.js +97 -0
  137. package/dist/src/browser/web-ai/answer-artifact.js.map +1 -0
  138. package/dist/src/browser/web-ai/ax-snapshot.js +3 -2
  139. package/dist/src/browser/web-ai/ax-snapshot.js.map +1 -1
  140. package/dist/src/browser/web-ai/browser-primitives.js +10 -7
  141. package/dist/src/browser/web-ai/browser-primitives.js.map +1 -1
  142. package/dist/src/browser/web-ai/capability-registry.js +1 -1
  143. package/dist/src/browser/web-ai/capability-registry.js.map +1 -1
  144. package/dist/src/browser/web-ai/chatgpt-composer.js +12 -12
  145. package/dist/src/browser/web-ai/chatgpt-composer.js.map +1 -1
  146. package/dist/src/browser/web-ai/chatgpt-model.js +469 -50
  147. package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
  148. package/dist/src/browser/web-ai/chatgpt-response.js +82 -10
  149. package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
  150. package/dist/src/browser/web-ai/chatgpt.js +325 -49
  151. package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
  152. package/dist/src/browser/web-ai/churn-log.js +1 -1
  153. package/dist/src/browser/web-ai/churn-log.js.map +1 -1
  154. package/dist/src/browser/web-ai/cli-sessions.js +42 -26
  155. package/dist/src/browser/web-ai/cli-sessions.js.map +1 -1
  156. package/dist/src/browser/web-ai/context-pack/builder.js +1 -1
  157. package/dist/src/browser/web-ai/context-pack/builder.js.map +1 -1
  158. package/dist/src/browser/web-ai/context-pack/file-selector.js +2 -2
  159. package/dist/src/browser/web-ai/context-pack/file-selector.js.map +1 -1
  160. package/dist/src/browser/web-ai/context-pack/report.js +1 -1
  161. package/dist/src/browser/web-ai/context-pack/report.js.map +1 -1
  162. package/dist/src/browser/web-ai/copy-markdown.js +25 -5
  163. package/dist/src/browser/web-ai/copy-markdown.js.map +1 -1
  164. package/dist/src/browser/web-ai/diagnostics.js +17 -14
  165. package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
  166. package/dist/src/browser/web-ai/doctor.js +10 -6
  167. package/dist/src/browser/web-ai/doctor.js.map +1 -1
  168. package/dist/src/browser/web-ai/dom-hash.js.map +1 -1
  169. package/dist/src/browser/web-ai/errors.js +5 -22
  170. package/dist/src/browser/web-ai/errors.js.map +1 -1
  171. package/dist/src/browser/web-ai/gemini-live.js +7 -6
  172. package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
  173. package/dist/src/browser/web-ai/grok-live.js +9 -5
  174. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  175. package/dist/src/browser/web-ai/index.js +5 -0
  176. package/dist/src/browser/web-ai/index.js.map +1 -1
  177. package/dist/src/browser/web-ai/observation-bundle.js +90 -0
  178. package/dist/src/browser/web-ai/observation-bundle.js.map +1 -0
  179. package/dist/src/browser/web-ai/observe-actions.js +186 -0
  180. package/dist/src/browser/web-ai/observe-actions.js.map +1 -0
  181. package/dist/src/browser/web-ai/observe-targets.js +6 -1
  182. package/dist/src/browser/web-ai/observe-targets.js.map +1 -1
  183. package/dist/src/browser/web-ai/planner-contract.js +18 -0
  184. package/dist/src/browser/web-ai/planner-contract.js.map +1 -0
  185. package/dist/src/browser/web-ai/post-action-assert.js +8 -7
  186. package/dist/src/browser/web-ai/post-action-assert.js.map +1 -1
  187. package/dist/src/browser/web-ai/product-surfaces.js +2 -1
  188. package/dist/src/browser/web-ai/product-surfaces.js.map +1 -1
  189. package/dist/src/browser/web-ai/provider-adapter.js.map +1 -1
  190. package/dist/src/browser/web-ai/question.js +14 -7
  191. package/dist/src/browser/web-ai/question.js.map +1 -1
  192. package/dist/src/browser/web-ai/ref-registry.js.map +1 -1
  193. package/dist/src/browser/web-ai/self-heal.js +20 -14
  194. package/dist/src/browser/web-ai/self-heal.js.map +1 -1
  195. package/dist/src/browser/web-ai/session-store.js +61 -1
  196. package/dist/src/browser/web-ai/session-store.js.map +1 -1
  197. package/dist/src/browser/web-ai/session.js +43 -2
  198. package/dist/src/browser/web-ai/session.js.map +1 -1
  199. package/dist/src/browser/web-ai/source-audit.js +116 -0
  200. package/dist/src/browser/web-ai/source-audit.js.map +1 -0
  201. package/dist/src/browser/web-ai/tab-finalizer.js +18 -0
  202. package/dist/src/browser/web-ai/tab-finalizer.js.map +1 -0
  203. package/dist/src/browser/web-ai/tab-lease-store.js +390 -0
  204. package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -0
  205. package/dist/src/browser/web-ai/tab-pool.js +44 -0
  206. package/dist/src/browser/web-ai/tab-pool.js.map +1 -0
  207. package/dist/src/browser/web-ai/target-resolver.js +31 -0
  208. package/dist/src/browser/web-ai/target-resolver.js.map +1 -0
  209. package/dist/src/browser/web-ai/trace-persistence.js +4 -2
  210. package/dist/src/browser/web-ai/trace-persistence.js.map +1 -1
  211. package/dist/src/browser/web-ai/vendor-editor-contract.js.map +1 -1
  212. package/dist/src/browser/web-ai/watcher.js +8 -7
  213. package/dist/src/browser/web-ai/watcher.js.map +1 -1
  214. package/dist/src/cli/acp-client.js +40 -26
  215. package/dist/src/cli/acp-client.js.map +1 -1
  216. package/dist/src/cli/command-context.js +3 -3
  217. package/dist/src/cli/command-context.js.map +1 -1
  218. package/dist/src/cli/commands.js +25 -16
  219. package/dist/src/cli/commands.js.map +1 -1
  220. package/dist/src/cli/compact.js.map +1 -1
  221. package/dist/src/cli/handlers-completions.js +6 -4
  222. package/dist/src/cli/handlers-completions.js.map +1 -1
  223. package/dist/src/cli/handlers-runtime.js +45 -38
  224. package/dist/src/cli/handlers-runtime.js.map +1 -1
  225. package/dist/src/cli/handlers.js +44 -36
  226. package/dist/src/cli/handlers.js.map +1 -1
  227. package/dist/src/cli/readiness.js +3 -1
  228. package/dist/src/cli/readiness.js.map +1 -1
  229. package/dist/src/cli/registry.js +1 -1
  230. package/dist/src/cli/registry.js.map +1 -1
  231. package/dist/src/cli/tui/overlay.js +4 -1
  232. package/dist/src/cli/tui/overlay.js.map +1 -1
  233. package/dist/src/cli/types.js +4 -0
  234. package/dist/src/cli/types.js.map +1 -0
  235. package/dist/src/command-contract/catalog.js +1 -1
  236. package/dist/src/command-contract/catalog.js.map +1 -1
  237. package/dist/src/command-contract/help-renderer.js +1 -1
  238. package/dist/src/command-contract/help-renderer.js.map +1 -1
  239. package/dist/src/core/browser-open-default.js +13 -0
  240. package/dist/src/core/browser-open-default.js.map +1 -0
  241. package/dist/src/core/browser-open.js +41 -0
  242. package/dist/src/core/browser-open.js.map +1 -0
  243. package/dist/src/core/bus.js +13 -2
  244. package/dist/src/core/bus.js.map +1 -1
  245. package/dist/src/core/compact.js +5 -4
  246. package/dist/src/core/compact.js.map +1 -1
  247. package/dist/src/core/config.js +51 -52
  248. package/dist/src/core/config.js.map +1 -1
  249. package/dist/src/core/db.js +48 -6
  250. package/dist/src/core/db.js.map +1 -1
  251. package/dist/src/core/employees.js +9 -8
  252. package/dist/src/core/employees.js.map +1 -1
  253. package/dist/src/core/instance.js +7 -6
  254. package/dist/src/core/instance.js.map +1 -1
  255. package/dist/src/core/logger.js +1 -1
  256. package/dist/src/core/logger.js.map +1 -1
  257. package/dist/src/core/main-session.js +7 -7
  258. package/dist/src/core/main-session.js.map +1 -1
  259. package/dist/src/core/path-expand.js +10 -0
  260. package/dist/src/core/path-expand.js.map +1 -0
  261. package/dist/src/core/runtime-path.js +1 -1
  262. package/dist/src/core/runtime-path.js.map +1 -1
  263. package/dist/src/core/runtime-settings.js +13 -13
  264. package/dist/src/core/runtime-settings.js.map +1 -1
  265. package/dist/src/core/settings-merge.js +14 -14
  266. package/dist/src/core/settings-merge.js.map +1 -1
  267. package/dist/src/core/strip-undefined.js +13 -0
  268. package/dist/src/core/strip-undefined.js.map +1 -0
  269. package/dist/src/core/tcc.js +1 -1
  270. package/dist/src/core/tcc.js.map +1 -1
  271. package/dist/src/discord/bot.js +19 -18
  272. package/dist/src/discord/bot.js.map +1 -1
  273. package/dist/src/discord/channel-types.js +14 -0
  274. package/dist/src/discord/channel-types.js.map +1 -0
  275. package/dist/src/discord/commands.js +7 -6
  276. package/dist/src/discord/commands.js.map +1 -1
  277. package/dist/src/discord/discord-file.js.map +1 -1
  278. package/dist/src/discord/forwarder.js +3 -3
  279. package/dist/src/discord/forwarder.js.map +1 -1
  280. package/dist/src/http/error-middleware.js +3 -3
  281. package/dist/src/http/error-middleware.js.map +1 -1
  282. package/dist/src/http/response.js +2 -2
  283. package/dist/src/http/response.js.map +1 -1
  284. package/dist/src/ide/diff.js +7 -7
  285. package/dist/src/ide/diff.js.map +1 -1
  286. package/dist/src/manager/board/routes.js +28 -27
  287. package/dist/src/manager/board/routes.js.map +1 -1
  288. package/dist/src/manager/dashboard-home.js +3 -5
  289. package/dist/src/manager/dashboard-home.js.map +1 -1
  290. package/dist/src/manager/dashboard-service.js +2 -2
  291. package/dist/src/manager/dashboard-service.js.map +1 -1
  292. package/dist/src/manager/health-history.js +10 -9
  293. package/dist/src/manager/health-history.js.map +1 -1
  294. package/dist/src/manager/launchd-service.js +2 -2
  295. package/dist/src/manager/launchd-service.js.map +1 -1
  296. package/dist/src/manager/lifecycle-helpers.js +7 -6
  297. package/dist/src/manager/lifecycle-helpers.js.map +1 -1
  298. package/dist/src/manager/lifecycle.js +7 -6
  299. package/dist/src/manager/lifecycle.js.map +1 -1
  300. package/dist/src/manager/logs.js +18 -18
  301. package/dist/src/manager/logs.js.map +1 -1
  302. package/dist/src/manager/metadata.js +10 -2
  303. package/dist/src/manager/metadata.js.map +1 -1
  304. package/dist/src/manager/notes/assets.js +216 -0
  305. package/dist/src/manager/notes/assets.js.map +1 -0
  306. package/dist/src/manager/notes/capabilities.js +56 -0
  307. package/dist/src/manager/notes/capabilities.js.map +1 -0
  308. package/dist/src/manager/notes/constants.js +11 -0
  309. package/dist/src/manager/notes/constants.js.map +1 -0
  310. package/dist/src/manager/notes/frontmatter.js +120 -0
  311. package/dist/src/manager/notes/frontmatter.js.map +1 -0
  312. package/dist/src/manager/notes/link-resolver.js +96 -0
  313. package/dist/src/manager/notes/link-resolver.js.map +1 -0
  314. package/dist/src/manager/notes/path-guards.js +4 -0
  315. package/dist/src/manager/notes/path-guards.js.map +1 -1
  316. package/dist/src/manager/notes/remote-assets.js +128 -0
  317. package/dist/src/manager/notes/remote-assets.js.map +1 -0
  318. package/dist/src/manager/notes/routes.js +63 -13
  319. package/dist/src/manager/notes/routes.js.map +1 -1
  320. package/dist/src/manager/notes/store.js +3 -2
  321. package/dist/src/manager/notes/store.js.map +1 -1
  322. package/dist/src/manager/notes/system-trash.js +3 -3
  323. package/dist/src/manager/notes/system-trash.js.map +1 -1
  324. package/dist/src/manager/notes/vault-index.js +220 -0
  325. package/dist/src/manager/notes/vault-index.js.map +1 -0
  326. package/dist/src/manager/notes/watcher.js +27 -0
  327. package/dist/src/manager/notes/watcher.js.map +1 -0
  328. package/dist/src/manager/notes/wiki-links.js +109 -0
  329. package/dist/src/manager/notes/wiki-links.js.map +1 -0
  330. package/dist/src/manager/process-verify.js +29 -0
  331. package/dist/src/manager/process-verify.js.map +1 -1
  332. package/dist/src/manager/profiles.js +3 -2
  333. package/dist/src/manager/profiles.js.map +1 -1
  334. package/dist/src/manager/registry.js +60 -58
  335. package/dist/src/manager/registry.js.map +1 -1
  336. package/dist/src/manager/routes/electron-metrics.js +22 -22
  337. package/dist/src/manager/routes/electron-metrics.js.map +1 -1
  338. package/dist/src/manager/scan.js +2 -2
  339. package/dist/src/manager/scan.js.map +1 -1
  340. package/dist/src/manager/schedule/routes.js +24 -23
  341. package/dist/src/manager/schedule/routes.js.map +1 -1
  342. package/dist/src/manager/server.js +28 -28
  343. package/dist/src/manager/server.js.map +1 -1
  344. package/dist/src/manager/systemd-service.js +1 -1
  345. package/dist/src/manager/systemd-service.js.map +1 -1
  346. package/dist/src/memory/bootstrap.js +5 -4
  347. package/dist/src/memory/bootstrap.js.map +1 -1
  348. package/dist/src/memory/heartbeat-schedule.js +10 -10
  349. package/dist/src/memory/heartbeat-schedule.js.map +1 -1
  350. package/dist/src/memory/heartbeat.js +23 -22
  351. package/dist/src/memory/heartbeat.js.map +1 -1
  352. package/dist/src/memory/indexing.js.map +1 -1
  353. package/dist/src/memory/keyword-expand.js +1 -1
  354. package/dist/src/memory/keyword-expand.js.map +1 -1
  355. package/dist/src/memory/memory.js +2 -2
  356. package/dist/src/memory/memory.js.map +1 -1
  357. package/dist/src/memory/runtime.js +6 -5
  358. package/dist/src/memory/runtime.js.map +1 -1
  359. package/dist/src/memory/shared.js +2 -1
  360. package/dist/src/memory/shared.js.map +1 -1
  361. package/dist/src/memory/worklog.js +1 -1
  362. package/dist/src/memory/worklog.js.map +1 -1
  363. package/dist/src/messaging/runtime.js +13 -10
  364. package/dist/src/messaging/runtime.js.map +1 -1
  365. package/dist/src/messaging/send.js +16 -15
  366. package/dist/src/messaging/send.js.map +1 -1
  367. package/dist/src/orchestrator/collect.js +6 -6
  368. package/dist/src/orchestrator/collect.js.map +1 -1
  369. package/dist/src/orchestrator/distribute.js +112 -77
  370. package/dist/src/orchestrator/distribute.js.map +1 -1
  371. package/dist/src/orchestrator/gateway.js +6 -5
  372. package/dist/src/orchestrator/gateway.js.map +1 -1
  373. package/dist/src/orchestrator/pipeline.js +42 -42
  374. package/dist/src/orchestrator/pipeline.js.map +1 -1
  375. package/dist/src/orchestrator/state-machine.js +3 -3
  376. package/dist/src/orchestrator/state-machine.js.map +1 -1
  377. package/dist/src/orchestrator/worker-registry.js +4 -3
  378. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  379. package/dist/src/prompt/builder.js +24 -19
  380. package/dist/src/prompt/builder.js.map +1 -1
  381. package/dist/src/prompt/templates/a1-system.md +15 -10
  382. package/dist/src/prompt/templates/control-system.md +9 -7
  383. package/dist/src/prompt/templates/employee.md +5 -4
  384. package/dist/src/prompt/templates/vision-click.md +1 -1
  385. package/dist/src/routes/_http-error.js +15 -0
  386. package/dist/src/routes/_http-error.js.map +1 -0
  387. package/dist/src/routes/avatar.js +6 -5
  388. package/dist/src/routes/avatar.js.map +1 -1
  389. package/dist/src/routes/browser.js +132 -45
  390. package/dist/src/routes/browser.js.map +1 -1
  391. package/dist/src/routes/employees.js +28 -21
  392. package/dist/src/routes/employees.js.map +1 -1
  393. package/dist/src/routes/heartbeat.js +12 -9
  394. package/dist/src/routes/heartbeat.js.map +1 -1
  395. package/dist/src/routes/i18n.js +13 -7
  396. package/dist/src/routes/i18n.js.map +1 -1
  397. package/dist/src/routes/jaw-memory.js +15 -11
  398. package/dist/src/routes/jaw-memory.js.map +1 -1
  399. package/dist/src/routes/memory.js +25 -20
  400. package/dist/src/routes/memory.js.map +1 -1
  401. package/dist/src/routes/messaging.js +50 -29
  402. package/dist/src/routes/messaging.js.map +1 -1
  403. package/dist/src/routes/orchestrate.js +38 -24
  404. package/dist/src/routes/orchestrate.js.map +1 -1
  405. package/dist/src/routes/quota.js +81 -17
  406. package/dist/src/routes/quota.js.map +1 -1
  407. package/dist/src/routes/settings.js +28 -18
  408. package/dist/src/routes/settings.js.map +1 -1
  409. package/dist/src/routes/skills.js +22 -13
  410. package/dist/src/routes/skills.js.map +1 -1
  411. package/dist/src/routes/traces.js +77 -0
  412. package/dist/src/routes/traces.js.map +1 -0
  413. package/dist/src/security/path-guards.js +2 -1
  414. package/dist/src/security/path-guards.js.map +1 -1
  415. package/dist/src/shared/tool-log-sanitize.js +191 -0
  416. package/dist/src/shared/tool-log-sanitize.js.map +1 -0
  417. package/dist/src/telegram/bot.js +65 -55
  418. package/dist/src/telegram/bot.js.map +1 -1
  419. package/dist/src/telegram/forwarder.js +5 -9
  420. package/dist/src/telegram/forwarder.js.map +1 -1
  421. package/dist/src/telegram/telegram-file.js +28 -24
  422. package/dist/src/telegram/telegram-file.js.map +1 -1
  423. package/dist/src/telegram/voice.js +4 -3
  424. package/dist/src/telegram/voice.js.map +1 -1
  425. package/dist/src/trace/redact.js +50 -0
  426. package/dist/src/trace/redact.js.map +1 -0
  427. package/dist/src/trace/store.js +162 -0
  428. package/dist/src/trace/store.js.map +1 -0
  429. package/dist/src/trace/types.js +2 -0
  430. package/dist/src/trace/types.js.map +1 -0
  431. package/dist/src/types/cli-engine.js +34 -0
  432. package/dist/src/types/cli-engine.js.map +1 -0
  433. package/dist/src/types/cli-events.js +31 -0
  434. package/dist/src/types/cli-events.js.map +1 -0
  435. package/package.json +22 -2
  436. package/public/css/tool-ui.css +3 -1
  437. package/public/css/trace-drawer.css +48 -0
  438. package/public/dist/assets/{AdvancedExport-3WAYIabE.js → AdvancedExport-DJZ2VmBR.js} +1 -1
  439. package/public/dist/assets/Agent-CgpLT8IY.js +1 -0
  440. package/public/dist/assets/Browser-CrkiQoB8.js +1 -0
  441. package/public/dist/assets/{ChannelsDiscord-UzFPlWT4.js → ChannelsDiscord-CVUC22D4.js} +1 -1
  442. package/public/dist/assets/{ChannelsTelegram-DNWtPX0w.js → ChannelsTelegram-DEatIQNM.js} +1 -1
  443. package/public/dist/assets/{DashboardMeta-Y_6nVeJO.js → DashboardMeta-BKoxRc7i.js} +1 -1
  444. package/public/dist/assets/{Display-D8vGOl4s.js → Display-DnNGV9Km.js} +1 -1
  445. package/public/dist/assets/{Employees-YR_sIRK4.js → Employees-DZ2iJYKy.js} +1 -1
  446. package/public/dist/assets/{HealthBadge-CPePajyU.js → HealthBadge-Cq2c7G9s.js} +1 -1
  447. package/public/dist/assets/{Heartbeat-DTpAULQR.js → Heartbeat-BML6eTXZ.js} +1 -1
  448. package/public/dist/assets/{Mcp-DM-PgG6z.js → Mcp-BlEviQ3h.js} +1 -1
  449. package/public/dist/assets/{Memory-C_LvJnkn.js → Memory-BRyH80He.js} +1 -1
  450. package/public/dist/assets/MilkdownWysiwygEditor-Cm3uXfWf.js +52 -0
  451. package/public/dist/assets/ModelProvider-DxyR7EL9.js +1 -0
  452. package/public/dist/assets/Network-DDOOESh1.js +1 -0
  453. package/public/dist/assets/{Permissions-B1naJjjw.js → Permissions-Br0eSbKb.js} +1 -1
  454. package/public/dist/assets/{Permissions-BKffrMJD.js → Permissions-QHkzStqQ.js} +1 -1
  455. package/public/dist/assets/{Profile-DIqjSe2C.js → Profile-C79NKumk.js} +1 -1
  456. package/public/dist/assets/{Prompts-BMfbV6Y4.js → Prompts-BmiIDiXW.js} +1 -1
  457. package/public/dist/assets/{SpeechKeys-DjiQTzSL.js → SpeechKeys-B8304XJK.js} +1 -1
  458. package/public/dist/assets/app-Be58Cs3Y.js +32 -0
  459. package/public/dist/assets/{app-BzvwJJiv.css → app-CphocJzo.css} +1 -1
  460. package/public/dist/assets/{dist-DTvxN3ux.js → dist-BD0UXfgF2.js} +1 -1
  461. package/public/dist/assets/{dist-CASeq-Tl.js → dist-BNfXO3Yr.js} +1 -1
  462. package/public/dist/assets/{dist-BMPiaUzF.js → dist-BUnPYbK3.js} +1 -1
  463. package/public/dist/assets/{dist-CT_X3hVT.js → dist-BZosRD2u.js} +1 -1
  464. package/public/dist/assets/{dist-4J6YbNXv.js → dist-Bd9PlnQm.js} +1 -1
  465. package/public/dist/assets/{dist-BcZjyn5g.js → dist-BsT5UdNP.js} +1 -1
  466. package/public/dist/assets/{dist-BfBhOPR-.js → dist-CIuXW-sc.js} +1 -1
  467. package/public/dist/assets/{dist-BMiCig3A2.js → dist-CL4PTYWf.js} +1 -1
  468. package/public/dist/assets/{dist-VyP6-HLb.js → dist-Ch5VAlV9.js} +1 -1
  469. package/public/dist/assets/dist-ClqO40BE.js +1 -0
  470. package/public/dist/assets/{dist-c98Tp7bP.js → dist-Cp42cMcI.js} +1 -1
  471. package/public/dist/assets/{dist-CIlYL1qe.js → dist-CpUK8ypo.js} +1 -1
  472. package/public/dist/assets/dist-CxeLAw2Y.js +1 -0
  473. package/public/dist/assets/dist-D2SH8nxa.js +1 -0
  474. package/public/dist/assets/{dist-84fwQ7bO.js → dist-D6cUXP7K.js} +1 -1
  475. package/public/dist/assets/{dist-BOCcQAyF.js → dist-D7bCuS3f.js} +1 -1
  476. package/public/dist/assets/{dist-DMmpfLVP.js → dist-DFYRUAjN.js} +1 -1
  477. package/public/dist/assets/{dist-DdY6pTJr.js → dist-DZsFVYF4.js} +1 -1
  478. package/public/dist/assets/{dist-B0p3Eyme.js → dist-Db16ogVk.js} +1 -1
  479. package/public/dist/assets/{dist-DlnNtr6L.js → dist-DfodGES_.js} +1 -1
  480. package/public/dist/assets/{dist-DO9so2a2.js → dist-SU-YTAIg.js} +1 -1
  481. package/public/dist/assets/{dist-DUjXiMLP.js → dist-UYn7T-GH.js} +1 -1
  482. package/public/dist/assets/{dist-BW1409rz.js → dist-W51oDoeA.js} +1 -1
  483. package/public/dist/assets/{dist-BimBQZx1.js → dist-eU7TyC86.js} +1 -1
  484. package/public/dist/assets/dist-l9HH00ip.js +1 -0
  485. package/public/dist/assets/{dist-BrOPNxdH.js → dist-urPTQzXL.js} +1 -1
  486. package/public/dist/assets/{dist-AloEV3J52.js → dist-yHP6L0Ty.js} +1 -1
  487. package/public/dist/assets/{employees-Bbabvbyx.js → employees-CxdghzoD.js} +7 -7
  488. package/public/dist/assets/{error-normalize-DdvKGLt_.js → error-normalize-5n-zlEQ3.js} +1 -1
  489. package/public/dist/assets/insert-image-markdown-DIEa-zjk.js +22 -0
  490. package/public/dist/assets/{manager-DyB2ZUr9.css → manager-DEiyrWDP.css} +1 -1
  491. package/public/dist/assets/manager-UEXd1_9T.js +25 -0
  492. package/public/dist/assets/{memory-B_plvcuQ.js → memory-CsMNkYtv.js} +9 -9
  493. package/public/dist/assets/memory-DXad_DPO.js +1 -0
  494. package/public/dist/assets/{page-shell-DML_HneX.js → page-shell-D5tbivHH.js} +1 -1
  495. package/public/dist/assets/{render-DEhbfUAW.js → render-DGQX46ei.js} +2 -2
  496. package/public/dist/assets/{settings-D7F-_kYG.js → settings-BH213Yv3.js} +14 -14
  497. package/public/dist/assets/settings-DXT87G2U.js +1 -0
  498. package/public/dist/assets/settings-client-ajlwI-oK.js +1 -0
  499. package/public/dist/assets/skills-5o_1v0nz.js +1 -0
  500. package/public/dist/assets/{skills-DoGJOc0D.js → skills-CQtCtHPA.js} +6 -6
  501. package/public/dist/assets/slash-commands-D4-hrrmh.js +1 -0
  502. package/public/dist/assets/{slash-commands-khNFPOyF.js → slash-commands-Dzk1xHWS.js} +1 -1
  503. package/public/dist/assets/trace-drawer-SRKcfm2S.js +15 -0
  504. package/public/dist/assets/ui-CdRKN2S6.js +141 -0
  505. package/public/dist/assets/ui-n43jmg_f.js +1 -0
  506. package/public/dist/assets/{ws-B2aJ-nD2.js → ws-CTHQFzM1.js} +8 -8
  507. package/public/dist/index.html +2 -2
  508. package/public/dist/manager/index.html +2 -2
  509. package/public/index.html +1 -0
  510. package/public/js/constants.ts +5 -5
  511. package/public/js/diagram/iframe-renderer.ts +11 -11
  512. package/public/js/features/chat.ts +1 -1
  513. package/public/js/features/memory.ts +10 -10
  514. package/public/js/features/pending-queue.ts +2 -2
  515. package/public/js/features/process-block.ts +257 -29
  516. package/public/js/features/process-step-match.ts +18 -0
  517. package/public/js/features/settings-cli-status.ts +1 -1
  518. package/public/js/features/settings-stt.ts +37 -11
  519. package/public/js/features/settings-templates.ts +2 -2
  520. package/public/js/features/slash-commands.ts +1 -1
  521. package/public/js/features/tool-ui.ts +13 -7
  522. package/public/js/features/trace-drawer.ts +122 -0
  523. package/public/js/icons.ts +1 -1
  524. package/public/js/main.ts +28 -28
  525. package/public/js/provider-icons.ts +1 -1
  526. package/public/js/render.ts +29 -27
  527. package/public/js/sanitizer.ts +4 -0
  528. package/public/js/ui.ts +234 -68
  529. package/public/js/virtual-scroll.ts +19 -33
  530. package/public/js/ws.ts +22 -10
  531. package/public/manager/src/App.tsx +34 -6
  532. package/public/manager/src/api.ts +55 -1
  533. package/public/manager/src/components/ActivityTimeline.tsx +1 -1
  534. package/public/manager/src/components/InstanceDetailPanel.tsx +2 -2
  535. package/public/manager/src/components/InstanceGroups.tsx +5 -5
  536. package/public/manager/src/components/InstanceListContent.tsx +1 -1
  537. package/public/manager/src/dashboard-features.ts +1 -1
  538. package/public/manager/src/manager-notes.css +49 -2
  539. package/public/manager/src/notes/MarkdownEditor.tsx +7 -3
  540. package/public/manager/src/notes/NotesFileTree.tsx +45 -6
  541. package/public/manager/src/notes/NotesSidebar.tsx +24 -55
  542. package/public/manager/src/notes/NotesWorkspace.tsx +50 -3
  543. package/public/manager/src/notes/image-assets/clipboard-images.ts +100 -0
  544. package/public/manager/src/notes/image-assets/insert-image-markdown.ts +85 -0
  545. package/public/manager/src/notes/notes-api.ts +2 -0
  546. package/public/manager/src/notes/notes-types.ts +8 -1
  547. package/public/manager/src/notes/rendering/MarkdownRenderer.tsx +6 -0
  548. package/public/manager/src/notes/rendering/markdown-render-security.ts +19 -1
  549. package/public/manager/src/notes/rich-markdown/paste-policy.ts +6 -2
  550. package/public/manager/src/notes/rich-markdown/rich-markdown-extension.ts +5 -5
  551. package/public/manager/src/notes/rich-markdown/rich-widget.ts +8 -8
  552. package/public/manager/src/notes/useNotesExternalSync.ts +37 -0
  553. package/public/manager/src/notes/useNotesModel.ts +91 -0
  554. package/public/manager/src/notes/wysiwyg/MilkdownWysiwygEditor.tsx +157 -17
  555. package/public/manager/src/notes/wysiwyg/milkdown-block-keymap.ts +14 -2
  556. package/public/manager/src/notes/wysiwyg/milkdown-code-block-view.ts +20 -20
  557. package/public/manager/src/notes/wysiwyg/milkdown-heading-source-view.ts +8 -8
  558. package/public/manager/src/notes/wysiwyg/milkdown-math.ts +25 -25
  559. package/public/manager/src/settings/pages/Browser.tsx +38 -20
  560. package/public/manager/src/settings/pages/ModelProvider.tsx +11 -9
  561. package/public/manager/src/settings/pages/Network.tsx +10 -10
  562. package/public/manager/src/settings/pages/components/HealthBadge.tsx +12 -12
  563. package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +12 -10
  564. package/public/manager/src/settings/pages/components/employees-helpers.ts +9 -9
  565. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +13 -13
  566. package/public/manager/src/settings/pages/components/memory-helpers.ts +4 -4
  567. package/public/manager/src/settings/pages/mcp-helpers.ts +7 -7
  568. package/public/manager/src/settings/settings-client.ts +4 -3
  569. package/public/manager/src/sync/IframeBridge.tsx +29 -0
  570. package/public/manager/src/sync/VisibilityBridge.tsx +24 -0
  571. package/public/manager/src/sync/invalidation-bus.ts +30 -0
  572. package/public/manager/src/sync/useInvalidationSubscription.ts +19 -0
  573. package/public/manager/src/types.ts +101 -0
  574. package/scripts/check-strict-baseline.mjs +255 -0
  575. package/scripts/claim-audit.mjs +159 -0
  576. package/scripts/i18n-registry.ts +4 -4
  577. package/scripts/install-officecli.sh +2 -2
  578. package/scripts/install-wsl.sh +2 -1
  579. package/scripts/release-gates.mjs +347 -0
  580. package/scripts/release-preview.sh +3 -0
  581. package/scripts/release.sh +4 -0
  582. package/scripts/smoke/opencode-external-dir-smoke.ts +14 -5
  583. package/public/dist/assets/Agent-BYdzZwD0.js +0 -1
  584. package/public/dist/assets/Browser-CkGeczuN.js +0 -1
  585. package/public/dist/assets/MilkdownWysiwygEditor-B7k9bAey.js +0 -52
  586. package/public/dist/assets/ModelProvider-CX3Qhowu.js +0 -1
  587. package/public/dist/assets/Network-DfPLFAvw.js +0 -1
  588. package/public/dist/assets/app-DLYoRkU9.js +0 -32
  589. package/public/dist/assets/dist-8zNAQAIa.js +0 -1
  590. package/public/dist/assets/dist-BgeY6nvK.js +0 -1
  591. package/public/dist/assets/dist-BzDGGxHQ.js +0 -1
  592. package/public/dist/assets/dist-D3YKbVi-.js +0 -1
  593. package/public/dist/assets/manager-CUSgFbMO.js +0 -25
  594. package/public/dist/assets/markdown-render-security-DJfJPWO-.js +0 -22
  595. package/public/dist/assets/memory-DQ6dU0qs.js +0 -1
  596. package/public/dist/assets/settings-DxLPUbpj.js +0 -1
  597. package/public/dist/assets/settings-client-CGf3uPPf.js +0 -1
  598. package/public/dist/assets/skills-yMfNYJ8m.js +0 -1
  599. package/public/dist/assets/slash-commands-CZcwr1W6.js +0 -1
  600. package/public/dist/assets/ui-04YlOMgn.js +0 -136
  601. package/public/dist/assets/ui-D6hlMjRq.js +0 -1
  602. /package/public/dist/assets/{InlineWarn-CqgWEC41.js → InlineWarn-BooBRm7o.js} +0 -0
  603. /package/public/dist/assets/{agent-meta-puNn13DV.js → agent-meta-DHddpWHQ.js} +0 -0
  604. /package/public/dist/assets/{fields-DH9JS3mb.js → fields-BtncIZYA.js} +0 -0
  605. /package/public/dist/assets/{mermaid-loader-6XC0y10y.js → mermaid-loader-BEFIOoJn.js} +0 -0
  606. /package/public/dist/assets/{path-utils-CtsDDGZg.js → path-utils-BuEEtj9w.js} +0 -0
  607. /package/public/dist/assets/{w3c-keyname-VSld09PZ.js → w3c-keyname-IiiZScED.js} +0 -0
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-D5tbivHH.js";import{a as c,i as l,n as u,r as d,s as f}from"./fields-BtncIZYA.js";import{t as p}from"./agent-meta-DHddpWHQ.js";import{t as m}from"./path-utils-BuEEtj9w.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`;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:[(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:t.models[0]??`model id`}),t.models.length>0?(0,g.jsx)(`datalist`,{id:o,children:t.models.map(e=>(0,g.jsx)(`option`,{value:e},e))}):null]}),t.efforts.length>0?(0,g.jsx)(l,{id:`percli-${e}-effort`,label:`Effort`,value:r.effort??``,options:[{value:``,label:`(default)`},...t.efforts.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};
@@ -0,0 +1 @@
1
+ import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-D5tbivHH.js";import{a as c,i as l,s as u}from"./fields-BtncIZYA.js";import{t as d}from"./InlineWarn-BooBRm7o.js";import{t as f}from"./path-utils-BuEEtj9w.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-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-DML_HneX.js";import{i as c,n as l}from"./fields-DH9JS3mb.js";import{t as u}from"./InlineWarn-CqgWEC41.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{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-D5tbivHH.js";import{i as c,n as l}from"./fields-BtncIZYA.js";import{t as u}from"./InlineWarn-BooBRm7o.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-B1naJjjw.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-Br0eSbKb.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-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-DML_HneX.js";import{a as c,i as l}from"./fields-DH9JS3mb.js";import{t as u}from"./path-utils-CtsDDGZg.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{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-D5tbivHH.js";import{a as c,i as l}from"./fields-BtncIZYA.js";import{t as u}from"./path-utils-BuEEtj9w.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-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-DML_HneX.js";import{t as c}from"./InlineWarn-CqgWEC41.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{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-D5tbivHH.js";import{t as c}from"./InlineWarn-BooBRm7o.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-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-DML_HneX.js";import{i as c,o as l,s as u,t as d}from"./fields-DH9JS3mb.js";import{t as f}from"./path-utils-CtsDDGZg.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{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-DOs-BiPY.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-D5tbivHH.js";import{i as c,o as l,s as u,t as d}from"./fields-BtncIZYA.js";import{t as f}from"./path-utils-BuEEtj9w.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,32 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
2
+ import{n as e,r as t}from"./vendor-render-984tPmpy.js";import{t as n}from"./state-xhhyIPlq.js";import{a as r,i,n as a,r as o,t as s}from"./api-tVoG39dL.js";import{_ as c,c as l,d as u,g as d,i as ee,m as te,n as f,t as ne,v as re,y as p}from"./render-DGQX46ei.js";import{t as ie}from"./preload-helper-CMqhPRCH.js";import{C as ae,S as oe,d as se,n as m,s as ce,t as h,w as le,x as ue,y as de}from"./ui-CdRKN2S6.js";import{a as g,n as fe}from"./idb-cache-CjnC_K0x.js";import{a as pe,i as me,o as he,r as ge,t as _e}from"./ws-CTHQFzM1.js";import{t as ve}from"./locale-f397XJgr.js";import{a as ye,i as be,n as xe,o as Se,r as Ce,t as we}from"./slash-commands-Dzk1xHWS.js";import{a as Te,r as Ee}from"./constants-CYjOMbjf.js";import{A as De,C as Oe,D as ke,F as Ae,I as je,L as Me,M as Ne,N as Pe,P as Fe,R as Ie,T as Le,_ as Re,a as ze,b as _,c as Be,d as Ve,f as He,g as Ue,h as We,i as Ge,j as Ke,k as qe,l as Je,m as Ye,n as Xe,o as Ze,r as Qe,s as $e,t as v,u as et,v as tt,w as nt,y as rt,z as it}from"./settings-BH213Yv3.js";import{a as at,i as ot,t as st}from"./skills-CQtCtHPA.js";import{a as ct,c as y,d as lt,f as ut,i as dt,l as ft,m as pt,n as mt,o as ht,p as gt,r as _t,s as vt,t as yt,u as bt}from"./memory-CsMNkYtv.js";var b=[];function xt(e){return/^\/compact(?:\s|$)/i.test(String(e||``).trim())?300*1e3:1e4}function St(e){return/^\/(?:orchestrate|pabcd)(?:\s|$)/i.test(String(e||``).trim())}var Ct=!1;async function x(e=`enter`){let t=document.getElementById(`chatInput`),a=document.getElementById(`btnSend`);if(!t||!a)return;let c=e===`button`;if(a.classList.contains(`stop-mode`)&&c){o(`/api/stop`,`POST`);return}if(Ct)return;let l=t.value.trim();if(!l&&!n.attachedFiles.length)return;me(),Ct=!0;let d=a,ee=d.disabled;d.disabled=!0;try{await Oe();let e=l.slice(1).trim().split(/\s+/)[0]||``,a=e.includes(`/`)||e.includes(`\\`);if(l.startsWith(`/`)&&!n.attachedFiles.length&&!a){let e=St(l);t.value=``,C(),we();try{let e,t,n=xt(l);if(typeof AbortSignal?.timeout==`function`)e=AbortSignal.timeout(n);else{let r=new AbortController;e=r.signal,t=setTimeout(()=>r.abort(),n)}let a=ve(),o=await r(),c=await fetch(`${s}/api/command`,{method:`POST`,headers:{"Content-Type":`application/json`,"Accept-Language":a,...o?{Authorization:`Bearer ${o}`}:{}},body:JSON.stringify({text:l,locale:a}),signal:e});t&&clearTimeout(t);let u=await c.json().catch(()=>({}));if(u?.code===`not_command`){h(`user`,l),g({role:`user`,content:l,timestamp:Date.now()}),await i(`/api/message`,`POST`,{prompt:l});return}if(!c.ok&&!u?.text)throw Error(`HTTP ${c.status}`);if(u?.code===`clear_screen`){ne(),oe().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``)}u?.text&&m(f(u.text),``,u.type)}catch(e){m(p(`chat.cmd.fail`,{msg:e.message}),``,`error`)}finally{e&&ge(`command`).catch(()=>{})}return}if(n.attachedFiles.length){let e=`📎 [${n.attachedFiles.map(e=>e.name).join(`, `)}] ${l}`;h(`user`,e),g({role:`user`,content:e,timestamp:Date.now()}),t.value=``,C();try{let e=(await Promise.all(n.attachedFiles.map(e=>Tt(e)))).map(e=>p(`chat.file.sent`,{path:e})).join(`
3
+ `);l&&(e+=p(`chat.file.sentWithMsg`,{text:l})),S(),await i(`/api/message`,`POST`,{prompt:e})}catch(e){m(p(`chat.file.uploadFail`,{msg:e.message})),S()}}else{t.value=``,C();let e=await fetch(`${s}/api/message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:l})}),n=await e.json().catch(()=>({}));if(e.status===409&&n.error===`duplicate`)return;if(!e.ok){m(`${u.error} ${f(n.error||p(`chat.requestFail`,{status:e.status}))}`,``,`error`);return}if(n.queued){let{updateQueueBadge:e}=await ie(async()=>{let{updateQueueBadge:e}=await import(`./ui-n43jmg_f.js`);return{updateQueueBadge:e}},__vite__mapDeps([0]));e(n.pending||1)}else n.continued?(h(`user`,l),g({role:`user`,content:l,timestamp:Date.now()}),m(p(`chat.continue`))):(h(`user`,l),g({role:`user`,content:l,timestamp:Date.now()}))}}finally{Ct=!1,d.disabled=ee}}function wt(e){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),x(`enter`))}async function Tt(e){let t=await fetch(`${s}/api/upload`,{method:`POST`,headers:{"X-Filename":encodeURIComponent(e.name)},body:e});if(!t.ok)throw Error(`upload failed`);return(await t.json()).path}function Et(e){for(let t of e)n.attachedFiles.some(e=>e.name===t.name)||n.attachedFiles.push(t);Ot(),document.getElementById(`chatInput`)?.focus()}function Dt(e){n.attachedFiles.splice(e,1),Ot()}function S(){b.forEach(e=>URL.revokeObjectURL(e)),b=[],n.attachedFiles=[],Ot();let e=document.getElementById(`fileInput`);e&&(e.value=``)}function Ot(){let e=document.getElementById(`filePreview`),t=document.getElementById(`filePreviewList`);if(e){if(b.forEach(e=>URL.revokeObjectURL(e)),b=[],!n.attachedFiles.length){e.classList.remove(`visible`),t&&(t.innerHTML=``);return}e.classList.add(`visible`),t&&(t.innerHTML=n.attachedFiles.map((e,t)=>{let n=(e.size/1024).toFixed(1),r=e.type.startsWith(`image/`),i=``;if(r){let t=URL.createObjectURL(e);b.push(t),i=`<img src="${t}" class="file-chip-thumb" alt="">`}return`<div class="file-chip">
4
+ ${i}
5
+ <span class="file-chip-name">${u.paperclip} ${f(e.name)} (${n}KB)</span>
6
+ <button class="file-chip-remove" data-file-idx="${t}" title="Remove">${u.close}</button>
7
+ </div>`}).join(``))}}async function kt(){ne(),oe().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``);let{cleanupToolActivity:t}=await ie(async()=>{let{cleanupToolActivity:e}=await import(`./ui-n43jmg_f.js`);return{cleanupToolActivity:e}},__vite__mapDeps([0]));t(),fe().catch(()=>{}),me()}var At=0;function jt(e){At||=requestAnimationFrame(()=>{At=0,e.style.height=`auto`,e.style.height=e.scrollHeight+`px`})}function Mt(){let e=document.getElementById(`chatInput`);e&&e.addEventListener(`input`,()=>jt(e))}function C(){let e=document.getElementById(`chatInput`);e&&(e.style.height=`auto`)}function Nt(){let e=document.querySelector(`.chat-area`),t=document.getElementById(`dragOverlay`);if(!e||!t)return;let n=0;e.addEventListener(`dragenter`,e=>{e.preventDefault(),n++,t.classList.add(`visible`)}),e.addEventListener(`dragleave`,e=>{e.preventDefault(),n--,n<=0&&(n=0,t.classList.remove(`visible`))}),e.addEventListener(`dragover`,e=>e.preventDefault()),e.addEventListener(`drop`,e=>{e.preventDefault(),n=0,t.classList.remove(`visible`);let r=[...e.dataTransfer?.files||[]];r.length&&Et(r)}),document.getElementById(`fileInput`)?.addEventListener(`change`,e=>{let t=e.target,n=[...t.files||[]];n.length&&Et(n),t.value=``}),document.addEventListener(`paste`,e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e of t){if(e.kind!==`file`)continue;let t=e.getAsFile();if(t)if(!t.name||t.name===`image.png`){let e=new Date().toISOString().replace(/[:.]/g,`-`),r=t.type.split(`/`)[1]||`png`,i=new File([t],`pasted-${e}.${r}`,{type:t.type});n.push(i)}else n.push(t)}n.length&&(e.preventDefault(),Et(n))})}async function Pt(e,t,r){let a=document.getElementById(`chatInput`),o=a?.value.trim()||``,c=[...n.attachedFiles],l=[p(`chat.voice.label`)];c.length&&l.push(`📎 [${c.map(e=>e.name).join(`, `)}]`),o&&l.push(o),h(`user`,l.join(` `)),g({role:`user`,content:l.join(` `),timestamp:Date.now()}),a&&o&&(a.value=``,C()),c.length&&S();try{let n=await fetch(`${s}/api/voice`,{method:`POST`,headers:{"Content-Type":r,"X-Voice-Ext":t,"X-STT-Only":`true`},body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`HTTP ${n.status}`)}let a=await n.json().catch(()=>null);if(!a?.text)throw Error(`Empty STT result`);m(`${u.mic} STT (${f(a.engine||``)}, ${a.elapsed?.toFixed(1)}s): "${f(a.text.slice(0,100))}"`,``,`info`);let l=[];c.length&&(l=await Promise.all(c.map(e=>Tt(e))));let d=[];for(let e of l)d.push(p(`chat.file.sent`,{path:e}));d.push(`🎤 ${a.text}`),o&&d.push(o),await i(`/api/message`,`POST`,{prompt:d.join(`
8
+ `)})}catch(e){m(p(`voice.sttFail`,{msg:e.message}),``,`error`)}}var Ft={sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6},It={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};function Lt(e){let t=typeof e==`string`?e.trim():``;if(t)try{return new Intl.DateTimeFormat(`en-US`,{timeZone:t}).format(new Date),t}catch{return}}function Rt(e){let t=e&&typeof e==`object`?e:{},n=t.kind,r=typeof t.timeZone==`string`?t.timeZone.trim():``,i=Lt(t.timeZone);if(r&&!i)return{ok:!1,code:`invalid_timezone`,error:`invalid timeZone "${r}"`};if(n===`cron`){let e=typeof t.cron==`string`?t.cron.trim().replace(/\s+/g,` `):``;if(!e)return{ok:!1,code:`invalid_cron`,error:`cron expression required`};let n=zt(e);return n?{ok:!1,code:`invalid_cron`,error:n}:{ok:!0,schedule:i?{kind:`cron`,cron:e,timeZone:i}:{kind:`cron`,cron:e}}}if(n==null||n===`every`){let e=typeof t.minutes==`number`?t.minutes:Number(t.minutes);if(!Number.isInteger(e)||e<1)return{ok:!1,code:`invalid_minutes`,error:`minutes must be an integer >= 1`};let n=Math.max(1,Math.floor(e));return{ok:!0,schedule:i?{kind:`every`,minutes:n,timeZone:i}:{kind:`every`,minutes:n}}}return{ok:!1,code:`invalid_kind`,error:`invalid heartbeat schedule kind "${String(n)}"`}}function zt(e){try{let[t,n,r,i,a]=Bt(e);return w(t,{min:0,max:59}),w(n,{min:0,max:23}),w(r,{min:1,max:31}),w(i,{min:1,max:12,aliases:It}),w(a,{min:0,max:7,aliases:Ft,normalize:Wt}),null}catch(e){return e.message}}function Bt(e){let t=String(e||``).trim().replace(/\s+/g,` `).split(` `);if(t.length!==5)throw Error(`cron must have 5 fields, got ${t.length}`);return t}function w(e,t){for(let n of e.split(`,`))Vt(n.trim(),t)}function Vt(e,t){if(!e)throw Error(`empty cron segment`);let n=e;if(e.includes(`/`)){let[t,r,...i]=e.split(`/`);if(!t||!r||i.length>0)throw Error(`invalid cron step segment "${e}"`);n=t,Ut(r,`invalid cron step "${r}"`)}if(n!==`*`){if(n.includes(`-`)){let[e,r,...i]=n.split(`-`);if(!e||!r||i.length>0||Ht(e,t)>Ht(r,t))throw Error(`invalid cron range "${n}"`);return}Ht(n,t)}}function Ht(e,t){let n=e.trim().toLowerCase(),r=t.aliases?.[n]??Number(n);if(!Number.isInteger(r))throw Error(`invalid cron value "${e}"`);let i=t.normalize?t.normalize(r):r;if(!Gt(i,t.min,t.max))throw Error(`cron value "${e}" out of range ${t.min}-${t.max}`);return i}function Ut(e,t){let n=Number(e);if(!Number.isInteger(n)||n<=0)throw Error(t);return n}function Wt(e){return e===7?0:e}function Gt(e,t,n){return e>=t&&e<=n}async function Kt(){n.heartbeatJobs=((await a(`/api/heartbeat`))?.jobs||[]).map(D),n.heartbeatErrors=k(n.heartbeatJobs),T(),document.getElementById(`heartbeatModal`)?.classList.add(`open`)}function qt(e){e&&e.target!==e.currentTarget||document.getElementById(`heartbeatModal`)?.classList.remove(`open`)}function T(){let e=document.getElementById(`hbJobsList`);if(!e)return;let t=n.heartbeatJobs.map(D);n.heartbeatJobs=t,n.heartbeatErrors=k(t),t.length===0?e.innerHTML=`<p style="color:var(--text-dim);font-size:12px;text-align:center">${p(`hb.empty`)}</p>`:e.innerHTML=t.map((e,t)=>{let r=Qt(e.schedule),i=r.kind===`cron`,a=n.heartbeatErrors[e.id],o=a||an(r),s=a?`hb-schedule-meta hb-error`:`hb-schedule-meta hb-help`,c=i?`<input type="text" value="${f(r.cron)}" placeholder="${f(p(`hb.cronPlaceholder`))}"
9
+ data-hb-cron="${t}">`:`<input type="number" value="${r.minutes}" min="1" data-hb-minutes="${t}">`,l=i?`<span class="hb-chip">${f(p(`hb.cronLabel`))}</span>`:`<span class="hb-chip">${f(p(`hb.minutesLabel`))}</span>`;return`
10
+ <div class="hb-job-card">
11
+ <div class="hb-job-header">
12
+ <input type="text" value="${f(String(e.name||``))}" placeholder="${f(p(`hb.name`))}"
13
+ data-hb-name="${t}">
14
+ <button class="hb-toggle ${e.enabled?`on`:`off`}"
15
+ data-hb-toggle="${t}" aria-label="${f(String(e.name||`job`)+` toggle`)}"></button>
16
+ <button class="hb-del" data-hb-remove="${t}">${u.close}</button>
17
+ </div>
18
+ <div class="hb-job-schedule">
19
+ <select data-hb-kind="${t}">
20
+ <option value="every"${i?``:` selected`}>${f(p(`hb.kindEvery`))}</option>
21
+ <option value="cron"${i?` selected`:``}>${f(p(`hb.kindCron`))}</option>
22
+ </select>
23
+ ${c}
24
+ ${l}
25
+ <input type="text" value="${f(r.timeZone||``)}" placeholder="${f(tn())}"
26
+ data-hb-timezone="${t}">
27
+ </div>
28
+ <p class="${s}">${f(o)}</p>
29
+ <textarea class="hb-prompt" rows="2" placeholder="${f(p(`hb.prompt`))}"
30
+ data-hb-prompt="${t}">${f(String(e.prompt||``))}</textarea>
31
+ </div>
32
+ `}).join(``);let r=t.filter(e=>e.enabled).length,i=document.getElementById(`hbSidebarBtn`);i&&(i.innerHTML=`${u.heartPulse} Heartbeat (${r})`)}function Jt(){n.heartbeatJobs.push({id:`hb_`+Date.now(),name:``,enabled:!0,schedule:en({kind:`every`,minutes:5}),prompt:``}),T(),E()}function Yt(e){n.heartbeatJobs.splice(e,1),T(),E()}function Xt(e){let t=n.heartbeatJobs[e];t&&(t.enabled=!t.enabled,T(),E())}async function E(){let e=n.heartbeatJobs.map(D);if(n.heartbeatJobs=e,n.heartbeatErrors=k(e),Object.keys(n.heartbeatErrors).length>0){T();return}let t=await i(`/api/heartbeat`,`PUT`,{jobs:e});t?.jobs&&(n.heartbeatJobs=t.jobs.map(D),n.heartbeatErrors=k(n.heartbeatJobs),T())}async function Zt(){try{let e=((await a(`/api/heartbeat`))?.jobs||[]).map(D).filter(e=>e.enabled).length,t=document.getElementById(`hbSidebarBtn`);t&&(t.innerHTML=`${u.heartPulse} Heartbeat (${e})`)}catch{}}function D(e){return{id:String(e.id||`hb_${Date.now()}`),name:String(e.name||``),enabled:e.enabled!==!1,schedule:Qt(e.schedule),prompt:String(e.prompt||``)}}function Qt(e){let t=$t(e?.timeZone);if(e?.kind===`cron`){let n=typeof e.cron==`string`?e.cron.trim().replace(/\s+/g,` `):`0 9 * * *`;return t?{kind:`cron`,cron:n,timeZone:t}:{kind:`cron`,cron:n}}let n=typeof e?.minutes==`number`&&Number.isFinite(e.minutes)&&e.minutes>0?Math.max(1,Math.floor(e.minutes)):5;return t?{kind:`every`,minutes:n,timeZone:t}:{kind:`every`,minutes:n}}function $t(e){return(typeof e==`string`?e.trim():``)||void 0}function en(e){let t=O();return t?{...e,timeZone:t}:e}function O(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function tn(){let e=O();return e?`${p(`hb.timezoneAuto`)} ${e}`:p(`hb.timezoneAuto`)}function k(e){let t={};for(let n of e){let e=nn(n);e&&(t[n.id]=e)}return t}function nn(e){let t=Rt(e.schedule);return t.ok?null:rn(t.code,t.error)}function rn(e,t){switch(e){case`invalid_cron`:return p(`hb.invalidCron`);case`invalid_timezone`:return p(`hb.invalidTimeZone`);case`invalid_minutes`:return p(`hb.invalidMinutes`);default:return t||p(`hb.invalidSchedule`)}}function an(e){let t=e.timeZone||O()||`Asia/Seoul`;return e.kind===`cron`?p(`hb.scheduleHintCron`,{cron:`0 9 * * *`,timeZone:t}):p(`hb.scheduleHintEvery`,{minutes:e.minutes,timeZone:t})}var A=`sidebarState`,j=900,on=768;function M(){return window.innerWidth<=on}function N(){document.body.classList.remove(`left-expanded`,`right-expanded`)}function sn(e){let t=`${e}-expanded`,n=e===`left`?`right-expanded`:`left-expanded`,r=!document.body.classList.contains(t);document.body.classList.remove(n),document.body.classList.toggle(t,r)}function cn(){let e={};try{e=JSON.parse(localStorage.getItem(A)||`{}`)}catch{}e.left&&document.body.classList.add(`left-collapsed`),e.right&&document.body.classList.add(`right-collapsed`);let t=M();document.getElementById(`toggleLeft`)?.addEventListener(`click`,F),document.getElementById(`toggleRight`)?.addEventListener(`click`,I),window.addEventListener(`resize`,()=>{let e=M();if(window.innerWidth>j){N();let e={};try{e=JSON.parse(localStorage.getItem(A)||`{}`)}catch{}document.body.classList.toggle(`left-collapsed`,!!e.left),document.body.classList.toggle(`right-collapsed`,!!e.right)}else document.body.classList.remove(`left-collapsed`,`right-collapsed`),e!==t&&N();t=e,L()}),window.innerWidth<=j&&(document.body.classList.remove(`left-collapsed`,`right-collapsed`),M()&&N()),L()}function P(){return window.innerWidth<=j}function F(){P()?sn(`left`):document.body.classList.toggle(`left-collapsed`),dn(),L()}function I(){P()?sn(`right`):document.body.classList.toggle(`right-collapsed`),dn(),L()}function ln(){return P()?document.body.classList.contains(`left-expanded`):!document.body.classList.contains(`left-collapsed`)}function un(){return P()?document.body.classList.contains(`right-expanded`):!document.body.classList.contains(`right-collapsed`)}function L(){let e=document.getElementById(`toggleLeft`),t=document.getElementById(`toggleRight`);e&&(e.innerHTML=ln()?u.chevronLeft:u.chevronRight),t&&(t.innerHTML=un()?u.chevronRight:u.chevronLeft)}function dn(){localStorage.setItem(A,JSON.stringify({left:document.body.classList.contains(`left-collapsed`),right:document.body.classList.contains(`right-collapsed`)}))}var fn=`theme`,R=null;function pn(e){return e===`dark`||e===`light`}function mn(n){let r=n===`light`?e:t;R||(R=document.createElement(`style`),R.id=`hljsTheme`,document.head.appendChild(R)),R.textContent=r}function hn(){let e=vn(),t=localStorage.getItem(fn),n=window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;_n(e||t||n),document.getElementById(`toggleTheme`)?.addEventListener(`click`,gn),window.addEventListener(`message`,bn)}function gn(){let e=(document.documentElement.getAttribute(`data-theme`)||`dark`)===`dark`?`light`:`dark`;_n(e),localStorage.setItem(fn,e)}function _n(e){document.documentElement.setAttribute(`data-theme`,e);let t=document.getElementById(`toggleTheme`);t&&t.classList.toggle(`is-light`,e===`light`),mn(e),ue(),l()}function vn(){let e=new URLSearchParams(window.location.search).get(`jawTheme`);return pn(e)?e:null}function yn(e){if(e===window.location.origin)return!0;try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function bn(e){if(window.parent===window||e.source!==window.parent||!yn(e.origin))return;let t=e.data;!t||t.type!==`jaw-preview-theme-sync`||!pn(t.theme)||_n(t.theme)}var xn=50,Sn=30,Cn=80,wn=500,z=null,Tn=!1;function En(){if(Tn||!(`ontouchstart`in window))return;Tn=!0;let e=document.querySelector(`.chat-area`);e&&(e.addEventListener(`touchstart`,Dn,{passive:!0}),e.addEventListener(`touchend`,On,{passive:!0}))}function Dn(e){let t=e.touches[0],n=window.innerWidth,r=null;t.clientX<Sn?r=`left`:t.clientX>n-Sn&&(r=`right`),z={startX:t.clientX,startY:t.clientY,startTime:Date.now(),isEdge:r}}function On(e){if(!z)return;let t=e.changedTouches[0],n=t.clientX-z.startX,r=Math.abs(t.clientY-z.startY),i=Date.now()-z.startTime,a=z;z=null,!(r>Cn||i>wn||Math.abs(n)<xn)&&(n>0&&a.isEdge===`left`&&F(),n<0&&a.isEdge===`right`&&I())}var kn=!1,B=null,V=[],H=null,An=null,jn=0;function Mn(){if(typeof MediaRecorder>`u`)return``;for(let e of[`audio/webm;codecs=opus`,`audio/mp4`,`audio/ogg;codecs=opus`])if(MediaRecorder.isTypeSupported(e))return e;return``}function Nn(e){let t=e;switch(t.name){case`NotAllowedError`:return p(`voice.micDenied`);case`NotFoundError`:return p(`voice.micNotFound`);case`NotReadableError`:case`AbortError`:return p(`voice.micBusy`);default:return t instanceof TypeError||!navigator.mediaDevices?p(`voice.httpsRequired`):p(`voice.micDenied`)}}async function Pn(){if(n.isRecording)return;if(typeof MediaRecorder>`u`||!navigator.mediaDevices?.getUserMedia){m(p(`voice.unsupported`),``,`error`);return}try{H=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(e){m(Nn(e),``,`error`);return}let e=Mn();B=new MediaRecorder(H,e?{mimeType:e}:{}),V=[],B.ondataavailable=e=>{e.data.size>0&&V.push(e.data)},B.onerror=()=>{Fn(),m(p(`voice.interrupted`),``,`error`)},B.onstop=async()=>{if(kn){V=[],Rn(),kn=!1;return}let t=B?.mimeType||e||`audio/webm`,n=t.includes(`mp4`)?`.m4a`:t.includes(`ogg`)?`.ogg`:`.webm`,r=new Blob(V,{type:t});if(V=[],Rn(),r.size>20*1024*1024){m(p(`voice.tooLarge`),``,`error`);return}if(r.size<1e3){m(p(`voice.tooShort`),``,`error`);return}await Pt(r,n,t)},B.start(),n.isRecording=!0,jn=Date.now(),Vn(!0),zn()}function Fn(){!n.isRecording||!B||(B.state===`recording`&&B.stop(),n.isRecording=!1,Bn(),Vn(!1))}function In(){!n.isRecording||!B||(kn=!0,B.state===`recording`&&B.stop(),n.isRecording=!1,Bn(),Vn(!1))}function Ln(){n.isRecording?Fn():Pn()}function Rn(){H?.getTracks().forEach(e=>e.stop()),H=null}function zn(){let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`inline`,An=setInterval(()=>{let t=Math.floor((Date.now()-jn)/1e3);e.textContent=`${String(Math.floor(t/60)).padStart(2,`0`)}:${String(t%60).padStart(2,`0`)}`},500))}function Bn(){An&&=(clearInterval(An),null);let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`none`,e.textContent=`00:00`)}function Vn(e){let t=document.getElementById(`btnVoice`),n=document.getElementById(`btnVoiceCancel`);t&&(t.classList.toggle(`recording`,e),t.innerHTML=e?u.stop:u.mic,t.title=p(e?`voice.stop`:`voice.start`)),n&&(n.style.display=e?`inline-block`:`none`)}var Hn={activeCli:U(`activeCli`,2,1,2),model:U(`model`,2,1,1),effort:U(`effort`,2,1,1),permissions:U(`permissions`,2,1,1),flushAgent:U(`flushAgent`,2,1,1),employees:U(`employees`,3,3,2),skills:U(`skills`,2,1,1),activeChannel:U(`activeChannel`,2,1,1),telegram:U(`telegram`,2,1,2),discord:U(`discord`,2,1,2),fallbackOrder:U(`fallbackOrder`,2,1,1),mcp:U(`mcp`,2,1,1),memory:U(`memory`,2,1,2),stt:U(`stt`,2,1,1),promptTemplates:U(`promptTemplates`,2,1,1)};function Un(e){return typeof e==`string`&&Object.prototype.hasOwnProperty.call(Hn,e)}function U(e,t,n,r,i=2,a=1){return{titleKey:`help.${e}.title`,introKey:`help.${e}.intro`,effectKey:`help.${e}.effect`,useWhenKeys:W(`help.${e}.use`,t),howToKeys:W(`help.${e}.howTo`,i),exampleKeys:W(`help.${e}.example`,a),avoidWhenKeys:W(`help.${e}.avoid`,n),relatedKeys:W(`help.${e}.related`,r)}}function W(e,t){return Array.from({length:t},(t,n)=>`${e}.${n+1}`)}var Wn=!1,G=null,K=null,q=null,J=null,Gn=null,Y=!1;function Kn(){Wn||(Wn=!0,document.addEventListener(`click`,Jn),document.addEventListener(`keydown`,Yn,!0))}function qn(e,t=null){let n=Hn[e];if(!n){console.warn(`[help-dialog] unknown topic:`,e);return}Xn(),Gn=t,Zn(n),G?.classList.add(`open`),G?.setAttribute(`aria-hidden`,`false`),Y=!0,requestAnimationFrame(()=>J?.focus())}function X(){if(!Y)return;G?.classList.remove(`open`),G?.setAttribute(`aria-hidden`,`true`),Y=!1;let e=Gn;Gn=null,e?.focus()}function Jn(e){let t=e.target?.closest(`[data-help-topic]`);if(!t)return;let n=t.getAttribute(`data-help-topic`);if(!Un(n)){console.warn(`[help-dialog] invalid topic:`,n);return}e.preventDefault(),qn(n,t)}function Yn(e){!Y||e.key!==`Escape`||(e.preventDefault(),e.stopImmediatePropagation(),X())}function Xn(){if(G&&K&&q&&J)return;G=document.createElement(`div`),G.id=`helpDialog`,G.className=`modal-overlay help-dialog-overlay`,G.setAttribute(`role`,`presentation`),G.setAttribute(`aria-hidden`,`true`),G.addEventListener(`click`,e=>{e.target===G&&X()});let e=document.createElement(`div`);e.className=`modal-box help-dialog-box`,e.setAttribute(`role`,`dialog`),e.setAttribute(`aria-modal`,`true`),e.setAttribute(`aria-labelledby`,`helpDialogTitle`),e.addEventListener(`click`,e=>e.stopPropagation());let t=document.createElement(`div`);t.className=`modal-header help-dialog-header`,K=document.createElement(`span`),K.id=`helpDialogTitle`,J=document.createElement(`button`),J.type=`button`,J.className=`btn-modal-close help-dialog-close`,J.setAttribute(`aria-label`,p(`help.close`)),J.textContent=`x`,J.addEventListener(`click`,()=>X()),q=document.createElement(`div`),q.className=`help-dialog-body`;let n=document.createElement(`div`);n.className=`modal-footer help-dialog-footer`;let r=document.createElement(`button`);r.type=`button`,r.className=`btn-save help-dialog-done`,r.textContent=p(`help.close`),r.addEventListener(`click`,()=>X()),t.append(K,J),n.append(r),e.append(t,q,n),G.append(e),document.body.append(G)}function Zn(e){!K||!q||!J||(K.textContent=p(e.titleKey),J.setAttribute(`aria-label`,p(`help.close`)),q.replaceChildren(),Qn(p(`help.section.what`),p(e.introKey)),Qn(p(`help.section.effect`),p(e.effectKey),`help-effect-text`),Z(p(`help.section.useWhen`),e.useWhenKeys),Z(p(`help.section.howTo`),e.howToKeys),Z(p(`help.section.example`),e.exampleKeys,!1,`help-example-list`),e.avoidWhenKeys?.length&&Z(p(`help.section.avoidWhen`),e.avoidWhenKeys),e.relatedKeys?.length&&Z(p(`help.section.related`),e.relatedKeys,!0))}function Qn(e,t,n){if(!q)return;let r=$n(e),i=document.createElement(`p`);n&&(i.className=n),i.textContent=t,r.append(i),q.append(r)}function Z(e,t,n=!1,r){if(!q)return;let i=$n(e),a=document.createElement(`ul`);a.className=r??(n?`help-related-list`:`help-dialog-list`);for(let e of t){let t=document.createElement(`li`);t.textContent=p(e),a.append(t)}i.append(a),q.append(i)}function $n(e){let t=document.createElement(`section`);t.className=`help-dialog-section`;let n=document.createElement(`h3`);return n.textContent=e,t.append(n),t}var er=`jaw:stale-bundle-reload-pending`;function tr(e){let t=typeof e==`string`?e:e instanceof Error||typeof e?.message==`string`?e.message:``;if(!/(failed to fetch dynamically imported module|error loading dynamically imported module|importing a module script failed|chunkloaderror)/i.test(t))return!1;console.warn(`[stale-bundle] detected dynamic import failure:`,t);try{if(sessionStorage.getItem(er)===`1`)return!0;sessionStorage.setItem(er,`1`)}catch{}let n=()=>window.location.reload();return`serviceWorker`in navigator?(navigator.serviceWorker.getRegistration().then(e=>e?.update()).catch(()=>{}).finally(n),!0):(n(),!0)}window.addEventListener(`unhandledrejection`,e=>{if(tr(e.reason)){e.preventDefault();return}console.error(`[unhandled]`,e.reason),e.preventDefault()}),window.addEventListener(`error`,e=>{if(tr(e.error||e.message)){e.preventDefault();return}console.error(`[error]`,e.message,e.filename,e.lineno)});var{loadEmployees:nr,addEmployee:rr,deleteEmployee:ir,updateEmployee:Q,onEmpCliChange:ar,onEmpRoleChange:or}=await ie(async()=>{let{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}=await import(`./employees-CxdghzoD.js`);return{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}},__vite__mapDeps([0]));document.getElementById(`btnSend`)?.addEventListener(`click`,()=>{x(`button`)});var sr=document.getElementById(`chatInput`);sr?.addEventListener(`keydown`,e=>{Ce(e)||wt(e)});var $=0;sr?.addEventListener(`input`,e=>{e.isComposing||($&&cancelAnimationFrame($),$=requestAnimationFrame(()=>{Se(e.target?.value||``),$=0}))}),sr?.addEventListener(`cmd-execute`,()=>{x(`cmd-execute`)}),document.getElementById(`cmdDropdown`)?.addEventListener(`click`,xe),document.addEventListener(`click`,be),he(),document.getElementById(`filePreviewClear`)?.addEventListener(`click`,S),document.getElementById(`filePreviewList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-file-idx]`);t&&Dt(+(t.dataset.fileIdx||`0`))}),document.querySelector(`.btn-attach`)?.addEventListener(`click`,()=>{document.getElementById(`fileInput`)?.click()}),document.getElementById(`btnVoice`)?.addEventListener(`click`,()=>Ln()),document.getElementById(`btnVoiceCancel`)?.addEventListener(`click`,()=>In()),document.getElementById(`memorySidebarBtn`)?.addEventListener(`click`,dt),document.getElementById(`btnClearChat`)?.addEventListener(`click`,kt),document.getElementById(`hbSidebarBtn`)?.addEventListener(`click`,Kt),document.getElementById(`langSelect`)?.addEventListener(`change`,async e=>{let t=e.target.value;[`ko`,`en`,`zh`,`ja`].includes(t)&&(await re(t),n.ws&&n.ws.close())}),document.querySelector(`.tab-bar`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.tab-btn`);if(!t)return;let n=[...t.parentElement?.children||[]].filter(e=>e.classList.contains(`tab-btn`)).indexOf(t),r=[`agents`,`skills`,`settings`];r[n]&&de(r[n],t)}),document.querySelector(`.sidebar-save-bar .btn-save`)?.addEventListener(`click`,ce),document.getElementById(`selCli`)?.addEventListener(`change`,()=>Re()),document.getElementById(`selModel`)?.addEventListener(`change`,()=>rt()),document.getElementById(`selEffort`)?.addEventListener(`change`,()=>rt()),document.getElementById(`flushCli`)?.addEventListener(`change`,()=>tt()),document.getElementById(`flushModel`)?.addEventListener(`change`,()=>tt()),document.querySelector(`[data-action="addEmployee"]`)?.addEventListener(`click`,rr),document.getElementById(`employeesList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-emp-delete]`);if(t){ir(t.dataset.empDelete||``);return}}),document.getElementById(`employeesList`)?.addEventListener(`change`,e=>{let t=e.target,n=t.closest(`[data-emp-name]`);if(n){Q(n.dataset.empName||``,{name:t.value});return}let r=t.closest(`[data-emp-cli]`);if(r){ar(r.dataset.empCli||``,t.value);return}let i=t.closest(`[data-emp-model]`);if(i){if(t.value===`__custom__`){let e=prompt(p(`model.promptInput`));if(e?.trim()){let n=document.createElement(`option`);n.value=e.trim(),n.textContent=e.trim();let r=t.querySelector(`option[value="__custom__"]`);r&&t.insertBefore(n,r),t.value=e.trim(),Q(i.dataset.empModel||``,{model:e.trim()})}else t.value=`default`}else Q(i.dataset.empModel||``,{model:t.value});return}let a=t.closest(`[data-emp-role]`);if(a){or(a.dataset.empRole||``,t.value);return}let o=t.closest(`[data-emp-custom]`);if(o){Q(o.dataset.empCustom||``,{role:t.value});return}}),document.getElementById(`skillsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-skill-id]`);t&&at(t.dataset.skillId||``,t.dataset.skillEnabled===`true`)}),document.querySelector(`#tabSkills`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.skill-filter`);t&&st(t.dataset.filter||`all`,t)}),document.getElementById(`skillSearchInput`)?.addEventListener(`input`,e=>{ot(e.target.value)}),document.querySelector(`[data-action="openPrompt"]`)?.addEventListener(`click`,Qe),document.getElementById(`tgOff`)?.addEventListener(`click`,()=>Ie(!1)),document.getElementById(`tgOn`)?.addEventListener(`click`,()=>Ie(!0)),document.getElementById(`tgForwardOff`)?.addEventListener(`click`,()=>Me(!1)),document.getElementById(`tgForwardOn`)?.addEventListener(`click`,()=>Me(!0)),document.getElementById(`tgMentionOff`)?.addEventListener(`click`,()=>it(!1)),document.getElementById(`tgMentionOn`)?.addEventListener(`click`,()=>it(!0)),document.getElementById(`tgToken`)?.addEventListener(`change`,je),document.getElementById(`tgChatIds`)?.addEventListener(`change`,je),document.getElementById(`chTelegram`)?.addEventListener(`click`,()=>De(`telegram`)),document.getElementById(`chDiscord`)?.addEventListener(`click`,()=>De(`discord`)),document.getElementById(`dcOff`)?.addEventListener(`click`,()=>Ne(!1)),document.getElementById(`dcOn`)?.addEventListener(`click`,()=>Ne(!0)),document.getElementById(`dcForwardOff`)?.addEventListener(`click`,()=>Fe(!1)),document.getElementById(`dcForwardOn`)?.addEventListener(`click`,()=>Fe(!0)),document.getElementById(`dcAllowBotsOff`)?.addEventListener(`click`,()=>Pe(!1)),document.getElementById(`dcAllowBotsOn`)?.addEventListener(`click`,()=>Pe(!0)),document.getElementById(`dcMentionOff`)?.addEventListener(`click`,()=>Ae(!1)),document.getElementById(`dcMentionOn`)?.addEventListener(`click`,()=>Ae(!0)),document.getElementById(`dcToken`)?.addEventListener(`change`,Ke),document.getElementById(`dcGuildId`)?.addEventListener(`change`,Ke),document.getElementById(`dcChannelIds`)?.addEventListener(`change`,Ke),document.getElementById(`fallbackOrderList`)?.addEventListener(`change`,qe);function cr(e){let t=document.getElementById(`codexFastOn`),n=document.getElementById(`codexFastOff`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),_()}document.getElementById(`codexFastOn`)?.addEventListener(`click`,()=>cr(!0)),document.getElementById(`codexFastOff`)?.addEventListener(`click`,()=>cr(!1));function lr(e){let t=document.getElementById(`codexCtxOn`),n=document.getElementById(`codexCtxOff`),r=document.getElementById(`codexCtxValues`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),r&&(r.style.display=e?``:`none`),_()}document.getElementById(`codexCtxOn`)?.addEventListener(`click`,()=>lr(!0)),document.getElementById(`codexCtxOff`)?.addEventListener(`click`,()=>lr(!1)),document.getElementById(`codexCtxWindow`)?.addEventListener(`change`,_),document.getElementById(`codexCtxCompact`)?.addEventListener(`change`,_);function ur(e){let t=document.getElementById(`claude1mOn`),n=document.getElementById(`claude1mOff`),r=document.getElementById(`modelClaude`),i=e;if(r){let t=r.value||``;if(e&&!t.endsWith(`[1m]`)){let e=t+`[1m]`;Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!1}else if(!e&&t.endsWith(`[1m]`)){let e=t.replace(/\[1m\]$/,``);Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!0}else i=t.endsWith(`[1m]`)}t&&n&&(t.classList.toggle(`active`,i),n.classList.toggle(`active`,!i)),_()}document.getElementById(`claude1mOn`)?.addEventListener(`click`,()=>ur(!0)),document.getElementById(`claude1mOff`)?.addEventListener(`click`,()=>ur(!1));function dr(){for(let e of Ee()){let t=e.charAt(0).toUpperCase()+e.slice(1),n=document.getElementById(`model`+t);n&&n.addEventListener(`change`,function(){Ye(e,this)});let r=document.getElementById(`customModel`+t);r&&r.addEventListener(`change`,function(){He(e,this)});let i=document.getElementById(`effort`+t);i&&i.addEventListener(`change`,_)}}document.querySelector(`[data-action="syncMcp"]`)?.addEventListener(`click`,ke),document.querySelector(`[data-action="installMcp"]`)?.addEventListener(`click`,Le),document.querySelector(`[data-action="refreshCli"]`)?.addEventListener(`click`,()=>Je(!0)),document.getElementById(`cliStatusInterval`)?.addEventListener(`change`,function(){Ve(this.value)}),document.getElementById(`promptModal`)?.addEventListener(`click`,e=>v(e)),document.querySelector(`#promptModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePrompt"]`)?.addEventListener(`click`,()=>v()),document.querySelector(`[data-action="cancelPrompt"]`)?.addEventListener(`click`,()=>v()),document.querySelector(`[data-action="savePrompt"]`)?.addEventListener(`click`,ze),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&!n.isRecording&&v()}),document.querySelector(`[data-action="openTemplates"]`)?.addEventListener(`click`,Ge),document.querySelector(`[data-action="saveTemplate"]`)?.addEventListener(`click`,Ze),document.querySelector(`[data-action="closeTemplate"]`)?.addEventListener(`click`,()=>Xe()),document.getElementById(`templateModal`)?.addEventListener(`click`,e=>Xe(e)),document.querySelector(`#templateModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.getElementById(`templateBack`)?.addEventListener(`click`,$e),document.getElementById(`templateDevToggle`)?.addEventListener(`click`,Be),document.getElementById(`heartbeatModal`)?.addEventListener(`click`,e=>qt(e)),document.querySelector(`#heartbeatModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeHeartbeat"]`)?.addEventListener(`click`,()=>qt()),document.querySelector(`[data-action="addHeartbeat"]`)?.addEventListener(`click`,Jt),document.getElementById(`hbJobsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-hb-toggle]`);if(t){Xt(+(t.dataset.hbToggle||`0`));return}let n=e.target?.closest(`[data-hb-remove]`);if(n){Yt(+(n.dataset.hbRemove||`0`));return}}),document.getElementById(`hbJobsList`)?.addEventListener(`change`,e=>{let t=e.target,r=t.closest(`[data-hb-name]`);if(r){n.heartbeatJobs[+(r.dataset.hbName||`0`)].name=t.value,E();return}let i=t.closest(`[data-hb-kind]`);if(i){let e=+(i.dataset.hbKind||`0`),r=n.heartbeatJobs[e]?.schedule,a=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule=t.value===`cron`?{kind:`cron`,cron:typeof r?.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...a?{timeZone:a}:{}}:{kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...a?{timeZone:a}:{}},T(),E();return}let a=t.closest(`[data-hb-minutes]`);if(a){let e=+(a.dataset.hbMinutes||`0`),r=n.heartbeatJobs[e]?.schedule,i=Math.max(1,Math.floor(Number(t.value)||5)),o=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule={kind:`every`,minutes:i,...o?{timeZone:o}:{}},T(),E();return}let o=t.closest(`[data-hb-cron]`);if(o){let e=+(o.dataset.hbCron||`0`),r=n.heartbeatJobs[e]?.schedule,i=typeof r?.timeZone==`string`?r.timeZone:void 0,a=t.value.trim().replace(/\s+/g,` `);n.heartbeatJobs[e].schedule={kind:`cron`,cron:a,...i?{timeZone:i}:{}},T(),E();return}let s=t.closest(`[data-hb-timezone]`);if(s){let e=+(s.dataset.hbTimezone||`0`),r=n.heartbeatJobs[e]?.schedule;r?.kind===`cron`?n.heartbeatJobs[e].schedule={kind:`cron`,cron:typeof r.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...t.value.trim()?{timeZone:t.value.trim()}:{}}:n.heartbeatJobs[e].schedule={kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...t.value.trim()?{timeZone:t.value.trim()}:{}},T(),E();return}let c=t.closest(`[data-hb-prompt]`);if(c){n.heartbeatJobs[+(c.dataset.hbPrompt||`0`)].prompt=t.value,E();return}}),document.getElementById(`memoryModal`)?.addEventListener(`click`,e=>yt(e)),document.querySelector(`#memoryModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeMemory"]`)?.addEventListener(`click`,()=>yt()),document.getElementById(`memTabBtnSettings`)?.addEventListener(`click`,()=>bt(`settings`)),document.getElementById(`memTabBtnAdvOps`)?.addEventListener(`click`,()=>bt(`status`)),document.getElementById(`memTabBtnFiles`)?.addEventListener(`click`,()=>bt(`files`)),document.getElementById(`memOn`)?.addEventListener(`click`,()=>ft(!0)),document.getElementById(`memOff`)?.addEventListener(`click`,()=>ft(!1)),document.getElementById(`memFlushEvery`)?.addEventListener(`change`,y),document.getElementById(`memRetention`)?.addEventListener(`change`,y),document.getElementById(`memFlushLang`)?.addEventListener(`change`,y),document.getElementById(`memFlushNowBtn`)?.addEventListener(`click`,ut),document.getElementById(`advBootstrapBtn`)?.addEventListener(`click`,vt),document.getElementById(`advReindexBtn`)?.addEventListener(`click`,ht),document.getElementById(`advReimportBtn`)?.addEventListener(`click`,vt),document.getElementById(`advOpenCorruptedBtn`)?.addEventListener(`click`,_t),document.getElementById(`advStatusBanner`)?.addEventListener(`click`,e=>{e.target?.id===`advUpgradeSoulBtn`&&gt(),e.target?.id===`advSynthesizeSoulBtn`&&lt()}),document.getElementById(`basicMemoryFiles`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-mem-delete]`);if(t){e.stopPropagation(),mt(t.dataset.memDelete||``);return}let n=e.target?.closest(`[data-mem-view]`);if(n){pt(n.dataset.memView||``);return}if(e.target?.closest(`[data-mem-back]`)){dt();return}});async function fr(){te(),nt(),hn(),await c();let e=document.getElementById(`langSelect`);e&&(e.value=d()),await Te(),dr(),Kn(),pe(),_e(),Nt(),Mt(),await ye(),await Ue(),We(),Je(),et(),nr(),Zt(),ct(),le(),await ae(),cn(),se(),En();try{sessionStorage.removeItem(er)}catch{}ee(),`serviceWorker`in navigator&&navigator.serviceWorker.register(`/sw.js`).catch(()=>{})}fr().catch(e=>{console.error(`[bootstrap]`,e)}),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`){if(n.isRecording){e.preventDefault(),In();return}document.querySelectorAll(`.modal-overlay.open`).forEach(e=>{e.classList.remove(`open`)})}(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.code===`Space`&&(e.preventDefault(),Ln())}),document.getElementById(`mobileMenuLeft`)?.addEventListener(`click`,F),document.getElementById(`mobileMenuRight`)?.addEventListener(`click`,I);