@overdeck/desktop 0.45.23 → 0.46.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 +34 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-DOA0KgXx.js → acceptance-criteria-CCwFGICj.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-BBu6DSNm.js → advancing-selfheal-De1L-Sb4.js} +6 -6
- package/server/{agent-gc-BV1q_2EV.js → agent-gc-CBULruzm.js} +5 -5
- package/server/agent-state-VQk8fY9F.js +3 -0
- package/server/{agent-state-service-HoK8U4jW.js → agent-state-service-BlnSkRFA.js} +5 -5
- package/server/{agent-state-service-CnzFKSAQ.js → agent-state-service-hZpxIw1E.js} +1 -1
- package/server/agents-BKKkxKgK.js +3 -0
- package/server/{agents-B4Bjbkfv.js → agents-C5rWYhb6.js} +4 -4
- package/server/archive-planning-0FJ6Xd3b.js +2 -0
- package/server/{archive-planning-DYrYojxl.js → archive-planning-C0lAbNB_.js} +16 -24
- package/server/{artifact-index-jobs-C-xy7Z5v.js → artifact-index-jobs-ug6ZxIP5.js} +2 -2
- package/server/assemble-DnffNpOo.js +339 -0
- package/server/{backlog-auto-trigger-GtG71X8H.js → backlog-auto-trigger-Dh-i9PQf.js} +3 -3
- package/server/{behavior-B_-4EKF3.js → behavior-CfIg6pKp.js} +2 -2
- package/server/bridge-pool-patrol-CUFmjVDN.js +136 -0
- package/server/{briefing-freshness-DWdW7vUm.js → briefing-freshness-DHmCSLar.js} +2 -2
- package/server/{build-info-DgTqZkL5.js → build-info-BP160gU7.js} +1 -1
- package/server/{build-info-BT096lEl.js → build-info-CuFfxZxp.js} +5 -3
- package/server/{checkpoint-manager-DDqcGyu8.js → checkpoint-manager-DEWD82qK.js} +2 -2
- package/server/{checkpoint-manager-B7Bt29J0.js → checkpoint-manager-Dxh0FYsv.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-C-AXLfYT.js → checkpoints-CZvbtLnr.js} +2 -2
- package/server/{checkpoints-CpgCjAlN.js → checkpoints-DMTgXuLG.js} +1 -1
- package/server/{claude-hooks-provision-C8wdRnN1.js → claude-hooks-provision-CN-xo-do.js} +1 -1
- package/server/{claude-hooks-provision-but-_qGY.js → claude-hooks-provision-fvy4RD2b.js} +13 -2
- package/server/{claude-permissions-H_5wHQZQ.js → claude-permissions-CN0cSCPp.js} +2 -2
- package/server/{claude-settings-overlay-CbSz0Dvb.js → claude-settings-overlay-CJn35FHQ.js} +2 -2
- package/server/{claude-settings-overlay-BTENVmYf.js → claude-settings-overlay-Dabi9slj.js} +1 -1
- package/server/cli-DmXETsw-.js +3 -0
- package/server/{cli-vBeXbPrq.js → cli-oCWYA1pE.js} +9 -9
- package/server/{cliproxy-Bgb2XCqi.js → cliproxy-C8mB3KuB.js} +2 -2
- package/server/{cliproxy-DW0V86F8.js → cliproxy-PGwTX_o8.js} +1 -1
- package/server/{close-issue-Dn_4c4G8.js → close-issue-D5MF5GqF.js} +5 -5
- package/server/{closed-issue-reaper-CWpY2uBw.js → closed-issue-reaper-CJ24u0Zt.js} +1 -1
- package/server/{closed-issue-reaper-hANY_ehE.js → closed-issue-reaper-Cltx86x5.js} +37 -16
- package/server/{codex-Dg7Is5yb.js → codex-BdEsUFWh.js} +1 -1
- package/server/{codex-TmSi-yTv.js → codex-Drlf5Xhf.js} +37 -8
- package/server/{codex-parser-C4gSH-IR.js → codex-parser-DpB89Vqa.js} +2 -2
- package/server/compaction-continuation-K2AxQX4H.js +200 -0
- package/server/{config-DjLOdbgT.js → config-B2IMcBxx.js} +4 -3
- package/server/{config-DUIhMN_T.js → config-DV-grfQc.js} +1 -1
- package/server/{config-CCvjQf27.js → config-Dr3pW6w6.js} +2 -2
- package/server/{config-yaml-DvyMuOle.js → config-yaml-CmOPzmBb.js} +290 -22
- package/server/{conflict-gate-CmrYpa47.js → conflict-gate-B9cN3SBi.js} +4 -4
- package/server/{conflict-gate-BSJkNTdp.js → conflict-gate-Dh754uyA.js} +1 -1
- package/server/context-layers-D6LZo3l1.js +4 -0
- package/server/context-layers-dR5YxHYB.js +37 -0
- package/server/{control-settings-aP1ANIlI.js → control-settings-C7DUehE1.js} +49 -19
- package/server/{conversation-compaction-CNbTLB86.js → conversation-compaction-BoqdDXWF.js} +8 -8
- package/server/{conversation-compaction-DiG5zWQq.js → conversation-compaction-Dj4FAKoZ.js} +1 -1
- package/server/{conversation-service-Du-MTNpJ.js → conversation-service-5aCnq1zR.js} +331 -20
- package/server/conversation-service-BCxl4f8Z.js +3 -0
- package/server/{conversations-DbOs1e9Q.js → conversations-BUpYsOZg.js} +5 -5
- package/server/{conversations-6mPANqvL.js → conversations-C34dyIb9.js} +1 -1
- package/server/{cost-Ca0YTWDw.js → cost-Bgcub5kW.js} +12 -2
- package/server/{cost-CW4WSe72.js → cost-CvxRrucd.js} +3 -3
- package/server/{cost-sync-C0VdGme1.js → cost-sync-Dv3LUaNW.js} +3 -3
- package/server/{dag-CdOjJVDT.js → dag-ombYYt4s.js} +2 -2
- package/server/{dangerous-git-ops-CT-IypG3.js → dangerous-git-ops-BcJPC5Rr.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/deacon-DrXqT9LQ.js +4 -0
- package/server/{deacon-pRnyD5w9.js → deacon-hi9KLPLT.js} +2998 -2659
- package/server/{deacon-nudge-log-Bjg8U4Y9.js → deacon-nudge-log-BNBebzeL.js} +3 -3
- package/server/deacon-pending-lifecycle-Cpk0k7Hi.js +33 -0
- package/server/{deacon-swarm-DftYRDo8.js → deacon-swarm-DBxUaO-A.js} +13 -13
- package/server/deacon-swarm-I2JfX5Tg.js +2 -0
- package/server/deacon.js +14 -19
- package/server/dead-end-trip-CQcP70ND.js +13 -0
- package/server/delivery-Da0zEMY4.js +3 -0
- package/server/{deploy-patrol-Bjsho_ha.js → deploy-patrol-Df-Tmaq0.js} +69 -18
- package/server/deploy-queue-9SrhZR63.js +3 -0
- package/server/deploy-queue-UjKGYsDe.js +169 -0
- package/server/deploy-window-jOiPRHL0.js +3 -0
- package/server/{deploy-window-DeP_OIRk.js → deploy-window-rpqpWqHA.js} +40 -16
- package/server/{dev-supervisor-BpMoHlkR.js → dev-supervisor-CC46Ig8q.js} +2 -2
- package/server/{devcontainer-renderer-CtUgrVKW.js → devcontainer-renderer-68CSCRnu.js} +3 -3
- package/server/{dist-DyRx4cI7.js → dist-CJy72uEg.js} +1 -1
- package/server/dist-DSlxIU1H.js +3 -0
- package/server/{dist-src-BSoS7mkd.js → dist-src-Bik83hFi.js} +1 -1
- package/server/docker-BMVTSFL5.js +3 -0
- package/server/{docker-BK7HIcBj.js → docker-Dam7mbIB.js} +2 -2
- package/server/{dod-BrSfUHm0.js → dod-Dar-yheg.js} +8 -4
- package/server/durable-review-pipeline-CGZ5QBxh.js +17 -0
- package/server/durable-review-pipeline-jpgCJZFp.js +3 -0
- package/server/{ensure-devcontainer-DseivYEy.js → ensure-devcontainer-B057YA81.js} +4 -4
- package/server/{ensure-devcontainer-DRqaAkBR.js → ensure-devcontainer-C98V8yW-.js} +1 -1
- package/server/{esm-shims-CbI3BVkl.js → esm-shims-Br9BPdkR.js} +1 -1
- package/server/{event-store-Cr5PQwFC.js → event-store-ELqkVOn0.js} +1 -1
- package/server/{event-store-tdiY5eDZ.js → event-store-zY5MJHgF.js} +23 -4
- package/server/{events-CvvGK6LT.js → events-D6pyqhzM.js} +1 -1
- package/server/{events-CC1dgUpx.js → events-D9PR1IC0.js} +3 -3
- package/server/{factory-CynerjXO.js → factory-CRoOpGsF.js} +5 -5
- package/server/{feature-registry-population-B0pmAz0a.js → feature-registry-population--YUXU999.js} +4 -4
- package/server/{feature-registry-storage-_wUBRD3J.js → feature-registry-storage-BORBTo0y.js} +2 -2
- package/server/{features-Dhxz-wLc.js → features--nFkJY8v.js} +2 -2
- package/server/{feedback-target-iygZwmMc.js → feedback-target-C0ZzyHvU.js} +1 -1
- package/server/{feedback-target-CPS15Vte.js → feedback-target-Dt9BsapX.js} +8 -8
- package/server/{feedback-writer-C9b6ccN1.js → feedback-writer-BG0RUZiu.js} +5 -5
- package/server/{feedback-writer-qmiMbqTZ.js → feedback-writer-D1fm-5Z8.js} +1 -1
- package/server/flywheel-BekukH4i.js +2 -0
- package/server/flywheel-BiT3odRb.js +1092 -0
- package/server/flywheel-CLVB55Be.js +478 -0
- package/server/flywheel-merge-order-BJv1DZz1.js +462 -0
- package/server/flywheel-merge-order-BKw9o6ku.js +2 -0
- package/server/forge-CZbSg6Ds.js +383 -0
- package/server/forge-DK3blQb_.js +3 -0
- package/server/{from-CJ_aH5jD.js → from-D_4_dk7i.js} +1 -1
- package/server/{fts-db-CKgg0VKg.js → fts-db-BeOomFa-.js} +2 -2
- package/server/{fts-operations-BrL_VTRr.js → fts-operations-BdewJ_g9.js} +2 -2
- package/server/git-utils-CI6cwyyC.js +3 -0
- package/server/{git-utils-BVa07a4a.js → git-utils-ameCgDdy.js} +93 -3
- package/server/{github-app-CMBdIFBQ.js → github-app-CQ1Lo6LA.js} +19 -8
- package/server/{github-app-CPfoFAdV.js → github-app-DtAsvwzK.js} +1 -1
- package/server/{github-client--XVlDpwM.js → github-client-BfyDxuRN.js} +2 -2
- package/server/{github-client-B4QsdE-X.js → github-client-Cj0yl_07.js} +1 -1
- package/server/github-pr-lookup-BDq6Wznz.js +58 -0
- package/server/{harness-binary-CVio2m-u.js → harness-binary-DqkftwTb.js} +32 -6
- package/server/{harness-resolve-qHJBhy3Z.js → harness-resolve-CqMqM1Mb.js} +18 -9
- package/server/{health-events-C9B8y1Hm.js → health-events-CazRxJUS.js} +2 -2
- package/server/{health-events-CpfvuVmm.js → health-events-_xfTaOUs.js} +1 -1
- package/server/{hooks-DUXw8A0-.js → hooks-BO3QT1sn.js} +2 -2
- package/server/{hooks-ltecuFqZ.js → hooks-BnJsxlSq.js} +1 -1
- package/server/{hume-BEq0bUDg.js → hume-CDYJxqx-.js} +2 -2
- package/server/hume-Dq--7rOQ.js +3 -0
- package/server/{idle-stack-reaper-D7w9t3fE.js → idle-stack-reaper-BYqERdkE.js} +1 -1
- package/server/{idle-stack-reaper-w1ISSlhs.js → idle-stack-reaper-CnGx_PO_.js} +99 -6
- package/server/in-flight-guard-Bq3epG58.js +45 -0
- package/server/{infra-CzaSOgul.js → infra-BjuxvjdS.js} +80 -5
- package/server/{injection-oNZeoDhL.js → injection-DZxlV2al.js} +1 -1
- package/server/{injection-DZ0PfYa4.js → injection-UCf8EsjX.js} +191 -183
- package/server/{inspect-agent-DJKLWcVT.js → inspect-agent-6kylZnrm.js} +139 -82
- package/server/inspect-agent-BVwDrVrz.js +2 -0
- package/server/{internal-token-Bb4XeV2x.js → internal-token-DvMTQSOS.js} +2 -2
- package/server/{internal-token-DXdfprGr.js → internal-token-M9omeXM1.js} +1 -1
- package/server/{io-B3_AHDfr.js → io-VHvc0Ssp.js} +43 -26
- package/server/{issue-closed-zhdvQicO.js → issue-closed-B6KJkmHZ.js} +7 -7
- package/server/{issue-lifecycle-Dy4vd0Oa.js → issue-lifecycle-9gk3fnXN.js} +1 -1
- package/server/{issue-lifecycle-CreaCkjW.js → issue-lifecycle-C4Zj0WmE.js} +34 -28
- package/server/{issue-service-singleton-B5ushCvE.js → issue-service-singleton-DmCh7EHj.js} +10 -10
- package/server/{issue-service-singleton-DabvBWUp.js → issue-service-singleton-PMx8F1jr.js} +1 -1
- package/server/{issues-B6ToV6x1.js → issues-CgnQ1OGQ.js} +2 -2
- package/server/{jsonl-parser-Dhflo1SH.js → jsonl-parser-DJOH_O-w.js} +5 -4
- package/server/{label-cleanup-BKPJm4Hv.js → label-cleanup-Dv7AV_R1.js} +3 -3
- package/server/{label-reconciler-DdWbHEBu.js → label-reconciler--F85rufp.js} +4 -4
- package/server/{lifecycle-DfeyBDwA.js → lifecycle-CTdOWYMi.js} +2 -2
- package/server/{lifecycle-sycO16hj.js → lifecycle-DDN8ApVY.js} +6 -7
- package/server/{lifecycle-io-D8iNBcux.js → lifecycle-io-D-lGdzK3.js} +5 -5
- package/server/{lifecycle-io-Bsnr2K4F.js → lifecycle-io-D_zTLvP1.js} +1 -1
- package/server/{linear-client-D4zqMnX7.js → linear-client-BQU36QqE.js} +2 -2
- package/server/{linear-client-DqhDQO9k.js → linear-client-CY4O_Tu3.js} +1 -1
- package/server/linear-mcp-auth-BnU4TYfY.js +280 -0
- package/server/linear-mcp-auth-NYBq_oHZ.js +2 -0
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-C_ZEhbqI.js → merge-Bpx4jjht.js} +13 -11
- package/server/{merge-agent-XrB80vfT.js → merge-agent-DdMVSV2Y.js} +233 -83
- package/server/{merge-agent-BQM3a8z5.js → merge-agent-DrXa1CpW.js} +1 -1
- package/server/{merge-batch-Bwoyr8Je.js → merge-batch-C5q1c1GX.js} +1 -1
- package/server/merge-completeness-BMm8tMyZ.js +277 -0
- package/server/merge-completeness-D0ljXbk3.js +3 -0
- package/server/{merge-DK23JEdS.js → merge-idOG--29.js} +1 -1
- package/server/merge-ops-DdpTiEMt.js +2 -0
- package/server/merge-rebase-DGQpYJU3.js +2 -0
- package/server/{merge-rebase-C1KIVr0s.js → merge-rebase-xLnMlw5h.js} +3 -3
- package/server/merge-set-DH7ot3yz.js +89 -0
- package/server/merge-set-DzsOTBg5.js +3 -0
- package/server/{merge-sync-DZ9dojJn.js → merge-sync-CQ-LgZ1_.js} +406 -153
- package/server/merge-sync-Ca7F5JnQ.js +3 -0
- package/server/{merge-train-DxDfBTjr.js → merge-train-DTEMyIu4.js} +18 -8
- package/server/{merge-train-deps-CyYQUksx.js → merge-train-deps-CNPJzepw.js} +4 -4
- package/server/merge-verification-x3JO8Dtz.js +220 -0
- package/server/merged-docker-cleanup-worker-CTpC27Bs.js +107 -0
- package/server/merged-docker-cleanup-worker-Cdi9apm-.js +3 -0
- package/server/{multipart-parser-Dt8YPN5S.js → multipart-parser-IMSBfePV.js} +2 -2
- package/server/{no-resume-mode-Cx3K0hHi.js → no-resume-mode-C5ULAXwO.js} +1 -1
- package/server/node_modules/.package-lock.json +27 -27
- 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/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/README.md +5 -0
- package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
- package/server/node_modules/undici/docs/docs/api/Dispatcher.md +6 -0
- package/server/node_modules/undici/docs/docs/api/Interceptors.md +59 -0
- package/server/node_modules/undici/docs/docs/api/MockAgent.md +27 -0
- package/server/node_modules/undici/docs/docs/api/MockPool.md +28 -1
- package/server/node_modules/undici/docs/docs/index.md +5 -0
- 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 +13 -2
- package/server/node_modules/undici/lib/core/util.js +6 -1
- package/server/node_modules/undici/lib/dispatcher/agent.js +3 -3
- package/server/node_modules/undici/lib/dispatcher/client-h1.js +42 -8
- package/server/node_modules/undici/lib/dispatcher/client-h2.js +34 -43
- package/server/node_modules/undici/lib/global.js +36 -16
- package/server/node_modules/undici/lib/handler/cache-handler.js +269 -61
- package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +13 -3
- package/server/node_modules/undici/lib/handler/redirect-handler.js +5 -2
- package/server/node_modules/undici/lib/handler/retry-handler.js +30 -4
- package/server/node_modules/undici/lib/interceptor/cache.js +159 -52
- package/server/node_modules/undici/lib/interceptor/decompress.js +9 -2
- package/server/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
- package/server/node_modules/undici/lib/mock/mock-utils.js +39 -10
- package/server/node_modules/undici/lib/util/cache.js +372 -68
- 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/lib/web/fetch/body.js +2 -1
- package/server/node_modules/undici/lib/web/fetch/response.js +1 -3
- package/server/node_modules/undici/package.json +2 -2
- package/server/node_modules/undici/types/client.d.ts +2 -2
- package/server/node_modules/undici/types/dispatcher.d.ts +3 -3
- package/server/node_modules/undici/types/mock-interceptor.d.ts +5 -1
- package/server/{orphan-proposed-reconciler-BTkDrl4R.js → orphan-proposed-reconciler-CWmOdM9-.js} +1 -1
- package/server/{orphan-proposed-reconciler-neK8dHQk.js → orphan-proposed-reconciler-Dg6U4ADZ.js} +24 -15
- package/server/package-lock.json +28 -28
- package/server/package.json +1 -1
- package/server/{pan-dir-DeVUgwA7.js → pan-dir-ubraCiUg.js} +24 -10
- package/server/{paths-_zEts6wc.js → paths-cXmOwSbh.js} +2 -2
- package/server/pending-lifecycle-claim-DEteYdS9.js +110 -0
- package/server/{pickup-Dd0Znxxy.js → pickup-D8xtG1J2.js} +17 -16
- package/server/pipeline-membership-BGSvkT2M.js +3 -0
- package/server/pipeline-membership-CrAPLYtf.js +57 -0
- package/server/{pipeline-membership-0HaEGDlH.js → pipeline-membership-gather-CET40frr.js} +177 -109
- package/server/pipeline-membership-gather-DTfcgxLl.js +3 -0
- package/server/{pipeline-notifier-D0ykk59O.js → pipeline-notifier-BuQ0e4hF.js} +2 -2
- package/server/{pipeline-notifier-6iCJplFZ.js → pipeline-notifier-ImNXknf0.js} +1 -1
- package/server/post-merge-lifecycle-worker-DbO10pum.js +50 -0
- package/server/{project-pipelines-2sK1apsO.js → project-pipelines-Bim6bThI.js} +2 -2
- package/server/project-repos-C0nuoBGv.js +98 -0
- package/server/project-repos-CRE6Ykow.js +3 -0
- package/server/projects-B03Wr-xc.js +3 -0
- package/server/{prompts-Dp4Tpk39.js → prompts-BEx08AIu.js} +2 -2
- package/server/{providers-DKkBXhxU.js → providers-D7IluJe0.js} +1 -1
- package/server/{providers-DV7ec8l7.js → providers-evXhiQeg.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-CltymLRg.js → chunk-BO2N2NFS-D1s4-Sqp.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-D2f6pjgA.js → diagram-OG6HWLK6-1gdMoSF7.js} +1 -1
- package/server/public/assets/{dist-BWR4qFiV.js → dist-CxAOHbil.js} +1 -1
- package/server/public/assets/{dist-DEmlBBNQ.js → dist-DqDRYW6P.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-DnfiViPK.js → ganttDiagram-6RSMTGT7-BYex-Ec7.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-B8Wrmj9H.js → highlighted-body-OFNGDK62-DlVkiG0S.js} +1 -1
- package/server/public/assets/index-Cc7cnFC4.css +1 -0
- package/server/public/assets/index-K0hAYCgV.js +807 -0
- package/server/public/assets/{linear-C9zFQpkX.js → linear-B4cuEFmO.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-lR8H7Yjd.js → pieDiagram-4H26LBE5-CBHNBIJQ.js} +1 -1
- package/server/public/assets/{prod-B1jCQihw.js → prod-CN2nHBvX.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-CVQ2guem.js → quadrantDiagram-W4KKPZXB-Bom87VOQ.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-eD1RB4gm.js → sankeyDiagram-5OEKKPKP-UrBeyLxk.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-ChEC6dQn.js → xychartDiagram-2RQKCTM6-DhkbrIxR.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests--Ib2jTgy.js → pull-requests-Cv7LxzUN.js} +1 -1
- package/server/{pull-requests-CXIhdCYD.js → pull-requests-DHWiKxo7.js} +19 -10
- package/server/{queries-6d7Cdtm7.js → queries-DHJm7bTd.js} +1134 -203
- package/server/{rally-B708-nZn.js → rally-B71M9f4o.js} +3 -3
- package/server/rally-YDjU513q.js +3 -0
- package/server/{rally-api-yjQ0TfHd.js → rally-api-D5uXN08-.js} +1 -1
- package/server/{rally-api-nY0ZANw3.js → rally-api-Dkqmok65.js} +2 -2
- package/server/{rally-client-B1EJhfV0.js → rally-client-Bfqm6XI4.js} +4 -4
- package/server/{rally-client-CULK2XAY.js → rally-client-CxsA6ExK.js} +1 -1
- package/server/{reap-terminal-sessions-MWnqdLCJ.js → reap-terminal-sessions-BQ23nriz.js} +2 -2
- package/server/{reap-terminal-sessions-N3BTkmX_.js → reap-terminal-sessions-CvmwaqKv.js} +2 -2
- package/server/{rebuild-stack-Dp4eLkt4.js → rebuild-stack-0EEYReVZ.js} +36 -36
- package/server/rebuild-stack-qeRqHZxH.js +4 -0
- package/server/{reconstruct-cache-uWbZfjms.js → reconstruct-cache-BbYFsqLa.js} +7 -6
- package/server/record-CtroO946.js +3 -0
- package/server/record-update-DH6dLJID.js +3 -0
- package/server/{record-update-Dq0t2uBG.js → record-update-Z0QCxmMp.js} +124 -34
- package/server/{recovery-trip-BJtIQuag.js → recovery-trip-eJe26h-f.js} +2 -2
- package/server/{release-engine-DZpmGGzb.js → release-engine-lPUp-MTd.js} +5 -5
- package/server/{release-set-hnXd_kga.js → release-set-BwGeyZKX.js} +3 -3
- package/server/{remote-Br-ZWVIP.js → remote-BCd02Es1.js} +3 -3
- package/server/{remote-4tiENDaI.js → remote-CVGUhXMV.js} +3 -3
- package/server/{remote-agents-CRCg1L4H.js → remote-agents-C1bssi41.js} +2 -2
- package/server/{remote-agents-nmty1mLu.js → remote-agents-C_VxssLU.js} +300 -46
- package/server/{remote-completion-BbWNd10K.js → remote-completion-DAB0P706.js} +12 -12
- package/server/resume-u9byntrq.js +3 -0
- package/server/{review-agent-DJRO8EG8.js → review-agent-CD4RCI0Y.js} +1 -1
- package/server/{review-agent-sKkE1FEL.js → review-agent-CHhI66UP.js} +61 -44
- package/server/{review-artifacts-BLbSC4ke.js → review-artifacts-DSMRIfuJ.js} +7 -6
- package/server/{review-context-BgX3lcCx.js → review-context-oFuBbiEE.js} +69 -25
- package/server/{in-flight-guard-aQ1IxeI3.js → review-convoy-liveness-CpzrcJ5F.js} +3 -44
- package/server/review-status-BZH8h-6W.js +3 -0
- package/server/review-status-emit-CUExtHd5.js +50 -0
- package/server/{review-status-enrichment-tbOn_A_u.js → review-status-enrichment-QV_hQkgS.js} +4 -4
- package/server/{review-status-source-CxuEjLGg.js → review-status-source-CpvJnvnQ.js} +24 -3
- package/server/review-status-source-ylw5QZUR.js +3 -0
- package/server/{review-status-sync-BhSQ0d0l.js → review-status-sync-483sujRo.js} +10 -5
- package/server/{review-status-sync-To3-iS-N.js → review-status-sync-NaWvI9Xf.js} +1 -1
- package/server/review-status-yljtTd-q.js +7521 -0
- package/server/{review-verdict-feedback-C1Kg8n7t.js → review-verdict-feedback-BPDn4li_.js} +1 -1
- package/server/{review-verdict-feedback-CTRNtzXO.js → review-verdict-feedback-CELeUinh.js} +48 -8
- package/server/{rollup-WA0VD-Rr.js → rollup-DTNvelz9.js} +8 -8
- package/server/{rollup-B53Y81xK.js → rollup-DYZfq1c4.js} +1 -1
- package/server/{scanner-D2743cp8.js → scanner-CV35oSn4.js} +42 -14
- package/server/{sequence-io-Cg0zYj_E.js → sequence-io-DF_8iuhV.js} +4 -4
- package/server/{sequencer-agent-BGY8gjg-.js → sequencer-agent-B2WeCtGi.js} +5 -5
- package/server/server.js +3899 -672
- package/server/{service-DCpB_SGd.js → service-Br9rpBNA.js} +83 -65
- package/server/{session-fork-BQ8_6H32.js → session-fork-D0LY152N.js} +2 -2
- package/server/{session-history-CVZDpS3c.js → session-history-BUyK29eq.js} +4 -4
- package/server/{settings-BZ5m1UCl.js → settings-Bse1Pdcj.js} +3 -3
- package/server/settings-CdvIF84R.js +2 -0
- package/server/{settings-ylxwqwQG.js → settings-CvVGqNEs.js} +3 -2
- package/server/{shadow-engineering-BlxG6Xye.js → shadow-engineering-BWLa8ODz.js} +2 -2
- package/server/{shadow-state-Dh-HzF2J.js → shadow-state-B4fpKxOO.js} +2 -2
- package/server/{shadow-state-C2_epgx2.js → shadow-state-FV6PHfEW.js} +1 -1
- package/server/{shadow-utils-4bvjn9b3.js → shadow-utils-D7asqxOZ.js} +2 -2
- package/server/{ship-log-ClSMIzZX.js → ship-log-xplJ8t75.js} +1 -1
- package/server/{smart-compaction-CHIxLr_d.js → smart-compaction-CPp2Ykf6.js} +1 -1
- package/server/{smart-compaction-r4pHQBIr.js → smart-compaction-D3U_79f-.js} +8 -7
- package/server/{spawn-planning-session-KC_UduxD.js → spawn-planning-session-1nFi3gfk.js} +1 -1
- package/server/{spawn-planning-session-DWAorh2B.js → spawn-planning-session-DGfZ5B8D.js} +30 -23
- package/server/{specialist-completion-BXhav38U.js → specialist-completion-Br48eiDP.js} +1 -1
- package/server/{specialist-context-DtrYvGJ-.js → specialist-context-cVbGnTa3.js} +5 -5
- package/server/{specialist-handoff-logger-C45ouoZ6.js → specialist-handoff-logger-DK-GTz4s.js} +2 -2
- package/server/{specialist-logs-DJ3RzKxW.js → specialist-logs-Cl5-hqT8.js} +3 -3
- package/server/{specialists-JVO00bs7.js → specialists-CNfYO3G2.js} +1634 -457
- package/server/{specialists-DyFeedjn.js → specialists-Cicieuzu.js} +21 -19
- package/server/{specialists-D5fRZXmN.js → specialists-JHsdU3pA.js} +1 -1
- package/server/{specialists-DVj0hvaL.js → specialists-Tdezg_6N.js} +1 -1
- package/server/specs-Bt7WJDoC.js +3 -0
- package/server/src-CRmCHlma.js +11408 -0
- package/server/{src-CG9mCkP6.js → src-Ck028hjO.js} +6 -6
- package/server/{src-CMTQGyCK.js → src-UWcGe0Ix.js} +5 -5
- package/server/stack-health-CJLMrLBl.js +3 -0
- package/server/{stack-health-puygdaMd.js → stack-health-DqSqx0zv.js} +68 -12
- package/server/{stale-task-claims-BbFwCTb0.js → stale-task-claims-CYFOUNlT.js} +4 -4
- package/server/{staleness-Cbl_w4Bw.js → staleness-BQ-0gMYK.js} +1 -1
- package/server/{staleness-Bpy41ngS.js → staleness-D47CUJok.js} +1 -1
- package/server/{state-home-CIGjwNfJ.js → state-home-BYV7qZTW.js} +2 -2
- package/server/{state-mapping-BL_-3Yt8.js → state-mapping-BVldLhBf.js} +1 -1
- package/server/{state-migrate-Dkzaxvny.js → state-migrate-CvvBtS0Y.js} +4 -4
- package/server/{stuck-remediation-sY_MHHgQ.js → stuck-remediation-Wt0UVvu1.js} +1 -1
- package/server/{stuck-remediation-CzEov_fq.js → stuck-remediation-mkLC6G_t.js} +360 -26
- package/server/{substrate-bug-weights-service-BH66lhm7.js → substrate-bug-weights-service-XfLAKnmK.js} +3 -3
- package/server/{summary-fork-D8bXjCr7.js → summary-fork-CD7GOts0.js} +2 -2
- package/server/{summary-fork-DHhJIsAL.js → summary-fork-xiXBnWG9.js} +78 -12
- package/server/supervisor/{injection-budget-C1iPirFS.js → injection-budget-B5SbvDx2.js} +2 -41
- package/server/supervisor/{paths-DehGY2Fj.js → paths-K3noE4N_.js} +1 -1
- package/server/supervisor/pty-supervisor.js +49 -2
- package/server/supervisor/pty-token-B7lp0ElT.js +43 -0
- package/server/{supervisor-BO-Zk_h-.js → supervisor-DL788vos.js} +3 -3
- package/server/supervisor-UWiQNK-y.js +2 -0
- package/server/{swarm-readiness-CQ_fwUWF.js → swarm-readiness-BV14DF5N.js} +3 -3
- package/server/{system-prerequisites-Bza0ffAh.js → system-prerequisites-pdWG6ZQs.js} +56 -29
- package/server/{teardown-workspace-CEgauF4U.js → teardown-workspace-l2F4_zim.js} +15 -16
- package/server/{test-agent-queue-DXDt0Xa-.js → test-agent-queue-qakFIIGz.js} +6 -6
- package/server/{test-verdict-CmUBK5cT.js → test-verdict-BJYDggMm.js} +1 -1
- package/server/{test-verdict-DFjjIHR5.js → test-verdict-Gw-btEfb.js} +1 -1
- package/server/{tldr-daemon-DL566HbH.js → tldr-daemon-BKOYB616.js} +1 -1
- package/server/{tldr-daemon-BDtLOIlO.js → tldr-daemon-CBaWkV9k.js} +2 -2
- package/server/{tmux-ftABRAmc.js → tmux-B1Wbxz5o.js} +3 -3
- package/server/{tmux-DoThH6aj.js → tmux-DQ6jB76i.js} +1 -1
- package/server/tmux-dedup-DbN6MGzM.js +892 -0
- package/server/{token-CsOhvw42.js → token-Cxbk023d.js} +2 -2
- package/server/{token-util-CTmczIfW.js → token-util-CLq2MmQt.js} +1 -1
- package/server/token-util-zlz9U0ki.js +3 -0
- package/server/{tracker-config-B4itFzDo.js → tracker-config-DZ8Zn2nQ.js} +2 -2
- package/server/{tracker-utils-tnxxqROg.js → tracker-utils-L0FKtjq2.js} +3 -3
- package/server/{traefik-connect-m73vGebA.js → traefik-connect-bNX6jKkb.js} +1 -1
- package/server/{tunnel-B2vxjx_b.js → tunnel-BAm1XgjG.js} +3 -3
- package/server/{tunnel-Cgj-IGIl.js → tunnel-CjSnHdTc.js} +1 -1
- package/server/{types-BBNjPcqU.js → types-q67TYYg5.js} +1 -1
- package/server/uat-promote-verification-CKB9ZrKC.js +92 -0
- package/server/uat-train-Cu-4nvbf.js +2 -0
- package/server/uat-train-D5UjcyAa.js +0 -0
- package/server/validate-Cxsx5Uz1.js +179 -0
- package/server/{validation-CIi6pnI2.js → validation-DEaTZafj.js} +1 -1
- package/server/{validation-B5JxoPUS.js → validation-VZgJxmqc.js} +4 -4
- package/server/{verification-artifact-C-lIHfUa.js → verification-artifact-C85cRTc_.js} +1 -1
- package/server/{verification-artifact-BcnIbigL.js → verification-artifact-g3yuxQDL.js} +1 -1
- package/server/{verification-runner-CDj4lD4t.js → verification-runner-DlZI8yhw.js} +1 -1
- package/server/{verification-runner-Br0S_Ous.js → verification-runner-KDZIsBj4.js} +114 -107
- package/server/{vtt-parser-DKpNNW5i.js → vtt-parser-Jr94BF3Y.js} +1 -1
- package/server/{work-agent-prompt-Yb2bd3Fq.js → work-agent-prompt-C-vuP3_J.js} +20 -9
- package/server/workflows-CHrx_hcW.js +2 -0
- package/server/{workflows-C9WmILql.js → workflows-D0oip4eV.js} +161 -78
- package/server/{workspace-DuUdndHe.js → workspace-BqFg__wH.js} +1 -1
- package/server/{workspace-BVl4rihN.js → workspace-C0fH3aek.js} +3 -3
- package/server/workspace-anchor-drift-B4gMRHl4.js +3 -0
- package/server/workspace-anchor-drift-CZKofakh.js +224 -0
- package/server/{workspace-config-cEGcO6UT.js → workspace-config-B123aZl-.js} +1 -1
- package/server/workspace-manager-CDTKjjdU.js +3 -0
- package/server/{workspace-manager-hLUv3ADC.js → workspace-manager-CwO-Hek7.js} +206 -116
- package/server/{workspace-metadata-CskwzzhL.js → workspace-metadata-CQv00QwK.js} +2 -2
- package/server/{workspace-metadata-DNpMixRq.js → workspace-metadata-D4M8BM4W.js} +1 -1
- package/server/{workspaces-hWvy9eKs.js → workspaces-j1e_6aAT.js} +736 -290
- 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/hooks/record-cost-event.js +6 -4
- package/sync-sources/rules/ask-user-question-self-contained.md +9 -0
- package/sync-sources/skills/okf/README.md +11 -3
- package/sync-sources/skills/okf/SKILL.md +12 -1
- package/sync-sources/skills/okf/docs/USAGE.md +15 -0
- package/sync-sources/skills/okf/references/overdeck.md +28 -0
- package/sync-sources/skills/pan-close/SKILL.md +5 -3
- package/sync-sources/skills/pan-flywheel/SKILL.md +18 -1
- package/sync-sources/skills/pan-knowledge/SKILL.md +10 -0
- package/sync-sources/skills/pan-orders/SKILL.md +33 -0
- package/sync-sources/skills/pan-peer-review/SKILL.md +195 -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-start/SKILL.md +4 -0
- 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/sync-sources/templates/traefik/dynamic/overdeck.yml.template +10 -0
- package/server/activity-logger-OEUBdfZ8.js +0 -3
- package/server/agent-state-Bg0lhqwj.js +0 -3
- package/server/agents-FlIgQ3ql.js +0 -3
- package/server/archive-planning-zkJb3BeM.js +0 -3
- package/server/cli-BsVIHwzC.js +0 -3
- package/server/context-layers-B3Nt58jl.js +0 -4
- package/server/context-layers-ZYFcWiyc.js +0 -165
- package/server/conversation-service-Up7FEzIC.js +0 -3
- package/server/deacon-DYSEJb48.js +0 -4
- package/server/deacon-swarm-9jRLS5Ke.js +0 -2
- package/server/deploy-window-CM6W1-c6.js +0 -3
- package/server/dist-Bd3vn0Hw.js +0 -3
- package/server/flywheel-DMCUzDWg.js +0 -2
- package/server/flywheel-DSSpWmqF.js +0 -522
- package/server/flywheel-DcBkQvgE.js +0 -207
- package/server/flywheel-merge-order-C-6zRLvM.js +0 -2
- package/server/flywheel-merge-order-DxbQKE1d.js +0 -244
- package/server/forge-B-ZWyTRm.js +0 -2
- package/server/forge-Ch9gCFod.js +0 -270
- package/server/git-utils-Dry_Ka_D.js +0 -3
- package/server/github-pr-lookup-BRbDW-qk.js +0 -44
- package/server/hume-B_DbflNM.js +0 -3
- package/server/inspect-agent-ch-F-5Ci.js +0 -2
- package/server/launcher-generator-CHVm7bGT.js +0 -379
- package/server/layers-DzxSTGNA.js +0 -93
- package/server/merge-blockers-BsFjGrQ8.js +0 -41
- package/server/merge-ops-DlB1IM0Y.js +0 -2
- package/server/merge-set-DLz0MkGT.js +0 -139
- package/server/merge-set-DnSYdBEp.js +0 -3
- package/server/merge-sync-SSv3E-pl.js +0 -3
- package/server/merge-verification-CSizH3HY.js +0 -124
- package/server/projects-9SkRpES9.js +0 -3
- package/server/public/assets/index-CUr1xv8w.css +0 -1
- package/server/public/assets/index-CsSuZQBI.js +0 -802
- package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +0 -1
- package/server/rally-njs_mJrt.js +0 -3
- package/server/rebuild-stack-kA7XngID.js +0 -3
- package/server/record-t6V-3Dcj.js +0 -3
- package/server/record-update-DACtKh6_.js +0 -3
- package/server/resume-CcKqnTvE.js +0 -3
- package/server/review-status-A7quS5KJ.js +0 -1454
- package/server/review-status-C6n6-9f_.js +0 -3
- package/server/settings-D0OSwos5.js +0 -2
- package/server/specs-nN45DG2X.js +0 -3
- package/server/src-U7_kTPEE.js +0 -4733
- package/server/stack-health-Df0YEZKa.js +0 -3
- package/server/supervisor-BPy-o1A8.js +0 -2
- package/server/token-util-DrHg8abn.js +0 -3
- package/server/tracker-utils-BePq_oj-.js +0 -3
- package/server/uat-train-CuEn0t9M.js +0 -2152
- package/server/uat-train-cKfM-_WW.js +0 -2
- package/server/workflows-D90rMOya.js +0 -2
- package/server/workspace-manager-ZTdJAy9M.js +0 -3
|
@@ -0,0 +1,892 @@
|
|
|
1
|
+
import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
+
import { H as init_providers, W as qualifyPiModel, ci as init_paths, si as getOverdeckHome, ui as packageRoot } from "./config-yaml-CmOPzmBb.js";
|
|
3
|
+
import { G as tmuxExecAsync, J as colorFgBgForTheme, K as validateSessionName, X as init_ui_theme, Y as getUiThemeSync, w as init_tmux } from "./tmux-B1Wbxz5o.js";
|
|
4
|
+
import { s as getHarnessBehavior } from "./src-CRmCHlma.js";
|
|
5
|
+
import { t as init_behavior } from "./behavior-CfIg6pKp.js";
|
|
6
|
+
import { f as toCodexSandboxValue, l as init_codex } from "./codex-Drlf5Xhf.js";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
|
+
import { Data } from "effect";
|
|
9
|
+
import { join as join$1 } from "path";
|
|
10
|
+
import { tmpdir } from "os";
|
|
11
|
+
import { unlink, writeFile } from "fs/promises";
|
|
12
|
+
import { randomUUID } from "node:crypto";
|
|
13
|
+
//#region ../../lib/model-validation.ts
|
|
14
|
+
function normalizeModelOverrideSync(value) {
|
|
15
|
+
if (value === void 0 || value === null) return void 0;
|
|
16
|
+
if (typeof value !== "string") throw new Error("model must be a string.");
|
|
17
|
+
const trimmed = value.trim();
|
|
18
|
+
if (trimmed.length === 0) return void 0;
|
|
19
|
+
if (!MODEL_ID_PATTERN.test(trimmed)) throw new Error("model must match [A-Za-z0-9._:/@-] plus square brackets, with 1-128 characters and no whitespace or shell metacharacters.");
|
|
20
|
+
return trimmed;
|
|
21
|
+
}
|
|
22
|
+
function requireModelOverrideSync(value) {
|
|
23
|
+
const model = normalizeModelOverrideSync(value);
|
|
24
|
+
if (!model) throw new Error("model is required");
|
|
25
|
+
return model;
|
|
26
|
+
}
|
|
27
|
+
function shellQuoteModelIdSync(model) {
|
|
28
|
+
return `'${requireModelOverrideSync(model).replace(/'/g, `'\\''`)}'`;
|
|
29
|
+
}
|
|
30
|
+
var MODEL_ID_PATTERN;
|
|
31
|
+
var init_model_validation = __esmMin((() => {
|
|
32
|
+
MODEL_ID_PATTERN = /^[A-Za-z0-9](?:[A-Za-z0-9._:/@-]|\[|\]){0,127}$/;
|
|
33
|
+
Data.TaggedError("ModelValidationError");
|
|
34
|
+
}));
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region ../../lib/launcher-git-guard.ts
|
|
37
|
+
function shellQuote$1(value) {
|
|
38
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
39
|
+
}
|
|
40
|
+
function buildGitGuardLines(agentId) {
|
|
41
|
+
const guardDir = join(getOverdeckHome(), "agents", agentId, "git-guard");
|
|
42
|
+
const guardPath = join(guardDir, "git");
|
|
43
|
+
const pathForDoubleQuotes = guardDir.replace(/([\\"$`])/g, "\\$1");
|
|
44
|
+
return [
|
|
45
|
+
"_OVERDECK_REAL_GIT=\"$(command -v git)\"",
|
|
46
|
+
`mkdir -p ${shellQuote$1(guardDir)}`,
|
|
47
|
+
`cat > ${shellQuote$1(guardPath)} <<EOF`,
|
|
48
|
+
"#!/bin/sh",
|
|
49
|
+
"_OVERDECK_REAL_GIT=\"$_OVERDECK_REAL_GIT\"",
|
|
50
|
+
"if [ \"\\$OVERDECK_PAN_GIT_OP\" = \"1\" ]; then",
|
|
51
|
+
" exec \"\\$_OVERDECK_REAL_GIT\" \"\\$@\"",
|
|
52
|
+
"fi",
|
|
53
|
+
"_overdeck_git_find_command() {",
|
|
54
|
+
" while [ \"\\$#\" -gt 0 ]; do",
|
|
55
|
+
" case \"\\$1\" in",
|
|
56
|
+
" -C|-c|--git-dir|--work-tree|--namespace|--config-env|--super-prefix|--attr-source)",
|
|
57
|
+
" shift",
|
|
58
|
+
" [ \"\\$#\" -gt 0 ] && shift",
|
|
59
|
+
" ;;",
|
|
60
|
+
" -C?*|-c?*|--git-dir=*|--work-tree=*|--namespace=*|--config-env=*|--super-prefix=*|--attr-source=*)",
|
|
61
|
+
" shift",
|
|
62
|
+
" ;;",
|
|
63
|
+
" --)",
|
|
64
|
+
" shift",
|
|
65
|
+
" break",
|
|
66
|
+
" ;;",
|
|
67
|
+
" -*)",
|
|
68
|
+
" shift",
|
|
69
|
+
" ;;",
|
|
70
|
+
" *)",
|
|
71
|
+
" printf \"%s\\n\" \"\\$1\"",
|
|
72
|
+
" return",
|
|
73
|
+
" ;;",
|
|
74
|
+
" esac",
|
|
75
|
+
" done",
|
|
76
|
+
" [ \"\\$#\" -gt 0 ] && printf \"%s\\n\" \"\\$1\"",
|
|
77
|
+
"}",
|
|
78
|
+
"_overdeck_git_command=\"\\$(_overdeck_git_find_command \"\\$@\")\"",
|
|
79
|
+
"case \"\\$_overdeck_git_command\" in",
|
|
80
|
+
" rebase)",
|
|
81
|
+
" echo \"Overdeck agents must not run git rebase directly. Use pan sync-main to sync main or pan done to submit.\" >&2",
|
|
82
|
+
" exit 1",
|
|
83
|
+
" ;;",
|
|
84
|
+
" stash)",
|
|
85
|
+
" _overdeck_stash_sub=\"\"",
|
|
86
|
+
" _overdeck_after_stash=0",
|
|
87
|
+
" for _overdeck_git_arg in \"\\$@\"; do",
|
|
88
|
+
" if [ \"\\$_overdeck_after_stash\" = \"1\" ]; then",
|
|
89
|
+
" case \"\\$_overdeck_git_arg\" in",
|
|
90
|
+
" -*) ;;",
|
|
91
|
+
" *)",
|
|
92
|
+
" _overdeck_stash_sub=\"\\$_overdeck_git_arg\"",
|
|
93
|
+
" break",
|
|
94
|
+
" ;;",
|
|
95
|
+
" esac",
|
|
96
|
+
" elif [ \"\\$_overdeck_git_arg\" = \"stash\" ]; then",
|
|
97
|
+
" _overdeck_after_stash=1",
|
|
98
|
+
" fi",
|
|
99
|
+
" done",
|
|
100
|
+
" case \"\\$_overdeck_stash_sub\" in",
|
|
101
|
+
" list|show)",
|
|
102
|
+
" ;;",
|
|
103
|
+
" *)",
|
|
104
|
+
" echo \"Overdeck agents must not run git stash directly (read-only stash list/show are allowed). Use pan sync-main to sync main or pan done to submit.\" >&2",
|
|
105
|
+
" exit 1",
|
|
106
|
+
" ;;",
|
|
107
|
+
" esac",
|
|
108
|
+
" ;;",
|
|
109
|
+
" reset)",
|
|
110
|
+
" for _overdeck_git_arg in \"\\$@\"; do",
|
|
111
|
+
" if [ \"\\$_overdeck_git_arg\" = \"--hard\" ]; then",
|
|
112
|
+
" echo \"Overdeck agents must not run git reset --hard. Commit, explicitly discard, or surface the state instead.\" >&2",
|
|
113
|
+
" exit 1",
|
|
114
|
+
" fi",
|
|
115
|
+
" done",
|
|
116
|
+
" ;;",
|
|
117
|
+
"esac",
|
|
118
|
+
"exec \"\\$_OVERDECK_REAL_GIT\" \"\\$@\"",
|
|
119
|
+
"EOF",
|
|
120
|
+
`chmod 0755 ${shellQuote$1(guardPath)}`,
|
|
121
|
+
`export PATH="${pathForDoubleQuotes}:$PATH"`
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
var init_launcher_git_guard = __esmMin((() => {
|
|
125
|
+
init_paths();
|
|
126
|
+
}));
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region ../../lib/launcher-generator.ts
|
|
129
|
+
/**
|
|
130
|
+
* Quote a string for safe use as a shell literal in single quotes.
|
|
131
|
+
* e.g. shellQuote("foo'bar") → "'foo'\\''bar'"
|
|
132
|
+
*/
|
|
133
|
+
function shellQuote(value) {
|
|
134
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Build the trailing `--mcp-config <path> --dangerously-load-development-channels server:<name>`
|
|
138
|
+
* fragment when both channels-bridge fields are set. Returns an empty string when
|
|
139
|
+
* channelsBridgeMcpConfig is unset so existing call sites stay byte-identical.
|
|
140
|
+
*
|
|
141
|
+
* Note: --mcp-config is intentionally additive (no --strict-mcp-config) so the
|
|
142
|
+
* project's .mcp.json continues to load alongside the bridge.
|
|
143
|
+
*/
|
|
144
|
+
function buildChannelsArgs(config) {
|
|
145
|
+
if (!config.channelsBridgeMcpConfig) return "";
|
|
146
|
+
const serverName = config.channelsBridgeServerName ?? "overdeck-bridge";
|
|
147
|
+
return ` --mcp-config ${shellQuote(config.channelsBridgeMcpConfig)} --dangerously-load-development-channels server:${serverName}`;
|
|
148
|
+
}
|
|
149
|
+
function wrapWithSupervisor(config, cmd) {
|
|
150
|
+
if (!config.useSupervisor) return cmd;
|
|
151
|
+
if (!getHarnessBehavior(config.harness ?? "claude-code").supportsPtySupervisor || config.reviewSignal) return cmd;
|
|
152
|
+
if (!config.supervisorScriptPath) throw new Error("LauncherConfig.supervisorScriptPath is required when useSupervisor=true");
|
|
153
|
+
return `node ${shellQuote(config.supervisorScriptPath)} ${cmd}`;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Canonical launcher script generator.
|
|
157
|
+
*
|
|
158
|
+
* Takes a typed LauncherConfig and returns a bash script string.
|
|
159
|
+
* Callers are responsible for building providerExports, cavemanExports,
|
|
160
|
+
* and baseCommand strings — the generator does NOT call helper functions
|
|
161
|
+
* internally (keeps coupling low, tests simple).
|
|
162
|
+
*/
|
|
163
|
+
function generateLauncherScriptSync(config) {
|
|
164
|
+
const lines = [];
|
|
165
|
+
lines.push("#!/bin/bash");
|
|
166
|
+
lines.push("unset TMUX TMUX_PANE STY");
|
|
167
|
+
if (config.setPipefail) lines.push("set -o pipefail");
|
|
168
|
+
lines.push("command -v mkcert >/dev/null 2>&1 && export NODE_EXTRA_CA_CERTS=\"$(mkcert -CAROOT)/rootCA.pem\"");
|
|
169
|
+
lines.push("export SKIP_DOCS_INDEX=1");
|
|
170
|
+
if (config.setTerminalEnv) {
|
|
171
|
+
lines.push("export TERM=xterm-256color");
|
|
172
|
+
lines.push("export COLORTERM=truecolor");
|
|
173
|
+
lines.push("export LANG=C.UTF-8");
|
|
174
|
+
lines.push("export LC_ALL=C.UTF-8");
|
|
175
|
+
lines.push(`export COLORFGBG='${colorFgBgForTheme(getUiThemeSync())}'`);
|
|
176
|
+
}
|
|
177
|
+
if (config.setRemotePath) lines.push("export PATH=\"/usr/local/bin:$PATH\"");
|
|
178
|
+
const explicitlySetOverdeckKeys = /* @__PURE__ */ new Set();
|
|
179
|
+
if (config.overdeckEnv) {
|
|
180
|
+
if (config.overdeckEnv.agentId != null) {
|
|
181
|
+
lines.push(`export OVERDECK_AGENT_ID=${shellQuote(config.overdeckEnv.agentId)}`);
|
|
182
|
+
explicitlySetOverdeckKeys.add("OVERDECK_AGENT_ID");
|
|
183
|
+
}
|
|
184
|
+
if (config.overdeckEnv.issueId != null) {
|
|
185
|
+
lines.push(`export OVERDECK_ISSUE_ID=${shellQuote(config.overdeckEnv.issueId)}`);
|
|
186
|
+
explicitlySetOverdeckKeys.add("OVERDECK_ISSUE_ID");
|
|
187
|
+
}
|
|
188
|
+
if (config.overdeckEnv.sessionType != null) {
|
|
189
|
+
lines.push(`export OVERDECK_SESSION_TYPE=${shellQuote(config.overdeckEnv.sessionType)}`);
|
|
190
|
+
explicitlySetOverdeckKeys.add("OVERDECK_SESSION_TYPE");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (config.overdeckEnv?.agentId && config.spawnMode !== "conversation") lines.push(...buildGitGuardLines(config.overdeckEnv.agentId));
|
|
194
|
+
if (config.extraEnvExports) for (const expr of config.extraEnvExports) lines.push(expr);
|
|
195
|
+
if (config.codexHome) lines.push(`export CODEX_HOME=${shellQuote(config.codexHome)}`);
|
|
196
|
+
if (config.changeDir !== false) lines.push(`cd -- ${shellQuote(config.workingDir)}`);
|
|
197
|
+
if (config.unsetProviderEnv) for (const key of PROVIDER_ENV_UNSETS) lines.push(`unset ${key}`);
|
|
198
|
+
if (config.providerExports) {
|
|
199
|
+
const trimmed = config.providerExports.trimEnd();
|
|
200
|
+
if (trimmed) lines.push(trimmed);
|
|
201
|
+
}
|
|
202
|
+
if (config.cavemanExports) {
|
|
203
|
+
const trimmed = config.cavemanExports.trimEnd();
|
|
204
|
+
if (trimmed) lines.push(trimmed);
|
|
205
|
+
}
|
|
206
|
+
if (config.unsetOverdeckEnv) {
|
|
207
|
+
const keysToUnset = [
|
|
208
|
+
"OVERDECK_AGENT_ID",
|
|
209
|
+
"OVERDECK_ISSUE_ID",
|
|
210
|
+
"OVERDECK_SESSION_TYPE"
|
|
211
|
+
].filter((k) => !explicitlySetOverdeckKeys.has(k));
|
|
212
|
+
if (keysToUnset.length > 0) lines.push(`unset ${keysToUnset.join(" ")}`);
|
|
213
|
+
}
|
|
214
|
+
if (config.trapHup) lines.push("trap '' HUP");
|
|
215
|
+
if (config.promptFile && config.promptFileMode !== "stdin") lines.push(`prompt=$(cat ${shellQuote(config.promptFile)})`);
|
|
216
|
+
if (config.debugLog) lines.push(`echo "[launcher] Claude starting at $(date)" >> ${shellQuote(config.debugLog)}`);
|
|
217
|
+
const commandParts = buildCommand(config);
|
|
218
|
+
if (commandParts.length > 0) lines.push(...commandParts);
|
|
219
|
+
if (config.debugLog) {
|
|
220
|
+
lines.push("CLAUDE_EXIT=$?");
|
|
221
|
+
lines.push(`echo "[launcher] Claude exited with code $CLAUDE_EXIT at $(date)" >> ${shellQuote(config.debugLog)}`);
|
|
222
|
+
}
|
|
223
|
+
if (config.role === "plan") {
|
|
224
|
+
lines.push("echo \"\"");
|
|
225
|
+
lines.push("echo \"Planning agent has exited. Session kept alive for review.\"");
|
|
226
|
+
lines.push("echo \"Click 'Done' in the dashboard when ready to hand off to implementation.\"");
|
|
227
|
+
if (config.debugLog) lines.push(`echo "[launcher] Keep-alive loop starting at $(date)" >> ${shellQuote(config.debugLog)}`);
|
|
228
|
+
}
|
|
229
|
+
if (config.spawnMode === "conversation") {
|
|
230
|
+
lines.push("echo \"\"");
|
|
231
|
+
lines.push("echo \"Conversation session ended. Close this panel or click Resume to start a new session.\"");
|
|
232
|
+
}
|
|
233
|
+
if (config.keepAlive) lines.push("while true; do sleep 60; done");
|
|
234
|
+
let script = lines.join("\n") + "\n";
|
|
235
|
+
if (config.escapeForBase64) script = script.replace(/\$/g, "\\$");
|
|
236
|
+
return script;
|
|
237
|
+
}
|
|
238
|
+
function buildCommand(config) {
|
|
239
|
+
const parts = [];
|
|
240
|
+
const behavior = getHarnessBehavior(config.harness ?? "claude-code");
|
|
241
|
+
if (config.spawnMode === "conversation") {
|
|
242
|
+
if (behavior.launchCommandKind === "ohmypi-rpc") return buildOhmypiCommand(config, false);
|
|
243
|
+
if (behavior.launchCommandKind === "codex-work-tui") return buildCodexCommand(config, false);
|
|
244
|
+
if (behavior.launchCommandKind === "acp-host") return buildAcpCommand(config, false);
|
|
245
|
+
if (config.baseCommand) {
|
|
246
|
+
let cmd = config.baseCommand;
|
|
247
|
+
cmd += buildChannelsArgs(config);
|
|
248
|
+
const args = [];
|
|
249
|
+
if (config.resumeSessionId) args.push(`--resume ${shellQuote(config.resumeSessionId)}`);
|
|
250
|
+
else if (config.sessionId) args.push(`--session-id ${shellQuote(config.sessionId)}`);
|
|
251
|
+
if (config.extraArgs) args.push(config.extraArgs);
|
|
252
|
+
parts.push(wrapWithSupervisor(config, `${cmd} ${args.join(" ")}`.trim()));
|
|
253
|
+
}
|
|
254
|
+
return parts;
|
|
255
|
+
}
|
|
256
|
+
if (config.role === "plan") return buildNonConversationCommand(config, false);
|
|
257
|
+
if (config.reviewSignal) return buildReviewSubRoleCommand(config);
|
|
258
|
+
return buildNonConversationCommand(config, true);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Build the review sub-role command sequence (PAN-977).
|
|
262
|
+
*
|
|
263
|
+
* The reviewer runs under `timeout` as a child process; once it exits, the
|
|
264
|
+
* launcher itself signals the synthesis agent deterministically — the agent
|
|
265
|
+
* never has to remember to run `pan tell`, and the signal is tied to process
|
|
266
|
+
* exit rather than agent good behavior or Deacon patrol timing.
|
|
267
|
+
*/
|
|
268
|
+
function buildReviewSubRoleCommand(config) {
|
|
269
|
+
const sig = config.reviewSignal;
|
|
270
|
+
const inner = buildNonConversationCommand(config, false);
|
|
271
|
+
if (inner.length === 0) return inner;
|
|
272
|
+
const claudeCmd = `timeout ${sig.timeoutSeconds} ${inner[0]}`;
|
|
273
|
+
const synth = shellQuote(sig.synthesisAgentId);
|
|
274
|
+
const out = sig.outputPath;
|
|
275
|
+
const role = sig.subRole;
|
|
276
|
+
const pidFile = shellQuote(sig.launcherPidPath);
|
|
277
|
+
return [
|
|
278
|
+
`echo $$ > ${pidFile}`,
|
|
279
|
+
claudeCmd,
|
|
280
|
+
"CLAUDE_EXIT=$?",
|
|
281
|
+
`if [ "$CLAUDE_EXIT" = "124" ]; then`,
|
|
282
|
+
` pan tell ${synth} "REVIEWER_TIMEOUT ${role} reviewer exceeded ${sig.timeoutSeconds}s deadline" || true`,
|
|
283
|
+
`elif [ -s ${shellQuote(out)} ]; then`,
|
|
284
|
+
` pan tell ${synth} "REVIEWER_READY ${role} ${out}" || true`,
|
|
285
|
+
`else`,
|
|
286
|
+
` pan tell ${synth} "REVIEWER_FAILED ${role} reviewer exited (code $CLAUDE_EXIT) without writing report" || true`,
|
|
287
|
+
`fi`,
|
|
288
|
+
`touch ${shellQuote(sig.signalMarkerPath)}`,
|
|
289
|
+
`rm -f ${pidFile}`
|
|
290
|
+
];
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Shared command builder for planning and exec-based agent types.
|
|
294
|
+
* Appends session args, extra args, and prompt references.
|
|
295
|
+
*
|
|
296
|
+
* PAN-982: When `baseCommand` contains `--agent` (i.e. an agent definition
|
|
297
|
+
* is selecting permissions, model, and tools via `.claude/agents/pan-*.md`
|
|
298
|
+
* frontmatter), permission flags are skipped — the frontmatter handles them.
|
|
299
|
+
*/
|
|
300
|
+
function buildNonConversationCommand(config, useExec) {
|
|
301
|
+
const behavior = getHarnessBehavior(config.harness ?? "claude-code");
|
|
302
|
+
if (behavior.launchCommandKind === "ohmypi-rpc") return buildOhmypiCommand(config, useExec);
|
|
303
|
+
if (behavior.launchCommandKind === "codex-work-tui") return buildCodexCommand(config, useExec);
|
|
304
|
+
if (behavior.launchCommandKind === "acp-host") return buildAcpCommand(config, useExec);
|
|
305
|
+
const parts = [];
|
|
306
|
+
if (!config.baseCommand) return parts;
|
|
307
|
+
let cmd = config.baseCommand;
|
|
308
|
+
if (!cmd.includes("--agent ") && config.permissionFlags && config.permissionFlags.length > 0) {
|
|
309
|
+
const cmdTokens = cmd.split(/\s+/);
|
|
310
|
+
for (const flag of config.permissionFlags) if (!cmdTokens.includes(flag)) cmd += ` ${flag}`;
|
|
311
|
+
}
|
|
312
|
+
cmd += buildChannelsArgs(config);
|
|
313
|
+
if (config.resumeSessionId) cmd += ` --resume ${shellQuote(config.resumeSessionId)}`;
|
|
314
|
+
if (config.sessionId) cmd += ` --session-id ${shellQuote(config.sessionId)}`;
|
|
315
|
+
if (config.model) cmd += ` --model ${shellQuoteModelIdSync(config.model)}`;
|
|
316
|
+
if (config.extraArgs) cmd += ` ${config.extraArgs}`;
|
|
317
|
+
for (const file of systemPromptFiles(config)) cmd += ` --append-system-prompt-file ${shellQuote(file)}`;
|
|
318
|
+
if (config.promptFile) if (config.promptFileMode === "stdin") cmd += ` < ${shellQuote(config.promptFile)}`;
|
|
319
|
+
else cmd += " \"$prompt\"";
|
|
320
|
+
if (config.promptInline) cmd += ` ${shellQuote(config.promptInline)}`;
|
|
321
|
+
const wrapped = wrapWithSupervisor(config, cmd.trim());
|
|
322
|
+
parts.push(useExec ? `exec ${wrapped}` : wrapped);
|
|
323
|
+
return parts;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Build an oh-my-pi (omp) command line (PAN-1989).
|
|
327
|
+
*
|
|
328
|
+
* RPC mode (work-agents):
|
|
329
|
+
* omp --mode rpc \
|
|
330
|
+
* --model <model> \
|
|
331
|
+
* --session-dir <piSessionDir> \
|
|
332
|
+
* --extension <piExtensionPath> \
|
|
333
|
+
* [--resume <resumeSessionId>] \
|
|
334
|
+
* [--append-system-prompt "$prompt"] \
|
|
335
|
+
* <> <piFifoPath> >> <agentDir>/output.log 2>&1
|
|
336
|
+
*
|
|
337
|
+
* TUI mode (conversations):
|
|
338
|
+
* omp --model <model> \
|
|
339
|
+
* --session-dir <piSessionDir> \
|
|
340
|
+
* [--extension <piExtensionPath>] \
|
|
341
|
+
* [--resume <resumeSessionId>] \
|
|
342
|
+
* [--append-system-prompt "$prompt"]
|
|
343
|
+
*
|
|
344
|
+
* Contract differences from pi (docs/ohmypi-contract.md):
|
|
345
|
+
* - Binary is `omp`, not `pi`
|
|
346
|
+
* - `--no-context-files` is REMOVED (flag does not exist in omp)
|
|
347
|
+
* - `--resume <id>` replaces `--session <id>`
|
|
348
|
+
*/
|
|
349
|
+
function buildOhmypiCommand(config, useExec) {
|
|
350
|
+
const piMode = config.piMode ?? "rpc";
|
|
351
|
+
if (!config.piSessionDir) throw new Error("ohmypi launcher requires piSessionDir");
|
|
352
|
+
if (piMode === "rpc") {
|
|
353
|
+
if (!config.piExtensionPath) throw new Error("ohmypi launcher (rpc mode) requires piExtensionPath");
|
|
354
|
+
if (!config.piFifoPath) throw new Error("ohmypi launcher (rpc mode) requires piFifoPath");
|
|
355
|
+
}
|
|
356
|
+
const tokens = ["omp"];
|
|
357
|
+
if (piMode === "rpc") tokens.push("--mode", "rpc");
|
|
358
|
+
if (config.model) tokens.push("--model", shellQuoteModelIdSync(qualifyPiModel(config.model)));
|
|
359
|
+
tokens.push("--session-dir", shellQuote(config.piSessionDir));
|
|
360
|
+
if (config.piExtensionPath) tokens.push("--extension", shellQuote(config.piExtensionPath));
|
|
361
|
+
for (const file of systemPromptFiles(config)) tokens.push("--append-system-prompt", `"$(cat ${shellQuote(file)} 2>/dev/null)"`);
|
|
362
|
+
if (config.resumeSessionId) tokens.push("--resume", shellQuote(config.resumeSessionId));
|
|
363
|
+
if (config.extraArgs) tokens.push(config.extraArgs);
|
|
364
|
+
if (config.promptFile) tokens.push("--append-system-prompt", "\"$prompt\"");
|
|
365
|
+
else if (config.promptInline) tokens.push("--append-system-prompt", shellQuote(config.promptInline));
|
|
366
|
+
let cmd = tokens.join(" ").replace(/\s+/g, " ").trim();
|
|
367
|
+
if (piMode === "rpc") {
|
|
368
|
+
const agentDir = dirname(config.piFifoPath);
|
|
369
|
+
const outputLogPath = join(agentDir, "output.log");
|
|
370
|
+
const exitStatusPath = join(agentDir, "exit-status");
|
|
371
|
+
return [
|
|
372
|
+
`${cmd} <> ${shellQuote(config.piFifoPath)} >> ${shellQuote(outputLogPath)} 2>&1`,
|
|
373
|
+
"__omp_exit=$?",
|
|
374
|
+
`printf '%s %s\\n' "$__omp_exit" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > ${shellQuote(exitStatusPath)}`,
|
|
375
|
+
"exit $__omp_exit"
|
|
376
|
+
];
|
|
377
|
+
}
|
|
378
|
+
return [useExec ? `exec ${cmd}` : cmd];
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Build a Pi command line.
|
|
382
|
+
*
|
|
383
|
+
* RPC mode (work-agents):
|
|
384
|
+
* pi --mode rpc \
|
|
385
|
+
* --model <model> \
|
|
386
|
+
* --session-dir <piSessionDir> \
|
|
387
|
+
* --extension <piExtensionPath> \
|
|
388
|
+
* --no-context-files \
|
|
389
|
+
* [--session <resumeSessionId>] \
|
|
390
|
+
* [--append-system-prompt "$prompt"] \
|
|
391
|
+
* <> <piFifoPath>
|
|
392
|
+
*
|
|
393
|
+
* TUI mode (conversations):
|
|
394
|
+
* pi --model <model> \
|
|
395
|
+
* --session-dir <piSessionDir> \
|
|
396
|
+
* [--extension <piExtensionPath>] \
|
|
397
|
+
* --no-context-files \
|
|
398
|
+
* [--session <resumeSessionId>] \
|
|
399
|
+
* [--append-system-prompt "$prompt"]
|
|
400
|
+
*
|
|
401
|
+
* Pi has no permission system, so permissionFlags are intentionally
|
|
402
|
+
* dropped (AC4). baseCommand is ignored — Pi launchers always start with
|
|
403
|
+
* the literal `pi` so callers cannot accidentally smuggle in claude flags.
|
|
404
|
+
*/
|
|
405
|
+
function systemPromptFiles(config) {
|
|
406
|
+
return [...config.appendSystemPromptFile ? [config.appendSystemPromptFile] : [], ...config.appendSystemPromptFiles ?? []];
|
|
407
|
+
}
|
|
408
|
+
function buildAcpCommand(config, useExec) {
|
|
409
|
+
if (!config.acpAgentId) throw new Error("acp launcher requires acpAgentId");
|
|
410
|
+
if (!config.acpProvider) throw new Error("acp launcher requires acpProvider");
|
|
411
|
+
if (!config.acpWorkspace) throw new Error("acp launcher requires acpWorkspace");
|
|
412
|
+
if (!config.acpBinaryPath) throw new Error("acp launcher requires acpBinaryPath");
|
|
413
|
+
const tokens = [
|
|
414
|
+
"node",
|
|
415
|
+
shellQuote(join(packageRoot, "dist", "acp-host.js")),
|
|
416
|
+
"--agent",
|
|
417
|
+
shellQuote(config.acpAgentId),
|
|
418
|
+
"--provider",
|
|
419
|
+
shellQuote(config.acpProvider),
|
|
420
|
+
"--workspace",
|
|
421
|
+
shellQuote(config.acpWorkspace),
|
|
422
|
+
"--binary-path",
|
|
423
|
+
shellQuote(config.acpBinaryPath)
|
|
424
|
+
];
|
|
425
|
+
if (config.resumeSessionId) tokens.push("--resume", shellQuote(config.resumeSessionId));
|
|
426
|
+
if (config.model) tokens.push("--model", shellQuoteModelIdSync(config.model));
|
|
427
|
+
if (config.acpContextFile) tokens.push("--context-file", shellQuote(config.acpContextFile));
|
|
428
|
+
const cmd = tokens.join(" ");
|
|
429
|
+
return [useExec ? `exec ${cmd}` : cmd];
|
|
430
|
+
}
|
|
431
|
+
function buildCodexCommand(config, useExec) {
|
|
432
|
+
const cmd = computeCodexCommandTokens(config, useExec);
|
|
433
|
+
const flat = cmd.join(" ").replace(/\s+/g, " ");
|
|
434
|
+
const applied = /(^|\s)resume(\s|$)/.test(flat) ? "YES" : "no";
|
|
435
|
+
console.log(`[codex-launcher] agent=${config.overdeckEnv?.agentId ?? "?"} mode=${config.codexMode ?? "exec"} resumeSessionId=${config.resumeSessionId ?? "(none)"} resumeApplied=${applied} cmd=${flat.slice(0, 200)}`);
|
|
436
|
+
return cmd;
|
|
437
|
+
}
|
|
438
|
+
function computeCodexCommandTokens(config, useExec) {
|
|
439
|
+
const codexMode = config.codexMode ?? "exec";
|
|
440
|
+
if (codexMode === "tui") {
|
|
441
|
+
const tokens = ["codex"];
|
|
442
|
+
if (config.resumeSessionId) tokens.push("resume");
|
|
443
|
+
tokens.push("-c", "project_doc_max_bytes=0");
|
|
444
|
+
if (config.resumeSessionId) tokens.push(shellQuote(config.resumeSessionId));
|
|
445
|
+
const cmd = wrapWithSupervisor(config, tokens.join(" "));
|
|
446
|
+
return [useExec ? `exec ${cmd}` : cmd];
|
|
447
|
+
}
|
|
448
|
+
if (codexMode === "work-tui") {
|
|
449
|
+
const tokens = ["codex"];
|
|
450
|
+
if (config.resumeSessionId) tokens.push("resume");
|
|
451
|
+
if (config.model) tokens.push("-m", shellQuoteModelIdSync(config.model));
|
|
452
|
+
if (config.resumeSessionId) tokens.push(shellQuote(config.resumeSessionId));
|
|
453
|
+
const cmd = wrapWithSupervisor(config, tokens.join(" "));
|
|
454
|
+
return [useExec ? `exec ${cmd}` : cmd];
|
|
455
|
+
}
|
|
456
|
+
if (codexMode === "app-server") {
|
|
457
|
+
const tokens = ["node", shellQuote(join(packageRoot, "dist", "codex-app-server-host.js"))];
|
|
458
|
+
if (config.model) tokens.push("--model", shellQuoteModelIdSync(config.model));
|
|
459
|
+
if (config.resumeSessionId) tokens.push("--resume", shellQuote(config.resumeSessionId));
|
|
460
|
+
const cmd = tokens.join(" ");
|
|
461
|
+
return [useExec ? `exec ${cmd}` : cmd];
|
|
462
|
+
}
|
|
463
|
+
const isResume = Boolean(config.resumeSessionId);
|
|
464
|
+
const tokens = ["codex", "exec"];
|
|
465
|
+
if (isResume) tokens.push("resume");
|
|
466
|
+
if (config.model) tokens.push("-m", shellQuoteModelIdSync(config.model));
|
|
467
|
+
tokens.push("-c", "approval_policy=never");
|
|
468
|
+
const sandbox = toCodexSandboxValue(config.codexSandboxMode);
|
|
469
|
+
if (isResume) tokens.push("-c", `sandbox_mode=${sandbox}`);
|
|
470
|
+
else tokens.push("-s", sandbox);
|
|
471
|
+
tokens.push("--skip-git-repo-check");
|
|
472
|
+
if (isResume) tokens.push(shellQuote(config.resumeSessionId));
|
|
473
|
+
if (config.promptFile) tokens.push("\"$prompt\"");
|
|
474
|
+
else if (config.promptInline) tokens.push(shellQuote(config.promptInline));
|
|
475
|
+
let cmd = tokens.join(" ").replace(/\s+/g, " ").trim();
|
|
476
|
+
return [useExec ? `exec ${cmd}` : cmd];
|
|
477
|
+
}
|
|
478
|
+
var PROVIDER_ENV_UNSETS;
|
|
479
|
+
var init_launcher_generator = __esmMin((() => {
|
|
480
|
+
init_codex();
|
|
481
|
+
init_behavior();
|
|
482
|
+
init_providers();
|
|
483
|
+
init_model_validation();
|
|
484
|
+
init_ui_theme();
|
|
485
|
+
init_paths();
|
|
486
|
+
init_launcher_git_guard();
|
|
487
|
+
PROVIDER_ENV_UNSETS = [
|
|
488
|
+
"ANTHROPIC_API_KEY",
|
|
489
|
+
"ANTHROPIC_BASE_URL",
|
|
490
|
+
"ANTHROPIC_AUTH_TOKEN",
|
|
491
|
+
"OPENAI_API_KEY",
|
|
492
|
+
"GEMINI_API_KEY",
|
|
493
|
+
"API_TIMEOUT_MS",
|
|
494
|
+
"CLAUDE_CODE_API_KEY_HELPER_TTL_MS",
|
|
495
|
+
"CLAUDE_CODE_AUTO_COMPACT_WINDOW",
|
|
496
|
+
"CLAUDE_CODE_MAX_CONTEXT_TOKENS"
|
|
497
|
+
];
|
|
498
|
+
}));
|
|
499
|
+
//#endregion
|
|
500
|
+
//#region ../../lib/tmux-dedup.ts
|
|
501
|
+
/**
|
|
502
|
+
* Keyed, crash-safe tmux delivery (PAN-2997).
|
|
503
|
+
*
|
|
504
|
+
* The dashboard cannot dedupe a tmux paste from its own state — a crash
|
|
505
|
+
* between the paste and the dashboard's acknowledgment bookkeeping would make
|
|
506
|
+
* recovery re-paste. The dedup record therefore lives in the
|
|
507
|
+
* crash-independent component: per-session tmux user options. All
|
|
508
|
+
* check/paste/mark sequences that must not be interrupted are issued as ONE
|
|
509
|
+
* `if-shell` command list, which the tmux SERVER executes — a dashboard exit
|
|
510
|
+
* cannot interrupt it, and a tmux-server exit kills the agent session itself,
|
|
511
|
+
* so a replay after either crash is correct.
|
|
512
|
+
*
|
|
513
|
+
* The protocol is two-phase so the complete paste-settle-submit transaction
|
|
514
|
+
* survives a dashboard crash: the key becomes terminal only as part of the
|
|
515
|
+
* server-owned submission itself.
|
|
516
|
+
*
|
|
517
|
+
* (none) ──paste──► PENDING ──atomic claim+Enter──► TERMINAL
|
|
518
|
+
*
|
|
519
|
+
* - `sendKeysDedup` atomically pastes and sets the PENDING option only when
|
|
520
|
+
* neither option is set. A replay that finds PENDING (a prior attempt
|
|
521
|
+
* crashed before submitting) returns 'submit-pending' WITHOUT re-pasting.
|
|
522
|
+
* A POISON breadcrumb (a terminal marker that proved false but could not be
|
|
523
|
+
* rolled back) is repaired first and never honored as a dedup.
|
|
524
|
+
* - `completeKeyedSubmit` issues ONE `if-shell`: only when PENDING is
|
|
525
|
+
* present, TERMINAL absent, and the pane alive does the tmux server send
|
|
526
|
+
* the Enter and then flip TERMINAL and clear PENDING — in that order, in a
|
|
527
|
+
* single server-executed command list. After the command the target is
|
|
528
|
+
* re-read: if the pane died, was replaced, or cannot be identified around
|
|
529
|
+
* the Enter, the terminal marker is rolled back under a poison breadcrumb
|
|
530
|
+
* and the pending claim restored. Exactly one caller can become the
|
|
531
|
+
* completer; every other concurrent or post-crash caller loses the
|
|
532
|
+
* server-side condition and sends nothing, so no stray Enter can ever land
|
|
533
|
+
* in a composer holding unrelated text.
|
|
534
|
+
*/
|
|
535
|
+
/** Set once the keyed message has been SUBMITTED (Enter sent). */
|
|
536
|
+
function dedupTerminalOptionName(dedupKey) {
|
|
537
|
+
return `@overdeck-dedup-${dedupKey}`;
|
|
538
|
+
}
|
|
539
|
+
/** Set atomically with the paste; cleared when the terminal marker lands. */
|
|
540
|
+
function dedupPendingOptionName(dedupKey) {
|
|
541
|
+
return `@overdeck-dedup-pending-${dedupKey}`;
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Rollback-required breadcrumb (cycle 11). Set when a post-submit check
|
|
545
|
+
* proves a terminal marker FALSE but the rollback could not be verified.
|
|
546
|
+
* While this marker exists the terminal marker must never be honored — the
|
|
547
|
+
* next keyed call repairs the markers before anything else.
|
|
548
|
+
*/
|
|
549
|
+
function dedupPoisonOptionName(dedupKey) {
|
|
550
|
+
return `@overdeck-dedup-poison-${dedupKey}`;
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* The pane_pid of the pane that received the keyed paste (cycle 13). Set
|
|
554
|
+
* atomically with the paste (`set-option -F ... '#{pane_pid}'`) and required
|
|
555
|
+
* by the submit condition: recovery may complete an old pending claim with
|
|
556
|
+
* Enter alone ONLY when the current pane IS the pane that holds the pasted
|
|
557
|
+
* content. A replaced pane gets a real re-paste instead.
|
|
558
|
+
*/
|
|
559
|
+
function dedupTargetOptionName(dedupKey) {
|
|
560
|
+
return `@overdeck-dedup-target-${dedupKey}`;
|
|
561
|
+
}
|
|
562
|
+
function assertValidDedupKey(dedupKey) {
|
|
563
|
+
if (!DEDUP_KEY_RE.test(dedupKey)) throw new Error(`dedupKey must match [A-Za-z0-9:_-]+, got: ${dedupKey.slice(0, 40)}`);
|
|
564
|
+
}
|
|
565
|
+
/** pane_pid + pane_dead in one read — the identity of the Enter's target. */
|
|
566
|
+
async function readPaneTarget(sessionName) {
|
|
567
|
+
return tmuxExecAsync([
|
|
568
|
+
"display-message",
|
|
569
|
+
"-p",
|
|
570
|
+
"-t",
|
|
571
|
+
sessionName,
|
|
572
|
+
"#{pane_pid} #{pane_dead}"
|
|
573
|
+
], { encoding: "utf-8" }).then((result) => {
|
|
574
|
+
const [pid = "", dead = ""] = String(result.stdout).trim().split(/\s+/);
|
|
575
|
+
return {
|
|
576
|
+
pid,
|
|
577
|
+
dead: dead === "1"
|
|
578
|
+
};
|
|
579
|
+
}).catch(() => ({
|
|
580
|
+
pid: "",
|
|
581
|
+
dead: true
|
|
582
|
+
}));
|
|
583
|
+
}
|
|
584
|
+
async function readMarker(sessionName, option) {
|
|
585
|
+
return tmuxExecAsync([
|
|
586
|
+
"show-option",
|
|
587
|
+
"-qv",
|
|
588
|
+
"-t",
|
|
589
|
+
sessionName,
|
|
590
|
+
option
|
|
591
|
+
], { encoding: "utf-8" }).then((result) => String(result.stdout).trim(), () => "");
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Fail-CLOSED marker read (cycle 12): `-q` makes an unset user option a clean
|
|
595
|
+
* empty read, so a rejection is always a REAL failure (missing session,
|
|
596
|
+
* unreachable server). Safety-critical markers (the poison breadcrumb) must
|
|
597
|
+
* be read this way — interpreting a failed read as "absent" could honor a
|
|
598
|
+
* false terminal marker or bypass a rollback-required state.
|
|
599
|
+
*/
|
|
600
|
+
async function readMarkerStrict(sessionName, option) {
|
|
601
|
+
const result = await tmuxExecAsync([
|
|
602
|
+
"show-option",
|
|
603
|
+
"-qv",
|
|
604
|
+
"-t",
|
|
605
|
+
sessionName,
|
|
606
|
+
option
|
|
607
|
+
], { encoding: "utf-8" });
|
|
608
|
+
return String(result.stdout).trim();
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Clear the poison breadcrumb and VERIFY it is gone with a strict read.
|
|
612
|
+
* EVERY failure here — the clear command, the verification read, or a
|
|
613
|
+
* surviving breadcrumb — is a recoverable KeyedMarkerVerificationError
|
|
614
|
+
* (cycle 14): a repair that stops at this boundary has delivered nothing,
|
|
615
|
+
* so the wake outbox must stay pending, never terminal 'failed'.
|
|
616
|
+
*/
|
|
617
|
+
async function clearPoisonVerified(sessionName, poisonOption, context, readStrict = readMarkerStrict) {
|
|
618
|
+
try {
|
|
619
|
+
await tmuxExecAsync([
|
|
620
|
+
"set-option",
|
|
621
|
+
"-u",
|
|
622
|
+
"-t",
|
|
623
|
+
sessionName,
|
|
624
|
+
poisonOption
|
|
625
|
+
], { encoding: "utf-8" });
|
|
626
|
+
} catch (error) {
|
|
627
|
+
throw new KeyedMarkerVerificationError(sessionName, `poison clear command failed (${context})`, { cause: error });
|
|
628
|
+
}
|
|
629
|
+
let remaining;
|
|
630
|
+
try {
|
|
631
|
+
remaining = await readStrict(sessionName, poisonOption);
|
|
632
|
+
} catch (error) {
|
|
633
|
+
throw new KeyedMarkerVerificationError(sessionName, `post-clear verification read failed (${context})`, { cause: error });
|
|
634
|
+
}
|
|
635
|
+
if (remaining !== "") throw new KeyedMarkerVerificationError(sessionName, `poison breadcrumb survived the clear (${context})`);
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Repair a poisoned marker set (cycle 11/12): clear the terminal marker,
|
|
639
|
+
* restore a pending claim, verify both, then clear the breadcrumb — verified.
|
|
640
|
+
* A poisoned terminal is PROVISIONAL: it may be a false claim (rollback was
|
|
641
|
+
* interrupted) or a delivered-but-unverified one, and the tmux tier cannot
|
|
642
|
+
* distinguish them — so repair always rolls back to pending and lets the
|
|
643
|
+
* normal recovery re-drive. An empty Enter on the (already-submitted, live)
|
|
644
|
+
* composer is the worst case; a suppressed wake is never acceptable.
|
|
645
|
+
*
|
|
646
|
+
* Returns normally only when the breadcrumb is verifiably gone; throws
|
|
647
|
+
* otherwise (the caller must NOT submit while a stale breadcrumb survives —
|
|
648
|
+
* a later replay would invalidate a legitimate terminal and re-submit).
|
|
649
|
+
*/
|
|
650
|
+
async function repairPoisonedMarkers(sessionName, dedupKey, sendId, readStrict) {
|
|
651
|
+
const terminalOption = dedupTerminalOptionName(dedupKey);
|
|
652
|
+
const pendingOption = dedupPendingOptionName(dedupKey);
|
|
653
|
+
const poisonOption = dedupPoisonOptionName(dedupKey);
|
|
654
|
+
await tmuxExecAsync([
|
|
655
|
+
"set-option",
|
|
656
|
+
"-u",
|
|
657
|
+
"-t",
|
|
658
|
+
sessionName,
|
|
659
|
+
terminalOption,
|
|
660
|
+
";",
|
|
661
|
+
"set-option",
|
|
662
|
+
"-t",
|
|
663
|
+
sessionName,
|
|
664
|
+
pendingOption,
|
|
665
|
+
sendId
|
|
666
|
+
], { encoding: "utf-8" });
|
|
667
|
+
let repairedTerminal;
|
|
668
|
+
let repairedPending;
|
|
669
|
+
try {
|
|
670
|
+
[repairedTerminal, repairedPending] = await Promise.all([readStrict(sessionName, terminalOption), readStrict(sessionName, pendingOption)]);
|
|
671
|
+
} catch {
|
|
672
|
+
throw new KeyedMarkerVerificationError(sessionName, `repair verification of key "${dedupKey}"`);
|
|
673
|
+
}
|
|
674
|
+
if (repairedTerminal !== "" || repairedPending === "") throw new Error(`Keyed tmux markers for ${sessionName} are poisoned and could not be repaired (key "${dedupKey}")`);
|
|
675
|
+
await clearPoisonVerified(sessionName, poisonOption, `repair of key "${dedupKey}"`, readStrict);
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Deduplicated message paste for the tmux fallback path.
|
|
679
|
+
*
|
|
680
|
+
* Returns 'pasted' when this call pasted (caller must complete the submit),
|
|
681
|
+
* 'submit-pending' when a prior attempt's paste is still awaiting submission
|
|
682
|
+
* (caller must complete the submit — crucially WITHOUT pasting again), and
|
|
683
|
+
* 'deduplicated' when the key is already terminal (caller does nothing; no
|
|
684
|
+
* stray Enter, because the composer may hold unrelated operator text).
|
|
685
|
+
*
|
|
686
|
+
* Throws when the keyed paste did not land and no marker explains why —
|
|
687
|
+
* silent loss must surface as a delivery failure, not as a false dedup.
|
|
688
|
+
*/
|
|
689
|
+
async function sendKeysDedup(sessionName, keys, dedupKey, caller, deps = {}) {
|
|
690
|
+
validateSessionName(sessionName);
|
|
691
|
+
assertValidDedupKey(dedupKey);
|
|
692
|
+
const read = deps.readMarker ?? readMarker;
|
|
693
|
+
const readStrict = deps.readMarkerStrict ?? readMarkerStrict;
|
|
694
|
+
const terminalOption = dedupTerminalOptionName(dedupKey);
|
|
695
|
+
const pendingOption = dedupPendingOptionName(dedupKey);
|
|
696
|
+
const poisonOption = dedupPoisonOptionName(dedupKey);
|
|
697
|
+
const sendId = randomUUID();
|
|
698
|
+
let poisonMarker;
|
|
699
|
+
try {
|
|
700
|
+
poisonMarker = await readStrict(sessionName, poisonOption);
|
|
701
|
+
} catch (error) {
|
|
702
|
+
throw new KeyedMarkerVerificationError(sessionName, `initial poison read (key "${dedupKey}")`, { cause: error });
|
|
703
|
+
}
|
|
704
|
+
const repaired = poisonMarker !== "";
|
|
705
|
+
if (repaired) await repairPoisonedMarkers(sessionName, dedupKey, sendId, readStrict);
|
|
706
|
+
const targetOption = dedupTargetOptionName(dedupKey);
|
|
707
|
+
const tmpFile = join$1(tmpdir(), `pan-sendkeys-${sendId}.txt`);
|
|
708
|
+
const bufferName = `pan-${sendId}`;
|
|
709
|
+
try {
|
|
710
|
+
await writeFile(tmpFile, keys, "utf-8");
|
|
711
|
+
await tmuxExecAsync([
|
|
712
|
+
"load-buffer",
|
|
713
|
+
"-b",
|
|
714
|
+
bufferName,
|
|
715
|
+
tmpFile
|
|
716
|
+
], { encoding: "utf-8" });
|
|
717
|
+
if (!repaired) await tmuxExecAsync([
|
|
718
|
+
"if-shell",
|
|
719
|
+
"-t",
|
|
720
|
+
sessionName,
|
|
721
|
+
`test -z "$(tmux show-option -qv -t ${sessionName} ${pendingOption})" && test -z "$(tmux show-option -qv -t ${sessionName} ${terminalOption})"`,
|
|
722
|
+
`paste-buffer -b ${bufferName} -p -t ${sessionName} \; set-option -t ${sessionName} ${pendingOption} ${sendId} \; set-option -F -t ${sessionName} ${targetOption} '#{pane_pid}'`
|
|
723
|
+
], { encoding: "utf-8" });
|
|
724
|
+
const [pendingMarker, terminalMarker] = await Promise.all([read(sessionName, pendingOption), read(sessionName, terminalOption)]);
|
|
725
|
+
if (terminalMarker !== "") return "deduplicated";
|
|
726
|
+
if (!repaired && pendingMarker === sendId) return "pasted";
|
|
727
|
+
if (pendingMarker !== "") {
|
|
728
|
+
const recordedTarget = await read(sessionName, targetOption);
|
|
729
|
+
const currentPid = (await (deps.readPaneTarget ?? readPaneTarget)(sessionName)).pid;
|
|
730
|
+
if (recordedTarget !== "" && currentPid !== "" && recordedTarget === currentPid) return "submit-pending";
|
|
731
|
+
await tmuxExecAsync([
|
|
732
|
+
"if-shell",
|
|
733
|
+
"-t",
|
|
734
|
+
sessionName,
|
|
735
|
+
`test -n "$(tmux show-option -qv -t ${sessionName} ${pendingOption})" && test -z "$(tmux show-option -qv -t ${sessionName} ${terminalOption})" && ! test "$(tmux display-message -p -t ${sessionName} '#{pane_pid}')" = "$(tmux show-option -qv -t ${sessionName} ${targetOption})"`,
|
|
736
|
+
`paste-buffer -b ${bufferName} -p -t ${sessionName} \; set-option -t ${sessionName} ${pendingOption} ${sendId} \; set-option -F -t ${sessionName} ${targetOption} '#{pane_pid}'`
|
|
737
|
+
], { encoding: "utf-8" });
|
|
738
|
+
const [repastedPending, repastedTerminal, repastedTarget] = await Promise.all([
|
|
739
|
+
read(sessionName, pendingOption),
|
|
740
|
+
read(sessionName, terminalOption),
|
|
741
|
+
read(sessionName, targetOption)
|
|
742
|
+
]);
|
|
743
|
+
if (repastedTerminal !== "") return "deduplicated";
|
|
744
|
+
if (repastedPending === sendId) return "pasted";
|
|
745
|
+
if (repastedPending !== "") {
|
|
746
|
+
const nowPid = (await (deps.readPaneTarget ?? readPaneTarget)(sessionName)).pid;
|
|
747
|
+
if (repastedTarget !== "" && nowPid !== "" && repastedTarget === nowPid) return "submit-pending";
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
throw new Error(`Keyed tmux paste for ${sessionName} did not land and no dedup marker was recorded` + (caller ? ` (caller: ${caller})` : ""));
|
|
751
|
+
} finally {
|
|
752
|
+
await unlink(tmpFile).catch(() => {});
|
|
753
|
+
await tmuxExecAsync([
|
|
754
|
+
"delete-buffer",
|
|
755
|
+
"-b",
|
|
756
|
+
bufferName
|
|
757
|
+
], { encoding: "utf-8" }).catch(() => {});
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Complete the paste-settle-submit transaction for a keyed tmux delivery.
|
|
762
|
+
*
|
|
763
|
+
* After the settle window, the SUBMISSION is one server-owned command: a
|
|
764
|
+
* single `if-shell` whose condition requires the pending claim present, the
|
|
765
|
+
* terminal marker absent, AND the pane alive, and whose command list sends
|
|
766
|
+
* the Enter FIRST and then sets the POISON breadcrumb and the TERMINAL
|
|
767
|
+
* marker and clears pending — the terminal is PROVISIONAL from the moment it
|
|
768
|
+
* exists, so a dashboard crash can never strand an honorable-but-unverified
|
|
769
|
+
* terminal (cycle 12). The tmux server executes the whole sequence:
|
|
770
|
+
*
|
|
771
|
+
* - A pane that died during the settle window fails the liveness condition —
|
|
772
|
+
* NO marker changes and NO Enter is sent, so the wake is never recorded as
|
|
773
|
+
* delivered when it never landed. The preserved pending claim lets
|
|
774
|
+
* recovery retry after the agent resumes.
|
|
775
|
+
* - The pre-branch liveness condition is NOT proof of acceptance (cycle 10):
|
|
776
|
+
* the pane can die in the shell-to-branch handoff, and tmux reports
|
|
777
|
+
* send-keys into a remain-on-exit corpse as success. So after the command
|
|
778
|
+
* the target is re-read — if the pane died, was replaced, or cannot be
|
|
779
|
+
* identified around the Enter, the terminal marker is ROLLED BACK and the
|
|
780
|
+
* pending claim restored, and KeyedSubmitTargetDeadError is thrown. The
|
|
781
|
+
* breadcrumb is lifted only after verification, and clearing it is itself
|
|
782
|
+
* verified (cycle 12): a stale breadcrumb would let a later replay
|
|
783
|
+
* invalidate a legitimate terminal and re-submit.
|
|
784
|
+
* - The Enter precedes the terminal transition inside the transaction, so a
|
|
785
|
+
* failed Enter (which aborts the command list) can never leave the key
|
|
786
|
+
* terminal.
|
|
787
|
+
* - Exactly one caller becomes the completer; concurrent or post-crash
|
|
788
|
+
* callers lose the server-side condition and send no stray Enter into a
|
|
789
|
+
* composer that may hold unrelated operator text.
|
|
790
|
+
*
|
|
791
|
+
* Safe to call for both 'pasted' and 'submit-pending' phases; a call whose
|
|
792
|
+
* key is already terminal is a no-op. Throws KeyedSubmitTargetDeadError when
|
|
793
|
+
* the pane is dead (pending claim preserved), and a generic error when both
|
|
794
|
+
* markers vanished without a submission.
|
|
795
|
+
*/
|
|
796
|
+
async function completeKeyedSubmit(sessionName, dedupKey, deps = {}) {
|
|
797
|
+
validateSessionName(sessionName);
|
|
798
|
+
assertValidDedupKey(dedupKey);
|
|
799
|
+
const read = deps.readMarker ?? readMarker;
|
|
800
|
+
const readStrict = deps.readMarkerStrict ?? readMarkerStrict;
|
|
801
|
+
const readTarget = deps.readPaneTarget ?? readPaneTarget;
|
|
802
|
+
const terminalOption = dedupTerminalOptionName(dedupKey);
|
|
803
|
+
const pendingOption = dedupPendingOptionName(dedupKey);
|
|
804
|
+
const poisonOption = dedupPoisonOptionName(dedupKey);
|
|
805
|
+
const targetOption = dedupTargetOptionName(dedupKey);
|
|
806
|
+
await new Promise((resolve) => setTimeout(resolve, PASTE_SETTLE_MS));
|
|
807
|
+
const preTarget = await readTarget(sessionName);
|
|
808
|
+
const pendingBefore = await read(sessionName, pendingOption);
|
|
809
|
+
await tmuxExecAsync([
|
|
810
|
+
"if-shell",
|
|
811
|
+
"-t",
|
|
812
|
+
sessionName,
|
|
813
|
+
`test -z "$(tmux show-option -qv -t ${sessionName} ${terminalOption})" && test -n "$(tmux show-option -qv -t ${sessionName} ${pendingOption})" && test "$(tmux display-message -p -t ${sessionName} '#{pane_dead}')" = "0" && test "$(tmux display-message -p -t ${sessionName} '#{pane_pid}')" = "$(tmux show-option -qv -t ${sessionName} ${targetOption})"`,
|
|
814
|
+
`send-keys -t ${sessionName} C-m \; set-option -t ${sessionName} ${poisonOption} 1 \; set-option -t ${sessionName} ${terminalOption} 1 \; set-option -u -t ${sessionName} ${pendingOption}`
|
|
815
|
+
], { encoding: "utf-8" });
|
|
816
|
+
const [terminalAfter, pendingAfter, postTarget, recordedTarget] = await Promise.all([
|
|
817
|
+
read(sessionName, terminalOption),
|
|
818
|
+
read(sessionName, pendingOption),
|
|
819
|
+
readTarget(sessionName),
|
|
820
|
+
read(sessionName, targetOption)
|
|
821
|
+
]);
|
|
822
|
+
const targetLost = preTarget.dead || preTarget.pid === "" || postTarget.dead || postTarget.pid !== preTarget.pid;
|
|
823
|
+
if (terminalAfter !== "") {
|
|
824
|
+
if (!targetLost) {
|
|
825
|
+
await clearPoisonVerified(sessionName, poisonOption, `verified delivery of key "${dedupKey}"`, readStrict);
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
await tmuxExecAsync(pendingBefore === "" ? [
|
|
829
|
+
"set-option",
|
|
830
|
+
"-u",
|
|
831
|
+
"-t",
|
|
832
|
+
sessionName,
|
|
833
|
+
terminalOption,
|
|
834
|
+
";",
|
|
835
|
+
"set-option",
|
|
836
|
+
"-u",
|
|
837
|
+
"-t",
|
|
838
|
+
sessionName,
|
|
839
|
+
pendingOption
|
|
840
|
+
] : [
|
|
841
|
+
"set-option",
|
|
842
|
+
"-u",
|
|
843
|
+
"-t",
|
|
844
|
+
sessionName,
|
|
845
|
+
terminalOption,
|
|
846
|
+
";",
|
|
847
|
+
"set-option",
|
|
848
|
+
"-t",
|
|
849
|
+
sessionName,
|
|
850
|
+
pendingOption,
|
|
851
|
+
pendingBefore
|
|
852
|
+
], { encoding: "utf-8" }).catch(() => {});
|
|
853
|
+
let rolledTerminal;
|
|
854
|
+
let restoredPending;
|
|
855
|
+
try {
|
|
856
|
+
[rolledTerminal, restoredPending] = await Promise.all([readStrict(sessionName, terminalOption), readStrict(sessionName, pendingOption)]);
|
|
857
|
+
} catch {
|
|
858
|
+
throw new KeyedMarkerVerificationError(sessionName, `rollback verification of key "${dedupKey}"`);
|
|
859
|
+
}
|
|
860
|
+
if (rolledTerminal === "" && restoredPending !== "") await clearPoisonVerified(sessionName, poisonOption, `verified rollback of key "${dedupKey}"`, readStrict).catch(() => {});
|
|
861
|
+
throw new KeyedSubmitTargetDeadError(sessionName, dedupKey);
|
|
862
|
+
}
|
|
863
|
+
if (pendingAfter !== "") {
|
|
864
|
+
const replaced = recordedTarget === "" || postTarget.pid === "" || recordedTarget !== postTarget.pid;
|
|
865
|
+
if (targetLost || replaced) throw new KeyedSubmitTargetDeadError(sessionName, dedupKey);
|
|
866
|
+
throw new Error(`Keyed tmux submit for ${sessionName} was rejected with the pending claim intact on a live pane`);
|
|
867
|
+
}
|
|
868
|
+
throw new Error(`Keyed tmux submit for ${sessionName} found neither a pending claim nor a terminal marker — the paste vanished without submission`);
|
|
869
|
+
}
|
|
870
|
+
var DEDUP_KEY_RE, PASTE_SETTLE_MS, KeyedSubmitTargetDeadError, KeyedMarkerVerificationError;
|
|
871
|
+
var init_tmux_dedup = __esmMin((() => {
|
|
872
|
+
init_tmux();
|
|
873
|
+
DEDUP_KEY_RE = /^[A-Za-z0-9:_-]+$/;
|
|
874
|
+
PASTE_SETTLE_MS = 300;
|
|
875
|
+
KeyedSubmitTargetDeadError = class extends Error {
|
|
876
|
+
constructor(sessionName, dedupKey) {
|
|
877
|
+
super(`Keyed tmux submit for ${sessionName} found a dead pane — the Enter was NOT accepted by a live harness, the pending claim for key "${dedupKey}" is preserved, and the key is not terminal`);
|
|
878
|
+
this.name = "KeyedSubmitTargetDeadError";
|
|
879
|
+
}
|
|
880
|
+
};
|
|
881
|
+
KeyedMarkerVerificationError = class extends Error {
|
|
882
|
+
constructor(sessionName, context, options) {
|
|
883
|
+
const causeText = options?.cause instanceof Error ? `: ${options.cause.message}` : "";
|
|
884
|
+
super(`Keyed tmux markers for ${sessionName} could not be verified (${context})${causeText}`, options);
|
|
885
|
+
this.name = "KeyedMarkerVerificationError";
|
|
886
|
+
}
|
|
887
|
+
};
|
|
888
|
+
}));
|
|
889
|
+
//#endregion
|
|
890
|
+
export { shellQuoteModelIdSync as _, dedupPendingOptionName as a, dedupTerminalOptionName as c, generateLauncherScriptSync as d, init_launcher_generator as f, requireModelOverrideSync as g, normalizeModelOverrideSync as h, completeKeyedSubmit as i, init_tmux_dedup as l, init_model_validation as m, KeyedSubmitTargetDeadError as n, dedupPoisonOptionName as o, MODEL_ID_PATTERN as p, assertValidDedupKey as r, dedupTargetOptionName as s, KeyedMarkerVerificationError as t, sendKeysDedup as u };
|
|
891
|
+
|
|
892
|
+
//# sourceMappingURL=tmux-dedup-DbN6MGzM.js.map
|