@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,20 @@
|
|
|
1
|
+
import type { RouteHandler } from "./types.js";
|
|
2
|
+
export declare const readConfig: RouteHandler;
|
|
3
|
+
export declare const patchConfig: RouteHandler;
|
|
4
|
+
/**
|
|
5
|
+
* The raw `repoos.toml`, for the Settings page's escape-hatch editor (#0375).
|
|
6
|
+
* Unlike GET /api/config this is deliberately unredacted: the file IS the
|
|
7
|
+
* content the user edits, so hiding values would make a raw save write them
|
|
8
|
+
* back. The endpoint is behind the same auth as every other API route.
|
|
9
|
+
*/
|
|
10
|
+
export declare const readRawConfig: RouteHandler;
|
|
11
|
+
/**
|
|
12
|
+
* Replace repoos.toml with the posted content (#0375).
|
|
13
|
+
*
|
|
14
|
+
* The body is `{ content, baseHash? }`. `baseHash` is the hash from the last
|
|
15
|
+
* GET/PUT; when it no longer matches the file on disk another writer (a
|
|
16
|
+
* curated-field auto-save, another tab, the CLI) changed it, and the write is
|
|
17
|
+
* refused with 409 so the raw editor can never silently stomp that change.
|
|
18
|
+
* Invalid TOML is rejected with 400 before anything touches disk.
|
|
19
|
+
*/
|
|
20
|
+
export declare const writeRawConfig: RouteHandler;
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { json, readBody } from "./utils.js";
|
|
5
|
+
import { AGENT_CLIS, AGENT_MODELS, DEFAULT_AGENTS, agentsForConfig, getConfigSchema, patchTomlConfig, loadConfig, sanitizeBuiltInAgents, saveBuiltInAgentsConfig, } from "../../core/config.js";
|
|
6
|
+
import { formatTomlError, validateToml } from "../../core/toml-validate.js";
|
|
7
|
+
import { readTunnelConfig, writeTunnelConfig } from "../../core/tunnel.js";
|
|
8
|
+
import { listSkills } from "./helpers.js";
|
|
9
|
+
/**
|
|
10
|
+
* Config as the browser may see it: `whisper.apiKey` is stripped entirely and
|
|
11
|
+
* the whisper state is exposed through the flat schema keys
|
|
12
|
+
* (`whisper.provider`) plus a `whisperEnabled` boolean. The secret never
|
|
13
|
+
* crosses the HTTP boundary. Auth secrets (sessionSecret, emailProvider.apiKey,
|
|
14
|
+
* google.clientSecret) are also stripped.
|
|
15
|
+
*/
|
|
16
|
+
function safeConfigForBrowser(config) {
|
|
17
|
+
const whisper = (config.whisper ?? { provider: "none", apiKey: "" });
|
|
18
|
+
const whisperEnabled = whisper.provider !== "none" && !!whisper.apiKey;
|
|
19
|
+
const { whisper: _ignoredWhisper, theme: _ignoredTheme, uiTheme: _ignoredUiTheme, ...rest } = config;
|
|
20
|
+
// Strip auth secrets
|
|
21
|
+
const authRaw = rest.auth;
|
|
22
|
+
let safeAuth;
|
|
23
|
+
if (authRaw && typeof authRaw === "object") {
|
|
24
|
+
safeAuth = { ...authRaw };
|
|
25
|
+
delete safeAuth.sessionSecret;
|
|
26
|
+
if (safeAuth.emailProvider && typeof safeAuth.emailProvider === "object") {
|
|
27
|
+
safeAuth.emailProvider = {
|
|
28
|
+
...safeAuth.emailProvider,
|
|
29
|
+
apiKey: "***",
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (safeAuth.google && typeof safeAuth.google === "object") {
|
|
33
|
+
safeAuth.google = {
|
|
34
|
+
...safeAuth.google,
|
|
35
|
+
clientSecret: "***",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
...rest,
|
|
41
|
+
auth: safeAuth,
|
|
42
|
+
"whisper.provider": whisper.provider ?? "none",
|
|
43
|
+
whisperEnabled,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export const readConfig = (ctx, _req, res) => {
|
|
47
|
+
const { repoos } = ctx;
|
|
48
|
+
const agents = agentsForConfig(repoos.config);
|
|
49
|
+
const safeConfig = safeConfigForBrowser({ ...repoos.config, agents });
|
|
50
|
+
return json(res, 200, {
|
|
51
|
+
config: safeConfig,
|
|
52
|
+
schema: getConfigSchema(),
|
|
53
|
+
agentsMeta: {
|
|
54
|
+
clis: AGENT_CLIS,
|
|
55
|
+
models: AGENT_MODELS,
|
|
56
|
+
defaults: DEFAULT_AGENTS,
|
|
57
|
+
skills: listSkills(repoos.config),
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
export const patchConfig = async (ctx, req, res) => {
|
|
62
|
+
const { config, repoos, index } = ctx;
|
|
63
|
+
const body = (await readBody(req));
|
|
64
|
+
const patch = {};
|
|
65
|
+
if (body.agents !== undefined) {
|
|
66
|
+
if (!Array.isArray(body.agents)) {
|
|
67
|
+
return json(res, 400, { error: "agents must be an array" });
|
|
68
|
+
}
|
|
69
|
+
const list = [];
|
|
70
|
+
for (const agent of body.agents) {
|
|
71
|
+
const a = agent;
|
|
72
|
+
if (typeof a?.name !== "string" || !a.name.trim()) {
|
|
73
|
+
return json(res, 400, { error: "each agent needs a non-empty name" });
|
|
74
|
+
}
|
|
75
|
+
if (!AGENT_CLIS.includes(a.cli)) {
|
|
76
|
+
return json(res, 400, { error: `cli must be one of: ${AGENT_CLIS.join(", ")}` });
|
|
77
|
+
}
|
|
78
|
+
if (typeof a.model !== "string" || !a.model.trim()) {
|
|
79
|
+
return json(res, 400, {
|
|
80
|
+
error: `agent "${a.name}" model must be a non-empty string`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (typeof a.enabled !== "boolean") {
|
|
84
|
+
return json(res, 400, { error: `agent "${a.name}" enabled must be true or false` });
|
|
85
|
+
}
|
|
86
|
+
if (a.instructions !== undefined && typeof a.instructions !== "string") {
|
|
87
|
+
return json(res, 400, { error: `agent "${a.name}" instructions must be a string` });
|
|
88
|
+
}
|
|
89
|
+
if (a.skills !== undefined &&
|
|
90
|
+
(!Array.isArray(a.skills) || a.skills.some((skill) => typeof skill !== "string"))) {
|
|
91
|
+
return json(res, 400, { error: `agent "${a.name}" skills must be an array of strings` });
|
|
92
|
+
}
|
|
93
|
+
const entry = {
|
|
94
|
+
name: a.name.trim(),
|
|
95
|
+
cli: a.cli,
|
|
96
|
+
model: a.model,
|
|
97
|
+
enabled: a.enabled,
|
|
98
|
+
};
|
|
99
|
+
if (typeof a.instructions === "string" && a.instructions.trim()) {
|
|
100
|
+
entry.instructions = a.instructions.trim();
|
|
101
|
+
}
|
|
102
|
+
if (Array.isArray(a.skills)) {
|
|
103
|
+
entry.skills = [...new Set(a.skills.map((skill) => skill.trim()).filter(Boolean))];
|
|
104
|
+
}
|
|
105
|
+
list.push(entry);
|
|
106
|
+
}
|
|
107
|
+
patch.agents = list;
|
|
108
|
+
}
|
|
109
|
+
// builtInAgents toggles (e.g. enabling the Debugger or Tech Debt Agent) are
|
|
110
|
+
// persisted to the sidecar, NOT repoos.toml — mirroring how built-in agent
|
|
111
|
+
// state is stored and read (see config.ts:saveBuiltInAgentsConfig).
|
|
112
|
+
let builtInAgentsChanged = false;
|
|
113
|
+
if (body.builtInAgents !== undefined) {
|
|
114
|
+
if (typeof body.builtInAgents !== "object" ||
|
|
115
|
+
body.builtInAgents === null ||
|
|
116
|
+
Array.isArray(body.builtInAgents)) {
|
|
117
|
+
return json(res, 400, { error: "builtInAgents must be an object" });
|
|
118
|
+
}
|
|
119
|
+
const state = sanitizeBuiltInAgents(body.builtInAgents);
|
|
120
|
+
const base = repoos.config.builtInAgents ?? {};
|
|
121
|
+
const merged = { ...base, ...state };
|
|
122
|
+
saveBuiltInAgentsConfig(config.root, merged, config.cacheDir);
|
|
123
|
+
repoos.config.builtInAgents = merged;
|
|
124
|
+
builtInAgentsChanged = true;
|
|
125
|
+
}
|
|
126
|
+
// Auth config patching — handle auth-specific fields that live in [auth]
|
|
127
|
+
// section of repoos.toml. Secrets (sessionSecret, emailProvider.apiKey,
|
|
128
|
+
// google.clientSecret) are never written to repoos.toml — that file is
|
|
129
|
+
// git-tracked. They're rejected here even if a client sends them, and must
|
|
130
|
+
// be set via REPOOS_RESEND_API_KEY / REPOOS_GOOGLE_CLIENT_SECRET in .env
|
|
131
|
+
// instead (see docs/native-auth.md and the tracked .env.example).
|
|
132
|
+
if (body["auth.emailProvider.apiKey"] !== undefined ||
|
|
133
|
+
body["auth.google.clientSecret"] !== undefined) {
|
|
134
|
+
return json(res, 400, {
|
|
135
|
+
error: "auth.emailProvider.apiKey and auth.google.clientSecret can't be set here — repoos.toml is git-tracked. " +
|
|
136
|
+
"Set REPOOS_RESEND_API_KEY / REPOOS_GOOGLE_CLIENT_SECRET in .env instead (see .env.example).",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
let authEnabledChanged = false;
|
|
140
|
+
if (body["auth.enabled"] !== undefined) {
|
|
141
|
+
const val = body["auth.enabled"];
|
|
142
|
+
if (typeof val !== "boolean") {
|
|
143
|
+
return json(res, 400, { error: "auth.enabled must be true or false" });
|
|
144
|
+
}
|
|
145
|
+
patch["auth.enabled"] = val;
|
|
146
|
+
authEnabledChanged = true;
|
|
147
|
+
}
|
|
148
|
+
if (body["auth.sessionMaxAge"] !== undefined) {
|
|
149
|
+
const val = body["auth.sessionMaxAge"];
|
|
150
|
+
if (typeof val === "string" || typeof val === "number") {
|
|
151
|
+
const num = Number(val);
|
|
152
|
+
if (Number.isInteger(num) && num > 0) {
|
|
153
|
+
// Accept values in days (<300) or seconds (>=300). Assume values <300 are days.
|
|
154
|
+
const ageInSeconds = num < 300 ? num * 86400 : num;
|
|
155
|
+
if (ageInSeconds >= 300) {
|
|
156
|
+
patch["auth.sessionMaxAge"] = ageInSeconds;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (body["auth.emailProvider.type"] !== undefined) {
|
|
162
|
+
patch["auth.emailProvider.type"] = "resend";
|
|
163
|
+
}
|
|
164
|
+
if (body["auth.emailProvider.fromAddress"] !== undefined) {
|
|
165
|
+
const val = typeof body["auth.emailProvider.fromAddress"] === "string"
|
|
166
|
+
? body["auth.emailProvider.fromAddress"].trim()
|
|
167
|
+
: "";
|
|
168
|
+
if (val)
|
|
169
|
+
patch["auth.emailProvider.fromAddress"] = val;
|
|
170
|
+
}
|
|
171
|
+
if (body["auth.google.clientId"] !== undefined) {
|
|
172
|
+
const val = typeof body["auth.google.clientId"] === "string" ? body["auth.google.clientId"].trim() : "";
|
|
173
|
+
if (val)
|
|
174
|
+
patch["auth.google.clientId"] = val;
|
|
175
|
+
}
|
|
176
|
+
// Guard: enabling auth requires a login provider to be configured. Secrets
|
|
177
|
+
// only ever come from config (env-var-sourced), never from the request body
|
|
178
|
+
// — see the rejection above.
|
|
179
|
+
//
|
|
180
|
+
// Validate against the config as it exists on disk RIGHT NOW (a fresh
|
|
181
|
+
// loadConfig re-reads repoos.toml + .env), not the in-memory `repoos.config`:
|
|
182
|
+
// that copy is only refreshed at the END of this handler, so a server that
|
|
183
|
+
// booted before the provider was set (empty `auth` block) would otherwise
|
|
184
|
+
// reject every attempt to turn auth on from Settings — permanently, until a
|
|
185
|
+
// restart. `patch` values are honored too, since fromAddress / clientId can
|
|
186
|
+
// arrive in this same save (written just below).
|
|
187
|
+
const enablingAuth = patch["auth.enabled"] === true;
|
|
188
|
+
if (enablingAuth) {
|
|
189
|
+
const onDisk = loadConfig(config.root);
|
|
190
|
+
const fromAddress = patch["auth.emailProvider.fromAddress"] ?? onDisk.auth?.emailProvider?.fromAddress;
|
|
191
|
+
const clientId = patch["auth.google.clientId"] ?? onDisk.auth?.google?.clientId;
|
|
192
|
+
const hasEmailProvider = !!((onDisk.auth?.emailProvider?.apiKey || process.env.REPOOS_RESEND_API_KEY) &&
|
|
193
|
+
fromAddress);
|
|
194
|
+
const hasGoogle = !!(clientId && onDisk.auth?.google?.clientSecret);
|
|
195
|
+
if (!hasEmailProvider && !hasGoogle) {
|
|
196
|
+
return json(res, 400, {
|
|
197
|
+
error: "Cannot enable auth: configure at least one login provider (email OTP or Google OAuth) first",
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const schema = getConfigSchema();
|
|
202
|
+
for (const field of schema) {
|
|
203
|
+
if (body[field.key] === undefined)
|
|
204
|
+
continue;
|
|
205
|
+
const val = body[field.key];
|
|
206
|
+
if (field.type === "string") {
|
|
207
|
+
if (field.key === "whisper.apiKey") {
|
|
208
|
+
// The form always carries this field (default ""). An empty value means
|
|
209
|
+
// "leave the existing key untouched" — never wipe a TOML/env key, and
|
|
210
|
+
// never reject an unrelated settings save over it.
|
|
211
|
+
const trimmed = typeof val === "string" ? val.trim() : "";
|
|
212
|
+
if (trimmed)
|
|
213
|
+
patch[field.key] = trimmed;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (typeof val !== "string" || (!val.toString().trim() && field.key !== "ntfyTopic")) {
|
|
217
|
+
return json(res, 400, { error: `${field.label} must be a non-empty string` });
|
|
218
|
+
}
|
|
219
|
+
patch[field.key] = val.toString().trim();
|
|
220
|
+
}
|
|
221
|
+
else if (field.type === "boolean") {
|
|
222
|
+
if (typeof val !== "boolean") {
|
|
223
|
+
return json(res, 400, { error: `${field.label} must be true or false` });
|
|
224
|
+
}
|
|
225
|
+
patch[field.key] = val;
|
|
226
|
+
}
|
|
227
|
+
else if (field.type === "select") {
|
|
228
|
+
const valid = field.options?.map((o) => o.value) ?? [];
|
|
229
|
+
if (!valid.includes(val)) {
|
|
230
|
+
return json(res, 400, {
|
|
231
|
+
error: `${field.label} must be one of: ${valid.join(", ")}`,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// Native/select components submit strings. These settings are numbers
|
|
235
|
+
// in the runtime config, so persist them as TOML numeric syntax rather
|
|
236
|
+
// than `maxActiveTasks = "5"`, which loadConfig intentionally rejects.
|
|
237
|
+
patch[field.key] =
|
|
238
|
+
field.key === "maxActiveTasks" ||
|
|
239
|
+
field.key === "maxConcurrentAgents" ||
|
|
240
|
+
field.key === "worktreeWarnThreshold"
|
|
241
|
+
? Number(val)
|
|
242
|
+
: val;
|
|
243
|
+
}
|
|
244
|
+
else if (field.type === "array") {
|
|
245
|
+
if (!Array.isArray(val) || !val.length) {
|
|
246
|
+
return json(res, 400, { error: `${field.label} must be a non-empty array` });
|
|
247
|
+
}
|
|
248
|
+
for (const item of val) {
|
|
249
|
+
if (typeof item !== "string" || !item.trim()) {
|
|
250
|
+
return json(res, 400, {
|
|
251
|
+
error: `${field.label} entries must be non-empty strings`,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
patch[field.key] = val.map((s) => s.trim());
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const tunnelEnabled = typeof patch.tunnelEnabled === "boolean" ? patch.tunnelEnabled : undefined;
|
|
259
|
+
delete patch.tunnelEnabled;
|
|
260
|
+
// An empty `whisper.apiKey` alone means "leave the key as-is" — a no-op
|
|
261
|
+
// (e.g. the user cleared the field in Settings), not "nothing to update".
|
|
262
|
+
const bodyKeys = Object.keys(body);
|
|
263
|
+
const onlyEmptyWhisperKey = bodyKeys.length === 1 &&
|
|
264
|
+
bodyKeys[0] === "whisper.apiKey" &&
|
|
265
|
+
(typeof body["whisper.apiKey"] !== "string" || !body["whisper.apiKey"].trim());
|
|
266
|
+
if (Object.keys(patch).length === 0 &&
|
|
267
|
+
tunnelEnabled === undefined &&
|
|
268
|
+
!builtInAgentsChanged &&
|
|
269
|
+
!authEnabledChanged &&
|
|
270
|
+
!onlyEmptyWhisperKey) {
|
|
271
|
+
return json(res, 400, { error: "No valid fields to update" });
|
|
272
|
+
}
|
|
273
|
+
if (Object.keys(patch).length > 0) {
|
|
274
|
+
patchTomlConfig(join(config.root, "repoos.toml"), patch);
|
|
275
|
+
}
|
|
276
|
+
if (tunnelEnabled !== undefined) {
|
|
277
|
+
const tunnel = readTunnelConfig(config.root);
|
|
278
|
+
tunnel.enabled = tunnelEnabled;
|
|
279
|
+
writeTunnelConfig(config.root, tunnel);
|
|
280
|
+
}
|
|
281
|
+
Object.assign(repoos.config, loadConfig(config.root));
|
|
282
|
+
if (patch.workDir || patch.cacheDir || patch.taskExtensions) {
|
|
283
|
+
index.refreshAll();
|
|
284
|
+
}
|
|
285
|
+
return json(res, 200, { ok: true, config: safeConfigForBrowser({ ...repoos.config }) });
|
|
286
|
+
};
|
|
287
|
+
/** Content hash used to detect concurrent edits to repoos.toml. */
|
|
288
|
+
function hashConfigContent(content) {
|
|
289
|
+
return createHash("sha256").update(content, "utf8").digest("hex");
|
|
290
|
+
}
|
|
291
|
+
/** Read repoos.toml, tolerating its absence (a repo may have no config file). */
|
|
292
|
+
function readRawToml(root) {
|
|
293
|
+
const path = join(root, "repoos.toml");
|
|
294
|
+
return existsSync(path) ? readFileSync(path, "utf8") : "";
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* The raw `repoos.toml`, for the Settings page's escape-hatch editor (#0375).
|
|
298
|
+
* Unlike GET /api/config this is deliberately unredacted: the file IS the
|
|
299
|
+
* content the user edits, so hiding values would make a raw save write them
|
|
300
|
+
* back. The endpoint is behind the same auth as every other API route.
|
|
301
|
+
*/
|
|
302
|
+
export const readRawConfig = (ctx, _req, res) => {
|
|
303
|
+
const content = readRawToml(ctx.config.root);
|
|
304
|
+
return json(res, 200, { content, hash: hashConfigContent(content) });
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* Replace repoos.toml with the posted content (#0375).
|
|
308
|
+
*
|
|
309
|
+
* The body is `{ content, baseHash? }`. `baseHash` is the hash from the last
|
|
310
|
+
* GET/PUT; when it no longer matches the file on disk another writer (a
|
|
311
|
+
* curated-field auto-save, another tab, the CLI) changed it, and the write is
|
|
312
|
+
* refused with 409 so the raw editor can never silently stomp that change.
|
|
313
|
+
* Invalid TOML is rejected with 400 before anything touches disk.
|
|
314
|
+
*/
|
|
315
|
+
export const writeRawConfig = async (ctx, req, res) => {
|
|
316
|
+
const { config, repoos, index } = ctx;
|
|
317
|
+
const body = (await readBody(req));
|
|
318
|
+
if (typeof body.content !== "string") {
|
|
319
|
+
return json(res, 400, { error: "content must be a string" });
|
|
320
|
+
}
|
|
321
|
+
const result = validateToml(body.content);
|
|
322
|
+
if (!result.ok) {
|
|
323
|
+
return json(res, 400, { error: formatTomlError(result), line: result.line });
|
|
324
|
+
}
|
|
325
|
+
const path = join(config.root, "repoos.toml");
|
|
326
|
+
const current = readRawToml(config.root);
|
|
327
|
+
const currentHash = hashConfigContent(current);
|
|
328
|
+
if (typeof body.baseHash === "string" && body.baseHash !== currentHash) {
|
|
329
|
+
return json(res, 409, {
|
|
330
|
+
error: "repoos.toml changed on disk since this editor loaded it — reload to see the current " +
|
|
331
|
+
"content before saving, so the other change isn't overwritten.",
|
|
332
|
+
content: current,
|
|
333
|
+
hash: currentHash,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
writeFileSync(path, body.content, "utf8");
|
|
337
|
+
// Apply immediately, exactly like a PATCH /api/config save: refresh the
|
|
338
|
+
// in-memory config and reconcile the index (the raw file can change
|
|
339
|
+
// workDir/cacheDir/taskExtensions, which a curated save would also refresh).
|
|
340
|
+
Object.assign(repoos.config, loadConfig(config.root));
|
|
341
|
+
index.refreshAll();
|
|
342
|
+
return json(res, 200, {
|
|
343
|
+
ok: true,
|
|
344
|
+
content: body.content,
|
|
345
|
+
hash: hashConfigContent(body.content),
|
|
346
|
+
});
|
|
347
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { RouteHandler } from "./types.js";
|
|
2
|
+
export declare const getDebugger: RouteHandler;
|
|
3
|
+
export declare const sendDebuggerMessage: RouteHandler;
|
|
4
|
+
/** Interrupt a running Debugger response. Idempotent. */
|
|
5
|
+
export declare const interruptDebugger: RouteHandler;
|
|
6
|
+
/** Hand an explicit debugger diagnosis to the task's existing engineering session. */
|
|
7
|
+
export declare const repairWithDebugger: RouteHandler;
|
|
8
|
+
/**
|
|
9
|
+
* Per-task Debugger chat (task #0337). The session is keyed by
|
|
10
|
+
* `debugger:<taskId>` so it lives alongside — but does not collide with — the
|
|
11
|
+
* global bug-paste Debugger (`__repoos-debugger__`) and the task's own
|
|
12
|
+
* engineer/PM/reviewer sessions.
|
|
13
|
+
*/
|
|
14
|
+
export declare const taskDebuggerSessionId: (taskId: string) => string;
|
|
15
|
+
/** Read the Debugger's enabled state for a specific task's debug chat. */
|
|
16
|
+
export declare const getTaskDebugger: RouteHandler;
|
|
17
|
+
/** Start or continue a task-scoped Debugger conversation with full context. */
|
|
18
|
+
export declare const sendTaskDebuggerMessage: RouteHandler;
|
|
19
|
+
/** Interrupt a running task-scoped Debugger response. Idempotent. */
|
|
20
|
+
export declare const interruptTaskDebugger: RouteHandler;
|
|
21
|
+
/**
|
|
22
|
+
* Dispatch a follow-up instruction from the task Debugger chat straight to the
|
|
23
|
+
* engineer: resume the task's existing engineering session with the instruction,
|
|
24
|
+
* or start the engineer fresh when it has never run. Sets the task `active` so
|
|
25
|
+
* the agent can act on the diagnosis.
|
|
26
|
+
*/
|
|
27
|
+
export declare const sendTaskDebuggerToEngineer: RouteHandler;
|
|
28
|
+
/**
|
|
29
|
+
* Dispatch a follow-up instruction from the task Debugger chat to the PM. Opens
|
|
30
|
+
* (or resumes) the task's PM conversation with the instruction and the full
|
|
31
|
+
* task context, so the PM can update the task on the diagnosis.
|
|
32
|
+
*/
|
|
33
|
+
export declare const sendTaskDebuggerToPm: RouteHandler;
|