@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,58 +1,60 @@
|
|
|
1
1
|
import { a as __toCommonJS } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import { $
|
|
3
|
-
import { c as getDashboardLoopbackApiUrlSync, p as init_config } from "./config-
|
|
4
|
-
import {
|
|
5
|
-
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-
|
|
6
|
-
import {
|
|
7
|
-
import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-
|
|
8
|
-
import { a as init_event_store, n as getEventStore } from "./event-store-
|
|
9
|
-
import { N as normalizeChannelReplyPayload, T as DomainEvent, n as COMPOSER_COMMAND_MANIFEST, s as getHarnessBehavior, t as init_src } from "./src-
|
|
10
|
-
import { f as init_agent_state_sync, h as stateToOverdeckParamsForDb, u as AGENT_COLUMNS_FOR_DB } from "./pipeline-agent-reader-
|
|
11
|
-
import {
|
|
12
|
-
import { c as init_agents, g as logAgentLifecycleSync, h as init_persistent_logger, m as isTerminalIssueStage, p as getIssueStageSync } from "./agents-
|
|
13
|
-
import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-
|
|
14
|
-
import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import { a as
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import { a as
|
|
32
|
-
import {
|
|
33
|
-
import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-
|
|
34
|
-
import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-
|
|
35
|
-
import { i as issue_service_singleton_exports, n as init_issue_service_singleton } from "./issue-service-singleton-
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import { G as liveOrderIssueLookup, H as getBook, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import "./
|
|
43
|
-
import
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
47
|
-
import { t as
|
|
48
|
-
import {
|
|
49
|
-
import { t as
|
|
2
|
+
import { $t as findProjectByPathSync, Ai as encodeClaudeProjectDir, E as init_tier_table, Ft as isOverdeckWorkspaceRuntimePath, Gt as shouldCommitLegacyWorkspaceArtifacts, Hi as packageRoot, Ht as init_state_read_home, Kn as extractPrefixSync, Mt as init_state_plane, Nt as isGeneratedGitHookPath, O as resolveTieredExecutionEnabled, On as resolveProjectFromIssueSync, Or as resolveModel, Ri as getOverdeckHome, Rt as parsePorcelainStatusPaths, Ui as resolveOhmypiExtensionPath, Wt as resolveStateReadHomeSync, Yn as parseIssueIdSync, _n as listProjectsAsync, fn as init_projects, fr as getProviderForModelSync, g as jsYaml, h as init_js_yaml, k as resolveTieredExecutionEnabledForIssue, ki as claudeSessionTranscriptExists, l as isClaudeCodeChannelsEnabled, mr as piProviderForModel, on as getProjectSync, p as loadConfigSync, pr as init_providers, qn as init_issue_id, rr as init_harness_policy, sr as UnknownModelError, t as init_config_yaml, tr as canUseHarnessSync, zi as init_paths } from "./config-yaml-D60AnTIu.js";
|
|
3
|
+
import { c as getDashboardLoopbackApiUrlSync, p as init_config } from "./config-NxI9Yl2f.js";
|
|
4
|
+
import { l as init_activity_logger, o as emitActivityEntrySync, r as emitActivityEntryDurable } from "./activity-logger-SlTXYCVf.js";
|
|
5
|
+
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CJRi_5Wu.js";
|
|
6
|
+
import { $ as init_pane_choice_menu, C as init_tmux, E as killSession, G as setOption, H as sendRawKeystroke, K as tmuxExecAsync, N as listSessions, U as sessionExists, V as sendKeysAsync, W as sessionExistsSync, a as capturePaneText, ct as BLANKED_PROVIDER_ENV, dt as init_child_env, h as findManagedServerPidSync, j as listSessionNames, p as exactPaneTarget, r as capturePane, s as createSession, tt as paneHasBlockingChoiceMenu, ut as buildChildEnvWithoutTmuxSync, w as isHarnessProcessAlive } from "./tmux-wnT_hg-s.js";
|
|
7
|
+
import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-C2QKOf09.js";
|
|
8
|
+
import { a as init_event_store, n as getEventStore } from "./event-store-DTns2XZP.js";
|
|
9
|
+
import { N as normalizeChannelReplyPayload, T as DomainEvent, n as COMPOSER_COMMAND_MANIFEST, s as getHarnessBehavior, t as init_src } from "./src-CdwN6WY6.js";
|
|
10
|
+
import { f as init_agent_state_sync, h as stateToOverdeckParamsForDb, u as AGENT_COLUMNS_FOR_DB } from "./pipeline-agent-reader-CeWhQzXC.js";
|
|
11
|
+
import { c as ReadModelService, d as getClosedIssueIdsForReadSource, i as EventStoreService, t as IssueLifecycle } from "./issue-lifecycle-BETNVVLq.js";
|
|
12
|
+
import { c as init_agents, g as logAgentLifecycleSync, h as init_persistent_logger, m as isTerminalIssueStage, p as getIssueStageSync } from "./agents-DzpQidT8.js";
|
|
13
|
+
import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-ENa_hW_V.js";
|
|
14
|
+
import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-DTuIRE4y.js";
|
|
15
|
+
import { t as init_behavior } from "./behavior-DCg8CIWC.js";
|
|
16
|
+
import { $r as piFifoPaths, A as saveAgentStateSync, At as init_agent_input_detection, Br as getAgentRuntimeBaseCommand, Ci as writeChannelsBridgeMcpConfig, Ct as getAgentWorkspace$1, Di as writePtyToken, Dr as init_spawn_prep, Dt as scanPendingInputsPromise, Ei as init_pty_token, F as writeAgentStateJsonSync, Ft as resumeAgent, H as waitForReadySignal, It as answerSessionPaneChoice, K as saveAgentRuntimeState, Kt as init_operator_interventions, L as clearReadySignal, Lt as captureSessionPaneChoice, Mt as parseCodexApprovalPrompt, Nr as resolveIssueWorkModel, Oi as init_pty_supervisor_locate, Ot as detectAwaitingInputForAgent, P as wipeAgentStateDirs, Pr as resolveStaffing, Qr as init_pi_fifo, Qt as getSessionId, Rt as init_session_pane_choice, S as markAgentStoppedState, Si as init_supervisor_channels, St as getAgentPendingQuestions$1, Ti as init_resume_contract, Tt as isBlockedOnPendingInput, U as getAgentRuntimeState, Ut as messageAgent, W as getAgentRuntimeStateSync, Wr as getProviderAuthMode, Xr as waitForAcpHostReady, Xt as getLatestSessionId, Yt as getActivity, Zr as waitForPromptReady, Zt as getLatestSessionIdSync, _n as listAgentStates, _r as init_bridge_token, _t as init_pending_decision_gate, ar as deliverAgentMessage, bi as dismissDevChannelsDialog, br as checkCodexAuthStatus, c as clearAgentTroubled, ci as determineModel, ct as init_tier_escalation, ei as init_ohmypi_fifo, f as getAgentDir, fi as init_provider_health, fr as setAgentDeliveryMethod, g as getAgentStateSync, gr as BRIDGE_TOKEN_HEADER, gt as detectPendingOperatorDecision, ht as restartAgent, j as setAgentPaused, jr as init_staffing, jt as normalizeAwaitingInputPrompt, k as saveAgentState, ki as resolvePtySupervisorScriptPath, kr as transitionIssueToInProgress, m as getAgentState, mt as recoverAgent, o as clearAgentPaused, or as deliverAgentPermissionDecision, pi as validateProviderHealth, pn as stopAgent, q as init_agents$1, qr as init_runtime_command, qt as operatorInterventionEvent, st as decideEscalation, ti as ohmypiFifoPaths, tn as saveSessionId, ui as getProviderExportsForModel, vn as listRunningAgents, vr as writeBridgeTokenSync, vt as computeAgentEnrichment, wi as buildResumeContract, wr as assertWorkspaceStackHealthyForSpawn, wt as init_agent_enrichment, xi as hasCompletionMarkerForAgent, xr as init_codex_auth, xt as getAgentJsonlPath$1, z as normalizeAgentId, zr as getAcpLauncherFields } from "./agent-state-FABw8neJ.js";
|
|
17
|
+
import { a as init_feature_registry_population, o as recordFeatureRegistryLifecycle } from "./post-merge-state-DFaf7OI1.js";
|
|
18
|
+
import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-BeIWG_kT.js";
|
|
19
|
+
import { A as init_conversations, C as getConversationByName, D as hasOtherActiveConversationOnTmuxSession, H as removeFavorite, I as markConversationActive, J as setConversationModel, K as setConversationEffort, L as markConversationEnded, P as listConversations, S as getConversationById, at as updateLastAttached, b as createConversation, g as backfillConversationModel, h as archiveConversation, ot as updateSpawnError, q as setConversationHarness, tt as updateConversationDeliveryMethod, y as clearConversationFailureState } from "./conversations-nS6QgYpD.js";
|
|
20
|
+
import { C as generateLauncherScriptSync, D as normalizeModelOverrideSync, E as init_model_validation, O as requireModelOverrideSync, S as normalizeFlywheelRunId, T as MODEL_ID_PATTERN, b as init_provenance, w as init_launcher_generator } from "./auto-spawn-consent-BesWchEi.js";
|
|
21
|
+
import { a as init_claude_permissions, n as ensureClaudePermissionFlagSync, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-DLrb9ovz.js";
|
|
22
|
+
import { A as piGlobalContextFile, D as init_layers, L as workspaceContextFile } from "./assemble-B_JgnCbG.js";
|
|
23
|
+
import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-DChiynaB.js";
|
|
24
|
+
import { c as init_stack_health, o as getWorkspaceStackHealth } from "./stack-health-BKfNaqMm.js";
|
|
25
|
+
import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-pLpbsNto.js";
|
|
26
|
+
import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-DVXyUil2.js";
|
|
27
|
+
import { C as init_specs, O as writeSpecForIssue, d as readPlan, g as recordTierPromotion, h as readWorkspacePlanSync, p as readTierOverrides, r as findPlan, s as init_io } from "./io-BCtZoXHo.js";
|
|
28
|
+
import { a as getDispatchableItems, c as init_dag } from "./dag-o-dUpw1L.js";
|
|
29
|
+
import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-BplBEbwn.js";
|
|
30
|
+
import { a as loadCloisterConfigSync, r as init_config$1 } from "./config-_qaa1UXH.js";
|
|
31
|
+
import { a as init_state_home, c as isStateMigrated } from "./state-home-DhsMqg8W.js";
|
|
32
|
+
import { d as resolveWorkspaceRepoRootsSync, i as init_project_repos, s as resolvePrimaryWorkspaceRepoDirSync } from "./project-repos-CsfvLtmr.js";
|
|
33
|
+
import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-D7N0vQNj.js";
|
|
34
|
+
import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-tfAOWgng.js";
|
|
35
|
+
import { i as issue_service_singleton_exports, n as init_issue_service_singleton } from "./issue-service-singleton-C_sZ0HjP.js";
|
|
36
|
+
import { d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, w as setReviewStatusSync } from "./review-status-DpniqzPT.js";
|
|
37
|
+
import { S as parseAcpConversationMessages, b as parseCodexConversationMessages, c as parseEntireConversation, g as init_ohmypi_conversation_parser, h as parsePiConversationMessages, p as init_pi_conversation_parser, t as init_conversation_service, v as parseOhmypiConversationMessages, x as init_acp_conversation_parser, y as init_codex_conversation_parser } from "./conversation-service-BxIOd5ay.js";
|
|
38
|
+
import { i as resolveAgentHarness, l as resolvePiSessionPath, n as readLauncherPinnedSessionId, o as resolveCodexRolloutPath, r as resolveAcpTranscriptPath, t as init_jsonl_resolver } from "./jsonl-resolver-bFtftCDd.js";
|
|
39
|
+
import { G as liveOrderIssueLookup, H as getBook, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-DWKd7bMc.js";
|
|
40
|
+
import { t as resolveAgentGitInfo } from "./git-info-DMOSfJ9I.js";
|
|
41
|
+
import { f as getResourceConfig, m as getSystemHealthSnapshot, n as classifyMemoryPressure } from "./memory-governor-Cvv_9K0M.js";
|
|
42
|
+
import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-CM8RCrSc.js";
|
|
43
|
+
import "./deacon-CsisLmPt.js";
|
|
44
|
+
import { i as performHandoff, o as getAgentHealth, r as checkAllTriggers, t as getCloisterService } from "./service-CThO0Sar.js";
|
|
45
|
+
import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-Dfs1dlYE.js";
|
|
46
|
+
import { i as getRuntimeForAgent } from "./agent-idle-D-UQ7gDv.js";
|
|
47
|
+
import { t as recordReviewVerdict } from "./review-verdict-writer-Cy_1pnIj.js";
|
|
48
|
+
import { r as REVIEW_SUB_ROLES } from "./review-convoy-liveness-BBvyuRLC.js";
|
|
49
|
+
import { t as createInFlightGuard } from "./in-flight-guard-B7khcBdQ.js";
|
|
50
|
+
import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-Cu6yfxBS.js";
|
|
51
|
+
import { t as resolveReviewParentRunState } from "./review-run-recovery-THHMKlXJ.js";
|
|
50
52
|
import { basename, delimiter, dirname, isAbsolute, join, resolve, sep } from "node:path";
|
|
51
53
|
import { Cause, Data, Effect, Layer, Option, Schema, Stream } from "effect";
|
|
52
|
-
import { homedir, networkInterfaces } from "node:os";
|
|
54
|
+
import { homedir, networkInterfaces, tmpdir } from "node:os";
|
|
53
55
|
import { createReadStream, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync } from "node:fs";
|
|
54
56
|
import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
|
|
55
|
-
import { access, appendFile, chmod, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
57
|
+
import { access, appendFile, chmod, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
|
|
56
58
|
import { randomUUID } from "crypto";
|
|
57
59
|
import { createHash as createHash$1, createHmac, randomBytes, randomUUID as randomUUID$1, timingSafeEqual } from "node:crypto";
|
|
58
60
|
import { exec, execFile, spawn } from "node:child_process";
|
|
@@ -131,6 +133,7 @@ init_staffing();
|
|
|
131
133
|
init_spawn_prep();
|
|
132
134
|
init_harness_resolve();
|
|
133
135
|
init_bridge_token();
|
|
136
|
+
init_project_repos();
|
|
134
137
|
init_operator_interventions();
|
|
135
138
|
init_lifecycle_io();
|
|
136
139
|
init_agent_input_detection();
|
|
@@ -138,7 +141,6 @@ init_tracker_config();
|
|
|
138
141
|
init_agent_enrichment();
|
|
139
142
|
init_pending_decision_gate();
|
|
140
143
|
init_agents$1();
|
|
141
|
-
init_project_repos();
|
|
142
144
|
init_review_status();
|
|
143
145
|
/**
|
|
144
146
|
* Resolve the default cwd used when no project is selected — the "devroot"
|
|
@@ -413,6 +415,7 @@ init_agents();
|
|
|
413
415
|
init_codex_auth();
|
|
414
416
|
init_config$1();
|
|
415
417
|
init_state_home();
|
|
418
|
+
init_session_pane_choice();
|
|
416
419
|
init_internal_token();
|
|
417
420
|
const DASHBOARD_SESSION_COOKIE = "overdeck_session";
|
|
418
421
|
const DASHBOARD_CSRF_HEADER = "x-overdeck-csrf-token";
|
|
@@ -612,331 +615,7 @@ function rejectUnauthorizedDashboardRequest(request) {
|
|
|
612
615
|
return null;
|
|
613
616
|
}
|
|
614
617
|
//#endregion
|
|
615
|
-
//#region routes/jsonl-resolver.ts
|
|
616
|
-
init_acp_conversation_parser();
|
|
617
|
-
init_codex_conversation_parser();
|
|
618
|
-
init_ohmypi_conversation_parser();
|
|
619
|
-
init_pi_conversation_parser();
|
|
620
|
-
init_conversation_service();
|
|
621
|
-
/**
|
|
622
|
-
* JSONL transcript resolver for the Command Deck (PAN-830).
|
|
623
|
-
*
|
|
624
|
-
* Maps an agent ID (e.g. `agent-pan-830`, `planning-pan-830`, or a canonical
|
|
625
|
-
* specialist tmux session name) to the agent's JSONL transcript file on disk.
|
|
626
|
-
*
|
|
627
|
-
* Codex agents (PAN-1805) write rollout JSONLs under the per-agent
|
|
628
|
-
* `codex-home/sessions/` tree — resolution dispatches on the harness recorded
|
|
629
|
-
* in state.json (thread-id fast path, then latest-rollout fallback).
|
|
630
|
-
*
|
|
631
|
-
* For claude-code agents the JSONL filename is the *Claude session ID* (a UUID
|
|
632
|
-
* written by Claude Code itself), NOT the agent/tmux name. Lookup order:
|
|
633
|
-
* 1. session.id — UUID pinned before fresh work-agent launch and updated
|
|
634
|
-
* by auto-suspend/resume flows
|
|
635
|
-
* 2. sessions.json — array of UUIDs the agent has used; the heartbeat hook
|
|
636
|
-
* APPENDS new IDs and dedupes, so once a session has been
|
|
637
|
-
* seen its array index never moves. After a `pan resume`
|
|
638
|
-
* brings an older session back as the live one, the array
|
|
639
|
-
* order no longer reflects time-recency. We disambiguate
|
|
640
|
-
* across all listed IDs by JSONL mtime.
|
|
641
|
-
* 3. runtime state — in-process mirror, populated by hooks
|
|
642
|
-
* 4. agents registry — the DB row's session_id recorded at spawn; survives
|
|
643
|
-
* janitor removal of the agent directory
|
|
644
|
-
*
|
|
645
|
-
* Async-only (fs/promises) because this code path runs inside the dashboard
|
|
646
|
-
* server's event loop.
|
|
647
|
-
*/
|
|
648
|
-
const transcriptResolutionSignatures = /* @__PURE__ */ new Map();
|
|
649
|
-
function logTranscriptResolution(agentId, signature, message, opts) {
|
|
650
|
-
const signatureKey = `${agentId}:${opts.agentsDirOverride ?? "live"}`;
|
|
651
|
-
if (transcriptResolutionSignatures.get(signatureKey) === signature) return;
|
|
652
|
-
transcriptResolutionSignatures.set(signatureKey, signature);
|
|
653
|
-
(opts.logDiagnostic ?? (opts.agentsDirOverride ? void 0 : logAgentLifecycleSync))?.(agentId, `transcript resolution: ${message}`);
|
|
654
|
-
}
|
|
655
|
-
async function pathExists$1(p) {
|
|
656
|
-
return access(p).then(() => true, () => false);
|
|
657
|
-
}
|
|
658
|
-
async function readOptional(p) {
|
|
659
|
-
return readFile(p, "utf-8").catch(() => null);
|
|
660
|
-
}
|
|
661
|
-
function behaviorForHarness(harness) {
|
|
662
|
-
return getHarnessBehavior(harness);
|
|
663
|
-
}
|
|
664
|
-
/**
|
|
665
|
-
* Pick the candidate UUID whose JSONL transcript has the most recent mtime.
|
|
666
|
-
*
|
|
667
|
-
* The heartbeat hook appends to sessions.json and dedupes — so once an ID is
|
|
668
|
-
* recorded, its array index never moves even if a later resume makes it the
|
|
669
|
-
* current session again. Choosing by JSONL mtime is the only reliable signal
|
|
670
|
-
* for "which session is actually live right now."
|
|
671
|
-
*
|
|
672
|
-
* Returns null if no candidate has a corresponding JSONL on disk. Falls back
|
|
673
|
-
* to scanning every project dir if the workspace path can't be resolved
|
|
674
|
-
* (covers specialist sessions whose workspace lives elsewhere).
|
|
675
|
-
*/
|
|
676
|
-
async function pickFreshestSessionId(candidates, agentId, opts) {
|
|
677
|
-
if (candidates.length === 0) return null;
|
|
678
|
-
if (candidates.length === 1) return candidates[0];
|
|
679
|
-
const projectsRoot = opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects");
|
|
680
|
-
let candidatePaths = [];
|
|
681
|
-
try {
|
|
682
|
-
const workspace = await Effect.runPromise(getAgentWorkspace$1(agentId));
|
|
683
|
-
if (workspace) {
|
|
684
|
-
const projectDir = join(projectsRoot, encodeClaudeProjectDir(workspace));
|
|
685
|
-
candidatePaths = candidates.map((id) => ({
|
|
686
|
-
id,
|
|
687
|
-
path: join(projectDir, `${id}.jsonl`)
|
|
688
|
-
}));
|
|
689
|
-
}
|
|
690
|
-
} catch {}
|
|
691
|
-
if (candidatePaths.length === 0) try {
|
|
692
|
-
const dirs = await readdir(projectsRoot);
|
|
693
|
-
const SAFE_DIR = /^[a-zA-Z0-9_.-]+$/;
|
|
694
|
-
for (const id of candidates) for (const dir of dirs) {
|
|
695
|
-
if (!SAFE_DIR.test(dir)) continue;
|
|
696
|
-
candidatePaths.push({
|
|
697
|
-
id,
|
|
698
|
-
path: join(projectsRoot, dir, `${id}.jsonl`)
|
|
699
|
-
});
|
|
700
|
-
}
|
|
701
|
-
} catch {}
|
|
702
|
-
let best = null;
|
|
703
|
-
for (const { id, path } of candidatePaths) try {
|
|
704
|
-
const s = await stat(path);
|
|
705
|
-
if (!best || s.mtimeMs > best.mtimeMs) best = {
|
|
706
|
-
id,
|
|
707
|
-
mtimeMs: s.mtimeMs
|
|
708
|
-
};
|
|
709
|
-
} catch {}
|
|
710
|
-
return best ? best.id : candidates[candidates.length - 1] ?? null;
|
|
711
|
-
}
|
|
712
|
-
/** Async equivalent of getLatestSessionId from lib/agents.ts. */
|
|
713
|
-
async function resolveClaudeSessionId(agentId, opts = {}) {
|
|
714
|
-
const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
|
|
715
|
-
const sessionIdTrimmed = (await readOptional(join(agentDir, "session.id")))?.trim();
|
|
716
|
-
if (sessionIdTrimmed) return sessionIdTrimmed;
|
|
717
|
-
const sessionsRaw = await readOptional(join(agentDir, "sessions.json"));
|
|
718
|
-
if (sessionsRaw) try {
|
|
719
|
-
const parsed = JSON.parse(sessionsRaw);
|
|
720
|
-
if (Array.isArray(parsed)) {
|
|
721
|
-
const fresh = await pickFreshestSessionId(parsed.filter((v) => typeof v === "string" && v.trim().length > 0), agentId, opts);
|
|
722
|
-
if (fresh) return fresh;
|
|
723
|
-
}
|
|
724
|
-
} catch {}
|
|
725
|
-
try {
|
|
726
|
-
const runtimeState = await (opts.getRuntimeStateAsync ?? ((id) => Effect.runPromise(getAgentRuntimeState(id))))(agentId);
|
|
727
|
-
if (runtimeState?.claudeSessionId) return runtimeState.claudeSessionId;
|
|
728
|
-
} catch {}
|
|
729
|
-
if (!opts.agentsDirOverride) {
|
|
730
|
-
const registrySessionId = getAgentStateSync(agentId)?.sessionId?.trim();
|
|
731
|
-
if (registrySessionId) return registrySessionId;
|
|
732
|
-
}
|
|
733
|
-
return null;
|
|
734
|
-
}
|
|
735
|
-
/**
|
|
736
|
-
* Read the Claude session id PINNED into an agent/conversation launcher.sh.
|
|
737
|
-
*
|
|
738
|
-
* The launcher is what spawns the live tmux pane: it runs
|
|
739
|
-
* `claude … --session-id <uuid>` (or `--resume <uuid>`), so the pinned id is the
|
|
740
|
-
* EXACT session the Terminal tab attaches to — the only deterministic ground
|
|
741
|
-
* truth for "which session is live right now." Resolving the transcript panel
|
|
742
|
-
* from this id makes the Conversation tab match the Terminal tab by construction,
|
|
743
|
-
* instead of guessing via JSONL mtime (racy: an older session's file gets touched
|
|
744
|
-
* by a compaction summary write-back or a transient relaunch, its mtime jumps
|
|
745
|
-
* ahead of the live session's, and the panel renders the wrong transcript).
|
|
746
|
-
*
|
|
747
|
-
* Checks the conversation launcher dir first, then the agent launcher dir.
|
|
748
|
-
* Returns the uuid, or null when no launcher exists or it pins no session id.
|
|
749
|
-
*/
|
|
750
|
-
const LAUNCHER_UUID = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}";
|
|
751
|
-
const LAUNCHER_SESSION_ID_RE = new RegExp(`--session-id\\s+'?(${LAUNCHER_UUID})'?`);
|
|
752
|
-
const LAUNCHER_RESUME_RE = new RegExp(`--resume\\s+'?(${LAUNCHER_UUID})'?`);
|
|
753
|
-
async function readLauncherPinnedSessionId(tmuxSession, opts = {}) {
|
|
754
|
-
const home = opts.overdeckHomeOverride ?? getOverdeckHome();
|
|
755
|
-
const candidates = [join(home, "conversations", tmuxSession, "launcher.sh"), join(home, "agents", tmuxSession, "launcher.sh")];
|
|
756
|
-
for (const path of candidates) {
|
|
757
|
-
const text = await readOptional(path);
|
|
758
|
-
if (!text) continue;
|
|
759
|
-
const match = LAUNCHER_SESSION_ID_RE.exec(text) ?? LAUNCHER_RESUME_RE.exec(text);
|
|
760
|
-
if (match) return match[1];
|
|
761
|
-
}
|
|
762
|
-
return null;
|
|
763
|
-
}
|
|
764
|
-
/**
|
|
765
|
-
* Read the harness + workspace recorded for an agent, honoring the test
|
|
766
|
-
* override dir. Used by resolveAgentHarness / agentHasClaudeTranscript so the
|
|
767
|
-
* stale-harness self-correction runs identically in prod and under test.
|
|
768
|
-
*/
|
|
769
|
-
async function readRecordedState(agentId, opts) {
|
|
770
|
-
if (opts.agentsDirOverride) try {
|
|
771
|
-
const raw = await readFile(join(opts.agentsDirOverride, agentId, "state.json"), "utf8");
|
|
772
|
-
const s = JSON.parse(raw);
|
|
773
|
-
return {
|
|
774
|
-
harness: typeof s.harness === "string" ? s.harness : null,
|
|
775
|
-
workspace: typeof s.workspace === "string" ? s.workspace : void 0
|
|
776
|
-
};
|
|
777
|
-
} catch {
|
|
778
|
-
return { harness: null };
|
|
779
|
-
}
|
|
780
|
-
const st = getAgentStateSync(agentId);
|
|
781
|
-
return {
|
|
782
|
-
harness: st?.harness ?? null,
|
|
783
|
-
workspace: st?.workspace
|
|
784
|
-
};
|
|
785
|
-
}
|
|
786
|
-
/**
|
|
787
|
-
* Resolve the harness for transcript routing. Reads state.json, then
|
|
788
|
-
* self-corrects when the recorded value is stale.
|
|
789
|
-
*
|
|
790
|
-
* Trust an explicit non-default harness (codex / pi / ohmypi / acp) — it was chosen
|
|
791
|
-
* by resolveHarness at spawn time and is not the generic fallback. The
|
|
792
|
-
* 'claude-code' default, however, goes stale in one observed case: a
|
|
793
|
-
* wipe-and-respawn that changed the provider-default harness left state.json
|
|
794
|
-
* carrying the pre-respawn 'claude-code' while the fresh launch was
|
|
795
|
-
* codex/ohmypi. The resolver then took the claude-code branch, found no
|
|
796
|
-
* claudeSessionId, and the dashboard showed "No conversation data available"
|
|
797
|
-
* for a live agent whose real transcript sat untouched under codex-home.
|
|
798
|
-
*
|
|
799
|
-
* Self-correction (claude-code/null recorded only): if the agent has NO
|
|
800
|
-
* claude-code transcript on disk but DOES have a codex rollout / pi session,
|
|
801
|
-
* the on-disk runtime wins — those artifacts are written only by that runtime,
|
|
802
|
-
* so this cannot surface a wrong transcript. When a claude-code transcript IS
|
|
803
|
-
* present it always wins, so a past codex run's codex-home can't shadow a
|
|
804
|
-
* current claude-code session.
|
|
805
|
-
*/
|
|
806
|
-
async function resolveAgentHarness(agentId, opts = {}) {
|
|
807
|
-
const recorded = (await readRecordedState(agentId, opts)).harness;
|
|
808
|
-
if (recorded === "codex" || recorded === "pi" || recorded === "ohmypi" || recorded === "acp" || recorded === "kimi-code") return recorded;
|
|
809
|
-
if (await agentHasClaudeTranscript(agentId, opts)) return recorded ?? "claude-code";
|
|
810
|
-
if (await resolveAcpTranscriptPath(agentId, opts)) return "acp";
|
|
811
|
-
if (await resolveCodexRolloutPath(agentId, opts)) return "codex";
|
|
812
|
-
if (await resolvePiSessionPath(agentId, opts)) return "ohmypi";
|
|
813
|
-
if (await resolveKimiWirePath(agentId, opts)) return "kimi-code";
|
|
814
|
-
return recorded;
|
|
815
|
-
}
|
|
816
|
-
/**
|
|
817
|
-
* Whether the agent has a resolvable claude-code transcript on disk. Used by
|
|
818
|
-
* resolveAgentHarness to decide if a claude-code recording is still live
|
|
819
|
-
* (vs. a stale default that should be corrected to codex/ohmypi).
|
|
820
|
-
*/
|
|
821
|
-
async function agentHasClaudeTranscript(agentId, opts = {}) {
|
|
822
|
-
const sessionId = await resolveClaudeSessionId(agentId, opts);
|
|
823
|
-
if (!sessionId) return false;
|
|
824
|
-
const workspace = (await readRecordedState(agentId, opts)).workspace;
|
|
825
|
-
if (!workspace) return false;
|
|
826
|
-
return pathExists$1(join(opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects"), encodeClaudeProjectDir(workspace), `${sessionId}.jsonl`));
|
|
827
|
-
}
|
|
828
|
-
/**
|
|
829
|
-
* Resolve the Codex rollout JSONL for a codex-harness agent (PAN-1805).
|
|
830
|
-
*
|
|
831
|
-
* Fast path: the persisted codex-thread-id maps directly to its rollout file.
|
|
832
|
-
* Lazy fallback (same shape as the conversation panel's PAN-1690 fix): codex
|
|
833
|
-
* writes the rollout only on the first turn, so a spawn-time thread-id capture
|
|
834
|
-
* can miss it — the per-agent CODEX_HOME holds only this agent's rollouts, so
|
|
835
|
-
* the newest one is its current thread.
|
|
836
|
-
*/
|
|
837
|
-
async function resolveCodexRolloutPath(agentId, opts = {}) {
|
|
838
|
-
const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
|
|
839
|
-
const codexHome = join(agentDir, "codex-home");
|
|
840
|
-
if (!await pathExists$1(codexHome)) return null;
|
|
841
|
-
const { findRolloutPath, findLatestRollout } = await import("./codex-icapA4om.js");
|
|
842
|
-
const threadId = (await readOptional(join(agentDir, "codex-thread-id")))?.trim();
|
|
843
|
-
if (threadId) {
|
|
844
|
-
const rollout = findRolloutPath(codexHome, threadId);
|
|
845
|
-
if (rollout) return rollout;
|
|
846
|
-
}
|
|
847
|
-
return findLatestRollout(codexHome);
|
|
848
|
-
}
|
|
849
|
-
/** Resolve the normalized transcript written by the persistent ACP host. */
|
|
850
|
-
async function resolveAcpTranscriptPath(agentId, opts = {}) {
|
|
851
|
-
const transcriptPath = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId, "acp-session.jsonl");
|
|
852
|
-
return await pathExists$1(transcriptPath) ? transcriptPath : null;
|
|
853
|
-
}
|
|
854
|
-
/**
|
|
855
|
-
* Resolve the native Kimi Code CLI wire.jsonl for a kimi-code-harness agent
|
|
856
|
-
* (PAN-1837 wi8a). Fast path: the per-agent kimi-session-id (persisted by
|
|
857
|
-
* wi5's spawnAgent) maps directly to
|
|
858
|
-
* `<kimiHome>/sessions/<workDirKey>/<sessionId>/agents/main/wire.jsonl`.
|
|
859
|
-
* Fallback (no captured id): the newest session directory by wire.jsonl mtime
|
|
860
|
-
* under the workspace's workDirKey bucket — same shape as the codex/pi lazy
|
|
861
|
-
* fallbacks above, since Kimi may not have finished writing its first turn
|
|
862
|
-
* when the id was captured.
|
|
863
|
-
*/
|
|
864
|
-
async function resolveKimiWirePath(agentId, opts = {}) {
|
|
865
|
-
const workspace = opts.workspaceOverride ?? (await readRecordedState(agentId, opts)).workspace;
|
|
866
|
-
if (!workspace) return null;
|
|
867
|
-
const sessionId = (await readOptional(join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId, "kimi-session-id")))?.trim() || null;
|
|
868
|
-
const kimiHome = opts.kimiHomeOverride ?? join(homedir(), ".kimi-code");
|
|
869
|
-
const { findKimiWirePathAsync } = await import("./kimi-code-DoMoGqIu.js");
|
|
870
|
-
return findKimiWirePathAsync(kimiHome, workspace, sessionId);
|
|
871
|
-
}
|
|
872
|
-
/**
|
|
873
|
-
* Resolve the pi/kimi session JSONL (PAN-1908). Pi writes its session transcript
|
|
874
|
-
* as `<iso-ts>_<session-id>.jsonl` either in the agent dir's `sessions/` subdir
|
|
875
|
-
* (conversations) OR in the agent dir root (work agents) — so check both. The dir
|
|
876
|
-
* also holds `cost-events.jsonl` / `activity.jsonl`, which are NOT transcripts.
|
|
877
|
-
* Return the freshest transcript by mtime, or null if pi hasn't written one yet.
|
|
878
|
-
*/
|
|
879
|
-
async function resolvePiSessionPath(agentId, opts = {}) {
|
|
880
|
-
const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
|
|
881
|
-
const NON_TRANSCRIPT = new Set([
|
|
882
|
-
"acp-session.jsonl",
|
|
883
|
-
"cost-events.jsonl",
|
|
884
|
-
"activity.jsonl",
|
|
885
|
-
"pending-events.jsonl"
|
|
886
|
-
]);
|
|
887
|
-
let best = null;
|
|
888
|
-
for (const dir of [join(agentDir, "sessions"), agentDir]) {
|
|
889
|
-
let entries;
|
|
890
|
-
try {
|
|
891
|
-
entries = await readdir(dir);
|
|
892
|
-
} catch {
|
|
893
|
-
continue;
|
|
894
|
-
}
|
|
895
|
-
for (const name of entries) {
|
|
896
|
-
if (!name.endsWith(".jsonl") || NON_TRANSCRIPT.has(name)) continue;
|
|
897
|
-
const p = join(dir, name);
|
|
898
|
-
try {
|
|
899
|
-
const m = (await stat(p)).mtimeMs;
|
|
900
|
-
if (!best || m > best.mtime) best = {
|
|
901
|
-
path: p,
|
|
902
|
-
mtime: m
|
|
903
|
-
};
|
|
904
|
-
} catch {}
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
return best?.path ?? null;
|
|
908
|
-
}
|
|
909
|
-
/**
|
|
910
|
-
* Resolve the JSONL transcript for an agent.
|
|
911
|
-
*
|
|
912
|
-
* Codex agents resolve to their rollout JSONL (PAN-1805). For claude-code
|
|
913
|
-
* agents, returns the absolute path if both the claudeSessionId is known AND
|
|
914
|
-
* the corresponding JSONL file exists; otherwise null.
|
|
915
|
-
*/
|
|
916
|
-
async function resolveJsonlPath(agentId, workspacePath, opts = {}) {
|
|
917
|
-
const harness = await resolveAgentHarness(agentId, opts);
|
|
918
|
-
const behavior = behaviorForHarness(harness);
|
|
919
|
-
if (behavior.transcriptKind === "codex-rollout-jsonl") return resolveCodexRolloutPath(agentId, opts);
|
|
920
|
-
if (behavior.transcriptKind === "ohmypi-jsonl") return resolvePiSessionPath(agentId, opts);
|
|
921
|
-
if (behavior.transcriptKind === "acp-jsonl") return resolveAcpTranscriptPath(agentId, opts);
|
|
922
|
-
if (behavior.transcriptKind === "kimi-wire-jsonl") return resolveKimiWirePath(agentId, opts);
|
|
923
|
-
const claudeSessionId = await resolveClaudeSessionId(agentId, opts);
|
|
924
|
-
if (!claudeSessionId) {
|
|
925
|
-
logTranscriptResolution(agentId, `missing-session-id:${harness ?? "unknown"}`, `failed harness=${harness ?? "unknown"} reason=no-session-id checked=session.id,sessions.json,runtime-state`, opts);
|
|
926
|
-
return null;
|
|
927
|
-
}
|
|
928
|
-
const effectiveWorkspacePath = (await readRecordedState(agentId, opts)).workspace ?? workspacePath;
|
|
929
|
-
const jsonlPath = join(opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects"), encodeClaudeProjectDir(effectiveWorkspacePath), `${claudeSessionId}.jsonl`);
|
|
930
|
-
if (await pathExists$1(jsonlPath)) {
|
|
931
|
-
logTranscriptResolution(agentId, `resolved:${jsonlPath}`, `resolved harness=${harness ?? "claude-code"} sessionId=${claudeSessionId} path=${jsonlPath}`, opts);
|
|
932
|
-
return jsonlPath;
|
|
933
|
-
}
|
|
934
|
-
logTranscriptResolution(agentId, `missing-jsonl:${jsonlPath}`, `failed harness=${harness ?? "claude-code"} reason=jsonl-missing sessionId=${claudeSessionId} workspace=${effectiveWorkspacePath} expectedPath=${jsonlPath}`, opts);
|
|
935
|
-
return null;
|
|
936
|
-
}
|
|
937
|
-
//#endregion
|
|
938
618
|
//#region ../../lib/pan-cli-invocation.ts
|
|
939
|
-
init_paths();
|
|
940
619
|
/**
|
|
941
620
|
* Invoke Overdeck's bundled CLI without relying on the dashboard process PATH.
|
|
942
621
|
* GUI/service launches often omit the package-manager bin directory that owns
|
|
@@ -955,7 +634,6 @@ function spawnPanCli(args, options = {}) {
|
|
|
955
634
|
}
|
|
956
635
|
//#endregion
|
|
957
636
|
//#region ../../lib/work-agent-lifecycle.ts
|
|
958
|
-
init_agents$1();
|
|
959
637
|
init_paths();
|
|
960
638
|
init_tmux();
|
|
961
639
|
function sessionResetRequiredReason(agentId, agentOrIssueId) {
|
|
@@ -1159,147 +837,6 @@ async function getWorkAgentLifecycleStateSnapshot(agentOrIssueId) {
|
|
|
1159
837
|
Data.TaggedError("WorkAgentLifecycleViolation");
|
|
1160
838
|
const getWorkAgentLifecycleState = (agentOrIssueId) => Effect.promise(() => getWorkAgentLifecycleStateSnapshot(agentOrIssueId));
|
|
1161
839
|
//#endregion
|
|
1162
|
-
//#region services/git-info.ts
|
|
1163
|
-
/**
|
|
1164
|
-
* Git info enricher (PAN-1523)
|
|
1165
|
-
*
|
|
1166
|
-
* Derives branch + worktree-status for an absolute filesystem path. Used to
|
|
1167
|
-
* surface branch/worktree chips on conversation rows, conversation terminals,
|
|
1168
|
-
* and agent terminals.
|
|
1169
|
-
*
|
|
1170
|
-
* Two enricher entrypoints with different semantics:
|
|
1171
|
-
* - resolveConversationGitInfo() — best-effort: returns null branch when
|
|
1172
|
-
* the path isn't a git repo. Used for conversations whose cwd can be
|
|
1173
|
-
* anywhere.
|
|
1174
|
-
* - resolveAgentGitInfo() — verifies a work-agent workspace against its
|
|
1175
|
-
* expected feature branch. Reports drift and missing-workspace state
|
|
1176
|
-
* because both are silent failure modes today.
|
|
1177
|
-
*
|
|
1178
|
-
* Cache: in-memory, keyed by absolute path and invalidated when the mtime of
|
|
1179
|
-
* <path>/.git/HEAD changes. Every read still stats HEAD, so a checkout under a
|
|
1180
|
-
* live conversation is picked up immediately without periodically respawning
|
|
1181
|
-
* two git processes for every unchanged workspace.
|
|
1182
|
-
*
|
|
1183
|
-
* All I/O is async (execFile / fs.promises). No execSync, no readFileSync.
|
|
1184
|
-
*/
|
|
1185
|
-
const execFileAsync$3 = promisify(execFile);
|
|
1186
|
-
const GIT_INFO_TIMEOUT_MS = 2e3;
|
|
1187
|
-
const cache = /* @__PURE__ */ new Map();
|
|
1188
|
-
/**
|
|
1189
|
-
* Locate the HEAD file for a working tree at `absPath`.
|
|
1190
|
-
*
|
|
1191
|
-
* In a primary checkout `.git` is a directory and HEAD lives at `.git/HEAD`.
|
|
1192
|
-
* In a secondary worktree `.git` is a small text file containing
|
|
1193
|
-
* `gitdir: /abs/path/to/.git/worktrees/<name>` and HEAD lives at
|
|
1194
|
-
* `<that-gitdir>/HEAD`. We follow the pointer so the mtime check actually
|
|
1195
|
-
* sees branch flips in worktrees.
|
|
1196
|
-
*/
|
|
1197
|
-
async function locateHeadPath(absPath) {
|
|
1198
|
-
const gitMarker = join(absPath, ".git");
|
|
1199
|
-
let markerStat;
|
|
1200
|
-
try {
|
|
1201
|
-
markerStat = await stat(gitMarker);
|
|
1202
|
-
} catch {
|
|
1203
|
-
return null;
|
|
1204
|
-
}
|
|
1205
|
-
if (markerStat.isDirectory()) return join(gitMarker, "HEAD");
|
|
1206
|
-
if (markerStat.isFile()) try {
|
|
1207
|
-
const match = (await readFile(gitMarker, "utf-8")).match(/^gitdir:\s*(.+)$/m);
|
|
1208
|
-
if (!match) return null;
|
|
1209
|
-
return join(match[1].trim(), "HEAD");
|
|
1210
|
-
} catch {
|
|
1211
|
-
return null;
|
|
1212
|
-
}
|
|
1213
|
-
return null;
|
|
1214
|
-
}
|
|
1215
|
-
async function readHeadMtimeMs(absPath) {
|
|
1216
|
-
const headPath = await locateHeadPath(absPath);
|
|
1217
|
-
if (headPath === null) return null;
|
|
1218
|
-
try {
|
|
1219
|
-
return (await stat(headPath)).mtimeMs;
|
|
1220
|
-
} catch {
|
|
1221
|
-
return null;
|
|
1222
|
-
}
|
|
1223
|
-
}
|
|
1224
|
-
async function readGitInfoFresh(absPath) {
|
|
1225
|
-
const [branchResult, worktreeResult] = await Promise.all([execFileAsync$3("git", [
|
|
1226
|
-
"-C",
|
|
1227
|
-
absPath,
|
|
1228
|
-
"rev-parse",
|
|
1229
|
-
"--abbrev-ref",
|
|
1230
|
-
"HEAD"
|
|
1231
|
-
], {
|
|
1232
|
-
encoding: "utf-8",
|
|
1233
|
-
timeout: GIT_INFO_TIMEOUT_MS
|
|
1234
|
-
}).catch(() => null), execFileAsync$3("git", [
|
|
1235
|
-
"-C",
|
|
1236
|
-
absPath,
|
|
1237
|
-
"rev-parse",
|
|
1238
|
-
"--git-common-dir",
|
|
1239
|
-
"--git-dir"
|
|
1240
|
-
], {
|
|
1241
|
-
encoding: "utf-8",
|
|
1242
|
-
timeout: GIT_INFO_TIMEOUT_MS
|
|
1243
|
-
}).catch(() => null)]);
|
|
1244
|
-
if (!branchResult) return {
|
|
1245
|
-
branch: null,
|
|
1246
|
-
isWorktree: false
|
|
1247
|
-
};
|
|
1248
|
-
const branch = branchResult.stdout.trim() || null;
|
|
1249
|
-
let isWorktree = false;
|
|
1250
|
-
if (worktreeResult) {
|
|
1251
|
-
const [commonDir, gitDir] = worktreeResult.stdout.trim().split("\n").map((line) => line.trim());
|
|
1252
|
-
if (commonDir && gitDir && commonDir !== gitDir) isWorktree = true;
|
|
1253
|
-
}
|
|
1254
|
-
return {
|
|
1255
|
-
branch,
|
|
1256
|
-
isWorktree
|
|
1257
|
-
};
|
|
1258
|
-
}
|
|
1259
|
-
/**
|
|
1260
|
-
* Resolve branch + worktree status for a conversation cwd. Cached until the
|
|
1261
|
-
* HEAD mtime changes.
|
|
1262
|
-
*/
|
|
1263
|
-
async function resolveConversationGitInfo(absPath) {
|
|
1264
|
-
const headMtimeMs = await readHeadMtimeMs(absPath);
|
|
1265
|
-
if (headMtimeMs === null) return {
|
|
1266
|
-
branch: null,
|
|
1267
|
-
isWorktree: false
|
|
1268
|
-
};
|
|
1269
|
-
const cached = cache.get(absPath);
|
|
1270
|
-
if (cached && cached.headMtimeMs === headMtimeMs) return cached.value;
|
|
1271
|
-
const value = await readGitInfoFresh(absPath);
|
|
1272
|
-
cache.set(absPath, {
|
|
1273
|
-
value,
|
|
1274
|
-
headMtimeMs
|
|
1275
|
-
});
|
|
1276
|
-
return value;
|
|
1277
|
-
}
|
|
1278
|
-
/**
|
|
1279
|
-
* Resolve drift + missing-workspace state for a work-agent workspace.
|
|
1280
|
-
* `expectedBranch` is the deterministic feature/<issue-id> branch from
|
|
1281
|
-
* resource-discovery. Reuses the conversation cache for the branch read,
|
|
1282
|
-
* then layers drift detection on top.
|
|
1283
|
-
*/
|
|
1284
|
-
async function resolveAgentGitInfo(workspacePath, expectedBranch) {
|
|
1285
|
-
if (await readHeadMtimeMs(workspacePath) === null) return {
|
|
1286
|
-
actualBranch: null,
|
|
1287
|
-
branchDrifted: false,
|
|
1288
|
-
workspaceMissing: true
|
|
1289
|
-
};
|
|
1290
|
-
const info = await resolveConversationGitInfo(workspacePath);
|
|
1291
|
-
if (info.branch === null) return {
|
|
1292
|
-
actualBranch: null,
|
|
1293
|
-
branchDrifted: false,
|
|
1294
|
-
workspaceMissing: true
|
|
1295
|
-
};
|
|
1296
|
-
return {
|
|
1297
|
-
actualBranch: info.branch,
|
|
1298
|
-
branchDrifted: info.branch !== expectedBranch,
|
|
1299
|
-
workspaceMissing: false
|
|
1300
|
-
};
|
|
1301
|
-
}
|
|
1302
|
-
//#endregion
|
|
1303
840
|
//#region ../../lib/composer-commands/executors.ts
|
|
1304
841
|
const CAPTURED_COMMAND_MAX_OUTPUT_BYTES = 64 * 1024;
|
|
1305
842
|
const TRUNCATION_MESSAGE = "\n\nOutput was truncated after 65,536 bytes.";
|
|
@@ -1610,7 +1147,6 @@ async function runDetachedCommand(argv, dependencies = {}) {
|
|
|
1610
1147
|
//#region routes/agents/shared.ts
|
|
1611
1148
|
init_paths();
|
|
1612
1149
|
init_agents$1();
|
|
1613
|
-
init_agent_enrichment();
|
|
1614
1150
|
init_supervisor_channels();
|
|
1615
1151
|
init_activity_logger();
|
|
1616
1152
|
init_tmux();
|
|
@@ -2331,6 +1867,12 @@ const getAgentHasSessionRoute = HttpRouter.add("GET", "/api/agents/:id/has-sessi
|
|
|
2331
1867
|
init_paths();
|
|
2332
1868
|
init_agents$1();
|
|
2333
1869
|
init_tmux();
|
|
1870
|
+
init_conversation_service();
|
|
1871
|
+
init_pi_conversation_parser();
|
|
1872
|
+
init_ohmypi_conversation_parser();
|
|
1873
|
+
init_codex_conversation_parser();
|
|
1874
|
+
init_acp_conversation_parser();
|
|
1875
|
+
init_jsonl_resolver();
|
|
2334
1876
|
const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", httpHandler(Effect.gen(function* () {
|
|
2335
1877
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
2336
1878
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
@@ -2351,7 +1893,7 @@ const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", http
|
|
|
2351
1893
|
} catch {}
|
|
2352
1894
|
let stdout;
|
|
2353
1895
|
if (isRemote && vmName) {
|
|
2354
|
-
const { getRemoteAgentOutput } = await import("./remote-agents-
|
|
1896
|
+
const { getRemoteAgentOutput } = await import("./remote-agents-MuXx2gWm.js");
|
|
2355
1897
|
stdout = await getRemoteAgentOutput(id, vmName, parseInt(String(lines), 10) || 100);
|
|
2356
1898
|
} else stdout = await Effect.runPromise(capturePane(id, parseInt(String(lines), 10) || 100));
|
|
2357
1899
|
if (!stdout || stdout.trim() === "" || stdout.trim() === "Session not found") {
|
|
@@ -3182,7 +2724,7 @@ async function cleanupConversationAttachments(name) {
|
|
|
3182
2724
|
* sessions that the lifecycle poller missed. */
|
|
3183
2725
|
async function cleanupOrphanedConversationAttachments() {
|
|
3184
2726
|
try {
|
|
3185
|
-
const { listConversations } = await import("./conversations-
|
|
2727
|
+
const { listConversations } = await import("./conversations-CEMfwMt-.js");
|
|
3186
2728
|
const convNames = new Set(listConversations().map((c) => c.name));
|
|
3187
2729
|
const root = getConversationAttachmentsRoot();
|
|
3188
2730
|
await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join(root, entry.name)), 10, (path) => rm(path, {
|
|
@@ -3366,7 +2908,8 @@ async function removeConversationAttachment(name, attachmentPath) {
|
|
|
3366
2908
|
//#region ../../lib/overdeck/resume-contract-delivery.ts
|
|
3367
2909
|
init_agents$1();
|
|
3368
2910
|
init_tmux();
|
|
3369
|
-
async function deliverResumeContractUnlessGated(tmuxSession, contract, caller, method) {
|
|
2911
|
+
async function deliverResumeContractUnlessGated(tmuxSession, contract, caller, method, requested = true) {
|
|
2912
|
+
if (!requested) return "skipped-user";
|
|
3370
2913
|
const resumeGatePane = await capturePaneText(tmuxSession, 90).catch(() => "");
|
|
3371
2914
|
if (resumeGatePane && paneHasBlockingChoiceMenu(resumeGatePane)) {
|
|
3372
2915
|
console.log(`[conversations] resume contract skipped for ${tmuxSession} — the harness is showing a blocking choice menu; the operator answers it`);
|
|
@@ -3385,8 +2928,8 @@ async function deliverResumeContractUnlessGated(tmuxSession, contract, caller, m
|
|
|
3385
2928
|
init_projects();
|
|
3386
2929
|
init_tmux();
|
|
3387
2930
|
init_agents$1();
|
|
3388
|
-
init_behavior();
|
|
3389
2931
|
init_paths();
|
|
2932
|
+
init_jsonl_resolver();
|
|
3390
2933
|
const execAsync$1 = promisify(exec);
|
|
3391
2934
|
const execFileAsync$1 = promisify(execFile);
|
|
3392
2935
|
const PROCESS_CLEANUP_GRACE_MS = 750;
|
|
@@ -3528,12 +3071,16 @@ async function waitForClaudeReady(tmuxSession) {
|
|
|
3528
3071
|
console.warn(`[conversations] Timed out waiting for Claude Code prompt in ${tmuxSession}`);
|
|
3529
3072
|
}
|
|
3530
3073
|
function isPiTuiInputReady(snapshot) {
|
|
3531
|
-
return /^\s*[❯›>]\s/m.test(snapshot) || /(?:^|\s)0(?:\.\d+)?%\s+context\s+used\b/i.test(snapshot)
|
|
3074
|
+
return /^\s*[❯›>]\s/m.test(snapshot) || /(?:^|\s)0(?:\.\d+)?%\s+context\s+used\b/i.test(snapshot);
|
|
3532
3075
|
}
|
|
3533
3076
|
async function waitForPiTuiReady(tmuxSession, timeoutMs = 6e4) {
|
|
3534
3077
|
const deadline = Date.now() + timeoutMs;
|
|
3078
|
+
let stableV17FooterPolls = 0;
|
|
3535
3079
|
while (Date.now() < deadline) {
|
|
3536
|
-
|
|
3080
|
+
const snapshot = await Effect.runPromise(capturePane(tmuxSession, 40).pipe(Effect.catch(() => Effect.succeed(""))));
|
|
3081
|
+
const mcpConnecting = /Connecting to MCP servers/i.test(snapshot) && !/MCP finished/i.test(snapshot);
|
|
3082
|
+
stableV17FooterPolls = /⬢[^\n]*[◕◉]/.test(snapshot) && !mcpConnecting ? stableV17FooterPolls + 1 : 0;
|
|
3083
|
+
if (isPiTuiInputReady(snapshot) || stableV17FooterPolls >= 21) {
|
|
3537
3084
|
console.log(`[conversations] Pi TUI ready for ${tmuxSession}`);
|
|
3538
3085
|
return true;
|
|
3539
3086
|
}
|
|
@@ -3636,9 +3183,7 @@ function getPtySupervisorSocketPath(agentId) {
|
|
|
3636
3183
|
* an operator hunting the memory governor instead (PAN-3172).
|
|
3637
3184
|
*/
|
|
3638
3185
|
function extractSupervisorFailure(paneText) {
|
|
3639
|
-
const
|
|
3640
|
-
const errors = lines.filter((line) => /error|cannot find|ERR_[A-Z_]+|pty-supervisor:/i.test(line));
|
|
3641
|
-
const chosen = (errors.length > 0 ? errors : lines).slice(-3);
|
|
3186
|
+
const chosen = paneText.split("\n").map((line) => line.trim()).filter(Boolean).filter((line) => /error|cannot find|ERR_[A-Z_]+|pty-supervisor:/i.test(line)).slice(-3);
|
|
3642
3187
|
if (chosen.length === 0) return null;
|
|
3643
3188
|
return chosen.join(" | ").slice(0, 500);
|
|
3644
3189
|
}
|
|
@@ -3652,7 +3197,16 @@ async function waitForPtySupervisorSocket(agentId, timeoutMs = PTY_SUPERVISOR_SO
|
|
|
3652
3197
|
await new Promise((r) => setTimeout(r, 250));
|
|
3653
3198
|
}
|
|
3654
3199
|
const failure = extractSupervisorFailure(await capturePaneText(agentId, 40));
|
|
3655
|
-
|
|
3200
|
+
const detail = failure ? `supervisor output: ${failure}` : "the supervisor pane shows no error output (a healthy harness statusline); the supervisor may have bound its socket under a different OVERDECK_HOME";
|
|
3201
|
+
throw new Error(`Timed out waiting for PTY supervisor socket ${socketPath} — ${detail}`);
|
|
3202
|
+
}
|
|
3203
|
+
async function waitForPtySupervisorOrFallback(agentId, timeoutMs = PTY_SUPERVISOR_SOCKET_WAIT_MS, sessionAlive = tmuxSessionExists) {
|
|
3204
|
+
try {
|
|
3205
|
+
await waitForPtySupervisorSocket(agentId, timeoutMs);
|
|
3206
|
+
} catch (error) {
|
|
3207
|
+
if (!await sessionAlive(agentId)) throw error;
|
|
3208
|
+
console.warn(`[conversations] PTY supervisor socket unavailable for ${agentId}; continuing with fallback delivery: ${error instanceof Error ? error.message : String(error)}`);
|
|
3209
|
+
}
|
|
3656
3210
|
}
|
|
3657
3211
|
async function extractModelFromSessionFile(sessionFile) {
|
|
3658
3212
|
try {
|
|
@@ -3779,8 +3333,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3779
3333
|
} else if (model) {
|
|
3780
3334
|
if (!SAFE_MODEL_PATTERN.test(model)) throw new Error("Invalid model name");
|
|
3781
3335
|
runtimeCommand = await getAgentRuntimeBaseCommand(model, void 0, void 0, harness);
|
|
3782
|
-
|
|
3783
|
-
if (!runtimeCommand.includes("--permission-mode")) runtimeCommand = `${runtimeCommand} --permission-mode ${mode === "auto" ? "auto" : BYPASS_PERMISSION_MODE}`;
|
|
3336
|
+
runtimeCommand = ensureClaudePermissionFlagSync(runtimeCommand);
|
|
3784
3337
|
providerExportsStr = (await getProviderExportsForModel(model, harness)).trim();
|
|
3785
3338
|
if (behavior.transcriptKind === "ohmypi-jsonl") {
|
|
3786
3339
|
if (getProviderForModelSync(model).name === "openai") {
|
|
@@ -3813,7 +3366,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3813
3366
|
const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
|
|
3814
3367
|
const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
|
|
3815
3368
|
const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
|
|
3816
|
-
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-
|
|
3369
|
+
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-BValsmtK.js");
|
|
3817
3370
|
initCodexHome(codexHome, {
|
|
3818
3371
|
trustedDir: cwd,
|
|
3819
3372
|
approvalPolicy: codexApprovalPolicy,
|
|
@@ -3833,7 +3386,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3833
3386
|
if (resume) {
|
|
3834
3387
|
const pinnedId = await readFile(join(getOverdeckHome(), "agents", tmuxSession, "kimi-session-id"), "utf-8").then((value) => value.trim() || void 0).catch(() => void 0);
|
|
3835
3388
|
if (pinnedId) {
|
|
3836
|
-
const { kimiSessionsRoot } = await import("./kimi-code-
|
|
3389
|
+
const { kimiSessionsRoot } = await import("./kimi-code-BxkDgaj4.js");
|
|
3837
3390
|
if (await stat(join(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd), pinnedId, "agents", "main", "wire.jsonl")).then(() => true, () => false)) kimiResumeSessionId = pinnedId;
|
|
3838
3391
|
}
|
|
3839
3392
|
}
|
|
@@ -3866,7 +3419,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3866
3419
|
const launchTmuxAndCaptureSession = async () => {
|
|
3867
3420
|
let kimiExistingSessionsBefore;
|
|
3868
3421
|
if (kimiCodeFields && !kimiCodeFields.resumeSessionId) try {
|
|
3869
|
-
const { kimiSessionsRoot } = await import("./kimi-code-
|
|
3422
|
+
const { kimiSessionsRoot } = await import("./kimi-code-BxkDgaj4.js");
|
|
3870
3423
|
kimiExistingSessionsBefore = new Set(await readdir(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd)));
|
|
3871
3424
|
} catch {
|
|
3872
3425
|
kimiExistingSessionsBefore = /* @__PURE__ */ new Set();
|
|
@@ -3905,7 +3458,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3905
3458
|
} catch {}
|
|
3906
3459
|
console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
|
|
3907
3460
|
try {
|
|
3908
|
-
const { preTrustDirectory } = await import("./workspace-manager-
|
|
3461
|
+
const { preTrustDirectory } = await import("./workspace-manager-BrbX90Rm.js");
|
|
3909
3462
|
preTrustDirectory(cwd);
|
|
3910
3463
|
} catch {}
|
|
3911
3464
|
try {
|
|
@@ -3917,12 +3470,12 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3917
3470
|
if (err?.code === "ENOENT") throw new Error("tmux is not installed. Install it with: brew install tmux (macOS) or sudo apt-get install tmux (Linux)");
|
|
3918
3471
|
throw err;
|
|
3919
3472
|
}
|
|
3920
|
-
if (useSupervisor) await
|
|
3473
|
+
if (useSupervisor) await waitForPtySupervisorOrFallback(tmuxSession);
|
|
3921
3474
|
if (behavior.usesCodexHome && codexFields?.codexHome && codexTransport === "tui") {
|
|
3922
3475
|
const codexHomeDir = codexFields.codexHome;
|
|
3923
3476
|
(async () => {
|
|
3924
3477
|
try {
|
|
3925
|
-
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-
|
|
3478
|
+
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-BValsmtK.js");
|
|
3926
3479
|
const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
|
|
3927
3480
|
if (rollout) {
|
|
3928
3481
|
const threadId = extractThreadIdFromRollout(rollout);
|
|
@@ -3932,14 +3485,14 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3932
3485
|
})();
|
|
3933
3486
|
}
|
|
3934
3487
|
if (kimiCodeFields && kimiExistingSessionsBefore) {
|
|
3935
|
-
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-
|
|
3488
|
+
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-BxkDgaj4.js");
|
|
3936
3489
|
const sessionId = await waitForNewKimiSessionAsync(join(homedir(), ".kimi-code"), cwd, kimiExistingSessionsBefore);
|
|
3937
3490
|
if (!sessionId) throw new Error(`kimi-code session capture timed out for ${tmuxSession} — no new session directory appeared under the workspace bucket`);
|
|
3938
3491
|
writeKimiSessionId(tmuxSession, sessionId);
|
|
3939
3492
|
}
|
|
3940
3493
|
};
|
|
3941
3494
|
if (kimiCodeFields) {
|
|
3942
|
-
const { withKimiSessionCaptureLock } = await import("./kimi-code-
|
|
3495
|
+
const { withKimiSessionCaptureLock } = await import("./kimi-code-BxkDgaj4.js");
|
|
3943
3496
|
await withKimiSessionCaptureLock(join(homedir(), ".kimi-code"), cwd, launchTmuxAndCaptureSession);
|
|
3944
3497
|
} else await launchTmuxAndCaptureSession();
|
|
3945
3498
|
if (channelsBridgeMcpConfig) dismissDevChannelsDialog(tmuxSession).catch((err) => {
|
|
@@ -4076,6 +3629,16 @@ async function handleConversationStop(name, deps) {
|
|
|
4076
3629
|
return jsonResponse({ error: "Internal server error" }, { status: 500 });
|
|
4077
3630
|
}
|
|
4078
3631
|
}
|
|
3632
|
+
async function handleConversationClearForkState(name, deps = {}) {
|
|
3633
|
+
const conv = getConversationByName(name);
|
|
3634
|
+
if (!conv) return jsonResponse({ error: "Conversation not found" }, { status: 404 });
|
|
3635
|
+
if (!await (deps.sessionExists ?? tmuxSessionExists)(conv.tmuxSession)) return jsonResponse({ error: "Cannot clear failure state while the tmux session is not alive" }, { status: 409 });
|
|
3636
|
+
(deps.clearFailureState ?? clearConversationFailureState)(name);
|
|
3637
|
+
return jsonResponse({
|
|
3638
|
+
...getConversationByName(name) ?? conv,
|
|
3639
|
+
sessionAlive: true
|
|
3640
|
+
});
|
|
3641
|
+
}
|
|
4079
3642
|
async function handleConversationResume(name, body, deps) {
|
|
4080
3643
|
try {
|
|
4081
3644
|
const conv = getConversationByName(name);
|
|
@@ -4091,8 +3654,7 @@ async function handleConversationResume(name, body, deps) {
|
|
|
4091
3654
|
reattached: true
|
|
4092
3655
|
});
|
|
4093
3656
|
}
|
|
4094
|
-
const oldSessionId = conv.claudeSessionId;
|
|
4095
|
-
const resumeCause = conv.status === "ended" ? "operator" : "system";
|
|
3657
|
+
const oldSessionId = conv.claudeSessionId, resumeCause = conv.status === "ended" ? "operator" : "system", sendResumeContract = body["sendResumeContract"] !== false;
|
|
4096
3658
|
const harness = conv.harness ?? "claude-code";
|
|
4097
3659
|
const modelChanged = !!model && model !== conv.model;
|
|
4098
3660
|
if (!await validateCwdContainment(conv.cwd)) return jsonResponse({ error: "Invalid cwd" }, { status: 400 });
|
|
@@ -4111,7 +3673,7 @@ async function handleConversationResume(name, body, deps) {
|
|
|
4111
3673
|
await spawnConversationSession(conv.tmuxSession, conv.cwd, oldSessionId ?? randomUUID$1(), model, effort, conv.issueId ?? void 0, canResume, harness);
|
|
4112
3674
|
await waitForTmuxSession(conv.tmuxSession);
|
|
4113
3675
|
await waitForConversationRuntimeReady(conv.tmuxSession, harness, "respawn");
|
|
4114
|
-
await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv));
|
|
3676
|
+
await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv), sendResumeContract);
|
|
4115
3677
|
markConversationActive(name);
|
|
4116
3678
|
return jsonResponse({
|
|
4117
3679
|
...conv,
|
|
@@ -4200,6 +3762,184 @@ async function handleConversationRestartAll(deps) {
|
|
|
4200
3762
|
}
|
|
4201
3763
|
}
|
|
4202
3764
|
//#endregion
|
|
3765
|
+
//#region ../../lib/pi-ask-modal.ts
|
|
3766
|
+
/**
|
|
3767
|
+
* PAN-3766 follow-up — answer an ohmypi `ask` modal from the dashboard.
|
|
3768
|
+
*
|
|
3769
|
+
* The conversation message route cannot answer a pi ask: the control channel's
|
|
3770
|
+
* steer/prompt lands in pi's input queue, but the modal holds the UI, so the
|
|
3771
|
+
* answer is swallowed and the agent stays parked. The only way through is to
|
|
3772
|
+
* drive the modal itself with keystrokes, exactly like the codex-approval and
|
|
3773
|
+
* pane-choice paths do for their native menus.
|
|
3774
|
+
*
|
|
3775
|
+
* Safety model mirrors answerSessionPaneChoice: re-verify the live state before
|
|
3776
|
+
* touching the session (pending ask in the transcript, modal footer and
|
|
3777
|
+
* question text on screen, cursor position parsed from the pane), then confirm
|
|
3778
|
+
* the modal is gone afterwards. Any drift returns 409 and the operator answers
|
|
3779
|
+
* in the terminal instead.
|
|
3780
|
+
*/
|
|
3781
|
+
init_agent_enrichment();
|
|
3782
|
+
init_jsonl_resolver();
|
|
3783
|
+
init_tmux();
|
|
3784
|
+
const PANE_CAPTURE_LINES = 90;
|
|
3785
|
+
const KEYSTROKE_GAP_MS = 60;
|
|
3786
|
+
const DELIVERY_CONFIRM_WAIT_MS = 700;
|
|
3787
|
+
/** The modal footer hint — the same signature the pane detector keys on. */
|
|
3788
|
+
const PI_ASK_FOOTER_RE = /Enter\s+select\b.*Esc\s+cancel/i;
|
|
3789
|
+
/** Cursor on a numbered option: "❯ ○ 1 · Label" (boxed) or "❯ 1 - Label". */
|
|
3790
|
+
const PI_ASK_CURSOR_NUMBERED_RE = /❯\s*○?\s*(\d+)\s*[·.\-]/;
|
|
3791
|
+
const PI_ASK_CURSOR_OTHER_RE = /❯\s*○?\s*Other\b/i;
|
|
3792
|
+
/** Strip box-drawing chrome and collapse whitespace so wrapped pane lines compare cleanly. */
|
|
3793
|
+
function normalizePaneText(text) {
|
|
3794
|
+
return text.replace(/[╭╮╰╯│├┤┌┐└┘─┬┴┼]/g, " ").replace(/\s+/g, " ").trim();
|
|
3795
|
+
}
|
|
3796
|
+
/** Paste text into the modal's Other input — no Enter; the caller sends that separately. */
|
|
3797
|
+
async function pasteTextIntoSession(sessionName, text) {
|
|
3798
|
+
const sendId = randomUUID$1();
|
|
3799
|
+
const tmpFile = join(tmpdir(), `pan-pi-ask-${sendId}.txt`);
|
|
3800
|
+
const bufferName = `pan-pi-ask-${sendId}`;
|
|
3801
|
+
try {
|
|
3802
|
+
await writeFile(tmpFile, text, "utf-8");
|
|
3803
|
+
await tmuxExecAsync([
|
|
3804
|
+
"load-buffer",
|
|
3805
|
+
"-b",
|
|
3806
|
+
bufferName,
|
|
3807
|
+
tmpFile
|
|
3808
|
+
], { encoding: "utf-8" });
|
|
3809
|
+
await tmuxExecAsync([
|
|
3810
|
+
"paste-buffer",
|
|
3811
|
+
"-b",
|
|
3812
|
+
bufferName,
|
|
3813
|
+
"-p",
|
|
3814
|
+
"-t",
|
|
3815
|
+
exactPaneTarget(sessionName)
|
|
3816
|
+
], { encoding: "utf-8" });
|
|
3817
|
+
} finally {
|
|
3818
|
+
await unlink(tmpFile).catch(() => {});
|
|
3819
|
+
}
|
|
3820
|
+
}
|
|
3821
|
+
/**
|
|
3822
|
+
* The cursor's current item position (0-based): numbered options come first,
|
|
3823
|
+
* then "Other (type your own)" as the final item. Null when unparseable.
|
|
3824
|
+
*/
|
|
3825
|
+
function piAskCursorPosition(pane, optionCount) {
|
|
3826
|
+
const lines = pane.split("\n");
|
|
3827
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
3828
|
+
const line = lines[i];
|
|
3829
|
+
const numbered = PI_ASK_CURSOR_NUMBERED_RE.exec(line);
|
|
3830
|
+
if (numbered) {
|
|
3831
|
+
const n = Number(numbered[1]);
|
|
3832
|
+
if (n >= 1 && n <= optionCount) return n - 1;
|
|
3833
|
+
return null;
|
|
3834
|
+
}
|
|
3835
|
+
if (PI_ASK_CURSOR_OTHER_RE.test(line)) return optionCount;
|
|
3836
|
+
}
|
|
3837
|
+
return null;
|
|
3838
|
+
}
|
|
3839
|
+
async function answerPiAskModal(sessionName, body, deps = {}) {
|
|
3840
|
+
try {
|
|
3841
|
+
const toolUseId = typeof body["toolUseId"] === "string" ? body["toolUseId"] : "";
|
|
3842
|
+
if (!toolUseId) return {
|
|
3843
|
+
body: { error: "toolUseId is required" },
|
|
3844
|
+
status: 400
|
|
3845
|
+
};
|
|
3846
|
+
const answers = body["answers"];
|
|
3847
|
+
if (!Array.isArray(answers) || answers.length !== 1 || typeof answers[0] !== "string" || !answers[0].trim()) return {
|
|
3848
|
+
body: { error: "answers must contain exactly one non-empty string" },
|
|
3849
|
+
status: 400
|
|
3850
|
+
};
|
|
3851
|
+
const answer = answers[0].trim();
|
|
3852
|
+
if (!await (deps.sessionExists ?? ((name) => Effect.runPromise(sessionExists(name))))(sessionName)) return {
|
|
3853
|
+
body: { error: "Conversation session is not running" },
|
|
3854
|
+
status: 409
|
|
3855
|
+
};
|
|
3856
|
+
const resolveTranscript = deps.resolveTranscript ?? ((name) => resolvePiSessionPath(name));
|
|
3857
|
+
const scanTranscript = deps.scanTranscript ?? scanPendingInputsPromise;
|
|
3858
|
+
const transcript = await resolveTranscript(sessionName);
|
|
3859
|
+
const pending = (transcript ? await scanTranscript(transcript) : null)?.askUserQuestions.find((q) => q.toolId === toolUseId);
|
|
3860
|
+
if (!pending) return {
|
|
3861
|
+
body: {
|
|
3862
|
+
error: "The question is no longer pending — it was answered or superseded",
|
|
3863
|
+
code: "ask-gone"
|
|
3864
|
+
},
|
|
3865
|
+
status: 409
|
|
3866
|
+
};
|
|
3867
|
+
if (pending.questions.length !== 1) return {
|
|
3868
|
+
body: {
|
|
3869
|
+
error: "This ask has multiple questions; answer it in the terminal",
|
|
3870
|
+
code: "multi-question-unsupported"
|
|
3871
|
+
},
|
|
3872
|
+
status: 409
|
|
3873
|
+
};
|
|
3874
|
+
const question = pending.questions[0];
|
|
3875
|
+
const capture = deps.capture ?? capturePaneText;
|
|
3876
|
+
const sendKey = deps.sendKey ?? ((name, key) => Effect.runPromise(sendRawKeystroke(name, key, "pi-ask-answer")));
|
|
3877
|
+
const sendText = deps.sendText ?? pasteTextIntoSession;
|
|
3878
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
3879
|
+
const pane = await capture(sessionName, PANE_CAPTURE_LINES);
|
|
3880
|
+
if (!PI_ASK_FOOTER_RE.test(pane)) return {
|
|
3881
|
+
body: {
|
|
3882
|
+
error: "The ask modal is no longer on screen",
|
|
3883
|
+
code: "modal-gone"
|
|
3884
|
+
},
|
|
3885
|
+
status: 409
|
|
3886
|
+
};
|
|
3887
|
+
const paneNorm = normalizePaneText(pane);
|
|
3888
|
+
const questionNorm = normalizePaneText(question.question).slice(0, 40);
|
|
3889
|
+
if (questionNorm.length >= 12 && !paneNorm.includes(questionNorm)) return {
|
|
3890
|
+
body: {
|
|
3891
|
+
error: "The ask modal changed since the dialog was rendered — refresh and re-answer",
|
|
3892
|
+
code: "modal-changed"
|
|
3893
|
+
},
|
|
3894
|
+
status: 409
|
|
3895
|
+
};
|
|
3896
|
+
const optionIndex = question.options.findIndex((o) => o.label.trim() === answer);
|
|
3897
|
+
const isCustomText = optionIndex < 0;
|
|
3898
|
+
const targetPosition = isCustomText ? question.options.length : optionIndex;
|
|
3899
|
+
const cursor = piAskCursorPosition(pane, question.options.length);
|
|
3900
|
+
if (cursor === null) return {
|
|
3901
|
+
body: {
|
|
3902
|
+
error: "Could not read the modal cursor — answer it from the terminal",
|
|
3903
|
+
code: "cursor-unknown"
|
|
3904
|
+
},
|
|
3905
|
+
status: 409
|
|
3906
|
+
};
|
|
3907
|
+
const delta = targetPosition - cursor;
|
|
3908
|
+
const navKey = delta > 0 ? "Down" : "Up";
|
|
3909
|
+
for (let i = 0; i < Math.abs(delta); i++) {
|
|
3910
|
+
await sendKey(sessionName, navKey);
|
|
3911
|
+
await sleep(KEYSTROKE_GAP_MS);
|
|
3912
|
+
}
|
|
3913
|
+
await sendKey(sessionName, "Enter");
|
|
3914
|
+
if (isCustomText) {
|
|
3915
|
+
await sleep(KEYSTROKE_GAP_MS * 3);
|
|
3916
|
+
await sendText(sessionName, answer);
|
|
3917
|
+
await sleep(KEYSTROKE_GAP_MS);
|
|
3918
|
+
await sendKey(sessionName, "Enter");
|
|
3919
|
+
}
|
|
3920
|
+
await sleep(DELIVERY_CONFIRM_WAIT_MS);
|
|
3921
|
+
const after = await capture(sessionName, PANE_CAPTURE_LINES);
|
|
3922
|
+
if (PI_ASK_FOOTER_RE.test(after)) return {
|
|
3923
|
+
body: {
|
|
3924
|
+
error: "Keystrokes were sent but the modal is still on screen — answer it from the terminal",
|
|
3925
|
+
code: "delivery-unconfirmed"
|
|
3926
|
+
},
|
|
3927
|
+
status: 409
|
|
3928
|
+
};
|
|
3929
|
+
return { body: {
|
|
3930
|
+
ok: true,
|
|
3931
|
+
answeredLabel: isCustomText ? answer : question.options[optionIndex].label
|
|
3932
|
+
} };
|
|
3933
|
+
} catch (error) {
|
|
3934
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
3935
|
+
console.error("[sessions] pi-ask answer failed:", message);
|
|
3936
|
+
return {
|
|
3937
|
+
body: { error: "Internal server error" },
|
|
3938
|
+
status: 500
|
|
3939
|
+
};
|
|
3940
|
+
}
|
|
3941
|
+
}
|
|
3942
|
+
//#endregion
|
|
4203
3943
|
//#region ../../lib/overdeck/conversation-delivery.ts
|
|
4204
3944
|
init_agent_input_detection();
|
|
4205
3945
|
init_conversations();
|
|
@@ -4413,6 +4153,40 @@ async function deliverConversationViaControlChannel(conv, message, options) {
|
|
|
4413
4153
|
source: options.source
|
|
4414
4154
|
});
|
|
4415
4155
|
}
|
|
4156
|
+
/**
|
|
4157
|
+
* PAN-3766 follow-up — answer a pi conversation's `ask` modal. The control
|
|
4158
|
+
* channel cannot do it: a steer queues behind the modal and is never seen.
|
|
4159
|
+
* The answer must drive the modal with keystrokes (see pi-ask-modal.ts).
|
|
4160
|
+
*/
|
|
4161
|
+
async function handleConversationPiAskAnswer(rawId, body, deps = {}) {
|
|
4162
|
+
try {
|
|
4163
|
+
const numericId = Number(rawId);
|
|
4164
|
+
const conv = !Number.isNaN(numericId) && /^\d+$/.test(rawId) ? getConversationById(numericId) : getConversationByName(rawId);
|
|
4165
|
+
if (!conv) return {
|
|
4166
|
+
body: { error: "Conversation not found" },
|
|
4167
|
+
status: 404
|
|
4168
|
+
};
|
|
4169
|
+
if (!isPiControlChannelHarness(conv.harness ?? "claude-code")) return {
|
|
4170
|
+
body: { error: "Not a Pi conversation" },
|
|
4171
|
+
status: 400
|
|
4172
|
+
};
|
|
4173
|
+
if (conv.status === "ended") return {
|
|
4174
|
+
body: { error: "Session has ended — start a new run to interact" },
|
|
4175
|
+
status: 422
|
|
4176
|
+
};
|
|
4177
|
+
return await answerPiAskModal(conv.tmuxSession, body, {
|
|
4178
|
+
...deps,
|
|
4179
|
+
sessionExists: deps.sessionExists ?? tmuxSessionExists
|
|
4180
|
+
});
|
|
4181
|
+
} catch (error) {
|
|
4182
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
4183
|
+
console.error("[conversations] pi ask answer failed:", msg);
|
|
4184
|
+
return {
|
|
4185
|
+
body: { error: "Internal server error" },
|
|
4186
|
+
status: 500
|
|
4187
|
+
};
|
|
4188
|
+
}
|
|
4189
|
+
}
|
|
4416
4190
|
async function handleConversationThinkingLevel(name, body) {
|
|
4417
4191
|
const conv = getConversationByName(name);
|
|
4418
4192
|
if (!conv) return jsonResponse({ error: "Conversation not found" }, { status: 404 });
|
|
@@ -4594,101 +4368,6 @@ function asRecord(value) {
|
|
|
4594
4368
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
4595
4369
|
}
|
|
4596
4370
|
//#endregion
|
|
4597
|
-
//#region ../../lib/session-pane-choice.ts
|
|
4598
|
-
init_pane_choice_menu();
|
|
4599
|
-
init_tmux();
|
|
4600
|
-
const PANE_CAPTURE_LINES = 90;
|
|
4601
|
-
const KEYSTROKE_GAP_MS = 60;
|
|
4602
|
-
const DELIVERY_CONFIRM_WAIT_MS = 700;
|
|
4603
|
-
async function captureSessionPaneChoice(sessionName, capture = capturePaneText) {
|
|
4604
|
-
let pane;
|
|
4605
|
-
try {
|
|
4606
|
-
pane = await capture(sessionName, PANE_CAPTURE_LINES);
|
|
4607
|
-
} catch {
|
|
4608
|
-
return null;
|
|
4609
|
-
}
|
|
4610
|
-
const menu = parsePaneChoiceMenu(pane);
|
|
4611
|
-
if (!menu) return null;
|
|
4612
|
-
return {
|
|
4613
|
-
signature: paneChoiceMenuSignature(menu),
|
|
4614
|
-
title: menu.title,
|
|
4615
|
-
contextLines: menu.contextLines,
|
|
4616
|
-
options: menu.options.map((option) => ({
|
|
4617
|
-
number: option.number,
|
|
4618
|
-
label: option.label,
|
|
4619
|
-
recommended: option.recommended
|
|
4620
|
-
})),
|
|
4621
|
-
selectedIndex: menu.selectedIndex,
|
|
4622
|
-
footerHint: menu.footerHint,
|
|
4623
|
-
confidence: menu.confidence
|
|
4624
|
-
};
|
|
4625
|
-
}
|
|
4626
|
-
async function answerSessionPaneChoice(sessionName, body, deps = {}) {
|
|
4627
|
-
try {
|
|
4628
|
-
const selectedIndex = Number(body.selectedIndex);
|
|
4629
|
-
const signature = typeof body.signature === "string" ? body.signature : "";
|
|
4630
|
-
if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex > 8) return {
|
|
4631
|
-
body: { error: "selectedIndex must be an integer 0-8" },
|
|
4632
|
-
status: 400
|
|
4633
|
-
};
|
|
4634
|
-
if (!signature) return {
|
|
4635
|
-
body: { error: "signature is required" },
|
|
4636
|
-
status: 400
|
|
4637
|
-
};
|
|
4638
|
-
if (!await (deps.sessionExists ?? ((name) => Effect.runPromise(sessionExists(name))))(sessionName)) return {
|
|
4639
|
-
body: { error: "Conversation session is not running" },
|
|
4640
|
-
status: 409
|
|
4641
|
-
};
|
|
4642
|
-
const capture = deps.capture ?? capturePaneText;
|
|
4643
|
-
const sendKey = deps.sendKey ?? ((name, key) => Effect.runPromise(sendRawKeystroke(name, key, "pane-choice")));
|
|
4644
|
-
const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
4645
|
-
const menu = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
|
|
4646
|
-
if (!menu) return {
|
|
4647
|
-
body: {
|
|
4648
|
-
error: "The choice menu is no longer on screen",
|
|
4649
|
-
code: "menu-gone"
|
|
4650
|
-
},
|
|
4651
|
-
status: 409
|
|
4652
|
-
};
|
|
4653
|
-
if (paneChoiceMenuSignature(menu) !== signature) return {
|
|
4654
|
-
body: {
|
|
4655
|
-
error: "The choice menu changed since the card was rendered — refresh and re-answer",
|
|
4656
|
-
code: "menu-changed"
|
|
4657
|
-
},
|
|
4658
|
-
status: 409
|
|
4659
|
-
};
|
|
4660
|
-
if (selectedIndex >= menu.options.length) return {
|
|
4661
|
-
body: { error: `selectedIndex out of range (0-${menu.options.length - 1})` },
|
|
4662
|
-
status: 400
|
|
4663
|
-
};
|
|
4664
|
-
const keys = buildChoiceKeystrokes(menu, selectedIndex);
|
|
4665
|
-
for (const key of keys) {
|
|
4666
|
-
await sendKey(sessionName, key);
|
|
4667
|
-
await sleep(KEYSTROKE_GAP_MS);
|
|
4668
|
-
}
|
|
4669
|
-
await sleep(DELIVERY_CONFIRM_WAIT_MS);
|
|
4670
|
-
const after = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
|
|
4671
|
-
if (after && paneChoiceMenuSignature(after) === signature) return {
|
|
4672
|
-
body: {
|
|
4673
|
-
error: "Keystrokes were sent but the menu is still on screen — answer it from the terminal",
|
|
4674
|
-
code: "delivery-unconfirmed"
|
|
4675
|
-
},
|
|
4676
|
-
status: 409
|
|
4677
|
-
};
|
|
4678
|
-
return { body: {
|
|
4679
|
-
ok: true,
|
|
4680
|
-
answeredLabel: menu.options[selectedIndex].label
|
|
4681
|
-
} };
|
|
4682
|
-
} catch (error) {
|
|
4683
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
4684
|
-
console.error("[sessions] pane-choice answer failed:", message);
|
|
4685
|
-
return {
|
|
4686
|
-
body: { error: "Internal server error" },
|
|
4687
|
-
status: 500
|
|
4688
|
-
};
|
|
4689
|
-
}
|
|
4690
|
-
}
|
|
4691
|
-
//#endregion
|
|
4692
4371
|
//#region ../../lib/channels/permission-payload.ts
|
|
4693
4372
|
const CHANNEL_PERMISSION_LIMITS = {
|
|
4694
4373
|
requestIdBytes: 128,
|
|
@@ -4983,7 +4662,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
|
|
|
4983
4662
|
error: "missing agent id"
|
|
4984
4663
|
}, { status: 400 });
|
|
4985
4664
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
4986
|
-
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-
|
|
4665
|
+
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-BCTEqUCX.js"));
|
|
4987
4666
|
const expected = getInternalTokenSync();
|
|
4988
4667
|
if (!expected) return jsonResponse({
|
|
4989
4668
|
ok: false,
|
|
@@ -5280,7 +4959,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
|
|
|
5280
4959
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
5281
4960
|
const urlOpt = HttpServerRequest.toURL(request);
|
|
5282
4961
|
const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
|
|
5283
|
-
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-
|
|
4962
|
+
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-BTqsmunw.js"));
|
|
5284
4963
|
const endTime = /* @__PURE__ */ new Date();
|
|
5285
4964
|
const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
|
|
5286
4965
|
const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
|
|
@@ -5295,7 +4974,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
|
|
|
5295
4974
|
return Effect.gen(function* () {
|
|
5296
4975
|
let eventBody = body;
|
|
5297
4976
|
if (body["kind"] === "linear_mcp_auth_required" || body["kind"] === "linear_mcp_auth_healthy") {
|
|
5298
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
4977
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-BAQApt97.js"));
|
|
5299
4978
|
const snapshot = yield* (yield* AgentStateService).get(id);
|
|
5300
4979
|
eventBody = {
|
|
5301
4980
|
...body,
|
|
@@ -5330,7 +5009,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
|
|
|
5330
5009
|
detail: String(decoded.failure)
|
|
5331
5010
|
}, { status: 400 })
|
|
5332
5011
|
};
|
|
5333
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
5012
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-BAQApt97.js"));
|
|
5334
5013
|
yield* (yield* AgentStateService).emit(decoded.success);
|
|
5335
5014
|
return {
|
|
5336
5015
|
ok: true,
|
|
@@ -5411,13 +5090,13 @@ const postAgentPlanChecklistRoute = HttpRouter.add("POST", "/api/agents/:id/plan
|
|
|
5411
5090
|
const auth = yield* Effect.promise(() => validateAgentRuntimeEventAuth(request));
|
|
5412
5091
|
if (!auth.ok) return auth.response;
|
|
5413
5092
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
5414
|
-
const { getAgentState } = yield* Effect.promise(() => import("./agents-
|
|
5093
|
+
const { getAgentState } = yield* Effect.promise(() => import("./agents-DixZjXWm.js"));
|
|
5415
5094
|
const state = yield* getAgentState(id);
|
|
5416
5095
|
if (!state?.workspace || !state.issueId) return jsonResponse({
|
|
5417
5096
|
success: false,
|
|
5418
5097
|
error: "agent has no resolvable workspace or issue id"
|
|
5419
5098
|
}, { status: 422 });
|
|
5420
|
-
const { checkIncompletePlanItemsPromise } = yield* Effect.promise(() => import("./done-preflight-
|
|
5099
|
+
const { checkIncompletePlanItemsPromise } = yield* Effect.promise(() => import("./done-preflight-CGFA0M1b.js"));
|
|
5421
5100
|
const incomplete = yield* Effect.promise(() => checkIncompletePlanItemsPromise(state.workspace, state.issueId));
|
|
5422
5101
|
return jsonResponse({
|
|
5423
5102
|
success: true,
|
|
@@ -5431,7 +5110,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
|
|
|
5431
5110
|
success: false,
|
|
5432
5111
|
error: "missing agent id"
|
|
5433
5112
|
}, { status: 400 });
|
|
5434
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
5113
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-BAQApt97.js"));
|
|
5435
5114
|
const snapshot = yield* (yield* AgentStateService).get(id);
|
|
5436
5115
|
if (!snapshot) return jsonResponse({
|
|
5437
5116
|
success: false,
|
|
@@ -5459,7 +5138,6 @@ init_workspace_manager();
|
|
|
5459
5138
|
*/
|
|
5460
5139
|
init_event_store();
|
|
5461
5140
|
init_agents$1();
|
|
5462
|
-
init_persistent_logger();
|
|
5463
5141
|
function prepareAgentStateForSave(state) {
|
|
5464
5142
|
if (state.status === "running" || state.status === "starting") delete state.stoppedAt;
|
|
5465
5143
|
else if (state.status === "stopped" && !state.stoppedAt) state.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -5623,8 +5301,8 @@ function createAgentStopHandler(lifecycleEvent) {
|
|
|
5623
5301
|
yield* stopAgent(id, "operator");
|
|
5624
5302
|
if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
|
|
5625
5303
|
try {
|
|
5626
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
5627
|
-
const { findWorkspacePath } = await import("./archive-planning-
|
|
5304
|
+
const { resolveProjectFromIssueSync } = await import("./projects-BMuEf14J.js");
|
|
5305
|
+
const { findWorkspacePath } = await import("./archive-planning-D3gw32U9.js");
|
|
5628
5306
|
const issueLower = stateBeforeStop.issueId.toLowerCase();
|
|
5629
5307
|
const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
|
|
5630
5308
|
if (workspacePath) {
|
|
@@ -5764,7 +5442,7 @@ const postAgentUnpauseRoute = HttpRouter.add("POST", "/api/agents/:id/unpause",
|
|
|
5764
5442
|
if ((yield* getWorkAgentLifecycleState(id)).canResumeSession && updatedState.troubled !== true) {
|
|
5765
5443
|
resumeTriggered = true;
|
|
5766
5444
|
yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.unpause_immediate_resume_triggered"));
|
|
5767
|
-
import("./resume-
|
|
5445
|
+
import("./resume-ByUrJUNX.js").then(({ resumeAgent }) => resumeAgent(id)).then((result) => {
|
|
5768
5446
|
if (!result.success) console.warn(`[agents] immediate resume after unpause failed for ${id}: ${result.error}`);
|
|
5769
5447
|
}).catch((err) => console.warn(`[agents] immediate resume after unpause errored for ${id}:`, err));
|
|
5770
5448
|
}
|
|
@@ -7177,15 +6855,15 @@ async function requestWorkStartAfterContainers(input) {
|
|
|
7177
6855
|
function handleRemoteAgentSpawn(input) {
|
|
7178
6856
|
return Effect.gen(function* () {
|
|
7179
6857
|
const { issueId, workspacePath, workspaceMetadata, spawnModel, startedBy, autoSpawnConsentRequired, projectPath, spawnGuardrails, lifecycle } = input;
|
|
7180
|
-
const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-
|
|
7181
|
-
const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-
|
|
7182
|
-
const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-
|
|
6858
|
+
const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-MuXx2gWm.js"));
|
|
6859
|
+
const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-BTh-sjpX.js"));
|
|
6860
|
+
const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-CvKH7r7W.js"));
|
|
7183
6861
|
const panConfig = loadPanConfig();
|
|
7184
6862
|
const spendCap = checkRemoteSpendCap(panConfig);
|
|
7185
6863
|
if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
|
|
7186
6864
|
const fly = createFlyProviderFromConfig(panConfig.remote);
|
|
7187
6865
|
yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
|
|
7188
|
-
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt
|
|
6866
|
+
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-BnhKNAg7.js"));
|
|
7189
6867
|
const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
|
|
7190
6868
|
const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
|
|
7191
6869
|
issueId,
|
|
@@ -7919,7 +7597,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
7919
7597
|
console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
|
|
7920
7598
|
}
|
|
7921
7599
|
try {
|
|
7922
|
-
const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-
|
|
7600
|
+
const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
|
|
7923
7601
|
await appendSessionEntry(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId, {
|
|
7924
7602
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
7925
7603
|
reason: "start",
|
|
@@ -8367,14 +8045,14 @@ function firePostMergeLifecycle(issueId, options) {
|
|
|
8367
8045
|
const normalizedIssueId = parsedIssueId.normalized.toUpperCase();
|
|
8368
8046
|
const started = postMergeGuard.run(normalizedIssueId, async () => {
|
|
8369
8047
|
const projectPath = getProjectPathForIssue(parsedIssueId.prefix);
|
|
8370
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
8048
|
+
const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
|
|
8371
8049
|
const lifecycleOptions = {
|
|
8372
8050
|
...options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : {},
|
|
8373
8051
|
...options?.verifiedMergedRepos?.length ? { verifiedMergedRepos: options.verifiedMergedRepos } : {}
|
|
8374
8052
|
};
|
|
8375
8053
|
await postMergeLifecycle(normalizedIssueId, projectPath, options?.sourceBranch, Object.keys(lifecycleOptions).length > 0 ? lifecycleOptions : void 0);
|
|
8376
8054
|
console.log(`[merge] post-merge lifecycle completed for ${normalizedIssueId}`);
|
|
8377
|
-
const { runMergeTrainReconcile } = await import("./merge-train-
|
|
8055
|
+
const { runMergeTrainReconcile } = await import("./merge-train-VxLn8Ms4.js");
|
|
8378
8056
|
const outcomes = await runMergeTrainReconcile(normalizedIssueId);
|
|
8379
8057
|
if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${normalizedIssueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
|
|
8380
8058
|
}, (err) => console.error(`[merge] post-merge lifecycle failed for ${normalizedIssueId}:`, err));
|
|
@@ -8394,15 +8072,15 @@ init_review_status();
|
|
|
8394
8072
|
init_io();
|
|
8395
8073
|
init_tmux();
|
|
8396
8074
|
const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
|
|
8397
|
-
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
8075
|
+
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
8398
8076
|
return jsonResponse({
|
|
8399
8077
|
specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
|
|
8400
8078
|
projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
|
|
8401
8079
|
});
|
|
8402
8080
|
})));
|
|
8403
8081
|
const postSpecialistsResetAllRoute = HttpRouter.add("POST", "/api/specialists/reset-all", httpHandler(Effect.gen(function* () {
|
|
8404
|
-
const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
8405
|
-
const { clearHookSync } = yield* Effect.promise(() => import("./hooks-
|
|
8082
|
+
const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
8083
|
+
const { clearHookSync } = yield* Effect.promise(() => import("./hooks-EndRNrx9.js"));
|
|
8406
8084
|
const specialists = getAllSpecialists();
|
|
8407
8085
|
const results = [];
|
|
8408
8086
|
for (const specialist of specialists) {
|
|
@@ -8461,7 +8139,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8461
8139
|
}
|
|
8462
8140
|
console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
|
|
8463
8141
|
if (specialist === "merge") {
|
|
8464
|
-
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-
|
|
8142
|
+
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-BMv3K54P.js"));
|
|
8465
8143
|
if (yield* reportSpecialistCompletion(normalizedIssueId, {
|
|
8466
8144
|
status,
|
|
8467
8145
|
notes
|
|
@@ -8488,7 +8166,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8488
8166
|
if (project) {
|
|
8489
8167
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8490
8168
|
if (existsSync(workspacePath)) {
|
|
8491
|
-
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
8169
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-BAMwn9Nf.js");
|
|
8492
8170
|
reviewEvidenceHead = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
|
|
8493
8171
|
}
|
|
8494
8172
|
}
|
|
@@ -8537,7 +8215,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8537
8215
|
if (project && failedItemId) {
|
|
8538
8216
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8539
8217
|
if (existsSync(workspacePath)) {
|
|
8540
|
-
const { onInspectComplete } = await import("./inspect-agent-
|
|
8218
|
+
const { onInspectComplete } = await import("./inspect-agent-Dhp3hCGp.js");
|
|
8541
8219
|
await Effect.runPromise(onInspectComplete(project.projectKey, normalizedIssueId, failedItemId, "failed", workspacePath, notes));
|
|
8542
8220
|
}
|
|
8543
8221
|
}
|
|
@@ -8548,7 +8226,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8548
8226
|
}
|
|
8549
8227
|
yield* Effect.promise(async () => {
|
|
8550
8228
|
try {
|
|
8551
|
-
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-
|
|
8229
|
+
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-CYt1U3Zm.js");
|
|
8552
8230
|
const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
|
|
8553
8231
|
const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
|
|
8554
8232
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -8567,7 +8245,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8567
8245
|
});
|
|
8568
8246
|
console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
|
|
8569
8247
|
}
|
|
8570
|
-
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-
|
|
8248
|
+
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-BDKoz5Z9.js");
|
|
8571
8249
|
if (await Effect.runPromise(updateSpecialistHandoffStatus(normalizedIssueId, `${specialist}-agent`, status === "passed" ? "completed" : "failed", status === "passed" ? "success" : "failure"))) console.log(`[specialists/done] Updated handoff log: ${specialist}-agent ${normalizedIssueId} → ${status}`);
|
|
8572
8250
|
} catch (err) {
|
|
8573
8251
|
console.error(`[specialists/done] Error managing specialist state:`, err);
|
|
@@ -8579,7 +8257,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8579
8257
|
if (project) {
|
|
8580
8258
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8581
8259
|
if (existsSync(workspacePath)) {
|
|
8582
|
-
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
8260
|
+
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-BAMwn9Nf.js");
|
|
8583
8261
|
const headAnchor = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
|
|
8584
8262
|
if (headAnchor) {
|
|
8585
8263
|
setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: headAnchor });
|
|
@@ -8593,7 +8271,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8593
8271
|
});
|
|
8594
8272
|
if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
|
|
8595
8273
|
try {
|
|
8596
|
-
const { onInspectComplete } = await import("./inspect-agent-
|
|
8274
|
+
const { onInspectComplete } = await import("./inspect-agent-Dhp3hCGp.js");
|
|
8597
8275
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
8598
8276
|
if (project) {
|
|
8599
8277
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
@@ -8609,7 +8287,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8609
8287
|
if (project) {
|
|
8610
8288
|
if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
|
|
8611
8289
|
setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
|
|
8612
|
-
const { initEventStore } = await import("./event-store-
|
|
8290
|
+
const { initEventStore } = await import("./event-store-C50Qt-f1.js");
|
|
8613
8291
|
await (await initEventStore()).appendAsync({
|
|
8614
8292
|
type: "test.passed",
|
|
8615
8293
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -8662,8 +8340,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8662
8340
|
if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
|
|
8663
8341
|
try {
|
|
8664
8342
|
const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
|
|
8665
|
-
const { sessionExists } = await import("./tmux-
|
|
8666
|
-
const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-
|
|
8343
|
+
const { sessionExists } = await import("./tmux-CYucGrTl.js");
|
|
8344
|
+
const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-DixZjXWm.js");
|
|
8667
8345
|
if (await Effect.runPromise(sessionExists(workAgentId))) {
|
|
8668
8346
|
await messageAgent(workAgentId, `MERGE CONFLICT: The merge-agent could not rebase your branch onto main due to conflicts. Please fix this now:\n\n1. git fetch origin main\n2. git rebase origin/main\n3. Resolve any conflicts (git add <file> && git rebase --continue)\n4. git push --force-with-lease\n5. Resubmit: curl -s -X POST http://localhost:3011/api/review/${normalizedIssueId}/request -H "Content-Type: application/json" -d "{}"\n\nConflict details: ${notes}`);
|
|
8669
8347
|
console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
|
|
@@ -8677,7 +8355,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8677
8355
|
try {
|
|
8678
8356
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
8679
8357
|
const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
|
|
8680
|
-
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-
|
|
8358
|
+
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-tyMoLT2L.js");
|
|
8681
8359
|
const result = await Effect.runPromise(deliverReviewVerdictFeedback({
|
|
8682
8360
|
issueId: normalizedIssueId,
|
|
8683
8361
|
verdict: status === "failed" ? "failed" : "blocked",
|
|
@@ -8697,7 +8375,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8697
8375
|
if (project) {
|
|
8698
8376
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8699
8377
|
if (existsSync(workspacePath)) {
|
|
8700
|
-
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
8378
|
+
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-BAMwn9Nf.js");
|
|
8701
8379
|
const reviewedAtCommit = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
|
|
8702
8380
|
if (reviewedAtCommit) {
|
|
8703
8381
|
setReviewStatusSync(normalizedIssueId, { reviewedAtCommit });
|
|
@@ -8737,7 +8415,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8737
8415
|
});
|
|
8738
8416
|
})));
|
|
8739
8417
|
const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/specialists/logs/cleanup-all", httpHandler(Effect.gen(function* () {
|
|
8740
|
-
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8418
|
+
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
|
|
8741
8419
|
const results = cleanupAllLogsSync();
|
|
8742
8420
|
return jsonResponse({
|
|
8743
8421
|
success: true,
|
|
@@ -8747,7 +8425,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
8747
8425
|
});
|
|
8748
8426
|
})));
|
|
8749
8427
|
const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
|
|
8750
|
-
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
8428
|
+
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
8751
8429
|
return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
|
|
8752
8430
|
})));
|
|
8753
8431
|
const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
|
|
@@ -8791,7 +8469,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
|
|
|
8791
8469
|
"blocked",
|
|
8792
8470
|
"failed"
|
|
8793
8471
|
].includes(status)) {
|
|
8794
|
-
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
8472
|
+
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
8795
8473
|
saveAgentRuntimeState(getTmuxSessionName(name), {
|
|
8796
8474
|
state: "idle",
|
|
8797
8475
|
lastActivity: (/* @__PURE__ */ new Date()).toISOString()
|
|
@@ -8913,7 +8591,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
|
|
|
8913
8591
|
const issueId = params["issueId"];
|
|
8914
8592
|
const type = params["type"];
|
|
8915
8593
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
8916
|
-
const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-
|
|
8594
|
+
const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
8917
8595
|
const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
|
|
8918
8596
|
yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
|
|
8919
8597
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -8940,7 +8618,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
|
|
|
8940
8618
|
if (limitParam) limit = parseInt(limitParam, 10);
|
|
8941
8619
|
if (offsetParam) offset = parseInt(offsetParam, 10);
|
|
8942
8620
|
}
|
|
8943
|
-
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8621
|
+
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
|
|
8944
8622
|
return jsonResponse(listRunLogsSync(project, type, {
|
|
8945
8623
|
limit,
|
|
8946
8624
|
offset
|
|
@@ -8951,7 +8629,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
|
|
|
8951
8629
|
const project = params["project"];
|
|
8952
8630
|
const type = params["type"];
|
|
8953
8631
|
const runId = params["runId"];
|
|
8954
|
-
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8632
|
+
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
|
|
8955
8633
|
const logPath = getRunLogPath(project, type, runId);
|
|
8956
8634
|
if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
8957
8635
|
const encoder = new TextEncoder();
|
|
@@ -9010,7 +8688,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
|
|
|
9010
8688
|
const project = params["project"];
|
|
9011
8689
|
const type = params["type"];
|
|
9012
8690
|
const runId = params["runId"];
|
|
9013
|
-
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8691
|
+
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
|
|
9014
8692
|
const content = getRunLogSync(project, type, runId);
|
|
9015
8693
|
if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
9016
8694
|
return jsonResponse({
|
|
@@ -9024,7 +8702,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
|
|
|
9024
8702
|
const project = params["project"];
|
|
9025
8703
|
const type = params["type"];
|
|
9026
8704
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
9027
|
-
const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-
|
|
8705
|
+
const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
9028
8706
|
yield* Effect.promise(() => terminateSpecialist(project, type));
|
|
9029
8707
|
return jsonResponse({
|
|
9030
8708
|
success: true,
|
|
@@ -9036,7 +8714,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
|
|
|
9036
8714
|
const project = params["project"];
|
|
9037
8715
|
const type = params["type"];
|
|
9038
8716
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
9039
|
-
const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
8717
|
+
const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
9040
8718
|
if (pauseGracePeriod(project, type)) return jsonResponse({
|
|
9041
8719
|
success: true,
|
|
9042
8720
|
message: "Grace period paused"
|
|
@@ -9048,7 +8726,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
|
|
|
9048
8726
|
const project = params["project"];
|
|
9049
8727
|
const type = params["type"];
|
|
9050
8728
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
9051
|
-
const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
8729
|
+
const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
9052
8730
|
if (resumeGracePeriod(project, type)) return jsonResponse({
|
|
9053
8731
|
success: true,
|
|
9054
8732
|
message: "Grace period resumed"
|
|
@@ -9060,7 +8738,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
|
|
|
9060
8738
|
const project = params["project"];
|
|
9061
8739
|
const type = params["type"];
|
|
9062
8740
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
9063
|
-
const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
8741
|
+
const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
9064
8742
|
exitGracePeriod(project, type);
|
|
9065
8743
|
return jsonResponse({
|
|
9066
8744
|
success: true,
|
|
@@ -9072,7 +8750,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
|
|
|
9072
8750
|
const project = params["project"];
|
|
9073
8751
|
const type = params["type"];
|
|
9074
8752
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
9075
|
-
const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-
|
|
8753
|
+
const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
9076
8754
|
const state = getGracePeriodState(project, type);
|
|
9077
8755
|
if (state) return jsonResponse(state);
|
|
9078
8756
|
else return jsonResponse({ error: "No active grace period" }, { status: 404 });
|
|
@@ -9081,7 +8759,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
|
|
|
9081
8759
|
const params = yield* HttpRouter.params;
|
|
9082
8760
|
const project = params["project"];
|
|
9083
8761
|
const type = params["type"];
|
|
9084
|
-
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
8762
|
+
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-C1-CfYQb.js"));
|
|
9085
8763
|
const digest = loadContextDigest(project, type);
|
|
9086
8764
|
if (digest) return jsonResponse({ digest });
|
|
9087
8765
|
else return jsonResponse({ error: "No context digest found" }, { status: 404 });
|
|
@@ -9090,7 +8768,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
|
|
|
9090
8768
|
const params = yield* HttpRouter.params;
|
|
9091
8769
|
const project = params["project"];
|
|
9092
8770
|
const type = params["type"];
|
|
9093
|
-
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
8771
|
+
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-C1-CfYQb.js"));
|
|
9094
8772
|
const digest = yield* regenerateContextDigest(project, type);
|
|
9095
8773
|
if (digest) return jsonResponse({
|
|
9096
8774
|
digest,
|
|
@@ -9109,7 +8787,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
9109
8787
|
"blocked"
|
|
9110
8788
|
].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
|
|
9111
8789
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
9112
|
-
const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-
|
|
8790
|
+
const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
|
|
9113
8791
|
signalSpecialistCompletion(project, type, {
|
|
9114
8792
|
status,
|
|
9115
8793
|
notes
|
|
@@ -9143,8 +8821,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
|
|
|
9143
8821
|
const params = yield* HttpRouter.params;
|
|
9144
8822
|
const project = params["project"];
|
|
9145
8823
|
const type = params["type"];
|
|
9146
|
-
const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
9147
|
-
const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-
|
|
8824
|
+
const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
|
|
8825
|
+
const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-BMuEf14J.js"));
|
|
9148
8826
|
const retention = getSpecialistRetention(project);
|
|
9149
8827
|
const deleted = cleanupOldLogsSync(project, type, {
|
|
9150
8828
|
maxDays: retention.max_days,
|
|
@@ -9165,7 +8843,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
9165
8843
|
const project = params["project"];
|
|
9166
8844
|
const issueId = params["issueId"];
|
|
9167
8845
|
const { model, harness } = yield* readJsonBody;
|
|
9168
|
-
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-
|
|
8846
|
+
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
|
|
9169
8847
|
const killResult = yield* killAllReviewerSessions(project, issueId);
|
|
9170
8848
|
const projectConfig = resolveProjectFromIssueSync(issueId);
|
|
9171
8849
|
if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
|
|
@@ -9181,7 +8859,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
9181
8859
|
}));
|
|
9182
8860
|
branch = stdout.trim() || primaryRepo.sourceBranch;
|
|
9183
8861
|
} catch {}
|
|
9184
|
-
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-
|
|
8862
|
+
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
|
|
9185
8863
|
const prUrl = getReviewStatusSync(issueId)?.prUrl;
|
|
9186
8864
|
const result = yield* spawnReviewRoleForIssue({
|
|
9187
8865
|
issueId,
|
|
@@ -9225,7 +8903,7 @@ const postProjectReviewerRoleRestartRoute = HttpRouter.add("POST", "/api/special
|
|
|
9225
8903
|
const { model } = yield* readJsonBody;
|
|
9226
8904
|
const reviewer = getAgentStateSync(reviewerId);
|
|
9227
8905
|
yield* Effect.promise(() => Effect.runPromise(killSession(reviewerId)).catch(() => void 0));
|
|
9228
|
-
const { spawnReviewSubRoleForIssue } = yield* Effect.promise(() => import("./review-agent-
|
|
8906
|
+
const { spawnReviewSubRoleForIssue } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
|
|
9229
8907
|
const result = yield* spawnReviewSubRoleForIssue({
|
|
9230
8908
|
issueId,
|
|
9231
8909
|
workspace: parent.workspace,
|
|
@@ -9353,6 +9031,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
|
|
|
9353
9031
|
*/
|
|
9354
9032
|
const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
|
|
9355
9033
|
//#endregion
|
|
9356
|
-
export { resolvePolicy as $, handleConversationSwitchModel as A,
|
|
9034
|
+
export { resolvePolicy as $, handleConversationSwitchModel as A, waitForTmuxSession as B, conversationSessionAliveFromState as C, getDefaultCwd as Ct, handleConversationRestartAll as D, handleConversationDelete as E, spawnConversationSession as F, extractConversationAttachmentPaths as G, cleanupOrphanedConversationAttachments as H, startConversationModelBackfill as I, isManagedConversationAttachmentPath as J, getConversationAttachmentsRoot as K, stopConversationRuntime as L, resolveAllowedHarness as M, resolveRegisteredProject as N, handleConversationResume as O, shouldReportUnresolvedLiveSession as P, handleComposerCommandMessage as Q, tmuxSessionExists as R, conversationNeedsRunningRepair as S, httpHandler as St, handleConversationCreate as T, jsonStringResponse as Tt, cleanupUnreferencedConversationAttachments as U, cleanupConversationAttachments as V, ensureConversationAttachmentDir as W, runInBatches as X, removeConversationAttachment as Y, composerCommandResultHttpStatus as Z, handleConversationThinkingLevel as _, waitForSessionRespawn as _t, agentsRouteLayer as a, isInternalAgentRequest as at, resolveConversationDeliveryMethod as b, validateOrigin as bt, codexConversationPendingInput as c, panCliInvocation as ct, handleConversationCodexApproval as d, dashboardSessionCookieHeader as dt, ComposerCommandParseError as et, handleConversationCompact as f, hasDashboardInternalToken as ft, handleConversationPlanAction as g, isRespawnPending as gt, handleConversationPiAskAnswer as h, rejectUnsafeDashboardMutationRequest as ht, validateSpecialistAutoCompleteMetadata as i, invalidateAgentsCache as it, isInsideGitWorkTree as j, handleConversationStop as k, deliverConversationViaControlChannel as l, spawnPanCli as lt, handleConversationDeliveryMethod as m, rejectUnauthorizedDashboardSessionMintRequest as mt, _serverManagedMerges as n, composerCommandConfirmationFromBody as nt, saveAgentStateAndEmitEvent as o, resolveRequestedStartedBy as ot, handleConversationControlAck as p, rejectUnauthorizedDashboardRequest as pt, hasConversationAttachment as q, firePostMergeLifecycle as r, evaluateSpawnGuardrails as rt, saveAgentStateAndEmitEventProgram as s, getWorkAgentLifecycleStateSync as st, specialistsRouteLayer as t, ComposerCommandConfirmationError as tt, handleConversationAbort as u, dashboardCsrfToken as ut, isPiControlChannelHarness as v, getHeaderFromMap as vt, handleConversationClearForkState as w, jsonResponse as wt, validateConversationControlAckOrigin as x, validateOriginHeaders as xt, pickDeliverAs as y, isTrustedOriginForHost as yt, waitForPiTuiReady as z };
|
|
9357
9035
|
|
|
9358
|
-
//# sourceMappingURL=specialists-
|
|
9036
|
+
//# sourceMappingURL=specialists-DhS79T9v.js.map
|