@indigoai-us/hq-cli 5.314.0 → 5.316.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 (1193) hide show
  1. package/CHANGELOG.md +4320 -1
  2. package/README.md +113 -0
  3. package/assets/bot-workers/setup/context/USER-GUIDE.md +404 -0
  4. package/assets/bot-workers/setup/context/quick-reference.md +199 -0
  5. package/assets/bot-workers/setup/skills/agents-and-team.md +167 -0
  6. package/assets/bot-workers/setup/skills/explain-hq.md +35 -0
  7. package/assets/bot-workers/setup/skills/first-company.md +74 -0
  8. package/assets/bot-workers/setup/skills/joining-a-team.md +125 -0
  9. package/assets/bot-workers/setup/skills/pricing.md +92 -0
  10. package/assets/bot-workers/setup/skills/standing-help.md +81 -0
  11. package/assets/bot-workers/setup/skills/your-business.md +281 -0
  12. package/assets/bot-workers/setup/worker.yaml +791 -0
  13. package/assets/lanes-hooks/hq-lanes-drain.json +15 -0
  14. package/assets/lanes-hooks/hq-lanes-drain.mjs +275 -0
  15. package/assets/lanes-hooks/hq-lanes-drain.sh +21 -0
  16. package/assets/lanes-reconcile/hq-lanes-reconcile.service +11 -0
  17. package/assets/lanes-reconcile/hq-lanes-reconcile.timer +12 -0
  18. package/assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh +485 -0
  19. package/assets/scaffold/core/scripts/audit-log.sh +384 -0
  20. package/assets/scaffold/core/scripts/checkpoint-stop-gate.sh +281 -43
  21. package/assets/scaffold/core/scripts/clean-worktree-reconcile-handoff.sh +171 -0
  22. package/assets/scaffold/core/scripts/detect-stale-review-base.sh +199 -0
  23. package/assets/scaffold/core/scripts/eval-trigger.sh +193 -0
  24. package/assets/scaffold/core/scripts/git-pack-extension-check.sh +164 -0
  25. package/assets/scaffold/core/scripts/handoff-finalize.sh +688 -0
  26. package/assets/scaffold/core/scripts/handoff-open-steps.sh +81 -0
  27. package/assets/scaffold/core/scripts/handoff-post.sh +252 -0
  28. package/assets/scaffold/core/scripts/hook-lib.sh +345 -50
  29. package/assets/scaffold/core/scripts/hq-delegate-bundle.sh +307 -0
  30. package/assets/scaffold/core/scripts/hq-delegate-grant.sh +252 -0
  31. package/assets/scaffold/core/scripts/hq-delegate-pickup.sh +99 -0
  32. package/assets/scaffold/core/scripts/hq-delegate-publish.sh +91 -0
  33. package/assets/scaffold/core/scripts/hq-delegate-repo.sh +158 -0
  34. package/assets/scaffold/core/scripts/hq-delegate-resolve.sh +145 -0
  35. package/assets/scaffold/core/scripts/hq-delegate-secrets.sh +129 -0
  36. package/assets/scaffold/core/scripts/hq-delegate-send.sh +259 -0
  37. package/assets/scaffold/core/scripts/hq-delegate-transfer.sh +175 -0
  38. package/assets/scaffold/core/scripts/hq-delegate-verify.sh +238 -0
  39. package/assets/scaffold/core/scripts/hq-dm-bind.sh +585 -0
  40. package/assets/scaffold/core/scripts/hq-job-notify.sh +389 -0
  41. package/assets/scaffold/core/scripts/hq-job-probe.sh +835 -0
  42. package/assets/scaffold/core/scripts/hq-job-remediate.sh +359 -0
  43. package/assets/scaffold/core/scripts/hq-job-run.sh +1025 -0
  44. package/assets/scaffold/core/scripts/hq-pin.sh +118 -0
  45. package/assets/scaffold/core/scripts/hq-session.sh +184 -23
  46. package/assets/scaffold/core/scripts/jobs-schedule-parse.sh +310 -0
  47. package/assets/scaffold/core/scripts/jobs-validate.sh +451 -0
  48. package/assets/scaffold/core/scripts/knowledge-prefs.sh +55 -0
  49. package/assets/scaffold/core/scripts/lib/portable.sh +211 -0
  50. package/assets/scaffold/core/scripts/lib/secret-patterns.sh +58 -0
  51. package/assets/scaffold/core/scripts/lib/session-id.sh +3 -2
  52. package/assets/scaffold/core/scripts/lib/session-scope-capability.sh +1 -1
  53. package/assets/scaffold/core/scripts/lib/work-mesh-enqueue.sh +2 -1
  54. package/assets/scaffold/core/scripts/lib/work-mesh-live-hook.sh +378 -0
  55. package/assets/scaffold/core/scripts/lib/work-mesh-live-rebind.sh +141 -0
  56. package/assets/scaffold/core/scripts/migrate-policy-triggers.sh +378 -0
  57. package/assets/scaffold/core/scripts/ontology-audience-grant.sh +81 -0
  58. package/assets/scaffold/core/scripts/ontology-brief.mjs +93 -0
  59. package/assets/scaffold/core/scripts/ontology-candidate.sh +100 -0
  60. package/assets/scaffold/core/scripts/ontology-garden.mjs +238 -0
  61. package/assets/scaffold/core/scripts/ontology-source-worklist.sh +79 -0
  62. package/assets/scaffold/core/scripts/outpost-jobs-reconcile.sh +834 -0
  63. package/assets/scaffold/core/scripts/policy-age-report.sh +156 -0
  64. package/assets/scaffold/core/scripts/policy-retire.sh +199 -0
  65. package/assets/scaffold/core/scripts/qmd-reindex-after-sync.sh +10 -87
  66. package/assets/scaffold/core/scripts/qmd-reindex-bg.sh +40 -0
  67. package/assets/scaffold/core/scripts/read-policy-frontmatter.sh +32 -0
  68. package/assets/scaffold/core/scripts/rebuild-company-knowledge-index.sh +36 -3
  69. package/assets/scaffold/core/scripts/rebuild-projects-index.sh +99 -12
  70. package/assets/scaffold/core/scripts/refresh-vault-access.sh +188 -0
  71. package/assets/scaffold/core/scripts/register-project.sh +262 -0
  72. package/assets/scaffold/core/scripts/repo-run-registry.sh +408 -0
  73. package/assets/scaffold/core/scripts/resolve-company.sh +199 -0
  74. package/assets/scaffold/core/scripts/resume-thread-lock.sh +285 -0
  75. package/assets/scaffold/core/scripts/share-suggestion-state.sh +541 -0
  76. package/assets/scaffold/core/scripts/source-yaml-validate.sh +36 -0
  77. package/assets/scaffold/core/scripts/token-usage-report.sh +81 -20
  78. package/assets/scaffold/core/scripts/verify-story-deliverables.sh +148 -0
  79. package/assets/scaffold/core/scripts/work-mesh-live-bind-trusted.sh +152 -0
  80. package/assets/scaffold/core/scripts/work-mesh-live-rebind.sh +59 -0
  81. package/assets/scaffold/core/scripts/worktree-gc.sh +362 -0
  82. package/contracts/preflight/v1/fixtures.json +87 -0
  83. package/contracts/preflight/v1/schema.json +58 -0
  84. package/dist/bin/hq-auth-refresh.d.ts +2 -0
  85. package/dist/bin/hq-auth-refresh.js +12 -6
  86. package/dist/command-catalog.generated.d.ts +10798 -0
  87. package/dist/command-catalog.generated.js +13915 -0
  88. package/dist/command-registration-plan.d.ts +474 -0
  89. package/dist/command-registration-plan.js +136 -0
  90. package/dist/commands/__fixtures__/access-vault.d.ts +2 -0
  91. package/dist/commands/__fixtures__/access-vault.js +1 -1
  92. package/dist/commands/_patterns.d.ts +16 -0
  93. package/dist/commands/_patterns.js +20 -3
  94. package/dist/commands/access.d.ts +2 -1
  95. package/dist/commands/access.js +58 -49
  96. package/dist/commands/agent-enroll.d.ts +146 -0
  97. package/dist/commands/agent-enroll.js +401 -0
  98. package/dist/commands/agent-inbox.d.ts +9 -0
  99. package/dist/commands/agent-inbox.js +102 -0
  100. package/dist/commands/agent-kit.d.ts +87 -0
  101. package/dist/commands/agent-kit.js +480 -0
  102. package/dist/commands/agent-mcp.d.ts +24 -0
  103. package/dist/commands/agent-mcp.js +127 -0
  104. package/dist/commands/agent-probe.d.ts +77 -0
  105. package/dist/commands/agent-probe.js +335 -0
  106. package/dist/commands/agent.d.ts +13 -0
  107. package/dist/commands/agent.js +40 -0
  108. package/dist/commands/agents.d.ts +106 -4
  109. package/dist/commands/agents.js +924 -45
  110. package/dist/commands/auth.d.ts +1 -0
  111. package/dist/commands/auth.js +189 -19
  112. package/dist/commands/billing-sponsor.d.ts +83 -0
  113. package/dist/commands/billing-sponsor.js +344 -0
  114. package/dist/commands/billing.d.ts +3 -0
  115. package/dist/commands/billing.js +6 -1
  116. package/dist/commands/bot-companies.d.ts +40 -0
  117. package/dist/commands/bot-companies.js +64 -0
  118. package/dist/commands/bot-continuity.d.ts +28 -0
  119. package/dist/commands/bot-continuity.js +68 -0
  120. package/dist/commands/bot-jobs.d.ts +131 -0
  121. package/dist/commands/bot-jobs.js +474 -0
  122. package/dist/commands/bot.d.ts +278 -0
  123. package/dist/commands/bot.js +1982 -0
  124. package/dist/commands/channels.js +56 -1
  125. package/dist/commands/cloud-demote.js +3 -2
  126. package/dist/commands/cloud-provision.d.ts +14 -0
  127. package/dist/commands/cloud-provision.js +232 -58
  128. package/dist/commands/cloud-retire.d.ts +51 -0
  129. package/dist/commands/cloud-retire.js +154 -0
  130. package/dist/commands/cloud.d.ts +49 -15
  131. package/dist/commands/cloud.js +357 -122
  132. package/dist/commands/company-rename-flag.d.ts +4 -0
  133. package/dist/commands/company-rename-flag.js +7 -0
  134. package/dist/commands/company-rename.d.ts +4 -0
  135. package/dist/commands/company-rename.js +90 -0
  136. package/dist/commands/company-transfer.d.ts +4 -28
  137. package/dist/commands/company-transfer.js +5 -49
  138. package/dist/commands/company.js +68 -3
  139. package/dist/commands/core-audit-log-native.d.ts +9 -0
  140. package/dist/commands/core-audit-log-native.js +257 -0
  141. package/dist/commands/core-checkpoint-gate-setting.d.ts +59 -0
  142. package/dist/commands/core-checkpoint-gate-setting.js +163 -0
  143. package/dist/commands/core-checkpoint-stop-gate-native.d.ts +34 -0
  144. package/dist/commands/core-checkpoint-stop-gate-native.js +725 -0
  145. package/dist/commands/core-checkpoint.d.ts +19 -9
  146. package/dist/commands/core-checkpoint.js +301 -37
  147. package/dist/commands/core-command-catalog.d.ts +34 -0
  148. package/dist/commands/core-command-catalog.js +62 -0
  149. package/dist/commands/core-company-index-scope-flag.d.ts +3 -0
  150. package/dist/commands/core-company-index-scope-flag.js +6 -0
  151. package/dist/commands/core-delegate-w1b.d.ts +10 -0
  152. package/dist/commands/core-delegate-w1b.js +1219 -0
  153. package/dist/commands/core-delegate.d.ts +46 -0
  154. package/dist/commands/core-delegate.js +1040 -0
  155. package/dist/commands/core-detect-stale-review-base-native.d.ts +23 -0
  156. package/dist/commands/core-detect-stale-review-base-native.js +178 -0
  157. package/dist/commands/core-dm-bind-native.d.ts +32 -0
  158. package/dist/commands/core-dm-bind-native.js +668 -0
  159. package/dist/commands/core-eval-trigger-native.d.ts +4 -0
  160. package/dist/commands/core-eval-trigger-native.js +12 -0
  161. package/dist/commands/core-git-pack-extension-check-native.d.ts +22 -0
  162. package/dist/commands/core-git-pack-extension-check-native.js +190 -0
  163. package/dist/commands/core-handoff-fast.d.ts +18 -0
  164. package/dist/commands/core-handoff-fast.js +104 -0
  165. package/dist/commands/core-handoff-open-steps.d.ts +21 -0
  166. package/dist/commands/core-handoff-open-steps.js +264 -0
  167. package/dist/commands/core-handoff.d.ts +24 -0
  168. package/dist/commands/core-handoff.js +1144 -0
  169. package/dist/commands/core-hook-state-helpers-native.d.ts +11 -0
  170. package/dist/commands/core-hook-state-helpers-native.js +74 -0
  171. package/dist/commands/core-hq-session-native.d.ts +39 -0
  172. package/dist/commands/core-hq-session-native.js +579 -0
  173. package/dist/commands/core-job-native-utils.d.ts +6 -0
  174. package/dist/commands/core-job-native-utils.js +80 -0
  175. package/dist/commands/core-job-native.d.ts +5 -0
  176. package/dist/commands/core-job-native.js +16 -0
  177. package/dist/commands/core-job-notify-native.d.ts +36 -0
  178. package/dist/commands/core-job-notify-native.js +359 -0
  179. package/dist/commands/core-job-probe-native.d.ts +45 -0
  180. package/dist/commands/core-job-probe-native.js +564 -0
  181. package/dist/commands/core-job-remediate-native.d.ts +26 -0
  182. package/dist/commands/core-job-remediate-native.js +374 -0
  183. package/dist/commands/core-job-remote-launcher.d.ts +7 -0
  184. package/dist/commands/core-job-remote-launcher.js +51 -0
  185. package/dist/commands/core-job-run-native.d.ts +47 -0
  186. package/dist/commands/core-job-run-native.js +1215 -0
  187. package/dist/commands/core-jobs-native.d.ts +25 -0
  188. package/dist/commands/core-jobs-native.js +1339 -0
  189. package/dist/commands/core-knowledge-prefs.d.ts +11 -0
  190. package/dist/commands/core-knowledge-prefs.js +137 -0
  191. package/dist/commands/core-migrate-policy-triggers-native.d.ts +21 -0
  192. package/dist/commands/core-migrate-policy-triggers-native.js +374 -0
  193. package/dist/commands/core-native-handoff-flag.d.ts +4 -0
  194. package/dist/commands/core-native-handoff-flag.js +7 -0
  195. package/dist/commands/core-native-hook-helper-commands.d.ts +4 -0
  196. package/dist/commands/core-native-hook-helper-commands.js +56 -0
  197. package/dist/commands/core-native-hook-helpers-flag.d.ts +4 -0
  198. package/dist/commands/core-native-hook-helpers-flag.js +7 -0
  199. package/dist/commands/core-native-jobs-flag.d.ts +4 -0
  200. package/dist/commands/core-native-jobs-flag.js +7 -0
  201. package/dist/commands/core-native-policy-flag.d.ts +9 -0
  202. package/dist/commands/core-native-policy-flag.js +12 -0
  203. package/dist/commands/core-native-session-flag.d.ts +4 -0
  204. package/dist/commands/core-native-session-flag.js +7 -0
  205. package/dist/commands/core-native-utilities-flag.d.ts +4 -0
  206. package/dist/commands/core-native-utilities-flag.js +7 -0
  207. package/dist/commands/core-native-utilities.d.ts +29 -0
  208. package/dist/commands/core-native-utilities.js +54 -0
  209. package/dist/commands/core-native-worker-skills-flag.d.ts +4 -0
  210. package/dist/commands/core-native-worker-skills-flag.js +7 -0
  211. package/dist/commands/core-ontology-native.d.ts +17 -0
  212. package/dist/commands/core-ontology-native.js +916 -0
  213. package/dist/commands/core-ontology.d.ts +66 -0
  214. package/dist/commands/core-ontology.js +430 -0
  215. package/dist/commands/core-pin-native.d.ts +14 -0
  216. package/dist/commands/core-pin-native.js +236 -0
  217. package/dist/commands/core-policy-frontmatter.d.ts +8 -0
  218. package/dist/commands/core-policy-frontmatter.js +52 -0
  219. package/dist/commands/core-policy.d.ts +14 -0
  220. package/dist/commands/core-policy.js +1018 -0
  221. package/dist/commands/core-refresh-vault-access-native.d.ts +20 -0
  222. package/dist/commands/core-refresh-vault-access-native.js +229 -0
  223. package/dist/commands/core-register-project-native.d.ts +30 -0
  224. package/dist/commands/core-register-project-native.js +347 -0
  225. package/dist/commands/core-repo-run-registry-native.d.ts +19 -0
  226. package/dist/commands/core-repo-run-registry-native.js +357 -0
  227. package/dist/commands/core-resolve-company-command.d.ts +4 -0
  228. package/dist/commands/core-resolve-company-command.js +42 -0
  229. package/dist/commands/core-resolve-company-native.d.ts +28 -0
  230. package/dist/commands/core-resolve-company-native.js +408 -0
  231. package/dist/commands/core-share-suggestion-state-native.d.ts +18 -0
  232. package/dist/commands/core-share-suggestion-state-native.js +445 -0
  233. package/dist/commands/core-work-mesh-bind-trusted-native.d.ts +32 -0
  234. package/dist/commands/core-work-mesh-bind-trusted-native.js +190 -0
  235. package/dist/commands/core-work-mesh-live-rebind-native.d.ts +18 -0
  236. package/dist/commands/core-work-mesh-live-rebind-native.js +262 -0
  237. package/dist/commands/core-worker-lint-native.d.ts +4 -0
  238. package/dist/commands/core-worker-lint-native.js +160 -0
  239. package/dist/commands/core-worker-share-native.d.ts +4 -0
  240. package/dist/commands/core-worker-share-native.js +260 -0
  241. package/dist/commands/core-worker-skills-command.d.ts +8 -0
  242. package/dist/commands/core-worker-skills-command.js +33 -0
  243. package/dist/commands/core-worker-skills-runtime.d.ts +33 -0
  244. package/dist/commands/core-worker-skills-runtime.js +86 -0
  245. package/dist/commands/core.d.ts +4 -0
  246. package/dist/commands/core.js +282 -80
  247. package/dist/commands/crm.js +52 -3
  248. package/dist/commands/daemon.d.ts +63 -0
  249. package/dist/commands/daemon.js +877 -0
  250. package/dist/commands/db-provision.js +4 -4
  251. package/dist/commands/db-sql.js +7 -21
  252. package/dist/commands/deploy-comments.d.ts +3 -0
  253. package/dist/commands/deploy-comments.js +162 -0
  254. package/dist/commands/dm.d.ts +119 -12
  255. package/dist/commands/dm.js +388 -38
  256. package/dist/commands/doctor.d.ts +12 -0
  257. package/dist/commands/doctor.js +158 -12
  258. package/dist/commands/feedback.d.ts +6 -0
  259. package/dist/commands/feedback.js +86 -37
  260. package/dist/commands/files-browse.d.ts +32 -12
  261. package/dist/commands/files-browse.js +176 -60
  262. package/dist/commands/files.d.ts +17 -0
  263. package/dist/commands/files.js +300 -47
  264. package/dist/commands/group-grants.js +3 -2
  265. package/dist/commands/groups.js +6 -5
  266. package/dist/commands/index-cmd.d.ts +19 -1
  267. package/dist/commands/index-cmd.js +74 -7
  268. package/dist/commands/integrations-api.d.ts +15 -10
  269. package/dist/commands/integrations-api.js +27 -22
  270. package/dist/commands/integrations-connect.d.ts +51 -13
  271. package/dist/commands/integrations-connect.js +86 -71
  272. package/dist/commands/integrations-core.d.ts +6 -6
  273. package/dist/commands/integrations-core.js +25 -11
  274. package/dist/commands/integrations-import.d.ts +1 -1
  275. package/dist/commands/integrations-import.js +43 -24
  276. package/dist/commands/integrations-manage.js +20 -13
  277. package/dist/commands/integrations.d.ts +8 -0
  278. package/dist/commands/integrations.js +94 -7
  279. package/dist/commands/lanes-accounts.d.ts +28 -0
  280. package/dist/commands/lanes-accounts.js +595 -0
  281. package/dist/commands/lanes-autopilot.d.ts +11 -0
  282. package/dist/commands/lanes-autopilot.js +336 -0
  283. package/dist/commands/lanes-checks.d.ts +51 -0
  284. package/dist/commands/lanes-checks.js +941 -0
  285. package/dist/commands/lanes-hold.d.ts +43 -0
  286. package/dist/commands/lanes-hold.js +655 -0
  287. package/dist/commands/lanes-keep-alive-audit.d.ts +10 -0
  288. package/dist/commands/lanes-keep-alive-audit.js +19 -0
  289. package/dist/commands/lanes-kpis.d.ts +11 -0
  290. package/dist/commands/lanes-kpis.js +34 -0
  291. package/dist/commands/lanes-message.d.ts +9 -0
  292. package/dist/commands/lanes-message.js +946 -0
  293. package/dist/commands/lanes-move.d.ts +12 -0
  294. package/dist/commands/lanes-move.js +397 -0
  295. package/dist/commands/lanes-questions.d.ts +36 -0
  296. package/dist/commands/lanes-questions.js +1005 -0
  297. package/dist/commands/lanes-report.d.ts +11 -0
  298. package/dist/commands/lanes-report.js +333 -0
  299. package/dist/commands/lanes-resume.d.ts +6 -0
  300. package/dist/commands/lanes-resume.js +564 -0
  301. package/dist/commands/lanes-review.d.ts +10 -0
  302. package/dist/commands/lanes-review.js +56 -0
  303. package/dist/commands/lanes-shared.d.ts +449 -0
  304. package/dist/commands/lanes-shared.js +170 -0
  305. package/dist/commands/lanes-stories.d.ts +15 -0
  306. package/dist/commands/lanes-stories.js +347 -0
  307. package/dist/commands/lanes-watch.d.ts +7 -0
  308. package/dist/commands/lanes-watch.js +216 -0
  309. package/dist/commands/lanes.d.ts +149 -0
  310. package/dist/commands/lanes.js +9013 -0
  311. package/dist/commands/login.js +49 -6
  312. package/dist/commands/mcp-registration.d.ts +32 -25
  313. package/dist/commands/mcp-registration.js +256 -23
  314. package/dist/commands/mcp-status.js +1 -0
  315. package/dist/commands/meetings.js +55 -34
  316. package/dist/commands/members.js +5 -1
  317. package/dist/commands/mesh.d.ts +11 -0
  318. package/dist/commands/mesh.js +1086 -76
  319. package/dist/commands/monitor.d.ts +58 -0
  320. package/dist/commands/monitor.js +980 -0
  321. package/dist/commands/onboard-bot-membership.d.ts +32 -0
  322. package/dist/commands/onboard-bot-membership.js +40 -0
  323. package/dist/commands/onboard-create-identity.d.ts +26 -0
  324. package/dist/commands/onboard-create-identity.js +23 -0
  325. package/dist/commands/onboard-identity-guard.d.ts +1 -1
  326. package/dist/commands/onboard.js +24 -5
  327. package/dist/commands/outpost-pruner.d.ts +3 -0
  328. package/dist/commands/outpost-pruner.js +125 -0
  329. package/dist/commands/pack-install.js +3 -1
  330. package/dist/commands/packs.js +11 -1
  331. package/dist/commands/people.d.ts +4 -0
  332. package/dist/commands/people.js +37 -3
  333. package/dist/commands/personal-connector-settings-flag.d.ts +4 -0
  334. package/dist/commands/personal-connector-settings-flag.js +7 -0
  335. package/dist/commands/personal-targeted-push-flag.d.ts +4 -0
  336. package/dist/commands/personal-targeted-push-flag.js +7 -0
  337. package/dist/commands/personal-targeted-push-paths.d.ts +3 -0
  338. package/dist/commands/personal-targeted-push-paths.js +67 -0
  339. package/dist/commands/publish.d.ts +8 -1
  340. package/dist/commands/publish.js +17 -4
  341. package/dist/commands/reindex.js +56 -6
  342. package/dist/commands/report.d.ts +19 -0
  343. package/dist/commands/report.js +537 -0
  344. package/dist/commands/rescue.d.ts +4 -0
  345. package/dist/commands/rescue.js +27 -17
  346. package/dist/commands/run-feature-telemetry.d.ts +3 -0
  347. package/dist/commands/run-feature-telemetry.js +6 -0
  348. package/dist/commands/run.js +18 -4
  349. package/dist/commands/safe-extract.d.ts +11 -2
  350. package/dist/commands/safe-extract.js +36 -8
  351. package/dist/commands/secrets.d.ts +20 -2
  352. package/dist/commands/secrets.js +175 -71
  353. package/dist/commands/skill.d.ts +35 -4
  354. package/dist/commands/skill.js +357 -18
  355. package/dist/commands/staff/reset-test-account.d.ts +110 -0
  356. package/dist/commands/staff/reset-test-account.js +268 -0
  357. package/dist/commands/staff/test-account.d.ts +51 -0
  358. package/dist/commands/staff/test-account.js +196 -0
  359. package/dist/commands/sync-mode.d.ts +11 -0
  360. package/dist/commands/sync-mode.js +30 -0
  361. package/dist/commands/sync-narrow.js +36 -5
  362. package/dist/commands/team-sync.js +71 -10
  363. package/dist/commands/update.js +6 -0
  364. package/dist/commands/vault-retention-flag.d.ts +3 -0
  365. package/dist/commands/vault-retention-flag.js +9 -0
  366. package/dist/commands/vault-retention.d.ts +11 -0
  367. package/dist/commands/vault-retention.js +69 -0
  368. package/dist/commands/version.d.ts +10 -0
  369. package/dist/commands/version.js +11 -0
  370. package/dist/commands/whoami.d.ts +22 -0
  371. package/dist/commands/whoami.js +137 -4
  372. package/dist/commands/workers.d.ts +2 -14
  373. package/dist/commands/workers.js +7 -10
  374. package/dist/fast-core.d.ts +7 -7
  375. package/dist/fast-core.js +91 -24
  376. package/dist/fast-scaffold.d.ts +86 -0
  377. package/dist/fast-scaffold.js +381 -0
  378. package/dist/index.d.ts +3 -4
  379. package/dist/index.js +59 -9
  380. package/dist/lanes-drain-hook.d.ts +14 -0
  381. package/dist/lanes-drain-hook.js +203 -0
  382. package/dist/lazy-commands.d.ts +20 -44
  383. package/dist/lazy-commands.js +60 -58
  384. package/dist/lib/agent-kit/adopt-identity.d.ts +27 -0
  385. package/dist/lib/agent-kit/adopt-identity.js +60 -0
  386. package/dist/lib/agent-kit/attachment-download.d.ts +24 -0
  387. package/dist/lib/agent-kit/attachment-download.js +47 -0
  388. package/dist/lib/agent-kit/creds.d.ts +106 -0
  389. package/dist/lib/agent-kit/creds.js +163 -0
  390. package/dist/lib/agent-kit/fallback.d.ts +78 -0
  391. package/dist/lib/agent-kit/fallback.js +210 -0
  392. package/dist/lib/agent-kit/inbox-state.d.ts +83 -0
  393. package/dist/lib/agent-kit/inbox-state.js +159 -0
  394. package/dist/lib/agent-kit/kit-config.d.ts +56 -0
  395. package/dist/lib/agent-kit/kit-config.js +65 -0
  396. package/dist/lib/agent-kit/log.d.ts +16 -0
  397. package/dist/lib/agent-kit/log.js +46 -0
  398. package/dist/lib/agent-kit/mcp/attachments.d.ts +126 -0
  399. package/dist/lib/agent-kit/mcp/attachments.js +222 -0
  400. package/dist/lib/agent-kit/mcp/jsonrpc.d.ts +75 -0
  401. package/dist/lib/agent-kit/mcp/jsonrpc.js +164 -0
  402. package/dist/lib/agent-kit/mcp/tools.d.ts +64 -0
  403. package/dist/lib/agent-kit/mcp/tools.js +397 -0
  404. package/dist/lib/agent-kit/paths.d.ts +65 -0
  405. package/dist/lib/agent-kit/paths.js +118 -0
  406. package/dist/lib/agent-kit/private-file.d.ts +29 -0
  407. package/dist/lib/agent-kit/private-file.js +91 -0
  408. package/dist/lib/agent-kit/run/heartbeat.d.ts +72 -0
  409. package/dist/lib/agent-kit/run/heartbeat.js +128 -0
  410. package/dist/lib/agent-kit/run/inbox.d.ts +76 -0
  411. package/dist/lib/agent-kit/run/inbox.js +205 -0
  412. package/dist/lib/agent-kit/run/supervisor.d.ts +35 -0
  413. package/dist/lib/agent-kit/run/supervisor.js +85 -0
  414. package/dist/lib/agent-kit/run/sync.d.ts +33 -0
  415. package/dist/lib/agent-kit/run/sync.js +58 -0
  416. package/dist/lib/agent-kit/services.d.ts +31 -0
  417. package/dist/lib/agent-kit/services.js +55 -0
  418. package/dist/lib/agent-kit/skills.d.ts +18 -0
  419. package/dist/lib/agent-kit/skills.js +151 -0
  420. package/dist/lib/agent-kit/wake.d.ts +83 -0
  421. package/dist/lib/agent-kit/wake.js +243 -0
  422. package/dist/lib/agents/model-catalog.d.ts +62 -0
  423. package/dist/lib/agents/model-catalog.js +275 -0
  424. package/dist/lib/auth-login-provider-state.d.ts +8 -0
  425. package/dist/lib/auth-login-provider-state.js +63 -0
  426. package/dist/lib/aws-sdk-node-warning-output.d.ts +12 -0
  427. package/dist/lib/aws-sdk-node-warning-output.js +22 -0
  428. package/dist/lib/billing/free-month.d.ts +18 -0
  429. package/dist/lib/billing/free-month.js +31 -0
  430. package/dist/lib/billing/plan-limit-refusals.d.ts +69 -0
  431. package/dist/lib/billing/plan-limit-refusals.js +187 -0
  432. package/dist/lib/billing/plan-limit-upgrade-url.d.ts +11 -0
  433. package/dist/lib/billing/plan-limit-upgrade-url.js +66 -0
  434. package/dist/lib/billing/plan-lock.d.ts +143 -0
  435. package/dist/lib/billing/plan-lock.js +439 -0
  436. package/dist/lib/bot/api.d.ts +349 -0
  437. package/dist/lib/bot/api.js +316 -0
  438. package/dist/lib/bot/attachments.d.ts +45 -0
  439. package/dist/lib/bot/attachments.js +89 -0
  440. package/dist/lib/bot/cli-update.d.ts +138 -0
  441. package/dist/lib/bot/cli-update.js +278 -0
  442. package/dist/lib/bot/company-bind.d.ts +27 -0
  443. package/dist/lib/bot/company-bind.js +62 -0
  444. package/dist/lib/bot/config.d.ts +153 -0
  445. package/dist/lib/bot/config.js +233 -0
  446. package/dist/lib/bot/continuity-download.d.ts +28 -0
  447. package/dist/lib/bot/continuity-download.js +75 -0
  448. package/dist/lib/bot/continuity-install.d.ts +14 -0
  449. package/dist/lib/bot/continuity-install.js +101 -0
  450. package/dist/lib/bot/continuity.d.ts +67 -0
  451. package/dist/lib/bot/continuity.js +301 -0
  452. package/dist/lib/bot/creds.d.ts +24 -0
  453. package/dist/lib/bot/creds.js +51 -0
  454. package/dist/lib/bot/daemon.d.ts +173 -0
  455. package/dist/lib/bot/daemon.js +552 -0
  456. package/dist/lib/bot/inbox-poll-backoff-flag.d.ts +24 -0
  457. package/dist/lib/bot/inbox-poll-backoff-flag.js +135 -0
  458. package/dist/lib/bot/inbox-state.d.ts +18 -0
  459. package/dist/lib/bot/inbox-state.js +51 -0
  460. package/dist/lib/bot/index.d.ts +23 -0
  461. package/dist/lib/bot/index.js +23 -0
  462. package/dist/lib/bot/inflight.d.ts +119 -0
  463. package/dist/lib/bot/inflight.js +83 -0
  464. package/dist/lib/bot/job-completions.d.ts +89 -0
  465. package/dist/lib/bot/job-completions.js +132 -0
  466. package/dist/lib/bot/job-quiet-flag.d.ts +4 -0
  467. package/dist/lib/bot/job-quiet-flag.js +14 -0
  468. package/dist/lib/bot/job-run.d.ts +114 -0
  469. package/dist/lib/bot/job-run.js +266 -0
  470. package/dist/lib/bot/local-config.d.ts +61 -0
  471. package/dist/lib/bot/local-config.js +145 -0
  472. package/dist/lib/bot/local-jobs.d.ts +89 -0
  473. package/dist/lib/bot/local-jobs.js +459 -0
  474. package/dist/lib/bot/local-name.d.ts +54 -0
  475. package/dist/lib/bot/local-name.js +114 -0
  476. package/dist/lib/bot/log.d.ts +13 -0
  477. package/dist/lib/bot/log.js +59 -0
  478. package/dist/lib/bot/owner-context.d.ts +79 -0
  479. package/dist/lib/bot/owner-context.js +175 -0
  480. package/dist/lib/bot/paths.d.ts +76 -0
  481. package/dist/lib/bot/paths.js +131 -0
  482. package/dist/lib/bot/progress.d.ts +132 -0
  483. package/dist/lib/bot/progress.js +289 -0
  484. package/dist/lib/bot/promote.d.ts +16 -0
  485. package/dist/lib/bot/promote.js +106 -0
  486. package/dist/lib/bot/promotion-hold.d.ts +24 -0
  487. package/dist/lib/bot/promotion-hold.js +103 -0
  488. package/dist/lib/bot/promotion-receipt.d.ts +9 -0
  489. package/dist/lib/bot/promotion-receipt.js +56 -0
  490. package/dist/lib/bot/promotion-upload.d.ts +16 -0
  491. package/dist/lib/bot/promotion-upload.js +80 -0
  492. package/dist/lib/bot/prompt.d.ts +136 -0
  493. package/dist/lib/bot/prompt.js +433 -0
  494. package/dist/lib/bot/room-policy.d.ts +63 -0
  495. package/dist/lib/bot/room-policy.js +91 -0
  496. package/dist/lib/bot/run.d.ts +219 -0
  497. package/dist/lib/bot/run.js +1881 -0
  498. package/dist/lib/bot/runnable.d.ts +51 -0
  499. package/dist/lib/bot/runnable.js +65 -0
  500. package/dist/lib/bot/runtime/claude.d.ts +50 -0
  501. package/dist/lib/bot/runtime/claude.js +170 -0
  502. package/dist/lib/bot/runtime/codex.d.ts +28 -0
  503. package/dist/lib/bot/runtime/codex.js +153 -0
  504. package/dist/lib/bot/runtime/grok-acp.d.ts +40 -0
  505. package/dist/lib/bot/runtime/grok-acp.js +265 -0
  506. package/dist/lib/bot/runtime/grok.d.ts +41 -0
  507. package/dist/lib/bot/runtime/grok.js +169 -0
  508. package/dist/lib/bot/runtime/index.d.ts +36 -0
  509. package/dist/lib/bot/runtime/index.js +417 -0
  510. package/dist/lib/bot/runtime/messages-stream.d.ts +56 -0
  511. package/dist/lib/bot/runtime/messages-stream.js +194 -0
  512. package/dist/lib/bot/runtime/sanitize.d.ts +18 -0
  513. package/dist/lib/bot/runtime/sanitize.js +28 -0
  514. package/dist/lib/bot/runtime/types.d.ts +159 -0
  515. package/dist/lib/bot/runtime/types.js +51 -0
  516. package/dist/lib/bot/runtime/windows.d.ts +10 -0
  517. package/dist/lib/bot/runtime/windows.js +53 -0
  518. package/dist/lib/bot/runtime-sign-in.d.ts +24 -0
  519. package/dist/lib/bot/runtime-sign-in.js +31 -0
  520. package/dist/lib/bot/scaffold.d.ts +38 -0
  521. package/dist/lib/bot/scaffold.js +94 -0
  522. package/dist/lib/bot/self-heal.d.ts +52 -0
  523. package/dist/lib/bot/self-heal.js +79 -0
  524. package/dist/lib/bot/self-process.d.ts +19 -0
  525. package/dist/lib/bot/self-process.js +35 -0
  526. package/dist/lib/bot/session.d.ts +19 -0
  527. package/dist/lib/bot/session.js +39 -0
  528. package/dist/lib/bot/setup-explain.d.ts +64 -0
  529. package/dist/lib/bot/setup-explain.js +141 -0
  530. package/dist/lib/bot/split.d.ts +32 -0
  531. package/dist/lib/bot/split.js +241 -0
  532. package/dist/lib/bot/status.d.ts +57 -0
  533. package/dist/lib/bot/status.js +66 -0
  534. package/dist/lib/bot/worker-source.d.ts +66 -0
  535. package/dist/lib/bot/worker-source.js +283 -0
  536. package/dist/lib/checkpoint-ontology/aliases.d.ts +17 -0
  537. package/dist/lib/checkpoint-ontology/aliases.js +44 -0
  538. package/dist/lib/checkpoint-ontology/apply.d.ts +110 -0
  539. package/dist/lib/checkpoint-ontology/apply.js +777 -0
  540. package/dist/lib/checkpoint-ontology/company-brief.d.ts +18 -0
  541. package/dist/lib/checkpoint-ontology/company-brief.js +337 -0
  542. package/dist/lib/checkpoint-ontology/company.d.ts +44 -0
  543. package/dist/lib/checkpoint-ontology/company.js +118 -0
  544. package/dist/lib/checkpoint-ontology/drop-aliases.d.ts +41 -0
  545. package/dist/lib/checkpoint-ontology/drop-aliases.js +76 -0
  546. package/dist/lib/checkpoint-ontology/entity-file.d.ts +109 -0
  547. package/dist/lib/checkpoint-ontology/entity-file.js +371 -0
  548. package/dist/lib/checkpoint-ontology/identity.d.ts +38 -0
  549. package/dist/lib/checkpoint-ontology/identity.js +95 -0
  550. package/dist/lib/checkpoint-ontology/merge-copies.d.ts +199 -0
  551. package/dist/lib/checkpoint-ontology/merge-copies.js +1086 -0
  552. package/dist/lib/checkpoint-ontology/multi-writer.d.ts +101 -0
  553. package/dist/lib/checkpoint-ontology/multi-writer.js +394 -0
  554. package/dist/lib/checkpoint-ontology/plan.d.ts +193 -0
  555. package/dist/lib/checkpoint-ontology/plan.js +504 -0
  556. package/dist/lib/checkpoint-ontology/queued-touches.d.ts +29 -0
  557. package/dist/lib/checkpoint-ontology/queued-touches.js +193 -0
  558. package/dist/lib/checkpoint-ontology/sync-client.d.ts +38 -0
  559. package/dist/lib/checkpoint-ontology/sync-client.js +84 -0
  560. package/dist/lib/checkpoint-ontology/tree.d.ts +55 -0
  561. package/dist/lib/checkpoint-ontology/tree.js +198 -0
  562. package/dist/lib/company-errors-sdk-warning-flag.d.ts +5 -0
  563. package/dist/lib/company-errors-sdk-warning-flag.js +8 -0
  564. package/dist/lib/company-skill-wrapper.d.ts +1 -0
  565. package/dist/lib/company-skill-wrapper.js +121 -29
  566. package/dist/lib/core-utils/codex-skill-bridge.d.ts +2 -1
  567. package/dist/lib/core-utils/common.d.ts +0 -1
  568. package/dist/lib/core-utils/common.js +0 -9
  569. package/dist/lib/core-utils/hook-timeout-debug-context-flag.d.ts +20 -0
  570. package/dist/lib/core-utils/hook-timeout-debug-context-flag.js +81 -0
  571. package/dist/lib/core-utils/jq-json-serializer.d.ts +5 -0
  572. package/dist/lib/core-utils/jq-json-serializer.js +10 -0
  573. package/dist/lib/core-utils/qmd-reindex-after-sync.d.ts +14 -1
  574. package/dist/lib/core-utils/qmd-reindex-after-sync.js +101 -17
  575. package/dist/lib/core-utils/secret-patterns.d.ts +43 -0
  576. package/dist/lib/core-utils/secret-patterns.js +34 -0
  577. package/dist/lib/core-utils/sentry-report.d.ts +114 -0
  578. package/dist/lib/core-utils/sentry-report.js +1055 -0
  579. package/dist/lib/core-utils/soft-timeout.js +1 -1
  580. package/dist/lib/core-utils/timeout-guard-native.d.ts +7 -0
  581. package/dist/lib/core-utils/timeout-guard-native.js +40 -0
  582. package/dist/lib/core-utils/timeout-guard.d.ts +3 -3
  583. package/dist/lib/core-utils/timeout-guard.js +28 -13
  584. package/dist/lib/core-utils/token-usage-report.js +17 -3
  585. package/dist/lib/core-utils/worktree-resume.d.ts +20 -0
  586. package/dist/lib/core-utils/worktree-resume.js +1198 -0
  587. package/dist/lib/daemon/catalog.d.ts +134 -0
  588. package/dist/lib/daemon/catalog.js +358 -0
  589. package/dist/lib/daemon/config.d.ts +35 -0
  590. package/dist/lib/daemon/config.js +108 -0
  591. package/dist/lib/daemon/flag.d.ts +25 -0
  592. package/dist/lib/daemon/flag.js +59 -0
  593. package/dist/lib/daemon/handoff.d.ts +56 -0
  594. package/dist/lib/daemon/handoff.js +161 -0
  595. package/dist/lib/daemon/hq-cloud.d.ts +79 -0
  596. package/dist/lib/daemon/hq-cloud.js +183 -0
  597. package/dist/lib/daemon/install.d.ts +85 -0
  598. package/dist/lib/daemon/install.js +320 -0
  599. package/dist/lib/daemon/legacy-sync-env.d.ts +10 -0
  600. package/dist/lib/daemon/legacy-sync-env.js +58 -0
  601. package/dist/lib/daemon/legacy.d.ts +45 -0
  602. package/dist/lib/daemon/legacy.js +133 -0
  603. package/dist/lib/daemon/lock.d.ts +47 -0
  604. package/dist/lib/daemon/lock.js +138 -0
  605. package/dist/lib/daemon/machine-type.d.ts +50 -0
  606. package/dist/lib/daemon/machine-type.js +159 -0
  607. package/dist/lib/daemon/migrate.d.ts +77 -0
  608. package/dist/lib/daemon/migrate.js +265 -0
  609. package/dist/lib/daemon/paths.d.ts +24 -0
  610. package/dist/lib/daemon/paths.js +43 -0
  611. package/dist/lib/daemon/protocol-tail.d.ts +33 -0
  612. package/dist/lib/daemon/protocol-tail.js +131 -0
  613. package/dist/lib/daemon/remote-control.d.ts +74 -0
  614. package/dist/lib/daemon/remote-control.js +153 -0
  615. package/dist/lib/daemon/requests.d.ts +28 -0
  616. package/dist/lib/daemon/requests.js +65 -0
  617. package/dist/lib/daemon/run.d.ts +79 -0
  618. package/dist/lib/daemon/run.js +755 -0
  619. package/dist/lib/daemon/succession.d.ts +118 -0
  620. package/dist/lib/daemon/succession.js +263 -0
  621. package/dist/lib/daemon/supervisor.d.ts +132 -0
  622. package/dist/lib/daemon/supervisor.js +836 -0
  623. package/dist/lib/daemon/sync-runner.d.ts +58 -0
  624. package/dist/lib/daemon/sync-runner.js +277 -0
  625. package/dist/lib/daemon/tools.d.ts +52 -0
  626. package/dist/lib/daemon/tools.js +95 -0
  627. package/dist/lib/daemon/updater.d.ts +57 -0
  628. package/dist/lib/daemon/updater.js +163 -0
  629. package/dist/lib/db/control-plane.js +6 -0
  630. package/dist/lib/db/local.d.ts +0 -5
  631. package/dist/lib/db/local.js +1 -1
  632. package/dist/lib/db/migrate.d.ts +0 -12
  633. package/dist/lib/db/migrate.js +5 -5
  634. package/dist/lib/db/remote-sql.d.ts +2 -2
  635. package/dist/lib/db/remote-sql.js +3 -3
  636. package/dist/lib/db/sql.d.ts +0 -10
  637. package/dist/lib/db/sql.js +4 -8
  638. package/dist/lib/deploy-api.d.ts +5 -0
  639. package/dist/lib/deploy-api.js +21 -0
  640. package/dist/lib/deploy-apps.d.ts +13 -0
  641. package/dist/lib/deploy-apps.js +29 -0
  642. package/dist/lib/doctor/__testing__/fake-hq-tree.d.ts +1 -1
  643. package/dist/lib/doctor/__testing__/fake-hq-tree.js +1 -1
  644. package/dist/lib/doctor/__testing__/run-doctor.d.ts +8 -0
  645. package/dist/lib/doctor/__testing__/run-doctor.js +52 -0
  646. package/dist/lib/doctor/checks/bots.d.ts +13 -0
  647. package/dist/lib/doctor/checks/bots.js +189 -0
  648. package/dist/lib/doctor/checks/claude-wiring.js +70 -1
  649. package/dist/lib/doctor/checks/codex-wiring.d.ts +0 -4
  650. package/dist/lib/doctor/checks/codex-wiring.js +3 -35
  651. package/dist/lib/doctor/checks/grok-wiring.js +1 -34
  652. package/dist/lib/doctor/checks/integrations.js +11 -0
  653. package/dist/lib/doctor/checks/runtime-health.d.ts +4 -17
  654. package/dist/lib/doctor/checks/runtime-health.js +20 -7
  655. package/dist/lib/doctor/checks/scaffold-cli-floor.d.ts +6 -0
  656. package/dist/lib/doctor/checks/scaffold-cli-floor.js +73 -0
  657. package/dist/lib/doctor/checks/sync-health.d.ts +21 -0
  658. package/dist/lib/doctor/checks/sync-health.js +72 -2
  659. package/dist/lib/doctor/checks/sync-runtime.d.ts +11 -0
  660. package/dist/lib/doctor/checks/sync-runtime.js +216 -0
  661. package/dist/lib/doctor/checks/work-context.js +20 -6
  662. package/dist/lib/doctor/client-health-flag-token.d.ts +15 -0
  663. package/dist/lib/doctor/client-health-flag-token.js +66 -0
  664. package/dist/lib/doctor/client-health-reason-codes-flag.d.ts +27 -0
  665. package/dist/lib/doctor/client-health-reason-codes-flag.js +106 -0
  666. package/dist/lib/doctor/compat.d.ts +0 -16
  667. package/dist/lib/doctor/compat.js +4 -3
  668. package/dist/lib/doctor/deep/effects.js +1 -3
  669. package/dist/lib/doctor/deep/executor.d.ts +4 -10
  670. package/dist/lib/doctor/deep/executor.js +1 -1
  671. package/dist/lib/doctor/deep/parity.d.ts +2 -29
  672. package/dist/lib/doctor/deep/parity.js +7 -7
  673. package/dist/lib/doctor/deep/sandbox.d.ts +7 -25
  674. package/dist/lib/doctor/deep/sandbox.js +5 -7
  675. package/dist/lib/doctor/fix/apply.d.ts +79 -8
  676. package/dist/lib/doctor/fix/apply.js +292 -80
  677. package/dist/lib/doctor/fix/json-output.d.ts +28 -0
  678. package/dist/lib/doctor/fix/json-output.js +33 -0
  679. package/dist/lib/doctor/fix/refresh-sync-outcome.d.ts +12 -0
  680. package/dist/lib/doctor/fix/refresh-sync-outcome.js +25 -0
  681. package/dist/lib/doctor/fix/remediation.d.ts +14 -6
  682. package/dist/lib/doctor/fix/remediation.js +49 -9
  683. package/dist/lib/doctor/fixtures/schema.js +1 -3
  684. package/dist/lib/doctor/json-output.d.ts +17 -1
  685. package/dist/lib/doctor/json-output.js +7 -2
  686. package/dist/lib/doctor/platform.d.ts +0 -26
  687. package/dist/lib/doctor/platform.js +5 -5
  688. package/dist/lib/doctor/registry.d.ts +14 -0
  689. package/dist/lib/doctor/registry.js +71 -0
  690. package/dist/lib/doctor/report.js +1 -1
  691. package/dist/lib/doctor/shared.d.ts +8 -0
  692. package/dist/lib/doctor/shared.js +38 -0
  693. package/dist/lib/doctor/stray-gate-entries.d.ts +35 -0
  694. package/dist/lib/doctor/stray-gate-entries.js +83 -0
  695. package/dist/lib/doctor/types.d.ts +5 -0
  696. package/dist/lib/doctor/types.js +20 -0
  697. package/dist/lib/first-sync-next-step.d.ts +34 -0
  698. package/dist/lib/first-sync-next-step.js +179 -0
  699. package/dist/lib/flag-registry-endpoint.d.ts +5 -0
  700. package/dist/lib/flag-registry-endpoint.js +9 -0
  701. package/dist/lib/flag-registry-worker-source.generated.d.ts +2 -0
  702. package/dist/lib/flag-registry-worker-source.generated.js +3 -0
  703. package/dist/lib/flag-registry-worker.js +12 -1
  704. package/dist/lib/flag-registry.d.ts +26 -6
  705. package/dist/lib/flag-registry.js +133 -16
  706. package/dist/lib/flag-snapshot-file.d.ts +20 -0
  707. package/dist/lib/flag-snapshot-file.js +91 -0
  708. package/dist/lib/heartbeat-identity.d.ts +30 -0
  709. package/dist/lib/heartbeat-identity.js +76 -0
  710. package/dist/lib/index-render/companies.d.ts +4 -1
  711. package/dist/lib/index-render/companies.js +66 -3
  712. package/dist/lib/index-render/company-knowledge.js +80 -17
  713. package/dist/lib/index-render/index.d.ts +1 -0
  714. package/dist/lib/index-render/index.js +2 -1
  715. package/dist/lib/index-render/projects.js +82 -5
  716. package/dist/lib/index-render/shared.d.ts +13 -1
  717. package/dist/lib/index-render/shared.js +41 -2
  718. package/dist/lib/lanes/account-home.d.ts +8 -0
  719. package/dist/lib/lanes/account-home.js +10 -0
  720. package/dist/lib/lanes/accounts.d.ts +117 -0
  721. package/dist/lib/lanes/accounts.js +366 -0
  722. package/dist/lib/lanes/admission-host.d.ts +22 -0
  723. package/dist/lib/lanes/admission-host.js +37 -0
  724. package/dist/lib/lanes/admission.d.ts +26 -0
  725. package/dist/lib/lanes/admission.js +210 -0
  726. package/dist/lib/lanes/approval-gate.d.ts +8 -0
  727. package/dist/lib/lanes/approval-gate.js +90 -0
  728. package/dist/lib/lanes/autopilot-metrics.d.ts +99 -0
  729. package/dist/lib/lanes/autopilot-metrics.js +301 -0
  730. package/dist/lib/lanes/autopilot-registry.d.ts +62 -0
  731. package/dist/lib/lanes/autopilot-registry.js +192 -0
  732. package/dist/lib/lanes/autopilot.d.ts +137 -0
  733. package/dist/lib/lanes/autopilot.js +1291 -0
  734. package/dist/lib/lanes/blocker-freshness.d.ts +31 -0
  735. package/dist/lib/lanes/blocker-freshness.js +168 -0
  736. package/dist/lib/lanes/checked-company-path.d.ts +3 -0
  737. package/dist/lib/lanes/checked-company-path.js +39 -0
  738. package/dist/lib/lanes/claude-balance.d.ts +97 -0
  739. package/dist/lib/lanes/claude-balance.js +319 -0
  740. package/dist/lib/lanes/compaction.d.ts +110 -0
  741. package/dist/lib/lanes/compaction.js +293 -0
  742. package/dist/lib/lanes/config.d.ts +94 -0
  743. package/dist/lib/lanes/config.js +606 -0
  744. package/dist/lib/lanes/constants.d.ts +3 -0
  745. package/dist/lib/lanes/constants.js +3 -0
  746. package/dist/lib/lanes/delivery-core.d.ts +15 -0
  747. package/dist/lib/lanes/delivery-core.js +21 -0
  748. package/dist/lib/lanes/delivery.d.ts +180 -0
  749. package/dist/lib/lanes/delivery.js +443 -0
  750. package/dist/lib/lanes/disk-guard.d.ts +65 -0
  751. package/dist/lib/lanes/disk-guard.js +172 -0
  752. package/dist/lib/lanes/dropbox.d.ts +129 -0
  753. package/dist/lib/lanes/dropbox.js +601 -0
  754. package/dist/lib/lanes/effort.d.ts +51 -0
  755. package/dist/lib/lanes/effort.js +113 -0
  756. package/dist/lib/lanes/envelope-repair-dispatch.d.ts +26 -0
  757. package/dist/lib/lanes/envelope-repair-dispatch.js +74 -0
  758. package/dist/lib/lanes/errors.d.ts +39 -0
  759. package/dist/lib/lanes/errors.js +72 -0
  760. package/dist/lib/lanes/flag-keys.d.ts +25 -0
  761. package/dist/lib/lanes/flag-keys.js +25 -0
  762. package/dist/lib/lanes/grants.d.ts +30 -0
  763. package/dist/lib/lanes/grants.js +171 -0
  764. package/dist/lib/lanes/hire-grant-dispatch.d.ts +29 -0
  765. package/dist/lib/lanes/hire-grant-dispatch.js +315 -0
  766. package/dist/lib/lanes/hooks-install.d.ts +82 -0
  767. package/dist/lib/lanes/hooks-install.js +555 -0
  768. package/dist/lib/lanes/host-capacity.d.ts +69 -0
  769. package/dist/lib/lanes/host-capacity.js +254 -0
  770. package/dist/lib/lanes/hq-root.d.ts +19 -0
  771. package/dist/lib/lanes/hq-root.js +28 -0
  772. package/dist/lib/lanes/index.d.ts +76 -0
  773. package/dist/lib/lanes/index.js +42 -0
  774. package/dist/lib/lanes/keep-alive-audit.d.ts +47 -0
  775. package/dist/lib/lanes/keep-alive-audit.js +370 -0
  776. package/dist/lib/lanes/keep-alive.d.ts +68 -0
  777. package/dist/lib/lanes/keep-alive.js +343 -0
  778. package/dist/lib/lanes/kr-freshness.d.ts +76 -0
  779. package/dist/lib/lanes/kr-freshness.js +413 -0
  780. package/dist/lib/lanes/lane-company.d.ts +10 -0
  781. package/dist/lib/lanes/lane-company.js +41 -0
  782. package/dist/lib/lanes/liveness.d.ts +108 -0
  783. package/dist/lib/lanes/liveness.js +396 -0
  784. package/dist/lib/lanes/machine-identity.d.ts +34 -0
  785. package/dist/lib/lanes/machine-identity.js +92 -0
  786. package/dist/lib/lanes/manager-status-gate.d.ts +17 -0
  787. package/dist/lib/lanes/manager-status-gate.js +133 -0
  788. package/dist/lib/lanes/merge-command.d.ts +15 -0
  789. package/dist/lib/lanes/merge-command.js +629 -0
  790. package/dist/lib/lanes/mesh-events.d.ts +127 -0
  791. package/dist/lib/lanes/mesh-events.js +564 -0
  792. package/dist/lib/lanes/message-replay.d.ts +21 -0
  793. package/dist/lib/lanes/message-replay.js +122 -0
  794. package/dist/lib/lanes/models.d.ts +86 -0
  795. package/dist/lib/lanes/models.js +234 -0
  796. package/dist/lib/lanes/monitor.d.ts +48 -0
  797. package/dist/lib/lanes/monitor.js +428 -0
  798. package/dist/lib/lanes/move-account.d.ts +56 -0
  799. package/dist/lib/lanes/move-account.js +193 -0
  800. package/dist/lib/lanes/orphans.d.ts +25 -0
  801. package/dist/lib/lanes/orphans.js +102 -0
  802. package/dist/lib/lanes/outpost-dispatch.d.ts +156 -0
  803. package/dist/lib/lanes/outpost-dispatch.js +293 -0
  804. package/dist/lib/lanes/outpost-hire-cache.d.ts +22 -0
  805. package/dist/lib/lanes/outpost-hire-cache.js +153 -0
  806. package/dist/lib/lanes/outpost-identity.d.ts +33 -0
  807. package/dist/lib/lanes/outpost-identity.js +59 -0
  808. package/dist/lib/lanes/outpost-profile-repin.d.ts +17 -0
  809. package/dist/lib/lanes/outpost-profile-repin.js +84 -0
  810. package/dist/lib/lanes/outpost-pruner-install.d.ts +37 -0
  811. package/dist/lib/lanes/outpost-pruner-install.js +238 -0
  812. package/dist/lib/lanes/outpost-registry-worker-approval.d.ts +18 -0
  813. package/dist/lib/lanes/outpost-registry-worker-approval.js +109 -0
  814. package/dist/lib/lanes/outpost-snapshot-memo.d.ts +6 -0
  815. package/dist/lib/lanes/outpost-snapshot-memo.js +14 -0
  816. package/dist/lib/lanes/outpost-worktree-pruner-flag.d.ts +19 -0
  817. package/dist/lib/lanes/outpost-worktree-pruner-flag.js +86 -0
  818. package/dist/lib/lanes/outpost-worktree-pruner.d.ts +62 -0
  819. package/dist/lib/lanes/outpost-worktree-pruner.js +1201 -0
  820. package/dist/lib/lanes/profile.d.ts +69 -0
  821. package/dist/lib/lanes/profile.js +552 -0
  822. package/dist/lib/lanes/provider-rejection.d.ts +86 -0
  823. package/dist/lib/lanes/provider-rejection.js +286 -0
  824. package/dist/lib/lanes/questions.d.ts +90 -0
  825. package/dist/lib/lanes/questions.js +384 -0
  826. package/dist/lib/lanes/quota.d.ts +134 -0
  827. package/dist/lib/lanes/quota.js +471 -0
  828. package/dist/lib/lanes/reconcile-install.d.ts +90 -0
  829. package/dist/lib/lanes/reconcile-install.js +257 -0
  830. package/dist/lib/lanes/reconcile.d.ts +161 -0
  831. package/dist/lib/lanes/reconcile.js +3343 -0
  832. package/dist/lib/lanes/registry-flag.d.ts +35 -0
  833. package/dist/lib/lanes/registry-flag.js +164 -0
  834. package/dist/lib/lanes/registry-persona.d.ts +20 -0
  835. package/dist/lib/lanes/registry-persona.js +329 -0
  836. package/dist/lib/lanes/registry.d.ts +122 -0
  837. package/dist/lib/lanes/registry.js +570 -0
  838. package/dist/lib/lanes/reviews.d.ts +38 -0
  839. package/dist/lib/lanes/reviews.js +395 -0
  840. package/dist/lib/lanes/runaway-tool-guard.d.ts +38 -0
  841. package/dist/lib/lanes/runaway-tool-guard.js +284 -0
  842. package/dist/lib/lanes/session-relink.d.ts +25 -0
  843. package/dist/lib/lanes/session-relink.js +216 -0
  844. package/dist/lib/lanes/spawn.d.ts +355 -0
  845. package/dist/lib/lanes/spawn.js +2668 -0
  846. package/dist/lib/lanes/ssm-command-context.d.ts +12 -0
  847. package/dist/lib/lanes/ssm-command-context.js +52 -0
  848. package/dist/lib/lanes/store.d.ts +91 -0
  849. package/dist/lib/lanes/store.js +1822 -0
  850. package/dist/lib/lanes/stories.d.ts +23 -0
  851. package/dist/lib/lanes/stories.js +92 -0
  852. package/dist/lib/lanes/story-ledger.d.ts +80 -0
  853. package/dist/lib/lanes/story-ledger.js +815 -0
  854. package/dist/lib/lanes/story-switch.d.ts +21 -0
  855. package/dist/lib/lanes/story-switch.js +75 -0
  856. package/dist/lib/lanes/text-scan.d.ts +11 -0
  857. package/dist/lib/lanes/text-scan.js +103 -0
  858. package/dist/lib/lanes/throttle.d.ts +116 -0
  859. package/dist/lib/lanes/throttle.js +437 -0
  860. package/dist/lib/lanes/timestamp.d.ts +3 -0
  861. package/dist/lib/lanes/timestamp.js +26 -0
  862. package/dist/lib/lanes/tracker-checks.d.ts +77 -0
  863. package/dist/lib/lanes/tracker-checks.js +134 -0
  864. package/dist/lib/lanes/tracker-report-state.d.ts +10 -0
  865. package/dist/lib/lanes/tracker-report-state.js +124 -0
  866. package/dist/lib/lanes/tracker-report.d.ts +203 -0
  867. package/dist/lib/lanes/tracker-report.js +522 -0
  868. package/dist/lib/lanes/tracker-store.d.ts +18 -0
  869. package/dist/lib/lanes/tracker-store.js +106 -0
  870. package/dist/lib/lanes/types.d.ts +1030 -0
  871. package/dist/lib/lanes/types.js +418 -0
  872. package/dist/lib/lanes/wait.d.ts +39 -0
  873. package/dist/lib/lanes/wait.js +159 -0
  874. package/dist/lib/lanes/watch.d.ts +39 -0
  875. package/dist/lib/lanes/watch.js +249 -0
  876. package/dist/lib/lanes/watcher-main.d.ts +11 -0
  877. package/dist/lib/lanes/watcher-main.js +108 -0
  878. package/dist/lib/lanes/watcher.d.ts +287 -0
  879. package/dist/lib/lanes/watcher.js +1972 -0
  880. package/dist/lib/mesh/api.d.ts +103 -10
  881. package/dist/lib/mesh/api.js +334 -64
  882. package/dist/lib/mesh/client.d.ts +3 -2
  883. package/dist/lib/mesh/client.js +26 -7
  884. package/dist/lib/mesh/denial-codes.d.ts +5 -0
  885. package/dist/lib/mesh/denial-codes.js +14 -0
  886. package/dist/lib/mesh/live/backfill-held.d.ts +67 -16
  887. package/dist/lib/mesh/live/backfill-held.js +415 -61
  888. package/dist/lib/mesh/live/backoff.d.ts +2 -2
  889. package/dist/lib/mesh/live/backoff.js +16 -3
  890. package/dist/lib/mesh/live/daemon/board-refresh.d.ts +7 -1
  891. package/dist/lib/mesh/live/daemon/board-refresh.js +78 -30
  892. package/dist/lib/mesh/live/daemon/config.d.ts +36 -0
  893. package/dist/lib/mesh/live/daemon/config.js +120 -0
  894. package/dist/lib/mesh/live/daemon/credentials.d.ts +64 -10
  895. package/dist/lib/mesh/live/daemon/credentials.js +270 -20
  896. package/dist/lib/mesh/live/daemon/doctor.d.ts +53 -0
  897. package/dist/lib/mesh/live/daemon/doctor.js +190 -6
  898. package/dist/lib/mesh/live/daemon/index.d.ts +13 -10
  899. package/dist/lib/mesh/live/daemon/index.js +7 -6
  900. package/dist/lib/mesh/live/daemon/install.d.ts +255 -1
  901. package/dist/lib/mesh/live/daemon/install.js +811 -13
  902. package/dist/lib/mesh/live/daemon/legacy-listen.d.ts +43 -0
  903. package/dist/lib/mesh/live/daemon/legacy-listen.js +89 -0
  904. package/dist/lib/mesh/live/daemon/live-cache.d.ts +26 -0
  905. package/dist/lib/mesh/live/daemon/live-cache.js +116 -0
  906. package/dist/lib/mesh/live/daemon/mqtt-events.d.ts +7 -0
  907. package/dist/lib/mesh/live/daemon/mqtt-events.js +2 -0
  908. package/dist/lib/mesh/live/daemon/mqtt-events.test-d.d.ts +2 -0
  909. package/dist/lib/mesh/live/daemon/mqtt-events.test-d.js +10 -0
  910. package/dist/lib/mesh/live/daemon/paths.d.ts +2 -0
  911. package/dist/lib/mesh/live/daemon/paths.js +2 -0
  912. package/dist/lib/mesh/live/daemon/presence.d.ts +24 -5
  913. package/dist/lib/mesh/live/daemon/presence.js +79 -10
  914. package/dist/lib/mesh/live/daemon/run.d.ts +48 -2
  915. package/dist/lib/mesh/live/daemon/run.js +485 -33
  916. package/dist/lib/mesh/live/daemon/state.d.ts +19 -2
  917. package/dist/lib/mesh/live/daemon/state.js +34 -2
  918. package/dist/lib/mesh/live/daemon/transcript-watch.d.ts +45 -9
  919. package/dist/lib/mesh/live/daemon/transcript-watch.js +227 -31
  920. package/dist/lib/mesh/live/daemon/version-drift.d.ts +5 -0
  921. package/dist/lib/mesh/live/daemon/version-drift.js +47 -0
  922. package/dist/lib/mesh/live/daemon/work-subscribe.d.ts +32 -0
  923. package/dist/lib/mesh/live/daemon/work-subscribe.js +262 -0
  924. package/dist/lib/mesh/live/emit-client.d.ts +8 -0
  925. package/dist/lib/mesh/live/emit-client.js +23 -8
  926. package/dist/lib/mesh/live/emit-evidence.d.ts +19 -0
  927. package/dist/lib/mesh/live/emit-evidence.js +20 -2
  928. package/dist/lib/mesh/live/emit.d.ts +9 -0
  929. package/dist/lib/mesh/live/emit.js +28 -2
  930. package/dist/lib/mesh/live/enqueue.d.ts +5 -0
  931. package/dist/lib/mesh/live/enqueue.js +19 -0
  932. package/dist/lib/mesh/live/flush.d.ts +17 -5
  933. package/dist/lib/mesh/live/flush.js +391 -38
  934. package/dist/lib/mesh/live/format-spool-line.d.ts +5 -2
  935. package/dist/lib/mesh/live/format-spool-line.js +10 -0
  936. package/dist/lib/mesh/live/paths.d.ts +2 -0
  937. package/dist/lib/mesh/live/paths.js +4 -0
  938. package/dist/lib/mesh/live/report-summary.d.ts +45 -0
  939. package/dist/lib/mesh/live/report-summary.js +234 -0
  940. package/dist/lib/mesh/live/session-event.schema.json +24 -1
  941. package/dist/lib/mesh/live/session-events-client.d.ts +2 -0
  942. package/dist/lib/mesh/live/session-events-client.js +26 -0
  943. package/dist/lib/mesh/live/session-seq.d.ts +4 -0
  944. package/dist/lib/mesh/live/session-seq.js +33 -0
  945. package/dist/lib/mesh/live/spool.d.ts +19 -0
  946. package/dist/lib/mesh/live/spool.js +269 -3
  947. package/dist/lib/mesh/live/validate-session-event.d.ts +1 -1
  948. package/dist/lib/mesh/live/validate-session-event.js +1 -1
  949. package/dist/lib/mesh/project-board.d.ts +65 -0
  950. package/dist/lib/mesh/project-board.js +181 -0
  951. package/dist/lib/mesh/story-status.d.ts +22 -0
  952. package/dist/lib/mesh/story-status.js +49 -0
  953. package/dist/lib/monitor.d.ts +149 -0
  954. package/dist/lib/monitor.js +519 -0
  955. package/dist/lib/node-binary.d.ts +50 -0
  956. package/dist/lib/node-binary.js +133 -0
  957. package/dist/lib/notify-recipient.d.ts +7 -0
  958. package/dist/lib/notify-recipient.js +11 -0
  959. package/dist/lib/onboarding/checkpoint.d.ts +13 -0
  960. package/dist/lib/onboarding/checkpoint.js +44 -0
  961. package/dist/lib/onboarding/cli/onboard.d.ts +53 -0
  962. package/dist/lib/onboarding/cli/onboard.js +135 -0
  963. package/dist/lib/onboarding/cli/prompts.d.ts +28 -0
  964. package/dist/lib/onboarding/cli/prompts.js +83 -0
  965. package/dist/lib/onboarding/errors.d.ts +34 -0
  966. package/dist/lib/onboarding/errors.js +59 -0
  967. package/dist/lib/onboarding/index.d.ts +13 -0
  968. package/dist/lib/onboarding/index.js +13 -0
  969. package/dist/lib/onboarding/orchestrator.d.ts +47 -0
  970. package/dist/lib/onboarding/orchestrator.js +569 -0
  971. package/dist/lib/onboarding/types.d.ts +79 -0
  972. package/dist/lib/onboarding/types.js +8 -0
  973. package/dist/lib/plan-limit-nag.d.ts +102 -6
  974. package/dist/lib/plan-limit-nag.js +348 -43
  975. package/dist/lib/policy-validator.d.ts +7 -0
  976. package/dist/lib/policy-validator.js +187 -0
  977. package/dist/lib/process-flag-company-context.d.ts +8 -0
  978. package/dist/lib/process-flag-company-context.js +67 -0
  979. package/dist/lib/report-publish.d.ts +175 -0
  980. package/dist/lib/report-publish.js +421 -0
  981. package/dist/lib/report-run.d.ts +62 -0
  982. package/dist/lib/report-run.js +123 -0
  983. package/dist/lib/report-snapshot.d.ts +12 -0
  984. package/dist/lib/report-snapshot.js +135 -0
  985. package/dist/lib/report-templates.d.ts +9 -0
  986. package/dist/lib/report-templates.js +21 -0
  987. package/dist/lib/scaffold-cli-floor.d.ts +8 -0
  988. package/dist/lib/scaffold-cli-floor.js +50 -0
  989. package/dist/lib/scan-packages/index.d.ts +2 -0
  990. package/dist/lib/scan-packages/index.js +168 -6
  991. package/dist/lib/search-index/background.d.ts +8 -1
  992. package/dist/lib/search-index/background.js +55 -200
  993. package/dist/lib/search-index/collection-path-repair-flag.d.ts +4 -0
  994. package/dist/lib/search-index/collection-path-repair-flag.js +7 -0
  995. package/dist/lib/search-index/embed-lock.d.ts +34 -0
  996. package/dist/lib/search-index/embed-lock.js +295 -0
  997. package/dist/lib/search-index/index.d.ts +12 -0
  998. package/dist/lib/search-index/index.js +153 -7
  999. package/dist/lib/search-index/load-gate.d.ts +57 -0
  1000. package/dist/lib/search-index/load-gate.js +270 -0
  1001. package/dist/lib/search-index/max-doc-bytes.d.ts +219 -0
  1002. package/dist/lib/search-index/max-doc-bytes.js +463 -0
  1003. package/dist/lib/search-index/qmd-exit-diagnostics.d.ts +5 -0
  1004. package/dist/lib/search-index/qmd-exit-diagnostics.js +40 -0
  1005. package/dist/lib/search-index/reindex-single-flight-flag.d.ts +5 -0
  1006. package/dist/lib/search-index/reindex-single-flight-flag.js +8 -0
  1007. package/dist/lib/service-manager/index.d.ts +42 -0
  1008. package/dist/lib/service-manager/index.js +105 -0
  1009. package/dist/lib/service-manager/launchd.d.ts +81 -0
  1010. package/dist/lib/service-manager/launchd.js +212 -0
  1011. package/dist/lib/service-manager/systemd.d.ts +19 -0
  1012. package/dist/lib/service-manager/systemd.js +72 -0
  1013. package/dist/lib/service-manager/types.d.ts +34 -0
  1014. package/dist/lib/service-manager/types.js +26 -0
  1015. package/dist/lib/test-utils/isolated-flag-company-context.d.ts +3 -0
  1016. package/dist/lib/test-utils/isolated-flag-company-context.js +18 -0
  1017. package/dist/lib/work-context/bind-best.d.ts +66 -0
  1018. package/dist/lib/work-context/bind-best.js +344 -0
  1019. package/dist/lib/work-context/bind-calling-session.d.ts +26 -0
  1020. package/dist/lib/work-context/bind-calling-session.js +63 -0
  1021. package/dist/lib/work-context/company-rebind.d.ts +23 -0
  1022. package/dist/lib/work-context/company-rebind.js +59 -0
  1023. package/dist/lib/work-context/company.d.ts +22 -20
  1024. package/dist/lib/work-context/company.js +124 -40
  1025. package/dist/lib/work-context/config.d.ts +58 -11
  1026. package/dist/lib/work-context/config.js +334 -83
  1027. package/dist/lib/work-context/contract.d.ts +13 -0
  1028. package/dist/lib/work-context/contract.schema.json +3 -1
  1029. package/dist/lib/work-context/default-company.d.ts +43 -0
  1030. package/dist/lib/work-context/default-company.js +83 -0
  1031. package/dist/lib/work-context/outbox-quarantine-status-flag.d.ts +4 -0
  1032. package/dist/lib/work-context/outbox-quarantine-status-flag.js +7 -0
  1033. package/dist/lib/work-context/outbox.d.ts +27 -5
  1034. package/dist/lib/work-context/outbox.js +135 -6
  1035. package/dist/lib/work-context/prd-sync.d.ts +56 -0
  1036. package/dist/lib/work-context/prd-sync.js +197 -0
  1037. package/dist/lib/work-context/preflight-contract.d.ts +28 -0
  1038. package/dist/lib/work-context/preflight-contract.js +85 -0
  1039. package/dist/lib/work-context/prompt-rebind.d.ts +25 -0
  1040. package/dist/lib/work-context/prompt-rebind.js +85 -0
  1041. package/dist/lib/work-context/reconcile.d.ts +15 -0
  1042. package/dist/lib/work-context/reconcile.js +405 -29
  1043. package/dist/lib/work-context/state.d.ts +93 -10
  1044. package/dist/lib/work-context/state.js +342 -29
  1045. package/dist/lib/work-context/windows-acl.d.ts +123 -0
  1046. package/dist/lib/work-context/windows-acl.js +425 -0
  1047. package/dist/lib/workers-registry/index.js +62 -8
  1048. package/dist/lib/workers-registry/read.d.ts +15 -0
  1049. package/dist/lib/workers-registry/read.js +17 -0
  1050. package/dist/main.d.ts +32 -0
  1051. package/dist/main.js +273 -73
  1052. package/dist/native-fast-route.d.ts +7 -0
  1053. package/dist/native-fast-route.js +45 -0
  1054. package/dist/node-network-compat-core.d.ts +12 -0
  1055. package/dist/node-network-compat-core.js +41 -0
  1056. package/dist/node-network-compat-fast.d.ts +7 -0
  1057. package/dist/node-network-compat-fast.js +23 -0
  1058. package/dist/node-network-compat.d.ts +2 -30
  1059. package/dist/node-network-compat.js +4 -51
  1060. package/dist/node-preflight.d.ts +7 -1
  1061. package/dist/node-preflight.js +5 -5
  1062. package/dist/register-all.d.ts +4 -29
  1063. package/dist/register-all.js +4 -233
  1064. package/dist/run/discover-schemas.d.ts +2 -1
  1065. package/dist/run/env-graph-guard.d.ts +2 -2
  1066. package/dist/run/env-graph-guard.js +5 -2
  1067. package/dist/run/hq-plugin.d.ts +4 -0
  1068. package/dist/run/hq-plugin.js +36 -8
  1069. package/dist/secrets-env-fast-path.d.ts +5 -0
  1070. package/dist/secrets-env-fast-path.js +16 -0
  1071. package/dist/secrets-env-fast-route.d.ts +18 -0
  1072. package/dist/secrets-env-fast-route.js +54 -0
  1073. package/dist/sentry-before-send.js +80 -0
  1074. package/dist/sentry.d.ts +16 -4
  1075. package/dist/sentry.js +179 -18
  1076. package/dist/startup-registration.d.ts +26 -2
  1077. package/dist/startup-registration.js +116 -15
  1078. package/dist/utils/checkpoint-stamp-write-error.d.ts +28 -0
  1079. package/dist/utils/checkpoint-stamp-write-error.js +99 -0
  1080. package/dist/utils/cli-network-lifecycle.d.ts +4 -0
  1081. package/dist/utils/cli-network-lifecycle.js +11 -0
  1082. package/dist/utils/cli-telemetry.d.ts +75 -1
  1083. package/dist/utils/cli-telemetry.js +433 -7
  1084. package/dist/utils/client-health.d.ts +0 -4
  1085. package/dist/utils/client-health.js +2 -2
  1086. package/dist/utils/cognito-refresh-sentry.d.ts +3 -0
  1087. package/dist/utils/cognito-refresh-sentry.js +49 -0
  1088. package/dist/utils/cognito-session.d.ts +71 -0
  1089. package/dist/utils/cognito-session.js +481 -27
  1090. package/dist/utils/console-origin.d.ts +9 -0
  1091. package/dist/utils/console-origin.js +28 -0
  1092. package/dist/utils/contribution-table.d.ts +1 -1
  1093. package/dist/utils/core-eval-trigger.d.ts +4 -0
  1094. package/dist/utils/core-eval-trigger.js +88 -0
  1095. package/dist/utils/environmental-error.d.ts +18 -0
  1096. package/dist/utils/environmental-error.js +240 -7
  1097. package/dist/utils/exclusive-lock.d.ts +32 -0
  1098. package/dist/utils/exclusive-lock.js +75 -0
  1099. package/dist/utils/expected-cli-error.d.ts +2 -0
  1100. package/dist/utils/expected-cli-error.js +4 -0
  1101. package/dist/utils/fast-stream-errors.d.ts +12 -0
  1102. package/dist/utils/fast-stream-errors.js +18 -0
  1103. package/dist/utils/feedback-diagnostics.d.ts +2 -1
  1104. package/dist/utils/feedback-log-bundle.d.ts +51 -26
  1105. package/dist/utils/feedback-log-bundle.js +211 -31
  1106. package/dist/utils/feedback-logs.d.ts +18 -47
  1107. package/dist/utils/feedback-logs.js +50 -21
  1108. package/dist/utils/feedback-screenshots.d.ts +0 -1
  1109. package/dist/utils/feedback-screenshots.js +1 -1
  1110. package/dist/utils/files-browse-acl.d.ts +5 -0
  1111. package/dist/utils/files-browse-acl.js +11 -0
  1112. package/dist/utils/hq-core-yaml.d.ts +10 -0
  1113. package/dist/utils/hq-core-yaml.js +40 -0
  1114. package/dist/utils/hq-root-resolver.d.ts +13 -0
  1115. package/dist/utils/hq-root-resolver.js +103 -0
  1116. package/dist/utils/hq-roots.d.ts +25 -2
  1117. package/dist/utils/hq-roots.js +67 -7
  1118. package/dist/utils/incomplete-install-error.d.ts +87 -19
  1119. package/dist/utils/incomplete-install-error.js +319 -68
  1120. package/dist/utils/install-tree-torn.d.ts +260 -24
  1121. package/dist/utils/install-tree-torn.js +998 -51
  1122. package/dist/utils/large-file-guard.d.ts +0 -10
  1123. package/dist/utils/large-file-guard.js +1 -1
  1124. package/dist/utils/local-files-overview.d.ts +4 -8
  1125. package/dist/utils/local-files-overview.js +48 -7
  1126. package/dist/utils/login-provider.d.ts +7 -0
  1127. package/dist/utils/login-provider.js +34 -0
  1128. package/dist/utils/pack-contributions.d.ts +2 -14
  1129. package/dist/utils/pack-contributions.js +7 -44
  1130. package/dist/utils/package-root-diagnostics.d.ts +1 -1
  1131. package/dist/utils/people.d.ts +7 -11
  1132. package/dist/utils/people.js +5 -20
  1133. package/dist/utils/plan-gate-error.d.ts +52 -10
  1134. package/dist/utils/plan-gate-error.js +364 -41
  1135. package/dist/utils/qmd-model-download-error.d.ts +0 -8
  1136. package/dist/utils/qmd-model-download-error.js +1 -1
  1137. package/dist/utils/qmd-query-document-error.d.ts +0 -6
  1138. package/dist/utils/qmd-query-document-error.js +1 -1
  1139. package/dist/utils/redact-error-text.d.ts +0 -2
  1140. package/dist/utils/redact-error-text.js +3 -2
  1141. package/dist/utils/redact-url.d.ts +14 -0
  1142. package/dist/utils/redact-url.js +218 -0
  1143. package/dist/utils/run-bundled-script.d.ts +6 -0
  1144. package/dist/utils/run-bundled-script.js +117 -4
  1145. package/dist/utils/sandbox-runner-client.d.ts +2 -1
  1146. package/dist/utils/scaffold-fast-import-guard.d.ts +2 -0
  1147. package/dist/utils/scaffold-fast-import-guard.js +40 -0
  1148. package/dist/utils/scaffold-packlist-guard.d.ts +7 -0
  1149. package/dist/utils/scaffold-packlist-guard.js +23 -0
  1150. package/dist/utils/scaffold-sibling-references.d.ts +22 -0
  1151. package/dist/utils/scaffold-sibling-references.js +156 -0
  1152. package/dist/utils/secret-load-availability.d.ts +8 -0
  1153. package/dist/utils/secret-load-availability.js +54 -0
  1154. package/dist/utils/secrets-cache.d.ts +7 -3
  1155. package/dist/utils/secrets-cache.js +162 -14
  1156. package/dist/utils/self-update.d.ts +34 -1
  1157. package/dist/utils/self-update.js +660 -42
  1158. package/dist/utils/sentry-fingerprint.d.ts +23 -1
  1159. package/dist/utils/sentry-fingerprint.js +223 -31
  1160. package/dist/utils/staged-install.d.ts +34 -0
  1161. package/dist/utils/staged-install.js +346 -0
  1162. package/dist/utils/staged-npm-install.d.ts +16 -0
  1163. package/dist/utils/staged-npm-install.js +264 -0
  1164. package/dist/utils/sync-log-sources.d.ts +15 -0
  1165. package/dist/utils/sync-log-sources.js +36 -0
  1166. package/dist/utils/table-width.d.ts +7 -0
  1167. package/dist/utils/table-width.js +15 -0
  1168. package/dist/utils/team-upgrade.d.ts +1 -1
  1169. package/dist/utils/team-upgrade.js +4 -3
  1170. package/dist/utils/update-command-supervisor.cjs +247 -0
  1171. package/dist/utils/upload-author.d.ts +15 -0
  1172. package/dist/utils/upload-author.js +39 -0
  1173. package/dist/utils/vault-api.d.ts +21 -1
  1174. package/dist/utils/vault-api.js +251 -84
  1175. package/dist/utils/version-check.d.ts +11 -1
  1176. package/dist/utils/version-check.js +32 -3
  1177. package/dist/utils/version-gate.d.ts +101 -17
  1178. package/dist/utils/version-gate.js +645 -70
  1179. package/dist/utils/version-report.d.ts +27 -0
  1180. package/dist/utils/version-report.js +105 -0
  1181. package/dist/utils/windows-spawn.d.ts +6 -0
  1182. package/dist/utils/windows-spawn.js +37 -0
  1183. package/dist/version-request.d.ts +14 -0
  1184. package/dist/version-request.js +36 -0
  1185. package/package.json +20 -8
  1186. package/scripts/mesh-daemon-if-stale.mjs +20 -0
  1187. package/templates/reports/blank.md +3 -0
  1188. package/templates/reports/daily-digest.md +11 -0
  1189. package/templates/runbooks/update-report.md +21 -0
  1190. package/dist/commands/scaffold-fast.d.ts +0 -41
  1191. package/dist/commands/scaffold-fast.js +0 -57
  1192. package/dist/lib/work-context/index.d.ts +0 -25
  1193. package/dist/lib/work-context/index.js +0 -21
@@ -0,0 +1,1198 @@
1
+ /** Native TypeScript ports of the Wave 2 worktree and resume helpers. */
2
+ import { spawnSync } from "node:child_process";
3
+ import * as fs from "node:fs";
4
+ import * as path from "node:path";
5
+ import { randomBytes } from "node:crypto";
6
+ import { fileURLToPath } from "node:url";
7
+ import { serializeJqJson } from "./jq-json-serializer.js";
8
+ export const WORKTREE_GC_ASSET = "core/scripts/worktree-gc.sh";
9
+ export const CLEAN_HANDOFF_ASSET = "core/scripts/clean-worktree-reconcile-handoff.sh";
10
+ export const RESUME_LOCK_ASSET = "core/scripts/resume-thread-lock.sh";
11
+ export const VERIFY_DELIVERABLES_ASSET = "core/scripts/verify-story-deliverables.sh";
12
+ const stdout = (io, value) => (io.stdout ?? ((v) => process.stdout.write(v)))(value);
13
+ const stderr = (io, value) => (io.stderr ?? ((v) => process.stderr.write(v)))(value);
14
+ const envOf = (io) => io.env ?? process.env;
15
+ const nowOf = (io) => (io.now ?? (() => new Date()))();
16
+ const stripTrailingNewlines = (value) => value.replace(/\n+$/u, "");
17
+ function git(args, options = {}) {
18
+ const childEnv = options.env;
19
+ let priorAllow;
20
+ if (!childEnv && options.allowHqRoot) {
21
+ priorAllow = process.env.HQ_ALLOW_HQ_ROOT_GIT;
22
+ process.env.HQ_ALLOW_HQ_ROOT_GIT = "1";
23
+ }
24
+ try {
25
+ const result = spawnSync("git", [...args], {
26
+ cwd: options.cwd,
27
+ encoding: "buffer",
28
+ timeout: options.timeout,
29
+ maxBuffer: 512 * 1024 * 1024,
30
+ ...(childEnv ? { env: childEnv } : {}),
31
+ });
32
+ return {
33
+ status: result.status ?? (result.error ? 127 : 1),
34
+ stdout: result.stdout ?? Buffer.alloc(0),
35
+ stderr: result.stderr ?? Buffer.alloc(0),
36
+ ...(result.error ? { error: result.error } : {}),
37
+ };
38
+ }
39
+ finally {
40
+ if (!childEnv && options.allowHqRoot) {
41
+ if (priorAllow === undefined)
42
+ delete process.env.HQ_ALLOW_HQ_ROOT_GIT;
43
+ else
44
+ process.env.HQ_ALLOW_HQ_ROOT_GIT = priorAllow;
45
+ }
46
+ }
47
+ }
48
+ function gitText(args, options = {}) {
49
+ const result = git(args, options);
50
+ return { ...result, text: result.stdout.toString("utf8") };
51
+ }
52
+ function commandOutput(result) {
53
+ return stripTrailingNewlines(result.text);
54
+ }
55
+ function fileExists(file) {
56
+ try {
57
+ fs.accessSync(file);
58
+ return true;
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ function statMtime(file) {
65
+ try {
66
+ return Math.floor(fs.statSync(file).mtimeMs / 1000);
67
+ }
68
+ catch {
69
+ return 0;
70
+ }
71
+ }
72
+ export function worktreeGcPathKey(value) {
73
+ const bytes = Buffer.from(value, "utf8");
74
+ let crc = 0;
75
+ const add = (byte) => {
76
+ crc = (crc ^ (byte << 24)) >>> 0;
77
+ for (let bit = 0; bit < 8; bit++) {
78
+ crc = crc & 0x80000000 ? ((crc << 1) ^ 0x04c11db7) >>> 0 : (crc << 1) >>> 0;
79
+ }
80
+ };
81
+ for (const byte of bytes)
82
+ add(byte);
83
+ let length = bytes.length;
84
+ while (length !== 0) {
85
+ add(length & 0xff);
86
+ length = Math.floor(length / 256);
87
+ }
88
+ return ((~crc) >>> 0).toString(10);
89
+ }
90
+ function byteSort(values) {
91
+ return values.sort((a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b)));
92
+ }
93
+ function walkGitFiles(root, maxDepth) {
94
+ const found = [];
95
+ const visit = (directory, depth) => {
96
+ let entries;
97
+ try {
98
+ entries = fs.readdirSync(directory, { withFileTypes: true });
99
+ }
100
+ catch {
101
+ return;
102
+ }
103
+ for (const entry of entries) {
104
+ const candidate = path.join(directory, entry.name);
105
+ if (entry.name === ".git" && depth + 1 <= maxDepth && entry.isFile())
106
+ found.push(candidate);
107
+ else if (depth + 1 < maxDepth && entry.isDirectory())
108
+ visit(candidate, depth + 1);
109
+ }
110
+ };
111
+ if (fileExists(root))
112
+ visit(root, 0);
113
+ return found;
114
+ }
115
+ function sessionReferences(hqRoot, worktree) {
116
+ const roots = [
117
+ path.join(hqRoot, "workspace/sessions"),
118
+ path.join(hqRoot, ".claude/state"),
119
+ path.join(hqRoot, "workspace/threads/handoff.json"),
120
+ path.join(hqRoot, "workspace/locks"),
121
+ ];
122
+ const needle = Buffer.from(worktree, "utf8");
123
+ const visit = (target) => {
124
+ let info;
125
+ try {
126
+ info = fs.lstatSync(target);
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ if (info.isSymbolicLink())
132
+ return false;
133
+ if (info.isDirectory()) {
134
+ let names;
135
+ try {
136
+ names = fs.readdirSync(target);
137
+ }
138
+ catch {
139
+ return false;
140
+ }
141
+ for (const name of names)
142
+ if (visit(path.join(target, name)))
143
+ return true;
144
+ return false;
145
+ }
146
+ if (!info.isFile())
147
+ return false;
148
+ try {
149
+ return fs.readFileSync(target).includes(needle);
150
+ }
151
+ catch {
152
+ return false;
153
+ }
154
+ };
155
+ return roots.some(visit);
156
+ }
157
+ function executableOnPath(name, env) {
158
+ const pathValue = env.PATH ?? "";
159
+ for (const directory of pathValue.split(path.delimiter)) {
160
+ if (!directory)
161
+ continue;
162
+ const candidate = path.join(directory, name);
163
+ try {
164
+ fs.accessSync(candidate, process.platform === "win32" ? fs.constants.F_OK : fs.constants.X_OK);
165
+ if (!fs.statSync(candidate).isDirectory())
166
+ return true;
167
+ }
168
+ catch { /* command -v continues through PATH */ }
169
+ }
170
+ return false;
171
+ }
172
+ function duSizeKb(root) {
173
+ let bytes = 0;
174
+ const seen = new Set();
175
+ const visit = (target) => {
176
+ let info;
177
+ try {
178
+ info = fs.lstatSync(target);
179
+ }
180
+ catch {
181
+ return;
182
+ }
183
+ if (info.isSymbolicLink())
184
+ return;
185
+ const inode = `${info.dev}:${info.ino}`;
186
+ if (info.isFile() && seen.has(inode))
187
+ return;
188
+ if (info.isFile())
189
+ seen.add(inode);
190
+ bytes += typeof info.blocks === "number" ? info.blocks * 512 : info.size;
191
+ if (info.isDirectory()) {
192
+ let children;
193
+ try {
194
+ children = fs.readdirSync(target);
195
+ }
196
+ catch {
197
+ return;
198
+ }
199
+ for (const child of children)
200
+ visit(path.join(target, child));
201
+ }
202
+ };
203
+ visit(root);
204
+ return Math.ceil(bytes / 1024);
205
+ }
206
+ const WORKTREE_GC_HELP = `hq-core: public
207
+ worktree-gc.sh — safe garbage collector for stale HQ git worktrees.
208
+
209
+ HQ worktrees accumulate forever. Nothing GCs them, and a busy machine can
210
+ reach hundreds of worktrees / hundreds of GB. This script enumerates the
211
+ linked worktrees HQ creates under:
212
+ <hqRoot>/workspace/worktrees/ (flat <name>/ and nested <repo>/<name>/)
213
+ <hqRoot>/.claude/worktrees/ (agent-* local-only worktrees)
214
+ and removes ONLY the ones that are provably safe to lose.
215
+
216
+ DATA SAFETY IS PARAMOUNT. A worktree is removed only when EVERY guard holds:
217
+ 1. Working tree is clean — \`git status --porcelain\` is empty.
218
+ 2. Old enough — creation stamp (or dir mtime) is older
219
+ than the retention window (default 7d).
220
+ 3. Branch work is preserved — for a pushable (github) repo the tip is
221
+ reachable from origin (or the branch is
222
+ on origin at the same tip); for an
223
+ HQ-root local-only worktree the branch
224
+ is already merged into the HQ root's
225
+ local \`main\`. Fetch is best-effort; a
226
+ failed fetch makes the worktree UNSAFE.
227
+ 4. Not in use — no active session references its path,
228
+ and it was not touched in the last 2h.
229
+
230
+ Removal mechanics are the gentle git verbs only — never \`rm -rf\`, never
231
+ \`--force\`, never \`branch -D\`:
232
+ git -C <main-repo> worktree remove <abs> (HQ_ALLOW_HQ_ROOT_GIT=1 for HQ root)
233
+ git -C <main-repo> worktree prune
234
+ git -C <main-repo> branch -d <branch>
235
+
236
+ DRY-RUN IS THE DEFAULT. Nothing is removed unless \`--apply\` is passed. A single
237
+ worktree error is logged and skipped — it never aborts the run.
238
+
239
+ Usage:
240
+ worktree-gc.sh [--days N] [--apply] [--dry-run] [--gated] [--json]
241
+
242
+ Flags:
243
+ --days N retention window in days (default 7; env HQ_WORKTREE_GC_DAYS)
244
+ --apply actually remove safe worktrees (default: dry-run, no changes)
245
+ --dry-run classify only, make no changes (the default; explicit for clarity)
246
+ --gated no-op if a GC run already happened in the last 24h (for cadence
247
+ callers like handoff-post.sh); writes a marker on each real run
248
+ --json emit a machine-readable summary + per-worktree records on stdout
249
+
250
+ `;
251
+ export function runWorktreeGc(args, hqRoot, io = {}) {
252
+ const env = envOf(io);
253
+ let days = env.HQ_WORKTREE_GC_DAYS ?? "7";
254
+ let apply = false;
255
+ let json = false;
256
+ let gated = false;
257
+ for (let i = 0; i < args.length;) {
258
+ const arg = args[i] ?? "";
259
+ if (arg === "--days") {
260
+ days = args[i + 1] ?? "";
261
+ if (i + 1 >= args.length)
262
+ return 1;
263
+ i += 2;
264
+ }
265
+ else if (arg.startsWith("--days=")) {
266
+ days = arg.slice(7);
267
+ i++;
268
+ }
269
+ else if (arg === "--apply") {
270
+ apply = true;
271
+ i++;
272
+ }
273
+ else if (arg === "--dry-run") {
274
+ apply = false;
275
+ i++;
276
+ }
277
+ else if (arg === "--gated") {
278
+ gated = true;
279
+ i++;
280
+ }
281
+ else if (arg === "--json") {
282
+ json = true;
283
+ i++;
284
+ }
285
+ else if (arg === "-h" || arg === "--help") {
286
+ stdout(io, WORKTREE_GC_HELP);
287
+ return 0;
288
+ }
289
+ else {
290
+ stderr(io, `worktree-gc: unknown arg: ${arg}\n`);
291
+ return 2;
292
+ }
293
+ }
294
+ if (!/^\d+$/u.test(days)) {
295
+ stderr(io, `worktree-gc: --days must be a non-negative integer (got: ${days})\n`);
296
+ return 2;
297
+ }
298
+ const now = Math.floor(nowOf(io).getTime() / 1000);
299
+ const dayCount = Number(days);
300
+ const cutoffEpoch = now - dayCount * 86400;
301
+ const recentEpoch = now - 2 * 60 * 60;
302
+ const metaDir = path.join(hqRoot, "workspace/worktrees/.gc-meta");
303
+ const gateMarker = path.join(metaDir, ".last-gc-run");
304
+ if (gated) {
305
+ if (fileExists(gateMarker) && now - statMtime(gateMarker) < 86400) {
306
+ stdout(io, json
307
+ ? '{"skipped":"gated","reason":"ran within 24h"}\n'
308
+ : "worktree-gc: skipped (gated — ran within 24h)\n");
309
+ return 0;
310
+ }
311
+ try {
312
+ fs.mkdirSync(metaDir, { recursive: true });
313
+ }
314
+ catch { /* shell uses mkdir ... || true */ }
315
+ try {
316
+ const fd = fs.openSync(gateMarker, "a");
317
+ fs.closeSync(fd);
318
+ const date = nowOf(io);
319
+ fs.utimesSync(gateMarker, date, date);
320
+ }
321
+ catch { /* shell uses touch ... || true */ }
322
+ }
323
+ const candidates = byteSort([
324
+ ...walkGitFiles(path.join(hqRoot, "workspace/worktrees"), 4),
325
+ ...walkGitFiles(path.join(hqRoot, ".claude/worktrees"), 3),
326
+ ].map((file) => {
327
+ try {
328
+ return fs.realpathSync(path.dirname(file));
329
+ }
330
+ catch {
331
+ return path.resolve(path.dirname(file));
332
+ }
333
+ }).filter((value, index, all) => all.indexOf(value) === index));
334
+ const selfDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)));
335
+ const records = [];
336
+ let examined = 0, removed = 0, would = 0, reclaimedKb = 0, skipped = 0;
337
+ const record = (values) => { records.push(values); };
338
+ const skip = (wt, repo, branch, isHqRoot, ageDays, sizeKb, reason) => {
339
+ skipped++;
340
+ if (reason === "remove-failed")
341
+ record({ path: wt, repo, branch, hq_root: isHqRoot, age_days: ageDays, size_kb: sizeKb, action: "skipped", reason });
342
+ if (!json)
343
+ stdout(io, ` skip [${reason}] ${wt}\n`);
344
+ };
345
+ const runFetch = (repo) => {
346
+ const timeoutName = executableOnPath("timeout", env) ? "timeout" : executableOnPath("gtimeout", env) ? "gtimeout" : undefined;
347
+ const timeoutSeconds = timeoutName ? 45_000 : undefined;
348
+ // The timeout utility itself is intentionally not spawned. spawnSync applies the
349
+ // same 45 second ceiling directly around the permitted git child.
350
+ return git(["-C", repo, "fetch", "origin", "--quiet"], { timeout: timeoutSeconds }).status === 0;
351
+ };
352
+ const isAncestor = (repo, ancestor, descendant) => git(["-C", repo, "merge-base", "--is-ancestor", ancestor, descendant]).status === 0;
353
+ const wtGit = (repo, isHqRoot, gitArgs) => git(["-C", repo, ...gitArgs], { allowHqRoot: isHqRoot });
354
+ for (const wt of candidates) {
355
+ examined++;
356
+ if (selfDir === wt || selfDir.startsWith(`${wt}${path.sep}`)) {
357
+ skip(wt, "", "", false, null, null, "self");
358
+ continue;
359
+ }
360
+ const common = gitText(["-C", wt, "rev-parse", "--path-format=absolute", "--git-common-dir"]);
361
+ const commonDir = common.status === 0 ? commandOutput(common) : "";
362
+ if (!commonDir) {
363
+ skip(wt, "", "", false, null, null, "git-error");
364
+ continue;
365
+ }
366
+ let mainRepo = "";
367
+ try {
368
+ mainRepo = fs.realpathSync(path.dirname(commonDir));
369
+ }
370
+ catch { /* pwd -P fallback is empty on failure */ }
371
+ if (!mainRepo || !fileExists(mainRepo)) {
372
+ skip(wt, "", "", false, null, null, "git-error");
373
+ continue;
374
+ }
375
+ let isHqRoot = false;
376
+ try {
377
+ isHqRoot = fs.realpathSync(mainRepo) === fs.realpathSync(hqRoot);
378
+ }
379
+ catch { /* both paths are already resolved by the core root resolver */ }
380
+ const branchResult = gitText(["-C", wt, "symbolic-ref", "--short", "HEAD"]);
381
+ const branch = branchResult.status === 0 ? commandOutput(branchResult) : "";
382
+ const headResult = gitText(["-C", wt, "rev-parse", "HEAD"]);
383
+ const head = headResult.status === 0 ? commandOutput(headResult) : "";
384
+ const statusResult = gitText(["-C", wt, "status", "--porcelain"]);
385
+ const porcelain = statusResult.status === 0 ? stripTrailingNewlines(statusResult.text) : "__ERR__";
386
+ if (porcelain === "__ERR__") {
387
+ skip(wt, mainRepo, branch, isHqRoot, null, null, "git-error");
388
+ continue;
389
+ }
390
+ if (porcelain !== "") {
391
+ skip(wt, mainRepo, branch, isHqRoot, null, null, "dirty");
392
+ continue;
393
+ }
394
+ const wtMtime = statMtime(wt);
395
+ if (wtMtime > recentEpoch) {
396
+ skip(wt, mainRepo, branch, isHqRoot, null, null, "recent-activity");
397
+ continue;
398
+ }
399
+ if (sessionReferences(hqRoot, wt)) {
400
+ skip(wt, mainRepo, branch, isHqRoot, null, null, "active-session");
401
+ continue;
402
+ }
403
+ let createdEpoch = wtMtime;
404
+ const stampFile = path.join(metaDir, `${worktreeGcPathKey(wt)}.json`);
405
+ if (fileExists(stampFile)) {
406
+ try {
407
+ const stamp = JSON.parse(fs.readFileSync(stampFile, "utf8"));
408
+ const stamped = stamp?.createdAtEpoch;
409
+ if (stamped !== undefined && stamped !== null && stamped !== "") {
410
+ const numeric = Number(stamped);
411
+ if (Number.isFinite(numeric))
412
+ createdEpoch = numeric;
413
+ }
414
+ }
415
+ catch { /* jq read errors are silenced */ }
416
+ }
417
+ const ageDays = Math.trunc((now - createdEpoch) / 86400);
418
+ if (createdEpoch > cutoffEpoch) {
419
+ skip(wt, mainRepo, branch, isHqRoot, ageDays, null, "too-recent");
420
+ continue;
421
+ }
422
+ let preserved = false;
423
+ if (isHqRoot) {
424
+ if (head && isAncestor(hqRoot, head, "main"))
425
+ preserved = true;
426
+ if (!preserved) {
427
+ skip(wt, mainRepo, branch, isHqRoot, ageDays, null, "unmerged-local");
428
+ continue;
429
+ }
430
+ }
431
+ else {
432
+ const originResult = gitText(["-C", mainRepo, "remote", "get-url", "origin"]);
433
+ const origin = originResult.status === 0 ? commandOutput(originResult) : "";
434
+ if (!origin.includes("github")) {
435
+ skip(wt, mainRepo, branch, isHqRoot, ageDays, null, "non-github-remote");
436
+ continue;
437
+ }
438
+ if (!runFetch(mainRepo)) {
439
+ skip(wt, mainRepo, branch, isHqRoot, ageDays, null, "fetch-failed");
440
+ continue;
441
+ }
442
+ for (const ref of ["origin/HEAD", "origin/main", "origin/master"]) {
443
+ if (git(["-C", mainRepo, "rev-parse", "--verify", "--quiet", ref]).status === 0 && head && isAncestor(mainRepo, head, ref)) {
444
+ preserved = true;
445
+ break;
446
+ }
447
+ }
448
+ if (!preserved && branch && head) {
449
+ let remote = gitText(["-C", mainRepo, "rev-parse", "--verify", "--quiet", `refs/remotes/origin/${branch}`]);
450
+ let remoteSha = remote.status === 0 ? commandOutput(remote) : "";
451
+ if (!remoteSha) {
452
+ remote = gitText(["-C", mainRepo, "ls-remote", "--heads", "origin", branch]);
453
+ if (remote.status === 0)
454
+ remoteSha = (remote.text.split(/\r?\n/u).find(Boolean) ?? "").split(/\s+/u)[0] ?? "";
455
+ }
456
+ if (remoteSha && remoteSha === head)
457
+ preserved = true;
458
+ }
459
+ if (!preserved) {
460
+ skip(wt, mainRepo, branch, isHqRoot, ageDays, null, "unpushed");
461
+ continue;
462
+ }
463
+ }
464
+ const sizeKb = duSizeKb(wt);
465
+ if (!apply) {
466
+ would++;
467
+ reclaimedKb += sizeKb;
468
+ record({ path: wt, repo: mainRepo, branch, hq_root: isHqRoot, age_days: ageDays, size_kb: sizeKb, action: "would-remove", reason: "safe" });
469
+ if (!json)
470
+ stdout(io, ` DRY would remove (${Math.floor(sizeKb / 1024)} MB, ${ageDays}d) ${wt}\n`);
471
+ continue;
472
+ }
473
+ if (wtGit(mainRepo, isHqRoot, ["worktree", "remove", wt]).status !== 0) {
474
+ skip(wt, mainRepo, branch, isHqRoot, ageDays, sizeKb, "remove-failed");
475
+ continue;
476
+ }
477
+ wtGit(mainRepo, isHqRoot, ["worktree", "prune"]);
478
+ if (branch)
479
+ wtGit(mainRepo, isHqRoot, ["branch", "-d", branch]);
480
+ try {
481
+ fs.unlinkSync(stampFile);
482
+ }
483
+ catch { /* rm -f */ }
484
+ removed++;
485
+ reclaimedKb += sizeKb;
486
+ record({ path: wt, repo: mainRepo, branch, hq_root: isHqRoot, age_days: ageDays, size_kb: sizeKb, action: "removed", reason: "safe" });
487
+ if (!json)
488
+ stdout(io, ` GC removed (${Math.floor(sizeKb / 1024)} MB, ${ageDays}d) ${wt}\n`);
489
+ }
490
+ const reclaimedGb = Number((reclaimedKb / 1024 / 1024).toFixed(2));
491
+ if (json) {
492
+ const skippedByReason = {};
493
+ for (const reason of records.filter((item) => item.action === "skipped").map((item) => item.reason).sort()) {
494
+ skippedByReason[reason] = (skippedByReason[reason] ?? 0) + 1;
495
+ }
496
+ const serialized = serializeJqJson({
497
+ mode: apply ? "apply" : "dry-run",
498
+ retention_days: dayCount,
499
+ examined,
500
+ removed,
501
+ reclaimed_gb: reclaimedGb,
502
+ reclaimed_kb: reclaimedKb,
503
+ skipped_by_reason: skippedByReason,
504
+ records,
505
+ }, "pretty").replace(/("reclaimed_gb": )(-?\d+(?:\.\d+)?)/u, `$1${(reclaimedKb / 1024 / 1024).toFixed(2)}`);
506
+ stdout(io, serialized);
507
+ }
508
+ else if (apply) {
509
+ stdout(io, `worktree-gc [apply]: examined ${examined} · removed ${removed} · reclaimed ${reclaimedGb.toFixed(2)} GB · skipped ${skipped} (retention ${days}d)\n`);
510
+ }
511
+ else {
512
+ stdout(io, `worktree-gc [dry-run]: examined ${examined} · would remove ${would} · would reclaim ${reclaimedGb.toFixed(2)} GB · skipped ${skipped} (retention ${days}d)\n`);
513
+ }
514
+ return 0;
515
+ }
516
+ const CLEAN_HANDOFF_USAGE = "Usage: clean-worktree-reconcile-handoff.sh <absolute-hq-root> <local-branch>\n";
517
+ function cleanUsage(io) { stderr(io, CLEAN_HANDOFF_USAGE); }
518
+ function cleanGitError(io, message) { stderr(io, `${message}\n`); return 1; }
519
+ function realPathOrResolved(value) {
520
+ try {
521
+ return fs.realpathSync(value);
522
+ }
523
+ catch {
524
+ return path.resolve(value);
525
+ }
526
+ }
527
+ function gitShowFile(root, branchRef, relativePath) {
528
+ return git(["-C", root, "show", `${branchRef}:${relativePath}`]);
529
+ }
530
+ function pathType(target) {
531
+ try {
532
+ const info = fs.lstatSync(target);
533
+ return info.isFile() && !info.isSymbolicLink() ? "regular" : "other";
534
+ }
535
+ catch (error) {
536
+ return error.code === "ENOENT" ? "missing" : "other";
537
+ }
538
+ }
539
+ function compareBranchFile(root, branchRef, relativePath, localFile) {
540
+ const incoming = gitShowFile(root, branchRef, relativePath);
541
+ if (incoming.status !== 0)
542
+ return 2;
543
+ try {
544
+ return fs.readFileSync(localFile).equals(incoming.stdout) ? 0 : 1;
545
+ }
546
+ catch {
547
+ return 2;
548
+ }
549
+ }
550
+ export function runCleanWorktreeReconcileHandoff(args, io = {}) {
551
+ if (args.length !== 2) {
552
+ cleanUsage(io);
553
+ return 64;
554
+ }
555
+ const rawRoot = args[0] ?? "";
556
+ const branch = args[1] ?? "";
557
+ if (!rawRoot.startsWith("/")) {
558
+ stderr(io, `ERROR: HQ root must be an absolute path\n`);
559
+ cleanUsage(io);
560
+ return 64;
561
+ }
562
+ if (!fileExists(rawRoot) || !fs.statSync(rawRoot).isDirectory()) {
563
+ return cleanGitError(io, `ERROR: HQ root is not a directory: ${rawRoot}`);
564
+ }
565
+ const hqRoot = realPathOrResolved(rawRoot);
566
+ const top = gitText(["-C", hqRoot, "rev-parse", "--show-toplevel"]);
567
+ if (top.status !== 0)
568
+ return cleanGitError(io, `ERROR: HQ root is not a Git worktree: ${hqRoot}`);
569
+ const topLevel = realPathOrResolved(commandOutput(top));
570
+ if (topLevel !== hqRoot)
571
+ return cleanGitError(io, `ERROR: supplied path is not the Git worktree root: ${hqRoot}`);
572
+ const branchRef = `refs/heads/${branch}`;
573
+ if (git(["-C", hqRoot, "show-ref", "--verify", "--quiet", branchRef]).status !== 0) {
574
+ return cleanGitError(io, `ERROR: incoming branch does not exist locally: ${branch}`);
575
+ }
576
+ const pointerPath = "workspace/threads/handoff.json";
577
+ if (git(["-C", hqRoot, "cat-file", "-e", `${branchRef}:${pointerPath}`]).status !== 0) {
578
+ stdout(io, `No incoming handoff pointer on ${branch}; no mirror paths to reconcile.\n`);
579
+ return 0;
580
+ }
581
+ const pointer = gitShowFile(hqRoot, branchRef, pointerPath);
582
+ let threadPath;
583
+ try {
584
+ const parsed = JSON.parse(pointer.stdout.toString("utf8"));
585
+ threadPath = parsed?.thread_path;
586
+ }
587
+ catch {
588
+ threadPath = undefined;
589
+ }
590
+ if (pointer.status !== 0 || typeof threadPath !== "string") {
591
+ return cleanGitError(io, "ERROR: incoming branch handoff pointer has no string thread_path");
592
+ }
593
+ if (!threadPath.startsWith("workspace/threads/")) {
594
+ return cleanGitError(io, `ERROR: unsafe incoming handoff thread_path: ${threadPath}`);
595
+ }
596
+ if (threadPath.includes("//") || threadPath.includes("/./") || threadPath.includes("/../") || threadPath === pointerPath || /[\n\r]/u.test(threadPath)) {
597
+ return cleanGitError(io, `ERROR: unsafe incoming handoff thread_path: ${threadPath}`);
598
+ }
599
+ if (git(["-C", hqRoot, "cat-file", "-e", `${branchRef}:${threadPath}`]).status !== 0) {
600
+ return cleanGitError(io, `ERROR: incoming handoff thread is missing from ${branch}: ${threadPath}`);
601
+ }
602
+ const mirrors = [pointerPath, threadPath];
603
+ const identical = [];
604
+ const differing = [];
605
+ for (const relativePath of mirrors) {
606
+ const absolute = path.join(hqRoot, relativePath);
607
+ const type = pathType(absolute);
608
+ if (type === "missing")
609
+ continue;
610
+ if (type !== "regular") {
611
+ differing.push(`${relativePath} (not a regular file)`);
612
+ continue;
613
+ }
614
+ const status = compareBranchFile(hqRoot, branchRef, relativePath, absolute);
615
+ if (status === 0)
616
+ identical.push(relativePath);
617
+ else if (status === 1)
618
+ differing.push(`${relativePath} (content differs from ${branch})`);
619
+ else
620
+ return cleanGitError(io, `ERROR: could not compare incoming ${relativePath} with ${absolute}`);
621
+ }
622
+ if (differing.length > 0) {
623
+ for (const relativePath of differing)
624
+ stderr(io, `BLOCK: preserved main-checkout handoff path: ${relativePath}\n`);
625
+ stderr(io, `No mirror paths were removed; surface these local files before merging.\n`);
626
+ return 2;
627
+ }
628
+ let reconciliationBlocked = false;
629
+ for (const relativePath of identical) {
630
+ const absolute = path.join(hqRoot, relativePath);
631
+ const type = pathType(absolute);
632
+ if (type === "missing")
633
+ continue;
634
+ if (type !== "regular") {
635
+ stderr(io, `BLOCK: preserved changed main-checkout path: ${relativePath}\n`);
636
+ reconciliationBlocked = true;
637
+ continue;
638
+ }
639
+ const destinationDir = path.dirname(absolute);
640
+ let movedFile = "";
641
+ try {
642
+ for (let attempt = 0; attempt < 10; attempt++) {
643
+ const candidate = path.join(destinationDir, `.clean-worktree-handoff.${randomBytes(4).toString("hex").slice(0, 6)}`);
644
+ try {
645
+ fs.writeFileSync(candidate, "", { flag: "wx", mode: 0o600 });
646
+ movedFile = candidate;
647
+ break;
648
+ }
649
+ catch (error) {
650
+ if (error.code !== "EEXIST")
651
+ throw error;
652
+ }
653
+ }
654
+ if (!movedFile)
655
+ throw new Error("could not allocate a temporary handoff filename");
656
+ }
657
+ catch {
658
+ return cleanGitError(io, `ERROR: could not safely move mirrored handoff path: ${relativePath}`);
659
+ }
660
+ try {
661
+ fs.renameSync(absolute, movedFile);
662
+ }
663
+ catch {
664
+ try {
665
+ fs.unlinkSync(movedFile);
666
+ }
667
+ catch { /* rm -f */ }
668
+ return cleanGitError(io, `ERROR: could not safely move mirrored handoff path: ${relativePath}`);
669
+ }
670
+ const comparison = pathType(movedFile) === "regular"
671
+ ? compareBranchFile(hqRoot, branchRef, relativePath, movedFile)
672
+ : 1;
673
+ if (comparison === 0) {
674
+ if (pathType(absolute) !== "missing") {
675
+ try {
676
+ fs.unlinkSync(movedFile);
677
+ }
678
+ catch { /* rm -f */ }
679
+ stderr(io, `BLOCK: a new main-checkout file appeared during reconciliation; preserved it: ${relativePath}\n`);
680
+ reconciliationBlocked = true;
681
+ }
682
+ else {
683
+ try {
684
+ fs.unlinkSync(movedFile);
685
+ }
686
+ catch { /* rm */ }
687
+ stdout(io, `Reconciled byte-identical handoff mirror: ${relativePath}\n`);
688
+ }
689
+ }
690
+ else {
691
+ if (pathType(absolute) === "missing") {
692
+ try {
693
+ fs.renameSync(movedFile, absolute);
694
+ stderr(io, `BLOCK: handoff path changed during reconciliation; restored it untouched: ${relativePath}\n`);
695
+ }
696
+ catch {
697
+ stderr(io, `BLOCK: handoff path changed during reconciliation; preserved it at ${movedFile}\n`);
698
+ }
699
+ }
700
+ else {
701
+ stderr(io, `BLOCK: handoff path changed during reconciliation; preserved captured file at ${movedFile} and current path ${absolute}\n`);
702
+ }
703
+ if (comparison === 2)
704
+ return cleanGitError(io, `ERROR: could not compare incoming ${relativePath} with its moved file`);
705
+ reconciliationBlocked = true;
706
+ }
707
+ }
708
+ if (reconciliationBlocked) {
709
+ stderr(io, `No merge should be attempted until the changed handoff paths are surfaced.\n`);
710
+ return 2;
711
+ }
712
+ return 0;
713
+ }
714
+ const RESUME_LOCK_USAGE = `usage:
715
+ resume-thread-lock.sh inspect <thread-id>
716
+ resume-thread-lock.sh acquire <thread-id> --session-id <session-id>
717
+ resume-thread-lock.sh acquire <thread-id> --replace --expected-generation <generation> --session-id <session-id>
718
+ `;
719
+ function lockState(threadId, relativeLockPath, lockDir, recordPath, staleSeconds, now) {
720
+ const unlocked = () => ({ status: "unlocked", thread_id: threadId, lock_path: relativeLockPath });
721
+ const stale = (reason, sessionId, resumedAt, generation) => ({
722
+ status: "stale", thread_id: threadId, lock_path: relativeLockPath, stale_reason: reason,
723
+ session_id: sessionId, resumed_at: resumedAt, lock_generation: generation,
724
+ prompt: `This thread was already resumed by ${sessionId} at ${resumedAt}. Its lock is stale (${reason}). Re-resume anyway?`,
725
+ });
726
+ const locked = (sessionId, resumedAt, generation) => ({
727
+ status: "locked", thread_id: threadId, lock_path: relativeLockPath,
728
+ session_id: sessionId, resumed_at: resumedAt, lock_generation: generation,
729
+ prompt: `This thread was already resumed by ${sessionId} at ${resumedAt}. Re-resume anyway?`,
730
+ });
731
+ let lockStat;
732
+ try {
733
+ lockStat = fs.statSync(lockDir);
734
+ }
735
+ catch { /* absent/unreadable path */ }
736
+ if (!lockStat?.isDirectory())
737
+ return fileExists(lockDir) ? stale("invalid-lock-path", "unknown session", "unknown time", "") : unlocked();
738
+ let recordStat;
739
+ try {
740
+ recordStat = fs.statSync(recordPath);
741
+ }
742
+ catch { /* absent/unreadable path */ }
743
+ if (!recordStat?.isFile())
744
+ return stale("missing-record", "unknown session", "unknown time", "");
745
+ let parsed;
746
+ try {
747
+ parsed = JSON.parse(fs.readFileSync(recordPath, "utf8"));
748
+ }
749
+ catch (error) {
750
+ return error.code === "ENOENT"
751
+ ? stale("missing-record", "unknown session", "unknown time", "")
752
+ : stale("invalid-record", "unknown session", "unknown time", "");
753
+ }
754
+ const value = parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
755
+ if (!(value.version === 1 && typeof value.thread_id === "string" && value.thread_id.length > 0 &&
756
+ typeof value.session_id === "string" && value.session_id.length > 0 &&
757
+ typeof value.resumed_at === "string" && value.resumed_at.length > 0 &&
758
+ typeof value.resumed_epoch === "number" && Number.isFinite(value.resumed_epoch) &&
759
+ typeof value.generation === "string" && value.generation.length > 0)) {
760
+ return stale("invalid-record", "unknown session", "unknown time", "");
761
+ }
762
+ const record = value;
763
+ if (record.thread_id !== threadId || !/^\d+$/u.test(String(record.resumed_epoch))) {
764
+ return stale("invalid-record", record.session_id, record.resumed_at, record.generation);
765
+ }
766
+ const currentEpoch = Math.floor(now.getTime() / 1000);
767
+ if (currentEpoch - record.resumed_epoch > staleSeconds) {
768
+ return stale("expired", record.session_id, record.resumed_at, record.generation);
769
+ }
770
+ return locked(record.session_id, record.resumed_at, record.generation);
771
+ }
772
+ function writeLockRecord(lockDir, recordPath, threadId, sessionId, now) {
773
+ const epoch = Math.floor(now.getTime() / 1000);
774
+ const timestamp = now.toISOString().replace(/\.\d{3}Z$/u, "Z");
775
+ let temporary = "";
776
+ for (let attempt = 0; attempt < 10; attempt++) {
777
+ const generation = `.current.${randomBytes(8).toString("base64url").slice(0, 6)}`;
778
+ const candidate = path.join(lockDir, generation);
779
+ try {
780
+ fs.writeFileSync(candidate, serializeJqJson({ version: 1, thread_id: threadId, session_id: sessionId, resumed_at: timestamp, resumed_epoch: epoch, generation }, "compact"), { flag: "wx", mode: 0o600 });
781
+ temporary = candidate;
782
+ break;
783
+ }
784
+ catch (error) {
785
+ if (error.code !== "EEXIST")
786
+ throw error;
787
+ }
788
+ }
789
+ if (!temporary)
790
+ throw new Error("could not allocate a lock record filename");
791
+ const generation = path.basename(temporary);
792
+ fs.renameSync(temporary, recordPath);
793
+ return generation;
794
+ }
795
+ export function runResumeThreadLock(args, hqRoot, io = {}) {
796
+ const env = envOf(io);
797
+ const staleSecondsText = env.HQ_RESUME_LOCK_STALE_SECONDS ?? "86400";
798
+ const replaceClaimStaleText = env.HQ_RESUME_REPLACE_CLAIM_STALE_SECONDS ?? "60";
799
+ const failUsage = (message) => { stderr(io, `resume-thread-lock: ${message}\n${RESUME_LOCK_USAGE}`); return 2; };
800
+ const emit = (state) => stdout(io, serializeJqJson(state, "compact"));
801
+ if (!/^\d+$/u.test(staleSecondsText))
802
+ return failUsage("HQ_RESUME_LOCK_STALE_SECONDS must be a non-negative integer");
803
+ if (!/^\d+$/u.test(replaceClaimStaleText))
804
+ return failUsage("HQ_RESUME_REPLACE_CLAIM_STALE_SECONDS must be a non-negative integer");
805
+ const staleSeconds = Number(staleSecondsText);
806
+ const replaceClaimStaleSeconds = Number(replaceClaimStaleText);
807
+ const rest = [...args];
808
+ const subcommand = rest.shift() ?? "";
809
+ const threadId = rest.shift() ?? "";
810
+ if (!/^T-[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(threadId))
811
+ return failUsage("thread id must be a canonical T-* id");
812
+ let replace = false, sessionId = "", expectedGeneration = "", expectedGenerationSet = false;
813
+ while (rest.length > 0) {
814
+ const arg = rest.shift() ?? "";
815
+ if (arg === "--replace")
816
+ replace = true;
817
+ else if (arg === "--session-id") {
818
+ if (rest.length === 0)
819
+ return failUsage("--session-id requires a value");
820
+ sessionId = rest.shift() ?? "";
821
+ }
822
+ else if (arg === "--expected-generation") {
823
+ if (rest.length === 0)
824
+ return failUsage("--expected-generation requires a value");
825
+ expectedGeneration = rest.shift() ?? "";
826
+ expectedGenerationSet = true;
827
+ }
828
+ else
829
+ return failUsage(`unknown argument: ${arg}`);
830
+ }
831
+ if (subcommand === "inspect") {
832
+ if (replace || sessionId.length > 0)
833
+ return failUsage("inspect takes only a thread id");
834
+ }
835
+ else if (subcommand === "acquire") {
836
+ if (!sessionId)
837
+ return failUsage("acquire requires --session-id");
838
+ if (replace) {
839
+ if (!expectedGenerationSet)
840
+ return failUsage("--replace requires --expected-generation from the inspected lock");
841
+ }
842
+ else if (expectedGenerationSet)
843
+ return failUsage("--expected-generation is only valid with --replace");
844
+ }
845
+ else
846
+ return failUsage("expected inspect or acquire");
847
+ const threadsDir = path.join(hqRoot, "workspace/threads");
848
+ const locksDir = path.join(threadsDir, "resume-locks");
849
+ const lockDir = path.join(locksDir, `${threadId}.lock`);
850
+ const recordPath = path.join(lockDir, "current.json");
851
+ const claimDir = path.join(lockDir, ".replace-claim");
852
+ const relativeLockPath = `workspace/threads/resume-locks/${threadId}.lock`;
853
+ const now = () => nowOf(io);
854
+ if (subcommand === "inspect") {
855
+ emit(lockState(threadId, relativeLockPath, lockDir, recordPath, staleSeconds, now()));
856
+ return 0;
857
+ }
858
+ fs.mkdirSync(locksDir, { recursive: true });
859
+ try {
860
+ fs.mkdirSync(lockDir);
861
+ const generation = writeLockRecord(lockDir, recordPath, threadId, sessionId, now());
862
+ emit({ status: "acquired", thread_id: threadId, lock_path: relativeLockPath, session_id: sessionId, lock_generation: generation });
863
+ return 0;
864
+ }
865
+ catch (error) {
866
+ if (error.code !== "EEXIST")
867
+ throw error;
868
+ }
869
+ if (!replace) {
870
+ emit(lockState(threadId, relativeLockPath, lockDir, recordPath, staleSeconds, now()));
871
+ return 3;
872
+ }
873
+ let lockInfo;
874
+ try {
875
+ lockInfo = fs.statSync(lockDir);
876
+ }
877
+ catch { /* not a directory */ }
878
+ if (!lockInfo?.isDirectory()) {
879
+ stderr(io, `resume-thread-lock: cannot refresh non-directory lock path: ${relativeLockPath}\n`);
880
+ return 1;
881
+ }
882
+ const claimIsStale = () => Math.floor(now().getTime() / 1000) - statMtime(claimDir) > replaceClaimStaleSeconds;
883
+ let acquiredClaim = false;
884
+ try {
885
+ fs.mkdirSync(claimDir);
886
+ acquiredClaim = true;
887
+ }
888
+ catch { /* existing claim */ }
889
+ if (!acquiredClaim) {
890
+ let claimStat;
891
+ try {
892
+ claimStat = fs.statSync(claimDir);
893
+ }
894
+ catch { /* absent or invalid */ }
895
+ if (claimStat?.isDirectory() && claimIsStale()) {
896
+ try {
897
+ fs.rmdirSync(claimDir);
898
+ }
899
+ catch { /* rmdir refuses a claim with payloads */ }
900
+ try {
901
+ fs.mkdirSync(claimDir);
902
+ acquiredClaim = true;
903
+ }
904
+ catch { /* another process acquired it */ }
905
+ }
906
+ }
907
+ if (!acquiredClaim) {
908
+ emit(lockState(threadId, relativeLockPath, lockDir, recordPath, staleSeconds, now()));
909
+ return 4;
910
+ }
911
+ try {
912
+ const current = lockState(threadId, relativeLockPath, lockDir, recordPath, staleSeconds, now());
913
+ const currentGeneration = typeof current.lock_generation === "string" ? current.lock_generation : "";
914
+ if (currentGeneration !== expectedGeneration) {
915
+ emit(current);
916
+ return 4;
917
+ }
918
+ const generation = writeLockRecord(lockDir, recordPath, threadId, sessionId, now());
919
+ emit({ status: "acquired", thread_id: threadId, lock_path: relativeLockPath, session_id: sessionId, lock_generation: generation });
920
+ return 0;
921
+ }
922
+ finally {
923
+ try {
924
+ fs.rmdirSync(claimDir);
925
+ }
926
+ catch { /* shell trap only removes an empty directory */ }
927
+ }
928
+ }
929
+ const VERIFY_DELIVERABLES_HELP = "# hq-core: public\n# verify-story-deliverables.sh — make `passes: true` checkable: verify the\n# evidence a story worker returns, and any deliverables the PRD declared\n# (2026-09-07).\n#\n# Why: a PRD \"passes\" flag recorded that a step RAN, not that work EXISTS. An\n# audit found a project marked 16/17 complete whose named deliverables mostly\n# did not exist anywhere. Nothing anywhere checked disk or git.\n#\n# Two inputs, both optional, deliberately NOT strict by default:\n# * EVIDENCE — what the worker says it produced, returned at completion in\n# the run-project / execute-task return contract (`evidence: [...]`, plus\n# `commits: [...]` which are checked as `commit:` evidence). This is the\n# primary signal: it is written at the moment of completion, so it is\n# accurate to what was built, and --write records it on the story as an\n# audit trail. A claimed-but-missing item FAILS (a fabricated claim is\n# worse than no claim). No evidence at all is allowed (legacy workers).\n# * DELIVERABLES — what the PRD declared up front (optional). Checked when\n# present; a planned-but-missing item fails, because that is exactly the\n# \"16/17 complete, nothing on disk\" case.\n#\n# Usage:\n# verify-story-deliverables.sh --prd <prd.json> --story <id> [--repo <path>]\n# [--evidence-json '<array>'] [--commits-json '<array>'] [--write] [--json] [--strict]\n#\n# Reference forms (evidence and deliverables share them):\n# \"deliverables\": [\n# \"path:core/scripts/foo.sh\", # file or dir, relative to HQ root\n# \"repo-path:src/lib/bar.ts\", # relative to --repo (or metadata.repoPath)\n";
930
+ function jqText(value) {
931
+ if (value === null || value === undefined)
932
+ return "";
933
+ if (typeof value === "string")
934
+ return value;
935
+ if (typeof value === "object")
936
+ return serializeJqJson(value, "compact").replace(/\n$/u, "");
937
+ return String(value);
938
+ }
939
+ function jsonDecode(value) {
940
+ try {
941
+ return JSON.parse(value);
942
+ }
943
+ catch {
944
+ return undefined;
945
+ }
946
+ }
947
+ function jqArrayCheck(value) { return Array.isArray(value); }
948
+ function isReadable(file) {
949
+ try {
950
+ fs.accessSync(file, fs.constants.R_OK);
951
+ return true;
952
+ }
953
+ catch {
954
+ return false;
955
+ }
956
+ }
957
+ function joinShellPath(root, value) {
958
+ return value.startsWith("/") ? value : `${root}/${value}`;
959
+ }
960
+ async function urlIsPresent(url) {
961
+ const controller = new AbortController();
962
+ const timeout = setTimeout(() => controller.abort(), 15_000);
963
+ try {
964
+ let current;
965
+ try {
966
+ current = new URL(url);
967
+ }
968
+ catch {
969
+ return false;
970
+ }
971
+ for (let redirects = 0; redirects <= 50; redirects++) {
972
+ const response = await fetch(current, { method: "GET", redirect: "manual", signal: controller.signal });
973
+ await drainResponseBody(response);
974
+ if (response.status >= 200 && response.status < 300)
975
+ return true;
976
+ if (response.status < 300 || response.status >= 400)
977
+ return false;
978
+ const location = response.headers.get("location");
979
+ if (!location)
980
+ return true;
981
+ try {
982
+ current = new URL(location, current);
983
+ }
984
+ catch {
985
+ return false;
986
+ }
987
+ }
988
+ return false;
989
+ }
990
+ catch {
991
+ return false;
992
+ }
993
+ finally {
994
+ clearTimeout(timeout);
995
+ }
996
+ }
997
+ async function drainResponseBody(response) {
998
+ if (!response.body)
999
+ return;
1000
+ const reader = response.body.getReader();
1001
+ try {
1002
+ while (!(await reader.read()).done) { /* curl -o /dev/null consumes the full transfer */ }
1003
+ }
1004
+ finally {
1005
+ reader.releaseLock();
1006
+ }
1007
+ }
1008
+ export async function runVerifyStoryDeliverables(args, hqRoot, io = {}) {
1009
+ const env = envOf(io);
1010
+ let prdPath = "", storyId = "", repo = "";
1011
+ let json = false, strict = false, write = false;
1012
+ let evidenceJson = "[]", commitsJson = "[]";
1013
+ let offline = env.HQ_DELIVERABLES_OFFLINE ?? "0";
1014
+ for (let index = 0; index < args.length;) {
1015
+ const arg = args[index] ?? "";
1016
+ if (["--prd", "--story", "--repo", "--evidence-json", "--commits-json"].includes(arg)) {
1017
+ if (index + 1 >= args.length)
1018
+ return 1;
1019
+ const value = args[index + 1] ?? "";
1020
+ if (arg === "--prd")
1021
+ prdPath = value;
1022
+ else if (arg === "--story")
1023
+ storyId = value;
1024
+ else if (arg === "--repo")
1025
+ repo = value;
1026
+ else if (arg === "--evidence-json")
1027
+ evidenceJson = value;
1028
+ else
1029
+ commitsJson = value;
1030
+ index += 2;
1031
+ }
1032
+ else if (arg === "--write") {
1033
+ write = true;
1034
+ index++;
1035
+ }
1036
+ else if (arg === "--json") {
1037
+ json = true;
1038
+ index++;
1039
+ }
1040
+ else if (arg === "--strict") {
1041
+ strict = true;
1042
+ index++;
1043
+ }
1044
+ else if (arg === "--offline") {
1045
+ offline = "1";
1046
+ index++;
1047
+ }
1048
+ else if (arg === "-h" || arg === "--help") {
1049
+ stdout(io, VERIFY_DELIVERABLES_HELP);
1050
+ return 0;
1051
+ }
1052
+ else {
1053
+ stderr(io, `verify-story-deliverables: unknown arg ${arg}\n`);
1054
+ return 2;
1055
+ }
1056
+ }
1057
+ if (!prdPath || !storyId) {
1058
+ stderr(io, `usage: --prd <prd.json> --story <id> [--repo <path>]\n`);
1059
+ return 2;
1060
+ }
1061
+ const prdFilePath = path.resolve(hqRoot, prdPath);
1062
+ if (!isReadable(prdFilePath)) {
1063
+ stderr(io, `verify-story-deliverables: cannot read ${prdPath}\n`);
1064
+ return 2;
1065
+ }
1066
+ let prd;
1067
+ try {
1068
+ prd = JSON.parse(fs.readFileSync(prdFilePath, "utf8"));
1069
+ }
1070
+ catch {
1071
+ prd = {};
1072
+ }
1073
+ const userStories = Array.isArray(prd.userStories) ? prd.userStories : [];
1074
+ const story = userStories.find((item) => item && item.id === storyId);
1075
+ if (!story) {
1076
+ stderr(io, `verify-story-deliverables: story ${storyId} not in ${prdPath}\n`);
1077
+ return 2;
1078
+ }
1079
+ if (!repo) {
1080
+ const metadata = prd.metadata && typeof prd.metadata === "object" && !Array.isArray(prd.metadata)
1081
+ ? prd.metadata : {};
1082
+ repo = jqText(metadata.repoPath);
1083
+ }
1084
+ if (repo && !repo.startsWith("/"))
1085
+ repo = `${hqRoot}/${repo}`;
1086
+ const evidence = jsonDecode(evidenceJson);
1087
+ if (!jqArrayCheck(evidence)) {
1088
+ stderr(io, `verify-story-deliverables: --evidence-json must be a JSON array\n`);
1089
+ return 2;
1090
+ }
1091
+ const commits = jsonDecode(commitsJson);
1092
+ if (!jqArrayCheck(commits)) {
1093
+ stderr(io, `verify-story-deliverables: --commits-json must be a JSON array\n`);
1094
+ return 2;
1095
+ }
1096
+ const declaredRaw = story.deliverables ?? [];
1097
+ if (!Array.isArray(declaredRaw) || !Array.isArray(evidence) || !Array.isArray(commits)) {
1098
+ // jq's `+` is array concatenation in the normal contract; malformed PRD
1099
+ // deliverables are left to jq's normal processing behavior.
1100
+ const refsRaw = declaredRaw;
1101
+ if (!Array.isArray(refsRaw)) {
1102
+ stderr(io, `verify-story-deliverables: story ${storyId} not in ${prdPath}\n`);
1103
+ return 2;
1104
+ }
1105
+ }
1106
+ const declared = Array.isArray(declaredRaw) ? declaredRaw : [];
1107
+ const refs = [...declared, ...evidence, ...commits.map((commit) => `commit:${jqText(commit)}`)]
1108
+ .filter((ref) => typeof ref === "string" && ref.length > 0)
1109
+ .sort((a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b)))
1110
+ .filter((ref, index, all) => index === 0 || ref !== all[index - 1]);
1111
+ const declaredCount = Array.isArray(story.deliverables)
1112
+ ? story.deliverables.length
1113
+ : typeof story.deliverables === "string" ? [...story.deliverables].length
1114
+ : story.deliverables && typeof story.deliverables === "object" ? Object.keys(story.deliverables).length
1115
+ : 0;
1116
+ if (refs.length === 0) {
1117
+ if (strict) {
1118
+ stderr(io, `verify-story-deliverables: ${storyId} has no evidence and declares no deliverables (--strict)\n`);
1119
+ if (json)
1120
+ stdout(io, serializeJqJson({ story: storyId, status: "unverified", missing: [], present: [] }, "compact"));
1121
+ return 3;
1122
+ }
1123
+ if (json)
1124
+ stdout(io, serializeJqJson({ story: storyId, status: "unverified", missing: [], present: [] }, "compact"));
1125
+ else
1126
+ stdout(io, `verify-story-deliverables: ${storyId} — nothing to verify (worker returned no evidence; PRD declares no deliverables). Allowed, but this done-mark is unverified.\n`);
1127
+ return 0;
1128
+ }
1129
+ const present = [];
1130
+ const missing = [];
1131
+ for (const reference of refs) {
1132
+ const colon = reference.indexOf(":");
1133
+ const kind = colon >= 0 ? reference.slice(0, colon) : "path";
1134
+ const value = colon >= 0 ? reference.slice(colon + 1) : reference;
1135
+ let ok = false;
1136
+ if (kind === "path")
1137
+ ok = fileExists(joinShellPath(hqRoot, value));
1138
+ else if (kind === "repo-path")
1139
+ ok = Boolean(repo) && fileExists(`${repo}/${value}`);
1140
+ else if (kind === "branch" && repo && fileExists(repo)) {
1141
+ ok = git(["-C", repo, "show-ref", "--verify", "--quiet", `refs/heads/${value}`]).status === 0 ||
1142
+ git(["-C", repo, "show-ref", "--verify", "--quiet", `refs/remotes/origin/${value}`]).status === 0;
1143
+ }
1144
+ else if (kind === "commit" && repo && fileExists(repo)) {
1145
+ ok = git(["-C", repo, "cat-file", "-e", `${value}^{commit}`]).status === 0;
1146
+ }
1147
+ else if (kind === "url")
1148
+ ok = offline === "1" || await urlIsPresent(value);
1149
+ if (ok)
1150
+ present.push(reference);
1151
+ else
1152
+ missing.push(reference);
1153
+ }
1154
+ if (json)
1155
+ stdout(io, serializeJqJson({ story: storyId, status: missing.length === 0 ? "present" : "missing", missing, present }, "compact"));
1156
+ if (missing.length > 0) {
1157
+ stderr(io, `verify-story-deliverables: ${storyId} is NOT verifiably complete — ${missing.length} of ${refs.length} reference(s) do not exist:\n`);
1158
+ for (const reference of missing)
1159
+ stderr(io, ` - ${reference}\n`);
1160
+ stderr(io, `Do not write passes:true. A claimed path/branch/commit/URL must exist; a declared deliverable must be produced (or the declaration corrected).\n`);
1161
+ return 3;
1162
+ }
1163
+ if (write) {
1164
+ const verifiedAt = nowOf(io).toISOString().replace(/\.\d{3}Z$/u, "Z");
1165
+ const rewritten = {
1166
+ ...prd,
1167
+ userStories: userStories.map((item) => item.id === storyId
1168
+ ? { ...item, evidence: present.map((ref) => ({ ref, verifiedAt })) }
1169
+ : item),
1170
+ };
1171
+ try {
1172
+ fs.writeFileSync(`${prdFilePath}.tmp`, serializeJqJson(rewritten, "pretty"), "utf8");
1173
+ fs.renameSync(`${prdFilePath}.tmp`, prdFilePath);
1174
+ }
1175
+ catch { /* jq/mv are not checked; the legacy command continues to success */ }
1176
+ }
1177
+ const recordedSuffix = write ? "; recorded on the story" : "";
1178
+ if (!json)
1179
+ stdout(io, `verify-story-deliverables: ${storyId} — all ${refs.length} reference(s) present (${declaredCount} declared, ${refs.length - declaredCount} from worker evidence)${recordedSuffix}\n`);
1180
+ return 0;
1181
+ }
1182
+ /** Fast-entry adapter; family gating and shell fallback happen before import. */
1183
+ export async function runWorktreeResumeFast(args, _stdin, cwd, hqRoot, commandName) {
1184
+ const root = hqRoot ?? cwd;
1185
+ let code;
1186
+ if (commandName === "worktree-gc")
1187
+ code = runWorktreeGc(args, root);
1188
+ else if (commandName === "clean-worktree-reconcile-handoff")
1189
+ code = runCleanWorktreeReconcileHandoff(args);
1190
+ else if (commandName === "resume-thread-lock")
1191
+ code = runResumeThreadLock(args, root);
1192
+ else
1193
+ code = await runVerifyStoryDeliverables(args, root);
1194
+ if (code !== 0)
1195
+ process.exitCode = code;
1196
+ return code;
1197
+ }
1198
+ //# sourceMappingURL=worktree-resume.js.map