@humwick/server 0.130.2 → 0.130.4

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 (587) hide show
  1. package/bundled/prompts/manifest.json +1 -0
  2. package/bundled/prompts/task.hydration.md +1 -1
  3. package/bundled/roles/builder.md +1 -1
  4. package/docs/guides/sub-coordinators.md +12 -5
  5. package/docs/guides/tools-coordination.md +1 -0
  6. package/docs/guides/workflows.md +16 -0
  7. package/docs/openapi.json +175 -4
  8. package/package.json +8 -7
  9. package/public/assets/{MessageBubble-BWLqMGKG.js → MessageBubble-BOkmEvgZ.js} +2 -2
  10. package/public/assets/{PlanGraphPanel-3TlIQpjk.js → PlanGraphPanel-BkaDJp0r.js} +2 -2
  11. package/public/assets/{TraceView-Wimm0Czv.js → TraceView-B99Uu2yT.js} +2 -2
  12. package/public/assets/{VaultDecisionCard-Bau_vNax.js → VaultDecisionCard-DUIfTTFF.js} +2 -2
  13. package/public/assets/{activity-CrSurn-r.js → activity-ZIX0N1El.js} +2 -2
  14. package/public/assets/{agent-lineage-CknAJKcb.js → agent-lineage-kq9TPYFw.js} +2 -2
  15. package/public/assets/agent-liveness-DSQY1Aa_.js +2 -0
  16. package/public/assets/{agent-name-DKbiIhBo.js → agent-name-C_7F4DFR.js} +2 -2
  17. package/public/assets/{agent-profiles-DwF6EQ4R.js → agent-profiles-BNOcrGcY.js} +2 -2
  18. package/public/assets/{agent-project-badge-Diz4Sjjb.js → agent-project-badge-B6yAh70a.js} +2 -2
  19. package/public/assets/{agent-tools-CRhpRQza.js → agent-tools-CcrhmOzF.js} +2 -2
  20. package/public/assets/{agent-type-icon-LrUEU3lB.js → agent-type-icon-CXSLrKiq.js} +2 -2
  21. package/public/assets/{agents-B-v66C-4.js → agents-DIZG97_X.js} +2 -2
  22. package/public/assets/{analytics-BqCb-LKi.js → analytics-rasmoPjR.js} +2 -2
  23. package/public/assets/{artifact-viewer-kf4pGuAR.js → artifact-viewer-tBpTrEPb.js} +2 -2
  24. package/public/assets/{artifacts-DJevXcvg.js → artifacts-BNkrynP1.js} +2 -2
  25. package/public/assets/{artifacts-D32zyw4Y.js → artifacts-Bjq-ZyBA.js} +2 -2
  26. package/public/assets/{automation-BpRajx_5.js → automation-Cx422L3L.js} +2 -2
  27. package/public/assets/{backlog-D_UjTdzX.js → backlog-RuFQ8PUu.js} +2 -2
  28. package/public/assets/{busy-health-N3VEh4ao.js → busy-health-BvNQ9g5x.js} +2 -2
  29. package/public/assets/{channels-9jopungq.js → channels-DNbKAS0I.js} +2 -2
  30. package/public/assets/{chat-CSXrTB3C.js → chat-Bp3Fx73h.js} +3 -3
  31. package/public/assets/{code-preview-p1NnmqK0.js → code-preview-KIRZA6cz.js} +2 -2
  32. package/public/assets/{connectors-CZdqlDNL.js → connectors-k7vO4vvc.js} +2 -2
  33. package/public/assets/{cosmos-BgdsE4dG.js → cosmos-BuVoq1aw.js} +2 -2
  34. package/public/assets/{crate-agent-30aXTKva.js → crate-agent-irqlt4NH.js} +2 -2
  35. package/public/assets/{dependency-graph-B_jvw2GE.js → dependency-graph-D_rurNBz.js} +2 -2
  36. package/public/assets/{deploys-DoN6bAb5.js → deploys-yzZqIpxE.js} +2 -2
  37. package/public/assets/{display-BrKWFGJz.js → display-BemJG1f_.js} +2 -2
  38. package/public/assets/{files-D6XEu8Ng.js → files-DXWcrxOz.js} +2 -2
  39. package/public/assets/{fleet-C7jQWbw2.js → fleet-TEuOCZXE.js} +2 -2
  40. package/public/assets/{fleet-metrics-BiDs3MLx.js → fleet-metrics-BGoDAFI-.js} +2 -2
  41. package/public/assets/{formatted-body-impl-DyG0WsQS.js → formatted-body-impl-BB9eq9nN.js} +2 -2
  42. package/public/assets/{formatted-body-CQBwc1fb.js → formatted-body-qy2nTD_1.js} +3 -3
  43. package/public/assets/{host-providers-dialog-DKaW31dN.js → host-providers-dialog-BGPHxuwT.js} +2 -2
  44. package/public/assets/{index-CRHep3M9.js → index-BC5XZc0z.js} +5 -5
  45. package/public/assets/{index-MYAIwYTX.css → index-D8Rp9pz2.css} +1 -1
  46. package/public/assets/{insights-CzrtkpOE.js → insights-C-KQG0h-.js} +2 -2
  47. package/public/assets/{integrations-aVsUmigt.js → integrations-ClPRPyKU.js} +2 -2
  48. package/public/assets/{issue-ref-chip-BnSlM_95.js → issue-ref-chip-DbH8J9Ak.js} +2 -2
  49. package/public/assets/{log-viewer-qe7Ee47Z.js → log-viewer-PH4zVn24.js} +2 -2
  50. package/public/assets/{maintenance-NfjqFZAk.js → maintenance-5lV43uTL.js} +2 -2
  51. package/public/assets/{managed-agents-BiH0HgaE.js → managed-agents-BdgU35aX.js} +2 -2
  52. package/public/assets/{markdown-preview-BixaT3Xr.js → markdown-preview-DNT4OUwQ.js} +3 -3
  53. package/public/assets/{markdown-preview-impl-DNGlWIS3.js → markdown-preview-impl-CnCcPy0A.js} +2 -2
  54. package/public/assets/{memory-DNsCl6UX.js → memory--GgWH1gH.js} +2 -2
  55. package/public/assets/{messages-DopU1L1X.js → messages-CzFl_97O.js} +2 -2
  56. package/public/assets/{orchestrators-Cq7ckLQT.js → orchestrators-CVvJVkzv.js} +2 -2
  57. package/public/assets/overview-DsrZvE86.js +2 -0
  58. package/public/assets/{pairs-DE_m6rrE.js → pairs-D2d0d2py.js} +2 -2
  59. package/public/assets/{profile-icon-B3rfh77F.js → profile-icon-_SMuSbYF.js} +2 -2
  60. package/public/assets/{project-profile-instructions-DQWZE0kA.js → project-profile-instructions-Apn15y43.js} +2 -2
  61. package/public/assets/{projects-Br2Bd2h1.js → projects-D3B6kto5.js} +2 -2
  62. package/public/assets/{prompt-settings-BKvFsvGD.js → prompt-settings-DnPB6Ez6.js} +2 -2
  63. package/public/assets/provider-display-bWwiuedV.js +2 -0
  64. package/public/assets/{registry-Cw38_6gW.js → registry-D790cIhN.js} +2 -2
  65. package/public/assets/run-card-BCro-Odj.js +2 -0
  66. package/public/assets/{secrets-DxI-vzSq.js → secrets-CVXvfvbU.js} +2 -2
  67. package/public/assets/{service-access-settings-D9s_VJbd.js → service-access-settings-D3Xxqb9w.js} +2 -2
  68. package/public/assets/{settings-CKZTVGIx.js → settings-CoUC7Jci.js} +2 -2
  69. package/public/assets/shipping-D_Lp9n_J.js +2 -0
  70. package/public/assets/{stats-DyUBKyWI.js → stats-CXiNjB9S.js} +2 -2
  71. package/public/assets/{status-dot-DYqlEUhJ.js → status-dot-C703YIy1.js} +2 -2
  72. package/public/assets/store-BgDALGIX.js +9 -0
  73. package/public/assets/{tasks-Bh7Chr4-.js → tasks-DO0WpJCx.js} +2 -2
  74. package/public/assets/{teams-bowI7qVY.js → teams-FGkdi_tL.js} +2 -2
  75. package/public/assets/{terminal-viewer-BgVLHdsU.js → terminal-viewer-Dh8dSC7e.js} +3 -3
  76. package/public/assets/{terminal-viewer-impl-Dz22UPy6.js → terminal-viewer-impl-B5Zriip3.js} +2 -2
  77. package/public/assets/{use-agent-terminal-DSQQ-iY7.js → use-agent-terminal-CRUVDvLC.js} +2 -2
  78. package/public/assets/{use-decisions-samMQhQf.js → use-decisions-CoaqRh4l.js} +2 -2
  79. package/public/assets/{use-project-list-59LheVP7.js → use-project-list-X-BgT53X.js} +2 -2
  80. package/public/assets/{use-selectors-BZa25xEB.js → use-selectors-0X_UZkk-.js} +2 -2
  81. package/public/assets/{user-avatar-DHxlvUvV.js → user-avatar-CkLhVBGu.js} +2 -2
  82. package/public/assets/{versioned-prompt-editor-BmED5DnJ.js → versioned-prompt-editor-BkTi7eim.js} +2 -2
  83. package/public/assets/{work-queue-CSvpuNLz.js → work-queue-DDOLEyKo.js} +2 -2
  84. package/public/assets/{workflow-marker-DAZcj5qt.js → workflow-marker-CzOsB8BM.js} +2 -2
  85. package/public/assets/{workflows-DdmxRSyg.js → workflows-DJilvmRM.js} +2 -2
  86. package/public/assets/{workspaces-BxeKfVuF.js → workspaces-CHcfbLR3.js} +2 -2
  87. package/public/cosmos.html +4 -4
  88. package/public/index.html +29 -29
  89. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  90. package/runner/src/adapters/claude-api.ts +1 -1
  91. package/runner/src/adapters/claude-headless.ts +1 -1
  92. package/runner/src/adapters/claude-launch-exit.ts +26 -0
  93. package/runner/src/adapters/claude-session-probe.ts +1 -1
  94. package/runner/src/adapters/claude-tmux.ts +38 -10
  95. package/runner/src/adapters/claude.ts +28 -75
  96. package/runner/src/adapters/provider-quota-harvest.ts +20 -71
  97. package/runner/src/agent-runner/lifecycle-milestones.ts +2 -2
  98. package/runner/src/agent-runner/liveness-exchange.ts +104 -0
  99. package/runner/src/claude-system-prompt.ts +49 -0
  100. package/runner/src/launch-assembly.ts +14 -10
  101. package/runner/src/profile-home.ts +1 -1
  102. package/runner/src/project-instructions.ts +2 -2
  103. package/runner/src/provider-command.ts +18 -0
  104. package/runner/src/provider-setup.ts +3 -2
  105. package/runner/src/runner-core.ts +14 -15
  106. package/runner/src/runner-helpers.ts +0 -8
  107. package/runner/src/session-scratch.ts +6 -2
  108. package/runner/test-support/provisioning-context.ts +4 -2
  109. package/runner/test-support/runner-harness.ts +2 -1
  110. package/scripts/steward-policy-cleanup.ts +2 -2
  111. package/src/agent-authz.ts +2 -2
  112. package/src/agent-drive-arbiter.ts +3 -8
  113. package/src/agent-exit-cleanup-async.ts +2 -2
  114. package/src/agent-exit-cleanup.ts +23 -19
  115. package/src/agent-lifecycle-events.ts +112 -85
  116. package/src/agent-ref.ts +3 -2
  117. package/src/agent-status-events.ts +43 -14
  118. package/src/auth/login-link.ts +35 -0
  119. package/src/auth/password.ts +4 -3
  120. package/src/auth/session-refresh.ts +1 -1
  121. package/src/auth/session.test-fixture.ts +2 -2
  122. package/src/auth/session.ts +7 -7
  123. package/src/automations/crud.ts +8 -81
  124. package/src/automations/dispatch.ts +33 -58
  125. package/src/automations/index.ts +1 -1
  126. package/src/automations/persistence.ts +65 -0
  127. package/src/automations/precheck.ts +18 -16
  128. package/src/automations/read-async.ts +11 -0
  129. package/src/automations/reconcile.ts +30 -39
  130. package/src/automations/storage.ts +33 -10
  131. package/src/automations/write-async.ts +33 -0
  132. package/src/branch-land-notice.ts +3 -3
  133. package/src/branch-landed.ts +25 -23
  134. package/src/bus.ts +21 -19
  135. package/src/cd-deploy-notify.ts +2 -2
  136. package/src/ci/notifications.ts +4 -4
  137. package/src/ci/root-missing.ts +3 -3
  138. package/src/ci/transition-notify.ts +5 -5
  139. package/src/claude-app/oauth-http.ts +3 -3
  140. package/src/cli/index.ts +7 -1
  141. package/src/cli/init.ts +53 -0
  142. package/src/cli/orchestrator.ts +1 -7
  143. package/src/cli/setup.ts +6 -4
  144. package/src/cli/workflow.ts +12 -3
  145. package/src/commands-db.ts +4 -4
  146. package/src/commands-write.ts +8 -0
  147. package/src/compaction-watch.ts +10 -8
  148. package/src/config-store-write.ts +2 -2
  149. package/src/config.ts +4 -11
  150. package/src/connectors.ts +10 -8
  151. package/src/context-advisory.ts +22 -21
  152. package/src/db/agent-action-write.ts +36 -0
  153. package/src/db/agent-control-async.ts +9 -0
  154. package/src/db/agent-control-write.ts +49 -0
  155. package/src/db/agent-effort-observe.ts +22 -0
  156. package/src/db/agent-meta.ts +14 -3
  157. package/src/db/agents-async.ts +8 -5
  158. package/src/db/agents.ts +15 -12
  159. package/src/db/auth-identities.ts +2 -2
  160. package/src/db/automation-read-ops.ts +11 -0
  161. package/src/db/automation-write-ops.ts +46 -0
  162. package/src/db/blackboard.ts +2 -2
  163. package/src/db/browser-session-write.ts +32 -0
  164. package/src/db/bus-outbox-write-ops.ts +3 -1
  165. package/src/db/checkout-refresh-schema.ts +47 -0
  166. package/src/db/checkout-refresh.ts +5 -5
  167. package/src/db/command-agent-profile-backfill.ts +39 -0
  168. package/src/db/command-agent-profiles.ts +5 -1
  169. package/src/db/command-retention.ts +126 -0
  170. package/src/db/commands-planner-stats.test-fixture.ts +8 -0
  171. package/src/db/commands-read-ops.ts +16 -0
  172. package/src/db/connection.ts +1 -182
  173. package/src/db/context-carry-write.ts +74 -0
  174. package/src/db/continuations.ts +4 -4
  175. package/src/db/db-error-registry.ts +12 -0
  176. package/src/db/gateway.ts +26 -133
  177. package/src/db/history-retention-ops.ts +13 -0
  178. package/src/db/inbox-async.ts +2 -2
  179. package/src/db/inbox-read-ops.ts +1 -1
  180. package/src/db/inbox.ts +9 -3
  181. package/src/db/issue-associations.ts +2 -2
  182. package/src/db/issue-refs-async.ts +4 -1
  183. package/src/db/issue-refs-read-ops.ts +6 -0
  184. package/src/db/issue-refs.ts +8 -8
  185. package/src/db/kernel-event-log-schema.ts +2 -0
  186. package/src/db/land-boundaries.ts +51 -5
  187. package/src/db/land-gate-attestations.ts +2 -2
  188. package/src/db/landing-receipts.ts +2 -2
  189. package/src/db/lifecycle-context-write.ts +5 -0
  190. package/src/db/lifecycle-tail-async.ts +76 -0
  191. package/src/db/lifecycle-tail-write-ops.ts +62 -0
  192. package/src/db/lifecycle-write-window.ts +2 -1
  193. package/src/db/lineage-pair-dedupe-sql.ts +3 -3
  194. package/src/db/main-connection-mode.ts +11 -0
  195. package/src/db/main-connection-writes.ts +20 -2
  196. package/src/db/maintenance-job-runs-async.ts +2 -2
  197. package/src/db/maintenance-job-write-ops.ts +1 -1
  198. package/src/db/maintenance-pauses.ts +2 -2
  199. package/src/db/message-send.ts +4 -0
  200. package/src/db/messages.ts +31 -25
  201. package/src/db/migrations.ts +18 -1
  202. package/src/db/notification-write-ops.ts +19 -0
  203. package/src/db/operator-answer-write.ts +19 -0
  204. package/src/db/orchestrators.ts +10 -4
  205. package/src/db/pairs-async.ts +22 -1
  206. package/src/db/pairs-write-ops.ts +8 -3
  207. package/src/db/pairs.ts +41 -48
  208. package/src/db/plan-dispatch-schema.ts +5 -1
  209. package/src/db/plan-ready-notices.ts +43 -0
  210. package/src/db/plan-tools-include-migration.ts +36 -0
  211. package/src/db/plans-write-ops.ts +2 -0
  212. package/src/db/presence-buffer.ts +5 -0
  213. package/src/db/presence-loop.ts +18 -23
  214. package/src/db/presence-write.ts +0 -6
  215. package/src/db/project-entries-async.ts +14 -0
  216. package/src/db/project-entries-read-ops.ts +5 -1
  217. package/src/db/project-entries-write-ops.ts +8 -0
  218. package/src/db/project-entries.ts +15 -12
  219. package/src/db/project-journal.ts +2 -2
  220. package/src/db/project-trust-approvals.ts +2 -2
  221. package/src/db/prompt-templates.ts +4 -4
  222. package/src/db/read-op-marshaling-fixtures.ts +18 -0
  223. package/src/db/read-ops.ts +4 -0
  224. package/src/db/retention.ts +13 -2
  225. package/src/db/review-publish-write.ts +8 -0
  226. package/src/db/runtime-admin-async.ts +19 -0
  227. package/src/db/runtime-admin-write-ops.ts +36 -0
  228. package/src/db/runtime-tail-async.ts +288 -0
  229. package/src/db/runtime-tail-write-ops.ts +97 -0
  230. package/src/db/schema.ts +4 -1
  231. package/src/db/spawn-budget.ts +5 -0
  232. package/src/db/spawn-delegation.ts +3 -12
  233. package/src/db/sql-audit-indexes.ts +3 -0
  234. package/src/db/stats-async.ts +5 -3
  235. package/src/db/task-entity.ts +5 -4
  236. package/src/db/team-claim-policy.ts +60 -0
  237. package/src/db/teams-async.ts +4 -0
  238. package/src/db/teams-write-ops.ts +4 -0
  239. package/src/db/terminal-events.ts +15 -0
  240. package/src/db/timer-cutover-bodies.ts +292 -0
  241. package/src/db/timer-cutover-core.ts +37 -278
  242. package/src/db/timer-cutover-state.ts +40 -0
  243. package/src/db/timer-cutover-write-ops.ts +1 -40
  244. package/src/db/token-db-write-ops.ts +2 -0
  245. package/src/db/token-standing-async.ts +12 -0
  246. package/src/db/token-standing.ts +6 -9
  247. package/src/db/token-usage-retention.ts +33 -0
  248. package/src/db/token-usage-write-ops.ts +1 -1
  249. package/src/db/token-usage.ts +4 -1
  250. package/src/db/user-invites-async.ts +13 -0
  251. package/src/db/user-invites.ts +3 -3
  252. package/src/db/users.ts +14 -6
  253. package/src/db/workflow-execution.ts +3 -3
  254. package/src/db/workspaces.ts +8 -5
  255. package/src/db/write-ops.ts +31 -12
  256. package/src/db/writer-fault-seam.ts +2 -9
  257. package/src/db/writer-fault-test-ops.ts +18 -0
  258. package/src/db/writer-gateway.ts +42 -46
  259. package/src/dev.ts +12 -16
  260. package/src/event-loop-lag.ts +4 -2
  261. package/src/event-loop-yield.ts +2 -2
  262. package/src/events.ts +10 -8
  263. package/src/host-provider-store.ts +5 -4
  264. package/src/hub-metrics-report.ts +5 -1
  265. package/src/hub-metrics.ts +38 -18
  266. package/src/init.ts +299 -0
  267. package/src/injection-sweep-pacing.ts +6 -8
  268. package/src/invite-link.ts +16 -9
  269. package/src/land-gate-notifications.ts +11 -10
  270. package/src/land-gate-queue-progress.ts +3 -3
  271. package/src/land-settle-dispatch.ts +52 -92
  272. package/src/lifecycle-context-pressure.ts +11 -10
  273. package/src/lifecycle-manager.ts +104 -98
  274. package/src/maintenance/breaker.ts +18 -16
  275. package/src/maintenance/checkout-refresh.ts +18 -1
  276. package/src/maintenance/critical-job-watchdog.ts +3 -3
  277. package/src/maintenance/events.ts +3 -3
  278. package/src/maintenance/history-retention-job.ts +30 -0
  279. package/src/maintenance/jobs.ts +29 -67
  280. package/src/maintenance/long-running-work.ts +3 -1
  281. package/src/maintenance/offline-agent-prune-job.ts +28 -0
  282. package/src/maintenance/orphaned-sessions.ts +5 -4
  283. package/src/maintenance/pauses.ts +4 -10
  284. package/src/maintenance/plan-ready-notice-job.ts +71 -0
  285. package/src/maintenance/scheduler.ts +18 -13
  286. package/src/maintenance/stalled-delivery-pager.ts +4 -4
  287. package/src/maintenance/teams.ts +19 -30
  288. package/src/maintenance/workspaces.ts +17 -27
  289. package/src/managed-policy-escalation.ts +7 -7
  290. package/src/managed-policy.ts +3 -3
  291. package/src/managed-provider-gate.ts +5 -4
  292. package/src/managed-spawn-reservation.ts +5 -4
  293. package/src/mcp/index.ts +8 -8
  294. package/src/mcp/output-descriptions.ts +1 -1
  295. package/src/mcp/presentation.ts +2 -1
  296. package/src/mcp/runtime-output.ts +6 -1
  297. package/src/mcp/self-care-visibility.ts +2 -2
  298. package/src/mcp/spawn-targets-matrix.ts +10 -1
  299. package/src/mcp/tool-groups.ts +3 -2
  300. package/src/mcp/tool-roles.ts +81 -0
  301. package/src/mcp/tools-workspace.ts +1 -1
  302. package/src/mcp-blackboard-tools.ts +6 -5
  303. package/src/mcp-decision-tools.ts +7 -7
  304. package/src/mcp-egress-tools.ts +10 -9
  305. package/src/mcp-issue-activity-tools.ts +2 -2
  306. package/src/mcp-issue-association-tools.ts +4 -4
  307. package/src/mcp-issue-ref-tools.ts +3 -3
  308. package/src/mcp-merge-tools.ts +5 -5
  309. package/src/mcp-notification-subscription-tools.ts +14 -15
  310. package/src/mcp-output-levels.test-fixture.ts +1 -1
  311. package/src/mcp-profile-trust-tools.ts +1 -1
  312. package/src/mcp-project-journal-tools.ts +4 -12
  313. package/src/mcp-project-tools.ts +17 -18
  314. package/src/mcp-routing-policy-tools.ts +3 -2
  315. package/src/mcp-team-tools.ts +6 -6
  316. package/src/mcp-workflow-tools.ts +5 -3
  317. package/src/memory-area-injection.ts +13 -12
  318. package/src/memory-boundary-capture.ts +6 -6
  319. package/src/memory-injection.ts +45 -43
  320. package/src/merge-pause-maintenance.ts +5 -4
  321. package/src/notification-router.ts +44 -17
  322. package/src/notify.ts +5 -5
  323. package/src/observed-reset-refresh.ts +4 -4
  324. package/src/operator-alarm.ts +2 -5
  325. package/src/project-ingest.ts +6 -6
  326. package/src/project-instructions.ts +8 -1
  327. package/src/project-trust.ts +12 -11
  328. package/src/prompt-resolver.ts +3 -3
  329. package/src/provider-quota-async.ts +5 -7
  330. package/src/provider-timeline-event.ts +4 -7
  331. package/src/quota-band-delivery.ts +2 -2
  332. package/src/recipe-runner.ts +4 -3
  333. package/src/retention-config-store.ts +4 -3
  334. package/src/reviewer-pipeline.ts +11 -10
  335. package/src/routes/_route.ts +4 -4
  336. package/src/routes/_shared.ts +13 -12
  337. package/src/routes/agent-effort.ts +5 -5
  338. package/src/routes/agent-heartbeat-quota.ts +23 -0
  339. package/src/routes/agent-keep.ts +1 -1
  340. package/src/routes/agent-reporting.ts +1 -1
  341. package/src/routes/agent-self-effort.ts +5 -5
  342. package/src/routes/agent-sessions.ts +24 -24
  343. package/src/routes/agents-spawn.ts +1 -1
  344. package/src/routes/agents.ts +17 -119
  345. package/src/routes/auth.ts +44 -17
  346. package/src/routes/authority-audit.ts +2 -2
  347. package/src/routes/automations.ts +6 -5
  348. package/src/routes/channel-binding-delete.ts +1 -1
  349. package/src/routes/channel-output.ts +3 -3
  350. package/src/routes/claude-api-budget.ts +5 -5
  351. package/src/routes/commands-listing.ts +1 -1
  352. package/src/routes/commands.ts +29 -27
  353. package/src/routes/context-resets.ts +2 -2
  354. package/src/routes/coordinator-teams.ts +1 -1
  355. package/src/routes/decisions.ts +2 -2
  356. package/src/routes/host-providers.ts +18 -0
  357. package/src/routes/host-secret-files.ts +1 -1
  358. package/src/routes/hosts.ts +11 -11
  359. package/src/routes/inbox.ts +3 -2
  360. package/src/routes/index.ts +7 -3
  361. package/src/routes/integrations.ts +9 -7
  362. package/src/routes/issue-activity.ts +2 -2
  363. package/src/routes/issue-associations.ts +4 -4
  364. package/src/routes/issue-refs.ts +3 -3
  365. package/src/routes/kernel-timers-operator.ts +1 -1
  366. package/src/routes/memory.ts +1 -1
  367. package/src/routes/merges.ts +11 -11
  368. package/src/routes/messages.ts +23 -17
  369. package/src/routes/orchestrator-bootstrap.ts +3 -1
  370. package/src/routes/orchestrator-host-registration.ts +2 -0
  371. package/src/routes/orchestrator-host-utilization.ts +2 -2
  372. package/src/routes/orchestrator-proxy.ts +2 -2
  373. package/src/routes/orchestrator.ts +27 -18
  374. package/src/routes/pairs.ts +8 -8
  375. package/src/routes/project-profile-instructions.ts +1 -1
  376. package/src/routes/project-trust.ts +1 -1
  377. package/src/routes/projects.ts +16 -16
  378. package/src/routes/prompt-templates.ts +12 -12
  379. package/src/routes/provider-quotas.ts +10 -10
  380. package/src/routes/run-command.ts +1 -1
  381. package/src/routes/secrets-backup.ts +4 -5
  382. package/src/routes/secrets-import.ts +3 -4
  383. package/src/routes/secrets-vault.ts +12 -14
  384. package/src/routes/settings.ts +1 -1
  385. package/src/routes/shipping.ts +9 -1
  386. package/src/routes/spawn-policy.ts +8 -7
  387. package/src/routes/sse.ts +2 -2
  388. package/src/routes/team-templates.ts +7 -7
  389. package/src/routes/teams.ts +10 -10
  390. package/src/routes/tokens.ts +18 -17
  391. package/src/routes/users.ts +24 -24
  392. package/src/routes/viewer-read.ts +3 -3
  393. package/src/routes/web-tool-calls.ts +4 -4
  394. package/src/routes/workflows.ts +2 -2
  395. package/src/routes/workspaces.ts +17 -16
  396. package/src/routing-policy-push.ts +6 -6
  397. package/src/runtime-grant.ts +17 -11
  398. package/src/runtime-install.ts +30 -0
  399. package/src/runtime-tokens.ts +20 -28
  400. package/src/secrets-broker/config.ts +1 -1
  401. package/src/secrets-broker/service.ts +2 -2
  402. package/src/security.ts +3 -1
  403. package/src/self-resume-carry.ts +21 -110
  404. package/src/self-resume-supersede.ts +4 -3
  405. package/src/self-resume.ts +54 -66
  406. package/src/server-background.ts +1 -1
  407. package/src/server.ts +25 -26
  408. package/src/services/agent-action.ts +12 -31
  409. package/src/services/agent-effort.ts +7 -32
  410. package/src/services/agent-hang-watchdog-job.ts +2 -2
  411. package/src/services/agent-heartbeat.ts +166 -0
  412. package/src/services/agent-reporting.ts +1 -1
  413. package/src/services/auth-context.ts +6 -0
  414. package/src/services/browser-inventory.ts +3 -3
  415. package/src/services/browser-session-state.ts +3 -2
  416. package/src/services/browser-session.ts +21 -27
  417. package/src/services/bus-command-update.ts +9 -9
  418. package/src/services/checkout-refresh-state.ts +1 -0
  419. package/src/services/checkout-refresh.test-fixture.ts +3 -2
  420. package/src/services/command-host.ts +7 -2
  421. package/src/services/coordinator-digest.ts +3 -2
  422. package/src/services/dispatch-command.ts +12 -13
  423. package/src/services/effective-launch-driver.ts +14 -9
  424. package/src/services/host-changed-paths.test-fixture.ts +5 -6
  425. package/src/services/host-project-readiness.ts +2 -2
  426. package/src/services/host-providers.ts +1 -1
  427. package/src/services/host-utilization.ts +9 -9
  428. package/src/services/idle-agent-digest.ts +17 -12
  429. package/src/services/idle-epics.ts +4 -4
  430. package/src/services/interrupt-agent.ts +12 -9
  431. package/src/services/issue-activity.ts +3 -3
  432. package/src/services/issue-associations.ts +15 -18
  433. package/src/services/issue-lifecycle-comments.ts +3 -2
  434. package/src/services/issue-lifecycle.ts +14 -13
  435. package/src/services/issue-refs.ts +4 -5
  436. package/src/services/kernel-timers-cutover-chaos-worker.ts +1 -1
  437. package/src/services/kernel-timers-ingress-chaos-worker.ts +6 -1
  438. package/src/services/kernel-timers-ingress.ts +3 -3
  439. package/src/services/kernel-timers-message-authority-chaos-worker.ts +3 -10
  440. package/src/services/kernel-timers-operator-chaos-worker.ts +3 -2
  441. package/src/services/kernel-timers-outbox.ts +1 -1
  442. package/src/services/kernel-timers-stage10-operator.ts +1 -1
  443. package/src/services/kernel-timers.ts +4 -3
  444. package/src/services/land-gate-placement.ts +11 -2
  445. package/src/services/land-issue-relations.ts +5 -4
  446. package/src/services/land-restart-retry.ts +7 -6
  447. package/src/services/landed-ancestry.ts +6 -5
  448. package/src/services/legacy-landing-host.ts +4 -1
  449. package/src/services/legacy-landing-recovery.ts +8 -6
  450. package/src/services/managed-running.ts +17 -17
  451. package/src/services/memory-areas.ts +3 -3
  452. package/src/services/merge-pause.ts +9 -15
  453. package/src/services/operator-decisions.ts +37 -41
  454. package/src/services/orchestrator-registration-recovery.ts +6 -2
  455. package/src/services/orchestrator-upgrade.ts +14 -12
  456. package/src/services/permission-decision.ts +4 -3
  457. package/src/services/plan-ci-notice.ts +1 -1
  458. package/src/services/plan-conformance.ts +4 -4
  459. package/src/services/plan-dispatch-policy.ts +10 -3
  460. package/src/services/plan-dispatch.ts +35 -14
  461. package/src/services/plan-graph.ts +39 -261
  462. package/src/services/plan-import.ts +1 -1
  463. package/src/services/plan-live-bindings.ts +8 -37
  464. package/src/services/plan-task-create.ts +1 -1
  465. package/src/services/plan-terminal-refs.ts +2 -12
  466. package/src/services/plan-wake-digest.ts +8 -3
  467. package/src/services/profile-trust.ts +2 -2
  468. package/src/services/project.ts +11 -10
  469. package/src/services/prompt-templates.ts +6 -5
  470. package/src/services/provider-api-key.ts +73 -0
  471. package/src/services/provider-hold-nudge.ts +9 -9
  472. package/src/services/provider-hold-record.ts +13 -12
  473. package/src/services/provider-state-audit.ts +19 -18
  474. package/src/services/provisioning-harness/driver.ts +1 -1
  475. package/src/services/provisioning-harness/fixture-matrix.ts +3 -3
  476. package/src/services/provisioning-harness/lifecycle.ts +24 -22
  477. package/src/services/provisioning-harness/prepare.ts +16 -17
  478. package/src/services/rate-limit-resume.ts +10 -9
  479. package/src/services/red-main-auto-revert.ts +7 -5
  480. package/src/services/red-main-controller-deps.ts +20 -3
  481. package/src/services/red-main-incident.ts +3 -1
  482. package/src/services/red-main-quarantine.ts +2 -3
  483. package/src/services/register-agent.ts +22 -22
  484. package/src/services/restart-project-role.ts +1 -1
  485. package/src/services/restart-spawn.ts +17 -16
  486. package/src/services/review-publish.ts +7 -24
  487. package/src/services/review-ref-reconcile.ts +29 -38
  488. package/src/services/runtime-dependency-alert.ts +27 -0
  489. package/src/services/scheduler-command.ts +11 -9
  490. package/src/services/scheduler.ts +5 -5
  491. package/src/services/self-effort-grant.ts +5 -25
  492. package/src/services/send-message.ts +16 -33
  493. package/src/services/shutdown-agent.ts +17 -14
  494. package/src/services/spawn-agent.ts +12 -41
  495. package/src/services/spawn-chain-inspector.ts +1 -1
  496. package/src/services/spawn-cwd-placement.ts +21 -5
  497. package/src/services/spawn-issue-activity.ts +8 -6
  498. package/src/services/spawn-launch.ts +17 -1
  499. package/src/services/spawn-loss-escalation.ts +1 -1
  500. package/src/services/spawn-registration-watchdog.ts +2 -2
  501. package/src/services/spawn-repo-probe.ts +7 -5
  502. package/src/services/spawn-tree-cleanup.ts +7 -8
  503. package/src/services/steward-reaper.ts +4 -4
  504. package/src/services/task-context-hydration.ts +25 -1
  505. package/src/services/task-delivery.ts +20 -34
  506. package/src/services/task-entity.ts +40 -203
  507. package/src/services/task-issue-link.ts +13 -20
  508. package/src/services/task-issue-weave.ts +12 -11
  509. package/src/services/task-lifecycle.ts +27 -31
  510. package/src/services/task-repo-cwd.ts +37 -0
  511. package/src/services/task-review-hold.ts +4 -17
  512. package/src/services/task-semantic-events.ts +13 -11
  513. package/src/services/task-state-reconcile.ts +3 -4
  514. package/src/services/task-validation.ts +2 -2
  515. package/src/services/team-templates.ts +5 -5
  516. package/src/services/team.ts +31 -98
  517. package/src/services/terminal-provider-exit.ts +6 -5
  518. package/src/services/timer-message-fire-chaos-worker.ts +7 -3
  519. package/src/services/timer-message-fire-outbox.ts +1 -1
  520. package/src/services/transient-agent-reaper.ts +22 -19
  521. package/src/services/turn-reconcile-audit.ts +9 -9
  522. package/src/services/user-onboarding.ts +8 -6
  523. package/src/services/user-profile.ts +6 -9
  524. package/src/services/work-finality.ts +16 -4
  525. package/src/services/workflow-auto-start.ts +2 -1
  526. package/src/services/workflow-caller.ts +61 -4
  527. package/src/services/workflow-child-proof-worker.ts +1 -1
  528. package/src/services/workflow-control-proof-worker.ts +1 -1
  529. package/src/services/workflow-coordinator.ts +8 -2
  530. package/src/services/workflow-decisions.ts +5 -5
  531. package/src/services/workflow-deferred-cleanup.ts +1 -1
  532. package/src/services/workflow-effect-driver.ts +42 -19
  533. package/src/services/workflow-effects.ts +41 -27
  534. package/src/services/workflow-pins.ts +7 -4
  535. package/src/services/workflow-reconcile.ts +1 -0
  536. package/src/services/workflow-resume-pins.ts +3 -3
  537. package/src/services/workflow-routing-defaults.ts +18 -0
  538. package/src/services/workflow-run-view.ts +4 -3
  539. package/src/services/workflow-run.test-fixture.ts +1 -1
  540. package/src/services/workflow-runs.ts +34 -22
  541. package/src/services/workflow-supervisor-state.ts +21 -1
  542. package/src/services/workflow-supervisor.ts +4 -3
  543. package/src/services/workspace-recovery.ts +4 -3
  544. package/src/setup.ts +47 -8
  545. package/src/spawn-admission.ts +10 -2
  546. package/src/spawn-placement.ts +27 -9
  547. package/src/spawn-targets.ts +8 -8
  548. package/src/sse-agent-status.ts +15 -6
  549. package/src/sse.ts +49 -24
  550. package/src/startup-context-injection.ts +61 -57
  551. package/src/steward-handoff.ts +4 -3
  552. package/src/steward-policy-cleanup.ts +9 -8
  553. package/src/steward.ts +2 -2
  554. package/src/task-dispatch-live.ts +5 -2
  555. package/src/task-dispatcher.ts +2 -2
  556. package/src/token-db.ts +2 -2
  557. package/src/token-usage-async.ts +2 -4
  558. package/src/user-awaiting-reply.ts +5 -5
  559. package/src/utils.ts +7 -0
  560. package/src/workspace-actions.ts +24 -29
  561. package/src/workspace-auto-merge.ts +14 -12
  562. package/src/workspace-changed-paths-client.ts +16 -5
  563. package/src/workspace-cleanup-stale.ts +30 -7
  564. package/src/workspace-command-settle.ts +24 -16
  565. package/src/workspace-config.ts +1 -1
  566. package/src/workspace-conflict-resolver.ts +9 -7
  567. package/src/workspace-dead-owner-recovery.ts +5 -4
  568. package/src/workspace-escalation.ts +12 -11
  569. package/src/workspace-human-escalation.ts +3 -3
  570. package/src/workspace-land-gate-watchdog.ts +3 -3
  571. package/src/workspace-land-refusal.ts +20 -0
  572. package/src/workspace-land-stopped.ts +1 -0
  573. package/src/workspace-merge.ts +10 -26
  574. package/src/workspace-nothing-to-land-notice.ts +2 -2
  575. package/src/workspace-orphans.ts +18 -37
  576. package/src/workspace-pr-completion.ts +10 -8
  577. package/src/workspace-rekey.ts +3 -3
  578. package/src/workspace-steward-failure.ts +2 -2
  579. package/src/workspace-steward-wake.ts +2 -2
  580. package/public/assets/agent-liveness-CaNwK0Zf.js +0 -2
  581. package/public/assets/overview-C1DCTzzV.js +0 -2
  582. package/public/assets/provider-display-DsuWMvVL.js +0 -2
  583. package/public/assets/run-card-CpKqRbhg.js +0 -2
  584. package/public/assets/shipping-B9YtnwtG.js +0 -2
  585. package/public/assets/store-DcClXLH0.js +0 -9
  586. package/runner/src/agent-runner/http-liveness.ts +0 -85
  587. package/src/db/on-loop-write-transaction.ts +0 -34
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{o as t,p as n,u as r}from"./dist-DeW2Y1R5.js";import{A as i,Ct as a,J as o,K as s,t as c}from"./store-DcClXLH0.js";import{R as l,_ as u,b as d,et as f,f as p,it as m,tt as h,wt as g}from"./display-BrKWFGJz.js";import{t as _}from"./scroll-area-CIN4KQse.js";import{t as v}from"./separator-t1cLZErD.js";import{t as y}from"./activity-TMzFOdh2.js";import{t as b}from"./bot-B0NpDNhr.js";import{n as x,t as S}from"./zap-DGuDTw4w.js";import{t as ee}from"./git-commit-horizontal-DS1pJ_SS.js";import{t as C}from"./inbox-Dfwk3Gt8.js";import{t as w}from"./link-6RR7Hy3-.js";import{t as T}from"./list-checks-CwnS3hly.js";import{t as E}from"./mail-DyaDmwfY.js";import{t as D}from"./message-square-C-1G8dMM.js";import{t as O}from"./triangle-alert-BBNhfgMi.js";import{t as k}from"./agent-type-icon-LrUEU3lB.js";import{t as A}from"./users-C7B3u9jv.js";import{t as j}from"./badge-DqJRtj_p.js";import{n as M,t as N}from"./agent-name-DKbiIhBo.js";import{i as P,l as F,r as I}from"./use-selectors-BZa25xEB.js";import{t as L}from"./status-dot-DYqlEUhJ.js";import{o as R,r as z,s as B,t as V}from"./card-C4QJ4hCW.js";import{i as H,t as U}from"./use-decisions-samMQhQf.js";var W=e(n(),1),G=r();function K(){let e=c(e=>e.openDecisions),n=c(e=>e.agentsById),r=c(e=>e.openInboxThread),i=c(e=>e.switchView),l=a(),[u,d]=(0,W.useState)(null);return e.length?(0,G.jsxs)(V,{"data-testid":`waiting-on-you`,className:`border-tone-warning/40`,children:[(0,G.jsx)(R,{className:`pb-2 pt-4 px-4`,children:(0,G.jsxs)(B,{className:`text-sm font-medium text-tone-warning-fg flex items-center gap-2`,children:[(0,G.jsx)(x,{className:`w-4 h-4`}),`Waiting on you (`,s(e,l),`)`]})}),(0,G.jsx)(z,{className:`px-4 pb-4 space-y-1.5`,children:e.map(e=>{let a=e.coordinatorId?n[e.coordinatorId]:void 0,s=u===e.id;return(0,G.jsxs)(`div`,{children:[(0,G.jsxs)(`div`,{className:t(`flex items-center gap-2 rounded-md px-2 py-1.5 hover:bg-muted/50`,s&&`bg-muted/40`),children:[(0,G.jsxs)(`button`,{type:`button`,className:`flex min-w-0 flex-1 items-center gap-2 text-left`,onClick:()=>d(s?null:e.id),children:[e.timeCritical&&(0,G.jsx)(S,{className:`h-3.5 w-3.5 shrink-0 text-tone-danger-fg`,"aria-label":`time-critical`}),e.kind===`action`&&(0,G.jsx)(`span`,{title:o(e)?`Secret to enter`:`To do for you`,className:`shrink-0 rounded bg-tone-sky/15 px-1 text-[10px] font-medium leading-4 text-tone-sky-fg`,children:o(e)?`Secret`:`To do`}),(0,G.jsx)(`span`,{className:`truncate text-sm`,children:e.title}),(0,G.jsxs)(`span`,{className:`shrink-0 text-[11px] text-muted-foreground`,children:[o(e)?(0,G.jsx)(N,{agent:n[e.filedBy],fallback:e.filedBy}):(0,G.jsx)(N,{agent:a,fallback:e.coordinatorId??`no coordinator`}),` · `,f(l,e.createdAt)]})]}),e.coordinatorId&&(0,G.jsx)(`button`,{type:`button`,title:`Open coordinator chat`,className:`shrink-0 rounded p-1 text-muted-foreground hover:text-foreground`,onClick:()=>{r(e.coordinatorId),i(`chat`)},children:(0,G.jsx)(D,{className:`h-3.5 w-3.5`})})]}),s&&(0,G.jsx)(H,{decision:e,className:`mt-1.5`},U(e))]},e.id)})})]}):null}function q(){let e=c(e=>e.stats),t=c(e=>e.agents),n=c(e=>e.messages),r=c(e=>e.health),o=a(),s=c(e=>e.agentsById),x=c(e=>e.switchView),S=c(e=>e.runHealthAction),N=c(e=>e.managedPolicies),H=c(e=>e.showOffline),U=F(),q=P(),J=I(),Y=(0,W.useMemo)(()=>{let e=m(t,!1,N);return H||(e=e.filter(e=>e.status!==`offline`)),[...e].sort((e,t)=>(g[e.status]??9)-(g[t.status]??9)||h(t.lastSeen)-h(e.lastSeen))},[t,H,N]),X=Y.slice(0,20),Z=[...n].sort((e,t)=>t.id-e.id).slice(0,15),Q=c(e=>i(e.sessionUser))&&r&&r.status!==`ok`?d(r.checks||[]):[];function $(e){x(e)}return(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsx)(K,{}),(0,G.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-4 gap-4`,children:[(0,G.jsxs)(V,{className:`cursor-pointer hover:border-tone-neutral transition-colors`,onClick:()=>$(`agents`),children:[(0,G.jsx)(R,{className:`pb-1 pt-4 px-4`,children:(0,G.jsxs)(B,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1.5`,children:[(0,G.jsx)(A,{className:`w-3.5 h-3.5`}),`Agents`]})}),(0,G.jsxs)(z,{className:`px-4 pb-4`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:Y.length}),(0,G.jsxs)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:[U,` online`]})]})]}),(0,G.jsxs)(V,{className:`cursor-pointer hover:border-tone-neutral transition-colors`,onClick:()=>$(`agents`),children:[(0,G.jsx)(R,{className:`pb-1 pt-4 px-4`,children:(0,G.jsxs)(B,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1.5`,children:[(0,G.jsx)(y,{className:`w-3.5 h-3.5`}),`Busy`]})}),(0,G.jsxs)(z,{className:`px-4 pb-4`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:q}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:`in a turn now`})]})]}),(0,G.jsxs)(V,{className:`cursor-pointer hover:border-tone-neutral transition-colors`,onClick:()=>$(`messages`),children:[(0,G.jsx)(R,{className:`pb-1 pt-4 px-4`,children:(0,G.jsxs)(B,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1.5`,children:[(0,G.jsx)(D,{className:`w-3.5 h-3.5`}),`Messages 24h`]})}),(0,G.jsxs)(z,{className:`px-4 pb-4`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:e.messagesLast24h??`—`}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:`last 24 hours`})]})]}),(0,G.jsxs)(V,{className:`cursor-pointer hover:border-tone-neutral transition-colors`,onClick:()=>$(`messages`),children:[(0,G.jsx)(R,{className:`pb-1 pt-4 px-4`,children:(0,G.jsxs)(B,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1.5`,children:[(0,G.jsx)(E,{className:`w-3.5 h-3.5`}),`Total Messages`]})}),(0,G.jsxs)(z,{className:`px-4 pb-4`,children:[(0,G.jsx)(`div`,{className:`text-2xl font-bold`,children:e.messages??`—`}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:`all time`})]})]})]}),(r?.gitSha||r?.mainSha)&&(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground px-1`,children:[(0,G.jsx)(ee,{className:`w-3.5 h-3.5 shrink-0`}),r.gitSha?(0,G.jsxs)(`span`,{children:[`running `,(0,G.jsx)(`span`,{className:`font-mono`,children:r.gitSha.slice(0,7)})]}):(0,G.jsx)(`span`,{children:`running sha unattested`}),r.mainSha===void 0?(0,G.jsx)(j,{variant:`outline`,className:`border-tone-neutral text-muted-foreground`,children:`main HEAD unknown`}):r.atMainHead===!0?(0,G.jsx)(j,{variant:`outline`,className:`border-tone-success/40 text-tone-success-fg`,children:`at origin/main HEAD`}):r.atMainHead===!1?(0,G.jsxs)(j,{variant:`outline`,className:`border-tone-yellow/40 text-tone-yellow-fg`,children:[`differs from origin/main (`,(0,G.jsx)(`span`,{className:`font-mono`,children:r.mainSha.slice(0,7)}),`)`]}):(0,G.jsxs)(j,{variant:`outline`,className:`border-tone-neutral text-muted-foreground`,children:[`origin/main `,(0,G.jsx)(`span`,{className:`font-mono`,children:r.mainSha.slice(0,7)})]})]}),Q.length>0&&(0,G.jsxs)(V,{className:`border-tone-yellow/40 bg-tone-yellow/5`,children:[(0,G.jsx)(R,{className:`pb-2 pt-4 px-4`,children:(0,G.jsxs)(B,{className:`text-sm font-medium text-tone-yellow-fg flex items-center gap-2`,children:[(0,G.jsx)(O,{className:`w-4 h-4`}),`Health Alerts (`,Q.length,`)`]})}),(0,G.jsx)(z,{className:`px-4 pb-4 space-y-2`,children:Q.map(e=>(0,G.jsxs)(`div`,{className:`text-sm space-y-1`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(j,{variant:`outline`,className:e.status===`error`?`border-tone-danger/40 text-tone-danger-fg`:`border-tone-yellow/40 text-tone-yellow-fg`,children:e.status}),(0,G.jsx)(`span`,{className:`font-medium`,children:e.name})]}),(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.detail}),e.subjects.length>0&&(0,G.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:e.subjects.map(e=>(0,G.jsxs)(j,{variant:`secondary`,className:`max-w-full truncate text-[11px]`,title:[e.id,e.status,e.detail].filter(Boolean).join(` · `),children:[e.label||e.id,e.status?` · ${e.status}`:``,e.detail?` · ${e.detail}`:``]},e.id))}),e.actions.length>0&&(0,G.jsx)(`div`,{className:`flex flex-wrap gap-1.5 pt-0.5`,children:e.actions.slice(0,3).map(e=>(0,G.jsx)(`button`,{onClick:()=>S(e),className:`text-xs text-tone-info-fg hover:text-tone-info-fg underline underline-offset-2`,children:e.label},e.label))})]},e.name))})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-4`,children:[(0,G.jsx)(V,{className:`cursor-pointer hover:border-tone-neutral transition-colors ${J.unreadInbox>0?`border-tone-danger/40`:``}`,onClick:()=>$(`chat`),children:(0,G.jsxs)(z,{className:`p-4 flex items-center gap-3`,children:[(0,G.jsx)(`div`,{className:`p-2 rounded-lg ${J.unreadInbox>0?`bg-tone-danger/15`:`bg-muted`}`,children:(0,G.jsx)(C,{className:`w-4 h-4 ${J.unreadInbox>0?`text-tone-danger-fg`:`text-tone-neutral-fg`}`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`div`,{className:`text-lg font-bold`,children:J.unreadInbox}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Unread`})]})]})}),(0,G.jsx)(V,{className:`cursor-pointer hover:border-tone-neutral transition-colors ${J.pendingPairInvites>0?`border-tone-yellow/40`:``}`,onClick:()=>$(`pairs`),children:(0,G.jsxs)(z,{className:`p-4 flex items-center gap-3`,children:[(0,G.jsx)(`div`,{className:`p-2 rounded-lg ${J.pendingPairInvites>0?`bg-tone-yellow/15`:`bg-muted`}`,children:(0,G.jsx)(w,{className:`w-4 h-4 ${J.pendingPairInvites>0?`text-tone-yellow-fg`:`text-tone-neutral-fg`}`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`div`,{className:`text-lg font-bold`,children:J.pendingPairInvites}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Pair invites`})]})]})}),(0,G.jsx)(V,{className:`cursor-pointer hover:border-tone-neutral transition-colors ${J.claimableTasks>0?`border-tone-orange/40`:``}`,onClick:()=>$(`work`),children:(0,G.jsxs)(z,{className:`p-4 flex items-center gap-3`,children:[(0,G.jsx)(`div`,{className:`p-2 rounded-lg ${J.claimableTasks>0?`bg-tone-orange/15`:`bg-muted`}`,children:(0,G.jsx)(T,{className:`w-4 h-4 ${J.claimableTasks>0?`text-tone-orange-fg`:`text-tone-neutral-fg`}`})}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`div`,{className:`text-lg font-bold`,children:J.claimableTasks}),(0,G.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Claimable waiting`})]})]})})]}),(0,G.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-6`,children:[(0,G.jsxs)(V,{children:[(0,G.jsx)(R,{className:`pb-2 pt-4 px-4`,children:(0,G.jsxs)(B,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(b,{className:`w-4 h-4 text-muted-foreground`}),`Agents`,(0,G.jsx)(`span`,{className:`ml-auto text-xs text-muted-foreground font-normal`,children:X.length})]})}),(0,G.jsx)(z,{className:`px-0 pb-0`,children:(0,G.jsx)(_,{className:`h-[340px]`,children:X.length===0?(0,G.jsx)(`div`,{className:`px-4 pb-4 text-sm text-muted-foreground`,children:`No agents registered.`}):(0,G.jsx)(`div`,{className:`space-y-0`,children:X.map((e,t)=>(0,G.jsxs)(`div`,{children:[t>0&&(0,G.jsx)(v,{}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2.5 px-4 py-2.5 hover:bg-muted/50 transition-colors cursor-pointer`,onClick:()=>c.getState().openAgentDetail(e),children:[(0,G.jsx)(L,{agent:e,now:o}),(0,G.jsx)(k,{agent:e}),(0,G.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,G.jsx)(`div`,{className:`text-sm font-medium truncate`,children:p(e)}),e.tags.length>0&&(0,G.jsx)(`div`,{className:`flex gap-1 mt-0.5 flex-wrap`,children:e.tags.slice(0,2).map(e=>(0,G.jsx)(j,{variant:`outline`,className:`text-[9px] px-1 py-0 h-4`,children:e},e))})]}),(0,G.jsx)(`span`,{className:`text-xs text-muted-foreground shrink-0`,children:f(o,e.lastSeen)})]})]},e.id))})})})]}),(0,G.jsxs)(V,{children:[(0,G.jsx)(R,{className:`pb-2 pt-4 px-4`,children:(0,G.jsxs)(B,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,G.jsx)(y,{className:`w-4 h-4 text-muted-foreground`}),`Recent Activity`,(0,G.jsx)(`span`,{className:`ml-auto text-xs text-muted-foreground font-normal`,children:Z.length})]})}),(0,G.jsx)(z,{className:`px-0 pb-0`,children:(0,G.jsx)(_,{className:`h-[340px]`,children:Z.length===0?(0,G.jsx)(`div`,{className:`px-4 pb-4 text-sm text-muted-foreground`,children:`No recent messages.`}):(0,G.jsx)(`div`,{className:`space-y-0`,children:Z.map((e,t)=>(0,G.jsxs)(`div`,{children:[t>0&&(0,G.jsx)(v,{}),(0,G.jsxs)(`div`,{className:`px-4 py-2.5 hover:bg-muted/50 transition-colors`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-1 text-xs text-muted-foreground mb-0.5`,children:[(0,G.jsx)(`span`,{className:`text-foreground font-medium truncate max-w-[100px]`,children:(0,G.jsx)(M,{target:e.from,agentsById:s})}),(0,G.jsx)(`span`,{children:`→`}),(0,G.jsx)(`span`,{className:`truncate max-w-[100px]`,children:(0,G.jsx)(M,{target:e.to,agentsById:s})}),(0,G.jsxs)(`span`,{className:`ml-auto shrink-0 tabular-nums`,children:[(0,G.jsx)(`span`,{className:`opacity-40 mr-1`,children:u(e.id)}),f(o,e.createdAt)]})]}),(0,G.jsx)(`div`,{className:`text-xs text-foreground line-clamp-2 leading-snug`,children:l(e)})]})]},e.id))})})})]})]})]})}export{q as OverviewView};
2
- //# sourceMappingURL=overview-C1DCTzzV.js.map
@@ -1,2 +0,0 @@
1
- function e(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function t(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function n(e){return e instanceof Error?e.message:String(e)}var r=`provider-enablement`,i=`default`,a=`user`;function o(e){return`user:${e}`}var s=o(`claude-app`);function c(e){return e===`user`||typeof e==`string`&&e.startsWith(`user:`)}function ee(e){if(e===`user`)return i;if(typeof e==`string`&&e.startsWith(`user:`))return e.slice(5)||`default`}function te(e){return e===`user`||e===o(`default`)||e===`user:`?a:e}var ne=[`system`,`control`,`session`];function re(e){return ne.includes(e??``)}var ie=[`memory`,`memory-area`,`instructions`,`tools`,`comms`,`knowledge`,`context`];function ae(e){return typeof e==`string`&&ie.includes(e)}function oe(t){return e(t)&&(t.turnFinal===!0||t.final===!0)}function l(t){return e(t)&&e(t.finality)}function se(t){if(!e(t))return!1;if(l(t))return!0;let n=t.session;return e(n)&&n.final===!0&&n.turnFinal!==!0}function u(t){if(t.messageType===`final-turn`)return!0;let n=e(t.payload?.responseCapture)?t.payload.responseCapture:void 0;return oe(n)&&n.type===`response`}var d=[`decisions`,`actions`,`escalations`,`finalReports`,`failures`];Object.freeze({decisions:`all`,actions:`all`,escalations:`all`,finalReports:`all`,failures:`all`});var ce=/^[a-z][a-z0-9-]*$/,f=new Map,p=[`CLAUDE_CODE_OAUTH_TOKEN`,`ANTHROPIC_API_KEY`,`ANTHROPIC_AUTH_TOKEN`];function m(e){if(!ce.test(e.id))throw Error(`invalid provider id: ${e.id}`);if(!e.label.trim())throw Error(`provider ${e.id} is missing a label`);if(!e.icon.trim())throw Error(`provider ${e.id} is missing an icon`);if(f.has(e.id))throw Error(`provider already registered: ${e.id}`);f.set(e.id,e)}function h(e){return f.get(e)}function g(){return[...f.values()]}function le(e,t){let n=f.get(e)?.capabilityDefaults.session?.shellMode,r=t===`read-only`?n?.readOnly:n?.[t];return!!(r&&r!==`unsupported`)}function _(e){return[`open`,`guarded`,`read-only`].filter(t=>le(e,t))}var v=[`low`,`medium`,`high`,`max`],y=[`low`,`medium`,`high`,`xhigh`,`max`],b={value:2e5,source:`catalog`,confidence:`declared`},x={value:1e6,source:`catalog`,confidence:`declared`},ue={modalities:{input:{text:!0,image:!0},output:{text:!0}},tools:{code:!0,review:!0,debug:!0,refactor:!0},source:`catalog`,confidence:`declared`},S=[{name:`five_hour`,unit:`%`,reset:!0},{name:`seven_day`,unit:`%`,reset:!0}];function C(e){return{...e?{limits:e}:{},capabilities:ue}}var w={id:`claude`,credentialEnvKeys:p,label:`Claude`,icon:`🟠`,launchModes:[`interactive`,`headless`],effortSwitch:!0,launch:{managedPolicyPrompt:{alwaysOn:`append-system-prompt`},taskHydration:{channel:`append-system-prompt`}},catalog:{defaultModel:`sonnet`,models:[{alias:`haiku-5.5`,label:`Haiku 5.5`,providerModel:`claude-haiku-5-5`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`opus-5.5`,label:`Opus 5.5`,providerModel:`claude-opus-5-5`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`sonnet-5.5`,label:`Sonnet 5.5`,providerModel:`claude-sonnet-5-5`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`fable-5.1`,label:`Fable 5.1`,providerModel:`claude-fable-5-1`,efforts:y,defaultEffort:`high`,...C({contextWindowTokens:x})},{alias:`fable-5`,label:`Fable 5`,providerModel:`claude-fable-5`,efforts:y,defaultEffort:`medium`,unavailable:`suspended by export-control directive, 2026-06-12`,...C({contextWindowTokens:x})},{alias:`opus-4.8`,label:`Opus 4.8`,providerModel:`claude-opus-4-8`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:b})},{alias:`opus-4.8[1m]`,label:`Opus 4.8 1M`,providerModel:`claude-opus-4-8[1m]`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`opus-4.7`,label:`Opus 4.7`,providerModel:`claude-opus-4-7`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:b})},{alias:`opus-4.7[1m]`,label:`Opus 4.7 1M`,providerModel:`claude-opus-4-7[1m]`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`opus-4.6`,label:`Opus 4.6`,providerModel:`claude-opus-4-6`,efforts:v,defaultEffort:`medium`,...C({contextWindowTokens:b})},{alias:`opus-4.6[1m]`,label:`Opus 4.6 1M`,providerModel:`claude-opus-4-6[1m]`,efforts:v,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`sonnet-5`,label:`Sonnet 5`,providerModel:`claude-sonnet-5`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:b})},{alias:`sonnet-5[1m]`,label:`Sonnet 5 1M`,providerModel:`claude-sonnet-5[1m]`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`haiku`,label:`Haiku`,providerModel:`claude-haiku-5-5`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`fable`,label:`Fable`,providerModel:`claude-fable-5-1`,efforts:y,defaultEffort:`high`,...C({contextWindowTokens:x})},{alias:`opus`,label:`Opus`,providerModel:`claude-opus-5-5`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`opus[1m]`,label:`Opus 1M`,providerModel:`claude-opus-5-5`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`sonnet`,label:`Sonnet`,providerModel:`claude-sonnet-5-5`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})},{alias:`sonnet[1m]`,label:`Sonnet 1M`,providerModel:`claude-sonnet-5-5`,efforts:y,defaultEffort:`medium`,...C({contextWindowTokens:x})}]},quotaWindows:[...S],capabilityDefaults:{lifecycle:{managed:!0,shutdownHard:{when:`headless`,value:!0,otherwise:!1},restartHard:{when:`headless`,value:!0,otherwise:!1},semanticStatus:!0,reconnect:!0},session:{fileRead:!0,fileWrite:{when:`approval:not-read-only`,value:!0,otherwise:!1},shell:!0,shellMode:{open:`unrestricted`,guarded:`guarded`,readOnly:`read-only-guarded`}},context:{managed:`headless`,compact:{when:`headless`,value:!0,otherwise:!1},clear:{when:`headless`,value:!0,otherwise:!1},inject:!0,resumePreference:[`native`,`clear-inject`,`none`]},quota:{supported:!0,source:`probe`,unit:`%`,windows:[...S]},terminal:{mode:`live`,condition:`headless`,live:{read:!0,write:!0}},liveSession:{capture:!0,inject:!0,interrupt:!0,promptEcho:!0,reasoning:!0,slashCommands:!0}},slashCommands:[`/clear`,`/compact`,`/model`,`/help`],resume:{supported:!0,idFormat:`uuid-v4`,idPattern:`[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}`},home:{configDir:`.claude`,envPrefix:`CLAUDE`,configDirEnvVar:`CLAUDE_CONFIG_DIR`,quotaCredentialFile:`.credentials.json`,authItems:[`.credentials.json`,`statsig`],globalInstructionFiles:[`CLAUDE.md`]},provisioning:{pluginManifestPath:`.claude-plugin/plugin.json`,bundledPlugin:{ref:`agent-relay-claude-plugin`,dir:`runner/plugins/claude`,title:`Humwick Claude plugin`,description:`Bundled Humwick Claude plugin, materialized whole through the provisioning registry.`,omitFiles:[`monitors/relay-monitor.provisioned.mjs`,`hooks/gate-run-guard.provisioned.mjs`,`hooks/kill-guard.provisioned.mjs`],fileOverrides:[{path:`monitors/relay-monitor.ts`,sourcePath:`monitors/relay-monitor.provisioned.mjs`},{path:`hooks/gate-run-guard.ts`,sourcePath:`hooks/gate-run-guard.provisioned.mjs`},{path:`hooks/kill-guard.ts`,sourcePath:`hooks/kill-guard.provisioned.mjs`}]},bundledHooks:[{ref:`agent-relay-rg-r-guard`,dir:`runner/hooks/rg-r-guard`,title:`Humwick baseline hook: rg -r guard`,description:"Baseline Humwick PreToolUse hook that blocks the ripgrep `rg -r` replace footgun.",baseline:!0},{ref:`agent-relay-fff-search-redirect`,dir:`runner/hooks/fff-search-redirect`,title:`Humwick fff search redirect`,description:`Redirects standalone repository searches to fff for Claude profiles with a configured fff MCP server.`,omitFiles:[`fff-search-redirect.test.ts`]},{ref:`agent-relay-web-tools-redirect`,dir:`runner/hooks/web-tools-redirect`,title:`Humwick web tools redirect`,description:`Redirects built-in WebSearch/WebFetch to the profile's Relay web_search and local-first page reader tools (#3024).`,omitFiles:[`web-tools-redirect.test.ts`]}]},upgrade:{packages:[`agent-relay-runner`,`agent-relay-plugin`],detectPackages:[`agent-relay-runner`],detectCommands:[`claude`]},harness:{upgrade:{strategy:`self-update`,args:[`update`]}},probe:{command:`claude`,args:[`--version`],healthCheck:`claude --version`,featureChecks:[{name:`rig`,command:`claude-rig`,homeDir:`.claude-rig`}],authCheck:{command:`claude`,args:[`auth`,`status`,`--json`],loginArgs:[`auth`,`login`]}},quotaPoll:{strategy:`none`},shim:{kind:`claude-relay`},mcpToolManifest:{clientNativeToolDeferral:!0,runnerManagedToolDeferral:!1}};m(w),m({...w,id:`claude-b`,label:`Claude B`,home:{...w.home,configDir:`.claude-b`,dedicatedHome:!0}}),m({...w,id:`claude-api`,label:`Claude API`,automaticFamilyRouting:!1,defaultEnabled:!1,resume:{supported:!1},credentialEnvKeys:[`ANTHROPIC_API_KEY`],apiAuth:{keyPrefix:`sk-ant-`,keyEnvVar:`ANTHROPIC_API_KEY`,defaultKeyFile:`~/.config/agent-relay/secrets/anthropic-api.key`,unsetEnvKeys:[...p,`ANTHROPIC_BASE_URL`,`CLAUDE_CODE_USE_BEDROCK`,`CLAUDE_CODE_USE_VERTEX`,`CLAUDE_CODE_USE_FOUNDRY`,`ANTHROPIC_CUSTOM_HEADERS`,`CLAUDE_CODE_API_KEY_HELPER_TTL_MS`]},home:{...w.home,configDir:`.claude-api`,sourceEnvVar:`CLAUDE_API_CONFIG_DIR`,dedicatedHome:!0,authItems:[]},launchModes:void 0,quotaWindows:[],capabilityDefaults:{...w.capabilityDefaults,quota:{supported:!1,source:`runtime`,unit:`USD`,windows:[]}}});var T=[`low`,`medium`,`high`,`xhigh`],E={value:2e5,source:`catalog`,confidence:`declared`},D={value:5e5,source:`catalog`,confidence:`declared`},de={modalities:{input:{text:!0,image:!0},output:{text:!0}},tools:{code:!0,review:!0,debug:!0,refactor:!0},source:`catalog`,confidence:`declared`},O=[{name:`primary`,unit:`%`,reset:!0},{name:`secondary`,unit:`%`,reset:!0}];function k(e){return{...e?{limits:e}:{},capabilities:de}}m({id:`codex`,credentialEnvKeys:[`OPENAI_API_KEY`],label:`Codex`,icon:`⌨️`,launchModes:[`interactive`,`headless`],launch:{secretEnvRequiresManagedHome:!0,managedPolicyPrompt:{alwaysOn:`prompt`},taskHydration:{channel:`prompt`}},catalog:{defaultModel:`sol`,models:[{alias:`sol`,label:`GPT-6.1 Sol`,providerModel:`gpt-6.1-sol`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:D})},{alias:`luna`,label:`GPT-6 Luna`,providerModel:`gpt-6-luna`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:E})},{alias:`gpt-6-sol`,label:`GPT-6 Sol`,providerModel:`gpt-6-sol`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:E})},{alias:`gpt-6.1-sol`,label:`GPT-6.1 Sol`,providerModel:`gpt-6.1-sol`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:D})},{alias:`gpt-6-luna`,label:`GPT-6 Luna`,providerModel:`gpt-6-luna`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:E})},{alias:`gpt-5.6-terra`,label:`GPT-5.6 Terra`,providerModel:`gpt-5.6-terra`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:E})},{alias:`gpt-5.5`,label:`GPT-5.5`,providerModel:`gpt-5.5`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:E})},{alias:`gpt-5.4`,label:`GPT-5.4`,providerModel:`gpt-5.4`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:E})},{alias:`gpt-5.4-mini`,label:`GPT-5.4 Mini`,providerModel:`gpt-5.4-mini`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:E})},{alias:`gpt-5.3-codex`,label:`GPT-5.3 Codex`,providerModel:`gpt-5.3-codex`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:E})},{alias:`gpt-5.3-codex-spark`,label:`GPT-5.3 Codex Spark`,providerModel:`gpt-5.3-codex-spark`,efforts:T,defaultEffort:`high`,...k({contextWindowTokens:E})},{alias:`gpt-5.2`,label:`GPT-5.2`,providerModel:`gpt-5.2`,efforts:T,defaultEffort:`medium`,...k({contextWindowTokens:E})}]},quotaWindows:[...O],capabilityDefaults:{lifecycle:{managed:!0,shutdownHard:!0,restartHard:!0,semanticStatus:!0,reconnect:!0},session:{fileRead:!0,fileWrite:{when:`approval:not-read-only`,value:!0,otherwise:!1},shell:{when:`approval:not-read-only`,value:!0,otherwise:!1},shellMode:{open:`unrestricted`,guarded:`guarded`,readOnly:`none`}},context:{managed:`always`,compact:!0,clear:!0,inject:!0,resumePreference:[`native`,`clear-inject`,`none`]},quota:{supported:!0,source:`probe`,unit:`%`,windows:[...O]},terminal:{mode:`attach`,attach:{create:!0,read:!0,write:!0,detach:!0}},liveSession:{capture:!0,inject:!0,interrupt:!0,promptEcho:!0,reasoning:!0,slashCommands:!0}},slashCommands:[`/compact`,`/new`],resume:{supported:!0,idFormat:`codex-thread-id`,idPattern:`[\\w-]+`},home:{configDir:`.codex`,envPrefix:`CODEX`,configDirEnvVar:`CODEX_HOME`,quotaCredentialFile:`auth.json`,authItems:[`auth.json`,`installation_id`],globalInstructionFiles:[`AGENTS.md`]},provisioning:{pluginManifestPath:`.codex-plugin/plugin.json`,bundledSkills:{refPrefix:`agent-relay-codex-`,dir:`runner/plugins/codex/skills`,titlePrefix:`Humwick Codex skill: `,description:`Bundled Humwick Codex skill, materialized through the provisioning registry.`,entryFile:`SKILL.md`},bundledHooks:[{ref:`agent-relay-rg-r-guard`,dir:`runner/hooks/rg-r-guard`,title:`Humwick baseline hook: rg -r guard`,description:"Baseline Humwick PreToolUse hook that blocks the ripgrep `rg -r` replace footgun.",baseline:!0}]},upgrade:{packages:[`agent-relay-runner`,`agent-relay-codex`],detectPackages:[`agent-relay-runner`,`agent-relay-codex`],detectCommands:[`codex-relay`,`agent-relay-runner`]},harness:{upgrade:{strategy:`self-update`,args:[`update`]}},probe:{command:`codex`,args:[`--version`],healthCheck:`codex --version`,authCheck:{command:`codex`,args:[`login`,`status`],loginArgs:[`login`]}},quotaPoll:{strategy:`codex-app-server`},resetCredits:{supported:!0},shim:{kind:`codex-relay`,extraBinPaths:[`codex/bin/codex`],cleanLegacyHooks:!0},mcpToolManifest:{clientNativeToolDeferral:!1,runnerManagedToolDeferral:!0,runnerManagedToolDeferralRoute:`meta-only-callmux`}});var A={mode:`attach`,attach:{create:!0,read:!0,write:!0,detach:!0}},j=`opencode-ai@latest`;m({id:`opencode`,label:`OpenCode`,icon:`⚡`,launch:{managedPolicyPrompt:{alwaysOn:`prompt`},taskHydration:{channel:`prompt`}},catalog:{defaultModel:`muse-spark`,models:[{alias:`muse-spark`,label:`Muse Spark 1.3 Contributor`,providerModel:`meta/muse-spark-1.3-contributor`,efforts:[],limits:{contextWindowTokens:{value:1048576,source:`catalog`,confidence:`declared`},maxOutputTokens:{value:943718,source:`catalog`,confidence:`declared`}},capabilities:{modalities:{input:{text:!0},output:{text:!0}},tools:{code:!0,shell:!0,fileRead:!0,fileWrite:!0},source:`provider`,confidence:`estimated`}},{alias:`openai/gpt-6.1-sol`,label:`GPT-6.1 Sol · OpenAI API`,providerModel:`openai/gpt-6.1-sol`,efforts:[],limits:{contextWindowTokens:{value:272e3,source:`catalog`,confidence:`declared`},maxOutputTokens:{value:128e3,source:`catalog`,confidence:`declared`}}}]},quotaWindows:[],capabilityDefaults:{lifecycle:{managed:!0,shutdownHard:!0,restartHard:!0,semanticStatus:!0,reconnect:!0},session:{fileRead:!0,fileWrite:!0,shell:!0,shellMode:{open:`unrestricted`,guarded:`unsupported`,readOnly:`unsupported`}},context:{managed:`always`,compact:!0,clear:!0,inject:!0,resumePreference:[`native`,`clear-inject`,`none`]},quota:{supported:!1,source:`runtime`,unit:`%`,windows:[]},terminal:A,liveSession:{capture:!0,inject:!0,interrupt:!0,promptEcho:!0,reasoning:!1,slashCommands:!1}},resume:{supported:!1},home:{configDir:`.config/opencode`,envPrefix:`OPENCODE`},opencode:{opencodeProviderID:`openrouter`,apiKeyEnvVar:`OPENROUTER_API_KEY`},upgrade:{packages:[`agent-relay-runner`],externalPackages:[j],detectPackages:[`opencode-ai`],detectCommands:[`opencode`]},harness:{upgrade:{strategy:`external-packages`}},probe:{command:`opencode`,args:[`--version`],healthCheck:`opencode --version`},shim:{kind:`opencode-relay`},quotaPoll:{strategy:`none`},mcpToolManifest:{clientNativeToolDeferral:!1,runnerManagedToolDeferral:!1}});var M=[{name:`rolling`,unit:`%`,reset:!0,description:`Rolling 5-hour usage window`},{name:`weekly`,unit:`%`,reset:!0,description:`Weekly usage window`},{name:`monthly`,unit:`%`,reset:!0,description:`Monthly usage window (display-only)`}],fe={modalities:{input:{text:!0},output:{text:!0}},tools:{code:!0,shell:!0,fileRead:!0,fileWrite:!0},source:`provider`,confidence:`estimated`};function N(e,t){return{alias:e,label:t,providerModel:e,efforts:[],capabilities:fe}}m({id:`opencode-go`,label:`OpenCode Go`,icon:`⚡`,defaultEnabled:!1,launch:{managedPolicyPrompt:{alwaysOn:`prompt`},taskHydration:{channel:`prompt`}},catalog:{defaultModel:`glm-5.3-flash`,models:[N(`claude-haiku-5-5`,`Claude Haiku 5.5`),N(`deepseek-v4-pro`,`DeepSeek V4 Pro`),N(`deepseek-v4.1-flash`,`DeepSeek V4.1 Flash`),N(`gemini-4-argon-contributor`,`Gemini 4 Argon Contributor`),N(`glm-5.2`,`GLM-5.2`),N(`glm-5.3`,`GLM-5.3`),N(`glm-5.3-flash`,`GLM-5.3 Flash`),N(`gpt-5.6-luna`,`GPT-5.6 Luna`),N(`gpt-6-luna`,`GPT-6 Luna`),N(`grok-4.6`,`Grok 4.6`),N(`grok-4.7`,`Grok 4.7`),N(`hy3`,`Hy3`),N(`hy4-preview`,`Hy4 Preview`),N(`kimi-k2.7-code`,`Kimi K2.7 Code`),N(`kimi-k3`,`Kimi K3`),N(`longcat-2.0`,`LongCat 2.0`),N(`mimo-v2.5`,`MiMo V2.5`),N(`mimo-v2.5-pro`,`MiMo V2.5 Pro`),N(`mimo-v2.6-flash`,`MiMo V2.6 Flash`),N(`mimo-v2.6-pro`,`MiMo V2.6 Pro`),N(`minimax-m2.7`,`MiniMax M2.7`),N(`minimax-m3`,`MiniMax M3`),N(`muse-spark-1.2-contributor`,`Muse Spark 1.2 Contributor`),N(`muse-spark-1.3-contributor`,`Muse Spark 1.3 Contributor`),N(`qwen3.7-plus`,`Qwen3.7 Plus`),N(`qwen3.8-flash`,`Qwen3.8 Flash`),N(`qwen3.8-max`,`Qwen3.8 Max`),N(`space-bunny`,`Space Bunny`)]},quotaWindows:[...M],capabilityDefaults:{lifecycle:{managed:!0,shutdownHard:!0,restartHard:!0,semanticStatus:!0,reconnect:!0},session:{fileRead:!0,fileWrite:!0,shell:!0,shellMode:{open:`unrestricted`,guarded:`unsupported`,readOnly:`unsupported`}},context:{managed:`always`,compact:!0,clear:!0,inject:!0,resumePreference:[`native`,`clear-inject`,`none`]},quota:{supported:!0,source:`runtime`,unit:`%`,windows:[...M]},terminal:A,liveSession:{capture:!0,inject:!0,interrupt:!0,promptEcho:!0,reasoning:!1,slashCommands:!1}},resume:{supported:!1},home:{configDir:`.local/share/opencode`,envPrefix:`OPENCODE_GO`,quotaCredentialFile:`auth.json`},opencode:{opencodeProviderID:`opencode-go`,apiKeyEnvVar:`OPENCODE_API_KEY`,hostAuth:!0},upgrade:{packages:[`agent-relay-runner`],externalPackages:[j],detectPackages:[`opencode-ai`],detectCommands:[`opencode`]},harness:{upgrade:{strategy:`external-packages`}},probe:{command:`opencode`,args:[`--version`],healthCheck:`opencode --version`},shim:{kind:`opencode-relay`},quotaPoll:{strategy:`opencode-go`},quotaAlsoWith:`opencode`,mcpToolManifest:{clientNativeToolDeferral:!1,runnerManagedToolDeferral:!1}});var P={value:1e6,source:`catalog`,confidence:`declared`},F={value:131072,source:`catalog`,confidence:`declared`},pe={modalities:{input:{text:!0},output:{text:!0}},tools:{code:!0,shell:!0,fileRead:!0,fileWrite:!0},source:`provider`,confidence:`declared`},me={modalities:{input:{text:!0,image:!0},output:{text:!0}},tools:{code:!0,shell:!0,fileRead:!0,fileWrite:!0},source:`provider`,confidence:`declared`},I=[{name:`five_hour`,unit:`%`,reset:!0,description:`Rolling 5-hour credit window`},{name:`seven_day`,unit:`%`,reset:!0,description:`Weekly credits, reset from the subscription timestamp`}];m({id:`zai`,label:`z.ai`,icon:`🟣`,launch:{managedPolicyPrompt:{alwaysOn:`prompt`},taskHydration:{channel:`prompt`}},catalog:{defaultModel:`glm-5.3-flash`,models:[{alias:`glm-5.3`,label:`GLM-5.3`,providerModel:`glm-5.3`,efforts:[],limits:{contextWindowTokens:P,maxOutputTokens:F},capabilities:pe},{alias:`glm-5.3-flash`,label:`GLM-5.3 Flash`,providerModel:`glm-5.3-flash`,efforts:[],limits:{contextWindowTokens:P,maxOutputTokens:F},capabilities:me}]},quotaWindows:[...I],capabilityDefaults:{lifecycle:{managed:!0,shutdownHard:!0,restartHard:!0,semanticStatus:!0,reconnect:!0},session:{fileRead:!0,fileWrite:!0,shell:!0,shellMode:{open:`unrestricted`,guarded:`unsupported`,readOnly:`unsupported`}},context:{managed:`always`,compact:!0,clear:!0,inject:!0,resumePreference:[`native`,`clear-inject`,`none`]},quota:{supported:!0,source:`runtime`,unit:`%`,windows:[...I]},terminal:A,liveSession:{capture:!0,inject:!0,interrupt:!0,promptEcho:!0,reasoning:!1,slashCommands:!1}},resume:{supported:!1},home:{configDir:`.config/opencode`,envPrefix:`ZAI`,quotaCredentialFile:`auth.json`},opencode:{opencodeProviderID:`zai`,baseURL:`https://api.z.ai/api/coding/paas/v4`,npm:`@ai-sdk/openai-compatible`,apiKeyEnvVar:`ZAI_API_KEY`},upgrade:{packages:[`agent-relay-runner`],externalPackages:[j],detectPackages:[`opencode-ai`],detectCommands:[`opencode`]},harness:{upgrade:{strategy:`external-packages`}},probe:{command:`opencode`,args:[`--version`],healthCheck:`opencode --version`},shim:{kind:`opencode-relay`},quotaPoll:{strategy:`zai`},mcpToolManifest:{clientNativeToolDeferral:!1,runnerManagedToolDeferral:!1}}),Object.freeze({codex:{"gpt-5.6-terra":`sol`,"gpt-5.6-sol":`sol`,"gpt-6-sol":`sol`,"gpt-6.1-sol":`sol`,"gpt-5.6-luna":`luna`,"gpt-6-luna":`luna`},claude:{"opus-4.8":`opus`,"sonnet-5":`sonnet`,"fable-5":`fable`},"claude-b":{"opus-4.8":`opus`,"sonnet-5":`sonnet`,"fable-5":`fable`}});var L={opencode:{envVar:`OPENCODE_API_KEY`},"opencode-go":{envVar:`OPENCODE_API_KEY`},anthropic:{envVar:`ANTHROPIC_API_KEY`},openai:{envVar:`OPENAI_API_KEY`},openrouter:{envVar:`OPENROUTER_API_KEY`},google:{envVar:`GOOGLE_GENERATIVE_AI_API_KEY`},mistral:{envVar:`MISTRAL_API_KEY`},deepseek:{envVar:`DEEPSEEK_API_KEY`},xai:{envVar:`XAI_API_KEY`},groq:{envVar:`GROQ_API_KEY`},azure:{envVar:`AZURE_API_KEY`},moonshotai:{envVar:`MOONSHOT_API_KEY`},cerebras:{envVar:`CEREBRAS_API_KEY`},cohere:{envVar:`COHERE_API_KEY`},"fireworks-ai":{envVar:`FIREWORKS_API_KEY`},togetherai:{envVar:`TOGETHER_API_KEY`},chutes:{envVar:`CHUTES_API_KEY`},zai:{envVar:`ZAI_API_KEY`,custom:!0}},R=class extends Error{candidates;constructor(e,t){super(e),this.candidates=t,this.name=`OpenCodeModelResolutionError`}},z=8;function B(e,t){let n=e.indexOf(`/`);return n<=0?{backendID:t,modelID:e,qualified:`${t}/${e}`}:{backendID:e.slice(0,n),modelID:e.slice(n+1),qualified:e}}function he(e,t,n){let r=e.trim();if(!r)throw new R(`OpenCode model id is empty.`,[]);let i=r.indexOf(`/`),a=i>0?r.slice(0,i):void 0;if(!n)return a&&(a===t||L[a]!==void 0)?B(r,t):{backendID:t,modelID:r,qualified:`${t}/${r}`};if(n.models.has(r))return B(r,t);if(n.models.has(`${t}/${r}`))return{backendID:t,modelID:r,qualified:`${t}/${r}`};if(a&&n.providers.has(a))return B(r,t);if(!a){let e=[...n.models].filter(e=>e.slice(e.indexOf(`/`)+1)===r);if(e.length===1)return B(e[0],t);if(e.length>1){let t=e.sort().slice(0,z);throw new R(`OpenCode model "${r}" is ambiguous on this host (${n.source} registry); qualify it as one of: ${t.join(`, `)}.`,t)}}let o=ge(r,n),s=o.length?` Did you mean: ${o.join(`, `)}?`:``;throw new R(`OpenCode model "${r}" is not available on this host (${n.source} registry: backend "${a??t}" is not a known opencode provider and no listed model matches).${s}`,o)}function ge(e,t){let n=e.slice(e.lastIndexOf(`/`)+1).toLowerCase();if(!n)return[];let r=[],i=[];for(let e of t.models){let t=e.slice(e.lastIndexOf(`/`)+1).toLowerCase();t===n?r.push(e):t.includes(n)&&i.push(e)}return[...r.sort(),...i.sort()].slice(0,z)}var _e=[`off`,`quiet`,`normal`,`verbose`];g().map(e=>e.id);var V=[`narration`,`tools`,`reasoning`,`memories`,`startup`,`injected`,`agentMessages`,`workflow`,`land`,`task`,`agents`,`other`,`undelivered`],ve=[`workflow`,`land`,`task`,`agents`,`other`];function H(e){return Object.fromEntries(V.map(t=>[t,e(t)]))}var U=H(e=>ve.includes(e)),W={calm:U,everything:H(()=>!0)};function ye(e){let t=e&&typeof e==`object`&&!Array.isArray(e)?e:{};return H(e=>typeof t[e]==`boolean`?t[e]:U[e])}function be(e){for(let[t,n]of Object.entries(W))if(V.every(t=>n[t]===e[t]))return t;return null}function xe(e,t){let n=e?.opencodeProviderID,r=t?.trim();if(!(!n||!r))return he(r,n).qualified}function Se(e){return!e?.disabled}var Ce=.1,we=.9,G=.8,K=.4,q=256e3,J=1e6;function Te(){return g().map(e=>({provider:e.id,label:e.label,models:[],...e.opencode?.opencodeProviderID?{opencodeProviderID:e.opencode.opencodeProviderID}:{},...e.launchModes?.length?{launchModes:[...e.launchModes]}:{},...e.effortSwitch?{effortSwitch:!0}:{}}))}function Ee(e){let t=De(e);return{selfCompactUtilization:t,warnUtilization:Oe(t),hardBackstopUtilization:Math.max(we,t)}}function De(e){return!Number.isFinite(e)||!e||e<=q?G:e>=J?K:Y(G-(e-q)/(J-q)*(G-K))}function Oe(e){return Y(Math.max(0,e-Ce))}function Y(e){return Math.round(e*1e3)/1e3}function X(e,t){if(e)return(t??Te()).find(t=>t.provider===e)}function ke(e,t,n={}){let r=(Array.isArray(t)?t:t?[t]:[]).map(e=>e.trim()).filter(Boolean);if(r.length){for(let t of r){let i=Ae(e,t,n.requireUnambiguous),a=je(e,i,r,n.observedWindowTokens);if(a)return a;if(i)return i}if(!(n.requireUnambiguous||n.exactOnly))for(let t of r){let n=e.models.find(e=>e.alias.startsWith(t+`-`));if(n)return n}}}function Ae(e,t,n=!1){let r=t.toLowerCase(),i=e.models.find(e=>e.alias===t)??e.models.find(e=>e.alias.toLowerCase()===r);if(i)return i;let a=e.models.filter(e=>e.providerModel.toLowerCase()===r);if(a.length>1&&n)throw Error(`ambiguous ${e.provider} provider model: ${t} (select an alias: ${a.map(e=>e.alias).join(`, `)})`);return a[0]}function je(e,t,n,r){if(!Number.isFinite(r)||!r)return;if(t?.limits?.contextWindowTokens?.value===r)return t;let i=new Set([...t?[t.alias,t.providerModel]:[],...n].map(Z));return e.models.find(e=>e.limits?.contextWindowTokens?.value===r&&(i.has(Z(e.alias))||i.has(Z(e.providerModel))))}function Z(e){return e.trim().toLowerCase().replace(/\[[^\]]+\]$/,``)}function Me(e){return!e.disabled&&!e.unavailable}function Ne(e){let t=e.defaultModel,n=t?e.models.find(e=>e.alias===t):void 0;return n&&Me(n)?{alias:n.alias,preferred:t,fellBack:!1}:{alias:void 0,preferred:t,fellBack:!0}}function Pe(e){return h(e)?.resetCredits?.supported===!0}var Q=[`bg-tone-warning/10 text-tone-warning-fg border-tone-warning/30`,`bg-tone-sky/10 text-tone-sky-fg border-tone-sky/30`,`bg-tone-violet/10 text-tone-violet-fg border-tone-violet/30`,`bg-tone-success/10 text-tone-success-fg border-tone-success/30`,`bg-tone-rose/10 text-tone-rose-fg border-tone-rose/30`];function Fe(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t}var $=new Map(g().map((e,t)=>[e.id,Q[t%Q.length]]));function Ie(e){return e?h(e)?.label??e.charAt(0).toUpperCase()+e.slice(1):`Unknown provider`}function Le(e){let t=$.get(e);if(t)return t;let n=Q[Fe(e)%Q.length];return $.set(e,n),n}function Re(){return g().map(e=>e.id)}function ze(e){return h(e)}function Be(e,t){let n=e?.id||e?.alias;if(!e||!n)return;let r=X(e.provider,t),i=r?ke(r,[e.alias||``,n]):void 0;return{label:i?.label||n,...i?{entry:i}:{}}}export{o as A,se as C,te as D,a as E,n as M,e as N,c as O,t as P,ae as S,i as T,_,Pe as a,u as b,X as c,Ne as d,U as f,_e as g,ye as h,ze as i,r as j,ee as k,Se as l,be as m,Le as n,Be as o,W as p,Ie as r,Ee as s,Re as t,xe as u,d as v,s as w,re as x,l as y};
2
- //# sourceMappingURL=provider-display-DsuWMvVL.js.map
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{o as t,p as n,u as r}from"./dist-DeW2Y1R5.js";import{t as i}from"./store-DcClXLH0.js";import{h as a}from"./display-BrKWFGJz.js";import{t as o}from"./api-CIIVBtAV.js";import{t as s}from"./agent-liveness-CaNwK0Zf.js";import{t as c}from"./check-B3M9Ug1P.js";import{n as l,t as u}from"./octagon-x-B5lnUY-8.js";import{t as d}from"./inbox-Dfwk3Gt8.js";import{t as f}from"./pause-DttnHD4c.js";import{t as p}from"./play-BbT8m7A0.js";import{t as m}from"./rotate-ccw-CtD77qkX.js";import{n as h}from"./workflow-marker-DAZcj5qt.js";import{t as g}from"./button-Do6Z3vvn.js";import{t as _}from"./input-CsTB6jIx.js";import{t as v}from"./crate-agent-30aXTKva.js";var y=e(n(),1),b=r();function x({runId:e}){let[t,n]=(0,y.useState)(),[r,i]=(0,y.useState)();async function a(e,t){try{let r=new URLSearchParams({verbose:`true`,...t}),a=await o(`GET`,`/workflows/runs/${encodeURIComponent(e)}?${r}`);n(e=>t&&e&&e.runId===a.runId?{...a,activations:t.activationCursor?[...e.activations??[],...a.activations??[]]:a.activations,children:t.childCursor?[...e.children??[],...a.children??[]]:a.children,itemResults:t.resultsCursor?[...e.itemResults??[],...a.itemResults??[]]:a.itemResults}:a),i(void 0)}catch(e){i(e.message)}}async function s(e,n){try{await o(`POST`,`/workflows/runs/${encodeURIComponent(t.runId)}/${e}`,{...n?{activationId:n}:{}}),await a(t.runId)}catch(e){i(e.message)}}return(0,b.jsxs)(`details`,{className:`text-xs`,onToggle:n=>{n.currentTarget.open&&!t&&a(e)},children:[(0,b.jsx)(`summary`,{className:`cursor-pointer`,children:`Workflow inputs, children and results`}),r&&(0,b.jsx)(`p`,{role:`alert`,children:r}),t&&(0,b.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,b.jsxs)(`p`,{children:[t.runId,`: `,t.status]}),(0,b.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>void a(t.runId),children:`Refresh run`}),[`running`,`escalated`].includes(t.status)&&(0,b.jsx)(`button`,{type:`button`,className:`ml-2 underline`,onClick:()=>void s(`cancel`),children:`Cancel run`}),t.cleanup&&(0,b.jsxs)(`p`,{children:[`Cleanup: `,t.cleanup.status,t.cleanup.error?` — ${t.cleanup.error}`:``]}),t.parentRunId&&(0,b.jsxs)(`button`,{type:`button`,className:`underline`,onClick:()=>void a(t.parentRunId),children:[`Parent `,t.parentRunId]}),t.rootRunId&&t.rootRunId!==t.runId&&(0,b.jsxs)(`button`,{type:`button`,className:`ml-2 underline`,onClick:()=>void a(t.rootRunId),children:[`Root `,t.rootRunId]}),(0,b.jsx)(`ul`,{"aria-label":`Child workflows`,children:t.children?.map(e=>(0,b.jsxs)(`li`,{children:[(0,b.jsxs)(`button`,{type:`button`,className:`underline`,onClick:()=>void a(e.runId),children:[e.workflow,`: `,e.runId]}),` — `,e.status,e.reason&&(0,b.jsx)(`p`,{children:e.reason})]},e.runId))}),t.childrenCursor&&(0,b.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>void a(t.runId,{childCursor:t.childrenCursor}),children:`More children`}),(0,b.jsx)(`ul`,{"aria-label":`Workflow activations`,children:t.activations?.map(e=>(0,b.jsxs)(`li`,{children:[e.path,`: `,e.state,e.needs?.length?(0,b.jsxs)(`span`,{children:[` · needs `,e.needs.join(`, `),` (`,e.remaining??0,` remaining)`]}):null,e.outcome?` (${e.outcome})`:``,e.container&&(0,b.jsxs)(`p`,{children:[e.container.settled,`/`,e.container.total,` settled · `,e.container.live,` active · `,e.container.failed,` failed`,e.container.winner?` · winner ${e.container.winner}`:``,e.container.stopped?` · admissions stopped`:``,` `,(0,b.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>void a(t.runId,{resultsRef:e.id}),children:`Item results`})]}),e.childRunId&&(0,b.jsxs)(`button`,{type:`button`,className:`ml-2 underline`,onClick:()=>void a(e.childRunId),children:[`Child `,e.childRunId]}),e.parentId&&e.state===`failed`&&t.status===`escalated`&&(0,b.jsxs)(`button`,{type:`button`,className:`ml-2 underline`,onClick:()=>void s(`resume`,e.id),children:[`Retry item `,e.key??e.index]}),e.error&&(0,b.jsx)(`pre`,{className:`max-h-32 overflow-auto whitespace-pre-wrap`,children:JSON.stringify(e.error,null,2)})]},e.id))}),t.activationsCursor&&(0,b.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>void a(t.runId,{activationCursor:t.activationsCursor}),children:`More activations`}),t.itemResults&&(0,b.jsx)(`ol`,{"aria-label":`Item results`,children:t.itemResults.map(e=>(0,b.jsxs)(`li`,{children:[e.key,`: `,e.status,(0,b.jsx)(`pre`,{className:`max-h-32 overflow-auto whitespace-pre-wrap`,children:JSON.stringify(e.outputs??e.error??{},null,2)})]},e.key))}),t.itemResultsCursor&&(0,b.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>void a(t.runId,{resultsRef:t.resultsRef,resultsCursor:t.itemResultsCursor}),children:`More item results`}),(0,b.jsx)(`pre`,{className:`max-h-48 overflow-auto whitespace-pre-wrap`,children:JSON.stringify({inputs:t.inputs,outputs:t.outputs??t.output},null,2)})]})]})}var S=e=>e.kind===`agent`?`/agents/${encodeURIComponent(e.agentId)}/spawn-budget`:`/workflows/runs/${encodeURIComponent(e.runId)}/budget`;function C(e,t){return e.kind===`agent`?t.budgets.find(t=>t.subtreeAgentId===e.agentId):t}function w(e){return[e.unknownReports?`${e.unknownReports} report${e.unknownReports===1?``:`s`} without counts`:``,e.unreportedReports?`${e.unreportedReports} not yet stored`:``,e.busyAgents?`${e.busyAgents} agent${e.busyAgents===1?``:`s`} mid-turn`:``].filter(Boolean).join(`, `)}function T({target:e}){return(0,b.jsx)(E,{target:e},S(e))}function E({target:e}){let[t,n]=(0,y.useState)(),[r,i]=(0,y.useState)(),[a,s]=(0,y.useState)(``),c=S(e);if((0,y.useEffect)(()=>{let t=!0,r=()=>o(`GET`,c).then(r=>{t&&n(C(e,r))},()=>{t&&n(void 0)});r().catch(()=>{});let i=setInterval(r,3e4);return()=>{t=!1,clearInterval(i)}},[c]),!t)return null;let l=async a=>{a.preventDefault();let l=Number(r);if(!Number.isSafeInteger(l)||l<=0){s(`Enter a whole number of tokens above 0`);return}try{let r=await o(`PATCH`,c,{tokenCap:l});n(C(e,r)??t),i(void 0),s(``)}catch(e){s(e instanceof Error?e.message:`Could not save the budget`)}},u=w(t),d=Math.min(100,Math.round(t.tokens/t.tokenCap*100));return(0,b.jsxs)(`section`,{"aria-label":`Token budget`,"data-testid":`delegated-budget`,"data-exhausted":t.exhausted,className:`space-y-2 rounded-md border p-3 text-xs`,children:[(0,b.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,b.jsx)(`h3`,{className:`font-medium`,children:`Token budget`}),t.exhausted&&(0,b.jsx)(`span`,{"data-testid":`budget-exhausted`,className:`rounded border border-tone-danger/30 bg-tone-danger/10 px-1.5 py-0.5 font-medium text-tone-danger-fg`,children:`Exhausted: new spawns refused`}),t.partlyUnknown&&(0,b.jsx)(`span`,{"data-testid":`budget-unknown`,title:u,className:`rounded border border-tone-warning/30 bg-tone-warning/10 px-1.5 py-0.5 text-tone-warning-fg`,children:`Partly unknown`})]}),(0,b.jsxs)(`p`,{"data-testid":`budget-spend`,className:`tabular-nums`,children:[t.partlyUnknown?`At least `:``,t.tokens.toLocaleString(),` of `,t.tokenCap.toLocaleString(),` tokens observed`]}),(0,b.jsx)(`div`,{role:`progressbar`,"aria-valuemin":0,"aria-valuemax":t.tokenCap,"aria-valuenow":Math.min(t.tokens,t.tokenCap),className:`h-1.5 overflow-hidden rounded bg-muted`,children:(0,b.jsx)(`div`,{className:`h-full ${t.exhausted?`bg-tone-danger`:`bg-tone-info`}`,style:{width:`${d}%`}})}),u&&(0,b.jsxs)(`p`,{className:`text-muted-foreground`,children:[`True spend is higher than shown: `,u,`.`]}),r===void 0?(0,b.jsx)(g,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>i(String(t.tokenCap)),children:`Edit cap`}):(0,b.jsxs)(`form`,{onSubmit:l,className:`flex flex-wrap items-center gap-2`,children:[(0,b.jsx)(`label`,{className:`sr-only`,htmlFor:`budget-cap-${c}`,children:`Token cap`}),(0,b.jsx)(_,{id:`budget-cap-${c}`,inputMode:`numeric`,className:`h-8 w-36`,value:r,onChange:e=>i(e.target.value)}),(0,b.jsx)(g,{type:`submit`,size:`sm`,children:`Save`}),(0,b.jsx)(g,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>{i(void 0),s(``)},children:`Cancel`})]}),a&&(0,b.jsx)(`p`,{role:`alert`,className:`text-tone-danger-fg`,children:a}),(0,b.jsx)(`p`,{className:`text-muted-foreground`,children:`Soft cap: running work finishes; raising it lets new spawns through.`})]})}function D({text:e,className:n}){return(0,b.jsx)(`span`,{className:t(`block min-w-0 max-w-full truncate`,n),title:e,children:e})}var O=`land`,k=`ci-main`,A={pass:`CI pass`,fail:`CI red`,none:`no CI`};function j(e){let t=e.rounds.find(t=>t.round===e.round)?.steps??[],n=new Map(t.map(e=>[e.step,e.outcome])),r=e.stations?e.stations.map(t=>e.steps.find(e=>e.name===t)??{name:t}):[...e.steps,{name:O},...e.ciMain?[{name:k}]:[]],i=!!e.landedSha||e.status===`done`||e.step===`ci-main`;return r.map(t=>{let r=t.name===`ci-main`&&e.output?.ci?A[e.output.ci.status]:void 0,a=t.name===`land`&&i?`landed`:r??n.get(t.name),o={...t,state:`waiting`,...a?{outcome:a}:{}};return e.status===`running`?o.state=t.name===e.step?`current`:a?`done`:`waiting`:e.status===`done`?o.state=`done`:o.state=t.name===e.step?`stopped`:a?`done`:`waiting`,o})}function M(e){if(e.status!==`running`||!e.awaiting)return;let{kind:t,taskId:n,timedOutAt:r}=e.awaiting,i=t===`landed`?`Waiting for the land`:t===`ci`?`Waiting for CI on main${e.awaiting.sha?` at ${e.awaiting.sha.slice(0,7)}`:``}`:t===`decision`?`Waiting for the operator decision`:t===`script`?`Waiting for the script`:t===`closed`?`Closing the Task and delivering issues`:`Waiting for a delivery${n?` on T${n}`:``}`;return r?`${i}, past its time limit`:i}function N(e){return e.reapedAt?`reaped`:e.exitedAt?`exited`:e.keptAt?`kept`:e.readyAt?`ready`:`starting`}function P(e){let t=e.crossProvider?.fallback?e.crossProvider:void 0;return e.provider?t?{label:`${e.provider}, same as ${t.step}`,title:`Prefers a provider other than ${t.step}'s ${t.avoided}${t.reason?`: ${t.reason}`:``}`}:{label:e.provider}:{}}var F=[`provider`,`model`,`effort`,`orchestratorId`],I={start:`start call`,resume:`resume`,team:`team default`,global:`global default`,workflow:`workflow file`};function L(e){let t=F.filter(t=>e?.[t]);if(!(!e||!t.length))return{label:`Pinned: ${t.map(t=>t===`orchestratorId`?`on ${e[t]}`:e[t]).join(` `)}`,title:t.map(t=>`${t===`orchestratorId`?`host`:t} ${e[t]} (${I[e.from[t]??`workflow`]})`).join(`, `)}}function R(e){if(e.status===`done`){if(e.step===`close`)return`Verified and closed`;if(e.scriptRuns?.length&&!e.output?.landedSha)return`Done`;let t=e.output?.ci?`, ${A[e.output.ci.status]}`:``;return e.output?.nothingToLand&&e.output.landedSha?`Nothing to land, on main at ${e.output.landedSha.slice(0,7)}`:e.output?.landedSha?`Landed ${e.output.landedSha.slice(0,7)}${t}`:`Done`}return e.status===`escalated`?`Escalated`:e.status===`cancelled`?`Cancelled`:e.status===`failed`?`Failed`:`Running`}var z={done:`done`,current:`current step`,waiting:`not reached`,stopped:`stopped here`};function B({taskId:e,title:t}){let n=i(e=>e.openTaskDetailById);return(0,b.jsxs)(`button`,{type:`button`,onClick:()=>n(e),className:`flex min-w-0 max-w-full items-baseline gap-1.5 rounded text-left hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,children:[(0,b.jsxs)(`span`,{className:`shrink-0 rounded bg-muted px-1 font-mono text-[11px] tabular-nums text-muted-foreground`,children:[`T`,e]}),t&&(0,b.jsx)(D,{text:t,className:`font-medium`})]})}function V({node:e,run:t}){let n=e.state===`current`?M(t):void 0,r=L(e.pin);return(0,b.jsxs)(`li`,{"data-testid":`workflow-node-${e.name}`,"data-state":e.state,className:`wf-station flex min-w-0 items-start gap-2 sm:flex-col sm:items-center sm:text-center`,children:[(0,b.jsxs)(`span`,{className:`wf-stop grid h-8 w-8 shrink-0 place-items-center rounded-full`,"aria-label":`${e.name}: ${z[e.state]}`,role:`img`,children:[e.state===`done`&&(0,b.jsx)(c,{className:`h-4 w-4`,"aria-hidden":!0}),e.state===`stopped`&&(0,b.jsx)(u,{className:`h-4 w-4`,"aria-hidden":!0}),e.state===`waiting`&&(0,b.jsx)(l,{className:`h-4 w-4`,"aria-hidden":!0}),e.state===`current`&&(0,b.jsx)(`span`,{className:`h-2.5 w-2.5 rounded-full bg-current`,"aria-hidden":!0})]}),(0,b.jsxs)(`div`,{className:`min-w-0`,children:[(0,b.jsx)(D,{text:e.name,className:`text-sm font-semibold`}),e.role&&(0,b.jsx)(D,{text:`${e.role}${e.gate?`, gate ${e.gate}`:``}`,className:`text-xs text-muted-foreground`}),r&&(0,b.jsx)(`div`,{"data-testid":`workflow-node-pin`,className:`truncate text-xs text-muted-foreground`,title:r.title,children:r.label}),e.outcome&&(0,b.jsx)(`div`,{className:`wf-outcome truncate text-xs font-medium`,"data-outcome":e.outcome,children:e.outcome}),n&&(0,b.jsx)(`div`,{className:`truncate text-xs font-medium text-foreground`,children:n})]})]})}function H({run:e}){return(0,b.jsx)(`ol`,{"aria-label":`Steps`,className:`wf-line grid gap-3 sm:auto-cols-fr sm:grid-flow-col`,children:j(e).map(t=>(0,b.jsx)(V,{node:t,run:e},t.name))})}function U({run:e,agentsById:t,now:n}){return e.agents.length?(0,b.jsx)(`ul`,{"aria-label":`Step agents`,className:`flex flex-wrap gap-x-4 gap-y-1.5`,children:e.agents.map(r=>{let i=r.agentId?t[r.agentId]:void 0,a=P(r);return(0,b.jsxs)(`li`,{"data-testid":`workflow-agent`,className:`flex min-w-0 items-center gap-1.5 text-xs`,children:[(0,b.jsx)(h,{workflow:e.workflow,step:r.step}),r.agentId?(0,b.jsx)(v,{holder:{id:r.agentId,...i?{agent:i}:{},live:s(n,i)},workflowMarker:!1}):(0,b.jsx)(`span`,{className:`text-muted-foreground`,children:`spawning`}),(0,b.jsxs)(`span`,{className:`text-muted-foreground`,title:r.keptReason,children:[r.step,`, round `,r.round,`, `,N(r)]}),r.routingSources&&(0,b.jsxs)(`span`,{className:`text-muted-foreground`,title:Object.entries(r.routingSources).map(([e,t])=>`${e}: ${t}`).join(`, `),children:[`via `,r.routingSources.provider]}),a.label&&(0,b.jsx)(`span`,{"data-testid":`workflow-agent-provider`,className:`shrink-0 text-muted-foreground`,title:a.title,children:a.label})]},r.spawnRequestId)})}):(0,b.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No step agent yet.`})}function W({run:e}){let t=i(e=>e.pauseWorkflowRun),[n,r]=(0,y.useState)(null);return e.status===`running`?e.paused?(0,b.jsxs)(`div`,{"data-testid":`workflow-paused`,className:`flex flex-wrap items-center gap-2 text-xs`,children:[(0,b.jsx)(f,{className:`h-3.5 w-3.5`,"aria-hidden":!0}),(0,b.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[`Paused by `,e.paused.by,` since `,new Date(e.paused.at).toLocaleString(),`: `,e.paused.reason]}),(0,b.jsxs)(g,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>void t(e.runId,null),children:[(0,b.jsx)(p,{"aria-hidden":!0}),`Resume`]})]}):n===null?(0,b.jsxs)(g,{type:`button`,size:`sm`,variant:`outline`,className:`self-start`,onClick:()=>r(``),children:[(0,b.jsx)(f,{"aria-hidden":!0}),`Pause`]}):(0,b.jsxs)(`form`,{className:`flex flex-wrap items-center gap-2`,onSubmit:i=>{i.preventDefault(),n.trim()&&t(e.runId,n.trim()).then(()=>r(null))},children:[(0,b.jsx)(_,{autoFocus:!0,"aria-label":`Pause reason`,placeholder:`Why does this run wait, and for what?`,value:n,onChange:e=>r(e.target.value),className:`min-w-48 flex-1`}),(0,b.jsx)(g,{type:`submit`,size:`sm`,disabled:!n.trim(),children:`Pause run`}),(0,b.jsx)(g,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>r(null),children:`Cancel`})]}):null}function G({run:e,agentsById:t,now:n,project:r}){return(0,b.jsxs)(`article`,{"data-testid":`workflow-run-${e.runId}`,"aria-label":`${e.workflow} on T${e.taskId}`,className:`wf-run space-y-3 rounded-lg p-3`,children:[(0,b.jsxs)(`header`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1`,children:[(0,b.jsxs)(`h3`,{className:`flex min-w-0 max-w-full items-center gap-1.5 text-sm font-semibold`,children:[(0,b.jsx)(h,{workflow:e.workflow,className:`h-3.5 w-3.5 shrink-0`}),(0,b.jsx)(D,{text:e.workflow})]}),(0,b.jsx)(`div`,{className:`min-w-0 flex-1 text-sm`,children:(0,b.jsx)(B,{taskId:e.taskId,title:e.taskTitle})}),(0,b.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 text-xs text-muted-foreground`,children:[(0,b.jsxs)(`span`,{"data-testid":`workflow-round`,className:`flex items-center gap-1`,title:`A loop back to an earlier step starts a new round`,children:[(0,b.jsx)(m,{className:`h-3.5 w-3.5`,"aria-hidden":!0}),`Round `,e.round]}),(0,b.jsxs)(`span`,{"data-testid":`workflow-held`,className:`flex items-center gap-1`,title:`Messages the run kept instead of waking the coordinator`,children:[(0,b.jsx)(d,{className:`h-3.5 w-3.5`,"aria-hidden":!0}),e.heldCount,` held`]}),(0,b.jsxs)(`span`,{title:`Started ${new Date(e.createdAt).toLocaleString()}`,children:[`Started `,a(n,e.createdAt),` ago`]}),r&&(0,b.jsx)(D,{text:r})]})]}),e.callerAgentId&&(0,b.jsxs)(`p`,{"data-testid":`workflow-caller`,className:`text-xs text-muted-foreground`,children:[`Caller: `,e.callerAgentId,` · up to `,e.maxLiveAgents??2,` live agents`]}),e.budget&&(0,b.jsx)(T,{target:{kind:`run`,runId:e.runId}}),(0,b.jsx)(W,{run:e}),(0,b.jsx)(H,{run:e}),e.rootRunId&&(0,b.jsx)(x,{runId:e.runId}),e.overdueAt!==void 0&&(0,b.jsx)(`p`,{"data-testid":`workflow-backstop`,className:`text-xs text-muted-foreground`,title:`Backstop ${new Date(e.overdueAt).toLocaleString()}`,children:e.overdueNotifiedAt===void 0?`Backstop ${new Date(e.overdueAt).toLocaleString()}`:`Overdue: coordinator notified`}),(0,b.jsx)(U,{run:e,agentsById:t,now:n})]})}function K({runs:e,now:t,projectTitles:n}){return e.length?(0,b.jsx)(`ul`,{"aria-label":`Finished runs`,className:`divide-y divide-border rounded-lg border border-border bg-card`,children:e.map(e=>(0,b.jsxs)(`li`,{"data-testid":`workflow-recent-${e.runId}`,"data-status":e.status,className:`wf-ledger flex flex-wrap items-center gap-x-3 gap-y-1 px-3 py-2 text-sm`,children:[(0,b.jsx)(`span`,{className:`ship-lamp h-2 w-2 shrink-0 rounded-full`,"data-status":e.status===`done`?`success`:e.status===`escalated`?`failing`:`unknown`,"aria-hidden":!0}),(0,b.jsx)(D,{text:e.workflow,className:`font-medium sm:w-28 sm:shrink-0`}),(0,b.jsx)(`div`,{className:`order-last w-full min-w-0 pl-5 sm:order-none sm:w-auto sm:flex-1 sm:pl-0`,children:(0,b.jsx)(B,{taskId:e.taskId,title:e.taskTitle})}),(0,b.jsx)(`span`,{className:`ml-auto shrink-0 font-medium sm:ml-0`,title:e.output?.landedSha,children:R(e)}),(0,b.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:e.round===1?`1 round`:`${e.round} rounds`}),(0,b.jsxs)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,title:new Date(e.updatedAt).toLocaleString(),children:[a(t,e.updatedAt),` ago`]}),e.projectId&&n.get(e.projectId)&&(0,b.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:n.get(e.projectId)}),e.budget&&(0,b.jsx)(`div`,{className:`w-full`,children:(0,b.jsx)(T,{target:{kind:`run`,runId:e.runId}})}),e.rootRunId&&(0,b.jsx)(`div`,{className:`w-full`,children:(0,b.jsx)(x,{runId:e.runId})}),e.reason&&(0,b.jsx)(D,{text:e.reason,className:`order-last w-full pl-5 text-xs text-muted-foreground`})]},e.runId))}):(0,b.jsx)(`p`,{className:`rounded-md border border-dashed border-border px-3 py-4 text-center text-sm text-muted-foreground`,children:`No finished runs yet.`})}export{D as a,k as i,G as n,B as r,K as t};
2
- //# sourceMappingURL=run-card-CpKqRbhg.js.map
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{p as t,u as n}from"./dist-DeW2Y1R5.js";import{a as r,c as i,l as a,o,s,t as c}from"./store-DcClXLH0.js";import{h as l}from"./display-BrKWFGJz.js";import{t as u}from"./api-CIIVBtAV.js";import{i as d,r as f,t as p}from"./tabs-jZgNvNHr.js";import{a as m,c as h,i as g,n as _,o as v,r as y,s as b,t as x}from"./warehouse-BanzOanY.js";import{t as S}from"./chevron-right-iljytE0x.js";import{t as C}from"./eye-BAP6fHrX.js";import{t as w}from"./gauge-BIODY-BQ.js";import{t as T}from"./hourglass-txu4ax6n.js";import{t as E}from"./lock-BW8MPKw_.js";import{t as D}from"./rocket-BmO1qSu-.js";import{n as O}from"./workflow-marker-DAZcj5qt.js";import{t as k}from"./button-Do6Z3vvn.js";import{t as A}from"./badge-DqJRtj_p.js";import{n as j}from"./agent-name-DKbiIhBo.js";import{t as M}from"./input-CsTB6jIx.js";import{t as N}from"./crate-agent-30aXTKva.js";import{t as P}from"./stats-DyUBKyWI.js";var F=e(t(),1),I=n();function L({incident:e}){let[t,n]=(0,F.useState)(``),[r,i]=(0,F.useState)(!1),[a,o]=(0,F.useState)(``);async function s(){i(!0),o(``);try{await u(`POST`,`/shipping/incidents/${encodeURIComponent(e.incidentId)}/abandon`,{reason:t}),await c.getState().openShipping()}catch(e){o(e.message)}finally{i(!1)}}return(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[(0,I.jsxs)(A,{variant:`destructive`,title:`${e.remote} lane ${e.laneKey}, incident ${e.state}`,children:[e.mainFailurePolicy===`advisory`?`advisory: red main`:`lane stopped: red main`,` `,e.sha.slice(0,12),`, incident `,e.incidentId]}),(0,I.jsx)(M,{"aria-label":`Abandon reason for ${e.incidentId}`,placeholder:`Reason to abandon incident`,value:t,maxLength:1e3,onChange:e=>n(e.target.value)}),(0,I.jsx)(k,{size:`sm`,variant:`outline`,disabled:r||!t.trim(),onClick:s,children:`Abandon incident`}),(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.mainFailurePolicy===`advisory`?`Lands continue. Deployment waits for a successful product check.`:`Releases the lane stop. Red CI still blocks deployment.`}),a&&(0,I.jsx)(`span`,{role:`alert`,children:a})]})}function R({incidents:e}){return e?.length?(0,I.jsx)(`div`,{role:`alert`,"aria-label":`Red main`,className:`space-y-1.5`,children:e.map(e=>(0,I.jsx)(L,{incident:e},e.incidentId))}):null}var z={implementation:{label:`Implementation`,icon:v,hue:250},review:{label:`Review`,icon:C,hue:305},gates:{label:`Gates`,icon:g,hue:85},landing:{label:`Landing`,icon:m,hue:50},main:{label:`On main`,icon:x,hue:150},deploy:{label:`Deploy`,icon:D,hue:205},validated:{label:`Validated`,icon:h,hue:170}},B=new Intl.NumberFormat(void 0,{notation:`compact`,maximumFractionDigits:1}),V={done:`Done`,cd:`Relay CD`,steward:`Steward`,landing:`Relay landing`},H={builder:`Owner`,reviewer:`No reviewer yet · owner`,closer:`To close: owner`};function U({responsible:e}){let t=c(e=>e.agentsById);return(0,I.jsxs)(`span`,{"data-testid":`shipping-card-responsible`,className:`flex min-w-0 items-center gap-1`,children:[(0,I.jsx)(`span`,{className:`shrink-0`,children:e.kind===`relay`?V[e.role]??V.landing:H[e.role]??`Owner`}),e.id?(0,I.jsx)(j,{target:e.id,agentsById:t,className:`font-medium`}):e.kind===`owner`&&(0,I.jsx)(`span`,{className:`truncate text-muted-foreground`,children:`unassigned`})]})}var W=e=>e.kind===`relay`?e.role===`done`?`done`:`relay`:`agent`;function G({card:e,holder:t}){let{responsible:n}=e;if(n.kind===`relay`||!t){let e=n.kind===`relay`?n.role===`done`?h:b:_;return(0,I.jsxs)(`div`,{className:`mt-1.5 flex min-w-0 items-center gap-1 text-xs`,title:n.id,children:[(0,I.jsx)(e,{className:`h-3.5 w-3.5 shrink-0`,style:{color:`var(--crate)`},"aria-hidden":!0}),(0,I.jsx)(U,{responsible:n})]})}return(0,I.jsxs)(`div`,{className:`mt-1 text-xs`,children:[(0,I.jsx)(N,{holder:t,prefix:t.id===n.id&&n.role===`reviewer`?`Review:`:void 0}),n.kind===`owner`&&(0,I.jsx)(`div`,{className:`pl-5 text-[11px] text-muted-foreground`,title:n.id,children:(0,I.jsx)(U,{responsible:n})})]})}function K({card:e,holder:t,now:n,maxTokens:i,project:a}){let o=c(e=>e.openTaskDetailById),s=c(t=>t.workflowLiveIndex.byTask[e.taskId]),u=e.tokens?.total??0;return(0,I.jsxs)(`li`,{"data-testid":`shipping-card-${e.taskId}`,"data-owner":W(e.responsible),"data-live":t?.live===!0,"data-workflow":s?s.kind:void 0,onClick:()=>o(e.taskId),className:`ship-crate cursor-pointer rounded-md px-2.5 py-2 text-sm motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-left-3 motion-safe:duration-300`,children:[(0,I.jsxs)(`div`,{className:`flex min-w-0 items-baseline gap-1.5`,children:[(0,I.jsxs)(`span`,{className:`shrink-0 rounded bg-muted px-1 font-mono text-[11px] tabular-nums text-muted-foreground`,children:[`T`,e.taskId]}),e.signals.reviewHold&&(0,I.jsx)(`span`,{"data-testid":`shipping-card-review-hold`,role:`img`,"aria-label":`Review hold`,title:`Review hold: a complete delivery parks for review`,className:`shrink-0 self-center`,children:(0,I.jsx)(E,{className:`h-3 w-3`,style:{color:`var(--crate)`},"aria-hidden":!0})}),(0,I.jsx)(`button`,{type:`button`,className:`truncate rounded text-left font-medium hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,title:e.title,children:e.title})]}),s&&(0,I.jsxs)(`div`,{"data-testid":`shipping-card-workflow`,className:`mt-1 flex min-w-0 items-center gap-1 text-[11px] font-medium`,children:[(0,I.jsx)(O,{workflow:s.workflow,step:s.step}),(0,I.jsx)(`span`,{className:`truncate`,title:`Workflow run ${s.runId}`,children:r(s)})]}),e.signals.staleOwnerGone&&(0,I.jsxs)(`div`,{"data-testid":`shipping-card-stale`,className:`mt-1 flex items-center gap-1 text-[11px] text-tone-warning-fg`,title:`In progress or blocked, no change for 7 days, and its builder agent is gone`,children:[(0,I.jsx)(T,{className:`h-3 w-3 shrink-0`,"aria-hidden":!0}),(0,I.jsx)(`span`,{className:`truncate`,children:`Idle 7d+, builder gone`})]}),(0,I.jsx)(G,{card:e,holder:t}),(0,I.jsxs)(`div`,{className:`mt-1.5 flex items-center gap-2`,title:`Tokens spent on this Task`,children:[(0,I.jsx)(`div`,{className:`ship-meter h-1.5 min-w-0 flex-1 overflow-hidden rounded-full`,"aria-hidden":!0,children:(0,I.jsx)(`span`,{className:`block h-full rounded-full`,style:{width:`${i&&u?Math.max(4,u/i*100):0}%`}})}),(0,I.jsx)(`span`,{className:`shrink-0 font-mono text-xs tabular-nums text-muted-foreground`,children:e.tokens?B.format(e.tokens.total):`—`})]}),(0,I.jsxs)(`div`,{className:`mt-1 flex items-center justify-between gap-2 text-[11px] text-muted-foreground`,title:`In ${z[e.stage].label} since ${new Date(e.stageSince).toLocaleString()}`,children:[(0,I.jsxs)(`span`,{children:[`In stage `,l(n,e.stageSince)]}),a&&(0,I.jsx)(`span`,{className:`truncate`,"data-testid":`shipping-card-project`,children:a})]})]})}function q({ci:e,all:t}){return e.length?(0,I.jsxs)(`div`,{role:`group`,"aria-label":`CI`,className:`flex flex-wrap items-center gap-1.5`,children:[(0,I.jsx)(`span`,{className:`text-[11px] font-medium uppercase tracking-wider text-muted-foreground`,"aria-hidden":!0,children:`CI`}),e.map(e=>(0,I.jsxs)(A,{variant:e.status===`failing`?`destructive`:`secondary`,title:`CI workflow ${e.workflow} on ${e.branch}, observed ${new Date(e.observedAt).toLocaleString()}`,children:[(0,I.jsx)(`span`,{className:`ship-lamp h-2 w-2 shrink-0 rounded-full`,"data-status":e.status,"aria-hidden":!0}),t?`${e.repository} `:``,e.workflow,` on `,e.branch,`: `,e.status]},`${e.repository}:${e.branch}:${e.workflow}`))]}):(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t?`No CI watches`:`No CI watch for this project`})}function J({board:e}){let t=e.projectLanes.filter(e=>e.gates.length>0);return t.length?(0,I.jsx)(`ul`,{className:`mb-2 space-y-1`,"data-testid":`shipping-gate-names`,children:t.map(t=>(0,I.jsxs)(`li`,{className:`flex flex-wrap gap-1`,children:[e.all&&(0,I.jsx)(`span`,{className:`w-full truncate text-[11px] text-muted-foreground`,children:t.title}),t.gates.map(e=>(0,I.jsx)(A,{variant:`outline`,className:`px-1.5 py-0 font-mono text-[11px] font-normal`,children:e},e))]},t.projectId))}):null}function Y({label:e,value:t,testId:n}){return(0,I.jsxs)(`div`,{"data-testid":n,className:`ship-hud min-w-0 rounded-md px-2.5 py-1.5`,children:[(0,I.jsx)(`div`,{className:`truncate text-[10px] font-medium uppercase tracking-wider text-muted-foreground`,children:e}),(0,I.jsx)(`div`,{className:`font-mono text-lg font-semibold tabular-nums leading-tight`,children:t})]})}function X({cards:e,agentsById:t,now:n}){let r=i(e,t,n);return(0,I.jsxs)(`div`,{className:`grid grid-cols-3 gap-2 sm:grid-cols-5`,"aria-label":`Board totals`,children:[(0,I.jsx)(Y,{testId:`shipping-hud-in-flight`,label:`In flight`,value:String(r.inFlight)}),(0,I.jsx)(Y,{testId:`shipping-hud-agents`,label:`With agents`,value:String(r.withAgents)}),(0,I.jsx)(Y,{testId:`shipping-hud-stale`,label:`No live agent`,value:String(r.withoutAgent)}),(0,I.jsx)(Y,{testId:`shipping-hud-relay`,label:`With Relay`,value:String(r.withRelay)}),(0,I.jsx)(Y,{testId:`shipping-hud-tokens`,label:`Tokens spent`,value:B.format(r.tokens)})]})}function Z({stage:e,cards:t,holders:n,board:r,projectTitles:i,now:a,maxTokens:s}){let[c,l]=(0,F.useState)(!1),u=o.includes(e),d=e=>u?!n.get(e.taskId)?.live:e.signals.staleOwnerGone===!0,f=t.filter(e=>!d(e)),p=t.filter(d),{label:m,icon:h,hue:g}=z[e],_=e=>(0,I.jsx)(K,{card:e,holder:n.get(e.taskId)??null,now:a,maxTokens:s,project:r.all?i.get(e.projectId??``):void 0},e.taskId);return(0,I.jsxs)(`section`,{"data-testid":`shipping-lane-${e}`,"data-empty":t.length===0,"aria-label":m,className:`ship-lane min-w-0 rounded-lg p-2`,style:{"--stage-hue":g},children:[(0,I.jsxs)(`h3`,{className:`flex items-center gap-1.5 px-0.5 text-sm font-semibold`,children:[(0,I.jsx)(`span`,{className:`ship-lane-badge grid h-6 w-6 shrink-0 place-items-center rounded-md`,children:(0,I.jsx)(h,{className:`h-3.5 w-3.5`,"aria-hidden":!0})}),(0,I.jsx)(`span`,{className:`truncate`,children:m}),(0,I.jsx)(`span`,{"data-testid":`shipping-lane-count-${e}`,className:`ml-auto rounded-full bg-background/70 px-1.5 font-mono text-xs tabular-nums text-muted-foreground`,children:f.length})]}),(0,I.jsx)(`div`,{className:`ship-belt my-2`,"aria-hidden":!0}),e===`gates`&&(0,I.jsx)(J,{board:r}),f.length>0&&(0,I.jsx)(`ul`,{className:`space-y-1.5`,children:f.map(_)}),t.length===0&&(0,I.jsx)(`p`,{className:`max-lg:hidden rounded-md border border-dashed border-border/70 px-2 py-3 text-center text-[11px] text-muted-foreground`,children:`Bay clear`}),p.length>0&&(0,I.jsxs)(I.Fragment,{children:[(0,I.jsxs)(`button`,{type:`button`,"data-testid":`shipping-stale-toggle-${e}`,"aria-expanded":c,onClick:()=>l(!c),className:`mt-1.5 flex min-h-8 w-full items-center gap-1 rounded-md px-1.5 text-left text-xs text-muted-foreground hover:bg-background/60 hover:text-foreground`,children:[(0,I.jsx)(S,{className:`h-3.5 w-3.5 shrink-0 ${c?`rotate-90`:``}`,"aria-hidden":!0}),p.length,` `,u?`without a live agent`:`idle, builder gone`]}),c&&(0,I.jsx)(`ul`,{"data-testid":`shipping-stale-${e}`,className:`mt-1 space-y-1.5 opacity-75`,children:p.map(_)})]})]})}function Q({board:e,agentsById:t,now:n}){let r=new Map(e.projectLanes.map(e=>[e.projectId,e.title])),a=new Map(e.tasks.map(e=>[e.taskId,s(e,t,n)])),{maxTokens:o}=i(e.tasks,t,n);return(0,I.jsx)(`div`,{className:`overflow-x-auto pb-2`,children:(0,I.jsx)(`div`,{className:`ship-floor grid gap-2 rounded-xl border border-border p-2 lg:min-w-[calc(var(--lanes)*9.5rem)] lg:grid-cols-[repeat(var(--lanes),minmax(0,1fr))]`,style:{"--lanes":e.lanes.length},children:e.lanes.map(t=>(0,I.jsx)(Z,{stage:t,cards:e.tasks.filter(e=>e.stage===t),holders:a,board:e,projectTitles:r,now:n,maxTokens:o},t))})})}function $(){let e=c(e=>e.shippingBoard),t=c(e=>e.agents),n=c(e=>e.agentsById),r=Date.now(),i=e?a(e,t,r):null,o=c(e=>e.shippingLoading),s=c(e=>e.shippingError),l=c(e=>e.setShippingProject),u=c(e=>e.shippingTab),m=c(e=>e.setShippingTab),h=c(e=>e.shippingStatsProjectId),g=c(e=>e.setShippingStatsProject),_=c(e=>e.setAnalyticsTab),v=c(e=>e.switchView);return(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(y,{className:`h-5 w-5 text-muted-foreground`}),(0,I.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Shipping`})]}),(0,I.jsx)(p,{value:u,onValueChange:e=>m(e),children:(0,I.jsxs)(f,{children:[(0,I.jsx)(d,{value:`realtime`,children:`Realtime`}),(0,I.jsx)(d,{value:`stats`,children:`Statistics`})]})}),(0,I.jsxs)(`button`,{type:`button`,className:`ml-auto inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground`,onClick:()=>{_(`gates`),v(`analytics`)},children:[(0,I.jsx)(w,{className:`h-3.5 w-3.5`}),` Gate statistics`]}),i&&i.projects.length>0&&(0,I.jsxs)(`select`,{"aria-label":`Project`,className:`h-8 max-w-full min-w-0 rounded-md border border-border bg-background px-2 text-sm`,value:u===`stats`?h:i.all?`*`:i.projectId??``,onChange:e=>u===`stats`?g(e.target.value):l(e.target.value),children:[u===`stats`?(0,I.jsx)(`option`,{value:``,children:`All projects`}):(0,I.jsx)(`option`,{value:`*`,children:`All projects`}),i.projects.map(e=>(0,I.jsx)(`option`,{value:e.id,children:u===`stats`?e.title:`${e.title} (${e.inFlight})`},e.id))]}),u===`realtime`&&i&&(0,I.jsx)(q,{ci:i.ci,all:i.all===!0}),u===`realtime`&&i&&(0,I.jsx)(R,{incidents:i.redMain})]}),u===`stats`&&(0,I.jsx)(P,{}),u===`realtime`&&s&&(0,I.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:[`Could not load the board: `,s]}),u===`realtime`&&!i&&o&&(0,I.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`Loading the board…`}),u===`realtime`&&i&&!i.projectId&&!i.all&&(0,I.jsx)(`div`,{className:`rounded-md border border-border px-3 py-12 text-center text-sm text-muted-foreground`,children:`No project has Tasks in progress.`}),u===`realtime`&&i&&(i.projectId||i.all)&&(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(X,{cards:i.tasks,agentsById:n,now:r}),(0,I.jsx)(Q,{board:i,agentsById:n,now:r})]})]})}export{$ as ShippingView};
2
- //# sourceMappingURL=shipping-B9YtnwtG.js.map
@@ -1,9 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{p as t}from"./dist-DeW2Y1R5.js";import{A as n,D as r,M as i,N as a,O as o,P as s,c,d as l,f as u,h as d,l as f,t as p}from"./provider-display-DsuWMvVL.js";import{A as m,C as h,E as g,F as ee,I as _,W as v,X as te,_t as ne,dt as re,f as ie,ft as ae,gt as oe,h as y,ht as se,j as ce,lt as b,m as x,ot as le,tt as ue,ut as de,z as fe}from"./display-BrKWFGJz.js";import{_ as pe,d as me,f as he,h as ge,i as _e,l as ve,m as ye,p as be,r as xe,s as Se,t as S}from"./api-CIIVBtAV.js";import{t as Ce}from"./agent-liveness-CaNwK0Zf.js";var C=e(t(),1),we=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},Te=(e=>e?we(e):we),Ee=e=>e;function De(e,t=Ee){let n=C.useSyncExternalStore(e.subscribe,C.useCallback(()=>t(e.getState()),[e,t]),C.useCallback(()=>t(e.getInitialState()),[e,t]));return C.useDebugValue(n),n}var Oe=e=>{let t=Te(e),n=e=>De(t,e);return Object.assign(n,t),n},w=(e=>e?Oe(e):Oe);function ke(e,t){let n;try{n=e()}catch{return}return{getItem:e=>{let r=e=>e===null?null:JSON.parse(e,t?.reviver),i=n.getItem(e)??null;return i instanceof Promise?i.then(r):r(i)},setItem:(e,r)=>n.setItem(e,JSON.stringify(r,t?.replacer)),removeItem:e=>n.removeItem(e)}}var Ae=e=>t=>{try{let n=e(t);return n instanceof Promise?n:{then(e){return Ae(e)(n)},catch(e){return this}}}catch(e){return{then(e){return this},catch(t){return Ae(t)(e)}}}},je=(e,t)=>(n,r,i)=>{let a={storage:ke(()=>window.localStorage),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},o=!1,s=0,c=new Set,l=new Set,u=a.storage;if(!u)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${a.name}', the given storage is currently unavailable.`),n(...e)},r,i);let d=()=>{let e=a.partialize({...r()});return u.setItem(a.name,{state:e,version:a.version})},f=i.setState;i.setState=(e,t)=>(f(e,t),d());let p=e((...e)=>(n(...e),d()),r,i);i.getInitialState=()=>p;let m,h=()=>{if(!u)return;let e=++s;o=!1,c.forEach(e=>e(r()??p));let t=a.onRehydrateStorage?.call(a,r()??p)||void 0;return Ae(u.getItem.bind(u))(a.name).then(e=>{if(e)if(typeof e.version==`number`&&e.version!==a.version){if(a.migrate){let t=a.migrate(e.state,e.version);return t instanceof Promise?t.then(e=>[!0,e]):[!0,t]}console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`)}else return[!1,e.state];return[!1,void 0]}).then(t=>{if(e!==s)return;let[i,o]=t;if(m=a.merge(o,r()??p),n(m,!0),i)return d()}).then(()=>{e===s&&(t?.(r(),void 0),m=r(),o=!0,l.forEach(e=>e(m)))}).catch(n=>{e===s&&t?.(void 0,n)})};return i.persist={setOptions:e=>{a={...a,...e},e.storage&&(u=e.storage)},clearStorage:()=>{u?.removeItem(a.name)},getOptions:()=>a,rehydrate:()=>h(),hasHydrated:()=>o,onHydrate:e=>(c.add(e),()=>{c.delete(e)}),onFinishHydration:e=>(l.add(e),()=>{l.delete(e)})},a.skipHydration||h(),m||p},Me=e=>Symbol.iterator in e,Ne=e=>`entries`in e,Pe=(e,t)=>{let n=e instanceof Map?e:new Map(e.entries()),r=t instanceof Map?t:new Map(t.entries());if(n.size!==r.size)return!1;for(let[e,t]of n)if(!r.has(e)||!Object.is(t,r.get(e)))return!1;return!0},Fe=(e,t)=>{let n=e[Symbol.iterator](),r=t[Symbol.iterator](),i=n.next(),a=r.next();for(;!i.done&&!a.done;){if(!Object.is(i.value,a.value))return!1;i=n.next(),a=r.next()}return!!i.done&&!!a.done};function Ie(e,t){return Object.is(e,t)?!0:typeof e!=`object`||!e||typeof t!=`object`||!t||Object.getPrototypeOf(e)!==Object.getPrototypeOf(t)?!1:Me(e)&&Me(t)?Ne(e)&&Ne(t)?Pe(e,t):Fe(e,t):Pe({entries:()=>Object.entries(e)},{entries:()=>Object.entries(t)})}function Le(e){let t=ke(e);if(!t)return;let n;return{...t,setItem:(e,r)=>{if(!(n!==void 0&&Ie(n,r.state)))return n=r.state,t.setItem(e,r)},removeItem:e=>(n=void 0,t.removeItem(e))}}var Re=`worker`,ze=[];function Be(e){return e!==void 0&&ze.includes(e)}var Ve=`This runs repo-committed code with this agent's Relay identity token and provider credentials.`,He=`Content review is bounded, not absolute: fingerprint mode covers the declaration plus every directly-named, in-repo, statically-resolved target — it does NOT cover indirect includes (a script that sources or imports another file not itself named in the command) or anything selected only at runtime (an env-var path, a glob, a built string). Commit mode is coarser still: it is invalidated by ANY new commit on the repo, whether or not that commit touches the declaration or its targets, and does not see uncommitted working-tree edits at all. Review reads the spawn cwd off the RELAY server's own filesystem, not the runner's — for a spawn whose orchestrator is on a different host, this relay cannot see that host's disk at all, so review fails closed rather than reviewing the relay's own (possibly unrelated) copy of the same path.`,Ue=`outcome`,We=`Done`,Ge=`Could not do it`;function Ke(e,t){let n=e.requestedByRole;return n===`self`||n===`operator`||n===`coordinator`?n:e.selfRequested===!0||e.requestedBy===t?`self`:s(e.requestedByUser)||e.requestedBy===`dashboard`?`operator`:`coordinator`}function qe(e){if(e.type!==`agent.setEffort`||e.status!==`succeeded`)return;let t=a(e.result?.providerResult)?e.result.providerResult:{},n=s(t.effort)??s(e.params.effort),r=s(t.previousEffort)??s(e.params.previousEffort)??`default`;if(!n||n===r)return;let i=Ke(e.params,e.target),o=s(e.params.requestedByAgentId)??s(e.params.requestedBy),c=s(e.params.requestedByUser),l=s(e.params.reason)?.trim();return{commandId:e.id,agentId:e.target,at:e.updatedAt,effort:n,previousEffort:r,actor:{role:i,...i===`self`?{id:e.target}:o&&o!==`dashboard`?{id:o}:{},...c?{user:c}:{}},...l?{reason:l}:{}}}function Je(e){return e.desiredVersion>e.observedVersion}function T(e){return r(n(e?.id??`default`))}function Ye(){return typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 767px)`).matches?4:12}var E=[];function Xe(e){let t=E.indexOf(e);t!==-1&&E.splice(t,1),E.unshift(e)}function Ze(e){let t=E.indexOf(e);t!==-1&&E.splice(t,1)}function Qe(e,t){let n=new Set(Object.keys(e)),r=new Set,i=Ye(),a=e=>{e&&n.has(e)&&r.size<i&&r.add(e)};for(let e of t)a(e);for(let e of E)if(a(e),r.size>=i)break;for(let t of Object.keys(e).reverse())a(t);let o={};for(let t of r)o[t]=e[t];return E.splice(0,E.length,...E.filter(e=>r.has(e))),o}var $e=[`landState`,`landWaitReason`,`landStateAt`,`landBackedOff`];function et(e,t){let n=e?{...e,...t}:t,r=t.meta?{...e?.meta??{},...t.meta}:e?.meta;r&&a(e?.meta?.workspace)&&a(t.meta?.workspace)&&(r.workspace={...e.meta.workspace,...t.meta.workspace});let i=$e.filter(e=>t[e]===null);return{...n,...Object.fromEntries(i.map(e=>[e,void 0])),...r?{meta:r}:{},...!t.issueRepo&&e?.issueRepo?{issueRepo:e.issueRepo}:{}}}function tt(e,t){if(!e)return null;if(t?.id!==e.id)return e;let n=t.meta?.agentProfile;return n?{...e,meta:{...e.meta,agentProfile:n}}:e}function nt(e,t){let n=new Set(t.map(e=>e.id)),r=e.filter(e=>!n.has(e.id)).map(e=>e.status===`offline`?e:{...e,status:`offline`});return O(e,r.length===0?t:[...t,...r])}function rt(e){let t={};for(let n of e)t[n.id]=n;return t}function D(e,t){let n=e.findIndex(e=>e.id===t.id),r=[...e];return n>=0?r[n]=t:r.push(t),r}function it(e,t){let n=e.findIndex(e=>e.id===t.id);if(n<0)return;let r=e[n],i=[...e];return i[n]={...t,meta:r.meta,providerCatalog:r.providerCatalog,managedAgents:t.managedAgents??r.managedAgents,providerStatus:t.providerStatus??r.providerStatus},i}function at(e,t){return e?{...t,...t.projectId===void 0&&e.projectId!==void 0?{projectId:e.projectId}:{},...t.projectSlug===void 0&&e.projectSlug!==void 0?{projectSlug:e.projectSlug}:{},...t.projectTitle===void 0&&e.projectTitle!==void 0?{projectTitle:e.projectTitle}:{},...t.ownerOnline===void 0&&e.ownerOnline!==void 0?{ownerOnline:e.ownerOnline}:{}}:t}var ot=3e3;function st(e,t,n,r=Date.now(),i){if(!t||!n)return e;let a=[...e[t]||[]],o=i||`s-${n}-${r}`;return a.some(e=>e.id===o)||a.some(e=>e.status===n&&Math.abs(e.timestamp-r)<=ot)?e:(a.push({id:o,status:n,timestamp:r}),a.length>200&&a.splice(0,a.length-200),{...e,[t]:a})}function ct(e,t){if(!(!e||e.status===t.status)){if((e.status===`offline`||e.status===`stale`)&&(t.status===`online`||t.status===`idle`||t.status===`busy`))return`online`;if(t.status===`offline`)return`offline`}}var lt=new Set([`compacting`,`compacted`,`clearing-context`,`context-cleared`]);function ut(e){let t=e.meta?.timelineEvent;if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t.status;if(typeof n!=`string`||!n)return;let r=t.id,i=t.timestamp;return{status:n,...typeof r==`string`?{id:r}:{},...typeof i==`number`&&Number.isFinite(i)?{timestamp:i}:{}}}function dt(e){let t=e.params?.agentId;return typeof t==`string`&&t?t:typeof e.target==`string`&&e.target?e.target:void 0}function ft(e,t){if(t===`command.dispatched`)return e.type===`agent.compact`?`compaction-requested`:e.type===`agent.clearContext`?`clear-requested`:e.type===`agent.shutdown`?`shutting-down`:void 0;if(t===`command.succeeded`){if(e.type===`agent.shutdown`)return`shutdown`;if(e.type===`agent.restart`)return`restarted`}}function pt(e){return JSON.stringify(e)}function mt(e,t){let n=new Map(e.map(e=>[e.id,e])),r=!(e.length===t.length&&e.every((e,n)=>e.id===t[n]?.id)),i=t.map(e=>{let t=n.get(e.id);return t&&pt(t)===pt(e)?t:(r=!0,e)});return r?i:e}function O(e,t){return ht(e,t,e=>e.id)}function ht(e,t,n){let r=[...new Map(t.map(e=>[n(e),e])).values()],i=new Map(e.map(e=>[n(e),e])),a=!(e.length===r.length&&e.every((e,t)=>n(e)===n(r[t]))),o=r.map(e=>{let t=i.get(n(e));return t===e?e:t!==void 0&&JSON.stringify(t)===JSON.stringify(e)?t:(a=!0,e)});return a?o:e}function gt(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)?e:t}function _t(){return typeof document>`u`||document.hidden}function vt(e,t){return!!(e&&t.view===`chat`&&t.selectedInboxThread===e&&!_t())}function yt(e){return e.threadPeer||e.agentId||``}function bt(e,t){return vt(yt(e),t)}function xt(e){return e.filter(e=>o(e.to)&&!o(e.from)&&g(e)).reduce((e,t)=>Math.max(e,t.id),0)}function k(e,t){let n;for(let r of t)r in e&&(n??={...e},delete n[r]);return n??e}function St(e,t){return e.some(e=>t.has(e))?e.filter(e=>!t.has(e)):e}function Ct(e,t){return k(e,Object.keys(e).filter(e=>!t.has(e)))}function wt(e){return typeof e?.meta?.cwd==`string`?e.meta.cwd:``}function Tt(e){return new Set([...e.agents.map(e=>e.id),...Object.keys(e.agentChatByAgent),...Object.keys(e.chatStatusEvents),...Object.keys(e.presenceByAgent),...Object.keys(e.issueActivityByAgent),...Object.keys(e.issueLoading).flatMap(e=>e.startsWith(`agent:`)?[e.slice(6)]:[]),...Object.keys(e.issueErrors).flatMap(e=>e.startsWith(`agent:`)?[e.slice(6)]:[]),...Object.keys(e.livenessMismatches),...Object.keys(e.commandStalls),...e.coordinatorFollows,...e.coordinatorMutes,...e.chatCollapsedChildren,...[e.selectedAgent,e.agentDetailId,e.renameModal.agentId,e.selectedInboxThread,e.inboxCompose.toMode===`agent`?e.inboxCompose.to:``].filter(Boolean)])}function Et(e,t){let n=[...t],r=e.agents.filter(e=>t.has(e.id)),i=r.length?e.agents.filter(e=>!t.has(e.id)):e.agents,a=new Set(r.map(wt).filter(Boolean));for(let e of i)a.delete(wt(e));let o=n.map(e=>`agent:${e}`),s=t.has(e.compose.to),c=t.has(e.agentDetailId);return{agents:i,agentsById:k(e.agentsById,n),selectedAgent:t.has(e.selectedAgent)?``:e.selectedAgent,agentDetailOpen:!c&&e.agentDetailOpen,agentDetailId:c?``:e.agentDetailId,agentDetailCard:c?null:e.agentDetailCard,livenessMismatches:k(e.livenessMismatches,n),commandStalls:k(e.commandStalls,n),agentChatByAgent:k(e.agentChatByAgent,n),chatStatusEvents:k(e.chatStatusEvents,n),presenceByAgent:k(e.presenceByAgent,n),issueActivityByAgent:k(e.issueActivityByAgent,n),issueLoading:k(e.issueLoading,o),issueErrors:k(e.issueErrors,o),selectedInboxThread:t.has(e.selectedInboxThread)?``:e.selectedInboxThread,replyTo:s||e.replyTo&&t.has(e.replyTo.from)?null:e.replyTo,composeOpen:!s&&e.composeOpen,compose:s?{...b,from:T(e.sessionUser)}:e.compose,inboxCompose:e.inboxCompose.toMode===`agent`&&t.has(e.inboxCompose.to)?{...de}:e.inboxCompose,coordinatorFollows:St(e.coordinatorFollows,t),coordinatorMutes:St(e.coordinatorMutes,t),chatCollapsedChildren:St(e.chatCollapsedChildren,t),renameModal:t.has(e.renameModal.agentId)?{show:!1,agentId:``,label:``}:e.renameModal,projectByCwd:k(e.projectByCwd,[...a])}}var Dt=(e,t)=>({agents:[],agentsById:{},_rosterBootstrapped:!1,showOffline:!1,showBuiltIns:!1,agentSort:`status`,agentSortDir:`asc`,agentPresetFilter:``,agentStatusFilter:``,agentTagFilter:``,agentHostFilter:``,selectedAgent:``,agentDetailOpen:!1,agentDetailId:``,agentDetailCard:null,livenessMismatches:{},commandStalls:{},channelDetailOpen:!1,channelDetailId:``,renameModal:{show:!1,agentId:``,label:``},tagFilter:``,async fetchAgents(){try{let n=t()._rosterBootstrapped,r=await S(`GET`,!t().showOffline&&n?`/agents?excludeOffline=1`:`/agents`),i=!Array.isArray(r),a=i?r.agents:r,o=t(),s=i?void 0:new Set(a.map(e=>e.id)),c=s?new Set([...Tt(o)].filter(e=>!s.has(e))):new Set;for(let e of c)Ze(e);let l=c.size?Et(o,c):{},u={...o,...l},d=i?nt(u.agents,a):O(u.agents,a),f=new Set(d.map(wt).filter(Boolean)),p=Ct(u.projectByCwd,f);if(n&&!c.size&&d===o.agents&&p===o.projectByCwd)return;e({...l,agents:d,agentsById:rt(d),projectByCwd:p,...n?{}:{_rosterBootstrapped:!0}})}catch{}},setShowOffline(n){t().showOffline!==n&&(e({showOffline:n}),t().fetchAgents())},async fetchAgentCard(n){if(n)try{let r=await S(`GET`,`/agents/`+encodeURIComponent(n));if(t().agentDetailId!==n)return;e({agentDetailCard:r})}catch{}},removeAgentState(t){Ze(t),e(e=>Et(e,new Set([t])))},openAgentDetail(n){e({agentDetailId:n.id,agentDetailOpen:!0,agentDetailCard:null}),t().fetchAgentCard(n.id)},closeAgentDetail(){e({agentDetailOpen:!1,agentDetailCard:null})},openChannelDetail(t){e({channelDetailId:t.id,channelDetailOpen:!0})},closeChannelDetail(){e({channelDetailOpen:!1})},openRename(t){e({renameModal:{show:!0,agentId:t.id,label:t.label||``}})},async doRename(){let n=t(),r=n.renameModal.label.trim()||null;try{await S(`PATCH`,`/agents/`+n.renameModal.agentId+`/label`,{label:r}),e({renameModal:{...n.renameModal,show:!1}})}catch(e){t().showError(`Rename Failed`,e.message,e)}},async doDeleteAgent(e){try{await S(`DELETE`,`/agents/`+e),t().removeAgentState(e)}catch(e){t().showError(`Delete Failed`,e.message,e)}},async setAgentKeep(e,n){try{await S(`PUT`,`/agents/`+encodeURIComponent(e.id)+`/keep`,{keep:n,surface:{component:`agents-grid`}}),t().showNotification(n?`Keeping ${ie(e)}`:`Released keep on ${ie(e)}`)}catch(e){t().showError(`Keep Failed`,e.message,e)}},async doAgentAction(e,n,r,i){try{await S(`POST`,`/agents/`+encodeURIComponent(e.id)+`/actions`,{...i,action:n,...r?{surface:{component:r}}:{}});let a=n===`restart`?`Restart`:n===`resume`?`Resume`:n===`shutdown`?i?.hard===!0?`Force shutdown`:`Shutdown`:n===`compact`?`Compact`:n===`clearContext`?`Clear context`:n===`releaseSubmitHold`?`Release hold`:n;t().showNotification(`${a} command sent to ${ie(e)}`),await Promise.all([t().fetchMessages(),t().fetchActivityEvents()])}catch(e){t().showError(`Action Failed`,e.message,e)}}});function Ot(e,t,n){return t===`agents.changed`?(e.fetchAgents().catch(()=>{}),!0):t===`agent.removed`?(e.removeAgentState(JSON.parse(n).id),!0):!1}function kt(e){if(!e)return``;let t=e.replace(/\r\n/g,`
2
- `);return t=t.replace(/```[^\n]*\n([\s\S]*?)```/g,(e,t)=>{let n=t.replace(/\n+$/,``).split(`
3
- `).length;return` code block, ${n} ${n===1?`line`:`lines`}. `}),t=t.replace(/```[^\n]*/g,` code block. `),t=Nt(t),t=t.replace(/^#{1,6}\s+/gm,``),t=t.replace(/^\s*[-*+]\s+/gm,`. `),t=t.replace(/^\s*\d+\.\s+/gm,`. `),t=t.replace(/`([^`]+)`/g,`$1`),t=t.replace(/\[([^\]]+)\]\([^)]+\)/g,`$1`),t=t.replace(/(\*\*|__|\*|_)(.*?)\1/g,`$2`),t=t.replace(/[ \t]+/g,` `),t=t.replace(/\n{2,}/g,`. `),t=t.replace(/\s*\.\s*\.\s*(\.\s*)+/g,`. `),t.trim()}function At(e){return/\|/.test(e)&&e.trim().length>0}function jt(e){return/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)+\|?\s*$/.test(e)}function Mt(e){return e.trim().replace(/^\||\|$/g,``).split(`|`).map(e=>e.trim()).filter(e=>e.length>0)}function Nt(e){let t=e.split(`
4
- `),n=[],r=0;for(;r<t.length;){if(At(t[r])&&r+1<t.length&&jt(t[r+1])){let e=Mt(t[r]),i=r+2,a=0;for(;i<t.length&&At(t[i])&&!jt(t[i]);)a++,i++;let o=e.length?`with columns ${e.join(`, `)}`:``,s=`${a} ${a===1?`row`:`rows`}`;n.push(`table ${o?`${o}, `:``}${s}.`.replace(/\s+/g,` `).trim()),r=i;continue}n.push(t[r]),r++}return n.join(`
5
- `)}var Pt={ms:`milliseconds`,s:`seconds`,kb:`kilobytes`,mb:`megabytes`,gb:`gigabytes`,tb:`terabytes`};function Ft(e){return e.split(``).join(` `)}function It(e){return e.split(``).map(e=>/[0-9]/.test(e)?e:e.toUpperCase()).join(` `)}var Lt=[{name:`url`,pattern:/\bhttps?:\/\/\S+/gi,replace:` link `},{name:`path`,pattern:/(?:\/[A-Za-z0-9._-]+){2,}\/?/g,replace:e=>` `+e.replace(/[/._-]+/g,` `).trim()+` `},{name:`slash`,pattern:/(?<=[A-Za-z0-9])\/(?=[A-Za-z0-9])/g,replace:` `},{name:`func-call`,pattern:/\b([A-Za-z_$][\w$]*)\(\)/g,replace:`$1`},{name:`approx`,pattern:/~(?=\s*[\d.])/g,replace:`approximately `},{name:`range`,pattern:/(\d)\s*[-–—]\s*(?=\d)/g,replace:`$1 to `},{name:`version`,pattern:/\b(v?)(\d+(?:\.\d+){2,})\b/gi,replace:(e,t,n)=>`${t?`version `:``}${n.replace(/\./g,` dot `)}`},{name:`decimal`,pattern:/\b(\d+)\.(\d+)\b/g,replace:(e,t,n)=>`${t} point ${Ft(n)}`},{name:`hash`,pattern:/\b(?=[0-9a-f]{7,40}\b)(?=[0-9a-f]*[a-f])(?=[0-9a-f]*\d)[0-9a-f]{7,40}\b/gi,replace:e=>It(e)},{name:`id-camel`,pattern:/([a-z])(Id|ID)(s)?\b/g,replace:(e,t,n,r)=>`${t} I D${r?`s`:``}`},{name:`id-word`,pattern:/\b(?:id|Id|ID)(s)?\b/g,replace:(e,t)=>`I D${t?`s`:``}`},{name:`byte-unit`,pattern:/\b(\d+)\s?(kb|mb|gb|tb)\b/gi,replace:(e,t,n)=>`${t} ${Pt[n.toLowerCase()]}`},{name:`ms-unit`,pattern:/\b(\d{1,5})\s?ms\b/g,replace:(e,t)=>`${t} ${Pt.ms}`},{name:`s-unit`,pattern:/\b(\d{1,3})\s?s\b/g,replace:(e,t)=>`${t} ${Pt.s}`},{name:`live-adjective`,pattern:/\b(is|are|was|were|be|been|being|now|and|stays?|staying|went|go|goes|going|deployed|it's|that's|here's|there's|we're|you're|they're)\s+live\b/gi,replace:(e,t)=>`${t} lyve`},{name:`interior-dot`,pattern:/\.(?=[A-Za-z0-9])/g,replace:` dot `}];function Rt(e){if(!e)return``;let t=e;for(let e of Lt)t=t.replace(e.pattern,e.replace);return t.replace(/[ \t]{2,}/g,` `).trim()}function zt(e){return Rt(kt(e))}var Bt=[{id:`am_michael`,label:`Michael (US ♂)`},{id:`am_adam`,label:`Adam (US ♂)`},{id:`af_heart`,label:`Heart (US ♀)`},{id:`af_bella`,label:`Bella (US ♀)`},{id:`af_nicole`,label:`Nicole (US ♀)`},{id:`af_sarah`,label:`Sarah (US ♀)`},{id:`bm_george`,label:`George (UK ♂)`},{id:`bf_emma`,label:`Emma (UK ♀)`}],Vt=220;function Ht(e){let t=e.match(/[^.!?]+[.!?]*\s*/g)?.map(e=>e.trim()).filter(Boolean)??[e],n=[];for(let e of t){if(e.length<=Vt){n.push(e);continue}let t=e;for(;t.length>Vt;){let e=t.lastIndexOf(` `,Vt);e<=0&&(e=Vt),n.push(t.slice(0,e).trim()),t=t.slice(e).trim()}t&&n.push(t)}return n}function Ut(){return typeof window<`u`&&`speechSynthesis`in window}var A=new class{enabled=!1;lang=`en-US`;mode=`kokoro`;kokoroVoice=`am_michael`;browserVoice=``;active=null;queue=[];currentChat=null;speaking=!1;gen=0;audioEl=null;audioUrl=null;playingKey=null;manual=!1;listeners=new Set;get available(){return Ut()||typeof Audio<`u`}isEnabled(){return this.enabled}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}getPlayingKey(){return this.playingKey}setPlayingKey(e){if(e!==this.playingKey){this.playingKey=e;for(let e of this.listeners)e()}}setEnabled(e){e!==this.enabled&&(this.enabled=e,e||this.reset())}setLang(e){this.lang=e}setMode(e){e!==this.mode&&(this.mode=e,this.reset())}setKokoroVoice(e){this.kokoroVoice=e}setBrowserVoice(e){this.browserVoice=e}setActiveChat(e){e!==this.active&&(this.active=e,this.queue=this.queue.filter(t=>t.chatId===e))}onResponse(e,t){if(!this.enabled||!this.available||!e||e!==this.active)return;let n=zt(t);n&&(this.speaking&&(this.manual||this.currentChat&&this.currentChat!==e)&&(this.queue=[],this.cancel()),this.queue.push({chatId:e,text:n}),this.pump())}speak(e,t){if(!this.available)return;let n=zt(e);if(!n)return;this.reset(),this.manual=!0,this.speaking=!0,this.currentChat=null,this.setPlayingKey(t??null);let r=++this.gen,i=Ht(n),a=()=>{r===this.gen&&(this.speaking=!1,this.manual=!1,this.setPlayingKey(null))};this.mode===`kokoro`?this.speakKokoro(i,0,r,a):this.speakBrowser(i,0,r,a)}bargeIn(){this.reset()}reset(){this.queue=[],this.cancel()}cancel(){this.gen++,this.currentChat=null,this.speaking=!1,this.manual=!1,this.setPlayingKey(null);try{window.speechSynthesis.cancel()}catch{}this.stopAudio()}stopAudio(){if(this.audioEl)try{this.audioEl.pause(),this.audioEl.src=``}catch{}if(this.audioUrl){try{URL.revokeObjectURL(this.audioUrl)}catch{}this.audioUrl=null}}pump(){if(this.speaking)return;let e=this.queue.shift();if(!e)return;this.speaking=!0,this.manual=!1,this.currentChat=e.chatId;let t=++this.gen,n=Ht(e.text),r=()=>{t===this.gen&&(this.speaking=!1,this.currentChat=null,this.pump())};this.mode===`kokoro`?this.speakKokoro(n,0,t,r):this.speakBrowser(n,0,t,r)}speakBrowser(e,t,n,r){if(n!==this.gen)return;if(!Ut()||t>=e.length)return r();let i=new SpeechSynthesisUtterance(e[t]),a=this.browserVoice?window.speechSynthesis.getVoices().find(e=>e.voiceURI===this.browserVoice):void 0;a?(i.voice=a,i.lang=a.lang):i.lang=this.lang||navigator.language||`en-US`,i.onend=()=>this.speakBrowser(e,t+1,n,r),i.onerror=()=>this.speakBrowser(e,t+1,n,r),window.speechSynthesis.speak(i)}speakKokoro(e,t,n,r,i){if(n!==this.gen)return;let a=e[t];if(a===void 0)return r();let o=i??this.fetchSpeech(a),s=e[t+1],c=s===void 0?void 0:this.fetchSpeech(s);o.then(i=>{n===this.gen&&this.playBlob(i,n,()=>this.speakKokoro(e,t+1,n,r,c),()=>{this.speakBrowser(e,t,n,r)})}).catch(()=>{n===this.gen&&this.speakBrowser(e,t,n,r)})}fetchSpeech(e){return _e(`/connectors/voice/call/speak`,{text:e,voice:this.kokoroVoice})}playBlob(e,t,n,r){if(t!==this.gen)return;if(typeof Audio>`u`)return r();this.stopAudio(),this.audioEl||=new Audio;let i=URL.createObjectURL(e);this.audioUrl=i;let a=this.audioEl;a.src=i,a.onended=()=>{t===this.gen&&n()},a.onerror=()=>{t===this.gen&&r()},a.play().catch(()=>{t===this.gen&&r()})}};function Wt(){if(!Ut())return[];try{return window.speechSynthesis.getVoices().map(e=>({uri:e.voiceURI,label:`${e.name} (${e.lang})`,lang:e.lang})).sort((e,t)=>e.lang.localeCompare(t.lang)||e.label.localeCompare(t.label))}catch{return[]}}var Gt=typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof window<`u`&&`MediaRecorder`in window;function Kt(){for(let e of[`audio/webm;codecs=opus`,`audio/webm`,`audio/ogg;codecs=opus`,`audio/mp4`])if(typeof MediaRecorder<`u`&&MediaRecorder.isTypeSupported?.(e))return e}var qt=class{rec=null;chunks=[];stream=null;async start(){this.stream=await navigator.mediaDevices.getUserMedia({audio:!0}),this.chunks=[];let e=Kt();this.rec=new MediaRecorder(this.stream,e?{mimeType:e}:void 0),this.rec.ondataavailable=e=>{e.data.size&&this.chunks.push(e.data)},this.rec.start()}async stop(){let e=this.rec;if(!e)return this.teardown(),null;let t=new Promise(t=>{e.onstop=()=>t()});try{e.stop()}catch{}await t;let n=e.mimeType||`audio/webm`,r=new Blob(this.chunks,{type:n});return this.teardown(),r.size?r:null}cancel(){try{this.rec?.stop()}catch{}this.teardown()}teardown(){this.stream?.getTracks().forEach(e=>e.stop()),this.rec=null,this.stream=null,this.chunks=[]}};async function Jt(e){return((await xe(`/connectors/voice/call/transcribe`,e))?.text??``).trim()}function Yt(){return typeof document<`u`&&document.visibilityState===`hidden`}var j=w((e,t)=>{let n=()=>{t()._timer||Yt()||e({now:Date.now(),_timer:setInterval(()=>e({now:Date.now()}),1e3)})},r=()=>{let n=t()._timer;n&&clearInterval(n),e({_timer:null})},i=()=>Yt()?r():n();return{now:Date.now(),_timer:null,_running:!1,start(){t()._running||(e({_running:!0}),typeof document<`u`&&document.addEventListener(`visibilitychange`,i),n())},stop(){t()._running&&(typeof document<`u`&&document.removeEventListener(`visibilitychange`,i),r(),e({_running:!1}))}}});function Xt(e=!0){return j(t=>e?t.now:0)}function Zt(e=3e4){return j(t=>Math.floor(t.now/e))}function Qt(e=1e4){return j(t=>Math.floor(t.now/e)*e)}function $t(e,t){let{[t]:n,...r}=e;return r}function en(e,t){return!t||e.desiredVersion>t.desiredVersion||e.desiredVersion===t.desiredVersion&&e.updatedAt>=t.updatedAt}function tn(e){if(!e?.agentId)return;let{states:t}=nn.getState();en(e,t[e.agentId])&&nn.setState({states:{...t,[e.agentId]:e}})}var nn=w((e,t)=>({states:{},refused:{},async request(n,r){e({refused:$t(t().refused,n)});try{let{effortState:e}=await S(`POST`,`/agents/`+encodeURIComponent(n)+`/actions`,{action:`effort`,effort:r,requestId:crypto.randomUUID(),surface:{component:`composer-effort`}});tn(e)}catch(i){e({refused:{...t().refused,[n]:{effort:r,error:i.message}}})}},async load(e){let{state:t}=await S(`GET`,`/agents/`+encodeURIComponent(e)+`/effort`);tn(t)},invalidate(){for(let e of Object.keys(t().states))t().load(e).catch(()=>{})},dismiss(n){t().refused[n]&&e({refused:$t(t().refused,n)})}}));function rn(e){return e&&Je(e)?e.desiredEffort:void 0}function an(e,t){e===`agent.effort`&&tn(JSON.parse(t))}var on={changes:[],coveredFrom:null},sn=new Set;function cn(e,t){let n=new Set(e.map(e=>e.commandId)),r=t.filter(e=>!n.has(e.commandId));return r.length?[...e,...r].sort((e,t)=>e.at-t.at):e}var ln=w((e,t)=>({byAgent:{},epoch:0,async ensureCovered(n,r){let i=t().byAgent[n]??on;if(i.coveredFrom!==null&&r>=i.coveredFrom)return;let a=`${n}:${r}`;if(!sn.has(a)){sn.add(a);try{let a=i.coveredFrom===null?``:`&to=${i.coveredFrom}`,o=[],s;do{let e=s?`&afterAt=${s.at}&afterId=${encodeURIComponent(s.id)}`:``,t=await S(`GET`,`/agents/${encodeURIComponent(n)}/effort-changes?from=${r}${a}${e}`);o.push(...t.changes),s=t.next}while(s);let c=t().byAgent[n]??on,l=c.coveredFrom===null?r:Math.min(c.coveredFrom,r);e({byAgent:{...t().byAgent,[n]:{changes:cn(c.changes,o),coveredFrom:l}}})}catch{}finally{sn.delete(a)}}},note(n){let r=t().byAgent;for(let e of n){let t=r[e.agentId]??on,n=cn(t.changes,[e]);n!==t.changes&&(r={...r,[e.agentId]:{...t,changes:n}})}r!==t().byAgent&&e({byAgent:r})},invalidate(){e({byAgent:Object.fromEntries(Object.entries(t().byAgent).map(([e,t])=>[e,{...t,coveredFrom:null}])),epoch:t().epoch+1})}}));function un(e,t){if(e!==`command.succeeded`||!t.includes(`"agent.setEffort"`))return;let n=qe(JSON.parse(t).command);n&&ln.getState().note([n])}var dn=[];function fn(e,t){let n=ln(t=>e?t.byAgent[e]:void 0),r=ln(e=>e.epoch),i=n?.coveredFrom??null;return(0,C.useEffect)(()=>{e&&t!==null&&(i===null||t<i)&&ln.getState().ensureCovered(e,t)},[e,t,i,r]),n?.changes??dn}function M(e,t){return(e?.providers??[]).filter(e=>f(t?.find(t=>t.provider===e)))}function pn(e,t,n){let r=M(e,t);return{providers:n&&e?.providers.includes(n)&&!r.includes(n)?[...r,n]:r,enabled:r}}function N(e,t){return M(e,t)[0]??p().find(e=>f(t?.find(t=>t.provider===e)))??``}function mn(e,t){return c(e,t)?.models.filter(e=>!e.disabled)??[]}function hn(e,t,n,r){return c(e,r)?.effortSwitch!==!0||n===`headless`?[]:mn(e,r).find(e=>e.alias===t)?.efforts??[]}var P=`band`;function gn(e,t){return e.includes(t)?t:P}function _n(e,t){let n=t.indexOf(e);if(!(n<0))return{floor:t[Math.max(0,n-1)],ceiling:t[Math.min(t.length-1,n+1)]}}function F(e,t){let n=c(e,t);return n?l(n).alias??``:``}function vn(e,t){return e.filter(e=>e.status===`online`&&v(t,e.baseDir)).sort((e,t)=>fe(t.baseDir).length-fe(e.baseDir).length)[0]}function yn(e,t){for(let n of e){let e=n.managedAgents.find(e=>e.agentId===t);if(e)return{orchestrator:n,managed:e}}return null}function bn(e,t){let n=yn(e,t.id)?.orchestrator;if(n)return n;let r=typeof t.meta?.cwd==`string`?t.meta.cwd:``;return r?vn(e,r):void 0}var xn=`/settings/chat/scroll`,Sn=150,Cn=1e3,I=new Map,wn=new Map,L=new Set,R=null,Tn=null,En=!1;function Dn(e){if(!e||typeof e!=`object`)return null;let t=e;if(typeof t.stick!=`boolean`||t.topKey!==null&&typeof t.topKey!=`string`||typeof t.offset!=`number`||!Number.isFinite(t.offset))return null;let n=typeof t.anchorMessageId==`number`&&Number.isFinite(t.anchorMessageId)?t.anchorMessageId:void 0,r=typeof t.anchorEndMessageId==`number`&&Number.isFinite(t.anchorEndMessageId)?t.anchorEndMessageId:void 0,i=t.mode===`follow`||t.mode===`anchored`?t.mode:void 0;return{...i===void 0?{}:{mode:i},stick:t.stick,topKey:t.topKey,...n===void 0?{}:{anchorMessageId:n},...r===void 0?{}:{anchorEndMessageId:r},offset:t.offset}}function On(e){if(!e||typeof e!=`object`)return 0;let t=e.updatedAt;return typeof t==`number`&&Number.isFinite(t)?t:0}function kn(e){return I.get(e)}function An(e,t,n){I.delete(e),I.set(e,t),wn.set(e,n)}function jn(e,t){An(e,t,Date.now()),L.add(e),Mn(),zn(),Fn()}function Mn(){for(;I.size>Sn;){let e=I.keys().next().value;if(e===void 0)break;I.delete(e),wn.delete(e),L.delete(e)}}function Nn(e){let t={};for(let n of e){let e=I.get(n);e&&(t[n]={...e,updatedAt:wn.get(n)??Date.now()})}return t}function Pn(e){if(!(!e||typeof e!=`object`)){for(let[t,n]of Object.entries(e)){if(L.has(t))continue;let e=Dn(n);if(!e)continue;let r=On(n),i=wn.get(t);i!==void 0&&i>=r||An(t,e,r)}Mn()}}function Fn(){R!==null&&clearTimeout(R),R=setTimeout(()=>{In(!1)},Cn)}async function In(e){if(L.size===0)return;let t=L;L=new Set;let n=Nn(t);try{Pn((await S(`PUT`,xn,{value:n},e?{keepalive:!0}:void 0)).value)}catch{for(let e of t)L.add(e)}}function Ln(){R!==null&&(clearTimeout(R),R=null),In(!0)}async function Rn(){try{Pn((await S(`GET`,xn)).value)}catch{}}function zn(){En||typeof document>`u`||typeof window>`u`||(En=!0,document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`?Ln():Rn()}),window.addEventListener(`pagehide`,Ln))}function Bn(){return zn(),Tn||(Tn=Rn(),Tn)}function Vn(e,t){let n=0,r=0;return{async hydrate(i){let a=n;try{let o=t((await S(`GET`,e)).value);n===a&&r===0&&o!==void 0&&i(o)}catch{}},async save(t){n+=1,r+=1;try{await S(`PUT`,e,{value:t})}finally{--r}}}}var Hn=Vn(`/settings/chat/decisionsDock`,e=>{let t=e?.collapsed;return typeof t==`boolean`?t:void 0});function Un(e){return Hn.hydrate(t=>e({decisionsDockCollapsed:t}))}var Wn=(e,t)=>({openDecisions:[],decisionsDockCollapsed:!1,async setDecisionsDockCollapsed(n){let r=t().decisionsDockCollapsed;e({decisionsDockCollapsed:n});try{await Hn.save({collapsed:n})}catch(n){e({decisionsDockCollapsed:r}),t().showError(`Could not save panel state`,i(n),n)}},async fetchOpenDecisions(){try{let{decisions:n}=await S(`GET`,`/decisions?status=open`),r=O(t().openDecisions,n);r!==t().openDecisions&&e({openDecisions:r})}catch{}},async declineVaultRequest(n){try{return await S(`POST`,`/decisions/${n}/decline`),e({openDecisions:t().openDecisions.filter(e=>e.id!==n)}),t().showNotification(`Secret request #${n} declined`),!0}catch(e){return t().showError(`Decline failed`,i(e),e),t().fetchOpenDecisions(),!1}},async answerDecision(n,r,a){try{await S(`POST`,`/decisions/${n}/answer`,{answers:r,...a?{note:a}:{}});let i=t().openDecisions.find(e=>e.id===n);e({openDecisions:t().openDecisions.filter(e=>e.id!==n)});let o=i?.kind===`action`?r[Ue]:void 0;return t().showNotification(typeof o==`string`?`${o}: ${i.title}`:`Decision #${n} answered`),!0}catch(e){return t().showError(`Answer failed`,i(e),e),t().fetchOpenDecisions(),!1}}}),Gn=Vn(`/settings/chat/filters`,d);function Kn(e){return Gn.hydrate(t=>e({chatFilters:t}))}var qn=(e,t)=>({chatFilters:u,async setChatFilters(n){let r=t().chatFilters;e({chatFilters:n});try{await Gn.save(n)}catch(n){e({chatFilters:r}),t().showError(`Could not save chat filters`,i(n),n)}}}),Jn={expiresDate:``,expiresTime:``,revision:``,sourceUrl:``,hintEnabled:!0},Yn=e=>String(e).padStart(2,`0`),Xn=`23:59:59.999`;function Zn(e){let t=e?new Date(e):null;if(!t||Number.isNaN(t.getTime()))return{expiresDate:``,expiresTime:``};let n=t.getHours()===23&&t.getMinutes()===59&&t.getSeconds()===59;return{expiresDate:`${t.getFullYear()}-${Yn(t.getMonth()+1)}-${Yn(t.getDate())}`,expiresTime:n?``:`${Yn(t.getHours())}:${Yn(t.getMinutes())}`}}function Qn(e){if(!e.expiresDate)return null;let t=new Date(`${e.expiresDate}T${e.expiresTime||Xn}`);return!Number.isNaN(t.getTime())&&Zn(t.toISOString()).expiresDate===e.expiresDate?t.getTime():NaN}function $n(e){let{expiresDate:t,expiresTime:n}=Zn(e);return n?`${t} ${n}`:t}var er=(e,t)=>e.expiresDate===t.expiresDate&&e.expiresTime===t.expiresTime,tr=(e,t)=>({...Zn(e.expiresAt),revision:e.revision??``,sourceUrl:e.sourceUrl??``,hintEnabled:t});function nr(e,t={}){let n={},r=t.metadata??{},i={expiresAt:er(e,Zn(r.expiresAt))?r.expiresAt??``:e.expiresDate?new Date(Qn(e)).toISOString():``,revision:e.revision.trim(),sourceUrl:e.sourceUrl.trim()};for(let e of[`expiresAt`,`revision`,`sourceUrl`])i[e]!==(r[e]??``)&&(n[e]=i[e]||null);return e.hintEnabled!==(t.hintEnabled??!0)&&(n.hintEnabled=e.hintEnabled),Object.keys(n).length?n:void 0}function rr(e,t={},n=Date.now()){let r=Qn(e);return e.expiresBad||Number.isNaN(r)?`Expiry is not a real date.`:!e.expiresDate&&e.expiresTime?`Pick a date for the expiry time.`:r!==null&&r<=n&&!er(e,Zn(t.metadata?.expiresAt))?`Expiry is in the past.`:e.sourceUrl.trim()&&!/^https?:\/\/[^\s/@]+(?:[/?#]\S*)?$/i.test(e.sourceUrl.trim())?`Source URL must start with http:// or https:// and carry no credentials.`:``}function ir(e,t){let n=e?new Date(e).getTime():NaN;return Number.isFinite(n)?n<=t?{expired:!0,label:`expired ${y(t,n)} ago`}:{expired:!1,label:`expires in ${y(n,t)}`}:null}var ar=(e,t)=>e?`${e}${t?` · …${t}`:``}`:``,or={expiresAt:`expiry`,revision:`revision`,sourceUrl:`source URL`,hintEnabled:`hint`};function sr(e){try{let{field:t,oldValue:n,newValue:r}=JSON.parse(e??``);if(!t)return e??``;let i=e=>e==null?`none`:t===`hintEnabled`?e?`on`:`off`:String(e);return`${or[t]??t}: ${i(n)} → ${i(r)}`}catch{return e??``}}var cr=e=>{let t=e.projectId?`project:${e.projectId}:${e.name}`:e.name;return e.environment&&e.environment!==`prod`?`${t}@${e.environment}`:t},lr=`vault:global`,ur=/^[A-Za-z_][A-Za-z0-9_.-]{0,255}(@[a-z0-9-]{1,32})?$/,dr=e=>e.teamId===lr,fr=(e,t)=>dr(e)&&e.expiresAt!==void 0&&e.expiresAt<=t,pr=(e,t)=>e.reduce((e,n)=>e+ +!fr(n,t),0);function mr(e){let t=e.replace(/^Set secret /,``),n=/^project:([A-Za-z0-9_-]+):(.+)$/.exec(t);return n?{name:n[2],scope:`project`,projectId:n[1]}:{name:t,scope:`global`}}var hr=(e,t)=>t.tab===`global`?!e.projectId:!!e.projectId&&e.projectId===t.projectId;function gr(e){let t=e.message??``,n=/^vault_key_(missing|mismatch|unavailable)$/.exec(t);return e.status===503&&n?{status:`key-problem`,code:t}:e.status===503&&t===`unavailable`||e.status===403||e.status===404?{status:`off`}:typeof e.status==`number`?{status:`error`,message:t||`HTTP ${e.status}`}:null}var _r={requested:`Requested`,set:`Set`,rotated:`Rotated`,resolved:`Used`,deleted:`Deleted`,"metadata-edited":`Metadata edited`},vr=e=>_r[e]??e;function yr(e){let t=e.detail??``;return t?e.action===`requested`&&t.startsWith(`decision:`)?`decision #${t.slice(9)}`:e.action===`resolved`?`command ${t}`:e.action===`metadata-edited`?sr(t):t.startsWith(`requestedBy:`)?`requested by ${t.slice(12)}`:t:``}function br(e){let t=e.detail??``;return e.action===`requested`&&/^decision:\d+$/.test(t)?{decisionId:Number(t.slice(9))}:t.startsWith(`requestedBy:`)?{requestedBy:t.slice(12)}:{}}var xr=e=>/^agent-([0-9a-f]{8})(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.exec(e)?.[1]??null;function Sr(e,t){return new URL(e.replace(/^\//,``),t).toString()}var Cr={vault_key_missing:{title:`Vault key is missing`,body:"Secrets exist but the key file is gone. Relay never makes a new key while secrets exist. Put the key from `secrets export-key` back at $AGENT_RELAY_HOME/secrets/vault.key and restart Relay."},vault_key_mismatch:{title:`Vault key does not match`,body:"The key file on the hub cannot open the stored secrets. Restore the original key from your `secrets export-key` backup and restart Relay."},vault_key_unavailable:{title:`Vault key cannot be read`,body:`The key file exists but the hub cannot read it. Check its owner and permissions (0600), then restart Relay.`}};async function wr(e){try{let[{secrets:t},n,r]=await Promise.all([S(`GET`,`/secrets?scope=all&environment=*`),S(`GET`,`/projects`).then(e=>e.projects??[],()=>null),S(`GET`,`/secrets/backup`).catch(()=>null)]);e({vault:{status:`ready`,secrets:t},vaultBackup:r,...n?{vaultProjects:n}:{}})}catch(t){let n=gr(t);n&&e({vault:n})}}var Tr=e=>({vault:{status:`unknown`},vaultProjects:[],vaultBackup:null,fetchVault:()=>wr(e)});async function Er(e){return(await S(`GET`,`/secrets/${encodeURIComponent(e)}/audit`)).audit}async function Dr(e,t,n,r=`prod`){let i=await S(`POST`,`/mcp`,{jsonrpc:`2.0`,id:1,method:`tools/call`,params:{name:`relay_secret_request`,arguments:{name:r===`prod`?e:`${e}@${r}`,reason:t,...n?{scope:`project`,project:n}:{}}}});if(i.error)throw Error(i.error.message??`Secret request failed`);let a=i.result?.structuredContent;if(i.result?.isError||typeof a?.decisionId!=`number`)throw Error(i.result?.content?.[0]?.text??`Secret request failed`);let o=await S(`GET`,`/decisions/${a.decisionId}`);return{decisionId:a.decisionId,name:a.name??e,formUrl:o.formUrl,createdAt:o.createdAt}}async function Or(e){return S(`POST`,`/secrets`,{name:e.name,value:e.value,environment:e.environment??`prod`,...e.projectId?{scope:`project`,project:e.projectId}:{},...e.description?{description:e.description}:{},...e.metadata?{metadata:e.metadata}:{}})}async function kr(e,t,n,r){return S(`PUT`,`/secrets/${encodeURIComponent(e)}`,{value:t,...n?{reason:n}:{},...r?{metadata:r}:{}})}async function Ar(e,t){return S(`PATCH`,`/secrets/${encodeURIComponent(e)}/metadata`,t)}async function jr(e){return(await S(`GET`,`/secrets/${encodeURIComponent(e)}`)).versions}async function Mr(e){return S(`DELETE`,`/secrets/${encodeURIComponent(e)}`)}async function Nr(e){let t=await Promise.all(e.map(e=>S(`GET`,`/agents/${encodeURIComponent(e)}`).then(t=>[e,t.label||t.name],()=>null)));return Object.fromEntries(t.flatMap(e=>e&&e[1]?[e]:[]))}async function Pr(){return S(`POST`,`/secrets/backup`,{})}function z(e,t,n){if(e.length<=t)return e;let r=new Set(e.map((e,t)=>({item:e,index:t,rank:n(e)})).sort((e,t)=>t.rank-e.rank||t.index-e.index).slice(0,t).map(({index:e})=>e));return e.filter((e,t)=>r.has(t))}var Fr=3e4,B=null,V=new WeakMap;function Ir(e){let t=V.get(e);t!==void 0&&clearTimeout(t),V.delete(e)}function Lr(e){if(o(e.from)||o(e.to))return!0;let t=typeof e.payload?.direction==`string`?e.payload.direction:void 0;return e.kind===`channel.event`&&t===`inbound`}var Rr={enabled:!0,browserEnabled:!1,messages:!0,replies:!0,errors:!0};function zr(e,t){return t.enabled?e.kind===`message`?t.messages:e.kind===`reply`?t.replies:e.kind===`decision`||t.errors:!1}function Br(){return typeof window<`u`&&`Notification`in window}function Vr(){return Br()?window.Notification.permission:`unsupported`}function Hr(e,t){return!zr(e,t.notificationSettings)||!t.notificationSettings.browserEnabled||Vr()!==`granted`||bt(e,t)?!1:_t()||t.view!==`chat`}function Ur(e,t){if(Vr()===`granted`)try{let n=new window.Notification(e.title,{body:e.body,tag:e.id,icon:`icons/humwick-192.png`,data:{view:e.view,threadPeer:e.threadPeer,agentId:e.agentId,messageId:e.messageId}});n.onclick=()=>{window.focus(),t(),n.close()}}catch{}}var Wr=(e,t)=>({notification:null,toastNotification:null,notifications:[],notificationUnread:0,notificationSettings:{...Rr},notificationPermission:Vr(),confirmModal:{show:!1,title:``,message:``,action:null},errorModal:{show:!1,title:``,message:``},openConfirm(t,n,r){e({confirmModal:{show:!0,title:t,message:n,action:r}})},showError(n,r,i,a){let o=t();if(!a?.force&&ge(i)&&(!o.connected||o.connectionError))return;let s=`${n} ${r}`;B&&B.key===s&&!B.dismissed&&Date.now()-B.at<Fr||(B={key:s,at:Date.now(),dismissed:!1},e({errorModal:{show:!0,title:n,message:r}}))},dismissError(){B&&={...B,dismissed:!0},e({errorModal:{show:!1,title:``,message:``}})},showNotification(n){Ir(t),e({notification:n,toastNotification:null});let r=setTimeout(()=>{V.delete(t),e({notification:null})},3e3);V.set(t,r)},handleRelayNotification(n){let r=t();if(!zr(n,r.notificationSettings)||r.notifications.some(e=>e.id===n.id))return;if(n.messageId&&(n.kind===`message`||n.kind===`reply`)){let e=r.messages.find(e=>e.id===n.messageId);if(e&&!Lr(e))return}let i=bt(n,r),a=`${n.title}: ${n.body}`;if(e({notifications:[n,...r.notifications].slice(0,100),notificationUnread:i?r.notificationUnread:Math.min(99,r.notificationUnread+1),notification:i?r.notification:a,toastNotification:i?r.toastNotification:n}),!i){Ir(t);let r=n.id,i=setTimeout(()=>{V.delete(t),t().toastNotification?.id===r&&e({notification:null,toastNotification:null})},4500);V.set(t,i)}Hr(n,r)&&Ur(n,()=>t().openNotification(n)),i&&n.threadPeer&&n.messageId&&t().markInboxThreadReadTo(n.threadPeer,n.messageId)},async openNotification(n){if(e({notificationUnread:0}),n.threadPeer&&(t().openInboxThread(n.threadPeer),n.messageId&&t().markInboxThreadReadTo(n.threadPeer,n.messageId)),n.view&&await t().switchView(n.view),n.agentId&&n.view===`agents`){let e=t().agentsById[n.agentId];e&&t().openAgentDetail(e)}},dismissToast(){Ir(t),e({notification:null,toastNotification:null})},markNotificationsRead(){e({notificationUnread:0})},clearNotifications(){e({notifications:[],notificationUnread:0})},async requestBrowserNotifications(){if(!Br()){e({notificationPermission:`unsupported`,notificationSettings:{...t().notificationSettings,browserEnabled:!1}}),t().showNotification(`Browser notifications are not supported here`);return}let n=await window.Notification.requestPermission();e({notificationPermission:n,notificationSettings:{...t().notificationSettings,browserEnabled:n===`granted`}}),t().showNotification(n===`granted`?`Browser notifications enabled`:`Browser notifications not enabled`)}}),Gr={active:ne,idle:se};function Kr(e){return(e??(typeof document>`u`?void 0:document))?.visibilityState===`hidden`}function qr(e,t=Kr()){return!e.autoRefresh||t?null:e.lowBandwidth?`idle`:Date.now()-e._lastInteractionAt<=3e4?`active`:`idle`}function Jr(e,t){return t?{stop:!0,reconcile:!1,tier:null}:{stop:!1,reconcile:!0,tier:qr(e,!1)}}function Yr(e,t,n=Date.now()){return t||e.lowBandwidth||e._pollTier!==`idle`?!1:n+Gr.active<(e._pollFireAt??1/0)}function Xr(e){e.clearTimer();let t=qr(e.cadenceInput(),e.hidden());t&&e.arm(t)}function Zr(e){if(Jr(e.cadenceInput(),e.hidden()).stop){e.clearTimer();return}e.reconcileAfterGap(),Xr(e)}function Qr(e,t){let n=e.cadenceInput();t-n._lastInteractionAt<1e3||(e.recordInteraction(t),Yr(n,e.hidden(),t)&&Xr(e))}var $r=e=>({voiceTtsEnabled:!1,voiceTtsLang:`en-US`,voiceTtsMode:`kokoro`,voiceTtsKokoroVoice:`am_michael`,voiceTtsBrowserVoice:``,voiceInputMode:`compose`,setVoiceTtsEnabled(t){A.setEnabled(t),e({voiceTtsEnabled:t})},setVoiceTtsLang(t){A.setLang(t),e({voiceTtsLang:t})},setVoiceTtsMode(t){A.setMode(t),e({voiceTtsMode:t})},setVoiceTtsKokoroVoice(t){A.setKokoroVoice(t),e({voiceTtsKokoroVoice:t})},setVoiceTtsBrowserVoice(t){A.setBrowserVoice(t),e({voiceTtsBrowserVoice:t})},setVoiceInputMode(t){e({voiceInputMode:t})}}),ei=null;function ti(e){let t=e.voiceTtsEnabled&&e.view===`chat`&&e.selectedInboxThread||null;t!==ei&&(ei=t,A.setActiveChat(t))}function ni(e){let t=Object.entries(e().agentChatByAgent).filter(([,e])=>e.loadedInitial).map(([e])=>e);return Promise.all(t.map(t=>e().gapFillAgentChat(t)))}function ri(e,t){ni(e);for(let e of[ln,nn])e.getState().invalidate();t||Promise.all([e().refreshLiveData({gap:!0}),e().refreshPlans(),e().refreshIssueRefs(),e().fetchWorkflowLiveRuns()])}var ii=[`chat`,`messages`];function ai(e){let t=[e.fetchOrchestrators(),e.fetchInboxState()];return ii.includes(e.view)&&t.push(e.fetchChatHistoryImports()),t}async function oi(e,t){t!==`shipping`&&(e.shippingBoard||e.shippingLoading)&&e.closeShipping(),t!==`workflows`&&(e.workflowRuns||e.workflowStats||e.workflowDefinitions||e.workflowLoading||e.workflowTab===`catalog`)&&e.closeWorkflows(),t===`shipping`&&await e.openShipping(),t===`workflows`&&await e.openWorkflows()}function si(e,t,n){e.shippingBoard&&(t===`workspace.status`||t===`ci.status`||t.startsWith(`task.`))&&e.shippingEvent(t,n),t===`workflow.changed`&&e.workflowChanged()}function ci(e){return!e||e.role===`admin`}async function li(e,t,n){let r=await fetch(new URL(`api`+e,Se()),{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`,...ye(Se()),...n?{"X-Agent-Relay-Token":n}:{}},body:JSON.stringify(t)}),i=await r.text(),a=i?JSON.parse(i):{};if(!r.ok)throw Object.assign(Error(typeof a.error==`string`?a.error:r.statusText),{status:r.status});return a}var ui=120,H=null,di=``,fi=null;function pi(e,t,n){di=n.accessToken,me(n.accessToken),be(!ci(n.user)),t({authToken:``,sessionUser:n.user}),H&&clearTimeout(H),H=setTimeout(()=>{gi(e,t)},Math.max(30,n.expiresIn-ui)*1e3)}function mi(){return di!==``}function hi(e){H&&clearTimeout(H),H=null,di&&me(``),di=``,be(!1),e({sessionUser:null})}function gi(e,t){let n=()=>li(`/auth/refresh`,{});return fi??=(navigator.locks?navigator.locks.request(`relay-auth-refresh`,n):n()).then(n=>(pi(e,t,n),!0)).catch(e=>((e.status===400||e.status===401)&&hi(t),!1)).finally(()=>{fi=null}),fi}async function _i(e){try{e({signInEnabled:(await(await fetch(new URL(`api/auth/providers`,Se()))).json()).invitesEnabled===!0})}catch{}}async function vi(e,t){t({authNeeded:!1,connectionError:!1}),e().connectSSE(),await e().refresh(),e().startAutoRefresh()}function yi(e,t){if(e().authNeeded)return;let n=()=>{e().authNeeded||(t({authNeeded:!0,connectionError:!1}),_i(t))};mi()?gi(e,t).then(e=>{e||n()}):n()}var bi=(e,t)=>({sessionUser:null,signInEnabled:!1,async signIn(n,r){pi(t,e,await li(`/auth/login`,{provider:`password`,username:n,password:r})),await vi(t,e)},async acceptInvite({code:n,handle:r,password:i,displayName:a}){pi(t,e,await li(`/auth/invites/accept`,{code:n,handle:r,password:i,...a?{displayName:a}:{}}))},async signOut(){t().disconnectSSE(),t().stopAutoRefresh(),await li(`/auth/logout`,{},di).catch(()=>void 0),window.location.reload()}}),xi={enabled:null,sessions:{},limits:null,fleetError:``},Si=()=>({browser:xi}),Ci=new Set([`starting`,`running`,`stopping`]),wi=100,Ti=e=>Ci.has(e.status);function U(e){return e().browser??xi}function Ei(e,t,n){let r={...e};if(n)for(let[e,t]of Object.entries(r))Ti(t)&&!n.has(e)&&delete r[e];for(let e of t){let t=r[e.id];(!t||t.updatedAt<=e.updatedAt)&&(r[e.id]=e)}let i=Object.values(r).filter(e=>!Ti(e)).sort((e,t)=>t.updatedAt-e.updatedAt);for(let e of i.slice(wi))delete r[e.id];return r}function Di(e){return e.status}async function Oi(e,t){try{let n=await S(`GET`,`/browser/sessions?active=1`),r=U(t);e({browser:{...r,enabled:!0,limits:n.limits,fleetError:``,sessions:Ei(r.sessions,n.sessions,new Set(n.sessions.map(e=>e.id)))}})}catch(n){let r=Di(n),i=U(t);e(r===404?{browser:{...i,enabled:!1}}:{browser:{...i,enabled:r===403||i.enabled,fleetError:r===403?`Only an operator sees every browser session.`:n.message}})}}async function ki(e,t,n){try{let r=await S(`GET`,`/browser/sessions?agentId=${encodeURIComponent(n)}&limit=1`),i=U(t);e({browser:{...i,enabled:!0,sessions:Ei(i.sessions,r.sessions)}})}catch(n){Di(n)===404&&e({browser:{...U(t),enabled:!1}})}}async function Ai(e,t,n){let r=await S(`DELETE`,`/browser/sessions/${encodeURIComponent(n)}`),i=U(t);e({browser:{...i,sessions:Ei(i.sessions,[r.session])}})}function ji(e,t,n,r){if(!n.startsWith(`browser.session.`))return!1;let i=JSON.parse(r),a=U(t);return e({browser:{...a,enabled:!0,sessions:Ei(a.sessions,[i])}}),!0}function Mi(e,t){let n=null;for(let r of Object.values(e))r.agentId===t&&(!n||r.createdAt>n.createdAt)&&(n=r);return n}function Ni(e){let t=a(e.result)?e.result:void 0;return s(e.error)??s(t?.error)??s(t?.reason)??s(t?.message)??`spawn command failed`}function Pi(e){let t=e.id||e.correlationId||`${e.type}:${e.updatedAt??e.createdAt??Date.now()}`,n=0;for(let e=0;e<t.length;e++)n=n*31+t.charCodeAt(e)>>>0;return-Math.max(1,n)}function Fi(e){try{let t=JSON.parse(e);return typeof t?.namespace==`string`?t.namespace:void 0}catch{return}}function Ii(e,t){if(t.clientId){let n=e.findIndex(e=>e.clientId===t.clientId);if(n>=0){let r=[...e];return r[n]=t,r}}return D(e,t)}var Li=[`pointerdown`,`pointermove`,`keydown`,`wheel`,`touchstart`];function Ri(e,t){return{cadenceInput:()=>{let t=e();return{autoRefresh:t.autoRefresh,lowBandwidth:t.lowBandwidth,_lastInteractionAt:t._lastInteractionAt,_pollTier:t._pollTier,_pollFireAt:t._pollFireAt}},hidden:()=>Kr(),clearTimer:()=>{let n=e();n._refreshTimer&&clearTimeout(n._refreshTimer),t({_refreshTimer:null,_pollTier:null,_pollFireAt:null})},arm:n=>{let r=Date.now()+Gr[n];t({_refreshTimer:setTimeout(()=>{e().refreshLiveData(),e().startAutoRefresh()},Gr[n]),_pollTier:n,_pollFireAt:r})},recordInteraction:e=>t({_lastInteractionAt:e}),reconcileAfterGap:()=>ri(e,!1)}}function zi(e){if(typeof window>`u`||typeof document>`u`)return()=>{};let t=()=>e().noteUserActivity(),n=()=>e().handleVisibilityChange();for(let e of Li)window.addEventListener(e,t,{passive:!0});return document.addEventListener(`visibilitychange`,n),()=>{for(let e of Li)window.removeEventListener(e,t);document.removeEventListener(`visibilitychange`,n)}}var Bi=e=>(t,n)=>({theme:`dark`,view:`overview`,autoRefresh:!0,lowBandwidth:!1,mobileMenuOpen:!1,commandPaletteOpen:!1,commandQuery:``,connected:!1,connectionError:!1,quotaSeq:0,authNeeded:!1,authToken:``,stats:{},fileOrchestratorId:``,filePath:``,fileSelectedPath:``,fileSelectedLine:0,fileOverlayOpen:!1,_es:null,_refreshTimer:null,_pollTier:null,_pollFireAt:null,_lastInteractionAt:Date.now(),_pollDetachListeners:null,_refreshInFlight:!1,set:e=>t(e),async init(){await e.waitForHydration();let r=n().authToken;r?me(r):mi()||await gi(n,t),pe(n().view),A.setEnabled(n().voiceTtsEnabled),A.setLang(n().voiceTtsLang),A.setMode(n().voiceTtsMode),A.setKokoroVoice(n().voiceTtsKokoroVoice),A.setBrowserVoice(n().voiceTtsBrowserVoice),ti(n()),he(()=>yi(n,t)),Bn(),t({notificationPermission:Vr()}),n().startClock();try{t({stats:await S(`GET`,`/stats`)})}catch(e){if(e.status===401){t({authNeeded:!0}),_i(t);return}}await n().refresh(),n().fetchAllIssueRefs(),n().connectSSE(),n().startAutoRefresh(),n()._pollDetachListeners||t({_pollDetachListeners:zi(n)})},async switchView(e){pe(e),t({view:e,mobileMenuOpen:!1});let r=n();await oi(r,e),ii.includes(e)&&await Promise.all([r.fetchMessages(),r.fetchInboxState(),r.fetchChatHistoryImports(),r.fetchDeliverableTasks({unfiltered:!0})]),e===`activity`&&await Promise.all([r.fetchMessages(),r.fetchPairs(),r.fetchTasks(),r.fetchActivityEvents()]),e===`work`&&await Promise.all([r.fetchMessages(),r.fetchTasks()]),e===`pairs`&&await r.fetchPairs(),e===`channels`&&await Promise.all([r.fetchChannels(),r.fetchIntegrations()]),e===`connectors`&&await r.fetchConnectors(),e===`integrations`&&await r.fetchIntegrations(),e===`tasks`&&await Promise.all([r.fetchTasks(),r.fetchDeliverableTasks()]),e===`backlog`&&await r.fetchBacklog(),e===`dependencies`&&await r.fetchTaskGraph(),e===`teams`&&await Promise.all([r.fetchTeams(),r.fetchTeamOutcomeAggregates(),r.refreshIssueRefs()]),e===`automation`&&await Promise.all([r.fetchAutomations(),r.fetchAutomationRuns()]),e===`maintenance`&&await Promise.all([r.fetchMaintenanceJobs(),r.fetchMaintenanceRunning()]),e===`workspaces`&&await Promise.all([r.fetchWorkspaces(),r.fetchOrchestrators(),r.fetchAgents()]),(e===`files`||e===`orchestrators`)&&await r.fetchOrchestrators(),e===`analytics`&&await r.fetchAnalytics(),e===`fleet`&&await Promise.all([r.fetchHosts(),r.fetchOrchestrators(),Oi(t,n)])},startClock(){j.getState().start()},stopClock(){j.getState().stop()},startAutoRefresh(){Xr(Ri(n,t))},stopAutoRefresh(){Ri(n,t).clearTimer()},noteUserActivity(){Qr(Ri(n,t),Date.now())},handleVisibilityChange(){Zr(Ri(n,t))},async apiCall(e,t,n){return S(e,t,n)},async openFilesAt(e){let r=n();t({fileOrchestratorId:e.orchestratorId||vn(r.orchestrators,e.selectedPath||e.path)?.id||r.orchestrators.find(e=>e.status===`online`)?.id||``,filePath:e.path,fileSelectedPath:e.selectedPath||``,fileSelectedLine:e.line||0,fileOverlayOpen:e.overlay===!0}),e.overlay||await n().switchView(`files`)},async openFilesForAgent(e,t=!1){let r=typeof e.meta?.cwd==`string`?e.meta.cwd:``;if(!r){n().showNotification(`Agent has no cwd`);return}let i=bn(n().orchestrators,e);if(!i){n().showNotification(`No online orchestrator covers that cwd`);return}await n().openFilesAt({orchestratorId:i.id,path:r,overlay:t})},closeFileOverlay(){t({fileOverlayOpen:!1})},async refresh(){let e=n();Un(t),Kn(t),wr(t),await Promise.all([e.fetchStats(),e.fetchHealth(),e.fetchAgents(),e.fetchUsers(),e.fetchOrchestrators(),e.fetchPairs(),e.fetchMessages(),e.fetchTasks(),e.fetchDeliverableTasks({unfiltered:!0}),e.fetchChannels(),e.fetchConnectors(),e.fetchIntegrations(),e.fetchAutomations(),e.fetchAutomationRuns(),e.fetchManagedPolicies(),e.fetchAgentProfiles(),e.fetchToolGroupCatalog(),e.fetchWorkspaces(),e.fetchInboxState(),e.fetchActivityEvents(),e.fetchChatHistoryImports(),e.fetchProviderCatalog(),e.fetchOpenDecisions(),e.fetchWorkflowLiveRuns(),e.fetchMaintenanceJobs(),e.fetchMaintenanceRunning()])},async refreshLiveData(e){if(!n().authNeeded){if(n()._refreshInFlight){e?.gap&&await Promise.all(ai(n()));return}t({_refreshInFlight:!0});try{try{let e=gt(n().stats,await S(`GET`,`/stats`));n().connectionError?t({stats:e,connectionError:!1}):e!==n().stats&&t({stats:e})}catch(e){if(e.status===401)return;n().connectionError||t({connectionError:!0});return}let r=n(),i=[r.fetchHealth(),r.fetchAgents(),r.fetchPairs(),r.fetchMessages(),r.fetchTasks(),r.fetchManagedPolicies(),r.fetchOpenDecisions()],a=r.view;e?.gap&&i.push(...ai(r)),ii.includes(a)&&i.push(r.fetchDeliverableTasks({unfiltered:!0})),a===`activity`&&i.push(r.fetchActivityEvents()),a===`automation`&&i.push(r.fetchAutomations(),r.fetchAutomationRuns()),a===`channels`&&i.push(r.fetchChannels(),r.fetchIntegrations()),a===`connectors`&&i.push(r.fetchConnectors()),a===`integrations`&&i.push(r.fetchIntegrations()),a===`maintenance`&&i.push(r.fetchMaintenanceJobs(),r.fetchMaintenanceRunning()),(a===`profiles`||a===`projects`)&&i.push(r.fetchAgentProfiles()),a===`workspaces`&&i.push(r.fetchWorkspaces()),a===`analytics`&&i.push(r.fetchAnalytics()),a===`teams`&&i.push(r.fetchTeams(),r.fetchTeamOutcomeAggregates(),r.refreshIssueRefs()),r.agentDetailOpen&&r.agentDetailId&&i.push(r.fetchAgentIssueActivity(r.agentDetailId)),a===`tasks`&&i.push(r.fetchDeliverableTasks()),a===`backlog`&&i.push(r.fetchBacklog()),a===`dependencies`&&i.push(r.fetchTaskGraph()),a===`fleet`&&i.push(r.fetchHosts(),Oi(t,n)),(a===`orchestrators`||a===`fleet`)&&i.push(r.fetchOrchestrators()),a===`secrets`&&i.push(wr(t)),r.taskDetailOpen&&r.taskDetailId&&i.push(r.fetchTaskDetail(r.taskDetailId)),await Promise.all(i)}finally{t({_refreshInFlight:!1})}}},async fetchStats(){try{let e=gt(n().stats,await S(`GET`,`/stats`));e!==n().stats&&t({stats:e})}catch{}},connectSSE(){n().disconnectSSE(),t({_es:ve(n().authToken,{connected:(e={})=>{t(n().connectionError?{connected:!0,connectionError:!1}:{connected:!0}),ri(n,!!e.replay?.available)},disconnected:()=>t({connected:!1}),message:(e,r)=>{if(e!==`connected`&&(si(n(),e,r),!ji(t,n,e,r))){if(e===`replay.gap`){ri(n,!1);return}if(e===`message.new`){let e=JSON.parse(r);if(e.kind===`session`&&!o(e.from)){let t=e.payload?.session;t?.type===`response`&&t?.origin===`provider`&&A.onResponse(h(e),e.body)}let i=n();i.messages.some(t=>t.id===e.id)||t({messages:z([...i.messages,e],500,e=>e.id)});let a=h(e),s=n().agentChatByAgent,c=new Set([e.from,e.to,e.resolvedToAgent].filter(e=>!!e));for(let t of c)s[t]&&n().appendChatTail(t,[e]);m(e)&&g(e)&&vt(a,i)&&n().markInboxThreadReadTo(a,e.id);return}if(e===`message.queued`||e===`message.expired`||e===`message.delivery_updated`||e===`message.reaction_updated`||e===`message.finalized`){let e=JSON.parse(r);t({messages:z(D(n().messages,e),500,e=>e.id)}),n().applyChatMessageUpdate(e);return}if(e===`notification.created`){n().handleRelayNotification(JSON.parse(r));return}if(e===`plan.created`||e===`plan.changed`){let e=JSON.parse(r),t=e.plan??e.data?.plan;if(t){let e=new Map(n().plansById[t.id]?.external?.flatMap(e=>e.title?[[e.taskId,e.title]]:[]));n().upsertPlan(t.external?{...t,external:t.external.map(t=>e.has(t.taskId)?{...t,title:e.get(t.taskId)}:t)}:t),t.external?.length&&n().fetchPlan({threadId:t.threadId,...t.channel?{channel:t.channel}:{}})}return}if(e===`plan.deleted`){let e=JSON.parse(r),t=e.plan??e.data?.plan,i=t?.id??e.planId??e.id??e.data?.planId??e.data?.id;(t||i)&&n().removePlan(t??i);return}if(e===`decision.changed`){n().fetchOpenDecisions(),n().view===`secrets`&&wr(t);return}if(e===`team.dissolved`){let e=JSON.parse(r);e.teamId&&n().markTeamDissolved({teamId:e.teamId,outcomeStatus:e.outcomeStatus,reason:e.reason}),Promise.all([n().fetchTeams(),n().fetchTeamOutcomeAggregates()]);return}if(e===`activity.created`){let e=JSON.parse(r);t({activityEvents:z(D(n().activityEvents,e),200,e=>ue(e.createdAt??e.ts))}),e.issueRefId&&n().fetchIssueRef(e.issueRefId),e.agentId&&n().agentDetailOpen&&n().agentDetailId===e.agentId&&n().fetchAgentIssueActivity(e.agentId);return}if(e===`workspace.status`){let e=JSON.parse(r),i=n().workspaces;t({workspaces:D(i,at(i.find(t=>t.id===e.id),e))});return}if(e===`agent.status`){let e=JSON.parse(r),i=n(),a=i.agentsById[e.id],o=et(a,e);if(t({agents:D(i.agents,o),agentsById:{...i.agentsById,[o.id]:o}}),i.livenessMismatches[o.id]&&o.status!==`offline`){let e={...i.livenessMismatches};delete e[o.id],t({livenessMismatches:e})}let s=i.commandStalls[o.id];if(s){let e=ut(o);if(e?.status&&lt.has(e.status)&&(e.timestamp??0)>s.ts){let e={...i.commandStalls};delete e[o.id],t({commandStalls:e})}}let c=ut(o),l=c?.status??ct(a,o);if(l){let e=c?.timestamp??Date.now(),n=c?.id||`agent-status:${o.id}:${l}:${e}`;t({chatStatusEvents:st(i.chatStatusEvents,o.id,l,e,n)})}return}if(e===`dashboard.presence`){let e=JSON.parse(r);e.agentId&&n().applyPresence(e.agentId,e.viewers??[]);return}if(e===`liveness.mismatch`){let e=JSON.parse(r);e.agentId&&t({livenessMismatches:{...n().livenessMismatches,[e.agentId]:{agentId:e.agentId,detail:e.detail??`Process reported running but relay marked it offline`,ts:Date.now(),policyName:e.policyName,spawnRequestId:e.spawnRequestId}}});return}if(e===`command.stalled`){let e=JSON.parse(r);if(e.agentId){let r=Date.now(),i=e.kind??`compact`,a=i===`clear`?`clear-stalled`:`compaction-stalled`;t({commandStalls:{...n().commandStalls,[e.agentId]:{agentId:e.agentId,kind:i,detail:e.detail??`A context command was requested but never started — the session may need manual intervention.`,ts:r,commandId:e.commandId}},chatStatusEvents:st(n().chatStatusEvents,e.agentId,a,r,`command-stalled:${e.agentId}:${e.commandId??r}`)})}return}if(!Ot(n(),e,r)){if(e===`provider-quota.updated`){t({quotaSeq:n().quotaSeq+1});return}if(e===`message.claimed`){let e=JSON.parse(r);t({messages:n().messages.map(t=>t.id===e.messageId?{...t,claimedBy:e.claimedBy,claimExpiresAt:e.claimExpiresAt}:t)});return}if(e===`message.claim_released`){let e=JSON.parse(r);t({messages:n().messages.map(t=>t.id===e.messageId?{...t,claimedBy:void 0,claimedAt:void 0,claimExpiresAt:void 0}:t)});return}if(e===`message.deleted`){let e=JSON.parse(r);t({messages:n().messages.filter(t=>t.id!==e.messageId)});return}if(e===`orchestrator.status`){let e=it(n().orchestrators,JSON.parse(r));e?t({orchestrators:e}):n().fetchOrchestrators();return}if(e===`orchestrator.removed`){let e=JSON.parse(r);t({orchestrators:n().orchestrators.filter(t=>t.id!==e.id)});return}if(e===`policy.state.changed`||e===`config.changed`){n().fetchManagedPolicies(),e===`config.changed`&&Fi(r)===`provider-enablement`&&n().fetchProviderCatalog(),e===`config.changed`&&Fi(r)===`provider-quota-config`&&t({quotaSeq:n().quotaSeq+1});return}if(an(e,r),un(e,r),e===`command.failed`){let e=JSON.parse(r).command;if(e?.type===`agent.spawn`){let r=Ni(e),i=typeof e.updatedAt==`number`?e.updatedAt:typeof e.createdAt==`number`?e.createdAt:Date.now(),o=a(e.params)?e.params:{},c=s(o.spawnRequestId)??e.correlationId,l=s(o.provider),u=`command:${e.id??c??i}:agent-spawn-failed`,d={id:Pi(e),clientId:u,kind:`state`,title:`agent.spawn · failed`,body:r,meta:[l,c].filter(Boolean).join(` · `)||e.target,icon:`ti-alert-triangle`,view:`agents`,createdAt:i,ts:i,metadata:{commandId:e.id,commandType:e.type,status:e.status??`failed`,target:e.target,provider:l,spawnRequestId:c}};t({activityEvents:z(Ii(n().activityEvents,d),200,e=>ue(e.createdAt??e.ts))}),n().showNotification(`Spawn failed: ${r}`)}return}if(e===`command.dispatched`||e===`command.succeeded`){let i=JSON.parse(r).command;if(i){let r=ft(i,e);if(r){let e=typeof i.updatedAt==`number`?i.updatedAt:typeof i.createdAt==`number`?i.createdAt:Date.now();t({chatStatusEvents:st(n().chatStatusEvents,dt(i),r,e,i.id?`command:${i.id}:${r}`:void 0)})}}return}if(e.startsWith(`task.`)){let e=JSON.parse(r);if(e.kind===`deliverable`){let r=n(),i=D(r.deliverableTasks,e),a=!r.deliverableStatusFilter||(r.deliverableStatusFilter===`owner-gone`?e.staleOwnerGone===!0:e.status===r.deliverableStatusFilter),o=e.deliverableStage??`none`,s=!r.deliverableStageFilter||o===r.deliverableStageFilter,c=!r.deliverableProjectFilter||e.projectId===r.deliverableProjectFilter;t({deliverableTasks:z(a&&s&&c?i:i.filter(t=>t.id!==e.id),200,e=>e.id)}),r.taskDetailById[e.id]&&t({taskDetailById:{...r.taskDetailById,[e.id]:e}})}else t({tasks:z(D(n().tasks,e),100,e=>e.id)})}}}}},`delta`)})},disconnectSSE(){let e=n()._es;e&&(e.close(),t({_es:null}))},openCommandPalette(){t({commandQuery:``,commandPaletteOpen:!0})},closeCommandPalette(){t({commandPaletteOpen:!1,commandQuery:``})},async runCommand(e){let{action:r,payload:i}=e;if(n().closeCommandPalette(),r===`openView`)await n().switchView(i.view);else if(r===`agentPreset`)t({agentPresetFilter:i.preset||``}),n().setShowOffline(!0),await n().switchView(`agents`);else if(r===`copy`)try{await navigator.clipboard?.writeText(i.value||``)}catch{}else if(r===`messageAgent`){let e=n().agentsById[i.agentId];e&&n().openComposeToAgent(e)}else r===`pairAgent`?n().openPairInvite(i.agentId):r===`filterTag`?(t({agentTagFilter:i.tag||``,tagFilter:i.tag||``}),await n().switchView(`agents`)):r===`exportActivity`&&n().exportActivity(i.format||`markdown`)},async saveTokenAndRefresh(){let e=n().authToken;me(e);try{await S(`GET`,`/stats`)}catch(e){if(e.status===401){t({authNeeded:!0});return}}e&&hi(t),await vi(n,t)},destroy(){he(null),n()._pollDetachListeners?.(),t({_pollDetachListeners:null}),n().disconnectSSE(),n().stopAutoRefresh(),n().stopClock()}}),Vi=(e,t)=>({users:[],usersById:{},presenceByAgent:{},async fetchUsers(){try{let n=await S(`GET`,`/users`),r=O(t().users,n);if(r===t().users)return;let i={};for(let e of r)i[e.id]=e;e({users:r,usersById:i})}catch{}},applyPresence(n,r){let i=t().presenceByAgent;if(!t().agentsById[n]||r.length===0){if(!(n in i))return;let t={...i};delete t[n],e({presenceByAgent:t});return}e({presenceByAgent:{...i,[n]:r}})},async announcePresence(e,n,r){try{let i=await S(`POST`,`/agents/`+encodeURIComponent(e)+`/presence`,{typing:n,...r?{leaving:!0}:{}});t().applyPresence(e,i.viewers??[])}catch{}}}),Hi=800,W=new Map,Ui=!1,Wi=6e4;function Gi(e,t){let n={keepalive:t.length<Wi};t?S(`PUT`,`/inbox/drafts`,{operatorId:oe,peerId:e,body:t},n).catch(()=>{}):S(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(oe)+`&peerId=`+encodeURIComponent(e),void 0,n).catch(()=>{})}function Ki(){Ui||typeof document>`u`||typeof window>`u`||(Ui=!0,document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&Ji()}),window.addEventListener(`pagehide`,()=>Ji()))}function qi(e,t){for(let[n,r]of Array.from(W))e(n)&&(clearTimeout(r.timer),W.delete(n),t&&Gi(n,r.value))}function Ji(e){qi(t=>e===void 0||t===e,!0)}function Yi(e){qi(t=>e===void 0||t===e,!1)}function Xi(e,t){Ki(),qi(t=>t!==e,!0);let n=W.get(e);n&&clearTimeout(n.timer);let r=setTimeout(()=>{let t=W.get(e);W.delete(e),t&&Gi(e,t.value)},Hi);W.set(e,{value:t,timer:r})}var G={kind:`follow`};function Zi(e){if(!e||(e.mode?e.mode===`follow`:e.stick))return G;let{topKey:t,anchorMessageId:n,anchorEndMessageId:r,offset:i}=e;return t===null&&n===void 0?G:{kind:`anchored`,anchor:{topKey:t,anchorMessageId:n,anchorEndMessageId:r,offset:i}}}function Qi(e,t){if(t.type===`jump-to`)return{kind:`anchored`,anchor:t.anchor};if(e.kind===`follow`)return(t.type===`gesture-up`||t.type===`selection-held`)&&t.fold?{kind:`anchored`,anchor:t.fold}:e;switch(t.type){case`selection-held`:return e;case`reached-end`:return t.tailDetached?e:G;case`own-prompt-sent`:case`latest-click`:case`anchor-unresolvable`:return G;case`scrolled`:case`gesture-up`:return t.fold&&!oa(e.anchor,t.fold)?{kind:`anchored`,anchor:t.fold}:e}}function $i(e){return e.kind===`follow`?{mode:`follow`,stick:!0,topKey:null,offset:0}:{mode:`anchored`,stick:!1,...e.anchor}}function ea(e,{settled:t,resolves:n,around:r}){if(e.kind===`follow`||n)return{kind:`open`,mode:e};if(!t||r===`requested`)return{kind:`wait`};let i=e.anchor.anchorMessageId;return r===`idle`&&i!==void 0?{kind:`fetch-around`,messageId:i}:{kind:`open`,mode:Qi(e,{type:`anchor-unresolvable`})}}var ta=1,na=()=>({commands:0});function ra(e,t,n,r){return aa(t,n)||aa(t,r)?`reset`:e.commands<8?`command`:`retire`}function ia(e,t){return t?`reset`:e.commands<8?`command`:`hold`}function aa(e,t){return Math.abs(e-t)<=ta}function oa(e,t){return e.topKey===t.topKey&&e.anchorMessageId===t.anchorMessageId&&e.anchorEndMessageId===t.anchorEndMessageId&&e.offset===t.offset}var sa={messages:[],oldestLoadedId:null,hasMore:!0,loading:!1,loadedInitial:!1,gapBeforeId:null,tail:`attached`},ca=new Map;function la(e,t){t?ca.set(e,t):ca.delete(e)}var ua=new Map;function da(e,t){t?ua.set(e,t):ua.delete(e)}function fa(e){let t=ua.get(e);t?t():jn(e,$i(G))}function pa(e){let t=ca.get(e)?.();if(t)return t;let n=kn(e);if(!n)return null;let r=Zi(n);return r.kind===`follow`?r:{kind:`anchored`,anchorId:r.anchor.anchorMessageId??-1/0}}var ma=new Map,ha=new Map;function ga(e){return ma.get(e)??0}function _a(e){return ha.get(e)??0}function va(e){for(let t of e)if(t.id>=0)return t.id;return null}function K(e){for(let t=e.length-1;t>=0;t--){let n=e[t].id;if(n>=0)return n}return null}function ya(e,t,n,r){let i=0,a=0;for(let t of e)t.id<0||(i++,r!==null&&t.id<r&&a++);if(i<=t)return{messages:e,shedOldest:!1,shedNewest:!1};let o=n===`newest`?i-t:0;r!==null&&(o=Math.min(Math.max(o,a+100+1-t),a-100)),o=Math.min(Math.max(o,0),i-t);let s=[],c=0;for(let n of e)(n.id<0||c++>=o&&c<=o+t)&&s.push(n);return{messages:s,shedOldest:o>0,shedNewest:o+t<i}}function q(e,t,n){let r=e.agentChatByAgent[t]??sa,i=n(r);if(!i)return{};let{messages:a,keep:o=`newest`,live:s=!1,tailShed:c=!1,...l}=i;c&&ma.set(t,ga(t)+1);let u={...r,...l};if(a){let n=t===e.selectedInboxThread,i=ya(a,s&&!n?500:le,o,n?wa(t,r):null);u.messages=i.messages,u.oldestLoadedId=va(i.messages),i.shedNewest&&(u.tail=`reader-detached`);let c=K(r.messages),l=c!==null&&(K(i.messages)??-1/0)<c;(i.shedNewest||u.tail!==`attached`&&l)&&ma.set(t,ga(t)+1),i.shedOldest&&ha.set(t,_a(t)+1),i.shedOldest&&(u.hasMore=!0);let d=u.gapBeforeId,f=K(i.messages),p=d!==null&&i.messages.some(e=>e.id>=0&&e.id<d);d!==null&&(u.tail!==`attached`&&f!==null&&d>f||i.shedOldest&&!p)&&(u.gapBeforeId=null)}return{agentChatByAgent:Qe({...e.agentChatByAgent,[t]:u},[t,e.selectedAgent,e.selectedInboxThread])}}function ba(e,t){let n=e.selectedInboxThread,r=n&&n!==t?e.agentChatByAgent[n]:void 0;return!r||r.messages.length<=500?{selectedInboxThread:t}:{selectedInboxThread:t,...q({...e,selectedInboxThread:t},n,e=>({messages:e.messages,live:!0}))}}function xa(e){return!!e&&(e.tail!==`attached`||!!e.tailPaging)}function Sa(e,t){return e.agentChatByAgent[t]?.tail===`reader-detached`&&pa(t)?.kind!==`follow`}function Ca(e,t){let n=e.agentChatByAgent[t];return n&&t===e.selectedInboxThread?wa(t,n):null}function wa(e,t){let n=pa(e);return n?n.kind===`anchored`?n.anchorId:K(t.messages):null}var Ta=new Set,Ea=new Map,Da=new Set;function Oa(e){return Da.has(e)}function ka(e){Da.add(e)}function Aa(e){Da.delete(e)}function ja(e){return Ta.has(e)}function Ma(e){Ta.add(e)}function Na(e){Ta.delete(e)}function Pa(e,t,n=!1){let r=Ea.get(e);Ea.set(e,{from:Math.min(r?.from??t,t),paging:n||!!r?.paging})}function Fa(e){let t=Ea.get(e);return Ea.delete(e),t}var Ia=1e3,La=3e4,Ra=new Map;function za(e){return Ra.has(e)}function Ba(e,t,n=!1){let r=Ra.get(e);if(n&&r?.timer&&r.delay<=1e3)return;r?.timer&&clearTimeout(r.timer);let i=n||!r?Ia:Math.min(r.delay*2,La),a={delay:i,timer:null};a.timer=setTimeout(()=>{a.timer=null,t()},i),Ra.set(e,a)}function Va(e){let t=Ra.get(e);t?.timer&&clearTimeout(t.timer),Ra.delete(e)}var J=300,Ha=8e3;function Ua(e,t){let n=new URLSearchParams;for(let[e,r]of Object.entries(t))n.set(e,String(r));return`/agents/${encodeURIComponent(e)}/chat?${n.toString()}`}function Y(e,t){return t.filter(t=>_(e,t)&&!ce(t)).sort((e,t)=>e.id-t.id)}function X(e,t){return O(e,[...e,...t].sort((e,t)=>e.id-t.id))}var Wa=10;async function Ga(e,t,n){let r=[],i=t,a=!1;for(let t=0;t<Wa;t++){let t=await S(`GET`,Ua(e,{before:i,limit:J})),o=Y(e,t);if(o.length===0){a=!0;break}r.push(...o);let s=o[0].id;if(n.has(s)||t.length<J){a=!0;break}i=s}return{messages:r,resolved:a,frontier:a?null:i}}function Ka(e,t){if(!t.some(e=>o(e.from)))return e;let n=new Set(t.map(e=>e.id));return e.filter(e=>{if(e.id>=0||!o(e.from))return!0;let t=qa.get(e.id);return t!==void 0&&!n.has(t)?!0:(qa.delete(e.id),!1)})}var qa=new Map;function Ja(e,t,n=!1){if(t!==e().selectedInboxThread)return Va(t);Ba(t,()=>{let n=e(),r=n.agentChatByAgent[t];if(!r||t!==n.selectedInboxThread)return Va(t);!r.loadedInitial||K(r.messages)===null?e().loadAgentChat(t):r.tail===`error-detached`?e().loadNewer(t):Va(t)},n)}function Ya(e,t,n){let r=e.gapBeforeId;if(r===null)return null;let i=e.messages.reduce((e,t)=>t.id>=0&&t.id<r&&t.id>e?t.id:e,-1/0);return t>i&&n<r?`island`:t<r&&n>=r?{gapBeforeId:t>i?t:null}:null}function Xa(e,t,n,r,i){let a=!1;e(e=>q(e,n,e=>{let t=K(e.messages),o=!i&&ja(n),s=e.tail!==`attached`,c=e.gapBeforeId??va(e.messages),l=c!==null&&r.some(e=>e.id<c)?new Set(e.messages.map(e=>e.id)):null,u=l?r.filter(e=>e.id>=c||l.has(e.id)):r,d=t!==null&&(s||o)?u.filter(e=>e.id<=t):u,f=d.length<u.length;return f&&o&&!s&&Pa(n,1/0),a=f&&e.tail===`error-detached`,d.length===0?{tailShed:f}:{messages:X(Ka(e.messages,d),d),live:!0,tailShed:f}})),a&&Ja(t,n,!0)}var Za=(e,t)=>({messages:[],agentChatByAgent:{},threadMessages:[],threadOpen:!1,chatHistoryImports:[],selectedInboxThread:``,replyTo:null,composeOpen:!1,chatAgentSearch:``,chatAgentProviderFilter:``,chatAgentStatusFilter:``,chatAgentTagFilter:``,chatAgentCapFilter:``,chatAgentHostFilter:``,chatAgentSort:`status`,chatAgentSortDir:`asc`,chatAgentGroupBy:``,chatAgentFiltersCollapsed:!0,chatCollapsedChildren:[],chatExpandedItems:[],feedObserveAll:!1,coordinatorFollows:[],coordinatorMutes:[],chatStatusEvents:{},chatStickToBottom:!0,chatHasNewItems:!1,inboxReadCursors:{},inboxArchivedThreads:{},inboxDrafts:{},chatSending:!1,inboxSearch:``,inboxSort:`attention`,inboxSortDir:`desc`,inboxShowArchived:!1,channelFilter:``,compose:{...b},inboxCompose:{...de},async fetchMessages(){try{let n=t(),r=`/messages?limit=100`;n.view===`messages`&&n.selectedAgent&&(r+=`&for=`+encodeURIComponent(n.selectedAgent)),n.view===`messages`&&n.channelFilter&&(r+=`&channel=`+encodeURIComponent(n.channelFilter));let i=await S(`GET`,r),a=mt(t().messages,i);a!==t().messages&&e({messages:a});let o=t(),s=o.selectedInboxThread;if(vt(s,o)){let e=0;for(let t of a)t.id>e&&h(t)===s&&m(t)&&g(t)&&(e=t.id);e&&t().markInboxThreadReadTo(s,e)}}catch{}},async loadAgentChat(n){if(!n)return;Xe(n);let r=t().agentChatByAgent[n];if(Oa(n))return Pa(n,1/0);ka(n),r?.loadedInitial&&r.messages.length>0||e(e=>q(e,n,()=>({loading:!0})));try{let r=ga(n),i=_a(n),a=await S(`GET`,Ua(n,{limit:J})),o=Y(n,a),s=t().agentChatByAgent[n],c=s?.loadedInitial&&_a(n)!==i?s.oldestLoadedId:null,l=c===null?o:o.filter(e=>e.id>=c),u=t().agentChatByAgent[n]??sa,d=u.loadedInitial?K(u.messages):null,f=d!==null&&a.length===J&&l.length>0&&l[0].id>d?l[0].id:null,p=l.at(-1)?.id??-1/0,m=!1;e(e=>q(e,n,e=>{let t=e.loadedInitial&&l.length?Ya(e,l[0].id,p):null,i=t===`island`?[]:l,o=e.loadedInitial?e.messages:e.messages.filter(e=>e.id<0||!l.length&&e.id>p);return m=!e.loadedInitial&&l.length>0&&e.messages.some(e=>e.id>p),{messages:X(Ka(o,i),i),tailShed:m,hasMore:e.loadedInitial?e.hasMore:a.length===J,loading:!1,loadedInitial:!0,gapBeforeId:e.loadedInitial?f!==null&&e.gapBeforeId===null?f:t&&t!==`island`?t.gapBeforeId:e.gapBeforeId:null,tail:ga(n)===r?`attached`:e.tail}})),Aa(n);let h=t().agentChatByAgent[n]?.tail;h===`attached`?Va(n):h===`error-detached`&&t().loadNewer(n);let g=Fa(n),ee=l.at(-1)?.id??1/0;if((m||g&&(g.paging||!Sa(t(),n)))&&t().loadNewer(n,Math.min(g?.from??ee,ee)),f===null)return;let _=t().agentChatByAgent[n];if(_?.tail!==`attached`||_.gapBeforeId!==f){let r=Sa(t(),n);e(e=>q(e,n,e=>({messages:e.messages.filter(e=>e.id<f),gapBeforeId:e.gapBeforeId===f?null:e.gapBeforeId,tailShed:!0,...r?{}:{tail:`attached`}}))),r||t().loadNewer(n);return}try{let t=await Ga(n,f,new Set(u.messages.map(e=>e.id)));e(e=>q(e,n,e=>e.gapBeforeId===f?{messages:X(e.messages,t.messages),gapBeforeId:t.resolved?null:t.frontier}:null))}catch(e){console.warn(`[chat] gap backfill failed for ${n}, marking for retry on next reconnect: ${e.message}`)}}catch(r){Aa(n),e(e=>q(e,n,()=>({loading:!1}))),za(n)||t().showError(`Chat Load Failed`,r.message,r),Ja(t,n)}},async loadOlder(n){if(!n)return;let r=t().agentChatByAgent[n];if(!r?.loadedInitial){await t().loadAgentChat(n);return}if(!r.loading){if(r.gapBeforeId!==null){await t().gapFillAgentChat(n);return}if(!(!r.hasMore||r.oldestLoadedId===null)){e(e=>q(e,n,()=>({loading:!0})));try{let t=await S(`GET`,Ua(n,{before:r.oldestLoadedId,limit:J})),i=Y(n,t);e(e=>q(e,n,e=>e.oldestLoadedId===r.oldestLoadedId?{messages:O(e.messages,[...i,...e.messages].sort((e,t)=>e.id-t.id)),keep:`oldest`,hasMore:t.length===J,loading:!1,loadedInitial:!0}:{loading:!1}))}catch(r){e(e=>q(e,n,()=>({loading:!1}))),t().showError(`Chat Load Failed`,r.message,r)}}}},async loadChatAround(n,r){if(!n||!Number.isFinite(r))return;let i=t().agentChatByAgent[n];if(i?.loadedInitial&&!(i.oldestLoadedId!==null&&r>=i.oldestLoadedId)){e(e=>q(e,n,()=>({loading:!0})));try{let t=Y(n,await S(`GET`,Ua(n,{around:r,limit:J}),void 0,{timeoutMs:Ha})),i=t.length?t[t.length-1].id:null;e(e=>q(e,n,r=>{if(!(r.oldestLoadedId!==null&&i!==null&&i<r.oldestLoadedId-1)){let e=i===null?null:Ya(r,t[0].id,i);return e===`island`?{loading:!1}:{messages:X(r.messages,t),keep:`oldest`,...e,loading:!1}}let a=r.gapBeforeId;return a!==null&&(Ca(e,n)??-1/0)>=a?{loading:!1}:{messages:X(a===null?r.messages:r.messages.filter(e=>e.id<a),t),keep:`oldest`,gapBeforeId:r.oldestLoadedId,tail:a!==null&&r.tail===`attached`?`reader-detached`:r.tail,loading:!1}}))}catch(t){e(e=>q(e,n,()=>({loading:!1}))),console.warn(`[chat] around-anchor load failed for ${n}@${r}: ${t.message}`)}}},async gapFillAgentChat(n){if(!n)return;let r=t().agentChatByAgent[n];if(!r?.loadedInitial||r.messages.length===0){r?.loading&&Pa(n,1/0);return}let i=Sa(t(),n);i&&Pa(n,1/0);let a=i?null:t().loadNewer(n);try{let t=r.gapBeforeId;if(t!==null){let i=await Ga(n,t,new Set(r.messages.map(e=>e.id)));e(e=>q(e,n,e=>e.gapBeforeId===t?{messages:i.messages.length?X(e.messages,i.messages):e.messages,keep:`oldest`,gapBeforeId:i.resolved?null:i.frontier}:null))}}catch(e){console.warn(`[chat] gap backfill retry skipped for ${n}: ${e.message}`)}await a},async loadNewer(n,r){if(!n)return;let i=t().agentChatByAgent[n],a=K(i?.messages??[]);if(ja(n)){a!==null&&Pa(n,r??1/0,!0);return}if(!i?.loadedInitial||a===null)return;Ma(n),i.tail!==`attached`&&e(e=>q(e,n,()=>({tail:`attached`,tailPaging:!0})));let o=!1;try{let i=Math.min(r??a,a);for(;;){let r=i,a=await S(`GET`,Ua(n,{since:i,limit:J})),o=t().agentChatByAgent[n],s=K(o?.messages??[]);if(s===null||s<r&&o.tail!==`attached`)break;if(s<r){i=s;continue}if(a.length===0)break;let c=Y(n,a.filter(e=>e.id>r));if(c.length&&Xa(e,t,n,c,!0),t().agentChatByAgent[n]?.tail!==`attached`||(i=a[a.length-1].id,i<=r)||a.length<J)break}}catch(t){console.warn(`[chat] tail catch-up skipped for ${n}: ${t.message}`),o=!0,e(e=>e.agentChatByAgent[n]?q(e,n,e=>e.tail===`reader-detached`?null:{tail:`error-detached`,tailShed:!0}):{})}finally{Na(n),e(e=>e.agentChatByAgent[n]?.tailPaging?q(e,n,()=>({tailPaging:!1})):{})}let s=Fa(n),c=t().agentChatByAgent[n]?.tail;if(o){c===`error-detached`&&Ja(t,n);return}Va(n),s&&(s.paging||!Sa(t(),n))&&await t().loadNewer(n,s.from)},appendChatTail(n,r){if(!n||r.length===0)return;let i=Y(n,r);i.length&&Xa(e,t,n,i,!1)},async fetchChatHistoryImports(){try{let n=O(t().chatHistoryImports,await S(`GET`,`/chat/history-imports?limit=500`));n!==t().chatHistoryImports&&e({chatHistoryImports:n})}catch{}},async fetchInboxState(){try{let n=await S(`GET`,`/inbox/state?operatorId=`+encodeURIComponent(T(t().sessionUser))),r={},i={},a={};for(let e of n?.threads||[])e.readCursorMessageId&&(r[e.peerId]=e.readCursorMessageId),e.archivedAtMessageId&&(i[e.peerId]=e.archivedAtMessageId);for(let e of n?.drafts||[])e.body&&(a[e.peerId]=e.body);let o=t(),s={};Ie(o.inboxReadCursors,r)||(s.inboxReadCursors=r),Ie(o.inboxArchivedThreads,i)||(s.inboxArchivedThreads=i),Object.keys(o.inboxDrafts).length===0&&!Ie(o.inboxDrafts,a)&&(s.inboxDrafts=a),Object.keys(s).length&&e(s)}catch{}},openCompose(){e({composeOpen:!0,compose:{...b,from:T(t().sessionUser)}})},openComposeToAgent(n){e({replyTo:null,compose:{...b,from:T(t().sessionUser),to:n.id},composeOpen:!0})},async doSend(){let n=t();if(!n.compose.from||!n.compose.to||!n.compose.body){t().showError(`Validation`,`From, To, and Message are required.`);return}o(n.compose.from)&&n.agentsById[n.compose.to]&&fa(n.compose.to);try{let r={from:n.compose.from,to:n.compose.to,body:n.compose.body};n.compose.channel&&(r.channel=n.compose.channel),n.compose.subject&&(r.subject=n.compose.subject),n.replyTo&&(r.replyTo=n.replyTo.id),n.compose.claimable&&(r.claimable=!0,r.kind=`task`,r.payload={title:n.compose.subject||`Claimable task`}),await S(`POST`,`/messages`,r),e({composeOpen:!1,replyTo:null,compose:{...b,from:T(t().sessionUser)}}),await t().fetchMessages()}catch(e){t().showError(`Send Failed`,e.message,e)}},async doClaim(e){let n=t(),r=n.compose.from||n.selectedAgent;if(!r){t().showError(`Validation`,`Select an agent first.`);return}try{let n=await S(`POST`,`/messages/`+e+`/claim`,{agentId:r});n.ok||t().showError(`Claim Failed`,n.error||`unknown`),n.ok&&await Promise.all([t().fetchMessages(),t().fetchTasks()])}catch(e){t().showError(`Claim Failed`,e.message,e)}},async doDeliveryAction(e,n,r){try{await S(`POST`,`/messages/`+e+`/delivery/actions`,{action:n,reason:r,agentId:t().compose.from||t().selectedAgent||T(t().sessionUser)}),await t().fetchMessages()}catch(e){t().showError(`Delivery Update Failed`,e.message,e)}},async doDeleteMessage(n){try{await S(`DELETE`,`/messages/`+n),e({messages:t().messages.filter(e=>e.id!==n)})}catch(e){t().showError(`Delete Failed`,e.message,e)}},applyChatMessageUpdate(n){let r=Object.entries(t().agentChatByAgent).filter(([,e])=>e.messages.some(e=>e.id===n.id));r.length!==0&&e(e=>r.reduce((t,[r])=>({...t,...q({...e,...t},r,e=>({messages:e.messages.map(e=>e.id===n.id?n:e)}))}),{}))},async reactToMessage(n,r){try{let i=(n.reactions||[]).some(e=>e.actorId===T(t().sessionUser)&&e.emoji===r),a=await S(`POST`,`/messages/`+n.id+`/reactions`,{actorId:T(t().sessionUser),emoji:r,action:i?`remove`:`add`});e({messages:z(D(t().messages,a),500,e=>e.id)}),t().applyChatMessageUpdate(a)}catch(e){t().showError(`Reaction Failed`,e.message,e)}},startReply(n){let r=o(n.from)?n.to:n.from;e({replyTo:{id:n.id,from:n.from},compose:{...b,from:T(t().sessionUser),to:r,channel:n.channel||``},composeOpen:!0})},cancelReply(){e({replyTo:null})},async openThread(n){e({threadMessages:[],threadOpen:!0});try{e({threadMessages:await S(`GET`,`/messages/`+n+`/thread`)})}catch(e){t().showError(`Thread Load Failed`,e.message,e)}},openInboxThread(n,r=[]){e(e=>ba(e,n)),r.length&&t().markInboxThreadRead(n,r)},closeInboxThread(){e(e=>ba(e,``))},async sendChatMessage(n,r,i=[]){if(!n.trim()&&i.length===0||t().chatSending)return;let a=r.peer;e({chatSending:!0});let o=t().inboxDrafts[a];Yi(a);let s={...t().inboxDrafts};delete s[a],e({inboxDrafts:s}),fa(a);let c=t().agentChatByAgent[a];c&&c.tail!==`attached`&&t().loadNewer(a);let l=-Date.now(),u={id:l,from:T(t().sessionUser),to:a,kind:`chat`,body:n.trim()||`Attachment`,...r.lastMessage?.channel?{channel:r.lastMessage.channel}:{},payload:i.length?{attachments:i}:{},readBy:[T(t().sessionUser)],createdAt:Date.now()};e(e=>q(e,a,e=>({messages:[...e.messages,u]})));try{let o={from:T(t().sessionUser),to:a,body:n.trim()||`Attachment`};r.lastMessage?.channel&&(o.channel=r.lastMessage.channel),r.lastMessage?.id&&(o.replyTo=r.lastMessage.id),i.length&&(o.payload={attachments:i});let s=await S(`POST`,`/messages`,o);!s||t().agentChatByAgent[a]?.messages.some(e=>e.id===s.id)?e(e=>e.agentChatByAgent[a]?q(e,a,e=>({messages:e.messages.filter(e=>e.id!==l)})):{}):qa.set(l,s.id),S(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(T(t().sessionUser))+`&peerId=`+encodeURIComponent(a)).catch(()=>{}),Promise.all([t().fetchMessages(),t().loadAgentChat(a)])}catch(n){o!==void 0&&t().inboxDrafts[a]===void 0&&(e({inboxDrafts:{...t().inboxDrafts,[a]:o}}),Xi(a,o)),e(e=>e.agentChatByAgent[a]?q(e,a,e=>({messages:e.messages.filter(e=>e.id!==l)})):{}),t().showError(`Send Failed`,n.message,n)}e({chatSending:!1})},async sendPermissionDecision(e,n,r,i){try{await S(`POST`,`/agents/`+encodeURIComponent(e)+`/permission-decision`,{approvalId:n,decision:r,...i?{answers:i}:{}});let a=r===`approve`?`Approved`:r===`approve-session`?`Approved for session`:r===`abort`?`Aborted`:r===`answer`?`Answer sent for`:`Denied`;t().showNotification(`${a} ${r===`answer`?`Claude's question`:`permission request`}`),await t().fetchAgents()}catch(e){t().showError(`Permission Failed`,e.message,e)}},markInboxThreadReadTo(n,r){!n||r<=(t().inboxReadCursors[n]||0)||(e({inboxReadCursors:{...t().inboxReadCursors,[n]:r}}),S(`PATCH`,`/inbox/threads`,{operatorId:T(t().sessionUser),peerId:n,readCursorMessageId:r}).catch(()=>{}))},markInboxThreadRead(e,n){!e||!n.length||t().markInboxThreadReadTo(e,xt(n))},markInboxThreadUnread(n){let r={...t().inboxReadCursors};delete r[n],e({inboxReadCursors:r}),S(`PATCH`,`/inbox/threads`,{operatorId:T(t().sessionUser),peerId:n,readCursorMessageId:null}).catch(()=>{})},archiveInboxThread(n,r){e({inboxArchivedThreads:{...t().inboxArchivedThreads,[n]:r}}),t().selectedInboxThread===n&&t().closeInboxThread(),S(`PATCH`,`/inbox/threads`,{operatorId:T(t().sessionUser),peerId:n,archivedAtMessageId:r}).catch(()=>{})},unarchiveInboxThread(n){let r={...t().inboxArchivedThreads};delete r[n],e({inboxArchivedThreads:r}),S(`PATCH`,`/inbox/threads`,{operatorId:T(t().sessionUser),peerId:n,archivedAtMessageId:null}).catch(()=>{})},setReplyDraft(n,r){let i={...t().inboxDrafts};r?i[n]=r:delete i[n],e({inboxDrafts:i}),Xi(n,r)},async sendInboxReply(n,r){let i=(t().inboxDrafts[n]||``).trim();if(!i||t().chatSending){i||t().showError(`Validation`,`Reply body is required.`);return}Yi(n),fa(n),e({chatSending:!0});try{let a={from:T(t().sessionUser),to:n,body:i};r?.channel&&(a.channel=r.channel),r?.id&&(a.replyTo=r.id),await S(`POST`,`/messages`,a);let o={...t().inboxDrafts};delete o[n],e({inboxDrafts:o}),S(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(T(t().sessionUser))+`&peerId=`+encodeURIComponent(n)).catch(()=>{}),await t().fetchMessages()}catch(e){t().showError(`Reply Failed`,e.message,e),Xi(n,t().inboxDrafts[n]||``)}e({chatSending:!1})},toggleChatChildrenCollapsed(n){let r=t().chatCollapsedChildren;e({chatCollapsedChildren:r.includes(n)?r.filter(e=>e!==n):[...r,n]})},toggleChatItemExpanded(n){let r=t().chatExpandedItems;e({chatExpandedItems:r.includes(n)?r.filter(e=>e!==n):[...r,n]})},setChatItemsExpanded(n,r){let i=t().chatExpandedItems;if(r){let t=new Set(i);for(let e of n)t.add(e);e({chatExpandedItems:Array.from(t)})}else{let t=new Set(n);e({chatExpandedItems:i.filter(e=>!t.has(e))})}},setFeedObserveAll(t){e({feedObserveAll:t})},toggleCoordinatorFollow(n){let r=t().coordinatorFollows,i=t().coordinatorMutes;r.includes(n)?e({coordinatorFollows:r.filter(e=>e!==n)}):e({coordinatorFollows:[...r,n],coordinatorMutes:i.filter(e=>e!==n)})},toggleCoordinatorMute(n){let r=t().coordinatorMutes,i=t().coordinatorFollows;r.includes(n)?e({coordinatorMutes:r.filter(e=>e!==n)}):e({coordinatorMutes:[...r,n],coordinatorFollows:i.filter(e=>e!==n)})},async doSendInboxCompose(){let{inboxCompose:n}=t();if(!n.to)return;let r=n.toMode===`agent`?n.to:`${n.toMode}:${n.to}`;if(!n.body){t().showError(`Validation`,`Message is required.`);return}n.toMode===`agent`&&fa(r);try{let i={from:T(t().sessionUser),to:r,body:n.body};n.channel&&(i.channel=n.channel),n.subject&&(i.subject=n.subject),n.claimable&&(i.claimable=!0,i.kind=`task`,i.payload={title:n.subject||`Claimable task`}),await S(`POST`,`/messages`,i),e({inboxCompose:{...de,toMode:n.toMode,to:n.to}}),await t().fetchMessages()}catch(e){t().showError(`Send Failed`,e.message,e)}}});function Qa(e,t){return JSON.stringify([String(e),t||``])}function Z(e,t){return JSON.stringify([`team`,e,t||``])}function $a(e){return{threadId:String(e.threadId),...e.channel?{channel:e.channel}:{}}}function eo(e){return e.teamId?{teamId:e.teamId,...e.channel?{channel:e.channel}:{}}:null}function to(e){return`teamId`in e?Z(e.teamId,e.channel):Qa(e.threadId,e.channel)}var no=100;function ro(e){let t=new URLSearchParams({view:`list`,teamId:e.teamId,limit:String(no)});return e.channel&&t.set(`channel`,e.channel),`/plans?${t.toString()}`}function io(e){return{id:e.id,threadId:String(e.threadId),teamId:e.teamId,...e.channel?{channel:e.channel}:{},...e.title?{title:e.title}:{},...e.objective?{objective:e.objective}:{},version:e.version,nodeCount:e.nodes.length,edgeCount:e.edges.length,...e.completion?{completion:e.completion}:{},createdAt:e.createdAt,updatedAt:e.updatedAt}}function ao(e,t){return t.updatedAt-e.updatedAt||t.createdAt-e.createdAt||e.id.localeCompare(t.id)}function oo(e,t){if(!t.teamId)return e;let n={...t,teamId:t.teamId},r={...e};for(let[i,a]of Object.entries(e)){if(a.teamId!==t.teamId||a.channel&&a.channel!==t.channel)continue;let e=a.plans.filter(e=>e.id!==t.id);r[i]={...a,plans:t.archived?e:[...e,io(n)].sort(ao)}}return r}function so(e,t){return t&&e.some(e=>e.id===t)?t:e[0]?.id??null}function co(e,t){let n=e.planListsByTeam[t],r=e.planSelections[t];if(!n)return r?e.plansById[r]??null:e.plansByTeam[t]??null;let i=so(n.plans,r);return i?e.plansById[i]??null:e.plansByTeam[t]??null}function lo(e){let t=new URLSearchParams(`teamId`in e?{teamId:e.teamId}:{threadId:String(e.threadId)});return e.channel&&t.set(`channel`,e.channel),`/plans?${t.toString()}`}var uo=(e,t)=>{async function n(n){try{let r=await S(`GET`,`/plans/${encodeURIComponent(n)}`);return e({plansById:{...t().plansById,[r.id]:r}}),t().hydrateIssueRefsForPlan(r),!0}catch(e){return t().showError(`Plan Load Failed`,e.message,e),!1}}let r=new Set;async function i(){let{planListsByTeam:e,planSelections:i,plansById:a}=t(),o=[];for(let[t,s]of Object.entries(e)){let e=so(s.plans,i[t]),c=s.plans.find(t=>t.id===e);!c||a[c.id]?.version===c.version||r.has(c.id)||(r.add(c.id),o.push(n(c.id).finally(()=>r.delete(c.id))))}await Promise.all(o)}return{plansById:{},plansByThread:{},plansByTeam:{},planListsByTeam:{},planSelections:{},planLookups:{},planLoading:{},planCollapsed:null,sessionTasksCollapsed:!1,setPlanCollapsed(t){e({planCollapsed:t})},setSessionTasksCollapsed(t){e({sessionTasksCollapsed:t})},async fetchPlan(n){let r=`teamId`in n?{teamId:n.teamId,...n.channel?{channel:n.channel}:{}}:{threadId:String(n.threadId),...n.channel?{channel:n.channel}:{}},i=to(r);e({planLookups:{...t().planLookups,[i]:r},planLoading:{...t().planLoading,[i]:!0}});try{let n=await S(`GET`,lo(r)),a=$a(n),o=Qa(a.threadId,a.channel),s=eo(n),c=s?Z(s.teamId,s.channel):``,l=!(`teamId`in r),u=`teamId`in r;e({plansById:{...t().plansById,[n.id]:n},plansByThread:{...t().plansByThread,...l?{[i]:n}:{},[o]:n},plansByTeam:s?{...t().plansByTeam,...u?{[i]:n}:{},[c]:n}:t().plansByTeam,planLookups:{...t().planLookups,[i]:r,[o]:a,...s?{[c]:s}:{}},planLoading:{...t().planLoading,[i]:!1,[o]:!1,...s?{[c]:!1}:{}}}),t().hydrateIssueRefsForPlan(n)}catch(n){let a=typeof n.status==`number`?n.status:0;e({plansByThread:a===404&&!(`teamId`in r)?{...t().plansByThread,[i]:null}:t().plansByThread,plansByTeam:a===404&&`teamId`in r?{...t().plansByTeam,[i]:null}:t().plansByTeam,planLoading:{...t().planLoading,[i]:!1}}),a&&a!==404&&t().showError(`Plan Load Failed`,n.message,n)}},async fetchTeamPlanList(n){let r={teamId:n.teamId,...n.channel?{channel:n.channel}:{}},a=Z(r.teamId,r.channel);try{let n=await S(`GET`,ro(r));e({planListsByTeam:{...t().planListsByTeam,[a]:{...r,plans:n.plans}}}),await i()}catch(e){t().showError(`Plan List Failed`,e.message,e)}},async chooseTeamPlan(r,i){if(!t().plansById[i]&&!await n(i))return;let a=Z(r.teamId,r.channel);e({planSelections:{...t().planSelections,[a]:i}})},async refreshPlans(){let e=Object.values(t().planLookups),n=Object.values(t().planListsByTeam);await Promise.all([...e.map(e=>t().fetchPlan(e)),...n.map(({teamId:e,channel:n})=>t().fetchTeamPlanList({teamId:e,channel:n}))])},async setPlanArchived(e,n){try{let r=await S(`PATCH`,`/plans/${encodeURIComponent(e)}/archive`,{archived:n});t().upsertPlan(r)}catch(e){t().showError(n?`Plan Archive Failed`:`Plan Unarchive Failed`,e.message,e)}},upsertPlan(n){let r=$a(n),a=Qa(r.threadId,r.channel),o=eo(n),s=o?Z(o.teamId,o.channel):``;e({plansById:{...t().plansById,[n.id]:n},plansByThread:{...t().plansByThread,[a]:n},plansByTeam:o?{...t().plansByTeam,[s]:n}:t().plansByTeam,planListsByTeam:oo(t().planListsByTeam,n),planLookups:{...t().planLookups,[a]:r,...o?{[s]:o}:{}},planLoading:{...t().planLoading,[a]:!1,...o?{[s]:!1}:{}}}),t().hydrateIssueRefsForPlan(n),i()},removePlan(n){let r=typeof n==`string`?n:n.id,a={...t().plansById};delete a[r],e({plansById:a,plansByThread:Object.fromEntries(Object.entries(t().plansByThread).filter(([,e])=>e?.id!==r)),plansByTeam:Object.fromEntries(Object.entries(t().plansByTeam).filter(([,e])=>e?.id!==r)),planListsByTeam:Object.fromEntries(Object.entries(t().planListsByTeam).map(([e,t])=>[e,{...t,plans:t.plans.filter(e=>e.id!==r)}])),planLookups:Object.fromEntries(Object.entries(t().planLookups).filter(([e])=>t().plansByThread[e]?.id!==r&&t().plansByTeam[e]?.id!==r))}),i()}}},fo=(e,t)=>({teams:[],teamsLoading:!1,teamsError:null,teamOutcomeAggregates:null,teamOutcomeAggregatesLoading:!1,teamOutcomeAggregatesError:null,async fetchTeams(){e({teamsLoading:!0,teamsError:null});try{let n=await S(`GET`,`/teams`),r=O(t().teams,n.teams);return e({teams:r,teamsLoading:!1,teamsError:null}),r}catch(n){return e({teamsLoading:!1,teamsError:i(n)}),t().teams}},async fetchTeamOutcomeAggregates(){e({teamOutcomeAggregatesLoading:!0,teamOutcomeAggregatesError:null});try{let t=await S(`GET`,`/teams/outcomes`);return e({teamOutcomeAggregates:t,teamOutcomeAggregatesLoading:!1,teamOutcomeAggregatesError:null}),t}catch(n){return e({teamOutcomeAggregatesLoading:!1,teamOutcomeAggregatesError:i(n)}),t().teamOutcomeAggregates}},upsertTeam(n){let r=D(t().teams,n);r!==t().teams&&e({teams:r})},markTeamDissolved(n){let r=Date.now();e({teams:t().teams.map(e=>e.id===n.teamId?{...e,status:`dissolved`,updatedAt:r,dissolvedAt:e.dissolvedAt??r,zeroMembersSince:void 0,...n.outcomeStatus?{outcomeStatus:n.outcomeStatus}:{},...n.reason?{outcomeSummary:n.reason}:{}}:e)})},async dissolveTeam(e){try{let n=await S(`POST`,`/teams/${encodeURIComponent(e)}/dissolve`,{});t().upsertTeam(n),t().showNotification(`Team dissolved`),await Promise.all([t().fetchTeams(),t().fetchTeamOutcomeAggregates(),t().fetchActivityEvents()])}catch(e){t().showError(`Dissolve Failed`,i(e),e)}}});function po(e,t){return JSON.stringify([e,t])}function mo(e){return[...new Set(e.nodes.map(e=>e.refs?.issueId).filter(e=>!!e))]}function ho(e,t){let n=!1,r={...e};for(let i of t){let t=e[i.id];(!t||JSON.stringify(t)!==JSON.stringify(i))&&(r[i.id]=i,n=!0)}return n?r:e}var go=(e,t)=>({issueRefsById:{},issuesByEntity:{},issueActivityByAgent:{},issueLoading:{},issueErrors:{},async fetchAllIssueRefs(){try{let n=await S(`GET`,`/issue-refs?limit=500`);e({issueRefsById:ho(t().issueRefsById,n.issueRefs)})}catch{}},async fetchIssueRef(e){try{let n=await S(`GET`,`/issue-refs/${encodeURIComponent(e)}`);return t().upsertIssueRef(n.issueRef),n.issueRef}catch{return t().issueRefsById[e]??null}},async fetchIssuesForEntity(n,r){let a=po(n,r);e({issueLoading:{...t().issueLoading,[a]:!0},issueErrors:{...t().issueErrors,[a]:null}});try{let i=await S(`GET`,`/issue-associations/entities/${encodeURIComponent(n)}/${encodeURIComponent(r)}/issues`);return e({issuesByEntity:{...t().issuesByEntity,[a]:i.issues},issueRefsById:ho(t().issueRefsById,i.issues.map(e=>e.issueRef)),issueLoading:{...t().issueLoading,[a]:!1}}),i.issues}catch(n){return e({issueLoading:{...t().issueLoading,[a]:!1},issueErrors:{...t().issueErrors,[a]:i(n)}}),t().issuesByEntity[a]??[]}},async fetchAgentIssueActivity(n){let r=`agent:${n}`;e({issueLoading:{...t().issueLoading,[r]:!0},issueErrors:{...t().issueErrors,[r]:null}});try{let i=await S(`GET`,`/issue-activity/agents/${encodeURIComponent(n)}`);return t().agentsById[n]?(e({issueActivityByAgent:{...t().issueActivityByAgent,[n]:i.issues},issueRefsById:ho(t().issueRefsById,i.issues.map(e=>e.issueRef)),issueLoading:{...t().issueLoading,[r]:!1}}),i.issues):[]}catch(a){return e({issueLoading:{...t().issueLoading,[r]:!1},issueErrors:{...t().issueErrors,[r]:i(a)}}),t().issueActivityByAgent[n]??[]}},async hydrateIssueRefsForPlan(e){let n=mo(e).filter(e=>!t().issueRefsById[e]);await Promise.all(n.map(e=>t().fetchIssueRef(e)))},async refreshIssueRefs(){let e=Object.keys(t().issuesByEntity).map(e=>{try{let[n,r]=JSON.parse(e);return t().fetchIssuesForEntity(n,r)}catch{return Promise.resolve([])}});await Promise.all([...Object.keys(t().issueRefsById).length?[t().fetchAllIssueRefs()]:[],...e])},upsertIssueRef(n){let r=ho(t().issueRefsById,[n]);r!==t().issueRefsById&&e({issueRefsById:r})}}),_o={fromIssue:``,title:``,intent:``,doneWhen:``,onDeploy:``,issueRefs:``,dependsOn:``,dispatchComplexity:``,dispatchType:``,dispatchFootprint:``,dispatchCriticality:``},vo=(e,t)=>({pairs:[],tasks:[],taskEvents:[],taskEventCache:{},taskEventsOpen:!1,pairInviteOpen:!1,pairMessageOpen:!1,pairInvite:{...re},deliverableTasks:[],deliverableStatusFilter:``,deliverableStageFilter:``,deliverableProjectFilter:``,deliverableTagFilter:``,deliverablePriorityFilter:``,taskDetailById:{},taskMemoryById:{},taskHistoryById:{},taskDetailOpen:!1,taskDetailId:null,taskCreateOpen:!1,taskCreateForm:{..._o},taskDispatchResultById:{},taskDispatchLoadingId:null,pairMessage:{...ae},pairStatusFilter:`open`,taskStatusFilter:``,taskSourceFilter:``,async fetchPairs(){try{let n=t(),r;if(n.view===`activity`)r=await S(`GET`,`/pairs`);else if(n.pairStatusFilter===`open`){let[e,t]=await Promise.all([S(`GET`,`/pairs?status=active`),S(`GET`,`/pairs?status=pending`)]);r=[...e,...t]}else r=n.pairStatusFilter?await S(`GET`,`/pairs?status=`+encodeURIComponent(n.pairStatusFilter)):await S(`GET`,`/pairs`);let i=r.sort((e,t)=>new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime()),a=O(t().pairs,i);a!==t().pairs&&e({pairs:a})}catch{}},async fetchTasks(){try{let n=t(),r=new URLSearchParams({limit:`100`});n.taskStatusFilter&&r.set(`status`,n.taskStatusFilter),n.taskSourceFilter&&r.set(`source`,n.taskSourceFilter);let i=O(t().tasks,await S(`GET`,`/tasks?`+r.toString()));i!==t().tasks&&e({tasks:i})}catch{}},async fetchDeliverableTasks(n){try{let r=t(),i=new URLSearchParams({kind:`deliverable`,limit:`200`});n?.unfiltered||(r.deliverableStatusFilter===`owner-gone`?i.set(`staleOwnerGone`,`1`):r.deliverableStatusFilter&&i.set(`status`,r.deliverableStatusFilter),r.deliverableStageFilter&&i.set(`deliverableStage`,r.deliverableStageFilter),r.deliverableProjectFilter&&i.set(`projectId`,r.deliverableProjectFilter),r.deliverableTagFilter&&i.set(`tag`,r.deliverableTagFilter),r.deliverablePriorityFilter&&i.set(`priority`,r.deliverablePriorityFilter));let a=await S(`GET`,`/tasks?`+i.toString()),o=O(t().deliverableTasks,a);o!==t().deliverableTasks&&e({deliverableTasks:o})}catch{}},async fetchTaskDetail(n){try{let r=await S(`GET`,`/tasks/`+n+`/detail`);e({taskDetailById:{...t().taskDetailById,[n]:r}})}catch{}},async fetchTaskMemory(n){try{let r=await S(`GET`,`/tasks/`+n+`/memory`);e({taskMemoryById:{...t().taskMemoryById,[n]:r}})}catch{}},async fetchTaskHistory(n){try{let r=await S(`GET`,`/tasks/`+n+`/history`);e({taskHistoryById:{...t().taskHistoryById,[n]:r}})}catch{}},openTaskDetail(n){e({taskDetailOpen:!0,taskDetailId:n.id}),t().fetchTaskDetail(n.id),t().fetchTaskMemory(n.id),t().fetchTaskHistory(n.id)},openTaskDetailById(n){e({taskDetailOpen:!0,taskDetailId:n}),t().fetchTaskDetail(n),t().fetchTaskMemory(n),t().fetchTaskHistory(n)},closeTaskDetail(){e({taskDetailOpen:!1,taskDetailId:null})},async doClaimTask(e){let n=t(),r=n.compose.from||n.selectedAgent;if(!r){t().showError(`Validation`,`Select an agent first.`);return}try{let n=await S(`POST`,`/tasks/`+e+`/claim`,{agentId:r});n.ok?await Promise.all([t().fetchTasks(),t().fetchMessages()]):t().showError(`Claim Failed`,n.error||`unknown`)}catch(e){t().showError(`Claim Failed`,e.message,e)}},async doUpdateTaskStatus(n,r){if(!(!n||!r||r===n.status))try{let i={status:r},a=n.claimedBy||t().compose.from||t().selectedAgent;a&&(i.agentId=a);let o=await S(`PATCH`,`/tasks/`+n.id+`/status`,i),s=o.task||o;e({tasks:t().tasks.map(e=>e.id===n.id?s:e)})}catch(e){t().showError(`Status Update Failed`,e.message,e),await t().fetchTasks()}},async openTaskEvents(n){e({taskEvents:[],taskEventsOpen:!0});try{let r=await S(`GET`,`/tasks/`+n.id+`/events`);e({taskEvents:r,taskEventCache:{...t().taskEventCache,[n.id]:r}})}catch(e){t().showError(`Task Events Failed`,e.message,e)}},openTaskCreate(){e({taskCreateOpen:!0,taskCreateForm:{..._o}})},closeTaskCreate(){e({taskCreateOpen:!1})},setTaskCreateForm(n){e({taskCreateForm:{...t().taskCreateForm,...n}})},async doCreateTask(){let{taskCreateForm:n}=t(),r=n.title.trim(),i=n.fromIssue?.trim();if(!r&&!i){t().showError(`Validation`,`A title or GitHub issue is required.`);return}let a=n.intent.trim()||r,o={};n.dispatchComplexity&&(o.complexity=n.dispatchComplexity),n.dispatchType&&(o.type=n.dispatchType),n.dispatchFootprint&&(o.contextFootprint=n.dispatchFootprint),n.dispatchCriticality&&(o.criticality=n.dispatchCriticality);let s=n.issueRefs.split(`,`).map(e=>e.trim()).filter(Boolean),c=n.dependsOn.split(`,`).map(e=>Number(e.trim())).filter(e=>Number.isInteger(e)&&e>0),l=n.idempotencyKey||crypto.randomUUID();e({taskCreateForm:{...n,idempotencyKey:l}});try{await S(`POST`,`/tasks`,{...r?{title:r}:{},...!i||n.intent.trim()?{intent:i?n.intent.trim():a}:{},...i?{fromIssue:i,idempotencyKey:l}:{},...n.onDeploy?.trim()?{onDeploy:n.onDeploy.trim()}:{},...n.doneWhen.trim()?{doneWhen:n.doneWhen.trim()}:{},...s.length?{issueRefs:s}:{},...c.length?{dependsOn:c}:{},...Object.keys(o).length?{dispatch:o}:{}}),e({taskCreateOpen:!1,taskCreateForm:{..._o}}),await t().fetchDeliverableTasks()}catch(e){t().showError(`Create Task Failed`,e.message,e)}},async doEditTask(n,r){try{let i=await S(`PATCH`,`/tasks/`+n,r);e({taskDetailById:{...t().taskDetailById,[n]:i},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...i}:e)})}catch(e){t().showError(`Edit Task Failed`,e.message,e)}},async doSetTaskReviewHold(e,n,r){try{return await S(`PUT`,`/tasks/`+e+`/review-hold`,{held:n,...r?{expectedHeadSha:r}:{}}),await t().fetchTaskDetail(e),!0}catch(r){return t().showError(n?`Set Review Hold Failed`:`Clear Review Hold Failed`,r.message,r),await t().fetchTaskDetail(e),!1}},async doSetTaskParent(n,r){try{let i=await S(`POST`,`/tasks/`+n+`/parent`,{parentTaskId:r});e({taskDetailById:{...t().taskDetailById,[n]:i},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...i}:e)})}catch(e){t().showError(`Set Parent Failed`,e.message,e)}},async doClearTaskParent(n){try{let r=await S(`DELETE`,`/tasks/`+n+`/parent`);e({taskDetailById:{...t().taskDetailById,[n]:r},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...r}:e)})}catch(e){t().showError(`Clear Parent Failed`,e.message,e)}},async doAddTaskRelated(n,r){try{let i=await S(`POST`,`/tasks/`+n+`/related`,{relatedTaskId:r});e({taskDetailById:{...t().taskDetailById,[n]:i},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...i}:e)})}catch(e){t().showError(`Add Related Failed`,e.message,e)}},async doRemoveTaskRelated(n,r){try{let i=await S(`DELETE`,`/tasks/`+n+`/related`,{relatedTaskId:r});e({taskDetailById:{...t().taskDetailById,[n]:i},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...i}:e)})}catch(e){t().showError(`Remove Related Failed`,e.message,e)}},async doDispatchTask(n,r,i=!0){e({taskDispatchLoadingId:n});try{let a={};r&&Object.keys(r).length&&(a.pin=r),i||(a.createReview=!1);let o=await S(`POST`,`/tasks/`+n+`/dispatch`,a);e({taskDispatchResultById:{...t().taskDispatchResultById,[n]:o},taskDispatchLoadingId:null})}catch(n){e({taskDispatchLoadingId:null}),t().showError(`Dispatch Failed`,n.message,n)}},async doSpawnWithTask(e,n,r=!0){let i=t().spawnOrchId;try{let a={provider:n.provider,taskId:e};n.model&&(a.model=n.model),n.effort&&(a.effort=n.effort),i&&(a.orchestratorId=i),r||(a.workflow=!1);let o=(await S(`POST`,`/agents/spawn`,a))?.workflowRun;t().showNotification(o?o.existing?`T${e} already runs ${o.workflow} (${o.runId}); no worker spawned`:`Workflow ${o.workflow} started on T${e} (${o.runId}); its run spawns the builder`:`Worker spawning for T${e} (${n.provider})`)}catch(e){t().showError(`Spawn Failed`,e.message,e)}},openPairInvite(n){e({pairInvite:{...re,requesterId:n||t().selectedAgent||``},pairInviteOpen:!0})},closePairInvite(){e({pairInviteOpen:!1,pairInvite:{...re}})},async doCreatePair(){let n=t();if(!n.pairInvite.requesterId||!n.pairInvite.targetId){t().showError(`Validation`,`Requester and Target are required.`);return}if(n.pairInvite.requesterId===n.pairInvite.targetId){t().showError(`Validation`,`Requester and Target must be different.`);return}try{let r={from:n.pairInvite.requesterId,target:n.pairInvite.targetId};n.pairInvite.objective&&(r.objective=n.pairInvite.objective),await S(`POST`,`/pairs`,r),e({pairInviteOpen:!1,pairInvite:{...re}}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Pair Invite Failed`,e.message,e)}},openPairMessage(t,n){e({pairMessage:{...ae,pairId:t.id,from:n||t.requesterId},pairMessageOpen:!0})},closePairMessage(){e({pairMessageOpen:!1,pairMessage:{...ae}})},async doSendPairMessage(){let n=t();if(!n.pairMessage.pairId||!n.pairMessage.from||!n.pairMessage.body){t().showError(`Validation`,`Pair, From, and Message are required.`);return}try{let r={from:n.pairMessage.from,body:n.pairMessage.body};n.pairMessage.subject&&(r.subject=n.pairMessage.subject),await S(`POST`,`/pairs/`+encodeURIComponent(n.pairMessage.pairId)+`/messages`,r),e({pairMessageOpen:!1,pairMessage:{...ae}}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Pair Message Failed`,e.message,e)}},async doAcceptPair(e){try{await S(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/accept`,{agentId:e.targetId}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Accept Failed`,e.message,e)}},async doRejectPair(e){try{await S(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/reject`,{agentId:e.targetId}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Reject Failed`,e.message,e)}},async doHangupPair(e,n){try{await S(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/hangup`,{agentId:n||e.requesterId}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Hang Up Failed`,e.message,e)}}}),yo=25;function bo(e,t){let n=new URLSearchParams({maxItems:String(yo),offset:String(t)});return e.backlogPriorityFilter&&n.set(`priority`,e.backlogPriorityFilter),e.backlogTagFilter&&n.set(`tags`,e.backlogTagFilter),e.backlogSearchFilter&&n.set(`search`,e.backlogSearchFilter),e.backlogProjectFilter&&n.set(`projectId`,e.backlogProjectFilter),n}var xo=(e,t)=>({backlogItems:[],backlogTotal:0,backlogOffset:0,backlogMaxItems:yo,backlogHasMore:!1,backlogLoading:!1,backlogError:null,backlogPriorityFilter:``,backlogTagFilter:``,backlogSearchFilter:``,backlogProjectFilter:``,backlogPromotedOpen:!1,backlogPromotedItems:[],backlogPromotedLoading:!1,backlogPromotedFetched:!1,backlogPromoteLoadingId:null,async fetchBacklog(){e({backlogLoading:!0,backlogError:null});try{let n=await S(`GET`,`/backlog?`+bo(t(),0).toString());e({backlogItems:n.items,backlogTotal:n.total,backlogOffset:n.offset,backlogMaxItems:n.maxItems,backlogHasMore:n.hasMore,backlogLoading:!1})}catch(t){e({backlogLoading:!1,backlogError:t.message})}},async loadMoreBacklog(){let n=t();if(!(!n.backlogHasMore||n.backlogLoading)){e({backlogLoading:!0,backlogError:null});try{let r=n.backlogItems.length,i=await S(`GET`,`/backlog?`+bo(n,r).toString());e({backlogItems:[...t().backlogItems,...i.items],backlogTotal:i.total,backlogOffset:r,backlogMaxItems:i.maxItems,backlogHasMore:i.hasMore,backlogLoading:!1})}catch(t){e({backlogLoading:!1,backlogError:t.message})}}},setBacklogPriorityFilter(n){e({backlogPriorityFilter:n}),t().fetchBacklog()},setBacklogTagFilter(n){e({backlogTagFilter:n}),t().fetchBacklog()},setBacklogSearchFilter(n){e({backlogSearchFilter:n}),t().fetchBacklog()},setBacklogProjectFilter(n){e({backlogProjectFilter:n}),t().fetchBacklog()},toggleBacklogPromoted(){let n=!t().backlogPromotedOpen;e({backlogPromotedOpen:n}),n&&!t().backlogPromotedFetched&&t().fetchBacklogPromoted()},async fetchBacklogPromoted(){e({backlogPromotedLoading:!0});try{e({backlogPromotedItems:(await S(`GET`,`/backlog?state=promoted&sort=updated&maxItems=50`)).items,backlogPromotedLoading:!1,backlogPromotedFetched:!0})}catch{e({backlogPromotedLoading:!1,backlogPromotedFetched:!0})}},async doPromoteBacklogTask(n){e({backlogPromoteLoadingId:n});try{await S(`POST`,`/tasks/`+n+`/promote`,{}),e({backlogItems:t().backlogItems.filter(e=>e.id!==n),backlogTotal:Math.max(0,t().backlogTotal-1),backlogPromoteLoadingId:null}),t().backlogPromotedFetched&&t().fetchBacklogPromoted()}catch(n){e({backlogPromoteLoadingId:null}),t().showError(`Promote Failed`,n.message,n)}}}),So=(e,t)=>({graphNodes:[],graphEdges:[],graphTotal:0,graphMaxNodes:0,graphTruncated:!1,graphLoading:!1,graphError:null,graphProjectFilter:``,async fetchTaskGraph(){e({graphLoading:!0,graphError:null});try{let n=t(),r=new URLSearchParams;n.graphProjectFilter&&r.set(`projectId`,n.graphProjectFilter);let i=r.toString(),a=await S(`GET`,`/task-graph`+(i?`?`+i:``));e({graphNodes:a.nodes,graphEdges:a.edges,graphTotal:a.total,graphMaxNodes:a.maxNodes,graphTruncated:a.truncated,graphLoading:!1})}catch(t){e({graphLoading:!1,graphError:t.message})}},setGraphProjectFilter(n){e({graphProjectFilter:n}),t().fetchTaskGraph()}}),Co=[`implementation`,`review`,`gates`,`landing`,`main`,`deploy`,`validated`],Q=(e,t)=>({kind:`relay`,role:e,...t?{id:t}:{}}),wo=(e,t)=>({kind:`owner`,role:t,...e.owner?{id:e.owner}:{}});function To(e,t){let n=t?.ownerAgentId??e.ownerAgentId;return n?{kind:`agent`,role:`builder`,id:n}:wo(e,`builder`)}function Eo(e,t){let n=t?.status,r=t?.landState??``;return e.verified?{stage:`validated`,responsible:Q(`done`)}:e.deliverableStage===`deploying`||e.deliverableStage===`deployed`?{stage:`deploy`,responsible:Q(`cd`)}:e.deliverableStage===`landed-on-main`||n===`landed`||n===`merged`?e.terminalStage===`landed-on-main`?{stage:`main`,responsible:Q(`done`)}:{stage:`main`,responsible:e.cd?Q(`cd`):wo(e,`closer`)}:r.startsWith(`steward-`)||(n===`conflict`||n===`stranded`)&&t?.stewardAgentId?{stage:`landing`,responsible:Q(`steward`,t?.stewardAgentId)}:n===`merge_planned`||n===`merging`||r===`queued`||r===`merging`?{stage:`landing`,responsible:Q(`landing`)}:n===`gate_running`?{stage:`gates`,responsible:Q(`landing`)}:n===`gate_failed`?{stage:`gates`,responsible:To(e,t)}:(e.reviewHold?e.reviewParked||e.needsReview:n===`review_requested`||e.needsReview)?e.reviewerAgentId?{stage:`review`,responsible:{kind:`agent`,role:`reviewer`,id:e.reviewerAgentId}}:{stage:`review`,responsible:wo(e,`reviewer`)}:{stage:`implementation`,responsible:To(e,t)}}var Do=[`deploy`,`validated`];function Oo(e,t){let n=e.some(e=>e.cd);return Co.filter(e=>n||!Do.includes(e)||t.some(t=>t.stage===e))}function ko(e,t){let n=t.branch?e.filter(e=>e.branch===t.branch):[];return n.length?n:t.ownerAgentId?e.filter(e=>e.signals.ownerAgentId===t.ownerAgentId):[]}var Ao=[`abandoned`,`cleanup_requested`,`cleaned`];function jo(e,t){if(e.signals.reviewerAgentId===t)return e;let n={...e.signals,reviewerAgentId:t};return{...e,signals:n,...Eo(n,e.workspace)}}function Mo(e,t,n){return t.stage===e.stage?e.stageSince:n}function No(e,t){let n=e.workspace;if(n&&n.id!==t.id&&n.updatedAt>t.updatedAt)return e;if(Ao.includes(t.status)){if(n?.id!==t.id)return e;let{workspace:r,...i}=e,a=Eo(e.signals);return{...i,...a,stageSince:Mo(e,a,t.updatedAt)}}let r=Eo(e.signals,t);return{...e,workspace:t,...r,stageSince:Mo(e,r,t.updatedAt)}}var Po=new Set([`claimed`,`in_progress`,`validating`,`blocked`]),Fo=e=>typeof e==`number`?e:Date.parse(e)||Date.now();function Io(e,t){return{...e,tasks:t,lanes:Oo(e.projectLanes,t)}}function Lo(e,t){let n=new Set(ko(e.tasks,t).map(e=>e.taskId));if(!n.size)return e;let r={id:t.id,status:t.status,...t.branch?{branch:t.branch}:{},...t.landState?{landState:t.landState}:{},...t.ownerAgentId?{ownerAgentId:t.ownerAgentId}:{},...t.stewardAgentId?{stewardAgentId:t.stewardAgentId}:{},updatedAt:t.updatedAt};return Io(e,e.tasks.map(e=>n.has(e.taskId)?No(e,r):e))}function Ro(e,t,n){let r=e.owner??e.createdBy;return{deliverableStage:e.deliverableStage??`none`,...e.terminalStage?{terminalStage:e.terminalStage}:{},...e.ownerAgentId?{ownerAgentId:e.ownerAgentId}:{},...r?{owner:r}:{},reviewHold:e.reviewHold===!0,reviewParked:e.reviewHold===!0&&(e.pendingReviewDelivery!==void 0||n?.reviewParked===!0),needsReview:n?.needsReview??!1,verified:n?.verified??!1,...n?.reviewerAgentId?{reviewerAgentId:n.reviewerAgentId}:{},cd:t,staleOwnerGone:!1}}function zo(e,t){if(t.kind!==`deliverable`)return e;let n=e.tasks.find(e=>e.taskId===t.id);if(!n){if(!(e.all?e.projectLanes.some(e=>e.projectId===t.projectId):t.projectId===e.projectId)||!Po.has(t.status))return e;let n=Ro(t,e.projectLanes.some(e=>e.projectId===t.projectId&&e.cd));return Io(e,[{taskId:t.id,title:t.title,...t.projectId?{projectId:t.projectId}:{},...t.branch?{branch:t.branch}:{},...Eo(n),tokens:null,stageSince:Fo(t.updatedAt),signals:n},...e.tasks])}if(!Po.has(t.status)&&t.status!==`done`)return Io(e,e.tasks.filter(e=>e.taskId!==t.id));let r=Ro(t,n.signals.cd===!0,n.signals),i=Eo(r,n.workspace),a={...n,title:t.title,...t.branch?{branch:t.branch}:{},...i,stageSince:Mo(n,i,Fo(t.updatedAt)),signals:r};return Io(e,e.tasks.map(e=>e.taskId===t.id?a:e))}function Bo(e,t){let n=t.repository.toLowerCase(),r=e.ci.find(e=>e.repository.toLowerCase()===n&&e.branch===t.branch&&e.workflow===t.workflow);return!r||r.observedAt>t.observedAt?e:{...e,ci:e.ci.map(e=>e===r?t:e)}}function Vo(e,t,n){let r=new Map;for(let e of t){let t=Number(e.meta?.taskId);e.meta?.profile===`reviewer`&&Ce(n,e)&&Number.isSafeInteger(t)&&r.set(t,e.id)}let i=!1,a=e.tasks.map(e=>{let t=r.get(e.taskId);if(e.stage!==`review`||!t)return e;let n=jo(e,t);return i||=n!==e,n});return i?{...e,tasks:a}:e}var Ho=[`implementation`,`review`];function Uo(e,t,n){let r=[e.responsible.kind===`agent`?e.responsible.id:void 0,e.workspace?.ownerAgentId??e.signals.ownerAgentId],i=null;for(let e of r){if(!e)continue;let r=t[e];if(Ce(n,r))return{id:e,agent:r,live:!0};i??={id:e,...r?{agent:r}:{},live:!1}}return i}function Wo(e,t,n){let r={inFlight:0,withAgents:0,withoutAgent:0,withRelay:0,tokens:0,maxTokens:0};for(let i of e){let{kind:e,role:a}=i.responsible;if(e===`relay`&&a===`done`)continue;r.inFlight++,e===`relay`?r.withRelay++:Uo(i,t,n)?.live?r.withAgents++:r.withoutAgent++;let o=i.tokens?.total??0;r.tokens+=o,r.maxTokens=Math.max(r.maxTokens,o)}return r}var Go=((e,t)=>(n,r)=>{async function i(){let{shippingStatsWindow:e,shippingStatsProjectId:i}=r(),a=`?window=${e}${i?`&projectId=${encodeURIComponent(i)}`:``}`;n({shippingStats:null,shippingStatsLoading:!0,shippingStatsError:null});let o=()=>{let t=r();return t.view===`shipping`&&t.shippingTab===`stats`&&t.shippingStatsWindow===e&&t.shippingStatsProjectId===i};try{let e=await t(a);o()&&n({shippingStats:e,shippingStatsLoading:!1})}catch(e){o()&&n({shippingStatsLoading:!1,shippingStatsError:e.message})}}return{shippingBoard:null,shippingLoading:!1,shippingError:null,shippingProjectId:``,shippingTab:`realtime`,shippingStats:null,shippingStatsLoading:!1,shippingStatsError:null,shippingStatsWindow:`7d`,shippingStatsProjectId:``,async openShipping(){let t=r().shippingProjectId;n({shippingLoading:!0,shippingError:null});try{let i=await e(t===`*`?`?scope=all`:t?`?projectId=${encodeURIComponent(t)}`:``);if(r().view!==`shipping`||r().shippingProjectId!==t)return;n({shippingBoard:i,shippingLoading:!1})}catch(e){r().view===`shipping`&&n({shippingLoading:!1,shippingError:e.message})}},closeShipping(){n({shippingBoard:null,shippingLoading:!1,shippingError:null,shippingTab:`realtime`,shippingStats:null,shippingStatsLoading:!1,shippingStatsError:null})},setShippingProject(e){n({shippingProjectId:e,shippingBoard:null}),r().openShipping()},setShippingTab(e){e!==r().shippingTab&&(n({shippingTab:e,shippingStats:null,shippingStatsLoading:!1,shippingStatsError:null}),e===`stats`&&i())},setShippingStatsWindow(e){n({shippingStatsWindow:e}),i()},setShippingStatsProject(e){n({shippingStatsProjectId:e}),i()},shippingEvent(e,t){let i=r().shippingBoard;if(!i)return;let a=e===`workspace.status`?Lo(i,JSON.parse(t)):e===`ci.status`?Bo(i,JSON.parse(t)):zo(i,JSON.parse(t));a!==i&&n({shippingBoard:a})}}})(e=>S(`GET`,`/shipping/board${e}`),e=>S(`GET`,`/shipping/stats${e}`)),Ko={byAgent:{},byTask:{}};function qo(e){if(!e.length)return Ko;let t={},n={};for(let r of e){let e=(e,t,n)=>({runId:r.runId,workflow:r.workflow,step:e,round:t,kind:n});for(let{steps:t,round:i}of r.rounds)for(let a of t)a.taskId!==r.taskId&&(n[a.taskId]=e(a.step,i,`step`));for(let i of r.agents)i.agentId&&(t[i.agentId]=e(i.step,i.round,`step`)),i.taskId!==r.taskId&&(n[i.taskId]=e(i.step,i.round,`step`));n[r.taskId]=e(r.step,r.round,`run`)}return{byAgent:t,byTask:n}}function Jo(e){let t=e?.meta?.workflowRunId;return typeof t==`string`&&t?t:void 0}function Yo(e){let t=e.round>1?`, round ${e.round}`:``;return e.kind===`run`?`${e.workflow} at ${e.step}${t}`:`${e.workflow}, ${e.step} step${t}`}var Xo=100,Zo=750,Qo={workflowRuns:null,workflowRecent:null,workflowStats:null,workflowDefinitions:null},$o=((e,t=(e,t)=>S(`POST`,e,t))=>(n,r)=>{let i,a=0,o=0;async function s(){let t=++a,{workflowProjectId:i,workflowTab:o,workflowStatsWindow:s}=r(),c=e=>i?`${e}${e.includes(`?`)?`&`:`?`}projectId=${encodeURIComponent(i)}`:e,l=()=>t===a&&r().view===`workflows`;n({workflowLoading:!0,workflowError:null});try{if(o===`stats`){let t=await e(c(`/workflows/stats?window=${s}`));l()&&n({workflowStats:t,workflowLoading:!1})}else if(o===`definitions`){let{workflows:t}=await e(c(`/workflows/definitions`));l()&&n({workflowDefinitions:t,workflowLoading:!1})}else{let t=r().workflowFocusedRun?.runId,[i,a,o]=await Promise.all([e(c(`/workflows/runs?status=running`)),e(c(`/workflows/runs?status=finished&limit=10`)),t?e(`/workflows/runs/${encodeURIComponent(t)}?verbose=true`):void 0]);l()&&n({workflowRuns:i.runs,workflowRecent:a.runs,workflowLoading:!1,...o&&r().workflowFocusedRun?.runId===t?{workflowFocusedRun:{...o,heldCount:o.heldCount??0,taskTitle:o.taskTitle??`T${o.taskId}`,agents:o.agents??[]}}:{}})}}catch(e){l()&&n({workflowLoading:!1,workflowError:e.message})}}async function c(){r().workflowTab===`catalog`?await r().loadWorkflowCatalog():await s()}return{workflowTab:`runs`,workflowFocusedRun:null,async showWorkflowRun(t){await r().switchView(`workflows`);try{let r=await e(`/workflows/runs/${encodeURIComponent(t)}?verbose=true`);n({workflowTab:`runs`,workflowFocusedRun:{...r,heldCount:r.heldCount??0,taskTitle:r.taskTitle??`T${r.taskId}`,agents:r.agents??[]}})}catch(e){n({workflowError:e.message})}},...Qo,workflowStatsWindow:`7d`,workflowProjects:[],workflowProjectId:``,workflowLoading:!1,workflowError:null,workflowLiveRuns:[],workflowLiveIndex:Ko,async fetchWorkflowLiveRuns(){let t=++o;try{let{runs:r}=await e(`/workflows/runs?status=running&limit=${Xo}`);t===o&&n({workflowLiveRuns:r,workflowLiveIndex:qo(r)})}catch{}},async openWorkflows(){r().workflowProjects.length||e(`/projects`).then(e=>{r().view===`workflows`&&n({workflowProjects:e.projects??[]})}).catch(()=>{}),await c()},closeWorkflows(){a++,n({...Qo,workflowTab:`runs`,workflowLoading:!1,workflowError:null}),r().clearWorkflowCatalog()},setWorkflowTab(e){e!==r().workflowTab&&(a++,n({...Qo,workflowTab:e,workflowLoading:!1,workflowError:null}),r().clearWorkflowCatalog(),c())},setWorkflowStatsWindow(e){n({workflowStatsWindow:e,workflowStats:null}),s()},setWorkflowProject(e){n({...Qo,workflowProjectId:e}),c()},async pauseWorkflowRun(e,i){try{await t(`/workflows/runs/${encodeURIComponent(e)}/${i===null?`unpause`:`pause`}`,i===null?{}:{reason:i}),n({workflowError:null}),r().fetchWorkflowLiveRuns(),r().view===`workflows`&&await c()}catch(e){n({workflowError:e.message})}},workflowChanged(){i||=setTimeout(()=>{i=void 0,r().fetchWorkflowLiveRuns(),r().view===`workflows`&&r().workflowTab!==`catalog`&&s()},Zo)}}})(e=>S(`GET`,e)),es=((e,t)=>(n,r)=>{let i=0;return{workflowCatalog:null,workflowCatalogLoading:!1,workflowCatalogError:null,async loadWorkflowCatalog(){let t=++i,a=r().workflowProjectId,o=()=>t===i&&r().view===`workflows`&&r().workflowTab===`catalog`;n({workflowCatalog:null,workflowCatalogLoading:!0,workflowCatalogError:null});try{let t=await e(a?`?projectId=${encodeURIComponent(a)}`:``);o()&&n({workflowCatalog:t,workflowCatalogLoading:!1})}catch(e){o()&&n({workflowCatalogLoading:!1,workflowCatalogError:e.message})}},clearWorkflowCatalog(){i++,n({workflowCatalog:null,workflowCatalogLoading:!1,workflowCatalogError:null})},async createWorkflowOverrideTask(e){try{return(await t(e)).id}catch(e){return r().showError(`Create Override Task Failed`,e.message,e),null}}}})(e=>S(`GET`,`/workflows/catalog${e}`),e=>S(`POST`,`/tasks`,e));function ts(e){return e.filter(e=>!Be(e.name))}var ns=(e,t)=>({orchestrators:[],providerCatalog:[],orchestratorSpawnOpen:!1,orchestratorInstallOpen:!1,spawnOrchId:``,spawnProvider:N(void 0),spawnModel:F(N(void 0)),spawnEffort:``,spawnSelfEffort:P,spawnProfile:Re,spawnReportVerbosity:``,spawnHarnessSubagents:``,spawnCwd:``,spawnLabel:``,spawnApproval:`guarded`,spawnLaunchMode:``,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,spawnCwdHistory:[],isSpawning:!1,spawnDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``},pendingForkImport:null,async fetchOrchestrators(){try{let n=O(t().orchestrators,await S(`GET`,`/orchestrators`));n!==t().orchestrators&&e({orchestrators:n})}catch{}},async fetchProviderCatalog(){try{e({providerCatalog:(await S(`GET`,`/providers`)).catalog})}catch{}},async refreshOrchestratorProviders(e){try{await S(`GET`,`/orchestrators/`+encodeURIComponent(e)+`/providers?refresh=1`),await t().fetchOrchestrators(),t().showNotification(`Provider status refreshed`)}catch(e){t().showError(`Provider Refresh Failed`,e.message,e)}},hostProvidersById:{},async fetchHostProviders(n){try{let r=await S(`GET`,`/orchestrators/`+encodeURIComponent(n)+`/host-providers`);e({hostProvidersById:{...t().hostProvidersById,[n]:r}})}catch(e){t().showError(`Host Providers Failed`,e.message,e)}},async setHostProvider(n,r,i,a){let o=t().hostProvidersById[n];o&&e({hostProvidersById:{...t().hostProvidersById,[n]:{...o,providers:o.providers.map(e=>e.provider===r?{...e,enabled:i}:e)}}});try{let o=await S(`PUT`,`/orchestrators/`+encodeURIComponent(n)+`/host-providers/`+encodeURIComponent(r),{enabled:i,...a?.trim()?{reason:a.trim()}:{},updatedBy:`dashboard`});e({hostProvidersById:{...t().hostProvidersById,[n]:o}}),t().showNotification(`${r} ${i?`enabled`:`disabled`} on ${n}`)}catch(r){o&&e({hostProvidersById:{...t().hostProvidersById,[n]:o}}),t().showError(`Host Provider Update Failed`,r.message,r)}},openAgentSpawn(){t().openOrchestratorSpawn()},closeAgentSpawn(){e({orchestratorSpawnOpen:!1})},async doSpawnAgent(){await t().submitOrchestratorSpawn()},openOrchestratorSpawn(){t().openOrchestratorSpawnAt()},openOrchestratorSpawnAt(n={}){let r=t().orchestrators.filter(e=>e.status===`online`);if(!r.length){t().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}t().fetchProviderCatalog();let i=t(),a=n.orchestratorId?r.find(e=>e.id===n.orchestratorId):void 0;if(n.orchestratorId&&!a){t().showError(`Orchestrator Offline`,`The selected orchestrator is not online.`);return}let o=n.cwd?.trim()||i.spawnCwd,s=o?r.find(e=>v(o,e.baseDir)):void 0,c=i.spawnOrchId?r.find(e=>e.id===i.spawnOrchId):void 0,l=a?.id||s?.id||c?.id||r[0].id,u=r.find(e=>e.id===l),d=i.spawnProvider&&M(u,i.providerCatalog).includes(i.spawnProvider)?i.spawnProvider:N(u,i.providerCatalog),f=i.spawnProvider===d&&i.spawnModel&&mn(d,i.providerCatalog).some(e=>e.alias===i.spawnModel)?i.spawnModel:F(d,i.providerCatalog),p=o&&v(o,u.baseDir)?o:u.baseDir||``;e({spawnOrchId:l,spawnProvider:d,spawnModel:f,spawnEffort:i.spawnProvider===d&&i.spawnModel===f?i.spawnEffort:``,spawnProfile:i.spawnProfile||`worker`,spawnCwd:p,spawnLabel:``,spawnHarnessSubagents:``,spawnReportVerbosity:``,spawnSelfEffort:P,spawnWorkspaceMode:`inherit`,spawnLaunchMode:``,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,pendingForkImport:null,orchestratorSpawnOpen:!0})},forkFromAgent(n,r){let i=t(),l=i.agentsById[n];if(!l){t().showError(`Fork`,`Agent not found.`);return}let u=i.orchestrators.filter(e=>e.status===`online`);if(!u.length){t().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}t().fetchProviderCatalog();let d=l.providerCapabilities,f=d?.model?.provider||(typeof l.meta?.provider==`string`?l.meta.provider:``),p=d?.model?.alias||d?.model?.id||``,m=c(f,i.providerCatalog)?.models.find(e=>e.alias===p||e.providerModel===p)?.alias||``,h=d?.model?.effort||``,g=l.meta?.workspace,_=a(g)?g:{},te=s(_.repoRoot)||s(_.sourceCwd)||(typeof l.meta?.cwd==`string`?l.meta.cwd:``),ne=s(_.mode),re=ne===`isolated`?`isolated`:ne===`shared`?`shared`:`inherit`,ae=d?.session?.approvalMode||(typeof l.meta?.approvalMode==`string`?l.meta.approvalMode:`guarded`),oe=l.label?`${l.label} (fork)`:``,y=u.find(e=>e.hostname===l.machine)||u.find(e=>v(te,e.baseDir))||u[0],se=ie(l),ce=[];for(let e of r){let t=ee(e).trim();if(!t)continue;let n=o(e.from)?`user`:`agent`;ce.push(`[${n}]: ${t}`)}let b=ce.join(`
6
- `),x=14e3,le=`You are continuing work from a previous agent session (${se}). Below is the conversation history. Treat it as context for your work, not as your own actions.\n\n${b.length>x?`...
7
- `+b.slice(b.length-x):b}`,ue=r.filter(e=>typeof e.id==`number`&&e.id>0).map(e=>e.id);e({spawnOrchId:y.id,spawnProvider:f||N(y,i.providerCatalog),spawnModel:m||F(f||N(y,i.providerCatalog),i.providerCatalog),spawnEffort:h,spawnSelfEffort:P,spawnProfile:i.spawnProfile||`worker`,spawnReportVerbosity:``,spawnCwd:te||y.baseDir||``,spawnLabel:oe,spawnApproval:ae,spawnWorkspaceMode:re,spawnPrompt:`Continue from this previous session.`,spawnSystemPromptAppend:le,spawnCount:1,pendingForkImport:{sourcePeerId:l.id,sourceAgentId:l.id,sourceThreadId:l.id,sourceAgentLabel:se,messageIds:ue},orchestratorSpawnOpen:!0})},openOrchestratorInstall(){e({orchestratorInstallOpen:!0})},openOrchestratorSpawnFor(n){let r=t(),i=r.orchestrators.find(e=>e.id===n),a=N(i,r.providerCatalog),o=F(a,r.providerCatalog),s=r.spawnProvider===a&&r.spawnModel===o?r.spawnEffort:``,c=r.spawnCwd&&v(r.spawnCwd,i?.baseDir)?r.spawnCwd:i?.baseDir||``;e({spawnOrchId:n,spawnProvider:a,spawnModel:o,spawnEffort:s,spawnProfile:r.spawnProfile||`worker`,spawnCwd:c,spawnLabel:``,spawnHarnessSubagents:``,spawnReportVerbosity:``,spawnSelfEffort:P,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,pendingForkImport:null,orchestratorSpawnOpen:!0})},selectSpawnHistory(n,r){let i=t(),a=i.orchestrators.find(e=>e.id===n&&e.status===`online`);if(!a){t().showError(`Unavailable`,`That orchestrator is no longer online.`);return}if(n===i.spawnOrchId){e({spawnCwd:r});return}let o=i.spawnProvider&&M(a,i.providerCatalog).includes(i.spawnProvider)?i.spawnProvider:N(a,i.providerCatalog),s=i.spawnProvider===o&&i.spawnModel&&mn(o,i.providerCatalog).some(e=>e.alias===i.spawnModel)?i.spawnModel:F(o,i.providerCatalog);e({spawnOrchId:n,spawnProvider:o,spawnModel:s,spawnEffort:i.spawnProvider===o&&i.spawnModel===s?i.spawnEffort:``,spawnCwd:r})},async submitOrchestratorSpawn(){let n=t();if(n.isSpawning)return;if(!n.spawnOrchId){t().showError(`Validation`,`Select an orchestrator.`);return}let r=n.orchestrators.find(e=>e.id===n.spawnOrchId);if(!r){t().showError(`Validation`,`Selected orchestrator is not available.`);return}let i=n.spawnCwd.trim();if(!i){t().showError(`Validation`,`Select a working directory.`);return}if(!v(i,r.baseDir)){t().showError(`Validation`,`Working directory must be under ${r.baseDir}.`);return}let a=n.pendingForkImport,o=a?1:Math.max(1,Math.min(10,Math.round(n.spawnCount)||1));e({isSpawning:!0});let s=`spawn-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;try{for(let e=0;e<o;e++){let r={provider:n.spawnProvider,orchestratorId:n.spawnOrchId,approvalMode:n.spawnApproval,workspaceMode:n.spawnWorkspaceMode||`inherit`};n.spawnModel&&(r.model=n.spawnModel),n.spawnEffort&&(r.effort=n.spawnEffort);let s=hn(n.spawnProvider,n.spawnModel,n.spawnLaunchMode,n.providerCatalog),l=gn(s,n.spawnSelfEffort);s.length&&Object.assign(r,n.spawnSelfEffort?{selfEffort:!0,...l===`band`?{}:{selfEffortCeiling:l}}:{selfEffort:!1}),n.spawnProfile&&(r.profile=n.spawnProfile),n.spawnReportVerbosity&&(r.reportVerbosity=n.spawnReportVerbosity),n.spawnHarnessSubagents&&(r.harnessSubagents=n.spawnHarnessSubagents===`on`),n.spawnLaunchMode&&c(n.spawnProvider,n.providerCatalog)?.launchModes?.includes(n.spawnLaunchMode)&&(r.launchMode=n.spawnLaunchMode),r.cwd=i,n.spawnLabel&&(r.label=o>1?`${n.spawnLabel} ${e+1}`:n.spawnLabel),n.spawnPrompt&&(r.prompt=n.spawnPrompt),n.spawnSystemPromptAppend&&(r.systemPromptAppend=n.spawnSystemPromptAppend);let u=(await S(`POST`,`/agents/spawn`,r)).command?.params?.spawnRequestId;a&&u&&a.messageIds.length>0&&await S(`POST`,`/chat/history-imports`,{targetSpawnRequestId:u,sourcePeerId:a.sourcePeerId,sourceAgentId:a.sourceAgentId,sourceThreadId:a.sourceThreadId,sourceAgentLabel:a.sourceAgentLabel,importedBy:T(t().sessionUser),messageIds:a.messageIds})}e({orchestratorSpawnOpen:!1,pendingForkImport:null,isSpawning:!1,spawnCwdHistory:[{orchId:n.spawnOrchId,cwd:i},...n.spawnCwdHistory.filter(e=>!(e.orchId===n.spawnOrchId&&e.cwd===i))].slice(0,5)}),await Promise.all([t().fetchAgents(),t().fetchOrchestrators(),t().fetchActivityEvents(),t().fetchChatHistoryImports()])}catch(n){e({isSpawning:!1});let r=n.status,i=r?`HTTP ${r}`:ge(n)?`network error`:`unknown error`;console.error(`[spawn] agent spawn failed (attempt ${s}, ${i}): ${n.message}`),t().showError(`Spawn Failed`,`${n.message} (attempt ${s}, ${i})`,n,{force:!0})}},orchestratorAction(e,n,r,i){let a=n===`restart`?`Restart`:`Shutdown`,o=r?`agent "${r}"`:`all agents`;t().openConfirm(`${a} Agent`,`${a} ${o} on orchestrator "${e}"?`,async()=>{try{await S(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:n,agentId:r,...i?{surface:{component:i}}:{}}),await Promise.all([t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`${a} Failed`,e.message,e)}})},upgradeOrchestrator(e,n){let r=n?` to v${n}`:` to match the relay`;t().openConfirm(`Upgrade Orchestrator`,`Upgrade "${e}"${r}? It will install the new version and restart itself.`,async()=>{try{await S(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:`upgrade`,...n?{targetVersion:n}:{}}),await Promise.all([t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`Upgrade Failed`,e.message,e)}})},deleteOrchestrator(e){t().openConfirm(`Remove Orchestrator`,`Remove orchestrator "${e}"?`,async()=>{try{await S(`DELETE`,`/orchestrators/`+encodeURIComponent(e)),await Promise.all([t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`Delete Failed`,e.message,e)}})},async browseSpawnDirectory(n){let r=t().spawnOrchId;if(!r)return;let i=t().spawnDirBrowser;e({spawnDirBrowser:{...i,loading:!0,error:``}});try{let i=n?`?path=`+encodeURIComponent(n):``,a=await S(`GET`,`/orchestrators/`+encodeURIComponent(r)+`/directories`+i);e({spawnDirBrowser:{open:!0,loading:!1,path:a.path||``,parent:a.parent||``,baseDir:a.baseDir||``,entries:a.entries||[],error:``},spawnCwd:a.path||t().spawnCwd})}catch(n){e({spawnDirBrowser:{...t().spawnDirBrowser,loading:!1,error:n.message}})}},selectSpawnDirectory(n){e({spawnCwd:n||t().spawnDirBrowser.path,spawnDirBrowser:{...t().spawnDirBrowser,open:!1}})}}),rs=(e,t)=>({managedPolicies:[],policyModal:{open:!1,editing:``,name:``,description:``,orchestratorId:``,cwd:``,enabled:void 0,provider:N(void 0),rig:``,model:F(N(void 0)),effort:``,profile:Re,providerArgs:``,launchMode:``,prompt:``,tags:``,capabilities:``,label:``,mode:`always-on`,permissionMode:`guarded`,restartOnUpdate:!0,scheduledDailyRestart:!1,keepaliveSeconds:`300`,backoffSchedule:`5,15,60,300`,backoffResetAfterSeconds:`600`,channelId:``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``},agentProfiles:[],toolGroupCatalog:[],toolGroupCatalogStatus:{loading:!1,loaded:!1,error:null},profileModal:{open:!1,mode:`create`,profile:{name:``,description:``,provider:`any`,base:`host`,instructions:{system:``,append:[],repoInstructions:`allow`,globalInstructions:`allow`},relay:{context:!0,skills:!0,plugins:!0,statusLine:!0,mcp:!0},skills:[],plugins:[],mcp:{mode:`host`},hooks:{mode:`host`},permissions:{filesystem:`host`},env:{},providerOptions:{}},relayToolsMode:`full`},async fetchManagedPolicies(){try{let n=ht(t().managedPolicies,await S(`GET`,`/spawn-policies/health`),e=>e.policy.name);n!==t().managedPolicies&&e({managedPolicies:n})}catch{}},async fetchAgentProfiles(){try{e({agentProfiles:(await S(`GET`,`/agent-profiles`)).map(e=>e.value)})}catch{}},async fetchToolGroupCatalog(){e({toolGroupCatalogStatus:{loading:!0,loaded:t().toolGroupCatalogStatus.loaded,error:null}});try{e({toolGroupCatalog:await S(`GET`,`/agent-profiles/tool-groups`),toolGroupCatalogStatus:{loading:!1,loaded:!0,error:null}})}catch(t){e({toolGroupCatalog:[],toolGroupCatalogStatus:{loading:!1,loaded:!0,error:i(t)}})}},openPolicyCreate(){let n=t().orchestrators.filter(e=>e.status===`online`);if(!n.length){t().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}t().fetchProviderCatalog(),e({policyModal:{open:!0,editing:``,name:``,description:``,orchestratorId:n[0].id,cwd:``,enabled:void 0,provider:N(n[0],t().providerCatalog),rig:``,model:F(N(n[0],t().providerCatalog),t().providerCatalog),effort:``,profile:Re,providerArgs:``,launchMode:``,prompt:``,tags:``,capabilities:``,label:``,mode:`always-on`,permissionMode:`guarded`,restartOnUpdate:!0,scheduledDailyRestart:!1,keepaliveSeconds:`300`,backoffSchedule:`5,15,60,300`,backoffResetAfterSeconds:`600`,channelId:``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``}})},openPolicyEdit(n){t().fetchProviderCatalog(),e({policyModal:{open:!0,editing:n.name,name:n.name,enabled:n.enabled,description:n.description||``,orchestratorId:n.orchestratorId,cwd:n.cwd,provider:n.provider,rig:n.rig||``,model:n.model||F(n.provider,t().providerCatalog),effort:n.effort||``,profile:n.profile||`worker`,providerArgs:(n.providerArgs||[]).join(` `),launchMode:n.launchMode||``,prompt:n.prompt||``,tags:(n.tags||[]).join(`, `),capabilities:(n.capabilities||[]).join(`, `),label:n.label||``,mode:n.mode,permissionMode:n.permissionMode,restartOnUpdate:n.restartOnUpdate,scheduledDailyRestart:n.scheduledDailyRestart,keepaliveSeconds:String(n.onDemand?.keepaliveSeconds??300),backoffSchedule:(n.backoff?.schedule||[5,15,60,300]).join(`, `),backoffResetAfterSeconds:String(n.backoff?.resetAfterSeconds??600),channelId:n.binding?.channelId||``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``}})},async submitPolicy(){let n=t().policyModal;if(!n.name.trim()){t().showError(`Validation`,`Policy name is required.`);return}if(!n.orchestratorId){t().showError(`Validation`,`Select an orchestrator.`);return}if(!n.cwd.trim()){t().showError(`Validation`,`Working directory is required.`);return}let r=e=>e.split(/[,\s]+/).map(e=>e.trim()).filter(Boolean),i={name:n.name.trim(),...n.description.trim()?{description:n.description.trim()}:{},...n.enabled===void 0?{}:{enabled:n.enabled},orchestratorId:n.orchestratorId,cwd:n.cwd.trim(),provider:n.provider,...n.rig.trim()?{rig:n.rig.trim()}:{},...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{},...n.profile?{profile:n.profile}:{},providerArgs:n.providerArgs.trim()?n.providerArgs.trim().split(/\s+/):[],...n.launchMode?{launchMode:n.launchMode}:{},...n.prompt.trim()?{prompt:n.prompt.trim()}:{},tags:r(n.tags),capabilities:r(n.capabilities),...n.label.trim()?{label:n.label.trim()}:{},mode:n.mode,permissionMode:n.permissionMode,restartOnUpdate:n.restartOnUpdate,scheduledDailyRestart:n.scheduledDailyRestart,...n.mode===`on-demand`?{onDemand:{keepaliveSeconds:Number(n.keepaliveSeconds)||300,idleDefinition:`no-activity`}}:{},backoff:{schedule:r(n.backoffSchedule).map(Number).filter(e=>e>0),resetAfterSeconds:Number(n.backoffResetAfterSeconds)||600},...n.channelId.trim()?{binding:{type:`channel`,channelId:n.channelId.trim()}}:{}};i.backoff.schedule.length||(i.backoff.schedule=[5,15,60,300]);try{await S(`PUT`,`/spawn-policy/`+encodeURIComponent(i.name),i),e({policyModal:{...n,open:!1}}),await t().fetchManagedPolicies()}catch(e){t().showError(`Save Failed`,e.message,e)}},deletePolicy(e){t().openConfirm(`Delete Policy`,`Delete managed agent policy "${e}"? This will stop any running agent.`,async()=>{try{await S(`DELETE`,`/spawn-policy/`+encodeURIComponent(e)),await t().fetchManagedPolicies()}catch(e){t().showError(`Delete Failed`,e.message,e)}})},async browsePolicyDirectory(n){let r=t().policyModal.orchestratorId;if(!r)return;let i=t().policyDirBrowser;e({policyDirBrowser:{...i,loading:!0,error:``}});try{let i=n?`?path=`+encodeURIComponent(n):``,a=await S(`GET`,`/orchestrators/`+encodeURIComponent(r)+`/directories`+i);e({policyDirBrowser:{open:!0,loading:!1,path:a.path||``,parent:a.parent||``,baseDir:a.baseDir||``,entries:a.entries||[],error:``},policyModal:{...t().policyModal,cwd:a.path||t().policyModal.cwd}})}catch(n){e({policyDirBrowser:{...t().policyDirBrowser,loading:!1,error:n.message}})}},selectPolicyDirectory(n){e({policyModal:{...t().policyModal,cwd:n||t().policyDirBrowser.path},policyDirBrowser:{...t().policyDirBrowser,open:!1}})},openProfileModal(n,r){t().fetchToolGroupCatalog();let i={name:``,description:``,provider:`any`,base:`host`,instructions:{system:``,append:[],repoInstructions:`allow`,globalInstructions:`allow`},relay:{context:!0,skills:!0,plugins:!0,statusLine:!0,mcp:!0},skills:[],plugins:[],mcp:{mode:`host`},hooks:{mode:`host`},permissions:{filesystem:`host`},env:{},providerOptions:{},hostPinned:!1},a;r&&n===`duplicate`?(a=JSON.parse(JSON.stringify(r)),a.name=r.name+`-copy`,delete a.builtIn,delete a.promptVersions):a=r&&(n===`edit`||n===`view`)?JSON.parse(JSON.stringify(r)):i;let o=a.relay.tools?.groups===void 0?`full`:`custom`;e({profileModal:{open:!0,mode:n,profile:a,relayToolsMode:o}})},closeProfileModal(){e({profileModal:{...t().profileModal,open:!1}})},updateProfileModal(n){let r=t().profileModal.profile,i=typeof n==`function`?n(r):n;e({profileModal:{...t().profileModal,profile:{...r,...i}}})},setRelayToolsMode(n){if(e({profileModal:{...t().profileModal,relayToolsMode:n}}),n===`full`){let{profile:n}=t().profileModal;e({profileModal:{...t().profileModal,profile:{...n,relay:{...n.relay,tools:n.relay.tools?{include:n.relay.tools.include,exclude:n.relay.tools.exclude}:void 0}}}})}},async saveProfile(){let{mode:n,profile:r}=t().profileModal;if(!r.name.trim()){t().showError(`Validation`,`Profile name is required.`);return}if(n!==`view`)try{await S(`PUT`,`/agent-profiles/`+encodeURIComponent(r.name.trim()),r),e({profileModal:{...t().profileModal,open:!1}}),await t().fetchAgentProfiles(),t().showNotification(`Profile "${r.name}" saved`)}catch(e){t().showError(`Save Failed`,e.message,e)}},deleteProfile(e){let n=typeof e==`string`?t().agentProfiles.find(t=>t.name===e):e,r=typeof e==`string`?e:e.name,i=n?.builtIn===!0;t().openConfirm(i?`Reset Profile`:`Delete Profile`,i?`Reset built-in profile "${r}" to its default?`:`Delete agent profile "${r}"?`,async()=>{try{await S(`DELETE`,`/agent-profiles/`+encodeURIComponent(r)),await t().fetchAgentProfiles(),t().showNotification(i?`Profile "${r}" reset to default`:`Profile "${r}" deleted`)}catch(e){t().showError(`Delete Failed`,e.message,e)}})}}),is=(e,t)=>({operatorActivity:[],recordOperatorActivity(n){let r={id:Date.now(),kind:`operator`,title:n.title||`Activity`,body:n.body,meta:n.meta,icon:n.icon,view:n.view,peer:n.peer,messageId:n.messageId,pairId:n.pairId,taskId:n.taskId,agentId:n.agentId,ts:Date.now(),clientId:`op-`+Date.now(),createdAt:Date.now()};e({operatorActivity:[r,...t().operatorActivity.slice(0,79)]}),S(`POST`,`/activity`,{operatorId:T(t().sessionUser),clientId:r.clientId,kind:r.kind,title:r.title,body:r.body,meta:r.meta,icon:r.icon,view:r.view,peer:r.peer,messageId:r.messageId,pairId:r.pairId,taskId:r.taskId,agentId:r.agentId}).catch(()=>{})},async openActivityItem(e){if(e.view&&await t().switchView(e.view===`inbox`?`chat`:e.view),e.peer&&t().openInboxThread(e.peer),e.agentId){let n=t().agentsById[e.agentId];n&&t().openAgentDetail(n)}e.taskId&&t().openTaskDetailById(e.taskId)}});function as(e){return ue(e.createdAt??e.ts)}function os(e,t){let n=[`# Humwick Timeline`,``,`Exported: ${t}`,`Events: ${e.length}`,``];for(let t of e){let e=new Date(as(t)).toISOString();n.push(`## ${t.title||t.kind||`Event`}`),n.push(`- When: ${e}`),t.kind&&n.push(`- Kind: ${t.kind}`),t.agentId&&n.push(`- Agent: ${t.agentId}`),t.peer&&n.push(`- Peer: ${t.peer}`),t.body&&n.push(``,t.body),n.push(``)}return n.join(`
8
- `)}var ss=(e,t)=>({activityEvents:[],activityFilter:``,async fetchActivityEvents(){try{e({activityEvents:z(await S(`GET`,`/activity?limit=200`),200,as)})}catch{}},exportActivity(e){let n=t(),r=[...n.operatorActivity,...n.activityEvents].sort((e,t)=>as(t)-as(e)),i=new Date().toISOString(),a=`humwick-timeline-${i.slice(0,10)}.${e===`json`?`json`:`md`}`;e===`json`?x(a,JSON.stringify({title:`Humwick Timeline`,exportedAt:i,events:r},null,2),`application/json`):x(a,os(r,i),`text/markdown`)},exportThread(e,t){let n=`humwick-thread-${te(e.peer)}.${t===`json`?`json`:`md`}`,r={title:`Thread: `+e.peer,importedHistory:e.importedHistory||[],messages:e.messages,exportedAt:new Date().toISOString()};x(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},exportPair(e,t){let n=`humwick-pair-${te(e.id)}.${t===`json`?`json`:`md`}`,r={title:`Pair: `+e.id,pair:e,exportedAt:new Date().toISOString()};x(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},async exportTask(n,r){let i=t().taskEventCache[n.id]||[];if(!i.length)try{i=await S(`GET`,`/tasks/`+n.id+`/events`),e({taskEventCache:{...t().taskEventCache,[n.id]:i}})}catch{}let a=`humwick-task-${n.id}.${r===`json`?`json`:`md`}`,o={title:`Task: `+(n.title||`T`+n.id),task:n,events:i,exportedAt:new Date().toISOString()};x(a,JSON.stringify(o,null,2),r===`json`?`application/json`:`text/markdown`)}}),cs=(e,t)=>({channels:[],connectors:[],integrations:[],automations:[],automationRuns:[],health:null,maintenanceJobs:[],maintenanceRunning:[],maintenanceRecentRuns:[],analyticsPeriod:`24h`,analyticsData:null,analyticsTab:`overview`,async fetchChannels(){try{e({channels:await S(`GET`,`/channels`)})}catch{}},async fetchConnectors(){try{e({connectors:await S(`GET`,`/connectors`)})}catch{}},async fetchIntegrations(){try{e({integrations:await S(`GET`,`/integrations`)})}catch{}},async fetchAutomations(){try{e({automations:await S(`GET`,`/automations`)})}catch{}},async fetchAutomationRuns(t){try{let n=new URLSearchParams({limit:`100`});t&&n.set(`automationId`,t),e({automationRuns:await S(`GET`,`/automation-runs?`+n.toString())})}catch{}},async fetchHealth(){try{let n=gt(t().health,await S(`GET`,`/health`));n!==t().health&&e({health:n})}catch{}},async fetchMaintenanceJobs(){try{e({maintenanceJobs:await S(`GET`,`/maintenance/jobs`)})}catch{}},async fetchMaintenanceRunning(){try{let t=await S(`GET`,`/maintenance/running`);e({maintenanceRunning:t.running,maintenanceRecentRuns:t.recent})}catch{}},async runMaintenanceJob(n){try{let r=await S(`POST`,`/maintenance/jobs/`+encodeURIComponent(n)+`/run`,{});return e({maintenanceJobs:r.jobs}),t().showNotification(r.run.status===`succeeded`?`Maintenance job completed`:`Maintenance job skipped`),r.run}catch(e){return t().showError(`Maintenance Job Failed`,e.message,e),await t().fetchMaintenanceJobs(),null}},async pauseMaintenanceJob(n,r){try{let i=await S(`POST`,`/maintenance/jobs/`+encodeURIComponent(n)+`/pause`,r);return i.jobs&&e({maintenanceJobs:i.jobs}),t().showNotification(r.indefinite?`Job paused indefinitely`:`Job paused`),i.pause??null}catch(e){return t().showError(`Pause Failed`,e.message,e),await t().fetchMaintenanceJobs(),null}},async resumeMaintenanceJob(n){try{let r=await S(`POST`,`/maintenance/jobs/`+encodeURIComponent(n)+`/resume`,{});r.jobs&&e({maintenanceJobs:r.jobs});let i=r.drift?` (held ${Math.round(r.drift.heldForMs/6e4)}m)`:``;return t().showNotification(`Job resumed`+i),!0}catch(e){return t().showError(`Resume Failed`,e.message,e),await t().fetchMaintenanceJobs(),!1}},async runHealthAction(n){if(n.preset&&(e({agentPresetFilter:n.preset}),t().setShowOffline(!0)),n.api&&n.path&&(await S(n.api,n.path),await t().refreshLiveData()),n.view&&await t().switchView(n.view),n.copy)try{await navigator.clipboard?.writeText(n.copy)}catch{}},async runConnectorAction(e,n){try{let r=await S(`POST`,`/connectors/`+encodeURIComponent(e)+`/actions`,{action:n});if(await t().fetchConnectors(),!r.ok)throw Error(r.stderr||`${n} failed`);return r}catch(e){throw t().showError(`Connector Action Failed`,e.message,e),e}},async fetchAnalytics(){try{e({analyticsData:await S(`GET`,`/stats/analytics?period=`+t().analyticsPeriod)})}catch{}},setAnalyticsTab(t){e({analyticsTab:t})},setAnalyticsPeriod(n){e({analyticsPeriod:n}),t().fetchAnalytics()}}),ls=(e,t)=>({workspaces:[],workspaceFocusId:null,workspaceGitState:{},workspaceMergePreview:{},workspaceDiff:{},workspaceOrphans:[],async openWorkspaceFocus(n){e({workspaceFocusId:n}),await t().switchView(`workspaces`)},async fetchWorkspaces(){try{e({workspaces:await S(`GET`,`/workspaces`)})}catch{}},async fetchWorkspaceGitState(t){try{let n=await S(`GET`,`/workspaces/`+encodeURIComponent(t)+`/git-state`);e(e=>({workspaceGitState:{...e.workspaceGitState,[t]:n}}))}catch(n){e(e=>({workspaceGitState:{...e.workspaceGitState,[t]:{available:!1,reason:n.message}}}))}},async fetchWorkspaceMergePreview(t){try{let n=await S(`GET`,`/workspaces/`+encodeURIComponent(t)+`/merge-preview`);e(e=>({workspaceMergePreview:{...e.workspaceMergePreview,[t]:n}}))}catch(n){e(e=>({workspaceMergePreview:{...e.workspaceMergePreview,[t]:{available:!1,reason:n.message}}}))}},async fetchWorkspaceDiff(t){try{let n=await S(`GET`,`/workspaces/`+encodeURIComponent(t)+`/diff`);e(e=>({workspaceDiff:{...e.workspaceDiff,[t]:n}}))}catch(n){e(e=>({workspaceDiff:{...e.workspaceDiff,[t]:{available:!1,reason:n.message}}}))}},async fetchWorkspaceOrphans(){try{e({workspaceOrphans:(await S(`GET`,`/workspaces/orphans`)).orphans??[]})}catch{}},async reclaimWorkspaceOrphan(e){t().openConfirm(`Reclaim Orphan Worktree`,`Remove the orphaned worktree "${e.branch||e.worktreePath}" from disk? It has no live agent.`,async()=>{try{await S(`POST`,`/workspaces/orphans/reclaim`,{worktreePath:e.worktreePath,repoRoot:e.repoRoot,branch:e.branch}),t().showNotification(`Orphan reclaim dispatched`),await Promise.all([t().fetchWorkspaceOrphans(),t().fetchActivityEvents()])}catch(e){t().showError(`Reclaim Failed`,e.message,e)}})},async workspaceAction(e,n){let r=n===`hold-merge`?`Merge held`:n===`resume-merge`?`Merge resumed`:n===`ready`?`Mark ready`:n===`request-review`?`Request review`:n===`merge-plan`?`Mark merge planned`:n===`merge`?`Merge`:n===`abandon`?`Abandon`:`Cleanup`,i=async()=>{try{await S(`POST`,`/workspaces/`+encodeURIComponent(e)+`/actions`,{action:n}),t().showNotification(n===`cleanup`?`Workspace cleanup requested`:n===`merge`?`Workspace merge dispatched`:`Workspace updated: ${r}`),await Promise.all([t().fetchWorkspaces(),t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`Workspace Action Failed`,e.message,e)}};if(n===`cleanup`||n===`abandon`||n===`merge`){let r=t().workspaces.find(t=>t.id===e),a=r?.branch||r?.worktreePath||e;if(n===`merge`){let n=t().workspaceMergePreview[e],r=n&&n.available!==!1?` — ${n.strategy===`pr`?`opens a PR`:`rebases & fast-forwards into ${n.baseRef||`base`}, then deletes the branch`}.`:` — lands the work and deletes the branch.`;t().openConfirm(`Merge Workspace`,`Merge workspace "${a}"?${r}`,i);return}if(n===`cleanup`){await t().fetchWorkspaceGitState(e);let n=t().workspaceGitState[e],r=``;if(n&&n.available!==!1&&!n.missing){let e=n.ahead??0,t=n.dirtyCount??0;(e>0||t>0)&&(r=` ⚠ This destroys ${[e>0?`${e} unmerged commit(s)`:``,t>0?`${t} uncommitted change(s)`:``].filter(Boolean).join(` and `)}.`)}t().openConfirm(`Cleanup Workspace`,`Remove the worktree for "${a}" on the host?${r}`,i);return}t().openConfirm(`Abandon Workspace`,`Abandon workspace "${a}"?`,i);return}await i()},async purgeWorkspace(e){let n=t().workspaces.find(t=>t.id===e),r=n?.branch||n?.worktreePath||e;t().openConfirm(`Purge Workspace Record`,`Permanently remove the record for "${r}"? This only clears the dashboard row — it does not touch disk.`,async()=>{try{await S(`DELETE`,`/workspaces/`+encodeURIComponent(e)),t().showNotification(`Workspace record purged`),await Promise.all([t().fetchWorkspaces(),t().fetchActivityEvents()])}catch(e){t().showError(`Purge Failed`,e.message,e)}})}}),us=(e,t)=>({projectFocusId:null,projectByCwd:{},async openProjectFocus(n){e({projectFocusId:n}),await t().switchView(`projects`)},consumeProjectFocus(){t().projectFocusId!==null&&e({projectFocusId:null})},async fetchProjectForCwd(n){if(!(!n||n in t().projectByCwd))try{let t=await S(`GET`,`/projects/resolve?cwd=`+encodeURIComponent(n));e(e=>({projectByCwd:{...e.projectByCwd,[n]:t.project??null}}))}catch{}}});function ds(e){if(!e||typeof e!=`object`)return[];let t=e;return[...Object.values(t.enabled??{}),...Object.values(t.disabled??{})]}var fs=(e,t)=>({hosts:[],hostsLoading:!1,hostEditModal:{show:!1,hostId:``,label:``,tagsText:``,noLandingWorkspaces:null,maxAgentsText:``,maxLandingSlotsText:``},async setHostAdmission(e,n){try{await S(`PATCH`,`/hosts/`+encodeURIComponent(e)+`/admission`,n),await t().fetchHosts()}catch(e){t().showError(`Failed to Update Host Admission`,e.message,e)}},async setHostGateBudget(e,n){try{return await S(`PATCH`,`/hosts/`+encodeURIComponent(e)+`/gate-budget`,n),await t().fetchHosts(),!0}catch(e){return t().showError(`Failed to Update Gate Budget`,e.message,e),!1}},async fetchHosts(){e({hostsLoading:!0});try{e({hosts:ds(await S(`GET`,`/hosts?mode=verbose`))})}catch(e){t().showError(`Failed to Load Fleet`,e.message,e)}finally{e({hostsLoading:!1})}},openHostEdit(t){e({hostEditModal:{show:!0,hostId:t.id,label:t.label,tagsText:t.tags.join(`, `),noLandingWorkspaces:t.policy?.noLandingWorkspaces??null,maxAgentsText:t.policy?.maxAgents?.toString()??``,maxLandingSlotsText:t.policy?.maxLandingSlots?.toString()??``}})},closeHostEdit(){e({hostEditModal:{show:!1,hostId:``,label:``,tagsText:``,noLandingWorkspaces:null,maxAgentsText:``,maxLandingSlotsText:``}})},async doSaveHostEdit(){let e=t().hostEditModal,n=t().hosts.find(t=>t.id===e.hostId);if(!n)return;let r=e.label.trim(),i=[...new Set(e.tagsText.split(`,`).map(e=>e.trim()).filter(Boolean))],a=e.maxAgentsText.trim(),o=a===``?null:Number(a);if(o!==null&&!(Number.isInteger(o)&&o>=1)){t().showError(`Invalid Agent Cap`,`Max live agents must be a whole number of at least 1, or empty for the default.`);return}let s=e.maxLandingSlotsText.trim(),c=s===``?null:Number(s);if(c!==null&&!(Number.isInteger(c)&&c>=1&&c<=1e3)){t().showError(`Invalid Landing Slots`,`Landing slots must be a whole number from 1 to 1000, or empty for the default.`);return}try{r&&r!==n.label&&await S(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/label`,{label:r}),JSON.stringify(i)!==JSON.stringify(n.tags)&&await S(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/tags`,{tags:i}),e.noLandingWorkspaces!==(n.policy?.noLandingWorkspaces??null)&&await S(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/landing-placement`,{noLandingWorkspaces:e.noLandingWorkspaces}),o!==(n.policy?.maxAgents??null)&&await S(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/agent-cap`,{maxAgents:o}),c!==(n.policy?.maxLandingSlots??null)&&await S(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/landing-cap`,{maxLandingSlots:c}),t().closeHostEdit(),await t().fetchHosts()}catch(e){t().showError(`Failed to Update Host`,e.message,e)}},async acceptHostHardware(e){try{await S(`POST`,`/hosts/`+encodeURIComponent(e)+`/accept-hardware`),await t().fetchHosts()}catch(e){t().showError(`Failed to Accept Host Hardware`,e.message,e)}}});function ps(){return $.persist.hasHydrated()?Promise.resolve():new Promise(e=>{let t=$.persist.onFinishHydration(()=>{t(),e()})})}var $=w()(je((...e)=>({...Bi({waitForHydration:ps})(...e),...Vi(...e),...Dt(...e),...Za(...e),...uo(...e),...fo(...e),...go(...e),...vo(...e),...xo(...e),...So(...e),...Go(...e),...$o(...e),...es(...e),...ns(...e),...rs(...e),...Wr(...e),...is(...e),...ss(...e),...$r(...e),...cs(...e),...ls(...e),...us(...e),...fs(...e),...Wn(...e),...qn(...e),...Tr(...e),...bi(...e),...Si()}),{name:`humwick-dashboard`,storage:Le(()=>localStorage),merge:(e,t)=>{let n={...e};return delete n.sessionRefreshToken,{...t,...n}},partialize:e=>({theme:e.theme,view:e.view===`shipping`||e.view===`workflows`?`overview`:e.view,showOffline:e.showOffline,showBuiltIns:e.showBuiltIns,autoRefresh:e.autoRefresh,lowBandwidth:e.lowBandwidth,voiceTtsEnabled:e.voiceTtsEnabled,voiceTtsLang:e.voiceTtsLang,voiceTtsMode:e.voiceTtsMode,voiceTtsKokoroVoice:e.voiceTtsKokoroVoice,voiceTtsBrowserVoice:e.voiceTtsBrowserVoice,voiceInputMode:e.voiceInputMode,agentSort:e.agentSort,agentSortDir:e.agentSortDir,agentPresetFilter:e.agentPresetFilter,agentStatusFilter:e.agentStatusFilter,agentTagFilter:e.agentTagFilter,agentHostFilter:e.agentHostFilter,pairStatusFilter:e.pairStatusFilter,inboxSort:e.inboxSort,inboxSortDir:e.inboxSortDir,inboxShowArchived:e.inboxShowArchived,chatAgentProviderFilter:e.chatAgentProviderFilter,chatAgentStatusFilter:e.chatAgentStatusFilter,chatAgentTagFilter:e.chatAgentTagFilter,chatAgentCapFilter:e.chatAgentCapFilter,chatAgentHostFilter:e.chatAgentHostFilter,chatAgentSort:e.chatAgentSort,chatAgentSortDir:e.chatAgentSortDir,chatAgentGroupBy:e.chatAgentGroupBy,chatAgentFiltersCollapsed:e.chatAgentFiltersCollapsed,chatCollapsedChildren:e.chatCollapsedChildren,chatExpandedItems:e.chatExpandedItems,feedObserveAll:e.feedObserveAll,coordinatorFollows:e.coordinatorFollows,coordinatorMutes:e.coordinatorMutes,planCollapsed:e.planCollapsed,planSelections:e.planSelections,sessionTasksCollapsed:e.sessionTasksCollapsed,activityFilter:e.activityFilter,analyticsPeriod:e.analyticsPeriod,authToken:e.authToken,sessionUser:e.sessionUser,inboxDrafts:e.inboxDrafts,operatorActivity:e.operatorActivity,notifications:e.notifications,notificationUnread:e.notificationUnread,notificationSettings:e.notificationSettings,spawnOrchId:e.spawnOrchId,spawnProvider:e.spawnProvider,spawnModel:e.spawnModel,spawnEffort:e.spawnEffort,spawnProfile:e.spawnProfile,spawnCwd:e.spawnCwd,spawnApproval:e.spawnApproval,spawnWorkspaceMode:e.spawnWorkspaceMode,spawnCwdHistory:e.spawnCwdHistory})}));$.subscribe(ti);var ms=()=>()=>{};function hs(e,t){return(0,C.useSyncExternalStore)(e?$.subscribe:ms,()=>t($.getState()))}export{Jn as $,ci as A,Jt as At,Cr as B,Ie as Bt,Qi as C,Qt as Ct,ki as D,qt as Dt,Ti as E,Bt as Et,Nr as F,Ge as Ft,br as G,xr as H,Er as I,Ue as It,dr as J,pr as K,jr as L,Re as Lt,Or as M,tt as Mt,Mr as N,T as Nt,Mi as O,Wt as Ot,Ar as P,We as Pt,cr as Q,Dr as R,Ve as Rt,ea as S,j as St,Ji as T,Zt as Tt,vr as U,ur as V,w as Vt,yr as W,Sr as X,hr as Y,mr as Z,G as _,gn as _t,Yo as a,ir as at,$i as b,rn as bt,Wo as c,jn as ct,Qa as d,F as dt,tr as et,Z as f,N as ft,xa as g,hn as gt,la as h,_n as ht,Jo as i,ar as it,Pr as j,A as jt,Ai as k,Gt as kt,Vo as l,P as lt,da as m,pn as mt,hs as n,rr as nt,Ho as o,kn as ot,co as p,yn as pt,fr as q,ts as r,nr as rt,Uo as s,Bn as st,$ as t,$n as tt,po as u,mn as ut,ia as v,M as vt,ra as w,Xt as wt,Zi as x,nn as xt,na as y,fn as yt,kr as z,He as zt};
9
- //# sourceMappingURL=store-DcClXLH0.js.map