@overdeck/desktop 0.47.0 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drizzle/overdeck/0000_overdeck_init.sql +59 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-10Ur5Dne.js → acceptance-criteria-DmtLDbtt.js} +2 -2
- package/server/{activity-logger-CyteR4JO.js → activity-logger-Co5qljIj.js} +55 -4
- package/server/activity-logger-K7FYGF_z.js +3 -0
- package/server/{advancing-selfheal-BNwqxseD.js → advancing-selfheal-8AR68Asf.js} +6 -6
- package/server/{agent-gc-C3h9Or3a.js → agent-gc-BmYeT6eH.js} +5 -5
- package/server/agent-state-Dq3s84-P.js +3 -0
- package/server/{agent-state-service-C63p_ftq.js → agent-state-service-DK1Vay1E.js} +1 -1
- package/server/{agent-state-service-Ds6OeFvo.js → agent-state-service-rjnzpHDx.js} +6 -6
- package/server/agent-state-source-Ds968-j6.js +21 -0
- package/server/{agents-J5mEnekq.js → agents-Dls7tfJH.js} +5 -5
- package/server/agents-IPSa5kzn.js +3 -0
- package/server/{archive-planning-BwhxeP7C.js → archive-planning-Cq7cyinS.js} +51 -24
- package/server/archive-planning-MbkGCBIY.js +2 -0
- package/server/{artifact-index-jobs-D1q_vR3V.js → artifact-index-jobs-Dj_8kpTd.js} +3 -3
- package/server/{assemble-Bgwqv-Ro.js → assemble-BTCmbcfH.js} +20 -13
- package/server/{auto-spawn-consent-CQ9Bi9q6.js → auto-spawn-consent-lXqRJ1Dr.js} +304 -121
- package/server/{backlog-auto-trigger-n1lzPgN4.js → backlog-auto-trigger-Dn-amzt6.js} +3 -3
- package/server/{behavior-td6-xhQk.js → behavior-DIMQMRzs.js} +2 -2
- package/server/{boot-reconciled-stop-events-C7gGe3oB.js → boot-reconciled-stop-events-D6SeUTIr.js} +1 -1
- package/server/{bridge-pool-patrol-CYH2OLb5.js → bridge-pool-patrol-BEjt-xF3.js} +2 -2
- package/server/{briefing-freshness-DRqZ8lAz.js → briefing-freshness-3PNmL_p3.js} +2 -2
- package/server/{build-info-7yiEpl6u.js → build-info-CJg813Hm.js} +3 -3
- package/server/{build-info-CpG__c63.js → build-info-CXyeFsXu.js} +1 -1
- package/server/{checkpoint-manager-CkKmB0wZ.js → checkpoint-manager-9t7G5c1V.js} +1 -1
- package/server/{checkpoint-manager-DBcyNR8w.js → checkpoint-manager-B2G38R3p.js} +3 -3
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-Wm963lm8.js → checkpoints-CuBgiXO-.js} +1 -1
- package/server/{checkpoints-D95apurL.js → checkpoints-VTZMd4Qm.js} +2 -2
- package/server/{claude-hooks-provision-Bjitl9aI.js → claude-hooks-provision-55SyQaPz.js} +2 -2
- package/server/{claude-hooks-provision-4RPxNkE8.js → claude-hooks-provision-CEUT-CZd.js} +1 -1
- package/server/{claude-permissions-CpbpvUQ2.js → claude-permissions-Cn0dIu2i.js} +2 -2
- package/server/{claude-settings-overlay-BzkHYDwR.js → claude-settings-overlay-B19hdzSA.js} +1 -1
- package/server/{claude-settings-overlay-_H9Yrzab.js → claude-settings-overlay-Yg_ANh81.js} +2 -2
- package/server/{cli-Cte9ZFGn.js → cli-C9S84iTy.js} +79 -22
- package/server/cli-M1cwZ__d.js +3 -0
- package/server/{cliproxy-C5fMJ7rY.js → cliproxy-CJq3KXU6.js} +2 -2
- package/server/{cliproxy-DaAbWMjC.js → cliproxy-DgEZlr7Y.js} +1 -1
- package/server/{close-issue-BPh1ARCF.js → close-issue-DPxRddGR.js} +5 -5
- package/server/{closed-issue-reaper-DoOZqGFK.js → closed-issue-reaper-C5Zn4GRS.js} +13 -13
- package/server/{closed-issue-reaper-DHRfRMrp.js → closed-issue-reaper-D-2B48Ri.js} +1 -1
- package/server/{codex-o8FJwzmy.js → codex-B3n_rkwn.js} +1 -1
- package/server/{codex-BzGDW_d3.js → codex-CjkD1PJu.js} +6 -6
- package/server/{codex-parser-Dt-ycU8L.js → codex-parser-DpB1Il-P.js} +2 -2
- package/server/{compaction-continuation-CvXpbZ4w.js → compaction-continuation-DZD9ukSE.js} +3 -3
- package/server/{config-CL3Gyvja.js → config-C5saf4Ja.js} +1 -1
- package/server/{config-BvLe652W.js → config-DnLJATZk.js} +2 -2
- package/server/{config-Bi3u1VK7.js → config-DvM8jtQK.js} +2 -2
- package/server/{config-yaml-CxdwhAIA.js → config-yaml-BSCqwmX0.js} +11299 -10972
- package/server/{conflict-gate-CX80JYYS.js → conflict-gate-DXa_L28t.js} +1 -1
- package/server/{conflict-gate-E4nt7ZeS.js → conflict-gate-WfVqgalf.js} +4 -4
- package/server/{context-layers-DAG83UZt.js → context-layers-D7UqH9Ab.js} +2 -2
- package/server/{context-layers-C_IIysnm.js → context-layers-Dpz3Vd6d.js} +3 -3
- package/server/{control-settings-CiqGxXnc.js → control-settings-DVf6pKyv.js} +4 -4
- package/server/{conversation-compaction-BE3CNtHF.js → conversation-compaction-5XuH6OBn.js} +1 -1
- package/server/{conversation-compaction-D6-yLtqt.js → conversation-compaction-COrbnX1J.js} +8 -8
- package/server/{conversation-service-DBxoYMDl.js → conversation-service-BufdtnZF.js} +169 -10
- package/server/{conversation-service-D_TS2b1r.js → conversation-service-DnUyIiLb.js} +1 -1
- package/server/{conversations-D0UEdLtk.js → conversations-B4rxz-Wl.js} +17 -10
- package/server/{conversations-BKDVpB-3.js → conversations-D1bwxQMy.js} +1 -1
- package/server/{cost-DpgYmYqR.js → cost-CpFDrJUS.js} +46 -2
- package/server/{cost-DS1s0DbG.js → cost-KLuwKCW9.js} +3 -3
- package/server/{cost-sync-tOCCGnEt.js → cost-sync-cesi9dp8.js} +3 -3
- package/server/{dag-BtkgLeqY.js → dag-BYiFMqpU.js} +2 -2
- package/server/{dangerous-git-ops-CFLykHWt.js → dangerous-git-ops-BKvd3-Hk.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-BIblC-WX.js → deacon-BbsWw8a6.js} +3 -3
- package/server/{deacon-pLRLbPvR.js → deacon-HdEh0Esp.js} +863 -214
- package/server/deacon-event-client-C93rvOT7.js +237 -0
- package/server/deacon-event-client-Ck5Ei7Mn.js +3 -0
- package/server/{deacon-nudge-log-B08gF0mh.js → deacon-nudge-log-BND_97Wo.js} +4 -3
- package/server/{deacon-pending-lifecycle-B-Io84AP.js → deacon-pending-lifecycle-CD3YsiQK.js} +3 -3
- package/server/deacon-swarm-DgWADWd_.js +2 -0
- package/server/{deacon-swarm-v5PMun-m.js → deacon-swarm-rqrl4TMs.js} +39 -18
- package/server/deacon.js +12 -210
- package/server/{dead-end-trip-D8A3msX9.js → dead-end-trip-DSF23CLX.js} +4 -3
- package/server/dead-end-trip-zKlS4v6f.js +2 -0
- package/server/delivery-CsbQdZkS.js +3 -0
- package/server/{deploy-patrol-sYgOxLeb.js → deploy-patrol-kARAkji4.js} +17 -21
- package/server/{deploy-queue-VfohaPN_.js → deploy-queue-Bj0HJT1i.js} +2 -2
- package/server/{deploy-queue-gHJBycaF.js → deploy-queue-rjTUy1RM.js} +1 -1
- package/server/{deploy-window-D4DQb8VP.js → deploy-window-B2IM-9G5.js} +10 -44
- package/server/{deploy-window-CFRZ0-kt.js → deploy-window-BNFWnA8D.js} +1 -1
- package/server/{dev-supervisor-DiOBDM1c.js → dev-supervisor-B1mZYXz4.js} +2 -2
- package/server/{devcontainer-renderer-BUOIlfgD.js → devcontainer-renderer-B-o68Z5B.js} +3 -3
- package/server/{dist-C3A8B8wM.js → dist-3W--cGMa.js} +1 -1
- package/server/dist-BR0QtwmS.js +3 -0
- package/server/{dist-src-C0adpegX.js → dist-src-C-Vk2jNk.js} +1 -1
- package/server/{docker-Y3PElJb0.js → docker-DH3jUYg1.js} +1 -1
- package/server/{docker-BJzlkqYB.js → docker-meuLKLzV.js} +27 -20
- package/server/{dod-DlNtcH6n.js → dod-D7-9dCOD.js} +1 -1
- package/server/{driver-CKVGi51s.js → driver-CmsY2RLl.js} +1 -1
- package/server/{durable-review-pipeline-DP6bIcOY.js → durable-review-pipeline-CStTgOAf.js} +1 -1
- package/server/{durable-review-pipeline-Cibps-Rg.js → durable-review-pipeline-Chq0lzjL.js} +1 -1
- package/server/{ensure-devcontainer-DMAbWqtQ.js → ensure-devcontainer-BE3llBWP.js} +1 -1
- package/server/{ensure-devcontainer-BAofzBPv.js → ensure-devcontainer-BXrY7C2Z.js} +4 -4
- package/server/{esm-shims-BeObUkaw.js → esm-shims-Bzy4ZzNU.js} +1 -1
- package/server/event-store-COd2tOx8.js +3 -0
- package/server/{event-store-CrHcVC5_.js → event-store-D_AR-Y78.js} +184 -11
- package/server/{events-CF8QDbuV.js → events-CCkFWa7X.js} +1 -1
- package/server/{events-BNrvchBg.js → events-zjDQozet.js} +3 -3
- package/server/{factory-Cmm9Hsho.js → factory-DhavwKVc.js} +5 -5
- package/server/{feature-registry-population-B6HpNWRy.js → feature-registry-population-DWGBKyWd.js} +4 -4
- package/server/{feature-registry-storage-DJEFx1Pf.js → feature-registry-storage-C5DkXmCM.js} +3 -3
- package/server/{features-D5km80UI.js → features-CC47YcCX.js} +2 -2
- package/server/{feedback-target-BJ5ZADsu.js → feedback-target-D9Tex35_.js} +1 -1
- package/server/{feedback-target-DSxEL6lP.js → feedback-target-DoRCR3L-.js} +18 -7
- package/server/{feedback-writer-CoB9Z6aU.js → feedback-writer-CTSuA6lw.js} +1 -1
- package/server/{feedback-writer-C27Hak8a.js → feedback-writer-DdsBdtNL.js} +5 -5
- package/server/{flywheel-DZZdtiOL.js → flywheel-DHWHzaYK.js} +1 -1
- package/server/{flywheel-f662Q-y2.js → flywheel-DJQa9az8.js} +14 -14
- package/server/{flywheel-BHx8XuMr.js → flywheel-TacAI9MA.js} +21 -17
- package/server/{flywheel-merge-order-Dil0LmdN.js → flywheel-merge-order-D2foPh88.js} +1 -1
- package/server/{flywheel-merge-order-D_xLMbJU.js → flywheel-merge-order-DRtex2Dt.js} +7 -7
- package/server/forge-CdlCG9aS.js +3 -0
- package/server/{forge-BaKGCya6.js → forge-c8LeC-tw.js} +2 -2
- package/server/{from-B3tZbB55.js → from-BogSwvr2.js} +1 -1
- package/server/{fs-lock-Bre3sGoz.js → fs-lock-D_GeJtXl.js} +3 -3
- package/server/{fts-operations-B9jG8wa3.js → fts-operations-DP9R-8Q3.js} +3 -3
- package/server/{git-utils-Xg4PFN45.js → git-utils-C31x1lpE.js} +1 -1
- package/server/{git-utils-CsvYfJU3.js → git-utils-xQ74FoSn.js} +5 -4
- package/server/{github-app-Bmg4R9mv.js → github-app-CpQSDlv8.js} +1 -1
- package/server/{github-app-CmNk0zLU.js → github-app-D2QuvZ3j.js} +3 -3
- package/server/{github-client-qazkPrg0.js → github-client-D9YvJX5D.js} +3 -3
- package/server/{github-client-B6KM9_wA.js → github-client-Tpi3PmKX.js} +1 -1
- package/server/{github-pr-lookup-DAcVeRLK.js → github-pr-lookup-DvBMv-IW.js} +2 -2
- package/server/{harness-binary-BSpiXaLw.js → harness-binary-BHxWf_sX.js} +7 -6
- package/server/{harness-resolve-BAJu5MX8.js → harness-resolve-bj9WMABA.js} +4 -4
- package/server/{health-events-BwX32k8d.js → health-events-bCDPn59Z.js} +2 -2
- package/server/{health-events-2Z6Wa9SM.js → health-events-qo7Ss34U.js} +1 -1
- package/server/{hooks-DbtbimEf.js → hooks-Dyxtg5fk.js} +2 -2
- package/server/{hooks-D1g1jKLI.js → hooks-X2XHBB2b.js} +1 -1
- package/server/{hume-DXNiu6nQ.js → hume-DrZEGpqc.js} +2 -2
- package/server/hume-YPsy4UA8.js +3 -0
- package/server/{idle-stack-reaper-Cy-dQzW4.js → idle-stack-reaper-CJ1ygW0p.js} +37 -7
- package/server/{idle-stack-reaper-CRA1e0jr.js → idle-stack-reaper-uJGOb-vu.js} +1 -1
- package/server/{in-flight-guard-D-sSkADM.js → in-flight-guard-CG2Eo-rr.js} +1 -1
- package/server/{infra-BDQDRopn.js → infra-CTrmVqc_.js} +111 -6
- package/server/{injection-Bl8d_jHZ.js → injection-BisQ0lpX.js} +1 -1
- package/server/{injection-6AGnXxlj.js → injection-C9sxqbc2.js} +73 -193
- package/server/{inspect-agent-nXdIptyh.js → inspect-agent-BoSO51YC.js} +12 -12
- package/server/inspect-agent-BykeOH4a.js +2 -0
- package/server/{internal-token-DzK385vD.js → internal-token-AvXePaQT.js} +2 -2
- package/server/{internal-token-Ias7N8Kg.js → internal-token-Djkj-yqK.js} +1 -1
- package/server/{io-B00PBNku.js → io-mxOWMZ7I.js} +6 -6
- package/server/{issue-closed-BehTG1be.js → issue-closed-Bj_bCv_0.js} +7 -7
- package/server/{issue-lifecycle-BqSuQvbn.js → issue-lifecycle-A5YIpDZE.js} +1 -1
- package/server/{issue-lifecycle-Birk-ifu.js → issue-lifecycle-BXUqaHzF.js} +32 -28
- package/server/{issue-service-singleton-C6ZduvuY.js → issue-service-singleton-BPNEXczv.js} +11 -11
- package/server/{issue-service-singleton-B2wXiIlw.js → issue-service-singleton-CcaHjKPR.js} +1 -1
- package/server/{issues-DQ5-LatB.js → issues-AX-YBeAQ.js} +2 -2
- package/server/{jsonl-parser-BDpnGFCl.js → jsonl-parser-CgYWQ20q.js} +7 -3
- package/server/kimi-code-BYbme0aV.js +579 -0
- package/server/kimi-code-D_Ppt82c.js +3 -0
- package/server/kimi-parser-B-JBg3Pv.js +147 -0
- package/server/{label-cleanup-Dwnky8FG.js → label-cleanup-sXUlgdM0.js} +3 -3
- package/server/{lifecycle-B4Xdb4cY.js → lifecycle-D2X3al0D.js} +2 -2
- package/server/{lifecycle-B3s4sM1G.js → lifecycle-DjlljAZ1.js} +6 -6
- package/server/{lifecycle-io-CzTHEooc.js → lifecycle-io-C5nVk55o.js} +1 -1
- package/server/{lifecycle-io-DCo6s6ks.js → lifecycle-io-NPm1YtIG.js} +5 -5
- package/server/{linear-client-CnbtHiic.js → linear-client--luYwCZg.js} +1 -1
- package/server/{linear-client-9uq7fhiV.js → linear-client-B8pLegW1.js} +3 -3
- package/server/{linear-mcp-auth-BxUOzswy.js → linear-mcp-auth-BQVWV0I3.js} +6 -6
- package/server/{linear-mcp-auth-D46fBCLf.js → linear-mcp-auth-Dx81Zl4G.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-DiW9RdSB.js → merge-Bx5Bh9pi.js} +3 -3
- package/server/{merge-sr8Nrnmi.js → merge-Dqmh_zja.js} +1 -1
- package/server/{merge-agent-BLUgRsz3.js → merge-agent-DP9AUY29.js} +33 -33
- package/server/{merge-agent-DQTXZk8z.js → merge-agent-DWd0KfiS.js} +1 -1
- package/server/{merge-batch-Cp_j9BGk.js → merge-batch-BdmvTEAC.js} +1 -1
- package/server/{merge-completeness-BLbB5-6n.js → merge-completeness-BfRwFjRx.js} +1 -1
- package/server/{merge-completeness-B46KqhtY.js → merge-completeness-C1FevcDT.js} +4 -4
- package/server/merge-ops-B98tKc1e.js +2 -0
- package/server/merge-rebase-BLykMwPO.js +2 -0
- package/server/{merge-rebase-DIkBjgwq.js → merge-rebase-BX1xKsrE.js} +2 -2
- package/server/{merge-set-CBgHfwM0.js → merge-set-DsLjjLEV.js} +4 -4
- package/server/{merge-set-DeUxFsC3.js → merge-set-H6epHOsw.js} +1 -1
- package/server/{merge-sync-kr4vqyjM.js → merge-sync-BEdfsQV4.js} +2 -2
- package/server/{merge-sync-CpGmk6Ch.js → merge-sync-BebcWWGA.js} +1 -1
- package/server/{merge-train-Dmrcus12.js → merge-train-D1I0lNOT.js} +4 -4
- package/server/{merge-train-deps-D_uGX91G.js → merge-train-deps-D_-C0Pk2.js} +4 -4
- package/server/{merge-verification-NvaAd8CZ.js → merge-verification-DN1Ov9bU.js} +6 -6
- package/server/{merged-docker-cleanup-worker-Y1R06TEl.js → merged-docker-cleanup-worker-CfXSr2pA.js} +4 -4
- package/server/{merged-docker-cleanup-worker-DH_hrGPI.js → merged-docker-cleanup-worker-ybsPyHjB.js} +1 -1
- package/server/{multipart-parser-R-oC8dQg.js → multipart-parser-CL5QG8iv.js} +2 -2
- package/server/{no-resume-mode-BgD0JUmM.js → no-resume-mode-DUR7Hi98.js} +1 -1
- package/server/node_modules/.package-lock.json +7 -7
- package/server/node_modules/brace-expansion/README.md +23 -1
- package/server/node_modules/brace-expansion/index.js +206 -85
- package/server/node_modules/brace-expansion/package.json +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs +34 -28
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.js +34 -28
- package/server/node_modules/msgpackr/dist/index.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/node.cjs +36 -29
- package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/test.js +63 -32
- package/server/node_modules/msgpackr/dist/test.js.map +1 -1
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +34 -28
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/package.json +1 -1
- package/server/node_modules/msgpackr/unpack.js +34 -28
- package/server/{orphan-proposed-reconciler-DcgTPPFY.js → orphan-proposed-reconciler-CEW1maPl.js} +1 -1
- package/server/{orphan-proposed-reconciler-B6vJHxtX.js → orphan-proposed-reconciler-DfqHZftT.js} +23 -22
- package/server/package-lock.json +8 -8
- package/server/package.json +1 -1
- package/server/{pan-dir-DMzF5wne.js → pan-dir-DhgKfO86.js} +21 -6
- package/server/{paths-sJBSb7Ul.js → paths-BUuhi6jM.js} +17 -17
- package/server/{pending-lifecycle-claim-DilzGfgk.js → pending-lifecycle-claim-DJlA1rTR.js} +2 -2
- package/server/{persistent-logger-H_VjuOu7.js → persistent-logger-s8cbpFNV.js} +2 -2
- package/server/{pickup-DWhqzliO.js → pickup-2AxtB3dW.js} +1 -1
- package/server/{pipeline-membership-C88VBnhJ.js → pipeline-membership-2_okL5bm.js} +1 -1
- package/server/{pipeline-membership-D9SBvItj.js → pipeline-membership-Dqv6_0ig.js} +1 -1
- package/server/{pipeline-membership-gather-4eR-7Tqy.js → pipeline-membership-gather-4F1-tXKI.js} +1 -1
- package/server/{pipeline-membership-gather-CeVGnNJ2.js → pipeline-membership-gather-CtJ_7aGf.js} +149 -17
- package/server/{pipeline-notifier-DT6xLFao.js → pipeline-notifier-CO9rxJgB.js} +1 -1
- package/server/{pipeline-notifier-D0ALV6Nw.js → pipeline-notifier-DDfVBJhJ.js} +2 -2
- package/server/{post-merge-lifecycle-worker-8HIeS_J6.js → post-merge-lifecycle-worker-DmSOkeNp.js} +3 -3
- package/server/{project-pipelines-9SKt2bEc.js → project-pipelines-72WE8GVK.js} +2 -2
- package/server/{project-repos-B5pIphKg.js → project-repos-BAqDwtvi.js} +16 -11
- package/server/project-repos-Df90Zw7Y.js +3 -0
- package/server/projects-WqMWCdpa.js +3 -0
- package/server/{prompts-CgzMBvQF.js → prompts-XkL10m8M.js} +2 -2
- package/server/{providers-BJQSnAAp.js → providers-ClGPGkQ8.js} +15 -12
- package/server/providers-DFUOed8u.js +3 -0
- package/server/public/assets/{chunk-BO2N2NFS-D_pGACYN.js → chunk-BO2N2NFS-CeQUdPxr.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-BO6fe3hH.js → diagram-OG6HWLK6-B7rgk4yT.js} +1 -1
- package/server/public/assets/{dist-5zingMiA.js → dist-2RPazfXY.js} +3 -3
- package/server/public/assets/{dist-CVxhbI2E.js → dist-B9NInrVZ.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-Bgj4A7kp.js → ganttDiagram-6RSMTGT7-Bxp0gV14.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-DNPK7_cm.js → highlighted-body-OFNGDK62-CzoRTVlC.js} +1 -1
- package/server/public/assets/index-Cml-kHo6.css +1 -0
- package/server/public/assets/{index-DEpY-D1O.js → index-CvN8cEgs.js} +216 -215
- package/server/public/assets/{linear-BB0jQT16.js → linear-CFEEl3ND.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-CpV7nCBM.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-DeGIzzpZ.js → pieDiagram-4H26LBE5-BeR8R0cr.js} +1 -1
- package/server/public/assets/{prod-XBLvikex.js → prod-CYjzjCrn.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-BV9SLeWz.js → quadrantDiagram-W4KKPZXB-BpcTkFuW.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-Dwja0gj8.js → sankeyDiagram-5OEKKPKP-Bx2ETEV5.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-DCB4qvfw.js → xychartDiagram-2RQKCTM6-BKgEAFaj.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-7BgLDsIo.js → pull-requests-B-KrUph5.js} +3 -3
- package/server/{pull-requests-Dq0y6IxE.js → pull-requests-DK5k92B4.js} +1 -1
- package/server/{queries-C-MUZaIy.js → queries-DVpl1vsU.js} +1212 -193
- package/server/{rally-CPysR4T_.js → rally-DbE561hD.js} +3 -3
- package/server/rally-O_st_X7n.js +3 -0
- package/server/{rally-api-8Ptlp2os.js → rally-api-CZLeEd2C.js} +2 -2
- package/server/{rally-api-CgosKdKL.js → rally-api-DaHtn5QN.js} +1 -1
- package/server/{rally-client-CCX0hADj.js → rally-client-C-MAl8ur.js} +1 -1
- package/server/{rally-client-iYMHWQD7.js → rally-client-Ch3zRsBX.js} +5 -5
- package/server/{reap-terminal-sessions-Qf-9LVQc.js → reap-terminal-sessions-C1n0ALRb.js} +2 -2
- package/server/{reap-terminal-sessions-4Xg9NGA8.js → reap-terminal-sessions-DegFS2p1.js} +2 -2
- package/server/{rebuild-stack-CMdgaylx.js → rebuild-stack-C9Li44A3.js} +20 -10
- package/server/{rebuild-stack-DqcOVmJO.js → rebuild-stack-qC0jCNm6.js} +2 -2
- package/server/{reconstruct-cache-CMZJ_Vjq.js → reconstruct-cache-BHyiAg02.js} +7 -7
- package/server/record-aVzu-LGm.js +3 -0
- package/server/record-update-CZh46a2f.js +617 -0
- package/server/{record-update-DhI7eySG.js → record-update-DtdJK2Iw.js} +1 -1
- package/server/recovery-trip-CSNWSLDn.js +77 -0
- package/server/recovery-trip-_16hFKv4.js +3 -0
- package/server/{release-engine-B2X9AfFC.js → release-engine-Be5MX5GP.js} +5 -5
- package/server/{release-set-G4XKyQ8K.js → release-set-DJv_O6PS.js} +3 -3
- package/server/{remote-BXarMvqf.js → remote-BMM3uH2J.js} +3 -3
- package/server/{remote-CUhyqjXk.js → remote-C0xVTHA5.js} +3 -3
- package/server/{remote-agents-CLZB3Coc.js → remote-agents-BIIoc5pD.js} +1 -1
- package/server/{remote-agents-Bba-MgSA.js → remote-agents-EUiZ26bj.js} +7 -7
- package/server/{remote-completion-CwAp79EC.js → remote-completion-BS4tJUn8.js} +13 -13
- package/server/resolver-BvHd6RE4.js +163 -0
- package/server/resume-9thEqAQR.js +3 -0
- package/server/{review-agent--pOptAEV.js → review-agent-BHGaBoBu.js} +29 -29
- package/server/{review-agent-BTCNkq2h.js → review-agent-CD3RQ-tc.js} +1 -1
- package/server/{review-artifacts-BNmw8dWE.js → review-artifacts-DyhajWso.js} +6 -6
- package/server/{review-context-DFxYOOJW.js → review-context-B-dlsPnx.js} +9 -9
- package/server/{review-convoy-liveness-BgU_1jJf.js → review-convoy-liveness-D7M-s_nS.js} +2 -2
- package/server/{review-status-Dma9SFaN.js → review-status-B6wYcOtP.js} +1 -1
- package/server/{review-status-CGvlA4o_.js → review-status-CKLk5aZ-.js} +308 -58
- package/server/{review-status-emit-DURrmGYX.js → review-status-emit-CJ7UmEVU.js} +3 -3
- package/server/{review-status-enrichment-8NiNXi5W.js → review-status-enrichment-DJRgGX7-.js} +3 -3
- package/server/review-status-limits-4EJDCGHO.js +7 -0
- package/server/{review-status-source-DIk1JSow.js → review-status-source-7nU3Z2wL.js} +1 -1
- package/server/{review-status-source-BLx_1siH.js → review-status-source-BsDYGfyv.js} +1 -1
- package/server/{review-status-sync-muT-EBp2.js → review-status-sync-BLssMTEW.js} +1 -1
- package/server/{review-status-sync-0GxOqeqF.js → review-status-sync-BxBeHRde.js} +35 -11
- package/server/{review-verdict-feedback-xJNdqBnX.js → review-verdict-feedback-5jWuzgpc.js} +90 -16
- package/server/{review-verdict-feedback-HwF6ODFy.js → review-verdict-feedback-HRY9P4bN.js} +1 -1
- package/server/{rollup-BQaol5TX.js → rollup-BGIrCEkU.js} +79 -44
- package/server/rollup-CZB4UL9q.js +3 -0
- package/server/{scanner-C-D2cFdX.js → scanner-DydjXPrz.js} +16 -9
- package/server/search-DdtIjAiu.js +395 -0
- package/server/{sequence-io-Bmf1EZM5.js → sequence-io-Fw-cLyDs.js} +4 -4
- package/server/{sequencer-agent-CigMyKh2.js → sequencer-agent-BcpGMt5x.js} +15 -10
- package/server/server.js +1258 -438
- package/server/{service-CD0DvFvD.js → service-BFFkGsG4.js} +58 -58
- package/server/{session-fork-B6cQ5eya.js → session-fork-D0V-3e5P.js} +2 -2
- package/server/{session-history-3ON_IJjm.js → session-history-Bta5l9jY.js} +5 -5
- package/server/{settings-PilbFZAM.js → settings-Ce8B1daF.js} +2 -2
- package/server/{settings-VN0qOh4U.js → settings-E3FnEIUx.js} +3 -3
- package/server/settings-eOOJpxi_.js +2 -0
- package/server/{shadow-engineering-DXvx77oE.js → shadow-engineering-Mt9nJO4i.js} +3 -3
- package/server/{shadow-state-CZBp7pwq.js → shadow-state-Bzj_AZCV.js} +1 -1
- package/server/{shadow-state-BBk_zacw.js → shadow-state-DrkhoVSx.js} +2 -2
- package/server/{shadow-utils-DdZ05AJS.js → shadow-utils-H1GfqP06.js} +2 -2
- package/server/{ship-log-7kJfjUX2.js → ship-log-CFUIo4PR.js} +1 -1
- package/server/{smart-compaction-8fA5k5XN.js → smart-compaction-DSTq-Wua.js} +1 -1
- package/server/{smart-compaction-ByhL9cRS.js → smart-compaction-Hzp3KCJX.js} +7 -7
- package/server/{spawn-planning-session-vLUJoFjy.js → spawn-planning-session-C0uSA2SL.js} +2 -2
- package/server/{spawn-planning-session-pcF-YeFE.js → spawn-planning-session-DN4son31.js} +23 -21
- package/server/{specialist-completion-B07XjWD2.js → specialist-completion-Cf6tpIh1.js} +1 -1
- package/server/{specialist-context-DJ-zFyL3.js → specialist-context-DEUEkjIQ.js} +5 -5
- package/server/{specialist-handoff-logger-aKSxbIgD.js → specialist-handoff-logger-D_LmQDj3.js} +2 -2
- package/server/{specialist-logs-Dae-n52_.js → specialist-logs-7Ynue0R7.js} +3 -3
- package/server/{specialists-KR3pKulN.js → specialists-CQwBEGlD.js} +1 -1
- package/server/{specialists-6PWdtWcg.js → specialists-DAjPgYs_.js} +504 -238
- package/server/{specialists-DUiExaxb.js → specialists-Hr6iW9fU.js} +18 -18
- package/server/{specialists-Bz-wFT7R.js → specialists-MOoeB4A8.js} +1 -1
- package/server/specs-Dl88cbKY.js +3 -0
- package/server/{src-B948bGVR.js → src-BYdwL_n-.js} +668 -64
- package/server/{src-vHy2-oCv.js → src-DQnkPN2i.js} +3 -3
- package/server/{src-rac0Mepv.js → src-DhfDV0o4.js} +6 -6
- package/server/{stack-health-DqLTiEu4.js → stack-health-D_iKwNRg.js} +107 -16
- package/server/stack-health-deVSdDwn.js +3 -0
- package/server/{stale-task-claims-Cab_Fo_Z.js → stale-task-claims-BYJGqhLI.js} +5 -5
- package/server/{staleness-CGTZyp6V.js → staleness-CopBDKnA.js} +1 -1
- package/server/{staleness-C-a5rBxF.js → staleness-D8WeMUHd.js} +1 -1
- package/server/{state-home-722Dkx92.js → state-home-DjN8qduI.js} +24 -3
- package/server/{state-mapping-CybR81Uf.js → state-mapping-DlM7OYRW.js} +1 -1
- package/server/{state-migrate-2u8wIpoL.js → state-migrate-a2p1gtD7.js} +4 -4
- package/server/state-mirror-Cv_XgvT5.js +121 -0
- package/server/{stuck-remediation-r1TJu68G.js → stuck-remediation-CXJX_kki.js} +1 -1
- package/server/{stuck-remediation-CC6q3eqQ.js → stuck-remediation-CbCRSz1v.js} +31 -732
- package/server/{substrate-bug-weights-service-CzIyyWFT.js → substrate-bug-weights-service-DxpopNd9.js} +3 -3
- package/server/{summary-fork-BqgmgPDt.js → summary-fork-B61fjRJn.js} +2 -2
- package/server/{summary-fork-Df2WFijM.js → summary-fork-B9pszUJN.js} +91 -10
- package/server/supervisor/{injection-budget-Cg_KIb3o.js → injection-budget-Ar7hgyJq.js} +1 -1
- package/server/supervisor/pty-supervisor.js +12 -3
- package/server/supervisor/{pty-token-BbjwEUUM.js → pty-token-CXCFU0Z8.js} +1 -1
- package/server/{supervisor-BxqSpjcN.js → supervisor-BvnxbuuF.js} +6 -4
- package/server/supervisor-C69kpqvd.js +2 -0
- package/server/{swarm-readiness-DfFxa9-n.js → swarm-readiness-vTw1kqGa.js} +3 -3
- package/server/{system-prerequisites-ICLSkhhZ.js → system-prerequisites-LLzTEqsK.js} +3 -3
- package/server/{teardown-workspace-DRdi_CPa.js → teardown-workspace-CqKKVJr1.js} +15 -15
- package/server/{test-agent-queue-A_-p-i0I.js → test-agent-queue-CWMq7oyG.js} +8 -7
- package/server/{test-verdict-BHgTAwIG.js → test-verdict-NdtgRBuA.js} +1 -1
- package/server/{test-verdict-C4i9aqEP.js → test-verdict-diIWE6hz.js} +15 -3
- package/server/{tldr-daemon-CvWXBhX1.js → tldr-daemon-B1Jhrtc8.js} +1 -1
- package/server/{tldr-daemon-wvsU6bKv.js → tldr-daemon-Bpls1CJB.js} +2 -2
- package/server/{tmux-CfDHob9M.js → tmux-CImZaX4q.js} +10 -16
- package/server/tmux-Cjpx8L8u.js +4 -0
- package/server/{token-DrxwytsZ.js → token-Bgpjo3tE.js} +2 -2
- package/server/token-util-BsjFll-k.js +3 -0
- package/server/{token-util-B48BlCba.js → token-util-BymbpkJp.js} +1 -1
- package/server/{tracker-config-BcPMElRB.js → tracker-config-4DaKVTfc.js} +2 -2
- package/server/{tracker-utils-CJ6BHjcD.js → tracker-utils-BDeAXC-q.js} +2 -2
- package/server/{traefik-connect-DZ6nMYMj.js → traefik-connect-CC5FyxYj.js} +1 -1
- package/server/{tunnel-Bp-dRHZz.js → tunnel-CDWkeceJ.js} +1 -1
- package/server/{tunnel-DUbUPElU.js → tunnel-CPf5M-Pc.js} +3 -3
- package/server/{typed-errors-DyjseiB6.js → typed-errors-9K7Dq_Vn.js} +1 -1
- package/server/{typed-errors-CKeoDdU3.js → typed-errors-DrS5fb5z.js} +1 -1
- package/server/{types-Cm5ASJbq.js → types-DzlUKiuf.js} +4 -3
- package/server/{types-Di8wdakq.js → types-kI9ik8XO.js} +1 -1
- package/server/{uat-promote-verification-CoJuh7XO.js → uat-promote-verification-c_pxoxEc.js} +5 -5
- package/server/{uat-train-4Q0k06CQ.js → uat-train-CWGxBdJO.js} +0 -0
- package/server/{uat-train-Dewoatps.js → uat-train-CfCYd2ve.js} +1 -1
- package/server/{validate-B0C8p66t.js → validate-f3ItVCfm.js} +3 -3
- package/server/{validation-hVOwQk8T.js → validation-5G_wQtea.js} +1 -1
- package/server/{validation-B_kIRfNe.js → validation-7tSiCM82.js} +4 -4
- package/server/{verification-artifact-BxlxTiYK.js → verification-artifact-9h9dH8uX.js} +1 -1
- package/server/{verification-artifact-D70AtckY.js → verification-artifact-C_4WJnf6.js} +1 -1
- package/server/{verification-runner-Bc3cJvpC.js → verification-runner-BV5F6wrA.js} +1 -1
- package/server/{verification-runner-KZTz6u72.js → verification-runner-D58KmBhK.js} +18 -38
- package/server/{vtt-parser-CE_i3Bcw.js → vtt-parser-2iT9OHa9.js} +1 -1
- package/server/{work-agent-prompt-ByrPAzOy.js → work-agent-prompt-D03s4DD1.js} +9 -9
- package/server/{workflows-D0vP1WrK.js → workflows-BMBwLYPV.js} +281 -98
- package/server/workflows-BOmWGpIh.js +2 -0
- package/server/{workspace-DQkRPLlQ.js → workspace-BgflNCH0.js} +3 -3
- package/server/{workspace-COWvdibH.js → workspace-Cn9ywfSW.js} +1 -1
- package/server/{workspace-anchor-drift-pwz23TI1.js → workspace-anchor-drift-C8Fy3shi.js} +1 -1
- package/server/{workspace-anchor-drift-DXYIAHzr.js → workspace-anchor-drift-CMiNncwq.js} +5 -8
- package/server/{workspace-config-BdZM4PvZ.js → workspace-config-aUc2nIz6.js} +1 -1
- package/server/{workspace-manager-BPgTrG66.js → workspace-manager-Bem7ZBs9.js} +521 -292
- package/server/workspace-manager-C0CpNh3t.js +3 -0
- package/server/{workspace-metadata-CdjzAP8x.js → workspace-metadata-C5iSlPRo.js} +1 -1
- package/server/{workspace-metadata-DkO_iTLo.js → workspace-metadata-UKmTYmDQ.js} +2 -2
- package/server/{workspaces-CRBJikLp.js → workspaces-DqxgwDZ8.js} +143 -113
- package/sync-sources/hooks/notification-hook +12 -1
- package/sync-sources/hooks/pan-hook-lib.sh +226 -0
- package/sync-sources/hooks/session-start-hook +31 -4
- package/sync-sources/hooks/work-agent-stop-hook +23 -1
- package/sync-sources/skills/pan-memory/SKILL.md +19 -3
- package/sync-sources/skills/pan-projects/SKILL.md +9 -0
- package/sync-sources/skills/pan-restart/SKILL.md +26 -7
- package/sync-sources/skills/pan-workspace/SKILL.md +77 -0
- package/server/activity-logger-CMthG6Vd.js +0 -3
- package/server/agent-state-CYXJVG72.js +0 -3
- package/server/agents-ePFVoZbu.js +0 -3
- package/server/archive-planning-B2XplFzT.js +0 -2
- package/server/cli-CjOCSnfj.js +0 -3
- package/server/deacon-swarm-B1XkIvfr.js +0 -2
- package/server/delivery-BX9HR4wQ.js +0 -3
- package/server/dist-B3YPQa5A.js +0 -3
- package/server/event-store-5UKzh9Jf.js +0 -3
- package/server/forge-B5o319qI.js +0 -3
- package/server/fts-db-IVc4_M3f.js +0 -146
- package/server/hume-VUCNbTgn.js +0 -3
- package/server/inspect-agent-CUwVmr2h.js +0 -2
- package/server/merge-ops-1abz6O_P.js +0 -2
- package/server/merge-rebase-CJJVAJuz.js +0 -2
- package/server/node_modules/brace-expansion/.tap/coverage/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -757
- package/server/node_modules/brace-expansion/.tap/processinfo/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -719
- package/server/node_modules/brace-expansion/ADVISORY-CVE-2026-14257.md +0 -107
- package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts +0 -8
- package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts.map +0 -1
- package/server/node_modules/brace-expansion/dist/commonjs/index.js +0 -263
- package/server/node_modules/brace-expansion/dist/commonjs/index.js.map +0 -1
- package/server/node_modules/brace-expansion/dist/commonjs/package.json +0 -3
- package/server/node_modules/brace-expansion/dist/esm/index.d.ts +0 -8
- package/server/node_modules/brace-expansion/dist/esm/index.d.ts.map +0 -1
- package/server/node_modules/brace-expansion/dist/esm/index.js +0 -259
- package/server/node_modules/brace-expansion/dist/esm/index.js.map +0 -1
- package/server/node_modules/brace-expansion/dist/esm/package.json +0 -3
- package/server/project-repos-DPjOdfPa.js +0 -3
- package/server/projects-_n3Zui6K.js +0 -3
- package/server/providers-BI1mOBQ4.js +0 -3
- package/server/public/assets/index-Ddkcz3WT.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +0 -1
- package/server/rally-D_VW4bJv.js +0 -3
- package/server/record-BTwWhtBb.js +0 -3
- package/server/record-update-DaOKS7Wb.js +0 -277
- package/server/recovery-trip-DDH-02ng.js +0 -44
- package/server/resume-mOREjlYu.js +0 -3
- package/server/rollup-BR4t_wck.js +0 -3
- package/server/settings-CVmWiJ-r.js +0 -2
- package/server/specs--enInima.js +0 -3
- package/server/stack-health-BikqHSjn.js +0 -3
- package/server/supervisor-B4anCCSm.js +0 -2
- package/server/tmux-Ctk6RV5l.js +0 -3
- package/server/token-util-D411CAq9.js +0 -3
- package/server/workflows-DtDX08ed.js +0 -2
- package/server/workspace-manager-C1F3XsnS.js +0 -3
|
@@ -46,8 +46,19 @@ fi
|
|
|
46
46
|
# Classify the notification. The message strings come from Claude Code's own
|
|
47
47
|
# notification payloads; we're pattern-matching the keywords that indicate the
|
|
48
48
|
# agent is stalled waiting for the human.
|
|
49
|
+
#
|
|
50
|
+
# Exact-match exclusion first: "Claude is waiting for your input" is Claude
|
|
51
|
+
# Code's idle-timeout heartbeat, fired for ANY agent idle >60s — after a
|
|
52
|
+
# completed turn, between items, or when work is done. It carries no question,
|
|
53
|
+
# and classifying it as user_question surfaced every long-idle agent as a
|
|
54
|
+
# blocking "Question for you" decision with no content (seen on PAN-3253).
|
|
55
|
+
# Real questions are detected by the JSONL AskUserQuestion scan and the pane
|
|
56
|
+
# detector; this heartbeat must stay a non-event. Anchored exactly so a future
|
|
57
|
+
# message that appends actual question text still classifies below.
|
|
49
58
|
REASON=""
|
|
50
|
-
if echo "$NOTIF_MSG" | grep -
|
|
59
|
+
if echo "$NOTIF_MSG" | grep -qixE 'claude is waiting for your input'; then
|
|
60
|
+
REASON=""
|
|
61
|
+
elif echo "$NOTIF_MSG" | grep -qiE '(permission|approval|allow.*tool|confirm.*tool)'; then
|
|
51
62
|
REASON="tool_permission"
|
|
52
63
|
elif echo "$NOTIF_MSG" | grep -qiE '(question|needs.*input|waiting.*for|needs your)'; then
|
|
53
64
|
REASON="user_question"
|
|
@@ -14,6 +14,232 @@
|
|
|
14
14
|
PAN_DASHBOARD_URL="${OVERDECK_DASHBOARD_URL:-http://localhost:3011}"
|
|
15
15
|
PAN_CURL_TIMEOUT="${OVERDECK_HOOK_TIMEOUT:-0.5}"
|
|
16
16
|
|
|
17
|
+
# Acquire a portable single-flight lock. A tiny Python helper holds the kernel
|
|
18
|
+
# advisory lock for the caller's lifetime; the directory is ownership metadata,
|
|
19
|
+
# not the synchronization primitive. Publishing the kernel lock before creating
|
|
20
|
+
# the metadata closes the mkdir-to-PID initialization race (PAN-3294).
|
|
21
|
+
pan_acquire_singleflight_lock() {
|
|
22
|
+
local lock_dir="$1"
|
|
23
|
+
local guard_file="${lock_dir}.flock"
|
|
24
|
+
local ready_file="${guard_file}.ready.$$.$RANDOM"
|
|
25
|
+
local lock_parent
|
|
26
|
+
lock_parent=$(dirname "$lock_dir")
|
|
27
|
+
mkdir -p "$lock_parent" 2>/dev/null || return 1
|
|
28
|
+
|
|
29
|
+
python3 - "$guard_file" "$ready_file" "$$" >/dev/null 2>&1 <<'PY' &
|
|
30
|
+
import fcntl
|
|
31
|
+
import os
|
|
32
|
+
import sys
|
|
33
|
+
import time
|
|
34
|
+
|
|
35
|
+
guard_file, ready_file, parent_pid_text = sys.argv[1:]
|
|
36
|
+
parent_pid = int(parent_pid_text)
|
|
37
|
+
fd = os.open(guard_file, os.O_CREAT | os.O_RDWR, 0o600)
|
|
38
|
+
try:
|
|
39
|
+
fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
|
40
|
+
except BlockingIOError:
|
|
41
|
+
with open(ready_file, "w", encoding="utf-8") as ready:
|
|
42
|
+
ready.write("busy\n")
|
|
43
|
+
raise SystemExit(0)
|
|
44
|
+
|
|
45
|
+
with open(ready_file, "w", encoding="utf-8") as ready:
|
|
46
|
+
ready.write("acquired\n")
|
|
47
|
+
|
|
48
|
+
while True:
|
|
49
|
+
try:
|
|
50
|
+
os.kill(parent_pid, 0)
|
|
51
|
+
except OSError:
|
|
52
|
+
break
|
|
53
|
+
if os.getppid() == 1:
|
|
54
|
+
break
|
|
55
|
+
time.sleep(0.1)
|
|
56
|
+
PY
|
|
57
|
+
local helper_pid=$!
|
|
58
|
+
|
|
59
|
+
local attempts=0
|
|
60
|
+
while [ ! -s "$ready_file" ] && kill -0 "$helper_pid" 2>/dev/null && [ "$attempts" -lt 100 ]; do
|
|
61
|
+
/bin/sleep 0.01
|
|
62
|
+
attempts=$((attempts + 1))
|
|
63
|
+
done
|
|
64
|
+
|
|
65
|
+
local lock_status
|
|
66
|
+
lock_status=$(cat "$ready_file" 2>/dev/null || true)
|
|
67
|
+
rm -f "$ready_file" 2>/dev/null || true
|
|
68
|
+
if [ "$lock_status" != "acquired" ]; then
|
|
69
|
+
kill "$helper_pid" 2>/dev/null || true
|
|
70
|
+
wait "$helper_pid" 2>/dev/null || true
|
|
71
|
+
return 1
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# The kernel lock is already held, so stale metadata can be replaced without
|
|
75
|
+
# exposing an unowned interval to contenders.
|
|
76
|
+
rm -rf "$lock_dir" 2>/dev/null || {
|
|
77
|
+
kill "$helper_pid" 2>/dev/null || true
|
|
78
|
+
wait "$helper_pid" 2>/dev/null || true
|
|
79
|
+
return 1
|
|
80
|
+
}
|
|
81
|
+
mkdir "$lock_dir" 2>/dev/null || {
|
|
82
|
+
kill "$helper_pid" 2>/dev/null || true
|
|
83
|
+
wait "$helper_pid" 2>/dev/null || true
|
|
84
|
+
return 1
|
|
85
|
+
}
|
|
86
|
+
printf '%s\n' "$$" > "$lock_dir/pid" || {
|
|
87
|
+
rm -rf "$lock_dir" 2>/dev/null || true
|
|
88
|
+
kill "$helper_pid" 2>/dev/null || true
|
|
89
|
+
wait "$helper_pid" 2>/dev/null || true
|
|
90
|
+
return 1
|
|
91
|
+
}
|
|
92
|
+
printf '%s\n' "$helper_pid" > "$lock_dir/helper-pid" || {
|
|
93
|
+
rm -rf "$lock_dir" 2>/dev/null || true
|
|
94
|
+
kill "$helper_pid" 2>/dev/null || true
|
|
95
|
+
wait "$helper_pid" 2>/dev/null || true
|
|
96
|
+
return 1
|
|
97
|
+
}
|
|
98
|
+
return 0
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
pan_release_singleflight_lock() {
|
|
102
|
+
local lock_dir="$1"
|
|
103
|
+
local owner_pid helper_pid
|
|
104
|
+
owner_pid=$(cat "$lock_dir/pid" 2>/dev/null || true)
|
|
105
|
+
helper_pid=$(cat "$lock_dir/helper-pid" 2>/dev/null || true)
|
|
106
|
+
|
|
107
|
+
# A caller may release only metadata it owns. Remove that metadata before
|
|
108
|
+
# dropping the kernel lock; a successor cannot acquire until the helper exits,
|
|
109
|
+
# and this owner performs no destructive filesystem action after that point.
|
|
110
|
+
[ "$owner_pid" = "$$" ] || return 0
|
|
111
|
+
rm -rf "$lock_dir" 2>/dev/null || return 0
|
|
112
|
+
if [[ "$helper_pid" =~ ^[1-9][0-9]*$ ]]; then
|
|
113
|
+
kill "$helper_pid" 2>/dev/null || true
|
|
114
|
+
wait "$helper_pid" 2>/dev/null || true
|
|
115
|
+
fi
|
|
116
|
+
return 0
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
# Run a command with a hard deadline while preserving its stdin, stdout, and
|
|
120
|
+
# ordinary exit code. GNU timeout is preferred when installed; stock macOS uses
|
|
121
|
+
# the pure-bash watchdog fallback. Expiry is always reported as 124.
|
|
122
|
+
pan_run_with_timeout() {
|
|
123
|
+
local timeout_seconds="$1"
|
|
124
|
+
shift
|
|
125
|
+
|
|
126
|
+
if command -v timeout >/dev/null 2>&1; then
|
|
127
|
+
if timeout -k 5 "$timeout_seconds" "$@"; then
|
|
128
|
+
return 0
|
|
129
|
+
else
|
|
130
|
+
return $?
|
|
131
|
+
fi
|
|
132
|
+
fi
|
|
133
|
+
if command -v gtimeout >/dev/null 2>&1; then
|
|
134
|
+
if gtimeout -k 5 "$timeout_seconds" "$@"; then
|
|
135
|
+
return 0
|
|
136
|
+
else
|
|
137
|
+
return $?
|
|
138
|
+
fi
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
local expired_file="${TMPDIR:-/tmp}/pan-hook-timeout.$$.$RANDOM"
|
|
142
|
+
"$@" &
|
|
143
|
+
local command_pid=$!
|
|
144
|
+
(
|
|
145
|
+
local sleep_pid=""
|
|
146
|
+
trap '[ -n "$sleep_pid" ] && kill "$sleep_pid" 2>/dev/null; exit 0' TERM INT
|
|
147
|
+
|
|
148
|
+
/bin/sleep "$timeout_seconds" &
|
|
149
|
+
sleep_pid=$!
|
|
150
|
+
wait "$sleep_pid" 2>/dev/null || exit 0
|
|
151
|
+
sleep_pid=""
|
|
152
|
+
|
|
153
|
+
if kill -0 "$command_pid" 2>/dev/null; then
|
|
154
|
+
: > "$expired_file"
|
|
155
|
+
kill -TERM "$command_pid" 2>/dev/null || true
|
|
156
|
+
/bin/sleep 5 &
|
|
157
|
+
sleep_pid=$!
|
|
158
|
+
wait "$sleep_pid" 2>/dev/null || exit 0
|
|
159
|
+
sleep_pid=""
|
|
160
|
+
kill -KILL "$command_pid" 2>/dev/null || true
|
|
161
|
+
fi
|
|
162
|
+
) &
|
|
163
|
+
local watchdog_pid=$!
|
|
164
|
+
|
|
165
|
+
local command_rc
|
|
166
|
+
if wait "$command_pid"; then
|
|
167
|
+
command_rc=0
|
|
168
|
+
else
|
|
169
|
+
command_rc=$?
|
|
170
|
+
fi
|
|
171
|
+
|
|
172
|
+
kill "$watchdog_pid" 2>/dev/null || true
|
|
173
|
+
wait "$watchdog_pid" 2>/dev/null || true
|
|
174
|
+
|
|
175
|
+
if [ -f "$expired_file" ]; then
|
|
176
|
+
/bin/rm -f "$expired_file" 2>/dev/null || true
|
|
177
|
+
return 124
|
|
178
|
+
fi
|
|
179
|
+
|
|
180
|
+
return "$command_rc"
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
# Admit at most OVERDECK_HOOK_LLM_RATE_LIMIT hook-initiated LLM calls in a
|
|
184
|
+
# rolling 60-second machine-wide window. Returns 0 after recording an allowed
|
|
185
|
+
# call and 1 when the bucket is full or cannot be locked safely.
|
|
186
|
+
pan_llm_rate_check() {
|
|
187
|
+
local overdeck_home="${OVERDECK_HOME:-$HOME/.overdeck}"
|
|
188
|
+
local bucket_file="$overdeck_home/hook-llm-calls.log"
|
|
189
|
+
local lock_dir="$overdeck_home/hook-llm-calls.lock.d"
|
|
190
|
+
local limit="${OVERDECK_HOOK_LLM_RATE_LIMIT:-6}"
|
|
191
|
+
[[ "$limit" =~ ^[0-9]+$ ]] || limit=6
|
|
192
|
+
|
|
193
|
+
mkdir -p "$overdeck_home" 2>/dev/null || return 1
|
|
194
|
+
|
|
195
|
+
local attempt=0
|
|
196
|
+
local acquired=0
|
|
197
|
+
while [ "$attempt" -lt 10 ]; do
|
|
198
|
+
if pan_acquire_singleflight_lock "$lock_dir"; then
|
|
199
|
+
acquired=1
|
|
200
|
+
break
|
|
201
|
+
fi
|
|
202
|
+
attempt=$((attempt + 1))
|
|
203
|
+
[ "$attempt" -lt 10 ] && /bin/sleep 0.1
|
|
204
|
+
done
|
|
205
|
+
[ "$acquired" = "1" ] || return 1
|
|
206
|
+
|
|
207
|
+
local now cutoff timestamp count=0
|
|
208
|
+
now=$(date +%s 2>/dev/null) || {
|
|
209
|
+
pan_release_singleflight_lock "$lock_dir"
|
|
210
|
+
return 1
|
|
211
|
+
}
|
|
212
|
+
cutoff=$((now - 60))
|
|
213
|
+
|
|
214
|
+
local bucket_tmp="${bucket_file}.tmp.$$"
|
|
215
|
+
: > "$bucket_tmp" 2>/dev/null || {
|
|
216
|
+
pan_release_singleflight_lock "$lock_dir"
|
|
217
|
+
return 1
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if [ -f "$bucket_file" ]; then
|
|
221
|
+
while IFS= read -r timestamp; do
|
|
222
|
+
if [[ "$timestamp" =~ ^[0-9]+$ ]] && [ "$timestamp" -ge "$cutoff" ]; then
|
|
223
|
+
printf '%s\n' "$timestamp" >> "$bucket_tmp"
|
|
224
|
+
count=$((count + 1))
|
|
225
|
+
fi
|
|
226
|
+
done < "$bucket_file"
|
|
227
|
+
fi
|
|
228
|
+
|
|
229
|
+
local allowed=1
|
|
230
|
+
if [ "$count" -lt "$limit" ]; then
|
|
231
|
+
printf '%s\n' "$now" >> "$bucket_tmp"
|
|
232
|
+
allowed=0
|
|
233
|
+
fi
|
|
234
|
+
|
|
235
|
+
if ! mv "$bucket_tmp" "$bucket_file" 2>/dev/null; then
|
|
236
|
+
rm -f "$bucket_tmp" 2>/dev/null || true
|
|
237
|
+
allowed=1
|
|
238
|
+
fi
|
|
239
|
+
pan_release_singleflight_lock "$lock_dir"
|
|
240
|
+
return "$allowed"
|
|
241
|
+
}
|
|
242
|
+
|
|
17
243
|
# Internal token for authenticated HTTP ingestion (PAN-1596). The
|
|
18
244
|
# /api/agents/:id/heartbeat route is token-gated — without this header every
|
|
19
245
|
# hook POST gets 403 and is dropped on 4xx, so hook-emitted runtime activity
|
|
@@ -72,16 +72,43 @@ if [ -z "$INTERNAL_TOKEN" ]; then
|
|
|
72
72
|
fi
|
|
73
73
|
fi
|
|
74
74
|
|
|
75
|
+
MEMORY_BRIEFING=""
|
|
75
76
|
if command -v jq >/dev/null 2>&1; then
|
|
76
77
|
SESSION_BODY=$(printf '%s' "$INPUT" | jq -c --arg agentId "$AGENT_ID" '. + {agentId: $agentId}' 2>/dev/null)
|
|
77
78
|
if [ -n "$SESSION_BODY" ]; then
|
|
78
|
-
|
|
79
|
+
# PAN-3286 FR-10: the response can carry a rendered standing briefing to
|
|
80
|
+
# emit as SessionStart additionalContext, so capture the body instead of
|
|
81
|
+
# discarding it. The timeout is a hard ceiling on how long session start can
|
|
82
|
+
# block on the dashboard; the server side composes from local files only
|
|
83
|
+
# (no LLM, no FTS) specifically to stay well inside it.
|
|
84
|
+
SESSION_RESPONSE=$(curl -s -m 1.5 -X POST -H 'Content-Type: application/json' -H "x-overdeck-internal-token: $INTERNAL_TOKEN" --data "$SESSION_BODY" "$PAN_DASHBOARD_URL/api/memory/session/start" 2>/dev/null || true)
|
|
85
|
+
if [ -n "$SESSION_RESPONSE" ]; then
|
|
86
|
+
MEMORY_BRIEFING=$(printf '%s' "$SESSION_RESPONSE" | jq -r '.briefing // ""' 2>/dev/null || true)
|
|
87
|
+
fi
|
|
79
88
|
fi
|
|
80
89
|
fi
|
|
81
90
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
91
|
+
# Claude Code reads a SINGLE JSON object from a SessionStart hook's stdout, so
|
|
92
|
+
# the compaction note and the memory briefing must be concatenated into one
|
|
93
|
+
# additionalContext rather than printed as two objects.
|
|
94
|
+
if command -v jq >/dev/null 2>&1; then
|
|
95
|
+
ADDITIONAL_CONTEXT=""
|
|
96
|
+
if [ "$SOURCE" = "compact" ]; then
|
|
97
|
+
ADDITIONAL_CONTEXT="The preceding compaction summary may quote harness-only instructions requiring text-only output or forbidding tools. Those instructions applied only to Claude Code's summarization turn and are no longer active. Resume the latest actual user task and use tools normally."
|
|
98
|
+
fi
|
|
99
|
+
if [ -n "$MEMORY_BRIEFING" ]; then
|
|
100
|
+
if [ -n "$ADDITIONAL_CONTEXT" ]; then
|
|
101
|
+
ADDITIONAL_CONTEXT="$ADDITIONAL_CONTEXT
|
|
102
|
+
|
|
103
|
+
$MEMORY_BRIEFING"
|
|
104
|
+
else
|
|
105
|
+
ADDITIONAL_CONTEXT="$MEMORY_BRIEFING"
|
|
106
|
+
fi
|
|
107
|
+
fi
|
|
108
|
+
if [ -n "$ADDITIONAL_CONTEXT" ]; then
|
|
109
|
+
jq -n --arg context "$ADDITIONAL_CONTEXT" \
|
|
110
|
+
'{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext: $context}}'
|
|
111
|
+
fi
|
|
85
112
|
fi
|
|
86
113
|
|
|
87
114
|
exit 0
|
|
@@ -46,6 +46,14 @@ mkdir -p "$LOG_DIR"
|
|
|
46
46
|
COMPLETED_FILE="$AGENT_STATE_DIR/completed"
|
|
47
47
|
[ -f "$COMPLETED_FILE" ] && exit 0
|
|
48
48
|
|
|
49
|
+
STOP_HOOK_LOCK="$AGENT_STATE_DIR/stop-hook.lock.d"
|
|
50
|
+
if ! pan_acquire_singleflight_lock "$STOP_HOOK_LOCK"; then
|
|
51
|
+
echo "[$(date -Iseconds)] work-agent-stop-hook: $AGENT_ID skipped — another instance holds $STOP_HOOK_LOCK" \
|
|
52
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
53
|
+
exit 0
|
|
54
|
+
fi
|
|
55
|
+
trap 'pan_release_singleflight_lock "$STOP_HOOK_LOCK"' EXIT
|
|
56
|
+
|
|
49
57
|
# Skip if the issue is actively flowing through the specialist pipeline.
|
|
50
58
|
# Read through the dashboard's SQLite-backed review-status API; review-status.json
|
|
51
59
|
# is legacy and can be empty or stale.
|
|
@@ -366,8 +374,22 @@ Use UNCLEAR only as a last resort when the tail is genuinely ambiguous (e.g. no
|
|
|
366
374
|
Respond with EXACTLY one word, nothing else: FORGOT_COMPLETION | STILL_WORKING | STOPPED_FOR_INPUT | UNCLEAR"
|
|
367
375
|
|
|
368
376
|
CLAUDE_STDERR="$LOG_DIR/work-agent-stop-hook.claude-stderr.log"
|
|
369
|
-
|
|
377
|
+
if ! pan_llm_rate_check; then
|
|
378
|
+
echo "[$(date -Iseconds)] work-agent-stop-hook: $AGENT_ID rate-limited — skipping completion-check LLM" \
|
|
379
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
380
|
+
exit 0
|
|
381
|
+
fi
|
|
382
|
+
|
|
383
|
+
RESULT=$(echo "$ANALYSIS_PROMPT" | pan_run_with_timeout "${OVERDECK_HOOK_LLM_TIMEOUT:-60}" \
|
|
384
|
+
claude -p --model "$COMPLETION_MODEL" 2>>"$CLAUDE_STDERR")
|
|
370
385
|
CLAUDE_RC=$?
|
|
386
|
+
case "$CLAUDE_RC" in
|
|
387
|
+
124|137|143)
|
|
388
|
+
echo "[$(date -Iseconds)] work-agent-stop-hook: $AGENT_ID completion-check LLM timed out rc=$CLAUDE_RC — no resolution emitted" \
|
|
389
|
+
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
390
|
+
exit 0
|
|
391
|
+
;;
|
|
392
|
+
esac
|
|
371
393
|
if [ $CLAUDE_RC -ne 0 ] || [ -z "$RESULT" ]; then
|
|
372
394
|
echo "[$(date -Iseconds)] work-agent-stop-hook: $AGENT_ID claude -p failed rc=$CLAUDE_RC (see $CLAUDE_STDERR), fallback to UNCLEAR" \
|
|
373
395
|
>> "$LOG_DIR/hooks.log" 2>/dev/null || true
|
|
@@ -5,6 +5,7 @@ triggers:
|
|
|
5
5
|
- pan memory
|
|
6
6
|
- memory search
|
|
7
7
|
- memory status
|
|
8
|
+
- memory --target
|
|
8
9
|
allowed-tools:
|
|
9
10
|
- Bash
|
|
10
11
|
- Read
|
|
@@ -17,16 +18,31 @@ Use `pan memory` to inspect the durable memory substrate for a project or issue.
|
|
|
17
18
|
## Commands
|
|
18
19
|
|
|
19
20
|
```bash
|
|
20
|
-
pan memory search <query> [--project <id>] [--workspace <id>] [--issue <id>] [--tag <tag>] [--sibling] [--include-archived] [--limit <n>] [--json]
|
|
21
|
-
pan memory status
|
|
21
|
+
pan memory search <query> [--project <id>] [--workspace <id|name>] [--issue <id>] [--tag <tag>] [--sibling] [--global] [--target [path]] [--include-archived] [--limit <n>] [--json]
|
|
22
|
+
pan memory status [issue] [--project <id>] [--workspace <id|name>] [--history <n>] [--json]
|
|
23
|
+
pan memory timeline [--workspace <id|name>] [--days <n>] [--limit <n>] [--json]
|
|
24
|
+
pan memory read <path> [--workspace <id|name>] [--from <n>] [--lines <n>]
|
|
22
25
|
pan memory reset <scope> <scopeId> --reason <text> [--project <id>] [--from <iso>] [--json]
|
|
23
|
-
pan memory summary
|
|
26
|
+
pan memory summary [issue] [--project <id>] [--workspace <id|name>] [--date <yyyy-mm-dd>] [--json]
|
|
24
27
|
pan memory doctor [--project <id>] [--json]
|
|
28
|
+
pan memory backfill [--workspace <id>] [--project <id>] [--dry-run] [--json]
|
|
29
|
+
pan memory pin <doc-path> [--project <id> | --workspace <id>] [--json]
|
|
30
|
+
pan memory unpin <doc-path> [--project <id> | --workspace <id>] [--json]
|
|
31
|
+
pan memory pins [--project <id> | --workspace <id>] [--json]
|
|
25
32
|
pan memory config [--json]
|
|
26
33
|
```
|
|
27
34
|
|
|
28
35
|
## Notes
|
|
29
36
|
|
|
30
37
|
- `search --sibling --issue <id>` searches same-project sibling issues instead of the selected issue.
|
|
38
|
+
- `search --global` merges results across every registered project instead of just the selected/default one.
|
|
39
|
+
- `search --workspace` accepts either a workspace id or a workspace name; a name matching more than one workspace across projects errors instead of guessing.
|
|
40
|
+
- `search --target [path]` (Subspace `target-search` parity) finds every non-archived workspace whose `path` targets a directory — bare `--target` defaults to the current working directory. Mutually exclusive with `--workspace`/`--issue`/`--global`. Fans out per matched workspace (which may span several projects) and merges by rank score, same as `--global`'s per-project merge. When no workspace targets the directory, prints a friendly "No workspaces target `<dir>`." note and exits 0.
|
|
41
|
+
- `status` and `summary` address a workspace three ways, in precedence order: `--workspace <id|name>`, an issue positional, then the workspace that owns the current directory. With none of the three resolvable the command exits non-zero and names all three modes. A workspace with no issue (main/scratch) is titled by its workspace name in `summary` output.
|
|
42
|
+
- `status --history <n>` prints the current status first, then up to N archived statuses newest-first with their archive timestamp, phase, and headline. N is capped at 50; the rollup writer prunes the on-disk archive to its three most recent entries, so N above 3 returns whatever is still retained. `--history` with `--json` emits `{current, history}` where each history entry is `{archivedAt, path, status}`.
|
|
43
|
+
- `timeline` prints one row per observation — timestamp, the action status or summary, and the files touched — oldest first, for the workspace named by `--workspace` or the one owning the current directory. `--days` counts today as day 1 and defaults to 7; `--limit` caps the row count at the 50 most recent by default; `--json` emits the observation rows.
|
|
44
|
+
- `read` prints a file from the workspace's memory home; `<path>` is relative to that home and `--from`/`--lines` slice it by 1-based line number. It refuses, with a non-zero exit, any absolute path, any `../` traversal, and any symlink whose real target is outside the home — so Claude Code JSONL session files under `~/.claude` are unreachable by construction.
|
|
31
45
|
- `reset` creates a reset marker; it does not delete historical memory records.
|
|
32
46
|
- `doctor` exits non-zero when an active agent has no successful extraction in the last hour.
|
|
47
|
+
- `backfill` reads historical Claude Code JSONL transcripts under `~/.claude/projects/` and extracts observations for sessions whose first-message cwd maps to a registered workspace; unmatched sessions are skipped. Read-only on the JSONL files — `--dry-run` reports matches without extracting or writing anything.
|
|
48
|
+
- `pin`/`unpin`/`pins` manage docs injected under the knowledge budget at prompt time. `--workspace` overrides `--project`; paths are stored project-relative regardless of scope.
|
|
@@ -85,6 +85,15 @@ pan project remove myapp
|
|
|
85
85
|
|
|
86
86
|
**Note:** This only removes the project from Overdeck's registry. It does NOT delete the actual project files.
|
|
87
87
|
|
|
88
|
+
### Add a Secondary Target Path (PAN-1990)
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
pan project add-target myproject --path /path/to/secondary/checkout
|
|
92
|
+
pan project add-target myproject --path /path/to/primary/checkout --primary
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
A project can have multiple target paths (e.g. a secondary worktree or mirror). `--primary` marks the given path as the primary target, demoting any previously-primary target — exactly one target is primary at a time.
|
|
96
|
+
|
|
88
97
|
## Project Requirements
|
|
89
98
|
|
|
90
99
|
For a project to work well with Overdeck:
|
|
@@ -38,9 +38,9 @@ pan restart --force # explicit operator bypass of the deploy-window
|
|
|
38
38
|
pan restart --cliproxy --force # redownload the pinned CLIProxy binary
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
Each stage is health-gated: the command waits for `GET /api/health`
|
|
42
|
-
or port binding
|
|
43
|
-
with a `[stage] reason` message on timeout.
|
|
41
|
+
Each stage is health-gated: the command waits for `GET /api/health` from the
|
|
42
|
+
newly spawned dashboard process, or port binding for CLIProxy, before reporting
|
|
43
|
+
`✓`. It exits non-zero with a `[stage] reason` message on timeout.
|
|
44
44
|
|
|
45
45
|
## Identity guard
|
|
46
46
|
|
|
@@ -49,10 +49,29 @@ non-primary checkout: either a workspace worktree or any linked Git worktree,
|
|
|
49
49
|
including a handoff worktree. It exits with code 2 and names the primary
|
|
50
50
|
checkout where the command must run.
|
|
51
51
|
|
|
52
|
-
The post-boot health gate verifies
|
|
53
|
-
`GET /api/health`.
|
|
54
|
-
|
|
55
|
-
server
|
|
52
|
+
The post-boot health gate verifies `repoRoot`, `mode`, and the serving process
|
|
53
|
+
PID from `GET /api/health`. A 200 response succeeds only when its PID matches the
|
|
54
|
+
process this restart spawned. A different checkout reports
|
|
55
|
+
`port held by non-primary server (cwd=…, mode=…)`; an old process from the same
|
|
56
|
+
checkout reports `port answered by pid X — not the freshly spawned server (pid
|
|
57
|
+
Y)`. Either response is a failure, not a successful restart.
|
|
58
|
+
|
|
59
|
+
## Ownership-mismatch recovery
|
|
60
|
+
|
|
61
|
+
When restart names PID X as the existing port owner, inspect that exact process
|
|
62
|
+
before acting:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
ps -p X -o pid=,ppid=,etime=,cmd=
|
|
66
|
+
lsof -nP -iTCP:3011 -sTCP:LISTEN
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
If it is the stale dashboard named by the failure, terminate it with `kill X`,
|
|
70
|
+
verify that the PID and listener are gone, then rerun `pan restart`. Do not use a
|
|
71
|
+
broad `pkill` pattern: it can terminate the supervisor, agents, or unrelated Node
|
|
72
|
+
processes. A fresh `EADDRINUSE` line fails restart immediately and names the same
|
|
73
|
+
owner, while a health timeout leaves the newly spawned process running for
|
|
74
|
+
inspection.
|
|
56
75
|
|
|
57
76
|
## Important Notes
|
|
58
77
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pan-workspace
|
|
3
|
+
description: "pan workspace new/main/get/activate/archive/relocate — the PAN-1990 projects/workspaces domain: kinds, doors, memory homes"
|
|
4
|
+
triggers:
|
|
5
|
+
- pan workspace new
|
|
6
|
+
- pan workspace main
|
|
7
|
+
- pan workspace relocate
|
|
8
|
+
- scratch workspace
|
|
9
|
+
- workspace kind
|
|
10
|
+
allowed-tools:
|
|
11
|
+
- Bash
|
|
12
|
+
- Read
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Pan Workspace (PAN-1990 domain)
|
|
16
|
+
|
|
17
|
+
`pan workspace` is overloaded — it also carries the older PAN-428 issue/git-worktree
|
|
18
|
+
lifecycle (`create`, `migrate`, `ssh`, `destroy`, …), which this skill does **not**
|
|
19
|
+
cover. This skill wraps only the newer projects/workspaces domain: every registered
|
|
20
|
+
project has exactly one `main` workspace plus any number of `issue` (one per tracked
|
|
21
|
+
issue) and `scratch` (ad-hoc, unattached to an issue) workspaces, all rows in the
|
|
22
|
+
`workspaces` table read through `src/lib/workspaces/resolver.ts` and written through
|
|
23
|
+
`src/lib/workspaces/writer.ts` — see `docs/WORKSPACES-AND-PROJECTS.md` for the full
|
|
24
|
+
model.
|
|
25
|
+
|
|
26
|
+
## Commands
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pan workspace new <name> [--project <key>] [--isolated] [--parent-branch <branch>] [--target-path <dir>] [--dry-run]
|
|
30
|
+
pan workspace main [--project <key>]
|
|
31
|
+
pan workspace get <ws>
|
|
32
|
+
pan workspace activate <ws>
|
|
33
|
+
pan workspace archive <ws>
|
|
34
|
+
pan workspace relocate <ws> --path <dir> [--force]
|
|
35
|
+
pan workspace list [--kind <main|issue|scratch>] [--archived] [--json] [--all]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Notes
|
|
39
|
+
|
|
40
|
+
- `new <name>` creates a **scratch** workspace. By default it shares the project's
|
|
41
|
+
primary directory (same worktree, no new branch); pass `--isolated` to create a
|
|
42
|
+
separate git worktree instead, with `--parent-branch` overriding the inferred
|
|
43
|
+
parent (defaults to the project's current branch).
|
|
44
|
+
- `--target-path <dir>` points the scratch workspace at any existing directory
|
|
45
|
+
instead of the project's primary path — this is how a workspace becomes a
|
|
46
|
+
long-lived lens onto an arbitrary repo, independent of `--isolated`'s
|
|
47
|
+
worktree-per-branch model. Mutually exclusive with `--isolated`; the path must
|
|
48
|
+
already exist. `is_git_repository` is detected from `<dir>/.git`. If the
|
|
49
|
+
resolved directory isn't the project's primary path or a path registered via
|
|
50
|
+
`pan project add-target`, the command still creates the row but prints an
|
|
51
|
+
informational note suggesting `pan project add-target`.
|
|
52
|
+
- `--dry-run` prints the resolved intent (`projectId`, `kind`, `name`, `path`,
|
|
53
|
+
`branchName`, `parentBranch`, `parentBranchGuessed`, `isGitRepository`,
|
|
54
|
+
`wouldCreateWorktree`) as JSON and returns before any worktree is created or
|
|
55
|
+
workspace row is written — no DB row, no worktree, no memory home.
|
|
56
|
+
- `main [--project <key>]` resolves the project's singleton main workspace, creating
|
|
57
|
+
it if it doesn't exist yet. There is exactly one `main` workspace per project —
|
|
58
|
+
`archive` refuses to touch it.
|
|
59
|
+
- `--project <key>` on `new`/`main` defaults to the sole registered project, or the
|
|
60
|
+
one resolved from the current working directory, when omitted.
|
|
61
|
+
- `get <ws>` prints the full row (id, kind, project, path, branch, issue, archived,
|
|
62
|
+
favorite, lastAccess) plus `memoryHome` — the workspace's memory-home directory
|
|
63
|
+
(`resolveWorkspaceMemoryRoot`), keyed by workspace id and stable across relocation.
|
|
64
|
+
- `activate <ws>` bumps `lastAccessedAt` (drives most-recent-first ordering in the
|
|
65
|
+
Sidebar and Cmd-K switcher) and prints a hint to restore `layoutConfig` if the
|
|
66
|
+
workspace has a saved dashboard pane arrangement.
|
|
67
|
+
- `archive <ws>` is reversible and refuses `kind=main`.
|
|
68
|
+
- `relocate <ws> --path <dir>` (Subspace `workspaces update --relocate` parity) points
|
|
69
|
+
an existing workspace at a new path: updates the `path` column, re-detects
|
|
70
|
+
`is_git_repository` from `<dir>/.git`, touches `lastAccessedAt`, and re-writes the
|
|
71
|
+
memory-home `metadata.json` recovery hint — the memory home itself never moves,
|
|
72
|
+
since it's keyed by workspace id, not path. `<ws>` accepts an id or a name
|
|
73
|
+
(ambiguous names across projects error out asking for the id). Refuses
|
|
74
|
+
`kind=issue` (pipeline-owned) and archived workspaces; `kind=main` requires
|
|
75
|
+
`--force` since it diverges the row from projects.yaml's primary path.
|
|
76
|
+
- `list --kind <kind>` reads through the resolver the same way the dashboard does;
|
|
77
|
+
add `--archived` to include archived rows (only meaningful together with `--kind`).
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { Jn as clearAgentPausedSync, Xn as clearAgentTroubledSync, ir as init_agent_state, rr as getAgentStateSync, yr as setAgentPausedSync } from "./queries-C-MUZaIy.js";
|
|
2
|
-
init_agent_state();
|
|
3
|
-
export { clearAgentPausedSync, clearAgentTroubledSync, getAgentStateSync, setAgentPausedSync };
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { $n as getAgentDir, An as getProviderExportsForModel, B as detectCrashedAgents, Bn as dismissDevChannelsDialog, Br as saveAgentRuntimeState, C as replayCrashedStandingAgent, Dn as buildSpawnEnvForModel, En as buildCavemanExports, Fr as waitForAgentIdle, Ft as deliverResumeMessageWithTranscriptConfirmation, G as resumeAgent, Gn as SESSION_EXITED_BEFORE_KICKOFF, Gt as assertWorkspaceStackHealthyForSpawn, H as restartAgent, In as buildDefaultResumeContinueMessage, Ir as waitForReadySignal, Jn as clearAgentPausedSync, Kn as __testInternals, Kt as buildAgentLaunchConfig, Ln as buildResumeContinueMessage, Lr as getAgentRuntimeState, Mr as isQualifiedAgentId, Mt as deliverAgentMessage, Nr as normalizeAgentId, Nt as deliverAgentPermissionDecision, On as determineModel, Pr as resolveAgentTargetSync, Pt as deliverInitialPromptWithRetry, Rn as decideChannelsForWorkAgent, Rr as getAgentRuntimeStateSync, Rt as setAgentDeliveryMethod, S as contextWindowForModel, Sr as writeAgentStateJsonSync, T as shouldReplayCompactAtTierRunBoundary, U as buildCompactRecoverySeed, Un as writeChannelsBridgeMcpConfig, V as recoverAgent, Wn as GOVERNOR_SLOT_PAUSE_REASON_PREFIX, X as messageAgent, Xn as clearAgentTroubledSync, Xt as transitionIssueToInProgress, Yn as clearAgentTroubled, Yt as retrieveSpawnTimeMemoryContext, Zn as clearYieldForResumeSync, Zt as transitionIssueToInReview, _n as waitForPromptReady, _r as saveAgentStateSync, a as listRunningAgentsSync, an as OHMYPI_AGENT_READY_TIMEOUT_SECONDS, ar as isAgentPaused, b as init_agents, br as setAgentYieldedSync, cn as getAgentRuntimeBaseCommand, dn as getProviderAuthMode, dr as markAgentTroubled, dt as spawnRun, et as appendActivity, fn as getRoleRuntimeBaseCommand, fr as recordAgentFailure, gr as saveAgentState, hn as roleAgentDefinitionPath, hr as resetAgentFailureCount, i as listRunningAgents, it as getSessionId, jn as getProviderTmuxFlags, jr as clearReadySignal, kn as getProviderEnvForModel, lr as markAgentRunningState, mn as injectPiConversationMemory, mt as stopAgentSync, nr as getAgentStateFilePath, nt as getLatestSessionId, o as warnOnBareNumericIssueIds, on as describeOhmypiSpawnFailure, or as isAgentTroubled, ot as saveSessionId, pr as recordAgentFailureSync, pt as stopAgent, qn as clearAgentPaused, r as listAgentStates, rr as getAgentStateSync, rt as getLatestSessionIdSync, sr as isRole, t as dropLegacyAgentStatesMissingRoleAsync, tr as getAgentState, tt as getActivity, ur as markAgentStoppedState, ut as spawnAgent, vr as setAgentPaused, w as replayStandingAgent, x as compactAtTierRunBoundary, xr as wipeAgentStateDirs, yr as setAgentPausedSync, z as autoRecoverAgents, zn as decideSupervisorForWorkAgent } from "./queries-C-MUZaIy.js";
|
|
2
|
-
init_agents();
|
|
3
|
-
export { GOVERNOR_SLOT_PAUSE_REASON_PREFIX, OHMYPI_AGENT_READY_TIMEOUT_SECONDS, SESSION_EXITED_BEFORE_KICKOFF, __testInternals, appendActivity, assertWorkspaceStackHealthyForSpawn, autoRecoverAgents, buildAgentLaunchConfig, buildCavemanExports, buildCompactRecoverySeed, buildDefaultResumeContinueMessage, buildResumeContinueMessage, buildSpawnEnvForModel, clearAgentPaused, clearAgentPausedSync, clearAgentTroubled, clearAgentTroubledSync, clearReadySignal, clearYieldForResumeSync, compactAtTierRunBoundary, contextWindowForModel, decideChannelsForWorkAgent, decideSupervisorForWorkAgent, deliverAgentMessage, deliverAgentPermissionDecision, deliverInitialPromptWithRetry, deliverResumeMessageWithTranscriptConfirmation, describeOhmypiSpawnFailure, detectCrashedAgents, determineModel, dismissDevChannelsDialog, dropLegacyAgentStatesMissingRoleAsync, getActivity, getAgentDir, getAgentRuntimeBaseCommand, getAgentRuntimeState, getAgentRuntimeStateSync, getAgentState, getAgentStateFilePath, getAgentStateSync, getLatestSessionId, getLatestSessionIdSync, getProviderAuthMode, getProviderEnvForModel, getProviderExportsForModel, getProviderTmuxFlags, getRoleRuntimeBaseCommand, getSessionId, injectPiConversationMemory, isAgentPaused, isAgentTroubled, isQualifiedAgentId, isRole, listAgentStates, listRunningAgents, listRunningAgentsSync, markAgentRunningState, markAgentStoppedState, markAgentTroubled, messageAgent, normalizeAgentId, recordAgentFailure, recordAgentFailureSync, recoverAgent, replayCrashedStandingAgent, replayStandingAgent, resetAgentFailureCount, resolveAgentTargetSync, restartAgent, resumeAgent, retrieveSpawnTimeMemoryContext, roleAgentDefinitionPath, saveAgentRuntimeState, saveAgentState, saveAgentStateSync, saveSessionId, setAgentDeliveryMethod, setAgentPaused, setAgentPausedSync, setAgentYieldedSync, shouldReplayCompactAtTierRunBoundary, spawnAgent, spawnRun, stopAgent, stopAgentSync, transitionIssueToInProgress, transitionIssueToInReview, waitForAgentIdle, waitForPromptReady, waitForReadySignal, warnOnBareNumericIssueIds, wipeAgentStateDirs, writeAgentStateJsonSync, writeChannelsBridgeMcpConfig };
|
package/server/cli-CjOCSnfj.js
DELETED
package/server/dist-B3YPQa5A.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { a as init_event_store, i as initEventStore, n as getEventStore, o as openEventDb, r as getSharedDb, t as createEventStore } from "./event-store-CrHcVC5_.js";
|
|
2
|
-
init_event_store();
|
|
3
|
-
export { createEventStore, getEventStore, getSharedDb, initEventStore, openEventDb };
|
package/server/forge-B5o319qI.js
DELETED