@indigoai-us/hq-cli 5.314.0 → 5.315.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 (1178) hide show
  1. package/CHANGELOG.md +4311 -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/eval-trigger.sh +193 -0
  23. package/assets/scaffold/core/scripts/git-pack-extension-check.sh +164 -0
  24. package/assets/scaffold/core/scripts/handoff-finalize.sh +688 -0
  25. package/assets/scaffold/core/scripts/handoff-open-steps.sh +81 -0
  26. package/assets/scaffold/core/scripts/handoff-post.sh +252 -0
  27. package/assets/scaffold/core/scripts/hook-lib.sh +345 -50
  28. package/assets/scaffold/core/scripts/hq-delegate-bundle.sh +307 -0
  29. package/assets/scaffold/core/scripts/hq-delegate-grant.sh +252 -0
  30. package/assets/scaffold/core/scripts/hq-delegate-pickup.sh +99 -0
  31. package/assets/scaffold/core/scripts/hq-delegate-publish.sh +91 -0
  32. package/assets/scaffold/core/scripts/hq-delegate-repo.sh +158 -0
  33. package/assets/scaffold/core/scripts/hq-delegate-resolve.sh +145 -0
  34. package/assets/scaffold/core/scripts/hq-delegate-secrets.sh +129 -0
  35. package/assets/scaffold/core/scripts/hq-delegate-send.sh +259 -0
  36. package/assets/scaffold/core/scripts/hq-delegate-transfer.sh +175 -0
  37. package/assets/scaffold/core/scripts/hq-delegate-verify.sh +238 -0
  38. package/assets/scaffold/core/scripts/hq-dm-bind.sh +585 -0
  39. package/assets/scaffold/core/scripts/hq-job-notify.sh +389 -0
  40. package/assets/scaffold/core/scripts/hq-job-probe.sh +835 -0
  41. package/assets/scaffold/core/scripts/hq-job-remediate.sh +359 -0
  42. package/assets/scaffold/core/scripts/hq-job-run.sh +1025 -0
  43. package/assets/scaffold/core/scripts/hq-pin.sh +118 -0
  44. package/assets/scaffold/core/scripts/hq-session.sh +184 -23
  45. package/assets/scaffold/core/scripts/jobs-schedule-parse.sh +310 -0
  46. package/assets/scaffold/core/scripts/jobs-validate.sh +451 -0
  47. package/assets/scaffold/core/scripts/knowledge-prefs.sh +55 -0
  48. package/assets/scaffold/core/scripts/lib/portable.sh +211 -0
  49. package/assets/scaffold/core/scripts/lib/secret-patterns.sh +58 -0
  50. package/assets/scaffold/core/scripts/lib/session-id.sh +3 -2
  51. package/assets/scaffold/core/scripts/lib/session-scope-capability.sh +1 -1
  52. package/assets/scaffold/core/scripts/lib/work-mesh-enqueue.sh +2 -1
  53. package/assets/scaffold/core/scripts/lib/work-mesh-live-hook.sh +378 -0
  54. package/assets/scaffold/core/scripts/lib/work-mesh-live-rebind.sh +141 -0
  55. package/assets/scaffold/core/scripts/migrate-policy-triggers.sh +378 -0
  56. package/assets/scaffold/core/scripts/ontology-audience-grant.sh +81 -0
  57. package/assets/scaffold/core/scripts/ontology-brief.mjs +93 -0
  58. package/assets/scaffold/core/scripts/ontology-candidate.sh +100 -0
  59. package/assets/scaffold/core/scripts/ontology-garden.mjs +238 -0
  60. package/assets/scaffold/core/scripts/ontology-source-worklist.sh +79 -0
  61. package/assets/scaffold/core/scripts/outpost-jobs-reconcile.sh +834 -0
  62. package/assets/scaffold/core/scripts/policy-age-report.sh +156 -0
  63. package/assets/scaffold/core/scripts/policy-retire.sh +199 -0
  64. package/assets/scaffold/core/scripts/qmd-reindex-after-sync.sh +10 -87
  65. package/assets/scaffold/core/scripts/qmd-reindex-bg.sh +40 -0
  66. package/assets/scaffold/core/scripts/read-policy-frontmatter.sh +32 -0
  67. package/assets/scaffold/core/scripts/rebuild-company-knowledge-index.sh +36 -3
  68. package/assets/scaffold/core/scripts/rebuild-projects-index.sh +99 -12
  69. package/assets/scaffold/core/scripts/refresh-vault-access.sh +188 -0
  70. package/assets/scaffold/core/scripts/register-project.sh +262 -0
  71. package/assets/scaffold/core/scripts/resolve-company.sh +199 -0
  72. package/assets/scaffold/core/scripts/resume-thread-lock.sh +285 -0
  73. package/assets/scaffold/core/scripts/source-yaml-validate.sh +36 -0
  74. package/assets/scaffold/core/scripts/token-usage-report.sh +81 -20
  75. package/assets/scaffold/core/scripts/verify-story-deliverables.sh +148 -0
  76. package/assets/scaffold/core/scripts/work-mesh-live-bind-trusted.sh +152 -0
  77. package/assets/scaffold/core/scripts/work-mesh-live-rebind.sh +59 -0
  78. package/assets/scaffold/core/scripts/worktree-gc.sh +362 -0
  79. package/contracts/preflight/v1/fixtures.json +87 -0
  80. package/contracts/preflight/v1/schema.json +58 -0
  81. package/dist/bin/hq-auth-refresh.d.ts +2 -0
  82. package/dist/bin/hq-auth-refresh.js +12 -6
  83. package/dist/command-catalog.generated.d.ts +10753 -0
  84. package/dist/command-catalog.generated.js +13859 -0
  85. package/dist/command-registration-plan.d.ts +474 -0
  86. package/dist/command-registration-plan.js +136 -0
  87. package/dist/commands/__fixtures__/access-vault.d.ts +2 -0
  88. package/dist/commands/__fixtures__/access-vault.js +1 -1
  89. package/dist/commands/_patterns.d.ts +16 -0
  90. package/dist/commands/_patterns.js +20 -3
  91. package/dist/commands/access.d.ts +2 -1
  92. package/dist/commands/access.js +58 -49
  93. package/dist/commands/agent-enroll.d.ts +146 -0
  94. package/dist/commands/agent-enroll.js +401 -0
  95. package/dist/commands/agent-inbox.d.ts +9 -0
  96. package/dist/commands/agent-inbox.js +102 -0
  97. package/dist/commands/agent-kit.d.ts +87 -0
  98. package/dist/commands/agent-kit.js +480 -0
  99. package/dist/commands/agent-mcp.d.ts +24 -0
  100. package/dist/commands/agent-mcp.js +127 -0
  101. package/dist/commands/agent-probe.d.ts +77 -0
  102. package/dist/commands/agent-probe.js +335 -0
  103. package/dist/commands/agent.d.ts +13 -0
  104. package/dist/commands/agent.js +40 -0
  105. package/dist/commands/agents.d.ts +106 -4
  106. package/dist/commands/agents.js +924 -45
  107. package/dist/commands/auth.d.ts +1 -0
  108. package/dist/commands/auth.js +189 -19
  109. package/dist/commands/billing-sponsor.d.ts +83 -0
  110. package/dist/commands/billing-sponsor.js +344 -0
  111. package/dist/commands/billing.d.ts +3 -0
  112. package/dist/commands/billing.js +6 -1
  113. package/dist/commands/bot-companies.d.ts +40 -0
  114. package/dist/commands/bot-companies.js +64 -0
  115. package/dist/commands/bot-continuity.d.ts +28 -0
  116. package/dist/commands/bot-continuity.js +68 -0
  117. package/dist/commands/bot-jobs.d.ts +127 -0
  118. package/dist/commands/bot-jobs.js +454 -0
  119. package/dist/commands/bot.d.ts +278 -0
  120. package/dist/commands/bot.js +1982 -0
  121. package/dist/commands/channels.js +56 -1
  122. package/dist/commands/cloud-demote.js +3 -2
  123. package/dist/commands/cloud-provision.d.ts +14 -0
  124. package/dist/commands/cloud-provision.js +232 -58
  125. package/dist/commands/cloud-retire.d.ts +51 -0
  126. package/dist/commands/cloud-retire.js +154 -0
  127. package/dist/commands/cloud.d.ts +49 -15
  128. package/dist/commands/cloud.js +357 -122
  129. package/dist/commands/company-rename-flag.d.ts +4 -0
  130. package/dist/commands/company-rename-flag.js +7 -0
  131. package/dist/commands/company-rename.d.ts +4 -0
  132. package/dist/commands/company-rename.js +90 -0
  133. package/dist/commands/company-transfer.d.ts +4 -28
  134. package/dist/commands/company-transfer.js +5 -49
  135. package/dist/commands/company.js +68 -3
  136. package/dist/commands/core-audit-log-native.d.ts +9 -0
  137. package/dist/commands/core-audit-log-native.js +257 -0
  138. package/dist/commands/core-checkpoint-gate-setting.d.ts +59 -0
  139. package/dist/commands/core-checkpoint-gate-setting.js +163 -0
  140. package/dist/commands/core-checkpoint-stop-gate-native.d.ts +34 -0
  141. package/dist/commands/core-checkpoint-stop-gate-native.js +725 -0
  142. package/dist/commands/core-checkpoint.d.ts +19 -9
  143. package/dist/commands/core-checkpoint.js +301 -37
  144. package/dist/commands/core-command-catalog.d.ts +34 -0
  145. package/dist/commands/core-command-catalog.js +62 -0
  146. package/dist/commands/core-company-index-scope-flag.d.ts +3 -0
  147. package/dist/commands/core-company-index-scope-flag.js +6 -0
  148. package/dist/commands/core-delegate-w1b.d.ts +10 -0
  149. package/dist/commands/core-delegate-w1b.js +1219 -0
  150. package/dist/commands/core-delegate.d.ts +46 -0
  151. package/dist/commands/core-delegate.js +1040 -0
  152. package/dist/commands/core-dm-bind-native.d.ts +32 -0
  153. package/dist/commands/core-dm-bind-native.js +668 -0
  154. package/dist/commands/core-eval-trigger-native.d.ts +4 -0
  155. package/dist/commands/core-eval-trigger-native.js +12 -0
  156. package/dist/commands/core-git-pack-extension-check-native.d.ts +22 -0
  157. package/dist/commands/core-git-pack-extension-check-native.js +190 -0
  158. package/dist/commands/core-handoff-fast.d.ts +18 -0
  159. package/dist/commands/core-handoff-fast.js +104 -0
  160. package/dist/commands/core-handoff-open-steps.d.ts +21 -0
  161. package/dist/commands/core-handoff-open-steps.js +264 -0
  162. package/dist/commands/core-handoff.d.ts +24 -0
  163. package/dist/commands/core-handoff.js +1144 -0
  164. package/dist/commands/core-hq-session-native.d.ts +39 -0
  165. package/dist/commands/core-hq-session-native.js +579 -0
  166. package/dist/commands/core-job-native-utils.d.ts +6 -0
  167. package/dist/commands/core-job-native-utils.js +80 -0
  168. package/dist/commands/core-job-native.d.ts +5 -0
  169. package/dist/commands/core-job-native.js +16 -0
  170. package/dist/commands/core-job-notify-native.d.ts +36 -0
  171. package/dist/commands/core-job-notify-native.js +359 -0
  172. package/dist/commands/core-job-probe-native.d.ts +45 -0
  173. package/dist/commands/core-job-probe-native.js +564 -0
  174. package/dist/commands/core-job-remediate-native.d.ts +26 -0
  175. package/dist/commands/core-job-remediate-native.js +374 -0
  176. package/dist/commands/core-job-remote-launcher.d.ts +7 -0
  177. package/dist/commands/core-job-remote-launcher.js +51 -0
  178. package/dist/commands/core-job-run-native.d.ts +47 -0
  179. package/dist/commands/core-job-run-native.js +1215 -0
  180. package/dist/commands/core-jobs-native.d.ts +25 -0
  181. package/dist/commands/core-jobs-native.js +1339 -0
  182. package/dist/commands/core-knowledge-prefs.d.ts +11 -0
  183. package/dist/commands/core-knowledge-prefs.js +137 -0
  184. package/dist/commands/core-migrate-policy-triggers-native.d.ts +21 -0
  185. package/dist/commands/core-migrate-policy-triggers-native.js +374 -0
  186. package/dist/commands/core-native-handoff-flag.d.ts +4 -0
  187. package/dist/commands/core-native-handoff-flag.js +7 -0
  188. package/dist/commands/core-native-hook-helper-commands.d.ts +4 -0
  189. package/dist/commands/core-native-hook-helper-commands.js +56 -0
  190. package/dist/commands/core-native-hook-helpers-flag.d.ts +4 -0
  191. package/dist/commands/core-native-hook-helpers-flag.js +7 -0
  192. package/dist/commands/core-native-jobs-flag.d.ts +4 -0
  193. package/dist/commands/core-native-jobs-flag.js +7 -0
  194. package/dist/commands/core-native-policy-flag.d.ts +9 -0
  195. package/dist/commands/core-native-policy-flag.js +12 -0
  196. package/dist/commands/core-native-session-flag.d.ts +4 -0
  197. package/dist/commands/core-native-session-flag.js +7 -0
  198. package/dist/commands/core-native-utilities-flag.d.ts +4 -0
  199. package/dist/commands/core-native-utilities-flag.js +7 -0
  200. package/dist/commands/core-native-utilities.d.ts +29 -0
  201. package/dist/commands/core-native-utilities.js +54 -0
  202. package/dist/commands/core-native-worker-skills-flag.d.ts +4 -0
  203. package/dist/commands/core-native-worker-skills-flag.js +7 -0
  204. package/dist/commands/core-ontology-native.d.ts +17 -0
  205. package/dist/commands/core-ontology-native.js +916 -0
  206. package/dist/commands/core-ontology.d.ts +66 -0
  207. package/dist/commands/core-ontology.js +430 -0
  208. package/dist/commands/core-pin-native.d.ts +14 -0
  209. package/dist/commands/core-pin-native.js +236 -0
  210. package/dist/commands/core-policy-frontmatter.d.ts +8 -0
  211. package/dist/commands/core-policy-frontmatter.js +52 -0
  212. package/dist/commands/core-policy.d.ts +14 -0
  213. package/dist/commands/core-policy.js +1018 -0
  214. package/dist/commands/core-refresh-vault-access-native.d.ts +20 -0
  215. package/dist/commands/core-refresh-vault-access-native.js +229 -0
  216. package/dist/commands/core-register-project-native.d.ts +30 -0
  217. package/dist/commands/core-register-project-native.js +347 -0
  218. package/dist/commands/core-resolve-company-command.d.ts +4 -0
  219. package/dist/commands/core-resolve-company-command.js +42 -0
  220. package/dist/commands/core-resolve-company-native.d.ts +28 -0
  221. package/dist/commands/core-resolve-company-native.js +408 -0
  222. package/dist/commands/core-work-mesh-bind-trusted-native.d.ts +32 -0
  223. package/dist/commands/core-work-mesh-bind-trusted-native.js +190 -0
  224. package/dist/commands/core-work-mesh-live-rebind-native.d.ts +18 -0
  225. package/dist/commands/core-work-mesh-live-rebind-native.js +262 -0
  226. package/dist/commands/core-worker-lint-native.d.ts +4 -0
  227. package/dist/commands/core-worker-lint-native.js +160 -0
  228. package/dist/commands/core-worker-share-native.d.ts +4 -0
  229. package/dist/commands/core-worker-share-native.js +260 -0
  230. package/dist/commands/core-worker-skills-command.d.ts +8 -0
  231. package/dist/commands/core-worker-skills-command.js +33 -0
  232. package/dist/commands/core-worker-skills-runtime.d.ts +33 -0
  233. package/dist/commands/core-worker-skills-runtime.js +86 -0
  234. package/dist/commands/core.d.ts +4 -0
  235. package/dist/commands/core.js +277 -80
  236. package/dist/commands/crm.js +52 -3
  237. package/dist/commands/daemon.d.ts +63 -0
  238. package/dist/commands/daemon.js +877 -0
  239. package/dist/commands/db-provision.js +4 -4
  240. package/dist/commands/db-sql.js +7 -21
  241. package/dist/commands/deploy-comments.d.ts +3 -0
  242. package/dist/commands/deploy-comments.js +162 -0
  243. package/dist/commands/dm.d.ts +119 -12
  244. package/dist/commands/dm.js +388 -38
  245. package/dist/commands/doctor.d.ts +12 -0
  246. package/dist/commands/doctor.js +158 -12
  247. package/dist/commands/feedback.d.ts +6 -0
  248. package/dist/commands/feedback.js +86 -37
  249. package/dist/commands/files-browse.d.ts +32 -12
  250. package/dist/commands/files-browse.js +176 -60
  251. package/dist/commands/files.d.ts +17 -0
  252. package/dist/commands/files.js +300 -47
  253. package/dist/commands/group-grants.js +3 -2
  254. package/dist/commands/groups.js +6 -5
  255. package/dist/commands/index-cmd.d.ts +19 -1
  256. package/dist/commands/index-cmd.js +74 -7
  257. package/dist/commands/integrations-api.d.ts +15 -10
  258. package/dist/commands/integrations-api.js +27 -22
  259. package/dist/commands/integrations-connect.d.ts +51 -13
  260. package/dist/commands/integrations-connect.js +86 -71
  261. package/dist/commands/integrations-core.d.ts +6 -6
  262. package/dist/commands/integrations-core.js +25 -11
  263. package/dist/commands/integrations-import.d.ts +1 -1
  264. package/dist/commands/integrations-import.js +43 -24
  265. package/dist/commands/integrations-manage.js +20 -13
  266. package/dist/commands/integrations.d.ts +8 -0
  267. package/dist/commands/integrations.js +94 -7
  268. package/dist/commands/lanes-accounts.d.ts +28 -0
  269. package/dist/commands/lanes-accounts.js +595 -0
  270. package/dist/commands/lanes-autopilot.d.ts +11 -0
  271. package/dist/commands/lanes-autopilot.js +336 -0
  272. package/dist/commands/lanes-checks.d.ts +51 -0
  273. package/dist/commands/lanes-checks.js +941 -0
  274. package/dist/commands/lanes-hold.d.ts +43 -0
  275. package/dist/commands/lanes-hold.js +655 -0
  276. package/dist/commands/lanes-keep-alive-audit.d.ts +10 -0
  277. package/dist/commands/lanes-keep-alive-audit.js +19 -0
  278. package/dist/commands/lanes-kpis.d.ts +11 -0
  279. package/dist/commands/lanes-kpis.js +34 -0
  280. package/dist/commands/lanes-message.d.ts +9 -0
  281. package/dist/commands/lanes-message.js +946 -0
  282. package/dist/commands/lanes-move.d.ts +12 -0
  283. package/dist/commands/lanes-move.js +397 -0
  284. package/dist/commands/lanes-questions.d.ts +36 -0
  285. package/dist/commands/lanes-questions.js +1005 -0
  286. package/dist/commands/lanes-report.d.ts +11 -0
  287. package/dist/commands/lanes-report.js +333 -0
  288. package/dist/commands/lanes-resume.d.ts +6 -0
  289. package/dist/commands/lanes-resume.js +564 -0
  290. package/dist/commands/lanes-review.d.ts +10 -0
  291. package/dist/commands/lanes-review.js +56 -0
  292. package/dist/commands/lanes-shared.d.ts +449 -0
  293. package/dist/commands/lanes-shared.js +170 -0
  294. package/dist/commands/lanes-stories.d.ts +15 -0
  295. package/dist/commands/lanes-stories.js +347 -0
  296. package/dist/commands/lanes-watch.d.ts +7 -0
  297. package/dist/commands/lanes-watch.js +216 -0
  298. package/dist/commands/lanes.d.ts +149 -0
  299. package/dist/commands/lanes.js +8983 -0
  300. package/dist/commands/login.js +49 -6
  301. package/dist/commands/mcp-registration.d.ts +32 -25
  302. package/dist/commands/mcp-registration.js +256 -23
  303. package/dist/commands/mcp-status.js +1 -0
  304. package/dist/commands/meetings.js +55 -34
  305. package/dist/commands/members.js +5 -1
  306. package/dist/commands/mesh.d.ts +11 -0
  307. package/dist/commands/mesh.js +1086 -76
  308. package/dist/commands/monitor.d.ts +58 -0
  309. package/dist/commands/monitor.js +980 -0
  310. package/dist/commands/onboard-bot-membership.d.ts +32 -0
  311. package/dist/commands/onboard-bot-membership.js +40 -0
  312. package/dist/commands/onboard-create-identity.d.ts +26 -0
  313. package/dist/commands/onboard-create-identity.js +23 -0
  314. package/dist/commands/onboard-identity-guard.d.ts +1 -1
  315. package/dist/commands/onboard.js +24 -5
  316. package/dist/commands/outpost-pruner.d.ts +3 -0
  317. package/dist/commands/outpost-pruner.js +125 -0
  318. package/dist/commands/pack-install.js +3 -1
  319. package/dist/commands/packs.js +11 -1
  320. package/dist/commands/people.d.ts +4 -0
  321. package/dist/commands/people.js +37 -3
  322. package/dist/commands/personal-connector-settings-flag.d.ts +4 -0
  323. package/dist/commands/personal-connector-settings-flag.js +7 -0
  324. package/dist/commands/personal-targeted-push-flag.d.ts +4 -0
  325. package/dist/commands/personal-targeted-push-flag.js +7 -0
  326. package/dist/commands/personal-targeted-push-paths.d.ts +3 -0
  327. package/dist/commands/personal-targeted-push-paths.js +67 -0
  328. package/dist/commands/publish.d.ts +8 -1
  329. package/dist/commands/publish.js +17 -4
  330. package/dist/commands/reindex.js +56 -6
  331. package/dist/commands/report.d.ts +19 -0
  332. package/dist/commands/report.js +537 -0
  333. package/dist/commands/rescue.d.ts +4 -0
  334. package/dist/commands/rescue.js +27 -17
  335. package/dist/commands/run-feature-telemetry.d.ts +3 -0
  336. package/dist/commands/run-feature-telemetry.js +6 -0
  337. package/dist/commands/run.js +18 -4
  338. package/dist/commands/safe-extract.d.ts +11 -2
  339. package/dist/commands/safe-extract.js +36 -8
  340. package/dist/commands/secrets.d.ts +20 -2
  341. package/dist/commands/secrets.js +175 -71
  342. package/dist/commands/skill.d.ts +35 -4
  343. package/dist/commands/skill.js +357 -18
  344. package/dist/commands/staff/reset-test-account.d.ts +110 -0
  345. package/dist/commands/staff/reset-test-account.js +268 -0
  346. package/dist/commands/staff/test-account.d.ts +51 -0
  347. package/dist/commands/staff/test-account.js +196 -0
  348. package/dist/commands/sync-mode.d.ts +11 -0
  349. package/dist/commands/sync-mode.js +30 -0
  350. package/dist/commands/sync-narrow.js +36 -5
  351. package/dist/commands/team-sync.js +71 -10
  352. package/dist/commands/update.js +6 -0
  353. package/dist/commands/vault-retention-flag.d.ts +3 -0
  354. package/dist/commands/vault-retention-flag.js +9 -0
  355. package/dist/commands/vault-retention.d.ts +11 -0
  356. package/dist/commands/vault-retention.js +69 -0
  357. package/dist/commands/version.d.ts +10 -0
  358. package/dist/commands/version.js +11 -0
  359. package/dist/commands/whoami.d.ts +22 -0
  360. package/dist/commands/whoami.js +137 -4
  361. package/dist/commands/workers.d.ts +2 -14
  362. package/dist/commands/workers.js +7 -10
  363. package/dist/fast-core.d.ts +6 -7
  364. package/dist/fast-core.js +87 -24
  365. package/dist/fast-scaffold.d.ts +86 -0
  366. package/dist/fast-scaffold.js +364 -0
  367. package/dist/index.d.ts +3 -4
  368. package/dist/index.js +59 -9
  369. package/dist/lanes-drain-hook.d.ts +14 -0
  370. package/dist/lanes-drain-hook.js +203 -0
  371. package/dist/lazy-commands.d.ts +20 -44
  372. package/dist/lazy-commands.js +60 -58
  373. package/dist/lib/agent-kit/adopt-identity.d.ts +27 -0
  374. package/dist/lib/agent-kit/adopt-identity.js +60 -0
  375. package/dist/lib/agent-kit/attachment-download.d.ts +24 -0
  376. package/dist/lib/agent-kit/attachment-download.js +47 -0
  377. package/dist/lib/agent-kit/creds.d.ts +106 -0
  378. package/dist/lib/agent-kit/creds.js +163 -0
  379. package/dist/lib/agent-kit/fallback.d.ts +78 -0
  380. package/dist/lib/agent-kit/fallback.js +210 -0
  381. package/dist/lib/agent-kit/inbox-state.d.ts +83 -0
  382. package/dist/lib/agent-kit/inbox-state.js +159 -0
  383. package/dist/lib/agent-kit/kit-config.d.ts +56 -0
  384. package/dist/lib/agent-kit/kit-config.js +65 -0
  385. package/dist/lib/agent-kit/log.d.ts +16 -0
  386. package/dist/lib/agent-kit/log.js +46 -0
  387. package/dist/lib/agent-kit/mcp/attachments.d.ts +126 -0
  388. package/dist/lib/agent-kit/mcp/attachments.js +222 -0
  389. package/dist/lib/agent-kit/mcp/jsonrpc.d.ts +75 -0
  390. package/dist/lib/agent-kit/mcp/jsonrpc.js +164 -0
  391. package/dist/lib/agent-kit/mcp/tools.d.ts +64 -0
  392. package/dist/lib/agent-kit/mcp/tools.js +397 -0
  393. package/dist/lib/agent-kit/paths.d.ts +65 -0
  394. package/dist/lib/agent-kit/paths.js +118 -0
  395. package/dist/lib/agent-kit/private-file.d.ts +29 -0
  396. package/dist/lib/agent-kit/private-file.js +91 -0
  397. package/dist/lib/agent-kit/run/heartbeat.d.ts +72 -0
  398. package/dist/lib/agent-kit/run/heartbeat.js +128 -0
  399. package/dist/lib/agent-kit/run/inbox.d.ts +76 -0
  400. package/dist/lib/agent-kit/run/inbox.js +205 -0
  401. package/dist/lib/agent-kit/run/supervisor.d.ts +35 -0
  402. package/dist/lib/agent-kit/run/supervisor.js +85 -0
  403. package/dist/lib/agent-kit/run/sync.d.ts +33 -0
  404. package/dist/lib/agent-kit/run/sync.js +58 -0
  405. package/dist/lib/agent-kit/services.d.ts +31 -0
  406. package/dist/lib/agent-kit/services.js +55 -0
  407. package/dist/lib/agent-kit/skills.d.ts +18 -0
  408. package/dist/lib/agent-kit/skills.js +151 -0
  409. package/dist/lib/agent-kit/wake.d.ts +83 -0
  410. package/dist/lib/agent-kit/wake.js +243 -0
  411. package/dist/lib/agents/model-catalog.d.ts +62 -0
  412. package/dist/lib/agents/model-catalog.js +275 -0
  413. package/dist/lib/auth-login-provider-state.d.ts +8 -0
  414. package/dist/lib/auth-login-provider-state.js +63 -0
  415. package/dist/lib/aws-sdk-node-warning-output.d.ts +12 -0
  416. package/dist/lib/aws-sdk-node-warning-output.js +22 -0
  417. package/dist/lib/billing/free-month.d.ts +18 -0
  418. package/dist/lib/billing/free-month.js +31 -0
  419. package/dist/lib/billing/plan-limit-refusals.d.ts +69 -0
  420. package/dist/lib/billing/plan-limit-refusals.js +187 -0
  421. package/dist/lib/billing/plan-limit-upgrade-url.d.ts +11 -0
  422. package/dist/lib/billing/plan-limit-upgrade-url.js +66 -0
  423. package/dist/lib/billing/plan-lock.d.ts +143 -0
  424. package/dist/lib/billing/plan-lock.js +439 -0
  425. package/dist/lib/bot/api.d.ts +349 -0
  426. package/dist/lib/bot/api.js +316 -0
  427. package/dist/lib/bot/attachments.d.ts +45 -0
  428. package/dist/lib/bot/attachments.js +89 -0
  429. package/dist/lib/bot/cli-update.d.ts +138 -0
  430. package/dist/lib/bot/cli-update.js +278 -0
  431. package/dist/lib/bot/company-bind.d.ts +27 -0
  432. package/dist/lib/bot/company-bind.js +62 -0
  433. package/dist/lib/bot/config.d.ts +153 -0
  434. package/dist/lib/bot/config.js +233 -0
  435. package/dist/lib/bot/continuity-download.d.ts +28 -0
  436. package/dist/lib/bot/continuity-download.js +75 -0
  437. package/dist/lib/bot/continuity-install.d.ts +14 -0
  438. package/dist/lib/bot/continuity-install.js +101 -0
  439. package/dist/lib/bot/continuity.d.ts +67 -0
  440. package/dist/lib/bot/continuity.js +301 -0
  441. package/dist/lib/bot/creds.d.ts +24 -0
  442. package/dist/lib/bot/creds.js +51 -0
  443. package/dist/lib/bot/daemon.d.ts +173 -0
  444. package/dist/lib/bot/daemon.js +552 -0
  445. package/dist/lib/bot/inbox-poll-backoff-flag.d.ts +24 -0
  446. package/dist/lib/bot/inbox-poll-backoff-flag.js +135 -0
  447. package/dist/lib/bot/inbox-state.d.ts +18 -0
  448. package/dist/lib/bot/inbox-state.js +51 -0
  449. package/dist/lib/bot/index.d.ts +23 -0
  450. package/dist/lib/bot/index.js +23 -0
  451. package/dist/lib/bot/inflight.d.ts +119 -0
  452. package/dist/lib/bot/inflight.js +83 -0
  453. package/dist/lib/bot/job-completions.d.ts +89 -0
  454. package/dist/lib/bot/job-completions.js +132 -0
  455. package/dist/lib/bot/job-run.d.ts +109 -0
  456. package/dist/lib/bot/job-run.js +246 -0
  457. package/dist/lib/bot/local-config.d.ts +61 -0
  458. package/dist/lib/bot/local-config.js +145 -0
  459. package/dist/lib/bot/local-jobs.d.ts +89 -0
  460. package/dist/lib/bot/local-jobs.js +459 -0
  461. package/dist/lib/bot/local-name.d.ts +54 -0
  462. package/dist/lib/bot/local-name.js +114 -0
  463. package/dist/lib/bot/log.d.ts +13 -0
  464. package/dist/lib/bot/log.js +59 -0
  465. package/dist/lib/bot/owner-context.d.ts +79 -0
  466. package/dist/lib/bot/owner-context.js +175 -0
  467. package/dist/lib/bot/paths.d.ts +76 -0
  468. package/dist/lib/bot/paths.js +131 -0
  469. package/dist/lib/bot/progress.d.ts +132 -0
  470. package/dist/lib/bot/progress.js +289 -0
  471. package/dist/lib/bot/promote.d.ts +16 -0
  472. package/dist/lib/bot/promote.js +106 -0
  473. package/dist/lib/bot/promotion-hold.d.ts +24 -0
  474. package/dist/lib/bot/promotion-hold.js +103 -0
  475. package/dist/lib/bot/promotion-receipt.d.ts +9 -0
  476. package/dist/lib/bot/promotion-receipt.js +56 -0
  477. package/dist/lib/bot/promotion-upload.d.ts +16 -0
  478. package/dist/lib/bot/promotion-upload.js +80 -0
  479. package/dist/lib/bot/prompt.d.ts +136 -0
  480. package/dist/lib/bot/prompt.js +433 -0
  481. package/dist/lib/bot/room-policy.d.ts +63 -0
  482. package/dist/lib/bot/room-policy.js +91 -0
  483. package/dist/lib/bot/run.d.ts +217 -0
  484. package/dist/lib/bot/run.js +1869 -0
  485. package/dist/lib/bot/runnable.d.ts +51 -0
  486. package/dist/lib/bot/runnable.js +65 -0
  487. package/dist/lib/bot/runtime/claude.d.ts +50 -0
  488. package/dist/lib/bot/runtime/claude.js +170 -0
  489. package/dist/lib/bot/runtime/codex.d.ts +28 -0
  490. package/dist/lib/bot/runtime/codex.js +153 -0
  491. package/dist/lib/bot/runtime/grok-acp.d.ts +40 -0
  492. package/dist/lib/bot/runtime/grok-acp.js +265 -0
  493. package/dist/lib/bot/runtime/grok.d.ts +41 -0
  494. package/dist/lib/bot/runtime/grok.js +169 -0
  495. package/dist/lib/bot/runtime/index.d.ts +36 -0
  496. package/dist/lib/bot/runtime/index.js +417 -0
  497. package/dist/lib/bot/runtime/messages-stream.d.ts +56 -0
  498. package/dist/lib/bot/runtime/messages-stream.js +194 -0
  499. package/dist/lib/bot/runtime/sanitize.d.ts +18 -0
  500. package/dist/lib/bot/runtime/sanitize.js +28 -0
  501. package/dist/lib/bot/runtime/types.d.ts +159 -0
  502. package/dist/lib/bot/runtime/types.js +51 -0
  503. package/dist/lib/bot/runtime/windows.d.ts +10 -0
  504. package/dist/lib/bot/runtime/windows.js +53 -0
  505. package/dist/lib/bot/runtime-sign-in.d.ts +24 -0
  506. package/dist/lib/bot/runtime-sign-in.js +31 -0
  507. package/dist/lib/bot/scaffold.d.ts +38 -0
  508. package/dist/lib/bot/scaffold.js +94 -0
  509. package/dist/lib/bot/self-heal.d.ts +52 -0
  510. package/dist/lib/bot/self-heal.js +79 -0
  511. package/dist/lib/bot/self-process.d.ts +19 -0
  512. package/dist/lib/bot/self-process.js +35 -0
  513. package/dist/lib/bot/session.d.ts +19 -0
  514. package/dist/lib/bot/session.js +39 -0
  515. package/dist/lib/bot/setup-explain.d.ts +64 -0
  516. package/dist/lib/bot/setup-explain.js +141 -0
  517. package/dist/lib/bot/split.d.ts +32 -0
  518. package/dist/lib/bot/split.js +241 -0
  519. package/dist/lib/bot/status.d.ts +57 -0
  520. package/dist/lib/bot/status.js +66 -0
  521. package/dist/lib/bot/worker-source.d.ts +66 -0
  522. package/dist/lib/bot/worker-source.js +283 -0
  523. package/dist/lib/checkpoint-ontology/aliases.d.ts +17 -0
  524. package/dist/lib/checkpoint-ontology/aliases.js +44 -0
  525. package/dist/lib/checkpoint-ontology/apply.d.ts +110 -0
  526. package/dist/lib/checkpoint-ontology/apply.js +777 -0
  527. package/dist/lib/checkpoint-ontology/company-brief.d.ts +18 -0
  528. package/dist/lib/checkpoint-ontology/company-brief.js +337 -0
  529. package/dist/lib/checkpoint-ontology/company.d.ts +44 -0
  530. package/dist/lib/checkpoint-ontology/company.js +118 -0
  531. package/dist/lib/checkpoint-ontology/drop-aliases.d.ts +41 -0
  532. package/dist/lib/checkpoint-ontology/drop-aliases.js +76 -0
  533. package/dist/lib/checkpoint-ontology/entity-file.d.ts +109 -0
  534. package/dist/lib/checkpoint-ontology/entity-file.js +371 -0
  535. package/dist/lib/checkpoint-ontology/identity.d.ts +38 -0
  536. package/dist/lib/checkpoint-ontology/identity.js +95 -0
  537. package/dist/lib/checkpoint-ontology/merge-copies.d.ts +199 -0
  538. package/dist/lib/checkpoint-ontology/merge-copies.js +1086 -0
  539. package/dist/lib/checkpoint-ontology/multi-writer.d.ts +101 -0
  540. package/dist/lib/checkpoint-ontology/multi-writer.js +394 -0
  541. package/dist/lib/checkpoint-ontology/plan.d.ts +193 -0
  542. package/dist/lib/checkpoint-ontology/plan.js +504 -0
  543. package/dist/lib/checkpoint-ontology/queued-touches.d.ts +29 -0
  544. package/dist/lib/checkpoint-ontology/queued-touches.js +193 -0
  545. package/dist/lib/checkpoint-ontology/sync-client.d.ts +38 -0
  546. package/dist/lib/checkpoint-ontology/sync-client.js +84 -0
  547. package/dist/lib/checkpoint-ontology/tree.d.ts +55 -0
  548. package/dist/lib/checkpoint-ontology/tree.js +198 -0
  549. package/dist/lib/company-errors-sdk-warning-flag.d.ts +5 -0
  550. package/dist/lib/company-errors-sdk-warning-flag.js +8 -0
  551. package/dist/lib/company-skill-wrapper.d.ts +1 -0
  552. package/dist/lib/company-skill-wrapper.js +121 -29
  553. package/dist/lib/core-utils/codex-skill-bridge.d.ts +2 -1
  554. package/dist/lib/core-utils/hook-timeout-debug-context-flag.d.ts +20 -0
  555. package/dist/lib/core-utils/hook-timeout-debug-context-flag.js +81 -0
  556. package/dist/lib/core-utils/jq-json-serializer.d.ts +5 -0
  557. package/dist/lib/core-utils/jq-json-serializer.js +10 -0
  558. package/dist/lib/core-utils/qmd-reindex-after-sync.d.ts +14 -1
  559. package/dist/lib/core-utils/qmd-reindex-after-sync.js +101 -17
  560. package/dist/lib/core-utils/secret-patterns.d.ts +43 -0
  561. package/dist/lib/core-utils/secret-patterns.js +34 -0
  562. package/dist/lib/core-utils/sentry-report.d.ts +114 -0
  563. package/dist/lib/core-utils/sentry-report.js +1055 -0
  564. package/dist/lib/core-utils/soft-timeout.js +1 -1
  565. package/dist/lib/core-utils/timeout-guard-native.d.ts +7 -0
  566. package/dist/lib/core-utils/timeout-guard-native.js +40 -0
  567. package/dist/lib/core-utils/timeout-guard.d.ts +3 -3
  568. package/dist/lib/core-utils/timeout-guard.js +28 -13
  569. package/dist/lib/core-utils/token-usage-report.js +17 -3
  570. package/dist/lib/core-utils/worktree-resume.d.ts +20 -0
  571. package/dist/lib/core-utils/worktree-resume.js +1198 -0
  572. package/dist/lib/daemon/catalog.d.ts +134 -0
  573. package/dist/lib/daemon/catalog.js +358 -0
  574. package/dist/lib/daemon/config.d.ts +35 -0
  575. package/dist/lib/daemon/config.js +108 -0
  576. package/dist/lib/daemon/flag.d.ts +25 -0
  577. package/dist/lib/daemon/flag.js +59 -0
  578. package/dist/lib/daemon/handoff.d.ts +56 -0
  579. package/dist/lib/daemon/handoff.js +161 -0
  580. package/dist/lib/daemon/hq-cloud.d.ts +79 -0
  581. package/dist/lib/daemon/hq-cloud.js +183 -0
  582. package/dist/lib/daemon/install.d.ts +85 -0
  583. package/dist/lib/daemon/install.js +320 -0
  584. package/dist/lib/daemon/legacy-sync-env.d.ts +10 -0
  585. package/dist/lib/daemon/legacy-sync-env.js +58 -0
  586. package/dist/lib/daemon/legacy.d.ts +45 -0
  587. package/dist/lib/daemon/legacy.js +133 -0
  588. package/dist/lib/daemon/lock.d.ts +47 -0
  589. package/dist/lib/daemon/lock.js +138 -0
  590. package/dist/lib/daemon/machine-type.d.ts +50 -0
  591. package/dist/lib/daemon/machine-type.js +159 -0
  592. package/dist/lib/daemon/migrate.d.ts +77 -0
  593. package/dist/lib/daemon/migrate.js +265 -0
  594. package/dist/lib/daemon/paths.d.ts +24 -0
  595. package/dist/lib/daemon/paths.js +43 -0
  596. package/dist/lib/daemon/protocol-tail.d.ts +33 -0
  597. package/dist/lib/daemon/protocol-tail.js +131 -0
  598. package/dist/lib/daemon/remote-control.d.ts +74 -0
  599. package/dist/lib/daemon/remote-control.js +153 -0
  600. package/dist/lib/daemon/requests.d.ts +28 -0
  601. package/dist/lib/daemon/requests.js +65 -0
  602. package/dist/lib/daemon/run.d.ts +79 -0
  603. package/dist/lib/daemon/run.js +755 -0
  604. package/dist/lib/daemon/succession.d.ts +118 -0
  605. package/dist/lib/daemon/succession.js +263 -0
  606. package/dist/lib/daemon/supervisor.d.ts +132 -0
  607. package/dist/lib/daemon/supervisor.js +836 -0
  608. package/dist/lib/daemon/sync-runner.d.ts +58 -0
  609. package/dist/lib/daemon/sync-runner.js +277 -0
  610. package/dist/lib/daemon/tools.d.ts +52 -0
  611. package/dist/lib/daemon/tools.js +95 -0
  612. package/dist/lib/daemon/updater.d.ts +57 -0
  613. package/dist/lib/daemon/updater.js +163 -0
  614. package/dist/lib/db/control-plane.js +6 -0
  615. package/dist/lib/db/local.d.ts +0 -5
  616. package/dist/lib/db/local.js +1 -1
  617. package/dist/lib/db/migrate.d.ts +0 -12
  618. package/dist/lib/db/migrate.js +5 -5
  619. package/dist/lib/db/remote-sql.d.ts +2 -2
  620. package/dist/lib/db/remote-sql.js +3 -3
  621. package/dist/lib/db/sql.d.ts +0 -10
  622. package/dist/lib/db/sql.js +4 -8
  623. package/dist/lib/deploy-api.d.ts +5 -0
  624. package/dist/lib/deploy-api.js +21 -0
  625. package/dist/lib/deploy-apps.d.ts +13 -0
  626. package/dist/lib/deploy-apps.js +29 -0
  627. package/dist/lib/doctor/__testing__/fake-hq-tree.d.ts +1 -1
  628. package/dist/lib/doctor/__testing__/fake-hq-tree.js +1 -1
  629. package/dist/lib/doctor/__testing__/run-doctor.d.ts +8 -0
  630. package/dist/lib/doctor/__testing__/run-doctor.js +52 -0
  631. package/dist/lib/doctor/checks/bots.d.ts +13 -0
  632. package/dist/lib/doctor/checks/bots.js +189 -0
  633. package/dist/lib/doctor/checks/claude-wiring.js +70 -1
  634. package/dist/lib/doctor/checks/codex-wiring.d.ts +0 -4
  635. package/dist/lib/doctor/checks/codex-wiring.js +3 -35
  636. package/dist/lib/doctor/checks/grok-wiring.js +1 -34
  637. package/dist/lib/doctor/checks/integrations.js +11 -0
  638. package/dist/lib/doctor/checks/runtime-health.d.ts +4 -17
  639. package/dist/lib/doctor/checks/runtime-health.js +20 -7
  640. package/dist/lib/doctor/checks/scaffold-cli-floor.d.ts +6 -0
  641. package/dist/lib/doctor/checks/scaffold-cli-floor.js +73 -0
  642. package/dist/lib/doctor/checks/sync-health.d.ts +21 -0
  643. package/dist/lib/doctor/checks/sync-health.js +72 -2
  644. package/dist/lib/doctor/checks/sync-runtime.d.ts +11 -0
  645. package/dist/lib/doctor/checks/sync-runtime.js +216 -0
  646. package/dist/lib/doctor/checks/work-context.js +20 -6
  647. package/dist/lib/doctor/client-health-flag-token.d.ts +15 -0
  648. package/dist/lib/doctor/client-health-flag-token.js +66 -0
  649. package/dist/lib/doctor/client-health-reason-codes-flag.d.ts +27 -0
  650. package/dist/lib/doctor/client-health-reason-codes-flag.js +106 -0
  651. package/dist/lib/doctor/compat.d.ts +0 -16
  652. package/dist/lib/doctor/compat.js +4 -3
  653. package/dist/lib/doctor/deep/effects.js +1 -3
  654. package/dist/lib/doctor/deep/executor.d.ts +4 -10
  655. package/dist/lib/doctor/deep/executor.js +1 -1
  656. package/dist/lib/doctor/deep/parity.d.ts +2 -29
  657. package/dist/lib/doctor/deep/parity.js +7 -7
  658. package/dist/lib/doctor/deep/sandbox.d.ts +7 -25
  659. package/dist/lib/doctor/deep/sandbox.js +5 -7
  660. package/dist/lib/doctor/fix/apply.d.ts +79 -8
  661. package/dist/lib/doctor/fix/apply.js +292 -80
  662. package/dist/lib/doctor/fix/json-output.d.ts +28 -0
  663. package/dist/lib/doctor/fix/json-output.js +33 -0
  664. package/dist/lib/doctor/fix/refresh-sync-outcome.d.ts +12 -0
  665. package/dist/lib/doctor/fix/refresh-sync-outcome.js +25 -0
  666. package/dist/lib/doctor/fix/remediation.d.ts +14 -6
  667. package/dist/lib/doctor/fix/remediation.js +49 -9
  668. package/dist/lib/doctor/fixtures/schema.js +1 -3
  669. package/dist/lib/doctor/json-output.d.ts +17 -1
  670. package/dist/lib/doctor/json-output.js +7 -2
  671. package/dist/lib/doctor/platform.d.ts +0 -26
  672. package/dist/lib/doctor/platform.js +5 -5
  673. package/dist/lib/doctor/registry.d.ts +14 -0
  674. package/dist/lib/doctor/registry.js +71 -0
  675. package/dist/lib/doctor/report.js +1 -1
  676. package/dist/lib/doctor/shared.d.ts +8 -0
  677. package/dist/lib/doctor/shared.js +38 -0
  678. package/dist/lib/doctor/stray-gate-entries.d.ts +35 -0
  679. package/dist/lib/doctor/stray-gate-entries.js +83 -0
  680. package/dist/lib/doctor/types.d.ts +5 -0
  681. package/dist/lib/doctor/types.js +20 -0
  682. package/dist/lib/first-sync-next-step.d.ts +34 -0
  683. package/dist/lib/first-sync-next-step.js +179 -0
  684. package/dist/lib/flag-registry-endpoint.d.ts +5 -0
  685. package/dist/lib/flag-registry-endpoint.js +9 -0
  686. package/dist/lib/flag-registry-worker-source.generated.d.ts +2 -0
  687. package/dist/lib/flag-registry-worker-source.generated.js +3 -0
  688. package/dist/lib/flag-registry-worker.js +12 -1
  689. package/dist/lib/flag-registry.d.ts +26 -6
  690. package/dist/lib/flag-registry.js +133 -16
  691. package/dist/lib/flag-snapshot-file.d.ts +20 -0
  692. package/dist/lib/flag-snapshot-file.js +91 -0
  693. package/dist/lib/heartbeat-identity.d.ts +30 -0
  694. package/dist/lib/heartbeat-identity.js +76 -0
  695. package/dist/lib/index-render/companies.d.ts +4 -1
  696. package/dist/lib/index-render/companies.js +66 -3
  697. package/dist/lib/index-render/company-knowledge.js +80 -17
  698. package/dist/lib/index-render/index.d.ts +1 -0
  699. package/dist/lib/index-render/index.js +2 -1
  700. package/dist/lib/index-render/projects.js +82 -5
  701. package/dist/lib/index-render/shared.d.ts +13 -1
  702. package/dist/lib/index-render/shared.js +41 -2
  703. package/dist/lib/lanes/account-home.d.ts +8 -0
  704. package/dist/lib/lanes/account-home.js +10 -0
  705. package/dist/lib/lanes/accounts.d.ts +117 -0
  706. package/dist/lib/lanes/accounts.js +366 -0
  707. package/dist/lib/lanes/admission-host.d.ts +22 -0
  708. package/dist/lib/lanes/admission-host.js +37 -0
  709. package/dist/lib/lanes/admission.d.ts +26 -0
  710. package/dist/lib/lanes/admission.js +210 -0
  711. package/dist/lib/lanes/approval-gate.d.ts +8 -0
  712. package/dist/lib/lanes/approval-gate.js +90 -0
  713. package/dist/lib/lanes/autopilot-metrics.d.ts +99 -0
  714. package/dist/lib/lanes/autopilot-metrics.js +301 -0
  715. package/dist/lib/lanes/autopilot-registry.d.ts +62 -0
  716. package/dist/lib/lanes/autopilot-registry.js +192 -0
  717. package/dist/lib/lanes/autopilot.d.ts +133 -0
  718. package/dist/lib/lanes/autopilot.js +1222 -0
  719. package/dist/lib/lanes/blocker-freshness.d.ts +31 -0
  720. package/dist/lib/lanes/blocker-freshness.js +168 -0
  721. package/dist/lib/lanes/checked-company-path.d.ts +3 -0
  722. package/dist/lib/lanes/checked-company-path.js +39 -0
  723. package/dist/lib/lanes/claude-balance.d.ts +97 -0
  724. package/dist/lib/lanes/claude-balance.js +319 -0
  725. package/dist/lib/lanes/compaction.d.ts +110 -0
  726. package/dist/lib/lanes/compaction.js +293 -0
  727. package/dist/lib/lanes/config.d.ts +94 -0
  728. package/dist/lib/lanes/config.js +606 -0
  729. package/dist/lib/lanes/constants.d.ts +3 -0
  730. package/dist/lib/lanes/constants.js +3 -0
  731. package/dist/lib/lanes/delivery-core.d.ts +15 -0
  732. package/dist/lib/lanes/delivery-core.js +21 -0
  733. package/dist/lib/lanes/delivery.d.ts +180 -0
  734. package/dist/lib/lanes/delivery.js +443 -0
  735. package/dist/lib/lanes/disk-guard.d.ts +66 -0
  736. package/dist/lib/lanes/disk-guard.js +172 -0
  737. package/dist/lib/lanes/dropbox.d.ts +129 -0
  738. package/dist/lib/lanes/dropbox.js +601 -0
  739. package/dist/lib/lanes/effort.d.ts +51 -0
  740. package/dist/lib/lanes/effort.js +113 -0
  741. package/dist/lib/lanes/envelope-repair-dispatch.d.ts +26 -0
  742. package/dist/lib/lanes/envelope-repair-dispatch.js +74 -0
  743. package/dist/lib/lanes/errors.d.ts +39 -0
  744. package/dist/lib/lanes/errors.js +72 -0
  745. package/dist/lib/lanes/flag-keys.d.ts +22 -0
  746. package/dist/lib/lanes/flag-keys.js +22 -0
  747. package/dist/lib/lanes/grants.d.ts +30 -0
  748. package/dist/lib/lanes/grants.js +171 -0
  749. package/dist/lib/lanes/hire-grant-dispatch.d.ts +29 -0
  750. package/dist/lib/lanes/hire-grant-dispatch.js +315 -0
  751. package/dist/lib/lanes/hooks-install.d.ts +82 -0
  752. package/dist/lib/lanes/hooks-install.js +479 -0
  753. package/dist/lib/lanes/host-capacity.d.ts +69 -0
  754. package/dist/lib/lanes/host-capacity.js +254 -0
  755. package/dist/lib/lanes/hq-root.d.ts +19 -0
  756. package/dist/lib/lanes/hq-root.js +28 -0
  757. package/dist/lib/lanes/index.d.ts +76 -0
  758. package/dist/lib/lanes/index.js +42 -0
  759. package/dist/lib/lanes/keep-alive-audit.d.ts +46 -0
  760. package/dist/lib/lanes/keep-alive-audit.js +370 -0
  761. package/dist/lib/lanes/keep-alive.d.ts +68 -0
  762. package/dist/lib/lanes/keep-alive.js +343 -0
  763. package/dist/lib/lanes/kr-freshness.d.ts +76 -0
  764. package/dist/lib/lanes/kr-freshness.js +413 -0
  765. package/dist/lib/lanes/lane-company.d.ts +10 -0
  766. package/dist/lib/lanes/lane-company.js +41 -0
  767. package/dist/lib/lanes/liveness.d.ts +108 -0
  768. package/dist/lib/lanes/liveness.js +396 -0
  769. package/dist/lib/lanes/machine-identity.d.ts +34 -0
  770. package/dist/lib/lanes/machine-identity.js +92 -0
  771. package/dist/lib/lanes/manager-status-gate.d.ts +17 -0
  772. package/dist/lib/lanes/manager-status-gate.js +133 -0
  773. package/dist/lib/lanes/merge-command.d.ts +15 -0
  774. package/dist/lib/lanes/merge-command.js +629 -0
  775. package/dist/lib/lanes/mesh-events.d.ts +127 -0
  776. package/dist/lib/lanes/mesh-events.js +564 -0
  777. package/dist/lib/lanes/message-replay.d.ts +21 -0
  778. package/dist/lib/lanes/message-replay.js +122 -0
  779. package/dist/lib/lanes/models.d.ts +86 -0
  780. package/dist/lib/lanes/models.js +234 -0
  781. package/dist/lib/lanes/monitor.d.ts +48 -0
  782. package/dist/lib/lanes/monitor.js +428 -0
  783. package/dist/lib/lanes/move-account.d.ts +56 -0
  784. package/dist/lib/lanes/move-account.js +193 -0
  785. package/dist/lib/lanes/orphans.d.ts +25 -0
  786. package/dist/lib/lanes/orphans.js +102 -0
  787. package/dist/lib/lanes/outpost-dispatch.d.ts +147 -0
  788. package/dist/lib/lanes/outpost-dispatch.js +271 -0
  789. package/dist/lib/lanes/outpost-hire-cache.d.ts +22 -0
  790. package/dist/lib/lanes/outpost-hire-cache.js +153 -0
  791. package/dist/lib/lanes/outpost-identity.d.ts +33 -0
  792. package/dist/lib/lanes/outpost-identity.js +59 -0
  793. package/dist/lib/lanes/outpost-profile-repin.d.ts +17 -0
  794. package/dist/lib/lanes/outpost-profile-repin.js +84 -0
  795. package/dist/lib/lanes/outpost-pruner-install.d.ts +37 -0
  796. package/dist/lib/lanes/outpost-pruner-install.js +238 -0
  797. package/dist/lib/lanes/outpost-registry-worker-approval.d.ts +18 -0
  798. package/dist/lib/lanes/outpost-registry-worker-approval.js +109 -0
  799. package/dist/lib/lanes/outpost-snapshot-memo.d.ts +6 -0
  800. package/dist/lib/lanes/outpost-snapshot-memo.js +14 -0
  801. package/dist/lib/lanes/outpost-worktree-pruner-flag.d.ts +19 -0
  802. package/dist/lib/lanes/outpost-worktree-pruner-flag.js +86 -0
  803. package/dist/lib/lanes/outpost-worktree-pruner.d.ts +62 -0
  804. package/dist/lib/lanes/outpost-worktree-pruner.js +1201 -0
  805. package/dist/lib/lanes/profile.d.ts +69 -0
  806. package/dist/lib/lanes/profile.js +552 -0
  807. package/dist/lib/lanes/provider-rejection.d.ts +86 -0
  808. package/dist/lib/lanes/provider-rejection.js +286 -0
  809. package/dist/lib/lanes/questions.d.ts +90 -0
  810. package/dist/lib/lanes/questions.js +384 -0
  811. package/dist/lib/lanes/quota.d.ts +134 -0
  812. package/dist/lib/lanes/quota.js +471 -0
  813. package/dist/lib/lanes/reconcile-install.d.ts +90 -0
  814. package/dist/lib/lanes/reconcile-install.js +257 -0
  815. package/dist/lib/lanes/reconcile.d.ts +161 -0
  816. package/dist/lib/lanes/reconcile.js +3343 -0
  817. package/dist/lib/lanes/registry-flag.d.ts +35 -0
  818. package/dist/lib/lanes/registry-flag.js +164 -0
  819. package/dist/lib/lanes/registry-persona.d.ts +20 -0
  820. package/dist/lib/lanes/registry-persona.js +329 -0
  821. package/dist/lib/lanes/registry.d.ts +122 -0
  822. package/dist/lib/lanes/registry.js +570 -0
  823. package/dist/lib/lanes/reviews.d.ts +38 -0
  824. package/dist/lib/lanes/reviews.js +395 -0
  825. package/dist/lib/lanes/runaway-tool-guard.d.ts +38 -0
  826. package/dist/lib/lanes/runaway-tool-guard.js +284 -0
  827. package/dist/lib/lanes/session-relink.d.ts +25 -0
  828. package/dist/lib/lanes/session-relink.js +216 -0
  829. package/dist/lib/lanes/spawn.d.ts +355 -0
  830. package/dist/lib/lanes/spawn.js +2668 -0
  831. package/dist/lib/lanes/ssm-command-context.d.ts +12 -0
  832. package/dist/lib/lanes/ssm-command-context.js +52 -0
  833. package/dist/lib/lanes/store.d.ts +91 -0
  834. package/dist/lib/lanes/store.js +1822 -0
  835. package/dist/lib/lanes/stories.d.ts +23 -0
  836. package/dist/lib/lanes/stories.js +92 -0
  837. package/dist/lib/lanes/story-ledger.d.ts +80 -0
  838. package/dist/lib/lanes/story-ledger.js +815 -0
  839. package/dist/lib/lanes/story-switch.d.ts +21 -0
  840. package/dist/lib/lanes/story-switch.js +75 -0
  841. package/dist/lib/lanes/text-scan.d.ts +11 -0
  842. package/dist/lib/lanes/text-scan.js +103 -0
  843. package/dist/lib/lanes/throttle.d.ts +116 -0
  844. package/dist/lib/lanes/throttle.js +437 -0
  845. package/dist/lib/lanes/timestamp.d.ts +3 -0
  846. package/dist/lib/lanes/timestamp.js +26 -0
  847. package/dist/lib/lanes/tracker-checks.d.ts +77 -0
  848. package/dist/lib/lanes/tracker-checks.js +134 -0
  849. package/dist/lib/lanes/tracker-report-state.d.ts +10 -0
  850. package/dist/lib/lanes/tracker-report-state.js +124 -0
  851. package/dist/lib/lanes/tracker-report.d.ts +203 -0
  852. package/dist/lib/lanes/tracker-report.js +522 -0
  853. package/dist/lib/lanes/tracker-store.d.ts +18 -0
  854. package/dist/lib/lanes/tracker-store.js +106 -0
  855. package/dist/lib/lanes/types.d.ts +1030 -0
  856. package/dist/lib/lanes/types.js +418 -0
  857. package/dist/lib/lanes/wait.d.ts +39 -0
  858. package/dist/lib/lanes/wait.js +159 -0
  859. package/dist/lib/lanes/watch.d.ts +39 -0
  860. package/dist/lib/lanes/watch.js +249 -0
  861. package/dist/lib/lanes/watcher-main.d.ts +11 -0
  862. package/dist/lib/lanes/watcher-main.js +108 -0
  863. package/dist/lib/lanes/watcher.d.ts +287 -0
  864. package/dist/lib/lanes/watcher.js +1972 -0
  865. package/dist/lib/mesh/api.d.ts +103 -10
  866. package/dist/lib/mesh/api.js +334 -64
  867. package/dist/lib/mesh/client.d.ts +3 -2
  868. package/dist/lib/mesh/client.js +26 -7
  869. package/dist/lib/mesh/denial-codes.d.ts +5 -0
  870. package/dist/lib/mesh/denial-codes.js +14 -0
  871. package/dist/lib/mesh/live/backfill-held.d.ts +67 -16
  872. package/dist/lib/mesh/live/backfill-held.js +415 -61
  873. package/dist/lib/mesh/live/backoff.d.ts +2 -2
  874. package/dist/lib/mesh/live/backoff.js +16 -3
  875. package/dist/lib/mesh/live/daemon/board-refresh.d.ts +7 -1
  876. package/dist/lib/mesh/live/daemon/board-refresh.js +78 -30
  877. package/dist/lib/mesh/live/daemon/config.d.ts +36 -0
  878. package/dist/lib/mesh/live/daemon/config.js +120 -0
  879. package/dist/lib/mesh/live/daemon/credentials.d.ts +64 -10
  880. package/dist/lib/mesh/live/daemon/credentials.js +270 -20
  881. package/dist/lib/mesh/live/daemon/doctor.d.ts +53 -0
  882. package/dist/lib/mesh/live/daemon/doctor.js +190 -6
  883. package/dist/lib/mesh/live/daemon/index.d.ts +13 -10
  884. package/dist/lib/mesh/live/daemon/index.js +7 -6
  885. package/dist/lib/mesh/live/daemon/install.d.ts +255 -1
  886. package/dist/lib/mesh/live/daemon/install.js +811 -13
  887. package/dist/lib/mesh/live/daemon/legacy-listen.d.ts +43 -0
  888. package/dist/lib/mesh/live/daemon/legacy-listen.js +89 -0
  889. package/dist/lib/mesh/live/daemon/live-cache.d.ts +26 -0
  890. package/dist/lib/mesh/live/daemon/live-cache.js +116 -0
  891. package/dist/lib/mesh/live/daemon/mqtt-events.d.ts +7 -0
  892. package/dist/lib/mesh/live/daemon/mqtt-events.js +2 -0
  893. package/dist/lib/mesh/live/daemon/mqtt-events.test-d.d.ts +2 -0
  894. package/dist/lib/mesh/live/daemon/mqtt-events.test-d.js +10 -0
  895. package/dist/lib/mesh/live/daemon/paths.d.ts +2 -0
  896. package/dist/lib/mesh/live/daemon/paths.js +2 -0
  897. package/dist/lib/mesh/live/daemon/presence.d.ts +24 -5
  898. package/dist/lib/mesh/live/daemon/presence.js +79 -10
  899. package/dist/lib/mesh/live/daemon/run.d.ts +48 -2
  900. package/dist/lib/mesh/live/daemon/run.js +485 -33
  901. package/dist/lib/mesh/live/daemon/state.d.ts +19 -2
  902. package/dist/lib/mesh/live/daemon/state.js +34 -2
  903. package/dist/lib/mesh/live/daemon/transcript-watch.d.ts +45 -9
  904. package/dist/lib/mesh/live/daemon/transcript-watch.js +227 -31
  905. package/dist/lib/mesh/live/daemon/version-drift.d.ts +5 -0
  906. package/dist/lib/mesh/live/daemon/version-drift.js +47 -0
  907. package/dist/lib/mesh/live/daemon/work-subscribe.d.ts +32 -0
  908. package/dist/lib/mesh/live/daemon/work-subscribe.js +262 -0
  909. package/dist/lib/mesh/live/emit-client.d.ts +8 -0
  910. package/dist/lib/mesh/live/emit-client.js +23 -8
  911. package/dist/lib/mesh/live/emit-evidence.d.ts +19 -0
  912. package/dist/lib/mesh/live/emit-evidence.js +20 -2
  913. package/dist/lib/mesh/live/emit.d.ts +9 -0
  914. package/dist/lib/mesh/live/emit.js +28 -2
  915. package/dist/lib/mesh/live/enqueue.d.ts +5 -0
  916. package/dist/lib/mesh/live/enqueue.js +19 -0
  917. package/dist/lib/mesh/live/flush.d.ts +17 -5
  918. package/dist/lib/mesh/live/flush.js +391 -38
  919. package/dist/lib/mesh/live/format-spool-line.d.ts +5 -2
  920. package/dist/lib/mesh/live/format-spool-line.js +10 -0
  921. package/dist/lib/mesh/live/paths.d.ts +2 -0
  922. package/dist/lib/mesh/live/paths.js +4 -0
  923. package/dist/lib/mesh/live/report-summary.d.ts +45 -0
  924. package/dist/lib/mesh/live/report-summary.js +234 -0
  925. package/dist/lib/mesh/live/session-event.schema.json +24 -1
  926. package/dist/lib/mesh/live/session-events-client.d.ts +2 -0
  927. package/dist/lib/mesh/live/session-events-client.js +26 -0
  928. package/dist/lib/mesh/live/session-seq.d.ts +4 -0
  929. package/dist/lib/mesh/live/session-seq.js +33 -0
  930. package/dist/lib/mesh/live/spool.d.ts +19 -0
  931. package/dist/lib/mesh/live/spool.js +269 -3
  932. package/dist/lib/mesh/live/validate-session-event.d.ts +1 -1
  933. package/dist/lib/mesh/live/validate-session-event.js +1 -1
  934. package/dist/lib/mesh/project-board.d.ts +65 -0
  935. package/dist/lib/mesh/project-board.js +181 -0
  936. package/dist/lib/mesh/story-status.d.ts +22 -0
  937. package/dist/lib/mesh/story-status.js +49 -0
  938. package/dist/lib/monitor.d.ts +149 -0
  939. package/dist/lib/monitor.js +519 -0
  940. package/dist/lib/node-binary.d.ts +50 -0
  941. package/dist/lib/node-binary.js +133 -0
  942. package/dist/lib/notify-recipient.d.ts +7 -0
  943. package/dist/lib/notify-recipient.js +11 -0
  944. package/dist/lib/onboarding/checkpoint.d.ts +13 -0
  945. package/dist/lib/onboarding/checkpoint.js +44 -0
  946. package/dist/lib/onboarding/cli/onboard.d.ts +53 -0
  947. package/dist/lib/onboarding/cli/onboard.js +135 -0
  948. package/dist/lib/onboarding/cli/prompts.d.ts +28 -0
  949. package/dist/lib/onboarding/cli/prompts.js +83 -0
  950. package/dist/lib/onboarding/errors.d.ts +34 -0
  951. package/dist/lib/onboarding/errors.js +59 -0
  952. package/dist/lib/onboarding/index.d.ts +13 -0
  953. package/dist/lib/onboarding/index.js +13 -0
  954. package/dist/lib/onboarding/orchestrator.d.ts +47 -0
  955. package/dist/lib/onboarding/orchestrator.js +569 -0
  956. package/dist/lib/onboarding/types.d.ts +79 -0
  957. package/dist/lib/onboarding/types.js +8 -0
  958. package/dist/lib/plan-limit-nag.d.ts +102 -6
  959. package/dist/lib/plan-limit-nag.js +348 -43
  960. package/dist/lib/policy-validator.d.ts +7 -0
  961. package/dist/lib/policy-validator.js +187 -0
  962. package/dist/lib/process-flag-company-context.d.ts +8 -0
  963. package/dist/lib/process-flag-company-context.js +67 -0
  964. package/dist/lib/report-publish.d.ts +175 -0
  965. package/dist/lib/report-publish.js +421 -0
  966. package/dist/lib/report-run.d.ts +62 -0
  967. package/dist/lib/report-run.js +123 -0
  968. package/dist/lib/report-snapshot.d.ts +12 -0
  969. package/dist/lib/report-snapshot.js +135 -0
  970. package/dist/lib/report-templates.d.ts +9 -0
  971. package/dist/lib/report-templates.js +21 -0
  972. package/dist/lib/scaffold-cli-floor.d.ts +8 -0
  973. package/dist/lib/scaffold-cli-floor.js +50 -0
  974. package/dist/lib/scan-packages/index.d.ts +2 -0
  975. package/dist/lib/scan-packages/index.js +168 -6
  976. package/dist/lib/search-index/background.d.ts +8 -1
  977. package/dist/lib/search-index/background.js +55 -200
  978. package/dist/lib/search-index/collection-path-repair-flag.d.ts +4 -0
  979. package/dist/lib/search-index/collection-path-repair-flag.js +7 -0
  980. package/dist/lib/search-index/embed-lock.d.ts +34 -0
  981. package/dist/lib/search-index/embed-lock.js +295 -0
  982. package/dist/lib/search-index/index.d.ts +12 -0
  983. package/dist/lib/search-index/index.js +153 -7
  984. package/dist/lib/search-index/load-gate.d.ts +57 -0
  985. package/dist/lib/search-index/load-gate.js +270 -0
  986. package/dist/lib/search-index/max-doc-bytes.d.ts +219 -0
  987. package/dist/lib/search-index/max-doc-bytes.js +463 -0
  988. package/dist/lib/search-index/qmd-exit-diagnostics.d.ts +5 -0
  989. package/dist/lib/search-index/qmd-exit-diagnostics.js +40 -0
  990. package/dist/lib/search-index/reindex-single-flight-flag.d.ts +5 -0
  991. package/dist/lib/search-index/reindex-single-flight-flag.js +8 -0
  992. package/dist/lib/service-manager/index.d.ts +42 -0
  993. package/dist/lib/service-manager/index.js +105 -0
  994. package/dist/lib/service-manager/launchd.d.ts +81 -0
  995. package/dist/lib/service-manager/launchd.js +212 -0
  996. package/dist/lib/service-manager/systemd.d.ts +19 -0
  997. package/dist/lib/service-manager/systemd.js +72 -0
  998. package/dist/lib/service-manager/types.d.ts +34 -0
  999. package/dist/lib/service-manager/types.js +26 -0
  1000. package/dist/lib/test-utils/isolated-flag-company-context.d.ts +3 -0
  1001. package/dist/lib/test-utils/isolated-flag-company-context.js +18 -0
  1002. package/dist/lib/work-context/bind-best.d.ts +66 -0
  1003. package/dist/lib/work-context/bind-best.js +344 -0
  1004. package/dist/lib/work-context/bind-calling-session.d.ts +26 -0
  1005. package/dist/lib/work-context/bind-calling-session.js +63 -0
  1006. package/dist/lib/work-context/company-rebind.d.ts +23 -0
  1007. package/dist/lib/work-context/company-rebind.js +59 -0
  1008. package/dist/lib/work-context/company.d.ts +22 -20
  1009. package/dist/lib/work-context/company.js +124 -40
  1010. package/dist/lib/work-context/config.d.ts +58 -11
  1011. package/dist/lib/work-context/config.js +334 -83
  1012. package/dist/lib/work-context/contract.d.ts +13 -0
  1013. package/dist/lib/work-context/contract.schema.json +3 -1
  1014. package/dist/lib/work-context/default-company.d.ts +43 -0
  1015. package/dist/lib/work-context/default-company.js +83 -0
  1016. package/dist/lib/work-context/outbox-quarantine-status-flag.d.ts +4 -0
  1017. package/dist/lib/work-context/outbox-quarantine-status-flag.js +7 -0
  1018. package/dist/lib/work-context/outbox.d.ts +27 -5
  1019. package/dist/lib/work-context/outbox.js +135 -6
  1020. package/dist/lib/work-context/prd-sync.d.ts +56 -0
  1021. package/dist/lib/work-context/prd-sync.js +197 -0
  1022. package/dist/lib/work-context/preflight-contract.d.ts +28 -0
  1023. package/dist/lib/work-context/preflight-contract.js +85 -0
  1024. package/dist/lib/work-context/prompt-rebind.d.ts +25 -0
  1025. package/dist/lib/work-context/prompt-rebind.js +85 -0
  1026. package/dist/lib/work-context/reconcile.d.ts +15 -0
  1027. package/dist/lib/work-context/reconcile.js +405 -29
  1028. package/dist/lib/work-context/state.d.ts +93 -10
  1029. package/dist/lib/work-context/state.js +342 -29
  1030. package/dist/lib/work-context/windows-acl.d.ts +123 -0
  1031. package/dist/lib/work-context/windows-acl.js +425 -0
  1032. package/dist/lib/workers-registry/index.js +62 -8
  1033. package/dist/lib/workers-registry/read.d.ts +15 -0
  1034. package/dist/lib/workers-registry/read.js +17 -0
  1035. package/dist/main.d.ts +32 -0
  1036. package/dist/main.js +273 -73
  1037. package/dist/native-fast-route.d.ts +7 -0
  1038. package/dist/native-fast-route.js +45 -0
  1039. package/dist/node-network-compat-core.d.ts +12 -0
  1040. package/dist/node-network-compat-core.js +41 -0
  1041. package/dist/node-network-compat-fast.d.ts +7 -0
  1042. package/dist/node-network-compat-fast.js +23 -0
  1043. package/dist/node-network-compat.d.ts +2 -30
  1044. package/dist/node-network-compat.js +4 -51
  1045. package/dist/node-preflight.d.ts +7 -1
  1046. package/dist/node-preflight.js +5 -5
  1047. package/dist/register-all.d.ts +4 -29
  1048. package/dist/register-all.js +4 -233
  1049. package/dist/run/discover-schemas.d.ts +2 -1
  1050. package/dist/run/env-graph-guard.d.ts +2 -2
  1051. package/dist/run/env-graph-guard.js +5 -2
  1052. package/dist/run/hq-plugin.d.ts +4 -0
  1053. package/dist/run/hq-plugin.js +36 -8
  1054. package/dist/secrets-env-fast-path.d.ts +5 -0
  1055. package/dist/secrets-env-fast-path.js +16 -0
  1056. package/dist/secrets-env-fast-route.d.ts +18 -0
  1057. package/dist/secrets-env-fast-route.js +54 -0
  1058. package/dist/sentry-before-send.js +80 -0
  1059. package/dist/sentry.d.ts +16 -4
  1060. package/dist/sentry.js +179 -18
  1061. package/dist/startup-registration.d.ts +26 -2
  1062. package/dist/startup-registration.js +116 -15
  1063. package/dist/utils/checkpoint-stamp-write-error.d.ts +28 -0
  1064. package/dist/utils/checkpoint-stamp-write-error.js +99 -0
  1065. package/dist/utils/cli-network-lifecycle.d.ts +4 -0
  1066. package/dist/utils/cli-network-lifecycle.js +11 -0
  1067. package/dist/utils/cli-telemetry.d.ts +75 -1
  1068. package/dist/utils/cli-telemetry.js +433 -7
  1069. package/dist/utils/client-health.d.ts +0 -4
  1070. package/dist/utils/client-health.js +2 -2
  1071. package/dist/utils/cognito-refresh-sentry.d.ts +3 -0
  1072. package/dist/utils/cognito-refresh-sentry.js +49 -0
  1073. package/dist/utils/cognito-session.d.ts +71 -0
  1074. package/dist/utils/cognito-session.js +481 -27
  1075. package/dist/utils/console-origin.d.ts +9 -0
  1076. package/dist/utils/console-origin.js +28 -0
  1077. package/dist/utils/contribution-table.d.ts +1 -1
  1078. package/dist/utils/core-eval-trigger.d.ts +4 -0
  1079. package/dist/utils/core-eval-trigger.js +88 -0
  1080. package/dist/utils/environmental-error.d.ts +18 -0
  1081. package/dist/utils/environmental-error.js +240 -7
  1082. package/dist/utils/exclusive-lock.d.ts +32 -0
  1083. package/dist/utils/exclusive-lock.js +75 -0
  1084. package/dist/utils/expected-cli-error.d.ts +2 -0
  1085. package/dist/utils/expected-cli-error.js +4 -0
  1086. package/dist/utils/fast-stream-errors.d.ts +12 -0
  1087. package/dist/utils/fast-stream-errors.js +18 -0
  1088. package/dist/utils/feedback-diagnostics.d.ts +2 -1
  1089. package/dist/utils/feedback-log-bundle.d.ts +51 -26
  1090. package/dist/utils/feedback-log-bundle.js +211 -31
  1091. package/dist/utils/feedback-logs.d.ts +18 -47
  1092. package/dist/utils/feedback-logs.js +50 -21
  1093. package/dist/utils/feedback-screenshots.d.ts +0 -1
  1094. package/dist/utils/feedback-screenshots.js +1 -1
  1095. package/dist/utils/files-browse-acl.d.ts +5 -0
  1096. package/dist/utils/files-browse-acl.js +11 -0
  1097. package/dist/utils/hq-core-yaml.d.ts +10 -0
  1098. package/dist/utils/hq-core-yaml.js +40 -0
  1099. package/dist/utils/hq-root-resolver.d.ts +13 -0
  1100. package/dist/utils/hq-root-resolver.js +103 -0
  1101. package/dist/utils/hq-roots.d.ts +25 -2
  1102. package/dist/utils/hq-roots.js +67 -7
  1103. package/dist/utils/incomplete-install-error.d.ts +87 -19
  1104. package/dist/utils/incomplete-install-error.js +319 -68
  1105. package/dist/utils/install-tree-torn.d.ts +260 -24
  1106. package/dist/utils/install-tree-torn.js +998 -51
  1107. package/dist/utils/large-file-guard.d.ts +0 -10
  1108. package/dist/utils/large-file-guard.js +1 -1
  1109. package/dist/utils/local-files-overview.d.ts +4 -8
  1110. package/dist/utils/local-files-overview.js +48 -7
  1111. package/dist/utils/login-provider.d.ts +7 -0
  1112. package/dist/utils/login-provider.js +34 -0
  1113. package/dist/utils/pack-contributions.d.ts +2 -14
  1114. package/dist/utils/pack-contributions.js +7 -44
  1115. package/dist/utils/package-root-diagnostics.d.ts +1 -1
  1116. package/dist/utils/people.d.ts +7 -11
  1117. package/dist/utils/people.js +5 -20
  1118. package/dist/utils/plan-gate-error.d.ts +52 -10
  1119. package/dist/utils/plan-gate-error.js +364 -41
  1120. package/dist/utils/qmd-model-download-error.d.ts +0 -8
  1121. package/dist/utils/qmd-model-download-error.js +1 -1
  1122. package/dist/utils/qmd-query-document-error.d.ts +0 -6
  1123. package/dist/utils/qmd-query-document-error.js +1 -1
  1124. package/dist/utils/redact-error-text.d.ts +0 -2
  1125. package/dist/utils/redact-error-text.js +3 -2
  1126. package/dist/utils/redact-url.d.ts +14 -0
  1127. package/dist/utils/redact-url.js +218 -0
  1128. package/dist/utils/run-bundled-script.d.ts +6 -0
  1129. package/dist/utils/run-bundled-script.js +117 -4
  1130. package/dist/utils/sandbox-runner-client.d.ts +2 -1
  1131. package/dist/utils/scaffold-fast-import-guard.d.ts +2 -0
  1132. package/dist/utils/scaffold-fast-import-guard.js +40 -0
  1133. package/dist/utils/scaffold-packlist-guard.d.ts +7 -0
  1134. package/dist/utils/scaffold-packlist-guard.js +23 -0
  1135. package/dist/utils/scaffold-sibling-references.d.ts +22 -0
  1136. package/dist/utils/scaffold-sibling-references.js +156 -0
  1137. package/dist/utils/secret-load-availability.d.ts +8 -0
  1138. package/dist/utils/secret-load-availability.js +54 -0
  1139. package/dist/utils/secrets-cache.d.ts +7 -3
  1140. package/dist/utils/secrets-cache.js +162 -14
  1141. package/dist/utils/self-update.d.ts +34 -1
  1142. package/dist/utils/self-update.js +660 -42
  1143. package/dist/utils/sentry-fingerprint.d.ts +23 -1
  1144. package/dist/utils/sentry-fingerprint.js +223 -31
  1145. package/dist/utils/staged-install.d.ts +34 -0
  1146. package/dist/utils/staged-install.js +346 -0
  1147. package/dist/utils/staged-npm-install.d.ts +16 -0
  1148. package/dist/utils/staged-npm-install.js +264 -0
  1149. package/dist/utils/sync-log-sources.d.ts +15 -0
  1150. package/dist/utils/sync-log-sources.js +36 -0
  1151. package/dist/utils/table-width.d.ts +7 -0
  1152. package/dist/utils/table-width.js +15 -0
  1153. package/dist/utils/team-upgrade.d.ts +1 -1
  1154. package/dist/utils/team-upgrade.js +4 -3
  1155. package/dist/utils/update-command-supervisor.cjs +247 -0
  1156. package/dist/utils/upload-author.d.ts +15 -0
  1157. package/dist/utils/upload-author.js +39 -0
  1158. package/dist/utils/vault-api.d.ts +21 -1
  1159. package/dist/utils/vault-api.js +251 -84
  1160. package/dist/utils/version-check.d.ts +11 -1
  1161. package/dist/utils/version-check.js +32 -3
  1162. package/dist/utils/version-gate.d.ts +101 -17
  1163. package/dist/utils/version-gate.js +645 -70
  1164. package/dist/utils/version-report.d.ts +27 -0
  1165. package/dist/utils/version-report.js +105 -0
  1166. package/dist/utils/windows-spawn.d.ts +6 -0
  1167. package/dist/utils/windows-spawn.js +37 -0
  1168. package/dist/version-request.d.ts +14 -0
  1169. package/dist/version-request.js +36 -0
  1170. package/package.json +20 -8
  1171. package/scripts/mesh-daemon-if-stale.mjs +20 -0
  1172. package/templates/reports/blank.md +3 -0
  1173. package/templates/reports/daily-digest.md +11 -0
  1174. package/templates/runbooks/update-report.md +21 -0
  1175. package/dist/commands/scaffold-fast.d.ts +0 -41
  1176. package/dist/commands/scaffold-fast.js +0 -57
  1177. package/dist/lib/work-context/index.d.ts +0 -25
  1178. package/dist/lib/work-context/index.js +0 -21
@@ -28,25 +28,33 @@
28
28
  * to silence both check + gate).
29
29
  */
30
30
  import { spawnSync } from "node:child_process";
31
+ import { createHash } from "node:crypto";
31
32
  import { buildSpawnPlan, quoteForWindowsShell } from "./windows-spawn.js";
32
- import { accessSync, closeSync, constants as fsConstants, existsSync, mkdtempSync, openSync, readdirSync, readFileSync, rmSync, } from "node:fs";
33
+ import { accessSync, closeSync, constants as fsConstants, copyFileSync, existsSync, mkdirSync, mkdtempSync, openSync, readdirSync, realpathSync, readFileSync, rmSync, } from "node:fs";
33
34
  import os from "node:os";
34
35
  import path from "node:path";
35
36
  import { fileURLToPath } from "node:url";
36
37
  import chalk from "chalk";
37
38
  import semver from "semver";
38
39
  import { CLI_NAME, CLI_VERSION } from "../cli-version.js";
40
+ import { Sentry } from "../sentry.js";
41
+ import { isCliTelemetryDisabled } from "./cli-telemetry.js";
39
42
  import { DEFAULT_VAULT_API_URL } from "./cognito-session.js";
40
43
  import { acquireUpdateLock, } from "./update-lock.js";
41
44
  const CLIENT_ID = "hq-cli";
42
45
  const ENDPOINT_PATH = "/v1/client-version/check";
43
46
  const FETCH_TIMEOUT_MS = 3_000;
44
47
  const LATEST_PACKAGE_SPEC = `${CLI_NAME}@latest`;
48
+ let currentVersionGatePhase = "unknown";
49
+ /** The last closed version-gate phase observed in this process. */
50
+ export function getVersionGatePhase() {
51
+ return currentVersionGatePhase;
52
+ }
45
53
  function isOptedOut() {
46
54
  return process.env.HQ_NO_UPDATE_CHECK === "1";
47
55
  }
48
- function findRunningPackageRoot() {
49
- let dir = path.dirname(fileURLToPath(import.meta.url));
56
+ function findCliPackageRoot(startDir) {
57
+ let dir = startDir;
50
58
  while (true) {
51
59
  try {
52
60
  const pkg = JSON.parse(readFileSync(path.join(dir, "package.json"), "utf-8"));
@@ -62,6 +70,105 @@ function findRunningPackageRoot() {
62
70
  dir = parent;
63
71
  }
64
72
  }
73
+ function findRunningPackageRoot() {
74
+ return findCliPackageRoot(path.dirname(fileURLToPath(import.meta.url)));
75
+ }
76
+ /** Resolve an on-PATH executable back to the installed hq-cli package it loads. */
77
+ function findPackageRootForExecutable(bin) {
78
+ try {
79
+ const packageRoot = findCliPackageRoot(path.dirname(realpathSync(bin)));
80
+ if (packageRoot)
81
+ return packageRoot;
82
+ }
83
+ catch {
84
+ // A missing or inaccessible executable may still be recoverable from the
85
+ // configured pnpm global layout below.
86
+ }
87
+ // pnpm emits shell/.cmd shims into its global bin directory. realpathSync()
88
+ // resolves symlinks, but a generated shim is a regular file, so walking up
89
+ // from its real path never reaches the package it invokes. Look up only the
90
+ // hq-cli package under the matching PNPM_HOME/global layout instead.
91
+ const binDir = path.dirname(bin);
92
+ const configuredHome = process.env.PNPM_HOME;
93
+ const inferredHome = path.basename(binDir).toLowerCase() === "bin"
94
+ ? path.dirname(binDir)
95
+ : binDir;
96
+ const candidateHomes = [configuredHome, inferredHome].filter((home, index, homes) => Boolean(home) && homes.findIndex((candidate) => candidate === home) === index);
97
+ const home = candidateHomes.find((candidate) => samePath(binDir, candidate) ||
98
+ samePath(binDir, path.join(candidate, "bin")));
99
+ if (!home)
100
+ return null;
101
+ const globalRoot = path.join(home, "global");
102
+ let storeVersions;
103
+ try {
104
+ storeVersions = readdirSync(globalRoot);
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ const packageSegments = CLI_NAME.split("/");
110
+ for (const storeVersion of storeVersions) {
111
+ const storeRoot = path.join(globalRoot, storeVersion);
112
+ const packageRoots = [
113
+ path.join(storeRoot, "node_modules", ...packageSegments),
114
+ ];
115
+ // pnpm v11 adds a hash between its global store version and node_modules.
116
+ // Its documented `vN` global layout is recognized unconditionally below.
117
+ if (/^v\d+$/.test(storeVersion)) {
118
+ try {
119
+ for (const hash of readdirSync(storeRoot)) {
120
+ packageRoots.push(path.join(storeRoot, hash, "node_modules", ...packageSegments));
121
+ }
122
+ }
123
+ catch {
124
+ // A missing or unreadable version directory is simply not a candidate.
125
+ }
126
+ }
127
+ for (const candidate of packageRoots) {
128
+ const packageRoot = findCliPackageRoot(candidate);
129
+ if (packageRoot &&
130
+ samePath(packageRoot, candidate) &&
131
+ isPnpmManagedPackageDir(packageRoot, true)) {
132
+ return packageRoot;
133
+ }
134
+ }
135
+ }
136
+ return null;
137
+ }
138
+ function samePath(left, right) {
139
+ const canonical = (value) => {
140
+ try {
141
+ return realpathSync(value);
142
+ }
143
+ catch {
144
+ return path.resolve(value);
145
+ }
146
+ };
147
+ const a = canonical(left);
148
+ const b = canonical(right);
149
+ return process.platform === "win32"
150
+ ? a.toLowerCase() === b.toLowerCase()
151
+ : a === b;
152
+ }
153
+ function globalInstallManagerForPath(bin, packageRoot) {
154
+ if (isPnpmManagedPackageDir(packageRoot, true)) {
155
+ return "pnpm";
156
+ }
157
+ if (isBunManagedPackageDir(packageRoot))
158
+ return "bun";
159
+ const prefix = npmPrefixFromPackageDir(packageRoot);
160
+ if (!prefix)
161
+ return null;
162
+ const normalizedRoot = packageRoot.replace(/\\/g, "/");
163
+ const normalizedPrefix = prefix.replace(/\\/g, "/").replace(/\/$/, "");
164
+ // POSIX global npm packages live under <prefix>/lib/node_modules. On
165
+ // Windows npm puts hq.cmd directly in <prefix>, so also verify the bin's
166
+ // directory against the prefix-derived shim location there.
167
+ const posixGlobal = normalizedRoot.includes("/lib/node_modules/");
168
+ const windowsGlobal = process.platform === "win32" &&
169
+ samePath(path.dirname(bin), normalizedPrefix);
170
+ return posixGlobal || windowsGlobal ? "npm" : null;
171
+ }
65
172
  export function npmPrefixFromPackageDir(pkgDir) {
66
173
  const normalized = pkgDir.replace(/\\/g, "/").replace(/\/+$/, "");
67
174
  const segments = normalized.split("/");
@@ -93,8 +200,8 @@ function pnpmHomeGlobalRoot() {
93
200
  * on PATH:
94
201
  *
95
202
  * $PNPM_HOME/hq <- shim on PATH
96
- * $PNPM_HOME/global/5/node_modules/@indigoai-us/hq-cli <- symlink
97
- * $PNPM_HOME/global/5/.pnpm/@indigoai-us+hq-cli@5.61.0/node_modules/…
203
+ * pnpm through v10: $PNPM_HOME/global/5/node_modules/@indigoai-us/hq-cli
204
+ * pnpm v11+: $PNPM_HOME/global/v11/<hash>/node_modules/@indigoai-us/hq-cli
98
205
  *
99
206
  * Both the symlinked and the resolved (`.pnpm`) form are recognised, because
100
207
  * whether `import.meta.url` reports the link or its target depends on how node
@@ -108,18 +215,26 @@ function pnpmHomeGlobalRoot() {
108
215
  * i.e. the gate would re-fire and re-install globally on every subsequent run.
109
216
  * Those layouts fall through to the ordinary npm-prefix/manual handling.
110
217
  */
111
- export function isPnpmManagedPackageDir(pkgDir) {
218
+ export function isPnpmManagedPackageDir(pkgDir, acceptVersionPrefixedGlobalDir = true) {
112
219
  const normalized = pkgDir.replace(/\\/g, "/").replace(/\/+$/, "");
113
220
  const segments = normalized.split("/").filter(Boolean);
114
- // `global/<digits>` — pnpm's global root, in either the symlinked or the
115
- // resolved (`.pnpm`) form, and independent of where PNPM_HOME points.
221
+ // pnpm through v10 uses `global/<digits>`; pnpm v11+ uses
222
+ // `global/v<major>`. Recognize both documented layouts, and require a
223
+ // version segment so `global/next` or a `v11` directory elsewhere cannot be
224
+ // mistaken for a global install.
116
225
  for (let i = 0; i < segments.length - 1; i += 1) {
117
- if (segments[i] === "global" && /^\d+$/.test(segments[i + 1]))
226
+ if (segments[i] !== "global")
227
+ continue;
228
+ const globalDirVersion = segments[i + 1];
229
+ if (/^\d+$/.test(globalDirVersion))
118
230
  return true;
231
+ if (acceptVersionPrefixedGlobalDir && /^v\d+$/.test(globalDirVersion)) {
232
+ return true;
233
+ }
119
234
  }
120
- // Belt-and-braces for a future pnpm layout whose store dir is not numeric:
121
- // anything under `$PNPM_HOME/global` is global by construction. Still keyed
122
- // on the `global` segment so `$PNPM_HOME/store/**` (dlx caches) stays out.
235
+ // PNPM_HOME/global is pnpm's configured global root by construction, so
236
+ // keep this fallback in both flag states. The flag above gates only the new
237
+ // documented global/v<major> segment match outside that configured root.
123
238
  const globalRoot = pnpmHomeGlobalRoot();
124
239
  if (globalRoot) {
125
240
  if (normalized === globalRoot || normalized.startsWith(`${globalRoot}/`)) {
@@ -246,7 +361,7 @@ export function resolveRunningInstall() {
246
361
  const packageRoot = findRunningPackageRoot();
247
362
  if (!packageRoot)
248
363
  return { manager: "npm", prefix: null, packageRoot: null };
249
- if (isPnpmManagedPackageDir(packageRoot)) {
364
+ if (isPnpmManagedPackageDir(packageRoot, true)) {
250
365
  return { manager: "pnpm", prefix: null, packageRoot };
251
366
  }
252
367
  if (isBunManagedPackageDir(packageRoot)) {
@@ -278,9 +393,9 @@ export function resolveRunningPrefix() {
278
393
  return resolveRunningInstall().prefix;
279
394
  }
280
395
  /**
281
- * Whether the current process can write the npm global `prefix` — i.e. whether
282
- * an `npm install -g --prefix <prefix>` could actually replace the installed
283
- * CLI, or would fail with EACCES.
396
+ * Whether the current process can write the npm global install targets — i.e.
397
+ * whether an `npm install -g --prefix <prefix>` could actually replace the
398
+ * installed CLI, or would fail with EACCES.
284
399
  *
285
400
  * The path npm rewrites is the prefix's `bin` dir (`<prefix>/bin/hq` on unix
286
401
  * globals — the `rename /usr/bin/hq` EACCES the agent boxes hit), so that is
@@ -309,17 +424,119 @@ export function isPrefixWritable(prefix, access = (target, mode) => accessSync(t
309
424
  return false;
310
425
  }
311
426
  /**
312
- * One-line operator explanation for a failed global update whose prefix the
313
- * running user cannot write. This is the agent-box case: the CLI is a
314
- * root-owned `/usr` global install and the runtime is unprivileged, so the
315
- * update genuinely cannot converge from here and re-trying it silently would
316
- * loop. Says so plainly and points at the paths that CAN update it.
427
+ * Check the directories an npm global update must mutate before spawning npm.
428
+ * Npm replaces the package under node_modules and writes executable links
429
+ * under prefix/bin. The package's parent must be writable because npm renames
430
+ * the old package there.
431
+ *
432
+ * When one of those directories has not been created yet, check its nearest
433
+ * existing ancestor: npm can create a child only if that ancestor is writable.
317
434
  */
318
- export function nonWritablePrefixNote(prefix) {
319
- return (`The npm global prefix ${prefix} is not writable by the current user, so this update cannot ` +
320
- `take effect here. On an agent box this is expected: the CLI is a root-owned global install and ` +
321
- `updates land as root — via the box's hq-cli-update timer, or \`sudo npm install -g ${CLI_NAME}@latest\` — ` +
322
- `not from the unprivileged runtime.`);
435
+ export function canWriteNpmInstall(prefix, packageRoot, access = (target, mode) => accessSync(target, mode)) {
436
+ let nodeModulesRoot = path.join(prefix, process.platform === "win32" ? "node_modules" : "lib/node_modules");
437
+ let cursor = path.resolve(packageRoot);
438
+ while (true) {
439
+ if (path.basename(cursor).toLowerCase() === "node_modules") {
440
+ nodeModulesRoot = cursor;
441
+ break;
442
+ }
443
+ const parent = path.dirname(cursor);
444
+ if (parent === cursor)
445
+ break;
446
+ cursor = parent;
447
+ }
448
+ const mode = fsConstants.W_OK | fsConstants.X_OK;
449
+ // npm needs write access to the directories it replaces or links into. The
450
+ // prefix root itself need not be writable when those directories already
451
+ // exist; when one is missing, the nearest-existing-ancestor check below
452
+ // still verifies permission to create it.
453
+ const targets = [path.join(prefix, "bin"), nodeModulesRoot, path.dirname(packageRoot)];
454
+ return targets.every((target) => {
455
+ let candidate = path.resolve(target);
456
+ while (true) {
457
+ try {
458
+ access(candidate, mode);
459
+ return true;
460
+ }
461
+ catch (error) {
462
+ if (error?.code !== "ENOENT") {
463
+ return false;
464
+ }
465
+ const parent = path.dirname(candidate);
466
+ if (parent === candidate)
467
+ return false;
468
+ candidate = parent;
469
+ }
470
+ }
471
+ });
472
+ }
473
+ const nonWritablePrefixNotices = new Set();
474
+ /** Claim the one local warning/report for this installed version and prefix. */
475
+ export function claimNonWritableNpmPrefixNotice(install, fromVersion, homeDir = os.homedir(), kind = "user") {
476
+ const installIdentity = path.resolve(install.packageRoot ?? install.prefix ?? `${install.manager}:unknown-install`);
477
+ const identity = createHash("sha256")
478
+ .update(`${installIdentity}\0${fromVersion}`)
479
+ .digest("hex");
480
+ const localKey = path.join(homeDir, ".hq", "self-update", "prefix-not-writable", `${kind}-${identity}`);
481
+ if (nonWritablePrefixNotices.has(localKey))
482
+ return false;
483
+ try {
484
+ mkdirSync(path.dirname(localKey), { recursive: true, mode: 0o700 });
485
+ const descriptor = openSync(localKey, "wx", 0o600);
486
+ closeSync(descriptor);
487
+ nonWritablePrefixNotices.add(localKey);
488
+ return true;
489
+ }
490
+ catch (error) {
491
+ if (error?.code === "EEXIST") {
492
+ nonWritablePrefixNotices.add(localKey);
493
+ return false;
494
+ }
495
+ // Preserve the warning/report for this process if the home directory is
496
+ // unavailable. The marker is normally durable across CLI invocations.
497
+ console.error(chalk.dim("hq: could not persist the self-update permission notice rate limit."));
498
+ nonWritablePrefixNotices.add(localKey);
499
+ return true;
500
+ }
501
+ }
502
+ /** Emit one path-free warning event for a handled non-writable npm prefix. */
503
+ export function captureNonWritableNpmPrefixNotice(input) {
504
+ if (isCliTelemetryDisabled(input.env ?? process.env))
505
+ return Promise.resolve();
506
+ const claimed = claimNonWritableNpmPrefixNotice(input.install, input.fromVersion, input.homeDir, "report");
507
+ if (!claimed)
508
+ return Promise.resolve();
509
+ Sentry.captureMessage("Self-update deferred: npm prefix is not writable", {
510
+ level: "warning",
511
+ fingerprint: ["self-update", "npm-prefix-not-writable"],
512
+ tags: {
513
+ from_version: input.fromVersion,
514
+ target_version: input.targetVersion,
515
+ install_flavor: "npm",
516
+ error_class: "prefix_not_writable",
517
+ error_reason: "permission_denied",
518
+ },
519
+ });
520
+ return Sentry.flush(2_000).then((flushed) => {
521
+ if (!flushed) {
522
+ console.error(chalk.dim("hq: the self-update permission notice could not be sent to Sentry yet."));
523
+ }
524
+ });
525
+ }
526
+ /** One-line repair guidance for a global npm install the current user cannot write. */
527
+ export function nonWritablePrefixNote(prefix, platform = process.platform) {
528
+ const prefixArg = `'${prefix.replace(/'/g, "'\\''")}'`;
529
+ if (platform === "win32") {
530
+ const windowsPrefixArg = `"${prefix.replace(/"/g, '""')}"`;
531
+ return (`The npm global prefix ${prefix} is not writable by the current user, so hq-cli was not updated. ` +
532
+ `Open PowerShell as Administrator and run \`npm install -g --prefix ${windowsPrefixArg} ${CLI_NAME}@latest\`, ` +
533
+ `or set a user-owned prefix with \`npm config set prefix "$env:APPDATA\\npm"\` and run ` +
534
+ `\`npm install -g ${CLI_NAME}@latest\` from that PowerShell session.`);
535
+ }
536
+ return (`The npm global prefix ${prefix} is not writable by the current user, so hq-cli was not updated. ` +
537
+ `Run \`sudo npm install -g --prefix ${prefixArg} ${CLI_NAME}@latest\` to update this install, ` +
538
+ `or switch to a user-owned prefix with \`npm config set prefix ~/.npm-global\`, then run ` +
539
+ `\`npm install -g ${CLI_NAME}@latest\` after adding ~/.npm-global/bin to PATH.`);
323
540
  }
324
541
  /**
325
542
  * Derive `PNPM_HOME` from a pnpm-managed install's own path. pnpm resolves its
@@ -470,7 +687,7 @@ export function cleanStalePartialInstall(prefix, fs = nodeStaleInstallFs) {
470
687
  * `null` on any failure (caller treats as "no gate"). Tight 3s timeout —
471
688
  * a hung server must not delay CLI startup.
472
689
  */
473
- async function fetchVersionDecision() {
690
+ async function fetchVersionDecision(timeoutMs = FETCH_TIMEOUT_MS) {
474
691
  try {
475
692
  const url = `${DEFAULT_VAULT_API_URL}${ENDPOINT_PATH}`;
476
693
  const res = await fetch(url, {
@@ -484,7 +701,7 @@ async function fetchVersionDecision() {
484
701
  currentVersion: CLI_VERSION,
485
702
  platform: `${process.platform}-${process.arch}`,
486
703
  }),
487
- signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
704
+ signal: AbortSignal.timeout(timeoutMs),
488
705
  });
489
706
  if (!res.ok)
490
707
  return null;
@@ -530,20 +747,185 @@ export { buildSpawnPlan, quoteForWindowsShell };
530
747
  * protection silently disappearing.
531
748
  */
532
749
  export function inOwnProcessGroup(options) {
533
- return { ...options, detached: true };
750
+ return { ...options, detached: true, windowsHide: true };
534
751
  }
535
752
  /** Tail of captured installer stderr kept to explain a failure. */
536
753
  const INSTALL_DETAIL_MAX_CHARS = 400;
754
+ const KNOWN_NPM_UPDATE_ERROR_CODES = new Set([
755
+ "E404",
756
+ "EACCES",
757
+ "EAI_AGAIN",
758
+ "ECONNREFUSED",
759
+ "ECONNRESET",
760
+ "ENOTFOUND",
761
+ "EPERM",
762
+ "ETARGET",
763
+ "ETIMEDOUT",
764
+ ]);
765
+ function knownNpmUpdateErrorCode(stderr) {
766
+ const escape = String.fromCharCode(0x1b);
767
+ const plainStderr = stderr.replace(new RegExp(`${escape}\\[[0-9;]*m`, "g"), "");
768
+ const match = /^[ \t]*npm[ \t]+(?:ERR!|error)[ \t]+code[ \t]+([A-Z0-9_]{1,32})[ \t]*$/im.exec(plainStderr);
769
+ const code = match?.[1]?.toUpperCase();
770
+ return code && KNOWN_NPM_UPDATE_ERROR_CODES.has(code) ? code : undefined;
771
+ }
772
+ function readKnownNpmDiagnosticCode(filename) {
773
+ if (!existsSync(filename))
774
+ return undefined;
775
+ try {
776
+ const contents = readFileSync(filename, "utf-8").trim();
777
+ if (KNOWN_NPM_UPDATE_ERROR_CODES.has(contents))
778
+ return contents;
779
+ return knownNpmUpdateErrorCode(contents);
780
+ }
781
+ catch (error) {
782
+ const code = error &&
783
+ typeof error === "object" &&
784
+ "code" in error &&
785
+ typeof error.code === "string" &&
786
+ /^[A-Z0-9_]{1,32}$/.test(error.code)
787
+ ? error.code
788
+ : error instanceof Error
789
+ ? "Error"
790
+ : "UnknownError";
791
+ console.error(chalk.yellow(`Could not read update diagnostic output (${code}).`));
792
+ return undefined;
793
+ }
794
+ }
795
+ /** Give a package-manager update ample time without letting it wedge every CLI call. */
796
+ const DEFAULT_UPDATE_TIMEOUT_MS = 30 * 60 * 1_000;
797
+ /** Node clamps longer timer delays to 1ms, so accepting them would invert the deadline. */
798
+ const MAX_UPDATE_TIMEOUT_MS = 2_147_483_647;
799
+ /** Let a well-behaved updater stop before force-killing the rest of its group. */
800
+ const UPDATE_TERMINATE_GRACE_MS = 1_000;
801
+ /** A successful group kill must still yield a close event so the supervisor reaps its child. */
802
+ const UPDATE_REAP_GRACE_MS = 1_000;
803
+ function updateTimeoutMs(env = process.env) {
804
+ const value = env.HQ_UPDATE_TIMEOUT_MS;
805
+ if (value === undefined || value.trim() === "")
806
+ return DEFAULT_UPDATE_TIMEOUT_MS;
807
+ const parsed = Number(value);
808
+ if (Number.isInteger(parsed) && parsed > 0 && parsed <= MAX_UPDATE_TIMEOUT_MS) {
809
+ return parsed;
810
+ }
811
+ // Falling back rather than clamping is deliberate: a clamp would silently
812
+ // substitute a materially different deadline. The warning tells operators
813
+ // their requested value was rejected before any update begins.
814
+ console.error(chalk.yellow(`⚠ Ignoring HQ_UPDATE_TIMEOUT_MS=${JSON.stringify(value)}: expected a positive integer no greater than ${MAX_UPDATE_TIMEOUT_MS}ms; using ${DEFAULT_UPDATE_TIMEOUT_MS}ms.`));
815
+ return DEFAULT_UPDATE_TIMEOUT_MS;
816
+ }
817
+ /**
818
+ * The actual installer runs in a small asynchronous supervisor, rather than
819
+ * directly under `spawnSync`. `spawnSync({ timeout })` only signals its direct
820
+ * child. That is unsafe here because the installer deliberately runs in its
821
+ * own process group: the leader can exit while its descendants keep the global
822
+ * store and registry connection alive. The CommonJS file is copied next to the
823
+ * compiled module for production and is directly runnable from source tests.
824
+ */
825
+ const UPDATE_COMMAND_SUPERVISOR = fileURLToPath(new URL("./update-command-supervisor.cjs", import.meta.url));
826
+ /** Set while a self-update runs the installer through a copy of the supervisor. */
827
+ let detachedSupervisor = null;
828
+ /** The supervisor script the next install runs under. */
829
+ export function updateSupervisorPath() {
830
+ return detachedSupervisor ?? UPDATE_COMMAND_SUPERVISOR;
831
+ }
832
+ /**
833
+ * Copies the supervisor to a temp dir and runs installs through the copy until
834
+ * disposed. The in-place self-update moves the whole hq-cli package aside
835
+ * before it starts the installer, and the supervisor ships inside that package
836
+ * (5.290.0-5.292.0 failed every npm global self-update with MODULE_NOT_FOUND).
837
+ * The script needs only Node builtins, so the copy runs on its own. Returns
838
+ * null when the copy cannot be made; the caller then keeps the bundled path.
839
+ */
840
+ export function detachUpdateSupervisor() {
841
+ if (detachedSupervisor)
842
+ return null;
843
+ let dir;
844
+ try {
845
+ dir = mkdtempSync(path.join(os.tmpdir(), "hq-cli-update-supervisor-"));
846
+ const copy = path.join(dir, "update-command-supervisor.cjs");
847
+ copyFileSync(UPDATE_COMMAND_SUPERVISOR, copy);
848
+ detachedSupervisor = copy;
849
+ const tempDir = dir;
850
+ return {
851
+ path: copy,
852
+ dispose: () => {
853
+ if (detachedSupervisor === copy)
854
+ detachedSupervisor = null;
855
+ try {
856
+ rmSync(tempDir, { recursive: true, force: true });
857
+ }
858
+ catch (error) {
859
+ const failureClass = error &&
860
+ typeof error === "object" &&
861
+ "code" in error &&
862
+ typeof error.code === "string" &&
863
+ /^[A-Z0-9_]{1,32}$/.test(error.code)
864
+ ? error.code
865
+ : error instanceof Error
866
+ ? "Error"
867
+ : "UnknownError";
868
+ console.error(chalk.yellow(`Could not remove update supervisor temp dir (${failureClass}).`));
869
+ }
870
+ },
871
+ };
872
+ }
873
+ catch (error) {
874
+ const failureClass = error &&
875
+ typeof error === "object" &&
876
+ "code" in error &&
877
+ typeof error.code === "string" &&
878
+ /^[A-Z0-9_]{1,32}$/.test(error.code)
879
+ ? error.code
880
+ : error instanceof Error
881
+ ? "Error"
882
+ : "UnknownError";
883
+ console.error(chalk.yellow(`Could not copy update supervisor (${failureClass}).`));
884
+ if (dir)
885
+ rmSync(dir, { recursive: true, force: true });
886
+ return null;
887
+ }
888
+ }
889
+ function readSupervisorSpawnError(errorMarker) {
890
+ try {
891
+ const value = JSON.parse(readFileSync(errorMarker, "utf-8"));
892
+ const code = typeof value.code === "string" ? value.code : undefined;
893
+ const detail = typeof value.detail === "string" ? value.detail : undefined;
894
+ return code === undefined && detail === undefined ? undefined : { code, detail };
895
+ }
896
+ catch {
897
+ return undefined;
898
+ }
899
+ }
537
900
  export function openInstallOutput(verbose, isTty = process.stdout.isTTY === true && process.stderr.isTTY === true) {
538
901
  if (verbose && isTty) {
902
+ const dir = mkdtempSync(path.join(os.tmpdir(), "hq-cli-install-"));
903
+ const timeoutMarker = path.join(dir, "timed-out");
904
+ const errorMarker = path.join(dir, "spawn-error.json");
905
+ const diagnosticMarker = path.join(dir, "npm-error-code");
539
906
  return {
540
907
  stdio: ["ignore", "inherit", "inherit"],
541
908
  stderrTail: () => "",
542
- dispose: () => { },
909
+ diagnosticCode: () => readKnownNpmDiagnosticCode(diagnosticMarker),
910
+ diagnosticMarker,
911
+ timeoutMarker,
912
+ errorMarker,
913
+ timedOut: () => existsSync(timeoutMarker),
914
+ spawnError: () => readSupervisorSpawnError(errorMarker),
915
+ dispose: () => {
916
+ try {
917
+ rmSync(dir, { recursive: true, force: true });
918
+ }
919
+ catch {
920
+ // Best-effort cleanup of the supervisor's timeout marker.
921
+ }
922
+ },
543
923
  };
544
924
  }
545
925
  const dir = mkdtempSync(path.join(os.tmpdir(), "hq-cli-install-"));
546
926
  const errPath = path.join(dir, "stderr.log");
927
+ const timeoutPath = path.join(dir, "timed-out");
928
+ const errorPath = path.join(dir, "spawn-error.json");
547
929
  const out = openSync(path.join(dir, "stdout.log"), "a");
548
930
  const err = openSync(errPath, "a");
549
931
  return {
@@ -556,6 +938,11 @@ export function openInstallOutput(verbose, isTty = process.stdout.isTTY === true
556
938
  return "";
557
939
  }
558
940
  },
941
+ diagnosticCode: () => readKnownNpmDiagnosticCode(errPath),
942
+ timeoutMarker: timeoutPath,
943
+ errorMarker: errorPath,
944
+ timedOut: () => existsSync(timeoutPath),
945
+ spawnError: () => readSupervisorSpawnError(errorPath),
559
946
  dispose: () => {
560
947
  for (const fd of [out, err]) {
561
948
  try {
@@ -574,13 +961,29 @@ export function openInstallOutput(verbose, isTty = process.stdout.isTTY === true
574
961
  },
575
962
  };
576
963
  }
577
- export function runUpdateCommand(cmd, args, env) {
578
- const output = openInstallOutput(true);
964
+ export function runSupervisedUpdateCommand(cmd, args, output, env) {
579
965
  try {
580
966
  const plan = buildSpawnPlan(cmd, args);
581
- const result = spawnSync(plan.cmd, plan.args, inOwnProcessGroup({
967
+ const timeoutMs = updateTimeoutMs(env);
968
+ // The outer sync spawn waits only for our supervisor. The supervisor owns
969
+ // the wall-clock deadline, sends TERM to the updater's whole process group,
970
+ // waits briefly, sends KILL to survivors, and waits for its direct child so
971
+ // the completed result leaves no zombie behind.
972
+ const result = spawnSync(process.execPath, [
973
+ updateSupervisorPath(),
974
+ JSON.stringify({
975
+ cmd: plan.cmd,
976
+ args: plan.args,
977
+ shell: plan.shell,
978
+ timeoutMs,
979
+ graceMs: UPDATE_TERMINATE_GRACE_MS,
980
+ reapMs: UPDATE_REAP_GRACE_MS,
981
+ timeoutMarker: output.timeoutMarker,
982
+ errorMarker: output.errorMarker,
983
+ diagnosticMarker: output.diagnosticMarker,
984
+ }),
985
+ ], inOwnProcessGroup({
582
986
  stdio: output.stdio,
583
- shell: plan.shell,
584
987
  ...(env ? { env } : {}),
585
988
  }));
586
989
  // spawnSync reports a missing executable via `error`, not a throw.
@@ -588,12 +991,34 @@ export function runUpdateCommand(cmd, args, env) {
588
991
  const code = result.error.code;
589
992
  return { ok: false, code, detail: result.error.message };
590
993
  }
994
+ if (output.timedOut()) {
995
+ const command = [cmd, ...args].join(" ");
996
+ const supervisorError = output.spawnError();
997
+ const detail = [
998
+ `timed out after ${timeoutMs}ms: ${command}`,
999
+ supervisorError?.detail,
1000
+ ]
1001
+ .filter(Boolean)
1002
+ .join("; ");
1003
+ console.error(chalk.red(`✗ Update ${detail}.`));
1004
+ return { ok: false, code: "ETIMEDOUT", detail };
1005
+ }
1006
+ const spawnedError = output.spawnError();
1007
+ if (spawnedError) {
1008
+ return {
1009
+ ok: false,
1010
+ code: spawnedError.code,
1011
+ detail: spawnedError.detail ?? "failed to start updater",
1012
+ };
1013
+ }
591
1014
  if (result.status !== 0) {
592
1015
  // When output went to a file rather than the user's terminal, its tail is
593
1016
  // the only explanation anyone will ever see for this failure.
594
1017
  const captured = output.stderrTail();
595
1018
  return {
596
1019
  ok: false,
1020
+ diagnosticCode: output.diagnosticCode(),
1021
+ failureKind: "package_manager_exit",
597
1022
  detail: captured || `exit ${result.status ?? "signal"}`,
598
1023
  };
599
1024
  }
@@ -606,6 +1031,12 @@ export function runUpdateCommand(cmd, args, env) {
606
1031
  detail: err instanceof Error ? err.message : String(err),
607
1032
  };
608
1033
  }
1034
+ }
1035
+ export function runUpdateCommand(cmd, args, env) {
1036
+ const output = openInstallOutput(true);
1037
+ try {
1038
+ return runSupervisedUpdateCommand(cmd, args, output, env);
1039
+ }
609
1040
  finally {
610
1041
  output.dispose();
611
1042
  }
@@ -656,7 +1087,9 @@ function manualUpdateCommand(install, decision) {
656
1087
  * remains for callers that pass no handler.
657
1088
  */
658
1089
  function nudgeUpdateRecommended(decision, install = resolveRunningInstall()) {
659
- const msg = chalk.yellow(`⚠ A new version of hq-cli is available: ${decision.latestVersion} (current: ${decision.currentVersion}).`);
1090
+ if (!isNewerVersion(decision.latestVersion, CLI_VERSION))
1091
+ return;
1092
+ const msg = chalk.yellow(`⚠ A new version of hq-cli is available: ${decision.latestVersion} (current: ${CLI_VERSION}).`);
660
1093
  console.error(msg);
661
1094
  // A local copy is not updated by any global command. Printing the server's
662
1095
  // npm-shaped one would send the user to install a second copy that this
@@ -707,6 +1140,44 @@ export function resolveHqOnPath() {
707
1140
  return null;
708
1141
  }
709
1142
  }
1143
+ /**
1144
+ * Pull the CLI version out of `hq --version` / `hq version` output.
1145
+ *
1146
+ * Compare CLI to CLI. Never take the first version-shaped token: 5.119.13–
1147
+ * 5.121.0 printed `HQ <core>` above `CLI <cli>`, and scraping the HQ line
1148
+ * made a successful install look like a PATH shadow.
1149
+ *
1150
+ * Accepts:
1151
+ * - bare semver (historical `--version`, and `--version` again after this fix)
1152
+ * - labelled `CLI x.y.z` (those 5.119.13–5.121.0 builds)
1153
+ * - JSON `{ "cli": "x.y.z", ... }` from `--json`
1154
+ */
1155
+ export function parseReportedCliVersion(stdout) {
1156
+ const text = stdout.trim();
1157
+ if (!text)
1158
+ return null;
1159
+ if (text.startsWith("{")) {
1160
+ try {
1161
+ const parsed = JSON.parse(text);
1162
+ if (typeof parsed.cli === "string" && parsed.cli.trim()) {
1163
+ return parsed.cli.trim();
1164
+ }
1165
+ }
1166
+ catch {
1167
+ // Fall through to labelled / bare parsers.
1168
+ }
1169
+ }
1170
+ const labelled = /^[ \t]*CLI[ \t]+(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)/m.exec(text);
1171
+ if (labelled)
1172
+ return labelled[1];
1173
+ const lines = text
1174
+ .split(/\r?\n/)
1175
+ .map((line) => line.trim())
1176
+ .filter(Boolean);
1177
+ if (lines.length === 1)
1178
+ return lines[0];
1179
+ return null;
1180
+ }
710
1181
  /** `<bin> --version` output (trimmed), or null on any failure/timeout. */
711
1182
  export function probeCliVersion(bin) {
712
1183
  try {
@@ -716,8 +1187,7 @@ export function probeCliVersion(bin) {
716
1187
  });
717
1188
  if (result.error || result.status !== 0)
718
1189
  return null;
719
- const out = (result.stdout ?? "").trim();
720
- return out || null;
1190
+ return parseReportedCliVersion(result.stdout ?? "");
721
1191
  }
722
1192
  catch {
723
1193
  return null;
@@ -732,9 +1202,10 @@ export function probeCliVersion(bin) {
732
1202
  * pnpm-global shim at `~/Library/pnpm/bin/hq` shadowing the npm bin dir),
733
1203
  * every updater on the box probes the ghost's version, sees it stale, installs
734
1204
  * into the npm prefix, reports success, and repeats forever — the production
735
- * updater-war this fix exists for. Detect the divergence here, warn ONCE with
736
- * the exact shadowing path, and never retry: no number of retries into the
737
- * same prefix can change what PATH resolves.
1205
+ * updater-war this fix exists for. Detect a stale PATH result here, identify a
1206
+ * distinct package managed by a supported global manager before calling it a
1207
+ * shadow, and never retry: no number of retries into the same prefix can change
1208
+ * what PATH resolves.
738
1209
  *
739
1210
  * Advisory only — resolution failure warns once and continues; nothing in
740
1211
  * here may crash or block the CLI.
@@ -754,12 +1225,6 @@ export function checkUpdateConvergence(targetVersion, deps = {}) {
754
1225
  }
755
1226
  if (reported === targetVersion)
756
1227
  return true; // converged — the normal case
757
- console.error(chalk.yellow(`⚠ hq updated to ${targetVersion} but PATH still resolves ${bin} at version ${reported} — ` +
758
- `a second install is shadowing the managed one. Remove it (e.g. \`pnpm remove -g ${CLI_NAME}\`) ` +
759
- "or the updater will loop forever."));
760
- // The warning above fires for ANY mismatch — something other than the copy
761
- // we just wrote is winning PATH resolution, which is worth saying either
762
- // way. But only a STALE result disproves convergence.
763
1228
  //
764
1229
  // The install runs `@latest`, not `@<targetVersion>`, so it can legitimately
765
1230
  // land a version NEWER than the `latestVersion` the gate was handed: the npm
@@ -774,6 +1239,36 @@ export function checkUpdateConvergence(targetVersion, deps = {}) {
774
1239
  semver.gte(reportedSemver, targetSemver)) {
775
1240
  return true;
776
1241
  }
1242
+ const runningInstall = (deps.currentInstall ?? resolveRunningInstall)();
1243
+ const packageRoot = (deps.packageRootForBin ?? findPackageRootForExecutable)(bin);
1244
+ const manager = packageRoot &&
1245
+ runningInstall.packageRoot &&
1246
+ !samePath(packageRoot, runningInstall.packageRoot)
1247
+ ? globalInstallManagerForPath(bin, packageRoot)
1248
+ : null;
1249
+ let detail;
1250
+ if (manager) {
1251
+ const removeCommand = manager === "pnpm"
1252
+ ? `pnpm remove -g ${CLI_NAME}`
1253
+ : manager === "bun"
1254
+ ? `bun remove -g ${CLI_NAME}`
1255
+ : `npm uninstall -g ${CLI_NAME}`;
1256
+ let realPath = bin;
1257
+ try {
1258
+ realPath = realpathSync(bin);
1259
+ }
1260
+ catch {
1261
+ // Keep the shell-resolved path when a platform shim is not canonicalizable.
1262
+ }
1263
+ detail =
1264
+ `PATH resolves ${realPath} at version ${reported} (manager: ${manager}); ` +
1265
+ `that second hq-cli install is shadowing the managed one. Remove it with \`${removeCommand}\`.`;
1266
+ }
1267
+ else {
1268
+ detail =
1269
+ `PATH resolves ${bin} at version ${reported}, but no second managed hq-cli install was confirmed.`;
1270
+ }
1271
+ console.error(chalk.yellow(`⚠ hq updated to ${targetVersion} but did not converge: ${detail}`));
777
1272
  return false;
778
1273
  }
779
1274
  catch {
@@ -796,9 +1291,13 @@ export function checkUpdateConvergence(targetVersion, deps = {}) {
796
1291
  * Exit codes:
797
1292
  * 0 — update succeeded; user must rerun their command
798
1293
  * 75 — update failed (EX_TEMPFAIL; common for sudo/EACCES on system npm)
1294
+ *
1295
+ * A timed-out updater is the exception: it has been forcibly reaped, so the
1296
+ * gate returns and lets the user's command run on the current version.
799
1297
  */
800
1298
  function enforceUpdateRequired(decision, deps = {}) {
801
- const banner = chalk.red.bold(`✗ hq-cli ${decision.currentVersion} is below the minimum required version (${decision.minVersion}).`);
1299
+ currentVersionGatePhase = "preflight";
1300
+ const banner = chalk.red.bold(`✗ hq-cli ${CLI_VERSION} is below the minimum required version (${decision.minVersion}).`);
802
1301
  console.error(banner);
803
1302
  if (decision.message)
804
1303
  console.error(chalk.dim(` ${decision.message}`));
@@ -824,8 +1323,8 @@ function enforceUpdateRequired(decision, deps = {}) {
824
1323
  // stale dist-tag, a bad cache, a misconfigured pin), reinstalling it on every
825
1324
  // invocation and announcing success each time is strictly worse than saying
826
1325
  // so once.
827
- if (!isNewerVersion(decision.latestVersion, decision.currentVersion)) {
828
- console.error(chalk.red(` Refusing to update: the offered version ${decision.latestVersion} is not newer than the installed ${decision.currentVersion}.`));
1326
+ if (!isNewerVersion(decision.latestVersion, CLI_VERSION)) {
1327
+ console.error(chalk.red(` Refusing to update: the offered version ${decision.latestVersion} is not newer than the running ${CLI_VERSION}.`));
829
1328
  console.error(chalk.dim(" This is a server-side or registry problem, not a local one — reinstalling would loop without ever converging."));
830
1329
  process.exit(75);
831
1330
  }
@@ -848,17 +1347,30 @@ function enforceUpdateRequired(decision, deps = {}) {
848
1347
  console.error(chalk.dim(" Another hq updater is already installing (update lock held); continuing on the current version."));
849
1348
  return;
850
1349
  }
851
- let exitCode;
1350
+ currentVersionGatePhase = "lock_acquired";
1351
+ let attempt;
852
1352
  try {
853
- exitCode = attemptRequiredUpdate(decision, deps, install);
1353
+ attempt = attemptRequiredUpdate(decision, deps, install);
854
1354
  }
855
- finally {
856
- // `process.exit` skips `finally` blocks, so the exit itself lives OUTSIDE
857
- // the lock scope; this `finally` releases on the normal path and on any
858
- // unexpected throw from the install attempt.
1355
+ catch (error) {
859
1356
  lock.release();
1357
+ throw error;
860
1358
  }
861
- process.exit(exitCode);
1359
+ if (attempt instanceof Promise) {
1360
+ return attempt.then((exitCode) => {
1361
+ lock.release();
1362
+ if (exitCode !== "continue")
1363
+ process.exit(exitCode);
1364
+ }, (error) => {
1365
+ lock.release();
1366
+ throw error;
1367
+ });
1368
+ }
1369
+ // `process.exit` skips `finally`, so release explicitly before exiting.
1370
+ lock.release();
1371
+ if (attempt === "continue")
1372
+ return;
1373
+ process.exit(attempt);
862
1374
  }
863
1375
  /**
864
1376
  * The install attempt itself (npm/pnpm/bun routing, stale-partial cleanup,
@@ -870,6 +1382,7 @@ function attemptRequiredUpdate(decision, deps, install) {
870
1382
  const command = decision.updateCommand;
871
1383
  const isManagedOutsideNpm = install.manager !== "npm";
872
1384
  const prefix = install.prefix;
1385
+ const stagedNpmPrefix = Boolean(!isManagedOutsideNpm && prefix && /\s/.test(prefix));
873
1386
  const runner = deps.runner ?? runUpdateCommand;
874
1387
  // Resolve the concrete install argv once so the sudo fallback below can re-run
875
1388
  // the EXACT same command under elevation.
@@ -899,6 +1412,8 @@ function attemptRequiredUpdate(decision, deps, install) {
899
1412
  // npm/bun and when PNPM_HOME is already set.
900
1413
  const updateEnv = pnpmUpdateEnv(install);
901
1414
  let result;
1415
+ let noticeFlush = null;
1416
+ currentVersionGatePhase = "installer_running";
902
1417
  if (isManagedOutsideNpm) {
903
1418
  console.error(chalk.dim(` Detected a ${install.manager}-managed global install; updating with ${install.manager}`));
904
1419
  console.error(chalk.dim(` Running: ${primaryCmd} ${primaryArgs.join(" ")}`));
@@ -906,8 +1421,20 @@ function attemptRequiredUpdate(decision, deps, install) {
906
1421
  }
907
1422
  else if (prefix) {
908
1423
  console.error(chalk.dim(` Installing into npm prefix: ${prefix}`));
909
- console.error(chalk.dim(` Running: npm ${primaryArgs.join(" ")}`));
910
- result = performUpdateCommand("npm", primaryArgs, runner);
1424
+ if (stagedNpmPrefix) {
1425
+ console.error(chalk.dim(" Building in a space-free temporary prefix before activation."));
1426
+ const installStaged = deps.installNpmPackageStaged;
1427
+ if (!installStaged) {
1428
+ result = { ok: false, detail: "staged npm installer was not loaded" };
1429
+ }
1430
+ else {
1431
+ result = installStaged(prefix, LATEST_PACKAGE_SPEC, runner);
1432
+ }
1433
+ }
1434
+ else {
1435
+ console.error(chalk.dim(` Running: npm ${primaryArgs.join(" ")}`));
1436
+ result = performUpdateCommand("npm", primaryArgs, runner);
1437
+ }
911
1438
  }
912
1439
  else {
913
1440
  console.error(chalk.dim(` Running: ${command}`));
@@ -923,7 +1450,7 @@ function attemptRequiredUpdate(decision, deps, install) {
923
1450
  // artifacts and retry the install ONCE. Guarded on `cleaned.length > 0` so a
924
1451
  // plain EACCES on an otherwise-healthy prefix falls straight through to the
925
1452
  // sudo retry below without a redundant reinstall attempt.
926
- if (!result.ok && prefix) {
1453
+ if (!result.ok && result.code !== "ETIMEDOUT" && prefix && !stagedNpmPrefix) {
927
1454
  const cleaner = deps.cleanStale ?? cleanStalePartialInstall;
928
1455
  const cleaned = cleaner(prefix);
929
1456
  if (cleaned.length > 0) {
@@ -943,20 +1470,37 @@ function attemptRequiredUpdate(decision, deps, install) {
943
1470
  // Never for pnpm or Bun: elevation changes the package manager's global home,
944
1471
  // leaving the user's shim untouched while reporting success. A failed
945
1472
  // non-npm update must surface instead.
946
- if (!result.ok && primaryCmd && !isManagedOutsideNpm) {
1473
+ const platform = deps.platform ?? process.platform;
1474
+ if (platform !== "win32" &&
1475
+ !result.ok &&
1476
+ result.code !== "ETIMEDOUT" &&
1477
+ primaryCmd &&
1478
+ !isManagedOutsideNpm &&
1479
+ !stagedNpmPrefix) {
947
1480
  console.error(chalk.dim(` Update failed unprivileged; retrying with: sudo -n ${primaryCmd} ${primaryArgs.join(" ")}`));
948
1481
  const sudoResult = performUpdateCommand("sudo", ["-n", primaryCmd, ...primaryArgs], runner);
949
1482
  if (sudoResult.ok)
950
1483
  result = sudoResult;
951
1484
  }
952
1485
  if (!result.ok) {
1486
+ currentVersionGatePhase = "failed";
953
1487
  console.error(chalk.red(`✗ Update failed${result.detail ? `: ${result.detail}` : ""}.`));
954
- // A root-owned global prefix the running user cannot write is the agent-box
955
- // case: even the `sudo -n` retry above cannot help without passwordless
956
- // sudo, so name the wall plainly rather than leaving `exit 75` to read as a
957
- // generic failure. Only for npm-prefix installs (pnpm/Bun route elsewhere).
958
- if (!isManagedOutsideNpm && prefix && !isPrefixWritable(prefix)) {
1488
+ // If the npm prefix is still unwritable after the unprivileged and sudo
1489
+ // attempts, explain the permission wall plainly instead of leaving exit 75
1490
+ // as a generic failure. Only applies to npm-managed installs.
1491
+ const npmPrefixNotWritable = !isManagedOutsideNpm &&
1492
+ prefix &&
1493
+ install.packageRoot &&
1494
+ !(deps.canWriteNpmInstall ?? ((resolved) => canWriteNpmInstall(resolved.prefix, resolved.packageRoot)))(install);
1495
+ if (npmPrefixNotWritable) {
959
1496
  console.error(chalk.yellow(` ${nonWritablePrefixNote(prefix)}`));
1497
+ noticeFlush = captureNonWritableNpmPrefixNotice({
1498
+ fromVersion: CLI_VERSION,
1499
+ targetVersion: decision.latestVersion,
1500
+ install,
1501
+ env: process.env,
1502
+ homeDir: deps.homeDir,
1503
+ });
960
1504
  }
961
1505
  // The package manager itself is missing from this environment — the usual
962
1506
  // cause is a minimal-PATH parent (launchd, cron, a bare systemd unit) that
@@ -973,25 +1517,37 @@ function attemptRequiredUpdate(decision, deps, install) {
973
1517
  if (isManagedOutsideNpm && result.code === "ENOENT" && command) {
974
1518
  console.error(chalk.dim(` (hq-pro suggests \`${command}\` — that is for npm-managed installs; use it only if you have switched this install to npm.)`));
975
1519
  }
976
- return 75;
1520
+ // The self-update is allowed to fail, but a deadline expiry must not turn
1521
+ // into a second, indefinite denial of the user's command. The supervisor
1522
+ // either reaped the group or recorded why the OS denied that signal; in
1523
+ // neither case did an update land. Continue on the current CLI rather than
1524
+ // pretending it did or aborting the command that caused the gate to run.
1525
+ if (result.code === "ETIMEDOUT") {
1526
+ console.error(chalk.dim(" Continuing on the current hq-cli version."));
1527
+ return "continue";
1528
+ }
1529
+ return noticeFlush ? noticeFlush.then(() => 75) : 75;
977
1530
  }
978
1531
  // Read-your-writes: a "successful" install into the npm prefix does not
979
1532
  // prove the user's PATH resolves it. Verify BEFORE announcing, so a ghost
980
1533
  // install shadowing the copy we just wrote is reported as the failed update
981
1534
  // it is rather than as a success the caller will keep retrying — see
982
1535
  // checkUpdateConvergence.
1536
+ currentVersionGatePhase = "verifying";
983
1537
  const converged = (deps.checkConvergence ?? checkUpdateConvergence)(decision.latestVersion);
984
1538
  if (converged === false) {
1539
+ currentVersionGatePhase = "failed";
985
1540
  console.error(chalk.red(`✗ Update did not take effect: \`hq\` on PATH still resolves a different build than ${decision.latestVersion}.`));
986
1541
  return 75;
987
1542
  }
1543
+ currentVersionGatePhase = "complete";
988
1544
  console.error(chalk.green(`✓ Updated to hq-cli ${decision.latestVersion}. Rerun your command.`));
989
1545
  return 0;
990
1546
  }
991
- export async function enforceVersionGate(onUpdateRecommended) {
1547
+ export async function enforceVersionGate(onUpdateRecommended, options = {}) {
992
1548
  if (isOptedOut())
993
1549
  return "continue";
994
- const decision = await fetchVersionDecision();
1550
+ const decision = await fetchVersionDecision(options.timeoutMs);
995
1551
  if (!decision)
996
1552
  return "continue"; // best-effort: silent on any failure
997
1553
  if (!decision.updateRequired && !decision.updateRecommended)
@@ -1000,9 +1556,18 @@ export async function enforceVersionGate(onUpdateRecommended) {
1000
1556
  // neither downstream path repeats it.
1001
1557
  const install = resolveRunningInstall();
1002
1558
  if (decision.updateRequired) {
1559
+ // Load the staged installer only for the uncommon spaced npm-prefix path.
1560
+ // The version gate is imported during every CLI startup, including native
1561
+ // fast routes, so eagerly importing this filesystem-heavy module adds cost
1562
+ // to commands that never update.
1563
+ const installNpmPackageStaged = install.manager === "npm" && install.prefix && /\s/.test(install.prefix)
1564
+ ? (await import("./staged-npm-install.js")).installNpmPackageStaged
1565
+ : undefined;
1003
1566
  // Exits the process, EXCEPT when another updater holds the shared update
1004
1567
  // lock — then it returns and the CLI continues on the current version.
1005
- enforceUpdateRequired(decision, { resolveInstall: () => install });
1568
+ const requiredUpdate = enforceUpdateRequired(decision, { resolveInstall: () => install, installNpmPackageStaged });
1569
+ if (requiredUpdate)
1570
+ await requiredUpdate;
1006
1571
  return "continue";
1007
1572
  }
1008
1573
  if (decision.updateRecommended) {
@@ -1023,11 +1588,18 @@ export async function enforceVersionGate(onUpdateRecommended) {
1023
1588
  * force-upgraded.
1024
1589
  */
1025
1590
  export function shouldSkipGate(argv) {
1026
- return argv.some((a) => a === "--version" || a === "-V" || a === "-v" || a === "--help" || a === "-h");
1591
+ return argv.some((a) => a === "--version" ||
1592
+ a === "-V" ||
1593
+ a === "-v" ||
1594
+ a === "--help" ||
1595
+ a === "-h" ||
1596
+ a === "version");
1027
1597
  }
1028
1598
  export const __test__ = {
1029
1599
  CLIENT_ID,
1600
+ getVersionGatePhase,
1030
1601
  CONVERGENCE_TIMEOUT_MS,
1602
+ DEFAULT_UPDATE_TIMEOUT_MS,
1031
1603
  ENDPOINT_PATH,
1032
1604
  FETCH_TIMEOUT_MS,
1033
1605
  checkUpdateConvergence,
@@ -1037,6 +1609,8 @@ export const __test__ = {
1037
1609
  buildPnpmInstallArgv,
1038
1610
  buildPrefixedInstallArgv,
1039
1611
  buildSpawnPlan,
1612
+ canWriteNpmInstall,
1613
+ claimNonWritableNpmPrefixNotice,
1040
1614
  cleanStalePartialInstall,
1041
1615
  derivePnpmHome,
1042
1616
  enforceUpdateRequired,
@@ -1058,5 +1632,6 @@ export const __test__ = {
1058
1632
  resolveRunningInstall,
1059
1633
  resolveRunningManager,
1060
1634
  resolveRunningPrefix,
1635
+ updateTimeoutMs,
1061
1636
  };
1062
1637
  //# sourceMappingURL=version-gate.js.map