@overdeck/desktop 0.46.0 → 0.47.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drizzle/overdeck/0000_overdeck_init.sql +4 -1
- package/package.json +1 -1
- package/server/{acceptance-criteria-CCwFGICj.js → acceptance-criteria-Cd7ZGZCq.js} +2 -2
- package/server/{advancing-selfheal-De1L-Sb4.js → advancing-selfheal-DieFp3qi.js} +6 -6
- package/server/{agent-gc-CBULruzm.js → agent-gc-BMcgTDl7.js} +5 -5
- package/server/{agent-state-VQk8fY9F.js → agent-state-DyZJia9f.js} +1 -1
- package/server/{agent-state-service-BlnSkRFA.js → agent-state-service-BOzQhLjU.js} +15 -9
- package/server/agent-state-service-DFO6qvHp.js +2 -0
- package/server/agent-state-source-Ca_zCaII.js +21 -0
- package/server/{agents-C5rWYhb6.js → agents-CtACUuVG.js} +23 -16
- package/server/{agents-BKKkxKgK.js → agents-Dnn4XgdB.js} +1 -1
- package/server/archive-planning-BHCd_eL5.js +2 -0
- package/server/{archive-planning-C0lAbNB_.js → archive-planning-Binfb99i.js} +10 -6
- package/server/{artifact-index-jobs-ug6ZxIP5.js → artifact-index-jobs-Jn7BGOtV.js} +2 -2
- package/server/{assemble-DnffNpOo.js → assemble-DsqK9OAq.js} +2 -2
- package/server/{tmux-dedup-DbN6MGzM.js → auto-spawn-consent-BooqhC3L.js} +262 -13
- package/server/{backlog-auto-trigger-Dh-i9PQf.js → backlog-auto-trigger-BADGPxov.js} +3 -3
- package/server/{behavior-CfIg6pKp.js → behavior-B7biGtFT.js} +2 -2
- package/server/boot-reconciled-stop-events-bQUzU8ns.js +44 -0
- package/server/{bridge-pool-patrol-CUFmjVDN.js → bridge-pool-patrol-DsPj6F7t.js} +1 -1
- package/server/{briefing-freshness-DHmCSLar.js → briefing-freshness-CUerZqWd.js} +2 -2
- package/server/{build-info-CuFfxZxp.js → build-info-D0q_i8WM.js} +3 -3
- package/server/{build-info-BP160gU7.js → build-info-Du74MKiP.js} +1 -1
- package/server/{checkpoint-manager-Dxh0FYsv.js → checkpoint-manager-Cu-R5Uzg.js} +1 -1
- package/server/{checkpoint-manager-DEWD82qK.js → checkpoint-manager-R5tnaxEY.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-CZvbtLnr.js → checkpoints-DYtLu-PB.js} +2 -2
- package/server/{checkpoints-DMTgXuLG.js → checkpoints-wF84ubZ8.js} +1 -1
- package/server/{claude-hooks-provision-fvy4RD2b.js → claude-hooks-provision-DXI3Wqlm.js} +2 -2
- package/server/{claude-hooks-provision-CN-xo-do.js → claude-hooks-provision-UKxCeOyj.js} +1 -1
- package/server/{claude-permissions-CN0cSCPp.js → claude-permissions-DYVLnX9t.js} +2 -2
- package/server/{claude-settings-overlay-CJn35FHQ.js → claude-settings-overlay-DsbpIq2d.js} +2 -2
- package/server/{claude-settings-overlay-Dabi9slj.js → claude-settings-overlay-DxP2F_gY.js} +1 -1
- package/server/cli-D6mRfUE6.js +3 -0
- package/server/{cli-oCWYA1pE.js → cli-DzRKxxP_.js} +9 -9
- package/server/{cliproxy-C8mB3KuB.js → cliproxy-CG4meRFc.js} +2 -2
- package/server/{cliproxy-PGwTX_o8.js → cliproxy-Cwzw39yN.js} +1 -1
- package/server/{close-issue-D5MF5GqF.js → close-issue-BX1bATJy.js} +5 -5
- package/server/{closed-issue-reaper-CJ24u0Zt.js → closed-issue-reaper-DvnTSN6a.js} +1 -1
- package/server/{closed-issue-reaper-Cltx86x5.js → closed-issue-reaper-hLt0W86J.js} +62 -12
- package/server/{codex-Drlf5Xhf.js → codex-BYwi1uyW.js} +6 -6
- package/server/{codex-parser-DpB89Vqa.js → codex-parser-Poyz29GE.js} +2 -2
- package/server/{codex-BdEsUFWh.js → codex-rnJN3v3_.js} +1 -1
- package/server/{compaction-continuation-K2AxQX4H.js → compaction-continuation-DtMfHN0f.js} +3 -3
- package/server/{config-Dr3pW6w6.js → config-CX4vk1CV.js} +2 -2
- package/server/{config-DV-grfQc.js → config-R793W0yA.js} +1 -1
- package/server/{config-B2IMcBxx.js → config-ktAVnp4s.js} +2 -2
- package/server/{config-yaml-CmOPzmBb.js → config-yaml-CxdwhAIA.js} +10 -2
- package/server/{conflict-gate-B9cN3SBi.js → conflict-gate-BNv6UolH.js} +59 -13
- package/server/conflict-gate-BSTlwCtF.js +3 -0
- package/server/{context-layers-D6LZo3l1.js → context-layers-DCdaGsRG.js} +2 -2
- package/server/{context-layers-dR5YxHYB.js → context-layers-DlWsDiRF.js} +3 -3
- package/server/{control-settings-C7DUehE1.js → control-settings-qYYHrIqy.js} +13 -6
- package/server/{conversation-compaction-Dj4FAKoZ.js → conversation-compaction-BxUKObHb.js} +1 -1
- package/server/{conversation-compaction-BoqdDXWF.js → conversation-compaction-CXQrN3I_.js} +8 -8
- package/server/{conversation-service-BCxl4f8Z.js → conversation-service-CDnQ3ayN.js} +1 -1
- package/server/{conversation-service-5aCnq1zR.js → conversation-service-CZiUE8Uw.js} +8 -7
- package/server/{conversations-BUpYsOZg.js → conversations-D7lR670u.js} +4 -4
- package/server/{conversations-C34dyIb9.js → conversations-DXl5YTf4.js} +1 -1
- package/server/{cost-Bgcub5kW.js → cost-Aat8HfO_.js} +2 -2
- package/server/{cost-CvxRrucd.js → cost-CWvN9FP2.js} +3 -3
- package/server/{cost-sync-Dv3LUaNW.js → cost-sync-DiUBXwl6.js} +3 -3
- package/server/{dag-ombYYt4s.js → dag-5QlmH0oC.js} +2 -2
- package/server/{dangerous-git-ops-BcJPC5Rr.js → dangerous-git-ops-DWX6Og8c.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-hi9KLPLT.js → deacon-B1LD5cJU.js} +741 -211
- package/server/{deacon-DrXqT9LQ.js → deacon-PW_bg4uL.js} +3 -3
- package/server/{deacon-nudge-log-BNBebzeL.js → deacon-nudge-log-DPHsO14z.js} +3 -3
- package/server/{deacon-pending-lifecycle-Cpk0k7Hi.js → deacon-pending-lifecycle-2ZflPxgo.js} +3 -3
- package/server/deacon-swarm-BkKR7SXu.js +2 -0
- package/server/{deacon-swarm-DBxUaO-A.js → deacon-swarm-DwGUgSVp.js} +15 -14
- package/server/deacon.js +8 -8
- package/server/{dead-end-trip-CQcP70ND.js → dead-end-trip-B06RFIr2.js} +3 -3
- package/server/{delivery-Da0zEMY4.js → delivery-C2M73sBg.js} +1 -1
- package/server/{deploy-patrol-Df-Tmaq0.js → deploy-patrol-BNjeCL8u.js} +8 -8
- package/server/{deploy-queue-UjKGYsDe.js → deploy-queue-CKT_Ia9p.js} +2 -2
- package/server/{deploy-queue-9SrhZR63.js → deploy-queue-DMMYhFC8.js} +1 -1
- package/server/{deploy-window-rpqpWqHA.js → deploy-window-DC8lze3d.js} +6 -6
- package/server/{deploy-window-jOiPRHL0.js → deploy-window-D_AimdNN.js} +1 -1
- package/server/{dev-supervisor-CC46Ig8q.js → dev-supervisor-C4F0vbno.js} +2 -2
- package/server/{devcontainer-renderer-68CSCRnu.js → devcontainer-renderer-66sqMQIi.js} +3 -3
- package/server/{dist-CJy72uEg.js → dist-C5FT9lTG.js} +1 -1
- package/server/dist-qcf9gAP0.js +3 -0
- package/server/{dist-src-Bik83hFi.js → dist-src-B-AlGWSl.js} +1 -1
- package/server/{docker-BMVTSFL5.js → docker-BxrFhTZ_.js} +1 -1
- package/server/{docker-Dam7mbIB.js → docker-CoAT8R0J.js} +2 -2
- package/server/{dod-Dar-yheg.js → dod-Bg6wsKTV.js} +26 -5
- package/server/durable-review-pipeline-D_DcfIGP.js +3 -0
- package/server/{durable-review-pipeline-CGZ5QBxh.js → durable-review-pipeline-HkAgnx0L.js} +5 -2
- package/server/{ensure-devcontainer-C98V8yW-.js → ensure-devcontainer-Bg5HJAcO.js} +1 -1
- package/server/{ensure-devcontainer-B057YA81.js → ensure-devcontainer-DTxChVuA.js} +4 -4
- package/server/{esm-shims-Br9BPdkR.js → esm-shims-CaBWIR7f.js} +1 -1
- package/server/{event-store-ELqkVOn0.js → event-store-5UKzh9Jf.js} +1 -1
- package/server/{event-store-zY5MJHgF.js → event-store-CrHcVC5_.js} +3 -3
- package/server/{events-D6pyqhzM.js → events-ChEFB7Jp.js} +1 -1
- package/server/{events-D9PR1IC0.js → events-DhRN-6vM.js} +3 -3
- package/server/{factory-CRoOpGsF.js → factory-BezSPaTd.js} +5 -5
- package/server/{feature-registry-population--YUXU999.js → feature-registry-population-DhswNiXx.js} +4 -4
- package/server/{feature-registry-storage-BORBTo0y.js → feature-registry-storage-CUVNpAso.js} +2 -2
- package/server/{features--nFkJY8v.js → features-B2CfNPFw.js} +2 -2
- package/server/{feedback-target-C0ZzyHvU.js → feedback-target-CMrEAoeA.js} +1 -1
- package/server/{feedback-target-Dt9BsapX.js → feedback-target-VBr9gKgX.js} +18 -7
- package/server/{feedback-writer-D1fm-5Z8.js → feedback-writer-CY91ckuw.js} +1 -1
- package/server/{feedback-writer-BG0RUZiu.js → feedback-writer-xpFgU632.js} +5 -5
- package/server/{flywheel-BiT3odRb.js → flywheel-CTVY3yCG.js} +38 -19
- package/server/{flywheel-CLVB55Be.js → flywheel-DQqsSm7P.js} +14 -14
- package/server/{flywheel-BekukH4i.js → flywheel-DsICCjTR.js} +1 -1
- package/server/{flywheel-merge-order-BKw9o6ku.js → flywheel-merge-order-C-TI4JGu.js} +1 -1
- package/server/{flywheel-merge-order-BJv1DZz1.js → flywheel-merge-order-CMGz-imq.js} +7 -7
- package/server/forge-D647IMNa.js +3 -0
- package/server/{forge-CZbSg6Ds.js → forge-RTNqJe6a.js} +2 -2
- package/server/{from-D_4_dk7i.js → from-DxGcivc9.js} +1 -1
- package/server/fs-lock-Bre3sGoz.js +130 -0
- package/server/{fts-db-BeOomFa-.js → fts-db-wROfFfje.js} +2 -2
- package/server/{fts-operations-BdewJ_g9.js → fts-operations-BuTdlZFA.js} +2 -2
- package/server/{git-utils-CI6cwyyC.js → git-utils-CedsVume.js} +1 -1
- package/server/{git-utils-ameCgDdy.js → git-utils-DtdoEXJk.js} +4 -4
- package/server/{github-app-DtAsvwzK.js → github-app-DIE8BkHI.js} +1 -1
- package/server/{github-app-CQ1Lo6LA.js → github-app-gVnZcP9B.js} +2 -2
- package/server/{github-client-BfyDxuRN.js → github-client-BrAC6ELh.js} +3 -3
- package/server/{github-client-Cj0yl_07.js → github-client-CBOkvBUl.js} +1 -1
- package/server/{github-pr-lookup-BDq6Wznz.js → github-pr-lookup-CgMULTPf.js} +2 -2
- package/server/{harness-binary-DqkftwTb.js → harness-binary-CnBHpd57.js} +2 -2
- package/server/{harness-resolve-CqMqM1Mb.js → harness-resolve-BVj6sI8m.js} +4 -4
- package/server/{health-events-CazRxJUS.js → health-events-BBWO_Dh9.js} +2 -2
- package/server/{health-events-_xfTaOUs.js → health-events-Der6bOkm.js} +1 -1
- package/server/{hooks-BnJsxlSq.js → hooks-BJNal-bs.js} +1 -1
- package/server/{hooks-BO3QT1sn.js → hooks-BOavco-e.js} +2 -2
- package/server/{hume-CDYJxqx-.js → hume-DBocJFkA.js} +2 -2
- package/server/hume-DtWN8oV5.js +3 -0
- package/server/{idle-stack-reaper-BYqERdkE.js → idle-stack-reaper-CyGxXOfC.js} +1 -1
- package/server/{idle-stack-reaper-CnGx_PO_.js → idle-stack-reaper-DQFh8rDh.js} +2 -2
- package/server/{in-flight-guard-Bq3epG58.js → in-flight-guard-nXEKoxI7.js} +1 -1
- package/server/{infra-BjuxvjdS.js → infra-BDQDRopn.js} +15 -4
- package/server/{injection-UCf8EsjX.js → injection-CCopdUKz.js} +7 -7
- package/server/{injection-DZxlV2al.js → injection-DfFFEMKL.js} +1 -1
- package/server/inspect-agent-CPqXI81t.js +2 -0
- package/server/{inspect-agent-6kylZnrm.js → inspect-agent-FCDlNT_i.js} +12 -12
- package/server/{internal-token-DvMTQSOS.js → internal-token-BG6yQKNL.js} +2 -2
- package/server/{internal-token-M9omeXM1.js → internal-token-BJZa40Ld.js} +1 -1
- package/server/{io-VHvc0Ssp.js → io-C0NV7y6C.js} +4 -4
- package/server/{issue-closed-B6KJkmHZ.js → issue-closed-CNNGbhWm.js} +8 -8
- package/server/{issue-lifecycle-C4Zj0WmE.js → issue-lifecycle-BXfzxFCD.js} +29 -23
- package/server/{issue-lifecycle-9gk3fnXN.js → issue-lifecycle-DSH0GpWC.js} +1 -1
- package/server/{issue-service-singleton-DmCh7EHj.js → issue-service-singleton-F3A5VP6M.js} +10 -10
- package/server/{issue-service-singleton-PMx8F1jr.js → issue-service-singleton-lwFJ4dHk.js} +1 -1
- package/server/{issues-CgnQ1OGQ.js → issues-DA-U_MpR.js} +2 -2
- package/server/{jsonl-parser-DJOH_O-w.js → jsonl-parser-BXiGANOh.js} +3 -3
- package/server/{label-cleanup-Dv7AV_R1.js → label-cleanup-BnxRk0Eo.js} +3 -3
- package/server/{lifecycle-CTdOWYMi.js → lifecycle-DOgGnpIv.js} +2 -2
- package/server/{lifecycle-DDN8ApVY.js → lifecycle-Di48-w4x.js} +6 -6
- package/server/{lifecycle-io-D-lGdzK3.js → lifecycle-io-1XSeczTr.js} +5 -5
- package/server/{lifecycle-io-D_zTLvP1.js → lifecycle-io-eVG6v_8-.js} +1 -1
- package/server/{linear-client-BQU36QqE.js → linear-client-CYZRrcjp.js} +3 -3
- package/server/{linear-client-CY4O_Tu3.js → linear-client-CvGo9n7M.js} +1 -1
- package/server/{linear-mcp-auth-BnU4TYfY.js → linear-mcp-auth-Cp0XaP96.js} +5 -5
- package/server/{linear-mcp-auth-NYBq_oHZ.js → linear-mcp-auth-DoJnjdPZ.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-Bpx4jjht.js → merge-DO14mOr3.js} +3 -3
- package/server/{merge-idOG--29.js → merge-ZF99ig6A.js} +1 -1
- package/server/{merge-agent-DrXa1CpW.js → merge-agent-C1-9zbP_.js} +1 -1
- package/server/{merge-agent-DdMVSV2Y.js → merge-agent-gpiRkcvj.js} +31 -31
- package/server/{merge-batch-C5q1c1GX.js → merge-batch-C11ocNkO.js} +1 -1
- package/server/{merge-completeness-BMm8tMyZ.js → merge-completeness-BUzPZy0E.js} +4 -4
- package/server/{merge-completeness-D0ljXbk3.js → merge-completeness-CghMbyX7.js} +1 -1
- package/server/merge-ops-7QqziXAh.js +2 -0
- package/server/merge-rebase-B4pgzvQJ.js +2 -0
- package/server/{merge-rebase-xLnMlw5h.js → merge-rebase-iwlUzZjr.js} +2 -2
- package/server/{merge-set-DzsOTBg5.js → merge-set-BymrheTj.js} +1 -1
- package/server/{merge-set-DH7ot3yz.js → merge-set-Dbnx4chw.js} +4 -4
- package/server/{merge-sync-CQ-LgZ1_.js → merge-sync-CM978zez.js} +7 -4
- package/server/merge-sync-CqEtqjI2.js +3 -0
- package/server/{merge-train-DTEMyIu4.js → merge-train-DvLcAn1G.js} +4 -4
- package/server/{merge-train-deps-CNPJzepw.js → merge-train-deps-Cl_kcRbO.js} +21 -15
- package/server/{merge-verification-x3JO8Dtz.js → merge-verification-c9Y9mllw.js} +6 -6
- package/server/{merged-docker-cleanup-worker-CTpC27Bs.js → merged-docker-cleanup-worker-CGiDOdv8.js} +3 -3
- package/server/{merged-docker-cleanup-worker-Cdi9apm-.js → merged-docker-cleanup-worker-DgsLOx3E.js} +1 -1
- package/server/{multipart-parser-IMSBfePV.js → multipart-parser-D0twwRjz.js} +2 -2
- package/server/{no-resume-mode-C5ULAXwO.js → no-resume-mode-DZvP0M_S.js} +1 -1
- package/server/node_modules/.package-lock.json +4 -4
- package/server/node_modules/@types/node/README.md +1 -1
- package/server/node_modules/@types/node/crypto.d.ts +1 -1
- package/server/node_modules/@types/node/package.json +2 -2
- package/server/{orphan-proposed-reconciler-CWmOdM9-.js → orphan-proposed-reconciler-6r2OEfYd.js} +1 -1
- package/server/{orphan-proposed-reconciler-Dg6U4ADZ.js → orphan-proposed-reconciler-DtQP6oE_.js} +230 -31
- package/server/package-lock.json +5 -5
- package/server/package.json +1 -1
- package/server/{pan-dir-ubraCiUg.js → pan-dir-DAOb1V2-.js} +4 -4
- package/server/{paths-cXmOwSbh.js → paths-DuATV5iE.js} +2 -2
- package/server/{pending-lifecycle-claim-DEteYdS9.js → pending-lifecycle-claim-DQUHIDfX.js} +2 -2
- package/server/persistent-logger-CBj016pT.js +57 -0
- package/server/{pickup-D8xtG1J2.js → pickup-zXZl5lQI.js} +4 -3
- package/server/{pipeline-membership-CrAPLYtf.js → pipeline-membership-B2yUcBz7.js} +1 -1
- package/server/{pipeline-membership-BGSvkT2M.js → pipeline-membership-DHOXmvba.js} +1 -1
- package/server/{pipeline-membership-gather-CET40frr.js → pipeline-membership-gather-BIcJ-N0W.js} +114 -9
- package/server/{pipeline-membership-gather-DTfcgxLl.js → pipeline-membership-gather-OkLXuvxR.js} +1 -1
- package/server/{pipeline-notifier-ImNXknf0.js → pipeline-notifier-BmwrVKsO.js} +1 -1
- package/server/{pipeline-notifier-BuQ0e4hF.js → pipeline-notifier-CxMes51i.js} +2 -2
- package/server/{post-merge-lifecycle-worker-DbO10pum.js → post-merge-lifecycle-worker-3u_rA4R0.js} +3 -3
- package/server/{project-pipelines-Bim6bThI.js → project-pipelines-C3SPFJ38.js} +2 -2
- package/server/{project-repos-C0nuoBGv.js → project-repos-BOpBzkO6.js} +2 -2
- package/server/{project-repos-CRE6Ykow.js → project-repos-BgW4lcIa.js} +1 -1
- package/server/{projects-B03Wr-xc.js → projects-_n3Zui6K.js} +1 -1
- package/server/{prompts-BEx08AIu.js → prompts-B0TtboFm.js} +2 -2
- package/server/{providers-D7IluJe0.js → providers-BI1mOBQ4.js} +1 -1
- package/server/{providers-evXhiQeg.js → providers-O2smCvSz.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-D1s4-Sqp.js → chunk-BO2N2NFS-D_pGACYN.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-1gdMoSF7.js → diagram-OG6HWLK6-BO6fe3hH.js} +1 -1
- package/server/public/assets/{dist-DqDRYW6P.js → dist-5zingMiA.js} +3 -3
- package/server/public/assets/{dist-CxAOHbil.js → dist-CVxhbI2E.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-BYex-Ec7.js → ganttDiagram-6RSMTGT7-Bgj4A7kp.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-DlVkiG0S.js → highlighted-body-OFNGDK62-DNPK7_cm.js} +1 -1
- package/server/public/assets/{index-K0hAYCgV.js → index-DEpY-D1O.js} +148 -148
- package/server/public/assets/index-Ddkcz3WT.css +1 -0
- package/server/public/assets/{linear-B4cuEFmO.js → linear-BB0jQT16.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-CBHNBIJQ.js → pieDiagram-4H26LBE5-DeGIzzpZ.js} +1 -1
- package/server/public/assets/{prod-CN2nHBvX.js → prod-XBLvikex.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bom87VOQ.js → quadrantDiagram-W4KKPZXB-BV9SLeWz.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-UrBeyLxk.js → sankeyDiagram-5OEKKPKP-Dwja0gj8.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-DhkbrIxR.js → xychartDiagram-2RQKCTM6-DCB4qvfw.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-DHWiKxo7.js → pull-requests-BonZ4WVG.js} +3 -3
- package/server/{pull-requests-Cv7LxzUN.js → pull-requests-DNcJUVWA.js} +1 -1
- package/server/{queries-DHJm7bTd.js → queries-DCX27GRr.js} +266 -155
- package/server/{rally-B71M9f4o.js → rally-Cxe7lKYX.js} +3 -3
- package/server/{rally-api-D5uXN08-.js → rally-api-Cp50exEi.js} +1 -1
- package/server/{rally-api-Dkqmok65.js → rally-api-CzkKenoi.js} +2 -2
- package/server/{rally-client-CxsA6ExK.js → rally-client-Bu3Cekkw.js} +1 -1
- package/server/{rally-client-Bfqm6XI4.js → rally-client-CyBBEDHu.js} +5 -5
- package/server/rally-x6ztTQo4.js +3 -0
- package/server/{reap-terminal-sessions-CvmwaqKv.js → reap-terminal-sessions-CtAhr6L0.js} +2 -2
- package/server/{reap-terminal-sessions-BQ23nriz.js → reap-terminal-sessions-DvFqQUnq.js} +2 -2
- package/server/{rebuild-stack-qeRqHZxH.js → rebuild-stack-BKYpIPDL.js} +2 -2
- package/server/{rebuild-stack-0EEYReVZ.js → rebuild-stack-hCQtprWC.js} +7 -7
- package/server/{reconstruct-cache-BbYFsqLa.js → reconstruct-cache-CF2avArx.js} +9 -8
- package/server/{record-CtroO946.js → record-BTwWhtBb.js} +1 -1
- package/server/{record-update-Z0QCxmMp.js → record-update-DaOKS7Wb.js} +5 -128
- package/server/{record-update-DH6dLJID.js → record-update-DhI7eySG.js} +1 -1
- package/server/{recovery-trip-eJe26h-f.js → recovery-trip-D-wM9EfB.js} +2 -2
- package/server/{release-engine-lPUp-MTd.js → release-engine-_eO3VFth.js} +5 -5
- package/server/{release-set-BwGeyZKX.js → release-set-vxgZwwZV.js} +3 -3
- package/server/{remote-BCd02Es1.js → remote-BienmcrZ.js} +3 -3
- package/server/{remote-CVGUhXMV.js → remote-CVPCc7Vy.js} +3 -3
- package/server/{remote-agents-C1bssi41.js → remote-agents-kwsEZvXu.js} +1 -1
- package/server/{remote-agents-C_VxssLU.js → remote-agents-kxraOCGT.js} +17 -8
- package/server/{remote-completion-DAB0P706.js → remote-completion-BtmZ42aP.js} +13 -13
- package/server/resume-DXIIfJNk.js +3 -0
- package/server/{review-agent-CHhI66UP.js → review-agent-CIRr0yYt.js} +31 -29
- package/server/{review-agent-CD4RCI0Y.js → review-agent-UpAM4DmT.js} +1 -1
- package/server/{review-artifacts-DSMRIfuJ.js → review-artifacts-BCODM9ww.js} +5 -5
- package/server/{review-context-oFuBbiEE.js → review-context-BBsNrDri.js} +9 -9
- package/server/{review-convoy-liveness-CpzrcJ5F.js → review-convoy-liveness-l06_LYCt.js} +2 -2
- package/server/review-status-CacDM78F.js +3 -0
- package/server/{review-status-yljtTd-q.js → review-status-CwhA9wmd.js} +329 -110
- package/server/{review-status-emit-CUExtHd5.js → review-status-emit-BPJwYcRy.js} +3 -3
- package/server/{review-status-enrichment-QV_hQkgS.js → review-status-enrichment-DvyZAbGR.js} +3 -3
- package/server/{review-status-source-ylw5QZUR.js → review-status-source-B70ekARK.js} +1 -1
- package/server/{review-status-source-CpvJnvnQ.js → review-status-source-DWnFE0b6.js} +1 -1
- package/server/{review-status-sync-NaWvI9Xf.js → review-status-sync-B0IS6Beh.js} +1 -1
- package/server/{review-status-sync-483sujRo.js → review-status-sync-h2CJX6ju.js} +11 -6
- package/server/{review-verdict-feedback-BPDn4li_.js → review-verdict-feedback-qRohbFG2.js} +1 -1
- package/server/{review-verdict-feedback-CELeUinh.js → review-verdict-feedback-yrrmgps_.js} +91 -15
- package/server/{rollup-DTNvelz9.js → rollup-CUoav0Op.js} +8 -8
- package/server/{rollup-DYZfq1c4.js → rollup-DxCjJaAM.js} +1 -1
- package/server/{scanner-CV35oSn4.js → scanner-ChURu_b-.js} +7 -7
- package/server/{sequence-io-DF_8iuhV.js → sequence-io-D9ITDxzq.js} +4 -4
- package/server/{sequencer-agent-B2WeCtGi.js → sequencer-agent-m7gmaakW.js} +7 -6
- package/server/server.js +435 -418
- package/server/{service-Br9rpBNA.js → service-BzFG0Us_.js} +88 -59
- package/server/{session-fork-D0LY152N.js → session-fork-KBq4HIHF.js} +2 -2
- package/server/{session-history-BUyK29eq.js → session-history-C_EMhIIF.js} +7 -55
- package/server/settings-9jSGHBPY.js +2 -0
- package/server/{settings-Bse1Pdcj.js → settings-BLbcDqUp.js} +3 -3
- package/server/{settings-CvVGqNEs.js → settings-DejgzzLs.js} +2 -2
- package/server/{shadow-engineering-BWLa8ODz.js → shadow-engineering-D8R9I8Yl.js} +3 -3
- package/server/{shadow-state-FV6PHfEW.js → shadow-state-C0Af4clN.js} +1 -1
- package/server/{shadow-state-B4fpKxOO.js → shadow-state-fzIqIMDD.js} +2 -2
- package/server/{shadow-utils-D7asqxOZ.js → shadow-utils-Ugca_9ND.js} +2 -2
- package/server/{ship-log-xplJ8t75.js → ship-log-VAv-lHrF.js} +1 -1
- package/server/{smart-compaction-D3U_79f-.js → smart-compaction-B2Xu5XEb.js} +7 -7
- package/server/{smart-compaction-CPp2Ykf6.js → smart-compaction-BcYY_Suf.js} +1 -1
- package/server/{spawn-planning-session-DGfZ5B8D.js → spawn-planning-session-DhCoBPct.js} +38 -50
- package/server/spawn-planning-session-Dsv-350T.js +3 -0
- package/server/{specialist-completion-Br48eiDP.js → specialist-completion-z6v3ZqJE.js} +1 -1
- package/server/{specialist-context-cVbGnTa3.js → specialist-context-CrA5azkJ.js} +5 -5
- package/server/{specialist-handoff-logger-DK-GTz4s.js → specialist-handoff-logger-CmpZYJMB.js} +2 -2
- package/server/{specialist-logs-Cl5-hqT8.js → specialist-logs-BorrIu0x.js} +3 -3
- package/server/{specialists-CNfYO3G2.js → specialists-2yLmqph9.js} +298 -180
- package/server/{specialists-Tdezg_6N.js → specialists-CH6ah6D-.js} +1 -1
- package/server/{specialists-Cicieuzu.js → specialists-Dfx9_Wzb.js} +18 -18
- package/server/{specialists-JHsdU3pA.js → specialists-ZdrifiKx.js} +1 -1
- package/server/specs-DKV3jIEs.js +3 -0
- package/server/{src-Ck028hjO.js → src-B2e5rGu2.js} +6 -6
- package/server/{src-CRmCHlma.js → src-B948bGVR.js} +57 -13
- package/server/{src-UWcGe0Ix.js → src-Dm_NV7f6.js} +3 -3
- package/server/{stack-health-DqSqx0zv.js → stack-health-Bf2WdG4E.js} +2 -2
- package/server/{stack-health-CJLMrLBl.js → stack-health-CoWAhA99.js} +1 -1
- package/server/{stale-task-claims-CYFOUNlT.js → stale-task-claims-D1Ll8fI5.js} +5 -4
- package/server/{staleness-D47CUJok.js → staleness-45qZ_a60.js} +1 -1
- package/server/{staleness-BQ-0gMYK.js → staleness-CuED1Psm.js} +1 -1
- package/server/{state-home-BYV7qZTW.js → state-home-B4EWfIxF.js} +2 -2
- package/server/{state-mapping-BVldLhBf.js → state-mapping-BEONzr8P.js} +1 -1
- package/server/{state-migrate-CvvBtS0Y.js → state-migrate-Cd8BH33U.js} +4 -4
- package/server/{stuck-remediation-Wt0UVvu1.js → stuck-remediation-ChcooZuk.js} +1 -1
- package/server/{stuck-remediation-mkLC6G_t.js → stuck-remediation-DmY5UJLg.js} +24 -23
- package/server/{substrate-bug-weights-service-XfLAKnmK.js → substrate-bug-weights-service-BvTWrFUz.js} +3 -3
- package/server/{summary-fork-CD7GOts0.js → summary-fork--Jr8duYh.js} +2 -2
- package/server/{summary-fork-xiXBnWG9.js → summary-fork-Ct514_Jl.js} +8 -8
- package/server/supervisor/{injection-budget-B5SbvDx2.js → injection-budget-B3UyEONL.js} +1 -1
- package/server/supervisor/{paths-K3noE4N_.js → paths-BBOnCYlO.js} +10 -2
- package/server/supervisor/pty-supervisor.js +4 -4
- package/server/supervisor/{pty-token-B7lp0ElT.js → pty-token-CWRffcCa.js} +3 -3
- package/server/{supervisor-DL788vos.js → supervisor-B7BHGcNA.js} +3 -3
- package/server/supervisor-CyR_mW5B.js +2 -0
- package/server/{swarm-readiness-BV14DF5N.js → swarm-readiness-MNE5O8hn.js} +3 -3
- package/server/{system-prerequisites-pdWG6ZQs.js → system-prerequisites-Cin9ZgDx.js} +2 -2
- package/server/{teardown-workspace-l2F4_zim.js → teardown-workspace-CvBpvc85.js} +15 -15
- package/server/{test-agent-queue-qakFIIGz.js → test-agent-queue-DmSIqays.js} +8 -7
- package/server/{test-verdict-Gw-btEfb.js → test-verdict-BieVDAV1.js} +1 -1
- package/server/{test-verdict-BJYDggMm.js → test-verdict-Cy2jJGTe.js} +1 -1
- package/server/{tldr-daemon-BKOYB616.js → tldr-daemon-Ca0eovh3.js} +1 -1
- package/server/{tldr-daemon-CBaWkV9k.js → tldr-daemon-IOssGwg7.js} +2 -2
- package/server/{tmux-B1Wbxz5o.js → tmux-CfDHob9M.js} +174 -4
- package/server/{tmux-DQ6jB76i.js → tmux-Ctk6RV5l.js} +1 -1
- package/server/{token-Cxbk023d.js → token-B10VFNOD.js} +2 -2
- package/server/{token-util-CLq2MmQt.js → token-util-CZ8WPtdk.js} +1 -1
- package/server/token-util-CrfQ2FKf.js +3 -0
- package/server/{tracker-config-DZ8Zn2nQ.js → tracker-config-CHbrjg6m.js} +2 -2
- package/server/{tracker-utils-L0FKtjq2.js → tracker-utils-DZZq_C0R.js} +2 -2
- package/server/{traefik-connect-bNX6jKkb.js → traefik-connect-GHomyBaD.js} +1 -1
- package/server/{tunnel-BAm1XgjG.js → tunnel-Bdyb-sNq.js} +3 -3
- package/server/{tunnel-CjSnHdTc.js → tunnel-Dz7y434T.js} +1 -1
- package/server/{typed-errors-BHhE85Ul.js → typed-errors-BR_RmPS_.js} +1 -1
- package/server/{typed-errors-2BTMxkZq.js → typed-errors-Bn_2WRU7.js} +1 -1
- package/server/{types-hraoaQIp.js → types-D2ETIB8T.js} +1 -1
- package/server/{types-q67TYYg5.js → types-Dh6RI5Vj.js} +1 -1
- package/server/{uat-promote-verification-CKB9ZrKC.js → uat-promote-verification-DyvQXvIn.js} +5 -5
- package/server/{uat-train-D5UjcyAa.js → uat-train-Dv0Bxer7.js} +0 -0
- package/server/{uat-train-Cu-4nvbf.js → uat-train-diX_7shd.js} +1 -1
- package/server/{validate-Cxsx5Uz1.js → validate-606KcYZC.js} +3 -3
- package/server/{validation-DEaTZafj.js → validation-Cf7aaV5A.js} +1 -1
- package/server/{validation-VZgJxmqc.js → validation-CnrDul1x.js} +4 -4
- package/server/{verification-artifact-g3yuxQDL.js → verification-artifact-D4b-bio9.js} +1 -1
- package/server/{verification-artifact-C85cRTc_.js → verification-artifact-GOaj8u2s.js} +1 -1
- package/server/{verification-runner-KDZIsBj4.js → verification-runner-B5MVxDvU.js} +19 -19
- package/server/{verification-runner-DlZI8yhw.js → verification-runner-DiPaUP-C.js} +1 -1
- package/server/{vtt-parser-Jr94BF3Y.js → vtt-parser-CMU5EZ5R.js} +1 -1
- package/server/{work-agent-prompt-C-vuP3_J.js → work-agent-prompt-Csb3fbVR.js} +9 -9
- package/server/{workflows-D0oip4eV.js → workflows-D87ajwV6.js} +113 -43
- package/server/workflows-DN6NyVGd.js +2 -0
- package/server/{workspace-BqFg__wH.js → workspace-AIOM7n00.js} +1 -1
- package/server/{workspace-anchor-drift-B4gMRHl4.js → workspace-anchor-drift-19cJ1bH5.js} +1 -1
- package/server/{workspace-anchor-drift-CZKofakh.js → workspace-anchor-drift-C3mK5wNI.js} +4 -4
- package/server/{workspace-config-B123aZl-.js → workspace-config-CJ7RqQiP.js} +1 -1
- package/server/{workspace-C0fH3aek.js → workspace-iD8oULqu.js} +3 -3
- package/server/{workspace-manager-CDTKjjdU.js → workspace-manager-B38rFWA1.js} +1 -1
- package/server/{workspace-manager-CwO-Hek7.js → workspace-manager-CXfrw4rR.js} +13 -13
- package/server/{workspace-metadata-D4M8BM4W.js → workspace-metadata-BuMRco5P.js} +1 -1
- package/server/{workspace-metadata-CQv00QwK.js → workspace-metadata-eHSj_NsP.js} +2 -2
- package/server/{workspaces-j1e_6aAT.js → workspaces-DbtMX2TM.js} +136 -113
- package/sync-sources/skills/pan-merge/SKILL.md +7 -5
- package/sync-sources/skills/pan-release/SKILL.md +57 -0
- package/server/agent-state-service-hZpxIw1E.js +0 -2
- package/server/archive-planning-0FJ6Xd3b.js +0 -2
- package/server/cli-DmXETsw-.js +0 -3
- package/server/conflict-gate-Dh754uyA.js +0 -3
- package/server/deacon-swarm-I2JfX5Tg.js +0 -2
- package/server/dist-DSlxIU1H.js +0 -3
- package/server/durable-review-pipeline-jpgCJZFp.js +0 -3
- package/server/forge-DK3blQb_.js +0 -3
- package/server/hume-Dq--7rOQ.js +0 -3
- package/server/inspect-agent-BVwDrVrz.js +0 -2
- package/server/label-reconciler--F85rufp.js +0 -113
- package/server/merge-ops-DdpTiEMt.js +0 -2
- package/server/merge-rebase-DGQpYJU3.js +0 -2
- package/server/merge-sync-Ca7F5JnQ.js +0 -3
- package/server/public/assets/index-Cc7cnFC4.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +0 -1
- package/server/rally-YDjU513q.js +0 -3
- package/server/resume-u9byntrq.js +0 -3
- package/server/review-status-BZH8h-6W.js +0 -3
- package/server/settings-CdvIF84R.js +0 -2
- package/server/spawn-planning-session-1nFi3gfk.js +0 -2
- package/server/specs-Bt7WJDoC.js +0 -3
- package/server/supervisor-UWiQNK-y.js +0 -2
- package/server/token-util-zlz9U0ki.js +0 -3
- package/server/workflows-CHrx_hcW.js +0 -2
package/server/server.js
CHANGED
|
@@ -1,115 +1,115 @@
|
|
|
1
1
|
import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import { A as canUseHarnessSync, An as extractTeamPrefix, Cn as resolveStateReadHomeSync, D as resolveTieredExecutionEnabled, Dr as GitHubApiError, E as resolveTieredExecutionBlock, Fr as init_errors, Gn as init_projects, Gr as OVERDECK_HOME, H as init_providers, I as UnknownModelError, In as getIssuePrefix, Ir as AGENTS_DIR, J as defaultBackgroundAiFeatures, Jn as listProjects, M as init_harness_policy, Mn as findProjectByPathSync, Mt as getIssueWorkspacePath, Nr as TrackerError, On as ProjectRenameError, Pn as findProjectByTeamSync, Pt as init_record, Q as computeModelOrigin, Qr as SYNC_SOURCES, R as getBuiltInDefaultHarness, Sn as init_state_read_home, T as init_tier_table, Tr as FsError, V as getProviderForModelSync, Vr as CLAUDE_DIR, Wr as LOGS_DIR, X as DEFAULT_ROLES, Y as init_registry, Yn as listProjectsSync, Z as DEFAULT_WORKHORSES, Zn as loadProjectsConfigSync, _ as getDefaultDocsConfig, ar as resolveProjectFromIssueSync, at as getModelEffortLevelsSync, ci as
|
|
3
|
-
import { a as shouldRefuseHostDashboardPort, i as readHostDashboardApiPort, n as getDashboardIdentity, r as isNonPrimaryCheckoutRoot } from "./deacon-nudge-log-
|
|
4
|
-
import { $ as composerCommandConfirmationFromBody, A as resolveAllowedHarness, B as cleanupUnreferencedConversationAttachments, C as handleConversationCreate, Ct as
|
|
2
|
+
import { A as canUseHarnessSync, An as extractTeamPrefix, Cn as resolveStateReadHomeSync, D as resolveTieredExecutionEnabled, Dr as GitHubApiError, E as resolveTieredExecutionBlock, Fr as init_errors, Gn as init_projects, Gr as OVERDECK_HOME, H as init_providers, I as UnknownModelError, In as getIssuePrefix, Ir as AGENTS_DIR, J as defaultBackgroundAiFeatures, Jn as listProjects, M as init_harness_policy, Mn as findProjectByPathSync, Mt as getIssueWorkspacePath, Nr as TrackerError, On as ProjectRenameError, Pn as findProjectByTeamSync, Pt as init_record, Q as computeModelOrigin, Qr as SYNC_SOURCES, R as getBuiltInDefaultHarness, Sn as init_state_read_home, T as init_tier_table, Tr as FsError, V as getProviderForModelSync, Vr as CLAUDE_DIR, Wr as LOGS_DIR, X as DEFAULT_ROLES, Y as init_registry, Yn as listProjectsSync, Z as DEFAULT_WORKHORSES, Zn as loadProjectsConfigSync, _ as getDefaultDocsConfig, ai as getDocsTelemetryPath, ar as resolveProjectFromIssueSync, at as getModelEffortLevelsSync, ci as getOverdeckHome, cn as flushAutoCommits, ct as modelSupportsImagesSync, d as loadConfigNoMigration, di as packageRoot, dr as setProjectSwarmPolicySync, er as registerProjectSync, f as loadConfigSync, g as mergeConfigs, gr as init_issue_id, gt as ROLE_EFFORTS, h as jsYaml, hr as extractPrefixSync, ht as PARENT_MODEL_REF, i as getConversationsConfig, ii as getDocsIndexPath, ir as resolveProjectFromIssue, jr as ProcessSpawnError, k as validateTieredExecutionConfig, li as init_paths, ln as init_auto_commit, lr as setProjectAutoMergeDefaultSync, lt as resolveModelIdSync, m as init_js_yaml, mt as COMPLIANCE_MODES, n as clearConfigCache, ni as getDocsBudgetStatePath, nt as MODEL_CAPABILITIES, o as getGlobalConfigPath, ot as hasModelCapabilitySync, p as updateConversationsConfig, pi as sessionFilePath, r as getConversationSearchConfigSync, ri as getDocsDisableStatePath, rr as resolveInfraRepo, rt as MODEL_DEPRECATIONS, s as init_load, si as getLegacyHome, sn as flushAllPendingAutoCommits, st as init_model_capabilities, t as init_config_yaml, ti as encodeClaudeProjectDir, tr as renameProject, tt as resolveModel, u as isTldrEnabledSync, ui as isDevMode, ur as setProjectMergeTrainSync, v as getDefaultTtsDaemonConfig, vr as parseIssueIdSync, w as TieredExecutionConfigError, xr as require_dist$1, y as mergeTtsDaemonConfigs, z as getKimiAnthropicBaseUrl, zn as getProjectSync, zt as readIssueRecordSync } from "./config-yaml-CxdwhAIA.js";
|
|
3
|
+
import { a as shouldRefuseHostDashboardPort, i as readHostDashboardApiPort, n as getDashboardIdentity, r as isNonPrimaryCheckoutRoot } from "./deacon-nudge-log-DPHsO14z.js";
|
|
4
|
+
import { $ as composerCommandConfirmationFromBody, A as resolveAllowedHarness, At as jsonResponse, B as cleanupUnreferencedConversationAttachments, C as handleConversationCreate, Ct as waitForSessionRespawn, D as handleConversationStop, Dt as validateOriginHeaders, E as handleConversationResume, Et as validateOrigin$1, F as tmuxSessionExists, G as isManagedConversationAttachmentPath, H as extractConversationAttachmentPaths, I as waitForPiTuiReady, J as composerCommandResultHttpStatus, K as removeConversationAttachment, L as waitForTmuxSession$1, M as spawnConversationSession, N as startConversationModelBackfill, O as handleConversationSwitchModel, Ot as httpHandler, P as stopConversationRuntime, Q as ComposerCommandConfirmationError, R as cleanupConversationAttachments, S as conversationSessionAliveFromState, St as isRespawnPending, T as handleConversationRestartAll, Tt as isTrustedOriginForHost, U as getConversationAttachmentsRoot, V as ensureConversationAttachmentDir, W as hasConversationAttachment, X as resolvePolicy, Y as handleComposerCommandMessage, Z as ComposerCommandParseError, _ as isPiControlChannelHarness, _t as dashboardSessionCookieHeader, a as agentsRouteLayer, at as resolveConversationGitInfo, b as validateConversationControlAckOrigin, bt as rejectUnauthorizedDashboardSessionMintRequest, c as codexConversationPendingInput, d as handleConversationCodexApproval, dt as resolveAgentHarness, et as evaluateSpawnGuardrails, f as handleConversationCompact, ft as resolveClaudeSessionId, g as handleConversationThinkingLevel, gt as dashboardCsrfToken, h as handleConversationPlanAction, ht as resolvePiSessionPath, it as resolveAgentGitInfo, j as shouldReportUnresolvedLiveSession, jt as jsonStringResponse, k as isInsideGitWorkTree, kt as getDefaultCwd, l as deliverConversationViaControlChannel, lt as readLauncherPinnedSessionId, m as handleConversationDeliveryMethod, mt as resolveJsonlPath, nt as isInternalAgentRequest, o as saveAgentStateAndEmitEvent, p as handleConversationControlAck, pt as resolveCodexRolloutPath, q as runInBatches, rt as resolveRequestedStartedBy, s as saveAgentStateAndEmitEventProgram, st as panCliInvocation, t as specialistsRouteLayer, tt as invalidateAgentsCache, u as handleConversationAbort, ut as resolveAcpTranscriptPath, v as pickDeliverAs, vt as hasDashboardInternalToken, w as handleConversationDelete, wt as getHeaderFromMap, x as conversationNeedsRunningRepair, xt as rejectUnsafeDashboardMutationRequest, y as resolveConversationDeliveryMethod, yt as rejectUnauthorizedDashboardRequest, z as cleanupOrphanedConversationAttachments } from "./specialists-2yLmqph9.js";
|
|
5
5
|
import { a as emitDashboardLifecycleSync, i as emitActivityTtsSync, o as init_activity_logger, r as emitActivityEntrySync } from "./activity-logger-CyteR4JO.js";
|
|
6
|
-
import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-
|
|
6
|
+
import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-BDQDRopn.js";
|
|
7
7
|
import { n as openDatabase, t as init_driver } from "./driver-CKVGi51s.js";
|
|
8
|
-
import { i as updateIssueRecord, n as clearRecordPipelineClosedOutSync, r as init_record_update } from "./record-update-
|
|
9
|
-
import {
|
|
10
|
-
import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-
|
|
11
|
-
import { A as AgentRuntimeSnapshot, C as FlywheelStatus, E as SystemHealthSnapshot, M as ReviewStatusSnapshot, O as MemoryObservation, S as FlywheelRunId, T as DomainEvent, b as PanRpcGroup, j as AgentSnapshot, l as ContextLayerSaveRequest, n as COMPOSER_COMMAND_MANIFEST, p as FlywheelStats, r as compareIssueIds, s as getHarnessBehavior, t as init_src, u as ContextPreviewRequest, w as EDITORS, x as WS_METHODS, y as PanRpcError } from "./src-
|
|
12
|
-
import { A as
|
|
13
|
-
import { a as EventStoreService, c as ReadModelService, f as init_read_model, h as toRole, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toAgentStatus, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentResolution, s as init_domain_services, t as IssueLifecycle, u as activityEntriesFromStoredEvents } from "./issue-lifecycle-
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { i as
|
|
17
|
-
import { n as
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import { a as
|
|
21
|
-
import {
|
|
22
|
-
import { u as
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import { i as
|
|
28
|
-
import { i as
|
|
29
|
-
import { i as
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import { i as
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
43
|
-
import { i as
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
import {
|
|
50
|
-
import {
|
|
51
|
-
import { n as
|
|
52
|
-
import {
|
|
53
|
-
import {
|
|
54
|
-
import { i as
|
|
55
|
-
import {
|
|
56
|
-
import {
|
|
57
|
-
import {
|
|
58
|
-
import { i as
|
|
59
|
-
import { n as
|
|
60
|
-
import {
|
|
61
|
-
import {
|
|
62
|
-
import {
|
|
63
|
-
import { c as
|
|
64
|
-
import {
|
|
65
|
-
import { c as
|
|
66
|
-
import { n as
|
|
67
|
-
import {
|
|
68
|
-
import { n as
|
|
69
|
-
import {
|
|
70
|
-
import {
|
|
71
|
-
import {
|
|
72
|
-
import {
|
|
73
|
-
import {
|
|
74
|
-
import {
|
|
75
|
-
import {
|
|
76
|
-
import {
|
|
77
|
-
import {
|
|
78
|
-
import {
|
|
79
|
-
import {
|
|
80
|
-
import { a as
|
|
81
|
-
import {
|
|
82
|
-
import {
|
|
83
|
-
import {
|
|
84
|
-
import {
|
|
85
|
-
import {
|
|
86
|
-
import {
|
|
87
|
-
import {
|
|
88
|
-
import { d as killRemoteAgent, m as loadRemoteAgentState, o as getRemoteAgentOutput, r as checkRemoteSpendCap, s as init_remote_agents, v as sendToRemoteAgent, y as spawnRemoteAgent } from "./remote-agents-
|
|
89
|
-
import { r as spawnInspectAgent } from "./inspect-agent-
|
|
90
|
-
import { i as lookupPullRequestNumberForBranch, n as init_github_pr_lookup, t as githubPrLookupSource } from "./github-pr-lookup-
|
|
91
|
-
import { a as fetchIssuePullRequestDiff, c as getCachedIssuePrTabResponse, d as setCachedIssuePrTabResponse, i as fetchIssuePullRequestDetails, l as getIssuePrTabCacheGeneration, n as fetchIssueCheckRuns, o as init_pull_requests, r as fetchIssuePullRequest, s as bumpIssuePrTabCacheGeneration, u as init_pr_tab_cache } from "./pull-requests-
|
|
92
|
-
import { n as DOD_ROWS } from "./dod-
|
|
93
|
-
import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-
|
|
94
|
-
import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-
|
|
95
|
-
import { T as listGitOperationsSync, w as init_git_activity } from "./merge-agent-
|
|
96
|
-
import { t as readVerificationArtifact } from "./verification-artifact-
|
|
97
|
-
import { i as readPendingDeploy, n as init_deploy_queue } from "./deploy-queue-
|
|
98
|
-
import { t as getAgentCommandSync } from "./settings-
|
|
99
|
-
import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-
|
|
100
|
-
import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-
|
|
101
|
-
import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-
|
|
102
|
-
import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-
|
|
103
|
-
import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-
|
|
104
|
-
import { t as init_context_layers } from "./context-layers-
|
|
105
|
-
import { a as appendLinearMcpAuthHealthyEvent, r as appendLinearMcpAuthCallbackRelayedEvent, u as resolveLinearMcpAuthIntervention } from "./linear-mcp-auth-
|
|
106
|
-
import { i as getMergeBlockersPayload, n as hasOrderIssuePrd, r as validateBookForStart, t as createOrderPrdLookup } from "./validate-
|
|
107
|
-
import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-
|
|
108
|
-
import { n as sameCanonicalReviewStatus, t as emitReviewStatusChanged } from "./review-status-emit-
|
|
109
|
-
import "./supervisor-
|
|
110
|
-
import { l as startUatTrainReconciler, u as stopUatTrainReconciler } from "./uat-train-
|
|
111
|
-
import { n as settlePendingLifecycleClaim, t as claimPendingLifecycleFile } from "./pending-lifecycle-claim-
|
|
112
|
-
import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-
|
|
8
|
+
import { i as updateIssueRecord, n as clearRecordPipelineClosedOutSync, r as init_record_update } from "./record-update-DaOKS7Wb.js";
|
|
9
|
+
import { B as sendKeysAsync, C as getWindowDimensions, D as killSession, E as isPaneDead, H as sessionExists, J as init_pane_choice_menu, L as resizeWindow, M as listSessionNames, T as isHarnessProcessAlive, V as sendRawKeystroke, Y as paneChoiceMenuSignature, Z as parsePaneChoiceMenu, at as buildChildEnvWithoutTmuxSync, d as ensureManagedTmuxContextOnce, i as capturePane, it as buildChildEnvSync, l as deliveryVerifyLine, n as buildTmuxArgs, nt as setUiTheme, o as capturePaneText, ot as init_child_env, q as buildChoiceKeystrokes, s as createSession, tt as init_ui_theme, w as init_tmux, z as sendKeys } from "./tmux-CfDHob9M.js";
|
|
10
|
+
import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-CrHcVC5_.js";
|
|
11
|
+
import { A as AgentRuntimeSnapshot, C as FlywheelStatus, E as SystemHealthSnapshot, M as ReviewStatusSnapshot, O as MemoryObservation, S as FlywheelRunId, T as DomainEvent, b as PanRpcGroup, j as AgentSnapshot, l as ContextLayerSaveRequest, n as COMPOSER_COMMAND_MANIFEST, p as FlywheelStats, r as compareIssueIds, s as getHarnessBehavior, t as init_src, u as ContextPreviewRequest, w as EDITORS, x as WS_METHODS, y as PanRpcError } from "./src-B948bGVR.js";
|
|
12
|
+
import { A as synchronizeAnalyticsServices, C as setReviewStatusSync, F as telemetryEnvironmentForcesOff, M as init_install_id, N as init_config, O as getAnalyticsService, P as resolveTelemetryEnabled, S as setReviewStatus, _ as markWorkspaceStuck, a as clearStuckMergeStatuses, c as fixStuckCommentedReviews, d as getReviewStatusSync, h as loadReviewStatuses, i as clearReviewStatus, j as getOrCreateInstallId, k as init_service, l as fixStuckReadyForMerge, m as loadReadyForMergeFlags, p as init_review_status, u as getReviewStatus } from "./review-status-CwhA9wmd.js";
|
|
13
|
+
import { a as EventStoreService, c as ReadModelService, f as init_read_model, h as toRole, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toAgentStatus, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentResolution, s as init_domain_services, t as IssueLifecycle, u as activityEntriesFromStoredEvents } from "./issue-lifecycle-BXfzxFCD.js";
|
|
14
|
+
import { n as logAgentLifecycleSync, t as init_persistent_logger } from "./persistent-logger-CBj016pT.js";
|
|
15
|
+
import { c as listAllAgentsSync, n as AgentsResolverLive, o as init_agents } from "./agents-CtACUuVG.js";
|
|
16
|
+
import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-DuATV5iE.js";
|
|
17
|
+
import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-CUerZqWd.js";
|
|
18
|
+
import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-CUVNpAso.js";
|
|
19
|
+
import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, m as init_checkpoint_manager, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-R5tnaxEY.js";
|
|
20
|
+
import { $ as operatorInterventionEvent, $n as getAgentDir, Bt as init_transcript_landing, Cr as init_agent_record_sync, D as init_tier_supervisor, E as deliverCommitForReview, Fn as init_openai_auth, Gr as init_codex_auth, Ir as waitForReadySignal, Lr as getAgentRuntimeState, Mt as deliverAgentMessage, Nr as normalizeAgentId, Pn as getOpenAIAuthStatus, Q as init_operator_interventions, Qt as init_staffing, Rr as getAgentRuntimeStateSync, Tn as init_claude_auth, Vt as probeTranscriptSince, Wr as checkCodexAuthStatus, X as messageAgent, Y as init_messaging, _r as saveAgentStateSync, a as listRunningAgentsSync, b as init_agents$1, bt as init_concurrency, c as getRuntimeCensus, d as panePidsForSession, dn as getProviderAuthMode, en as resolveImplicitStaffing, f as refreshRuntimeCensus, i as listRunningAgents, j as supervisorAgentId, kn as getProviderEnvForModel, l as getRuntimeCensusSnapshot, mn as injectPiConversationMemory, n as init_queries, p as runtimeCensusHasHarnessProcess, r as listAgentStates, rr as getAgentStateSync, tr as getAgentState, u as init_runtime_census, vt as emergencyBrake, wn as getClaudeAuthStatus, wr as readAgentHarnessModelRecordSync, zt as captureTranscriptUserRecordSnapshot } from "./queries-DCX27GRr.js";
|
|
21
|
+
import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, d as init_cost_sync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, p as queryCostEventsSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as getTodayCostSync } from "./cost-sync-DiUBXwl6.js";
|
|
22
|
+
import { c as getAgentsNeedingAttention, d as CostResolverLive, f as CostWriter, l as CostDoorLive, n as readCloisterStateFile, o as generateHealthSummary, s as getAgentHealth, t as getCloisterService, u as CostResolver } from "./service-BzFG0Us_.js";
|
|
23
|
+
import { s as init_agent_runtime_mirror } from "./session-history-C_EMhIIF.js";
|
|
24
|
+
import { t as init_behavior } from "./behavior-B7biGtFT.js";
|
|
25
|
+
import { n as AgentStateServiceLive } from "./agent-state-service-BOzQhLjU.js";
|
|
26
|
+
import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-CHbrjg6m.js";
|
|
27
|
+
import { d as init_typed_errors, i as PlanEmpty, l as WorkspaceCreateError, n as AgentStartError, s as TrackerApiError, t as AgentAlreadyRunning, u as WorkspaceNotFound } from "./typed-errors-Bn_2WRU7.js";
|
|
28
|
+
import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-CYZRrcjp.js";
|
|
29
|
+
import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-BrAC6ELh.js";
|
|
30
|
+
import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-CyBBEDHu.js";
|
|
31
|
+
import { n as resolveGitHubIssueSync, r as resolveTrackerTypeSync, t as init_tracker_utils } from "./tracker-utils-DZZq_C0R.js";
|
|
32
|
+
import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-F3A5VP6M.js";
|
|
33
|
+
import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-BG6yQKNL.js";
|
|
34
|
+
import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-CxMes51i.js";
|
|
35
|
+
import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-h2CJX6ju.js";
|
|
36
|
+
import { n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-DWnFE0b6.js";
|
|
37
|
+
import { a as PAN_DIRNAME, d as WORKSPACE_RUNTIME_DIRNAME, f as asPanSpecDocument, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-D2ETIB8T.js";
|
|
38
|
+
import { C as scheduleAutoMergeWithResult, _ as markMerged, c as init_merge_sync, f as listActiveAutoMerges, g as markFailed, h as markBlocked, i as getActionableAutoMerge, l as isFlywheelGloballyPaused, m as listProblemAutoMerges, n as countActionableAutoMerges, p as listDuePendingAutoMerges, t as cancelPending, v as markMergingBlocked, w as transitionToMerging, x as requeueToPending } from "./merge-sync-CM978zez.js";
|
|
39
|
+
import { D as writeSpecForIssue, E as writeSpecDocument, S as init_specs, a as findWorkspaceDraftPlan, m as readWorkspacePlanSync, o as init_io, p as readWorkspacePlan, r as findPlan, s as isPlanningComplete, u as readPlan, v as init_types$1, x as findSpecByIssue, y as subItemsOf } from "./io-C0NV7y6C.js";
|
|
40
|
+
import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-CG4meRFc.js";
|
|
41
|
+
import { $ as updateConversationForkFallbackReason, A as isAgentConversationName, B as removeFavorite, C as getConversationByTmuxSession, D as importLegacyConversation, F as markConversationEnded, H as setClearedToConvId, I as markConversationRunning, J as setForkRequest, M as listConversations, N as listFavoritedIds, O as incrementForkRetryCount, P as markConversationActive, S as getConversationByName, T as getStuckForks, U as setConversationClaudeSessionId, X as unarchiveConversation, Y as setImportedConversationLinks, Z as updateConversationCost, _ as canRefineTitle, _t as getDiscoveredStats, at as aggregateDiscoveredSessionCost, b as getConversationByClaudeSessionId, ct as countDiscoveredSessions, et as updateConversationTitle, ft as findDiscoveredSessions, gt as getDiscoveredSessionBySessionId, h as archiveConversation, j as listArchivedConversationsWithEnrichment, k as init_conversations, mt as getDiscoveredSessionById, ot as aggregateDiscoveredSessionCostBy, q as setFavorite, tt as updateForkStatus, v as canReplaceTitle, w as getConversationLedgerCosts, x as getConversationById, y as createConversation, yt as init_discovered_sessions, z as recordConversationHandoff } from "./conversations-D7lR670u.js";
|
|
42
|
+
import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-B2CfNPFw.js";
|
|
43
|
+
import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-BLbcDqUp.js";
|
|
44
|
+
import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-O2smCvSz.js";
|
|
45
|
+
import { C as init_launcher_generator, D as requireModelOverrideSync, E as normalizeModelOverrideSync, S as generateLauncherScriptSync, T as init_model_validation, w as MODEL_ID_PATTERN } from "./auto-spawn-consent-BooqhC3L.js";
|
|
46
|
+
import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-DYVLnX9t.js";
|
|
47
|
+
import { C as ensureProjectLayer, E as init_layers, I as workspaceContextFile, N as resolveProjectContextFile, P as resolveWorkspaceContextFile, S as codexGlobalContextFile, T as globalContextFile$1, b as validateTemplate, c as init_render, d as userContentOutsideRegion, i as workspaceContextWithoutProjectLayer, r as init_assemble, s as hasManagedRegion, v as init_harness, y as renderForHarness } from "./assemble-DsqK9OAq.js";
|
|
48
|
+
import { l as init_codex, s as findRolloutPath } from "./codex-BYwi1uyW.js";
|
|
49
|
+
import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-CnBHpd57.js";
|
|
50
|
+
import { f as init_config$1, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-CX4vk1CV.js";
|
|
51
|
+
import { D as setSetting, E as setMergeTrainEnabled, S as setFlywheelAutoPickupBacklog, T as setLastCleanShutdownAt, b as setDeaconGloballyPausedSync, c as init_control_settings, d as isDeaconGloballyPausedSync, f as isFlywheelAutoPickupBacklog, g as setBootReconciliationDecision, h as isMergeTrainEnabled, l as isCloisterSpawnsPausedSync, m as isFlywheelRequireUatBeforeMerge, n as FLYWHEEL_GLOBAL_PAUSE_KEY, p as isFlywheelGloballyPaused$1, r as getBootReconciliationState, s as getSetting, t as FLYWHEEL_ACTIVE_RUN_ID_KEY, v as setCloisterSpawnsPausedSync, w as setFlywheelRequireUatBeforeMerge } from "./control-settings-qYYHrIqy.js";
|
|
52
|
+
import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-BVj6sI8m.js";
|
|
53
|
+
import { a as loadCloisterConfigSync, o as saveCloisterConfigSync, r as init_config$2, s as shouldAutoStart } from "./config-ktAVnp4s.js";
|
|
54
|
+
import { c as isStateMigrated, i as ensureStateWorktree, o as init_state_home, r as clearStateMigrationCache, s as inspectStateMigration } from "./state-home-B4EWfIxF.js";
|
|
55
|
+
import { i as checkPrdGateSync, s as promoteWorkspacePrdDraft, t as init_pan_dir } from "./pan-dir-DAOb1V2-.js";
|
|
56
|
+
import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-1XSeczTr.js";
|
|
57
|
+
import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-MNE5O8hn.js";
|
|
58
|
+
import { a as buildMatchQuery, c as init_query_expansion, i as resolveKnowledgeBundleRoot, n as init_injection, o as init_search, r as injectPromptTimeMemory, s as clearQueryExpansionCache } from "./injection-CCopdUKz.js";
|
|
59
|
+
import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-wROfFfje.js";
|
|
60
|
+
import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-CZ8WPtdk.js";
|
|
61
|
+
import { A as createSettledTtlPromiseCache, D as init_advisory_checks, E as verifyAppCanMerge, M as withConcurrencyLimit, O as isAdvisoryCheckName, d as getPullRequestState, f as init_github_app, j as init_concurrency$1, k as createPromiseConcurrencyLimiter, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-gVnZcP9B.js";
|
|
62
|
+
import { C as getWorkspacePathForIssue, E as stopAgentOutputService, S as resolveIssueHeadlineCost, T as startAgentOutputService, _ as getCostsForIssueSync, b as processPendingFeedbackDeliveries, d as resumeQueuedMerges, f as syncWalFromAllProjects, g as migrateAllSessionsSync, h as reclassifyUnknownCostEventsSync, l as internalEventsRouteLayer, m as reconcilePiTranscripts, p as reconcile$1, t as workspacesRouteLayer, u as eventsRouteLayer, v as rebuildCacheSync, w as retainAgentOutputInterest, x as getCachedRunningAgents, y as syncCacheSync } from "./workspaces-DbtMX2TM.js";
|
|
63
|
+
import { _ as init_codex_conversation_parser, a as contextUsageFromParseResult, b as parseAcpConversationMessages, c as parseEntireConversation, d as init_pi_conversation_parser, f as isPiSessionFile, g as parseOhmypiConversationMessages, h as isOhmypiSessionFile, i as computeContextUsage, l as parseFromLastCompactBoundary, m as init_ohmypi_conversation_parser, n as gateSnapshotEmission, o as summarizeConversationActivity, p as parsePiConversationMessages, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages, y as init_acp_conversation_parser } from "./conversation-service-CZiUE8Uw.js";
|
|
64
|
+
import { c as countPendingAskUserQuestionsForAgent, g as detectAwaitingInputFromPaneSync, h as detectAwaitingInputForAgent, l as getAgentJsonlMtime, m as scanPendingInputsPromise, o as getRuntimeForAgent, s as computeAgentEnrichment } from "./stuck-remediation-DmY5UJLg.js";
|
|
65
|
+
import { a as enrichSessions, c as searchSessions, i as CostThresholdError, l as embed, n as getSessionsFeedFacets, o as embedSessions, r as listSessionsFeed, s as parseRelativeTime, t as scan } from "./scanner-ChURu_b-.js";
|
|
66
|
+
import { c as tailEventsSync, n as deduplicateEventsSync, o as readEventsSync } from "./events-DhRN-6vM.js";
|
|
67
|
+
import { n as recordBackgroundAiCost, t as init_cost } from "./cost-CWvN9FP2.js";
|
|
68
|
+
import { a as getByIssueId, i as parseFlywheelStatsWindow, n as derivePipelineRunStatsInputs, o as markFixed, r as computeFlywheelStats, s as upsert, t as listSubstrateBugWeights } from "./substrate-bug-weights-service-BvTWrFUz.js";
|
|
69
|
+
import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-D9ITDxzq.js";
|
|
70
|
+
import { _ as normalizeGate, d as computeEpicGroups, f as computeLanes, h as init_pickup, l as classifyIssue, m as computeWaves, p as computeStats, u as computeCohort, v as selectNeedsPlanning } from "./pickup-zXZl5lQI.js";
|
|
71
|
+
import { B as getBook, C as readCurrentLatestFlywheelStatus, D as writeFlywheelLaunchMetadata, E as subscribeLatestFlywheelStatus, F as setItemRequirements, H as liveOrderIssueLookup, I as setSettings, L as setStatus, M as moveItem, N as removeItem, O as writeLatestFlywheelStatus, P as renameBook, R as backlogCandidates, S as nextFlywheelRunId, T as resolveLiveFlywheelRunId, V as listBooks, a as isFlywheelDevcontainerRuntime, b as isFlywheelRunId, f as spawnFlywheelAgent, g as abortFlywheelRun, j as createBook, k as addItems, p as buildClassifyLookups, s as loadResumeSessionId, t as FLYWHEEL_ORCHESTRATOR_AGENT_ID, u as saveResumeSessionId, v as getFlywheelRunDetail, w as readFlywheelLaunchMetadata, x as listFlywheelRuns, z as computeBookProgress } from "./flywheel-CTVY3yCG.js";
|
|
72
|
+
import { D as loadConfig, Dt as paneShowsClaudeBootBlockingScreen, F as setAgentStoppedNotifier, Ft as getCurrentDockerStats, G as isAutoResumableRole, Ht as startSmeeProcessSync, I as setMergeReadyNotifier, It as getAcceptedSystemHealthSnapshot, J as startBootReconciliation, K as isBootReconciliationCandidate, Lt as getDeployStaleness, Mt as getResourceStacks, Nt as formatUptime, O as loadState, P as setAgentStatusChangedNotifier, Pt as getContainerHistory, Ut as classifyAgentHealth, Vt as isSmeeConfiguredSync, W as extendBootReconciliationGrace, b as getDeaconLogs, n as assessDeaconPatrolFreshness, q as listBootReconciliationCandidates, t as applyBootReconciliationDecision, zt as getSystemHealthEvidenceSnapshot } from "./deacon-B1LD5cJU.js";
|
|
73
|
+
import { c as installGitHooksInDir, f as detectPlatform, p as init_platform, s as init_git_hooks } from "./workspace-manager-CXfrw4rR.js";
|
|
74
|
+
import { a as getShadowState, s as init_shadow_state } from "./shadow-state-fzIqIMDD.js";
|
|
75
|
+
import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-CNNGbhWm.js";
|
|
76
|
+
import { i as parseArtifactRef, r as init_forge } from "./forge-RTNqJe6a.js";
|
|
77
|
+
import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-xpFgU632.js";
|
|
78
|
+
import { V as getReviewerSessionName, t as init_specialists } from "./specialists-Dfx9_Wzb.js";
|
|
79
|
+
import { s as findPrdAnywhereSync } from "./archive-planning-Binfb99i.js";
|
|
80
|
+
import { A as removeIssueReleasedLabel, C as applyIssueReleasedLabel, D as removeIssueObjectionLabel, E as removeIssueBlocksMainLabel, O as removeIssueParkedLabel, S as applyIssueReadyLabel, T as init_label_ops, a as gatherProjectLensSignals, b as applyIssueObjectionLabel, g as parseIssueIdFromTextSync, h as init_resource_utils, j as removeIssueVetoedLabel, k as removeIssueReadyLabel, n as PipelineMembershipUnavailableError, s as init_pipeline_membership_gather, u as listOpenPullRequestsSnapshot, w as applyIssueVetoedLabel, x as applyIssueParkedLabel, y as applyIssueBlocksMainLabel } from "./pipeline-membership-gather-BIcJ-N0W.js";
|
|
81
|
+
import { n as init_pipeline_membership, r as resolvePipelineMembership } from "./pipeline-membership-B2yUcBz7.js";
|
|
82
|
+
import { b as resolveSwarmPolicy } from "./deacon-swarm-DwGUgSVp.js";
|
|
83
|
+
import { a as init_boot_gates, i as formatBootGateState, o as resolveBootGates } from "./no-resume-mode-DZvP0M_S.js";
|
|
84
|
+
import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-nXEKoxI7.js";
|
|
85
|
+
import { a as spawnPlanningSession, r as resolveAutoSpawnOnFinalize } from "./spawn-planning-session-DhCoBPct.js";
|
|
86
|
+
import { r as computeMergeQueueFromCandidates, s as listEligibleCandidatesByProject } from "./flywheel-merge-order-CMGz-imq.js";
|
|
87
|
+
import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-eHSj_NsP.js";
|
|
88
|
+
import { d as killRemoteAgent, m as loadRemoteAgentState, o as getRemoteAgentOutput, r as checkRemoteSpendCap, s as init_remote_agents, v as sendToRemoteAgent, y as spawnRemoteAgent } from "./remote-agents-kxraOCGT.js";
|
|
89
|
+
import { r as spawnInspectAgent } from "./inspect-agent-FCDlNT_i.js";
|
|
90
|
+
import { i as lookupPullRequestNumberForBranch, n as init_github_pr_lookup, t as githubPrLookupSource } from "./github-pr-lookup-CgMULTPf.js";
|
|
91
|
+
import { a as fetchIssuePullRequestDiff, c as getCachedIssuePrTabResponse, d as setCachedIssuePrTabResponse, i as fetchIssuePullRequestDetails, l as getIssuePrTabCacheGeneration, n as fetchIssueCheckRuns, o as init_pull_requests, r as fetchIssuePullRequest, s as bumpIssuePrTabCacheGeneration, u as init_pr_tab_cache } from "./pull-requests-BonZ4WVG.js";
|
|
92
|
+
import { n as DOD_ROWS } from "./dod-Bg6wsKTV.js";
|
|
93
|
+
import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-CUoav0Op.js";
|
|
94
|
+
import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-IOssGwg7.js";
|
|
95
|
+
import { T as listGitOperationsSync, w as init_git_activity } from "./merge-agent-gpiRkcvj.js";
|
|
96
|
+
import { t as readVerificationArtifact } from "./verification-artifact-D4b-bio9.js";
|
|
97
|
+
import { i as readPendingDeploy, n as init_deploy_queue } from "./deploy-queue-CKT_Ia9p.js";
|
|
98
|
+
import { t as getAgentCommandSync } from "./settings-DejgzzLs.js";
|
|
99
|
+
import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-CIRr0yYt.js";
|
|
100
|
+
import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-BienmcrZ.js";
|
|
101
|
+
import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-DsbpIq2d.js";
|
|
102
|
+
import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-Ct514_Jl.js";
|
|
103
|
+
import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-CXQrN3I_.js";
|
|
104
|
+
import { t as init_context_layers } from "./context-layers-DlWsDiRF.js";
|
|
105
|
+
import { a as appendLinearMcpAuthHealthyEvent, r as appendLinearMcpAuthCallbackRelayedEvent, u as resolveLinearMcpAuthIntervention } from "./linear-mcp-auth-Cp0XaP96.js";
|
|
106
|
+
import { i as getMergeBlockersPayload, n as hasOrderIssuePrd, r as validateBookForStart, t as createOrderPrdLookup } from "./validate-606KcYZC.js";
|
|
107
|
+
import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-m7gmaakW.js";
|
|
108
|
+
import { n as sameCanonicalReviewStatus, t as emitReviewStatusChanged } from "./review-status-emit-BPJwYcRy.js";
|
|
109
|
+
import "./supervisor-B7BHGcNA.js";
|
|
110
|
+
import { l as startUatTrainReconciler, u as stopUatTrainReconciler } from "./uat-train-Dv0Bxer7.js";
|
|
111
|
+
import { n as settlePendingLifecycleClaim, t as claimPendingLifecycleFile } from "./pending-lifecycle-claim-DQUHIDfX.js";
|
|
112
|
+
import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-DYtLu-PB.js";
|
|
113
113
|
import { createRequire } from "node:module";
|
|
114
114
|
import * as sp from "node:path";
|
|
115
115
|
import { basename, delimiter, dirname, extname, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
|
|
@@ -404,8 +404,10 @@ init_js_yaml();
|
|
|
404
404
|
init_load();
|
|
405
405
|
init_config_yaml();
|
|
406
406
|
init_ui_theme();
|
|
407
|
+
init_pane_choice_menu();
|
|
407
408
|
init_infra();
|
|
408
409
|
init_event_store();
|
|
410
|
+
init_persistent_logger();
|
|
409
411
|
init_agents();
|
|
410
412
|
init_read_model();
|
|
411
413
|
init_checkpoint_manager();
|
|
@@ -718,7 +720,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
718
720
|
if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
|
|
719
721
|
const plan = readWorkspacePlanSync(workspacePath);
|
|
720
722
|
if (!plan || plan.plan.items.length === 0) throw new PlanEmpty({ id: issueId });
|
|
721
|
-
const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-
|
|
723
|
+
const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-Dnn4XgdB.js");
|
|
722
724
|
const normalizedId = normalizeAgentId(issueId);
|
|
723
725
|
if ((await Effect.runPromise(getAgentState(normalizedId)))?.status === "running") throw new AgentAlreadyRunning({ id: issueId });
|
|
724
726
|
return {
|
|
@@ -728,7 +730,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
728
730
|
model: opts.model,
|
|
729
731
|
role: "work",
|
|
730
732
|
prompt: opts.prompt,
|
|
731
|
-
allowHost: opts.allowHost
|
|
733
|
+
allowHost: opts.allowHost,
|
|
734
|
+
startedBy: "dashboard:agent-spawner"
|
|
732
735
|
})).id ?? normalizedId,
|
|
733
736
|
issueId,
|
|
734
737
|
sessionName: normalizedId,
|
|
@@ -749,7 +752,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
749
752
|
const { workspacePath, projectPath, issue } = opts;
|
|
750
753
|
if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
|
|
751
754
|
const sessionName = opts.sessionName ?? `planning-${issueId.toLowerCase()}`;
|
|
752
|
-
const { spawnPlanningSession } = await import("./spawn-planning-session-
|
|
755
|
+
const { spawnPlanningSession } = await import("./spawn-planning-session-Dsv-350T.js");
|
|
753
756
|
const result = await spawnPlanningSession({
|
|
754
757
|
issue: {
|
|
755
758
|
id: issue.id,
|
|
@@ -764,7 +767,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
764
767
|
sessionName,
|
|
765
768
|
workspaceLocation: "local",
|
|
766
769
|
shadowMode: opts.shadowMode ?? false,
|
|
767
|
-
autoSpawnOnFinalize: false
|
|
770
|
+
autoSpawnOnFinalize: false,
|
|
771
|
+
startedBy: "dashboard:agent-spawner"
|
|
768
772
|
});
|
|
769
773
|
if (!result.success) throw new AgentStartError({
|
|
770
774
|
id: issueId,
|
|
@@ -782,14 +786,14 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
782
786
|
}),
|
|
783
787
|
kill: (agentId) => Effect.tryPromise({
|
|
784
788
|
try: async () => {
|
|
785
|
-
const { stopAgent } = await import("./agents-
|
|
789
|
+
const { stopAgent } = await import("./agents-Dnn4XgdB.js");
|
|
786
790
|
await Effect.runPromise(stopAgent(agentId));
|
|
787
791
|
},
|
|
788
792
|
catch: () => void 0
|
|
789
793
|
}).pipe(Effect.ignore),
|
|
790
794
|
message: (agentId, msg) => Effect.tryPromise({
|
|
791
795
|
try: async () => {
|
|
792
|
-
const { messageAgent } = await import("./agents-
|
|
796
|
+
const { messageAgent } = await import("./agents-Dnn4XgdB.js");
|
|
793
797
|
await messageAgent(agentId, msg);
|
|
794
798
|
},
|
|
795
799
|
catch: (err) => new AgentStartError({
|
|
@@ -800,8 +804,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
|
|
|
800
804
|
}),
|
|
801
805
|
deepWipe: (issueId, opts) => Effect.tryPromise({
|
|
802
806
|
try: async () => {
|
|
803
|
-
const { deepWipe } = await import("./workflows-
|
|
804
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
807
|
+
const { deepWipe } = await import("./workflows-DN6NyVGd.js");
|
|
808
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
805
809
|
const project = resolveProjectFromIssueSync(issueId);
|
|
806
810
|
const projectPath = project?.projectPath ?? process.cwd();
|
|
807
811
|
await Effect.runPromise(deepWipe({
|
|
@@ -860,8 +864,8 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
|
|
|
860
864
|
const { workspacePath, branch } = getWorkspacePath(issueId);
|
|
861
865
|
const issueLower = issueId.toLowerCase();
|
|
862
866
|
if (existsSync$1(workspacePath)) return workspacePath;
|
|
863
|
-
const { createWorkspace } = await import("./workspace-manager-
|
|
864
|
-
const { loadProjectsConfigSync } = await import("./projects-
|
|
867
|
+
const { createWorkspace } = await import("./workspace-manager-B38rFWA1.js");
|
|
868
|
+
const { loadProjectsConfigSync } = await import("./projects-_n3Zui6K.js");
|
|
865
869
|
const { projects } = loadProjectsConfigSync();
|
|
866
870
|
const project = resolveProjectFromIssueSync(issueId);
|
|
867
871
|
if (!project) throw new WorkspaceCreateError({
|
|
@@ -896,7 +900,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
|
|
|
896
900
|
const { workspacePath } = getWorkspacePath(issueId);
|
|
897
901
|
const issueLower = issueId.toLowerCase();
|
|
898
902
|
if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
|
|
899
|
-
const { removeWorkspace } = await import("./workspace-manager-
|
|
903
|
+
const { removeWorkspace } = await import("./workspace-manager-B38rFWA1.js");
|
|
900
904
|
const project = resolveProjectFromIssueSync(issueId);
|
|
901
905
|
if (!project) throw new WorkspaceCreateError({
|
|
902
906
|
id: issueId,
|
|
@@ -927,7 +931,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
|
|
|
927
931
|
try: async () => {
|
|
928
932
|
const { workspacePath } = getWorkspacePath(issueId);
|
|
929
933
|
const issueLower = issueId.toLowerCase();
|
|
930
|
-
const { stopWorkspaceDocker } = await import("./workspace-manager-
|
|
934
|
+
const { stopWorkspaceDocker } = await import("./workspace-manager-B38rFWA1.js");
|
|
931
935
|
await Effect.runPromise(stopWorkspaceDocker(workspacePath, issueLower));
|
|
932
936
|
},
|
|
933
937
|
catch: () => void 0
|
|
@@ -996,7 +1000,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
|
|
|
996
1000
|
join(workspacePath, ".devcontainer", "docker-compose.devcontainer.yml")
|
|
997
1001
|
];
|
|
998
1002
|
if (!composePaths.find((p) => existsSync$1(p))) {
|
|
999
|
-
const { ensureDevcontainerSync } = await import("./ensure-devcontainer-
|
|
1003
|
+
const { ensureDevcontainerSync } = await import("./ensure-devcontainer-Bg5HJAcO.js");
|
|
1000
1004
|
const ensure = ensureDevcontainerSync({
|
|
1001
1005
|
workspacePath,
|
|
1002
1006
|
issueId
|
|
@@ -17261,7 +17265,7 @@ var require_get_vercel_oidc_token = /* @__PURE__ */ __commonJSMin(((exports, mod
|
|
|
17261
17265
|
err = error;
|
|
17262
17266
|
}
|
|
17263
17267
|
try {
|
|
17264
|
-
const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-
|
|
17268
|
+
const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-CrfQ2FKf.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-B10VFNOD.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
|
|
17265
17269
|
if (!token || isExpired(getTokenPayload(token), options?.expirationBufferMs)) {
|
|
17266
17270
|
await refreshToken(options);
|
|
17267
17271
|
token = getVercelOidcTokenSync();
|
|
@@ -29578,7 +29582,7 @@ var GoogleCloudTranscription = class {
|
|
|
29578
29582
|
}
|
|
29579
29583
|
async start(apiKey, model) {
|
|
29580
29584
|
try {
|
|
29581
|
-
const { SpeechClient } = await import("./src-
|
|
29585
|
+
const { SpeechClient } = await import("./src-B2e5rGu2.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
|
|
29582
29586
|
if (this.closed) return;
|
|
29583
29587
|
const stream = new SpeechClient({ apiKey }).streamingRecognize({
|
|
29584
29588
|
config: {
|
|
@@ -30404,15 +30408,15 @@ async function runInline$1(operation, payload, onProgress) {
|
|
|
30404
30408
|
});
|
|
30405
30409
|
}
|
|
30406
30410
|
case "getArtifactBySlug": {
|
|
30407
|
-
const { getArtifactBySlugJob } = await import("./artifact-index-jobs-
|
|
30411
|
+
const { getArtifactBySlugJob } = await import("./artifact-index-jobs-Jn7BGOtV.js");
|
|
30408
30412
|
return getArtifactBySlugJob(payload);
|
|
30409
30413
|
}
|
|
30410
30414
|
case "listArtifactsForWorkspaceOrIssue": {
|
|
30411
|
-
const { listArtifactsForWorkspaceOrIssueJob } = await import("./artifact-index-jobs-
|
|
30415
|
+
const { listArtifactsForWorkspaceOrIssueJob } = await import("./artifact-index-jobs-Jn7BGOtV.js");
|
|
30412
30416
|
return listArtifactsForWorkspaceOrIssueJob(payload);
|
|
30413
30417
|
}
|
|
30414
30418
|
case "unshareArtifactBySlug": {
|
|
30415
|
-
const { unshareArtifactBySlugJob } = await import("./artifact-index-jobs-
|
|
30419
|
+
const { unshareArtifactBySlugJob } = await import("./artifact-index-jobs-Jn7BGOtV.js");
|
|
30416
30420
|
return unshareArtifactBySlugJob(payload);
|
|
30417
30421
|
}
|
|
30418
30422
|
}
|
|
@@ -30803,6 +30807,98 @@ function normalizeSessionsFeedFilter(input) {
|
|
|
30803
30807
|
};
|
|
30804
30808
|
}
|
|
30805
30809
|
//#endregion
|
|
30810
|
+
//#region services/conversation/subagents.ts
|
|
30811
|
+
/**
|
|
30812
|
+
* Read-only discovery and streaming support for Claude Code conversation subagents.
|
|
30813
|
+
* See docs/CONVERSATION-SUBAGENTS.md for the file layout and transport contract.
|
|
30814
|
+
*/
|
|
30815
|
+
const metaCache = /* @__PURE__ */ new Map();
|
|
30816
|
+
const SAFE_AGENT_ID = /^[A-Za-z0-9_-]+$/;
|
|
30817
|
+
function subagentsDirFor(sessionFile) {
|
|
30818
|
+
return join(sessionFile.endsWith(".jsonl") ? sessionFile.slice(0, -6) : sessionFile, "subagents");
|
|
30819
|
+
}
|
|
30820
|
+
function parseMeta(agentId, value) {
|
|
30821
|
+
if (typeof value !== "object" || value === null || !("agentType" in value) || typeof value.agentType !== "string" || !("description" in value) || typeof value.description !== "string" || !("toolUseId" in value) || typeof value.toolUseId !== "string" || !("spawnDepth" in value) || typeof value.spawnDepth !== "number") throw new Error("invalid subagent metadata");
|
|
30822
|
+
return {
|
|
30823
|
+
agentId,
|
|
30824
|
+
agentType: value.agentType,
|
|
30825
|
+
description: value.description,
|
|
30826
|
+
toolUseId: value.toolUseId,
|
|
30827
|
+
spawnDepth: value.spawnDepth
|
|
30828
|
+
};
|
|
30829
|
+
}
|
|
30830
|
+
async function readMeta(metaPath, agentId) {
|
|
30831
|
+
const cached = metaCache.get(metaPath);
|
|
30832
|
+
if (cached !== void 0) return cached;
|
|
30833
|
+
try {
|
|
30834
|
+
const parsed = parseMeta(agentId, JSON.parse(await readFile(metaPath, "utf8")));
|
|
30835
|
+
metaCache.set(metaPath, parsed);
|
|
30836
|
+
return parsed;
|
|
30837
|
+
} catch (error) {
|
|
30838
|
+
console.warn(`[conversation-subagents] Failed to parse ${metaPath}:`, error);
|
|
30839
|
+
return null;
|
|
30840
|
+
}
|
|
30841
|
+
}
|
|
30842
|
+
async function listSubagentMetas(sessionFile) {
|
|
30843
|
+
const subagentsDir = subagentsDirFor(sessionFile);
|
|
30844
|
+
let entries;
|
|
30845
|
+
try {
|
|
30846
|
+
entries = await readdir(subagentsDir);
|
|
30847
|
+
} catch (error) {
|
|
30848
|
+
if (error.code === "ENOENT") return [];
|
|
30849
|
+
throw error;
|
|
30850
|
+
}
|
|
30851
|
+
const metas = [];
|
|
30852
|
+
for (const entry of entries.sort()) {
|
|
30853
|
+
const match = /^agent-(.+)\.meta\.json$/.exec(entry);
|
|
30854
|
+
if (!match?.[1]) continue;
|
|
30855
|
+
const meta = await readMeta(join(subagentsDir, entry), match[1]);
|
|
30856
|
+
if (meta) metas.push(meta);
|
|
30857
|
+
}
|
|
30858
|
+
return metas;
|
|
30859
|
+
}
|
|
30860
|
+
function subagentTranscriptPath(sessionFile, agentId) {
|
|
30861
|
+
if (!SAFE_AGENT_ID.test(agentId)) return null;
|
|
30862
|
+
const subagentsDir = resolve(subagentsDirFor(sessionFile));
|
|
30863
|
+
const transcriptPath = resolve(subagentsDir, `agent-${agentId}.jsonl`);
|
|
30864
|
+
if (dirname(transcriptPath) !== subagentsDir || !transcriptPath.startsWith(`${subagentsDir}${sep}`)) return null;
|
|
30865
|
+
return transcriptPath;
|
|
30866
|
+
}
|
|
30867
|
+
async function startSubagentListPolling(sessionFile, pendingToolUseIds, emit) {
|
|
30868
|
+
let stopped = false;
|
|
30869
|
+
let lastSerialized = null;
|
|
30870
|
+
let refreshChain = Promise.resolve();
|
|
30871
|
+
const refresh = () => {
|
|
30872
|
+
refreshChain = refreshChain.then(async () => {
|
|
30873
|
+
if (stopped) return;
|
|
30874
|
+
const pending = pendingToolUseIds();
|
|
30875
|
+
const subagents = (await listSubagentMetas(sessionFile)).map((meta) => ({
|
|
30876
|
+
...meta,
|
|
30877
|
+
status: pending.has(meta.toolUseId) ? "running" : "done"
|
|
30878
|
+
}));
|
|
30879
|
+
const serialized = JSON.stringify(subagents);
|
|
30880
|
+
if (serialized === lastSerialized) return;
|
|
30881
|
+
lastSerialized = serialized;
|
|
30882
|
+
emit({
|
|
30883
|
+
kind: "subagents",
|
|
30884
|
+
subagents
|
|
30885
|
+
});
|
|
30886
|
+
}).catch((error) => {
|
|
30887
|
+
console.warn(`[conversation-subagents] Failed to refresh ${sessionFile}:`, error);
|
|
30888
|
+
});
|
|
30889
|
+
return refreshChain;
|
|
30890
|
+
};
|
|
30891
|
+
await refresh();
|
|
30892
|
+
const interval = setInterval(() => void refresh(), 2e3);
|
|
30893
|
+
return {
|
|
30894
|
+
refresh,
|
|
30895
|
+
stop: () => {
|
|
30896
|
+
stopped = true;
|
|
30897
|
+
clearInterval(interval);
|
|
30898
|
+
}
|
|
30899
|
+
};
|
|
30900
|
+
}
|
|
30901
|
+
//#endregion
|
|
30806
30902
|
//#region ws-rpc.ts
|
|
30807
30903
|
/**
|
|
30808
30904
|
* WebSocket RPC handlers — implements PanRpcGroup using Effect (PAN-428 B5)
|
|
@@ -31315,7 +31411,8 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
|
|
|
31315
31411
|
if (getHarnessBehavior(conv.harness).transcriptKind !== "claude-jsonl") return conversationDiscoveringStream();
|
|
31316
31412
|
const launcherTmuxSession = conv.tmuxSession;
|
|
31317
31413
|
const resolvedSessionId = (launcherTmuxSession ? yield* Effect.promise(() => readLauncherPinnedSessionId(launcherTmuxSession)) : null) ?? conv.claudeSessionId;
|
|
31318
|
-
const
|
|
31414
|
+
const parentSessionFile = resolvedSessionId ? sessionFilePath(conv.cwd, resolvedSessionId) : null;
|
|
31415
|
+
const sessionFile = parentSessionFile && input.agentId ? subagentTranscriptPath(parentSessionFile, input.agentId) : parentSessionFile;
|
|
31319
31416
|
const model = conv.model ?? null;
|
|
31320
31417
|
if (!sessionFile) return conversationDiscoveringStream();
|
|
31321
31418
|
if (isPiSessionFile(sessionFile)) return conversationDiscoveringStream();
|
|
@@ -31354,11 +31451,15 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
|
|
|
31354
31451
|
compactBoundaries: initial.compactBoundaries && initial.compactBoundaries.length > 0 ? initial.compactBoundaries : void 0,
|
|
31355
31452
|
contextUsage: currentContextUsage
|
|
31356
31453
|
});
|
|
31357
|
-
|
|
31454
|
+
let pendingSubagentToolUseIds = new Set(initial.pendingToolUse.keys());
|
|
31455
|
+
const subagentPoller = input.agentId ? null : await startSubagentListPolling(sessionFile, () => pendingSubagentToolUseIds, offer);
|
|
31456
|
+
const handle = watchConversation(sessionFile, (result) => {
|
|
31358
31457
|
const gate = gateSnapshotEmission(result.byteOffset < currentByteOffset, result.messages.length, highWaterCount);
|
|
31359
31458
|
highWaterCount = gate.highWaterCount;
|
|
31360
31459
|
currentByteOffset = result.byteOffset;
|
|
31361
31460
|
currentContextUsage = contextUsageFromParseResult(result, model);
|
|
31461
|
+
pendingSubagentToolUseIds = new Set(result.pendingToolUse.keys());
|
|
31462
|
+
subagentPoller?.refresh();
|
|
31362
31463
|
if (gate.suppressedShrink) console.warn(`[conv-stream] suppressed shrinking reset for ${input.conversationName}: byteOffset ${currentByteOffset} (re-parsed ${result.messages.length} msgs) < high-water ${highWaterCount} — treating as transient rewrite, merging instead of replacing`);
|
|
31363
31464
|
offer({
|
|
31364
31465
|
kind: "messages",
|
|
@@ -31374,6 +31475,10 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
|
|
|
31374
31475
|
byteOffset: initial.byteOffset,
|
|
31375
31476
|
priorState
|
|
31376
31477
|
});
|
|
31478
|
+
return { stop() {
|
|
31479
|
+
handle.stop();
|
|
31480
|
+
subagentPoller?.stop();
|
|
31481
|
+
} };
|
|
31377
31482
|
}), (handle) => Effect.sync(() => {
|
|
31378
31483
|
handle.stop();
|
|
31379
31484
|
})));
|
|
@@ -31895,8 +32000,30 @@ function hasBlocksCycle(doc) {
|
|
|
31895
32000
|
}
|
|
31896
32001
|
return visited < itemIds.size;
|
|
31897
32002
|
}
|
|
32003
|
+
function lintProjectedSurface(doc) {
|
|
32004
|
+
const issues = [];
|
|
32005
|
+
const files = /* @__PURE__ */ new Set();
|
|
32006
|
+
const subsystems = /* @__PURE__ */ new Set();
|
|
32007
|
+
for (const item of doc.plan.items) {
|
|
32008
|
+
if (item.status === "cancelled") continue;
|
|
32009
|
+
const filesScope = item.metadata?.files_scope;
|
|
32010
|
+
if (Array.isArray(filesScope)) for (const scope of filesScope) {
|
|
32011
|
+
const normalized = scope.replace(/\/\*+$/, "");
|
|
32012
|
+
files.add(normalized);
|
|
32013
|
+
const parts = normalized.split("/");
|
|
32014
|
+
if (parts.length >= 2) subsystems.add(`${parts[0]}/${parts[1]}`);
|
|
32015
|
+
else if (parts.length === 1) subsystems.add(parts[0]);
|
|
32016
|
+
}
|
|
32017
|
+
}
|
|
32018
|
+
const fileCount = files.size;
|
|
32019
|
+
const subsystemCount = subsystems.size;
|
|
32020
|
+
const hasJustification = typeof doc.plan.metadata?.sizeJustification === "string" && doc.plan.metadata.sizeJustification.trim().length > 0;
|
|
32021
|
+
if ((fileCount > 25 || subsystemCount > 6) && !hasJustification) issues.push(issue(null, "projected-surface", `Plan touches ${fileCount} files (limit: 25) and ${subsystemCount} subsystems (limit: 6). Split into independently-shippable sibling issues per the swarm contract, or set plan.metadata.sizeJustification for genuinely inseparable work.`));
|
|
32022
|
+
return issues;
|
|
32023
|
+
}
|
|
31898
32024
|
function lintPlanQuality(doc, options = {}) {
|
|
31899
32025
|
return [
|
|
32026
|
+
...lintProjectedSurface(doc),
|
|
31900
32027
|
...doc.plan.items.flatMap((item) => item.status === "cancelled" ? [] : lintItem(item)),
|
|
31901
32028
|
...lintDocumentReferences(doc),
|
|
31902
32029
|
...lintDocsCoverage(doc),
|
|
@@ -31917,7 +32044,7 @@ const execFileAsync$18 = promisify(execFile);
|
|
|
31917
32044
|
async function loadTrackerIssues() {
|
|
31918
32045
|
const map = /* @__PURE__ */ new Map();
|
|
31919
32046
|
try {
|
|
31920
|
-
const { getSharedIssueService } = await import("./issue-service-singleton-
|
|
32047
|
+
const { getSharedIssueService } = await import("./issue-service-singleton-lwFJ4dHk.js");
|
|
31921
32048
|
const issues = (await getSharedIssueService()).getIssues();
|
|
31922
32049
|
for (const issue of issues) if (issue.identifier) map.set(issue.identifier.toUpperCase(), issue);
|
|
31923
32050
|
} catch {}
|
|
@@ -31940,7 +32067,7 @@ async function loadDockerContainers() {
|
|
|
31940
32067
|
}
|
|
31941
32068
|
async function loadActiveRemoteAgentStates() {
|
|
31942
32069
|
try {
|
|
31943
|
-
const { listActiveRemoteAgentStates } = await import("./remote-agents-
|
|
32070
|
+
const { listActiveRemoteAgentStates } = await import("./remote-agents-kwsEZvXu.js");
|
|
31944
32071
|
return listActiveRemoteAgentStates();
|
|
31945
32072
|
} catch {
|
|
31946
32073
|
return [];
|
|
@@ -33101,15 +33228,19 @@ async function completePlanningAutoSpawn(options) {
|
|
|
33101
33228
|
},
|
|
33102
33229
|
body: JSON.stringify({
|
|
33103
33230
|
issueId: options.issueId,
|
|
33104
|
-
role: "work"
|
|
33231
|
+
role: "work",
|
|
33232
|
+
startedBy: "planning-auto-handoff",
|
|
33233
|
+
autoSpawnConsentRequired: true
|
|
33105
33234
|
})
|
|
33106
33235
|
});
|
|
33107
33236
|
const body = await response.json().catch(() => ({}));
|
|
33108
33237
|
const agentId = typeof body["agentId"] === "string" ? body["agentId"] : `agent-${options.issueId.toLowerCase()}`;
|
|
33109
33238
|
if (response.ok && body["success"] !== false) {
|
|
33110
|
-
|
|
33239
|
+
const workAgentQueued = body["startingContainers"] === true;
|
|
33240
|
+
emitCompletePlanningPhase(options.issueId, "autoSpawn", "success", workAgentQueued ? "container startup queued before work-agent spawn" : "work agent spawn requested", { agentId });
|
|
33111
33241
|
return {
|
|
33112
33242
|
workAgentSpawned: true,
|
|
33243
|
+
...workAgentQueued ? { workAgentQueued: true } : {},
|
|
33113
33244
|
workAgentSession: agentId
|
|
33114
33245
|
};
|
|
33115
33246
|
}
|
|
@@ -33119,9 +33250,14 @@ async function completePlanningAutoSpawn(options) {
|
|
|
33119
33250
|
const recovery = await (options.fetchImpl ?? fetch)(new URL(`/api/workspaces/${encodeURIComponent(options.issueId)}/rebuild-and-start`, dashboardOrigin), {
|
|
33120
33251
|
method: "POST",
|
|
33121
33252
|
headers: {
|
|
33253
|
+
"content-type": "application/json",
|
|
33122
33254
|
origin: dashboardOrigin,
|
|
33123
33255
|
...internalTokenHeaders
|
|
33124
|
-
}
|
|
33256
|
+
},
|
|
33257
|
+
body: JSON.stringify({
|
|
33258
|
+
startedBy: "planning-auto-handoff",
|
|
33259
|
+
autoSpawnConsentRequired: true
|
|
33260
|
+
})
|
|
33125
33261
|
});
|
|
33126
33262
|
const recoveryBody = await recovery.json().catch(() => ({}));
|
|
33127
33263
|
if (recovery.ok && recoveryBody["success"] !== false) {
|
|
@@ -33182,7 +33318,7 @@ async function completePlanningForIssue(options) {
|
|
|
33182
33318
|
const { request, id, body, eventStore, linear, lifecycle } = options;
|
|
33183
33319
|
const skipKill = body?.skipKill === true;
|
|
33184
33320
|
const bodyAutoSpawn = body?.autoSpawn;
|
|
33185
|
-
const autoSpawn = resolveAutoSpawnOnFinalize(bodyAutoSpawn, id);
|
|
33321
|
+
const autoSpawn = await resolveAutoSpawnOnFinalize(bodyAutoSpawn, id);
|
|
33186
33322
|
const noPrd = body?.noPrd === true;
|
|
33187
33323
|
if (bodyAutoSpawn === true) {
|
|
33188
33324
|
const originCheck = validateOrigin$1(request);
|
|
@@ -33660,7 +33796,7 @@ async function closeIssuePullRequest(issueId, reason = "Canceled via Overdeck")
|
|
|
33660
33796
|
timeout: 15e3
|
|
33661
33797
|
});
|
|
33662
33798
|
try {
|
|
33663
|
-
const { setReviewStatusSync } = await import("./review-status-
|
|
33799
|
+
const { setReviewStatusSync } = await import("./review-status-CacDM78F.js");
|
|
33664
33800
|
setReviewStatusSync(issueId.toUpperCase(), { prUrl: void 0 });
|
|
33665
33801
|
} catch {}
|
|
33666
33802
|
return [`Closed PR #${prNumber} on ${githubCheck.owner}/${githubCheck.repo}`];
|
|
@@ -33714,7 +33850,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
|
|
|
33714
33850
|
const { ctx, projectConfig } = buildLifecycleContext(id, getIssueDataService$8().getIssueSource(id) ?? void 0);
|
|
33715
33851
|
const deleteWorkspace = opts.deleteWorkspace ?? true;
|
|
33716
33852
|
cleanupLog.push(...await closeIssuePullRequest(id, mode === "cancel" ? "Canceled via Overdeck" : "Reset to Todo via Overdeck"));
|
|
33717
|
-
const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-
|
|
33853
|
+
const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-Di48-w4x.js");
|
|
33718
33854
|
const workflow = mode === "cancel" ? cancelIssueWorkflow : resetToTodo;
|
|
33719
33855
|
const result = await Effect.runPromise(workflow(ctx, {
|
|
33720
33856
|
deleteWorkspace,
|
|
@@ -33729,7 +33865,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
|
|
|
33729
33865
|
}));
|
|
33730
33866
|
cleanupLog.push(...result.steps.flatMap((step) => step.details || [step.error].filter(Boolean)));
|
|
33731
33867
|
if (mode === "cancel") try {
|
|
33732
|
-
const { transitionXBriefOnMain } = await import("./lifecycle-io-
|
|
33868
|
+
const { transitionXBriefOnMain } = await import("./lifecycle-io-eVG6v_8-.js");
|
|
33733
33869
|
const tx = await Effect.runPromise(transitionXBriefOnMain(ctx.projectPath, id, "cancelled", "cancelled", `scope: cancel ${id.toUpperCase()} xBRIEF`));
|
|
33734
33870
|
if (tx.moved) cleanupLog.push(`xBRIEF moved ${tx.fromDir} → cancelled`);
|
|
33735
33871
|
if (tx.committed) cleanupLog.push(`Committed xBRIEF cancellation on main`);
|
|
@@ -33737,8 +33873,8 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
|
|
|
33737
33873
|
cleanupLog.push(`xBRIEF cancel transition failed (non-fatal): ${err?.message ?? err}`);
|
|
33738
33874
|
}
|
|
33739
33875
|
try {
|
|
33740
|
-
const { killAllReviewerSessions } = await import("./review-agent-
|
|
33741
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
33876
|
+
const { killAllReviewerSessions } = await import("./review-agent-UpAM4DmT.js");
|
|
33877
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
33742
33878
|
const projectKey = resolveProjectFromIssueSync(id)?.projectKey;
|
|
33743
33879
|
if (projectKey) {
|
|
33744
33880
|
const { killed } = await Effect.runPromise(killAllReviewerSessions(projectKey, id.toUpperCase()));
|
|
@@ -33752,7 +33888,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
|
|
|
33752
33888
|
cleanupLog.push("Cleared review status");
|
|
33753
33889
|
} catch {}
|
|
33754
33890
|
try {
|
|
33755
|
-
const { resetPostMergeState } = await import("./merge-agent-
|
|
33891
|
+
const { resetPostMergeState } = await import("./merge-agent-C1-9zbP_.js");
|
|
33756
33892
|
resetPostMergeState(id);
|
|
33757
33893
|
resetPostMergeState(id.toUpperCase());
|
|
33758
33894
|
cleanupLog.push("Cleared merge state");
|
|
@@ -33772,7 +33908,7 @@ function closeIssueTransition(options) {
|
|
|
33772
33908
|
const { issueId, body, eventStore } = options;
|
|
33773
33909
|
const { reason } = body;
|
|
33774
33910
|
const projectPath = getProjectPath$3(void 0, extractPrefixSync(issueId) ?? issueId.split("-")[0]);
|
|
33775
|
-
const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-
|
|
33911
|
+
const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-Di48-w4x.js"));
|
|
33776
33912
|
const githubCheck = isGitHubIssue$4(issueId);
|
|
33777
33913
|
const issueDataService = getIssueDataService$8();
|
|
33778
33914
|
const issueSource = issueDataService.getIssueSource(issueId);
|
|
@@ -34039,7 +34175,7 @@ function reopenIssueTransition(options) {
|
|
|
34039
34175
|
else clearReviewStatus(id.toUpperCase());
|
|
34040
34176
|
} catch {}
|
|
34041
34177
|
try {
|
|
34042
|
-
const { resetPostMergeState } = await import("./merge-agent-
|
|
34178
|
+
const { resetPostMergeState } = await import("./merge-agent-C1-9zbP_.js");
|
|
34043
34179
|
resetPostMergeState(id);
|
|
34044
34180
|
resetPostMergeState(id.toUpperCase());
|
|
34045
34181
|
} catch {}
|
|
@@ -34103,7 +34239,7 @@ function moveIssueStatus(options) {
|
|
|
34103
34239
|
"done"
|
|
34104
34240
|
];
|
|
34105
34241
|
if (!targetStatus || !validStatuses.includes(targetStatus)) return jsonResponse({ error: `Invalid targetStatus. Must be one of: ${validStatuses.join(", ")}` }, { status: 400 });
|
|
34106
|
-
const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-
|
|
34242
|
+
const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-C0Af4clN.js"));
|
|
34107
34243
|
const issueState = {
|
|
34108
34244
|
backlog: "open",
|
|
34109
34245
|
todo: "open",
|
|
@@ -34330,7 +34466,7 @@ async function copySettingsToWorkspace(id) {
|
|
|
34330
34466
|
success: false,
|
|
34331
34467
|
error: "Workspace not found"
|
|
34332
34468
|
}, { status: 404 });
|
|
34333
|
-
const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-
|
|
34469
|
+
const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-B38rFWA1.js");
|
|
34334
34470
|
const result = copyOverdeckSettingsToWorkspaceSync(workspacePath);
|
|
34335
34471
|
return jsonResponse({
|
|
34336
34472
|
success: result.errors.length === 0 || result.copied.length > 0,
|
|
@@ -34439,7 +34575,7 @@ function getProjectPath$2(linearProjectId, issuePrefix) {
|
|
|
34439
34575
|
}
|
|
34440
34576
|
function startPlanningForIssue(options) {
|
|
34441
34577
|
return Effect.gen(function* () {
|
|
34442
|
-
const { id, body, eventStore, linear, github, rally, lifecycle } = options;
|
|
34578
|
+
const { id, body, eventStore, linear, github, rally, lifecycle, startedBy } = options;
|
|
34443
34579
|
const { skipWorkspace = false, startDocker = false, workspaceLocation = "local", shadowMode = false, model: modelOverride, effort, auto = false, autoStart = false, probe = false, harness = "claude-code" } = body;
|
|
34444
34580
|
const requestedHarness = harness === "ohmypi" || harness === "claude-code" || harness === "codex" || harness === "acp" ? harness : "claude-code";
|
|
34445
34581
|
const workModelRaw = body.workModel;
|
|
@@ -34545,7 +34681,8 @@ function startPlanningForIssue(options) {
|
|
|
34545
34681
|
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
34546
34682
|
role: "plan",
|
|
34547
34683
|
model: "",
|
|
34548
|
-
auto: auto === true
|
|
34684
|
+
auto: auto === true,
|
|
34685
|
+
startedBy
|
|
34549
34686
|
});
|
|
34550
34687
|
return Promise.resolve();
|
|
34551
34688
|
});
|
|
@@ -34620,6 +34757,7 @@ function startPlanningForIssue(options) {
|
|
|
34620
34757
|
auto: auto === true,
|
|
34621
34758
|
probe: probe === true,
|
|
34622
34759
|
autoSpawnOnFinalize: autoStart === true,
|
|
34760
|
+
startedBy,
|
|
34623
34761
|
onProgress: (event) => {
|
|
34624
34762
|
console.log(`[start-planning] Progress: step=${event.step} label="${event.label}" status=${event.status} detail="${event.detail}"`);
|
|
34625
34763
|
sendEvent({
|
|
@@ -34812,7 +34950,7 @@ function restartFromPlan(options) {
|
|
|
34812
34950
|
});
|
|
34813
34951
|
const resetResult = yield* Effect.promise(async () => {
|
|
34814
34952
|
try {
|
|
34815
|
-
const { runGitResetHard } = await import("./dangerous-git-ops-
|
|
34953
|
+
const { runGitResetHard } = await import("./dangerous-git-ops-DWX6Og8c.js");
|
|
34816
34954
|
async function findPlanningCommit(grep, label) {
|
|
34817
34955
|
try {
|
|
34818
34956
|
const { stdout } = await execAsync$7(`git log --grep="${grep.replace(/"/g, "\\\"")}" --format=%H -1`, {
|
|
@@ -35264,7 +35402,7 @@ function closeOutIssue(id, opts = {}) {
|
|
|
35264
35402
|
}
|
|
35265
35403
|
const closeOutResult = yield* Effect.promise(async () => {
|
|
35266
35404
|
try {
|
|
35267
|
-
const { closeOut } = await import("./lifecycle-
|
|
35405
|
+
const { closeOut } = await import("./lifecycle-Di48-w4x.js");
|
|
35268
35406
|
return {
|
|
35269
35407
|
ok: true,
|
|
35270
35408
|
result: await Effect.runPromise(closeOut(ctx, {
|
|
@@ -35353,7 +35491,7 @@ function bulkCloseOut(body) {
|
|
|
35353
35491
|
const invalidIds = issueIds.filter((id) => !isValidIssueId(id));
|
|
35354
35492
|
if (invalidIds.length > 0) return jsonResponse({ error: `Invalid issue ID format: ${invalidIds.join(", ")}` }, { status: 400 });
|
|
35355
35493
|
const eventStore = yield* EventStoreService;
|
|
35356
|
-
const { closeOut } = yield* Effect.promise(() => import("./lifecycle-
|
|
35494
|
+
const { closeOut } = yield* Effect.promise(() => import("./lifecycle-Di48-w4x.js"));
|
|
35357
35495
|
const issueDataService = getIssueDataService$5();
|
|
35358
35496
|
const tasks = [];
|
|
35359
35497
|
const agentChecks = yield* withConcurrencyLimit(issueIds.map((id) => Effect.promise(async () => {
|
|
@@ -35579,8 +35717,8 @@ const getIssueShipLogRoute = HttpRouter.add("GET", "/api/issues/:id/ship-log", h
|
|
|
35579
35717
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
35580
35718
|
if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
35581
35719
|
return yield* Effect.promise(async () => {
|
|
35582
|
-
const { getShipLog } = await import("./ship-log-
|
|
35583
|
-
const { getReviewStatusSync } = await import("./review-status-
|
|
35720
|
+
const { getShipLog } = await import("./ship-log-VAv-lHrF.js");
|
|
35721
|
+
const { getReviewStatusSync } = await import("./review-status-CacDM78F.js");
|
|
35584
35722
|
const log = getShipLog(id);
|
|
35585
35723
|
const rs = getReviewStatusSync(id);
|
|
35586
35724
|
return jsonResponse({
|
|
@@ -35595,8 +35733,8 @@ const getIssueVerificationRoute = HttpRouter.add("GET", "/api/issues/:id/verific
|
|
|
35595
35733
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
35596
35734
|
if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
35597
35735
|
return yield* Effect.promise(async () => {
|
|
35598
|
-
const { readVerificationArtifact } = await import("./verification-artifact-
|
|
35599
|
-
const { getReviewStatusSync } = await import("./review-status-
|
|
35736
|
+
const { readVerificationArtifact } = await import("./verification-artifact-GOaj8u2s.js");
|
|
35737
|
+
const { getReviewStatusSync } = await import("./review-status-CacDM78F.js");
|
|
35600
35738
|
const { join } = await import("node:path");
|
|
35601
35739
|
const resolved = resolveProjectFromIssueSync(id);
|
|
35602
35740
|
const workspacePath = resolved ? join(resolved.projectPath, "workspaces", `feature-${id.toLowerCase()}`) : null;
|
|
@@ -35619,16 +35757,30 @@ const postIssueCloseRoute = HttpRouter.add("POST", "/api/issues/:issueId/close",
|
|
|
35619
35757
|
});
|
|
35620
35758
|
})));
|
|
35621
35759
|
const postIssueStartPlanningRoute = HttpRouter.add("POST", "/api/issues/:id/start-planning", httpHandler(Effect.gen(function* () {
|
|
35760
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
35622
35761
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
35623
35762
|
if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
35763
|
+
const body = yield* readJsonBody$18;
|
|
35764
|
+
const eventStore = yield* EventStoreService;
|
|
35765
|
+
const linear = yield* LinearClient;
|
|
35766
|
+
const github = yield* GitHubClient;
|
|
35767
|
+
const rally = yield* RallyClient;
|
|
35768
|
+
const lifecycle = yield* IssueLifecycle;
|
|
35769
|
+
let startedBy;
|
|
35770
|
+
try {
|
|
35771
|
+
startedBy = resolveRequestedStartedBy(body.startedBy, yield* Effect.promise(() => isInternalAgentRequest(request)));
|
|
35772
|
+
} catch (error) {
|
|
35773
|
+
return jsonResponse({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
|
|
35774
|
+
}
|
|
35624
35775
|
return yield* startPlanningForIssue({
|
|
35625
35776
|
id,
|
|
35626
|
-
body
|
|
35627
|
-
eventStore
|
|
35628
|
-
linear
|
|
35629
|
-
github
|
|
35630
|
-
rally
|
|
35631
|
-
lifecycle
|
|
35777
|
+
body,
|
|
35778
|
+
eventStore,
|
|
35779
|
+
linear,
|
|
35780
|
+
github,
|
|
35781
|
+
rally,
|
|
35782
|
+
lifecycle,
|
|
35783
|
+
startedBy
|
|
35632
35784
|
});
|
|
35633
35785
|
})));
|
|
35634
35786
|
const postIssueAbortPlanningRoute = HttpRouter.add("POST", "/api/issues/:id/abort-planning", httpHandler(Effect.gen(function* () {
|
|
@@ -40252,7 +40404,7 @@ Be specific: reference actual file names, function names, requirement text, disc
|
|
|
40252
40404
|
const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
|
|
40253
40405
|
const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
|
|
40254
40406
|
const promptFile = join(planningDir, ".status-review-prompt.tmp");
|
|
40255
|
-
const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-
|
|
40407
|
+
const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-BI1mOBQ4.js");
|
|
40256
40408
|
let providerEnvStr = "";
|
|
40257
40409
|
let providerEnv = {};
|
|
40258
40410
|
const statusProvider = getProviderForModelSync(statusModelId);
|
|
@@ -40335,7 +40487,7 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
|
|
|
40335
40487
|
let safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "-");
|
|
40336
40488
|
let processedContent = content;
|
|
40337
40489
|
if (safeName.endsWith(".vtt")) {
|
|
40338
|
-
const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-
|
|
40490
|
+
const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-CMU5EZ5R.js"));
|
|
40339
40491
|
processedContent = vttToMarkdown(content);
|
|
40340
40492
|
safeName = safeName.replace(/\.vtt$/, ".md");
|
|
40341
40493
|
}
|
|
@@ -40718,6 +40870,7 @@ const startRemoteAgentRoute = HttpRouter.add("POST", "/api/remote/workspaces/:is
|
|
|
40718
40870
|
workspace: metadata,
|
|
40719
40871
|
prompt,
|
|
40720
40872
|
model,
|
|
40873
|
+
startedBy: "operator:dashboard",
|
|
40721
40874
|
tier: fly.getResiliencyTier()
|
|
40722
40875
|
});
|
|
40723
40876
|
},
|
|
@@ -45966,7 +46119,7 @@ const readJsonBody$11 = Effect.gen(function* () {
|
|
|
45966
46119
|
function bootReconciliationWhyStopped(agent) {
|
|
45967
46120
|
if (agent.paused === true) return agent.pausedReason ? `paused: ${agent.pausedReason}` : "paused";
|
|
45968
46121
|
if (agent.troubled === true) return "troubled";
|
|
45969
|
-
if (agent.stoppedByUser === true
|
|
46122
|
+
if (agent.stoppedByUser === true) return "stopped by operator";
|
|
45970
46123
|
if (agent.status === "stopped" && agent.sessionId && !sessionExists(agent.sessionId)) return "orphaned: tmux session missing";
|
|
45971
46124
|
if (agent.status === "stopped") return "stopped cleanly";
|
|
45972
46125
|
if (agent.hostOverride) return "running remote";
|
|
@@ -45994,14 +46147,19 @@ const getBootReconciliationRoute = HttpRouter.add("GET", "/api/boot-reconciliati
|
|
|
45994
46147
|
lastActivity: agent.lastActivity ?? agent.updatedAt ?? null,
|
|
45995
46148
|
cost: agent.costSoFar ?? null,
|
|
45996
46149
|
remote: Boolean(agent.hostOverride),
|
|
46150
|
+
stoppedByUser: agent.stoppedByUser === true,
|
|
45997
46151
|
readOnly: bootReconciliationReadOnly(agent)
|
|
45998
46152
|
});
|
|
45999
|
-
const
|
|
46000
|
-
const set =
|
|
46001
|
-
const context =
|
|
46153
|
+
const autoResumableAgents = listAllAgentsSync().filter((agent) => isAutoResumableRole(agent.role));
|
|
46154
|
+
const set = autoResumableAgents.filter((agent) => candidateIds.has(agent.id)).map(toRow);
|
|
46155
|
+
const context = autoResumableAgents.filter((agent) => !candidateIds.has(agent.id) && (agent.paused === true || agent.troubled === true || Boolean(agent.hostOverride))).map(toRow);
|
|
46156
|
+
let heldCount = 0;
|
|
46157
|
+
if (state.decision === "hold_all") heldCount = set.length;
|
|
46158
|
+
else if (state.decision === "per_agent") heldCount = set.filter((agent) => state.perAgent[agent.issueId] !== "resume").length;
|
|
46002
46159
|
return jsonResponse({
|
|
46003
46160
|
...state,
|
|
46004
46161
|
maxGraceExtensions: 3,
|
|
46162
|
+
heldCount,
|
|
46005
46163
|
set,
|
|
46006
46164
|
context
|
|
46007
46165
|
});
|
|
@@ -46032,7 +46190,7 @@ const postBootReconciliationDecisionRoute = HttpRouter.add("POST", "/api/boot-re
|
|
|
46032
46190
|
}, { status: 400 });
|
|
46033
46191
|
const perAgent = body.decision === "per_agent" ? parsePerAgentMap(body.perAgent) : {};
|
|
46034
46192
|
setBootReconciliationDecision(body.decision, perAgent);
|
|
46035
|
-
const result = yield* Effect.promise(() => applyBootReconciliationDecision());
|
|
46193
|
+
const result = yield* Effect.promise(() => applyBootReconciliationDecision({ origin: "operator" }));
|
|
46036
46194
|
const resumed = result.resumed;
|
|
46037
46195
|
return jsonResponse({
|
|
46038
46196
|
ok: true,
|
|
@@ -46257,7 +46415,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
|
|
|
46257
46415
|
}, { status: 400 });
|
|
46258
46416
|
return yield* Effect.promise(async () => {
|
|
46259
46417
|
try {
|
|
46260
|
-
const { RallyRestApi } = await import("./rally-api-
|
|
46418
|
+
const { RallyRestApi } = await import("./rally-api-Cp50exEi.js");
|
|
46261
46419
|
const api = new RallyRestApi({
|
|
46262
46420
|
apiKey,
|
|
46263
46421
|
server: server || "https://rally1.rallydev.com"
|
|
@@ -46643,7 +46801,7 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
|
|
|
46643
46801
|
const remoteState = loadRemoteAgentState(sessionName);
|
|
46644
46802
|
const isRemote = !!remoteState;
|
|
46645
46803
|
const vmName = remoteState?.vmName ?? "";
|
|
46646
|
-
const { getAgentStateSync } = await import("./agents-
|
|
46804
|
+
const { getAgentStateSync } = await import("./agents-Dnn4XgdB.js");
|
|
46647
46805
|
const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
|
|
46648
46806
|
let tmuxSessionAlive = false;
|
|
46649
46807
|
if (!isRemote) try {
|
|
@@ -46787,7 +46945,7 @@ Continue the PLANNING session. Do NOT implement anything.
|
|
|
46787
46945
|
const agentCwd = workspacePath;
|
|
46788
46946
|
const harnessLaunch = await prepareHarnessLaunch("claude-code");
|
|
46789
46947
|
if (existsSync$1(outputFile)) await rename(outputFile, join(planningDir, `output-${Date.now()}.jsonl`));
|
|
46790
|
-
const { getAgentCommandSync } = await import("./settings-
|
|
46948
|
+
const { getAgentCommandSync } = await import("./settings-9jSGHBPY.js");
|
|
46791
46949
|
let msgPlanningModel = "claude-sonnet-5";
|
|
46792
46950
|
try {
|
|
46793
46951
|
msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
|
|
@@ -46910,7 +47068,7 @@ async function getIndexStats(rootPath, isMain) {
|
|
|
46910
47068
|
}
|
|
46911
47069
|
const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
|
|
46912
47070
|
try {
|
|
46913
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
47071
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Ca0eovh3.js");
|
|
46914
47072
|
const projectRoot = process.cwd();
|
|
46915
47073
|
const venvPath = join(projectRoot, ".venv");
|
|
46916
47074
|
const results = [];
|
|
@@ -46955,7 +47113,7 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
|
|
|
46955
47113
|
}));
|
|
46956
47114
|
const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
|
|
46957
47115
|
try {
|
|
46958
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
47116
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Ca0eovh3.js");
|
|
46959
47117
|
const projectRoot = process.cwd();
|
|
46960
47118
|
const venvPath = join(projectRoot, ".venv");
|
|
46961
47119
|
if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
|
|
@@ -46972,7 +47130,7 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
|
|
|
46972
47130
|
}));
|
|
46973
47131
|
const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
|
|
46974
47132
|
try {
|
|
46975
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
47133
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Ca0eovh3.js");
|
|
46976
47134
|
const projectRoot = process.cwd();
|
|
46977
47135
|
const venvPath = join(projectRoot, ".venv");
|
|
46978
47136
|
if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
|
|
@@ -46989,7 +47147,7 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
|
|
|
46989
47147
|
}));
|
|
46990
47148
|
const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
|
|
46991
47149
|
try {
|
|
46992
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
47150
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Ca0eovh3.js");
|
|
46993
47151
|
const enabled = isTldrEnabledSync();
|
|
46994
47152
|
const projectRoot = process.cwd();
|
|
46995
47153
|
const targets = [];
|
|
@@ -47177,7 +47335,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
|
|
|
47177
47335
|
const version = await getOverdeckVersion();
|
|
47178
47336
|
let supervisorUrl = null;
|
|
47179
47337
|
try {
|
|
47180
|
-
const { getSupervisorUrlSync } = await import("./supervisor-
|
|
47338
|
+
const { getSupervisorUrlSync } = await import("./supervisor-CyR_mW5B.js");
|
|
47181
47339
|
supervisorUrl = getSupervisorUrlSync();
|
|
47182
47340
|
} catch {}
|
|
47183
47341
|
return jsonResponse({
|
|
@@ -47187,11 +47345,11 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
|
|
|
47187
47345
|
});
|
|
47188
47346
|
}));
|
|
47189
47347
|
const getPrerequisitesRoute = HttpRouter.add("GET", "/api/prerequisites", Effect.promise(async () => {
|
|
47190
|
-
const { checkSystemPrerequisites } = await import("./system-prerequisites-
|
|
47348
|
+
const { checkSystemPrerequisites } = await import("./system-prerequisites-Cin9ZgDx.js");
|
|
47191
47349
|
return jsonResponse(await checkSystemPrerequisites());
|
|
47192
47350
|
}));
|
|
47193
47351
|
const getSetupDiagnosticsRoute = HttpRouter.add("GET", "/api/diagnostics/setup", Effect.promise(async () => {
|
|
47194
|
-
const { collectSetupDiagnostics } = await import("./system-prerequisites-
|
|
47352
|
+
const { collectSetupDiagnostics } = await import("./system-prerequisites-Cin9ZgDx.js");
|
|
47195
47353
|
return jsonResponse(await collectSetupDiagnostics(await getOverdeckVersion()));
|
|
47196
47354
|
}));
|
|
47197
47355
|
const getSyncStatusRoute = HttpRouter.add("GET", "/api/sync-status", Effect.sync(() => {
|
|
@@ -47372,7 +47530,7 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
|
|
|
47372
47530
|
const projectPath = await getProjectPath(issuePrefix);
|
|
47373
47531
|
const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
|
|
47374
47532
|
if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
|
|
47375
|
-
const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-
|
|
47533
|
+
const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-D8R9I8Yl.js");
|
|
47376
47534
|
const config = {
|
|
47377
47535
|
issueId,
|
|
47378
47536
|
workspacePath,
|
|
@@ -47402,7 +47560,7 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
|
|
|
47402
47560
|
if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
|
|
47403
47561
|
const ghConfig = getGitHubConfig();
|
|
47404
47562
|
if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
|
|
47405
|
-
const { runObserverCycle } = await import("./shadow-engineering-
|
|
47563
|
+
const { runObserverCycle } = await import("./shadow-engineering-D8R9I8Yl.js");
|
|
47406
47564
|
const firstRepo = ghConfig.repos[0];
|
|
47407
47565
|
const config = {
|
|
47408
47566
|
issueId,
|
|
@@ -49152,198 +49310,11 @@ function isNonEmptyJsonlLine(buffer) {
|
|
|
49152
49310
|
return buffer.subarray(0, end).some((byte) => byte !== 32 && byte !== 9);
|
|
49153
49311
|
}
|
|
49154
49312
|
//#endregion
|
|
49155
|
-
//#region ../../lib/pane-choice
|
|
49313
|
+
//#region ../../lib/overdeck/conversation-pane-choice.ts
|
|
49156
49314
|
init_transcript_adapter();
|
|
49157
49315
|
init_summary_fork();
|
|
49158
49316
|
init_conversation_compaction();
|
|
49159
49317
|
/**
|
|
49160
|
-
* PAN-3113 — parse blocking numbered-choice menus from a captured tmux pane.
|
|
49161
|
-
*
|
|
49162
|
-
* Claude Code (and sibling harnesses) render modal choices as a cursor-driven
|
|
49163
|
-
* numbered menu — the session-resume gate is the driving case:
|
|
49164
|
-
*
|
|
49165
|
-
* This session is 4h 5m old and 146.9k tokens.
|
|
49166
|
-
*
|
|
49167
|
-
* Resuming the full session will consume a substantial portion of your
|
|
49168
|
-
* usage limits. We recommend resuming from a summary.
|
|
49169
|
-
*
|
|
49170
|
-
* ❯ 1. Resume from summary (recommended)
|
|
49171
|
-
* 2. Resume full session as-is
|
|
49172
|
-
* 3. Don't ask me again
|
|
49173
|
-
*
|
|
49174
|
-
* Enter to confirm · Esc to cancel
|
|
49175
|
-
*
|
|
49176
|
-
* These menus never appear as transcript tool calls, so neither the AUQ
|
|
49177
|
-
* pipeline nor the JSONL pending-input scan can see them. This module turns
|
|
49178
|
-
* the pane text into a structured menu the dashboard can render as an
|
|
49179
|
-
* actionable card (PAN-3113 mockup A) and answer with literal keystrokes
|
|
49180
|
-
* (Down × N + Enter).
|
|
49181
|
-
*
|
|
49182
|
-
* The parser is deliberately conservative — a false positive parks a phantom
|
|
49183
|
-
* decision card in a live conversation, which is worse than a miss:
|
|
49184
|
-
*
|
|
49185
|
-
* - Options must be numbered sequentially from 1 (kills prose lists such as
|
|
49186
|
-
* "3. FCM push is dead…" and "1. First step / 2. Second step" plans).
|
|
49187
|
-
* - High confidence requires BOTH a ❯ cursor row and a harness footer hint
|
|
49188
|
-
* ("Enter to confirm · Esc to cancel"). Exactly one of the two is low
|
|
49189
|
-
* confidence (render the verbatim mirror, not the card). Neither → null.
|
|
49190
|
-
* - The menu must be the current bottom-of-pane surface: after the menu and
|
|
49191
|
-
* its footer, only blank lines, box separators, or further footer hints
|
|
49192
|
-
* may follow. Real output below the menu means it was answered/scrolled.
|
|
49193
|
-
* - Claude permission menus ("1. Yes / 2. Yes, and allow / 3. No") are
|
|
49194
|
-
* excluded — the existing tool_permission detection path owns them.
|
|
49195
|
-
* - Multi-select menus ("space to select") are excluded — answering needs
|
|
49196
|
-
* toggle semantics the card does not model.
|
|
49197
|
-
*/
|
|
49198
|
-
const ANSI_PATTERN = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
|
|
49199
|
-
/** "❯ 1. Resume from summary (recommended)" / " 2. Resume full session as-is" */
|
|
49200
|
-
const OPTION_LINE = /^\s*(❯|›)?\s*(\d{1,2})[.)]\s+(\S.*)$/;
|
|
49201
|
-
/** Box-drawing separator lines (Claude draws ─── rules around its input box). */
|
|
49202
|
-
const SEPARATOR_LINE = /^\s*[─━═]{6,}\s*$/;
|
|
49203
|
-
/** Bare input prompt with nothing typed — the menu is gone when this follows. */
|
|
49204
|
-
const BARE_PROMPT_LINE = /^\s*(❯|›)\s*$/;
|
|
49205
|
-
const MAX_TRAILING_LINES = 6;
|
|
49206
|
-
const MAX_CONTEXT_LINES = 8;
|
|
49207
|
-
const MAX_OPTIONS = 9;
|
|
49208
|
-
const MAX_LABEL_CHARS = 100;
|
|
49209
|
-
const RECOMMENDED_SUFFIX = /\s*\((recommended)\)\s*$/i;
|
|
49210
|
-
function cleanLine(line) {
|
|
49211
|
-
return line.replace(ANSI_PATTERN, "").replace(/[\x00-\x1f\x7f]/g, "").replace(/\s+$/g, "");
|
|
49212
|
-
}
|
|
49213
|
-
/**
|
|
49214
|
-
* PAN-3068 shape — key/action pairs separated by "·". Every segment must open
|
|
49215
|
-
* with a key name, so real post-answer output never qualifies.
|
|
49216
|
-
*/
|
|
49217
|
-
function looksLikeHarnessFooterHint(line) {
|
|
49218
|
-
const segments = line.split("·").map((s) => s.trim()).filter(Boolean);
|
|
49219
|
-
if (segments.length === 0) return false;
|
|
49220
|
-
return segments.every((segment) => /^(?:esc(?:ape)?|tab|enter|return|space|backspace|shift\+\S+|ctrl\+\S+|alt\+\S+|\?)\b/i.test(segment) || /^press\s+\S+/i.test(segment));
|
|
49221
|
-
}
|
|
49222
|
-
/** "1. Yes / 2. Yes, and allow… / 3. No" — owned by the permission-menu path. */
|
|
49223
|
-
function looksLikePermissionOptions(options) {
|
|
49224
|
-
if (options.length !== 3) return false;
|
|
49225
|
-
return /^yes$/i.test(options[0].label) && /^yes,?\s*(?:and\s*)?(?:allow|don't ask|always)/i.test(options[1].label) && /^no\b/i.test(options[2].label);
|
|
49226
|
-
}
|
|
49227
|
-
function parseOptionLine(line) {
|
|
49228
|
-
const match = OPTION_LINE.exec(line);
|
|
49229
|
-
if (!match) return null;
|
|
49230
|
-
const number = Number(match[2]);
|
|
49231
|
-
if (!Number.isInteger(number) || number < 1 || number > MAX_OPTIONS) return null;
|
|
49232
|
-
const rawLabel = match[3].trim();
|
|
49233
|
-
if (rawLabel.length === 0 || rawLabel.length > MAX_LABEL_CHARS) return null;
|
|
49234
|
-
return {
|
|
49235
|
-
cursor: Boolean(match[1]),
|
|
49236
|
-
number,
|
|
49237
|
-
rawLabel
|
|
49238
|
-
};
|
|
49239
|
-
}
|
|
49240
|
-
/**
|
|
49241
|
-
* Parse the last numbered-choice menu in the pane, or null when the pane is
|
|
49242
|
-
* not currently blocked on one. See the module header for the conservative
|
|
49243
|
-
* acceptance rules.
|
|
49244
|
-
*/
|
|
49245
|
-
function parsePaneChoiceMenu(paneText) {
|
|
49246
|
-
if (!paneText) return null;
|
|
49247
|
-
const lines = paneText.split("\n").map(cleanLine);
|
|
49248
|
-
let end = lines.length - 1;
|
|
49249
|
-
while (end >= 0 && lines[end].trim() === "") end -= 1;
|
|
49250
|
-
if (end < 0) return null;
|
|
49251
|
-
let lastOption = -1;
|
|
49252
|
-
for (let i = end; i >= 0; i -= 1) {
|
|
49253
|
-
if (parseOptionLine(lines[i])) {
|
|
49254
|
-
lastOption = i;
|
|
49255
|
-
break;
|
|
49256
|
-
}
|
|
49257
|
-
if (end - i > MAX_TRAILING_LINES + MAX_OPTIONS) break;
|
|
49258
|
-
}
|
|
49259
|
-
if (lastOption < 0) return null;
|
|
49260
|
-
const optionLines = [];
|
|
49261
|
-
let firstOption = lastOption;
|
|
49262
|
-
for (let i = lastOption; i >= 0; i -= 1) {
|
|
49263
|
-
const parsed = parseOptionLine(lines[i]);
|
|
49264
|
-
if (!parsed) break;
|
|
49265
|
-
optionLines.unshift(parsed);
|
|
49266
|
-
firstOption = i;
|
|
49267
|
-
}
|
|
49268
|
-
if (optionLines.length < 2 || optionLines.length > MAX_OPTIONS) return null;
|
|
49269
|
-
for (let i = 0; i < optionLines.length; i += 1) if (optionLines[i].number !== i + 1) return null;
|
|
49270
|
-
const cursorRows = optionLines.map((opt, index) => opt.cursor ? index : -1).filter((index) => index >= 0);
|
|
49271
|
-
if (cursorRows.length > 1) return null;
|
|
49272
|
-
const trailing = lines.slice(lastOption + 1).filter((line) => line.trim() !== "");
|
|
49273
|
-
if (trailing.length > MAX_TRAILING_LINES) return null;
|
|
49274
|
-
let footerHint = null;
|
|
49275
|
-
for (const line of trailing) {
|
|
49276
|
-
if (BARE_PROMPT_LINE.test(line)) return null;
|
|
49277
|
-
if (SEPARATOR_LINE.test(line)) continue;
|
|
49278
|
-
if (looksLikeHarnessFooterHint(line.trim())) {
|
|
49279
|
-
if (footerHint === null) footerHint = line.trim();
|
|
49280
|
-
continue;
|
|
49281
|
-
}
|
|
49282
|
-
return null;
|
|
49283
|
-
}
|
|
49284
|
-
const options = optionLines.map((opt) => {
|
|
49285
|
-
const recommended = RECOMMENDED_SUFFIX.test(opt.rawLabel);
|
|
49286
|
-
return {
|
|
49287
|
-
number: opt.number,
|
|
49288
|
-
label: recommended ? opt.rawLabel.replace(RECOMMENDED_SUFFIX, "") : opt.rawLabel,
|
|
49289
|
-
recommended
|
|
49290
|
-
};
|
|
49291
|
-
});
|
|
49292
|
-
if (looksLikePermissionOptions(options)) return null;
|
|
49293
|
-
if (footerHint && /space\s+to\s+(?:select|toggle)/i.test(footerHint)) return null;
|
|
49294
|
-
const contextLines = [];
|
|
49295
|
-
let paragraphs = 0;
|
|
49296
|
-
let i = firstOption - 1;
|
|
49297
|
-
while (i >= 0 && lines[i].trim() === "") i -= 1;
|
|
49298
|
-
for (; i >= 0 && contextLines.length < MAX_CONTEXT_LINES; i -= 1) {
|
|
49299
|
-
const line = lines[i];
|
|
49300
|
-
if (SEPARATOR_LINE.test(line) || BARE_PROMPT_LINE.test(line)) break;
|
|
49301
|
-
if (parseOptionLine(line)) break;
|
|
49302
|
-
if (line.trim() === "") {
|
|
49303
|
-
if (paragraphs >= 2) break;
|
|
49304
|
-
let j = i - 1;
|
|
49305
|
-
while (j >= 0 && lines[j].trim() === "") j -= 1;
|
|
49306
|
-
if (j < 0 || SEPARATOR_LINE.test(lines[j]) || BARE_PROMPT_LINE.test(lines[j]) || parseOptionLine(lines[j])) break;
|
|
49307
|
-
i = j + 1;
|
|
49308
|
-
continue;
|
|
49309
|
-
}
|
|
49310
|
-
if (lines[i + 1] === void 0 || lines[i + 1].trim() === "") paragraphs += 1;
|
|
49311
|
-
contextLines.unshift(line.trim());
|
|
49312
|
-
}
|
|
49313
|
-
const hasCursor = cursorRows.length === 1;
|
|
49314
|
-
if (!hasCursor && footerHint === null) return null;
|
|
49315
|
-
const confidence = hasCursor && footerHint !== null ? "high" : "low";
|
|
49316
|
-
return {
|
|
49317
|
-
title: contextLines[0] ?? options[0].label,
|
|
49318
|
-
contextLines,
|
|
49319
|
-
options,
|
|
49320
|
-
selectedIndex: hasCursor ? cursorRows[0] : 0,
|
|
49321
|
-
footerHint,
|
|
49322
|
-
confidence
|
|
49323
|
-
};
|
|
49324
|
-
}
|
|
49325
|
-
/** Stable identity for patrol dedupe — same menu re-parsed must not re-surface. */
|
|
49326
|
-
function paneChoiceMenuSignature(menu) {
|
|
49327
|
-
return `${menu.title}::${menu.options.map((o) => `${o.number}:${o.label}`).join("|")}`;
|
|
49328
|
-
}
|
|
49329
|
-
/**
|
|
49330
|
-
* Literal tmux keystrokes answering the menu with `selectedIndex`: arrow the
|
|
49331
|
-
* cursor from its current row to the target, then confirm. Claude Code menus
|
|
49332
|
-
* move the ❯ cursor with ↑/↓ and confirm with Enter; number keys are not
|
|
49333
|
-
* guaranteed across harness versions, so arrows are the universal path.
|
|
49334
|
-
*/
|
|
49335
|
-
function buildChoiceKeystrokes(menu, selectedIndex) {
|
|
49336
|
-
const clamped = Math.max(0, Math.min(selectedIndex, menu.options.length - 1));
|
|
49337
|
-
const from = menu.selectedIndex;
|
|
49338
|
-
const keys = [];
|
|
49339
|
-
for (let i = from; i < clamped; i += 1) keys.push("Down");
|
|
49340
|
-
for (let i = from; i > clamped; i -= 1) keys.push("Up");
|
|
49341
|
-
keys.push("Enter");
|
|
49342
|
-
return keys;
|
|
49343
|
-
}
|
|
49344
|
-
//#endregion
|
|
49345
|
-
//#region ../../lib/overdeck/conversation-pane-choice.ts
|
|
49346
|
-
/**
|
|
49347
49318
|
* PAN-3113 — surface blocking numbered-choice menus in claude-code
|
|
49348
49319
|
* conversation panes (the session-resume gate is the driving case) as
|
|
49349
49320
|
* actionable pending input, and answer them from the dashboard.
|
|
@@ -49873,7 +49844,7 @@ async function resolveSpecialistSessionFile(name) {
|
|
|
49873
49844
|
} catch {}
|
|
49874
49845
|
return null;
|
|
49875
49846
|
}
|
|
49876
|
-
async function getConversationMessagesRead(name, deps) {
|
|
49847
|
+
async function getConversationMessagesRead(name, deps, agentId) {
|
|
49877
49848
|
try {
|
|
49878
49849
|
const conv = getConversationByName(name);
|
|
49879
49850
|
let sessionFile = conv ? await deps.resolveSessionFile(conv) : void 0;
|
|
@@ -49894,15 +49865,24 @@ async function getConversationMessagesRead(name, deps) {
|
|
|
49894
49865
|
streaming: false
|
|
49895
49866
|
});
|
|
49896
49867
|
}
|
|
49868
|
+
const parentSessionFile = sessionFile;
|
|
49869
|
+
if (agentId !== void 0) {
|
|
49870
|
+
sessionFile = subagentTranscriptPath(parentSessionFile, agentId);
|
|
49871
|
+
if (!sessionFile) return result({ error: "Invalid subagent id" }, 400);
|
|
49872
|
+
}
|
|
49897
49873
|
try {
|
|
49898
49874
|
const parsed = await getCachedMessages(sessionFile, false);
|
|
49899
|
-
if (conv && (parsed.totalCost > 0 || parsed.totalTokens > 0)) updateConversationCost(name, parsed.totalCost, parsed.totalTokens);
|
|
49875
|
+
if (agentId === void 0 && conv && (parsed.totalCost > 0 || parsed.totalTokens > 0)) updateConversationCost(name, parsed.totalCost, parsed.totalTokens);
|
|
49900
49876
|
let contextUsage = null;
|
|
49901
49877
|
if (conv) try {
|
|
49902
49878
|
contextUsage = await computeContextUsage(sessionFile, conv.model);
|
|
49903
49879
|
} catch {
|
|
49904
49880
|
contextUsage = null;
|
|
49905
49881
|
}
|
|
49882
|
+
const subagents = agentId === void 0 ? (await listSubagentMetas(parentSessionFile)).map((meta) => ({
|
|
49883
|
+
...meta,
|
|
49884
|
+
status: "done"
|
|
49885
|
+
})) : void 0;
|
|
49906
49886
|
return result({
|
|
49907
49887
|
messages: parsed.messages,
|
|
49908
49888
|
workLog: parsed.workLog,
|
|
@@ -49912,7 +49892,8 @@ async function getConversationMessagesRead(name, deps) {
|
|
|
49912
49892
|
proposedPlan: parsed.proposedPlan,
|
|
49913
49893
|
compactBoundaries: (parsed.compactBoundaries?.length ?? 0) > 0 ? parsed.compactBoundaries : void 0,
|
|
49914
49894
|
compacting: isCompacting(sessionFile) || void 0,
|
|
49915
|
-
contextUsage
|
|
49895
|
+
contextUsage,
|
|
49896
|
+
subagents
|
|
49916
49897
|
});
|
|
49917
49898
|
} catch (parseErr) {
|
|
49918
49899
|
if (parseErr?.code === "ENOENT") return result({
|
|
@@ -50979,7 +50960,7 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
|
|
|
50979
50960
|
let mergeState;
|
|
50980
50961
|
let isDraft;
|
|
50981
50962
|
let checksFailed;
|
|
50982
|
-
const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-
|
|
50963
|
+
const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-DIE8BkHI.js");
|
|
50983
50964
|
if (isGitHubAppConfigured()) {
|
|
50984
50965
|
const prState = await Effect.runPromise(getPullRequestState(owner, repoName, prNumber));
|
|
50985
50966
|
mergeable = prState.mergeable === null ? "UNKNOWN" : prState.mergeable ? "MERGEABLE" : "CONFLICTING";
|
|
@@ -51130,8 +51111,8 @@ async function handlePullRequestPromise(payload) {
|
|
|
51130
51111
|
bumpIssuePrTabCacheGeneration(issueId);
|
|
51131
51112
|
const repo = payload.repository.full_name;
|
|
51132
51113
|
if (payload.action === "closed" && pr.merged === true) try {
|
|
51133
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
51134
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
51114
|
+
const { postMergeLifecycle } = await import("./merge-agent-C1-9zbP_.js");
|
|
51115
|
+
const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
|
|
51135
51116
|
const project = resolveProjectFromIssueSync(issueId);
|
|
51136
51117
|
if (project) {
|
|
51137
51118
|
const branchName = pr.head.ref;
|
|
@@ -52119,11 +52100,12 @@ const postConversationAbortRoute = HttpRouter.add("POST", "/api/conversations/:n
|
|
|
52119
52100
|
});
|
|
52120
52101
|
}));
|
|
52121
52102
|
const getConversationMessagesRoute = HttpRouter.add("GET", "/api/conversations/:name/messages", Effect.gen(function* () {
|
|
52122
|
-
const
|
|
52103
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
52104
|
+
const originCheck = validateOrigin$1(request);
|
|
52123
52105
|
if (!originCheck.ok) return jsonResponse({ error: originCheck.error }, { status: 403 });
|
|
52124
52106
|
const name = (yield* HttpRouter.params)["name"] ?? "";
|
|
52125
52107
|
return yield* Effect.promise(async () => {
|
|
52126
|
-
return conversationReadJson(await getConversationMessagesRead(name, conversationReadDependencies));
|
|
52108
|
+
return conversationReadJson(await getConversationMessagesRead(name, conversationReadDependencies, new URL(request.url, "http://localhost").searchParams.get("agentId") ?? void 0));
|
|
52127
52109
|
});
|
|
52128
52110
|
}));
|
|
52129
52111
|
const getConversationMessageLocatorRoute = HttpRouter.add("GET", "/api/conversations/:name/message-locator", Effect.gen(function* () {
|
|
@@ -52515,7 +52497,7 @@ async function registerProjectFromPath(opts) {
|
|
|
52515
52497
|
registerProjectSync(key, projectConfig);
|
|
52516
52498
|
const seededContextLayer = ensureProjectLayer(fullPath);
|
|
52517
52499
|
try {
|
|
52518
|
-
const { preTrustDirectorySync } = await import("./workspace-manager-
|
|
52500
|
+
const { preTrustDirectorySync } = await import("./workspace-manager-B38rFWA1.js");
|
|
52519
52501
|
preTrustDirectorySync(fullPath);
|
|
52520
52502
|
} catch {}
|
|
52521
52503
|
let hooksInstalled = 0;
|
|
@@ -52556,7 +52538,7 @@ init_specs();
|
|
|
52556
52538
|
init_paths();
|
|
52557
52539
|
const execAsync$3 = promisify(exec);
|
|
52558
52540
|
async function getIssueDataService() {
|
|
52559
|
-
const { getSharedIssueService } = await import("./issue-service-singleton-
|
|
52541
|
+
const { getSharedIssueService } = await import("./issue-service-singleton-lwFJ4dHk.js");
|
|
52560
52542
|
return getSharedIssueService();
|
|
52561
52543
|
}
|
|
52562
52544
|
/** Returns true if the path exists (any type). */
|
|
@@ -53026,7 +53008,7 @@ const getProjectReleaseStatusRoute = HttpRouter.add("GET", "/api/projects/:proje
|
|
|
53026
53008
|
const projectKey = (yield* HttpRouter.params)["projectKey"] ?? "";
|
|
53027
53009
|
return jsonResponse(yield* Effect.tryPromise({
|
|
53028
53010
|
try: async () => {
|
|
53029
|
-
const { fetchProjectReleaseStatus } = await import("./project-pipelines-
|
|
53011
|
+
const { fetchProjectReleaseStatus } = await import("./project-pipelines-C3SPFJ38.js");
|
|
53030
53012
|
return fetchProjectReleaseStatus(projectKey);
|
|
53031
53013
|
},
|
|
53032
53014
|
catch: (err) => new Error(err instanceof Error ? err.message : String(err))
|
|
@@ -53267,7 +53249,7 @@ init_projects();
|
|
|
53267
53249
|
const getProjectMergeTrainRoute = HttpRouter.add("GET", "/api/projects/:projectKey/merge-train", httpHandler(Effect.gen(function* () {
|
|
53268
53250
|
const config = getProjectSync((yield* HttpRouter.params)["projectKey"] ?? "");
|
|
53269
53251
|
if (!config) return jsonResponse({ error: "Project not found" }, { status: 404 });
|
|
53270
|
-
const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-
|
|
53252
|
+
const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-CqEtqjI2.js"));
|
|
53271
53253
|
return jsonResponse({
|
|
53272
53254
|
value: config.merge_train ?? null,
|
|
53273
53255
|
effective: isMergeTrainEnabledForProject(config)
|
|
@@ -53280,7 +53262,7 @@ const postProjectMergeTrainRoute = HttpRouter.add("POST", "/api/projects/:projec
|
|
|
53280
53262
|
if (!getProjectSync(key)) return jsonResponse({ error: "Project not found" }, { status: 404 });
|
|
53281
53263
|
const v = (yield* readProjectJsonBody).value;
|
|
53282
53264
|
if (v !== "enabled" && v !== "disabled" && v !== null) return jsonResponse({ error: "value must be 'enabled', 'disabled', or null" }, { status: 400 });
|
|
53283
|
-
const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-
|
|
53265
|
+
const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-CqEtqjI2.js"));
|
|
53284
53266
|
setProjectMergeTrainSync(key, v);
|
|
53285
53267
|
const updated = getProjectSync(key);
|
|
53286
53268
|
return jsonResponse({
|
|
@@ -53356,7 +53338,7 @@ async function queueEntryForProject(key, config, enabled) {
|
|
|
53356
53338
|
* not blank the whole response, so a failed project reports an empty queue.
|
|
53357
53339
|
*/
|
|
53358
53340
|
async function getMergeTrainQueuesPayload() {
|
|
53359
|
-
const { isMergeTrainEnabledForProject } = await import("./merge-sync-
|
|
53341
|
+
const { isMergeTrainEnabledForProject } = await import("./merge-sync-CqEtqjI2.js");
|
|
53360
53342
|
const projects = listProjectsSync();
|
|
53361
53343
|
return (await Promise.allSettled(projects.map(({ key, config }) => queueEntryForProject(key, config, isMergeTrainEnabledForProject(config))))).flatMap((outcome, i) => {
|
|
53362
53344
|
if (outcome.status === "fulfilled") return [outcome.value];
|
|
@@ -53374,8 +53356,8 @@ async function getMergeTrainQueuesPayload() {
|
|
|
53374
53356
|
}
|
|
53375
53357
|
/** PAN-1696 AC2: per-project generation chains across every tracked project. */
|
|
53376
53358
|
async function getMergeTrainGenerationsPayload() {
|
|
53377
|
-
const { isMergeTrainEnabledForProject } = await import("./merge-sync-
|
|
53378
|
-
const { getUatGenerationsPayload } = await import("./uat-train-
|
|
53359
|
+
const { isMergeTrainEnabledForProject } = await import("./merge-sync-CqEtqjI2.js");
|
|
53360
|
+
const { getUatGenerationsPayload } = await import("./uat-train-diX_7shd.js");
|
|
53379
53361
|
return (await Promise.allSettled(listProjectsSync().map(async ({ key, config }) => ({
|
|
53380
53362
|
projectKey: key,
|
|
53381
53363
|
projectName: config.name,
|
|
@@ -53389,7 +53371,7 @@ async function defaultOrderedIssueIdsForProject(projectPath) {
|
|
|
53389
53371
|
return (await Effect.runPromise(computeMergeQueueFromCandidates(candidates, projectPath).pipe(Effect.provide(layer)))).map((item) => item.issueId);
|
|
53390
53372
|
}
|
|
53391
53373
|
async function defaultMergeOne(issueId) {
|
|
53392
|
-
const { triggerMerge } = await import("./merge-ops-
|
|
53374
|
+
const { triggerMerge } = await import("./merge-ops-7QqziXAh.js");
|
|
53393
53375
|
const r = await triggerMerge(issueId);
|
|
53394
53376
|
return r.success ? { ok: true } : {
|
|
53395
53377
|
ok: false,
|
|
@@ -53417,13 +53399,13 @@ async function postMergeTrainMergeNextPayload(payload, deps = {}) {
|
|
|
53417
53399
|
status: 404,
|
|
53418
53400
|
body: { error: `Unknown project key: ${projectKey}` }
|
|
53419
53401
|
};
|
|
53420
|
-
const { isMergeTrainEnabledForProject } = await import("./merge-sync-
|
|
53402
|
+
const { isMergeTrainEnabledForProject } = await import("./merge-sync-CqEtqjI2.js");
|
|
53421
53403
|
if (!isMergeTrainEnabledForProject(config)) return {
|
|
53422
53404
|
status: 409,
|
|
53423
53405
|
body: { error: `merge-train is disabled for project ${projectKey}` }
|
|
53424
53406
|
};
|
|
53425
53407
|
const issueIds = (await (deps.getOrderedIssueIds ?? defaultOrderedIssueIdsForProject)(resolve(config.path))).slice(0, n);
|
|
53426
|
-
const { shipMergeBatch } = await import("./merge-batch-
|
|
53408
|
+
const { shipMergeBatch } = await import("./merge-batch-C11ocNkO.js");
|
|
53427
53409
|
return {
|
|
53428
53410
|
status: 200,
|
|
53429
53411
|
body: {
|
|
@@ -53453,7 +53435,7 @@ async function postMergeTrainAssemblePayload(payload) {
|
|
|
53453
53435
|
status: 404,
|
|
53454
53436
|
body: { error: `Unknown project key: ${projectKey}` }
|
|
53455
53437
|
};
|
|
53456
|
-
const { runUatTrainReconcile } = await import("./uat-train-
|
|
53438
|
+
const { runUatTrainReconcile } = await import("./uat-train-diX_7shd.js");
|
|
53457
53439
|
return {
|
|
53458
53440
|
status: 200,
|
|
53459
53441
|
body: { projects: [{
|
|
@@ -53465,7 +53447,7 @@ async function postMergeTrainAssemblePayload(payload) {
|
|
|
53465
53447
|
}] }
|
|
53466
53448
|
};
|
|
53467
53449
|
}
|
|
53468
|
-
const { runUatTrainReconcileAllProjects } = await import("./uat-train-
|
|
53450
|
+
const { runUatTrainReconcileAllProjects } = await import("./uat-train-diX_7shd.js");
|
|
53469
53451
|
return {
|
|
53470
53452
|
status: 200,
|
|
53471
53453
|
body: { projects: await runUatTrainReconcileAllProjects({ force: true }) }
|
|
@@ -53490,7 +53472,7 @@ const postMergeTrainGenerationStackRoute = HttpRouter.add("POST", "/api/merge-tr
|
|
|
53490
53472
|
const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
|
|
53491
53473
|
if (authError) return authError;
|
|
53492
53474
|
const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
|
|
53493
|
-
const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-
|
|
53475
|
+
const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-diX_7shd.js"));
|
|
53494
53476
|
const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
|
|
53495
53477
|
if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
|
|
53496
53478
|
return jsonResponse({
|
|
@@ -53502,8 +53484,8 @@ const postMergeTrainGenerationPromoteRoute = HttpRouter.add("POST", "/api/merge-
|
|
|
53502
53484
|
const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
|
|
53503
53485
|
if (authError) return authError;
|
|
53504
53486
|
const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
|
|
53505
|
-
const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-
|
|
53506
|
-
const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-
|
|
53487
|
+
const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-diX_7shd.js"));
|
|
53488
|
+
const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-ZdrifiKx.js"));
|
|
53507
53489
|
const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle));
|
|
53508
53490
|
if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
|
|
53509
53491
|
return jsonResponse(result);
|
|
@@ -55013,7 +54995,7 @@ function getCheckpointWorker() {
|
|
|
55013
54995
|
return worker;
|
|
55014
54996
|
}
|
|
55015
54997
|
async function runInline(operation, payload) {
|
|
55016
|
-
const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-
|
|
54998
|
+
const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-wF84ubZ8.js");
|
|
55017
54999
|
switch (operation) {
|
|
55018
55000
|
case "claimTranscriptRange": return claimTranscriptRange(payload);
|
|
55019
55001
|
case "commitTranscriptRange": return commitTranscriptRange(payload);
|
|
@@ -56167,7 +56149,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
|
|
|
56167
56149
|
};
|
|
56168
56150
|
}
|
|
56169
56151
|
async function emitMemoryObservationCreated(observation, timestamp) {
|
|
56170
|
-
const { initEventStore } = await import("./event-store-
|
|
56152
|
+
const { initEventStore } = await import("./event-store-5UKzh9Jf.js");
|
|
56171
56153
|
await (await initEventStore()).appendAsync({
|
|
56172
56154
|
type: "memory.observation_created",
|
|
56173
56155
|
timestamp,
|
|
@@ -58864,12 +58846,12 @@ async function pauseFlywheelRunForDashboard() {
|
|
|
58864
58846
|
if (before.activeRunId) try {
|
|
58865
58847
|
const { readFile } = await import("node:fs/promises");
|
|
58866
58848
|
const { join } = await import("node:path");
|
|
58867
|
-
const { getAgentDir } = await import("./agents-
|
|
58849
|
+
const { getAgentDir } = await import("./agents-Dnn4XgdB.js");
|
|
58868
58850
|
const sessionId = (await readFile(join(getAgentDir(FLYWHEEL_ORCHESTRATOR_AGENT_ID), "session.id"), "utf-8")).trim();
|
|
58869
58851
|
if (sessionId) await saveResumeSessionId(before.activeRunId, sessionId);
|
|
58870
58852
|
} catch {}
|
|
58871
58853
|
await setPaused(true);
|
|
58872
|
-
await import("./agents-
|
|
58854
|
+
await import("./agents-Dnn4XgdB.js").then(({ stopAgent }) => Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID)));
|
|
58873
58855
|
return {
|
|
58874
58856
|
before,
|
|
58875
58857
|
after: await readGateSnapshot(),
|
|
@@ -58879,7 +58861,7 @@ async function pauseFlywheelRunForDashboard() {
|
|
|
58879
58861
|
async function abortFlywheelRunForDashboard() {
|
|
58880
58862
|
const candidate = await getActiveRunId();
|
|
58881
58863
|
if (!candidate) return { aborted: await resolveLiveFlywheelRunId() ?? null };
|
|
58882
|
-
const { stopAgent } = await import("./agents-
|
|
58864
|
+
const { stopAgent } = await import("./agents-Dnn4XgdB.js");
|
|
58883
58865
|
await Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID));
|
|
58884
58866
|
await abortFlywheelRun(candidate);
|
|
58885
58867
|
return { aborted: candidate };
|
|
@@ -59542,7 +59524,8 @@ function deleteAutoMergePayload(issueIdParam, deps = {}) {
|
|
|
59542
59524
|
...entry,
|
|
59543
59525
|
status: "cancelled",
|
|
59544
59526
|
cancelledAt,
|
|
59545
|
-
cancelledBy: "operator"
|
|
59527
|
+
cancelledBy: "operator",
|
|
59528
|
+
remainingActionable: (deps.countRemaining ?? countActionableAutoMerges)(issueId)
|
|
59546
59529
|
}
|
|
59547
59530
|
};
|
|
59548
59531
|
}
|
|
@@ -59559,7 +59542,7 @@ async function getFlywheelConversationPayload() {
|
|
|
59559
59542
|
};
|
|
59560
59543
|
}
|
|
59561
59544
|
async function postFlywheelReportPayload() {
|
|
59562
|
-
const { flywheelReportCommand } = await import("./flywheel-
|
|
59545
|
+
const { flywheelReportCommand } = await import("./flywheel-DQqsSm7P.js");
|
|
59563
59546
|
await flywheelReportCommand({ cwd: process.cwd() });
|
|
59564
59547
|
return {
|
|
59565
59548
|
status: 200,
|
|
@@ -59854,7 +59837,7 @@ const postFlywheelBriefRoute = HttpRouter.add("POST", "/api/flywheel/brief", htt
|
|
|
59854
59837
|
});
|
|
59855
59838
|
})));
|
|
59856
59839
|
const getUatCandidateRoute = HttpRouter.add("GET", "/api/flywheel/uat-candidate", httpHandler(Effect.gen(function* () {
|
|
59857
|
-
const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-
|
|
59840
|
+
const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-diX_7shd.js"));
|
|
59858
59841
|
return jsonResponse(yield* Effect.promise(() => getUatCandidatePayload()));
|
|
59859
59842
|
})));
|
|
59860
59843
|
const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
|
|
@@ -60049,7 +60032,7 @@ function previewBrief(book) {
|
|
|
60049
60032
|
return `${lines.join("\n")}\n`;
|
|
60050
60033
|
}
|
|
60051
60034
|
async function defaultStartOrderBook(book) {
|
|
60052
|
-
const { startFlywheelRun } = await import("./flywheel-
|
|
60035
|
+
const { startFlywheelRun } = await import("./flywheel-DQqsSm7P.js");
|
|
60053
60036
|
return startFlywheelRun({
|
|
60054
60037
|
cwd: process.cwd(),
|
|
60055
60038
|
orders: book.id
|
|
@@ -60727,6 +60710,7 @@ function agentStateToDbAgent(state) {
|
|
|
60727
60710
|
lastFailureReason: state.lastFailureReason ?? null,
|
|
60728
60711
|
lastFailureNextRetryAt: state.lastFailureNextRetryAt ?? null,
|
|
60729
60712
|
flywheelRunId: state.flywheelRunId ?? null,
|
|
60713
|
+
startedBy: state.startedBy ?? null,
|
|
60730
60714
|
roleRunHead: state.roleRunHead ?? null,
|
|
60731
60715
|
reviewSubRole: state.reviewSubRole ?? null,
|
|
60732
60716
|
reviewRunId: state.reviewRunId ?? null,
|
|
@@ -60803,6 +60787,7 @@ const COLUMN_MAP = {
|
|
|
60803
60787
|
lastFailureReason: "last_failure_reason",
|
|
60804
60788
|
lastFailureNextRetryAt: "last_failure_next_retry_at",
|
|
60805
60789
|
flywheelRunId: "flywheel_run_id",
|
|
60790
|
+
startedBy: "started_by",
|
|
60806
60791
|
roleRunHead: "role_run_head",
|
|
60807
60792
|
reviewSubRole: "review_sub_role",
|
|
60808
60793
|
reviewRunId: "review_run_id",
|
|
@@ -60875,7 +60860,7 @@ function backfillAgentsFromStateJsonSync(db, options) {
|
|
|
60875
60860
|
const readHarnessModel = options?.readHarnessModel ?? readAgentHarnessModelRecordSync;
|
|
60876
60861
|
let processed = 0;
|
|
60877
60862
|
let skipped = 0;
|
|
60878
|
-
|
|
60863
|
+
const markedStoppedIds = [];
|
|
60879
60864
|
let entries = [];
|
|
60880
60865
|
try {
|
|
60881
60866
|
entries = readdirSync$1(agentsDir);
|
|
@@ -60883,7 +60868,8 @@ function backfillAgentsFromStateJsonSync(db, options) {
|
|
|
60883
60868
|
return {
|
|
60884
60869
|
processed,
|
|
60885
60870
|
skipped,
|
|
60886
|
-
markedStopped
|
|
60871
|
+
markedStopped: 0,
|
|
60872
|
+
markedStoppedIds
|
|
60887
60873
|
};
|
|
60888
60874
|
}
|
|
60889
60875
|
const columns = Object.values(COLUMN_MAP);
|
|
@@ -60912,7 +60898,10 @@ function backfillAgentsFromStateJsonSync(db, options) {
|
|
|
60912
60898
|
continue;
|
|
60913
60899
|
}
|
|
60914
60900
|
const reconciled = reconcileAgentStatus(state, liveSessions);
|
|
60915
|
-
|
|
60901
|
+
const reconciledStop = reconciled.status === "stopped" && state.status !== "stopped" ? {
|
|
60902
|
+
id: state.id,
|
|
60903
|
+
previousStatus: state.status
|
|
60904
|
+
} : void 0;
|
|
60916
60905
|
let effective = reconciled;
|
|
60917
60906
|
if (reconciled.issueId) {
|
|
60918
60907
|
const rec = readHarnessModel(reconciled.issueId);
|
|
@@ -60924,14 +60913,17 @@ function backfillAgentsFromStateJsonSync(db, options) {
|
|
|
60924
60913
|
}
|
|
60925
60914
|
const row = agentStateToDbAgent(effective);
|
|
60926
60915
|
upsert.run(buildNamedParams(row));
|
|
60916
|
+
if (reconciledStop) markedStoppedIds.push(reconciledStop);
|
|
60927
60917
|
processed++;
|
|
60928
60918
|
if (options?.verbose) console.log(`[backfill] ${row.id} -> ${row.status}`);
|
|
60929
60919
|
}
|
|
60930
60920
|
})();
|
|
60921
|
+
for (const { id, previousStatus } of markedStoppedIds) logAgentLifecycleSync(id, `status changed: ${previousStatus} → stopped (boot backfill reconcile: no live tmux session)`);
|
|
60931
60922
|
return {
|
|
60932
60923
|
processed,
|
|
60933
60924
|
skipped,
|
|
60934
|
-
markedStopped
|
|
60925
|
+
markedStopped: markedStoppedIds.length,
|
|
60926
|
+
markedStoppedIds
|
|
60935
60927
|
};
|
|
60936
60928
|
}
|
|
60937
60929
|
function reconcileAgentStatus(state, liveSessions) {
|
|
@@ -61171,6 +61163,8 @@ function initSchema(db) {
|
|
|
61171
61163
|
review_spawned_at TEXT,
|
|
61172
61164
|
-- PAN-1765: timestamp when conflict resolution was dispatched
|
|
61173
61165
|
conflict_resolution_dispatched_at TEXT,
|
|
61166
|
+
-- PAN-3154: main-head SHA/paths that first made this branch conflict (JSON)
|
|
61167
|
+
conflicts_since TEXT,
|
|
61174
61168
|
-- PAN-699: number of test-agent dispatch retries (circuit breaker)
|
|
61175
61169
|
test_retry_count INTEGER DEFAULT 0,
|
|
61176
61170
|
-- PAN-794: parallel-review re-dispatch retry counter (scoped to current recovery cycle)
|
|
@@ -61188,7 +61182,9 @@ function initSchema(db) {
|
|
|
61188
61182
|
-- PAN-938: current merge pipeline step
|
|
61189
61183
|
merge_step TEXT,
|
|
61190
61184
|
-- PAN-1691: per-issue merge-train routing key (NULL=project default, 1=auto-merge, 0=hold-for-UAT)
|
|
61191
|
-
auto_merge INTEGER
|
|
61185
|
+
auto_merge INTEGER,
|
|
61186
|
+
-- PAN-3151: JSON array of review cycle history entries for convergence detection
|
|
61187
|
+
review_cycle_history TEXT
|
|
61192
61188
|
);
|
|
61193
61189
|
|
|
61194
61190
|
CREATE INDEX IF NOT EXISTS idx_review_status_updated
|
|
@@ -61374,7 +61370,7 @@ function initSchema(db) {
|
|
|
61374
61370
|
last_failure_at TEXT,
|
|
61375
61371
|
last_failure_reason TEXT,
|
|
61376
61372
|
last_failure_next_retry_at TEXT,
|
|
61377
|
-
flywheel_run_id TEXT,
|
|
61373
|
+
flywheel_run_id TEXT, started_by TEXT,
|
|
61378
61374
|
role_run_head TEXT,
|
|
61379
61375
|
review_sub_role TEXT,
|
|
61380
61376
|
review_run_id TEXT,
|
|
@@ -61693,7 +61689,7 @@ function initSchema(db) {
|
|
|
61693
61689
|
CREATE INDEX IF NOT EXISTS idx_backlog_sequence_project_rank
|
|
61694
61690
|
ON backlog_sequence(project_key, rank);
|
|
61695
61691
|
`);
|
|
61696
|
-
db.pragma(`user_version =
|
|
61692
|
+
db.pragma(`user_version = 63`);
|
|
61697
61693
|
}
|
|
61698
61694
|
/**
|
|
61699
61695
|
* Run schema migrations if the database version is older than SCHEMA_VERSION.
|
|
@@ -61701,12 +61697,18 @@ function initSchema(db) {
|
|
|
61701
61697
|
*/
|
|
61702
61698
|
function runMigrations(db, dbPath) {
|
|
61703
61699
|
const currentVersion = db.pragma("user_version", { simple: true });
|
|
61704
|
-
if (currentVersion === 61) tryIdempotentDdl(db, 61, "ALTER TABLE flywheel_substrate_bugs ADD COLUMN affected_criteria TEXT");
|
|
61705
|
-
if (currentVersion >= 61) return;
|
|
61706
61700
|
if (currentVersion === 0) {
|
|
61707
61701
|
initSchema(db);
|
|
61708
61702
|
return;
|
|
61709
61703
|
}
|
|
61704
|
+
if (currentVersion === 63) {
|
|
61705
|
+
tryIdempotentDdl(db, 61, "ALTER TABLE flywheel_substrate_bugs ADD COLUMN affected_criteria TEXT");
|
|
61706
|
+
tryIdempotentDdl(db, 61, "ALTER TABLE agents ADD COLUMN started_by TEXT");
|
|
61707
|
+
tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN review_cycle_history TEXT");
|
|
61708
|
+
tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN conflicts_since TEXT");
|
|
61709
|
+
return;
|
|
61710
|
+
}
|
|
61711
|
+
if (currentVersion > 63) return;
|
|
61710
61712
|
if (currentVersion < 2) db.exec(`
|
|
61711
61713
|
DELETE FROM status_history
|
|
61712
61714
|
WHERE id NOT IN (
|
|
@@ -62360,8 +62362,17 @@ function runMigrations(db, dbPath) {
|
|
|
62360
62362
|
tryIdempotentDdl(db, 60, `ALTER TABLE review_status ADD COLUMN release_status TEXT`);
|
|
62361
62363
|
tryIdempotentDdl(db, 60, `ALTER TABLE review_status ADD COLUMN release_notes TEXT`);
|
|
62362
62364
|
}
|
|
62363
|
-
|
|
62364
|
-
db
|
|
62365
|
+
tryIdempotentDdl(db, 61, "ALTER TABLE flywheel_substrate_bugs ADD COLUMN affected_criteria TEXT");
|
|
62366
|
+
tryIdempotentDdl(db, 61, "ALTER TABLE agents ADD COLUMN started_by TEXT");
|
|
62367
|
+
if (currentVersion < 62) {
|
|
62368
|
+
tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN review_cycle_history TEXT");
|
|
62369
|
+
tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN conflicts_since TEXT");
|
|
62370
|
+
}
|
|
62371
|
+
if (currentVersion < 63) {
|
|
62372
|
+
tryIdempotentDdl(db, 63, "ALTER TABLE review_status ADD COLUMN review_cycle_history TEXT");
|
|
62373
|
+
tryIdempotentDdl(db, 63, "ALTER TABLE review_status ADD COLUMN conflicts_since TEXT");
|
|
62374
|
+
}
|
|
62375
|
+
db.pragma(`user_version = 63`);
|
|
62365
62376
|
}
|
|
62366
62377
|
//#endregion
|
|
62367
62378
|
//#region ../../lib/database/index.ts
|
|
@@ -65347,7 +65358,7 @@ const RESTART_MARKER = join$1(homedir(), ".overdeck", "dashboard-restarting.json
|
|
|
65347
65358
|
* loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
|
|
65348
65359
|
*/
|
|
65349
65360
|
async function defaultLifecycleRunner(pending) {
|
|
65350
|
-
const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-
|
|
65361
|
+
const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-C1-9zbP_.js");
|
|
65351
65362
|
await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
|
|
65352
65363
|
if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
|
|
65353
65364
|
}
|
|
@@ -65688,7 +65699,7 @@ function failureReason(result) {
|
|
|
65688
65699
|
return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
|
|
65689
65700
|
}
|
|
65690
65701
|
async function defaultMergeIssue(issueId) {
|
|
65691
|
-
const { triggerMerge } = await import("./merge-ops-
|
|
65702
|
+
const { triggerMerge } = await import("./merge-ops-7QqziXAh.js");
|
|
65692
65703
|
return triggerMerge(issueId);
|
|
65693
65704
|
}
|
|
65694
65705
|
function defaultAnnounceFailure(issueId, reason) {
|
|
@@ -65987,7 +65998,7 @@ const defaultDependencies = {
|
|
|
65987
65998
|
inspect: inspectStateMigration,
|
|
65988
65999
|
ensureWorktree: ensureStateWorktree,
|
|
65989
66000
|
migrate: async (projectKey, project, signal) => {
|
|
65990
|
-
const { migrateProjectState } = await import("./state-migrate-
|
|
66001
|
+
const { migrateProjectState } = await import("./state-migrate-Cd8BH33U.js");
|
|
65991
66002
|
await migrateProjectState(projectKey, { signal }, project);
|
|
65992
66003
|
},
|
|
65993
66004
|
clearCache: clearStateMigrationCache,
|
|
@@ -66124,6 +66135,7 @@ init_agents$1();
|
|
|
66124
66135
|
init_paths();
|
|
66125
66136
|
init_tmux();
|
|
66126
66137
|
init_fts_db();
|
|
66138
|
+
init_control_settings();
|
|
66127
66139
|
init_paths$1();
|
|
66128
66140
|
init_auto_commit();
|
|
66129
66141
|
init_projects();
|
|
@@ -66198,7 +66210,7 @@ if (shouldStartStaleCheckRetriggerService()) {
|
|
|
66198
66210
|
}
|
|
66199
66211
|
if (process.env.OVERDECK_MODE === "desktop") (async () => {
|
|
66200
66212
|
try {
|
|
66201
|
-
const { provisionClaudeHooks } = await import("./claude-hooks-provision-
|
|
66213
|
+
const { provisionClaudeHooks } = await import("./claude-hooks-provision-UKxCeOyj.js");
|
|
66202
66214
|
const result = await provisionClaudeHooks();
|
|
66203
66215
|
if (!result.ok) console.warn(`[overdeck] Claude hook provisioning skipped: ${result.reason}`);
|
|
66204
66216
|
else if (result.changed) console.log(`[overdeck] Claude hooks provisioned: ${result.binariesSynced} scripts, registered ${result.registered.length} hook(s)${result.pruned.length ? `, pruned ${result.pruned.length} stale` : ""}`);
|
|
@@ -66493,6 +66505,11 @@ let shuttingDown = false;
|
|
|
66493
66505
|
const handleShutdownSignal = async (signal) => {
|
|
66494
66506
|
if (shuttingDown) return;
|
|
66495
66507
|
shuttingDown = true;
|
|
66508
|
+
try {
|
|
66509
|
+
setLastCleanShutdownAt((/* @__PURE__ */ new Date()).toISOString());
|
|
66510
|
+
} catch (err) {
|
|
66511
|
+
console.warn("[overdeck] failed to record clean shutdown marker:", err);
|
|
66512
|
+
}
|
|
66496
66513
|
console.log(`[overdeck] received ${signal} (pid=${process.pid} ppid=${process.ppid}) — shutting down`);
|
|
66497
66514
|
try {
|
|
66498
66515
|
const notifiedClients = broadcastServerRestarting();
|
|
@@ -66522,7 +66539,7 @@ const handleShutdownSignal = async (signal) => {
|
|
|
66522
66539
|
await stopAllKnowledgeViewers().catch((err) => console.warn("[knowledge-viewer] shutdown failed:", err?.message ?? err));
|
|
66523
66540
|
await stopDeaconChild().catch((err) => console.warn("[deacon-supervisor] child shutdown failed:", err?.message ?? err));
|
|
66524
66541
|
try {
|
|
66525
|
-
const { killAllGateProcessGroups } = await import("./validation-
|
|
66542
|
+
const { killAllGateProcessGroups } = await import("./validation-Cf7aaV5A.js");
|
|
66526
66543
|
const reaped = killAllGateProcessGroups();
|
|
66527
66544
|
if (reaped > 0) console.log(`[overdeck] reaped ${reaped} in-flight gate process group(s)`);
|
|
66528
66545
|
} catch (err) {
|
|
@@ -66577,7 +66594,7 @@ reconcileStaleGitHubBlockers().then((n) => {
|
|
|
66577
66594
|
}
|
|
66578
66595
|
}).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
|
|
66579
66596
|
try {
|
|
66580
|
-
const { resetProcessingToQueued } = await import("./merge-sync-
|
|
66597
|
+
const { resetProcessingToQueued } = await import("./merge-sync-CqEtqjI2.js");
|
|
66581
66598
|
const resetCount = resetProcessingToQueued();
|
|
66582
66599
|
if (resetCount > 0) {
|
|
66583
66600
|
console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);
|
|
@@ -66599,7 +66616,7 @@ else {
|
|
|
66599
66616
|
console.log("[overdeck] Auto-merge executor started");
|
|
66600
66617
|
}
|
|
66601
66618
|
try {
|
|
66602
|
-
const { reconcileInterruptedVerifications } = await import("./verification-runner-
|
|
66619
|
+
const { reconcileInterruptedVerifications } = await import("./verification-runner-DiPaUP-C.js");
|
|
66603
66620
|
const interrupted = reconcileInterruptedVerifications();
|
|
66604
66621
|
if (interrupted > 0) console.log(`[overdeck] recovered ${interrupted} orphaned verification worker(s)`);
|
|
66605
66622
|
} catch (err) {
|