@overdeck/desktop 0.45.24 → 0.47.0

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