@overdeck/desktop 0.49.1 → 0.50.0
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 +1 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-Crw-xSJ3.js → acceptance-criteria-B_maCGZv.js} +2 -2
- package/server/{active-dashboard-bundle-CLwfD-Om.js → active-dashboard-bundle-CCqpFWiz.js} +2 -2
- package/server/activity-logger-B0X2JJwM.js +3 -0
- package/server/{activity-logger-BAVLrkR7.js → activity-logger-SlTXYCVf.js} +22 -4
- package/server/{advancing-selfheal-BQiJ7mIH.js → advancing-selfheal-BJAfiY-C.js} +12 -7
- package/server/{agent-gc-5E0lgxI1.js → agent-gc-bhikjoJ_.js} +11 -11
- package/server/agent-idle-D-UQ7gDv.js +745 -0
- package/server/agent-state-BrUPf_7Z.js +3 -0
- package/server/{agent-state-Bb3UUxQm.js → agent-state-FABw8neJ.js} +682 -454
- package/server/{agent-state-service-keg-x1bT.js → agent-state-service-BAQApt97.js} +1 -1
- package/server/{agent-state-service-BFbttwRA.js → agent-state-service-rDenYSlD.js} +5 -5
- package/server/agents-DixZjXWm.js +3 -0
- package/server/{agents-CqQJW75N.js → agents-DzpQidT8.js} +8 -8
- package/server/{archive-planning-BwEhu9Oq.js → archive-planning-BL1ABtW0.js} +20 -135
- package/server/archive-planning-D3gw32U9.js +2 -0
- package/server/{artifact-index-jobs-C6Lg2rKm.js → artifact-index-jobs-Cjdme0jS.js} +3 -3
- package/server/{assemble-DyTp2gSB.js → assemble-B_JgnCbG.js} +28 -9
- package/server/{auto-spawn-consent-BDfe4qz0.js → auto-spawn-consent-BesWchEi.js} +8 -7
- package/server/{backlog-auto-trigger-DuOGpdDW.js → backlog-auto-trigger-COLq639j.js} +3 -3
- package/server/{behavior-Bitko0mD.js → behavior-DCg8CIWC.js} +3 -3
- package/server/{bridge-pool-patrol-DiHEd13O.js → bridge-pool-patrol-BDohuMRt.js} +2 -2
- package/server/{briefing-freshness-CDJcmHHZ.js → briefing-freshness-ENa_hW_V.js} +2 -2
- package/server/build-info-Dx2qrVhb.js +2 -0
- package/server/{build-info-DTX8JwVP.js → build-info-WuZT6xyi.js} +3 -3
- package/server/{checkpoint-manager-BlOOdzLF.js → checkpoint-manager-CSZ7aVQF.js} +26 -9
- package/server/{checkpoint-manager-CKg1tn34.js → checkpoint-manager-DXhGRvg4.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-BGfl0cHM.js → checkpoints-DUkUsPVS.js} +2 -2
- package/server/{checkpoints-DRALkfDS.js → checkpoints-tm_w6Y4V.js} +1 -1
- package/server/{claude-hooks-provision-B_tv3wzE.js → claude-hooks-provision-CTh9zxEi.js} +1 -1
- package/server/{claude-hooks-provision-BlGv6twJ.js → claude-hooks-provision-fRofvhTN.js} +2 -2
- package/server/{claude-permissions-aHgDcZi5.js → claude-permissions-DLrb9ovz.js} +18 -3
- package/server/{claude-settings-overlay-T2LWLteV.js → claude-settings-overlay-BYnXaTVc.js} +2 -2
- package/server/{claude-settings-overlay-CYOvFE3A.js → claude-settings-overlay-CMS5Jab5.js} +1 -1
- package/server/cli-BflmtEFM.js +2 -0
- package/server/{cli-Do8UpLoI.js → cli-CoQou1t_.js} +11 -11
- package/server/{cliproxy-CX6jHRDP.js → cliproxy-DXDQcR3I.js} +52 -17
- package/server/cliproxy-DdhFpcXU.js +3 -0
- package/server/{close-issue-J0_eWYT1.js → close-issue-CpQ0BWg-.js} +5 -5
- package/server/{closed-issue-reaper-bFppuk6F.js → closed-issue-reaper-CdcJRvUx.js} +13 -12
- package/server/{closed-issue-reaper-Cl2h9AfT.js → closed-issue-reaper-TymtZM37.js} +1 -1
- package/server/{codex-icapA4om.js → codex-BValsmtK.js} +1 -1
- package/server/{codex-OOea7lXs.js → codex-DYyZL8JD.js} +16 -10
- package/server/{compaction-continuation-D5voR1ME.js → compaction-continuation-CVjbdGKt.js} +3 -3
- package/server/{config-Cjleh3_U.js → config-CvKH7r7W.js} +1 -1
- package/server/{config-tucKBCCc.js → config-NxI9Yl2f.js} +2 -2
- package/server/{config-DC75T4Mr.js → config-_qaa1UXH.js} +2 -2
- package/server/{config-yaml-BwOEANMr.js → config-yaml-D60AnTIu.js} +55 -15
- package/server/{conflict-gate-DlpWCMd7.js → conflict-gate-0dD1kxjN.js} +1 -1
- package/server/{conflict-gate-D2L1kZeL.js → conflict-gate-hAUCL-un.js} +5 -5
- package/server/{context-layers-CSPGc2Hb.js → context-layers-CdpabJj0.js} +3 -3
- package/server/context-layers-Ds1MnEFI.js +4 -0
- package/server/{continue-U3Af0jUq.js → continue-CnvrUfxw.js} +3 -3
- package/server/{control-settings-5k6ixdFW.js → control-settings-Db0uXgVM.js} +310 -7
- package/server/{conversation-compaction-CSpVpxN6.js → conversation-compaction-B-1KETG9.js} +8 -8
- package/server/{conversation-compaction-Ciit9O6k.js → conversation-compaction-DzMXGRiJ.js} +1 -1
- package/server/{conversation-service-BxrB5lUT.js → conversation-service-BL-asWPX.js} +1 -1
- package/server/{conversation-service-BteE4ELK.js → conversation-service-BxIOd5ay.js} +21 -7
- package/server/conversations-CEMfwMt-.js +3 -0
- package/server/{conversations-DhwxsOru.js → conversations-nS6QgYpD.js} +12 -7
- package/server/cost-3FyqKK56.js +838 -0
- package/server/{cost-Bnf9NUC5.js → cost-Cctc-Q9M.js} +3 -3
- package/server/{cost-CQKI6OCu.js → cost-DTuIRE4y.js} +2 -2
- package/server/{cost-sync-B-ADeXKY.js → cost-sync-DfmvLT9L.js} +3 -3
- package/server/{dag-DI9LaK_q.js → dag-o-dUpw1L.js} +6 -19
- package/server/{dangerous-git-ops-akhA3iyF.js → dangerous-git-ops-BOtXCFkT.js} +1 -1
- package/server/dashboard-db-worker.js +61 -11
- package/server/{deacon-TPYssFYt.js → deacon-CsisLmPt.js} +1735 -172
- package/server/{deacon-canonical-state-DFYymrDw.js → deacon-canonical-state-DkdkQS5p.js} +3 -3
- package/server/deacon-e6py3jkM.js +4 -0
- package/server/{deacon-event-client-Te5v10-b.js → deacon-event-client-BCjHiGAY.js} +1 -1
- package/server/{deacon-event-client-BKOL4AcL.js → deacon-event-client-CMQswEHX.js} +2 -2
- package/server/{deacon-nudge-log-BtlTWgWu.js → deacon-nudge-log-pcliw8Dr.js} +1 -1
- package/server/{deacon-pending-lifecycle-DVHjOLje.js → deacon-pending-lifecycle-BzaE76Xo.js} +3 -3
- package/server/deacon.js +11 -11
- package/server/{dead-end-trip-P0IF1O0E.js → dead-end-trip-Bs3hxIn6.js} +3 -3
- package/server/dead-end-trip-DUbiRMtT.js +2 -0
- package/server/delivery-DhZGRShH.js +3 -0
- package/server/{deploy-patrol-BXjlvoV3.js → deploy-patrol-B8sKkA8h.js} +8 -8
- package/server/deploy-queue--smqHLhe.js +2 -0
- package/server/{deploy-queue-o7shYg1j.js → deploy-queue-CCGWXFkp.js} +2 -2
- package/server/{deploy-window-CNT6fOff.js → deploy-window-YuJewzmC.js} +4 -4
- package/server/{deploy-window-BMk5_oX6.js → deploy-window-hgsvZ3UZ.js} +1 -1
- package/server/{dev-supervisor-SR1CLOAK.js → dev-supervisor-4SBloJHV.js} +2 -2
- package/server/{devcontainer-renderer-enMmNDFa.js → devcontainer-renderer-BiJhwFNi.js} +3 -3
- package/server/{dist-CPTO_zMR.js → dist-CoR2sivG.js} +1 -1
- package/server/dist-FHv1s5ez.js +3 -0
- package/server/{docker-B7qUZptz.js → docker-CWO7dcIP.js} +3 -3
- package/server/{docker-KR3zSFKY.js → docker-DQzyMXkd.js} +1 -1
- package/server/{dod-gK835UMf.js → dod-BAk5arLF.js} +1 -1
- package/server/{done-preflight-CksRvh49.js → done-preflight-CGFA0M1b.js} +1 -1
- package/server/{done-preflight-Bk8aExAL.js → done-preflight-Cx9JGznT.js} +5 -5
- package/server/{driver-CmsY2RLl.js → driver-BtcFz-qu.js} +14 -3
- package/server/durable-review-pipeline-BOEZ0chh.js +3 -0
- package/server/{durable-review-pipeline-DgYHucN2.js → durable-review-pipeline-Djx_lvFd.js} +11 -2
- package/server/{ensure-devcontainer-BQ4YizSH.js → ensure-devcontainer-Dk6ZMOUC.js} +1 -1
- package/server/{ensure-devcontainer-ojerEqQg.js → ensure-devcontainer-DzYBBwnM.js} +4 -4
- package/server/{esm-shims-1htPASWs.js → esm-shims-deFq5Hhl.js} +1 -1
- package/server/{event-store-BgEjNsvk.js → event-store-C50Qt-f1.js} +1 -1
- package/server/{event-store-D7qcJXuZ.js → event-store-DTns2XZP.js} +5 -5
- package/server/{event-store-provider-BKvk2rDj.js → event-store-provider-Bu1Qrg6v.js} +1 -1
- package/server/{events-BIKGJZOT.js → events-B6xW8Cpm.js} +3 -3
- package/server/{dist-src-BM9eudEd.js → factory-CWVKwKFE.js} +714 -2
- package/server/{feature-registry-storage-ewNSIVsQ.js → feature-registry-storage-vaxRN3WO.js} +3 -3
- package/server/{features-CGopJXdU.js → features-DXWwktJB.js} +2 -2
- package/server/{feedback-stuck-retirement-B8-fX7NA.js → feedback-stuck-retirement-CXAYe2rU.js} +2 -2
- package/server/{feedback-target-CkyLYohm.js → feedback-target-DSVpi0gT.js} +1 -1
- package/server/{feedback-target-Ci6N5p4G.js → feedback-target-yPD_wclF.js} +10 -10
- package/server/{feedback-writer-DfuVjvH0.js → feedback-writer-BzN4qvaP.js} +1 -1
- package/server/{feedback-writer-D4ULO4qG.js → feedback-writer-Ds1Wjsz4.js} +5 -5
- package/server/{flywheel-DXI_WITn.js → flywheel-BCZS-FlW.js} +1 -1
- package/server/{flywheel-BwYPDlhK.js → flywheel-CC4gE_rx.js} +15 -15
- package/server/{flywheel-C7yek87O.js → flywheel-DWKd7bMc.js} +79 -29
- package/server/{flywheel-merge-order-C5m5bYBc.js → flywheel-merge-order-DDT3i57u.js} +1 -1
- package/server/{flywheel-merge-order-CXfU4M6l.js → flywheel-merge-order-DJwH2KpL.js} +17 -15
- package/server/forge-4VVCRcF7.js +2 -0
- package/server/{forge-DYX9sKzG.js → forge-CHADjOFs.js} +2 -2
- package/server/{from-DAdMxC29.js → from-C3dzmjSO.js} +1 -1
- package/server/{fs-lock-cw25uO_E.js → fs-lock-DQ_gUxfq.js} +2 -2
- package/server/{fts-operations-D_rzLxX5.js → fts-operations-asZo2fh1.js} +3 -3
- package/server/git-info-DMOSfJ9I.js +148 -0
- package/server/{git-utils-Y0zG25ez.js → git-utils-BAMwn9Nf.js} +1 -1
- package/server/{git-utils-DV4B9TRl.js → git-utils-BdHk8y7g.js} +4 -4
- package/server/{github-app-C33lDk9Z.js → github-app-BWziYCf3.js} +1 -1
- package/server/{github-app-4UX8VIr8.js → github-app-BlMSzSTw.js} +2 -2
- package/server/{github-client-nPj5ckZO.js → github-client-OK24qpol.js} +1 -1
- package/server/{github-client-DkJVR908.js → github-client-w6j5nVlz.js} +3 -3
- package/server/{github-pr-lookup-C9Vokb0W.js → github-pr-lookup-bGcsEvLE.js} +2 -2
- package/server/{harness-binary-BgXYDo2Z.js → harness-binary-DChiynaB.js} +2 -2
- package/server/{harness-resolve-1NZcVx7n.js → harness-resolve-BplBEbwn.js} +4 -4
- package/server/{health-events-jMfxrElt.js → health-events-BTqsmunw.js} +1 -1
- package/server/{health-events-DlX_FVAB.js → health-events-Bk3LjaJ9.js} +2 -2
- package/server/{hooks-NQ19vvlB.js → hooks-DJR1yR9w.js} +2 -2
- package/server/{hooks-W3REcb3h.js → hooks-EndRNrx9.js} +1 -1
- package/server/{hume-BFkid2PO.js → hume-1FJmNDTq.js} +2 -2
- package/server/hume-gXLmRhmN.js +3 -0
- package/server/{identity-Bwh6VGeL.js → identity-C3s8lyp0.js} +3 -3
- package/server/{idle-stack-reaper-CHtCNpvd.js → idle-stack-reaper-CBelVOE3.js} +1 -1
- package/server/{idle-stack-reaper-BeU_KxWx.js → idle-stack-reaper-DtoI4al6.js} +4 -4
- package/server/{in-flight-guard-pcwXKLGz.js → in-flight-guard-B7khcBdQ.js} +1 -1
- package/server/{infra-KTp9KV9u.js → infra-CJRi_5Wu.js} +36 -7
- package/server/{injection-67YyU6SC.js → injection-ADWQ3D0s.js} +8 -8
- package/server/{injection-BxbZKPDh.js → injection-BWsgHvrL.js} +1 -1
- package/server/{inspect-agent-VHSihlb7.js → inspect-agent-CCfNJjKr.js} +12 -12
- package/server/inspect-agent-Dhp3hCGp.js +2 -0
- package/server/{internal-token-B-z-sGBH.js → internal-token-BCTEqUCX.js} +1 -1
- package/server/{internal-token-zY75jrRJ.js → internal-token-BeIWG_kT.js} +2 -2
- package/server/{io-DfvO2xyh.js → io-BCtZoXHo.js} +5 -5
- package/server/{issue-closed-dvEWKO7Q.js → issue-closed-CiYAa6bX.js} +7 -7
- package/server/{issue-lifecycle-3N8XF7lP.js → issue-lifecycle-BETNVVLq.js} +206 -29
- package/server/{issue-lifecycle-BI6jAfp8.js → issue-lifecycle-DaKN57sx.js} +1 -1
- package/server/{issue-service-singleton-CL6hESX2.js → issue-service-singleton-1Q0ER8Yc.js} +1 -1
- package/server/{issue-service-singleton-BN_2MXp4.js → issue-service-singleton-C_sZ0HjP.js} +124 -11
- package/server/issue-title-fallback-B91iD66g.js +120 -0
- package/server/{issues-CkvUoAnq.js → issues-RGHQUKhB.js} +2 -2
- package/server/{jsonl-parser-CrEb2PWr.js → jsonl-parser-Dfs1dlYE.js} +3 -3
- package/server/jsonl-resolver-bFtftCDd.js +324 -0
- package/server/{kimi-code-DoMoGqIu.js → kimi-code-BxkDgaj4.js} +1 -1
- package/server/{kimi-code-C26gmGxM.js → kimi-code-CNYRA8Dd.js} +14 -12
- package/server/{kimi-parser-Dmhy3UlR.js → kimi-parser-OcWwmOqF.js} +2 -2
- package/server/{label-cleanup-X2lWfghH.js → label-cleanup-CefxK9tL.js} +3 -3
- package/server/{lifecycle-B0rL38D3.js → lifecycle-DDZ7w-BY.js} +6 -6
- package/server/{lifecycle-Bg44O-9x.js → lifecycle-DVXyUil2.js} +2 -2
- package/server/{lifecycle-io-DQDU0apV.js → lifecycle-io-D1oBiMce.js} +1 -1
- package/server/{lifecycle-io-CCBpRv5m.js → lifecycle-io-D7N0vQNj.js} +5 -5
- package/server/{linear-client-B0cIkTs4.js → linear-client-DUN7zCeb.js} +3 -3
- package/server/{linear-client-6V2E-DSa.js → linear-client-TL32snOy.js} +1 -1
- package/server/{linear-mcp-auth-LCo9AWUd.js → linear-mcp-auth-CtRKSHy5.js} +1 -1
- package/server/{linear-mcp-auth-Dsu9Io9r.js → linear-mcp-auth-bB0CPyjh.js} +5 -5
- package/server/memory-fts-worker.js +1 -1
- package/server/{memory-governor-A4O6vI9d.js → memory-governor-Cvv_9K0M.js} +88 -22
- package/server/{memory-pressure-patrol-BWlWywmA.js → memory-pressure-patrol-C6DJJQRA.js} +38 -14
- package/server/{merge-BGWcBxku.js → merge-DOCR6pHi.js} +1 -1
- package/server/{merge-vz80RvSE.js → merge-FTk4LsnM.js} +3 -3
- package/server/{merge-agent-GWhmnxFk.js → merge-agent-C-dsN9se.js} +37 -33
- package/server/{merge-agent-BRSz26Oh.js → merge-agent-D-4_iQgy.js} +2 -2
- package/server/{merge-batch-CFMEtTxv.js → merge-batch-BJjzUUL7.js} +1 -1
- package/server/{merge-completeness-CP347umA.js → merge-completeness-BOtBUwTU.js} +4 -4
- package/server/{merge-completeness-7ajHAIR-.js → merge-completeness-CoLJxfUY.js} +1 -1
- package/server/merge-eligibility-C4rTS97F.js +3 -0
- package/server/merge-eligibility-D7wRnJbj.js +51 -0
- package/server/merge-ops-Cf02szJ5.js +2 -0
- package/server/merge-rebase-Bj7eJAG4.js +2 -0
- package/server/{merge-rebase-C5htyEEH.js → merge-rebase-KBw4rdh3.js} +2 -2
- package/server/{merge-set-DsGW8fmc.js → merge-set-CVfEM57p.js} +1 -1
- package/server/{merge-set-eiE2nC6C.js → merge-set-CyW-xSn4.js} +4 -4
- package/server/{merge-sync-CM2-myXu.js → merge-sync-CYGsJy0u.js} +1 -1
- package/server/{merge-sync-Ct0-cxMX.js → merge-sync-YLvOPAry.js} +2 -2
- package/server/{merge-train-BOu3fN7O.js → merge-train-VxLn8Ms4.js} +4 -4
- package/server/{merge-train-deps-LXHGK61n.js → merge-train-deps-D0y4hBB9.js} +4 -4
- package/server/{merge-verification-BRp08IzI.js → merge-verification-BfJRNMiD.js} +6 -6
- package/server/{merged-docker-cleanup-worker-CwldDjHV.js → merged-docker-cleanup-worker-Bh5fKG_b.js} +4 -4
- package/server/{merged-docker-cleanup-worker-C8eGn78a.js → merged-docker-cleanup-worker-Ci9oeFAe.js} +1 -1
- package/server/messaging-Dfbhgjd6.js +3 -0
- package/server/{multipart-parser-OAuW7824.js → multipart-parser-BYwfKOVU.js} +2 -2
- package/server/{no-resume-mode-MWI6pnrK.js → no-resume-mode-DjMQRkId.js} +1 -1
- package/server/node_modules/.package-lock.json +24 -24
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/AGENTS.md +14 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/CLAUDE.md +14 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +10 -3
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/package.json +2 -2
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/10_basics.ts +175 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/index.md +6 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/10_basics.ts +3 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/20_testing.ts +100 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/api/Users.ts +30 -14
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/domain/User.ts +15 -6
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +11 -10
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +41 -32
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users.ts +141 -20
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/70_cli/10_basics.ts +31 -5
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +10 -9
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js +12 -9
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js +4 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js +10 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts +4 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts.map +1 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js +10 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js.map +1 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +7 -7
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +16 -11
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeClusterSocket.ts +15 -12
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocket.ts +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocketServer.ts +4 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeStream.ts +10 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/internal/nodeChildProcessSpawner.ts +16 -0
- package/server/node_modules/@types/node/README.md +1 -1
- package/server/node_modules/@types/node/buffer.buffer.d.ts +5 -5
- package/server/node_modules/@types/node/crypto.d.ts +2 -2
- package/server/node_modules/@types/node/http.d.ts +16 -0
- package/server/node_modules/@types/node/http2.d.ts +10 -2
- package/server/node_modules/@types/node/package.json +2 -2
- package/server/node_modules/@types/node/process.d.ts +52 -0
- package/server/node_modules/@types/node/quic.d.ts +210 -28
- package/server/node_modules/@types/node/sqlite.d.ts +6 -2
- package/server/node_modules/@types/node/test.d.ts +36 -0
- package/server/node_modules/ansi-regex/index.js +3 -2
- package/server/node_modules/ansi-regex/package.json +1 -1
- package/server/node_modules/effect/node_modules/uuid/README.md +19 -19
- package/server/node_modules/effect/node_modules/uuid/dist/v1.js +7 -3
- package/server/node_modules/effect/node_modules/uuid/dist/v7.js +5 -2
- package/server/node_modules/effect/node_modules/uuid/dist-node/v1.js +7 -3
- package/server/node_modules/effect/node_modules/uuid/dist-node/v7.js +5 -2
- package/server/node_modules/effect/node_modules/uuid/package.json +4 -3
- package/server/node_modules/gaxios/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/server/node_modules/gaxios/build/esm/tsconfig.tsbuildinfo +1 -1
- package/server/node_modules/gaxios/package.json +3 -3
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs +11 -5
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.js +11 -5
- package/server/node_modules/msgpackr/dist/index.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/node.cjs +11 -5
- package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/test.js +11 -5
- package/server/node_modules/msgpackr/dist/test.js.map +1 -1
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +11 -5
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/package.json +1 -1
- package/server/node_modules/msgpackr/unpack.js +11 -5
- package/server/node_modules/picomatch/lib/parse.js +10 -1
- package/server/node_modules/picomatch/lib/scan.js +30 -18
- package/server/node_modules/picomatch/package.json +1 -1
- package/server/{orphan-proposed-reconciler-BAE5AZ_e.js → orphan-proposed-reconciler-CnP0K2v3.js} +2 -2
- package/server/{orphan-proposed-reconciler-cV3URUqk.js → orphan-proposed-reconciler-nFUlquZt.js} +24 -23
- package/server/package-lock.json +25 -25
- package/server/package.json +1 -1
- package/server/{pan-dir-DDd91kMb.js → pan-dir-B4NfzOf3.js} +5 -5
- package/server/{deacon-merge-BOGFEV8_.js → parked-residue-8WbU0y1z.js} +188 -69
- package/server/{paths-CRLnDgcI.js → paths-rETQhTF2.js} +2 -2
- package/server/{pending-lifecycle-claim-CYgMiDAP.js → pending-lifecycle-claim-yAwDuGS4.js} +2 -2
- package/server/{pickup-BjJsSX12.js → pickup-Dle6k9Xt.js} +1 -1
- package/server/{pipeline-agent-reader-BLc43dVJ.js → pipeline-agent-reader-CeWhQzXC.js} +5 -5
- package/server/{pipeline-membership-BHZp_ShY.js → pipeline-membership-BV4hdkHm.js} +1 -1
- package/server/{pipeline-membership-5qlRz5Qg.js → pipeline-membership-C9ykcjsn.js} +1 -1
- package/server/{pipeline-membership-gather-CGFY1v-y.js → pipeline-membership-gather-Ba0wJNCR.js} +17 -12
- package/server/{pipeline-membership-gather-WhRc1yke.js → pipeline-membership-gather-C9E22B2W.js} +1 -1
- package/server/{pipeline-notifier-C4fZ2ito.js → pipeline-notifier-B5DPXvnr.js} +1 -1
- package/server/{pipeline-notifier-BmsLWM_2.js → pipeline-notifier-p190L97e.js} +2 -2
- package/server/{post-merge-lifecycle-worker-KK1RTKRE.js → post-merge-lifecycle-worker-OQoK8Ckg.js} +3 -3
- package/server/{post-merge-state-_Lj3LDLh.js → post-merge-state-DFaf7OI1.js} +4 -4
- package/server/prd-locations-F2oLSAhy.js +124 -0
- package/server/{project-pipelines-CCkebHOu.js → project-pipelines-CUsa6U59.js} +2 -2
- package/server/project-repos-BVdi9-ch.js +3 -0
- package/server/{project-repos-B4MK48j4.js → project-repos-CsfvLtmr.js} +29 -3
- package/server/project-resource-refresh-queue-BehrH4Ai.js +865 -0
- package/server/project-resource-refresh-queue-D2110Guc.js +2 -0
- package/server/{projects-DvPEAP18.js → projects-BMuEf14J.js} +1 -1
- package/server/{prompts-BiS5I2tZ.js → prompts-CKpDt8Jn.js} +2 -2
- package/server/providers-Buv2wmFU.js +3 -0
- package/server/{providers-DrfK0Ip8.js → providers-CxPKmyif.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-GtVe_o56.js → chunk-BO2N2NFS-DZOQVqV1.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-BvhcYYHc.js → diagram-OG6HWLK6-oKeXcbO1.js} +1 -1
- package/server/public/assets/{dist-CSmUXazd.js → dist-2qPmeRzT.js} +3 -3
- package/server/public/assets/{dist-D0ryefak.js → dist-ClBlE-Nm.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-BXA51DzM.js → ganttDiagram-6RSMTGT7-BwdG9fQv.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-mlV4EpWt.js → highlighted-body-OFNGDK62-BzGNdskQ.js} +1 -1
- package/server/public/assets/index-CdPveU3M.css +1 -0
- package/server/public/assets/index-Cg6tdZoY.js +860 -0
- package/server/public/assets/{linear-BPE7oswm.js → linear-DpEt1TJb.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-6KBD_3T_.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BguGGV3S.js → pieDiagram-4H26LBE5-9BpM4oRJ.js} +1 -1
- package/server/public/assets/{prod-aKDYUrXQ.js → prod-CzJiNNEG.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bx3i4B6H.js → quadrantDiagram-W4KKPZXB-BXWVAoZx.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-B5vuLjA4.js → sankeyDiagram-5OEKKPKP-5oxodGEw.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-HPlpkqsN.js → xychartDiagram-2RQKCTM6-BChDrHxZ.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/pull-requests-CmlandI7.js +2 -0
- package/server/{pull-requests-BcHIsFJv.js → pull-requests-T0OV0Vn4.js} +3 -3
- package/server/{rally-B1OMtzch.js → rally-CUqj2oIN.js} +3 -3
- package/server/rally-DYIn9R2U.js +3 -0
- package/server/{rally-api-ShZ4kvn0.js → rally-api-BFPb2oSq.js} +2 -2
- package/server/{rally-api-u_vkr5c_.js → rally-api-BoucQG1u.js} +1 -1
- package/server/{rally-client-D6Feq1Ka.js → rally-client-16iObny7.js} +5 -5
- package/server/{rally-client-DgZvUZqX.js → rally-client-CsqLjLLa.js} +1 -1
- package/server/{reap-terminal-sessions-CRfiXLY0.js → reap-terminal-sessions-BaDSNR-k.js} +2 -2
- package/server/{reap-terminal-sessions-D7f3zSE9.js → reap-terminal-sessions-DgEIKMhH.js} +2 -2
- package/server/{rebuild-stack-CCwKHZb6.js → rebuild-stack-BcBVFJp3.js} +2 -2
- package/server/{rebuild-stack-DKxOnkpE.js → rebuild-stack-CyXMrj6K.js} +7 -7
- package/server/reconciler-caYiRnPy.js +657 -0
- package/server/{reconstruct-cache-BP8UIKt7.js → reconstruct-cache-3JzPOune.js} +7 -7
- package/server/{record-By-wp6pg.js → record-DYOg97Iv.js} +1 -1
- package/server/{record-update-D23jPU6b.js → record-update-BPqpBu3O.js} +9 -7
- package/server/{record-update-ByGtIlUK.js → record-update-CDPEX7BH.js} +1 -1
- package/server/{recovery-trip-C4dTl8DO.js → recovery-trip-CpfW6LCJ.js} +43 -10
- package/server/{recovery-trip-qloOYOFz.js → recovery-trip-xqKC07Gy.js} +1 -1
- package/server/{release-engine-Crc0Tjx-.js → release-engine-C_OOhCaK.js} +5 -5
- package/server/{release-set-DDXwbIK7.js → release-set-DOIDz2vw.js} +3 -3
- package/server/{remote-oEMfXlwT.js → remote-BTh-sjpX.js} +3 -3
- package/server/{remote-agents-Bgtc2nOO.js → remote-agents-DbbN7vSm.js} +6 -6
- package/server/{remote-agents-DQVGZVQ9.js → remote-agents-MuXx2gWm.js} +1 -1
- package/server/{remote-completion-DxUJ5HKR.js → remote-completion-LcWCpAm2.js} +13 -13
- package/server/{remote-CBpLi4Yy.js → remote-xY0B43Ho.js} +3 -3
- package/server/{resolver-CuAULbLs.js → resolver-C2QKOf09.js} +2 -2
- package/server/{resolver-C8rooxoz.js → resolver-D4nsxfGo.js} +31 -8
- package/server/resume-ByUrJUNX.js +3 -0
- package/server/{review-agent-7C2w5CzU.js → review-agent-BRBTm1qE.js} +43 -55
- package/server/review-agent-Caodi0PX.js +3 -0
- package/server/{review-artifacts-BJeEfm2r.js → review-artifacts-DgaDlbO4.js} +6 -6
- package/server/{review-convoy-liveness-DfF9eXjI.js → review-convoy-liveness-BBvyuRLC.js} +20 -11
- package/server/{review-run-recovery-ZjuDTNhZ.js → review-run-recovery-DCzWMMvE.js} +1 -1
- package/server/{review-run-recovery-7BKt2Es0.js → review-run-recovery-THHMKlXJ.js} +3 -3
- package/server/{review-status-CUnjjOUu.js → review-status-Bge_3XTR.js} +1 -1
- package/server/{review-status-DBnR5t4z.js → review-status-DpniqzPT.js} +113 -44
- package/server/{review-status-emit-Cg4tOb8U.js → review-status-emit-D7sM720S.js} +3 -3
- package/server/{review-status-enrichment-D-rQshu6.js → review-status-enrichment-PDI4-faj.js} +3 -3
- package/server/{review-status-source-DSn0glLa.js → review-status-source-D2PCWS6E.js} +1 -1
- package/server/{review-status-source-Ct912fv_.js → review-status-source-Jq0BXmn3.js} +1 -1
- package/server/{review-status-sync-B7V_Gg51.js → review-status-sync-C6ZKTI8f.js} +11 -8
- package/server/{review-status-sync-YthpOH_q.js → review-status-sync-CvpHWyvR.js} +1 -1
- package/server/{review-verdict-feedback-C-dBon_-.js → review-verdict-feedback-B2ojHFH5.js} +8 -8
- package/server/{review-verdict-feedback-DqXTuJk8.js → review-verdict-feedback-tyMoLT2L.js} +1 -1
- package/server/{review-verdict-writer-CKaJWp75.js → review-verdict-writer-Cy_1pnIj.js} +7 -7
- package/server/{review-verdict-writer-jldSh3Bm.js → review-verdict-writer-DjrJ64eS.js} +1 -1
- package/server/{rollup-DZwH4CLs.js → rollup-Cp0KEoOu.js} +1 -1
- package/server/{rollup-QCwYcBdP.js → rollup-DU3xBQu2.js} +8 -8
- package/server/{scanner-2aHeLC3W.js → scanner-BFKG3Gxv.js} +8 -8
- package/server/{search-DwHYaj66.js → search-DhtKwbBC.js} +2 -2
- package/server/{secret-redaction-B5G1xZ3k.js → secret-redaction-DLZ-VqHq.js} +1 -1
- package/server/{sequence-io-POKWdusG.js → sequence-io-C-Q19Jez.js} +4 -4
- package/server/{sequencer-agent-DS00KHVm.js → sequencer-agent-eN2P2lDz.js} +6 -6
- package/server/server.js +1499 -1350
- package/server/{service-BLb_CyPL.js → service-CThO0Sar.js} +80 -774
- package/server/{session-fork-DcTzVwex.js → session-fork-ZYTHtpBh.js} +2 -2
- package/server/settings-ByDRfuuE.js +2 -0
- package/server/{settings-Clw8UVNs.js → settings-CTywpFw5.js} +2 -2
- package/server/{settings-B9-H2K_E.js → settings-nAT-eK56.js} +3 -3
- package/server/{shadow-engineering-C6oO_PiR.js → shadow-engineering-BHZKPJhq.js} +3 -3
- package/server/{shadow-state-CEGrrECe.js → shadow-state-BTLi4Axs.js} +2 -2
- package/server/{shadow-state-e7250VUx.js → shadow-state-CZ_LnPsi.js} +1 -1
- package/server/{shadow-utils-xFk2Wusb.js → shadow-utils-CPLlPHdn.js} +2 -2
- package/server/{ship-log-7BnQHuKU.js → ship-log-D-CphNZx.js} +1 -1
- package/server/{ship-record-CwUX6Afo.js → ship-record-BaBla0l_.js} +7 -7
- package/server/{ship-record-BgUPnpT0.js → ship-record-BlvX8-xv.js} +1 -1
- package/server/{ship-status-Ce3_3edi.js → ship-status-rQbPQBsF.js} +2 -2
- package/server/{smart-compaction-BmfIi3oL.js → smart-compaction-CUXn8mfX.js} +1 -1
- package/server/{smart-compaction-Dy0gw1VH.js → smart-compaction-D1CNGdZx.js} +7 -7
- package/server/{spawn-planning-session-nH3b4Drz.js → spawn-planning-session-DCmO6COk.js} +19 -19
- package/server/{spawn-planning-session-CfhxRJoY.js → spawn-planning-session-DfEWyrVV.js} +2 -2
- package/server/{specialist-completion-CC1XJbTx.js → specialist-completion-BMv3K54P.js} +1 -1
- package/server/{specialist-context-cHwpcXSh.js → specialist-context-C1-CfYQb.js} +5 -5
- package/server/{specialist-handoff-logger-GqnGSYoJ.js → specialist-handoff-logger-BDKoz5Z9.js} +2 -2
- package/server/{specialist-logs-5OTnrV91.js → specialist-logs-BJQFkpdG.js} +3 -3
- package/server/specialists-CYt1U3Zm.js +4 -0
- package/server/{specialists-8LcQi9Np.js → specialists-D6MUU31Q.js} +21 -272
- package/server/{specialists-DocAK-7A.js → specialists-DhS79T9v.js} +369 -691
- package/server/{specialists-xXcJHAyg.js → specialists-Dx0zRTxX.js} +1 -1
- package/server/specialists-registry-BRLCi61y.js +3 -0
- package/server/specialists-registry-Bng0OFGH.js +277 -0
- package/server/specs-oRGyfz6C.js +3 -0
- package/server/{src-C2TAxwki.js → src-C7gGe4KU.js} +6 -6
- package/server/{src-DudQNYVw.js → src-CdwN6WY6.js} +344 -7
- package/server/{src-DUVvEA8Q.js → src-DMosbuSJ.js} +3 -3
- package/server/{stack-health-DKT4ySnA.js → stack-health-BKfNaqMm.js} +3 -3
- package/server/{stack-health-CbyiYS9H.js → stack-health-Bz711z1Y.js} +1 -1
- package/server/{stale-task-claims-PzFee70R.js → stale-task-claims-DMRLb5R2.js} +5 -5
- package/server/{staleness-D8UTEXV5.js → staleness-CxZaIhrn.js} +1 -1
- package/server/{staleness-BjOAq9-d.js → staleness-r_dkMyMG.js} +1 -1
- package/server/{stall-sweeper-DOyIfeLR.js → stall-sweeper-CBWqSWV2.js} +8 -8
- package/server/{state-home-DhAZlk5k.js → state-home-DhsMqg8W.js} +2 -2
- package/server/{state-mapping-BVSs84bO.js → state-mapping-D2yC81Vy.js} +1 -1
- package/server/{state-migrate-CJKEwpB0.js → state-migrate-C2Ouyd6e.js} +6 -6
- package/server/{state-mirror-Do7pag7W.js → state-mirror-BPXciz84.js} +3 -3
- package/server/stuck-remediation-DALieAkx.js +2 -0
- package/server/stuck-remediation-kta3KN7c.js +774 -0
- package/server/{substrate-bug-weights-service-BTNjHBnl.js → substrate-bug-weights-service-D_ICP7TI.js} +3 -3
- package/server/{summary-fork-CvB7Oyq9.js → summary-fork-CojrFKb6.js} +2 -2
- package/server/{summary-fork-CZ88rhVx.js → summary-fork-DhhaFhxZ.js} +113 -30
- package/server/supervisor/{pane-composer-BaLLspSj.js → pane-composer-CoiVkGIt.js} +8 -1
- package/server/supervisor/{paths-D6XUcR_g.js → paths-DTGbtcaP.js} +8 -4
- package/server/supervisor/pty-supervisor.js +3 -3
- package/server/supervisor/{pty-token-DjjHxoCq.js → pty-token-GVqnvU3U.js} +2 -2
- package/server/supervisor-DSSWo4M2.js +2 -0
- package/server/{supervisor-D4v0WfiQ.js → supervisor-DqH-laVL.js} +4 -4
- package/server/{swarm-readiness-D8R-LWX5.js → swarm-readiness-LF8ZF_hc.js} +3 -3
- package/server/{synthesis-verdict-N5Z11pg7.js → synthesis-verdict-CGFF8uQI.js} +2 -2
- package/server/{synthesis-verdict-B6wvLGcA.js → synthesis-verdict-DSoOFUIV.js} +1 -1
- package/server/{system-prerequisites-BbGZ_WHF.js → system-prerequisites-Lsx0jUUV.js} +2 -2
- package/server/{teardown-workspace-CYend-KY.js → teardown-workspace-DMwomEG1.js} +16 -16
- package/server/{test-agent-queue-BUtWhNcc.js → test-agent-queue-Cu0D6BYe.js} +6 -6
- package/server/{test-verdict-BWm3hgDj.js → test-verdict-9mvl7pQn.js} +1 -1
- package/server/{test-verdict-BWtRmdiR.js → test-verdict-oNSv1rVr.js} +2 -2
- package/server/{tldr-daemon-CneJ24eL.js → tldr-daemon-CRSAkhBx.js} +1 -1
- package/server/{tldr-daemon-CMVBT4kT.js → tldr-daemon-McqCk2X7.js} +2 -2
- package/server/tmux-CYucGrTl.js +4 -0
- package/server/{tmux-BqXzRuaH.js → tmux-wnT_hg-s.js} +91 -19
- package/server/{token-CO3INKbh.js → token-BdfZLRg1.js} +2 -2
- package/server/{token-util-DyJJyX_B.js → token-util-Crcay9j_.js} +1 -1
- package/server/token-util-DfUS3Lpp.js +3 -0
- package/server/{tracker-config-DVzhaUxO.js → tracker-config-tfAOWgng.js} +2 -2
- package/server/{tracker-utils-xnVJVrrO.js → tracker-utils-Dbg_pVZg.js} +2 -2
- package/server/{traefik-connect-A5k54mCv.js → traefik-connect-DoQvQ6oJ.js} +1 -1
- package/server/{tunnel-DauSR-rs.js → tunnel-B1MNIgkL.js} +1 -1
- package/server/{tunnel-CwOnS-PB.js → tunnel-skW68j9B.js} +3 -3
- package/server/{typed-errors-B-gfU2RB.js → typed-errors-CZ3GFBvo.js} +1 -1
- package/server/{typed-errors-DzC4zXbI.js → typed-errors-DXqf3RnP.js} +1 -1
- package/server/{types-DjpLVpsj.js → types-PW4zkxCM.js} +1 -1
- package/server/{types-DbxY2QB6.js → types-pLpbsNto.js} +1 -1
- package/server/{uat-failure-feedback-BVqsWlrr.js → uat-failure-feedback-ly8ZwtfC.js} +5 -5
- package/server/{uat-promote-verification-DmG097QS.js → uat-promote-verification-BBaMwfdc.js} +5 -5
- package/server/{uat-train-DVUNW03P.js → uat-train-BBEiYSep.js} +0 -0
- package/server/{uat-train-COSy-vEX.js → uat-train-D7Ran2FB.js} +1 -1
- package/server/{validate-Dvv83iBx.js → validate-BYcBcBwg.js} +3 -3
- package/server/{validation-DlHafKzu.js → validation-BfG2jW5C.js} +9 -6
- package/server/{validation-BdCjzWLN.js → validation-nSrYiYvA.js} +1 -1
- package/server/{verification-artifact-CaSbxUVg.js → verification-artifact-Cmhgq4b_.js} +1 -1
- package/server/{verification-artifact-0Zku8N-W.js → verification-artifact-DglwaHke.js} +1 -1
- package/server/{verification-runner-DwP2fUEF.js → verification-runner-BEq5ZF-h.js} +53 -27
- package/server/{verification-runner-C6wdZda2.js → verification-runner-CFjAuv9u.js} +1 -1
- package/server/{vtt-parser-luerJpYT.js → vtt-parser-Va--tv27.js} +1 -1
- package/server/work-agent-prompt-BnhKNAg7.js +3 -0
- package/server/{work-agent-prompt--9AWNYwZ.js → work-agent-prompt-CaD2ue8m.js} +14 -14
- package/server/{work-agent-start-BNQO65W7.js → work-agent-start-0nJ-6UeA.js} +2 -2
- package/server/{work-agent-start-DkzseQFl.js → work-agent-start-D8NEN5KD.js} +1 -1
- package/server/workflows-BtHRlFIm.js +2 -0
- package/server/{workflows-BYwR2aIN.js → workflows-C7mxM1qc.js} +114 -41
- package/server/{workspace-iTnTycOB.js → workspace-BAhMgMaO.js} +3 -3
- package/server/{workspace-B-QJa3Ps.js → workspace-Dbqv9ehn.js} +1 -1
- package/server/{workspace-anchor-drift-CHiGg8iu.js → workspace-anchor-drift-B_3kyyxJ.js} +4 -4
- package/server/{workspace-anchor-drift-DTt6h2Em.js → workspace-anchor-drift-Bpa3xoni.js} +1 -1
- package/server/{workspace-config-D0CavVtz.js → workspace-config-D-bNq2CF.js} +1 -1
- package/server/{workspace-manager-5BKPV6SY.js → workspace-manager-BrbX90Rm.js} +1 -1
- package/server/{workspace-manager-W1OnbvU5.js → workspace-manager-CM8RCrSc.js} +17 -17
- package/server/{workspace-metadata-tbbevEmP.js → workspace-metadata-BEOwJSdK.js} +1 -1
- package/server/{workspace-metadata-dJhXvZGQ.js → workspace-metadata-Cu6yfxBS.js} +2 -2
- package/server/{workspaces-BlpbOPZ7.js → workspaces-C7LAuZfe.js} +140 -709
- package/sync-sources/dev-skills/pan-style-guide/SKILL.md +90 -15
- package/sync-sources/hooks/linear-mcp-auth-hook +6 -1
- package/sync-sources/rules/agent-message-delivery.md +21 -14
- package/sync-sources/rules/handoff-isolate-cwd.md +4 -4
- package/sync-sources/rules/pan-handoff-focus-limit.md +14 -5
- package/sync-sources/rules/ste-writing.md +17 -0
- package/sync-sources/rules/work-agents-via-pan.md +2 -1
- package/sync-sources/rules/writing-style.md +3 -2
- package/sync-sources/skills/{skill-creator → claude-skill-creator}/SKILL.md +1 -1
- package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/init_skill.py +1 -1
- package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/package_skill.py +1 -1
- package/sync-sources/skills/pan-gauntlet-loop/SKILL.md +230 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/PROMPT.template.md +92 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/REFERENCE-BAR.template.md +53 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/STYLE.template.md +41 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/gauntlet-index.html +237 -0
- package/sync-sources/skills/pan-gauntlet-loop/references/domains.md +106 -0
- package/sync-sources/skills/pan-handoff/SKILL.md +24 -6
- package/sync-sources/skills/pan-help/SKILL.md +1 -1
- package/sync-sources/skills/pan-peer-review/SKILL.md +3 -3
- package/sync-sources/skills/pan-restart/SKILL.md +6 -3
- package/sync-sources/skills/pan-start/SKILL.md +3 -0
- package/sync-sources/skills/pan-swarm/SKILL.md +32 -44
- package/sync-sources/skills/pan-sync/SKILL.md +1 -1
- package/server/activity-logger-BejO16Am.js +0 -3
- package/server/agent-state-DH_-Jkua.js +0 -3
- package/server/agents-megfmQHM.js +0 -3
- package/server/archive-planning-C-H9cM_J.js +0 -2
- package/server/build-info-PQlh_Rhb.js +0 -2
- package/server/cli-TaZspPHS.js +0 -2
- package/server/cliproxy-36ncAXlu.js +0 -3
- package/server/context-layers-CF6zHws4.js +0 -4
- package/server/conversations-AnGJ5rtX.js +0 -3
- package/server/deacon-BEH-IY0v.js +0 -5
- package/server/deacon-swarm-BHX-kR1b.js +0 -2
- package/server/deacon-swarm-BiLfNm_v.js +0 -1522
- package/server/dead-end-trip-BWpDg1Qd.js +0 -2
- package/server/delivery-cJM6zRjJ.js +0 -3
- package/server/deploy-queue-CmVBZEja.js +0 -2
- package/server/dist-VKBfkdi7.js +0 -3
- package/server/durable-review-pipeline-DgcVCYDL.js +0 -3
- package/server/factory-D4V2wd_V.js +0 -717
- package/server/forge-CrP1L3i6.js +0 -2
- package/server/hume-1ubD_6O7.js +0 -3
- package/server/inspect-agent-CfxERkNt.js +0 -2
- package/server/merge-ops-DtHx17Vd.js +0 -2
- package/server/merge-rebase-BvB4UuNS.js +0 -2
- package/server/project-repos-BJiShUsN.js +0 -3
- package/server/providers-CStNGwze.js +0 -3
- package/server/public/assets/index-BFEwfmqX.js +0 -860
- package/server/public/assets/index-_USwyTAT.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-Dsln95SK.js +0 -1
- package/server/pull-requests-C1Cqp2yo.js +0 -2
- package/server/rally-CjayjUIl.js +0 -3
- package/server/resume-D7JuMCRQ.js +0 -3
- package/server/review-agent-BUNTVJK2.js +0 -2
- package/server/settings-DBWB1gsG.js +0 -2
- package/server/specialists-D8gsOCwh.js +0 -3
- package/server/specs-BqkrRnU9.js +0 -3
- package/server/stuck-remediation-Di5JYkoo.js +0 -1164
- package/server/stuck-remediation-TNM1VhZb.js +0 -2
- package/server/supervisor-DX8VsPnb.js +0 -2
- package/server/tmux-CqNapnrr.js +0 -4
- package/server/token-util-Bu8bPF9f.js +0 -3
- package/server/workflows-Cf4LAnhg.js +0 -2
|
@@ -1,55 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { h as loadConfigSync$1, p as init_config } from "./config-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { c as
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { a as
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import { n as
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import { t as
|
|
43
|
-
import {
|
|
44
|
-
import { r as
|
|
45
|
-
import { r as
|
|
46
|
-
import {
|
|
47
|
-
import { t as
|
|
48
|
-
import { t as init_rebuild_stack } from "./rebuild-stack-DKxOnkpE.js";
|
|
1
|
+
import { $r as GitError, Ai as encodeClaudeProjectDir, Gn as extractNumberSync, Kn as extractPrefixSync, Mt as init_state_plane, On as resolveProjectFromIssueSync, Or as resolveModel, Pt as isOverdeckOwnedOnlyStatus, Qr as FsError, Ri as getOverdeckHome, Yn as parseIssueIdSync, Zn as resolveIssueIdSync, Zt as extractTeamPrefix, fn as init_projects, li as init_errors, on as getProjectSync, qn as init_issue_id, t as init_config_yaml, tn as findProjectByTeamSync, vn as listProjectsSync, zi as init_paths } from "./config-yaml-D60AnTIu.js";
|
|
2
|
+
import { St as httpHandler, at as isInternalAgentRequest, ht as rejectUnsafeDashboardMutationRequest, lt as spawnPanCli, n as _serverManagedMerges, ot as resolveRequestedStartedBy, pt as rejectUnauthorizedDashboardRequest, st as getWorkAgentLifecycleStateSync, vt as getHeaderFromMap, wt as jsonResponse } from "./specialists-DhS79T9v.js";
|
|
3
|
+
import { h as loadConfigSync$1, p as init_config } from "./config-NxI9Yl2f.js";
|
|
4
|
+
import { l as init_activity_logger, o as emitActivityEntrySync } from "./activity-logger-SlTXYCVf.js";
|
|
5
|
+
import { C as init_tmux, U as sessionExists, dt as init_child_env, j as listSessionNames, r as capturePane, ut as buildChildEnvWithoutTmuxSync } from "./tmux-wnT_hg-s.js";
|
|
6
|
+
import { d as resolveIssueWorkspaceSyncTarget, o as init_resolver } from "./resolver-C2QKOf09.js";
|
|
7
|
+
import { a as init_event_store, n as getEventStore } from "./event-store-DTns2XZP.js";
|
|
8
|
+
import { g as findPositionInQueueSync, h as computeQueuePositionFromStatusSync, i as EventStoreService } from "./issue-lifecycle-BETNVVLq.js";
|
|
9
|
+
import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-DTuIRE4y.js";
|
|
10
|
+
import { i as CostWriter, t as CostDoorLive } from "./cost-3FyqKK56.js";
|
|
11
|
+
import { A as saveAgentStateSync, Ar as transitionIssueToInReview, K as saveAgentRuntimeState, Ut as messageAgent, W as getAgentRuntimeStateSync, _ as init_agent_state, d as decideResumeGate, g as getAgentStateSync, m as getAgentState, on as spawnAgent, p as getAgentResumeGateBlockReason, q as init_agents, u as clearYieldForResumeSync, vn as listRunningAgents } from "./agent-state-FABw8neJ.js";
|
|
12
|
+
import { o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-BeIWG_kT.js";
|
|
13
|
+
import { D as normalizeModelOverrideSync, E as init_model_validation } from "./auto-spawn-consent-BesWchEi.js";
|
|
14
|
+
import { c as init_stack_health, n as collectDockerContainerLifecycleSnapshot, o as getWorkspaceStackHealth, r as composeProjectNameForWorkspace } from "./stack-health-BKfNaqMm.js";
|
|
15
|
+
import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-pLpbsNto.js";
|
|
16
|
+
import { A as init_xbrief_index, M as readXBriefDocument, _ as serializeXBriefDocument, c as isPlanningComplete, d as readPlan, k as findXBriefByIssue, l as mergeRecordStatusOverrides, r as findPlan, s as init_io, v as XBRIEF_INSPECTION_POLICIES, y as init_types$1 } from "./io-BCtZoXHo.js";
|
|
17
|
+
import { c as init_dag, i as criticalPath, t as actionableDoc } from "./dag-o-dUpw1L.js";
|
|
18
|
+
import { d as resolveWorkspaceRepoRootsSync, i as init_project_repos } from "./project-repos-CsfvLtmr.js";
|
|
19
|
+
import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-tfAOWgng.js";
|
|
20
|
+
import { n as resolveGitHubIssueSync, t as init_tracker_utils } from "./tracker-utils-Dbg_pVZg.js";
|
|
21
|
+
import { r as notifyPipelineSync, t as init_pipeline_notifier } from "./pipeline-notifier-p190L97e.js";
|
|
22
|
+
import { a as getAllActiveQueues, c as init_merge_sync } from "./merge-sync-YLvOPAry.js";
|
|
23
|
+
import { S as setDeaconIgnored, _ as markWorkspaceStuck, d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, r as clearFeedbackDeliveryStuck, w as setReviewStatusSync, x as setAutoMerge, y as registerReviewVerdictFeedbackDelivery } from "./review-status-DpniqzPT.js";
|
|
24
|
+
import { E as verifyAppCanMerge, M as withConcurrencyLimit, f as init_github_app, j as init_concurrency, m as isIntegrationPermissionError } from "./github-app-BlMSzSTw.js";
|
|
25
|
+
import { a as init_events, i as getEventsFileSizeSync, l as init_wal, o as readEventsFromByteOffsetSync, r as forEachCostEventSync, t as appendCostEventSync } from "./events-B6xW8Cpm.js";
|
|
26
|
+
import "./reconciler-caYiRnPy.js";
|
|
27
|
+
import { n as getContainersReferencingWorkspacePath, r as init_workspace_manager } from "./workspace-manager-CM8RCrSc.js";
|
|
28
|
+
import { r as init_devcontainer_renderer, t as DEVCONTAINER_DIRNAME } from "./devcontainer-renderer-BiJhwFNi.js";
|
|
29
|
+
import { a as init_jsonl_parser, t as getActiveSessionModelSync } from "./jsonl-parser-Dfs1dlYE.js";
|
|
30
|
+
import { i as findWorkspacePath } from "./archive-planning-BL1ABtW0.js";
|
|
31
|
+
import { t as handlePostRebaseVerificationDeferral } from "./merge-verification-BfJRNMiD.js";
|
|
32
|
+
import { n as deliverReviewVerdictFeedbackFromStatus } from "./review-verdict-feedback-B2ojHFH5.js";
|
|
33
|
+
import { t as createInFlightGuard } from "./in-flight-guard-B7khcBdQ.js";
|
|
34
|
+
import { a as loadWorkspaceMetadataSync, i as listWorkspaceMetadataSync } from "./workspace-metadata-Cu6yfxBS.js";
|
|
35
|
+
import { n as enrichReviewStatusFromSessions } from "./review-status-enrichment-PDI4-faj.js";
|
|
36
|
+
import { n as generateDailySummary } from "./cli-CoQou1t_.js";
|
|
37
|
+
import { g as getDiffStat, h as getDiffBase, l as spawnReviewRoleForIssue, m as getChangedFiles } from "./review-agent-BRBTm1qE.js";
|
|
38
|
+
import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-McqCk2X7.js";
|
|
39
|
+
import { _ as syncMainIntoWorkspace, b as gitPush, x as listGitOperationsSync, y as MainDivergedError } from "./merge-agent-C-dsN9se.js";
|
|
40
|
+
import { F as enqueueMerge, I as getAllActiveQueues$1, L as getCurrentMerge, P as dequeueMerge, z as markMergeProcessing } from "./merge-FTk4LsnM.js";
|
|
41
|
+
import { t as rebaseFeatureBranch } from "./merge-rebase-KBw4rdh3.js";
|
|
42
|
+
import { t as getReleaseSetSync } from "./release-set-DOIDz2vw.js";
|
|
43
|
+
import { r as getCachedConflictGateMergeability } from "./conflict-gate-hAUCL-un.js";
|
|
44
|
+
import { r as runVerificationForIssue } from "./verification-runner-BEq5ZF-h.js";
|
|
45
|
+
import { a as registerDurableReviewPipelineHandler, i as registerDurableReviewDispatcher, r as init_durable_review_pipeline } from "./durable-review-pipeline-Djx_lvFd.js";
|
|
46
|
+
import { t as teardownWorkspace } from "./teardown-workspace-DMwomEG1.js";
|
|
47
|
+
import { t as init_rebuild_stack } from "./rebuild-stack-CyXMrj6K.js";
|
|
49
48
|
import { basename, dirname, join, resolve, sep } from "node:path";
|
|
50
49
|
import { Cause, Effect, Layer, Option, Stream } from "effect";
|
|
51
|
-
import {
|
|
52
|
-
import {
|
|
50
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync } from "fs";
|
|
51
|
+
import { join as join$1 } from "path";
|
|
53
52
|
import { homedir } from "os";
|
|
54
53
|
import { homedir as homedir$1 } from "node:os";
|
|
55
54
|
import { existsSync as existsSync$1, mkdirSync as mkdirSync$1, readFileSync as readFileSync$1, statSync as statSync$1, writeFileSync as writeFileSync$1 } from "node:fs";
|
|
@@ -104,7 +103,7 @@ async function captureInterestedAgent(state, agentId) {
|
|
|
104
103
|
try {
|
|
105
104
|
const remoteState = await readFile(join(homedir$1(), ".overdeck", "agents", agentId, "remote-state.json"), "utf-8").then((text) => JSON.parse(text)).catch(() => null);
|
|
106
105
|
if (remoteState?.location === "remote" && remoteState?.vmName) {
|
|
107
|
-
const { getRemoteAgentOutput } = await import("./remote-agents-
|
|
106
|
+
const { getRemoteAgentOutput } = await import("./remote-agents-MuXx2gWm.js");
|
|
108
107
|
stdout = await getRemoteAgentOutput(agentId, remoteState.vmName, 50);
|
|
109
108
|
} else stdout = await Effect.runPromise(capturePane(agentId, 50));
|
|
110
109
|
} catch {
|
|
@@ -937,7 +936,7 @@ const postWorkspaceContainerActionRoute = HttpRouter.add("POST", "/api/workspace
|
|
|
937
936
|
}
|
|
938
937
|
if (!workspacePath) return jsonResponse({ error: `Workspace not found for ${issueId}` }, { status: 404 });
|
|
939
938
|
if (!composeFile && ["start", "restart"].includes(action)) {
|
|
940
|
-
const { ensureDevcontainerSync } = yield* Effect.promise(() => import("./ensure-devcontainer-
|
|
939
|
+
const { ensureDevcontainerSync } = yield* Effect.promise(() => import("./ensure-devcontainer-Dk6ZMOUC.js"));
|
|
941
940
|
if (ensureDevcontainerSync({
|
|
942
941
|
workspacePath,
|
|
943
942
|
issueId
|
|
@@ -1427,10 +1426,10 @@ init_paths();
|
|
|
1427
1426
|
init_events();
|
|
1428
1427
|
init_cost();
|
|
1429
1428
|
init_errors();
|
|
1430
|
-
function getAgentsDir
|
|
1429
|
+
function getAgentsDir() {
|
|
1431
1430
|
return join$1(process.env.HOME || homedir(), ".overdeck", "agents");
|
|
1432
1431
|
}
|
|
1433
|
-
function getClaudeProjectsDir
|
|
1432
|
+
function getClaudeProjectsDir() {
|
|
1434
1433
|
return join$1(process.env.HOME || homedir(), ".claude", "projects");
|
|
1435
1434
|
}
|
|
1436
1435
|
function getProjectsYamlPath() {
|
|
@@ -1440,7 +1439,7 @@ function getProjectsYamlPath() {
|
|
|
1440
1439
|
* Infer issueId from agent directory name
|
|
1441
1440
|
* e.g., 'agent-pan-105' -> 'PAN-105', 'agent-min-663' -> 'MIN-663'
|
|
1442
1441
|
*/
|
|
1443
|
-
function inferIssueId
|
|
1442
|
+
function inferIssueId(agentDir) {
|
|
1444
1443
|
const match = agentDir.replace(/^(agent|planning)-/, "").match(/^([a-z]+)-(\d+)$/i);
|
|
1445
1444
|
if (match) return `${match[1].toUpperCase()}-${match[2]}`;
|
|
1446
1445
|
return null;
|
|
@@ -1482,7 +1481,7 @@ function resolveWorkspace(issueId) {
|
|
|
1482
1481
|
function findSessionDirsByIssue(issueId) {
|
|
1483
1482
|
const dirs = [];
|
|
1484
1483
|
const issueLower = issueId.toLowerCase();
|
|
1485
|
-
const claudeDir = getClaudeProjectsDir
|
|
1484
|
+
const claudeDir = getClaudeProjectsDir();
|
|
1486
1485
|
try {
|
|
1487
1486
|
const entries = readdirSync(claudeDir);
|
|
1488
1487
|
for (const entry of entries) if (entry.includes(`feature-${issueLower}`)) {
|
|
@@ -1559,7 +1558,7 @@ function usageToCostEvents(usages, context) {
|
|
|
1559
1558
|
*/
|
|
1560
1559
|
function getSessionDir(workspacePath) {
|
|
1561
1560
|
const sessionDirName = encodeClaudeProjectDir(workspacePath);
|
|
1562
|
-
const sessionDir = join$1(getClaudeProjectsDir
|
|
1561
|
+
const sessionDir = join$1(getClaudeProjectsDir(), sessionDirName);
|
|
1563
1562
|
if (existsSync(sessionDir)) return sessionDir;
|
|
1564
1563
|
return null;
|
|
1565
1564
|
}
|
|
@@ -1567,7 +1566,7 @@ function getSessionDir(workspacePath) {
|
|
|
1567
1566
|
* Migrate a single agent's session data
|
|
1568
1567
|
*/
|
|
1569
1568
|
function migrateAgent(agentDir, stats) {
|
|
1570
|
-
const stateFile = join$1(getAgentsDir
|
|
1569
|
+
const stateFile = join$1(getAgentsDir(), agentDir, "state.json");
|
|
1571
1570
|
if (!existsSync(stateFile)) {
|
|
1572
1571
|
stats.warnings.push({
|
|
1573
1572
|
file: stateFile,
|
|
@@ -1585,7 +1584,7 @@ function migrateAgent(agentDir, stats) {
|
|
|
1585
1584
|
});
|
|
1586
1585
|
return;
|
|
1587
1586
|
}
|
|
1588
|
-
const inferredIssueId = inferIssueId
|
|
1587
|
+
const inferredIssueId = inferIssueId(agentDir);
|
|
1589
1588
|
const context = {
|
|
1590
1589
|
agentId: agentDir,
|
|
1591
1590
|
issueId: state.issueId || inferredIssueId || "UNKNOWN",
|
|
@@ -1683,7 +1682,7 @@ function migrateAllSessionsSync() {
|
|
|
1683
1682
|
totalTokens: 0
|
|
1684
1683
|
};
|
|
1685
1684
|
console.log("Starting migration of historical session data...");
|
|
1686
|
-
const agentsDir = getAgentsDir
|
|
1685
|
+
const agentsDir = getAgentsDir();
|
|
1687
1686
|
if (!existsSync(agentsDir)) {
|
|
1688
1687
|
console.log("No agents directory found - nothing to migrate");
|
|
1689
1688
|
return stats;
|
|
@@ -1710,578 +1709,6 @@ function migrateAllSessionsSync() {
|
|
|
1710
1709
|
return stats;
|
|
1711
1710
|
}
|
|
1712
1711
|
//#endregion
|
|
1713
|
-
//#region ../../lib/costs/attribution.ts
|
|
1714
|
-
init_conversations();
|
|
1715
|
-
init_infra();
|
|
1716
|
-
const NO_ISSUE_BUCKETS = {
|
|
1717
|
-
conversations: "CONVERSATIONS",
|
|
1718
|
-
flywheel: "FLYWHEEL",
|
|
1719
|
-
unattributed: "UNATTRIBUTED"
|
|
1720
|
-
};
|
|
1721
|
-
function classifySessionBucket(input, lookup) {
|
|
1722
|
-
const conversation = lookup(input);
|
|
1723
|
-
if (!conversation) return NO_ISSUE_BUCKETS.unattributed;
|
|
1724
|
-
if (conversation.name === "flywheel-orchestrator") return NO_ISSUE_BUCKETS.flywheel;
|
|
1725
|
-
return NO_ISSUE_BUCKETS.conversations;
|
|
1726
|
-
}
|
|
1727
|
-
function reclassifyUnknownCostEventsSync() {
|
|
1728
|
-
const db = getOverdeckDatabaseSync();
|
|
1729
|
-
const rows = db.prepare(`SELECT DISTINCT session_id AS sessionId, agent_id AS agentId
|
|
1730
|
-
FROM cost_events
|
|
1731
|
-
WHERE issue_id = 'UNKNOWN'`).all();
|
|
1732
|
-
let updated = 0;
|
|
1733
|
-
const update = db.prepare(`UPDATE cost_events
|
|
1734
|
-
SET issue_id = ?
|
|
1735
|
-
WHERE issue_id = 'UNKNOWN'
|
|
1736
|
-
AND session_id IS ?
|
|
1737
|
-
AND agent_id IS ?`);
|
|
1738
|
-
for (const row of rows) {
|
|
1739
|
-
const bucket = classifySessionBucket(row, findConversationForCostSessionSync);
|
|
1740
|
-
const result = update.run(bucket, row.sessionId, row.agentId);
|
|
1741
|
-
updated += result.changes;
|
|
1742
|
-
}
|
|
1743
|
-
return { updated };
|
|
1744
|
-
}
|
|
1745
|
-
//#endregion
|
|
1746
|
-
//#region ../../lib/costs/reconciler.ts
|
|
1747
|
-
/**
|
|
1748
|
-
* Cost Reconciler — Periodic catch-up sweep for cost tracking
|
|
1749
|
-
*
|
|
1750
|
-
* The live recording hook (heartbeat-hook → record-cost-event.js) captures costs
|
|
1751
|
-
* in real time, but can miss events due to hook failures, process crashes, or
|
|
1752
|
-
* system reboots. The reconciler ensures completeness by periodically sweeping
|
|
1753
|
-
* ALL Claude transcript files and importing any events not yet in SQLite.
|
|
1754
|
-
*
|
|
1755
|
-
* v2 Architecture: Scans ~/.claude/projects/ directly instead of going through
|
|
1756
|
-
* agent state.json files. This catches everything:
|
|
1757
|
-
* - Work agent sessions (from worktree workspaces)
|
|
1758
|
-
* - Planning agent sessions (from main project dirs)
|
|
1759
|
-
* - Specialist sessions (review, test, merge)
|
|
1760
|
-
* - Interactive/manual Claude sessions
|
|
1761
|
-
*
|
|
1762
|
-
* Key properties:
|
|
1763
|
-
* - Idempotent: dedup on request_id — safe to run any number of times
|
|
1764
|
-
* - Incremental: tracks byte offset per session — only reads new bytes
|
|
1765
|
-
* - Non-destructive: never deletes from SQLite, append-only
|
|
1766
|
-
* - Catches everything: scans all transcript files regardless of source
|
|
1767
|
-
*/
|
|
1768
|
-
init_cost();
|
|
1769
|
-
init_errors();
|
|
1770
|
-
init_conversations();
|
|
1771
|
-
/**
|
|
1772
|
-
* Map a pi-reported provider string to the AIProvider union used by the pricing
|
|
1773
|
-
* layer. zai/kimi/minimax/mimo and anything unknown collapse to 'custom' (which
|
|
1774
|
-
* is how these providers are keyed in DEFAULT_PRICING).
|
|
1775
|
-
*/
|
|
1776
|
-
function piProviderToAiProvider(provider) {
|
|
1777
|
-
if (provider === "anthropic") return "anthropic";
|
|
1778
|
-
if (provider === "openai") return "openai";
|
|
1779
|
-
if (provider === "google") return "google";
|
|
1780
|
-
return "custom";
|
|
1781
|
-
}
|
|
1782
|
-
function getAgentsDir() {
|
|
1783
|
-
return join$1(process.env.HOME || homedir(), ".overdeck", "agents");
|
|
1784
|
-
}
|
|
1785
|
-
function getClaudeProjectsDir() {
|
|
1786
|
-
return join$1(process.env.HOME || homedir(), ".claude", "projects");
|
|
1787
|
-
}
|
|
1788
|
-
/**
|
|
1789
|
-
* Extract session UUID from a transcript filename.
|
|
1790
|
-
* e.g., "678c8d8d-cefe-45ca-bebc-bafe602aff93.jsonl" → "678c8d8d-cefe-45ca-bebc-bafe602aff93"
|
|
1791
|
-
*/
|
|
1792
|
-
function extractSessionId(filename) {
|
|
1793
|
-
return basename$1(filename, ".jsonl");
|
|
1794
|
-
}
|
|
1795
|
-
function resolveUnmappedSessionIssueId(input, lookup = findConversationForCostSessionSync) {
|
|
1796
|
-
return classifySessionBucket(input, lookup);
|
|
1797
|
-
}
|
|
1798
|
-
/**
|
|
1799
|
-
* Decode a Claude projects directory name back to the original cwd path.
|
|
1800
|
-
* e.g., "-home-eltmon-Projects-krux-workspaces-feature-krux-4" → "/home/eltmon/Projects/krux/workspaces/feature-krux-4"
|
|
1801
|
-
*/
|
|
1802
|
-
function decodeClaudeDirName(dirName) {
|
|
1803
|
-
return "/" + dirName.replace(/^-/, "").replace(/-/g, "/");
|
|
1804
|
-
}
|
|
1805
|
-
/**
|
|
1806
|
-
* Build a reverse index: session UUID → agent context.
|
|
1807
|
-
* Sources:
|
|
1808
|
-
* 1. sessions.json files in agent directories (authoritative — written by heartbeat hook)
|
|
1809
|
-
* 2. Agent state.json for issue/workspace context
|
|
1810
|
-
*/
|
|
1811
|
-
function buildSessionIndex() {
|
|
1812
|
-
const index = /* @__PURE__ */ new Map();
|
|
1813
|
-
const agentsDir = getAgentsDir();
|
|
1814
|
-
if (!existsSync(agentsDir)) return index;
|
|
1815
|
-
let entries;
|
|
1816
|
-
try {
|
|
1817
|
-
entries = readdirSync(agentsDir);
|
|
1818
|
-
} catch {
|
|
1819
|
-
return index;
|
|
1820
|
-
}
|
|
1821
|
-
for (const agentDir of entries) {
|
|
1822
|
-
const agentPath = join$1(agentsDir, agentDir);
|
|
1823
|
-
const sessionsFile = join$1(agentPath, "sessions.json");
|
|
1824
|
-
let sessionIds = [];
|
|
1825
|
-
if (existsSync(sessionsFile)) try {
|
|
1826
|
-
sessionIds = JSON.parse(readFileSync(sessionsFile, "utf-8"));
|
|
1827
|
-
} catch {}
|
|
1828
|
-
const stateFile = join$1(agentPath, "state.json");
|
|
1829
|
-
let issueId = inferIssueId(agentDir);
|
|
1830
|
-
let stateRole;
|
|
1831
|
-
if (existsSync(stateFile)) try {
|
|
1832
|
-
const state = JSON.parse(readFileSync(stateFile, "utf-8"));
|
|
1833
|
-
if (state.issueId) issueId = state.issueId;
|
|
1834
|
-
if (state.role) stateRole = state.role;
|
|
1835
|
-
} catch {}
|
|
1836
|
-
let sessionType = stateRole || "work";
|
|
1837
|
-
const reviewSubRole = agentDir.match(/-review-(security|correctness|performance|requirements)$/i)?.[1]?.toLowerCase();
|
|
1838
|
-
if (reviewSubRole) sessionType = `review.${reviewSubRole}`;
|
|
1839
|
-
else if (agentDir.startsWith("planning-")) sessionType = "planning";
|
|
1840
|
-
else if (agentDir.includes("review")) sessionType = "review";
|
|
1841
|
-
else if (agentDir.includes("test")) sessionType = "test";
|
|
1842
|
-
else if (agentDir.includes("merge")) sessionType = "merge";
|
|
1843
|
-
for (const sid of sessionIds) index.set(sid, {
|
|
1844
|
-
agentId: agentDir,
|
|
1845
|
-
issueId: issueId ?? resolveUnmappedSessionIssueId({
|
|
1846
|
-
sessionId: sid,
|
|
1847
|
-
agentId: agentDir
|
|
1848
|
-
}),
|
|
1849
|
-
sessionType
|
|
1850
|
-
});
|
|
1851
|
-
}
|
|
1852
|
-
return index;
|
|
1853
|
-
}
|
|
1854
|
-
/**
|
|
1855
|
-
* Infer issue ID from a decoded path.
|
|
1856
|
-
* Looks for patterns like "feature-min-787", "feature/pan-208", etc.
|
|
1857
|
-
*/
|
|
1858
|
-
function inferIssueFromPath(decodedPath) {
|
|
1859
|
-
const match = decodedPath.match(/(?:feature[-/])?(pan|min|aud|krux|cli)[-/](\d+)/i);
|
|
1860
|
-
if (match) return `${match[1].toUpperCase()}-${match[2]}`;
|
|
1861
|
-
return null;
|
|
1862
|
-
}
|
|
1863
|
-
/**
|
|
1864
|
-
* Infer issue ID from agent directory name.
|
|
1865
|
-
* e.g., 'agent-pan-105' → 'PAN-105', 'planning-min-663' → 'MIN-663'
|
|
1866
|
-
*/
|
|
1867
|
-
function inferIssueId(agentDir) {
|
|
1868
|
-
const match = agentDir.replace(/^(agent|planning|specialist)-/, "").match(/^(?:.*-)?(pan|min|aud|krux|cli)-(\d+)$/i);
|
|
1869
|
-
if (match) return `${match[1].toUpperCase()}-${match[2]}`;
|
|
1870
|
-
return null;
|
|
1871
|
-
}
|
|
1872
|
-
function getSessionOffset(_sessionId) {
|
|
1873
|
-
return 0;
|
|
1874
|
-
}
|
|
1875
|
-
function saveSessionOffset(sessionId, byteOffset, newEvents, agentId, issueId, transcriptPath) {}
|
|
1876
|
-
/**
|
|
1877
|
-
* Read new bytes from a transcript file starting at the given offset.
|
|
1878
|
-
*/
|
|
1879
|
-
function readNewBytes(filePath, fromOffset) {
|
|
1880
|
-
let fd;
|
|
1881
|
-
try {
|
|
1882
|
-
fd = openSync(filePath, "r");
|
|
1883
|
-
} catch {
|
|
1884
|
-
return null;
|
|
1885
|
-
}
|
|
1886
|
-
try {
|
|
1887
|
-
const stat = fstatSync(fd);
|
|
1888
|
-
if (stat.size <= fromOffset) return {
|
|
1889
|
-
content: "",
|
|
1890
|
-
newSize: stat.size
|
|
1891
|
-
};
|
|
1892
|
-
const bytesToRead = stat.size - fromOffset;
|
|
1893
|
-
const buffer = Buffer.alloc(bytesToRead);
|
|
1894
|
-
readSync(fd, buffer, 0, bytesToRead, fromOffset);
|
|
1895
|
-
return {
|
|
1896
|
-
content: buffer.toString("utf-8"),
|
|
1897
|
-
newSize: stat.size
|
|
1898
|
-
};
|
|
1899
|
-
} finally {
|
|
1900
|
-
closeSync(fd);
|
|
1901
|
-
}
|
|
1902
|
-
}
|
|
1903
|
-
/**
|
|
1904
|
-
* Parse transcript content and extract cost events.
|
|
1905
|
-
* Only processes assistant messages with usage data and a requestId.
|
|
1906
|
-
*/
|
|
1907
|
-
function extractCostEvents(content, agentId, issueId, sessionType, sessionId) {
|
|
1908
|
-
const events = [];
|
|
1909
|
-
const lines = content.split("\n");
|
|
1910
|
-
for (const line of lines) {
|
|
1911
|
-
if (!line.trim()) continue;
|
|
1912
|
-
try {
|
|
1913
|
-
const entry = JSON.parse(line);
|
|
1914
|
-
if (entry.type !== "assistant" || !entry.message?.usage) continue;
|
|
1915
|
-
const requestId = entry.requestId ?? void 0;
|
|
1916
|
-
const usage = entry.message.usage;
|
|
1917
|
-
const model = entry.message.model || "claude-sonnet-4";
|
|
1918
|
-
const inputTokens = usage.input_tokens || 0;
|
|
1919
|
-
const outputTokens = usage.output_tokens || 0;
|
|
1920
|
-
const cacheReadTokens = usage.cache_read_input_tokens || 0;
|
|
1921
|
-
const cacheWriteTokens = usage.cache_creation_input_tokens || 0;
|
|
1922
|
-
if (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheWriteTokens === 0) continue;
|
|
1923
|
-
let provider = "anthropic";
|
|
1924
|
-
if (model.includes("gpt")) provider = "openai";
|
|
1925
|
-
else if (model.includes("gemini")) provider = "google";
|
|
1926
|
-
else if (model.includes("kimi")) provider = "custom";
|
|
1927
|
-
else if (model.toLowerCase().startsWith("minimax")) provider = "custom";
|
|
1928
|
-
const pricingModel = model.replace(/^(?:oai|cx|go)@/, "");
|
|
1929
|
-
const pricing = getPricingSync(provider, pricingModel);
|
|
1930
|
-
if (!pricing) continue;
|
|
1931
|
-
const cost = calculateCostSync({
|
|
1932
|
-
inputTokens,
|
|
1933
|
-
outputTokens,
|
|
1934
|
-
cacheReadTokens,
|
|
1935
|
-
cacheWriteTokens,
|
|
1936
|
-
cacheTTL: "5m"
|
|
1937
|
-
}, pricing);
|
|
1938
|
-
const timestamp = entry.timestamp || entry.ts || entry.created_at || (/* @__PURE__ */ new Date()).toISOString();
|
|
1939
|
-
events.push({
|
|
1940
|
-
ts: timestamp,
|
|
1941
|
-
type: "cost",
|
|
1942
|
-
agentId,
|
|
1943
|
-
issueId,
|
|
1944
|
-
sessionType,
|
|
1945
|
-
provider,
|
|
1946
|
-
model,
|
|
1947
|
-
input: inputTokens,
|
|
1948
|
-
output: outputTokens,
|
|
1949
|
-
cacheRead: cacheReadTokens,
|
|
1950
|
-
cacheWrite: cacheWriteTokens,
|
|
1951
|
-
cost,
|
|
1952
|
-
requestId,
|
|
1953
|
-
sessionId
|
|
1954
|
-
});
|
|
1955
|
-
} catch {}
|
|
1956
|
-
}
|
|
1957
|
-
return events;
|
|
1958
|
-
}
|
|
1959
|
-
/**
|
|
1960
|
-
* Parse Pi/oh-my-pi transcript content and extract cost events (PAN-1935).
|
|
1961
|
-
*
|
|
1962
|
-
* Pi's `message.usage` uses short camelCase keys (`input`, `output`,
|
|
1963
|
-
* `cacheRead`, `cacheWrite`) and the real model/provider live on `message`
|
|
1964
|
-
* (not inferred from a Claude-style `model` field). Cost is always computed
|
|
1965
|
-
* from tokens × pricing because pi reports `cost.total = 0` for non-Anthropic
|
|
1966
|
-
* providers. Exported for unit testing.
|
|
1967
|
-
*/
|
|
1968
|
-
function extractPiCostEvents(content, agentId, issueId, sessionType, sessionId) {
|
|
1969
|
-
const events = [];
|
|
1970
|
-
for (const line of content.split("\n")) {
|
|
1971
|
-
if (!line.trim()) continue;
|
|
1972
|
-
let entry;
|
|
1973
|
-
try {
|
|
1974
|
-
entry = JSON.parse(line);
|
|
1975
|
-
} catch {
|
|
1976
|
-
continue;
|
|
1977
|
-
}
|
|
1978
|
-
if (entry.type !== "message") continue;
|
|
1979
|
-
const usage = entry.message?.usage;
|
|
1980
|
-
if (!usage) continue;
|
|
1981
|
-
const inputTokens = usage.input ?? 0;
|
|
1982
|
-
const outputTokens = usage.output ?? 0;
|
|
1983
|
-
const cacheReadTokens = usage.cacheRead ?? 0;
|
|
1984
|
-
const cacheWriteTokens = usage.cacheWrite ?? 0;
|
|
1985
|
-
if (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheWriteTokens === 0) continue;
|
|
1986
|
-
const model = entry.message?.model || "unknown";
|
|
1987
|
-
const provider = piProviderToAiProvider(entry.message?.provider);
|
|
1988
|
-
const pricing = getPricingSync(provider, model.replace(/^(?:oai|cx|go)@/, ""));
|
|
1989
|
-
if (!pricing) continue;
|
|
1990
|
-
const cost = calculateCostSync({
|
|
1991
|
-
inputTokens,
|
|
1992
|
-
outputTokens,
|
|
1993
|
-
cacheReadTokens,
|
|
1994
|
-
cacheWriteTokens,
|
|
1995
|
-
cacheTTL: "5m"
|
|
1996
|
-
}, pricing);
|
|
1997
|
-
const requestId = entry.message?.responseId ?? (entry.id ? `${sessionId}#${entry.id}` : void 0);
|
|
1998
|
-
const timestamp = entry.timestamp || (/* @__PURE__ */ new Date()).toISOString();
|
|
1999
|
-
events.push({
|
|
2000
|
-
ts: timestamp,
|
|
2001
|
-
type: "cost",
|
|
2002
|
-
agentId,
|
|
2003
|
-
issueId,
|
|
2004
|
-
sessionType,
|
|
2005
|
-
provider,
|
|
2006
|
-
model,
|
|
2007
|
-
input: inputTokens,
|
|
2008
|
-
output: outputTokens,
|
|
2009
|
-
cacheRead: cacheReadTokens,
|
|
2010
|
-
cacheWrite: cacheWriteTokens,
|
|
2011
|
-
cost,
|
|
2012
|
-
requestId,
|
|
2013
|
-
sessionId
|
|
2014
|
-
});
|
|
2015
|
-
}
|
|
2016
|
-
return events;
|
|
2017
|
-
}
|
|
2018
|
-
/**
|
|
2019
|
-
* Pi session transcripts in an agent dir. Pi transcripts begin with a
|
|
2020
|
-
* `{"type":"session","version":3,...}` header; we detect that and skip the
|
|
2021
|
-
* sibling non-transcripts (activity.jsonl, cost-events.jsonl, pending-events).
|
|
2022
|
-
*/
|
|
2023
|
-
function findPiTranscriptFiles(agentDir) {
|
|
2024
|
-
let files;
|
|
2025
|
-
try {
|
|
2026
|
-
files = readdirSync(agentDir).filter((f) => f.endsWith(".jsonl"));
|
|
2027
|
-
} catch {
|
|
2028
|
-
return [];
|
|
2029
|
-
}
|
|
2030
|
-
const transcripts = [];
|
|
2031
|
-
for (const f of files) {
|
|
2032
|
-
if (f === "activity.jsonl" || f === "cost-events.jsonl" || f === "pending-events.jsonl") continue;
|
|
2033
|
-
const full = join$1(agentDir, f);
|
|
2034
|
-
try {
|
|
2035
|
-
const fd = openSync(full, "r");
|
|
2036
|
-
const buf = Buffer.alloc(128);
|
|
2037
|
-
const bytesRead = readSync(fd, buf, 0, 128, 0);
|
|
2038
|
-
closeSync(fd);
|
|
2039
|
-
const head = buf.toString("utf-8", 0, bytesRead);
|
|
2040
|
-
if (/"type"\s*:\s*"session"/.test(head)) transcripts.push(full);
|
|
2041
|
-
} catch {}
|
|
2042
|
-
}
|
|
2043
|
-
return transcripts;
|
|
2044
|
-
}
|
|
2045
|
-
/**
|
|
2046
|
-
* Sweep pi session transcripts under the per-agent dirs (~/.overdeck/agents)
|
|
2047
|
-
* and import their cost events through the same Overdeck cost writer the Claude
|
|
2048
|
-
* path uses (PAN-1935).
|
|
2049
|
-
* Independent of the pi extension hook, so it captures cost even when the
|
|
2050
|
-
* extension emits null usage or the wrong model label.
|
|
2051
|
-
*/
|
|
2052
|
-
async function reconcilePiTranscripts() {
|
|
2053
|
-
const result = {
|
|
2054
|
-
sessionsScanned: 0,
|
|
2055
|
-
sessionsWithNewData: 0,
|
|
2056
|
-
eventsImported: 0,
|
|
2057
|
-
duplicatesSkipped: 0,
|
|
2058
|
-
errors: [],
|
|
2059
|
-
earliestEventTs: null,
|
|
2060
|
-
latestEventTs: null
|
|
2061
|
-
};
|
|
2062
|
-
const agentsDir = getAgentsDir();
|
|
2063
|
-
if (!existsSync(agentsDir)) return result;
|
|
2064
|
-
let agentDirs;
|
|
2065
|
-
try {
|
|
2066
|
-
agentDirs = readdirSync(agentsDir);
|
|
2067
|
-
} catch {
|
|
2068
|
-
return result;
|
|
2069
|
-
}
|
|
2070
|
-
for (const agentDirName of agentDirs) {
|
|
2071
|
-
const agentPath = join$1(agentsDir, agentDirName);
|
|
2072
|
-
let issueId = inferIssueId(agentDirName);
|
|
2073
|
-
let sessionType = "work";
|
|
2074
|
-
const stateFile = join$1(agentPath, "state.json");
|
|
2075
|
-
if (existsSync(stateFile)) try {
|
|
2076
|
-
const st = JSON.parse(readFileSync(stateFile, "utf-8"));
|
|
2077
|
-
if (st.issueId) issueId = st.issueId;
|
|
2078
|
-
if (st.role) sessionType = st.role;
|
|
2079
|
-
} catch {}
|
|
2080
|
-
if (agentDirName.startsWith("planning-")) sessionType = "planning";
|
|
2081
|
-
const transcripts = findPiTranscriptFiles(agentPath);
|
|
2082
|
-
for (const transcriptPath of transcripts) {
|
|
2083
|
-
const sessionId = basename$1(transcriptPath, ".jsonl");
|
|
2084
|
-
const resolvedIssueId = issueId ?? resolveUnmappedSessionIssueId({
|
|
2085
|
-
sessionId,
|
|
2086
|
-
agentId: agentDirName
|
|
2087
|
-
});
|
|
2088
|
-
result.sessionsScanned++;
|
|
2089
|
-
try {
|
|
2090
|
-
const events = extractPiCostEvents(readFileSync(transcriptPath, "utf-8"), agentDirName, resolvedIssueId, sessionType, sessionId);
|
|
2091
|
-
if (events.length === 0) continue;
|
|
2092
|
-
result.sessionsWithNewData++;
|
|
2093
|
-
const { inserted, duplicates, earliestEventTs, latestEventTs } = await recordCostEventsThroughOverdeck$1(events, `reconciler:${transcriptPath}`);
|
|
2094
|
-
result.eventsImported += inserted;
|
|
2095
|
-
result.duplicatesSkipped += duplicates;
|
|
2096
|
-
mergeCoverage(result, {
|
|
2097
|
-
earliestEventTs,
|
|
2098
|
-
latestEventTs
|
|
2099
|
-
});
|
|
2100
|
-
} catch (err) {
|
|
2101
|
-
result.errors.push({
|
|
2102
|
-
path: transcriptPath,
|
|
2103
|
-
error: err instanceof Error ? err.message : String(err)
|
|
2104
|
-
});
|
|
2105
|
-
}
|
|
2106
|
-
}
|
|
2107
|
-
}
|
|
2108
|
-
return result;
|
|
2109
|
-
}
|
|
2110
|
-
function toOverdeckCostEvent$1(event, sourceFile) {
|
|
2111
|
-
return {
|
|
2112
|
-
ts: new Date(event.ts),
|
|
2113
|
-
issueId: event.issueId ? event.issueId : null,
|
|
2114
|
-
agentId: event.agentId ?? null,
|
|
2115
|
-
sessionId: event.sessionId ?? null,
|
|
2116
|
-
sessionType: event.sessionType ?? null,
|
|
2117
|
-
provider: event.provider ?? null,
|
|
2118
|
-
model: event.model ?? null,
|
|
2119
|
-
input: event.input ?? 0,
|
|
2120
|
-
output: event.output ?? 0,
|
|
2121
|
-
cacheRead: event.cacheRead ?? 0,
|
|
2122
|
-
cacheWrite: event.cacheWrite ?? 0,
|
|
2123
|
-
cost: event.cost ?? 0,
|
|
2124
|
-
requestId: event.requestId ?? null,
|
|
2125
|
-
sourceFile
|
|
2126
|
-
};
|
|
2127
|
-
}
|
|
2128
|
-
async function recordCostEventsThroughOverdeck$1(events, sourceFile, opts = {}) {
|
|
2129
|
-
let inserted = 0;
|
|
2130
|
-
let duplicates = 0;
|
|
2131
|
-
let earliestEventTs = null;
|
|
2132
|
-
let latestEventTs = null;
|
|
2133
|
-
for (const event of events) if (await Effect.runPromise(CostWriter.use((writer) => writer.record(toOverdeckCostEvent$1(event, sourceFile), { dryRun: opts.dryRun })).pipe(Effect.provide(CostDoorLive)))) {
|
|
2134
|
-
inserted++;
|
|
2135
|
-
const iso = new Date(event.ts).toISOString();
|
|
2136
|
-
if (earliestEventTs == null || iso < earliestEventTs) earliestEventTs = iso;
|
|
2137
|
-
if (latestEventTs == null || iso > latestEventTs) latestEventTs = iso;
|
|
2138
|
-
} else duplicates++;
|
|
2139
|
-
return {
|
|
2140
|
-
inserted,
|
|
2141
|
-
duplicates,
|
|
2142
|
-
earliestEventTs,
|
|
2143
|
-
latestEventTs
|
|
2144
|
-
};
|
|
2145
|
-
}
|
|
2146
|
-
function mergeCoverage(result, coverage) {
|
|
2147
|
-
if (coverage.earliestEventTs != null && (result.earliestEventTs == null || coverage.earliestEventTs < result.earliestEventTs)) result.earliestEventTs = coverage.earliestEventTs;
|
|
2148
|
-
if (coverage.latestEventTs != null && (result.latestEventTs == null || coverage.latestEventTs > result.latestEventTs)) result.latestEventTs = coverage.latestEventTs;
|
|
2149
|
-
}
|
|
2150
|
-
async function reconcilePromise(opts = {}) {
|
|
2151
|
-
const result = {
|
|
2152
|
-
sessionsScanned: 0,
|
|
2153
|
-
sessionsWithNewData: 0,
|
|
2154
|
-
eventsImported: 0,
|
|
2155
|
-
duplicatesSkipped: 0,
|
|
2156
|
-
errors: [],
|
|
2157
|
-
earliestEventTs: null,
|
|
2158
|
-
latestEventTs: null
|
|
2159
|
-
};
|
|
2160
|
-
const claudeProjectsDir = getClaudeProjectsDir();
|
|
2161
|
-
if (!existsSync(claudeProjectsDir)) return result;
|
|
2162
|
-
const sessionIndex = buildSessionIndex();
|
|
2163
|
-
let projectDirs;
|
|
2164
|
-
try {
|
|
2165
|
-
projectDirs = readdirSync(claudeProjectsDir);
|
|
2166
|
-
} catch {
|
|
2167
|
-
return result;
|
|
2168
|
-
}
|
|
2169
|
-
for (const dirName of projectDirs) {
|
|
2170
|
-
const projectDir = join$1(claudeProjectsDir, dirName);
|
|
2171
|
-
try {
|
|
2172
|
-
fstatSync(openSync(projectDir, "r"));
|
|
2173
|
-
} catch {}
|
|
2174
|
-
const pathIssueId = inferIssueFromPath(decodeClaudeDirName(dirName));
|
|
2175
|
-
let files;
|
|
2176
|
-
try {
|
|
2177
|
-
files = readdirSync(projectDir).filter((f) => f.endsWith(".jsonl"));
|
|
2178
|
-
} catch {
|
|
2179
|
-
continue;
|
|
2180
|
-
}
|
|
2181
|
-
for (const file of files) {
|
|
2182
|
-
const sessionId = extractSessionId(file);
|
|
2183
|
-
const transcriptPath = join$1(projectDir, file);
|
|
2184
|
-
result.sessionsScanned++;
|
|
2185
|
-
try {
|
|
2186
|
-
const mapping = sessionIndex.get(sessionId);
|
|
2187
|
-
const agentId = mapping?.agentId || "unattributed";
|
|
2188
|
-
const issueId = mapping?.issueId || pathIssueId || resolveUnmappedSessionIssueId({
|
|
2189
|
-
sessionId,
|
|
2190
|
-
agentId
|
|
2191
|
-
});
|
|
2192
|
-
const sessionType = mapping?.sessionType || "implementation";
|
|
2193
|
-
const lastOffset = getSessionOffset(sessionId);
|
|
2194
|
-
const readResult = readNewBytes(transcriptPath, lastOffset);
|
|
2195
|
-
if (!readResult || !readResult.content) {
|
|
2196
|
-
if (!opts.dryRun && readResult && readResult.newSize > lastOffset) saveSessionOffset(sessionId, readResult.newSize, 0, agentId, issueId, transcriptPath);
|
|
2197
|
-
continue;
|
|
2198
|
-
}
|
|
2199
|
-
const events = extractCostEvents(readResult.content, agentId, issueId, sessionType, sessionId);
|
|
2200
|
-
if (events.length === 0) {
|
|
2201
|
-
if (!opts.dryRun) saveSessionOffset(sessionId, readResult.newSize, 0, agentId, issueId, transcriptPath);
|
|
2202
|
-
continue;
|
|
2203
|
-
}
|
|
2204
|
-
result.sessionsWithNewData++;
|
|
2205
|
-
const { inserted, duplicates, earliestEventTs, latestEventTs } = await recordCostEventsThroughOverdeck$1(events, `reconciler:${transcriptPath}`, { dryRun: opts.dryRun });
|
|
2206
|
-
result.eventsImported += inserted;
|
|
2207
|
-
result.duplicatesSkipped += duplicates;
|
|
2208
|
-
mergeCoverage(result, {
|
|
2209
|
-
earliestEventTs,
|
|
2210
|
-
latestEventTs
|
|
2211
|
-
});
|
|
2212
|
-
if (!opts.dryRun) saveSessionOffset(sessionId, readResult.newSize, inserted, agentId, issueId, transcriptPath);
|
|
2213
|
-
} catch (err) {
|
|
2214
|
-
result.errors.push({
|
|
2215
|
-
path: transcriptPath,
|
|
2216
|
-
error: err instanceof Error ? err.message : String(err)
|
|
2217
|
-
});
|
|
2218
|
-
}
|
|
2219
|
-
}
|
|
2220
|
-
const subagentsDir = join$1(projectDir, "subagents");
|
|
2221
|
-
if (existsSync(subagentsDir)) try {
|
|
2222
|
-
const subFiles = readdirSync(subagentsDir).filter((f) => f.endsWith(".jsonl"));
|
|
2223
|
-
for (const file of subFiles) {
|
|
2224
|
-
const sessionId = `sub-${extractSessionId(file)}`;
|
|
2225
|
-
const transcriptPath = join$1(subagentsDir, file);
|
|
2226
|
-
result.sessionsScanned++;
|
|
2227
|
-
try {
|
|
2228
|
-
const mapping = sessionIndex.get(sessionId);
|
|
2229
|
-
const agentId = mapping?.agentId || "unattributed-subagent";
|
|
2230
|
-
const issueId = mapping?.issueId || pathIssueId || resolveUnmappedSessionIssueId({
|
|
2231
|
-
sessionId,
|
|
2232
|
-
agentId
|
|
2233
|
-
});
|
|
2234
|
-
const sessionType = mapping?.sessionType || "implementation";
|
|
2235
|
-
const readResult = readNewBytes(transcriptPath, getSessionOffset(sessionId));
|
|
2236
|
-
if (!readResult || !readResult.content) continue;
|
|
2237
|
-
const events = extractCostEvents(readResult.content, agentId, issueId, sessionType, sessionId);
|
|
2238
|
-
if (events.length === 0) {
|
|
2239
|
-
if (!opts.dryRun) saveSessionOffset(sessionId, readResult.newSize, 0, agentId, issueId, transcriptPath);
|
|
2240
|
-
continue;
|
|
2241
|
-
}
|
|
2242
|
-
result.sessionsWithNewData++;
|
|
2243
|
-
const { inserted, duplicates, earliestEventTs, latestEventTs } = await recordCostEventsThroughOverdeck$1(events, `reconciler:${transcriptPath}`, { dryRun: opts.dryRun });
|
|
2244
|
-
result.eventsImported += inserted;
|
|
2245
|
-
result.duplicatesSkipped += duplicates;
|
|
2246
|
-
mergeCoverage(result, {
|
|
2247
|
-
earliestEventTs,
|
|
2248
|
-
latestEventTs
|
|
2249
|
-
});
|
|
2250
|
-
if (!opts.dryRun) saveSessionOffset(sessionId, readResult.newSize, inserted, agentId, issueId, transcriptPath);
|
|
2251
|
-
} catch (err) {
|
|
2252
|
-
result.errors.push({
|
|
2253
|
-
path: transcriptPath,
|
|
2254
|
-
error: err instanceof Error ? err.message : String(err)
|
|
2255
|
-
});
|
|
2256
|
-
}
|
|
2257
|
-
}
|
|
2258
|
-
} catch {}
|
|
2259
|
-
}
|
|
2260
|
-
if (opts.includePi ?? true) {
|
|
2261
|
-
const piResult = await reconcilePiTranscripts();
|
|
2262
|
-
result.sessionsScanned += piResult.sessionsScanned;
|
|
2263
|
-
result.sessionsWithNewData += piResult.sessionsWithNewData;
|
|
2264
|
-
result.eventsImported += piResult.eventsImported;
|
|
2265
|
-
result.duplicatesSkipped += piResult.duplicatesSkipped;
|
|
2266
|
-
result.errors.push(...piResult.errors);
|
|
2267
|
-
mergeCoverage(result, piResult);
|
|
2268
|
-
}
|
|
2269
|
-
return result;
|
|
2270
|
-
}
|
|
2271
|
-
/**
|
|
2272
|
-
* Effect variant of reconcile. Per-file errors are still surfaced via
|
|
2273
|
-
* `result.errors`; only catastrophic failures (e.g. SQLite open failure)
|
|
2274
|
-
* surface on the Effect error channel.
|
|
2275
|
-
*/
|
|
2276
|
-
const reconcile = (opts = {}) => Effect.tryPromise({
|
|
2277
|
-
try: () => reconcilePromise(opts),
|
|
2278
|
-
catch: (cause) => new FsError({
|
|
2279
|
-
path: "<reconciler>",
|
|
2280
|
-
operation: "reconcile",
|
|
2281
|
-
cause
|
|
2282
|
-
})
|
|
2283
|
-
});
|
|
2284
|
-
//#endregion
|
|
2285
1712
|
//#region ../../lib/costs/retention.ts
|
|
2286
1713
|
init_events();
|
|
2287
1714
|
init_errors();
|
|
@@ -2821,9 +2248,9 @@ function mergeVerificationOptions(request) {
|
|
|
2821
2248
|
*/
|
|
2822
2249
|
async function recordCiGreenVerificationVerdict(issueId, workspacePath) {
|
|
2823
2250
|
try {
|
|
2824
|
-
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
2251
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-BAMwn9Nf.js");
|
|
2825
2252
|
const verifiedAnchor = await snapshotWorkspaceHeadsPromise(issueId, workspacePath).catch(() => void 0);
|
|
2826
|
-
const { setReviewStatusSync } = await import("./review-status-
|
|
2253
|
+
const { setReviewStatusSync } = await import("./review-status-Bge_3XTR.js");
|
|
2827
2254
|
setReviewStatusSync(issueId, {
|
|
2828
2255
|
verificationStatus: "passed",
|
|
2829
2256
|
verificationNotes: "merge-verify: CI green on the merged tip (PAN-2487 local-gate skip)",
|
|
@@ -2842,7 +2269,7 @@ async function recordCiGreenVerificationVerdict(issueId, workspacePath) {
|
|
|
2842
2269
|
* the workspaces-route import cycle.
|
|
2843
2270
|
*/
|
|
2844
2271
|
async function prepareWorkAgentForRebase(opts) {
|
|
2845
|
-
const { appendShipLog } = await import("./ship-log-
|
|
2272
|
+
const { appendShipLog } = await import("./ship-log-D-CphNZx.js");
|
|
2846
2273
|
opts.setStatus({
|
|
2847
2274
|
mergeStep: "preparing-work-agent",
|
|
2848
2275
|
mergeNotes: `Preparing work agent ${opts.agentId} to rebase ${opts.scopeNote}…`
|
|
@@ -3267,7 +2694,7 @@ async function reconcileGitHubMergeStatus(issueId, status) {
|
|
|
3267
2694
|
const prRef = parseGitHubPullRequestUrl(status.prUrl);
|
|
3268
2695
|
if (!prRef) return false;
|
|
3269
2696
|
try {
|
|
3270
|
-
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-
|
|
2697
|
+
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-BWziYCf3.js");
|
|
3271
2698
|
if (!isGitHubAppConfigured()) return false;
|
|
3272
2699
|
const prState = await Effect.runPromise(getPullRequestState(prRef.owner, prRef.repo, prRef.number));
|
|
3273
2700
|
console.log(`[merge] reconcileGitHubMergeStatus: ${issueId} PR #${prRef.number} merged=${prState.merged} state=${prState.state}`);
|
|
@@ -3317,24 +2744,28 @@ async function ensurePRExists(issueId, options) {
|
|
|
3317
2744
|
const targetBranch = options?.targetBranch ?? "main";
|
|
3318
2745
|
const execOptions = { encoding: "utf-8" };
|
|
3319
2746
|
if (options?.cwd) execOptions.cwd = options.cwd;
|
|
3320
|
-
let existingOut = "";
|
|
3321
2747
|
try {
|
|
3322
2748
|
const { stdout } = await execFileAsync$4("gh", [
|
|
3323
2749
|
"pr",
|
|
3324
|
-
"
|
|
2750
|
+
"list",
|
|
2751
|
+
"--head",
|
|
3325
2752
|
branchName,
|
|
2753
|
+
"--base",
|
|
2754
|
+
targetBranch,
|
|
2755
|
+
"--state",
|
|
2756
|
+
"all",
|
|
3326
2757
|
"--json",
|
|
3327
|
-
"url",
|
|
3328
|
-
"--
|
|
3329
|
-
"
|
|
2758
|
+
"url,state",
|
|
2759
|
+
"--limit",
|
|
2760
|
+
"100"
|
|
3330
2761
|
], execOptions);
|
|
3331
|
-
|
|
2762
|
+
const pullRequests = JSON.parse(String(stdout));
|
|
2763
|
+
const existing = pullRequests.find((pr) => pr.state === "OPEN") ?? pullRequests.find((pr) => pr.state === "MERGED");
|
|
2764
|
+
if (existing?.url) return {
|
|
2765
|
+
created: false,
|
|
2766
|
+
prUrl: existing.url
|
|
2767
|
+
};
|
|
3332
2768
|
} catch {}
|
|
3333
|
-
const existing = existingOut.trim();
|
|
3334
|
-
if (existing) return {
|
|
3335
|
-
created: false,
|
|
3336
|
-
prUrl: existing
|
|
3337
|
-
};
|
|
3338
2769
|
const prBody = options?.cwd ? await buildRichPRBody(issueId, options.cwd) : `Automated PR for ${issueId}`;
|
|
3339
2770
|
const { tmpdir } = await import("os");
|
|
3340
2771
|
const { join: pathJoin } = await import("path");
|
|
@@ -3534,8 +2965,8 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
3534
2965
|
try {
|
|
3535
2966
|
if (request.kind === "normal" && workspaceInfo.isRemote && workspaceInfo.vmName) {
|
|
3536
2967
|
console.log(`[merge] Remote workspace detected for ${issueId}, using review artifact merge...`);
|
|
3537
|
-
const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-
|
|
3538
|
-
const { getForgeAdapter } = await import("./forge-
|
|
2968
|
+
const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-CVfEM57p.js");
|
|
2969
|
+
const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
|
|
3539
2970
|
const remotePrimaryRepo = (getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId))?.repos[0];
|
|
3540
2971
|
const remoteTargetBranch = remotePrimaryRepo?.targetBranch || "main";
|
|
3541
2972
|
const remoteForge = remotePrimaryRepo?.forge || "github";
|
|
@@ -3571,7 +3002,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
3571
3002
|
...mergeCompletionStatus(request)
|
|
3572
3003
|
});
|
|
3573
3004
|
completePendingOperation(issueId, null);
|
|
3574
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
3005
|
+
const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
|
|
3575
3006
|
await postMergeLifecycle(issueId, projectPath);
|
|
3576
3007
|
return {
|
|
3577
3008
|
success: true,
|
|
@@ -3616,11 +3047,11 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
3616
3047
|
}
|
|
3617
3048
|
if (isPolyrepo && projectConfig?.workspace?.repos) {
|
|
3618
3049
|
console.log(`[merge] Polyrepo detected for ${issueId}, coordinating merge set...`);
|
|
3619
|
-
const { getMergeSetSync, ensureMergeSetForIssueSync, upsertMergeSetSync, withRepoStateSync } = await import("./merge-set-
|
|
3620
|
-
const { runQualityGates } = await import("./validation-
|
|
3621
|
-
const { reconcileStrandedRepos } = await import("./merge-completeness-
|
|
3622
|
-
const { getForgeAdapter } = await import("./forge-
|
|
3623
|
-
const { messageAgent } = await import("./agents-
|
|
3050
|
+
const { getMergeSetSync, ensureMergeSetForIssueSync, upsertMergeSetSync, withRepoStateSync } = await import("./merge-set-CVfEM57p.js");
|
|
3051
|
+
const { runQualityGates } = await import("./validation-nSrYiYvA.js");
|
|
3052
|
+
const { reconcileStrandedRepos } = await import("./merge-completeness-CoLJxfUY.js");
|
|
3053
|
+
const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
|
|
3054
|
+
const { messageAgent } = await import("./agents-DixZjXWm.js");
|
|
3624
3055
|
let mergeSet = getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId);
|
|
3625
3056
|
if (!mergeSet) {
|
|
3626
3057
|
const error = `No merge set found for ${issueId}`;
|
|
@@ -3678,7 +3109,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
3678
3109
|
...mergeCompletionStatus(request)
|
|
3679
3110
|
});
|
|
3680
3111
|
completePendingOperation(issueId, null);
|
|
3681
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
3112
|
+
const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
|
|
3682
3113
|
advanceQueue();
|
|
3683
3114
|
await postMergeLifecycle(issueId, projectPath);
|
|
3684
3115
|
return {
|
|
@@ -3932,7 +3363,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
3932
3363
|
...mergeCompletionStatus(request)
|
|
3933
3364
|
});
|
|
3934
3365
|
completePendingOperation(issueId, null);
|
|
3935
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
3366
|
+
const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
|
|
3936
3367
|
advanceQueue();
|
|
3937
3368
|
await postMergeLifecycle(issueId, projectPath);
|
|
3938
3369
|
return {
|
|
@@ -3943,8 +3374,8 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
3943
3374
|
repos: mergeResults
|
|
3944
3375
|
};
|
|
3945
3376
|
}
|
|
3946
|
-
const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-
|
|
3947
|
-
const { getForgeAdapter } = await import("./forge-
|
|
3377
|
+
const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-CVfEM57p.js");
|
|
3378
|
+
const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
|
|
3948
3379
|
const primaryRepo = (getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId))?.repos[0];
|
|
3949
3380
|
const targetBranch = primaryRepo?.targetBranch || "main";
|
|
3950
3381
|
const primaryForge = primaryRepo?.forge || "github";
|
|
@@ -3987,7 +3418,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
3987
3418
|
}
|
|
3988
3419
|
let preMergePrState;
|
|
3989
3420
|
if (githubPrRef) try {
|
|
3990
|
-
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-
|
|
3421
|
+
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-BWziYCf3.js");
|
|
3991
3422
|
if (isGitHubAppConfigured()) {
|
|
3992
3423
|
const prState = await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number));
|
|
3993
3424
|
preMergePrState = prState;
|
|
@@ -4050,7 +3481,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
4050
3481
|
...mergeCompletionStatus(request)
|
|
4051
3482
|
});
|
|
4052
3483
|
completePendingOperation(issueId, null);
|
|
4053
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
3484
|
+
const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
|
|
4054
3485
|
await postMergeLifecycle(issueId, projectPath, branchName);
|
|
4055
3486
|
return {
|
|
4056
3487
|
success: true,
|
|
@@ -4064,8 +3495,8 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
4064
3495
|
} catch (prStateErr) {
|
|
4065
3496
|
console.warn(`[merge] Pre-merge PR state check failed for ${issueId}: ${prStateErr.message} — proceeding (check is best-effort)`);
|
|
4066
3497
|
}
|
|
4067
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
4068
|
-
const { beginShipLog, appendShipLog } = await import("./ship-log-
|
|
3498
|
+
const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
|
|
3499
|
+
const { beginShipLog, appendShipLog } = await import("./ship-log-D-CphNZx.js");
|
|
4069
3500
|
let rebaseResult;
|
|
4070
3501
|
if (preMergePrState?.mergeable === true && preMergePrState.mergeableState === "clean" && !preMergePrState.checksFailed && !preMergePrState.checksPending && !preMergePrState.draft && !preMergePrState.merged) {
|
|
4071
3502
|
console.log(`[merge] PR is CLEAN — merging directly without rebase for ${issueId}`);
|
|
@@ -4174,7 +3605,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
4174
3605
|
});
|
|
4175
3606
|
let skipLocalVerification = false;
|
|
4176
3607
|
if (primaryForge === "github" && artifactUrl) try {
|
|
4177
|
-
const { parsePullRequestRef, getCiCheckRunsStatePromise, isGitHubAppConfigured } = await import("./github-app-
|
|
3608
|
+
const { parsePullRequestRef, getCiCheckRunsStatePromise, isGitHubAppConfigured } = await import("./github-app-BWziYCf3.js");
|
|
4178
3609
|
if (isGitHubAppConfigured()) {
|
|
4179
3610
|
const ref = parsePullRequestRef({ url: artifactUrl });
|
|
4180
3611
|
if (ref) {
|
|
@@ -4199,7 +3630,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
4199
3630
|
const verifyResult = skipLocalVerification ? { outcome: "passed" } : await (async () => {
|
|
4200
3631
|
console.log(`[merge] Running post-rebase verification for ${issueId}...`);
|
|
4201
3632
|
appendShipLog(issueId, "Running post-rebase verification (full quality-gate suite)…", "verifying");
|
|
4202
|
-
const { runVerificationForIssue } = await import("./verification-runner-
|
|
3633
|
+
const { runVerificationForIssue } = await import("./verification-runner-CFjAuv9u.js");
|
|
4203
3634
|
return Effect.runPromise(runVerificationForIssue(issueId, workspacePath, { isRemote: false }, "merge-verify", {
|
|
4204
3635
|
...mergeVerificationOptions(request),
|
|
4205
3636
|
onGateLog: (line) => appendShipLog(issueId, line, "verifying")
|
|
@@ -4244,7 +3675,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
4244
3675
|
if (skipLocalVerification) await recordCiGreenVerificationVerdict(issueId, workspacePath);
|
|
4245
3676
|
setReviewStatus(issueId, { mergeStep: "reporting-statuses" });
|
|
4246
3677
|
try {
|
|
4247
|
-
const { getPullRequestState, isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-
|
|
3678
|
+
const { getPullRequestState, isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-BWziYCf3.js");
|
|
4248
3679
|
if (githubPrRef && isGitHubAppConfigured()) {
|
|
4249
3680
|
const sha = (await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number))).headSha.trim();
|
|
4250
3681
|
if (sha) {
|
|
@@ -4272,7 +3703,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
|
|
|
4272
3703
|
} catch (prMergeErr) {
|
|
4273
3704
|
console.error(`[merge] Review artifact merge threw for ${issueId}:`, prMergeErr);
|
|
4274
3705
|
try {
|
|
4275
|
-
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-
|
|
3706
|
+
const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-BWziYCf3.js");
|
|
4276
3707
|
if (githubPrRef && isGitHubAppConfigured()) {
|
|
4277
3708
|
artifactMerged = (await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number))).merged;
|
|
4278
3709
|
if (artifactMerged) console.log(`[merge] Race-detected: PR #${githubPrRef.number} for ${issueId} was already merged despite thrown error; proceeding`);
|
|
@@ -4391,8 +3822,8 @@ const postForgeApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge
|
|
|
4391
3822
|
if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
4392
3823
|
if (!/^[A-Z]+-\d+$/i.test(issueId)) return jsonResponse({ error: "Invalid issue ID format" }, { status: 400 });
|
|
4393
3824
|
return yield* Effect.promise(async () => {
|
|
4394
|
-
const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-
|
|
4395
|
-
const { getForgeAdapter } = await import("./forge-
|
|
3825
|
+
const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-CVfEM57p.js");
|
|
3826
|
+
const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
|
|
4396
3827
|
let mergeSet = getMergeSetSync(issueId);
|
|
4397
3828
|
if (!mergeSet) return jsonResponse({ error: `No merge set found for ${issueId}` }, { status: 404 });
|
|
4398
3829
|
const results = [];
|
|
@@ -4453,7 +3884,7 @@ const postForgeApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge
|
|
|
4453
3884
|
}
|
|
4454
3885
|
}
|
|
4455
3886
|
if (results.filter((r) => r.approved).length > 0) {
|
|
4456
|
-
const { emitActivityEntrySync, emitActivityTtsSync } = await import("./activity-logger-
|
|
3887
|
+
const { emitActivityEntrySync, emitActivityTtsSync } = await import("./activity-logger-B0X2JJwM.js");
|
|
4457
3888
|
emitActivityEntrySync({
|
|
4458
3889
|
source: "dashboard",
|
|
4459
3890
|
level: "success",
|
|
@@ -4480,9 +3911,9 @@ const postForgeMergeRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge-m
|
|
|
4480
3911
|
if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
4481
3912
|
if (!/^[A-Z]+-\d+$/i.test(issueId)) return jsonResponse({ error: "Invalid issue ID format" }, { status: 400 });
|
|
4482
3913
|
return yield* Effect.promise(async () => {
|
|
4483
|
-
const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-
|
|
4484
|
-
const { getForgeAdapter } = await import("./forge-
|
|
4485
|
-
const { assessRepoMergeCompleteness } = await import("./merge-completeness-
|
|
3914
|
+
const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-CVfEM57p.js");
|
|
3915
|
+
const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
|
|
3916
|
+
const { assessRepoMergeCompleteness } = await import("./merge-completeness-CoLJxfUY.js");
|
|
4486
3917
|
let mergeSet = getMergeSetSync(issueId);
|
|
4487
3918
|
if (!mergeSet) return jsonResponse({ error: `No merge set found for ${issueId}` }, { status: 404 });
|
|
4488
3919
|
const results = [];
|
|
@@ -4560,7 +3991,7 @@ const postForgeMergeRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge-m
|
|
|
4560
3991
|
}
|
|
4561
3992
|
}
|
|
4562
3993
|
if (results.filter((r) => r.merged).length > 0) {
|
|
4563
|
-
const { emitActivityEntrySync, emitActivityTtsSync } = await import("./activity-logger-
|
|
3994
|
+
const { emitActivityEntrySync, emitActivityTtsSync } = await import("./activity-logger-B0X2JJwM.js");
|
|
4564
3995
|
emitActivityEntrySync({
|
|
4565
3996
|
source: "dashboard",
|
|
4566
3997
|
level: "success",
|
|
@@ -4685,7 +4116,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
|
|
|
4685
4116
|
console.log(`[approve] Starting role pipeline for ${issueId}...`);
|
|
4686
4117
|
let reviewResult;
|
|
4687
4118
|
try {
|
|
4688
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
4119
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
|
|
4689
4120
|
reviewResult = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
4690
4121
|
issueId,
|
|
4691
4122
|
workspace: workspacePath,
|
|
@@ -4732,7 +4163,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
|
|
|
4732
4163
|
}
|
|
4733
4164
|
console.log(`[approve] Step 3/3: Running server-side rebase for ${issueId}...`);
|
|
4734
4165
|
try {
|
|
4735
|
-
const { rebaseFeatureBranch } = await import("./merge-rebase-
|
|
4166
|
+
const { rebaseFeatureBranch } = await import("./merge-rebase-Bj7eJAG4.js");
|
|
4736
4167
|
const workspacePathForRebase = join(projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
|
|
4737
4168
|
const rebaseResult = await Effect.runPromise(rebaseFeatureBranch(workspacePathForRebase, branchName, "main", issueId));
|
|
4738
4169
|
if (!rebaseResult.success) {
|
|
@@ -4752,7 +4183,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
|
|
|
4752
4183
|
completePendingOperation(issueId, pushResult.error);
|
|
4753
4184
|
return jsonResponse({ error: pushResult.error }, { status: pushResult.httpStatus });
|
|
4754
4185
|
}
|
|
4755
|
-
const { approve: lifecycleApprove } = await import("./lifecycle-
|
|
4186
|
+
const { approve: lifecycleApprove } = await import("./lifecycle-DDZ7w-BY.js");
|
|
4756
4187
|
const ghResolved = resolveGitHubIssueSync(issueId);
|
|
4757
4188
|
const isGitHubIssueFlag = ghResolved.isGitHub;
|
|
4758
4189
|
const lifecycleCtx = {
|
|
@@ -4786,7 +4217,7 @@ const getMergeQueueRoute = HttpRouter.add("GET", "/api/merge-queue", httpHandler
|
|
|
4786
4217
|
})));
|
|
4787
4218
|
const postInternalPipelineNotifyRoute = HttpRouter.add("POST", "/api/internal/pipeline/notify", httpHandler(Effect.gen(function* () {
|
|
4788
4219
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
4789
|
-
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-
|
|
4220
|
+
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-BCTEqUCX.js"));
|
|
4790
4221
|
const expected = getInternalTokenSync();
|
|
4791
4222
|
if (!expected) return jsonResponse({
|
|
4792
4223
|
ok: false,
|
|
@@ -4800,7 +4231,7 @@ const postInternalPipelineNotifyRoute = HttpRouter.add("POST", "/api/internal/pi
|
|
|
4800
4231
|
}, 403);
|
|
4801
4232
|
const event = yield* readJsonBody;
|
|
4802
4233
|
const type = event.type;
|
|
4803
|
-
const { notifyPipelineSync } = yield* Effect.promise(() => import("./pipeline-notifier-
|
|
4234
|
+
const { notifyPipelineSync } = yield* Effect.promise(() => import("./pipeline-notifier-B5DPXvnr.js"));
|
|
4804
4235
|
switch (type) {
|
|
4805
4236
|
case "status_changed": {
|
|
4806
4237
|
const issueId = event.issueId;
|
|
@@ -5607,7 +5038,7 @@ const patchWorkspaceTieredExecutionRoute = HttpRouter.add("PATCH", "/api/workspa
|
|
|
5607
5038
|
if (override !== "on" && override !== "off" && override !== null && override !== void 0) return jsonResponse({ error: "Invalid tiered-execution override" }, { status: 400 });
|
|
5608
5039
|
const project = getProjectSync(extractPrefixSync(issueId) ?? issueId.split("-")[0]);
|
|
5609
5040
|
if (!project) return jsonResponse({ error: "Project not found" }, { status: 404 });
|
|
5610
|
-
yield* Effect.promise(() => import("./record-
|
|
5041
|
+
yield* Effect.promise(() => import("./record-DYOg97Iv.js").then((m) => m.writeRecordTieredExecutionOverride(project, issueId, override)));
|
|
5611
5042
|
const projectPath = project.path;
|
|
5612
5043
|
const location = yield* resolvePlanLocation(projectPath, issueId);
|
|
5613
5044
|
if (!location) return jsonResponse({ error: "No xBRIEF plan found for this workspace" }, { status: 404 });
|
|
@@ -6022,7 +5453,7 @@ async function startDashboardDurableReviewPipeline(input, dependencies) {
|
|
|
6022
5453
|
});
|
|
6023
5454
|
if (!result.success) {
|
|
6024
5455
|
setReviewPending({
|
|
6025
|
-
reviewStatus: "
|
|
5456
|
+
reviewStatus: "failed",
|
|
6026
5457
|
reviewNotes: result.error || result.message || "Failed to dispatch review"
|
|
6027
5458
|
});
|
|
6028
5459
|
return;
|
|
@@ -6209,7 +5640,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
|
|
|
6209
5640
|
}
|
|
6210
5641
|
if (!workspaceInfo.exists) return jsonResponse({ error: "Workspace does not exist" }, { status: 400 });
|
|
6211
5642
|
const reviewModeProject = requestedReviewMode.mode === void 0 ? null : yield* Effect.promise(async () => {
|
|
6212
|
-
const { resolveProjectForIssue } = await import("./record-
|
|
5643
|
+
const { resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
|
|
6213
5644
|
return resolveProjectForIssue(issueId);
|
|
6214
5645
|
});
|
|
6215
5646
|
if (requestedReviewMode.mode !== void 0 && !reviewModeProject) return jsonResponse({ error: `No project configured for ${issueId}` }, { status: 500 });
|
|
@@ -6246,7 +5677,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
|
|
|
6246
5677
|
}
|
|
6247
5678
|
if (requestedReviewMode.mode !== void 0 && reviewModeProject) {
|
|
6248
5679
|
const persistenceError = yield* Effect.promise(async () => {
|
|
6249
|
-
const { updateIssueRecord } = await import("./record-update-
|
|
5680
|
+
const { updateIssueRecord } = await import("./record-update-CDPEX7BH.js");
|
|
6250
5681
|
await updateIssueRecord(reviewModeProject, issueId, (record) => {
|
|
6251
5682
|
record.reviewMode = requestedReviewMode.mode;
|
|
6252
5683
|
});
|
|
@@ -6275,7 +5706,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
|
|
|
6275
5706
|
console.log(`Feature branch push note: ${errorMessage(pushErr)}`);
|
|
6276
5707
|
}
|
|
6277
5708
|
try {
|
|
6278
|
-
const { createReviewArtifactsForIssue } = await import("./review-artifacts-
|
|
5709
|
+
const { createReviewArtifactsForIssue } = await import("./review-artifacts-DgaDlbO4.js");
|
|
6279
5710
|
const artifactResult = await Effect.runPromise(createReviewArtifactsForIssue(issueId, workspacePath));
|
|
6280
5711
|
const primaryArtifact = artifactResult.mergeSet?.repos.find((repo) => !!repo.artifactUrl);
|
|
6281
5712
|
artifactResult.mergeSet?.repos.find((repo) => repo.mergeStatus !== "skipped")?.targetBranch;
|
|
@@ -6335,7 +5766,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
|
|
|
6335
5766
|
completePendingOperation(issueId, verifyOutcome.reason);
|
|
6336
5767
|
return;
|
|
6337
5768
|
}
|
|
6338
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
5769
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
|
|
6339
5770
|
const prUrl = getReviewStatusSync(issueId)?.prUrl;
|
|
6340
5771
|
const reviewResult = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
6341
5772
|
issueId,
|
|
@@ -6471,7 +5902,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
|
|
|
6471
5902
|
console.log(`[request-review] Feature branch push note: ${errorMessage(pushErr)}`);
|
|
6472
5903
|
}
|
|
6473
5904
|
const prUrl = getReviewStatusSync(issueId)?.prUrl;
|
|
6474
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
5905
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
|
|
6475
5906
|
const result = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
6476
5907
|
issueId,
|
|
6477
5908
|
workspace: workspacePathRerun,
|
|
@@ -6521,7 +5952,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
|
|
|
6521
5952
|
});
|
|
6522
5953
|
} else {
|
|
6523
5954
|
const workspacePath = join(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
|
|
6524
|
-
const { spawnRun } = yield* Effect.promise(() => import("./agents-
|
|
5955
|
+
const { spawnRun } = yield* Effect.promise(() => import("./agents-DixZjXWm.js"));
|
|
6525
5956
|
try {
|
|
6526
5957
|
const testRun = yield* Effect.promise(() => spawnRun(issueId, "test", { workspace: workspacePath }));
|
|
6527
5958
|
setReviewStatus(issueId, { testStatus: "testing" });
|
|
@@ -6636,7 +6067,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
|
|
|
6636
6067
|
testStatus: "pending",
|
|
6637
6068
|
reviewNotes
|
|
6638
6069
|
});
|
|
6639
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
6070
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
|
|
6640
6071
|
const result = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
6641
6072
|
issueId,
|
|
6642
6073
|
workspace: workspacePath,
|
|
@@ -6986,7 +6417,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
|
|
|
6986
6417
|
const result = processResetReviewPipeline(issueId, resetWorkspace.exists);
|
|
6987
6418
|
if (result.httpStatus !== 200) return jsonResponse(result.body, { status: result.httpStatus });
|
|
6988
6419
|
try {
|
|
6989
|
-
const { resetPostMergeState } = yield* Effect.promise(() => import("./merge-agent-
|
|
6420
|
+
const { resetPostMergeState } = yield* Effect.promise(() => import("./merge-agent-D-4_iQgy.js"));
|
|
6990
6421
|
resetPostMergeState(issueId);
|
|
6991
6422
|
} catch (err) {
|
|
6992
6423
|
console.warn(`[reset-review] resetPostMergeState best-effort failed for ${issueId}:`, err);
|
|
@@ -6995,7 +6426,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
|
|
|
6995
6426
|
const rerun = body?.rerun === true;
|
|
6996
6427
|
if (rerun) try {
|
|
6997
6428
|
yield* Effect.promise(async () => {
|
|
6998
|
-
const { spawnReviewRoleForIssue } = await import("./review-agent-
|
|
6429
|
+
const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
|
|
6999
6430
|
const dispatchArgs = buildReviewRedispatchArgs(issueId, resetWorkspace, workspaceInfo, resolved);
|
|
7000
6431
|
if (dispatchArgs) {
|
|
7001
6432
|
const result = await Effect.runPromise(spawnReviewRoleForIssue({
|
|
@@ -7030,7 +6461,7 @@ const postReviewResyncRoute = HttpRouter.add("POST", "/api/review/:issueId/resyn
|
|
|
7030
6461
|
const postWorkspaceReviewPurgeRoute = HttpRouter.add("POST", "/api/review/:issueId/purge", httpHandler(Effect.gen(function* () {
|
|
7031
6462
|
const issueId = (yield* HttpRouter.params)["issueId"] ?? "";
|
|
7032
6463
|
if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
7033
|
-
const { purgeReviewAgentsForIssue } = yield* Effect.promise(() => import("./review-agent-
|
|
6464
|
+
const { purgeReviewAgentsForIssue } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
|
|
7034
6465
|
const projectKey = resolveProjectFromIssueSync(issueId)?.projectKey;
|
|
7035
6466
|
const purge = yield* Effect.promise(() => purgeReviewAgentsForIssue(projectKey, issueId));
|
|
7036
6467
|
const workspaceInfo = getWorkspaceInfoForIssue(issueId);
|
|
@@ -7060,8 +6491,8 @@ const postWorkspaceAbortReviewRoute = HttpRouter.add("POST", "/api/review/:issue
|
|
|
7060
6491
|
success: false,
|
|
7061
6492
|
error: "Workspace does not exist"
|
|
7062
6493
|
}, { status: 400 });
|
|
7063
|
-
const { resolveProjectFromIssueSync } = yield* Effect.promise(() => import("./projects-
|
|
7064
|
-
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-
|
|
6494
|
+
const { resolveProjectFromIssueSync } = yield* Effect.promise(() => import("./projects-BMuEf14J.js"));
|
|
6495
|
+
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
|
|
7065
6496
|
const { killed, failed } = yield* killAllReviewerSessions(resolveProjectFromIssueSync(issueId)?.projectKey, issueId);
|
|
7066
6497
|
setReviewStatus(issueId, {
|
|
7067
6498
|
reviewStatus: "pending",
|
|
@@ -7134,8 +6565,8 @@ const getReviewConfigRoute = HttpRouter.add("GET", "/api/review/:issueId/config"
|
|
|
7134
6565
|
const issueId = ((yield* HttpRouter.params)["issueId"] ?? "").toUpperCase();
|
|
7135
6566
|
if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
7136
6567
|
return jsonResponse(yield* Effect.promise(async () => {
|
|
7137
|
-
const { readIssueRecordSync, resolveProjectForIssue } = await import("./record-
|
|
7138
|
-
const { resolveReviewMode } = await import("./review-agent-
|
|
6568
|
+
const { readIssueRecordSync, resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
|
|
6569
|
+
const { resolveReviewMode } = await import("./review-agent-Caodi0PX.js");
|
|
7139
6570
|
const project = resolveProjectForIssue(issueId);
|
|
7140
6571
|
const record = project ? readIssueRecordSync(project, issueId) : null;
|
|
7141
6572
|
return {
|
|
@@ -7166,9 +6597,9 @@ const postReviewConfigRoute = HttpRouter.add("POST", "/api/review/:issueId/confi
|
|
|
7166
6597
|
return jsonResponse({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
|
|
7167
6598
|
}
|
|
7168
6599
|
return jsonResponse(yield* Effect.promise(async () => {
|
|
7169
|
-
const { resolveProjectForIssue } = await import("./record-
|
|
7170
|
-
const { updateIssueRecord } = await import("./record-update-
|
|
7171
|
-
const { resolveReviewMode } = await import("./review-agent-
|
|
6600
|
+
const { resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
|
|
6601
|
+
const { updateIssueRecord } = await import("./record-update-CDPEX7BH.js");
|
|
6602
|
+
const { resolveReviewMode } = await import("./review-agent-Caodi0PX.js");
|
|
7172
6603
|
const record = await updateIssueRecord(resolveProjectForIssue(issueId), issueId, (current) => {
|
|
7173
6604
|
if (hasMode) if (body.reviewMode === null) delete current.reviewMode;
|
|
7174
6605
|
else current.reviewMode = body.reviewMode;
|
|
@@ -7595,7 +7026,7 @@ async function readWorkspacePlanningMarkdown(issueId, fileName) {
|
|
|
7595
7026
|
*/
|
|
7596
7027
|
async function readWorkspaceContinueFile(_projectPath, workspacePath, issueId) {
|
|
7597
7028
|
try {
|
|
7598
|
-
const { readRecordContinueViewSync, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-
|
|
7029
|
+
const { readRecordContinueViewSync, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
|
|
7599
7030
|
const recordView = readRecordContinueViewSync(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId);
|
|
7600
7031
|
return recordView ? JSON.stringify(recordView, null, 2) : null;
|
|
7601
7032
|
} catch {
|
|
@@ -8375,7 +7806,7 @@ const getWorkspaceReviewStatusRoute = HttpRouter.add("GET", "/api/review/:issueI
|
|
|
8375
7806
|
if (queuePosition === null) try {
|
|
8376
7807
|
const resolved = resolveProjectFromIssueSync(issueId);
|
|
8377
7808
|
if (resolved) {
|
|
8378
|
-
const { getQueueForProject } = yield* Effect.promise(() => import("./merge-
|
|
7809
|
+
const { getQueueForProject } = yield* Effect.promise(() => import("./merge-DOCR6pHi.js"));
|
|
8379
7810
|
const mergePos = findPositionInQueueSync(issueId, getQueueForProject(resolved.projectKey).map((e) => ({
|
|
8380
7811
|
id: String(e.id),
|
|
8381
7812
|
type: "task",
|
|
@@ -8415,7 +7846,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
|
|
|
8415
7846
|
const workspaceInfo = getWorkspaceInfoForIssue(issueId);
|
|
8416
7847
|
if (workspaceInfo.exists && workspaceInfo.localPath) {
|
|
8417
7848
|
const localPath = workspaceInfo.localPath;
|
|
8418
|
-
const { snapshotWorkspaceHeadsPromise } = yield* Effect.promise(() => import("./git-utils-
|
|
7849
|
+
const { snapshotWorkspaceHeadsPromise } = yield* Effect.promise(() => import("./git-utils-BAMwn9Nf.js"));
|
|
8419
7850
|
try {
|
|
8420
7851
|
const headAnchor = yield* Effect.promise(() => snapshotWorkspaceHeadsPromise(issueId, localPath));
|
|
8421
7852
|
if (headAnchor) update.reviewedAtCommit = headAnchor;
|
|
@@ -8432,7 +7863,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
|
|
|
8432
7863
|
if (verificationStatus) update.verificationStatus = verificationStatus;
|
|
8433
7864
|
if (readyForMerge !== void 0) update.readyForMerge = readyForMerge;
|
|
8434
7865
|
const status = setReviewStatus(issueId, update);
|
|
8435
|
-
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
7866
|
+
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
8436
7867
|
const projectKey = resolveProjectFromIssueSync(issueId)?.projectKey;
|
|
8437
7868
|
if (reviewStatus && [
|
|
8438
7869
|
"passed",
|
|
@@ -8450,7 +7881,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
|
|
|
8450
7881
|
const agentId = `agent-${issueId.toLowerCase()}`;
|
|
8451
7882
|
const feedbackBody = `CODE REVIEW ${reviewStatus.toUpperCase()} for ${issueId}:\n\n${reviewNotes}\n\n## REQUIRED: Fix ALL issues above, then invoke the /rebase-and-submit skill\n\n1. Read each blocking issue carefully\n2. Fix the code for EVERY issue listed\n3. Run tests locally to verify your fixes\n4. Commit every change\n5. Invoke the /rebase-and-submit skill for ${issueId} — this is an atomic task that runs pan done (which handles rebase + push + re-submit internally)\n\nDo NOT stop between steps. Do NOT run git push manually — the skill handles it. Do NOT stop until pan done has completed successfully.`;
|
|
8452
7883
|
yield* Effect.gen(function* () {
|
|
8453
|
-
const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-
|
|
7884
|
+
const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-BzN4qvaP.js"));
|
|
8454
7885
|
const fileResult = yield* writeFeedbackFile({
|
|
8455
7886
|
issueId,
|
|
8456
7887
|
workspacePath: getWorkspaceInfoForIssue(issueId).localPath,
|
|
@@ -8513,7 +7944,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
|
|
|
8513
7944
|
const agentId = `agent-${issueId.toLowerCase()}`;
|
|
8514
7945
|
const feedbackBody = `TESTS FAILED for ${issueId}:\n\n${testNotes}\n\n## REQUIRED: Fix ALL test failures, then invoke the /rebase-and-submit skill\n\n1. Read each test failure carefully\n2. Fix the code causing EVERY failure\n3. Run the test suite locally to verify your fixes pass\n4. Commit every change\n5. Invoke the /rebase-and-submit skill for ${issueId} — this is an atomic task that runs pan done (which handles rebase + push + re-submit internally)\n\nDo NOT stop between steps. Do NOT run git push manually — the skill handles it. Do NOT stop until pan done has completed successfully.`;
|
|
8515
7946
|
yield* Effect.gen(function* () {
|
|
8516
|
-
const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-
|
|
7947
|
+
const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-BzN4qvaP.js"));
|
|
8517
7948
|
const fileResult = yield* writeFeedbackFile({
|
|
8518
7949
|
issueId,
|
|
8519
7950
|
workspacePath: getWorkspaceInfoForIssue(issueId).localPath,
|
|
@@ -8546,14 +7977,14 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
|
|
|
8546
7977
|
} else console.log(`[review-status] ${issueId} automated tests passed, but another gate remains unresolved (uat=${status.uatStatus ?? "not-required"})`);
|
|
8547
7978
|
yield* Effect.promise(async () => {
|
|
8548
7979
|
try {
|
|
8549
|
-
const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-
|
|
7980
|
+
const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-BMuEf14J.js");
|
|
8550
7981
|
const project = resolveProjectFromIssueSync(issueId);
|
|
8551
7982
|
const repo = (project ? getProjectSync(project.projectKey) : null)?.github_repo;
|
|
8552
7983
|
if (!repo || !repo.includes("/")) return;
|
|
8553
7984
|
const [owner, name] = repo.split("/");
|
|
8554
7985
|
const wsInfo = getWorkspaceInfoForIssue(issueId);
|
|
8555
7986
|
if (!wsInfo?.localPath) return;
|
|
8556
|
-
const { postOverdeckTestsStatus } = await import("./github-app-
|
|
7987
|
+
const { postOverdeckTestsStatus } = await import("./github-app-BWziYCf3.js");
|
|
8557
7988
|
await postOverdeckTestsStatus(wsInfo.localPath, owner, name, "success", "Test specialist passed");
|
|
8558
7989
|
} catch (err) {
|
|
8559
7990
|
console.warn(`[review-status] Failed to post overdeck/tests for ${issueId}: ${err.message}`);
|
|
@@ -8597,7 +8028,7 @@ const postWorkspaceRefreshTokenRoute = HttpRouter.add("POST", "/api/workspaces/:
|
|
|
8597
8028
|
if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
|
|
8598
8029
|
const issueLower = issueId.toLowerCase();
|
|
8599
8030
|
const workspacePath = join(getProjectPath(void 0, extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`);
|
|
8600
|
-
const { refreshWorkspaceToken, isGitHubAppConfigured } = yield* Effect.promise(() => import("./github-app-
|
|
8031
|
+
const { refreshWorkspaceToken, isGitHubAppConfigured } = yield* Effect.promise(() => import("./github-app-BWziYCf3.js"));
|
|
8601
8032
|
if (!isGitHubAppConfigured()) return jsonResponse({
|
|
8602
8033
|
success: false,
|
|
8603
8034
|
error: "GitHub App not configured"
|
|
@@ -8617,6 +8048,6 @@ const postWorkspaceRefreshTokenRoute = HttpRouter.add("POST", "/api/workspaces/:
|
|
|
8617
8048
|
})));
|
|
8618
8049
|
const workspacesRouteLayer = Layer.mergeAll(workspaceDataRouteLayer, postWorkspaceRebuildRoute, postWorkspaceRebuildAndStartRoute, uatStackActionRouteLayer, getWorkspaceStateMdRoute, getWorkspaceInferenceMdRoute, stashCleanRouteLayer, containerOpsRouteLayer, postWorkspaceStartRoute, getWorkspaceReviewStatusRoute, postWorkspaceReviewStatusRoute, reviewPipelineRouteLayer, reviewControlRouteLayer, mergeOpsRouteLayer, postWorkspaceRefreshTokenRoute);
|
|
8619
8050
|
//#endregion
|
|
8620
|
-
export {
|
|
8051
|
+
export { startAgentOutputService as C, retainAgentOutputInterest as S, syncCacheSync as _, mergeOpsRouteLayer as a, resolveIssueHeadlineCost as b, shouldBlockApproveForDirtyStatus as c, eventsRouteLayer as d, resumeQueuedMerges as f, rebuildCacheSync as g, getCostsForIssueSync as h, isBranchAlreadyRebased as i, triggerMerge as l, migrateAllSessionsSync as m, buildRichPRBody as n, pushApproveMain as o, syncWalFromAllProjects as p, ensurePRExists as r, reconcileGitHubMergeStatus as s, workspacesRouteLayer as t, internalEventsRouteLayer as u, processPendingFeedbackDeliveries as v, stopAgentOutputService as w, getWorkspacePathForIssue as x, getCachedRunningAgents as y };
|
|
8621
8052
|
|
|
8622
|
-
//# sourceMappingURL=workspaces-
|
|
8053
|
+
//# sourceMappingURL=workspaces-C7LAuZfe.js.map
|