@overdeck/desktop 0.49.1 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drizzle/overdeck/0000_overdeck_init.sql +1 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-Crw-xSJ3.js → acceptance-criteria-B_maCGZv.js} +2 -2
- package/server/{active-dashboard-bundle-CLwfD-Om.js → active-dashboard-bundle-CCqpFWiz.js} +2 -2
- package/server/activity-logger-B0X2JJwM.js +3 -0
- package/server/{activity-logger-BAVLrkR7.js → activity-logger-SlTXYCVf.js} +22 -4
- package/server/{advancing-selfheal-BQiJ7mIH.js → advancing-selfheal-BJAfiY-C.js} +12 -7
- package/server/{agent-gc-5E0lgxI1.js → agent-gc-bhikjoJ_.js} +11 -11
- package/server/agent-idle-D-UQ7gDv.js +745 -0
- package/server/agent-state-BrUPf_7Z.js +3 -0
- package/server/{agent-state-Bb3UUxQm.js → agent-state-FABw8neJ.js} +682 -454
- package/server/{agent-state-service-keg-x1bT.js → agent-state-service-BAQApt97.js} +1 -1
- package/server/{agent-state-service-BFbttwRA.js → agent-state-service-rDenYSlD.js} +5 -5
- package/server/agents-DixZjXWm.js +3 -0
- package/server/{agents-CqQJW75N.js → agents-DzpQidT8.js} +8 -8
- package/server/{archive-planning-BwEhu9Oq.js → archive-planning-BL1ABtW0.js} +20 -135
- package/server/archive-planning-D3gw32U9.js +2 -0
- package/server/{artifact-index-jobs-C6Lg2rKm.js → artifact-index-jobs-Cjdme0jS.js} +3 -3
- package/server/{assemble-DyTp2gSB.js → assemble-B_JgnCbG.js} +28 -9
- package/server/{auto-spawn-consent-BDfe4qz0.js → auto-spawn-consent-BesWchEi.js} +8 -7
- package/server/{backlog-auto-trigger-DuOGpdDW.js → backlog-auto-trigger-COLq639j.js} +3 -3
- package/server/{behavior-Bitko0mD.js → behavior-DCg8CIWC.js} +3 -3
- package/server/{bridge-pool-patrol-DiHEd13O.js → bridge-pool-patrol-BDohuMRt.js} +2 -2
- package/server/{briefing-freshness-CDJcmHHZ.js → briefing-freshness-ENa_hW_V.js} +2 -2
- package/server/build-info-Dx2qrVhb.js +2 -0
- package/server/{build-info-DTX8JwVP.js → build-info-WuZT6xyi.js} +3 -3
- package/server/{checkpoint-manager-BlOOdzLF.js → checkpoint-manager-CSZ7aVQF.js} +26 -9
- package/server/{checkpoint-manager-CKg1tn34.js → checkpoint-manager-DXhGRvg4.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-BGfl0cHM.js → checkpoints-DUkUsPVS.js} +2 -2
- package/server/{checkpoints-DRALkfDS.js → checkpoints-tm_w6Y4V.js} +1 -1
- package/server/{claude-hooks-provision-B_tv3wzE.js → claude-hooks-provision-CTh9zxEi.js} +1 -1
- package/server/{claude-hooks-provision-BlGv6twJ.js → claude-hooks-provision-fRofvhTN.js} +2 -2
- package/server/{claude-permissions-aHgDcZi5.js → claude-permissions-DLrb9ovz.js} +18 -3
- package/server/{claude-settings-overlay-T2LWLteV.js → claude-settings-overlay-BYnXaTVc.js} +2 -2
- package/server/{claude-settings-overlay-CYOvFE3A.js → claude-settings-overlay-CMS5Jab5.js} +1 -1
- package/server/cli-BflmtEFM.js +2 -0
- package/server/{cli-Do8UpLoI.js → cli-CoQou1t_.js} +11 -11
- package/server/{cliproxy-CX6jHRDP.js → cliproxy-DXDQcR3I.js} +52 -17
- package/server/cliproxy-DdhFpcXU.js +3 -0
- package/server/{close-issue-J0_eWYT1.js → close-issue-CpQ0BWg-.js} +5 -5
- package/server/{closed-issue-reaper-bFppuk6F.js → closed-issue-reaper-CdcJRvUx.js} +13 -12
- package/server/{closed-issue-reaper-Cl2h9AfT.js → closed-issue-reaper-TymtZM37.js} +1 -1
- package/server/{codex-icapA4om.js → codex-BValsmtK.js} +1 -1
- package/server/{codex-OOea7lXs.js → codex-DYyZL8JD.js} +16 -10
- package/server/{compaction-continuation-D5voR1ME.js → compaction-continuation-CVjbdGKt.js} +3 -3
- package/server/{config-Cjleh3_U.js → config-CvKH7r7W.js} +1 -1
- package/server/{config-tucKBCCc.js → config-NxI9Yl2f.js} +2 -2
- package/server/{config-DC75T4Mr.js → config-_qaa1UXH.js} +2 -2
- package/server/{config-yaml-BwOEANMr.js → config-yaml-D60AnTIu.js} +55 -15
- package/server/{conflict-gate-DlpWCMd7.js → conflict-gate-0dD1kxjN.js} +1 -1
- package/server/{conflict-gate-D2L1kZeL.js → conflict-gate-hAUCL-un.js} +5 -5
- package/server/{context-layers-CSPGc2Hb.js → context-layers-CdpabJj0.js} +3 -3
- package/server/context-layers-Ds1MnEFI.js +4 -0
- package/server/{continue-U3Af0jUq.js → continue-CnvrUfxw.js} +3 -3
- package/server/{control-settings-5k6ixdFW.js → control-settings-Db0uXgVM.js} +310 -7
- package/server/{conversation-compaction-CSpVpxN6.js → conversation-compaction-B-1KETG9.js} +8 -8
- package/server/{conversation-compaction-Ciit9O6k.js → conversation-compaction-DzMXGRiJ.js} +1 -1
- package/server/{conversation-service-BxrB5lUT.js → conversation-service-BL-asWPX.js} +1 -1
- package/server/{conversation-service-BteE4ELK.js → conversation-service-BxIOd5ay.js} +21 -7
- package/server/conversations-CEMfwMt-.js +3 -0
- package/server/{conversations-DhwxsOru.js → conversations-nS6QgYpD.js} +12 -7
- package/server/cost-3FyqKK56.js +838 -0
- package/server/{cost-Bnf9NUC5.js → cost-Cctc-Q9M.js} +3 -3
- package/server/{cost-CQKI6OCu.js → cost-DTuIRE4y.js} +2 -2
- package/server/{cost-sync-B-ADeXKY.js → cost-sync-DfmvLT9L.js} +3 -3
- package/server/{dag-DI9LaK_q.js → dag-o-dUpw1L.js} +6 -19
- package/server/{dangerous-git-ops-akhA3iyF.js → dangerous-git-ops-BOtXCFkT.js} +1 -1
- package/server/dashboard-db-worker.js +61 -11
- package/server/{deacon-TPYssFYt.js → deacon-CsisLmPt.js} +1735 -172
- package/server/{deacon-canonical-state-DFYymrDw.js → deacon-canonical-state-DkdkQS5p.js} +3 -3
- package/server/deacon-e6py3jkM.js +4 -0
- package/server/{deacon-event-client-Te5v10-b.js → deacon-event-client-BCjHiGAY.js} +1 -1
- package/server/{deacon-event-client-BKOL4AcL.js → deacon-event-client-CMQswEHX.js} +2 -2
- package/server/{deacon-nudge-log-BtlTWgWu.js → deacon-nudge-log-pcliw8Dr.js} +1 -1
- package/server/{deacon-pending-lifecycle-DVHjOLje.js → deacon-pending-lifecycle-BzaE76Xo.js} +3 -3
- package/server/deacon.js +11 -11
- package/server/{dead-end-trip-P0IF1O0E.js → dead-end-trip-Bs3hxIn6.js} +3 -3
- package/server/dead-end-trip-DUbiRMtT.js +2 -0
- package/server/delivery-DhZGRShH.js +3 -0
- package/server/{deploy-patrol-BXjlvoV3.js → deploy-patrol-B8sKkA8h.js} +8 -8
- package/server/deploy-queue--smqHLhe.js +2 -0
- package/server/{deploy-queue-o7shYg1j.js → deploy-queue-CCGWXFkp.js} +2 -2
- package/server/{deploy-window-CNT6fOff.js → deploy-window-YuJewzmC.js} +4 -4
- package/server/{deploy-window-BMk5_oX6.js → deploy-window-hgsvZ3UZ.js} +1 -1
- package/server/{dev-supervisor-SR1CLOAK.js → dev-supervisor-4SBloJHV.js} +2 -2
- package/server/{devcontainer-renderer-enMmNDFa.js → devcontainer-renderer-BiJhwFNi.js} +3 -3
- package/server/{dist-CPTO_zMR.js → dist-CoR2sivG.js} +1 -1
- package/server/dist-FHv1s5ez.js +3 -0
- package/server/{docker-B7qUZptz.js → docker-CWO7dcIP.js} +3 -3
- package/server/{docker-KR3zSFKY.js → docker-DQzyMXkd.js} +1 -1
- package/server/{dod-gK835UMf.js → dod-BAk5arLF.js} +1 -1
- package/server/{done-preflight-CksRvh49.js → done-preflight-CGFA0M1b.js} +1 -1
- package/server/{done-preflight-Bk8aExAL.js → done-preflight-Cx9JGznT.js} +5 -5
- package/server/{driver-CmsY2RLl.js → driver-BtcFz-qu.js} +14 -3
- package/server/durable-review-pipeline-BOEZ0chh.js +3 -0
- package/server/{durable-review-pipeline-DgYHucN2.js → durable-review-pipeline-Djx_lvFd.js} +11 -2
- package/server/{ensure-devcontainer-BQ4YizSH.js → ensure-devcontainer-Dk6ZMOUC.js} +1 -1
- package/server/{ensure-devcontainer-ojerEqQg.js → ensure-devcontainer-DzYBBwnM.js} +4 -4
- package/server/{esm-shims-1htPASWs.js → esm-shims-deFq5Hhl.js} +1 -1
- package/server/{event-store-BgEjNsvk.js → event-store-C50Qt-f1.js} +1 -1
- package/server/{event-store-D7qcJXuZ.js → event-store-DTns2XZP.js} +5 -5
- package/server/{event-store-provider-BKvk2rDj.js → event-store-provider-Bu1Qrg6v.js} +1 -1
- package/server/{events-BIKGJZOT.js → events-B6xW8Cpm.js} +3 -3
- package/server/{dist-src-BM9eudEd.js → factory-CWVKwKFE.js} +714 -2
- package/server/{feature-registry-storage-ewNSIVsQ.js → feature-registry-storage-vaxRN3WO.js} +3 -3
- package/server/{features-CGopJXdU.js → features-DXWwktJB.js} +2 -2
- package/server/{feedback-stuck-retirement-B8-fX7NA.js → feedback-stuck-retirement-CXAYe2rU.js} +2 -2
- package/server/{feedback-target-CkyLYohm.js → feedback-target-DSVpi0gT.js} +1 -1
- package/server/{feedback-target-Ci6N5p4G.js → feedback-target-yPD_wclF.js} +10 -10
- package/server/{feedback-writer-DfuVjvH0.js → feedback-writer-BzN4qvaP.js} +1 -1
- package/server/{feedback-writer-D4ULO4qG.js → feedback-writer-Ds1Wjsz4.js} +5 -5
- package/server/{flywheel-DXI_WITn.js → flywheel-BCZS-FlW.js} +1 -1
- package/server/{flywheel-BwYPDlhK.js → flywheel-CC4gE_rx.js} +15 -15
- package/server/{flywheel-C7yek87O.js → flywheel-DWKd7bMc.js} +79 -29
- package/server/{flywheel-merge-order-C5m5bYBc.js → flywheel-merge-order-DDT3i57u.js} +1 -1
- package/server/{flywheel-merge-order-CXfU4M6l.js → flywheel-merge-order-DJwH2KpL.js} +17 -15
- package/server/forge-4VVCRcF7.js +2 -0
- package/server/{forge-DYX9sKzG.js → forge-CHADjOFs.js} +2 -2
- package/server/{from-DAdMxC29.js → from-C3dzmjSO.js} +1 -1
- package/server/{fs-lock-cw25uO_E.js → fs-lock-DQ_gUxfq.js} +2 -2
- package/server/{fts-operations-D_rzLxX5.js → fts-operations-asZo2fh1.js} +3 -3
- package/server/git-info-DMOSfJ9I.js +148 -0
- package/server/{git-utils-Y0zG25ez.js → git-utils-BAMwn9Nf.js} +1 -1
- package/server/{git-utils-DV4B9TRl.js → git-utils-BdHk8y7g.js} +4 -4
- package/server/{github-app-C33lDk9Z.js → github-app-BWziYCf3.js} +1 -1
- package/server/{github-app-4UX8VIr8.js → github-app-BlMSzSTw.js} +2 -2
- package/server/{github-client-nPj5ckZO.js → github-client-OK24qpol.js} +1 -1
- package/server/{github-client-DkJVR908.js → github-client-w6j5nVlz.js} +3 -3
- package/server/{github-pr-lookup-C9Vokb0W.js → github-pr-lookup-bGcsEvLE.js} +2 -2
- package/server/{harness-binary-BgXYDo2Z.js → harness-binary-DChiynaB.js} +2 -2
- package/server/{harness-resolve-1NZcVx7n.js → harness-resolve-BplBEbwn.js} +4 -4
- package/server/{health-events-jMfxrElt.js → health-events-BTqsmunw.js} +1 -1
- package/server/{health-events-DlX_FVAB.js → health-events-Bk3LjaJ9.js} +2 -2
- package/server/{hooks-NQ19vvlB.js → hooks-DJR1yR9w.js} +2 -2
- package/server/{hooks-W3REcb3h.js → hooks-EndRNrx9.js} +1 -1
- package/server/{hume-BFkid2PO.js → hume-1FJmNDTq.js} +2 -2
- package/server/hume-gXLmRhmN.js +3 -0
- package/server/{identity-Bwh6VGeL.js → identity-C3s8lyp0.js} +3 -3
- package/server/{idle-stack-reaper-CHtCNpvd.js → idle-stack-reaper-CBelVOE3.js} +1 -1
- package/server/{idle-stack-reaper-BeU_KxWx.js → idle-stack-reaper-DtoI4al6.js} +4 -4
- package/server/{in-flight-guard-pcwXKLGz.js → in-flight-guard-B7khcBdQ.js} +1 -1
- package/server/{infra-KTp9KV9u.js → infra-CJRi_5Wu.js} +36 -7
- package/server/{injection-67YyU6SC.js → injection-ADWQ3D0s.js} +8 -8
- package/server/{injection-BxbZKPDh.js → injection-BWsgHvrL.js} +1 -1
- package/server/{inspect-agent-VHSihlb7.js → inspect-agent-CCfNJjKr.js} +12 -12
- package/server/inspect-agent-Dhp3hCGp.js +2 -0
- package/server/{internal-token-B-z-sGBH.js → internal-token-BCTEqUCX.js} +1 -1
- package/server/{internal-token-zY75jrRJ.js → internal-token-BeIWG_kT.js} +2 -2
- package/server/{io-DfvO2xyh.js → io-BCtZoXHo.js} +5 -5
- package/server/{issue-closed-dvEWKO7Q.js → issue-closed-CiYAa6bX.js} +7 -7
- package/server/{issue-lifecycle-3N8XF7lP.js → issue-lifecycle-BETNVVLq.js} +206 -29
- package/server/{issue-lifecycle-BI6jAfp8.js → issue-lifecycle-DaKN57sx.js} +1 -1
- package/server/{issue-service-singleton-CL6hESX2.js → issue-service-singleton-1Q0ER8Yc.js} +1 -1
- package/server/{issue-service-singleton-BN_2MXp4.js → issue-service-singleton-C_sZ0HjP.js} +124 -11
- package/server/issue-title-fallback-B91iD66g.js +120 -0
- package/server/{issues-CkvUoAnq.js → issues-RGHQUKhB.js} +2 -2
- package/server/{jsonl-parser-CrEb2PWr.js → jsonl-parser-Dfs1dlYE.js} +3 -3
- package/server/jsonl-resolver-bFtftCDd.js +324 -0
- package/server/{kimi-code-DoMoGqIu.js → kimi-code-BxkDgaj4.js} +1 -1
- package/server/{kimi-code-C26gmGxM.js → kimi-code-CNYRA8Dd.js} +14 -12
- package/server/{kimi-parser-Dmhy3UlR.js → kimi-parser-OcWwmOqF.js} +2 -2
- package/server/{label-cleanup-X2lWfghH.js → label-cleanup-CefxK9tL.js} +3 -3
- package/server/{lifecycle-B0rL38D3.js → lifecycle-DDZ7w-BY.js} +6 -6
- package/server/{lifecycle-Bg44O-9x.js → lifecycle-DVXyUil2.js} +2 -2
- package/server/{lifecycle-io-DQDU0apV.js → lifecycle-io-D1oBiMce.js} +1 -1
- package/server/{lifecycle-io-CCBpRv5m.js → lifecycle-io-D7N0vQNj.js} +5 -5
- package/server/{linear-client-B0cIkTs4.js → linear-client-DUN7zCeb.js} +3 -3
- package/server/{linear-client-6V2E-DSa.js → linear-client-TL32snOy.js} +1 -1
- package/server/{linear-mcp-auth-LCo9AWUd.js → linear-mcp-auth-CtRKSHy5.js} +1 -1
- package/server/{linear-mcp-auth-Dsu9Io9r.js → linear-mcp-auth-bB0CPyjh.js} +5 -5
- package/server/memory-fts-worker.js +1 -1
- package/server/{memory-governor-A4O6vI9d.js → memory-governor-Cvv_9K0M.js} +88 -22
- package/server/{memory-pressure-patrol-BWlWywmA.js → memory-pressure-patrol-C6DJJQRA.js} +38 -14
- package/server/{merge-BGWcBxku.js → merge-DOCR6pHi.js} +1 -1
- package/server/{merge-vz80RvSE.js → merge-FTk4LsnM.js} +3 -3
- package/server/{merge-agent-GWhmnxFk.js → merge-agent-C-dsN9se.js} +37 -33
- package/server/{merge-agent-BRSz26Oh.js → merge-agent-D-4_iQgy.js} +2 -2
- package/server/{merge-batch-CFMEtTxv.js → merge-batch-BJjzUUL7.js} +1 -1
- package/server/{merge-completeness-CP347umA.js → merge-completeness-BOtBUwTU.js} +4 -4
- package/server/{merge-completeness-7ajHAIR-.js → merge-completeness-CoLJxfUY.js} +1 -1
- package/server/merge-eligibility-C4rTS97F.js +3 -0
- package/server/merge-eligibility-D7wRnJbj.js +51 -0
- package/server/merge-ops-Cf02szJ5.js +2 -0
- package/server/merge-rebase-Bj7eJAG4.js +2 -0
- package/server/{merge-rebase-C5htyEEH.js → merge-rebase-KBw4rdh3.js} +2 -2
- package/server/{merge-set-DsGW8fmc.js → merge-set-CVfEM57p.js} +1 -1
- package/server/{merge-set-eiE2nC6C.js → merge-set-CyW-xSn4.js} +4 -4
- package/server/{merge-sync-CM2-myXu.js → merge-sync-CYGsJy0u.js} +1 -1
- package/server/{merge-sync-Ct0-cxMX.js → merge-sync-YLvOPAry.js} +2 -2
- package/server/{merge-train-BOu3fN7O.js → merge-train-VxLn8Ms4.js} +4 -4
- package/server/{merge-train-deps-LXHGK61n.js → merge-train-deps-D0y4hBB9.js} +4 -4
- package/server/{merge-verification-BRp08IzI.js → merge-verification-BfJRNMiD.js} +6 -6
- package/server/{merged-docker-cleanup-worker-CwldDjHV.js → merged-docker-cleanup-worker-Bh5fKG_b.js} +4 -4
- package/server/{merged-docker-cleanup-worker-C8eGn78a.js → merged-docker-cleanup-worker-Ci9oeFAe.js} +1 -1
- package/server/messaging-Dfbhgjd6.js +3 -0
- package/server/{multipart-parser-OAuW7824.js → multipart-parser-BYwfKOVU.js} +2 -2
- package/server/{no-resume-mode-MWI6pnrK.js → no-resume-mode-DjMQRkId.js} +1 -1
- package/server/node_modules/.package-lock.json +24 -24
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/AGENTS.md +14 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/CLAUDE.md +14 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +10 -3
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/package.json +2 -2
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/10_basics.ts +175 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/index.md +6 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/10_basics.ts +3 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/20_testing.ts +100 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/api/Users.ts +30 -14
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/domain/User.ts +15 -6
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +11 -10
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +41 -32
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users.ts +141 -20
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/70_cli/10_basics.ts +31 -5
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +10 -9
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js +12 -9
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js +4 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js +10 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts +4 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts.map +1 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js +10 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js.map +1 -0
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +7 -7
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +16 -11
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeClusterSocket.ts +15 -12
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocket.ts +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocketServer.ts +4 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeStream.ts +10 -4
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/internal/nodeChildProcessSpawner.ts +16 -0
- package/server/node_modules/@types/node/README.md +1 -1
- package/server/node_modules/@types/node/buffer.buffer.d.ts +5 -5
- package/server/node_modules/@types/node/crypto.d.ts +2 -2
- package/server/node_modules/@types/node/http.d.ts +16 -0
- package/server/node_modules/@types/node/http2.d.ts +10 -2
- package/server/node_modules/@types/node/package.json +2 -2
- package/server/node_modules/@types/node/process.d.ts +52 -0
- package/server/node_modules/@types/node/quic.d.ts +210 -28
- package/server/node_modules/@types/node/sqlite.d.ts +6 -2
- package/server/node_modules/@types/node/test.d.ts +36 -0
- package/server/node_modules/ansi-regex/index.js +3 -2
- package/server/node_modules/ansi-regex/package.json +1 -1
- package/server/node_modules/effect/node_modules/uuid/README.md +19 -19
- package/server/node_modules/effect/node_modules/uuid/dist/v1.js +7 -3
- package/server/node_modules/effect/node_modules/uuid/dist/v7.js +5 -2
- package/server/node_modules/effect/node_modules/uuid/dist-node/v1.js +7 -3
- package/server/node_modules/effect/node_modules/uuid/dist-node/v7.js +5 -2
- package/server/node_modules/effect/node_modules/uuid/package.json +4 -3
- package/server/node_modules/gaxios/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/server/node_modules/gaxios/build/esm/tsconfig.tsbuildinfo +1 -1
- package/server/node_modules/gaxios/package.json +3 -3
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs +11 -5
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.js +11 -5
- package/server/node_modules/msgpackr/dist/index.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/node.cjs +11 -5
- package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/test.js +11 -5
- package/server/node_modules/msgpackr/dist/test.js.map +1 -1
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +11 -5
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/package.json +1 -1
- package/server/node_modules/msgpackr/unpack.js +11 -5
- package/server/node_modules/picomatch/lib/parse.js +10 -1
- package/server/node_modules/picomatch/lib/scan.js +30 -18
- package/server/node_modules/picomatch/package.json +1 -1
- package/server/{orphan-proposed-reconciler-BAE5AZ_e.js → orphan-proposed-reconciler-CnP0K2v3.js} +2 -2
- package/server/{orphan-proposed-reconciler-cV3URUqk.js → orphan-proposed-reconciler-nFUlquZt.js} +24 -23
- package/server/package-lock.json +25 -25
- package/server/package.json +1 -1
- package/server/{pan-dir-DDd91kMb.js → pan-dir-B4NfzOf3.js} +5 -5
- package/server/{deacon-merge-BOGFEV8_.js → parked-residue-8WbU0y1z.js} +188 -69
- package/server/{paths-CRLnDgcI.js → paths-rETQhTF2.js} +2 -2
- package/server/{pending-lifecycle-claim-CYgMiDAP.js → pending-lifecycle-claim-yAwDuGS4.js} +2 -2
- package/server/{pickup-BjJsSX12.js → pickup-Dle6k9Xt.js} +1 -1
- package/server/{pipeline-agent-reader-BLc43dVJ.js → pipeline-agent-reader-CeWhQzXC.js} +5 -5
- package/server/{pipeline-membership-BHZp_ShY.js → pipeline-membership-BV4hdkHm.js} +1 -1
- package/server/{pipeline-membership-5qlRz5Qg.js → pipeline-membership-C9ykcjsn.js} +1 -1
- package/server/{pipeline-membership-gather-CGFY1v-y.js → pipeline-membership-gather-Ba0wJNCR.js} +17 -12
- package/server/{pipeline-membership-gather-WhRc1yke.js → pipeline-membership-gather-C9E22B2W.js} +1 -1
- package/server/{pipeline-notifier-C4fZ2ito.js → pipeline-notifier-B5DPXvnr.js} +1 -1
- package/server/{pipeline-notifier-BmsLWM_2.js → pipeline-notifier-p190L97e.js} +2 -2
- package/server/{post-merge-lifecycle-worker-KK1RTKRE.js → post-merge-lifecycle-worker-OQoK8Ckg.js} +3 -3
- package/server/{post-merge-state-_Lj3LDLh.js → post-merge-state-DFaf7OI1.js} +4 -4
- package/server/prd-locations-F2oLSAhy.js +124 -0
- package/server/{project-pipelines-CCkebHOu.js → project-pipelines-CUsa6U59.js} +2 -2
- package/server/project-repos-BVdi9-ch.js +3 -0
- package/server/{project-repos-B4MK48j4.js → project-repos-CsfvLtmr.js} +29 -3
- package/server/project-resource-refresh-queue-BehrH4Ai.js +865 -0
- package/server/project-resource-refresh-queue-D2110Guc.js +2 -0
- package/server/{projects-DvPEAP18.js → projects-BMuEf14J.js} +1 -1
- package/server/{prompts-BiS5I2tZ.js → prompts-CKpDt8Jn.js} +2 -2
- package/server/providers-Buv2wmFU.js +3 -0
- package/server/{providers-DrfK0Ip8.js → providers-CxPKmyif.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-GtVe_o56.js → chunk-BO2N2NFS-DZOQVqV1.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-BvhcYYHc.js → diagram-OG6HWLK6-oKeXcbO1.js} +1 -1
- package/server/public/assets/{dist-CSmUXazd.js → dist-2qPmeRzT.js} +3 -3
- package/server/public/assets/{dist-D0ryefak.js → dist-ClBlE-Nm.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-BXA51DzM.js → ganttDiagram-6RSMTGT7-BwdG9fQv.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-mlV4EpWt.js → highlighted-body-OFNGDK62-BzGNdskQ.js} +1 -1
- package/server/public/assets/index-CdPveU3M.css +1 -0
- package/server/public/assets/index-Cg6tdZoY.js +860 -0
- package/server/public/assets/{linear-BPE7oswm.js → linear-DpEt1TJb.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-6KBD_3T_.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BguGGV3S.js → pieDiagram-4H26LBE5-9BpM4oRJ.js} +1 -1
- package/server/public/assets/{prod-aKDYUrXQ.js → prod-CzJiNNEG.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bx3i4B6H.js → quadrantDiagram-W4KKPZXB-BXWVAoZx.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-B5vuLjA4.js → sankeyDiagram-5OEKKPKP-5oxodGEw.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-HPlpkqsN.js → xychartDiagram-2RQKCTM6-BChDrHxZ.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/pull-requests-CmlandI7.js +2 -0
- package/server/{pull-requests-BcHIsFJv.js → pull-requests-T0OV0Vn4.js} +3 -3
- package/server/{rally-B1OMtzch.js → rally-CUqj2oIN.js} +3 -3
- package/server/rally-DYIn9R2U.js +3 -0
- package/server/{rally-api-ShZ4kvn0.js → rally-api-BFPb2oSq.js} +2 -2
- package/server/{rally-api-u_vkr5c_.js → rally-api-BoucQG1u.js} +1 -1
- package/server/{rally-client-D6Feq1Ka.js → rally-client-16iObny7.js} +5 -5
- package/server/{rally-client-DgZvUZqX.js → rally-client-CsqLjLLa.js} +1 -1
- package/server/{reap-terminal-sessions-CRfiXLY0.js → reap-terminal-sessions-BaDSNR-k.js} +2 -2
- package/server/{reap-terminal-sessions-D7f3zSE9.js → reap-terminal-sessions-DgEIKMhH.js} +2 -2
- package/server/{rebuild-stack-CCwKHZb6.js → rebuild-stack-BcBVFJp3.js} +2 -2
- package/server/{rebuild-stack-DKxOnkpE.js → rebuild-stack-CyXMrj6K.js} +7 -7
- package/server/reconciler-caYiRnPy.js +657 -0
- package/server/{reconstruct-cache-BP8UIKt7.js → reconstruct-cache-3JzPOune.js} +7 -7
- package/server/{record-By-wp6pg.js → record-DYOg97Iv.js} +1 -1
- package/server/{record-update-D23jPU6b.js → record-update-BPqpBu3O.js} +9 -7
- package/server/{record-update-ByGtIlUK.js → record-update-CDPEX7BH.js} +1 -1
- package/server/{recovery-trip-C4dTl8DO.js → recovery-trip-CpfW6LCJ.js} +43 -10
- package/server/{recovery-trip-qloOYOFz.js → recovery-trip-xqKC07Gy.js} +1 -1
- package/server/{release-engine-Crc0Tjx-.js → release-engine-C_OOhCaK.js} +5 -5
- package/server/{release-set-DDXwbIK7.js → release-set-DOIDz2vw.js} +3 -3
- package/server/{remote-oEMfXlwT.js → remote-BTh-sjpX.js} +3 -3
- package/server/{remote-agents-Bgtc2nOO.js → remote-agents-DbbN7vSm.js} +6 -6
- package/server/{remote-agents-DQVGZVQ9.js → remote-agents-MuXx2gWm.js} +1 -1
- package/server/{remote-completion-DxUJ5HKR.js → remote-completion-LcWCpAm2.js} +13 -13
- package/server/{remote-CBpLi4Yy.js → remote-xY0B43Ho.js} +3 -3
- package/server/{resolver-CuAULbLs.js → resolver-C2QKOf09.js} +2 -2
- package/server/{resolver-C8rooxoz.js → resolver-D4nsxfGo.js} +31 -8
- package/server/resume-ByUrJUNX.js +3 -0
- package/server/{review-agent-7C2w5CzU.js → review-agent-BRBTm1qE.js} +43 -55
- package/server/review-agent-Caodi0PX.js +3 -0
- package/server/{review-artifacts-BJeEfm2r.js → review-artifacts-DgaDlbO4.js} +6 -6
- package/server/{review-convoy-liveness-DfF9eXjI.js → review-convoy-liveness-BBvyuRLC.js} +20 -11
- package/server/{review-run-recovery-ZjuDTNhZ.js → review-run-recovery-DCzWMMvE.js} +1 -1
- package/server/{review-run-recovery-7BKt2Es0.js → review-run-recovery-THHMKlXJ.js} +3 -3
- package/server/{review-status-CUnjjOUu.js → review-status-Bge_3XTR.js} +1 -1
- package/server/{review-status-DBnR5t4z.js → review-status-DpniqzPT.js} +113 -44
- package/server/{review-status-emit-Cg4tOb8U.js → review-status-emit-D7sM720S.js} +3 -3
- package/server/{review-status-enrichment-D-rQshu6.js → review-status-enrichment-PDI4-faj.js} +3 -3
- package/server/{review-status-source-DSn0glLa.js → review-status-source-D2PCWS6E.js} +1 -1
- package/server/{review-status-source-Ct912fv_.js → review-status-source-Jq0BXmn3.js} +1 -1
- package/server/{review-status-sync-B7V_Gg51.js → review-status-sync-C6ZKTI8f.js} +11 -8
- package/server/{review-status-sync-YthpOH_q.js → review-status-sync-CvpHWyvR.js} +1 -1
- package/server/{review-verdict-feedback-C-dBon_-.js → review-verdict-feedback-B2ojHFH5.js} +8 -8
- package/server/{review-verdict-feedback-DqXTuJk8.js → review-verdict-feedback-tyMoLT2L.js} +1 -1
- package/server/{review-verdict-writer-CKaJWp75.js → review-verdict-writer-Cy_1pnIj.js} +7 -7
- package/server/{review-verdict-writer-jldSh3Bm.js → review-verdict-writer-DjrJ64eS.js} +1 -1
- package/server/{rollup-DZwH4CLs.js → rollup-Cp0KEoOu.js} +1 -1
- package/server/{rollup-QCwYcBdP.js → rollup-DU3xBQu2.js} +8 -8
- package/server/{scanner-2aHeLC3W.js → scanner-BFKG3Gxv.js} +8 -8
- package/server/{search-DwHYaj66.js → search-DhtKwbBC.js} +2 -2
- package/server/{secret-redaction-B5G1xZ3k.js → secret-redaction-DLZ-VqHq.js} +1 -1
- package/server/{sequence-io-POKWdusG.js → sequence-io-C-Q19Jez.js} +4 -4
- package/server/{sequencer-agent-DS00KHVm.js → sequencer-agent-eN2P2lDz.js} +6 -6
- package/server/server.js +1499 -1350
- package/server/{service-BLb_CyPL.js → service-CThO0Sar.js} +80 -774
- package/server/{session-fork-DcTzVwex.js → session-fork-ZYTHtpBh.js} +2 -2
- package/server/settings-ByDRfuuE.js +2 -0
- package/server/{settings-Clw8UVNs.js → settings-CTywpFw5.js} +2 -2
- package/server/{settings-B9-H2K_E.js → settings-nAT-eK56.js} +3 -3
- package/server/{shadow-engineering-C6oO_PiR.js → shadow-engineering-BHZKPJhq.js} +3 -3
- package/server/{shadow-state-CEGrrECe.js → shadow-state-BTLi4Axs.js} +2 -2
- package/server/{shadow-state-e7250VUx.js → shadow-state-CZ_LnPsi.js} +1 -1
- package/server/{shadow-utils-xFk2Wusb.js → shadow-utils-CPLlPHdn.js} +2 -2
- package/server/{ship-log-7BnQHuKU.js → ship-log-D-CphNZx.js} +1 -1
- package/server/{ship-record-CwUX6Afo.js → ship-record-BaBla0l_.js} +7 -7
- package/server/{ship-record-BgUPnpT0.js → ship-record-BlvX8-xv.js} +1 -1
- package/server/{ship-status-Ce3_3edi.js → ship-status-rQbPQBsF.js} +2 -2
- package/server/{smart-compaction-BmfIi3oL.js → smart-compaction-CUXn8mfX.js} +1 -1
- package/server/{smart-compaction-Dy0gw1VH.js → smart-compaction-D1CNGdZx.js} +7 -7
- package/server/{spawn-planning-session-nH3b4Drz.js → spawn-planning-session-DCmO6COk.js} +19 -19
- package/server/{spawn-planning-session-CfhxRJoY.js → spawn-planning-session-DfEWyrVV.js} +2 -2
- package/server/{specialist-completion-CC1XJbTx.js → specialist-completion-BMv3K54P.js} +1 -1
- package/server/{specialist-context-cHwpcXSh.js → specialist-context-C1-CfYQb.js} +5 -5
- package/server/{specialist-handoff-logger-GqnGSYoJ.js → specialist-handoff-logger-BDKoz5Z9.js} +2 -2
- package/server/{specialist-logs-5OTnrV91.js → specialist-logs-BJQFkpdG.js} +3 -3
- package/server/specialists-CYt1U3Zm.js +4 -0
- package/server/{specialists-8LcQi9Np.js → specialists-D6MUU31Q.js} +21 -272
- package/server/{specialists-DocAK-7A.js → specialists-DhS79T9v.js} +369 -691
- package/server/{specialists-xXcJHAyg.js → specialists-Dx0zRTxX.js} +1 -1
- package/server/specialists-registry-BRLCi61y.js +3 -0
- package/server/specialists-registry-Bng0OFGH.js +277 -0
- package/server/specs-oRGyfz6C.js +3 -0
- package/server/{src-C2TAxwki.js → src-C7gGe4KU.js} +6 -6
- package/server/{src-DudQNYVw.js → src-CdwN6WY6.js} +344 -7
- package/server/{src-DUVvEA8Q.js → src-DMosbuSJ.js} +3 -3
- package/server/{stack-health-DKT4ySnA.js → stack-health-BKfNaqMm.js} +3 -3
- package/server/{stack-health-CbyiYS9H.js → stack-health-Bz711z1Y.js} +1 -1
- package/server/{stale-task-claims-PzFee70R.js → stale-task-claims-DMRLb5R2.js} +5 -5
- package/server/{staleness-D8UTEXV5.js → staleness-CxZaIhrn.js} +1 -1
- package/server/{staleness-BjOAq9-d.js → staleness-r_dkMyMG.js} +1 -1
- package/server/{stall-sweeper-DOyIfeLR.js → stall-sweeper-CBWqSWV2.js} +8 -8
- package/server/{state-home-DhAZlk5k.js → state-home-DhsMqg8W.js} +2 -2
- package/server/{state-mapping-BVSs84bO.js → state-mapping-D2yC81Vy.js} +1 -1
- package/server/{state-migrate-CJKEwpB0.js → state-migrate-C2Ouyd6e.js} +6 -6
- package/server/{state-mirror-Do7pag7W.js → state-mirror-BPXciz84.js} +3 -3
- package/server/stuck-remediation-DALieAkx.js +2 -0
- package/server/stuck-remediation-kta3KN7c.js +774 -0
- package/server/{substrate-bug-weights-service-BTNjHBnl.js → substrate-bug-weights-service-D_ICP7TI.js} +3 -3
- package/server/{summary-fork-CvB7Oyq9.js → summary-fork-CojrFKb6.js} +2 -2
- package/server/{summary-fork-CZ88rhVx.js → summary-fork-DhhaFhxZ.js} +113 -30
- package/server/supervisor/{pane-composer-BaLLspSj.js → pane-composer-CoiVkGIt.js} +8 -1
- package/server/supervisor/{paths-D6XUcR_g.js → paths-DTGbtcaP.js} +8 -4
- package/server/supervisor/pty-supervisor.js +3 -3
- package/server/supervisor/{pty-token-DjjHxoCq.js → pty-token-GVqnvU3U.js} +2 -2
- package/server/supervisor-DSSWo4M2.js +2 -0
- package/server/{supervisor-D4v0WfiQ.js → supervisor-DqH-laVL.js} +4 -4
- package/server/{swarm-readiness-D8R-LWX5.js → swarm-readiness-LF8ZF_hc.js} +3 -3
- package/server/{synthesis-verdict-N5Z11pg7.js → synthesis-verdict-CGFF8uQI.js} +2 -2
- package/server/{synthesis-verdict-B6wvLGcA.js → synthesis-verdict-DSoOFUIV.js} +1 -1
- package/server/{system-prerequisites-BbGZ_WHF.js → system-prerequisites-Lsx0jUUV.js} +2 -2
- package/server/{teardown-workspace-CYend-KY.js → teardown-workspace-DMwomEG1.js} +16 -16
- package/server/{test-agent-queue-BUtWhNcc.js → test-agent-queue-Cu0D6BYe.js} +6 -6
- package/server/{test-verdict-BWm3hgDj.js → test-verdict-9mvl7pQn.js} +1 -1
- package/server/{test-verdict-BWtRmdiR.js → test-verdict-oNSv1rVr.js} +2 -2
- package/server/{tldr-daemon-CneJ24eL.js → tldr-daemon-CRSAkhBx.js} +1 -1
- package/server/{tldr-daemon-CMVBT4kT.js → tldr-daemon-McqCk2X7.js} +2 -2
- package/server/tmux-CYucGrTl.js +4 -0
- package/server/{tmux-BqXzRuaH.js → tmux-wnT_hg-s.js} +91 -19
- package/server/{token-CO3INKbh.js → token-BdfZLRg1.js} +2 -2
- package/server/{token-util-DyJJyX_B.js → token-util-Crcay9j_.js} +1 -1
- package/server/token-util-DfUS3Lpp.js +3 -0
- package/server/{tracker-config-DVzhaUxO.js → tracker-config-tfAOWgng.js} +2 -2
- package/server/{tracker-utils-xnVJVrrO.js → tracker-utils-Dbg_pVZg.js} +2 -2
- package/server/{traefik-connect-A5k54mCv.js → traefik-connect-DoQvQ6oJ.js} +1 -1
- package/server/{tunnel-DauSR-rs.js → tunnel-B1MNIgkL.js} +1 -1
- package/server/{tunnel-CwOnS-PB.js → tunnel-skW68j9B.js} +3 -3
- package/server/{typed-errors-B-gfU2RB.js → typed-errors-CZ3GFBvo.js} +1 -1
- package/server/{typed-errors-DzC4zXbI.js → typed-errors-DXqf3RnP.js} +1 -1
- package/server/{types-DjpLVpsj.js → types-PW4zkxCM.js} +1 -1
- package/server/{types-DbxY2QB6.js → types-pLpbsNto.js} +1 -1
- package/server/{uat-failure-feedback-BVqsWlrr.js → uat-failure-feedback-ly8ZwtfC.js} +5 -5
- package/server/{uat-promote-verification-DmG097QS.js → uat-promote-verification-BBaMwfdc.js} +5 -5
- package/server/{uat-train-DVUNW03P.js → uat-train-BBEiYSep.js} +0 -0
- package/server/{uat-train-COSy-vEX.js → uat-train-D7Ran2FB.js} +1 -1
- package/server/{validate-Dvv83iBx.js → validate-BYcBcBwg.js} +3 -3
- package/server/{validation-DlHafKzu.js → validation-BfG2jW5C.js} +9 -6
- package/server/{validation-BdCjzWLN.js → validation-nSrYiYvA.js} +1 -1
- package/server/{verification-artifact-CaSbxUVg.js → verification-artifact-Cmhgq4b_.js} +1 -1
- package/server/{verification-artifact-0Zku8N-W.js → verification-artifact-DglwaHke.js} +1 -1
- package/server/{verification-runner-DwP2fUEF.js → verification-runner-BEq5ZF-h.js} +53 -27
- package/server/{verification-runner-C6wdZda2.js → verification-runner-CFjAuv9u.js} +1 -1
- package/server/{vtt-parser-luerJpYT.js → vtt-parser-Va--tv27.js} +1 -1
- package/server/work-agent-prompt-BnhKNAg7.js +3 -0
- package/server/{work-agent-prompt--9AWNYwZ.js → work-agent-prompt-CaD2ue8m.js} +14 -14
- package/server/{work-agent-start-BNQO65W7.js → work-agent-start-0nJ-6UeA.js} +2 -2
- package/server/{work-agent-start-DkzseQFl.js → work-agent-start-D8NEN5KD.js} +1 -1
- package/server/workflows-BtHRlFIm.js +2 -0
- package/server/{workflows-BYwR2aIN.js → workflows-C7mxM1qc.js} +114 -41
- package/server/{workspace-iTnTycOB.js → workspace-BAhMgMaO.js} +3 -3
- package/server/{workspace-B-QJa3Ps.js → workspace-Dbqv9ehn.js} +1 -1
- package/server/{workspace-anchor-drift-CHiGg8iu.js → workspace-anchor-drift-B_3kyyxJ.js} +4 -4
- package/server/{workspace-anchor-drift-DTt6h2Em.js → workspace-anchor-drift-Bpa3xoni.js} +1 -1
- package/server/{workspace-config-D0CavVtz.js → workspace-config-D-bNq2CF.js} +1 -1
- package/server/{workspace-manager-5BKPV6SY.js → workspace-manager-BrbX90Rm.js} +1 -1
- package/server/{workspace-manager-W1OnbvU5.js → workspace-manager-CM8RCrSc.js} +17 -17
- package/server/{workspace-metadata-tbbevEmP.js → workspace-metadata-BEOwJSdK.js} +1 -1
- package/server/{workspace-metadata-dJhXvZGQ.js → workspace-metadata-Cu6yfxBS.js} +2 -2
- package/server/{workspaces-BlpbOPZ7.js → workspaces-C7LAuZfe.js} +140 -709
- package/sync-sources/dev-skills/pan-style-guide/SKILL.md +90 -15
- package/sync-sources/hooks/linear-mcp-auth-hook +6 -1
- package/sync-sources/rules/agent-message-delivery.md +21 -14
- package/sync-sources/rules/handoff-isolate-cwd.md +4 -4
- package/sync-sources/rules/pan-handoff-focus-limit.md +14 -5
- package/sync-sources/rules/ste-writing.md +17 -0
- package/sync-sources/rules/work-agents-via-pan.md +2 -1
- package/sync-sources/rules/writing-style.md +3 -2
- package/sync-sources/skills/{skill-creator → claude-skill-creator}/SKILL.md +1 -1
- package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/init_skill.py +1 -1
- package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/package_skill.py +1 -1
- package/sync-sources/skills/pan-gauntlet-loop/SKILL.md +230 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/PROMPT.template.md +92 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/REFERENCE-BAR.template.md +53 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/STYLE.template.md +41 -0
- package/sync-sources/skills/pan-gauntlet-loop/assets/gauntlet-index.html +237 -0
- package/sync-sources/skills/pan-gauntlet-loop/references/domains.md +106 -0
- package/sync-sources/skills/pan-handoff/SKILL.md +24 -6
- package/sync-sources/skills/pan-help/SKILL.md +1 -1
- package/sync-sources/skills/pan-peer-review/SKILL.md +3 -3
- package/sync-sources/skills/pan-restart/SKILL.md +6 -3
- package/sync-sources/skills/pan-start/SKILL.md +3 -0
- package/sync-sources/skills/pan-swarm/SKILL.md +32 -44
- package/sync-sources/skills/pan-sync/SKILL.md +1 -1
- package/server/activity-logger-BejO16Am.js +0 -3
- package/server/agent-state-DH_-Jkua.js +0 -3
- package/server/agents-megfmQHM.js +0 -3
- package/server/archive-planning-C-H9cM_J.js +0 -2
- package/server/build-info-PQlh_Rhb.js +0 -2
- package/server/cli-TaZspPHS.js +0 -2
- package/server/cliproxy-36ncAXlu.js +0 -3
- package/server/context-layers-CF6zHws4.js +0 -4
- package/server/conversations-AnGJ5rtX.js +0 -3
- package/server/deacon-BEH-IY0v.js +0 -5
- package/server/deacon-swarm-BHX-kR1b.js +0 -2
- package/server/deacon-swarm-BiLfNm_v.js +0 -1522
- package/server/dead-end-trip-BWpDg1Qd.js +0 -2
- package/server/delivery-cJM6zRjJ.js +0 -3
- package/server/deploy-queue-CmVBZEja.js +0 -2
- package/server/dist-VKBfkdi7.js +0 -3
- package/server/durable-review-pipeline-DgcVCYDL.js +0 -3
- package/server/factory-D4V2wd_V.js +0 -717
- package/server/forge-CrP1L3i6.js +0 -2
- package/server/hume-1ubD_6O7.js +0 -3
- package/server/inspect-agent-CfxERkNt.js +0 -2
- package/server/merge-ops-DtHx17Vd.js +0 -2
- package/server/merge-rebase-BvB4UuNS.js +0 -2
- package/server/project-repos-BJiShUsN.js +0 -3
- package/server/providers-CStNGwze.js +0 -3
- package/server/public/assets/index-BFEwfmqX.js +0 -860
- package/server/public/assets/index-_USwyTAT.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-Dsln95SK.js +0 -1
- package/server/pull-requests-C1Cqp2yo.js +0 -2
- package/server/rally-CjayjUIl.js +0 -3
- package/server/resume-D7JuMCRQ.js +0 -3
- package/server/review-agent-BUNTVJK2.js +0 -2
- package/server/settings-DBWB1gsG.js +0 -2
- package/server/specialists-D8gsOCwh.js +0 -3
- package/server/specs-BqkrRnU9.js +0 -3
- package/server/stuck-remediation-Di5JYkoo.js +0 -1164
- package/server/stuck-remediation-TNM1VhZb.js +0 -2
- package/server/supervisor-DX8VsPnb.js +0 -2
- package/server/tmux-CqNapnrr.js +0 -4
- package/server/token-util-Bu8bPF9f.js +0 -3
- package/server/workflows-Cf4LAnhg.js +0 -2
|
@@ -1,48 +1,48 @@
|
|
|
1
1
|
import { n as __esmMin, o as __toESM } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import { $t as findProjectByPathSync,
|
|
3
|
-
import { h as loadConfigSync$1, p as init_config } from "./config-
|
|
4
|
-
import {
|
|
5
|
-
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-
|
|
6
|
-
import { n as init_fs_lock, s as withRecordFsLock } from "./fs-lock-
|
|
7
|
-
import { i as init_record_update, n as clearRecordPipelineClosedOut } from "./record-update-
|
|
8
|
-
import { B as
|
|
9
|
-
import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-
|
|
10
|
-
import { a as init_event_store, i as initEventStore } from "./event-store-
|
|
11
|
-
import { o as OHMYPI_BEHAVIOR, s as getHarnessBehavior } from "./src-
|
|
12
|
-
import { a as readVerdictPreservationStatus, d as getOverdeckAgentStateSync, f as init_agent_state_sync, i as init_work_start_verdicts, l as resetWorkStartPipelineVerdicts, m as saveOverdeckAgentStateSync, o as refreshWorkStartReviewedAnchor, p as listOverdeckAgentStatesSync, r as registerPipelineTelemetryAgentReader, t as init_pipeline_agent_reader } from "./pipeline-agent-reader-
|
|
13
|
-
import { a as countAgentsByStatus, c as init_agents$2, g as logAgentLifecycleSync, h as init_persistent_logger } from "./agents-
|
|
14
|
-
import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { a as init_feature_registry_population, i as resetPostMergeState, n as init_post_merge_state, o as recordFeatureRegistryLifecycle } from "./post-merge-state-
|
|
20
|
-
import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-
|
|
21
|
-
import {
|
|
22
|
-
import { n as readActiveDashboardBundleSync, t as init_active_dashboard_bundle } from "./active-dashboard-bundle-
|
|
23
|
-
import { a as readCavemanVariant, n as init_workspace } from "./workspace-
|
|
24
|
-
import { C as generateLauncherScriptSync, D as normalizeModelOverrideSync, E as init_model_validation, O as requireModelOverrideSync, S as normalizeFlywheelRunId, _ as init_tmux_dedup, b as init_provenance, f as completeKeyedSubmit, i as init_auto_spawn_consent, k as shellQuoteModelIdSync, s as withAutoSpawnConsentClaim, w as init_launcher_generator, x as isOperatorStartedBy, y as sendKeysDedup } from "./auto-spawn-consent-
|
|
25
|
-
import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-
|
|
26
|
-
import {
|
|
27
|
-
import { a as extractThreadIdFromRollout, c as initCodexHome, l as init_codex, o as findLatestRollout } from "./codex-
|
|
28
|
-
import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import { n as
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
43
|
-
import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-
|
|
44
|
-
import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-
|
|
45
|
-
import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-
|
|
2
|
+
import { $t as findProjectByPathSync, Ai as encodeClaudeProjectDir, Br as OPENROUTER_MODEL_CONTEXT_WINDOWS, C as DEFAULT_TIERED_EXECUTION_CONFIG, Dr as init_roles, Dt as queueAutoCommit, E as init_tier_table, Et as pushPendingStateCommits, Gr as init_percent, Gt as shouldCommitLegacyWorkspaceArtifacts, Hi as packageRoot, Ht as init_state_read_home, Ir as resolveModelIdSync, Kn as extractPrefixSync, Lr as CLIPROXY_GPT56_CONTEXT_WINDOW, Nr as hasModelCapabilitySync, O as resolveTieredExecutionEnabled, On as resolveProjectFromIssueSync, Or as resolveModel, Ot as reconcileStatePlaneDrift, Pr as init_model_capabilities, Qr as FsError, Ri as getOverdeckHome, Rr as CLIPROXY_GPT56_LONG_CONTEXT_WINDOW, Tt as init_auto_commit, Ui as resolveOhmypiExtensionPath, Ur as fmix32, Vi as isDevMode, Wi as sessionFilePath, Wr as fnv1a32, Wt as resolveStateReadHomeSync, Xn as resolveBareNumericIdSync, Xr as ClaudeCredentialParseError, Y as init_record, _r as setupCredentialFileAuthSync, an as getProjectSwarmHotspots, at as writeAgentHarnessModelSync, br as init_openai_compatible_proxy, cr as clearCredentialFileAuthSync, d as isTldrEnabledSync, dr as getProviderEnvSync, er as require_dist, et as readIssueRecordForWorkspaceSync, fn as init_projects, fr as getProviderForModelSync, gr as resolveKimiCodeModelAlias, jr as getModelCapabilitySync, k as resolveTieredExecutionEnabledForIssue, ki as claudeSessionTranscriptExists, li as init_errors, lr as getBuiltInDefaultHarness, oi as TmuxError, on as getProjectSync, p as loadConfigSync, pr as init_providers, qn as init_issue_id, rn as getIssuePrefix, rt as resolveProjectForIssue, t as init_config_yaml, tt as readIssueRecordSync, u as isClaudeCodeChannelsMcpEnabled, ui as AGENTS_DIR, vr as ensureOpenAICompatibleProxyRunning, w as TIERED_EXECUTION_DIFFICULTIES, wt as flushAutoCommits, zi as init_paths, zr as GPT56_LONG_CONTEXT_VARIANTS } from "./config-yaml-D60AnTIu.js";
|
|
3
|
+
import { h as loadConfigSync$1, p as init_config } from "./config-NxI9Yl2f.js";
|
|
4
|
+
import { l as init_activity_logger, o as emitActivityEntrySync, s as emitActivityTtsSync } from "./activity-logger-SlTXYCVf.js";
|
|
5
|
+
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CJRi_5Wu.js";
|
|
6
|
+
import { n as init_fs_lock, s as withRecordFsLock } from "./fs-lock-DQ_gUxfq.js";
|
|
7
|
+
import { c as withStateGitLock, i as init_record_update, n as clearRecordPipelineClosedOut, s as init_state_git_lock } from "./record-update-BPqpBu3O.js";
|
|
8
|
+
import { $ as init_pane_choice_menu, B as sendKeys, C as init_tmux, D as killSessionSync, E as killSession, G as setOption, H as sendRawKeystroke, P as listSessionsSync, Q as buildChoiceKeystrokes, T as isPaneDead, U as sessionExists, W as sessionExistsSync, a as capturePaneText, c as createSessionSync, ct as BLANKED_PROVIDER_ENV, dt as init_child_env, et as paneChoiceMenuSignature, i as capturePaneSync, k as listPaneValues, nt as parsePaneChoiceMenu, p as exactPaneTarget, r as capturePane, s as createSession, v as getManagedTmuxSocketName, z as sendEscapeKeyAsync } from "./tmux-wnT_hg-s.js";
|
|
9
|
+
import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-C2QKOf09.js";
|
|
10
|
+
import { a as init_event_store, i as initEventStore } from "./event-store-DTns2XZP.js";
|
|
11
|
+
import { o as OHMYPI_BEHAVIOR, s as getHarnessBehavior } from "./src-CdwN6WY6.js";
|
|
12
|
+
import { a as readVerdictPreservationStatus, d as getOverdeckAgentStateSync, f as init_agent_state_sync, i as init_work_start_verdicts, l as resetWorkStartPipelineVerdicts, m as saveOverdeckAgentStateSync, o as refreshWorkStartReviewedAnchor, p as listOverdeckAgentStatesSync, r as registerPipelineTelemetryAgentReader, t as init_pipeline_agent_reader } from "./pipeline-agent-reader-CeWhQzXC.js";
|
|
13
|
+
import { a as countAgentsByStatus, c as init_agents$2, g as logAgentLifecycleSync, h as init_persistent_logger } from "./agents-DzpQidT8.js";
|
|
14
|
+
import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-ENa_hW_V.js";
|
|
15
|
+
import { a as getFlywheelActiveRunIdSync, c as init_control_settings, j as parseOhmypiSessionSync, k as init_ohmypi_parser } from "./control-settings-Db0uXgVM.js";
|
|
16
|
+
import { _ as init_tier_metrics, g as estimateFeedDeliveryTokens, v as recordTierFeedDelivery } from "./cost-sync-DfmvLT9L.js";
|
|
17
|
+
import { t as init_behavior } from "./behavior-DCg8CIWC.js";
|
|
18
|
+
import { b as init_cliproxy, c as bridgeGeminiAuthToCliproxy, h as getCliproxyClientEnv, l as decodeJwtPayload$1, p as getCliproxyAuthDir, s as bridgeCodexAuthToCliproxySync, v as getCliproxyLogPath } from "./cliproxy-DXDQcR3I.js";
|
|
19
|
+
import { a as init_feature_registry_population, i as resetPostMergeState, n as init_post_merge_state, o as recordFeatureRegistryLifecycle } from "./post-merge-state-DFaf7OI1.js";
|
|
20
|
+
import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-BeIWG_kT.js";
|
|
21
|
+
import { A as init_conversations, B as reactivateConversationForSpawn, C as getConversationByName, b as createConversation, z as normalizeHarness } from "./conversations-nS6QgYpD.js";
|
|
22
|
+
import { n as readActiveDashboardBundleSync, t as init_active_dashboard_bundle } from "./active-dashboard-bundle-CCqpFWiz.js";
|
|
23
|
+
import { a as readCavemanVariant, n as init_workspace } from "./workspace-BAhMgMaO.js";
|
|
24
|
+
import { C as generateLauncherScriptSync, D as normalizeModelOverrideSync, E as init_model_validation, O as requireModelOverrideSync, S as normalizeFlywheelRunId, _ as init_tmux_dedup, b as init_provenance, f as completeKeyedSubmit, i as init_auto_spawn_consent, k as shellQuoteModelIdSync, s as withAutoSpawnConsentClaim, w as init_launcher_generator, x as isOperatorStartedBy, y as sendKeysDedup } from "./auto-spawn-consent-BesWchEi.js";
|
|
25
|
+
import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-DLrb9ovz.js";
|
|
26
|
+
import { D as init_layers, F as resolveWorkspaceContextFile, L as workspaceContextFile, b as renderForHarness, d as renderProjectLayer, i as workspaceContextWithoutProjectLayer, l as init_render, r as init_assemble, u as renderGlobalLayer, y as init_harness } from "./assemble-B_JgnCbG.js";
|
|
27
|
+
import { a as extractThreadIdFromRollout, c as initCodexHome, l as init_codex, o as findLatestRollout } from "./codex-DYyZL8JD.js";
|
|
28
|
+
import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-DChiynaB.js";
|
|
29
|
+
import { n as createTrackerFromConfig, r as init_factory, t as createTracker } from "./factory-CWVKwKFE.js";
|
|
30
|
+
import { c as init_stack_health, o as getWorkspaceStackHealth } from "./stack-health-BKfNaqMm.js";
|
|
31
|
+
import { i as readReviewStatusMap, n as init_review_status_source, r as isRoleTerminal, s as resolveCanonicalReviewStatus } from "./review-status-source-Jq0BXmn3.js";
|
|
32
|
+
import { N as getProjectPanPaths, P as init_paths$1, h as readWorkspacePlanSync, s as init_io } from "./io-BCtZoXHo.js";
|
|
33
|
+
import { a as getDispatchableItems, c as init_dag, o as groupItemsByWave, r as createActiveSlice } from "./dag-o-dUpw1L.js";
|
|
34
|
+
import { c as generateFixedPointPromptSync, f as initHookSync, n as checkHookSync, p as init_hooks } from "./hooks-DJR1yR9w.js";
|
|
35
|
+
import { a as init_git_utils, l as renderWorkspaceGitShowPromise } from "./git-utils-BdHk8y7g.js";
|
|
36
|
+
import { n as init_workspace_anchor_drift, t as evaluateWorkspaceAnchorDrift } from "./workspace-anchor-drift-B_3kyyxJ.js";
|
|
37
|
+
import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-BplBEbwn.js";
|
|
38
|
+
import { a as loadCloisterConfigSync, r as init_config$1 } from "./config-_qaa1UXH.js";
|
|
39
|
+
import { t as init_reap_terminal_sessions } from "./reap-terminal-sessions-BaDSNR-k.js";
|
|
40
|
+
import { a as init_state_home, c as isStateMigrated } from "./state-home-DhsMqg8W.js";
|
|
41
|
+
import { n as provisionClaudeHooks, t as init_claude_hooks_provision } from "./claude-hooks-provision-fRofvhTN.js";
|
|
42
|
+
import { d as resolveWorkspaceRepoRootsSync, i as init_project_repos } from "./project-repos-CsfvLtmr.js";
|
|
43
|
+
import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-D7N0vQNj.js";
|
|
44
|
+
import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-tfAOWgng.js";
|
|
45
|
+
import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-LF8ZF_hc.js";
|
|
46
46
|
import { createRequire } from "node:module";
|
|
47
47
|
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
48
48
|
import { Data, Duration, Effect, FileSystem } from "effect";
|
|
@@ -65,307 +65,6 @@ import { fileURLToPath } from "node:url";
|
|
|
65
65
|
import { request } from "node:http";
|
|
66
66
|
import { ChildProcessSpawner as ChildProcessSpawner$1 } from "effect/unstable/process/ChildProcessSpawner";
|
|
67
67
|
import { layer } from "@effect/platform-node/NodeServices";
|
|
68
|
-
//#region ../../lib/cost-parsers/ohmypi-parser.ts
|
|
69
|
-
/**
|
|
70
|
-
* oh-my-pi (omp) JSONL parser (PAN-1989). Forked from pi-parser.ts (PAN-636).
|
|
71
|
-
*
|
|
72
|
-
* omp sessions live at:
|
|
73
|
-
* ~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<session-id>.jsonl
|
|
74
|
-
*
|
|
75
|
-
* Format (omp v3 — same as Pi v3):
|
|
76
|
-
* - First line: { type: "session", version: 3, id, timestamp, cwd }
|
|
77
|
-
* - Subsequent: every entry has an opaque `id` and a `parentId`. parentId
|
|
78
|
-
* is null for the first non-session entry.
|
|
79
|
-
* - The graph is a tree (omp supports forking/branching), not a list.
|
|
80
|
-
*
|
|
81
|
-
* To compute usage for the *active* branch we walk leaf -> root via parentId
|
|
82
|
-
* from the latest leaf (max timestamp among entries that have no children).
|
|
83
|
-
* omp assistant messages report per-call usage — input/output tokens are NOT
|
|
84
|
-
* cumulative across the conversation — so summing along the active branch is
|
|
85
|
-
* correct without subtracting pre-compaction input.
|
|
86
|
-
*
|
|
87
|
-
* SessionUsage shape comes from jsonl-parser.ts (the Claude Code parser); we
|
|
88
|
-
* map into it unchanged so all upstream consumers keep working.
|
|
89
|
-
*/
|
|
90
|
-
function isMessage(entry) {
|
|
91
|
-
return entry.type === "message";
|
|
92
|
-
}
|
|
93
|
-
function isAssistantMessage(entry) {
|
|
94
|
-
return isMessage(entry) && entry.message?.role === "assistant";
|
|
95
|
-
}
|
|
96
|
-
function pricingProviderFor(provider, model) {
|
|
97
|
-
const lowerProvider = provider?.toLowerCase() ?? "";
|
|
98
|
-
const lowerModel = model.toLowerCase();
|
|
99
|
-
if (lowerProvider === "openai" || lowerProvider === "openai-codex" || lowerModel.includes("gpt")) return "openai";
|
|
100
|
-
if (lowerProvider === "google" || lowerModel.includes("gemini")) return "google";
|
|
101
|
-
if (lowerProvider === "anthropic" || lowerModel.includes("claude")) return "anthropic";
|
|
102
|
-
if (lowerProvider === "kimi" || lowerProvider === "minimax" || lowerProvider === "zai" || lowerProvider === "zhipu" || lowerProvider === "custom" || lowerModel.includes("kimi") || lowerModel.includes("minimax") || lowerModel.includes("glm")) return "custom";
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
function computeCostFromPricing(provider, model, usage) {
|
|
106
|
-
const pricingProvider = pricingProviderFor(provider, model);
|
|
107
|
-
if (!pricingProvider) return {
|
|
108
|
-
cost: 0,
|
|
109
|
-
reason: "unknown-provider"
|
|
110
|
-
};
|
|
111
|
-
const pricing = getPricingSync(pricingProvider, model);
|
|
112
|
-
if (!pricing) return {
|
|
113
|
-
cost: 0,
|
|
114
|
-
reason: "unpriced-model"
|
|
115
|
-
};
|
|
116
|
-
return { cost: usage.inputTokens / 1e3 * pricing.inputPer1k + usage.outputTokens / 1e3 * pricing.outputPer1k + (usage.cacheReadTokens ?? 0) / 1e3 * (pricing.cacheReadPer1k ?? 0) + (usage.cacheWriteTokens ?? 0) / 1e3 * (pricing.cacheWrite5mPer1k ?? 0) };
|
|
117
|
-
}
|
|
118
|
-
function tsMs(timestamp) {
|
|
119
|
-
if (!timestamp) return 0;
|
|
120
|
-
const t = Date.parse(timestamp);
|
|
121
|
-
return Number.isFinite(t) ? t : 0;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Parse a Pi session JSONL file into a SessionUsage record.
|
|
125
|
-
*
|
|
126
|
-
* Returns null if the file does not exist, is empty, or is unparseable. Errors
|
|
127
|
-
* during line parsing are tolerated (the line is skipped); we never throw.
|
|
128
|
-
*/
|
|
129
|
-
function parseOhmypiSessionSync(filePath) {
|
|
130
|
-
if (!existsSync(filePath)) return null;
|
|
131
|
-
const result = parseOhmypiSessionContent(readFileSync(filePath, "utf8"), filePath);
|
|
132
|
-
return result.ok ? result.usage : null;
|
|
133
|
-
}
|
|
134
|
-
function parseOhmypiSessionCostResultSync(filePath) {
|
|
135
|
-
if (!existsSync(filePath)) return {
|
|
136
|
-
ok: false,
|
|
137
|
-
reason: "unreadable"
|
|
138
|
-
};
|
|
139
|
-
try {
|
|
140
|
-
return parseOhmypiSessionContent(readFileSync(filePath, "utf8"), filePath);
|
|
141
|
-
} catch {
|
|
142
|
-
return {
|
|
143
|
-
ok: false,
|
|
144
|
-
reason: "unreadable"
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Parse Pi session JSONL content. Exposed for tests and callers that already
|
|
150
|
-
* have the file content in memory.
|
|
151
|
-
*/
|
|
152
|
-
function parseOhmypiSessionContent(content, filePath = "<inline>") {
|
|
153
|
-
const lines = content.split("\n").filter((l) => l.trim().length > 0);
|
|
154
|
-
if (lines.length === 0) return {
|
|
155
|
-
ok: false,
|
|
156
|
-
reason: "empty"
|
|
157
|
-
};
|
|
158
|
-
let root = null;
|
|
159
|
-
const entriesById = /* @__PURE__ */ new Map();
|
|
160
|
-
const childrenOf = /* @__PURE__ */ new Map();
|
|
161
|
-
const unknownTypesSeen = /* @__PURE__ */ new Set();
|
|
162
|
-
for (const line of lines) {
|
|
163
|
-
let parsed;
|
|
164
|
-
try {
|
|
165
|
-
parsed = JSON.parse(line);
|
|
166
|
-
} catch {
|
|
167
|
-
continue;
|
|
168
|
-
}
|
|
169
|
-
if (!parsed || typeof parsed !== "object") continue;
|
|
170
|
-
const entry = parsed;
|
|
171
|
-
if (entry.type === "session") {
|
|
172
|
-
root = entry;
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
if (!entry.id) continue;
|
|
176
|
-
if (!KNOWN_TYPES.has(entry.type)) {
|
|
177
|
-
if (!unknownTypesSeen.has(entry.type)) {
|
|
178
|
-
unknownTypesSeen.add(entry.type);
|
|
179
|
-
console.debug(`[ohmypi-parser] unknown entry type "${entry.type}" in ${filePath} — ignoring`);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
entriesById.set(entry.id, entry);
|
|
183
|
-
const list = childrenOf.get(entry.parentId ?? null);
|
|
184
|
-
if (list) list.push(entry.id);
|
|
185
|
-
else childrenOf.set(entry.parentId ?? null, [entry.id]);
|
|
186
|
-
}
|
|
187
|
-
if (!root) return {
|
|
188
|
-
ok: false,
|
|
189
|
-
reason: "missing-session-root"
|
|
190
|
-
};
|
|
191
|
-
if (entriesById.size === 0) return {
|
|
192
|
-
ok: true,
|
|
193
|
-
usage: emptyUsage(filePath, root)
|
|
194
|
-
};
|
|
195
|
-
const leaves = [];
|
|
196
|
-
for (const entry of entriesById.values()) {
|
|
197
|
-
const kids = childrenOf.get(entry.id);
|
|
198
|
-
if (!kids || kids.length === 0) leaves.push(entry);
|
|
199
|
-
}
|
|
200
|
-
if (leaves.length === 0) leaves.push(...entriesById.values());
|
|
201
|
-
let latestLeaf = leaves[0];
|
|
202
|
-
for (const leaf of leaves) if (tsMs(leaf.timestamp) > tsMs(latestLeaf.timestamp)) latestLeaf = leaf;
|
|
203
|
-
const branch = [];
|
|
204
|
-
const visited = /* @__PURE__ */ new Set();
|
|
205
|
-
let cursor = latestLeaf;
|
|
206
|
-
while (cursor) {
|
|
207
|
-
if (visited.has(cursor.id)) break;
|
|
208
|
-
visited.add(cursor.id);
|
|
209
|
-
branch.push(cursor);
|
|
210
|
-
if (!cursor.parentId) break;
|
|
211
|
-
cursor = entriesById.get(cursor.parentId);
|
|
212
|
-
}
|
|
213
|
-
branch.reverse();
|
|
214
|
-
const totals = {
|
|
215
|
-
inputTokens: 0,
|
|
216
|
-
outputTokens: 0,
|
|
217
|
-
cacheReadTokens: 0,
|
|
218
|
-
cacheWriteTokens: 0
|
|
219
|
-
};
|
|
220
|
-
let costV2 = 0;
|
|
221
|
-
let messageCount = 0;
|
|
222
|
-
let costRecomputedFromTokens = 0;
|
|
223
|
-
const modelBreakdown = {};
|
|
224
|
-
const usageEvents = [];
|
|
225
|
-
const unpricedModels = [];
|
|
226
|
-
const modelsInOrder = [];
|
|
227
|
-
let compactionCount = 0;
|
|
228
|
-
let firstTs = null;
|
|
229
|
-
let lastTs = null;
|
|
230
|
-
for (const entry of branch) {
|
|
231
|
-
if (entry.type === "compaction_start" || entry.type === "session_compact") compactionCount += 1;
|
|
232
|
-
if (!firstTs && entry.timestamp) firstTs = entry.timestamp;
|
|
233
|
-
if (entry.timestamp) lastTs = entry.timestamp;
|
|
234
|
-
if (!isAssistantMessage(entry)) continue;
|
|
235
|
-
const usage = entry.message.usage;
|
|
236
|
-
if (!usage) continue;
|
|
237
|
-
const model = entry.message.model || "unknown";
|
|
238
|
-
const provider = typeof entry.message.provider === "string" ? entry.message.provider : null;
|
|
239
|
-
const input = usage.input ?? 0;
|
|
240
|
-
const output = usage.output ?? 0;
|
|
241
|
-
const cacheRead = usage.cacheRead ?? 0;
|
|
242
|
-
const cacheWrite = usage.cacheWrite ?? 0;
|
|
243
|
-
const tokenUsage = {
|
|
244
|
-
inputTokens: input,
|
|
245
|
-
outputTokens: output,
|
|
246
|
-
cacheReadTokens: cacheRead,
|
|
247
|
-
cacheWriteTokens: cacheWrite
|
|
248
|
-
};
|
|
249
|
-
const hasInlineCost = usage.cost?.total !== void 0;
|
|
250
|
-
let cost = usage.cost?.total ?? 0;
|
|
251
|
-
let warning;
|
|
252
|
-
if (!hasInlineCost && input + output + cacheRead + cacheWrite > 0) {
|
|
253
|
-
const computed = computeCostFromPricing(provider, model, tokenUsage);
|
|
254
|
-
cost = computed.cost;
|
|
255
|
-
if (computed.reason) {
|
|
256
|
-
unpricedModels.push({
|
|
257
|
-
provider,
|
|
258
|
-
model,
|
|
259
|
-
reason: computed.reason
|
|
260
|
-
});
|
|
261
|
-
warning = [{
|
|
262
|
-
type: "unpriced-model",
|
|
263
|
-
provider,
|
|
264
|
-
model,
|
|
265
|
-
reason: computed.reason
|
|
266
|
-
}];
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
const localComputed = hasInlineCost ? (usage.cost?.input ?? 0) + (usage.cost?.output ?? 0) + (usage.cost?.cacheRead ?? 0) + (usage.cost?.cacheWrite ?? 0) : cost;
|
|
270
|
-
totals.inputTokens += input;
|
|
271
|
-
totals.outputTokens += output;
|
|
272
|
-
totals.cacheReadTokens = (totals.cacheReadTokens ?? 0) + cacheRead;
|
|
273
|
-
totals.cacheWriteTokens = (totals.cacheWriteTokens ?? 0) + cacheWrite;
|
|
274
|
-
costV2 += cost;
|
|
275
|
-
costRecomputedFromTokens += localComputed;
|
|
276
|
-
messageCount += 1;
|
|
277
|
-
if (!modelBreakdown[model]) {
|
|
278
|
-
modelBreakdown[model] = {
|
|
279
|
-
cost: 0,
|
|
280
|
-
inputTokens: 0,
|
|
281
|
-
outputTokens: 0,
|
|
282
|
-
messageCount: 0,
|
|
283
|
-
cacheReadTokens: 0,
|
|
284
|
-
cacheWriteTokens: 0
|
|
285
|
-
};
|
|
286
|
-
modelsInOrder.push(model);
|
|
287
|
-
}
|
|
288
|
-
const slot = modelBreakdown[model];
|
|
289
|
-
slot.cost += cost;
|
|
290
|
-
slot.inputTokens += input;
|
|
291
|
-
slot.outputTokens += output;
|
|
292
|
-
slot.messageCount += 1;
|
|
293
|
-
slot.cacheReadTokens = (slot.cacheReadTokens ?? 0) + cacheRead;
|
|
294
|
-
slot.cacheWriteTokens = (slot.cacheWriteTokens ?? 0) + cacheWrite;
|
|
295
|
-
usageEvents.push({
|
|
296
|
-
requestId: `ohmypi:${root.id}:${entry.id}`,
|
|
297
|
-
timestamp: entry.timestamp || root.timestamp,
|
|
298
|
-
sessionId: root.id,
|
|
299
|
-
sessionFile: filePath,
|
|
300
|
-
provider,
|
|
301
|
-
model,
|
|
302
|
-
input,
|
|
303
|
-
output,
|
|
304
|
-
cacheRead,
|
|
305
|
-
cacheWrite,
|
|
306
|
-
cost,
|
|
307
|
-
...warning ? { warnings: warning } : {}
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
if (Math.abs(costV2 - costRecomputedFromTokens) > 1e-9) console.debug(`[ohmypi-parser] inline cost vs sum-of-line-items delta=${(costV2 - costRecomputedFromTokens).toFixed(6)} in ${filePath}`);
|
|
311
|
-
if (compactionCount > 0) console.debug(`[ohmypi-parser] active branch in ${filePath} has ${compactionCount} compaction event(s) — usage summed per-message (no double-count)`);
|
|
312
|
-
const display = modelsInOrder.length === 0 ? "unknown" : modelsInOrder.length === 1 ? modelsInOrder[0] : modelsInOrder.join(" → ");
|
|
313
|
-
return {
|
|
314
|
-
ok: true,
|
|
315
|
-
usage: {
|
|
316
|
-
sessionId: root.id,
|
|
317
|
-
sessionFile: filePath,
|
|
318
|
-
startTime: firstTs ?? root.timestamp,
|
|
319
|
-
endTime: lastTs ?? root.timestamp,
|
|
320
|
-
model: display,
|
|
321
|
-
usage: totals,
|
|
322
|
-
cost: costV2,
|
|
323
|
-
cost_v2: costV2,
|
|
324
|
-
messageCount,
|
|
325
|
-
modelBreakdown
|
|
326
|
-
},
|
|
327
|
-
usageEvents,
|
|
328
|
-
unpricedModels
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
function emptyUsage(filePath, root) {
|
|
332
|
-
return {
|
|
333
|
-
sessionId: root.id,
|
|
334
|
-
sessionFile: filePath,
|
|
335
|
-
startTime: root.timestamp,
|
|
336
|
-
endTime: root.timestamp,
|
|
337
|
-
model: "unknown",
|
|
338
|
-
usage: {
|
|
339
|
-
inputTokens: 0,
|
|
340
|
-
outputTokens: 0,
|
|
341
|
-
cacheReadTokens: 0,
|
|
342
|
-
cacheWriteTokens: 0
|
|
343
|
-
},
|
|
344
|
-
cost: 0,
|
|
345
|
-
cost_v2: 0,
|
|
346
|
-
messageCount: 0,
|
|
347
|
-
modelBreakdown: {}
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
var KNOWN_TYPES;
|
|
351
|
-
var init_ohmypi_parser = __esmMin((() => {
|
|
352
|
-
init_cost();
|
|
353
|
-
init_errors();
|
|
354
|
-
KNOWN_TYPES = new Set([
|
|
355
|
-
"session",
|
|
356
|
-
"message",
|
|
357
|
-
"model_change",
|
|
358
|
-
"thinking_level_change",
|
|
359
|
-
"compaction_start",
|
|
360
|
-
"compaction_end",
|
|
361
|
-
"session_before_compact",
|
|
362
|
-
"session_compact",
|
|
363
|
-
"session_before_switch",
|
|
364
|
-
"session_before_fork",
|
|
365
|
-
"session_start"
|
|
366
|
-
]);
|
|
367
|
-
}));
|
|
368
|
-
//#endregion
|
|
369
68
|
//#region ../../lib/agent-runtime-mirror.ts
|
|
370
69
|
/**
|
|
371
70
|
* PAN-800 — in-process mirror of AgentStateService's canonical ref.
|
|
@@ -545,6 +244,133 @@ function writeAgentPlaneRecordAtomicSync(path, record) {
|
|
|
545
244
|
}
|
|
546
245
|
parseAgentPlaneRecord(readFileSync$1(path, "utf-8"), path);
|
|
547
246
|
}
|
|
247
|
+
function gitFailureMessage(error) {
|
|
248
|
+
if (error && typeof error === "object") {
|
|
249
|
+
const failure = error;
|
|
250
|
+
return failure.stderr?.trim() || failure.stdout?.trim() || failure.message;
|
|
251
|
+
}
|
|
252
|
+
return String(error);
|
|
253
|
+
}
|
|
254
|
+
function isRemoteRefRaceError(message) {
|
|
255
|
+
return /non-fast-forward|fetch first|stale info|cannot lock ref.*expected|failed to update ref|failed to push some refs/i.test(message);
|
|
256
|
+
}
|
|
257
|
+
async function git(root, args) {
|
|
258
|
+
return (await execFileAsync$6("git", args, {
|
|
259
|
+
cwd: root,
|
|
260
|
+
encoding: "utf8",
|
|
261
|
+
timeout: 3e4,
|
|
262
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
263
|
+
env: {
|
|
264
|
+
...process.env,
|
|
265
|
+
HUSKY: "0"
|
|
266
|
+
}
|
|
267
|
+
})).stdout.trim();
|
|
268
|
+
}
|
|
269
|
+
function appendMissing(remote, local) {
|
|
270
|
+
const known = new Set(remote.map((entry) => JSON.stringify(entry)));
|
|
271
|
+
return [...remote, ...local.filter((entry) => !known.has(JSON.stringify(entry)))];
|
|
272
|
+
}
|
|
273
|
+
function mergeAgentPlaneRecords(remote, local) {
|
|
274
|
+
if (!remote) return local;
|
|
275
|
+
if (remote.agentId !== local.agentId || remote.issueId !== local.issueId || remote.projectKey !== local.projectKey || remote.origin.machineId !== local.origin.machineId) throw new Error(`Refusing to reconcile incompatible durable agent record ${local.agentId}`);
|
|
276
|
+
return {
|
|
277
|
+
...remote,
|
|
278
|
+
sessions: appendMissing(remote.sessions, local.sessions),
|
|
279
|
+
lifecycle: appendMissing(remote.lifecycle, local.lifecycle),
|
|
280
|
+
archiveRef: local.archiveRef ?? remote.archiveRef,
|
|
281
|
+
recovered: remote.recovered || local.recovered
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
async function abortAgentPlaneMerge(root) {
|
|
285
|
+
await git(root, ["merge", "--abort"]).catch(() => void 0);
|
|
286
|
+
}
|
|
287
|
+
async function reconcileAgentPlanePush(context, desired) {
|
|
288
|
+
const relativePath = relative(context.root, context.path).replace(/\\/g, "/");
|
|
289
|
+
try {
|
|
290
|
+
for (let attempt = 0; attempt < MAX_AGENT_PUSH_RECONCILIATIONS; attempt += 1) {
|
|
291
|
+
if (await git(context.root, ["status", "--porcelain"])) return {
|
|
292
|
+
committed: true,
|
|
293
|
+
pushed: false,
|
|
294
|
+
reason: "agent-plane reconciliation blocked by dirty state worktree"
|
|
295
|
+
};
|
|
296
|
+
await git(context.root, [
|
|
297
|
+
"fetch",
|
|
298
|
+
"origin",
|
|
299
|
+
"overdeck-state"
|
|
300
|
+
]);
|
|
301
|
+
try {
|
|
302
|
+
await git(context.root, [
|
|
303
|
+
"merge",
|
|
304
|
+
"--no-edit",
|
|
305
|
+
"origin/overdeck-state"
|
|
306
|
+
]);
|
|
307
|
+
} catch (mergeError) {
|
|
308
|
+
const conflicts = (await git(context.root, [
|
|
309
|
+
"diff",
|
|
310
|
+
"--name-only",
|
|
311
|
+
"--diff-filter=U"
|
|
312
|
+
])).split("\n").map((path) => path.trim()).filter(Boolean);
|
|
313
|
+
if (conflicts.length !== 1 || conflicts[0] !== relativePath) {
|
|
314
|
+
await abortAgentPlaneMerge(context.root);
|
|
315
|
+
return {
|
|
316
|
+
committed: true,
|
|
317
|
+
pushed: false,
|
|
318
|
+
reason: `agent-plane reconciliation conflicted outside ${relativePath}: ${conflicts.join(", ") || gitFailureMessage(mergeError)}`
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
await git(context.root, [
|
|
322
|
+
"checkout",
|
|
323
|
+
"--theirs",
|
|
324
|
+
"--",
|
|
325
|
+
relativePath
|
|
326
|
+
]);
|
|
327
|
+
const remote = readAgentPlaneRecordAtPath(context.path);
|
|
328
|
+
writeAgentPlaneRecordAtomicSync(context.path, mergeAgentPlaneRecords(remote, desired));
|
|
329
|
+
await git(context.root, [
|
|
330
|
+
"add",
|
|
331
|
+
"--",
|
|
332
|
+
relativePath
|
|
333
|
+
]);
|
|
334
|
+
await git(context.root, [
|
|
335
|
+
"-c",
|
|
336
|
+
"core.editor=true",
|
|
337
|
+
"commit",
|
|
338
|
+
"--no-edit"
|
|
339
|
+
]);
|
|
340
|
+
}
|
|
341
|
+
try {
|
|
342
|
+
await git(context.root, [
|
|
343
|
+
"push",
|
|
344
|
+
"origin",
|
|
345
|
+
"overdeck-state"
|
|
346
|
+
]);
|
|
347
|
+
return {
|
|
348
|
+
committed: true,
|
|
349
|
+
pushed: true
|
|
350
|
+
};
|
|
351
|
+
} catch (pushError) {
|
|
352
|
+
const message = gitFailureMessage(pushError);
|
|
353
|
+
if (!isRemoteRefRaceError(message)) return {
|
|
354
|
+
committed: true,
|
|
355
|
+
pushed: false,
|
|
356
|
+
reason: `agent-plane reconciled push failed: ${message}`
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return {
|
|
361
|
+
committed: true,
|
|
362
|
+
pushed: false,
|
|
363
|
+
reason: `agent-plane push lost ${MAX_AGENT_PUSH_RECONCILIATIONS} consecutive remote ref races`
|
|
364
|
+
};
|
|
365
|
+
} catch (error) {
|
|
366
|
+
await abortAgentPlaneMerge(context.root);
|
|
367
|
+
return {
|
|
368
|
+
committed: true,
|
|
369
|
+
pushed: false,
|
|
370
|
+
reason: `agent-plane reconciliation failed: ${gitFailureMessage(error)}`
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
}
|
|
548
374
|
function makeAgentPlaneRecord(state, projectKey) {
|
|
549
375
|
return {
|
|
550
376
|
version: 1,
|
|
@@ -648,38 +474,50 @@ function appendAgentPlaneSession(state, entry) {
|
|
|
648
474
|
};
|
|
649
475
|
});
|
|
650
476
|
}
|
|
651
|
-
function appendAgentPlaneLifecycle(state, entry) {
|
|
477
|
+
function appendAgentPlaneLifecycle(state, entry, options = {}) {
|
|
652
478
|
return updateAgentPlaneRecord(state, `${entry.event} lifecycle append`, (current) => ({
|
|
653
479
|
...current,
|
|
654
480
|
lifecycle: [...current.lifecycle, entry]
|
|
655
|
-
}));
|
|
481
|
+
}), options.deferCommit);
|
|
656
482
|
}
|
|
657
483
|
async function flushAgentPlaneWrites(issueId, agentId) {
|
|
658
484
|
const context = resolveAgentPlaneContext(issueId, agentId, "flush");
|
|
659
485
|
if (!context || !existsSync$1(context.root)) return null;
|
|
660
|
-
const
|
|
661
|
-
if (
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
committed
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
committed
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
486
|
+
const desired = readAgentPlaneRecordAtPath(context.path);
|
|
487
|
+
if (!desired) return null;
|
|
488
|
+
return withStateGitLock(context.root, `agent-plane-flush:${safeAgentId(agentId)}`, context.path, async () => {
|
|
489
|
+
const flushed = await Effect.runPromise(flushAutoCommits(context.project.path));
|
|
490
|
+
if (flushed.errored) return flushed;
|
|
491
|
+
if (flushed.committed && flushed.pushed !== true) {
|
|
492
|
+
if (!isRemoteRefRaceError(flushed.reason ?? "")) return flushed;
|
|
493
|
+
return reconcileAgentPlanePush(context, desired);
|
|
494
|
+
}
|
|
495
|
+
const reconciled = await Effect.runPromise(reconcileStatePlaneDrift(context.project.path));
|
|
496
|
+
if (reconciled.errored || reconciled.committed && reconciled.pushed !== true) return reconciled;
|
|
497
|
+
if (flushed.committed || reconciled.committed) return {
|
|
498
|
+
committed: true,
|
|
499
|
+
pushed: true
|
|
500
|
+
};
|
|
501
|
+
const push = await Effect.runPromise(pushPendingStateCommits(context.project.path));
|
|
502
|
+
if (push?.pushed === false && isRemoteRefRaceError(push.reason ?? "")) return reconcileAgentPlanePush(context, desired);
|
|
503
|
+
return {
|
|
504
|
+
committed: false,
|
|
505
|
+
pushed: push?.pushed,
|
|
506
|
+
reason: push?.reason ?? reconciled.reason ?? flushed.reason
|
|
507
|
+
};
|
|
508
|
+
});
|
|
674
509
|
}
|
|
675
|
-
var AGENT_PLANE_DIRNAME, AgentPlaneOwnershipError;
|
|
510
|
+
var AGENT_PLANE_DIRNAME, execFileAsync$6, MAX_AGENT_PUSH_RECONCILIATIONS, AgentPlaneOwnershipError;
|
|
676
511
|
var init_agents$1 = __esmMin((() => {
|
|
677
512
|
init_paths();
|
|
678
513
|
init_projects();
|
|
679
514
|
init_state_read_home();
|
|
680
515
|
init_auto_commit();
|
|
681
516
|
init_fs_lock();
|
|
517
|
+
init_state_git_lock();
|
|
682
518
|
AGENT_PLANE_DIRNAME = "agents";
|
|
519
|
+
execFileAsync$6 = promisify(execFile);
|
|
520
|
+
MAX_AGENT_PUSH_RECONCILIATIONS = 3;
|
|
683
521
|
AgentPlaneOwnershipError = class extends Error {
|
|
684
522
|
constructor(agentId, ownerMachine, writerMachine) {
|
|
685
523
|
super(`Refusing to write durable agent ${agentId}: origin machine is ${ownerMachine}, current machine is ${writerMachine}.`);
|
|
@@ -1605,8 +1443,17 @@ async function getProviderEnvForModel(model, harness) {
|
|
|
1605
1443
|
throw new Error(`No API key configured for ${provider.displayName}. Configure it in Settings before using model "${model}".`);
|
|
1606
1444
|
}
|
|
1607
1445
|
function getClaudeCodeContextPolicyForModel(model) {
|
|
1608
|
-
|
|
1446
|
+
const provider = getProviderForModelSync(model);
|
|
1447
|
+
if (provider.name === "anthropic") return {};
|
|
1609
1448
|
const resolvedModel = resolveModelIdSync(model);
|
|
1449
|
+
if (provider.name === "openrouter") {
|
|
1450
|
+
const openrouterWindow = OPENROUTER_MODEL_CONTEXT_WINDOWS[resolvedModel];
|
|
1451
|
+
if (openrouterWindow !== void 0) return {
|
|
1452
|
+
autoCompactWindow: openrouterWindow,
|
|
1453
|
+
maxContextTokens: openrouterWindow
|
|
1454
|
+
};
|
|
1455
|
+
return {};
|
|
1456
|
+
}
|
|
1610
1457
|
if (GPT_56_LONG_MODELS.has(resolvedModel)) return {
|
|
1611
1458
|
autoCompactWindow: CLIPROXY_GPT56_LONG_CONTEXT_WINDOW,
|
|
1612
1459
|
maxContextTokens: CLIPROXY_GPT56_LONG_CONTEXT_WINDOW
|
|
@@ -2049,12 +1896,12 @@ async function claudeSystemPromptFiles(workspace, harness) {
|
|
|
2049
1896
|
}
|
|
2050
1897
|
files.push(await ensureSessionContextBriefingFile());
|
|
2051
1898
|
if (behavior.contextLayerKind === "pi") {
|
|
2052
|
-
const { piGlobalContextFile } = await import("./context-layers-
|
|
1899
|
+
const { piGlobalContextFile } = await import("./context-layers-Ds1MnEFI.js");
|
|
2053
1900
|
const globalFile = piGlobalContextFile();
|
|
2054
1901
|
if (existsSync(globalFile)) files.unshift(globalFile);
|
|
2055
1902
|
}
|
|
2056
1903
|
if (behavior.contextLayerKind === "codex") {
|
|
2057
|
-
const { codexGlobalContextFile } = await import("./context-layers-
|
|
1904
|
+
const { codexGlobalContextFile } = await import("./context-layers-Ds1MnEFI.js");
|
|
2058
1905
|
const globalFile = codexGlobalContextFile();
|
|
2059
1906
|
if (existsSync(globalFile)) files.unshift(globalFile);
|
|
2060
1907
|
}
|
|
@@ -2383,7 +2230,7 @@ async function injectPiPromptTimeMemory(agentId, prompt) {
|
|
|
2383
2230
|
agentRole: agentState.role ?? "work",
|
|
2384
2231
|
agentHarness: agentState.harness ?? "claude-code"
|
|
2385
2232
|
};
|
|
2386
|
-
const { injectPromptTimeMemory } = await import("./injection-
|
|
2233
|
+
const { injectPromptTimeMemory } = await import("./injection-BWsgHvrL.js");
|
|
2387
2234
|
const result = await injectPromptTimeMemory({
|
|
2388
2235
|
prompt,
|
|
2389
2236
|
identity,
|
|
@@ -2417,7 +2264,7 @@ async function injectPiConversationMemory(opts, prompt) {
|
|
|
2417
2264
|
agentRole: "work",
|
|
2418
2265
|
agentHarness: "ohmypi"
|
|
2419
2266
|
};
|
|
2420
|
-
const { injectPromptTimeMemory } = await import("./injection-
|
|
2267
|
+
const { injectPromptTimeMemory } = await import("./injection-BWsgHvrL.js");
|
|
2421
2268
|
const result = await injectPromptTimeMemory({
|
|
2422
2269
|
prompt,
|
|
2423
2270
|
identity,
|
|
@@ -2828,7 +2675,7 @@ function resolveRegisteredSlotSpawn(issueId, baseWorkspace, options) {
|
|
|
2828
2675
|
const issueLower = issueId.toLowerCase();
|
|
2829
2676
|
return {
|
|
2830
2677
|
agentId: `agent-${issueLower}-slot-${slotIndex}`,
|
|
2831
|
-
branch: `feature/${issueLower}-slot-${slotIndex}`,
|
|
2678
|
+
branch: options.slotBranch ?? `feature/${issueLower}-slot-${slotIndex}`,
|
|
2832
2679
|
workspace: `${baseWorkspace}-slot-${slotIndex}`,
|
|
2833
2680
|
slotIndex,
|
|
2834
2681
|
slotItemId
|
|
@@ -2983,7 +2830,7 @@ async function transitionIssueToInReview(issueId, workspacePath) {
|
|
|
2983
2830
|
async function buildAgentLaunchConfig(opts) {
|
|
2984
2831
|
const model = requireModelOverrideSync(opts.model);
|
|
2985
2832
|
try {
|
|
2986
|
-
const { injectOverdeckInfraDeny } = await import("./claude-settings-overlay-
|
|
2833
|
+
const { injectOverdeckInfraDeny } = await import("./claude-settings-overlay-CMS5Jab5.js");
|
|
2987
2834
|
await Effect.runPromise(injectOverdeckInfraDeny(opts.workspace));
|
|
2988
2835
|
} catch (err) {
|
|
2989
2836
|
console.warn(`[agents] injectOverdeckInfraDeny failed for ${opts.agentId} (non-fatal): ${err instanceof Error ? err.message : err}`);
|
|
@@ -3076,7 +2923,7 @@ async function retrieveSpawnTimeMemoryContext(input) {
|
|
|
3076
2923
|
agentRole: input.role,
|
|
3077
2924
|
agentHarness: input.harness
|
|
3078
2925
|
};
|
|
3079
|
-
const { injectPromptTimeMemory } = await import("./injection-
|
|
2926
|
+
const { injectPromptTimeMemory } = await import("./injection-BWsgHvrL.js");
|
|
3080
2927
|
return (await injectPromptTimeMemory({
|
|
3081
2928
|
prompt: input.prompt,
|
|
3082
2929
|
identity,
|
|
@@ -3176,7 +3023,7 @@ async function assertWorkspaceStackHealthyForSpawn(issueId, role, allowHost = fa
|
|
|
3176
3023
|
record.attempts += 1;
|
|
3177
3024
|
spawnStackRebuildState.set(normalizedIssue, record);
|
|
3178
3025
|
console.log(`[agents] Workspace stack for ${normalizedIssue} unhealthy (${details}) — rebuilding before spawn (attempt ${record.attempts}/${SPAWN_STACK_REBUILD_MAX_ATTEMPTS})`);
|
|
3179
|
-
const { rebuildWorkspaceStack } = await import("./rebuild-stack-
|
|
3026
|
+
const { rebuildWorkspaceStack } = await import("./rebuild-stack-BcBVFJp3.js");
|
|
3180
3027
|
const result = await Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[agents] ${normalizedIssue} stack rebuild: ${m}`) })).catch((err) => ({
|
|
3181
3028
|
success: false,
|
|
3182
3029
|
error: err instanceof Error ? err.message : String(err)
|
|
@@ -4615,9 +4462,12 @@ function isTerminalSwarmSlotAgent(agent, readPlan = readWorkspacePlanSync, readR
|
|
|
4615
4462
|
const slotIndex = agent.slotIndex ?? (idMatch ? Number(idMatch[1]) : void 0);
|
|
4616
4463
|
if (!slotIndex) return false;
|
|
4617
4464
|
const baseWorkspace = agent.workspace.replace(/-slot-\d+$/, "");
|
|
4618
|
-
const
|
|
4465
|
+
const record = readRecord(baseWorkspace, agent.issueId);
|
|
4466
|
+
const assignment = record?.swarm?.slotAssignments?.find((candidate) => candidate.slotIndex === slotIndex);
|
|
4619
4467
|
const itemId = agent.slotItemId ?? assignment?.itemId;
|
|
4620
4468
|
if (!itemId) return false;
|
|
4469
|
+
const canonicalStatus = record?.statusOverrides?.[itemId];
|
|
4470
|
+
if (canonicalStatus === "completed" || canonicalStatus === "cancelled") return true;
|
|
4621
4471
|
const item = (readPlan(baseWorkspace) ?? readPlan(agent.workspace))?.plan.items.find((candidate) => candidate.id === itemId);
|
|
4622
4472
|
return item?.status === "completed" || item?.status === "cancelled";
|
|
4623
4473
|
}
|
|
@@ -5548,7 +5398,7 @@ var init_runtime_census = __esmMin((() => {
|
|
|
5548
5398
|
]);
|
|
5549
5399
|
runtimeCensusService = createRuntimeCensusService({
|
|
5550
5400
|
listPanes: async () => {
|
|
5551
|
-
const { listAllPaneRecords } = await import("./tmux-
|
|
5401
|
+
const { listAllPaneRecords } = await import("./tmux-CYucGrTl.js");
|
|
5552
5402
|
return Effect.runPromise(listAllPaneRecords());
|
|
5553
5403
|
},
|
|
5554
5404
|
readProcesses: readRuntimeProcessTable
|
|
@@ -6150,13 +6000,48 @@ function buildRegisteredSlotPrompt(issueId, baseWorkspace, slot, extraPrompt) {
|
|
|
6150
6000
|
if (trimmedExtra) lines.push("", "## Additional Foreman Instructions", trimmedExtra);
|
|
6151
6001
|
return lines.join("\n");
|
|
6152
6002
|
}
|
|
6153
|
-
async function ensureRegisteredSlotWorktree(baseWorkspace, slot) {
|
|
6154
|
-
|
|
6003
|
+
async function ensureRegisteredSlotWorktree(issueId, baseWorkspace, slot) {
|
|
6004
|
+
const repoRoots = resolveWorkspaceRepoRootsSync(issueId, baseWorkspace);
|
|
6005
|
+
const polyrepoRoots = repoRoots.filter((root) => root.isPolyrepo);
|
|
6006
|
+
if (polyrepoRoots.length > 0) {
|
|
6007
|
+
const expected = polyrepoRoots.map((root) => ({
|
|
6008
|
+
...root,
|
|
6009
|
+
target: `${slot.workspace}/${root.dir.slice(baseWorkspace.length + 1).split("/")[0]}`
|
|
6010
|
+
}));
|
|
6011
|
+
if (existsSync$1(slot.workspace)) {
|
|
6012
|
+
if (expected.filter((root) => !existsSync$1(`${root.target}/.git`)).length === 0) {
|
|
6013
|
+
if ((await Promise.all(expected.map(async (root) => {
|
|
6014
|
+
try {
|
|
6015
|
+
return (await execAsync$4("git branch --show-current", { cwd: root.target })).stdout.trim();
|
|
6016
|
+
} catch {
|
|
6017
|
+
return "";
|
|
6018
|
+
}
|
|
6019
|
+
}))).every((branch) => branch === slot.branch)) return;
|
|
6020
|
+
}
|
|
6021
|
+
throw new Error(`Registered polyrepo slot workspace is incomplete at ${slot.workspace}; run pan swarm reset before dispatching it.`);
|
|
6022
|
+
}
|
|
6023
|
+
await mkdir(slot.workspace, { recursive: true });
|
|
6024
|
+
try {
|
|
6025
|
+
for (const root of expected) await execAsync$4(await gitBranchExists(root.dir, slot.branch) ? `git worktree add ${JSON.stringify(root.target)} ${JSON.stringify(slot.branch)}` : `git worktree add -b ${JSON.stringify(slot.branch)} ${JSON.stringify(root.target)} ${JSON.stringify(root.sourceBranch)}`, { cwd: root.dir });
|
|
6026
|
+
} catch (error) {
|
|
6027
|
+
throw new Error(`Could not create isolated polyrepo slot workspace ${slot.workspace}: ${error instanceof Error ? error.message : String(error)}`);
|
|
6028
|
+
}
|
|
6029
|
+
return;
|
|
6030
|
+
}
|
|
6031
|
+
if (existsSync$1(slot.workspace)) {
|
|
6032
|
+
let branch = "";
|
|
6033
|
+
try {
|
|
6034
|
+
branch = (await execAsync$4("git branch --show-current", { cwd: slot.workspace })).stdout.trim();
|
|
6035
|
+
} catch {}
|
|
6036
|
+
if (branch === slot.branch) return;
|
|
6037
|
+
throw new Error(`Registered slot workspace is incomplete at ${slot.workspace}; run pan swarm reset before dispatching it.`);
|
|
6038
|
+
}
|
|
6155
6039
|
await mkdir(dirname(slot.workspace), { recursive: true });
|
|
6156
6040
|
const branchExists = await gitBranchExists(baseWorkspace, slot.branch);
|
|
6041
|
+
if (branchExists && !await gitRefsEqual(baseWorkspace, slot.branch, repoRoots[0].sourceBranch)) throw new Error(`Registered slot branch ${slot.branch} is not at ${repoRoots[0].sourceBranch}; refusing to reuse stale work.`);
|
|
6157
6042
|
const target = JSON.stringify(slot.workspace);
|
|
6158
6043
|
const branch = JSON.stringify(slot.branch);
|
|
6159
|
-
await execAsync$4(branchExists ? `git worktree add ${target} ${branch}` : `git worktree add -b ${branch} ${target}
|
|
6044
|
+
await execAsync$4(branchExists ? `git worktree add ${target} ${branch}` : `git worktree add -b ${branch} ${target} ${JSON.stringify(repoRoots[0].sourceBranch)}`, { cwd: baseWorkspace });
|
|
6160
6045
|
}
|
|
6161
6046
|
async function gitBranchExists(workspace, branch) {
|
|
6162
6047
|
try {
|
|
@@ -6166,10 +6051,19 @@ async function gitBranchExists(workspace, branch) {
|
|
|
6166
6051
|
return false;
|
|
6167
6052
|
}
|
|
6168
6053
|
}
|
|
6054
|
+
async function gitRefsEqual(workspace, left, right) {
|
|
6055
|
+
try {
|
|
6056
|
+
const [leftResult, rightResult] = await Promise.all([execAsync$4(`git rev-parse ${JSON.stringify(left)}`, { cwd: workspace }), execAsync$4(`git rev-parse ${JSON.stringify(right)}`, { cwd: workspace })]);
|
|
6057
|
+
return leftResult.stdout.trim() === rightResult.stdout.trim();
|
|
6058
|
+
} catch {
|
|
6059
|
+
return false;
|
|
6060
|
+
}
|
|
6061
|
+
}
|
|
6169
6062
|
var execAsync$4;
|
|
6170
6063
|
var init_registered_slot_spawn = __esmMin((() => {
|
|
6171
6064
|
init_dag();
|
|
6172
6065
|
init_io();
|
|
6066
|
+
init_project_repos();
|
|
6173
6067
|
execAsync$4 = promisify(exec);
|
|
6174
6068
|
}));
|
|
6175
6069
|
//#endregion
|
|
@@ -6208,7 +6102,7 @@ async function spawnRunWithoutConsentClaim(issueId, role, options, acceptConsent
|
|
|
6208
6102
|
});
|
|
6209
6103
|
slotHarness = tierParams.harness ?? options.harness;
|
|
6210
6104
|
}
|
|
6211
|
-
await ensureRegisteredSlotWorktree(workspace, slot);
|
|
6105
|
+
await ensureRegisteredSlotWorktree(issueId, workspace, slot);
|
|
6212
6106
|
}
|
|
6213
6107
|
const prompt = slot ? buildRegisteredSlotPrompt(issueId, workspace, slot, options.prompt) : options.prompt;
|
|
6214
6108
|
return spawnAgentWithoutConsentClaim({
|
|
@@ -6225,7 +6119,8 @@ async function spawnRunWithoutConsentClaim(issueId, role, options, acceptConsent
|
|
|
6225
6119
|
autoSpawnConsentRequired: options.autoSpawnConsentRequired,
|
|
6226
6120
|
effort: options.effort,
|
|
6227
6121
|
slotIndex: slot?.slotIndex,
|
|
6228
|
-
slotItemId: slot?.slotItemId
|
|
6122
|
+
slotItemId: slot?.slotItemId,
|
|
6123
|
+
foreman: options.foreman
|
|
6229
6124
|
}, acceptConsent);
|
|
6230
6125
|
}
|
|
6231
6126
|
const flywheelEnv = resolveFlywheelSpawnEnv(role, options.flywheelRunId);
|
|
@@ -6235,7 +6130,7 @@ async function spawnRunWithoutConsentClaim(issueId, role, options, acceptConsent
|
|
|
6235
6130
|
let reapWarmIdle = false;
|
|
6236
6131
|
const advancing = role === "review" || role === "test" || role === "ship";
|
|
6237
6132
|
try {
|
|
6238
|
-
const { isPaneDead } = await import("./tmux-
|
|
6133
|
+
const { isPaneDead } = await import("./tmux-CYucGrTl.js");
|
|
6239
6134
|
if (await Effect.runPromise(isPaneDead(agentId))) reapWarmIdle = true;
|
|
6240
6135
|
else if (advancing) {
|
|
6241
6136
|
const { status } = resolveCanonicalReviewStatus(issueId);
|
|
@@ -6244,7 +6139,7 @@ async function spawnRunWithoutConsentClaim(issueId, role, options, acceptConsent
|
|
|
6244
6139
|
} catch {}
|
|
6245
6140
|
if (!reapWarmIdle) throw new Error(`Role run ${agentId} already running. Use 'pan tell' to message it.`);
|
|
6246
6141
|
console.log(`[spawn] ${agentId} is warm-idle from the previous cycle — reaping it for the new ${role} dispatch (PAN-2579)`);
|
|
6247
|
-
const { killSession } = await import("./tmux-
|
|
6142
|
+
const { killSession } = await import("./tmux-CYucGrTl.js");
|
|
6248
6143
|
await Effect.runPromise(killSession(agentId)).catch(() => {});
|
|
6249
6144
|
}
|
|
6250
6145
|
await prepareWorkspaceForAgentSpawn(issueId, role, options.allowHost, workspace);
|
|
@@ -6259,7 +6154,7 @@ async function spawnRunWithoutConsentClaim(issueId, role, options, acceptConsent
|
|
|
6259
6154
|
assertCodexNativeAuthForSpawn(resolvedHarness, listAgentStates());
|
|
6260
6155
|
await ensureLifecycleHooksBeforeLaunch(agentId, resolvedHarness);
|
|
6261
6156
|
if (getProviderForModelSync(selectedModel).name === "openai" && await getProviderAuthMode(selectedModel) === "subscription") {
|
|
6262
|
-
const { isCliproxyRunning } = await import("./cliproxy-
|
|
6157
|
+
const { isCliproxyRunning } = await import("./cliproxy-DdhFpcXU.js");
|
|
6263
6158
|
if (!await Effect.runPromise(isCliproxyRunning())) throw new Error("CLIProxyAPI sidecar is not running. GPT subscription role runs route through a local cliproxy process managed by `pan up`. Run `pan up` (or restart the dashboard) before spawning a GPT role run.");
|
|
6264
6159
|
}
|
|
6265
6160
|
const state = {
|
|
@@ -6268,6 +6163,7 @@ async function spawnRunWithoutConsentClaim(issueId, role, options, acceptConsent
|
|
|
6268
6163
|
workspace,
|
|
6269
6164
|
harness: resolvedHarness,
|
|
6270
6165
|
role,
|
|
6166
|
+
foreman: options.foreman || void 0,
|
|
6271
6167
|
model: selectedModel,
|
|
6272
6168
|
modelSpawnKey,
|
|
6273
6169
|
status: "starting",
|
|
@@ -6385,7 +6281,7 @@ async function spawnRunWithoutConsentClaim(issueId, role, options, acceptConsent
|
|
|
6385
6281
|
const claudeCmd = `bash ${launcherScript}`;
|
|
6386
6282
|
console.log(`[claude-invoke] purpose=role-run | role=${role} | model=${state.model} | source=agents.ts:spawnRun | session=${agentId} | command="${claudeCmd}"`);
|
|
6387
6283
|
try {
|
|
6388
|
-
const { preTrustDirectory } = await import("./workspace-manager-
|
|
6284
|
+
const { preTrustDirectory } = await import("./workspace-manager-BrbX90Rm.js");
|
|
6389
6285
|
preTrustDirectory(workspace);
|
|
6390
6286
|
} catch {}
|
|
6391
6287
|
clearReadySignal(agentId);
|
|
@@ -6451,7 +6347,7 @@ async function spawnRunWithoutConsentClaim(issueId, role, options, acceptConsent
|
|
|
6451
6347
|
}
|
|
6452
6348
|
markAgentRunning(state);
|
|
6453
6349
|
try {
|
|
6454
|
-
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
6350
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-BAMwn9Nf.js");
|
|
6455
6351
|
const headAnchor = await snapshotWorkspaceHeadsPromise(issueId, workspace);
|
|
6456
6352
|
if (headAnchor) state.roleRunHead = headAnchor;
|
|
6457
6353
|
} catch {}
|
|
@@ -6493,7 +6389,7 @@ async function spawnAgentWithoutConsentClaim(options, acceptConsent) {
|
|
|
6493
6389
|
});
|
|
6494
6390
|
console.log(`[DEBUG] Selected model: ${selectedModel}`);
|
|
6495
6391
|
if (getProviderForModelSync(selectedModel).name === "openai" && await getProviderAuthMode(selectedModel) === "subscription") {
|
|
6496
|
-
const { isCliproxyRunning } = await import("./cliproxy-
|
|
6392
|
+
const { isCliproxyRunning } = await import("./cliproxy-DdhFpcXU.js");
|
|
6497
6393
|
if (!await Effect.runPromise(isCliproxyRunning())) throw new Error("CLIProxyAPI sidecar is not running. GPT subscription agents route through a local cliproxy process managed by `pan up`. Run `pan up` (or restart the dashboard) before spawning a GPT agent.");
|
|
6498
6394
|
}
|
|
6499
6395
|
const resolvedHarness = await resolveHarness({
|
|
@@ -6513,6 +6409,7 @@ async function spawnAgentWithoutConsentClaim(options, acceptConsent) {
|
|
|
6513
6409
|
workspace: options.workspace,
|
|
6514
6410
|
harness: resolvedHarness,
|
|
6515
6411
|
role,
|
|
6412
|
+
foreman: options.foreman || void 0,
|
|
6516
6413
|
model: selectedModel,
|
|
6517
6414
|
modelSpawnKey,
|
|
6518
6415
|
status: "starting",
|
|
@@ -6542,7 +6439,7 @@ async function spawnAgentWithoutConsentClaim(options, acceptConsent) {
|
|
|
6542
6439
|
});
|
|
6543
6440
|
}
|
|
6544
6441
|
if (role === "work") try {
|
|
6545
|
-
const { writeStoryFeatureContext } = await import("./work-agent-prompt
|
|
6442
|
+
const { writeStoryFeatureContext } = await import("./work-agent-prompt-BnhKNAg7.js");
|
|
6546
6443
|
await writeStoryFeatureContext(options.workspace, options.issueId);
|
|
6547
6444
|
} catch (ctxErr) {
|
|
6548
6445
|
console.warn(`[agents] Could not write story feature context for ${options.issueId}: ${ctxErr.message}`);
|
|
@@ -6589,7 +6486,7 @@ async function spawnAgentWithoutConsentClaim(options, acceptConsent) {
|
|
|
6589
6486
|
try {
|
|
6590
6487
|
const venvPath = join$1(options.workspace, ".venv");
|
|
6591
6488
|
if (isTldrEnabledSync() && existsSync(venvPath)) {
|
|
6592
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
6489
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CRSAkhBx.js");
|
|
6593
6490
|
const tldrService = getTldrDaemonServiceSync(options.workspace, venvPath);
|
|
6594
6491
|
if (!(await tldrService.getStatus()).running) {
|
|
6595
6492
|
await tldrService.start(true);
|
|
@@ -6629,13 +6526,13 @@ async function spawnAgentWithoutConsentClaim(options, acceptConsent) {
|
|
|
6629
6526
|
const claudeCmd = `bash ${launcherScript}`;
|
|
6630
6527
|
console.log(`[claude-invoke] purpose=work-agent | model=${state.model} | source=agents.ts:spawnAgent | session=${agentId} | command="${claudeCmd}"`);
|
|
6631
6528
|
try {
|
|
6632
|
-
const { preTrustDirectory } = await import("./workspace-manager-
|
|
6529
|
+
const { preTrustDirectory } = await import("./workspace-manager-BrbX90Rm.js");
|
|
6633
6530
|
preTrustDirectory(options.workspace);
|
|
6634
6531
|
} catch {}
|
|
6635
6532
|
try {
|
|
6636
|
-
const { isGitHubAppConfigured, generateInstallationToken, configureWorkspaceForBot } = await import("./github-app-
|
|
6533
|
+
const { isGitHubAppConfigured, generateInstallationToken, configureWorkspaceForBot } = await import("./github-app-BWziYCf3.js");
|
|
6637
6534
|
if (isGitHubAppConfigured()) {
|
|
6638
|
-
const { findProjectByPathSync } = await import("./projects-
|
|
6535
|
+
const { findProjectByPathSync } = await import("./projects-BMuEf14J.js");
|
|
6639
6536
|
const ghRepo = findProjectByPathSync(resolve$1(options.workspace, "..", ".."))?.github_repo;
|
|
6640
6537
|
if (ghRepo) {
|
|
6641
6538
|
const [owner, repo] = ghRepo.split("/");
|
|
@@ -6651,7 +6548,7 @@ async function spawnAgentWithoutConsentClaim(options, acceptConsent) {
|
|
|
6651
6548
|
const launchAndCaptureKimiSession = async () => {
|
|
6652
6549
|
let kimiExistingSessionsBefore;
|
|
6653
6550
|
if (resolvedHarness === "kimi-code") try {
|
|
6654
|
-
const { kimiSessionsRoot } = await import("./kimi-code-
|
|
6551
|
+
const { kimiSessionsRoot } = await import("./kimi-code-BxkDgaj4.js");
|
|
6655
6552
|
kimiExistingSessionsBefore = new Set(await readdir$1(kimiSessionsRoot(join$1(homedir(), ".kimi-code"), options.workspace)));
|
|
6656
6553
|
} catch {
|
|
6657
6554
|
kimiExistingSessionsBefore = /* @__PURE__ */ new Set();
|
|
@@ -6669,14 +6566,14 @@ async function spawnAgentWithoutConsentClaim(options, acceptConsent) {
|
|
|
6669
6566
|
...providerEnv
|
|
6670
6567
|
} }));
|
|
6671
6568
|
if (kimiExistingSessionsBefore) {
|
|
6672
|
-
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-
|
|
6569
|
+
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-BxkDgaj4.js");
|
|
6673
6570
|
const sessionId = await waitForNewKimiSessionAsync(join$1(homedir(), ".kimi-code"), options.workspace, kimiExistingSessionsBefore);
|
|
6674
6571
|
if (sessionId) writeKimiSessionId(agentId, sessionId);
|
|
6675
6572
|
else throw new Error(`kimi-code session capture timed out for ${agentId} — no new session directory appeared under the workspace bucket`);
|
|
6676
6573
|
}
|
|
6677
6574
|
};
|
|
6678
6575
|
if (resolvedHarness === "kimi-code") {
|
|
6679
|
-
const { withKimiSessionCaptureLock } = await import("./kimi-code-
|
|
6576
|
+
const { withKimiSessionCaptureLock } = await import("./kimi-code-BxkDgaj4.js");
|
|
6680
6577
|
try {
|
|
6681
6578
|
await withKimiSessionCaptureLock(join$1(homedir(), ".kimi-code"), options.workspace, launchAndCaptureKimiSession);
|
|
6682
6579
|
} catch (err) {
|
|
@@ -6739,7 +6636,7 @@ async function spawnAgentWithoutConsentClaim(options, acceptConsent) {
|
|
|
6739
6636
|
const codexHomeForAgent = join$1(homedir(), ".overdeck", "agents", agentId, "codex-home");
|
|
6740
6637
|
(async () => {
|
|
6741
6638
|
try {
|
|
6742
|
-
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-
|
|
6639
|
+
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-BValsmtK.js");
|
|
6743
6640
|
const rollout = await waitForCodexRollout(codexHomeForAgent, 12e4);
|
|
6744
6641
|
if (rollout) {
|
|
6745
6642
|
const threadId = extractThreadIdFromRollout(rollout);
|
|
@@ -7136,10 +7033,10 @@ var init_ohmypi = __esmMin((() => {
|
|
|
7136
7033
|
return;
|
|
7137
7034
|
}
|
|
7138
7035
|
try {
|
|
7139
|
-
await execAsync$2(`tmux -L
|
|
7036
|
+
await execAsync$2(`tmux -L ${shellQuote(getManagedTmuxSocketName())} send-keys -t ${agentId} C-c 2>/dev/null || true`);
|
|
7140
7037
|
} catch {}
|
|
7141
7038
|
try {
|
|
7142
|
-
const { stdout } = await execAsync$2(`tmux -L
|
|
7039
|
+
const { stdout } = await execAsync$2(`tmux -L ${shellQuote(getManagedTmuxSocketName())} list-panes -t ${shellQuote(agentId)} -F '#{pane_pid}' 2>/dev/null`);
|
|
7143
7040
|
const pid = stdout.trim();
|
|
7144
7041
|
if (pid) await execAsync$2(`kill -TERM -- -${pid} 2>/dev/null || kill -TERM ${pid} 2>/dev/null || true`);
|
|
7145
7042
|
} catch {}
|
|
@@ -7677,13 +7574,27 @@ var init_monitor_transport = __esmMin((() => {
|
|
|
7677
7574
|
}));
|
|
7678
7575
|
//#endregion
|
|
7679
7576
|
//#region ../../lib/agents/messaging.ts
|
|
7680
|
-
|
|
7577
|
+
/** PAN-3736 — the one phrase for "the message went to the mail file because the
|
|
7578
|
+
* agent was busy". It states that the agent is alive, and names the file, so a
|
|
7579
|
+
* reader never mistakes a mid-turn agent for a dead one. Turn-end delivery is
|
|
7580
|
+
* real for `.pending.md` mail: the codex notify hook replays the oldest pending
|
|
7581
|
+
* file at every turn boundary. The phrase still stops short of promising it,
|
|
7582
|
+
* because the hook only runs for codex sessions. */
|
|
7583
|
+
function busyAgentQueuedReason(mailPath) {
|
|
7584
|
+
return `agent is alive and mid-turn; message queued to its mail file (${mailPath})`;
|
|
7585
|
+
}
|
|
7586
|
+
/** Writes the message to the agent's durable mail dir and returns the file path
|
|
7587
|
+
* it wrote, so callers can name it in operator-facing output (PAN-3736). */
|
|
7588
|
+
function queueAgentMail(agentId, message, kind = "queued", dedupKey, source) {
|
|
7681
7589
|
const mailDir = join$1(getAgentDir(agentId), "mail");
|
|
7682
7590
|
mkdirSync(mailDir, { recursive: true });
|
|
7683
7591
|
const now = /* @__PURE__ */ new Date();
|
|
7684
|
-
const
|
|
7592
|
+
const suffix = MAIL_FILENAME_SUFFIX[kind];
|
|
7593
|
+
const filename = dedupKey !== void 0 ? `dedup-${createHash("sha256").update(dedupKey).digest("hex").slice(0, 24)}${suffix}` : `${now.toISOString().replace(/[:.]/g, "-")}${suffix}`;
|
|
7685
7594
|
const content = source ? formatMailFileContent(message, source, now) : `# Message\n\n${message}\n`;
|
|
7686
|
-
|
|
7595
|
+
const mailPath = join$1(mailDir, filename);
|
|
7596
|
+
writeFileSync(mailPath, content);
|
|
7597
|
+
return mailPath;
|
|
7687
7598
|
}
|
|
7688
7599
|
function resolveAgentDeliveryMethod(state) {
|
|
7689
7600
|
if (state?.harness === "acp") return "auto";
|
|
@@ -7727,7 +7638,7 @@ function deliverWithOptionalKey(normalizedId, message, caller, deliveryMethod, d
|
|
|
7727
7638
|
* at-most-once across the whole replay window.
|
|
7728
7639
|
*/
|
|
7729
7640
|
async function resumeThenDeliverKeyed(normalizedId, message, caller, agentState, dedupKey) {
|
|
7730
|
-
const { resumeAgent } = await import("./agents-
|
|
7641
|
+
const { resumeAgent } = await import("./agents-DixZjXWm.js");
|
|
7731
7642
|
const result = await resumeAgent(normalizedId);
|
|
7732
7643
|
if (!result.success) throw new Error(`Failed to auto-resume agent: ${result.error}`);
|
|
7733
7644
|
const delivery = await deliverAgentMessage(normalizedId, message, `messageAgent:${caller}`, resolveAgentDeliveryMethod(agentState), { dedupKey });
|
|
@@ -7758,7 +7669,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7758
7669
|
};
|
|
7759
7670
|
if (agentState?.paused === true) {
|
|
7760
7671
|
const gateBlockReason = getAgentResumeGateBlockReason(agentState)?.reason ?? "agent is paused";
|
|
7761
|
-
queueAgentMail(normalizedId, message,
|
|
7672
|
+
queueAgentMail(normalizedId, message, "queued", opts.dedupKey);
|
|
7762
7673
|
logAgentLifecycleSync(normalizedId, `messageAgent queued mail without resume: ${gateBlockReason}`);
|
|
7763
7674
|
console.log(`[agents] Queued message for ${normalizedId}; ${gateBlockReason}`);
|
|
7764
7675
|
return {
|
|
@@ -7771,7 +7682,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7771
7682
|
const suspendedGate = decideMessageGate();
|
|
7772
7683
|
if (suspendedGate.decision !== "proceed") {
|
|
7773
7684
|
const gateBlockReason = suspendedGate.reason ?? "agent is gated";
|
|
7774
|
-
queueAgentMail(normalizedId, message,
|
|
7685
|
+
queueAgentMail(normalizedId, message, "queued", opts.dedupKey);
|
|
7775
7686
|
logAgentLifecycleSync(normalizedId, `messageAgent queued mail without resume: ${gateBlockReason}`);
|
|
7776
7687
|
console.log(`[agents] Queued message for ${normalizedId}; ${gateBlockReason}`);
|
|
7777
7688
|
return {
|
|
@@ -7782,7 +7693,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7782
7693
|
}
|
|
7783
7694
|
console.log(`[agents] Auto-resuming suspended agent ${normalizedId} to deliver message`);
|
|
7784
7695
|
if (opts.dedupKey !== void 0) return resumeThenDeliverKeyed(normalizedId, message, caller, agentState, opts.dedupKey);
|
|
7785
|
-
const { resumeAgent } = await import("./agents-
|
|
7696
|
+
const { resumeAgent } = await import("./agents-DixZjXWm.js");
|
|
7786
7697
|
const result = await resumeAgent(normalizedId, message);
|
|
7787
7698
|
if (!result.success) throw new Error(`Failed to auto-resume agent: ${result.error}`);
|
|
7788
7699
|
if (result.messageDelivered === false) throw new Error(`Agent resumed but ready signal did not fire — message not delivered. Feedback is in the mail queue.`);
|
|
@@ -7796,7 +7707,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7796
7707
|
const stoppedGate = decideMessageGate();
|
|
7797
7708
|
if (stoppedGate.decision !== "proceed") {
|
|
7798
7709
|
const gateBlockReason = stoppedGate.reason ?? "agent is gated";
|
|
7799
|
-
queueAgentMail(normalizedId, message,
|
|
7710
|
+
queueAgentMail(normalizedId, message, "queued", opts.dedupKey);
|
|
7800
7711
|
logAgentLifecycleSync(normalizedId, `messageAgent queued mail without resume: ${gateBlockReason}`);
|
|
7801
7712
|
console.log(`[agents] Queued message for ${normalizedId}; ${gateBlockReason}`);
|
|
7802
7713
|
return {
|
|
@@ -7807,9 +7718,9 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7807
7718
|
}
|
|
7808
7719
|
console.log(`[agents] Auto-resuming stopped agent ${normalizedId} to deliver feedback (session exists: ${await Effect.runPromise(sessionExists(normalizedId))})`);
|
|
7809
7720
|
if (opts.dedupKey !== void 0) return resumeThenDeliverKeyed(normalizedId, message, caller, agentState, opts.dedupKey);
|
|
7810
|
-
const { resumeAgent } = await import("./agents-
|
|
7721
|
+
const { resumeAgent } = await import("./agents-DixZjXWm.js");
|
|
7811
7722
|
const resumeResult = await resumeAgent(normalizedId, message);
|
|
7812
|
-
queueAgentMail(normalizedId, message
|
|
7723
|
+
queueAgentMail(normalizedId, message);
|
|
7813
7724
|
if (resumeResult.success && resumeResult.messageDelivered !== false) {
|
|
7814
7725
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
7815
7726
|
console.log(`[agents] Resumed ${normalizedId} and delivered feedback`);
|
|
@@ -7851,7 +7762,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7851
7762
|
const resumeModel = agentState.model || "claude-sonnet-4-6";
|
|
7852
7763
|
const fallbackHarness = agentState.harness ?? "claude-code";
|
|
7853
7764
|
const harnessLaunch = await prepareHarnessLaunch(fallbackHarness);
|
|
7854
|
-
const { assertWorkspaceStackHealthyForSpawn } = await import("./agents-
|
|
7765
|
+
const { assertWorkspaceStackHealthyForSpawn } = await import("./agents-DixZjXWm.js");
|
|
7855
7766
|
await assertWorkspaceStackHealthyForSpawn(agentState.issueId || normalizedId.replace(/^agent-/, "").toUpperCase(), resumeRole, agentState.hostOverride === true, agentState.workspace);
|
|
7856
7767
|
const fallbackPiFields = fallbackHarness === "ohmypi" ? await getOhmypiLauncherFields(normalizedId, resumeModel) : {};
|
|
7857
7768
|
const fallbackCodexFields = fallbackHarness === "codex" ? getCodexLauncherFields(normalizedId, resumeModel, agentState.workspace, resumeRole) : {};
|
|
@@ -7934,14 +7845,14 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7934
7845
|
...reason ? { reason } : {}
|
|
7935
7846
|
};
|
|
7936
7847
|
}
|
|
7937
|
-
const { loadRemoteAgentState, sendToRemoteAgent } = await import("./remote-agents-
|
|
7848
|
+
const { loadRemoteAgentState, sendToRemoteAgent } = await import("./remote-agents-MuXx2gWm.js");
|
|
7938
7849
|
const remoteState = loadRemoteAgentState(normalizedId);
|
|
7939
7850
|
if (remoteState && remoteState.vmName) {
|
|
7940
7851
|
console.log(`[agents] Sending message to remote agent ${normalizedId} on ${remoteState.vmName}`);
|
|
7941
7852
|
if (opts.dedupKey !== void 0) {
|
|
7942
|
-
const { sendToRemoteAgentKeyed } = await import("./remote-agents-
|
|
7853
|
+
const { sendToRemoteAgentKeyed } = await import("./remote-agents-MuXx2gWm.js");
|
|
7943
7854
|
const remoteOutcome = await sendToRemoteAgentKeyed(normalizedId, remoteState.vmName, message, opts.dedupKey);
|
|
7944
|
-
queueAgentMail(normalizedId, message,
|
|
7855
|
+
queueAgentMail(normalizedId, message, "delivered", opts.dedupKey);
|
|
7945
7856
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
7946
7857
|
return {
|
|
7947
7858
|
delivered: true,
|
|
@@ -7953,7 +7864,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7953
7864
|
};
|
|
7954
7865
|
}
|
|
7955
7866
|
await sendToRemoteAgent(normalizedId, remoteState.vmName, message);
|
|
7956
|
-
queueAgentMail(normalizedId, message,
|
|
7867
|
+
queueAgentMail(normalizedId, message, "delivered");
|
|
7957
7868
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
7958
7869
|
return {
|
|
7959
7870
|
delivered: true,
|
|
@@ -7962,7 +7873,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7962
7873
|
}
|
|
7963
7874
|
const expectedHarness = agentState?.harness ?? "claude-code";
|
|
7964
7875
|
if (expectedHarness === "claude-code" && opts.dedupKey === void 0 && isMonitorLive(normalizedId)) {
|
|
7965
|
-
queueAgentMail(normalizedId, message,
|
|
7876
|
+
queueAgentMail(normalizedId, message, "queued", opts.dedupKey, caller);
|
|
7966
7877
|
logAgentLifecycleSync(normalizedId, `messageAgent delivered via monitor mail (caller: ${caller})`);
|
|
7967
7878
|
console.log(`[agents] Delivered message to ${normalizedId} via monitor inbox`);
|
|
7968
7879
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
@@ -7978,19 +7889,19 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
7978
7889
|
} catch {}
|
|
7979
7890
|
if (appServerState && appServerState !== "closed" && appServerState !== "error") {
|
|
7980
7891
|
if (!claimCodexIdleTurn(normalizedId)) {
|
|
7981
|
-
queueAgentMail(normalizedId, message,
|
|
7982
|
-
logAgentLifecycleSync(normalizedId,
|
|
7983
|
-
console.log(`[agents]
|
|
7892
|
+
const busyReason = busyAgentQueuedReason(queueAgentMail(normalizedId, message, "pending", opts.dedupKey));
|
|
7893
|
+
logAgentLifecycleSync(normalizedId, `messageAgent: ${busyReason}`);
|
|
7894
|
+
console.log(`[agents] ${normalizedId}: ${busyReason}`);
|
|
7984
7895
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
7985
7896
|
return {
|
|
7986
7897
|
delivered: true,
|
|
7987
7898
|
queuedToMail: true,
|
|
7988
|
-
reason:
|
|
7899
|
+
reason: busyReason
|
|
7989
7900
|
};
|
|
7990
7901
|
}
|
|
7991
7902
|
const deliveryMethod = resolveAgentDeliveryMethod(agentState);
|
|
7992
7903
|
const delivery = await deliverWithOptionalKey(normalizedId, message, `messageAgent:${caller}`, deliveryMethod, opts.dedupKey);
|
|
7993
|
-
queueAgentMail(normalizedId, message,
|
|
7904
|
+
queueAgentMail(normalizedId, message, "delivered", opts.dedupKey);
|
|
7994
7905
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
7995
7906
|
return {
|
|
7996
7907
|
delivered: delivery.ok,
|
|
@@ -8003,7 +7914,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
8003
7914
|
if (panePids.length > 0 && !await hasAgentRuntimeInSubtree(panePids[0], expectedHarness)) {
|
|
8004
7915
|
console.warn(`[agents] ${normalizedId} tmux session is a zombie (no ${expectedHarness} runtime) — attempting resume`);
|
|
8005
7916
|
if (opts.dedupKey !== void 0) return resumeThenDeliverKeyed(normalizedId, message, caller, agentState, opts.dedupKey);
|
|
8006
|
-
const { resumeAgent } = await import("./agents-
|
|
7917
|
+
const { resumeAgent } = await import("./agents-DixZjXWm.js");
|
|
8007
7918
|
const resumeResult = await resumeAgent(normalizedId, message);
|
|
8008
7919
|
if (resumeResult.success) {
|
|
8009
7920
|
const delivered = resumeResult.messageDelivered !== false;
|
|
@@ -8028,7 +7939,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
8028
7939
|
};
|
|
8029
7940
|
}
|
|
8030
7941
|
const delivery = await deliverWithOptionalKey(normalizedId, message, deliveryCaller, deliveryMethod, opts.dedupKey);
|
|
8031
|
-
if (opts.dedupKey === void 0) queueAgentMail(normalizedId, message,
|
|
7942
|
+
if (opts.dedupKey === void 0) queueAgentMail(normalizedId, message, "delivered");
|
|
8032
7943
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
8033
7944
|
if (delivery.ok && transcriptWatch && agentState?.workspace) watchForEatenAgentMessage({
|
|
8034
7945
|
agentId: normalizedId,
|
|
@@ -8053,7 +7964,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
8053
7964
|
async function messageAgentWithOutcome(agentId, message, caller = "internal", opts = {}) {
|
|
8054
7965
|
return (await messageAgent(agentId, message, caller, opts)).delivered ? "delivered" : "queued";
|
|
8055
7966
|
}
|
|
8056
|
-
var USER_MESSAGE_INTERVENTION_SOURCES;
|
|
7967
|
+
var MAIL_FILENAME_SUFFIX, USER_MESSAGE_INTERVENTION_SOURCES;
|
|
8057
7968
|
var init_messaging = __esmMin((() => {
|
|
8058
7969
|
init_activity_logger();
|
|
8059
7970
|
init_child_env();
|
|
@@ -8076,6 +7987,11 @@ var init_messaging = __esmMin((() => {
|
|
|
8076
7987
|
init_runtime_command();
|
|
8077
7988
|
init_supervisor_channels();
|
|
8078
7989
|
init_provider_env();
|
|
7990
|
+
MAIL_FILENAME_SUFFIX = {
|
|
7991
|
+
queued: ".md",
|
|
7992
|
+
pending: ".pending.md",
|
|
7993
|
+
delivered: ".delivered.md"
|
|
7994
|
+
};
|
|
8079
7995
|
USER_MESSAGE_INTERVENTION_SOURCES = new Set(["pan-tell", "dashboard:user-message"]);
|
|
8080
7996
|
}));
|
|
8081
7997
|
//#endregion
|
|
@@ -8217,6 +8133,155 @@ var init_resume_spawn_plan = __esmMin((() => {
|
|
|
8217
8133
|
init_session_rotation();
|
|
8218
8134
|
}));
|
|
8219
8135
|
//#endregion
|
|
8136
|
+
//#region ../../lib/session-pane-choice.ts
|
|
8137
|
+
async function captureSessionPaneChoice(sessionName, capture = capturePaneText) {
|
|
8138
|
+
let pane;
|
|
8139
|
+
try {
|
|
8140
|
+
pane = await capture(sessionName, PANE_CAPTURE_LINES);
|
|
8141
|
+
} catch {
|
|
8142
|
+
return null;
|
|
8143
|
+
}
|
|
8144
|
+
const menu = parsePaneChoiceMenu(pane);
|
|
8145
|
+
if (!menu) return null;
|
|
8146
|
+
return {
|
|
8147
|
+
signature: paneChoiceMenuSignature(menu),
|
|
8148
|
+
title: menu.title,
|
|
8149
|
+
contextLines: menu.contextLines,
|
|
8150
|
+
options: menu.options.map((option) => ({
|
|
8151
|
+
number: option.number,
|
|
8152
|
+
label: option.label,
|
|
8153
|
+
recommended: option.recommended
|
|
8154
|
+
})),
|
|
8155
|
+
selectedIndex: menu.selectedIndex,
|
|
8156
|
+
footerHint: menu.footerHint,
|
|
8157
|
+
confidence: menu.confidence
|
|
8158
|
+
};
|
|
8159
|
+
}
|
|
8160
|
+
async function answerSessionPaneChoice(sessionName, body, deps = {}) {
|
|
8161
|
+
try {
|
|
8162
|
+
const selectedIndex = Number(body.selectedIndex);
|
|
8163
|
+
const signature = typeof body.signature === "string" ? body.signature : "";
|
|
8164
|
+
if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex > 8) return {
|
|
8165
|
+
body: { error: "selectedIndex must be an integer 0-8" },
|
|
8166
|
+
status: 400
|
|
8167
|
+
};
|
|
8168
|
+
if (!signature) return {
|
|
8169
|
+
body: { error: "signature is required" },
|
|
8170
|
+
status: 400
|
|
8171
|
+
};
|
|
8172
|
+
if (!await (deps.sessionExists ?? ((name) => Effect.runPromise(sessionExists(name))))(sessionName)) return {
|
|
8173
|
+
body: { error: "Conversation session is not running" },
|
|
8174
|
+
status: 409
|
|
8175
|
+
};
|
|
8176
|
+
const capture = deps.capture ?? capturePaneText;
|
|
8177
|
+
const sendKey = deps.sendKey ?? ((name, key) => Effect.runPromise(sendRawKeystroke(name, key, "pane-choice")));
|
|
8178
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
8179
|
+
const menu = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
|
|
8180
|
+
if (!menu) return {
|
|
8181
|
+
body: {
|
|
8182
|
+
error: "The choice menu is no longer on screen",
|
|
8183
|
+
code: "menu-gone"
|
|
8184
|
+
},
|
|
8185
|
+
status: 409
|
|
8186
|
+
};
|
|
8187
|
+
if (paneChoiceMenuSignature(menu) !== signature) return {
|
|
8188
|
+
body: {
|
|
8189
|
+
error: "The choice menu changed since the card was rendered — refresh and re-answer",
|
|
8190
|
+
code: "menu-changed"
|
|
8191
|
+
},
|
|
8192
|
+
status: 409
|
|
8193
|
+
};
|
|
8194
|
+
if (selectedIndex >= menu.options.length) return {
|
|
8195
|
+
body: { error: `selectedIndex out of range (0-${menu.options.length - 1})` },
|
|
8196
|
+
status: 400
|
|
8197
|
+
};
|
|
8198
|
+
const keys = buildChoiceKeystrokes(menu, selectedIndex);
|
|
8199
|
+
for (const key of keys) {
|
|
8200
|
+
await sendKey(sessionName, key);
|
|
8201
|
+
await sleep(KEYSTROKE_GAP_MS);
|
|
8202
|
+
}
|
|
8203
|
+
await sleep(DELIVERY_CONFIRM_WAIT_MS);
|
|
8204
|
+
const after = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
|
|
8205
|
+
if (after && paneChoiceMenuSignature(after) === signature) return {
|
|
8206
|
+
body: {
|
|
8207
|
+
error: "Keystrokes were sent but the menu is still on screen — answer it from the terminal",
|
|
8208
|
+
code: "delivery-unconfirmed"
|
|
8209
|
+
},
|
|
8210
|
+
status: 409
|
|
8211
|
+
};
|
|
8212
|
+
return { body: {
|
|
8213
|
+
ok: true,
|
|
8214
|
+
answeredLabel: menu.options[selectedIndex].label
|
|
8215
|
+
} };
|
|
8216
|
+
} catch (error) {
|
|
8217
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
8218
|
+
console.error("[sessions] pane-choice answer failed:", message);
|
|
8219
|
+
return {
|
|
8220
|
+
body: { error: "Internal server error" },
|
|
8221
|
+
status: 500
|
|
8222
|
+
};
|
|
8223
|
+
}
|
|
8224
|
+
}
|
|
8225
|
+
var PANE_CAPTURE_LINES, KEYSTROKE_GAP_MS, DELIVERY_CONFIRM_WAIT_MS;
|
|
8226
|
+
var init_session_pane_choice = __esmMin((() => {
|
|
8227
|
+
init_pane_choice_menu();
|
|
8228
|
+
init_tmux();
|
|
8229
|
+
PANE_CAPTURE_LINES = 90;
|
|
8230
|
+
KEYSTROKE_GAP_MS = 60;
|
|
8231
|
+
DELIVERY_CONFIRM_WAIT_MS = 700;
|
|
8232
|
+
}));
|
|
8233
|
+
//#endregion
|
|
8234
|
+
//#region ../../lib/agents/resume-pane-choice.ts
|
|
8235
|
+
/**
|
|
8236
|
+
* Cross only Claude Code's known resume-summary gate before autonomous agent
|
|
8237
|
+
* continuation delivery. Every other pane choice remains untouched.
|
|
8238
|
+
*/
|
|
8239
|
+
async function prepareAutonomousAgentResumePane(agentId, role, deps = {}) {
|
|
8240
|
+
const choice = deps.capture ? await captureSessionPaneChoice(agentId, deps.capture) : await captureSessionPaneChoice(agentId);
|
|
8241
|
+
if (!choice) return {
|
|
8242
|
+
ready: true,
|
|
8243
|
+
action: "clear"
|
|
8244
|
+
};
|
|
8245
|
+
if (!AUTONOMOUS_RESUME_ROLES.has(role)) return {
|
|
8246
|
+
ready: false,
|
|
8247
|
+
reason: `pane is blocked on a choice menu that role=${role} may not answer automatically`
|
|
8248
|
+
};
|
|
8249
|
+
const labels = choice.options.map((option) => option.label);
|
|
8250
|
+
const summaryIndex = choice.options.findIndex((option) => option.label === RESUME_SUMMARY_LABEL && option.recommended);
|
|
8251
|
+
if (!(choice.options.length === RESUME_GATE_LABELS.length && RESUME_GATE_LABELS.every((label) => labels.includes(label)) && summaryIndex >= 0)) return {
|
|
8252
|
+
ready: false,
|
|
8253
|
+
reason: "pane is blocked on a choice menu other than the Claude resume-summary gate"
|
|
8254
|
+
};
|
|
8255
|
+
const result = await answerSessionPaneChoice(agentId, {
|
|
8256
|
+
selectedIndex: summaryIndex,
|
|
8257
|
+
signature: choice.signature
|
|
8258
|
+
}, deps);
|
|
8259
|
+
if (result.body.ok === true) return {
|
|
8260
|
+
ready: true,
|
|
8261
|
+
action: "resumed-from-summary"
|
|
8262
|
+
};
|
|
8263
|
+
return {
|
|
8264
|
+
ready: false,
|
|
8265
|
+
reason: `could not select Resume from summary: ${typeof result.body.error === "string" ? result.body.error : "unknown pane-choice failure"}`
|
|
8266
|
+
};
|
|
8267
|
+
}
|
|
8268
|
+
var AUTONOMOUS_RESUME_ROLES, RESUME_SUMMARY_LABEL, RESUME_GATE_LABELS;
|
|
8269
|
+
var init_resume_pane_choice = __esmMin((() => {
|
|
8270
|
+
init_session_pane_choice();
|
|
8271
|
+
AUTONOMOUS_RESUME_ROLES = new Set([
|
|
8272
|
+
"work",
|
|
8273
|
+
"review",
|
|
8274
|
+
"test",
|
|
8275
|
+
"strike"
|
|
8276
|
+
]);
|
|
8277
|
+
RESUME_SUMMARY_LABEL = "Resume from summary";
|
|
8278
|
+
RESUME_GATE_LABELS = [
|
|
8279
|
+
RESUME_SUMMARY_LABEL,
|
|
8280
|
+
"Resume full session as-is",
|
|
8281
|
+
"Don't ask me again"
|
|
8282
|
+
];
|
|
8283
|
+
}));
|
|
8284
|
+
//#endregion
|
|
8220
8285
|
//#region ../../lib/agents/resume.ts
|
|
8221
8286
|
/**
|
|
8222
8287
|
* Resume a suspended agent (PAN-80)
|
|
@@ -8249,7 +8314,7 @@ async function buildCompactRecoverySeed(agentId) {
|
|
|
8249
8314
|
if (agentState?.workspace && sessionId) {
|
|
8250
8315
|
const sessionFile = sessionFilePath(agentState.workspace, sessionId);
|
|
8251
8316
|
try {
|
|
8252
|
-
const [{ getConversationCompactionSettings }, { generateSmartSummary }] = await Promise.all([import("./conversation-compaction-
|
|
8317
|
+
const [{ getConversationCompactionSettings }, { generateSmartSummary }] = await Promise.all([import("./conversation-compaction-DzMXGRiJ.js"), import("./smart-compaction-CUXn8mfX.js")]);
|
|
8253
8318
|
const settings = getConversationCompactionSettings();
|
|
8254
8319
|
summary = (await Effect.runPromise(generateSmartSummary({
|
|
8255
8320
|
jsonlPath: sessionFile,
|
|
@@ -8260,7 +8325,7 @@ async function buildCompactRecoverySeed(agentId) {
|
|
|
8260
8325
|
} catch (err) {
|
|
8261
8326
|
logAgentLifecycleSync(normalizedId, `compact-recovery smart summary failed (${err instanceof Error ? err.message : String(err)}); trying heuristic fallback`);
|
|
8262
8327
|
try {
|
|
8263
|
-
const { generateFallbackSummary } = await import("./summary-fork-
|
|
8328
|
+
const { generateFallbackSummary } = await import("./summary-fork-CojrFKb6.js");
|
|
8264
8329
|
summary = await Effect.runPromise(generateFallbackSummary(sessionFile));
|
|
8265
8330
|
} catch (fallbackErr) {
|
|
8266
8331
|
logAgentLifecycleSync(normalizedId, `compact-recovery fallback summary failed (${fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)}); seeding with reseed instructions only`);
|
|
@@ -8527,23 +8592,29 @@ async function resumeAgent(agentId, message, opts) {
|
|
|
8527
8592
|
const delivery = await deliverInitialPromptWithRetry(normalizedId, effectiveMessage, "resumeAgent:compact-seed", resilientDeliveryMethod(agentState.deliveryMethod));
|
|
8528
8593
|
messageDelivered = delivery.ok;
|
|
8529
8594
|
if (!delivery.ok) console.error(`[resumeAgent] Fresh-session continue prompt did not land: ${delivery.failure ?? "unknown failure"}`);
|
|
8530
|
-
} else if (await waitForReadySignal(normalizedId, 30))
|
|
8531
|
-
const
|
|
8532
|
-
|
|
8533
|
-
|
|
8534
|
-
|
|
8535
|
-
|
|
8536
|
-
|
|
8537
|
-
|
|
8538
|
-
|
|
8539
|
-
|
|
8540
|
-
|
|
8541
|
-
|
|
8542
|
-
|
|
8543
|
-
|
|
8544
|
-
|
|
8545
|
-
|
|
8546
|
-
|
|
8595
|
+
} else if (await waitForReadySignal(normalizedId, 30)) {
|
|
8596
|
+
const panePreparation = await prepareAutonomousAgentResumePane(normalizedId, agentState.role);
|
|
8597
|
+
if (!panePreparation.ready) console.error(`[resumeAgent] Auto-continue prompt not sent: ${panePreparation.reason}`);
|
|
8598
|
+
else {
|
|
8599
|
+
if (panePreparation.action === "resumed-from-summary") logAgentLifecycleSync(normalizedId, "resumeAgent: selected Claude Resume from summary before continuation delivery");
|
|
8600
|
+
try {
|
|
8601
|
+
const delivery = await deliverResumeMessageWithTranscriptConfirmation({
|
|
8602
|
+
agentId: normalizedId,
|
|
8603
|
+
workspace: agentState.workspace,
|
|
8604
|
+
sessionId,
|
|
8605
|
+
message: effectiveMessage,
|
|
8606
|
+
caller: "resumeAgent:auto-continue",
|
|
8607
|
+
deliveryMethod: supervisorLaunch.useSupervisor ? "supervisor" : resilientDeliveryMethod(agentState.deliveryMethod)
|
|
8608
|
+
});
|
|
8609
|
+
messageDelivered = delivery.delivered;
|
|
8610
|
+
if (delivery.delivered && resumeMessage.redeliveringKickoff) markKickoffRedelivered(agentState);
|
|
8611
|
+
if (!delivery.delivered) console.error(`[resumeAgent] Auto-continue prompt did not land after ${delivery.attempts} delivery attempts`);
|
|
8612
|
+
} catch (deliveryError) {
|
|
8613
|
+
messageDelivered = false;
|
|
8614
|
+
console.error(`[resumeAgent] Auto-continue delivery threw: ${deliveryError instanceof Error ? deliveryError.message : String(deliveryError)}`);
|
|
8615
|
+
}
|
|
8616
|
+
}
|
|
8617
|
+
} else console.error("Claude SessionStart hook did not fire during resume, continue prompt not sent");
|
|
8547
8618
|
if (!messageDelivered) {
|
|
8548
8619
|
await Effect.runPromise(killSession(normalizedId)).catch(() => void 0);
|
|
8549
8620
|
const error = `Resume continue prompt did not become a confirmed turn for ${normalizedId}`;
|
|
@@ -8650,6 +8721,7 @@ var init_resume = __esmMin((() => {
|
|
|
8650
8721
|
init_identity();
|
|
8651
8722
|
init_runtime_state();
|
|
8652
8723
|
init_resume_spawn_plan();
|
|
8724
|
+
init_resume_pane_choice();
|
|
8653
8725
|
init_runtime_command();
|
|
8654
8726
|
init_supervisor_channels();
|
|
8655
8727
|
init_spawn_prep();
|
|
@@ -8775,6 +8847,25 @@ function looksLikeGenericConfirmation(line) {
|
|
|
8775
8847
|
function looksLikePiPermission(text) {
|
|
8776
8848
|
return /(?:permission|approval|approve|allow).{0,80}(?:required|request|prompt|action|command)/i.test(text) || /(?:allow|approve|run|execute)\s+(?:this\s+)?(?:command|tool|action)/i.test(text);
|
|
8777
8849
|
}
|
|
8850
|
+
/**
|
|
8851
|
+
* PAN-3766 — ohmypi `ask` modal footer. Pi renders a blocking multiple-choice
|
|
8852
|
+
* question in a box-drawn frame whose footer hint reads "Enter select · n note
|
|
8853
|
+
* · ↑/↓ move · Esc cancel". The modal sits at the bottom of the pane while open
|
|
8854
|
+
* and disappears when answered. The JSONL scan (scanPendingInputsPromise)
|
|
8855
|
+
* carries the question payload for conversations; this pane signal covers
|
|
8856
|
+
* sessions whose transcript is not wired into that scan (pi work agents).
|
|
8857
|
+
*/
|
|
8858
|
+
function looksLikePiAskFooter(line) {
|
|
8859
|
+
return /Enter\s+select\b/i.test(line) && /Esc\s+cancel/i.test(line);
|
|
8860
|
+
}
|
|
8861
|
+
/** Box-drawing chrome lines that may follow the ask modal's footer (╰───╯). */
|
|
8862
|
+
function looksLikePiBoxChrome(line) {
|
|
8863
|
+
return /^[\s╰╯╭╮─│├┤┌┐└┘┬┴┼]*$/.test(line);
|
|
8864
|
+
}
|
|
8865
|
+
/** The modal's header line: plain ("Ask 1 questions") or boxed ("╭─ Ask ─╮"). */
|
|
8866
|
+
function looksLikePiAskHeader(line) {
|
|
8867
|
+
return /^\s*(?:╭\s*─*\s*)?Ask\b/.test(line);
|
|
8868
|
+
}
|
|
8778
8869
|
function looksLikePlanningDone(text) {
|
|
8779
8870
|
return /planning finalized\s*[—-]\s*click done/i.test(text) || /click Done in the dashboard/i.test(text) || /planning (?:is )?complete.{0,120}(?:click|press|select) Done/i.test(text);
|
|
8780
8871
|
}
|
|
@@ -8837,6 +8928,21 @@ function detectAwaitingInputFromPaneSync(pane, options = {}) {
|
|
|
8837
8928
|
prompt: snippet
|
|
8838
8929
|
};
|
|
8839
8930
|
}
|
|
8931
|
+
const piAskIndex = lastIndexMatching(lines, looksLikePiAskFooter);
|
|
8932
|
+
if (piAskIndex >= 0 && isRecentPromptIndex(lines, piAskIndex)) {
|
|
8933
|
+
const trailing = lines.slice(piAskIndex + 1);
|
|
8934
|
+
if (trailing.length <= 3 && trailing.every(looksLikePiBoxChrome)) {
|
|
8935
|
+
let headerIndex = -1;
|
|
8936
|
+
for (let i = piAskIndex - 1; i >= 0 && i >= piAskIndex - 30; i--) if (looksLikePiAskHeader(lines[i])) {
|
|
8937
|
+
headerIndex = i;
|
|
8938
|
+
break;
|
|
8939
|
+
}
|
|
8940
|
+
return {
|
|
8941
|
+
reason: "user_question",
|
|
8942
|
+
prompt: snippetAround(lines, headerIndex >= 0 ? headerIndex : piAskIndex, 0, 12)
|
|
8943
|
+
};
|
|
8944
|
+
}
|
|
8945
|
+
}
|
|
8840
8946
|
if (options.isPlanning && looksLikePlanningDone(recentText)) {
|
|
8841
8947
|
const doneIndex = lastIndexMatching(lines, (line) => /done|planning/i.test(line));
|
|
8842
8948
|
return {
|
|
@@ -9184,6 +9290,60 @@ function isUserTextEntry(entry) {
|
|
|
9184
9290
|
});
|
|
9185
9291
|
return false;
|
|
9186
9292
|
}
|
|
9293
|
+
function isPiMessageEntry(entry) {
|
|
9294
|
+
if (!entry || typeof entry !== "object") return false;
|
|
9295
|
+
const e = entry;
|
|
9296
|
+
return e.type === "message" && typeof e.message?.role === "string";
|
|
9297
|
+
}
|
|
9298
|
+
function piAskQuestions(raw) {
|
|
9299
|
+
if (!Array.isArray(raw)) return [];
|
|
9300
|
+
const questions = [];
|
|
9301
|
+
for (const q of raw) {
|
|
9302
|
+
if (!q || typeof q !== "object") continue;
|
|
9303
|
+
const r = q;
|
|
9304
|
+
const options = Array.isArray(r["options"]) ? r["options"].filter((o) => !!o && typeof o === "object").map((o) => ({
|
|
9305
|
+
label: typeof o["label"] === "string" ? o["label"] : "",
|
|
9306
|
+
description: typeof o["description"] === "string" ? o["description"] : ""
|
|
9307
|
+
})) : [];
|
|
9308
|
+
questions.push({
|
|
9309
|
+
question: typeof r["question"] === "string" ? r["question"] : "",
|
|
9310
|
+
header: typeof r["header"] === "string" ? r["header"] : "",
|
|
9311
|
+
options,
|
|
9312
|
+
multiSelect: r["multiSelect"] === true
|
|
9313
|
+
});
|
|
9314
|
+
}
|
|
9315
|
+
return questions;
|
|
9316
|
+
}
|
|
9317
|
+
function scanPiEntry(entry, state) {
|
|
9318
|
+
const e = entry;
|
|
9319
|
+
const message = e.message;
|
|
9320
|
+
if (!message) return;
|
|
9321
|
+
const timestamp = typeof e.timestamp === "string" ? e.timestamp : (/* @__PURE__ */ new Date()).toISOString();
|
|
9322
|
+
if (message.role === "assistant" && Array.isArray(message.content)) {
|
|
9323
|
+
for (const item of message.content) {
|
|
9324
|
+
if (!item || typeof item !== "object") continue;
|
|
9325
|
+
const c = item;
|
|
9326
|
+
if (c.type === "toolCall" && c.name === "ask" && typeof c.id === "string") state.askToolCalls.set(c.id, {
|
|
9327
|
+
toolId: c.id,
|
|
9328
|
+
timestamp,
|
|
9329
|
+
questions: piAskQuestions(c.arguments?.questions)
|
|
9330
|
+
});
|
|
9331
|
+
}
|
|
9332
|
+
return;
|
|
9333
|
+
}
|
|
9334
|
+
if (message.role === "toolResult" && typeof message.toolCallId === "string") {
|
|
9335
|
+
if (state.askToolCalls.has(message.toolCallId)) {
|
|
9336
|
+
state.askAnswered.add(message.toolCallId);
|
|
9337
|
+
state.askDeniedAwaitingUser.delete(message.toolCallId);
|
|
9338
|
+
}
|
|
9339
|
+
}
|
|
9340
|
+
}
|
|
9341
|
+
/**
|
|
9342
|
+
* Scan a session transcript for inputs waiting on the operator: outstanding
|
|
9343
|
+
* AskUserQuestion tool calls (claude) or `ask` tool calls (ohmypi, PAN-3766),
|
|
9344
|
+
* and claude plan-mode state. Format is detected per line, so a transcript
|
|
9345
|
+
* resolves correctly even when the recorded harness is stale.
|
|
9346
|
+
*/
|
|
9187
9347
|
async function scanPendingInputsPromise(jsonlPath) {
|
|
9188
9348
|
if (!existsSync(jsonlPath)) return {
|
|
9189
9349
|
askUserQuestions: [],
|
|
@@ -9203,6 +9363,14 @@ async function scanPendingInputsPromise(jsonlPath) {
|
|
|
9203
9363
|
const exitPlanModeFiredAfterEnter = /* @__PURE__ */ new Set();
|
|
9204
9364
|
for (const line of lines) try {
|
|
9205
9365
|
const entry = JSON.parse(line);
|
|
9366
|
+
if (isPiMessageEntry(entry)) {
|
|
9367
|
+
scanPiEntry(entry, {
|
|
9368
|
+
askToolCalls,
|
|
9369
|
+
askAnswered,
|
|
9370
|
+
askDeniedAwaitingUser
|
|
9371
|
+
});
|
|
9372
|
+
continue;
|
|
9373
|
+
}
|
|
9206
9374
|
if (isUserTextEntry(entry)) {
|
|
9207
9375
|
for (const id of askDeniedAwaitingUser) askAnswered.add(id);
|
|
9208
9376
|
askDeniedAwaitingUser.clear();
|
|
@@ -9561,7 +9729,7 @@ async function restartAgent(agentId, opts = {}, deps = {}) {
|
|
|
9561
9729
|
unlinkSync(join$1(getAgentDir(normalizedId), "kimi-session-id"));
|
|
9562
9730
|
} catch {}
|
|
9563
9731
|
try {
|
|
9564
|
-
const { kimiSessionsRoot } = await import("./kimi-code-
|
|
9732
|
+
const { kimiSessionsRoot } = await import("./kimi-code-BxkDgaj4.js");
|
|
9565
9733
|
kimiExistingSessionsBefore = new Set(await readdir$1(kimiSessionsRoot(join$1(homedir(), ".kimi-code"), agentState.workspace)));
|
|
9566
9734
|
} catch {
|
|
9567
9735
|
kimiExistingSessionsBefore = /* @__PURE__ */ new Set();
|
|
@@ -9578,14 +9746,14 @@ async function restartAgent(agentId, opts = {}, deps = {}) {
|
|
|
9578
9746
|
...providerEnv
|
|
9579
9747
|
} }));
|
|
9580
9748
|
if (kimiExistingSessionsBefore) {
|
|
9581
|
-
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-
|
|
9749
|
+
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-BxkDgaj4.js");
|
|
9582
9750
|
const sessionId = await waitForNewKimiSessionAsync(join$1(homedir(), ".kimi-code"), agentState.workspace, kimiExistingSessionsBefore);
|
|
9583
9751
|
if (!sessionId) throw new Error(`kimi-code session capture timed out after fresh relaunch for ${normalizedId} — no new session directory appeared under the workspace bucket`);
|
|
9584
9752
|
writeKimiSessionId(normalizedId, sessionId);
|
|
9585
9753
|
}
|
|
9586
9754
|
};
|
|
9587
9755
|
if (effectiveHarness === "kimi-code") {
|
|
9588
|
-
const { withKimiSessionCaptureLock } = await import("./kimi-code-
|
|
9756
|
+
const { withKimiSessionCaptureLock } = await import("./kimi-code-BxkDgaj4.js");
|
|
9589
9757
|
await withKimiSessionCaptureLock(join$1(homedir(), ".kimi-code"), agentState.workspace, launchAndCaptureKimiSession);
|
|
9590
9758
|
} else await launchAndCaptureKimiSession();
|
|
9591
9759
|
const prompt = message || buildResumeContinueMessage(agentState);
|
|
@@ -9815,7 +9983,7 @@ async function recoverAgent(agentId, opts = {}) {
|
|
|
9815
9983
|
const launchAndCaptureKimiSession = async () => {
|
|
9816
9984
|
let kimiExistingSessionsBefore;
|
|
9817
9985
|
if (!resumeSessionId) try {
|
|
9818
|
-
const { kimiSessionsRoot } = await import("./kimi-code-
|
|
9986
|
+
const { kimiSessionsRoot } = await import("./kimi-code-BxkDgaj4.js");
|
|
9819
9987
|
kimiExistingSessionsBefore = new Set(await readdir$1(kimiSessionsRoot(join$1(homedir(), ".kimi-code"), state.workspace)));
|
|
9820
9988
|
} catch {
|
|
9821
9989
|
kimiExistingSessionsBefore = /* @__PURE__ */ new Set();
|
|
@@ -9829,13 +9997,13 @@ async function recoverAgent(agentId, opts = {}) {
|
|
|
9829
9997
|
...kimiProviderEnv
|
|
9830
9998
|
} }));
|
|
9831
9999
|
if (kimiExistingSessionsBefore) {
|
|
9832
|
-
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-
|
|
10000
|
+
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-BxkDgaj4.js");
|
|
9833
10001
|
const sessionId = await waitForNewKimiSessionAsync(join$1(homedir(), ".kimi-code"), state.workspace, kimiExistingSessionsBefore);
|
|
9834
10002
|
if (sessionId) writeKimiSessionId(normalizedId, sessionId);
|
|
9835
10003
|
else throw new Error(`kimi-code session capture timed out after fresh relaunch for ${normalizedId} — no new session directory appeared under the workspace bucket`);
|
|
9836
10004
|
}
|
|
9837
10005
|
};
|
|
9838
|
-
const { withKimiSessionCaptureLock } = await import("./kimi-code-
|
|
10006
|
+
const { withKimiSessionCaptureLock } = await import("./kimi-code-BxkDgaj4.js");
|
|
9839
10007
|
try {
|
|
9840
10008
|
await withKimiSessionCaptureLock(join$1(homedir(), ".kimi-code"), state.workspace, launchAndCaptureKimiSession);
|
|
9841
10009
|
} catch (err) {
|
|
@@ -9980,17 +10148,20 @@ async function reconcileSlotState(issueId, workspace, doc, options = {}) {
|
|
|
9980
10148
|
listBranches: listSlotBranches,
|
|
9981
10149
|
listAgents: listSlotAgents,
|
|
9982
10150
|
listSlotAssignments,
|
|
10151
|
+
listSlotCompletions,
|
|
9983
10152
|
...options.deps
|
|
9984
10153
|
};
|
|
9985
10154
|
const branches = await deps.listBranches(issueId, workspace);
|
|
9986
10155
|
const agents = deps.listAgents(issueId);
|
|
9987
10156
|
const assignments = deps.listSlotAssignments(issueId, workspace);
|
|
10157
|
+
const completions = deps.listSlotCompletions(issueId, workspace);
|
|
10158
|
+
const releasedSlotIndexes = new Set(Object.keys(readIssueRecordForWorkspaceSync(workspace, issueId.toUpperCase())?.swarm?.releasedBlockedSlots ?? {}).map(Number));
|
|
9988
10159
|
const branchesBySlot = new Map(branches.map((branch) => [branch.slotIndex, branch]));
|
|
9989
10160
|
const agentsBySlot = new Map(agents.map((agent) => [agent.slotIndex, agent]));
|
|
9990
10161
|
const hotspots = getProjectSwarmHotspots(findProjectByPathSync(workspace));
|
|
9991
10162
|
const slotEligibleItemIds = new Set(analyzeSwarmReadiness(doc, { hotspots }).items.filter((item) => item.slotEligible).map((item) => item.id));
|
|
9992
10163
|
const itemStatuses = new Map(doc.plan.items.map((item) => [item.id, item.status]));
|
|
9993
|
-
const slotItems = resolveSlotItemOwnership(slotEligibleItemIds, assignments, agents);
|
|
10164
|
+
const slotItems = resolveSlotItemOwnership(slotEligibleItemIds, assignments, agents, releasedSlotIndexes);
|
|
9994
10165
|
const result = {
|
|
9995
10166
|
issueId,
|
|
9996
10167
|
merged: [],
|
|
@@ -10004,13 +10175,14 @@ async function reconcileSlotState(issueId, workspace, doc, options = {}) {
|
|
|
10004
10175
|
const branch = branchesBySlot.get(slotItem.slotIndex);
|
|
10005
10176
|
const agent = agentsBySlot.get(slotItem.slotIndex);
|
|
10006
10177
|
const completed = options.statusOverrides?.[slotItem.itemId] === "completed" || itemStatuses.get(slotItem.itemId) === "completed";
|
|
10007
|
-
const
|
|
10178
|
+
const awaitingMerge = completions[String(slotItem.slotIndex)]?.itemId === slotItem.itemId;
|
|
10179
|
+
const merged = completed && !awaitingMerge;
|
|
10008
10180
|
const entry = {
|
|
10009
10181
|
...slotItem,
|
|
10010
10182
|
status: merged ? "merged" : agent || branch ? "in_flight" : "pending",
|
|
10011
10183
|
branch: branch?.branch,
|
|
10012
10184
|
agentId: agent?.agentId,
|
|
10013
|
-
...merged ? { mergedVia:
|
|
10185
|
+
...merged ? { mergedVia: "completed-status" } : {}
|
|
10014
10186
|
};
|
|
10015
10187
|
if (entry.status === "merged") result.merged.push(entry);
|
|
10016
10188
|
else if (entry.status === "in_flight") result.inFlight.push(entry);
|
|
@@ -10053,6 +10225,9 @@ function listSlotAssignments(issueId, workspace) {
|
|
|
10053
10225
|
branch: assignment.branch
|
|
10054
10226
|
})).sort((a, b) => a.slotIndex - b.slotIndex);
|
|
10055
10227
|
}
|
|
10228
|
+
function listSlotCompletions(issueId, workspace) {
|
|
10229
|
+
return readIssueRecordForWorkspaceSync(workspace, issueId.toUpperCase())?.swarm?.slotCompletions ?? {};
|
|
10230
|
+
}
|
|
10056
10231
|
function listSlotOwnership(issueId, workspace) {
|
|
10057
10232
|
const byItemId = /* @__PURE__ */ new Map();
|
|
10058
10233
|
for (const assignment of listSlotAssignments(issueId, workspace)) byItemId.set(assignment.itemId, assignment);
|
|
@@ -10070,13 +10245,14 @@ async function gitBranchNames(workspace, pattern, merged) {
|
|
|
10070
10245
|
const { stdout } = await execAsync(`git branch ${merged ? "--merged HEAD " : ""}--list ${JSON.stringify(pattern)}`, { cwd: workspace });
|
|
10071
10246
|
return stdout.split("\n").map((line) => line.replace(/^[*+\s]+/, "").trim()).filter(Boolean);
|
|
10072
10247
|
}
|
|
10073
|
-
function resolveSlotItemOwnership(slotEligibleItemIds, assignments, agents) {
|
|
10248
|
+
function resolveSlotItemOwnership(slotEligibleItemIds, assignments, agents, releasedSlotIndexes) {
|
|
10074
10249
|
const ownership = /* @__PURE__ */ new Map();
|
|
10075
10250
|
for (const assignment of assignments) {
|
|
10076
10251
|
if (!slotEligibleItemIds.has(assignment.itemId)) continue;
|
|
10077
10252
|
ownership.set(assignment.itemId, assignment.slotIndex);
|
|
10078
10253
|
}
|
|
10079
10254
|
for (const agent of agents) {
|
|
10255
|
+
if (agent.status === "stopped" && releasedSlotIndexes.has(agent.slotIndex)) continue;
|
|
10080
10256
|
if (!agent.slotItemId || !slotEligibleItemIds.has(agent.slotItemId) || ownership.has(agent.slotItemId)) continue;
|
|
10081
10257
|
ownership.set(agent.slotItemId, agent.slotIndex);
|
|
10082
10258
|
}
|
|
@@ -10086,7 +10262,7 @@ function resolveSlotItemOwnership(slotEligibleItemIds, assignments, agents) {
|
|
|
10086
10262
|
})).sort((a, b) => a.slotIndex - b.slotIndex);
|
|
10087
10263
|
}
|
|
10088
10264
|
function slotIndexFromBranch(issueLower, branch) {
|
|
10089
|
-
const match = new RegExp(`^feature/${escapeRegExp(issueLower)}-slot-(\\d+)
|
|
10265
|
+
const match = new RegExp(`^feature/${escapeRegExp(issueLower)}-slot-(\\d+)(?:-attempt-\\d+)?$`).exec(branch);
|
|
10090
10266
|
if (!match) return null;
|
|
10091
10267
|
return Number(match[1]);
|
|
10092
10268
|
}
|
|
@@ -10432,8 +10608,8 @@ async function spawnTierSupervisor(issueId, supervisor, options = {}) {
|
|
|
10432
10608
|
function buildSupervisorPrompt(issueId, subscribe) {
|
|
10433
10609
|
const policyLine = {
|
|
10434
10610
|
all: "You are subscribed to EVERY commit in this issue.",
|
|
10435
|
-
flagged: "You are subscribed only to commits for
|
|
10436
|
-
sampled: "You are subscribed to a deterministic sample of the
|
|
10611
|
+
flagged: "You are subscribed only to commits for items flagged requiresInspection=true.",
|
|
10612
|
+
sampled: "You are subscribed to a deterministic sample of the items in this issue."
|
|
10437
10613
|
}[subscribe];
|
|
10438
10614
|
return [
|
|
10439
10615
|
`# Standing Supervisor: ${issueId}`,
|
|
@@ -11283,7 +11459,11 @@ function recordAgentActivitySync(agentId, activity) {
|
|
|
11283
11459
|
if (!state) return false;
|
|
11284
11460
|
state.lastActivity = activity.at ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
11285
11461
|
if (activity.costSoFar !== void 0 && Number.isFinite(activity.costSoFar)) state.costSoFar = activity.costSoFar;
|
|
11286
|
-
|
|
11462
|
+
try {
|
|
11463
|
+
saveOverdeckAgentStateSync(state);
|
|
11464
|
+
} catch (err) {
|
|
11465
|
+
console.warn(`[agents] activity DB write failed for ${agentId} (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
|
|
11466
|
+
}
|
|
11287
11467
|
writeAgentStateJsonSync(state);
|
|
11288
11468
|
return true;
|
|
11289
11469
|
}
|
|
@@ -11404,6 +11584,54 @@ function clearAgentTroubledSync(agentId) {
|
|
|
11404
11584
|
saveAgentStateSync(state);
|
|
11405
11585
|
return true;
|
|
11406
11586
|
}
|
|
11587
|
+
/**
|
|
11588
|
+
* Clear operator-gate residue (stoppedByUser, paused, troubled) on STOPPED
|
|
11589
|
+
* agent rows whose issueId is in `issueIds` — used by close-out and the
|
|
11590
|
+
* terminal-issue residue patrol so a terminal issue's preserved agent rows
|
|
11591
|
+
* stop reappearing in the operator-gate parked orbit (PAN-3727). Running/
|
|
11592
|
+
* starting agents and scheduler yields are never touched: a yield is a live
|
|
11593
|
+
* scheduling decision, not operator residue, and a live agent's gates are not
|
|
11594
|
+
* this issue's to clear.
|
|
11595
|
+
*
|
|
11596
|
+
* Batched (one `listOverdeckAgentStatesSync()` scan for every issueId in the
|
|
11597
|
+
* set) so the recurring residue patrol does not perform one full agent-table
|
|
11598
|
+
* scan per terminal issue (review finding, PAN-3727) — cost scales with the
|
|
11599
|
+
* agent table once per patrol run, not with the number of terminal issues.
|
|
11600
|
+
*/
|
|
11601
|
+
function clearAgentOperatorGatesForIssuesSync(issueIds) {
|
|
11602
|
+
const mutated = /* @__PURE__ */ new Map();
|
|
11603
|
+
if (issueIds.size === 0) return mutated;
|
|
11604
|
+
for (const state of listOverdeckAgentStatesSync()) {
|
|
11605
|
+
if (state.status !== "stopped") continue;
|
|
11606
|
+
const normalized = state.issueId?.toUpperCase();
|
|
11607
|
+
if (!normalized || !issueIds.has(normalized)) continue;
|
|
11608
|
+
let changed = false;
|
|
11609
|
+
if (state.stoppedByUser) {
|
|
11610
|
+
delete state.stoppedByUser;
|
|
11611
|
+
changed = true;
|
|
11612
|
+
}
|
|
11613
|
+
if (state.paused === true && state.yieldedByScheduler !== true) {
|
|
11614
|
+
applyAgentUnpaused(state);
|
|
11615
|
+
changed = true;
|
|
11616
|
+
}
|
|
11617
|
+
if (state.troubled === true) {
|
|
11618
|
+
applyAgentUntroubled(state);
|
|
11619
|
+
changed = true;
|
|
11620
|
+
}
|
|
11621
|
+
if (changed) {
|
|
11622
|
+
saveAgentStateSync(state);
|
|
11623
|
+
const ids = mutated.get(normalized) ?? [];
|
|
11624
|
+
ids.push(state.id);
|
|
11625
|
+
mutated.set(normalized, ids);
|
|
11626
|
+
}
|
|
11627
|
+
}
|
|
11628
|
+
return mutated;
|
|
11629
|
+
}
|
|
11630
|
+
/** Single-issue convenience wrapper over {@link clearAgentOperatorGatesForIssuesSync}. */
|
|
11631
|
+
function clearAgentOperatorGatesForIssueSync(issueId) {
|
|
11632
|
+
const normalized = issueId.toUpperCase();
|
|
11633
|
+
return clearAgentOperatorGatesForIssuesSync(new Set([normalized])).get(normalized) ?? [];
|
|
11634
|
+
}
|
|
11407
11635
|
function applyAgentFailure(state, reason) {
|
|
11408
11636
|
const config = resolveAutoResumeConfigForIssue(state.issueId);
|
|
11409
11637
|
const nowMs = Date.now();
|
|
@@ -11699,6 +11927,6 @@ var init_agent_state = __esmMin((() => {
|
|
|
11699
11927
|
};
|
|
11700
11928
|
}));
|
|
11701
11929
|
//#endregion
|
|
11702
|
-
export {
|
|
11930
|
+
export { deliverCommitForReview as $, isTerminalSwarmSlotAgent as $n, piFifoPaths as $r, init_activity as $t, saveAgentStateSync as A, getAgentRuntimeSnapshot as Ai, init_runtime_census as An, transitionIssueToInReview as Ar, init_agent_input_detection as At, resolveAgentTargetSync as B, markAgentStateServiceInProcess as Bi, countRunningAgents as Bn, getAgentRuntimeBaseCommand as Br, isContextOverflowError as Bt, markAgentTroubled as C, writeChannelsBridgeMcpConfig as Ci, init_state_dir_removal as Cn, paneShowsCodexAuthBurn as Cr, getAgentWorkspace as Ct, recordStartupSessionExit as D, writePtyToken as Di, descendantPidsForSession as Dn, init_spawn_prep as Dr, scanPendingInputsPromise as Dt, recordAgentFailureSync as E, init_pty_token as Ei, removeAgentStateDir as En, defaultRunWorkspace as Er, isInteractiveRoleAgent as Et, writeAgentStateJsonSync as F, init_agents$1 as Fi, init_collector as Fn, init_resolve_tier as Fr, resumeAgent as Ft, init_runtime_state as G, init_concurrency as Gn, getRoleRuntimeBaseCommand as Gr, resolveAgentDeliveryMethod as Gt, waitForReadySignal as H, describeRunningAgents as Hn, getKimiCodeLauncherFields as Hr, init_messaging as Ht, isRole as I, init_agent_record_sync as Ii, LINUX_MEMORY_PRESSURE_DEFAULTS as In, resolveTier as Ir, answerSessionPaneChoice as It, compactAtTierRunBoundary as J, resetPatrolDispatchBudget as Jn, injectPiConversationMemory as Jr, appendActivity as Jt, saveAgentRuntimeState as K, releaseAdvancingSlot as Kn, hasAgentRuntimeInSubtree as Kr, init_operator_interventions as Kt, clearReadySignal as L, readAgentHarnessModelRecordSync as Li, init_linux as Ln, OHMYPI_AGENT_READY_TIMEOUT_SECONDS as Lr, captureSessionPaneChoice as Lt, setAgentPausedSync as M, appendAgentPlaneLifecycle as Mi, refreshRuntimeCensus as Mn, resolveImplicitStaffing as Mr, parseCodexApprovalPrompt as Mt, setAgentYieldedSync as N, appendAgentPlaneSession as Ni, runtimeCensusHasHarnessProcess as Nn, resolveIssueWorkModel as Nr, buildCompactRecoverySeed as Nt, resetAgentFailureCount as O, init_pty_supervisor_locate as Oi, getRuntimeCensus as On, retrieveSpawnTimeMemoryContext as Or, detectAwaitingInputForAgent as Ot, wipeAgentStateDirs as P, flushAgentPlaneWrites as Pi, createHostHealthCollector as Pn, resolveStaffing as Pr, init_resume as Pt, shouldReplayCompactAtTierRunBoundary as Q, init_swarm_slot_lifecycle as Qn, init_pi_fifo as Qr, getSessionId as Qt, isQualifiedAgentId as R, getRuntimeSnapshot as Ri, DARWIN_MEMORY_PRESSURE_DEFAULTS as Rn, describeOhmypiSpawnFailure as Rr, init_session_pane_choice as Rt, markAgentStoppedState as S, init_supervisor_channels as Si, hasRetainedTranscriptsMarker as Sn, isCodexAuthRouted as Sr, getAgentPendingQuestions as St, recordAgentFailure as T, init_resume_contract as Ti, markRetainedTranscripts as Tn, buildAgentLaunchConfig as Tr, isBlockedOnPendingInput as Tt, getAgentRuntimeState as U, emergencyBrake as Un, getOhmypiLauncherFields as Ur, messageAgent as Ut, waitForAgentIdle as V, setAgentRuntimeMirror as Vi, countRunningSwarmSlotsForIssue as Vn, getCodexLauncherFields as Vr, isContextOverflowTail as Vt, getAgentRuntimeStateSync as W, getConcurrencyLimits as Wn, getProviderAuthMode as Wr, messageAgentWithOutcome as Wt, replayCrashedStandingAgent as X, tryReserveSwarmSlot as Xn, waitForAcpHostReady as Xr, getLatestSessionId as Xt, contextWindowForModel as Y, tryReserveAdvancingSlot as Yn, roleAgentDefinitionPath as Yr, getActivity as Yt, replayStandingAgent as Z, workResumeSlotsAvailable as Zn, waitForPromptReady as Zr, getLatestSessionIdSync as Zt, init_agent_state as _, buildResumeContinueMessage as _i, listAgentStates as _n, init_bridge_token as _r, init_pending_decision_gate as _t, clearAgentOperatorGatesForIssuesSync as a, init_claude_auth as ai, init_spawn as an, deliverAgentMessage as ar, broadcastCommit as at, markAgentRunning as b, dismissDevChannelsDialog as bi, warnOnBareNumericIssueIds as bn, checkCodexAuthStatus as br, getAgentJsonlMtime as bt, clearAgentTroubled as c, determineModel as ci, ensureRegisteredSlotWorktree as cn, deliverResumeMessageWithTranscriptConfirmation as cr, init_tier_escalation as ct, decideResumeGate as d, getProviderTmuxFlags as di, init_session_history as dn, resilientDeliveryMethod as dr, reconcileSlotState as dt, init_ohmypi_fifo as ei, resolveLatestSessionIdSync as en, getCachedMemoryVerdict as er, init_tier_supervisor as et, getAgentDir as f, init_provider_health as fi, init_termination as fn, setAgentDeliveryMethod as fr, autoRecoverAgents as ft, getAgentStateSync as g, buildDefaultResumeContinueMessage as gi, init_queries as gn, BRIDGE_TOKEN_HEADER as gr, detectPendingOperatorDecision as gt, getAgentStateFilePath as h, init_openai_auth as hi, dropLegacyAgentStatesMissingRoleAsync as hn, probeTranscriptSince as hr, restartAgent as ht, clearAgentOperatorGatesForIssueSync as i, getClaudeAuthStatus as ii, init_ohmypi as in, SocketPostStatusError as ir, supervisorAgentId as it, setAgentPaused as j, init_agent_runtime as ji, panePidsForSession as jn, init_staffing as jr, normalizeAwaitingInputPrompt as jt, saveAgentState as k, resolvePtySupervisorScriptPath as ki, getRuntimeCensusSnapshot as kn, transitionIssueToInProgress as kr, detectAwaitingInputFromPaneSync as kt, clearAgentTroubledSync as l, getProviderEnvForModel as li, init_registered_slot_spawn as ln, init_delivery as lr, init_slot_reconcile as lt, getAgentState as m, getOpenAIAuthStatus as mi, stopAgentSync as mn, init_transcript_landing as mr, recoverAgent as mt, SESSION_EXITED_BEFORE_KICKOFF as n, init_context as ni, init_event_reads as nn, setCachedMemoryVerdict as nr, shouldSupervise as nt, clearAgentPaused as o, buildCavemanExports as oi, spawnAgent as on, deliverAgentPermissionDecision as or, init_tier_feed as ot, getAgentResumeGateBlockReason as p, validateProviderHealth as pi, stopAgent as pn, captureTranscriptUserRecordSnapshot as pr, detectCrashedAgents as pt, init_agents as q, releaseSwarmSlot as qn, init_runtime_command as qr, operatorInterventionEvent as qt, __testInternals as r, materializeAcpContextFile as ri, createOhmypiRuntimeSync as rn, AmbiguousKeyedDeliveryError as rr, spawnTierSupervisor as rt, clearAgentPausedSync as s, buildSpawnEnvForModel as si, spawnRun as sn, deliverInitialPromptWithRetry as sr, decideEscalation as st, GOVERNOR_SLOT_PAUSE_REASON_PREFIX as t, ohmypiFifoPaths as ti, saveSessionId as tn, init_memory_verdict_cache as tr, loadPrdDraft as tt, clearYieldForResumeSync as u, getProviderExportsForModel as ui, appendSessionIdToHistory as un, keyedSupervisorFailureKind as ur, listSlotAssignments as ut, isAgentPaused as v, decideChannelsForWorkAgent as vi, listRunningAgents as vn, writeBridgeTokenSync as vr, computeAgentEnrichment as vt, recordAgentActivitySync as w, buildResumeContract as wi, listAgentStateFilesForRemoval as wn, assertWorkspaceStackHealthyForSpawn as wr, init_agent_enrichment as wt, markAgentRunningState as x, hasCompletionMarkerForAgent as xi, RETAINED_TRANSCRIPTS_MARKER as xn, init_codex_auth as xr, getAgentJsonlPath as xt, isAgentTroubled as y, decideSupervisorForWorkAgent as yi, listRunningAgentsSync as yn, applyCodexAuthBurnFlag as yr, countPendingAskUserQuestionsForAgent as yt, normalizeAgentId as z, init_agent_runtime_mirror as zi, init_darwin as zn, getAcpLauncherFields as zr, init_context_overflow as zt };
|
|
11703
11931
|
|
|
11704
|
-
//# sourceMappingURL=agent-state-
|
|
11932
|
+
//# sourceMappingURL=agent-state-FABw8neJ.js.map
|