@overdeck/desktop 0.45.24 → 0.47.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 +36 -1
- package/package.json +1 -1
- package/server/{acceptance-criteria-DDCnXF58.js → acceptance-criteria-10Ur5Dne.js} +2 -2
- package/server/activity-logger-CMthG6Vd.js +3 -0
- package/server/{activity-logger-DDlOIAML.js → activity-logger-CyteR4JO.js} +24 -13
- package/server/{advancing-selfheal-BVwW4qRn.js → advancing-selfheal-BNwqxseD.js} +6 -6
- package/server/{agent-gc-CHcnvonI.js → agent-gc-C3h9Or3a.js} +5 -5
- package/server/agent-state-CYXJVG72.js +3 -0
- package/server/agent-state-service-C63p_ftq.js +2 -0
- package/server/{agent-state-service-BsgWxZuB.js → agent-state-service-Ds6OeFvo.js} +15 -9
- package/server/{agents-EbI0zCJl.js → agents-J5mEnekq.js} +23 -16
- package/server/agents-ePFVoZbu.js +3 -0
- package/server/archive-planning-B2XplFzT.js +2 -0
- package/server/{archive-planning-Du25Jtst.js → archive-planning-BwhxeP7C.js} +22 -26
- package/server/{artifact-index-jobs-CbEDfCDu.js → artifact-index-jobs-D1q_vR3V.js} +2 -2
- package/server/{assemble-J2ZZ2C15.js → assemble-Bgwqv-Ro.js} +2 -2
- package/server/auto-spawn-consent-CQ9Bi9q6.js +1141 -0
- package/server/{backlog-auto-trigger-2R2jog7n.js → backlog-auto-trigger-n1lzPgN4.js} +3 -3
- package/server/{behavior-B3exJ42O.js → behavior-td6-xhQk.js} +2 -2
- package/server/boot-reconciled-stop-events-C7gGe3oB.js +44 -0
- package/server/bridge-pool-patrol-CYH2OLb5.js +136 -0
- package/server/{briefing-freshness-D1wzUIWv.js → briefing-freshness-DRqZ8lAz.js} +2 -2
- package/server/{build-info-Ie_D0_BT.js → build-info-7yiEpl6u.js} +5 -3
- package/server/{build-info-CZk_TITh.js → build-info-CpG__c63.js} +1 -1
- package/server/{checkpoint-manager-DwbQoqrC.js → checkpoint-manager-CkKmB0wZ.js} +1 -1
- package/server/{checkpoint-manager-BI1Wxoku.js → checkpoint-manager-DBcyNR8w.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-CQB1h765.js → checkpoints-D95apurL.js} +2 -2
- package/server/{checkpoints-BJIs5QIA.js → checkpoints-Wm963lm8.js} +1 -1
- package/server/{claude-hooks-provision-8Ngo8TpT.js → claude-hooks-provision-4RPxNkE8.js} +1 -1
- package/server/{claude-hooks-provision-D8GXF3_s.js → claude-hooks-provision-Bjitl9aI.js} +13 -2
- package/server/{claude-permissions-DNWEVV6z.js → claude-permissions-CpbpvUQ2.js} +2 -2
- package/server/{claude-settings-overlay-DWy-Bb4Y.js → claude-settings-overlay-BzkHYDwR.js} +1 -1
- package/server/{claude-settings-overlay-CEdaqpWI.js → claude-settings-overlay-_H9Yrzab.js} +2 -2
- package/server/cli-CjOCSnfj.js +3 -0
- package/server/{cli-RoOx5DUf.js → cli-Cte9ZFGn.js} +9 -9
- package/server/{cliproxy-C8a1vtTU.js → cliproxy-C5fMJ7rY.js} +2 -2
- package/server/{cliproxy-fHfIeiGd.js → cliproxy-DaAbWMjC.js} +1 -1
- package/server/{close-issue-DoOifFIK.js → close-issue-BPh1ARCF.js} +5 -5
- package/server/{closed-issue-reaper-CktPXo8m.js → closed-issue-reaper-DHRfRMrp.js} +1 -1
- package/server/{closed-issue-reaper-Bk3SU4RC.js → closed-issue-reaper-DoOZqGFK.js} +88 -17
- package/server/{codex-BZXGhUVB.js → codex-BzGDW_d3.js} +36 -7
- package/server/{codex-GcHuUF-k.js → codex-o8FJwzmy.js} +1 -1
- package/server/{codex-parser-CFZ1_1Jl.js → codex-parser-Dt-ycU8L.js} +2 -2
- package/server/compaction-continuation-CvXpbZ4w.js +200 -0
- package/server/{config-CKxYiCmX.js → config-Bi3u1VK7.js} +4 -3
- package/server/{config-BZ0sHTju.js → config-BvLe652W.js} +2 -2
- package/server/{config-DzV30TOm.js → config-CL3Gyvja.js} +1 -1
- package/server/{config-yaml-DySPNmKN.js → config-yaml-CxdwhAIA.js} +276 -14
- package/server/conflict-gate-CX80JYYS.js +3 -0
- package/server/{conflict-gate-BaCVrH-N.js → conflict-gate-E4nt7ZeS.js} +60 -14
- package/server/{context-layers-igZ4FI4_.js → context-layers-C_IIysnm.js} +3 -3
- package/server/{context-layers-BrPmE__h.js → context-layers-DAG83UZt.js} +2 -2
- package/server/{control-settings-BQp7_4uD.js → control-settings-CiqGxXnc.js} +56 -19
- package/server/{conversation-compaction-eQB5CkOe.js → conversation-compaction-BE3CNtHF.js} +1 -1
- package/server/{conversation-compaction-CgrR8YYp.js → conversation-compaction-D6-yLtqt.js} +8 -8
- package/server/{conversation-service-DPJ71F33.js → conversation-service-DBxoYMDl.js} +10 -8
- package/server/conversation-service-D_TS2b1r.js +3 -0
- package/server/{conversations-CAsJF9kh.js → conversations-BKDVpB-3.js} +1 -1
- package/server/{conversations-6AfUfbwc.js → conversations-D0UEdLtk.js} +4 -4
- package/server/{cost-R-m6Yi-W.js → cost-DS1s0DbG.js} +3 -3
- package/server/{cost-B2ddP6wq.js → cost-DpgYmYqR.js} +12 -2
- package/server/{cost-sync-BsN6ER0n.js → cost-sync-tOCCGnEt.js} +3 -3
- package/server/{dag-B1ucnjDU.js → dag-BtkgLeqY.js} +2 -2
- package/server/{dangerous-git-ops-BXqeWVSf.js → dangerous-git-ops-CFLykHWt.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/deacon-BIblC-WX.js +4 -0
- package/server/{deacon-nudge-log-6wVqAaqz.js → deacon-nudge-log-B08gF0mh.js} +3 -3
- package/server/{deacon-CU_cAYSR.js → deacon-pLRLbPvR.js} +3308 -2707
- package/server/deacon-pending-lifecycle-B-Io84AP.js +33 -0
- package/server/deacon-swarm-B1XkIvfr.js +2 -0
- package/server/{deacon-swarm-BXZZ1Z2-.js → deacon-swarm-v5PMun-m.js} +15 -14
- package/server/deacon.js +14 -19
- package/server/dead-end-trip-D8A3msX9.js +13 -0
- package/server/delivery-BX9HR4wQ.js +3 -0
- package/server/{deploy-patrol-AiFoP8dw.js → deploy-patrol-sYgOxLeb.js} +69 -18
- package/server/deploy-queue-VfohaPN_.js +169 -0
- package/server/deploy-queue-gHJBycaF.js +3 -0
- package/server/deploy-window-CFRZ0-kt.js +3 -0
- package/server/{deploy-window-C3F-tihF.js → deploy-window-D4DQb8VP.js} +40 -16
- package/server/{dev-supervisor-bcOWqdQE.js → dev-supervisor-DiOBDM1c.js} +2 -2
- package/server/{devcontainer-renderer-_d6XhyND.js → devcontainer-renderer-BUOIlfgD.js} +3 -3
- package/server/dist-B3YPQa5A.js +3 -0
- package/server/{dist-Cb_0uvpS.js → dist-C3A8B8wM.js} +1 -1
- package/server/{dist-src-BSoS7mkd.js → dist-src-C0adpegX.js} +1 -1
- package/server/{docker-DcMTFTUC.js → docker-BJzlkqYB.js} +2 -2
- package/server/docker-Y3PElJb0.js +3 -0
- package/server/dod-DlNtcH6n.js +91 -0
- package/server/durable-review-pipeline-Cibps-Rg.js +20 -0
- package/server/durable-review-pipeline-DP6bIcOY.js +3 -0
- package/server/{ensure-devcontainer-DNi-ono3.js → ensure-devcontainer-BAofzBPv.js} +4 -4
- package/server/{ensure-devcontainer-BZgOhRo7.js → ensure-devcontainer-DMAbWqtQ.js} +1 -1
- package/server/{esm-shims-OSHAYaS1.js → esm-shims-BeObUkaw.js} +1 -1
- package/server/{event-store-EV2cMiXj.js → event-store-5UKzh9Jf.js} +1 -1
- package/server/{event-store-CQL6NeqB.js → event-store-CrHcVC5_.js} +23 -4
- package/server/{events-DTfAe4My.js → events-BNrvchBg.js} +3 -3
- package/server/{events-BTdrdEq8.js → events-CF8QDbuV.js} +1 -1
- package/server/{factory-CFibJuaw.js → factory-Cmm9Hsho.js} +5 -5
- package/server/{feature-registry-population-DKZFMbFt.js → feature-registry-population-B6HpNWRy.js} +4 -4
- package/server/{feature-registry-storage-BdPuLcBX.js → feature-registry-storage-DJEFx1Pf.js} +2 -2
- package/server/{features-ez2271oH.js → features-D5km80UI.js} +2 -2
- package/server/{feedback-target-CoFDHiM8.js → feedback-target-BJ5ZADsu.js} +1 -1
- package/server/{feedback-target-7mqqwrX6.js → feedback-target-DSxEL6lP.js} +8 -8
- package/server/{feedback-writer-CY5L1lB7.js → feedback-writer-C27Hak8a.js} +5 -5
- package/server/{feedback-writer-D3a22RCd.js → feedback-writer-CoB9Z6aU.js} +1 -1
- package/server/{flywheel-DHrgCphM.js → flywheel-BHx8XuMr.js} +47 -20
- package/server/{flywheel-SVF02Jpq.js → flywheel-DZZdtiOL.js} +1 -1
- package/server/{flywheel-DzGtWnJ1.js → flywheel-f662Q-y2.js} +16 -15
- package/server/flywheel-merge-order-D_xLMbJU.js +462 -0
- package/server/flywheel-merge-order-Dil0LmdN.js +2 -0
- package/server/forge-B5o319qI.js +3 -0
- package/server/forge-BaKGCya6.js +383 -0
- package/server/{from-kNxT0bZC.js → from-B3tZbB55.js} +1 -1
- package/server/fs-lock-Bre3sGoz.js +130 -0
- package/server/{fts-db-CE46vDkZ.js → fts-db-IVc4_M3f.js} +2 -2
- package/server/{fts-operations-CqY6zl-i.js → fts-operations-B9jG8wa3.js} +2 -2
- package/server/{git-utils-CRw2zLPC.js → git-utils-CsvYfJU3.js} +30 -5
- package/server/git-utils-Xg4PFN45.js +3 -0
- package/server/{github-app-ClZ2lk8D.js → github-app-Bmg4R9mv.js} +1 -1
- package/server/{github-app-C3QrAUd0.js → github-app-CmNk0zLU.js} +3 -3
- package/server/{github-client-DfQYVUaw.js → github-client-B6KM9_wA.js} +1 -1
- package/server/{github-client-BnIsSrEN.js → github-client-qazkPrg0.js} +3 -3
- package/server/github-pr-lookup-DAcVeRLK.js +58 -0
- package/server/{harness-binary-DPUi-Pv8.js → harness-binary-BSpiXaLw.js} +2 -2
- package/server/{harness-resolve-3lNZkyT4.js → harness-resolve-BAJu5MX8.js} +4 -4
- package/server/{health-events-BDOHby5Q.js → health-events-2Z6Wa9SM.js} +1 -1
- package/server/{health-events-BBcTYQKU.js → health-events-BwX32k8d.js} +2 -2
- package/server/{hooks-DPVX1rwQ.js → hooks-D1g1jKLI.js} +1 -1
- package/server/{hooks-CKZgXlJb.js → hooks-DbtbimEf.js} +2 -2
- package/server/{hume-Cz8igP9E.js → hume-DXNiu6nQ.js} +2 -2
- package/server/hume-VUCNbTgn.js +3 -0
- package/server/{idle-stack-reaper-CuLF0j2H.js → idle-stack-reaper-CRA1e0jr.js} +1 -1
- package/server/{idle-stack-reaper-DDIRwxUY.js → idle-stack-reaper-Cy-dQzW4.js} +99 -6
- package/server/in-flight-guard-D-sSkADM.js +45 -0
- package/server/{infra-BEqFxlJc.js → infra-BDQDRopn.js} +81 -5
- package/server/{injection-C8aiVJrF.js → injection-6AGnXxlj.js} +7 -7
- package/server/{injection-CPUIqNhI.js → injection-Bl8d_jHZ.js} +1 -1
- package/server/inspect-agent-CUwVmr2h.js +2 -0
- package/server/{inspect-agent-BLuJ1AkT.js → inspect-agent-nXdIptyh.js} +26 -25
- package/server/{internal-token-s0-oKybJ.js → internal-token-DzK385vD.js} +2 -2
- package/server/{internal-token-BrcU6qfe.js → internal-token-Ias7N8Kg.js} +1 -1
- package/server/{io-C9kF1wtJ.js → io-B00PBNku.js} +44 -27
- package/server/{issue-closed-CDJk4pIp.js → issue-closed-BehTG1be.js} +8 -8
- package/server/{issue-lifecycle-ojZAzDBP.js → issue-lifecycle-Birk-ifu.js} +42 -30
- package/server/{issue-lifecycle-B8sZHVHh.js → issue-lifecycle-BqSuQvbn.js} +1 -1
- package/server/{issue-service-singleton-BvJ09SaR.js → issue-service-singleton-B2wXiIlw.js} +1 -1
- package/server/{issue-service-singleton-Yx5DdmVJ.js → issue-service-singleton-C6ZduvuY.js} +10 -10
- package/server/{issues-BMmP_77e.js → issues-DQ5-LatB.js} +2 -2
- package/server/{jsonl-parser-BXSlHwEh.js → jsonl-parser-BDpnGFCl.js} +5 -4
- package/server/{label-cleanup-B0UJwnv5.js → label-cleanup-Dwnky8FG.js} +3 -3
- package/server/{lifecycle-xmBfK2GJ.js → lifecycle-B3s4sM1G.js} +6 -7
- package/server/{lifecycle-yPd___5E.js → lifecycle-B4Xdb4cY.js} +2 -2
- package/server/{lifecycle-io-DPo7x11I.js → lifecycle-io-CzTHEooc.js} +1 -1
- package/server/{lifecycle-io-BREGpnLk.js → lifecycle-io-DCo6s6ks.js} +5 -5
- package/server/{linear-client-BsuUvkdA.js → linear-client-9uq7fhiV.js} +3 -3
- package/server/{linear-client-CTskEeT_.js → linear-client-CnbtHiic.js} +1 -1
- package/server/linear-mcp-auth-BxUOzswy.js +280 -0
- package/server/linear-mcp-auth-D46fBCLf.js +2 -0
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-CefQNAnq.js → merge-DiW9RdSB.js} +13 -11
- package/server/{merge-agent-4WOWlSYA.js → merge-agent-BLUgRsz3.js} +234 -84
- package/server/{merge-agent-CKkgIBPB.js → merge-agent-DQTXZk8z.js} +1 -1
- package/server/{merge-batch-ClFn2T-y.js → merge-batch-Cp_j9BGk.js} +1 -1
- package/server/merge-completeness-B46KqhtY.js +277 -0
- package/server/merge-completeness-BLbB5-6n.js +3 -0
- package/server/merge-ops-1abz6O_P.js +2 -0
- package/server/merge-rebase-CJJVAJuz.js +2 -0
- package/server/{merge-rebase-BfaTyXsw.js → merge-rebase-DIkBjgwq.js} +3 -3
- package/server/{merge-set-DJ8-UErs.js → merge-set-CBgHfwM0.js} +11 -5
- package/server/merge-set-DeUxFsC3.js +3 -0
- package/server/{merge-B1DiziGU.js → merge-sr8Nrnmi.js} +1 -1
- package/server/merge-sync-CpGmk6Ch.js +3 -0
- package/server/{merge-sync-VPV28g0g.js → merge-sync-kr4vqyjM.js} +409 -153
- package/server/{merge-train-CHopycP0.js → merge-train-Dmrcus12.js} +18 -8
- package/server/{merge-train-deps-D1cOZzy2.js → merge-train-deps-D_uGX91G.js} +21 -15
- package/server/merge-verification-NvaAd8CZ.js +220 -0
- package/server/merged-docker-cleanup-worker-DH_hrGPI.js +3 -0
- package/server/merged-docker-cleanup-worker-Y1R06TEl.js +107 -0
- package/server/{multipart-parser-duPAfSBw.js → multipart-parser-R-oC8dQg.js} +2 -2
- package/server/{no-resume-mode-Nw29vaFb.js → no-resume-mode-BgD0JUmM.js} +1 -1
- package/server/node_modules/.package-lock.json +30 -30
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
- package/server/node_modules/@google-cloud/common/package.json +2 -2
- package/server/node_modules/@types/node/README.md +1 -1
- package/server/node_modules/@types/node/crypto.d.ts +1 -1
- package/server/node_modules/@types/node/package.json +2 -2
- package/server/node_modules/gaxios/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/server/node_modules/gaxios/build/esm/tsconfig.tsbuildinfo +1 -1
- package/server/node_modules/gaxios/package.json +1 -1
- package/server/node_modules/google-auth-library/build/src/auth/googleauth.js +24 -19
- package/server/node_modules/google-auth-library/package.json +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/auth.proto +2 -1
- package/server/node_modules/google-gax/build/protos/google/api/backend.proto +12 -1
- package/server/node_modules/google-gax/build/protos/google/api/billing.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/client.proto +165 -53
- package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1/resources.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1beta/quota_adjuster_settings.proto +7 -3
- package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1beta/resources.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/config_change.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/context.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/control.proto +3 -3
- package/server/node_modules/google-gax/build/protos/google/api/distribution.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/documentation.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/endpoint.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/error_reason.proto +186 -1
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/checked.proto +31 -3
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/eval.proto +8 -9
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/explain.proto +1 -2
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/syntax.proto +20 -22
- package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/value.proto +2 -3
- package/server/node_modules/google-gax/build/protos/google/api/field_behavior.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/field_info.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/http.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/httpbody.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/label.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/launch_stage.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/log.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/logging.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/metric.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/monitored_resource.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/monitoring.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/policy.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/quota.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/resource.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/routing.proto +8 -4
- package/server/node_modules/google-gax/build/protos/google/api/service.proto +2 -3
- package/server/node_modules/google-gax/build/protos/google/api/source_info.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/system_parameter.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/api/usage.proto +7 -27
- package/server/node_modules/google-gax/build/protos/google/api/visibility.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/longrunning/operations.proto +20 -1
- package/server/node_modules/google-gax/build/protos/google/protobuf/any.proto +52 -108
- package/server/node_modules/google-gax/build/protos/google/protobuf/compiler/ruby/ruby_generated_code.proto +2 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_features.proto +21 -1
- package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_file_options.proto +24 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_options.proto +15 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/descriptor.proto +118 -30
- package/server/node_modules/google-gax/build/protos/google/protobuf/field_mask.proto +16 -18
- package/server/node_modules/google-gax/build/protos/google/protobuf/internal_options.proto +8 -1
- package/server/node_modules/google-gax/build/protos/google/protobuf/json/json_enumval_custom_string.proto +26 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/json_enumvalue_options.proto +29 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/json_options.proto +14 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/struct.proto +38 -22
- package/server/node_modules/google-gax/build/protos/google/protobuf/test_protos/forced_micro_string.proto +3 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/test_protos/repeated_field_proxy_import_message.proto +14 -0
- package/server/node_modules/google-gax/build/protos/google/protobuf/timestamp.proto +9 -8
- package/server/node_modules/google-gax/build/protos/google/protobuf/util/json_format_proto3.proto +18 -0
- package/server/node_modules/google-gax/build/protos/google/rpc/code.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/rpc/context/attribute_context.proto +7 -2
- package/server/node_modules/google-gax/build/protos/google/rpc/context/audit_context.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/rpc/error_details.proto +5 -5
- package/server/node_modules/google-gax/build/protos/google/rpc/http.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/rpc/status.proto +1 -2
- package/server/node_modules/google-gax/build/protos/google/type/calendar_period.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/color.proto +9 -10
- package/server/node_modules/google-gax/build/protos/google/type/date.proto +11 -9
- package/server/node_modules/google-gax/build/protos/google/type/datetime.proto +17 -17
- package/server/node_modules/google-gax/build/protos/google/type/dayofweek.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/decimal.proto +11 -13
- package/server/node_modules/google-gax/build/protos/google/type/expr.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/fraction.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/interval.proto +1 -2
- package/server/node_modules/google-gax/build/protos/google/type/latlng.proto +4 -5
- package/server/node_modules/google-gax/build/protos/google/type/localized_text.proto +3 -3
- package/server/node_modules/google-gax/build/protos/google/type/money.proto +1 -2
- package/server/node_modules/google-gax/build/protos/google/type/month.proto +1 -1
- package/server/node_modules/google-gax/build/protos/google/type/phone_number.proto +20 -15
- package/server/node_modules/google-gax/build/protos/google/type/postal_address.proto +39 -39
- package/server/node_modules/google-gax/build/protos/google/type/quaternion.proto +4 -4
- package/server/node_modules/google-gax/build/protos/google/type/timeofday.proto +11 -8
- package/server/node_modules/google-gax/package.json +5 -5
- package/server/node_modules/retry-request/package.json +4 -4
- package/server/node_modules/teeny-request/package.json +5 -5
- package/server/node_modules/undici/lib/cache/memory-cache-store.js +54 -9
- package/server/node_modules/undici/lib/cache/sqlite-cache-store.js +7 -1
- package/server/node_modules/undici/lib/core/request.js +12 -1
- package/server/node_modules/undici/lib/dispatcher/client-h1.js +11 -2
- package/server/node_modules/undici/lib/global.js +36 -16
- package/server/node_modules/undici/lib/handler/cache-handler.js +236 -116
- package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +3 -3
- package/server/node_modules/undici/lib/handler/retry-handler.js +24 -0
- package/server/node_modules/undici/lib/interceptor/cache.js +152 -62
- package/server/node_modules/undici/lib/interceptor/decompress.js +5 -2
- package/server/node_modules/undici/lib/util/cache.js +328 -66
- package/server/node_modules/undici/lib/util/date.js +23 -6
- package/server/node_modules/undici/lib/web/cookies/util.js +78 -8
- package/server/node_modules/undici/package.json +1 -1
- package/server/{orphan-proposed-reconciler-BvKkWMJQ.js → orphan-proposed-reconciler-B6vJHxtX.js} +242 -34
- package/server/{orphan-proposed-reconciler-CTSGcK8p.js → orphan-proposed-reconciler-DcgTPPFY.js} +1 -1
- package/server/package-lock.json +31 -31
- package/server/package.json +1 -1
- package/server/{pan-dir-B0c3w0Ya.js → pan-dir-DMzF5wne.js} +25 -11
- package/server/{paths-D-xWGHdh.js → paths-sJBSb7Ul.js} +2 -2
- package/server/pending-lifecycle-claim-DilzGfgk.js +110 -0
- package/server/persistent-logger-H_VjuOu7.js +57 -0
- package/server/{pickup-DUCLWrJY.js → pickup-DWhqzliO.js} +4 -3
- package/server/pipeline-membership-C88VBnhJ.js +3 -0
- package/server/pipeline-membership-D9SBvItj.js +57 -0
- package/server/pipeline-membership-gather-4eR-7Tqy.js +3 -0
- package/server/pipeline-membership-gather-CeVGnNJ2.js +593 -0
- package/server/{pipeline-notifier-BXkJzDC4.js → pipeline-notifier-D0ALV6Nw.js} +2 -2
- package/server/{pipeline-notifier-BJr8gQX6.js → pipeline-notifier-DT6xLFao.js} +1 -1
- package/server/post-merge-lifecycle-worker-8HIeS_J6.js +50 -0
- package/server/{project-pipelines-C0MWUeCU.js → project-pipelines-9SKt2bEc.js} +2 -2
- package/server/{project-repos-B6GycDh9.js → project-repos-B5pIphKg.js} +7 -3
- package/server/project-repos-DPjOdfPa.js +3 -0
- package/server/projects-_n3Zui6K.js +3 -0
- package/server/{prompts-DxzFXuLl.js → prompts-CgzMBvQF.js} +2 -2
- package/server/{providers-u4Ga0jOr.js → providers-BI1mOBQ4.js} +1 -1
- package/server/{providers-qQAwGQDW.js → providers-BJQSnAAp.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-BamJdinX.js → chunk-BO2N2NFS-D_pGACYN.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-DfOB8-w4.js → diagram-OG6HWLK6-BO6fe3hH.js} +1 -1
- package/server/public/assets/{dist-ByIuzMQW.js → dist-5zingMiA.js} +3 -3
- package/server/public/assets/{dist-D7zYSEA6.js → dist-CVxhbI2E.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-EdmRyXL3.js → ganttDiagram-6RSMTGT7-Bgj4A7kp.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-MerOfTX8.js → highlighted-body-OFNGDK62-DNPK7_cm.js} +1 -1
- package/server/public/assets/index-DEpY-D1O.js +807 -0
- package/server/public/assets/index-Ddkcz3WT.css +1 -0
- package/server/public/assets/{linear-BBbArIcK.js → linear-BB0jQT16.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-BKIddiJN.js → pieDiagram-4H26LBE5-DeGIzzpZ.js} +1 -1
- package/server/public/assets/{prod-B8vYiu52.js → prod-XBLvikex.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-D6RtoULk.js → quadrantDiagram-W4KKPZXB-BV9SLeWz.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-CLrCedZX.js → sankeyDiagram-5OEKKPKP-Dwja0gj8.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-hznR8DYl.js → xychartDiagram-2RQKCTM6-DCB4qvfw.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-_lHueOHW.js → pull-requests-7BgLDsIo.js} +19 -10
- package/server/{pull-requests-7N8WKseP.js → pull-requests-Dq0y6IxE.js} +1 -1
- package/server/{queries-CjNIf-Ub.js → queries-C-MUZaIy.js} +824 -192
- package/server/{rally-CyWT_lNO.js → rally-CPysR4T_.js} +3 -3
- package/server/rally-D_VW4bJv.js +3 -0
- package/server/{rally-api-C8e_1JRi.js → rally-api-8Ptlp2os.js} +2 -2
- package/server/{rally-api-ClOSd-Tt.js → rally-api-CgosKdKL.js} +1 -1
- package/server/{rally-client-sgtVqzNU.js → rally-client-CCX0hADj.js} +1 -1
- package/server/{rally-client-lc-nokqr.js → rally-client-iYMHWQD7.js} +5 -5
- package/server/{reap-terminal-sessions-7KeHv1R1.js → reap-terminal-sessions-4Xg9NGA8.js} +2 -2
- package/server/{reap-terminal-sessions-BtHPo6Xc.js → reap-terminal-sessions-Qf-9LVQc.js} +2 -2
- package/server/{rebuild-stack-lwtsW0GO.js → rebuild-stack-CMdgaylx.js} +16 -7
- package/server/{rebuild-stack-CFvcBHsS.js → rebuild-stack-DqcOVmJO.js} +2 -2
- package/server/{reconstruct-cache-C3Ui7ojV.js → reconstruct-cache-CMZJ_Vjq.js} +9 -7
- package/server/record-BTwWhtBb.js +3 -0
- package/server/{record-update-dE1Aw83j.js → record-update-DaOKS7Wb.js} +124 -157
- package/server/record-update-DhI7eySG.js +3 -0
- package/server/{recovery-trip-BvRWfUXM.js → recovery-trip-DDH-02ng.js} +2 -2
- package/server/{release-engine-Cx48W7z8.js → release-engine-B2X9AfFC.js} +5 -5
- package/server/{release-set-CQfuN9-v.js → release-set-G4XKyQ8K.js} +3 -3
- package/server/{remote-C_2hasl7.js → remote-BXarMvqf.js} +3 -3
- package/server/{remote-ChgimyYa.js → remote-CUhyqjXk.js} +3 -3
- package/server/{remote-agents-By1ige5O.js → remote-agents-Bba-MgSA.js} +311 -48
- package/server/{remote-agents-CA3Ihlxj.js → remote-agents-CLZB3Coc.js} +2 -2
- package/server/{remote-completion-fVe9e_3u.js → remote-completion-CwAp79EC.js} +13 -13
- package/server/resume-mOREjlYu.js +3 -0
- package/server/{review-agent-CIGOQYBD.js → review-agent--pOptAEV.js} +65 -50
- package/server/{review-agent-DNboMyW4.js → review-agent-BTCNkq2h.js} +1 -1
- package/server/{review-artifacts-nRDPuMxd.js → review-artifacts-BNmw8dWE.js} +7 -6
- package/server/{review-context-2uj-YQ8J.js → review-context-DFxYOOJW.js} +9 -9
- package/server/{in-flight-guard-CAAkqPLu.js → review-convoy-liveness-BgU_1jJf.js} +3 -44
- package/server/review-status-CGvlA4o_.js +7737 -0
- package/server/review-status-Dma9SFaN.js +3 -0
- package/server/review-status-emit-DURrmGYX.js +50 -0
- package/server/{review-status-enrichment-Dci-ZwEt.js → review-status-enrichment-8NiNXi5W.js} +4 -4
- package/server/review-status-source-BLx_1siH.js +3 -0
- package/server/{review-status-source-CxuEjLGg.js → review-status-source-DIk1JSow.js} +24 -3
- package/server/{review-status-sync-BTOpxtTC.js → review-status-sync-0GxOqeqF.js} +11 -6
- package/server/{review-status-sync-DSDK3OMy.js → review-status-sync-muT-EBp2.js} +1 -1
- package/server/{review-verdict-feedback-CTd4QMBu.js → review-verdict-feedback-HwF6ODFy.js} +1 -1
- package/server/{review-verdict-feedback-CCjVA7Uk.js → review-verdict-feedback-xJNdqBnX.js} +65 -11
- package/server/{rollup-FGsKki9R.js → rollup-BQaol5TX.js} +8 -8
- package/server/{rollup-BKQC7jp4.js → rollup-BR4t_wck.js} +1 -1
- package/server/{scanner-CnqEZeDy.js → scanner-C-D2cFdX.js} +8 -7
- package/server/{sequence-io-D909zgeH.js → sequence-io-Bmf1EZM5.js} +4 -4
- package/server/{sequencer-agent-CzkcK6P5.js → sequencer-agent-CigMyKh2.js} +7 -6
- package/server/server.js +2005 -614
- package/server/{service-CLeAoU6G.js → service-CD0DvFvD.js} +114 -68
- package/server/{session-fork-CHI1XvL9.js → session-fork-B6cQ5eya.js} +2 -2
- package/server/{session-history-BT3IvqhC.js → session-history-3ON_IJjm.js} +7 -55
- package/server/settings-CVmWiJ-r.js +2 -0
- package/server/{settings-C0zgxOGf.js → settings-PilbFZAM.js} +3 -2
- package/server/{settings-BTMvpNFU.js → settings-VN0qOh4U.js} +3 -3
- package/server/{shadow-engineering-BJfgm-hX.js → shadow-engineering-DXvx77oE.js} +3 -3
- package/server/{shadow-state-7a-524T8.js → shadow-state-BBk_zacw.js} +2 -2
- package/server/{shadow-state-DnDyjujH.js → shadow-state-CZBp7pwq.js} +1 -1
- package/server/{shadow-utils-Db3oroFG.js → shadow-utils-DdZ05AJS.js} +2 -2
- package/server/{ship-log-D9MlVzYU.js → ship-log-7kJfjUX2.js} +1 -1
- package/server/{smart-compaction-CV2ukKND.js → smart-compaction-8fA5k5XN.js} +1 -1
- package/server/{smart-compaction-KCYScAU1.js → smart-compaction-ByhL9cRS.js} +8 -7
- package/server/{spawn-planning-session-DKpdFyOC.js → spawn-planning-session-pcF-YeFE.js} +38 -50
- package/server/spawn-planning-session-vLUJoFjy.js +3 -0
- package/server/{specialist-completion-Ky9wCDpb.js → specialist-completion-B07XjWD2.js} +1 -1
- package/server/{specialist-context-Bn3dCGS2.js → specialist-context-DJ-zFyL3.js} +5 -5
- package/server/{specialist-handoff-logger-CMEwYxa2.js → specialist-handoff-logger-aKSxbIgD.js} +2 -2
- package/server/{specialist-logs-C5p8G7tx.js → specialist-logs-Dae-n52_.js} +3 -3
- package/server/{specialists-CC4r-c2s.js → specialists-6PWdtWcg.js} +1177 -311
- package/server/{specialists-DM6bWjsi.js → specialists-Bz-wFT7R.js} +1 -1
- package/server/{specialists-jiuuyVkp.js → specialists-DUiExaxb.js} +18 -18
- package/server/{specialists-CShuVGWT.js → specialists-KR3pKulN.js} +1 -1
- package/server/specs--enInima.js +3 -0
- package/server/src-B948bGVR.js +11452 -0
- package/server/{src-CXmtj0im.js → src-rac0Mepv.js} +6 -6
- package/server/{src-CdmnTM2m.js → src-vHy2-oCv.js} +3 -3
- package/server/{stack-health-Bn3o8FBX.js → stack-health-BikqHSjn.js} +1 -1
- package/server/{stack-health-DxSdG9cW.js → stack-health-DqLTiEu4.js} +7 -5
- package/server/{stale-task-claims-KJKxxiiQ.js → stale-task-claims-Cab_Fo_Z.js} +5 -4
- package/server/{staleness-DPm7ClwA.js → staleness-C-a5rBxF.js} +1 -1
- package/server/{staleness-CT34nwr9.js → staleness-CGTZyp6V.js} +1 -1
- package/server/{state-home-Cn_Qu8IX.js → state-home-722Dkx92.js} +2 -2
- package/server/{state-mapping-BL_-3Yt8.js → state-mapping-CybR81Uf.js} +1 -1
- package/server/{state-migrate-BGg2ZaOt.js → state-migrate-2u8wIpoL.js} +4 -4
- package/server/{stuck-remediation-DYuPRYYw.js → stuck-remediation-CC6q3eqQ.js} +84 -26
- package/server/{stuck-remediation-s9_2qfi6.js → stuck-remediation-r1TJu68G.js} +1 -1
- package/server/{substrate-bug-weights-service-B-FwCs5V.js → substrate-bug-weights-service-CzIyyWFT.js} +3 -3
- package/server/{summary-fork-DpcxN9tf.js → summary-fork-BqgmgPDt.js} +2 -2
- package/server/{summary-fork-D1RAk9rJ.js → summary-fork-Df2WFijM.js} +8 -8
- package/server/supervisor/{injection-budget-Csw5tqfJ.js → injection-budget-Cg_KIb3o.js} +1 -1
- package/server/supervisor/{paths-DehGY2Fj.js → paths-BBOnCYlO.js} +10 -2
- package/server/supervisor/pty-supervisor.js +50 -4
- package/server/supervisor/{pty-token-x-ea28Us.js → pty-token-BbjwEUUM.js} +3 -3
- package/server/supervisor-B4anCCSm.js +2 -0
- package/server/{supervisor-wM4ooB5O.js → supervisor-BxqSpjcN.js} +3 -3
- package/server/{swarm-readiness-DlP_UjHq.js → swarm-readiness-DfFxa9-n.js} +3 -3
- package/server/{system-prerequisites-DUDj1YHf.js → system-prerequisites-ICLSkhhZ.js} +2 -2
- package/server/{teardown-workspace-DeTTImn-.js → teardown-workspace-DRdi_CPa.js} +15 -16
- package/server/{test-agent-queue-MbxX5vqq.js → test-agent-queue-A_-p-i0I.js} +8 -7
- package/server/{test-verdict-gscuksPv.js → test-verdict-BHgTAwIG.js} +1 -1
- package/server/{test-verdict-bWYBtqBg.js → test-verdict-C4i9aqEP.js} +1 -1
- package/server/{tldr-daemon-BYFkts95.js → tldr-daemon-CvWXBhX1.js} +1 -1
- package/server/{tldr-daemon-C-69c3OI.js → tldr-daemon-wvsU6bKv.js} +2 -2
- package/server/{tmux-R7N7y-Mh.js → tmux-CfDHob9M.js} +174 -4
- package/server/{tmux-B6z7h_vZ.js → tmux-Ctk6RV5l.js} +1 -1
- package/server/{token-BK6t8BIT.js → token-DrxwytsZ.js} +2 -2
- package/server/{token-util-DxXu-vd1.js → token-util-B48BlCba.js} +1 -1
- package/server/token-util-D411CAq9.js +3 -0
- package/server/{tracker-config-G6latr8C.js → tracker-config-BcPMElRB.js} +2 -2
- package/server/{tracker-utils-DHv5pSDT.js → tracker-utils-CJ6BHjcD.js} +3 -3
- package/server/{traefik-connect-Df2uXPsQ.js → traefik-connect-DZ6nMYMj.js} +1 -1
- package/server/{tunnel-DGdUkGoZ.js → tunnel-Bp-dRHZz.js} +1 -1
- package/server/{tunnel-CDVKJpRv.js → tunnel-DUbUPElU.js} +3 -3
- package/server/{typed-errors-BHhE85Ul.js → typed-errors-CKeoDdU3.js} +1 -1
- package/server/{typed-errors-2BTMxkZq.js → typed-errors-DyjseiB6.js} +1 -1
- package/server/{types-hraoaQIp.js → types-Cm5ASJbq.js} +1 -1
- package/server/{types-5M0lupud.js → types-Di8wdakq.js} +1 -1
- package/server/uat-promote-verification-CoJuh7XO.js +92 -0
- package/server/uat-train-4Q0k06CQ.js +0 -0
- package/server/uat-train-Dewoatps.js +2 -0
- package/server/{validate-IfDGkaVR.js → validate-B0C8p66t.js} +8 -6
- package/server/{validation-Dw1pzDzr.js → validation-B_kIRfNe.js} +4 -4
- package/server/{validation-CC9OPqJZ.js → validation-hVOwQk8T.js} +1 -1
- package/server/{verification-artifact-B3itKTxu.js → verification-artifact-BxlxTiYK.js} +1 -1
- package/server/{verification-artifact-TVFSz_q1.js → verification-artifact-D70AtckY.js} +1 -1
- package/server/{verification-runner-BW4HOKAz.js → verification-runner-Bc3cJvpC.js} +1 -1
- package/server/{verification-runner-CkgX6EtI.js → verification-runner-KZTz6u72.js} +40 -18
- package/server/{vtt-parser-DYPbKcIJ.js → vtt-parser-CE_i3Bcw.js} +1 -1
- package/server/{work-agent-prompt-Du8Vh2aJ.js → work-agent-prompt-ByrPAzOy.js} +20 -9
- package/server/{workflows-mbQzh6mQ.js → workflows-D0vP1WrK.js} +252 -99
- package/server/workflows-DtDX08ed.js +2 -0
- package/server/{workspace--8tnhDI0.js → workspace-COWvdibH.js} +1 -1
- package/server/{workspace-BPUws1-_.js → workspace-DQkRPLlQ.js} +3 -3
- package/server/workspace-anchor-drift-DXYIAHzr.js +224 -0
- package/server/workspace-anchor-drift-pwz23TI1.js +3 -0
- package/server/{workspace-config-CIVWZOQr.js → workspace-config-BdZM4PvZ.js} +1 -1
- package/server/{workspace-manager-CBhNdzE4.js → workspace-manager-BPgTrG66.js} +157 -118
- package/server/workspace-manager-C1F3XsnS.js +3 -0
- package/server/{workspace-metadata-BzHnwwX4.js → workspace-metadata-CdjzAP8x.js} +1 -1
- package/server/{workspace-metadata-_WygnyoX.js → workspace-metadata-DkO_iTLo.js} +2 -2
- package/server/{workspaces-Do_9J0LQ.js → workspaces-CRBJikLp.js} +749 -299
- package/sync-sources/dev-skills/pan-dashboard-restart/SKILL.md +34 -10
- package/sync-sources/hooks/linear-mcp-auth-hook +97 -0
- package/sync-sources/rules/ask-user-question-self-contained.md +9 -0
- package/sync-sources/skills/pan-close/SKILL.md +5 -3
- package/sync-sources/skills/pan-merge/SKILL.md +7 -5
- package/sync-sources/skills/pan-peer-review/SKILL.md +195 -0
- package/sync-sources/skills/pan-release/SKILL.md +57 -0
- package/sync-sources/skills/pan-reload/SKILL.md +3 -3
- package/sync-sources/skills/pan-restart/SKILL.md +5 -4
- package/sync-sources/skills/pan-review/SKILL.md +7 -1
- package/sync-sources/skills/pan-sync-main/SKILL.md +9 -8
- package/sync-sources/skills/pipeline-status/SKILL.md +10 -1
- package/sync-sources/skills/workspace-add-repo/SKILL.md +16 -1
- package/server/activity-logger-OEUBdfZ8.js +0 -3
- package/server/agent-state-Bc3tzUC8.js +0 -3
- package/server/agent-state-service-D5UGKIJL.js +0 -2
- package/server/agents-wi9NWzs2.js +0 -3
- package/server/archive-planning-BZDgzoEj.js +0 -3
- package/server/cli-B86rejVV.js +0 -3
- package/server/conflict-gate-BhAY7TUd.js +0 -3
- package/server/conversation-service-BLd3MYsG.js +0 -3
- package/server/deacon-kiQrb4ZT.js +0 -4
- package/server/deacon-swarm-C-GwfjJy.js +0 -2
- package/server/deploy-window-DkZraDyj.js +0 -3
- package/server/dist-Bzy0y69j.js +0 -3
- package/server/dod-C6n9RV3G.js +0 -66
- package/server/flywheel-merge-order-UU0tiUld.js +0 -245
- package/server/flywheel-merge-order-UUcsCDb6.js +0 -2
- package/server/forge-CNFnyqps.js +0 -270
- package/server/forge-DXnS_YFH.js +0 -2
- package/server/git-utils-D0_yhCgF.js +0 -3
- package/server/github-pr-lookup-D16NGsSO.js +0 -44
- package/server/hume-ccTf4wTX.js +0 -3
- package/server/inspect-agent-Brtz0URj.js +0 -2
- package/server/label-reconciler-B4iOAjlC.js +0 -113
- package/server/launcher-generator-BBWG_SiS.js +0 -473
- package/server/merge-ops-CR44oU9-.js +0 -2
- package/server/merge-set-bUqbm3yc.js +0 -3
- package/server/merge-sync-BJYeOODr.js +0 -3
- package/server/merge-verification-BkaOqPsw.js +0 -124
- package/server/pipeline-membership-mY3GprlK.js +0 -420
- package/server/project-repos-DXKQsc_m.js +0 -3
- package/server/projects-vjjcmiN8.js +0 -3
- package/server/public/assets/index-CWeMerGO.js +0 -804
- package/server/public/assets/index-CenuJ3Cw.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-CpPWAFwE.js +0 -1
- package/server/rally-zhhtXuDP.js +0 -3
- package/server/record-CN0pj4_5.js +0 -3
- package/server/record-update-bLJxAXH4.js +0 -3
- package/server/resume-BFv1PGpA.js +0 -3
- package/server/review-status-btEYlaxA.js +0 -3
- package/server/review-status-kZj_KyCk.js +0 -1470
- package/server/settings-66A6uvIA.js +0 -2
- package/server/spawn-planning-session-qUC2VWu3.js +0 -2
- package/server/specs-C8Wsn2XO.js +0 -3
- package/server/src-DtcUOZCq.js +0 -4826
- package/server/supervisor-FTJAIsAK.js +0 -2
- package/server/token-util-DuPuNriz.js +0 -3
- package/server/tracker-utils-B4ylXZQK.js +0 -3
- package/server/uat-train-B05BWkp-.js +0 -2
- package/server/uat-train-DDSrSoV1.js +0 -2152
- package/server/workflows-BQu4RFQ-.js +0 -2
- package/server/workspace-manager-CWT55qeI.js +0 -3
|
@@ -1,52 +1,55 @@
|
|
|
1
1
|
import { n as __esmMin, o as __toESM } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import { B as getProviderEnvSync,
|
|
3
|
-
import {
|
|
4
|
-
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-
|
|
5
|
-
import {
|
|
6
|
-
import { a as init_event_store, i as initEventStore } from "./event-store-
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { i as
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import { a as
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import { n as
|
|
34
|
-
import { a as
|
|
35
|
-
import { t as
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
2
|
+
import { B as getProviderEnvSync, C as TIERED_EXECUTION_DIFFICULTIES, Cr as ClaudeCredentialParseError, D as resolveTieredExecutionEnabled, Fr as init_errors, G as setupCredentialFileAuthSync, Gn as init_projects, H as init_providers, In as getIssuePrefix, Ir as AGENTS_DIR, K as ensureOpenAICompatibleProxyRunning, L as clearCredentialFileAuthSync, Mn as findProjectByPathSync, O as resolveTieredExecutionEnabledForIssue, Pt as init_record, R as getBuiltInDefaultHarness, Rn as getProjectSwarmHotspots, Rt as readIssueRecordForWorkspaceSync, S as DEFAULT_TIERED_EXECUTION_CONFIG, Sn as init_state_read_home, T as init_tier_table, Tr as FsError, Ut as writeAgentHarnessModelSync, V as getProviderForModelSync, Vt as resolveProjectForIssue, ar as resolveProjectFromIssueSync, ci as getOverdeckHome, di as packageRoot, dt as fmix32, ei as claudeSessionTranscriptExists, et as init_roles, f as loadConfigSync, fi as resolveOhmypiExtensionPath, ft as fnv1a32, gr as init_issue_id, it as getModelCapabilitySync, l as isClaudeCodeChannelsMcpEnabled, li as init_paths, lt as resolveModelIdSync, ot as hasModelCapabilitySync, pi as sessionFilePath, pt as init_percent, q as init_openai_compatible_proxy, st as init_model_capabilities, t as init_config_yaml, ti as encodeClaudeProjectDir, tt as resolveModel, u as isTldrEnabledSync, ui as isDevMode, ut as CLIPROXY_GPT56_CONTEXT_WINDOW, wn as shouldCommitLegacyWorkspaceArtifacts, xr as require_dist, yr as resolveBareNumericIdSync, zn as getProjectSync, zt as readIssueRecordSync } from "./config-yaml-CxdwhAIA.js";
|
|
3
|
+
import { i as emitActivityTtsSync, o as init_activity_logger, r as emitActivityEntrySync } from "./activity-logger-CyteR4JO.js";
|
|
4
|
+
import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-BDQDRopn.js";
|
|
5
|
+
import { A as listPaneValues, D as killSession, E as isPaneDead, H as sessionExists, O as killSessionSync, P as listSessionsSync, R as sendEscapeKeyAsync, U as sessionExistsSync, V as sendRawKeystroke, W as setOption, a as capturePaneSync, c as createSessionSync, i as capturePane, m as exactPaneTarget, ot as init_child_env, rt as BLANKED_PROVIDER_ENV, s as createSession, w as init_tmux, z as sendKeys } from "./tmux-CfDHob9M.js";
|
|
6
|
+
import { a as init_event_store, i as initEventStore } from "./event-store-CrHcVC5_.js";
|
|
7
|
+
import { o as OHMYPI_BEHAVIOR, s as getHarnessBehavior } from "./src-B948bGVR.js";
|
|
8
|
+
import { C as setReviewStatusSync, I as init_pipeline_agent_reader, J as getOverdeckAgentStateSync, L as registerPipelineTelemetryAgentReader, X as listOverdeckAgentStatesSync, Y as init_agent_state_sync, Z as saveOverdeckAgentStateSync, d as getReviewStatusSync, p as init_review_status, y as resetPipelineVerdictsForWorkStartSync } from "./review-status-CGvlA4o_.js";
|
|
9
|
+
import { n as logAgentLifecycleSync, t as init_persistent_logger } from "./persistent-logger-H_VjuOu7.js";
|
|
10
|
+
import { i as countAgentsByStatus, o as init_agents$1 } from "./agents-J5mEnekq.js";
|
|
11
|
+
import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-DRqZ8lAz.js";
|
|
12
|
+
import { o as getPricingSync, s as init_cost } from "./cost-DpgYmYqR.js";
|
|
13
|
+
import { _ as init_tier_metrics, g as estimateFeedDeliveryTokens, v as recordTierFeedDelivery } from "./cost-sync-tOCCGnEt.js";
|
|
14
|
+
import { a as persistCurrentSessionId, c as isAgentStateServiceInProcess, i as logLauncherSessionPinned, n as createFreshSessionIdentity, o as getRuntimeSnapshot, r as init_session_history, s as init_agent_runtime_mirror } from "./session-history-3ON_IJjm.js";
|
|
15
|
+
import { t as init_behavior } from "./behavior-td6-xhQk.js";
|
|
16
|
+
import { i as ensureInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-DzK385vD.js";
|
|
17
|
+
import { i as readReviewStatusMap, n as init_review_status_source, r as isRoleTerminal } from "./review-status-source-DIk1JSow.js";
|
|
18
|
+
import { m as readWorkspacePlanSync, o as init_io } from "./io-B00PBNku.js";
|
|
19
|
+
import { c as bridgeGeminiAuthToCliproxy, d as getCliproxyAuthDir, g as getCliproxyLogPath, l as decodeJwtPayload$1, p as getCliproxyClientEnv, s as bridgeCodexAuthToCliproxySync, v as init_cliproxy } from "./cliproxy-C5fMJ7rY.js";
|
|
20
|
+
import { L as normalizeHarness, R as reactivateConversationForSpawn, S as getConversationByName, k as init_conversations, y as createConversation } from "./conversations-D0UEdLtk.js";
|
|
21
|
+
import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-B6HpNWRy.js";
|
|
22
|
+
import { a as readCavemanVariant, n as init_workspace } from "./workspace-DQkRPLlQ.js";
|
|
23
|
+
import { C as init_launcher_generator, D as requireModelOverrideSync, E as normalizeModelOverrideSync, O as shellQuoteModelIdSync, S as generateLauncherScriptSync, T as init_model_validation, _ as init_tmux_dedup, b as isOperatorStartedBy, f as completeKeyedSubmit, i as init_auto_spawn_consent, s as withAutoSpawnConsentClaim, v as sendKeysDedup, x as normalizeFlywheelRunId, y as init_provenance } from "./auto-spawn-consent-CQ9Bi9q6.js";
|
|
24
|
+
import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-CpbpvUQ2.js";
|
|
25
|
+
import { E as init_layers, I as workspaceContextFile, P as resolveWorkspaceContextFile, c as init_render, i as workspaceContextWithoutProjectLayer, l as renderGlobalLayer, r as init_assemble, u as renderProjectLayer, v as init_harness, y as renderForHarness } from "./assemble-Bgwqv-Ro.js";
|
|
26
|
+
import { a as extractThreadIdFromRollout, c as initCodexHome, l as init_codex, o as findLatestRollout } from "./codex-BzGDW_d3.js";
|
|
27
|
+
import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-BSpiXaLw.js";
|
|
28
|
+
import { f as init_config, m as loadConfigSync$1 } from "./config-BvLe652W.js";
|
|
29
|
+
import { a as getFlywheelActiveRunIdSync, c as init_control_settings } from "./control-settings-CiqGxXnc.js";
|
|
30
|
+
import { n as createTrackerFromConfig, r as init_factory, t as createTracker } from "./factory-Cmm9Hsho.js";
|
|
31
|
+
import { a as getWorkspaceStackHealth, s as init_stack_health } from "./stack-health-DqLTiEu4.js";
|
|
32
|
+
import { i as createActiveSlice, l as init_dag, o as getDispatchableItems, s as groupItemsByWave } from "./dag-BtkgLeqY.js";
|
|
33
|
+
import { c as generateFixedPointPromptSync, f as initHookSync, n as checkHookSync, p as init_hooks } from "./hooks-DbtbimEf.js";
|
|
34
|
+
import { a as init_git_utils, c as rehydrateHeadAnchor, l as renderWorkspaceGitShowPromise } from "./git-utils-CsvYfJU3.js";
|
|
35
|
+
import { n as init_workspace_anchor_drift, t as evaluateWorkspaceAnchorDrift } from "./workspace-anchor-drift-DXYIAHzr.js";
|
|
36
|
+
import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-BAJu5MX8.js";
|
|
37
|
+
import { a as loadCloisterConfigSync, r as init_config$1 } from "./config-Bi3u1VK7.js";
|
|
38
|
+
import { t as init_reap_terminal_sessions } from "./reap-terminal-sessions-Qf-9LVQc.js";
|
|
39
|
+
import { c as isStateMigrated, o as init_state_home } from "./state-home-722Dkx92.js";
|
|
40
|
+
import { n as provisionClaudeHooks, t as init_claude_hooks_provision } from "./claude-hooks-provision-Bjitl9aI.js";
|
|
41
|
+
import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-DCo6s6ks.js";
|
|
42
|
+
import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-DfFxa9-n.js";
|
|
43
|
+
import { createRequire } from "node:module";
|
|
41
44
|
import { dirname, join, relative } from "node:path";
|
|
42
45
|
import { Data, Duration, Effect, FileSystem } from "effect";
|
|
43
46
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, rmSync, statSync, statfsSync, unlinkSync, writeFileSync } from "fs";
|
|
44
|
-
import { basename as basename$1, dirname as dirname$1, join as join$1, resolve as resolve$1 } from "path";
|
|
47
|
+
import { basename as basename$1, dirname as dirname$1, join as join$1, relative as relative$1, resolve as resolve$1, sep as sep$1 } from "path";
|
|
45
48
|
import { homedir } from "os";
|
|
46
49
|
import { cpus as cpus$1, loadavg as loadavg$1, platform as platform$1, totalmem as totalmem$1 } from "node:os";
|
|
47
50
|
import { chmodSync as chmodSync$1, closeSync as closeSync$1, constants, cpSync, createReadStream as createReadStream$1, existsSync as existsSync$1, mkdirSync as mkdirSync$1, openSync as openSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, renameSync as renameSync$1, rmSync as rmSync$1, statSync as statSync$1, unlinkSync as unlinkSync$1, writeFileSync as writeFileSync$1, writeSync } from "node:fs";
|
|
48
|
-
import { chmod, mkdir, readFile, stat as stat$1, writeFile } from "node:fs/promises";
|
|
49
|
-
import { randomUUID } from "crypto";
|
|
51
|
+
import { chmod, mkdir, readFile, readdir, readlink, stat as stat$1, writeFile } from "node:fs/promises";
|
|
52
|
+
import { createHash, randomUUID } from "crypto";
|
|
50
53
|
import { ChildProcess } from "effect/unstable/process";
|
|
51
54
|
import { mkdir as mkdir$1, open as open$1, readFile as readFile$1, readdir as readdir$1, rename as rename$1, rm as rm$1, stat as stat$2, writeFile as writeFile$1 } from "fs/promises";
|
|
52
55
|
import { platform as platform$2 } from "process";
|
|
@@ -1099,6 +1102,31 @@ var init_identity = __esmMin((() => {
|
|
|
1099
1102
|
SINGLETON_AGENT_IDS = new Set(["flywheel-orchestrator", "sequencer-runner"]);
|
|
1100
1103
|
}));
|
|
1101
1104
|
//#endregion
|
|
1105
|
+
//#region ../../lib/deploy/active-dashboard-bundle.ts
|
|
1106
|
+
function activeDashboardBundleFile() {
|
|
1107
|
+
return join$1(getOverdeckHome(), "active-dashboard-bundle.json");
|
|
1108
|
+
}
|
|
1109
|
+
function isInside(parent, candidate) {
|
|
1110
|
+
const pathFromParent = relative$1(resolve$1(parent), resolve$1(candidate));
|
|
1111
|
+
return pathFromParent === "" || pathFromParent !== ".." && !pathFromParent.startsWith(`..${sep$1}`);
|
|
1112
|
+
}
|
|
1113
|
+
function readActiveDashboardBundleSync() {
|
|
1114
|
+
try {
|
|
1115
|
+
const parsed = JSON.parse(readFileSync(activeDashboardBundleFile(), "utf8"));
|
|
1116
|
+
if (typeof parsed.repoRoot !== "string" || typeof parsed.deployRoot !== "string" || typeof parsed.serverPath !== "string" || !isInside(parsed.deployRoot, parsed.serverPath) || !existsSync(parsed.serverPath)) return null;
|
|
1117
|
+
return {
|
|
1118
|
+
repoRoot: resolve$1(parsed.repoRoot),
|
|
1119
|
+
deployRoot: resolve$1(parsed.deployRoot),
|
|
1120
|
+
serverPath: resolve$1(parsed.serverPath)
|
|
1121
|
+
};
|
|
1122
|
+
} catch {
|
|
1123
|
+
return null;
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
var init_active_dashboard_bundle = __esmMin((() => {
|
|
1127
|
+
init_paths();
|
|
1128
|
+
}));
|
|
1129
|
+
//#endregion
|
|
1102
1130
|
//#region ../../lib/channels/pty-supervisor-locate.ts
|
|
1103
1131
|
/**
|
|
1104
1132
|
* Locate (and if necessary materialize) the PTY supervisor artifact.
|
|
@@ -1125,15 +1153,63 @@ var init_identity = __esmMin((() => {
|
|
|
1125
1153
|
* (content-hash keyed over the whole staged tree, so an app upgrade
|
|
1126
1154
|
* refreshes it even when only non-entry files changed) and the vendored
|
|
1127
1155
|
* packages land under node_modules/ there for normal Node resolution.
|
|
1156
|
+
* 3. <activeBundle.repoRoot>/dist/pty-supervisor.js — the primary checkout a
|
|
1157
|
+
* `pan reload` deployment was built from (PAN-3172).
|
|
1158
|
+
*
|
|
1159
|
+
* A candidate is only accepted when its own bare imports actually resolve from
|
|
1160
|
+
* where it sits. Existence alone is not enough: `pan reload` runs the dashboard
|
|
1161
|
+
* out of ~/.overdeck/deployments/dashboard/.pan-reload-generation-{a,b}, and a
|
|
1162
|
+
* generation whose node_modules cannot resolve @lydell/node-pty produces a
|
|
1163
|
+
* supervisor that dies on ERR_MODULE_NOT_FOUND before it ever binds its socket
|
|
1164
|
+
* — every conversation spawned afterwards then died on a socket timeout with no
|
|
1165
|
+
* hint of the real cause (PAN-3172). Falling through to the primary checkout,
|
|
1166
|
+
* whose node_modules is complete, keeps spawns alive; that copy is the same
|
|
1167
|
+
* build, since activateDashboardDeployment() copies the generation's dist/ into
|
|
1168
|
+
* the primary checkout.
|
|
1128
1169
|
*
|
|
1129
|
-
* Missing everywhere is a build/packaging defect and throws —
|
|
1130
|
-
* degrade a spawn that the caller expects to be supervised.
|
|
1170
|
+
* Missing (or unresolvable) everywhere is a build/packaging defect and throws —
|
|
1171
|
+
* never silently degrade a spawn that the caller expects to be supervised.
|
|
1131
1172
|
*/
|
|
1173
|
+
/**
|
|
1174
|
+
* Bare package specifiers the built supervisor imports but cannot resolve from
|
|
1175
|
+
* its own location. Empty means the artifact can start where it sits.
|
|
1176
|
+
*
|
|
1177
|
+
* Only a genuine module-not-found counts. A package that is present but whose
|
|
1178
|
+
* exports refuse the `require` condition still resolves under `import`, so it
|
|
1179
|
+
* must not be reported as missing.
|
|
1180
|
+
*/
|
|
1181
|
+
function unresolvedSupervisorImports(scriptPath) {
|
|
1182
|
+
const source = readFileSync$1(scriptPath, "utf8");
|
|
1183
|
+
const requireFrom = createRequire(scriptPath);
|
|
1184
|
+
const missing = /* @__PURE__ */ new Set();
|
|
1185
|
+
for (const match of source.matchAll(IMPORT_SOURCE_PATTERN)) {
|
|
1186
|
+
const specifier = match[2];
|
|
1187
|
+
if (!specifier || !PACKAGE_SPECIFIER_PATTERN.test(specifier)) continue;
|
|
1188
|
+
try {
|
|
1189
|
+
requireFrom.resolve(specifier);
|
|
1190
|
+
} catch (error) {
|
|
1191
|
+
const code = error.code;
|
|
1192
|
+
if (code === "MODULE_NOT_FOUND" || code === "ERR_MODULE_NOT_FOUND") missing.add(specifier);
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
return [...missing];
|
|
1196
|
+
}
|
|
1132
1197
|
function resolvePtySupervisorScriptPath() {
|
|
1133
|
-
const
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1198
|
+
const activeBundle = readActiveDashboardBundleSync();
|
|
1199
|
+
const candidates = [
|
|
1200
|
+
join(packageRoot, "dist", "pty-supervisor.js"),
|
|
1201
|
+
join(moduleDir, "supervisor", "pty-supervisor.js"),
|
|
1202
|
+
...activeBundle ? [join(activeBundle.repoRoot, "dist", "pty-supervisor.js")] : []
|
|
1203
|
+
];
|
|
1204
|
+
const rejected = [];
|
|
1205
|
+
for (const candidate of candidates) {
|
|
1206
|
+
if (!existsSync$1(candidate)) continue;
|
|
1207
|
+
const entry = dirname(candidate) === join(moduleDir, "supervisor") ? materializePtySupervisorRuntime(dirname(candidate)) : candidate;
|
|
1208
|
+
const missing = unresolvedSupervisorImports(entry);
|
|
1209
|
+
if (missing.length === 0) return entry;
|
|
1210
|
+
rejected.push(`${entry} cannot resolve ${missing.join(", ")}`);
|
|
1211
|
+
}
|
|
1212
|
+
if (rejected.length > 0) throw new Error(`pty-supervisor cannot start — its dependencies are missing from every built copy: ${rejected.join("; ")}. Reinstall dependencies where the dashboard is running from (\`bun install\`), then rebuild.`);
|
|
1137
1213
|
throw new Error("pty-supervisor build artifact missing — run `npm run build`.");
|
|
1138
1214
|
}
|
|
1139
1215
|
/**
|
|
@@ -1192,10 +1268,13 @@ function materializePtySupervisorRuntime(stagedDir, overdeckHome = getOverdeckHo
|
|
|
1192
1268
|
}
|
|
1193
1269
|
return entry;
|
|
1194
1270
|
}
|
|
1195
|
-
var moduleDir;
|
|
1271
|
+
var moduleDir, IMPORT_SOURCE_PATTERN, PACKAGE_SPECIFIER_PATTERN;
|
|
1196
1272
|
var init_pty_supervisor_locate = __esmMin((() => {
|
|
1273
|
+
init_active_dashboard_bundle();
|
|
1197
1274
|
init_paths();
|
|
1198
1275
|
moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
1276
|
+
IMPORT_SOURCE_PATTERN = /\b(?:from|import)\s*\(?\s*(["'])([^"'\n]+)\1/g;
|
|
1277
|
+
PACKAGE_SPECIFIER_PATTERN = /^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*(?:\/[^\s]*)?$/;
|
|
1199
1278
|
}));
|
|
1200
1279
|
//#endregion
|
|
1201
1280
|
//#region ../../lib/pty-token.ts
|
|
@@ -1232,6 +1311,12 @@ var init_pty_token = __esmMin((() => {
|
|
|
1232
1311
|
PTY_TOKEN_HEADER = "x-overdeck-pty-token";
|
|
1233
1312
|
}));
|
|
1234
1313
|
//#endregion
|
|
1314
|
+
//#region ../../lib/resume-contract.ts
|
|
1315
|
+
function buildResumeContract(cause) {
|
|
1316
|
+
return `${cause === "operator" ? "The operator resumed this session after stopping or pausing it." : cause === "message" ? "This session was resumed because a new message arrived while it was stopped." : "This session was restored after its prior process ended unexpectedly, such as during a crash or reboot."} The conversation transcript was restored, but process-local machinery was not. Re-establish any timers or wakeups, monitors, background processes, loops, or cron work you still need before continuing. If this session runs a recurring tick loop, explicitly arm its next wakeup now.`;
|
|
1317
|
+
}
|
|
1318
|
+
var init_resume_contract = __esmMin((() => {}));
|
|
1319
|
+
//#endregion
|
|
1235
1320
|
//#region ../../lib/cloister/auto-resume-config.ts
|
|
1236
1321
|
function positiveNumber(value) {
|
|
1237
1322
|
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
@@ -1381,6 +1466,8 @@ function cleanAgentState(raw) {
|
|
|
1381
1466
|
costSoFar: raw.costSoFar,
|
|
1382
1467
|
sessionId: raw.sessionId,
|
|
1383
1468
|
roleRunHead: raw.roleRunHead,
|
|
1469
|
+
flywheelRunId: raw.flywheelRunId,
|
|
1470
|
+
startedBy: raw.startedBy,
|
|
1384
1471
|
channelsEnabled: raw.channelsEnabled,
|
|
1385
1472
|
supervisorEnabled: raw.supervisorEnabled,
|
|
1386
1473
|
deliveryMethod: raw.deliveryMethod,
|
|
@@ -1670,6 +1757,33 @@ function decideResumeGate(block, intent, context = {}) {
|
|
|
1670
1757
|
reason: block.reason
|
|
1671
1758
|
};
|
|
1672
1759
|
}
|
|
1760
|
+
if (intent === "merge-preparation") {
|
|
1761
|
+
if (block.gate === "paused") {
|
|
1762
|
+
if (block.yieldedByScheduler === true) return {
|
|
1763
|
+
decision: "proceed",
|
|
1764
|
+
clearYield: true
|
|
1765
|
+
};
|
|
1766
|
+
return {
|
|
1767
|
+
decision: "block",
|
|
1768
|
+
reason: `${block.reason}; run pan unpause before merging`,
|
|
1769
|
+
needsYou: true
|
|
1770
|
+
};
|
|
1771
|
+
}
|
|
1772
|
+
if (block.gate === "troubled") return {
|
|
1773
|
+
decision: "block",
|
|
1774
|
+
reason: `${block.reason}; run pan untroubled after investigating the crash`,
|
|
1775
|
+
needsYou: true
|
|
1776
|
+
};
|
|
1777
|
+
if (block.gate === "stopped-by-user") return {
|
|
1778
|
+
decision: "proceed",
|
|
1779
|
+
clearStoppedByUser: true
|
|
1780
|
+
};
|
|
1781
|
+
return {
|
|
1782
|
+
decision: "proceed",
|
|
1783
|
+
overrideFailureBackoff: true,
|
|
1784
|
+
warning: `Merge preparation overrides ${block.reason}`
|
|
1785
|
+
};
|
|
1786
|
+
}
|
|
1673
1787
|
if (intent === "operator-start") {
|
|
1674
1788
|
if (block.gate === "paused") return {
|
|
1675
1789
|
decision: "block",
|
|
@@ -1748,12 +1862,14 @@ var init_agent_state = __esmMin((() => {
|
|
|
1748
1862
|
init_persistent_logger();
|
|
1749
1863
|
init_feature_registry_population();
|
|
1750
1864
|
init_identity();
|
|
1865
|
+
init_pipeline_agent_reader();
|
|
1751
1866
|
SESSION_EXITED_BEFORE_KICKOFF = "session-exited-before-kickoff";
|
|
1752
1867
|
toAgentFsError = (operation, path, cause) => new FsError({
|
|
1753
1868
|
operation,
|
|
1754
1869
|
path,
|
|
1755
1870
|
cause
|
|
1756
1871
|
});
|
|
1872
|
+
registerPipelineTelemetryAgentReader(getAgentStateSync);
|
|
1757
1873
|
getAgentState = (agentId) => {
|
|
1758
1874
|
return Effect.try({
|
|
1759
1875
|
try: () => getAgentStateSync(agentId),
|
|
@@ -1855,15 +1971,16 @@ function buildResumeContinueMessage(state) {
|
|
|
1855
1971
|
].join(" ");
|
|
1856
1972
|
return buildDefaultResumeContinueMessage(issueId);
|
|
1857
1973
|
}
|
|
1858
|
-
async function buildResumeMessageForAgent(state, fallbackMessage, callerMessage) {
|
|
1974
|
+
async function buildResumeMessageForAgent(state, fallbackMessage, callerMessage, cause = state.stoppedByUser === true ? "operator" : callerMessage ? "message" : "system") {
|
|
1975
|
+
const contract = buildResumeContract(cause);
|
|
1859
1976
|
if (state.role !== "work" || state.kickoffDelivered !== false) return {
|
|
1860
|
-
message: callerMessage ?? fallbackMessage
|
|
1977
|
+
message: `${callerMessage ?? fallbackMessage}\n\n${contract}`,
|
|
1861
1978
|
redeliveringKickoff: false
|
|
1862
1979
|
};
|
|
1863
1980
|
const promptPath = join$1(getAgentDir(state.id), "initial-prompt.md");
|
|
1864
1981
|
try {
|
|
1865
1982
|
return {
|
|
1866
|
-
message: `${await readFile$1(promptPath, "utf-8")}${callerMessage ? `\n\n---\n\nAdditional message delivered during resume:\n\n${callerMessage}` : ""}`,
|
|
1983
|
+
message: `${await readFile$1(promptPath, "utf-8")}${callerMessage ? `\n\n---\n\nAdditional message delivered during resume:\n\n${callerMessage}` : ""}\n\n${contract}`,
|
|
1867
1984
|
redeliveringKickoff: true
|
|
1868
1985
|
};
|
|
1869
1986
|
} catch (err) {
|
|
@@ -2100,6 +2217,7 @@ var init_supervisor_channels = __esmMin((() => {
|
|
|
2100
2217
|
init_pty_supervisor_locate();
|
|
2101
2218
|
init_providers();
|
|
2102
2219
|
init_pty_token();
|
|
2220
|
+
init_resume_contract();
|
|
2103
2221
|
init_tmux();
|
|
2104
2222
|
init_agent_state();
|
|
2105
2223
|
}));
|
|
@@ -2569,7 +2687,7 @@ var init_provider_env = __esmMin((() => {
|
|
|
2569
2687
|
"NOUS_API_KEY",
|
|
2570
2688
|
"DASHSCOPE_API_KEY"
|
|
2571
2689
|
];
|
|
2572
|
-
GPT_56_CODEX_CLIENT_CONTEXT_WINDOW =
|
|
2690
|
+
GPT_56_CODEX_CLIENT_CONTEXT_WINDOW = CLIPROXY_GPT56_CONTEXT_WINDOW;
|
|
2573
2691
|
GPT_56_MODELS = new Set([
|
|
2574
2692
|
"gpt-5.6-sol",
|
|
2575
2693
|
"gpt-5.6-terra",
|
|
@@ -2756,7 +2874,7 @@ async function createOhmypiFifoPromise(agentId, home) {
|
|
|
2756
2874
|
mode: 448
|
|
2757
2875
|
});
|
|
2758
2876
|
if (existsSync$1(paths.fifoPath)) unlinkSync$1(paths.fifoPath);
|
|
2759
|
-
await execAsync$
|
|
2877
|
+
await execAsync$7(`mkfifo -m 600 ${shellQuote$1(paths.fifoPath)}`);
|
|
2760
2878
|
return paths.fifoPath;
|
|
2761
2879
|
}
|
|
2762
2880
|
/**
|
|
@@ -2798,10 +2916,10 @@ function shellQuote$1(s) {
|
|
|
2798
2916
|
if (/^[A-Za-z0-9._/-]+$/.test(s)) return s;
|
|
2799
2917
|
return `'${s.replace(/'/g, `'\\''`)}'`;
|
|
2800
2918
|
}
|
|
2801
|
-
var execAsync$
|
|
2919
|
+
var execAsync$7, OhmypiNotReady, OhmypiFifoError, createOhmypiFifo;
|
|
2802
2920
|
var init_ohmypi_fifo = __esmMin((() => {
|
|
2803
2921
|
init_paths();
|
|
2804
|
-
execAsync$
|
|
2922
|
+
execAsync$7 = promisify(exec);
|
|
2805
2923
|
OhmypiNotReady = class extends Error {
|
|
2806
2924
|
code = "OHMYPI_NOT_READY";
|
|
2807
2925
|
constructor(message) {
|
|
@@ -2883,12 +3001,12 @@ async function claudeSystemPromptFiles(workspace, harness) {
|
|
|
2883
3001
|
}
|
|
2884
3002
|
files.push(await ensureSessionContextBriefingFile());
|
|
2885
3003
|
if (behavior.contextLayerKind === "pi") {
|
|
2886
|
-
const { piGlobalContextFile } = await import("./context-layers-
|
|
3004
|
+
const { piGlobalContextFile } = await import("./context-layers-DAG83UZt.js");
|
|
2887
3005
|
const globalFile = piGlobalContextFile();
|
|
2888
3006
|
if (existsSync(globalFile)) files.unshift(globalFile);
|
|
2889
3007
|
}
|
|
2890
3008
|
if (behavior.contextLayerKind === "codex") {
|
|
2891
|
-
const { codexGlobalContextFile } = await import("./context-layers-
|
|
3009
|
+
const { codexGlobalContextFile } = await import("./context-layers-DAG83UZt.js");
|
|
2892
3010
|
const globalFile = codexGlobalContextFile();
|
|
2893
3011
|
if (existsSync(globalFile)) files.unshift(globalFile);
|
|
2894
3012
|
}
|
|
@@ -2915,14 +3033,14 @@ async function hasAgentRuntimeInSubtree(rootPid, harness = "claude-code") {
|
|
|
2915
3033
|
if (seen.has(pid) || !/^\d+$/.test(pid)) continue;
|
|
2916
3034
|
seen.add(pid);
|
|
2917
3035
|
try {
|
|
2918
|
-
const { stdout: comm } = await execAsync$
|
|
3036
|
+
const { stdout: comm } = await execAsync$5(`ps -p ${pid} -o comm=`);
|
|
2919
3037
|
const name = comm.trim();
|
|
2920
3038
|
if (expectedProcessNames.has(name)) return true;
|
|
2921
3039
|
} catch {
|
|
2922
3040
|
continue;
|
|
2923
3041
|
}
|
|
2924
3042
|
try {
|
|
2925
|
-
const { stdout: kids } = await execAsync$
|
|
3043
|
+
const { stdout: kids } = await execAsync$5(`pgrep -P ${pid}`);
|
|
2926
3044
|
for (const kid of kids.trim().split("\n").filter(Boolean)) queue.push(kid);
|
|
2927
3045
|
} catch {}
|
|
2928
3046
|
}
|
|
@@ -3183,7 +3301,7 @@ async function injectPiPromptTimeMemory(agentId, prompt) {
|
|
|
3183
3301
|
agentRole: agentState.role ?? "work",
|
|
3184
3302
|
agentHarness: agentState.harness ?? "claude-code"
|
|
3185
3303
|
};
|
|
3186
|
-
const { injectPromptTimeMemory } = await import("./injection-
|
|
3304
|
+
const { injectPromptTimeMemory } = await import("./injection-Bl8d_jHZ.js");
|
|
3187
3305
|
const result = await injectPromptTimeMemory({
|
|
3188
3306
|
prompt,
|
|
3189
3307
|
identity,
|
|
@@ -3217,7 +3335,7 @@ async function injectPiConversationMemory(opts, prompt) {
|
|
|
3217
3335
|
agentRole: "work",
|
|
3218
3336
|
agentHarness: "ohmypi"
|
|
3219
3337
|
};
|
|
3220
|
-
const { injectPromptTimeMemory } = await import("./injection-
|
|
3338
|
+
const { injectPromptTimeMemory } = await import("./injection-Bl8d_jHZ.js");
|
|
3221
3339
|
const result = await injectPromptTimeMemory({
|
|
3222
3340
|
prompt,
|
|
3223
3341
|
identity,
|
|
@@ -3387,13 +3505,13 @@ async function getRoleRuntimeBaseCommand(model, agentName, role, harness = "clau
|
|
|
3387
3505
|
}
|
|
3388
3506
|
const roleInject = definitionPath ? roleSystemPromptInjectionSync(definitionPath, effort) : "";
|
|
3389
3507
|
const nameFlag = ` --name ${agentName}`;
|
|
3390
|
-
const effortFlag = !definitionPath
|
|
3508
|
+
const effortFlag = !definitionPath ? ` --effort ${effort ?? "high"}` : "";
|
|
3391
3509
|
const permissionFlags = ` ${getClaudePermissionFlagsStringSync()}`;
|
|
3392
3510
|
const printFlag = "";
|
|
3393
3511
|
if (provider.name === "openai" && await getProviderAuthMode(validatedModel) === "subscription") return `claude${printFlag}${roleInject}${permissionFlags} --model ${shellQuoteModelIdSync(CLI_PROXY_MODEL_ALIASES[validatedModel] ?? validatedModel)}${effortFlag}${nameFlag}`;
|
|
3394
3512
|
return `claude${printFlag}${roleInject}${permissionFlags} --model ${quotedModel}${effortFlag}${nameFlag}`;
|
|
3395
3513
|
}
|
|
3396
|
-
var import_dist, execAsync$
|
|
3514
|
+
var import_dist, execAsync$5, missingRoleDefinitionWarnings, OHMYPI_AGENT_READY_TIMEOUT_SECONDS;
|
|
3397
3515
|
var init_runtime_command = __esmMin((() => {
|
|
3398
3516
|
import_dist = /* @__PURE__ */ __toESM(require_dist(), 1);
|
|
3399
3517
|
init_claude_permissions();
|
|
@@ -3414,7 +3532,7 @@ var init_runtime_command = __esmMin((() => {
|
|
|
3414
3532
|
init_agent_state();
|
|
3415
3533
|
init_identity();
|
|
3416
3534
|
init_provider_env();
|
|
3417
|
-
execAsync$
|
|
3535
|
+
execAsync$5 = promisify$1(exec$1);
|
|
3418
3536
|
missingRoleDefinitionWarnings = /* @__PURE__ */ new Set();
|
|
3419
3537
|
OHMYPI_AGENT_READY_TIMEOUT_SECONDS = 120;
|
|
3420
3538
|
}));
|
|
@@ -3564,11 +3682,6 @@ var init_staffing = __esmMin((() => {
|
|
|
3564
3682
|
}));
|
|
3565
3683
|
//#endregion
|
|
3566
3684
|
//#region ../../lib/agents/spawn-prep.ts
|
|
3567
|
-
function normalizeFlywheelRunId(runId) {
|
|
3568
|
-
if (!runId) return void 0;
|
|
3569
|
-
const trimmed = runId.trim();
|
|
3570
|
-
return /^RUN-\d+$/.test(trimmed) ? trimmed : void 0;
|
|
3571
|
-
}
|
|
3572
3685
|
function resolveFlywheelSpawnEnv(role, runIdOverride) {
|
|
3573
3686
|
const runId = normalizeFlywheelRunId(runIdOverride ?? getFlywheelActiveRunIdSync());
|
|
3574
3687
|
return runId ? {
|
|
@@ -3576,6 +3689,11 @@ function resolveFlywheelSpawnEnv(role, runIdOverride) {
|
|
|
3576
3689
|
OVERDECK_FLYWHEEL_AGENT_ROLE: role
|
|
3577
3690
|
} : {};
|
|
3578
3691
|
}
|
|
3692
|
+
function resolveAgentStartedBy(explicit, flywheelRunId, environmentToken = process.env["OVERDECK_AGENT_STARTED_BY"]) {
|
|
3693
|
+
const resolved = explicit?.trim() || environmentToken?.trim() || (flywheelRunId ? `flywheel:${flywheelRunId}` : "");
|
|
3694
|
+
if (!resolved) throw new Error("Agent spawn provenance is required: pass startedBy at the launch entry point.");
|
|
3695
|
+
return resolved;
|
|
3696
|
+
}
|
|
3579
3697
|
function flywheelEnvExports(env) {
|
|
3580
3698
|
return [env.OVERDECK_FLYWHEEL_RUN_ID ? `export OVERDECK_FLYWHEEL_RUN_ID=${env.OVERDECK_FLYWHEEL_RUN_ID}` : void 0, env.OVERDECK_FLYWHEEL_AGENT_ROLE ? `export OVERDECK_FLYWHEEL_AGENT_ROLE=${env.OVERDECK_FLYWHEEL_AGENT_ROLE}` : void 0].filter((value) => value !== void 0);
|
|
3581
3699
|
}
|
|
@@ -3744,7 +3862,7 @@ async function transitionIssueToInReview(issueId, workspacePath) {
|
|
|
3744
3862
|
async function buildAgentLaunchConfig(opts) {
|
|
3745
3863
|
const model = requireModelOverrideSync(opts.model);
|
|
3746
3864
|
try {
|
|
3747
|
-
const { injectOverdeckInfraDeny } = await import("./claude-settings-overlay-
|
|
3865
|
+
const { injectOverdeckInfraDeny } = await import("./claude-settings-overlay-BzkHYDwR.js");
|
|
3748
3866
|
await Effect.runPromise(injectOverdeckInfraDeny(opts.workspace));
|
|
3749
3867
|
} catch (err) {
|
|
3750
3868
|
console.warn(`[agents] injectOverdeckInfraDeny failed for ${opts.agentId} (non-fatal): ${err instanceof Error ? err.message : err}`);
|
|
@@ -3773,6 +3891,7 @@ async function buildAgentLaunchConfig(opts) {
|
|
|
3773
3891
|
providerExports,
|
|
3774
3892
|
baseCommand: behavior.launchCommandKind !== "claude-code" ? await getAgentRuntimeBaseCommand(model, opts.agentId, launchRole, opts.harness) : `claude ${getClaudePermissionFlagsStringSync()}${roleSystemPromptInjectionSync(roleAgentDefinitionPath(launchRole))}`,
|
|
3775
3893
|
resumeSessionId: opts.resumeSessionId,
|
|
3894
|
+
overdeckEnv: { agentId: opts.agentId },
|
|
3776
3895
|
model: behavior.launchCommandKind !== "claude-code" || providerExports?.includes("ANTHROPIC_BASE_URL") ? model : void 0,
|
|
3777
3896
|
extraArgs: behavior.launchCommandKind !== "claude-code" ? void 0 : `--name ${opts.agentId}`,
|
|
3778
3897
|
appendSystemPromptFiles: await claudeSystemPromptFiles(opts.workspace, opts.harness),
|
|
@@ -3798,6 +3917,7 @@ async function buildAgentLaunchConfig(opts) {
|
|
|
3798
3917
|
providerExports,
|
|
3799
3918
|
cavemanExports,
|
|
3800
3919
|
baseCommand: await getAgentRuntimeBaseCommand(model, opts.agentId, agentDefinition, opts.harness ?? "claude-code", opts.effort),
|
|
3920
|
+
overdeckEnv: { agentId: opts.agentId },
|
|
3801
3921
|
sessionId: behavior.sessionIdSource === "launcher-session-id" ? opts.sessionId : void 0,
|
|
3802
3922
|
appendSystemPromptFiles: await claudeSystemPromptFiles(opts.workspace, opts.harness),
|
|
3803
3923
|
extraEnvExports: opts.extraEnvExports,
|
|
@@ -3832,7 +3952,7 @@ async function retrieveSpawnTimeMemoryContext(input) {
|
|
|
3832
3952
|
agentRole: input.role,
|
|
3833
3953
|
agentHarness: input.harness
|
|
3834
3954
|
};
|
|
3835
|
-
const { injectPromptTimeMemory } = await import("./injection-
|
|
3955
|
+
const { injectPromptTimeMemory } = await import("./injection-Bl8d_jHZ.js");
|
|
3836
3956
|
return (await injectPromptTimeMemory({
|
|
3837
3957
|
prompt: input.prompt,
|
|
3838
3958
|
identity,
|
|
@@ -3923,7 +4043,7 @@ async function assertWorkspaceStackHealthyForSpawn(issueId, role, allowHost = fa
|
|
|
3923
4043
|
record.attempts += 1;
|
|
3924
4044
|
spawnStackRebuildState.set(normalizedIssue, record);
|
|
3925
4045
|
console.log(`[agents] Workspace stack for ${normalizedIssue} unhealthy (${details}) — rebuilding before spawn (attempt ${record.attempts}/${SPAWN_STACK_REBUILD_MAX_ATTEMPTS})`);
|
|
3926
|
-
const { rebuildWorkspaceStack } = await import("./rebuild-stack-
|
|
4046
|
+
const { rebuildWorkspaceStack } = await import("./rebuild-stack-DqcOVmJO.js");
|
|
3927
4047
|
const result = await Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[agents] ${normalizedIssue} stack rebuild: ${m}`) })).catch((err) => ({
|
|
3928
4048
|
success: false,
|
|
3929
4049
|
error: err instanceof Error ? err.message : String(err)
|
|
@@ -3956,6 +4076,7 @@ var init_spawn_prep = __esmMin((() => {
|
|
|
3956
4076
|
init_behavior();
|
|
3957
4077
|
init_io();
|
|
3958
4078
|
init_dag();
|
|
4079
|
+
init_provenance();
|
|
3959
4080
|
init_staffing();
|
|
3960
4081
|
init_tier_table();
|
|
3961
4082
|
init_provider_env();
|
|
@@ -4039,6 +4160,64 @@ var init_cv = __esmMin((() => {
|
|
|
4039
4160
|
init_errors();
|
|
4040
4161
|
}));
|
|
4041
4162
|
//#endregion
|
|
4163
|
+
//#region ../../lib/cloister/verdict-preservation.ts
|
|
4164
|
+
/** Decide whether a fresh work-agent session may keep verdicts earned by the current code. */
|
|
4165
|
+
async function shouldPreservePipelineVerdicts(issueId, workspacePath) {
|
|
4166
|
+
try {
|
|
4167
|
+
const status = getReviewStatusSync(issueId);
|
|
4168
|
+
if (!status) return {
|
|
4169
|
+
preserve: false,
|
|
4170
|
+
reason: "no pipeline verdicts are recorded"
|
|
4171
|
+
};
|
|
4172
|
+
if (!status.reviewedAtCommit) return {
|
|
4173
|
+
preserve: false,
|
|
4174
|
+
reason: "the review verdict has no commit anchor"
|
|
4175
|
+
};
|
|
4176
|
+
if (status.reviewStatus !== "passed" && status.reviewStatus !== "skipped") return {
|
|
4177
|
+
preserve: false,
|
|
4178
|
+
reason: `review is ${status.reviewStatus}`
|
|
4179
|
+
};
|
|
4180
|
+
if (status.testStatus !== "passed") return {
|
|
4181
|
+
preserve: false,
|
|
4182
|
+
reason: `tests are ${status.testStatus}`
|
|
4183
|
+
};
|
|
4184
|
+
if (status.verificationStatus !== "passed") return {
|
|
4185
|
+
preserve: false,
|
|
4186
|
+
reason: `verification is ${status.verificationStatus ?? "missing"}`
|
|
4187
|
+
};
|
|
4188
|
+
const verdict = await evaluateWorkspaceAnchorDrift(issueId, workspacePath, rehydrateHeadAnchor(status.reviewedAtCommit));
|
|
4189
|
+
switch (verdict.kind) {
|
|
4190
|
+
case "current": return {
|
|
4191
|
+
preserve: true,
|
|
4192
|
+
reason: "workspace HEAD matches the reviewed commit anchor"
|
|
4193
|
+
};
|
|
4194
|
+
case "benign": return {
|
|
4195
|
+
preserve: true,
|
|
4196
|
+
reason: "workspace HEAD moved without changing the reviewed code",
|
|
4197
|
+
refreshedAnchor: verdict.currentAnchor
|
|
4198
|
+
};
|
|
4199
|
+
case "drifted": return {
|
|
4200
|
+
preserve: false,
|
|
4201
|
+
reason: "workspace code changed after review"
|
|
4202
|
+
};
|
|
4203
|
+
case "unreadable": return {
|
|
4204
|
+
preserve: false,
|
|
4205
|
+
reason: "the current workspace commit anchor is unreadable"
|
|
4206
|
+
};
|
|
4207
|
+
}
|
|
4208
|
+
} catch (error) {
|
|
4209
|
+
return {
|
|
4210
|
+
preserve: false,
|
|
4211
|
+
reason: `verdict preservation check failed: ${error instanceof Error ? error.message : String(error)}`
|
|
4212
|
+
};
|
|
4213
|
+
}
|
|
4214
|
+
}
|
|
4215
|
+
var init_verdict_preservation = __esmMin((() => {
|
|
4216
|
+
init_git_utils();
|
|
4217
|
+
init_review_status();
|
|
4218
|
+
init_workspace_anchor_drift();
|
|
4219
|
+
}));
|
|
4220
|
+
//#endregion
|
|
4042
4221
|
//#region ../../lib/bridge-token.ts
|
|
4043
4222
|
function bridgeTokensDir() {
|
|
4044
4223
|
return join(getOverdeckHome(), "bridge-tokens");
|
|
@@ -4378,7 +4557,7 @@ async function postUnixSocketJson(socketPath, body, timeoutMs, token, tokenHeade
|
|
|
4378
4557
|
});
|
|
4379
4558
|
return;
|
|
4380
4559
|
}
|
|
4381
|
-
finishErr(
|
|
4560
|
+
finishErr(new SocketPostStatusError(status, `socket POST: status ${status}: ${responseBody.slice(0, 100)}`));
|
|
4382
4561
|
});
|
|
4383
4562
|
});
|
|
4384
4563
|
if (timeoutMs !== void 0) {
|
|
@@ -4400,8 +4579,9 @@ async function postUnixSocketJson(socketPath, body, timeoutMs, token, tokenHeade
|
|
|
4400
4579
|
* MCP, then tmux. Explicit socket methods and ACP targets are strict: ACP prompts
|
|
4401
4580
|
* cannot fall back to terminal injection because only session/prompt reaches the agent.
|
|
4402
4581
|
*/
|
|
4403
|
-
async function deliverAgentMessage(agentId, message, caller = "unknown", deliveryMethod) {
|
|
4582
|
+
async function deliverAgentMessage(agentId, message, caller = "unknown", deliveryMethod, opts = {}) {
|
|
4404
4583
|
const normalizedId = normalizeAgentId(agentId);
|
|
4584
|
+
const dedupKey = opts.dedupKey;
|
|
4405
4585
|
let channelsEnabled = false;
|
|
4406
4586
|
let resolvedMethod = deliveryMethod;
|
|
4407
4587
|
let state = null;
|
|
@@ -4414,6 +4594,7 @@ async function deliverAgentMessage(agentId, message, caller = "unknown", deliver
|
|
|
4414
4594
|
}
|
|
4415
4595
|
const isAcpTarget = state?.harness === "acp";
|
|
4416
4596
|
if (isAcpTarget && resolvedMethod !== "auto") throw new Error(`MessageDeliveryFailed: ACP delivery failed for ${normalizedId} (${caller}): ACP requires authenticated host RPC delivery`);
|
|
4597
|
+
if (dedupKey !== void 0) return deliverKeyedAgentMessage(normalizedId, message, caller, resolvedMethod ?? "auto", isAcpTarget, dedupKey);
|
|
4417
4598
|
if (resolvedMethod === "tmux") {
|
|
4418
4599
|
await assertTmuxTargetCanReceive(normalizedId, caller);
|
|
4419
4600
|
await Effect.runPromise(sendKeys(normalizedId, message));
|
|
@@ -4558,6 +4739,83 @@ async function deliverAgentMessage(agentId, message, caller = "unknown", deliver
|
|
|
4558
4739
|
};
|
|
4559
4740
|
}
|
|
4560
4741
|
/**
|
|
4742
|
+
* Keyed delivery cascade (PAN-2997). Only two tiers may carry a keyed
|
|
4743
|
+
* message, because only their crash-independent components enforce the key
|
|
4744
|
+
* across the COMPLETE visible side effect:
|
|
4745
|
+
*
|
|
4746
|
+
* - the PTY supervisor reserves the key synchronously (closing the concurrent
|
|
4747
|
+
* same-key race) and completes it only after its single-request
|
|
4748
|
+
* content-plus-Enter injection succeeds; and
|
|
4749
|
+
* - the tmux fallback keeps two-phase pending/terminal session markers owned
|
|
4750
|
+
* by the tmux server across paste, settle, and submit.
|
|
4751
|
+
*
|
|
4752
|
+
* App-server, ACP, and Channels acknowledge receipt without enforcing the
|
|
4753
|
+
* key, so they are never used for keyed payloads: a dashboard crash after
|
|
4754
|
+
* their side effect but before the caller's acknowledgment would replay the
|
|
4755
|
+
* wake. Explicitly requesting one of them with a key is a loud error, not a
|
|
4756
|
+
* silent downgrade.
|
|
4757
|
+
*/
|
|
4758
|
+
async function deliverKeyedAgentMessage(normalizedId, message, caller, resolvedMethod, isAcpTarget, dedupKey) {
|
|
4759
|
+
if (isAcpTarget) throw new Error(`MessageDeliveryFailed: keyed delivery failed for ${normalizedId} (${caller}): the ACP tier cannot enforce a dedup key`);
|
|
4760
|
+
if (resolvedMethod === "channels") throw new Error(`MessageDeliveryFailed: keyed delivery failed for ${normalizedId} (${caller}): the Channels tier cannot enforce a dedup key`);
|
|
4761
|
+
if (resolvedMethod === "tmux") return deliverKeyedViaTmux(normalizedId, message, caller, dedupKey);
|
|
4762
|
+
let supervisorFailure;
|
|
4763
|
+
const supervisorSocketPath = join$1(overdeckHomeForSockets(), "sockets", `pty-${normalizedId}.sock`);
|
|
4764
|
+
const ptyToken = await readPtyToken(normalizedId);
|
|
4765
|
+
if (!existsSync(supervisorSocketPath)) supervisorFailure = "socket-missing";
|
|
4766
|
+
else if (!ptyToken) supervisorFailure = "pty-token-missing";
|
|
4767
|
+
else try {
|
|
4768
|
+
const supervisorResponse = await postUnixSocketJson(supervisorSocketPath, {
|
|
4769
|
+
content: message,
|
|
4770
|
+
meta: { caller },
|
|
4771
|
+
dedupKey
|
|
4772
|
+
}, supervisorInjectionBudgetMs(message.length) + SUPERVISOR_CLIENT_MARGIN_MS, ptyToken, PTY_TOKEN_HEADER);
|
|
4773
|
+
await appendChannelDeliveryLog(normalizedId, {
|
|
4774
|
+
path: "supervisor",
|
|
4775
|
+
caller
|
|
4776
|
+
});
|
|
4777
|
+
let deduplicated = false;
|
|
4778
|
+
try {
|
|
4779
|
+
deduplicated = JSON.parse(supervisorResponse.body).deduplicated === true;
|
|
4780
|
+
} catch {}
|
|
4781
|
+
return {
|
|
4782
|
+
ok: true,
|
|
4783
|
+
path: "supervisor",
|
|
4784
|
+
deduplicated
|
|
4785
|
+
};
|
|
4786
|
+
} catch (err) {
|
|
4787
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
4788
|
+
if (!(err instanceof SocketPostStatusError)) throw new AmbiguousKeyedDeliveryError(normalizedId, caller, reason);
|
|
4789
|
+
supervisorFailure = `socket-post-failed: ${reason}`;
|
|
4790
|
+
}
|
|
4791
|
+
if (resolvedMethod === "supervisor") throw new Error(`MessageDeliveryFailed: PTY supervisor delivery failed for ${normalizedId} (${caller}): ${supervisorFailure}`);
|
|
4792
|
+
await appendChannelDeliveryLog(normalizedId, {
|
|
4793
|
+
path: "tmux",
|
|
4794
|
+
reason: supervisorFailure,
|
|
4795
|
+
caller
|
|
4796
|
+
});
|
|
4797
|
+
return {
|
|
4798
|
+
...await deliverKeyedViaTmux(normalizedId, message, caller, dedupKey),
|
|
4799
|
+
failure: supervisorFailure
|
|
4800
|
+
};
|
|
4801
|
+
}
|
|
4802
|
+
/**
|
|
4803
|
+
* Keyed tmux delivery: paste under the two-phase marker protocol, then
|
|
4804
|
+
* complete the submit. A replay that finds the pending marker completes the
|
|
4805
|
+
* prior attempt's submission WITHOUT re-pasting; a terminal marker suppresses
|
|
4806
|
+
* the replay entirely.
|
|
4807
|
+
*/
|
|
4808
|
+
async function deliverKeyedViaTmux(normalizedId, message, caller, dedupKey) {
|
|
4809
|
+
await assertTmuxTargetCanReceive(normalizedId, caller);
|
|
4810
|
+
const phase = await sendKeysDedup(normalizedId, message, dedupKey, caller);
|
|
4811
|
+
if (phase !== "deduplicated") await completeKeyedSubmit(normalizedId, dedupKey);
|
|
4812
|
+
return {
|
|
4813
|
+
ok: true,
|
|
4814
|
+
path: "tmux",
|
|
4815
|
+
deduplicated: phase === "deduplicated"
|
|
4816
|
+
};
|
|
4817
|
+
}
|
|
4818
|
+
/**
|
|
4561
4819
|
* PAN-2228: loud failure semantics for the tmux tier. `tmux send-keys` into a
|
|
4562
4820
|
* session whose pane process has EXITED (a remain-on-exit corpse) succeeds at the
|
|
4563
4821
|
* tmux level while the message lands nowhere — the zombie-kickoff failure mode
|
|
@@ -4716,16 +4974,31 @@ async function setAgentDeliveryMethod(agentId, deliveryMethod) {
|
|
|
4716
4974
|
state.deliveryMethod = deliveryMethod;
|
|
4717
4975
|
await Effect.runPromise(saveAgentState(state));
|
|
4718
4976
|
}
|
|
4719
|
-
var RESUME_TRANSCRIPT_CONFIRM_TIMEOUT_MS, RESUME_TRANSCRIPT_CONFIRM_INTERVAL_MS;
|
|
4977
|
+
var SocketPostStatusError, AmbiguousKeyedDeliveryError, RESUME_TRANSCRIPT_CONFIRM_TIMEOUT_MS, RESUME_TRANSCRIPT_CONFIRM_INTERVAL_MS;
|
|
4720
4978
|
var init_delivery = __esmMin((() => {
|
|
4721
4979
|
init_behavior();
|
|
4722
4980
|
init_agents();
|
|
4723
4981
|
init_runtime_state();
|
|
4724
4982
|
init_tmux();
|
|
4983
|
+
init_tmux_dedup();
|
|
4725
4984
|
init_bridge_token();
|
|
4726
4985
|
init_pty_token();
|
|
4727
4986
|
init_injection_budget();
|
|
4728
4987
|
init_transcript_landing();
|
|
4988
|
+
SocketPostStatusError = class extends Error {
|
|
4989
|
+
status;
|
|
4990
|
+
constructor(status, message) {
|
|
4991
|
+
super(message);
|
|
4992
|
+
this.name = "SocketPostStatusError";
|
|
4993
|
+
this.status = status;
|
|
4994
|
+
}
|
|
4995
|
+
};
|
|
4996
|
+
AmbiguousKeyedDeliveryError = class extends Error {
|
|
4997
|
+
constructor(agentId, caller, reason) {
|
|
4998
|
+
super(`MessageDeliveryFailed: ambiguous keyed delivery for ${agentId} (${caller}): ${reason} — the supervisor may have completed the injection; NOT crossing to the tmux tier with the same key`);
|
|
4999
|
+
this.name = "AmbiguousKeyedDeliveryError";
|
|
5000
|
+
}
|
|
5001
|
+
};
|
|
4729
5002
|
RESUME_TRANSCRIPT_CONFIRM_TIMEOUT_MS = 3e3;
|
|
4730
5003
|
RESUME_TRANSCRIPT_CONFIRM_INTERVAL_MS = 100;
|
|
4731
5004
|
}));
|
|
@@ -5039,7 +5312,7 @@ async function killLauncherProcessAsync(agentId) {
|
|
|
5039
5312
|
const launcherPath = join$1(AGENTS_DIR, agentId, "launcher.sh");
|
|
5040
5313
|
let pidsOut;
|
|
5041
5314
|
try {
|
|
5042
|
-
const { stdout } = await execAsync$
|
|
5315
|
+
const { stdout } = await execAsync$4(`pgrep -f ${JSON.stringify(launcherPath)}`);
|
|
5043
5316
|
pidsOut = stdout.trim();
|
|
5044
5317
|
} catch {
|
|
5045
5318
|
return;
|
|
@@ -5089,14 +5362,14 @@ function stopAgentSync(agentId) {
|
|
|
5089
5362
|
lastActivity: (/* @__PURE__ */ new Date()).toISOString()
|
|
5090
5363
|
});
|
|
5091
5364
|
}
|
|
5092
|
-
var execAsync$
|
|
5365
|
+
var execAsync$4, stopAgent;
|
|
5093
5366
|
var init_termination = __esmMin((() => {
|
|
5094
5367
|
init_agents();
|
|
5095
5368
|
init_agent_runtime();
|
|
5096
5369
|
init_paths();
|
|
5097
5370
|
init_tmux();
|
|
5098
5371
|
init_errors();
|
|
5099
|
-
execAsync$
|
|
5372
|
+
execAsync$4 = promisify$1(exec$1);
|
|
5100
5373
|
stopAgent = (agentId) => {
|
|
5101
5374
|
const normalizedId = normalizeAgentId(agentId);
|
|
5102
5375
|
return Effect.gen(function* () {
|
|
@@ -5176,8 +5449,68 @@ var init_hook_readiness = __esmMin((() => {
|
|
|
5176
5449
|
init_persistent_logger();
|
|
5177
5450
|
}));
|
|
5178
5451
|
//#endregion
|
|
5452
|
+
//#region ../../lib/agents/registered-slot-spawn.ts
|
|
5453
|
+
function buildRegisteredSlotPrompt(issueId, baseWorkspace, slot, extraPrompt) {
|
|
5454
|
+
const doc = readWorkspacePlanSync(baseWorkspace);
|
|
5455
|
+
if (!doc) throw new Error(`Registered slot spawn for ${issueId} requires a readable xBRIEF plan in ${baseWorkspace}.`);
|
|
5456
|
+
const slice = createActiveSlice(doc, {
|
|
5457
|
+
issueId: issueId.toUpperCase(),
|
|
5458
|
+
itemId: slot.slotItemId,
|
|
5459
|
+
currentItemIds: [slot.slotItemId]
|
|
5460
|
+
});
|
|
5461
|
+
const lines = [
|
|
5462
|
+
`# Registered Slot Assignment: ${slot.slotItemId}`,
|
|
5463
|
+
"",
|
|
5464
|
+
`Issue: ${issueId}`,
|
|
5465
|
+
`Slot: ${slot.slotIndex}`,
|
|
5466
|
+
`Agent: ${slot.agentId}`,
|
|
5467
|
+
`Branch: ${slot.branch}`,
|
|
5468
|
+
`Workspace: ${slot.workspace}`,
|
|
5469
|
+
"",
|
|
5470
|
+
"You are a registered slot work agent. Implement only the target xBRIEF item below, keep changes scoped to that item, and do not merge this slot branch yourself.",
|
|
5471
|
+
"",
|
|
5472
|
+
slice.prompt
|
|
5473
|
+
];
|
|
5474
|
+
const trimmedExtra = extraPrompt?.trim();
|
|
5475
|
+
if (trimmedExtra) lines.push("", "## Additional Foreman Instructions", trimmedExtra);
|
|
5476
|
+
return lines.join("\n");
|
|
5477
|
+
}
|
|
5478
|
+
async function ensureRegisteredSlotWorktree(baseWorkspace, slot) {
|
|
5479
|
+
if (existsSync$1(slot.workspace)) return;
|
|
5480
|
+
await mkdir(dirname(slot.workspace), { recursive: true });
|
|
5481
|
+
const branchExists = await gitBranchExists(baseWorkspace, slot.branch);
|
|
5482
|
+
const target = JSON.stringify(slot.workspace);
|
|
5483
|
+
const branch = JSON.stringify(slot.branch);
|
|
5484
|
+
await execAsync$3(branchExists ? `git worktree add ${target} ${branch}` : `git worktree add -b ${branch} ${target} HEAD`, { cwd: baseWorkspace });
|
|
5485
|
+
}
|
|
5486
|
+
async function gitBranchExists(workspace, branch) {
|
|
5487
|
+
try {
|
|
5488
|
+
await execAsync$3(`git show-ref --verify --quiet ${JSON.stringify(`refs/heads/${branch}`)}`, { cwd: workspace });
|
|
5489
|
+
return true;
|
|
5490
|
+
} catch {
|
|
5491
|
+
return false;
|
|
5492
|
+
}
|
|
5493
|
+
}
|
|
5494
|
+
var execAsync$3;
|
|
5495
|
+
var init_registered_slot_spawn = __esmMin((() => {
|
|
5496
|
+
init_dag();
|
|
5497
|
+
init_io();
|
|
5498
|
+
execAsync$3 = promisify(exec);
|
|
5499
|
+
}));
|
|
5500
|
+
//#endregion
|
|
5179
5501
|
//#region ../../lib/agents/spawn.ts
|
|
5180
|
-
async function spawnRun(issueId, role, options
|
|
5502
|
+
async function spawnRun(issueId, role, options) {
|
|
5503
|
+
if (role !== "work") return spawnRunWithoutConsentClaim(issueId, role, options);
|
|
5504
|
+
const flywheelRunId = resolveFlywheelSpawnEnv(role, options.flywheelRunId).OVERDECK_FLYWHEEL_RUN_ID;
|
|
5505
|
+
const startedBy = resolveAgentStartedBy(options.startedBy, flywheelRunId);
|
|
5506
|
+
const resolvedOptions = {
|
|
5507
|
+
...options,
|
|
5508
|
+
startedBy
|
|
5509
|
+
};
|
|
5510
|
+
if (isOperatorStartedBy(startedBy) || options.autoSpawnConsentRequired !== true) return spawnRunWithoutConsentClaim(issueId, role, resolvedOptions);
|
|
5511
|
+
return withAutoSpawnConsentClaim(issueId, (acceptConsent) => spawnRunWithoutConsentClaim(issueId, role, resolvedOptions, acceptConsent), { isAccepted: (state) => state.status === "running" && state.kickoffDelivered !== false });
|
|
5512
|
+
}
|
|
5513
|
+
async function spawnRunWithoutConsentClaim(issueId, role, options, acceptConsent) {
|
|
5181
5514
|
const workspace = options.workspace ?? defaultRunWorkspace(issueId);
|
|
5182
5515
|
const modelSpawnKey = `${role}:${issueId}`;
|
|
5183
5516
|
const selectedModel = determineModel({
|
|
@@ -5203,7 +5536,7 @@ async function spawnRun(issueId, role, options = {}) {
|
|
|
5203
5536
|
await ensureRegisteredSlotWorktree(workspace, slot);
|
|
5204
5537
|
}
|
|
5205
5538
|
const prompt = slot ? buildRegisteredSlotPrompt(issueId, workspace, slot, options.prompt) : options.prompt;
|
|
5206
|
-
return
|
|
5539
|
+
return spawnAgentWithoutConsentClaim({
|
|
5207
5540
|
issueId,
|
|
5208
5541
|
workspace: slot?.workspace ?? workspace,
|
|
5209
5542
|
agentId: slot?.agentId,
|
|
@@ -5213,29 +5546,32 @@ async function spawnRun(issueId, role, options = {}) {
|
|
|
5213
5546
|
role: "work",
|
|
5214
5547
|
allowHost: options.allowHost,
|
|
5215
5548
|
flywheelRunId: options.flywheelRunId,
|
|
5549
|
+
startedBy: options.startedBy,
|
|
5550
|
+
autoSpawnConsentRequired: options.autoSpawnConsentRequired,
|
|
5216
5551
|
effort: options.effort,
|
|
5217
5552
|
slotIndex: slot?.slotIndex,
|
|
5218
5553
|
slotItemId: slot?.slotItemId
|
|
5219
|
-
});
|
|
5554
|
+
}, acceptConsent);
|
|
5220
5555
|
}
|
|
5221
5556
|
const flywheelEnv = resolveFlywheelSpawnEnv(role, options.flywheelRunId);
|
|
5557
|
+
const startedBy = resolveAgentStartedBy(options.startedBy, flywheelEnv.OVERDECK_FLYWHEEL_RUN_ID);
|
|
5222
5558
|
const agentId = options.agentId ?? runAgentId(issueId, role, options.subRole);
|
|
5223
5559
|
if (await Effect.runPromise(sessionExists(agentId))) {
|
|
5224
5560
|
let reapWarmIdle = false;
|
|
5225
5561
|
const advancing = role === "review" || role === "test" || role === "ship";
|
|
5226
5562
|
try {
|
|
5227
|
-
const { isPaneDead } = await import("./tmux-
|
|
5563
|
+
const { isPaneDead } = await import("./tmux-Ctk6RV5l.js");
|
|
5228
5564
|
if (await Effect.runPromise(isPaneDead(agentId))) reapWarmIdle = true;
|
|
5229
5565
|
else if (advancing) {
|
|
5230
|
-
const { getReviewStatusSync } = await import("./review-status-
|
|
5231
|
-
const { isRoleTerminal } = await import("./reap-terminal-sessions-
|
|
5566
|
+
const { getReviewStatusSync } = await import("./review-status-Dma9SFaN.js");
|
|
5567
|
+
const { isRoleTerminal } = await import("./reap-terminal-sessions-4Xg9NGA8.js");
|
|
5232
5568
|
const status = getReviewStatusSync(issueId);
|
|
5233
5569
|
reapWarmIdle = !!status && isRoleTerminal(role, status);
|
|
5234
5570
|
}
|
|
5235
5571
|
} catch {}
|
|
5236
5572
|
if (!reapWarmIdle) throw new Error(`Role run ${agentId} already running. Use 'pan tell' to message it.`);
|
|
5237
5573
|
console.log(`[spawn] ${agentId} is warm-idle from the previous cycle — reaping it for the new ${role} dispatch (PAN-2579)`);
|
|
5238
|
-
const { killSession } = await import("./tmux-
|
|
5574
|
+
const { killSession } = await import("./tmux-Ctk6RV5l.js");
|
|
5239
5575
|
await Effect.runPromise(killSession(agentId)).catch(() => {});
|
|
5240
5576
|
}
|
|
5241
5577
|
await assertWorkspaceStackHealthyForSpawn(issueId, role, options.allowHost, workspace);
|
|
@@ -5250,7 +5586,7 @@ async function spawnRun(issueId, role, options = {}) {
|
|
|
5250
5586
|
assertCodexNativeAuthForSpawn(resolvedHarness, listAgentStates());
|
|
5251
5587
|
await ensureLifecycleHooksBeforeLaunch(agentId, resolvedHarness);
|
|
5252
5588
|
if (getProviderForModelSync(selectedModel).name === "openai" && await getProviderAuthMode(selectedModel) === "subscription") {
|
|
5253
|
-
const { isCliproxyRunning } = await import("./cliproxy-
|
|
5589
|
+
const { isCliproxyRunning } = await import("./cliproxy-DaAbWMjC.js");
|
|
5254
5590
|
if (!await Effect.runPromise(isCliproxyRunning())) throw new Error("CLIProxyAPI sidecar is not running. GPT subscription role runs route through a local cliproxy process managed by `pan up`. Run `pan up` (or restart the dashboard) before spawning a GPT role run.");
|
|
5255
5591
|
}
|
|
5256
5592
|
const state = {
|
|
@@ -5266,7 +5602,9 @@ async function spawnRun(issueId, role, options = {}) {
|
|
|
5266
5602
|
...resolvedHarness === "codex" ? {} : { costSoFar: 0 },
|
|
5267
5603
|
hostOverride: options.allowHost || void 0,
|
|
5268
5604
|
slotIndex: options.slotIndex,
|
|
5269
|
-
slotItemId: options.slotItemId
|
|
5605
|
+
slotItemId: options.slotItemId,
|
|
5606
|
+
flywheelRunId: flywheelEnv.OVERDECK_FLYWHEEL_RUN_ID,
|
|
5607
|
+
startedBy
|
|
5270
5608
|
};
|
|
5271
5609
|
await Effect.runPromise(saveAgentState(state));
|
|
5272
5610
|
const shouldRegisterConversation = role === "review" || role === "test" || role === "ship" || role === "knowledge" || options.registerConversation === true;
|
|
@@ -5367,7 +5705,7 @@ async function spawnRun(issueId, role, options = {}) {
|
|
|
5367
5705
|
const claudeCmd = `bash ${launcherScript}`;
|
|
5368
5706
|
console.log(`[claude-invoke] purpose=role-run | role=${role} | model=${state.model} | source=agents.ts:spawnRun | session=${agentId} | command="${claudeCmd}"`);
|
|
5369
5707
|
try {
|
|
5370
|
-
const { preTrustDirectory } = await import("./workspace-manager-
|
|
5708
|
+
const { preTrustDirectory } = await import("./workspace-manager-C1F3XsnS.js");
|
|
5371
5709
|
preTrustDirectory(workspace);
|
|
5372
5710
|
} catch {}
|
|
5373
5711
|
clearReadySignal(agentId);
|
|
@@ -5377,6 +5715,7 @@ async function spawnRun(issueId, role, options = {}) {
|
|
|
5377
5715
|
OVERDECK_AGENT_ID: agentId,
|
|
5378
5716
|
OVERDECK_ISSUE_ID: issueId,
|
|
5379
5717
|
OVERDECK_SESSION_TYPE: role,
|
|
5718
|
+
OVERDECK_AGENT_STARTED_BY: startedBy,
|
|
5380
5719
|
CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION: "false",
|
|
5381
5720
|
GIT_SEQUENCE_EDITOR: "false",
|
|
5382
5721
|
...flywheelEnv,
|
|
@@ -5432,9 +5771,9 @@ async function spawnRun(issueId, role, options = {}) {
|
|
|
5432
5771
|
}
|
|
5433
5772
|
markAgentRunning(state);
|
|
5434
5773
|
try {
|
|
5435
|
-
const {
|
|
5436
|
-
const
|
|
5437
|
-
if (
|
|
5774
|
+
const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-Xg4PFN45.js");
|
|
5775
|
+
const headAnchor = await snapshotWorkspaceHeadsPromise(issueId, workspace);
|
|
5776
|
+
if (headAnchor) state.roleRunHead = headAnchor;
|
|
5438
5777
|
} catch {}
|
|
5439
5778
|
await Effect.runPromise(saveAgentState(state));
|
|
5440
5779
|
if (role !== "review") emitActivityEntrySync({
|
|
@@ -5446,6 +5785,18 @@ async function spawnRun(issueId, role, options = {}) {
|
|
|
5446
5785
|
return state;
|
|
5447
5786
|
}
|
|
5448
5787
|
async function spawnAgent(options) {
|
|
5788
|
+
const role = options.role ?? "work";
|
|
5789
|
+
if (role !== "work") return spawnAgentWithoutConsentClaim(options);
|
|
5790
|
+
const flywheelRunId = resolveFlywheelSpawnEnv(role, options.flywheelRunId).OVERDECK_FLYWHEEL_RUN_ID;
|
|
5791
|
+
const startedBy = resolveAgentStartedBy(options.startedBy, flywheelRunId);
|
|
5792
|
+
const resolvedOptions = {
|
|
5793
|
+
...options,
|
|
5794
|
+
startedBy
|
|
5795
|
+
};
|
|
5796
|
+
if (isOperatorStartedBy(startedBy) || options.autoSpawnConsentRequired !== true) return spawnAgentWithoutConsentClaim(resolvedOptions);
|
|
5797
|
+
return withAutoSpawnConsentClaim(options.issueId, (acceptConsent) => spawnAgentWithoutConsentClaim(resolvedOptions, acceptConsent), { isAccepted: (state) => state.status === "running" && state.kickoffDelivered !== false });
|
|
5798
|
+
}
|
|
5799
|
+
async function spawnAgentWithoutConsentClaim(options, acceptConsent) {
|
|
5449
5800
|
const role = options.role ?? "work";
|
|
5450
5801
|
const sessionPrefix = role === "strike" ? "strike" : "agent";
|
|
5451
5802
|
const agentId = options.agentId ?? `${sessionPrefix}-${options.issueId.toLowerCase()}`;
|
|
@@ -5462,7 +5813,7 @@ async function spawnAgent(options) {
|
|
|
5462
5813
|
});
|
|
5463
5814
|
console.log(`[DEBUG] Selected model: ${selectedModel}`);
|
|
5464
5815
|
if (getProviderForModelSync(selectedModel).name === "openai" && await getProviderAuthMode(selectedModel) === "subscription") {
|
|
5465
|
-
const { isCliproxyRunning } = await import("./cliproxy-
|
|
5816
|
+
const { isCliproxyRunning } = await import("./cliproxy-DaAbWMjC.js");
|
|
5466
5817
|
if (!await Effect.runPromise(isCliproxyRunning())) throw new Error("CLIProxyAPI sidecar is not running. GPT subscription agents route through a local cliproxy process managed by `pan up`. Run `pan up` (or restart the dashboard) before spawning a GPT agent.");
|
|
5467
5818
|
}
|
|
5468
5819
|
const resolvedHarness = await resolveHarness({
|
|
@@ -5474,6 +5825,8 @@ async function spawnAgent(options) {
|
|
|
5474
5825
|
const harnessLaunch = await prepareHarnessLaunch(resolvedHarness);
|
|
5475
5826
|
assertCodexNativeAuthForSpawn(resolvedHarness, listAgentStates());
|
|
5476
5827
|
await ensureLifecycleHooksBeforeLaunch(agentId, resolvedHarness);
|
|
5828
|
+
const flywheelEnv = resolveFlywheelSpawnEnv(role, options.flywheelRunId);
|
|
5829
|
+
const startedBy = resolveAgentStartedBy(options.startedBy, flywheelEnv.OVERDECK_FLYWHEEL_RUN_ID);
|
|
5477
5830
|
const state = {
|
|
5478
5831
|
id: agentId,
|
|
5479
5832
|
issueId: options.issueId,
|
|
@@ -5486,16 +5839,19 @@ async function spawnAgent(options) {
|
|
|
5486
5839
|
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
5487
5840
|
...resolvedHarness === "codex" ? {} : { costSoFar: 0 },
|
|
5488
5841
|
hostOverride: options.allowHost || void 0,
|
|
5489
|
-
sessionId: createFreshSessionIdentity(agentId, resolvedHarness)
|
|
5842
|
+
sessionId: createFreshSessionIdentity(agentId, resolvedHarness),
|
|
5843
|
+
flywheelRunId: flywheelEnv.OVERDECK_FLYWHEEL_RUN_ID,
|
|
5844
|
+
startedBy
|
|
5490
5845
|
};
|
|
5491
5846
|
const supervisorLaunch = await prepareSupervisorForFreshLaunch(agentId, options, state);
|
|
5492
5847
|
saveAgentStateSync(state);
|
|
5493
5848
|
if (role === "work") {
|
|
5494
5849
|
try {
|
|
5495
|
-
|
|
5496
|
-
|
|
5497
|
-
|
|
5498
|
-
|
|
5850
|
+
const preservation = await shouldPreservePipelineVerdicts(options.issueId, options.workspace);
|
|
5851
|
+
if (preservation.preserve) {
|
|
5852
|
+
if (preservation.refreshedAnchor) setReviewStatusSync(options.issueId, { reviewedAtCommit: preservation.refreshedAnchor });
|
|
5853
|
+
console.log(`[spawn] Preserved pipeline verdicts for ${options.issueId} — ${preservation.reason}`);
|
|
5854
|
+
} else if (resetPipelineVerdictsForWorkStartSync(options.issueId)) (await import("./merge-agent-DQTXZk8z.js")).resetPostMergeState(options.issueId);
|
|
5499
5855
|
} catch (err) {
|
|
5500
5856
|
console.warn(`[agents] Could not reset stale pipeline verdicts for ${options.issueId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
5501
5857
|
}
|
|
@@ -5504,7 +5860,7 @@ async function spawnAgent(options) {
|
|
|
5504
5860
|
});
|
|
5505
5861
|
}
|
|
5506
5862
|
if (role === "work") try {
|
|
5507
|
-
const { writeStoryFeatureContext } = await import("./work-agent-prompt-
|
|
5863
|
+
const { writeStoryFeatureContext } = await import("./work-agent-prompt-ByrPAzOy.js");
|
|
5508
5864
|
await writeStoryFeatureContext(options.workspace, options.issueId);
|
|
5509
5865
|
} catch (ctxErr) {
|
|
5510
5866
|
console.warn(`[agents] Could not write story feature context for ${options.issueId}: ${ctxErr.message}`);
|
|
@@ -5551,7 +5907,7 @@ async function spawnAgent(options) {
|
|
|
5551
5907
|
try {
|
|
5552
5908
|
const venvPath = join$1(options.workspace, ".venv");
|
|
5553
5909
|
if (isTldrEnabledSync() && existsSync(venvPath)) {
|
|
5554
|
-
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-
|
|
5910
|
+
const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CvWXBhX1.js");
|
|
5555
5911
|
const tldrService = getTldrDaemonServiceSync(options.workspace, venvPath);
|
|
5556
5912
|
if (!(await tldrService.getStatus()).running) {
|
|
5557
5913
|
await tldrService.start(true);
|
|
@@ -5570,7 +5926,6 @@ async function spawnAgent(options) {
|
|
|
5570
5926
|
state.channelsEnabled = true;
|
|
5571
5927
|
saveAgentStateSync(state);
|
|
5572
5928
|
}
|
|
5573
|
-
const flywheelEnv = resolveFlywheelSpawnEnv(role, options.flywheelRunId);
|
|
5574
5929
|
const { launcherContent, providerEnv } = await buildAgentLaunchConfig({
|
|
5575
5930
|
agentId,
|
|
5576
5931
|
model: selectedModel,
|
|
@@ -5592,13 +5947,13 @@ async function spawnAgent(options) {
|
|
|
5592
5947
|
const claudeCmd = `bash ${launcherScript}`;
|
|
5593
5948
|
console.log(`[claude-invoke] purpose=work-agent | model=${state.model} | source=agents.ts:spawnAgent | session=${agentId} | command="${claudeCmd}"`);
|
|
5594
5949
|
try {
|
|
5595
|
-
const { preTrustDirectory } = await import("./workspace-manager-
|
|
5950
|
+
const { preTrustDirectory } = await import("./workspace-manager-C1F3XsnS.js");
|
|
5596
5951
|
preTrustDirectory(options.workspace);
|
|
5597
5952
|
} catch {}
|
|
5598
5953
|
try {
|
|
5599
|
-
const { isGitHubAppConfigured, generateInstallationToken, configureWorkspaceForBot } = await import("./github-app-
|
|
5954
|
+
const { isGitHubAppConfigured, generateInstallationToken, configureWorkspaceForBot } = await import("./github-app-Bmg4R9mv.js");
|
|
5600
5955
|
if (isGitHubAppConfigured()) {
|
|
5601
|
-
const { findProjectByPathSync } = await import("./projects-
|
|
5956
|
+
const { findProjectByPathSync } = await import("./projects-_n3Zui6K.js");
|
|
5602
5957
|
const ghRepo = findProjectByPathSync(resolve$1(options.workspace, "..", ".."))?.github_repo;
|
|
5603
5958
|
if (ghRepo) {
|
|
5604
5959
|
const [owner, repo] = ghRepo.split("/");
|
|
@@ -5617,11 +5972,13 @@ async function spawnAgent(options) {
|
|
|
5617
5972
|
OVERDECK_AGENT_ID: agentId,
|
|
5618
5973
|
OVERDECK_ISSUE_ID: options.issueId,
|
|
5619
5974
|
OVERDECK_SESSION_TYPE: role,
|
|
5975
|
+
OVERDECK_AGENT_STARTED_BY: startedBy,
|
|
5620
5976
|
CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION: "false",
|
|
5621
5977
|
GIT_SEQUENCE_EDITOR: "false",
|
|
5622
5978
|
...flywheelEnv,
|
|
5623
5979
|
...providerEnv
|
|
5624
5980
|
} }));
|
|
5981
|
+
await acceptConsent?.();
|
|
5625
5982
|
await saveAgentRuntimeState(agentId, {
|
|
5626
5983
|
claudeSessionId: state.sessionId,
|
|
5627
5984
|
sessionModel: selectedModel,
|
|
@@ -5676,7 +6033,7 @@ async function spawnAgent(options) {
|
|
|
5676
6033
|
const codexHomeForAgent = join$1(homedir(), ".overdeck", "agents", agentId, "codex-home");
|
|
5677
6034
|
(async () => {
|
|
5678
6035
|
try {
|
|
5679
|
-
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-
|
|
6036
|
+
const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-o8FJwzmy.js");
|
|
5680
6037
|
const rollout = await waitForCodexRollout(codexHomeForAgent, 12e4);
|
|
5681
6038
|
if (rollout) {
|
|
5682
6039
|
const threadId = extractThreadIdFromRollout(rollout);
|
|
@@ -5711,47 +6068,6 @@ function assertRegisteredSlotCap(issueId, configuredCap) {
|
|
|
5711
6068
|
const activeSlots = listAgentStates({ role: "work" }).filter((agent) => slotAgentPattern.test(agent.id) && (agent.status === "starting" || agent.status === "running"));
|
|
5712
6069
|
if (activeSlots.length >= cap) throw new Error(`Registered slot cap reached for ${issueId}: ${activeSlots.length}/${cap} active slot agents.`);
|
|
5713
6070
|
}
|
|
5714
|
-
function buildRegisteredSlotPrompt(issueId, baseWorkspace, slot, extraPrompt) {
|
|
5715
|
-
const doc = readWorkspacePlanSync(baseWorkspace);
|
|
5716
|
-
if (!doc) throw new Error(`Registered slot spawn for ${issueId} requires a readable xBRIEF plan in ${baseWorkspace}.`);
|
|
5717
|
-
const slice = createActiveSlice(doc, {
|
|
5718
|
-
issueId: issueId.toUpperCase(),
|
|
5719
|
-
itemId: slot.slotItemId,
|
|
5720
|
-
currentItemIds: [slot.slotItemId]
|
|
5721
|
-
});
|
|
5722
|
-
const lines = [
|
|
5723
|
-
`# Registered Slot Assignment: ${slot.slotItemId}`,
|
|
5724
|
-
"",
|
|
5725
|
-
`Issue: ${issueId}`,
|
|
5726
|
-
`Slot: ${slot.slotIndex}`,
|
|
5727
|
-
`Agent: ${slot.agentId}`,
|
|
5728
|
-
`Branch: ${slot.branch}`,
|
|
5729
|
-
`Workspace: ${slot.workspace}`,
|
|
5730
|
-
"",
|
|
5731
|
-
"You are a registered slot work agent. Implement only the target xBRIEF item below, keep changes scoped to that item, and do not merge this slot branch yourself.",
|
|
5732
|
-
"",
|
|
5733
|
-
slice.prompt
|
|
5734
|
-
];
|
|
5735
|
-
const trimmedExtra = extraPrompt?.trim();
|
|
5736
|
-
if (trimmedExtra) lines.push("", "## Additional Foreman Instructions", trimmedExtra);
|
|
5737
|
-
return lines.join("\n");
|
|
5738
|
-
}
|
|
5739
|
-
async function ensureRegisteredSlotWorktree(baseWorkspace, slot) {
|
|
5740
|
-
if (existsSync(slot.workspace)) return;
|
|
5741
|
-
await mkdir$1(dirname$1(slot.workspace), { recursive: true });
|
|
5742
|
-
const branchExists = await gitBranchExists(baseWorkspace, slot.branch);
|
|
5743
|
-
const target = JSON.stringify(slot.workspace);
|
|
5744
|
-
const branch = JSON.stringify(slot.branch);
|
|
5745
|
-
await execAsync$2(branchExists ? `git worktree add ${target} ${branch}` : `git worktree add -b ${branch} ${target} HEAD`, { cwd: baseWorkspace });
|
|
5746
|
-
}
|
|
5747
|
-
async function gitBranchExists(workspace, branch) {
|
|
5748
|
-
try {
|
|
5749
|
-
await execAsync$2(`git show-ref --verify --quiet ${JSON.stringify(`refs/heads/${branch}`)}`, { cwd: workspace });
|
|
5750
|
-
return true;
|
|
5751
|
-
} catch {
|
|
5752
|
-
return false;
|
|
5753
|
-
}
|
|
5754
|
-
}
|
|
5755
6071
|
function escapeRegExp$1(value) {
|
|
5756
6072
|
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
5757
6073
|
}
|
|
@@ -5778,13 +6094,13 @@ var init_spawn = __esmMin((() => {
|
|
|
5778
6094
|
init_launcher_generator();
|
|
5779
6095
|
init_providers();
|
|
5780
6096
|
init_review_status();
|
|
6097
|
+
init_verdict_preservation();
|
|
5781
6098
|
init_harness_resolve();
|
|
5782
6099
|
init_harness_binary();
|
|
5783
6100
|
init_codex_auth();
|
|
5784
6101
|
init_behavior();
|
|
5785
6102
|
init_bridge_token();
|
|
5786
6103
|
init_tmux();
|
|
5787
|
-
init_dag();
|
|
5788
6104
|
init_io();
|
|
5789
6105
|
init_agent_state();
|
|
5790
6106
|
init_runtime_state();
|
|
@@ -5802,6 +6118,9 @@ var init_spawn = __esmMin((() => {
|
|
|
5802
6118
|
init_termination();
|
|
5803
6119
|
init_session_history();
|
|
5804
6120
|
init_hook_readiness();
|
|
6121
|
+
init_auto_spawn_consent();
|
|
6122
|
+
init_provenance();
|
|
6123
|
+
init_registered_slot_spawn();
|
|
5805
6124
|
execAsync$2 = promisify$1(exec$1);
|
|
5806
6125
|
}));
|
|
5807
6126
|
//#endregion
|
|
@@ -6404,11 +6723,77 @@ function sessionRotationRefused(opts) {
|
|
|
6404
6723
|
}
|
|
6405
6724
|
var init_session_rotation = __esmMin((() => {}));
|
|
6406
6725
|
//#endregion
|
|
6726
|
+
//#region ../../lib/agents/monitor-transport.ts
|
|
6727
|
+
/**
|
|
6728
|
+
* PAN-3015: pull-based monitor transport for Claude Code sessions.
|
|
6729
|
+
*
|
|
6730
|
+
* A `pan monitor` process runs as a background task INSIDE the agent's Claude
|
|
6731
|
+
* Code session. Claude Code surfaces background-command stdout to the model at
|
|
6732
|
+
* the next turn boundary (and wakes an idle session), so a message printed by
|
|
6733
|
+
* the monitor reaches the model without any keystroke injection — no composer
|
|
6734
|
+
* paste, no echo confirmation, no Enter timing.
|
|
6735
|
+
*
|
|
6736
|
+
* This module holds the shared pieces: the presence protocol senders use to
|
|
6737
|
+
* decide the monitor tier is live, the mail-file format, and the drain logic.
|
|
6738
|
+
* The long-running loop lives in `src/cli/commands/monitor.ts`; the delivery
|
|
6739
|
+
* decision lives in `messageAgent` (src/lib/agents/messaging.ts) — mid-session
|
|
6740
|
+
* tells only, never kickoff/resume (no monitor exists before the first turn).
|
|
6741
|
+
* See docs/MONITOR-TRANSPORT.md.
|
|
6742
|
+
*/
|
|
6743
|
+
function monitorPresencePath(agentId) {
|
|
6744
|
+
return join$1(getAgentDir(agentId), "monitor.json");
|
|
6745
|
+
}
|
|
6746
|
+
function isPidAlive(pid) {
|
|
6747
|
+
try {
|
|
6748
|
+
process.kill(pid, 0);
|
|
6749
|
+
return true;
|
|
6750
|
+
} catch {
|
|
6751
|
+
return false;
|
|
6752
|
+
}
|
|
6753
|
+
}
|
|
6754
|
+
/**
|
|
6755
|
+
* A monitor counts as live only with BOTH a fresh heartbeat and a live pid —
|
|
6756
|
+
* a dead monitor must fall through to keystroke transports, not strand the
|
|
6757
|
+
* message unread (it stays durable in mail/ either way).
|
|
6758
|
+
*/
|
|
6759
|
+
function isMonitorLive(agentId, nowMs = Date.now()) {
|
|
6760
|
+
try {
|
|
6761
|
+
const raw = readFileSync(monitorPresencePath(agentId), "utf-8");
|
|
6762
|
+
const presence = JSON.parse(raw);
|
|
6763
|
+
if (typeof presence.pid !== "number" || typeof presence.heartbeatAt !== "string") return false;
|
|
6764
|
+
const beatMs = Date.parse(presence.heartbeatAt);
|
|
6765
|
+
if (!Number.isFinite(beatMs) || nowMs - beatMs > 45e3) return false;
|
|
6766
|
+
return isPidAlive(presence.pid);
|
|
6767
|
+
} catch {
|
|
6768
|
+
return false;
|
|
6769
|
+
}
|
|
6770
|
+
}
|
|
6771
|
+
/**
|
|
6772
|
+
* Mail-file format (PAN-3015 adds the provenance header; the legacy format is
|
|
6773
|
+
* `# Message\n\n<body>` and must keep parsing):
|
|
6774
|
+
*
|
|
6775
|
+
* # Message
|
|
6776
|
+
*
|
|
6777
|
+
* source: pan-tell
|
|
6778
|
+
* date: 2026-07-24T00:00:00.000Z
|
|
6779
|
+
*
|
|
6780
|
+
* <body>
|
|
6781
|
+
*/
|
|
6782
|
+
function formatMailFileContent(body, source, date) {
|
|
6783
|
+
return `# Message\n\nsource: ${source}\ndate: ${date.toISOString()}\n\n${body}\n`;
|
|
6784
|
+
}
|
|
6785
|
+
var init_monitor_transport = __esmMin((() => {
|
|
6786
|
+
init_agent_state();
|
|
6787
|
+
}));
|
|
6788
|
+
//#endregion
|
|
6407
6789
|
//#region ../../lib/agents/messaging.ts
|
|
6408
|
-
function queueAgentMail(agentId, message, pendingTurnEndDelivery = false) {
|
|
6790
|
+
function queueAgentMail(agentId, message, pendingTurnEndDelivery = false, dedupKey, source) {
|
|
6409
6791
|
const mailDir = join$1(getAgentDir(agentId), "mail");
|
|
6410
6792
|
mkdirSync(mailDir, { recursive: true });
|
|
6411
|
-
|
|
6793
|
+
const now = /* @__PURE__ */ new Date();
|
|
6794
|
+
const filename = dedupKey !== void 0 ? `dedup-${createHash("sha256").update(dedupKey).digest("hex").slice(0, 24)}.md` : `${now.toISOString().replace(/[:.]/g, "-")}${pendingTurnEndDelivery ? ".pending" : ""}.md`;
|
|
6795
|
+
const content = source ? formatMailFileContent(message, source, now) : `# Message\n\n${message}\n`;
|
|
6796
|
+
writeFileSync(join$1(mailDir, filename), content);
|
|
6412
6797
|
}
|
|
6413
6798
|
function resolveAgentDeliveryMethod(state) {
|
|
6414
6799
|
if (state?.harness === "acp") return "auto";
|
|
@@ -6435,6 +6820,34 @@ async function appendTellInterventionForUserSource(normalizedId, caller) {
|
|
|
6435
6820
|
source: caller
|
|
6436
6821
|
});
|
|
6437
6822
|
}
|
|
6823
|
+
/** Call the delivery door with the idempotency key only when one is set, so
|
|
6824
|
+
* unkeyed callers keep their exact pre-key call shape. */
|
|
6825
|
+
function deliverWithOptionalKey(normalizedId, message, caller, deliveryMethod, dedupKey) {
|
|
6826
|
+
return dedupKey !== void 0 ? deliverAgentMessage(normalizedId, message, caller, deliveryMethod, { dedupKey }) : deliverAgentMessage(normalizedId, message, caller, deliveryMethod);
|
|
6827
|
+
}
|
|
6828
|
+
/**
|
|
6829
|
+
* Keyed delivery to an agent that must be resumed first (PAN-2997 review
|
|
6830
|
+
* cycle 7). The keyed message NEVER rides the resume kickoff prompt: the
|
|
6831
|
+
* kickoff is delivered by components that cannot enforce the key, so a
|
|
6832
|
+
* dashboard crash after the kickoff but before any post-hoc key bookkeeping
|
|
6833
|
+
* would replay the wake. Instead the agent is resumed with its bare
|
|
6834
|
+
* auto-continue prompt, and the keyed message then goes through the keyed
|
|
6835
|
+
* delivery door, where the crash-independent component — the new session's
|
|
6836
|
+
* supervisor key set or the tmux session's two-phase markers — enforces
|
|
6837
|
+
* at-most-once across the whole replay window.
|
|
6838
|
+
*/
|
|
6839
|
+
async function resumeThenDeliverKeyed(normalizedId, message, caller, agentState, dedupKey) {
|
|
6840
|
+
const { resumeAgent } = await import("./agents-ePFVoZbu.js");
|
|
6841
|
+
const result = await resumeAgent(normalizedId);
|
|
6842
|
+
if (!result.success) throw new Error(`Failed to auto-resume agent: ${result.error}`);
|
|
6843
|
+
const delivery = await deliverAgentMessage(normalizedId, message, `messageAgent:${caller}`, resolveAgentDeliveryMethod(agentState), { dedupKey });
|
|
6844
|
+
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
6845
|
+
return {
|
|
6846
|
+
delivered: delivery.ok,
|
|
6847
|
+
queuedToMail: false,
|
|
6848
|
+
...delivery.deduplicated ? { deduplicated: true } : {}
|
|
6849
|
+
};
|
|
6850
|
+
}
|
|
6438
6851
|
async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
6439
6852
|
const normalizedId = normalizeAgentId(agentId);
|
|
6440
6853
|
const agentState = getAgentStateSync(normalizedId);
|
|
@@ -6455,7 +6868,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6455
6868
|
};
|
|
6456
6869
|
if (agentState?.paused === true) {
|
|
6457
6870
|
const gateBlockReason = getAgentResumeGateBlockReason(agentState)?.reason ?? "agent is paused";
|
|
6458
|
-
queueAgentMail(normalizedId, message);
|
|
6871
|
+
queueAgentMail(normalizedId, message, false, opts.dedupKey);
|
|
6459
6872
|
logAgentLifecycleSync(normalizedId, `messageAgent queued mail without resume: ${gateBlockReason}`);
|
|
6460
6873
|
console.log(`[agents] Queued message for ${normalizedId}; ${gateBlockReason}`);
|
|
6461
6874
|
return {
|
|
@@ -6468,7 +6881,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6468
6881
|
const suspendedGate = decideMessageGate();
|
|
6469
6882
|
if (suspendedGate.decision !== "proceed") {
|
|
6470
6883
|
const gateBlockReason = suspendedGate.reason ?? "agent is gated";
|
|
6471
|
-
queueAgentMail(normalizedId, message);
|
|
6884
|
+
queueAgentMail(normalizedId, message, false, opts.dedupKey);
|
|
6472
6885
|
logAgentLifecycleSync(normalizedId, `messageAgent queued mail without resume: ${gateBlockReason}`);
|
|
6473
6886
|
console.log(`[agents] Queued message for ${normalizedId}; ${gateBlockReason}`);
|
|
6474
6887
|
return {
|
|
@@ -6478,7 +6891,8 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6478
6891
|
};
|
|
6479
6892
|
}
|
|
6480
6893
|
console.log(`[agents] Auto-resuming suspended agent ${normalizedId} to deliver message`);
|
|
6481
|
-
|
|
6894
|
+
if (opts.dedupKey !== void 0) return resumeThenDeliverKeyed(normalizedId, message, caller, agentState, opts.dedupKey);
|
|
6895
|
+
const { resumeAgent } = await import("./agents-ePFVoZbu.js");
|
|
6482
6896
|
const result = await resumeAgent(normalizedId, message);
|
|
6483
6897
|
if (!result.success) throw new Error(`Failed to auto-resume agent: ${result.error}`);
|
|
6484
6898
|
if (result.messageDelivered === false) throw new Error(`Agent resumed but ready signal did not fire — message not delivered. Feedback is in the mail queue.`);
|
|
@@ -6492,7 +6906,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6492
6906
|
const stoppedGate = decideMessageGate();
|
|
6493
6907
|
if (stoppedGate.decision !== "proceed") {
|
|
6494
6908
|
const gateBlockReason = stoppedGate.reason ?? "agent is gated";
|
|
6495
|
-
queueAgentMail(normalizedId, message);
|
|
6909
|
+
queueAgentMail(normalizedId, message, false, opts.dedupKey);
|
|
6496
6910
|
logAgentLifecycleSync(normalizedId, `messageAgent queued mail without resume: ${gateBlockReason}`);
|
|
6497
6911
|
console.log(`[agents] Queued message for ${normalizedId}; ${gateBlockReason}`);
|
|
6498
6912
|
return {
|
|
@@ -6502,9 +6916,10 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6502
6916
|
};
|
|
6503
6917
|
}
|
|
6504
6918
|
console.log(`[agents] Auto-resuming stopped agent ${normalizedId} to deliver feedback (session exists: ${await Effect.runPromise(sessionExists(normalizedId))})`);
|
|
6505
|
-
|
|
6919
|
+
if (opts.dedupKey !== void 0) return resumeThenDeliverKeyed(normalizedId, message, caller, agentState, opts.dedupKey);
|
|
6920
|
+
const { resumeAgent } = await import("./agents-ePFVoZbu.js");
|
|
6506
6921
|
const resumeResult = await resumeAgent(normalizedId, message);
|
|
6507
|
-
queueAgentMail(normalizedId, message);
|
|
6922
|
+
queueAgentMail(normalizedId, message, false);
|
|
6508
6923
|
if (resumeResult.success && resumeResult.messageDelivered !== false) {
|
|
6509
6924
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
6510
6925
|
console.log(`[agents] Resumed ${normalizedId} and delivered feedback`);
|
|
@@ -6546,7 +6961,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6546
6961
|
const resumeModel = agentState.model || "claude-sonnet-4-6";
|
|
6547
6962
|
const fallbackHarness = agentState.harness ?? "claude-code";
|
|
6548
6963
|
const harnessLaunch = await prepareHarnessLaunch(fallbackHarness);
|
|
6549
|
-
const { assertWorkspaceStackHealthyForSpawn } = await import("./agents-
|
|
6964
|
+
const { assertWorkspaceStackHealthyForSpawn } = await import("./agents-ePFVoZbu.js");
|
|
6550
6965
|
await assertWorkspaceStackHealthyForSpawn(agentState.issueId || normalizedId.replace(/^agent-/, "").toUpperCase(), resumeRole, agentState.hostOverride === true, agentState.workspace);
|
|
6551
6966
|
const fallbackPiFields = fallbackHarness === "ohmypi" ? await getOhmypiLauncherFields(normalizedId, resumeModel) : {};
|
|
6552
6967
|
const fallbackCodexFields = fallbackHarness === "codex" ? getCodexLauncherFields(normalizedId, resumeModel, agentState.workspace, resumeRole) : {};
|
|
@@ -6610,7 +7025,7 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6610
7025
|
console.error(`[agents] Fallback-restarted ${normalizedId} but no session id was recorded — feedback in mail queue`);
|
|
6611
7026
|
}
|
|
6612
7027
|
} else {
|
|
6613
|
-
const delivery = await
|
|
7028
|
+
const delivery = await deliverWithOptionalKey(normalizedId, resumeMessage.message, "resumeAgent:resume-prompt", resolveAgentDeliveryMethod(agentState), opts.dedupKey);
|
|
6614
7029
|
delivered = delivery.ok;
|
|
6615
7030
|
if (!delivery.ok) reason = "resume prompt delivery failed";
|
|
6616
7031
|
}
|
|
@@ -6629,12 +7044,26 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6629
7044
|
...reason ? { reason } : {}
|
|
6630
7045
|
};
|
|
6631
7046
|
}
|
|
6632
|
-
const { loadRemoteAgentState, sendToRemoteAgent } = await import("./remote-agents-
|
|
7047
|
+
const { loadRemoteAgentState, sendToRemoteAgent } = await import("./remote-agents-CLZB3Coc.js");
|
|
6633
7048
|
const remoteState = loadRemoteAgentState(normalizedId);
|
|
6634
7049
|
if (remoteState && remoteState.vmName) {
|
|
6635
7050
|
console.log(`[agents] Sending message to remote agent ${normalizedId} on ${remoteState.vmName}`);
|
|
7051
|
+
if (opts.dedupKey !== void 0) {
|
|
7052
|
+
const { sendToRemoteAgentKeyed } = await import("./remote-agents-CLZB3Coc.js");
|
|
7053
|
+
const remoteOutcome = await sendToRemoteAgentKeyed(normalizedId, remoteState.vmName, message, opts.dedupKey);
|
|
7054
|
+
queueAgentMail(normalizedId, message, false, opts.dedupKey);
|
|
7055
|
+
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
7056
|
+
return {
|
|
7057
|
+
delivered: true,
|
|
7058
|
+
queuedToMail: true,
|
|
7059
|
+
...remoteOutcome === "deduplicated" ? {
|
|
7060
|
+
reason: "deduplicated",
|
|
7061
|
+
deduplicated: true
|
|
7062
|
+
} : {}
|
|
7063
|
+
};
|
|
7064
|
+
}
|
|
6636
7065
|
await sendToRemoteAgent(normalizedId, remoteState.vmName, message);
|
|
6637
|
-
queueAgentMail(normalizedId, message);
|
|
7066
|
+
queueAgentMail(normalizedId, message, false);
|
|
6638
7067
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
6639
7068
|
return {
|
|
6640
7069
|
delivered: true,
|
|
@@ -6642,13 +7071,24 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6642
7071
|
};
|
|
6643
7072
|
}
|
|
6644
7073
|
const expectedHarness = agentState?.harness ?? "claude-code";
|
|
7074
|
+
if (expectedHarness === "claude-code" && opts.dedupKey === void 0 && isMonitorLive(normalizedId)) {
|
|
7075
|
+
queueAgentMail(normalizedId, message, false, opts.dedupKey, caller);
|
|
7076
|
+
logAgentLifecycleSync(normalizedId, `messageAgent delivered via monitor mail (caller: ${caller})`);
|
|
7077
|
+
console.log(`[agents] Delivered message to ${normalizedId} via monitor inbox`);
|
|
7078
|
+
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
7079
|
+
return {
|
|
7080
|
+
delivered: true,
|
|
7081
|
+
queuedToMail: true,
|
|
7082
|
+
reason: "monitor"
|
|
7083
|
+
};
|
|
7084
|
+
}
|
|
6645
7085
|
let appServerState;
|
|
6646
7086
|
try {
|
|
6647
7087
|
appServerState = (await getCodexAppServerStatus(normalizedId)).state;
|
|
6648
7088
|
} catch {}
|
|
6649
7089
|
if (appServerState && appServerState !== "closed" && appServerState !== "error") {
|
|
6650
7090
|
if (!claimCodexIdleTurn(normalizedId)) {
|
|
6651
|
-
queueAgentMail(normalizedId, message, true);
|
|
7091
|
+
queueAgentMail(normalizedId, message, true, opts.dedupKey);
|
|
6652
7092
|
logAgentLifecycleSync(normalizedId, "messageAgent queued mail for codex turn-end delivery: agent busy");
|
|
6653
7093
|
console.log(`[agents] Queued message for ${normalizedId}; codex agent is mid-turn`);
|
|
6654
7094
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
@@ -6659,19 +7099,21 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6659
7099
|
};
|
|
6660
7100
|
}
|
|
6661
7101
|
const deliveryMethod = resolveAgentDeliveryMethod(agentState);
|
|
6662
|
-
const delivery = await
|
|
6663
|
-
queueAgentMail(normalizedId, message);
|
|
7102
|
+
const delivery = await deliverWithOptionalKey(normalizedId, message, `messageAgent:${caller}`, deliveryMethod, opts.dedupKey);
|
|
7103
|
+
queueAgentMail(normalizedId, message, false, opts.dedupKey);
|
|
6664
7104
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
6665
7105
|
return {
|
|
6666
7106
|
delivered: delivery.ok,
|
|
6667
|
-
queuedToMail: true
|
|
7107
|
+
queuedToMail: true,
|
|
7108
|
+
...delivery.deduplicated ? { deduplicated: true } : {}
|
|
6668
7109
|
};
|
|
6669
7110
|
}
|
|
6670
7111
|
if (!await Effect.runPromise(sessionExists(normalizedId))) throw new Error(`Agent ${normalizedId} not running`);
|
|
6671
7112
|
const panePids = await Effect.runPromise(listPaneValues(normalizedId, "#{pane_pid}"));
|
|
6672
7113
|
if (panePids.length > 0 && !await hasAgentRuntimeInSubtree(panePids[0], expectedHarness)) {
|
|
6673
7114
|
console.warn(`[agents] ${normalizedId} tmux session is a zombie (no ${expectedHarness} runtime) — attempting resume`);
|
|
6674
|
-
|
|
7115
|
+
if (opts.dedupKey !== void 0) return resumeThenDeliverKeyed(normalizedId, message, caller, agentState, opts.dedupKey);
|
|
7116
|
+
const { resumeAgent } = await import("./agents-ePFVoZbu.js");
|
|
6675
7117
|
const resumeResult = await resumeAgent(normalizedId, message);
|
|
6676
7118
|
if (resumeResult.success) {
|
|
6677
7119
|
const delivered = resumeResult.messageDelivered !== false;
|
|
@@ -6685,14 +7127,18 @@ async function messageAgent(agentId, message, caller = "internal", opts = {}) {
|
|
|
6685
7127
|
}
|
|
6686
7128
|
if (!await waitForAgentIdle(normalizedId, 5e3)) console.warn(`[agents] ${normalizedId} not at idle prompt after 5s — sending message anyway`);
|
|
6687
7129
|
const deliveryMethod = resolveAgentDeliveryMethod(agentState);
|
|
6688
|
-
const delivery = await
|
|
6689
|
-
queueAgentMail(normalizedId, message);
|
|
7130
|
+
const delivery = await deliverWithOptionalKey(normalizedId, message, `messageAgent:${caller}`, deliveryMethod, opts.dedupKey);
|
|
7131
|
+
if (opts.dedupKey === void 0) queueAgentMail(normalizedId, message, false);
|
|
6690
7132
|
await appendTellInterventionForUserSource(normalizedId, caller);
|
|
6691
7133
|
return {
|
|
6692
7134
|
delivered: delivery.ok,
|
|
6693
|
-
queuedToMail:
|
|
7135
|
+
queuedToMail: opts.dedupKey === void 0,
|
|
7136
|
+
...delivery.deduplicated ? { deduplicated: true } : {}
|
|
6694
7137
|
};
|
|
6695
7138
|
}
|
|
7139
|
+
async function messageAgentWithOutcome(agentId, message, caller = "internal", opts = {}) {
|
|
7140
|
+
return (await messageAgent(agentId, message, caller, opts)).delivered ? "delivered" : "queued";
|
|
7141
|
+
}
|
|
6696
7142
|
var USER_MESSAGE_INTERVENTION_SOURCES;
|
|
6697
7143
|
var init_messaging = __esmMin((() => {
|
|
6698
7144
|
init_activity_logger();
|
|
@@ -6708,6 +7154,7 @@ var init_messaging = __esmMin((() => {
|
|
|
6708
7154
|
init_agent_state();
|
|
6709
7155
|
init_activity();
|
|
6710
7156
|
init_delivery();
|
|
7157
|
+
init_monitor_transport();
|
|
6711
7158
|
init_runtime_state();
|
|
6712
7159
|
init_runtime_command();
|
|
6713
7160
|
init_supervisor_channels();
|
|
@@ -6808,6 +7255,47 @@ var init_session_pointers = __esmMin((() => {
|
|
|
6808
7255
|
init_agent_state();
|
|
6809
7256
|
}));
|
|
6810
7257
|
//#endregion
|
|
7258
|
+
//#region ../../lib/agents/resume-spawn-plan.ts
|
|
7259
|
+
function decideResumeSpawnPlan(input) {
|
|
7260
|
+
const rotationRefused = sessionRotationRefused({
|
|
7261
|
+
compactSeed: input.compactSeed,
|
|
7262
|
+
driftReasons: input.driftReasons,
|
|
7263
|
+
allowExplicitRecovery: input.allowExplicitRecovery
|
|
7264
|
+
});
|
|
7265
|
+
if (input.compactSeed) return {
|
|
7266
|
+
mode: "fresh",
|
|
7267
|
+
freshReason: "compact",
|
|
7268
|
+
clearSessionPointers: false,
|
|
7269
|
+
rotationRefused
|
|
7270
|
+
};
|
|
7271
|
+
if (input.driftReasons.length > 0) return {
|
|
7272
|
+
mode: "fresh",
|
|
7273
|
+
freshReason: "drift",
|
|
7274
|
+
clearSessionPointers: false,
|
|
7275
|
+
rotationRefused
|
|
7276
|
+
};
|
|
7277
|
+
if (input.harness === "ohmypi" && !input.piProcessWasAlive) return {
|
|
7278
|
+
mode: "fresh",
|
|
7279
|
+
freshReason: "pi-dead-recovery",
|
|
7280
|
+
clearSessionPointers: false,
|
|
7281
|
+
rotationRefused: false
|
|
7282
|
+
};
|
|
7283
|
+
if (input.harness === "claude-code" && !input.transcriptExists) return {
|
|
7284
|
+
mode: "fresh",
|
|
7285
|
+
freshReason: "claude-jsonl-missing",
|
|
7286
|
+
clearSessionPointers: true,
|
|
7287
|
+
rotationRefused: false
|
|
7288
|
+
};
|
|
7289
|
+
return {
|
|
7290
|
+
mode: "resume-saved",
|
|
7291
|
+
clearSessionPointers: false,
|
|
7292
|
+
rotationRefused: false
|
|
7293
|
+
};
|
|
7294
|
+
}
|
|
7295
|
+
var init_resume_spawn_plan = __esmMin((() => {
|
|
7296
|
+
init_session_rotation();
|
|
7297
|
+
}));
|
|
7298
|
+
//#endregion
|
|
6811
7299
|
//#region ../../lib/agents/resume.ts
|
|
6812
7300
|
/**
|
|
6813
7301
|
* Resume a suspended agent (PAN-80)
|
|
@@ -6840,7 +7328,7 @@ async function buildCompactRecoverySeed(agentId) {
|
|
|
6840
7328
|
if (agentState?.workspace && sessionId) {
|
|
6841
7329
|
const sessionFile = sessionFilePath(agentState.workspace, sessionId);
|
|
6842
7330
|
try {
|
|
6843
|
-
const [{ getConversationCompactionSettings }, { generateSmartSummary }] = await Promise.all([import("./conversation-compaction-
|
|
7331
|
+
const [{ getConversationCompactionSettings }, { generateSmartSummary }] = await Promise.all([import("./conversation-compaction-BE3CNtHF.js"), import("./smart-compaction-8fA5k5XN.js")]);
|
|
6844
7332
|
const settings = getConversationCompactionSettings();
|
|
6845
7333
|
summary = (await Effect.runPromise(generateSmartSummary({
|
|
6846
7334
|
jsonlPath: sessionFile,
|
|
@@ -6851,7 +7339,7 @@ async function buildCompactRecoverySeed(agentId) {
|
|
|
6851
7339
|
} catch (err) {
|
|
6852
7340
|
logAgentLifecycleSync(normalizedId, `compact-recovery smart summary failed (${err instanceof Error ? err.message : String(err)}); trying heuristic fallback`);
|
|
6853
7341
|
try {
|
|
6854
|
-
const { generateFallbackSummary } = await import("./summary-fork-
|
|
7342
|
+
const { generateFallbackSummary } = await import("./summary-fork-BqgmgPDt.js");
|
|
6855
7343
|
summary = await Effect.runPromise(generateFallbackSummary(sessionFile));
|
|
6856
7344
|
} catch (fallbackErr) {
|
|
6857
7345
|
logAgentLifecycleSync(normalizedId, `compact-recovery fallback summary failed (${fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)}); seeding with reseed instructions only`);
|
|
@@ -6954,6 +7442,8 @@ async function resumeAgent(agentId, message, opts) {
|
|
|
6954
7442
|
}
|
|
6955
7443
|
try {
|
|
6956
7444
|
const resumeStartedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
7445
|
+
const startedBy = opts?.startedBy?.trim() || agentState.startedBy?.trim() || "resume-agent";
|
|
7446
|
+
agentState.startedBy = startedBy;
|
|
6957
7447
|
clearReadySignal(normalizedId);
|
|
6958
7448
|
const model = requestedModel || requireModelOverrideSync(agentState.model || "claude-sonnet-4-6");
|
|
6959
7449
|
if (requestedModel && requestedModel !== agentState.model) {
|
|
@@ -6974,20 +7464,24 @@ async function resumeAgent(agentId, message, opts) {
|
|
|
6974
7464
|
saveAgentStateSync(agentState);
|
|
6975
7465
|
const resumeDriftReasons = sessionResumeDriftReasons(runtimeState, model, effectiveHarness);
|
|
6976
7466
|
if (legacyHarnessMigrated) resumeDriftReasons.push(`legacy harness ${priorHarness}→${effectiveHarness} (PAN-1797 re-default)`);
|
|
6977
|
-
const piDeadRecovery = effectiveHarness === "ohmypi" && !piProcessWasAlive && !compactSeed && resumeDriftReasons.length === 0;
|
|
6978
|
-
if (piDeadRecovery) logAgentLifecycleSync(normalizedId, "resumeAgent: dead ohmypi process — fresh-launching for recovery instead of omp --resume (PAN-2009)");
|
|
6979
7467
|
const expectedClaudeJsonl = sessionFilePath(agentState.workspace, sessionId);
|
|
6980
|
-
const
|
|
6981
|
-
|
|
6982
|
-
logAgentLifecycleSync(normalizedId, `resumeAgent: saved Claude transcript is missing at ${expectedClaudeJsonl} — clearing stale pointers and fresh-launching (PAN-2895)`);
|
|
6983
|
-
await clearAgentSessionPointers(normalizedId);
|
|
6984
|
-
}
|
|
6985
|
-
const shouldResumeSavedSession = !compactSeed && resumeDriftReasons.length === 0 && !piDeadRecovery && !claudeJsonlMissingRecovery;
|
|
6986
|
-
if (sessionRotationRefused({
|
|
7468
|
+
const spawnPlan = decideResumeSpawnPlan({
|
|
7469
|
+
harness: effectiveHarness,
|
|
6987
7470
|
compactSeed: Boolean(compactSeed),
|
|
6988
7471
|
driftReasons: resumeDriftReasons,
|
|
7472
|
+
piProcessWasAlive,
|
|
7473
|
+
transcriptExists: effectiveHarness !== "claude-code" || claudeSessionTranscriptExists(agentState.workspace, sessionId),
|
|
6989
7474
|
allowExplicitRecovery: opts?.compact === true && opts.recoverGated === true
|
|
6990
|
-
})
|
|
7475
|
+
});
|
|
7476
|
+
const piDeadRecovery = spawnPlan.freshReason === "pi-dead-recovery";
|
|
7477
|
+
if (piDeadRecovery) logAgentLifecycleSync(normalizedId, "resumeAgent: dead ohmypi process — fresh-launching for recovery instead of omp --resume (PAN-2009)");
|
|
7478
|
+
const claudeJsonlMissingRecovery = spawnPlan.freshReason === "claude-jsonl-missing";
|
|
7479
|
+
if (spawnPlan.clearSessionPointers) {
|
|
7480
|
+
logAgentLifecycleSync(normalizedId, `resumeAgent: saved Claude transcript is missing at ${expectedClaudeJsonl} — clearing stale pointers and fresh-launching (PAN-2895)`);
|
|
7481
|
+
await clearAgentSessionPointers(normalizedId);
|
|
7482
|
+
}
|
|
7483
|
+
const shouldResumeSavedSession = spawnPlan.mode === "resume-saved";
|
|
7484
|
+
if (spawnPlan.rotationRefused) {
|
|
6991
7485
|
const errMsg = `Refusing to rotate ${normalizedId} to a new session — ${compactSeed ? "context-overflow compaction would respawn a fresh session" : `session drift (${resumeDriftReasons.join(", ")})`}; session rotation is disabled (PAN-1980). Agent left stopped.`;
|
|
6992
7486
|
logAgentLifecycleSync(normalizedId, `resumeAgent: ${errMsg}`);
|
|
6993
7487
|
emitActivityEntrySync({
|
|
@@ -7010,14 +7504,15 @@ async function resumeAgent(agentId, message, opts) {
|
|
|
7010
7504
|
unlinkSync(join$1(getAgentDir(normalizedId), "session.id"));
|
|
7011
7505
|
} catch {}
|
|
7012
7506
|
const issueId = agentState.issueId || normalizedId.replace(/^agent-/, "").toUpperCase();
|
|
7507
|
+
const resumeCause = opts?.resumeCause ?? (agentState.stoppedByUser === true ? "operator" : message ? "message" : "system");
|
|
7013
7508
|
const defaultResumeMessage = buildResumeContinueMessage(agentState);
|
|
7014
7509
|
const resumeMessage = compactSeed ? {
|
|
7015
|
-
message: message ? `${compactSeed}\n\n${message}` : compactSeed
|
|
7510
|
+
message: `${message ? `${compactSeed}\n\n${message}` : compactSeed}\n\n${buildResumeContract(resumeCause)}`,
|
|
7016
7511
|
redeliveringKickoff: false
|
|
7017
7512
|
} : resumeDriftReasons.length > 0 ? {
|
|
7018
|
-
message: message ?? defaultResumeMessage
|
|
7513
|
+
message: `${message ?? defaultResumeMessage}\n\n${buildResumeContract(resumeCause)}`,
|
|
7019
7514
|
redeliveringKickoff: false
|
|
7020
|
-
} : await buildResumeMessageForAgent(agentState, defaultResumeMessage, message);
|
|
7515
|
+
} : await buildResumeMessageForAgent(agentState, defaultResumeMessage, message, resumeCause);
|
|
7021
7516
|
if (resumeMessage.error) {
|
|
7022
7517
|
console.error(`[resumeAgent] ${resumeMessage.error}`);
|
|
7023
7518
|
emitActivityEntrySync({
|
|
@@ -7057,6 +7552,7 @@ async function resumeAgent(agentId, message, opts) {
|
|
|
7057
7552
|
OVERDECK_AGENT_ID: normalizedId,
|
|
7058
7553
|
OVERDECK_ISSUE_ID: agentState.issueId || "",
|
|
7059
7554
|
OVERDECK_SESSION_TYPE: agentState.role,
|
|
7555
|
+
OVERDECK_AGENT_STARTED_BY: startedBy,
|
|
7060
7556
|
CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION: "false",
|
|
7061
7557
|
...providerEnv
|
|
7062
7558
|
} }));
|
|
@@ -7194,7 +7690,6 @@ var init_resume = __esmMin((() => {
|
|
|
7194
7690
|
init_persistent_logger();
|
|
7195
7691
|
init_projects();
|
|
7196
7692
|
init_behavior();
|
|
7197
|
-
init_session_rotation();
|
|
7198
7693
|
init_lifecycle_io();
|
|
7199
7694
|
init_tmux();
|
|
7200
7695
|
init_agent_state();
|
|
@@ -7203,9 +7698,11 @@ var init_resume = __esmMin((() => {
|
|
|
7203
7698
|
init_delivery();
|
|
7204
7699
|
init_identity();
|
|
7205
7700
|
init_runtime_state();
|
|
7701
|
+
init_resume_spawn_plan();
|
|
7206
7702
|
init_runtime_command();
|
|
7207
7703
|
init_supervisor_channels();
|
|
7208
7704
|
init_spawn_prep();
|
|
7705
|
+
init_resume_contract();
|
|
7209
7706
|
}));
|
|
7210
7707
|
//#endregion
|
|
7211
7708
|
//#region ../../lib/graceful-restart.ts
|
|
@@ -8060,7 +8557,8 @@ async function spawnTierSupervisor(issueId, supervisor, options = {}) {
|
|
|
8060
8557
|
model: supervisor.model,
|
|
8061
8558
|
harness: supervisor.harness,
|
|
8062
8559
|
workspace: options.workspace,
|
|
8063
|
-
prompt: options.prompt ?? buildSupervisorPrompt(issueId, supervisor.subscribe)
|
|
8560
|
+
prompt: options.prompt ?? buildSupervisorPrompt(issueId, supervisor.subscribe),
|
|
8561
|
+
startedBy: "tier-supervisor"
|
|
8064
8562
|
});
|
|
8065
8563
|
}
|
|
8066
8564
|
function buildSupervisorPrompt(issueId, subscribe) {
|
|
@@ -8298,13 +8796,15 @@ async function spawnReplayTarget(target, deps) {
|
|
|
8298
8796
|
model: target.supervisor.model,
|
|
8299
8797
|
harness: target.supervisor.harness,
|
|
8300
8798
|
workspace: target.workspace,
|
|
8301
|
-
prompt: target.prompt
|
|
8799
|
+
prompt: target.prompt,
|
|
8800
|
+
startedBy: "tier-replay"
|
|
8302
8801
|
});
|
|
8303
8802
|
const slot = resolveReplaySlot(target, deps);
|
|
8304
8803
|
const spawnOptions = {
|
|
8305
8804
|
slotIndex: slot.slotIndex,
|
|
8306
8805
|
slotItemId: slot.slotItemId,
|
|
8307
8806
|
prompt: target.prompt,
|
|
8807
|
+
startedBy: "tier-replay",
|
|
8308
8808
|
...currentTierSpawnOverride(target)
|
|
8309
8809
|
};
|
|
8310
8810
|
return deps.spawn(target.issueId, "work", spawnOptions);
|
|
@@ -8606,7 +9106,7 @@ async function command(adapters, executable, args) {
|
|
|
8606
9106
|
return null;
|
|
8607
9107
|
}
|
|
8608
9108
|
}
|
|
8609
|
-
function createDarwinHostHealthCollector(adapters = defaultAdapters$
|
|
9109
|
+
function createDarwinHostHealthCollector(adapters = defaultAdapters$2) {
|
|
8610
9110
|
return {
|
|
8611
9111
|
platform: "darwin",
|
|
8612
9112
|
async sample(previous) {
|
|
@@ -8646,6 +9146,9 @@ function createDarwinHostHealthCollector(adapters = defaultAdapters$1) {
|
|
|
8646
9146
|
committedMemoryBytes: unavailable("macOS does not expose Linux Committed_AS."),
|
|
8647
9147
|
commitLimitBytes: unavailable("macOS does not expose Linux CommitLimit."),
|
|
8648
9148
|
virtualCommitmentPercent: unavailable("macOS virtual commitment is unavailable."),
|
|
9149
|
+
inotifyWatchesUsed: unavailable("inotify is Linux-only."),
|
|
9150
|
+
inotifyWatchesMax: unavailable("inotify is Linux-only."),
|
|
9151
|
+
inotifyWatchesUsedPercent: unavailable("inotify is Linux-only."),
|
|
8649
9152
|
counters: {
|
|
8650
9153
|
cpu: cpuCounters,
|
|
8651
9154
|
swap: vmStat?.swap ?? null
|
|
@@ -8654,7 +9157,7 @@ function createDarwinHostHealthCollector(adapters = defaultAdapters$1) {
|
|
|
8654
9157
|
}
|
|
8655
9158
|
};
|
|
8656
9159
|
}
|
|
8657
|
-
var execFileAsync$2, COMMAND_TIMEOUT_MS, MIB, DARWIN_MEMORY_PRESSURE_DEFAULTS, defaultAdapters$
|
|
9160
|
+
var execFileAsync$2, COMMAND_TIMEOUT_MS, MIB, DARWIN_MEMORY_PRESSURE_DEFAULTS, defaultAdapters$2;
|
|
8658
9161
|
var init_darwin = __esmMin((() => {
|
|
8659
9162
|
init_types();
|
|
8660
9163
|
execFileAsync$2 = promisify(execFile);
|
|
@@ -8666,7 +9169,7 @@ var init_darwin = __esmMin((() => {
|
|
|
8666
9169
|
swapActivityWarningBytesPerMinute: 64 * MIB,
|
|
8667
9170
|
swapActivityCriticalBytesPerMinute: 256 * MIB
|
|
8668
9171
|
});
|
|
8669
|
-
defaultAdapters$
|
|
9172
|
+
defaultAdapters$2 = {
|
|
8670
9173
|
execFile: async (command, args, timeoutMs) => {
|
|
8671
9174
|
const { stdout } = await execFileAsync$2(command, [...args], {
|
|
8672
9175
|
encoding: "utf-8",
|
|
@@ -8681,6 +9184,121 @@ var init_darwin = __esmMin((() => {
|
|
|
8681
9184
|
};
|
|
8682
9185
|
}));
|
|
8683
9186
|
//#endregion
|
|
9187
|
+
//#region ../../lib/system-health/inotify.ts
|
|
9188
|
+
/**
|
|
9189
|
+
* inotify watch/instance accounting for the local user.
|
|
9190
|
+
*
|
|
9191
|
+
* inotify watches are a per-UID kernel budget (fs.inotify.max_user_watches)
|
|
9192
|
+
* shared by every process the user runs — host processes and Docker
|
|
9193
|
+
* containers alike, since containers share the kernel and (in Overdeck's
|
|
9194
|
+
* setups) the same uid. When the budget is exhausted, any program that
|
|
9195
|
+
* tries to add a watch fails with ENOSPC; the classic symptom is a Vite
|
|
9196
|
+
* dev server dying at startup while everything else looks healthy
|
|
9197
|
+
* (PAN-3063, the 2026-07-25 MIN-898 incident).
|
|
9198
|
+
*
|
|
9199
|
+
* The kernel exposes no aggregate usage counter, so the only way to measure
|
|
9200
|
+
* usage is to walk /proc/<pid>/fd for anon_inode:inotify descriptors and sum
|
|
9201
|
+
* the `inotify wd:` lines in the matching fdinfo files. Unprivileged scans
|
|
9202
|
+
* can only read same-uid processes, which conveniently matches the per-UID
|
|
9203
|
+
* scope of the budget itself.
|
|
9204
|
+
*/
|
|
9205
|
+
/** Counts `inotify wd:` entries in a /proc/<pid>/fdinfo/<fd> payload. */
|
|
9206
|
+
function countInotifyWatches(fdinfoContent) {
|
|
9207
|
+
let count = 0;
|
|
9208
|
+
for (const line of fdinfoContent.split("\n")) if (line.startsWith("inotify wd:")) count += 1;
|
|
9209
|
+
return count;
|
|
9210
|
+
}
|
|
9211
|
+
function parseProcLimit(content) {
|
|
9212
|
+
const value = Number(content.trim());
|
|
9213
|
+
return Number.isFinite(value) && value > 0 ? value : null;
|
|
9214
|
+
}
|
|
9215
|
+
async function readLimit(adapters, path) {
|
|
9216
|
+
try {
|
|
9217
|
+
return parseProcLimit(await adapters.readFile(path));
|
|
9218
|
+
} catch {
|
|
9219
|
+
return null;
|
|
9220
|
+
}
|
|
9221
|
+
}
|
|
9222
|
+
async function scanPid(adapters, pid) {
|
|
9223
|
+
let fds;
|
|
9224
|
+
try {
|
|
9225
|
+
fds = await adapters.readdir(`/proc/${pid}/fd`);
|
|
9226
|
+
} catch {
|
|
9227
|
+
return null;
|
|
9228
|
+
}
|
|
9229
|
+
let watches = 0;
|
|
9230
|
+
let instances = 0;
|
|
9231
|
+
for (const fd of fds) {
|
|
9232
|
+
let target;
|
|
9233
|
+
try {
|
|
9234
|
+
target = await adapters.readlink(`/proc/${pid}/fd/${fd}`);
|
|
9235
|
+
} catch {
|
|
9236
|
+
continue;
|
|
9237
|
+
}
|
|
9238
|
+
if (!target.includes("inotify")) continue;
|
|
9239
|
+
instances += 1;
|
|
9240
|
+
try {
|
|
9241
|
+
watches += countInotifyWatches(await adapters.readFile(`/proc/${pid}/fdinfo/${fd}`));
|
|
9242
|
+
} catch {}
|
|
9243
|
+
}
|
|
9244
|
+
if (instances === 0) return null;
|
|
9245
|
+
return {
|
|
9246
|
+
pid,
|
|
9247
|
+
watches,
|
|
9248
|
+
instances
|
|
9249
|
+
};
|
|
9250
|
+
}
|
|
9251
|
+
async function readCommand(adapters, pid) {
|
|
9252
|
+
try {
|
|
9253
|
+
const command = (await adapters.readFile(`/proc/${pid}/cmdline`)).replaceAll("\0", " ").trim();
|
|
9254
|
+
return command.length > 120 ? `${command.slice(0, 117)}…` : command;
|
|
9255
|
+
} catch {
|
|
9256
|
+
return `pid ${pid}`;
|
|
9257
|
+
}
|
|
9258
|
+
}
|
|
9259
|
+
/**
|
|
9260
|
+
* Walks /proc and totals inotify watches and instances held by processes
|
|
9261
|
+
* this user can read. Returns null when /proc is unavailable (non-Linux).
|
|
9262
|
+
*/
|
|
9263
|
+
async function sampleInotify(adapters = defaultAdapters$1) {
|
|
9264
|
+
let procEntries;
|
|
9265
|
+
try {
|
|
9266
|
+
procEntries = await adapters.readdir("/proc");
|
|
9267
|
+
} catch {
|
|
9268
|
+
return null;
|
|
9269
|
+
}
|
|
9270
|
+
const pids = procEntries.filter((entry) => /^\d+$/.test(entry)).map(Number);
|
|
9271
|
+
const scans = [];
|
|
9272
|
+
for (let i = 0; i < pids.length; i += PID_SCAN_CONCURRENCY) {
|
|
9273
|
+
const chunk = pids.slice(i, i + PID_SCAN_CONCURRENCY);
|
|
9274
|
+
const results = await Promise.all(chunk.map((pid) => scanPid(adapters, pid)));
|
|
9275
|
+
for (const result of results) if (result) scans.push(result);
|
|
9276
|
+
}
|
|
9277
|
+
const [watchesMax, instancesMax] = await Promise.all([readLimit(adapters, "/proc/sys/fs/inotify/max_user_watches"), readLimit(adapters, "/proc/sys/fs/inotify/max_user_instances")]);
|
|
9278
|
+
const top = [...scans].sort((a, b) => b.watches - a.watches).slice(0, 5);
|
|
9279
|
+
const topConsumers = await Promise.all(top.map(async (scan) => ({
|
|
9280
|
+
pid: scan.pid,
|
|
9281
|
+
watches: scan.watches,
|
|
9282
|
+
command: await readCommand(adapters, scan.pid)
|
|
9283
|
+
})));
|
|
9284
|
+
return {
|
|
9285
|
+
watchesUsed: scans.reduce((sum, scan) => sum + scan.watches, 0),
|
|
9286
|
+
watchesMax,
|
|
9287
|
+
instancesUsed: scans.reduce((sum, scan) => sum + scan.instances, 0),
|
|
9288
|
+
instancesMax,
|
|
9289
|
+
topConsumers
|
|
9290
|
+
};
|
|
9291
|
+
}
|
|
9292
|
+
var PID_SCAN_CONCURRENCY, defaultAdapters$1;
|
|
9293
|
+
var init_inotify = __esmMin((() => {
|
|
9294
|
+
PID_SCAN_CONCURRENCY = 32;
|
|
9295
|
+
defaultAdapters$1 = {
|
|
9296
|
+
readdir: (path) => readdir(path),
|
|
9297
|
+
readlink: (path) => readlink(path),
|
|
9298
|
+
readFile: (path) => readFile(path, "utf-8")
|
|
9299
|
+
};
|
|
9300
|
+
}));
|
|
9301
|
+
//#endregion
|
|
8684
9302
|
//#region ../../lib/system-health/linux.ts
|
|
8685
9303
|
function parseMemInfo(content) {
|
|
8686
9304
|
const values = /* @__PURE__ */ new Map();
|
|
@@ -8774,10 +9392,16 @@ function percent(part, total) {
|
|
|
8774
9392
|
return Math.round(part / total * 1e3) / 10;
|
|
8775
9393
|
}
|
|
8776
9394
|
function createLinuxHostHealthCollector(adapters = defaultAdapters) {
|
|
9395
|
+
let inotifyCache = null;
|
|
8777
9396
|
return {
|
|
8778
9397
|
platform: "linux",
|
|
8779
9398
|
async sample(previous) {
|
|
8780
9399
|
const sampledAtMs = adapters.now();
|
|
9400
|
+
if (!inotifyCache || sampledAtMs - inotifyCache.atMs >= 6e4) inotifyCache = {
|
|
9401
|
+
atMs: sampledAtMs,
|
|
9402
|
+
sample: await adapters.sampleInotify().catch(() => null)
|
|
9403
|
+
};
|
|
9404
|
+
const inotify = inotifyCache.sample;
|
|
8781
9405
|
const [memInfo, procStat, pressure, vmstat, loadAverage, pageSizeBytes] = await Promise.all([
|
|
8782
9406
|
readParsed(adapters, "/proc/meminfo", parseMemInfo),
|
|
8783
9407
|
readParsed(adapters, "/proc/stat", parseProcStat),
|
|
@@ -8817,6 +9441,9 @@ function createLinuxHostHealthCollector(adapters = defaultAdapters) {
|
|
|
8817
9441
|
committedMemoryBytes: committedMemoryBytes == null ? unavailable("Committed_AS is unavailable.") : available(committedMemoryBytes),
|
|
8818
9442
|
commitLimitBytes: commitLimitBytes == null ? unavailable("CommitLimit is unavailable.") : available(commitLimitBytes),
|
|
8819
9443
|
virtualCommitmentPercent: committedMemoryBytes == null || commitLimitBytes == null ? unavailable("Virtual commitment cannot be derived.") : available(percent(committedMemoryBytes, commitLimitBytes)),
|
|
9444
|
+
inotifyWatchesUsed: inotify == null ? unavailable("inotify usage could not be scanned from /proc.") : available(inotify.watchesUsed),
|
|
9445
|
+
inotifyWatchesMax: inotify?.watchesMax == null ? unavailable("fs.inotify.max_user_watches is unavailable.") : available(inotify.watchesMax),
|
|
9446
|
+
inotifyWatchesUsedPercent: inotify == null || inotify.watchesMax == null ? unavailable("inotify watch utilization cannot be derived.") : available(percent(inotify.watchesUsed, inotify.watchesMax)),
|
|
8820
9447
|
counters: {
|
|
8821
9448
|
cpu: cpuCounters,
|
|
8822
9449
|
swap: swapCounters
|
|
@@ -8827,6 +9454,7 @@ function createLinuxHostHealthCollector(adapters = defaultAdapters) {
|
|
|
8827
9454
|
}
|
|
8828
9455
|
var execFileAsync$1, KB, LINUX_MEMORY_PRESSURE_DEFAULTS, defaultAdapters;
|
|
8829
9456
|
var init_linux = __esmMin((() => {
|
|
9457
|
+
init_inotify();
|
|
8830
9458
|
init_types();
|
|
8831
9459
|
execFileAsync$1 = promisify(execFile);
|
|
8832
9460
|
KB = 1024;
|
|
@@ -8847,7 +9475,8 @@ var init_linux = __esmMin((() => {
|
|
|
8847
9475
|
if (!Number.isFinite(value) || value <= 0) throw new Error("getconf returned an invalid page size");
|
|
8848
9476
|
return value;
|
|
8849
9477
|
},
|
|
8850
|
-
now: () => Date.now()
|
|
9478
|
+
now: () => Date.now(),
|
|
9479
|
+
sampleInotify: () => sampleInotify()
|
|
8851
9480
|
};
|
|
8852
9481
|
}));
|
|
8853
9482
|
//#endregion
|
|
@@ -8902,6 +9531,9 @@ function createUnsupportedCollector(platform = "unsupported") {
|
|
|
8902
9531
|
committedMemoryBytes: signal(),
|
|
8903
9532
|
commitLimitBytes: signal(),
|
|
8904
9533
|
virtualCommitmentPercent: signal(),
|
|
9534
|
+
inotifyWatchesUsed: signal(),
|
|
9535
|
+
inotifyWatchesMax: signal(),
|
|
9536
|
+
inotifyWatchesUsedPercent: signal(),
|
|
8905
9537
|
counters: {
|
|
8906
9538
|
cpu: null,
|
|
8907
9539
|
swap: null
|
|
@@ -9054,7 +9686,7 @@ var init_runtime_census = __esmMin((() => {
|
|
|
9054
9686
|
]);
|
|
9055
9687
|
runtimeCensusService = createRuntimeCensusService({
|
|
9056
9688
|
listPanes: async () => {
|
|
9057
|
-
const { listAllPaneRecords } = await import("./tmux-
|
|
9689
|
+
const { listAllPaneRecords } = await import("./tmux-Ctk6RV5l.js");
|
|
9058
9690
|
return Effect.runPromise(listAllPaneRecords());
|
|
9059
9691
|
},
|
|
9060
9692
|
readProcesses: readRuntimeProcessTable
|
|
@@ -9208,6 +9840,6 @@ var init_queries = __esmMin((() => {
|
|
|
9208
9840
|
});
|
|
9209
9841
|
}));
|
|
9210
9842
|
//#endregion
|
|
9211
|
-
export {
|
|
9843
|
+
export { operatorInterventionEvent as $, getAgentDir as $n, providerDefaultHarnessSync as $t, spawnTierSupervisor as A, getProviderExportsForModel as An, resolvePtySupervisorScriptPath as Ar, AmbiguousKeyedDeliveryError as At, detectCrashedAgents as B, dismissDevChannelsDialog as Bn, saveAgentRuntimeState as Br, init_transcript_landing as Bt, replayCrashedStandingAgent as C, materializeAcpContextFile as Cn, init_agent_record_sync as Cr, resetPatrolDispatchBudget as Ct, init_tier_supervisor as D, buildSpawnEnvForModel as Dn, init_pty_token as Dr, getCachedMemoryVerdict as Dt, deliverCommitForReview as E, buildCavemanExports as En, init_resume_contract as Er, workResumeSlotsAvailable as Et, init_tier_escalation as F, init_openai_auth as Fn, waitForAgentIdle as Fr, deliverResumeMessageWithTranscriptConfirmation as Ft, resumeAgent as G, SESSION_EXITED_BEFORE_KICKOFF as Gn, init_codex_auth as Gr, assertWorkspaceStackHealthyForSpawn as Gt, restartAgent as H, init_supervisor_channels as Hn, init_agent_runtime as Hr, BRIDGE_TOKEN_HEADER as Ht, init_slot_reconcile as I, buildDefaultResumeContinueMessage as In, waitForReadySignal as Ir, init_delivery as It, isContextOverflowTail as J, clearAgentPausedSync as Jn, parseOhmypiSessionCostResultSync as Jr, init_spawn_prep as Jt, init_context_overflow as K, __testInternals as Kn, paneShowsCodexAuthBurn as Kr, buildAgentLaunchConfig as Kt, listSlotAssignments as L, buildResumeContinueMessage as Ln, getAgentRuntimeState as Lr, resilientDeliveryMethod as Lt, broadcastCommit as M, init_provider_health as Mn, isQualifiedAgentId as Mr, deliverAgentMessage as Mt, init_tier_feed as N, validateProviderHealth as Nn, normalizeAgentId as Nr, deliverAgentPermissionDecision as Nt, loadPrdDraft as O, determineModel as On, writePtyToken as Or, init_memory_verdict_cache as Ot, decideEscalation as P, getOpenAIAuthStatus as Pn, resolveAgentTargetSync as Pr, deliverInitialPromptWithRetry as Pt, init_operator_interventions as Q, decideResumeGate as Qn, init_staffing as Qt, reconcileSlotState as R, decideChannelsForWorkAgent as Rn, getAgentRuntimeStateSync as Rr, setAgentDeliveryMethod as Rt, contextWindowForModel as S, init_context as Sn, writeAgentStateJsonSync as Sr, releaseSwarmSlot as St, shouldReplayCompactAtTierRunBoundary as T, init_claude_auth as Tn, buildResumeContract as Tr, tryReserveSwarmSlot as Tt, buildCompactRecoverySeed as U, writeChannelsBridgeMcpConfig as Un, applyCodexAuthBurnFlag as Ur, init_bridge_token as Ut, recoverAgent as V, hasCompletionMarkerForAgent as Vn, getAgentRuntimeSnapshot as Vr, probeTranscriptSince as Vt, init_resume as W, GOVERNOR_SLOT_PAUSE_REASON_PREFIX as Wn, checkCodexAuthStatus as Wr, writeBridgeTokenSync as Wt, messageAgent as X, clearAgentTroubledSync as Xn, transitionIssueToInProgress as Xt, init_messaging as Y, clearAgentTroubled as Yn, retrieveSpawnTimeMemoryContext as Yt, messageAgentWithOutcome as Z, clearYieldForResumeSync as Zn, transitionIssueToInReview as Zt, init_linux as _, waitForPromptReady as _n, saveAgentStateSync as _r, describeRunningAgents as _t, listRunningAgentsSync as a, OHMYPI_AGENT_READY_TIMEOUT_SECONDS as an, isAgentPaused as ar, init_activity as at, init_agents as b, init_ohmypi_fifo as bn, setAgentYieldedSync as br, init_concurrency as bt, getRuntimeCensus as c, getAgentRuntimeBaseCommand as cn, markAgentRunning as cr, init_ohmypi as ct, panePidsForSession as d, getProviderAuthMode as dn, markAgentTroubled as dr, spawnRun as dt, resolveImplicitStaffing as en, getAgentResumeGateBlockReason as er, appendActivity as et, refreshRuntimeCensus as f, getRoleRuntimeBaseCommand as fn, recordAgentFailure as fr, init_termination as ft, LINUX_MEMORY_PRESSURE_DEFAULTS as g, waitForAcpHostReady as gn, saveAgentState as gr, countRunningSwarmSlotsForIssue as gt, init_collector as h, roleAgentDefinitionPath as hn, resetAgentFailureCount as hr, countRunningAgents as ht, listRunningAgents as i, resolveTier as in, init_agent_state as ir, getSessionId as it, supervisorAgentId as j, getProviderTmuxFlags as jn, clearReadySignal as jr, SocketPostStatusError as jt, shouldSupervise as k, getProviderEnvForModel as kn, init_pty_supervisor_locate as kr, setCachedMemoryVerdict as kt, getRuntimeCensusSnapshot as l, getCodexLauncherFields as ln, markAgentRunningState as lr, init_spawn as lt, createHostHealthCollector as m, injectPiConversationMemory as mn, recordStartupSessionExit as mr, stopAgentSync as mt, init_queries as n, resolveStaffing as nn, getAgentStateFilePath as nr, getLatestSessionId as nt, warnOnBareNumericIssueIds as o, describeOhmypiSpawnFailure as on, isAgentTroubled as or, saveSessionId as ot, runtimeCensusHasHarnessProcess as p, init_runtime_command as pn, recordAgentFailureSync as pr, stopAgent as pt, isContextOverflowError as q, clearAgentPaused as qn, init_ohmypi_parser as qr, defaultRunWorkspace as qt, listAgentStates as r, init_resolve_tier as rn, getAgentStateSync as rr, getLatestSessionIdSync as rt, descendantPidsForSession as s, getAcpLauncherFields as sn, isRole as sr, createOhmypiRuntimeSync as st, dropLegacyAgentStatesMissingRoleAsync as t, resolveIssueWorkModel as tn, getAgentState as tr, getActivity as tt, init_runtime_census as u, getOhmypiLauncherFields as un, markAgentStoppedState as ur, spawnAgent as ut, DARWIN_MEMORY_PRESSURE_DEFAULTS as v, init_pi_fifo as vn, setAgentPaused as vr, emergencyBrake as vt, replayStandingAgent as w, getClaudeAuthStatus as wn, readAgentHarnessModelRecordSync as wr, tryReserveAdvancingSlot as wt, compactAtTierRunBoundary as x, ohmypiFifoPaths as xn, wipeAgentStateDirs as xr, releaseAdvancingSlot as xt, init_darwin as y, piFifoPaths as yn, setAgentPausedSync as yr, getConcurrencyLimits as yt, autoRecoverAgents as z, decideSupervisorForWorkAgent as zn, init_runtime_state as zr, captureTranscriptUserRecordSnapshot as zt };
|
|
9212
9844
|
|
|
9213
|
-
//# sourceMappingURL=queries-
|
|
9845
|
+
//# sourceMappingURL=queries-C-MUZaIy.js.map
|