@overdeck/desktop 0.47.0 → 0.48.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 +59 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-10Ur5Dne.js → acceptance-criteria-DmtLDbtt.js} +2 -2
- package/server/{activity-logger-CyteR4JO.js → activity-logger-Co5qljIj.js} +55 -4
- package/server/activity-logger-K7FYGF_z.js +3 -0
- package/server/{advancing-selfheal-BNwqxseD.js → advancing-selfheal-8AR68Asf.js} +6 -6
- package/server/{agent-gc-C3h9Or3a.js → agent-gc-BmYeT6eH.js} +5 -5
- package/server/agent-state-Dq3s84-P.js +3 -0
- package/server/{agent-state-service-C63p_ftq.js → agent-state-service-DK1Vay1E.js} +1 -1
- package/server/{agent-state-service-Ds6OeFvo.js → agent-state-service-rjnzpHDx.js} +6 -6
- package/server/agent-state-source-Ds968-j6.js +21 -0
- package/server/{agents-J5mEnekq.js → agents-Dls7tfJH.js} +5 -5
- package/server/agents-IPSa5kzn.js +3 -0
- package/server/{archive-planning-BwhxeP7C.js → archive-planning-Cq7cyinS.js} +51 -24
- package/server/archive-planning-MbkGCBIY.js +2 -0
- package/server/{artifact-index-jobs-D1q_vR3V.js → artifact-index-jobs-Dj_8kpTd.js} +3 -3
- package/server/{assemble-Bgwqv-Ro.js → assemble-BTCmbcfH.js} +20 -13
- package/server/{auto-spawn-consent-CQ9Bi9q6.js → auto-spawn-consent-lXqRJ1Dr.js} +304 -121
- package/server/{backlog-auto-trigger-n1lzPgN4.js → backlog-auto-trigger-Dn-amzt6.js} +3 -3
- package/server/{behavior-td6-xhQk.js → behavior-DIMQMRzs.js} +2 -2
- package/server/{boot-reconciled-stop-events-C7gGe3oB.js → boot-reconciled-stop-events-D6SeUTIr.js} +1 -1
- package/server/{bridge-pool-patrol-CYH2OLb5.js → bridge-pool-patrol-BEjt-xF3.js} +2 -2
- package/server/{briefing-freshness-DRqZ8lAz.js → briefing-freshness-3PNmL_p3.js} +2 -2
- package/server/{build-info-7yiEpl6u.js → build-info-CJg813Hm.js} +3 -3
- package/server/{build-info-CpG__c63.js → build-info-CXyeFsXu.js} +1 -1
- package/server/{checkpoint-manager-CkKmB0wZ.js → checkpoint-manager-9t7G5c1V.js} +1 -1
- package/server/{checkpoint-manager-DBcyNR8w.js → checkpoint-manager-B2G38R3p.js} +3 -3
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-Wm963lm8.js → checkpoints-CuBgiXO-.js} +1 -1
- package/server/{checkpoints-D95apurL.js → checkpoints-VTZMd4Qm.js} +2 -2
- package/server/{claude-hooks-provision-Bjitl9aI.js → claude-hooks-provision-55SyQaPz.js} +2 -2
- package/server/{claude-hooks-provision-4RPxNkE8.js → claude-hooks-provision-CEUT-CZd.js} +1 -1
- package/server/{claude-permissions-CpbpvUQ2.js → claude-permissions-Cn0dIu2i.js} +2 -2
- package/server/{claude-settings-overlay-BzkHYDwR.js → claude-settings-overlay-B19hdzSA.js} +1 -1
- package/server/{claude-settings-overlay-_H9Yrzab.js → claude-settings-overlay-Yg_ANh81.js} +2 -2
- package/server/{cli-Cte9ZFGn.js → cli-C9S84iTy.js} +79 -22
- package/server/cli-M1cwZ__d.js +3 -0
- package/server/{cliproxy-C5fMJ7rY.js → cliproxy-CJq3KXU6.js} +2 -2
- package/server/{cliproxy-DaAbWMjC.js → cliproxy-DgEZlr7Y.js} +1 -1
- package/server/{close-issue-BPh1ARCF.js → close-issue-DPxRddGR.js} +5 -5
- package/server/{closed-issue-reaper-DoOZqGFK.js → closed-issue-reaper-C5Zn4GRS.js} +13 -13
- package/server/{closed-issue-reaper-DHRfRMrp.js → closed-issue-reaper-D-2B48Ri.js} +1 -1
- package/server/{codex-o8FJwzmy.js → codex-B3n_rkwn.js} +1 -1
- package/server/{codex-BzGDW_d3.js → codex-CjkD1PJu.js} +6 -6
- package/server/{codex-parser-Dt-ycU8L.js → codex-parser-DpB1Il-P.js} +2 -2
- package/server/{compaction-continuation-CvXpbZ4w.js → compaction-continuation-DZD9ukSE.js} +3 -3
- package/server/{config-CL3Gyvja.js → config-C5saf4Ja.js} +1 -1
- package/server/{config-BvLe652W.js → config-DnLJATZk.js} +2 -2
- package/server/{config-Bi3u1VK7.js → config-DvM8jtQK.js} +2 -2
- package/server/{config-yaml-CxdwhAIA.js → config-yaml-BSCqwmX0.js} +11299 -10972
- package/server/{conflict-gate-CX80JYYS.js → conflict-gate-DXa_L28t.js} +1 -1
- package/server/{conflict-gate-E4nt7ZeS.js → conflict-gate-WfVqgalf.js} +4 -4
- package/server/{context-layers-DAG83UZt.js → context-layers-D7UqH9Ab.js} +2 -2
- package/server/{context-layers-C_IIysnm.js → context-layers-Dpz3Vd6d.js} +3 -3
- package/server/{control-settings-CiqGxXnc.js → control-settings-DVf6pKyv.js} +4 -4
- package/server/{conversation-compaction-BE3CNtHF.js → conversation-compaction-5XuH6OBn.js} +1 -1
- package/server/{conversation-compaction-D6-yLtqt.js → conversation-compaction-COrbnX1J.js} +8 -8
- package/server/{conversation-service-DBxoYMDl.js → conversation-service-BufdtnZF.js} +169 -10
- package/server/{conversation-service-D_TS2b1r.js → conversation-service-DnUyIiLb.js} +1 -1
- package/server/{conversations-D0UEdLtk.js → conversations-B4rxz-Wl.js} +17 -10
- package/server/{conversations-BKDVpB-3.js → conversations-D1bwxQMy.js} +1 -1
- package/server/{cost-DpgYmYqR.js → cost-CpFDrJUS.js} +46 -2
- package/server/{cost-DS1s0DbG.js → cost-KLuwKCW9.js} +3 -3
- package/server/{cost-sync-tOCCGnEt.js → cost-sync-cesi9dp8.js} +3 -3
- package/server/{dag-BtkgLeqY.js → dag-BYiFMqpU.js} +2 -2
- package/server/{dangerous-git-ops-CFLykHWt.js → dangerous-git-ops-BKvd3-Hk.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-BIblC-WX.js → deacon-BbsWw8a6.js} +3 -3
- package/server/{deacon-pLRLbPvR.js → deacon-HdEh0Esp.js} +863 -214
- package/server/deacon-event-client-C93rvOT7.js +237 -0
- package/server/deacon-event-client-Ck5Ei7Mn.js +3 -0
- package/server/{deacon-nudge-log-B08gF0mh.js → deacon-nudge-log-BND_97Wo.js} +4 -3
- package/server/{deacon-pending-lifecycle-B-Io84AP.js → deacon-pending-lifecycle-CD3YsiQK.js} +3 -3
- package/server/deacon-swarm-DgWADWd_.js +2 -0
- package/server/{deacon-swarm-v5PMun-m.js → deacon-swarm-rqrl4TMs.js} +39 -18
- package/server/deacon.js +12 -210
- package/server/{dead-end-trip-D8A3msX9.js → dead-end-trip-DSF23CLX.js} +4 -3
- package/server/dead-end-trip-zKlS4v6f.js +2 -0
- package/server/delivery-CsbQdZkS.js +3 -0
- package/server/{deploy-patrol-sYgOxLeb.js → deploy-patrol-kARAkji4.js} +17 -21
- package/server/{deploy-queue-VfohaPN_.js → deploy-queue-Bj0HJT1i.js} +2 -2
- package/server/{deploy-queue-gHJBycaF.js → deploy-queue-rjTUy1RM.js} +1 -1
- package/server/{deploy-window-D4DQb8VP.js → deploy-window-B2IM-9G5.js} +10 -44
- package/server/{deploy-window-CFRZ0-kt.js → deploy-window-BNFWnA8D.js} +1 -1
- package/server/{dev-supervisor-DiOBDM1c.js → dev-supervisor-B1mZYXz4.js} +2 -2
- package/server/{devcontainer-renderer-BUOIlfgD.js → devcontainer-renderer-B-o68Z5B.js} +3 -3
- package/server/{dist-C3A8B8wM.js → dist-3W--cGMa.js} +1 -1
- package/server/dist-BR0QtwmS.js +3 -0
- package/server/{dist-src-C0adpegX.js → dist-src-C-Vk2jNk.js} +1 -1
- package/server/{docker-Y3PElJb0.js → docker-DH3jUYg1.js} +1 -1
- package/server/{docker-BJzlkqYB.js → docker-meuLKLzV.js} +27 -20
- package/server/{dod-DlNtcH6n.js → dod-D7-9dCOD.js} +1 -1
- package/server/{driver-CKVGi51s.js → driver-CmsY2RLl.js} +1 -1
- package/server/{durable-review-pipeline-DP6bIcOY.js → durable-review-pipeline-CStTgOAf.js} +1 -1
- package/server/{durable-review-pipeline-Cibps-Rg.js → durable-review-pipeline-Chq0lzjL.js} +1 -1
- package/server/{ensure-devcontainer-DMAbWqtQ.js → ensure-devcontainer-BE3llBWP.js} +1 -1
- package/server/{ensure-devcontainer-BAofzBPv.js → ensure-devcontainer-BXrY7C2Z.js} +4 -4
- package/server/{esm-shims-BeObUkaw.js → esm-shims-Bzy4ZzNU.js} +1 -1
- package/server/event-store-COd2tOx8.js +3 -0
- package/server/{event-store-CrHcVC5_.js → event-store-D_AR-Y78.js} +184 -11
- package/server/{events-CF8QDbuV.js → events-CCkFWa7X.js} +1 -1
- package/server/{events-BNrvchBg.js → events-zjDQozet.js} +3 -3
- package/server/{factory-Cmm9Hsho.js → factory-DhavwKVc.js} +5 -5
- package/server/{feature-registry-population-B6HpNWRy.js → feature-registry-population-DWGBKyWd.js} +4 -4
- package/server/{feature-registry-storage-DJEFx1Pf.js → feature-registry-storage-C5DkXmCM.js} +3 -3
- package/server/{features-D5km80UI.js → features-CC47YcCX.js} +2 -2
- package/server/{feedback-target-BJ5ZADsu.js → feedback-target-D9Tex35_.js} +1 -1
- package/server/{feedback-target-DSxEL6lP.js → feedback-target-DoRCR3L-.js} +18 -7
- package/server/{feedback-writer-CoB9Z6aU.js → feedback-writer-CTSuA6lw.js} +1 -1
- package/server/{feedback-writer-C27Hak8a.js → feedback-writer-DdsBdtNL.js} +5 -5
- package/server/{flywheel-DZZdtiOL.js → flywheel-DHWHzaYK.js} +1 -1
- package/server/{flywheel-f662Q-y2.js → flywheel-DJQa9az8.js} +14 -14
- package/server/{flywheel-BHx8XuMr.js → flywheel-TacAI9MA.js} +21 -17
- package/server/{flywheel-merge-order-Dil0LmdN.js → flywheel-merge-order-D2foPh88.js} +1 -1
- package/server/{flywheel-merge-order-D_xLMbJU.js → flywheel-merge-order-DRtex2Dt.js} +7 -7
- package/server/forge-CdlCG9aS.js +3 -0
- package/server/{forge-BaKGCya6.js → forge-c8LeC-tw.js} +2 -2
- package/server/{from-B3tZbB55.js → from-BogSwvr2.js} +1 -1
- package/server/{fs-lock-Bre3sGoz.js → fs-lock-D_GeJtXl.js} +3 -3
- package/server/{fts-operations-B9jG8wa3.js → fts-operations-DP9R-8Q3.js} +3 -3
- package/server/{git-utils-Xg4PFN45.js → git-utils-C31x1lpE.js} +1 -1
- package/server/{git-utils-CsvYfJU3.js → git-utils-xQ74FoSn.js} +5 -4
- package/server/{github-app-Bmg4R9mv.js → github-app-CpQSDlv8.js} +1 -1
- package/server/{github-app-CmNk0zLU.js → github-app-D2QuvZ3j.js} +3 -3
- package/server/{github-client-qazkPrg0.js → github-client-D9YvJX5D.js} +3 -3
- package/server/{github-client-B6KM9_wA.js → github-client-Tpi3PmKX.js} +1 -1
- package/server/{github-pr-lookup-DAcVeRLK.js → github-pr-lookup-DvBMv-IW.js} +2 -2
- package/server/{harness-binary-BSpiXaLw.js → harness-binary-BHxWf_sX.js} +7 -6
- package/server/{harness-resolve-BAJu5MX8.js → harness-resolve-bj9WMABA.js} +4 -4
- package/server/{health-events-BwX32k8d.js → health-events-bCDPn59Z.js} +2 -2
- package/server/{health-events-2Z6Wa9SM.js → health-events-qo7Ss34U.js} +1 -1
- package/server/{hooks-DbtbimEf.js → hooks-Dyxtg5fk.js} +2 -2
- package/server/{hooks-D1g1jKLI.js → hooks-X2XHBB2b.js} +1 -1
- package/server/{hume-DXNiu6nQ.js → hume-DrZEGpqc.js} +2 -2
- package/server/hume-YPsy4UA8.js +3 -0
- package/server/{idle-stack-reaper-Cy-dQzW4.js → idle-stack-reaper-CJ1ygW0p.js} +37 -7
- package/server/{idle-stack-reaper-CRA1e0jr.js → idle-stack-reaper-uJGOb-vu.js} +1 -1
- package/server/{in-flight-guard-D-sSkADM.js → in-flight-guard-CG2Eo-rr.js} +1 -1
- package/server/{infra-BDQDRopn.js → infra-CTrmVqc_.js} +111 -6
- package/server/{injection-Bl8d_jHZ.js → injection-BisQ0lpX.js} +1 -1
- package/server/{injection-6AGnXxlj.js → injection-C9sxqbc2.js} +73 -193
- package/server/{inspect-agent-nXdIptyh.js → inspect-agent-BoSO51YC.js} +12 -12
- package/server/inspect-agent-BykeOH4a.js +2 -0
- package/server/{internal-token-DzK385vD.js → internal-token-AvXePaQT.js} +2 -2
- package/server/{internal-token-Ias7N8Kg.js → internal-token-Djkj-yqK.js} +1 -1
- package/server/{io-B00PBNku.js → io-mxOWMZ7I.js} +6 -6
- package/server/{issue-closed-BehTG1be.js → issue-closed-Bj_bCv_0.js} +7 -7
- package/server/{issue-lifecycle-BqSuQvbn.js → issue-lifecycle-A5YIpDZE.js} +1 -1
- package/server/{issue-lifecycle-Birk-ifu.js → issue-lifecycle-BXUqaHzF.js} +32 -28
- package/server/{issue-service-singleton-C6ZduvuY.js → issue-service-singleton-BPNEXczv.js} +11 -11
- package/server/{issue-service-singleton-B2wXiIlw.js → issue-service-singleton-CcaHjKPR.js} +1 -1
- package/server/{issues-DQ5-LatB.js → issues-AX-YBeAQ.js} +2 -2
- package/server/{jsonl-parser-BDpnGFCl.js → jsonl-parser-CgYWQ20q.js} +7 -3
- package/server/kimi-code-BYbme0aV.js +579 -0
- package/server/kimi-code-D_Ppt82c.js +3 -0
- package/server/kimi-parser-B-JBg3Pv.js +147 -0
- package/server/{label-cleanup-Dwnky8FG.js → label-cleanup-sXUlgdM0.js} +3 -3
- package/server/{lifecycle-B4Xdb4cY.js → lifecycle-D2X3al0D.js} +2 -2
- package/server/{lifecycle-B3s4sM1G.js → lifecycle-DjlljAZ1.js} +6 -6
- package/server/{lifecycle-io-CzTHEooc.js → lifecycle-io-C5nVk55o.js} +1 -1
- package/server/{lifecycle-io-DCo6s6ks.js → lifecycle-io-NPm1YtIG.js} +5 -5
- package/server/{linear-client-CnbtHiic.js → linear-client--luYwCZg.js} +1 -1
- package/server/{linear-client-9uq7fhiV.js → linear-client-B8pLegW1.js} +3 -3
- package/server/{linear-mcp-auth-BxUOzswy.js → linear-mcp-auth-BQVWV0I3.js} +6 -6
- package/server/{linear-mcp-auth-D46fBCLf.js → linear-mcp-auth-Dx81Zl4G.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-DiW9RdSB.js → merge-Bx5Bh9pi.js} +3 -3
- package/server/{merge-sr8Nrnmi.js → merge-Dqmh_zja.js} +1 -1
- package/server/{merge-agent-BLUgRsz3.js → merge-agent-DP9AUY29.js} +33 -33
- package/server/{merge-agent-DQTXZk8z.js → merge-agent-DWd0KfiS.js} +1 -1
- package/server/{merge-batch-Cp_j9BGk.js → merge-batch-BdmvTEAC.js} +1 -1
- package/server/{merge-completeness-BLbB5-6n.js → merge-completeness-BfRwFjRx.js} +1 -1
- package/server/{merge-completeness-B46KqhtY.js → merge-completeness-C1FevcDT.js} +4 -4
- package/server/merge-ops-B98tKc1e.js +2 -0
- package/server/merge-rebase-BLykMwPO.js +2 -0
- package/server/{merge-rebase-DIkBjgwq.js → merge-rebase-BX1xKsrE.js} +2 -2
- package/server/{merge-set-CBgHfwM0.js → merge-set-DsLjjLEV.js} +4 -4
- package/server/{merge-set-DeUxFsC3.js → merge-set-H6epHOsw.js} +1 -1
- package/server/{merge-sync-kr4vqyjM.js → merge-sync-BEdfsQV4.js} +2 -2
- package/server/{merge-sync-CpGmk6Ch.js → merge-sync-BebcWWGA.js} +1 -1
- package/server/{merge-train-Dmrcus12.js → merge-train-D1I0lNOT.js} +4 -4
- package/server/{merge-train-deps-D_uGX91G.js → merge-train-deps-D_-C0Pk2.js} +4 -4
- package/server/{merge-verification-NvaAd8CZ.js → merge-verification-DN1Ov9bU.js} +6 -6
- package/server/{merged-docker-cleanup-worker-Y1R06TEl.js → merged-docker-cleanup-worker-CfXSr2pA.js} +4 -4
- package/server/{merged-docker-cleanup-worker-DH_hrGPI.js → merged-docker-cleanup-worker-ybsPyHjB.js} +1 -1
- package/server/{multipart-parser-R-oC8dQg.js → multipart-parser-CL5QG8iv.js} +2 -2
- package/server/{no-resume-mode-BgD0JUmM.js → no-resume-mode-DUR7Hi98.js} +1 -1
- package/server/node_modules/.package-lock.json +7 -7
- package/server/node_modules/brace-expansion/README.md +23 -1
- package/server/node_modules/brace-expansion/index.js +206 -85
- package/server/node_modules/brace-expansion/package.json +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs +34 -28
- 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 +34 -28
- 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 +36 -29
- package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/test.js +63 -32
- package/server/node_modules/msgpackr/dist/test.js.map +1 -1
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +34 -28
- 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 +34 -28
- package/server/{orphan-proposed-reconciler-DcgTPPFY.js → orphan-proposed-reconciler-CEW1maPl.js} +1 -1
- package/server/{orphan-proposed-reconciler-B6vJHxtX.js → orphan-proposed-reconciler-DfqHZftT.js} +23 -22
- package/server/package-lock.json +8 -8
- package/server/package.json +1 -1
- package/server/{pan-dir-DMzF5wne.js → pan-dir-DhgKfO86.js} +21 -6
- package/server/{paths-sJBSb7Ul.js → paths-BUuhi6jM.js} +17 -17
- package/server/{pending-lifecycle-claim-DilzGfgk.js → pending-lifecycle-claim-DJlA1rTR.js} +2 -2
- package/server/{persistent-logger-H_VjuOu7.js → persistent-logger-s8cbpFNV.js} +2 -2
- package/server/{pickup-DWhqzliO.js → pickup-2AxtB3dW.js} +1 -1
- package/server/{pipeline-membership-C88VBnhJ.js → pipeline-membership-2_okL5bm.js} +1 -1
- package/server/{pipeline-membership-D9SBvItj.js → pipeline-membership-Dqv6_0ig.js} +1 -1
- package/server/{pipeline-membership-gather-4eR-7Tqy.js → pipeline-membership-gather-4F1-tXKI.js} +1 -1
- package/server/{pipeline-membership-gather-CeVGnNJ2.js → pipeline-membership-gather-CtJ_7aGf.js} +149 -17
- package/server/{pipeline-notifier-DT6xLFao.js → pipeline-notifier-CO9rxJgB.js} +1 -1
- package/server/{pipeline-notifier-D0ALV6Nw.js → pipeline-notifier-DDfVBJhJ.js} +2 -2
- package/server/{post-merge-lifecycle-worker-8HIeS_J6.js → post-merge-lifecycle-worker-DmSOkeNp.js} +3 -3
- package/server/{project-pipelines-9SKt2bEc.js → project-pipelines-72WE8GVK.js} +2 -2
- package/server/{project-repos-B5pIphKg.js → project-repos-BAqDwtvi.js} +16 -11
- package/server/project-repos-Df90Zw7Y.js +3 -0
- package/server/projects-WqMWCdpa.js +3 -0
- package/server/{prompts-CgzMBvQF.js → prompts-XkL10m8M.js} +2 -2
- package/server/{providers-BJQSnAAp.js → providers-ClGPGkQ8.js} +15 -12
- package/server/providers-DFUOed8u.js +3 -0
- package/server/public/assets/{chunk-BO2N2NFS-D_pGACYN.js → chunk-BO2N2NFS-CeQUdPxr.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-BO6fe3hH.js → diagram-OG6HWLK6-B7rgk4yT.js} +1 -1
- package/server/public/assets/{dist-5zingMiA.js → dist-2RPazfXY.js} +3 -3
- package/server/public/assets/{dist-CVxhbI2E.js → dist-B9NInrVZ.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-Bgj4A7kp.js → ganttDiagram-6RSMTGT7-Bxp0gV14.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-DNPK7_cm.js → highlighted-body-OFNGDK62-CzoRTVlC.js} +1 -1
- package/server/public/assets/index-Cml-kHo6.css +1 -0
- package/server/public/assets/{index-DEpY-D1O.js → index-CvN8cEgs.js} +216 -215
- package/server/public/assets/{linear-BB0jQT16.js → linear-CFEEl3ND.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-CpV7nCBM.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-DeGIzzpZ.js → pieDiagram-4H26LBE5-BeR8R0cr.js} +1 -1
- package/server/public/assets/{prod-XBLvikex.js → prod-CYjzjCrn.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-BV9SLeWz.js → quadrantDiagram-W4KKPZXB-BpcTkFuW.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-Dwja0gj8.js → sankeyDiagram-5OEKKPKP-Bx2ETEV5.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-DCB4qvfw.js → xychartDiagram-2RQKCTM6-BKgEAFaj.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-7BgLDsIo.js → pull-requests-B-KrUph5.js} +3 -3
- package/server/{pull-requests-Dq0y6IxE.js → pull-requests-DK5k92B4.js} +1 -1
- package/server/{queries-C-MUZaIy.js → queries-DVpl1vsU.js} +1212 -193
- package/server/{rally-CPysR4T_.js → rally-DbE561hD.js} +3 -3
- package/server/rally-O_st_X7n.js +3 -0
- package/server/{rally-api-8Ptlp2os.js → rally-api-CZLeEd2C.js} +2 -2
- package/server/{rally-api-CgosKdKL.js → rally-api-DaHtn5QN.js} +1 -1
- package/server/{rally-client-CCX0hADj.js → rally-client-C-MAl8ur.js} +1 -1
- package/server/{rally-client-iYMHWQD7.js → rally-client-Ch3zRsBX.js} +5 -5
- package/server/{reap-terminal-sessions-Qf-9LVQc.js → reap-terminal-sessions-C1n0ALRb.js} +2 -2
- package/server/{reap-terminal-sessions-4Xg9NGA8.js → reap-terminal-sessions-DegFS2p1.js} +2 -2
- package/server/{rebuild-stack-CMdgaylx.js → rebuild-stack-C9Li44A3.js} +20 -10
- package/server/{rebuild-stack-DqcOVmJO.js → rebuild-stack-qC0jCNm6.js} +2 -2
- package/server/{reconstruct-cache-CMZJ_Vjq.js → reconstruct-cache-BHyiAg02.js} +7 -7
- package/server/record-aVzu-LGm.js +3 -0
- package/server/record-update-CZh46a2f.js +617 -0
- package/server/{record-update-DhI7eySG.js → record-update-DtdJK2Iw.js} +1 -1
- package/server/recovery-trip-CSNWSLDn.js +77 -0
- package/server/recovery-trip-_16hFKv4.js +3 -0
- package/server/{release-engine-B2X9AfFC.js → release-engine-Be5MX5GP.js} +5 -5
- package/server/{release-set-G4XKyQ8K.js → release-set-DJv_O6PS.js} +3 -3
- package/server/{remote-BXarMvqf.js → remote-BMM3uH2J.js} +3 -3
- package/server/{remote-CUhyqjXk.js → remote-C0xVTHA5.js} +3 -3
- package/server/{remote-agents-CLZB3Coc.js → remote-agents-BIIoc5pD.js} +1 -1
- package/server/{remote-agents-Bba-MgSA.js → remote-agents-EUiZ26bj.js} +7 -7
- package/server/{remote-completion-CwAp79EC.js → remote-completion-BS4tJUn8.js} +13 -13
- package/server/resolver-BvHd6RE4.js +163 -0
- package/server/resume-9thEqAQR.js +3 -0
- package/server/{review-agent--pOptAEV.js → review-agent-BHGaBoBu.js} +29 -29
- package/server/{review-agent-BTCNkq2h.js → review-agent-CD3RQ-tc.js} +1 -1
- package/server/{review-artifacts-BNmw8dWE.js → review-artifacts-DyhajWso.js} +6 -6
- package/server/{review-context-DFxYOOJW.js → review-context-B-dlsPnx.js} +9 -9
- package/server/{review-convoy-liveness-BgU_1jJf.js → review-convoy-liveness-D7M-s_nS.js} +2 -2
- package/server/{review-status-Dma9SFaN.js → review-status-B6wYcOtP.js} +1 -1
- package/server/{review-status-CGvlA4o_.js → review-status-CKLk5aZ-.js} +308 -58
- package/server/{review-status-emit-DURrmGYX.js → review-status-emit-CJ7UmEVU.js} +3 -3
- package/server/{review-status-enrichment-8NiNXi5W.js → review-status-enrichment-DJRgGX7-.js} +3 -3
- package/server/review-status-limits-4EJDCGHO.js +7 -0
- package/server/{review-status-source-DIk1JSow.js → review-status-source-7nU3Z2wL.js} +1 -1
- package/server/{review-status-source-BLx_1siH.js → review-status-source-BsDYGfyv.js} +1 -1
- package/server/{review-status-sync-muT-EBp2.js → review-status-sync-BLssMTEW.js} +1 -1
- package/server/{review-status-sync-0GxOqeqF.js → review-status-sync-BxBeHRde.js} +35 -11
- package/server/{review-verdict-feedback-xJNdqBnX.js → review-verdict-feedback-5jWuzgpc.js} +90 -16
- package/server/{review-verdict-feedback-HwF6ODFy.js → review-verdict-feedback-HRY9P4bN.js} +1 -1
- package/server/{rollup-BQaol5TX.js → rollup-BGIrCEkU.js} +79 -44
- package/server/rollup-CZB4UL9q.js +3 -0
- package/server/{scanner-C-D2cFdX.js → scanner-DydjXPrz.js} +16 -9
- package/server/search-DdtIjAiu.js +395 -0
- package/server/{sequence-io-Bmf1EZM5.js → sequence-io-Fw-cLyDs.js} +4 -4
- package/server/{sequencer-agent-CigMyKh2.js → sequencer-agent-BcpGMt5x.js} +15 -10
- package/server/server.js +1258 -438
- package/server/{service-CD0DvFvD.js → service-BFFkGsG4.js} +58 -58
- package/server/{session-fork-B6cQ5eya.js → session-fork-D0V-3e5P.js} +2 -2
- package/server/{session-history-3ON_IJjm.js → session-history-Bta5l9jY.js} +5 -5
- package/server/{settings-PilbFZAM.js → settings-Ce8B1daF.js} +2 -2
- package/server/{settings-VN0qOh4U.js → settings-E3FnEIUx.js} +3 -3
- package/server/settings-eOOJpxi_.js +2 -0
- package/server/{shadow-engineering-DXvx77oE.js → shadow-engineering-Mt9nJO4i.js} +3 -3
- package/server/{shadow-state-CZBp7pwq.js → shadow-state-Bzj_AZCV.js} +1 -1
- package/server/{shadow-state-BBk_zacw.js → shadow-state-DrkhoVSx.js} +2 -2
- package/server/{shadow-utils-DdZ05AJS.js → shadow-utils-H1GfqP06.js} +2 -2
- package/server/{ship-log-7kJfjUX2.js → ship-log-CFUIo4PR.js} +1 -1
- package/server/{smart-compaction-8fA5k5XN.js → smart-compaction-DSTq-Wua.js} +1 -1
- package/server/{smart-compaction-ByhL9cRS.js → smart-compaction-Hzp3KCJX.js} +7 -7
- package/server/{spawn-planning-session-vLUJoFjy.js → spawn-planning-session-C0uSA2SL.js} +2 -2
- package/server/{spawn-planning-session-pcF-YeFE.js → spawn-planning-session-DN4son31.js} +23 -21
- package/server/{specialist-completion-B07XjWD2.js → specialist-completion-Cf6tpIh1.js} +1 -1
- package/server/{specialist-context-DJ-zFyL3.js → specialist-context-DEUEkjIQ.js} +5 -5
- package/server/{specialist-handoff-logger-aKSxbIgD.js → specialist-handoff-logger-D_LmQDj3.js} +2 -2
- package/server/{specialist-logs-Dae-n52_.js → specialist-logs-7Ynue0R7.js} +3 -3
- package/server/{specialists-KR3pKulN.js → specialists-CQwBEGlD.js} +1 -1
- package/server/{specialists-6PWdtWcg.js → specialists-DAjPgYs_.js} +504 -238
- package/server/{specialists-DUiExaxb.js → specialists-Hr6iW9fU.js} +18 -18
- package/server/{specialists-Bz-wFT7R.js → specialists-MOoeB4A8.js} +1 -1
- package/server/specs-Dl88cbKY.js +3 -0
- package/server/{src-B948bGVR.js → src-BYdwL_n-.js} +668 -64
- package/server/{src-vHy2-oCv.js → src-DQnkPN2i.js} +3 -3
- package/server/{src-rac0Mepv.js → src-DhfDV0o4.js} +6 -6
- package/server/{stack-health-DqLTiEu4.js → stack-health-D_iKwNRg.js} +107 -16
- package/server/stack-health-deVSdDwn.js +3 -0
- package/server/{stale-task-claims-Cab_Fo_Z.js → stale-task-claims-BYJGqhLI.js} +5 -5
- package/server/{staleness-CGTZyp6V.js → staleness-CopBDKnA.js} +1 -1
- package/server/{staleness-C-a5rBxF.js → staleness-D8WeMUHd.js} +1 -1
- package/server/{state-home-722Dkx92.js → state-home-DjN8qduI.js} +24 -3
- package/server/{state-mapping-CybR81Uf.js → state-mapping-DlM7OYRW.js} +1 -1
- package/server/{state-migrate-2u8wIpoL.js → state-migrate-a2p1gtD7.js} +4 -4
- package/server/state-mirror-Cv_XgvT5.js +121 -0
- package/server/{stuck-remediation-r1TJu68G.js → stuck-remediation-CXJX_kki.js} +1 -1
- package/server/{stuck-remediation-CC6q3eqQ.js → stuck-remediation-CbCRSz1v.js} +31 -732
- package/server/{substrate-bug-weights-service-CzIyyWFT.js → substrate-bug-weights-service-DxpopNd9.js} +3 -3
- package/server/{summary-fork-BqgmgPDt.js → summary-fork-B61fjRJn.js} +2 -2
- package/server/{summary-fork-Df2WFijM.js → summary-fork-B9pszUJN.js} +91 -10
- package/server/supervisor/{injection-budget-Cg_KIb3o.js → injection-budget-Ar7hgyJq.js} +1 -1
- package/server/supervisor/pty-supervisor.js +12 -3
- package/server/supervisor/{pty-token-BbjwEUUM.js → pty-token-CXCFU0Z8.js} +1 -1
- package/server/{supervisor-BxqSpjcN.js → supervisor-BvnxbuuF.js} +6 -4
- package/server/supervisor-C69kpqvd.js +2 -0
- package/server/{swarm-readiness-DfFxa9-n.js → swarm-readiness-vTw1kqGa.js} +3 -3
- package/server/{system-prerequisites-ICLSkhhZ.js → system-prerequisites-LLzTEqsK.js} +3 -3
- package/server/{teardown-workspace-DRdi_CPa.js → teardown-workspace-CqKKVJr1.js} +15 -15
- package/server/{test-agent-queue-A_-p-i0I.js → test-agent-queue-CWMq7oyG.js} +8 -7
- package/server/{test-verdict-BHgTAwIG.js → test-verdict-NdtgRBuA.js} +1 -1
- package/server/{test-verdict-C4i9aqEP.js → test-verdict-diIWE6hz.js} +15 -3
- package/server/{tldr-daemon-CvWXBhX1.js → tldr-daemon-B1Jhrtc8.js} +1 -1
- package/server/{tldr-daemon-wvsU6bKv.js → tldr-daemon-Bpls1CJB.js} +2 -2
- package/server/{tmux-CfDHob9M.js → tmux-CImZaX4q.js} +10 -16
- package/server/tmux-Cjpx8L8u.js +4 -0
- package/server/{token-DrxwytsZ.js → token-Bgpjo3tE.js} +2 -2
- package/server/token-util-BsjFll-k.js +3 -0
- package/server/{token-util-B48BlCba.js → token-util-BymbpkJp.js} +1 -1
- package/server/{tracker-config-BcPMElRB.js → tracker-config-4DaKVTfc.js} +2 -2
- package/server/{tracker-utils-CJ6BHjcD.js → tracker-utils-BDeAXC-q.js} +2 -2
- package/server/{traefik-connect-DZ6nMYMj.js → traefik-connect-CC5FyxYj.js} +1 -1
- package/server/{tunnel-Bp-dRHZz.js → tunnel-CDWkeceJ.js} +1 -1
- package/server/{tunnel-DUbUPElU.js → tunnel-CPf5M-Pc.js} +3 -3
- package/server/{typed-errors-DyjseiB6.js → typed-errors-9K7Dq_Vn.js} +1 -1
- package/server/{typed-errors-CKeoDdU3.js → typed-errors-DrS5fb5z.js} +1 -1
- package/server/{types-Cm5ASJbq.js → types-DzlUKiuf.js} +4 -3
- package/server/{types-Di8wdakq.js → types-kI9ik8XO.js} +1 -1
- package/server/{uat-promote-verification-CoJuh7XO.js → uat-promote-verification-c_pxoxEc.js} +5 -5
- package/server/{uat-train-4Q0k06CQ.js → uat-train-CWGxBdJO.js} +0 -0
- package/server/{uat-train-Dewoatps.js → uat-train-CfCYd2ve.js} +1 -1
- package/server/{validate-B0C8p66t.js → validate-f3ItVCfm.js} +3 -3
- package/server/{validation-hVOwQk8T.js → validation-5G_wQtea.js} +1 -1
- package/server/{validation-B_kIRfNe.js → validation-7tSiCM82.js} +4 -4
- package/server/{verification-artifact-BxlxTiYK.js → verification-artifact-9h9dH8uX.js} +1 -1
- package/server/{verification-artifact-D70AtckY.js → verification-artifact-C_4WJnf6.js} +1 -1
- package/server/{verification-runner-Bc3cJvpC.js → verification-runner-BV5F6wrA.js} +1 -1
- package/server/{verification-runner-KZTz6u72.js → verification-runner-D58KmBhK.js} +18 -38
- package/server/{vtt-parser-CE_i3Bcw.js → vtt-parser-2iT9OHa9.js} +1 -1
- package/server/{work-agent-prompt-ByrPAzOy.js → work-agent-prompt-D03s4DD1.js} +9 -9
- package/server/{workflows-D0vP1WrK.js → workflows-BMBwLYPV.js} +281 -98
- package/server/workflows-BOmWGpIh.js +2 -0
- package/server/{workspace-DQkRPLlQ.js → workspace-BgflNCH0.js} +3 -3
- package/server/{workspace-COWvdibH.js → workspace-Cn9ywfSW.js} +1 -1
- package/server/{workspace-anchor-drift-pwz23TI1.js → workspace-anchor-drift-C8Fy3shi.js} +1 -1
- package/server/{workspace-anchor-drift-DXYIAHzr.js → workspace-anchor-drift-CMiNncwq.js} +5 -8
- package/server/{workspace-config-BdZM4PvZ.js → workspace-config-aUc2nIz6.js} +1 -1
- package/server/{workspace-manager-BPgTrG66.js → workspace-manager-Bem7ZBs9.js} +521 -292
- package/server/workspace-manager-C0CpNh3t.js +3 -0
- package/server/{workspace-metadata-CdjzAP8x.js → workspace-metadata-C5iSlPRo.js} +1 -1
- package/server/{workspace-metadata-DkO_iTLo.js → workspace-metadata-UKmTYmDQ.js} +2 -2
- package/server/{workspaces-CRBJikLp.js → workspaces-DqxgwDZ8.js} +143 -113
- package/sync-sources/hooks/notification-hook +12 -1
- package/sync-sources/hooks/pan-hook-lib.sh +226 -0
- package/sync-sources/hooks/session-start-hook +31 -4
- package/sync-sources/hooks/work-agent-stop-hook +23 -1
- package/sync-sources/skills/pan-memory/SKILL.md +19 -3
- package/sync-sources/skills/pan-projects/SKILL.md +9 -0
- package/sync-sources/skills/pan-restart/SKILL.md +26 -7
- package/sync-sources/skills/pan-workspace/SKILL.md +77 -0
- package/server/activity-logger-CMthG6Vd.js +0 -3
- package/server/agent-state-CYXJVG72.js +0 -3
- package/server/agents-ePFVoZbu.js +0 -3
- package/server/archive-planning-B2XplFzT.js +0 -2
- package/server/cli-CjOCSnfj.js +0 -3
- package/server/deacon-swarm-B1XkIvfr.js +0 -2
- package/server/delivery-BX9HR4wQ.js +0 -3
- package/server/dist-B3YPQa5A.js +0 -3
- package/server/event-store-5UKzh9Jf.js +0 -3
- package/server/forge-B5o319qI.js +0 -3
- package/server/fts-db-IVc4_M3f.js +0 -146
- package/server/hume-VUCNbTgn.js +0 -3
- package/server/inspect-agent-CUwVmr2h.js +0 -2
- package/server/merge-ops-1abz6O_P.js +0 -2
- package/server/merge-rebase-CJJVAJuz.js +0 -2
- package/server/node_modules/brace-expansion/.tap/coverage/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -757
- package/server/node_modules/brace-expansion/.tap/processinfo/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -719
- package/server/node_modules/brace-expansion/ADVISORY-CVE-2026-14257.md +0 -107
- package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts +0 -8
- package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts.map +0 -1
- package/server/node_modules/brace-expansion/dist/commonjs/index.js +0 -263
- package/server/node_modules/brace-expansion/dist/commonjs/index.js.map +0 -1
- package/server/node_modules/brace-expansion/dist/commonjs/package.json +0 -3
- package/server/node_modules/brace-expansion/dist/esm/index.d.ts +0 -8
- package/server/node_modules/brace-expansion/dist/esm/index.d.ts.map +0 -1
- package/server/node_modules/brace-expansion/dist/esm/index.js +0 -259
- package/server/node_modules/brace-expansion/dist/esm/index.js.map +0 -1
- package/server/node_modules/brace-expansion/dist/esm/package.json +0 -3
- package/server/project-repos-DPjOdfPa.js +0 -3
- package/server/projects-_n3Zui6K.js +0 -3
- package/server/providers-BI1mOBQ4.js +0 -3
- package/server/public/assets/index-Ddkcz3WT.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +0 -1
- package/server/rally-D_VW4bJv.js +0 -3
- package/server/record-BTwWhtBb.js +0 -3
- package/server/record-update-DaOKS7Wb.js +0 -277
- package/server/recovery-trip-DDH-02ng.js +0 -44
- package/server/resume-mOREjlYu.js +0 -3
- package/server/rollup-BR4t_wck.js +0 -3
- package/server/settings-CVmWiJ-r.js +0 -2
- package/server/specs--enInima.js +0 -3
- package/server/stack-health-BikqHSjn.js +0 -3
- package/server/supervisor-B4anCCSm.js +0 -2
- package/server/tmux-Ctk6RV5l.js +0 -3
- package/server/token-util-D411CAq9.js +0 -3
- package/server/workflows-DtDX08ed.js +0 -2
- package/server/workspace-manager-C1F3XsnS.js +0 -3
|
@@ -1,55 +1,54 @@
|
|
|
1
1
|
import { a as __toCommonJS } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-
|
|
5
|
-
import { B as
|
|
6
|
-
import { a as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { t as
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import { B as getBook, H as liveOrderIssueLookup, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-
|
|
39
|
-
import {
|
|
40
|
-
import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-
|
|
41
|
-
import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-
|
|
42
|
-
import {
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
2
|
+
import { At as isGeneratedGitHookPath, Bt as resolveStateReadHomeSync, D as resolveTieredExecutionEnabled, Fn as parseIssueIdSync, Ft as parsePorcelainStatusPaths, Gn as UnknownModelError, Mn as extractPrefixSync, Mt as isOverdeckWorkspaceRuntimePath, Nn as init_issue_id, O as resolveTieredExecutionEnabledForIssue, Qn as piProviderForModel, Sn as resolveProjectFromIssueSync, T as init_tier_table, Vn as init_harness_policy, Vt as shouldCommitLegacyWorkspaceArtifacts, Xn as getProviderForModelSync, Yt as findProjectByPathSync, Zn as init_providers, _i as packageRoot, c as isClaudeCodeChannelsEnabled, cn as init_projects, dr as resolveModel, f as loadConfigSync, fn as listProjectsSync, h as jsYaml, hi as init_paths, kt as init_state_plane, m as init_js_yaml, mi as getOverdeckHome, nn as getProjectSync, oi as claudeSessionTranscriptExists, si as encodeClaudeProjectDir, t as init_config_yaml, vi as resolveOhmypiExtensionPath, zn as canUseHarnessSync, zt as init_state_read_home } from "./config-yaml-BSCqwmX0.js";
|
|
3
|
+
import { a as emitActivityEntrySync, c as init_activity_logger, n as emitActivityEntryDurable } from "./activity-logger-Co5qljIj.js";
|
|
4
|
+
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CTrmVqc_.js";
|
|
5
|
+
import { B as sendRawKeystroke, C as init_tmux, E as killSession, H as sessionExistsSync, J as paneChoiceMenuSignature, K as buildChoiceKeystrokes, M as listSessions, U as setOption, V as sessionExists, X as parsePaneChoiceMenu, Y as paneHasBlockingChoiceMenu, a as capturePaneText, at as init_child_env, h as findManagedServerPidSync, it as buildChildEnvWithoutTmuxSync, j as listSessionNames, nt as BLANKED_PROVIDER_ENV, o as createSession, p as exactPaneTarget, q as init_pane_choice_menu, r as capturePane, w as isHarnessProcessAlive, z as sendKeysAsync } from "./tmux-CImZaX4q.js";
|
|
6
|
+
import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-BvHd6RE4.js";
|
|
7
|
+
import { a as init_event_store, n as getEventStore } from "./event-store-D_AR-Y78.js";
|
|
8
|
+
import { N as normalizeChannelReplyPayload, T as DomainEvent, n as COMPOSER_COMMAND_MANIFEST, s as getHarnessBehavior, t as init_src } from "./src-BYdwL_n-.js";
|
|
9
|
+
import { C as setReviewStatusSync, Q as init_agent_state_sync, X as AGENT_COLUMNS_FOR_DB, d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, tt as stateToOverdeckParamsForDb } from "./review-status-CKLk5aZ-.js";
|
|
10
|
+
import { a as EventStoreService, c as ReadModelService, d as getClosedIssueIdsForReadSource, f as init_read_model, i as init_issue_lifecycle, s as init_domain_services, t as IssueLifecycle } from "./issue-lifecycle-BXUqaHzF.js";
|
|
11
|
+
import { n as logAgentLifecycleSync, t as init_persistent_logger } from "./persistent-logger-s8cbpFNV.js";
|
|
12
|
+
import { d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-Dls7tfJH.js";
|
|
13
|
+
import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-3PNmL_p3.js";
|
|
14
|
+
import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-CpFDrJUS.js";
|
|
15
|
+
import { $ as scanPendingInputsPromise, $r as waitForReadySignal, An as init_runtime_command, Cn as getAcpLauncherFields, Dr as markAgentStoppedState, F as init_tier_escalation, Fn as init_pi_fifo, Fr as setAgentPaused, G as computeAgentEnrichment, Gn as determineModel, Gr as writePtyToken, H as restartAgent, Hr as buildResumeContract, In as piFifoPaths, J as getAgentJsonlPath$1, Jr as clearReadySignal, Jt as deliverAgentPermissionDecision, Kr as init_pty_supervisor_locate, Ln as init_ohmypi_fifo, Nn as waitForAcpHostReady, Nr as saveAgentState, On as getProviderAuthMode, Ot as stopAgent, P as decideEscalation, Pn as waitForPromptReady, Pr as saveAgentStateSync, Q as isBlockedOnPendingInput, Rn as ohmypiFifoPaths, Rr as wipeAgentStateDirs, U as detectPendingOperatorDecision, Ur as init_resume_contract, V as recoverAgent, W as init_pending_decision_gate, Wr as init_pty_token, X as getAgentWorkspace$1, Xn as validateProviderHealth, Xr as normalizeAgentId, Y as getAgentPendingQuestions$1, Yn as init_provider_health, Z as init_agent_enrichment, _n as resolveIssueWorkModel, _t as getActivity, an as init_bridge_token, b as init_agents$1, br as getAgentStateSync, bt as getSessionId, ci as init_codex_auth, ei as getAgentRuntimeState, en as setAgentDeliveryMethod, et as detectAwaitingInputForAgent, fn as transitionIssueToInProgress, fr as clearAgentTroubled, ft as messageAgent, gr as getAgentDir, ht as operatorInterventionEvent, i as listRunningAgents, in as BRIDGE_TOKEN_HEADER, it as parseCodexApprovalPrompt, mn as init_staffing, mt as init_operator_interventions, nt as init_agent_input_detection, on as writeBridgeTokenSync, or as writeChannelsBridgeMcpConfig, qn as getProviderExportsForModel, qr as resolvePtySupervisorScriptPath, qt as deliverAgentMessage, r as listAgentStates, ri as saveAgentRuntimeState, rr as dismissDevChannelsDialog, rt as normalizeAwaitingInputPrompt, si as checkCodexAuthStatus, sn as assertWorkspaceStackHealthyForSpawn, st as resumeAgent, ti as getAgentRuntimeStateSync, un as init_spawn_prep, ur as clearAgentPaused, vn as resolveStaffing, vr as getAgentState, vt as getLatestSessionId, wn as getAgentRuntimeBaseCommand, xt as saveSessionId, yt as getLatestSessionIdSync, zr as writeAgentStateJsonSync } from "./queries-DVpl1vsU.js";
|
|
16
|
+
import { a as performHandoff, i as checkAllTriggers, s as getAgentHealth, t as getCloisterService } from "./service-BFFkGsG4.js";
|
|
17
|
+
import { t as init_behavior } from "./behavior-DIMQMRzs.js";
|
|
18
|
+
import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-4DaKVTfc.js";
|
|
19
|
+
import { n as init_issue_service_singleton, r as issue_service_singleton_exports } from "./issue-service-singleton-BPNEXczv.js";
|
|
20
|
+
import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-AvXePaQT.js";
|
|
21
|
+
import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-DzlUKiuf.js";
|
|
22
|
+
import { i as init_project_repos, s as resolvePrimaryWorkspaceRepoDirSync, u as resolveWorkspaceRepoRootsSync } from "./project-repos-BAqDwtvi.js";
|
|
23
|
+
import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-D2X3al0D.js";
|
|
24
|
+
import { C as init_specs, O as writeSpecForIssue, d as readPlan, g as recordTierPromotion, h as readWorkspacePlanSync, p as readTierOverrides, r as findPlan, s as init_io } from "./io-mxOWMZ7I.js";
|
|
25
|
+
import { B as removeFavorite, E as hasOtherActiveConversationOnTmuxSession, F as markConversationEnded, G as setConversationHarness, K as setConversationModel, M as listConversations, P as markConversationActive, Q as updateConversationDeliveryMethod, S as getConversationByName, W as setConversationEffort, g as backfillConversationModel, h as archiveConversation, k as init_conversations, nt as updateLastAttached, rt as updateSpawnError, x as getConversationById, y as createConversation } from "./conversations-B4rxz-Wl.js";
|
|
26
|
+
import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-DWGBKyWd.js";
|
|
27
|
+
import { C as generateLauncherScriptSync, D as normalizeModelOverrideSync, E as init_model_validation, O as requireModelOverrideSync, S as normalizeFlywheelRunId, T as MODEL_ID_PATTERN, b as init_provenance, w as init_launcher_generator } from "./auto-spawn-consent-lXqRJ1Dr.js";
|
|
28
|
+
import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-Cn0dIu2i.js";
|
|
29
|
+
import { E as init_layers, I as workspaceContextFile, k as piGlobalContextFile } from "./assemble-BTCmbcfH.js";
|
|
30
|
+
import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-BHxWf_sX.js";
|
|
31
|
+
import { c as init_stack_health, o as getWorkspaceStackHealth } from "./stack-health-D_iKwNRg.js";
|
|
32
|
+
import { l as init_dag, o as getDispatchableItems } from "./dag-BYiFMqpU.js";
|
|
33
|
+
import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-bj9WMABA.js";
|
|
34
|
+
import { a as loadCloisterConfigSync, r as init_config } from "./config-DvM8jtQK.js";
|
|
35
|
+
import { c as isStateMigrated, o as init_state_home } from "./state-home-DjN8qduI.js";
|
|
36
|
+
import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-NPm1YtIG.js";
|
|
37
|
+
import { S as parseAcpConversationMessages, b as parseCodexConversationMessages, c as parseEntireConversation, g as init_ohmypi_conversation_parser, h as parsePiConversationMessages, p as init_pi_conversation_parser, t as init_conversation_service, v as parseOhmypiConversationMessages, x as init_acp_conversation_parser, y as init_codex_conversation_parser } from "./conversation-service-BufdtnZF.js";
|
|
38
|
+
import { B as getBook, H as liveOrderIssueLookup, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-TacAI9MA.js";
|
|
39
|
+
import { Bt as getSystemHealthSnapshot, Rt as getResourceConfig, jt as classifyMemoryPressure } from "./deacon-HdEh0Esp.js";
|
|
40
|
+
import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-Bem7ZBs9.js";
|
|
41
|
+
import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-CgYWQ20q.js";
|
|
42
|
+
import { o as getRuntimeForAgent } from "./stuck-remediation-CbCRSz1v.js";
|
|
43
|
+
import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-CG2Eo-rr.js";
|
|
44
|
+
import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-UKmTYmDQ.js";
|
|
45
|
+
import { basename, delimiter, dirname, isAbsolute, join, resolve, sep } from "node:path";
|
|
45
46
|
import { Cause, Data, Effect, Layer, Option, Schema, Stream } from "effect";
|
|
46
|
-
import { join as join$1 } from "path";
|
|
47
47
|
import { homedir, networkInterfaces } from "node:os";
|
|
48
48
|
import { createReadStream, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync } from "node:fs";
|
|
49
49
|
import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
|
|
50
50
|
import { access, appendFile, chmod, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat as stat$1, writeFile } from "node:fs/promises";
|
|
51
51
|
import { randomUUID } from "crypto";
|
|
52
|
-
import { mkdir as mkdir$1, writeFile as writeFile$1 } from "fs/promises";
|
|
53
52
|
import { exec, execFile, spawn } from "node:child_process";
|
|
54
53
|
import { promisify } from "node:util";
|
|
55
54
|
import { createHash as createHash$1, createHmac, randomBytes, randomUUID as randomUUID$1, timingSafeEqual } from "node:crypto";
|
|
@@ -59,7 +58,6 @@ import { request } from "node:http";
|
|
|
59
58
|
import * as Result$1 from "effect/Result";
|
|
60
59
|
//#region http-helpers.ts
|
|
61
60
|
init_paths();
|
|
62
|
-
init_errors();
|
|
63
61
|
/**
|
|
64
62
|
* Workaround for Effect 4.0.0-beta.45 bug where HttpServerResponse.json()
|
|
65
63
|
* creates a response without a proper body._tag, causing NodeHttpServer to crash
|
|
@@ -81,18 +79,19 @@ function jsonStringResponse(json, options) {
|
|
|
81
79
|
}
|
|
82
80
|
//#endregion
|
|
83
81
|
//#region ../../lib/default-cwd.ts
|
|
84
|
-
init_activity_logger();
|
|
85
|
-
init_issue_id();
|
|
86
|
-
init_projects();
|
|
87
82
|
init_providers();
|
|
88
83
|
init_harness_policy();
|
|
84
|
+
init_issue_id();
|
|
85
|
+
init_projects();
|
|
89
86
|
init_tier_table();
|
|
90
87
|
init_js_yaml();
|
|
91
88
|
init_config_yaml();
|
|
89
|
+
init_activity_logger();
|
|
92
90
|
init_child_env();
|
|
93
91
|
init_pane_choice_menu();
|
|
94
92
|
init_tmux();
|
|
95
93
|
init_infra();
|
|
94
|
+
init_resolver();
|
|
96
95
|
init_event_store();
|
|
97
96
|
init_src();
|
|
98
97
|
init_agent_state_sync();
|
|
@@ -104,9 +103,11 @@ init_domain_services();
|
|
|
104
103
|
init_cost();
|
|
105
104
|
init_behavior();
|
|
106
105
|
init_tracker_config();
|
|
106
|
+
init_types();
|
|
107
107
|
init_project_repos();
|
|
108
108
|
init_lifecycle();
|
|
109
109
|
init_review_status();
|
|
110
|
+
init_specs();
|
|
110
111
|
init_io();
|
|
111
112
|
/**
|
|
112
113
|
* Resolve the default cwd used when no project is selected — the "devroot"
|
|
@@ -217,6 +218,9 @@ init_harness_resolve();
|
|
|
217
218
|
init_bridge_token();
|
|
218
219
|
init_operator_interventions();
|
|
219
220
|
init_lifecycle_io();
|
|
221
|
+
init_agent_input_detection();
|
|
222
|
+
init_agent_enrichment();
|
|
223
|
+
init_pending_decision_gate();
|
|
220
224
|
init_agents$1();
|
|
221
225
|
let cachedTrustedOrigins;
|
|
222
226
|
function addTrustedOrigin(origins, raw) {
|
|
@@ -401,7 +405,6 @@ async function waitForSessionRespawn(sessionName, timeoutMs) {
|
|
|
401
405
|
//#region routes/dashboard-auth.ts
|
|
402
406
|
init_state_read_home();
|
|
403
407
|
init_state_plane();
|
|
404
|
-
init_types();
|
|
405
408
|
init_issue_lifecycle();
|
|
406
409
|
init_codex_auth();
|
|
407
410
|
init_config();
|
|
@@ -798,11 +801,12 @@ async function readRecordedState(agentId, opts) {
|
|
|
798
801
|
*/
|
|
799
802
|
async function resolveAgentHarness(agentId, opts = {}) {
|
|
800
803
|
const recorded = (await readRecordedState(agentId, opts)).harness;
|
|
801
|
-
if (recorded === "codex" || recorded === "pi" || recorded === "ohmypi" || recorded === "acp") return recorded;
|
|
804
|
+
if (recorded === "codex" || recorded === "pi" || recorded === "ohmypi" || recorded === "acp" || recorded === "kimi-code") return recorded;
|
|
802
805
|
if (await agentHasClaudeTranscript(agentId, opts)) return recorded ?? "claude-code";
|
|
803
806
|
if (await resolveAcpTranscriptPath(agentId, opts)) return "acp";
|
|
804
807
|
if (await resolveCodexRolloutPath(agentId, opts)) return "codex";
|
|
805
808
|
if (await resolvePiSessionPath(agentId, opts)) return "ohmypi";
|
|
809
|
+
if (await resolveKimiWirePath(agentId, opts)) return "kimi-code";
|
|
806
810
|
return recorded;
|
|
807
811
|
}
|
|
808
812
|
/**
|
|
@@ -830,7 +834,7 @@ async function resolveCodexRolloutPath(agentId, opts = {}) {
|
|
|
830
834
|
const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
|
|
831
835
|
const codexHome = join(agentDir, "codex-home");
|
|
832
836
|
if (!await pathExists$1(codexHome)) return null;
|
|
833
|
-
const { findRolloutPath, findLatestRollout } = await import("./codex-
|
|
837
|
+
const { findRolloutPath, findLatestRollout } = await import("./codex-B3n_rkwn.js");
|
|
834
838
|
const threadId = (await readOptional(join(agentDir, "codex-thread-id")))?.trim();
|
|
835
839
|
if (threadId) {
|
|
836
840
|
const rollout = findRolloutPath(codexHome, threadId);
|
|
@@ -844,6 +848,24 @@ async function resolveAcpTranscriptPath(agentId, opts = {}) {
|
|
|
844
848
|
return await pathExists$1(transcriptPath) ? transcriptPath : null;
|
|
845
849
|
}
|
|
846
850
|
/**
|
|
851
|
+
* Resolve the native Kimi Code CLI wire.jsonl for a kimi-code-harness agent
|
|
852
|
+
* (PAN-1837 wi8a). Fast path: the per-agent kimi-session-id (persisted by
|
|
853
|
+
* wi5's spawnAgent) maps directly to
|
|
854
|
+
* `<kimiHome>/sessions/<workDirKey>/<sessionId>/agents/main/wire.jsonl`.
|
|
855
|
+
* Fallback (no captured id): the newest session directory by wire.jsonl mtime
|
|
856
|
+
* under the workspace's workDirKey bucket — same shape as the codex/pi lazy
|
|
857
|
+
* fallbacks above, since Kimi may not have finished writing its first turn
|
|
858
|
+
* when the id was captured.
|
|
859
|
+
*/
|
|
860
|
+
async function resolveKimiWirePath(agentId, opts = {}) {
|
|
861
|
+
const workspace = opts.workspaceOverride ?? (await readRecordedState(agentId, opts)).workspace;
|
|
862
|
+
if (!workspace) return null;
|
|
863
|
+
const sessionId = (await readOptional(join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId, "kimi-session-id")))?.trim() || null;
|
|
864
|
+
const kimiHome = opts.kimiHomeOverride ?? join(homedir(), ".kimi-code");
|
|
865
|
+
const { findKimiWirePathAsync } = await import("./kimi-code-D_Ppt82c.js");
|
|
866
|
+
return findKimiWirePathAsync(kimiHome, workspace, sessionId);
|
|
867
|
+
}
|
|
868
|
+
/**
|
|
847
869
|
* Resolve the pi/kimi session JSONL (PAN-1908). Pi writes its session transcript
|
|
848
870
|
* as `<iso-ts>_<session-id>.jsonl` either in the agent dir's `sessions/` subdir
|
|
849
871
|
* (conversations) OR in the agent dir root (work agents) — so check both. The dir
|
|
@@ -893,6 +915,7 @@ async function resolveJsonlPath(agentId, workspacePath, opts = {}) {
|
|
|
893
915
|
if (behavior.transcriptKind === "codex-rollout-jsonl") return resolveCodexRolloutPath(agentId, opts);
|
|
894
916
|
if (behavior.transcriptKind === "ohmypi-jsonl") return resolvePiSessionPath(agentId, opts);
|
|
895
917
|
if (behavior.transcriptKind === "acp-jsonl") return resolveAcpTranscriptPath(agentId, opts);
|
|
918
|
+
if (behavior.transcriptKind === "kimi-wire-jsonl") return resolveKimiWirePath(agentId, opts);
|
|
896
919
|
const claudeSessionId = await resolveClaudeSessionId(agentId, opts);
|
|
897
920
|
if (!claudeSessionId) {
|
|
898
921
|
logTranscriptResolution(agentId, `missing-session-id:${harness ?? "unknown"}`, `failed harness=${harness ?? "unknown"} reason=no-session-id checked=session.id,sessions.json,runtime-state`, opts);
|
|
@@ -1533,6 +1556,7 @@ async function runDetachedCommand(argv, dependencies = {}) {
|
|
|
1533
1556
|
//#region routes/agents/shared.ts
|
|
1534
1557
|
init_paths();
|
|
1535
1558
|
init_agents$1();
|
|
1559
|
+
init_agent_enrichment();
|
|
1536
1560
|
init_activity_logger();
|
|
1537
1561
|
init_tmux();
|
|
1538
1562
|
const execAsync$2 = promisify(exec);
|
|
@@ -1986,6 +2010,7 @@ const getAgentPendingQuestions = getAgentPendingQuestions$1;
|
|
|
1986
2010
|
//#endregion
|
|
1987
2011
|
//#region routes/agents/listing.ts
|
|
1988
2012
|
init_agents$1();
|
|
2013
|
+
init_agent_enrichment();
|
|
1989
2014
|
init_tmux();
|
|
1990
2015
|
/**
|
|
1991
2016
|
* PAN-3070 — the health status a live agent row reports.
|
|
@@ -2255,7 +2280,7 @@ const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", http
|
|
|
2255
2280
|
} catch {}
|
|
2256
2281
|
let stdout;
|
|
2257
2282
|
if (isRemote && vmName) {
|
|
2258
|
-
const { getRemoteAgentOutput } = await import("./remote-agents-
|
|
2283
|
+
const { getRemoteAgentOutput } = await import("./remote-agents-BIIoc5pD.js");
|
|
2259
2284
|
stdout = await getRemoteAgentOutput(id, vmName, parseInt(String(lines), 10) || 100);
|
|
2260
2285
|
} else stdout = await Effect.runPromise(capturePane(id, parseInt(String(lines), 10) || 100));
|
|
2261
2286
|
if (!stdout || stdout.trim() === "" || stdout.trim() === "Session not found") {
|
|
@@ -3086,7 +3111,7 @@ async function cleanupConversationAttachments(name) {
|
|
|
3086
3111
|
* sessions that the lifecycle poller missed. */
|
|
3087
3112
|
async function cleanupOrphanedConversationAttachments() {
|
|
3088
3113
|
try {
|
|
3089
|
-
const { listConversations } = await import("./conversations-
|
|
3114
|
+
const { listConversations } = await import("./conversations-D1bwxQMy.js");
|
|
3090
3115
|
const convNames = new Set(listConversations().map((c) => c.name));
|
|
3091
3116
|
const root = getConversationAttachmentsRoot();
|
|
3092
3117
|
await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join(root, entry.name)), 10, (path) => rm(path, {
|
|
@@ -3267,6 +3292,24 @@ async function removeConversationAttachment(name, attachmentPath) {
|
|
|
3267
3292
|
return true;
|
|
3268
3293
|
}
|
|
3269
3294
|
//#endregion
|
|
3295
|
+
//#region ../../lib/overdeck/resume-contract-delivery.ts
|
|
3296
|
+
init_agents$1();
|
|
3297
|
+
init_tmux();
|
|
3298
|
+
async function deliverResumeContractUnlessGated(tmuxSession, contract, caller, method) {
|
|
3299
|
+
const resumeGatePane = await capturePaneText(tmuxSession, 90).catch(() => "");
|
|
3300
|
+
if (resumeGatePane && paneHasBlockingChoiceMenu(resumeGatePane)) {
|
|
3301
|
+
console.log(`[conversations] resume contract skipped for ${tmuxSession} — the harness is showing a blocking choice menu; the operator answers it`);
|
|
3302
|
+
return "skipped-gated";
|
|
3303
|
+
}
|
|
3304
|
+
try {
|
|
3305
|
+
await deliverAgentMessage(tmuxSession, contract, caller, method);
|
|
3306
|
+
return "delivered";
|
|
3307
|
+
} catch (err) {
|
|
3308
|
+
console.error(`[conversations] resume contract delivery failed for ${tmuxSession}:`, err instanceof Error ? err.message : String(err));
|
|
3309
|
+
return "failed";
|
|
3310
|
+
}
|
|
3311
|
+
}
|
|
3312
|
+
//#endregion
|
|
3270
3313
|
//#region ../../lib/overdeck/conversation-runtime.ts
|
|
3271
3314
|
init_projects();
|
|
3272
3315
|
init_tmux();
|
|
@@ -3376,7 +3419,7 @@ async function resolveAllowedHarness(requested, model) {
|
|
|
3376
3419
|
if (!model) return "claude-code";
|
|
3377
3420
|
return resolveHarness({
|
|
3378
3421
|
model,
|
|
3379
|
-
explicit: requested === "ohmypi" || requested === "claude-code" || requested === "codex" || requested === "acp" ? requested : void 0
|
|
3422
|
+
explicit: requested === "ohmypi" || requested === "claude-code" || requested === "codex" || requested === "acp" || requested === "kimi-code" ? requested : void 0
|
|
3380
3423
|
});
|
|
3381
3424
|
}
|
|
3382
3425
|
async function isInsideGitWorkTree(dir) {
|
|
@@ -3465,6 +3508,8 @@ async function waitForConversationRuntimeReady(tmuxSession, harness, mode) {
|
|
|
3465
3508
|
const transcriptKind = getHarnessBehavior(harness).transcriptKind;
|
|
3466
3509
|
if (transcriptKind === "ohmypi-jsonl") {
|
|
3467
3510
|
if (!await waitForPiTuiReady(tmuxSession)) throw new Error(`Pi (ohmypi) did not become interactive in ${tmuxSession} within the startup window — MCP server connections are likely still in progress. Retry once MCP servers finish connecting, or check ~/.claude/mcp.json for a slow/hanging server.`);
|
|
3511
|
+
} else if (transcriptKind === "kimi-wire-jsonl") {
|
|
3512
|
+
if (!await waitForPromptReady(tmuxSession, "kimi-code", 30)) throw new Error(`Kimi Code did not become interactive in ${tmuxSession} within the startup window.`);
|
|
3468
3513
|
} else if (transcriptKind !== "codex-rollout-jsonl" && mode === "spawn") {
|
|
3469
3514
|
await waitForClaudeReady(tmuxSession);
|
|
3470
3515
|
console.log(`[conversations] Claude ready in ${tmuxSession}`);
|
|
@@ -3477,7 +3522,7 @@ async function handleConversationSwitchModel(name, body) {
|
|
|
3477
3522
|
const currentHarness = conv.harness ?? "claude-code";
|
|
3478
3523
|
const requestedHarness = body["harness"];
|
|
3479
3524
|
let harness = currentHarness;
|
|
3480
|
-
if (requestedHarness === "ohmypi" || requestedHarness === "pi" || requestedHarness === "claude-code" || requestedHarness === "codex" || requestedHarness === "acp") {
|
|
3525
|
+
if (requestedHarness === "ohmypi" || requestedHarness === "pi" || requestedHarness === "claude-code" || requestedHarness === "codex" || requestedHarness === "acp" || requestedHarness === "kimi-code") {
|
|
3481
3526
|
const requestedRuntime = requestedHarness === "pi" ? "ohmypi" : requestedHarness;
|
|
3482
3527
|
if (requestedRuntime !== currentHarness) {
|
|
3483
3528
|
const policyModel = model ?? conv.model ?? "";
|
|
@@ -3647,6 +3692,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3647
3692
|
let piFields;
|
|
3648
3693
|
let codexFields;
|
|
3649
3694
|
let acpFields;
|
|
3695
|
+
let kimiCodeFields;
|
|
3650
3696
|
let codexTransport;
|
|
3651
3697
|
if (behavior.launchCommandKind === "acp-host") {
|
|
3652
3698
|
if (!model) throw new Error("ACP conversation requires a model");
|
|
@@ -3664,7 +3710,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3664
3710
|
runtimeCommand = await getAgentRuntimeBaseCommand(model, void 0, void 0, harness);
|
|
3665
3711
|
const mode = resolvePermissionModeSync();
|
|
3666
3712
|
if (!runtimeCommand.includes("--permission-mode")) runtimeCommand = `${runtimeCommand} --permission-mode ${mode === "auto" ? "auto" : BYPASS_PERMISSION_MODE}`;
|
|
3667
|
-
providerExportsStr = (await getProviderExportsForModel(model)).trim();
|
|
3713
|
+
providerExportsStr = (await getProviderExportsForModel(model, harness)).trim();
|
|
3668
3714
|
if (behavior.transcriptKind === "ohmypi-jsonl") {
|
|
3669
3715
|
if (getProviderForModelSync(model).name === "openai") {
|
|
3670
3716
|
const auth = await getOhmypiCodexAuthStatus({ refreshIfExpired: true });
|
|
@@ -3696,7 +3742,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3696
3742
|
const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
|
|
3697
3743
|
const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
|
|
3698
3744
|
const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
|
|
3699
|
-
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-
|
|
3745
|
+
const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-B3n_rkwn.js");
|
|
3700
3746
|
initCodexHome(codexHome, {
|
|
3701
3747
|
trustedDir: cwd,
|
|
3702
3748
|
approvalPolicy: codexApprovalPolicy,
|
|
@@ -3711,6 +3757,21 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3711
3757
|
codexSessionDir: join(codexHome, "sessions"),
|
|
3712
3758
|
resumeSessionId
|
|
3713
3759
|
};
|
|
3760
|
+
} else if (behavior.launchCommandKind === "kimi-code-tui") {
|
|
3761
|
+
let kimiResumeSessionId;
|
|
3762
|
+
if (resume) {
|
|
3763
|
+
const pinnedId = await readFile(join(getOverdeckHome(), "agents", tmuxSession, "kimi-session-id"), "utf-8").then((value) => value.trim() || void 0).catch(() => void 0);
|
|
3764
|
+
if (pinnedId) {
|
|
3765
|
+
const { kimiSessionsRoot } = await import("./kimi-code-D_Ppt82c.js");
|
|
3766
|
+
if (await stat$1(join(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd), pinnedId, "agents", "main", "wire.jsonl")).then(() => true, () => false)) kimiResumeSessionId = pinnedId;
|
|
3767
|
+
}
|
|
3768
|
+
}
|
|
3769
|
+
kimiCodeFields = {
|
|
3770
|
+
harness: "kimi-code",
|
|
3771
|
+
kimiCodeModel: model,
|
|
3772
|
+
kimiCodeYolo: true,
|
|
3773
|
+
...kimiResumeSessionId ? { resumeSessionId: kimiResumeSessionId } : {}
|
|
3774
|
+
};
|
|
3714
3775
|
}
|
|
3715
3776
|
}
|
|
3716
3777
|
let launcherModel = model;
|
|
@@ -3726,71 +3787,90 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
|
|
|
3726
3787
|
await writePtyToken(tmuxSession);
|
|
3727
3788
|
}
|
|
3728
3789
|
let channelsBridgeMcpConfig;
|
|
3729
|
-
if (!piFields && !codexFields && !acpFields && !plainFork && isClaudeCodeChannelsEnabled() && (!model || getProviderForModelSync(model).name === "anthropic") && process.env.CLAUDE_CODE_USE_BEDROCK !== "1" && process.env.CLAUDE_CODE_USE_VERTEX !== "1" && process.env.CLAUDE_CODE_USE_FOUNDRY !== "1" && process.env.OVERDECK_DOCKER_WORKSPACE !== "1" && process.env.PAN_DOCKER !== "1") {
|
|
3790
|
+
if (!piFields && !codexFields && !acpFields && !kimiCodeFields && !plainFork && isClaudeCodeChannelsEnabled() && (!model || getProviderForModelSync(model).name === "anthropic") && process.env.CLAUDE_CODE_USE_BEDROCK !== "1" && process.env.CLAUDE_CODE_USE_VERTEX !== "1" && process.env.CLAUDE_CODE_USE_FOUNDRY !== "1" && process.env.OVERDECK_DOCKER_WORKSPACE !== "1" && process.env.PAN_DOCKER !== "1") {
|
|
3730
3791
|
channelsBridgeMcpConfig = join(stateDir, "agent-mcp.json");
|
|
3731
3792
|
writeBridgeTokenSync(tmuxSession);
|
|
3732
3793
|
await writeChannelsBridgeMcpConfig(channelsBridgeMcpConfig, tmuxSession);
|
|
3733
3794
|
}
|
|
3734
|
-
const
|
|
3735
|
-
|
|
3736
|
-
|
|
3737
|
-
|
|
3738
|
-
|
|
3739
|
-
|
|
3740
|
-
|
|
3741
|
-
|
|
3742
|
-
|
|
3743
|
-
|
|
3744
|
-
|
|
3745
|
-
|
|
3746
|
-
|
|
3747
|
-
|
|
3748
|
-
|
|
3749
|
-
|
|
3750
|
-
|
|
3751
|
-
|
|
3752
|
-
|
|
3753
|
-
|
|
3754
|
-
|
|
3755
|
-
|
|
3756
|
-
|
|
3757
|
-
|
|
3758
|
-
|
|
3759
|
-
|
|
3760
|
-
|
|
3761
|
-
|
|
3762
|
-
|
|
3763
|
-
|
|
3764
|
-
|
|
3765
|
-
|
|
3766
|
-
|
|
3767
|
-
|
|
3768
|
-
|
|
3769
|
-
|
|
3770
|
-
|
|
3771
|
-
|
|
3772
|
-
|
|
3773
|
-
|
|
3774
|
-
|
|
3775
|
-
|
|
3776
|
-
|
|
3777
|
-
|
|
3778
|
-
|
|
3779
|
-
|
|
3780
|
-
|
|
3781
|
-
|
|
3782
|
-
|
|
3783
|
-
|
|
3784
|
-
|
|
3785
|
-
|
|
3786
|
-
|
|
3787
|
-
|
|
3788
|
-
|
|
3789
|
-
|
|
3790
|
-
|
|
3791
|
-
|
|
3792
|
-
|
|
3793
|
-
|
|
3795
|
+
const launchTmuxAndCaptureSession = async () => {
|
|
3796
|
+
let kimiExistingSessionsBefore;
|
|
3797
|
+
if (kimiCodeFields && !kimiCodeFields.resumeSessionId) try {
|
|
3798
|
+
const { kimiSessionsRoot } = await import("./kimi-code-D_Ppt82c.js");
|
|
3799
|
+
kimiExistingSessionsBefore = new Set(await readdir(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd)));
|
|
3800
|
+
} catch {
|
|
3801
|
+
kimiExistingSessionsBefore = /* @__PURE__ */ new Set();
|
|
3802
|
+
}
|
|
3803
|
+
const launcherTmp = `${launcherScript}.${randomUUID$1()}.tmp`;
|
|
3804
|
+
await writeFile(launcherTmp, generateLauncherScriptSync({
|
|
3805
|
+
role: "work",
|
|
3806
|
+
spawnMode: "conversation",
|
|
3807
|
+
workingDir: cwd,
|
|
3808
|
+
setTerminalEnv: true,
|
|
3809
|
+
unsetProviderEnv: true,
|
|
3810
|
+
overdeckEnv: {
|
|
3811
|
+
...issueId ? { issueId } : {},
|
|
3812
|
+
...piFields || codexFields || acpFields || useSupervisor ? { agentId: tmuxSession } : {}
|
|
3813
|
+
},
|
|
3814
|
+
extraEnvExports: [harnessLaunch.pathExport, `export OVERDECK_DASHBOARD_URL="http://127.0.0.1:${process.env["API_PORT"] ?? process.env["PORT"] ?? "3011"}"`],
|
|
3815
|
+
providerExports: providerExportsStr || void 0,
|
|
3816
|
+
trapHup: true,
|
|
3817
|
+
baseCommand: runtimeCommand,
|
|
3818
|
+
appendSystemPromptFiles: piFields ? await piConversationSystemPromptFiles(cwd) : codexFields || acpFields || kimiCodeFields ? [] : await claudeConversationSystemPromptFiles(cwd),
|
|
3819
|
+
model: launcherModel,
|
|
3820
|
+
...piFields ?? codexFields ?? acpFields ?? kimiCodeFields ?? {
|
|
3821
|
+
resumeSessionId: resume ? claudeSessionId : void 0,
|
|
3822
|
+
sessionId: resume ? void 0 : claudeSessionId
|
|
3823
|
+
},
|
|
3824
|
+
extraArgs: !piFields && !acpFields && !kimiCodeFields && effort ? `--effort "${effort}"` : void 0,
|
|
3825
|
+
keepAlive: true,
|
|
3826
|
+
fileMode: 448,
|
|
3827
|
+
channelsBridgeMcpConfig,
|
|
3828
|
+
useSupervisor,
|
|
3829
|
+
supervisorScriptPath
|
|
3830
|
+
}), { mode: 448 });
|
|
3831
|
+
await rename(launcherTmp, launcherScript);
|
|
3832
|
+
try {
|
|
3833
|
+
await Effect.runPromise(killSession(tmuxSession));
|
|
3834
|
+
} catch {}
|
|
3835
|
+
console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
|
|
3836
|
+
try {
|
|
3837
|
+
const { preTrustDirectory } = await import("./workspace-manager-C0CpNh3t.js");
|
|
3838
|
+
preTrustDirectory(cwd);
|
|
3839
|
+
} catch {}
|
|
3840
|
+
try {
|
|
3841
|
+
await Effect.runPromise(createSession(tmuxSession, cwd, `bash ${shellQuote(launcherScript)}`, { env: {
|
|
3842
|
+
...BLANKED_PROVIDER_ENV,
|
|
3843
|
+
TERM: "xterm-256color"
|
|
3844
|
+
} }));
|
|
3845
|
+
} catch (err) {
|
|
3846
|
+
if (err?.code === "ENOENT") throw new Error("tmux is not installed. Install it with: brew install tmux (macOS) or sudo apt-get install tmux (Linux)");
|
|
3847
|
+
throw err;
|
|
3848
|
+
}
|
|
3849
|
+
if (useSupervisor) await waitForPtySupervisorSocket(tmuxSession);
|
|
3850
|
+
if (behavior.usesCodexHome && codexFields?.codexHome && codexTransport === "tui") {
|
|
3851
|
+
const codexHomeDir = codexFields.codexHome;
|
|
3852
|
+
(async () => {
|
|
3853
|
+
try {
|
|
3854
|
+
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-B3n_rkwn.js");
|
|
3855
|
+
const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
|
|
3856
|
+
if (rollout) {
|
|
3857
|
+
const threadId = extractThreadIdFromRollout(rollout);
|
|
3858
|
+
if (threadId) writeThreadId(tmuxSession, threadId);
|
|
3859
|
+
}
|
|
3860
|
+
} catch {}
|
|
3861
|
+
})();
|
|
3862
|
+
}
|
|
3863
|
+
if (kimiCodeFields && kimiExistingSessionsBefore) {
|
|
3864
|
+
const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-D_Ppt82c.js");
|
|
3865
|
+
const sessionId = await waitForNewKimiSessionAsync(join(homedir(), ".kimi-code"), cwd, kimiExistingSessionsBefore);
|
|
3866
|
+
if (!sessionId) throw new Error(`kimi-code session capture timed out for ${tmuxSession} — no new session directory appeared under the workspace bucket`);
|
|
3867
|
+
writeKimiSessionId(tmuxSession, sessionId);
|
|
3868
|
+
}
|
|
3869
|
+
};
|
|
3870
|
+
if (kimiCodeFields) {
|
|
3871
|
+
const { withKimiSessionCaptureLock } = await import("./kimi-code-D_Ppt82c.js");
|
|
3872
|
+
await withKimiSessionCaptureLock(join(homedir(), ".kimi-code"), cwd, launchTmuxAndCaptureSession);
|
|
3873
|
+
} else await launchTmuxAndCaptureSession();
|
|
3794
3874
|
if (channelsBridgeMcpConfig) dismissDevChannelsDialog(tmuxSession).catch((err) => {
|
|
3795
3875
|
const msg = err instanceof Error ? err.message : String(err);
|
|
3796
3876
|
console.error(`[conversations] dismissDevChannelsDialog failed for ${tmuxSession}: ${msg}`);
|
|
@@ -3865,7 +3945,7 @@ async function handleConversationCreate(body, deps) {
|
|
|
3865
3945
|
} catch (spawnErr) {
|
|
3866
3946
|
const msg = spawnErr instanceof Error ? spawnErr.message : String(spawnErr);
|
|
3867
3947
|
console.error(`[conversations] background spawn failed for ${tmuxSession}: ${msg}`);
|
|
3868
|
-
if (harness === "acp") await stopConversationRuntime(conv, name);
|
|
3948
|
+
if (harness === "acp" || harness === "kimi-code") await stopConversationRuntime(conv, name);
|
|
3869
3949
|
updateSpawnError(name, msg);
|
|
3870
3950
|
getEventStore().emitOnly({
|
|
3871
3951
|
type: "conversation.created",
|
|
@@ -3943,13 +4023,7 @@ async function handleConversationResume(name, body, deps) {
|
|
|
3943
4023
|
await spawnConversationSession(conv.tmuxSession, conv.cwd, oldSessionId ?? randomUUID$1(), model, effort, conv.issueId ?? void 0, canResume, harness);
|
|
3944
4024
|
await waitForTmuxSession(conv.tmuxSession);
|
|
3945
4025
|
await waitForConversationRuntimeReady(conv.tmuxSession, harness, "respawn");
|
|
3946
|
-
|
|
3947
|
-
if (resumeGatePane && paneHasBlockingChoiceMenu(resumeGatePane)) console.log(`[conversations] resume contract skipped for ${name} — the harness is showing a blocking choice menu; the operator answers it`);
|
|
3948
|
-
else try {
|
|
3949
|
-
await deliverAgentMessage(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv));
|
|
3950
|
-
} catch (err) {
|
|
3951
|
-
console.error(`[conversations] resume contract delivery failed for ${name}:`, err instanceof Error ? err.message : String(err));
|
|
3952
|
-
}
|
|
4026
|
+
await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv));
|
|
3953
4027
|
markConversationActive(name);
|
|
3954
4028
|
return jsonResponse({
|
|
3955
4029
|
...conv,
|
|
@@ -3960,7 +4034,7 @@ async function handleConversationResume(name, body, deps) {
|
|
|
3960
4034
|
sessionAlive: true
|
|
3961
4035
|
});
|
|
3962
4036
|
} catch (error) {
|
|
3963
|
-
if (harness === "acp") await stopConversationRuntime(conv, name);
|
|
4037
|
+
if (harness === "acp" || harness === "kimi-code") await stopConversationRuntime(conv, name);
|
|
3964
4038
|
throw error;
|
|
3965
4039
|
} finally {
|
|
3966
4040
|
respawn.done();
|
|
@@ -4016,7 +4090,7 @@ async function handleConversationRestartAll(deps) {
|
|
|
4016
4090
|
} catch (err) {
|
|
4017
4091
|
const msg = err instanceof Error ? err.message : String(err);
|
|
4018
4092
|
console.error(`[conversations] Failed to restart ${conv.name}:`, msg);
|
|
4019
|
-
if (attemptedHarness === "acp") await stopConversationRuntime(conv, conv.name);
|
|
4093
|
+
if (attemptedHarness === "acp" || attemptedHarness === "kimi-code") await stopConversationRuntime(conv, conv.name);
|
|
4020
4094
|
results.push({
|
|
4021
4095
|
name: conv.name,
|
|
4022
4096
|
model: conv.model,
|
|
@@ -4039,6 +4113,7 @@ async function handleConversationRestartAll(deps) {
|
|
|
4039
4113
|
}
|
|
4040
4114
|
//#endregion
|
|
4041
4115
|
//#region ../../lib/overdeck/conversation-delivery.ts
|
|
4116
|
+
init_agent_input_detection();
|
|
4042
4117
|
init_conversations();
|
|
4043
4118
|
init_behavior();
|
|
4044
4119
|
init_config_yaml();
|
|
@@ -4431,6 +4506,101 @@ function asRecord(value) {
|
|
|
4431
4506
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
4432
4507
|
}
|
|
4433
4508
|
//#endregion
|
|
4509
|
+
//#region ../../lib/session-pane-choice.ts
|
|
4510
|
+
init_pane_choice_menu();
|
|
4511
|
+
init_tmux();
|
|
4512
|
+
const PANE_CAPTURE_LINES = 90;
|
|
4513
|
+
const KEYSTROKE_GAP_MS = 60;
|
|
4514
|
+
const DELIVERY_CONFIRM_WAIT_MS = 700;
|
|
4515
|
+
async function captureSessionPaneChoice(sessionName, capture = capturePaneText) {
|
|
4516
|
+
let pane;
|
|
4517
|
+
try {
|
|
4518
|
+
pane = await capture(sessionName, PANE_CAPTURE_LINES);
|
|
4519
|
+
} catch {
|
|
4520
|
+
return null;
|
|
4521
|
+
}
|
|
4522
|
+
const menu = parsePaneChoiceMenu(pane);
|
|
4523
|
+
if (!menu) return null;
|
|
4524
|
+
return {
|
|
4525
|
+
signature: paneChoiceMenuSignature(menu),
|
|
4526
|
+
title: menu.title,
|
|
4527
|
+
contextLines: menu.contextLines,
|
|
4528
|
+
options: menu.options.map((option) => ({
|
|
4529
|
+
number: option.number,
|
|
4530
|
+
label: option.label,
|
|
4531
|
+
recommended: option.recommended
|
|
4532
|
+
})),
|
|
4533
|
+
selectedIndex: menu.selectedIndex,
|
|
4534
|
+
footerHint: menu.footerHint,
|
|
4535
|
+
confidence: menu.confidence
|
|
4536
|
+
};
|
|
4537
|
+
}
|
|
4538
|
+
async function answerSessionPaneChoice(sessionName, body, deps = {}) {
|
|
4539
|
+
try {
|
|
4540
|
+
const selectedIndex = Number(body.selectedIndex);
|
|
4541
|
+
const signature = typeof body.signature === "string" ? body.signature : "";
|
|
4542
|
+
if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex > 8) return {
|
|
4543
|
+
body: { error: "selectedIndex must be an integer 0-8" },
|
|
4544
|
+
status: 400
|
|
4545
|
+
};
|
|
4546
|
+
if (!signature) return {
|
|
4547
|
+
body: { error: "signature is required" },
|
|
4548
|
+
status: 400
|
|
4549
|
+
};
|
|
4550
|
+
if (!await (deps.sessionExists ?? ((name) => Effect.runPromise(sessionExists(name))))(sessionName)) return {
|
|
4551
|
+
body: { error: "Conversation session is not running" },
|
|
4552
|
+
status: 409
|
|
4553
|
+
};
|
|
4554
|
+
const capture = deps.capture ?? capturePaneText;
|
|
4555
|
+
const sendKey = deps.sendKey ?? ((name, key) => Effect.runPromise(sendRawKeystroke(name, key, "pane-choice")));
|
|
4556
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
4557
|
+
const menu = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
|
|
4558
|
+
if (!menu) return {
|
|
4559
|
+
body: {
|
|
4560
|
+
error: "The choice menu is no longer on screen",
|
|
4561
|
+
code: "menu-gone"
|
|
4562
|
+
},
|
|
4563
|
+
status: 409
|
|
4564
|
+
};
|
|
4565
|
+
if (paneChoiceMenuSignature(menu) !== signature) return {
|
|
4566
|
+
body: {
|
|
4567
|
+
error: "The choice menu changed since the card was rendered — refresh and re-answer",
|
|
4568
|
+
code: "menu-changed"
|
|
4569
|
+
},
|
|
4570
|
+
status: 409
|
|
4571
|
+
};
|
|
4572
|
+
if (selectedIndex >= menu.options.length) return {
|
|
4573
|
+
body: { error: `selectedIndex out of range (0-${menu.options.length - 1})` },
|
|
4574
|
+
status: 400
|
|
4575
|
+
};
|
|
4576
|
+
const keys = buildChoiceKeystrokes(menu, selectedIndex);
|
|
4577
|
+
for (const key of keys) {
|
|
4578
|
+
await sendKey(sessionName, key);
|
|
4579
|
+
await sleep(KEYSTROKE_GAP_MS);
|
|
4580
|
+
}
|
|
4581
|
+
await sleep(DELIVERY_CONFIRM_WAIT_MS);
|
|
4582
|
+
const after = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
|
|
4583
|
+
if (after && paneChoiceMenuSignature(after) === signature) return {
|
|
4584
|
+
body: {
|
|
4585
|
+
error: "Keystrokes were sent but the menu is still on screen — answer it from the terminal",
|
|
4586
|
+
code: "delivery-unconfirmed"
|
|
4587
|
+
},
|
|
4588
|
+
status: 409
|
|
4589
|
+
};
|
|
4590
|
+
return { body: {
|
|
4591
|
+
ok: true,
|
|
4592
|
+
answeredLabel: menu.options[selectedIndex].label
|
|
4593
|
+
} };
|
|
4594
|
+
} catch (error) {
|
|
4595
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
4596
|
+
console.error("[sessions] pane-choice answer failed:", message);
|
|
4597
|
+
return {
|
|
4598
|
+
body: { error: "Internal server error" },
|
|
4599
|
+
status: 500
|
|
4600
|
+
};
|
|
4601
|
+
}
|
|
4602
|
+
}
|
|
4603
|
+
//#endregion
|
|
4434
4604
|
//#region ../../lib/channels/permission-payload.ts
|
|
4435
4605
|
const CHANNEL_PERMISSION_LIMITS = {
|
|
4436
4606
|
requestIdBytes: 128,
|
|
@@ -4619,8 +4789,53 @@ async function processPermissionResponse(deps, args) {
|
|
|
4619
4789
|
//#endregion
|
|
4620
4790
|
//#region routes/agents/permissions.ts
|
|
4621
4791
|
init_agents$1();
|
|
4792
|
+
init_agent_enrichment();
|
|
4622
4793
|
init_activity_logger();
|
|
4623
4794
|
init_read_model();
|
|
4795
|
+
async function handleGetAgentPaneChoice(agentId, deps = {}) {
|
|
4796
|
+
if (!agentId.trim()) return {
|
|
4797
|
+
body: { error: "missing agent id" },
|
|
4798
|
+
status: 400
|
|
4799
|
+
};
|
|
4800
|
+
const paneChoice = await (deps.captureSessionPaneChoice ?? captureSessionPaneChoice)(agentId);
|
|
4801
|
+
return paneChoice ? { body: {
|
|
4802
|
+
pending: true,
|
|
4803
|
+
...paneChoice
|
|
4804
|
+
} } : { body: { pending: false } };
|
|
4805
|
+
}
|
|
4806
|
+
async function handlePostAgentPaneChoice(agentId, body, deps = {}) {
|
|
4807
|
+
if (!agentId.trim()) return {
|
|
4808
|
+
body: { error: "missing agent id" },
|
|
4809
|
+
status: 400
|
|
4810
|
+
};
|
|
4811
|
+
const agentState = await (deps.getAgentState ?? ((id) => Effect.runPromise(getAgentState(id))))(agentId);
|
|
4812
|
+
if (!agentState) return {
|
|
4813
|
+
body: { error: `Agent ${agentId} not found` },
|
|
4814
|
+
status: 404
|
|
4815
|
+
};
|
|
4816
|
+
const result = await (deps.answerSessionPaneChoice ?? answerSessionPaneChoice)(agentId, body);
|
|
4817
|
+
const answeredLabel = result.body["answeredLabel"];
|
|
4818
|
+
if (result.status === void 0 && result.body["ok"] === true && typeof answeredLabel === "string") (deps.emitActivityEntry ?? emitActivityEntrySync)({
|
|
4819
|
+
source: "dashboard",
|
|
4820
|
+
level: "info",
|
|
4821
|
+
issueId: agentState.issueId,
|
|
4822
|
+
message: `Operator answered ${agentId}'s pane menu: ${answeredLabel}`
|
|
4823
|
+
});
|
|
4824
|
+
return result;
|
|
4825
|
+
}
|
|
4826
|
+
const getAgentPaneChoiceRoute = HttpRouter.add("GET", "/api/agents/:id/pane-choice", httpHandler(Effect.gen(function* () {
|
|
4827
|
+
const params = yield* HttpRouter.params;
|
|
4828
|
+
const result = yield* Effect.promise(() => handleGetAgentPaneChoice(params["id"] ?? ""));
|
|
4829
|
+
return jsonResponse(result.body, { status: result.status });
|
|
4830
|
+
})));
|
|
4831
|
+
const postAgentPaneChoiceRoute = HttpRouter.add("POST", "/api/agents/:id/pane-choice", httpHandler(Effect.gen(function* () {
|
|
4832
|
+
const originCheck = validateOrigin(yield* HttpServerRequest.HttpServerRequest);
|
|
4833
|
+
if (!originCheck.ok) return jsonResponse({ error: originCheck.error }, { status: 403 });
|
|
4834
|
+
const params = yield* HttpRouter.params;
|
|
4835
|
+
const body = yield* readJsonBody$1;
|
|
4836
|
+
const result = yield* Effect.promise(() => handlePostAgentPaneChoice(params["id"] ?? "", body));
|
|
4837
|
+
return jsonResponse(result.body, { status: result.status });
|
|
4838
|
+
})));
|
|
4624
4839
|
const getAgentPendingQuestionsRoute = HttpRouter.add("GET", "/api/agents/:id/pending-questions", httpHandler(Effect.gen(function* () {
|
|
4625
4840
|
const questions = yield* getAgentPendingQuestions((yield* HttpRouter.params)["id"] ?? "");
|
|
4626
4841
|
return jsonResponse({
|
|
@@ -4681,7 +4896,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
|
|
|
4681
4896
|
error: "missing agent id"
|
|
4682
4897
|
}, { status: 400 });
|
|
4683
4898
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
4684
|
-
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-
|
|
4899
|
+
const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-Djkj-yqK.js"));
|
|
4685
4900
|
const expected = getInternalTokenSync();
|
|
4686
4901
|
if (!expected) return jsonResponse({
|
|
4687
4902
|
ok: false,
|
|
@@ -4968,7 +5183,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
|
|
|
4968
5183
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
4969
5184
|
const urlOpt = HttpServerRequest.toURL(request);
|
|
4970
5185
|
const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
|
|
4971
|
-
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-
|
|
5186
|
+
const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-qo7Ss34U.js"));
|
|
4972
5187
|
const endTime = /* @__PURE__ */ new Date();
|
|
4973
5188
|
const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
|
|
4974
5189
|
const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
|
|
@@ -4983,7 +5198,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
|
|
|
4983
5198
|
return Effect.gen(function* () {
|
|
4984
5199
|
let eventBody = body;
|
|
4985
5200
|
if (body["kind"] === "linear_mcp_auth_required" || body["kind"] === "linear_mcp_auth_healthy") {
|
|
4986
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
5201
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DK1Vay1E.js"));
|
|
4987
5202
|
const snapshot = yield* (yield* AgentStateService).get(id);
|
|
4988
5203
|
eventBody = {
|
|
4989
5204
|
...body,
|
|
@@ -5018,7 +5233,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
|
|
|
5018
5233
|
detail: String(decoded.failure)
|
|
5019
5234
|
}, { status: 400 })
|
|
5020
5235
|
};
|
|
5021
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
5236
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DK1Vay1E.js"));
|
|
5022
5237
|
yield* (yield* AgentStateService).emit(decoded.success);
|
|
5023
5238
|
return {
|
|
5024
5239
|
ok: true,
|
|
@@ -5100,7 +5315,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
|
|
|
5100
5315
|
success: false,
|
|
5101
5316
|
error: "missing agent id"
|
|
5102
5317
|
}, { status: 400 });
|
|
5103
|
-
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-
|
|
5318
|
+
const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DK1Vay1E.js"));
|
|
5104
5319
|
const snapshot = yield* (yield* AgentStateService).get(id);
|
|
5105
5320
|
if (!snapshot) return jsonResponse({
|
|
5106
5321
|
success: false,
|
|
@@ -5168,7 +5383,12 @@ function writeProjectionRows(db, state, event) {
|
|
|
5168
5383
|
const record = event;
|
|
5169
5384
|
const timestamp = record["timestamp"] ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
5170
5385
|
const timestampMs = new Date(timestamp).getTime();
|
|
5171
|
-
const
|
|
5386
|
+
const rawPayload = record["payload"] ?? {};
|
|
5387
|
+
const payloadRecord = rawPayload.workspaceId === void 0 ? {
|
|
5388
|
+
...rawPayload,
|
|
5389
|
+
workspaceId: getWorkspaceForIssue(state.issueId)?.id
|
|
5390
|
+
} : rawPayload;
|
|
5391
|
+
const payload = JSON.stringify(payloadRecord);
|
|
5172
5392
|
const updatedAt = Date.now();
|
|
5173
5393
|
db.prepare(`INSERT OR IGNORE INTO issues (id, stage, updated_at) VALUES (?, 'working', ?)`).run(state.issueId, updatedAt);
|
|
5174
5394
|
db.prepare(`INSERT OR REPLACE INTO agents (${AGENT_COLUMNS_FOR_DB.join(", ")}) VALUES (${AGENT_COLUMNS_FOR_DB.map(() => "?").join(", ")})`).run(...stateToOverdeckParamsForDb(state, updatedAt));
|
|
@@ -5176,7 +5396,10 @@ function writeProjectionRows(db, state, event) {
|
|
|
5176
5396
|
const sequence = db.prepare(`SELECT last_insert_rowid() AS sequence`).get()?.sequence ?? 0;
|
|
5177
5397
|
return {
|
|
5178
5398
|
sequence,
|
|
5179
|
-
stored: buildStoredEvent(
|
|
5399
|
+
stored: buildStoredEvent({
|
|
5400
|
+
...event,
|
|
5401
|
+
payload: payloadRecord
|
|
5402
|
+
}, sequence)
|
|
5180
5403
|
};
|
|
5181
5404
|
}
|
|
5182
5405
|
function emitCommittedProjection(eventStore, state, event, rows) {
|
|
@@ -5285,8 +5508,8 @@ function createAgentStopHandler(lifecycleEvent) {
|
|
|
5285
5508
|
yield* stopAgent(id);
|
|
5286
5509
|
if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
|
|
5287
5510
|
try {
|
|
5288
|
-
const { resolveProjectFromIssueSync } = await import("./projects-
|
|
5289
|
-
const { findWorkspacePath } = await import("./archive-planning-
|
|
5511
|
+
const { resolveProjectFromIssueSync } = await import("./projects-WqMWCdpa.js");
|
|
5512
|
+
const { findWorkspacePath } = await import("./archive-planning-MbkGCBIY.js");
|
|
5290
5513
|
const issueLower = stateBeforeStop.issueId.toLowerCase();
|
|
5291
5514
|
const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
|
|
5292
5515
|
if (workspacePath) {
|
|
@@ -5426,7 +5649,7 @@ const postAgentUnpauseRoute = HttpRouter.add("POST", "/api/agents/:id/unpause",
|
|
|
5426
5649
|
if ((yield* getWorkAgentLifecycleState(id)).canResumeSession && updatedState.troubled !== true) {
|
|
5427
5650
|
resumeTriggered = true;
|
|
5428
5651
|
yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.unpause_immediate_resume_triggered"));
|
|
5429
|
-
import("./resume-
|
|
5652
|
+
import("./resume-9thEqAQR.js").then(({ resumeAgent }) => resumeAgent(id)).then((result) => {
|
|
5430
5653
|
if (!result.success) console.warn(`[agents] immediate resume after unpause failed for ${id}: ${result.error}`);
|
|
5431
5654
|
}).catch((err) => console.warn(`[agents] immediate resume after unpause errored for ${id}:`, err));
|
|
5432
5655
|
}
|
|
@@ -5476,6 +5699,9 @@ init_operator_interventions();
|
|
|
5476
5699
|
init_projects();
|
|
5477
5700
|
init_tmux();
|
|
5478
5701
|
init_domain_services();
|
|
5702
|
+
function pendingDecisionError(agentId, issueId, decision) {
|
|
5703
|
+
return `Agent ${agentId} is waiting on an operator decision (${decision.reason.replaceAll("_", " ")}). Answer it with 'pan answer ${issueId}' or open the Decisions panel; pass {force:true} to discard it deliberately.`;
|
|
5704
|
+
}
|
|
5479
5705
|
const postAgentResumeRoute = HttpRouter.add("POST", "/api/agents/:id/resume", httpHandler(Effect.gen(function* () {
|
|
5480
5706
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
5481
5707
|
const { message, model, harness, compact } = yield* readJsonBody$1;
|
|
@@ -5567,7 +5793,7 @@ const postAgentRecoverRoute = HttpRouter.add("POST", "/api/agents/:id/recover",
|
|
|
5567
5793
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
5568
5794
|
const body = yield* readJsonBody$1;
|
|
5569
5795
|
yield* EventStoreService;
|
|
5570
|
-
const { model } = body;
|
|
5796
|
+
const { model, force = false } = body;
|
|
5571
5797
|
let recoveryModel;
|
|
5572
5798
|
try {
|
|
5573
5799
|
recoveryModel = normalizeModelOverrideSync(model);
|
|
@@ -5576,8 +5802,19 @@ const postAgentRecoverRoute = HttpRouter.add("POST", "/api/agents/:id/recover",
|
|
|
5576
5802
|
}
|
|
5577
5803
|
const stateBeforeRecover = yield* getAgentState(id);
|
|
5578
5804
|
if (!stateBeforeRecover) return jsonResponse({ error: `Agent ${id} not found` }, { status: 404 });
|
|
5805
|
+
if (!force) {
|
|
5806
|
+
const pendingDecision = yield* Effect.promise(() => detectPendingOperatorDecision(id));
|
|
5807
|
+
if (pendingDecision) return jsonResponse({
|
|
5808
|
+
error: pendingDecisionError(id, stateBeforeRecover.issueId, pendingDecision),
|
|
5809
|
+
code: "pending-operator-decision",
|
|
5810
|
+
pendingDecision
|
|
5811
|
+
}, { status: 409 });
|
|
5812
|
+
}
|
|
5579
5813
|
yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.recover_requested", { model: recoveryModel || void 0 }));
|
|
5580
|
-
if (!(yield* Effect.promise(() => recoverAgent(id,
|
|
5814
|
+
if (!(yield* Effect.promise(() => recoverAgent(id, {
|
|
5815
|
+
...recoveryModel ? { modelOverride: recoveryModel } : {},
|
|
5816
|
+
force
|
|
5817
|
+
})))) {
|
|
5581
5818
|
const error = `Could not recover agent ${id}`;
|
|
5582
5819
|
yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.recover_failed", { error }));
|
|
5583
5820
|
return jsonResponse({
|
|
@@ -5616,7 +5853,7 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
|
|
|
5616
5853
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
5617
5854
|
const body = yield* readJsonBody$1;
|
|
5618
5855
|
const eventStore = yield* EventStoreService;
|
|
5619
|
-
const { model, harness, graceful = true, message } = body;
|
|
5856
|
+
const { model, harness, graceful = true, message, force = false } = body;
|
|
5620
5857
|
let restartModel;
|
|
5621
5858
|
try {
|
|
5622
5859
|
restartModel = normalizeModelOverrideSync(model);
|
|
@@ -5625,6 +5862,14 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
|
|
|
5625
5862
|
}
|
|
5626
5863
|
const agentState = yield* getAgentState(id);
|
|
5627
5864
|
if (!agentState) return jsonResponse({ error: `Agent ${id} not found` }, { status: 404 });
|
|
5865
|
+
if (!force) {
|
|
5866
|
+
const pendingDecision = yield* Effect.promise(() => detectPendingOperatorDecision(id));
|
|
5867
|
+
if (pendingDecision) return jsonResponse({
|
|
5868
|
+
error: pendingDecisionError(id, agentState.issueId, pendingDecision),
|
|
5869
|
+
code: "pending-operator-decision",
|
|
5870
|
+
pendingDecision
|
|
5871
|
+
}, { status: 409 });
|
|
5872
|
+
}
|
|
5628
5873
|
yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.restart_requested", {
|
|
5629
5874
|
model: restartModel || agentState.model,
|
|
5630
5875
|
harness: harness || void 0,
|
|
@@ -5651,10 +5896,11 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
|
|
|
5651
5896
|
model: restartModel,
|
|
5652
5897
|
harness,
|
|
5653
5898
|
graceful: true,
|
|
5654
|
-
message
|
|
5899
|
+
message,
|
|
5900
|
+
force
|
|
5655
5901
|
});
|
|
5656
|
-
if (result.success) {
|
|
5657
|
-
const updatedState = await Effect.runPromise(getAgentState(id));
|
|
5902
|
+
if (result.success || result.code === "pending-operator-decision") {
|
|
5903
|
+
const updatedState = result.success ? await Effect.runPromise(getAgentState(id)) : agentState;
|
|
5658
5904
|
if (updatedState) await Effect.runPromise(saveAgentStateAndEmitEventProgram(updatedState, {
|
|
5659
5905
|
type: "agent.started",
|
|
5660
5906
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -5696,7 +5942,8 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
|
|
|
5696
5942
|
model: restartModel,
|
|
5697
5943
|
harness,
|
|
5698
5944
|
graceful: false,
|
|
5699
|
-
message
|
|
5945
|
+
message,
|
|
5946
|
+
force
|
|
5700
5947
|
}));
|
|
5701
5948
|
if (result.success) {
|
|
5702
5949
|
const updatedState = yield* getAgentState(id);
|
|
@@ -5742,11 +5989,16 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
|
|
|
5742
5989
|
model: restartModel || agentState.model
|
|
5743
5990
|
});
|
|
5744
5991
|
}
|
|
5992
|
+
if (result.code === "pending-operator-decision") return jsonResponse({
|
|
5993
|
+
error: result.error,
|
|
5994
|
+
code: result.code,
|
|
5995
|
+
pendingDecision: result.pendingDecision
|
|
5996
|
+
}, { status: 409 });
|
|
5745
5997
|
return jsonResponse({ error: result.error }, { status: 500 });
|
|
5746
5998
|
})));
|
|
5747
5999
|
const postAgentRestartFreshRoute = HttpRouter.add("POST", "/api/agents/:id/restart-fresh", httpHandler(Effect.gen(function* () {
|
|
5748
6000
|
const id = (yield* HttpRouter.params)["id"] ?? "";
|
|
5749
|
-
const { spawn: spawnFlag, model: rawModel, harness } = yield* readJsonBody$1;
|
|
6001
|
+
const { spawn: spawnFlag, model: rawModel, harness, force = false } = yield* readJsonBody$1;
|
|
5750
6002
|
const wantsSpawn = spawnFlag !== false;
|
|
5751
6003
|
let newModel;
|
|
5752
6004
|
if (wantsSpawn && rawModel) try {
|
|
@@ -5762,6 +6014,21 @@ const postAgentRestartFreshRoute = HttpRouter.add("POST", "/api/agents/:id/resta
|
|
|
5762
6014
|
error: `${issueId} is already ${issueStage?.replaceAll("_", " ")}. Reopen the issue before starting fresh work.`,
|
|
5763
6015
|
issueStage
|
|
5764
6016
|
}, { status: 409 });
|
|
6017
|
+
const spawnModel = newModel ?? agentState.model ?? "claude-sonnet-5";
|
|
6018
|
+
let effectiveHarness = null;
|
|
6019
|
+
if (wantsSpawn && harness) {
|
|
6020
|
+
const harnessDecision = yield* Effect.promise(async () => canUseHarnessSync(harness, spawnModel, await getProviderAuthMode(spawnModel)));
|
|
6021
|
+
if (!harnessDecision.allowed) return jsonResponse({ error: harnessDecision.reason ?? `Harness "${harness}" is not allowed for model "${spawnModel}".` }, { status: 400 });
|
|
6022
|
+
effectiveHarness = harness;
|
|
6023
|
+
}
|
|
6024
|
+
if (!force) {
|
|
6025
|
+
const pendingDecision = yield* Effect.promise(() => detectPendingOperatorDecision(id));
|
|
6026
|
+
if (pendingDecision) return jsonResponse({
|
|
6027
|
+
error: pendingDecisionError(id, issueId, pendingDecision),
|
|
6028
|
+
code: "pending-operator-decision",
|
|
6029
|
+
pendingDecision
|
|
6030
|
+
}, { status: 409 });
|
|
6031
|
+
}
|
|
5765
6032
|
const lifecycle = yield* getWorkAgentLifecycleState(id);
|
|
5766
6033
|
if (lifecycle.hasLiveTmuxSession) return jsonResponse({
|
|
5767
6034
|
error: `Agent ${id} has a live tmux session. Run 'pan kill ${id}' to stop only this work agent, then retry.`,
|
|
@@ -5790,9 +6057,6 @@ const postAgentRestartFreshRoute = HttpRouter.add("POST", "/api/agents/:id/resta
|
|
|
5790
6057
|
hint: "Agent dir wiped. Click Start agent to respawn with a fresh session."
|
|
5791
6058
|
});
|
|
5792
6059
|
}
|
|
5793
|
-
const spawnModel = newModel ?? agentState.model ?? "claude-sonnet-5";
|
|
5794
|
-
let effectiveHarness = null;
|
|
5795
|
-
if (harness) effectiveHarness = (yield* Effect.promise(async () => canUseHarnessSync(harness, spawnModel, await getProviderAuthMode(spawnModel)))).allowed ? harness : "claude-code";
|
|
5796
6060
|
const agentSessionName = `agent-${issueId.toLowerCase()}`;
|
|
5797
6061
|
const projectPath = agentState.workspace ? dirname(agentState.workspace) : void 0;
|
|
5798
6062
|
const projectRoot = resolveProjectFromIssueSync(issueId)?.projectPath ?? projectPath ?? process.cwd();
|
|
@@ -5862,18 +6126,29 @@ const postAgentRestartFreshRoute = HttpRouter.add("POST", "/api/agents/:id/resta
|
|
|
5862
6126
|
});
|
|
5863
6127
|
})));
|
|
5864
6128
|
const postAgentsRestartAllRoute = HttpRouter.add("POST", "/api/agents/restart-all", Effect.gen(function* () {
|
|
6129
|
+
const { force = false } = yield* readJsonBody$1;
|
|
5865
6130
|
return yield* Effect.promise(async () => {
|
|
5866
6131
|
try {
|
|
5867
6132
|
const running = (await Effect.runPromise(listRunningAgents())).filter((a) => a.tmuxActive);
|
|
5868
6133
|
const results = [];
|
|
5869
6134
|
for (const agent of running) try {
|
|
5870
|
-
const result = await restartAgent(agent.id, {
|
|
6135
|
+
const result = await restartAgent(agent.id, {
|
|
6136
|
+
graceful: false,
|
|
6137
|
+
force
|
|
6138
|
+
});
|
|
5871
6139
|
if (result.success) results.push({
|
|
5872
6140
|
id: agent.id,
|
|
5873
6141
|
issueId: agent.issueId,
|
|
5874
6142
|
model: agent.model,
|
|
5875
6143
|
status: "restarted"
|
|
5876
6144
|
});
|
|
6145
|
+
else if (result.code === "pending-operator-decision") results.push({
|
|
6146
|
+
id: agent.id,
|
|
6147
|
+
issueId: agent.issueId,
|
|
6148
|
+
model: agent.model,
|
|
6149
|
+
status: "skipped",
|
|
6150
|
+
pendingReason: result.pendingDecision?.reason
|
|
6151
|
+
});
|
|
5877
6152
|
else results.push({
|
|
5878
6153
|
id: agent.id,
|
|
5879
6154
|
issueId: agent.issueId,
|
|
@@ -5891,10 +6166,15 @@ const postAgentsRestartAllRoute = HttpRouter.add("POST", "/api/agents/restart-al
|
|
|
5891
6166
|
});
|
|
5892
6167
|
}
|
|
5893
6168
|
const succeeded = results.filter((r) => r.status === "restarted").length;
|
|
6169
|
+
const skipped = results.filter((r) => r.status === "skipped").map((r) => ({
|
|
6170
|
+
id: r.id,
|
|
6171
|
+
reason: r.pendingReason
|
|
6172
|
+
}));
|
|
5894
6173
|
console.log(`[agents] Restarted ${succeeded}/${running.length} workspace agents`);
|
|
5895
6174
|
return jsonResponse({
|
|
5896
6175
|
restarted: succeeded,
|
|
5897
6176
|
total: running.length,
|
|
6177
|
+
skipped,
|
|
5898
6178
|
results
|
|
5899
6179
|
});
|
|
5900
6180
|
} catch (error) {
|
|
@@ -6050,7 +6330,7 @@ async function resolveCurrentStaffing(agentId, agentState, issueId) {
|
|
|
6050
6330
|
}
|
|
6051
6331
|
}
|
|
6052
6332
|
const postAgentsRestartWithConfigRoute = HttpRouter.add("POST", "/api/agents/restart-with-current-config", httpHandler(Effect.gen(function* () {
|
|
6053
|
-
const { agentIds } = yield* readJsonBody$1;
|
|
6333
|
+
const { agentIds, force = false } = yield* readJsonBody$1;
|
|
6054
6334
|
if (!agentIds || !Array.isArray(agentIds) || agentIds.length === 0) return jsonResponse({ error: "agentIds array is required and must not be empty" }, { status: 400 });
|
|
6055
6335
|
const eligibleAgents = yield* Effect.promise(() => buildRestartConfigChangeList());
|
|
6056
6336
|
const eligibleIds = new Set(eligibleAgents.map((a) => a.agentId));
|
|
@@ -6088,7 +6368,8 @@ const postAgentsRestartWithConfigRoute = HttpRouter.add("POST", "/api/agents/res
|
|
|
6088
6368
|
const restartResult = yield* Effect.promise(() => restartAgent(agentId, {
|
|
6089
6369
|
model: newModel,
|
|
6090
6370
|
harness: newHarness,
|
|
6091
|
-
graceful: false
|
|
6371
|
+
graceful: false,
|
|
6372
|
+
force
|
|
6092
6373
|
}));
|
|
6093
6374
|
if (restartResult.success) results.push({
|
|
6094
6375
|
id: agentId,
|
|
@@ -6098,7 +6379,7 @@ const postAgentsRestartWithConfigRoute = HttpRouter.add("POST", "/api/agents/res
|
|
|
6098
6379
|
});
|
|
6099
6380
|
else results.push({
|
|
6100
6381
|
id: agentId,
|
|
6101
|
-
status: "failed",
|
|
6382
|
+
status: restartResult.code === "pending-operator-decision" ? "skipped" : "failed",
|
|
6102
6383
|
error: restartResult.error
|
|
6103
6384
|
});
|
|
6104
6385
|
} catch (err) {
|
|
@@ -6595,7 +6876,6 @@ async function withActiveOrderDispatchReservation(projectRoot, issueId, options,
|
|
|
6595
6876
|
}
|
|
6596
6877
|
//#endregion
|
|
6597
6878
|
//#region ../../lib/xbrief/auto-synthesize.ts
|
|
6598
|
-
init_io();
|
|
6599
6879
|
function cleanMarkdownLine(line) {
|
|
6600
6880
|
return line.replace(/^[-*+]\s+\[[ xX]\]\s+/, "").replace(/^[-*+]\s+/, "").replace(/^#+\s+/, "").replace(/`([^`]+)`/g, "$1").trim();
|
|
6601
6881
|
}
|
|
@@ -6675,39 +6955,27 @@ function synthesizeMinimalXBrief(issue) {
|
|
|
6675
6955
|
}
|
|
6676
6956
|
};
|
|
6677
6957
|
}
|
|
6678
|
-
|
|
6958
|
+
/**
|
|
6959
|
+
* Synthesize and durably persist a proposed spec through the canonical write
|
|
6960
|
+
* door. The returned workspace path is the canonical spec path because
|
|
6961
|
+
* workspace-local spec copies are migration compatibility only.
|
|
6962
|
+
*/
|
|
6963
|
+
const writeAutoStartXBrief = (projectRoot, _workspacePath, issue) => Effect.gen(function* () {
|
|
6679
6964
|
const document = synthesizeMinimalXBrief(issue);
|
|
6680
6965
|
const canonicalFilename = document.plan.metadata?.canonicalFilename;
|
|
6681
|
-
const
|
|
6682
|
-
const projectSpecPath = join$1(projectSpecsDir, canonicalFilename);
|
|
6683
|
-
const projectDocument = {
|
|
6966
|
+
const written = yield* writeSpecForIssue(projectRoot, {
|
|
6684
6967
|
...document,
|
|
6685
6968
|
plan: {
|
|
6686
6969
|
...document.plan,
|
|
6687
6970
|
status: "proposed"
|
|
6688
6971
|
}
|
|
6689
|
-
};
|
|
6690
|
-
await mkdir$1(projectSpecsDir, { recursive: true });
|
|
6691
|
-
await writeFile$1(projectSpecPath, serializeXBriefDocument(projectDocument), "utf-8");
|
|
6972
|
+
}, "proposed", canonicalFilename);
|
|
6692
6973
|
return {
|
|
6693
6974
|
document,
|
|
6694
|
-
workspaceSpecPath:
|
|
6695
|
-
projectSpecPath,
|
|
6975
|
+
workspaceSpecPath: written.path,
|
|
6976
|
+
projectSpecPath: written.path,
|
|
6696
6977
|
canonicalFilename
|
|
6697
6978
|
};
|
|
6698
|
-
}
|
|
6699
|
-
/**
|
|
6700
|
-
* Effect variant of writeAutoStartXBrief. Wraps mkdir + writeFile in a typed
|
|
6701
|
-
* FsError channel so callers in Effect-native code can compose with this
|
|
6702
|
-
* synthesis step without losing failure typing.
|
|
6703
|
-
*/
|
|
6704
|
-
const writeAutoStartXBrief = (projectRoot, workspacePath, issue) => Effect.tryPromise({
|
|
6705
|
-
try: () => writeAutoStartXBriefPromise(projectRoot, workspacePath, issue),
|
|
6706
|
-
catch: (cause) => new FsError({
|
|
6707
|
-
path: projectRoot,
|
|
6708
|
-
operation: "writeAutoStartXBrief",
|
|
6709
|
-
cause
|
|
6710
|
-
})
|
|
6711
6979
|
});
|
|
6712
6980
|
//#endregion
|
|
6713
6981
|
//#region routes/agents/spawn-helpers.ts
|
|
@@ -6770,15 +7038,15 @@ async function requestWorkStartAfterContainers(input) {
|
|
|
6770
7038
|
function handleRemoteAgentSpawn(input) {
|
|
6771
7039
|
return Effect.gen(function* () {
|
|
6772
7040
|
const { issueId, workspacePath, workspaceMetadata, spawnModel, startedBy, autoSpawnConsentRequired, projectPath, spawnGuardrails, lifecycle } = input;
|
|
6773
|
-
const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-
|
|
6774
|
-
const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-
|
|
6775
|
-
const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-
|
|
7041
|
+
const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-BIIoc5pD.js"));
|
|
7042
|
+
const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-C0xVTHA5.js"));
|
|
7043
|
+
const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-C5saf4Ja.js"));
|
|
6776
7044
|
const panConfig = loadPanConfig();
|
|
6777
7045
|
const spendCap = checkRemoteSpendCap(panConfig);
|
|
6778
7046
|
if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
|
|
6779
7047
|
const fly = createFlyProviderFromConfig(panConfig.remote);
|
|
6780
7048
|
yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
|
|
6781
|
-
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-
|
|
7049
|
+
const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-D03s4DD1.js"));
|
|
6782
7050
|
const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
|
|
6783
7051
|
const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
|
|
6784
7052
|
issueId,
|
|
@@ -7151,20 +7419,13 @@ function emitDirtyWorkspaceRefusalActivity(issueId, porcelain) {
|
|
|
7151
7419
|
} catch {}
|
|
7152
7420
|
}
|
|
7153
7421
|
/**
|
|
7154
|
-
*
|
|
7155
|
-
*
|
|
7156
|
-
*
|
|
7157
|
-
*
|
|
7158
|
-
* individual paths. A pipeline-authored `.pan/drafts/<ISSUE>.md` therefore read
|
|
7159
|
-
* as operator dirt and 409'd the planning→work auto-handoff (PAN-3042).
|
|
7422
|
+
* True when git porcelain contains only Overdeck-owned workspace runtime files
|
|
7423
|
+
* (PAN-3042; shared predicate since PAN-3245) or generated git-hook output — the
|
|
7424
|
+
* `.husky/_/pre-rebase` guard that worktree creation writes made every fresh
|
|
7425
|
+
* workspace read as dirty and 409 the planning auto-handoff (PAN-3266).
|
|
7160
7426
|
*/
|
|
7161
|
-
function isOverdeckWorkspaceRuntimePath(path) {
|
|
7162
|
-
if (path === ".overdeck" || path.startsWith(".overdeck/")) return true;
|
|
7163
|
-
return path === ".pan" || path === ".pan/" || path.startsWith(".pan/");
|
|
7164
|
-
}
|
|
7165
|
-
/** True when git porcelain contains only Overdeck-owned workspace runtime files. */
|
|
7166
7427
|
function isOnlyOverdeckRuntimeWorkspaceChanges(porcelain) {
|
|
7167
|
-
return parsePorcelainStatusPaths(porcelain).every(isOverdeckWorkspaceRuntimePath);
|
|
7428
|
+
return parsePorcelainStatusPaths(porcelain).every((path) => isOverdeckWorkspaceRuntimePath(path) || isGeneratedGitHookPath(path));
|
|
7168
7429
|
}
|
|
7169
7430
|
function spawnGuardrailResourcesHint(hint) {
|
|
7170
7431
|
const resourcesHint = "Open /resources to inspect Machine Room pressure before retrying.";
|
|
@@ -7504,23 +7765,24 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
7504
7765
|
const markWorkStartAccepted = async () => {
|
|
7505
7766
|
if (workStartAccepted) return;
|
|
7506
7767
|
workStartAccepted = true;
|
|
7507
|
-
await Effect.runPromise(transitionXBriefOnMain(projectPath, issueId, "active", "
|
|
7768
|
+
await Effect.runPromise(transitionXBriefOnMain(projectPath, issueId, "active", "running", `chore(state): start ${issueId.toUpperCase()} xBRIEF (status=running)`).pipe(Effect.match({
|
|
7508
7769
|
onSuccess: (result) => {
|
|
7509
7770
|
if (result.moved) console.log(`[start-agent] xBRIEF moved ${result.fromDir} → active for ${issueId}`);
|
|
7510
|
-
if (result.
|
|
7771
|
+
if (result.statusUpdated) console.log(`[start-agent] Set plan.status=running for ${issueId}`);
|
|
7772
|
+
if (result.committed) console.log(`[start-agent] Committed running transition for ${issueId}`);
|
|
7511
7773
|
},
|
|
7512
7774
|
onFailure: (err) => {
|
|
7513
|
-
console.warn(`[start-agent] xBRIEF
|
|
7775
|
+
console.warn(`[start-agent] xBRIEF running transition failed (non-fatal): ${err?.message ?? err}`);
|
|
7514
7776
|
}
|
|
7515
7777
|
})));
|
|
7516
|
-
if (
|
|
7778
|
+
if (planPath.startsWith(workspacePath + sep)) try {
|
|
7517
7779
|
updatePlanStatus(planPath, "running");
|
|
7518
7780
|
console.log(`[start-agent] Set plan.status=running for ${issueId}`);
|
|
7519
7781
|
} catch (planStatusErr) {
|
|
7520
7782
|
console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
|
|
7521
7783
|
}
|
|
7522
7784
|
try {
|
|
7523
|
-
const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-
|
|
7785
|
+
const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-aVzu-LGm.js");
|
|
7524
7786
|
await appendSessionEntry(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId, {
|
|
7525
7787
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
7526
7788
|
reason: "start",
|
|
@@ -7623,9 +7885,13 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
7623
7885
|
console.warn(`[start-agent] Failed to check workspace status for ${issueId}: ${message}`);
|
|
7624
7886
|
}
|
|
7625
7887
|
const bodyHarness = body.harness;
|
|
7626
|
-
const userPickedHarness = bodyHarness === "ohmypi" || bodyHarness === "claude-code" || bodyHarness === "codex" || bodyHarness === "acp" ? bodyHarness : null;
|
|
7888
|
+
const userPickedHarness = bodyHarness === "ohmypi" || bodyHarness === "claude-code" || bodyHarness === "codex" || bodyHarness === "acp" || bodyHarness === "kimi-code" ? bodyHarness : null;
|
|
7627
7889
|
let effectiveHarness = null;
|
|
7628
|
-
if (userPickedHarness !== null)
|
|
7890
|
+
if (userPickedHarness !== null) {
|
|
7891
|
+
const harnessDecision = yield* Effect.promise(async () => canUseHarnessSync(userPickedHarness, spawnModel, await getProviderAuthMode(spawnModel)));
|
|
7892
|
+
if (!harnessDecision.allowed) return jsonResponse({ error: harnessDecision.reason ?? `Harness "${userPickedHarness}" is not allowed for model "${spawnModel}".` }, { status: 400 });
|
|
7893
|
+
effectiveHarness = userPickedHarness;
|
|
7894
|
+
}
|
|
7629
7895
|
const spawnPanCommand = async (args, cwd) => {
|
|
7630
7896
|
const admitted = await withActiveOrderDispatchReservation(projectPath, issueId, {
|
|
7631
7897
|
offBook,
|
|
@@ -7818,7 +8084,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
|
|
|
7818
8084
|
* Composes all /api/agents/* route layers and preserves the public helper
|
|
7819
8085
|
* exports that external callers historically imported from routes/agents.js.
|
|
7820
8086
|
*/
|
|
7821
|
-
const agentsRouteLayer = Layer.mergeAll(getAgentsRoute, getAgentOutputRoute, getAgentConversationRoute, postAgentMessageRoute, postAgentTellRoute, deleteAgentRoute, postAgentStopRoute, getAgentHealthHistoryRoute, postAgentPokeRoute, getAgentPendingQuestionsRoute, postAgentAnswerQuestionRoute, postAgentPlanActionRoute, postAgentHeartbeatRoute, postAgentWorkCompleteRoute, postAgentStuckRoute, postAgentClassifyCompletionRoute, postInternalAgentPermissionRequestRoute, postAgentPermissionResponseRoute, getAgentRuntimeRoute, getAgentGitInfoRoute, getAgentActivityRoute, getAgentFilesRoute, getAgentTimelineRoute, postAgentSuspendRoute, postAgentPauseRoute, postAgentUnpauseRoute, postAgentUntroubledRoute, postAgentResumeRoute, postAgentRecoverRoute, postAgentRestartRoute, getAgentCloisterHealthRoute, getAgentHandoffSuggestionRoute, postAgentHandoffRoute, getAgentCostRoute, postAgentsRoute, postAgentsRestartAllRoute, getAgentTmuxAliveRoute, getAgentHasSessionRoute, postAgentResetSessionRoute, postAgentSwitchModelRoute, postAgentRestartFreshRoute, postAgentDeliveryMethodRoute, getAgentsRestartConfigRoute, postAgentsRestartWithConfigRoute);
|
|
8087
|
+
const agentsRouteLayer = Layer.mergeAll(getAgentsRoute, getAgentOutputRoute, getAgentConversationRoute, postAgentMessageRoute, postAgentTellRoute, deleteAgentRoute, postAgentStopRoute, getAgentHealthHistoryRoute, postAgentPokeRoute, getAgentPendingQuestionsRoute, getAgentPaneChoiceRoute, postAgentPaneChoiceRoute, postAgentAnswerQuestionRoute, postAgentPlanActionRoute, postAgentHeartbeatRoute, postAgentWorkCompleteRoute, postAgentStuckRoute, postAgentClassifyCompletionRoute, postInternalAgentPermissionRequestRoute, postAgentPermissionResponseRoute, getAgentRuntimeRoute, getAgentGitInfoRoute, getAgentActivityRoute, getAgentFilesRoute, getAgentTimelineRoute, postAgentSuspendRoute, postAgentPauseRoute, postAgentUnpauseRoute, postAgentUntroubledRoute, postAgentResumeRoute, postAgentRecoverRoute, postAgentRestartRoute, getAgentCloisterHealthRoute, getAgentHandoffSuggestionRoute, postAgentHandoffRoute, getAgentCostRoute, postAgentsRoute, postAgentsRestartAllRoute, getAgentTmuxAliveRoute, getAgentHasSessionRoute, postAgentResetSessionRoute, postAgentSwitchModelRoute, postAgentRestartFreshRoute, postAgentDeliveryMethodRoute, getAgentsRestartConfigRoute, postAgentsRestartWithConfigRoute);
|
|
7822
8088
|
//#endregion
|
|
7823
8089
|
//#region routes/tiered-inspect-escalation.ts
|
|
7824
8090
|
init_tier_escalation();
|
|
@@ -7965,14 +8231,14 @@ function firePostMergeLifecycle(issueId, options) {
|
|
|
7965
8231
|
const normalizedIssueId = parsedIssueId.normalized.toUpperCase();
|
|
7966
8232
|
const started = postMergeGuard.run(normalizedIssueId, async () => {
|
|
7967
8233
|
const projectPath = getProjectPathForIssue(parsedIssueId.prefix);
|
|
7968
|
-
const { postMergeLifecycle } = await import("./merge-agent-
|
|
8234
|
+
const { postMergeLifecycle } = await import("./merge-agent-DWd0KfiS.js");
|
|
7969
8235
|
const lifecycleOptions = {
|
|
7970
8236
|
...options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : {},
|
|
7971
8237
|
...options?.verifiedMergedRepos?.length ? { verifiedMergedRepos: options.verifiedMergedRepos } : {}
|
|
7972
8238
|
};
|
|
7973
8239
|
await postMergeLifecycle(normalizedIssueId, projectPath, options?.sourceBranch, Object.keys(lifecycleOptions).length > 0 ? lifecycleOptions : void 0);
|
|
7974
8240
|
console.log(`[merge] post-merge lifecycle completed for ${normalizedIssueId}`);
|
|
7975
|
-
const { runMergeTrainReconcile } = await import("./merge-train-
|
|
8241
|
+
const { runMergeTrainReconcile } = await import("./merge-train-D1I0lNOT.js");
|
|
7976
8242
|
const outcomes = await runMergeTrainReconcile(normalizedIssueId);
|
|
7977
8243
|
if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${normalizedIssueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
|
|
7978
8244
|
}, (err) => console.error(`[merge] post-merge lifecycle failed for ${normalizedIssueId}:`, err));
|
|
@@ -7993,15 +8259,15 @@ init_io();
|
|
|
7993
8259
|
init_domain_services();
|
|
7994
8260
|
init_tmux();
|
|
7995
8261
|
const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
|
|
7996
|
-
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
8262
|
+
const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
7997
8263
|
return jsonResponse({
|
|
7998
8264
|
specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
|
|
7999
8265
|
projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
|
|
8000
8266
|
});
|
|
8001
8267
|
})));
|
|
8002
8268
|
const postSpecialistsResetAllRoute = HttpRouter.add("POST", "/api/specialists/reset-all", httpHandler(Effect.gen(function* () {
|
|
8003
|
-
const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
8004
|
-
const { clearHookSync } = yield* Effect.promise(() => import("./hooks-
|
|
8269
|
+
const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8270
|
+
const { clearHookSync } = yield* Effect.promise(() => import("./hooks-X2XHBB2b.js"));
|
|
8005
8271
|
const specialists = getAllSpecialists();
|
|
8006
8272
|
const results = [];
|
|
8007
8273
|
for (const specialist of specialists) {
|
|
@@ -8057,7 +8323,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8057
8323
|
}
|
|
8058
8324
|
console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
|
|
8059
8325
|
if (specialist === "merge") {
|
|
8060
|
-
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-
|
|
8326
|
+
const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-Cf6tpIh1.js"));
|
|
8061
8327
|
if (yield* reportSpecialistCompletion(normalizedIssueId, {
|
|
8062
8328
|
status,
|
|
8063
8329
|
notes
|
|
@@ -8110,7 +8376,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8110
8376
|
if (project && failedItemId) {
|
|
8111
8377
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8112
8378
|
if (existsSync(workspacePath)) {
|
|
8113
|
-
const { onInspectComplete } = await import("./inspect-agent-
|
|
8379
|
+
const { onInspectComplete } = await import("./inspect-agent-BykeOH4a.js");
|
|
8114
8380
|
await Effect.runPromise(onInspectComplete(project.projectKey, normalizedIssueId, failedItemId, "failed", workspacePath, notes));
|
|
8115
8381
|
}
|
|
8116
8382
|
}
|
|
@@ -8121,7 +8387,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8121
8387
|
}
|
|
8122
8388
|
yield* Effect.promise(async () => {
|
|
8123
8389
|
try {
|
|
8124
|
-
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-
|
|
8390
|
+
const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-MOoeB4A8.js");
|
|
8125
8391
|
const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
|
|
8126
8392
|
const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
|
|
8127
8393
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -8140,7 +8406,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8140
8406
|
});
|
|
8141
8407
|
console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
|
|
8142
8408
|
}
|
|
8143
|
-
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-
|
|
8409
|
+
const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-D_LmQDj3.js");
|
|
8144
8410
|
if (await Effect.runPromise(updateSpecialistHandoffStatus(normalizedIssueId, `${specialist}-agent`, status === "passed" ? "completed" : "failed", status === "passed" ? "success" : "failure"))) console.log(`[specialists/done] Updated handoff log: ${specialist}-agent ${normalizedIssueId} → ${status}`);
|
|
8145
8411
|
} catch (err) {
|
|
8146
8412
|
console.error(`[specialists/done] Error managing specialist state:`, err);
|
|
@@ -8152,7 +8418,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8152
8418
|
if (project) {
|
|
8153
8419
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8154
8420
|
if (existsSync(workspacePath)) {
|
|
8155
|
-
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
8421
|
+
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-C31x1lpE.js");
|
|
8156
8422
|
const headAnchor = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
|
|
8157
8423
|
if (headAnchor) {
|
|
8158
8424
|
setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: headAnchor });
|
|
@@ -8166,7 +8432,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8166
8432
|
});
|
|
8167
8433
|
if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
|
|
8168
8434
|
try {
|
|
8169
|
-
const { onInspectComplete } = await import("./inspect-agent-
|
|
8435
|
+
const { onInspectComplete } = await import("./inspect-agent-BykeOH4a.js");
|
|
8170
8436
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
8171
8437
|
if (project) {
|
|
8172
8438
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
@@ -8182,7 +8448,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8182
8448
|
if (project) {
|
|
8183
8449
|
if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
|
|
8184
8450
|
setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
|
|
8185
|
-
const { initEventStore } = await import("./event-store-
|
|
8451
|
+
const { initEventStore } = await import("./event-store-COd2tOx8.js");
|
|
8186
8452
|
await (await initEventStore()).appendAsync({
|
|
8187
8453
|
type: "test.passed",
|
|
8188
8454
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -8235,8 +8501,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8235
8501
|
if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
|
|
8236
8502
|
try {
|
|
8237
8503
|
const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
|
|
8238
|
-
const { sessionExists } = await import("./tmux-
|
|
8239
|
-
const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-
|
|
8504
|
+
const { sessionExists } = await import("./tmux-Cjpx8L8u.js");
|
|
8505
|
+
const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-IPSa5kzn.js");
|
|
8240
8506
|
if (await Effect.runPromise(sessionExists(workAgentId))) {
|
|
8241
8507
|
await messageAgent(workAgentId, `MERGE CONFLICT: The merge-agent could not rebase your branch onto main due to conflicts. Please fix this now:\n\n1. git fetch origin main\n2. git rebase origin/main\n3. Resolve any conflicts (git add <file> && git rebase --continue)\n4. git push --force-with-lease\n5. Resubmit: curl -s -X POST http://localhost:3011/api/review/${normalizedIssueId}/request -H "Content-Type: application/json" -d "{}"\n\nConflict details: ${notes}`);
|
|
8242
8508
|
console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
|
|
@@ -8250,7 +8516,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8250
8516
|
try {
|
|
8251
8517
|
const project = resolveProjectFromIssueSync(normalizedIssueId);
|
|
8252
8518
|
const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
|
|
8253
|
-
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-
|
|
8519
|
+
const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-HRY9P4bN.js");
|
|
8254
8520
|
const result = await Effect.runPromise(deliverReviewVerdictFeedback({
|
|
8255
8521
|
issueId: normalizedIssueId,
|
|
8256
8522
|
verdict: status === "failed" ? "failed" : "blocked",
|
|
@@ -8270,7 +8536,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8270
8536
|
if (project) {
|
|
8271
8537
|
const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
|
|
8272
8538
|
if (existsSync(workspacePath)) {
|
|
8273
|
-
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-
|
|
8539
|
+
const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-C31x1lpE.js");
|
|
8274
8540
|
const reviewedAtCommit = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
|
|
8275
8541
|
if (reviewedAtCommit) {
|
|
8276
8542
|
setReviewStatusSync(normalizedIssueId, { reviewedAtCommit });
|
|
@@ -8310,7 +8576,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
|
|
|
8310
8576
|
});
|
|
8311
8577
|
})));
|
|
8312
8578
|
const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/specialists/logs/cleanup-all", httpHandler(Effect.gen(function* () {
|
|
8313
|
-
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8579
|
+
const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
|
|
8314
8580
|
const results = cleanupAllLogsSync();
|
|
8315
8581
|
return jsonResponse({
|
|
8316
8582
|
success: true,
|
|
@@ -8320,7 +8586,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
8320
8586
|
});
|
|
8321
8587
|
})));
|
|
8322
8588
|
const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
|
|
8323
|
-
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-
|
|
8589
|
+
const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8324
8590
|
return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
|
|
8325
8591
|
})));
|
|
8326
8592
|
const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
|
|
@@ -8364,7 +8630,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
|
|
|
8364
8630
|
"blocked",
|
|
8365
8631
|
"failed"
|
|
8366
8632
|
].includes(status)) {
|
|
8367
|
-
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-
|
|
8633
|
+
const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8368
8634
|
saveAgentRuntimeState(getTmuxSessionName(name), {
|
|
8369
8635
|
state: "idle",
|
|
8370
8636
|
lastActivity: (/* @__PURE__ */ new Date()).toISOString()
|
|
@@ -8486,7 +8752,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
|
|
|
8486
8752
|
const issueId = params["issueId"];
|
|
8487
8753
|
const type = params["type"];
|
|
8488
8754
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
8489
|
-
const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-
|
|
8755
|
+
const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8490
8756
|
const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
|
|
8491
8757
|
yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
|
|
8492
8758
|
saveAgentRuntimeState(tmuxSession, {
|
|
@@ -8513,7 +8779,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
|
|
|
8513
8779
|
if (limitParam) limit = parseInt(limitParam, 10);
|
|
8514
8780
|
if (offsetParam) offset = parseInt(offsetParam, 10);
|
|
8515
8781
|
}
|
|
8516
|
-
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8782
|
+
const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
|
|
8517
8783
|
return jsonResponse(listRunLogsSync(project, type, {
|
|
8518
8784
|
limit,
|
|
8519
8785
|
offset
|
|
@@ -8524,7 +8790,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
|
|
|
8524
8790
|
const project = params["project"];
|
|
8525
8791
|
const type = params["type"];
|
|
8526
8792
|
const runId = params["runId"];
|
|
8527
|
-
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8793
|
+
const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
|
|
8528
8794
|
const logPath = getRunLogPath(project, type, runId);
|
|
8529
8795
|
if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
8530
8796
|
const encoder = new TextEncoder();
|
|
@@ -8583,7 +8849,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
|
|
|
8583
8849
|
const project = params["project"];
|
|
8584
8850
|
const type = params["type"];
|
|
8585
8851
|
const runId = params["runId"];
|
|
8586
|
-
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8852
|
+
const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
|
|
8587
8853
|
const content = getRunLogSync(project, type, runId);
|
|
8588
8854
|
if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
|
|
8589
8855
|
return jsonResponse({
|
|
@@ -8597,7 +8863,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
|
|
|
8597
8863
|
const project = params["project"];
|
|
8598
8864
|
const type = params["type"];
|
|
8599
8865
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
8600
|
-
const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-
|
|
8866
|
+
const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8601
8867
|
yield* Effect.promise(() => terminateSpecialist(project, type));
|
|
8602
8868
|
return jsonResponse({
|
|
8603
8869
|
success: true,
|
|
@@ -8609,7 +8875,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
|
|
|
8609
8875
|
const project = params["project"];
|
|
8610
8876
|
const type = params["type"];
|
|
8611
8877
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
8612
|
-
const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
8878
|
+
const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8613
8879
|
if (pauseGracePeriod(project, type)) return jsonResponse({
|
|
8614
8880
|
success: true,
|
|
8615
8881
|
message: "Grace period paused"
|
|
@@ -8621,7 +8887,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
|
|
|
8621
8887
|
const project = params["project"];
|
|
8622
8888
|
const type = params["type"];
|
|
8623
8889
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
8624
|
-
const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
8890
|
+
const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8625
8891
|
if (resumeGracePeriod(project, type)) return jsonResponse({
|
|
8626
8892
|
success: true,
|
|
8627
8893
|
message: "Grace period resumed"
|
|
@@ -8633,7 +8899,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
|
|
|
8633
8899
|
const project = params["project"];
|
|
8634
8900
|
const type = params["type"];
|
|
8635
8901
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
8636
|
-
const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-
|
|
8902
|
+
const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8637
8903
|
exitGracePeriod(project, type);
|
|
8638
8904
|
return jsonResponse({
|
|
8639
8905
|
success: true,
|
|
@@ -8645,7 +8911,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
|
|
|
8645
8911
|
const project = params["project"];
|
|
8646
8912
|
const type = params["type"];
|
|
8647
8913
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
8648
|
-
const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-
|
|
8914
|
+
const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8649
8915
|
const state = getGracePeriodState(project, type);
|
|
8650
8916
|
if (state) return jsonResponse(state);
|
|
8651
8917
|
else return jsonResponse({ error: "No active grace period" }, { status: 404 });
|
|
@@ -8654,7 +8920,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
|
|
|
8654
8920
|
const params = yield* HttpRouter.params;
|
|
8655
8921
|
const project = params["project"];
|
|
8656
8922
|
const type = params["type"];
|
|
8657
|
-
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
8923
|
+
const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-DEUEkjIQ.js"));
|
|
8658
8924
|
const digest = loadContextDigest(project, type);
|
|
8659
8925
|
if (digest) return jsonResponse({ digest });
|
|
8660
8926
|
else return jsonResponse({ error: "No context digest found" }, { status: 404 });
|
|
@@ -8663,7 +8929,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
|
|
|
8663
8929
|
const params = yield* HttpRouter.params;
|
|
8664
8930
|
const project = params["project"];
|
|
8665
8931
|
const type = params["type"];
|
|
8666
|
-
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-
|
|
8932
|
+
const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-DEUEkjIQ.js"));
|
|
8667
8933
|
const digest = yield* Effect.promise(() => regenerateContextDigest(project, type));
|
|
8668
8934
|
if (digest) return jsonResponse({
|
|
8669
8935
|
digest,
|
|
@@ -8682,7 +8948,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
|
|
|
8682
8948
|
"blocked"
|
|
8683
8949
|
].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
|
|
8684
8950
|
if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
|
|
8685
|
-
const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-
|
|
8951
|
+
const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
|
|
8686
8952
|
signalSpecialistCompletion(project, type, {
|
|
8687
8953
|
status,
|
|
8688
8954
|
notes
|
|
@@ -8716,8 +8982,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
|
|
|
8716
8982
|
const params = yield* HttpRouter.params;
|
|
8717
8983
|
const project = params["project"];
|
|
8718
8984
|
const type = params["type"];
|
|
8719
|
-
const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-
|
|
8720
|
-
const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-
|
|
8985
|
+
const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
|
|
8986
|
+
const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-WqMWCdpa.js"));
|
|
8721
8987
|
const retention = getSpecialistRetention(project);
|
|
8722
8988
|
const deleted = cleanupOldLogsSync(project, type, {
|
|
8723
8989
|
maxDays: retention.max_days,
|
|
@@ -8738,7 +9004,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
8738
9004
|
const project = params["project"];
|
|
8739
9005
|
const issueId = params["issueId"];
|
|
8740
9006
|
const { model, harness } = yield* readJsonBody;
|
|
8741
|
-
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-
|
|
9007
|
+
const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-CD3RQ-tc.js"));
|
|
8742
9008
|
const killResult = yield* killAllReviewerSessions(project, issueId);
|
|
8743
9009
|
const projectConfig = resolveProjectFromIssueSync(issueId);
|
|
8744
9010
|
if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
|
|
@@ -8754,7 +9020,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
|
|
|
8754
9020
|
}));
|
|
8755
9021
|
branch = stdout.trim() || primaryRepo.sourceBranch;
|
|
8756
9022
|
} catch {}
|
|
8757
|
-
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-
|
|
9023
|
+
const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-CD3RQ-tc.js"));
|
|
8758
9024
|
const prUrl = getReviewStatusSync(issueId)?.prUrl;
|
|
8759
9025
|
const result = yield* spawnReviewRoleForIssue({
|
|
8760
9026
|
issueId,
|
|
@@ -8903,6 +9169,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
|
|
|
8903
9169
|
*/
|
|
8904
9170
|
const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
|
|
8905
9171
|
//#endregion
|
|
8906
|
-
export {
|
|
9172
|
+
export { ComposerCommandParseError as $, handleConversationSwitchModel as A, validateOriginHeaders as At, cleanupConversationAttachments as B, conversationNeedsRunningRepair as C, rejectUnauthorizedDashboardSessionMintRequest as Ct, handleConversationRestartAll as D, getHeaderFromMap as Dt, handleConversationDelete as E, waitForSessionRespawn as Et, startConversationModelBackfill as F, getConversationAttachmentsRoot as G, cleanupUnreferencedConversationAttachments as H, stopConversationRuntime as I, removeConversationAttachment as J, hasConversationAttachment as K, tmuxSessionExists as L, resolveAllowedHarness as M, getDefaultCwd as Mt, shouldReportUnresolvedLiveSession as N, jsonResponse as Nt, handleConversationResume as O, isTrustedOriginForHost as Ot, spawnConversationSession as P, jsonStringResponse as Pt, resolvePolicy as Q, waitForPiTuiReady as R, validateConversationControlAckOrigin as S, rejectUnauthorizedDashboardRequest as St, handleConversationCreate as T, isRespawnPending as Tt, ensureConversationAttachmentDir as U, cleanupOrphanedConversationAttachments as V, extractConversationAttachmentPaths as W, composerCommandResultHttpStatus as X, runInBatches as Y, handleComposerCommandMessage as Z, handleConversationPlanAction as _, resolveKimiWirePath as _t, agentsRouteLayer as a, resolveRequestedStartedBy as at, pickDeliverAs as b, dashboardSessionCookieHeader as bt, answerSessionPaneChoice as c, getWorkAgentLifecycleStateSync as ct, deliverConversationViaControlChannel as d, readLauncherPinnedSessionId as dt, ComposerCommandConfirmationError as et, handleConversationAbort as f, resolveAcpTranscriptPath as ft, handleConversationDeliveryMethod as g, resolveJsonlPath as gt, handleConversationControlAck as h, resolveCodexRolloutPath as ht, validateSpecialistAutoCompleteMetadata as i, isInternalAgentRequest as it, isInsideGitWorkTree as j, httpHandler as jt, handleConversationStop as k, validateOrigin as kt, captureSessionPaneChoice as l, panCliInvocation as lt, handleConversationCompact as m, resolveClaudeSessionId as mt, _serverManagedMerges as n, evaluateSpawnGuardrails as nt, saveAgentStateAndEmitEvent as o, resolveAgentGitInfo as ot, handleConversationCodexApproval as p, resolveAgentHarness as pt, isManagedConversationAttachmentPath as q, firePostMergeLifecycle as r, invalidateAgentsCache as rt, saveAgentStateAndEmitEventProgram as s, resolveConversationGitInfo as st, specialistsRouteLayer as t, composerCommandConfirmationFromBody as tt, codexConversationPendingInput as u, spawnPanCli as ut, handleConversationThinkingLevel as v, resolvePiSessionPath as vt, conversationSessionAliveFromState as w, rejectUnsafeDashboardMutationRequest as wt, resolveConversationDeliveryMethod as x, hasDashboardInternalToken as xt, isPiControlChannelHarness as y, dashboardCsrfToken as yt, waitForTmuxSession as z };
|
|
8907
9173
|
|
|
8908
|
-
//# sourceMappingURL=specialists-
|
|
9174
|
+
//# sourceMappingURL=specialists-DAjPgYs_.js.map
|