@humwick/server 0.130.3 → 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 (112) hide show
  1. package/docs/openapi.json +103 -1
  2. package/package.json +6 -6
  3. package/public/assets/{MessageBubble-Bq9kr21N.js → MessageBubble-BOkmEvgZ.js} +2 -2
  4. package/public/assets/{PlanGraphPanel-Dqiroy06.js → PlanGraphPanel-BkaDJp0r.js} +2 -2
  5. package/public/assets/{TraceView-DYU962-H.js → TraceView-B99Uu2yT.js} +2 -2
  6. package/public/assets/{VaultDecisionCard-DhPfzioE.js → VaultDecisionCard-DUIfTTFF.js} +2 -2
  7. package/public/assets/{activity-DzCcQTee.js → activity-ZIX0N1El.js} +2 -2
  8. package/public/assets/{agent-lineage-SgDt9i3T.js → agent-lineage-kq9TPYFw.js} +2 -2
  9. package/public/assets/agent-liveness-DSQY1Aa_.js +2 -0
  10. package/public/assets/{agent-name-CcY3Aijy.js → agent-name-C_7F4DFR.js} +2 -2
  11. package/public/assets/{agent-profiles-cxtRBn6O.js → agent-profiles-BNOcrGcY.js} +2 -2
  12. package/public/assets/{agent-project-badge-DGYbIhaI.js → agent-project-badge-B6yAh70a.js} +2 -2
  13. package/public/assets/{agent-tools-DHbftV0N.js → agent-tools-CcrhmOzF.js} +2 -2
  14. package/public/assets/{agent-type-icon-CY113sp-.js → agent-type-icon-CXSLrKiq.js} +2 -2
  15. package/public/assets/{agents-BPzY7IlQ.js → agents-DIZG97_X.js} +2 -2
  16. package/public/assets/{analytics-DENFPv_a.js → analytics-rasmoPjR.js} +2 -2
  17. package/public/assets/{artifact-viewer-KRvSc7sl.js → artifact-viewer-tBpTrEPb.js} +2 -2
  18. package/public/assets/{artifacts-C9gSmL3s.js → artifacts-BNkrynP1.js} +2 -2
  19. package/public/assets/{artifacts-DT-HkI5O.js → artifacts-Bjq-ZyBA.js} +2 -2
  20. package/public/assets/{automation-BsmjQhKD.js → automation-Cx422L3L.js} +2 -2
  21. package/public/assets/{backlog-8NYH_62t.js → backlog-RuFQ8PUu.js} +2 -2
  22. package/public/assets/{busy-health-D3hwvYb4.js → busy-health-BvNQ9g5x.js} +2 -2
  23. package/public/assets/{channels-DCJ5WL7O.js → channels-DNbKAS0I.js} +2 -2
  24. package/public/assets/{chat-DAIl357U.js → chat-Bp3Fx73h.js} +2 -2
  25. package/public/assets/{code-preview-CzrZfr9U.js → code-preview-KIRZA6cz.js} +2 -2
  26. package/public/assets/{connectors-xTxtlyou.js → connectors-k7vO4vvc.js} +2 -2
  27. package/public/assets/{cosmos-BpebFLK2.js → cosmos-BuVoq1aw.js} +2 -2
  28. package/public/assets/{crate-agent-BHvI5wXC.js → crate-agent-irqlt4NH.js} +2 -2
  29. package/public/assets/{dependency-graph-DGT0o3wJ.js → dependency-graph-D_rurNBz.js} +2 -2
  30. package/public/assets/{deploys-hqWOHSHE.js → deploys-yzZqIpxE.js} +2 -2
  31. package/public/assets/{display-CDeH4I8T.js → display-BemJG1f_.js} +2 -2
  32. package/public/assets/{files-BTeGVmTg.js → files-DXWcrxOz.js} +2 -2
  33. package/public/assets/{fleet-DgXtNgCa.js → fleet-TEuOCZXE.js} +2 -2
  34. package/public/assets/{fleet-metrics-BHEt5yc_.js → fleet-metrics-BGoDAFI-.js} +2 -2
  35. package/public/assets/{formatted-body-impl-CAe664Z8.js → formatted-body-impl-BB9eq9nN.js} +2 -2
  36. package/public/assets/{formatted-body-MLtodyPp.js → formatted-body-qy2nTD_1.js} +3 -3
  37. package/public/assets/{host-providers-dialog-mapF4Fj9.js → host-providers-dialog-BGPHxuwT.js} +2 -2
  38. package/public/assets/{index-CqqgOI5R.js → index-BC5XZc0z.js} +5 -5
  39. package/public/assets/{index-MYAIwYTX.css → index-D8Rp9pz2.css} +1 -1
  40. package/public/assets/{insights-DNyf7IzF.js → insights-C-KQG0h-.js} +2 -2
  41. package/public/assets/{integrations-DlYOHq7T.js → integrations-ClPRPyKU.js} +2 -2
  42. package/public/assets/{issue-ref-chip-CeWBNWn7.js → issue-ref-chip-DbH8J9Ak.js} +2 -2
  43. package/public/assets/{log-viewer-Cib8nqdE.js → log-viewer-PH4zVn24.js} +2 -2
  44. package/public/assets/{maintenance-DSn1cPm7.js → maintenance-5lV43uTL.js} +2 -2
  45. package/public/assets/{managed-agents-C3CkM81m.js → managed-agents-BdgU35aX.js} +2 -2
  46. package/public/assets/{markdown-preview-W4VQQPAv.js → markdown-preview-DNT4OUwQ.js} +3 -3
  47. package/public/assets/{markdown-preview-impl-CMsTdhjq.js → markdown-preview-impl-CnCcPy0A.js} +2 -2
  48. package/public/assets/{memory-BV17qtO4.js → memory--GgWH1gH.js} +2 -2
  49. package/public/assets/{messages-Bm_1AqSA.js → messages-CzFl_97O.js} +2 -2
  50. package/public/assets/{orchestrators-Dg-vfP09.js → orchestrators-CVvJVkzv.js} +2 -2
  51. package/public/assets/overview-DsrZvE86.js +2 -0
  52. package/public/assets/{pairs-8o9nuG3V.js → pairs-D2d0d2py.js} +2 -2
  53. package/public/assets/{profile-icon-BsRyBMea.js → profile-icon-_SMuSbYF.js} +2 -2
  54. package/public/assets/{project-profile-instructions-DETKFn_E.js → project-profile-instructions-Apn15y43.js} +2 -2
  55. package/public/assets/{projects-M_m6AHws.js → projects-D3B6kto5.js} +2 -2
  56. package/public/assets/{prompt-settings-C_mNCgeL.js → prompt-settings-DnPB6Ez6.js} +2 -2
  57. package/public/assets/provider-display-bWwiuedV.js +2 -0
  58. package/public/assets/{registry-DDHHHE5N.js → registry-D790cIhN.js} +2 -2
  59. package/public/assets/{run-card-Dt4I4jaP.js → run-card-BCro-Odj.js} +2 -2
  60. package/public/assets/{secrets-BkVwxI5O.js → secrets-CVXvfvbU.js} +2 -2
  61. package/public/assets/{service-access-settings-Crq-6a-B.js → service-access-settings-D3Xxqb9w.js} +2 -2
  62. package/public/assets/{settings-CYcavMFu.js → settings-CoUC7Jci.js} +2 -2
  63. package/public/assets/{shipping-H6gzEeZB.js → shipping-D_Lp9n_J.js} +2 -2
  64. package/public/assets/{stats-BJVeWkpV.js → stats-CXiNjB9S.js} +2 -2
  65. package/public/assets/{status-dot-BcHyw1Vw.js → status-dot-C703YIy1.js} +2 -2
  66. package/public/assets/store-BgDALGIX.js +9 -0
  67. package/public/assets/{tasks-qJjlQPpx.js → tasks-DO0WpJCx.js} +2 -2
  68. package/public/assets/{teams-Cd5Sk1uX.js → teams-FGkdi_tL.js} +2 -2
  69. package/public/assets/{terminal-viewer-CpY5_m7W.js → terminal-viewer-Dh8dSC7e.js} +3 -3
  70. package/public/assets/{terminal-viewer-impl-DI_2llFR.js → terminal-viewer-impl-B5Zriip3.js} +2 -2
  71. package/public/assets/{use-agent-terminal-0yJA_buM.js → use-agent-terminal-CRUVDvLC.js} +2 -2
  72. package/public/assets/{use-decisions-uJXHf34W.js → use-decisions-CoaqRh4l.js} +2 -2
  73. package/public/assets/{use-project-list-CpWl6eHQ.js → use-project-list-X-BgT53X.js} +2 -2
  74. package/public/assets/{use-selectors-BdxBW8mL.js → use-selectors-0X_UZkk-.js} +2 -2
  75. package/public/assets/{user-avatar-3IndfpOc.js → user-avatar-CkLhVBGu.js} +2 -2
  76. package/public/assets/{versioned-prompt-editor-CIVg7XB1.js → versioned-prompt-editor-BkTi7eim.js} +2 -2
  77. package/public/assets/{work-queue-B9rnLwHZ.js → work-queue-DDOLEyKo.js} +2 -2
  78. package/public/assets/{workflow-marker-X8wxyhzC.js → workflow-marker-CzOsB8BM.js} +2 -2
  79. package/public/assets/{workflows-o5YyMFW7.js → workflows-DJilvmRM.js} +2 -2
  80. package/public/assets/{workspaces-CzEGoAng.js → workspaces-CHcfbLR3.js} +2 -2
  81. package/public/cosmos.html +4 -4
  82. package/public/index.html +29 -29
  83. package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
  84. package/runner/src/adapters/claude-api.ts +1 -1
  85. package/runner/src/provider-setup.ts +2 -2
  86. package/src/auth/login-link.ts +35 -0
  87. package/src/cli/index.ts +7 -1
  88. package/src/cli/init.ts +53 -0
  89. package/src/cli/orchestrator.ts +1 -7
  90. package/src/cli/setup.ts +6 -4
  91. package/src/db/spawn-delegation.ts +2 -1
  92. package/src/db/workflow-execution.ts +3 -3
  93. package/src/dev.ts +4 -13
  94. package/src/init.ts +299 -0
  95. package/src/invite-link.ts +16 -9
  96. package/src/routes/auth.ts +30 -2
  97. package/src/routes/host-providers.ts +18 -0
  98. package/src/routes/index.ts +5 -2
  99. package/src/routes/orchestrator-bootstrap.ts +2 -0
  100. package/src/routes/secrets-backup.ts +2 -3
  101. package/src/routes/secrets-import.ts +2 -3
  102. package/src/routes/secrets-vault.ts +5 -7
  103. package/src/runtime-install.ts +30 -0
  104. package/src/server.ts +4 -4
  105. package/src/services/auth-context.ts +6 -0
  106. package/src/services/provider-api-key.ts +73 -0
  107. package/src/setup.ts +47 -8
  108. package/src/utils.ts +7 -0
  109. package/public/assets/agent-liveness-Bq-s73jW.js +0 -2
  110. package/public/assets/overview-DcYCrvlr.js +0 -2
  111. package/public/assets/provider-display-BEeLXC_D.js +0 -2
  112. package/public/assets/store-DKPDIZBe.js +0 -9
@@ -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-BEeLXC_D.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-CDeH4I8T.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-Bq-s73jW.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},ke=(e=>e?Oe(e):Oe);function Ae(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 je=e=>t=>{try{let n=e(t);return n instanceof Promise?n:{then(e){return je(e)(n)},catch(e){return this}}}catch(e){return{then(e){return this},catch(t){return je(t)(e)}}}},Me=(e,t)=>(n,r,i)=>{let a={storage:Ae(()=>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 je(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},Ne=e=>Symbol.iterator in e,Pe=e=>`entries`in e,Fe=(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},Ie=(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 Le(e,t){return Object.is(e,t)?!0:typeof e!=`object`||!e||typeof t!=`object`||!t||Object.getPrototypeOf(e)!==Object.getPrototypeOf(t)?!1:Ne(e)&&Ne(t)?Pe(e)&&Pe(t)?Fe(e,t):Ie(e,t):Fe({entries:()=>Object.entries(e)},{entries:()=>Object.entries(t)})}function Re(e){let t=Ae(e);if(!t)return;let n;return{...t,setItem:(e,r)=>{if(!(n!==void 0&&Le(n,r.state)))return n=r.state,t.setItem(e,r)},removeItem:e=>(n=void 0,t.removeItem(e))}}var ze=`worker`,Be=[];function Ve(e){return e!==void 0&&Be.includes(e)}var He=`This runs repo-committed code with this agent's Relay identity token and provider credentials.`,Ue=`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.`,We=`outcome`,Ge=`Done`,Ke=`Could not do it`;function qe(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 Je(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=qe(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 Ye(e){return e.desiredVersion>e.observedVersion}function w(e){return r(n(e?.id??`default`))}function Xe(){return typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 767px)`).matches?4:12}var T=[];function Ze(e){let t=T.indexOf(e);t!==-1&&T.splice(t,1),T.unshift(e)}function Qe(e){let t=T.indexOf(e);t!==-1&&T.splice(t,1)}function $e(e,t){let n=new Set(Object.keys(e)),r=new Set,i=Xe(),a=e=>{e&&n.has(e)&&r.size<i&&r.add(e)};for(let e of t)a(e);for(let e of T)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 T.splice(0,T.length,...T.filter(e=>r.has(e))),o}var et=[`landState`,`landWaitReason`,`landStateAt`,`landBackedOff`];function tt(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=et.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 nt(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 rt(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 D(e,r.length===0?t:[...t,...r])}function it(e){let t={};for(let n of e)t[n.id]=n;return t}function E(e,t){let n=e.findIndex(e=>e.id===t.id),r=[...e];return n>=0?r[n]=t:r.push(t),r}function at(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 ot(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 st=3e3;function ct(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)<=st)?e:(a.push({id:o,status:n,timestamp:r}),a.length>200&&a.splice(0,a.length-200),{...e,[t]:a})}function lt(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 ut=new Set([`compacting`,`compacted`,`clearing-context`,`context-cleared`]);function dt(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 ft(e){let t=e.params?.agentId;return typeof t==`string`&&t?t:typeof e.target==`string`&&e.target?e.target:void 0}function pt(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 mt(e){return JSON.stringify(e)}function ht(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&&mt(t)===mt(e)?t:(r=!0,e)});return r?i:e}function D(e,t){return gt(e,t,e=>e.id)}function gt(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 _t(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)?e:t}function vt(){return typeof document>`u`||document.hidden}function yt(e,t){return!!(e&&t.view===`chat`&&t.selectedInboxThread===e&&!vt())}function bt(e){return e.threadPeer||e.agentId||``}function xt(e,t){return yt(bt(e),t)}function St(e){return e.filter(e=>o(e.to)&&!o(e.from)&&g(e)).reduce((e,t)=>Math.max(e,t.id),0)}function O(e,t){let n;for(let r of t)r in e&&(n??={...e},delete n[r]);return n??e}function Ct(e,t){return e.some(e=>t.has(e))?e.filter(e=>!t.has(e)):e}function wt(e,t){return O(e,Object.keys(e).filter(e=>!t.has(e)))}function Tt(e){return typeof e?.meta?.cwd==`string`?e.meta.cwd:``}function Et(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 Dt(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(Tt).filter(Boolean));for(let e of i)a.delete(Tt(e));let o=n.map(e=>`agent:${e}`),s=t.has(e.compose.to),c=t.has(e.agentDetailId);return{agents:i,agentsById:O(e.agentsById,n),selectedAgent:t.has(e.selectedAgent)?``:e.selectedAgent,agentDetailOpen:!c&&e.agentDetailOpen,agentDetailId:c?``:e.agentDetailId,agentDetailCard:c?null:e.agentDetailCard,livenessMismatches:O(e.livenessMismatches,n),commandStalls:O(e.commandStalls,n),agentChatByAgent:O(e.agentChatByAgent,n),chatStatusEvents:O(e.chatStatusEvents,n),presenceByAgent:O(e.presenceByAgent,n),issueActivityByAgent:O(e.issueActivityByAgent,n),issueLoading:O(e.issueLoading,o),issueErrors:O(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:w(e.sessionUser)}:e.compose,inboxCompose:e.inboxCompose.toMode===`agent`&&t.has(e.inboxCompose.to)?{...de}:e.inboxCompose,coordinatorFollows:Ct(e.coordinatorFollows,t),coordinatorMutes:Ct(e.coordinatorMutes,t),chatCollapsedChildren:Ct(e.chatCollapsedChildren,t),renameModal:t.has(e.renameModal.agentId)?{show:!1,agentId:``,label:``}:e.renameModal,projectByCwd:O(e.projectByCwd,[...a])}}var Ot=(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([...Et(o)].filter(e=>!s.has(e))):new Set;for(let e of c)Qe(e);let l=c.size?Dt(o,c):{},u={...o,...l},d=i?rt(u.agents,a):D(u.agents,a),f=new Set(d.map(Tt).filter(Boolean)),p=wt(u.projectByCwd,f);if(n&&!c.size&&d===o.agents&&p===o.projectByCwd)return;e({...l,agents:d,agentsById:it(d),projectByCwd:p,...n?{}:{_rosterBootstrapped:!0}})}catch{}},setShowOffline(n){t().showOffline!==n&&(e({showOffline:n}),t().fetchAgents(),t().fetchInboxState())},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){Qe(t),e(e=>Dt(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 kt(e,t,n){return t===`agents.changed`?(e.fetchAgents().catch(()=>{}),!0):t===`agent.removed`?(e.removeAgentState(JSON.parse(n).id),!0):!1}function At(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=Pt(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 jt(e){return/\|/.test(e)&&e.trim().length>0}function Mt(e){return/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)+\|?\s*$/.test(e)}function Nt(e){return e.trim().replace(/^\||\|$/g,``).split(`|`).map(e=>e.trim()).filter(e=>e.length>0)}function Pt(e){let t=e.split(`
4
- `),n=[],r=0;for(;r<t.length;){if(jt(t[r])&&r+1<t.length&&Mt(t[r+1])){let e=Nt(t[r]),i=r+2,a=0;for(;i<t.length&&jt(t[i])&&!Mt(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 Ft={ms:`milliseconds`,s:`seconds`,kb:`kilobytes`,mb:`megabytes`,gb:`gigabytes`,tb:`terabytes`};function It(e){return e.split(``).join(` `)}function Lt(e){return e.split(``).map(e=>/[0-9]/.test(e)?e:e.toUpperCase()).join(` `)}var Rt=[{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 ${It(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=>Lt(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} ${Ft[n.toLowerCase()]}`},{name:`ms-unit`,pattern:/\b(\d{1,5})\s?ms\b/g,replace:(e,t)=>`${t} ${Ft.ms}`},{name:`s-unit`,pattern:/\b(\d{1,3})\s?s\b/g,replace:(e,t)=>`${t} ${Ft.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 zt(e){if(!e)return``;let t=e;for(let e of Rt)t=t.replace(e.pattern,e.replace);return t.replace(/[ \t]{2,}/g,` `).trim()}function Bt(e){return zt(At(e))}var Vt=[{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 ♀)`}],Ht=220;function Ut(e){let t=e.match(/[^.!?]+[.!?]*\s*/g)?.map(e=>e.trim()).filter(Boolean)??[e],n=[];for(let e of t){if(e.length<=Ht){n.push(e);continue}let t=e;for(;t.length>Ht;){let e=t.lastIndexOf(` `,Ht);e<=0&&(e=Ht),n.push(t.slice(0,e).trim()),t=t.slice(e).trim()}t&&n.push(t)}return n}function Wt(){return typeof window<`u`&&`speechSynthesis`in window}var k=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 Wt()||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=Bt(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=Bt(e);if(!n)return;this.reset(),this.manual=!0,this.speaking=!0,this.currentChat=null,this.setPlayingKey(t??null);let r=++this.gen,i=Ut(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=Ut(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(!Wt()||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 Gt(){if(!Wt())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 Kt=typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof window<`u`&&`MediaRecorder`in window;function qt(){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 Jt=class{rec=null;chunks=[];stream=null;async start(){this.stream=await navigator.mediaDevices.getUserMedia({audio:!0}),this.chunks=[];let e=qt();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 Yt(e){return((await xe(`/connectors/voice/call/transcribe`,e))?.text??``).trim()}function Xt(){return typeof document<`u`&&document.visibilityState===`hidden`}var A=ke((e,t)=>{let n=()=>{t()._timer||Xt()||e({now:Date.now(),_timer:setInterval(()=>e({now:Date.now()}),1e3)})},r=()=>{let n=t()._timer;n&&clearInterval(n),e({_timer:null})},i=()=>Xt()?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 Zt(e=!0){return A(t=>e?t.now:0)}function Qt(e=3e4){return A(t=>Math.floor(t.now/e))}function $t(e=1e4){return A(t=>Math.floor(t.now/e)*e)}function en(e,t){let{[t]:n,...r}=e;return r}function tn(e,t){return!t||e.desiredVersion>t.desiredVersion||e.desiredVersion===t.desiredVersion&&e.updatedAt>=t.updatedAt}function nn(e){if(!e?.agentId)return;let{states:t}=rn.getState();tn(e,t[e.agentId])&&rn.setState({states:{...t,[e.agentId]:e}})}var rn=ke((e,t)=>({states:{},refused:{},async request(n,r){e({refused:en(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`}});nn(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`);nn(t)},invalidate(){for(let e of Object.keys(t().states))t().load(e).catch(()=>{})},dismiss(n){t().refused[n]&&e({refused:en(t().refused,n)})}}));function an(e){return e&&Ye(e)?e.desiredEffort:void 0}function on(e,t){e===`agent.effort`&&nn(JSON.parse(t))}var sn={changes:[],coveredFrom:null},cn=new Set;function ln(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 j=ke((e,t)=>({byAgent:{},epoch:0,async ensureCovered(n,r){let i=t().byAgent[n]??sn;if(i.coveredFrom!==null&&r>=i.coveredFrom)return;let a=`${n}:${r}`;if(!cn.has(a)){cn.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]??sn,l=c.coveredFrom===null?r:Math.min(c.coveredFrom,r);e({byAgent:{...t().byAgent,[n]:{changes:ln(c.changes,o),coveredFrom:l}}})}catch{}finally{cn.delete(a)}}},note(n){let r=t().byAgent;for(let e of n){let t=r[e.agentId]??sn,n=ln(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=Je(JSON.parse(t).command);n&&j.getState().note([n])}var dn=[];function fn(e,t){let n=j(t=>e?t.byAgent[e]:void 0),r=j(e=>e.epoch),i=n?.coveredFrom??null;return(0,C.useEffect)(()=>{e&&t!==null&&(i===null||t<i)&&j.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=D(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[We]: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`||xt(e,t)?!1:vt()||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=xt(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){k.setEnabled(t),e({voiceTtsEnabled:t})},setVoiceTtsLang(t){k.setLang(t),e({voiceTtsLang:t})},setVoiceTtsMode(t){k.setMode(t),e({voiceTtsMode:t})},setVoiceTtsKokoroVoice(t){k.setKokoroVoice(t),e({voiceTtsKokoroVoice:t})},setVoiceTtsBrowserVoice(t){k.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,k.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[j,rn])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.fetchDeliverableTasks({unfiltered:!0})),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 E(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),k.setEnabled(n().voiceTtsEnabled),k.setLang(n().voiceTtsLang),k.setMode(n().voiceTtsMode),k.setKokoroVoice(n().voiceTtsKokoroVoice),k.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.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(){A.getState().start()},stopClock(){A.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.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=_t(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)),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=_t(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`&&k.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)&&yt(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(E(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(E(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:E(i,ot(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=tt(a,e);if(t({agents:E(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=dt(o);if(e?.status&&ut.has(e.status)&&(e.timestamp??0)>s.ts){let e={...i.commandStalls};delete e[o.id],t({commandStalls:e})}}let c=dt(o),l=c?.status??lt(a,o);if(l){let e=c?.timestamp??Date.now(),n=c?.id||`agent-status:${o.id}:${l}:${e}`;t({chatStatusEvents:ct(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:ct(n().chatStatusEvents,e.agentId,a,r,`command-stalled:${e.agentId}:${e.commandId??r}`)})}return}if(!kt(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=at(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(on(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=pt(i,e);if(r){let e=typeof i.updatedAt==`number`?i.updatedAt:typeof i.createdAt==`number`?i.createdAt:Date.now();t({chatStatusEvents:ct(n().chatStatusEvents,ft(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=E(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(E(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=D(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:$e({...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 D(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=ht(t().messages,i);a!==t().messages&&e({messages:a});let o=t(),s=o.selectedInboxThread;if(yt(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;Ze(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:D(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(n){try{let r=t().agentsById[n]?.meta?.spawnRequestId,i=new URLSearchParams({targetAgentId:n,limit:`50`});typeof r==`string`&&r&&i.set(`targetSpawnRequestId`,r);let a=D(t().chatHistoryImports,(await S(`GET`,`/chat/history-imports?`+i.toString())).reduce(E,t().chatHistoryImports));a!==t().chatHistoryImports&&e({chatHistoryImports:a})}catch{}},async fetchInboxState(){try{let n=!t().showOffline,r=await S(`GET`,`/inbox/state?operatorId=`+encodeURIComponent(w(t().sessionUser))+(n?`&excludeOffline=1`:``)),i={},a={},o={};for(let e of r?.threads||[])e.readCursorMessageId&&(i[e.peerId]=e.readCursorMessageId),e.archivedAtMessageId&&(a[e.peerId]=e.archivedAtMessageId);for(let e of r?.drafts||[])e.body&&(o[e.peerId]=e.body);if(n){let e=e=>t().agentsById[e]?.status===`offline`,n=(t,n)=>Object.fromEntries([...Object.entries(t).filter(([t])=>e(t)&&!(t in n)),...Object.entries(n)]);Object.assign(i,n(t().inboxReadCursors,i)),Object.assign(a,n(t().inboxArchivedThreads,a))}let s=t(),c={};Le(s.inboxReadCursors,i)||(c.inboxReadCursors=i),Le(s.inboxArchivedThreads,a)||(c.inboxArchivedThreads=a),Object.keys(s.inboxDrafts).length===0&&!Le(s.inboxDrafts,o)&&(c.inboxDrafts=o),Object.keys(c).length&&e(c)}catch{}},openCompose(){e({composeOpen:!0,compose:{...b,from:w(t().sessionUser)}})},openComposeToAgent(n){e({replyTo:null,compose:{...b,from:w(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:w(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||w(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===w(t().sessionUser)&&e.emoji===r),a=await S(`POST`,`/messages/`+n.id+`/reactions`,{actorId:w(t().sessionUser),emoji:r,action:i?`remove`:`add`});e({messages:z(E(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:w(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:w(t().sessionUser),to:a,kind:`chat`,body:n.trim()||`Attachment`,...r.lastMessage?.channel?{channel:r.lastMessage.channel}:{},payload:i.length?{attachments:i}:{},readBy:[w(t().sessionUser)],createdAt:Date.now()};e(e=>q(e,a,e=>({messages:[...e.messages,u]})));try{let o={from:w(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(w(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:w(t().sessionUser),peerId:n,readCursorMessageId:r}).catch(()=>{}))},markInboxThreadRead(e,n){!e||!n.length||t().markInboxThreadReadTo(e,St(n))},markInboxThreadUnread(n){let r={...t().inboxReadCursors};delete r[n],e({inboxReadCursors:r}),S(`PATCH`,`/inbox/threads`,{operatorId:w(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:w(t().sessionUser),peerId:n,archivedAtMessageId:r}).catch(()=>{})},unarchiveInboxThread(n){let r={...t().inboxArchivedThreads};delete r[n],e({inboxArchivedThreads:r}),S(`PATCH`,`/inbox/threads`,{operatorId:w(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:w(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(w(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:w(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=D(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=E(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=D(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=D(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=D(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})}},async updateWorkflowPins(e,n){await t(`/workflows/runs/${encodeURIComponent(e)}/resume`,{pins:n}),r().fetchWorkflowLiveRuns(),r().view===`workflows`&&await c()},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=>!Ve(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:ze,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=D(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:w(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()])}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:ze,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=gt(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:ze,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:w(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=_t(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 $=ke()(Me((...e)=>({...Bi({waitForHydration:ps})(...e),...Vi(...e),...Ot(...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:Re(()=>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,Yt as At,Cr as B,Le as Bt,Qi as C,$t as Ct,ki as D,Jt as Dt,Ti as E,Vt as Et,Nr as F,Ke as Ft,br as G,xr as H,Er as I,We as It,dr as J,pr as K,jr as L,ze as Lt,Or as M,nt as Mt,Mr as N,w as Nt,Mi as O,Gt as Ot,Ar as P,Ge as Pt,cr as Q,Dr as R,He as Rt,ea as S,A as St,Ji as T,Qt as Tt,vr as U,ur as V,ke 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,an 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,k as jt,Ai as k,Kt 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,Zt as wt,Zi as x,rn as xt,na as y,fn as yt,kr as z,Ue as zt};
9
- //# sourceMappingURL=store-DKPDIZBe.js.map