cli-jaw 2.2.15 → 2.2.17

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 (425) hide show
  1. package/README.md +23 -2
  2. package/dist/bin/cli-jaw.js +39 -0
  3. package/dist/bin/cli-jaw.js.map +1 -1
  4. package/dist/bin/commands/_shared/dashboard-client.js +42 -0
  5. package/dist/bin/commands/_shared/dashboard-client.js.map +1 -0
  6. package/dist/bin/commands/_shared/search-format.js +40 -0
  7. package/dist/bin/commands/_shared/search-format.js.map +1 -0
  8. package/dist/bin/commands/chat-search.js +5 -3
  9. package/dist/bin/commands/chat-search.js.map +1 -1
  10. package/dist/bin/commands/dashboard-chat.js +14 -31
  11. package/dist/bin/commands/dashboard-chat.js.map +1 -1
  12. package/dist/bin/commands/dashboard-memory.js +12 -49
  13. package/dist/bin/commands/dashboard-memory.js.map +1 -1
  14. package/dist/bin/commands/doctor.js +56 -11
  15. package/dist/bin/commands/doctor.js.map +1 -1
  16. package/dist/bin/commands/init.js +31 -1
  17. package/dist/bin/commands/init.js.map +1 -1
  18. package/dist/bin/commands/memory.js +5 -1
  19. package/dist/bin/commands/memory.js.map +1 -1
  20. package/dist/bin/commands/provider.js +23 -0
  21. package/dist/bin/commands/provider.js.map +1 -1
  22. package/dist/bin/commands/slack.js +57 -3
  23. package/dist/bin/commands/slack.js.map +1 -1
  24. package/dist/bin/commands/tui/input-handler.js +1 -1
  25. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  26. package/dist/bin/commands/tui/slash-command-runner.js +4 -5
  27. package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
  28. package/dist/bin/postinstall.js +16 -18
  29. package/dist/bin/postinstall.js.map +1 -1
  30. package/dist/lib/media-kind.js +28 -0
  31. package/dist/lib/media-kind.js.map +1 -0
  32. package/dist/lib/upload.js +27 -10
  33. package/dist/lib/upload.js.map +1 -1
  34. package/dist/server.js +35 -51
  35. package/dist/server.js.map +1 -1
  36. package/dist/src/agent/args.js +34 -0
  37. package/dist/src/agent/args.js.map +1 -1
  38. package/dist/src/agent/codex-app-client.js +1016 -135
  39. package/dist/src/agent/codex-app-client.js.map +1 -1
  40. package/dist/src/agent/codex-app-events.js +72 -1
  41. package/dist/src/agent/codex-app-events.js.map +1 -1
  42. package/dist/src/agent/codex-host-pool.js +617 -0
  43. package/dist/src/agent/codex-host-pool.js.map +1 -0
  44. package/dist/src/agent/jwc-runtime.js +12 -4
  45. package/dist/src/agent/jwc-runtime.js.map +1 -1
  46. package/dist/src/agent/kiro-auth.js +10 -4
  47. package/dist/src/agent/kiro-auth.js.map +1 -1
  48. package/dist/src/agent/kiro-runtime.js +45 -8
  49. package/dist/src/agent/kiro-runtime.js.map +1 -1
  50. package/dist/src/agent/lifecycle-handler.js +75 -52
  51. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  52. package/dist/src/agent/memory-flush-controller.js +241 -33
  53. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  54. package/dist/src/agent/prompt-context.js +4 -0
  55. package/dist/src/agent/prompt-context.js.map +1 -1
  56. package/dist/src/agent/runtime-pool.js +64 -34
  57. package/dist/src/agent/runtime-pool.js.map +1 -1
  58. package/dist/src/agent/session-persistence.js +71 -15
  59. package/dist/src/agent/session-persistence.js.map +1 -1
  60. package/dist/src/agent/spawn/queue.js +319 -162
  61. package/dist/src/agent/spawn/queue.js.map +1 -1
  62. package/dist/src/agent/spawn.js +581 -268
  63. package/dist/src/agent/spawn.js.map +1 -1
  64. package/dist/src/bgtask/types.js +1 -1
  65. package/dist/src/bgtask/types.js.map +1 -1
  66. package/dist/src/browser/adaptive-fetch/safety.js +25 -0
  67. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
  68. package/dist/src/browser/connection.js +2 -8
  69. package/dist/src/browser/connection.js.map +1 -1
  70. package/dist/src/cli/capability-probe-worker.js +172 -0
  71. package/dist/src/cli/capability-probe-worker.js.map +1 -0
  72. package/dist/src/cli/capability-probe.js +83 -0
  73. package/dist/src/cli/capability-probe.js.map +1 -0
  74. package/dist/src/cli/claude-models.js +2 -2
  75. package/dist/src/cli/claude-models.js.map +1 -1
  76. package/dist/src/cli/cli-status-worker.js +296 -0
  77. package/dist/src/cli/cli-status-worker.js.map +1 -0
  78. package/dist/src/cli/cli-status.js +81 -0
  79. package/dist/src/cli/cli-status.js.map +1 -0
  80. package/dist/src/cli/command-context.js +17 -5
  81. package/dist/src/cli/command-context.js.map +1 -1
  82. package/dist/src/cli/compact.js +56 -19
  83. package/dist/src/cli/compact.js.map +1 -1
  84. package/dist/src/cli/handlers-runtime.js +6 -4
  85. package/dist/src/cli/handlers-runtime.js.map +1 -1
  86. package/dist/src/cli/handlers.js +7 -2
  87. package/dist/src/cli/handlers.js.map +1 -1
  88. package/dist/src/cli/opencodex-models.js +5 -32
  89. package/dist/src/cli/opencodex-models.js.map +1 -1
  90. package/dist/src/cli/opencodex-runtime.js +82 -0
  91. package/dist/src/cli/opencodex-runtime.js.map +1 -0
  92. package/dist/src/cli/readiness.js +35 -18
  93. package/dist/src/cli/readiness.js.map +1 -1
  94. package/dist/src/cli/registry-live.js +8 -2
  95. package/dist/src/cli/registry-live.js.map +1 -1
  96. package/dist/src/cli/registry.js +1 -1
  97. package/dist/src/cli/registry.js.map +1 -1
  98. package/dist/src/core/browser-open-default.js +6 -4
  99. package/dist/src/core/browser-open-default.js.map +1 -1
  100. package/dist/src/core/browser-open.js +11 -15
  101. package/dist/src/core/browser-open.js.map +1 -1
  102. package/dist/src/core/bus.js +7 -1
  103. package/dist/src/core/bus.js.map +1 -1
  104. package/dist/src/core/chat-sessions.js +121 -12
  105. package/dist/src/core/chat-sessions.js.map +1 -1
  106. package/dist/src/core/cli-detect.js +148 -4
  107. package/dist/src/core/cli-detect.js.map +1 -1
  108. package/dist/src/core/codex-config.js +21 -0
  109. package/dist/src/core/codex-config.js.map +1 -1
  110. package/dist/src/core/compact.js +73 -21
  111. package/dist/src/core/compact.js.map +1 -1
  112. package/dist/src/core/config.js +449 -20
  113. package/dist/src/core/config.js.map +1 -1
  114. package/dist/src/core/db.js +225 -0
  115. package/dist/src/core/db.js.map +1 -1
  116. package/dist/src/core/event-bus.js +49 -4
  117. package/dist/src/core/event-bus.js.map +1 -1
  118. package/dist/src/core/event-scope.js +100 -0
  119. package/dist/src/core/event-scope.js.map +1 -0
  120. package/dist/src/core/install-integrity.js +176 -0
  121. package/dist/src/core/install-integrity.js.map +1 -0
  122. package/dist/src/core/main-session.js +64 -21
  123. package/dist/src/core/main-session.js.map +1 -1
  124. package/dist/src/core/message-summary.js +12 -2
  125. package/dist/src/core/message-summary.js.map +1 -1
  126. package/dist/src/core/platform-kind.js +139 -0
  127. package/dist/src/core/platform-kind.js.map +1 -0
  128. package/dist/src/core/rate-limit.js +156 -0
  129. package/dist/src/core/rate-limit.js.map +1 -0
  130. package/dist/src/core/runtime-settings.js +165 -17
  131. package/dist/src/core/runtime-settings.js.map +1 -1
  132. package/dist/src/core/session-context.js +7 -0
  133. package/dist/src/core/session-context.js.map +1 -0
  134. package/dist/src/core/session-ops.js +53 -9
  135. package/dist/src/core/session-ops.js.map +1 -1
  136. package/dist/src/core/settings-merge.js +105 -3
  137. package/dist/src/core/settings-merge.js.map +1 -1
  138. package/dist/src/core/settings-watch.js +29 -5
  139. package/dist/src/core/settings-watch.js.map +1 -1
  140. package/dist/src/core/widget-watcher.js +15 -2
  141. package/dist/src/core/widget-watcher.js.map +1 -1
  142. package/dist/src/discord/bot.js +5 -2
  143. package/dist/src/discord/bot.js.map +1 -1
  144. package/dist/src/discord/commands.js +4 -4
  145. package/dist/src/discord/commands.js.map +1 -1
  146. package/dist/src/goal/heartbeat.js +1 -1
  147. package/dist/src/goal/heartbeat.js.map +1 -1
  148. package/dist/src/goal/runtime.js +1 -1
  149. package/dist/src/goal/runtime.js.map +1 -1
  150. package/dist/src/goal-run/controller.js +2 -2
  151. package/dist/src/goal-run/controller.js.map +1 -1
  152. package/dist/src/manager/internal-fetch.js +15 -0
  153. package/dist/src/manager/internal-fetch.js.map +1 -0
  154. package/dist/src/manager/logs.js +2 -1
  155. package/dist/src/manager/logs.js.map +1 -1
  156. package/dist/src/manager/memory/chat-federation.js +104 -11
  157. package/dist/src/manager/memory/chat-federation.js.map +1 -1
  158. package/dist/src/manager/memory/federation.js +100 -0
  159. package/dist/src/manager/memory/federation.js.map +1 -1
  160. package/dist/src/manager/metadata.js +4 -1
  161. package/dist/src/manager/metadata.js.map +1 -1
  162. package/dist/src/manager/notes/assets.js +1 -1
  163. package/dist/src/manager/notes/assets.js.map +1 -1
  164. package/dist/src/manager/notes/frontmatter.js +5 -49
  165. package/dist/src/manager/notes/frontmatter.js.map +1 -1
  166. package/dist/src/manager/notes/link-resolver.js +2 -2
  167. package/dist/src/manager/notes/link-resolver.js.map +1 -1
  168. package/dist/src/manager/notes/remote-assets.js +1 -1
  169. package/dist/src/manager/notes/remote-assets.js.map +1 -1
  170. package/dist/src/manager/notes/routes.js +2 -2
  171. package/dist/src/manager/notes/routes.js.map +1 -1
  172. package/dist/src/manager/notes/store.js +2 -2
  173. package/dist/src/manager/notes/store.js.map +1 -1
  174. package/dist/src/manager/notes/trash.js +1 -1
  175. package/dist/src/manager/notes/trash.js.map +1 -1
  176. package/dist/src/manager/notes/vault-index.js +2 -2
  177. package/dist/src/manager/notes/vault-index.js.map +1 -1
  178. package/dist/src/manager/notes/wiki-links.js +1 -1
  179. package/dist/src/manager/notes/wiki-links.js.map +1 -1
  180. package/dist/src/manager/notes/wiki-routes.js +84 -0
  181. package/dist/src/manager/notes/wiki-routes.js.map +1 -0
  182. package/dist/src/manager/proxy.js +1 -0
  183. package/dist/src/manager/proxy.js.map +1 -1
  184. package/dist/src/manager/routes/dashboard-memory.js +24 -1
  185. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  186. package/dist/src/manager/routes/runtime-monitor.js +1 -1
  187. package/dist/src/manager/routes/runtime-monitor.js.map +1 -1
  188. package/dist/src/manager/scan.js +5 -3
  189. package/dist/src/manager/scan.js.map +1 -1
  190. package/dist/src/manager/server.js +20 -6
  191. package/dist/src/manager/server.js.map +1 -1
  192. package/dist/src/manager/telegram-hub/hub-bot.js +4 -3
  193. package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
  194. package/dist/src/manager/worker-events.js +2 -1
  195. package/dist/src/manager/worker-events.js.map +1 -1
  196. package/dist/src/memory/heartbeat.js +6 -5
  197. package/dist/src/memory/heartbeat.js.map +1 -1
  198. package/dist/src/memory/indexing.js +162 -45
  199. package/dist/src/memory/indexing.js.map +1 -1
  200. package/dist/src/messaging/channel-validate.js +14 -1
  201. package/dist/src/messaging/channel-validate.js.map +1 -1
  202. package/dist/src/messaging/redact.js +2 -1
  203. package/dist/src/messaging/redact.js.map +1 -1
  204. package/dist/src/messaging/session-key.js +21 -2
  205. package/dist/src/messaging/session-key.js.map +1 -1
  206. package/dist/src/notes/constants.js.map +1 -0
  207. package/dist/src/notes/frontmatter.js +59 -0
  208. package/dist/src/notes/frontmatter.js.map +1 -0
  209. package/dist/src/notes/path-guards.js.map +1 -0
  210. package/dist/src/notes/search.js.map +1 -0
  211. package/dist/src/orchestrator/attestation.js +1 -1
  212. package/dist/src/orchestrator/attestation.js.map +1 -1
  213. package/dist/src/orchestrator/gateway.js +135 -31
  214. package/dist/src/orchestrator/gateway.js.map +1 -1
  215. package/dist/src/orchestrator/pipeline.js +53 -21
  216. package/dist/src/orchestrator/pipeline.js.map +1 -1
  217. package/dist/src/orchestrator/scope.js +36 -2
  218. package/dist/src/orchestrator/scope.js.map +1 -1
  219. package/dist/src/orchestrator/session-lanes.js +87 -0
  220. package/dist/src/orchestrator/session-lanes.js.map +1 -0
  221. package/dist/src/orchestrator/session-work.js +25 -0
  222. package/dist/src/orchestrator/session-work.js.map +1 -0
  223. package/dist/src/orchestrator/state-machine.js +1 -5
  224. package/dist/src/orchestrator/state-machine.js.map +1 -1
  225. package/dist/src/orchestrator/worker-registry.js +20 -10
  226. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  227. package/dist/src/prompt/builder.js +40 -2
  228. package/dist/src/prompt/builder.js.map +1 -1
  229. package/dist/src/prompt/templates/a1-system.md +8 -1
  230. package/dist/src/routes/agent-control.js +44 -8
  231. package/dist/src/routes/agent-control.js.map +1 -1
  232. package/dist/src/routes/chat-sessions.js +34 -6
  233. package/dist/src/routes/chat-sessions.js.map +1 -1
  234. package/dist/src/routes/command.js +63 -8
  235. package/dist/src/routes/command.js.map +1 -1
  236. package/dist/src/routes/events.js +11 -2
  237. package/dist/src/routes/events.js.map +1 -1
  238. package/dist/src/routes/link-preview.js +1 -27
  239. package/dist/src/routes/link-preview.js.map +1 -1
  240. package/dist/src/routes/messages.js +6 -5
  241. package/dist/src/routes/messages.js.map +1 -1
  242. package/dist/src/routes/messaging.js +45 -1
  243. package/dist/src/routes/messaging.js.map +1 -1
  244. package/dist/src/routes/orchestrate.js +53 -33
  245. package/dist/src/routes/orchestrate.js.map +1 -1
  246. package/dist/src/routes/search.js +84 -0
  247. package/dist/src/routes/search.js.map +1 -0
  248. package/dist/src/routes/session-request.js +29 -0
  249. package/dist/src/routes/session-request.js.map +1 -0
  250. package/dist/src/routes/settings.js +110 -3
  251. package/dist/src/routes/settings.js.map +1 -1
  252. package/dist/src/routes/static.js +30 -8
  253. package/dist/src/routes/static.js.map +1 -1
  254. package/dist/src/routes/system.js +1 -1
  255. package/dist/src/routes/system.js.map +1 -1
  256. package/dist/src/routes/wiki.js +122 -0
  257. package/dist/src/routes/wiki.js.map +1 -0
  258. package/dist/src/search/contract.js +2 -0
  259. package/dist/src/search/contract.js.map +1 -0
  260. package/dist/src/search/coordinator.js +153 -0
  261. package/dist/src/search/coordinator.js.map +1 -0
  262. package/dist/src/search/provider.js +40 -0
  263. package/dist/src/search/provider.js.map +1 -0
  264. package/dist/src/search/providers/chat.js +115 -0
  265. package/dist/src/search/providers/chat.js.map +1 -0
  266. package/dist/src/search/providers/memory.js +53 -0
  267. package/dist/src/search/providers/memory.js.map +1 -0
  268. package/dist/src/search/providers/wiki.js +80 -0
  269. package/dist/src/search/providers/wiki.js.map +1 -0
  270. package/dist/src/slack/api.js +10 -1
  271. package/dist/src/slack/api.js.map +1 -1
  272. package/dist/src/slack/attachment-recovery.js +42 -0
  273. package/dist/src/slack/attachment-recovery.js.map +1 -0
  274. package/dist/src/slack/bot.js +120 -41
  275. package/dist/src/slack/bot.js.map +1 -1
  276. package/dist/src/slack/commands.js +24 -8
  277. package/dist/src/slack/commands.js.map +1 -1
  278. package/dist/src/slack/events.js +12 -1
  279. package/dist/src/slack/events.js.map +1 -1
  280. package/dist/src/slack/history.js +108 -0
  281. package/dist/src/slack/history.js.map +1 -0
  282. package/dist/src/slack/inbound-file.js +242 -0
  283. package/dist/src/slack/inbound-file.js.map +1 -0
  284. package/dist/src/slack/inbound-url.js +39 -0
  285. package/dist/src/slack/inbound-url.js.map +1 -0
  286. package/dist/src/slack/ingress.js +140 -0
  287. package/dist/src/slack/ingress.js.map +1 -0
  288. package/dist/src/slack/manifest.js +3 -0
  289. package/dist/src/slack/manifest.js.map +1 -1
  290. package/dist/src/slack/socket.js +1 -1
  291. package/dist/src/slack/socket.js.map +1 -1
  292. package/dist/src/slack/thread-tracker.js +86 -0
  293. package/dist/src/slack/thread-tracker.js.map +1 -0
  294. package/dist/src/telegram/bot.js +21 -11
  295. package/dist/src/telegram/bot.js.map +1 -1
  296. package/dist/src/wiki/config.js +193 -0
  297. package/dist/src/wiki/config.js.map +1 -0
  298. package/dist/src/wiki/entities.js +61 -0
  299. package/dist/src/wiki/entities.js.map +1 -0
  300. package/dist/src/wiki/ontology.js +72 -0
  301. package/dist/src/wiki/ontology.js.map +1 -0
  302. package/dist/src/wiki/prompt.js +172 -0
  303. package/dist/src/wiki/prompt.js.map +1 -0
  304. package/dist/src/wiki/safe-traversal.js +198 -0
  305. package/dist/src/wiki/safe-traversal.js.map +1 -0
  306. package/dist/src/wiki/scaffold.js +77 -0
  307. package/dist/src/wiki/scaffold.js.map +1 -0
  308. package/package.json +6 -5
  309. package/public/css/session-hub.css +266 -0
  310. package/public/dist/assets/AdvancedExport-DYGcCAUq.js +1 -0
  311. package/public/dist/assets/Agent-CNNQ7KkJ.js +1 -0
  312. package/public/dist/assets/{DesignPanel-BGMPhZSx.js → DesignPanel-DcL369nB.js} +1 -1
  313. package/public/dist/assets/{DocPanel-Dz-J_l5M.js → DocPanel-K8A2pm_1.js} +1 -1
  314. package/public/dist/assets/{FolderPanel-DbPhzzvi.js → FolderPanel-CV52EzwG.js} +1 -1
  315. package/public/dist/assets/{MilkdownWysiwygEditor-Em7iC6y9.js → MilkdownWysiwygEditor-BKOCDI4Z.js} +1 -1
  316. package/public/dist/assets/api-B25zNNFJ.js +1 -0
  317. package/public/dist/assets/{app-DX4e6isX.css → app-DjgGeXhJ.css} +1 -1
  318. package/public/dist/assets/app-Dsgp4xpU.js +55 -0
  319. package/public/dist/assets/bgtask-badge-C6h5C-o4.js +1 -0
  320. package/public/dist/assets/{bgtask-badge-qMkKOZx0.js → bgtask-badge-CpavV0Jc.js} +4 -4
  321. package/public/dist/assets/{employees-BnobWM_2.js → employees-BJyEgim7.js} +4 -4
  322. package/public/dist/assets/idb-cache-B5PX63p7.js +1 -0
  323. package/public/dist/assets/{idb-cache-BzzftUET.js → idb-cache-lOntwU3S.js} +1 -1
  324. package/public/dist/assets/{iframe-renderer-C5vRbbl9.js → iframe-renderer-B8k3AvTv.js} +12 -12
  325. package/public/dist/assets/iframe-renderer-BO_GgCTR.js +1 -0
  326. package/public/dist/assets/manager-LkGs6qEJ.css +1 -0
  327. package/public/dist/assets/manager-kXYQyMhR.js +13 -0
  328. package/public/dist/assets/{memory-DF4kPwwC.js → memory-D2RbBVO-.js} +11 -11
  329. package/public/dist/assets/memory-amsvg4Ey.js +1 -0
  330. package/public/dist/assets/message-history-BGHZxvgV.js +1 -0
  331. package/public/dist/assets/message-history-Bw2E_b8L.js +1 -0
  332. package/public/dist/assets/pi-settings-5HVg1sXJ.js +1 -0
  333. package/public/dist/assets/render-BkGcpH7z.js +157 -0
  334. package/public/dist/assets/settings-B1FPORO2.js +56 -0
  335. package/public/dist/assets/settings-CMN-zN4Q.js +1 -0
  336. package/public/dist/assets/settings-core-B_OjGYVN.js +1 -0
  337. package/public/dist/assets/settings-core-CxRwqx86.js +144 -0
  338. package/public/dist/assets/sidebar-DW78DANx.js +49 -0
  339. package/public/dist/assets/skills-Dz-9Yrxr.js +1 -0
  340. package/public/dist/assets/{skills-IGquen_j.js → skills-lWi0ZFiV.js} +6 -6
  341. package/public/dist/assets/{slash-commands-ZRDOL99E.js → slash-commands-DYOI6nKj.js} +1 -1
  342. package/public/dist/assets/slash-commands-xJFCdTTM.js +1 -0
  343. package/public/dist/assets/{trace-drawer-D8To8fYt.js → trace-drawer-DBX9xzmt.js} +1 -1
  344. package/public/dist/assets/{ui-Hx_mNoDf.js → ui-Bx7eqnXt.js} +1 -1
  345. package/public/dist/assets/ui-JOcrYeG-.js +1 -0
  346. package/public/dist/assets/{wiki-link-suggestions-DZQc78gj.js → wiki-link-suggestions-Dp6kBQVu.js} +1 -1
  347. package/public/dist/index.html +4 -4
  348. package/public/dist/manager/index.html +2 -2
  349. package/public/index.html +3 -2
  350. package/public/js/event-channel.ts +25 -0
  351. package/public/js/features/channel-onboarding-flow.ts +16 -1
  352. package/public/js/features/channel-onboarding.ts +20 -2
  353. package/public/js/features/chat-messages.ts +3 -1
  354. package/public/js/features/chat-search.ts +2 -1
  355. package/public/js/features/chat.ts +56 -18
  356. package/public/js/features/elicitation.ts +15 -0
  357. package/public/js/features/idb-cache.ts +34 -0
  358. package/public/js/features/message-history.ts +2 -1
  359. package/public/js/features/session-hub.ts +334 -0
  360. package/public/js/features/settings-cli-status-render.ts +1 -1
  361. package/public/js/features/settings-cli-status.ts +25 -11
  362. package/public/js/features/settings-core.ts +72 -3
  363. package/public/js/features/settings-types.ts +32 -0
  364. package/public/js/features/ui-status.ts +2 -1
  365. package/public/js/main.ts +20 -0
  366. package/public/js/render/compose-block.ts +7 -0
  367. package/public/js/ws.ts +22 -2
  368. package/public/locales/en.json +46 -4
  369. package/public/locales/ja.json +46 -4
  370. package/public/locales/ko.json +46 -4
  371. package/public/locales/zh.json +46 -4
  372. package/public/manager/src/App.tsx +1 -1
  373. package/public/manager/src/InstancePreview.tsx +5 -1
  374. package/public/manager/src/api.ts +2 -1
  375. package/public/manager/src/components/InstanceGroups.tsx +10 -0
  376. package/public/manager/src/components/InstanceListContent.tsx +24 -1
  377. package/public/manager/src/components/InstanceRow.tsx +33 -3
  378. package/public/manager/src/components/InstanceSessionList.tsx +132 -0
  379. package/public/manager/src/hooks/useActiveSessionDisclosure.ts +45 -0
  380. package/public/manager/src/lib/resilient-fetch.ts +93 -0
  381. package/public/manager/src/lib/session-store.ts +216 -0
  382. package/public/manager/src/manager-components.css +97 -0
  383. package/public/manager/src/settings/pages/AdvancedExport.tsx +12 -2
  384. package/public/manager/src/settings/pages/Agent.tsx +113 -1
  385. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +1 -1
  386. package/scripts/bundle-sidecar.sh +50 -2
  387. package/scripts/burst-scenario.mjs +72 -0
  388. package/scripts/check-redaction-sinks.mjs +1 -0
  389. package/scripts/check-strict-baseline.mjs +1 -1
  390. package/scripts/ensure-native-modules.cjs +50 -3
  391. package/scripts/install-risk-gate.mjs +8 -0
  392. package/scripts/install-wsl.sh +27 -2
  393. package/scripts/install.ps1 +121 -0
  394. package/scripts/install.sh +28 -2
  395. package/scripts/postinstall-guard.cjs +44 -2
  396. package/scripts/release-gates.mjs +12 -0
  397. package/dist/src/manager/notes/constants.js.map +0 -1
  398. package/dist/src/manager/notes/path-guards.js.map +0 -1
  399. package/dist/src/manager/notes/search.js.map +0 -1
  400. package/public/dist/assets/AdvancedExport-DsDpqXoH.js +0 -1
  401. package/public/dist/assets/Agent-BjbZVZ9p.js +0 -1
  402. package/public/dist/assets/api-C9dOxby7.js +0 -1
  403. package/public/dist/assets/app-BzD_ZLvt.js +0 -55
  404. package/public/dist/assets/bgtask-badge-Dqbp-Y4e.js +0 -1
  405. package/public/dist/assets/idb-cache-ZH6lOebk.js +0 -1
  406. package/public/dist/assets/iframe-renderer-Df4KIVyx.js +0 -1
  407. package/public/dist/assets/manager-C4eNDNFt.css +0 -1
  408. package/public/dist/assets/manager-DaN201mN.js +0 -13
  409. package/public/dist/assets/memory-D-bULTHl.js +0 -1
  410. package/public/dist/assets/message-history-C4WOisGx.js +0 -1
  411. package/public/dist/assets/message-history-ZBoza6ew.js +0 -1
  412. package/public/dist/assets/pi-settings-CBUGDAuT.js +0 -1
  413. package/public/dist/assets/render-DYX6GRQ0.js +0 -122
  414. package/public/dist/assets/settings-DbJpGoaX.js +0 -55
  415. package/public/dist/assets/settings-SreihUje.js +0 -1
  416. package/public/dist/assets/settings-core-B1Y5Nb4Z.js +0 -1
  417. package/public/dist/assets/settings-core-DobZWIZ7.js +0 -140
  418. package/public/dist/assets/sidebar-Cp22g0Gv.js +0 -49
  419. package/public/dist/assets/skills-DwPIP08e.js +0 -1
  420. package/public/dist/assets/slash-commands-BBVfwcnW.js +0 -1
  421. package/public/dist/assets/ui-CAicpUZc.js +0 -1
  422. /package/dist/src/{manager/notes → notes}/constants.js +0 -0
  423. /package/dist/src/{manager/notes → notes}/path-guards.js +0 -0
  424. /package/dist/src/{manager/notes → notes}/search.js +0 -0
  425. /package/public/dist/assets/{pi-settings-Dh5lgb87.js → pi-settings-DEuKgvIj.js} +0 -0
@@ -1,140 +0,0 @@
1
- import{i as e,n as t,r as n}from"./api-tVoG39dL.js";import{T as r,j as i,m as a,x as o}from"./render-DYX6GRQ0.js";import{n as s}from"./locale-DC-ZsWOf.js";import{a as c,i as l,n as u,o as d,t as f}from"./constants-Df7-7Rky.js";import{a as p,c as m,l as ee,u as te}from"./pi-settings-Dh5lgb87.js";import{n as ne,r as re}from"./provider-icons-VDfahiUp.js";function ie(t){let n=document.getElementById(`sttEngine`),r=document.getElementById(`sttGeminiKey`),i=document.getElementById(`sttGeminiModel`),a=document.getElementById(`sttGeminiModelCustom`),o=document.getElementById(`sttWhisperModel`),s=document.getElementById(`sttOpenaiBaseUrl`),c=document.getElementById(`sttOpenaiKey`),l=document.getElementById(`sttOpenaiModel`),u=document.getElementById(`sttVertexJson`);if(n&&(n.value=t.engine||`auto`),r&&(r.placeholder=t.geminiKeySet?h(t.geminiKeyLast4):`AIza...`),i){let e=t.geminiModel||`gemini-2.5-flash-lite`;Array.from(i.options).some(t=>t.value===e)?i.value=e:(i.value=`__custom__`,a&&(a.value=e,a.style.display=``))}o&&(o.value=t.whisperModel||`mlx-community/whisper-large-v3-turbo`),s&&(s.value=t.openaiBaseUrl||``),c&&(c.placeholder=t.openaiKeySet?h(t.openaiKeyLast4):`sk-...`),l&&(l.value=t.openaiModel||``),u&&(u.value=t.vertexConfig||``);function d(){let e=n?.value||`auto`,t=e===`auto`||e===`gemini`,r=e===`openai`,i=e===`vertex`,a=e===`auto`||e===`whisper`;document.querySelectorAll(`.stt-gemini`).forEach(e=>e.style.display=t?``:`none`),document.querySelectorAll(`.stt-openai`).forEach(e=>e.style.display=r?``:`none`),document.querySelectorAll(`.stt-vertex`).forEach(e=>e.style.display=i?``:`none`),document.querySelectorAll(`.stt-whisper`).forEach(e=>e.style.display=a?``:`none`)}d();async function f(){let t={stt:{engine:n?.value||`auto`,geminiModel:(i?.value===`__custom__`?a?.value:i?.value)||`gemini-2.5-flash-lite`,whisperModel:o?.value||``,openaiBaseUrl:s?.value||``,openaiModel:l?.value||``,vertexConfig:u?.value||``}};r?.value&&(t.stt.geminiApiKey=r.value),c?.value&&(t.stt.openaiApiKey=c.value),console.log(`[stt] saving:`,{engine:t.stt.engine,hasGeminiKey:!!t.stt.geminiApiKey,hasOpenaiKey:!!t.stt.openaiApiKey});try{if(await e(`/api/settings`,`PUT`,t),r?.value){let e=r.value.slice(-4);r.value=``,r.placeholder=h(e)}if(c?.value){let e=c.value.slice(-4);c.value=``,c.placeholder=h(e)}}catch(e){console.error(`[stt] save failed:`,e)}}n?.addEventListener(`change`,()=>{d(),f()}),i?.addEventListener(`change`,()=>{a&&(a.style.display=i.value===`__custom__`?``:`none`),i.value!==`__custom__`&&f()}),a?.addEventListener(`blur`,f),r?.addEventListener(`blur`,()=>{r.value&&f()}),c?.addEventListener(`blur`,()=>{c.value&&f()}),s?.addEventListener(`blur`,f),l?.addEventListener(`blur`,f),o?.addEventListener(`blur`,f),u?.addEventListener(`blur`,f)}function h(e){return i(`stt.key.savedPlaceholder`,{last4:e||``})}function ae(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.configured==`boolean`&&typeof t.activeInbound==`boolean`&&typeof t.sendCapable==`boolean`}function oe(e){if(!e||typeof e!=`object`)return null;let t=e.channels;if(!t||typeof t!=`object`)return null;let n=t,r=n.activeInbound;if(r!==`telegram`&&r!==`discord`&&r!==`slack`||!ae(n.telegram)||!ae(n.discord))return null;let i=ae(n.slack)?n.slack:{configured:!1,activeInbound:!1,sendCapable:!1,reason:`unavailable`};return{activeInbound:r,telegram:n.telegram,discord:n.discord,slack:i}}function se(e){let t=[];return t.push(e.configured?i(`settings.channel.configured`):i(`settings.channel.notConfigured`)),e.sendCapable&&t.push(i(`settings.channel.sendCapable`)),e.activeInbound&&t.push(i(`settings.channel.activeInbound`)),t}function g(e,t,n){let a=se(t).map(e=>`<span class="transport-status-chip">${r(e)}</span>`).join(``),o=t.reason===`not_attach_instance`?`<p class="transport-status-hint">${r(i(`settings.channel.notAttachInstanceHint`))}</p>`:n&&t.configured&&t.sendCapable&&!t.activeInbound?`<p class="transport-status-hint">${r(i(`settings.channel.sendOnlyHint`))}</p>`:``;return`
2
- <div class="transport-status-block">
3
- <div class="transport-status-label">${r(e)}</div>
4
- <div class="transport-status-chips">${a}</div>
5
- ${o}
6
- </div>`}function ce(e,t){e.innerHTML=`
7
- <h4 class="section-title-row">
8
- <span><span data-icon="radio"></span> ${r(i(`settings.channel.statusTitle`))}</span>
9
- </h4>
10
- ${g(`Telegram`,t.telegram,!0)}
11
- ${g(`Discord`,t.discord,!0)}
12
- ${g(`Slack`,t.slack,!0)}
13
- `}async function _(){let e=document.getElementById(`channelTransportStatus`);if(e)try{let n=oe(await t(`/api/health`));if(!n){e.innerHTML=``,e.style.display=`none`;return}ce(e,n),e.style.display=``}catch{e.innerHTML=``,e.style.display=`none`}}var le={telegram:[{key:`botToken`,settingsId:`tgToken`,secret:!0,example:`8123456789:AAH...`}],discord:[{key:`botToken`,settingsId:`dcToken`,secret:!0,example:`MTIzNDU2Nzg5...`},{key:`guildId`,settingsId:`dcGuildId`,secret:!1,example:`123456789012345678`}],slack:[{key:`botToken`,settingsId:`slBotToken`,secret:!0,prefix:`xoxb-`,example:`xoxb-1234-5678-abcd...`},{key:`appToken`,settingsId:`slAppToken`,secret:!0,optional:!0,prefix:`xapp-`,example:`xapp-1-A01...`}]},ue={telegram:`https://t.me/BotFather`,discord:`https://discord.com/developers/applications`,slack:`https://api.slack.com/apps`};function de(e,t={}){return{channel:e,step:1,draft:{...t},validatedIdentity:null,validatedTeamId:``,error:null,missingScopes:[],saved:!1}}function v(e){return le[e]}function fe(e,t){for(let n of v(e)){let e=(t[n.key]||``).trim();if(!e){if(n.optional)continue;return n.key===`guildId`?`guild_required`:`token_required`}if(n.prefix&&!e.startsWith(n.prefix))return n.key===`appToken`?`app_prefix`:`bot_prefix`}return null}function y(e){return e.step===1?null:e.step===2?fe(e.channel,e.draft):e.step===3?e.validatedIdentity?null:`validation_required`:null}function pe(e){return e.step<4&&y(e)===null}function me(e){if(e.step>=4)return e;let t=y(e);return t?{...e,error:t}:{...e,step:e.step+1,error:null}}function he(e){return e.step<=1?e:{...e,step:e.step-1,error:null}}function ge(e,t,n){return(e.draft[t]??``)===n?e:{...e,draft:{...e.draft,[t]:n},validatedIdentity:null,validatedTeamId:``,error:null,missingScopes:[]}}function _e(e,t){return t?.ok?{...e,validatedIdentity:t.identity||`ok`,validatedTeamId:t.teamId||``,error:null,missingScopes:[]}:{...e,validatedIdentity:null,validatedTeamId:``,error:t?.error||`network`,missingScopes:Array.isArray(t?.missing)?t.missing:[]}}function ve(e){return{...e,saved:!0,step:4,error:null}}function ye(e){let t={channel:e.channel};for(let n of v(e.channel))t[n.key]=(e.draft[n.key]||``).trim();return t}function be(e){let t=t=>(e.draft[t]||``).trim();return e.channel===`telegram`?{telegram:{enabled:!0,token:t(`botToken`)}}:e.channel===`discord`?{discord:{enabled:!0,token:t(`botToken`),guildId:t(`guildId`)}}:{slack:{enabled:!0,botToken:t(`botToken`),appToken:t(`appToken`),...e.validatedTeamId?{teamId:e.validatedTeamId}:{}}}}var xe=`jaw:notificationsAsked`;function Se(){try{return localStorage.getItem(xe)===`1`}catch{return!0}}function Ce(){try{localStorage.setItem(xe,`1`)}catch{}}async function we(){if(typeof Notification>`u`)return null;if(Notification.permission!==`default`)return Notification.permission;if(Se())return null;Ce();try{return await Notification.requestPermission()}catch{return null}}var b=null,x=null,S=!1,C=!1,w=0;function Te(){document.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-onboard-channel]`);t&&(e.preventDefault(),Ee(t.getAttribute(`data-onboard-channel`)))}),document.addEventListener(`keydown`,e=>{e.key!==`Escape`||!x||(e.preventDefault(),e.stopImmediatePropagation(),T())},!0),document.addEventListener(`keydown`,e=>{if(e.key!==`Tab`||!x||!b)return;let t=[...b.querySelectorAll(`button:not([disabled]), input:not([disabled]), a[href], [tabindex]:not([tabindex="-1"])`)];if(!t.length)return;let n=t[0],r=t[t.length-1],i=document.activeElement;e.shiftKey&&(i===n||!b.contains(i))?(e.preventDefault(),r.focus()):!e.shiftKey&&i===r&&(e.preventDefault(),n.focus())},!0)}function Ee(e){if(e!==`telegram`&&e!==`discord`&&e!==`slack`)return;let t={};for(let n of v(e))t[n.key]=De(n.settingsId);x=de(e,t),S=!1,C=!1,w+=1,ke(),E(),b?.classList.add(`open`)}function T(){b?.classList.remove(`open`),x=null}function De(e){return document.getElementById(e)?.value.trim()||``}function Oe(e,t){let n=document.getElementById(e);n&&(n.value=t)}function ke(){b||(b=document.createElement(`div`),b.className=`modal-overlay onboarding-overlay`,b.addEventListener(`click`,e=>{e.target===b&&T()}),document.body.appendChild(b))}function Ae(e){return e.step===1?`
14
- <p class="onboarding-guide">${r(i(`onboarding.guide.${e.channel}`))}</p>
15
- <div class="onboarding-actions">
16
- <button type="button" class="perm-btn" data-onboard-issuer="1">
17
- ${r(i(`onboarding.openIssuer`))}
18
- </button>
19
- </div>`:e.step===2?v(e.channel).map(t=>{let n=i(`onboarding.token.${t.key}`)+(t.optional?` (${i(`onboarding.optional`)})`:``);return`
20
- <div class="onboarding-field">
21
- <label for="onboard-${t.key}">${r(n)}</label>
22
- <input id="onboard-${t.key}" data-onboard-field="${t.key}" class="input-sm"
23
- type="${t.secret?`password`:`text`}"
24
- placeholder="${r(t.example)}"
25
- autocomplete="off" spellcheck="false"
26
- value="${r(e.draft[t.key]||``)}">
27
- <span class="onboarding-hint">${r(i(`onboarding.hint.${e.channel}.${t.key}`))}</span>
28
- </div>`}).join(``):e.step===3?`${S?`<p class="onboarding-guide">${r(i(`onboarding.validating`))}</p>`:e.validatedIdentity?`<p class="onboarding-identity">${r(i(`onboarding.valid`,{identity:e.validatedIdentity}))}</p>`:`<p class="onboarding-guide">${r(i(`onboarding.validateHint`))}</p>`}
29
- <div class="onboarding-actions">
30
- <button type="button" class="perm-btn" data-onboard-validate="1" ${S?`disabled`:``}>
31
- ${r(i(`onboarding.validate`))}
32
- </button>
33
- </div>`:`<p class="onboarding-next">${r(i(e.saved?`onboarding.next.${e.channel}`:`onboarding.saveHint`))}</p>`}function je(e){return e.step===4&&e.saved?`<button type="button" class="perm-btn active" data-onboard-close="1">${r(i(`onboarding.close`))}</button>`:`${e.step>1?`<button type="button" class="perm-btn" data-onboard-back="1">${r(i(`onboarding.back`))}</button>`:``}${e.step===4?`<button type="button" class="perm-btn active" data-onboard-save="1">${r(i(`onboarding.save`))}</button>`:`<button type="button" class="perm-btn ${pe(e)?`active`:``}" data-onboard-next="1">${r(i(`onboarding.next`))}</button>`}`}function E(){if(!b||!x)return;let e=x;b.innerHTML=`
34
- <div class="modal-box onboarding-box" role="dialog" aria-modal="true"
35
- aria-labelledby="onboarding-title" aria-describedby="onboarding-step-title">
36
- <div class="onboarding-head">
37
- <span class="onboarding-title" id="onboarding-title">${r(i(`onboarding.title.${e.channel}`))}</span>
38
- <span class="onboarding-progress" role="status" aria-live="polite"
39
- aria-label="${r(i(`onboarding.progressLabel`,{step:e.step,total:4}))}">${e.step}/4</span>
40
- <button type="button" class="help-trigger onboarding-close" data-onboard-close="1"
41
- aria-label="${r(i(`onboarding.close`))}">✕</button>
42
- </div>
43
- <div class="onboarding-steps" aria-hidden="true">
44
- ${Array.from({length:4},(t,n)=>`<span class="onboarding-dot${n+1===e.step?` is-active`:``}${n+1<e.step?` is-done`:``}"></span>`).join(``)}
45
- </div>
46
- <div class="onboarding-step-title" id="onboarding-step-title">${r(i(`onboarding.step.${e.step}`))}</div>
47
- ${Ae(e)}
48
- <div class="onboarding-error" role="alert" style="display:${e.error?``:`none`}">
49
- ${e.error?r(i(`onboarding.error.${e.error}`)):``}
50
- ${e.missingScopes.length?`<span class="onboarding-scopes">${r(e.missingScopes.join(`, `))}</span>`:``}
51
- </div>
52
- <div class="onboarding-actions onboarding-footer">${je(e)}</div>
53
- </div>`,b.querySelectorAll(`[data-onboard-close]`).forEach(e=>e.addEventListener(`click`,T)),b.querySelector(`[data-onboard-issuer]`)?.addEventListener(`click`,()=>{x&&window.open(ue[x.channel],`_blank`,`noopener`)}),b.querySelector(`[data-onboard-back]`)?.addEventListener(`click`,()=>{x&&(x=he(x),E())}),b.querySelector(`[data-onboard-next]`)?.addEventListener(`click`,()=>{x&&(Pe(),x=me(x),E())}),b.querySelector(`[data-onboard-validate]`)?.addEventListener(`click`,()=>{Fe()}),b.querySelector(`[data-onboard-save]`)?.addEventListener(`click`,()=>{Ie()}),b.querySelectorAll(`[data-onboard-field]`).forEach(e=>{e.addEventListener(`input`,()=>{if(!x)return;let t=e.getAttribute(`data-onboard-field`)||``;x=ge(x,t,e.value)}),e.addEventListener(`keydown`,e=>{e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),Me())})}),Ne()}function Me(){if(x){if(x.step===3){Fe();return}if(x.step===4){x.saved||Ie();return}Pe(),x=me(x),E()}}function Ne(){let e=[...b?.querySelectorAll(`[data-onboard-field]`)??[]];if(!e.length)return;let t=e.find(e=>!e.value.trim())??e[0];t?.focus();let n=t?.value.length??0;t?.setSelectionRange?.(n,n)}function Pe(){if(x)for(let e of b?.querySelectorAll(`[data-onboard-field]`)??[]){let t=e.getAttribute(`data-onboard-field`)||``;x=ge(x,t,e.value)}}async function Fe(){if(!x||S)return;let e=w;S=!0,E();let n=await t(`/api/channels/validate`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(ye(x))});e===w&&(S=!1,x&&(x=_e(x,n||{ok:!1,error:`network`}),E()))}async function Ie(){if(!x||C)return;let t=y({...x,step:3});if(t){x={...x,step:3,error:t},E();return}for(let e of v(x.channel))Oe(e.settingsId,(x.draft[e.key]||``).trim());let n=w;C=!0;try{await e(`/api/settings`,`PUT`,be(x))}finally{C=!1}n!==w||!x||(x=ve(x),E(),_(),we())}function Le(e){return e.trim().length>0}function Re(e,t){return e.trim().length>0&&t.trim().length>0}function ze(e){return e.trim().length>0}function Be(e){return e.trim().startsWith(`xoxb-`)}function Ve(e){return e.trim().startsWith(`xapp-`)}function D(e){return document.getElementById(e)?.value??``}function O(e){(e===`telegram`?Le(D(`tgToken`)):e===`discord`?Re(D(`dcToken`),D(`dcGuildId`)):ze(D(`slBotToken`)))||Ee(e)}async function He(){let t=document.getElementById(`tgToken`)?.value.trim()||``,n=document.getElementById(`tgChatIds`)?.value.trim()||``;await e(`/api/settings`,`PUT`,{telegram:{token:t,allowedChatIds:n?n.split(`,`).map(e=>parseInt(e.trim(),10)).filter(e=>!isNaN(e)):[]}})}async function Ue(t){document.getElementById(`tgOn`)?.classList.toggle(`active`,t),document.getElementById(`tgOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{telegram:{enabled:t}}),t&&O(`telegram`)}async function We(t){document.getElementById(`tgForwardOn`)?.classList.toggle(`active`,t),document.getElementById(`tgForwardOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{telegram:{forwardAll:t}})}async function Ge(t){document.getElementById(`tgMentionOn`)?.classList.toggle(`active`,t),document.getElementById(`tgMentionOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{telegram:{mentionOnly:t}})}function Ke(e){if(!e.telegram)return;let t=e.telegram;document.getElementById(`tgOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`tgOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`tgToken`);t.token&&n&&(n.value=t.token);let r=document.getElementById(`tgChatIds`);t.allowedChatIds?.length&&r&&(r.value=t.allowedChatIds.join(`, `));let i=t.forwardAll!==!1;document.getElementById(`tgForwardOn`)?.classList.toggle(`active`,i),document.getElementById(`tgForwardOff`)?.classList.toggle(`active`,!i);let a=t.mentionOnly!==!1;document.getElementById(`tgMentionOn`)?.classList.toggle(`active`,a),document.getElementById(`tgMentionOff`)?.classList.toggle(`active`,!a)}async function qe(){let t=document.getElementById(`dcToken`)?.value.trim()||``,n=document.getElementById(`dcGuildId`)?.value.trim()||``,r=document.getElementById(`dcChannelIds`)?.value.trim()||``;await e(`/api/settings`,`PUT`,{discord:{token:t,guildId:n,channelIds:r?r.split(`,`).map(e=>e.trim()).filter(Boolean):[]}})}async function Je(t){document.getElementById(`dcOn`)?.classList.toggle(`active`,t),document.getElementById(`dcOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{enabled:t}}),t&&O(`discord`)}async function Ye(t){document.getElementById(`dcForwardOn`)?.classList.toggle(`active`,t),document.getElementById(`dcForwardOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{forwardAll:t}})}async function Xe(t){document.getElementById(`dcAllowBotsOn`)?.classList.toggle(`active`,t),document.getElementById(`dcAllowBotsOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{allowBots:t}})}async function Ze(t){document.getElementById(`dcMentionOn`)?.classList.toggle(`active`,t),document.getElementById(`dcMentionOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{discord:{mentionOnly:t}})}function Qe(e){if(!e.discord)return;let t=e.discord;document.getElementById(`dcOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`dcOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`dcToken`);t.token&&n&&(n.value=t.token);let r=document.getElementById(`dcGuildId`);t.guildId&&r&&(r.value=t.guildId);let i=document.getElementById(`dcChannelIds`);t.channelIds?.length&&i&&(i.value=t.channelIds.join(`, `));let a=t.forwardAll!==!1;document.getElementById(`dcForwardOn`)?.classList.toggle(`active`,a),document.getElementById(`dcForwardOff`)?.classList.toggle(`active`,!a);let o=!!t.allowBots;document.getElementById(`dcAllowBotsOn`)?.classList.toggle(`active`,o),document.getElementById(`dcAllowBotsOff`)?.classList.toggle(`active`,!o);let s=!!t.mentionOnly;document.getElementById(`dcMentionOn`)?.classList.toggle(`active`,s),document.getElementById(`dcMentionOff`)?.classList.toggle(`active`,!s)}var $e=!1;function et(){$e||($e=!0,document.getElementById(`slack-copy-manifest`)?.addEventListener(`click`,async e=>{let n=e.currentTarget;try{let e=(await t(`/api/slack/manifest`))?.yaml||``;if(!e)throw Error(`empty manifest`);await navigator.clipboard.writeText(e);let r=n.textContent||``;n.textContent=i(`settings.slack.guide.copyManifestDone`),setTimeout(()=>{n.textContent=r},2e3)}catch{n.textContent=i(`settings.slack.guide.copyManifestFail`),setTimeout(()=>{n.textContent=i(`settings.slack.guide.copyManifest`)},2500)}}),document.getElementById(`slack-open-apps`)?.addEventListener(`click`,()=>{window.open(`https://api.slack.com/apps?new_app=1`,`_blank`,`noopener`)}),tt(`slBotToken`,`slack-bot-token-error`,Be),tt(`slAppToken`,`slack-app-token-error`,Ve))}function tt(e,t,n){let r=document.getElementById(e),i=document.getElementById(t);if(!r||!i)return;let a=()=>{let e=r.value.trim().length>0&&!n(r.value);i.style.display=e?``:`none`,r.classList.toggle(`input-error`,e)};r.addEventListener(`blur`,a),r.addEventListener(`input`,()=>{i.style.display!==`none`&&a()})}async function nt(){let t=document.getElementById(`slBotToken`)?.value.trim()||``,n=document.getElementById(`slAppToken`)?.value.trim()||``,r=document.getElementById(`slTeamId`)?.value.trim()||``,i=document.getElementById(`slChannelIds`)?.value.trim()||``,a=document.getElementById(`slAttachPort`)?.value.trim()||``;await e(`/api/settings`,`PUT`,{slack:{botToken:t,appToken:n,teamId:r,channelIds:i?i.split(`,`).map(e=>e.trim()).filter(Boolean):[],attachPort:a}})}async function rt(t){document.getElementById(`slOn`)?.classList.toggle(`active`,t),document.getElementById(`slOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{enabled:t}}),t&&O(`slack`)}async function it(t){document.getElementById(`slForwardOn`)?.classList.toggle(`active`,t),document.getElementById(`slForwardOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{forwardAll:t}})}async function at(t){document.getElementById(`slAllowBotsOn`)?.classList.toggle(`active`,t),document.getElementById(`slAllowBotsOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{allowBots:t}})}async function ot(t){document.getElementById(`slMentionOn`)?.classList.toggle(`active`,t),document.getElementById(`slMentionOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{mentionOnly:t}})}async function st(t){document.getElementById(`slThreadOn`)?.classList.toggle(`active`,t),document.getElementById(`slThreadOff`)?.classList.toggle(`active`,!t),await e(`/api/settings`,`PUT`,{slack:{replyInThread:t}})}function ct(e){if(!e.slack)return;let t=e.slack;document.getElementById(`slOn`)?.classList.toggle(`active`,!!t.enabled),document.getElementById(`slOff`)?.classList.toggle(`active`,!t.enabled);let n=document.getElementById(`slBotToken`);t.botToken&&n&&(n.value=t.botToken);let r=document.getElementById(`slAppToken`);t.appToken&&r&&(r.value=t.appToken);let i=document.getElementById(`slTeamId`);t.teamId&&i&&(i.value=t.teamId);let a=document.getElementById(`slChannelIds`);t.channelIds?.length&&a&&(a.value=t.channelIds.join(`, `));let o=document.getElementById(`slAttachPort`);o&&(o.value=t.attachPort||``);let s=t.forwardAll!==!1;document.getElementById(`slForwardOn`)?.classList.toggle(`active`,s),document.getElementById(`slForwardOff`)?.classList.toggle(`active`,!s);let c=!!t.allowBots;document.getElementById(`slAllowBotsOn`)?.classList.toggle(`active`,c),document.getElementById(`slAllowBotsOff`)?.classList.toggle(`active`,!c);let l=t.mentionOnly!==!1;document.getElementById(`slMentionOn`)?.classList.toggle(`active`,l),document.getElementById(`slMentionOff`)?.classList.toggle(`active`,!l);let u=t.replyInThread!==!1;document.getElementById(`slThreadOn`)?.classList.toggle(`active`,u),document.getElementById(`slThreadOff`)?.classList.toggle(`active`,!u)}async function lt(t){document.getElementById(`chTelegram`)?.classList.toggle(`active`,t===`telegram`),document.getElementById(`chDiscord`)?.classList.toggle(`active`,t===`discord`),document.getElementById(`chSlack`)?.classList.toggle(`active`,t===`slack`),document.getElementById(`channelTelegramSettings`)?.style.setProperty(`display`,t===`telegram`?``:`none`),document.getElementById(`channelDiscordSettings`)?.style.setProperty(`display`,t===`discord`?``:`none`),document.getElementById(`channelSlackSettings`)?.style.setProperty(`display`,t===`slack`?``:`none`),await e(`/api/settings`,`PUT`,{channel:t}),await _(),O(t)}function ut(e){let t=e.channel||`telegram`;document.getElementById(`chTelegram`)?.classList.toggle(`active`,t===`telegram`),document.getElementById(`chDiscord`)?.classList.toggle(`active`,t===`discord`),document.getElementById(`chSlack`)?.classList.toggle(`active`,t===`slack`),document.getElementById(`channelTelegramSettings`)?.style.setProperty(`display`,t===`telegram`?``:`none`),document.getElementById(`channelDiscordSettings`)?.style.setProperty(`display`,t===`discord`?``:`none`),document.getElementById(`channelSlackSettings`)?.style.setProperty(`display`,t===`slack`?``:`none`),_()}function dt(e){let t=document.getElementById(`fallbackOrderList`);if(!t)return;let n=Object.keys(e.perCli||{}),a=e.fallbackOrder||[],o=Math.min(n.length-1,3),s=``;for(let e=0;e<o;e++){let t=a[e]||``,o=n.map(e=>`<option value="${r(e)}" ${e===t?`selected`:``}>${r(c(e)?.label||re(e))}</option>`).join(``);s+=`
54
- <div class="settings-row sub-row">
55
- <label style="min-width:60px">Fallback ${e+1}</label>
56
- <select id="fallback${e}"
57
- style="font-size:11px;padding:4px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:4px;flex:1">
58
- <option value="">${i(`settings.none`)}</option>
59
- ${o}
60
- </select>
61
- </div>`}t.innerHTML=s}async function ft(){await e(`/api/settings`,`PUT`,{fallbackOrder:[...document.querySelectorAll(`#fallbackOrderList select`)].map(e=>e.value).filter(Boolean)})}function pt(e){if(e.url)return`remote`;if(!e.command)return null;let t=e.command;return t===`npx`||t.endsWith(`/npx`)?`npx`:t===`uvx`||t===`uv`||t.endsWith(`/uvx`)?`uvx`:t===`docker`||t.endsWith(`/docker`)?`docker`:null}function mt(e){return Object.values(e).filter(e=>e.command===`npx`||e.command===`uv`||e.command===`uvx`).length}var k=null;async function A(){try{let e=await t(`/api/mcp`);if(!e)return;k=e;let n=document.getElementById(`mcpServerList`);if(!n)return;let a=Object.entries(e.servers||{});if(!a.length){n.textContent=i(`mcp.noServers`),ht(0);return}n.innerHTML=a.map(([e,t])=>{let n=pt(t),i=t.url||[t.command,...(t.args||[]).slice(0,2)].filter(Boolean).map(e=>r(e)).join(` `),a=n?` <span style="opacity:.5;font-size:0.85em">[${r(n)}]</span>`:``;return`<div style="padding:2px 0">• <b>${r(e)}</b> <span style="opacity:.6">${i}</span>${a}</div>`}).join(``),ht(mt(e.servers))}catch{}}function ht(e){let t=document.getElementById(`installBundleLabel`);t&&(t.textContent=`Install bundle (${e})`);let n=t?.closest(`button`);n&&(n.disabled=e===0)}async function gt(){let t=document.getElementById(`mcpSyncResult`);if(t){t.style.display=`block`,t.textContent=i(`mcp.syncing`);try{let n=await e(`/api/mcp/sync`,`POST`,{});if(!n){t.innerHTML=`${o.error} sync failed`;return}let i=n.results||{};t.innerHTML=Object.entries(i).map(([e,t])=>`${t?o.check:o.skip} ${r(e)}`).join(` &nbsp; `)}catch(e){t.innerHTML=`${o.error} ${r(e.message)}`}}}async function _t(){let t=document.getElementById(`mcpSyncResult`);if(t){t.style.display=`block`,t.textContent=i(`mcp.installing`);try{let n=await e(`/api/mcp/install`,`POST`,{});if(!n){t.innerHTML=`${o.error} install failed`;return}t.innerHTML=Object.entries(n.results||{}).map(([e,t])=>`${t.status===`installed`?o.check:t.status===`skip`?o.skip:o.error} <b>${r(e)}</b>: ${r(t.status)}${t.bin?` ${o.arrowRight} `+r(t.bin):``}`).join(`<br>`),A()}catch(e){t.innerHTML=`${o.error} ${r(e.message)}`}}}var j=null,M=null,N=null,P=null,F=null,I=null,L=`local`,R=!1,vt=[];function yt(){if(j)return;j=document.createElement(`div`),j.id=`mcpModal`,j.className=`modal-overlay mcp-modal-overlay`,j.setAttribute(`role`,`presentation`),j.setAttribute(`aria-hidden`,`true`),j.addEventListener(`click`,e=>{e.target===j&&H()});let e=document.createElement(`div`);e.className=`modal-box mcp-modal-box`,e.setAttribute(`role`,`dialog`),e.setAttribute(`aria-modal`,`true`),e.setAttribute(`aria-label`,`MCP Server Management`),e.addEventListener(`click`,e=>e.stopPropagation());let t=document.createElement(`div`);t.className=`modal-header`;let n=document.createElement(`span`);n.textContent=`MCP Server Management`;let r=document.createElement(`button`);r.type=`button`,r.className=`help-trigger`,r.textContent=`?`,r.setAttribute(`aria-label`,`MCP help`),r.addEventListener(`click`,()=>kt());let i=document.createElement(`button`);i.type=`button`,i.className=`btn-modal-close`,i.setAttribute(`aria-label`,`Close`),i.textContent=`x`,i.addEventListener(`click`,()=>H());let a=document.createElement(`div`);a.style.cssText=`display:flex;align-items:center;gap:6px`,a.append(n,r),t.append(a,i),M=document.createElement(`div`),M.style.cssText=`padding:16px;overflow-y:auto;flex:1`;let o=document.createElement(`div`);o.style.cssText=`display:flex;gap:4px;margin-bottom:12px`;let s=bt(`Active Servers`,!0),c=bt(`Add New`,!1),l=bt(`Browse`,!1);vt=[s,c,l],s.addEventListener(`click`,()=>z(`active`)),c.addEventListener(`click`,()=>z(`add`)),l.addEventListener(`click`,()=>z(`browse`)),o.append(s,c,l),N=document.createElement(`div`),I=document.createElement(`div`),I.style.display=`none`,I.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,P=document.createElement(`div`),P.style.display=`none`,P.innerHTML=xt(),P.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.addEventListener(`click`,()=>{L=e.dataset.mcpSubtab,St()})}),F=P.querySelector(`#mcpAddError`);let u=P.querySelector(`[data-action="mcpAddAndSync"]`);u&&u.addEventListener(`click`,()=>void Ot());let d=P.querySelector(`[data-action="closeMcpModal"]`);d&&d.addEventListener(`click`,()=>H()),M.append(o,N,I,P);let f=document.createElement(`div`);f.className=`modal-footer`;let p=document.createElement(`button`);p.type=`button`,p.className=`btn-save`,p.textContent=`Close`,p.addEventListener(`click`,()=>H()),f.append(p),e.append(t,M,f),j.append(e),document.body.append(j)}function bt(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`btn-clear btn-tab${t?` is-active`:``}`,n.textContent=e,n}function xt(){return`
62
- <div style="display:flex;gap:4px;margin-bottom:8px">
63
- <button type="button" class="btn-clear btn-tab is-active" data-mcp-subtab="local">Local</button>
64
- <button type="button" class="btn-clear btn-tab" data-mcp-subtab="remote">Remote</button>
65
- </div>
66
- <div id="mcpAddLocal">
67
- <div class="settings-row"><label>Name</label><input type="text" id="mcpAddName" placeholder="my-server"></div>
68
- <div class="settings-row"><label>Command</label><input type="text" id="mcpAddCommand" placeholder="npx"></div>
69
- <div class="settings-row"><label>Args (comma separated)</label><input type="text" id="mcpAddArgs" placeholder="-y, @upstash/context7-mcp"></div>
70
- <div class="settings-row"><label>Env (KEY=value per line)</label><textarea id="mcpAddEnv" rows="2" placeholder="API_KEY=xxx"></textarea></div>
71
- </div>
72
- <div id="mcpAddRemote" style="display:none">
73
- <div class="settings-row"><label>Name</label><input type="text" id="mcpAddRemoteName" placeholder="my-api"></div>
74
- <div class="settings-row"><label>URL</label><input type="text" id="mcpAddUrl" placeholder="https://mcp.example.com/sse"></div>
75
- <div class="settings-row"><label>Headers (KEY=value per line)</label><textarea id="mcpAddHeaders" rows="2"></textarea></div>
76
- </div>
77
- <div id="mcpAddError" class="text-error text-xs py-1" style="display:none"></div>
78
- <div style="display:flex;gap:8px;margin-top:12px;justify-content:flex-end">
79
- <button type="button" class="btn-clear" data-action="closeMcpModal">Cancel</button>
80
- <button type="button" class="btn-clear btn-save" data-action="mcpAddAndSync">Add & Sync</button>
81
- </div>`}function z(e){N&&(N.style.display=e===`active`?``:`none`),P&&(P.style.display=e===`add`?``:`none`),I&&(I.style.display=e===`browse`?``:`none`),vt.forEach((t,n)=>{let r=[`active`,`add`,`browse`][n];t.classList.toggle(`is-active`,r===e)}),e===`active`&&Ct(),e===`add`&&Tt(),e===`browse`&&At()}function St(){let e=P?.querySelector(`#mcpAddLocal`),t=P?.querySelector(`#mcpAddRemote`);e&&(e.style.display=L===`local`?``:`none`),t&&(t.style.display=L===`remote`?``:`none`),P?.querySelectorAll(`[data-mcp-subtab]`).forEach(e=>{e.classList.toggle(`is-active`,e.dataset.mcpSubtab===L)})}function Ct(){if(!N||!k)return;let e=Object.entries(k.servers||{});if(!e.length){N.innerHTML=`<p style="opacity:.5">No active MCP servers.</p>`;return}N.innerHTML=e.map(([e,t])=>{let n=pt(t),i=n?`<span class="mcp-active-tag">[${r(n)}]</span>`:``,a=t.command?r(t.command)+(t.args?.length?` `+t.args.map(e=>r(e)).join(` `):``):``,o=t.url?r(t.url):``,s=t.env?Object.keys(t.env):[],c=t.headers?Object.keys(t.headers):[],l=``;return o&&(l+=`<div class="mcp-active-detail">URL: ${o}</div>`),a&&(l+=`<div class="mcp-active-detail">Command: ${a}</div>`),s.length&&(l+=`<div class="mcp-active-detail">Env: ${s.map(e=>r(e)).join(`, `)}</div>`),c.length&&(l+=`<div class="mcp-active-detail">Headers: ${c.map(e=>r(e)).join(`, `)}</div>`),`<div class="mcp-active-row">
82
- <div style="flex:1">
83
- <div style="display:flex;align-items:center;gap:6px">
84
- <span class="mcp-active-name">${r(e)}</span>
85
- ${i}
86
- </div>
87
- ${l}
88
- </div>
89
- <button type="button" class="btn-clear mcp-active-remove" data-mcp-remove="${r(e)}">Remove</button>
90
- </div>`}).join(``),N.querySelectorAll(`[data-mcp-remove]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.mcpRemove;t&&wt(t)})})}async function wt(t){if(!k)return;let n={...k.servers};delete n[t];try{await e(`/api/mcp`,`PUT`,{...k,servers:n}),await e(`/api/mcp/sync`,`POST`,{}),await A(),Ct()}catch(e){B(e.message)}}function Tt(){for(let e of[`mcpAddName`,`mcpAddCommand`,`mcpAddArgs`,`mcpAddEnv`,`mcpAddRemoteName`,`mcpAddUrl`,`mcpAddHeaders`]){let t=(P??document).querySelector(`#${e}`);t&&(t.value=``)}Et()}function B(e){F&&(F.style.display=`block`,F.textContent=e)}function Et(){F&&(F.style.display=`none`)}function Dt(e){let t={};for(let n of e.split(/\r?\n/)){let e=n.trim();if(!e||e.startsWith(`#`))continue;let r=e.indexOf(`=`);r!==-1&&(t[e.slice(0,r).trim()]=e.slice(r+1))}return t}function V(e){return(P??document).querySelector(`#${e}`)?.value?.trim()??``}async function Ot(){if(!k)return;let t=L===`remote`,n,r;if(t){n=V(`mcpAddRemoteName`);let e=V(`mcpAddUrl`),t=V(`mcpAddHeaders`);if(!n){B(`Name is required.`);return}if(!e){B(`URL is required.`);return}r={url:e};let i=Dt(t);Object.keys(i).length>0&&(r.headers=i)}else{n=V(`mcpAddName`);let e=V(`mcpAddCommand`),t=V(`mcpAddArgs`),i=V(`mcpAddEnv`);if(!n){B(`Name is required.`);return}if(!e){B(`Command is required.`);return}r={command:e};let a=t.split(/,|\n/).map(e=>e.trim()).filter(Boolean);a.length>0&&(r.args=a);let o=Dt(i);Object.keys(o).length>0&&(r.env=o)}if(k.servers[n]){B(`Server "${n}" already exists.`);return}try{await e(`/api/mcp`,`PUT`,{...k,servers:{...k.servers,[n]:r}}),await e(`/api/mcp/sync`,`POST`,{}),await A(),H()}catch(e){B(e.message)}}function kt(){let e=document.getElementById(`mcpHelpOverlay`);if(e){e.remove();return}let t=document.createElement(`div`);t.id=`mcpHelpOverlay`,t.className=`mcp-help-overlay`,t.addEventListener(`click`,e=>{e.target===t&&t.remove()});let n=document.createElement(`div`);n.className=`mcp-help-inner`,n.innerHTML=`
91
- <h4>MCP Server</h4>
92
- <p>MCP (Model Context Protocol) adds capabilities to AI agents — like installing apps on a phone.</p>
93
-
94
- <h4>Local Server</h4>
95
- <p>Runs on your machine. Provide a command and args.</p>
96
- <pre>Name: context7
97
- Command: npx
98
- Args: -y, @upstash/context7-mcp</pre>
99
-
100
- <h4>Remote Server</h4>
101
- <p>Connects to an external URL (SSE or Streamable HTTP).</p>
102
- <pre>Name: my-api
103
- URL: https://mcp.example.com/sse</pre>
104
-
105
- <h4>Server Types</h4>
106
- <p><code>[npx]</code> Node.js package (npx -y ...)<br>
107
- <code>[uvx]</code> Python package (uvx ...)<br>
108
- <code>[docker]</code> Docker container<br>
109
- <code>[remote]</code> External URL</p>
110
-
111
- <h4>After Adding</h4>
112
- <p>The server is automatically synced to all installed CLIs (Claude, Codex, Gemini, Cursor, Copilot, OpenCode).</p>
113
- <p><code>Install bundle</code> converts npx/uvx servers to global binaries for faster startup.</p>
114
-
115
- <div style="text-align:right;margin-top:12px">
116
- <button type="button" class="btn-save" id="mcpHelpClose">OK</button>
117
- </div>
118
- `,t.append(n),document.body.append(t),n.querySelector(`#mcpHelpClose`)?.addEventListener(`click`,()=>t.remove())}async function At(){if(I){I.innerHTML=`<p style="opacity:.5">Loading registry...</p>`,k||await A();try{let e=await t(`/api/mcp/registry`);if(!e?.entries?.length&&!e?.builtins?.length){I.innerHTML=`<p style="opacity:.5">No MCP servers in registry.</p>`;return}let n=k?Object.keys(k.servers):[],i=``;i+=e.entries.map(e=>{let t=n.includes(e.id),i=e.tags?.slice(0,3).map(e=>`<span style="background:var(--border);padding:1px 4px;border-radius:3px;font-size:10px">${r(e)}</span>`).join(` `)||``;return`<div style="padding:10px 0;border-bottom:1px solid var(--border)">
119
- <div style="display:flex;align-items:center;gap:8px">
120
- <b>${r(e.name)}</b>
121
- <span style="opacity:.5;font-size:0.85em">[${r(e.type)}]</span>
122
- <span style="opacity:.4;font-size:0.85em">${r(e.category)}</span>
123
- ${t?`<span style="color:var(--success);font-size:11px">Installed</span>`:`<button type="button" class="btn-clear text-xs" style="color:var(--accent)" data-registry-install="${r(e.id)}">+ Install</button>`}
124
- </div>
125
- <p style="margin:4px 0 4px 0;font-size:12px;opacity:.75">${r(e.description)}</p>
126
- <div style="display:flex;gap:4px;align-items:center">
127
- ${i}
128
- ${e.url?`<a href="${r(e.url)}" target="_blank" rel="noopener noreferrer" style="font-size:10px;opacity:.5;margin-left:auto">source</a>`:``}
129
- </div>
130
- </div>`}).join(``),e.builtins?.length&&(i+=`<div style="margin-top:16px;padding-top:12px;border-top:2px solid var(--border)">
131
- <h4 style="font-size:12px;opacity:.6;margin:0 0 8px">Harness Built-ins (omo / omx)</h4>
132
- <p style="font-size:11px;opacity:.4;margin:0 0 8px">Not installable via registry — built into harness runtimes. Listed for reference.</p>`,i+=e.builtins.map(e=>{let t=e.standalone_config&&Object.keys(e.standalone_config).length>0;return`<div style="padding:6px 0;border-bottom:1px solid var(--border)">
133
- <div style="display:flex;align-items:center;gap:6px">
134
- <b style="font-size:12px">${r(e.name)}</b>
135
- <span style="opacity:.4;font-size:0.8em">${r(e.harness)}</span>
136
- ${t?`<button type="button" class="btn-clear text-xs" style="color:var(--accent)" data-builtin-install="${r(e.id)}">+ Install standalone</button>`:``}
137
- </div>
138
- <p style="margin:2px 0;font-size:11px;opacity:.65">${r(e.description)}</p>
139
- </div>`}).join(``),i+=`</div>`),I.innerHTML=i,I.querySelectorAll(`[data-registry-install]`).forEach(t=>{t.addEventListener(`click`,()=>{let n=t.dataset.registryInstall,r=e.entries.find(e=>e.id===n);r&&jt(r,t)})}),I.querySelectorAll(`[data-builtin-install]`).forEach(t=>{t.addEventListener(`click`,()=>{let n=t.dataset.builtinInstall,r=e.builtins?.find(e=>e.id===n);r?.standalone_config&&jt({id:r.id,name:r.name,description:r.description,category:`harness`,type:`remote`,config:r.standalone_config,tags:[],url:r.source},t)})})}catch(e){I.innerHTML=`<p style="color:var(--color-error)">${r(e.message)}</p>`}}}async function jt(t,n){if(k){n.disabled=!0,n.textContent=`Installing...`;try{let r=t.config;await e(`/api/mcp`,`PUT`,{...k,servers:{...k.servers,[t.id]:r}}),await e(`/api/mcp/sync`,`POST`,{}),await A(),n.textContent=`Installed`,n.style.color=`var(--success)`}catch(e){n.textContent=`Error`,n.disabled=!1,console.error(`[mcp-registry] install failed:`,e.message)}}}function Mt(){yt(),j?.classList.add(`open`),j?.setAttribute(`aria-hidden`,`false`),R=!0,z(`active`)}function H(){R&&(j?.classList.remove(`open`),j?.setAttribute(`aria-hidden`,`true`),R=!1,Tt(),document.getElementById(`mcpHelpOverlay`)?.remove())}var Nt=!1;function Pt(){Nt||(Nt=!0,document.addEventListener(`keydown`,e=>{if(document.getElementById(`mcpHelpOverlay`)&&e.key===`Escape`){e.preventDefault(),document.getElementById(`mcpHelpOverlay`)?.remove();return}R&&e.key===`Escape`&&(e.preventDefault(),e.stopImmediatePropagation(),H())},!0))}var Ft=/^\/(?:Users|home)\/[^/]+/,It=32;function Lt(e){return e.replace(Ft,`~`)}function Rt(e){if(e.length<=It)return e;let t=e.split(`/`);return t.length<=3?e:`${t.slice(0,2).join(`/`)}/…/${t[t.length-1]}`}function zt(e){let t=(e||[]).filter(e=>typeof e==`string`&&e.trim());return t.length===0?null:{text:`${Rt(Lt(t[0]))}${t.length>1?` +${t.length-1}`:``}`,title:t.join(`
140
- `)}}function Bt(){return document.getElementById(`headerGitStatus`)}function Vt(){let e=Bt();e&&(e.hidden=!0,e.textContent=``,e.removeAttribute(`title`),e.removeAttribute(`aria-label`))}function Ht(e){if(!e?.available)return null;let t=e.branch||e.head;if(!t)return null;let n=[`/`,`⑂ ${t}`];e.trackedChangedCount>0&&n.push(`*${e.trackedChangedCount}`),e.untrackedCount>0&&n.push(`?${e.untrackedCount}`);let r=[`Git: ${e.branch?`branch ${e.branch}`:`detached ${e.head}`}`];return e.trackedChangedCount>0&&r.push(`${e.trackedChangedCount} tracked changes`),e.untrackedCount>0&&r.push(`${e.untrackedCount} untracked files`),{text:n.join(` `),title:r.join(`, `)}}function Ut(e){let t=Bt();if(!t)return;let n=Ht(e);if(!n){Vt();return}t.hidden=!1,t.textContent=n.text,t.title=n.title,t.setAttribute(`aria-label`,n.title)}async function Wt(){Ut(await t(`/api/project/git-summary`))}function Gt(e){(Array.isArray(e.changedKeys)?e.changedKeys:[]).includes(`projectDirs`)&&Wt()}var U=null;function Kt(e){let t=document.getElementById(`headerCli`);if(!t)return;let n=ne(e),i=W(e);t.innerHTML=n?`${n} ${r(i)}`:r(i)}function qt(e){let t=document.getElementById(`headerProject`);if(!t)return;Jt(t),t.hidden=!1;let n=zt(e);if(!n){t.classList.add(`is-empty`),t.textContent=`Project: not set`,t.title=`Click to choose the project root folder`;return}t.classList.remove(`is-empty`),t.textContent=`Project ${n.text}`,t.title=`${n.title}\n(click to change)`}function Jt(t){if(t.dataset.pickerBound)return;t.dataset.pickerBound=`1`,t.setAttribute(`role`,`button`),t.setAttribute(`tabindex`,`0`);let n=async()=>{if(t.classList.contains(`is-picking`))return;t.classList.add(`is-picking`);let n=t.textContent;t.textContent=`Choosing folder…`;try{let n=await e(`/api/project/pick`,`POST`,{});if(n&&!n.cancelled&&`projectDirs`in n){t.classList.remove(`is-picking`),qt(n.projectDirs);return}}catch{}t.classList.remove(`is-picking`),t.textContent=n};t.addEventListener(`click`,()=>{n()}),t.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),n())})}function Yt(e){typeof e.cli==`string`&&e.cli&&Kt(e.cli),`projectDirs`in e&&qt(e.projectDirs),Gt(e)}function W(e){return c(e)?.label||re(e)||e}function Xt(e){let t=e.finally(()=>{U===t&&(U=null)});return U=t,t}async function Zt(){let e=U;e&&await e}function Qt(e){return e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}function G(e){return document.getElementById(`model`+Qt(e))}function $t(e){return document.getElementById(`customModel`+Qt(e))}function K(e){return document.getElementById(`effort`+Qt(e))}function q(e,t,{includeCustom:n=!1,includeDefault:a=!1,selected:o=``}={}){if(!e)return;let s=a?`<option value="default">default</option>`:``,c=n?`<option value="__custom__">${i(`model.customOption`)}</option>`:``;e.innerHTML=s+(t||[]).map(e=>`<option value="${r(e)}">${r(e)}</option>`).join(``)+c,o&&Array.from(e.options).some(e=>e.value===o)&&(e.value=o)}function J(e,t){if(!e||!t||Array.from(e.options).some(e=>e.value===t))return;let n=document.createElement(`option`);n.value=t,n.textContent=t;let r=e.querySelector(`option[value="__custom__"]`);r?e.insertBefore(n,r):e.appendChild(n)}function en(e=null){let t=l(),n=document.getElementById(`selCli`);if(n){let a=e?.cli||n.value||t[0]||`claude`,o=e=>u.includes(e),s=!o(a)&&t.includes(a),l=n.dataset.expanded===`1`,d=t.filter(o),f=t.filter(e=>!o(e)),p=d.length===0||s||l,m=d.map(e=>{let t=c(e)?.label||e;return`<option value="${r(e)}">${r(t)}</option>`}).join(``);f.length>0&&(p?(m+=`<option disabled>──────</option>`,m+=f.map(e=>{let t=c(e)?.label||e;return`<option value="${r(e)}">${r(t)}</option>`}).join(``)):m+=`<option value="__show_more__">${i(`cli.showMore`)}</option>`),n.innerHTML=m,Array.from(n.options).some(e=>e.value===a)&&(n.value=a)}let a=document.getElementById(`flushCli`);if(a){let n=e?.memory?.cli||a.value||``;a.innerHTML=`<option value="">(active CLI)</option>`+t.map(e=>`<option value="${r(e)}">${r(W(e))}</option>`).join(``),Array.from(a.options).some(e=>e.value===n)&&(a.value=n)}}function Y(e,t){return(t||``).trim()}function tn(e,t,n,r){let i=(t||``).trim();if(r){let t=e?.effortsByModelByProvider?.[r]?.[i];if(t)return t}return e?.effortsByModel?.[i]||n||e?.efforts||[]}function nn(e,t,n){let r=(t||``).trim();return(n?e?.defaultEffortByModelByProvider?.[n]?.[r]:void 0)??e?.defaultEffortByModel?.[r]??``}function rn(e=null){for(let t of l()){let n=c(t),i=t!==`pi`&&n?.providers?.length?Z(t):``,a=G(t);if(a)if(n?.modelNote)a.innerHTML=`<option value="">${r(n.modelNote)}</option>`,a.title=n.modelNote,a.disabled=!0;else{let r=Y(t,e?.perCli?.[t]?.model||a.value||``),o=t===`pi`&&e?.perCli?.pi?.provider||``,s=t===`pi`&&o?p(e?.pi,o):[];q(a,t===`pi`&&s.length?s:i?n?.modelsByProvider?.[i]||f[t]||[]:f[t]||[],{includeCustom:!0,selected:r}),r&&!Array.from(a.options).some(e=>e.value===r)&&(J(a,r),a.value=r),a.disabled=!1}let o=K(t);if(o){let a=i?n?.effortsByProvider?.[i]||[]:null,s=Y(t,e?.perCli?.[t]?.model||G(t)?.value||``),c=tn(n,s,a,i||void 0),l=[``].concat(c),u=e?.perCli?.[t]?.effort??o.value??``,d=!u||c.includes(u)?u:nn(n,s,i||void 0),f=[...new Set(l)],p=f.length===1&&!f[0]&&n?.effortNote?n.effortNote:`— none`;o.innerHTML=f.map(e=>e?`<option value="${r(e)}">${r(e)}</option>`:`<option value="">${r(p)}</option>`).join(``),n?.effortNote&&(o.title=n.effortNote),o.disabled=f.length===1&&!f[0],Array.from(o.options).some(e=>e.value===d)&&(o.value=d)}}}function an(){return document.getElementById(`selEffort`)?.value||``}function X(e,t=``,n){let i=document.getElementById(`selEffort`);if(!i)return;let a=c(e),o=e!==`pi`&&a?.providers?.length?Z(e):``,s=o?a?.effortsByProvider?.[o]||[]:null,l=Y(e,n??document.getElementById(`selModel`)?.value??``),u=tn(a,l,s,o||void 0);if(u.length===0){let e=a?.effortNote||`— none`;i.innerHTML=`<option value="">${r(e)}</option>`,i.title=e,i.disabled=!0;return}let d=[``].concat(u);i.innerHTML=[...new Set(d)].map(e=>e?`<option value="${r(e)}">${r(e)}</option>`:`<option value="">— none</option>`).join(``),i.disabled=!1,i.title=a?.effortNote||``;let f=!t||u.includes(t)?t:nn(a,l,o||void 0);Array.from(i.options).some(e=>e.value===f)&&(i.value=f)}function on(e,t,n){return e?(e.innerHTML=n.map(e=>`<option value="${r(e)}">${r(re(e)||e)}</option>`).join(``),Array.from(e.options).some(e=>e.value===t)?e.value=t:e.options.length>0&&(e.value=e.options[0]?.value||t),e.value||t):t}function Z(e){let t=document.getElementById(`selCliProvider`),n=document.getElementById(`provider${e.charAt(0).toUpperCase()+e.slice(1).replace(/-./g,e=>e[1].toUpperCase())}`),r=c(e);return t?.value||n?.value||r?.defaultProvider||``}function sn(e,t){let n=document.getElementById(`cliProviderWrap`),r=document.getElementById(`selCliProvider`),i=document.getElementById(`cliProviderLabel`),a=c(t);if(!(t!==`pi`&&(a?.providers?.length??0)>0))return n&&(n.style.display=`none`),a?.defaultProvider||``;i&&(i.textContent=`Provider`);let o=on(r,e?.perCli?.[t]?.provider||r?.value||a?.defaultProvider||``,a.providers);return n&&(n.style.display=``),o}async function cn(){await d();let e=await t(`/api/settings`);if(!e)return;s(e.locale??``),en(e),m(e.pi),te(e.pi,e.perCli?.pi?.provider),e.perCli?.pi?.provider&&ee(e.perCli.pi.provider,e.pi),sn(e,e.cli||``),rn(e);let n=document.getElementById(`selCli`);n&&Array.from(n.options).some(t=>t.value===e.cli)&&(n.value=e.cli,n.dataset.prev=e.cli);let i=document.getElementById(`inpCwd`);i&&(i.textContent=e.workingDir);let a=document.getElementById(`headerCli`);if(a){let t=ne(e.cli),n=W(e.cli);a.innerHTML=t?`${t} ${r(n)}`:r(n)}if(qt(e.projectDirs),await Wt(),un(e.permissions,!1),e.perCli)for(let[t,n]of Object.entries(e.perCli)){let e=G(t),r=K(t);if(e&&n.model){let r=Y(t,n.model);J(e,r),e.value=r}if(r&&(r.value=n.effort||``),t===`codex`&&n.fastMode!==void 0&&(document.getElementById(`codexFastOn`)?.classList.toggle(`active`,n.fastMode),document.getElementById(`codexFastOff`)?.classList.toggle(`active`,!n.fastMode)),t===`codex`){let e=!!n.contextWindow;document.getElementById(`codexCtxOn`)?.classList.toggle(`active`,e),document.getElementById(`codexCtxOff`)?.classList.toggle(`active`,!e);let t=document.getElementById(`codexCtxValues`);t&&(t.style.display=e?``:`none`);let r=document.getElementById(`codexCtxWindow`),i=document.getElementById(`codexCtxCompact`);r&&n.contextWindowSize&&(r.value=String(n.contextWindowSize)),i&&n.contextCompactLimit&&(i.value=String(n.contextCompactLimit))}if(t===`claude`){let e=!!(n.model&&String(n.model).endsWith(`[1m]`));document.getElementById(`claude1mOn`)?.classList.toggle(`active`,e),document.getElementById(`claude1mOff`)?.classList.toggle(`active`,!e)}}gn(!1);let o=e.activeOverrides?.[e.cli]||{},c=e.perCli?.[e.cli]||{},l=o.model||c.model,u=o.effort??c.effort??``,f=document.getElementById(`selModel`);if(l&&f){let t=Y(e.cli,l);t&&!Array.from(f.options).some(e=>e.value===t)&&J(f,t),f.value=t}X(e.cli,u),Ke(e),Qe(e),ct(e),ut(e),dt(e),A(),ie(e.stt||{})}async function ln(){let t=document.getElementById(`selCli`)?.value||`claude`,n={cli:t},r=c(t);return t!==`pi`&&r?.providers?.length&&(n.perCli={[t]:{provider:Z(t)}}),Xt((async()=>{let r=await e(`/api/settings`,`PUT`,n);if(!r){await cn();return}let i=r.cli||t,o=document.getElementById(`selCli`);o&&Array.from(o.options).some(e=>e.value===i)&&(o.value=i,o.dataset.prev=i),Kt(i),a([`instances`],`active-cli-changed`)})())}function un(e,t=!0){t&&n(`/api/settings`,`PUT`,{permissions:`auto`})}function dn(e){let t=G(e);return t?t.value===`__custom__`?$t(e)?.value?.trim()||t.options[0]?.value||`default`:t.value:`default`}function fn(e,t){let n=$t(e);n&&(t.value===`__custom__`?(n.style.display=`block`,n.focus()):(n.style.display=`none`,e===`claude`&&pn(t.value),Q()))}function pn(e){let t=!!(e&&e.endsWith(`[1m]`));document.getElementById(`claude1mOn`)?.classList.toggle(`active`,t),document.getElementById(`claude1mOff`)?.classList.toggle(`active`,!t)}function mn(e,t){let n=t.value.trim();if(!n)return;let r=G(e);r&&(J(r,n),r.value=n,t.style.display=`none`,e===`claude`&&pn(n),Q())}function hn(){let e=document.getElementById(`selCli`)?.value||``,t=Z(e),n=document.getElementById(`selCliProvider`);n&&Array.from(n.options).some(e=>e.value===t)&&(n.value=t),rn(null),c(e)?.providers?.length&&gn(!1),Q()}async function Q(){let t={};for(let e of l()){if(!G(e))continue;let n=K(e),r={model:dn(e),effort:n?n.value:``},i=c(e);if(e!==`pi`&&i?.providers?.length&&(r.provider=Z(e)),e===`pi`){let e=document.getElementById(`providerPi`);e?.value&&(r.provider=e.value)}if(e===`codex`){r.fastMode=document.getElementById(`codexFastOn`)?.classList.contains(`active`)??!1,r.contextWindow=document.getElementById(`codexCtxOn`)?.classList.contains(`active`)??!1;let e=document.getElementById(`codexCtxWindow`),t=document.getElementById(`codexCtxCompact`);r.contextWindowSize=parseInt(e?.value||`1000000`,10),r.contextCompactLimit=parseInt(t?.value||`900000`,10)}t[e]=r}await e(`/api/settings`,`PUT`,{perCli:t})}function gn(e=!0){let n=document.getElementById(`selCli`);if(!n)return;if(n.value===`__show_more__`){let e=n.dataset.prev||l()[0]||`claude`;n.dataset.expanded=`1`,en(null),Array.from(n.options).some(t=>t.value===e)&&(n.value=e);try{n.showPicker()}catch{}return}n.dataset.prev=n.value;let a=n.value||`claude`,o=sn(null,a),s=c(a),u=o&&s?.modelsByProvider?.[o]?s.modelsByProvider[o]:f[a]||[],d=document.getElementById(`selModel`);s?.modelNote&&d?(d.innerHTML=`<option value="">${r(s.modelNote)}</option>`,d.title=s.modelNote,d.disabled=!0):(q(d,u,{includeCustom:!0,includeDefault:!0}),d&&(d.disabled=!1,d.title=``)),Kt(a),X(a);let p=document.getElementById(`selModelCustom`);p&&p.remove();let m=document.createElement(`input`);if(m.type=`text`,m.id=`selModelCustom`,m.className=`custom-model-input`,m.placeholder=i(`model.placeholder`),m.style.display=`none`,m.onchange=function(){let e=this.value.trim();!e||!d||(J(d,e),d.value=e,this.style.display=`none`,X(a,an(),e),$())},!d){e&&ln();return}d.parentElement?.appendChild(m),d.onchange=function(){this.value===`__custom__`?(m.style.display=`block`,m.focus()):(m.style.display=`none`,X(a,an(),this.value),$())},t(`/api/settings`).then(e=>{if(!e)return;let t=e.activeOverrides?.[a]||{},n=e.perCli?.[a]||{},r=t.model||n.model,i=t.effort??n.effort??``;if(r&&d){let t=c(a);if(a!==`pi`&&t?.providers?.length&&(e.perCli?.[a]?.provider||t.defaultProvider||``)!==Z(a)){X(a,i);return}let n=Y(a,r);J(d,n),d.value=n}X(a,i)}),e&&ln()}async function $(){let t=document.getElementById(`selCli`)?.value||`claude`,n=document.getElementById(`selModel`)?.value||`default`;n===`__custom__`&&(n=document.getElementById(`selModelCustom`)?.value?.trim()||`default`);let r=document.getElementById(`selEffort`),i={};i[t]={model:n},r&&!r.disabled&&(i[t].effort=r.value||``);let o={activeOverrides:i},s=c(t);t!==`pi`&&s?.providers?.length&&(o.perCli={[t]:{provider:Z(t)}}),await e(`/api/settings`,`PUT`,o)&&a([`instances`],`active-cli-changed`)}function _n(){let e=f[document.getElementById(`flushCli`)?.value||document.getElementById(`selCli`)?.value||`claude`]||[];q(document.getElementById(`flushModel`),e,{includeDefault:!0}),bn(),yn()}async function vn(){let e=await t(`/api/memory-files`);if(!e)return;let n=document.getElementById(`flushCli`),r=document.getElementById(`flushModel`);n&&e.cli&&(n.value=e.cli),q(r,f[e.cli||document.getElementById(`selCli`)?.value||`claude`]||[],{includeDefault:!0}),r&&e.model&&(J(r,e.model),r.value=e.model),bn()}async function yn(){await e(`/api/memory-files/settings`,`PUT`,{cli:document.getElementById(`flushCli`)?.value||``,model:document.getElementById(`flushModel`)?.value||``})}function bn(){let e=document.getElementById(`flushAgentBadge`);if(!e)return;let t=document.getElementById(`flushCli`)?.value||``,n=document.getElementById(`flushModel`)?.value||``,r=t||document.getElementById(`selCli`)?.value||``,i=[];r&&i.push(t?W(r):`${W(r)}*`),n&&n!==`default`&&i.push(n),e.textContent=i.length?`(${i.join(` / `)})`:``}export{qe as A,ie as B,et as C,it as D,at as E,He as F,We as I,Ue as L,Xe as M,Ye as N,ot as O,Ze as P,Ge as R,lt as S,rt as T,A as _,cn as a,dt as b,hn as c,Q as d,un as f,_t as g,Pt as h,vn as i,Je as j,st as k,Yt as l,Zt as m,dn as n,gn as o,ln as p,fn as r,_n as s,mn as t,$ as u,Mt as v,nt as w,ft as x,gt as y,Te as z};
@@ -1,49 +0,0 @@
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{t as e}from"./state-DxpgDKMO.js";import{i as t,t as n}from"./api-tVoG39dL.js";import{t as r}from"./preload-helper-DFYRRz9w.js";import{O as i,T as a,b as o,j as s,n as c,x as l}from"./render-DYX6GRQ0.js";import{_ as ee,g as te,p as ne}from"./iframe-renderer-C5vRbbl9.js";import{_ as re,d as ie,u,v as d}from"./message-history-C4WOisGx.js";import{a as ae,d as oe,i as se,l as f,n as ce,r as le,s as ue,t as de,u as fe}from"./ui-Hx_mNoDf.js";var p=null,m=0,h=[],g=2e3,pe=3e4,me=1.5,_=null,he=4e4,ge=1e4,_e=0,ve=!1,ye=null;function be(){ye||=setInterval(()=>{!p||!v||!ve||Date.now()-_e<=he||(console.warn(`[sse] stalled channel (no ping in`,he,`ms) — forcing reconnect`),p.close(),p=null,v=!1,y?.(),b(xe))},ge)}var xe=``,v=!1,Se=!1,Ce=!1,we=!1,Te=!1,Ee=null,y=null,De=null;function Oe(e){Ee=e}function ke(e){y=e}function Ae(e){De=e}function je(e,t,n){let r={topic:e,event:t,handler:n};return h.push(r),()=>{let e=h.indexOf(r);e>=0&&h.splice(e,1)}}function Me(e,t,n){for(let r of h)if((r.topic===`*`||r.topic===e)&&(r.event===null||r.event===t))try{r.handler(n)}catch(e){console.warn(`[sse] handler error:`,e.message)}}function Ne(){Se||_||(_=setTimeout(()=>{_=null,b(xe)},g),g=Math.min(g*me,pe))}function b(e){xe=e,Se=!1,_&&=(clearTimeout(_),null),p&&p.close();let t=`${n}/api/events?lang=${encodeURIComponent(e)}`+(m?`&lastEventId=${m}`:``);we=!1,Te=!1,p=new EventSource(t),be(),p.onopen=()=>{g=2e3,v=!0,Ce=!0,we=!0,_e=Date.now(),Ee?.()},p.onerror=()=>{if(p?.close(),p=null,!we&&!Ce&&De){Te||(Te=!0,De());return}v&&(v=!1,y?.()),Ne()},p.onmessage=e=>{m=parseInt(e.lastEventId||`0`,10)||m;let t;try{t=JSON.parse(e.data)}catch{console.warn(`[sse] malformed message:`,e.data);return}if(!t||typeof t!=`object`||typeof t.topic!=`string`||typeof t.event!=`string`){console.warn(`[sse] invalid message shape:`,t);return}if(_e=Date.now(),t.topic===`system`&&t.event===`ping`){ve=!0;return}Me(t.topic,t.event,t)}}var Pe=3e3,x=new Map,S=[],C=(e,t)=>`${e}:${t}`;function w(e=[]){let t=document.getElementById(`pendingQueue`);if(t){if(S=e.slice(),!e.length){ze(new Set),t.classList.remove(`visible`),t.innerHTML=``;return}t.classList.add(`visible`),t.innerHTML=`
3
- <div class="pending-queue-header">
4
- <span class="pending-queue-title">${l.hourglass} <span data-i18n="queue.pendingTitle">${a(s(`queue.pendingTitle`))}</span> <span class="pending-queue-count">${e.length}</span></span>
5
- </div>
6
- <div class="pending-queue-list">
7
- ${e.map(Fe).join(``)}
8
- </div>
9
- `,ze(new Set(e.map(e=>e.id))),Re()}}function Fe(e){let t=(e.prompt||``).replace(/\s+/g,` `).trim(),n=t.length>140?t.slice(0,140)+`…`:t,r=e.source?`<span class="pending-row-source">${a(e.source)}</span>`:``,i=a(s(`queue.copy`)),o=a(s(`queue.steer`)),c=a(s(`queue.delete`));return`<div class="pending-row" data-pending-id="${a(e.id)}" title="${a(t)}">
10
- <span class="pending-row-text">${a(n)}</span>
11
- ${r}
12
- <button class="pending-row-btn pending-row-copy" data-pending-action="copy" title="${i}" aria-label="${i}"><span class="pending-btn-content">${l.copy}</span></button>
13
- <button class="pending-row-btn pending-row-steer" data-pending-action="steer" data-i18n-title="queue.steer" title="${o}" aria-label="${o}"><span class="pending-arm-fill" aria-hidden="true"></span><span class="pending-btn-content"><span class="pending-steer-arrow" aria-hidden="true">↳</span><span class="pending-steer-label">${o}</span></span></button>
14
- <button class="pending-row-btn pending-row-delete" data-pending-action="delete" data-i18n-title="queue.delete" title="${c}" aria-label="${c}"><span class="pending-arm-fill" aria-hidden="true"></span><span class="pending-btn-content">${l.trash}</span></button>
15
- </div>`}function T(e,t){let n=document.querySelector(`.pending-row[data-pending-id="${CSS.escape(e)}"]`);return n?n.querySelector(`[data-pending-action="${t}"]`):null}function Ie(e,t){let n=T(e,t);if(!n)return;n.classList.add(`armed`),n.setAttribute(`title`,s(`queue.cancelArm`));let r=n.querySelector(`.pending-arm-fill`);r&&(r.style.animation=`none`,r.offsetWidth,r.style.animation=``)}function Le(e,t){let n=T(e,t);n&&(n.classList.remove(`armed`),n.setAttribute(`title`,s(t===`steer`?`queue.steer`:`queue.delete`)))}function Re(){for(let e of x.values()){let t=T(e.id,e.action);t&&(t.classList.add(`armed`),t.setAttribute(`title`,s(`queue.cancelArm`)))}}function ze(e){for(let[t,n]of x)e.has(n.id)||(clearTimeout(n.timerId),x.delete(t))}function Be(e,n){let r=C(e,n),i=setTimeout(()=>He(e,n),Pe);x.set(r,{id:e,action:n,timerId:i}),Ie(e,n),n===`steer`&&t(`/api/orchestrate/queue/${encodeURIComponent(e)}/hold`,`POST`,{}).catch(()=>{})}function Ve(e,n){let r=C(e,n),i=x.get(r);i&&(clearTimeout(i.timerId),x.delete(r),Le(e,n),n===`steer`&&t(`/api/orchestrate/queue/${encodeURIComponent(e)}/hold`,`DELETE`,{}).catch(()=>{}))}async function He(e,n){x.delete(C(e,n));let r=n===`steer`?`/api/orchestrate/queue/${encodeURIComponent(e)}/steer`:`/api/orchestrate/queue/${encodeURIComponent(e)}`,i=n===`steer`?`POST`:`DELETE`;if(n===`steer`&&u(`running`),await t(r,i,{})==null){S=S.filter(t=>t.id!==e),w(S),n===`steer`&&U(`steer-fire-miss`).catch(()=>{});return}S=S.filter(t=>t.id!==e),w(S)}function Ue(e,t){if(x.has(C(e,t))){Ve(e,t);return}Be(e,t)}function We(){let e=document.getElementById(`pendingQueue`);e&&e.addEventListener(`click`,async e=>{let t=e.target?.closest(`[data-pending-action]`);if(!t)return;let n=t.closest(`.pending-row`)?.dataset.pendingId;if(!n)return;let r=t.dataset.pendingAction;if(r===`copy`){let e=S.find(e=>e.id===n);if(e?.prompt&&(await o(e.prompt)).ok){let e=t.querySelector(`.pending-btn-content`);e&&(e.innerHTML=l.checkSimple,setTimeout(()=>{e.innerHTML=l.copy},600))}return}Ue(n,r===`steer`?`steer`:`delete`)})}var Ge=800,E=64,Ke=`CLI-JAW`,D=!1,O=0,k=Ke,A=null,j=``,M=!1,N=0;function qe(){return navigator}function Je(){return document.visibilityState!==`visible`||!document.hasFocus()}function Ye(e){return e-N<Ge}function Xe(){if(A)return A;let e=document.querySelector(`link[rel~="icon"]`);if(e)return A=e,j=e.href||e.getAttribute(`href`)||``,e;let t=document.createElement(`link`);return t.rel=`icon`,document.head.appendChild(t),A=t,M=!0,t}function Ze(e){let t=document.createElement(`canvas`);t.width=E,t.height=E;let n=t.getContext(`2d`);return n?(n.clearRect(0,0,E,E),n.font=`44px "Apple Color Emoji", "Segoe UI Emoji", sans-serif`,n.textAlign=`center`,n.textBaseline=`middle`,n.fillText(`🦈`,28,36),n.beginPath(),n.arc(50,15,e>1?12:9,0,Math.PI*2),n.fillStyle=`#ff335f`,n.fill(),n.lineWidth=4,n.strokeStyle=`#ffffff`,n.stroke(),e>1&&(n.fillStyle=`#ffffff`,n.font=`bold 15px sans-serif`,n.textAlign=`center`,n.textBaseline=`middle`,n.fillText(String(Math.min(e,9)),50,16)),t.toDataURL(`image/png`)):j}async function Qe(e){let t=qe();if(typeof t.setAppBadge==`function`)try{await t.setAppBadge(e)}catch{}}async function $e(){let e=qe();if(typeof e.clearAppBadge==`function`)try{await e.clearAppBadge()}catch{}}function et(){document.title=`(${O}) ${k}`;let e=Xe();e&&(e.href=Ze(O)),Qe(O)}function tt(){document.title=k}function nt(){if(A){if(M){A.remove(),A=null,M=!1;return}A.href=j}}function rt(){D||(D=!0,k=document.title||Ke,Xe(),document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`&&at()}),window.addEventListener(`focus`,()=>at()))}function it(){if(!D||!Je())return;let e=Date.now();Ye(e)||(N=e,O+=1,et())}function at(){!D||O===0||(O=0,N=0,tt(),nt(),$e())}function ot(e,t){return!e||!t?!0:e===`all`||e===t}var P=[`I`,`P`,`A`,`B`,`C`],F=null;function st(e,t,n){let r=P.indexOf(n);if(r<0)return;let i=e.getBoundingClientRect(),a=t.offsetWidth||36,o=document.getElementById(`dot-${n}`);if(!o)return;let s=P[r+1],c=s?document.getElementById(`dot-${s}`):null;if(c){let e=o.getBoundingClientRect(),n=c.getBoundingClientRect(),r=(e.right+n.left)/2;t.style.transform=`translateX(${r-i.left-a/2}px)`}else{let e=o.getBoundingClientRect();t.style.transform=`translateX(${e.left-i.left+e.width/2-a/2}px)`}}var I={},ct=8,lt=64,L=null,R=0,z=[],B=new Map;function ut(e){return e!==null&&z.includes(e)}function dt(e){let t=Number(e);return Number.isFinite(t)&&t>0?Math.floor(t):null}function ft(e,t){if(!(!e||t==null))for(t>(B.get(e)||0)&&B.set(e,t);B.size>lt;){let e=null;for(let t of B.keys())if(t!==L){e=t;break}if(!e)break;B.delete(e)}}function pt(e){let t=new Map;for(let n of e?.toolLog||[]){let e=typeof n?.traceRunId==`string`&&n.traceRunId?n.traceRunId:null,r=dt(n?.traceSeq);!e||r==null||r>(t.get(e)||0)&&t.set(e,r)}return t}function mt(e,t,n){return!n||!e||t==null?!1:t<=(B.get(e)||0)}function ht(e){let t=e??L;L=null,R=0,t&&!z.includes(t)&&(z.push(t),z.length>ct&&z.shift())}function gt(e){!e||e===L||(L=e,R=0)}function _t(e){if(e?.running){typeof e.traceRunId==`string`&&e.traceRunId&&(L=e.traceRunId),R=typeof e.textLen==`number`?e.textLen:(e.text||``).length;for(let[t,n]of pt(e))ft(t,n)}}var vt=``,V=0,H=null,yt=0,bt=!1,xt=0,St=750,Ct=750;async function wt(e={}){let t=await(await fetch(`${n}/api/orchestrate/snapshot`)).json();vt=String(t.orc.scope||``),Rt(t.orc.state),jt(t.orc.ctx||null),At(t.heartbeat||{pending:0,deferredPending:0}),kt(t.workers),ie(t.runtime.queuePending),ce(t.queued||[]),w(t.queued||[]),e.hydrateRun&&(ue(t.activeRun),_t(t.activeRun)),It(),t.runtime.busy?u(`running`):f()||u(`idle`),r(()=>import(`./employees-BnobWM_2.js`).then(e=>{typeof e.renderEmployees==`function`&&e.renderEmployees()}),__vite__mapDeps([0]))}function U(e=`manual`,t={}){let n=Date.now();return t.hydrateRun?wt(t):H||(n-yt<St?Promise.resolve():(yt=n,H=wt(t).catch(t=>{throw console.warn(`[ws] orchestrate snapshot sync failed (${e})`,t),t}).finally(()=>{H=null}),H))}function Tt(e){return e===`iframe-visible`||e===`pageshow`||e===`discard`||e===`visibilitychange`}function Et(e){te(e),r(()=>import(`./ui-CAicpUZc.js`).then(async t=>{if(Tt(e)&&V>0)try{await t.loadMessages(),V=Date.now()}catch(t){console.warn(`[ws] restore loadMessages failed (${e})`,t)}await U(e,{hydrateRun:!0})}),__vite__mapDeps([0])).catch(()=>{}).finally(()=>{ne(e)})}function W(e){let t=Date.now();!Tt(e)&&t-xt<Ct||(xt=t,Et(e))}function Dt(e){let t=Array.isArray(e.changedKeys)?e.changedKeys:[];t.includes(`workingDir`)||t.includes(`projectDirs`)?r(()=>import(`./ui-CAicpUZc.js`).then(async e=>{try{await e.loadMessages(),V=Date.now()}catch(e){console.warn(`[ws] settings scope loadMessages failed`,e)}await U(`settings_change`).catch(()=>{}).finally(()=>e.reconcileChatBottomAfterRestore(`settings_change`))}),__vite__mapDeps([0])):U(`settings_change`).catch(()=>{}),r(()=>import(`./settings-core-B1Y5Nb4Z.js`).then(t=>t.refreshHeaderFromSettingsChange(e)),__vite__mapDeps([0])).catch(()=>{})}function Ot(){bt||(bt=!0,window.addEventListener(`focus`,()=>{W(`focus`)}),window.addEventListener(`pageshow`,e=>{e.persisted&&W(`pageshow`)}),document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`&&W(`visibilitychange`)}),document.addEventListener(`resume`,()=>{W(`resume`)}),`wasDiscarded`in document&&document.wasDiscarded&&W(`discard`),window.addEventListener(`message`,e=>{e.data?.type===`jaw-preview-visibility`&&e.data.visible&&W(`iframe-visible`)}))}function kt(e){for(let e of Object.keys(I))delete I[e];for(let t of e)t.state===`running`&&t.phase&&(I[t.agentId]={phase:t.phase,phaseLabel:t.phaseLabel||``})}function At(t){let n={pending:Number(t?.pending||0),deferredPending:Number(t?.deferredPending||0),...t?.reason?{reason:t.reason}:{},...t?.policy?{policy:t.policy}:{},...t?.jobId?{jobId:t.jobId}:{},...t?.jobName?{jobName:t.jobName}:{}};e.heartbeatRuntime=n;let r=document.getElementById(`pabcHeartbeatStatus`);if(r)if(n.reason===`pabcd_active`&&n.deferredPending>0){let e=n.jobName?`: ${n.jobName}`:``;r.textContent=`heartbeat deferred (${n.deferredPending})${e}`,r.hidden=!1}else r.textContent=``,r.hidden=!0}function jt(t){e.orcTaskAnchor=String(t?.taskAnchor||``).trim(),e.orcResolvedSelection=t?.resolvedSelection||null;let n=document.getElementById(`pabcTaskAnchor`);n&&(e.orcTaskAnchor?(n.textContent=`anchor: ${e.orcResolvedSelection?.index?`${e.orcResolvedSelection.index}. `:``}${e.orcTaskAnchor}`,n.hidden=!1):(n.textContent=``,n.hidden=!0),Pt(t?.interview||null))}var G=(()=>{try{return localStorage.getItem(`jaw:interviewCollapsed`)===`1`}catch{return!1}})();function Mt(e){G=e;try{localStorage.setItem(`jaw:interviewCollapsed`,e?`1`:`0`)}catch{}let t=document.getElementById(`interviewPanel`);if(!t)return;t.classList.toggle(`collapsed`,e);let n=t.querySelector(`.iv-toggle`);n&&n.setAttribute(`aria-expanded`,String(!e))}function Nt(e){let t=e=>{switch(e){case`max`:return 1;case`xhigh`:return .8;case`high`:return .6;case`medium`:return .4;default:return .2}},n=e=>{switch(e){case`max`:return`#2196f3`;case`xhigh`:return`#4caf50`;case`high`:return`#8bc34a`;case`medium`:return`#ff9800`;default:return`#f44336`}},r=[t(e.goal),t(e.constraint),t(e.success),t(e.ontology)],i=1-r.reduce((e,t)=>e+t,0)/r.length,a=Object.values(e).every(e=>e===`max`)||i<=.2?`🟢 Ready`:i<=.4?`🟡 Almost`:`🔴 Needs work`,o=(e,r)=>{let i=t(r);return`<div style="display:flex;align-items:center;gap:6px;font-size:12px">
16
- <span style="width:70px;color:var(--text-secondary)">${e}</span>
17
- <div style="flex:1;height:5px;background:var(--bg-tertiary);border-radius:3px">
18
- <div style="width:${i*100}%;height:100%;background:${n(r)};border-radius:3px;transition:width .3s"></div>
19
- </div>
20
- <span style="width:60px;text-align:right;font-weight:600;font-size:11px">${i.toFixed(1)} ${r.toUpperCase()}</span>
21
- </div>`};return`<div style="display:flex;flex-direction:column;gap:3px;margin:6px 0">
22
- <div style="display:flex;justify-content:space-between;font-size:11px;margin-bottom:2px">
23
- <span style="color:var(--text-secondary)">Ambiguity: ${i.toFixed(2)}</span>
24
- <span>${a}</span>
25
- </div>
26
- ${o(`Goal`,e.goal)}
27
- ${o(`Constraint`,e.constraint)}
28
- ${o(`Success`,e.success)}
29
- ${o(`Ontology`,e.ontology)}
30
- </div>`}function Pt(e){let t=document.getElementById(`interviewPanel`);if(!t)return;if(!e||!e.known.length&&!e.unknown.length){t.hidden=!0;return}t.hidden=!1,t.classList.toggle(`collapsed`,G);let n=e=>{switch(e){case`user_statement`:return`🟢`;case`repo_fact`:return`🔵`;case`inference`:return`🟡`;case`assumption`:return`🟠`;case`default`:return`⚪`;default:return`·`}},r=e.known.map(e=>{if(typeof e==`string`)return`<li class="iv-known">· ${a(e)}</li>`;let t=e,r=n(t.source),i=t.dimension?` <span class="iv-dim">[${t.dimension}]</span>`:``;return`<li class="iv-known">${r} ${a(t.fact)}${i}</li>`}).join(``),i=e.unknown.map(e=>`<li class="iv-unknown">❓ ${a(typeof e==`string`?e:JSON.stringify(e))}</li>`).join(``);t.innerHTML=`
31
- <button type="button" class="iv-toggle" aria-expanded="${!G}" aria-controls="interviewBody" title="인터뷰 트래커 접기/펼치기">
32
- <span class="iv-chevron" aria-hidden="true">▸</span>
33
- <span class="iv-summary">Interview · <span class="iv-known-count">Known ${e.known.length}</span> · <span class="iv-unknown-count">Unknown ${e.unknown.length}</span>${e.known.filter(e=>typeof e==`object`&&e&&`source`in e&&e.source===`assumption`).length>0?` · <span class="iv-assumption-count">⚠️ ${e.known.filter(e=>typeof e==`object`&&e&&`source`in e&&e.source===`assumption`).length} assumptions</span>`:``} · Round ${e.round}</span>
34
- </button>
35
- <div class="iv-body" id="interviewBody">
36
- ${e.assessment?`<div class="iv-section iv-section-ambiguity">${Nt(e.assessment)}</div>`:``}
37
- <div class="iv-section iv-section-known"><strong>Known (${e.known.length})</strong><ul>${r}</ul></div>
38
- <div class="iv-section iv-section-unknown"><strong>Unknown (${e.unknown.length})</strong><ul>${i}</ul></div>
39
- </div>
40
- `,t.dataset.toggleBound||(t.dataset.toggleBound=`1`,t.addEventListener(`click`,e=>{e.target.closest(`.iv-toggle`)&&Mt(!G)}))}function Ft(e,t){let n=document.getElementById(`budgetPanel`);if(!n)return;if(!e||t!==`B`){n.hidden=!0;return}n.hidden=!1;let r=(e,t,n)=>{let r=n>0?Math.min(t/n*100,100):0;return`<div style="display:flex;align-items:center;gap:6px;font-size:12px">
41
- <span style="width:70px;color:var(--text-secondary)">${e}</span>
42
- <div style="flex:1;height:5px;background:var(--bg-tertiary);border-radius:3px">
43
- <div style="width:${r}%;height:100%;background:${r>=100?`#f44336`:r>=66?`#ff9800`:`#4caf50`};border-radius:3px"></div>
44
- </div>
45
- <span style="width:30px;text-align:right;font-size:11px">${t}/${n}</span>
46
- </div>`};n.innerHTML=`<div style="font-size:11px;font-weight:600;margin-bottom:4px;color:var(--text-secondary)">Build Budget</div>
47
- ${r(`Workers`,e.spent.workerDispatches,e.maxWorkerDispatches)}
48
- ${r(`Self-heal`,e.spent.selfHealRetries,e.maxSelfHealRetries)}
49
- ${r(`Verify`,e.spent.verificationRounds,e.maxVerificationRounds)}`}async function It(){try{let t=await fetch(`${n}/api/goal`);if(!t.ok)return;let r=await t.json();r.goal?e.activeGoal={id:r.goal.id,objective:r.goal.objective,status:r.goal.status,createdAt:r.goal.createdAt,updatedAt:r.goal.updatedAt,lastCheckpointSummary:r.goal.lastCheckpoint?.summary,nextAction:r.goal.lastCheckpoint?.nextAction}:e.activeGoal=null,Lt()}catch{}}function Lt(){let t=document.getElementById(`goalCockpit`);if(!t)return;let n=e.activeGoal;if(!n||n.status===`complete`||n.status===`cancelled`){t.hidden=!0,t.innerHTML=``;return}t.hidden=!1,t.replaceChildren();let r=n.status===`paused`?`paused`:n.status===`blocked`?`blocked`:`active`,i=document.createElement(`span`);i.className=`goal-objective`,i.title=n.objective,i.textContent=n.objective;let a=document.createElement(`span`);if(a.className=`goal-status goal-status--${r}`,a.textContent=n.status,t.append(i,a),n.nextAction){let e=document.createElement(`span`);e.className=`goal-next`,e.textContent=n.nextAction,t.append(e)}}function Rt(t,n){let r=new Set([`IDLE`,`I`,`P`,`A`,`B`,`C`,`D`]).has(t)?t:`IDLE`;if(e.orcState=r,r===`IDLE`||r===`D`)document.body.removeAttribute(`data-orc-state`),document.body.style.removeProperty(`--orc-glow`);else{document.body.setAttribute(`data-orc-state`,r);let e=`--orc-glow-${r}`,t=getComputedStyle(document.documentElement).getPropertyValue(e).trim();document.body.style.setProperty(`--orc-glow`,t)}document.body.classList.add(`orc-pulse`),setTimeout(()=>document.body.classList.remove(`orc-pulse`),700);let i=document.getElementById(`orcStateBadge`);i&&(i.textContent={IDLE:``,I:`INTERVIEW`,P:`PLAN`,A:`AUDIT`,B:`BUILD`,C:`CHECK`,D:`DONE`}[r],i.style.display=r===`IDLE`?`none`:`inline-block`);let a=document.getElementById(`pabcRoadmap`),o=document.getElementById(`sharkRunner`),s=document.getElementById(`pabcBrand`);if(a&&o){if(!a.dataset.resizeObserved){a.dataset.resizeObserved=`1`,new ResizeObserver(()=>{F&&o.classList.contains(`running`)&&st(a,o,F)}).observe(a);let e=0;window.addEventListener(`resize`,()=>{cancelAnimationFrame(e),e=requestAnimationFrame(()=>{F&&o.classList.contains(`running`)&&st(a,o,F)})})}if(r===`IDLE`)a.classList.remove(`visible`,`shimmer-out`),o.classList.remove(`running`),F=null;else if(r===`D`){P.forEach(e=>{let t=document.getElementById(`dot-${e}`);t&&(t.className=`pabc-dot done`,t.setAttribute(`data-phase`,e))});for(let e=0;e<P.length;e++){let t=document.getElementById(`pabc-conn-${e}`);t&&(t.className=`pabc-connector done`)}o.classList.remove(`running`),F=null,a.classList.add(`shimmer-out`),setTimeout(()=>a.classList.remove(`visible`,`shimmer-out`),1e3)}else{a.classList.remove(`shimmer-out`),a.classList.add(`visible`),o.classList.add(`running`);let e=P.indexOf(r);P.forEach((t,n)=>{let r=document.getElementById(`dot-${t}`);r&&(r.className=`pabc-dot ${n<e?`done`:n===e?`active`:`future`}`,r.setAttribute(`data-phase`,t))});for(let t=0;t<P.length;t++){let n=document.getElementById(`pabc-conn-${t}`);n&&(n.className=`pabc-connector ${t<e?`done`:``}`)}F=r,requestAnimationFrame(()=>st(a,o,r))}s&&n&&(s.textContent=n)}}var zt=!1,Bt=Promise.resolve(),Vt=0;function K(){Ot(),zt||(zt=!0,Zt()),Yt(),b(i())}var Ht=K;function Ut(e){console.log(`[${e}] connected`),X=2e3,Kt();let t=Date.now()-V<1e4;Bt=r(()=>import(`./ui-CAicpUZc.js`).then(async n=>{if(n.cleanupToolActivity(),!t)try{await n.loadMessages(),V=Date.now()}catch(t){console.error(`[${e}] loadMessages failed`,t)}await U(`reconnect`,{hydrateRun:!0}).catch(()=>{}).finally(()=>n.reconcileChatBottomAfterRestore(`reconnect`)),r(()=>import(`./memory-D-bULTHl.js`).then(e=>e.refreshMemorySidebar()),__vite__mapDeps([0])).catch(()=>{}),r(()=>import(`./bgtask-badge-Dqbp-Y4e.js`).then(e=>e.refreshBgtaskBadge()),__vite__mapDeps([0])).catch(()=>{})}),void 0)}function Wt(){te(`replay_gap`),Bt=r(()=>import(`./ui-CAicpUZc.js`).then(async e=>{try{await e.loadMessages(),V=Date.now()}catch(e){console.error(`[sse] replay gap loadMessages failed`,e)}await U(`replay_gap`,{hydrateRun:!0}).catch(()=>{}).finally(()=>e.reconcileChatBottomAfterRestore(`replay_gap`))}),__vite__mapDeps([0]))}var Gt=8e3,q=null;function Kt(){q!==null&&(window.clearTimeout(q),q=null)}function qt(){console.log(`[channel] disconnected`),r(()=>import(`./ui-CAicpUZc.js`).then(e=>e.cleanupToolActivity()),__vite__mapDeps([0])),q===null&&(q=window.setTimeout(()=>{q=null,u(`idle`),d(`${l.exec} ${s(`ws.disconnected`)}`,`tool-activity`)},Gt))}var J=null,Y=!1,X=2e3,Jt=3e4;function Yt(){if(J){Y=!0;try{J.close()}catch{}J=null}}function Xt(){if(J)return;console.warn(`[channel] /api/events unavailable — falling back to legacy WebSocket`);let e=`ws://${location.host}`,t=new WebSocket(`${e}${n}/?lang=${i()}`);J=t,Y=!1,t.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{console.warn(`[ws] malformed message:`,e.data);return}if(!t||typeof t!=`object`||typeof t.type!=`string`){console.warn(`[ws] invalid message shape:`,t);return}Qt(t)};let r=!1;t.onopen=()=>{r=!0,X=2e3,Ut(`ws`)},t.onclose=()=>{if(J===t&&(J=null),Y){Y=!1;return}if(r){qt(),setTimeout(K,2e3);return}X=Math.min(X*2,Jt),setTimeout(K,X)}}function Zt(){je(`widget`,`widget_updated`,e=>{let t=e.chatId,n=e.widgetId;typeof t!=`string`||typeof n!=`string`||r(()=>import(`./iframe-renderer-Df4KIVyx.js`).then(e=>e.refreshFileWidget(t,n)),__vite__mapDeps([0])).catch(e=>console.warn(`[widget] refresh failed:`,e.message))}),je(`*`,null,e=>{Qt({...e,type:e.event})}),Oe(()=>Ut(`sse`)),ke(()=>qt()),Ae(()=>Xt())}function Qt(t){if(t.type===`agent_tool`){if(f())return;let e=typeof t.traceRunId==`string`&&t.traceRunId?t.traceRunId:null,n=dt(t.traceSeq);if(ut(e)||mt(e,n,t.sseReplay===!0))return;t.isEmployee!==!0&&gt(e);let r=t.toolType===`thinking`?`thinking`:t.toolType===`search`?`search`:t.toolType===`subagent`?`subagent`:`tool`;oe({id:`step-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,type:r,icon:t.icon||l.tool,rawIcon:t.rawIcon||t.icon||``,label:t.label||``,isEmployee:t.isEmployee===!0,detail:t.detail||``,stepRef:t.stepRef||``,traceRunId:t.traceRunId||``,traceSeq:t.traceSeq,detailAvailable:t.detailAvailable,detailBytes:t.detailBytes,rawRetentionStatus:t.rawRetentionStatus,status:t.status||`running`,startTime:typeof t.startedAt==`number`&&t.startedAt>0?t.startedAt:Date.now()},typeof t.startedAt==`number`&&t.startedAt>0?t.startedAt:void 0),ft(e,n)}else if(t.type===`agent_output`||t.type===`agent_chunk`){if(f())return;let e=typeof t.traceRunId==`string`&&t.traceRunId?t.traceRunId:null;if(ut(e))return;gt(e);let n=t.text||``;if(e&&typeof t.textLen==`number`){if(t.textLen<=R){t.sseReplay!==!0&&t.textLen<R&&(console.warn(`[ws] live agent_output behind applied cursor — resync (${t.textLen} < ${R})`),R=t.textLen);return}let e=t.textLen-R;e<n.length&&(n=n.slice(-e)),R=t.textLen}de(n)}else if(t.type===`agent_status`){if(!t.running&&f())return;t.running&&f()&&se(),t.running===void 0?u(t.status||`idle`):u(t.running?`running`:`idle`),t.agentId&&t.phase&&(I[t.agentId]={phase:t.phase,phaseLabel:t.phaseLabel||``},r(()=>import(`./employees-BnobWM_2.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])))}else if(t.type===`bgtask_update`)r(()=>import(`./bgtask-badge-Dqbp-Y4e.js`).then(e=>e.applyBgtaskUpdate(t)),__vite__mapDeps([0])).catch(()=>{});else if(t.type===`queue_update`)ie(t.pending||0),Array.isArray(t.queued)&&w(t.queued),U(`queue_update`).catch(()=>{});else if(t.type===`agent_retry`){let e=Number(t.delay??0),n=t.reason,r=a(String(n||`429`));d(s(e>0?`ws.retry`:`ws.retryNow`,{cli:a(t.cli||``),reason:r,delay:e}),`tool-activity`)}else if(t.type===`agent_fallback`)d(s(`ws.fallback`,{from:a(t.from||``),to:a(t.to||``)}),`tool-activity`);else if(t.type===`agent_smoke`)d(`${l.warning} ${a(t.cli||`agent`)}: smoke response detected — auto-continuing`,`tool-activity`);else if(t.type===`goal_done`)e.activeGoal=null,Lt(),d(`🎯 Goal completed${t.source===`ai_output`?` (detected from AI output)`:``}`,`tool-activity`);else if(t.type===`goal_cancel`)e.activeGoal=null,Lt(),d(`🎯 Goal cancelled`,`tool-activity`);else if(t.type===`schedule_wakeup`)d(`⏰ Wakeup scheduled in ${t.delaySeconds}s — ${a(String(t.reason||``))}`,`tool-activity`);else if(t.type===`goal_continuation_limit`)d(`⚠️ Goal continuation limit reached (${t.attempts} attempts)`,`tool-activity`);else if(t.type===`goal_continuation`)d(`🎯 Active goal — auto-continuing`,`tool-activity`);else if(t.type===`agent_done`){if(!(t.steered||f())){let e=typeof t.traceRunId==`string`&&t.traceRunId?t.traceRunId:null;if(ut(e)||e&&L&&e!==L)return;ht(e),ae(t.text||``,t.toolLog),it()}}else if(t.type===`orchestrate_done`)ht(null),ae(t.text||``),it();else if(t.type===`clear`){c(),le(),ee().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``),r(()=>import(`./idb-cache-ZH6lOebk.js`).then(e=>e.clearCache()),[]).catch(()=>{})}else if(t.type===`session_reset`)d(`${l.refresh} Session reset — history preserved`,`tool-activity`);else if(t.type===`agent_added`||t.type===`agent_updated`||t.type===`agent_deleted`)r(()=>import(`./employees-BnobWM_2.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0]));else if(t.type===`heartbeat_pending`){let e={pending:t.pending||0,deferredPending:t.deferredPending||0};t.reason!==void 0&&(e.reason=t.reason),t.policy!==void 0&&(e.policy=t.policy),t.jobId!==void 0&&(e.jobId=t.jobId),t.jobName!==void 0&&(e.jobName=t.jobName),At(e)}else if(t.type===`orc_state`)$t(t);else if(t.type===`memory_status`)r(()=>import(`./memory-D-bULTHl.js`).then(e=>e.refreshMemorySidebar()),__vite__mapDeps([0]));else if(t.type===`steer_started`)fe(),ht(null),ae(``),u(`steering`);else if(t.type===`new_message`&&(t.source===`telegram`||t.source===`discord`||t.source===`slack`||t.source===`bgtask`||t.source===`cli`||t.source===`goal`||t.external===!0||t.fromQueue===!0)){let e=t.role===`assistant`?`agent`:t.role||`user`,n=t.content||``,i=t.cli;r(()=>import(`./message-history-ZBoza6ew.js`).then(t=>{if(t.historyReloadInFlight()){t.loadMessages().then(()=>t.loadMessages()).catch(e=>console.warn(`[ws] new_message reload after in-flight failed`,e));return}re(e,n,i)}),__vite__mapDeps([0]))}else t.type===`system_notice`?d(`ℹ️ ${a(t.text||``)}`,`tool-activity`):t.type===`replay_gap`?Wt():t.type===`worker_stalled`?d(`⚠️ Worker stalled: ${a(t.employeeName||t.agentId||``)}`,`tool-activity`):t.type===`worker_disconnected`?d(`🔌 Worker disconnected: ${a(t.agentId||``)} (exit ${a(String(t.exitCode??`?`))})`,`tool-activity`):t.type===`worker_timeout`?d(`⏱️ Worker timed out: ${a(t.employeeName||t.agentId||``)}`,`tool-activity`):t.type===`alert_escalation`?d(a(t.message||``),`tool-activity`):t.type===`schedule_wakeup_failed`?d(`⚠️ Wakeup failed — ${a(String(t.reason||``))}: ${a(t.error||``)}`,`tool-activity`):t.type===`goal_continuation_failed`?d(`⚠️ Goal continuation failed: ${a(t.error||``)}`,`tool-activity`):t.type===`settings_change`?Dt(t):(t.type===`session_switched`||t.type===`session_created`)&&window.location.reload()}function $t(e){let t=++Vt;Bt.then(()=>{t===Vt&&ot(e.scope,vt)&&(Rt(typeof e.state==`string`?e.state:`IDLE`,e.title),jt({taskAnchor:e.taskAnchor||null,resolvedSelection:e.resolvedSelection||null,interview:e.interview||null}),Ft(e.buildBudget||null,typeof e.state==`string`?e.state:`IDLE`))})}function en(e){return I[e]||null}var tn=`sidebarState`,Z=900,nn=768;function rn(){return window.innerWidth<=nn}function an(){document.body.classList.remove(`left-expanded`,`right-expanded`)}function on(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 sn(){let e={};try{e=JSON.parse(localStorage.getItem(tn)||`{}`)}catch{}e.left&&document.body.classList.add(`left-collapsed`),e.right&&document.body.classList.add(`right-collapsed`);let t=rn();document.getElementById(`toggleLeft`)?.addEventListener(`click`,cn),document.getElementById(`toggleRight`)?.addEventListener(`click`,ln),window.addEventListener(`resize`,()=>{let e=rn();if(window.innerWidth>Z){an();let e={};try{e=JSON.parse(localStorage.getItem(tn)||`{}`)}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&&an();t=e,$()}),window.innerWidth<=Z&&(document.body.classList.remove(`left-collapsed`,`right-collapsed`),rn()&&an()),$()}function Q(){return window.innerWidth<=Z}function cn(){Q()?on(`left`):document.body.classList.toggle(`left-collapsed`),fn(),$()}function ln(){Q()?on(`right`):document.body.classList.toggle(`right-collapsed`),dn()&&document.getElementById(`tabAgents`)?.classList.contains(`active`)&&r(()=>import(`./employees-BnobWM_2.js`).then(e=>e.loadEmployees(!0)),__vite__mapDeps([0])),fn(),$()}function un(){return Q()?document.body.classList.contains(`left-expanded`):!document.body.classList.contains(`left-collapsed`)}function dn(){return Q()?document.body.classList.contains(`right-expanded`):!document.body.classList.contains(`right-collapsed`)}function $(){let e=document.getElementById(`toggleLeft`),t=document.getElementById(`toggleRight`);e&&(e.innerHTML=un()?l.chevronLeft:l.chevronRight),t&&(t.innerHTML=dn()?l.chevronRight:l.chevronLeft)}function fn(){localStorage.setItem(tn,JSON.stringify({left:document.body.classList.contains(`left-collapsed`),right:document.body.classList.contains(`right-collapsed`)}))}export{K as a,U as c,We as d,ln as i,at as l,dn as n,en as o,cn as r,Ht as s,sn as t,rt as u};
@@ -1 +0,0 @@
1
- import{n as e}from"./skills-IGquen_j.js";export{e as loadSkills};
@@ -1 +0,0 @@
1
- import{a as e}from"./slash-commands-ZRDOL99E.js";export{e as loadCommands};
@@ -1 +0,0 @@
1
- import{p as e}from"./iframe-renderer-C5vRbbl9.js";import{d as t,o as n}from"./message-history-C4WOisGx.js";import{r}from"./ui-Hx_mNoDf.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};
File without changes
File without changes