@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.
Files changed (444) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +59 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-10Ur5Dne.js → acceptance-criteria-DmtLDbtt.js} +2 -2
  4. package/server/{activity-logger-CyteR4JO.js → activity-logger-Co5qljIj.js} +55 -4
  5. package/server/activity-logger-K7FYGF_z.js +3 -0
  6. package/server/{advancing-selfheal-BNwqxseD.js → advancing-selfheal-8AR68Asf.js} +6 -6
  7. package/server/{agent-gc-C3h9Or3a.js → agent-gc-BmYeT6eH.js} +5 -5
  8. package/server/agent-state-Dq3s84-P.js +3 -0
  9. package/server/{agent-state-service-C63p_ftq.js → agent-state-service-DK1Vay1E.js} +1 -1
  10. package/server/{agent-state-service-Ds6OeFvo.js → agent-state-service-rjnzpHDx.js} +6 -6
  11. package/server/agent-state-source-Ds968-j6.js +21 -0
  12. package/server/{agents-J5mEnekq.js → agents-Dls7tfJH.js} +5 -5
  13. package/server/agents-IPSa5kzn.js +3 -0
  14. package/server/{archive-planning-BwhxeP7C.js → archive-planning-Cq7cyinS.js} +51 -24
  15. package/server/archive-planning-MbkGCBIY.js +2 -0
  16. package/server/{artifact-index-jobs-D1q_vR3V.js → artifact-index-jobs-Dj_8kpTd.js} +3 -3
  17. package/server/{assemble-Bgwqv-Ro.js → assemble-BTCmbcfH.js} +20 -13
  18. package/server/{auto-spawn-consent-CQ9Bi9q6.js → auto-spawn-consent-lXqRJ1Dr.js} +304 -121
  19. package/server/{backlog-auto-trigger-n1lzPgN4.js → backlog-auto-trigger-Dn-amzt6.js} +3 -3
  20. package/server/{behavior-td6-xhQk.js → behavior-DIMQMRzs.js} +2 -2
  21. package/server/{boot-reconciled-stop-events-C7gGe3oB.js → boot-reconciled-stop-events-D6SeUTIr.js} +1 -1
  22. package/server/{bridge-pool-patrol-CYH2OLb5.js → bridge-pool-patrol-BEjt-xF3.js} +2 -2
  23. package/server/{briefing-freshness-DRqZ8lAz.js → briefing-freshness-3PNmL_p3.js} +2 -2
  24. package/server/{build-info-7yiEpl6u.js → build-info-CJg813Hm.js} +3 -3
  25. package/server/{build-info-CpG__c63.js → build-info-CXyeFsXu.js} +1 -1
  26. package/server/{checkpoint-manager-CkKmB0wZ.js → checkpoint-manager-9t7G5c1V.js} +1 -1
  27. package/server/{checkpoint-manager-DBcyNR8w.js → checkpoint-manager-B2G38R3p.js} +3 -3
  28. package/server/checkpoint-worker.js +1 -1
  29. package/server/{checkpoints-Wm963lm8.js → checkpoints-CuBgiXO-.js} +1 -1
  30. package/server/{checkpoints-D95apurL.js → checkpoints-VTZMd4Qm.js} +2 -2
  31. package/server/{claude-hooks-provision-Bjitl9aI.js → claude-hooks-provision-55SyQaPz.js} +2 -2
  32. package/server/{claude-hooks-provision-4RPxNkE8.js → claude-hooks-provision-CEUT-CZd.js} +1 -1
  33. package/server/{claude-permissions-CpbpvUQ2.js → claude-permissions-Cn0dIu2i.js} +2 -2
  34. package/server/{claude-settings-overlay-BzkHYDwR.js → claude-settings-overlay-B19hdzSA.js} +1 -1
  35. package/server/{claude-settings-overlay-_H9Yrzab.js → claude-settings-overlay-Yg_ANh81.js} +2 -2
  36. package/server/{cli-Cte9ZFGn.js → cli-C9S84iTy.js} +79 -22
  37. package/server/cli-M1cwZ__d.js +3 -0
  38. package/server/{cliproxy-C5fMJ7rY.js → cliproxy-CJq3KXU6.js} +2 -2
  39. package/server/{cliproxy-DaAbWMjC.js → cliproxy-DgEZlr7Y.js} +1 -1
  40. package/server/{close-issue-BPh1ARCF.js → close-issue-DPxRddGR.js} +5 -5
  41. package/server/{closed-issue-reaper-DoOZqGFK.js → closed-issue-reaper-C5Zn4GRS.js} +13 -13
  42. package/server/{closed-issue-reaper-DHRfRMrp.js → closed-issue-reaper-D-2B48Ri.js} +1 -1
  43. package/server/{codex-o8FJwzmy.js → codex-B3n_rkwn.js} +1 -1
  44. package/server/{codex-BzGDW_d3.js → codex-CjkD1PJu.js} +6 -6
  45. package/server/{codex-parser-Dt-ycU8L.js → codex-parser-DpB1Il-P.js} +2 -2
  46. package/server/{compaction-continuation-CvXpbZ4w.js → compaction-continuation-DZD9ukSE.js} +3 -3
  47. package/server/{config-CL3Gyvja.js → config-C5saf4Ja.js} +1 -1
  48. package/server/{config-BvLe652W.js → config-DnLJATZk.js} +2 -2
  49. package/server/{config-Bi3u1VK7.js → config-DvM8jtQK.js} +2 -2
  50. package/server/{config-yaml-CxdwhAIA.js → config-yaml-BSCqwmX0.js} +11299 -10972
  51. package/server/{conflict-gate-CX80JYYS.js → conflict-gate-DXa_L28t.js} +1 -1
  52. package/server/{conflict-gate-E4nt7ZeS.js → conflict-gate-WfVqgalf.js} +4 -4
  53. package/server/{context-layers-DAG83UZt.js → context-layers-D7UqH9Ab.js} +2 -2
  54. package/server/{context-layers-C_IIysnm.js → context-layers-Dpz3Vd6d.js} +3 -3
  55. package/server/{control-settings-CiqGxXnc.js → control-settings-DVf6pKyv.js} +4 -4
  56. package/server/{conversation-compaction-BE3CNtHF.js → conversation-compaction-5XuH6OBn.js} +1 -1
  57. package/server/{conversation-compaction-D6-yLtqt.js → conversation-compaction-COrbnX1J.js} +8 -8
  58. package/server/{conversation-service-DBxoYMDl.js → conversation-service-BufdtnZF.js} +169 -10
  59. package/server/{conversation-service-D_TS2b1r.js → conversation-service-DnUyIiLb.js} +1 -1
  60. package/server/{conversations-D0UEdLtk.js → conversations-B4rxz-Wl.js} +17 -10
  61. package/server/{conversations-BKDVpB-3.js → conversations-D1bwxQMy.js} +1 -1
  62. package/server/{cost-DpgYmYqR.js → cost-CpFDrJUS.js} +46 -2
  63. package/server/{cost-DS1s0DbG.js → cost-KLuwKCW9.js} +3 -3
  64. package/server/{cost-sync-tOCCGnEt.js → cost-sync-cesi9dp8.js} +3 -3
  65. package/server/{dag-BtkgLeqY.js → dag-BYiFMqpU.js} +2 -2
  66. package/server/{dangerous-git-ops-CFLykHWt.js → dangerous-git-ops-BKvd3-Hk.js} +1 -1
  67. package/server/dashboard-db-worker.js +7 -7
  68. package/server/{deacon-BIblC-WX.js → deacon-BbsWw8a6.js} +3 -3
  69. package/server/{deacon-pLRLbPvR.js → deacon-HdEh0Esp.js} +863 -214
  70. package/server/deacon-event-client-C93rvOT7.js +237 -0
  71. package/server/deacon-event-client-Ck5Ei7Mn.js +3 -0
  72. package/server/{deacon-nudge-log-B08gF0mh.js → deacon-nudge-log-BND_97Wo.js} +4 -3
  73. package/server/{deacon-pending-lifecycle-B-Io84AP.js → deacon-pending-lifecycle-CD3YsiQK.js} +3 -3
  74. package/server/deacon-swarm-DgWADWd_.js +2 -0
  75. package/server/{deacon-swarm-v5PMun-m.js → deacon-swarm-rqrl4TMs.js} +39 -18
  76. package/server/deacon.js +12 -210
  77. package/server/{dead-end-trip-D8A3msX9.js → dead-end-trip-DSF23CLX.js} +4 -3
  78. package/server/dead-end-trip-zKlS4v6f.js +2 -0
  79. package/server/delivery-CsbQdZkS.js +3 -0
  80. package/server/{deploy-patrol-sYgOxLeb.js → deploy-patrol-kARAkji4.js} +17 -21
  81. package/server/{deploy-queue-VfohaPN_.js → deploy-queue-Bj0HJT1i.js} +2 -2
  82. package/server/{deploy-queue-gHJBycaF.js → deploy-queue-rjTUy1RM.js} +1 -1
  83. package/server/{deploy-window-D4DQb8VP.js → deploy-window-B2IM-9G5.js} +10 -44
  84. package/server/{deploy-window-CFRZ0-kt.js → deploy-window-BNFWnA8D.js} +1 -1
  85. package/server/{dev-supervisor-DiOBDM1c.js → dev-supervisor-B1mZYXz4.js} +2 -2
  86. package/server/{devcontainer-renderer-BUOIlfgD.js → devcontainer-renderer-B-o68Z5B.js} +3 -3
  87. package/server/{dist-C3A8B8wM.js → dist-3W--cGMa.js} +1 -1
  88. package/server/dist-BR0QtwmS.js +3 -0
  89. package/server/{dist-src-C0adpegX.js → dist-src-C-Vk2jNk.js} +1 -1
  90. package/server/{docker-Y3PElJb0.js → docker-DH3jUYg1.js} +1 -1
  91. package/server/{docker-BJzlkqYB.js → docker-meuLKLzV.js} +27 -20
  92. package/server/{dod-DlNtcH6n.js → dod-D7-9dCOD.js} +1 -1
  93. package/server/{driver-CKVGi51s.js → driver-CmsY2RLl.js} +1 -1
  94. package/server/{durable-review-pipeline-DP6bIcOY.js → durable-review-pipeline-CStTgOAf.js} +1 -1
  95. package/server/{durable-review-pipeline-Cibps-Rg.js → durable-review-pipeline-Chq0lzjL.js} +1 -1
  96. package/server/{ensure-devcontainer-DMAbWqtQ.js → ensure-devcontainer-BE3llBWP.js} +1 -1
  97. package/server/{ensure-devcontainer-BAofzBPv.js → ensure-devcontainer-BXrY7C2Z.js} +4 -4
  98. package/server/{esm-shims-BeObUkaw.js → esm-shims-Bzy4ZzNU.js} +1 -1
  99. package/server/event-store-COd2tOx8.js +3 -0
  100. package/server/{event-store-CrHcVC5_.js → event-store-D_AR-Y78.js} +184 -11
  101. package/server/{events-CF8QDbuV.js → events-CCkFWa7X.js} +1 -1
  102. package/server/{events-BNrvchBg.js → events-zjDQozet.js} +3 -3
  103. package/server/{factory-Cmm9Hsho.js → factory-DhavwKVc.js} +5 -5
  104. package/server/{feature-registry-population-B6HpNWRy.js → feature-registry-population-DWGBKyWd.js} +4 -4
  105. package/server/{feature-registry-storage-DJEFx1Pf.js → feature-registry-storage-C5DkXmCM.js} +3 -3
  106. package/server/{features-D5km80UI.js → features-CC47YcCX.js} +2 -2
  107. package/server/{feedback-target-BJ5ZADsu.js → feedback-target-D9Tex35_.js} +1 -1
  108. package/server/{feedback-target-DSxEL6lP.js → feedback-target-DoRCR3L-.js} +18 -7
  109. package/server/{feedback-writer-CoB9Z6aU.js → feedback-writer-CTSuA6lw.js} +1 -1
  110. package/server/{feedback-writer-C27Hak8a.js → feedback-writer-DdsBdtNL.js} +5 -5
  111. package/server/{flywheel-DZZdtiOL.js → flywheel-DHWHzaYK.js} +1 -1
  112. package/server/{flywheel-f662Q-y2.js → flywheel-DJQa9az8.js} +14 -14
  113. package/server/{flywheel-BHx8XuMr.js → flywheel-TacAI9MA.js} +21 -17
  114. package/server/{flywheel-merge-order-Dil0LmdN.js → flywheel-merge-order-D2foPh88.js} +1 -1
  115. package/server/{flywheel-merge-order-D_xLMbJU.js → flywheel-merge-order-DRtex2Dt.js} +7 -7
  116. package/server/forge-CdlCG9aS.js +3 -0
  117. package/server/{forge-BaKGCya6.js → forge-c8LeC-tw.js} +2 -2
  118. package/server/{from-B3tZbB55.js → from-BogSwvr2.js} +1 -1
  119. package/server/{fs-lock-Bre3sGoz.js → fs-lock-D_GeJtXl.js} +3 -3
  120. package/server/{fts-operations-B9jG8wa3.js → fts-operations-DP9R-8Q3.js} +3 -3
  121. package/server/{git-utils-Xg4PFN45.js → git-utils-C31x1lpE.js} +1 -1
  122. package/server/{git-utils-CsvYfJU3.js → git-utils-xQ74FoSn.js} +5 -4
  123. package/server/{github-app-Bmg4R9mv.js → github-app-CpQSDlv8.js} +1 -1
  124. package/server/{github-app-CmNk0zLU.js → github-app-D2QuvZ3j.js} +3 -3
  125. package/server/{github-client-qazkPrg0.js → github-client-D9YvJX5D.js} +3 -3
  126. package/server/{github-client-B6KM9_wA.js → github-client-Tpi3PmKX.js} +1 -1
  127. package/server/{github-pr-lookup-DAcVeRLK.js → github-pr-lookup-DvBMv-IW.js} +2 -2
  128. package/server/{harness-binary-BSpiXaLw.js → harness-binary-BHxWf_sX.js} +7 -6
  129. package/server/{harness-resolve-BAJu5MX8.js → harness-resolve-bj9WMABA.js} +4 -4
  130. package/server/{health-events-BwX32k8d.js → health-events-bCDPn59Z.js} +2 -2
  131. package/server/{health-events-2Z6Wa9SM.js → health-events-qo7Ss34U.js} +1 -1
  132. package/server/{hooks-DbtbimEf.js → hooks-Dyxtg5fk.js} +2 -2
  133. package/server/{hooks-D1g1jKLI.js → hooks-X2XHBB2b.js} +1 -1
  134. package/server/{hume-DXNiu6nQ.js → hume-DrZEGpqc.js} +2 -2
  135. package/server/hume-YPsy4UA8.js +3 -0
  136. package/server/{idle-stack-reaper-Cy-dQzW4.js → idle-stack-reaper-CJ1ygW0p.js} +37 -7
  137. package/server/{idle-stack-reaper-CRA1e0jr.js → idle-stack-reaper-uJGOb-vu.js} +1 -1
  138. package/server/{in-flight-guard-D-sSkADM.js → in-flight-guard-CG2Eo-rr.js} +1 -1
  139. package/server/{infra-BDQDRopn.js → infra-CTrmVqc_.js} +111 -6
  140. package/server/{injection-Bl8d_jHZ.js → injection-BisQ0lpX.js} +1 -1
  141. package/server/{injection-6AGnXxlj.js → injection-C9sxqbc2.js} +73 -193
  142. package/server/{inspect-agent-nXdIptyh.js → inspect-agent-BoSO51YC.js} +12 -12
  143. package/server/inspect-agent-BykeOH4a.js +2 -0
  144. package/server/{internal-token-DzK385vD.js → internal-token-AvXePaQT.js} +2 -2
  145. package/server/{internal-token-Ias7N8Kg.js → internal-token-Djkj-yqK.js} +1 -1
  146. package/server/{io-B00PBNku.js → io-mxOWMZ7I.js} +6 -6
  147. package/server/{issue-closed-BehTG1be.js → issue-closed-Bj_bCv_0.js} +7 -7
  148. package/server/{issue-lifecycle-BqSuQvbn.js → issue-lifecycle-A5YIpDZE.js} +1 -1
  149. package/server/{issue-lifecycle-Birk-ifu.js → issue-lifecycle-BXUqaHzF.js} +32 -28
  150. package/server/{issue-service-singleton-C6ZduvuY.js → issue-service-singleton-BPNEXczv.js} +11 -11
  151. package/server/{issue-service-singleton-B2wXiIlw.js → issue-service-singleton-CcaHjKPR.js} +1 -1
  152. package/server/{issues-DQ5-LatB.js → issues-AX-YBeAQ.js} +2 -2
  153. package/server/{jsonl-parser-BDpnGFCl.js → jsonl-parser-CgYWQ20q.js} +7 -3
  154. package/server/kimi-code-BYbme0aV.js +579 -0
  155. package/server/kimi-code-D_Ppt82c.js +3 -0
  156. package/server/kimi-parser-B-JBg3Pv.js +147 -0
  157. package/server/{label-cleanup-Dwnky8FG.js → label-cleanup-sXUlgdM0.js} +3 -3
  158. package/server/{lifecycle-B4Xdb4cY.js → lifecycle-D2X3al0D.js} +2 -2
  159. package/server/{lifecycle-B3s4sM1G.js → lifecycle-DjlljAZ1.js} +6 -6
  160. package/server/{lifecycle-io-CzTHEooc.js → lifecycle-io-C5nVk55o.js} +1 -1
  161. package/server/{lifecycle-io-DCo6s6ks.js → lifecycle-io-NPm1YtIG.js} +5 -5
  162. package/server/{linear-client-CnbtHiic.js → linear-client--luYwCZg.js} +1 -1
  163. package/server/{linear-client-9uq7fhiV.js → linear-client-B8pLegW1.js} +3 -3
  164. package/server/{linear-mcp-auth-BxUOzswy.js → linear-mcp-auth-BQVWV0I3.js} +6 -6
  165. package/server/{linear-mcp-auth-D46fBCLf.js → linear-mcp-auth-Dx81Zl4G.js} +1 -1
  166. package/server/memory-fts-worker.js +1 -1
  167. package/server/{merge-DiW9RdSB.js → merge-Bx5Bh9pi.js} +3 -3
  168. package/server/{merge-sr8Nrnmi.js → merge-Dqmh_zja.js} +1 -1
  169. package/server/{merge-agent-BLUgRsz3.js → merge-agent-DP9AUY29.js} +33 -33
  170. package/server/{merge-agent-DQTXZk8z.js → merge-agent-DWd0KfiS.js} +1 -1
  171. package/server/{merge-batch-Cp_j9BGk.js → merge-batch-BdmvTEAC.js} +1 -1
  172. package/server/{merge-completeness-BLbB5-6n.js → merge-completeness-BfRwFjRx.js} +1 -1
  173. package/server/{merge-completeness-B46KqhtY.js → merge-completeness-C1FevcDT.js} +4 -4
  174. package/server/merge-ops-B98tKc1e.js +2 -0
  175. package/server/merge-rebase-BLykMwPO.js +2 -0
  176. package/server/{merge-rebase-DIkBjgwq.js → merge-rebase-BX1xKsrE.js} +2 -2
  177. package/server/{merge-set-CBgHfwM0.js → merge-set-DsLjjLEV.js} +4 -4
  178. package/server/{merge-set-DeUxFsC3.js → merge-set-H6epHOsw.js} +1 -1
  179. package/server/{merge-sync-kr4vqyjM.js → merge-sync-BEdfsQV4.js} +2 -2
  180. package/server/{merge-sync-CpGmk6Ch.js → merge-sync-BebcWWGA.js} +1 -1
  181. package/server/{merge-train-Dmrcus12.js → merge-train-D1I0lNOT.js} +4 -4
  182. package/server/{merge-train-deps-D_uGX91G.js → merge-train-deps-D_-C0Pk2.js} +4 -4
  183. package/server/{merge-verification-NvaAd8CZ.js → merge-verification-DN1Ov9bU.js} +6 -6
  184. package/server/{merged-docker-cleanup-worker-Y1R06TEl.js → merged-docker-cleanup-worker-CfXSr2pA.js} +4 -4
  185. package/server/{merged-docker-cleanup-worker-DH_hrGPI.js → merged-docker-cleanup-worker-ybsPyHjB.js} +1 -1
  186. package/server/{multipart-parser-R-oC8dQg.js → multipart-parser-CL5QG8iv.js} +2 -2
  187. package/server/{no-resume-mode-BgD0JUmM.js → no-resume-mode-DUR7Hi98.js} +1 -1
  188. package/server/node_modules/.package-lock.json +7 -7
  189. package/server/node_modules/brace-expansion/README.md +23 -1
  190. package/server/node_modules/brace-expansion/index.js +206 -85
  191. package/server/node_modules/brace-expansion/package.json +1 -1
  192. package/server/node_modules/msgpackr/dist/index-no-eval.cjs +34 -28
  193. package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
  194. package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
  195. package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
  196. package/server/node_modules/msgpackr/dist/index.js +34 -28
  197. package/server/node_modules/msgpackr/dist/index.js.map +1 -1
  198. package/server/node_modules/msgpackr/dist/index.min.js +1 -1
  199. package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
  200. package/server/node_modules/msgpackr/dist/node.cjs +36 -29
  201. package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
  202. package/server/node_modules/msgpackr/dist/test.js +63 -32
  203. package/server/node_modules/msgpackr/dist/test.js.map +1 -1
  204. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +34 -28
  205. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
  206. package/server/node_modules/msgpackr/package.json +1 -1
  207. package/server/node_modules/msgpackr/unpack.js +34 -28
  208. package/server/{orphan-proposed-reconciler-DcgTPPFY.js → orphan-proposed-reconciler-CEW1maPl.js} +1 -1
  209. package/server/{orphan-proposed-reconciler-B6vJHxtX.js → orphan-proposed-reconciler-DfqHZftT.js} +23 -22
  210. package/server/package-lock.json +8 -8
  211. package/server/package.json +1 -1
  212. package/server/{pan-dir-DMzF5wne.js → pan-dir-DhgKfO86.js} +21 -6
  213. package/server/{paths-sJBSb7Ul.js → paths-BUuhi6jM.js} +17 -17
  214. package/server/{pending-lifecycle-claim-DilzGfgk.js → pending-lifecycle-claim-DJlA1rTR.js} +2 -2
  215. package/server/{persistent-logger-H_VjuOu7.js → persistent-logger-s8cbpFNV.js} +2 -2
  216. package/server/{pickup-DWhqzliO.js → pickup-2AxtB3dW.js} +1 -1
  217. package/server/{pipeline-membership-C88VBnhJ.js → pipeline-membership-2_okL5bm.js} +1 -1
  218. package/server/{pipeline-membership-D9SBvItj.js → pipeline-membership-Dqv6_0ig.js} +1 -1
  219. package/server/{pipeline-membership-gather-4eR-7Tqy.js → pipeline-membership-gather-4F1-tXKI.js} +1 -1
  220. package/server/{pipeline-membership-gather-CeVGnNJ2.js → pipeline-membership-gather-CtJ_7aGf.js} +149 -17
  221. package/server/{pipeline-notifier-DT6xLFao.js → pipeline-notifier-CO9rxJgB.js} +1 -1
  222. package/server/{pipeline-notifier-D0ALV6Nw.js → pipeline-notifier-DDfVBJhJ.js} +2 -2
  223. package/server/{post-merge-lifecycle-worker-8HIeS_J6.js → post-merge-lifecycle-worker-DmSOkeNp.js} +3 -3
  224. package/server/{project-pipelines-9SKt2bEc.js → project-pipelines-72WE8GVK.js} +2 -2
  225. package/server/{project-repos-B5pIphKg.js → project-repos-BAqDwtvi.js} +16 -11
  226. package/server/project-repos-Df90Zw7Y.js +3 -0
  227. package/server/projects-WqMWCdpa.js +3 -0
  228. package/server/{prompts-CgzMBvQF.js → prompts-XkL10m8M.js} +2 -2
  229. package/server/{providers-BJQSnAAp.js → providers-ClGPGkQ8.js} +15 -12
  230. package/server/providers-DFUOed8u.js +3 -0
  231. package/server/public/assets/{chunk-BO2N2NFS-D_pGACYN.js → chunk-BO2N2NFS-CeQUdPxr.js} +4 -4
  232. package/server/public/assets/{diagram-OG6HWLK6-BO6fe3hH.js → diagram-OG6HWLK6-B7rgk4yT.js} +1 -1
  233. package/server/public/assets/{dist-5zingMiA.js → dist-2RPazfXY.js} +3 -3
  234. package/server/public/assets/{dist-CVxhbI2E.js → dist-B9NInrVZ.js} +1 -1
  235. package/server/public/assets/{ganttDiagram-6RSMTGT7-Bgj4A7kp.js → ganttDiagram-6RSMTGT7-Bxp0gV14.js} +1 -1
  236. package/server/public/assets/{highlighted-body-OFNGDK62-DNPK7_cm.js → highlighted-body-OFNGDK62-CzoRTVlC.js} +1 -1
  237. package/server/public/assets/index-Cml-kHo6.css +1 -0
  238. package/server/public/assets/{index-DEpY-D1O.js → index-CvN8cEgs.js} +216 -215
  239. package/server/public/assets/{linear-BB0jQT16.js → linear-CFEEl3ND.js} +1 -1
  240. package/server/public/assets/mermaid-GHXKKRXX-CpV7nCBM.js +1 -0
  241. package/server/public/assets/{pieDiagram-4H26LBE5-DeGIzzpZ.js → pieDiagram-4H26LBE5-BeR8R0cr.js} +1 -1
  242. package/server/public/assets/{prod-XBLvikex.js → prod-CYjzjCrn.js} +4 -4
  243. package/server/public/assets/{quadrantDiagram-W4KKPZXB-BV9SLeWz.js → quadrantDiagram-W4KKPZXB-BpcTkFuW.js} +1 -1
  244. package/server/public/assets/{sankeyDiagram-5OEKKPKP-Dwja0gj8.js → sankeyDiagram-5OEKKPKP-Bx2ETEV5.js} +1 -1
  245. package/server/public/assets/{xychartDiagram-2RQKCTM6-DCB4qvfw.js → xychartDiagram-2RQKCTM6-BKgEAFaj.js} +1 -1
  246. package/server/public/index.html +2 -2
  247. package/server/{pull-requests-7BgLDsIo.js → pull-requests-B-KrUph5.js} +3 -3
  248. package/server/{pull-requests-Dq0y6IxE.js → pull-requests-DK5k92B4.js} +1 -1
  249. package/server/{queries-C-MUZaIy.js → queries-DVpl1vsU.js} +1212 -193
  250. package/server/{rally-CPysR4T_.js → rally-DbE561hD.js} +3 -3
  251. package/server/rally-O_st_X7n.js +3 -0
  252. package/server/{rally-api-8Ptlp2os.js → rally-api-CZLeEd2C.js} +2 -2
  253. package/server/{rally-api-CgosKdKL.js → rally-api-DaHtn5QN.js} +1 -1
  254. package/server/{rally-client-CCX0hADj.js → rally-client-C-MAl8ur.js} +1 -1
  255. package/server/{rally-client-iYMHWQD7.js → rally-client-Ch3zRsBX.js} +5 -5
  256. package/server/{reap-terminal-sessions-Qf-9LVQc.js → reap-terminal-sessions-C1n0ALRb.js} +2 -2
  257. package/server/{reap-terminal-sessions-4Xg9NGA8.js → reap-terminal-sessions-DegFS2p1.js} +2 -2
  258. package/server/{rebuild-stack-CMdgaylx.js → rebuild-stack-C9Li44A3.js} +20 -10
  259. package/server/{rebuild-stack-DqcOVmJO.js → rebuild-stack-qC0jCNm6.js} +2 -2
  260. package/server/{reconstruct-cache-CMZJ_Vjq.js → reconstruct-cache-BHyiAg02.js} +7 -7
  261. package/server/record-aVzu-LGm.js +3 -0
  262. package/server/record-update-CZh46a2f.js +617 -0
  263. package/server/{record-update-DhI7eySG.js → record-update-DtdJK2Iw.js} +1 -1
  264. package/server/recovery-trip-CSNWSLDn.js +77 -0
  265. package/server/recovery-trip-_16hFKv4.js +3 -0
  266. package/server/{release-engine-B2X9AfFC.js → release-engine-Be5MX5GP.js} +5 -5
  267. package/server/{release-set-G4XKyQ8K.js → release-set-DJv_O6PS.js} +3 -3
  268. package/server/{remote-BXarMvqf.js → remote-BMM3uH2J.js} +3 -3
  269. package/server/{remote-CUhyqjXk.js → remote-C0xVTHA5.js} +3 -3
  270. package/server/{remote-agents-CLZB3Coc.js → remote-agents-BIIoc5pD.js} +1 -1
  271. package/server/{remote-agents-Bba-MgSA.js → remote-agents-EUiZ26bj.js} +7 -7
  272. package/server/{remote-completion-CwAp79EC.js → remote-completion-BS4tJUn8.js} +13 -13
  273. package/server/resolver-BvHd6RE4.js +163 -0
  274. package/server/resume-9thEqAQR.js +3 -0
  275. package/server/{review-agent--pOptAEV.js → review-agent-BHGaBoBu.js} +29 -29
  276. package/server/{review-agent-BTCNkq2h.js → review-agent-CD3RQ-tc.js} +1 -1
  277. package/server/{review-artifacts-BNmw8dWE.js → review-artifacts-DyhajWso.js} +6 -6
  278. package/server/{review-context-DFxYOOJW.js → review-context-B-dlsPnx.js} +9 -9
  279. package/server/{review-convoy-liveness-BgU_1jJf.js → review-convoy-liveness-D7M-s_nS.js} +2 -2
  280. package/server/{review-status-Dma9SFaN.js → review-status-B6wYcOtP.js} +1 -1
  281. package/server/{review-status-CGvlA4o_.js → review-status-CKLk5aZ-.js} +308 -58
  282. package/server/{review-status-emit-DURrmGYX.js → review-status-emit-CJ7UmEVU.js} +3 -3
  283. package/server/{review-status-enrichment-8NiNXi5W.js → review-status-enrichment-DJRgGX7-.js} +3 -3
  284. package/server/review-status-limits-4EJDCGHO.js +7 -0
  285. package/server/{review-status-source-DIk1JSow.js → review-status-source-7nU3Z2wL.js} +1 -1
  286. package/server/{review-status-source-BLx_1siH.js → review-status-source-BsDYGfyv.js} +1 -1
  287. package/server/{review-status-sync-muT-EBp2.js → review-status-sync-BLssMTEW.js} +1 -1
  288. package/server/{review-status-sync-0GxOqeqF.js → review-status-sync-BxBeHRde.js} +35 -11
  289. package/server/{review-verdict-feedback-xJNdqBnX.js → review-verdict-feedback-5jWuzgpc.js} +90 -16
  290. package/server/{review-verdict-feedback-HwF6ODFy.js → review-verdict-feedback-HRY9P4bN.js} +1 -1
  291. package/server/{rollup-BQaol5TX.js → rollup-BGIrCEkU.js} +79 -44
  292. package/server/rollup-CZB4UL9q.js +3 -0
  293. package/server/{scanner-C-D2cFdX.js → scanner-DydjXPrz.js} +16 -9
  294. package/server/search-DdtIjAiu.js +395 -0
  295. package/server/{sequence-io-Bmf1EZM5.js → sequence-io-Fw-cLyDs.js} +4 -4
  296. package/server/{sequencer-agent-CigMyKh2.js → sequencer-agent-BcpGMt5x.js} +15 -10
  297. package/server/server.js +1258 -438
  298. package/server/{service-CD0DvFvD.js → service-BFFkGsG4.js} +58 -58
  299. package/server/{session-fork-B6cQ5eya.js → session-fork-D0V-3e5P.js} +2 -2
  300. package/server/{session-history-3ON_IJjm.js → session-history-Bta5l9jY.js} +5 -5
  301. package/server/{settings-PilbFZAM.js → settings-Ce8B1daF.js} +2 -2
  302. package/server/{settings-VN0qOh4U.js → settings-E3FnEIUx.js} +3 -3
  303. package/server/settings-eOOJpxi_.js +2 -0
  304. package/server/{shadow-engineering-DXvx77oE.js → shadow-engineering-Mt9nJO4i.js} +3 -3
  305. package/server/{shadow-state-CZBp7pwq.js → shadow-state-Bzj_AZCV.js} +1 -1
  306. package/server/{shadow-state-BBk_zacw.js → shadow-state-DrkhoVSx.js} +2 -2
  307. package/server/{shadow-utils-DdZ05AJS.js → shadow-utils-H1GfqP06.js} +2 -2
  308. package/server/{ship-log-7kJfjUX2.js → ship-log-CFUIo4PR.js} +1 -1
  309. package/server/{smart-compaction-8fA5k5XN.js → smart-compaction-DSTq-Wua.js} +1 -1
  310. package/server/{smart-compaction-ByhL9cRS.js → smart-compaction-Hzp3KCJX.js} +7 -7
  311. package/server/{spawn-planning-session-vLUJoFjy.js → spawn-planning-session-C0uSA2SL.js} +2 -2
  312. package/server/{spawn-planning-session-pcF-YeFE.js → spawn-planning-session-DN4son31.js} +23 -21
  313. package/server/{specialist-completion-B07XjWD2.js → specialist-completion-Cf6tpIh1.js} +1 -1
  314. package/server/{specialist-context-DJ-zFyL3.js → specialist-context-DEUEkjIQ.js} +5 -5
  315. package/server/{specialist-handoff-logger-aKSxbIgD.js → specialist-handoff-logger-D_LmQDj3.js} +2 -2
  316. package/server/{specialist-logs-Dae-n52_.js → specialist-logs-7Ynue0R7.js} +3 -3
  317. package/server/{specialists-KR3pKulN.js → specialists-CQwBEGlD.js} +1 -1
  318. package/server/{specialists-6PWdtWcg.js → specialists-DAjPgYs_.js} +504 -238
  319. package/server/{specialists-DUiExaxb.js → specialists-Hr6iW9fU.js} +18 -18
  320. package/server/{specialists-Bz-wFT7R.js → specialists-MOoeB4A8.js} +1 -1
  321. package/server/specs-Dl88cbKY.js +3 -0
  322. package/server/{src-B948bGVR.js → src-BYdwL_n-.js} +668 -64
  323. package/server/{src-vHy2-oCv.js → src-DQnkPN2i.js} +3 -3
  324. package/server/{src-rac0Mepv.js → src-DhfDV0o4.js} +6 -6
  325. package/server/{stack-health-DqLTiEu4.js → stack-health-D_iKwNRg.js} +107 -16
  326. package/server/stack-health-deVSdDwn.js +3 -0
  327. package/server/{stale-task-claims-Cab_Fo_Z.js → stale-task-claims-BYJGqhLI.js} +5 -5
  328. package/server/{staleness-CGTZyp6V.js → staleness-CopBDKnA.js} +1 -1
  329. package/server/{staleness-C-a5rBxF.js → staleness-D8WeMUHd.js} +1 -1
  330. package/server/{state-home-722Dkx92.js → state-home-DjN8qduI.js} +24 -3
  331. package/server/{state-mapping-CybR81Uf.js → state-mapping-DlM7OYRW.js} +1 -1
  332. package/server/{state-migrate-2u8wIpoL.js → state-migrate-a2p1gtD7.js} +4 -4
  333. package/server/state-mirror-Cv_XgvT5.js +121 -0
  334. package/server/{stuck-remediation-r1TJu68G.js → stuck-remediation-CXJX_kki.js} +1 -1
  335. package/server/{stuck-remediation-CC6q3eqQ.js → stuck-remediation-CbCRSz1v.js} +31 -732
  336. package/server/{substrate-bug-weights-service-CzIyyWFT.js → substrate-bug-weights-service-DxpopNd9.js} +3 -3
  337. package/server/{summary-fork-BqgmgPDt.js → summary-fork-B61fjRJn.js} +2 -2
  338. package/server/{summary-fork-Df2WFijM.js → summary-fork-B9pszUJN.js} +91 -10
  339. package/server/supervisor/{injection-budget-Cg_KIb3o.js → injection-budget-Ar7hgyJq.js} +1 -1
  340. package/server/supervisor/pty-supervisor.js +12 -3
  341. package/server/supervisor/{pty-token-BbjwEUUM.js → pty-token-CXCFU0Z8.js} +1 -1
  342. package/server/{supervisor-BxqSpjcN.js → supervisor-BvnxbuuF.js} +6 -4
  343. package/server/supervisor-C69kpqvd.js +2 -0
  344. package/server/{swarm-readiness-DfFxa9-n.js → swarm-readiness-vTw1kqGa.js} +3 -3
  345. package/server/{system-prerequisites-ICLSkhhZ.js → system-prerequisites-LLzTEqsK.js} +3 -3
  346. package/server/{teardown-workspace-DRdi_CPa.js → teardown-workspace-CqKKVJr1.js} +15 -15
  347. package/server/{test-agent-queue-A_-p-i0I.js → test-agent-queue-CWMq7oyG.js} +8 -7
  348. package/server/{test-verdict-BHgTAwIG.js → test-verdict-NdtgRBuA.js} +1 -1
  349. package/server/{test-verdict-C4i9aqEP.js → test-verdict-diIWE6hz.js} +15 -3
  350. package/server/{tldr-daemon-CvWXBhX1.js → tldr-daemon-B1Jhrtc8.js} +1 -1
  351. package/server/{tldr-daemon-wvsU6bKv.js → tldr-daemon-Bpls1CJB.js} +2 -2
  352. package/server/{tmux-CfDHob9M.js → tmux-CImZaX4q.js} +10 -16
  353. package/server/tmux-Cjpx8L8u.js +4 -0
  354. package/server/{token-DrxwytsZ.js → token-Bgpjo3tE.js} +2 -2
  355. package/server/token-util-BsjFll-k.js +3 -0
  356. package/server/{token-util-B48BlCba.js → token-util-BymbpkJp.js} +1 -1
  357. package/server/{tracker-config-BcPMElRB.js → tracker-config-4DaKVTfc.js} +2 -2
  358. package/server/{tracker-utils-CJ6BHjcD.js → tracker-utils-BDeAXC-q.js} +2 -2
  359. package/server/{traefik-connect-DZ6nMYMj.js → traefik-connect-CC5FyxYj.js} +1 -1
  360. package/server/{tunnel-Bp-dRHZz.js → tunnel-CDWkeceJ.js} +1 -1
  361. package/server/{tunnel-DUbUPElU.js → tunnel-CPf5M-Pc.js} +3 -3
  362. package/server/{typed-errors-DyjseiB6.js → typed-errors-9K7Dq_Vn.js} +1 -1
  363. package/server/{typed-errors-CKeoDdU3.js → typed-errors-DrS5fb5z.js} +1 -1
  364. package/server/{types-Cm5ASJbq.js → types-DzlUKiuf.js} +4 -3
  365. package/server/{types-Di8wdakq.js → types-kI9ik8XO.js} +1 -1
  366. package/server/{uat-promote-verification-CoJuh7XO.js → uat-promote-verification-c_pxoxEc.js} +5 -5
  367. package/server/{uat-train-4Q0k06CQ.js → uat-train-CWGxBdJO.js} +0 -0
  368. package/server/{uat-train-Dewoatps.js → uat-train-CfCYd2ve.js} +1 -1
  369. package/server/{validate-B0C8p66t.js → validate-f3ItVCfm.js} +3 -3
  370. package/server/{validation-hVOwQk8T.js → validation-5G_wQtea.js} +1 -1
  371. package/server/{validation-B_kIRfNe.js → validation-7tSiCM82.js} +4 -4
  372. package/server/{verification-artifact-BxlxTiYK.js → verification-artifact-9h9dH8uX.js} +1 -1
  373. package/server/{verification-artifact-D70AtckY.js → verification-artifact-C_4WJnf6.js} +1 -1
  374. package/server/{verification-runner-Bc3cJvpC.js → verification-runner-BV5F6wrA.js} +1 -1
  375. package/server/{verification-runner-KZTz6u72.js → verification-runner-D58KmBhK.js} +18 -38
  376. package/server/{vtt-parser-CE_i3Bcw.js → vtt-parser-2iT9OHa9.js} +1 -1
  377. package/server/{work-agent-prompt-ByrPAzOy.js → work-agent-prompt-D03s4DD1.js} +9 -9
  378. package/server/{workflows-D0vP1WrK.js → workflows-BMBwLYPV.js} +281 -98
  379. package/server/workflows-BOmWGpIh.js +2 -0
  380. package/server/{workspace-DQkRPLlQ.js → workspace-BgflNCH0.js} +3 -3
  381. package/server/{workspace-COWvdibH.js → workspace-Cn9ywfSW.js} +1 -1
  382. package/server/{workspace-anchor-drift-pwz23TI1.js → workspace-anchor-drift-C8Fy3shi.js} +1 -1
  383. package/server/{workspace-anchor-drift-DXYIAHzr.js → workspace-anchor-drift-CMiNncwq.js} +5 -8
  384. package/server/{workspace-config-BdZM4PvZ.js → workspace-config-aUc2nIz6.js} +1 -1
  385. package/server/{workspace-manager-BPgTrG66.js → workspace-manager-Bem7ZBs9.js} +521 -292
  386. package/server/workspace-manager-C0CpNh3t.js +3 -0
  387. package/server/{workspace-metadata-CdjzAP8x.js → workspace-metadata-C5iSlPRo.js} +1 -1
  388. package/server/{workspace-metadata-DkO_iTLo.js → workspace-metadata-UKmTYmDQ.js} +2 -2
  389. package/server/{workspaces-CRBJikLp.js → workspaces-DqxgwDZ8.js} +143 -113
  390. package/sync-sources/hooks/notification-hook +12 -1
  391. package/sync-sources/hooks/pan-hook-lib.sh +226 -0
  392. package/sync-sources/hooks/session-start-hook +31 -4
  393. package/sync-sources/hooks/work-agent-stop-hook +23 -1
  394. package/sync-sources/skills/pan-memory/SKILL.md +19 -3
  395. package/sync-sources/skills/pan-projects/SKILL.md +9 -0
  396. package/sync-sources/skills/pan-restart/SKILL.md +26 -7
  397. package/sync-sources/skills/pan-workspace/SKILL.md +77 -0
  398. package/server/activity-logger-CMthG6Vd.js +0 -3
  399. package/server/agent-state-CYXJVG72.js +0 -3
  400. package/server/agents-ePFVoZbu.js +0 -3
  401. package/server/archive-planning-B2XplFzT.js +0 -2
  402. package/server/cli-CjOCSnfj.js +0 -3
  403. package/server/deacon-swarm-B1XkIvfr.js +0 -2
  404. package/server/delivery-BX9HR4wQ.js +0 -3
  405. package/server/dist-B3YPQa5A.js +0 -3
  406. package/server/event-store-5UKzh9Jf.js +0 -3
  407. package/server/forge-B5o319qI.js +0 -3
  408. package/server/fts-db-IVc4_M3f.js +0 -146
  409. package/server/hume-VUCNbTgn.js +0 -3
  410. package/server/inspect-agent-CUwVmr2h.js +0 -2
  411. package/server/merge-ops-1abz6O_P.js +0 -2
  412. package/server/merge-rebase-CJJVAJuz.js +0 -2
  413. package/server/node_modules/brace-expansion/.tap/coverage/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -757
  414. package/server/node_modules/brace-expansion/.tap/processinfo/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -719
  415. package/server/node_modules/brace-expansion/ADVISORY-CVE-2026-14257.md +0 -107
  416. package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts +0 -8
  417. package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts.map +0 -1
  418. package/server/node_modules/brace-expansion/dist/commonjs/index.js +0 -263
  419. package/server/node_modules/brace-expansion/dist/commonjs/index.js.map +0 -1
  420. package/server/node_modules/brace-expansion/dist/commonjs/package.json +0 -3
  421. package/server/node_modules/brace-expansion/dist/esm/index.d.ts +0 -8
  422. package/server/node_modules/brace-expansion/dist/esm/index.d.ts.map +0 -1
  423. package/server/node_modules/brace-expansion/dist/esm/index.js +0 -259
  424. package/server/node_modules/brace-expansion/dist/esm/index.js.map +0 -1
  425. package/server/node_modules/brace-expansion/dist/esm/package.json +0 -3
  426. package/server/project-repos-DPjOdfPa.js +0 -3
  427. package/server/projects-_n3Zui6K.js +0 -3
  428. package/server/providers-BI1mOBQ4.js +0 -3
  429. package/server/public/assets/index-Ddkcz3WT.css +0 -1
  430. package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +0 -1
  431. package/server/rally-D_VW4bJv.js +0 -3
  432. package/server/record-BTwWhtBb.js +0 -3
  433. package/server/record-update-DaOKS7Wb.js +0 -277
  434. package/server/recovery-trip-DDH-02ng.js +0 -44
  435. package/server/resume-mOREjlYu.js +0 -3
  436. package/server/rollup-BR4t_wck.js +0 -3
  437. package/server/settings-CVmWiJ-r.js +0 -2
  438. package/server/specs--enInima.js +0 -3
  439. package/server/stack-health-BikqHSjn.js +0 -3
  440. package/server/supervisor-B4anCCSm.js +0 -2
  441. package/server/tmux-Ctk6RV5l.js +0 -3
  442. package/server/token-util-D411CAq9.js +0 -3
  443. package/server/workflows-DtDX08ed.js +0 -2
  444. 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 -qiE '(permission|approval|allow.*tool|confirm.*tool)'; then
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
- curl -s -m 0.5 -o /dev/null -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
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
- if [ "$SOURCE" = "compact" ] && command -v jq >/dev/null 2>&1; then
83
- jq -n --arg 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." \
84
- '{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext: $context}}'
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
- RESULT=$(echo "$ANALYSIS_PROMPT" | claude -p --model "$COMPLETION_MODEL" 2>>"$CLAUDE_STDERR")
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 <issue> [--project <id>] [--json]
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 <issue> [--project <id>] [--date <yyyy-mm-dd>] [--json]
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` (dashboard)
42
- or port binding (CLIProxy) to succeed before reporting `✓`, and exits non-zero
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 both `repoRoot` and `mode` from
53
- `GET /api/health`. If another server holds the port, the command reports
54
- `port held by non-primary server (cwd=…, mode=…)`; a 200 response from the wrong
55
- server is a failure, not a successful restart.
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 { i as emitActivityTtsSync, o as init_activity_logger, r as emitActivityEntrySync } from "./activity-logger-CyteR4JO.js";
2
- init_activity_logger();
3
- export { emitActivityEntrySync, emitActivityTtsSync };
@@ -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 };
@@ -1,2 +0,0 @@
1
- import { i as findWorkspacePath } from "./archive-planning-BwhxeP7C.js";
2
- export { findWorkspacePath };
@@ -1,3 +0,0 @@
1
- import { r as init_cli, t as createResetMarker } from "./cli-Cte9ZFGn.js";
2
- init_cli();
3
- export { createResetMarker };
@@ -1,2 +0,0 @@
1
- import { r as coordinateSwarmSlots } from "./deacon-swarm-v5PMun-m.js";
2
- export { coordinateSwarmSlots };
@@ -1,3 +0,0 @@
1
- import { It as init_delivery, Mt as deliverAgentMessage } from "./queries-C-MUZaIy.js";
2
- init_delivery();
3
- export { deliverAgentMessage };
@@ -1,3 +0,0 @@
1
- import { t as require_dist } from "./dist-C3A8B8wM.js";
2
- export default require_dist();
3
- export {};
@@ -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 };
@@ -1,3 +0,0 @@
1
- import { n as getForgeAdapter, r as init_forge } from "./forge-BaKGCya6.js";
2
- init_forge();
3
- export { getForgeAdapter };