@midhunxavier/code-flow 0.0.0-stage → 0.1.0-preview.1

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 (284) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -2
  3. package/bin/codeflow.mjs +8 -0
  4. package/bin/launcher.mjs +127 -0
  5. package/dist/remote-host.json +1 -0
  6. package/licenses/inter.txt +92 -0
  7. package/licenses/preact.txt +21 -0
  8. package/licenses/signals-core.txt +21 -0
  9. package/licenses/signals.txt +21 -0
  10. package/licenses/typescript-notices.txt +193 -0
  11. package/licenses/typescript.txt +55 -0
  12. package/licenses/uqr.txt +22 -0
  13. package/licenses/xterm-fit.txt +19 -0
  14. package/licenses/xterm.txt +21 -0
  15. package/package.json +34 -4
  16. package/public/assets/browser-7XI52A6V.js +8 -0
  17. package/public/assets/changes-EYFPASEI.js +1 -0
  18. package/public/assets/chunk-7H3ZLTKA.js +2 -0
  19. package/public/assets/chunk-L7TUCIYF.js +1 -0
  20. package/public/assets/chunk-LLMQG23J.js +163 -0
  21. package/public/assets/main-KIRM2OEK.js +1 -0
  22. package/public/assets/settings-QJZVW22Y.js +9 -0
  23. package/public/assets/styles-615EBB20.css +32 -0
  24. package/public/assets/terminal-A2FI2NAX.js +62 -0
  25. package/public/assets.json +1 -0
  26. package/public/bundle-meta.json +1 -0
  27. package/public/docs/.nojekyll +0 -0
  28. package/public/docs/accessibility.html +19 -0
  29. package/public/docs/acp-agents.html +117 -0
  30. package/public/docs/agent-containers.html +79 -0
  31. package/public/docs/api.html +1130 -0
  32. package/public/docs/app.js +342 -0
  33. package/public/docs/application-improvements.html +275 -0
  34. package/public/docs/architecture-explorer.html +19 -0
  35. package/public/docs/architecture.html +149 -0
  36. package/public/docs/auto-team.html +142 -0
  37. package/public/docs/automations.html +109 -0
  38. package/public/docs/checkpoint-review.html +37 -0
  39. package/public/docs/code-hosts.html +35 -0
  40. package/public/docs/code-intelligence.html +35 -0
  41. package/public/docs/configuration.html +346 -0
  42. package/public/docs/context-inspection.html +23 -0
  43. package/public/docs/coordinated-changes.html +28 -0
  44. package/public/docs/deferred-runs.html +25 -0
  45. package/public/docs/dependency-discovery.html +19 -0
  46. package/public/docs/documentation.html +84 -0
  47. package/public/docs/dynamic-teams-evaluation.html +174 -0
  48. package/public/docs/dynamic-teams-implementation-plan.html +882 -0
  49. package/public/docs/dynamic-teams-implementation-review-1.html +141 -0
  50. package/public/docs/dynamic-teams-plan-review-0.html +204 -0
  51. package/public/docs/extensions.html +42 -0
  52. package/public/docs/external-sources.html +96 -0
  53. package/public/docs/filesystem-policy.html +26 -0
  54. package/public/docs/filtered-tasks.html +44 -0
  55. package/public/docs/font-license.txt +92 -0
  56. package/public/docs/getting-started.html +118 -0
  57. package/public/docs/github-review-threads.html +26 -0
  58. package/public/docs/github.html +157 -0
  59. package/public/docs/help.html +69 -0
  60. package/public/docs/index.html +77 -0
  61. package/public/docs/installation.html +74 -0
  62. package/public/docs/launch-profiles.html +48 -0
  63. package/public/docs/maintenance.html +60 -0
  64. package/public/docs/memory-claims.html +31 -0
  65. package/public/docs/memory-storage.html +58 -0
  66. package/public/docs/notifications.html +39 -0
  67. package/public/docs/patterns.html +195 -0
  68. package/public/docs/performance-results.html +210 -0
  69. package/public/docs/performance.html +166 -0
  70. package/public/docs/project-conventions.html +22 -0
  71. package/public/docs/project-first-navigation-plan.html +587 -0
  72. package/public/docs/project-teams-implementation-plan.html +772 -0
  73. package/public/docs/project-teams.html +99 -0
  74. package/public/docs/provider-compatibility.html +20 -0
  75. package/public/docs/releasing.html +61 -0
  76. package/public/docs/remote-workers.html +64 -0
  77. package/public/docs/review-inbox.html +26 -0
  78. package/public/docs/run-storage.html +23 -0
  79. package/public/docs/runs.html +141 -0
  80. package/public/docs/search.json +1 -0
  81. package/public/docs/security.html +133 -0
  82. package/public/docs/shared-projects.html +31 -0
  83. package/public/docs/ssh-projects.html +60 -0
  84. package/public/docs/style.css +768 -0
  85. package/public/docs/task-reruns.html +30 -0
  86. package/public/docs/team-collaboration.html +379 -0
  87. package/public/docs/verification.html +22 -0
  88. package/public/docs/vscode.html +53 -0
  89. package/public/docs/worker-permission-verification.html +122 -0
  90. package/public/index.html +17 -0
  91. package/scripts/check-node.mjs +7 -0
  92. package/scripts/codeflow.mjs +55 -0
  93. package/scripts/pty.py +273 -0
  94. package/src/acp-connections.js +110 -0
  95. package/src/adapters/acp-presets.js +37 -0
  96. package/src/adapters/acp-types.js +0 -0
  97. package/src/adapters/acp.js +328 -0
  98. package/src/adapters/agy-auth.js +67 -0
  99. package/src/adapters/agy-isolation.js +223 -0
  100. package/src/adapters/agy.js +297 -0
  101. package/src/adapters/claude.js +220 -0
  102. package/src/adapters/codex-app-server.js +518 -0
  103. package/src/adapters/codex.js +299 -0
  104. package/src/adapters/errors.js +57 -0
  105. package/src/adapters/index.js +91 -0
  106. package/src/adapters/managed-permissions.js +37 -0
  107. package/src/adapters/model-discovery.js +100 -0
  108. package/src/adapters/process.js +418 -0
  109. package/src/adapters/team-tools.js +102 -0
  110. package/src/adapters/types.js +0 -0
  111. package/src/agent-container.js +155 -0
  112. package/src/approvals.js +121 -0
  113. package/src/architecture.js +456 -0
  114. package/src/assets.js +44 -0
  115. package/src/automation.js +901 -0
  116. package/src/certificate-renewal.js +75 -0
  117. package/src/chat-handoff.js +55 -0
  118. package/src/checkpoint-review.js +72 -0
  119. package/src/checks.js +303 -0
  120. package/src/code-host-git.js +102 -0
  121. package/src/code-hosts-api.js +99 -0
  122. package/src/code-hosts.js +482 -0
  123. package/src/code-intelligence-worker.mjs +452 -0
  124. package/src/code-intelligence.js +141 -0
  125. package/src/collab/api.js +365 -0
  126. package/src/collab/checkpoints.js +198 -0
  127. package/src/collab/connections.js +139 -0
  128. package/src/collab/host-execution.js +347 -0
  129. package/src/collab/hub-client.js +210 -0
  130. package/src/collab/link-api.js +229 -0
  131. package/src/collab/link.js +595 -0
  132. package/src/collab/model.js +496 -0
  133. package/src/collab/runner.js +1014 -0
  134. package/src/collab/store.js +1452 -0
  135. package/src/collab/terminals.js +361 -0
  136. package/src/collaboration-reviews.js +116 -0
  137. package/src/config.js +48 -0
  138. package/src/context-budget.js +14 -0
  139. package/src/context-inspection.js +204 -0
  140. package/src/context.js +154 -0
  141. package/src/conventions.js +283 -0
  142. package/src/coordinated-api.js +247 -0
  143. package/src/deferred-launch.js +82 -0
  144. package/src/deferred-runs.js +515 -0
  145. package/src/dependency-health.js +35 -0
  146. package/src/diff.js +43 -0
  147. package/src/docs-help.js +316 -0
  148. package/src/doctor.js +232 -0
  149. package/src/engine.js +4366 -0
  150. package/src/env.js +44 -0
  151. package/src/experience.js +50 -0
  152. package/src/extensions.js +144 -0
  153. package/src/filesystem-access.js +107 -0
  154. package/src/filesystem-policy.js +238 -0
  155. package/src/filtered-task-limits.js +93 -0
  156. package/src/filtered-tasks-api.js +53 -0
  157. package/src/filtered-tasks.js +576 -0
  158. package/src/fs.js +57 -0
  159. package/src/git.js +626 -0
  160. package/src/github-review-threads.js +181 -0
  161. package/src/github.js +538 -0
  162. package/src/http.js +69 -0
  163. package/src/improve-settings.js +38 -0
  164. package/src/improve.js +187 -0
  165. package/src/integrations.js +373 -0
  166. package/src/integrity.js +259 -0
  167. package/src/journey-api.js +77 -0
  168. package/src/journey-replay.js +65 -0
  169. package/src/journey-store.js +97 -0
  170. package/src/journeys.js +60 -0
  171. package/src/json.js +81 -0
  172. package/src/launch-profiles.js +292 -0
  173. package/src/learnings.js +80 -0
  174. package/src/log.js +39 -0
  175. package/src/maintenance.js +335 -0
  176. package/src/memory-analysis.js +182 -0
  177. package/src/memory-claims.js +153 -0
  178. package/src/memory-sqlite.js +236 -0
  179. package/src/memory.js +552 -0
  180. package/src/merge-validation.js +58 -0
  181. package/src/model-catalog.js +238 -0
  182. package/src/model-research.js +91 -0
  183. package/src/notes.js +176 -0
  184. package/src/notifications.js +413 -0
  185. package/src/patterns/auto-team-model.js +212 -0
  186. package/src/patterns/auto-team.js +659 -0
  187. package/src/patterns/council.js +199 -0
  188. package/src/patterns/debate.js +188 -0
  189. package/src/patterns/findings.js +141 -0
  190. package/src/patterns/index.js +19 -0
  191. package/src/patterns/loop.js +158 -0
  192. package/src/patterns/pipeline.js +125 -0
  193. package/src/patterns/prompts.js +181 -0
  194. package/src/patterns/race.js +147 -0
  195. package/src/patterns/schemas.js +40 -0
  196. package/src/patterns/solo.js +49 -0
  197. package/src/patterns/supervisor.js +235 -0
  198. package/src/patterns/task-draft.js +29 -0
  199. package/src/patterns/tdd.js +231 -0
  200. package/src/patterns/team-strategies.js +67 -0
  201. package/src/performance.js +43 -0
  202. package/src/persistence-status.js +35 -0
  203. package/src/phone-sessions.js +96 -0
  204. package/src/preview-overlay.js +383 -0
  205. package/src/preview.js +219 -0
  206. package/src/privacy.js +23 -0
  207. package/src/project-report.js +22 -0
  208. package/src/project-team-model.js +178 -0
  209. package/src/project-team-policy.js +42 -0
  210. package/src/project-team-store.js +213 -0
  211. package/src/project-teams-api.js +36 -0
  212. package/src/project-teams.js +551 -0
  213. package/src/projects.js +286 -0
  214. package/src/provider-eligibility.js +9 -0
  215. package/src/readiness.js +98 -0
  216. package/src/remote-tls.js +66 -0
  217. package/src/remote-workers/bundles.js +198 -0
  218. package/src/remote-workers/client.js +332 -0
  219. package/src/remote-workers/durability.js +37 -0
  220. package/src/remote-workers/protocol.js +68 -0
  221. package/src/remote-workers/stdio.js +138 -0
  222. package/src/remote-workers/worker.js +304 -0
  223. package/src/remote.js +204 -0
  224. package/src/repo-config.js +201 -0
  225. package/src/repo-coordination.js +732 -0
  226. package/src/repo-tree.js +106 -0
  227. package/src/retention-policy.js +466 -0
  228. package/src/review-inbox.js +38 -0
  229. package/src/routing.js +49 -0
  230. package/src/run-analysis.js +111 -0
  231. package/src/run-cold-store.js +231 -0
  232. package/src/run-environment.js +15 -0
  233. package/src/run-history.js +91 -0
  234. package/src/run-log.js +160 -0
  235. package/src/run-permissions.js +110 -0
  236. package/src/run-projection.js +75 -0
  237. package/src/run-recovery.js +53 -0
  238. package/src/run-status.js +54 -0
  239. package/src/serve.js +138 -0
  240. package/src/server.js +2738 -0
  241. package/src/shared-access.js +103 -0
  242. package/src/shared-accounts.js +301 -0
  243. package/src/shared-api.js +239 -0
  244. package/src/shell.js +346 -0
  245. package/src/ship.js +344 -0
  246. package/src/slots.js +74 -0
  247. package/src/snapshot.js +388 -0
  248. package/src/source-context.js +17 -0
  249. package/src/sse-writer.js +70 -0
  250. package/src/ssh-projects/bootstrap.mjs +95 -0
  251. package/src/ssh-projects/config.js +45 -0
  252. package/src/ssh-projects/gateway.js +143 -0
  253. package/src/ssh-projects/manager.js +320 -0
  254. package/src/ssh-projects/team-autostart.mjs +93 -0
  255. package/src/ssh-projects/team-remove.mjs +69 -0
  256. package/src/ssh-projects/team-status.mjs +39 -0
  257. package/src/ssh-projects/transport.js +116 -0
  258. package/src/stats.js +139 -0
  259. package/src/store.js +544 -0
  260. package/src/stream.js +91 -0
  261. package/src/sweeps.js +241 -0
  262. package/src/tailscale.js +101 -0
  263. package/src/task-draft.js +23 -0
  264. package/src/team-evaluation.js +242 -0
  265. package/src/team-mailbox.js +160 -0
  266. package/src/team-memory.js +84 -0
  267. package/src/team-rerun-graph.js +15 -0
  268. package/src/team-reruns.js +130 -0
  269. package/src/team-scheduler.js +121 -0
  270. package/src/team-template-store.js +98 -0
  271. package/src/team-templates.js +117 -0
  272. package/src/team-tool-client.mjs +79 -0
  273. package/src/team-tools.js +176 -0
  274. package/src/teams.js +0 -0
  275. package/src/templates.js +62 -0
  276. package/src/transcript.js +134 -0
  277. package/src/verification-integrity.js +27 -0
  278. package/src/verification.js +183 -0
  279. package/src/watch.js +195 -0
  280. package/src/work-queue.js +47 -0
  281. package/src/workflow-control.js +83 -0
  282. package/src/workspace-api.js +207 -0
  283. package/src/workspace-changes.js +61 -0
  284. package/src/workspace.js +146 -0
@@ -0,0 +1,8 @@
1
+ import{I as Ae,k as W,l as Me,m as Ce}from"./chunk-LLMQG23J.js";import{Bd as Se,K as he,M as G,Na as me,P as V,Pb as we,Qb as ve,Rb as ye,U as pe,Ub as ke,V as ge,Vb as J,Wa as fe,Wb as D,Xa as be,Yb as se,Za as ee,bb as ne,d as B,da as _,eb as te,ga as n,h as P,ha as H,i as I,k as U,p as ue,rd as $e,wd as xe,xd as ae,yd as q,zd as X}from"./chunk-7H3ZLTKA.js";var Le={phone:"390px",tablet:"768px",full:"100%"},Ee=/^https?:\/\/(localhost|127\.0\.0\.1|\[::1\])(:\d+)?(\/|$)/i,ie=ue({}),O=e=>ie.value[e]??{pins:[],console:[],capturing:0},b=(e,t)=>ie.value={...ie.value,[e]:t(O(e))},Te=e=>({showSnap:!1,snapping:!1,snapError:void 0,snapAsk:(e.snapAsk??0)+1,snapAsking:void 0}),re=(e,t)=>{if(!e||!t)return!1;try{return new URL(e).href===new URL(t).href}catch{return e===t}},Ie=(e,t)=>!!e&&(re(e.asked,t)||re(e.url,t)),j=new Map;function Y(e){let t=e.trim();return t?(/^https?:\/\//i.test(t)||(t=/^(localhost|127\.|\[::1\]|\d+\.\d+\.\d+\.\d+)/.test(t)?`http://${t}`:`https://${t}`),V&&(t=t.replace("//localhost:",`//${location.hostname}:`).replace("//127.0.0.1:",`//${location.hostname}:`)),t):""}var Pe=e=>e.replace(/^https?:\/\//,"").replace(/\/$/,"")||"New page",oe=()=>`p${Date.now().toString(36)}${Math.random().toString(36).slice(2,5)}`;function Re(e,t,u){if(!(typeof e!="string"||e!==t&&!e.startsWith(`${t}/`)))return u+e.slice(t.length)}function cn(){let e=ye.value,t=J.value,[u,d]=P([]),[r,g]=P("off"),[y,$]=P(!1),[S,C]=P(0);pe(i=>he("/api/serve").then(l=>i()&&d(l),()=>{}),5e3,[],fe.value&&be.value==="browser");let A=u.filter(i=>i.status==="running"),a=(i,l)=>i===l||i.startsWith(`${l}/`),M=e.run?e.run.worktrees.map(i=>i.path):[e.repo,...e.project?.repos??[]].filter(Boolean),k=A.filter(i=>M.some(l=>a(i.cwd,l))),f=t.pages??(t.url?[{id:"p0",url:t.url}]:[]),s=f.find(i=>i.id===t.page)??f[0],h=t.compare&&t.compare!==s?.id?f.find(i=>i.id===t.compare):void 0,o=t.device??"full";I(()=>{if(t.pages||t.url)return;let i=(k[0]?Y(k[0].url):"")||(e.run?ke.value[we(e.run)]?.pages?.[0]?.url:"")||"";i&&D({pages:[{id:oe(),url:i}]})},[e.key,f.length,k[0]?.url]);let c=i=>{let l=f.find(F=>F.url===i);if(l)return D({page:l.id});let x=oe();D({pages:[...f,{id:x,url:i}],page:x})},w=i=>{let l=Y(i);if(l){if(!s)return c(l);b(`${e.key}|${s.id}`,x=>({...x,at:void 0,...Te(x)})),D({pages:f.map(x=>x.id===s.id?{...x,url:l}:x)}),C(x=>x+1)}},R=i=>{let l=f.filter(x=>x.id!==i);D({pages:l,page:s?.id===i?l.at(-1)?.id:s?.id,compare:t.compare===i?void 0:t.compare})},v=async(i,l)=>{try{let x=await G(`/api/runs/${i.id}/worktrees/${encodeURIComponent(l)}/serve`,{});c(Y(x.url))}catch(x){_(x.message,6e3)}},p=s?`${e.key}|${s.id}`:"",m=p?O(p):void 0,N=m?.console.filter(i=>i.level!=="warn").length??0,T=!!s?.url&&Ee.test(s.url)&&!V,Q=!!s?.url&&!!m?.preview&&!!m?.ready&&!m.showSnap;I(()=>g("off"),[p,Q]);let Z=U(null),le=async(i=m?.snap?.full??!1)=>{if(!s?.url)return!1;let l=p,x=O(l).pins.filter(L=>L.source==="snapshot").length;if(x&&!await Se(`A new snapshot drops the ${x===1?"box":`${x} boxes`} drawn on this one. Take it anyway?`,{title:"Replace annotated snapshot?",confirmLabel:"Take new snapshot",danger:!0}))return!1;let F=O(l).at??s.url,de=Z.current?.querySelector(":scope > .browse-page:not([hidden])")??Z.current,Be=o==="phone"?390:o==="tablet"?768:Math.min(2560,Math.max(320,de?.clientWidth||1280)),Ue=o==="phone"?844:o==="tablet"?1024:Math.min(1600,Math.max(480,de?.clientHeight||800)),K=(O(l).snapAsk??0)+1;b(l,L=>({...L,showSnap:!0,snapping:!0,snapError:void 0,snapAsk:K,snapAsking:F}));try{let L=await G("/api/snapshot",{url:F,width:Be,height:Ue,full:i});b(l,E=>E.snapAsk!==K?E:{...E,snapping:!1,snapAsking:void 0,snap:{...L,image:`data:image/png;base64,${L.image}`,full:i,asked:F},pins:E.pins.filter(He=>He.source!=="snapshot")})}catch(L){b(l,E=>E.snapAsk!==K?E:{...E,snapping:!1,snapAsking:void 0,snapError:L.message})}return!0},z=m?.at??s?.url,je=()=>{if(!m)return;let i=()=>b(p,l=>({...l,showSnap:!0}));if(m.showSnap)return b(p,l=>({...l,showSnap:!1}));if(m.snapping?re(m.snapAsking,z):Ie(m.snap,z))return i();le().then(l=>!l&&O(p).snap&&i())},Ne=f.map(i=>({key:i.id,label:Pe(O(`${e.key}|${i.id}`).at??i.url),title:i.url||"New page",below:i.id===h?.id})),ce=e.run?e.run.worktrees.filter(i=>!A.some(l=>l.key===`${e.run.id}/${i.name}`)):[];return n(B,{children:[n(xe,{items:Ne,active:s?.id,onPick:i=>D({page:i}),onClose:R,label:"Open pages",children:[n(ae,{label:"New page",icon:"plus",title:"Open a page: an app that's running, or any address",children:i=>n(B,{children:[n(q,{sub:"Type an address",onClick:()=>{i();let l=oe();D({pages:[...f,{id:l,url:""}],page:l})},children:"New page"}),A.length?n(X,{children:"Running apps"}):null,[...k,...A.filter(l=>!k.includes(l))].map(l=>n(q,{sub:`${l.command} in ${ge(l.cwd)}`,onClick:()=>{i(),c(Y(l.url))},children:Pe(l.url)},l.key)),e.run&&ce.length?n(X,{children:"Run the app in"}):null,e.run?ce.map(l=>n(q,{disabled:!e.run.app?.command,sub:e.run.app?.command?`${e.run.app.command} on a free port`:"Set how to start it under the result (Run app) first",onClick:()=>{i(),v(e.run,l.name)},children:["\u25B6 ",l.name]},l.name)):null]})}),n("button",{type:"button",class:`icon-btn ${h?"on":""}`,"aria-pressed":!!h,"aria-label":"Compare",title:f.length<2?"Open a second page (another worktree's app, say) to compare side by side":h?"One page":"Side by side with the next page",disabled:f.length<2,onClick:()=>D({compare:h?void 0:f.find(i=>i.id!==s?.id)?.id}),children:n(H,{name:"compare"})})]}),s?n(Fe,{url:m?.at??s.url,onGo:w,onReload:()=>{b(p,i=>({...i,...Te(i)})),C(i=>i+1)},device:o,onDevice:i=>D({device:i}),mode:r,onMode:g,canAnnotate:Q,why:m?.why??(T?"Waiting for the page":"Annotating works on apps on this computer (localhost)"),errors:N,showConsole:y,onConsole:()=>$(!y),snapshotOn:!!m?.showSnap,onSnapshot:je},`${s.id}:${s.url}`):null,s?.url?n(Ce,{pageKey:p,url:z||s.url,repository:e.repo,width:o==="phone"?390:o==="tablet"?768:1280,ready:Q,toggle:i=>{g("off"),j.get(p)?.({type:"recording",active:i})}},p):null,n("div",{class:`browse ${h?"compare":""}`,ref:Z,children:!s||!s.url?n("div",{class:"browse-empty",children:[n("p",{children:["Open the app a run started with ",n("b",{children:"Run app"}),", or type an address."]}),n("p",{class:"help",children:["Apps on this computer (localhost) can be annotated: pick an element or draw a box, say what's wrong, and send it to the agent with a snapshot. For any other page, take a ",n("b",{children:"Snapshot"})," and draw boxes on that."]})]}):n(B,{children:[m?.showSnap?n(Ge,{pageKey:p,state:m,here:z,onTake:i=>void le(i),onLive:()=>b(p,i=>({...i,showSnap:!1}))}):null,n(De,{pageKey:p,url:s.url,device:o,mode:r,onModeOff:()=>g("off"),hidden:!!m?.showSnap},`${p}#${S}`),h?.url?n(De,{pageKey:`${e.key}|${h.id}`,url:h.url,device:o,mode:"off",onModeOff:()=>{}},`${e.key}|${h.id}#${S}`):null]})}),y&&m?n(_e,{pageKey:p,lines:m.console}):null,m&&(m.pins.length||m.capturing)?n(Ze,{scope:e,pageKey:p,state:m,onSent:()=>g("off")}):null]})}function Fe(e){let[t,u]=P(e.url);I(()=>u(e.url),[e.url]);let d=r=>e.onMode(e.mode===r?"off":r);return n(B,{children:[n("div",{class:"side-toolbar browse-bar",children:[n("input",{type:"url",class:"field mono","aria-label":"Address",placeholder:"localhost:3000, or an address\u2026",value:t,onInput:r=>u(r.currentTarget.value),onKeyDown:r=>r.key==="Enter"&&e.onGo(t)}),n("button",{type:"button",class:"icon-btn",title:"Reload","aria-label":"Reload",disabled:!e.url,onClick:e.onReload,children:n(H,{name:"refresh"})}),n("a",{class:`icon-btn ${e.url?"":"off"}`,href:e.url||"#",target:"_blank",rel:"noreferrer",title:"Open in a new tab","aria-label":"Open in a new tab","aria-disabled":!e.url,children:n(H,{name:"external"})})]}),n("div",{class:"browse-tools",children:[n("div",{class:"segmented small",role:"group","aria-label":"Width",children:["phone","tablet","full"].map(r=>n("button",{type:"button",class:e.device===r?"on":"","aria-pressed":e.device===r,title:r==="full"?"As wide as the panel":`${Le[r]} wide`,onClick:()=>e.onDevice(r),children:r==="phone"?"Phone":r==="tablet"?"Tablet":"Full"},r))}),n("span",{class:"spacer"}),n("button",{type:"button",class:`btn ghost small annotate ${e.mode==="pick"?"on":""}`,"aria-pressed":e.mode==="pick",disabled:!e.canAnnotate,title:e.canAnnotate?"Click an element in the page to comment on it (Esc stops)":e.why,onClick:()=>d("pick"),children:"Pick"}),n("button",{type:"button",class:`btn ghost small annotate ${e.mode==="box"?"on":""}`,"aria-pressed":e.mode==="box",disabled:!e.canAnnotate,title:e.canAnnotate?"Drag a box over an area of the page to comment on it":e.why,onClick:()=>d("box"),children:"Box"}),n("button",{type:"button",class:`btn ghost small ${e.errors?"danger":""}`,"aria-pressed":e.showConsole,disabled:!e.canAnnotate,title:e.canAnnotate?"Console errors and failed requests from the page":e.why,onClick:e.onConsole,children:["Console",e.errors?` \xB7 ${e.errors}`:""]}),n("button",{type:"button",class:`btn ghost small annotate ${e.snapshotOn?"on":""}`,"aria-pressed":e.snapshotOn,disabled:!/^https?:\/\//i.test(e.url),title:e.snapshotOn?"Back to the live page":"A screenshot of the page, any page, to draw boxes on (taken by a headless Chrome, signed out)",onClick:e.onSnapshot,children:"Snapshot"})]})]})}function De({pageKey:e,url:t,device:u,mode:d,onModeOff:r,hidden:g=!1}){let y=U(null),[$,S]=P(null),[C,A]=P(""),a=Ee.test(t)&&!V,M=a?new URL(t).origin:"";I(()=>{let o=!0;return A(""),b(e,c=>({...c,ready:!1,why:a?"Waiting for the page":"Annotating works on apps on this computer (localhost)"})),a?(G("/api/preview",{url:t}).then(c=>{o&&(S({src:c.url,origin:c.origin}),b(e,w=>({...w,preview:!0})))},c=>{if(!o)return;let w=/code-flow itself/.test(c.message)?"This is code-flow itself, so it can't be annotated here. Open your app: Run app on a run, or its localhost address.":`${c.message}: showing it without annotations.`;A(w),b(e,R=>({...R,why:w})),S({src:t}),b(e,R=>({...R,preview:!1}))}),()=>{o=!1}):(b(e,c=>({...c,preview:!1})),S({src:t}))},[t]);let k=U();k.current=$?.origin;let f=U(d);f.current=d;let s=o=>{k.current&&y.current?.contentWindow?.postMessage({codeflow:1,...o},k.current)};I(()=>{j.set(e,s);let o=c=>{let w=k.current;if(!w||c.source!==y.current?.contentWindow||c.origin!==w||c.data?.codeflow!==1)return;let R=f.current,v=c.data;if(v.type==="ready"||v.type==="location"){let p=Re(v.url,w,M);p&&b(e,m=>({...m,at:p})),v.type==="ready"&&b(e,m=>({...m,ready:!0,why:void 0})),v.type==="ready"&&(b(e,m=>({...m,capturing:0,pins:m.pins.map(N=>({...N,gone:!0}))})),s({type:"recording",active:W.value?.page===e&&W.value.active}),s({type:"mode",mode:R}),s({type:"pins",pins:Oe(O(e).pins)}))}else v.type==="record-action"?(Me(e,v.action),W.value?.active||s({type:"recording",active:!1})):v.type==="recording-warning"&&W.value?.page===e?W.value={...W.value,warning:String(v.text).slice(0,200)}:v.type==="console"?b(e,p=>({...p,console:[...p.console.slice(-299),{level:v.level,text:v.text,at:v.at}]})):v.type==="pin-start"?b(e,p=>({...p,capturing:p.capturing+1})):v.type==="pin"?b(e,p=>({...p,capturing:Math.max(0,p.capturing-1),pins:[...p.pins,{...v.pin,url:Re(v.pin.url,w,M)??p.at??t,n:(p.pins.at(-1)?.n??0)+1,comment:""}]})):v.type==="mode"&&r()};return window.addEventListener("message",o),()=>{window.removeEventListener("message",o),j.get(e)===s&&j.delete(e)}},[e]),I(()=>s({type:"mode",mode:d}),[d,$?.origin]);let h=O(e).pins;return I(()=>s({type:"pins",pins:Oe(h)}),[h.length,$?.origin]),n("div",{class:"browse-page",hidden:g,children:[C?n("div",{class:"msg warn browse-note",children:C}):null,n("div",{class:"browse-frame",style:`width:${Le[u]}`,children:$?n("iframe",{ref:y,src:$.src,title:"Browser",referrerpolicy:"no-referrer",sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-downloads",onLoad:()=>{k.current&&(b(e,o=>({...o,ready:!1,why:"Waiting for the page"})),s({type:"hello"}),setTimeout(()=>{O(e).ready||b(e,o=>({...o,why:"The page didn't load code-flow's annotation script, so it can't be annotated"}))},3e3))}}):n("div",{class:"side-empty help",children:"Opening\u2026"})})]})}var Oe=e=>e.filter(t=>t.source!=="snapshot").map(t=>({n:t.n,rect:t.rect,kind:t.kind})),We=e=>new Promise((t,u)=>{let d=new Image;d.onload=()=>t(d),d.onerror=()=>u(new Error("The snapshot couldn't be read")),d.src=e});async function qe(e,t){try{let u=await We(e),d=Object.assign(document.createElement("canvas"),{width:t.w,height:t.h});return d.getContext("2d").drawImage(u,t.x,t.y,t.w,t.h,0,0,t.w,t.h),d.toDataURL("image/png")}catch{return}}async function ze(e,t){try{let u=await We(e.image),d=Object.assign(document.createElement("canvas"),{width:e.width,height:e.height}),r=d.getContext("2d");r.drawImage(u,0,0);for(let g of t){r.strokeStyle="#2a9b72",r.lineWidth=3,r.strokeRect(g.rect.x+1.5,g.rect.y+1.5,Math.max(0,g.rect.w-3),Math.max(0,g.rect.h-3));let y=Math.min(e.width-14,g.rect.x+g.rect.w),$=Math.max(14,g.rect.y);r.fillStyle="#ffffff",r.beginPath(),r.arc(y,$,15,0,Math.PI*2),r.fill(),r.fillStyle="#343932",r.beginPath(),r.arc(y,$,13,0,Math.PI*2),r.fill(),r.fillStyle="#fbfaf6",r.font="600 14px Inter, system-ui, sans-serif",r.textAlign="center",r.textBaseline="middle",r.fillText(String(g.n),y,$+.5)}return d.toDataURL("image/png")}catch{return}}function Ge({pageKey:e,state:t,here:u,onTake:d,onLive:r}){let g=U(null),[y,$]=P(null),[S,C]=P(!1),A=typeof matchMedia=="function"&&matchMedia("(any-pointer: coarse)").matches,a=t.snap,M=o=>{let c=g.current.getBoundingClientRect(),w=a.width/c.width;return{x:Math.max(0,Math.min(a.width,(o.clientX-c.left)*w)),y:Math.max(0,Math.min(a.height,(o.clientY-c.top)*w))}},k=o=>({x:Math.round(Math.min(o.x0,o.x1)),y:Math.round(Math.min(o.y0,o.y1)),w:Math.round(Math.abs(o.x1-o.x0)),h:Math.round(Math.abs(o.y1-o.y0))}),f=o=>`left:${o.x/a.width*100}%;top:${o.y/a.height*100}%;width:${o.w/a.width*100}%;height:${o.h/a.height*100}%`,s=async()=>{if(!y||!a)return;let o=k(y);if($(null),o.w<6||o.h<6)return;let c=await qe(a.image,o);b(e,w=>w.snap!==a?w:{...w,pins:[...w.pins,{n:(w.pins.at(-1)?.n??0)+1,id:`snap-${Date.now().toString(36)}`,kind:"box",source:"snapshot",selector:"",text:"",rect:o,url:a.url,viewport:{w:a.width,h:a.height},image:c,comment:""}]})},h=t.pins.filter(o=>o.source==="snapshot");return n("div",{class:"browse-page snap-page",children:[n("div",{class:"snap-bar",children:[n("span",{class:"snap-what",title:a?`${a.title}
2
+ ${a.url}`:void 0,children:t.snapping?"Taking a snapshot\u2026":a?`Snapshot \xB7 ${a.width}\xD7${a.height}${a.full?" \xB7 whole page":""}`:"No snapshot yet"}),n("span",{class:"spacer"}),A?n("button",{type:"button",class:`btn ghost small ${S?"on":""}`,"aria-pressed":S,title:"Draw boxes with your finger (off: it scrolls)",onClick:()=>C(!S),children:"Draw"}):null,n("button",{type:"button",class:`btn ghost small ${a?.full?"on":""}`,"aria-pressed":!!a?.full,disabled:t.snapping,title:"Take it again, as tall as the page",onClick:()=>d(!a?.full),children:"Whole page"}),n("button",{type:"button",class:"btn ghost small",disabled:t.snapping,title:"Take it again, as the page is now",onClick:()=>d(!!a?.full),children:[n(H,{name:"refresh"})," Retake"]}),n("button",{type:"button",class:"btn ghost small",onClick:r,children:"Live page"})]}),t.snapError?n("div",{class:"msg err browse-note",children:t.snapError}):null,a&&!t.snapping&&!Ie(a,u)?n("div",{class:"msg browse-note",children:["This snapshot is of ",a.url,", not the page you're on: ",n("b",{children:"Retake"})," takes one of this page."]}):null,a?n("div",{class:`snap-scroll ${t.snapping?"dim":""}`,children:[n("div",{class:"help snap-hint",children:A&&!S?"Turn on Draw, then drag on the snapshot to box what's wrong.":"Drag on the snapshot to box what's wrong."}),n("div",{class:`snap-stage ${S?"draw":""}`,ref:g,style:`max-width:${a.width}px`,onPointerOver:o=>o.pointerType==="pen"&&g.current&&(g.current.style.touchAction="none"),onPointerLeave:o=>o.pointerType==="pen"&&g.current&&(g.current.style.touchAction=""),onPointerDown:o=>{if(o.button!==0||t.snapping||o.pointerType==="touch"&&!S)return;o.preventDefault();try{g.current?.setPointerCapture(o.pointerId)}catch{}let c=M(o);$({x0:c.x,y0:c.y,x1:c.x,y1:c.y})},onPointerMove:o=>{if(!y)return;let c=M(o);$({...y,x1:c.x,y1:c.y})},onPointerUp:()=>void s(),onPointerCancel:()=>$(null),children:[n("img",{src:a.image,alt:`Snapshot of ${a.url}`,draggable:!1}),h.map(o=>n("div",{class:"snap-box",style:f(o.rect),children:n("span",{class:"snap-n",children:o.n})},o.n)),y?n("div",{class:"snap-box drawing",style:f(k(y))}):null]})]}):t.snapping?n("div",{class:"side-empty help",children:"Loading the page in a headless Chrome\u2026 a few seconds."}):null]})}var Ve={error:"Error",warn:"Warn",network:"Net"};function _e({pageKey:e,lines:t}){return n("div",{class:"browse-console",children:[n("div",{class:"bc-head",children:[n("span",{class:"bc-title",children:"Console"}),n("span",{class:"help",children:"errors, warnings and failed requests since the page opened"}),n("span",{class:"spacer"}),n("button",{type:"button",class:"btn ghost small",disabled:!t.length,onClick:()=>b(e,u=>({...u,console:[]})),children:"Clear"})]}),n("div",{class:"bc-lines",children:t.length?t.map((u,d)=>n("div",{class:`bc-line ${u.level}`,children:[n("span",{class:"bc-level",children:Ve[u.level]}),n("span",{class:"bc-text",children:u.text})]},d)):n("div",{class:"help",children:"Nothing yet."})})]})}var Je=["font-size","font-weight","color","background-color","padding","margin","border-radius","gap"];function Xe(e){let t=[],u=r=>r.status==="done"||r.status==="running",d=e.run;if(d&&u(d)){t.push({key:`main:${d.id}`,label:"Main chat",sub:d.status==="running"?"To the team while it works":"A reply to the agent that built it"});for(let r of Ae(d))t.push({key:r.key,label:`Side chat: ${r.title}`,sub:"In this run's worktree"});$e(d)&&t.push({key:"side:new",label:"New side chat",sub:"A conversation of its own, in this run's worktree"})}for(let r of J.value.chats??[]){let g=me.value.get(r);g&&u(g)&&t.push({key:`main:${g.id}`,label:`Chat: ${g.task.split(`
3
+ `)[0].slice(0,40)}`,sub:"A chat on its own branch"})}return t.push({key:"composer",label:"New run",sub:"The task of a new run, in the composer"}),t}function Ye(e,t,u,d){let r=e[0]?.url??"",g=a=>`pin-${u}-${a.n}.png`,y=e.map(a=>{let M=a.source==="snapshot"?`an area ${a.rect.w}\xD7${a.rect.h} at ${a.rect.x},${a.rect.y} on the snapshot${d?` (box ${a.n} on ${d.name})`:""}`:a.kind==="box"?`an area ${a.rect.w}\xD7${a.rect.h} at ${a.rect.x},${a.rect.y} (around \`${a.selector}\`)`:`\`${a.selector}\``,k=[`${a.n}. ${M}: ${a.comment.trim()||"(no comment)"}`];return a.url!==r&&k.push(` On: ${a.url}`),a.text&&k.push(` Text: "${a.text.slice(0,120)}"`),a.html&&k.push(` HTML: ${a.html.replace(/\s+/g," ").slice(0,240)}`),a.tried&&Object.values(a.tried).some(Boolean)&&k.push(` Tried in the browser: ${Object.entries(a.tried).filter(([,f])=>f).map(([f,s])=>`${f}: ${s}`).join("; ")}`),a.image&&k.push(` Snapshot: ${g(a)}`),k.join(`
4
+ `)}),$=t.filter(a=>a.level!=="warn").slice(-20),C=[d&&e.every(a=>a.source==="snapshot")?`From a snapshot of ${d.snap.url} (${d.snap.width}px wide${d.snap.full?", the whole page":""}, as a signed-out visitor sees it); the boxes are numbered on ${d.name}:`:r?`From the app in the browser (${r}${e[0]?`, ${e[0].viewport.w}px wide`:""}):`:"From the app in the browser:",...y,$.length?`Console errors and failed requests:
5
+ ${$.map(a=>`- ${a.text.split(`
6
+ `)[0].slice(0,300)}`).join(`
7
+ `)}`:""].filter(Boolean).join(`
8
+ `),A=e.filter(a=>a.image).map(a=>{let M=a.image.replace(/^data:image\/png;base64,/,"");return{name:g(a),size:Math.round(M.length*3/4),data:M}});return{text:C,images:A}}var Qe=()=>Date.now().toString(36).slice(-6);function Ze({scope:e,pageKey:t,state:u,onSent:d}){let[r,g]=P(null),[y,$]=P(!1),S=u.console.filter(s=>s.level!=="warn"),C=Xe(e),a=C.find(s=>s.key===J.value.sendTo)??C[0],M=(s,h)=>b(t,o=>({...o,pins:o.pins.map(c=>c.n===s?{...c,...h}:c)})),k=s=>{s.gone||j.get(t)?.({type:"reset",id:s.id}),b(t,h=>({...h,pins:h.pins.filter(o=>o.n!==s.n)}))},f=async s=>{let h=Qe(),o=u.pins.filter(T=>T.source==="snapshot"),c=o.length&&u.snap?await ze(u.snap,o):void 0,w=c&&u.snap?{name:`snapshot-${h}.png`,snap:u.snap}:void 0,R=Ye(u.pins,y?S:[],h,w),v=R.text,p=c&&w?[{name:w.name,size:Math.round(c.length*3/4),data:c.replace(/^data:image\/png;base64,/,"")},...R.images]:R.images,m={to:s,text:v,images:p};D({sendTo:s});for(let T of u.pins)T.gone||j.get(t)?.({type:"reset",id:T.id});b(t,T=>({...T,pins:[]})),d();let N=ve.value?" in the main window":"";if(s.startsWith("main:")){let T=s.slice(5);e.run?.id===T?se({view:"run",id:T},[m]):(te(s,v,p),ne(T),ee("chat")),_(`Added to the message box${e.run?.id===T?N:""}: add a line if you like, then send`)}else s.startsWith("side:")?(te(s,v,p),ne(s==="side:new"?null:s),ee("chat")):(se({view:"composer"},[m]),_(`Added to the task in the composer${N}`))};return n("div",{class:"pins-tray",children:[n("div",{class:"pins-list",children:[u.pins.map(s=>n("div",{class:"pin-row",children:[n("span",{class:"pin-n",children:s.n}),n("div",{class:"pin-main",children:[n("div",{class:"pin-what",title:s.html??s.selector,children:[s.kind==="box"?n("span",{class:"pin-label",children:["Area ",s.rect.w,"\xD7",s.rect.h]}):n("span",{class:"pin-label pin-sel",children:s.selector}),s.image?n("img",{class:"pin-thumb",src:s.image,alt:`Snapshot of pin ${s.n}`}):n("span",{class:"help",children:" \xB7 no snapshot"})]}),n("input",{class:"field","aria-label":`What about pin ${s.n}?`,placeholder:"What's wrong, or what should change?",value:s.comment,onInput:h=>M(s.n,{comment:h.currentTarget.value})}),r===s.n&&s.kind==="element"&&!s.gone?n("div",{class:"adjust",children:Je.map(h=>n("label",{class:"adj",children:[n("span",{children:h}),n("input",{class:"field mono",placeholder:s.styles?.[h]??"",value:s.tried?.[h]??"",onInput:o=>{let c={...s.tried,[h]:o.currentTarget.value};M(s.n,{tried:c}),j.get(t)?.({type:"adjust",id:s.id,styles:{[h]:o.currentTarget.value}})}})]},h))}):null]}),n("div",{class:"pin-actions",children:[s.kind==="element"?n("button",{type:"button",class:`btn ghost small ${r===s.n&&!s.gone?"on":""}`,disabled:s.gone,title:s.gone?"The page has loaded again since you picked this, so its element is gone":"Try style changes on the page; what you try goes with the pin",onClick:()=>g(r===s.n?null:s.n),children:"Adjust"}):null,n("button",{type:"button",class:"icon-btn","aria-label":`Remove pin ${s.n}`,title:"Remove",onClick:()=>k(s),children:n(H,{name:"close"})})]})]},s.n)),u.capturing?n("div",{class:"help",children:"Taking a snapshot\u2026"}):null]}),n("div",{class:"pins-actions",children:[S.length?n("label",{class:"check",children:[n("input",{type:"checkbox",checked:y,onChange:s=>$(s.currentTarget.checked)})," with ",S.length," console error",S.length===1?"":"s"]}):null,n("span",{class:"spacer"}),n(ae,{label:"Send to",icon:"chevron",title:"Send the pins somewhere else",children:s=>n(B,{children:[n(X,{children:"Send to"}),C.map(h=>n(q,{on:h.key===a.key,sub:h.sub,onClick:()=>{s(),f(h.key)},children:h.label},h.key))]})}),n("button",{type:"button",class:"btn primary small",disabled:!u.pins.length,onClick:()=>void f(a.key),children:["Add to ",a.key.startsWith("main:")&&a.label==="Main chat"?"main chat":a.key==="composer"?"a new run":a.label.toLowerCase().startsWith("side chat")?"side chat":a.label]})]})]})}export{cn as BrowserTab,Y as address,Re as appAddress,Xe as destinations,Ye as pinsMessage};
@@ -0,0 +1 @@
1
+ import{H as _,J as z,K as G,L as H,M as J,N as Q,O as X}from"./chunk-LLMQG23J.js";import{K as x,M as j,Q as m,Wa as q,Xa as V,Yb as Y,a as N,d as R,da as U,ga as e,h as o,i as F,k as D}from"./chunk-7H3ZLTKA.js";function Z({runId:s,branch:d,refreshKey:E}){let r=`${s}\0${d}`,a=D(r);a.current=r;let l=D(0),T=D(!1),[p,O]=o(!1),[y,w]=o(!1),[A,$]=o(!1),[k,c]=o(""),[C,S]=o(),[f,B]=o(""),[L,P]=o({scope:r,text:""}),b=L.scope===r?L.text:"",v=async()=>{let n=++l.current;w(!0),c("");try{let[u,I]=await Promise.all([x(`/api/runs/${m(s)}/collaboration`),x(`/api/runs/${m(s)}/review-coverage?branch=${m(d)}`)]);if(a.current!==r||n!==l.current)return;S(u),B(I.head)}catch(u){a.current===r&&n===l.current&&c(u.message)}finally{a.current===r&&n===l.current&&w(!1)}};return F(()=>(S(void 0),B(""),p&&v(),()=>{l.current++}),[s,d,E,p]),e("details",{class:"collaboration-comments",onToggle:n=>O(n.currentTarget.open),children:[e("summary",{children:["Human collaboration comments",C?` \xB7 ${C.comments.length}`:""]}),e("p",{class:"help",children:"Comments from project reviewers and the owner are anchored to their observed result commit. They never send instructions to agents or resume work."}),e("button",{class:"btn small",type:"button",disabled:A||y,onClick:()=>void v(),children:"Refresh human comments"}),y?e("p",{class:"help",role:"status",children:"Loading human review\u2026"}):null,k?e("p",{class:"msg err",role:"alert",children:[k," Your comment draft is kept."]}):null,C?.comments.map(n=>e("article",{children:[e("strong",{children:n.actor.name}),e("p",{class:"help",children:[n.branch," \xB7 ",n.head.slice(0,12)," \xB7 ",new Date(n.at).toLocaleString(),n.branch!==d||f&&n.head!==f?" \xB7 another branch or earlier commit":""]}),e("pre",{children:n.text})]},n.id)),C&&!C.comments.length?e("p",{class:"help",children:"No human comments yet."}):null,e("form",{onSubmit:async n=>{if(n.preventDefault(),!(T.current||!f||!b.trim())){T.current=!0,l.current++,w(!1),$(!0),c("");try{let u=await j(`/api/runs/${m(s)}/collaboration`,{branch:d,expectedHead:f,text:b});a.current===r&&(S(u),P({scope:r,text:""}))}catch(u){a.current===r&&c(u.message)}finally{T.current=!1,$(!1)}}},children:[e("label",{children:["Owner comment on this result commit",e("textarea",{class:"field",rows:3,maxLength:4e3,value:b,onInput:n=>P({scope:r,text:n.currentTarget.value})})]}),e("p",{class:"help",children:f?`Observed commit ${f.slice(0,12)}`:"Load the current result commit before commenting."}),e("button",{class:"btn small",disabled:A||y||!f||!b.trim(),children:A?"Recording\u2026":"Record owner comment"})]})]})}var ne={added:"A",modified:"M",deleted:"D",renamed:"R"};function ge({run:s}){let d=[...new Set([...s.artifacts.map(t=>t.branch),...s.worktrees.map(t=>t.branch)])],[E,r]=o(null),a=E&&d.includes(E)?E:d[0]??"",[l,T]=o(!1),[p,O]=o(null),[y,w]=o(""),[A,$]=o(null),k=`comments:${s.id}:${a}`,c=G(k),[C,S]=o(null),[f,B]=o(null),[L,P]=o(!1),b=`${s.status}|${s.followUps.map(t=>t.status).join()}|${s.artifacts.map(t=>t.stat).join()}|${s.usage?.agentSteps}|${s.lastCheck?.at}`,v=q.value&&V.value==="changes",n=s.status==="running"&&v,u=`${a}|${l}`,I=D(u);F(()=>{if(!a||!v)return;let t=!0;w(""),I.current!==u&&(I.current=u,O(null));let i=N(()=>x(`/api/runs/${m(s.id)}/diff?branch=${m(a)}${l?"&last=1":""}`).then(h=>{t&&(O(h),w(""))},h=>t&&w(h.message)),n?1e4:0);return()=>{t=!1,i()}},[s.id,a,l,b,n,v]),F(()=>{if(!v)return;let t=!0,i=N(()=>x(`/api/runs/${m(s.id)}`).then(h=>{t&&S(h)},()=>{t&&S(null)}),0);return()=>{t=!1,i()}},[s.id,s.followUps.length,v]);let K=s.worktrees.find(t=>t.branch===a),W=f??J(C,K?.name)??"claude",g=p?.find(t=>t.path===A),M=p?.reduce((t,i)=>({add:t.add+i.additions,del:t.del+i.deletions}),{add:0,del:0}),ee=s.status==="done"&&!!K&&c.length>0&&!L,te=async()=>{if(K){P(!0);try{await j(`/api/runs/${m(s.id)}/followups`,{kind:"comments",worktree:K.name,agent:W,message:Q(c)}),H(k,()=>[]),U("Sent \u2014 the agent is working on your comments")}catch(t){U(t.message,5e3)}finally{P(!1)}}};return d.length?e(R,{children:[e("div",{class:"side-toolbar",children:[d.length>1?e("select",{class:"field","aria-label":"Branch",value:a,onChange:t=>(r(t.currentTarget.value),$(null)),children:d.map(t=>e("option",{value:t,children:[t.split("/").pop()," \xB7 ",t]},t))}):e("code",{class:"changes-branch",title:a,children:a}),e("div",{class:"segmented small",role:"group","aria-label":"Which changes",children:[e("button",{type:"button",class:l?"":"on","aria-pressed":!l,title:"Everything on the branch since the run started",onClick:()=>T(!1),children:"Whole run"}),e("button",{type:"button",class:l?"on":"","aria-pressed":l,title:"The branch's latest commit: what the most recent step or follow-up changed",onClick:()=>T(!0),children:"Last step"})]}),e("button",{type:"button",class:"btn ghost small",title:"Review the branch file by file, full width",onClick:()=>Y({view:"review",id:s.id,branch:a}),children:"Full review"})]}),l?null:e(z,{runId:s.id,branch:a,refreshKey:b,onOpen:$}),l?null:e(Z,{runId:s.id,branch:a,refreshKey:b}),e("div",{class:"changes",children:[y?e("div",{class:"side-empty msg err",children:y}):null,!p&&!y?e("div",{class:"side-empty help",children:"Loading\u2026"}):null,g?e(R,{children:[e("div",{class:"file-head",children:[e("button",{type:"button",class:"btn ghost small","aria-label":"Back to the changed files",title:"Back to the changed files",onClick:()=>$(null),children:"\u2190"}),e("span",{class:"fp",title:g.path,children:e("bdi",{children:g.path})}),e("span",{class:"help",children:[e("span",{class:"add",children:["+",g.additions]})," ",e("span",{class:"del",children:["\u2212",g.deletions]})]})]}),e("div",{class:"changes-diff",role:"region","aria-label":`Diff of ${g.path}`,children:e(X,{file:g,comments:c.filter(t=>t.file===g.path),onAdd:t=>H(k,i=>[...i,t]),onRemove:t=>H(k,i=>i.filter(h=>h!==t))},`${a}:${g.path}:${l}`)})]}):p?e(R,{children:[e("div",{class:"changes-sum help",children:p.length?e(R,{children:[p.length," file",p.length===1?"":"s"," \xB7 ",e("span",{class:"add",children:["+",M.add]})," ",e("span",{class:"del",children:["\u2212",M.del]}),l?" in the last step":""]}):l?"No commits on this branch yet.":"No changes on this branch yet."}),p.map(t=>{let i=c.filter(se=>se.file===t.path).length,h=t.path.lastIndexOf("/")+1;return e("button",{type:"button",class:"rf",onClick:()=>$(t.path),title:t.oldPath?`${t.oldPath} \u2192 ${t.path}`:t.path,children:[e("span",{class:`fs ${t.status}`,children:ne[t.status]}),e("span",{class:"fp",children:e("bdi",{children:[h?e("span",{class:"fdir",children:t.path.slice(0,h)}):null,t.path.slice(h)]})}),i?e("span",{class:"count",children:i}):null,e("span",{class:"fn",children:[e("span",{class:"add",children:["+",t.additions]})," ",e("span",{class:"del",children:["\u2212",t.deletions]})]})]},t.path)})]}):null]}),c.length?e("div",{class:"changes-send",children:[e("span",{class:"help",children:[c.length," comment",c.length===1?"":"s"]}),s.status==="done"?e(R,{children:[e("label",{class:"to",children:[e("span",{class:"to-lbl",children:"To"}),e(_,{value:W,onChange:B})]}),e("button",{type:"button",class:"btn primary small",disabled:!ee,onClick:te,children:L?"Sending\u2026":"Send"})]}):e("span",{class:"help",children:"They can be sent once the run has finished."})]}):null]}):e("div",{class:"side-empty help",children:"This run has no branch yet: its changes show here once an agent has worked."})}export{ge as ChangesTab};
@@ -0,0 +1,2 @@
1
+ function jr(e,t,n=()=>{}){let r=!1,o=!1,i,s=async()=>{if(clearTimeout(i),!(r||o||document.hidden)){o=!0;try{await e()}catch(u){n(u)}finally{o=!1,!r&&t>0&&!document.hidden&&(i=setTimeout(()=>void s(),t))}}},a=()=>{clearTimeout(i),document.hidden||s()};return document.addEventListener("visibilitychange",a),s(),()=>{r=!0,clearTimeout(i),document.removeEventListener("visibilitychange",a)}}var Nt,y,Er,Sn,ie,Pr,Ar,Ir,bn,Et,tt,Or,Tn,xn,kn,ui,It={},Ot=[],ci=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,nt=Array.isArray;function Y(e,t){for(var n in t)e[n]=t[n];return e}function Rn(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function di(e,t,n){var r,o,i,s={};for(i in t)i=="key"?r=t[i]:i=="ref"?o=t[i]:s[i]=t[i];if(arguments.length>2&&(s.children=arguments.length>3?Nt.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(i in e.defaultProps)s[i]===void 0&&(s[i]=e.defaultProps[i]);return At(e,s,r,o,null)}function At(e,t,n,r,o){var i={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++Er,__i:-1,__u:0};return o==null&&y.vnode!=null&&y.vnode(i),i}function Ne(e){return e.children}function qe(e,t){this.props=e,this.context=t}function he(e,t){if(t==null)return e.__?he(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type=="function"?he(e):null}function pi(e){if(e.__P&&e.__d){var t=e.__v,n=t.__e,r=[],o=[],i=Y({},t);i.__v=t.__v+1,y.vnode&&y.vnode(i),jn(e.__P,i,t,e.__n,e.__P.namespaceURI,32&t.__u?[n]:null,r,n??he(t),!!(32&t.__u),o),i.__v=t.__v,i.__.__k[i.__i]=i,Ur(r,i,o),t.__e=t.__=null,i.__e!=n&&qr(i)}}function qr(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),qr(e)}function Cr(e){(!e.__d&&(e.__d=!0)&&ie.push(e)&&!qt.__r++||Pr!=y.debounceRendering)&&((Pr=y.debounceRendering)||Ar)(qt)}function qt(){try{for(var e,t=1;ie.length;)ie.length>t&&ie.sort(Ir),e=ie.shift(),t=ie.length,pi(e)}finally{ie.length=qt.__r=0}}function Nr(e,t,n,r,o,i,s,a,u,c,f){var w,l,m,g,P,h,_=r&&r.__k||Ot,v=t.length;for(u=fi(n,t,_,u,v),w=0;w<v;w++)(m=n.__k[w])!=null&&(l=m.__i!=-1&&_[m.__i]||It,m.__i=w,h=jn(e,m,l,o,i,s,a,u,c,f),g=m.__e,m.ref&&l.ref!=m.ref&&(l.ref&&Pn(l.ref,null,m),f.push(m.ref,m.__c||g,m)),P==null&&g!=null&&(P=g),4&m.__u?(u=Dr(m,u,e),l.__e&&(l.__e=null)):typeof m.type=="function"&&h!==void 0?u=h:g&&(u=g.nextSibling),m.__u&=-7);return n.__e=P,u}function fi(e,t,n,r,o){var i,s,a,u,c,f=n.length,w=f,l=0;for(e.__k=new Array(o),i=0;i<o;i++)(s=t[i])!=null&&typeof s!="boolean"&&typeof s!="function"?(typeof s=="string"||typeof s=="number"||typeof s=="bigint"||s.constructor==String?s=e.__k[i]=At(null,s,null,null,null):nt(s)?s=e.__k[i]=At(Ne,{children:s},null,null,null):s.constructor===void 0&&s.__b>0?s=e.__k[i]=At(s.type,s.props,s.key,s.ref?s.ref:null,s.__v):e.__k[i]=s,u=i+l,s.__=e,s.__b=e.__b+1,a=null,(c=s.__i=vi(s,n,u,w))!=-1&&(w--,(a=n[c])&&(a.__u|=2)),a==null||a.__v==null?(c==-1&&(o>f?l--:o<f&&l++),typeof s.type!="function"&&(s.__u|=4)):c!=u&&(c==u-1?l--:c==u+1?l++:(c>u?l--:l++,s.__u|=4))):e.__k[i]=null;if(w)for(i=0;i<f;i++)(a=n[i])!=null&&(2&a.__u)==0&&(a.__e==r&&(r=he(a)),Fr(a,a));return r}function Dr(e,t,n){var r,o;if(typeof e.type=="function"){for(r=e.__k,o=0;r&&o<r.length;o++)r[o]&&(r[o].__=e,t=Dr(r[o],t,n));return t}e.__e!=t&&(t&&e.type&&!t.parentNode&&(t=he(e)),t=n.insertBefore(e.__e,t||null));do t=t&&t.nextSibling;while(t!=null&&t.nodeType==8);return t}function mi(e,t){return t=t||[],e==null||typeof e=="boolean"||(nt(e)?e.some(function(n){mi(n,t)}):t.push(e)),t}function vi(e,t,n,r){var o,i,s,a=e.key,u=e.type,c=t[n],f=c!=null&&(2&c.__u)==0;if(c===null&&a==null||f&&a==c.key&&u==c.type)return n;if(r>(f?1:0)){for(o=n-1,i=n+1;o>=0||i<t.length;)if((c=t[s=o>=0?o--:i++])!=null&&(2&c.__u)==0&&a==c.key&&u==c.type)return s}return-1}function Mr(e,t,n){t[0]=="-"?e.setProperty(t,n??""):e[t]=n==null?"":typeof n!="number"||ci.test(t)?n:n+"px"}function $t(e,t,n,r,o){var i,s;e:if(t=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof r=="string"&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||Mr(e.style,t,"");if(n)for(t in n)r&&n[t]==r[t]||Mr(e.style,t,n[t])}else if(t[0]=="o"&&t[1]=="n")i=t!=(t=t.replace(Or,"$1")),s=t.toLowerCase(),t=s in e||t=="onFocusOut"||t=="onFocusIn"?s.slice(2):t.slice(2),e.l||(e.l={}),e.l[t+i]=n,n?r?n[tt]=r[tt]:(n[tt]=Tn,e.addEventListener(t,i?kn:xn,i)):e.removeEventListener(t,i?kn:xn,i);else{if(o=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{e[t]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&n==1?"":n))}}function $r(e){return function(t){if(this.l){var n=this.l[t.type+e];if(t[Et]==null)t[Et]=Tn++;else if(t[Et]<n[tt])return;return n(y.event?y.event(t):t)}}}function jn(e,t,n,r,o,i,s,a,u,c){var f,w,l,m,g,P,h,_,v,C,oe,L,ge,Rr,Mt,wn,W=t.type;if(t.constructor!==void 0)return null;128&n.__u&&(u=!!(32&n.__u),i=[a=t.__e=n.__e]),(f=y.__b)&&f(t);e:if(typeof W=="function"){w=s.length;try{if(v=t.props,C=W.prototype&&W.prototype.render,oe=(f=W.contextType)&&r[f.__c],L=f?oe?oe.props.value:f.__:r,n.__c?_=(l=t.__c=n.__c).__=l.__E:(C?t.__c=l=new W(v,L):(t.__c=l=new qe(v,L),l.constructor=W,l.render=hi),oe&&oe.sub(l),l.state||(l.state={}),l.__n=r,m=l.__d=!0,l.__h=[],l._sb=[]),C&&l.__s==null&&(l.__s=l.state),C&&W.getDerivedStateFromProps!=null&&(l.__s==l.state&&(l.__s=Y({},l.__s)),Y(l.__s,W.getDerivedStateFromProps(v,l.__s))),g=l.props,P=l.state,l.__v=t,m)C&&W.getDerivedStateFromProps==null&&l.componentWillMount!=null&&l.componentWillMount(),C&&l.componentDidMount!=null&&l.__h.push(l.componentDidMount);else{if(C&&W.getDerivedStateFromProps==null&&v!==g&&l.componentWillReceiveProps!=null&&l.componentWillReceiveProps(v,L),t.__v==n.__v||!l.__e&&l.shouldComponentUpdate!=null&&l.shouldComponentUpdate(v,l.__s,L)===!1){t.__v!=n.__v&&(l.props=v,l.state=l.__s,l.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.some(function(Oe){Oe&&(Oe.__=t)}),Ot.push.apply(l.__h,l._sb),l._sb=[],l.__h.length&&s.push(l),a=he(n);break e}l.componentWillUpdate!=null&&l.componentWillUpdate(v,l.__s,L),C&&l.componentDidUpdate!=null&&l.__h.push(function(){l.componentDidUpdate(g,P,h)})}if(l.context=L,l.props=v,l.__P=e,l.__e=!1,ge=y.__r,Rr=0,C)l.state=l.__s,l.__d=!1,ge&&ge(t),f=l.render(l.props,l.state,l.context),Ot.push.apply(l.__h,l._sb),l._sb=[];else do l.__d=!1,ge&&ge(t),f=l.render(l.props,l.state,l.context),l.state=l.__s;while(l.__d&&++Rr<25);l.state=l.__s,l.getChildContext!=null&&(r=Y(Y({},r),l.getChildContext())),C&&!m&&l.getSnapshotBeforeUpdate!=null&&(h=l.getSnapshotBeforeUpdate(g,P)),Mt=f!=null&&f.type===Ne&&f.key==null?Hr(f.props.children):f,a=Nr(e,nt(Mt)?Mt:[Mt],t,n,r,o,i,s,a,u,c),l.base=t.__e,t.__u&=-161,l.__h.length&&s.push(l),_&&(l.__E=l.__=null)}catch(Oe){if(s.length=w,t.__v=null,u||i!=null){if(Oe.then){for(t.__u|=u?160:128;a&&a.nodeType==8&&a.nextSibling;)a=a.nextSibling;i!=null&&(i[i.indexOf(a)]=null),t.__e=a}else if(i!=null)for(wn=i.length;wn--;)Rn(i[wn])}else t.__e=n.__e;t.__k==null&&(t.__k=n.__k||[]),Oe.then||Lr(t),y.__e(Oe,t,n)}}else i==null&&t.__v==n.__v?(t.__k=n.__k,t.__e=n.__e):a=t.__e=gi(n.__e,t,n,r,o,i,s,u,c);return(f=y.diffed)&&f(t),128&t.__u?void 0:a}function Lr(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(Lr))}function Ur(e,t,n){for(var r=0;r<n.length;r++)Pn(n[r],n[++r],n[++r]);y.__c&&y.__c(t,e),e.some(function(o){try{e=o.__h,o.__h=[],e.some(function(i){i.call(o)})}catch(i){y.__e(i,o.__v)}})}function Hr(e){return typeof e!="object"||e==null||e.__b>0?e:nt(e)?e.map(Hr):e.constructor!==void 0?null:Y({},e)}function gi(e,t,n,r,o,i,s,a,u){var c,f,w,l,m,g,P,h=n.props||It,_=t.props,v=t.type;if(v=="svg"?o="http://www.w3.org/2000/svg":v=="math"?o="http://www.w3.org/1998/Math/MathML":o||(o="http://www.w3.org/1999/xhtml"),i!=null){for(c=0;c<i.length;c++)if((m=i[c])&&"setAttribute"in m==!!v&&(v?m.localName==v:m.nodeType==3)){e=m,i[c]=null;break}}if(e==null){if(v==null)return document.createTextNode(_);e=document.createElementNS(o,v,_.is&&_),a&&(y.__m&&y.__m(t,i),a=!1),i=null}if(v==null)h===_||a&&e.data==_||(e.data=_);else{if(i=v=="textarea"&&_.defaultValue!=null?null:i&&Nt.call(e.childNodes),!a&&i!=null)for(h={},c=0;c<e.attributes.length;c++)h[(m=e.attributes[c]).name]=m.value;for(c in h)m=h[c],c=="dangerouslySetInnerHTML"?w=m:c=="children"||c in _||c=="value"&&"defaultValue"in _||c=="checked"&&"defaultChecked"in _||$t(e,c,null,m,o);for(c in _)m=_[c],c=="children"?l=m:c=="dangerouslySetInnerHTML"?f=m:c=="value"?g=m:c=="checked"?P=m:a&&typeof m!="function"||h[c]===m||$t(e,c,m,h[c],o);if(f)a||w&&(f.__html==w.__html||f.__html==e.innerHTML)||(e.innerHTML=f.__html),t.__k=[];else if(w&&(e.innerHTML=""),Nr(t.type=="template"?e.content:e,nt(l)?l:[l],t,n,r,v=="foreignObject"?"http://www.w3.org/1999/xhtml":o,i,s,i?i[0]:n.__k&&he(n,0),a,u),i!=null)for(c=i.length;c--;)Rn(i[c]);a&&v!="textarea"||(c="value",v=="progress"&&g==null?e.removeAttribute("value"):g!=null&&(g!==e[c]||v=="progress"&&!g||v=="option"&&g!=h[c])&&$t(e,c,g,h[c],o),c="checked",P!=null&&P!=e[c]&&$t(e,c,P,h[c],o))}return e}function Pn(e,t,n){try{if(typeof e=="function"){var r=typeof e.__u=="function";r&&e.__u(),r&&t==null||(e.__u=e(t))}else e.current=t}catch(o){y.__e(o,n)}}function Fr(e,t,n){var r,o;if(y.unmount&&y.unmount(e),(r=e.ref)&&(r.current&&r.current!=e.__e||Pn(r,null,t)),(r=e.__c)!=null){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(i){y.__e(i,t)}r.base=r.__P=r.__n=null}if(r=e.__k)for(o=0;o<r.length;o++)r[o]&&Fr(r[o],t,n||typeof e.type!="function");n||Rn(e.__e),e.__c=e.__=e.__e=void 0}function hi(e,t,n){return this.constructor(e,n)}function Ss(e,t,n){var r,o,i,s;t==document&&(t=document.documentElement),y.__&&y.__(e,t),o=(r=typeof n=="function")?null:n&&n.__k||t.__k,i=[],s=[],jn(t,e=(!r&&n||t).__k=di(Ne,null,[e]),o||It,It,t.namespaceURI,!r&&n?[n]:o?null:t.firstChild?Nt.call(t.childNodes):null,i,!r&&n?n:o?o.__e:t.firstChild,r,s),Ur(i,e,s),e.props.children=null}Nt=Ot.slice,y={__e:function(e,t,n,r){for(var o,i,s;t=t.__;)if((o=t.__c)&&!o.__)try{if((i=o.constructor)&&i.getDerivedStateFromError!=null&&(o.setState(i.getDerivedStateFromError(e)),s=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(e,r||{}),s=o.__d),s)return o.__E=o}catch(a){e=a}throw e}},Er=0,Sn=function(e){return e!=null&&e.constructor===void 0},qe.prototype.setState=function(e,t){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=Y({},this.state),typeof e=="function"&&(e=e(Y({},n),this.props)),e&&Y(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),Cr(this))},qe.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Cr(this))},qe.prototype.render=Ne,ie=[],Ar=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ir=function(e,t){return e.__v.__b-t.__v.__b},qt.__r=0,bn=Math.random().toString(8),Et="__d"+bn,tt="__a"+bn,Or=/(PointerCapture)$|Capture$/i,Tn=0,xn=$r(!1),kn=$r(!0),ui=0;var _e,S,Cn,Br,rt=0,Zr=[],T=y,Wr=T.__b,Vr=T.__r,zr=T.diffed,Jr=T.__c,Kr=T.unmount,Gr=T.__;function ot(e,t){T.__h&&T.__h(S,e,rt||t),rt=0;var n=S.__H||(S.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function Qr(e){return rt=1,_i(eo,e)}function _i(e,t,n){var r=ot(_e++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):eo(void 0,t),function(a){var u=r.__N?r.__N[0]:r.__[0],c=r.t(u,a);u!==c&&(r.__N=[c,r.__[1]],r.__c.setState({}))}],r.__c=S,!S.__f)){var o=function(a,u,c){if(!r.__c.__H)return!0;var f=!1,w=r.__c.props!==a;if(r.__c.__H.__.some(function(m){if(m.__N){f=!0;var g=m.__[0];m.__=m.__N,m.__N=void 0,g!==m.__[0]&&(w=!0)}}),i){var l=i.call(this,a,u,c);return f?l||w:l}return!f||w};S.__f=!0;var i=S.shouldComponentUpdate,s=S.componentWillUpdate;S.componentWillUpdate=function(a,u,c){if(this.__e){var f=i;i=void 0,o(a,u,c),i=f}s&&s.call(this,a,u,c)},S.shouldComponentUpdate=o}return r.__N||r.__}function Lt(e,t){var n=ot(_e++,3);!T.__s&&En(n.__H,t)&&(n.__=e,n.u=t,S.__H.__h.push(n))}function $n(e,t){var n=ot(_e++,4);!T.__s&&En(n.__H,t)&&(n.__=e,n.u=t,S.__h.push(n))}function se(e){return rt=5,it(function(){return{current:e}},[])}function it(e,t){var n=ot(_e++,7);return En(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function Xr(e,t){return rt=8,it(function(){return e},t)}function js(){var e=ot(_e++,11);if(!e.__){for(var t=S.__v;t!==null&&!t.__m&&t.__!==null;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__="P"+n[0]+"-"+n[1]++}return e.__}function yi(){for(var e;e=Zr.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(Dt),t.__h.some(Mn),t.__h=[]}catch(n){t.__h=[],T.__e(n,e.__v)}}}T.__b=function(e){S=null,Wr&&Wr(e)},T.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),Gr&&Gr(e,t)},T.__r=function(e){Vr&&Vr(e),_e=0;var t=(S=e.__c).__H;t&&(Cn===S?(t.__h=[],S.__h=[],t.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(t.__h.some(Dt),t.__h.some(Mn),t.__h=[],_e=0)),Cn=S},T.diffed=function(e){zr&&zr(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(Zr.push(t)!==1&&Br===T.requestAnimationFrame||((Br=T.requestAnimationFrame)||wi)(yi)),t.__H.__.some(function(n){n.u&&(n.__H=n.u,n.u=void 0)})),Cn=S=null},T.__c=function(e,t){t.some(function(n){try{n.__h.some(Dt),n.__h=n.__h.filter(function(r){return!r.__||Mn(r)})}catch(r){t.some(function(o){o.__h&&(o.__h=[])}),t=[],T.__e(r,n.__v)}}),Jr&&Jr(e,t)},T.unmount=function(e){Kr&&Kr(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(r){try{Dt(r)}catch(o){t=o}}),n.__H=void 0,t&&T.__e(t,n.__v))};var Yr=typeof requestAnimationFrame=="function";function wi(e){var t,n=function(){clearTimeout(r),Yr&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);Yr&&(t=requestAnimationFrame(n))}function Dt(e){var t=S,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),S=t}function Mn(e){var t=S;e.__c=e.__(),S=t}function En(e,t){return!e||e.length!==t.length||t.some(function(n,r){return n!==e[r]})}function eo(e,t){return typeof t=="function"?t(e):t}var bi=Symbol.for("preact-signals");function Bt(){if(Z>1)Z--;else{var e,t=!1;for((function(){var o=Ht;for(Ht=void 0;o!==void 0;){var i=o.S;if(i.v===o.v)for(var s=i.t;s!==void 0;s=s.x)s.i===o.i&&(s.i=i.i);o=o.o}})();at!==void 0;){var n=at;for(at=void 0,Ut++;n!==void 0;){var r=n.u;if(n.u=void 0,n.f&=-3,!(8&n.f)&&no(n))try{n.c()}catch(o){t||(e=o,t=!0)}n=r}}if(Ut=0,Z--,t)throw e}}function Wt(e){if(Z>0)return e();An=++xi,Z++;try{return e()}finally{Bt()}}var st,k=void 0;function lt(e){var t=k,n=st;k=void 0,st=void 0;try{return e()}finally{k=t,st=n}}var at=void 0,Z=0,Ut=0,xi=0,An=0,Ht=void 0,Ft=0;function to(e){if(k!==void 0){var t=e.n;if(t===void 0||t.t!==k)return t={i:0,S:e,p:k.s,n:void 0,t:k,e:void 0,x:void 0,r:t},k.s!==void 0&&(k.s.n=t),k.s=t,e.n=t,32&k.f&&e.S(t),t;if(t.i===-1)return t.i=0,t.n!==void 0&&(t.n.p=t.p,t.p!==void 0&&(t.p.n=t.n),t.p=k.s,t.n=void 0,k.s.n=t,k.s=t),t}}function j(e,t){this.v=e,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=t?.watched,this.Z=t?.unwatched,this.name=t?.name}j.prototype.brand=bi;j.prototype.h=function(){return!0};j.prototype.S=function(e){var t=this,n=this.t;n!==e&&e.e===void 0&&(e.x=n,this.t=e,n!==void 0?n.e=e:lt(function(){var r;(r=t.W)==null||r.call(t)}))};j.prototype.U=function(e){var t=this;if(this.t!==void 0){var n=e.e,r=e.x;n!==void 0&&(n.x=r,e.e=void 0),r!==void 0&&(r.e=n,e.x=void 0),e===this.t&&(this.t=r,r===void 0&&lt(function(){var o;(o=t.Z)==null||o.call(t)}))}};j.prototype.subscribe=function(e){var t=this;return Q(function(){var n=t.value;lt(function(){return e(n)})},{name:"sub"})};j.prototype.valueOf=function(){return this.value};j.prototype.toString=function(){return this.value+""};j.prototype.toJSON=function(){return this.value};j.prototype.peek=function(){var e=this;return lt(function(){return e.value})};Object.defineProperty(j.prototype,"value",{get:function(){var e=to(this);return e!==void 0&&(e.i=this.i),this.v},set:function(e){if(e!==this.v){if(Ut>100)throw new Error("Cycle detected");(function(n){Z!==0&&Ut===0&&n.l!==An&&(n.l=An,Ht={S:n,v:n.v,i:n.i,o:Ht})})(this),this.v=e,this.i++,Ft++,Z++;try{for(var t=this.t;t!==void 0;t=t.x)t.t.N()}finally{Bt()}}}});function d(e,t){return new j(e,t)}function no(e){for(var t=e.s;t!==void 0;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function ro(e){for(var t=e.s;t!==void 0;t=t.n){var n=t.S.n;if(n!==void 0&&(t.r=n),t.S.n=t,t.i=-1,t.n===void 0){e.s=t;break}}}function oo(e){for(var t=e.s,n=void 0;t!==void 0;){var r=t.p;t.i===-1?(t.S.U(t),r!==void 0&&(r.n=t.n),t.n!==void 0&&(t.n.p=r)):n=t,t.S.n=t.r,t.r!==void 0&&(t.r=void 0),t=r}e.s=n}function ye(e,t){j.call(this,void 0,t),this.x=e,this.s=void 0,this.g=Ft-1,this.f=4}ye.prototype=new j;ye.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===Ft))return!0;if(this.g=Ft,this.f|=1,this.i>0&&!no(this))return this.f&=-2,!0;var e=k;try{ro(this),k=this;var t=this.x();(16&this.f||this.v!==t||this.i===0)&&(this.v=t,this.f&=-17,this.i++)}catch(n){this.v=n,this.f|=16,this.i++}return k=e,oo(this),this.f&=-2,!0};ye.prototype.S=function(e){if(this.t===void 0){this.f|=36;for(var t=this.s;t!==void 0;t=t.n)t.S.S(t)}j.prototype.S.call(this,e)};ye.prototype.U=function(e){if(this.t!==void 0&&(j.prototype.U.call(this,e),this.t===void 0)){this.f&=-33;for(var t=this.s;t!==void 0;t=t.n)t.S.U(t)}};ye.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var e=this.t;e!==void 0;e=e.x)e.t.N()}};Object.defineProperty(ye.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var e=to(this);if(this.h(),e!==void 0&&(e.i=this.i),16&this.f)throw this.v;return this.v}});function A(e,t){return new ye(e,t)}function io(e){var t=e.m;if(e.m=void 0,typeof t=="function"){Z++;var n=k;k=void 0;try{t()}catch(r){throw e.f&=-2,e.f|=8,In(e),r}finally{k=n,Bt()}}}function In(e){for(var t=e.s;t!==void 0;t=t.n)t.S.U(t);e.x=void 0,e.s=void 0,io(e)}function ki(e){if(k!==this)throw new Error("Out-of-order effect");oo(this),k=e,this.f&=-2,8&this.f&&In(this),Bt()}function De(e,t){this.x=e,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=t?.name,st&&st.push(this)}De.prototype.c=function(){var e=this.S();try{if(8&this.f||this.x===void 0)return;var t=this.x();typeof t=="function"&&(this.m=t)}finally{e()}};De.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,io(this),ro(this),Z++;var e=k;return k=this,ki.bind(this,e)};De.prototype.N=function(){2&this.f||(this.f|=2,this.u=at,at=this)};De.prototype.d=function(){this.f|=8,1&this.f||In(this)};De.prototype.dispose=function(){this.d()};function Q(e,t){var n=new De(e,t);try{n.c()}catch(o){throw n.d(),o}var r=n.d.bind(n);return r[Symbol.dispose]=r,r}var On,Vt;function Le(e,t){y[e]=t.bind(null,y[e]||function(){})}function zt(e){if(Vt){var t=Vt;Vt=void 0,t()}Vt=e&&e.S()}function so(e){var t=this,n=e.data,r=Ti(n);r.value=n;var o=it(function(){for(var i=t.__v;i=i.__;)if(i.__c){i.__c.__$f|=4;break}return t.__$u.c=function(){var s,a=t.__$u.S(),u=o.value;a(),Sn(u)||((s=t.base)==null?void 0:s.nodeType)!==3?(t.__$f|=1,t.setState({})):t.base.data=u},A(function(){var s=r.value.value;return s===0?0:s===!0?"":s||""})},[]);return o.value}so.displayName="_st";Object.defineProperties(j.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:so},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});Le("__b",function(e,t){if(typeof t.type=="string"){var n,r=t.props;for(var o in r)if(o!=="children"){var i=r[o];i instanceof j&&(n||(t.__np=n={}),n[o]=i,r[o]=i.peek())}}e(t)});Le("__r",function(e,t){e(t),zt();var n,r=t.__c;r&&(r.__$f&=-2,(n=r.__$u)===void 0&&(r.__$u=n=(function(o){var i;return Q(function(){i=this}),i.c=function(){r.__$f|=1,r.setState({})},i})())),On=r,zt(n)});Le("__e",function(e,t,n,r){zt(),On=void 0,e(t,n,r)});Le("diffed",function(e,t){zt(),On=void 0;var n;if(typeof t.type=="string"&&(n=t.__e)){var r=t.__np,o=t.props;if(r){var i=n.U;if(i)for(var s in i){var a=i[s];a!==void 0&&!(s in r)&&(a.d(),i[s]=void 0)}else n.U=i={};for(var u in r){var c=i[u],f=r[u];c===void 0?(c=Si(n,u,f,o),i[u]=c):c.o(f,o)}}}e(t)});function Si(e,t,n,r){var o=t in e&&e.ownerSVGElement===void 0,i=d(n);return{o:function(s,a){i.value=s,r=a},d:Q(function(){var s=i.value.value;r[t]!==s&&(r[t]=s,o?e[t]=s:s?e.setAttribute(t,s):e.removeAttribute(t))})}}Le("unmount",function(e,t){if(typeof t.type=="string"){var n=t.__e;if(n){var r=n.U;if(r){n.U=void 0;for(var o in r){var i=r[o];i&&i.d()}}}}else{var s=t.__c;if(s){var a=s.__$u;a&&(s.__$u=void 0,a.d())}}e(t)});Le("__h",function(e,t,n,r){(r<3||r===9)&&(t.__$f|=2),e(t,n,r)});qe.prototype.shouldComponentUpdate=function(e,t){if(this.__R)return!0;var n=this.__$u,r=n&&n.s!==void 0;for(var o in t)return!0;if(this.__f||typeof this.u=="boolean"&&this.u===!0){if(!(r||2&this.__$f||4&this.__$f)||1&this.__$f)return!0}else if(!(r||4&this.__$f)||3&this.__$f)return!0;for(var i in e)if(i!=="__source"&&e[i]!==this.props[i])return!0;for(var s in this.props)if(!(s in e))return!0;return!1};function Ti(e){return it(function(){return d(e)},[])}var Nn="theme",lo={get:e=>{try{return localStorage.getItem(e)}catch{return null}},set:(e,t)=>{try{t===null?localStorage.removeItem(e):localStorage.setItem(e,t)}catch{}}},uo=typeof matchMedia=="function"?matchMedia("(prefers-color-scheme: dark)"):void 0,ao=typeof document>"u"?void 0:document.documentElement,Dn=()=>{let e=lo.get(Nn);return e==="light"||e==="dark"?e:null},co=()=>Dn()??(uo?.matches?"dark":"light"),qn=d(co()),Ri=d(Dn()??"system");function Jt(){qn.value=co(),Ri.value=Dn()??"system",ao&&(ao.dataset.theme=qn.value)}Jt();uo?.addEventListener("change",Jt);typeof window<"u"&&window.addEventListener("storage",e=>e.key===Nn&&Jt());function ji(e){lo.set(Nn,e==="system"?null:e),Jt()}function qs(){ji(qn.value==="dark"?"light":"dark")}var po=[{id:"general",label:"General",icon:"sliders",group:"Preferences",description:"Make code-flow feel at home.",keywords:"appearance theme light dark system sidebar group shortcuts keyboard"},{id:"agents",label:"Agents & models",icon:"sparkle",group:"Preferences",description:"Connect coding agents and choose their models and effort.",keywords:"claude codex antigravity opencode kilo cline acp cli connection providers login health quota prompt improvement improve rewrite quick repo"},{id:"runs",label:"Run defaults",icon:"layers",group:"Preferences",description:"Set the starting point for your next run.",keywords:"workflow permissions trust sandbox limits minutes steps tokens cost approval"},{id:"notifications",label:"Notifications",icon:"bell",group:"Preferences",description:"Decide how code-flow gets your attention.",keywords:"desktop browser alerts slack webhook delivery"},{id:"connections",label:"Connections",icon:"terminal",group:"Connections",description:"Work on another computer, delegate execution, or share access.",keywords:"ssh remote vm server host worker runner port keys tailscale phone tablet people team accounts collaboration handoff board teammates"},{id:"integrations",label:"Integrations",icon:"globe",group:"Connections",description:"Connect issues and code hosts.",keywords:"github gitlab bitbucket sources"},{id:"workspace",label:"Repository tools",icon:"files",group:"Tools & activity",description:"Inspect code, verify changes and manage repository operations.",keywords:"repository files verification dependencies context history checkpoints services coordination filtered tasks"},{id:"insights",label:"Insights",icon:"chart",group:"Tools & activity",description:"Understand run results, usage and comparisons.",keywords:"statistics analytics costs tokens agents patterns comparisons evaluations disk"},{id:"automations",label:"Scheduling",icon:"clock",group:"Tools & activity",description:"Run once later, repeat tasks, process a backlog or pursue a project mission.",keywords:"schedule recurring sweep trigger queue deferred inbox review"},{id:"projects",label:"Projects",icon:"project",group:"Management",description:"Configure project defaults, templates, conventions and filesystem policies.",keywords:"repositories setup checks verification isolation docker templates readiness filesystem policy permissions rules instructions"},{id:"extensions",label:"Extensions",icon:"plus",group:"Management",description:"Manage trusted providers and workflows.",keywords:"plugins bundles"},{id:"data",label:"Data & storage",icon:"archive",group:"Management",description:"Choose how long to keep your workspace data.",keywords:"retention cleanup history logs memory"},{id:"advanced",label:"Advanced",icon:"keyboard",group:"Management",description:"Inspect health and troubleshoot your environment.",keywords:"diagnostics export server configuration environment versions"}];function fo(e){return po.some(t=>t.id===e)?e:"general"}function Ds(e){let t=e.toLowerCase().trim().split(/\s+/).filter(Boolean);return po.filter(n=>t.every(r=>`${n.label} ${n.description} ${n.keywords}`.toLowerCase().includes(r)))}var ut=["chat","changes","files","terminal","browser","notes"],Pi=["runs","repositories","board","people","automation","settings"],Ci=["verification","code","context","history","services","coordination","filtered-tasks"];function Ln(e){let t;try{t=e.replace(/^#\/?/,"").split("/").map(decodeURIComponent)}catch{return{view:"invalid",hash:e}}let[n,r,...o]=t;if(n==="run"&&r)return{view:"run",id:r};if(n==="review"&&r&&o.length)return{view:"review",id:r,branch:o.join("/")};if(n==="settings"&&(r==="workspace"||r==="automations"||r==="insights"))return{view:r,...r==="insights"&&o[0]?{group:o[0]}:{}};if(n==="settings"&&["ssh","remote-access","team"].includes(r??""))return{view:"settings",section:"connections",group:r==="ssh"?"workspace":"sharing"};if(n==="settings")return{view:"settings",...r?{section:fo(r)}:{},...(r==="insights"||r==="connections")&&o[0]?{group:o[0]}:{}};if(n==="workspace")return{view:"workspace"};if(n==="automations")return{view:n,...r?{kind:r}:{}};if(n==="inbox")return{view:n};if(n==="insights")return{view:"insights",...r?{group:r}:{}};if(n==="new"&&r==="unassigned"&&!o.length)return{view:"composer",project:""};if(n==="project"&&r&&o[0]==="new"&&o.length===1)return{view:"composer",project:r};if(n==="project"&&r&&o[0]==="workspace"&&o.length===1)return{view:"workspace",project:r};if(n==="project"&&r){if(!o.length)return{view:"project",id:r};let[i,s,a,...u]=o;return i==="automation"?u.length||a||s&&!["once","repeat","backlog","missions"].includes(s)?{view:"invalid",hash:e}:{view:"project",id:r,section:i,...s?{kind:s}:{}}:!Pi.includes(i)||u.length||i!=="repositories"&&o.length!==1||a&&!Ci.includes(a)?{view:"invalid",hash:e}:{view:"project",id:r,section:i,...s?{repository:s}:{},...a?{tool:a}:{}}}return n==="team"?r==="people"?{view:"team-people",...o[0]?{project:o[0]}:{}}:r==="task"&&o[0]?{view:"team-task",id:o[0]}:r==="project"&&o[0]?{view:"team",project:o[0]}:{view:"team"}:n==="side"&&r&&o[0]?{view:"side",tab:ut.includes(r)?r:"chat",scope:o[0]}:{view:"composer"}}function Un(e){return e.view==="composer"&&e.project!==void 0?e.project?`#/project/${encodeURIComponent(e.project)}/new`:"#/new/unassigned":e.view==="invalid"?e.hash:e.view==="inbox"?"#/inbox":e.view==="automations"?`#/automations${e.kind?`/${encodeURIComponent(e.kind)}`:""}`:e.view==="workspace"?e.project?`#/project/${encodeURIComponent(e.project)}/workspace`:"#/workspace":e.view==="insights"?`#/insights${e.group?`/${encodeURIComponent(e.group)}`:""}`:e.view==="run"?`#/run/${encodeURIComponent(e.id)}`:e.view==="settings"?e.section?`#/settings/${e.section}${(e.section==="insights"||e.section==="connections")&&e.group?`/${encodeURIComponent(e.group)}`:""}`:"#/settings":e.view==="project"?`#/project/${encodeURIComponent(e.id)}${e.section?`/${e.section}`:""}${e.section==="automation"&&e.kind?`/${encodeURIComponent(e.kind)}`:""}${e.section==="repositories"&&(e.repository||e.tool)?`/${encodeURIComponent(e.repository??"")}${e.tool?`/${e.tool}`:""}`:""}`:e.view==="team-people"?`#/team/people${e.project?`/${encodeURIComponent(e.project)}`:""}`:e.view==="team"?e.project?`#/team/project/${encodeURIComponent(e.project)}`:"#/team":e.view==="team-task"?`#/team/task/${encodeURIComponent(e.id)}`:e.view==="side"?`#/side/${e.tab}/${encodeURIComponent(e.scope)}`:e.view==="review"?`#/review/${encodeURIComponent(e.id)}/${e.branch.split("/").map(encodeURIComponent).join("/")}`:"#/"}function Hn(e){let t=Ln(e);return t.view==="project"&&(t.section==="board"||t.section==="people")}var le=class extends Error{constructor(n,r,o){super(n);this.status=r;this.confirm=o}},ue=window.__CODEFLOW_WORKSPACE,zs=(e="local",t="#/")=>`${e==="local"?"/":`/computer/${encodeURIComponent(e)}/`}${t}`,ae=Hn(location.hash)?"local":new URLSearchParams(location.search).get("team")??"",Mi=d(!1);function $i(e,t=ae||"local"){let n=new URL(location.href);return n.searchParams.delete("token"),n.searchParams.set("team",t),n.hash=e,`${n.pathname}${n.search}${n.hash}`}function Js(e){return!Hn(e)||ae==="local"?!0:(location.assign($i(e,"local")),!1)}var Kt=e=>(ae&&/^\/api\/team(?:-link)?(?:\/|\?|$)/.test(e)&&!new URLSearchParams(e.split("?")[1]).has("teamConnection")&&(e+=`${e.includes("?")?"&":"?"}teamConnection=${encodeURIComponent(ae)}`),ue&&e.startsWith("/api/")?`/computer/${ue}${e}`:e);async function Ks(){if(ae){let e=new URL(location.href);e.searchParams.set("team",ae),history.replaceState(history.state,"",e.href);return}try{let t=(await q("/api/team-link/connections")).connections.filter(r=>r.linked);Mi.value=t.length>0,ae=t.length===1?t[0].id:"local";let n=new URL(location.href);n.searchParams.set("team",ae),history.replaceState(history.state,"",n.href)}catch{}}var Gs=(e,t={})=>Fn(e,t),q=(e,t={})=>Fn(e==="/api/auth/logout"?e:Kt(e),t),Ue=e=>Fn(Kt(e),{},!0),ct=new Map;function Fn(e,t={},n=!1){let r=t.method??"GET";if(r!=="GET"&&ct.clear(),!n||r!=="GET"||Object.keys(t).length)return mo(e,t);let o=ct.get(e);if(o)return o;let i=mo(e,t);return ct.set(e,i),i.finally(()=>{ct.get(e)===i&&ct.delete(e)}).catch(()=>{}),i}async function mo(e,t={}){let n;try{n=await fetch(e,{...t,headers:{"content-type":"application/json",...t.headers||{}}})}catch{throw new le("Can't reach code-flow. Is the server still running?",0)}let r=await n.json().catch(()=>({}));if(n.status===401&&r.signIn&&Ei(),!n.ok)throw new le(r.error||n.statusText,n.status,r.confirm);return r}function Ei(){try{let e=Number(sessionStorage.getItem("signInReload")??0);if(Date.now()-e<6e4)return;sessionStorage.setItem("signInReload",String(Date.now()))}catch{}location.reload()}var Gt=(e,t={})=>q(e,{method:"POST",body:JSON.stringify(t)}),we=e=>{let t=ue;return t?`ssh:${t}:${e}`:e},p={remove(e){try{localStorage.removeItem(we(e))}catch{}},get(e){try{return localStorage.getItem(we(e))}catch{return null}},set(e,t){try{localStorage.setItem(we(e),t)}catch{}},json(e,t){try{return JSON.parse(localStorage.getItem(we(e))??"null")??t}catch{return t}}},Ys=!["localhost","127.0.0.1","[::1]"].includes(location.hostname),Zs=encodeURIComponent;function Qs(e){if(typeof e=="string")try{let{protocol:t}=new URL(e);return t==="https:"||t==="http:"?e:void 0}catch{return}}function Xs(){let e=0;return()=>{let t=++e;return()=>t===e}}function ea(){let e=se(0);return Lt(()=>()=>{e.current++},[]),Xr(()=>{let t=++e.current;return()=>t===e.current},[])}function ta(e,t,n,r=!0){let o=se(e);o.current=e,Lt(()=>{if(!r)return;let i=!0,s=()=>i,a=jr(()=>o.current(s),t);return()=>{i=!1,a()}},[r,t,...n])}var Yt=e=>(e||"").replace(/\/+$/,"").split("/").pop()??"",na=e=>e<1024?`${e} B`:e<1048576?`${Math.round(e/1024)} KB`:`${(e/1048576).toFixed(1)} MB`,ra=e=>{let t=Math.round((Date.now()-e)/1e3);return t<60?"just now":t<3600?`${Math.floor(t/60)}m ago`:t<86400?`${Math.floor(t/3600)}h ago`:`${Math.floor(t/86400)}d ago`},oa=e=>e<6e4?`${Math.round(e/1e3)}s`:e<36e5?`${Math.floor(e/6e4)}m ${Math.round(e%6e4/1e3)}s`:`${Math.floor(e/36e5)}h ${Math.round(e%36e5/6e4)}m`,ia=e=>e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(e<1e4?1:0)}k`:`${(e/1e6).toFixed(1)}M`,sa=e=>e>=10?`$${e.toFixed(0)}`:e>=.01?`$${e.toFixed(2)}`:e>0?"<$0.01":"$0",aa=(e,t)=>t?`${Math.round(e/t*100)}%`:"\u2013",ho={claude:"Claude",codex:"Codex",agy:"Antigravity",auto:"Auto"};var la={running:"Running",done:"Done",failed:"Failed",cancelled:"Cancelled",stopped:"Stopped at limit",interrupted:"Interrupted"},vo=d(null),go;function dt(e,t=2e3){vo.value={text:e,id:Date.now()},clearTimeout(go),go=setTimeout(()=>vo.value=null,t)}async function ua(e,t="Copied"){try{return await navigator.clipboard.writeText(e),dt(t)}catch{let n=document.createElement("textarea");n.value=e,n.setAttribute("readonly",""),n.style.cssText="position:fixed;top:0;left:0;opacity:0",document.body.append(n),n.select();let r=document.execCommand("copy");n.remove(),dt(r?t:`Copy this: ${e}`,r?2e3:6e3)}}var ca=e=>new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result).split(",")[1]||""),r.onerror=()=>n(r.error),r.readAsDataURL(e)});var Ai=0;function x(e,t,n,r,o,i){t||(t={});var s,a,u=t;if("ref"in u)for(a in u={},t)a=="ref"?s=t[a]:u[a]=t[a];var c={type:e,props:u,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Ai,__i:-1,__u:0,__source:o,__self:i};if(typeof e=="function"&&(s=e.defaultProps))for(a in s)u[a]===void 0&&(u[a]=s[a]);return y.vnode&&y.vnode(c),c}var M=(e,t,n)=>`M${e-n} ${t}a${n} ${n} 0 1 0 ${2*n} 0a${n} ${n} 0 1 0 ${-2*n} 0`,Ii={menu:"M4 7h16M4 12h16M4 17h16",help:`${M(12,12,9)}M9.5 9a2.5 2.5 0 1 1 4 2c-1 .6-1.5 1-1.5 2M12 17h.01`,plus:"M12 5v14M5 12h14",search:`${M(11,11,7)}M20 20l-4-4`,filter:"M4 6h16M7 12h10M10 18h4",folder:"M4 7a2 2 0 0 1 2-2h4l2 2h6a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2z",project:"M5 4h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM14 4h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM5 13h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1zM14 13h5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1z",chevron:"M7 10l5 5 5-5",bell:"M6 16v-5a6 6 0 1 1 12 0v5l2 2H4zM10 21h4",chart:"M5 20v-9M12 20V5M19 20v-7",clock:`${M(12,12,9)}M12 7v5l3 2`,attach:"M20 11.5l-7.8 7.8a5 5 0 0 1-7.1-7.1l8.5-8.5a3.3 3.3 0 0 1 4.7 4.7l-8.5 8.5a1.7 1.7 0 0 1-2.4-2.4L15 7",pull:`${M(6,6,2.25)}${M(6,18,2.25)}${M(18,18,2.25)}M6 8.25v7.5M18 15.75V10a3 3 0 0 0-3-3h-4M13.5 4.5 11 7l2.5 2.5`,files:"M8 3h7l4 4v10a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zM15 3v4h4M3 8v11a2 2 0 0 0 2 2h9",file:"M7 3h7l4 4v12a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zM14 3v4h4",layers:"M12 3l9 5-9 5-9-5zM3 13l9 5 9-5M3 17.5l9 5 9-5",phone:"M8 2h8a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM11 18h2",send:"M12 19V5M6 11l6-6 6 6",compare:"M12 4v16M8 20h8M5 7h14M5 7l-3 7a3 3 0 0 0 6 0zM19 7l-3 7a3 3 0 0 0 6 0z",chat:"M4 5h16v11H9l-5 4z",terminal:"M4 17l6-5-6-5M12 19h8",globe:`${M(12,12,9)}M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18`,note:"M5 4h10l4 4v12H5zM15 4v4h4M8 11h8M8 15h6",panel:"M4 5h16v14H4zM15 5v14",sidebar:"M4 5h16v14H4zM9 5v14",pin:"M9 3h6M10 3v6l-4 5h12l-4-5V3M12 14v7",diff:"M12 4v8M8 8h8M8 18h8",split:"M4 5h16v14H4zM4 12h16",close:"M6 6l12 12M18 6L6 18",external:"M14 4h6v6M20 4l-9 9M19 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h5",refresh:"M20 12a8 8 0 1 1-2.3-5.7M20 4v5h-5",stop:"M7 7h10v10H7z",more:`${M(5,12,1)}${M(12,12,1)}${M(19,12,1)}`,archive:"M4 5h16v4H4zM5 9v9a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V9M10 13h4",sliders:`M4 7h9M17 7h3M4 17h3M11 17h9${M(15,7,2)}${M(9,17,2)}`,keyboard:"M4 6h16a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zM7 10h.01M11 10h.01M15 10h.01M8 14h8",sparkle:"M10 3l1.9 5.1L17 10l-5.1 1.9L10 17l-1.9-5.1L3 10l5.1-1.9zM18 14l.9 2.1L21 17l-2.1.9L18 20l-.9-2.1L15 17l2.1-.9z",sun:`${M(12,12,4)}M12 2v2M12 20v2M2 12h2M20 12h2M5 5l1.5 1.5M17.5 17.5L19 19M19 5l-1.5 1.5M6.5 17.5L5 19`,moon:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z",alert:"M10.3 4.2 2.6 17.5A2 2 0 0 0 4.3 20.5h15.4a2 2 0 0 0 1.7-3L13.7 4.2a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01",play:"M7 5v14l11-7z",issue:`${M(12,12,9)}${M(12,12,1)}`,people:`${M(9,8,3.5)}M3 20v-1.5A4.5 4.5 0 0 1 7.5 14h3a4.5 4.5 0 0 1 4.5 4.5V20M16 4.6a3.5 3.5 0 0 1 0 6.8M21 20v-1.5a4.5 4.5 0 0 0-3.5-4.4`};function Bn({name:e,class:t=""}){return x("svg",{class:`icon ${t}`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",children:x("path",{d:Ii[e]})})}var xe,V={state:"connecting"},Kn=new Set;function _a(e){if($)throw new Error("Configure stream sharing before subscribing");xe=e&&/^[a-f0-9]{64}$/.test(e.channelKey)&&/^[a-f0-9]{32}$/.test(e.lockId)?{...e}:void 0}function wo(e){return Kn.add(e),e(V),()=>{Kn.delete(e)}}function ce(e){V=typeof navigator<"u"&&navigator.onLine===!1?{...e,state:"offline"}:e;for(let t of Kn)t(V);$==="leader"&&Fe?.postMessage({kind:"state",state:V})}var mt=new Map,bo=1,$;function xo(e,t,n){$??qi();let r=bo++,o={topic:e,onData:t,cursor:n};return mt.set(r,o),$==="follower"?ft():ko(r,{topic:e,cursor:()=>n?.(),deliver:t}),()=>{mt.delete(r)&&($==="follower"?ft():So(r))}}var ee=new Map,He=new Set,en=new Set,X,be="",Wn=!1,Vn=!1,ke,Gn=0,zn=!1;function ko(e,t){if(ee.set(e,t),X||ke)return nn();zn||(zn=!0,queueMicrotask(()=>{zn=!1,!X&&!ke&&tn()}))}function So(e){ee.delete(e)&&(en.delete(e),nn())}function To(e,t){let n=t.cursor();return n?{id:e,topic:t.topic,after:n}:{id:e,topic:t.topic}}function tn(){if(clearTimeout(ke),ke=void 0,X?.close(),be="",en.clear(),!ee.size){X=void 0;return}ce({...V,state:Gn?"reconnecting":"connecting"});let e=[...ee].map(([n,r])=>To(n,r));He=new Set(e.map(n=>n.id));let t=new EventSource(Kt(`/api/stream?subs=${encodeURIComponent(JSON.stringify(e))}`));X=t,t.onmessage=n=>{if(X!==t)return;let r;try{r=JSON.parse(n.data)}catch{return}if(!r||!Number.isSafeInteger(r.s)||r.s<0||!r.d||typeof r.d!="object")return;let{s:o,d:i}=r;if(ce({state:"connected",lastReceived:Date.now()}),o===0){i?.type==="hello"&&(be=i.client,Gn=0,nn());return}i?.type==="error"&&(He.delete(o),en.add(o)),ee.get(o)?.deliver(i)},t.onerror=()=>{X===t&&Ro()}}function Ro(){X?.close(),X=void 0,be="",ce({...V,state:"reconnecting"}),clearTimeout(ke);let e=[500,1e3,2e3,5e3][Math.min(Gn++,3)],t=async()=>{try{if(xe){let n=await q("/api/auth/self");if(n.kind!=="owner"||n.streamSharing?.channelKey!==xe.channelKey||n.streamSharing?.lockId!==xe.lockId){location.reload();return}}await q("/api/health"),tn()}catch{ke=setTimeout(()=>void t(),5e3)}};ke=setTimeout(()=>void t(),e)}function nn(){Vn||(Vn=!0,queueMicrotask(()=>{Vn=!1,Oi()}))}async function Oi(){if(Wn||!be)return;let e=[...ee].filter(([r])=>!He.has(r)&&!en.has(r)),t=[...He].filter(r=>!ee.has(r));if(!e.length&&!t.length)return;Wn=!0;let n=be;for(let[r]of e)He.add(r);for(let r of t)He.delete(r);try{await Gt(`/api/stream/${n}`,{subscribe:e.map(([r,o])=>To(r,o)),unsubscribe:t})}catch(r){let o=r instanceof le?r.status:0;be===n&&(o===0||o===404||o>=500)&&Ro()}finally{Wn=!1,be&&nn()}}var _o="codeflow-stream",Zt="",Qt="",Xt=`${Date.now().toString(36)}${Math.random().toString(36).slice(2,10)}`,yo=15e3,Fe,pt=new Map;function qi(){if(window.addEventListener("offline",()=>ce({...V,state:"offline"})),window.addEventListener("online",()=>{ce({...V,state:"reconnecting"}),$==="follower"?ft():ee.size&&tn()}),!xe||typeof BroadcastChannel!="function"||typeof navigator>"u"||!navigator.locks?.request){$="solo";return}Zt=`${_o}:${xe.channelKey}`,Qt=`${_o}:${xe.lockId}`,$="follower",Fe=new BroadcastChannel(Zt);let e=new BroadcastChannel(`${Zt}:${Xt}`);e.onmessage=t=>{t.data.s===0&&t.data.d?.type==="transport"?ce(t.data.d.state):mt.get(t.data.s)?.onData(t.data.d)},Fe.onmessage=t=>{let n=t.data;n.kind==="leader"?(ce(n.state),$==="follower"&&ft()):n.kind==="state"?$==="follower"&&ce(n.state):$==="leader"&&Yn(n.window,n.kind==="subs"?n.subs:[])},navigator.locks.request(Qt,()=>(Ni(),new Promise(()=>{}))),navigator.locks.request(`${Qt}:${Xt}`,()=>new Promise(()=>{})),window.addEventListener("pagehide",()=>$==="follower"&&Fe?.postMessage({kind:"bye",window:Xt})),setInterval(()=>{if($==="follower")ft();else if($==="leader")for(let[t,n]of pt)Date.now()-n.seen>yo*3&&Yn(t,[])},yo)}function Ni(){$="leader";for(let[e,t]of mt)ee.set(e,{topic:t.topic,cursor:()=>t.cursor?.(),deliver:t.onData});tn(),Fe.postMessage({kind:"leader",state:V})}var Jn=!1;function ft(){Jn||(Jn=!0,queueMicrotask(()=>{Jn=!1,$==="follower"&&Fe.postMessage({kind:"subs",window:Xt,subs:[...mt].map(([e,t])=>[e,t.topic,t.cursor?.()])})}))}function Yn(e,t){let n=pt.get(e);if(!n){if(!t.length)return;n={ids:new Map,cursors:new Map,seen:0,out:new BroadcastChannel(`${Zt}:${e}`)},pt.set(e,n),navigator.locks.request(`${Qt}:${e}`,()=>pt.get(e)===n&&Yn(e,[]))}let r=n;r.out.postMessage({s:0,d:{type:"transport",state:V}}),r.seen=Date.now();let o=new Map(t.map(([i,s,a])=>[i,{topic:s,after:a}]));for(let[i,s]of r.ids)o.has(i)||(r.ids.delete(i),r.cursors.delete(i),So(s));for(let[i,{topic:s,after:a}]of o){if(r.cursors.set(i,a),r.ids.has(i))continue;let u=bo++;r.ids.set(i,u),ko(u,{topic:s,cursor:()=>r.cursors.get(i),deliver:c=>r.out.postMessage({s:i,d:c})})}r.ids.size||(r.out.close(),pt.delete(e))}function Zn(e,t=!1,n){if(t)return"Running";if(e.status==="running")return"Pending";let r=e.verification?.branch??e.worktrees?.find(o=>o.name===e.lastCheck?.worktree)?.branch;return n&&r!==n?"Not verified for this branch":e.checkCantRun?"Blocked":e.verdict==="failing"?"Failed":e.verification?{verified:"Passed","needs-changes":"Failed",blocked:"Blocked",unchecked:"Unverified"}[e.verification.state]:e.verdict==="passed"?"Passed":e.loop?.check?"Not verified":"Not configured"}var Di=e=>e.status==="done"&&Zn(e)==="Passed";function Li(e){if(e.status!=="done")return e.status;let t=Zn(e);return t==="Failed"?"failing":t==="Blocked"?"unchecked":t==="Passed"?"done":"unverified"}function Be(e){if(e.archived)return!1;let t=e.status==="running"&&!!e.team?.awaitingRequestId;return e.awaiting||t?!0:e.projectTeam?!1:e.team?.status==="blocked"||e.triage?.state==="pending"||Object.values(e.watches??{}).some(n=>n.state==="needs-you")||e.status!=="running"&&(e.status==="interrupted"||!e.seen)}var jo=e=>Object.keys(e.integrity??{}).length>0||!!e.followUps?.some(t=>t.integrity?.length);function Po(e,t){if(t.repo&&e.repo!==t.repo||t.pattern&&e.pattern!==t.pattern||t.agent&&!Object.values(e.roles).some(n=>n.some(r=>r===t.agent))||t.section&&(e.archived||(t.section==="waiting"?!Be(e):Be(e)||(t.section==="running"?e.status!=="running":e.status==="running"))))return!1;switch(t.status){case"attention":return Be(e);case"running":return e.status==="running";case"passed":return Di(e);case"failing":return Zn(e)==="Failed"||["failed","stopped","interrupted"].includes(e.status);case"flagged":return jo(e);default:return!0}}var z=d(null);function xa(e,t){if(!e)return;let n=e.kind!=="alert"||(e.tool??"code-scanning")===(t?.alert?.tool??"code-scanning")&&JSON.stringify(e.numbers?.length?e.numbers:[e.number])===JSON.stringify(t?.alert?.numbers?.length?t.alert.numbers:[t?.number]);if(!(t?.kind===e.kind&&t.number===e.number&&!!t.ci==!!e.ciLogs&&n))return{kind:e.kind,number:e.number,ciLogs:!!e.ciLogs,tool:e.tool,numbers:e.numbers}}function Qn(e){if(e==null)return;if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Context budget must be an object.");let t=e;if(Object.keys(t).some(r=>!["maxPromptBytes","maxApproximateTokens","policy"].includes(r)))throw new Error("Unknown context budget field.");let n=(r,o)=>Number.isSafeInteger(r)&&Number(r)>=1&&Number(r)<=o;if(t.maxPromptBytes!==void 0&&!n(t.maxPromptBytes,64*1024*1024)||t.maxApproximateTokens!==void 0&&!n(t.maxApproximateTokens,16*1024*1024))throw new Error("Context ceilings must be positive bounded integers.");if(t.maxPromptBytes===void 0&&t.maxApproximateTokens===void 0)throw new Error("Choose at least one context ceiling.");if(t.policy!==void 0&&t.policy!=="warn"&&t.policy!=="block")throw new Error("Context budget policy must be warn or block.");return{...t.maxPromptBytes!==void 0?{maxPromptBytes:t.maxPromptBytes}:{},...t.maxApproximateTokens!==void 0?{maxApproximateTokens:t.maxApproximateTokens}:{},policy:t.policy??"warn"}}var rn;try{rn=Qn(JSON.parse(p.get("contextBudget")??"null"))}catch{rn=void 0}var vt=d(rn),We=d(rn?p.get("contextBudgetOrigin")||"Explicit browser preference":"Application default");function Pa(e,t){let n=Qn(e);vt.value=n,We.value=t??(n?"Explicit browser preference":"Application default"),p.set("contextBudget",JSON.stringify(n??null)),p.set("contextBudgetOrigin",We.value)}var on=d(),gt=d();function Co(e,t,n){let r=e.find(s=>s.id===t),o=e.filter(s=>s.repos.includes(n)),i=t&&!r?"This project's draft is retained, but the project is unavailable. Choose a destination.":r&&n&&!r.repos.includes(n)?"This repository is no longer in the project. Add it explicitly or choose another repository.":!r&&n?"Choose a project for this repository before starting.":"";return{project:r,matches:o,problem:i}}function Mo(e,t,n){if(e.some(o=>o.id===t&&o.repos.includes(n)))return t;let r=e.filter(o=>o.repos.includes(n));return r.length===1?r[0].id:""}var sn=class{constructor(t,n=globalThis.localStorage){this.prefix=t;this.fallback=n}database;connection;writes=Promise.resolve();memory=new Map;failures=new Set;get unsavedKeys(){return[...this.failures]}open(){return this.database??=new Promise((t,n)=>{let r=!1,o=indexedDB.open("codeflow-project-drafts",1);o.onupgradeneeded=()=>o.result.createObjectStore("drafts"),o.onsuccess=()=>{if(r){o.result.close();return}this.connection=o.result,t(o.result)},o.onerror=()=>n(o.error),o.onblocked=()=>{r=!0,n(new Error("Close older Code Flow tabs to restore drafts."))}}).catch(()=>{})}async read(t){await this.writes.catch(()=>{});let n=this.prefix+t;if(this.memory.has(n))return structuredClone(this.memory.get(n));let r=typeof indexedDB>"u"?void 0:await this.open();if(!r){let o=this.fallback?.getItem(n);return o?JSON.parse(o):void 0}return new Promise((o,i)=>{let a=r.transaction("drafts","readonly").objectStore("drafts").get(n);a.onsuccess=()=>o(a.result),a.onerror=()=>i(a.error)})}write(t,n){let r=this.prefix+t,o=structuredClone(n);this.memory.set(r,o);let s=(async()=>{let a=typeof indexedDB>"u"?void 0:this.connection??await this.open();if(!a){if(!this.fallback)throw new Error("Draft storage is unavailable.");this.fallback.setItem(r,JSON.stringify(o));return}await new Promise((u,c)=>{let f=a.transaction("drafts","readwrite");f.objectStore("drafts").put(o,r),f.oncomplete=()=>u(),f.onerror=()=>c(f.error),f.onabort=()=>c(f.error??new Error("Draft save was interrupted.")),f.commit?.()})})().then(()=>{this.failures.delete(t)},a=>{throw this.failures.add(t),a});return this.writes=Promise.all([this.writes.catch(()=>{}),s]).then(()=>{}),this.writes.catch(()=>{}),s}};var $o=e=>e==="claude"||e==="codex"||e==="agy";var Ui=/^[a-z][a-z0-9-]{0,39}$/,Te=e=>!!e&&typeof e=="object"&&!Array.isArray(e),b=e=>{throw new Error(e)},U=(e,t=4e3)=>typeof e=="string"&&e.length<=t&&!e.includes("\0")?e:b("Template text is missing or too long"),Se=e=>typeof e=="string"&&Ui.test(e)?e:b("Use lowercase template identifiers (up to 40 characters)"),de=(e,t=24)=>Array.isArray(e)&&e.length<=t?e.map(n=>U(n)):b("Invalid template list");function an(e){if(!Te(e)||e.schemaVersion!==1)return b("Expected a version 1 team template");let t=["schemaVersion","id","version","name","description","scope","project","autoEnabled","parameters","roles","tasks","contracts","workflow","task","criteria","preferences"];if(Object.keys(e).some(l=>!t.includes(l)))return b("Templates cannot contain permissions, credentials, sessions, or unsupported fields");if(!Number.isSafeInteger(e.version)||e.version<1||!["builtin","personal","project"].includes(e.scope)||typeof e.autoEnabled!="boolean")return b("Invalid template version or scope");if(e.scope==="project"!=(typeof e.project=="string"&&!!e.project))return b("Project templates need a project; personal templates cannot bind one");let n=de(e.parameters).map(Se),r=de(e.roles,6).map(Se);if(new Set(n).size!==n.length||new Set(r).size!==r.length)return b("Duplicate template parameters or roles");if(!Array.isArray(e.tasks)||e.tasks.length>24)return b("A template can contain at most 24 tasks");let o=e.tasks.map(l=>{if(!Te(l)||Object.keys(l).some(g=>!["id","title","role","kind","instructions","dependsOn","dependencyTypes","paths","acceptance"].includes(g))||!["implementation","investigation"].includes(l.kind))return b("Invalid template task");let m={id:Se(l.id),title:U(l.title,200),role:Se(l.role),kind:l.kind,instructions:U(l.instructions,8e3),dependsOn:de(l.dependsOn).map(Se),paths:de(l.paths),acceptance:de(l.acceptance)};if(l.dependencyTypes!==void 0){if(!Te(l.dependencyTypes)||Object.entries(l.dependencyTypes).some(([g,P])=>!m.dependsOn.includes(g)||!["completion","artifact","knowledge"].includes(P)))return b("Invalid template dependency types");m.dependencyTypes={...l.dependencyTypes}}if(!r.includes(m.role)||!m.title.trim()||!m.instructions.trim()||!m.acceptance.length||m.acceptance.some(g=>!g.trim())||!m.paths.length)return b("Every task needs a role, instructions, owned paths, and acceptance criteria");for(let g of m.paths)if(!Fi(g))return b("Template paths must be repository relative");return m});if(new Set(o.map(l=>l.id)).size!==o.length)return b("Duplicate template task IDs");let s=new Set,a=new Set,u=l=>{if(a.has(l))return b("Template dependencies contain a cycle");if(s.has(l))return;let m=o.find(g=>g.id===l);if(!m)return b(`Unknown template dependency ${l}`);a.add(l),m.dependsOn.forEach(u),a.delete(l),s.add(l)};o.forEach(l=>u(l.id));let c=e.workflow===void 0?void 0:Se(e.workflow);if(c&&o.length||!c&&!o.length)return b("Choose a fixed workflow or a task graph");if(c&&e.autoEnabled)return b("Fixed workflows are manual templates; Auto composes validated task graphs");let f={schemaVersion:1,id:Se(e.id),version:e.version,name:U(e.name,100),description:U(e.description),scope:e.scope,...e.project?{project:U(e.project,200)}:{},autoEnabled:e.autoEnabled,parameters:n,roles:r,tasks:o,contracts:de(e.contracts),...c?{workflow:c}:{},task:U(e.task,1e5),criteria:de(e.criteria,100)};if(!f.name.trim()||!f.task.trim())return b("Give the template a name and a task prompt");e.preferences!==void 0&&(f.preferences=Hi(e.preferences));let w=JSON.stringify([o,f.contracts,f.task,f.criteria]);for(let l of w.matchAll(/\{\{([a-z][a-z0-9-]*)\}\}/g))if(!n.includes(l[1]))return b(`Undeclared parameter ${l[1]}`);return JSON.stringify(f).length>15e4?b("Template is too large"):f}function Hi(e){if(!Te(e)||Object.keys(e).some(r=>!["roles","options","agentSettings","roleSettings"].includes(r)))return b("Template preferences may contain only roles, options and model settings");let t=(r,o)=>!Te(r)||Object.keys(r).length>64||Object.keys(r).some(i=>!/^[a-zA-Z][a-zA-Z0-9_:/.-]{0,150}$/.test(i)||["constructor","prototype","__proto__"].includes(i))?b("Invalid template preference record"):Object.fromEntries(Object.entries(r).map(([i,s])=>[i,o(s)])),n=r=>t(r,o=>{if(!Te(o)||Object.keys(o).some(s=>!["model","effort","variants"].includes(s)))return b("Only model and effort preferences are supported");if(o.variants!==void 0&&(!Array.isArray(o.variants)||o.variants.length>128))return b("Invalid model variants");let i=o.variants?.map(s=>!Te(s)||Object.keys(s).some(a=>!["model","effort"].includes(a))?b("Invalid model variant"):{model:U(s.model,256),...s.effort!==void 0?{effort:U(s.effort,64)}:{}});return{...o.model!==void 0?{model:U(o.model,256)}:{},...o.effort!==void 0?{effort:U(o.effort,64)}:{},...i?{variants:i}:{}}});return{roles:t(e.roles??{},r=>de(r,6)),options:t(e.options??{},r=>typeof r=="boolean"||typeof r=="number"&&Number.isFinite(r)?r:b("Invalid workflow option")),agentSettings:n(e.agentSettings??{}),roleSettings:t(e.roleSettings??{},n)}}function Fi(e){return e==="*"||!!e&&!/^[/-]|^[A-Za-z]:|[\\\x00-\x1f]/.test(e)&&!e.split("/").some(t=>!t||t==="."||t===".."||t===".git")&&!e.includes("*")}function Eo(e,t){if(Object.keys(t).some(r=>!e.parameters.includes(r)))return b("Unknown template input");for(let r of e.parameters)if(typeof t[r]!="string"||!t[r].trim()||t[r].length>1e4)return b(`Enter a value for ${r}`);let n=r=>r.replace(/\{\{([a-z][a-z0-9-]*)\}\}/g,(o,i)=>t[i]);return an({...e,task:n(e.task),criteria:e.criteria.map(n),contracts:e.contracts.map(n),tasks:e.tasks.map(r=>({...r,title:n(r.title),instructions:n(r.instructions),acceptance:r.acceptance.map(n),paths:r.paths.map(n)}))})}function Ia(e,t){let n=[...new Set(e.tasks.map(o=>o.owner))],r=o=>`worker-${n.indexOf(o)+1}`;return an({schemaVersion:1,...t,version:1,description:"Strategy saved from a run. Review task-specific instructions and replace them with parameters before reuse.",autoEnabled:!1,parameters:["task"],roles:n.map(r),task:"{{task}}",criteria:[],contracts:[...e.contracts],tasks:e.tasks.map(o=>({id:o.id,role:r(o.owner),title:o.title,kind:o.kind,instructions:o.instructions,dependsOn:[...o.dependsOn],...o.dependencyTypes?{dependencyTypes:{...o.dependencyTypes}}:{},paths:[...o.paths],acceptance:[...o.acceptance]}))})}function Bi(){try{let e=p.json("selectedTeamTemplate",null);if(!e)return null;let t=an(e.template);return Eo(t,e.inputs),{template:t,inputs:e.inputs}}catch{return null}}var pe=d(Bi());Q(()=>{pe.value?p.set("selectedTeamTemplate",JSON.stringify(pe.value)):p.remove("selectedTeamTemplate")});function Ao(e,t,n,r){let o={...t},i=s=>r.find(a=>!s.includes(a));if(e==="race"&&!n.judge&&!o.contestants?.includes("auto")){let s=i(o.contestants??[]);s&&(o.judge=[s])}if(e==="supervisor"&&!n.reviewer){let[s]=o.supervisor??[],a=s&&i([s]);s&&s!=="auto"&&(o.reviewer?.[0]??s)===s&&a&&(o.reviewer=[a])}if(e==="pipeline"&&!n.reviewer){let[s]=o.planner??[],[a]=o.builder??[],[u]=o.reviewer??[];if(s&&s!=="auto"&&u!=="auto"&&(u===s||u===a)){let c=i([s,...a&&a!=="auto"?[a]:[]])??i([s]);c&&(o.reviewer=[c])}}if(e==="debate"&&!n.synthesizer&&!o.debaters?.includes("auto")){let[s]=o.synthesizer??[],a=i(o.debaters??[]);s&&o.debaters?.includes(s)&&a&&(o.synthesizer=[a])}return o}function Io(e,t){return t??e==="auto-team"}function Ha(e,t,n){return e&&(t||n==="team")?4:1}function Fa(e){return e.status==="stopped"&&e.team?.status==="blocked"&&e.patternDone!==!0}function Oo(e){return e.status==="running"&&!!e.team?.awaitingRequestId}function Ba(e,t){let n=t.dependsOn.flatMap(r=>{let o=e.tasks.find(u=>u.id===r),i=!!o&&(o.status==="completed"||o.status==="submitted")&&!o.evidenceStale,s=t.dependencyTypes?.[r]??"completion";return(s==="artifact"?i&&!!o?.head&&!!o.artifacts?.length:s==="knowledge"?!o?.evidenceStale&&(i&&!!o?.artifacts?.length||e.messages.some(u=>u.kind==="reply"&&u.sender===o?.owner&&u.recipient===t.owner&&u.taskId===t.id&&u.evidence.length>0&&u.status!=="open")):i)?[]:[`Waiting for ${o?.title??r}${o?.evidenceStale?" to be reverified":s==="artifact"?" artifacts":s==="knowledge"?" knowledge":""}`]});for(let r of e.messages){if(r.kind!=="question"||r.taskId!==t.id||!r.blocking||r.status!=="open")continue;let o=e.members.find(i=>i.id===r.recipient);n.push(`Waiting for ${r.recipient==="user"?"your answer":o?.name??r.recipient}: ${r.body}`)}return t.error&&n.push(t.error),n}function Wa(e,t,n="done"){let r=e.tasks.filter(s=>s.requirements.includes(t));if(!r.length)return"unassigned";if(!r.every(s=>s.status==="completed"&&!s.evidenceStale))return"in_progress";let o=e.verification;return n==="done"&&e.status==="completed"&&!!o?.approved&&o.reviewed&&!e.gaps.length?o.check==="passed"||o.check==="not_required"?"verified":"reviewed_unchecked":"awaiting_verification"}function Va(e,t){if(t.status==="retired")return"Retired";let n=e.tasks.filter(r=>r.owner===t.id);return n.some(r=>r.status==="running")?"Working":n.some(r=>r.status==="needs_info")?"Waiting for information":n.some(r=>r.status==="failed")?"Needs attention":n.length&&n.every(r=>r.status==="completed")?"Finished assignments":t.status?{idle:"Ready",working:"Working",waiting:"Waiting",done:"Done",failed:"Needs attention",retired:"Retired"}[t.status]:"Ready"}var mr=d([]);async function sl(){let e=await Ue("/api/agents");for(let t of e)ho[t.id]=t.displayName;mr.value=e}var rr=d([]),qo=d({}),O=d(new Map),Wi=d(null);async function al(){try{let e=await q("/api/team-rollout");Wi.value=e}catch{}}var vr=d(!1),I=d({view:"composer"});function ll(e=location.hash){return Ln(e)}var ul=d(!1),Vi=d(p.get("railCollapsed")==="1");function cl(e){Vi.value=e,p.set("railCollapsed",e?"1":"0")}var dl=d(!1),zo=d(window.innerWidth>760&&p.get("sideOpen")==="1"),Jo=d(ut.includes(p.get("sideTab"))?p.get("sideTab"):"chat"),No=d(Math.min(Math.max(Number(p.get("sideWidth"))||420,300),900));function zi(e){e&&(Ko(e),hn({tab:e})),zo.value=!0,p.set("sideOpen","1")}function Ko(e){Jo.value=e,p.set("sideTab",e)}function pl(){zo.value=!1,p.set("sideOpen","0")}function fl(e){No.value=Math.min(Math.max(Math.round(e),300),900),p.set("sideWidth",String(No.value))}var ml=A(()=>gn.value.chat||null);function Ji(e,t=Ae.value.key){let n=Ye.value[t]??{at:0},r=e&&!e.startsWith("side:")&&e!=="solo";hn({chat:e??"",chats:r&&!(n.chats??[]).includes(e)?[...n.chats??[],e]:n.chats,closed:e?.startsWith("side:")?n.closed?.filter(o=>o!==e):n.closed},t)}var vl=d(""),yt=d([]);function Ki(e,t,n=[]){yt.value=[...yt.value,{to:e,text:t,images:n}]}function gl(e){let t=yt.value.filter(n=>n.to===e);return t.length&&(yt.value=yt.value.filter(n=>n.to!==e)),t}var hl=d(null);var Gi=e=>mr.value.find(t=>t.id===e)?.available??!1,_l=d(""),yl=d(!1),wl=d(!1),Ke=d(null),Do=d(""),Xn=d(!1),un=d(!1),B=A(()=>Ke.value?.repo??""),dn=d(p.get("repo")??""),te=0,or=0,pn=Promise.resolve();async function Go(e,t=!0){e=e.trim();let n=e&&z.value?.repo===B.value?z.value:null;dn.value=e;let r=++te;++or;let o=()=>{z.value=null,Ke.value=null,cn.value=null,N.value="",H.value="",ht.value="",me.value=["safe","standard","trusted","full"].includes(p.get("trust")??"")?p.get("trust"):"standard",St.value=new Map};if(n||o(),un.value=!1,Xn.value=!0,Do.value="",!e)return Xn.value=!1,!0;try{let i=await q(`/api/branches?repo=${encodeURIComponent(e)}`);if(r!==te)return!1;let s=n&&i.repo===n.repo&&z.value?.repo===i.repo;if(n&&!s&&o(),Ke.value=i,dn.value=i.repo,!s&&Me.value&&!i.branches.some(a=>a.name===Me.value)&&(Me.value=""),t&&(p.set("repo",i.repo),p.set("recentRepos",JSON.stringify([i.repo,...Yi().filter(a=>a!==i.repo)].slice(0,8)))),s)return!0}catch(i){if(r!==te||(n||(Ke.value=null),Do.value=e?Xo(e.split("/").pop()||e,i):"",n))return!1}finally{r===te&&(Xn.value=!1)}return r!==te?!1:(pn=cs(),await pn,r===te&&fe.value.thisRepo&&Tr(),r===te)}var Yi=()=>p.json("recentRepos",[]),bl=d(null),bt="",Yo="none",E=d([]),Zo=d(!1),jt=d(p.get("project")??bt),xl=A(()=>E.value.find(e=>e.id===jt.value)),D=d(p.get("composerProject")??""),je=d(!1),gr=d(!1),Ge=d(""),Zi=d("filter"),Qi=d(null),xt=d({}),Xi=d(!1),es=d(null);function kl(e){Zi.value="filter",es.value=e,Xi.value=!0}async function Qo(){try{E.value=await Ue("/api/projects"),Zo.value=!0}catch{return}let e=jt.value;e!==bt&&e!==Yo&&!E.value.some(t=>t.id===e)&&hr(bt)}function Pt(e){return e.project?E.value.find(t=>t.id===e.project):E.value.find(t=>t.repos.includes(e.repo))}function Sl(e,t=jt.value){if(t===bt)return!0;let n=Pt(e);return t===Yo?!n:n?.id===t}function hr(e){jt.value=e,p.set("project",e)}function Tl(e,t={}){hr(e)}function _r(e){let t=p.get(`projectRepo:${e.id}`);return t&&e.repos.includes(t)?t:[...O.value.values()].filter(r=>e.repos.includes(r.repo)&&Pt(r)?.id===e.id).sort((r,o)=>o.createdAt-r.createdAt)[0]?.repo??e.repos[0]??""}function ts(e){for(let[t,n]of Object.entries(e.teams))F.value={...F.value,[t]:n.roles},J.value={...J.value,[t]:n.roleSettings??{}};rr.value.some(t=>t.id===e.pattern)&&ii(e.pattern),ne.value=e.agentSettings??{},p.set("roleSel",JSON.stringify(F.value)),p.set("roleModels",JSON.stringify(J.value)),p.set("agentSettings",JSON.stringify(ne.value)),G.value={...G.value,pattern:"Project defaults",roles:"Project defaults",models:"Project defaults"}}var er=0;async function Rl(e,t=D.value){let n=++er;try{let r=await q(`/api/branches?repo=${encodeURIComponent(e)}`);if(n!==er)return;let o=E.value.find(s=>s.id===t);if(o?.repos.includes(r.repo)){if(D.value!==o.id&&!await fr(o.id))return;await ys(r.repo),I.value={view:"composer",project:o.id};return}let i=E.value.filter(s=>s.repos.includes(r.repo));if(!t&&i.length===1)return void await fr(i[0].id,{repository:r.repo,carryUnassigned:!0});Qi.value={repository:r.repo,project:o?.id}}catch(r){n===er&&dt(Xo(e,r),6e3)}}var ns=A(()=>{let e=B.value,t=Co(E.value,D.value,e);return{...t,adds:!!t.project&&!!e&&!t.project.repos.includes(e),creates:!t.project&&!!e}});async function jl(e){await Qo(),e&&jt.value!==bt&&hr(e)}function Xo(e,t){return t instanceof le?t.status===400&&/not a git repository/i.test(t.message)?`${e} isn't a git repository`:t.status===401?"Not signed in to code-flow":t.status>=500?`Couldn't open ${e}: ${t.message}`:t.message:`Couldn't reach code-flow to open ${e}`}var ei=d(p.json("sidePin",null)),yr=(e,t=!1)=>({key:`run:${e.id}`,kind:"run",run:e,project:Pt(e),repo:e.repo,pinned:t});function Qe(e,t,n=!1){let r=t;return{key:e?`project:${e.id}`:r?`repo:${r}`:"none",kind:"project",project:e,repo:r,pinned:n}}function ir(e,t){let n=e.startsWith("run:");return{key:e,kind:n?"run":"project",repo:"",pinned:t,waiting:!(n?vr.value:Zo.value)}}var Pl=e=>Qe(Pt(e),e.repo).key,ti=A(()=>{let e=I.value;if(e.view==="project"||e.view==="workspace"&&e.project){let t=E.value.find(n=>n.id===(e.view==="project"?e.id:e.project));if(t){let n=e.view==="project"?e.repository:void 0,r=n&&[...O.value.values()].some(o=>Pt(o)?.id===t.id&&t.repos.includes(o.repo)&&o.worktrees.some(i=>i.path===n));return Qe(t,n?t.repos.includes(n)||r?n:"":_r(t))}return ir(`project:${e.view==="project"?e.id:e.project}`,!1)}if(e.view==="run"||e.view==="review"){let t=O.value.get(e.id);if(t)return yr(t);if(!vr.value)return ir(`run:${e.id}`,!1)}return Qe(ns.value.project,B.value)}),sr=A(()=>I.value.view==="side"?I.value.scope:null);function rs(e){if(e.startsWith("run:")){let t=O.value.get(e.slice(4));return t?yr(t,!0):void 0}if(e.startsWith("project:")){let t=E.value.find(n=>n.id===e.slice(8));return t?Qe(t,t.repos.includes(B.value)?B.value:t.repos.length?_r(t):"",!0):void 0}return e.startsWith("repo:")?Qe(void 0,e.slice(5),!0):void 0}var Ae=A(()=>{let e=sr.value;if(e)return rs(e)??ir(e,!0);let t=ei.value;if(t?.kind==="run"){let n=O.value.get(t.id);if(n)return yr(n,!0)}else if(t)return Qe(E.value.find(n=>n.id===t.project),t.repo,!0);return ti.value});function ni(e){ei.value=e,p.set("sidePin",JSON.stringify(e))}function Cl(e){let t=Ae.value;ni(e?t.run?{kind:"run",id:t.run.id}:{kind:"project",project:t.project?.id,repo:t.repo}:null)}function os(e,t){let n=`run:${e}`;if(sr.value&&sr.value!==n)return ri({type:wr,route:{view:"run",id:e},drafts:[],sideChat:{run:e,chat:t}});Ji(`side:${t}`,n),Ae.value.key!==n&&ni(ti.value.key===n?null:{kind:"run",id:e}),zi("chat")}var Lo=200,Ye=d(p.json("sideMemory",{})),gn=A(()=>Ye.value[Ae.value.key]??{at:0});function hn(e,t=Ae.value.key){let n={...Ye.value,[t]:{...Ye.value[t],...e,at:Date.now()}},r=Object.keys(n);if(r.length>Lo)for(let o of r.sort((i,s)=>n[i].at-n[s].at).slice(0,r.length-Lo))delete n[o];Ye.value=n,p.set("sideMemory",JSON.stringify(n))}window.addEventListener("storage",e=>{if(e.key===we("sideMemory")&&e.newValue)try{Ye.value=JSON.parse(e.newValue)}catch{}});function Ml(){let e=gn.value.tab;e&&ut.includes(e)&&e!==Jo.value&&Ko(e)}var wr=ue?`codeflow:open:${ue}`:"codeflow:open",Uo=ue?`codeflow:ready:${ue}`:"codeflow:ready",Pe=null,ar=!1,lr=[];function is(e,t=[]){if(I.value.view==="side")return ri({type:wr,route:e,drafts:t});for(let n of t)Ki(n.to,n.text,n.images);I.value=e}function ss(){for(let e of[Pe,window.opener])try{if(e&&!e.closed&&e.location.origin===location.origin&&e.location.pathname===location.pathname)return e}catch{}return null}function ri(e){let t=ss();if(t&&(t!==Pe||ar)){t.postMessage(e,location.origin),t.focus();return}if(!t&&(lr.length=0,ar=!1,Pe=window.open(`${location.origin}${location.pathname}${Un(e.route)}`,"_blank"),!Pe))return dt("The browser blocked the window: allow pop-ups for code-flow",5e3);lr.push(e)}function $l(){window.addEventListener("message",e=>{if(e.origin!==location.origin)return;let t=e.data;if(t?.type===Uo&&Pe&&e.source===Pe){ar=!0;for(let r of lr.splice(0))Pe.postMessage(r,location.origin);return}if(t?.type!==wr||I.value.view==="side")return;let n=t;typeof n.route?.view!="string"||n.route.view==="side"||(is(n.route,Array.isArray(n.drafts)?n.drafts:[]),n.sideChat&&os(n.sideChat.run,n.sideChat.chat))}),I.value.view!=="side"&&window.opener?.postMessage({type:Uo},location.origin)}var _n=d(p.get("draftTask")??""),kt=d(p.json("draftAcceptance",[])instanceof Array?p.json("draftAcceptance",[]).filter(e=>typeof e=="string").slice(0,100):[]);function as(e){kt.value=e.slice(0,100).map(t=>t.slice(0,2e3)),p.set("draftAcceptance",JSON.stringify(kt.value))}var G=d({pattern:p.get("pattern")?"Browser preference":"Application default",roles:p.get("roleSel")?"Browser preferences":"Workflow defaults",models:p.get("agentSettings")?"Browser preferences":"CLI defaults"}),St=d(new Map),br=d([]),El=d(""),Ct=d(p.get("pattern")??"auto-team"),Al=A(()=>rr.value.find(e=>e.id===Ct.value)??rr.value[0]),F=d(p.json("roleSel",{})),Ce=d({}),ne=d(p.json("agentSettings",{})),Me=d(p.get("baseRef")??""),xr=d(""),H=d(""),ht=d(""),N=d(""),Ze=d(p.json("limits",{maxMinutes:60,maxSteps:40})),me=d(p.get("trust")||"standard");function Il(e){me.value=e,p.set("trust",e)}var J=d(p.json("roleModels",{}));function Ol(e,t,n,r){let o=J.value[e]??{},i=o[t]??{};J.value={...J.value,[e]:{...o,[t]:{...i,[n]:{...i[n]??{},...r}}}},p.set("roleModels",JSON.stringify(J.value))}var cn=d(null),oi=d(null),ls=d(null),ql=d(!1);async function Nl(){let[e,t]=await Promise.allSettled([Ue("/api/doctor"),Ue("/api/doctor/git")]);oi.value=e.status==="fulfilled"?e.value:null,ls.value=t.status==="fulfilled"?t.value:null}var $e=d(p.json("approvePlanByPattern",{})),Ho=p.get("approvePlan");function Dl(e,t){$e.value={...$e.value,[t]:e},p.set("approvePlanByPattern",JSON.stringify($e.value))}function Ll(e){let t=$e.value[e];return t!==void 0?t:Io(e,e!=="auto-team"&&Ho!==null?Ho==="1":void 0)}var Ul={pipeline:"the plan",debate:"the plan",supervisor:"the subtasks",tdd:"the tests","auto-team":"the team and plan"};function us(e){_n.value=e,p.set("draftTask",e)}function ii(e){pe.value=null,Ct.value=e,p.set("pattern",e),G.value={...G.value,pattern:"This run (remembered)"}}function Hl(e,t,n){F.value={...F.value,[e]:{...F.value[e]??{},[t]:n}},p.set("roleSel",JSON.stringify(F.value)),G.value={...G.value,roles:"This run (remembered)"}}function Fl(e,t){ne.value={...ne.value,[e]:{...ne.value[e]??{},...t}},p.set("agentSettings",JSON.stringify(ne.value)),G.value={...G.value,models:"This run (remembered)"}}var Ve=0,_t=0;function Bl(e){Ve++,H.value=e}function Wl(e){_t++,N.value=e}function Vl(e){Ze.value={...Ze.value,...e},p.set("limits",JSON.stringify(Ze.value))}function zl(e){if(!e)return{};let t=F.value[e.id]??{},n=mr.value.filter(s=>{let a=oi.value?.find(u=>u.id===s.id);return s.available&&$o(s.id)&&(s.id!=="agy"||xt.value.antigravityExecution==="native"||a?.managedCompatible===!0)&&a?.signedIn!==!1&&a?.compatible!==!1&&(!s.id.startsWith("acp:")||me.value==="full")}),r=new Set(n.map(s=>s.id)),o=n[0]?.id,i={};for(let s of e.roles){let a=(t[s.id]??s.default).filter(u=>u==="auto"||(t[s.id]?Gi(u):r.has(u)));e.id==="auto-team"&&s.id==="coordinator"&&!t[s.id]&&(a=["auto"]),s.multiple||(a=a.slice(0,1)),!a.length&&!s.optional&&!t[s.id]&&o&&(a=[o]),i[s.id]=a}return Ao(e.id,i,t,n.map(s=>s.id))}function Jl(e){if(!e)return{};let t=Ce.value[e.id]??{};return Object.fromEntries(e.options.map(n=>[n.id,t[n.id]??n.default]))}function Kl(e,t,n){Ce.value={...Ce.value,[e.id]:{...Ce.value[e.id]??{},[t]:n}}}function cs(){return pn=ds(),pn}async function ds(){let e=B.value,t=++or,n=te,r=Ve,o=_t,i=()=>t===or&&n===te&&B.value===e;if(un.value=!!e,cn.value=null,N.value=e?p.get(`setup:${e}`)??"":"",H.value=e?p.get(`check:${e}`)??"":"",ht.value="",!e)return;let s=null;try{s=await q(`/api/repo-config?repo=${encodeURIComponent(e)}`)}catch{}if(!i())return;cn.value=s;let a=cn.value?.config??{};o===_t&&p.get(`setup:${e}`)===null&&!N.value&&a.setup&&(N.value=a.setup),a.trust&&!p.get("trust")&&(me.value=a.trust);let u=p.get(`check:${e}`),c=o===_t&&!N.value&&p.get(`setup:${e}`)===null;if(u!==null||a.check){if(r===Ve&&(H.value=u??a.check,ht.value=u!==null?"":"From .codeflow/config.json."),!c){un.value=!1;return}}else r===Ve&&(H.value="");try{let f=await q(`/api/check?repo=${encodeURIComponent(e)}`);if(!i()||(c&&o===_t&&f.setup&&!N.value&&p.get(`setup:${e}`)===null&&(N.value=f.setup),r!==Ve||u!==null||a.check||p.get(`check:${e}`)!==null||H.value))return;H.value=f.command??"",ht.value=f.command?`Detected from ${f.source}${f.setup?`; each worktree is set up with \u201C${f.setup}\u201D (Settings)`:""}.`:"No test command found in this repo."}catch{i()&&r===Ve&&u===null&&!a.check&&(ht.value="")}finally{i()&&(un.value=!1)}}async function Gl(){try{qo.value=await Ue("/api/models")}catch{qo.value={}}}var fn=new Set;function ps(e){let t=!fn.has(e),n=O.value.get(e);fn.add(e);let r=new Map(O.value);r.delete(e),O.value=r,t&&Ee.value!==null&&(!ve()||n&&hs(n))&&(Ee.value=Math.max(0,Ee.value-1)),(I.value.view==="run"||I.value.view==="review")&&I.value.id===e&&(I.value={view:"composer"})}function fs(e){if(e.deleted){ps(e.id);return}if(fn.has(e.id))return;let t=new Map(O.value);t.set(e.id,e),O.value=t}var R={epoch:"",seq:0,runSeq:new Map},Ee=d(null),ms=d(null),vs=d(!1),Xe=d(null),mn=d(!1),wt=d(!1),et=d(""),ur="",yn=new Set;function ve(){let e=fe.value,t=new URLSearchParams;return e.q.trim()&&t.set("q",e.q.trim()),e.status!=="all"&&t.set("status",e.status),e.pattern&&t.set("pattern",e.pattern),e.agent&&t.set("agent",e.agent),e.thisRepo&&B.value&&t.set("repo",B.value),t.toString()}var K=0,re=0,ln=0,Fo;function kr(e){e!==ur&&(ur=e,yn.clear(),K++,re=0,Ee.value=null,Xe.value=null,wt.value=!1,et.value="")}var Je=d({state:"connecting",since:Date.now()});function gs(e){Je.value={...Je.value,state:e,since:Je.value.state===e?Je.value.since:Date.now()}}var ze;function si(e,t){ze&&(e?.status==="running"&&t.status!=="running"||t.awaiting&&!e?.awaiting||Oo(t)&&t.team.awaitingRequestId!==e?.team?.awaitingRequestId||Wo(t)&&!Wo(e))&&ze(t)}function Sr(e,t,n=!1){let r=O.value,o=n?new Map(r):new Map;for(let i of e)fn.has(i.id)||o.set(i.id,t(i.id)&&r.has(i.id)?r.get(i.id):i);for(let[i,s]of r)!o.has(i)&&t(i)&&o.set(i,s);O.value=o,vr.value=!0;for(let i of o.values())si(r.get(i.id),i)}async function Tr(){let{epoch:e,seq:t}=R,n=ve();kr(n);let r=K,o=++ln;mn.value=!0;try{let i=await q(`/api/runs?limit=100${n?`&${n}`:""}`);if(R.epoch!==e||r!==K||n!==ve()||o!==ln)return;let s=Array.isArray(i)?i:i.runs;for(let a of s)yn.add(a.id);Sr(s,a=>(R.runSeq.get(a)??0)>t,!0),Ee.value=Array.isArray(i)?i.length:i.total,re<=1&&(Xe.value=Array.isArray(i)?null:i.nextCursor??null),re=Math.max(1,re),et.value=""}catch(i){r===K&&o===ln&&(et.value=i.message)}finally{r===K&&o===ln&&(mn.value=!1)}}async function Yl(){let e=ve();kr(e);let t=Xe.value;if(!t||wt.value||mn.value)return;let n=K,{epoch:r,seq:o}=R;wt.value=!0,et.value="";try{let i=await q(`/api/runs?limit=100&cursor=${encodeURIComponent(t)}${e?`&${e}`:""}`);if(n!==K||e!==ve()||R.epoch!==r)return;for(let s of i.runs)yn.add(s.id);Sr(i.runs,s=>(R.runSeq.get(s)??0)>o,!0),Xe.value=i.nextCursor??null,Ee.value=i.total,re++}catch(i){n===K&&(et.value=i.message)}finally{n===K&&(wt.value=!1)}}var Zl=A(()=>[...O.value.values()].filter(Be).length),fe=d({status:"all",pattern:"",agent:"",thisRepo:!1,...p.json("runFilter",{}),q:""});function Ql(e){fe.value={...fe.value,...e};let{q:t,...n}=fe.value;p.set("runFilter",JSON.stringify(n)),kr(ve()),clearTimeout(Fo),Fo=setTimeout(()=>void Tr(),250)}var Xl=A(()=>{let e=fe.value;return!!(e.q.trim()||e.status!=="all"||e.pattern||e.agent||e.thisRepo)});function hs(e,t=fe.value){if(!Po(e,{...t,repo:t.thisRepo?B.value:void 0}))return!1;let n=t.q.trim().toLowerCase();if(!n||e.cold&&t===fe.value&&ur===ve()&&yn.has(e.id))return!0;let r=[e.task,e.id,e.repo,e.pattern,e.branchPrefix,e.source?`#${e.source.number} ${e.source.title}`:"",e.trigger?.name??"",e.group?.label??"",e.externalSource?.title??""].join(`
2
+ `).toLowerCase();return n.split(/\s+/).every(o=>r.includes(o))}var tr=d({group:"project",archived:!1,collapsed:[],...p.json("railView",{})});function eu(e){tr.value={...tr.value,...e},p.set("railView",JSON.stringify(tr.value))}var Bo=new Set;function tu(e){ze=e;let t=wo(r=>{gs(r.state),r.lastReceived!==void 0&&(Je.value={...Je.value,lastReceived:r.lastReceived})}),n=xo("runs",r=>{if(r?.type==="error"){et.value=r.message;return}if(!r||r.type!=="hello"&&r.type!=="run"||!Number.isSafeInteger(r.seq)||r.type==="hello"&&typeof r.epoch!="string"||r.type==="run"&&!r.run?.id)return;if(r.type==="hello"){typeof r.attentionTotal=="number"&&(ms.value=r.attentionTotal),typeof r.attentionTruncated=="boolean"&&(vs.value=r.attentionTruncated);let a=!!R.epoch&&r.epoch!==R.epoch;if(r.epoch!==R.epoch&&R.runSeq.clear(),R.epoch=r.epoch,a&&(R.seq=r.seq,K++,re=0,Xe.value=null,mn.value=!1,wt.value=!1),r.runs){for(let u of r.runs)R.runSeq.set(u.id,r.seq);Sr(r.runs,()=>!1,!a),ve()?a&&Tr():(typeof r.total=="number"&&(Ee.value=r.total),re<=1&&(Xe.value=r.nextCursor??null),re=Math.max(1,re))}r.runs&&(R.seq=r.seq);return}let{run:o,seq:i}=r;if(i<=(R.runSeq.get(o.id)??0))return;R.runSeq.set(o.id,i),R.seq=Math.max(R.seq,i);let s=O.value.get(o.id);fs(o),!o.deleted&&(o.project&&!E.value.some(a=>a.id===o.project)&&!Bo.has(o.project)&&(Bo.add(o.project),Qo()),si(s,o))},()=>R.epoch?`${R.epoch}:${R.seq}`:void 0);return()=>{n(),t()}}var Wo=e=>Object.values(e?.watches??{}).find(t=>t.state==="needs-you"),nu=d([]),ru=d(null),Tt=d(null),Rt=d(null),ou=d(null);function iu(e,t){Rt.value=null,ii(e.pattern),us((r=>t?r.replace(/\{number\}/g,String(t.number)).replace(/\{title\}/g,t.title):r)(e.task)),as([]),Tt.value=t?{...t,ciLogs:!!e.ciLogs}:null}var su=e=>Gt(`/api/runs/${e}/seen`).catch(()=>{});function vn(){return{contextBudget:vt.value,contextBudgetOrigin:We.value,intent:on.value,journey:gt.value,version:1,repository:dn.value,task:_n.value,acceptance:kt.value,paths:[...St.value.entries()],attachments:br.value,pattern:Ct.value,roles:F.value,models:J.value,settings:ne.value,options:Ce.value,base:Me.value,branch:xr.value,check:H.value,setup:N.value,limits:Ze.value,trust:me.value,approvals:$e.value,origins:G.value,selectedTemplate:pe.value,source:Tt.value,externalSource:Rt.value,runOptions:xt.value,rerun:z.value}}var Re=new sn(we("project-draft-v1:")),cr=0,Vo=Promise.resolve(!0),nr=!1;function dr(){let e=Re.unsavedKeys.map(t=>E.value.find(n=>n.id===t)?.name??(t||"Unassigned draft"));return e.length?`Not saved: ${e.join(", ")}. Keep this tab open, return to the draft and retry saving.`:""}async function pr(){if(!(!gr.value||je.value))try{await Re.write(D.value,vn()),Ge.value=dr()}catch{Ge.value="This draft is kept in this tab, but could not be saved. Keep the tab open and retry saving."}}function ai(e){Wt(()=>{vt.value=e.contextBudget,We.value=e.contextBudgetOrigin??"Application default",on.value=e.intent,gt.value=e.journey,_n.value=e.task,kt.value=e.acceptance,St.value=new Map(e.paths),br.value=e.attachments,Ct.value=e.pattern,F.value=e.roles,J.value=e.models,ne.value=e.settings,Ce.value=e.options,Me.value=e.base,xr.value=e.branch,H.value=e.check,N.value=e.setup,Ze.value=e.limits,me.value=e.trust,$e.value=e.approvals,G.value=e.origins,Tt.value=e.source,Rt.value=e.externalSource,pe.value=e.selectedTemplate??null,xt.value=e.runOptions??{},z.value=e.rerun??null})}function fr(e,t={}){let n=I.value,r=e??(n.view==="project"?n.id:n.view==="workspace"&&n.project?n.project:D.value),o=++cr,i=Vo.then(()=>o===cr?_s(r,t,o):!1);return Vo=i.catch(()=>!1),i}async function _s(e,t,n){if(!gr.value)return!1;let r=E.value.find(a=>a.id===e);if(e===D.value&&!t.repository)return t.stay||(I.value={view:"composer",project:e}),!0;let o=vn(),i=!D.value&&t.carryUnassigned?o:void 0,s=pr();je.value=!0,await s;try{let a=await Re.read(e);if(a&&a.version!==1)throw new Error("This draft uses an unsupported format. It has been retained.");let u=a??i,c=t.repository??u?.repository??(r?_r(r):"");z.value=null,await Go(c);let f=H.value,w=N.value,l=me.value;return Wt(()=>{u?ai(u):(on.value=void 0,gt.value=void 0,vt.value=void 0,We.value="Application default",_n.value="",kt.value=[],br.value=[],St.value=new Map,Tt.value=null,Rt.value=null,xr.value="",Me.value="",F.value=p.json("roleSel",{}),J.value=p.json("roleModels",{}),Ct.value=p.get("pattern")??"auto-team",ne.value=p.json("agentSettings",{}),Ce.value={},Ze.value=p.json("limits",{maxMinutes:60,maxSteps:40}),$e.value=p.json("approvePlanByPattern",{}),pe.value=null,xt.value={},z.value=null,r?.defaults&&ts(r.defaults)),u&&c!==u.repository&&(St.value=new Map,Tt.value=null,Rt.value=null,Me.value="",gt.value=void 0,H.value=f,N.value=w,me.value=l,pe.value=null,xt.value={},z.value=null),D.value=e,p.set("composerProject",e)}),r&&r.repos.includes(c)&&p.set(`projectRepo:${e}`,c),!t.stay&&n===cr&&(I.value={view:"composer",project:e}),!0}catch(a){return Ge.value=`Could not open the draft: ${a.message}`,!1}finally{je.value=!1}}function ys(e){return e===B.value&&!je.value?Promise.resolve(!0):E.value.find(t=>t.id===D.value)?.repos.includes(e)?fr(D.value,{repository:e,stay:!0}):Promise.resolve(!1)}async function au(){if(!nr){je.value=!0;try{let e=p.get("composerProject")??"";if(p.get("projectDraftVersion")!=="1"){let r=vn();r.repository=Ke.value?.repo??dn.value,e=Mo(E.value,p.get("project")??"",r.repository),await Re.write("legacy-backup",r),await Re.write(e,r),p.set("composerProject",e),p.set("projectDraftVersion","1")}let t=await Re.read(e);if(t&&t.version!==1)throw new Error("Saved draft format is unavailable.");D.value=e;let n=t?.repository??p.get("repo")??"";(Ke.value?.repo??"")!==n&&await Go(n,!1),t&&ai(t),gr.value=!0,nr=!0}catch(e){Ge.value=`Could not restore saved drafts: ${e.message}. Reload to retry.`}finally{je.value=!1}nr&&(Q(()=>{if(je.value)return;let e=vn(),t=D.value;Re.write(t,e).then(()=>{Ge.value=dr()},()=>{Ge.value=dr()})}),window.addEventListener("pagehide",()=>{pr()}),document.addEventListener("visibilitychange",()=>{document.hidden&&pr()}))}}function li(e){let t=[];if(e.run)for(let r of e.run.worktrees)t.push({label:`${r.name} \xB7 ${r.branch}`,path:r.path,runId:e.run.id});let n=e.run?[e.run.repo]:[e.repo,...e.project?.repos??[]];for(let r of new Set(n.filter(Boolean)))t.push({label:`${Yt(r)} \xB7 repository`,path:r});return t}var ws=e=>e.worktrees.find(t=>t.path===e.artifacts[0]?.path)??e.worktrees[0];function bs(e,t=li(e)){let n=e.run?ws(e.run)?.path:void 0;return t.find(r=>r.path===n)??t[0]}function gu(e){let t=Ae.value,n=li(t);return[n.find(o=>o.path===gn.value[e])??bs(t,n),o=>hn({[e]:o.path}),n]}function hu(e,t){let n=t.filter(o=>e===o.path||e.startsWith(`${o.path}/`)).sort((o,i)=>i.path.length-o.path.length)[0];if(!n)return Yt(e);let r=n.runId?n.label.split(" \xB7 ")[0]:Yt(n.path);return e===n.path?r:`${r}/${e.slice(n.path.length+1)}`}function _u({place:e,places:t,onChange:n,label:r}){return t.length?x("select",{class:"field","aria-label":r,title:e?.path,value:e?.path??"",onChange:o=>n(t.find(i=>i.path===o.currentTarget.value)??t[0]),children:t.map(o=>x("option",{value:o.path,children:o.label},o.path))}):x("span",{class:"help",children:"Choose a repository first."})}function yu({items:e,active:t,onPick:n,onClose:r,label:o,children:i}){return x("div",{class:"sess-strip",children:[x("div",{class:"sess-list",role:e.length?"group":void 0,"aria-label":e.length?o:void 0,children:e.map(s=>x("span",{class:`sess ${s.key===t?"on":""} ${s.below?"below":""} ${s.state==="failed"?"failed":""}`,children:[x("button",{type:"button","aria-current":s.key===t?"true":void 0,class:"sess-pick",title:s.title??s.label,onClick:()=>n(s.key),children:[s.state==="working"||s.state==="queued"?x("span",{class:`spin ${s.state}`,role:"img","aria-label":s.state==="working"?"working":"queued"}):s.agent?x("span",{class:`sess-agent ${s.agent}`,"aria-hidden":"true"}):null,x("span",{class:"nm",children:s.label}),s.state==="unread"?x("span",{class:"unread",role:"img","aria-label":"new reply"}):null,s.note?x("span",{class:"sess-note",children:s.note}):null]}),r?x("button",{type:"button",class:"sess-x","aria-label":`Close ${s.label}`,title:"Close",onClick:()=>r(s.key),children:x(Bn,{name:"close"})}):null]},s.key))}),i]})}function wu({label:e,icon:t,title:n,trigger:r,above:o=!1,align:i="start",class:s="",children:a}){let[u,c]=Qr(!1),f=se(null),w=se(null),l=se(null),m=()=>[...l.current?.querySelectorAll('[role="menuitem"]:not(:disabled)')??[]],g=()=>{c(!1),w.current?.focus()};$n(()=>{if(!u||!o)return;let h=()=>{if(!w.current||!l.current)return;let _=w.current.getBoundingClientRect(),v=w.current.closest(".chatbox, dialog")?.getBoundingClientRect(),C=Math.max(12,v?v.left+8:12),oe=Math.min(window.innerWidth-12,v?v.right-8:window.innerWidth-12);l.current.style.maxWidth=`${Math.max(0,oe-C)}px`;let L=l.current.getBoundingClientRect(),ge=i==="end"?_.right-L.width:_.left;l.current.style.left=`${Math.max(C,Math.min(ge,oe-L.width))}px`,l.current.style.top=`${Math.max(12,_.top-L.height-8)}px`};return h(),window.addEventListener("resize",h),document.addEventListener("scroll",h,!0),()=>{window.removeEventListener("resize",h),document.removeEventListener("scroll",h,!0)}},[u,o,i]),$n(()=>{if(!u)return;m()[0]?.focus();let h=v=>{f.current?.contains(v.target)||c(!1)},_=v=>{v.key==="Escape"&&(v.preventDefault(),g())};return document.addEventListener("mousedown",h),document.addEventListener("keydown",_),()=>{document.removeEventListener("mousedown",h),document.removeEventListener("keydown",_)}},[u]);let P=h=>{if(h.key==="Tab"){g();return}let _=m();if(!_.length)return;let v=_.indexOf(document.activeElement),C=h.key==="ArrowDown"?(v+1)%_.length:h.key==="ArrowUp"?(v<=0?_.length:v)-1:h.key==="Home"?0:h.key==="End"?_.length-1:-1;C<0||(h.preventDefault(),_[C].focus())};return x("div",{class:`pop-wrap ${s}`,ref:f,children:[x("button",{type:"button",ref:w,class:`icon-btn ${u?"on":""}`,"aria-label":e,"aria-haspopup":"menu","aria-expanded":u,title:n??e,onClick:()=>c(!u),children:r??x(Bn,{name:t})}),u?x("div",{class:"pop-menu",role:"menu","aria-label":e,ref:l,onKeyDown:P,children:a(g)}):null]})}function bu({onClick:e,children:t,sub:n,disabled:r,on:o}){return x("button",{type:"button",role:"menuitem",class:`pop-item ${o?"on":""}`,disabled:r,onClick:e,children:[x("span",{class:"pi-main",children:t}),n?x("span",{class:"pi-sub",children:n}):null]})}var xu=({children:e})=>x("div",{class:"pop-title",children:e});var Ie=d([]),xs=0;function Ru(e,t){return new Promise(n=>{Ie.value=[...Ie.value,{...t,message:e,id:++xs,resolve:n}]})}function ju(e,t){let n=Ie.value[0];!n||n.id!==e||(Ie.value=Ie.value.slice(1),n.resolve(t))}function Pu(){let e=Ie.value;Ie.value=[];for(let t of e)t.resolve(!1)}export{jr as a,y as b,di as c,Ne as d,qe as e,mi as f,Ss as g,Qr as h,Lt as i,$n as j,se as k,it as l,js as m,Wt as n,lt as o,d as p,Q as q,qn as r,Ri as s,ji as t,qs as u,po as v,Ds as w,ut as x,Ln as y,Un as z,le as A,ue as B,zs as C,ae as D,Mi as E,$i as F,Js as G,Kt as H,Ks as I,Gs as J,q as K,Ue as L,Gt as M,we as N,p as O,Ys as P,Zs as Q,Qs as R,Xs as S,ea as T,ta as U,Yt as V,na as W,ra as X,oa as Y,ia as Z,sa as _,aa as $,ho as aa,la as ba,vo as ca,dt as da,ua as ea,ca as fa,x as ga,Bn as ha,Zn as ia,Di as ja,Li as ka,Be as la,jo as ma,z as na,xa as oa,Qn as pa,vt as qa,We as ra,Pa as sa,on as ta,gt as ua,$o as va,an as wa,Hi as xa,Eo as ya,Ia as za,pe as Aa,_a as Ba,xo as Ca,Ha as Da,Fa as Ea,Oo as Fa,Ba as Ga,Wa as Ha,Va as Ia,mr as Ja,sl as Ka,rr as La,qo as Ma,O as Na,Wi as Oa,al as Pa,I as Qa,ll as Ra,ul as Sa,Vi as Ta,cl as Ua,dl as Va,zo as Wa,Jo as Xa,No as Ya,zi as Za,pl as _a,fl as $a,ml as ab,Ji as bb,vl as cb,yt as db,Ki as eb,gl as fb,hl as gb,_l as hb,yl as ib,wl as jb,Ke as kb,Do as lb,Xn as mb,un as nb,B as ob,Go as pb,Yi as qb,bl as rb,bt as sb,Yo as tb,E as ub,Zo as vb,jt as wb,xl as xb,D as yb,je as zb,gr as Ab,Ge as Bb,Zi as Cb,Qi as Db,xt as Eb,Xi as Fb,es as Gb,kl as Hb,Qo as Ib,Pt as Jb,Sl as Kb,Tl as Lb,Rl as Mb,ns as Nb,jl as Ob,Pl as Pb,sr as Qb,Ae as Rb,Cl as Sb,os as Tb,Ye as Ub,gn as Vb,hn as Wb,Ml as Xb,is as Yb,$l as Zb,_n as _b,kt as $b,as as ac,G as bc,St as cc,br as dc,El as ec,Ct as fc,Al as gc,Ce as hc,ne as ic,Me as jc,xr as kc,H as lc,ht as mc,N as nc,Ze as oc,me as pc,Il as qc,J as rc,Ol as sc,cn as tc,oi as uc,ls as vc,ql as wc,Nl as xc,Dl as yc,Ll as zc,Ul as Ac,us as Bc,ii as Cc,Hl as Dc,Fl as Ec,Bl as Fc,Wl as Gc,Vl as Hc,zl as Ic,Jl as Jc,Kl as Kc,cs as Lc,Gl as Mc,ps as Nc,Ee as Oc,ms as Pc,vs as Qc,Xe as Rc,mn as Sc,wt as Tc,et as Uc,Je as Vc,Tr as Wc,Yl as Xc,Zl as Yc,fe as Zc,Ql as _c,Xl as $c,hs as ad,tr as bd,eu as cd,tu as dd,Wo as ed,nu as fd,ru as gd,Tt as hd,Rt as id,ou as jd,iu as kd,su as ld,pr as md,fr as nd,ys as od,au as pd,li as qd,ws as rd,bs as sd,gu as td,hu as ud,_u as vd,yu as wd,wu as xd,bu as yd,xu as zd,Ie as Ad,Ru as Bd,ju as Cd,Pu as Dd};
@@ -0,0 +1 @@
1
+ var e={shellReadyMs:0,longTasks:0,longTaskMs:0,longestTaskMs:0},n=()=>({...e});function t(){e.shellReadyMs=performance.now()}typeof PerformanceObserver<"u"&&PerformanceObserver.supportedEntryTypes?.includes("longtask")&&new PerformanceObserver(r=>{for(let s of r.getEntries())e.longTasks++,e.longTaskMs+=s.duration,e.longestTaskMs=Math.max(e.longestTaskMs,s.duration)}).observe({type:"longtask",buffered:!0});export{n as a,t as b};