@indigoai-us/hq-cli 5.314.0 → 5.316.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1193) hide show
  1. package/CHANGELOG.md +4320 -1
  2. package/README.md +113 -0
  3. package/assets/bot-workers/setup/context/USER-GUIDE.md +404 -0
  4. package/assets/bot-workers/setup/context/quick-reference.md +199 -0
  5. package/assets/bot-workers/setup/skills/agents-and-team.md +167 -0
  6. package/assets/bot-workers/setup/skills/explain-hq.md +35 -0
  7. package/assets/bot-workers/setup/skills/first-company.md +74 -0
  8. package/assets/bot-workers/setup/skills/joining-a-team.md +125 -0
  9. package/assets/bot-workers/setup/skills/pricing.md +92 -0
  10. package/assets/bot-workers/setup/skills/standing-help.md +81 -0
  11. package/assets/bot-workers/setup/skills/your-business.md +281 -0
  12. package/assets/bot-workers/setup/worker.yaml +791 -0
  13. package/assets/lanes-hooks/hq-lanes-drain.json +15 -0
  14. package/assets/lanes-hooks/hq-lanes-drain.mjs +275 -0
  15. package/assets/lanes-hooks/hq-lanes-drain.sh +21 -0
  16. package/assets/lanes-reconcile/hq-lanes-reconcile.service +11 -0
  17. package/assets/lanes-reconcile/hq-lanes-reconcile.timer +12 -0
  18. package/assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh +485 -0
  19. package/assets/scaffold/core/scripts/audit-log.sh +384 -0
  20. package/assets/scaffold/core/scripts/checkpoint-stop-gate.sh +281 -43
  21. package/assets/scaffold/core/scripts/clean-worktree-reconcile-handoff.sh +171 -0
  22. package/assets/scaffold/core/scripts/detect-stale-review-base.sh +199 -0
  23. package/assets/scaffold/core/scripts/eval-trigger.sh +193 -0
  24. package/assets/scaffold/core/scripts/git-pack-extension-check.sh +164 -0
  25. package/assets/scaffold/core/scripts/handoff-finalize.sh +688 -0
  26. package/assets/scaffold/core/scripts/handoff-open-steps.sh +81 -0
  27. package/assets/scaffold/core/scripts/handoff-post.sh +252 -0
  28. package/assets/scaffold/core/scripts/hook-lib.sh +345 -50
  29. package/assets/scaffold/core/scripts/hq-delegate-bundle.sh +307 -0
  30. package/assets/scaffold/core/scripts/hq-delegate-grant.sh +252 -0
  31. package/assets/scaffold/core/scripts/hq-delegate-pickup.sh +99 -0
  32. package/assets/scaffold/core/scripts/hq-delegate-publish.sh +91 -0
  33. package/assets/scaffold/core/scripts/hq-delegate-repo.sh +158 -0
  34. package/assets/scaffold/core/scripts/hq-delegate-resolve.sh +145 -0
  35. package/assets/scaffold/core/scripts/hq-delegate-secrets.sh +129 -0
  36. package/assets/scaffold/core/scripts/hq-delegate-send.sh +259 -0
  37. package/assets/scaffold/core/scripts/hq-delegate-transfer.sh +175 -0
  38. package/assets/scaffold/core/scripts/hq-delegate-verify.sh +238 -0
  39. package/assets/scaffold/core/scripts/hq-dm-bind.sh +585 -0
  40. package/assets/scaffold/core/scripts/hq-job-notify.sh +389 -0
  41. package/assets/scaffold/core/scripts/hq-job-probe.sh +835 -0
  42. package/assets/scaffold/core/scripts/hq-job-remediate.sh +359 -0
  43. package/assets/scaffold/core/scripts/hq-job-run.sh +1025 -0
  44. package/assets/scaffold/core/scripts/hq-pin.sh +118 -0
  45. package/assets/scaffold/core/scripts/hq-session.sh +184 -23
  46. package/assets/scaffold/core/scripts/jobs-schedule-parse.sh +310 -0
  47. package/assets/scaffold/core/scripts/jobs-validate.sh +451 -0
  48. package/assets/scaffold/core/scripts/knowledge-prefs.sh +55 -0
  49. package/assets/scaffold/core/scripts/lib/portable.sh +211 -0
  50. package/assets/scaffold/core/scripts/lib/secret-patterns.sh +58 -0
  51. package/assets/scaffold/core/scripts/lib/session-id.sh +3 -2
  52. package/assets/scaffold/core/scripts/lib/session-scope-capability.sh +1 -1
  53. package/assets/scaffold/core/scripts/lib/work-mesh-enqueue.sh +2 -1
  54. package/assets/scaffold/core/scripts/lib/work-mesh-live-hook.sh +378 -0
  55. package/assets/scaffold/core/scripts/lib/work-mesh-live-rebind.sh +141 -0
  56. package/assets/scaffold/core/scripts/migrate-policy-triggers.sh +378 -0
  57. package/assets/scaffold/core/scripts/ontology-audience-grant.sh +81 -0
  58. package/assets/scaffold/core/scripts/ontology-brief.mjs +93 -0
  59. package/assets/scaffold/core/scripts/ontology-candidate.sh +100 -0
  60. package/assets/scaffold/core/scripts/ontology-garden.mjs +238 -0
  61. package/assets/scaffold/core/scripts/ontology-source-worklist.sh +79 -0
  62. package/assets/scaffold/core/scripts/outpost-jobs-reconcile.sh +834 -0
  63. package/assets/scaffold/core/scripts/policy-age-report.sh +156 -0
  64. package/assets/scaffold/core/scripts/policy-retire.sh +199 -0
  65. package/assets/scaffold/core/scripts/qmd-reindex-after-sync.sh +10 -87
  66. package/assets/scaffold/core/scripts/qmd-reindex-bg.sh +40 -0
  67. package/assets/scaffold/core/scripts/read-policy-frontmatter.sh +32 -0
  68. package/assets/scaffold/core/scripts/rebuild-company-knowledge-index.sh +36 -3
  69. package/assets/scaffold/core/scripts/rebuild-projects-index.sh +99 -12
  70. package/assets/scaffold/core/scripts/refresh-vault-access.sh +188 -0
  71. package/assets/scaffold/core/scripts/register-project.sh +262 -0
  72. package/assets/scaffold/core/scripts/repo-run-registry.sh +408 -0
  73. package/assets/scaffold/core/scripts/resolve-company.sh +199 -0
  74. package/assets/scaffold/core/scripts/resume-thread-lock.sh +285 -0
  75. package/assets/scaffold/core/scripts/share-suggestion-state.sh +541 -0
  76. package/assets/scaffold/core/scripts/source-yaml-validate.sh +36 -0
  77. package/assets/scaffold/core/scripts/token-usage-report.sh +81 -20
  78. package/assets/scaffold/core/scripts/verify-story-deliverables.sh +148 -0
  79. package/assets/scaffold/core/scripts/work-mesh-live-bind-trusted.sh +152 -0
  80. package/assets/scaffold/core/scripts/work-mesh-live-rebind.sh +59 -0
  81. package/assets/scaffold/core/scripts/worktree-gc.sh +362 -0
  82. package/contracts/preflight/v1/fixtures.json +87 -0
  83. package/contracts/preflight/v1/schema.json +58 -0
  84. package/dist/bin/hq-auth-refresh.d.ts +2 -0
  85. package/dist/bin/hq-auth-refresh.js +12 -6
  86. package/dist/command-catalog.generated.d.ts +10798 -0
  87. package/dist/command-catalog.generated.js +13915 -0
  88. package/dist/command-registration-plan.d.ts +474 -0
  89. package/dist/command-registration-plan.js +136 -0
  90. package/dist/commands/__fixtures__/access-vault.d.ts +2 -0
  91. package/dist/commands/__fixtures__/access-vault.js +1 -1
  92. package/dist/commands/_patterns.d.ts +16 -0
  93. package/dist/commands/_patterns.js +20 -3
  94. package/dist/commands/access.d.ts +2 -1
  95. package/dist/commands/access.js +58 -49
  96. package/dist/commands/agent-enroll.d.ts +146 -0
  97. package/dist/commands/agent-enroll.js +401 -0
  98. package/dist/commands/agent-inbox.d.ts +9 -0
  99. package/dist/commands/agent-inbox.js +102 -0
  100. package/dist/commands/agent-kit.d.ts +87 -0
  101. package/dist/commands/agent-kit.js +480 -0
  102. package/dist/commands/agent-mcp.d.ts +24 -0
  103. package/dist/commands/agent-mcp.js +127 -0
  104. package/dist/commands/agent-probe.d.ts +77 -0
  105. package/dist/commands/agent-probe.js +335 -0
  106. package/dist/commands/agent.d.ts +13 -0
  107. package/dist/commands/agent.js +40 -0
  108. package/dist/commands/agents.d.ts +106 -4
  109. package/dist/commands/agents.js +924 -45
  110. package/dist/commands/auth.d.ts +1 -0
  111. package/dist/commands/auth.js +189 -19
  112. package/dist/commands/billing-sponsor.d.ts +83 -0
  113. package/dist/commands/billing-sponsor.js +344 -0
  114. package/dist/commands/billing.d.ts +3 -0
  115. package/dist/commands/billing.js +6 -1
  116. package/dist/commands/bot-companies.d.ts +40 -0
  117. package/dist/commands/bot-companies.js +64 -0
  118. package/dist/commands/bot-continuity.d.ts +28 -0
  119. package/dist/commands/bot-continuity.js +68 -0
  120. package/dist/commands/bot-jobs.d.ts +131 -0
  121. package/dist/commands/bot-jobs.js +474 -0
  122. package/dist/commands/bot.d.ts +278 -0
  123. package/dist/commands/bot.js +1982 -0
  124. package/dist/commands/channels.js +56 -1
  125. package/dist/commands/cloud-demote.js +3 -2
  126. package/dist/commands/cloud-provision.d.ts +14 -0
  127. package/dist/commands/cloud-provision.js +232 -58
  128. package/dist/commands/cloud-retire.d.ts +51 -0
  129. package/dist/commands/cloud-retire.js +154 -0
  130. package/dist/commands/cloud.d.ts +49 -15
  131. package/dist/commands/cloud.js +357 -122
  132. package/dist/commands/company-rename-flag.d.ts +4 -0
  133. package/dist/commands/company-rename-flag.js +7 -0
  134. package/dist/commands/company-rename.d.ts +4 -0
  135. package/dist/commands/company-rename.js +90 -0
  136. package/dist/commands/company-transfer.d.ts +4 -28
  137. package/dist/commands/company-transfer.js +5 -49
  138. package/dist/commands/company.js +68 -3
  139. package/dist/commands/core-audit-log-native.d.ts +9 -0
  140. package/dist/commands/core-audit-log-native.js +257 -0
  141. package/dist/commands/core-checkpoint-gate-setting.d.ts +59 -0
  142. package/dist/commands/core-checkpoint-gate-setting.js +163 -0
  143. package/dist/commands/core-checkpoint-stop-gate-native.d.ts +34 -0
  144. package/dist/commands/core-checkpoint-stop-gate-native.js +725 -0
  145. package/dist/commands/core-checkpoint.d.ts +19 -9
  146. package/dist/commands/core-checkpoint.js +301 -37
  147. package/dist/commands/core-command-catalog.d.ts +34 -0
  148. package/dist/commands/core-command-catalog.js +62 -0
  149. package/dist/commands/core-company-index-scope-flag.d.ts +3 -0
  150. package/dist/commands/core-company-index-scope-flag.js +6 -0
  151. package/dist/commands/core-delegate-w1b.d.ts +10 -0
  152. package/dist/commands/core-delegate-w1b.js +1219 -0
  153. package/dist/commands/core-delegate.d.ts +46 -0
  154. package/dist/commands/core-delegate.js +1040 -0
  155. package/dist/commands/core-detect-stale-review-base-native.d.ts +23 -0
  156. package/dist/commands/core-detect-stale-review-base-native.js +178 -0
  157. package/dist/commands/core-dm-bind-native.d.ts +32 -0
  158. package/dist/commands/core-dm-bind-native.js +668 -0
  159. package/dist/commands/core-eval-trigger-native.d.ts +4 -0
  160. package/dist/commands/core-eval-trigger-native.js +12 -0
  161. package/dist/commands/core-git-pack-extension-check-native.d.ts +22 -0
  162. package/dist/commands/core-git-pack-extension-check-native.js +190 -0
  163. package/dist/commands/core-handoff-fast.d.ts +18 -0
  164. package/dist/commands/core-handoff-fast.js +104 -0
  165. package/dist/commands/core-handoff-open-steps.d.ts +21 -0
  166. package/dist/commands/core-handoff-open-steps.js +264 -0
  167. package/dist/commands/core-handoff.d.ts +24 -0
  168. package/dist/commands/core-handoff.js +1144 -0
  169. package/dist/commands/core-hook-state-helpers-native.d.ts +11 -0
  170. package/dist/commands/core-hook-state-helpers-native.js +74 -0
  171. package/dist/commands/core-hq-session-native.d.ts +39 -0
  172. package/dist/commands/core-hq-session-native.js +579 -0
  173. package/dist/commands/core-job-native-utils.d.ts +6 -0
  174. package/dist/commands/core-job-native-utils.js +80 -0
  175. package/dist/commands/core-job-native.d.ts +5 -0
  176. package/dist/commands/core-job-native.js +16 -0
  177. package/dist/commands/core-job-notify-native.d.ts +36 -0
  178. package/dist/commands/core-job-notify-native.js +359 -0
  179. package/dist/commands/core-job-probe-native.d.ts +45 -0
  180. package/dist/commands/core-job-probe-native.js +564 -0
  181. package/dist/commands/core-job-remediate-native.d.ts +26 -0
  182. package/dist/commands/core-job-remediate-native.js +374 -0
  183. package/dist/commands/core-job-remote-launcher.d.ts +7 -0
  184. package/dist/commands/core-job-remote-launcher.js +51 -0
  185. package/dist/commands/core-job-run-native.d.ts +47 -0
  186. package/dist/commands/core-job-run-native.js +1215 -0
  187. package/dist/commands/core-jobs-native.d.ts +25 -0
  188. package/dist/commands/core-jobs-native.js +1339 -0
  189. package/dist/commands/core-knowledge-prefs.d.ts +11 -0
  190. package/dist/commands/core-knowledge-prefs.js +137 -0
  191. package/dist/commands/core-migrate-policy-triggers-native.d.ts +21 -0
  192. package/dist/commands/core-migrate-policy-triggers-native.js +374 -0
  193. package/dist/commands/core-native-handoff-flag.d.ts +4 -0
  194. package/dist/commands/core-native-handoff-flag.js +7 -0
  195. package/dist/commands/core-native-hook-helper-commands.d.ts +4 -0
  196. package/dist/commands/core-native-hook-helper-commands.js +56 -0
  197. package/dist/commands/core-native-hook-helpers-flag.d.ts +4 -0
  198. package/dist/commands/core-native-hook-helpers-flag.js +7 -0
  199. package/dist/commands/core-native-jobs-flag.d.ts +4 -0
  200. package/dist/commands/core-native-jobs-flag.js +7 -0
  201. package/dist/commands/core-native-policy-flag.d.ts +9 -0
  202. package/dist/commands/core-native-policy-flag.js +12 -0
  203. package/dist/commands/core-native-session-flag.d.ts +4 -0
  204. package/dist/commands/core-native-session-flag.js +7 -0
  205. package/dist/commands/core-native-utilities-flag.d.ts +4 -0
  206. package/dist/commands/core-native-utilities-flag.js +7 -0
  207. package/dist/commands/core-native-utilities.d.ts +29 -0
  208. package/dist/commands/core-native-utilities.js +54 -0
  209. package/dist/commands/core-native-worker-skills-flag.d.ts +4 -0
  210. package/dist/commands/core-native-worker-skills-flag.js +7 -0
  211. package/dist/commands/core-ontology-native.d.ts +17 -0
  212. package/dist/commands/core-ontology-native.js +916 -0
  213. package/dist/commands/core-ontology.d.ts +66 -0
  214. package/dist/commands/core-ontology.js +430 -0
  215. package/dist/commands/core-pin-native.d.ts +14 -0
  216. package/dist/commands/core-pin-native.js +236 -0
  217. package/dist/commands/core-policy-frontmatter.d.ts +8 -0
  218. package/dist/commands/core-policy-frontmatter.js +52 -0
  219. package/dist/commands/core-policy.d.ts +14 -0
  220. package/dist/commands/core-policy.js +1018 -0
  221. package/dist/commands/core-refresh-vault-access-native.d.ts +20 -0
  222. package/dist/commands/core-refresh-vault-access-native.js +229 -0
  223. package/dist/commands/core-register-project-native.d.ts +30 -0
  224. package/dist/commands/core-register-project-native.js +347 -0
  225. package/dist/commands/core-repo-run-registry-native.d.ts +19 -0
  226. package/dist/commands/core-repo-run-registry-native.js +357 -0
  227. package/dist/commands/core-resolve-company-command.d.ts +4 -0
  228. package/dist/commands/core-resolve-company-command.js +42 -0
  229. package/dist/commands/core-resolve-company-native.d.ts +28 -0
  230. package/dist/commands/core-resolve-company-native.js +408 -0
  231. package/dist/commands/core-share-suggestion-state-native.d.ts +18 -0
  232. package/dist/commands/core-share-suggestion-state-native.js +445 -0
  233. package/dist/commands/core-work-mesh-bind-trusted-native.d.ts +32 -0
  234. package/dist/commands/core-work-mesh-bind-trusted-native.js +190 -0
  235. package/dist/commands/core-work-mesh-live-rebind-native.d.ts +18 -0
  236. package/dist/commands/core-work-mesh-live-rebind-native.js +262 -0
  237. package/dist/commands/core-worker-lint-native.d.ts +4 -0
  238. package/dist/commands/core-worker-lint-native.js +160 -0
  239. package/dist/commands/core-worker-share-native.d.ts +4 -0
  240. package/dist/commands/core-worker-share-native.js +260 -0
  241. package/dist/commands/core-worker-skills-command.d.ts +8 -0
  242. package/dist/commands/core-worker-skills-command.js +33 -0
  243. package/dist/commands/core-worker-skills-runtime.d.ts +33 -0
  244. package/dist/commands/core-worker-skills-runtime.js +86 -0
  245. package/dist/commands/core.d.ts +4 -0
  246. package/dist/commands/core.js +282 -80
  247. package/dist/commands/crm.js +52 -3
  248. package/dist/commands/daemon.d.ts +63 -0
  249. package/dist/commands/daemon.js +877 -0
  250. package/dist/commands/db-provision.js +4 -4
  251. package/dist/commands/db-sql.js +7 -21
  252. package/dist/commands/deploy-comments.d.ts +3 -0
  253. package/dist/commands/deploy-comments.js +162 -0
  254. package/dist/commands/dm.d.ts +119 -12
  255. package/dist/commands/dm.js +388 -38
  256. package/dist/commands/doctor.d.ts +12 -0
  257. package/dist/commands/doctor.js +158 -12
  258. package/dist/commands/feedback.d.ts +6 -0
  259. package/dist/commands/feedback.js +86 -37
  260. package/dist/commands/files-browse.d.ts +32 -12
  261. package/dist/commands/files-browse.js +176 -60
  262. package/dist/commands/files.d.ts +17 -0
  263. package/dist/commands/files.js +300 -47
  264. package/dist/commands/group-grants.js +3 -2
  265. package/dist/commands/groups.js +6 -5
  266. package/dist/commands/index-cmd.d.ts +19 -1
  267. package/dist/commands/index-cmd.js +74 -7
  268. package/dist/commands/integrations-api.d.ts +15 -10
  269. package/dist/commands/integrations-api.js +27 -22
  270. package/dist/commands/integrations-connect.d.ts +51 -13
  271. package/dist/commands/integrations-connect.js +86 -71
  272. package/dist/commands/integrations-core.d.ts +6 -6
  273. package/dist/commands/integrations-core.js +25 -11
  274. package/dist/commands/integrations-import.d.ts +1 -1
  275. package/dist/commands/integrations-import.js +43 -24
  276. package/dist/commands/integrations-manage.js +20 -13
  277. package/dist/commands/integrations.d.ts +8 -0
  278. package/dist/commands/integrations.js +94 -7
  279. package/dist/commands/lanes-accounts.d.ts +28 -0
  280. package/dist/commands/lanes-accounts.js +595 -0
  281. package/dist/commands/lanes-autopilot.d.ts +11 -0
  282. package/dist/commands/lanes-autopilot.js +336 -0
  283. package/dist/commands/lanes-checks.d.ts +51 -0
  284. package/dist/commands/lanes-checks.js +941 -0
  285. package/dist/commands/lanes-hold.d.ts +43 -0
  286. package/dist/commands/lanes-hold.js +655 -0
  287. package/dist/commands/lanes-keep-alive-audit.d.ts +10 -0
  288. package/dist/commands/lanes-keep-alive-audit.js +19 -0
  289. package/dist/commands/lanes-kpis.d.ts +11 -0
  290. package/dist/commands/lanes-kpis.js +34 -0
  291. package/dist/commands/lanes-message.d.ts +9 -0
  292. package/dist/commands/lanes-message.js +946 -0
  293. package/dist/commands/lanes-move.d.ts +12 -0
  294. package/dist/commands/lanes-move.js +397 -0
  295. package/dist/commands/lanes-questions.d.ts +36 -0
  296. package/dist/commands/lanes-questions.js +1005 -0
  297. package/dist/commands/lanes-report.d.ts +11 -0
  298. package/dist/commands/lanes-report.js +333 -0
  299. package/dist/commands/lanes-resume.d.ts +6 -0
  300. package/dist/commands/lanes-resume.js +564 -0
  301. package/dist/commands/lanes-review.d.ts +10 -0
  302. package/dist/commands/lanes-review.js +56 -0
  303. package/dist/commands/lanes-shared.d.ts +449 -0
  304. package/dist/commands/lanes-shared.js +170 -0
  305. package/dist/commands/lanes-stories.d.ts +15 -0
  306. package/dist/commands/lanes-stories.js +347 -0
  307. package/dist/commands/lanes-watch.d.ts +7 -0
  308. package/dist/commands/lanes-watch.js +216 -0
  309. package/dist/commands/lanes.d.ts +149 -0
  310. package/dist/commands/lanes.js +9013 -0
  311. package/dist/commands/login.js +49 -6
  312. package/dist/commands/mcp-registration.d.ts +32 -25
  313. package/dist/commands/mcp-registration.js +256 -23
  314. package/dist/commands/mcp-status.js +1 -0
  315. package/dist/commands/meetings.js +55 -34
  316. package/dist/commands/members.js +5 -1
  317. package/dist/commands/mesh.d.ts +11 -0
  318. package/dist/commands/mesh.js +1086 -76
  319. package/dist/commands/monitor.d.ts +58 -0
  320. package/dist/commands/monitor.js +980 -0
  321. package/dist/commands/onboard-bot-membership.d.ts +32 -0
  322. package/dist/commands/onboard-bot-membership.js +40 -0
  323. package/dist/commands/onboard-create-identity.d.ts +26 -0
  324. package/dist/commands/onboard-create-identity.js +23 -0
  325. package/dist/commands/onboard-identity-guard.d.ts +1 -1
  326. package/dist/commands/onboard.js +24 -5
  327. package/dist/commands/outpost-pruner.d.ts +3 -0
  328. package/dist/commands/outpost-pruner.js +125 -0
  329. package/dist/commands/pack-install.js +3 -1
  330. package/dist/commands/packs.js +11 -1
  331. package/dist/commands/people.d.ts +4 -0
  332. package/dist/commands/people.js +37 -3
  333. package/dist/commands/personal-connector-settings-flag.d.ts +4 -0
  334. package/dist/commands/personal-connector-settings-flag.js +7 -0
  335. package/dist/commands/personal-targeted-push-flag.d.ts +4 -0
  336. package/dist/commands/personal-targeted-push-flag.js +7 -0
  337. package/dist/commands/personal-targeted-push-paths.d.ts +3 -0
  338. package/dist/commands/personal-targeted-push-paths.js +67 -0
  339. package/dist/commands/publish.d.ts +8 -1
  340. package/dist/commands/publish.js +17 -4
  341. package/dist/commands/reindex.js +56 -6
  342. package/dist/commands/report.d.ts +19 -0
  343. package/dist/commands/report.js +537 -0
  344. package/dist/commands/rescue.d.ts +4 -0
  345. package/dist/commands/rescue.js +27 -17
  346. package/dist/commands/run-feature-telemetry.d.ts +3 -0
  347. package/dist/commands/run-feature-telemetry.js +6 -0
  348. package/dist/commands/run.js +18 -4
  349. package/dist/commands/safe-extract.d.ts +11 -2
  350. package/dist/commands/safe-extract.js +36 -8
  351. package/dist/commands/secrets.d.ts +20 -2
  352. package/dist/commands/secrets.js +175 -71
  353. package/dist/commands/skill.d.ts +35 -4
  354. package/dist/commands/skill.js +357 -18
  355. package/dist/commands/staff/reset-test-account.d.ts +110 -0
  356. package/dist/commands/staff/reset-test-account.js +268 -0
  357. package/dist/commands/staff/test-account.d.ts +51 -0
  358. package/dist/commands/staff/test-account.js +196 -0
  359. package/dist/commands/sync-mode.d.ts +11 -0
  360. package/dist/commands/sync-mode.js +30 -0
  361. package/dist/commands/sync-narrow.js +36 -5
  362. package/dist/commands/team-sync.js +71 -10
  363. package/dist/commands/update.js +6 -0
  364. package/dist/commands/vault-retention-flag.d.ts +3 -0
  365. package/dist/commands/vault-retention-flag.js +9 -0
  366. package/dist/commands/vault-retention.d.ts +11 -0
  367. package/dist/commands/vault-retention.js +69 -0
  368. package/dist/commands/version.d.ts +10 -0
  369. package/dist/commands/version.js +11 -0
  370. package/dist/commands/whoami.d.ts +22 -0
  371. package/dist/commands/whoami.js +137 -4
  372. package/dist/commands/workers.d.ts +2 -14
  373. package/dist/commands/workers.js +7 -10
  374. package/dist/fast-core.d.ts +7 -7
  375. package/dist/fast-core.js +91 -24
  376. package/dist/fast-scaffold.d.ts +86 -0
  377. package/dist/fast-scaffold.js +381 -0
  378. package/dist/index.d.ts +3 -4
  379. package/dist/index.js +59 -9
  380. package/dist/lanes-drain-hook.d.ts +14 -0
  381. package/dist/lanes-drain-hook.js +203 -0
  382. package/dist/lazy-commands.d.ts +20 -44
  383. package/dist/lazy-commands.js +60 -58
  384. package/dist/lib/agent-kit/adopt-identity.d.ts +27 -0
  385. package/dist/lib/agent-kit/adopt-identity.js +60 -0
  386. package/dist/lib/agent-kit/attachment-download.d.ts +24 -0
  387. package/dist/lib/agent-kit/attachment-download.js +47 -0
  388. package/dist/lib/agent-kit/creds.d.ts +106 -0
  389. package/dist/lib/agent-kit/creds.js +163 -0
  390. package/dist/lib/agent-kit/fallback.d.ts +78 -0
  391. package/dist/lib/agent-kit/fallback.js +210 -0
  392. package/dist/lib/agent-kit/inbox-state.d.ts +83 -0
  393. package/dist/lib/agent-kit/inbox-state.js +159 -0
  394. package/dist/lib/agent-kit/kit-config.d.ts +56 -0
  395. package/dist/lib/agent-kit/kit-config.js +65 -0
  396. package/dist/lib/agent-kit/log.d.ts +16 -0
  397. package/dist/lib/agent-kit/log.js +46 -0
  398. package/dist/lib/agent-kit/mcp/attachments.d.ts +126 -0
  399. package/dist/lib/agent-kit/mcp/attachments.js +222 -0
  400. package/dist/lib/agent-kit/mcp/jsonrpc.d.ts +75 -0
  401. package/dist/lib/agent-kit/mcp/jsonrpc.js +164 -0
  402. package/dist/lib/agent-kit/mcp/tools.d.ts +64 -0
  403. package/dist/lib/agent-kit/mcp/tools.js +397 -0
  404. package/dist/lib/agent-kit/paths.d.ts +65 -0
  405. package/dist/lib/agent-kit/paths.js +118 -0
  406. package/dist/lib/agent-kit/private-file.d.ts +29 -0
  407. package/dist/lib/agent-kit/private-file.js +91 -0
  408. package/dist/lib/agent-kit/run/heartbeat.d.ts +72 -0
  409. package/dist/lib/agent-kit/run/heartbeat.js +128 -0
  410. package/dist/lib/agent-kit/run/inbox.d.ts +76 -0
  411. package/dist/lib/agent-kit/run/inbox.js +205 -0
  412. package/dist/lib/agent-kit/run/supervisor.d.ts +35 -0
  413. package/dist/lib/agent-kit/run/supervisor.js +85 -0
  414. package/dist/lib/agent-kit/run/sync.d.ts +33 -0
  415. package/dist/lib/agent-kit/run/sync.js +58 -0
  416. package/dist/lib/agent-kit/services.d.ts +31 -0
  417. package/dist/lib/agent-kit/services.js +55 -0
  418. package/dist/lib/agent-kit/skills.d.ts +18 -0
  419. package/dist/lib/agent-kit/skills.js +151 -0
  420. package/dist/lib/agent-kit/wake.d.ts +83 -0
  421. package/dist/lib/agent-kit/wake.js +243 -0
  422. package/dist/lib/agents/model-catalog.d.ts +62 -0
  423. package/dist/lib/agents/model-catalog.js +275 -0
  424. package/dist/lib/auth-login-provider-state.d.ts +8 -0
  425. package/dist/lib/auth-login-provider-state.js +63 -0
  426. package/dist/lib/aws-sdk-node-warning-output.d.ts +12 -0
  427. package/dist/lib/aws-sdk-node-warning-output.js +22 -0
  428. package/dist/lib/billing/free-month.d.ts +18 -0
  429. package/dist/lib/billing/free-month.js +31 -0
  430. package/dist/lib/billing/plan-limit-refusals.d.ts +69 -0
  431. package/dist/lib/billing/plan-limit-refusals.js +187 -0
  432. package/dist/lib/billing/plan-limit-upgrade-url.d.ts +11 -0
  433. package/dist/lib/billing/plan-limit-upgrade-url.js +66 -0
  434. package/dist/lib/billing/plan-lock.d.ts +143 -0
  435. package/dist/lib/billing/plan-lock.js +439 -0
  436. package/dist/lib/bot/api.d.ts +349 -0
  437. package/dist/lib/bot/api.js +316 -0
  438. package/dist/lib/bot/attachments.d.ts +45 -0
  439. package/dist/lib/bot/attachments.js +89 -0
  440. package/dist/lib/bot/cli-update.d.ts +138 -0
  441. package/dist/lib/bot/cli-update.js +278 -0
  442. package/dist/lib/bot/company-bind.d.ts +27 -0
  443. package/dist/lib/bot/company-bind.js +62 -0
  444. package/dist/lib/bot/config.d.ts +153 -0
  445. package/dist/lib/bot/config.js +233 -0
  446. package/dist/lib/bot/continuity-download.d.ts +28 -0
  447. package/dist/lib/bot/continuity-download.js +75 -0
  448. package/dist/lib/bot/continuity-install.d.ts +14 -0
  449. package/dist/lib/bot/continuity-install.js +101 -0
  450. package/dist/lib/bot/continuity.d.ts +67 -0
  451. package/dist/lib/bot/continuity.js +301 -0
  452. package/dist/lib/bot/creds.d.ts +24 -0
  453. package/dist/lib/bot/creds.js +51 -0
  454. package/dist/lib/bot/daemon.d.ts +173 -0
  455. package/dist/lib/bot/daemon.js +552 -0
  456. package/dist/lib/bot/inbox-poll-backoff-flag.d.ts +24 -0
  457. package/dist/lib/bot/inbox-poll-backoff-flag.js +135 -0
  458. package/dist/lib/bot/inbox-state.d.ts +18 -0
  459. package/dist/lib/bot/inbox-state.js +51 -0
  460. package/dist/lib/bot/index.d.ts +23 -0
  461. package/dist/lib/bot/index.js +23 -0
  462. package/dist/lib/bot/inflight.d.ts +119 -0
  463. package/dist/lib/bot/inflight.js +83 -0
  464. package/dist/lib/bot/job-completions.d.ts +89 -0
  465. package/dist/lib/bot/job-completions.js +132 -0
  466. package/dist/lib/bot/job-quiet-flag.d.ts +4 -0
  467. package/dist/lib/bot/job-quiet-flag.js +14 -0
  468. package/dist/lib/bot/job-run.d.ts +114 -0
  469. package/dist/lib/bot/job-run.js +266 -0
  470. package/dist/lib/bot/local-config.d.ts +61 -0
  471. package/dist/lib/bot/local-config.js +145 -0
  472. package/dist/lib/bot/local-jobs.d.ts +89 -0
  473. package/dist/lib/bot/local-jobs.js +459 -0
  474. package/dist/lib/bot/local-name.d.ts +54 -0
  475. package/dist/lib/bot/local-name.js +114 -0
  476. package/dist/lib/bot/log.d.ts +13 -0
  477. package/dist/lib/bot/log.js +59 -0
  478. package/dist/lib/bot/owner-context.d.ts +79 -0
  479. package/dist/lib/bot/owner-context.js +175 -0
  480. package/dist/lib/bot/paths.d.ts +76 -0
  481. package/dist/lib/bot/paths.js +131 -0
  482. package/dist/lib/bot/progress.d.ts +132 -0
  483. package/dist/lib/bot/progress.js +289 -0
  484. package/dist/lib/bot/promote.d.ts +16 -0
  485. package/dist/lib/bot/promote.js +106 -0
  486. package/dist/lib/bot/promotion-hold.d.ts +24 -0
  487. package/dist/lib/bot/promotion-hold.js +103 -0
  488. package/dist/lib/bot/promotion-receipt.d.ts +9 -0
  489. package/dist/lib/bot/promotion-receipt.js +56 -0
  490. package/dist/lib/bot/promotion-upload.d.ts +16 -0
  491. package/dist/lib/bot/promotion-upload.js +80 -0
  492. package/dist/lib/bot/prompt.d.ts +136 -0
  493. package/dist/lib/bot/prompt.js +433 -0
  494. package/dist/lib/bot/room-policy.d.ts +63 -0
  495. package/dist/lib/bot/room-policy.js +91 -0
  496. package/dist/lib/bot/run.d.ts +219 -0
  497. package/dist/lib/bot/run.js +1881 -0
  498. package/dist/lib/bot/runnable.d.ts +51 -0
  499. package/dist/lib/bot/runnable.js +65 -0
  500. package/dist/lib/bot/runtime/claude.d.ts +50 -0
  501. package/dist/lib/bot/runtime/claude.js +170 -0
  502. package/dist/lib/bot/runtime/codex.d.ts +28 -0
  503. package/dist/lib/bot/runtime/codex.js +153 -0
  504. package/dist/lib/bot/runtime/grok-acp.d.ts +40 -0
  505. package/dist/lib/bot/runtime/grok-acp.js +265 -0
  506. package/dist/lib/bot/runtime/grok.d.ts +41 -0
  507. package/dist/lib/bot/runtime/grok.js +169 -0
  508. package/dist/lib/bot/runtime/index.d.ts +36 -0
  509. package/dist/lib/bot/runtime/index.js +417 -0
  510. package/dist/lib/bot/runtime/messages-stream.d.ts +56 -0
  511. package/dist/lib/bot/runtime/messages-stream.js +194 -0
  512. package/dist/lib/bot/runtime/sanitize.d.ts +18 -0
  513. package/dist/lib/bot/runtime/sanitize.js +28 -0
  514. package/dist/lib/bot/runtime/types.d.ts +159 -0
  515. package/dist/lib/bot/runtime/types.js +51 -0
  516. package/dist/lib/bot/runtime/windows.d.ts +10 -0
  517. package/dist/lib/bot/runtime/windows.js +53 -0
  518. package/dist/lib/bot/runtime-sign-in.d.ts +24 -0
  519. package/dist/lib/bot/runtime-sign-in.js +31 -0
  520. package/dist/lib/bot/scaffold.d.ts +38 -0
  521. package/dist/lib/bot/scaffold.js +94 -0
  522. package/dist/lib/bot/self-heal.d.ts +52 -0
  523. package/dist/lib/bot/self-heal.js +79 -0
  524. package/dist/lib/bot/self-process.d.ts +19 -0
  525. package/dist/lib/bot/self-process.js +35 -0
  526. package/dist/lib/bot/session.d.ts +19 -0
  527. package/dist/lib/bot/session.js +39 -0
  528. package/dist/lib/bot/setup-explain.d.ts +64 -0
  529. package/dist/lib/bot/setup-explain.js +141 -0
  530. package/dist/lib/bot/split.d.ts +32 -0
  531. package/dist/lib/bot/split.js +241 -0
  532. package/dist/lib/bot/status.d.ts +57 -0
  533. package/dist/lib/bot/status.js +66 -0
  534. package/dist/lib/bot/worker-source.d.ts +66 -0
  535. package/dist/lib/bot/worker-source.js +283 -0
  536. package/dist/lib/checkpoint-ontology/aliases.d.ts +17 -0
  537. package/dist/lib/checkpoint-ontology/aliases.js +44 -0
  538. package/dist/lib/checkpoint-ontology/apply.d.ts +110 -0
  539. package/dist/lib/checkpoint-ontology/apply.js +777 -0
  540. package/dist/lib/checkpoint-ontology/company-brief.d.ts +18 -0
  541. package/dist/lib/checkpoint-ontology/company-brief.js +337 -0
  542. package/dist/lib/checkpoint-ontology/company.d.ts +44 -0
  543. package/dist/lib/checkpoint-ontology/company.js +118 -0
  544. package/dist/lib/checkpoint-ontology/drop-aliases.d.ts +41 -0
  545. package/dist/lib/checkpoint-ontology/drop-aliases.js +76 -0
  546. package/dist/lib/checkpoint-ontology/entity-file.d.ts +109 -0
  547. package/dist/lib/checkpoint-ontology/entity-file.js +371 -0
  548. package/dist/lib/checkpoint-ontology/identity.d.ts +38 -0
  549. package/dist/lib/checkpoint-ontology/identity.js +95 -0
  550. package/dist/lib/checkpoint-ontology/merge-copies.d.ts +199 -0
  551. package/dist/lib/checkpoint-ontology/merge-copies.js +1086 -0
  552. package/dist/lib/checkpoint-ontology/multi-writer.d.ts +101 -0
  553. package/dist/lib/checkpoint-ontology/multi-writer.js +394 -0
  554. package/dist/lib/checkpoint-ontology/plan.d.ts +193 -0
  555. package/dist/lib/checkpoint-ontology/plan.js +504 -0
  556. package/dist/lib/checkpoint-ontology/queued-touches.d.ts +29 -0
  557. package/dist/lib/checkpoint-ontology/queued-touches.js +193 -0
  558. package/dist/lib/checkpoint-ontology/sync-client.d.ts +38 -0
  559. package/dist/lib/checkpoint-ontology/sync-client.js +84 -0
  560. package/dist/lib/checkpoint-ontology/tree.d.ts +55 -0
  561. package/dist/lib/checkpoint-ontology/tree.js +198 -0
  562. package/dist/lib/company-errors-sdk-warning-flag.d.ts +5 -0
  563. package/dist/lib/company-errors-sdk-warning-flag.js +8 -0
  564. package/dist/lib/company-skill-wrapper.d.ts +1 -0
  565. package/dist/lib/company-skill-wrapper.js +121 -29
  566. package/dist/lib/core-utils/codex-skill-bridge.d.ts +2 -1
  567. package/dist/lib/core-utils/common.d.ts +0 -1
  568. package/dist/lib/core-utils/common.js +0 -9
  569. package/dist/lib/core-utils/hook-timeout-debug-context-flag.d.ts +20 -0
  570. package/dist/lib/core-utils/hook-timeout-debug-context-flag.js +81 -0
  571. package/dist/lib/core-utils/jq-json-serializer.d.ts +5 -0
  572. package/dist/lib/core-utils/jq-json-serializer.js +10 -0
  573. package/dist/lib/core-utils/qmd-reindex-after-sync.d.ts +14 -1
  574. package/dist/lib/core-utils/qmd-reindex-after-sync.js +101 -17
  575. package/dist/lib/core-utils/secret-patterns.d.ts +43 -0
  576. package/dist/lib/core-utils/secret-patterns.js +34 -0
  577. package/dist/lib/core-utils/sentry-report.d.ts +114 -0
  578. package/dist/lib/core-utils/sentry-report.js +1055 -0
  579. package/dist/lib/core-utils/soft-timeout.js +1 -1
  580. package/dist/lib/core-utils/timeout-guard-native.d.ts +7 -0
  581. package/dist/lib/core-utils/timeout-guard-native.js +40 -0
  582. package/dist/lib/core-utils/timeout-guard.d.ts +3 -3
  583. package/dist/lib/core-utils/timeout-guard.js +28 -13
  584. package/dist/lib/core-utils/token-usage-report.js +17 -3
  585. package/dist/lib/core-utils/worktree-resume.d.ts +20 -0
  586. package/dist/lib/core-utils/worktree-resume.js +1198 -0
  587. package/dist/lib/daemon/catalog.d.ts +134 -0
  588. package/dist/lib/daemon/catalog.js +358 -0
  589. package/dist/lib/daemon/config.d.ts +35 -0
  590. package/dist/lib/daemon/config.js +108 -0
  591. package/dist/lib/daemon/flag.d.ts +25 -0
  592. package/dist/lib/daemon/flag.js +59 -0
  593. package/dist/lib/daemon/handoff.d.ts +56 -0
  594. package/dist/lib/daemon/handoff.js +161 -0
  595. package/dist/lib/daemon/hq-cloud.d.ts +79 -0
  596. package/dist/lib/daemon/hq-cloud.js +183 -0
  597. package/dist/lib/daemon/install.d.ts +85 -0
  598. package/dist/lib/daemon/install.js +320 -0
  599. package/dist/lib/daemon/legacy-sync-env.d.ts +10 -0
  600. package/dist/lib/daemon/legacy-sync-env.js +58 -0
  601. package/dist/lib/daemon/legacy.d.ts +45 -0
  602. package/dist/lib/daemon/legacy.js +133 -0
  603. package/dist/lib/daemon/lock.d.ts +47 -0
  604. package/dist/lib/daemon/lock.js +138 -0
  605. package/dist/lib/daemon/machine-type.d.ts +50 -0
  606. package/dist/lib/daemon/machine-type.js +159 -0
  607. package/dist/lib/daemon/migrate.d.ts +77 -0
  608. package/dist/lib/daemon/migrate.js +265 -0
  609. package/dist/lib/daemon/paths.d.ts +24 -0
  610. package/dist/lib/daemon/paths.js +43 -0
  611. package/dist/lib/daemon/protocol-tail.d.ts +33 -0
  612. package/dist/lib/daemon/protocol-tail.js +131 -0
  613. package/dist/lib/daemon/remote-control.d.ts +74 -0
  614. package/dist/lib/daemon/remote-control.js +153 -0
  615. package/dist/lib/daemon/requests.d.ts +28 -0
  616. package/dist/lib/daemon/requests.js +65 -0
  617. package/dist/lib/daemon/run.d.ts +79 -0
  618. package/dist/lib/daemon/run.js +755 -0
  619. package/dist/lib/daemon/succession.d.ts +118 -0
  620. package/dist/lib/daemon/succession.js +263 -0
  621. package/dist/lib/daemon/supervisor.d.ts +132 -0
  622. package/dist/lib/daemon/supervisor.js +836 -0
  623. package/dist/lib/daemon/sync-runner.d.ts +58 -0
  624. package/dist/lib/daemon/sync-runner.js +277 -0
  625. package/dist/lib/daemon/tools.d.ts +52 -0
  626. package/dist/lib/daemon/tools.js +95 -0
  627. package/dist/lib/daemon/updater.d.ts +57 -0
  628. package/dist/lib/daemon/updater.js +163 -0
  629. package/dist/lib/db/control-plane.js +6 -0
  630. package/dist/lib/db/local.d.ts +0 -5
  631. package/dist/lib/db/local.js +1 -1
  632. package/dist/lib/db/migrate.d.ts +0 -12
  633. package/dist/lib/db/migrate.js +5 -5
  634. package/dist/lib/db/remote-sql.d.ts +2 -2
  635. package/dist/lib/db/remote-sql.js +3 -3
  636. package/dist/lib/db/sql.d.ts +0 -10
  637. package/dist/lib/db/sql.js +4 -8
  638. package/dist/lib/deploy-api.d.ts +5 -0
  639. package/dist/lib/deploy-api.js +21 -0
  640. package/dist/lib/deploy-apps.d.ts +13 -0
  641. package/dist/lib/deploy-apps.js +29 -0
  642. package/dist/lib/doctor/__testing__/fake-hq-tree.d.ts +1 -1
  643. package/dist/lib/doctor/__testing__/fake-hq-tree.js +1 -1
  644. package/dist/lib/doctor/__testing__/run-doctor.d.ts +8 -0
  645. package/dist/lib/doctor/__testing__/run-doctor.js +52 -0
  646. package/dist/lib/doctor/checks/bots.d.ts +13 -0
  647. package/dist/lib/doctor/checks/bots.js +189 -0
  648. package/dist/lib/doctor/checks/claude-wiring.js +70 -1
  649. package/dist/lib/doctor/checks/codex-wiring.d.ts +0 -4
  650. package/dist/lib/doctor/checks/codex-wiring.js +3 -35
  651. package/dist/lib/doctor/checks/grok-wiring.js +1 -34
  652. package/dist/lib/doctor/checks/integrations.js +11 -0
  653. package/dist/lib/doctor/checks/runtime-health.d.ts +4 -17
  654. package/dist/lib/doctor/checks/runtime-health.js +20 -7
  655. package/dist/lib/doctor/checks/scaffold-cli-floor.d.ts +6 -0
  656. package/dist/lib/doctor/checks/scaffold-cli-floor.js +73 -0
  657. package/dist/lib/doctor/checks/sync-health.d.ts +21 -0
  658. package/dist/lib/doctor/checks/sync-health.js +72 -2
  659. package/dist/lib/doctor/checks/sync-runtime.d.ts +11 -0
  660. package/dist/lib/doctor/checks/sync-runtime.js +216 -0
  661. package/dist/lib/doctor/checks/work-context.js +20 -6
  662. package/dist/lib/doctor/client-health-flag-token.d.ts +15 -0
  663. package/dist/lib/doctor/client-health-flag-token.js +66 -0
  664. package/dist/lib/doctor/client-health-reason-codes-flag.d.ts +27 -0
  665. package/dist/lib/doctor/client-health-reason-codes-flag.js +106 -0
  666. package/dist/lib/doctor/compat.d.ts +0 -16
  667. package/dist/lib/doctor/compat.js +4 -3
  668. package/dist/lib/doctor/deep/effects.js +1 -3
  669. package/dist/lib/doctor/deep/executor.d.ts +4 -10
  670. package/dist/lib/doctor/deep/executor.js +1 -1
  671. package/dist/lib/doctor/deep/parity.d.ts +2 -29
  672. package/dist/lib/doctor/deep/parity.js +7 -7
  673. package/dist/lib/doctor/deep/sandbox.d.ts +7 -25
  674. package/dist/lib/doctor/deep/sandbox.js +5 -7
  675. package/dist/lib/doctor/fix/apply.d.ts +79 -8
  676. package/dist/lib/doctor/fix/apply.js +292 -80
  677. package/dist/lib/doctor/fix/json-output.d.ts +28 -0
  678. package/dist/lib/doctor/fix/json-output.js +33 -0
  679. package/dist/lib/doctor/fix/refresh-sync-outcome.d.ts +12 -0
  680. package/dist/lib/doctor/fix/refresh-sync-outcome.js +25 -0
  681. package/dist/lib/doctor/fix/remediation.d.ts +14 -6
  682. package/dist/lib/doctor/fix/remediation.js +49 -9
  683. package/dist/lib/doctor/fixtures/schema.js +1 -3
  684. package/dist/lib/doctor/json-output.d.ts +17 -1
  685. package/dist/lib/doctor/json-output.js +7 -2
  686. package/dist/lib/doctor/platform.d.ts +0 -26
  687. package/dist/lib/doctor/platform.js +5 -5
  688. package/dist/lib/doctor/registry.d.ts +14 -0
  689. package/dist/lib/doctor/registry.js +71 -0
  690. package/dist/lib/doctor/report.js +1 -1
  691. package/dist/lib/doctor/shared.d.ts +8 -0
  692. package/dist/lib/doctor/shared.js +38 -0
  693. package/dist/lib/doctor/stray-gate-entries.d.ts +35 -0
  694. package/dist/lib/doctor/stray-gate-entries.js +83 -0
  695. package/dist/lib/doctor/types.d.ts +5 -0
  696. package/dist/lib/doctor/types.js +20 -0
  697. package/dist/lib/first-sync-next-step.d.ts +34 -0
  698. package/dist/lib/first-sync-next-step.js +179 -0
  699. package/dist/lib/flag-registry-endpoint.d.ts +5 -0
  700. package/dist/lib/flag-registry-endpoint.js +9 -0
  701. package/dist/lib/flag-registry-worker-source.generated.d.ts +2 -0
  702. package/dist/lib/flag-registry-worker-source.generated.js +3 -0
  703. package/dist/lib/flag-registry-worker.js +12 -1
  704. package/dist/lib/flag-registry.d.ts +26 -6
  705. package/dist/lib/flag-registry.js +133 -16
  706. package/dist/lib/flag-snapshot-file.d.ts +20 -0
  707. package/dist/lib/flag-snapshot-file.js +91 -0
  708. package/dist/lib/heartbeat-identity.d.ts +30 -0
  709. package/dist/lib/heartbeat-identity.js +76 -0
  710. package/dist/lib/index-render/companies.d.ts +4 -1
  711. package/dist/lib/index-render/companies.js +66 -3
  712. package/dist/lib/index-render/company-knowledge.js +80 -17
  713. package/dist/lib/index-render/index.d.ts +1 -0
  714. package/dist/lib/index-render/index.js +2 -1
  715. package/dist/lib/index-render/projects.js +82 -5
  716. package/dist/lib/index-render/shared.d.ts +13 -1
  717. package/dist/lib/index-render/shared.js +41 -2
  718. package/dist/lib/lanes/account-home.d.ts +8 -0
  719. package/dist/lib/lanes/account-home.js +10 -0
  720. package/dist/lib/lanes/accounts.d.ts +117 -0
  721. package/dist/lib/lanes/accounts.js +366 -0
  722. package/dist/lib/lanes/admission-host.d.ts +22 -0
  723. package/dist/lib/lanes/admission-host.js +37 -0
  724. package/dist/lib/lanes/admission.d.ts +26 -0
  725. package/dist/lib/lanes/admission.js +210 -0
  726. package/dist/lib/lanes/approval-gate.d.ts +8 -0
  727. package/dist/lib/lanes/approval-gate.js +90 -0
  728. package/dist/lib/lanes/autopilot-metrics.d.ts +99 -0
  729. package/dist/lib/lanes/autopilot-metrics.js +301 -0
  730. package/dist/lib/lanes/autopilot-registry.d.ts +62 -0
  731. package/dist/lib/lanes/autopilot-registry.js +192 -0
  732. package/dist/lib/lanes/autopilot.d.ts +137 -0
  733. package/dist/lib/lanes/autopilot.js +1291 -0
  734. package/dist/lib/lanes/blocker-freshness.d.ts +31 -0
  735. package/dist/lib/lanes/blocker-freshness.js +168 -0
  736. package/dist/lib/lanes/checked-company-path.d.ts +3 -0
  737. package/dist/lib/lanes/checked-company-path.js +39 -0
  738. package/dist/lib/lanes/claude-balance.d.ts +97 -0
  739. package/dist/lib/lanes/claude-balance.js +319 -0
  740. package/dist/lib/lanes/compaction.d.ts +110 -0
  741. package/dist/lib/lanes/compaction.js +293 -0
  742. package/dist/lib/lanes/config.d.ts +94 -0
  743. package/dist/lib/lanes/config.js +606 -0
  744. package/dist/lib/lanes/constants.d.ts +3 -0
  745. package/dist/lib/lanes/constants.js +3 -0
  746. package/dist/lib/lanes/delivery-core.d.ts +15 -0
  747. package/dist/lib/lanes/delivery-core.js +21 -0
  748. package/dist/lib/lanes/delivery.d.ts +180 -0
  749. package/dist/lib/lanes/delivery.js +443 -0
  750. package/dist/lib/lanes/disk-guard.d.ts +65 -0
  751. package/dist/lib/lanes/disk-guard.js +172 -0
  752. package/dist/lib/lanes/dropbox.d.ts +129 -0
  753. package/dist/lib/lanes/dropbox.js +601 -0
  754. package/dist/lib/lanes/effort.d.ts +51 -0
  755. package/dist/lib/lanes/effort.js +113 -0
  756. package/dist/lib/lanes/envelope-repair-dispatch.d.ts +26 -0
  757. package/dist/lib/lanes/envelope-repair-dispatch.js +74 -0
  758. package/dist/lib/lanes/errors.d.ts +39 -0
  759. package/dist/lib/lanes/errors.js +72 -0
  760. package/dist/lib/lanes/flag-keys.d.ts +25 -0
  761. package/dist/lib/lanes/flag-keys.js +25 -0
  762. package/dist/lib/lanes/grants.d.ts +30 -0
  763. package/dist/lib/lanes/grants.js +171 -0
  764. package/dist/lib/lanes/hire-grant-dispatch.d.ts +29 -0
  765. package/dist/lib/lanes/hire-grant-dispatch.js +315 -0
  766. package/dist/lib/lanes/hooks-install.d.ts +82 -0
  767. package/dist/lib/lanes/hooks-install.js +555 -0
  768. package/dist/lib/lanes/host-capacity.d.ts +69 -0
  769. package/dist/lib/lanes/host-capacity.js +254 -0
  770. package/dist/lib/lanes/hq-root.d.ts +19 -0
  771. package/dist/lib/lanes/hq-root.js +28 -0
  772. package/dist/lib/lanes/index.d.ts +76 -0
  773. package/dist/lib/lanes/index.js +42 -0
  774. package/dist/lib/lanes/keep-alive-audit.d.ts +47 -0
  775. package/dist/lib/lanes/keep-alive-audit.js +370 -0
  776. package/dist/lib/lanes/keep-alive.d.ts +68 -0
  777. package/dist/lib/lanes/keep-alive.js +343 -0
  778. package/dist/lib/lanes/kr-freshness.d.ts +76 -0
  779. package/dist/lib/lanes/kr-freshness.js +413 -0
  780. package/dist/lib/lanes/lane-company.d.ts +10 -0
  781. package/dist/lib/lanes/lane-company.js +41 -0
  782. package/dist/lib/lanes/liveness.d.ts +108 -0
  783. package/dist/lib/lanes/liveness.js +396 -0
  784. package/dist/lib/lanes/machine-identity.d.ts +34 -0
  785. package/dist/lib/lanes/machine-identity.js +92 -0
  786. package/dist/lib/lanes/manager-status-gate.d.ts +17 -0
  787. package/dist/lib/lanes/manager-status-gate.js +133 -0
  788. package/dist/lib/lanes/merge-command.d.ts +15 -0
  789. package/dist/lib/lanes/merge-command.js +629 -0
  790. package/dist/lib/lanes/mesh-events.d.ts +127 -0
  791. package/dist/lib/lanes/mesh-events.js +564 -0
  792. package/dist/lib/lanes/message-replay.d.ts +21 -0
  793. package/dist/lib/lanes/message-replay.js +122 -0
  794. package/dist/lib/lanes/models.d.ts +86 -0
  795. package/dist/lib/lanes/models.js +234 -0
  796. package/dist/lib/lanes/monitor.d.ts +48 -0
  797. package/dist/lib/lanes/monitor.js +428 -0
  798. package/dist/lib/lanes/move-account.d.ts +56 -0
  799. package/dist/lib/lanes/move-account.js +193 -0
  800. package/dist/lib/lanes/orphans.d.ts +25 -0
  801. package/dist/lib/lanes/orphans.js +102 -0
  802. package/dist/lib/lanes/outpost-dispatch.d.ts +156 -0
  803. package/dist/lib/lanes/outpost-dispatch.js +293 -0
  804. package/dist/lib/lanes/outpost-hire-cache.d.ts +22 -0
  805. package/dist/lib/lanes/outpost-hire-cache.js +153 -0
  806. package/dist/lib/lanes/outpost-identity.d.ts +33 -0
  807. package/dist/lib/lanes/outpost-identity.js +59 -0
  808. package/dist/lib/lanes/outpost-profile-repin.d.ts +17 -0
  809. package/dist/lib/lanes/outpost-profile-repin.js +84 -0
  810. package/dist/lib/lanes/outpost-pruner-install.d.ts +37 -0
  811. package/dist/lib/lanes/outpost-pruner-install.js +238 -0
  812. package/dist/lib/lanes/outpost-registry-worker-approval.d.ts +18 -0
  813. package/dist/lib/lanes/outpost-registry-worker-approval.js +109 -0
  814. package/dist/lib/lanes/outpost-snapshot-memo.d.ts +6 -0
  815. package/dist/lib/lanes/outpost-snapshot-memo.js +14 -0
  816. package/dist/lib/lanes/outpost-worktree-pruner-flag.d.ts +19 -0
  817. package/dist/lib/lanes/outpost-worktree-pruner-flag.js +86 -0
  818. package/dist/lib/lanes/outpost-worktree-pruner.d.ts +62 -0
  819. package/dist/lib/lanes/outpost-worktree-pruner.js +1201 -0
  820. package/dist/lib/lanes/profile.d.ts +69 -0
  821. package/dist/lib/lanes/profile.js +552 -0
  822. package/dist/lib/lanes/provider-rejection.d.ts +86 -0
  823. package/dist/lib/lanes/provider-rejection.js +286 -0
  824. package/dist/lib/lanes/questions.d.ts +90 -0
  825. package/dist/lib/lanes/questions.js +384 -0
  826. package/dist/lib/lanes/quota.d.ts +134 -0
  827. package/dist/lib/lanes/quota.js +471 -0
  828. package/dist/lib/lanes/reconcile-install.d.ts +90 -0
  829. package/dist/lib/lanes/reconcile-install.js +257 -0
  830. package/dist/lib/lanes/reconcile.d.ts +161 -0
  831. package/dist/lib/lanes/reconcile.js +3343 -0
  832. package/dist/lib/lanes/registry-flag.d.ts +35 -0
  833. package/dist/lib/lanes/registry-flag.js +164 -0
  834. package/dist/lib/lanes/registry-persona.d.ts +20 -0
  835. package/dist/lib/lanes/registry-persona.js +329 -0
  836. package/dist/lib/lanes/registry.d.ts +122 -0
  837. package/dist/lib/lanes/registry.js +570 -0
  838. package/dist/lib/lanes/reviews.d.ts +38 -0
  839. package/dist/lib/lanes/reviews.js +395 -0
  840. package/dist/lib/lanes/runaway-tool-guard.d.ts +38 -0
  841. package/dist/lib/lanes/runaway-tool-guard.js +284 -0
  842. package/dist/lib/lanes/session-relink.d.ts +25 -0
  843. package/dist/lib/lanes/session-relink.js +216 -0
  844. package/dist/lib/lanes/spawn.d.ts +355 -0
  845. package/dist/lib/lanes/spawn.js +2668 -0
  846. package/dist/lib/lanes/ssm-command-context.d.ts +12 -0
  847. package/dist/lib/lanes/ssm-command-context.js +52 -0
  848. package/dist/lib/lanes/store.d.ts +91 -0
  849. package/dist/lib/lanes/store.js +1822 -0
  850. package/dist/lib/lanes/stories.d.ts +23 -0
  851. package/dist/lib/lanes/stories.js +92 -0
  852. package/dist/lib/lanes/story-ledger.d.ts +80 -0
  853. package/dist/lib/lanes/story-ledger.js +815 -0
  854. package/dist/lib/lanes/story-switch.d.ts +21 -0
  855. package/dist/lib/lanes/story-switch.js +75 -0
  856. package/dist/lib/lanes/text-scan.d.ts +11 -0
  857. package/dist/lib/lanes/text-scan.js +103 -0
  858. package/dist/lib/lanes/throttle.d.ts +116 -0
  859. package/dist/lib/lanes/throttle.js +437 -0
  860. package/dist/lib/lanes/timestamp.d.ts +3 -0
  861. package/dist/lib/lanes/timestamp.js +26 -0
  862. package/dist/lib/lanes/tracker-checks.d.ts +77 -0
  863. package/dist/lib/lanes/tracker-checks.js +134 -0
  864. package/dist/lib/lanes/tracker-report-state.d.ts +10 -0
  865. package/dist/lib/lanes/tracker-report-state.js +124 -0
  866. package/dist/lib/lanes/tracker-report.d.ts +203 -0
  867. package/dist/lib/lanes/tracker-report.js +522 -0
  868. package/dist/lib/lanes/tracker-store.d.ts +18 -0
  869. package/dist/lib/lanes/tracker-store.js +106 -0
  870. package/dist/lib/lanes/types.d.ts +1030 -0
  871. package/dist/lib/lanes/types.js +418 -0
  872. package/dist/lib/lanes/wait.d.ts +39 -0
  873. package/dist/lib/lanes/wait.js +159 -0
  874. package/dist/lib/lanes/watch.d.ts +39 -0
  875. package/dist/lib/lanes/watch.js +249 -0
  876. package/dist/lib/lanes/watcher-main.d.ts +11 -0
  877. package/dist/lib/lanes/watcher-main.js +108 -0
  878. package/dist/lib/lanes/watcher.d.ts +287 -0
  879. package/dist/lib/lanes/watcher.js +1972 -0
  880. package/dist/lib/mesh/api.d.ts +103 -10
  881. package/dist/lib/mesh/api.js +334 -64
  882. package/dist/lib/mesh/client.d.ts +3 -2
  883. package/dist/lib/mesh/client.js +26 -7
  884. package/dist/lib/mesh/denial-codes.d.ts +5 -0
  885. package/dist/lib/mesh/denial-codes.js +14 -0
  886. package/dist/lib/mesh/live/backfill-held.d.ts +67 -16
  887. package/dist/lib/mesh/live/backfill-held.js +415 -61
  888. package/dist/lib/mesh/live/backoff.d.ts +2 -2
  889. package/dist/lib/mesh/live/backoff.js +16 -3
  890. package/dist/lib/mesh/live/daemon/board-refresh.d.ts +7 -1
  891. package/dist/lib/mesh/live/daemon/board-refresh.js +78 -30
  892. package/dist/lib/mesh/live/daemon/config.d.ts +36 -0
  893. package/dist/lib/mesh/live/daemon/config.js +120 -0
  894. package/dist/lib/mesh/live/daemon/credentials.d.ts +64 -10
  895. package/dist/lib/mesh/live/daemon/credentials.js +270 -20
  896. package/dist/lib/mesh/live/daemon/doctor.d.ts +53 -0
  897. package/dist/lib/mesh/live/daemon/doctor.js +190 -6
  898. package/dist/lib/mesh/live/daemon/index.d.ts +13 -10
  899. package/dist/lib/mesh/live/daemon/index.js +7 -6
  900. package/dist/lib/mesh/live/daemon/install.d.ts +255 -1
  901. package/dist/lib/mesh/live/daemon/install.js +811 -13
  902. package/dist/lib/mesh/live/daemon/legacy-listen.d.ts +43 -0
  903. package/dist/lib/mesh/live/daemon/legacy-listen.js +89 -0
  904. package/dist/lib/mesh/live/daemon/live-cache.d.ts +26 -0
  905. package/dist/lib/mesh/live/daemon/live-cache.js +116 -0
  906. package/dist/lib/mesh/live/daemon/mqtt-events.d.ts +7 -0
  907. package/dist/lib/mesh/live/daemon/mqtt-events.js +2 -0
  908. package/dist/lib/mesh/live/daemon/mqtt-events.test-d.d.ts +2 -0
  909. package/dist/lib/mesh/live/daemon/mqtt-events.test-d.js +10 -0
  910. package/dist/lib/mesh/live/daemon/paths.d.ts +2 -0
  911. package/dist/lib/mesh/live/daemon/paths.js +2 -0
  912. package/dist/lib/mesh/live/daemon/presence.d.ts +24 -5
  913. package/dist/lib/mesh/live/daemon/presence.js +79 -10
  914. package/dist/lib/mesh/live/daemon/run.d.ts +48 -2
  915. package/dist/lib/mesh/live/daemon/run.js +485 -33
  916. package/dist/lib/mesh/live/daemon/state.d.ts +19 -2
  917. package/dist/lib/mesh/live/daemon/state.js +34 -2
  918. package/dist/lib/mesh/live/daemon/transcript-watch.d.ts +45 -9
  919. package/dist/lib/mesh/live/daemon/transcript-watch.js +227 -31
  920. package/dist/lib/mesh/live/daemon/version-drift.d.ts +5 -0
  921. package/dist/lib/mesh/live/daemon/version-drift.js +47 -0
  922. package/dist/lib/mesh/live/daemon/work-subscribe.d.ts +32 -0
  923. package/dist/lib/mesh/live/daemon/work-subscribe.js +262 -0
  924. package/dist/lib/mesh/live/emit-client.d.ts +8 -0
  925. package/dist/lib/mesh/live/emit-client.js +23 -8
  926. package/dist/lib/mesh/live/emit-evidence.d.ts +19 -0
  927. package/dist/lib/mesh/live/emit-evidence.js +20 -2
  928. package/dist/lib/mesh/live/emit.d.ts +9 -0
  929. package/dist/lib/mesh/live/emit.js +28 -2
  930. package/dist/lib/mesh/live/enqueue.d.ts +5 -0
  931. package/dist/lib/mesh/live/enqueue.js +19 -0
  932. package/dist/lib/mesh/live/flush.d.ts +17 -5
  933. package/dist/lib/mesh/live/flush.js +391 -38
  934. package/dist/lib/mesh/live/format-spool-line.d.ts +5 -2
  935. package/dist/lib/mesh/live/format-spool-line.js +10 -0
  936. package/dist/lib/mesh/live/paths.d.ts +2 -0
  937. package/dist/lib/mesh/live/paths.js +4 -0
  938. package/dist/lib/mesh/live/report-summary.d.ts +45 -0
  939. package/dist/lib/mesh/live/report-summary.js +234 -0
  940. package/dist/lib/mesh/live/session-event.schema.json +24 -1
  941. package/dist/lib/mesh/live/session-events-client.d.ts +2 -0
  942. package/dist/lib/mesh/live/session-events-client.js +26 -0
  943. package/dist/lib/mesh/live/session-seq.d.ts +4 -0
  944. package/dist/lib/mesh/live/session-seq.js +33 -0
  945. package/dist/lib/mesh/live/spool.d.ts +19 -0
  946. package/dist/lib/mesh/live/spool.js +269 -3
  947. package/dist/lib/mesh/live/validate-session-event.d.ts +1 -1
  948. package/dist/lib/mesh/live/validate-session-event.js +1 -1
  949. package/dist/lib/mesh/project-board.d.ts +65 -0
  950. package/dist/lib/mesh/project-board.js +181 -0
  951. package/dist/lib/mesh/story-status.d.ts +22 -0
  952. package/dist/lib/mesh/story-status.js +49 -0
  953. package/dist/lib/monitor.d.ts +149 -0
  954. package/dist/lib/monitor.js +519 -0
  955. package/dist/lib/node-binary.d.ts +50 -0
  956. package/dist/lib/node-binary.js +133 -0
  957. package/dist/lib/notify-recipient.d.ts +7 -0
  958. package/dist/lib/notify-recipient.js +11 -0
  959. package/dist/lib/onboarding/checkpoint.d.ts +13 -0
  960. package/dist/lib/onboarding/checkpoint.js +44 -0
  961. package/dist/lib/onboarding/cli/onboard.d.ts +53 -0
  962. package/dist/lib/onboarding/cli/onboard.js +135 -0
  963. package/dist/lib/onboarding/cli/prompts.d.ts +28 -0
  964. package/dist/lib/onboarding/cli/prompts.js +83 -0
  965. package/dist/lib/onboarding/errors.d.ts +34 -0
  966. package/dist/lib/onboarding/errors.js +59 -0
  967. package/dist/lib/onboarding/index.d.ts +13 -0
  968. package/dist/lib/onboarding/index.js +13 -0
  969. package/dist/lib/onboarding/orchestrator.d.ts +47 -0
  970. package/dist/lib/onboarding/orchestrator.js +569 -0
  971. package/dist/lib/onboarding/types.d.ts +79 -0
  972. package/dist/lib/onboarding/types.js +8 -0
  973. package/dist/lib/plan-limit-nag.d.ts +102 -6
  974. package/dist/lib/plan-limit-nag.js +348 -43
  975. package/dist/lib/policy-validator.d.ts +7 -0
  976. package/dist/lib/policy-validator.js +187 -0
  977. package/dist/lib/process-flag-company-context.d.ts +8 -0
  978. package/dist/lib/process-flag-company-context.js +67 -0
  979. package/dist/lib/report-publish.d.ts +175 -0
  980. package/dist/lib/report-publish.js +421 -0
  981. package/dist/lib/report-run.d.ts +62 -0
  982. package/dist/lib/report-run.js +123 -0
  983. package/dist/lib/report-snapshot.d.ts +12 -0
  984. package/dist/lib/report-snapshot.js +135 -0
  985. package/dist/lib/report-templates.d.ts +9 -0
  986. package/dist/lib/report-templates.js +21 -0
  987. package/dist/lib/scaffold-cli-floor.d.ts +8 -0
  988. package/dist/lib/scaffold-cli-floor.js +50 -0
  989. package/dist/lib/scan-packages/index.d.ts +2 -0
  990. package/dist/lib/scan-packages/index.js +168 -6
  991. package/dist/lib/search-index/background.d.ts +8 -1
  992. package/dist/lib/search-index/background.js +55 -200
  993. package/dist/lib/search-index/collection-path-repair-flag.d.ts +4 -0
  994. package/dist/lib/search-index/collection-path-repair-flag.js +7 -0
  995. package/dist/lib/search-index/embed-lock.d.ts +34 -0
  996. package/dist/lib/search-index/embed-lock.js +295 -0
  997. package/dist/lib/search-index/index.d.ts +12 -0
  998. package/dist/lib/search-index/index.js +153 -7
  999. package/dist/lib/search-index/load-gate.d.ts +57 -0
  1000. package/dist/lib/search-index/load-gate.js +270 -0
  1001. package/dist/lib/search-index/max-doc-bytes.d.ts +219 -0
  1002. package/dist/lib/search-index/max-doc-bytes.js +463 -0
  1003. package/dist/lib/search-index/qmd-exit-diagnostics.d.ts +5 -0
  1004. package/dist/lib/search-index/qmd-exit-diagnostics.js +40 -0
  1005. package/dist/lib/search-index/reindex-single-flight-flag.d.ts +5 -0
  1006. package/dist/lib/search-index/reindex-single-flight-flag.js +8 -0
  1007. package/dist/lib/service-manager/index.d.ts +42 -0
  1008. package/dist/lib/service-manager/index.js +105 -0
  1009. package/dist/lib/service-manager/launchd.d.ts +81 -0
  1010. package/dist/lib/service-manager/launchd.js +212 -0
  1011. package/dist/lib/service-manager/systemd.d.ts +19 -0
  1012. package/dist/lib/service-manager/systemd.js +72 -0
  1013. package/dist/lib/service-manager/types.d.ts +34 -0
  1014. package/dist/lib/service-manager/types.js +26 -0
  1015. package/dist/lib/test-utils/isolated-flag-company-context.d.ts +3 -0
  1016. package/dist/lib/test-utils/isolated-flag-company-context.js +18 -0
  1017. package/dist/lib/work-context/bind-best.d.ts +66 -0
  1018. package/dist/lib/work-context/bind-best.js +344 -0
  1019. package/dist/lib/work-context/bind-calling-session.d.ts +26 -0
  1020. package/dist/lib/work-context/bind-calling-session.js +63 -0
  1021. package/dist/lib/work-context/company-rebind.d.ts +23 -0
  1022. package/dist/lib/work-context/company-rebind.js +59 -0
  1023. package/dist/lib/work-context/company.d.ts +22 -20
  1024. package/dist/lib/work-context/company.js +124 -40
  1025. package/dist/lib/work-context/config.d.ts +58 -11
  1026. package/dist/lib/work-context/config.js +334 -83
  1027. package/dist/lib/work-context/contract.d.ts +13 -0
  1028. package/dist/lib/work-context/contract.schema.json +3 -1
  1029. package/dist/lib/work-context/default-company.d.ts +43 -0
  1030. package/dist/lib/work-context/default-company.js +83 -0
  1031. package/dist/lib/work-context/outbox-quarantine-status-flag.d.ts +4 -0
  1032. package/dist/lib/work-context/outbox-quarantine-status-flag.js +7 -0
  1033. package/dist/lib/work-context/outbox.d.ts +27 -5
  1034. package/dist/lib/work-context/outbox.js +135 -6
  1035. package/dist/lib/work-context/prd-sync.d.ts +56 -0
  1036. package/dist/lib/work-context/prd-sync.js +197 -0
  1037. package/dist/lib/work-context/preflight-contract.d.ts +28 -0
  1038. package/dist/lib/work-context/preflight-contract.js +85 -0
  1039. package/dist/lib/work-context/prompt-rebind.d.ts +25 -0
  1040. package/dist/lib/work-context/prompt-rebind.js +85 -0
  1041. package/dist/lib/work-context/reconcile.d.ts +15 -0
  1042. package/dist/lib/work-context/reconcile.js +405 -29
  1043. package/dist/lib/work-context/state.d.ts +93 -10
  1044. package/dist/lib/work-context/state.js +342 -29
  1045. package/dist/lib/work-context/windows-acl.d.ts +123 -0
  1046. package/dist/lib/work-context/windows-acl.js +425 -0
  1047. package/dist/lib/workers-registry/index.js +62 -8
  1048. package/dist/lib/workers-registry/read.d.ts +15 -0
  1049. package/dist/lib/workers-registry/read.js +17 -0
  1050. package/dist/main.d.ts +32 -0
  1051. package/dist/main.js +273 -73
  1052. package/dist/native-fast-route.d.ts +7 -0
  1053. package/dist/native-fast-route.js +45 -0
  1054. package/dist/node-network-compat-core.d.ts +12 -0
  1055. package/dist/node-network-compat-core.js +41 -0
  1056. package/dist/node-network-compat-fast.d.ts +7 -0
  1057. package/dist/node-network-compat-fast.js +23 -0
  1058. package/dist/node-network-compat.d.ts +2 -30
  1059. package/dist/node-network-compat.js +4 -51
  1060. package/dist/node-preflight.d.ts +7 -1
  1061. package/dist/node-preflight.js +5 -5
  1062. package/dist/register-all.d.ts +4 -29
  1063. package/dist/register-all.js +4 -233
  1064. package/dist/run/discover-schemas.d.ts +2 -1
  1065. package/dist/run/env-graph-guard.d.ts +2 -2
  1066. package/dist/run/env-graph-guard.js +5 -2
  1067. package/dist/run/hq-plugin.d.ts +4 -0
  1068. package/dist/run/hq-plugin.js +36 -8
  1069. package/dist/secrets-env-fast-path.d.ts +5 -0
  1070. package/dist/secrets-env-fast-path.js +16 -0
  1071. package/dist/secrets-env-fast-route.d.ts +18 -0
  1072. package/dist/secrets-env-fast-route.js +54 -0
  1073. package/dist/sentry-before-send.js +80 -0
  1074. package/dist/sentry.d.ts +16 -4
  1075. package/dist/sentry.js +179 -18
  1076. package/dist/startup-registration.d.ts +26 -2
  1077. package/dist/startup-registration.js +116 -15
  1078. package/dist/utils/checkpoint-stamp-write-error.d.ts +28 -0
  1079. package/dist/utils/checkpoint-stamp-write-error.js +99 -0
  1080. package/dist/utils/cli-network-lifecycle.d.ts +4 -0
  1081. package/dist/utils/cli-network-lifecycle.js +11 -0
  1082. package/dist/utils/cli-telemetry.d.ts +75 -1
  1083. package/dist/utils/cli-telemetry.js +433 -7
  1084. package/dist/utils/client-health.d.ts +0 -4
  1085. package/dist/utils/client-health.js +2 -2
  1086. package/dist/utils/cognito-refresh-sentry.d.ts +3 -0
  1087. package/dist/utils/cognito-refresh-sentry.js +49 -0
  1088. package/dist/utils/cognito-session.d.ts +71 -0
  1089. package/dist/utils/cognito-session.js +481 -27
  1090. package/dist/utils/console-origin.d.ts +9 -0
  1091. package/dist/utils/console-origin.js +28 -0
  1092. package/dist/utils/contribution-table.d.ts +1 -1
  1093. package/dist/utils/core-eval-trigger.d.ts +4 -0
  1094. package/dist/utils/core-eval-trigger.js +88 -0
  1095. package/dist/utils/environmental-error.d.ts +18 -0
  1096. package/dist/utils/environmental-error.js +240 -7
  1097. package/dist/utils/exclusive-lock.d.ts +32 -0
  1098. package/dist/utils/exclusive-lock.js +75 -0
  1099. package/dist/utils/expected-cli-error.d.ts +2 -0
  1100. package/dist/utils/expected-cli-error.js +4 -0
  1101. package/dist/utils/fast-stream-errors.d.ts +12 -0
  1102. package/dist/utils/fast-stream-errors.js +18 -0
  1103. package/dist/utils/feedback-diagnostics.d.ts +2 -1
  1104. package/dist/utils/feedback-log-bundle.d.ts +51 -26
  1105. package/dist/utils/feedback-log-bundle.js +211 -31
  1106. package/dist/utils/feedback-logs.d.ts +18 -47
  1107. package/dist/utils/feedback-logs.js +50 -21
  1108. package/dist/utils/feedback-screenshots.d.ts +0 -1
  1109. package/dist/utils/feedback-screenshots.js +1 -1
  1110. package/dist/utils/files-browse-acl.d.ts +5 -0
  1111. package/dist/utils/files-browse-acl.js +11 -0
  1112. package/dist/utils/hq-core-yaml.d.ts +10 -0
  1113. package/dist/utils/hq-core-yaml.js +40 -0
  1114. package/dist/utils/hq-root-resolver.d.ts +13 -0
  1115. package/dist/utils/hq-root-resolver.js +103 -0
  1116. package/dist/utils/hq-roots.d.ts +25 -2
  1117. package/dist/utils/hq-roots.js +67 -7
  1118. package/dist/utils/incomplete-install-error.d.ts +87 -19
  1119. package/dist/utils/incomplete-install-error.js +319 -68
  1120. package/dist/utils/install-tree-torn.d.ts +260 -24
  1121. package/dist/utils/install-tree-torn.js +998 -51
  1122. package/dist/utils/large-file-guard.d.ts +0 -10
  1123. package/dist/utils/large-file-guard.js +1 -1
  1124. package/dist/utils/local-files-overview.d.ts +4 -8
  1125. package/dist/utils/local-files-overview.js +48 -7
  1126. package/dist/utils/login-provider.d.ts +7 -0
  1127. package/dist/utils/login-provider.js +34 -0
  1128. package/dist/utils/pack-contributions.d.ts +2 -14
  1129. package/dist/utils/pack-contributions.js +7 -44
  1130. package/dist/utils/package-root-diagnostics.d.ts +1 -1
  1131. package/dist/utils/people.d.ts +7 -11
  1132. package/dist/utils/people.js +5 -20
  1133. package/dist/utils/plan-gate-error.d.ts +52 -10
  1134. package/dist/utils/plan-gate-error.js +364 -41
  1135. package/dist/utils/qmd-model-download-error.d.ts +0 -8
  1136. package/dist/utils/qmd-model-download-error.js +1 -1
  1137. package/dist/utils/qmd-query-document-error.d.ts +0 -6
  1138. package/dist/utils/qmd-query-document-error.js +1 -1
  1139. package/dist/utils/redact-error-text.d.ts +0 -2
  1140. package/dist/utils/redact-error-text.js +3 -2
  1141. package/dist/utils/redact-url.d.ts +14 -0
  1142. package/dist/utils/redact-url.js +218 -0
  1143. package/dist/utils/run-bundled-script.d.ts +6 -0
  1144. package/dist/utils/run-bundled-script.js +117 -4
  1145. package/dist/utils/sandbox-runner-client.d.ts +2 -1
  1146. package/dist/utils/scaffold-fast-import-guard.d.ts +2 -0
  1147. package/dist/utils/scaffold-fast-import-guard.js +40 -0
  1148. package/dist/utils/scaffold-packlist-guard.d.ts +7 -0
  1149. package/dist/utils/scaffold-packlist-guard.js +23 -0
  1150. package/dist/utils/scaffold-sibling-references.d.ts +22 -0
  1151. package/dist/utils/scaffold-sibling-references.js +156 -0
  1152. package/dist/utils/secret-load-availability.d.ts +8 -0
  1153. package/dist/utils/secret-load-availability.js +54 -0
  1154. package/dist/utils/secrets-cache.d.ts +7 -3
  1155. package/dist/utils/secrets-cache.js +162 -14
  1156. package/dist/utils/self-update.d.ts +34 -1
  1157. package/dist/utils/self-update.js +660 -42
  1158. package/dist/utils/sentry-fingerprint.d.ts +23 -1
  1159. package/dist/utils/sentry-fingerprint.js +223 -31
  1160. package/dist/utils/staged-install.d.ts +34 -0
  1161. package/dist/utils/staged-install.js +346 -0
  1162. package/dist/utils/staged-npm-install.d.ts +16 -0
  1163. package/dist/utils/staged-npm-install.js +264 -0
  1164. package/dist/utils/sync-log-sources.d.ts +15 -0
  1165. package/dist/utils/sync-log-sources.js +36 -0
  1166. package/dist/utils/table-width.d.ts +7 -0
  1167. package/dist/utils/table-width.js +15 -0
  1168. package/dist/utils/team-upgrade.d.ts +1 -1
  1169. package/dist/utils/team-upgrade.js +4 -3
  1170. package/dist/utils/update-command-supervisor.cjs +247 -0
  1171. package/dist/utils/upload-author.d.ts +15 -0
  1172. package/dist/utils/upload-author.js +39 -0
  1173. package/dist/utils/vault-api.d.ts +21 -1
  1174. package/dist/utils/vault-api.js +251 -84
  1175. package/dist/utils/version-check.d.ts +11 -1
  1176. package/dist/utils/version-check.js +32 -3
  1177. package/dist/utils/version-gate.d.ts +101 -17
  1178. package/dist/utils/version-gate.js +645 -70
  1179. package/dist/utils/version-report.d.ts +27 -0
  1180. package/dist/utils/version-report.js +105 -0
  1181. package/dist/utils/windows-spawn.d.ts +6 -0
  1182. package/dist/utils/windows-spawn.js +37 -0
  1183. package/dist/version-request.d.ts +14 -0
  1184. package/dist/version-request.js +36 -0
  1185. package/package.json +20 -8
  1186. package/scripts/mesh-daemon-if-stale.mjs +20 -0
  1187. package/templates/reports/blank.md +3 -0
  1188. package/templates/reports/daily-digest.md +11 -0
  1189. package/templates/runbooks/update-report.md +21 -0
  1190. package/dist/commands/scaffold-fast.d.ts +0 -41
  1191. package/dist/commands/scaffold-fast.js +0 -57
  1192. package/dist/lib/work-context/index.d.ts +0 -25
  1193. package/dist/lib/work-context/index.js +0 -21
@@ -4,6 +4,8 @@
4
4
  * - macOS: LaunchAgent ai.getindigo.hq-mesh-daemon
5
5
  * - Linux: systemd user unit hq-mesh-daemon.service
6
6
  * (documented fallback: root-owned unit running as ec2-user)
7
+ * - Windows: per-user Scheduled Task ai.getindigo.hq-mesh-daemon registered
8
+ * from a rendered task XML via schtasks.exe (no native dependencies)
7
9
  *
8
10
  * The unit embeds the hq binary resolved at install time. Logs go to
9
11
  * ~/.hq/work-mesh/daemon/log (rotation at 5MB handled by the daemon).
@@ -12,20 +14,282 @@
12
14
  import * as fs from "node:fs";
13
15
  import * as os from "node:os";
14
16
  import * as path from "node:path";
17
+ import { spawnSync } from "node:child_process";
18
+ import semver from "semver";
15
19
  import { resolveDaemonAssetDir } from "./log.js";
16
- import { LAUNCHD_LABEL, SYSTEMD_UNIT_NAME, daemonDir, daemonLogPath, } from "./paths.js";
20
+ import { LAUNCHD_LABEL, SYSTEMD_UNIT_NAME, WINDOWS_TASK_NAME, daemonDir, daemonLogPath, daemonPidPath, } from "./paths.js";
21
+ import { isInstallableHqRoot, readDaemonConfig, registerTrustedHqRoot, verifyHqRoot } from "./config.js";
22
+ import { defaultPidLockDeps, pidLockStatus, readPidLock } from "./pid-lock.js";
23
+ import { retireLegacyListen } from "./legacy-listen.js";
24
+ import { readDaemonState } from "./state.js";
25
+ import { activateLaunchd, defaultRunCommand, launchdIsLoaded, launchdServiceTarget, launchdPlistProgramArguments, launchdProgramArgumentsDiffer, parseLaunchctlPrintArguments, } from "../../../service-manager/launchd.js";
26
+ import { activateSystemd, systemdIsActive } from "../../../service-manager/systemd.js";
27
+ import { nodeBinaryProblem, preferStableNodeBinary } from "../../../node-binary.js";
28
+ /**
29
+ * `schtasks /End` terminates the task's root process only. The daemon is
30
+ * launched through `conhost.exe --headless`, so ending the task kills conhost
31
+ * and leaves node running as an orphan that still holds the pid lock. Stop
32
+ * the recorded daemon pid explicitly. Returns the pid that was signalled, or
33
+ * null when no live daemon pid was recorded.
34
+ */
35
+ export function stopWindowsDaemonProcess(dir, deps = {}) {
36
+ const record = readPidLock(daemonPidPath(dir), {
37
+ readFileSync: deps.readFileSync,
38
+ existsSync: deps.existsSync,
39
+ });
40
+ if (!record || record.pid === (deps.selfPid ?? process.pid))
41
+ return null;
42
+ try {
43
+ (deps.kill ?? ((pid) => process.kill(pid)))(record.pid);
44
+ return record.pid;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ export const defaultSchtasks = (args) => {
51
+ const r = spawnSync("schtasks.exe", args, { encoding: "utf8", windowsHide: true });
52
+ return {
53
+ status: r.status,
54
+ stdout: r.stdout ?? "",
55
+ stderr: r.error ? r.error.message : (r.stderr ?? ""),
56
+ };
57
+ };
58
+ function readServiceText(file, existsSync, readFileSync) {
59
+ if (!existsSync(file))
60
+ return "";
61
+ const raw = readFileSync(file);
62
+ const buf = Buffer.isBuffer(raw) ? raw : Buffer.from(String(raw));
63
+ if ((buf.length >= 2 && buf[0] === 0xff && buf[1] === 0xfe) || buf.includes(0)) {
64
+ return buf.toString("utf16le").replace(/^\uFEFF/, "");
65
+ }
66
+ return buf.toString("utf8");
67
+ }
68
+ function hqRootFromUnitText(platform, text) {
69
+ if (platform === "win32")
70
+ return parseWindowsTaskHqRoot(text);
71
+ if (platform === "darwin") {
72
+ const match = /<key>HQ_ROOT<\/key>\s*<string>([^<]*)<\/string>/.exec(text);
73
+ return match?.[1] ?? null;
74
+ }
75
+ const match = /^Environment=HQ_ROOT=(.*)$/m.exec(text);
76
+ if (!match)
77
+ return null;
78
+ const value = match[1].trim();
79
+ return value.startsWith("'") && value.endsWith("'") ? value.slice(1, -1) : value;
80
+ }
81
+ /**
82
+ * Record the HQ root the daemon was serving and replace a pre-allowlist unit
83
+ * before the process is restarted. A unit with no HQ_ROOT (or Restart=on-failure)
84
+ * comes back with an empty root allowlist unless this runs first.
85
+ */
86
+ function migrateLegacyDaemonUnit(opts) {
87
+ const { platform, home } = opts;
88
+ if (platform !== "darwin" && platform !== "linux" && platform !== "win32")
89
+ return;
90
+ const unitPath = platform === "darwin"
91
+ ? path.join(home, "Library", "LaunchAgents", `${LAUNCHD_LABEL}.plist`)
92
+ : platform === "linux"
93
+ ? path.join(home, ".config", "systemd", "user", SYSTEMD_UNIT_NAME)
94
+ : path.join(daemonDir(undefined, home, opts.env), `${WINDOWS_TASK_NAME}.xml`);
95
+ if (!opts.existsSync(unitPath))
96
+ return;
97
+ const text = readServiceText(unitPath, opts.existsSync, opts.readFileSync);
98
+ const fromUnit = hqRootFromUnitText(platform, text);
99
+ const verified = verifyHqRoot(fromUnit ?? undefined)
100
+ ?? verifyHqRoot(opts.hqRoot)
101
+ ?? verifyHqRoot(opts.env?.HQ_ROOT);
102
+ if (!verified)
103
+ return;
104
+ registerTrustedHqRoot(daemonDir(undefined, home, opts.env), verified);
105
+ const legacy = platform === "linux"
106
+ ? !text.includes("Environment=HQ_ROOT=") || /Restart=on-failure/.test(text)
107
+ : platform === "darwin"
108
+ ? !/<key>HQ_ROOT<\/key>/.test(text)
109
+ : !fromUnit;
110
+ if (!legacy)
111
+ return;
112
+ const paths = buildInstallPaths({
113
+ home,
114
+ env: opts.env,
115
+ hqRoot: verified,
116
+ hqBinary: "/usr/bin/hq",
117
+ nodeBinary: process.execPath ? resolveNodeBinary(process.execPath, opts.env ?? process.env) : "/usr/bin/node",
118
+ });
119
+ try {
120
+ paths.hqBinary = resolveHqBinary(process.argv, opts.env ?? process.env);
121
+ }
122
+ catch {
123
+ // The rendered command only has to name a binary; install already resolved one.
124
+ }
125
+ if (platform === "darwin") {
126
+ opts.writeFileSync(unitPath, renderLaunchdPlist(paths), { mode: 0o600 });
127
+ return;
128
+ }
129
+ if (platform === "linux") {
130
+ opts.writeFileSync(unitPath, renderSystemdUserUnit(paths), { mode: 0o600 });
131
+ opts.run("systemctl", ["--user", "daemon-reload"]);
132
+ return;
133
+ }
134
+ const rendered = renderWindowsTaskXml(paths);
135
+ opts.writeFileSync(unitPath, encodeWindowsTaskXml(rendered));
136
+ opts.run("schtasks.exe", ["/Create", "/TN", WINDOWS_TASK_NAME, "/XML", unitPath, "/F"]);
137
+ }
138
+ /**
139
+ * Restart the installed user daemon after a CLI upgrade. This is deliberately
140
+ * best-effort: an update must remain successful if a user has no service,
141
+ * launchctl/systemd is unavailable, or the user manager is not running.
142
+ */
143
+ function asRunCommand(run) {
144
+ return (command, args) => {
145
+ const result = run(command, args);
146
+ return {
147
+ status: result.status,
148
+ stdout: result.stdout ?? "",
149
+ stderr: result.stderr ?? "",
150
+ };
151
+ };
152
+ }
153
+ export function restartDaemonServiceIfInstalled(opts = {}) {
154
+ const platform = opts.platform ?? detectPlatform();
155
+ const home = opts.home ?? os.homedir();
156
+ const existsSync = opts.existsSync ?? fs.existsSync;
157
+ const readFileSync = opts.readFileSync ?? fs.readFileSync;
158
+ const writeFileSync = opts.writeFileSync ?? fs.writeFileSync;
159
+ const run = opts.run ?? ((command, args) => {
160
+ const result = spawnSync(command, args, { encoding: "utf8" });
161
+ return {
162
+ status: result.status,
163
+ stdout: typeof result.stdout === "string" ? result.stdout : "",
164
+ stderr: result.error ? result.error.message : (typeof result.stderr === "string" ? result.stderr : ""),
165
+ };
166
+ });
167
+ try {
168
+ migrateLegacyDaemonUnit({ platform, home, hqRoot: opts.hqRoot, env: opts.env, existsSync, readFileSync, writeFileSync, run });
169
+ if (platform === "darwin") {
170
+ const plist = path.join(home, "Library", "LaunchAgents", `${LAUNCHD_LABEL}.plist`);
171
+ if (!existsSync(plist))
172
+ return { attempted: false, restarted: false };
173
+ const uid = opts.uid ?? process.getuid?.();
174
+ if (typeof uid !== "number")
175
+ return { attempted: false, restarted: false };
176
+ const target = `gui/${uid}/${LAUNCHD_LABEL}`;
177
+ const printed = run("launchctl", ["print", target]);
178
+ const loadedArgs = parseLaunchctlPrintArguments(printed.stdout ?? "");
179
+ const rawPlist = readFileSync(plist);
180
+ const plistText = Buffer.isBuffer(rawPlist) ? rawPlist.toString("utf8") : String(rawPlist);
181
+ const plistArgs = launchdPlistProgramArguments(plistText);
182
+ if (launchdProgramArgumentsDiffer(loadedArgs, plistArgs)) {
183
+ try {
184
+ activateLaunchd(plist, asRunCommand(run), uid, { sleep: opts.sleep });
185
+ return { attempted: true, restarted: true };
186
+ }
187
+ catch (err) {
188
+ return { attempted: true, restarted: false, message: err instanceof Error ? err.message : String(err) };
189
+ }
190
+ }
191
+ const result = run("launchctl", ["kickstart", "-k", target]);
192
+ return { attempted: true, restarted: result.status === 0 };
193
+ }
194
+ if (platform === "linux") {
195
+ const unit = path.join(home, ".config", "systemd", "user", SYSTEMD_UNIT_NAME);
196
+ if (existsSync(unit)) {
197
+ const result = run("systemctl", ["--user", "restart", SYSTEMD_UNIT_NAME]);
198
+ return { attempted: true, restarted: result.status === 0 };
199
+ }
200
+ const systemUnit = path.join("/etc", "systemd", "system", SYSTEMD_UNIT_NAME);
201
+ if (existsSync(systemUnit)) {
202
+ return {
203
+ attempted: true,
204
+ restarted: false,
205
+ message: "system unit detected; restart requires the box's service manager",
206
+ };
207
+ }
208
+ return { attempted: false, restarted: false };
209
+ }
210
+ if (platform === "win32") {
211
+ const dir = daemonDir(undefined, home);
212
+ const xml = path.join(dir, `${WINDOWS_TASK_NAME}.xml`);
213
+ if (!existsSync(xml))
214
+ return { attempted: false, restarted: false };
215
+ run("schtasks.exe", ["/End", "/TN", WINDOWS_TASK_NAME]);
216
+ stopWindowsDaemonProcess(dir, { existsSync, kill: opts.kill });
217
+ const result = run("schtasks.exe", ["/Run", "/TN", WINDOWS_TASK_NAME]);
218
+ return { attempted: true, restarted: result.status === 0 };
219
+ }
220
+ }
221
+ catch {
222
+ // The caller has already completed the update; service restart failure is
223
+ // intentionally non-fatal and will be retried by normal service recovery.
224
+ }
225
+ return { attempted: false, restarted: false };
226
+ }
17
227
  export function detectPlatform(platform = process.platform) {
18
228
  if (platform === "darwin")
19
229
  return "darwin";
20
230
  if (platform === "linux")
21
231
  return "linux";
232
+ if (platform === "win32")
233
+ return "win32";
22
234
  return "other";
23
235
  }
236
+ /**
237
+ * HQ updates moved the CLI from toolchain/node/bin/hq to
238
+ * toolchain/npm-global/bin/hq. A LaunchAgent that still names the old path
239
+ * dies with MODULE_NOT_FOUND on the next restart. Prefer the live npm-global
240
+ * binary when both exist.
241
+ */
242
+ export function preferStableHqBinary(entry) {
243
+ const stale = `${path.sep}toolchain${path.sep}node${path.sep}bin${path.sep}`;
244
+ const stable = `${path.sep}toolchain${path.sep}npm-global${path.sep}bin${path.sep}`;
245
+ if (!entry.includes(stale))
246
+ return entry;
247
+ const candidate = entry.replace(stale, stable);
248
+ if (candidate !== entry && fs.existsSync(candidate))
249
+ return path.resolve(candidate);
250
+ return entry;
251
+ }
252
+ /**
253
+ * Absolute path of the CLI entry that is executing this process.
254
+ * realpath of argv[1] only — never a PATH lookup of `hq`.
255
+ */
256
+ export function resolveRunningCliEntry(argv = process.argv) {
257
+ const entry = argv[1];
258
+ if (!entry) {
259
+ throw new Error("Cannot resolve hq binary: process.argv[1] is empty");
260
+ }
261
+ try {
262
+ return fs.realpathSync(entry);
263
+ }
264
+ catch {
265
+ throw new Error(`Cannot resolve hq binary: ${entry} is not a real path`);
266
+ }
267
+ }
268
+ /**
269
+ * Absolute node binary for a service unit: the realpath of process.execPath,
270
+ * then its upgrade-stable alias (/opt/homebrew/bin/node rather than
271
+ * /opt/homebrew/Cellar/node/<version>/bin/node) when one resolves to the same
272
+ * binary. No PATH lookup of `node` by name.
273
+ */
274
+ export function resolveAbsoluteNodeBinary(execPath = process.execPath) {
275
+ if (!execPath)
276
+ throw new Error("Cannot resolve node binary: execPath is empty");
277
+ let real;
278
+ try {
279
+ real = fs.realpathSync(execPath);
280
+ }
281
+ catch {
282
+ if (path.isAbsolute(execPath))
283
+ return execPath;
284
+ throw new Error(`Cannot resolve node binary: ${execPath} is not a real path`);
285
+ }
286
+ return preferStableNodeBinary(real);
287
+ }
24
288
  /** Resolve the hq binary the current shell uses (argv[1] or PATH). */
25
289
  export function resolveHqBinary(argv = process.argv, env = process.env) {
26
290
  const entry = argv[1];
27
291
  if (entry && fs.existsSync(entry)) {
28
- return path.resolve(entry);
292
+ return preferStableHqBinary(path.resolve(entry));
29
293
  }
30
294
  const pathEnv = env.PATH ?? "";
31
295
  for (const dir of pathEnv.split(path.delimiter)) {
@@ -39,9 +303,104 @@ export function resolveHqBinary(argv = process.argv, env = process.env) {
39
303
  }
40
304
  throw new Error("Cannot resolve hq binary for daemon install");
41
305
  }
306
+ /** True when this CLI is newer than the version the daemon recorded, or nothing was recorded. */
307
+ export function isNewerCliVersion(current, recorded) {
308
+ const recordedVersion = recorded?.trim() ?? "";
309
+ if (!recordedVersion)
310
+ return true;
311
+ if (semver.valid(current) && semver.valid(recordedVersion)) {
312
+ return semver.gt(current, recordedVersion);
313
+ }
314
+ return current !== recordedVersion;
315
+ }
316
+ /**
317
+ * Reinstall and restart the user daemon only when `currentVersion` is newer
318
+ * than daemon/state.json `cliVersion`. A missing record counts as stale.
319
+ * `run` is the launchctl/systemctl seam — tests pass a stub.
320
+ */
321
+ export function installDaemonIfStale(opts) {
322
+ const recorded = readDaemonState(opts.paths.daemonDir)?.cliVersion;
323
+ const platformForUnit = opts.platform ?? detectPlatform();
324
+ const installedNode = installedDaemonNodeBinary(opts.paths, platformForUnit, opts.readUnit);
325
+ // Only a rewrite that changes the node path helps: a unit whose node is gone
326
+ // or versioned, while this install resolves a different (stable) one.
327
+ const nodeProblem = installedNode && installedNode !== opts.paths.nodeBinary
328
+ ? (opts.nodeProblem ?? nodeBinaryProblem)(installedNode)
329
+ : null;
330
+ if (!isNewerCliVersion(opts.currentVersion, recorded) && !nodeProblem) {
331
+ return {
332
+ reinstalled: false,
333
+ message: `daemon already records hq ${recorded}; not reinstalling`,
334
+ };
335
+ }
336
+ const run = opts.run ?? ((command, args) => {
337
+ const result = spawnSync(command, args, { encoding: "utf8" });
338
+ return {
339
+ status: result.status,
340
+ stdout: typeof result.stdout === "string" ? result.stdout : "",
341
+ stderr: typeof result.stderr === "string" ? result.stderr : "",
342
+ };
343
+ });
344
+ const platform = opts.platform ?? detectPlatform();
345
+ const installed = installDaemonService({
346
+ platform,
347
+ paths: opts.paths,
348
+ systemUser: opts.systemUser,
349
+ writeFileSync: opts.writeFileSync,
350
+ mkdirSync: opts.mkdirSync,
351
+ reloadSystemd: opts.reloadSystemd,
352
+ schtasks: opts.schtasks,
353
+ kill: opts.kill,
354
+ runCommand: opts.runCommand,
355
+ windowsLegacyTaskPresent: opts.windowsLegacyTaskPresent,
356
+ run,
357
+ uid: opts.uid,
358
+ sleep: opts.sleep,
359
+ });
360
+ if (platform === "linux" && !opts.systemUser && !opts.paths.systemUser) {
361
+ activateSystemd(SYSTEMD_UNIT_NAME, run);
362
+ }
363
+ return {
364
+ reinstalled: true,
365
+ message: `${installed.message} Restarted with ${opts.paths.nodeBinary} ${opts.paths.hqBinary}.`,
366
+ };
367
+ }
368
+ /**
369
+ * The node binary baked into the installed daemon unit (darwin plist or linux
370
+ * user unit), or null when there is no unit or it cannot be read. Used to
371
+ * reinstall a unit whose node was a versioned path an upgrade removed.
372
+ */
373
+ export function installedDaemonNodeBinary(paths, platform, readUnit = (file) => {
374
+ try {
375
+ return fs.existsSync(file) ? fs.readFileSync(file, "utf8") : null;
376
+ }
377
+ catch {
378
+ return null;
379
+ }
380
+ }) {
381
+ if (platform === "darwin") {
382
+ const text = readUnit(paths.plistPath);
383
+ if (!text)
384
+ return null;
385
+ const block = text.match(/<key>ProgramArguments<\/key>\s*<array>([\s\S]*?)<\/array>/);
386
+ const first = block?.[1]?.match(/<string>([^<]*)<\/string>/);
387
+ return first?.[1] ?? null;
388
+ }
389
+ if (platform === "linux") {
390
+ const text = readUnit(paths.systemdUnitPath);
391
+ if (!text)
392
+ return null;
393
+ const m = text.match(/^ExecStart=('(?:[^']|'\\'')*'|\S+)/m);
394
+ if (!m)
395
+ return null;
396
+ const raw = m[1];
397
+ return raw.startsWith("'") ? raw.slice(1, -1).replace(/'\\''/g, "'") : raw;
398
+ }
399
+ return null;
400
+ }
42
401
  export function resolveNodeBinary(execPath = process.execPath, env = process.env) {
43
402
  if (execPath && fs.existsSync(execPath))
44
- return execPath;
403
+ return preferStableNodeBinary(execPath, { env });
45
404
  const pathEnv = env.PATH ?? "";
46
405
  for (const dir of pathEnv.split(path.delimiter)) {
47
406
  const candidate = path.join(dir, "node");
@@ -66,9 +425,71 @@ export function buildInstallPaths(opts) {
66
425
  plistPath: path.join(home, "Library", "LaunchAgents", `${LAUNCHD_LABEL}.plist`),
67
426
  systemdUserDir: path.join(home, ".config", "systemd", "user"),
68
427
  systemdUnitPath: path.join(home, ".config", "systemd", "user", SYSTEMD_UNIT_NAME),
428
+ windowsTaskXmlPath: path.join(ddir, `${WINDOWS_TASK_NAME}.xml`),
429
+ windowsUser: opts.windowsUser ?? resolveWindowsUser(env),
430
+ windowsHeadlessLauncher: opts.windowsHeadlessLauncher === undefined
431
+ ? resolveWindowsHeadlessLauncher(env)
432
+ : (opts.windowsHeadlessLauncher ?? undefined),
69
433
  systemUser: opts.systemUser,
434
+ hqRoot: opts.hqRoot,
435
+ hqRootSource: opts.hqRootSource,
70
436
  };
71
437
  }
438
+ /** `DOMAIN\user` for the current account, as Task Scheduler expects. */
439
+ export function resolveWindowsUser(env = process.env) {
440
+ const user = env.USERNAME?.trim() || safeUsername();
441
+ const domain = env.USERDOMAIN?.trim();
442
+ return domain ? `${domain}\\${user}` : user;
443
+ }
444
+ /**
445
+ * `conhost.exe --headless` is undocumented. It shipped with the ConPTY
446
+ * conhost in Windows 10 1809 (build 17763); older conhost builds reject the
447
+ * flag and the task would fail on every logon. Gate on the kernel build
448
+ * reported by os.release() ("10.0.<build>") plus a presence check.
449
+ */
450
+ export const WINDOWS_CONHOST_HEADLESS_MIN_BUILD = 17763;
451
+ /** Build number from an os.release() string such as "10.0.26200"; null if unparsable. */
452
+ export function parseWindowsBuild(release) {
453
+ const m = /^\d+\.\d+\.(\d+)/.exec(release.trim());
454
+ if (!m)
455
+ return null;
456
+ const build = Number(m[1]);
457
+ return Number.isFinite(build) ? build : null;
458
+ }
459
+ /**
460
+ * `conhost.exe --headless` (Windows 10 1809+) runs a console app with no
461
+ * window. Returns the launcher path only when conhost.exe exists under
462
+ * SystemRoot and the host build is new enough to honour `--headless`.
463
+ */
464
+ export function resolveWindowsHeadlessLauncher(env = process.env, existsSync = fs.existsSync, release = os.release()) {
465
+ const build = parseWindowsBuild(release);
466
+ if (build === null || build < WINDOWS_CONHOST_HEADLESS_MIN_BUILD)
467
+ return undefined;
468
+ const systemRoot = env.SystemRoot?.trim() || env.windir?.trim() || "C:\\Windows";
469
+ const candidate = path.join(systemRoot, "System32", "conhost.exe");
470
+ return existsSync(candidate) ? candidate : undefined;
471
+ }
472
+ /** Which launch wrapper the rendered task uses (recorded in the install message). */
473
+ export function windowsLaunchMode(paths) {
474
+ return paths.windowsHeadlessLauncher ? "conhost-headless" : "direct";
475
+ }
476
+ /** The task uses the interactive token, so it exists only inside the user's logon session. */
477
+ export function windowsLogonNotice(paths) {
478
+ return `runs at logon of ${paths.windowsUser}; not running while logged out`;
479
+ }
480
+ function describeWindowsLaunchMode(paths) {
481
+ return windowsLaunchMode(paths) === "conhost-headless"
482
+ ? `mode: conhost --headless via ${paths.windowsHeadlessLauncher}`
483
+ : "mode: direct node (conhost --headless unavailable on this host; a console window may appear at logon)";
484
+ }
485
+ function safeUsername() {
486
+ try {
487
+ return os.userInfo().username;
488
+ }
489
+ catch {
490
+ return "";
491
+ }
492
+ }
72
493
  export function renderLaunchdPlist(paths) {
73
494
  return `<?xml version="1.0" encoding="UTF-8"?>
74
495
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@@ -100,6 +521,7 @@ export function renderLaunchdPlist(paths) {
100
521
  <string>${escapeXml(paths.home)}</string>
101
522
  <key>PATH</key>
102
523
  <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
524
+ ${paths.hqRoot ? `<key>HQ_ROOT</key>\n <string>${escapeXml(paths.hqRoot)}</string>` : ""}
103
525
  </dict>
104
526
  </dict>
105
527
  </plist>
@@ -115,11 +537,11 @@ Wants=network-online.target
115
537
  Type=simple
116
538
  ExecStart=${shellQuote(paths.nodeBinary)} ${shellQuote(paths.hqBinary)} mesh daemon run
117
539
  WorkingDirectory=${paths.daemonDir}
118
- Restart=on-failure
540
+ Restart=always
119
541
  RestartSec=5
120
542
  Environment=HOME=${paths.home}
121
543
  Environment=PATH=/usr/local/bin:/usr/bin:/bin
122
- StandardOutput=append:${paths.logPath}
544
+ ${paths.hqRoot ? `Environment=HQ_ROOT=${shellQuote(paths.hqRoot)}\n` : ""}StandardOutput=append:${paths.logPath}
123
545
  StandardError=append:${paths.logPath}
124
546
 
125
547
  [Install]
@@ -147,19 +569,237 @@ User=${user}
147
569
  Group=${user}
148
570
  ExecStart=${shellQuote(paths.nodeBinary)} ${shellQuote(paths.hqBinary)} mesh daemon run
149
571
  WorkingDirectory=/home/${user}/.hq/work-mesh/daemon
150
- Restart=on-failure
572
+ Restart=always
151
573
  RestartSec=5
152
574
  Environment=HOME=/home/${user}
153
575
  Environment=PATH=/usr/local/bin:/usr/bin:/bin
154
576
  Environment=HQ_MACHINE_CREDS_FILE=/home/${user}/.hq-agent/machine-creds.json
155
577
  Environment=HQ_AGENT_IDENTITY_FILE=/var/lib/hq-agent/identity.json
156
- StandardOutput=append:/home/${user}/.hq/work-mesh/daemon/log
578
+ ${paths.hqRoot ? `Environment=HQ_ROOT=${shellQuote(paths.hqRoot)}\n` : ""}StandardOutput=append:/home/${user}/.hq/work-mesh/daemon/log
157
579
  StandardError=append:/home/${user}/.hq/work-mesh/daemon/log
158
580
 
159
581
  [Install]
160
582
  WantedBy=multi-user.target
161
583
  `;
162
584
  }
585
+ /**
586
+ * Windows Task Scheduler definition (schtasks /Create /XML). Runs at logon of
587
+ * the registering user, hidden, no execution time limit, one instance, and
588
+ * restarts every minute on failure. HOME/USERPROFILE come from the user's own
589
+ * session. Task Scheduler XML has no environment block, so the HQ root the
590
+ * install was run for is passed explicitly as `mesh daemon run --hq-root
591
+ * <path>` (the launchd/systemd equivalent of Environment=HQ_ROOT) and is also
592
+ * persisted in the daemon config as a trusted root.
593
+ *
594
+ * LogonType is InteractiveToken: S4U ("run whether user is logged on or not")
595
+ * needs elevation to register, and the interactive token is what an
596
+ * unprivileged `hq mesh daemon install` can create. As a consequence the task
597
+ * runs only while the registering user is logged on. The console window that
598
+ * an interactive-token task would otherwise open is avoided by launching
599
+ * through `conhost.exe --headless` when the host supports it (see
600
+ * resolveWindowsHeadlessLauncher); otherwise node is run directly.
601
+ */
602
+ export function renderWindowsTaskXml(paths) {
603
+ const user = escapeXml(paths.windowsUser);
604
+ const nodeArg = windowsArgQuote(paths.nodeBinary);
605
+ const hqArg = windowsArgQuote(paths.hqBinary);
606
+ const command = paths.windowsHeadlessLauncher ?? paths.nodeBinary;
607
+ const rootArgs = paths.hqRoot ? ` --hq-root ${windowsArgQuote(paths.hqRoot)}` : "";
608
+ const args = paths.windowsHeadlessLauncher
609
+ ? `--headless ${nodeArg} ${hqArg} mesh daemon run${rootArgs}`
610
+ : `${hqArg} mesh daemon run${rootArgs}`;
611
+ return `<?xml version="1.0" encoding="UTF-16"?>
612
+ <Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
613
+ <RegistrationInfo>
614
+ <URI>\\${WINDOWS_TASK_NAME}</URI>
615
+ <Description>HQ Work Mesh Live daemon (spool drainer + MQTT presence)</Description>
616
+ </RegistrationInfo>
617
+ <Triggers>
618
+ <LogonTrigger>
619
+ <Enabled>true</Enabled>
620
+ <UserId>${user}</UserId>
621
+ </LogonTrigger>
622
+ </Triggers>
623
+ <Principals>
624
+ <Principal id="Author">
625
+ <UserId>${user}</UserId>
626
+ <LogonType>${WINDOWS_TASK_LOGON_TYPE}</LogonType>
627
+ <RunLevel>LeastPrivilege</RunLevel>
628
+ </Principal>
629
+ </Principals>
630
+ <Settings>
631
+ <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
632
+ <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
633
+ <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
634
+ <AllowHardTerminate>true</AllowHardTerminate>
635
+ <StartWhenAvailable>true</StartWhenAvailable>
636
+ <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
637
+ <AllowStartOnDemand>true</AllowStartOnDemand>
638
+ <Enabled>true</Enabled>
639
+ <Hidden>true</Hidden>
640
+ <RunOnlyIfIdle>false</RunOnlyIfIdle>
641
+ <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
642
+ <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
643
+ <WakeToRun>false</WakeToRun>
644
+ <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
645
+ <Priority>7</Priority>
646
+ <RestartOnFailure>
647
+ <Interval>PT1M</Interval>
648
+ <Count>999</Count>
649
+ </RestartOnFailure>
650
+ </Settings>
651
+ <Actions Context="Author">
652
+ <Exec>
653
+ <Command>${escapeXml(command)}</Command>
654
+ <Arguments>${escapeXml(args)}</Arguments>
655
+ <WorkingDirectory>${escapeXml(paths.daemonDir)}</WorkingDirectory>
656
+ </Exec>
657
+ </Actions>
658
+ </Task>
659
+ `;
660
+ }
661
+ const WINDOWS_TASK_LOGON_TYPE = "InteractiveToken";
662
+ /** schtasks stores task XML as UTF-16 LE with BOM; match it so /XML parses. */
663
+ export function encodeWindowsTaskXml(rendered) {
664
+ return Buffer.from(`\uFEFF${rendered}`, "utf16le");
665
+ }
666
+ function windowsArgQuote(value) {
667
+ if (/^[A-Za-z0-9_.:\\/-]+$/.test(value))
668
+ return value;
669
+ return `"${value.replace(/"/g, '\\"')}"`;
670
+ }
671
+ /** Status column of `schtasks /Query /FO CSV /NH`: "TaskName","Next Run Time","Status". */
672
+ export function parseSchtasksCsvStatus(stdout) {
673
+ for (const line of stdout.split(/\r?\n/)) {
674
+ const cells = line.match(/"([^"]*)"/g);
675
+ if (!cells || cells.length < 3)
676
+ continue;
677
+ return cells[2].slice(1, -1).trim();
678
+ }
679
+ return null;
680
+ }
681
+ /** Split one CSV line as schtasks emits it (all cells quoted, `""` escapes a quote). */
682
+ function splitCsvLine(line) {
683
+ const cells = [];
684
+ let cur = "";
685
+ let inQuotes = false;
686
+ for (let i = 0; i < line.length; i++) {
687
+ const ch = line[i];
688
+ if (inQuotes) {
689
+ if (ch === '"') {
690
+ if (line[i + 1] === '"') {
691
+ cur += '"';
692
+ i++;
693
+ }
694
+ else
695
+ inQuotes = false;
696
+ }
697
+ else
698
+ cur += ch;
699
+ }
700
+ else if (ch === '"')
701
+ inQuotes = true;
702
+ else if (ch === ",") {
703
+ cells.push(cur);
704
+ cur = "";
705
+ }
706
+ else
707
+ cur += ch;
708
+ }
709
+ cells.push(cur);
710
+ return cells;
711
+ }
712
+ /** Column index of "Last Result" in `schtasks /Query /V /FO CSV` (fixed order, header localized). */
713
+ const SCHTASKS_LAST_RESULT_COLUMN = 6;
714
+ /**
715
+ * "Last Result" of `schtasks /Query /TN <name> /V /FO CSV`, normalized to an
716
+ * unsigned 32-bit code (schtasks prints HRESULT/NTSTATUS values as signed
717
+ * decimals, e.g. -2147024894 for 0x80070002). Prefers the English header
718
+ * when present; otherwise uses the fixed column position. Null when the
719
+ * output carries no task row or the cell is not numeric.
720
+ */
721
+ export function parseSchtasksLastResult(stdout) {
722
+ const lines = stdout.split(/\r?\n/).filter((l) => l.trim().length > 0);
723
+ if (lines.length === 0)
724
+ return null;
725
+ let column = SCHTASKS_LAST_RESULT_COLUMN;
726
+ let rows = lines;
727
+ const header = splitCsvLine(lines[0]);
728
+ const headerIdx = header.findIndex((h) => /^last result$/i.test(h.trim()));
729
+ if (headerIdx >= 0 || /^hostname$/i.test(header[0]?.trim() ?? "")) {
730
+ if (headerIdx >= 0)
731
+ column = headerIdx;
732
+ rows = lines.slice(1);
733
+ }
734
+ for (const line of rows) {
735
+ const cells = splitCsvLine(line);
736
+ if (cells.length <= column)
737
+ continue;
738
+ const raw = cells[column].trim();
739
+ if (!/^-?\d+$/.test(raw))
740
+ continue;
741
+ return Number(raw) >>> 0;
742
+ }
743
+ return null;
744
+ }
745
+ /**
746
+ * Task Scheduler informational results mean "no failed start": 0 is success,
747
+ * and every SCHED_S_* code (ready, running, not yet run, terminated, queued,
748
+ * ...) is a success-severity HRESULT (bit 31 clear) in FACILITY_ITF (0x4)
749
+ * with code 0x1300-0x13FF, i.e. 0x00041300-0x000413FF. Everything else
750
+ * (0x8007xxxx, 0xC000xxxx, process exit codes such as 1) is a failed start.
751
+ */
752
+ export function schtasksLastResultFailed(code) {
753
+ if (code === null || code === 0)
754
+ return false;
755
+ const severityFailed = (code & 0x80000000) !== 0;
756
+ const facility = (code >>> 16) & 0x7ff;
757
+ const lowCode = code & 0xffff;
758
+ if (!severityFailed && facility === 0x4 && lowCode >= 0x1300 && lowCode <= 0x13ff)
759
+ return false;
760
+ return true;
761
+ }
762
+ /** `--hq-root <path>` from a rendered task's <Arguments> (XML-escaped, optionally quoted). */
763
+ export function parseWindowsTaskHqRoot(xml) {
764
+ const m = /<Arguments>([^<]*)<\/Arguments>/.exec(xml);
765
+ if (!m)
766
+ return null;
767
+ const args = unescapeXml(m[1]);
768
+ const quoted = /--hq-root "((?:[^"\\]|\\.)*)"/.exec(args);
769
+ if (quoted)
770
+ return quoted[1].replace(/\\"/g, '"');
771
+ const bare = /--hq-root (\S+)/.exec(args);
772
+ return bare ? bare[1] : null;
773
+ }
774
+ /**
775
+ * The HQ root the installed Windows task actually carries: the task XML on
776
+ * disk first, else the first persisted trusted root. Reads state only; never
777
+ * resolves from cwd, so status reports what install recorded.
778
+ */
779
+ export function readRecordedWindowsHqRoot(paths, deps = {}) {
780
+ const existsSync = deps.existsSync ?? fs.existsSync;
781
+ const readFileSync = deps.readFileSync ?? fs.readFileSync;
782
+ try {
783
+ if (existsSync(paths.windowsTaskXmlPath)) {
784
+ const raw = readFileSync(paths.windowsTaskXmlPath);
785
+ const text = Buffer.isBuffer(raw) ? raw.toString("utf16le").replace(/^\uFEFF/, "") : String(raw);
786
+ const fromXml = parseWindowsTaskHqRoot(text);
787
+ if (fromXml)
788
+ return fromXml;
789
+ }
790
+ }
791
+ catch {
792
+ // fall through to config
793
+ }
794
+ return readDaemonConfig(paths.daemonDir).trustedHqRoots[0] ?? null;
795
+ }
796
+ function unescapeXml(value) {
797
+ return value
798
+ .replace(/&quot;/g, '"')
799
+ .replace(/&lt;/g, "<")
800
+ .replace(/&gt;/g, ">")
801
+ .replace(/&amp;/g, "&");
802
+ }
163
803
  function escapeXml(value) {
164
804
  return value
165
805
  .replace(/&/g, "&amp;")
@@ -179,18 +819,33 @@ export function installDaemonService(opts) {
179
819
  const writeFileSync = opts.writeFileSync ?? fs.writeFileSync;
180
820
  const mkdirSync = opts.mkdirSync ?? fs.mkdirSync;
181
821
  mkdirSync(paths.daemonDir, { recursive: true, mode: 0o700 });
822
+ registerTrustedHqRoot(paths.daemonDir, paths.hqRoot);
823
+ const retired = retireLegacyListen({
824
+ home: paths.home,
825
+ platform,
826
+ run: opts.runCommand,
827
+ windowsTaskPresent: opts.windowsLegacyTaskPresent,
828
+ });
829
+ const legacyNote = retired.removed
830
+ ? " Retired legacy listener ai.getindigo.hq-work-mesh-listen."
831
+ : "";
182
832
  if (platform === "darwin") {
183
833
  const rendered = renderLaunchdPlist(paths);
184
834
  mkdirSync(paths.launchAgentsDir, { recursive: true });
185
835
  writeFileSync(paths.plistPath, rendered, { mode: 0o600 });
186
- opts.activate?.(platform, paths.plistPath);
836
+ if (opts.run) {
837
+ activateLaunchd(paths.plistPath, opts.run, opts.uid, { sleep: opts.sleep });
838
+ }
839
+ else {
840
+ opts.activate?.(platform, paths.plistPath);
841
+ }
187
842
  return {
188
843
  platform,
189
844
  action: "install",
190
845
  paths,
191
846
  rendered,
192
847
  dest: paths.plistPath,
193
- message: `Installed LaunchAgent ${LAUNCHD_LABEL} → ${paths.plistPath}`,
848
+ message: `Installed LaunchAgent ${LAUNCHD_LABEL} → ${paths.plistPath}${legacyNote}`,
194
849
  };
195
850
  }
196
851
  if (platform === "linux") {
@@ -210,12 +865,13 @@ export function installDaemonService(opts) {
210
865
  dest,
211
866
  message: `Wrote system unit template for user ${opts.systemUser ?? paths.systemUser} at ${dest}. ` +
212
867
  `Install with: sudo cp ${dest} /etc/systemd/system/${SYSTEMD_UNIT_NAME} && ` +
213
- `sudo systemctl daemon-reload && sudo systemctl enable --now ${SYSTEMD_UNIT_NAME}`,
868
+ `sudo systemctl daemon-reload && sudo systemctl enable --now ${SYSTEMD_UNIT_NAME}${legacyNote}`,
214
869
  };
215
870
  }
216
871
  const rendered = renderSystemdUserUnit(paths);
217
872
  mkdirSync(paths.systemdUserDir, { recursive: true });
218
873
  writeFileSync(paths.systemdUnitPath, rendered, { mode: 0o600 });
874
+ (opts.reloadSystemd ?? (() => spawnSync("systemctl", ["--user", "daemon-reload"], { stdio: "ignore" })))();
219
875
  opts.activate?.(platform, paths.systemdUnitPath);
220
876
  return {
221
877
  platform,
@@ -223,14 +879,49 @@ export function installDaemonService(opts) {
223
879
  paths,
224
880
  rendered,
225
881
  dest: paths.systemdUnitPath,
226
- message: `Installed systemd user unit ${SYSTEMD_UNIT_NAME} → ${paths.systemdUnitPath}`,
882
+ message: `Installed systemd user unit ${SYSTEMD_UNIT_NAME} → ${paths.systemdUnitPath}${legacyNote}`,
883
+ };
884
+ }
885
+ if (platform === "win32") {
886
+ const schtasks = opts.schtasks ?? defaultSchtasks;
887
+ const rendered = renderWindowsTaskXml(paths);
888
+ writeFileSync(paths.windowsTaskXmlPath, encodeWindowsTaskXml(rendered), { mode: 0o600 });
889
+ const created = schtasks([
890
+ "/Create", "/TN", WINDOWS_TASK_NAME, "/XML", paths.windowsTaskXmlPath, "/F",
891
+ ]);
892
+ if (created.status !== 0) {
893
+ throw new Error(`schtasks /Create failed for ${WINDOWS_TASK_NAME} (exit ${created.status ?? "signal"}): ` +
894
+ `${(created.stderr || created.stdout).trim()}`);
895
+ }
896
+ // /F replaced any previous registration without ending its instance; stop
897
+ // the recorded daemon so the fresh task instance can take the pid lock.
898
+ schtasks(["/End", "/TN", WINDOWS_TASK_NAME]);
899
+ stopWindowsDaemonProcess(paths.daemonDir, { kill: opts.kill });
900
+ const started = schtasks(["/Run", "/TN", WINDOWS_TASK_NAME]);
901
+ const running = started.status === 0;
902
+ const mode = describeWindowsLaunchMode(paths);
903
+ const rootLine = paths.hqRoot
904
+ ? `HQ root: ${paths.hqRoot}${paths.hqRootSource ? ` (from ${paths.hqRootSource})` : ""}\n`
905
+ : "";
906
+ return {
907
+ platform,
908
+ action: "install",
909
+ paths,
910
+ rendered,
911
+ dest: paths.windowsTaskXmlPath,
912
+ running,
913
+ message: running
914
+ ? `${rootLine}Installed Scheduled Task ${WINDOWS_TASK_NAME} → ${paths.windowsTaskXmlPath} (started; ${mode})${legacyNote}`
915
+ : `${rootLine}Installed Scheduled Task ${WINDOWS_TASK_NAME} → ${paths.windowsTaskXmlPath} (${mode}); ` +
916
+ `start failed: ${(started.stderr || started.stdout).trim()}. It starts at next logon.${legacyNote}`,
917
+ notice: windowsLogonNotice(paths),
227
918
  };
228
919
  }
229
920
  return {
230
921
  platform,
231
922
  action: "install",
232
923
  paths,
233
- message: `Unsupported platform for service install; run: ${paths.nodeBinary} ${paths.hqBinary} mesh daemon run`,
924
+ message: `Unsupported platform for service install; run: ${paths.nodeBinary} ${paths.hqBinary} mesh daemon run${legacyNote}`,
234
925
  };
235
926
  }
236
927
  export function uninstallDaemonService(opts) {
@@ -238,9 +929,44 @@ export function uninstallDaemonService(opts) {
238
929
  const paths = opts.paths ?? buildInstallPaths({});
239
930
  const unlinkSync = opts.unlinkSync ?? fs.unlinkSync;
240
931
  const existsSync = opts.existsSync ?? fs.existsSync;
932
+ if (platform === "win32") {
933
+ const schtasks = opts.schtasks ?? defaultSchtasks;
934
+ const registered = schtasks(["/Query", "/TN", WINDOWS_TASK_NAME, "/FO", "CSV", "/NH"]).status === 0;
935
+ if (registered) {
936
+ schtasks(["/End", "/TN", WINDOWS_TASK_NAME]);
937
+ stopWindowsDaemonProcess(paths.daemonDir, { existsSync, kill: opts.kill });
938
+ const deleted = schtasks(["/Delete", "/TN", WINDOWS_TASK_NAME, "/F"]);
939
+ if (deleted.status !== 0) {
940
+ throw new Error(`schtasks /Delete failed for ${WINDOWS_TASK_NAME} (exit ${deleted.status ?? "signal"}): ` +
941
+ `${(deleted.stderr || deleted.stdout).trim()}`);
942
+ }
943
+ }
944
+ if (existsSync(paths.windowsTaskXmlPath))
945
+ unlinkSync(paths.windowsTaskXmlPath);
946
+ return {
947
+ platform,
948
+ action: "uninstall",
949
+ paths,
950
+ dest: paths.windowsTaskXmlPath,
951
+ message: registered
952
+ ? `Removed Scheduled Task ${WINDOWS_TASK_NAME}`
953
+ : `Scheduled Task ${WINDOWS_TASK_NAME} was not registered; removed local task XML if present`,
954
+ };
955
+ }
241
956
  if (platform === "darwin") {
242
957
  if (existsSync(paths.plistPath)) {
243
- opts.deactivate?.(platform, paths.plistPath);
958
+ if (opts.deactivate) {
959
+ opts.deactivate(platform, paths.plistPath);
960
+ }
961
+ else {
962
+ const run = opts.run ?? defaultRunCommand;
963
+ const target = launchdServiceTarget(paths.plistPath, opts.uid);
964
+ const bootout = run("launchctl", ["bootout", target]);
965
+ if (bootout.status !== 0 && run("launchctl", ["print", target]).status === 0) {
966
+ const detail = (bootout.stderr || bootout.stdout).trim();
967
+ throw new Error(`launchctl bootout failed for ${target}${detail ? `: ${detail}` : ` (exit ${bootout.status})`}`);
968
+ }
969
+ }
244
970
  unlinkSync(paths.plistPath);
245
971
  }
246
972
  return {
@@ -275,10 +1001,82 @@ export function uninstallDaemonService(opts) {
275
1001
  message: "Nothing to uninstall on this platform",
276
1002
  };
277
1003
  }
1004
+ /**
1005
+ * Live service-manager probe for `daemonServiceStatus`: `launchctl print
1006
+ * gui/<uid>/<label>` on macOS, `systemctl --user is-active` on Linux.
1007
+ */
1008
+ export function daemonServiceIsLoaded(run, uid) {
1009
+ return (platform) => {
1010
+ if (platform === "darwin")
1011
+ return launchdIsLoaded(LAUNCHD_LABEL, run, uid);
1012
+ if (platform === "linux")
1013
+ return systemdIsActive(SYSTEMD_UNIT_NAME, run);
1014
+ return false;
1015
+ };
1016
+ }
278
1017
  export function daemonServiceStatus(opts) {
279
1018
  const platform = opts.platform ?? detectPlatform();
280
1019
  const paths = opts.paths ?? buildInstallPaths({});
281
1020
  const existsSync = opts.existsSync ?? fs.existsSync;
1021
+ if (platform === "win32") {
1022
+ const schtasks = opts.schtasks ?? defaultSchtasks;
1023
+ // schtasks only tells us whether the task exists. Its Status column is
1024
+ // localized ("Running" / "Wird ausgeführt" / ...), so the daemon pid lock
1025
+ // is the source of truth for "running"; the column is shown when it
1026
+ // happens to carry a value, as extra context only.
1027
+ const query = schtasks(["/Query", "/TN", WINDOWS_TASK_NAME, "/FO", "CSV", "/NH"]);
1028
+ const installed = query.status === 0;
1029
+ const taskState = installed ? parseSchtasksCsvStatus(query.stdout) : null;
1030
+ // The verbose query carries "Last Result": a non-zero, non-informational
1031
+ // code means the last start failed (for example conhost rejecting
1032
+ // --headless), which the pid lock alone would report as merely "not
1033
+ // running". Surface it so a failed start never looks like a clean idle.
1034
+ const verbose = installed
1035
+ ? schtasks(["/Query", "/TN", WINDOWS_TASK_NAME, "/V", "/FO", "CSV"])
1036
+ : null;
1037
+ const lastResult = verbose && verbose.status === 0 ? parseSchtasksLastResult(verbose.stdout) : null;
1038
+ const lastRunFailed = schtasksLastResultFailed(lastResult);
1039
+ const lock = pidLockStatus(daemonPidPath(paths.daemonDir), {
1040
+ isProcessAlive: opts.isProcessAlive ?? defaultPidLockDeps().isProcessAlive,
1041
+ readFileSync: opts.readFileSync,
1042
+ existsSync,
1043
+ });
1044
+ const running = lock === "held";
1045
+ // Read the root the task actually carries and re-check it: a moved,
1046
+ // renamed, or deleted HQ tree leaves the task pointing at nothing.
1047
+ const recordedHqRoot = installed
1048
+ ? readRecordedWindowsHqRoot(paths, { existsSync, readFileSync: opts.readFileSync })
1049
+ : null;
1050
+ const rootValid = recordedHqRoot ? isInstallableHqRoot(recordedHqRoot) : undefined;
1051
+ const detail = (taskState ? ` [task: ${taskState}]` : "") +
1052
+ (lastRunFailed ? ` [last run failed: result ${lastResult}]` : "") +
1053
+ (rootValid === false ? ` [recorded root no longer qualifies: ${recordedHqRoot}]` : "");
1054
+ let message;
1055
+ if (!installed) {
1056
+ message = running
1057
+ ? `Scheduled Task ${WINDOWS_TASK_NAME}: not installed (daemon running outside the task)`
1058
+ : `Scheduled Task ${WINDOWS_TASK_NAME}: not installed`;
1059
+ }
1060
+ else if (running) {
1061
+ message = `Scheduled Task ${WINDOWS_TASK_NAME}: running${detail}`;
1062
+ }
1063
+ else {
1064
+ message = `Scheduled Task ${WINDOWS_TASK_NAME}: installed (daemon not running${lock === "stale" ? ", stale pid lock" : ""})${detail}`;
1065
+ }
1066
+ return {
1067
+ platform,
1068
+ action: "status",
1069
+ paths,
1070
+ dest: paths.windowsTaskXmlPath,
1071
+ running,
1072
+ message,
1073
+ lastResult,
1074
+ lastRunFailed,
1075
+ notice: installed ? windowsLogonNotice(paths) : undefined,
1076
+ recordedHqRoot,
1077
+ rootValid,
1078
+ };
1079
+ }
282
1080
  if (platform === "darwin") {
283
1081
  const installed = existsSync(paths.plistPath);
284
1082
  const running = installed