@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 @@
|
|
|
1
|
+
import{$ as e,B as t,C as n,D as r,E as i,G as a,I as o,K as s,O as c,S as l,St as u,Tt as d,U as f,V as p,_ as m,b as h,bt as g,pt as _,q as v,rt as y,s as b,w as x,wt as S,x as C}from"./vendor-vue-CobgyEJp.js";import{a as w,i as T,t as E}from"./button-lbikqSph.js";import{B as D,C as O,N as k,W as A,m as j}from"./index-BOQ-ust6.js";import{n as M}from"./releases-B0WNV-SY.js";var N={class:`stat-top`},P={class:`stat-label`},F=c({__name:`StatCard`,props:{label:{},value:{},glow:{type:Boolean},color:{},bg:{}},setup(e){return(t,n)=>(f(),l(j,{class:u([`stat`,{"glow-cyan":e.glow}])},{default:y(()=>[C(`div`,N,[C(`div`,{class:`stat-ico`,style:S(e.bg?{background:e.bg,color:e.color}:{})},[s(t.$slots,`default`)],4)]),C(`div`,{class:`stat-val`,style:S(e.color?{color:e.color}:{})},d(e.value),5),C(`div`,P,d(e.label),1)]),_:3},8,[`class`]))}}),I={class:`panel-head`},L={class:`feed`},R={key:0,class:`feed-empty`},z={style:{flex:`1`,"min-width":`0`}},B=[`innerHTML`],V={class:`feed-meta`},H=c({__name:`FeedPanel`,setup(e){let t=D(),{connected:r,feed:o}=b(t);return(e,t)=>(f(),l(j,null,{default:y(()=>[C(`div`,I,[t[0]||=C(`div`,{class:`panel-title`},[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`},[C(`path`,{d:`M3 12h4l3 8 4-16 3 8h4`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`})]),i(` Live activity `)],-1),C(`span`,{class:`tag`,style:S(g(r)?`background:var(--tag-stream-bg);color:var(--tag-stream-color)`:`background:var(--tag-reconnect-bg);color:var(--tag-reconnect-color)`)},d(g(r)?`streaming`:`reconnecting`),5)]),C(`div`,L,[g(o).length?n(``,!0):(f(),x(`div`,R,` No activity yet. Edit a task file or change a status — events stream here in real time. `)),(f(!0),x(m,null,a(g(o),e=>(f(),x(`div`,{class:`feed-item`,key:e.key},[C(`div`,{class:`feed-dot`,style:S({background:e.color,boxShadow:`0 0 7px `+e.color})},null,4),t[1]||=C(`div`,{class:`feed-line`},null,-1),C(`div`,z,[C(`div`,{class:`feed-msg`,innerHTML:e.msg},null,8,B),C(`div`,V,[C(`span`,null,d(e.kind),1),C(`span`,null,d(e.time),1)])])]))),128))])]),_:1}))}}),ee={class:`panel-head`},te={class:`tag`,style:{background:`var(--amber-tint)`,color:`var(--amber)`}},U={key:0,class:`feed-empty needs-empty`},W={key:1,class:`feed`},G=[`onClick`],K={style:{flex:`1`,"min-width":`0`}},q={class:`feed-msg`},J={class:`needs-reasons`},Y={class:`feed-meta`},X={key:0,style:{color:`var(--cyan)`}},Z=c({__name:`NeedsYouPanel`,setup(e){let t=D(),o=A(),{humanNeeds:s}=b(t);return(e,c)=>(f(),l(j,null,{default:y(()=>[C(`div`,ee,[c[1]||=C(`div`,{class:`panel-title`},[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`},[C(`path`,{d:`M12 3 2 21h20L12 3z`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linejoin":`round`}),C(`path`,{d:`M12 10v5`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`}),C(`circle`,{cx:`12`,cy:`17.5`,r:`1`,fill:`currentColor`})]),i(` Needs your attention `)],-1),C(`span`,te,d(g(s).length),1)]),g(s).length?(f(),x(`div`,W,[(f(!0),x(m,null,a(g(s),e=>(f(),x(`div`,{class:`feed-item`,key:e.task.id,style:{cursor:`pointer`},onClick:t=>g(o).openTask(e.task)},[C(`div`,{class:`feed-dot`,style:S({background:g(t).statusColor(e.task.status)})},null,4),c[4]||=C(`div`,{class:`feed-line`},null,-1),C(`div`,K,[C(`div`,q,[C(`b`,null,`#`+d(e.task.id),1),i(` `+d(e.task.title),1)]),C(`div`,J,[(f(!0),x(m,null,a(e.reasons,e=>(f(),x(`span`,{class:`reason-tag`,key:e},d(e),1))),128))]),C(`div`,Y,[C(`span`,{style:S({color:g(t).statusColor(e.task.status)})},d(e.task.status),5),C(`span`,null,d(e.task.area),1),e.task.branch?(f(),x(`span`,X,d(e.task.branch),1)):n(``,!0)])])],8,G))),128))])):(f(),x(`div`,U,[c[3]||=C(`div`,null,`Nothing needs your attention right now.`,-1),r(E,{size:`sm`,variant:`outline`,class:`needs-cta`,onClick:c[0]||=e=>g(o).openNewTask(`human`)},{default:y(()=>[...c[2]||=[i(` New task for me `,-1)]]),_:1})]))]),_:1}))}}),Q={class:`headlines`},ne={class:`metric`},re={class:`metric-val`},ie={class:`metric-big`},ae={class:`metric-sub`},oe={class:`sparkline`,viewBox:`0 0 120 32`,preserveAspectRatio:`none`},se=[`d`],ce={class:`metric`},le={class:`metric-val`},ue={class:`metric-big`},de={class:`metric-sub`},fe={class:`sparkline`,viewBox:`0 0 120 32`,preserveAspectRatio:`none`},pe=[`d`],me={class:`metric`},he={class:`metric-val`},ge={class:`metric-big`},_e={class:`metric-sub`},ve={key:0,class:`metric-extra`},ye={key:0,class:`metric`},be={class:`metric-val`},xe={class:`metric-big`},Se={class:`metric-sub`},Ce={class:`metric-extra`},we=[`title`],Te={key:1,class:`metric`},Ee={class:`metric-val`},De={class:`metric-big`},Oe={class:`metric-sub`},ke={class:`metric-extra`},Ae=[`title`],je={class:`serve-alert-head`},Me={class:`serve-alert-icon`},Ne={class:`serve-alert-list`},Pe=[`disabled`,`onClick`],Fe={key:0,class:`serve-more`},Ie={key:1,class:`process-table-wrap`},Le={class:`col-pid`},Re={class:`col-task`},ze={key:1,class:`task-unknown`},Be={key:2,class:`orphan-tag`},Ve={key:3,class:`unverified-tag`},He={class:`col-cpu`},Ue={class:`col-mem`},We={class:`col-time`},Ge={class:`col-kill`},Ke=[`disabled`,`onClick`],qe={key:1,class:`waiting`},Je=k(c({__name:`SystemResourcePanel`,setup(t){let r=D(),{systemStats:o,runningIds:s,queuedIds:c}=b(r),p=_(null);async function S(e){if(p.value===null&&confirm(`Kill process ${e}? This cannot be undone.`)){p.value=e;try{await w(`/api/system/kill-process`,T(`POST`,{pid:e}))}catch(t){r.pushToast(t instanceof Error?t.message:`Could not kill process ${e}`,`error`)}finally{p.value=null}}}let E=_([]),O=_([]);e(o,e=>{e&&(E.value=[...E.value,e.totals.cpuPercent].slice(-60),O.value=[...O.value,e.totals.memPercent].slice(-60))});let k=h(()=>o.value?o.value.machine.availableMem??o.value.machine.freeMem:null),A=h(()=>!o.value||k.value===null?null:o.value.machine.totalMem-k.value);function M(e){return e>=1073741824?(e/1073741824).toFixed(1)+` GB`:e>=1048576?(e/1048576).toFixed(0)+` MB`:(e/1024).toFixed(0)+` KB`}function N(e){return e<.1||e<10?e.toFixed(1):e.toFixed(0)}function P(e){let t=e.split(/[-:]/);if(t.length===3){let e=parseInt(t[0],10),n=parseInt(t[1],10),r=parseInt(t[2],10);return e>0?`${e}h${n}m`:n>0?`${n}m${r}s`:`${r}s`}return e}function F(e,t,n,r){if(e.length<2)return``;let i=t-4,a=n-4,o=Math.max(r,1);return e.map((t,n)=>{let r=2+n/(e.length-1)*i,s=2+a-t/o*a;return`${n===0?`M`:`L`}${r.toFixed(1)},${s.toFixed(1)}`}).join(` `)}let I=h(()=>o.value!==null),L=h(()=>o.value?.serve??null),R=h(()=>o.value?.repo??null),z=h(()=>{let e=R.value,t=e?.worktreeWarnThreshold??0;return!!e&&t>0&&e.worktrees>t});function B(e){return e>=1e6?(e/1e6).toFixed(1)+`M`:e>=1e4?Math.round(e/1e3)+`k`:e>=1e3?(e/1e3).toFixed(1)+`k`:String(e)}let V=h(()=>(L.value?.processes??[]).filter(e=>e.kind===`stray`).slice(0,6)),H=h(()=>{let e=L.value;if(!e||e.level===`ok`)return``;let t=e.strays===1?`process`:`processes`,n=e.deadRoot>0?` ${e.deadRoot} of them are serving a directory that no longer exists.`:``,r=e.inFlight>0?` (${e.inFlight} more are in-flight under a live parent and not counted.)`:``;return e.level===`warn`?`${e.strays} abandoned repoos serve ${t} — enough to starve the close-out gate and fail it on unrelated flaky tests.${n}${r}`:`${e.strays} abandoned repoos serve ${t} left over from a task or test run.${n}${r}`});return(e,t)=>{let r=v(`router-link`);return f(),l(j,{class:`resource-panel`},{default:y(()=>[t[9]||=C(`div`,{class:`panel-title`},`System Resources`,-1),I.value?(f(),x(m,{key:0},[C(`div`,Q,[C(`div`,ne,[t[0]||=C(`div`,{class:`metric-label`},`CPU (RepoOS)`,-1),C(`div`,re,[C(`span`,ie,d(N(g(o).totals.cpuPercent))+`%`,1),C(`span`,ae,`of `+d(g(o).machine.cpuCount)+` cores`,1)]),(f(),x(`svg`,oe,[E.value.length>1?(f(),x(`path`,{key:0,d:F(E.value,120,32,Math.max(...E.value,10)),fill:`none`,stroke:`var(--cyan)`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,8,se)):n(``,!0)]))]),C(`div`,ce,[t[1]||=C(`div`,{class:`metric-label`},`Memory (RepoOS)`,-1),C(`div`,le,[C(`span`,ue,d(M(g(o).totals.memBytes)),1),C(`span`,de,`/ `+d(M(g(o).machine.totalMem))+` · `+d(N(g(o).totals.memPercent))+`%`,1)]),(f(),x(`svg`,fe,[O.value.length>1?(f(),x(`path`,{key:0,d:F(O.value,120,32,Math.max(...O.value,1)),fill:`none`,stroke:`var(--violet)`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,8,pe)):n(``,!0)]))]),C(`div`,me,[t[3]||=C(`div`,{class:`metric-label`},`Agents`,-1),C(`div`,he,[C(`span`,ge,d(g(s).length),1),C(`span`,_e,`running`+d(g(c).length?` · ${g(c).length} queued`:``),1)]),g(c).length?(f(),x(`div`,ve,[...t[2]||=[C(`span`,null,`Waiting for a free slot — starts automatically as agents finish.`,-1)]])):n(``,!0)]),A.value===null?n(``,!0):(f(),x(`div`,ye,[t[4]||=C(`div`,{class:`metric-label`},`Machine`,-1),C(`div`,be,[C(`span`,xe,d(M(A.value)),1),C(`span`,Se,`used of `+d(M(g(o).machine.totalMem)),1)]),C(`div`,Ce,[C(`span`,{title:`Reclaimable on demand (free + inactive + cache). Truly-free pages right now: ${M(g(o).machine.freeMem)}.`},`Available: `+d(M(k.value)),9,we),C(`span`,null,`Load: `+d(g(o).machine.loadavg.map(e=>e.toFixed(1)).join(` `)),1),L.value?(f(),x(`span`,{key:0,class:u({"serve-bad":L.value.level!==`ok`})},[i(` Serve: `+d(L.value.total),1),L.value.strays?(f(),x(m,{key:0},[i(` (`+d(L.value.strays)+` stray)`,1)],64)):L.value.inFlight?(f(),x(m,{key:1},[i(` (`+d(L.value.inFlight)+` busy)`,1)],64)):n(``,!0)],2)):n(``,!0)])])),R.value?(f(),x(`div`,Te,[t[6]||=C(`div`,{class:`metric-label`},`Codebase`,-1),C(`div`,Ee,[C(`span`,De,d(B(R.value.linesOfCode)),1),C(`span`,Oe,`lines · `+d(B(R.value.trackedFiles))+` files`,1)]),C(`div`,ke,[C(`span`,{class:u({"wt-warn":z.value}),title:z.value?`Over the advisory ceiling of ${R.value.worktreeWarnThreshold}. Run \`repoos gc\` to reclaim worktrees left by done / abandoned tasks.`:"Registered git worktrees, including the main checkout. Run `repoos gc` if this climbs."},d(R.value.worktrees)+` git worktree`+d(R.value.worktrees===1?``:`s`)+d(z.value?" — run `repoos gc`":``),11,Ae),t[5]||=C(`span`,null,`tracked on main · gitignored excluded`,-1)])])):n(``,!0)]),L.value&&L.value.level!==`ok`?(f(),x(`div`,{key:0,class:u([`serve-alert`,L.value.level])},[C(`div`,je,[C(`span`,Me,d(L.value.level===`warn`?`!`:`i`),1),C(`span`,null,d(H.value),1)]),C(`div`,Ne,[(f(!0),x(m,null,a(V.value,e=>(f(),x(`span`,{key:e.pid,class:u([`serve-chip`,{dead:!e.rootExists}])},[i(d(e.pid),1),e.port?(f(),x(m,{key:0},[i(`:`+d(e.port),1)],64)):n(``,!0),C(`button`,{type:`button`,class:`chip-kill`,disabled:p.value===e.pid,title:`Kill this stray process`,onClick:t=>S(e.pid)},` × `,8,Pe)],2))),128)),L.value.strays>V.value.length?(f(),x(`span`,Fe,` +`+d(L.value.strays-V.value.length)+` more `,1)):n(``,!0)])],2)):n(``,!0),g(o).processes.length?(f(),x(`div`,Ie,[t[7]||=C(`div`,{class:`process-table-header`},[C(`span`,{class:`col-pid`},`PID`),C(`span`,{class:`col-task`},`Task`),C(`span`,{class:`col-cpu`},`CPU`),C(`span`,{class:`col-mem`},`Memory`),C(`span`,{class:`col-time`},`Runtime`),C(`span`,{class:`col-kill`})],-1),(f(!0),x(m,null,a(g(o).processes,e=>(f(),x(`div`,{key:e.pid,class:u([`process-row`,{orphaned:e.orphaned}])},[C(`span`,Le,[C(`span`,{class:u([`pid-chip`,{orphan:e.orphaned}])},d(e.pid),3)]),C(`span`,Re,[e.taskId?(f(),x(m,{key:0},[e.taskId?(f(),l(r,{key:0,to:`/work?id=${e.taskId}`,class:`task-link`},{default:y(()=>[i(` #`+d(e.taskId),1)]),_:2},1032,[`to`])):n(``,!0)],64)):(f(),x(`span`,ze,d(e.pid===g(o).serverPid?`serve`:`unknown`),1)),e.orphaned?(f(),x(`span`,Be,`orphan`)):n(``,!0),e.unverified?(f(),x(`span`,Ve,`unverified`)):n(``,!0)]),C(`span`,He,d(N(e.cpuPercent))+`%`,1),C(`span`,Ue,d(M(e.memBytes)),1),C(`span`,We,d(P(e.elapsed)),1),C(`span`,Ge,[e.pid===g(o).serverPid?n(``,!0):(f(),x(`button`,{key:0,type:`button`,class:`kill-btn`,disabled:p.value===e.pid,title:`Kill this process`,onClick:t=>S(e.pid)},d(p.value===e.pid?`…`:`kill`),9,Ke))])],2))),128))])):n(``,!0)],64)):(f(),x(`div`,qe,[...t[8]||=[C(`span`,{class:`waiting-dot`},null,-1),i(` Waiting for resource data — connect to the live server `,-1)]]))]),_:1})}}}),[[`__scopeId`,`data-v-f2fe7214`]]),Ye={class:`usage-panel`,"aria-live":`polite`},Xe={class:`usage-head`},Ze={class:`usage-head-right`},Qe={key:0,class:`usage-sessions`},$e={class:`usage-range`,role:`group`,"aria-label":`AI usage date range`},et=[`aria-pressed`,`onClick`],tt={key:0,class:`usage-empty`},nt={key:1,class:`usage-error`},rt={class:`usage-grid`},it={class:`usage-cell`},at={class:`usage-value`},ot={class:`usage-cell`},st={class:`usage-value`},ct={class:`usage-cell`},lt={class:`usage-value`},ut={key:0,class:`usage-breakdown`},dt={key:0,class:`usage-roles`},ft={class:`usage-table-wrap`},pt={class:`usage-table`},mt={class:`usage-role-name ta-left`},ht={class:`ta-right`},gt={class:`ta-right`},_t={class:`ta-right`},vt={key:1,class:`usage-days`},yt={class:`usage-table-wrap`},bt={class:`usage-table`},xt={class:`usage-role-name ta-left`},St={class:`ta-right`},Ct={class:`ta-right`},wt={class:`ta-right`},Tt={key:1,class:`usage-legend`},Et={key:3},Dt=k(c({__name:`UsagePanel`,setup(e){let r=D();t(()=>{r.loadBoardUsage()});let o=h(()=>r.boardUsage),s=h(()=>r.boardUsageLoading),c=h(()=>r.boardUsageError),l=h(()=>r.boardUsageRange),p=[{value:`1d`,label:`1 day`},{value:`7d`,label:`1 week`},{value:`30d`,label:`1 month`},{value:`all`,label:`all time`}];function _(e){e!==l.value&&r.loadBoardUsage(e)}function v(e){let t=Math.max(0,Math.floor((e??0)/1e3)),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return n>0?`${n}h ${r}m`:`${r}m ${i}s`}function y(e,t){if(e==null||!Number.isFinite(e))return`—`;let n=e<.01?e.toFixed(4):e<1?e.toFixed(3):e.toFixed(2);return t===`kiro-credits`?`${n} credits`:t===`estimate`?`~$${n} est`:t===`mixed`?`$${n}*`:`$${n}`}let b=h(()=>(o.value?.totalSessions??0)>0),S=h(()=>(o.value?.roles??[]).filter(e=>(e.totalSessions??0)>0||(e.totalCostUsd??0)>0||(e.totalElapsedMs??0)>0)),w=h(()=>o.value?.days??[]);return(e,t)=>(f(),x(`div`,Ye,[C(`div`,Xe,[t[1]||=C(`span`,{class:`usage-title`},`AI usage — all roles`,-1),C(`div`,Ze,[b.value?(f(),x(`span`,Qe,d(o.value?.totalSessions)+` sessions`,1)):n(``,!0),C(`div`,$e,[(f(),x(m,null,a(p,e=>C(`button`,{key:e.value,type:`button`,class:u([`usage-range-btn`,{"is-active":l.value===e.value}]),"aria-pressed":l.value===e.value,onClick:t=>_(e.value)},d(e.label),11,et)),64))])])]),s.value?(f(),x(`div`,tt,`Loading AI usage…`)):c.value?(f(),x(`div`,nt,[i(` AI usage is unavailable: `+d(c.value)+` `,1),C(`button`,{type:`button`,onClick:t[0]||=e=>g(r).loadBoardUsage()},`Retry`)])):o.value&&b.value?(f(),x(m,{key:2},[C(`div`,rt,[C(`div`,it,[t[2]||=C(`span`,{class:`usage-label`},`time`,-1),C(`span`,at,d(v(o.value.totalElapsedMs)),1)]),C(`div`,ot,[t[3]||=C(`span`,{class:`usage-label`},`tokens`,-1),C(`span`,st,d(g(O)(o.value.totalTokens)),1)]),C(`div`,ct,[t[4]||=C(`span`,{class:`usage-label`},`cost`,-1),C(`span`,lt,d(y(o.value.totalCostUsd,o.value.costSource)),1)])]),S.value.length||w.value.length?(f(),x(`div`,ut,[S.value.length?(f(),x(`div`,dt,[t[6]||=C(`div`,{class:`usage-subtitle`},`by role`,-1),C(`div`,ft,[C(`table`,pt,[t[5]||=C(`thead`,null,[C(`tr`,null,[C(`th`,{class:`ta-left`},`name`),C(`th`,{class:`ta-right`},`time`),C(`th`,{class:`ta-right`},`tokens`),C(`th`,{class:`ta-right`},`cost`)])],-1),C(`tbody`,null,[(f(!0),x(m,null,a(S.value,e=>(f(),x(`tr`,{key:e.role,class:`usage-role`},[C(`td`,mt,d(e.role),1),C(`td`,ht,d(v(e.totalElapsedMs)),1),C(`td`,gt,d(g(O)(e.totalTokens)),1),C(`td`,_t,d(y(e.totalCostUsd,e.costSource)),1)]))),128))])])])])):n(``,!0),w.value.length?(f(),x(`div`,vt,[t[8]||=C(`div`,{class:`usage-subtitle`},`by day (server local time)`,-1),C(`div`,yt,[C(`table`,bt,[t[7]||=C(`thead`,null,[C(`tr`,null,[C(`th`,{class:`ta-left`},`date`),C(`th`,{class:`ta-right`},`time`),C(`th`,{class:`ta-right`},`tokens`),C(`th`,{class:`ta-right`},`cost`)])],-1),C(`tbody`,null,[(f(!0),x(m,null,a(w.value,e=>(f(),x(`tr`,{key:e.day,class:`usage-role`},[C(`td`,xt,d(e.day),1),C(`td`,St,d(v(e.totalElapsedMs)),1),C(`td`,Ct,d(g(O)(e.totalTokens)),1),C(`td`,wt,d(y(e.totalCostUsd,e.costSource)),1)]))),128))])])])])):n(``,!0)])):n(``,!0),o.value.costSource===`mixed`?(f(),x(`div`,Tt,` * mixed cost sources — estimates & credits shown alongside USD `)):n(``,!0)],64)):(f(),x(`div`,Et,`No AI usage recorded yet.`))]))}}),[[`__scopeId`,`data-v-cc9982ad`]]),Ot={class:`panel-title`},kt={key:0,class:`off-note`},At={key:1},jt={class:`headlines`},Mt={class:`metric`},Nt={class:`metric-val`},Pt={class:`metric-big`},Ft={class:`metric`},It={class:`metric-val`},Lt={class:`metric`},Rt={class:`metric-val`},zt={key:0,class:`decision-meta`},Bt=k(c({__name:`AutoEngineeringPanel`,setup(e){let a=D(),{autoEng:o}=b(a);t(()=>{a.refreshAutoEng()});let s=h(()=>o.value?.enabled??!1),c=h(()=>o.value?.maxActiveTasks??3),p=h(()=>o.value?.activeCount??0),m=h(()=>o.value?.availableSlots??0),g=h(()=>o.value?.reconciling??!1),_=h(()=>o.value?.decision??null),S=h(()=>{if(!s.value)return{text:`Off`,cls:`off`};if(g.value)return{text:`Deciding…`,cls:`busy`};if(!_.value)return{text:`Idle`,cls:`idle`};switch(_.value.outcome){case`selected`:return{text:`Started `+_.value.selectedIds.length,cls:`ok`};case`no-ready-work`:return{text:`Waiting for ready tasks`,cls:`warn`};case`no-capacity`:return{text:`At capacity`,cls:`idle`};case`pm-unavailable`:return{text:`PM unavailable`,cls:`err`};case`pm-failed`:return{text:`PM failed`,cls:`err`};default:return{text:`Idle`,cls:`idle`}}}),w=h(()=>{let e=_.value;if(!s.value)return`Automatic task selection is off. Enable it in Settings.`;if(g.value)return`Asking the PM agent which ready tasks should start…`;if(!e)return`No decision recorded yet — it will appear here after the first transition.`;switch(e.outcome){case`selected`:return e.rationale?`Started ${e.selectedIds.length} task${e.selectedIds.length===1?``:`s`} (${e.selectedIds.map(e=>`#${e}`).join(`, `)}). ${e.rationale}`:`Started ${e.selectedIds.length} task${e.selectedIds.length===1?``:`s`} (${e.selectedIds.map(e=>`#${e}`).join(`, `)}).`;case`no-capacity`:return`All ${e.maxActiveTasks} engineer slot${e.maxActiveTasks===1?``:`s`} are full.`;case`no-ready-work`:return`Capacity is open but there are no ready tasks — add or promote work to let auto-engineering start it.`;case`pm-unavailable`:return`No PM agent is configured, so nothing was started. Configure one on the Agents page.`;case`pm-failed`:return e.error?`The PM agent failed: ${e.error}`:`The PM agent run failed, so nothing was started.`;default:return``}});function T(e){try{return new Date(e).toLocaleTimeString()}catch{return e}}function E(e){switch(e){case`active-to-review`:return`task moved to review`;case`inbox-to-ready`:return`task moved to ready`;case`config-change`:return`settings changed`;case`startup`:return`server start`;default:return e}}return(e,t)=>{let a=v(`router-link`);return f(),l(j,{class:`ae-panel`,style:{"margin-bottom":`16px`}},{default:y(()=>[C(`div`,Ot,[t[0]||=i(` Auto-engineering `,-1),C(`span`,{class:u([`chip`,S.value.cls])},d(S.value.text),3)]),s.value?(f(),x(`div`,At,[C(`div`,jt,[C(`div`,Mt,[t[7]||=C(`div`,{class:`metric-label`},`Maximum active`,-1),C(`div`,Nt,[C(`span`,Pt,d(c.value),1),t[6]||=C(`span`,{class:`metric-sub`},`slots`,-1)])]),C(`div`,Ft,[t[9]||=C(`div`,{class:`metric-label`},`Active now`,-1),C(`div`,It,[C(`span`,{class:u([`metric-big`,{full:p.value>=c.value}])},d(p.value),3),t[8]||=C(`span`,{class:`metric-sub`},`in progress`,-1)])]),C(`div`,Lt,[t[11]||=C(`div`,{class:`metric-label`},`Open slots`,-1),C(`div`,Rt,[C(`span`,{class:u([`metric-big`,{free:m.value>0}])},d(m.value),3),t[10]||=C(`span`,{class:`metric-sub`},`available`,-1)])])]),C(`div`,{class:u([`status-line`,{warn:_.value?.outcome===`no-ready-work`,err:_.value?.outcome===`pm-unavailable`||_.value?.outcome===`pm-failed`}])},d(w.value),3),_.value?(f(),x(`div`,zt,[C(`span`,null,`Last check `+d(T(_.value.timestamp)),1),t[12]||=C(`span`,null,`·`,-1),C(`span`,null,`triggered by `+d(E(_.value.trigger)),1),t[13]||=C(`span`,null,`·`,-1),C(`span`,null,d(_.value.candidateIds.length)+` ready candidate`+d(_.value.candidateIds.length===1?``:`s`),1)])):n(``,!0)])):(f(),x(`div`,kt,[t[2]||=i(` Automatic task selection is `,-1),t[3]||=C(`b`,null,`off`,-1),t[4]||=i(`. Turn it on in `,-1),r(a,{to:`/settings`,class:`link`},{default:y(()=>[...t[1]||=[i(`Settings`,-1)]]),_:1}),t[5]||=i(` to keep engineer slots filled automatically. `,-1)]))]),_:1})}}}),[[`__scopeId`,`data-v-2ab91a52`]]),Vt={class:`panel-head`},Ht={class:`tag release-count`},Ut={key:0,class:`feed-empty`},Wt={key:1,class:`release-list`},Gt=[`aria-label`,`onClick`],Kt={class:`release-copy`},qt={class:`release-title`},Jt={class:`release-meta`},Yt=[`datetime`],Xt=k(c({__name:`ReleaseTimeline`,setup(e){let t=D(),n=A(),{tasks:r}=b(t),o=h(()=>M(r.value));function s(e){return e?new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`,year:new Date(e).getFullYear()===new Date().getFullYear()?void 0:`numeric`}).format(new Date(e)):``}return(e,t)=>(f(),l(j,{class:`release-panel`},{default:y(()=>[C(`div`,Vt,[t[0]||=C(`div`,{class:`panel-title`},[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`},[C(`path`,{d:`M5 12h14M13 6l6 6-6 6`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`})]),i(` Feature releases `)],-1),C(`span`,Ht,d(o.value.length)+` recent`,1)]),o.value.length?(f(),x(`div`,Wt,[(f(!0),x(m,null,a(o.value,e=>(f(),x(`button`,{key:e.id,class:`release-item`,type:`button`,"aria-label":`Open task ${e.id}: ${e.title}`,onClick:t=>g(n).openTask(e)},[t[1]||=C(`span`,{class:`release-rail`,"aria-hidden":`true`},[C(`span`,{class:`release-dot`}),C(`span`,{class:`release-line`})],-1),C(`span`,Kt,[C(`span`,qt,d(e.title),1),C(`span`,Jt,`#`+d(e.id)+` · `+d(e.area),1)]),C(`time`,{datetime:e.releasedAt||void 0,class:`release-date`},d(s(e.releasedAt)),9,Yt),t[2]||=C(`svg`,{class:`release-arrow`,viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`},[C(`path`,{d:`m9 6 6 6-6 6`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1)],8,Gt))),128))])):(f(),x(`div`,Ut,`Completed task merges will appear here.`))]),_:1}))}}),[[`__scopeId`,`data-v-329e1e7d`]]),Zt=/Test Files\s+(?:(\d+) failed \| )?(\d+) passed(?:\s*\((\d+)\))?/,Qt=/(?:^|\n)\s*Tests\s+(?:(\d+) failed \| )?(\d+) passed(?:\s*\|\s*(\d+) skipped)?\s*\((\d+)\)/,$t=/Duration\s+([\d.]+)s/;function en(e){let t=Zt.exec(e),n=Qt.exec(e);if(!t&&!n)return null;let r=$t.exec(e);return{testFilesFailed:t?Number(t[1]??0):0,testFilesPassed:t?Number(t[2]??0):0,testFilesTotal:t&&t[3]?Number(t[3]):t?Number(t[1]??0)+Number(t[2]??0):0,testsFailed:n?Number(n[1]??0):0,testsPassed:n?Number(n[2]??0):0,testsSkipped:n?Number(n[3]??0):0,testsTotal:n?Number(n[4]??0):0,durationSec:r?Number(r[1]):null}}function $(e){let t=new Set,n=[],r=/^\s*(?:❯\s+)?FAIL\s+(\S+)\s*(?:>\s*(.+))?$/gm,i;for(;i=r.exec(e);){let e=i[1],r=(i[2]??``).trim(),a=`${e}${r}`;t.has(a)||(t.add(a),n.push({file:e,test:r}))}return n}function tn(e){let t=e.match(/^\s*(?:✓|×|❯)\s+\S+\.test\.ts/gm);return t?t.length:0}var nn={class:`trp-head`},rn={key:0,class:`trp-elapsed`},an=[`disabled`],on={key:0,class:`trp-body`},sn={class:`trp-progress`},cn={key:0},ln={key:0},un={key:0,class:`trp-failures`},dn={class:`trp-failures-title`},fn={class:`trp-failure-file`},pn={key:0,class:`trp-failure-test`},mn={key:1,class:`trp-empty`},hn=k(c({__name:`TestRunPanel`,setup(r){let i=D(),{testRun:s}=b(i),c=_(!1);async function v(){if(!(c.value||s.value.running)){c.value=!0;try{await i.startTestRun()}catch(e){i.onError(e)}finally{c.value=!1}}}t(()=>{i.refreshTestRun()});let S=_(Date.now()),w;t(()=>{w=setInterval(()=>{S.value=Date.now()},1e3)}),p(()=>clearInterval(w));let T=h(()=>{let e=s.value.startedAt;if(!e)return 0;let t=s.value.finishedAt??new Date(S.value).toISOString();return Math.max(0,Date.parse(t)-Date.parse(e))});function E(e){let t=Math.floor(e/1e3);return`${Math.floor(t/60)}:${(t%60).toString().padStart(2,`0`)}`}let O=h(()=>en(s.value.output)),k=h(()=>$(s.value.output)),A=h(()=>tn(s.value.output)),M=h(()=>s.value.running?{label:`running…`,cls:`trp-running`}:s.value.finishedAt?s.value.code===0?{label:`passed`,cls:`trp-passed`}:{label:`failed`,cls:`trp-failed`}:{label:`idle`,cls:`trp-idle`}),N=_(null),P=_(!0);function F(){let e=N.value;e&&(P.value=e.scrollHeight-e.scrollTop-e.clientHeight<40)}return e(()=>s.value.output,()=>{P.value&&o(()=>{let e=N.value;e&&(e.scrollTop=e.scrollHeight)})}),(e,t)=>(f(),l(j,{class:`test-run-panel`},{default:y(()=>[C(`div`,nn,[t[0]||=C(`div`,{class:`panel-title`},`Test Suite`,-1),C(`span`,{class:u([`trp-status`,M.value.cls])},d(M.value.label),3),g(s).startedAt?(f(),x(`span`,rn,d(E(T.value)),1)):n(``,!0),C(`button`,{type:`button`,class:`trp-run`,disabled:c.value||g(s).running,onClick:v},d(g(s).running?`Running…`:`Run full test suite`),9,an)]),g(s).running||g(s).startedAt?(f(),x(`div`,on,[C(`div`,sn,[g(s).running?(f(),x(`span`,cn,d(A.value)+` test file`+d(A.value===1?``:`s`)+` seen so far`,1)):O.value?(f(),x(m,{key:1},[C(`span`,null,d(O.value.testFilesPassed)+`/`+d(O.value.testFilesTotal)+` files`,1),t[1]||=C(`span`,null,`·`,-1),C(`span`,{class:u({"trp-bad-count":O.value.testsFailed>0})},d(O.value.testsFailed>0?`${O.value.testsFailed} failed, `:``)+d(O.value.testsPassed)+` passed`+d(O.value.testsSkipped?`, ${O.value.testsSkipped} skipped`:``)+` of `+d(O.value.testsTotal),3),O.value.durationSec===null?n(``,!0):(f(),x(`span`,ln,`· `+d(O.value.durationSec.toFixed(1))+`s runtime`,1))],64)):n(``,!0)]),!g(s).running&&k.value.length?(f(),x(`div`,un,[C(`div`,dn,`Failures (`+d(k.value.length)+`)`,1),(f(!0),x(m,null,a(k.value,(e,t)=>(f(),x(`div`,{key:t,class:`trp-failure`},[C(`div`,fn,d(e.file),1),e.test?(f(),x(`div`,pn,d(e.test),1)):n(``,!0)]))),128))])):n(``,!0),C(`pre`,{ref_key:`logEl`,ref:N,class:`trp-log`,onScroll:F},d(g(s).output||`…`),545)])):(f(),x(`div`,mn,`No test run yet this session.`))]),_:1}))}}),[[`__scopeId`,`data-v-196b006d`]]),gn={style:{display:`flex`,"align-items":`flex-end`,"justify-content":`space-between`,"margin-bottom":`20px`}},_n={class:`page-desc`},vn={class:`control-usage`},yn={class:`stat-grid`},bn={class:`dash-grid`},xn=k(c({__name:`DashboardView`,setup(e){let t=D(),n=A(),{counts:a,repoName:o}=b(t);return(e,s)=>{let c=v(`router-link`);return f(),x(`div`,null,[C(`div`,gn,[C(`div`,null,[s[1]||=C(`div`,{class:`page-title`},`Mission Control`,-1),C(`div`,_n,d(g(o))+` · live from `+d(g(t).origin),1)]),r(E,{variant:`accent`,class:`new-btn`,onClick:s[0]||=e=>g(n).openNewTask()},{default:y(()=>[...s[2]||=[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`},[C(`path`,{d:`M12 5v14M5 12h14`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`})],-1),i(` New task `,-1)]]),_:1})]),C(`div`,vn,[r(Dt)]),r(Je),C(`div`,yn,[r(c,{to:{path:`/work`,query:{status:`draft`}},class:`stat-link`},{default:y(()=>[r(F,{label:`drafts`,value:g(a).draft||0,bg:`var(--chip-bg)`,color:`var(--txt-faint)`},{default:y(()=>[...s[3]||=[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`},[C(`path`,{d:`M4 7h16M4 12h16M4 17h10`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`})],-1)]]),_:1},8,[`value`])]),_:1}),r(c,{to:{path:`/work`,query:{status:`inbox`}},class:`stat-link`},{default:y(()=>[r(F,{label:`inbox`,value:g(a).inbox||0,bg:`rgba(138,150,180,0.12)`,color:`var(--txt-dim)`},{default:y(()=>[...s[4]||=[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`},[C(`path`,{d:`M4 6h16M4 12h16M4 18h10`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`})],-1)]]),_:1},8,[`value`])]),_:1}),r(c,{to:{path:`/work`,query:{status:`ready`}},class:`stat-link`},{default:y(()=>[r(F,{label:`ready to start`,value:g(a).ready||0,bg:`var(--cyan-dim)`,color:`var(--cyan)`},{default:y(()=>[...s[5]||=[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`},[C(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,"stroke-width":`1.8`}),C(`path`,{d:`M12 7v5l3 2`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`})],-1)]]),_:1},8,[`value`])]),_:1}),r(c,{to:{path:`/work`,query:{status:`active`}},class:`stat-link`},{default:y(()=>[r(F,{glow:``,label:`in progress`,value:g(a).active||0,bg:`var(--violet-tint)`,color:`var(--violet)`},{default:y(()=>[...s[6]||=[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`},[C(`path`,{d:`M3 12h4l2 5 4-12 2 7h6`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1)]]),_:1},8,[`value`])]),_:1}),r(c,{to:{path:`/work`,query:{status:`review`}},class:`stat-link`},{default:y(()=>[r(F,{label:`awaiting review`,value:g(a).review||0,bg:`var(--amber-tint)`,color:`var(--amber)`},{default:y(()=>[...s[7]||=[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`},[C(`path`,{d:`M9 12l2 2 4-4`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`}),C(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,"stroke-width":`1.8`})],-1)]]),_:1},8,[`value`])]),_:1}),r(c,{to:{path:`/work`,query:{status:`done`}},class:`stat-link`},{default:y(()=>[r(F,{label:`done`,value:g(a).done||0,bg:`var(--green-tint)`,color:`var(--green)`},{default:y(()=>[...s[8]||=[C(`svg`,{viewBox:`0 0 24 24`,fill:`none`},[C(`path`,{d:`M4 12l5 5L20 6`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1)]]),_:1},8,[`value`])]),_:1})]),r(Bt),C(`div`,bn,[r(Xt),r(H),r(Z)]),r(hn)])}}}),[[`__scopeId`,`data-v-93047e97`]]);export{xn as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.resource-panel[data-v-f2fe7214]{background:var(--panel-gradient,linear-gradient(180deg, #0c1222, #080c16));border:1px solid var(--border);border-radius:12px;margin-bottom:16px;padding:16px}.panel-title[data-v-f2fe7214]{text-transform:uppercase;letter-spacing:.06em;color:var(--txt-dim);margin-bottom:14px;font-size:12px;font-weight:600}.headlines[data-v-f2fe7214]{grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px;margin-bottom:14px;display:grid}.metric[data-v-f2fe7214]{flex-direction:column;gap:4px;display:flex}.serve-bad[data-v-f2fe7214]{color:var(--amber,#f5a524);font-weight:600}.serve-alert[data-v-f2fe7214]{border:1px solid var(--border);border-radius:8px;margin-bottom:12px;padding:10px 12px;font-size:12px;line-height:1.45}.serve-alert.notice[data-v-f2fe7214]{border-color:color-mix(in srgb, var(--amber,#f5a524) 40%, transparent);background:color-mix(in srgb, var(--amber,#f5a524) 8%, transparent);color:var(--txt)}.serve-alert.warn[data-v-f2fe7214]{border-color:color-mix(in srgb, var(--red,#f31260) 45%, transparent);background:color-mix(in srgb, var(--red,#f31260) 10%, transparent);color:var(--txt)}.serve-alert-head[data-v-f2fe7214]{align-items:flex-start;gap:8px;display:flex}.serve-alert-icon[data-v-f2fe7214]{border-radius:50%;flex:none;justify-content:center;align-items:center;width:16px;height:16px;margin-top:1px;font-size:11px;font-weight:700;display:inline-flex}.serve-alert.notice .serve-alert-icon[data-v-f2fe7214]{background:color-mix(in srgb, var(--amber,#f5a524) 25%, transparent);color:var(--amber,#f5a524)}.serve-alert.warn .serve-alert-icon[data-v-f2fe7214]{background:color-mix(in srgb, var(--red,#f31260) 25%, transparent);color:var(--red,#f31260)}.serve-alert-list[data-v-f2fe7214]{flex-wrap:wrap;gap:5px;margin-top:8px;padding-left:24px;display:flex}.serve-chip[data-v-f2fe7214]{font-family:var(--mono,ui-monospace, monospace);background:var(--chip-bg,#ffffff0f);color:var(--txt-dim);border-radius:5px;align-items:center;gap:4px;padding:1px 6px;font-size:11px;display:inline-flex}.chip-kill[data-v-f2fe7214]{color:inherit;opacity:.6;cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;line-height:1}.chip-kill[data-v-f2fe7214]:hover:not(:disabled){opacity:1;color:var(--red,#f31260)}.chip-kill[data-v-f2fe7214]:disabled{cursor:default;opacity:.3}.serve-chip.dead[data-v-f2fe7214]{color:var(--red,#f31260);background:color-mix(in srgb, var(--red,#f31260) 12%, transparent)}.serve-more[data-v-f2fe7214]{color:var(--txt-dim);align-self:center;font-size:11px}.metric-label[data-v-f2fe7214]{color:var(--txt-faint);text-transform:uppercase;letter-spacing:.04em;font-size:10px;font-weight:500}.metric-val[data-v-f2fe7214]{align-items:baseline;gap:6px;display:flex}.metric-big[data-v-f2fe7214]{color:var(--txt);font-variant-numeric:tabular-nums;font-size:20px;font-weight:700}.metric-sub[data-v-f2fe7214]{color:var(--txt-faint);font-size:11px}.metric-extra[data-v-f2fe7214]{color:var(--txt-faint);font-variant-numeric:tabular-nums;flex-direction:column;gap:2px;font-size:10px;display:flex}.metric-extra .wt-warn[data-v-f2fe7214]{color:var(--amber,#f5a524);font-weight:600}.sparkline[data-v-f2fe7214]{opacity:.6;width:100%;height:32px;margin-top:2px}.process-table-wrap[data-v-f2fe7214]{border-top:1px solid var(--border);padding-top:10px}.process-table-header[data-v-f2fe7214]{color:var(--txt-faint);text-transform:uppercase;letter-spacing:.04em;grid-template-columns:1fr 2fr 1fr 1.5fr 1.5fr .6fr;gap:6px;padding:4px 4px 6px;font-size:10px;font-weight:600;display:grid}.process-row[data-v-f2fe7214]{color:var(--txt-dim);font-variant-numeric:tabular-nums;border-bottom:1px solid #788cc80f;grid-template-columns:1fr 2fr 1fr 1.5fr 1.5fr .6fr;align-items:center;gap:6px;padding:6px 4px;font-size:12px;display:grid}.process-row[data-v-f2fe7214]:last-child{border-bottom:none}.process-row.orphaned[data-v-f2fe7214]{background:#ff6b7d0f;border-radius:4px}.process-row.orphaned .col-task[data-v-f2fe7214]{color:var(--red)}.pid-chip[data-v-f2fe7214]{background:var(--chip-bg);color:var(--txt-dim);border-radius:4px;padding:1px 6px;font-size:11px;font-weight:500;display:inline-block}.col-kill[data-v-f2fe7214]{text-align:right}.kill-btn[data-v-f2fe7214]{font-family:var(--mono,ui-monospace, monospace);text-transform:uppercase;letter-spacing:.04em;border:1px solid var(--red-border-tint,#ff6b7d40);color:var(--red,#f31260);cursor:pointer;background:0 0;border-radius:4px;padding:2px 7px;font-size:10px;font-weight:600}.kill-btn[data-v-f2fe7214]:hover:not(:disabled){background:var(--red-tint,#ff6b7d24)}.kill-btn[data-v-f2fe7214]:disabled{cursor:default;opacity:.5}.pid-chip.orphan[data-v-f2fe7214]{color:var(--red);background:#ff6b7d2e}.task-link[data-v-f2fe7214]{color:var(--cyan);font-weight:500;text-decoration:none}.task-link[data-v-f2fe7214]:hover{text-decoration:underline}.task-unknown[data-v-f2fe7214]{color:var(--txt-faint);font-style:italic}.orphan-tag[data-v-f2fe7214]{text-transform:uppercase;letter-spacing:.05em;color:var(--red);background:#ff6b7d24;border-radius:3px;margin-left:6px;padding:0 5px;font-size:9px;font-weight:700;display:inline-block}.unverified-tag[data-v-f2fe7214]{text-transform:uppercase;letter-spacing:.05em;color:var(--amber);background:#ffb45424;border-radius:3px;margin-left:4px;padding:0 5px;font-size:9px;font-weight:600;display:inline-block}@media (width<=1100px){.headlines[data-v-f2fe7214]{grid-template-columns:repeat(2,1fr)}}@media (width<=768px){.headlines[data-v-f2fe7214]{grid-template-columns:1fr}}.waiting[data-v-f2fe7214]{color:var(--txt-faint);align-items:center;gap:8px;padding:12px 0 4px;font-size:12px;display:flex}.waiting-dot[data-v-f2fe7214]{background:var(--amber);border-radius:50%;width:6px;height:6px;animation:2s ease-in-out infinite pulse-f2fe7214;display:inline-block}@keyframes pulse-f2fe7214{0%,to{opacity:.4}50%{opacity:1}}.usage-panel[data-v-cc9982ad]{border:1px solid var(--border);background:var(--panel-solid);border-radius:12px;padding:12px 14px;font-family:JetBrains Mono,monospace}.usage-head[data-v-cc9982ad]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin-bottom:10px;display:flex}.usage-title[data-v-cc9982ad]{text-transform:uppercase;letter-spacing:.08em;color:var(--txt-faint);font-size:10px}.usage-head-right[data-v-cc9982ad]{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:10px;display:flex}.usage-sessions[data-v-cc9982ad]{color:var(--cyan);font-size:10.5px}.usage-range[data-v-cc9982ad]{border:1px solid var(--border);border-radius:6px;display:flex;overflow:hidden}.usage-range-btn[data-v-cc9982ad]{color:var(--txt-faint);cursor:pointer;font:inherit;text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;background:0 0;border:none;padding:3px 7px;font-size:9px}.usage-range-btn+.usage-range-btn[data-v-cc9982ad]{border-left:1px solid var(--border)}.usage-range-btn[data-v-cc9982ad]:hover{color:var(--txt-dim)}.usage-range-btn.is-active[data-v-cc9982ad]{color:var(--cyan);background:var(--cyan-dim)}.usage-range-btn[data-v-cc9982ad]:focus-visible{outline:2px solid var(--cyan);outline-offset:-2px}.usage-grid[data-v-cc9982ad]{flex-wrap:wrap;gap:18px;display:flex}.usage-cell[data-v-cc9982ad]{flex-direction:column;gap:3px;display:flex}.usage-label[data-v-cc9982ad]{text-transform:uppercase;letter-spacing:.08em;color:var(--txt-faint);font-size:9px}.usage-value[data-v-cc9982ad]{color:var(--txt);font-size:15px;font-weight:600}.usage-breakdown[data-v-cc9982ad]{border-top:1px dashed var(--border);gap:10px 22px;margin-top:10px;padding-top:8px;display:grid}.usage-roles[data-v-cc9982ad],.usage-days[data-v-cc9982ad]{min-width:0}@media (width>=860px){.usage-breakdown[data-v-cc9982ad]{grid-template-columns:1fr 1fr;align-items:start}}.usage-subtitle[data-v-cc9982ad]{text-transform:uppercase;letter-spacing:.08em;color:var(--txt-faint);margin-bottom:6px;font-size:9px}.usage-table-wrap[data-v-cc9982ad]{margin-top:6px;overflow-x:auto}.usage-table[data-v-cc9982ad]{border-collapse:collapse;width:100%;color:var(--txt-dim);white-space:nowrap;font-size:11px}.usage-table th[data-v-cc9982ad],.usage-table td[data-v-cc9982ad]{text-align:right;border-bottom:1px solid var(--border);vertical-align:middle;padding:4px 8px}.usage-table td[data-v-cc9982ad]:first-child,.usage-table th[data-v-cc9982ad]:first-child{padding-left:0}.usage-table th[data-v-cc9982ad]{text-transform:uppercase;letter-spacing:.06em;color:var(--txt-faint);font-size:9.5px;font-weight:600}.ta-left[data-v-cc9982ad]{text-align:left!important}.ta-right[data-v-cc9982ad]{text-align:right!important}.usage-role-name[data-v-cc9982ad]{text-transform:capitalize;color:var(--cyan)}.usage-empty[data-v-cc9982ad]{color:var(--txt-dim);font-size:11.5px}.usage-error[data-v-cc9982ad]{color:var(--red);flex-wrap:wrap;align-items:center;gap:8px;font-size:11.5px;display:flex}.usage-error button[data-v-cc9982ad]{color:inherit;cursor:pointer;font:inherit;background:0 0;border:1px solid;border-radius:6px;padding:3px 7px}.usage-legend[data-v-cc9982ad]{color:var(--txt-faint);margin-top:6px;font-size:10px}.ae-panel[data-v-2ab91a52]{padding:16px}.panel-title[data-v-2ab91a52]{text-transform:uppercase;letter-spacing:.06em;color:var(--txt-dim);align-items:center;gap:10px;margin-bottom:14px;font-size:12px;font-weight:600;display:flex}.chip[data-v-2ab91a52]{letter-spacing:.02em;text-transform:none;border-radius:999px;padding:2px 9px;font-size:11px;font-weight:600}.chip.ok[data-v-2ab91a52]{background:var(--green-tint);color:var(--green)}.chip.warn[data-v-2ab91a52]{background:var(--amber-tint);color:var(--amber)}.chip.idle[data-v-2ab91a52]{background:var(--chip-bg,#8a96b41f);color:var(--txt-dim)}.chip.err[data-v-2ab91a52]{color:#ff7a7a;background:#ff5c5c24}.chip.off[data-v-2ab91a52]{background:var(--chip-bg,#8a96b41f);color:var(--txt-faint)}.chip.busy[data-v-2ab91a52]{background:var(--cyan-dim);color:var(--cyan)}.headlines[data-v-2ab91a52]{grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:12px;display:grid}.metric[data-v-2ab91a52]{flex-direction:column;gap:4px;display:flex}.metric-label[data-v-2ab91a52]{color:var(--txt-faint);font-size:11px}.metric-val[data-v-2ab91a52]{align-items:baseline;gap:6px;display:flex}.metric-big[data-v-2ab91a52]{font-variant-numeric:tabular-nums;font-size:26px;font-weight:700;line-height:1}.metric-big.full[data-v-2ab91a52]{color:var(--amber)}.metric-big.free[data-v-2ab91a52]{color:var(--green)}.metric-sub[data-v-2ab91a52]{color:var(--txt-dim);font-size:12px}.status-line[data-v-2ab91a52]{color:var(--txt-dim);background:var(--chip-bg,#8a96b41a);border-radius:9px;padding:10px 12px;font-size:13px}.status-line.warn[data-v-2ab91a52]{background:var(--amber-tint);color:var(--amber)}.status-line.err[data-v-2ab91a52]{color:#ff9a9a;background:#ff5c5c1a}.decision-meta[data-v-2ab91a52]{color:var(--txt-faint);flex-wrap:wrap;gap:6px;margin-top:10px;font-size:11px;display:flex}.off-note[data-v-2ab91a52]{color:var(--txt-dim);font-size:13px}.link[data-v-2ab91a52]{color:var(--cyan)}.release-panel[data-v-329e1e7d]{margin-bottom:18px}.release-count[data-v-329e1e7d]{background:var(--green-tint);color:var(--green)}.release-list[data-v-329e1e7d]{padding:4px 0}.release-item[data-v-329e1e7d]{appearance:none;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:12px;width:100%;min-width:0;padding:11px 17px;display:flex}.release-item[data-v-329e1e7d]:hover{background:var(--nav-hover-bg)}.release-item[data-v-329e1e7d]:focus-visible{outline:2px solid var(--cyan);outline-offset:-2px}.release-rail[data-v-329e1e7d]{flex-direction:column;flex:none;align-self:stretch;align-items:center;width:10px;display:flex}.release-dot[data-v-329e1e7d]{background:var(--green);width:8px;height:8px;box-shadow:0 0 7px color-mix(in srgb, var(--green) 65%, transparent);border-radius:50%;flex:none;margin-top:5px}.release-line[data-v-329e1e7d]{background:var(--border);flex:1;width:1px;margin:4px 0 0}.release-item:last-child .release-line[data-v-329e1e7d]{display:none}.release-copy[data-v-329e1e7d]{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.release-title[data-v-329e1e7d]{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;overflow:hidden}.release-meta[data-v-329e1e7d],.release-date[data-v-329e1e7d]{color:var(--txt-faint);font:10px JetBrains Mono,monospace}.release-date[data-v-329e1e7d]{flex:none}.release-arrow[data-v-329e1e7d]{width:14px;height:14px;color:var(--txt-faint);flex:none}.test-run-panel[data-v-196b006d]{background:var(--panel-gradient,linear-gradient(180deg, #0c1222, #080c16));border:1px solid var(--border);border-radius:12px;margin-bottom:16px;padding:16px}.panel-title[data-v-196b006d]{text-transform:uppercase;letter-spacing:.06em;color:var(--txt-dim);font-size:12px;font-weight:600}.trp-head[data-v-196b006d]{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.trp-status[data-v-196b006d]{text-transform:uppercase;letter-spacing:.04em;border-radius:999px;padding:2px 8px;font-family:JetBrains Mono,ui-monospace,monospace;font-size:10.5px;font-weight:600}.trp-idle[data-v-196b006d]{color:var(--txt-faint);background:var(--chip-bg)}.trp-running[data-v-196b006d]{color:var(--cyan);background:var(--cyan-dim)}.trp-passed[data-v-196b006d]{color:var(--green);background:var(--green-tint)}.trp-failed[data-v-196b006d]{color:var(--red);background:var(--red-tint)}.trp-elapsed[data-v-196b006d]{color:var(--txt-dim);font-variant-numeric:tabular-nums;font-family:JetBrains Mono,ui-monospace,monospace;font-size:12px}.trp-run[data-v-196b006d]{border:1px solid var(--cyan-dim);background:var(--cyan-dim);color:var(--cyan);cursor:pointer;border-radius:7px;margin-left:auto;padding:6px 12px;font-family:JetBrains Mono,ui-monospace,monospace;font-size:11px;font-weight:600}.trp-run[data-v-196b006d]:hover:not(:disabled){filter:brightness(1.15)}.trp-run[data-v-196b006d]:disabled{cursor:default;opacity:.6}.trp-body[data-v-196b006d]{flex-direction:column;gap:10px;margin-top:12px;display:flex}.trp-progress[data-v-196b006d]{color:var(--txt-dim);font-variant-numeric:tabular-nums;flex-wrap:wrap;gap:6px;font-size:12px;display:flex}.trp-bad-count[data-v-196b006d]{color:var(--red);font-weight:600}.trp-failures[data-v-196b006d]{border:1px solid var(--red-border-tint,#ff6b7d40);background:var(--red-tint);border-radius:8px;max-height:220px;padding:10px 12px;overflow-y:auto}.trp-failures-title[data-v-196b006d]{color:var(--red);text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px;font-size:11px;font-weight:700}.trp-failure[data-v-196b006d]{border-top:1px solid #ff6b7d26;padding:5px 0;font-size:12px}.trp-failure[data-v-196b006d]:first-child{border-top:none}.trp-failure-file[data-v-196b006d]{color:var(--txt);font-family:JetBrains Mono,ui-monospace,monospace;font-weight:600}.trp-failure-test[data-v-196b006d]{color:var(--txt-dim);margin-top:1px}.trp-log[data-v-196b006d]{background:var(--md-body-bg,#070a12);border:1px solid var(--border);color:var(--txt-dim);white-space:pre-wrap;word-break:break-word;border-radius:8px;max-height:320px;margin:0;padding:10px 12px;font-family:JetBrains Mono,ui-monospace,monospace;font-size:11px;line-height:1.5;overflow-y:auto}.trp-empty[data-v-196b006d]{color:var(--txt-faint);margin-top:10px;font-size:12px}.control-usage[data-v-93047e97]{margin-bottom:14px}.dash-grid[data-v-93047e97]{margin-bottom:18px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.dep-head[data-v-7715866a]{justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:22px;display:flex}.dep-title[data-v-7715866a]{letter-spacing:-.02em;margin:0;font-size:22px;font-weight:800}.dep-sub[data-v-7715866a]{color:var(--txt-dim);margin:3px 0 0;font-size:13px}.dep-sub code[data-v-7715866a]{font-family:var(--mono)}.dep-error[data-v-7715866a]{color:var(--red);margin:12px 0}.dep-panel[data-v-7715866a]{border:1px solid var(--border);background:var(--panel-gradient);border-radius:14px;padding:18px}.dep-branches[data-v-7715866a]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;margin-bottom:20px;display:grid}.dep-branch[data-v-7715866a]{border:1px solid var(--border);background:var(--panel-gradient);border-radius:14px;flex-direction:column;gap:9px;padding:16px 18px 16px 20px;display:flex;position:relative;overflow:hidden}.dep-branch[data-v-7715866a]:before{content:"";background:var(--accent);width:4px;position:absolute;top:0;bottom:0;left:0}.dep-branch-top[data-v-7715866a]{justify-content:space-between;align-items:center;gap:10px;display:flex}.dep-branch-name[data-v-7715866a]{font-family:var(--mono);font-size:15px;font-weight:700}.dep-ff[data-v-7715866a]{color:var(--txt-faint);border:1px solid var(--border);white-space:nowrap;border-radius:999px;padding:2px 9px;font-size:11px}.dep-branch-meta[data-v-7715866a]{color:var(--txt-faint);font-size:12px}.dep-branch-sync[data-v-7715866a]{display:flex}.dep-sync[data-v-7715866a]{color:var(--txt-dim);background:color-mix(in srgb, var(--border) 55%, transparent);border-radius:999px;padding:3px 9px;font-size:12.5px;font-weight:700}.dep-sync[data-state=same][data-v-7715866a]{color:var(--green);background:var(--green-tint)}.dep-sync[data-state=behind][data-v-7715866a]{color:var(--accent);background:color-mix(in srgb, var(--accent) 15%, transparent)}.dep-sync[data-state=ahead][data-v-7715866a],.dep-sync[data-state=diverged][data-v-7715866a]{color:var(--amber);background:var(--amber-tint)}.dep-branch .p-button[data-v-7715866a],.dep-branch button[data-v-7715866a]{align-self:flex-start;margin-top:2px}.dep-dirty[data-v-7715866a]{border:1px solid var(--amber-border-tint);background:var(--amber-tint);color:var(--amber);border-radius:12px;margin:0 0 16px;padding:10px 14px;font-size:13px}.dep-matrix[data-v-7715866a]{border:1px solid var(--border);background:var(--panel-gradient);border-radius:14px;overflow:hidden}.dep-matrix-row[data-v-7715866a]{grid-template-columns:minmax(160px,220px) repeat(auto-fit,minmax(160px,1fr));display:grid}.dep-matrix-row+.dep-matrix-row[data-v-7715866a]{border-top:1px solid var(--border)}.dep-matrix-head[data-v-7715866a]{background:color-mix(in srgb, var(--border) 30%, transparent);color:var(--txt-faint);text-transform:uppercase;letter-spacing:.06em;font-size:11.5px;font-weight:800}.dep-matrix-head>div[data-v-7715866a]{padding:11px 16px}.dep-matrix-colhead[data-v-7715866a]{border-left:1px solid var(--border);align-items:center;gap:7px;display:flex}.dep-dot[data-v-7715866a]{background:var(--accent);border-radius:50%;flex-shrink:0;width:8px;height:8px}.dep-service[data-v-7715866a]{border-right:1px solid var(--border);flex-direction:column;justify-content:center;padding:18px 16px;display:flex}.dep-service-name[data-v-7715866a]{font-size:14.5px;font-weight:750}.dep-service-type[data-v-7715866a]{color:var(--txt-faint);font-size:11.5px;font-family:var(--mono);margin-top:3px}.dep-cell[data-v-7715866a]{border-left:1px solid var(--border);flex-direction:column;gap:9px;padding:16px 16px 16px 19px;display:flex;position:relative}.dep-cellbar[data-v-7715866a]{background:var(--accent);opacity:.85;width:3px;position:absolute;top:0;bottom:0;left:0}.dep-cell-top[data-v-7715866a]{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.dep-nocell[data-v-7715866a]{color:var(--txt-faint);font-size:12.5px;font-style:italic}.dep-url[data-v-7715866a]{font-family:var(--mono);color:var(--accent);overflow-wrap:anywhere;font-size:13px;text-decoration:none}.dep-url[data-v-7715866a]:hover{text-decoration:underline}.dep-nourl[data-v-7715866a]{color:var(--txt-faint);font-size:12.5px;font-style:italic}.dep-fresh[data-v-7715866a]{color:var(--txt-faint);font-size:12px}.dep-fresh code[data-v-7715866a]{font-family:var(--mono);color:var(--txt-dim)}.dep-service-sync[data-v-7715866a]{color:var(--txt-faint);font-size:11.5px}.dep-cell-actions[data-v-7715866a]{align-items:center;gap:9px;margin-top:2px;display:flex}.dep-dash[data-v-7715866a]{color:var(--txt-dim);font-size:12px;text-decoration:none}.dep-dash[data-v-7715866a]:hover{color:var(--accent);text-decoration:underline}.dep-legend[data-v-7715866a]{color:var(--txt-faint);flex-wrap:wrap;align-items:center;gap:16px;margin-top:14px;font-size:12.5px;display:flex}.dep-legend>span[data-v-7715866a]:not(.dep-legend-note){align-items:center;gap:6px;display:inline-flex}.dep-legend-note[data-v-7715866a]{max-width:60ch}.dep-note[data-v-7715866a]{color:var(--txt-faint);max-width:72ch;margin:14px 2px 0;font-size:12px;line-height:1.55}.dep-empty[data-v-7715866a]{color:var(--txt-faint)}.dep-empty code[data-v-7715866a]{font-family:var(--mono);color:var(--txt-dim)}.dep-outcome[data-v-7715866a]{border:1px solid var(--border);white-space:pre-wrap;border-radius:12px;margin-top:16px;padding:12px 16px;font-size:13.5px}.dep-outcome--ok[data-v-7715866a]{border-color:var(--green-border-tint);background:var(--green-tint);color:var(--green)}.dep-outcome--fail[data-v-7715866a]{border-color:var(--red-border-tint);background:var(--red-tint);color:var(--red)}@media (width<=900px){.dep-matrix-row[data-v-7715866a]{grid-template-columns:1fr}.dep-matrix-head[data-v-7715866a]{display:none}.dep-service[data-v-7715866a]{border-right:0;border-bottom:1px solid var(--border);background:color-mix(in srgb, var(--border) 18%, transparent)}.dep-cell[data-v-7715866a]{border-left:0;border-top:1px solid var(--border)}}@media (width<=640px){.dep-branches[data-v-7715866a]{grid-template-columns:1fr}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{B as e,C as t,D as n,E as r,G as i,O as a,R as o,S as ee,Tt as s,U as c,_ as l,b as u,h as te,pt as d,rt as f,v as ne,w as p,wt as m,x as h}from"./vendor-vue-CobgyEJp.js";import{a as g,i as re,t as _}from"./button-lbikqSph.js";import{N as v}from"./index-BOQ-ust6.js";var ie={class:`dep-page`},ae={class:`dep-head`},oe={key:0,class:`spin`},se={key:1,class:`dep-err`},ce={key:0,class:`dep-panel dep-empty`},le={class:`dep-branches`,"aria-label":`Branch deploy state`},ue={class:`dep-branch-top`},de={class:`dep-branch-name`},fe=[`title`],pe={class:`dep-branch-meta`},me={class:`dep-branch-sync`},he=[`data-state`],ge={key:0,class:`dep-dirty`,role:`status`},_e={class:`dep-matrix`,role:`table`,"aria-label":`Deployment targets`},ve={class:`dep-matrix-row dep-matrix-head`,role:`row`},ye={class:`dep-service`,role:`rowheader`},be={class:`dep-service-name`},xe={key:0,class:`dep-service-type`},y={class:`dep-cell-top`},b=[`href`,`title`],x={key:1,class:`dep-nourl`},S=[`title`],C={key:0},w={key:0,class:`dep-service-sync`},T={class:`dep-cell-actions`},E=[`href`],D={key:1,class:`dep-nocell`},O={class:`dep-legend`},k={key:1,class:`dep-outcome dep-outcome--ok`,"aria-live":`polite`},A={key:2,class:`dep-outcome dep-outcome--fail`,role:`alert`},j={class:`dep-card`},M={class:`dep-modal-head`},Se={id:`dep-confirm-title`,class:`dep-modal-title`},Ce=[`disabled`],we={class:`dep-modal-body`},Te={class:`dep-modal-desc`},Ee={class:`dep-facts`},N={key:0},De={class:`dep-cmds`},Oe={key:0,class:`dep-modal-warn`},ke={key:1,class:`dep-modal-error`,role:`alert`},Ae={class:`dep-modal-actions`},P=v(a({__name:`DeploymentsView`,setup(a){let v=[`--cyan`,`--violet`,`--amber`,`--green`],P=d(null),F=d(!0),I=d(``),L=d(``),R=d(null),z=d(null),B=d(``),V=d(Date.now()),H=null,U=u(()=>R.value!==null),W=u(()=>P.value?.branches.find(e=>e.branch===R.value)??null),je=u(()=>P.value?.rows.filter(e=>e.branch===R.value).map(e=>e.name)??[]),G=u(()=>(W.value?.behind??0)>0?`origin/${R.value} has ${W.value?.behind} commit(s) this checkout hasn't fetched — the push will be refused if the histories diverged.`:``),Me=u(()=>{let e=R.value;return e?W.value?.ffFrom?[`git fetch . ${W.value.ffFrom}:${e}`,`git push origin ${e}`]:[`git push origin ${e}`]:[]}),Ne=u(()=>{let e=[],t=new Map;for(let n of P.value?.rows??[]){let r=t.get(n.service);r||(r={name:n.service,provider:n.provider,cells:new Map},t.set(n.service,r),e.push(n.service)),r.cells.set(n.branch,n)}return e.map(e=>t.get(e))});function K(e){return{"--accent":`var(${v[e%v.length]})`}}function q(e){return P.value?.rows.filter(t=>t.branch===e).length??0}let J=e=>e===1?`commit`:`commits`;function Pe(e){if(!e.hasOrigin)return`no origin/${e.branch} yet`;let t=e.mainSync;switch(t.state){case`same`:return`up to date with main`;case`behind`:return`${t.behindMain} ${J(t.behindMain)} behind main`;case`ahead`:return`${t.aheadOfMain} ${J(t.aheadOfMain)} ahead of main`;case`diverged`:return`diverged from main (${t.aheadOfMain} ahead, ${t.behindMain} behind)`;default:return`sync with main unknown`}}function Y(e,t){if(!e.subdir||!e.changesVsMain)return``;let{aheadOfMain:n,behindMain:r}=e.changesVsMain;switch(t.mainSync.state){case`behind`:return`${r} of ${t.mainSync.behindMain} behind-main ${J(t.mainSync.behindMain)} touch this service`;case`ahead`:return`${n} of ${t.mainSync.aheadOfMain} ahead-of-main ${J(t.mainSync.aheadOfMain)} touch this service`;case`diverged`:return`${r} of ${t.mainSync.behindMain} behind, ${n} of ${t.mainSync.aheadOfMain} ahead, touch this service`;default:return``}}async function X(){F.value=!0,I.value=``;try{P.value=await g(`/api/deployments`)}catch(e){I.value=e instanceof Error?e.message:String(e)}finally{F.value=!1}}function Z(e){B.value=``,R.value=e}function Q(){z.value===null&&(R.value=null)}function $(e){e.key===`Escape`&&U.value&&Q()}async function Fe(){let e=R.value;if(!(!e||z.value)){z.value=e,B.value=``;try{let t=await g(`/api/deployments/deploy`,re(`POST`,{branch:e}));L.value=t.output,R.value=null,await X()}catch(e){B.value=e instanceof Error?e.message:String(e)}finally{z.value=null}}}function Ie(e){if(!e)return``;let t=V.value-new Date(e).getTime();if(Number.isNaN(t))return``;if(t<0)return`just now`;let n=Math.floor(t/6e4);if(n<1)return`just now`;if(n<60)return`${n}m ago`;let r=Math.floor(n/60);if(r<24)return`${r}h ago`;let i=Math.floor(r/24);return i<30?`${i}d ago`:new Date(e).toLocaleDateString()}return e(()=>{X(),H=setInterval(()=>V.value=Date.now(),6e4),window.addEventListener(`keydown`,$)}),o(()=>{H&&clearInterval(H),window.removeEventListener(`keydown`,$)}),(e,a)=>(c(),p(`div`,ie,[h(`header`,ae,[a[1]||=h(`div`,null,[h(`h1`,{class:`dep-title`},`Deployments`),h(`p`,{class:`dep-sub`},[r(` Where this repo's services are live, and how far each is from what's on your local `),h(`code`,null,`main`),r(`. `)])],-1),n(_,{variant:`ghost`,size:`sm`,disabled:F.value,onClick:X},{default:f(()=>[...a[0]||=[r(`Refresh`,-1)]]),_:1},8,[`disabled`])]),F.value?(c(),p(`div`,oe)):I.value&&!P.value?(c(),p(`p`,se,s(I.value),1)):P.value?(c(),p(l,{key:2},[P.value.enabled?(c(),p(l,{key:1},[h(`section`,le,[(c(!0),p(l,null,i(P.value.branches,(e,i)=>(c(),p(`article`,{key:e.branch,class:`dep-branch`,style:m(K(i))},[h(`div`,ue,[h(`span`,de,s(e.branch),1),e.ffFrom?(c(),p(`span`,{key:0,class:`dep-ff`,title:`Deploys fast-forward ${e.branch} to ${e.ffFrom} before pushing`},` ff from `+s(e.ffFrom),9,fe)):t(``,!0)]),h(`div`,pe,s(q(e.branch))+` deployment target`+s(q(e.branch)===1?``:`s`),1),h(`div`,me,[h(`span`,{class:`dep-sync`,"data-state":e.hasOrigin?e.mainSync.state:`unknown`},s(Pe(e)),9,he)]),n(_,{variant:`accent`,size:`sm`,disabled:!e.localExists||!!P.value.dirty||z.value!==null,title:P.value.dirty?`Commit or stash the checkout's changes first`:void 0,onClick:t=>Z(e.branch)},{default:f(()=>[r(s(z.value===e.branch?`Deploying…`:`Deploy ${e.branch}`),1)]),_:2},1032,[`disabled`,`title`,`onClick`])],4))),128))]),P.value.dirty?(c(),p(`p`,ge,` The checkout has uncommitted changes — deploys are refused until it's committed or stashed (same guard as a release). `)):t(``,!0),h(`section`,_e,[h(`div`,ve,[a[4]||=h(`div`,{role:`columnheader`},`Service`,-1),(c(!0),p(l,null,i(P.value.branches,(e,t)=>(c(),p(`div`,{key:e.branch,class:`dep-matrix-colhead`,style:m(K(t)),role:`columnheader`},[a[3]||=h(`span`,{class:`dep-dot`},null,-1),r(s(e.branch),1)],4))),128))]),(c(!0),p(l,null,i(Ne.value,e=>(c(),p(`div`,{key:e.name,class:`dep-matrix-row`,role:`row`},[h(`div`,ye,[h(`div`,be,s(e.name),1),e.provider?(c(),p(`div`,xe,s(e.provider),1)):t(``,!0)]),(c(!0),p(l,null,i(P.value.branches,(i,o)=>(c(),p(`div`,{key:i.branch,class:`dep-cell`,style:m(K(o)),role:`cell`},[a[9]||=h(`span`,{class:`dep-cellbar`},null,-1),e.cells.get(i.branch)?(c(),p(l,{key:0},[h(`div`,y,[e.cells.get(i.branch).url?(c(),p(`a`,{key:0,class:`dep-url`,href:e.cells.get(i.branch).url,target:`_blank`,rel:`noreferrer`,title:`Open ${e.cells.get(i.branch).url}`},s(e.cells.get(i.branch).url.replace(/^https:\/\//,``))+`\xA0↗`,9,b)):(c(),p(`span`,x,`no URL configured`))]),h(`div`,{class:`dep-fresh`,title:e.cells.get(i.branch).lastPushAt??void 0},[e.cells.get(i.branch).lastPushAt?(c(),p(l,{key:0},[r(` Latest branch change `+s(Ie(e.cells.get(i.branch).lastPushAt))+` `,1),e.cells.get(i.branch).lastPushSha?(c(),p(l,{key:0},[a[5]||=r(` · `,-1),h(`code`,null,s(e.cells.get(i.branch).lastPushSha),1)],64)):t(``,!0)],64)):(c(),p(l,{key:1},[a[7]||=r(` no commits yet`,-1),e.cells.get(i.branch).subdir?(c(),p(`span`,C,[a[6]||=r(` under `,-1),h(`code`,null,s(e.cells.get(i.branch).subdir)+`/`,1)])):t(``,!0),a[8]||=r(` on `,-1),h(`code`,null,s(i.branch),1)],64))],8,S),Y(e.cells.get(i.branch),i)?(c(),p(`div`,w,s(Y(e.cells.get(i.branch),i)),1)):t(``,!0),h(`div`,T,[n(_,{variant:`ghost`,size:`sm`,disabled:!i.localExists||!!P.value.dirty||z.value!==null,onClick:e=>Z(i.branch)},{default:f(()=>[r(s(z.value===i.branch?`Deploying…`:`Deploy`),1)]),_:2},1032,[`disabled`,`onClick`]),e.cells.get(i.branch).dashboardUrl?(c(),p(`a`,{key:0,class:`dep-dash`,href:e.cells.get(i.branch).dashboardUrl,target:`_blank`,rel:`noreferrer`},`Dashboard ↗`,8,E)):t(``,!0)])],64)):(c(),p(`span`,D,`— not deployed on `+s(i.branch),1))],4))),128))]))),128))]),h(`div`,O,[(c(!0),p(l,null,i(P.value.branches,(e,t)=>(c(),p(`span`,{key:e.branch,style:m(K(t))},[a[10]||=h(`span`,{class:`dep-dot`},null,-1),r(s(e.branch),1)],4))),128)),a[11]||=h(`span`,{class:`dep-legend-note`},`RepoOS reads git state, not the provider's build result — click "Dashboard" on a target to check its real build status.`,-1)]),a[12]||=h(`p`,{class:`dep-note`},` “Latest branch change” is the newest commit on the branch touching this service's directory — the push that tells the provider to build. It is not confirmed build success: a broken build still shows a fresh time while the site serves an older version. Check the linked dashboard for the actual build/deploy result. The branch cards' "vs main" count is whole-branch; a service's own cell breaks down how much of that distance actually touches it, since the two can differ a lot when other parts of the repo are moving. `,-1),L.value?(c(),p(`section`,k,s(L.value),1)):t(``,!0),B.value&&!U.value?(c(),p(`section`,A,s(B.value),1)):t(``,!0)],64)):(c(),p(`div`,ce,[...a[2]||=[r(` Deployments aren't configured for this repository. Add a `,-1),h(`code`,null,`[[deployments]]`,-1),r(` block to `,-1),h(`code`,null,`repoos.toml`,-1),r(` — one per service and branch — to turn this page on. `,-1)]]))],64)):t(``,!0),(c(),ee(ne,{to:`body`},[U.value?(c(),p(`div`,{key:0,class:`dep-overlay`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`dep-confirm-title`,onClick:te(Q,[`self`])},[h(`div`,j,[h(`div`,M,[h(`h3`,Se,`Deploy `+s(R.value),1),h(`button`,{type:`button`,class:`close-x`,"aria-label":`Close`,disabled:z.value!==null,onClick:Q},` × `,8,Ce)]),h(`div`,we,[h(`p`,Te,[W.value?.ffFrom?(c(),p(l,{key:0},[a[13]||=r(` Fast-forwards `,-1),h(`code`,null,s(R.value),1),a[14]||=r(` to `,-1),h(`code`,null,s(W.value.ffFrom),1),a[15]||=r(`, then pushes to origin — your provider builds and deploys from the push. `,-1)],64)):(c(),p(l,{key:1},[a[16]||=r(` Runs `,-1),h(`code`,null,`git push origin `+s(R.value),1),a[17]||=r(` — your provider builds and deploys from the push. `,-1)],64)),a[18]||=r(` This is a real push to the shared remote. Non-fast-forward cases are refused; nothing is ever force-pushed. `,-1)]),h(`dl`,Ee,[h(`div`,null,[a[19]||=h(`dt`,null,`Deploys`,-1),h(`dd`,null,s(je.value.join(`, `)||`—`),1)]),W.value?.hasOrigin?(c(),p(`div`,N,[a[20]||=h(`dt`,null,`Unpushed`,-1),h(`dd`,null,s(W.value.ahead??`—`)+` commit(s) on `+s(R.value),1)])):t(``,!0)]),h(`ul`,De,[(c(!0),p(l,null,i(Me.value,e=>(c(),p(`li`,{key:e},[h(`code`,null,s(e),1)]))),128))]),G.value?(c(),p(`p`,Oe,s(G.value),1)):t(``,!0),B.value?(c(),p(`div`,ke,[h(`strong`,null,s(B.value),1)])):t(``,!0)]),h(`div`,Ae,[n(_,{variant:`accent`,disabled:z.value!==null,onClick:Fe},{default:f(()=>[r(s(z.value?`Deploying…`:`Deploy ${R.value}`),1)]),_:1},8,[`disabled`]),n(_,{variant:`ghost`,disabled:z.value!==null,onClick:Q},{default:f(()=>[...a[21]||=[r(`Cancel`,-1)]]),_:1},8,[`disabled`])])])])):t(``,!0)]))]))}}),[[`__scopeId`,`data-v-7715866a`]]);export{P as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,B as t,C as n,D as r,E as i,G as a,O as o,R as ee,S as s,St as c,Tt as l,U as u,_ as d,b as te,bt as f,h as p,i as ne,m as re,pt as m,r as ie,rt as h,w as g,wt as _,x as v}from"./vendor-vue-CobgyEJp.js";import{n as y,t as b}from"./button-lbikqSph.js";import{C as ae,J as oe,ct as x,d as S,it as C,v as w}from"./vendor-ui-DPm7zLxi.js";import{A as se,B as ce,D as le,E as ue,M as de,N as T,O as fe,T as pe,W as me,c as he,d as ge,f as _e,k as E,p as D,u as O}from"./index-BOQ-ust6.js";var k=o({__name:`checkbox`,props:{checked:{type:Boolean},class:{}},emits:[`update:checked`],setup(e,{emit:t}){let n=t;return(t,i)=>(u(),s(f(S),{checked:e.checked,class:c(f(y)(`flex size-[18px] shrink-0 items-center justify-center rounded-[5px] border border-[var(--border-bright)] bg-[var(--bg-secondary)] text-[var(--txt)] shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--txt-faint)] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-[var(--txt)] data-[state=checked]:bg-[var(--txt)] data-[state=checked]:text-[var(--bg)]`,t.$props.class)),"onUpdate:checked":i[0]||=e=>n(`update:checked`,e)},{default:h(()=>[r(f(w),null,{default:h(()=>[r(f(C),{class:`size-3`,"stroke-width":3})]),_:1})]),_:1},8,[`checked`,`class`]))}}),A={class:`inputs-page`},j={class:`inputs-header`},M={class:`input-filters`,role:`group`,"aria-label":`Filter inputs by status`},N={class:`filter-count`},P={key:0,class:`inputs-empty`},F={key:1,class:`input-list`},I=[`onClick`,`onKeyup`],ve={class:`input-row-main`},ye={class:`input-row-meta`},be={class:`input-number`},xe={key:0},Se={key:1},Ce={key:2},we={key:0,class:`attachment-meta`},Te={class:`drawer-head`},Ee={key:0,class:`drawer-body input-detail`},De={class:`detail-status`},Oe={class:`select-label`},ke={key:0,class:`detail-resolution`},Ae={class:`detail-meta`},L={class:`input-number`},je={key:0},Me={class:`detail-body`},Ne={key:1,class:`detail-actions`},Pe={key:2,class:`resolve-error`,role:`alert`},Fe={key:3,class:`detail-attachments`},Ie=[`src`,`alt`],Le=[`href`],R=`inputs-filter-selected`,z=T(o({__name:`InputsView`,setup(o){let y=me(),S=ce(),C=m([]),w=m(null),T=[{id:`new`,label:`New`,color:`#39e0ff`},{id:`reviewing`,label:`Reviewing`,color:`#ffb454`},{id:`processed`,label:`Processed`,color:`#4ef0a8`}],z=m(new Set([`new`,`reviewing`])),B=te(()=>C.value.filter(e=>z.value.has(e.status)));async function V(){C.value=await S.loadInputs()}function Re(){try{let e=localStorage.getItem(R);z.value=new Set(e?JSON.parse(e):[`new`,`reviewing`])}catch{z.value=new Set([`new`,`reviewing`])}}function ze(){try{localStorage.setItem(R,JSON.stringify(Array.from(z.value)))}catch{}}function Be(e){let t=new Set(z.value);t.has(e)?t.delete(e):t.add(e),z.value=t,ze()}async function H(e,t){e.status=t,await S.updateInput(e.id,t)}function U(e){return e===`new`?`reviewing`:e===`reviewing`?`processed`:null}function W(e){let t=U(e.status);t&&H(e,t)}function Ve(e){return T.find(t=>t.id===e)?.label??e}function G(e){w.value=e}function K(e){return e.number?`Input #${e.number}`:`Input`}let q=m(!1),J=m(``);async function He(){let e=w.value;if(!(!e||q.value)){q.value=!0,J.value=``;try{let t=await S.createFreeformTask(e.body,void 0,void 0,e.id);if(t.fallback){J.value=t.reason??`The PM agent could not create a task. Nothing was lost — try again.`;return}w.value=await S.resolveInput(e.id,`task`,t.task.id)}catch(e){J.value=e instanceof Error?e.message:String(e)}finally{q.value=!1}}}async function Ue(){let e=w.value;if(!(!e||q.value)){q.value=!0,J.value=``;try{w.value=await S.resolveInput(e.id,`none`)}catch(e){J.value=e instanceof Error?e.message:String(e)}finally{q.value=!1}}}function We(e){w.value=null,Z.push({path:`/work`,query:{task:e}})}function Y(){V()}t(()=>{Re(),V(),window.addEventListener(`repoos:inputs-updated`,Y)}),ee(()=>window.removeEventListener(`repoos:inputs-updated`,Y));let X=ie(),Z=ne();e(()=>X.query.input,e=>{if(!(typeof e!=`string`||!e)){if(e===`new`){y.openNewInput(),Q();return}$(e,0)}},{immediate:!0});async function Q(){let e={...X.query};delete e.input,await Z.replace({query:e})}function Ge(e){let t=e.replace(/^#/,``).trim();if(!t)return;let n=/^\d+$/.test(t)?[t,t.padStart(4,`0`)]:[t];return C.value.find(e=>e.number&&n.includes(e.number)||e.id===t)}function $(e,t){let n=Ge(e);n?(G(n),Q()):t<20&&window.setTimeout(()=>$(e,t+1),100)}return(e,t)=>(u(),g(`div`,A,[v(`div`,j,[t[6]||=v(`div`,null,[v(`div`,{class:`page-title`},`Inputs`),v(`div`,{class:`page-desc`},` Ideas, questions, bugs, and feedback waiting to be shaped into work or knowledge. `)],-1),r(b,{variant:`accent`,class:`new-btn`,onClick:f(y).openNewInput},{default:h(()=>[...t[5]||=[v(`span`,{class:`plus`},`+`,-1),i(` New input`,-1)]]),_:1},8,[`onClick`])]),v(`div`,M,[(u(),g(d,null,a(T,e=>v(`label`,{key:e.id,class:`input-filter`},[r(k,{checked:z.value.has(e.id),"onUpdate:checked":t=>Be(e.id)},null,8,[`checked`,`onUpdate:checked`]),v(`span`,{class:`status-dot`,style:_({background:e.color})},null,4),i(l(e.label)+` `,1),v(`span`,N,l(C.value.filter(t=>t.status===e.id).length),1)])),64))]),B.value.length?(u(),g(`div`,F,[(u(!0),g(d,null,a(B.value,e=>(u(),g(`article`,{key:e.id,class:`input-row`,tabindex:`0`,onClick:t=>G(e),onKeyup:re(t=>G(e),[`enter`])},[v(`div`,ve,[v(`div`,ye,[v(`span`,be,l(K(e)),1),v(`span`,{class:c([`input-status`,e.status])},[t[10]||=v(`span`,{class:`state-dot`},null,-1),i(l(e.status),1)],2),e.type?(u(),g(`span`,xe,l(e.type),1)):n(``,!0),e.area?(u(),g(`span`,Se,l(e.area),1)):n(``,!0),v(`span`,null,`by `+l(e.createdBy||`Unknown`),1),e.createdAt?(u(),g(`span`,Ce,l(new Date(e.createdAt).toLocaleDateString()),1)):n(``,!0)]),v(`h2`,null,l(e.title),1),v(`p`,null,l(e.body),1),e.attachments.length?(u(),g(`div`,we,l(e.attachments.length)+` attachment`+l(e.attachments.length===1?``:`s`),1)):n(``,!0)]),U(e.status)?(u(),s(b,{key:0,variant:`outline`,class:`move-next`,onClick:p(t=>W(e),[`stop`])},{default:h(()=>[r(f(x),{class:`size-3.5`}),v(`span`,{class:c([`state-dot`,`state-`+U(e.status)])},null,2),i(` Move to `+l(U(e.status)),1)]),_:2},1032,[`onClick`])):n(``,!0)],40,I))),128))])):(u(),g(`div`,P,[t[8]||=v(`div`,{class:`empty-title`},`No inputs here yet`,-1),t[9]||=v(`div`,null,`Capture an idea, question, bug, or observation for the team.`,-1),r(b,{variant:`outline`,onClick:f(y).openNewInput},{default:h(()=>[...t[7]||=[i(`Submit your first input`,-1)]]),_:1},8,[`onClick`])])),r(se,{open:!!w.value,"onUpdate:open":t[4]||=e=>{e||(w.value=null)}},{default:h(()=>[r(ue),r(fe,{style:_({width:f(y).drawerWidth+`px`,"max-width":`100vw`})},{default:h(()=>[v(`div`,{class:`drawer-resize`,onMousedown:t[0]||=p((...e)=>f(y).startResize&&f(y).startResize(...e),[`prevent`])},null,32),v(`div`,Te,[r(pe,null,{default:h(()=>[i(l(w.value?.title),1)]),_:1}),r(le,{class:`sr-only`},{default:h(()=>[...t[11]||=[i(`Input details`,-1)]]),_:1}),r(E,{class:`close-x`},{default:h(()=>[r(f(ae),{class:`size-[15px]`})]),_:1})]),w.value?(u(),g(`div`,Ee,[v(`div`,De,[r(D,{"model-value":w.value.status,"onUpdate:modelValue":t[1]||=e=>H(w.value,e??``)},{default:h(()=>[r(O,{class:`detail-select`},{default:h(()=>[v(`span`,Oe,[v(`span`,{class:c([`state-dot`,`state-`+w.value.status])},null,2),i(l(Ve(w.value.status)),1)])]),_:1}),r(_e,{position:`popper`},{default:h(()=>[r(he,{class:`min-w-[var(--radix-select-trigger-width)]`},{default:h(()=>[(u(),g(d,null,a(T,e=>r(ge,{key:e.id,value:e.id},{default:h(()=>[v(`span`,{class:c([`state-dot`,`state-`+e.id])},null,2),i(l(e.label),1)]),_:2},1032,[`value`])),64))]),_:1})]),_:1})]),_:1},8,[`model-value`]),U(w.value.status)?(u(),s(b,{key:0,variant:`outline`,class:`move-next`,onClick:t[2]||=e=>W(w.value)},{default:h(()=>[r(f(x),{class:`size-3.5`}),v(`span`,{class:c([`state-dot`,`state-`+U(w.value.status)])},null,2),i(` Move to `+l(U(w.value.status)),1)]),_:1})):n(``,!0)]),w.value.status===`processed`?(u(),g(`div`,ke,[w.value.resolution===`task`&&w.value.resolvedTask?(u(),g(d,{key:0},[t[12]||=i(` Resolved by `,-1),v(`button`,{type:`button`,class:`resolution-link`,onClick:t[3]||=e=>We(w.value.resolvedTask)},[i(` task #`+l(w.value.resolvedTask),1),r(f(oe),{class:`size-3.5`})])],64)):w.value.resolution===`none`?(u(),g(d,{key:1},[i(`No action taken.`)],64)):(u(),g(d,{key:2},[i(`No resolution recorded.`)],64))])):n(``,!0),v(`div`,Ae,[v(`span`,L,l(K(w.value)),1),v(`span`,null,l(w.value.type||`other`),1),v(`span`,null,l(w.value.area||`Unknown area`),1),v(`span`,null,`Created by `+l(w.value.createdBy||`Unknown`),1),w.value.createdAt?(u(),g(`span`,je,`Created `+l(f(de)(w.value.createdAt)),1)):n(``,!0)]),v(`div`,Me,l(w.value.body),1),w.value.status===`processed`?n(``,!0):(u(),g(`div`,Ne,[r(b,{variant:`accent`,disabled:q.value,onClick:He},{default:h(()=>[i(l(q.value?`Creating task…`:`Create task`),1)]),_:1},8,[`disabled`]),r(b,{variant:`outline`,disabled:q.value,onClick:Ue},{default:h(()=>[...t[13]||=[i(`Do nothing`,-1)]]),_:1},8,[`disabled`])])),J.value?(u(),g(`div`,Pe,l(J.value),1)):n(``,!0),w.value.attachments.length?(u(),g(`div`,Fe,[t[14]||=v(`strong`,null,`Attachments`,-1),(u(!0),g(d,null,a(w.value.attachments,e=>(u(),g(`div`,{key:e.name,class:`attachment-card`},[e.mime.startsWith(`image/`)?(u(),g(`img`,{key:0,src:`/api/inputs/${w.value.id}/attachments/${encodeURIComponent(e.name)}`,alt:e.name},null,8,Ie)):n(``,!0),v(`a`,{href:`/api/inputs/${w.value.id}/attachments/${encodeURIComponent(e.name)}`,target:`_blank`,rel:`noreferrer`},l(e.name),9,Le)]))),128))])):n(``,!0)])):n(``,!0)]),_:1},8,[`style`])]),_:1},8,[`open`])]))}}),[[`__scopeId`,`data-v-b0434ccb`]]);export{z as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.inputs-page[data-v-b0434ccb]{box-sizing:border-box;width:100%;padding:0 0 80px}.inputs-header[data-v-b0434ccb]{justify-content:space-between;align-items:flex-end;gap:20px;margin-bottom:22px;display:flex}.input-filters[data-v-b0434ccb]{background:var(--panel);border:1px solid var(--border);border-radius:11px;flex-wrap:wrap;gap:9px;margin-bottom:16px;padding:12px;display:flex}.input-filter[data-v-b0434ccb]{color:var(--txt-secondary);cursor:pointer;border-radius:8px;align-items:center;gap:7px;padding:7px 10px;font-size:12px;display:inline-flex}.input-filter[data-v-b0434ccb]:hover{background:var(--nav-hover-bg);color:var(--txt)}.input-filter input[data-v-b0434ccb]{accent-color:var(--cyan)}.status-dot[data-v-b0434ccb]{border-radius:50%;width:8px;height:8px}.filter-count[data-v-b0434ccb]{color:var(--txt-faint);font-family:var(--font-mono)}.input-list[data-v-b0434ccb]{flex-direction:column;gap:9px;display:flex}.input-row[data-v-b0434ccb]{background:var(--panel);border:1px solid var(--border);cursor:pointer;border-radius:11px;justify-content:space-between;gap:22px;padding:17px 18px;display:flex}.input-row[data-v-b0434ccb]:hover,.input-row[data-v-b0434ccb]:focus-visible{border-color:var(--border-focus);outline:none}.input-row-main[data-v-b0434ccb]{min-width:0}.input-row h2[data-v-b0434ccb]{color:var(--txt);margin:7px 0 5px;font-size:15px;font-weight:600}.input-row p[data-v-b0434ccb]{white-space:pre-wrap;color:var(--txt-secondary);margin:0;font-size:13px;line-height:1.5}.input-row-meta[data-v-b0434ccb],.detail-meta[data-v-b0434ccb]{color:var(--txt-faint);align-items:center;gap:10px;font-size:11px;display:flex}.input-number[data-v-b0434ccb]{font-family:var(--font-mono);letter-spacing:.02em;white-space:nowrap}.input-status[data-v-b0434ccb]{text-transform:capitalize;background:var(--bg-secondary);border-radius:999px;align-items:center;gap:6px;padding:3px 7px;display:inline-flex}.state-dot[data-v-b0434ccb]{background:currentColor;border-radius:50%;flex:none;width:7px;height:7px}.state-new[data-v-b0434ccb]{color:var(--cyan)}.state-reviewing[data-v-b0434ccb]{color:#ffb454}.state-processed[data-v-b0434ccb]{color:#4ef0a8}.input-status.new[data-v-b0434ccb]{color:var(--cyan)}.input-status.reviewing[data-v-b0434ccb]{color:#ffb454}.input-status.processed[data-v-b0434ccb]{color:#4ef0a8}.status-select[data-v-b0434ccb]{border:1px solid var(--border);background:var(--bg-secondary);min-width:110px;color:var(--txt-secondary);border-radius:7px;align-self:flex-start;padding:7px 8px;font-size:12px}.move-next[data-v-b0434ccb]{white-space:nowrap;align-self:flex-start}.input-row>.move-next[data-v-b0434ccb]{margin-left:auto}.attachment-meta[data-v-b0434ccb]{color:var(--txt-faint);margin-top:9px;font-size:11px}.inputs-empty[data-v-b0434ccb]{color:var(--txt-faint);text-align:center;border:1px dashed var(--border);border-radius:12px;flex-direction:column;align-items:center;gap:12px;padding:80px 20px;display:flex}.empty-title[data-v-b0434ccb]{color:var(--txt);font-size:15px;font-weight:600}.plus[data-v-b0434ccb]{font-size:18px;line-height:12px}.input-detail[data-v-b0434ccb]{flex-direction:column;gap:12px;display:flex}.detail-status[data-v-b0434ccb]{align-items:center;gap:10px;margin-top:-7px;display:flex}.detail-status .detail-select[data-v-b0434ccb]{align-self:auto;min-width:120px}.detail-body[data-v-b0434ccb]{white-space:pre-wrap;color:var(--txt);font-size:14px;line-height:1.65}.detail-resolution[data-v-b0434ccb]{color:var(--txt-secondary);flex-wrap:wrap;align-items:center;gap:5px;font-size:12px;display:flex}.resolution-link[data-v-b0434ccb]{color:var(--cyan);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:4px;padding:0;display:inline-flex}.resolution-link[data-v-b0434ccb]:hover{text-decoration:underline}.detail-actions[data-v-b0434ccb]{flex-wrap:wrap;gap:9px;padding-top:4px;display:flex}.resolve-error[data-v-b0434ccb]{border:1px solid var(--red-border-tint);background:var(--red-tint);color:var(--red);border-radius:8px;padding:9px 11px;font-size:12px;line-height:1.5}.detail-attachments[data-v-b0434ccb]{color:var(--txt-secondary);flex-direction:column;gap:9px;font-size:12px;display:flex}.attachment-card[data-v-b0434ccb]{border:1px solid var(--border);border-radius:8px;flex-direction:column;gap:5px;padding:8px;display:flex}.attachment-card img[data-v-b0434ccb]{object-fit:contain;background:var(--bg-secondary);border-radius:5px;max-width:100%;max-height:260px}.attachment-card a[data-v-b0434ccb]{color:var(--cyan);overflow-wrap:anywhere}.detail-select[data-v-b0434ccb]{align-self:stretch}@media (width<=650px){.inputs-page[data-v-b0434ccb]{box-sizing:border-box;width:100%;padding:20px 14px 70px}.inputs-header[data-v-b0434ccb]{flex-direction:column;align-items:flex-start}.input-row[data-v-b0434ccb]{flex-direction:column;gap:12px}.status-select[data-v-b0434ccb]{align-self:stretch}}.detail-select .select-label[data-v-b0434ccb]{align-items:center;gap:6px;display:flex}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.login-page[data-v-a84e9a41]{background:var(--body-gradient), var(--bg);width:100%;min-height:100dvh;font-family:var(--font-sans);justify-content:center;align-items:center;padding:24px;display:flex;position:relative;overflow:hidden}.login-page[data-v-a84e9a41]:before{content:"";pointer-events:none;background:radial-gradient(680px 420px at 15% 12%,#39e0ff24,#0000 60%),radial-gradient(720px 480px at 88% 92%,#9d7bff29,#0000 55%);position:absolute;inset:0}.login-card[data-v-a84e9a41]{background:var(--panel-solid);border:1px solid var(--border);box-shadow:var(--card-glow), 0 24px 60px -20px #00000073;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);border-radius:20px;width:100%;max-width:460px;padding:48px 44px;position:relative}.login-header[data-v-a84e9a41]{align-items:center;gap:14px;margin-bottom:20px;display:flex}.login-logo[data-v-a84e9a41]{background:conic-gradient(from 200deg, var(--cyan), var(--violet), var(--cyan));width:44px;height:44px;box-shadow:var(--logo-shadow);border-radius:13px;flex-shrink:0;place-items:center;display:grid;position:relative}.login-logo[data-v-a84e9a41]:after{content:"";background:var(--bg-2);border-radius:9px;position:absolute;inset:4px}.login-logo svg[data-v-a84e9a41]{z-index:1;position:relative}.login-header h1[data-v-a84e9a41]{letter-spacing:-.02em;color:var(--txt);margin:0;font-size:26px;font-weight:800}.login-tagline[data-v-a84e9a41]{letter-spacing:.18em;text-transform:uppercase;color:var(--txt-faint);margin-top:3px;font-size:10px;font-weight:600;display:block}.login-repo-badge[data-v-a84e9a41]{color:var(--cyan);background:var(--cyan-dim);border:1px solid var(--border-bright);border-radius:999px;margin-bottom:28px;padding:5px 13px;font-size:12px;font-weight:600;display:inline-block}.login-body h2[data-v-a84e9a41]{color:var(--txt);margin:0 0 8px;font-size:21px;font-weight:700}.login-subtitle[data-v-a84e9a41]{color:var(--txt-dim);margin:0 0 22px;font-size:14px;line-height:1.5}.login-form[data-v-a84e9a41]{flex-direction:column;gap:14px;display:flex}.login-input[data-v-a84e9a41]{border:1px solid var(--border);background:var(--panel);width:100%;color:var(--txt);border-radius:10px;outline:none;padding:12px 15px;font-family:inherit;font-size:15px;transition:border-color .15s,background-color .15s}.login-input[data-v-a84e9a41]::placeholder{color:var(--txt-faint)}.login-input[data-v-a84e9a41]:focus{border-color:var(--border-bright);background:var(--panel-solid)}.otp-input[data-v-a84e9a41]{text-align:center;letter-spacing:10px;font-family:JetBrains Mono,monospace;font-size:26px;font-weight:700}.login-btn[data-v-a84e9a41]{cursor:pointer;border:none;border-radius:10px;padding:12px 18px;font-family:inherit;font-size:15px;font-weight:600;transition:filter .15s,opacity .15s,background-color .15s,border-color .15s}.login-btn.primary[data-v-a84e9a41]{justify-content:center;align-items:center;gap:8px;display:inline-flex}.btn-spinner[data-v-a84e9a41]{opacity:.9;border:2px solid;border-top-color:#0000;border-radius:50%;flex-shrink:0;width:14px;height:14px;animation:.6s linear infinite spin-a84e9a41}.login-btn[data-v-a84e9a41]:disabled{opacity:.5;cursor:not-allowed}.login-btn.primary[data-v-a84e9a41]{background:var(--btn-primary-bg);color:var(--btn-primary-color);border:1px solid var(--border-bright)}.login-btn.primary[data-v-a84e9a41]:hover:not(:disabled){filter:brightness(1.12)}.login-btn.google[data-v-a84e9a41]{background:var(--panel);color:var(--txt);border:1px solid var(--border);justify-content:center;align-items:center;display:flex}.login-btn.google[data-v-a84e9a41]:hover:not(:disabled){border-color:var(--border-bright);background:var(--panel-solid)}.login-divider[data-v-a84e9a41]{text-align:center;margin:6px 0;position:relative}.login-divider[data-v-a84e9a41]:before{content:"";background:var(--border);height:1px;position:absolute;top:50%;left:0;right:0}.login-divider span[data-v-a84e9a41]{background:var(--panel-solid);color:var(--txt-faint);padding:0 12px;font-size:13px;position:relative}.login-actions[data-v-a84e9a41]{justify-content:center;gap:16px;margin-top:4px;display:flex}.login-link[data-v-a84e9a41]{color:var(--cyan);cursor:pointer;background:0 0;border:none;padding:4px;font-family:inherit;font-size:13px}.login-link[data-v-a84e9a41]:disabled{color:var(--txt-faint);cursor:not-allowed}.login-error[data-v-a84e9a41]{color:var(--red);text-align:center;margin-top:8px;font-size:13px}.login-loading[data-v-a84e9a41]{justify-content:center;padding:32px;display:flex}.spinner[data-v-a84e9a41]{border:3px solid var(--border);border-top-color:var(--cyan);border-radius:50%;width:26px;height:26px;animation:.6s linear infinite spin-a84e9a41}@keyframes spin-a84e9a41{to{transform:rotate(360deg)}}.login-no-provider[data-v-a84e9a41]{text-align:center;color:var(--txt-dim);padding:24px}@media (width<=520px){.login-card[data-v-a84e9a41]{padding:36px 26px}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{B as e,C as t,E as n,O as r,T as i,Tt as a,U as o,f as s,i as c,it as l,m as u,pt as d,r as f,w as p,x as m}from"./vendor-vue-CobgyEJp.js";import{N as h,P as ee}from"./index-BOQ-ust6.js";var te={class:`login-page`},ne={class:`login-card`},g={key:0,class:`login-repo-badge mono`},_={key:1,class:`login-loading`},v={key:2,class:`login-body`},y={class:`login-form`},b=[`disabled`],x={key:0,class:`login-error`},S={key:3,class:`login-body`},C={key:0,class:`login-form`},w={key:0},T={class:`mt-4 text-right`},E=[`disabled`],D={key:0,class:`btn-spinner`,"aria-hidden":`true`},re={key:1,class:`login-no-provider`},ie={key:2,class:`login-divider`},ae={viewBox:`0 0 24 24`,width:`18`,height:`18`,style:{"margin-right":`8px`}},oe={key:1,class:`login-form`},O={class:`login-subtitle`},k=[`disabled`],A={class:`login-actions`},j=[`disabled`],M={key:2,class:`login-error`},N=h(r({__name:`LoginView`,setup(r){let h=f(),N=c(),P=ee(),F=d(!1),I=d(!1),L=d(!1),R=d(!1),z=d(``),B=d(!0),V=d(`email`),H=d(``),U=d(``),W=d(!1),G=d(!1),K=d(``),q=d(0),J,Y=d(``),X=d(!1);async function se(){try{let e=await(await fetch(`/api/auth/status`)).json();if(F.value=e.enabled,I.value=e.bootstrapNeeded,L.value=e.hasGoogle,R.value=e.hasEmailProvider,z.value=e.repoName??``,!e.enabled){N.replace(`/`);return}if((await(await fetch(`/api/auth/me`)).json()).authenticated){await P.loadMe();let e=h.query.redirect||`/`;N.replace(e);return}}catch{}finally{B.value=!1}}e(se);function ce(){q.value=60,clearInterval(J),J=setInterval(()=>{q.value--,q.value<=0&&clearInterval(J)},1e3)}async function Z(){if(H.value.trim()){W.value=!0,K.value=``;try{let e=await fetch(`/api/auth/request-otp`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({email:H.value.trim().toLowerCase()})});if(e.ok)V.value=`otp`,ce();else{let t=await e.json();K.value=t.error||`Failed to send code`}}catch{K.value=`Network error — try again`}finally{W.value=!1}}}async function Q(){if(U.value.trim()){G.value=!0,K.value=``;try{let e=await fetch(`/api/auth/verify-otp`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({email:H.value.trim().toLowerCase(),code:U.value.trim()})});if(e.ok){await P.loadMe();let e=h.query.redirect||`/`;N.replace(e)}else{let t=await e.json();K.value=t.error||`Invalid code`,U.value=``}}catch{K.value=`Network error — try again`}finally{G.value=!1}}}async function $(){if(Y.value.trim()){X.value=!0,K.value=``;try{let e=await fetch(`/api/auth/bootstrap-admin`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({email:Y.value.trim().toLowerCase()})});if(e.ok)await P.loadMe(),N.replace(`/`);else{let t=await e.json();K.value=t.error||`Failed to create admin`}}catch{K.value=`Network error — try again`}finally{X.value=!1}}}function le(){window.location.href=`/api/auth/login/google`}return(e,r)=>(o(),p(`div`,te,[m(`div`,ne,[r[14]||=i(`<div class="login-header" data-v-a84e9a41><div class="login-logo" data-v-a84e9a41><svg width="20" height="20" viewBox="0 0 24 24" fill="none" data-v-a84e9a41><path d="M12 2L4 7v10l8 5 8-5V7l-8-5z" stroke="var(--cyan)" stroke-width="2" stroke-linejoin="round" data-v-a84e9a41></path><path d="M12 7v10M8 9.5v5M16 9.5v5" stroke="var(--violet)" stroke-width="1.5" stroke-linecap="round" data-v-a84e9a41></path></svg></div><div data-v-a84e9a41><h1 data-v-a84e9a41>RepoOS</h1><span class="login-tagline mono" data-v-a84e9a41>repo is the os</span></div></div>`,1),z.value?(o(),p(`div`,g,a(z.value),1)):t(``,!0),B.value?(o(),p(`div`,_,[...r[4]||=[m(`div`,{class:`spinner`},null,-1)]])):I.value?(o(),p(`div`,v,[r[5]||=m(`h2`,null,`Welcome — Set up your admin account`,-1),r[6]||=m(`p`,{class:`login-subtitle`},`Enter the email for the first administrator.`,-1),m(`div`,y,[l(m(`input`,{"onUpdate:modelValue":r[0]||=e=>Y.value=e,type:`email`,placeholder:`admin@example.com`,class:`login-input`,onKeyup:u($,[`enter`])},null,544),[[s,Y.value]]),m(`button`,{class:`login-btn primary`,disabled:X.value||!Y.value.trim(),onClick:$},a(X.value?`Setting up...`:`Create Admin`),9,b)]),K.value?(o(),p(`p`,x,a(K.value),1)):t(``,!0)])):(o(),p(`div`,S,[r[13]||=m(`h2`,null,`Sign in`,-1),V.value===`email`?(o(),p(`div`,C,[R.value?(o(),p(`div`,w,[r[7]||=m(`p`,{class:`login-subtitle`},`Enter your email to receive a one-time code.`,-1),l(m(`input`,{"onUpdate:modelValue":r[1]||=e=>H.value=e,type:`email`,placeholder:`you@example.com`,class:`login-input`,onKeyup:u(Z,[`enter`])},null,544),[[s,H.value]]),m(`p`,T,[m(`button`,{class:`login-btn primary`,disabled:W.value||!H.value.trim(),onClick:Z},[W.value?(o(),p(`span`,D)):t(``,!0),n(` `+a(W.value?`Sending...`:`Send code`),1)],8,E)])])):(o(),p(`div`,re,[...r[8]||=[m(`p`,null,`Email provider not configured.`,-1),m(`p`,null,`Contact your administrator.`,-1)]])),L.value?(o(),p(`div`,ie,[...r[9]||=[m(`span`,null,`or`,-1)]])):t(``,!0),L.value?(o(),p(`button`,{key:3,class:`login-btn google`,onClick:le},[(o(),p(`svg`,ae,[...r[10]||=[m(`path`,{d:`M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z`,fill:`#4285F4`},null,-1),m(`path`,{d:`M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z`,fill:`#34A853`},null,-1),m(`path`,{d:`M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z`,fill:`#FBBC05`},null,-1),m(`path`,{d:`M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z`,fill:`#EA4335`},null,-1)]])),r[11]||=n(` Sign in with Google `,-1)])):t(``,!0)])):t(``,!0),V.value===`otp`?(o(),p(`div`,oe,[m(`p`,O,[r[12]||=n(` Enter the 6-digit code sent to `,-1),m(`strong`,null,a(H.value),1)]),l(m(`input`,{"onUpdate:modelValue":r[2]||=e=>U.value=e,type:`text`,inputmode:`numeric`,maxlength:`6`,placeholder:`000000`,class:`login-input otp-input`,autocomplete:`one-time-code`,onKeyup:u(Q,[`enter`])},null,544),[[s,U.value]]),m(`button`,{class:`login-btn primary`,disabled:G.value||U.value.length!==6,onClick:Q},a(G.value?`Verifying...`:`Verify`),9,k),m(`div`,A,[m(`button`,{class:`login-link`,disabled:q.value>0,onClick:Z},a(q.value>0?`Resend in ${q.value}s`:`Resend code`),9,j),m(`button`,{class:`login-link`,onClick:r[3]||=e=>V.value=`email`},`Use a different email`)])])):t(``,!0),K.value?(o(),p(`p`,M,a(K.value),1)):t(``,!0)]))])]))}}),[[`__scopeId`,`data-v-a84e9a41`]]);export{N as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.rel-head[data-v-abbb939c]{justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:22px;display:flex}.rel-title[data-v-abbb939c]{letter-spacing:-.02em;margin:0;font-size:22px;font-weight:800}.rel-sub[data-v-abbb939c]{color:var(--txt-dim);margin:3px 0 0;font-size:13px}.rel-error[data-v-abbb939c]{color:var(--red);margin:12px 0}.rel-card[data-v-abbb939c]{border:1px solid var(--border);background:var(--panel-gradient);border-radius:14px;padding:22px}.rel-card-head[data-v-abbb939c]{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.rel-provider-name[data-v-abbb939c]{font-size:15px;font-weight:700}.rel-provider-meta[data-v-abbb939c]{color:var(--txt-faint);font-family:var(--mono);margin-top:2px;font-size:12px}.rel-pill[data-v-abbb939c]{letter-spacing:.03em;text-transform:uppercase;border:1px solid #0000;border-radius:999px;flex-shrink:0;padding:5px 11px;font-size:11px;font-weight:700}.rel-pill[data-phase=published][data-v-abbb939c]{color:var(--green);background:var(--green-tint);border-color:var(--green-border-tint)}.rel-pill[data-phase=prerelease][data-v-abbb939c]{color:var(--amber);background:var(--amber-tint);border-color:var(--amber-border-tint)}.rel-pill[data-phase=ready][data-v-abbb939c]{color:var(--cyan);background:var(--cyan-dim);border-color:color-mix(in srgb, var(--cyan) 30%, transparent)}.rel-pill[data-phase=blocked][data-v-abbb939c]{color:var(--amber);background:var(--amber-tint);border-color:var(--amber-border-tint)}.rel-pill[data-phase=releasing][data-v-abbb939c]{color:var(--violet);background:var(--violet-dim);border-color:var(--violet-border-tint)}.rel-lineage[data-v-abbb939c]{flex-wrap:wrap;align-items:center;gap:18px;margin:24px 0 14px;display:flex}.rel-node[data-v-abbb939c]{flex-direction:column;gap:4px;display:flex}.rel-ver[data-v-abbb939c]{font-family:var(--mono);font-weight:700;line-height:1}.rel-node--past .rel-ver[data-v-abbb939c]{color:var(--txt-dim);font-size:20px}.rel-node--next[data-v-abbb939c]{background:var(--btn-new-bg);border:1px solid var(--border-bright);border-radius:12px;padding:10px 16px}.rel-node--next .rel-ver[data-v-abbb939c]{color:var(--txt);font-size:26px}.rel-node-meta[data-v-abbb939c]{color:var(--txt-faint);font-size:11.5px}.rel-node-meta code[data-v-abbb939c]{font-family:var(--mono);color:var(--txt-dim)}.rel-arrow[data-v-abbb939c]{width:20px;height:20px;color:var(--txt-faint);flex-shrink:0}.rel-context[data-v-abbb939c]{color:var(--txt-faint);min-height:1em;font-size:12px}.rel-context code[data-v-abbb939c]{font-family:var(--mono);color:var(--txt-dim)}.rel-blockers[data-v-abbb939c]{border-left:2px solid var(--amber);color:var(--txt-dim);gap:5px;margin-top:16px;padding-left:12px;font-size:13px;display:grid}.rel-actions[data-v-abbb939c]{flex-wrap:wrap;align-items:center;gap:16px;margin-top:22px;display:flex}.rel-link[data-v-abbb939c]{color:var(--cyan);font-size:12.5px;text-decoration:none}.rel-link[data-v-abbb939c]:hover{text-decoration:underline}.rel-outcome[data-v-abbb939c]{border:1px solid var(--border);border-radius:12px;gap:8px;margin-top:16px;padding:14px 16px;display:grid}.rel-outcome--ok[data-v-abbb939c]{border-color:var(--green-border-tint);background:var(--green-tint)}.rel-outcome--fail[data-v-abbb939c]{border-color:var(--red-border-tint);background:var(--red-tint)}.rel-outcome-line[data-v-abbb939c]{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.rel-outcome--ok strong[data-v-abbb939c]{color:var(--green);font-size:13.5px}.rel-outcome--fail strong[data-v-abbb939c]{color:var(--red);font-size:13.5px;line-height:1.45}.rel-outcome-span[data-v-abbb939c]{color:var(--txt-faint);font-family:var(--mono);font-size:12px}.rel-log[data-v-abbb939c]{background:var(--bg-2);border:1px solid var(--border);max-width:100%;max-height:260px;color:var(--txt-dim);font-family:var(--mono);white-space:pre;tab-size:2;border-radius:8px;margin:0;padding:10px 12px;font-size:12px;line-height:1.5;overflow:auto}.rel-log[data-v-abbb939c]::-webkit-scrollbar-corner{background:0 0}.rel-debugger[data-v-abbb939c]{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.rel-debugger-err[data-v-abbb939c]{color:var(--txt-dim);font-size:12px}.rel-empty[data-v-abbb939c]{color:var(--txt-faint)}@media (width<=560px){.rel-lineage[data-v-abbb939c]{flex-direction:column;align-items:stretch;gap:12px}.rel-arrow[data-v-abbb939c]{align-self:center;transform:rotate(90deg)}}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{B as e,C as t,D as n,E as r,G as i,O as a,R as ee,St as te,Tt as o,U as s,_ as c,b as l,bt as u,f as d,it as f,m as ne,pt as p,rt as m,w as h,x as g}from"./vendor-vue-CobgyEJp.js";import{a as _,i as v,t as y}from"./button-lbikqSph.js";import{A as re,ct as ie,ot as b}from"./vendor-ui-DPm7zLxi.js";import{A as ae,D as oe,E as se,N as x,O as ce,T as le,k as S}from"./index-BOQ-ust6.js";import{t as ue}from"./releases-B0WNV-SY.js";var de={class:`releases-page`},fe={class:`rel-head`},pe={key:0,class:`spin`},me={key:1,class:`rel-error`},he={key:0,class:`rel-card rel-empty`},ge={class:`rel-card`},_e={class:`rel-card-head`},ve={class:`rel-provider-name`},ye={class:`rel-provider-meta`},be=[`data-phase`],xe={class:`rel-lineage`},Se={class:`rel-node rel-node--past`},Ce={class:`rel-ver`},we={key:0,class:`rel-node-meta`},Te={key:1,class:`rel-node-meta`},Ee={key:2,class:`rel-node-meta`},De={class:`rel-node rel-node--next`},Oe={class:`rel-ver`},ke={class:`rel-node-meta`},Ae={class:`rel-context`},je={key:0,class:`rel-blockers`},Me={class:`rel-actions`},Ne=[`href`],Pe=[`href`],Fe={key:0,class:`rel-outcome rel-outcome--ok`,"aria-live":`polite`},Ie={class:`rel-outcome-line`},Le={key:0,class:`rel-outcome-span`},Re=[`href`],ze={key:1,class:`rel-outcome rel-outcome--fail`,role:`alert`},Be={key:0,class:`rel-log`},Ve={class:`rel-debugger`},He={key:0,class:`rel-debugger-err`},Ue={class:`release-modal-head`},We={class:`release-modal-body`},Ge={class:`rel-modal-facts`},Ke={key:0,class:`release-progress`,"aria-live":`polite`},qe={key:0},Je={key:1},Ye={key:1,class:`release-modal-error`,role:`alert`},Xe={key:0,class:`rel-log`},Ze={class:`rel-debugger`},Qe={key:0,class:`rel-debugger-err`},$e={key:2,class:`rel-version-field`},et={class:`rel-version-input`},tt=[`placeholder`],nt={class:`rel-field-hint`},rt={key:3,class:`rel-notes-field`},it={class:`rel-notes-head`},at={key:0,class:`rel-notes-error`,role:`alert`},ot={class:`release-actions`},C=x(a({__name:`ReleasesView`,setup(a){let x=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?$/,C=p(null),w=p(!0),T=p(!1),E=p(!1),D=p(``),O=p(``),k=p(``),A=p(``),j=p(!1),M=p(``),N=p(``),P=p(!1),F=p(!1),I=p(``),L=p(null),R=p(Date.now()),z=null;function B(){z&&=(clearInterval(z),null)}function V(){z||=setInterval(()=>{R.value=Date.now(),yt()},1e3)}let H=l(()=>{let e=C.value?.tag,t=C.value?.version;return e&&t&&e.endsWith(t)?e.slice(0,-t.length):`v`}),U=l(()=>C.value?.released?C.value.version??null:null),W=l(()=>U.value?`${H.value}${U.value}`:C.value?.latestTag??null),G=l(()=>!!W.value?.includes(`-`)),K=l(()=>G.value&&C.value?.latestStableTag!==W.value?C.value?.latestStableTag??null:null),st=l(()=>C.value&&!C.value.released&&C.value.tag&&!C.value.tagExists?C.value.version:null),q=l(()=>st.value??ue(C.value?.version??null)),J=l(()=>q.value?`${H.value}${q.value}`:null),Y=l(()=>D.value?`${H.value}${D.value}`:``),ct=l(()=>D.value.includes(`-`)),lt=l(()=>x.test(D.value)&&D.value!==U.value&&Y.value!==C.value?.latestTag),X=l(()=>{let e=C.value?.blockers??[];return C.value?.released?e.filter(e=>!/ already exists\.$/.test(e)):e}),ut=l(()=>T.value?`releasing`:X.value.length?`blocked`:C.value?.released?G.value?`prerelease`:`published`:`ready`),dt=l(()=>({releasing:`Releasing…`,blocked:`Blocked`,prerelease:`Prerelease`,published:`Published`,ready:`Ready`})[ut.value]),ft=l(()=>!!C.value?.supported&&C.value.clean&&C.value.onReleaseBranch&&!T.value),pt=l(()=>{let e=L.value;return!e?.startedAt||!e.updatedAt||e.state===`idle`||e.state===`running`?``:mt(new Date(e.updatedAt).getTime()-new Date(e.startedAt).getTime())});function mt(e){let t=Math.max(0,Math.round(e/1e3));return t<60?`${t}s`:`${Math.floor(t/60)}m ${String(t%60).padStart(2,`0`)}s`}function Z(e){if(!e)return``;let t=R.value-new Date(e).getTime();if(t<0||Number.isNaN(t))return``;let n=Math.floor(t/6e4);if(n<1)return`just now`;if(n<60)return`${n}m ago`;let r=Math.floor(n/60);if(r<24)return`${r}h ago`;let i=Math.floor(r/24);return i<30?`${i}d ago`:new Date(e).toLocaleDateString()}async function Q(){w.value=!0,k.value=``;try{C.value=await _(`/api/release`)}catch(e){k.value=e instanceof Error?e.message:String(e)}finally{w.value=!1}}function ht(){O.value=``,k.value=``,N.value=``,D.value=``,A.value=``,M.value=``,j.value=!1,F.value=!1,I.value=``,E.value=!0}async function gt(){if(!(j.value||T.value)&&!(A.value.trim()&&!confirm(`Replace the release notes you've typed with an AI-generated draft?`))){j.value=!0,M.value=``;try{let e=await _(`/api/release/notes`,v(`POST`,{version:D.value||q.value||void 0}));e.notes.trim()?A.value=e.notes:M.value=e.sinceTag?`No commits since ${e.sinceTag} to draft from.`:`No commits to draft from.`}catch(e){M.value=e instanceof Error?e.message:String(e)}finally{j.value=!1}}}async function _t(){if(!(!lt.value||T.value)){T.value=!0,k.value=``,N.value=``,M.value=``,F.value=!1,I.value=``;try{let e=await _(`/api/release`,v(`POST`,{version:D.value,confirmTag:Y.value,notes:A.value.trim()||void 0}));L.value=e.run,V()}catch(e){k.value=e instanceof Error?e.message:String(e),await Q()}finally{L.value?.state!==`running`&&(T.value=!1)}}}function vt(e,t){let n=e?`during ${e.replace(/_/g,` `)}`:`during the run`;return/Test timed out in \d+\s*ms/i.test(t)?`Release failed ${n} — a test timed out. This is usually the known check-gate flake under memory pressure, not a regression; try cutting again before sending it to the Debugger.`:/\bFAIL\b|\b\d+ failed\b/.test(t)?`Release failed ${n} — one or more tests failed. See output below.`:/error TS\d+|\bType error\b|\btsc:/i.test(t)?`Release failed ${n} — TypeScript did not compile. See output below.`:/build is stale|staleness|dist .*out of date/i.test(t)?`Release failed ${n} — the build is stale. See output below.`:`Release failed ${n} — see output below.`}async function yt(){try{let e=await _(`/api/release/run`);if(L.value=e,e.state===`running`)return;if(B(),T.value=!1,e.state===`succeeded`)O.value=e.message,E.value=!1,await Q();else if(e.state===`failed`&&e.message){let t=e.message.split(`
|
|
2
|
+
`).filter(e=>e.trim());k.value=t.length>1?vt(e.phase,e.message):e.message,N.value=t.length>1?e.message:``}}catch{}}async function $(){if(!P.value){P.value=!0,I.value=``;try{let e=N.value||L.value?.message||k.value;await _(`/api/debugger/message`,v(`POST`,{text:[`The "Cut a release" flow failed for version ${D.value||C.value?.version||`?`} (tag ${Y.value||J.value||`?`}).`,`Phase: ${L.value?.phase??`unknown`}.`,`Current commit: ${C.value?.head??`unknown`} on ${C.value?.branch??`main`}.`,`Output:\n${e}`,`Identify the concrete cause and the smallest safe repair so the release can be retried.`].join(`
|
|
3
|
+
`)})),F.value=!0,window.dispatchEvent(new CustomEvent(`repoos:open-debugger`))}catch(e){I.value=e instanceof Error&&/disabled/i.test(e.message)?`Enable the Debugger on the Agents page to send it this failure.`:e instanceof Error?e.message:String(e)}finally{P.value=!1}}}function bt(){return L.value?.startedAt?`${mt(R.value-new Date(L.value.startedAt).getTime())} elapsed`:``}return e(()=>{Q(),yt(),V()}),ee(()=>{B()}),(e,a)=>(s(),h(`div`,de,[g(`header`,fe,[a[4]||=g(`div`,null,[g(`h1`,{class:`rel-title`},`Releases`),g(`p`,{class:`rel-sub`},`Cut and track tagged releases of this repository.`)],-1),n(y,{variant:`ghost`,size:`sm`,disabled:w.value,onClick:Q},{default:m(()=>[...a[3]||=[r(`Refresh`,-1)]]),_:1},8,[`disabled`])]),w.value?(s(),h(`div`,pe)):k.value&&!C.value?(s(),h(`p`,me,o(k.value),1)):C.value?(s(),h(c,{key:2},[C.value.enabled?(s(),h(c,{key:1},[g(`section`,ge,[g(`div`,_e,[g(`div`,null,[g(`div`,ve,o(C.value.name),1),g(`div`,ye,o(C.value.provider)+` · `+o(C.value.branch),1)]),g(`span`,{class:`rel-pill`,"data-phase":ut.value},o(dt.value),9,be)]),g(`div`,xe,[g(`div`,Se,[g(`span`,Ce,o(W.value??`no releases yet`),1),C.value.released?(s(),h(`span`,we,[r(` shipped `+o(Z(C.value.latestTagAt)||`—`)+` `,1),C.value.latestTagSha?(s(),h(c,{key:0},[a[5]||=r(` · `,-1),g(`code`,null,o(C.value.latestTagSha),1)],64)):t(``,!0)])):C.value.latestTag?(s(),h(`span`,Te,` last tag · `+o(Z(C.value.latestTagAt)||`—`),1)):t(``,!0),K.value?(s(),h(`span`,Ee,[a[6]||=r(` last stable · `,-1),g(`code`,null,o(K.value),1)])):t(``,!0)]),n(u(ie),{class:`rel-arrow`,"aria-hidden":`true`}),g(`div`,De,[g(`span`,Oe,o(J.value??`—`),1),g(`span`,ke,o(st.value?`ready to cut`:`suggested next`),1)])]),g(`div`,Ae,[C.value.head?(s(),h(c,{key:0},[a[7]||=r(` from `,-1),g(`code`,null,o(C.value.head),1),a[8]||=r(` on `,-1),g(`code`,null,o(C.value.branch),1)],64)):t(``,!0)]),X.value.length?(s(),h(`div`,je,[(s(!0),h(c,null,i(X.value,e=>(s(),h(`div`,{key:e},o(e),1))),128))])):t(``,!0),g(`div`,Me,[n(y,{variant:`accent`,disabled:!ft.value,onClick:ht},{default:m(()=>[r(o(q.value?`Cut ${H.value}${q.value}`:`Cut a release`),1)]),_:1},8,[`disabled`]),C.value.workflowUrl?(s(),h(`a`,{key:0,class:`rel-link`,href:C.value.workflowUrl,target:`_blank`,rel:`noreferrer`},`CI workflow ↗`,8,Ne)):t(``,!0),C.value.releaseUrl?(s(),h(`a`,{key:1,class:`rel-link`,href:C.value.releaseUrl,target:`_blank`,rel:`noreferrer`},`GitHub release ↗`,8,Pe)):t(``,!0)])]),O.value&&!k.value?(s(),h(`section`,Fe,[g(`div`,Ie,[g(`strong`,null,o(O.value),1),pt.value?(s(),h(`span`,Le,`took `+o(pt.value),1)):t(``,!0)]),C.value.workflowUrl?(s(),h(`a`,{key:0,class:`rel-link`,href:C.value.workflowUrl,target:`_blank`,rel:`noreferrer`},`Watch the build ↗`,8,Re)):t(``,!0)])):t(``,!0),k.value&&!E.value?(s(),h(`section`,ze,[g(`strong`,null,o(k.value),1),N.value?(s(),h(`pre`,Be,o(N.value),1)):t(``,!0),g(`div`,Ve,[n(y,{variant:`outline`,size:`sm`,disabled:P.value||F.value,onClick:$},{default:m(()=>[n(u(b),{class:`btn-ico`,"aria-hidden":`true`}),r(` `+o(F.value?`Sent to Debugger`:P.value?`Sending…`:`Send to Debugger`),1)]),_:1},8,[`disabled`]),I.value?(s(),h(`span`,He,o(I.value),1)):t(``,!0)])])):t(``,!0),n(ae,{open:E.value,"onUpdate:open":a[2]||=e=>E.value=e},{default:m(()=>[n(se),n(ce,{class:`release-modal`},{default:m(()=>[g(`div`,Ue,[n(le,null,{default:m(()=>[...a[9]||=[r(`Cut a release`,-1)]]),_:1}),n(S,{class:`close-x`,"aria-label":`Close`,disabled:T.value},{default:m(()=>[...a[10]||=[r(`×`,-1)]]),_:1},8,[`disabled`])]),g(`div`,We,[n(oe,null,{default:m(()=>[a[11]||=r(` Runs `,-1),a[12]||=g(`code`,null,`repoos check`,-1),a[13]||=r(`, pushes `,-1),g(`code`,null,o(C.value.branch),1),a[14]||=r(`, then pushes a tag. CI builds and publishes from that tag. `,-1)]),_:1}),g(`dl`,Ge,[g(`div`,null,[a[15]||=g(`dt`,null,`Currently published`,-1),g(`dd`,null,o(W.value??`nothing yet`),1)]),g(`div`,null,[a[16]||=g(`dt`,null,`Suggested next`,-1),g(`dd`,null,o(J.value??`—`),1)])]),T.value&&L.value?(s(),h(`div`,Ke,[g(`strong`,null,o(L.value.message),1),g(`span`,null,o(bt()),1),L.value.phase===`building`?(s(),h(`small`,qe,`Rebuilding so the check runs against fresh output.`)):L.value.phase===`checking`?(s(),h(`small`,Je,`Full verification usually takes 1–5 minutes.`)):t(``,!0)])):t(``,!0),k.value&&!T.value?(s(),h(`div`,Ye,[g(`strong`,null,o(k.value),1),N.value?(s(),h(`pre`,Xe,o(N.value),1)):t(``,!0),g(`div`,Ze,[n(y,{variant:`outline`,size:`sm`,disabled:P.value||F.value,onClick:$},{default:m(()=>[n(u(b),{class:`btn-ico`,"aria-hidden":`true`}),r(` `+o(F.value?`Sent to Debugger`:P.value?`Sending…`:`Send to Debugger`),1)]),_:1},8,[`disabled`]),I.value?(s(),h(`span`,Qe,o(I.value),1)):t(``,!0)])])):t(``,!0),T.value?t(``,!0):(s(),h(`label`,$e,[a[19]||=g(`span`,{class:`rel-field-label`},`New version`,-1),g(`div`,et,[f(g(`input`,{"onUpdate:modelValue":a[0]||=e=>D.value=e,placeholder:q.value??`0.0.0`,inputmode:`text`,autocapitalize:`none`,autocorrect:`off`,spellcheck:`false`,autofocus:``,onKeyup:ne(_t,[`enter`])},null,40,tt),[[d,D.value,void 0,{trim:!0}]]),g(`span`,{class:te([`rel-version-tag`,{dim:!D.value,pre:ct.value}])},[r(` → `+o(Y.value||`${H.value}${q.value??`0.0.0`}`)+` `,1),ct.value?(s(),h(c,{key:0},[r(` · prerelease`)],64)):t(``,!0)],2)]),g(`div`,nt,[g(`span`,null,`Just the number — no “`+o(H.value)+`”.`,1),a[17]||=g(`span`,null,[g(`b`,null,`Prerelease channel:`),r(` append `),g(`code`,null,`-beta.1`),r(` / `),g(`code`,null,`-canary.1`),r(` / `),g(`code`,null,`-rc.1`),r(`. `)],-1),a[18]||=g(`span`,null,[r(` CI flags it pre-release — users opt in with `),g(`code`,null,`repoos upgrade --channel <name>`),r(`. `)],-1)])])),T.value?t(``,!0):(s(),h(`div`,rt,[g(`div`,it,[a[20]||=g(`label`,{class:`rel-field-label`,for:`rel-notes`},[r(` Release notes `),g(`span`,{class:`rel-optional`},`optional`)],-1),n(y,{variant:`outline`,size:`sm`,type:`button`,disabled:j.value,onClick:gt},{default:m(()=>[n(u(re),{class:`btn-ico`,"aria-hidden":`true`}),r(` `+o(j.value?`Drafting…`:`Generate with AI`),1)]),_:1},8,[`disabled`])]),f(g(`textarea`,{id:`rel-notes`,"onUpdate:modelValue":a[1]||=e=>A.value=e,class:`rel-notes-input`,rows:`6`,placeholder:`What's in this release? Type it here, generate a draft from the commits since the last release, or leave empty.`},null,512),[[d,A.value]]),M.value?(s(),h(`div`,at,o(M.value),1)):t(``,!0)]))]),g(`div`,ot,[n(y,{variant:`accent`,disabled:!lt.value||T.value,onClick:_t},{default:m(()=>[r(o(T.value?`Publishing…`:Y.value?`Publish ${Y.value}`:`Publish`),1)]),_:1},8,[`disabled`]),n(S,{"as-child":``},{default:m(()=>[n(y,{variant:`ghost`,disabled:T.value},{default:m(()=>[...a[21]||=[r(`Cancel`,-1)]]),_:1},8,[`disabled`])]),_:1})])]),_:1})]),_:1},8,[`open`])],64)):(s(),h(`div`,he,` Releases aren't configured for this repository. `))],64)):t(``,!0)]))}}),[[`__scopeId`,`data-v-abbb939c`]]);export{C as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.auth-info[data-v-4b0bd6d1]{padding:12px 0}.auth-desc[data-v-4b0bd6d1]{color:var(--text-secondary,#666);margin:0;font-size:13px}.auth-add-row[data-v-4b0bd6d1]{align-items:center;gap:8px;padding:8px 0;display:flex}.auth-role-select[data-v-4b0bd6d1]{border:1px solid var(--border,#ddd);background:var(--surface,#fff);color:var(--text,#1a1a1a);border-radius:6px;padding:6px 10px;font-size:13px}.auth-error[data-v-4b0bd6d1]{color:#dc2626;margin:4px 0;font-size:12px}.auth-success[data-v-4b0bd6d1]{color:#16a34a;margin:4px 0;font-size:12px}.auth-loading[data-v-4b0bd6d1],.auth-empty[data-v-4b0bd6d1]{color:var(--text-secondary,#999);padding:12px 0;font-size:13px}.auth-user-list[data-v-4b0bd6d1]{padding:8px 0}.auth-user-row[data-v-4b0bd6d1]{border-bottom:1px solid var(--border-light,#f0f0f0);justify-content:space-between;align-items:center;padding:8px 0;display:flex}.auth-user-row[data-v-4b0bd6d1]:last-child{border-bottom:none}.auth-user-info[data-v-4b0bd6d1]{align-items:center;gap:8px;display:flex}.auth-user-email[data-v-4b0bd6d1]{font-size:14px;font-weight:500}.auth-user-role[data-v-4b0bd6d1]{border-radius:4px;padding:2px 6px;font-size:11px;font-weight:500}.auth-user-role.admin[data-v-4b0bd6d1]{color:#1e40af;background:#dbeafe}.auth-user-role.member[data-v-4b0bd6d1]{color:#374151;background:#f3f4f6}.auth-user-actions[data-v-4b0bd6d1]{gap:8px;display:flex}.auth-action[data-v-4b0bd6d1]{color:var(--accent,#3b82f6);cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:12px}.auth-action.danger[data-v-4b0bd6d1]{color:#dc2626}.auth-audit-toggle[data-v-4b0bd6d1]{padding:8px 0 0}.auth-link[data-v-4b0bd6d1]{color:var(--accent,#3b82f6);cursor:pointer;background:0 0;border:none;padding:0;font-size:13px}.auth-audit[data-v-4b0bd6d1]{padding:8px 0}.auth-audit-list[data-v-4b0bd6d1]{max-height:300px;overflow-y:auto}.auth-audit-entry[data-v-4b0bd6d1]{border-bottom:1px solid var(--border-light,#f0f0f0);align-items:center;gap:12px;padding:4px 0;font-size:12px;display:flex}.auth-audit-action[data-v-4b0bd6d1]{min-width:100px;font-weight:500}.auth-audit-target[data-v-4b0bd6d1]{min-width:140px}.auth-audit-actor[data-v-4b0bd6d1]{color:var(--text-secondary,#999);flex:1}.auth-audit-time[data-v-4b0bd6d1]{color:var(--text-secondary,#999);font-size:11px}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{$ as e,B as t,C as n,D as r,E as i,G as a,O as o,S as s,St as ee,Tt as c,U as l,V as te,_ as u,b as d,bt as f,d as p,dt as ne,f as m,h,i as re,it as ie,m as ae,pt as g,r as _,rt as v,w as y,wt as b,x}from"./vendor-vue-CobgyEJp.js";import{a as S,i as C,t as w}from"./button-lbikqSph.js";import{B as T,F as E,H as D,I as O,L as k,N as A,P as oe,U as j,V as M,W as N,c as P,d as F,f as I,l as L,m as R,n as z,p as se,u as ce,x as B}from"./index-BOQ-ust6.js";function V(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}var H=new Set([`[`,`]`,`{`,`}`,`,`,`=`,`.`]),le=/^(true|false)$/,U=/^[+-]?(\d[\d_]*(\.\d[\d_]*)?([eE][+-]?\d+)?|inf|nan|0x[0-9A-Fa-f_]+|0o[0-7_]+|0b[01_]+)$/,W=/^\d{4}-\d{2}-\d{2}([Tt ].*)?$/;function ue(e){let t=``,n=0;for(;n<e.length;){let r=e[n];if(r===` `||r===` `){t+=r,n++;continue}if(r===`#`){t+=`<span class="toml-comment">${V(e.slice(n))}</span>`;break}if(r===`"`||r===`'`){let i=r,a=e.startsWith(i.repeat(3),n),o=n+(a?3:1);if(a){for(;o<e.length&&!e.startsWith(i.repeat(3),o);)i===`"`&&e[o]===`\\`&&o++,o++;o=Math.min(e.length,o+3)}else for(;o<e.length;){if(i===`"`&&e[o]===`\\`){o+=2;continue}if(e[o]===i){o++;break}o++}t+=`<span class="toml-string">${V(e.slice(n,o))}</span>`,n=o;continue}if(H.has(r)){t+=`<span class="toml-punct">${V(r)}</span>`,n++;continue}let i=n;for(;i<e.length&&!` "'#`.includes(e[i])&&!H.has(e[i]);)i++;let a=e.slice(n,i),o=le.test(a)?`toml-bool`:U.test(a)||W.test(a)?`toml-number`:`toml-plain`;t+=`<span class="${o}">${V(a)}</span>`,n=i}return t}function G(e){let t=e.match(/^\s*/)?.[0]??``,n=e.slice(t.length),r=n.startsWith(`[[`)?`[[`:`[`,i=r===`[[`?`]]`:`]`,a=n.slice(r.length),o=a.endsWith(i);return o&&(a=a.slice(0,-i.length)),V(t)+`<span class="toml-punct">${r}</span><span class="toml-table">${V(a)}</span>`+(o?`<span class="toml-punct">${i}</span>`:``)}function de(e){let t=e.trim();if(!t||t.startsWith(`#`))return`<span class="toml-comment">${V(e)}</span>`;if(t.startsWith(`[`))return G(e);let n=e.indexOf(`=`);return n===-1?ue(e):`<span class="toml-key">${V(e.slice(0,n))}</span><span class="toml-punct">=</span>`+ue(e.slice(n+1))}function fe(e){return typeof e!=`string`||!e?``:e.split(`
|
|
2
|
+
`).map(de).join(`
|
|
3
|
+
`)}var pe={class:`setting-group`},me={class:`auth-add-row`},he={key:0,class:`auth-error`},ge={key:1,class:`auth-success`},_e={key:2,class:`auth-loading`},ve={key:3,class:`auth-empty`},ye={key:4,class:`auth-user-list`},K={class:`auth-user-info`},q={class:`auth-user-email`},be={class:`auth-user-actions`},xe=[`disabled`,`onClick`],Se=[`onClick`],Ce=[`onClick`],we={class:`auth-audit-toggle`},J={key:5,class:`auth-audit`},Te={key:0,class:`auth-loading`},Ee={key:1,class:`auth-empty`},Y={key:2,class:`auth-audit-list`},X={class:`auth-audit-action`},Z={class:`auth-audit-target`},Q={class:`auth-audit-actor`},$={class:`auth-audit-time`},De=A(o({__name:`AuthSettingsPanel`,setup(o){let te=re(),d=oe(),f=k();function ne(){f.loadDoc(`docs/native-auth.md`),te.push({name:`repo`})}let m=g([]),h=g([]),_=g(!1),b=g(!1),T=g(``),E=g(`member`),D=g(!1),O=g(``),A=g(``);g(!1);let j=g(!1),M=g(null);async function N(){_.value=!0;try{let e=await S(`/api/auth/users`);m.value=e.users}catch{}finally{_.value=!1}}async function P(){b.value=!0;try{let e=await S(`/api/auth/audit?limit=30`);h.value=e.entries}catch{}finally{b.value=!1}}async function F(){if(!T.value.trim())return;let e=T.value.trim().toLowerCase();D.value=!0,O.value=``,A.value=``;try{await S(`/api/auth/users`,C(`POST`,{email:e,role:E.value})),A.value=`Added ${e}`,T.value=``,E.value=`member`,await N(),confirm(`Send an invite email to ${e} now?`)&&await I(e)}catch(e){O.value=e instanceof Error?e.message:`Failed to add user`}finally{D.value=!1}}async function I(e){M.value=e,O.value=``,A.value=``;try{await S(`/api/auth/users/${encodeURIComponent(e)}/invite`,C(`POST`,{})),A.value=`Invite sent to ${e}`}catch(e){O.value=e instanceof Error?e.message:`Failed to send invite`}finally{M.value=null}}async function L(e){if(confirm(`Remove ${e}? Their sessions will be revoked.`)){O.value=``;try{await S(`/api/auth/users/${encodeURIComponent(e)}`,{method:`DELETE`}),await N()}catch(e){O.value=e instanceof Error?e.message:`Failed to remove user`}}}async function z(e){let t=e.role===`admin`?`member`:`admin`;if(t===`member`&&e.role===`admin`&&m.value.filter(e=>e.role===`admin`).length<=1){O.value=`Cannot demote the last admin`;return}O.value=``;try{await S(`/api/auth/users/${encodeURIComponent(e.email)}`,C(`PATCH`,{role:t})),await N()}catch(e){O.value=e instanceof Error?e.message:`Failed to change role`}}e(j,e=>{e&&h.value.length===0&&P()}),t(()=>{d.authEnabled&&N()});function se(e){try{return new Date(e).toLocaleString()}catch{return e}}return(e,t)=>(l(),s(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,pe,[t[8]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`Authentication & Users `)],-1),x(`div`,{class:`auth-info`},[x(`p`,{class:`auth-desc`},[t[3]||=i(` Authentication is configured via `,-1),t[4]||=x(`code`,null,`repoos.toml`,-1),t[5]||=i(` and requires a server restart. `,-1),x(`button`,{class:`model-pricing-link`,onClick:ne},`Setup guide →`),t[6]||=i(` Manage the allowed users and their roles below. `,-1)])]),x(`div`,me,[r(B,{modelValue:T.value,"onUpdate:modelValue":t[0]||=e=>T.value=e,type:`email`,placeholder:`user@example.com`,style:{flex:`1`,"max-width":`280px`},onKeyup:ae(F,[`enter`])},null,8,[`modelValue`]),ie(x(`select`,{"onUpdate:modelValue":t[1]||=e=>E.value=e,class:`auth-role-select`},[...t[7]||=[x(`option`,{value:`member`},`Member`,-1),x(`option`,{value:`admin`},`Admin`,-1)]],512),[[p,E.value]]),r(w,{size:`sm`,disabled:D.value||!T.value.trim(),onClick:F},{default:v(()=>[i(c(D.value?`Adding...`:`Add user`),1)]),_:1},8,[`disabled`])]),O.value?(l(),y(`p`,he,c(O.value),1)):n(``,!0),A.value?(l(),y(`p`,ge,c(A.value),1)):n(``,!0),_.value?(l(),y(`div`,_e,`Loading users...`)):m.value.length===0?(l(),y(`div`,ve,`No users added yet.`)):(l(),y(`div`,ye,[(l(!0),y(u,null,a(m.value,e=>(l(),y(`div`,{key:e.email,class:`auth-user-row`},[x(`div`,K,[x(`span`,q,c(e.email),1),x(`span`,{class:ee([`auth-user-role`,e.role])},c(e.role),3)]),x(`div`,be,[x(`button`,{class:`auth-action`,disabled:M.value===e.email,onClick:t=>I(e.email)},c(M.value===e.email?`Sending...`:`Invite`),9,xe),x(`button`,{class:`auth-action`,onClick:t=>z(e)},c(e.role===`admin`?`Demote`:`Promote`),9,Se),x(`button`,{class:`auth-action danger`,onClick:t=>L(e.email)},`Remove`,8,Ce)])]))),128))])),x(`div`,we,[x(`button`,{class:`auth-link`,onClick:t[2]||=e=>j.value=!j.value},c(j.value?`▾ Hide audit log`:`▸ Show audit log`),1)]),j.value?(l(),y(`div`,J,[b.value?(l(),y(`div`,Te,`Loading...`)):h.value.length===0?(l(),y(`div`,Ee,`No audit entries yet.`)):(l(),y(`div`,Y,[(l(!0),y(u,null,a(h.value,e=>(l(),y(`div`,{key:e.id,class:`auth-audit-entry`},[x(`span`,X,c(e.action),1),x(`span`,Z,c(e.targetEmail??`-`),1),x(`span`,Q,`by `+c(e.actorEmail??`system`),1),x(`span`,$,c(se(e.createdAt)),1)]))),128))]))])):n(``,!0)])]),_:1}))}}),[[`__scopeId`,`data-v-4b0bd6d1`]]),Oe={class:`page-desc`},ke={key:0},Ae={key:1,class:`save-msg err`},je={key:2,class:`save-msg ok`},Me={key:0,class:`spin`},Ne={key:1},Pe={class:`setting-group`},Fe=[`id`],Ie={class:`setting-info`},Le={class:`setting-label`},Re={class:`setting-desc`},ze={class:`setting-input`},Be={key:0,class:`restart-badge`},Ve={class:`setting-group`},He={class:`theme-list`},Ue=[`aria-pressed`,`aria-label`,`onClick`,`onKeydown`],We={class:`theme-name`},Ge={key:0,class:`theme-active-badge`},Ke=[`aria-pressed`,`aria-label`,`title`,`onClick`],qe={key:0,class:`theme-fav-note`,role:`status`},Je={class:`setting-group`},Ye={id:`setting-tunnelEnabled`,class:`setting-row`},Xe={class:`setting-input tunnel-setting-actions`},Ze={class:`tunnel-status-chip`},Qe={class:`setting-group`},$e={id:`setting-remoteValidation.enabled`,class:`setting-row`},et={class:`setting-input tunnel-setting-actions`},tt={class:`tunnel-status-chip`},nt={class:`setting-group`},rt={class:`ntfy-layout`},it={class:`ntfy-controls`},at={id:`setting-ntfyEnabled`,class:`setting-row`},ot={class:`setting-input`},st={id:`setting-ntfyTopic`,class:`setting-row`},ct={class:`setting-input`,style:{display:`flex`,gap:`8px`,"align-items":`center`}},lt={class:`setting-group`},ut={id:`setting-auth.enabled`,class:`setting-row`},dt={class:`setting-input`},ft={id:`setting-auth.sessionMaxAge`,class:`setting-row`},pt={class:`setting-input`},mt={class:`setting-group`},ht=[`id`],gt={class:`setting-info`},_t={class:`setting-label`},vt={class:`setting-desc`},yt={class:`setting-input`},bt={key:0,class:`restart-badge`},xt={class:`setting-group`},St={class:`setting-row`},Ct={class:`setting-input`},wt={class:`setting-row`},Tt={class:`setting-input`},Et={class:`setting-row`},Dt={class:`setting-info`},Ot={class:`setting-label`,style:{"font-weight":`500`}},kt={class:`setting-input`},At={class:`setting-info`},jt={class:`setting-label`},Mt={class:`setting-desc`},Nt={class:`setting-input`},Pt={class:`setting-group`},Ft={class:`setting-row`},It={class:`setting-input`},Lt={class:`setting-row`},Rt={class:`setting-input`},zt={class:`setting-group`},Bt={class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},Vt={key:0},Ht={key:1},Ut={key:0},Wt=[`id`],Gt={class:`setting-info`},Kt={class:`setting-label`},qt={class:`setting-desc`},Jt={class:`setting-input`},Yt={key:0,class:`restart-badge`},Xt={class:`setting-group`},Zt={class:`toml-raw`},Qt={class:`toml-raw-head`},$t={class:`toml-raw-actions`},en={class:`toml-editor`},tn=[`innerHTML`],nn=[`disabled`],rn={key:0,class:`setting-desc`,style:{padding:`8px 0 4px`}},an={key:1,class:`toml-raw-error`,role:`alert`},on={key:2,class:`setting-desc`,style:{padding:`8px 0 4px`}},sn={key:3,class:`setting-desc`,style:{padding:`8px 0 4px`}},cn=o({__name:`SettingsView`,setup(o){let p=O(),C=N();T();let k=j(),A=[`review`,`paused`,`stuck`,`needsInput`],oe=_(),V=re(),H=g(!1);async function le(){H.value=!0;try{await k.sendTestPush()}finally{H.value=!1}}let U=d(()=>{let e=k.availability;return{...{granted:{label:`granted`,color:`var(--green)`,tone:`ok`},default:{label:`not requested`,color:`var(--txt-dim)`,tone:`ok`},denied:{label:`blocked`,color:`var(--red)`,tone:`error`},insecure:{label:`unavailable (insecure origin)`,color:`var(--red)`,tone:`error`},unsupported:{label:`unsupported browser`,color:`var(--red)`,tone:`error`}}[e],help:e===`granted`&&k.pushEnabled?``:D[e]}}),W=g(null),ue=d(()=>W.value?.configured?.tunnelId?W.value.running?`Running`:W.value.originCertificate?.usable?`Configured but stopped`:`Needs attention`:`Not configured`),G=g(null),de=d(()=>{let e=G.value;return!e||!e.enabled?`Disabled`:!e.hasApiToken||!e.hasSshKey||!e.snapshotConfigured?`Needs setup`:e.running?e.activeServer?`Runner up · ${e.activeServer.ageMinutes}m`:`Ready`:`Enabled — restart to apply`});async function pe(){try{G.value=await S(`/api/remote-validation/status`)}catch{G.value=null}}t(async()=>{k.refreshAvailability();try{W.value=await S(`/api/tunnel/readiness?port=7171`)}catch{}pe(),(!p.rawLoaded||!p.rawDirty)&&p.loadRaw()});let me=g(null),he=g(null),ge=d(()=>fe(p.rawDraft));function _e(){let e=he.value,t=me.value;!e||!t||(t.scrollTop=e.scrollTop,t.scrollLeft=e.scrollLeft)}function ve(){p.rawDirty&&!window.confirm(`Discard your unsaved repoos.toml changes and reload from disk?`)||p.loadRaw()}function ye(){p.saveRaw()}let K=g(`idle`),q;async function be(){K.value=`sending`,clearTimeout(q);try{await S(`/api/ntfy/test`,{method:`POST`}),K.value=`sent`}catch{K.value=`failed`}q=setTimeout(()=>{K.value=`idle`},2e3)}let xe=d(()=>p.visibleFields.filter(e=>e.key!==`tunnelEnabled`&&e.key!==`ntfyEnabled`&&e.key!==`ntfyTopic`&&e.key!==`auth.enabled`&&e.key!==`auth.sessionMaxAge`&&!e.key.startsWith(`remoteValidation.`))),Se=d({get:()=>{let e=Number(Y[`auth.sessionMaxAge`]);return Number.isFinite(e)&&e>0?Math.round(e/86400*100)/100:30},set:e=>{!Number.isFinite(e)||e<=0||(Y[`auth.sessionMaxAge`]=String(Math.round(e*86400)))}});function Ce(e){let t=document.getElementById(`setting-${e}`);if(!t)return;t.scrollIntoView({behavior:`smooth`,block:`center`}),t.classList.add(`flash`),window.setTimeout(()=>t.classList.remove(`flash`),2e3);let n=t.querySelector(`input, select, [role='combobox']`);n&&n.focus()}let we={classic:{bg:`#0b1020`,a:`#39e0ff`,b:`#9d7bff`},clear:{bg:`#161b23`,a:`#5fb8e6`,b:`#9f8cf2`},"gen z":{bg:`#241a3d`,a:`#ff5df0`,b:`#b58cff`},jelly:{bg:`#1a2a44`,a:`#33e6c4`,b:`#ff5eb4`}};function J(e){return we[e]??{bg:`var(--panel-solid)`,a:`var(--cyan)`,b:`var(--violet)`}}function Te(e){p.toggleThemeFavorite(e)}let Ee=d(()=>oe.query.setting??oe.query.focus);e(Ee,e=>{if(!e)return;let t=(n=0)=>{p.loaded&&document.getElementById(`setting-${e}`)?(Ce(e),V.replace({name:`settings`})):n<20&&window.setTimeout(()=>t(n+1),100)};t()},{immediate:!0});let Y=ne({}),X=!1,Z,Q=!1,$=!1;function cn(){X=!0;for(let e of Object.keys(p.form))Y[e]=p.form[e];X=!1}e(()=>p.loaded,e=>{e&&cn()},{immediate:!0});function ln(){let e={};for(let t of p.schema){if(t.tier===`guarded`&&!p.showAdvanced)continue;let n=Y[t.key];t.type===`array`&&typeof n==`string`&&(n=n.split(`,`).map(e=>e.trim()).filter(Boolean)),e[t.key]=n}return e}async function un(){if(Q){$=!0;return}Q=!0,$=!1;let e=!1;try{await p.save(ln()),e=!0}catch{}finally{Q=!1,$?dn(0):e&&cn()}}function dn(e=450){clearTimeout(Z),Z=setTimeout(()=>void un(),e)}return e(Y,()=>{X||!p.loaded||(p.msg=``,p.error=``,Q&&($=!0),dn())},{deep:!0,flush:`sync`}),te(()=>{clearTimeout(Z),clearTimeout(q)}),(e,t)=>(l(),y(`div`,null,[t[44]||=x(`div`,{class:`page-title`},`Settings`,-1),x(`div`,Oe,[t[8]||=i(` RepoOS configuration · `,-1),t[9]||=x(`span`,{class:`mono`,style:{color:`var(--cyan)`}},`repoos.toml`,-1),f(p).saving?(l(),y(`span`,ke,` · Saving…`)):f(p).error?(l(),y(`span`,Ae,` · `+c(f(p).error),1)):f(p).msg?(l(),y(`span`,je,` · `+c(f(p).msg),1)):n(``,!0)]),f(p).loaded?(l(),y(`div`,Ne,[r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,Pe,[t[10]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`General `)],-1),(l(!0),y(u,null,a(xe.value,e=>(l(),y(`div`,{key:e.key,id:`setting-${e.key}`,class:`setting-row`},[x(`div`,Ie,[x(`div`,Le,c(e.label),1),x(`div`,Re,c(e.description),1)]),x(`div`,ze,[e.type===`select`?(l(),s(se,{key:0,"model-value":String(Y[e.key]),disabled:f(p).saving,"onUpdate:modelValue":t=>Y[e.key]=t},{default:v(()=>[r(ce,{class:`h-[34px] w-[200px] rounded-[9px] px-[11px]`},{default:v(()=>[r(L)]),_:1}),r(I,{position:`popper`},{default:v(()=>[r(P,{class:`min-w-[var(--radix-select-trigger-width)]`},{default:v(()=>[(l(!0),y(u,null,a(e.options,e=>(l(),s(F,{key:e.value,value:e.value},{default:v(()=>[i(c(e.label),1)]),_:2},1032,[`value`]))),128))]),_:2},1024)]),_:2},1024)]),_:2},1032,[`model-value`,`disabled`,`onUpdate:modelValue`])):e.type===`boolean`?(l(),s(z,{key:1,checked:!!Y[e.key],disabled:f(p).saving,"onUpdate:checked":t=>Y[e.key]=t},null,8,[`checked`,`disabled`,`onUpdate:checked`])):n(``,!0)]),e.restartRequired?(l(),y(`span`,Be,`restart required`)):n(``,!0)],8,Fe))),128))])]),_:1}),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,Ve,[t[12]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`Themes `)],-1),x(`div`,He,[(l(!0),y(u,null,a(f(E),e=>(l(),y(`div`,{key:e.id,class:ee([`theme-row`,{current:f(p).uiTheme===e.id}]),role:`button`,tabindex:`0`,"aria-pressed":f(p).uiTheme===e.id,"aria-label":`Use the ${e.label} theme`,onClick:t=>f(p).setUiTheme(e.id),onKeydown:ae(h(t=>f(p).setUiTheme(e.id),[`prevent`]),[`enter`])},[x(`span`,{class:`theme-swatch`,style:b({background:J(e.id).bg,"--sw-a":J(e.id).a,"--sw-b":J(e.id).b}),"aria-hidden":`true`},[...t[11]||=[x(`i`,null,null,-1),x(`i`,null,null,-1)]],4),x(`span`,We,[i(c(e.label)+` `,1),f(p).uiTheme===e.id?(l(),y(`span`,Ge,`active`)):n(``,!0)]),x(`button`,{type:`button`,class:ee([`theme-star`,{on:f(p).isThemeFavorite(e.id)}]),"aria-pressed":f(p).isThemeFavorite(e.id),"aria-label":f(p).isThemeFavorite(e.id)?`Remove ${e.label} from favorites`:`Add ${e.label} to favorites`,title:f(p).isThemeFavorite(e.id)?`Remove from favorites`:`Add to favorites`,onClick:h(t=>Te(e.id),[`stop`])},c(f(p).isThemeFavorite(e.id)?`★`:`☆`),11,Ke)],42,Ue))),128))]),f(p).themeFavoritesNotice?(l(),y(`div`,qe,c(f(p).themeFavoritesNotice),1)):n(``,!0),t[13]||=x(`div`,{class:`setting-desc`,style:{padding:`4px 0 10px`}},` Star up to 3 favorites — starred themes appear in the sidebar quick switcher. Click a theme to apply it. `,-1)])]),_:1}),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,Je,[t[16]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`Publishing `)],-1),x(`div`,Ye,[t[15]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Cloudflare publishing`),x(`div`,{class:`setting-desc`},` Configure a protected public hostname for a local RepoOS service. This card reports status; it does not start or stop cloudflared. `)],-1),x(`div`,Xe,[x(`span`,Ze,c(ue.value),1),r(w,{variant:`outline`,size:`sm`,onClick:t[0]||=e=>f(C).openTunnel()},{default:v(()=>[...t[14]||=[i(`Configure publishing`,-1)]]),_:1})])])])]),_:1}),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,Qe,[t[19]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`Remote validation `)],-1),x(`div`,$e,[t[18]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Remote validation runner`),x(`div`,{class:`setting-desc`},` Run the close-out build + test suite on a disposable Hetzner VM instead of this machine, so MTD isn't blocked by local memory pressure. Off by default; enabling sends repo contents to Hetzner. `)],-1),x(`div`,et,[x(`span`,tt,c(de.value),1),r(w,{variant:`outline`,size:`sm`,onClick:t[1]||=e=>f(C).openRemoteValidation()},{default:v(()=>[...t[17]||=[i(` Configure runner `,-1)]]),_:1})])])])]),_:1}),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,nt,[t[23]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`ntfy Notifications `)],-1),x(`div`,rt,[x(`div`,it,[x(`div`,at,[t[20]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Enable ntfy notifications`),x(`div`,{class:`setting-desc`},` When on, RepoOS publishes a message to your topic on task lifecycle events (moved to review, approved, or returned with issues). `)],-1),x(`div`,ot,[r(z,{checked:!!Y.ntfyEnabled,disabled:f(p).saving,"onUpdate:checked":t[2]||=e=>Y.ntfyEnabled=e},null,8,[`checked`,`disabled`])])]),x(`div`,st,[t[21]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Subscription topic`),x(`div`,{class:`setting-desc`},[i(` The ntfy topic RepoOS publishes events to, e.g. `),x(`code`,null,`repoos_myproject`),i(`. Leave empty to never send. `)])],-1),x(`div`,ct,[r(B,{"model-value":String(Y.ntfyTopic??``),type:`text`,placeholder:`repoos_myproject`,"onUpdate:modelValue":t[3]||=e=>Y.ntfyTopic=e},null,8,[`model-value`]),r(w,{size:`sm`,variant:`outline`,disabled:!Y.ntfyEnabled||!String(Y.ntfyTopic??``).trim(),onClick:be},{default:v(()=>[i(c(K.value===`sent`?`✓ Sent!`:K.value===`failed`?`✗ Failed`:`Send test`),1)]),_:1},8,[`disabled`])])])]),t[22]||=x(`aside`,{class:`ntfy-info`},[x(`h3`,null,`About ntfy`),x(`p`,null,[i(` ntfy is a free, open-source push notification service. Install the ntfy app on your phone from the App Store or Google Play, subscribe to a unique topic (e.g. `),x(`code`,null,`repoos_myproject`),i(`), and enter that topic below. `)]),x(`p`,null,[i(` Notifications are sent to `),x(`code`,null,`ntfy.sh`),i(` by default. Self-hosted ntfy instances work too — set the `),x(`code`,null,`NTFY_BASE_URL`),i(` environment variable (or the `),x(`code`,null,`ntfyBaseUrl`),i(` config key in `),x(`code`,null,`repoos.toml`),i(`). `)]),x(`a`,{href:`https://ntfy.sh/docs/subscribe/phone/`,target:`_blank`,rel:`noreferrer`},` ntfy install + subscribe guide → `)],-1)])])]),_:1}),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,lt,[t[28]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`Authentication `)],-1),x(`div`,ut,[t[24]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Authentication`),x(`div`,{class:`setting-desc`},` Require login to access RepoOS (email OTP or Google OAuth). `)],-1),x(`div`,dt,[r(z,{checked:!!Y[`auth.enabled`],disabled:f(p).saving,"onUpdate:checked":t[4]||=e=>Y[`auth.enabled`]=e},null,8,[`checked`,`disabled`])]),t[25]||=x(`span`,{class:`restart-badge`},`restart required`,-1)]),x(`div`,ft,[t[26]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Session duration (days)`),x(`div`,{class:`setting-desc`},` How long a login session lasts before requiring sign-in again. Default 30 days. `)],-1),x(`div`,pt,[r(B,{"model-value":Se.value,type:`number`,min:`1`,step:`1`,style:{width:`100px`},"onUpdate:modelValue":t[5]||=e=>Se.value=Number(e)},null,8,[`model-value`])]),t[27]||=x(`span`,{class:`restart-badge`},`restart required`,-1)])])]),_:1}),r(De),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,mt,[t[29]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`Voice transcription `)],-1),(l(!0),y(u,null,a(f(p).voiceFields,e=>(l(),y(`div`,{key:e.key,id:`setting-${e.key}`,class:`setting-row`},[x(`div`,gt,[x(`div`,_t,c(e.label),1),x(`div`,vt,c(e.description),1)]),x(`div`,yt,[e.type===`select`?(l(),s(se,{key:0,"model-value":String(Y[e.key]),disabled:f(p).saving,"onUpdate:modelValue":t=>Y[e.key]=t},{default:v(()=>[r(ce,{class:`h-[34px] w-[200px] rounded-[9px] px-[11px]`},{default:v(()=>[r(L)]),_:1}),r(I,{position:`popper`},{default:v(()=>[r(P,{class:`min-w-[var(--radix-select-trigger-width)]`},{default:v(()=>[(l(!0),y(u,null,a(e.options,e=>(l(),s(F,{key:e.value,value:e.value},{default:v(()=>[i(c(e.label),1)]),_:2},1032,[`value`]))),128))]),_:2},1024)]),_:2},1024)]),_:2},1032,[`model-value`,`disabled`,`onUpdate:modelValue`])):e.type===`string`?(l(),s(B,{key:1,"model-value":String(Y[e.key]??``),type:`password`,autocomplete:`new-password`,placeholder:`sk-… or gsk_…`,"onUpdate:modelValue":t=>Y[e.key]=t},null,8,[`model-value`,`onUpdate:modelValue`])):n(``,!0)]),e.restartRequired?(l(),y(`span`,bt,`restart required`)):n(``,!0)],8,ht))),128))])]),_:1}),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,xt,[t[33]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`Attention Notifications `)],-1),x(`div`,St,[t[30]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Sound notifications`),x(`div`,{class:`setting-desc`},` Play a bell sound on your computer when a task moves into a state that needs you. Off by default. `)],-1),x(`div`,Ct,[r(z,{checked:f(k).soundEnabled,"onUpdate:checked":f(k).setSoundEnabled},null,8,[`checked`,`onUpdate:checked`])])]),x(`div`,wt,[t[31]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Push notifications`),x(`div`,{class:`setting-desc`},` Send a notification through your computer's notification system when a task moves into a state that needs you. Turning this on will ask for permission. Requires a RepoOS tab to stay open — there's no background service worker. `)],-1),x(`div`,Tt,[r(z,{checked:f(k).pushEnabled,"onUpdate:checked":f(k).setPushEnabled},null,8,[`checked`,`onUpdate:checked`])])]),x(`div`,Et,[x(`div`,Dt,[x(`div`,Ot,[t[32]||=i(` Browser permission: `,-1),x(`span`,{style:b({color:U.value.color})},c(U.value.label),5)]),U.value.help?(l(),y(`div`,{key:0,class:`setting-desc`,style:b({color:U.value.tone===`error`?`var(--red)`:`var(--txt-dim)`})},c(U.value.help),5)):n(``,!0),f(k).testResult?(l(),y(`div`,{key:1,class:`setting-desc`,style:b({marginTop:`4px`,color:f(k).testResult.ok?`var(--green)`:`var(--red)`})},c(f(k).testResult.detail),5)):n(``,!0)]),x(`div`,kt,[r(w,{variant:`outline`,size:`sm`,disabled:H.value,onClick:le},{default:v(()=>[i(c(H.value?`Sending…`:`Send test`),1)]),_:1},8,[`disabled`])])]),t[34]||=x(`div`,{style:{"font-size":`11px`,"letter-spacing":`0.1em`,"text-transform":`uppercase`,color:`var(--txt-faint)`,"font-weight":`600`,"padding-top":`8px`}},` Events `,-1),(l(),y(u,null,a(A,e=>x(`div`,{key:e,class:`setting-row`},[x(`div`,At,[x(`div`,jt,c(f(M)[e]),1),x(`div`,Mt,c(e===`review`?`A task moved from active to review, ready for your sign-off.`:e===`paused`?`A running task was paused.`:e===`stuck`?`A task was surfaced as stuck (no progress detected).`:`A task explicitly needs your attention.`),1)]),x(`div`,Nt,[r(z,{checked:f(k).types[e],"onUpdate:checked":t=>f(k).setTypeEnabled(e,t)},null,8,[`checked`,`onUpdate:checked`])])])),64))])]),_:1}),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,Pt,[t[37]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`Board `)],-1),x(`div`,Ft,[t[35]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Glide animations`),x(`div`,{class:`setting-desc`},` When a card changes state, animate it gliding between columns to show where it came from and where it went. Off by default; when off, cards change state instantly as before. `)],-1),x(`div`,It,[r(z,{checked:f(C).glideAnimations,"onUpdate:checked":f(C).setGlideAnimations},null,8,[`checked`,`onUpdate:checked`])])]),x(`div`,Lt,[t[36]||=x(`div`,{class:`setting-info`},[x(`div`,{class:`setting-label`},`Keyboard navigation`),x(`div`,{class:`setting-desc`},[i(` Power-user shortcut mode: move around the board with the keyboard — `),x(`span`,{class:`mono`},`j`),i(`/`),x(`span`,{class:`mono`},`k`),i(` ( `),x(`span`,{class:`mono`},`h`),i(`/`),x(`span`,{class:`mono`},`l`),i(` between columns), `),x(`span`,{class:`mono`},`Enter`),i(` to open, `),x(`span`,{class:`mono`},`Esc`),i(` to close or clear. Off by default; when off the board behaves exactly as before. `)])],-1),x(`div`,Rt,[r(z,{checked:f(C).keyboardNavEnabled,"onUpdate:checked":f(C).setKeyboardNavEnabled},null,8,[`checked`,`onUpdate:checked`])])])])]),_:1}),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,zt,[x(`div`,Bt,[x(`span`,{style:{cursor:`pointer`,"user-select":`none`},onClick:t[6]||=e=>f(p).showAdvanced=!f(p).showAdvanced},[f(p).showAdvanced?(l(),y(`span`,Vt,`▾`)):(l(),y(`span`,Ht,`▸`)),t[38]||=i(` Advanced `,-1)])]),f(p).showAdvanced?(l(),y(`div`,Ut,[t[39]||=x(`div`,{class:`adv-gate`},[x(`div`,{class:`warning`},` ⚠ Changing these may break the running server. Edit with care. `)],-1),(l(!0),y(u,null,a(f(p).guardedFields,e=>(l(),y(`div`,{key:e.key,id:`setting-${e.key}`,class:`setting-row`},[x(`div`,Gt,[x(`div`,Kt,c(e.label),1),x(`div`,qt,c(e.description),1)]),x(`div`,Jt,[e.type===`string`?(l(),s(B,{key:0,"model-value":String(Y[e.key]),type:`text`,"onUpdate:modelValue":t=>Y[e.key]=t},null,8,[`model-value`,`onUpdate:modelValue`])):e.type===`array`?(l(),s(B,{key:1,"model-value":String(Y[e.key]),type:`text`,placeholder:`.md, .markdown`,"onUpdate:modelValue":t=>Y[e.key]=t},null,8,[`model-value`,`onUpdate:modelValue`])):n(``,!0)]),e.restartRequired?(l(),y(`span`,Yt,`restart required`)):n(``,!0)],8,Wt))),128))])):n(``,!0)])]),_:1}),r(R,{style:{padding:`0 18px 6px`,"margin-bottom":`16px`}},{default:v(()=>[x(`div`,Xt,[t[43]||=x(`div`,{class:`sec-label`,style:{"padding-top":`16px`,"margin-bottom":`0`}},[x(`span`,{class:`live-dot`}),i(`Raw repoos.toml `)],-1),x(`div`,Zt,[x(`div`,Qt,[t[41]||=x(`div`,{class:`setting-desc`,style:{margin:`0`}},[i(` The whole file, for sections the fields above don't cover — `),x(`code`,null,`[preview]`),i(`, `),x(`code`,null,`[check]`),i(`, `),x(`code`,null,`[release]`),i(`, `),x(`code`,null,`[[deployments]]`),i(`, and anything you add. Values stay on one line: RepoOS's config reader doesn't support multi-line arrays, multi-line strings, or inline tables. Keep secrets in `),x(`code`,null,`.env`),i(`, not here. `)],-1),x(`div`,$t,[r(w,{variant:`outline`,size:`sm`,disabled:f(p).rawLoading||f(p).rawSaving,onClick:ve},{default:v(()=>[...t[40]||=[i(`Reload`,-1)]]),_:1},8,[`disabled`]),r(w,{size:`sm`,disabled:!f(p).rawDirty||f(p).rawLoading||f(p).rawSaving,onClick:ye},{default:v(()=>[i(c(f(p).rawSaving?`Saving…`:`Save`),1)]),_:1},8,[`disabled`])])]),x(`div`,en,[x(`pre`,{ref_key:`rawPre`,ref:me,"aria-hidden":`true`},[x(`code`,{innerHTML:ge.value},null,8,tn)],512),ie(x(`textarea`,{ref_key:`rawTextarea`,ref:he,"onUpdate:modelValue":t[7]||=e=>f(p).rawDraft=e,spellcheck:`false`,autocomplete:`off`,autocapitalize:`off`,autocorrect:`off`,"aria-label":`repoos.toml contents`,disabled:f(p).rawLoading,onScroll:_e},null,40,nn),[[m,f(p).rawDraft]])]),f(p).rawLoading?(l(),y(`div`,rn,` Loading… `)):f(p).rawError?(l(),y(`div`,an,c(f(p).rawError),1)):f(p).rawDirty?(l(),y(`div`,on,` Unsaved changes. `)):(l(),y(`div`,sn,[...t[42]||=[i(` In sync with `,-1),x(`span`,{class:`mono`},`repoos.toml`,-1),i(`. `,-1)]]))])])]),_:1})])):(l(),y(`div`,Me))]))}});export{cn as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,B as t,C as n,D as r,E as i,G as a,I as o,O as s,R as c,S as l,St as u,Tt as d,U as f,V as p,_ as m,b as h,bt as g,h as _,i as v,m as y,pt as b,q as x,r as S,rt as C,s as w,w as T,wt as E,x as D}from"./vendor-vue-CobgyEJp.js";import{a as O,t as k}from"./button-lbikqSph.js";import{rt as A,tt as j}from"./vendor-ui-DPm7zLxi.js";import{B as ee,I as M,N,R as P,W as F,_ as I,a as L,b as R,c as te,d as z,f as B,h as V,i as H,j as U,l as W,o as ne,p as re,u as G,v as ie,z as ae}from"./index-BOQ-ust6.js";var K=`input, textarea, [contenteditable]`,q=`button, a[href], select, [role='button'], [role='link'], [role='menuitem'], [role='option'], summary, input, textarea, [contenteditable]`;function J(e){return e instanceof Element&&!!e.closest(K)}function Y(e){return e instanceof Element&&!!e.closest(q)}function X({containerRef:n,tasks:r,open:i,enabled:a,panelOpen:o,closePanel:s}){let l=b(null);function u(){let e=n.value;return e?Array.from(e.querySelectorAll(`.task-card`)).filter(e=>!e.closest(`.board-col.collapsed`)):[]}function d(){let e=n.value;return e?Array.from(e.querySelectorAll(`.board-col`)).filter(e=>!e.classList.contains(`collapsed`)):[]}function f(){return u().findIndex(e=>e.dataset.taskId===l.value)}function p(e){e.scrollIntoView({block:`nearest`,behavior:`smooth`})}function m(e){e?.dataset.taskId&&(l.value=e.dataset.taskId,p(e))}function h(){let e=n.value,t=u(),r=t[f()]??t[0];if(!r)return 8;let i=r.getBoundingClientRect().height||120,a=e&&e.clientHeight||(typeof window<`u`?window.innerHeight:0);return a?Math.max(1,Math.floor(a/i)):8}function g(e,t){return e<0?0:e>=t?t-1:e}function _(e){let t=u();if(t.length!==0){if(l.value===null){e>0&&m(t[0]);return}m(t[g(f()+e,t.length)])}}function v(e){let t=d();if(t.length===0)return;if(l.value===null){e===1&&u().length&&m(u()[0]);return}let n=u()[f()];if(!n)return;let r=n.closest(`.board-col`),i=r?t.indexOf(r):-1;for(let n=i+e;n>=0&&n<t.length;n+=e){let e=t[n].querySelector(`.task-card`);if(e){m(e);return}}}function y(){let e=l.value;e!==null&&(r.value.some(t=>t.id===e)||(l.value=r.value[0]?.id??null))}let x,S;function C(e){if(a.value&&!J(e.target)&&!(e.key!==`Escape`&&Y(e.target))){if(o.value){e.key===`Escape`&&(e.preventDefault(),s());return}switch(e.key){case`j`:case`ArrowDown`:e.preventDefault(),_(e.shiftKey?h():1);break;case`k`:case`ArrowUp`:e.preventDefault(),_(e.shiftKey?-h():-1);break;case`h`:case`ArrowLeft`:e.preventDefault(),v(-1);break;case`l`:case`ArrowRight`:e.preventDefault(),v(1);break;case`Enter`:{let t=l.value;if(!t)break;e.preventDefault();let n=r.value.find(e=>e.id===t);n&&i(n);break}case`Escape`:l.value!==null&&(e.preventDefault(),l.value=null)}}}return t(()=>{window.addEventListener(`keydown`,C),x=e(()=>r.value.map(e=>e.id).join(`,`),()=>y()),S=e(a,e=>{e||(l.value=null)})}),c(()=>{window.removeEventListener(`keydown`,C),x?.(),S?.()}),{highlightId:l,clear:()=>l.value=null}}var oe=`repoos.board.collapsed`;function se(){try{return localStorage.getItem(oe)}catch{return null}}var ce=se()!==null;function le(){try{let e=se();if(e===null)return[];let t=JSON.parse(e)??[];return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}}var Z=b(new Set(le()));function Q(){try{localStorage.setItem(oe,JSON.stringify([...Z.value]))}catch{}}function ue(e){return Z.value.has(e)}function de(e){let t=new Set(Z.value);t.has(e)?t.delete(e):t.add(e),Z.value=t,Q()}function $(e,t){return t.some(t=>e(t).length===0&&!Z.value.has(t))}function fe(e,t){let n=new Set(Z.value),r=!1;for(let i of t)e(i).length===0&&!n.has(i)&&(n.add(i),r=!0);return r&&(Z.value=n,Q()),r}function pe(e){let t=new Set(Z.value),n=!1;for(let r of e)t.delete(r)&&(n=!0);return n&&(Z.value=t,Q()),n}function me(e){if(!Z.value.has(e))return!1;let t=new Set(Z.value);return t.delete(e),Z.value=t,Q(),!0}function he(e,t){for(let[n,r]of Object.entries(t))r>0&&(e[n]??0)===0&&me(n)}var ge=!1;function _e(e){if(ge||(ge=!0,ce))return;let t=[`draft`,...e.columns.map(e=>e.id)];Z.value=new Set(t.filter(t=>e.byStatus(t).length===0)),Q()}var ve=new Map;function ye(e,t){ve.set(e,t)}function be(e){let t=ve.get(e)??null;return ve.delete(e),t}var xe=[`data-task-id`,`draggable`],Se={class:`flex flex-1 flex-col p-[13px]`},Ce={class:`flex items-center gap-[7px]`},we={class:`font-mono text-[10px] text-[var(--txt-faint)]`},Te={class:`rounded-md border border-border bg-[var(--chip-bg)] px-2 py-[2px] font-mono text-[9.5px] text-[var(--txt-dim)]`},Ee={key:0,class:`tc-waiting`,title:`waiting for you — open the task to reply`},De={key:1,class:`tc-merge`,title:`branch drifted from main — move to done to sync and merge`},Oe=[`title`],ke={class:`mt-[11px] line-clamp-2 text-[13px] font-semibold leading-[1.4]`},Ae={class:`mt-[11px] flex flex-wrap gap-[6px]`},je={class:`rounded-md border border-border bg-[var(--chip-bg)] px-2 py-[2px] font-mono text-[9.5px] text-[var(--txt-dim)]`},Me={key:0,class:`rounded-md border border-border bg-[var(--chip-bg)] px-2 py-[2px] font-mono text-[9.5px] text-[var(--txt-dim)]`},Ne=[`title`],Pe={key:2,class:`diff-stats-empty rounded-md border border-border bg-[var(--chip-bg)] px-2 py-[2px] font-mono text-[9.5px] text-[var(--txt-dim)]`,title:`No code changes`},Fe={key:0,class:`mt-[13px]`},Ie=[`title`],Le={key:0,class:`tc-foot tc-actions !ml-0 w-full`},Re=[`disabled`,`title`],ze={"aria-hidden":`true`,viewBox:`0 0 24 24`,fill:`none`,class:`size-4`},Be=[`d`],Ve={key:1,class:`tc-foot tc-actions !ml-0 w-full`},He={key:2,class:`tc-foot tc-actions !ml-0 w-full`},Ue=480,We=`cubic-bezier(.22,1,.36,1)`,Ge=3e5,Ke=2,qe=2,Je=2,Ye=`border-[var(--green-border-tint)] bg-[var(--green-tint)] text-[var(--green)] hover:brightness-110`,Xe=`border-[var(--violet-border-tint)] bg-[var(--violet-dim)] text-[var(--violet)] hover:brightness-110`,Ze=s({__name:`TaskCard`,props:{task:{},dragEnabled:{type:Boolean,default:!0},highlighted:{type:Boolean,default:!1}},setup(e){let a=e,o=F(),s=ee(),v=b(!1),y=b(!1),x=b(null);function S(){return typeof window<`u`&&!!window.matchMedia&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}function C(){return o.glideAnimations&&!S()&&s.transitionState?.id===a.task.id}t(()=>{if(!C())return;let e=be(a.task.id),t=x.value;if(!e||!t)return;let n=t.getBoundingClientRect(),r=e.left-n.left,i=e.top-n.top;t.style.transformOrigin=`center`,t.style.transform=`translate(${r}px, ${i}px)`,t.style.transition=`none`,t.offsetWidth,t.style.transition=`transform ${Ue}ms ${We}`,t.style.transform=`translate(0, 0)`,window.setTimeout(()=>{t.style.transition=``,t.style.transform=``},Ue)}),c(()=>{if(!C())return;let e=x.value;e&&ye(a.task.id,e.getBoundingClientRect())});let w=b(Date.now()),E;t(()=>{E=setInterval(()=>{w.value=Date.now()},15e3)}),p(()=>{clearInterval(E)});function O(e){return!e||Number.isNaN(Date.parse(e))?null:w.value-Date.parse(e)}function k(e){let t=Math.round(e/6e4);if(t<1)return`just now`;if(t<60)return`${t}m`;let n=Math.floor(t/60),r=t%60;return r?`${n}h ${r}m`:`${n}h`}function A(e){let t=O(e);if(t===null)return null;let n=k(t);return n===`just now`?n:`${n} ago`}let j=h(()=>s.diffStatsFor(a.task.id));t(()=>{s.loadDiffStats(a.task.id)});function M(e){if(!a.dragEnabled)return;let t=e.dataTransfer;t&&(t.effectAllowed=`move`,t.setData(`text/plain`,a.task.id),y.value=!0,s.setDraggingTask(a.task))}function N(){y.value=!1,s.setDraggingTask(null),window.dispatchEvent(new CustomEvent(`repoos:board-dragend`))}let P=b(null),L={draft:{label:`Move to inbox`,title:`Move this proposal into the work queue`,icon:`M5 12h14m-6-6 6 6-6 6`,variant:`move`},inbox:{label:`Move to ready`,title:`Queue this task as ready to start`,icon:`M5 12h14m-6-6 6 6-6 6`,variant:`move`},ready:{label:`Start work`,title:`Launch the engineer agent on this task`,icon:`M8 5v14l11-7z`,variant:`start`},review:{label:`Move to done`,title:`Merge the branch, run repoos check, and mark the task done`,icon:`M4 12l5 5L20 6`,variant:`done`}},te={label:`Pause work`,title:`Stop the agent; the task stays active so you can resume it`,icon:`M10 4H6v16h4zM18 4h-4v16h4z`,variant:`pause`},z={label:`Restart work`,title:`Relaunch the agent on this task from where it left off`,icon:`M8 5v14l11-7z`,variant:`start`},B=h(()=>{let e=s.integration;if(!e)return!1;let t=a.task;return e.active?.taskId===t.id||e.queue.includes(t.id)}),U=h(()=>{let e=s.integration;return e?.active?.taskId===a.task.id?e.active.stage:null});function W(e){let t=s.agentActivityAt[e]??s.runningSince[e],n=O(t);if(n!==null&&n>=Ge)return{label:`stuck · silent ${k(n)}`,title:`agent process is still running but hasn't produced output in a while — it may be hung. Click to inspect, or restart work.`,cls:`tc-stuck`};let r=A(t);return{label:r?`coding · active ${r}`:`coding`,title:`agent is making code changes — click to watch the session`,cls:`tc-coding`}}function ne(e,t){let n=s.agentActivityAt[e]??s.runningSince[e],r=O(n);if(r!==null&&r>=Ge)return{label:`stuck · silent ${k(r)}`,title:`agent is fixing a post-handoff check failure but hasn't produced output in a while — it may be hung. Click to inspect, or restart work.`,cls:`tc-stuck`};let i=A(n);return{label:i?`fixing check failure · active ${i}`:`fixing check failure (retry ${t}/${Ke})`,title:"`repoos check` failed right after handoff — the engineer is automatically fixing it and will re-submit for review",cls:`tc-coding`}}function re(e,t){let n=s.agentActivityAt[e]??s.runningSince[e],r=O(n);if(r!==null&&r>=Ge)return{label:`stuck · silent ${k(r)}`,title:`agent is resolving a merge conflict from close-out but hasn't produced output in a while — it may be hung. Click to inspect, or restart work.`,cls:`tc-stuck`};let i=A(n);return{label:i?`fixing merge conflict · active ${i}`:`fixing merge conflict (retry ${t}/${qe})`,title:`close-out hit a real merge conflict with main — the engineer is automatically resolving it in its own branch and close-out will retry once it's done`,cls:`tc-coding`}}function G(e,t){let n=s.agentActivityAt[e]??s.runningSince[e],r=O(n);if(r!==null&&r>=Ge)return{label:`stuck · silent ${k(r)}`,title:`agent was auto-resumed after a missed handoff signal but hasn't produced output in a while — it may be hung. Click to inspect, or restart work.`,cls:`tc-stuck`};let i=A(n);return{label:i?`confirming handoff · active ${i}`:`confirming handoff (retry ${t}/${Je})`,title:`the previous turn ended without a detected handoff signal — the engineer was automatically resumed to finish and re-confirm`,cls:`tc-coding`}}let ae={label:`queued`,title:`waiting for a free agent slot (maxConcurrentAgents) — will start automatically once one frees up`,cls:`tc-queued`},K={label:`PM is working`,title:`the PM agent is working on this task — open it to see the PM tab`,cls:`tc-pm-working`},q=h(()=>H(s.reviewFor(a.task.id)?.report?.markdown)),J=h(()=>{let e=a.task,t=s.pmWorkingFor(e.id);if(e.status===`draft`&&t)return{label:`PM is working`,title:`the PM agent is fleshing out this draft — it moves to inbox when done`,cls:`tc-pm-working`};if(e.status===`review`){if(B.value)return{label:U.value?`moving to done · ${U.value}`:`queued for close-out`,title:`Move to done already started — merging, building, and checking. See the pipeline bar for live progress.`,cls:`tc-moving`};if(s.reviewFor(e.id)?.running)return{label:`Reviewing…`,title:`automatic review in progress`,cls:`tc-reviewing`};if(s.isQueued(e.id))return ae;if(s.isRunning(e.id))return e.mergeConflictRetryCount?re(e.id,e.mergeConflictRetryCount):e.checkRetryCount?ne(e.id,e.checkRetryCount):W(e.id);if(s.doneErrorFor(e.id))return null;if(t)return K;let n=q.value;return n?.tone===`red`?{label:`review: back to the drawing board`,title:`the reviewer rejected this — open the task to see why`,cls:`tc-review-bad`}:n?.tone===`amber`?{label:`review: needs some work`,title:`the reviewer found issues — open the task to see the report`,cls:`tc-review-warn`}:{label:`review passed · ready to finish`,title:`review passed — approve and move to done to finish`,cls:`tc-human`}}return e.status===`active`?s.isQueued(e.id)?ae:s.isRunning(e.id)?e.handoffSignalRetryCount?G(e.id,e.handoffSignalRetryCount):W(e.id):e.needsInput?{label:`needs input`,title:`agent is waiting on you — open the task to reply`,cls:`tc-needs-input`}:t?K:{label:`paused`,title:`agent stopped — click Restart work to resume`,cls:`tc-stalled`}:t?K:null}),Y={label:`Moving to done…`,title:`Already queued for close-out — no further action needed`,icon:`M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10zM12 6v6l4 2`,variant:`done`},X=h(()=>{let e=a.task;return e.status===`review`&&B.value?Y:e.status===`review`&&s.doneErrorFor(e.id)?null:e.status===`active`?s.isRunning(e.id)?te:z:L[e.status]??null}),oe=h(()=>a.task.status===`review`&&!B.value&&!s.reviewFor(a.task.id)?.running&&!s.isRunning(a.task.id)&&q.value?.tone!==`red`&&q.value?.tone!==`amber`),se=h(()=>{switch(X.value?.variant){case`start`:return`border-[var(--cyan-dim)] bg-[var(--cyan-dim)] text-[var(--cyan)] hover:brightness-125`;case`pause`:return`border-[var(--amber-tint)] bg-[var(--amber-tint)] text-[var(--amber)] hover:brightness-110`;case`done`:return`border-[var(--green-border-tint)] bg-[var(--green-tint)] text-[var(--green)] hover:brightness-110`;default:return`border-border bg-[var(--panel)] text-[var(--txt-dim)] hover:border-[var(--border-bright)] hover:text-foreground`}}),ce=h(()=>a.task.status===`ready`||a.task.status===`active`&&!s.isRunning(a.task.id)),le=h(()=>s.needsAck(a.task));function Z(){s.acknowledge(a.task.id)}let Q=h(()=>s.needsCreateAck(a.task.id));function ue(){s.acknowledgeCreate(a.task.id)}async function de(){if(!(v.value||!X.value)&&!(a.task.status===`review`&&s.reviewFor(a.task.id)?.running)){if(ce.value&&a.task.git?.dirty){P.value=a.task;return}v.value=!0;try{switch(a.task.status){case`draft`:await s.setStatus(a.task,`inbox`);break;case`inbox`:await s.setStatus(a.task,`ready`);break;case`ready`:await s.startWork(a.task);break;case`active`:s.isRunning(a.task.id)?await s.pauseWork(a.task):await s.startWork(a.task);break;case`review`:await s.completeTask(a.task)}}catch(e){if(e instanceof Error&&e.name===`DirtyMainError`){$.value=a.task;return}s.onError(e)}finally{v.value=!1}}}let $=b(null),fe=h(()=>$.value?s.dirtyMainFor($.value.id):[]);async function pe(){let e=$.value;if(fe.value,$.value=null,e){v.value=!0;try{await s.completeTask(e,{commitDirty:!0})}catch(t){if(t instanceof Error&&t.name===`DirtyMainError`){$.value=e;return}s.onError(t)}finally{v.value=!1}}}function me(){$.value&&s.clearDirtyMain($.value.id),$.value=null}async function he(){await o.openTask(a.task),o.activeTab=`agent`}async function ge(){await o.openTask(a.task),o.activeTab=`pm`}async function _e(){await o.openTask(a.task),o.activeTab=`details`}async function ve(){await o.openTask(a.task),o.activeTab=`debug`,o.debugView=`debugger`}return(t,a)=>(f(),T(m,null,[D(`article`,{ref_key:`rootEl`,ref:x,"data-task-id":e.task.id,class:u([`task-card group flex shrink-0 cursor-pointer flex-col overflow-hidden rounded-[13px] border border-border bg-[var(--panel)] text-foreground transition duration-150 hover:-translate-y-0.5 hover:border-[var(--border-bright)]`,{flash:g(s).flashId===e.task.id,"kb-highlight":e.highlighted,"transition-success":g(s).transitionState?.id===e.task.id,coding:g(s).isRunning(e.task.id),"pm-working":g(s).pmWorkingFor(e.task.id),reviewing:e.task.status===`review`&&!B.value&&g(s).reviewFor(e.task.id)?.running,"moving-to-done":e.task.status===`review`&&B.value,"waiting-for-human":e.task.status===`review`&&!B.value&&!g(s).reviewFor(e.task.id)?.running&&!g(s).isRunning(e.task.id),"review-ready":oe.value,"needs-input":e.task.needsInput,"done-needs-ack":le.value,"ai-created-ack":Q.value,dragging:y.value,"has-action":!!X.value}]),draggable:e.dragEnabled,onClick:a[2]||=t=>g(o).openTask(e.task),onDragstart:M,onDragend:N},[D(`div`,Se,[D(`div`,Ce,[D(`span`,we,`#`+d(e.task.id),1),D(`span`,Te,d(e.task.type),1),e.task.needsInput?(f(),T(`span`,Ee,`needs input`)):n(``,!0),e.task.status===`review`&&e.task.needsMerge?(f(),T(`span`,De,`needs merge`)):n(``,!0),e.task.hotfix?(f(),T(`span`,{key:2,class:`tc-hotfix`,title:`Hotfix — runs in main checkout${e.task.hotfixTarget===`main`?` directly on main`:` on branch `+e.task.branch}`},`hotfix`,8,Oe)):n(``,!0),D(`span`,{class:u([`ml-auto rounded-[5px] px-[6px] py-[2px] font-mono text-[9px] font-bold`,e.task.priority])},d(e.task.priority),3)]),D(`h3`,ke,d(e.task.title),1),D(`div`,Ae,[D(`span`,je,d(e.task.area),1),e.task.assignee===`ai`?n(``,!0):(f(),T(`span`,Me,d(e.task.assignee===`human`?`◇ `+(e.task.assignedTo||`human`):`· open`),1)),j.value&&j.value.filesChanged>0?(f(),T(`span`,{key:1,class:`diff-stats-chip rounded-md border border-border bg-[var(--chip-bg)] px-2 py-[2px] font-mono text-[9.5px] text-[var(--txt-dim)]`,title:`${j.value.filesChanged} files, +${j.value.additions} −${j.value.deletions}`},d(j.value.filesChanged)+`f `+d(j.value.additions)+`+ `,9,Ne)):j.value&&j.value.filesChanged===0&&e.task.branch?(f(),T(`span`,Pe,`0 changes`)):n(``,!0)]),J.value?(f(),T(`div`,Fe,[D(`span`,{class:u([`tc-hint`,J.value.cls]),title:J.value.title,onClick:a[0]||=_(e=>J.value.cls===`tc-coding`||J.value.cls===`tc-stuck`?he():J.value.cls===`tc-pm-working`?ge():void 0,[`stop`])},[J.value.cls===`tc-coding`?(f(),l(R,{key:0})):J.value.cls===`tc-pm-working`?(f(),l(R,{key:1})):J.value.cls===`tc-reviewing`?(f(),l(R,{key:2,variant:`reviewing`,label:`Reviewing…`})):J.value.cls===`tc-moving`?(f(),l(R,{key:3,label:`Moving to done…`})):n(``,!0),i(` `+d(J.value.label),1)],10,Ie)])):n(``,!0)]),X.value?(f(),T(`div`,Le,[D(`button`,{class:u([`flex w-full items-center justify-center gap-2 border-t px-4 py-[11px] font-mono text-xs font-semibold transition duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--border-bright)]`,[se.value,oe.value?`review-ready`:``]]),disabled:v.value||B.value||e.task.status===`review`&&(g(s).reviewFor(e.task.id)?.running||g(s).isRunning(e.task.id)),title:B.value?X.value.title:e.task.status===`review`&&g(s).reviewFor(e.task.id)?.running?`Waiting for automatic review to finish.`:e.task.status===`review`&&g(s).isRunning(e.task.id)?`The engineer is still coding; Move to done becomes available when the turn ends.`:X.value.title,onClick:_(de,[`stop`])},[(f(),T(`svg`,ze,[D(`path`,{d:X.value.icon,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,8,Be)])),i(` `+d(v.value?`Working…`:X.value.label),1)],10,Re)])):le.value?(f(),T(`div`,Ve,[D(`button`,{class:u([`flex w-full items-center justify-center gap-2 border-t px-4 py-[11px] font-mono text-xs font-semibold transition duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--border-bright)]`,Ye]),title:`Acknowledge this task is done — clears the highlight`,onClick:_(Z,[`stop`])},[...a[4]||=[D(`svg`,{"aria-hidden":`true`,viewBox:`0 0 24 24`,fill:`none`,class:`size-4`},[D(`path`,{d:`M4 12l5 5L20 6`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1),i(` Acknowledge `,-1)]])])):n(``,!0),Q.value?(f(),T(`div`,He,[D(`button`,{class:u([`ai-created-ack flex w-full items-center justify-center gap-2 border-t px-4 py-[11px] font-mono text-xs font-semibold transition duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--border-bright)]`,Xe]),title:`Acknowledge this AI-created task — clears the highlight`,onClick:_(ue,[`stop`])},[...a[5]||=[D(`svg`,{"aria-hidden":`true`,viewBox:`0 0 24 24`,fill:`none`,class:`size-4`},[D(`path`,{d:`M4 12l5 5L20 6`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1),i(` Acknowledge `,-1)]])])):n(``,!0),e.task.status===`review`&&g(s).doneErrorFor(e.task.id)?(f(),l(V,{key:3,class:`tc-done-error`,message:g(s).doneErrorFor(e.task.id).message,step:g(s).doneErrorFor(e.task.id).step,conflicts:g(s).doneErrorFor(e.task.id).conflicts,detail:g(s).doneErrorFor(e.task.id).detail,hint:g(s).doneErrorFor(e.task.id).hint,"task-id":e.task.id,"task-title":e.task.title,onOpenPanel:_e,onOpenDebugger:ve,onClick:a[1]||=_(()=>{},[`stop`])},null,8,[`message`,`step`,`conflicts`,`detail`,`hint`,`task-id`,`task-title`])):n(``,!0)],42,xe),r(ie,{task:P.value,onClose:a[3]||=e=>P.value=null},null,8,[`task`]),r(I,{task:$.value,files:fe.value,onCommit:pe,onCancel:me},null,8,[`task`,`files`])],64))}}),Qe=[`aria-expanded`,`onKeydown`],$e={key:0,class:`col-cap`},et=[`title`],tt={class:`col-label`},nt={key:2,class:`col-count`},rt={key:1,class:`col-empty`},it=s({__name:`BoardColumn`,props:{col:{},emptyText:{default:`—`},barColor:{default:``},forceExpand:{type:Boolean,default:!1},dragEnabled:{type:Boolean,default:!0},highlightId:{default:null}},setup(i){let s={draft:`no drafts yet — agent ideas land here`,inbox:`all caught up, nothing waiting`,active:`nobody's working — go first?`,review:`no reviews pending, nice`,done:`nothing shipped yet — send it`},c=i,v=ee(),x=M(),S=h(()=>!c.forceExpand&&ue(c.col.id)),C=h(()=>x.uiTheme===`gen z`?s[c.col.id]??`nothing here yet — add something`:c.emptyText||`—`);e(()=>v.loading,e=>{e||_e({byStatus:v.byStatus,columns:P})},{immediate:!0});let w=b(null),O=b(!1),k=null,A=null,j=()=>{let e=w.value;O.value=!!(e&&e.scrollHeight>e.clientHeight+1)};t(()=>{let e=w.value;e&&(j(),k=new MutationObserver(()=>j()),k.observe(e,{childList:!0,subtree:!0}),`ResizeObserver`in window&&(A=new ResizeObserver(()=>j()),A.observe(e)),window.addEventListener(`resize`,j))}),p(()=>{k?.disconnect(),A?.disconnect(),window.removeEventListener(`resize`,j)}),e(S,()=>o(j));let N=h(()=>c.barColor||c.col.color),F=h(()=>v.byStatus(c.col.id).length),I=h(()=>{let e=F.value;return e<=0?0:Math.min(1,.15+Math.log10(e+1)*.42)}),R=h(()=>S.value?{"--cap-color":N.value,"--cap-fill":String(I.value)}:void 0),te=h(()=>{let e=v.transitionState;return!e||e.from!==c.col.id?null:v.tasks.find(t=>t.id===e.id)?.title??null}),z=b(!1),B=0,V=h(()=>{let e=v.draggingTask;if(!e||e.status===c.col.id)return null;if(c.col.id===`done`)return e.status===`review`?v.reviewFor(e.id)?.running?{valid:!1,reason:`Waiting for automatic review to finish.`}:{valid:!0,reason:null}:{valid:!1,reason:`Only review tasks can be moved to done.`};if(e.status===`active`&&c.col.id===`review`&&v.isRunning(e.id))return{valid:!1,reason:`The agent is still coding — Review becomes available when the turn ends.`};let t=ne(e.status,c.col.id);return{valid:t,reason:t?null:L(e.status,c.col.id)}}),H=h(()=>V.value===null?null:V.value.valid);function U(e){c.dragEnabled&&(B++,z.value=!0,e.preventDefault(),B===1&&V.value?.valid===!1&&V.value.reason&&v.pushToast(V.value.reason,`error`))}function W(e){if(c.dragEnabled){if(H.value===!1){e.dataTransfer&&(e.dataTransfer.dropEffect=`none`);return}e.preventDefault()}}function re(){c.dragEnabled&&(B=Math.max(0,B-1),B===0&&(z.value=!1))}let G=b(null);async function ae(e){if(!c.dragEnabled)return;e.preventDefault(),K();let t=e.dataTransfer?.getData(`text/plain`);if(!t)return;let n=v.tasks.find(e=>e.id===t);if(!(!n||n.status===c.col.id))try{if(c.col.id===`done`){if(n.status!==`review`)throw Error(`Only review tasks can be moved to done`);if(v.reviewFor(n.id)?.running)throw Error(`Waiting for automatic review to finish.`);await v.completeTask(n)}else if(c.col.id===`active`&&n.status===`ready`)n.git?.dirty?G.value=n:await v.startWork(n);else if(c.col.id===`review`&&n.status===`active`&&v.isRunning(n.id))throw Error(`The agent is still coding — Review becomes available when the turn ends.`);else await v.setStatus(n,c.col.id);ue(c.col.id)&&J()}catch(e){v.onError(e)}}function K(){B=0,z.value=!1}window.addEventListener(`repoos:board-dragend`,K),p(()=>window.removeEventListener(`repoos:board-dragend`,K));let q=h(()=>{let e=N.value.replace(`#`,``),t=parseInt(e.slice(0,2),16),n=parseInt(e.slice(2,4),16),r=parseInt(e.slice(4,6),16);return .299*t+.587*n+.114*r>140?`#0e1220`:`#ffffff`}),J=()=>de(c.col.id);e(()=>v.doneAckCount,(e,t)=>{c.col.id===`done`&&e>0&&t===0&&S.value&&J()});let Y=h(()=>c.col.id===`done`&&v.doneAckCount>0?v.doneAckCount:null);return(e,t)=>(f(),T(m,null,[D(`div`,{class:u([`board-col`,{collapsed:S.value,scrollable:O.value,"drag-over":z.value,"drop-invalid":z.value&&H.value===!1}]),onDragenter:U,onDragover:W,onDragleave:re,onDrop:ae},[D(`div`,{class:`col-head`,role:`button`,tabindex:`0`,"aria-expanded":!S.value,style:E(R.value),onClick:J,onKeydown:[y(J,[`enter`]),y(_(J,[`prevent`]),[`space`])]},[S.value?(f(),T(`div`,$e,[D(`span`,{class:`col-cap-count`,style:E({color:q.value})},d(F.value),5),Y.value?(f(),T(`span`,{key:0,class:`col-cap-ack`,title:`${Y.value} fresh done task${Y.value===1?``:`s`} to acknowledge`},d(Y.value),9,et)):n(``,!0)])):(f(),T(`span`,{key:1,class:`cdot`,style:E({background:i.col.color,boxShadow:`0 0 6px `+i.col.color})},null,4)),D(`span`,tt,d(i.col.label),1),S.value?n(``,!0):(f(),T(`span`,nt,d(F.value),1)),t[1]||=D(`svg`,{class:`col-chev`,viewBox:`0 0 24 24`,fill:`none`},[D(`path`,{d:`m6 9 6 6 6-6`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1)],44,Qe),D(`div`,{ref_key:`bodyEl`,ref:w,class:`col-body`},[te.value?(f(),T(`div`,{class:`board-ghost`,key:`ghost-`+g(v).transitionState?.id},` Moved to `+d(g(v).transitionState?.to),1)):n(``,!0),(f(!0),T(m,null,a(g(v).byStatus(i.col.id),e=>(f(),l(Ze,{key:e.id,task:e,"drag-enabled":i.dragEnabled,highlighted:c.highlightId===e.id},null,8,[`task`,`drag-enabled`,`highlighted`]))),128)),g(v).byStatus(i.col.id).length?n(``,!0):(f(),T(`div`,rt,d(C.value),1))],512)],34),r(ie,{task:G.value,onClose:t[0]||=e=>G.value=null},null,8,[`task`])],64))}}),at=[`sync`,`merge`,`build`,`check`,`done`],ot=[`title`],st={class:`strip-label`},ct={class:`mono`},lt={class:`mono dim`},ut={key:0,class:`mono dim strip-elapsed`},dt={key:1,class:`ibar`},ft={class:`ibar-top`},pt={class:`ibar-title`},mt={class:`mono`},ht={key:2,class:`ibar-elapsed mono`,title:`Elapsed since integration started`},gt={class:`stages`,"aria-label":`Integration stages`},_t=[`title`],vt={class:`stage-mark`,"aria-hidden":`true`},yt={key:0,viewBox:`0 0 24 24`,class:`stage-check`,fill:`none`},bt={class:`stage-name`},xt={key:0,class:`stage-arrow`,"aria-hidden":`true`},St={key:0,class:`ibar-err`},Ct={class:`ibar-err-text`},wt={class:`err-label`},Tt={class:`err-msg`},Et={key:0,class:`ibar-queue`},Dt={class:`queue-count`},Ot=1e4,kt=N(s({__name:`IntegrationStatusBar`,setup(o){let s=ee(),{integration:c}=w(s),l=F(),_=h({get:()=>l.integrationBarCollapsed,set:e=>l.setIntegrationBarCollapsed(e)}),v=h(()=>c.value??null),y=h(()=>v.value===null||v.value.empty),x=h(()=>v.value?.active??null),S=h(()=>v.value?.queue??[]),C=b(Date.now()),E=null;function O(){let e=!!x.value&&!x.value.failed;e&&E===null?(C.value=Date.now(),E=setInterval(()=>C.value=Date.now(),1e3)):!e&&E!==null&&(clearInterval(E),E=null)}let k=h(()=>{let e=x.value?.startedAt;if(!e||x.value?.failed)return``;let t=C.value-new Date(e).getTime();return Number.isNaN(t)?``:U(t)}),M=null;function N(){M!==null&&(clearTimeout(M),M=null)}function P(){N(),M=setTimeout(()=>{M=null,y.value&&(_.value=!0)},Ot)}e([y,_],([e,t])=>{O(),e?t?N():P():N()},{immediate:!0}),t(()=>{y.value&&(_.value=!0),O()}),p(()=>{E!==null&&clearInterval(E),N()});let I=h(()=>{let e=x.value?.stage;return e?at.indexOf(e):-1}),L=h(()=>x.value?.failed?I.value:-1);function R(){x.value&&s.retryIntegration(x.value.taskId).catch(e=>{let t=e instanceof Error?e.message:String(e);s.pushToast(t,`error`)})}let te={sync:`Syncing: fast-forwarding the task's branch onto the latest main before validating, so it's tested against current main, not a stale base.`,merge:`Merge: merging the branch into a temporary candidate alongside current main. Fast — a real hang here is unusual.`,build:`Build: compiling the merged candidate (tsc + asset bundling) to catch build breaks the branch's own diff couldn't see.`,check:`Check: running the full repoos check — typecheck, the complete test suite (1000+ tests), and a UI smoke test — against the merged candidate. This is normally the slowest stage, often several minutes; it is not scoped to just this branch's changes since it's validating the actual merge onto main.`,done:`Done: fast-forwarding main to the validated candidate and cleaning up the temporary worktree/branch.`};function z(e,t){return x.value?.failed?t<L.value?`done`:t===L.value&&L.value>=0?`failed`:`todo`:t<I.value?`done`:t===I.value?`current`:`todo`}return(e,t)=>(f(),T(`div`,{class:u([`ibar-wrap`,{collapsed:_.value}])},[_.value?(f(),T(`button`,{key:0,type:`button`,class:`ibar-strip`,title:`Integration pipeline — `+(y.value?`idle`:x.value?`#`+x.value.taskId+` `+(x.value.stage??`…`):``),onClick:t[0]||=e=>_.value=!1},[D(`span`,{class:u([`strip-dot`,{idle:y.value,run:!y.value&&!x.value?.failed,err:x.value?.failed}])},null,2),D(`span`,st,[y.value?(f(),T(m,{key:0},[i(`Integration pipeline idle`)],64)):x.value?(f(),T(m,{key:1},[D(`span`,ct,`#`+d(x.value.taskId),1),x.value.failed?(f(),T(m,{key:0},[i(` integration failed`)],64)):(f(),T(m,{key:1},[t[2]||=i(` integrating… `,-1),D(`span`,lt,d(x.value.stage??``),1),k.value?(f(),T(`span`,ut,` · `+d(k.value),1)):n(``,!0)],64))],64)):(f(),T(m,{key:2},[i(`Integrating…`)],64))]),r(g(j),{class:`strip-chev`,"aria-hidden":`true`})],8,ot)):(f(),T(`div`,dt,[D(`div`,ft,[D(`button`,{type:`button`,class:`ibar-toggle`,title:`Collapse integration pipeline`,onClick:t[1]||=e=>_.value=!0},[r(g(A),{class:`bar-chev`,"aria-hidden":`true`})]),y.value?(f(),T(m,{key:0},[t[3]||=D(`span`,{class:`ibar-title`},[D(`span`,{class:`bar-dot idle`}),i(` Integration pipeline idle `)],-1),t[4]||=D(`span`,{class:`ibar-idle-hint`},`Queued close-outs appear here as they are synced, merged, built and checked.`,-1)],64)):x.value?(f(),T(m,{key:1},[D(`span`,pt,[D(`span`,{class:u([`bar-dot`,{run:!x.value.failed,err:x.value.failed}])},null,2),D(`span`,mt,`#`+d(x.value.taskId),1),x.value.failed?(f(),T(m,{key:0},[i(` integration failed`)],64)):(f(),T(m,{key:1},[i(` integrating`)],64)),k.value?(f(),T(`span`,ht,d(k.value),1)):n(``,!0)]),D(`ol`,gt,[(f(!0),T(m,null,a(g(at),(e,r)=>(f(),T(`li`,{key:e,class:u([`stage`,z(e,r)]),title:te[e]},[D(`span`,vt,[r<I.value?(f(),T(`svg`,yt,[...t[5]||=[D(`path`,{d:`M5 13l4 4L19 7`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)]])):(f(),T(`span`,{key:1,class:u([`stage-dot`,{spinning:r===I.value&&!x.value.failed}])},null,2))]),D(`span`,bt,d(e),1),r<g(at).length-1?(f(),T(`span`,xt,`→`)):n(``,!0)],10,_t))),128))]),x.value.failed?(f(),T(`div`,St,[D(`div`,Ct,[D(`span`,wt,`Failed at `+d(x.value.stage??`…`),1),D(`span`,Tt,d(x.value.error??`The integration could not be completed.`),1)]),D(`button`,{type:`button`,class:`bar-btn`,onClick:R},`Retry`)])):n(``,!0)],64)):n(``,!0)]),S.value.length?(f(),T(`div`,Et,[t[6]||=D(`span`,{class:`queue-label`},`Queue`,-1),(f(!0),T(m,null,a(S.value,e=>(f(),T(`span`,{key:e,class:`queue-item mono`},`#`+d(e)+` queueing…`,1))),128)),D(`span`,Dt,`+`+d(S.value.length),1)])):n(``,!0)]))],2))}}),[[`__scopeId`,`data-v-a49470c5`]]),At={class:`work-page`},jt={class:`work-header`,style:{display:`flex`,"align-items":`flex-end`,"justify-content":`space-between`,"margin-bottom":`20px`}},Mt={class:`page-desc`,style:{margin:`3px 0 0`}},Nt={class:`mono`,style:{color:`var(--cyan)`}},Pt={style:{display:`flex`,"align-items":`center`,gap:`10px`}},Ft={key:0,viewBox:`0 0 24 24`,fill:`none`,class:`size-4`},It={key:1,viewBox:`0 0 24 24`,fill:`none`,class:`size-4`},Lt={key:0,class:`filter-bar`},Rt={class:`filter-chip`},zt=`No drafts yet. Agent proposals land here.`,Bt=`#3a4055`,Vt=N(s({__name:`WorkView`,setup(t){let o={id:`draft`,label:`Proposed / Drafts`,color:`var(--txt-faint)`},s=new Set([`draft`,`inbox`,`ready`,`active`,`review`,`done`]),c=ee(),u=F(),p=S(),{workDir:_}=w(c),y=h(()=>{let e=p.query.status;return typeof e==`string`&&s.has(e)?e:null}),A=h(()=>y.value===`draft`?o:P.find(e=>e.id===y.value)??null),j=v();e(()=>p.query.task,e=>{typeof e!=`string`||!e||N(e)},{immediate:!0});async function M(){let e={...p.query};delete e.task,await j.replace({query:e})}async function N(e){if(e===`new`){u.openNewTask(),await M();return}let t=e.replace(/^#/,``),n=c.tasks.find(e=>e.id===t);if(n)u.openTask(n);else try{u.open(await O(`/api/tasks/${encodeURIComponent(t)}`))}catch{return}await M()}let I=h(()=>{let e=y.value?[A.value]:[o,...P],t=[];for(let n of e)!y.value&&ue(n.id)||t.push(...c.byStatus(n.id));return t}),L=b(null),R=X({containerRef:L,tasks:I,open:u.openTask,enabled:h(()=>u.keyboardNavEnabled),panelOpen:h(()=>!!u.active),closePanel:u.close}),V=[`draft`,...P.map(e=>e.id)],H=h(()=>!$(c.byStatus,V));function U(){H.value?pe(V):fe(c.byStatus,V)}let ne=h(()=>({...c.counts}));return e(ne,(e,t)=>{c.loading||he(t??{},e)}),(e,t)=>{let s=x(`router-link`);return f(),T(`div`,At,[D(`div`,jt,[D(`div`,null,[t[3]||=D(`div`,{class:`page-title`},`Work Queue`,-1),D(`div`,Mt,[t[2]||=i(` Repo-native tasks · `,-1),D(`span`,Nt,d(g(_))+`/*.md`,1)])]),D(`div`,Pt,[y.value?n(``,!0):(f(),l(k,{key:0,variant:`outline`,size:`icon`,class:`h-[34px] w-[34px] rounded-[9px]`,title:H.value?`Expand all columns`:`Collapse empty columns`,"aria-label":H.value?`Expand all columns`:`Collapse empty columns`,onClick:U},{default:C(()=>[H.value?(f(),T(`svg`,Ft,[...t[4]||=[D(`path`,{d:`m9 6-4 6 4 6M15 6l4 6-4 6`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)]])):(f(),T(`svg`,It,[...t[5]||=[D(`path`,{d:`m5 6 4 6-4 6M19 6l-4 6 4 6`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,-1)]]))]),_:1},8,[`title`,`aria-label`])),r(re,{"model-value":g(c).sortOrder,"onUpdate:modelValue":t[0]||=e=>g(c).setSortOrder(e)},{default:C(()=>[r(G,{class:`h-[34px] w-[210px] rounded-[9px] px-[11px]`},{default:C(()=>[r(W)]),_:1}),r(B,{position:`popper`},{default:C(()=>[r(te,{class:`min-w-[var(--radix-select-trigger-width)]`},{default:C(()=>[(f(!0),T(m,null,a(g(ae),e=>(f(),l(z,{key:e.value,value:e.value},{default:C(()=>[i(d(e.label),1)]),_:2},1032,[`value`]))),128))]),_:1})]),_:1})]),_:1},8,[`model-value`]),r(k,{variant:`accent`,class:`new-btn`,onClick:t[1]||=e=>g(u).openNewTask()},{default:C(()=>[...t[6]||=[D(`svg`,{viewBox:`0 0 24 24`,fill:`none`},[D(`path`,{d:`M12 5v14M5 12h14`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`})],-1),i(` New task `,-1)]]),_:1})])]),y.value?(f(),T(`div`,Lt,[D(`span`,Rt,[D(`span`,{class:`cdot`,style:E({background:A.value.color,boxShadow:`0 0 6px `+A.value.color})},null,4),i(` `+d(A.value.label)+` · `+d(g(c).byStatus(y.value).length),1)]),r(s,{to:`/work`,class:`filter-clear`},{default:C(()=>[...t[7]||=[i(`Show all statuses`,-1)]]),_:1})])):n(``,!0),D(`div`,{ref_key:`boardEl`,ref:L,class:`board`},[y.value?(f(),l(it,{key:0,col:A.value,"bar-color":A.value.id===`draft`?Bt:``,"empty-text":A.value.id===`draft`?zt:`—`,"force-expand":``,"drag-enabled":!1,"highlight-id":g(R).highlightId.value},null,8,[`col`,`bar-color`,`empty-text`,`highlight-id`])):(f(),T(m,{key:1},[r(it,{col:o,"bar-color":Bt,"empty-text":zt,"highlight-id":g(R).highlightId.value},null,8,[`highlight-id`]),(f(!0),T(m,null,a(g(P),e=>(f(),l(it,{key:e.id,col:e,"highlight-id":g(R).highlightId.value},null,8,[`col`,`highlight-id`]))),128))],64))],512),t[8]||=D(`div`,{class:`ibar-spacer`,"aria-hidden":`true`},null,-1),r(kt,{class:`ibar-outer`})])}}}),[[`__scopeId`,`data-v-5a8b6f88`]]);export{Vt as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.ibar-wrap[data-v-a49470c5]{z-index:60;pointer-events:none;position:fixed;bottom:0;left:0;right:0}.ibar-wrap[data-v-a49470c5]>*{pointer-events:auto}.ibar[data-v-a49470c5]{background:var(--panel-solid);border-top:1px solid var(--border);padding:8px 14px 10px;box-shadow:0 -8px 24px #00000059}.ibar-top[data-v-a49470c5]{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.ibar-toggle[data-v-a49470c5]{width:22px;height:22px;color:var(--txt-faint);cursor:pointer;background:0 0;border:none;flex-shrink:0;place-items:center;display:grid}.ibar-toggle[data-v-a49470c5]:hover{color:var(--txt)}.bar-chev[data-v-a49470c5]{width:16px;height:16px}.ibar-title[data-v-a49470c5]{color:var(--txt);white-space:nowrap;align-items:center;gap:8px;font-size:12.5px;font-weight:600;display:flex}.bar-dot[data-v-a49470c5]{border-radius:50%;flex-shrink:0;width:8px;height:8px}.bar-dot.idle[data-v-a49470c5]{background:var(--txt-faint)}.bar-dot.run[data-v-a49470c5]{background:var(--cyan);box-shadow:0 0 8px var(--cyan)}.bar-dot.err[data-v-a49470c5]{background:var(--red);box-shadow:0 0 8px var(--red)}.ibar-idle-hint[data-v-a49470c5]{color:var(--txt-faint);font-size:12px}.ibar-elapsed[data-v-a49470c5]{color:var(--txt-dim);background:var(--chip-bg);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px;font-size:11.5px;font-weight:600}.strip-elapsed[data-v-a49470c5]{font-variant-numeric:tabular-nums}.stages[data-v-a49470c5]{flex-wrap:wrap;align-items:center;gap:2px;margin:0;padding:4px 0;list-style:none;display:flex}.stage[data-v-a49470c5]{color:var(--txt-faint);white-space:nowrap;cursor:help;align-items:center;gap:6px;font-size:12px;display:flex}.stage-mark[data-v-a49470c5]{place-items:center;width:16px;height:16px;display:grid}.stage-check[data-v-a49470c5]{width:14px;height:14px;color:var(--green)}.stage.dot[data-v-a49470c5]{background:var(--txt-faint);border:2px solid var(--txt-faint);box-sizing:content-box;border-radius:50%;width:8px;height:8px}.stage-dot[data-v-a49470c5]{border:2px solid var(--txt-faint);box-sizing:content-box;border-radius:50%;width:8px;height:8px}.stage-dot.spinning[data-v-a49470c5]{border-top-color:var(--cyan);border-right-color:var(--cyan);animation:.9s linear infinite ibar-spin-a49470c5}.stage.done .stage-name[data-v-a49470c5]{color:var(--txt-dim)}.stage.current .stage-name[data-v-a49470c5]{color:var(--cyan);font-weight:600}.stage.failed .stage-name[data-v-a49470c5]{color:var(--red);font-weight:600}.stage.failed .stage-dot[data-v-a49470c5],.stage.failed .stage-mark[data-v-a49470c5]{color:var(--red)}.stage.failed .stage-dot[data-v-a49470c5]{border-color:var(--red);border-top-color:var(--red);border-right-color:var(--red)}.stage-arrow[data-v-a49470c5]{color:var(--txt-faint);margin-left:2px;margin-right:2px}.ibar-err[data-v-a49470c5]{background:var(--red-tint);border:1px solid var(--red-border-tint);border-radius:9px;align-items:center;gap:12px;margin-top:6px;padding:8px 12px;display:flex}.ibar-err-text[data-v-a49470c5]{flex-direction:column;gap:2px;min-width:0;display:flex}.err-label[data-v-a49470c5]{color:var(--red);text-transform:uppercase;letter-spacing:.05em;font-size:11px;font-weight:700}.err-msg[data-v-a49470c5]{color:var(--txt);overflow-wrap:anywhere;white-space:pre-wrap;font-size:12px}.bar-btn[data-v-a49470c5]{border:1px solid var(--red-border-tint);background:var(--red-tint);color:var(--red);cursor:pointer;border-radius:8px;flex-shrink:0;padding:5px 14px;font-size:12px;font-weight:600;transition:all .15s}.bar-btn[data-v-a49470c5]:hover{background:var(--red);color:#fff}.ibar-queue[data-v-a49470c5]{border-top:1px dashed var(--border);flex-wrap:wrap;align-items:center;gap:8px;margin-top:6px;padding-top:6px;font-size:12px;display:flex}.queue-label[data-v-a49470c5]{color:var(--txt-faint);text-transform:uppercase;letter-spacing:.06em;font-size:11px}.queue-item[data-v-a49470c5]{color:var(--txt-dim);background:var(--chip-bg);border-radius:999px;padding:2px 10px}.queue-count[data-v-a49470c5]{color:var(--txt-faint)}.ibar-strip[data-v-a49470c5]{background:var(--panel-solid);border-top:1px solid var(--border);cursor:pointer;width:100%;color:var(--txt-dim);text-align:left;align-items:center;gap:10px;padding:6px 14px;font-size:12px;display:flex;box-shadow:0 -8px 24px #00000059}.strip-dot[data-v-a49470c5]{border-radius:50%;flex-shrink:0;width:7px;height:7px}.strip-dot.idle[data-v-a49470c5]{background:var(--txt-faint)}.strip-dot.run[data-v-a49470c5]{background:var(--cyan);box-shadow:0 0 8px var(--cyan)}.strip-dot.err[data-v-a49470c5]{background:var(--red);box-shadow:0 0 8px var(--red)}.strip-label[data-v-a49470c5]{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.dim[data-v-a49470c5]{color:var(--txt-faint)}.strip-chev[data-v-a49470c5]{width:16px;height:16px;color:var(--txt-faint);flex-shrink:0}@media (width<=760px){.ibar-wrap[data-v-a49470c5]{bottom:calc(74px + var(--safe-bot));z-index:60}.ibar[data-v-a49470c5],.ibar-strip[data-v-a49470c5]{border:1px solid var(--border);border-radius:14px;box-shadow:0 10px 24px #00000040}}@media (width>=761px){.ibar-wrap[data-v-a49470c5]{bottom:14px;left:50%;right:auto;transform:translate(-50%)}.ibar[data-v-a49470c5],.ibar-strip[data-v-a49470c5]{border:1px solid var(--border);border-radius:16px;width:fit-content;max-width:min(680px,100vw - 28px);box-shadow:0 12px 32px #00000040}.ibar-strip[data-v-a49470c5]{border-radius:999px;padding:7px 16px}.ibar[data-v-a49470c5]{padding:10px 16px 12px}}@keyframes ibar-spin-a49470c5{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.stage-dot.spinning[data-v-a49470c5]{animation:none}}.ibar-spacer[data-v-5a8b6f88]{height:150px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as e}from"./src-BH-TyZbA.js";import{m as t,t as n}from"./mermaid-parser.core-CgXZk1iN.js";import{n as r}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./chunk-DU6HZSFF-DfdNNqwa.js";import{n as i,r as a,t as o}from"./chunk-SVP7TREG-euxi0Kap.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-BUUkChHW.js";var c=t().RailroadAbnf.parser.LangiumParser,l=r(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=r(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=r(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=r(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=r(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=r(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=r(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:r(t=>{o.clear(),e.debug(`[ABNF Parser] Starting Langium parse`);let r=c.parse(t);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new n(r);let i=r.value;e.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),e.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e,t}from"./path-COt_16Va.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-DTg6UBE_.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./chunk-FOHPRMQF-l2z4K2jD.js";import{M as e}from"./mermaid-parser.core-CgXZk1iN.js";export{e as createArchitectureServices};
|