@overdeck/desktop 0.49.1 → 0.49.2
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/package.json +1 -1
- package/server/{acceptance-criteria-Crw-xSJ3.js → acceptance-criteria-CHtDkHEL.js} +2 -2
- package/server/{active-dashboard-bundle-CLwfD-Om.js → active-dashboard-bundle-Byh6sP-q.js} +2 -2
- package/server/{activity-logger-BAVLrkR7.js → activity-logger-BWZhVphb.js} +22 -4
- package/server/activity-logger-Ck8qoluj.js +3 -0
- package/server/{advancing-selfheal-BQiJ7mIH.js → advancing-selfheal-65W4yUQi.js} +6 -6
- package/server/{agent-gc-5E0lgxI1.js → agent-gc-BNUudFnt.js} +10 -10
- package/server/agent-idle-ONBssBN_.js +745 -0
- package/server/{agent-state-Bb3UUxQm.js → agent-state-BJhGIJZe.js} +421 -135
- package/server/agent-state-CM8iVw5B.js +3 -0
- package/server/{agent-state-service-BFbttwRA.js → agent-state-service-CiIuwzIs.js} +5 -5
- package/server/{agent-state-service-keg-x1bT.js → agent-state-service-CzHfoqKQ.js} +1 -1
- package/server/agents-DpCuoF65.js +3 -0
- package/server/{agents-CqQJW75N.js → agents-jXgqpHca.js} +8 -8
- package/server/archive-planning-BW4MKNI7.js +2 -0
- package/server/{archive-planning-BwEhu9Oq.js → archive-planning-CGkU6UeL.js} +20 -135
- package/server/{artifact-index-jobs-C6Lg2rKm.js → artifact-index-jobs-Ck4NRRkY.js} +3 -3
- package/server/{assemble-DyTp2gSB.js → assemble-CyvEBmmq.js} +28 -9
- package/server/{auto-spawn-consent-BDfe4qz0.js → auto-spawn-consent-Dc4mtM-B.js} +8 -7
- package/server/{backlog-auto-trigger-DuOGpdDW.js → backlog-auto-trigger-CCEpr4YT.js} +3 -3
- package/server/{behavior-Bitko0mD.js → behavior-BiCQzqyT.js} +3 -3
- package/server/{bridge-pool-patrol-DiHEd13O.js → bridge-pool-patrol-Ce8rNPym.js} +2 -2
- package/server/{briefing-freshness-CDJcmHHZ.js → briefing-freshness-e_OEYZEe.js} +2 -2
- package/server/{build-info-DTX8JwVP.js → build-info-BRw4QlYO.js} +3 -3
- package/server/build-info-Bj2vQEMh.js +2 -0
- package/server/{checkpoint-manager-CKg1tn34.js → checkpoint-manager-CKr42Usw.js} +1 -1
- package/server/{checkpoint-manager-BlOOdzLF.js → checkpoint-manager-DOwRGFff.js} +26 -9
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-DRALkfDS.js → checkpoints-Cb6CWT4S.js} +1 -1
- package/server/{checkpoints-BGfl0cHM.js → checkpoints-Cszp_0Np.js} +2 -2
- package/server/{claude-hooks-provision-B_tv3wzE.js → claude-hooks-provision-C5JHpxTS.js} +1 -1
- package/server/{claude-hooks-provision-BlGv6twJ.js → claude-hooks-provision-Cer2eFfj.js} +2 -2
- package/server/{claude-permissions-aHgDcZi5.js → claude-permissions-Bc5kjX1q.js} +2 -2
- package/server/{claude-settings-overlay-CYOvFE3A.js → claude-settings-overlay-C7rWsnya.js} +1 -1
- package/server/{claude-settings-overlay-T2LWLteV.js → claude-settings-overlay-m-VVZej1.js} +2 -2
- package/server/cli-BRuzUT_I.js +2 -0
- package/server/{cli-Do8UpLoI.js → cli-BmczsfD6.js} +11 -11
- package/server/{cliproxy-CX6jHRDP.js → cliproxy-BpYpkogS.js} +52 -17
- package/server/cliproxy-_yUU0HRY.js +3 -0
- package/server/{close-issue-J0_eWYT1.js → close-issue-CxvRD0UI.js} +5 -5
- package/server/{closed-issue-reaper-bFppuk6F.js → closed-issue-reaper-nMLRi5de.js} +13 -12
- package/server/{closed-issue-reaper-Cl2h9AfT.js → closed-issue-reaper-omOcUDBl.js} +1 -1
- package/server/{codex-icapA4om.js → codex-DZhFfcWu.js} +1 -1
- package/server/{codex-OOea7lXs.js → codex-KaSKE-R3.js} +16 -10
- package/server/{compaction-continuation-D5voR1ME.js → compaction-continuation-Bjfi70G-.js} +3 -3
- package/server/{config-Cjleh3_U.js → config-CH1AqqIQ.js} +1 -1
- package/server/{config-DC75T4Mr.js → config-Doq_tF-f.js} +2 -2
- package/server/{config-tucKBCCc.js → config-ZGjvuR6J.js} +2 -2
- package/server/{config-yaml-BwOEANMr.js → config-yaml-D9nfpEx1.js} +33 -8
- package/server/{conflict-gate-DlpWCMd7.js → conflict-gate-D4XCtrm2.js} +1 -1
- package/server/{conflict-gate-D2L1kZeL.js → conflict-gate-DcUTY4Gb.js} +4 -4
- package/server/{context-layers-CSPGc2Hb.js → context-layers-BBTKP-Y4.js} +3 -3
- package/server/context-layers-BGj2Y9l3.js +4 -0
- package/server/{continue-U3Af0jUq.js → continue-i7Revg8D.js} +3 -3
- package/server/{control-settings-5k6ixdFW.js → control-settings-BMoDHY1G.js} +6 -6
- package/server/{conversation-compaction-CSpVpxN6.js → conversation-compaction-D4VOmF7p.js} +8 -8
- package/server/{conversation-compaction-Ciit9O6k.js → conversation-compaction-DzIjYMfg.js} +1 -1
- package/server/{conversation-service-BxrB5lUT.js → conversation-service-CzZUJFEx.js} +1 -1
- package/server/{conversation-service-BteE4ELK.js → conversation-service-tQCIbBVZ.js} +6 -6
- package/server/{conversations-DhwxsOru.js → conversations-C75EFFjf.js} +12 -7
- package/server/conversations-bFDaD5YN.js +3 -0
- package/server/{cost-Bnf9NUC5.js → cost-BCWEkvro.js} +3 -3
- package/server/{cost-CQKI6OCu.js → cost-CiIwxH1D.js} +2 -2
- package/server/{cost-sync-B-ADeXKY.js → cost-sync-DOkdE_yB.js} +3 -3
- package/server/{dag-DI9LaK_q.js → dag-BPc74hwj.js} +6 -19
- package/server/{dangerous-git-ops-akhA3iyF.js → dangerous-git-ops-By9iguTP.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-TPYssFYt.js → deacon-B24dNzr8.js} +1774 -171
- package/server/deacon-CzSZMtb-.js +4 -0
- package/server/{deacon-canonical-state-DFYymrDw.js → deacon-canonical-state-CkvxRPck.js} +3 -3
- package/server/{deacon-event-client-Te5v10-b.js → deacon-event-client-BYIQBu0T.js} +1 -1
- package/server/{deacon-event-client-BKOL4AcL.js → deacon-event-client-Do6Z2gKl.js} +2 -2
- package/server/{deacon-nudge-log-BtlTWgWu.js → deacon-nudge-log-CzM9JA9t.js} +1 -1
- package/server/{deacon-pending-lifecycle-DVHjOLje.js → deacon-pending-lifecycle-BObEdT-L.js} +3 -3
- package/server/deacon.js +11 -11
- package/server/dead-end-trip-6V_CwveT.js +2 -0
- package/server/{dead-end-trip-P0IF1O0E.js → dead-end-trip-CnVmjnya.js} +3 -3
- package/server/delivery-gyce0vQ7.js +3 -0
- package/server/{deploy-patrol-BXjlvoV3.js → deploy-patrol-CEwwEYDM.js} +8 -8
- package/server/deploy-queue-CjLErpgw.js +2 -0
- package/server/{deploy-queue-o7shYg1j.js → deploy-queue-r96ojDI3.js} +2 -2
- package/server/{deploy-window-CNT6fOff.js → deploy-window-D_3hhfxt.js} +4 -4
- package/server/{deploy-window-BMk5_oX6.js → deploy-window-DeJK8mTK.js} +1 -1
- package/server/{dev-supervisor-SR1CLOAK.js → dev-supervisor-DZWwpENk.js} +2 -2
- package/server/{devcontainer-renderer-enMmNDFa.js → devcontainer-renderer-d-9dCV_2.js} +3 -3
- package/server/{dist-CPTO_zMR.js → dist-DsLAsFSh.js} +1 -1
- package/server/dist-fCA6y2bH.js +3 -0
- package/server/{docker-B7qUZptz.js → docker-B2mUBzGk.js} +3 -3
- package/server/{docker-KR3zSFKY.js → docker-CRPHBylA.js} +1 -1
- package/server/{dod-gK835UMf.js → dod-DWtilRLx.js} +1 -1
- package/server/{done-preflight-CksRvh49.js → done-preflight-BDVdWed5.js} +1 -1
- package/server/{done-preflight-Bk8aExAL.js → done-preflight-D4ukUf-S.js} +5 -5
- package/server/{driver-CmsY2RLl.js → driver-BtcFz-qu.js} +14 -3
- package/server/{durable-review-pipeline-DgYHucN2.js → durable-review-pipeline-B3OS2_He.js} +11 -2
- package/server/durable-review-pipeline-CaCbEJSt.js +3 -0
- package/server/{ensure-devcontainer-ojerEqQg.js → ensure-devcontainer-BUeBRjmm.js} +4 -4
- package/server/{ensure-devcontainer-BQ4YizSH.js → ensure-devcontainer-rGSh0JHK.js} +1 -1
- package/server/{esm-shims-1htPASWs.js → esm-shims-oAaKIa-a.js} +1 -1
- package/server/{event-store-D7qcJXuZ.js → event-store-BCSgMubf.js} +5 -5
- package/server/{event-store-BgEjNsvk.js → event-store-Db4w4YIY.js} +1 -1
- package/server/{event-store-provider-BKvk2rDj.js → event-store-provider-DlSQND3V.js} +1 -1
- package/server/{events-BIKGJZOT.js → events-B6zioJA_.js} +3 -3
- package/server/{dist-src-BM9eudEd.js → factory-BrdqXBeK.js} +714 -2
- package/server/{feature-registry-storage-ewNSIVsQ.js → feature-registry-storage-zh3ZXW6f.js} +3 -3
- package/server/{features-CGopJXdU.js → features-BGntOWdy.js} +2 -2
- package/server/{feedback-stuck-retirement-B8-fX7NA.js → feedback-stuck-retirement-DpA5u1kt.js} +2 -2
- package/server/{feedback-target-Ci6N5p4G.js → feedback-target-D7GxdUYG.js} +10 -10
- package/server/{feedback-target-CkyLYohm.js → feedback-target-Ddqk93NF.js} +1 -1
- package/server/{feedback-writer-D4ULO4qG.js → feedback-writer-C1gCLFmp.js} +5 -5
- package/server/{feedback-writer-DfuVjvH0.js → feedback-writer-CH2846DP.js} +1 -1
- package/server/{flywheel-C7yek87O.js → flywheel-CjW2L7BS.js} +79 -29
- package/server/{flywheel-DXI_WITn.js → flywheel-HJt7QdWP.js} +1 -1
- package/server/{flywheel-merge-order-C5m5bYBc.js → flywheel-merge-order-4fNRN2F2.js} +1 -1
- package/server/{flywheel-merge-order-CXfU4M6l.js → flywheel-merge-order-D_yyAlND.js} +7 -7
- package/server/{flywheel-BwYPDlhK.js → flywheel-v1cCOBx-.js} +14 -14
- package/server/{forge-DYX9sKzG.js → forge-RVTCK_5X.js} +2 -2
- package/server/forge-bvak6vXJ.js +2 -0
- package/server/{from-DAdMxC29.js → from-BnLgKYvw.js} +1 -1
- package/server/{fs-lock-cw25uO_E.js → fs-lock-C7J-ugIf.js} +2 -2
- package/server/{fts-operations-D_rzLxX5.js → fts-operations-CU0B5WUx.js} +3 -3
- package/server/git-info-BSrI9owC.js +148 -0
- package/server/{git-utils-Y0zG25ez.js → git-utils-CsKV0Dis.js} +1 -1
- package/server/{git-utils-DV4B9TRl.js → git-utils-DW8-jIUJ.js} +4 -4
- package/server/{github-app-4UX8VIr8.js → github-app-7ywLhuZO.js} +2 -2
- package/server/{github-app-C33lDk9Z.js → github-app-Oi5hdn1n.js} +1 -1
- package/server/{github-client-nPj5ckZO.js → github-client-Cy0fSj1a.js} +1 -1
- package/server/{github-client-DkJVR908.js → github-client-DAbuXLuk.js} +3 -3
- package/server/{github-pr-lookup-C9Vokb0W.js → github-pr-lookup-Dhh3ec1V.js} +2 -2
- package/server/{harness-binary-BgXYDo2Z.js → harness-binary-tMmgJfC1.js} +2 -2
- package/server/{harness-resolve-1NZcVx7n.js → harness-resolve-DusNpVEe.js} +4 -4
- package/server/{health-events-jMfxrElt.js → health-events-BYDZ9n2i.js} +1 -1
- package/server/{health-events-DlX_FVAB.js → health-events-DNw9Mzw9.js} +2 -2
- package/server/{hooks-W3REcb3h.js → hooks-B4wj32l2.js} +1 -1
- package/server/{hooks-NQ19vvlB.js → hooks-BjBjxqNh.js} +2 -2
- package/server/{hume-BFkid2PO.js → hume-BP9YbxaE.js} +2 -2
- package/server/hume-TYTb6fDU.js +3 -0
- package/server/{identity-Bwh6VGeL.js → identity-C23uY8dZ.js} +3 -3
- package/server/{idle-stack-reaper-BeU_KxWx.js → idle-stack-reaper-BSxb1bln.js} +4 -4
- package/server/{idle-stack-reaper-CHtCNpvd.js → idle-stack-reaper-Bw0rU9GC.js} +1 -1
- package/server/{in-flight-guard-pcwXKLGz.js → in-flight-guard-DuxabAHT.js} +1 -1
- package/server/{infra-KTp9KV9u.js → infra-CHIvOb9q.js} +30 -7
- package/server/{injection-67YyU6SC.js → injection-BYUt8ml1.js} +8 -8
- package/server/{injection-BxbZKPDh.js → injection-BviePcm3.js} +1 -1
- package/server/inspect-agent-JFEaYTRa.js +2 -0
- package/server/{inspect-agent-VHSihlb7.js → inspect-agent-sV_19NxZ.js} +12 -12
- package/server/{internal-token-B-z-sGBH.js → internal-token-BOtIRJU7.js} +1 -1
- package/server/{internal-token-zY75jrRJ.js → internal-token-DoVzb4b7.js} +2 -2
- package/server/{io-DfvO2xyh.js → io-DKrWd3gX.js} +5 -5
- package/server/{issue-closed-dvEWKO7Q.js → issue-closed-6RQsAjDX.js} +7 -7
- package/server/{issue-lifecycle-3N8XF7lP.js → issue-lifecycle-D9nLErvS.js} +206 -29
- package/server/{issue-lifecycle-BI6jAfp8.js → issue-lifecycle-DOPVv7xz.js} +1 -1
- package/server/{issue-service-singleton-BN_2MXp4.js → issue-service-singleton-B2xy-IS9.js} +124 -11
- package/server/{issue-service-singleton-CL6hESX2.js → issue-service-singleton-CvgNAWqK.js} +1 -1
- package/server/issue-title-fallback-DTSCQVu0.js +120 -0
- package/server/{issues-CkvUoAnq.js → issues-e_Ck1Ln2.js} +2 -2
- package/server/{jsonl-parser-CrEb2PWr.js → jsonl-parser-DqxVCZ1k.js} +3 -3
- package/server/jsonl-resolver-07OS3qOr.js +324 -0
- package/server/{kimi-code-C26gmGxM.js → kimi-code-BjtAHIz1.js} +14 -12
- package/server/{kimi-code-DoMoGqIu.js → kimi-code-vtXl2DR5.js} +1 -1
- package/server/{kimi-parser-Dmhy3UlR.js → kimi-parser-B1lgy2Vt.js} +2 -2
- package/server/{label-cleanup-X2lWfghH.js → label-cleanup-D2zUMasf.js} +3 -3
- package/server/{lifecycle-Bg44O-9x.js → lifecycle-0NOEzomy.js} +2 -2
- package/server/{lifecycle-B0rL38D3.js → lifecycle-DaCovZwn.js} +6 -6
- package/server/{lifecycle-io-CCBpRv5m.js → lifecycle-io-6WL46dsB.js} +5 -5
- package/server/{lifecycle-io-DQDU0apV.js → lifecycle-io-BBMTaP7S.js} +1 -1
- package/server/{linear-client-B0cIkTs4.js → linear-client-7fQThJTc.js} +3 -3
- package/server/{linear-client-6V2E-DSa.js → linear-client-BTGApNLo.js} +1 -1
- package/server/{linear-mcp-auth-LCo9AWUd.js → linear-mcp-auth-B8pYRsiU.js} +1 -1
- package/server/{linear-mcp-auth-Dsu9Io9r.js → linear-mcp-auth-Nk5s3L9M.js} +5 -5
- package/server/memory-fts-worker.js +1 -1
- package/server/{memory-governor-A4O6vI9d.js → memory-governor-Cqvbusr4.js} +14 -14
- package/server/{memory-pressure-patrol-BWlWywmA.js → memory-pressure-patrol-DPb8foam.js} +5 -5
- package/server/{merge-BGWcBxku.js → merge-BB_bjJ9a.js} +1 -1
- package/server/{merge-vz80RvSE.js → merge-FZ78_cEz.js} +3 -3
- package/server/{merge-agent-GWhmnxFk.js → merge-agent-B3jRrlS1.js} +37 -33
- package/server/{merge-agent-BRSz26Oh.js → merge-agent-BuoC_PRZ.js} +2 -2
- package/server/{merge-batch-CFMEtTxv.js → merge-batch-B8bVjFWS.js} +1 -1
- package/server/{merge-completeness-CP347umA.js → merge-completeness-DQt7Qa7i.js} +4 -4
- package/server/{merge-completeness-7ajHAIR-.js → merge-completeness-DkdabVch.js} +1 -1
- package/server/merge-ops-DabXHp2i.js +2 -0
- package/server/merge-rebase-CXq0qsgR.js +2 -0
- package/server/{merge-rebase-C5htyEEH.js → merge-rebase-qq40s91P.js} +2 -2
- package/server/{merge-set-DsGW8fmc.js → merge-set-BTNYvxM3.js} +1 -1
- package/server/{merge-set-eiE2nC6C.js → merge-set-BmRRflt0.js} +4 -4
- package/server/{merge-sync-CM2-myXu.js → merge-sync-0m2Q087q.js} +1 -1
- package/server/{merge-sync-Ct0-cxMX.js → merge-sync-CJpOa0cZ.js} +2 -2
- package/server/{merge-train-deps-LXHGK61n.js → merge-train-deps-CH5Mr3vN.js} +4 -4
- package/server/{merge-train-BOu3fN7O.js → merge-train-iwKqjtCF.js} +4 -4
- package/server/{merge-verification-BRp08IzI.js → merge-verification-JJc5GC2t.js} +6 -6
- package/server/{merged-docker-cleanup-worker-CwldDjHV.js → merged-docker-cleanup-worker-BOqWA373.js} +4 -4
- package/server/{merged-docker-cleanup-worker-C8eGn78a.js → merged-docker-cleanup-worker-CrhTdxZV.js} +1 -1
- package/server/messaging-nuwStbdQ.js +3 -0
- package/server/{multipart-parser-OAuW7824.js → multipart-parser-DxuW_rZV.js} +2 -2
- package/server/{no-resume-mode-MWI6pnrK.js → no-resume-mode-xuYLFhLw.js} +1 -1
- package/server/node_modules/.package-lock.json +11 -11
- 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/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 +27 -3
- 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/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 +4 -4
- 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/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/ansi-regex/index.js +3 -2
- package/server/node_modules/ansi-regex/package.json +1 -1
- 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/{orphan-proposed-reconciler-cV3URUqk.js → orphan-proposed-reconciler-Dmk0kO_p.js} +24 -23
- package/server/{orphan-proposed-reconciler-BAE5AZ_e.js → orphan-proposed-reconciler-gf4TxfZb.js} +2 -2
- package/server/package-lock.json +12 -12
- package/server/package.json +1 -1
- package/server/{pan-dir-DDd91kMb.js → pan-dir-BMda7tQj.js} +5 -5
- package/server/{deacon-merge-BOGFEV8_.js → parked-residue-BiHb8cD7.js} +150 -35
- package/server/{paths-CRLnDgcI.js → paths-DEe9j-kw.js} +2 -2
- package/server/{pending-lifecycle-claim-CYgMiDAP.js → pending-lifecycle-claim-J5uIIJPu.js} +2 -2
- package/server/{pickup-BjJsSX12.js → pickup-D1UbSDPd.js} +1 -1
- package/server/{pipeline-agent-reader-BLc43dVJ.js → pipeline-agent-reader-D-6okryb.js} +5 -5
- package/server/{pipeline-membership-5qlRz5Qg.js → pipeline-membership-CCbgBzNC.js} +1 -1
- package/server/{pipeline-membership-BHZp_ShY.js → pipeline-membership-PGX3Pe8V.js} +1 -1
- package/server/{pipeline-membership-gather-CGFY1v-y.js → pipeline-membership-gather-BK4dzh0X.js} +17 -12
- package/server/{pipeline-membership-gather-WhRc1yke.js → pipeline-membership-gather-BRhU7XPx.js} +1 -1
- package/server/{pipeline-notifier-BmsLWM_2.js → pipeline-notifier-BNAV9kpa.js} +2 -2
- package/server/{pipeline-notifier-C4fZ2ito.js → pipeline-notifier-DvHLaXKb.js} +1 -1
- package/server/{post-merge-lifecycle-worker-KK1RTKRE.js → post-merge-lifecycle-worker-DAWgzXQA.js} +3 -3
- package/server/{post-merge-state-_Lj3LDLh.js → post-merge-state-DC2_0t12.js} +4 -4
- package/server/prd-locations-BbAvqQmT.js +124 -0
- package/server/{project-pipelines-CCkebHOu.js → project-pipelines-By_5WcT4.js} +2 -2
- package/server/{project-repos-B4MK48j4.js → project-repos--QeCg7yQ.js} +29 -3
- package/server/project-repos-3bI6t4fO.js +3 -0
- package/server/project-resource-refresh-queue-BaZC79S3.js +2 -0
- package/server/project-resource-refresh-queue-x-K9mvpP.js +865 -0
- package/server/{projects-DvPEAP18.js → projects-LftaVK99.js} +1 -1
- package/server/{prompts-BiS5I2tZ.js → prompts-BotGu-6W.js} +2 -2
- package/server/{providers-DrfK0Ip8.js → providers-BL1I66sM.js} +7 -7
- package/server/providers-Dqgz3MY5.js +3 -0
- package/server/public/assets/{chunk-BO2N2NFS-GtVe_o56.js → chunk-BO2N2NFS-D5Fz5jND.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-BvhcYYHc.js → diagram-OG6HWLK6-Eux0gWFq.js} +1 -1
- package/server/public/assets/{dist-D0ryefak.js → dist-C3zShwhA.js} +1 -1
- package/server/public/assets/{dist-CSmUXazd.js → dist-D-JX_u7m.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-BXA51DzM.js → ganttDiagram-6RSMTGT7-UH3aweia.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-mlV4EpWt.js → highlighted-body-OFNGDK62-ccIQ-WXS.js} +1 -1
- package/server/public/assets/index-2wV4ipy_.css +1 -0
- package/server/public/assets/index-BTVcdPve.js +860 -0
- package/server/public/assets/{linear-BPE7oswm.js → linear-Cnnu4YQy.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-Bjto8iJh.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BguGGV3S.js → pieDiagram-4H26LBE5-BD8-Tye6.js} +1 -1
- package/server/public/assets/{prod-aKDYUrXQ.js → prod-Ca6aKMts.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bx3i4B6H.js → quadrantDiagram-W4KKPZXB-BmSrVyFD.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-B5vuLjA4.js → sankeyDiagram-5OEKKPKP-CEGy8Das.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-HPlpkqsN.js → xychartDiagram-2RQKCTM6-VnQ8iY8s.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-BcHIsFJv.js → pull-requests-Cp_FDT8-.js} +3 -3
- package/server/pull-requests-jVGcVq5G.js +2 -0
- package/server/rally-CxhVgIQ6.js +3 -0
- package/server/{rally-api-ShZ4kvn0.js → rally-api-CqAIJ8RX.js} +2 -2
- package/server/{rally-api-u_vkr5c_.js → rally-api-Ij1Zt0NI.js} +1 -1
- package/server/{rally-B1OMtzch.js → rally-bQpBzUNf.js} +3 -3
- package/server/{rally-client-DgZvUZqX.js → rally-client-CN5vh4Ac.js} +1 -1
- package/server/{rally-client-D6Feq1Ka.js → rally-client-qKbCNRVW.js} +5 -5
- 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-DKxOnkpE.js → rebuild-stack-BNOMVh7C.js} +7 -7
- package/server/{rebuild-stack-CCwKHZb6.js → rebuild-stack-DrMyA_mA.js} +2 -2
- package/server/{reconstruct-cache-BP8UIKt7.js → reconstruct-cache-mxIYCnqs.js} +7 -7
- package/server/{record-By-wp6pg.js → record-Ug18Cp4V.js} +1 -1
- package/server/{record-update-ByGtIlUK.js → record-update-WyhsREoH.js} +1 -1
- package/server/{record-update-D23jPU6b.js → record-update-dBGxL9OC.js} +8 -6
- package/server/{recovery-trip-C4dTl8DO.js → recovery-trip-BKLrL6NX.js} +43 -10
- package/server/{recovery-trip-qloOYOFz.js → recovery-trip-wFAixKsg.js} +1 -1
- package/server/{release-engine-Crc0Tjx-.js → release-engine-D9gaCBn9.js} +5 -5
- package/server/{release-set-DDXwbIK7.js → release-set-DPHHzEGx.js} +3 -3
- package/server/{remote-CBpLi4Yy.js → remote-BU6ONLpv.js} +3 -3
- package/server/{remote-oEMfXlwT.js → remote-BUEeUic6.js} +3 -3
- package/server/{remote-agents-DQVGZVQ9.js → remote-agents-BVtASiOF.js} +1 -1
- package/server/{remote-agents-Bgtc2nOO.js → remote-agents-CSaTLi3u.js} +6 -6
- package/server/{remote-completion-DxUJ5HKR.js → remote-completion-CBV3b9TI.js} +13 -13
- package/server/{resolver-C8rooxoz.js → resolver-DvSMXty7.js} +31 -8
- package/server/{resolver-CuAULbLs.js → resolver-gxv97jsQ.js} +2 -2
- package/server/resume-DvHuF-bm.js +3 -0
- package/server/review-agent-DgkUPRx0.js +3 -0
- package/server/{review-agent-7C2w5CzU.js → review-agent-esZ0QXdY.js} +43 -55
- package/server/{review-artifacts-BJeEfm2r.js → review-artifacts-DGGEobLp.js} +6 -6
- package/server/{review-convoy-liveness-DfF9eXjI.js → review-convoy-liveness-DmO8dIBH.js} +20 -11
- package/server/{review-run-recovery-7BKt2Es0.js → review-run-recovery-Ct0q7FkE.js} +3 -3
- package/server/{review-run-recovery-ZjuDTNhZ.js → review-run-recovery-DHiiw7d8.js} +1 -1
- package/server/{review-status-CUnjjOUu.js → review-status-C_kQeeX0.js} +1 -1
- package/server/{review-status-emit-Cg4tOb8U.js → review-status-emit-BZz1Y_22.js} +3 -3
- package/server/{review-status-enrichment-D-rQshu6.js → review-status-enrichment-BWH0XW_m.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-2C9lk85r.js} +2 -2
- package/server/{review-status-sync-YthpOH_q.js → review-status-sync-Bq00Loey.js} +1 -1
- package/server/{review-status-DBnR5t4z.js → review-status-yOGD2MuK.js} +86 -27
- package/server/{review-verdict-feedback-DqXTuJk8.js → review-verdict-feedback-Brjaxoda.js} +1 -1
- package/server/{review-verdict-feedback-C-dBon_-.js → review-verdict-feedback-CE_tr2iQ.js} +8 -8
- package/server/{review-verdict-writer-jldSh3Bm.js → review-verdict-writer-CD-4kDVx.js} +1 -1
- package/server/{review-verdict-writer-CKaJWp75.js → review-verdict-writer-Ca2V7QSY.js} +7 -7
- package/server/{rollup-DZwH4CLs.js → rollup--g9ik1XQ.js} +1 -1
- package/server/{rollup-QCwYcBdP.js → rollup-B6g9Nr6L.js} +8 -8
- package/server/{scanner-2aHeLC3W.js → scanner-YxIv-fG1.js} +8 -8
- package/server/{search-DwHYaj66.js → search-DqMN4__-.js} +2 -2
- package/server/{secret-redaction-B5G1xZ3k.js → secret-redaction-DLZ-VqHq.js} +1 -1
- package/server/{sequence-io-POKWdusG.js → sequence-io--b3_PsWq.js} +4 -4
- package/server/{sequencer-agent-DS00KHVm.js → sequencer-agent-CqouKVZG.js} +6 -6
- package/server/server.js +1115 -1269
- package/server/{service-BLb_CyPL.js → service-CEp-3iow.js} +64 -63
- package/server/{session-fork-DcTzVwex.js → session-fork-GtoeCh2H.js} +2 -2
- package/server/{settings-Clw8UVNs.js → settings-CLQcdkoD.js} +2 -2
- package/server/{settings-B9-H2K_E.js → settings-Ch2pCVtt.js} +3 -3
- package/server/settings-DhtPDmmI.js +2 -0
- package/server/{shadow-engineering-C6oO_PiR.js → shadow-engineering-BxiFrIKv.js} +3 -3
- package/server/{shadow-state-CEGrrECe.js → shadow-state-CSA1vtxr.js} +2 -2
- package/server/{shadow-state-e7250VUx.js → shadow-state-nGhCNXT2.js} +1 -1
- package/server/{shadow-utils-xFk2Wusb.js → shadow-utils-7q5QDmMj.js} +2 -2
- package/server/{ship-log-7BnQHuKU.js → ship-log-ie0A_SqV.js} +1 -1
- package/server/{ship-record-CwUX6Afo.js → ship-record-BM3oVvnL.js} +7 -7
- package/server/{ship-record-BgUPnpT0.js → ship-record-DHWH1hLz.js} +1 -1
- package/server/{ship-status-Ce3_3edi.js → ship-status-BEkddXMT.js} +2 -2
- package/server/{smart-compaction-BmfIi3oL.js → smart-compaction-BkzjVpWL.js} +1 -1
- package/server/{smart-compaction-Dy0gw1VH.js → smart-compaction-D0TE1lBD.js} +7 -7
- package/server/{spawn-planning-session-nH3b4Drz.js → spawn-planning-session-CkGweSCC.js} +19 -19
- package/server/{spawn-planning-session-CfhxRJoY.js → spawn-planning-session-s406rw1N.js} +2 -2
- package/server/{specialist-completion-CC1XJbTx.js → specialist-completion-CTAjwH5j.js} +1 -1
- package/server/{specialist-context-cHwpcXSh.js → specialist-context-CKasRfYu.js} +5 -5
- package/server/{specialist-handoff-logger-GqnGSYoJ.js → specialist-handoff-logger-DrjrOmmn.js} +2 -2
- package/server/{specialist-logs-5OTnrV91.js → specialist-logs-Du6quZ0_.js} +3 -3
- package/server/{specialists-xXcJHAyg.js → specialists-B-4zyE4Y.js} +1 -1
- package/server/{specialists-8LcQi9Np.js → specialists-CuDWiNdB.js} +21 -272
- package/server/{specialists-DocAK-7A.js → specialists-b0dMMjWq.js} +148 -685
- package/server/specialists-registry-1y6Rt_F1.js +3 -0
- package/server/specialists-registry-BYjs04iK.js +277 -0
- package/server/specialists-x-kPMhrL.js +4 -0
- package/server/specs-IYsFlM-L.js +3 -0
- package/server/{src-DudQNYVw.js → src-CY2Wl8IX.js} +337 -6
- package/server/{src-C2TAxwki.js → src-CZsPs61V.js} +6 -6
- package/server/{src-DUVvEA8Q.js → src-DeQwpuh6.js} +3 -3
- package/server/{stack-health-DKT4ySnA.js → stack-health-BQFSJc0l.js} +3 -3
- package/server/{stack-health-CbyiYS9H.js → stack-health-ypIKtkbE.js} +1 -1
- package/server/{stale-task-claims-PzFee70R.js → stale-task-claims-C2e1zdMT.js} +5 -5
- package/server/{staleness-BjOAq9-d.js → staleness-CRDK6LFG.js} +1 -1
- package/server/{staleness-D8UTEXV5.js → staleness-Fzx_3_Hr.js} +1 -1
- package/server/{stall-sweeper-DOyIfeLR.js → stall-sweeper-QNk4h9m6.js} +8 -8
- package/server/{state-home-DhAZlk5k.js → state-home-DdG8erBI.js} +2 -2
- package/server/{state-mapping-BVSs84bO.js → state-mapping-D2yC81Vy.js} +1 -1
- package/server/{state-migrate-CJKEwpB0.js → state-migrate-C6H3jfHE.js} +6 -6
- package/server/{state-mirror-Do7pag7W.js → state-mirror-DF4Lfxm0.js} +3 -3
- package/server/stuck-remediation-BDa_tXgB.js +774 -0
- package/server/stuck-remediation-BVNd9txd.js +2 -0
- package/server/{substrate-bug-weights-service-BTNjHBnl.js → substrate-bug-weights-service-BbbCZEtJ.js} +3 -3
- package/server/{summary-fork-CZ88rhVx.js → summary-fork-BvcW6bq0.js} +113 -30
- package/server/{summary-fork-CvB7Oyq9.js → summary-fork-DIQmtOuV.js} +2 -2
- 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-D4v0WfiQ.js → supervisor-D3jC2c7A.js} +4 -4
- package/server/supervisor-v0cYN2Vp.js +2 -0
- package/server/{swarm-readiness-D8R-LWX5.js → swarm-readiness-CMWAQuWM.js} +3 -3
- package/server/{synthesis-verdict-B6wvLGcA.js → synthesis-verdict-C-pJOPsn.js} +1 -1
- package/server/{synthesis-verdict-N5Z11pg7.js → synthesis-verdict-DVlrLF9A.js} +2 -2
- package/server/{system-prerequisites-BbGZ_WHF.js → system-prerequisites-QKtIYXI2.js} +2 -2
- package/server/{teardown-workspace-CYend-KY.js → teardown-workspace-cJea1OLo.js} +16 -16
- package/server/{test-agent-queue-BUtWhNcc.js → test-agent-queue-C5DI_gWX.js} +6 -6
- package/server/{test-verdict-BWm3hgDj.js → test-verdict-C7kmd2_Y.js} +1 -1
- package/server/{test-verdict-BWtRmdiR.js → test-verdict-DUbDHqeD.js} +2 -2
- package/server/{tldr-daemon-CneJ24eL.js → tldr-daemon-BNQHwblU.js} +1 -1
- package/server/{tldr-daemon-CMVBT4kT.js → tldr-daemon-CO08YlfQ.js} +2 -2
- package/server/tmux-B8zsqD_6.js +4 -0
- package/server/{tmux-BqXzRuaH.js → tmux-DWEc4Ld9.js} +91 -19
- package/server/{token-CO3INKbh.js → token-Bez-qCB2.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-CJzPhSHv.js} +2 -2
- package/server/{tracker-utils-xnVJVrrO.js → tracker-utils-DJAOAuMN.js} +2 -2
- package/server/{traefik-connect-A5k54mCv.js → traefik-connect-D3H5I6b9.js} +1 -1
- package/server/{tunnel-DauSR-rs.js → tunnel-BSdKnW0U.js} +1 -1
- package/server/{tunnel-CwOnS-PB.js → tunnel-Cr3ctqxp.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-fzBp9cYi.js} +1 -1
- package/server/{types-DbxY2QB6.js → types-pLpbsNto.js} +1 -1
- package/server/{uat-failure-feedback-BVqsWlrr.js → uat-failure-feedback-IZQ-J8jt.js} +5 -5
- package/server/{uat-promote-verification-DmG097QS.js → uat-promote-verification-DXApKcc2.js} +5 -5
- package/server/{uat-train-COSy-vEX.js → uat-train-CycEzpbE.js} +1 -1
- package/server/{uat-train-DVUNW03P.js → uat-train-IIZlz7r3.js} +0 -0
- package/server/{validate-Dvv83iBx.js → validate-Ur4xH5bN.js} +3 -3
- package/server/{validation-BdCjzWLN.js → validation-CHovCoTT.js} +1 -1
- package/server/{validation-DlHafKzu.js → validation-Dr6V4PXx.js} +9 -6
- package/server/{verification-artifact-CaSbxUVg.js → verification-artifact-D3viYe_t.js} +1 -1
- package/server/{verification-artifact-0Zku8N-W.js → verification-artifact-k5Ftpg0c.js} +1 -1
- package/server/{verification-runner-C6wdZda2.js → verification-runner-BuqGwm2t.js} +1 -1
- package/server/{verification-runner-DwP2fUEF.js → verification-runner-Dl13mmsI.js} +53 -27
- package/server/{vtt-parser-luerJpYT.js → vtt-parser-BSnAB-Og.js} +1 -1
- package/server/work-agent-prompt-CJJ4tXci.js +3 -0
- package/server/{work-agent-prompt--9AWNYwZ.js → work-agent-prompt-CioeOuM4.js} +14 -14
- package/server/{work-agent-start-BNQO65W7.js → work-agent-start-B65Gqn9N.js} +2 -2
- package/server/{work-agent-start-DkzseQFl.js → work-agent-start-Ct1HVh6z.js} +1 -1
- package/server/{workflows-BYwR2aIN.js → workflows-AgFul1xc.js} +114 -41
- package/server/workflows-CfHm8lVd.js +2 -0
- package/server/{workspace-B-QJa3Ps.js → workspace-Cu3XlMXt.js} +1 -1
- package/server/{workspace-iTnTycOB.js → workspace-Cy4sDd3q.js} +3 -3
- package/server/{workspace-anchor-drift-DTt6h2Em.js → workspace-anchor-drift-BI0Hz6zI.js} +1 -1
- package/server/{workspace-anchor-drift-CHiGg8iu.js → workspace-anchor-drift-CMaqvizr.js} +4 -4
- package/server/{workspace-config-D0CavVtz.js → workspace-config-DRYDO7Zr.js} +1 -1
- package/server/{workspace-manager-W1OnbvU5.js → workspace-manager-CgovxDrO.js} +17 -17
- package/server/{workspace-manager-5BKPV6SY.js → workspace-manager-jfkKAEuO.js} +1 -1
- package/server/{workspace-metadata-tbbevEmP.js → workspace-metadata-BDqXzGGK.js} +1 -1
- package/server/{workspace-metadata-dJhXvZGQ.js → workspace-metadata-BNzODIv6.js} +2 -2
- package/server/{workspaces-BlpbOPZ7.js → workspaces-BJdPqx_J.js} +131 -127
- 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/handoff-isolate-cwd.md +4 -4
- package/sync-sources/rules/pan-handoff-focus-limit.md +12 -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 +182 -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-gauntlet-loop/references/lessons.md +60 -0
- package/sync-sources/skills/pan-handoff/SKILL.md +13 -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,52 +1,54 @@
|
|
|
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 { $r as
|
|
16
|
-
import { t as init_behavior } from "./behavior-
|
|
17
|
-
import { i as performHandoff, o as getAgentHealth, r as checkAllTriggers, t as getCloisterService } from "./service-
|
|
18
|
-
import { a as init_feature_registry_population, o as recordFeatureRegistryLifecycle } from "./post-merge-state-
|
|
19
|
-
import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-
|
|
20
|
-
import {
|
|
21
|
-
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-
|
|
22
|
-
import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-
|
|
23
|
-
import {
|
|
24
|
-
import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-
|
|
25
|
-
import { c as init_stack_health, o as getWorkspaceStackHealth } from "./stack-health-
|
|
26
|
-
import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-
|
|
27
|
-
import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-
|
|
28
|
-
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-
|
|
29
|
-
import {
|
|
30
|
-
import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-
|
|
31
|
-
import { a as loadCloisterConfigSync, r as init_config$1 } from "./config-
|
|
32
|
-
import { a as init_state_home, c as isStateMigrated } from "./state-home-
|
|
33
|
-
import {
|
|
34
|
-
import { a as
|
|
35
|
-
import {
|
|
36
|
-
import { i as
|
|
37
|
-
import { d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, w as setReviewStatusSync } from "./review-status-
|
|
38
|
-
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-
|
|
39
|
-
import {
|
|
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, E as init_tier_table, Ft as isOverdeckWorkspaceRuntimePath, Gt as shouldCommitLegacyWorkspaceArtifacts, Hi as resolveOhmypiExtensionPath, Ht as init_state_read_home, Kn as extractPrefixSync, Li as getOverdeckHome, Mt as init_state_plane, Nt as isGeneratedGitHookPath, O as resolveTieredExecutionEnabled, Oi as claudeSessionTranscriptExists, On as resolveProjectFromIssueSync, Or as resolveModel, Ri as init_paths, Rt as parsePorcelainStatusPaths, Vi as packageRoot, 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 encodeClaudeProjectDir, 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 } from "./config-yaml-D9nfpEx1.js";
|
|
3
|
+
import { c as getDashboardLoopbackApiUrlSync, p as init_config } from "./config-ZGjvuR6J.js";
|
|
4
|
+
import { l as init_activity_logger, o as emitActivityEntrySync, r as emitActivityEntryDurable } from "./activity-logger-BWZhVphb.js";
|
|
5
|
+
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CHIvOb9q.js";
|
|
6
|
+
import { $ as init_pane_choice_menu, C as init_tmux, E as killSession, G as setOption, H as sendRawKeystroke, 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-DWEc4Ld9.js";
|
|
7
|
+
import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-gxv97jsQ.js";
|
|
8
|
+
import { a as init_event_store, n as getEventStore } from "./event-store-BCSgMubf.js";
|
|
9
|
+
import { N as normalizeChannelReplyPayload, T as DomainEvent, n as COMPOSER_COMMAND_MANIFEST, s as getHarnessBehavior, t as init_src } from "./src-CY2Wl8IX.js";
|
|
10
|
+
import { f as init_agent_state_sync, h as stateToOverdeckParamsForDb, u as AGENT_COLUMNS_FOR_DB } from "./pipeline-agent-reader-D-6okryb.js";
|
|
11
|
+
import { c as ReadModelService, d as getClosedIssueIdsForReadSource, i as EventStoreService, t as IssueLifecycle } from "./issue-lifecycle-D9nLErvS.js";
|
|
12
|
+
import { c as init_agents, g as logAgentLifecycleSync, h as init_persistent_logger, m as isTerminalIssueStage, p as getIssueStageSync } from "./agents-jXgqpHca.js";
|
|
13
|
+
import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-e_OEYZEe.js";
|
|
14
|
+
import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-CiIwxH1D.js";
|
|
15
|
+
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-BJhGIJZe.js";
|
|
16
|
+
import { t as init_behavior } from "./behavior-BiCQzqyT.js";
|
|
17
|
+
import { i as performHandoff, o as getAgentHealth, r as checkAllTriggers, t as getCloisterService } from "./service-CEp-3iow.js";
|
|
18
|
+
import { a as init_feature_registry_population, o as recordFeatureRegistryLifecycle } from "./post-merge-state-DC2_0t12.js";
|
|
19
|
+
import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-DoVzb4b7.js";
|
|
20
|
+
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-C75EFFjf.js";
|
|
21
|
+
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-Dc4mtM-B.js";
|
|
22
|
+
import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-Bc5kjX1q.js";
|
|
23
|
+
import { A as piGlobalContextFile, D as init_layers, L as workspaceContextFile } from "./assemble-CyvEBmmq.js";
|
|
24
|
+
import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-tMmgJfC1.js";
|
|
25
|
+
import { c as init_stack_health, o as getWorkspaceStackHealth } from "./stack-health-BQFSJc0l.js";
|
|
26
|
+
import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-pLpbsNto.js";
|
|
27
|
+
import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-0NOEzomy.js";
|
|
28
|
+
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-DKrWd3gX.js";
|
|
29
|
+
import { a as getDispatchableItems, c as init_dag } from "./dag-BPc74hwj.js";
|
|
30
|
+
import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-DusNpVEe.js";
|
|
31
|
+
import { a as loadCloisterConfigSync, r as init_config$1 } from "./config-Doq_tF-f.js";
|
|
32
|
+
import { a as init_state_home, c as isStateMigrated } from "./state-home-DdG8erBI.js";
|
|
33
|
+
import { d as resolveWorkspaceRepoRootsSync, i as init_project_repos, s as resolvePrimaryWorkspaceRepoDirSync } from "./project-repos--QeCg7yQ.js";
|
|
34
|
+
import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-6WL46dsB.js";
|
|
35
|
+
import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-CJzPhSHv.js";
|
|
36
|
+
import { i as issue_service_singleton_exports, n as init_issue_service_singleton } from "./issue-service-singleton-B2xy-IS9.js";
|
|
37
|
+
import { d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, w as setReviewStatusSync } from "./review-status-yOGD2MuK.js";
|
|
38
|
+
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-tQCIbBVZ.js";
|
|
39
|
+
import { i as resolveAgentHarness, l as resolvePiSessionPath, n as readLauncherPinnedSessionId, o as resolveCodexRolloutPath, r as resolveAcpTranscriptPath, t as init_jsonl_resolver } from "./jsonl-resolver-07OS3qOr.js";
|
|
40
|
+
import { G as liveOrderIssueLookup, H as getBook, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-CjW2L7BS.js";
|
|
41
|
+
import { t as resolveAgentGitInfo } from "./git-info-BSrI9owC.js";
|
|
42
|
+
import { d as getResourceConfig, n as classifyMemoryPressure, p as getSystemHealthSnapshot } from "./memory-governor-Cqvbusr4.js";
|
|
43
|
+
import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-CgovxDrO.js";
|
|
44
|
+
import "./deacon-B24dNzr8.js";
|
|
45
|
+
import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-DqxVCZ1k.js";
|
|
46
|
+
import { i as getRuntimeForAgent } from "./agent-idle-ONBssBN_.js";
|
|
47
|
+
import { t as recordReviewVerdict } from "./review-verdict-writer-Ca2V7QSY.js";
|
|
48
|
+
import { r as REVIEW_SUB_ROLES } from "./review-convoy-liveness-DmO8dIBH.js";
|
|
49
|
+
import { t as createInFlightGuard } from "./in-flight-guard-DuxabAHT.js";
|
|
50
|
+
import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-BNzODIv6.js";
|
|
51
|
+
import { t as resolveReviewParentRunState } from "./review-run-recovery-Ct0q7FkE.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
54
|
import { homedir, networkInterfaces } from "node:os";
|
|
@@ -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-BVtASiOF.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-bFDaD5YN.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;
|
|
@@ -3636,9 +3179,7 @@ function getPtySupervisorSocketPath(agentId) {
|
|
|
3636
3179
|
* an operator hunting the memory governor instead (PAN-3172).
|
|
3637
3180
|
*/
|
|
3638
3181
|
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);
|
|
3182
|
+
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
3183
|
if (chosen.length === 0) return null;
|
|
3643
3184
|
return chosen.join(" | ").slice(0, 500);
|
|
3644
3185
|
}
|
|
@@ -3652,7 +3193,16 @@ async function waitForPtySupervisorSocket(agentId, timeoutMs = PTY_SUPERVISOR_SO
|
|
|
3652
3193
|
await new Promise((r) => setTimeout(r, 250));
|
|
3653
3194
|
}
|
|
3654
3195
|
const failure = extractSupervisorFailure(await capturePaneText(agentId, 40));
|
|
3655
|
-
|
|
3196
|
+
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";
|
|
3197
|
+
throw new Error(`Timed out waiting for PTY supervisor socket ${socketPath} — ${detail}`);
|
|
3198
|
+
}
|
|
3199
|
+
async function waitForPtySupervisorOrFallback(agentId, timeoutMs = PTY_SUPERVISOR_SOCKET_WAIT_MS, sessionAlive = tmuxSessionExists) {
|
|
3200
|
+
try {
|
|
3201
|
+
await waitForPtySupervisorSocket(agentId, timeoutMs);
|
|
3202
|
+
} catch (error) {
|
|
3203
|
+
if (!await sessionAlive(agentId)) throw error;
|
|
3204
|
+
console.warn(`[conversations] PTY supervisor socket unavailable for ${agentId}; continuing with fallback delivery: ${error instanceof Error ? error.message : String(error)}`);
|
|
3205
|
+
}
|
|
3656
3206
|
}
|
|
3657
3207
|
async function extractModelFromSessionFile(sessionFile) {
|
|
3658
3208
|
try {
|
|
@@ -3813,7 +3363,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3813
3363
|
const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
|
|
3814
3364
|
const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
|
|
3815
3365
|
const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
|
|
3816
|
-
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-
|
|
3366
|
+
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-DZhFfcWu.js");
|
|
3817
3367
|
initCodexHome(codexHome, {
|
|
3818
3368
|
trustedDir: cwd,
|
|
3819
3369
|
approvalPolicy: codexApprovalPolicy,
|
|
@@ -3833,7 +3383,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3833
3383
|
if (resume) {
|
|
3834
3384
|
const pinnedId = await readFile(join(getOverdeckHome(), "agents", tmuxSession, "kimi-session-id"), "utf-8").then((value) => value.trim() || void 0).catch(() => void 0);
|
|
3835
3385
|
if (pinnedId) {
|
|
3836
|
-
const { kimiSessionsRoot } = await import("./kimi-code-
|
|
3386
|
+
const { kimiSessionsRoot } = await import("./kimi-code-vtXl2DR5.js");
|
|
3837
3387
|
if (await stat(join(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd), pinnedId, "agents", "main", "wire.jsonl")).then(() => true, () => false)) kimiResumeSessionId = pinnedId;
|
|
3838
3388
|
}
|
|
3839
3389
|
}
|
|
@@ -3866,7 +3416,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3866
3416
|
const launchTmuxAndCaptureSession = async () => {
|
|
3867
3417
|
let kimiExistingSessionsBefore;
|
|
3868
3418
|
if (kimiCodeFields && !kimiCodeFields.resumeSessionId) try {
|
|
3869
|
-
const { kimiSessionsRoot } = await import("./kimi-code-
|
|
3419
|
+
const { kimiSessionsRoot } = await import("./kimi-code-vtXl2DR5.js");
|
|
3870
3420
|
kimiExistingSessionsBefore = new Set(await readdir(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd)));
|
|
3871
3421
|
} catch {
|
|
3872
3422
|
kimiExistingSessionsBefore = /* @__PURE__ */ new Set();
|
|
@@ -3905,7 +3455,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3905
3455
|
} catch {}
|
|
3906
3456
|
console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
|
|
3907
3457
|
try {
|
|
3908
|
-
const { preTrustDirectory } = await import("./workspace-manager-
|
|
3458
|
+
const { preTrustDirectory } = await import("./workspace-manager-jfkKAEuO.js");
|
|
3909
3459
|
preTrustDirectory(cwd);
|
|
3910
3460
|
} catch {}
|
|
3911
3461
|
try {
|
|
@@ -3917,12 +3467,12 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3917
3467
|
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
3468
|
throw err;
|
|
3919
3469
|
}
|
|
3920
|
-
if (useSupervisor) await
|
|
3470
|
+
if (useSupervisor) await waitForPtySupervisorOrFallback(tmuxSession);
|
|
3921
3471
|
if (behavior.usesCodexHome && codexFields?.codexHome && codexTransport === "tui") {
|
|
3922
3472
|
const codexHomeDir = codexFields.codexHome;
|
|
3923
3473
|
(async () => {
|
|
3924
3474
|
try {
|
|
3925
|
-
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-
|
|
3475
|
+
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-DZhFfcWu.js");
|
|
3926
3476
|
const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
|
|
3927
3477
|
if (rollout) {
|
|
3928
3478
|
const threadId = extractThreadIdFromRollout(rollout);
|
|
@@ -3932,14 +3482,14 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3932
3482
|
})();
|
|
3933
3483
|
}
|
|
3934
3484
|
if (kimiCodeFields && kimiExistingSessionsBefore) {
|
|
3935
|
-
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-
|
|
3485
|
+
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-vtXl2DR5.js");
|
|
3936
3486
|
const sessionId = await waitForNewKimiSessionAsync(join(homedir(), ".kimi-code"), cwd, kimiExistingSessionsBefore);
|
|
3937
3487
|
if (!sessionId) throw new Error(`kimi-code session capture timed out for ${tmuxSession} — no new session directory appeared under the workspace bucket`);
|
|
3938
3488
|
writeKimiSessionId(tmuxSession, sessionId);
|
|
3939
3489
|
}
|
|
3940
3490
|
};
|
|
3941
3491
|
if (kimiCodeFields) {
|
|
3942
|
-
const { withKimiSessionCaptureLock } = await import("./kimi-code-
|
|
3492
|
+
const { withKimiSessionCaptureLock } = await import("./kimi-code-vtXl2DR5.js");
|
|
3943
3493
|
await withKimiSessionCaptureLock(join(homedir(), ".kimi-code"), cwd, launchTmuxAndCaptureSession);
|
|
3944
3494
|
} else await launchTmuxAndCaptureSession();
|
|
3945
3495
|
if (channelsBridgeMcpConfig) dismissDevChannelsDialog(tmuxSession).catch((err) => {
|
|
@@ -4076,6 +3626,16 @@ async function handleConversationStop(name, deps) {
|
|
|
4076
3626
|
return jsonResponse({ error: "Internal server error" }, { status: 500 });
|
|
4077
3627
|
}
|
|
4078
3628
|
}
|
|
3629
|
+
async function handleConversationClearForkState(name, deps = {}) {
|
|
3630
|
+
const conv = getConversationByName(name);
|
|
3631
|
+
if (!conv) return jsonResponse({ error: "Conversation not found" }, { status: 404 });
|
|
3632
|
+
if (!await (deps.sessionExists ?? tmuxSessionExists)(conv.tmuxSession)) return jsonResponse({ error: "Cannot clear failure state while the tmux session is not alive" }, { status: 409 });
|
|
3633
|
+
(deps.clearFailureState ?? clearConversationFailureState)(name);
|
|
3634
|
+
return jsonResponse({
|
|
3635
|
+
...getConversationByName(name) ?? conv,
|
|
3636
|
+
sessionAlive: true
|
|
3637
|
+
});
|
|
3638
|
+
}
|
|
4079
3639
|
async function handleConversationResume(name, body, deps) {
|
|
4080
3640
|
try {
|
|
4081
3641
|
const conv = getConversationByName(name);
|
|
@@ -4091,8 +3651,7 @@ async function handleConversationResume(name, body, deps) {
|
|
|
4091
3651
|
reattached: true
|
|
4092
3652
|
});
|
|
4093
3653
|
}
|
|
4094
|
-
const oldSessionId = conv.claudeSessionId;
|
|
4095
|
-
const resumeCause = conv.status === "ended" ? "operator" : "system";
|
|
3654
|
+
const oldSessionId = conv.claudeSessionId, resumeCause = conv.status === "ended" ? "operator" : "system", sendResumeContract = body["sendResumeContract"] !== false;
|
|
4096
3655
|
const harness = conv.harness ?? "claude-code";
|
|
4097
3656
|
const modelChanged = !!model && model !== conv.model;
|
|
4098
3657
|
if (!await validateCwdContainment(conv.cwd)) return jsonResponse({ error: "Invalid cwd" }, { status: 400 });
|
|
@@ -4111,7 +3670,7 @@ async function handleConversationResume(name, body, deps) {
|
|
|
4111
3670
|
await spawnConversationSession(conv.tmuxSession, conv.cwd, oldSessionId ?? randomUUID$1(), model, effort, conv.issueId ?? void 0, canResume, harness);
|
|
4112
3671
|
await waitForTmuxSession(conv.tmuxSession);
|
|
4113
3672
|
await waitForConversationRuntimeReady(conv.tmuxSession, harness, "respawn");
|
|
4114
|
-
await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv));
|
|
3673
|
+
await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv), sendResumeContract);
|
|
4115
3674
|
markConversationActive(name);
|
|
4116
3675
|
return jsonResponse({
|
|
4117
3676
|
...conv,
|
|
@@ -4594,101 +4153,6 @@ function asRecord(value) {
|
|
|
4594
4153
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
4595
4154
|
}
|
|
4596
4155
|
//#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
4156
|
//#region ../../lib/channels/permission-payload.ts
|
|
4693
4157
|
const CHANNEL_PERMISSION_LIMITS = {
|
|
4694
4158
|
requestIdBytes: 128,
|
|
@@ -4983,7 +4447,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
|
|
|
4983
4447
|
error: "missing agent id"
|
|
4984
4448
|
}, { status: 400 });
|
|
4985
4449
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
4986
|
-
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-
|
|
4450
|
+
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-BOtIRJU7.js"));
|
|
4987
4451
|
const expected = getInternalTokenSync();
|
|
4988
4452
|
if (!expected) return jsonResponse({
|
|
4989
4453
|
ok: false,
|
|
@@ -5280,7 +4744,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
|
|
|
5280
4744
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
5281
4745
|
const urlOpt = HttpServerRequest.toURL(request);
|
|
5282
4746
|
const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
|
|
5283
|
-
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-
|
|
4747
|
+
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-BYDZ9n2i.js"));
|
|
5284
4748
|
const endTime = /* @__PURE__ */ new Date();
|
|
5285
4749
|
const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
|
|
5286
4750
|
const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
|
|
@@ -5295,7 +4759,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
|
|
|
5295
4759
|
return Effect.gen(function* () {
|
|
5296
4760
|
let eventBody = body;
|
|
5297
4761
|
if (body["kind"] === "linear_mcp_auth_required" || body["kind"] === "linear_mcp_auth_healthy") {
|
|
5298
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
4762
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CzHfoqKQ.js"));
|
|
5299
4763
|
const snapshot = yield* (yield* AgentStateService).get(id);
|
|
5300
4764
|
eventBody = {
|
|
5301
4765
|
...body,
|
|
@@ -5330,7 +4794,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
|
|
|
5330
4794
|
detail: String(decoded.failure)
|
|
5331
4795
|
}, { status: 400 })
|
|
5332
4796
|
};
|
|
5333
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
4797
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CzHfoqKQ.js"));
|
|
5334
4798
|
yield* (yield* AgentStateService).emit(decoded.success);
|
|
5335
4799
|
return {
|
|
5336
4800
|
ok: true,
|
|
@@ -5411,13 +4875,13 @@ const postAgentPlanChecklistRoute = HttpRouter.add("POST", "/api/agents/:id/plan
|
|
|
5411
4875
|
const auth = yield* Effect.promise(() => validateAgentRuntimeEventAuth(request));
|
|
5412
4876
|
if (!auth.ok) return auth.response;
|
|
5413
4877
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
5414
|
-
const { getAgentState } = yield* Effect.promise(() => import("./agents-
|
|
4878
|
+
const { getAgentState } = yield* Effect.promise(() => import("./agents-DpCuoF65.js"));
|
|
5415
4879
|
const state = yield* getAgentState(id);
|
|
5416
4880
|
if (!state?.workspace || !state.issueId) return jsonResponse({
|
|
5417
4881
|
success: false,
|
|
5418
4882
|
error: "agent has no resolvable workspace or issue id"
|
|
5419
4883
|
}, { status: 422 });
|
|
5420
|
-
const { checkIncompletePlanItemsPromise } = yield* Effect.promise(() => import("./done-preflight-
|
|
4884
|
+
const { checkIncompletePlanItemsPromise } = yield* Effect.promise(() => import("./done-preflight-BDVdWed5.js"));
|
|
5421
4885
|
const incomplete = yield* Effect.promise(() => checkIncompletePlanItemsPromise(state.workspace, state.issueId));
|
|
5422
4886
|
return jsonResponse({
|
|
5423
4887
|
success: true,
|
|
@@ -5431,7 +4895,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
|
|
|
5431
4895
|
success: false,
|
|
5432
4896
|
error: "missing agent id"
|
|
5433
4897
|
}, { status: 400 });
|
|
5434
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
4898
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CzHfoqKQ.js"));
|
|
5435
4899
|
const snapshot = yield* (yield* AgentStateService).get(id);
|
|
5436
4900
|
if (!snapshot) return jsonResponse({
|
|
5437
4901
|
success: false,
|
|
@@ -5459,7 +4923,6 @@ init_workspace_manager();
|
|
|
5459
4923
|
*/
|
|
5460
4924
|
init_event_store();
|
|
5461
4925
|
init_agents$1();
|
|
5462
|
-
init_persistent_logger();
|
|
5463
4926
|
function prepareAgentStateForSave(state) {
|
|
5464
4927
|
if (state.status === "running" || state.status === "starting") delete state.stoppedAt;
|
|
5465
4928
|
else if (state.status === "stopped" && !state.stoppedAt) state.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -5623,8 +5086,8 @@ function createAgentStopHandler(lifecycleEvent) {
|
|
|
5623
5086
|
yield* stopAgent(id, "operator");
|
|
5624
5087
|
if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
|
|
5625
5088
|
try {
|
|
5626
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
5627
|
-
const { findWorkspacePath } = await import("./archive-planning-
|
|
5089
|
+
const { resolveProjectFromIssueSync } = await import("./projects-LftaVK99.js");
|
|
5090
|
+
const { findWorkspacePath } = await import("./archive-planning-BW4MKNI7.js");
|
|
5628
5091
|
const issueLower = stateBeforeStop.issueId.toLowerCase();
|
|
5629
5092
|
const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
|
|
5630
5093
|
if (workspacePath) {
|
|
@@ -5764,7 +5227,7 @@ const postAgentUnpauseRoute = HttpRouter.add("POST", "/api/agents/:id/unpause",
|
|
|
5764
5227
|
if ((yield* getWorkAgentLifecycleState(id)).canResumeSession && updatedState.troubled !== true) {
|
|
5765
5228
|
resumeTriggered = true;
|
|
5766
5229
|
yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.unpause_immediate_resume_triggered"));
|
|
5767
|
-
import("./resume-
|
|
5230
|
+
import("./resume-DvHuF-bm.js").then(({ resumeAgent }) => resumeAgent(id)).then((result) => {
|
|
5768
5231
|
if (!result.success) console.warn(`[agents] immediate resume after unpause failed for ${id}: ${result.error}`);
|
|
5769
5232
|
}).catch((err) => console.warn(`[agents] immediate resume after unpause errored for ${id}:`, err));
|
|
5770
5233
|
}
|
|
@@ -7177,15 +6640,15 @@ async function requestWorkStartAfterContainers(input) {
|
|
|
7177
6640
|
function handleRemoteAgentSpawn(input) {
|
|
7178
6641
|
return Effect.gen(function* () {
|
|
7179
6642
|
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-
|
|
6643
|
+
const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-BVtASiOF.js"));
|
|
6644
|
+
const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-BUEeUic6.js"));
|
|
6645
|
+
const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-CH1AqqIQ.js"));
|
|
7183
6646
|
const panConfig = loadPanConfig();
|
|
7184
6647
|
const spendCap = checkRemoteSpendCap(panConfig);
|
|
7185
6648
|
if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
|
|
7186
6649
|
const fly = createFlyProviderFromConfig(panConfig.remote);
|
|
7187
6650
|
yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
|
|
7188
|
-
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt
|
|
6651
|
+
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-CJJ4tXci.js"));
|
|
7189
6652
|
const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
|
|
7190
6653
|
const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
|
|
7191
6654
|
issueId,
|
|
@@ -7919,7 +7382,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
7919
7382
|
console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
|
|
7920
7383
|
}
|
|
7921
7384
|
try {
|
|
7922
|
-
const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-
|
|
7385
|
+
const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-Ug18Cp4V.js");
|
|
7923
7386
|
await appendSessionEntry(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId, {
|
|
7924
7387
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
7925
7388
|
reason: "start",
|
|
@@ -8367,14 +7830,14 @@ function firePostMergeLifecycle(issueId, options) {
|
|
|
8367
7830
|
const normalizedIssueId = parsedIssueId.normalized.toUpperCase();
|
|
8368
7831
|
const started = postMergeGuard.run(normalizedIssueId, async () => {
|
|
8369
7832
|
const projectPath = getProjectPathForIssue(parsedIssueId.prefix);
|
|
8370
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
7833
|
+
const { postMergeLifecycle } = await import("./merge-agent-BuoC_PRZ.js");
|
|
8371
7834
|
const lifecycleOptions = {
|
|
8372
7835
|
...options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : {},
|
|
8373
7836
|
...options?.verifiedMergedRepos?.length ? { verifiedMergedRepos: options.verifiedMergedRepos } : {}
|
|
8374
7837
|
};
|
|
8375
7838
|
await postMergeLifecycle(normalizedIssueId, projectPath, options?.sourceBranch, Object.keys(lifecycleOptions).length > 0 ? lifecycleOptions : void 0);
|
|
8376
7839
|
console.log(`[merge] post-merge lifecycle completed for ${normalizedIssueId}`);
|
|
8377
|
-
const { runMergeTrainReconcile } = await import("./merge-train-
|
|
7840
|
+
const { runMergeTrainReconcile } = await import("./merge-train-iwKqjtCF.js");
|
|
8378
7841
|
const outcomes = await runMergeTrainReconcile(normalizedIssueId);
|
|
8379
7842
|
if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${normalizedIssueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
|
|
8380
7843
|
}, (err) => console.error(`[merge] post-merge lifecycle failed for ${normalizedIssueId}:`, err));
|
|
@@ -8394,15 +7857,15 @@ init_review_status();
|
|
|
8394
7857
|
init_io();
|
|
8395
7858
|
init_tmux();
|
|
8396
7859
|
const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
|
|
8397
|
-
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
7860
|
+
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
8398
7861
|
return jsonResponse({
|
|
8399
7862
|
specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
|
|
8400
7863
|
projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
|
|
8401
7864
|
});
|
|
8402
7865
|
})));
|
|
8403
7866
|
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-
|
|
7867
|
+
const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
7868
|
+
const { clearHookSync } = yield* Effect.promise(() => import("./hooks-B4wj32l2.js"));
|
|
8406
7869
|
const specialists = getAllSpecialists();
|
|
8407
7870
|
const results = [];
|
|
8408
7871
|
for (const specialist of specialists) {
|
|
@@ -8461,7 +7924,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8461
7924
|
}
|
|
8462
7925
|
console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
|
|
8463
7926
|
if (specialist === "merge") {
|
|
8464
|
-
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-
|
|
7927
|
+
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-CTAjwH5j.js"));
|
|
8465
7928
|
if (yield* reportSpecialistCompletion(normalizedIssueId, {
|
|
8466
7929
|
status,
|
|
8467
7930
|
notes
|
|
@@ -8488,7 +7951,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8488
7951
|
if (project) {
|
|
8489
7952
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8490
7953
|
if (existsSync(workspacePath)) {
|
|
8491
|
-
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
7954
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-CsKV0Dis.js");
|
|
8492
7955
|
reviewEvidenceHead = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
|
|
8493
7956
|
}
|
|
8494
7957
|
}
|
|
@@ -8537,7 +8000,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8537
8000
|
if (project && failedItemId) {
|
|
8538
8001
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8539
8002
|
if (existsSync(workspacePath)) {
|
|
8540
|
-
const { onInspectComplete } = await import("./inspect-agent-
|
|
8003
|
+
const { onInspectComplete } = await import("./inspect-agent-JFEaYTRa.js");
|
|
8541
8004
|
await Effect.runPromise(onInspectComplete(project.projectKey, normalizedIssueId, failedItemId, "failed", workspacePath, notes));
|
|
8542
8005
|
}
|
|
8543
8006
|
}
|
|
@@ -8548,7 +8011,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8548
8011
|
}
|
|
8549
8012
|
yield* Effect.promise(async () => {
|
|
8550
8013
|
try {
|
|
8551
|
-
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-
|
|
8014
|
+
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-x-kPMhrL.js");
|
|
8552
8015
|
const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
|
|
8553
8016
|
const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
|
|
8554
8017
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -8567,7 +8030,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8567
8030
|
});
|
|
8568
8031
|
console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
|
|
8569
8032
|
}
|
|
8570
|
-
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-
|
|
8033
|
+
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-DrjrOmmn.js");
|
|
8571
8034
|
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
8035
|
} catch (err) {
|
|
8573
8036
|
console.error(`[specialists/done] Error managing specialist state:`, err);
|
|
@@ -8579,7 +8042,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8579
8042
|
if (project) {
|
|
8580
8043
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8581
8044
|
if (existsSync(workspacePath)) {
|
|
8582
|
-
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
8045
|
+
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-CsKV0Dis.js");
|
|
8583
8046
|
const headAnchor = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
|
|
8584
8047
|
if (headAnchor) {
|
|
8585
8048
|
setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: headAnchor });
|
|
@@ -8593,7 +8056,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8593
8056
|
});
|
|
8594
8057
|
if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
|
|
8595
8058
|
try {
|
|
8596
|
-
const { onInspectComplete } = await import("./inspect-agent-
|
|
8059
|
+
const { onInspectComplete } = await import("./inspect-agent-JFEaYTRa.js");
|
|
8597
8060
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
8598
8061
|
if (project) {
|
|
8599
8062
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
@@ -8609,7 +8072,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8609
8072
|
if (project) {
|
|
8610
8073
|
if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
|
|
8611
8074
|
setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
|
|
8612
|
-
const { initEventStore } = await import("./event-store-
|
|
8075
|
+
const { initEventStore } = await import("./event-store-Db4w4YIY.js");
|
|
8613
8076
|
await (await initEventStore()).appendAsync({
|
|
8614
8077
|
type: "test.passed",
|
|
8615
8078
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -8662,8 +8125,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8662
8125
|
if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
|
|
8663
8126
|
try {
|
|
8664
8127
|
const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
|
|
8665
|
-
const { sessionExists } = await import("./tmux-
|
|
8666
|
-
const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-
|
|
8128
|
+
const { sessionExists } = await import("./tmux-B8zsqD_6.js");
|
|
8129
|
+
const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-DpCuoF65.js");
|
|
8667
8130
|
if (await Effect.runPromise(sessionExists(workAgentId))) {
|
|
8668
8131
|
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
8132
|
console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
|
|
@@ -8677,7 +8140,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8677
8140
|
try {
|
|
8678
8141
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
8679
8142
|
const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
|
|
8680
|
-
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-
|
|
8143
|
+
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-Brjaxoda.js");
|
|
8681
8144
|
const result = await Effect.runPromise(deliverReviewVerdictFeedback({
|
|
8682
8145
|
issueId: normalizedIssueId,
|
|
8683
8146
|
verdict: status === "failed" ? "failed" : "blocked",
|
|
@@ -8697,7 +8160,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8697
8160
|
if (project) {
|
|
8698
8161
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8699
8162
|
if (existsSync(workspacePath)) {
|
|
8700
|
-
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
8163
|
+
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-CsKV0Dis.js");
|
|
8701
8164
|
const reviewedAtCommit = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
|
|
8702
8165
|
if (reviewedAtCommit) {
|
|
8703
8166
|
setReviewStatusSync(normalizedIssueId, { reviewedAtCommit });
|
|
@@ -8737,7 +8200,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8737
8200
|
});
|
|
8738
8201
|
})));
|
|
8739
8202
|
const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/specialists/logs/cleanup-all", httpHandler(Effect.gen(function* () {
|
|
8740
|
-
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8203
|
+
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
|
|
8741
8204
|
const results = cleanupAllLogsSync();
|
|
8742
8205
|
return jsonResponse({
|
|
8743
8206
|
success: true,
|
|
@@ -8747,7 +8210,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
8747
8210
|
});
|
|
8748
8211
|
})));
|
|
8749
8212
|
const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
|
|
8750
|
-
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
8213
|
+
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
8751
8214
|
return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
|
|
8752
8215
|
})));
|
|
8753
8216
|
const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
|
|
@@ -8791,7 +8254,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
|
|
|
8791
8254
|
"blocked",
|
|
8792
8255
|
"failed"
|
|
8793
8256
|
].includes(status)) {
|
|
8794
|
-
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
8257
|
+
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
8795
8258
|
saveAgentRuntimeState(getTmuxSessionName(name), {
|
|
8796
8259
|
state: "idle",
|
|
8797
8260
|
lastActivity: (/* @__PURE__ */ new Date()).toISOString()
|
|
@@ -8913,7 +8376,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
|
|
|
8913
8376
|
const issueId = params["issueId"];
|
|
8914
8377
|
const type = params["type"];
|
|
8915
8378
|
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-
|
|
8379
|
+
const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
8917
8380
|
const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
|
|
8918
8381
|
yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
|
|
8919
8382
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -8940,7 +8403,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
|
|
|
8940
8403
|
if (limitParam) limit = parseInt(limitParam, 10);
|
|
8941
8404
|
if (offsetParam) offset = parseInt(offsetParam, 10);
|
|
8942
8405
|
}
|
|
8943
|
-
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8406
|
+
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
|
|
8944
8407
|
return jsonResponse(listRunLogsSync(project, type, {
|
|
8945
8408
|
limit,
|
|
8946
8409
|
offset
|
|
@@ -8951,7 +8414,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
|
|
|
8951
8414
|
const project = params["project"];
|
|
8952
8415
|
const type = params["type"];
|
|
8953
8416
|
const runId = params["runId"];
|
|
8954
|
-
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8417
|
+
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
|
|
8955
8418
|
const logPath = getRunLogPath(project, type, runId);
|
|
8956
8419
|
if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
8957
8420
|
const encoder = new TextEncoder();
|
|
@@ -9010,7 +8473,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
|
|
|
9010
8473
|
const project = params["project"];
|
|
9011
8474
|
const type = params["type"];
|
|
9012
8475
|
const runId = params["runId"];
|
|
9013
|
-
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8476
|
+
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
|
|
9014
8477
|
const content = getRunLogSync(project, type, runId);
|
|
9015
8478
|
if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
9016
8479
|
return jsonResponse({
|
|
@@ -9024,7 +8487,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
|
|
|
9024
8487
|
const project = params["project"];
|
|
9025
8488
|
const type = params["type"];
|
|
9026
8489
|
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-
|
|
8490
|
+
const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
9028
8491
|
yield* Effect.promise(() => terminateSpecialist(project, type));
|
|
9029
8492
|
return jsonResponse({
|
|
9030
8493
|
success: true,
|
|
@@ -9036,7 +8499,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
|
|
|
9036
8499
|
const project = params["project"];
|
|
9037
8500
|
const type = params["type"];
|
|
9038
8501
|
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-
|
|
8502
|
+
const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
9040
8503
|
if (pauseGracePeriod(project, type)) return jsonResponse({
|
|
9041
8504
|
success: true,
|
|
9042
8505
|
message: "Grace period paused"
|
|
@@ -9048,7 +8511,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
|
|
|
9048
8511
|
const project = params["project"];
|
|
9049
8512
|
const type = params["type"];
|
|
9050
8513
|
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-
|
|
8514
|
+
const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
9052
8515
|
if (resumeGracePeriod(project, type)) return jsonResponse({
|
|
9053
8516
|
success: true,
|
|
9054
8517
|
message: "Grace period resumed"
|
|
@@ -9060,7 +8523,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
|
|
|
9060
8523
|
const project = params["project"];
|
|
9061
8524
|
const type = params["type"];
|
|
9062
8525
|
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-
|
|
8526
|
+
const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
9064
8527
|
exitGracePeriod(project, type);
|
|
9065
8528
|
return jsonResponse({
|
|
9066
8529
|
success: true,
|
|
@@ -9072,7 +8535,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
|
|
|
9072
8535
|
const project = params["project"];
|
|
9073
8536
|
const type = params["type"];
|
|
9074
8537
|
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-
|
|
8538
|
+
const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
9076
8539
|
const state = getGracePeriodState(project, type);
|
|
9077
8540
|
if (state) return jsonResponse(state);
|
|
9078
8541
|
else return jsonResponse({ error: "No active grace period" }, { status: 404 });
|
|
@@ -9081,7 +8544,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
|
|
|
9081
8544
|
const params = yield* HttpRouter.params;
|
|
9082
8545
|
const project = params["project"];
|
|
9083
8546
|
const type = params["type"];
|
|
9084
|
-
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
8547
|
+
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-CKasRfYu.js"));
|
|
9085
8548
|
const digest = loadContextDigest(project, type);
|
|
9086
8549
|
if (digest) return jsonResponse({ digest });
|
|
9087
8550
|
else return jsonResponse({ error: "No context digest found" }, { status: 404 });
|
|
@@ -9090,7 +8553,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
|
|
|
9090
8553
|
const params = yield* HttpRouter.params;
|
|
9091
8554
|
const project = params["project"];
|
|
9092
8555
|
const type = params["type"];
|
|
9093
|
-
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
8556
|
+
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-CKasRfYu.js"));
|
|
9094
8557
|
const digest = yield* regenerateContextDigest(project, type);
|
|
9095
8558
|
if (digest) return jsonResponse({
|
|
9096
8559
|
digest,
|
|
@@ -9109,7 +8572,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
9109
8572
|
"blocked"
|
|
9110
8573
|
].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
|
|
9111
8574
|
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-
|
|
8575
|
+
const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
|
|
9113
8576
|
signalSpecialistCompletion(project, type, {
|
|
9114
8577
|
status,
|
|
9115
8578
|
notes
|
|
@@ -9143,8 +8606,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
|
|
|
9143
8606
|
const params = yield* HttpRouter.params;
|
|
9144
8607
|
const project = params["project"];
|
|
9145
8608
|
const type = params["type"];
|
|
9146
|
-
const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
9147
|
-
const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-
|
|
8609
|
+
const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
|
|
8610
|
+
const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-LftaVK99.js"));
|
|
9148
8611
|
const retention = getSpecialistRetention(project);
|
|
9149
8612
|
const deleted = cleanupOldLogsSync(project, type, {
|
|
9150
8613
|
maxDays: retention.max_days,
|
|
@@ -9165,7 +8628,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
9165
8628
|
const project = params["project"];
|
|
9166
8629
|
const issueId = params["issueId"];
|
|
9167
8630
|
const { model, harness } = yield* readJsonBody;
|
|
9168
|
-
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-
|
|
8631
|
+
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-DgkUPRx0.js"));
|
|
9169
8632
|
const killResult = yield* killAllReviewerSessions(project, issueId);
|
|
9170
8633
|
const projectConfig = resolveProjectFromIssueSync(issueId);
|
|
9171
8634
|
if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
|
|
@@ -9181,7 +8644,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
9181
8644
|
}));
|
|
9182
8645
|
branch = stdout.trim() || primaryRepo.sourceBranch;
|
|
9183
8646
|
} catch {}
|
|
9184
|
-
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-
|
|
8647
|
+
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-DgkUPRx0.js"));
|
|
9185
8648
|
const prUrl = getReviewStatusSync(issueId)?.prUrl;
|
|
9186
8649
|
const result = yield* spawnReviewRoleForIssue({
|
|
9187
8650
|
issueId,
|
|
@@ -9225,7 +8688,7 @@ const postProjectReviewerRoleRestartRoute = HttpRouter.add("POST", "/api/special
|
|
|
9225
8688
|
const { model } = yield* readJsonBody;
|
|
9226
8689
|
const reviewer = getAgentStateSync(reviewerId);
|
|
9227
8690
|
yield* Effect.promise(() => Effect.runPromise(killSession(reviewerId)).catch(() => void 0));
|
|
9228
|
-
const { spawnReviewSubRoleForIssue } = yield* Effect.promise(() => import("./review-agent-
|
|
8691
|
+
const { spawnReviewSubRoleForIssue } = yield* Effect.promise(() => import("./review-agent-DgkUPRx0.js"));
|
|
9229
8692
|
const result = yield* spawnReviewSubRoleForIssue({
|
|
9230
8693
|
issueId,
|
|
9231
8694
|
workspace: parent.workspace,
|
|
@@ -9353,6 +8816,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
|
|
|
9353
8816
|
*/
|
|
9354
8817
|
const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
|
|
9355
8818
|
//#endregion
|
|
9356
|
-
export {
|
|
8819
|
+
export { ComposerCommandParseError as $, isInsideGitWorkTree as A, cleanupConversationAttachments as B, handleConversationClearForkState as C, jsonResponse as Ct, handleConversationResume as D, handleConversationRestartAll as E, startConversationModelBackfill as F, getConversationAttachmentsRoot as G, cleanupUnreferencedConversationAttachments as H, stopConversationRuntime as I, removeConversationAttachment as J, hasConversationAttachment as K, tmuxSessionExists as L, resolveRegisteredProject as M, shouldReportUnresolvedLiveSession as N, handleConversationStop as O, spawnConversationSession as P, resolvePolicy as Q, waitForPiTuiReady as R, conversationSessionAliveFromState as S, getDefaultCwd as St, handleConversationDelete as T, ensureConversationAttachmentDir as U, cleanupOrphanedConversationAttachments as V, extractConversationAttachmentPaths as W, composerCommandResultHttpStatus as X, runInBatches as Y, handleComposerCommandMessage as Z, isPiControlChannelHarness as _, getHeaderFromMap as _t, agentsRouteLayer as a, resolveRequestedStartedBy as at, validateConversationControlAckOrigin as b, validateOriginHeaders as bt, codexConversationPendingInput as c, spawnPanCli as ct, handleConversationCodexApproval as d, hasDashboardInternalToken as dt, ComposerCommandConfirmationError as et, handleConversationCompact as f, rejectUnauthorizedDashboardRequest as ft, handleConversationThinkingLevel as g, waitForSessionRespawn as gt, handleConversationPlanAction as h, isRespawnPending as ht, validateSpecialistAutoCompleteMetadata as i, isInternalAgentRequest as it, resolveAllowedHarness as j, handleConversationSwitchModel as k, deliverConversationViaControlChannel as l, dashboardCsrfToken as lt, handleConversationDeliveryMethod as m, rejectUnsafeDashboardMutationRequest as mt, _serverManagedMerges as n, evaluateSpawnGuardrails as nt, saveAgentStateAndEmitEvent as o, getWorkAgentLifecycleStateSync as ot, handleConversationControlAck as p, rejectUnauthorizedDashboardSessionMintRequest as pt, isManagedConversationAttachmentPath as q, firePostMergeLifecycle as r, invalidateAgentsCache as rt, saveAgentStateAndEmitEventProgram as s, panCliInvocation as st, specialistsRouteLayer as t, composerCommandConfirmationFromBody as tt, handleConversationAbort as u, dashboardSessionCookieHeader as ut, pickDeliverAs as v, isTrustedOriginForHost as vt, handleConversationCreate as w, jsonStringResponse as wt, conversationNeedsRunningRepair as x, httpHandler as xt, resolveConversationDeliveryMethod as y, validateOrigin as yt, waitForTmuxSession as z };
|
|
9357
8820
|
|
|
9358
|
-
//# sourceMappingURL=specialists-
|
|
8821
|
+
//# sourceMappingURL=specialists-b0dMMjWq.js.map
|