@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
|
@@ -16,10 +16,12 @@ allowed-tools:
|
|
|
16
16
|
- Read
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
-
# Overdeck Dashboard Restart (production-safe
|
|
19
|
+
# Overdeck Dashboard Restart (production-safe)
|
|
20
20
|
|
|
21
21
|
The dashboard the browser talks to is the **pre-built `dist/dashboard/server.js` running under Node 22**, started from the **primary repo checkout** (NOT a `workspaces/feature-*` copy). It serves both the built frontend and the API on one port. **Never** run the production server via `npm run dev`, `tsx`, `vite`, or Bun — that violates the dashboard-node22-only rule (node-pty native addon + circular ESM). `pan dev` is the *development* path (vite HMR for the frontend + Node server); `pan up` is the *production* path.
|
|
22
22
|
|
|
23
|
+
The **supervisor sidecar** (`overdeck-supervisor.service`, port 3012) owns the dashboard lifecycle: it health-checks the server and respawns it as a systemd unit with the full env from `config.yaml`. Restart **through** it (`POST :3012/restart-dashboard`) — a manually spawned server is a duplicate it will replace, and racing it costs minutes of churn. The manual detached start below is the fallback for when the supervisor itself is down, and it must carry the Traefik env block (gotcha 7).
|
|
24
|
+
|
|
23
25
|
## When to use this skill
|
|
24
26
|
|
|
25
27
|
`pan up` / `pan restart` is the normal path. Reach for this manual procedure **only** when:
|
|
@@ -35,33 +37,53 @@ The dashboard the browser talks to is the **pre-built `dist/dashboard/server.js`
|
|
|
35
37
|
3. **Exactly ONE server.** Two servers = two deacons racing the same `~/.overdeck` state (the duel), and the PAN-1625 janitor reaps/churns extras. A single port-owner is left alone.
|
|
36
38
|
4. **Work-agent tmux sessions survive a dashboard restart** — they are separate processes on the `overdeck` socket. Restarting the dashboard does NOT kill agents; the new deacon reconciles them as running.
|
|
37
39
|
5. **Run from the primary repo**, not a workspace. If `readlink /proc/<pid>/cwd` is a `workspaces/feature-*` path, a workspace dashboard hijacked the port — kill it and restart from the primary checkout.
|
|
40
|
+
6. **The supervisor sidecar owns the dashboard lifecycle.** `overdeck-supervisor.service` (port 3012) health-checks the dashboard and respawns it as a systemd unit with the full env from `config.yaml`. A manual server you spawn yourself is a duplicate it will replace — so restart THROUGH the supervisor (below) instead of racing it, and never kill a systemd-parented server that carries `OVERDECK_TRAEFIK_*` env: that is the supervisor's correctly-configured replacement, not a stray.
|
|
41
|
+
7. **A bare `node dist/dashboard/server.js` launch 403s the domain on dists without the config fallback.** `getTrustedOrigins()` reads the launch env; no `OVERDECK_TRAEFIK_*` → only loopback is trusted → `/ws/*` 403s `https://overdeck.localhost` → the dashboard hangs on "Reconnecting to the dashboard…" while `localhost:3011` works. `/api/health` returns 200 the whole time because it does no origin validation. Newer dists fall back to `config.yaml` (commit `e86d125071`), but always launch WITH the env block below — it costs nothing and works on every dist.
|
|
38
42
|
|
|
39
43
|
## Procedure
|
|
40
44
|
|
|
41
45
|
```bash
|
|
42
46
|
cd ~/Projects/overdeck # the PRIMARY checkout
|
|
43
47
|
|
|
48
|
+
# 0. Domain comes from config.yaml — the same source pan up / the supervisor use
|
|
49
|
+
DOMAIN=$(awk '/^traefik:/{f=1} f && /^ domain:/{print $2; exit}' ~/.overdeck/config.yaml)
|
|
50
|
+
DOMAIN=${DOMAIN:-overdeck.localhost}
|
|
51
|
+
|
|
44
52
|
# 1. Rebuild ONLY if you changed server/lib source (the Node 22 dist is what runs)
|
|
45
53
|
npm run build
|
|
46
54
|
|
|
47
|
-
# 2.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
# 2. PREFERRED: restart through the supervisor (it owns the lifecycle, sets the
|
|
56
|
+
# correct env from config.yaml, and systemd-manages the result). Skip to step 3
|
|
57
|
+
# only when port 3012 refuses connections.
|
|
58
|
+
curl -s -X POST http://127.0.0.1:3012/restart-dashboard # → 202 Accepted
|
|
59
|
+
|
|
60
|
+
# 3. Supervisor down? Manual detached start — WITH the Traefik env block (gotcha 7).
|
|
61
|
+
# Kill the old server by EXPLICIT PID (never pkill -f self-matching).
|
|
62
|
+
OLD=$(ss -ltnp 2>/dev/null | grep -E ':3011\b' | grep node | grep -oE 'pid=[0-9]+' | head -1 | cut -d= -f2)
|
|
51
63
|
[ -n "$OLD" ] && kill -TERM "$OLD"
|
|
52
64
|
for i in $(seq 1 15); do { [ -n "$OLD" ] && kill -0 "$OLD" 2>/dev/null; } && sleep 1 || break; done
|
|
53
65
|
{ [ -n "$OLD" ] && kill -0 "$OLD" 2>/dev/null; } && kill -9 "$OLD"
|
|
54
66
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
67
|
+
setsid env \
|
|
68
|
+
DASHBOARD_URL="https://${DOMAIN}" OVERDECK_TRAEFIK_ENABLED=1 \
|
|
69
|
+
OVERDECK_TRAEFIK_DOMAIN="${DOMAIN}" OVERDECK_TRUSTED_ORIGINS="https://${DOMAIN}" \
|
|
70
|
+
DASHBOARD_PORT=3010 API_PORT=3011 PORT=3011 OVERDECK_MODE=production \
|
|
71
|
+
bash -c 'exec node dist/dashboard/server.js' > /tmp/pan-dash.log 2>&1 < /dev/null &
|
|
58
72
|
|
|
59
|
-
# 4. Verify health
|
|
73
|
+
# 4. Verify health AND the WebSocket origin path. /api/health does no origin
|
|
74
|
+
# validation — it returns 200 even while /ws/* 403s the domain (gotcha 7).
|
|
75
|
+
# The WS check is the only one that proves the browser can actually connect.
|
|
60
76
|
for i in $(seq 1 40); do
|
|
61
|
-
code=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 3 https
|
|
77
|
+
code=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 3 "https://${DOMAIN}/api/health" 2>/dev/null)
|
|
62
78
|
[ "$code" = 200 ] && { echo "healthy after ${i}s"; break; }
|
|
63
79
|
sleep 1
|
|
64
80
|
done
|
|
81
|
+
ws=$(curl -sk -o /dev/null -w '%{http_code}' --http1.1 --max-time 5 \
|
|
82
|
+
-H "Origin: https://${DOMAIN}" -H "Connection: Upgrade" -H "Upgrade: websocket" \
|
|
83
|
+
-H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
|
|
84
|
+
"https://${DOMAIN}/ws/rpc")
|
|
85
|
+
[ "$ws" = 101 ] && echo "WS origin OK" \
|
|
86
|
+
|| echo "WS origin FAILED (got $ws) — server does not trust the domain; relaunch with the env block (or a dist with the config fallback)"
|
|
65
87
|
|
|
66
88
|
# 5. Confirm SINGLE instance, correct dist path (primary repo, not a workspace)
|
|
67
89
|
ss -ltnp 2>/dev/null | grep -E ':(3010|3011)\b'
|
|
@@ -79,6 +101,7 @@ readlink -f /proc/$NEW/cwd # must be the primary repo path
|
|
|
79
101
|
## Verify success
|
|
80
102
|
|
|
81
103
|
- `overdeck.localhost/api/health` returns `{"status":"ok"}` and `curl http://localhost:<port>/api/health` returns 200.
|
|
104
|
+
- **The WebSocket origin check returns 101** (procedure step 4). Health alone is not success — a server missing its Traefik env is healthy on `/api/health` and dead to the browser at the same time.
|
|
82
105
|
- Exactly one **host-level** `node dist/dashboard/server.js` process; its `/proc/<pid>/cwd` is the primary repo.
|
|
83
106
|
**Do not count workspace-container servers.** Each running workspace devcontainer has its own `server` service whose `dist/dashboard/server.js` process is visible in host `ps` — those are legitimate read/UI peers (cwd `/workspaces/overdeck`, parent `containerd-shim`, `OVERDECK_DISABLE_DEACON=1`), NOT duplicate dashboards and NOT a single-deacon hazard. Seeing N+1 server processes with N containers up is the healthy state. Container-aware census:
|
|
84
107
|
```bash
|
|
@@ -89,6 +112,7 @@ readlink -f /proc/$NEW/cwd # must be the primary repo path
|
|
|
89
112
|
done
|
|
90
113
|
```
|
|
91
114
|
Exactly one `HOST` line, with cwd = the primary repo, is success. Multiple `HOST` lines = a real orphan (the deacon's orphan-server reaper, PAN-1625, will also catch it).
|
|
115
|
+
- **Do not kill the supervisor's server.** If a HOST server is parented to systemd and its env contains `OVERDECK_TRAEFIK_DOMAIN`, it is the supervisor's correctly-configured managed instance (gotcha 6). If you spawned a manual server and then see a second one appear, kill YOURS (the one without the Traefik env), never the supervisor's.
|
|
92
116
|
- Agent tmux sessions (`tmux -L overdeck list-sessions`) are intact.
|
|
93
117
|
- The deacon log (`/tmp/pan-dash.log` or the dashboard log) shows a single `Deacon started` and patrols advancing — no `received SIGTERM` loop.
|
|
94
118
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# PostToolUse + PostToolUseFailure hook for structured Linear MCP OAuth
|
|
3
|
+
# intervention events (PAN-2997). Registered with matcher mcp__linear__.* for
|
|
4
|
+
# both hook events: PostToolUse fires after a tool call SUCCEEDS, while a
|
|
5
|
+
# failed MCP call — the motivating OAuth-expired case — fires
|
|
6
|
+
# PostToolUseFailure with a top-level `error` field and no tool_response.
|
|
7
|
+
#
|
|
8
|
+
# Never breaks Claude Code: every failure exits 0 silently.
|
|
9
|
+
|
|
10
|
+
set +e
|
|
11
|
+
|
|
12
|
+
INPUT=$(cat 2>/dev/null || echo '{}')
|
|
13
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
14
|
+
|
|
15
|
+
TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
|
|
16
|
+
[[ "$TOOL_NAME" == mcp__linear__* ]] || exit 0
|
|
17
|
+
|
|
18
|
+
EVENT_NAME=$(printf '%s' "$INPUT" | jq -r '.hook_event_name // "PostToolUse"' 2>/dev/null)
|
|
19
|
+
|
|
20
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
21
|
+
# shellcheck source=pan-hook-lib.sh
|
|
22
|
+
. "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || exit 0
|
|
23
|
+
declare -f pan_resolve_agent_id >/dev/null 2>&1 || exit 0
|
|
24
|
+
pan_resolve_agent_id || exit 0
|
|
25
|
+
declare -f pan_emit_event >/dev/null 2>&1 || exit 0
|
|
26
|
+
|
|
27
|
+
MARKER_DIR="${OVERDECK_HOME:-$HOME/.overdeck}/agents/$AGENT_ID"
|
|
28
|
+
MARKER="$MARKER_DIR/linear-mcp-auth-pending"
|
|
29
|
+
|
|
30
|
+
# Auth-failure classifier. The 401 alternative requires a non-identifier
|
|
31
|
+
# boundary on both sides so ordinary Linear data (MIN-401, "AUR-4015") can
|
|
32
|
+
# never match; prose phrases are matched as words.
|
|
33
|
+
is_auth_error_text() {
|
|
34
|
+
printf '%s' "$1" | grep -Eiq 'requires authentication|not authenticated|unauthorized|(^|[^0-9A-Za-z-])401([^0-9]|$)'
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
emit_required() {
|
|
38
|
+
local auth_url="$1"
|
|
39
|
+
local body
|
|
40
|
+
body=$(jq -n --arg authUrl "$auth_url" '{
|
|
41
|
+
kind: "linear_mcp_auth_required",
|
|
42
|
+
authUrl: (if $authUrl == "" then null else $authUrl end)
|
|
43
|
+
}' 2>/dev/null) || return 0
|
|
44
|
+
pan_emit_event "$AGENT_ID" "$body" >/dev/null 2>&1 || true
|
|
45
|
+
mkdir -p "$MARKER_DIR" 2>/dev/null || true
|
|
46
|
+
: > "$MARKER" 2>/dev/null || true
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
emit_healthy_if_pending() {
|
|
50
|
+
[ -f "$MARKER" ] || return 0
|
|
51
|
+
local body
|
|
52
|
+
body=$(jq -n '{kind: "linear_mcp_auth_healthy"}' 2>/dev/null) || return 0
|
|
53
|
+
pan_emit_event "$AGENT_ID" "$body" >/dev/null 2>&1 || true
|
|
54
|
+
rm -f "$MARKER" 2>/dev/null || true
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if [ "$EVENT_NAME" = "PostToolUseFailure" ]; then
|
|
58
|
+
# Documented failure-event shape: top-level `error`, no tool_response.
|
|
59
|
+
ERROR_TEXT=$(printf '%s' "$INPUT" | jq -r '.error // ""' 2>/dev/null)
|
|
60
|
+
if is_auth_error_text "$ERROR_TEXT"; then
|
|
61
|
+
emit_required ''
|
|
62
|
+
fi
|
|
63
|
+
exit 0
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# PostToolUse — successful tool call.
|
|
67
|
+
RESPONSE=$(printf '%s' "$INPUT" | jq -r '
|
|
68
|
+
(.tool_response // .tool_result // "")
|
|
69
|
+
| if type == "string" then . else tojson end
|
|
70
|
+
' 2>/dev/null)
|
|
71
|
+
[ -n "$RESPONSE" ] || RESPONSE=''
|
|
72
|
+
|
|
73
|
+
if [ "$TOOL_NAME" = 'mcp__linear__authenticate' ]; then
|
|
74
|
+
AUTH_URL=$(printf '%s\n' "$RESPONSE" \
|
|
75
|
+
| grep -Eo 'https://linear\.app/oauth/authorize[^"[:space:]<>]*' 2>/dev/null \
|
|
76
|
+
| sed -n '1p')
|
|
77
|
+
emit_required "$AUTH_URL"
|
|
78
|
+
exit 0
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# An MCP server can report a failure inside a successful hook event as an
|
|
82
|
+
# error-shaped payload (isError: true, or an `error` member). Only those
|
|
83
|
+
# payloads are auth-classified — ordinary successful result data (issue
|
|
84
|
+
# identifiers like MIN-401, titles mentioning 401s or "unauthorized") never
|
|
85
|
+
# reaches this check and simply clears any pending intervention below.
|
|
86
|
+
ERROR_SHAPED=$(printf '%s' "$INPUT" | jq -r '
|
|
87
|
+
(.tool_response // .tool_result // {})
|
|
88
|
+
| if type == "object" and ((.isError == true) or (.error != null)) then "yes" else "" end
|
|
89
|
+
' 2>/dev/null)
|
|
90
|
+
|
|
91
|
+
if [ -n "$ERROR_SHAPED" ] && is_auth_error_text "$RESPONSE"; then
|
|
92
|
+
emit_required ''
|
|
93
|
+
exit 0
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
emit_healthy_if_pending
|
|
97
|
+
exit 0
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
scope: universal
|
|
3
|
+
---
|
|
4
|
+
### Make every AskUserQuestion prompt self-contained
|
|
5
|
+
|
|
6
|
+
Every AskUserQuestion must stand alone because the operator may answer from a
|
|
7
|
+
dashboard dialog without the preceding transcript. State the situation in one
|
|
8
|
+
or two sentences, ask for the decision in plain language, and describe each
|
|
9
|
+
option by the consequence of choosing it rather than by a label alone.
|
|
@@ -35,15 +35,17 @@ Each overridable row has one explicit acceptance flag:
|
|
|
35
35
|
```text
|
|
36
36
|
--accept-review Row 1: review passed
|
|
37
37
|
--accept-tests Row 2: tests passed
|
|
38
|
-
--accept-verification Row 3: branch verification passed
|
|
38
|
+
--accept-verification Row 3: branch verification passed
|
|
39
39
|
--accept-merged Row 4: PR merged on the forge
|
|
40
40
|
--accept-post-merge Row 5: post-merge lifecycle completed
|
|
41
41
|
--accept-main-verify Row 6: merge commit verified on main
|
|
42
42
|
--accept-deploy Row 7: live dashboard build includes the merge
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
An acceptance records the flag, operator
|
|
46
|
-
|
|
45
|
+
An acceptance records the flag, operator identity, and timestamp in the issue
|
|
46
|
+
close-out record. The autonomous flywheel may run a clean close-out, but it cannot
|
|
47
|
+
use `--accept-*`; an operator must apply every override after reviewing the miss.
|
|
48
|
+
Use an override only when the missing evidence is understood:
|
|
47
49
|
|
|
48
50
|
```bash
|
|
49
51
|
pan close PAN-1234 --force
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pan-merge
|
|
3
|
-
description: "pan merge — cancel
|
|
3
|
+
description: "pan merge — cancel actionable Flywheel auto-merge rows"
|
|
4
4
|
triggers:
|
|
5
5
|
- pan merge
|
|
6
6
|
- cancel auto-merge
|
|
@@ -12,7 +12,7 @@ allowed-tools:
|
|
|
12
12
|
|
|
13
13
|
# pan merge
|
|
14
14
|
|
|
15
|
-
Use this skill when cancelling a pending Flywheel auto-merge
|
|
15
|
+
Use this skill when cancelling a pending, blocked, or failed Flywheel auto-merge row.
|
|
16
16
|
|
|
17
17
|
## Commands
|
|
18
18
|
|
|
@@ -26,12 +26,14 @@ pan merge cancel <id>
|
|
|
26
26
|
pan merge cancel PAN-123
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
Cancels
|
|
29
|
+
Cancels one actionable Flywheel auto-merge row for the issue id. The command calls the dashboard `DELETE /api/flywheel/auto-merge/:id` endpoint, removes that row from the active or problems list, and announces `auto-merge cancelled for <issueId>`.
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
An issue can hold duplicate rows from separate scheduling attempts. When more actionable rows remain, the success message reports the count and tells you to re-run `pan merge cancel <id>` to clear the next row; repeat until the normal success message contains no remaining-row notice.
|
|
32
|
+
|
|
33
|
+
If the cooldown has already expired and the selected row transitioned to `merging`, the command exits non-zero and reports that the merge is already in progress. If there is no actionable auto-merge row for the issue, it exits non-zero with `No pending auto-merge for <id>`.
|
|
32
34
|
|
|
33
35
|
## Guardrails
|
|
34
36
|
|
|
35
|
-
-
|
|
37
|
+
- A pending row is cancellable during the five-minute cooldown; blocked and failed rows remain cancellable afterward.
|
|
36
38
|
- Do not use raw HTTP when the CLI is available; the CLI supplies the dashboard internal token.
|
|
37
39
|
- A `merging` entry cannot be cancelled safely; let the merge pipeline finish or fail visibly.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pan-peer-review
|
|
3
|
+
description: "Workflow: spawn an independent adversarial reviewer on a different model to verify or refute your own findings. EXPENSIVE — invoke only when the operator explicitly asks for a peer/second-opinion review."
|
|
4
|
+
triggers:
|
|
5
|
+
- peer review my findings
|
|
6
|
+
- get independent feedback
|
|
7
|
+
- second opinion from another model
|
|
8
|
+
- have another model review this
|
|
9
|
+
- adversarial review of my analysis
|
|
10
|
+
allowed-tools:
|
|
11
|
+
- Bash
|
|
12
|
+
- Read
|
|
13
|
+
- Write
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# pan peer-review — independent second opinion from another model
|
|
17
|
+
|
|
18
|
+
Spawn a conversation on a **different model family** to adversarially verify or
|
|
19
|
+
refute an analysis you produced, then read its findings back. Use it when a
|
|
20
|
+
conclusion is expensive to get wrong: a root-cause diagnosis about to become a
|
|
21
|
+
PRD, a refactor plan, a security claim, a "this is safe to merge" call.
|
|
22
|
+
|
|
23
|
+
## ⚠️ Operator-invoked only — never launch this on your own initiative
|
|
24
|
+
|
|
25
|
+
**Do not start a peer review because you think your work would benefit from
|
|
26
|
+
one.** A peer review spawns a second full agent that reads source, burns a
|
|
27
|
+
frontier-model context, and runs for many minutes. That cost is the operator's
|
|
28
|
+
call, not yours.
|
|
29
|
+
|
|
30
|
+
Launch only when the operator explicitly asks — "get a second opinion", "run
|
|
31
|
+
this by another model", "have K3 review it", "peer review this". If you believe
|
|
32
|
+
a review is warranted and they have not asked, say so in one sentence and let
|
|
33
|
+
them decide.
|
|
34
|
+
|
|
35
|
+
Corollary: never chain reviews. One reviewer, one pass. If the reviewer
|
|
36
|
+
disagrees with you, bring the disagreement back to the operator rather than
|
|
37
|
+
spawning a third model to break the tie.
|
|
38
|
+
|
|
39
|
+
## Why a different model, and what "independent" buys you
|
|
40
|
+
|
|
41
|
+
A reviewer on the same model as the author tends to agree — it reconstructs the
|
|
42
|
+
same reasoning from the same priors. The value comes from a different family
|
|
43
|
+
reading the same source: Opus/Fable reviewing GPT work, K3 reviewing Claude
|
|
44
|
+
work, GPT reviewing Claude work.
|
|
45
|
+
|
|
46
|
+
Pick the reviewer by contrast with whoever produced the analysis:
|
|
47
|
+
|
|
48
|
+
| Author | Good reviewer |
|
|
49
|
+
| --- | --- |
|
|
50
|
+
| Claude (Opus/Fable/Sonnet) | `k3` (Kimi), `gpt-5.6-sol` |
|
|
51
|
+
| GPT | `claude-opus-5`, `k3` |
|
|
52
|
+
| Kimi | `claude-opus-5`, `gpt-5.6-sol` |
|
|
53
|
+
|
|
54
|
+
Never pass `--harness`. Harness routing is config-owned and the operator sets it
|
|
55
|
+
deliberately; `--model` is the only routing flag this workflow uses, and only
|
|
56
|
+
because the operator asked for a specific reviewer.
|
|
57
|
+
|
|
58
|
+
Leave reasoning effort alone. It inherits `high`, which is the right tier —
|
|
59
|
+
never raise it to `xhigh`/`max` for a review.
|
|
60
|
+
|
|
61
|
+
## The workflow
|
|
62
|
+
|
|
63
|
+
### 1. Write the brief to a file — never into the focus
|
|
64
|
+
|
|
65
|
+
The `pan handoff` focus is hard-capped at 500 characters. A real review brief is
|
|
66
|
+
thousands. Write it to a file in the reviewer's future cwd and let the focus
|
|
67
|
+
point at it.
|
|
68
|
+
|
|
69
|
+
A brief that produces a useful review has these parts:
|
|
70
|
+
|
|
71
|
+
- **Adversarial framing, stated first.** "Assume each claim may be wrong. A
|
|
72
|
+
claim that survives refutation is worth more than agreement. Do not soften
|
|
73
|
+
findings to be agreeable." Without this you get a politeness echo.
|
|
74
|
+
- **Read-only rules.** No edits to source, no commits, no `pan` commands, no
|
|
75
|
+
POST/DELETE. The reviewer writes exactly one file: its findings.
|
|
76
|
+
- **A glossary** of every term of art before you use it — the reviewer has none
|
|
77
|
+
of your conversation's context.
|
|
78
|
+
- **Absolute paths for evidence outside the worktree** — live workspaces, logs,
|
|
79
|
+
config, API endpoints. The reviewer cannot find them otherwise.
|
|
80
|
+
- **Each claim stated separately**, with the exact file:line it rests on, the
|
|
81
|
+
evidence you used, and the fix you propose.
|
|
82
|
+
- **Per-claim questions that invite refutation** — "does the fix actually
|
|
83
|
+
terminate the loop?", "what is the blast radius?", "would this regress the
|
|
84
|
+
monorepo path?". Generic "please review" produces generic output.
|
|
85
|
+
- **Cross-cutting questions**, including at least one that asks for things you
|
|
86
|
+
did *not* find: "search for every other site with this pattern and report any
|
|
87
|
+
beyond the ones named here."
|
|
88
|
+
- **An explicit output contract** — a verdict vocabulary (CONFIRMED /
|
|
89
|
+
PARTIALLY CONFIRMED / REFUTED / CANNOT VERIFY), where to write findings, and
|
|
90
|
+
a request to also summarize in-conversation.
|
|
91
|
+
|
|
92
|
+
### 2. Create a detached worktree
|
|
93
|
+
|
|
94
|
+
The reviewer needs the source, isolated from your working tree. Spawned agents
|
|
95
|
+
must never get the primary worktree as their cwd.
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
git worktree add --detach /home/eltmon/Projects/hoff-<slug> main
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
`--detach` is required: a plain `git worktree add <path> main` fails with
|
|
102
|
+
`fatal: 'main' is already used by worktree at ...` whenever main is checked out
|
|
103
|
+
somewhere, which on a dev machine is always. Detached HEAD is correct here —
|
|
104
|
+
the reviewer never commits.
|
|
105
|
+
|
|
106
|
+
Then write the brief into that worktree.
|
|
107
|
+
|
|
108
|
+
### 3. Launch the handoff
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
pan handoff --model <reviewer-model> --cwd /home/eltmon/Projects/hoff-<slug> self \
|
|
112
|
+
"Read REVIEW-BRIEF.md in your cwd FIRST and follow it exactly. You are an INDEPENDENT ADVERSARIAL reviewer — verify or refute each claim against real source and critique each proposed fix. Read-only. Write findings to FEEDBACK-<model>.md."
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
`self` must come before the focus text. Omitting it makes the CLI read your
|
|
116
|
+
focus as a conversation name and fail with `Conversation not found`.
|
|
117
|
+
|
|
118
|
+
**The command can exceed a two-minute tool timeout while the handoff document is
|
|
119
|
+
authored — that is normal and does not mean it failed.** Either run it with
|
|
120
|
+
`run_in_background: true`, or let it time out and verify the spawn afterwards:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
tmux -L overdeck list-sessions | grep conv-
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 4. Correct the frame — the step everyone skips
|
|
127
|
+
|
|
128
|
+
`pan handoff` seeds the new conversation with an **authored handoff document
|
|
129
|
+
describing your session's state and open work**. It does not deliver your focus
|
|
130
|
+
as an instruction. The reviewer therefore wakes up believing it is *you,
|
|
131
|
+
continuing your work* — and if your open-work list said "launch a peer review",
|
|
132
|
+
it will try to launch one, recursively.
|
|
133
|
+
|
|
134
|
+
Check what it actually received before assuming it is reviewing:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
tmux -L overdeck capture-pane -t <conv-id> -p -S -30
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
If it is acting as a continuation rather than as a reviewer, correct it with
|
|
141
|
+
`pan tell` (never raw tmux keystroke injection):
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
pan tell <conv-id> "STOP. You are NOT continuing that conversation's work. You ARE the independent reviewer it wanted to spawn. Read <brief path> and follow it exactly. Read-only. Begin now."
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Budget for this step every time. Treat the handoff document as context the
|
|
148
|
+
reviewer happens to have, and your `pan tell` as the actual task assignment.
|
|
149
|
+
|
|
150
|
+
### 5. Wait on the artifact, not the pane
|
|
151
|
+
|
|
152
|
+
Poll for the findings file rather than watching output scroll:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
until [ -s /home/eltmon/Projects/hoff-<slug>/FEEDBACK-<model>.md ]; do sleep 20; done
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Run that in the background so you can keep working.
|
|
159
|
+
|
|
160
|
+
### 6. Read the findings critically, then report
|
|
161
|
+
|
|
162
|
+
The reviewer is not an oracle. Treat REFUTED verdicts as claims to check, the
|
|
163
|
+
same way you asked it to treat yours — a reviewer that misreads a call site can
|
|
164
|
+
be confidently wrong. Verify anything that would change what you do next.
|
|
165
|
+
|
|
166
|
+
Report back to the operator with: what the reviewer confirmed, what it refuted
|
|
167
|
+
and whether you agree, what it found that you missed, and where you still
|
|
168
|
+
disagree after checking. Never launder its output as consensus.
|
|
169
|
+
|
|
170
|
+
### 7. Clean up
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
git worktree remove /home/eltmon/Projects/hoff-<slug>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Keep the findings file if it is going into an issue or PRD — copy it out before
|
|
177
|
+
removing the worktree.
|
|
178
|
+
|
|
179
|
+
## Failure modes and what they mean
|
|
180
|
+
|
|
181
|
+
| Symptom | Cause | Fix |
|
|
182
|
+
| --- | --- | --- |
|
|
183
|
+
| `fatal: 'main' is already used by worktree at ...` | `git worktree add` without `--detach` | Add `--detach` |
|
|
184
|
+
| `Conversation not found` | Focus text passed without `self` first | `pan handoff ... self "<focus>"` |
|
|
185
|
+
| `Focus is N characters — the limit is 500`, no conversation created | Brief crammed into the focus | Put the brief in a file, point the focus at it |
|
|
186
|
+
| Handoff command times out at 2 minutes | Handoff document authoring is slow | Normal — verify the spawn with `tmux -L overdeck list-sessions` |
|
|
187
|
+
| Reviewer starts doing your open-work list, or tries to spawn its own review | It received the handoff doc, not your focus | `pan tell` it the real task (step 4) |
|
|
188
|
+
| Reviewer agrees with everything | Brief lacked adversarial framing, or reviewer shares the author's model family | Rewrite the framing; pick a different family |
|
|
189
|
+
| `state.json has no issueId` on `pan tell` | Informational — conversations have no issue | Ignore; the message still delivers |
|
|
190
|
+
|
|
191
|
+
## Related
|
|
192
|
+
|
|
193
|
+
- `/pan-handoff` — the underlying command and its full semantics
|
|
194
|
+
- `/pan-code-review` — reviewing a *diff*; this skill reviews an *analysis*
|
|
195
|
+
- `/pan-tell` — the sanctioned way to message a running conversation
|
|
@@ -88,6 +88,63 @@ First-time setup for a brand-new package (npm org creation, the one-time
|
|
|
88
88
|
bootstrap publish, configuring the Trusted Publisher) and full publish
|
|
89
89
|
troubleshooting live in `docs/RELEASING.md`.
|
|
90
90
|
|
|
91
|
+
## Releasing as an agent (guards you will hit)
|
|
92
|
+
|
|
93
|
+
An agent cutting a release trips guards a human operator never sees. All three
|
|
94
|
+
have sanctioned levers — **never reach for `--no-verify`**, which is a one-way
|
|
95
|
+
door.
|
|
96
|
+
|
|
97
|
+
**1. The commit path guard.** `scripts/guard-flywheel-orchestrator-commit.sh`
|
|
98
|
+
(via `.husky/pre-commit`) refuses a `flywheel-orchestrator` commit that touches
|
|
99
|
+
anything outside `docs/FLYWHEEL-STATE.md` and the state paths — and a release
|
|
100
|
+
commit necessarily touches three `package.json` files. The guard's own
|
|
101
|
+
operator-directed escape hatch is:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
OVERDECK_OPERATOR_COMMIT=1 pan release stable --version X.Y.Z
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
It mirrors `OVERDECK_OPERATOR_PUSH=1` for the push guard. Use it only when the
|
|
108
|
+
operator has actually directed the release.
|
|
109
|
+
|
|
110
|
+
**2. The push guard.** `scripts/guard-agent-main-push.sh` exempts `conv-`
|
|
111
|
+
prefixed agent ids but not pipeline roles, so pushing `main` and the tag needs:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
OVERDECK_OPERATOR_PUSH=1 git push origin main
|
|
115
|
+
OVERDECK_OPERATOR_PUSH=1 git push origin vX.Y.Z
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**3. Preflight tests failing for the wrong reason (PAN-3081 / PAN-3189).** The
|
|
119
|
+
per-agent `~/.overdeck/agents/<id>/git-guard` shim used to intercept
|
|
120
|
+
`git reset --hard` and `git rebase` *inside test fixtures that legitimately run
|
|
121
|
+
them against their own temp repos*, so preflight reported failures that did not
|
|
122
|
+
exist — **10 failures with the shim on `PATH`, 0 without.**
|
|
123
|
+
|
|
124
|
+
PAN-3189 fixed both halves at the source: the guard now fires only for git
|
|
125
|
+
commands targeting the agent's own worktree, and each launcher strips any
|
|
126
|
+
inherited guard directory from `PATH` before installing its own. A session
|
|
127
|
+
spawned since that landed needs no workaround.
|
|
128
|
+
|
|
129
|
+
A session started *before* it — or any shell that inherited an old shim — can
|
|
130
|
+
still see the artifact. Check first, and only reach for the workaround if the
|
|
131
|
+
shim is actually there:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
echo $PATH | tr ':' '\n' | grep git-guard # expect: your own agent's dir, or nothing
|
|
135
|
+
CLEAN=$(echo $PATH | tr ':' '\n' | grep -v git-guard | paste -sd:)
|
|
136
|
+
PATH="$CLEAN" npm test # must be genuinely green
|
|
137
|
+
pan release stable --version X.Y.Z --skip-tests
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
`--skip-tests` is legitimate **only** when you have run the suite clean and seen
|
|
141
|
+
it pass. It skips a corrupted measurement, not the verification itself.
|
|
142
|
+
|
|
143
|
+
**Ordering note.** If `git push origin main` is rejected because the remote moved
|
|
144
|
+
ahead, merge rather than rebase (`git rebase` is blocked by the agent git guard)
|
|
145
|
+
and push again. Push the tag even if `main` is momentarily behind — the tag is
|
|
146
|
+
its own ref and triggers the publish workflow independently.
|
|
147
|
+
|
|
91
148
|
## Notes
|
|
92
149
|
|
|
93
150
|
- Stable is for “ship this to normal users now.”
|
|
@@ -11,17 +11,17 @@ Use this after code changes that should run in the local Overdeck dashboard.
|
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
13
|
pan reload
|
|
14
|
-
pan reload --force #
|
|
14
|
+
pan reload --force # explicit operator bypass of the deploy-window gate
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
`pan reload` runs `bun install`
|
|
17
|
+
`pan reload` fetches `origin/main`, creates a temporary detached worktree at that commit, and runs `bun install` followed by `npm run build` there — never in the primary working tree. If the primary tree has uncommitted changes or its `HEAD` differs from `origin/main`, the command notes that those changes are excluded and continues with the canonical build. If installation or build fails, it leaves the current dashboard running and exits non-zero; after a successful build, it keeps the detached worktree as the active deployment root and launches its `dist/dashboard/server.js` with its canonical runtime dependencies and workspace packages intact, leaves the primary checkout's `node_modules/` untouched, refreshes the primary `dist/` CLI mirror with a dependency link back to that deployment root, then restarts the dashboard and waits for `http://127.0.0.1:3011/api/health`. Deployments alternate between two fixed generation worktrees. A failure before the new process is left running restores the prior marker and primary `dist/` and removes the failed generation. A health timeout keeps the new deployment active because the dashboard is deliberately left running so a slow boot can finish or a failed boot can be inspected. Retries still reuse one of the two fixed slots, so failures cannot accumulate unbounded dependency trees.
|
|
18
18
|
|
|
19
19
|
`npm run build` already rebuilds the dashboard **server** bundle (via `build-post-cli.mjs` → `build:dashboard:server:bundle`), so `pan reload` picks up server/deacon code changes — you do **not** need a separate `npm run build:dashboard:server`. The `bun install` step runs first so a merge/rebase that added a runtime dependency (e.g. `chokidar`) can't produce a freshly-built server that boot-crashes with `ERR_MODULE_NOT_FOUND`.
|
|
20
20
|
|
|
21
21
|
## Options
|
|
22
22
|
|
|
23
23
|
- `--skip-build` — restart the current bundle without running `bun install` or `npm run build`.
|
|
24
|
-
- `--force` — bypass the deploy-window gate
|
|
24
|
+
- `--force` — explicitly bypass the deploy-window gate. Without it, a refused agent-issued reload queues the deploy, reports its age and distinct verification blockers, and self-fires at the next safe verification boundary. Do not retry-loop or use `--force` to interrupt healthy verification; reserve the bypass for exceptional operator recovery.
|
|
25
25
|
- `--health-timeout <ms>` — set the dashboard health-check budget. The default is `30000`.
|
|
26
26
|
- `--no-deacon` — restart without Cloister/Deacon auto-start.
|
|
27
27
|
|
|
@@ -34,7 +34,7 @@ pan restart --traefik
|
|
|
34
34
|
pan restart --full # nuclear — stops & restarts everything
|
|
35
35
|
|
|
36
36
|
# Explicit force cases
|
|
37
|
-
pan restart --force # bypass the
|
|
37
|
+
pan restart --force # explicit operator bypass of the deploy-window gate
|
|
38
38
|
pan restart --cliproxy --force # redownload the pinned CLIProxy binary
|
|
39
39
|
```
|
|
40
40
|
|
|
@@ -61,9 +61,10 @@ server is a failure, not a successful restart.
|
|
|
61
61
|
- `pan restart --dashboard` NEVER touches CLIProxy, Traefik, or TLDR — that
|
|
62
62
|
scope contract is enforced by tests.
|
|
63
63
|
- Agent-issued dashboard and full restarts consult the deploy-window gate before
|
|
64
|
-
acquiring the restart lock.
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
acquiring the restart lock. A refusal queues the deploy, reports its age and
|
|
65
|
+
distinct verification blockers, and self-fires at the next safe verification
|
|
66
|
+
boundary. Do not retry in a loop or use `--force` to interrupt healthy verification;
|
|
67
|
+
`--force` remains the explicit operator bypass for exceptional recovery.
|
|
67
68
|
- For `--cliproxy`, `--force` has a separate meaning: it redownloads the binary at
|
|
68
69
|
the pinned version before restarting it.
|
|
69
70
|
- If the dashboard restart fails, shared sidecars are left running so recovery
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pan-review
|
|
3
|
-
description: "pan review <subcommand> — manage the code review lifecycle: list pending work,
|
|
3
|
+
description: "pan review <subcommand> — manage the code review lifecycle: list pending work, re-request review, heal status drift, reset/abort/restart review cycles"
|
|
4
4
|
triggers:
|
|
5
5
|
- pan review
|
|
6
6
|
- review pending
|
|
7
7
|
- request review
|
|
8
8
|
- review mode
|
|
9
9
|
- reset review
|
|
10
|
+
- resync review
|
|
10
11
|
- restart review
|
|
11
12
|
- abort review
|
|
12
13
|
- code review lifecycle
|
|
@@ -30,6 +31,7 @@ pan review pending --blocked # List blocked review/test/me
|
|
|
30
31
|
pan review request <id> # Re-request review after fixing feedback
|
|
31
32
|
pan review mode <id> <quick|full> # Set this issue's review mode override
|
|
32
33
|
pan review reset <id> [--session] # Reset review/test/merge cycles (human override)
|
|
34
|
+
pan review resync <id> # Re-emit canonical status to heal dashboard drift
|
|
33
35
|
pan review abort <id> # Kill all running reviewers, leave worker idle
|
|
34
36
|
pan review restart <id> [--model <m>] [--role <r>] # Kill reviewers and dispatch a fresh review pipeline
|
|
35
37
|
```
|
|
@@ -54,6 +56,9 @@ pan review restart <id> [--model <m>] [--role <r>] # Kill reviewers and dispatch
|
|
|
54
56
|
pipeline can be re-dispatched from scratch. Use when the saved state is
|
|
55
57
|
inconsistent or corrupt. `--session` additionally clears the saved Claude
|
|
56
58
|
session for each reviewer so they restart with a clean conversation.
|
|
59
|
+
- **`resync <id>`** — Reads the canonical review status and re-emits it without
|
|
60
|
+
changing any verdict. Use when an issue passed review but is missing from
|
|
61
|
+
Awaiting Merge or its actions are wrongly gated by stale dashboard state.
|
|
57
62
|
- **`abort <id>`** — Kills any currently running reviewer sessions but
|
|
58
63
|
leaves the work agent alone. Use when reviewers are stuck or running
|
|
59
64
|
against the wrong commit and you want to halt without resetting state.
|
|
@@ -77,6 +82,7 @@ pan review restart <id> [--model <m>] [--role <r>] # Kill reviewers and dispatch
|
|
|
77
82
|
| This issue needs the full review convoy | `pan review mode <id> full` |
|
|
78
83
|
| Return an issue to default quick review | `pan review mode <id> quick` |
|
|
79
84
|
| Pipeline state is inconsistent, need a clean slate | `pan review reset <id>` |
|
|
85
|
+
| Issue passed but is missing from Awaiting Merge or actions are wrongly gated | `pan review resync <id>` |
|
|
80
86
|
| Same as above plus reviewer Claude sessions are bad | `pan review reset <id> --session` |
|
|
81
87
|
| Reviewer is hung, just kill it | `pan review abort <id>` |
|
|
82
88
|
| Reviewer crashed, want a fresh convoy with a different model | `pan review restart <id> --model gpt-5.4` |
|