@repo-os/repoos 0.5.45
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.
- package/LICENSE.md +110 -0
- package/README.md +272 -0
- package/dist/.build-info.json +4 -0
- package/dist/.build-stamp.json +3 -0
- package/dist/cli/colors.d.ts +13 -0
- package/dist/cli/colors.js +37 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +221 -0
- package/dist/commands/check.d.ts +170 -0
- package/dist/commands/check.js +1227 -0
- package/dist/commands/docs.d.ts +2 -0
- package/dist/commands/docs.js +70 -0
- package/dist/commands/gc.d.ts +1 -0
- package/dist/commands/gc.js +57 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.js +699 -0
- package/dist/commands/screenshots.d.ts +7 -0
- package/dist/commands/screenshots.js +77 -0
- package/dist/commands/serve.d.ts +55 -0
- package/dist/commands/serve.js +204 -0
- package/dist/commands/status.d.ts +140 -0
- package/dist/commands/status.js +569 -0
- package/dist/commands/stop.d.ts +1 -0
- package/dist/commands/stop.js +59 -0
- package/dist/commands/tasks.d.ts +47 -0
- package/dist/commands/tasks.js +334 -0
- package/dist/commands/tunnel.d.ts +1 -0
- package/dist/commands/tunnel.js +1271 -0
- package/dist/commands/ui-harness.d.ts +53 -0
- package/dist/commands/ui-harness.js +62 -0
- package/dist/commands/ui-smoke.d.ts +6 -0
- package/dist/commands/ui-smoke.js +220 -0
- package/dist/commands/upgrade.d.ts +15 -0
- package/dist/commands/upgrade.js +188 -0
- package/dist/core/auth-store.d.ts +81 -0
- package/dist/core/auth-store.js +530 -0
- package/dist/core/auth.d.ts +75 -0
- package/dist/core/auth.js +124 -0
- package/dist/core/bootstrap.d.ts +41 -0
- package/dist/core/bootstrap.js +236 -0
- package/dist/core/build.d.ts +92 -0
- package/dist/core/build.js +249 -0
- package/dist/core/canary.d.ts +10 -0
- package/dist/core/canary.js +14 -0
- package/dist/core/check-failure-summary.d.ts +10 -0
- package/dist/core/check-failure-summary.js +34 -0
- package/dist/core/config.d.ts +160 -0
- package/dist/core/config.js +1288 -0
- package/dist/core/context-pack.d.ts +74 -0
- package/dist/core/context-pack.js +778 -0
- package/dist/core/db.d.ts +236 -0
- package/dist/core/db.js +747 -0
- package/dist/core/detect.d.ts +69 -0
- package/dist/core/detect.js +251 -0
- package/dist/core/docs.d.ts +76 -0
- package/dist/core/docs.js +225 -0
- package/dist/core/frontmatter.d.ts +29 -0
- package/dist/core/frontmatter.js +215 -0
- package/dist/core/git.d.ts +505 -0
- package/dist/core/git.js +1453 -0
- package/dist/core/indexer.d.ts +33 -0
- package/dist/core/indexer.js +282 -0
- package/dist/core/input.d.ts +66 -0
- package/dist/core/input.js +222 -0
- package/dist/core/logger.d.ts +70 -0
- package/dist/core/logger.js +138 -0
- package/dist/core/models.d.ts +45 -0
- package/dist/core/models.js +291 -0
- package/dist/core/net-probe.d.ts +4 -0
- package/dist/core/net-probe.js +20 -0
- package/dist/core/providers/deepinfra.d.ts +23 -0
- package/dist/core/providers/deepinfra.js +44 -0
- package/dist/core/providers/index.d.ts +24 -0
- package/dist/core/providers/index.js +59 -0
- package/dist/core/providers/openrouter.d.ts +28 -0
- package/dist/core/providers/openrouter.js +82 -0
- package/dist/core/providers/spend.d.ts +86 -0
- package/dist/core/providers/spend.js +286 -0
- package/dist/core/providers/types.d.ts +56 -0
- package/dist/core/providers/types.js +39 -0
- package/dist/core/repoos.d.ts +59 -0
- package/dist/core/repoos.js +221 -0
- package/dist/core/runtime.d.ts +35 -0
- package/dist/core/runtime.js +167 -0
- package/dist/core/skills-registry.d.ts +39 -0
- package/dist/core/skills-registry.js +148 -0
- package/dist/core/skills-registry.test.d.ts +1 -0
- package/dist/core/skills-registry.test.js +52 -0
- package/dist/core/sysmem.d.ts +7 -0
- package/dist/core/sysmem.js +55 -0
- package/dist/core/tailscale.d.ts +2 -0
- package/dist/core/tailscale.js +19 -0
- package/dist/core/task.d.ts +53 -0
- package/dist/core/task.js +310 -0
- package/dist/core/toml-line.d.ts +20 -0
- package/dist/core/toml-line.js +52 -0
- package/dist/core/toml-validate.d.ts +44 -0
- package/dist/core/toml-validate.js +335 -0
- package/dist/core/tunnel-assistant.d.ts +30 -0
- package/dist/core/tunnel-assistant.js +65 -0
- package/dist/core/tunnel-registry.d.ts +96 -0
- package/dist/core/tunnel-registry.js +267 -0
- package/dist/core/tunnel-registry.test.d.ts +1 -0
- package/dist/core/tunnel-registry.test.js +309 -0
- package/dist/core/tunnel.d.ts +103 -0
- package/dist/core/tunnel.js +320 -0
- package/dist/core/types.d.ts +811 -0
- package/dist/core/types.js +27 -0
- package/dist/core/worktree-gc.d.ts +57 -0
- package/dist/core/worktree-gc.js +194 -0
- package/dist/server/__tests__/integration-job.test.d.ts +1 -0
- package/dist/server/__tests__/integration-job.test.js +129 -0
- package/dist/server/agents.d.ts +1020 -0
- package/dist/server/agents.js +4070 -0
- package/dist/server/attachments.d.ts +51 -0
- package/dist/server/attachments.js +130 -0
- package/dist/server/auto-engineering.d.ts +45 -0
- package/dist/server/auto-engineering.js +275 -0
- package/dist/server/branchless-release.d.ts +22 -0
- package/dist/server/branchless-release.js +67 -0
- package/dist/server/built-in-agents.d.ts +305 -0
- package/dist/server/built-in-agents.js +1838 -0
- package/dist/server/cto-monitor.d.ts +35 -0
- package/dist/server/cto-monitor.js +281 -0
- package/dist/server/cto.d.ts +125 -0
- package/dist/server/cto.js +590 -0
- package/dist/server/deployments.d.ts +119 -0
- package/dist/server/deployments.js +325 -0
- package/dist/server/diff-snapshot.d.ts +20 -0
- package/dist/server/diff-snapshot.js +73 -0
- package/dist/server/done.d.ts +160 -0
- package/dist/server/done.js +488 -0
- package/dist/server/freeform.d.ts +55 -0
- package/dist/server/freeform.js +179 -0
- package/dist/server/handoff.d.ts +99 -0
- package/dist/server/handoff.js +575 -0
- package/dist/server/hetzner.d.ts +45 -0
- package/dist/server/hetzner.js +117 -0
- package/dist/server/icons.d.ts +8 -0
- package/dist/server/icons.js +195 -0
- package/dist/server/integration-job.d.ts +75 -0
- package/dist/server/integration-job.js +144 -0
- package/dist/server/integration-orchestrator.d.ts +211 -0
- package/dist/server/integration-orchestrator.js +1299 -0
- package/dist/server/integration-status.d.ts +48 -0
- package/dist/server/integration-status.js +71 -0
- package/dist/server/live-index.d.ts +295 -0
- package/dist/server/live-index.js +452 -0
- package/dist/server/model-test.d.ts +20 -0
- package/dist/server/model-test.js +100 -0
- package/dist/server/ntfy.d.ts +57 -0
- package/dist/server/ntfy.js +112 -0
- package/dist/server/pm-attachments.d.ts +35 -0
- package/dist/server/pm-attachments.js +181 -0
- package/dist/server/pm-runs.d.ts +58 -0
- package/dist/server/pm-runs.js +80 -0
- package/dist/server/preview.d.ts +174 -0
- package/dist/server/preview.js +641 -0
- package/dist/server/release.d.ts +88 -0
- package/dist/server/release.js +449 -0
- package/dist/server/reload.d.ts +194 -0
- package/dist/server/reload.js +586 -0
- package/dist/server/remote-validation.d.ts +132 -0
- package/dist/server/remote-validation.js +478 -0
- package/dist/server/repo-lock.d.ts +36 -0
- package/dist/server/repo-lock.js +141 -0
- package/dist/server/review-guard.d.ts +14 -0
- package/dist/server/review-guard.js +159 -0
- package/dist/server/review.d.ts +243 -0
- package/dist/server/review.js +1211 -0
- package/dist/server/routes/agents.d.ts +6 -0
- package/dist/server/routes/agents.js +28 -0
- package/dist/server/routes/auth.d.ts +60 -0
- package/dist/server/routes/auth.js +755 -0
- package/dist/server/routes/config.d.ts +20 -0
- package/dist/server/routes/config.js +347 -0
- package/dist/server/routes/debugger.d.ts +33 -0
- package/dist/server/routes/debugger.js +360 -0
- package/dist/server/routes/deployments.d.ts +3 -0
- package/dist/server/routes/deployments.js +16 -0
- package/dist/server/routes/docs.d.ts +8 -0
- package/dist/server/routes/docs.js +135 -0
- package/dist/server/routes/helpers.d.ts +21 -0
- package/dist/server/routes/helpers.js +171 -0
- package/dist/server/routes/index.d.ts +19 -0
- package/dist/server/routes/index.js +18 -0
- package/dist/server/routes/info.d.ts +17 -0
- package/dist/server/routes/info.js +177 -0
- package/dist/server/routes/inputs.d.ts +7 -0
- package/dist/server/routes/inputs.js +125 -0
- package/dist/server/routes/model-providers.d.ts +27 -0
- package/dist/server/routes/model-providers.js +94 -0
- package/dist/server/routes/models.d.ts +3 -0
- package/dist/server/routes/models.js +36 -0
- package/dist/server/routes/notify.d.ts +2 -0
- package/dist/server/routes/notify.js +17 -0
- package/dist/server/routes/playground.d.ts +29 -0
- package/dist/server/routes/playground.js +81 -0
- package/dist/server/routes/release.d.ts +20 -0
- package/dist/server/routes/release.js +86 -0
- package/dist/server/routes/router.d.ts +12 -0
- package/dist/server/routes/router.js +32 -0
- package/dist/server/routes/skill-registry.d.ts +5 -0
- package/dist/server/routes/skill-registry.js +51 -0
- package/dist/server/routes/tasks.d.ts +58 -0
- package/dist/server/routes/tasks.js +1442 -0
- package/dist/server/routes/transcribe.d.ts +2 -0
- package/dist/server/routes/transcribe.js +124 -0
- package/dist/server/routes/types.d.ts +68 -0
- package/dist/server/routes/types.js +1 -0
- package/dist/server/routes/ui.d.ts +5 -0
- package/dist/server/routes/ui.js +81 -0
- package/dist/server/routes/utils.d.ts +3 -0
- package/dist/server/routes/utils.js +23 -0
- package/dist/server/serve-reaper.d.ts +135 -0
- package/dist/server/serve-reaper.js +491 -0
- package/dist/server/server.d.ts +49 -0
- package/dist/server/server.js +2171 -0
- package/dist/server/supervisor.d.ts +89 -0
- package/dist/server/supervisor.js +231 -0
- package/dist/server/system.d.ts +198 -0
- package/dist/server/system.js +480 -0
- package/dist/server/task-check.d.ts +45 -0
- package/dist/server/task-check.js +71 -0
- package/dist/server/task-transitions.d.ts +51 -0
- package/dist/server/task-transitions.js +78 -0
- package/dist/server/task-watchdog.d.ts +158 -0
- package/dist/server/task-watchdog.js +681 -0
- package/dist/server/test-run.d.ts +28 -0
- package/dist/server/test-run.js +81 -0
- package/dist/server/watcher.d.ts +21 -0
- package/dist/server/watcher.js +194 -0
- package/dist/server/write.d.ts +94 -0
- package/dist/server/write.js +345 -0
- package/dist/ui/assets/AgentsView-CF4wRvHh.css +1 -0
- package/dist/ui/assets/AgentsView-D-myL-kA.js +1 -0
- package/dist/ui/assets/ContextView-D3TC-RSp.css +1 -0
- package/dist/ui/assets/ContextView-DsOqAdyE.js +4 -0
- package/dist/ui/assets/DashboardView-BOhsIJqO.js +1 -0
- package/dist/ui/assets/DashboardView-Ck9o0RP2.css +1 -0
- package/dist/ui/assets/DeploymentsView--iIUVfEH.css +1 -0
- package/dist/ui/assets/DeploymentsView-DXu_FYR2.js +1 -0
- package/dist/ui/assets/InputsView-24HVbVPk.js +1 -0
- package/dist/ui/assets/InputsView-BLb7GHtx.css +1 -0
- package/dist/ui/assets/LoginView-6QlGg6cx.css +1 -0
- package/dist/ui/assets/LoginView-BqupI0Lt.js +1 -0
- package/dist/ui/assets/ReleasesView-BEG1A0YH.css +1 -0
- package/dist/ui/assets/ReleasesView-CAgMuxpe.js +3 -0
- package/dist/ui/assets/SettingsView-CA-NYSMK.css +1 -0
- package/dist/ui/assets/SettingsView-O3iZSnjg.js +3 -0
- package/dist/ui/assets/WorkView-D8Tl6qwy.js +1 -0
- package/dist/ui/assets/WorkView-DMYL2s3W.css +1 -0
- package/dist/ui/assets/abnfDiagram-VCTEODGH-J5lkSnEE.js +1 -0
- package/dist/ui/assets/arc-BHZnmhhM.js +1 -0
- package/dist/ui/assets/architecture-7GRP2DOG-pLdFt-xS.js +1 -0
- package/dist/ui/assets/architectureDiagram-5GKGNRK7-C3k89uKX.js +36 -0
- package/dist/ui/assets/array-BifhSqXX.js +1 -0
- package/dist/ui/assets/blockDiagram-I7D4REHJ-AWNoBzop.js +129 -0
- package/dist/ui/assets/button-lbikqSph.js +1 -0
- package/dist/ui/assets/c4Diagram-7LVT6UL2-DKG1D5gd.js +38 -0
- package/dist/ui/assets/channel-gA4qBv3A.js +1 -0
- package/dist/ui/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/ui/assets/chunk-4HAMMTFA-D1YR8lF_.js +62 -0
- package/dist/ui/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/ui/assets/chunk-75Z2AOVW-5GuBxfsL.js +2 -0
- package/dist/ui/assets/chunk-DU6HZSFF-DfdNNqwa.js +127 -0
- package/dist/ui/assets/chunk-F27PBJKO-BPZzinQ4.js +1 -0
- package/dist/ui/assets/chunk-FOHPRMQF-l2z4K2jD.js +161 -0
- package/dist/ui/assets/chunk-GMAD6QVW-DGWvSKj5.js +72 -0
- package/dist/ui/assets/chunk-GVQU2GXP-D6Aw75wJ.js +1 -0
- package/dist/ui/assets/chunk-IMKFNOWR-B8mMBKCW.js +231 -0
- package/dist/ui/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/ui/assets/chunk-L3NEJ4N5-D5OJuXYE.js +1 -0
- package/dist/ui/assets/chunk-OSK3NFVY-B7r9w2UW.js +10 -0
- package/dist/ui/assets/chunk-P2QGCYS3-C74X4AQX.js +1 -0
- package/dist/ui/assets/chunk-POPQ4Y6H-C5_u1gUS.js +1 -0
- package/dist/ui/assets/chunk-PWAF6VOD-DfoTLtxn.js +1 -0
- package/dist/ui/assets/chunk-SHT3W25Y-D40m2eqz.js +168 -0
- package/dist/ui/assets/chunk-SVP7TREG-euxi0Kap.js +88 -0
- package/dist/ui/assets/chunk-TICWLB2K-fkdxngzN.js +206 -0
- package/dist/ui/assets/chunk-XXDRQBXY-DFBUG-OT.js +1 -0
- package/dist/ui/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/ui/assets/classDiagram-ZZMXUADV-BzW8bq2P.js +1 -0
- package/dist/ui/assets/classDiagram-v2-VYDZK3BY-BzW8bq2P.js +1 -0
- package/dist/ui/assets/cose-bilkent-JH36ORCC-BTcgMon1.js +1 -0
- package/dist/ui/assets/cynefin-OW5HDTMX-B5m_COsS.js +1 -0
- package/dist/ui/assets/cynefinDiagram-5FMLGOSQ-C-AG6CGe.js +62 -0
- package/dist/ui/assets/cytoscape.esm-FBntH-9t.js +321 -0
- package/dist/ui/assets/dagre-GXQ25YYZ-DDfDnp8L.js +4 -0
- package/dist/ui/assets/dagre-PrKaheQc.js +1 -0
- package/dist/ui/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/ui/assets/diagram-S7CK7UJ4-DjQZAlEY.js +30 -0
- package/dist/ui/assets/diagram-UQ7AKVKN-DAZ9yp1B.js +41 -0
- package/dist/ui/assets/diagram-VSXAHHWV-BWepUKJD.js +3 -0
- package/dist/ui/assets/diagram-VX7I27RA-EcV1J81b.js +24 -0
- package/dist/ui/assets/diagram-Z3DM3KII-Dbz7XU_K.js +24 -0
- package/dist/ui/assets/dist-DTg6UBE_.js +1 -0
- package/dist/ui/assets/ebnfDiagram-PWID7BFC-BUyQw8Mm.js +1 -0
- package/dist/ui/assets/erDiagram-RLTQ6QDP-WVf8ukKt.js +99 -0
- package/dist/ui/assets/eventmodeling-NTZA5JFV-DHqyLOAn.js +1 -0
- package/dist/ui/assets/flowDiagram-HODETNUW-CYk_ze5K.js +1 -0
- package/dist/ui/assets/ganttDiagram-EL5Y4UJY-rB4MZuB-.js +292 -0
- package/dist/ui/assets/gitGraph-4MIJSDKK-BOTWM8dY.js +1 -0
- package/dist/ui/assets/gitGraphDiagram-WWUBYQGX-eYscuhtP.js +106 -0
- package/dist/ui/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/ui/assets/index-BACBfnga.css +1 -0
- package/dist/ui/assets/index-BOQ-ust6.js +26 -0
- package/dist/ui/assets/info-A6RAGUB7-_67wOORe.js +1 -0
- package/dist/ui/assets/infoDiagram-27XIBGKW-XVXbddTA.js +2 -0
- package/dist/ui/assets/init-C-OQMol4.js +1 -0
- package/dist/ui/assets/ishikawaDiagram-5VMMS53U-ClLNiEru.js +70 -0
- package/dist/ui/assets/journeyDiagram-3NMN7TZE-NRawjR6i.js +139 -0
- package/dist/ui/assets/kanban-definition-UXKFOSKX-BgSzBfIx.js +89 -0
- package/dist/ui/assets/katex-DolUETbr.js +257 -0
- package/dist/ui/assets/line-KAyfuul4.js +1 -0
- package/dist/ui/assets/linear-cCCPOpu7.js +1 -0
- package/dist/ui/assets/mermaid-parser.core-CgXZk1iN.js +7 -0
- package/dist/ui/assets/mermaid.core-BUUkChHW.js +44 -0
- package/dist/ui/assets/mindmap-definition-YA3MSWOX-Cpn7vW4r.js +96 -0
- package/dist/ui/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/ui/assets/packet-AYTQ26CC-0lZwM-d6.js +1 -0
- package/dist/ui/assets/path-COt_16Va.js +1 -0
- package/dist/ui/assets/pegDiagram-XKGWAZYB-impy0inn.js +1 -0
- package/dist/ui/assets/pie-WAS4IAKB-CqfdGHYg.js +1 -0
- package/dist/ui/assets/pieDiagram-E7YTZNPT-CxjL4I1h.js +39 -0
- package/dist/ui/assets/quadrantDiagram-AXDQQJYC-Cjd1QMIe.js +7 -0
- package/dist/ui/assets/radar-RG4KPBEZ-CRkQIwiv.js +1 -0
- package/dist/ui/assets/railroad-74A4TZTK-i67XSWTB.js +1 -0
- package/dist/ui/assets/railroad-abnf-HS5TGJTU-Cv9m5aS3.js +1 -0
- package/dist/ui/assets/railroad-ebnf-LZEXJU2U-C5ZIn-Jh.js +1 -0
- package/dist/ui/assets/railroad-peg-WCYAUIDC-CGra9Oq-.js +1 -0
- package/dist/ui/assets/railroadDiagram-O6MQD6OU-_pK0qyaY.js +1 -0
- package/dist/ui/assets/releases-B0WNV-SY.js +1 -0
- package/dist/ui/assets/repoos-cto-square.webp +0 -0
- package/dist/ui/assets/repoos-helpful-pm-square.webp +0 -0
- package/dist/ui/assets/repoos-orchestrator-square.webp +0 -0
- package/dist/ui/assets/repoos-performance-agent-square.webp +0 -0
- package/dist/ui/assets/repoos-ross-from-friends-square.webp +0 -0
- package/dist/ui/assets/repoos-tech-debt-agent-square.webp +0 -0
- package/dist/ui/assets/requirementDiagram-BXWQKSXE-CRrFX-yw.js +84 -0
- package/dist/ui/assets/rough.esm-By172zw-.js +1 -0
- package/dist/ui/assets/sankeyDiagram-P5KCCOFB-X_xFRj9E.js +40 -0
- package/dist/ui/assets/sequenceDiagram-WJ2MYXX4-Byb49lKf.js +162 -0
- package/dist/ui/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/ui/assets/src-BH-TyZbA.js +1 -0
- package/dist/ui/assets/stateDiagram-D77RDMKH-CzaPrqYF.js +1 -0
- package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-BCXckz7K.js +1 -0
- package/dist/ui/assets/swimlanes-42K2YHIH-Cx_1lnqr.js +1 -0
- package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-54qsKi6A.js +8 -0
- package/dist/ui/assets/timeline-definition-24CTP7MA-B1IbZPQ-.js +120 -0
- package/dist/ui/assets/treeView-Q6P3EWNA-DFWhVE3d.js +1 -0
- package/dist/ui/assets/treemap-WGGIJYW6-BmbYPThn.js +1 -0
- package/dist/ui/assets/vendor-ui-DPm7zLxi.js +3 -0
- package/dist/ui/assets/vendor-vue-CobgyEJp.js +1 -0
- package/dist/ui/assets/vennDiagram-4TSXK5OY-Ae2AtRpt.js +34 -0
- package/dist/ui/assets/wardley-WFR3VGLG-BtD4X4tL.js +1 -0
- package/dist/ui/assets/wardleyDiagram-VM6X3IG4-B3YN2fTd.js +78 -0
- package/dist/ui/assets/xychartDiagram-S5SC5T6Z-CIzJfMKA.js +7 -0
- package/dist/ui/favicon.svg +11 -0
- package/dist/ui/index.html +49 -0
- package/dist/ui/sw.js +48 -0
- package/package.json +91 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LoginView-BqupI0Lt.js","assets/vendor-vue-CobgyEJp.js","assets/LoginView-6QlGg6cx.css","assets/DashboardView-BOhsIJqO.js","assets/button-lbikqSph.js","assets/vendor-ui-DPm7zLxi.js","assets/releases-B0WNV-SY.js","assets/DashboardView-Ck9o0RP2.css","assets/WorkView-D8Tl6qwy.js","assets/WorkView-DMYL2s3W.css","assets/ReleasesView-CAgMuxpe.js","assets/ReleasesView-BEG1A0YH.css","assets/DeploymentsView-DXu_FYR2.js","assets/DeploymentsView--iIUVfEH.css","assets/InputsView-24HVbVPk.js","assets/InputsView-BLb7GHtx.css","assets/ContextView-DsOqAdyE.js","assets/ContextView-D3TC-RSp.css","assets/SettingsView-O3iZSnjg.js","assets/SettingsView-CA-NYSMK.css","assets/AgentsView-D-myL-kA.js","assets/AgentsView-CF4wRvHh.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{$ as e,B as t,C as n,D as r,E as i,F as a,G as o,I as s,J as c,K as l,O as u,P as d,R as f,S as p,St as m,T as h,Tt as g,U as _,V as v,X as y,Z as b,_ as x,a as S,b as C,bt as w,c as T,d as E,dt as D,f as O,h as k,i as A,it as j,l as M,m as N,n as P,o as F,pt as I,q as L,r as R,rt as z,s as B,t as V,u as ee,v as H,w as U,wt as W,x as G}from"./vendor-vue-CobgyEJp.js";import{a as K,i as q,n as J,r as Y,t as X}from"./button-lbikqSph.js";import{$ as Z,B as te,C as ne,D as re,E as ie,F as ae,G as oe,H as se,I as ce,J as le,L as ue,M as de,N as fe,O as pe,P as me,Q as he,R as ge,S as _e,T as ve,U as ye,V as be,W as xe,X as Se,Y as Ce,Z as we,_ as Te,a as Ee,at as De,b as Oe,c as ke,ct as Ae,et as je,f as Me,g as Ne,h as Pe,i as Fe,it as Ie,j as Le,k as Re,l as ze,lt as Be,m as Ve,n as He,nt as Ue,o as We,ot as Ge,p as Ke,q as qe,r as Je,rt as Ye,st as Xe,t as Ze,u as Qe,w as $e,x as et,y as tt,z as nt}from"./vendor-ui-DPm7zLxi.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var rt=12,it=F(`ui`,()=>{let e=I(null),t=I(!1),n=I(!1),r=I(680),i=I(!1),a=I(`details`),o=I(`logs`),s=I(!1),c=I(!1),l=I(!1),u=I(``),d=`repoos.board.glide`,f=I((()=>{try{return localStorage.getItem(d)===`1`}catch{return!1}})());function p(e){f.value=e;try{localStorage.setItem(d,e?`1`:`0`)}catch{}}let m=`repoos.board.keyboardNav`,h=I((()=>{try{return localStorage.getItem(m)===`1`}catch{return!1}})());function g(e){h.value=e;try{localStorage.setItem(m,e?`1`:`0`)}catch{}}let _=`repoos.integrationBar.collapsed`,v=I((()=>{try{return localStorage.getItem(_)===`1`}catch{return!1}})());function y(e){v.value=e;try{localStorage.setItem(_,e?`1`:`0`)}catch{}}function b(){y(!1)}let x=D({title:``,type:`feature`,priority:`p2`,area:`web`,assignedTo:``}),S=D({path:``,content:``}),C=D({name:``,description:``,content:``}),w=D([]),T=D([]);function E(n=``){t.value=!0,e.value=null,s.value=!1,c.value=!1,l.value=!1,x.title=``,x.area=`web`,x.priority=`p2`,x.type=`feature`,x.assignedTo=n,N()}function O(){s.value=!0,c.value=!1,e.value=null,t.value=!1,l.value=!1,S.path=``,S.content=``}function k(){l.value=!0,t.value=!1,s.value=!1,c.value=!1,e.value=null,u.value=``,N()}function A(){c.value=!0,s.value=!1,e.value=null,t.value=!1,C.name=``,C.description=``,C.content=``}function j(e){for(let t of e){if(w.length>=rt)break;let e=new FileReader;e.onload=()=>{typeof e.result==`string`&&w.push({name:t.name,mime:t.type,dataUrl:e.result,size:t.size})},e.readAsDataURL(t)}}function M(e){w.splice(e,1)}function N(){w.splice(0)}function P(e){for(let t of e){if(T.length>=rt)break;let e=new FileReader;e.onload=()=>{typeof e.result==`string`&&T.push({name:t.name,mime:t.type,dataUrl:e.result,size:t.size})},e.readAsDataURL(t)}}function F(e){T.splice(e,1)}function L(){T.splice(0)}function R(e){return e.status===`review`?`review`:e.status===`active`?`agent`:`details`}function z(n){t.value=!1,e.value=n,a.value=R(n),o.value=`logs`,L()}function B(n){!e.value||e.value.id!==n.id||(e.value=n,t.value=!1)}async function V(t){z(t);try{let n=await K(`/api/tasks/${t.id}`);e.value?.id===t.id&&(e.value=n)}catch{}}function ee(){e.value=null,t.value=!1,s.value=!1,c.value=!1,l.value=!1,a.value=`details`,o.value=`logs`,L()}function H(){i.value=!0}function U(){i.value=!1}let W=I(!1);function G(){W.value=!0}function q(){W.value=!1}function J(e){let t=e.clientX,n=r.value,i=e=>{r.value=Math.max(360,Math.min(window.innerWidth-40,n+t-e.clientX))},a=()=>{document.removeEventListener(`mousemove`,i),document.removeEventListener(`mouseup`,a)};document.addEventListener(`mousemove`,i),document.addEventListener(`mouseup`,a)}return{active:e,isNew:t,isNewDoc:s,isNewSkill:c,isNewInput:l,inputText:u,saving:n,drawerWidth:r,tunnelOpen:i,activeTab:a,debugView:o,nt:x,nd:S,ns:C,pendingScreenshots:w,addScreenshots:j,removeScreenshot:M,clearScreenshots:N,pmScreenshots:T,addPmScreenshots:P,removePmScreenshot:F,clearPmScreenshots:L,openNewTask:E,openNewDoc:O,openNewSkill:A,openNewInput:k,open:z,syncActive:B,openTask:V,close:ee,openTunnel:H,closeTunnel:U,remoteValidationOpen:W,openRemoteValidation:G,closeRemoteValidation:q,startResize:J,integrationBarCollapsed:v,setIntegrationBarCollapsed:y,expandIntegrationBar:b,glideAnimations:f,setGlideAnimations:p,keyboardNavEnabled:h,setKeyboardNavEnabled:g}}),at=`repoos.notifications`,ot={soundEnabled:!1,pushEnabled:!1,types:{review:!1,paused:!1,stuck:!1,needsInput:!1}};function st(){try{let e=localStorage.getItem(at);if(!e)return structuredClone(ot);let t=JSON.parse(e);return{soundEnabled:!!t.soundEnabled,pushEnabled:!!t.pushEnabled,types:{review:!!t.types?.review,paused:!!t.types?.paused,stuck:!!t.types?.stuck,needsInput:!!t.types?.needsInput}}}catch{return structuredClone(ot)}}function ct(e){try{localStorage.setItem(at,JSON.stringify(e))}catch{}}function lt(){return typeof window<`u`&&typeof window.Notification==`function`&&typeof window.Notification.requestPermission==`function`}function ut(){if(typeof window>`u`)return`unsupported`;if(window.isSecureContext===!1)return`insecure`;if(!lt())return`unsupported`;let e=Notification.permission;return e===`granted`?`granted`:e===`denied`?`denied`:`default`}var dt={granted:`Permission granted. If notifications still don't appear, check System Settings → Notifications for your browser and that Do Not Disturb / a Focus mode isn't on — and keep a RepoOS tab open (there's no background service worker).`,denied:`Your browser is blocking notifications for this site. Allow them in the site permissions (the button left of the address bar, or the browser's notification settings), then reload.`,default:`Turn on Push notifications to grant permission.`,insecure:`This page is plain HTTP on a non-local address, which browsers don't treat as secure — the notification API is unavailable. Open RepoOS at http://localhost:<port> on the machine running the server, or via an HTTPS URL (e.g. the tunnel).`,unsupported:`This browser doesn't expose a usable notification API (older Safari, or an embedded web view). Try a recent Chrome, Edge, or Firefox.`};function ft(){try{let e=typeof window<`u`&&`AudioContext`in window?new AudioContext:null;if(!e)return;let t=e.currentTime;for(let[n,r,i]of[[0,880,.18],[.22,1174.7,.22]]){let a=e.createOscillator(),o=e.createGain();a.type=`sine`,a.frequency.value=r,o.gain.setValueAtTime(1e-4,t+n),o.gain.exponentialRampToValueAtTime(.25,t+n+.02),o.gain.exponentialRampToValueAtTime(1e-4,t+n+i),a.connect(o),o.connect(e.destination),a.start(t+n),a.stop(t+n+i+.02)}}catch{}}async function pt(){if(!lt())return!1;if(Notification.permission===`granted`)return!0;if(Notification.permission===`denied`)return!1;try{return await new Promise((e,t)=>{try{let n=Notification.requestPermission(t=>e(t));n&&typeof n.then==`function`&&n.then(e,t)}catch(e){t(e)}})===`granted`}catch{return!1}}function mt(e,t){if(lt()&&Notification.permission===`granted`)try{new Notification(e,{body:t})}catch{}}var ht={review:`Review ready`,paused:`Paused`,stuck:`Stuck`,needsInput:`Needs attention`},gt=F(`notifications`,()=>{let e=I(!1),t=I(!1),n=I(!1),r=D({review:!1,paused:!1,stuck:!1,needsInput:!1}),i=I(`default`),a=I(null);o();function o(){let i=st();t.value=i.soundEnabled,n.value=i.pushEnabled,r.review=i.types.review,r.paused=i.types.paused,r.stuck=i.types.stuck,r.needsInput=i.types.needsInput,e.value=!0,s()}function s(){i.value=ut()}function c(){ct({soundEnabled:t.value,pushEnabled:n.value,types:{...r}})}function l(e){t.value=e,c()}function u(e){n.value=e,e&&m(),c()}function d(e,t){r[e]=t,c()}let f=C(()=>({soundOn:t.value,pushOn:n.value})),p=C(()=>(t.value||n.value)&&Object.values(r).some(Boolean));async function m(){await pt(),s()}async function h(){if(a.value=null,s(),i.value===`insecure`||i.value===`unsupported`){a.value={ok:!1,detail:dt[i.value]};return}t.value&&ft();let e=await pt();if(s(),!e){a.value={ok:!1,detail:dt[i.value]??`Permission was not granted.`};return}mt(`RepoOS test notification`,`Notifications are working — you'll be pinged when a task needs you.`),a.value={ok:!0,detail:`Sent. If nothing appeared, your OS is suppressing it — check System Settings → Notifications for this browser, and Do Not Disturb / Focus.`}}async function g(e,i,a){r[e]&&(t.value&&ft(),n.value&&await pt()&&mt(i,a))}return{loaded:e,soundEnabled:t,pushEnabled:n,types:r,availability:i,testResult:a,channelEnabled:f,isActive:p,hydrate:o,refreshAvailability:s,setSoundEnabled:l,setPushEnabled:u,setTypeEnabled:d,requestPushPermission:m,sendTestPush:h,notify:g}}),_t=/\u001b\[[0-9;]*m/g;function vt(e){return e.replace(_t,``)}function yt(e){let t=[`merge conflict in `,`merge conflict: `,`unresolved conflict markers in `],n=null;for(let r of t){let t=e.indexOf(r);t!==-1&&(n===null||t<n.idx)&&(n={form:r,idx:t})}if(!n)return[];let r=e.slice(n.idx+n.form.length),i=r.search(/—| – |\n/);return i!==-1&&(r=r.slice(0,i)),r.split(`,`).map(e=>e.trim()).filter(Boolean)}function bt(e){return e.replace(/\s*\n\s*/g,` · `).trim()}var xt=240;function St(e){let t=bt(e);return t.length>xt?t.slice(0,239)+`…`:t}function Ct(e,t,n=yt(t)){return n.length>0||/merge conflict|unresolved conflict markers/i.test(t)?`conflict`:/^(?:repoos\s+)?(?:check|build) failed:/i.test(t)||e===`validating`?`validating`:/uncommitted|dirty|would be overwritten|clean at publish|not merged/i.test(t)?`dirty`:e===`syncing`||/could not.*(?:sync|up to date|bring)/i.test(t)?`syncing`:e===`publishing`||!e&&t?`publishing`:`other`}var wt=`RepoOS couldn't sync this branch with main automatically — resolve the conflicting files in the worktree, then retry.`;function Tt(e,t){let n=vt(t??``).trim(),r=yt(n);switch(Ct(e,n,r)){case`conflict`:return{message:r.length?`Merge conflict in ${r.length} file${r.length===1?``:`s`}.`:n?St(n):wt,conflicts:r,step:`merge`,detail:n||void 0,hint:wt};case`validating`:{let e=n.replace(/^(?:repoos\s+)?(?:check|build) failed:\s*/i,``).trim();return{message:`The validation check failed${e?` — ${St(e)}`:`.`}`,conflicts:[],step:`check`,detail:e||void 0,hint:`The build or check gate failed on the merged branch. Fix the failure in the feature branch's worktree, commit, and retry the close-out.`}}case`dirty`:return{message:n?St(n):`Main's working tree has uncommitted changes.`,conflicts:[],step:`publish`,detail:n||void 0,hint:`Main's working tree has uncommitted changes that the merge would overwrite. Commit or stash them on main, then retry.`};case`syncing`:return{message:n?`The branch could not be brought up to date with main — ${St(n)}`:`The branch could not be brought up to date with main.`,conflicts:[],step:`sync`,detail:n||void 0,hint:`The branch could not be brought up to date with main. Fix the issue in the feature branch's worktree, then retry.`};case`publishing`:return{message:n?St(n):`The merge to main failed at publish time.`,conflicts:[],step:`publish`,detail:n||void 0,hint:`The merge to main failed at publish time. Retry the close-out.`};default:return{message:n?St(n):`The close-out failed.`,conflicts:r,step:`merge`,detail:n||void 0,hint:`Retry the close-out. If it keeps failing, check the feature branch's worktree for issues.`}}}var Et=class extends Error{taskId;dirtyFiles;constructor(e,t){super(`main has ${t.length} uncommitted file${t.length===1?``:`s`} blocking close-out`),this.name=`DirtyMainError`,this.taskId=e,this.dirtyFiles=t}},Dt=class extends Error{taskId;constructor(e,t){super(t),this.name=`MoveToDoneError`,this.taskId=e}},Ot=`review:`,kt=`cto:board`,At={draft:`#3a4055`,inbox:`#566081`,ready:`#39e0ff`,active:`#9d7bff`,review:`#ffb454`,done:`#4ef0a8`},jt=e=>At[e]??`#566081`,Mt={draft:[`Can you flesh this out?`,`Suggest how to turn this stub into a complete task.`],inbox:[`Can you flesh this out?`,`Suggest how to turn this stub into a complete task.`],active:[`What's going on with this task?`,`What's wrong?`,`What should I do next?`],review:[`What's blocking this from being done?`,`Is this actually ready?`]},Nt=e=>Mt[e]??[];function Pt(e){let t=[];return e.assignee===`human`&&e.status!==`done`&&t.push(`assigned to you`),e.needsInput&&t.push(`needs input`),e.needsMerge&&t.push(`merge needed`),e.status===`review`&&t.push(`awaiting sign-off`),t}var Ft=[{id:`inbox`,label:`Inbox`,color:`#566081`},{id:`ready`,label:`Ready`,color:`#39e0ff`},{id:`active`,label:`Active`,color:`#9d7bff`},{id:`review`,label:`Review`,color:`#ffb454`},{id:`done`,label:`Done`,color:`#4ef0a8`}],It=[{value:`recent`,label:`Most recently updated`},{value:`current`,label:`Priority level`}],Lt=`repoos.board.sortOrder`,Rt=`repoos.newVersion`,zt=`repoos.done.acked`,Bt=864e5;function Vt(){try{let e=localStorage.getItem(zt);if(e===null)return new Set;let t=JSON.parse(e);return new Set(Array.isArray(t)?t.filter(e=>typeof e==`string`):[])}catch{return new Set}}function Ht(e){try{localStorage.setItem(zt,JSON.stringify([...e]))}catch{}}var Ut=`repoos.aiCreate.pending`,Wt=`repoos.aiCreate.unacked`;function Gt(e){try{let t=localStorage.getItem(e);if(t===null)return new Set;let n=JSON.parse(t);return new Set(Array.isArray(n)?n.filter(e=>typeof e==`string`):[])}catch{return new Set}}function Kt(e,t){try{localStorage.setItem(e,JSON.stringify([...t]))}catch{}}function qt(){try{let e=localStorage.getItem(Lt);if(e===null)return`recent`;let t=JSON.parse(e);return t===`recent`||t===`current`?t:`recent`}catch{return`recent`}}function Jt(){try{let e=localStorage.getItem(Rt);if(e===null)return null;let t=JSON.parse(e);if(t&&typeof t.hash==`string`)return{hash:t.hash,buildAt:typeof t.buildAt==`string`?t.buildAt:null}}catch{}return null}var Yt=F(`repo`,()=>{let e=window.location.origin,t=I(!0),n=I(!1),r=I(!1),i=!1,a=null;function o(){i=!1,a&&=(clearTimeout(a),null),r.value=!1}function s(){i=!0,!(a||r.value)&&(a=setTimeout(()=>{a=null,i&&(r.value=!0)},3e3))}let c=I(null),l=I([]),u=D({draft:0,inbox:0,ready:0,active:0,review:0,done:0}),d=D([]),f=I(0),p=I(null),m=I(null),h=I(null);function g(e){h.value=e}let _=I([]),v=I([]),y=I({}),b=I({}),x=I({}),S=I({}),w=I({}),T=I({}),E=I({}),O=I({}),k=I({}),A=I({}),j=I({running:!1,enabled:!1,report:null,lines:[]}),M=I({}),N=I({}),P=I({}),F=I(null),L=I(!1),R=I(null),z=I(`all`),B=I(null),V=I(null),ee=I(null),H=D({running:!1,startedAt:null,finishedAt:null,code:null,output:``}),U=I({}),W=I({}),G=I(qt()),J=I(Vt()),Y=I(Gt(Ut)),X=I(new Set),Z=I(Gt(Wt)),te=I([]),ne=I(Jt()),re=I(!1),ie=0,ae=0,oe=null,se=0,ce=null,le=null,ue=C(()=>c.value?c.value.root.split(`/`).pop()??``:``),de=C(()=>c.value?c.value.workDir:`work`),fe=C(()=>l.value.length),pe=C(()=>l.value.filter(e=>e.assignee===`ai`&&e.status!==`done`)),me={p0:0,p1:1,p2:2,p3:3},he=C(()=>{let e=[],t=new Set;for(let n of l.value){let r=Pt(n);!r.length||t.has(n.id)||(t.add(n.id),e.push({task:n,reasons:r}))}return e.sort((e,t)=>{let n=me[e.task.priority]??99,r=me[t.task.priority]??99;if(n!==r)return n-r;let i=e.task.updated_at??e.task.created_at??``;return(t.task.updated_at??t.task.created_at??``).localeCompare(i)})}),ge=e=>e?new Date(e).toLocaleString():`—`,_e=e=>{let t=l.value.filter(t=>t.status===e);return G.value===`recent`?[...t].sort((e,t)=>e.updated_at?t.updated_at?t.updated_at.localeCompare(e.updated_at):-1:+!!t.updated_at):t};function ve(e){G.value=e;try{localStorage.setItem(Lt,JSON.stringify(e))}catch{}}function ye(e){if(e.status!==`done`)return!1;let t=e.updated_at;return!t||Number.isNaN(Date.parse(t))?!1:Date.now()-Date.parse(t)<Bt}function be(e){return ye(e)&&!J.value.has(e.id)}let xe=C(()=>{let e=0;for(let t of l.value)be(t)&&e++;return e});function Se(e){if(J.value.has(e))return;let t=new Set(J.value);t.add(e),J.value=t,Ht(t)}typeof window<`u`&&window.addEventListener(`storage`,e=>{e.key===zt?J.value=Vt():e.key===Ut?Y.value=Gt(Ut):e.key===Wt&&(Z.value=Gt(Wt))});function Ce(e){if(Y.value.has(e))return;let t=new Set(Y.value);t.add(e),Y.value=t,Kt(Ut,t)}function we(e){if(!Y.value.has(e))return;let t=new Set(Y.value);t.delete(e),Y.value=t,Kt(Ut,t)}function Te(e){if(Y.value.has(e)){let t=new Set(Y.value);t.delete(e),Y.value=t,Kt(Ut,t)}if(Z.value.has(e))return;let t=new Set(Z.value);t.add(e),Z.value=t,Kt(Wt,t)}function Ee(e){return Z.value.has(e)}function De(e){if(!Z.value.has(e))return;let t=new Set(Z.value);t.delete(e),Z.value=t,Kt(Wt,t)}function Oe(){if(Y.value.size===0)return;let e=new Set,t=new Set(Z.value),n=!1;for(let r of Y.value){let i=l.value.find(e=>e.id===r);if(i){if(i.status===`draft`){e.add(r);continue}t.has(r)||(t.add(r),n=!0)}}Y.value=e,Kt(Ut,e),n&&(Z.value=t,Kt(Wt,t))}function ke(){let e={draft:0,inbox:0,ready:0,active:0,review:0,done:0};for(let t of l.value)e[t.status]=(e[t.status]??0)+1;Object.assign(u,e)}function Ae(e,t,n){d.unshift({key:ie++,msg:e,color:t,kind:n,time:new Date().toTimeString().slice(0,8)}),d.length>30&&d.pop()}let je=new Map;function Me(e,t=`error`){let n=`${t}:${e}`,r=Date.now(),i=je.get(n);if(i&&r-i<100)return null;je.set(n,r);let a=++ae,o={id:a,message:e,type:t};return te.value.unshift(o),te.value.length>5&&te.value.pop(),setTimeout(()=>Ne(a),6e3),o}function Ne(e){te.value=te.value.filter(t=>t.id!==e)}function Pe(e){p.value=e,ce&&clearTimeout(ce),ce=setTimeout(()=>{p.value===e&&(p.value=null)},1200)}function Fe(e,t,n){m.value={id:e,from:t,to:n},le&&clearTimeout(le),le=setTimeout(()=>{m.value=null},800)}function Ie(e,t){let n={...O.value};t===null?delete n[e]:n[e]=t,O.value=n}let Le=e=>O.value[e]??null,Re=e=>k.value[e]??[];function ze(e){let t={...k.value};delete t[e],k.value=t}function Be(e,t){let n=gt();if(!n.types[e])return;let r=`#${t.id} · ${t.title}`;e===`review`?n.notify(e,`Task ready for review`,r):e===`paused`?n.notify(e,`Task paused`,r):e===`stuck`?n.notify(e,`Task looks stuck`,r):n.notify(e,`Task needs attention`,r)}function Ve(e){if(f.value++,e.type===`hello`){$e(),Qt(),$t();return}if(e.type===`build.available`){et(e.hash,e.buildAt),Ae(`<b>new build</b> available — restart to apply`,`#39e0ff`,`build.available`);return}if(e.type===`reload.failed`){re.value=!1,Me(`Restart failed — the server kept running the current build`,`error`);return}if(e.type===`task.created`)l.value.find(t=>t.id===e.task.id)||l.value.push(e.task),ke(),Ae(`<b>created</b> #${e.task.id} ${e.task.title}`,`#4ef0a8`,`task.created`),Pe(e.task.id);else if(e.type===`task.updated`){let t=l.value.findIndex(t=>t.id===e.task.id),n=t>=0?l.value[t]:null,r=e.prev?.status,i=r!==void 0&&r!==e.task.status&&n!==null,a=typeof e.task.extra?.check_retry_count==`number`?e.task.extra.check_retry_count:n?.checkRetryCount??0,o={...e.task,preview:e.task.preview??n?.preview??null,previewTargets:e.task.previewTargets??n?.previewTargets??[],checkRetryCount:a};t>=0?l.value[t]=o:l.value.push(o);let s=it();s.active&&s.active.id===e.task.id&&s.syncActive(o),ke(),r===`draft`&&e.task.status!==`draft`&&Y.value.has(e.task.id)&&Te(e.task.id),e.task.status!==`review`&&Ie(e.task.id,null);let c=Object.keys(e.prev??{}),u=e.prev&&e.prev.status!==void 0?` → <span style="color:${jt(e.task.status)}">${e.task.status}</span>`:``;Ae(`<b>updated</b> #${e.task.id}${u} <span style="color:var(--txt-faint)">(${c.join(`, `)})</span>`,jt(e.task.status),`task.updated`),Pe(e.task.id),i&&Fe(e.task.id,r,e.task.status);let d=e.prev?.needsInput;n&&/watchdog: auto-surfaced stuck task|watchdog: escalated to needs_input/i.test(e.task.body??``)?Be(`stuck`,e.task):n&&i&&r===`active`&&e.task.status===`review`?Be(`review`,e.task):n&&d===!1&&e.task.needsInput===!0&&Be(`needsInput`,e.task)}else if(e.type===`task.deleted`){l.value=l.value.filter(t=>t.id!==e.id);let t=it();t.active&&t.active.id===e.id&&t.close(),Ie(e.id,null),lt(e.id),ke(),Ae(`<b>deleted</b> #${e.id}`,`#ff6b7d`,`task.deleted`)}else if(e.type===`task.aiCreateFailed`){let t=Y.value.has(e.id);we(e.id),t&&Ae(`<b>PM agent failed</b> on #${e.id} — draft kept as-is`,`#ffb454`,`task.aiCreateFailed`)}else if(e.type===`task.pmWorking`)ct(e.id),Ae(`<b>PM is working</b> on #${e.id}`,`#9d7bff`,`task.pmWorking`);else if(e.type===`task.pmFinished`)lt(e.id);else if(e.type===`agent.running`){if(_.value.includes(e.id)||(_.value=[..._.value,e.id]),S.value[e.id]){clearTimeout(S.value[e.id]);let t={...S.value};delete t[e.id],S.value=t}y.value={...y.value,[e.id]:e.at},b.value={...b.value,[e.id]:e.at},Ae(`<b>agent coding</b> on #${e.id}`,`#9d7bff`,`agent.running`)}else if(e.type===`agent.queued`)v.value.includes(e.id)||(v.value=[...v.value,e.id]);else if(e.type===`agent.dequeued`)v.value=v.value.filter(t=>t!==e.id);else if(e.type===`agent.output`){if(e.id===kt){j.value={...j.value,lines:[...j.value.lines,e.entry].slice(-2e3)};return}if(e.id.startsWith(Ot)){let t=e.id.slice(7),n=A.value[t];if(!n)return;A.value={...A.value,[t]:{...n,lines:[...n.lines??[],e.entry].slice(-2e3)}};return}let t=w.value[e.id]??[];w.value={...w.value,[e.id]:[...t,e.entry].slice(-2e3)},b.value={...b.value,[e.id]:new Date().toISOString()}}else if(e.type===`agent.stats`)T.value={...T.value,[e.id]:e.stats};else if(e.type===`agent.exited`){let t=_.value.includes(e.id);if(_.value=_.value.filter(t=>t!==e.id),y.value=Object.fromEntries(Object.entries(y.value).filter(([t])=>t!==e.id)),b.value={...b.value,[e.id]:e.at},x.value={...x.value,[e.id]:Date.now()},t){let t=setTimeout(()=>{let t={...S.value};delete t[e.id],S.value=t;let n=l.value.find(t=>t.id===e.id);n&&n.status===`active`&&!n.needsInput&&Be(`paused`,n)},3e3),n=S.value[e.id];n&&clearTimeout(n),S.value={...S.value,[e.id]:t}}Ae(`<b>agent stopped</b> on #${e.id}`,`#ffb454`,`agent.exited`),w.value[e.id]&&(w.value={...w.value,[e.id]:[...w.value[e.id],{s:`sys`,d:`— agent stopped —`}]})}else if(e.type===`task.progress`)E.value={...E.value,[e.id]:e.step},e.step===`failed`&&e.detail&&l.value.find(t=>t.id===e.id)?.status!==`done`&&Ie(e.id,Tt(e.phase,e.detail));else if(e.type===`task.corrected`)Ae(`<b>board self-healed</b> #${e.id} — ${e.note}`,`#ffb454`,`task.corrected`);else if(e.type===`preview`){let t=l.value.findIndex(t=>t.id===e.id);if(t>=0){let n={...l.value[t],preview:e.preview};l.value[t]=n;let r=it();r.active&&r.active.id===e.id&&r.syncActive(n)}Ae(e.preview?`<b>preview</b> #${e.id} at <span class="mono">${e.preview.url}</span>`:`<b>preview stopped</b> for #${e.id}`,e.preview?`#39e0ff`:`#ffb454`,`preview`)}else if(e.type===`review`){let t=A.value[e.id];A.value={...A.value,[e.id]:{running:e.state===`running`,enabled:!0,report:t?.report??null,lines:t?.lines??[]}},e.state===`running`?Ae(`<b>agent review</b> started on #${e.id}`,`#ffb454`,`review`):e.state!==`cancelled`&&(vt(e.id),Ae(e.state===`ready`?`<b>agent review</b> ready for #${e.id}`:`<b>agent review failed</b> on #${e.id}${e.error?` — ${e.error}`:``}`,e.state===`ready`?`#39e0ff`:`#ff6b7d`,`review`))}else if(e.type===`cto`)j.value={...j.value,running:e.state===`running`},e.state!==`running`&&bt();else if(e.type===`index.rebuilt`)Xe();else if(e.type===`system.stats`)B.value=e.stats;else if(e.type===`auto-engineering.state`)ee.value=e.state;else if(e.type===`integration`)V.value=e.pipeline;else if(e.type===`test-run.started`)H.running=!0,H.startedAt=e.at,H.finishedAt=null,H.code=null,H.output=``;else if(e.type===`test-run.output`)H.output+=e.chunk;else if(e.type===`test-run.done`)H.running=!1,H.finishedAt=e.at,H.code=e.code;else if(e.type===`task-check.started`)U.value[e.taskId]||(U.value[e.taskId]=[]),U.value[e.taskId].push({id:e.checkId,taskId:e.taskId,kind:e.checkKind,startedAt:e.at,finishedAt:null,durationMs:null,running:!0,passed:null,code:null,output:``});else if(e.type===`task-check.output`){let t=U.value[e.taskId]?.find(t=>t.id===e.checkId);t&&(t.output+=e.chunk)}else if(e.type===`task-check.done`){let t=U.value[e.taskId]?.find(t=>t.id===e.checkId);t&&(t.running=!1,t.finishedAt=e.at,t.durationMs=e.durationMs,t.code=e.code,t.passed=e.passed)}}async function He(){try{ee.value=await K(`/api/auto-engineering/state`)}catch{}}async function Ue(){try{let e=await K(`/api/integration/pipeline`);e.pipeline&&(V.value=e.pipeline)}catch{}}async function We(e){await K(`/api/integration/pipeline/retry/${e}`,{method:`POST`})}async function Ge(){try{let e=await K(`/api/system/run-tests`);H.running=e.running,H.startedAt=e.startedAt,H.finishedAt=e.finishedAt,H.code=e.code,H.output=e.output}catch{}}async function Ke(){let e=await K(`/api/system/run-tests`,{method:`POST`});if(!e.ok){let t=e.error??`could not start the test run`;throw Me(t,`error`),Error(t)}}async function qe(e){try{let t=await K(`/api/tasks/${e}/checks`);U.value[e]=t.runs}catch{}}async function Je(e){try{let t=await K(`/api/tasks/${e}/logs`);W.value[e]=t.logs}catch{}}function Ye(){oe&&oe.close(),oe=new EventSource(e+`/api/events`),oe.onopen=()=>{n.value=!0,o();let e=se>0&&Date.now()-se<2e3;se=0,e||Xe().catch(()=>{}),He().catch(()=>{}),bt().catch(()=>{}),Ue().catch(()=>{}),Qt(),$t()},oe.onerror=()=>{n.value=!1,s()};for(let e of[`hello`,`index.rebuilt`,`task.created`,`task.updated`,`task.deleted`,`task.aiCreateFailed`,`task.pmWorking`,`task.pmFinished`,`task.progress`,`task.corrected`,`preview`,`review`,`cto`,`agent.running`,`agent.exited`,`agent.output`,`agent.stats`,`system.stats`,`build.available`,`reload.failed`,`integration`,`test-run.started`,`test-run.output`,`test-run.done`])oe.addEventListener(e,e=>{n.value=!0,o();try{Ve(JSON.parse(e.data))}catch{}})}async function Xe(){let e=await K(`/api/board`),t=new Map(l.value.map(e=>[e.id,e.preview])),n=new Map(l.value.map(e=>[e.id,e.body]));l.value=e.tasks.map(e=>({...e,preview:e.preview??t.get(e.id)??null,body:n.has(e.id)?n.get(e.id)??``:e.bodyPreview??``,extra:{},agentOverride:null,cliOverride:null,modelOverride:null,pmAgentOverride:null,pmCliOverride:null,pmModelOverride:null,reviewAgentOverride:null,reviewCliOverride:null,reviewModelOverride:null,releasedAt:e.releasedAt??null}));let r={};for(let t of e.tasks)t.status===`review`&&t.automaticReview&&(r[t.id]={running:t.automaticReview.running,enabled:t.automaticReview.enabled,report:A.value[t.id]?.report??null,lines:A.value[t.id]?.lines??[]});A.value={...A.value,...r};for(let t of e.tasks)t.status===`review`&&t.automaticReview?.enabled&&!t.automaticReview.running&&vt(t.id);Oe(),X.value=new Set(e.tasks.filter(e=>e.pmWorking).map(e=>e.id)),Object.assign(u,e.counts)}async function Ze(e){return K(`/api/tasks/${e}`)}async function Qe(e,t){return K(`/api/tasks/${e}`,q(`PATCH`,t))}async function $e(){try{let e=await K(`/api/health`);c.value=e;let t=ne.value,n=typeof e.buildAvailableHash==`string`&&e.buildAvailableHash!==``?e.buildAvailableHash:null,r=n===null?null:e.buildAvailableAt??null;if(n!==null){let i=e.buildHash!==null&&e.buildHash===n,a=e.buildAt!==null&&r!==null&&new Date(e.buildAt).getTime()>=new Date(r).getTime();if(i||a){tt();return}(!t||t.hash!==n)&&et(n,r);return}if(!t)return;let i=e.buildHash!==null&&e.buildHash===t.hash,a=e.buildAt!==null&&t.buildAt!==null&&new Date(e.buildAt).getTime()>=new Date(t.buildAt).getTime();(i||a)&&tt()}catch{}}function et(e,t){let n={hash:e,buildAt:t};ne.value=n;try{localStorage.setItem(Rt,JSON.stringify(n))}catch{}}function tt(){ne.value=null,re.value=!1;try{localStorage.removeItem(Rt)}catch{}}async function nt(){try{let e=await K(`/api/server/restart`,{method:`POST`});e.state===`not-stale`?(tt(),Me(`Server already runs the current build`,`info`)):e.state===`reloading`?(re.value=!0,Me(`Reloading server into the new build…`,`info`)):Me(`Reload deferred — the server is busy right now`,`info`)}catch(e){Me(e instanceof Error?e.message:String(e),`error`)}}async function rt(e,t,n){if(!(e.status===t&&!n)){e.status===`draft`&&t!==`draft`&&we(e.id);try{await Qe(e.id,n?{status:t,note:n}:{status:t}),t!==`review`&&Ie(e.id,null)}catch(e){throw Me(e instanceof Error?e.message:String(e),`error`),e}}}let at=e=>_.value.includes(e),ot=e=>v.value.includes(e),st=e=>X.value.has(e);function ct(e){if(X.value.has(e))return;let t=new Set(X.value);t.add(e),X.value=t}function lt(e){if(!X.value.has(e))return;let t=new Set(X.value);t.delete(e),X.value=t}async function ut(e,t=`resume`,n){let r=await K(`/api/tasks/${e.id}/start`,q(`POST`,{mode:t,instruction:n}));if(!r.ok){let e=r.reason??`could not start work`;throw Me(e,`error`),Error(e)}}async function dt(e){let t=await K(`/api/tasks/${e.id}/pause`,{method:`POST`});if(!t.ok){let e=t.reason??`could not pause work`;throw Me(e,`error`),Error(e)}}async function ft(e){let t=await K(`/api/tasks/${e.id}/abandon`,{method:`POST`});if(!t.ok){let e=t.reason??`could not abandon work`;throw Me(e,`error`),Error(e)}}async function pt(e){let t=await K(`/api/tasks/${e.id}/reopen`,{method:`POST`});if(!t.ok){let e=t.reason??`could not reopen task`;throw Me(e,`error`),Error(e)}}async function mt(e,t=`branch`){let n=await K(`/api/tasks/${e.id}/hotfix`,q(`POST`,{hotfixTarget:t}));if(!n.ok){let e=n.reason??`could not activate hotfix`;throw Me(e,`error`),Error(e)}}async function ht(e,t={}){let n=await fetch(`/api/tasks/${e.id}/done`,{method:`POST`,...t.commitDirty?{headers:{"Content-Type":`application/json`},body:JSON.stringify({commitDirty:!0})}:{}}),r={};try{r=await n.json()}catch{r={}}if(n.status===409&&r.needsCommit&&Array.isArray(r.dirtyFiles)){if(r.dirtyCheckFailed){let t=r.error??`could not verify main is clean before close-out`,n=Tt(void 0,t);throw Ie(e.id,{...n,step:E.value[e.id]??n.step}),new Dt(e.id,t)}throw k.value={...k.value,[e.id]:r.dirtyFiles},new Et(e.id,r.dirtyFiles)}let i=r;if(!n.ok||!i.ok){let t=i.error??n.statusText??`could not complete task`,r=Tt(void 0,t);throw Ie(e.id,{...r,step:E.value[e.id]??r.step}),new Dt(e.id,t)}return Ie(e.id,null),k.value={...k.value,[e.id]:[]},i}async function _t(e){try{let t=await K(`/api/tasks/${e}/output`);t.ok&&(w.value={...w.value,[e]:t.lines}),t.stats&&(T.value={...T.value,[e]:t.stats})}catch{}}async function vt(e){try{let t=await K(`/api/tasks/${e}/review`);if(!t.ok)return;A.value={...A.value,[e]:{running:t.running,enabled:t.enabled,report:t.review,lines:t.lines??[]}}}catch{}}let yt=e=>A.value[e]??null;async function bt(){try{let e=await K(`/api/cto`);if(!e.ok)return;j.value={running:e.running,enabled:e.enabled,report:e.report,lines:e.lines??[]}}catch{}}async function xt(e){try{let t=await K(`/api/tasks/${e}/diff-stats`);t.ok&&(M.value={...M.value,[e]:t.stats})}catch{}}let St=e=>M.value[e]??void 0;async function Ct(e){try{let t=await K(`/api/tasks/${e}/stats`);t.ok&&(P.value={...P.value,[e]:t.stats??null})}catch{}}let wt=e=>P.value[e];async function At(e){let t=e??z.value;z.value=t,L.value=!0,R.value=null;try{let e=await K(`/api/stats/board?range=${t}`);if(z.value!==t)return;e.ok&&e.stats?F.value=e.stats:R.value=`The server did not return usage data.`}catch(e){if(z.value!==t)return;R.value=e instanceof Error?e.message:`Unable to load usage data.`}finally{z.value===t&&(L.value=!1)}}async function Mt(e){try{let t=await K(`/api/tasks/${e}/diff`);t.ok&&(N.value={...N.value,[e]:t.diff})}catch{}}let Nt=e=>N.value[e]??void 0;async function Ft(e){let t=await K(`/api/tasks/${e}/sync`,{method:`POST`});if(!t.ok){let e=t.conflicts?.length?`Rebase hit conflicts in: ${t.conflicts.join(`, `)}`:t.error??`could not sync with main`;throw Me(e,`error`),Error(e)}Me(`Synced with main`,`success`),await Promise.all([xt(e),Mt(e)])}function It(e){if(!w.value[e])return;let t={...w.value};delete t[e],w.value=t}async function Yt(e,t){let n=await K(`/api/tasks/${e}/message`,q(`POST`,{text:t}));if(!n.ok){let e=n.reason??`could not send message`;throw Me(e,`error`),Error(e)}}async function Xt(e){let t=await K(`/api/tasks/${e}/review/again`,{method:`POST`});if(!t.ok){let e=t.reason??`could not start a fresh review`;throw Me(e,`error`),Error(e)}}async function Zt(e,t){let n=await K(`/api/tasks/${e}/review/message`,q(`POST`,{text:t}));if(!n.ok){let e=n.reason??`could not send message to the reviewer`;throw Me(e,`error`),Error(e)}}async function Qt(){try{let e=await K(`/api/agents/running`);_.value=e.tasks.map(e=>e.id),y.value=Object.fromEntries(e.tasks.map(e=>[e.id,e.startedAt])),b.value={...b.value,...Object.fromEntries(e.tasks.map(e=>[e.id,e.startedAt]))}}catch{}}async function $t(){try{let e=await K(`/api/agents/queued`);v.value=e.tasks.map(e=>e.id)}catch{}}async function en(e,t){return K(`/api/tasks/${e.id}/preview`,{...q(`POST`,t?{target:t}:{})})}async function tn(e){await K(`/api/tasks/${e.id}/preview/stop`,{method:`POST`})}async function nn(e){return K(`/api/tasks`,q(`POST`,e))}async function rn(e,t){let n=t.dataUrl.split(`,`)[1]??``;return K(`/api/tasks/${e}/attachments`,q(`POST`,{name:t.name,mime:t.mime,data:n}))}async function an(e,t,n,r){let i={explanation:e};t&&(i.runId=t),n?.agent&&(i.agentOverride=n.agent),n?.cli&&(i.cliOverride=n.cli),n?.model&&(i.modelOverride=n.model),r&&(i.inputId=r);let a=await K(`/api/tasks/freeform`,q(`POST`,i));if(!a.ok){let e=a.reason??`could not create task`;throw Me(e,`error`),Error(e)}return a.fallback||(Ce(a.task.id),a.task.pmWorking&&ct(a.task.id)),a}async function on(e){await K(`/api/tasks/${e}`,{method:`DELETE`})}async function sn(e){return K(`/api/docs/create`,q(`POST`,e))}async function cn(){return K(`/api/inputs`)}async function ln(e){return K(`/api/inputs`,q(`POST`,{text:e}))}async function un(e,t){return K(`/api/inputs/${e}`,q(`PATCH`,{status:t}))}async function dn(e,t,n=``){let r=await K(`/api/inputs/${e}/resolve`,q(`POST`,{resolution:t,taskId:n}));return window.dispatchEvent(new Event(`repoos:inputs-updated`)),r}async function fn(e,t){await K(`/api/inputs/${e}/attachments`,q(`POST`,{name:t.name,data:t.dataUrl.split(`,`)[1]??``}))}async function Q(e,t){let n=it(),r=!1;try{let n=await ln(e);r=!0;for(let e of t)await fn(n.id,e);window.dispatchEvent(new Event(`repoos:inputs-updated`))}catch(i){gn(i),r||(n.inputText.trim()||(n.inputText=e),!n.pendingScreenshots.length&&t.length&&n.pendingScreenshots.push(...t))}}async function pn(e,t,n){let r={description:e};t&&(r.runId=t),n?.agent&&(r.agentOverride=n.agent),n?.cli&&(r.cliOverride=n.cli),n?.model&&(r.modelOverride=n.model);let i=await K(`/api/docs/freeform`,q(`POST`,r));if(!i.ok){let e=i.reason??`could not create document`;throw Me(e,`error`),Error(e)}return i}async function mn(e){return K(`/api/skills/create`,q(`POST`,e))}async function hn(e,t,n){let r={description:e};t&&(r.runId=t),n?.cli&&(r.cliOverride=n.cli),n?.model&&(r.modelOverride=n.model);let i=await K(`/api/skills/freeform`,q(`POST`,r));if(!i.ok){let e=i.reason??`could not create skill`;throw Me(e,`error`),Error(e)}return i}function gn(e){let t=e instanceof Error?e.message:String(e);Ae(`<span style="color:var(--red)">error: ${t}</span>`,`#ff6b7d`,`error`),!(e instanceof Dt||e instanceof Et)&&Me(t,`error`)}async function _n(){try{c.value=await K(`/api/health`),await Xe(),se=Date.now(),await Qt(),await $t(),$e()}catch{}finally{t.value=!1}Ye()}return{origin:e,loading:t,connected:n,streamDown:r,health:c,tasks:l,counts:u,feed:d,eventCount:f,flashId:p,transitionState:m,draggingTask:h,setDraggingTask:g,runningIds:_,queuedIds:v,runningSince:y,agentActivityAt:b,agentExitedAt:x,outputs:w,agentStats:T,doneSteps:E,doneErrors:O,doneErrorFor:Le,dirtyMain:k,dirtyMainFor:Re,clearDirtyMain:ze,reviews:A,sortOrder:G,doneAcked:J,doneAckCount:xe,needsAck:be,acknowledge:Se,aiCreatePending:Y,aiCreateUnacked:Z,markAiCreatePending:Ce,needsCreateAck:Ee,acknowledgeCreate:De,toasts:te,systemStats:B,autoEng:ee,refreshAutoEng:He,integration:V,refreshIntegration:Ue,retryIntegration:We,testRun:H,refreshTestRun:Ge,startTestRun:Ke,taskChecks:U,refreshTaskChecks:qe,taskLogs:W,refreshTaskLogs:Je,newVersion:ne,restarting:re,pushToast:Me,removeToast:Ne,setSortOrder:ve,restartServer:nt,clearNewVersion:tt,repoName:ue,workDir:de,total:fe,aiTasks:pe,humanNeeds:he,fmtDate:ge,byStatus:_e,statusColor:jt,connectSSE:Ye,refresh:Xe,fetchTask:Ze,setStatus:rt,patchTask:Qe,createTask:nn,uploadScreenshot:rn,createFreeformTask:an,deleteTask:on,createDocument:sn,loadInputs:cn,createInput:ln,updateInput:un,resolveInput:dn,uploadInputAttachment:fn,submitInput:Q,createFreeformDocument:pn,createSkill:mn,createFreeformSkill:hn,isRunning:at,isQueued:ot,pmWorkingFor:st,startWork:ut,pauseWork:dt,abandonWork:ft,reopenTask:pt,activateHotfix:mt,completeTask:ht,loadOutput:_t,clearOutput:It,loadReview:vt,reviewFor:yt,cto:j,loadCTO:bt,loadDiffStats:xt,diffStatsFor:St,taskUsage:P,loadTaskUsage:Ct,taskUsageFor:wt,boardUsage:F,boardUsageLoading:L,boardUsageError:R,boardUsageRange:z,loadBoardUsage:At,loadDiff:Mt,diffFor:Nt,syncTaskBranch:Ft,sendMessage:Yt,reviewAgain:Xt,sendReviewMessage:Zt,fetchRunning:Qt,fetchQueued:$t,startPreview:en,stopPreview:tn,onError:gn,init:_n}}),Xt=F(`docs`,()=>{let e=I([]),t=I(null),n=I(``),r=I(``),i=I([]),a=I(null),o=I(``),s=I(``),c=I(``);async function l(){try{return e.value=await K(`/api/docs`),e.value.length&&!t.value&&await u(e.value[0].path),!0}catch{return!1}}async function u(i){t.value=i;try{let t=await fetch(i),a=t.ok?await t.text():`(could not load)`;n.value=a.replace(/^---\s*\n[\s\S]*?\n---\s*\n?/,``);let o=e.value.find(e=>e.path===i);r.value=o?o.title:i}catch{n.value=`(error loading)`}}async function d(){try{i.value=await K(`/api/skills`)}catch{}}async function f(e){a.value=e;let t=i.value.find(t=>t.path===e);s.value=t?.name??e,c.value=t?.description??``;try{let t=await fetch(e),n=t.ok?await t.text():`(could not load)`;o.value=n.replace(/^---\s*\n[\s\S]*?\n---\s*\n?/,``)}catch{o.value=`(error loading)`}}return{docs:e,selDoc:t,docContent:n,docTitle:r,skills:i,selSkill:a,skillContent:o,skillName:s,skillDesc:c,loadDocs:l,loadDoc:u,loadSkills:d,loadSkill:f}}),Zt=[`default`,`opus`,`sonnet`,`haiku`],Qt={default:`Default`,opus:`Opus`,sonnet:`Sonnet`,haiku:`Haiku`,"big pickle":`Big Pickle`,"deepseek v4":`DeepSeek v4`};function $t(e){return Qt[e]??e}var en=[{id:`classic`,label:`Classic`},{id:`clear`,label:`Clear`},{id:`gen z`,label:`Gen Z`},{id:`jelly`,label:`Jelly`}],tn=`repoos.favoriteThemes`;function nn(){try{let e=localStorage.getItem(tn);if(!e)return[];let t=JSON.parse(e);if(!Array.isArray(t))return[];let n=new Set(en.map(e=>e.id)),r=new Set;for(let e of t)if(!(typeof e!=`string`||!n.has(e)||r.has(e))&&(r.add(e),r.size===3))break;return[...r]}catch{return[]}}var rn=F(`config`,()=>{let t=I(!1),n=I(!1),r=I(``),i=I(``),a=I([]),o=I(null),s=I(!1),c=D({}),l=I(!1),u=I(!1),d=I(!1),f=I(``),p=I(``),m=I(``),h=I(``),g=C(()=>m.value!==f.value),_=I(`classic`),v=I(nn()),y=I(``),b=I([]),x=I({clis:[],models:[],defaults:[],skills:[]}),S=I({}),w=I(!1),T=I(!1);async function E(e=!1){T.value=!0;try{let t=await K(`/api/models${e?`?refresh=1`:``}`);S.value=Object.fromEntries(Object.entries(t.byCli).map(([e,t])=>[e,t.models])),w.value=!0}catch{S.value={},w.value=!1}finally{T.value=!1}}function O(e,t){let n=[],r=new Set,i=e=>{r.has(e)||(r.add(e),n.push({value:e,label:$t(e),disabled:!1}))};if(e===`claude code`){for(let e of Zt)i(e);return t&&i(t),n}i(`default`);for(let t of S.value[e]??[])i(t);if(!w.value)for(let e of x.value.models)i(e);return t&&i(t),n}function k(e,t){return!w.value||O(e).some(e=>e.value===t)}let A,j=C(()=>a.value.filter(e=>e.tier!==`guarded`&&e.group!==`voice`)),M=C(()=>a.value.filter(e=>e.group===`voice`)),N=C(()=>a.value.filter(e=>e.tier===`guarded`)),P=C(()=>a.value.filter(e=>e.tier!==`guarded`));function F(){let e=document.documentElement;e.classList.add(`theme-anim`),clearTimeout(A),A=setTimeout(()=>e.classList.remove(`theme-anim`),300)}function L(e,t=!1){e===`system`?document.documentElement.dataset.theme=window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:document.documentElement.dataset.theme=e,t&&F()}function R(e,t=!1){_.value=e,document.documentElement.dataset.uiTheme=e,t&&F()}async function z(e){let t=_.value;R(e,!0);try{localStorage.setItem(`repoos.uiTheme`,e),c.uiTheme=e}catch{R(t)}}function B(e){return v.value.includes(e)}function V(e){if(y.value=``,!en.some(t=>t.id===e))return!1;let t=v.value.indexOf(e);if(t>=0)v.value.splice(t,1);else{if(v.value.length>=3)return y.value=`Up to 3 favorites`,!1;v.value.push(e)}try{localStorage.setItem(tn,JSON.stringify(v.value))}catch{}return!0}let ee=C(()=>{let e=v.value.map(e=>en.find(t=>t.id===e)).filter(e=>!!e);return e.length>0?e:en}),H=C(()=>{let e=typeof c.theme==`string`?c.theme:`system`;return e===`system`?typeof window>`u`||!window.matchMedia?`light`:window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:e});async function U(e){let t=typeof c.theme==`string`?c.theme:`system`;L(e,!0);try{localStorage.setItem(`repoos.theme`,e),c.theme=e}catch{L(t)}}async function W(e){let t=!!c.tunnelEnabled;c.tunnelEnabled=e,n.value=!0,r.value=``,i.value=``;try{await K(`/api/config`,q(`PATCH`,{tunnelEnabled:e})),o.value&&(o.value.tunnelEnabled=e),r.value=e?`Cloudflare Tunnel enabled — finish setup in the side panel.`:`Cloudflare Tunnel hidden — existing tunnel configuration was left unchanged.`}catch(e){throw c.tunnelEnabled=t,i.value=e instanceof Error?e.message:String(e),e}finally{n.value=!1}}async function G(e){let t={};for(let n of Object.keys(e))t[n]=c[n],c[n]=e[n];n.value=!0,r.value=``,i.value=``;try{if(await K(`/api/config`,q(`PATCH`,e)),o.value)for(let t of Object.keys(e))o.value[t]=e[t];ie();let t=Object.keys(e).some(e=>a.value.find(t=>t.key===e)?.restartRequired);r.value=t?`Saved — restart server to apply.`:`Saved — applied live.`}catch(e){for(let e of Object.keys(t))c[e]=t[e];throw i.value=e instanceof Error?e.message:String(e),e}finally{n.value=!1}}e(()=>c.theme,e=>{typeof e==`string`&&L(e,!0)});function J(e,t){if(t in e)return e[t];let n=e;for(let e of t.split(`.`)){if(!n||typeof n!=`object`||!(e in n))return;n=n[e]}return n}function X(e){for(let t of e.schema){let n=J(e.config,t.key)??t.default;t.type===`array`?c[t.key]=Array.isArray(n)?n.join(`, `):String(n):t.type===`boolean`?c[t.key]=!!n:t.type===`select`?c[t.key]=String(n):c[t.key]=n}}function Z(e){c.whisperEnabled=e.config.whisperEnabled===!0}async function te(){t.value=!1,i.value=``,r.value=``;try{let e=await K(`/api/config`);o.value=e.config,a.value=e.schema,X(e),Z(e),b.value=Array.isArray(e.config.agents)?e.config.agents:[],e.agentsMeta&&(x.value=e.agentsMeta);let n=localStorage.getItem(`repoos.theme`)??`system`,r=localStorage.getItem(`repoos.uiTheme`)??`classic`;c.theme=n,c.uiTheme=r,L(n),R(r),t.value=!0}catch(e){i.value=e instanceof Error?e.message:String(e)}}async function ne(e){n.value=!0,r.value=``,i.value=``;try{await K(`/api/config`,q(`PATCH`,{agents:e})),r.value=`Agents saved — applied live.`;let t=await K(`/api/config`);b.value=Array.isArray(t.config.agents)?t.config.agents:[],o.value=t.config,ie()}catch(e){throw i.value=e instanceof Error?e.message:String(e),e}finally{n.value=!1}}async function re(){u.value=!0,h.value=``;try{let e=await K(`/api/config/raw`),t=typeof e?.content==`string`?e.content:``;f.value=t,p.value=typeof e?.hash==`string`?e.hash:``,m.value=t,l.value=!0}catch(e){h.value=e instanceof Error?e.message:String(e)}finally{u.value=!1}}async function ie(){!l.value||g.value||await re()}function ae(e,t){return!e||!t?!1:a.value.filter(e=>e.restartRequired).some(n=>JSON.stringify(J(e,n.key))!==JSON.stringify(J(t,n.key)))}async function oe(){d.value=!0,h.value=``;let e=m.value,t=o.value?{...o.value}:null;try{let n=await K(`/api/config/raw`,q(`PUT`,{content:e,baseHash:p.value})),i=typeof n?.content==`string`?n.content:e;f.value=i,p.value=typeof n?.hash==`string`?n.hash:p.value,m.value===e&&(m.value=i),await te(),r.value=ae(t,o.value)?`repoos.toml saved — restart server to apply some changes.`:`repoos.toml saved — applied live.`}catch(e){if(h.value=e instanceof Error?e.message:String(e),e instanceof Y&&e.status===409){let t=e.body;typeof t?.content==`string`&&(f.value=t.content),typeof t?.hash==`string`&&(p.value=t.hash),h.value+=` Save again to overwrite it, or Reload to discard your changes.`}}finally{d.value=!1}}async function se(e){n.value=!0,r.value=``,i.value=``;try{await K(`/api/config`,q(`PATCH`,e));let t=Object.keys(e).some(e=>{let t=a.value.find(t=>t.key===e);return t&&t.restartRequired});r.value=t?`Saved — restart server to apply some changes.`:`Saved — applied live.`;let n=await K(`/api/config`);o.value=n.config,X(n),Z(n);let i=localStorage.getItem(`repoos.theme`)??`system`,s=localStorage.getItem(`repoos.uiTheme`)??`classic`;c.theme=i,c.uiTheme=s,L(i),R(s),ie()}catch(e){throw i.value=e instanceof Error?e.message:String(e),e}finally{n.value=!1}}return{loaded:t,saving:n,msg:r,error:i,schema:a,data:o,showAdvanced:s,form:c,visibleFields:j,voiceFields:M,guardedFields:N,searchableFields:P,load:te,save:se,saveAgents:ne,rawLoaded:l,rawLoading:u,rawSaving:d,rawContent:f,rawHash:p,rawDraft:m,rawError:h,rawDirty:g,loadRaw:re,saveRaw:oe,applyTheme:L,applyUiTheme:R,setUiTheme:z,setTheme:U,effectiveTheme:H,setTunnelEnabled:W,setConfigValues:G,uiTheme:_,favoriteThemes:v,themeFavoritesNotice:y,isThemeFavorite:B,toggleThemeFavorite:V,sidebarThemes:ee,agents:b,agentsMeta:x,liveModelsByCli:S,modelsLoaded:w,modelsLoading:T,loadModels:E,modelsFor:O,isKnownModelForCli:k}}),an=F(`auth`,()=>{let e=I(!1),t=I(!1),n=I(null),r=I(null),i=I(!1);async function a(){try{let i=await(await fetch(`/api/auth/me`)).json();e.value=!!i.authEnabled,t.value=!!i.authenticated,n.value=i.email??null,r.value=i.role??null}catch{e.value=!1,t.value=!1}finally{i.value=!0}}async function o(){try{await fetch(`/api/auth/logout`,{method:`POST`})}finally{t.value=!1,n.value=null,r.value=null,window.location.href=`/login`}}return{authEnabled:e,authenticated:t,email:n,role:r,loaded:i,loadMe:a,logout:o}});function on(e,t){return(e??``).toLowerCase().includes(t)}function sn(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(n===r)return 0;if(!n||!r)return Math.max(n.length,r.length);let i=Array.from({length:n.length+1},(e,t)=>Array.from({length:r.length+1},(e,n)=>t===0?n:n===0?t:0));for(let e=1;e<=n.length;e++)for(let t=1;t<=r.length;t++)i[e][t]=n[e-1]===r[t-1]?i[e-1][t-1]:1+Math.min(i[e-1][t],i[e][t-1],i[e-1][t-1]);return i[n.length][r.length]}function cn(e,t){if(!e)return!1;if(on(e,t))return!0;let n=t.length<=1?0:t.length<=3?1:2;return e.toLowerCase().split(/\s+/).some(e=>sn(e,t)<=n)}function ln(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function un(e,t,n=60){let r=e.toLowerCase(),i=t.toLowerCase(),a=r.indexOf(i);if(a===-1){let r=e.split(/\s+/),i=t.length<=1?0:t.length<=3?1:2;for(let e=0;e<r.length;e++)if(sn(r[e],t)<=i){let t=Math.max(0,e-2),i=Math.min(r.length,e+3),a=r.slice(t,i).join(` `).substring(0,n),o=r.slice(t,e).join(` `).length,s=o+r[e].length;if(o>=a.length)return{html:ln(a)};let c=Math.min(s,a.length);return{html:ln(a.substring(0,o))+`<mark>`+ln(a.substring(o,c))+`</mark>`+ln(a.substring(c))}}return{html:ln(e.substring(0,n))}}let o=Math.max(0,a-n/2),s=Math.min(e.length,a+n/2),c=(o>0?`…`:``)+e.substring(o,s)+(s<e.length?`…`:``),l=a-o+ +(o>0),u=l+t.length;return{html:ln(c.substring(0,l))+`<mark>`+ln(c.substring(l,u))+`</mark>`+ln(c.substring(u))}}function dn(e){return e.match(/[a-z0-9]+/g)??[]}function fn(e,t){let n=e.length||1,r=new Map;for(let i of t){let t=0;for(let n of e)n.includes(i)&&t++;r.set(i,Math.log((n+1)/(t+1))+1)}return r}function Q(e,t,n,r,i){if(!e)return 0;let a=e.toLowerCase(),o=0;i.length>1&&a.includes(i)&&(o+=t*6);for(let e of n)a.includes(e)&&(o+=t*(r.get(e)??1));return o}function pn(e){return e.sort((e,t)=>t.score-e.score).slice(0,8).map(e=>e.result)}function mn(e,t){let n=e.trim().toLowerCase();if(!n)return[];let r=dn(n),i=fn(t.tasks.map(e=>`${e.title} ${e.body}`.toLowerCase()),r),a=[];for(let e of t.tasks)if(on(e.id,n)||on(e.title,n)||on(e.body,n)||cn(e.title,n)||cn(e.body,n)){let t=Q(e.id,8,r,i,n)+Q(e.title,4,r,i,n)+Q(e.body,1,r,i,n);a.push({result:{kind:`task`,title:e.title,subtitle:`#${e.id} · ${e.status} · ${e.area}`,task:e},score:t})}let o=pn(a),s=fn(t.docs.map(e=>`${e.title} ${e.path} ${e.content??``}`.toLowerCase()),r),c=[];for(let e of t.docs){let t=!1,i;if(on(e.title,n)||on(e.path,n)||cn(e.title,n)||cn(e.path,n)?t=!0:e.content&&(on(e.content,n)||cn(e.content,n))&&(t=!0,i=un(e.content,n)),t){let t=Q(e.title,4,r,s,n)+Q(e.path,2,r,s,n)+Q(e.content,1,r,s,n);c.push({result:{kind:`doc`,title:e.title||e.path,subtitle:e.path,path:e.path,...i&&{snippet:i}},score:t})}}let l=pn(c),u=fn(t.fields.map(e=>`${e.label} ${e.key}`.toLowerCase()),r),d=[];for(let e of t.fields)if(on(e.label,n)||on(e.key,n)||cn(e.label,n)||cn(e.key,n)){let t=Q(e.label,3,r,u,n)+Q(e.key,2,r,u,n);d.push({result:{kind:`setting`,title:e.label,subtitle:e.key,key:e.key},score:t})}let f=pn(d);return[...o,...l,...f]}var hn={class:`search-wrap`},gn={class:`search-overlay`},_n={class:`search-overlay-header`},vn={class:`search-overlay-body`},yn={class:`search-group-label`},bn=[`onClick`],xn={class:`search-row-content`},Sn={class:`search-row-text`},Cn={class:`search-row-title`},wn={class:`search-row-sub`},Tn={key:0,class:`search-row-snippet`},En=[`innerHTML`],Dn={key:1,class:`search-empty`},On=u({__name:`SearchBar`,setup(r){let a=A(),s=Yt(),c=Xt(),l=rn(),u=it(),{tasks:d}=B(s),{docs:h}=B(c),{searchableFields:v}=B(l),y=I(``),b=I(!1),S=I(0),T=I(null),E=I([]),D=I(new Map),M=C(()=>({tasks:d.value,docs:h.value.map(e=>({...e,content:D.value.get(e.path)})),fields:v.value})),N=C(()=>mn(y.value,M.value)),P=C(()=>y.value.trim().length===0),F=C(()=>P.value?E.value.map(e=>({kind:`recent`,title:e,subtitle:`Recent search`})):N.value),L=C(()=>{let e=[],t=new Map,n={task:`Tasks`,doc:`Context docs`,setting:`Settings`,recent:`Recent`};return F.value.forEach((r,i)=>{let a=`kind`in r?r.kind:`unknown`,o=t.get(a);o||(o={kind:a,label:n[a]||a,items:[]},t.set(a,o),e.push(o)),o.items.push({r,idx:i})}),e});e(y,()=>{S.value=0});async function R(){for(let e of h.value)if(!D.value.has(e.path))try{let t=await fetch(e.path);if(t.ok){let n=await t.text();D.value.set(e.path,n)}else console.warn(`Failed to load doc ${e.path}: HTTP ${t.status}`)}catch(t){console.warn(`Failed to load doc ${e.path}:`,t instanceof Error?t.message:String(t))}}function z(e){let t=e.trim();t&&(E.value=[t,...E.value.filter(e=>e!==t)].slice(0,5))}function V(e){e.kind===`task`?(z(y.value),u.openTask(e.task)):e.kind===`doc`?(z(y.value),c.loadDoc(e.path),a.push({name:`repo`})):e.kind===`setting`&&(z(y.value),a.push({name:`settings`,query:{focus:e.key}})),Y()}function ee(e){y.value=e,T.value?.focus()}function K(e){e.kind===`recent`?ee(e.title):V(e)}function q(e){let t=F.value.length;if(e.key===`ArrowDown`&&t)e.preventDefault(),S.value=(S.value+1)%t;else if(e.key===`ArrowUp`&&t)e.preventDefault(),S.value=(S.value-1+t)%t;else if(e.key===`Enter`&&t){let e=F.value[S.value];e&&(`kind`in e&&e.kind===`recent`?ee(e.title):V(e))}else e.key===`Escape`&&Y()}function J(){b.value=!0,y.value=``,S.value=0,setTimeout(()=>{T.value?.focus()},0)}function Y(){b.value=!1,y.value=``}function X(e){e.target===e.currentTarget&&Y()}function Z(e){(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`k`&&(e.preventDefault(),J())}return t(()=>{window.addEventListener(`keydown`,Z)}),f(()=>window.removeEventListener(`keydown`,Z)),e(h,()=>{R()},{immediate:!0}),(e,t)=>(_(),U(`div`,hn,[G(`button`,{class:`search-input`,type:`button`,onClick:J},[...t[2]||=[G(`svg`,{class:`search-ico`,width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`},[G(`circle`,{cx:`11`,cy:`11`,r:`7`,stroke:`currentColor`,"stroke-width":`2`}),G(`path`,{d:`M20 20l-3.5-3.5`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`})],-1),G(`span`,{class:`search-placeholder hidden sm:inline`},`Search tasks, docs, settings…`,-1),G(`kbd`,null,`⌘K`,-1)]]),(_(),p(H,{to:`body`},[b.value?(_(),U(`div`,{key:0,class:`search-overlay-backdrop`,onClick:X},[G(`div`,gn,[G(`div`,_n,[t[4]||=G(`svg`,{class:`search-ico`,width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`},[G(`circle`,{cx:`11`,cy:`11`,r:`7`,stroke:`currentColor`,"stroke-width":`2`}),G(`path`,{d:`M20 20l-3.5-3.5`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`})],-1),j(G(`input`,{ref_key:`inputEl`,ref:T,"onUpdate:modelValue":t[0]||=e=>y.value=e,type:`text`,autocomplete:`off`,spellcheck:`false`,placeholder:`Search tasks, docs, settings…`,class:`search-overlay-input`,onKeydown:q},null,544),[[O,y.value]]),G(`button`,{class:`search-overlay-close`,type:`button`,onClick:Y,"aria-label":`Close search`},[...t[3]||=[G(`svg`,{width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`},[G(`path`,{d:`M18 6L6 18M6 6l12 12`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`})],-1)]])]),G(`div`,vn,[F.value.length?(_(!0),U(x,{key:0},o(L.value,e=>(_(),U(`div`,{key:e.kind,class:`search-group`},[G(`div`,yn,g(e.label),1),(_(!0),U(x,null,o(e.items,r=>(_(),U(`div`,{key:(e.kind===`recent`?`recent-`:e.kind+`-`)+r.r.title,class:m([`search-row`,{hi:r.idx===S.value}]),onMousedown:t[1]||=k(()=>{},[`prevent`]),onClick:e=>K(r.r)},[G(`div`,xn,[e.kind===`task`?(_(),U(`span`,{key:0,class:`cdot`,style:W({backgroundColor:w(jt)(r.r.task.status)})},null,4)):n(``,!0),G(`div`,Sn,[G(`div`,Cn,g(r.r.title),1),G(`div`,wn,g(r.r.subtitle),1),r.r.snippet?(_(),U(`div`,Tn,[r.r.snippet&&typeof r.r.snippet==`object`&&`html`in r.r.snippet?(_(),U(`span`,{key:0,innerHTML:r.r.snippet.html},null,8,En)):(_(),U(x,{key:1},[i(g(r.r.snippet),1)],64))])):n(``,!0)])])],42,bn))),128))]))),128)):(_(),U(`div`,Dn,`No results`))])])])):n(``,!0)]))]))}}),kn={class:`topbar`},An={key:0,class:`preview-build-banner`},jn={key:1,class:`repo-pill-wrapper`},Mn=[`aria-expanded`],Nn={key:0,class:`repo-color-popover`},Pn={class:`repo-color-grid`},Fn=[`aria-label`,`aria-pressed`,`title`,`onClick`],In=[`disabled`],Ln=[`aria-label`,`title`],Rn={class:`help-menu-wrapper`},zn=[`aria-expanded`],Bn=[`href`],Vn={key:3,class:`user-menu-wrapper`},Hn=[`aria-expanded`],Un=[`title`],Wn={key:4,class:`conn offline`,role:`status`,"aria-label":`Server is disconnected`,title:`Server is disconnected`},Gn=`repoos.repoColor.`,Kn=u({__name:`TopBar`,setup(i){let a=Yt(),c=rn(),l=an(),{health:u,streamDown:d,loading:f,newVersion:y,restarting:b}=B(a),{repoName:S}=B(a),T=C(()=>c.effectiveTheme===`dark`),E=C(()=>u.value?.isPreviewBuild??!1),D=C(()=>f.value?`loading`:d.value?`offline`:`live`);function O(){c.setTheme(T.value?`light`:`dark`)}let k=[`#FFB3BA`,`#FFFFBA`,`#BAFFC9`,`#BAE1FF`,`#D4BAFF`,`#BAFFED`],A=[`#E07A8A`,`#E4C86B`,`#7FD9A0`,`#6FB3E0`,`#9E8FD0`,`#6FD4C4`],j=[...k,...A],M=I(!1),N=I(null);function P(e){return Gn+e.toLowerCase().replace(/\//g,`-`)}function F(){S.value&&(N.value=localStorage.getItem(P(S.value)),V(N.value))}function L(e){let t=`<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><rect x="0.5" y="0.5" width="23" height="23" rx="6" fill="${e}" stroke="rgba(255,255,255,0.7)" stroke-width="0.8"/><path d="M12 2L4 7v10l8 5 8-5V7l-8-5z" stroke="#000000" stroke-width="1.8" stroke-linejoin="round" fill="none" opacity="0.95"/><path d="M12 7v10M8 9.5v5M16 9.5v5" stroke="#000000" stroke-width="1.3" stroke-linecap="round" fill="none" opacity="0.7"/></svg>`;return`data:image/svg+xml,${encodeURIComponent(t)}`}function R(e){let t=document.head.querySelector(`link[rel="icon"]`);t||(t=document.createElement(`link`),t.type=`image/svg+xml`,t.rel=`icon`,document.head.appendChild(t)),t.href=e?L(e):`/favicon.svg`}function z(e){let t=document.head.querySelector(`link[rel="manifest"]`);t||(t=document.createElement(`link`),t.rel=`manifest`,document.head.appendChild(t)),t.href=e?`/manifest.webmanifest?c=${encodeURIComponent(e)}`:`/manifest.webmanifest`}function V(e){R(e),z(e)}function ee(e){let t=parseInt(e.slice(1,3),16),n=parseInt(e.slice(3,5),16),r=parseInt(e.slice(5,7),16);return(.299*t+.587*n+.114*r)/255>.6?`#1a1a2e`:`#fff`}let H=C(()=>N.value?{backgroundColor:N.value,color:ee(N.value),borderColor:`transparent`}:{}),K=C(()=>N.value?{color:ee(N.value)}:{});function q(){M.value=!M.value}function J(e){if(!S.value)return;let t=P(S.value);N.value===e?(localStorage.removeItem(t),N.value=null):(localStorage.setItem(t,e),N.value=e),V(N.value),M.value=!1}function Y(){S.value&&(localStorage.removeItem(P(S.value)),N.value=null,V(null),M.value=!1)}let X=I(!1),Z=I(null),ne=I(null);function ie(){X.value=!X.value}function oe(){X.value=!1,s(()=>{Z.value?.focus()})}function se(e,t){if(e.key!==`Tab`||!t)return;let n=t.querySelectorAll(`button, [href], [tabindex]:not([tabindex='-1'])`);if(n.length===0)return;let r=n[0],i=n[n.length-1];e.shiftKey?document.activeElement===r&&(e.preventDefault(),i.focus()):document.activeElement===i&&(e.preventDefault(),r.focus())}function le(e){se(e,ne.value)}e(X,e=>{e&&s(()=>{let e=ne.value;e&&e.querySelector(`button`)?.focus()})});let ue=[{label:`Docs`,href:`https://docs.repoos.org`},{label:`GitHub Discussions`,href:`https://github.com/repo-os/repoos/discussions`},{label:`GitHub Issues`,href:`https://github.com/repo-os/repoos/issues`}],de=I(!1),fe=I(null),pe=I(null);function me(){de.value=!de.value}function he(){de.value=!1,s(()=>{fe.value?.focus()})}function ge(e){se(e,pe.value)}e(de,e=>{e&&s(()=>{pe.value?.querySelector(`a, button`)?.focus()})});function _e(e){let t=e.target;t.closest(`.help-menu-wrapper`)||(de.value=!1),!t.closest(`.repo-pill-wrapper`)&&(M.value=!1,!t.closest(`.user-menu-wrapper`)&&(X.value=!1))}function be(e){e.key===`Escape`&&(M.value=!1,X.value&&oe(),de.value&&he())}return t(()=>{F(),document.addEventListener(`mousedown`,_e),document.addEventListener(`keydown`,be)}),v(()=>{document.removeEventListener(`mousedown`,_e),document.removeEventListener(`keydown`,be)}),e(S,()=>{F()}),(e,t)=>(_(),U(`div`,kn,[E.value?(_(),U(`span`,An,`Preview Build`)):n(``,!0),t[7]||=h(`<div class="logo-mark" data-v-381dacf0><svg width="14" height="14" viewBox="0 0 24 24" fill="none" data-v-381dacf0><path d="M12 2L4 7v10l8 5 8-5V7l-8-5z" stroke="var(--cyan)" stroke-width="2" stroke-linejoin="round" data-v-381dacf0></path><path d="M12 7v10M8 9.5v5M16 9.5v5" stroke="var(--violet)" stroke-width="1.5" stroke-linecap="round" data-v-381dacf0></path></svg></div><div class="brand hidden sm:inline" data-v-381dacf0> RepoOS </div>`,2),w(u)?(_(),U(`div`,jn,[G(`button`,{class:`repo-pill`,type:`button`,"aria-expanded":M.value,style:W(H.value),onClick:q},[t[3]||=G(`svg`,{width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`},[G(`path`,{d:`M6 3v12a3 3 0 003 3h6M6 3a2 2 0 100 4 2 2 0 000-4zM18 18a2 2 0 100-4 2 2 0 000 4z`,stroke:`currentColor`,"stroke-width":`1.8`})],-1),G(`span`,{class:`mono`,style:W(K.value)},g(w(S)),5)],12,Mn),M.value?(_(),U(`div`,Nn,[G(`div`,Pn,[(_(),U(x,null,o(j,e=>G(`button`,{key:e,type:`button`,class:m([`repo-color-swatch`,{selected:N.value===e}]),style:W({backgroundColor:e}),"aria-label":`Set color ${e}`,"aria-pressed":N.value===e,title:e,onClick:t=>J(e)},null,14,Fn)),64))]),G(`button`,{type:`button`,class:`repo-color-default`,onClick:Y},`Default`)])):n(``,!0)])):n(``,!0),r(On),t[8]||=G(`div`,{class:`spacer`},null,-1),w(y)?(_(),U(`button`,{key:2,type:`button`,class:`version-notice`,disabled:w(b),onClick:t[0]||=e=>w(a).restartServer()},[w(b)?(_(),p(w(ce),{key:0,class:`size-[13px] icon-spin`})):(_(),p(w(ae),{key:1,class:`size-[13px]`})),G(`span`,null,g(w(b)?`Restarting…`:`New version available`),1)],8,In)):n(``,!0),G(`button`,{class:`theme-toggle`,type:`button`,"aria-label":T.value?`Switch to light mode`:`Switch to dark mode`,title:T.value?`Switch to light mode`:`Switch to dark mode`,onClick:O},[T.value?(_(),p(w(te),{key:0,size:15,"stroke-width":1.8})):(_(),p(w(re),{key:1,size:15,"stroke-width":1.8}))],8,Ln),G(`div`,Rn,[G(`button`,{ref_key:`helpMenuTrigger`,ref:fe,class:`help-menu-trigger`,type:`button`,"aria-label":`Help and support`,"aria-haspopup":`menu`,"aria-expanded":de.value,title:`Help and support`,onClick:me},[...t[4]||=[G(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`},[G(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,"stroke-width":`1.8`}),G(`path`,{d:`M9.4 9.2a2.7 2.7 0 015.1 1c0 1.8-2.5 2.1-2.5 3.6`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`}),G(`circle`,{cx:`12`,cy:`17.2`,r:`1`,fill:`currentColor`})],-1)]],8,zn),de.value?(_(),U(`div`,{key:0,ref_key:`helpMenuPopover`,ref:pe,class:`help-menu-popover`,role:`menu`,tabindex:`-1`,onKeydown:ge},[(_(),U(x,null,o(ue,e=>G(`a`,{key:e.href,class:`help-menu-link`,href:e.href,target:`_blank`,rel:`noopener noreferrer`,role:`menuitem`,onClick:t[1]||=e=>de.value=!1},g(e.label),9,Bn)),64))],544)):n(``,!0)]),w(l).authEnabled&&w(l).authenticated?(_(),U(`div`,Vn,[G(`button`,{class:`user-menu-trigger`,type:`button`,"aria-label":`User menu`,"aria-haspopup":`menu`,"aria-expanded":X.value,onClick:ie},[r(w(ve),{size:15,"stroke-width":1.8})],8,Hn),X.value?(_(),U(`div`,{key:0,ref_key:`userMenuPopover`,ref:ne,class:`user-menu-popover`,role:`menu`,tabindex:`-1`,onKeydown:le},[G(`span`,{class:`user-menu-email mono`,role:`menuitem`,title:w(l).email??void 0},g(w(l).email),9,Un),G(`button`,{class:`user-menu-logout`,type:`button`,role:`menuitem`,onClick:t[2]||=e=>w(l).logout()},[r(w(ye),{size:13,"stroke-width":1.8}),t[5]||=G(`span`,null,`Log out`,-1)])],544)):n(``,!0)])):n(``,!0),D.value===`offline`?(_(),U(`div`,Wn,[...t[6]||=[G(`span`,{class:`dot`},null,-1),G(`span`,{class:`conn-text`},`offline`,-1)]])):n(``,!0)]))}}),qn=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},Jn=qn(Kn,[[`__scopeId`,`data-v-381dacf0`]]),Yn={id:`releases`,path:`/releases`,label:`Releases`,icon:`<svg viewBox="0 0 24 24" fill="none"><path d="M12 3v12m0 0l-4-4m4 4l4-4M5 18h14" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/><circle cx="18" cy="6" r="2" stroke="currentColor" stroke-width="1.8"/></svg>`},Xn={id:`deployments`,path:`/deployments`,label:`Deployments`,icon:`<svg viewBox="0 0 24 24" fill="none"><circle cx="12" cy="12" r="9" stroke="currentColor" stroke-width="1.8"/><path d="M3 12h18M12 3c2.5 2.7 3.8 5.7 3.8 9s-1.3 6.3-3.8 9c-2.5-2.7-3.8-5.7-3.8-9S9.5 5.7 12 3z" stroke="currentColor" stroke-width="1.8"/></svg>`},Zn=[{id:`dashboard`,path:`/`,label:`Control`,icon:`<svg viewBox="0 0 24 24" fill="none"><rect x="3" y="3" width="7" height="9" rx="1.5" stroke="currentColor" stroke-width="1.8"/><rect x="14" y="3" width="7" height="5" rx="1.5" stroke="currentColor" stroke-width="1.8"/><rect x="14" y="12" width="7" height="9" rx="1.5" stroke="currentColor" stroke-width="1.8"/><rect x="3" y="16" width="7" height="5" rx="1.5" stroke="currentColor" stroke-width="1.8"/></svg>`},{id:`inputs`,path:`/inputs`,label:`Inputs`,icon:`<svg viewBox="0 0 24 24" fill="none"><path d="M5 5h14v14H5z" stroke="currentColor" stroke-width="1.8"/><path d="M8 9h8M8 13h6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>`},{id:`work`,path:`/work`,label:`Work`,icon:`<svg viewBox="0 0 24 24" fill="none"><rect x="3" y="4" width="4" height="16" rx="1" stroke="currentColor" stroke-width="1.8"/><rect x="10" y="4" width="4" height="11" rx="1" stroke="currentColor" stroke-width="1.8"/><rect x="17" y="4" width="4" height="7" rx="1" stroke="currentColor" stroke-width="1.8"/></svg>`},{id:`agents`,path:`/agents`,label:`Agents`,icon:`<svg viewBox="0 0 24 24" fill="none"><rect x="4" y="8" width="16" height="12" rx="2" stroke="currentColor" stroke-width="1.8"/><path d="M12 8V4M9.5 4h5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/><circle cx="9" cy="13" r="1" fill="currentColor"/><circle cx="15" cy="13" r="1" fill="currentColor"/><path d="M9 17h6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>`},{id:`repo`,path:`/repo`,label:`Context`,icon:`<svg viewBox="0 0 24 24" fill="none"><path d="M6 3v12a3 3 0 003 3h6M6 3a2 2 0 100 4 2 2 0 000-4zM18 18a2 2 0 100-4 2 2 0 000 4z" stroke="currentColor" stroke-width="1.8"/></svg>`},{id:`settings`,path:`/settings`,label:`Settings`,icon:`<svg viewBox="0 0 24 24" fill="none"><path d="M12 15a3 3 0 100-6 3 3 0 000 6z" stroke="currentColor" stroke-width="1.8"/><path d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 01-2.83 2.83l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-4 0v-.09A1.65 1.65 0 008.4 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83-2.83l.06-.06A1.65 1.65 0 004.12 15a1.65 1.65 0 00-1.51-1H2.5a2 2 0 010-4h.09A1.65 1.65 0 004.6 8.4a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 012.83-2.83l.06.06A1.65 1.65 0 008.6 4.12a1.65 1.65 0 001-1.51V2.5a2 2 0 014 0v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21.5a2 2 0 010 4h-.09a1.65 1.65 0 00-1.51 1z" stroke="currentColor" stroke-width="1.8"/></svg>`}];function Qn(e,t=!1){let n=[...Zn],r=3;return e&&n.splice(r++,0,Yn),t&&n.splice(r,0,Xn),n}function $n(e,t=new Date){if(!e)return`unknown`;let n=new Date(e).getTime();if(Number.isNaN(n))return`unknown`;let r=Math.max(0,Math.floor((t.getTime()-n)/1e3));if(r<10)return`just now`;if(r<60)return`${r} seconds ago`;let i=Math.floor(r/60);if(i<60)return i===1?`1 minute ago`:`${i} minutes ago`;let a=Math.floor(i/60);if(a<=48)return a===1?`1 hour ago`:`${a} hours ago`;let o=Math.floor(a/24);return o===1?`1 day ago`:`${o} days ago`}function er(e){let t=Number.isFinite(e)?Math.max(0,Math.round(e/1e3)):0;if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m ${String(t%60).padStart(2,`0`)}s`:`${Math.floor(n/60)}h ${String(n%60).padStart(2,`0`)}m`}function tr(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`})}var nr=`This is the repoos canary task: a deliberately trivial change used to smoke-test the full flow (draft, inbox, ready, active, review, merge, done) end to end. The only change to make is in src/core/canary.ts: increment the exported CANARY_COUNTER constant by 1, wrapping from 9 back to 0. Do not touch anything else, do not add tests or comments beyond what's already there, and do not change CANARY_PROMPT itself.`,rr=u({__name:`root`,props:d({defaultOpen:{type:Boolean},modal:{type:Boolean}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:[`update:open`],setup(e){let t=e,n=b(e,`open`),r=ke(t);return(e,t)=>(_(),p(w(et),a(w(r),{open:n.value,"onUpdate:open":t[0]||=e=>n.value=e}),{default:z(()=>[l(e.$slots,`default`)]),_:3},16,[`open`]))}}),ir=u({__name:`close`,props:{class:{type:[Boolean,null,String,Object,Array]},asChild:{type:Boolean},as:{}},setup(e){let t=e;return(e,n)=>(_(),p(w(Ke),a(t,{class:w(J)(t.class)}),{default:z(()=>[l(e.$slots,`default`)]),_:3},16,[`class`]))}}),ar=u({__name:`content`,props:{class:{type:[Boolean,null,String,Object,Array]},forceMount:{type:Boolean},trapFocus:{type:Boolean},disableOutsidePointerEvents:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){let t=e;return(e,n)=>(_(),p(w(ze),a(t,{class:w(J)(`drawer-wrap drawer`,t.class)}),{default:z(()=>[l(e.$slots,`default`)]),_:3},16,[`class`]))}}),or=u({__name:`description`,props:{class:{type:[Boolean,null,String,Object,Array]},asChild:{type:Boolean},as:{}},setup(e){let t=e;return(e,n)=>(_(),p(w(Fe),a(t,{class:w(J)(`text-[var(--txt-dim)]`,t.class)}),{default:z(()=>[l(e.$slots,`default`)]),_:3},16,[`class`]))}}),sr=u({__name:`overlay`,props:{class:{type:[Boolean,null,String,Object,Array]},forceMount:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){let t=e;return(e,n)=>(_(),p(w(Ze),a(t,{class:w(J)(`overlay`,t.class)}),null,16,[`class`]))}}),cr=u({__name:`title`,props:{class:{type:[Boolean,null,String,Object,Array]},asChild:{type:Boolean},as:{}},setup(e){let t=e;return(e,n)=>(_(),p(w(He),a(t,{class:w(J)(`text-[18px] font-bold tracking-[-0.02em] text-[var(--txt)]`,t.class)}),{default:z(()=>[l(e.$slots,`default`)]),_:3},16,[`class`]))}}),lr={class:`cc-modal-head`},$={class:`cc-modal-actions`},ur=u({__name:`CanaryConfirmDialog`,props:{open:{type:Boolean},busy:{type:Boolean}},emits:[`update:open`,`confirm`],setup(e,{emit:t}){let n=t;function a(){n(`confirm`)}return(t,o)=>(_(),p(rr,{open:e.open,"onUpdate:open":o[0]||=e=>n(`update:open`,e)},{default:z(()=>[r(sr),r(ar,{class:`cc-modal`},{default:z(()=>[G(`div`,lr,[r(cr,null,{default:z(()=>[...o[1]||=[i(`Run the canary flow test?`,-1)]]),_:1}),r(ir,{class:`close-x`,"aria-label":`Close`,disabled:e.busy},{default:z(()=>[...o[2]||=[G(`span`,{"aria-hidden":`true`},`×`,-1)]]),_:1},8,[`disabled`])]),r(or,{class:`cc-modal-desc`},{default:z(()=>[...o[3]||=[i(` Clicking the canary starts a `,-1),G(`strong`,null,`real, billed agent run`,-1),i(` — it is not preview-only. `,-1)]]),_:1}),o[5]||=G(`div`,{class:`cc-modal-body`},[G(`p`,null,[i(` The canary task is deliberately trivial: it walks `),G(`code`,null,`draft → inbox → ready → active → review → merge → done`),i(`. `)]),G(`p`,null,[i(` The only change is a `),G(`strong`,null,`one-line diff`),i(` to `),G(`code`,null,`src/core/canary.ts`),i(`: increment `),G(`code`,null,`CANARY_COUNTER`),i(` by 1 (wrapping 9 → 0) — nothing else, no tests/comments, and `),G(`code`,null,`CANARY_PROMPT`),i(` itself stays untouched. `)])],-1),G(`div`,$,[r(ir,{"as-child":``},{default:z(()=>[r(X,{variant:`outline`,disabled:e.busy},{default:z(()=>[...o[4]||=[i(`Cancel`,-1)]]),_:1},8,[`disabled`])]),_:1}),r(X,{variant:`accent`,disabled:e.busy,onClick:a},{default:z(()=>[i(g(e.busy?`Creating…`:`Create canary task`),1)]),_:1},8,[`disabled`])])]),_:1})]),_:1},8,[`open`]))}}),dr={class:`sidebar`},fr=[`innerHTML`],pr={class:`side-foot`},mr={class:`row`},hr={class:`row`},gr={class:`row`},_r={class:`theme-switch`,role:`group`,"aria-label":`Design theme`},vr=[`aria-pressed`,`onClick`],yr=[`title`],br={key:0,class:`build-ver`},xr={class:`build-age`},Sr=[`disabled`],Cr=u({__name:`Sidebar`,setup(e){let a=Yt(),s=rn(),{connected:c,eventCount:l,total:u,health:d}=B(a),h=C(()=>d.value?.canaryCounter??0),v=I(!1),y=I(!1);async function b(){if(!v.value){v.value=!0;try{await a.createFreeformTask(nr),y.value=!1,a.pushToast(`Canary task created — watch it move through the flow`,`info`)}catch{}finally{v.value=!1}}}function S(e){s.setUiTheme(e)}let T=I(Date.now()),E=null;t(()=>{E=setInterval(()=>{T.value=Date.now()},1e3)}),f(()=>{E&&clearInterval(E)});let D=C(()=>d.value?.version?`v${d.value.version}`:``),O=C(()=>Qn(s.data?.release?.enabled===!0,Array.isArray(s.data?.deployments)&&(s.data?.deployments).length>0)),k=C(()=>$n(d.value?.buildAt??null,new Date(T.value))),A=C(()=>d.value?.buildAt?`Built ${new Date(d.value.buildAt).toLocaleString()}`:`Build info unavailable`);return(e,t)=>{let a=L(`RouterLink`);return _(),U(`div`,dr,[(_(!0),U(x,null,o(O.value,e=>(_(),p(a,{key:e.id,to:e.path,class:`nav-item`,"active-class":`active`,"exact-active-class":`active`},{default:z(()=>[G(`span`,{innerHTML:e.icon},null,8,fr),i(g(e.label),1)]),_:2},1032,[`to`]))),128)),G(`div`,pr,[G(`div`,mr,[t[2]||=G(`span`,null,`server`,-1),G(`b`,null,g(w(c)?`connected`:`—`),1)]),G(`div`,hr,[t[3]||=G(`span`,null,`tasks`,-1),G(`b`,null,g(w(u)),1)]),G(`div`,gr,[t[4]||=G(`span`,null,`events`,-1),G(`b`,null,g(w(l)),1)])]),G(`div`,_r,[(_(!0),U(x,null,o(w(s).sidebarThemes,e=>(_(),U(`button`,{key:e.id,class:m({on:w(s).uiTheme===e.id}),type:`button`,"aria-pressed":w(s).uiTheme===e.id,onClick:t=>S(e.id)},g(e.label),11,vr))),128))]),G(`div`,{class:`build-widget`,title:A.value},[D.value?(_(),U(`span`,br,g(D.value),1)):n(``,!0),G(`span`,xr,g(k.value),1),G(`button`,{type:`button`,class:m([`canary-egg`,{busy:v.value}]),disabled:v.value,title:`Run the canary flow test — a trivial task that walks draft → inbox → ready → active → review → done`,"aria-label":`Run canary flow test`,onClick:t[0]||=e=>y.value=!0},g(h.value),11,Sr)],8,yr),r(ur,{open:y.value,busy:v.value,"onUpdate:open":t[1]||=e=>y.value=e,onConfirm:b},null,8,[`open`,`busy`])])}}}),wr={class:`tabbar`},Tr=[`innerHTML`],Er=u({__name:`MobileTabs`,setup(e){let t=rn(),n=C(()=>Qn(t.data?.release?.enabled===!0,Array.isArray(t.data?.deployments)&&(t.data?.deployments).length>0));return(e,t)=>{let r=L(`RouterLink`);return _(),U(`div`,wr,[(_(!0),U(x,null,o(n.value,e=>(_(),p(r,{key:e.id,to:e.path,class:`tab`,"active-class":`active`,"exact-active-class":`active`},{default:z(()=>[G(`span`,{innerHTML:e.icon},null,8,Tr),G(`span`,null,g(e.label),1)]),_:2},1032,[`to`]))),128))])}}});function Dr(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function Or(e){let t=[];return e=e.replace(/`([^`\n]+)`/g,(e,n)=>(t.push(`<code>${n}</code>`),`\u0000${t.length-1}\u0000`)),e=e.replace(/!\[([^\]]*)\]\(((?:[^()\s]|\([^()]*\))*)\)/g,(e,t,n)=>/^(https?:|\/|[a-zA-Z0-9._~/-])/.test(n)&&!/^\s*javascript:/i.test(n)?`<img src="${n}" alt="${t}" loading="lazy">`:t),e=e.replace(/\[([^\]]+)\]\(((?:[^()\s]|\([^()]*\))*)\)/g,(e,t,n)=>/^(https?:|mailto:|#|\/|[a-zA-Z0-9._~/-])/.test(n)&&!/^\s*javascript:/i.test(n)?`<a href="${n}" target="_blank" rel="noopener noreferrer">${t}</a>`:t),e=e.replace(/\*\*([^*]+)\*\*/g,`<strong>$1</strong>`),e=e.replace(/(?<![\w_])__([^_\n]+?)__(?![\w_])/g,`<strong>$1</strong>`),e=e.replace(/(?<!\*)\*([^*\n]+)\*(?!\*)/g,`<em>$1</em>`),e=e.replace(/(?<![\w_])_([^_\n]+?)_(?![\w_])/g,`<em>$1</em>`),e=e.replace(/~~([^~]+)~~/g,`<del>$1</del>`),e=e.replace(/\u0000(\d+)\u0000/g,(e,n)=>t[Number(n)]??``),e}function kr(e){return e.map((t,n)=>{let r=/\\$| {2,}$/.test(t),i=r?t.replace(/\\$| {2,}$/,``):t,a=n===e.length-1?``:r?`<br>`:` `;return Or(Dr(i))+a}).join(``)}function Ar(e){let t=e.replace(/\r\n?/g,`
|
|
3
|
+
`).split(`
|
|
4
|
+
`),n=[],r=0;for(;r<t.length;){let e=t[r];if(/^\s*$/.test(e)){r++;continue}let i=e.match(/^(`{3,}|~{3,})([\w-]*)\s*$/);if(i){let e=i[1],a=i[2]||``,o=[];r++;let s=RegExp(`^${e[0]}{${e.length},}\\s*$`);for(;r<t.length&&!s.test(t[r]);)o.push(t[r]),r++;r<t.length&&r++,a.toLowerCase()===`mermaid`?n.push({kind:`mermaid`,lines:o}):n.push({kind:`code`,lang:a,lines:o});continue}let a=e.match(/^(#{1,6})\s+(.+?)\s*#*\s*$/);if(a){n.push({kind:`heading`,level:a[1].length,text:a[2]}),r++;continue}if(/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(e)){n.push({kind:`hr`}),r++;continue}let o=t[r+1];if(e.includes(`|`)&&o&&/^\s*\|?[\s:|-]*-[\s:|-]*\|?\s*$/.test(o)){let e=[],i=e=>e.trim().replace(/^\|/,``).replace(/\|$/,``).split(`|`).map(e=>e.trim());for(;r<t.length&&t[r].includes(`|`);){if(e.length===1&&/^\|?[\s:|-]*-[\s:|-]*\|?$/.test(t[r].trim())){r++;continue}e.push(i(t[r])),r++}n.push({kind:`table`,rows:e});continue}if(/^>\s?/.test(e)){let e=[];for(;r<t.length&&/^>\s?/.test(t[r]);)e.push(t[r].replace(/^>\s?/,``)),r++;n.push({kind:`quote`,lines:e});continue}if(/^\s*[-*+]\s+/.test(e)){let e=[];for(;r<t.length&&/^\s*[-*+]\s+/.test(t[r]);){let n=t[r].replace(/^\s*[-*+]\s+/,``),i=n.match(/^\[([ xX])\]\s+(.*)$/);i?e.push({checked:i[1]!==` `,text:i[2]}):e.push({checked:null,text:n}),r++}n.push({kind:`ul`,items:e});continue}if(/^\s*\d+[.)]\s+/.test(e)){let e=[];for(;r<t.length&&/^\s*\d+[.)]\s+/.test(t[r]);)e.push(t[r].replace(/^\s*\d+[.)]\s+/,``)),r++;n.push({kind:`ol`,items:e});continue}let s=[];for(;r<t.length;){let e=t[r];if(/^\s*$/.test(e)||/^(?:`{3,}|~{3,})[\w-]*\s*$/.test(e)||/^#{1,6}\s+/.test(e)||/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(e)||/^>\s?/.test(e)||/^\s*[-*+]\s+/.test(e)||/^\s*\d+[.)]\s+/.test(e))break;s.push(e),r++}s.length&&n.push({kind:`p`,lines:s})}return n}function jr(e){switch(e.kind){case`heading`:{let t=`h${Math.min(6,Math.max(1,e.level))}`;return`<${t}>${Or(Dr(e.text))}</${t}>`}case`code`:{let t=Dr(e.lines.join(`
|
|
5
|
+
`));return`<pre><code${e.lang?` class="language-${Dr(e.lang)}"`:``}>${t}</code></pre>`}case`mermaid`:return`<div class="md-mermaid">${Dr(e.lines.join(`
|
|
6
|
+
`))}</div>`;case`hr`:return`<hr>`;case`quote`:return`<blockquote>${kr(e.lines)}</blockquote>`;case`ul`:return`<ul>${e.items.map(e=>e.checked===null?`<li>${Or(Dr(e.text))}</li>`:`<li class="md-task md-task-${e.checked?`checked`:`unchecked`}"><span class="md-task-box" aria-hidden="true">${e.checked?`☑`:`☐`}</span><span class="md-task-text">${Or(Dr(e.text))}</span></li>`).join(``)}</ul>`;case`ol`:return`<ol>${e.items.map(e=>`<li>${Or(Dr(e))}</li>`).join(``)}</ol>`;case`table`:{let[t,...n]=e.rows;return t?`<div class="md-table-wrap"><table><thead><tr>${t.map(e=>`<th>${Or(Dr(e))}</th>`).join(``)}</tr></thead><tbody>${n.map(e=>`<tr>${e.map(e=>`<td>${Or(Dr(e))}</td>`).join(``)}</tr>`).join(``)}</tbody></table></div>`:``}case`p`:return`<p>${kr(e.lines)}</p>`}}function Mr(e){return!e||!e.trim()?``:Ar(e).map(jr).join(``)}function Nr(e){return e==null||!Number.isFinite(e)?`—`:e>=1e3?`${(e/1e6).toFixed(3)}M`:String(e)}function Pr(e){return e==null?`—`:e>=1e3?`${(e/1e6).toFixed(3)}M`:String(e)}var Fr=u({__name:`input`,props:d({class:{type:[Boolean,null,String,Object,Array]}},{modelValue:{},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,n=b(e,`modelValue`);return(e,r)=>j((_(),U(`input`,{"onUpdate:modelValue":r[0]||=e=>n.value=e,class:m(w(J)(`w-full rounded-[10px] border border-[var(--border)] bg-[var(--panel-solid)] px-3 py-[10px] text-[13px] text-[var(--txt)] transition-colors placeholder:text-[var(--txt-faint)] focus-visible:border-[var(--border-bright)] focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50`,t.class))},null,2)),[[O,n.value]])}}),Ir=[`aria-label`],Lr=u({__name:`ActivityIndicator`,props:{size:{default:`sm`},dots:{default:3},label:{default:`Working…`},variant:{default:`working`}},setup(e){return(t,n)=>(_(),U(`span`,{class:m([`ai`,[e.size===`md`?`ai-md`:`ai-sm`,`ai-${e.variant}`]]),role:`status`,"aria-label":e.label},[(_(!0),U(x,null,o(e.dots,e=>(_(),U(`span`,{key:e,class:`ai-dot`,style:W({animationDelay:`${(e-1)*.16}s`})},null,4))),128))],10,Ir))}}),Rr={key:0,class:`voice-dictate`},zr=[`disabled`,`title`],Br={key:2,class:`time`},Vr=qn(u({__name:`VoiceDictate`,props:{disabled:{type:Boolean}},emits:[`transcribed`],setup(e,{emit:t}){let r=t,i=rn(),a=I(`idle`),o=I(null),s=I([]),c=I(`audio/webm`),l=I(0),u=null,d=C(()=>{let e=i.form,t=e[`whisper.provider`];return t!==void 0&&t!==`none`&&e.whisperEnabled===!0});async function h(){if(!(a.value!==`idle`||!d.value))try{a.value=`recording`,s.value=[],l.value=0;let e=await navigator.mediaDevices.getUserMedia({audio:!0}),t=MediaRecorder.isTypeSupported(`audio/webm`)?`audio/webm`:`audio/mp4`,n=new MediaRecorder(e,{mimeType:t});n.addEventListener(`dataavailable`,e=>{s.value.push(e.data)}),n.addEventListener(`stop`,async()=>{e.getTracks().forEach(e=>e.stop()),c.value=n.mimeType||t,await b()}),o.value=n,n.start(),u=setInterval(()=>{l.value+=1,l.value>=120&&v()},1e3)}catch(e){a.value=`idle`,console.error(`Recording failed:`,e)}}function v(){a.value===`recording`&&o.value&&(o.value.stop(),u&&clearInterval(u))}function y(){a.value===`recording`&&o.value&&(o.value.stop(),u&&clearInterval(u),a.value=`idle`,s.value=[])}async function b(){if(s.value.length===0){a.value=`idle`;return}a.value=`transcribing`;try{let e=new Blob(s.value,{type:c.value}),t=new FormData,n=c.value.split(`/`)[1]||`webm`;t.append(`audio`,e,`audio.${n}`);let i=await fetch(`/api/transcribe`,{method:`POST`,body:t});if(!i.ok){let e=await i.json();console.error(`Transcription error:`,e),a.value=`idle`;return}let o=(await i.json()).text?.trim()||``;if(o){let e=document.activeElement;e instanceof HTMLTextAreaElement&&x(e,o),r(`transcribed`,o)}}catch(e){console.error(`Transcription failed:`,e)}finally{a.value=`idle`}}function x(e,t){let n=e.selectionStart,r=e.selectionEnd,i=e.value.substring(0,n),a=e.value.substring(r);e.value=i+t+a,e.selectionStart=e.selectionEnd=n+t.length,e.dispatchEvent(new Event(`input`,{bubbles:!0}))}function S(e){return`${Math.floor(e/60)}:${(e%60).toString().padStart(2,`0`)}`}return f(()=>{u&&clearInterval(u),o.value?.state===`recording`&&o.value.stop()}),(t,r)=>d.value?(_(),U(`div`,Rr,[G(`button`,{type:`button`,disabled:!d.value||e.disabled,title:d.value?``:`Voice transcription not configured`,class:m({recording:a.value===`recording`,transcribing:a.value===`transcribing`}),onClick:r[0]||=e=>a.value===`idle`?h():v()},[a.value===`idle`?(_(),p(w(be),{key:0,class:`icon`})):(_(),p(w(Re),{key:1,class:`icon`})),a.value===`recording`?(_(),U(`span`,Br,g(S(l.value)),1)):n(``,!0)],10,zr),a.value===`recording`?(_(),U(`button`,{key:0,type:`button`,class:`cancel-btn`,onClick:y,title:`Cancel recording`},` ✕ `)):n(``,!0)])):n(``,!0)}}),[[`__scopeId`,`data-v-8a7c9b8a`]]),Hr={class:`restart-card`,role:`dialog`,"aria-modal":`true`},Ur={class:`restart-title`},Wr={class:`restart-body`},Gr={key:0,class:`restart-path mono`},Kr={class:`restart-actions`},qr=u({__name:`RestartTaskDialog`,props:{task:{}},emits:[`close`,`started`],setup(e,{emit:t}){let a=e,o=t,s=Yt(),c=I(!1),l=C(()=>a.task);async function u(e){if(a.task){c.value=!0;try{await s.startWork(a.task,e),o(`started`),o(`close`)}catch(e){s.onError(e),o(`close`)}finally{c.value=!1}}}function d(){c.value||o(`close`)}return(e,t)=>l.value?(_(),U(`div`,{key:0,class:`restart-overlay`,onClick:k(d,[`self`])},[G(`div`,Hr,[G(`h3`,Ur,`Restart task #`+g(l.value.id)+`?`,1),G(`p`,Wr,[t[2]||=i(` This task's worktree has uncommitted changes from the last run `,-1),l.value.git?.worktreePath?(_(),U(`span`,Gr,g(l.value.git.worktreePath),1)):n(``,!0),t[3]||=i(`. `,-1)]),t[6]||=G(`p`,{class:`restart-body dim`},[G(`b`,null,`Resume worktree`),i(` continues where the last run left off, keeping its changes. `),G(`b`,null,`Start clean`),i(` discards the worktree — and any commits on this branch that aren't merged into main — and begins from a fresh checkout. `)],-1),G(`div`,Kr,[r(X,{variant:`outline`,size:`sm`,disabled:c.value,onClick:d},{default:z(()=>[...t[4]||=[i(`Cancel`,-1)]]),_:1},8,[`disabled`]),r(X,{variant:`destructive`,size:`sm`,disabled:c.value,onClick:t[0]||=e=>u(`clean`)},{default:z(()=>[i(g(c.value?`Working…`:`Start clean`),1)]),_:1},8,[`disabled`]),r(X,{variant:`accent`,size:`sm`,disabled:c.value,onClick:t[1]||=e=>u(`resume`)},{default:z(()=>[...t[5]||=[G(`span`,{class:`restart-play`},`▶`,-1),i(` Resume worktree `,-1)]]),_:1},8,[`disabled`])])])])):n(``,!0)}}),Jr={class:`dirty-card`},Yr={class:`dirty-body`},Xr={class:`dirty-list`},Zr={class:`dirty-actions`},Qr=u({__name:`DirtyMainDialog`,props:{task:{},files:{}},emits:[`commit`,`cancel`],setup(e,{emit:a}){let s=e,c=a;function l(e){e.key===`Escape`&&s.task&&c(`cancel`)}return t(()=>window.addEventListener(`keydown`,l)),f(()=>window.removeEventListener(`keydown`,l)),(t,a)=>(_(),p(H,{to:`body`},[e.task?(_(),U(`div`,{key:0,class:`dirty-overlay`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`dirty-main-title`,onClick:a[2]||=k(e=>c(`cancel`),[`self`])},[G(`div`,Jr,[a[7]||=G(`h3`,{id:`dirty-main-title`,class:`dirty-title`},`main has uncommitted changes`,-1),G(`p`,Yr,[G(`b`,null,g(e.files.length)+` file`+g(e.files.length===1?``:`s`),1),a[3]||=i(` on `,-1),a[4]||=G(`code`,{class:`mono`},`main`,-1),i(` would block the merge for task #`+g(e.task.id)+`. Commit them and continue, or cancel to stay in review. `,1)]),G(`div`,Xr,[(_(!0),U(x,null,o(e.files,e=>(_(),U(`div`,{key:e,class:`dirty-file mono`},g(e),1))),128))]),G(`div`,Zr,[r(X,{type:`button`,variant:`outline`,size:`sm`,onClick:a[0]||=k(e=>c(`cancel`),[`stop`])},{default:z(()=>[...a[5]||=[i(`Cancel`,-1)]]),_:1}),r(X,{type:`button`,variant:`accent`,size:`sm`,onClick:a[1]||=k(e=>c(`commit`),[`stop`])},{default:z(()=>[...a[6]||=[i(` Commit & continue `,-1)]]),_:1})])])])):n(``,!0)]))}}),$r={class:`hotfix-card`},ei={class:`hotfix-body`},ti={class:`hotfix-actions`},ni=u({__name:`HotfixConfirmDialog`,props:{open:{type:Boolean},taskId:{},busy:{type:Boolean}},emits:[`cancel`,`start`],setup(a,{emit:o}){let c=a,l=o,u=I(null);function d(e){e.key===`Escape`&&c.open&&l(`cancel`)}return t(()=>window.addEventListener(`keydown`,d)),f(()=>window.removeEventListener(`keydown`,d)),e(()=>c.open,e=>{e&&s(()=>u.value?.$el?.focus())}),(e,t)=>(_(),p(H,{to:`body`},[a.open?(_(),U(`div`,{key:0,class:`hotfix-overlay`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`hotfix-confirm-title`,onClick:t[3]||=k(e=>l(`cancel`),[`self`])},[G(`div`,$r,[t[11]||=G(`h3`,{id:`hotfix-confirm-title`,class:`hotfix-title`},`Start hotfix?`,-1),G(`p`,ei,[t[4]||=i(` Run this task as a `,-1),t[5]||=G(`strong`,null,`hotfix`,-1),t[6]||=i(` in the main checkout (no worktree). The agent works in the repo root on a `,-1),G(`code`,null,`hotfix/`+g(a.taskId)+`-…`,1),t[7]||=i(` branch. Previews and diff-based review are skipped. `,-1)]),G(`div`,ti,[r(X,{ref_key:`cancelButton`,ref:u,type:`button`,variant:`outline`,size:`sm`,disabled:a.busy,onClick:t[0]||=e=>l(`cancel`)},{default:z(()=>[...t[8]||=[i(` Cancel `,-1)]]),_:1},8,[`disabled`]),r(X,{type:`button`,variant:`default`,size:`sm`,disabled:a.busy,onClick:t[1]||=e=>l(`start`,`branch`)},{default:z(()=>[...t[9]||=[i(` Hotfix on branch `,-1)]]),_:1},8,[`disabled`]),r(X,{type:`button`,variant:`destructive`,size:`sm`,disabled:a.busy,onClick:t[2]||=e=>l(`start`,`main`)},{default:z(()=>[...t[10]||=[i(` Hotfix on main `,-1)]]),_:1},8,[`disabled`])])])])):n(``,!0)]))}}),ri={class:`ste-card`},ii={id:`ste-confirm-title`,class:`ste-title`},ai=[`disabled`,`onKeydown`],oi={class:`ste-actions`},si=qn(u({__name:`SendToEngineerDialog`,props:{open:{type:Boolean},busy:{type:Boolean},title:{}},emits:[`cancel`,`confirm`],setup(a,{emit:o}){let c=a,l=o,u=I(``),d=I(null);function m(e){e.key===`Escape`&&c.open&&l(`cancel`)}t(()=>window.addEventListener(`keydown`,m)),f(()=>window.removeEventListener(`keydown`,m)),e(()=>c.open,e=>{e&&(u.value=``,s(()=>d.value?.focus()))});function h(){l(`confirm`,u.value.trim())}return(e,t)=>(_(),p(H,{to:`body`},[a.open?(_(),U(`div`,{key:0,class:`ste-overlay`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`ste-confirm-title`,onClick:t[3]||=k(e=>l(`cancel`),[`self`])},[G(`div`,ri,[G(`h3`,ii,g(a.title),1),t[5]||=G(`p`,{class:`ste-body`},[i(` This returns the task to `),G(`strong`,null,`active`),i(` and resumes the engineer with the reviewer findings. Add a short note to give the engineer specific instructions (optional). `)],-1),j(G(`textarea`,{ref_key:`textarea`,ref:d,"onUpdate:modelValue":t[0]||=e=>u.value=e,rows:`4`,class:`ste-note`,placeholder:`e.g. Handle the reviewer's suggestions; there is a rendering issue visible in the preview…`,disabled:a.busy,onKeydown:[N(k(h,[`exact`,`prevent`]),[`enter`]),t[1]||=N(e=>l(`cancel`),[`escape`])]},null,40,ai),[[O,u.value]]),G(`div`,oi,[r(X,{type:`button`,variant:`outline`,size:`sm`,disabled:a.busy,onClick:t[2]||=e=>l(`cancel`)},{default:z(()=>[...t[4]||=[i(` Cancel `,-1)]]),_:1},8,[`disabled`]),r(X,{type:`button`,variant:`accent`,size:`sm`,disabled:a.busy,onClick:h},{default:z(()=>[i(` Send to engineer`+g(u.value.trim()?` with note`:``),1)]),_:1},8,[`disabled`])])])])):n(``,!0)]))}}),[[`__scopeId`,`data-v-5c118dff`]]);function ci(e,t){let n=e.selectionStart,r=e.selectionEnd,i=e.value.substring(0,n),a=e.value.substring(r);e.value=i+t+a,e.selectionStart=e.selectionEnd=n+t.length,e.focus(),e.dispatchEvent(new Event(`input`,{bubbles:!0}))}var li={class:`sm-modal-head`},ui={class:`sm-modal-head-text`},di={class:`sm-modal-body`},fi={class:`sm-modal-editor`},pi={class:`sm-modal-editor-head`},mi={class:`sm-modal-actions`},hi=u({__name:`SpecEditModal`,props:{open:{type:Boolean},body:{}},emits:[`update:open`,`save`],setup(t,{emit:n}){let a=t,o=n,c=I(a.body),l=I(null);e(()=>a.open,e=>{e&&(c.value=a.body,s(()=>l.value?.focus()))});function u(e){l.value&&ci(l.value,e)}function d(){o(`update:open`,!1)}function f(){o(`save`,c.value)}return(e,n)=>(_(),p(rr,{open:t.open,"onUpdate:open":n[1]||=e=>o(`update:open`,e)},{default:z(()=>[r(sr),r(ar,{class:`sm-modal`},{default:z(()=>[G(`div`,li,[G(`div`,ui,[r(cr,null,{default:z(()=>[...n[2]||=[i(`Edit spec`,-1)]]),_:1}),r(or,{class:`sm-modal-desc`},{default:z(()=>[...n[3]||=[i(` Edit the spec markdown below. Save applies your changes to the spec. `,-1)]]),_:1})]),r(ir,{class:`close-x`,"aria-label":`Close`},{default:z(()=>[...n[4]||=[G(`span`,{"aria-hidden":`true`},`×`,-1)]]),_:1})]),G(`div`,di,[G(`div`,fi,[G(`div`,pi,[n[5]||=G(`span`,{class:`sm-modal-label`},`Spec markdown`,-1),r(Vr,{onTranscribed:u})]),j(G(`textarea`,{ref_key:`editEl`,ref:l,class:`sm-modal-textarea`,"onUpdate:modelValue":n[0]||=e=>c.value=e,rows:`12`,placeholder:`Markdown body`},null,512),[[O,c.value]])])]),G(`div`,mi,[r(ir,{"as-child":``},{default:z(()=>[r(X,{variant:`outline`,onClick:d},{default:z(()=>[...n[6]||=[i(`Cancel`,-1)]]),_:1})]),_:1}),r(X,{variant:`default`,onClick:f},{default:z(()=>[...n[7]||=[i(`Save`,-1)]]),_:1})])]),_:1})]),_:1},8,[`open`]))}}),gi={key:1,class:`done-error-static`},_i={class:`done-error-head`},vi={key:0,class:`done-error-step`},yi={key:0,class:`done-error-output`},bi=[`aria-expanded`],xi={key:0,class:`done-error-pre mono`},Si={key:1,class:`done-error-files`},Ci={class:`done-error-hint`},wi=[`disabled`],Ti=u({__name:`DoneErrorCard`,props:{message:{},step:{},conflicts:{},detail:{},hint:{},taskId:{},taskTitle:{},mode:{default:`card`}},emits:[`open-panel`,`open-debugger`],setup(e,{emit:t}){let a=e,s=t,c=I(!1),l=I(!1);async function u(){if(!(c.value||!a.taskId)){c.value=!0;try{await K(`/api/tasks/${a.taskId}/debugger/message`,q(`POST`,{text:[`Please investigate this failed Move-to-done operation for task #${a.taskId}: ${a.taskTitle??`Untitled task`}.`,`Phase: ${a.step??`unknown`}.`,`Error: ${a.message}`,...a.detail?[`Full output:\n${a.detail}`]:[],`Identify the concrete cause and the smallest safe repair so the task can be retried.`].join(`
|
|
7
|
+
`)})),l.value=!0,s(`open-debugger`)}finally{c.value=!1}}}function d(){a.mode===`card`&&s(`open-panel`)}let f=`done-error-detail-${y().replaceAll(`:`,`-`)}`,p=I(null),h=I(!0);return(t,a)=>(_(),U(`div`,{class:m([`done-error`,`done-error--${e.mode}`]),role:`alert`},[e.mode===`card`?(_(),U(`button`,{key:0,type:`button`,class:`done-error-toggle`,title:`Open the task panel to see the full error`,onClick:d},[r(w(Z),{class:`done-error-ico`,"aria-hidden":`true`}),G(`span`,{ref_key:`msgEl`,ref:p,class:`done-error-msg clamped`},g(e.message),513),r(w(Ye),{class:`done-error-chev`,"aria-hidden":`true`})])):(_(),U(`div`,gi,[r(w(Z),{class:`done-error-ico`,"aria-hidden":`true`}),G(`span`,{ref_key:`msgEl`,ref:p,class:`done-error-msg`},g(e.message),513)])),e.mode===`panel`?(_(),U(`div`,{key:2,id:f,class:`done-error-detail`},[G(`div`,_i,[a[1]||=i(` Move to done failed `,-1),e.step?(_(),U(`span`,vi,`at `+g(e.step),1)):n(``,!0)]),e.detail?(_(),U(`div`,yi,[G(`button`,{type:`button`,class:`done-error-output-toggle`,"aria-expanded":h.value,onClick:a[0]||=e=>h.value=!h.value},[a[2]||=G(`span`,{class:`done-error-sub`},`Check output`,-1),r(w(Ye),{class:m([`done-error-chev`,{open:h.value}]),"aria-hidden":`true`},null,8,[`class`])],8,bi),h.value?(_(),U(`pre`,xi,g(e.detail),1)):n(``,!0)])):n(``,!0),e.conflicts?.length?(_(),U(`div`,Si,[a[3]||=G(`div`,{class:`done-error-sub`},`Conflicting files`,-1),G(`ul`,null,[(_(!0),U(x,null,o(e.conflicts,e=>(_(),U(`li`,{key:e,class:`mono`},g(e),1))),128))])])):n(``,!0),G(`p`,Ci,g(e.hint??`RepoOS couldn't sync this branch with main automatically — resolve the conflicting files in the worktree, then retry.`),1)])):n(``,!0),e.taskId?(_(),U(`button`,{key:3,type:`button`,class:`done-error-fix`,disabled:c.value||l.value,onClick:u},[r(w($e),{class:`size-3.5`}),i(` `+g(c.value?`Sending…`:l.value?`Sent to Debugger`:`Fix`),1)],8,wi)):n(``,!0)],2))}});function Ei(e){let t=e.split(`
|
|
8
|
+
`).map(e=>e.trim()).filter(Boolean),n=-1;for(let e=t.length-1;e>=0;e--)if(/^(?:[❯×]\s*)?FAIL\s+/.test(t[e])){n=e;break}if(n===-1)return null;let r=t[n].replace(/^(?:[❯×]\s*)?FAIL\s+/,``),i=t.slice(n+1),a=i.find(e=>/(?:^|\s)(?:[^\s:]+\/)?[^\s:]+\.(?:test|spec)\.[cm]?[jt]sx?:\d+:\d+/.test(e)),o=i.find(e=>/^(?:[A-Za-z]*Error|Error):/.test(e)),s=[r];return a&&s.push(`at ${a.replace(/^[❯×]\s*/,``)}`),o&&s.push(o),s.join(` — `)}var Di=u({__name:`card`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let t=e;return(e,n)=>(_(),U(`div`,{class:m(w(J)(`relative overflow-hidden rounded-[15px] border border-[var(--border)] bg-[var(--panel)] text-[var(--txt)] backdrop-blur-[14px]`,t.class))},[l(e.$slots,`default`)],2))}});function Oi(e,t=120){e&&(e.style.height=`auto`,e.style.height=`${Math.min(e.scrollHeight,t)}px`)}var ki={class:`td-bg`},Ai={key:0,class:`td-disabled`},ji={key:0,class:`td-welcome`},Mi={class:`td-prompts`},Ni={key:0,class:`td-mini-avatar`},Pi=[`innerHTML`],Fi={key:1},Ii={key:2,class:`msg-time`},Li={key:1,class:`td-thinking`,"aria-label":`Debugger is working`},Ri={key:2,class:`td-dispatch-err`,role:`alert`},zi={class:`td-dispatch`},Bi=[`disabled`],Vi=[`disabled`],Hi=[`disabled`,`placeholder`],Ui=[`disabled`],Wi=`/assets/repoos-orchestrator-square.webp`,Gi=80,Ki=qn(u({__name:`TaskDebuggerChat`,props:{task:{}},emits:[`close`],setup(a,{emit:c}){let l=a,u=C(()=>`debugger:${l.task.id}`),d=Yt(),f=rn();it();let h=I(``),v=I(!1),y=I(!1),b=I(null),S=I(null),T=I(!1),E=C(()=>R()||y.value),D=C(()=>v.value||d.runningIds.includes(u.value)),A=C(()=>d.outputs[u.value]??[]),M=C(()=>A.value.length>0),N=I(null),P=I(!1),F=I(``);function R(){let e=f.data;if(!e)return y.value;let t=e.builtInAgents;return!t||t.debugger===void 0?y.value:!!t.debugger.enabled}function B(e){return`type`in e?e.type===`human`?`human`:e.type===`text`?`assistant`:e.type===`step`?`hidden`:`status`:e.s===`out`?`assistant`:`status`}function V(e){if(`type`in e){if(e.type===`human`||e.type===`text`)return e.text;if(e.type===`sys`)return e.d;if(e.type===`tool`){let t=e.state?` · ${e.state}`:``;return`Checked with ${e.tool}${t}`}return``}return e.d}function ee(){s(()=>{b.value&&(b.value.scrollTop=b.value.scrollHeight),T.value=!1})}function H(){let e=b.value;e&&(T.value=e.scrollHeight-e.scrollTop-e.clientHeight>Gi)}async function W(){try{let e=await K(`/api/tasks/${l.task.id}/debugger`);y.value=e.enabled,d.outputs[u.value]=e.lines,e.running&&!d.runningIds.includes(u.value)&&(d.runningIds=[...d.runningIds,u.value])}catch(e){d.onError(e)}}async function J(){let e=h.value.trim();if(!e||D.value||!E.value)return;v.value=!0;let t={type:`human`,text:e,at:new Date().toISOString()},n=A.value.length;d.outputs[u.value]=[...A.value,t],h.value=``,ee();try{await K(`/api/tasks/${l.task.id}/debugger/message`,q(`POST`,{text:e}))}catch(t){d.outputs[u.value]=(d.outputs[u.value]??[]).filter((e,t)=>t!==n),h.value=e,d.outputs[u.value]=[...d.outputs[u.value]??[],{type:`sys`,d:t instanceof Error?t.message:String(t)}],d.onError(t)}finally{v.value=!1}}async function Y(){try{await K(`/api/tasks/${l.task.id}/debugger/interrupt`,{method:`POST`})}catch(e){d.onError(e)}}function X(e){N.value=e,F.value=``}function Z(){N.value=null}async function te(e){if(!N.value)return;let t=N.value;P.value=!0,F.value=``;try{let n=t===`engineer`?`/api/tasks/${l.task.id}/debugger/send-to-engineer`:`/api/tasks/${l.task.id}/debugger/send-to-pm`,r=t===`engineer`?e.trim()?`Based on the Debugger's diagnosis, please act on the following instruction:\n\n${e.trim()}`:`Resume work on this task using the Debugger's diagnosis to fix the failure.`:e.trim();await K(n,q(`POST`,{text:r})),Z()}catch(e){F.value=e instanceof Error?e.message:String(e)}finally{P.value=!1}}function ne(e){e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),J())}function re(e){S.value&&ci(S.value,e)}function ie(){Oi(S.value)}return e(()=>A.value.length,()=>ee()),e(()=>l.task.id,()=>{W()}),t(()=>{f.load(),W()}),e(()=>h.value,()=>{s(ie)}),(e,t)=>{let a=L(`RouterLink`);return _(),U(`div`,ki,[E.value?(_(),U(x,{key:1},[G(`div`,{ref_key:`log`,ref:b,class:`td-log`,role:`log`,"aria-live":`polite`,"aria-label":`Conversation with the Debugger`,onScroll:H},[M.value?n(``,!0):(_(),U(`div`,ji,[G(`div`,{class:`td-welcome-avatar`},[G(`img`,{src:Wi,alt:`Debugger`})]),t[9]||=G(`strong`,null,`Debug this task`,-1),t[10]||=G(`p`,null,` I have this task's spec, logs, and every agent conversation (PM, engineer, reviewer). Tell me what broke and I'll explain the cause and the fix. `,-1),G(`div`,Mi,[G(`button`,{type:`button`,onClick:t[0]||=e=>h.value=`Why is this task failing?`},` Why is this failing? `),G(`button`,{type:`button`,onClick:t[1]||=e=>h.value=`Explain the engineer auth error and how to fix it`},` Explain the auth error `)])])),(_(!0),U(x,null,o(A.value,(e,t)=>(_(),U(x,{key:t},[B(e)===`hidden`?n(``,!0):(_(),U(`div`,{key:0,class:m([`td-row`,`td-row-${B(e)}`])},[B(e)===`assistant`?(_(),U(`div`,Ni,[G(`img`,{src:Wi,alt:`D`})])):n(``,!0),G(`div`,{class:m([`td-bubble`,`td-bubble-${B(e)}`])},[B(e)===`assistant`?(_(),U(`div`,{key:0,class:`td-markdown`,innerHTML:w(Mr)(V(e))},null,8,Pi)):(_(),U(`span`,Fi,g(V(e)),1)),B(e)!==`status`&&e.at?(_(),U(`span`,Ii,g(w(tr)(e.at)),1)):n(``,!0)],2)],2))],64))),128)),D.value?(_(),U(`div`,Li,[...t[11]||=[G(`span`,null,null,-1),G(`span`,null,null,-1),G(`span`,null,null,-1)]])):n(``,!0),F.value?(_(),U(`div`,Ri,g(F.value),1)):n(``,!0)],544),T.value?(_(),U(`button`,{key:0,type:`button`,class:`td-scroll-bottom`,"aria-label":`Scroll to latest messages`,onClick:ee},[...t[12]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`path`,{d:`M5 8l5 5 5-5`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1),i(` Scroll to bottom `,-1)]])):n(``,!0),G(`div`,zi,[G(`button`,{type:`button`,disabled:D.value,onClick:t[2]||=e=>X(`engineer`)},` Send to engineer `,8,Bi),G(`button`,{type:`button`,disabled:D.value,onClick:t[3]||=e=>X(`pm`)},`Send to PM`,8,Vi)]),G(`form`,{class:`td-compose`,onSubmit:k(J,[`prevent`])},[j(G(`textarea`,{ref_key:`draftTextarea`,ref:S,"onUpdate:modelValue":t[4]||=e=>h.value=e,rows:`1`,disabled:!E.value,placeholder:E.value?`Ask the Debugger about this task…`:`Enable the Debugger on the Agents page`,"aria-label":`Message the Debugger`,onKeydown:ne,onInput:ie},null,40,Hi),[[O,h.value]]),r(Vr,{disabled:!E.value,onTranscribed:re},null,8,[`disabled`]),D.value?(_(),U(`button`,{key:0,type:`button`,class:`td-stop`,"aria-label":`Stop response`,title:`Stop response`,onClick:Y},[...t[13]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`rect`,{x:`5`,y:`5`,width:`10`,height:`10`,rx:`1.5`,fill:`currentColor`})],-1)]])):(_(),U(`button`,{key:1,type:`submit`,disabled:!h.value.trim()||D.value||!E.value,"aria-label":`Diagnose`},` Diagnose `,8,Ui))],32)],64)):(_(),U(`div`,Ai,[t[8]||=G(`strong`,null,`Debugger is disabled`,-1),G(`span`,null,[t[6]||=i(`Enable the Debugger on the `,-1),r(a,{to:{name:`agents`}},{default:z(()=>[...t[5]||=[i(`Agents page`,-1)]]),_:1}),t[7]||=i(` to chat about this task.`,-1)])])),N.value?(_(),p(si,{key:2,open:!0,busy:P.value,title:N.value===`engineer`?`Send to engineer`:`Send to PM`,onCancel:Z,onConfirm:te},null,8,[`busy`,`title`])):n(``,!0)])}}}),[[`__scopeId`,`data-v-1818e09a`]]),qi={class:`debug-tabs`},Ji={class:`debug-sync-head`},Yi={key:0,class:`debug-sync-warn`},Xi={class:`debug-live-head`},Zi={class:`debug-live-title`},Qi={class:`debug-live-elapsed`},$i={class:`debug-filters`},ea={key:2,class:`agent-empty`},ta={key:3,class:`debug-events`},na=[`onClick`],ra={class:`debug-event-row`},ia={class:`debug-event-kind`},aa={class:`debug-event-title`},oa=[`title`],sa={key:0,class:`debug-event-summary`},ca={key:1,class:`debug-log debug-log-inline`},la={key:2,class:`debug-log debug-log-inline`},ua=qn(u({__name:`DebugPanel`,props:d({task:{}},{view:{default:`logs`},viewModifiers:{}}),emits:[`update:view`],setup(a){let l=a,u=Yt(),d=b(a,`view`),f=C(()=>!!l.task.git.worktreePath),h=C(()=>!!l.task.git.dirty),y=I(!1);async function S(){if(!(!f.value||y.value)){y.value=!0;try{await u.syncTaskBranch(l.task.id)}catch(e){u.onError(e)}finally{y.value=!1}}}t(()=>{u.refreshTaskChecks(l.task.id),u.refreshTaskLogs(l.task.id)}),e(()=>l.task.id,e=>{u.refreshTaskChecks(e),u.refreshTaskLogs(e)});function T(e){let t=e.lastIndexOf(`
|
|
9
|
+
## Activity
|
|
10
|
+
`);if(t===-1)return[];let n=e.slice(t),r=[],i=/^- (\S+) · (.+)$/gmu,a;for(;a=i.exec(n);)r.push({at:a[1],text:a[2]});return r}function D(e){return e===`handoff-finalize`?`handoff-finalize check`:`MTD merge-gate check`}function O(e){if(e===null)return``;if(e<1e3)return`${e}ms`;let t=e/1e3;return t<60?`${t.toFixed(1)}s`:`${Math.floor(t/60)}m ${Math.round(t%60)}s`}let k=C(()=>{let e=[];for(let t of T(l.task.body??``))e.push({key:`activity-${t.at}-${t.text.slice(0,24)}`,at:t.at,kind:`activity`,level:/fail|error/i.test(t.text)?`error`:`info`,title:t.text,detail:t.text});for(let t of u.taskLogs[l.task.id]??[])e.push({key:`log-${t.timestamp}-${t.message.slice(0,24)}`,at:t.timestamp,kind:`log`,level:t.level===`error`||t.level===`fatal`?`error`:t.level===`warn`?`warn`:`info`,title:t.message,detail:t.context&&Object.keys(t.context).length?JSON.stringify(t.context):void 0});for(let t of u.taskChecks[l.task.id]??[]){let n=D(t.kind),r=t.running?`${n} — running…`:`${n} — ${t.passed?`passed`:`failed`} in ${O(t.durationMs)}`;e.push({key:`check-${t.id}`,at:t.startedAt,kind:`check`,level:t.running||t.passed?`info`:`error`,title:r,failureSummary:!t.running&&t.passed===!1?Ei(t.output)??void 0:void 0,checkRun:t})}return e.sort((e,t)=>Date.parse(t.at)-Date.parse(e.at))}),A=I(`all`),M=I(`all`),N=C(()=>k.value.filter(e=>!(A.value===`errors`&&e.level!==`error`&&e.level!==`warn`||M.value!==`all`&&e.kind!==M.value))),P=C(()=>(u.taskChecks[l.task.id]??[]).find(e=>e.running)),F=I(Date.now()),L;t(()=>{L=setInterval(()=>{F.value=Date.now()},1e3)}),v(()=>clearInterval(L));let R=C(()=>P.value?O(Math.max(0,F.value-Date.parse(P.value.startedAt))):``),B=I(null),V=I(!0);function ee(){let e=B.value;e&&(V.value=e.scrollHeight-e.scrollTop-e.clientHeight<40)}e(()=>P.value?.output,()=>{V.value&&s(()=>{let e=B.value;e&&(e.scrollTop=e.scrollHeight)})});let H=I(new Set);function W(e){let t=new Set(H.value);t.has(e)?t.delete(e):t.add(e),H.value=t}return(e,t)=>(_(),U(`div`,{class:m([`debug-panel`,{"debug-panel-chat":d.value===`debugger`}])},[G(`div`,qi,[G(`button`,{type:`button`,class:m([`debug-tab`,{active:d.value===`logs`}]),onClick:t[0]||=e=>d.value=`logs`},` Logs `,2),G(`button`,{type:`button`,class:m([`debug-tab`,{active:d.value===`debugger`}]),onClick:t[1]||=e=>d.value=`debugger`},[...t[4]||=[i(` Debugger `,-1),G(`span`,{class:`debug-tab-dot`},null,-1)]],2)]),d.value===`logs`?(_(),U(x,{key:0},[f.value?(_(),p(Di,{key:0,class:`debug-sync`},{default:z(()=>[G(`div`,Ji,[r(w(ce),{class:m([`debug-sync-icon`,{spinning:y.value}])},null,8,[`class`]),t[5]||=G(`div`,{class:`debug-sync-text`},[G(`span`,{class:`debug-sync-title`},`Sync with main`),G(`span`,{class:`debug-sync-sub`},` Merge main into this task's branch to pick up fixes landed since it was cut. `)],-1),r(X,{variant:`outline`,size:`sm`,class:`debug-sync-btn`,disabled:y.value,onClick:S},{default:z(()=>[i(g(y.value?`Syncing…`:`Sync now`),1)]),_:1},8,[`disabled`])]),h.value?(_(),U(`p`,Yi,` This worktree has uncommitted changes — merging main may refuse or merge around your in-progress edits. Commit or stash first if you want a clean reconcile. `)):n(``,!0)]),_:1})):n(``,!0),P.value?(_(),p(Di,{key:1,class:`debug-live`},{default:z(()=>[G(`div`,Xi,[t[6]||=G(`span`,{class:`debug-live-dot`},null,-1),G(`span`,Zi,g(D(P.value.kind))+` running…`,1),G(`span`,Qi,g(R.value),1)]),G(`pre`,{ref_key:`logEl`,ref:B,class:`debug-log`,onScroll:ee},g(P.value.output||`…`),545)]),_:1})):n(``,!0),G(`div`,$i,[j(G(`select`,{"onUpdate:modelValue":t[2]||=e=>M.value=e,class:`debug-select`},[...t[7]||=[G(`option`,{value:`all`},`All events`,-1),G(`option`,{value:`activity`},`State changes`,-1),G(`option`,{value:`log`},`Logs`,-1),G(`option`,{value:`check`},`Checks`,-1)]],512),[[E,M.value]]),G(`button`,{type:`button`,class:m([`debug-filter-btn`,{active:A.value===`errors`}]),onClick:t[3]||=e=>A.value=A.value===`errors`?`all`:`errors`},[r(w(ie),{class:`debug-filter-icon`}),t[8]||=i(` Errors & warnings only `,-1)],2)]),N.value.length===0?(_(),U(`div`,ea,[...t[9]||=[G(`p`,null,`No debug events yet.`,-1)]])):(_(),U(`div`,ta,[(_(!0),U(x,null,o(N.value,e=>(_(),U(`div`,{key:e.key,class:m([`debug-event`,[`debug-level-${e.level}`,{"debug-event-expandable":e.kind===`check`||e.detail}]]),onClick:t=>e.kind===`check`||e.detail?W(e.key):void 0},[G(`div`,ra,[(_(),p(c(e.kind===`check`||e.detail?H.value.has(e.key)?w(Ye):w(Ue):`span`),{class:`debug-event-chevron`})),G(`span`,ia,g(e.kind),1),G(`span`,aa,g(e.title),1),G(`span`,{class:`debug-event-time`,title:e.at},g(w($n)(e.at)),9,oa)]),e.failureSummary?(_(),U(`p`,sa,g(e.failureSummary),1)):n(``,!0),H.value.has(e.key)&&e.kind===`check`&&e.checkRun?(_(),U(`pre`,ca,g(e.checkRun.output||`(no output captured)`),1)):H.value.has(e.key)&&e.detail?(_(),U(`pre`,la,g(e.detail),1)):n(``,!0)],10,na))),128))]))],64)):(_(),p(Ki,{key:1,task:a.task},null,8,[`task`]))],2))}}),[[`__scopeId`,`data-v-78255979`]]),da={class:`stop-work-modal-head`},fa=[`disabled`],pa={id:`stop-work-confirm-description`,class:`stop-work-modal-message`},ma={class:`stop-work-modal-actions`},ha=qn(u({__name:`StopWorkConfirmModal`,props:{open:{type:Boolean},taskId:{},busy:{type:Boolean}},emits:[`update:open`,`confirm`,`cancel`],setup(a,{emit:o}){let c=[],l=0,u=a,d=o,m=++l,h=I(null),v=null;function y(){return h.value?Array.from(h.value.querySelectorAll(`button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`)).filter(e=>e.offsetParent!==null):[]}function b(e){if(e.key!==`Tab`)return;let t=y();if(t.length===0){e.preventDefault(),h.value?.focus();return}let n=t[0],r=t[t.length-1],i=document.activeElement;e.shiftKey?(!i||i===n||!h.value.contains(i))&&(e.preventDefault(),r.focus()):(!i||i===r||!h.value.contains(i))&&(e.preventDefault(),n.focus())}function x(e){e.key===`Escape`&&c[c.length-1]===m&&(e.preventDefault(),u.busy||d(`cancel`))}function S(){u.busy||d(`cancel`)}function C(){d(`cancel`)}function w(){d(`confirm`)}return e(()=>u.open,e=>{if(e)v=document.activeElement,c.push(m),s(()=>{(y()[0]??h.value)?.focus()});else{let e=c.indexOf(m);e!==-1&&c.splice(e,1),v?.focus?.(),v=null}}),t(()=>window.addEventListener(`keydown`,x)),f(()=>{window.removeEventListener(`keydown`,x);let e=c.indexOf(m);e!==-1&&c.splice(e,1)}),(e,t)=>(_(),p(H,{to:`body`},[a.open?(_(),U(`div`,{key:0,class:`stop-work-overlay`,onClick:k(S,[`self`])},[G(`div`,{ref_key:`modalEl`,ref:h,class:`stop-work-modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`stop-work-confirm-title`,"aria-describedby":`stop-work-confirm-description`,tabindex:`-1`,onKeydown:b},[G(`div`,da,[t[1]||=G(`h3`,{id:`stop-work-confirm-title`,class:`stop-work-title`},`Confirm Stop Work`,-1),G(`button`,{type:`button`,class:`stop-work-close`,"aria-label":`Close confirmation`,disabled:a.busy,onClick:C},[...t[0]||=[G(`span`,{"aria-hidden":`true`},`×`,-1)]],8,fa)]),G(`p`,pa,` Stop work on task `+g(a.taskId||`this task`)+` and send it back to ready? The current worktree is kept, not deleted. `,1),G(`div`,ma,[r(X,{type:`button`,variant:`outline`,size:`sm`,disabled:a.busy,onClick:C},{default:z(()=>[...t[2]||=[i(` Cancel `,-1)]]),_:1},8,[`disabled`]),r(X,{type:`button`,variant:`destructive`,size:`sm`,disabled:a.busy,onClick:w},{default:z(()=>[...t[3]||=[i(` Stop Work `,-1)]]),_:1},8,[`disabled`])])],544)])):n(``,!0)]))}}),[[`__scopeId`,`data-v-f2730b48`]]),ga=u({__name:`root`,props:d({open:{type:Boolean},defaultOpen:{type:Boolean},defaultValue:{},dir:{},name:{},autocomplete:{},disabled:{type:Boolean},required:{type:Boolean}},{modelValue:{},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,n=b(e,`modelValue`),r=ke(t);return(e,t)=>(_(),p(w(We),a(w(r),{"model-value":n.value,"onUpdate:modelValue":t[0]||=e=>n.value=e}),{default:z(()=>[l(e.$slots,`default`)]),_:3},16,[`model-value`]))}}),_a=u({__name:`content`,props:{class:{type:[Boolean,null,String,Object,Array]},forceMount:{type:Boolean},position:{},bodyLock:{type:Boolean},side:{},sideOffset:{},align:{},alignOffset:{},avoidCollisions:{type:Boolean},collisionBoundary:{},collisionPadding:{},arrowPadding:{},sticky:{},hideWhenDetached:{type:Boolean},updatePositionStrategy:{},prioritizePosition:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){let t=e,n=C(()=>{let{class:e,...n}=t;return n}),i=ke(n);return(e,n)=>(_(),p(w(Me),null,{default:z(()=>[r(w(tt),a(w(i),{class:w(J)(`relative z-[120] max-h-96 min-w-[8rem] overflow-hidden rounded-[10px] border border-[var(--border)] bg-[var(--popover)] text-[var(--txt)] shadow-[0_18px_40px_rgba(0,0,0,.45)]`,t.class)}),{default:z(()=>[l(e.$slots,`default`)]),_:3},16,[`class`])]),_:3}))}}),va={class:`absolute right-2 flex size-3.5 items-center justify-center`},ya=u({__name:`item`,props:{class:{type:[Boolean,null,String,Object,Array]},value:{},disabled:{type:Boolean},textValue:{},asChild:{type:Boolean},as:{}},setup(e){let t=e,n=C(()=>{let{class:e,...n}=t;return n}),i=ke(n);return(e,n)=>(_(),p(w(_e),a(w(i),{class:w(J)(`relative flex w-full cursor-pointer select-none items-center gap-2 rounded-[8px] py-[7px] pl-2 pr-8 text-[13px] text-[var(--txt)] outline-none focus:bg-[var(--cyan-dim)] data-[disabled]:pointer-events-none data-[disabled]:opacity-50`,t.class)}),{default:z(()=>[G(`span`,va,[r(w(Ve),null,{default:z(()=>[r(w(Ie),{class:`size-4 text-[var(--cyan)]`})]),_:1})]),r(w(Ee),{class:`flex items-center gap-2`},{default:z(()=>[l(e.$slots,`default`)]),_:3})]),_:3},16,[`class`]))}}),ba=u({__name:`trigger`,props:{class:{type:[Boolean,null,String,Object,Array]},disabled:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){let t=e,n=C(()=>{let{class:e,...n}=t;return n}),i=ke(n);return(e,n)=>(_(),p(w(Je),a(w(i),{class:w(J)(`flex h-10 w-full items-center justify-between gap-2 whitespace-nowrap rounded-[10px] border border-[var(--border)] bg-[var(--panel-solid)] px-3 py-2 text-[13px] text-[var(--txt)] focus-visible:border-[var(--border-bright)] focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1`,t.class)}),{default:z(()=>[l(e.$slots,`default`),r(w(Oe),{"as-child":``},{default:z(()=>[r(w(Ye),{class:`size-4 shrink-0 opacity-60`})]),_:1})]),_:3},16,[`class`]))}}),xa=u({__name:`value`,props:{class:{type:[Boolean,null,String,Object,Array]},placeholder:{},asChild:{type:Boolean},as:{}},setup(e){let t=e,n=C(()=>{let{class:e,...n}=t;return n}),r=ke(n);return(e,n)=>(_(),p(w(Pe),a(w(r),{class:w(J)(`text-[var(--txt)]`,t.class)}),{default:z(()=>[l(e.$slots,`default`)]),_:3},16,[`class`]))}}),Sa=u({__name:`viewport`,props:{class:{type:[Boolean,null,String,Object,Array]},nonce:{},asChild:{type:Boolean},as:{}},setup(e){let t=e,n=C(()=>{let{class:e,...n}=t;return n}),r=ke(n);return(e,n)=>(_(),p(w(Qe),a(w(r),{class:w(J)(`p-1`,t.class)}),{default:z(()=>[l(e.$slots,`default`)]),_:3},16,[`class`]))}}),Ca=`agent-model-favorites`;function wa(){try{let e=localStorage.getItem(Ca);return e?JSON.parse(e):[]}catch{return[]}}function Ta(e){try{localStorage.setItem(Ca,JSON.stringify(e))}catch(e){let t=e instanceof Error?e.message:String(e);console.warn(`[useFavorites] Failed to persist favorites: ${t}`)}}function Ea(){let e=I(wa());function t(t,n){return e.value.some(e=>e.cli===t&&e.model===n)}function n(n,r){t(n,r)?e.value=e.value.filter(e=>e.cli!==n||e.model!==r):e.value.push({cli:n,model:r,addedAt:Date.now()}),Ta(e.value)}function r(t){return e.value.filter(e=>e.cli===t).sort((e,t)=>t.addedAt-e.addedAt)}return{favorites:e,isFavorite:t,toggleFavorite:n,getFavoritesForCli:r,hasFavorites:C(()=>e.value.length>0)}}var Da=`agent-model-last-by-context`;function Oa(){try{let e=localStorage.getItem(Da);if(!e)return{};let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t))!r||typeof r!=`object`||Array.isArray(r)||(n[e]=r);return n}catch{return{}}}function ka(){function e(e,t,n){if(!(!e||!t||!n))try{let r=Oa();r[e]={...r[e]??{},[t]:n},localStorage.setItem(Da,JSON.stringify(r))}catch{}}function t(e,t){if(!(!e||!t))return Oa()[e]?.[t]||void 0}return{remember:e,recall:t}}var Aa={class:`am-modal-head`},ja={class:`am-modal-head-text`},Ma={class:`am-modal-current`},Na={class:`am-cli-picker`},Pa=[`onClick`],Fa={key:0,class:`am-reset-notice`,role:`status`,"data-testid":`am-reset-notice`},Ia={class:`am-reset-notice-detail`},La={class:`am-model-search`},Ra={class:`am-model-search-wrap`},za={key:0,class:`am-favorites-section`},Ba={class:`am-favorites-count`},Va={key:0,class:`am-favorites-list`},Ha=[`aria-disabled`,`aria-selected`,`onClick`],Ua={class:`am-model-label`},Wa={key:0,class:`am-model-disabled-hint`},Ga={class:`am-model-actions`},Ka={key:0,class:`am-model-check`},qa=[`onClick`],Ja={key:1,class:`am-all-models-section`},Ya={key:0,class:`am-all-models-header`},Xa=[`aria-disabled`,`aria-selected`,`onClick`],Za={class:`am-model-label`},Qa={key:0,class:`am-model-disabled-hint`},$a={class:`am-model-actions`},eo={key:0,class:`am-model-check`},to=[`onClick`],no={key:2,class:`am-model-empty`},ro={key:3,class:`am-no-favorites-hint`},io=u({__name:`AgentModelModal`,props:{open:{type:Boolean},cliOptions:{},modelOptions:{},cli:{},model:{},memoryKey:{},disabled:{type:Boolean}},emits:[`update:open`,`update:cli`,`update:model`],setup(t,{emit:a}){let c=t,l=a,u=I(``),d=I(null),f=I(null),h=I(!0),{isFavorite:v,toggleFavorite:y,getFavoritesForCli:b,hasFavorites:S}=Ea(),{remember:T,recall:E}=ka(),D=rn(),k=C(()=>c.memoryKey),A=I(null);function M(e){return c.modelOptions.find(t=>t.value===e)?.label??e}let N=C(()=>M(c.model)),P=C(()=>{let e=u.value.trim().toLowerCase();return e?c.modelOptions.filter(t=>t.value==="default"||t.label.toLowerCase().includes(e)):c.modelOptions}),F=C(()=>b(c.cli).length>0),L=C(()=>b(c.cli).map(e=>c.modelOptions.find(t=>t.value===e.model)).filter(e=>e!==void 0));function R(e){let t=E(k.value,e);return t&&D.isKnownModelForCli(e,t)?t:`default`}function B(e){let t=c.cli;if(e===t)return;let n=c.model;T(k.value,t,n),l(`update:cli`,e);let r=R(e);l(`update:model`,r),A.value=r==="default"&&n&&n!=="default"?M(n):null}function V(e){T(k.value,c.cli,e),A.value=null,l(`update:model`,e),l(`update:open`,!1)}function ee(e,t,n){n.stopPropagation(),y(e,t)}return e(()=>c.open,e=>{e&&(A.value=null,u.value=``,s(()=>{let e=f.value;e&&(e.scrollTop=0),d.value?.focus()}))}),(e,a)=>(_(),p(H,{to:`body`},[r(rr,{open:t.open,"onUpdate:open":a[2]||=e=>l(`update:open`,e)},{default:z(()=>[r(sr),r(ar,{class:`am-modal`},{default:z(()=>[G(`div`,Aa,[G(`div`,ja,[r(cr,null,{default:z(()=>[...a[3]||=[i(`Coding Agent + Model`,-1)]]),_:1}),G(`div`,Ma,g(t.cli)+` · `+g(N.value),1)]),r(or,{class:`sr-only`},{default:z(()=>[...a[4]||=[i(` Choose a coding agent and model `,-1)]]),_:1}),r(ir,{class:`close-x`},{default:z(()=>[r(w(ne),{class:`size-[15px]`})]),_:1})]),G(`div`,Na,[(_(!0),U(x,null,o(t.cliOptions,e=>(_(),U(`button`,{key:e,type:`button`,class:m([`am-cli-btn`,{active:e===t.cli}]),onClick:t=>B(e)},g(e),11,Pa))),128))]),A.value?(_(),U(`div`,Fa,[a[5]||=G(`span`,{class:`am-reset-notice-title`},`Model reset to default`,-1),G(`span`,Ia,`— was `+g(A.value),1)])):n(``,!0),G(`div`,La,[G(`div`,Ra,[r(w(me),{class:`pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-[var(--txt-faint)]`}),j(G(`input`,{ref_key:`modelSearchEl`,ref:d,"onUpdate:modelValue":a[0]||=e=>u.value=e,type:`text`,role:`combobox`,"aria-label":`Search models`,placeholder:`Search models…`,class:`am-model-search-input`},null,512),[[O,u.value]])])]),G(`div`,{ref_key:`modelListEl`,ref:f,class:`am-model-list`,role:`listbox`,"aria-label":`Models`},[F.value&&!u.value?(_(),U(`div`,za,[G(`button`,{type:`button`,class:`am-favorites-header`,onClick:a[1]||=e=>h.value=!h.value},[a[6]||=G(`span`,{class:`am-favorites-title`},`Favorites`,-1),G(`span`,Ba,g(L.value.length),1),G(`span`,{class:m([`am-favorites-toggle`,{expanded:h.value}])},` ▼ `,2)]),h.value?(_(),U(`div`,Va,[(_(!0),U(x,null,o(L.value,e=>(_(),U(`div`,{key:e.value,class:m([`am-model-item am-favorite-item`,{active:e.value===t.model,disabled:e.disabled}]),"aria-disabled":e.disabled,role:`option`,"aria-selected":e.value===t.model,onClick:t=>!e.disabled&&V(e.value)},[G(`span`,Ua,g(e.label),1),e.disabled?(_(),U(`span`,Wa,`— unavailable`)):n(``,!0),G(`div`,Ga,[e.value===t.model?(_(),U(`span`,Ka,`✓`)):n(``,!0),G(`button`,{type:`button`,class:`am-star-btn`,onClick:n=>ee(t.cli,e.value,n),title:`Remove from favorites`},[r(w(pe),{class:`size-3.5`,fill:`currentColor`})],8,qa)])],10,Ha))),128))])):n(``,!0)])):n(``,!0),P.value.length>0?(_(),U(`div`,Ja,[F.value&&!u.value?(_(),U(`div`,Ya,` All Models `)):n(``,!0),(_(!0),U(x,null,o(P.value,e=>(_(),U(`div`,{key:e.value,class:m([`am-model-item`,{active:e.value===t.model,disabled:e.disabled}]),"aria-disabled":e.disabled,role:`option`,"aria-selected":e.value===t.model,onClick:t=>!e.disabled&&V(e.value)},[G(`span`,Za,g(e.label),1),e.disabled?(_(),U(`span`,Qa,`— unavailable`)):n(``,!0),G(`div`,$a,[e.value===t.model?(_(),U(`span`,eo,`✓`)):n(``,!0),G(`button`,{type:`button`,class:m([`am-star-btn`,{active:w(v)(t.cli,e.value)}]),onClick:n=>ee(t.cli,e.value,n),title:`Add to favorites`},[r(w(pe),{class:`size-3.5`,fill:w(v)(t.cli,e.value)?`currentColor`:`none`},null,8,[`fill`])],10,to)])],10,Xa))),128))])):n(``,!0),P.value.length?n(``,!0):(_(),U(`div`,no,` No models match "`+g(u.value)+`" `,1)),!w(S)&&!u.value?(_(),U(`div`,ro,` No favorites yet — click the star icon to save your favorite agent + model combinations `)):n(``,!0)],512)]),_:1})]),_:1},8,[`open`])]))}}),ao=[`disabled`],oo={class:`am-control-label`},so=u({__name:`AgentModelControl`,props:{cliOptions:{},modelOptions:{},cli:{},model:{},memoryKey:{},disabled:{type:Boolean}},emits:[`update:cli`,`update:model`],setup(e,{emit:t}){let n=e,i=t,a=I(!1),o=C(()=>n.cli||`Agent`),s=C(()=>n.model?$t(n.model):`Model`);return(t,n)=>(_(),U(x,null,[G(`button`,{type:`button`,class:`am-control`,disabled:e.disabled,onClick:n[0]||=e=>a.value=!0},[r(w(de),{class:`size-3.5 am-control-icon`}),G(`span`,oo,g(o.value)+` + `+g(s.value),1)],8,ao),r(io,{open:a.value,"cli-options":e.cliOptions,"model-options":e.modelOptions,cli:e.cli,model:e.model,"memory-key":e.memoryKey,disabled:e.disabled,"onUpdate:open":n[1]||=e=>a.value=e,"onUpdate:cli":n[2]||=e=>i(`update:cli`,e),"onUpdate:model":n[3]||=e=>i(`update:model`,e)},null,8,[`open`,`cli-options`,`model-options`,`cli`,`model`,`memory-key`,`disabled`])],64))}}),co={draft:[`inbox`],inbox:[`draft`,`ready`],ready:[`inbox`],active:[`review`],review:[`active`],done:[]},lo={ready:[`active`],review:[`done`]};function uo(e,t){return e===t?!1:co[e]?.includes(t)?!0:lo[e]?.includes(t)??!1}var fo={"active->ready":`Stop work`,"review->ready":`Stop work`,"done->ready":`Reopen`};function po(e,t){let n=fo[`${e}->${t}`];return n?`Can't drag "${e}" straight to "${t}" — use ${n} instead.`:`A task can't move directly from "${e}" to "${t}".`}var mo=[{label:`back to the drawing board`,tone:`red`},{label:`needs some work`,tone:`amber`},{label:`good to go`,tone:`green`}];function ho(e){if(!e)return null;let t=e.toLowerCase();for(let e of mo)if(t.includes(e.label))return{label:e.label,tone:e.tone};return null}var go={class:`drawer-head`},_o={class:`drawer-tabs`},vo={class:`drawer-body`},yo={class:`field`,style:{"margin-top":`4px`}},bo={key:0,class:`shot-grid`},xo=[`src`,`alt`],So=[`aria-label`,`onClick`],Co=[`title`],wo={key:1,class:`shot-hint`},To={key:0,class:`ff-done`},Eo={class:`ff-done-head`},Do={class:`ff-done-copy`},Oo={class:`mono`},ko={class:`btn-row`,style:{"margin-top":`18px`}},Ao={key:0,class:`ff-stream`,style:{"margin-top":`16px`}},jo={class:`ff-stream-head`},Mo={class:`field`},No={class:`agent-input-wrapper`},Po={class:`ff-agent-bar`},Fo={class:`agent-pick-grid`},Io={class:`agent-field`,style:{"grid-column":`1 / -1`}},Lo={key:0,class:`ff-notice`},Ro={key:1,class:`ff-error`},zo={class:`mono`},Bo={class:`mono`},Vo={key:2,class:`ff-error`},Ho={class:`btn-row`,style:{"margin-top":`20px`}},Uo={key:3,class:`ff-stream`},Wo={class:`ff-stream-head`},Go={class:`field`},Ko={class:`field-row`},qo={class:`field`},Jo={class:`field`},Yo={class:`field-row`},Xo={class:`field`},Zo={class:`field`},Qo={class:`btn-row`,style:{"margin-top":`20px`}},$o={class:`drawer-head`},es={style:{flex:`1`}},ts={style:{display:`flex`,"align-items":`center`,gap:`8px`,"margin-bottom":`7px`}},ns={class:`tc-id mono`},rs=[`title`],is=[`title`],as={class:`drawer-quickbar`},os={class:`quickbar-row`},ss={key:0,class:`rounds-badge`,title:`Dev and review passes for this task`},cs={key:0,class:`drawer-run reviewing`,role:`status`},ls={key:1,class:`drawer-run`},us={key:2,class:`drawer-run`,role:`status`},ds={key:4,class:`quickbar-row`},fs={class:`preview-live`},ps={key:0,class:`preview-target-name`},ms=[`href`],hs={key:1,class:`preview-target-name`},gs={key:0,class:`preview-progress`,role:`status`},_s={key:0,class:`preview-progress-elapsed`},vs={key:5,class:`preview-hint`},ys={key:6,class:`preview-hint`},bs={class:`mono`},xs={key:7,class:`quickbar-row`},Ss={class:`preview-hint`},Cs=[`disabled`],ws=[`value`],Ts=[`title`],Es={key:2,class:`preview-progress`,role:`status`},Ds={key:0},Os={key:1,class:`preview-progress-elapsed`},ks={class:`drawer-tabs`},As={key:0,class:`field`},js={key:1,class:`field`},Ms={class:`ro-value`},Ns={class:`field-row`,style:{"margin-top":`16px`}},Ps={class:`field`},Fs={class:`field`},Is={class:`field-row`},Ls={class:`field`},Rs={class:`field`},zs={class:`md-h spec-head`,style:{"margin-top":`18px`}},Bs=[`aria-expanded`],Vs={key:2},Hs=[`onKeydown`],Us=[`innerHTML`],Ws={key:1,class:`md-card-body`},Gs={class:`meta-grid`},Ks={class:`meta-cell`},qs={class:`v mono`,style:{"font-size":`11px`}},Js={class:`meta-cell`},Ys={class:`v`},Xs={class:`meta-cell`},Zs={class:`v mono`,style:{"font-size":`11px`}},Qs={class:`meta-cell`},$s={class:`v mono`,style:{"font-size":`11px`}},ec={class:`meta-cell`},tc={class:`v mono`,style:{color:`var(--cyan)`,"font-size":`11px`}},nc={class:`meta-cell`},rc={class:`v mono`,style:{"font-size":`11px`}},ic={class:`delete-zone`},ac={class:`delete-prompt`},oc={class:`delete-actions`},sc={key:0,class:`agent-override-bar`},cc={class:`agent-pick-grid`},lc={class:`agent-field`,style:{"grid-column":`1 / -1`}},uc={class:`agent-field`},dc={key:0,class:`agent-override-actions`,style:{"padding-top":`20px`}},fc={key:1,class:`agent-stalled`},pc={key:2,class:`agent-waiting`},mc={class:`agent-waiting-sub`},hc={class:`agent-log-wrap`},gc={key:0,class:`agent-empty`},_c={class:`agent-d`},vc={key:1,class:`agent-line sys`},yc={class:`agent-d`},bc={key:2,class:`agent-human`},xc={class:`agent-human-bubble`},Sc={key:3,class:`agent-text`},Cc={key:0,class:`agent-step-time`},wc={key:1,class:`agent-step-reason`},Tc={class:`agent-tool-icon`},Ec={class:`agent-tool-name`},Dc=[`title`],Oc={class:`agent-tool-out`},kc={class:`agent-input-row`},Ac={class:`agent-reply-input-wrapper`},jc=[`disabled`,`onKeydown`],Mc={key:3,class:`agent-hint`},Nc={key:4,class:`agent-hint`},Pc={key:2,class:`drawer-body drawer-session-body`},Fc={key:0,class:`agent-override-bar`},Ic={class:`agent-pick-grid`},Lc={class:`agent-field`,style:{"grid-column":`1 / -1`}},Rc={class:`agent-field`},zc={key:0,class:`agent-override-actions`,style:{"padding-top":`20px`}},Bc={class:`review-toolbar`},Vc={key:0,class:`review-pane-tabs`,role:`tablist`,"aria-label":`Reviewer content`},Hc=[`aria-selected`],Uc=[`aria-selected`],Wc={key:1,class:`review-pane review-report-pane`,role:`tabpanel`},Gc={key:0,class:`review-stale`,role:`status`},Kc={key:1,class:`review-failed`},qc={class:`verdict-label`},Jc={class:`review-meta`},Yc={class:`mono`},Xc={class:`md-card review-card`},Zc=[`innerHTML`],Qc={key:2,class:`review-pane review-chat-pane`,role:`tabpanel`},$c={key:0,class:`review-running`,role:`status`},el={key:1,class:`review-hint`},tl={key:2,class:`review-hint`},nl={class:`review-log-wrap`},rl={key:0,class:`review-thinking`,role:`status`},il={key:1,class:`agent-empty`},al={class:`agent-d`},ol={key:1,class:`agent-line sys`},sl={class:`agent-d`},cl={key:2,class:`agent-human`},ll={class:`agent-human-bubble`},ul={key:3,class:`agent-text`},dl={key:0,class:`agent-step-reason`},fl={class:`agent-tool-icon`},pl={class:`agent-tool-name`},ml=[`title`],hl={class:`agent-tool-out`},gl={class:`agent-input-row`},_l={class:`agent-reply-input-wrapper`},vl=[`disabled`,`onKeydown`],yl={key:3,class:`agent-hint`},bl={key:3,class:`drawer-body`},xl={key:0,class:`changes-empty`},Sl={key:1,class:`changes-empty`},Cl={key:2,class:`changes-empty`},wl={key:3,class:`changes-empty`},Tl={class:`changes-summary`,"aria-label":`Code changes summary`},El={key:0,class:`diff-stats`},Dl={class:`diff-stat-item`},Ol={class:`stat-value`},kl={class:`diff-stat-item`},Al={class:`stat-value`,style:{color:`#4ef0a8`}},jl={class:`diff-stat-item`},Ml={class:`stat-value`,style:{color:`#ff6b6b`}},Nl={key:1,class:`diff-stats-loading`},Pl={key:2,class:`diff-stat-warning`},Fl={key:0,class:`diff-loading-note`},Il={key:0,class:`diff-file-list`},Ll=[`onClick`],Rl=[`title`],zl={class:`diff-file-delta`},Bl={key:0,class:`diff-file-add`},Vl={key:1,class:`diff-file-rem`},Hl={key:1,class:`diff-truncated`},Ul={class:`diff-sections`},Wl=[`id`],Gl=[`onClick`,`onKeydown`],Kl={class:`diff-section-name`},ql={class:`diff-file-delta`},Jl={key:0,class:`diff-file-add`},Yl={key:1,class:`diff-file-rem`},Xl={key:0,class:`diff-section-content`},Zl={key:4,class:`drawer-body`},Ql={key:0,class:`agent-stats`},$l={class:`agent-stat`},eu={class:`agent-stat-value`},tu={class:`agent-stat`},nu={class:`agent-stat-value`},ru={class:`agent-stat`},iu={class:`agent-stat-value`},au={key:1,class:`task-sections`},ou={class:`task-section`},su={class:`task-usage-grid`},cu={class:`agent-stat`},lu={class:`agent-stat-value`},uu={class:`agent-stat`},du={class:`agent-stat-value`},fu={class:`agent-stat`,title:`Input tokens served from the provider's prompt cache ÷ all input tokens, summed across this task's sessions. '—' when no CLI reported cache figures.`},pu={class:`agent-stat-value`},mu={class:`agent-stat`},hu={class:`agent-stat-value`},gu={class:`agent-stat`,title:`Total model round-trips across this task's sessions (one turn may run several tool calls). '—' when no CLI reported it.`},_u={class:`agent-stat-value`},vu={class:`agent-stat`},yu={class:`agent-stat-value`},bu={key:0,class:`task-section`,"aria-labelledby":`task-section-role`},xu={class:`task-usage-table-wrap`},Su={class:`task-usage-table`},Cu={class:`task-usage-role-name ta-left`},wu={class:`ta-right`},Tu={class:`ta-right`},Eu={class:`ta-right`},Du={key:1,class:`task-section`,"aria-labelledby":`task-section-sessions`},Ou={class:`task-usage-table-wrap`},ku={class:`task-usage-table`},Au={class:`task-usage-session-head`},ju=[`title`],Mu=[`title`],Nu={class:`task-usage-session-type ta-left`},Pu=[`title`],Fu={key:0,class:`task-usage-session-model`},Iu={class:`ta-left`},Lu={class:`ta-left`},Ru={class:`ta-right`},zu={class:`ta-right`},Bu=[`title`],Vu={class:`ta-right`},Hu={class:`ta-right`},Uu={key:2,class:`agent-empty`},Wu={key:5,class:`drawer-body`},Gu={key:6,class:`drawer-body drawer-session-body`},Ku={key:0,class:`agent-override-bar`},qu={class:`agent-pick-grid`},Ju={class:`agent-field`,style:{"grid-column":`1 / -1`}},Yu={class:`agent-field`},Xu={key:0,class:`agent-override-actions`,style:{"padding-top":`20px`}},Zu={key:0,class:`agent-empty pm-empty`},Qu={key:0,class:`pm-mini-avatar`},$u=[`innerHTML`],ed={key:1},td={key:2,class:`msg-time`},nd={key:0,class:`pm-thinking`,"aria-label":`PM is thinking`},rd={key:1,class:`pm-canned`,role:`list`,"aria-label":`Suggested prompts`},id=[`onClick`,`onKeydown`],ad={key:2,class:`pm-shots`,"aria-label":`Attached screenshots`},od=[`src`,`alt`],sd=[`aria-label`,`onClick`],cd=[`disabled`],ld=[`disabled`,`placeholder`],ud=[`disabled`],dd={key:7,class:`save-bar`},fd={class:`save-actions`},pd=qn(u({__name:`TaskDrawer`,setup(t){let a=Yt(),c=it(),l=rn(),u=an(),d=A(),f=I(null),h=C(()=>[{id:`draft`,label:`Draft`,color:jt(`draft`)},...Ft]),y=C(()=>{let e=c.active?.status,t=e?co[e]??[]:[];return h.value.filter(n=>n.id===e||t.includes(n.id))}),b=C(()=>c.active!==null||c.isNew);function S(e){e||c.close()}function T(e){c.isNew&&(e.preventDefault(),requestAnimationFrame(()=>{let e=F.value===`freeform`?`nt-freeform`:`nt-title`;document.getElementById(e)?.focus()}))}let M=[`feature`,`bug`,`chore`,`spec`,`refactor`],P=[`p0`,`p1`,`p2`,`p3`],F=I(`freeform`),R=I(``),B=I(``),V=I(null),ee=C(()=>!l.loaded||(l.agents??[]).some(e=>e.name===`pm`&&e.enabled)),H=I(!1),J=I(null),Y=I(!1),Z=I(null),te=I(null),re=I(null),ie=I(null);function ce(e){te.value&&ci(te.value,e)}function de(e){re.value&&ci(re.value,e)}function pe(){Oi(re.value)}function me(e){ie.value&&ci(ie.value,e)}function he(){Oi(ie.value)}e(()=>c.isNew,e=>{e&&(F.value=l.form.defaultTaskMode===`manual`?`manual`:`freeform`,B.value=``,V.value=null,Y.value=!1,Z.value=null,zi())});async function _e(){let e=R.value.trim();if(e){c.saving=!0,H.value=!0,B.value=``,V.value=null,J.value&&a.clearOutput(J.value),J.value=crypto.randomUUID();try{let t=Bi.value?{agent:Ri.agent,cli:Ri.cli,model:Ri.model}:void 0,n=await a.createFreeformTask(e,J.value,t);if(n.fallback&&n.fallbackReason===`agent-failed`){V.value=n.task,B.value=n.reason??`The PM agent failed`,await Ee(n.task.id),J.value&&a.clearOutput(J.value),J.value=null;return}await Ee(n.task.id),Z.value=n.task,Y.value=!0,R.value=``}catch(e){B.value=e instanceof Error?e.message:String(e)}finally{H.value=!1,c.saving=!1}}}function ve(){Y.value=!1,Z.value=null,B.value=``,J.value&&a.clearOutput(J.value),J.value=null,c.clearScreenshots(),requestAnimationFrame(()=>{document.getElementById(`nt-freeform`)?.focus()})}function ye(){Y.value=!1,Z.value=null,J.value&&a.clearOutput(J.value),J.value=null,c.close()}e(()=>a.pmWorkingFor(Z.value?.id??``),(e,t)=>{if(!t||e||!Y.value||!Z.value||!c.isNew)return;let n=Z.value;Y.value=!1,Z.value=null,J.value&&a.clearOutput(J.value),J.value=null,c.openTask(n),d.push(`/work`)});function be(){V.value&&=(c.close(),c.openTask(V.value),d.push(`/work`),null)}function xe(e){let t=e.split(`
|
|
11
|
+
`).map(e=>e.trim()).find(e=>!!e&&e!==`---`)??``;if(t.length>0)return t.length<=60?t:`${t.slice(0,57).trimEnd()}…`;let n=e.replace(/\s+/g,` `).replace(/\s*---\s*/g,` `).trim();return n.length<=60?n||`Untitled task`:`${n.slice(0,57).trimEnd()}…`}async function we(){let e=R.value.trim();if(e){c.saving=!0,B.value=``,V.value=null;try{await a.createTask({...c.nt,title:xe(e),body:e,status:`draft`}),c.close(),R.value=``,d.push(`/work`)}catch(e){a.onError(e)}finally{c.saving=!1}}}async function Te(){if(c.nt.title){c.saving=!0;try{await Ee((await a.createTask({...c.nt})).id),c.close(),c.nt.title=``,c.nt.area=`web`,c.nt.priority=`p2`,c.nt.type=`feature`,c.nt.assignedTo=``,d.push(`/work`)}catch(e){a.onError(e)}finally{c.saving=!1}}}async function Ee(e){for(let t of[...c.pendingScreenshots])await a.uploadScreenshot(e,t);c.clearScreenshots()}let Oe=I(null),ke=I(0);function Me(e){let t=e.target;t.files&&c.addScreenshots(Array.from(t.files)),t.value=``}function Ne(){ke.value++}function Pe(){ke.value=Math.max(0,ke.value-1)}function Fe(e){ke.value=0;let t=e.dataTransfer?.files;t&&t.length&&c.addScreenshots(Array.from(t))}async function Ie(e){if(!(!c.active||c.active.status===e)){c.saving=!0;try{await a.setStatus(c.active,e)}catch(e){a.onError(e)}finally{c.saving=!1}}}async function ze(){if(c.active){if(c.active.git?.dirty){f.value=c.active;return}await He(c.active)}}let Ve=I(!1);async function He(e){c.saving=!0,Ve.value=!0;try{await a.startWork(e),c.activeTab=`agent`}catch(e){a.onError(e)}finally{Ve.value=!1,c.saving=!1}}async function Ue(){if(c.active){c.saving=!0;try{await a.pauseWork(c.active)}catch(e){a.onError(e)}finally{c.saving=!1}}}async function We(){c.active&&(tt.value=c.active,et.value=!0)}async function Ke(){let e=tt.value;if(!e){a.onError(Error(`No task selected to stop.`));return}c.saving=!0;try{await a.abandonWork(e),et.value=!1,c.close(),tt.value=null}catch(e){a.onError(e)}finally{c.saving=!1}}function Je(){et.value=!1,tt.value=null}function Ye(){c.activeTab=`debug`,c.debugView=`debugger`}async function Ze(){if(c.active&&confirm(`Reopen this done task? It goes back to ready with a fresh branch on the next Start work.`)){c.saving=!0;try{await a.reopenTask(c.active)}catch(e){a.onError(e)}finally{c.saving=!1}}}let Qe=I(!1),$e=I(!1),et=I(!1),tt=I(null),nt=I(null);function rt(){nt.value=c.active,$e.value=!0}async function at(){if(c.active){c.saving=!0;try{await a.deleteTask(c.active.id),c.close()}catch(e){a.onError(e),Qe.value=!1}finally{c.saving=!1}}}async function ot(e){let t=nt.value??c.active;if(t){c.saving=!0;try{await a.activateHotfix(t,e),await a.startWork(t),$e.value=!1,c.open(a.tasks.find(e=>e.id===t.id)??t),c.activeTab=`agent`}catch(e){a.onError(e)}finally{c.saving=!1}}}let st=C(()=>{let e=a.integration;return!c.active||!e?!1:e.active?.taskId===c.active.id||e.queue.includes(c.active.id)}),ct=C(()=>{let e=a.integration?.active;return e&&e.taskId===c.active?.id?e.stage:null}),lt=I(!1),ut=I(0),dt;function ft(){ut.value=0,window.clearInterval(dt),dt=window.setInterval(()=>{ut.value+=1},1e3)}function pt(){window.clearInterval(dt),dt=void 0}let mt=C(()=>{switch(c.active?a.doneSteps[c.active.id]:void 0){case`merge`:return`Merging branch…`;case`build`:return`Building…`;case`check`:return`Running repoos check…`;case`done`:return`Closing out…`;default:return`Merging branch…`}}),ht=C(()=>{let e=mt.value;return lt.value&&ut.value>0?`${e} ${ut.value}s`:e});async function gt(){if(!(!c.active||Q.value?.running||st.value)){c.saving=!0,lt.value=!0,ft();try{await a.completeTask(c.active),c.close(),c.expandIntegrationBar()}catch(e){if(e instanceof Error&&e.name===`DirtyMainError`){_t.value=c.active;return}a.onError(e)}finally{lt.value=!1,pt(),c.saving=!1}}}let _t=I(null),vt=C(()=>_t.value?a.dirtyMainFor(_t.value.id):[]);async function yt(){let e=_t.value;if(vt.value,_t.value=null,e){c.saving=!0,lt.value=!0,ft();try{await a.completeTask(e,{commitDirty:!0}),c.close(),c.expandIntegrationBar()}catch(t){if(t instanceof Error&&t.name===`DirtyMainError`){_t.value=e;return}a.onError(t)}finally{lt.value=!1,pt(),c.saving=!1}}}function bt(){let e=_t.value?.id??c.active?.id;e&&a.clearDirtyMain(e),_t.value=null}let xt=[`title`,`type`,`priority`,`area`,`assignedTo`,`body`];function St(){return{title:``,type:`feature`,priority:`p2`,area:``,assignedTo:``,body:``}}let Ct=D(St()),wt=D(St());function Tt(){for(let e of xt)wt[e]=Ct[e]}function Et(e){Ct.title=e.title,Ct.type=e.type,Ct.priority=e.priority,Ct.area=e.area,Ct.assignedTo=e.assignedTo,Ct.body=e.body,Tt()}function Dt(){return xt.filter(e=>Ct[e]!==wt[e])}let Ot=C(()=>Dt().length>0),kt=C(()=>!!(c.active&&a.transitionState?.id===c.active.id)),At=C(()=>{let e=c.active?.status;return e===`active`||e===`review`||e===`done`}),Mt=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,40),Pt=C(()=>`feat/${Mt(Ct.title)}`);C(()=>c.active?.branch||Pt.value);let It=I(!0),Lt=I(!1),Rt=C(()=>Mr(Ct.body));function zt(){Lt.value=!0}function Bt(){window.getSelection()?.toString()||zt()}function Vt(e){Ct.body=e,Lt.value=!1}let Ht=``;e(()=>c.active,e=>{if(!e){Ht=``;return}if(e.id!==Ht){Et(e),Ht=e.id,Lt.value=!1;return}Ot.value||Et(e)});async function Ut(){if(!c.active||!Ot.value)return;let e={};for(let t of Dt())e[t]=Ct[t];if(!At.value){let t=`feat/${Mt(wt.title)}`,n=c.active.branch===``||c.active.branch===t;e.title!==void 0&&n&&Pt.value!==c.active.branch&&(e.branch=Pt.value)}c.saving=!0;try{await a.patchTask(c.active.id,e),Tt()}catch(e){a.onError(e)}finally{c.saving=!1}}function Wt(){c.active&&Et(c.active)}let Gt=I(!1),Kt=I(null),qt=C(()=>Gt.value&&Kt.value===c.active?.id),Jt=I(null),Xt=C(()=>c.active?.previewTargets??[]),Zt=C(()=>Xt.value.length>1),Qt=I(null),$t=C(()=>Qt.value??(Xt.value.length===1?Xt.value[0]?.name??null:null)),en=I(null);e(()=>c.active?.id,()=>{Qt.value=null});let tn=I(null),nn=I(Date.now()),on;function sn(){on===void 0&&(nn.value=Date.now(),on=window.setInterval(()=>{nn.value=Date.now()},1e3))}function cn(){window.clearInterval(on),on=void 0}v(cn);let ln=C(()=>tn.value===null?0:Math.max(0,nn.value-tn.value));async function un(e){if(!c.active||Gt.value||e===`start`&&Zt.value&&!$t.value)return;let t=c.active;Gt.value=!0,Kt.value=t.id,Jt.value=e,en.value=e===`start`?$t.value:null,tn.value=Date.now(),sn();try{e===`start`?await a.startPreview(t,$t.value??void 0):await a.stopPreview(t)}catch(e){a.onError(e)}finally{Gt.value=!1,Kt.value=null,Jt.value=null,en.value=null,tn.value=null,cn()}}function dn(){return un(`stop`)}function fn(){return un(`start`)}let Q=C(()=>c.active?a.reviews[c.active.id]??null:null),pn=C(()=>!c.active||c.active.status!==`review`?null:Q.value?.running?{label:`reviewing`,cls:`rs-reviewing`}:a.isRunning(c.active.id)?c.active.checkRetryCount?{label:`fixing check failure`,cls:`rs-coding`}:{label:`coding`,cls:`rs-coding`}:{label:`waiting for human`,cls:`rs-human`}),mn=C(()=>{let e=c.active;if(!e||!e.branch&&(e.status===`draft`||e.status===`inbox`))return{dev:0,review:0};let t=e.extra?.review_passes;(typeof t!=`number`||!Number.isFinite(t))&&(t=e.extra?.review_rounds);let n=typeof t==`number`&&Number.isFinite(t)?Math.max(0,Math.floor(t)):0,r=e.extra?.dev_error_count,i=typeof r==`number`&&Number.isFinite(r)?Math.max(0,Math.floor(r)):0,o=!e.needsInput&&(e.status===`ready`||e.status===`active`||e.status===`review`&&a.isRunning(e.id));return{dev:n+i+ +!!o,review:n}}),hn=C(()=>Q.value?.report?Mr(Q.value.report.markdown):``),gn=C(()=>!!(Q.value?.running&&Q.value.report)),_n=C(()=>ho(Q.value?.report?.markdown)),vn=I(!1),yn=I(``),bn=I(`chat`),xn=C(()=>{let e=Q.value?.lines??[],t=[];for(let n of e)if(`type`in n)if(n.type===`text`){let e=Dr(n.text),r=t[t.length-1];if(r&&r.kind===`text`&&e){r.text=`${r.text}\n\n${e}`;continue}t.push({key:t.length,kind:`text`,text:e})}else if(n.type===`human`)t.push({key:t.length,kind:`human`,text:n.text});else if(n.type===`tool`)t.push({key:t.length,kind:`tool`,toolName:n.tool,toolState:n.state,toolInput:n.input?Dr(n.input):void 0,toolOutput:n.output?Dr(n.output):void 0});else if(n.type===`step`){if(n.kind===`start`)continue;t.push({key:t.length,kind:`step`,stepKind:n.kind,stepReason:n.reason,stepAt:n.at})}else t.push({key:t.length,kind:`sys`,d:Dr(n.d)});else t.push({key:t.length,kind:`line`,s:n.s,d:Dr(n.d)});return t}),Sn=I(!0),Cn=I(null);e(xn,()=>{Sn.value&&s(()=>{let e=Cn.value;e&&(e.scrollTop=e.scrollHeight)})});function wn(e){let t=e.target;Sn.value=t.scrollHeight-t.scrollTop-t.clientHeight<40}function Tn(e=!1){let t=Cn.value;t&&(Sn.value=!0,t.scrollTo({top:t.scrollHeight,behavior:e?`smooth`:`auto`}))}e(()=>[c.active?.id,c.activeTab],()=>{!c.active||c.activeTab!==`review`||(Sn.value=!0,a.loadReview(c.active.id).then(()=>s(()=>Tn())))});async function En(){if(!c.active)return;let e=yn.value.trim();if(!e||Q.value?.running||vn.value)return;let t=Q.value?.lines??[];a.reviews[c.active.id]={...Q.value??{running:!1,enabled:!0,report:null,lines:[]},lines:[...t,{type:`human`,text:e}]},yn.value=``,Sn.value=!0,s(()=>Tn()),vn.value=!0;try{await a.sendReviewMessage(c.active.id,e)}catch(e){a.onError(e)}finally{vn.value=!1}}async function Dn(){if(!(!c.active||Q.value?.running||vn.value)){vn.value=!0;try{await a.reviewAgain(c.active.id)}catch(e){a.onError(e)}finally{vn.value=!1}}}let On=I(!1),kn=I(!1),An=I(null),jn=I(null);async function Mn(){let e=c.active,t=Q.value?.report??null;!e||!t||Q.value?.running||vn.value||On.value||(An.value=e,jn.value=t,kn.value=!0)}async function Nn(e){let t=An.value,n=jn.value;if(!t||!n){a.onError(Error(n?`No task selected to send to engineer.`:`Reviewer report is not ready yet. Wait for the review to finish, then try again.`));return}kn.value=!1;let r=[`This task was returned from review for fixes. Resume work in the existing worktree; do not reset or discard the current changes.`,`Read the reviewer report below, fix every concrete applicable finding, add or update regression coverage where appropriate, then run repoos check before returning the task to review.`];e&&r.push(`Instructions from the reviewer/human:\n${e}`),r.push(`Reviewer report:`,n.markdown);let i=r.join(`
|
|
12
|
+
|
|
13
|
+
`);c.saving=!0,On.value=!0;try{await a.setStatus(t,`active`,e),await a.startWork(t,`resume`,i),c.open(a.tasks.find(e=>e.id===t.id)??t),c.activeTab=`agent`}catch(e){a.onError(e)}finally{On.value=!1,c.saving=!1}}e(()=>[c.active?.id,c.active?.status],()=>{c.active&&(bn.value=`report`,a.loadReview(c.active.id))},{immediate:!0});function Pn(e){return u.email?`pm-task-v2:${e}::${u.email}`:`pm-task-v2:${e}`}let Fn=I(``),In=I(null),Ln=I(!1),Rn=I(null),zn=I(null);function Bn(e){let t=e.target;t.files&&c.addPmScreenshots(Array.from(t.files)),t.value=``}let Vn=C(()=>!l.loaded||(l.agents??[]).some(e=>e.name===`pm`&&e.enabled)),Hn=C(()=>c.active?a.outputs[Pn(c.active.id)]??[]:[]),Un=C(()=>Ln.value||c.active&&a.runningIds.includes(Pn(c.active.id))),Wn=C(()=>Hn.value.length>0),Gn=C(()=>{let e=c.active;return e?Nt(e.status):[]}),Kn=C(()=>Gn.value.length>0);function qn(e){Fn.value=e,Zn()}function Jn(e){return`type`in e?e.type===`human`?`human`:e.type===`text`?`assistant`:e.type===`step`?`hidden`:`status`:e.s===`out`?`assistant`:`status`}function Yn(e){if(`type`in e){if(e.type===`human`||e.type===`text`)return e.text;if(e.type===`sys`)return e.d;if(e.type===`tool`){let t=e.state?` · ${e.state}`:``;return`Checked with ${e.tool}${t}`}return``}return e.d}function Xn(){s(()=>{Rn.value&&(Rn.value.scrollTop=Rn.value.scrollHeight)})}e(()=>Hn.value.length,()=>{Xn()});async function Zn(){let e=Fn.value.trim();if(!e||Un.value||!Vn.value||!c.active)return;Ln.value=!0;let t={type:`human`,text:e,at:new Date().toISOString()},n=Pn(c.active.id),r=(a.outputs[n]??[]).length;a.outputs[n]=[...a.outputs[n]??[],t],Fn.value=``;let i=c.pmScreenshots.map(e=>({name:e.name,mime:e.mime,data:e.dataUrl.split(`,`)[1]??``}));Xn();try{await K(`/api/tasks/${c.active.id}/pm/message`,q(`POST`,{text:e,agentOverride:$.agent||void 0,cliOverride:$.cli||void 0,modelOverride:$.model||void 0,images:i.length?i:void 0})),c.clearPmScreenshots()}catch(t){a.outputs[n]=(a.outputs[n]??[]).filter((e,t)=>t!==r),Fn.value=e,a.outputs[n]=[...a.outputs[n]??[],{type:`sys`,d:t instanceof Error?t.message:String(t)}],a.onError(t)}finally{Ln.value=!1}}function Qn(e){e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),Zn())}function $n(){Oi(In.value)}async function nr(){if(c.active)try{await K(`/api/tasks/${c.active.id}/pm/interrupt`,{method:`POST`})}catch(e){a.onError(e)}}e(()=>c.active?.id,()=>{c.active&&Xn()});let lr=C(()=>(l.agents?.length?l.agents:[]).find(e=>e.enabled&&e.name===`pm`)??null),$=D({agent:``,cli:``,model:``}),ur=D({agent:``,cli:``,model:``}),dr=!1;function fr(e){let t=lr.value;dr=!0,$.agent=e?.pmAgentOverride||t?.name||``,$.cli=e?.pmCliOverride||t?.cli||``,$.model=e?.pmModelOverride||t?.model||``,ur.agent=$.agent,ur.cli=$.cli,ur.model=$.model,s(()=>{dr=!1})}let pr=C(()=>$.agent!==ur.agent||$.cli!==ur.cli||$.model!==ur.model),mr=C(()=>l.modelsFor($.cli,$.model||void 0));e(()=>[c.active,c.activeTab],()=>{c.activeTab===`pm`&&(pr.value||fr(c.active))});let hr;function gr(){let e=c.active?.id;e&&(hr!==void 0&&window.clearTimeout(hr),hr=window.setTimeout(async()=>{if(hr=void 0,c.active?.id!==e||!pr.value)return;let t=lr.value,n={agent:$.agent,cli:$.cli,model:$.model},r=n.agent===(t?.name??``)?null:n.agent,i=n.cli===(t?.cli??``)?null:n.cli,o=n.model===(t?.model??``)?null:n.model;try{await a.patchTask(e,{pmAgentOverride:r,pmCliOverride:i,pmModelOverride:o}),ur.agent=n.agent,ur.cli=n.cli,ur.model=n.model}catch(e){a.onError(e)}},500))}e(()=>$.cli,(e,t)=>{if(dr||!e||e===t)return;let n=l.modelsFor(e);$.model=n.length>0?n[0].value:`default`}),e(()=>[$.agent,$.cli,$.model],()=>{gr()});let _r=C(()=>(l.agents?.length?l.agents:[]).find(e=>e.enabled&&e.name.toLowerCase()===`reviewer`)??null),vr=D({agent:``,cli:``,model:``}),yr=D({agent:``,cli:``,model:``}),br=!1;function xr(e){let t=_r.value;br=!0,vr.agent=e?.reviewAgentOverride||t?.name||``,vr.cli=e?.reviewCliOverride||t?.cli||``,vr.model=e?.reviewModelOverride||t?.model||``,yr.agent=vr.agent,yr.cli=vr.cli,yr.model=vr.model,s(()=>{br=!1})}let Sr=C(()=>vr.agent!==yr.agent||vr.cli!==yr.cli||vr.model!==yr.model),Cr=C(()=>l.modelsFor(vr.cli,vr.model||void 0));e(()=>[c.active,c.activeTab],()=>{c.activeTab===`review`&&(Sr.value||xr(c.active))});let wr;function Tr(){let e=c.active?.id;e&&(wr!==void 0&&window.clearTimeout(wr),wr=window.setTimeout(async()=>{if(wr=void 0,c.active?.id!==e||!Sr.value)return;let t=_r.value,n={agent:vr.agent,cli:vr.cli,model:vr.model},r=n.agent===(t?.name??``)?null:n.agent,i=n.cli===(t?.cli??``)?null:n.cli,o=n.model===(t?.model??``)?null:n.model;try{await a.patchTask(e,{reviewAgentOverride:r,reviewCliOverride:i,reviewModelOverride:o}),yr.agent=n.agent,yr.cli=n.cli,yr.model=n.model}catch(e){a.onError(e)}},500))}e(()=>vr.cli,(e,t)=>{if(br||!e||e===t)return;let n=l.modelsFor(e);vr.model=n.length>0?n[0].value:`default`}),e(()=>[vr.agent,vr.cli,vr.model],()=>{Tr()});let Er=/[\u001B\u009B][[\]()#;?]*(?:(?:(?:[a-zA-Z\d]*(?:;[-a-zA-Z\d/#&.:=?%@~_]*)*)?\u0007)|(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]))/g,Dr=e=>e.replace(Er,``),Or=C(()=>(J.value?a.outputs[J.value]??[]:[]).map(e=>`type`in e?{s:`out`,d:Dr(e.type===`text`?e.text:e.d??``)}:{s:e.s===`err`?`err`:`out`,d:Dr(e.d)})),kr=I(null);e(Or,()=>{s(()=>{let e=kr.value;e&&(e.scrollTop=e.scrollHeight)})});let Ar=C(()=>{let e=c.active?a.outputs[c.active.id]??[]:[],t=[];for(let n of e)if(`type`in n)if(n.type===`text`){let e=Dr(n.text),r=t[t.length-1];if(r&&r.kind===`text`&&e){r.text=`${r.text}\n\n${e}`;continue}t.push({key:t.length,kind:`text`,text:e})}else if(n.type===`human`)t.push({key:t.length,kind:`human`,text:n.text});else if(n.type===`tool`)t.push({key:t.length,kind:`tool`,toolName:n.tool,toolState:n.state,toolInput:n.input?Dr(n.input):void 0,toolOutput:n.output?Dr(n.output):void 0});else if(n.type===`step`){if(n.kind===`start`)continue;t.push({key:t.length,kind:`step`,stepKind:n.kind,stepReason:n.reason,stepAt:n.at})}else t.push({key:t.length,kind:`sys`,d:Dr(n.d)});else t.push({key:t.length,kind:`line`,s:n.s,d:Dr(n.d)});return t}),jr=I(``),Pr=I(!0),Ir=I(null),Rr=C(()=>!!c.active&&(c.active.status===`active`||c.active.status===`review`)&&a.isRunning(c.active.id)),zr=C(()=>c.active?a.agentStats[c.active.id]:void 0),Br=C(()=>Ar.value.length>0),Hr=I(Date.now()),Ur;function Wr(){Ur===void 0&&(Hr.value=Date.now(),Ur=window.setInterval(()=>{Hr.value=Date.now()},1e3))}function Gr(){window.clearInterval(Ur),Ur=void 0}e(()=>zr.value?.turnStartedAt,e=>{e?Wr():Gr()},{immediate:!0}),v(Gr);let Kr=C(()=>{let e=zr.value;if(!e)return 0;let t=e.turnStartedAt?Math.max(0,Hr.value-Date.parse(e.turnStartedAt)):0;return e.accumulatedMs+t});function Jr(e){let t=Math.max(0,Math.floor(e/1e3)),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=String(i).padStart(2,`0`);return n>0?`${n}:${String(r).padStart(2,`0`)}:${a}`:`${r}:${a}`}function Yr(e,t){if(e==null||!Number.isFinite(e))return`—`;let n=e<1?e.toFixed(3):e.toFixed(2);return t===`kiro-credits`?`${n} credits`:t===`estimate`?`~$${n} est`:t===`mixed`?`$${n}*`:`$${n}`}function Xr(e,t,n){if(t==null&&n==null)return`—`;let r=t??0,i=(e??0)+r+(n??0);return i<=0?`—`:`${Math.round(r/i*100)}%`}function Zr(e){if(e.cacheReadTokens==null&&e.cacheCreationTokens==null)return`no prompt-cache figures reported by this CLI`;let t=[`${Nr(e.cacheReadTokens)} read from cache`];return e.cacheCreationTokens&&t.push(`${Nr(e.cacheCreationTokens)} written`),`${t.join(` · `)} — cumulative over the turn's model calls`}function $r(e,t=!1){if(!e)return`—`;let n=new Date(e);if(Number.isNaN(n.getTime()))return`—`;let r=t?{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}:{hour:`numeric`,minute:`2-digit`};return n.toLocaleString(void 0,r)}let ei={"review-failed":`The reviewer crashed or timed out without producing a report.`,"dev-error":`The agent exited with an error.`,"watchdog-stuck":`The task went quiet with no agent running.`,"cto-escalation":`The CTO agent flagged this for a human decision.`};function ti(e){return e&&ei[e]||`The agent needs your input — reply below to continue.`}e(Ar,()=>{Pr.value&&s(()=>{let e=Ir.value;e&&(e.scrollTop=e.scrollHeight)})});function ri(e){let t=e.target;Pr.value=t.scrollHeight-t.scrollTop-t.clientHeight<40}function ii(e=!1){let t=Ir.value;t&&(Pr.value=!0,t.scrollTo({top:t.scrollHeight,behavior:e?`smooth`:`auto`}))}e(()=>[c.active?.id,c.activeTab],()=>{!c.active||c.activeTab!==`agent`||(Pr.value=!0,a.loadOutput(c.active.id).then(()=>s(()=>ii())))}),e(()=>[c.active?.id,c.activeTab],()=>{!c.active||c.activeTab!==`pm`||a.loadOutput(Pn(c.active.id)).then(()=>s(()=>Xn()))});let ai=C(()=>c.active?a.diffStatsFor(c.active.id):void 0),oi=C(()=>{let e=ai.value;return e?e.filesChanged>50||e.additions+e.deletions>2e3:!1}),li=I(!1);async function ui(){if(!(!c.active||li.value)){li.value=!0;try{await a.syncTaskBranch(c.active.id)}catch(e){a.onError(e)}finally{li.value=!1}}}e(()=>[c.active?.id,c.active?.status,c.active?.branch],()=>{c.active&&a.loadDiffStats(c.active.id)},{immediate:!0});let di=C(()=>c.active?a.taskUsageFor(c.active.id):void 0),fi=I(!1);function pi(){fi.value=!fi.value}let mi=I(!1);function gi(){mi.value=!mi.value}e(()=>c.active?.id,()=>{c.active&&a.loadTaskUsage(c.active.id)},{immediate:!0});let _i=C(()=>c.active?a.diffFor(c.active.id):void 0);e(()=>[c.active?.id,c.activeTab],()=>{!c.active||c.activeTab!==`changes`||a.loadDiff(c.active.id)});let vi=C(()=>{if(!_i.value||!_i.value.patch)return[];let e=_i.value.patch.split(/^diff --git /m),t=[];for(let n of e){if(!n.trim())continue;let e=n.split(`
|
|
14
|
+
`),r=[`diff --git `+e[0],...e.slice(1)],i=r.find(e=>e.startsWith(`+++ `)),a=r.find(e=>e.startsWith(`--- `)),o=r.some(e=>e.startsWith(`--- /dev/null`)),s=r.some(e=>e.startsWith(`+++ /dev/null`)),c=i?i.slice(6):``,l=a?a.slice(6):``,u=s?l:c;if(!u||u===`/dev/null`)continue;let d=0,f=0;for(let e of r)e.startsWith(`+`)&&!e.startsWith(`+++ `)?d++:e.startsWith(`-`)&&!e.startsWith(`--- `)&&f++;t.push({filename:u,lines:r,added:d,removed:f,type:o?`added`:s?`deleted`:`modified`})}return t}),yi=D(new Set);function bi(e){yi.has(e)?yi.delete(e):yi.add(e)}function xi(e){let t=document.getElementById(e);t&&t.scrollIntoView({behavior:`smooth`,block:`start`})}e(()=>_i.value,()=>{yi.clear()});function Si(e){return e.startsWith(`@@`)?`diff-hunk`:e.startsWith(`+`)?`diff-add`:e.startsWith(`-`)?`diff-rem`:e.startsWith(`diff `)||e.startsWith(`index `)||e.startsWith(`--- `)||e.startsWith(`+++ `)?`diff-header`:`diff-ctx`}async function Ci(){if(!c.active)return;let e=jr.value.trim();if(!e||Rr.value)return;let t=a.outputs[c.active.id]??[];a.outputs[c.active.id]=[...t,{type:`human`,text:e}],jr.value=``,Pr.value=!0,s(()=>ii()),c.saving=!0;try{await a.sendMessage(c.active.id,e)}catch(e){a.onError(e)}finally{c.saving=!1}}C(()=>(l.agents??[]).filter(e=>e.enabled));let wi=C(()=>l.agentsMeta.clis??[]),Ei=C(()=>l.modelsFor(Ai.cli,Ai.model||void 0)),Di=C(()=>l.modelsFor(Ri.cli,Ri.model||void 0)),ki=C(()=>(l.agents?.length?l.agents:[]).find(e=>e.enabled&&e.name===`engineer`)??null),Ai=D({agent:``,cli:``,model:``}),ji=D({agent:``,cli:``,model:``}),Mi=!1;function Ni(e){let t=ki.value;Mi=!0,Ai.agent=e?.agentOverride||t?.name||``,Ai.cli=e?.cliOverride||t?.cli||``,Ai.model=e?.modelOverride||t?.model||``,ji.agent=Ai.agent,ji.cli=Ai.cli,ji.model=Ai.model,s(()=>{Mi=!1})}let Pi=C(()=>Ai.agent!==ji.agent||Ai.cli!==ji.cli||Ai.model!==ji.model);e(()=>c.active,e=>{e&&!Pi.value&&Ni(e)},{immediate:!0});let Fi;function Ii(){let e=c.active?.id;e&&(Fi!==void 0&&window.clearTimeout(Fi),Fi=window.setTimeout(async()=>{if(Fi=void 0,c.active?.id!==e||!Pi.value)return;let t=ki.value,n={agent:Ai.agent,cli:Ai.cli,model:Ai.model},r=n.agent===(t?.name??``)?null:n.agent,i=n.cli===(t?.cli??``)?null:n.cli,o=n.model===(t?.model??``)?null:n.model;try{await a.patchTask(e,{agentOverride:r,cliOverride:i,modelOverride:o}),ji.agent=n.agent,ji.cli=n.cli,ji.model=n.model}catch(e){a.onError(e)}},500))}e(()=>Ai.cli,(e,t)=>{if(Mi||!e||e===t)return;let n=l.modelsFor(e);Ai.model=n.length>0?n[0].value:`default`}),e(()=>[Ai.agent,Ai.cli,Ai.model],()=>{Ii()}),v(()=>{Fi!==void 0&&window.clearTimeout(Fi),hr!==void 0&&window.clearTimeout(hr)});let Li=C(()=>(l.agents?.length?l.agents:[]).find(e=>e.enabled&&e.name===`pm`)??null),Ri=D({agent:``,cli:``,model:``});function zi(){let e=Li.value;Ri.agent=e?.name||``,Ri.cli=e?.cli||``,Ri.model=e?.model||``}let Bi=C(()=>{let e=Li.value;return e?Ri.agent!==e.name||Ri.cli!==e.cli||Ri.model!==e.model:!1});return e(()=>Ri.cli,(e,t)=>{if(!e||e===t)return;let n=l.modelsFor(e);Ri.model=n.length>0?n[0].value:`default`}),e(()=>Fn.value,()=>s($n),{immediate:!0}),e(()=>yn.value,()=>s(he),{immediate:!0}),e(()=>jr.value,()=>s(pe),{immediate:!0}),(e,t)=>{let s=L(`router-link`);return _(),U(x,null,[r(rr,{open:b.value,"onUpdate:open":S},{default:z(()=>[r(sr),r(ar,{style:W({width:w(c).drawerWidth+`px`,"max-width":`100vw`}),onOpenAutoFocus:T,onDragenter:k(Ne,[`prevent`]),onDragover:t[56]||=k(()=>{},[`prevent`]),onDragleave:k(Pe,[`prevent`]),onDrop:k(Fe,[`prevent`])},{default:z(()=>[G(`div`,{class:`drawer-resize`,onMousedown:t[0]||=k((...e)=>w(c).startResize&&w(c).startResize(...e),[`prevent`])},null,32),w(c).isNew?(_(),U(x,{key:0},[G(`div`,go,[r(cr,null,{default:z(()=>[...t[63]||=[i(`New task`,-1)]]),_:1}),r(or,{class:`sr-only`},{default:z(()=>[...t[64]||=[i(`Create a new task`,-1)]]),_:1}),r(ir,{class:`close-x`},{default:z(()=>[r(w(ne),{class:`size-[15px]`})]),_:1})]),G(`div`,_o,[G(`button`,{type:`button`,class:m([`tab-btn`,{active:F.value===`freeform`}]),onClick:t[1]||=e=>F.value=`freeform`},` Freeform `,2),G(`button`,{type:`button`,class:m([`tab-btn`,{active:F.value===`manual`}]),onClick:t[2]||=e=>F.value=`manual`},` Manual `,2)]),G(`div`,vo,[G(`div`,yo,[t[65]||=G(`label`,null,`Screenshots`,-1),G(`div`,{class:m([`shot-dropzone`,{over:ke.value>0}]),role:`button`,tabindex:`0`,onClick:t[4]||=e=>Oe.value?.click(),onKeydown:t[5]||=N(e=>Oe.value?.click(),[`enter`])},[r(w(oe),{class:`size-4`}),G(`span`,null,g(w(c).pendingScreenshots.length?`Add more — ${w(c).pendingScreenshots.length} screenshot${w(c).pendingScreenshots.length===1?``:`s`} added`:`Click to add screenshots, or drop them anywhere on this panel`),1),G(`input`,{ref_key:`shotInput`,ref:Oe,type:`file`,accept:`image/png,image/jpeg,image/gif,image/webp,image/avif,image/bmp`,multiple:``,class:`shot-input`,onChange:Me,onClick:t[3]||=k(()=>{},[`stop`])},null,544)],34),w(c).pendingScreenshots.length?(_(),U(`div`,bo,[(_(!0),U(x,null,o(w(c).pendingScreenshots,(e,t)=>(_(),U(`div`,{key:e.name+t,class:`shot-thumb`},[G(`img`,{src:e.dataUrl,alt:e.name},null,8,xo),G(`button`,{type:`button`,class:`shot-remove`,"aria-label":`Remove ${e.name}`,title:`Remove screenshot`,onClick:k(e=>w(c).removeScreenshot(t),[`stop`])},[r(w(ne),{class:`size-3.5`})],8,So),G(`span`,{class:`shot-name`,title:e.name},g(e.name),9,Co)]))),128))])):(_(),U(`p`,wo,` PNG, JPEG, GIF, WebP, AVIF or BMP — attached to the new task when you create it. `))]),F.value===`freeform`?(_(),U(x,{key:0},[Y.value?(_(),U(`div`,To,[G(`div`,Eo,[r(Lr),t[66]||=G(`span`,null,`Creating your task`,-1)]),G(`p`,Do,[t[68]||=i(` This may take a few minutes. Your task `,-1),Z.value?(_(),U(x,{key:0},[G(`span`,Oo,`#`+g(Z.value.id),1),t[67]||=i(` —`,-1)],64)):n(``,!0),t[69]||=i(` is being created in the background and will be updated automatically when it's ready. You can keep working, or start another task while you wait — nothing is lost. `,-1)]),G(`div`,ko,[r(X,{variant:`default`,onClick:ve},{default:z(()=>[...t[70]||=[i(`Create another task`,-1)]]),_:1}),r(X,{variant:`outline`,onClick:ye},{default:z(()=>[...t[71]||=[i(`Done`,-1)]]),_:1})]),Or.value.length?(_(),U(`div`,Ao,[G(`div`,jo,[r(Lr),t[72]||=i(` PM agent `,-1)]),G(`div`,{class:`ff-stream-log`,ref_key:`ffLogEl`,ref:kr},[(_(!0),U(x,null,o(Or.value,(e,t)=>(_(),U(`div`,{key:t,class:m([`ff-stream-line`,e.s===`err`?`err`:``])},g(e.d),3))),128))],512)])):n(``,!0)])):(_(),U(x,{key:1},[G(`div`,Mo,[t[73]||=G(`div`,{class:`field-header`},[G(`label`,{for:`nt-freeform`},`Describe the task`)],-1),G(`div`,No,[j(G(`textarea`,{id:`nt-freeform`,ref_key:`freeformTextarea`,ref:te,"onUpdate:modelValue":t[6]||=e=>R.value=e,class:`ff-textarea`,rows:`10`,placeholder:`Type the task however it comes out — like explaining it to a person. The PM agent writes the structured task file.`},null,512),[[O,R.value]]),r(Vr,{onTranscribed:ce,style:{"margin-bottom":`14px`}})])]),G(`div`,Po,[G(`div`,Fo,[G(`div`,Io,[r(so,{"cli-options":wi.value,"model-options":Di.value,"memory-key":`panel:new-task`,cli:Ri.cli,"onUpdate:cli":t[7]||=e=>Ri.cli=e,model:Ri.model,"onUpdate:model":t[8]||=e=>Ri.model=e,disabled:H.value},null,8,[`cli-options`,`model-options`,`cli`,`model`,`disabled`])])])]),ee.value?n(``,!0):(_(),U(`div`,Lo,[t[75]||=i(` No PM agent is configured. `,-1),r(s,{to:{name:`agents`},onClick:t[9]||=e=>w(c).close()},{default:z(()=>[...t[74]||=[i(` Set one up on the Agents page `,-1)]]),_:1}),t[76]||=i(` — until then your explanation is saved as a draft task. `,-1)])),V.value?(_(),U(`div`,Ro,[t[78]||=i(` The PM agent failed: `,-1),G(`span`,zo,g(B.value),1),t[79]||=i(` — your explanation was saved as draft `,-1),G(`span`,Bo,`#`+g(V.value.id),1),t[80]||=i(` so it isn't lost. `,-1),r(X,{variant:`outline`,size:`sm`,onClick:be},{default:z(()=>[...t[77]||=[i(`Open draft`,-1)]]),_:1})])):B.value?(_(),U(`div`,Vo,g(B.value),1)):n(``,!0),G(`div`,Ho,[r(X,{variant:`outline`,onClick:t[10]||=e=>w(c).close()},{default:z(()=>[...t[81]||=[i(`Cancel`,-1)]]),_:1}),r(X,{variant:`outline`,onClick:we,disabled:w(c).saving||!R.value.trim()},{default:z(()=>[...t[82]||=[i(` Create draft `,-1)]]),_:1},8,[`disabled`]),r(X,{variant:`default`,onClick:_e,disabled:w(c).saving||!R.value.trim()},{default:z(()=>[H.value?(_(),p(Lr,{key:0})):n(``,!0),i(` `+g(H.value?`Asking the PM agent…`:`Create task`),1)]),_:1},8,[`disabled`])]),Or.value.length?(_(),U(`div`,Uo,[G(`div`,Wo,[r(Lr),t[83]||=i(` PM agent `,-1)]),G(`div`,{class:`ff-stream-log`,ref_key:`ffLogEl`,ref:kr},[(_(!0),U(x,null,o(Or.value,(e,t)=>(_(),U(`div`,{key:t,class:m([`ff-stream-line`,e.s===`err`?`err`:``])},g(e.d),3))),128))],512)])):n(``,!0)],64))],64)):(_(),U(x,{key:1},[G(`div`,Go,[t[84]||=G(`label`,{for:`nt-title`},`Title`,-1),r(Fr,{id:`nt-title`,modelValue:w(c).nt.title,"onUpdate:modelValue":t[11]||=e=>w(c).nt.title=e,placeholder:`Add company dashboard`,onKeyup:N(Te,[`enter`])},null,8,[`modelValue`])]),G(`div`,Ko,[G(`div`,qo,[t[85]||=G(`label`,null,`Type`,-1),r(ga,{modelValue:w(c).nt.type,"onUpdate:modelValue":t[12]||=e=>w(c).nt.type=e},{default:z(()=>[r(ba,null,{default:z(()=>[r(xa)]),_:1}),r(_a,{position:`popper`},{default:z(()=>[r(Sa,{class:`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]`},{default:z(()=>[(_(),U(x,null,o(M,e=>r(ya,{key:e,value:e},{default:z(()=>[i(g(e),1)]),_:2},1032,[`value`])),64))]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),G(`div`,Jo,[t[86]||=G(`label`,null,`Priority`,-1),r(ga,{modelValue:w(c).nt.priority,"onUpdate:modelValue":t[13]||=e=>w(c).nt.priority=e},{default:z(()=>[r(ba,null,{default:z(()=>[r(xa)]),_:1}),r(_a,{position:`popper`},{default:z(()=>[r(Sa,{class:`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]`},{default:z(()=>[(_(),U(x,null,o(P,e=>r(ya,{key:e,value:e},{default:z(()=>[i(g(e),1)]),_:2},1032,[`value`])),64))]),_:1})]),_:1})]),_:1},8,[`modelValue`])])]),G(`div`,Yo,[G(`div`,Xo,[t[87]||=G(`label`,null,`Area`,-1),r(Fr,{modelValue:w(c).nt.area,"onUpdate:modelValue":t[14]||=e=>w(c).nt.area=e,placeholder:`web`},null,8,[`modelValue`])]),G(`div`,Zo,[t[91]||=G(`label`,null,`Assign to`,-1),r(ga,{"model-value":w(c).nt.assignedTo===``?`unassigned`:w(c).nt.assignedTo,"onUpdate:modelValue":t[15]||=e=>w(c).nt.assignedTo=e===`unassigned`?``:e??``},{default:z(()=>[r(ba,null,{default:z(()=>[r(xa)]),_:1}),r(_a,{position:`popper`},{default:z(()=>[r(Sa,{class:`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]`},{default:z(()=>[r(ya,{value:`unassigned`},{default:z(()=>[...t[88]||=[i(`unassigned`,-1)]]),_:1}),r(ya,{value:`ai`},{default:z(()=>[...t[89]||=[i(`AI agent`,-1)]]),_:1}),r(ya,{value:`human`},{default:z(()=>[...t[90]||=[i(`human`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`model-value`])])]),G(`div`,Qo,[r(X,{variant:`outline`,onClick:t[16]||=e=>w(c).close()},{default:z(()=>[...t[92]||=[i(`Cancel`,-1)]]),_:1}),r(X,{variant:`default`,onClick:Te,disabled:w(c).saving||!w(c).nt.title},{default:z(()=>[...t[93]||=[i(` Create `,-1)]]),_:1},8,[`disabled`])])],64))])],64)):w(c).active?(_(),U(x,{key:1},[G(`div`,$o,[G(`div`,es,[G(`div`,ts,[G(`span`,ns,g(w(c).active.path),1),G(`span`,{class:`cdot`,style:W({background:w(jt)(w(c).active.status)})},null,4),G(`span`,{style:W({color:w(jt)(w(c).active.status),fontSize:`11px`,fontWeight:600})},g(w(c).active.status),5),w(c).active.needsInput?(_(),U(`span`,{key:0,class:`tc-waiting`,title:ti(w(c).active.needsInputReason)},`needs input`,8,rs)):n(``,!0),pn.value?(_(),U(`span`,{key:1,class:m([`rs-chip`,pn.value.cls]),title:pn.value.label},g(pn.value.label),11,is)):n(``,!0),G(`span`,{class:m([`tc-prio`,w(c).active.priority]),style:{"margin-left":`auto`}},g(w(c).active.priority),3)]),r(cr,null,{default:z(()=>[i(g(w(c).active.title),1)]),_:1}),r(or,{class:`sr-only`},{default:z(()=>[i(g(w(c).active.body||`Task details`),1)]),_:1})]),r(ir,{class:`close-x`},{default:z(()=>[r(w(ne),{class:`size-[15px]`})]),_:1})]),G(`div`,as,[G(`div`,os,[r(ga,{"model-value":w(c).active.status,"onUpdate:modelValue":t[17]||=e=>Ie(e??``)},{default:z(()=>[r(ba,{disabled:w(c).saving},{default:z(()=>[r(xa)]),_:1},8,[`disabled`]),r(_a,{position:`popper`},{default:z(()=>[r(Sa,{class:`min-w-[var(--radix-select-trigger-width)]`},{default:z(()=>[(_(!0),U(x,null,o(y.value,e=>(_(),p(ya,{key:e.id,value:e.id},{default:z(()=>[G(`span`,{class:`cdot`,style:W({background:e.color})},null,4),i(g(e.label),1)]),_:2},1032,[`value`]))),128))]),_:1})]),_:1})]),_:1},8,[`model-value`]),mn.value.dev>0?(_(),U(`span`,ss,` D`+g(mn.value.dev)+` · R`+g(mn.value.review),1)):n(``,!0),w(c).active.status===`draft`?(_(),p(X,{key:1,variant:`outline`,disabled:w(c).saving,onClick:t[18]||=e=>Ie(`inbox`)},{default:z(()=>[r(w(Ae),{class:`size-3.5`}),t[94]||=i(` Move to inbox `,-1)]),_:1},8,[`disabled`])):n(``,!0),w(c).active.status===`inbox`?(_(),p(X,{key:2,variant:`outline`,disabled:w(c).saving,onClick:t[19]||=e=>Ie(`ready`)},{default:z(()=>[r(w(Ae),{class:`size-3.5`}),t[95]||=i(` Move to ready `,-1)]),_:1},8,[`disabled`])):n(``,!0),(w(c).active.status===`ready`||w(c).active.status===`active`)&&(w(c).active.status===`ready`||!w(a).isRunning(w(c).active.id))?(_(),p(X,{key:3,variant:`accent`,disabled:w(c).saving,onClick:ze},{default:z(()=>[Ve.value?(_(),p(Lr,{key:1})):(_(),p(w(ue),{key:0,class:`size-3.5`})),i(` `+g(Ve.value?`Starting work…`:w(c).active.status===`active`?`Restart work`:`Start work`),1)]),_:1},8,[`disabled`])):n(``,!0),w(c).active.status===`active`&&!w(a).isRunning(w(c).active.id)?(_(),p(X,{key:4,variant:`destructive`,disabled:w(c).saving,title:`Run the normal commit-and-check guard, then send this paused task to review`,onClick:t[20]||=e=>Ie(`review`)},{default:z(()=>[r(w(fe),{class:`size-3.5`}),t[96]||=i(` Review `,-1)]),_:1},8,[`disabled`])):n(``,!0),w(c).active.status===`active`&&w(a).isRunning(w(c).active.id)?(_(),p(X,{key:5,variant:`outline`,disabled:w(c).saving,onClick:Ue},{default:z(()=>[r(w(ge),{class:`size-3.5`}),t[97]||=i(` Pause work `,-1)]),_:1},8,[`disabled`])):n(``,!0),w(c).active.status===`active`||w(c).active.status===`review`?(_(),p(X,{key:6,variant:`outline`,disabled:w(c).saving,title:`Send this task back to ready — stops the agent/review, keeps the worktree`,onClick:We},{default:z(()=>[r(w(Re),{class:`size-3.5`}),t[98]||=i(` Stop work `,-1)]),_:1},8,[`disabled`])):n(``,!0),w(c).active.status===`done`?(_(),p(X,{key:7,variant:`outline`,disabled:w(c).saving,title:`Send this task back to ready with a fresh branch on the next Start work`,onClick:Ze},{default:z(()=>[r(w(ae),{class:`size-3.5`}),t[99]||=i(` Reopen `,-1)]),_:1},8,[`disabled`])):n(``,!0),w(c).active.status===`review`?(_(),p(X,{key:8,variant:`default`,disabled:w(c).saving||Q.value?.running||w(a).isRunning(w(c).active.id)||st.value,title:st.value?`Already in the integration pipeline — merging, building, and checking. See the pipeline bar for live progress.`:Q.value?.running?`Waiting for automatic review to finish.`:w(a).isRunning(w(c).active.id)?`The engineer is still coding; Move to done becomes available when the turn ends.`:void 0,onClick:gt},{default:z(()=>[!lt.value&&!st.value?(_(),p(w(De),{key:0,class:`size-3.5`})):(_(),p(Lr,{key:1})),i(` `+g(st.value?`Integrating…${ct.value?` (${ct.value})`:``}`:lt.value?ht.value:`Move to done`),1)]),_:1},8,[`disabled`,`title`])):n(``,!0)]),Q.value?.running?(_(),U(`span`,cs,[r(Lr,{variant:`reviewing`,label:`Reviewing…`}),t[100]||=i(` Reviewer is reviewing this task… `,-1)])):n(``,!0),w(c).active.status===`active`&&w(a).isRunning(w(c).active.id)?(_(),U(`span`,ls,[r(Lr),t[101]||=i(` agent coding `,-1)])):n(``,!0),w(a).pmWorkingFor(w(c).active.id)?(_(),U(`span`,us,[r(Lr),i(` `+g(w(c).active.status===`draft`?`PM is working on this draft…`:`PM is working on this task…`),1)])):n(``,!0),w(c).active.status===`review`&&w(a).doneErrorFor(w(c).active.id)?(_(),p(Ti,{key:3,class:`drawer-done-error`,mode:`panel`,message:w(a).doneErrorFor(w(c).active.id).message,step:w(a).doneErrorFor(w(c).active.id).step,conflicts:w(a).doneErrorFor(w(c).active.id).conflicts,detail:w(a).doneErrorFor(w(c).active.id).detail,hint:w(a).doneErrorFor(w(c).active.id).hint,"task-id":w(c).active.id,"task-title":w(c).active.title,onOpenDebugger:Ye},null,8,[`message`,`step`,`conflicts`,`detail`,`hint`,`task-id`,`task-title`])):n(``,!0),(w(c).active.status===`active`||w(c).active.status===`review`)&&w(c).active.preview?(_(),U(`div`,ds,[G(`div`,fs,[t[102]||=G(`span`,{class:`preview-dot`},null,-1),w(c).active.preview.label?(_(),U(`span`,ps,g(w(c).active.preview.label),1)):n(``,!0),G(`a`,{href:w(c).active.preview.url,target:`_blank`,rel:`noopener`,class:`preview-url`},[r(w(le),{class:`size-3.5`}),i(` `+g(w(c).active.preview.url),1)],8,ms),w(c).active.preview.label?(_(),U(`span`,hs,g(w(c).active.preview.label),1)):n(``,!0)]),qt.value&&Jt.value===`stop`?(_(),U(`span`,gs,[r(Lr,{label:`Stopping preview`}),t[103]||=i(` Stopping preview… `,-1),ln.value>=1e3?(_(),U(`span`,_s,g(w(er)(ln.value)),1)):n(``,!0)])):(_(),p(X,{key:1,variant:`outline`,disabled:w(c).saving||qt.value,onClick:dn},{default:z(()=>[r(w(Re),{class:`size-3.5`}),t[104]||=i(` Stop preview `,-1)]),_:1},8,[`disabled`]))])):n(``,!0),(w(c).active.status===`active`||w(c).active.status===`review`)&&!w(c).active.preview&&!w(c).active.branch?(_(),U(`p`,vs,` No branch yet — start work to create the worktree this previews. `)):(w(c).active.status===`active`||w(c).active.status===`review`)&&!w(c).active.preview&&!w(c).active.git?.worktreeExists?(_(),U(`p`,ys,[t[105]||=i(` No git worktree is checked out for `,-1),G(`span`,bs,g(w(c).active.branch),1),t[106]||=i(`. `,-1)])):w(c).active.status===`review`&&!w(c).active.preview?(_(),U(`div`,xs,[G(`p`,Ss,[Zt.value?(_(),U(x,{key:0},[i(` This task's area matches more than one preview target — choose which to serve. `)],64)):(_(),U(x,{key:1},[i(` No preview running. `)],64))]),Zt.value?j((_(),U(`select`,{key:0,"onUpdate:modelValue":t[21]||=e=>Qt.value=e,class:`preview-target-select`,disabled:w(c).saving||qt.value,"aria-label":`Preview target`},[t[107]||=G(`option`,{value:null,disabled:``},`Choose target…`,-1),(_(!0),U(x,null,o(Xt.value,e=>(_(),U(`option`,{key:e.name,value:e.name},g(e.name),9,ws))),128))],8,Cs)),[[E,Qt.value]]):$t.value?(_(),U(`span`,{key:1,class:`preview-target-name`,title:`Preview target: ${$t.value}`},g($t.value),9,Ts)):n(``,!0),qt.value&&Jt.value===`start`?(_(),U(`span`,Es,[r(Lr,{label:`Starting preview`}),t[108]||=i(` Starting preview`,-1),en.value?(_(),U(`span`,Ds,` — `+g(en.value),1)):n(``,!0),t[109]||=i(`… `,-1),ln.value>=1e3?(_(),U(`span`,Os,g(w(er)(ln.value)),1)):n(``,!0)])):(_(),p(X,{key:3,variant:`outline`,disabled:w(c).saving||qt.value||Zt.value&&!$t.value,onClick:fn},{default:z(()=>[r(w(ue),{class:`size-3.5`}),t[110]||=i(` Start preview `,-1)]),_:1},8,[`disabled`]))])):n(``,!0)]),G(`div`,ks,[G(`button`,{type:`button`,class:m([`tab-btn`,{active:w(c).activeTab===`details`}]),onClick:t[22]||=e=>w(c).activeTab=`details`},[r(w(qe),{class:`tab-icon`}),t[111]||=i(` Task `,-1)],2),G(`button`,{type:`button`,class:m([`tab-btn`,{active:w(c).activeTab===`pm`}]),onClick:t[23]||=e=>w(c).activeTab=`pm`},[r(w(se),{class:`tab-icon`}),t[112]||=i(` PM `,-1),w(c).activeTab!==`pm`&&w(c).active&&w(a).pmWorkingFor(w(c).active.id)?(_(),p(Lr,{key:0,label:`PM working`})):n(``,!0)],2),G(`button`,{type:`button`,class:m([`tab-btn`,{active:w(c).activeTab===`agent`}]),onClick:t[24]||=e=>w(c).activeTab=`agent`},[r(w(Xe),{class:`tab-icon`}),t[113]||=i(` Dev `,-1)],2),G(`button`,{type:`button`,class:m([`tab-btn`,{active:w(c).activeTab===`review`}]),onClick:t[25]||=e=>w(c).activeTab=`review`},[r(w(Le),{class:`tab-icon`}),t[114]||=i(` Review `,-1),w(c).activeTab!==`review`&&Q.value?.running?(_(),p(Lr,{key:0,variant:`reviewing`,label:`Reviewing…`})):n(``,!0)],2),G(`button`,{type:`button`,class:m([`tab-btn`,{active:w(c).activeTab===`changes`}]),onClick:t[26]||=e=>w(c).activeTab=`changes`},[r(w(Ce),{class:`tab-icon`}),t[115]||=i(` Changes `,-1)],2),G(`button`,{type:`button`,class:m([`tab-btn`,{active:w(c).activeTab===`tokens`}]),onClick:t[27]||=e=>w(c).activeTab=`tokens`},[r(w(Se),{class:`tab-icon`}),t[116]||=i(` Tokens `,-1)],2),G(`button`,{type:`button`,class:m([`tab-btn`,{active:w(c).activeTab===`debug`}]),onClick:t[28]||=e=>w(c).activeTab=`debug`},[r(w(Ge),{class:`tab-icon`}),t[117]||=i(` Debug `,-1)],2)]),w(c).activeTab===`details`?(_(),U(`div`,{key:0,class:m([`drawer-body`,{"transition-success":kt.value}])},[At.value?(_(),U(`div`,js,[t[119]||=G(`label`,null,`Title`,-1),G(`div`,Ms,g(w(c).active.title),1)])):(_(),U(`div`,As,[t[118]||=G(`label`,{for:`et-title`},`Title`,-1),r(Fr,{id:`et-title`,modelValue:Ct.title,"onUpdate:modelValue":t[29]||=e=>Ct.title=e,placeholder:`Task title`},null,8,[`modelValue`])])),G(`div`,Ns,[G(`div`,Ps,[t[120]||=G(`label`,null,`Type`,-1),r(ga,{modelValue:Ct.type,"onUpdate:modelValue":t[30]||=e=>Ct.type=e},{default:z(()=>[r(ba,null,{default:z(()=>[r(xa)]),_:1}),r(_a,{position:`popper`},{default:z(()=>[r(Sa,{class:`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]`},{default:z(()=>[(_(),U(x,null,o(M,e=>r(ya,{key:e,value:e},{default:z(()=>[i(g(e),1)]),_:2},1032,[`value`])),64))]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),G(`div`,Fs,[t[121]||=G(`label`,null,`Priority`,-1),r(ga,{modelValue:Ct.priority,"onUpdate:modelValue":t[31]||=e=>Ct.priority=e},{default:z(()=>[r(ba,null,{default:z(()=>[r(xa)]),_:1}),r(_a,{position:`popper`},{default:z(()=>[r(Sa,{class:`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]`},{default:z(()=>[(_(),U(x,null,o(P,e=>r(ya,{key:e,value:e},{default:z(()=>[i(g(e),1)]),_:2},1032,[`value`])),64))]),_:1})]),_:1})]),_:1},8,[`modelValue`])])]),G(`div`,Is,[G(`div`,Ls,[t[122]||=G(`label`,{for:`et-area`},`Area`,-1),r(Fr,{id:`et-area`,modelValue:Ct.area,"onUpdate:modelValue":t[32]||=e=>Ct.area=e,placeholder:`web`},null,8,[`modelValue`])]),G(`div`,Rs,[t[123]||=G(`label`,{for:`et-assignee`},`Assigned to`,-1),r(Fr,{id:`et-assignee`,modelValue:Ct.assignedTo,"onUpdate:modelValue":t[33]||=e=>Ct.assignedTo=e,list:`assignee-options`,placeholder:`unassigned`},null,8,[`modelValue`]),t[124]||=G(`datalist`,{id:`assignee-options`},[G(`option`,{value:`ai`}),G(`option`,{value:`human`})],-1)])]),G(`div`,zs,[G(`button`,{type:`button`,class:`spec-toggle`,"aria-expanded":It.value,onClick:t[34]||=e=>It.value=!It.value},[(_(),U(`svg`,{class:m([`spec-chev`,{collapsed:!It.value}]),viewBox:`0 0 24 24`,fill:`none`},[...t[125]||=[G(`path`,{d:`m6 9 6 6 6-6`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)]],2)),t[126]||=i(` spec `,-1)],8,Bs)]),It.value?(_(),U(`div`,Vs,[G(`div`,{class:`md-card`,role:`button`,tabindex:`0`,onClick:Bt,onKeydown:[N(zt,[`enter`]),N(k(zt,[`prevent`]),[`space`])]},[Rt.value?(_(),U(`div`,{key:0,class:`md-rendered`,innerHTML:Rt.value},null,8,Us)):(_(),U(`div`,Ws,`No spec yet — click to add.`))],40,Hs)])):n(``,!0),t[137]||=G(`div`,{class:`md-h`,style:{"margin-top":`4px`}},`meta`,-1),G(`div`,Gs,[G(`div`,Ks,[t[127]||=G(`div`,{class:`k`},`id`,-1),G(`div`,qs,g(w(c).active.id),1)]),G(`div`,Js,[t[128]||=G(`div`,{class:`k`},`created_by`,-1),G(`div`,Ys,g(w(c).active.createdBy||`—`),1)]),G(`div`,Xs,[t[129]||=G(`div`,{class:`k`},`created`,-1),G(`div`,Zs,g(w(a).fmtDate(w(c).active.created_at)),1)]),G(`div`,Qs,[t[130]||=G(`div`,{class:`k`},`updated`,-1),G(`div`,$s,g(w(a).fmtDate(w(c).active.updated_at)),1)]),G(`div`,ec,[t[131]||=G(`div`,{class:`k`},`branch in git`,-1),G(`div`,tc,g(w(c).active.git?.branchExists?`exists`:`no local branch`),1)]),G(`div`,nc,[t[132]||=G(`div`,{class:`k`},`last commit`,-1),G(`div`,rc,g(w(c).active.git?.lastCommit??`—`),1)])]),G(`div`,ic,[Qe.value?(_(),U(x,{key:1},[G(`p`,ac,` Delete task #`+g(w(c).active.id)+`? The file will be removed. Committed changes are recoverable from git; uncommitted or never-committed work is lost. `,1),G(`div`,oc,[r(X,{variant:`outline`,size:`sm`,disabled:w(c).saving,onClick:t[36]||=e=>Qe.value=!1},{default:z(()=>[...t[135]||=[i(` Cancel `,-1)]]),_:1},8,[`disabled`]),r(X,{variant:`destructive`,size:`sm`,disabled:w(c).saving,onClick:at},{default:z(()=>[...t[136]||=[i(` Delete `,-1)]]),_:1},8,[`disabled`])])],64)):(_(),U(x,{key:0},[r(X,{variant:`destructive`,size:`sm`,disabled:w(c).saving,onClick:t[35]||=e=>Qe.value=!0},{default:z(()=>[...t[133]||=[i(` Delete task `,-1)]]),_:1},8,[`disabled`]),!w(c).active?.hotfix&&w(c).active?.status===`ready`?(_(),p(X,{key:0,variant:`outline`,size:`sm`,disabled:w(c).saving,onClick:rt},{default:z(()=>[...t[134]||=[i(` Hotfix `,-1)]]),_:1},8,[`disabled`])):n(``,!0)],64))])],2)):w(c).activeTab===`agent`?(_(),U(`div`,{key:1,class:m([`drawer-body drawer-session-body`,{"transition-success":kt.value}])},[w(c).active?(_(),U(`div`,sc,[G(`div`,cc,[G(`div`,lc,[r(so,{"cli-options":wi.value,"model-options":Ei.value,"memory-key":`task:`+w(c).active.id+`:agent`,cli:Ai.cli,"onUpdate:cli":t[37]||=e=>Ai.cli=e,model:Ai.model,"onUpdate:model":t[38]||=e=>Ai.model=e,disabled:w(c).saving},null,8,[`cli-options`,`model-options`,`memory-key`,`cli`,`model`,`disabled`])]),G(`div`,uc,[Pi.value?(_(),U(`div`,dc,[...t[138]||=[G(`span`,{class:`agent-save-hint`},`saving…`,-1)]])):n(``,!0)])])])):n(``,!0),zr.value?.stalled?(_(),U(`div`,fc,[...t[139]||=[G(`span`,{class:`agent-stalled-dot`},null,-1),G(`div`,null,[G(`div`,{class:`agent-stalled-title`},`quiet — may be stalled`),G(`div`,{class:`agent-stalled-sub`},` No new output for a while. This isn't proof it's stuck — a slow step looks the same from here — but if it stays quiet, check in. `)],-1)]])):n(``,!0),w(c).active&&w(c).active.needsInput?(_(),U(`div`,pc,[t[141]||=G(`span`,{class:`agent-waiting-dot`},null,-1),G(`div`,null,[t[140]||=G(`div`,{class:`agent-waiting-title`},`waiting for you`,-1),G(`div`,mc,g(ti(w(c).active.needsInputReason)),1)])])):n(``,!0),G(`div`,hc,[G(`div`,{class:`agent-log`,ref_key:`logEl`,ref:Ir,onScroll:ri},[Ar.value.length===0?(_(),U(`div`,gc,[...t[142]||=[i(` No agent session yet. `,-1),G(`br`,null,null,-1),i(` Start work to launch the coding agent; its output streams here. `,-1)]])):n(``,!0),(_(!0),U(x,null,o(Ar.value,e=>(_(),U(`div`,{key:e.key,class:`agent-entry`},[e.kind===`line`?(_(),U(`div`,{key:0,class:m([`agent-line`,e.s])},[G(`span`,{class:m([`agent-pfx`,e.s])},g(e.s===`err`?`✕`:e.s===`sys`?`·`:`›`),3),G(`span`,_c,g(e.d),1)],2)):e.kind===`sys`?(_(),U(`div`,vc,[t[143]||=G(`span`,{class:`agent-pfx`},`·`,-1),G(`span`,yc,g(e.d),1)])):e.kind===`human`?(_(),U(`div`,bc,[G(`div`,xc,g(e.text),1)])):e.kind===`text`?(_(),U(`div`,Sc,g(e.text),1)):e.kind===`step`?(_(),U(`div`,{key:4,class:m([`agent-step`,{fin:e.stepKind===`finish`}])},[t[144]||=G(`span`,{class:`agent-step-dot`},null,-1),G(`span`,null,g(e.stepReason===`stop`?`done`:`continue`),1),e.stepReason!==`stop`&&e.stepAt?(_(),U(`span`,Cc,g(w(a).fmtDate(e.stepAt)),1)):n(``,!0),e.stepReason?(_(),U(`span`,wc,g(e.stepReason),1)):n(``,!0)],2)):(_(),U(`details`,{key:5,class:m([`agent-tool`,e.toolState])},[G(`summary`,null,[G(`span`,Tc,g(e.toolState===`error`?`✕`:`›`),1),G(`span`,Ec,g(e.toolName),1),e.toolInput?(_(),U(`span`,{key:0,class:`agent-tool-cmd`,title:e.toolInput},g(e.toolInput),9,Dc)):n(``,!0),e.toolState?(_(),U(`span`,{key:1,class:m([`agent-tool-state`,e.toolState])},g(e.toolState),3)):n(``,!0)]),G(`div`,Oc,g(e.toolOutput||e.toolInput),1)],2))]))),128))],544),Pr.value?n(``,!0):(_(),U(`button`,{key:0,type:`button`,class:`agent-jump`,onClick:t[39]||=e=>ii(!0),"aria-label":`Jump to latest message`},[r(w(Be),{class:`size-3.5`}),t[145]||=i(` Latest `,-1)]))]),G(`div`,kc,[G(`div`,Ac,[j(G(`textarea`,{ref_key:`draftMsgTextarea`,ref:re,"onUpdate:modelValue":t[40]||=e=>jr.value=e,class:`agent-input`,rows:`1`,placeholder:`Send a follow-up to the task's agent session…`,disabled:Rr.value||w(c).saving,onKeydown:N(k(Ci,[`exact`,`prevent`]),[`enter`]),onInput:pe},null,40,jc),[[O,jr.value]]),r(Vr,{disabled:Rr.value||w(c).saving,onTranscribed:de},null,8,[`disabled`])]),r(X,{variant:`accent`,size:`sm`,disabled:Rr.value||w(c).saving||!jr.value.trim(),onClick:Ci},{default:z(()=>[r(w(fe),{class:`size-3.5`}),t[146]||=i(` Send `,-1)]),_:1},8,[`disabled`])]),Rr.value?(_(),U(`div`,Mc,[r(Lr),t[147]||=i(` agent is working — wait for this turn to finish `,-1)])):w(c).active&&w(c).active.status!==`active`&&w(c).active.status!==`review`?(_(),U(`div`,Nc,` Task is `+g(w(c).active.status)+` — start work to run an agent turn. `,1)):n(``,!0)],2)):w(c).activeTab===`review`?(_(),U(`div`,Pc,[w(c).active?(_(),U(`div`,Fc,[G(`div`,Ic,[G(`div`,Lc,[r(so,{"cli-options":wi.value,"model-options":Cr.value,"memory-key":`task:`+w(c).active.id+`:review`,cli:vr.cli,"onUpdate:cli":t[41]||=e=>vr.cli=e,model:vr.model,"onUpdate:model":t[42]||=e=>vr.model=e,disabled:w(c).saving},null,8,[`cli-options`,`model-options`,`memory-key`,`cli`,`model`,`disabled`])]),G(`div`,Rc,[Sr.value?(_(),U(`div`,zc,[...t[148]||=[G(`span`,{class:`agent-save-hint`},`saving…`,-1)]])):n(``,!0)])])])):n(``,!0),G(`div`,Bc,[Q.value?.report?(_(),U(`div`,Vc,[G(`button`,{type:`button`,class:m([`review-pane-tab`,{active:bn.value===`report`}]),role:`tab`,"aria-selected":bn.value===`report`,onClick:t[43]||=e=>bn.value=`report`},` Report `,10,Hc),G(`button`,{type:`button`,class:m([`review-pane-tab`,{active:bn.value===`chat`}]),role:`tab`,"aria-selected":bn.value===`chat`,onClick:t[44]||=e=>bn.value=`chat`},` Chat `,10,Uc)])):n(``,!0),w(c).active.status===`review`?(_(),p(X,{key:1,variant:`outline`,size:`sm`,disabled:w(c).saving||vn.value||Q.value?.running,title:Q.value?.running?`Waiting for the current review run to finish.`:`Start a fresh review of the current worktree state`,onClick:Dn},{default:z(()=>[vn.value?(_(),p(Lr,{key:1})):(_(),p(w(ae),{key:0,class:`size-3.5`})),i(` `+g(vn.value?`Starting…`:`Review again`),1)]),_:1},8,[`disabled`,`title`])):n(``,!0),w(c).active.status===`review`?(_(),p(X,{key:2,variant:`accent`,size:`sm`,disabled:w(c).saving||On.value||vn.value||Q.value?.running||!Q.value?.report,title:Q.value?.report?`Return this task to active and resume the engineer with the reviewer findings`:`Wait for a completed review before sending this task back to the engineer.`,onClick:Mn},{default:z(()=>[On.value?(_(),p(Lr,{key:1})):(_(),p(w(fe),{key:0,class:`size-3.5`})),i(` `+g(On.value?`Sending…`:`Send engineer`),1)]),_:1},8,[`disabled`,`title`])):n(``,!0)]),Q.value?.report&&bn.value===`report`?(_(),U(`section`,Wc,[gn.value?(_(),U(`div`,Gc,[r(Lr,{variant:`reviewing`}),t[149]||=G(`div`,{class:`review-stale-body`},[G(`span`,{class:`review-stale-title`},`This report is stale`),G(`span`,{class:`review-stale-sub`},`A new review is running and will replace it shortly.`)],-1)])):n(``,!0),Q.value.report.state===`failed`?(_(),U(`div`,Kc,g(Q.value.report.markdown),1)):(_(),U(x,{key:2},[_n.value?(_(),U(`div`,{key:0,class:m([`verdict-callout`,`tone-${_n.value.tone}`]),role:`status`},[t[150]||=G(`span`,{class:`verdict-dot`},null,-1),G(`span`,qc,g(_n.value.label),1)],2)):n(``,!0),G(`div`,Jc,[G(`span`,null,g(w(a).fmtDate(Q.value.report.at)),1),G(`span`,Yc,g(Q.value.report.agent)+` · `+g(Q.value.report.cli),1)]),G(`div`,Xc,[G(`div`,{class:`md-rendered`,innerHTML:hn.value},null,8,Zc)])],64)),t[151]||=G(`p`,{class:`review-hint`},`Findings only — you decide whether this task is done.`,-1)])):(_(),U(`section`,Qc,[Q.value?.running?(_(),U(`div`,$c,[r(Lr,{variant:`reviewing`,label:`Reviewing…`}),t[152]||=i(` Reviewer is reviewing this task… `,-1)])):Q.value&&!Q.value.enabled?(_(),U(`p`,el,` The review agent is disabled on the Agents page, so no automatic review runs. `)):Q.value?.report?n(``,!0):(_(),U(`p`,tl,` No agent review for this task yet. `)),G(`div`,nl,[G(`div`,{class:`agent-log review-log`,ref_key:`reviewLogEl`,ref:Cn,onScroll:wn},[xn.value.length===0?(_(),U(x,{key:0},[Q.value?.running?(_(),U(`div`,rl,[r(Lr,{variant:`reviewing`,label:`Reviewing…`}),t[153]||=i(` The reviewer is thinking… `,-1)])):(_(),U(`div`,il,[...t[154]||=[i(` The reviewer's conversation appears here once a review runs. `,-1),G(`br`,null,null,-1),i(` Start a review to see the reviewer at work, then chat below. `,-1)]]))],64)):n(``,!0),(_(!0),U(x,null,o(xn.value,e=>(_(),U(`div`,{key:e.key,class:`agent-entry`},[e.kind===`line`?(_(),U(`div`,{key:0,class:m([`agent-line`,e.s])},[G(`span`,{class:m([`agent-pfx`,e.s])},g(e.s===`err`?`✕`:e.s===`sys`?`·`:`›`),3),G(`span`,al,g(e.d),1)],2)):e.kind===`sys`?(_(),U(`div`,ol,[t[155]||=G(`span`,{class:`agent-pfx`},`·`,-1),G(`span`,sl,g(e.d),1)])):e.kind===`human`?(_(),U(`div`,cl,[G(`div`,ll,g(e.text),1)])):e.kind===`text`?(_(),U(`div`,ul,g(e.text),1)):e.kind===`step`?(_(),U(`div`,{key:4,class:m([`agent-step`,{fin:e.stepKind===`finish`}])},[t[156]||=G(`span`,{class:`agent-step-dot`},null,-1),G(`span`,null,g(e.stepReason===`stop`?`done`:`continue`),1),e.stepReason?(_(),U(`span`,dl,g(e.stepReason),1)):n(``,!0)],2)):(_(),U(`details`,{key:5,class:m([`agent-tool`,e.toolState])},[G(`summary`,null,[G(`span`,fl,g(e.toolState===`error`?`✕`:`›`),1),G(`span`,pl,g(e.toolName),1),e.toolInput?(_(),U(`span`,{key:0,class:`agent-tool-cmd`,title:e.toolInput},g(e.toolInput),9,ml)):n(``,!0),e.toolState?(_(),U(`span`,{key:1,class:m([`agent-tool-state`,e.toolState])},g(e.toolState),3)):n(``,!0)]),G(`div`,hl,g(e.toolOutput||e.toolInput),1)],2))]))),128))],544),Sn.value?n(``,!0):(_(),U(`button`,{key:0,type:`button`,class:`agent-jump`,onClick:t[45]||=e=>Tn(!0),"aria-label":`Jump to latest review message`},[r(w(Be),{class:`size-3.5`}),t[157]||=i(` Latest `,-1)]))]),G(`div`,gl,[G(`div`,_l,[j(G(`textarea`,{ref_key:`reviewDraftMsgTextarea`,ref:ie,"onUpdate:modelValue":t[46]||=e=>yn.value=e,class:`agent-input`,rows:`1`,placeholder:`Ask the reviewer a follow-up question…`,disabled:Q.value?.running||vn.value||w(c).saving,onKeydown:N(k(En,[`exact`,`prevent`]),[`enter`]),onInput:he},null,40,vl),[[O,yn.value]]),r(Vr,{disabled:Q.value?.running||vn.value||w(c).saving,onTranscribed:me},null,8,[`disabled`])]),r(X,{variant:`accent`,size:`sm`,disabled:Q.value?.running||vn.value||w(c).saving||!yn.value.trim(),onClick:En},{default:z(()=>[r(w(fe),{class:`size-3.5`}),t[158]||=i(` Send `,-1)]),_:1},8,[`disabled`])]),Q.value?.running?(_(),U(`div`,yl,[r(Lr),t[159]||=i(` reviewer is working — wait for this turn to finish `,-1)])):n(``,!0)]))])):w(c).activeTab===`changes`?(_(),U(`div`,bl,[w(c).active?w(c).active.branch?!w(c).active.git?.worktreeExists&&_i.value!==void 0&&_i.value.patch===``?(_(),U(`p`,Cl,` No saved code changes are available for this completed task. `)):_i.value&&_i.value.patch===``?(_(),U(`p`,wl,`No code changes yet`)):(_(),U(x,{key:4},[G(`section`,Tl,[t[165]||=G(`div`,{class:`changes-summary-title`},`Code changes`,-1),ai.value?(_(),U(`div`,El,[G(`div`,Dl,[t[160]||=G(`span`,{class:`stat-label`},`Files:`,-1),G(`span`,Ol,g(ai.value.filesChanged),1)]),G(`div`,kl,[t[161]||=G(`span`,{class:`stat-label`},`Added:`,-1),G(`span`,Al,`+`+g(ai.value.additions),1)]),G(`div`,jl,[t[162]||=G(`span`,{class:`stat-label`},`Deleted:`,-1),G(`span`,Ml,`−`+g(ai.value.deletions),1)])])):(_(),U(`div`,Nl,[r(Lr,{size:`sm`,label:`Loading diff…`}),t[163]||=i(` Loading changes… `,-1)])),oi.value?(_(),U(`div`,Pl,[t[164]||=i(` This diff looks much bigger than the task — main has likely drifted since the branch was cut. `,-1),w(c).active?.branch?(_(),p(X,{key:0,variant:`outline`,size:`sm`,class:`diff-sync-btn`,disabled:li.value||w(c).saving,onClick:ui},{default:z(()=>[i(g(li.value?`Syncing…`:`Sync with main`),1)]),_:1},8,[`disabled`])):n(``,!0)])):n(``,!0)]),_i.value===void 0?(_(),U(`div`,Fl,[r(Lr,{size:`sm`,label:`Loading full diff…`}),t[166]||=G(`span`,null,`Loading full diff… this may take a moment for large changes.`,-1)])):(_(),U(x,{key:1},[vi.value.length>0?(_(),U(`div`,Il,[(_(!0),U(x,null,o(vi.value,e=>(_(),U(`button`,{key:e.filename,type:`button`,class:`diff-file-item`,onClick:t=>xi(e.filename)},[G(`span`,{class:m([`diff-file-badge`,`diff-file-badge-${e.type}`])},g(e.type===`added`?`A`:e.type===`deleted`?`D`:`M`),3),G(`span`,{class:`diff-file-name`,title:e.filename},g(e.filename),9,Rl),G(`span`,zl,[e.added>0?(_(),U(`span`,Bl,`+`+g(e.added),1)):n(``,!0),e.removed>0?(_(),U(`span`,Vl,`−`+g(e.removed),1)):n(``,!0)])],8,Ll))),128)),vi.value.length>8?(_(),U(`button`,{key:0,type:`button`,class:`diff-file-collapse-all`,onClick:t[47]||=e=>yi.size===vi.value.length?yi.clear():vi.value.forEach(e=>yi.add(e.filename))},[r(w(je),{class:`size-3`}),i(` `+g(yi.size===vi.value.length?`Expand all`:`Collapse all`),1)])):n(``,!0)])):n(``,!0),_i.value.truncated?(_(),U(`div`,Hl,` Diff output was truncated — showing the first ~250 kB. `)):n(``,!0),G(`div`,Ul,[(_(!0),U(x,null,o(vi.value,e=>(_(),U(`div`,{key:e.filename,id:e.filename,class:`diff-section`},[G(`div`,{class:`diff-section-header`,role:`button`,tabindex:`0`,onClick:t=>bi(e.filename),onKeydown:N(t=>bi(e.filename),[`enter`])},[(_(),U(`svg`,{class:m([`diff-section-chevron`,{collapsed:yi.has(e.filename)}]),viewBox:`0 0 24 24`,fill:`none`},[...t[167]||=[G(`path`,{d:`m6 9 6 6 6-6`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)]],2)),G(`span`,{class:m([`diff-file-badge`,`diff-file-badge-${e.type}`])},g(e.type===`added`?`A`:e.type===`deleted`?`D`:`M`),3),G(`span`,Kl,g(e.filename),1),G(`span`,ql,[e.added>0?(_(),U(`span`,Jl,`+`+g(e.added),1)):n(``,!0),e.removed>0?(_(),U(`span`,Yl,`−`+g(e.removed),1)):n(``,!0)])],40,Gl),yi.has(e.filename)?n(``,!0):(_(),U(`pre`,Xl,[G(`code`,null,[(_(!0),U(x,null,o(e.lines,(e,n)=>(_(),U(x,{key:n},[G(`span`,{class:m(Si(e))},g(e),3),t[168]||=i(`
|
|
15
|
+
`,-1)],64))),128))])]))],8,Wl))),128))])],64))],64)):(_(),U(`p`,Sl,`No branch yet — start work to create the worktree.`)):(_(),U(`p`,xl,`Select a task to view changes.`))])):w(c).activeTab===`tokens`?(_(),U(`div`,Zl,[Br.value?(_(),U(`div`,Ql,[Rr.value?(_(),p(Lr,{key:0,size:`sm`})):n(``,!0),G(`span`,$l,[t[169]||=G(`span`,{class:`agent-stat-label`},`time`,-1),G(`span`,eu,g(Jr(Kr.value)),1)]),G(`span`,tu,[t[170]||=G(`span`,{class:`agent-stat-label`},`tokens`,-1),G(`span`,nu,g(w(Nr)(zr.value?.tokens)),1)]),G(`span`,ru,[t[171]||=G(`span`,{class:`agent-stat-label`},`cost`,-1),G(`span`,iu,g(Yr(zr.value?.costUsd)),1)])])):n(``,!0),di.value&&di.value.totalSessions>0?(_(),U(`div`,au,[G(`section`,ou,[t[178]||=G(`header`,{class:`task-section-head`},[G(`div`,{class:`task-section-title`},`task totals`),G(`div`,{class:`task-section-desc`},`Whole-task summary across every session.`)],-1),G(`div`,su,[G(`span`,cu,[t[172]||=G(`span`,{class:`agent-stat-label`},`total time`,-1),G(`span`,lu,g(Jr(di.value.totalElapsedMs)),1)]),G(`span`,uu,[t[173]||=G(`span`,{class:`agent-stat-label`},`total tokens`,-1),G(`span`,du,g(w(Nr)(di.value.totalTokens)),1)]),G(`span`,fu,[t[174]||=G(`span`,{class:`agent-stat-label`},`cache hit`,-1),G(`span`,pu,g(Xr(di.value.totalInputTokens,di.value.totalCacheReadTokens,di.value.totalCacheCreationTokens)),1)]),G(`span`,mu,[t[175]||=G(`span`,{class:`agent-stat-label`},`total cost`,-1),G(`span`,hu,g(Yr(di.value.totalCostUsd,di.value.costSource)),1)]),G(`span`,gu,[t[176]||=G(`span`,{class:`agent-stat-label`},`turns`,-1),G(`span`,_u,g(di.value.totalTurns??`—`),1)]),G(`span`,vu,[t[177]||=G(`span`,{class:`agent-stat-label`},`sessions`,-1),G(`span`,yu,g(di.value.totalSessions),1)])])]),di.value.roles&&di.value.roles.length>1?(_(),U(`section`,bu,[t[180]||=G(`header`,{class:`task-section-head`},[G(`div`,{id:`task-section-role`,class:`task-section-title`},`by role`),G(`div`,{class:`task-section-desc`},`Who spent what, broken down by role.`)],-1),G(`div`,xu,[G(`table`,Su,[t[179]||=G(`thead`,null,[G(`tr`,null,[G(`th`,{class:`ta-left`},`role`),G(`th`,{class:`ta-right`},`time`),G(`th`,{class:`ta-right`},`tokens`),G(`th`,{class:`ta-right`},`cost`)])],-1),G(`tbody`,null,[(_(!0),U(x,null,o(di.value.roles,e=>(_(),U(`tr`,{key:e.role,class:`task-usage-role`},[G(`td`,Cu,g(e.role),1),G(`td`,wu,g(Jr(e.totalElapsedMs)),1),G(`td`,Tu,g(w(Nr)(e.totalTokens)),1),G(`td`,Eu,g(Yr(e.totalCostUsd,e.costSource)),1)]))),128))])])])])):n(``,!0),di.value.sessions&&di.value.sessions.length>0?(_(),U(`section`,Du,[t[188]||=G(`header`,{class:`task-section-head`},[G(`div`,{id:`task-section-sessions`,class:`task-section-title`},`individual sessions`),G(`div`,{class:`task-section-desc`},`The raw session log — one row per session.`)],-1),G(`div`,Ou,[G(`table`,ku,[G(`thead`,null,[G(`tr`,Au,[t[181]||=G(`th`,{class:`ta-left`},`type`,-1),t[182]||=G(`th`,{class:`ta-left`},`agent / model`,-1),G(`th`,{class:`ta-left task-usage-session-time`,title:mi.value?`Click to show time only`:`Click to show date and time`,onClick:t[48]||=e=>gi()},` started `,8,ju),G(`th`,{class:`ta-left task-usage-session-time`,title:mi.value?`Click to show time only`:`Click to show date and time`,onClick:t[49]||=e=>gi()},` ended `,8,Mu),t[183]||=G(`th`,{class:`ta-right`},`time`,-1),t[184]||=G(`th`,{class:`ta-right`},`tokens`,-1),t[185]||=G(`th`,{class:`ta-right`,title:`Share of this session's input served from the provider's prompt cache (hover a cell for raw token counts)`},` cache `,-1),t[186]||=G(`th`,{class:`ta-right`,title:`Model round-trips (one turn may run several tool calls). A high count relative to the work usually means the agent was thrashing.`},` turns `,-1),t[187]||=G(`th`,{class:`ta-right`},`cost`,-1)])]),G(`tbody`,null,[(_(!0),U(x,null,o(di.value.sessions,e=>(_(),U(`tr`,{key:e.sessionId,class:m([`task-usage-session-row`,{"task-usage-session-active":e.status===`active`}])},[G(`td`,Nu,g(e.sessionType),1),G(`td`,{class:`ta-left task-usage-session-agent`,title:fi.value?`Click to collapse`:`Click to show model`,onClick:t[50]||=e=>pi()},[G(`div`,null,g(e.codingAgent),1),fi.value?(_(),U(`div`,Fu,g(e.model),1)):n(``,!0)],8,Pu),G(`td`,Iu,g($r(e.startedAt,mi.value)),1),G(`td`,Lu,g(e.endedAt?$r(e.endedAt,mi.value):e.status===`active`?`running…`:`—`),1),G(`td`,Ru,g(Jr(e.elapsedMs)),1),G(`td`,zu,g(w(Nr)(e.totalTokens)),1),G(`td`,{class:`ta-right`,title:Zr(e)},g(Xr(e.inputTokens,e.cacheReadTokens,e.cacheCreationTokens)),9,Bu),G(`td`,Vu,g(e.turns??`—`),1),G(`td`,Hu,g(Yr(e.costUsd,e.costSource)),1)],2))),128))])])])])):n(``,!0)])):n(``,!0),!Br.value&&(!di.value||di.value.totalSessions===0)?(_(),U(`div`,Uu,[...t[189]||=[G(`p`,null,`No token or usage data yet.`,-1)]])):n(``,!0)])):w(c).activeTab===`debug`?(_(),U(`div`,Wu,[w(c).active?(_(),p(ua,{key:0,task:w(c).active,view:w(c).debugView,"onUpdate:view":t[51]||=e=>w(c).debugView=e},null,8,[`task`,`view`])):n(``,!0)])):w(c).activeTab===`pm`?(_(),U(`div`,Gu,[w(c).active?(_(),U(`div`,Ku,[G(`div`,qu,[G(`div`,Ju,[r(so,{"cli-options":wi.value,"model-options":mr.value,"memory-key":`task:`+w(c).active.id+`:pm`,cli:$.cli,"onUpdate:cli":t[52]||=e=>$.cli=e,model:$.model,"onUpdate:model":t[53]||=e=>$.model=e,disabled:w(c).saving},null,8,[`cli-options`,`model-options`,`memory-key`,`cli`,`model`,`disabled`])]),G(`div`,Yu,[pr.value?(_(),U(`div`,Xu,[...t[190]||=[G(`span`,{class:`agent-save-hint`},`saving…`,-1)]])):n(``,!0)])])])):n(``,!0),G(`div`,{ref_key:`pmLog`,ref:Rn,class:`agent-log-wrap pm-log-wrap`,role:`log`,"aria-live":`polite`},[Wn.value?(_(),U(x,{key:1},[(_(!0),U(x,null,o(Hn.value,(e,t)=>(_(),U(x,{key:t},[Jn(e)===`hidden`?n(``,!0):(_(),U(`div`,{key:0,class:m([`pm-row`,`pm-row-${Jn(e)}`])},[Jn(e)===`assistant`?(_(),U(`div`,Qu,`PM`)):n(``,!0),G(`div`,{class:m([`pm-bubble`,`pm-bubble-${Jn(e)}`])},[Jn(e)===`assistant`?(_(),U(`div`,{key:0,class:`pm-markdown`,innerHTML:w(Mr)(Yn(e))},null,8,$u)):(_(),U(`span`,ed,g(Yn(e)),1)),Jn(e)!==`status`&&e.at?(_(),U(`span`,td,g(w(tr)(e.at)),1)):n(``,!0)],2)],2))],64))),128)),Un.value?(_(),U(`div`,nd,[...t[192]||=[G(`span`,null,null,-1),G(`span`,null,null,-1),G(`span`,null,null,-1)]])):n(``,!0)],64)):(_(),U(`div`,Zu,[...t[191]||=[G(`div`,{class:`pm-welcome-icon`},`PM`,-1),G(`strong`,null,`Chat about this task`,-1),G(`p`,null,`Ask the PM to edit the task, suggest changes, or discuss progress.`,-1)]]))],512),Kn.value?(_(),U(`div`,rd,[(_(!0),U(x,null,o(Gn.value,(e,n)=>(_(),U(`div`,{key:n,class:`pm-canned-item`,role:`button`,tabindex:`0`,onClick:t=>qn(e),onKeydown:N(t=>qn(e),[`enter`])},[t[193]||=G(`svg`,{viewBox:`0 0 20 20`,fill:`none`,"aria-hidden":`true`},[G(`path`,{d:`M8 4 3 10l5 6`,stroke:`currentColor`,"stroke-width":`1.7`,"stroke-linecap":`round`,"stroke-linejoin":`round`}),G(`path`,{d:`M5 10h11`,stroke:`currentColor`,"stroke-width":`1.7`,"stroke-linecap":`round`})],-1),G(`span`,null,g(e),1)],40,id))),128))])):n(``,!0),w(c).pmScreenshots.length?(_(),U(`div`,ad,[(_(!0),U(x,null,o(w(c).pmScreenshots,(e,t)=>(_(),U(`div`,{key:e.name+t,class:`pm-shot`},[G(`img`,{src:e.dataUrl,alt:e.name},null,8,od),G(`button`,{type:`button`,class:`pm-shot-remove`,"aria-label":`Remove ${e.name}`,title:`Remove screenshot`,onClick:k(e=>w(c).removePmScreenshot(t),[`stop`])},[r(w(ne),{class:`size-3`})],8,sd)]))),128))])):n(``,!0),G(`form`,{class:`pm-compose`,onSubmit:k(Zn,[`prevent`])},[G(`input`,{ref_key:`pmShotInput`,ref:zn,type:`file`,accept:`image/png,image/jpeg,image/gif,image/webp,image/avif,image/bmp`,multiple:``,class:`pm-shot-input`,"aria-hidden":`true`,tabindex:`-1`,onChange:Bn},null,544),Un.value?n(``,!0):(_(),U(`button`,{key:0,type:`button`,class:`pm-attach`,"aria-label":`Attach screenshots`,title:`Attach screenshots — they're added to any task the PM creates from this message`,disabled:!Vn.value,onClick:t[54]||=e=>zn.value?.click()},[r(w(oe))],8,cd)),j(G(`textarea`,{ref_key:`pmDraftTextarea`,ref:In,"onUpdate:modelValue":t[55]||=e=>Fn.value=e,rows:`1`,disabled:!Vn.value,placeholder:Vn.value?`Ask PM to edit this task…`:`Enable PM agent on Agents page`,"aria-label":`Message PM`,onKeydown:Qn,onInput:$n},null,40,ld),[[O,Fn.value]]),Un.value?(_(),U(`button`,{key:1,type:`button`,class:`pm-stop`,"aria-label":`Stop PM response`,title:`Stop response`,onClick:nr},[...t[194]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`rect`,{x:`5`,y:`5`,width:`10`,height:`10`,rx:`1.5`,fill:`currentColor`})],-1)]])):(_(),U(`button`,{key:2,type:`submit`,disabled:!Fn.value.trim()||Un.value||!Vn.value,"aria-label":`Send message`},[...t[195]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`path`,{d:`m3 9 13-6-5.5 14-2-5.5L3 9Z`,stroke:`currentColor`,"stroke-width":`1.7`,"stroke-linejoin":`round`}),G(`path`,{d:`m8.5 11.5 3-3`,stroke:`currentColor`,"stroke-width":`1.7`,"stroke-linecap":`round`})],-1)]],8,ud))],32)])):n(``,!0),Ot.value?(_(),U(`div`,dd,[t[198]||=G(`div`,{class:`save-callout`},[G(`span`,{class:`save-dot`}),G(`div`,null,[G(`div`,{class:`save-title`},`Unsaved changes`),G(`div`,{class:`save-sub`},`Save to apply your edits`)])],-1),G(`div`,fd,[r(X,{variant:`outline`,size:`sm`,disabled:w(c).saving,onClick:Wt},{default:z(()=>[...t[196]||=[i(` Cancel `,-1)]]),_:1},8,[`disabled`]),r(X,{variant:`default`,size:`sm`,disabled:w(c).saving,onClick:Ut},{default:z(()=>[...t[197]||=[i(` Save `,-1)]]),_:1},8,[`disabled`])])])):n(``,!0)],64)):n(``,!0)]),_:1},8,[`style`])]),_:1},8,[`open`]),r(qr,{task:f.value,onClose:t[57]||=e=>f.value=null,onStarted:t[58]||=e=>w(c).activeTab=`agent`},null,8,[`task`]),r(Qr,{task:_t.value,files:vt.value,onCommit:yt,onCancel:bt},null,8,[`task`,`files`]),r(ni,{open:$e.value,"task-id":nt.value?.id??w(c).active?.id,busy:w(c).saving,onCancel:t[59]||=e=>$e.value=!1,onStart:ot},null,8,[`open`,`task-id`,`busy`]),r(si,{open:kn.value,busy:w(c).saving,title:`Send to engineer`,onCancel:t[60]||=e=>kn.value=!1,onConfirm:Nn},null,8,[`open`,`busy`]),r(hi,{open:Lt.value,body:Ct.body,"onUpdate:open":t[61]||=e=>Lt.value=e,onSave:Vt},null,8,[`open`,`body`]),r(ha,{open:et.value,"task-id":tt.value?.id??w(c).active?.id,busy:w(c).saving,"onUpdate:open":t[62]||=e=>et.value=e,onConfirm:Ke,onCancel:Je},null,8,[`open`,`task-id`,`busy`])],64)}}}),[[`__scopeId`,`data-v-775bc965`]]),md=e=>/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/.test(e),hd=e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e);function gd(e){let t=[],n=e.zone.trim().toLowerCase().replace(/\.$/,``);/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/.test(n)||t.push(`Enter a valid Cloudflare zone such as repoos.org.`),md(e.app.trim().toLowerCase())||t.push(`App name must use letters, numbers, hyphens, or underscores.`);let r=Number(e.port);if((!Number.isInteger(r)||r<1||r>65535)&&t.push(`Local port must be an integer from 1 to 65535.`),!e.noAccess){let n=(Array.isArray(e.emails)?e.emails:e.emails.split(`,`)).map(e=>e.trim()).filter(Boolean);n.length||t.push(`Add at least one allowed email address (or skip Cloudflare Access).`),n.some(e=>!hd(e))&&t.push(`Every allowed email must be a valid email address.`)}return e.runMode!==`foreground`&&e.runMode!==`background`&&t.push(`Choose foreground or background run mode.`),t}function _d(e){let t=gd(e);if(t.length)throw Error(t.join(` `));let n=e.zone.trim().toLowerCase().replace(/\.$/,``),r=e.app.trim().toLowerCase(),i=Number(e.port),a=!!e.noAccess,o=Array.isArray(e.emails)?e.emails:e.emails.split(`,`),s=a?[]:[...new Set(o.map(e=>e.trim().toLowerCase()).filter(Boolean))],c=`${r}.${n}`,l=s.join(`,`);return{zone:n,app:r,port:i,emails:s,runMode:e.runMode,noAccess:a,hostname:c,publicUrl:`https://${c}`,localOrigin:`http://localhost:${i}`,commands:{setup:`repoos tunnel setup`,create:a?`repoos tunnel create ${r} --port ${i} --domain ${c} --no-access`:`repoos tunnel create ${r} --port ${i} --domain ${c} --allow ${l}`,run:e.runMode===`background`?`repoos tunnel install`:`repoos tunnel start`,status:`repoos tunnel status`},authNote:a?"This app skips Cloudflare Access entirely — it's fully public at Cloudflare's edge. RepoOS native auth (auth.enabled = true in repoos.toml) is its ONLY gate, and `repoos tunnel create` will refuse --no-access unless it's already on.":`When using a public Cloudflare Tunnel, enable RepoOS native auth (auth.enabled = true in repoos.toml) for an additional layer of access control beyond Cloudflare Access. This ensures RepoOS itself rejects unauthorized requests, even if the tunnel is publicly accessible.`}}async function vd(e){try{if(navigator.clipboard?.writeText)return await navigator.clipboard.writeText(e),!0}catch{}return yd(e)}function yd(e){try{let t=document.activeElement,n=(document.getSelection()?.rangeCount??0)>0?document.getSelection().getRangeAt(0):null,r=document.createElement(`textarea`);r.value=e,r.setAttribute(`readonly`,``),r.style.position=`fixed`,r.style.top=`0`,r.style.left=`0`,r.style.width=`1px`,r.style.height=`1px`,r.style.padding=`0`,r.style.border=`0`,r.style.outline=`0`,r.style.boxShadow=`none`,r.style.background=`transparent`,document.body.appendChild(r),r.focus({preventScroll:!0}),r.select(),r.setSelectionRange(0,e.length);let i=!1;try{i=document.execCommand(`copy`)}finally{document.body.removeChild(r);let e=document.getSelection();n&&e&&(e.removeAllRanges(),e.addRange(n)),t?.focus?.({preventScroll:!0})}return i}catch{return!1}}var bd={class:`drawer-head`},xd={class:`tunnel-drawer-title`},Sd={class:`drawer-body tunnel-drawer-body`},Cd={key:0,class:`tunnel-current`},wd={class:`tunnel-form-grid`},Td={key:0},Ed={class:`tunnel-no-access-toggle`},Dd={key:1,class:`tunnel-help tunnel-no-access-warning`},Od={class:`tunnel-help`},kd={key:2,class:`tunnel-errors`},Ad={key:3,class:`tunnel-preview`},jd={class:`tunnel-mapping`},Md={class:`tunnel-command-list`},Nd={class:`tunnel-command-label`},Pd={class:`tunnel-readiness`},Fd={class:`tunnel-section-heading`},Id={key:0},Ld={key:1,class:`tunnel-checks`},Rd={class:`tunnel-access`},zd={href:`https://dash.cloudflare.com/profile/api-tokens`,target:`_blank`,rel:`noreferrer`},Bd=u({__name:`TunnelDrawer`,setup(e){let a=it(),s=I(``),c=I(``),l=I(null),u=I([]),d=I(null),f=I(!1),h=D({zone:`repoos.org`,app:`dev`,port:``,emails:`you@example.com`,runMode:`foreground`,noAccess:!1}),v,y=C(()=>d.value?.configured?.tunnelId?d.value.running?`Running`:d.value.originCertificate?.usable?`Configured but stopped`:`Needs attention`:`Not configured`);async function b(){try{let e=h.port?`?port=${encodeURIComponent(h.port)}`:``;d.value=await K(`/api/tunnel/readiness${e}`),!f.value&&d.value?.serveDefaultPort&&(h.port=String(d.value.serveDefaultPort))}catch{d.value=null}!f.value&&!h.port&&(h.port=`7171`)}function S(){let e={...h,port:Number(h.port)};u.value=gd(e),l.value=u.value.length?null:_d(e)}async function T(e){let t=await vd(e);if(window.clearTimeout(v),!t){c.value=e,s.value=``,v=window.setTimeout(()=>c.value=``,2600);return}c.value=``,s.value=e,v=window.setTimeout(()=>s.value=``,1800)}function O(e){e||a.closeTunnel()}return t(()=>{b()}),(e,t)=>(_(),p(rr,{open:w(a).tunnelOpen,"onUpdate:open":O},{default:z(()=>[r(sr),r(ar,{style:W({width:w(a).drawerWidth+`px`,"max-width":`100vw`})},{default:z(()=>[G(`div`,{class:`drawer-resize`,onMousedown:t[0]||=k((...e)=>w(a).startResize&&w(a).startResize(...e),[`prevent`])},null,32),G(`div`,bd,[G(`div`,xd,[r(cr,{class:`tunnel-title`},{default:z(()=>[...t[8]||=[i(`Cloudflare publishing assistant`,-1)]]),_:1}),r(or,{class:`tunnel-description`},{default:z(()=>[t[9]||=i(`Status: `,-1),G(`strong`,null,g(y.value),1),t[10]||=i(`. Configure values, review the mapping, then run the generated commands in a terminal.`,-1)]),_:1})]),r(ir,{class:`close-x`,"aria-label":`Close Cloudflare publishing assistant`},{default:z(()=>[r(w(ne),{class:`size-[15px]`})]),_:1})]),G(`div`,Sd,[t[37]||=G(`div`,{class:`tunnel-notice`},[i(` RepoOS does not start a tunnel from this page. The Cloudflare API token is never entered, shown, saved, or copied here; paste it only into the interactive `),G(`code`,null,`repoos tunnel setup`),i(` prompt. `)],-1),t[38]||=G(`div`,{class:`tunnel-notice`},[i(` One machine runs `),G(`strong`,null,`one`),i(` Cloudflare Tunnel, shared by every RepoOS repo on it. `),G(`code`,null,`repoos tunnel create`),i(` from any repo adds a hostname → local-service route to that same tunnel — you don't set up a tunnel per repo. `)],-1),d.value?.configured?.tunnelName?(_(),U(`div`,Cd,[G(`span`,null,[t[11]||=i(`Current tunnel: `,-1),G(`code`,null,g(d.value.configured.tunnelName),1)]),t[12]||=G(`span`,{class:`tunnel-help`},[i(`Rename it (label only, no restart, no traffic interruption) with `),G(`code`,null,`repoos tunnel rename <new-name>`),i(` — since it's one tunnel per machine, a host name like `),G(`code`,null,`repoos-<hostname>`),i(` reads better than the legacy `),G(`code`,null,`repoos-local`),i(`.`)],-1)])):n(``,!0),G(`div`,wd,[G(`label`,null,[t[13]||=i(`Cloudflare zone/base domain`,-1),r(Fr,{modelValue:h.zone,"onUpdate:modelValue":t[1]||=e=>h.zone=e,placeholder:`repoos.org`},null,8,[`modelValue`])]),G(`label`,null,[t[14]||=i(`App or subdomain`,-1),r(Fr,{modelValue:h.app,"onUpdate:modelValue":t[2]||=e=>h.app=e,placeholder:`dev`},null,8,[`modelValue`])]),G(`label`,null,[t[15]||=i(`Local port`,-1),r(Fr,{modelValue:h.port,"onUpdate:modelValue":t[3]||=e=>h.port=e,type:`number`,min:`1`,max:`65535`,placeholder:`7171`,onInput:t[4]||=e=>f.value=!0},null,8,[`modelValue`])]),h.noAccess?n(``,!0):(_(),U(`label`,Td,[t[16]||=i(`Allowed email address(es)`,-1),r(Fr,{modelValue:h.emails,"onUpdate:modelValue":t[5]||=e=>h.emails=e,placeholder:`you@example.com, team@example.com`},null,8,[`modelValue`])])),G(`label`,null,[t[18]||=i(`Run mode`,-1),j(G(`select`,{"onUpdate:modelValue":t[6]||=e=>h.runMode=e},[...t[17]||=[G(`option`,{value:`foreground`},`Foreground (development)`,-1),G(`option`,{value:`background`},`Background service`,-1)]],512),[[E,h.runMode]])])]),G(`label`,Ed,[j(G(`input`,{type:`checkbox`,"onUpdate:modelValue":t[7]||=e=>h.noAccess=e},null,512),[[ee,h.noAccess]]),t[19]||=i(` Skip Cloudflare Access — fully public tunnel, RepoOS native auth only `,-1)]),h.noAccess?(_(),U(`p`,Dd,[...t[20]||=[i(` No Access policy will be created at all. This only refuses to publish if RepoOS native auth (`,-1),G(`code`,null,`auth.enabled = true`,-1),i(`) isn't already on — see the Authentication settings above. `,-1)]])):n(``,!0),G(`p`,Od,[t[21]||=i(` Pre-filled with the port `,-1),t[22]||=G(`code`,null,`repoos serve`,-1),i(` uses for this repo`+g(d.value?.serveDefaultPort?` (${d.value.serveDefaultPort})`:``)+` — an explicit `,1),t[23]||=G(`code`,null,`servePort`,-1),t[24]||=i(` in `,-1),t[25]||=G(`code`,null,`repoos.toml`,-1),t[26]||=i(`, otherwise a stable per-repo derived port. Change it only if the app you're publishing listens elsewhere. `,-1)]),r(X,{onClick:S},{default:z(()=>[...t[27]||=[i(`Validate and preview commands`,-1)]]),_:1}),u.value.length?(_(),U(`div`,kd,[(_(!0),U(x,null,o(u.value,e=>(_(),U(`div`,{key:e},g(e),1))),128))])):n(``,!0),l.value?(_(),U(`div`,Ad,[G(`div`,jd,[t[28]||=G(`span`,null,`Public URL`,-1),G(`code`,null,g(l.value.publicUrl),1),t[29]||=G(`span`,null,`Local service`,-1),G(`code`,null,g(l.value.localOrigin),1)]),G(`div`,Md,[(_(!0),U(x,null,o(l.value.commands,(e,t)=>(_(),U(`div`,{key:t,class:`tunnel-command-row`},[G(`div`,null,[G(`span`,Nd,g(t),1),G(`code`,null,g(e),1)]),r(X,{variant:`outline`,size:`sm`,"aria-label":`Copy ${e}`,onClick:t=>T(e)},{default:z(()=>[s.value===e?(_(),p(w(Ie),{key:0,class:`size-[14px]`})):(_(),p(w(we),{key:1,class:`size-[14px]`})),i(g(s.value===e?`Copied`:c.value===e?`Copy failed`:`Copy`),1)]),_:2},1032,[`aria-label`,`onClick`])]))),128))]),G(`p`,{class:m([`tunnel-help`,{"tunnel-no-access-warning":l.value.noAccess}])},g(l.value.authNote),3)])):n(``,!0),G(`div`,Pd,[G(`div`,Fd,[t[31]||=G(`h3`,null,`Safe readiness checks`,-1),r(X,{variant:`ghost`,size:`sm`,onClick:b},{default:z(()=>[...t[30]||=[i(`Refresh`,-1)]]),_:1})]),d.value?(_(),U(`div`,Ld,[G(`span`,null,`cloudflared: `+g(d.value.cloudflared.installed?d.value.cloudflared.version||`installed`:`not installed`),1),G(`span`,null,`origin certificate: `+g(d.value.originCertificate.usable?`ready`:`missing or unusable`),1),G(`span`,null,`API token stored: `+g(d.value.apiTokenStored?`yes`:`no`),1),G(`span`,null,`local origin: `+g(d.value.localOrigin.listening?`listening`:`not listening`),1),G(`span`,null,`tunnel: `+g(d.value.running?`running`:`stopped`),1),G(`span`,null,`published (this machine): `+g(d.value.publishedHostnames.length?d.value.publishedHostnames.join(`, `):`none`),1)])):(_(),U(`p`,Id,`Checks unavailable. Generated instructions remain usable.`)),t[32]||=G(`p`,{class:`tunnel-help`},[i(` A machine runs one Cloudflare Tunnel shared by every RepoOS repo on it — `),G(`code`,null,`repoos tunnel`),i(` commands and the list above cover apps published by any repo, not just this one. If the certificate is unauthorized, re-run `),G(`code`,null,`cloudflared tunnel login`),i(`. Wait for `),G(`code`,null,`cloudflared tunnel list`),i(` to succeed before creating a route. `)],-1)]),G(`div`,Rd,[t[34]||=G(`h3`,null,`Cloudflare token permissions`,-1),t[35]||=G(`p`,null,` Create a custom token with least privilege: Account / Access: Apps and Policies / Edit; Account / Cloudflare Tunnel / Edit; Zone / DNS / Edit scoped to your zone; Account Settings / Read only only if your setup still requires it. `,-1),t[36]||=G(`p`,null,[i(` The token resource scope is the zone, such as `),G(`code`,null,`repoos.org`),i(`. Do not enter wildcard hostnames there: `),G(`code`,null,`dev.repoos.org`),i(` and other subdomains are individual published apps/routes. `)],-1),G(`a`,zd,[t[33]||=i(`Open Cloudflare custom-token creation `,-1),r(w(le),{class:`size-[13px]`})])])])]),_:1},8,[`style`])]),_:1},8,[`open`]))}}),Vd=u({__name:`switch`,props:{checked:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},class:{type:[Boolean,null,String,Object,Array]}},emits:[`update:checked`],setup(e,{emit:t}){let n=e,i=t;return(e,t)=>(_(),p(w(Te),{checked:n.checked,disabled:n.disabled,class:m(w(J)(`inline-flex h-[22px] w-10 shrink-0 cursor-pointer items-center rounded-full border border-[var(--border)] transition-colors duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--border-bright)] disabled:cursor-not-allowed disabled:opacity-50`,`data-[state=checked]:border-[var(--cyan)] data-[state=checked]:bg-[var(--cyan-dim)]`,n.class)),"onUpdate:checked":t[0]||=e=>i(`update:checked`,e)},{default:z(()=>[r(w(Ne),{class:m(w(J)(`pointer-events-none block size-4 rounded-full bg-[var(--txt-faint)] transition-transform duration-200`,`data-[state=checked]:translate-x-[18px] data-[state=checked]:bg-[var(--cyan)]`))},null,8,[`class`])]),_:1},8,[`checked`,`disabled`,`class`]))}}),Hd={class:`drawer-head`},Ud={class:`tunnel-drawer-title`},Wd={class:`drawer-body tunnel-drawer-body`},Gd={class:`tunnel-form-grid`,style:{"grid-template-columns":`1fr auto`,gap:`10px 16px`}},Kd={class:`tunnel-readiness`},qd={class:`tunnel-section-heading`},Jd={key:0,class:`tunnel-checks`},Yd={key:0},Xd={key:1,class:`tunnel-help`},Zd={class:`tunnel-access`},Qd={class:`tunnel-command-label`},$d={style:{margin:`2px 0 6px`}},ef={key:0,class:`tunnel-command-row`},tf={class:`tunnel-section-heading`,style:{"margin-top":`16px`}},nf={class:`tunnel-section-heading`,style:{"margin-top":`16px`}},rf={href:`https://console.hetzner.cloud/`,target:`_blank`,rel:`noreferrer`},af=`[remoteValidation]
|
|
16
|
+
enabled = true
|
|
17
|
+
serverType = "cax31" # 8 vCPU ARM / 16 GB — must match the snapshot's arch
|
|
18
|
+
location = "hil"
|
|
19
|
+
snapshotId = "<snapshot-id>" # from step 3
|
|
20
|
+
sshKeyName = "<your-key-name>"
|
|
21
|
+
idleShutdownMinutes = 8
|
|
22
|
+
maxServerLifetimeMinutes = 120
|
|
23
|
+
fallbackToLocal = false`,of=`HETZNER_API_TOKEN=<hetzner-api-token>
|
|
24
|
+
REPOOS_REMOTE_SSH_KEY=/absolute/path/to/private_key`,sf=qn(u({__name:`RemoteValidationDrawer`,setup(e){let a=it(),s=rn(),c=I(null),l=I(``),u;async function d(){try{c.value=await K(`/api/remote-validation/status`)}catch{c.value=null}}let f=C(()=>{let e=c.value;return!e||!e.enabled?`Disabled`:!e.hasApiToken||!e.hasSshKey||!e.snapshotConfigured?`Needs setup`:e.running?e.activeServer?`Runner up · ${e.activeServer.ageMinutes}m old`:`Ready — no VM running`:`Enabled — restart server to apply`}),m=C({get:()=>!!s.form[`remoteValidation.enabled`],set:e=>{s.setConfigValues({"remoteValidation.enabled":e}).then(d)}}),h=C({get:()=>!!s.form[`remoteValidation.fallbackToLocal`],set:e=>{s.setConfigValues({"remoteValidation.fallbackToLocal":e})}});async function v(e){await vd(e)&&(l.value=e,window.clearTimeout(u),u=window.setTimeout(()=>l.value=``,1800))}function y(e){e||a.closeRemoteValidation()}t(()=>void d());let b=[{label:`1 · Hetzner API token`,body:`In the Hetzner Cloud console: your project → Security → API Tokens → Generate (Read & Write). Put it in .env as HETZNER_API_TOKEN.`},{label:`2 · SSH key`,body:`Add your public SSH key under the project's Security → SSH Keys and note its name. The matching private key path goes in .env as REPOOS_REMOTE_SSH_KEY.`},{label:`3 · Build the runner snapshot (one-time)`,body:`Boots a throwaway box, bakes Docker + the repoos-ci image into a snapshot, prints the snapshot ID. Needs the hcloud CLI (brew install hcloud).`,cmd:`less scripts/remote-runner/build-snapshot.md`},{label:`4 · Configure repoos.toml`,body:`Add the [remoteValidation] block with the snapshot ID and SSH key name from the steps above.`},{label:`5 · Restart RepoOS`,body:`On boot, RepoOS reconciles (deletes any leaked runner VM) and the next review → done runs the gate remotely. Watch the per-task log at .repoos/logs/remote-validation/<id>.log.`,cmd:`just restart`}];return(e,t)=>(_(),p(rr,{open:w(a).remoteValidationOpen,"onUpdate:open":y},{default:z(()=>[r(sr),r(ar,{style:W({width:w(a).drawerWidth+`px`,"max-width":`100vw`})},{default:z(()=>[G(`div`,{class:`drawer-resize`,onMousedown:t[0]||=k((...e)=>w(a).startResize&&w(a).startResize(...e),[`prevent`])},null,32),G(`div`,Hd,[G(`div`,Ud,[r(cr,{class:`tunnel-title`},{default:z(()=>[...t[5]||=[i(`Remote validation runner`,-1)]]),_:1}),r(or,{class:`tunnel-description`},{default:z(()=>[t[6]||=i(` Status: `,-1),G(`strong`,null,g(f.value),1),t[7]||=i(`. Runs `,-1),t[8]||=G(`code`,null,`bun run build`,-1),t[9]||=i(` + `,-1),t[10]||=G(`code`,null,`bun run test`,-1),t[11]||=i(` on a disposable Hetzner VM so the close-out gate isn't starved of memory on this machine. `,-1)]),_:1})]),r(ir,{class:`close-x`,"aria-label":`Close remote validation setup`},{default:z(()=>[r(w(ne),{class:`size-[15px]`})]),_:1})]),G(`div`,Wd,[t[21]||=G(`div`,{class:`tunnel-notice`},` Enabling this sends a git bundle of the repo to Hetzner for each close-out. The failure output shown in RepoOS is credential-redacted, but the working tree is not — don't enable on a repo with secrets committed in-tree. `,-1),G(`div`,Gd,[t[12]||=G(`label`,{style:{display:`flex`,"flex-direction":`column`,gap:`2px`}},[i(` Enable remote validation `),G(`span`,{class:`tunnel-help`,style:{margin:`0`}},`Requires a server restart to take effect.`)],-1),r(Vd,{checked:m.value,"onUpdate:checked":t[1]||=e=>m.value=e},null,8,[`checked`]),t[13]||=G(`label`,{style:{display:`flex`,"flex-direction":`column`,gap:`2px`}},[i(` Fall back to local on infra failure `),G(`span`,{class:`tunnel-help`,style:{margin:`0`}},` Off (recommended): if the runner is unreachable the task stays in review for retry. On: run the full gate locally instead. `)],-1),r(Vd,{checked:h.value,"onUpdate:checked":t[2]||=e=>h.value=e},null,8,[`checked`])]),G(`div`,Kd,[G(`div`,qd,[t[15]||=G(`h3`,null,`Readiness`,-1),r(X,{variant:`ghost`,size:`sm`,onClick:d},{default:z(()=>[...t[14]||=[i(`Refresh`,-1)]]),_:1})]),c.value?(_(),U(`div`,Jd,[G(`span`,null,`enabled in config: `+g(c.value.enabled?`yes`:`no`),1),G(`span`,null,`HETZNER_API_TOKEN: `+g(c.value.hasApiToken?`set`:`missing`),1),G(`span`,null,`REPOOS_REMOTE_SSH_KEY: `+g(c.value.hasSshKey?`set`:`missing`),1),G(`span`,null,`snapshotId: `+g(c.value.snapshotConfigured?`set`:`missing`),1),G(`span`,null,`sshKeyName: `+g(c.value.sshKeyName||`missing`),1),G(`span`,null,`server type / location: `+g(c.value.serverType)+` · `+g(c.value.location),1),G(`span`,null,` runner VM: `+g(c.value.activeServer?`#${c.value.activeServer.id} @ ${c.value.activeServer.ip} (${c.value.activeServer.ageMinutes}m)`:`none running`),1),c.value.enabled&&!c.value.running?(_(),U(`span`,Yd,` ⚠ enabled in config but not active — restart the server `)):n(``,!0)])):(_(),U(`p`,Xd,`Status unavailable.`))]),G(`div`,Zd,[t[19]||=G(`h3`,null,`Setup`,-1),(_(),U(x,null,o(b,e=>G(`div`,{key:e.label,style:{"margin-bottom":`12px`}},[G(`div`,Qd,g(e.label),1),G(`p`,$d,g(e.body),1),e.cmd?(_(),U(`div`,ef,[G(`code`,null,g(e.cmd),1),r(X,{variant:`outline`,size:`sm`,"aria-label":`Copy ${e.cmd}`,onClick:t=>v(e.cmd)},{default:z(()=>[l.value===e.cmd?(_(),p(w(Ie),{key:0,class:`size-[14px]`})):(_(),p(w(we),{key:1,class:`size-[14px]`})),i(` `+g(l.value===e.cmd?`Copied`:`Copy`),1)]),_:2},1032,[`aria-label`,`onClick`])])):n(``,!0)])),64)),G(`div`,tf,[t[16]||=G(`h3`,null,`repoos.toml`,-1),r(X,{variant:`outline`,size:`sm`,"aria-label":`Copy repoos.toml block`,onClick:t[3]||=e=>v(af)},{default:z(()=>[l.value===af?(_(),p(w(Ie),{key:0,class:`size-[14px]`})):(_(),p(w(we),{key:1,class:`size-[14px]`})),i(` `+g(l.value===af?`Copied`:`Copy`),1)]),_:1})]),G(`div`,{class:`rvr-codeblock`},g(af)),G(`div`,nf,[t[17]||=G(`h3`,null,`.env (secrets — never commit)`,-1),r(X,{variant:`outline`,size:`sm`,"aria-label":`Copy .env block`,onClick:t[4]||=e=>v(of)},{default:z(()=>[l.value===of?(_(),p(w(Ie),{key:0,class:`size-[14px]`})):(_(),p(w(we),{key:1,class:`size-[14px]`})),i(` `+g(l.value===of?`Copied`:`Copy`),1)]),_:1})]),G(`div`,{class:`rvr-codeblock`},g(of)),t[20]||=G(`p`,{class:`tunnel-help`,style:{"margin-top":`14px`}},[i(` Full reference, cost model, and the two close-out hook points: `),G(`code`,null,`docs/remote-validation.md`),i(` and `),G(`code`,null,`scripts/remote-runner/build-snapshot.md`),i(`. `)],-1),G(`a`,rf,[t[18]||=i(` Open Hetzner Cloud console `,-1),r(w(le),{class:`size-[13px]`})])])])]),_:1},8,[`style`])]),_:1},8,[`open`]))}}),[[`__scopeId`,`data-v-dd2a2029`]]),cf={class:`toast-message`},lf=[`onClick`],uf=qn(u({__name:`ToastPanel`,setup(e){let t=Yt(),{toasts:n}=B(t),i={error:Z,success:he,info:xe},a={error:{bg:`var(--red-tint)`,border:`var(--red-border-tint)`,icon:`var(--red)`},success:{bg:`var(--green-tint)`,border:`var(--green-border-tint)`,icon:`var(--green)`},info:{bg:`var(--cyan-dim)`,border:`rgba(57,224,255,0.25)`,icon:`var(--cyan)`}};return(e,s)=>(_(),p(T,{tag:`div`,class:`toast-panel`,name:`toast`,"aria-live":`assertive`,"aria-atomic":`true`},{default:z(()=>[(_(!0),U(x,null,o(w(n),e=>(_(),U(`div`,{key:e.id,class:`toast-item`,style:W({background:a[e.type].bg,borderColor:a[e.type].border})},[(_(),p(c(i[e.type]),{class:`toast-icon size-[16px]`,style:W({color:a[e.type].icon})},null,8,[`style`])),G(`span`,cf,g(e.message),1),G(`button`,{type:`button`,class:`toast-close`,"aria-label":`Dismiss`,onClick:n=>w(t).removeToast(e.id)},[r(w(ne),{class:`size-[14px]`})],8,lf)],4))),128))]),_:1}))}}),[[`__scopeId`,`data-v-fa8e02e4`]]),df={key:0,class:`guide-panel`,"aria-label":`RepoOS Guide chat`},ff={class:`guide-header`},pf={class:`guide-identity`},mf={key:0,class:`guide-welcome`},hf={class:`guide-prompts`},gf={key:0,class:`guide-mini-avatar`},_f=[`innerHTML`],vf={key:1},yf={key:2,class:`msg-time`},bf={key:1,class:`guide-thinking`,"aria-label":`Ross is thinking`},xf=[`disabled`,`placeholder`],Sf=[`disabled`],Cf=`repoos-guide`,wf=qn(u({__name:`RepoGuideChat`,props:{open:{type:Boolean}},emits:[`close`],setup(a,{emit:c}){let l=a,u=c,d=Yt(),f=rn(),p=I(``),h=I(!1),v=I(!0),y=I(null),b=I(null),S=I(null),T=C(()=>f.agents.find(e=>e.name.toLowerCase()===`ross`||e.name.toLowerCase()===`repoos guide`)??null),E=C(()=>T.value??y.value),D=C(()=>E.value?.enabled??v.value),A=C(()=>h.value||d.runningIds.includes(Cf)),M=C(()=>d.outputs[Cf]??[]),N=C(()=>M.value.length>0);function P(e){return`type`in e?e.type===`human`?`human`:e.type===`text`?`assistant`:e.type===`step`?`hidden`:`status`:e.s===`out`?`assistant`:`status`}function F(e){if(`type`in e){if(e.type===`human`||e.type===`text`)return e.text;if(e.type===`sys`)return e.d;if(e.type===`tool`){let t=e.state?` · ${e.state}`:``;return`Checked with ${e.tool}${t}`}return``}return e.d}function L(){s(()=>{b.value&&(b.value.scrollTop=b.value.scrollHeight)})}async function R(){try{let e=await K(`/api/chat`);y.value=e.agent,v.value=e.enabled,d.outputs[Cf]=e.lines,d.agentStats[Cf]=e.stats,e.running&&!d.runningIds.includes(Cf)&&(d.runningIds=[...d.runningIds,Cf])}catch(e){d.onError(e)}}async function z(){let e=p.value.trim();if(!e||A.value||!D.value)return;h.value=!0;let t={type:`human`,text:e,at:new Date().toISOString()},n=M.value.length;d.outputs[Cf]=[...M.value,t],p.value=``,L();try{await K(`/api/chat/message`,q(`POST`,{text:e}))}catch(t){d.outputs[Cf]=(d.outputs[Cf]??[]).filter((e,t)=>t!==n),p.value=e,d.outputs[Cf]=[...d.outputs[Cf]??[],{type:`sys`,d:t instanceof Error?t.message:String(t)}],d.onError(t)}finally{h.value=!1}}function B(e){e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),z())}function V(e){S.value&&ci(S.value,e)}function ee(){Oi(S.value)}async function H(){try{await K(`/api/chat/interrupt`,{method:`POST`})}catch(e){d.onError(e)}}return e(()=>M.value.length,()=>{l.open&&L()}),t(()=>{R()}),e(()=>p.value,()=>{s(ee)}),(e,t)=>l.open?(_(),U(`aside`,df,[G(`header`,ff,[t[5]||=G(`div`,{class:`guide-avatar`,"aria-hidden":`true`},[G(`img`,{src:`/assets/repoos-ross-from-friends-square.webp`,alt:`Ross`})],-1),G(`div`,pf,[G(`strong`,null,g(E.value?.name??`Ross`),1),G(`span`,null,[G(`i`,{class:m({off:!D.value})},null,2),i(g(D.value?`Repository assistant`:`Disabled on Agents page`),1)])]),G(`button`,{class:`guide-minimize`,type:`button`,"aria-label":`Close Ross`,title:`Close`,onClick:t[0]||=e=>u(`close`)},[...t[4]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`path`,{d:`M4 10h12`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`})],-1)]])]),G(`div`,{ref_key:`log`,ref:b,class:`guide-log`,role:`log`,"aria-live":`polite`,"aria-label":`Conversation with Ross`},[N.value?n(``,!0):(_(),U(`div`,mf,[t[6]||=G(`div`,{class:`guide-welcome-avatar`},[G(`img`,{src:`/assets/repoos-ross-from-friends-square.webp`,alt:`Ross`})],-1),t[7]||=G(`strong`,null,`Ask Ross about this repository`,-1),t[8]||=G(`p`,null,`I can help with RepoOS, tasks, statuses, issues, code, and repository context.`,-1),G(`div`,hf,[G(`button`,{type:`button`,onClick:t[1]||=e=>p.value=`What is currently in progress?`},` What's in progress? `),G(`button`,{type:`button`,onClick:t[2]||=e=>p.value=`Which issues need attention?`},` Issues needing attention `)])])),(_(!0),U(x,null,o(M.value,(e,r)=>(_(),U(x,{key:r},[P(e)===`hidden`?n(``,!0):(_(),U(`div`,{key:0,class:m([`guide-row`,`guide-row-${P(e)}`])},[P(e)===`assistant`?(_(),U(`div`,gf,[...t[9]||=[G(`img`,{src:`/assets/repoos-ross-from-friends-square.webp`,alt:`R`},null,-1)]])):n(``,!0),G(`div`,{class:m([`guide-bubble`,`guide-bubble-${P(e)}`])},[P(e)===`assistant`?(_(),U(`div`,{key:0,class:`guide-markdown`,innerHTML:w(Mr)(F(e))},null,8,_f)):(_(),U(`span`,vf,g(F(e)),1)),P(e)!==`status`&&e.at?(_(),U(`span`,yf,g(w(tr)(e.at)),1)):n(``,!0)],2)],2))],64))),128)),A.value?(_(),U(`div`,bf,[...t[10]||=[G(`span`,null,null,-1),G(`span`,null,null,-1),G(`span`,null,null,-1)]])):n(``,!0)],512),G(`form`,{class:`guide-compose`,onSubmit:k(z,[`prevent`])},[j(G(`textarea`,{ref_key:`draftTextarea`,ref:S,"onUpdate:modelValue":t[3]||=e=>p.value=e,rows:`1`,disabled:!D.value,placeholder:D.value?`Ask about this repo…`:`Enable Ross on the Agents page`,"aria-label":`Message Ross`,onKeydown:B,onInput:ee},null,40,xf),[[O,p.value]]),r(Vr,{disabled:!D.value,onTranscribed:V},null,8,[`disabled`]),A.value?(_(),U(`button`,{key:0,type:`button`,class:`guide-stop`,"aria-label":`Stop response`,title:`Stop response`,onClick:H},[...t[11]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`rect`,{x:`5`,y:`5`,width:`10`,height:`10`,rx:`1.5`,fill:`currentColor`})],-1)]])):(_(),U(`button`,{key:1,type:`submit`,disabled:!p.value.trim()||A.value||!D.value,"aria-label":`Send message`},[...t[12]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`path`,{d:`m3 9 13-6-5.5 14-2-5.5L3 9Z`,stroke:`currentColor`,"stroke-width":`1.7`,"stroke-linejoin":`round`}),G(`path`,{d:`m8.5 11.5 3-3`,stroke:`currentColor`,"stroke-width":`1.7`,"stroke-linecap":`round`})],-1)]],8,Sf))],32),t[13]||=G(`div`,{class:`guide-footnote`},` Repo-aware assistant · Conversation stays open while you navigate `,-1)])):n(``,!0)}}),[[`__scopeId`,`data-v-40586754`]]),Tf={key:0,class:`cto-panel`,"aria-label":`CTO Board Monitor`},Ef={class:`cto-header`},Df={class:`cto-identity`},Of={key:0,class:`cto-disabled`},kf={key:1,class:`cto-report`},Af={class:`cto-report-meta`},jf=[`innerHTML`],Mf={key:0,class:`msg-time`},Nf={key:2,class:`cto-thinking`,"aria-label":`CTO is thinking`},Pf=[`disabled`],Ff=[`disabled`],If=qn(u({__name:`CTOPanel`,props:{open:{type:Boolean}},emits:[`close`],setup(r,{emit:a}){let c=a,l=Yt(),u=I(``),d=I(!1),f=I(null),p=I(null),h=C(()=>d.value||l.cto.running),v=C(()=>l.cto.enabled);C(()=>l.cto.running);let y=C(()=>l.cto.report),b=C(()=>l.cto.lines);function S(e){return`type`in e?e.type===`human`?`human`:e.type===`text`?`assistant`:e.type===`step`?`hidden`:`status`:e.s===`out`?`assistant`:`status`}function T(e){if(`type`in e){if(e.type===`human`||e.type===`text`)return e.text;if(e.type===`sys`)return e.d;if(e.type===`tool`){let t=e.state?` · ${e.state}`:``;return`Checked with ${e.tool}${t}`}return``}return e.d}function E(e){e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),A())}function D(){Oi(p.value)}async function A(){let e=u.value.trim();if(!(!e||h.value||!v.value)){d.value=!0,u.value=``;try{await K(`/api/cto/message`,{method:`POST`,body:JSON.stringify({text:e})}),await l.loadCTO()}catch(e){l.onError(e)}finally{d.value=!1}}}async function M(){try{await K(`/api/cto/interrupt`,{method:`POST`}),await l.loadCTO()}catch(e){l.onError(e)}}return t(()=>{l.loadCTO()}),e(()=>u.value,()=>{s(D)}),(e,t)=>r.open?(_(),U(`aside`,Tf,[G(`header`,Ef,[t[4]||=G(`div`,{class:`cto-avatar`,"aria-hidden":`true`},[G(`img`,{src:`/assets/repoos-cto-square.webp`,alt:`CTO`})],-1),G(`div`,Df,[t[2]||=G(`strong`,null,`CTO Board Monitor`,-1),G(`span`,null,[G(`i`,{class:m({off:!v.value})},null,2),i(g(v.value?`CTO agent is active`:`Disabled on Agents page`),1)])]),G(`button`,{class:`cto-minimize`,type:`button`,"aria-label":`Close CTO`,title:`Close`,onClick:t[0]||=e=>c(`close`)},[...t[3]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`path`,{d:`M4 10h12`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`})],-1)]])]),G(`div`,{class:`cto-log`,ref_key:`log`,ref:f},[v.value?y.value?(_(),U(`div`,kf,[G(`div`,Af,` Latest report at `+g(new Date(y.value.at).toLocaleTimeString()),1),G(`div`,{class:`cto-report-content`,innerHTML:w(Mr)(y.value.markdown)},null,8,jf)])):n(``,!0):(_(),U(`div`,Of,[...t[5]||=[G(`p`,null,`CTO agent is disabled. Enable it from the Agents page.`,-1)]])),(_(!0),U(x,null,o(b.value,(e,t)=>(_(),U(`div`,{key:t,class:m(`cto-line ${S(e)}`)},[i(g(T(e))+` `,1),S(e)!==`status`&&e.at?(_(),U(`span`,Mf,g(w(tr)(e.at)),1)):n(``,!0)],2))),128)),h.value?(_(),U(`div`,Nf,[...t[6]||=[G(`span`,null,null,-1),G(`span`,null,null,-1),G(`span`,null,null,-1)]])):n(``,!0)],512),G(`form`,{class:`cto-compose`,onSubmit:k(A,[`prevent`])},[j(G(`textarea`,{ref_key:`draftTextarea`,ref:p,"onUpdate:modelValue":t[1]||=e=>u.value=e,placeholder:`Ask the CTO about board health...`,disabled:h.value||!v.value,rows:`1`,onKeydown:E,onInput:D},null,40,Pf),[[O,u.value]]),h.value?(_(),U(`button`,{key:0,type:`button`,class:`cto-stop`,"aria-label":`Stop response`,title:`Stop response`,onClick:M},[...t[7]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`rect`,{x:`5`,y:`5`,width:`10`,height:`10`,rx:`1.5`,fill:`currentColor`})],-1)]])):(_(),U(`button`,{key:1,type:`submit`,disabled:h.value||!v.value||!u.value.trim()},`Send`,8,Ff))],32)])):n(``,!0)}}),[[`__scopeId`,`data-v-e3fd1dce`]]),Lf={key:0,class:`debugger-panel`,"aria-label":`Debugger chat`},Rf={class:`debugger-header`},zf={class:`debugger-identity`},Bf={class:`debugger-log-wrap`},Vf={key:0,class:`debugger-welcome`},Hf={class:`debugger-prompts`},Uf={key:0,class:`debugger-mini-avatar`},Wf=[`innerHTML`],Gf={key:1},Kf={key:2,class:`msg-time`},qf={key:1,class:`debugger-thinking`,"aria-label":`Debugger is working`},Jf={key:2,class:`debugger-provider-error`,role:`alert`},Yf={key:3,class:`debugger-repair`},Xf=[`disabled`],Zf=[`disabled`,`placeholder`],Qf=[`disabled`],$f=`__repoos-debugger__`,ep=`/assets/repoos-orchestrator-square.webp`,tp=80,np=qn(u({__name:`DebuggerChat`,props:{open:{type:Boolean}},emits:[`close`],setup(a,{emit:c}){let l=a,u=c,d=Yt(),f=rn(),p=it(),h=A(),v=I(``),y=I(!1),b=I(!1),S=I(null),T=I(null),E=I(!1),D=I(!1),M=I(!1),N=C(()=>H()||b.value),P=C(()=>y.value||d.runningIds.includes($f)),F=C(()=>d.outputs[$f]??[]),L=C(()=>F.value.length>0),R=C(()=>{let e=[...F.value.map(J).join(`
|
|
25
|
+
`).matchAll(/task\s+#(\d{4})/gi)];return e.length?e[e.length-1][1]:null}),z=C(()=>F.value.map(J).filter(Boolean).slice(-8).join(`
|
|
26
|
+
`)),B=C(()=>F.value.map(J).reverse().find(e=>/unexpected server error|unknownerror|connection|credit|rate limit/i.test(e))??null);function V(){u(`close`),h.push({name:`agents`})}async function ee(){if(!(!R.value||E.value||!z.value)){E.value=!0;try{await K(`/api/debugger/repair`,q(`POST`,{taskId:R.value,diagnosis:z.value})),D.value=!0,u(`close`);let e=await d.fetchTask(R.value);await p.openTask(e),p.activeTab=`agent`}catch(e){d.onError(e)}finally{E.value=!1}}}function H(){let e=f.data;if(!e)return b.value;let t=e.builtInAgents;return!t||t.debugger===void 0?b.value:!!t.debugger.enabled}function W(e){return`type`in e?e.type===`human`?`human`:e.type===`text`?`assistant`:e.type===`step`?`hidden`:`status`:e.s===`out`?`assistant`:`status`}function J(e){if(`type`in e){if(e.type===`human`||e.type===`text`)return e.text;if(e.type===`sys`)return e.d;if(e.type===`tool`){let t=e.state?` · ${e.state}`:``;return`Checked with ${e.tool}${t}`}return``}return e.d}function Y(){s(()=>{S.value&&(S.value.scrollTop=S.value.scrollHeight),M.value=!1})}function X(){let e=S.value;e&&(M.value=e.scrollHeight-e.scrollTop-e.clientHeight>tp)}async function Z(){try{let e=await K(`/api/debugger`);b.value=e.enabled,d.outputs[$f]=e.lines,e.running&&!d.runningIds.includes($f)&&(d.runningIds=[...d.runningIds,$f])}catch(e){d.onError(e)}}async function te(){let e=v.value.trim();if(!e||P.value||!N.value)return;y.value=!0;let t={type:`human`,text:e,at:new Date().toISOString()},n=F.value.length;d.outputs[$f]=[...F.value,t],v.value=``,Y();try{await K(`/api/debugger/message`,q(`POST`,{text:e}))}catch(t){d.outputs[$f]=(d.outputs[$f]??[]).filter((e,t)=>t!==n),v.value=e,d.outputs[$f]=[...d.outputs[$f]??[],{type:`sys`,d:t instanceof Error?t.message:String(t)}],d.onError(t)}finally{y.value=!1}}function ne(e){e.key!==`Enter`||e.shiftKey||e.isComposing||(e.preventDefault(),te())}function re(e){T.value&&ci(T.value,e)}function ie(){Oi(T.value)}async function ae(){try{await K(`/api/debugger/interrupt`,{method:`POST`})}catch(e){d.onError(e)}}return e(()=>F.value.length,()=>{l.open&&Y()}),e(()=>l.open,e=>{e&&Y()}),t(()=>{f.load(),Z()}),e(()=>v.value,()=>{s(ie)}),(e,t)=>l.open?(_(),U(`aside`,Lf,[G(`header`,Rf,[G(`div`,{class:`debugger-avatar`,"aria-hidden":`true`},[G(`img`,{src:ep,alt:`Debugger`})]),G(`div`,zf,[t[4]||=G(`strong`,null,`Debugger`,-1),G(`span`,null,[G(`i`,{class:m({off:!N.value})},null,2),i(g(N.value?`Bug diagnostician`:`Disabled on Agents page`),1)])]),G(`button`,{class:`debugger-minimize`,type:`button`,"aria-label":`Minimize Debugger`,title:`Minimize`,onClick:t[0]||=e=>u(`close`)},[...t[5]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`path`,{d:`M4 10h12`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`})],-1)]])]),G(`div`,Bf,[G(`div`,{ref_key:`log`,ref:S,class:`debugger-log`,role:`log`,"aria-live":`polite`,"aria-label":`Conversation with the Debugger`,onScroll:X},[L.value?n(``,!0):(_(),U(`div`,Vf,[G(`div`,{class:`debugger-welcome-avatar`},[G(`img`,{src:ep,alt:`Debugger`})]),t[6]||=G(`strong`,null,`Paste a bug, get a diagnosis`,-1),t[7]||=G(`p`,null,` Paste an error message, stack trace, or buggy code and I'll find the root cause and suggest a fix. `,-1),G(`div`,Hf,[G(`button`,{type:`button`,onClick:t[1]||=e=>v.value=`Here is an error I hit…`},`Report a bug`),G(`button`,{type:`button`,onClick:t[2]||=e=>v.value=`Why does this keep failing?`},` Explain a recurring failure `)])])),(_(!0),U(x,null,o(F.value,(e,t)=>(_(),U(x,{key:t},[W(e)===`hidden`?n(``,!0):(_(),U(`div`,{key:0,class:m([`debugger-row`,`debugger-row-${W(e)}`])},[W(e)===`assistant`?(_(),U(`div`,Uf,[G(`img`,{src:ep,alt:`D`})])):n(``,!0),G(`div`,{class:m([`debugger-bubble`,`debugger-bubble-${W(e)}`])},[W(e)===`assistant`?(_(),U(`div`,{key:0,class:`debugger-markdown`,innerHTML:w(Mr)(J(e))},null,8,Wf)):(_(),U(`span`,Gf,g(J(e)),1)),W(e)!==`status`&&e.at?(_(),U(`span`,Kf,g(w(tr)(e.at)),1)):n(``,!0)],2)],2))],64))),128)),P.value?(_(),U(`div`,qf,[...t[8]||=[G(`span`,null,null,-1),G(`span`,null,null,-1),G(`span`,null,null,-1)]])):n(``,!0),B.value&&!P.value?(_(),U(`div`,Jf,[t[9]||=G(`strong`,null,`The Debugger's agent or model could not respond.`,-1),t[10]||=G(`span`,null,`It may be out of credit, unavailable, or disconnected. Choose a different agent or model, then try again.`,-1),G(`button`,{type:`button`,onClick:V},`Change agent or model`)])):n(``,!0),R.value&&!P.value?(_(),U(`div`,Yf,[G(`button`,{type:`button`,disabled:E.value||D.value,onClick:ee},g(E.value?`Implementing fix…`:D.value?`Fix handed to engineer`:`Implement fix`),9,Xf)])):n(``,!0)],544),M.value?(_(),U(`button`,{key:0,type:`button`,class:`debugger-scroll-bottom`,"aria-label":`Scroll to latest messages`,onClick:Y},[...t[11]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`path`,{d:`M5 8l5 5 5-5`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1),i(` Scroll to bottom `,-1)]])):n(``,!0)]),G(`form`,{class:`debugger-compose`,onSubmit:k(te,[`prevent`])},[j(G(`textarea`,{ref_key:`draftTextarea`,ref:T,"onUpdate:modelValue":t[3]||=e=>v.value=e,rows:`1`,disabled:!N.value,placeholder:N.value?`Paste the bug, error, or stack trace…`:`Enable the Debugger on the Agents page`,"aria-label":`Message the Debugger`,onKeydown:ne,onInput:ie},null,40,Zf),[[O,v.value]]),r(Vr,{disabled:!N.value,onTranscribed:re},null,8,[`disabled`]),P.value?(_(),U(`button`,{key:0,type:`button`,class:`debugger-stop`,"aria-label":`Stop response`,title:`Stop response`,onClick:ae},[...t[12]||=[G(`svg`,{viewBox:`0 0 20 20`,fill:`none`},[G(`rect`,{x:`5`,y:`5`,width:`10`,height:`10`,rx:`1.5`,fill:`currentColor`})],-1)]])):(_(),U(`button`,{key:1,type:`submit`,disabled:!v.value.trim()||P.value||!N.value,"aria-label":`Diagnose`},` Diagnose `,8,Qf))],32),t[13]||=G(`div`,{class:`debugger-footnote`},` Paste a bug → root cause + suggested fix · Conversation stays open `,-1)])):n(``,!0)}}),[[`__scopeId`,`data-v-eb878cd5`]]),rp={class:`stack`},ip={key:0,class:`live-dot`},ap={key:0,class:`live-dot`},op=qn(u({__name:`FloatingHeads`,setup(e){let i=Yt(),a=rn(),o=it();function s(e){return e===`cto`?a.agents.some(e=>e.name.toLowerCase()===`cto`&&e.enabled):e===`ross`?a.agents.some(e=>(e.name.toLowerCase()===`ross`||e.name.toLowerCase()===`repoos guide`)&&e.enabled):e===`debugger`&&!!(a.data?.builtInAgents)?.debugger?.enabled}let c=I(null);function l(e){c.value=c.value===e?null:e}let u=()=>{o.close(),c.value=`debugger`};return t(()=>window.addEventListener(`repoos:open-debugger`,u)),f(()=>window.removeEventListener(`repoos:open-debugger`,u)),(e,t)=>(_(),U(`div`,{class:m([`floating-heads`,{"any-open":c.value}])},[r(If,{open:c.value===`cto`,onClose:t[0]||=e=>c.value=null},null,8,[`open`]),r(wf,{open:c.value===`ross`,onClose:t[1]||=e=>c.value=null},null,8,[`open`]),r(np,{open:c.value===`debugger`,onClose:t[2]||=e=>c.value=null},null,8,[`open`]),G(`div`,rp,[s(`debugger`)?(_(),U(`button`,{key:0,class:m([`head-btn`,{active:c.value===`debugger`}]),title:`Debugger — diagnose a bug`,onClick:t[3]||=e=>l(`debugger`)},[...t[6]||=[G(`img`,{src:`/assets/repoos-orchestrator-square.webp`,alt:`Debugger`},null,-1)]],2)):n(``,!0),s(`cto`)?(_(),U(`button`,{key:1,class:m([`head-btn`,{active:c.value===`cto`}]),title:`CTO Board Monitor`,onClick:t[4]||=e=>l(`cto`)},[t[7]||=G(`img`,{src:`/assets/repoos-cto-square.webp`,alt:`CTO`},null,-1),w(i).cto.running?(_(),U(`i`,ip)):n(``,!0)],2)):n(``,!0),s(`ross`)?(_(),U(`button`,{key:2,class:m([`head-btn`,{active:c.value===`ross`}]),title:`Ross — Repo assistant`,onClick:t[5]||=e=>l(`ross`)},[t[8]||=G(`img`,{src:`/assets/repoos-ross-from-friends-square.webp`,alt:`Ross`},null,-1),w(i).runningIds.includes(`repoos-guide`)?(_(),U(`i`,ap)):n(``,!0)],2)):n(``,!0)])],2))}}),[[`__scopeId`,`data-v-d05fff3c`]]),sp={class:`drawer-head`},cp={class:`drawer-body`},lp={key:0,class:`ff-done`},up={class:`ff-done-head`},dp={class:`btn-row`,style:{"margin-top":`18px`}},fp={class:`field`},pp={class:`input-attachments`},mp={for:`new-input-file`,class:`attachment-btn`},hp={key:0},gp={class:`btn-row`,style:{"margin-top":`20px`}},_p={key:0,class:`pending-attachments`,"aria-label":`Selected attachments`},vp=[`src`,`alt`],yp={key:1,class:`pending-file-icon`},bp=[`title`],xp=qn(u({__name:`NewInputPanel`,setup(t){let a=it(),s=Yt(),c=C(()=>a.isNewInput),l=I(!1);function u(e){e||a.close()}e(c,e=>{e&&(a.inputText=``,l.value=!1,a.clearScreenshots())});function d(e){a.addScreenshots(Array.from(e.target.files??[]))}function f(){let e=a.inputText.trim();if(!e||l.value)return;let t=[...a.pendingScreenshots];a.inputText=``,a.clearScreenshots(),l.value=!0,s.submitInput(e,t)}function m(){l.value=!1,requestAnimationFrame(()=>{document.getElementById(`new-input-text`)?.focus()})}function h(){l.value=!1,a.close()}return(e,t)=>(_(),p(rr,{open:c.value,"onUpdate:open":u},{default:z(()=>[r(sr),r(ar,{style:W({width:w(a).drawerWidth+`px`,"max-width":`100vw`})},{default:z(()=>[G(`div`,{class:`drawer-resize`,onMousedown:t[0]||=k((...e)=>w(a).startResize&&w(a).startResize(...e),[`prevent`])},null,32),G(`div`,sp,[r(cr,null,{default:z(()=>[...t[2]||=[i(`New input`,-1)]]),_:1}),r(or,{class:`sr-only`},{default:z(()=>[...t[3]||=[i(`Submit an idea, question, bug, or other input`,-1)]]),_:1}),r(ir,{class:`close-x`},{default:z(()=>[r(w(ne),{class:`size-[15px]`})]),_:1})]),G(`div`,cp,[l.value?(_(),U(`div`,lp,[G(`div`,up,[r(Lr),t[4]||=G(`span`,null,`Creating your input`,-1)]),t[7]||=G(`p`,{class:`ff-done-copy`},` This usually takes a few seconds. Your input is being created in the background and will be ready shortly. You can create another input or go do something else — nothing is lost. `,-1),G(`div`,dp,[r(X,{variant:`default`,onClick:m},{default:z(()=>[...t[5]||=[i(`Create another input`,-1)]]),_:1}),r(X,{variant:`outline`,onClick:h},{default:z(()=>[...t[6]||=[i(`Done`,-1)]]),_:1})])])):(_(),U(x,{key:1},[G(`div`,fp,[t[8]||=G(`label`,{for:`new-input-text`},`What would you like to share?`,-1),j(G(`textarea`,{id:`new-input-text`,"onUpdate:modelValue":t[1]||=e=>w(a).inputText=e,class:`input-textarea`,rows:`12`,placeholder:`Share an idea, question, bug, observation, or feedback…`},null,512),[[O,w(a).inputText]])]),G(`div`,pp,[G(`label`,mp,[r(w(nt),{class:`size-[15px]`}),t[9]||=i(` Add screenshot or file`,-1)]),G(`input`,{id:`new-input-file`,type:`file`,multiple:``,class:`sr-only`,onChange:d},null,32),w(a).pendingScreenshots.length?(_(),U(`span`,hp,g(w(a).pendingScreenshots.length)+` file`+g(w(a).pendingScreenshots.length===1?``:`s`)+` attached`,1)):n(``,!0)]),G(`div`,gp,[r(X,{variant:`outline`,onClick:w(a).close},{default:z(()=>[...t[10]||=[i(`Cancel`,-1)]]),_:1},8,[`onClick`]),r(X,{variant:`default`,disabled:!w(a).inputText.trim(),onClick:f},{default:z(()=>[...t[11]||=[i(`Submit input`,-1)]]),_:1},8,[`disabled`])]),w(a).pendingScreenshots.length?(_(),U(`div`,_p,[(_(!0),U(x,null,o(w(a).pendingScreenshots,e=>(_(),U(`div`,{key:e.name+e.size,class:`pending-attachment`},[e.mime.startsWith(`image/`)?(_(),U(`img`,{key:0,src:e.dataUrl,alt:e.name},null,8,vp)):(_(),U(`div`,yp,[r(w(nt),{class:`size-4`})])),G(`span`,{class:`pending-file-name`,title:e.name},g(e.name),9,bp)]))),128))])):n(``,!0)],64))])]),_:1},8,[`style`])]),_:1},8,[`open`]))}}),[[`__scopeId`,`data-v-a75c1719`]]),Sp={id:`app`},Cp={class:`body`},wp={class:`main`},Tp={key:0,class:`spin`},Ep=u({__name:`App`,setup(e){let n=R(),i=Yt(),a=Xt(),o=rn(),s=an(),c=C(()=>n.meta.public===!0);return t(async()=>{s.loaded||await s.loadMe(),await i.init(),await a.loadDocs(),await a.loadSkills(),await o.load(),o.loadModels()}),(e,t)=>{let n=L(`RouterView`);return _(),U(`div`,Sp,[c.value?(_(),p(n,{key:0})):(_(),U(x,{key:1},[r(Jn),G(`div`,Cp,[r(Cr),G(`div`,wp,[w(i).loading?(_(),U(`div`,Tp)):(_(),p(n,{key:1}))])]),r(Er),r(pd),r(Bd),r(sf),r(uf),r(op),r(xp)],64))])}}}),Dp=`modulepreload`,Op=function(e){return`/`+e},kp={},Ap=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=function(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))},i=function(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href},a=document.getElementsByTagName(`link`),o=document.querySelector(`meta[property=csp-nonce]`),s=o?.nonce||o?.getAttribute(`nonce`);r=e(t.map(e=>{if(e=Op(e,n),e=i(e),e in kp)return;kp[e]=!0;let t=e.endsWith(`.css`);for(let n=a.length-1;n>=0;n--){let r=a[n];if(r.href===e&&(!t||r.rel===`stylesheet`))return}let r=document.createElement(`link`);if(r.rel=t?`stylesheet`:Dp,t||(r.as=`script`),r.crossOrigin=``,r.href=e,s&&r.setAttribute(`nonce`,s),document.head.appendChild(r),t)return new Promise((t,n)=>{r.addEventListener(`load`,t),r.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${e}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},jp=V({history:P(),routes:[{path:`/login`,name:`login`,component:()=>Ap(()=>import(`./LoginView-BqupI0Lt.js`),__vite__mapDeps([0,1,2])),meta:{public:!0}},{path:`/`,name:`dashboard`,component:()=>Ap(()=>import(`./DashboardView-BOhsIJqO.js`),__vite__mapDeps([3,1,4,5,6,7]))},{path:`/work`,name:`work`,component:()=>Ap(()=>import(`./WorkView-D8Tl6qwy.js`),__vite__mapDeps([8,1,4,5,9]))},{path:`/releases`,name:`releases`,component:()=>Ap(()=>import(`./ReleasesView-CAgMuxpe.js`),__vite__mapDeps([10,1,4,5,6,11]))},{path:`/deployments`,name:`deployments`,component:()=>Ap(()=>import(`./DeploymentsView-DXu_FYR2.js`),__vite__mapDeps([12,1,4,5,13]))},{path:`/inputs`,name:`inputs`,component:()=>Ap(()=>import(`./InputsView-24HVbVPk.js`),__vite__mapDeps([14,1,4,5,15]))},{path:`/repo`,name:`repo`,component:()=>Ap(()=>import(`./ContextView-DsOqAdyE.js`),__vite__mapDeps([16,1,4,5,17]))},{path:`/settings`,name:`settings`,component:()=>Ap(()=>import(`./SettingsView-O3iZSnjg.js`),__vite__mapDeps([18,1,4,5,19]))},{path:`/agents`,name:`agents`,component:()=>Ap(()=>import(`./AgentsView-D-myL-kA.js`),__vite__mapDeps([20,1,4,5,21]))},{path:`/:pathMatch(.*)*`,redirect:`/`}]});jp.beforeEach(async e=>{if(e.meta.public)return!0;let t=an();return t.loaded||await t.loadMe(),t.authEnabled&&!t.authenticated?{path:`/login`,query:{redirect:e.fullPath}}:!0}),M(Ep).use(S()).use(jp).mount(`#app`),`serviceWorker`in navigator&&window.addEventListener(`load`,()=>{navigator.serviceWorker.register(`/sw.js`).then(e=>{e.update();let t=()=>{document.visibilityState===`visible`&&e.update()};document.addEventListener(`visibilitychange`,t),window.addEventListener(`focus`,t)}).catch(()=>{})});export{rr as A,Yt as B,Nr as C,or as D,sr as E,en as F,dt as H,rn as I,Xt as L,$n as M,qn as N,ar as O,an as P,Ft as R,Pr as S,cr as T,gt as U,ht as V,it as W,Qr as _,po as a,Lr as b,Sa as c,ya as d,_a as f,ci as g,Ti as h,ho as i,er as j,ir as k,xa as l,Di as m,Vd as n,uo as o,ga as p,vd as r,so as s,Ap as t,ba as u,qr as v,Mr as w,Fr as x,Vr as y,It as z};
|