@indigoai-us/hq-cli 5.314.0 → 5.315.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1178) hide show
  1. package/CHANGELOG.md +4311 -1
  2. package/README.md +113 -0
  3. package/assets/bot-workers/setup/context/USER-GUIDE.md +404 -0
  4. package/assets/bot-workers/setup/context/quick-reference.md +199 -0
  5. package/assets/bot-workers/setup/skills/agents-and-team.md +167 -0
  6. package/assets/bot-workers/setup/skills/explain-hq.md +35 -0
  7. package/assets/bot-workers/setup/skills/first-company.md +74 -0
  8. package/assets/bot-workers/setup/skills/joining-a-team.md +125 -0
  9. package/assets/bot-workers/setup/skills/pricing.md +92 -0
  10. package/assets/bot-workers/setup/skills/standing-help.md +81 -0
  11. package/assets/bot-workers/setup/skills/your-business.md +281 -0
  12. package/assets/bot-workers/setup/worker.yaml +791 -0
  13. package/assets/lanes-hooks/hq-lanes-drain.json +15 -0
  14. package/assets/lanes-hooks/hq-lanes-drain.mjs +275 -0
  15. package/assets/lanes-hooks/hq-lanes-drain.sh +21 -0
  16. package/assets/lanes-reconcile/hq-lanes-reconcile.service +11 -0
  17. package/assets/lanes-reconcile/hq-lanes-reconcile.timer +12 -0
  18. package/assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh +485 -0
  19. package/assets/scaffold/core/scripts/audit-log.sh +384 -0
  20. package/assets/scaffold/core/scripts/checkpoint-stop-gate.sh +281 -43
  21. package/assets/scaffold/core/scripts/clean-worktree-reconcile-handoff.sh +171 -0
  22. package/assets/scaffold/core/scripts/eval-trigger.sh +193 -0
  23. package/assets/scaffold/core/scripts/git-pack-extension-check.sh +164 -0
  24. package/assets/scaffold/core/scripts/handoff-finalize.sh +688 -0
  25. package/assets/scaffold/core/scripts/handoff-open-steps.sh +81 -0
  26. package/assets/scaffold/core/scripts/handoff-post.sh +252 -0
  27. package/assets/scaffold/core/scripts/hook-lib.sh +345 -50
  28. package/assets/scaffold/core/scripts/hq-delegate-bundle.sh +307 -0
  29. package/assets/scaffold/core/scripts/hq-delegate-grant.sh +252 -0
  30. package/assets/scaffold/core/scripts/hq-delegate-pickup.sh +99 -0
  31. package/assets/scaffold/core/scripts/hq-delegate-publish.sh +91 -0
  32. package/assets/scaffold/core/scripts/hq-delegate-repo.sh +158 -0
  33. package/assets/scaffold/core/scripts/hq-delegate-resolve.sh +145 -0
  34. package/assets/scaffold/core/scripts/hq-delegate-secrets.sh +129 -0
  35. package/assets/scaffold/core/scripts/hq-delegate-send.sh +259 -0
  36. package/assets/scaffold/core/scripts/hq-delegate-transfer.sh +175 -0
  37. package/assets/scaffold/core/scripts/hq-delegate-verify.sh +238 -0
  38. package/assets/scaffold/core/scripts/hq-dm-bind.sh +585 -0
  39. package/assets/scaffold/core/scripts/hq-job-notify.sh +389 -0
  40. package/assets/scaffold/core/scripts/hq-job-probe.sh +835 -0
  41. package/assets/scaffold/core/scripts/hq-job-remediate.sh +359 -0
  42. package/assets/scaffold/core/scripts/hq-job-run.sh +1025 -0
  43. package/assets/scaffold/core/scripts/hq-pin.sh +118 -0
  44. package/assets/scaffold/core/scripts/hq-session.sh +184 -23
  45. package/assets/scaffold/core/scripts/jobs-schedule-parse.sh +310 -0
  46. package/assets/scaffold/core/scripts/jobs-validate.sh +451 -0
  47. package/assets/scaffold/core/scripts/knowledge-prefs.sh +55 -0
  48. package/assets/scaffold/core/scripts/lib/portable.sh +211 -0
  49. package/assets/scaffold/core/scripts/lib/secret-patterns.sh +58 -0
  50. package/assets/scaffold/core/scripts/lib/session-id.sh +3 -2
  51. package/assets/scaffold/core/scripts/lib/session-scope-capability.sh +1 -1
  52. package/assets/scaffold/core/scripts/lib/work-mesh-enqueue.sh +2 -1
  53. package/assets/scaffold/core/scripts/lib/work-mesh-live-hook.sh +378 -0
  54. package/assets/scaffold/core/scripts/lib/work-mesh-live-rebind.sh +141 -0
  55. package/assets/scaffold/core/scripts/migrate-policy-triggers.sh +378 -0
  56. package/assets/scaffold/core/scripts/ontology-audience-grant.sh +81 -0
  57. package/assets/scaffold/core/scripts/ontology-brief.mjs +93 -0
  58. package/assets/scaffold/core/scripts/ontology-candidate.sh +100 -0
  59. package/assets/scaffold/core/scripts/ontology-garden.mjs +238 -0
  60. package/assets/scaffold/core/scripts/ontology-source-worklist.sh +79 -0
  61. package/assets/scaffold/core/scripts/outpost-jobs-reconcile.sh +834 -0
  62. package/assets/scaffold/core/scripts/policy-age-report.sh +156 -0
  63. package/assets/scaffold/core/scripts/policy-retire.sh +199 -0
  64. package/assets/scaffold/core/scripts/qmd-reindex-after-sync.sh +10 -87
  65. package/assets/scaffold/core/scripts/qmd-reindex-bg.sh +40 -0
  66. package/assets/scaffold/core/scripts/read-policy-frontmatter.sh +32 -0
  67. package/assets/scaffold/core/scripts/rebuild-company-knowledge-index.sh +36 -3
  68. package/assets/scaffold/core/scripts/rebuild-projects-index.sh +99 -12
  69. package/assets/scaffold/core/scripts/refresh-vault-access.sh +188 -0
  70. package/assets/scaffold/core/scripts/register-project.sh +262 -0
  71. package/assets/scaffold/core/scripts/resolve-company.sh +199 -0
  72. package/assets/scaffold/core/scripts/resume-thread-lock.sh +285 -0
  73. package/assets/scaffold/core/scripts/source-yaml-validate.sh +36 -0
  74. package/assets/scaffold/core/scripts/token-usage-report.sh +81 -20
  75. package/assets/scaffold/core/scripts/verify-story-deliverables.sh +148 -0
  76. package/assets/scaffold/core/scripts/work-mesh-live-bind-trusted.sh +152 -0
  77. package/assets/scaffold/core/scripts/work-mesh-live-rebind.sh +59 -0
  78. package/assets/scaffold/core/scripts/worktree-gc.sh +362 -0
  79. package/contracts/preflight/v1/fixtures.json +87 -0
  80. package/contracts/preflight/v1/schema.json +58 -0
  81. package/dist/bin/hq-auth-refresh.d.ts +2 -0
  82. package/dist/bin/hq-auth-refresh.js +12 -6
  83. package/dist/command-catalog.generated.d.ts +10753 -0
  84. package/dist/command-catalog.generated.js +13859 -0
  85. package/dist/command-registration-plan.d.ts +474 -0
  86. package/dist/command-registration-plan.js +136 -0
  87. package/dist/commands/__fixtures__/access-vault.d.ts +2 -0
  88. package/dist/commands/__fixtures__/access-vault.js +1 -1
  89. package/dist/commands/_patterns.d.ts +16 -0
  90. package/dist/commands/_patterns.js +20 -3
  91. package/dist/commands/access.d.ts +2 -1
  92. package/dist/commands/access.js +58 -49
  93. package/dist/commands/agent-enroll.d.ts +146 -0
  94. package/dist/commands/agent-enroll.js +401 -0
  95. package/dist/commands/agent-inbox.d.ts +9 -0
  96. package/dist/commands/agent-inbox.js +102 -0
  97. package/dist/commands/agent-kit.d.ts +87 -0
  98. package/dist/commands/agent-kit.js +480 -0
  99. package/dist/commands/agent-mcp.d.ts +24 -0
  100. package/dist/commands/agent-mcp.js +127 -0
  101. package/dist/commands/agent-probe.d.ts +77 -0
  102. package/dist/commands/agent-probe.js +335 -0
  103. package/dist/commands/agent.d.ts +13 -0
  104. package/dist/commands/agent.js +40 -0
  105. package/dist/commands/agents.d.ts +106 -4
  106. package/dist/commands/agents.js +924 -45
  107. package/dist/commands/auth.d.ts +1 -0
  108. package/dist/commands/auth.js +189 -19
  109. package/dist/commands/billing-sponsor.d.ts +83 -0
  110. package/dist/commands/billing-sponsor.js +344 -0
  111. package/dist/commands/billing.d.ts +3 -0
  112. package/dist/commands/billing.js +6 -1
  113. package/dist/commands/bot-companies.d.ts +40 -0
  114. package/dist/commands/bot-companies.js +64 -0
  115. package/dist/commands/bot-continuity.d.ts +28 -0
  116. package/dist/commands/bot-continuity.js +68 -0
  117. package/dist/commands/bot-jobs.d.ts +127 -0
  118. package/dist/commands/bot-jobs.js +454 -0
  119. package/dist/commands/bot.d.ts +278 -0
  120. package/dist/commands/bot.js +1982 -0
  121. package/dist/commands/channels.js +56 -1
  122. package/dist/commands/cloud-demote.js +3 -2
  123. package/dist/commands/cloud-provision.d.ts +14 -0
  124. package/dist/commands/cloud-provision.js +232 -58
  125. package/dist/commands/cloud-retire.d.ts +51 -0
  126. package/dist/commands/cloud-retire.js +154 -0
  127. package/dist/commands/cloud.d.ts +49 -15
  128. package/dist/commands/cloud.js +357 -122
  129. package/dist/commands/company-rename-flag.d.ts +4 -0
  130. package/dist/commands/company-rename-flag.js +7 -0
  131. package/dist/commands/company-rename.d.ts +4 -0
  132. package/dist/commands/company-rename.js +90 -0
  133. package/dist/commands/company-transfer.d.ts +4 -28
  134. package/dist/commands/company-transfer.js +5 -49
  135. package/dist/commands/company.js +68 -3
  136. package/dist/commands/core-audit-log-native.d.ts +9 -0
  137. package/dist/commands/core-audit-log-native.js +257 -0
  138. package/dist/commands/core-checkpoint-gate-setting.d.ts +59 -0
  139. package/dist/commands/core-checkpoint-gate-setting.js +163 -0
  140. package/dist/commands/core-checkpoint-stop-gate-native.d.ts +34 -0
  141. package/dist/commands/core-checkpoint-stop-gate-native.js +725 -0
  142. package/dist/commands/core-checkpoint.d.ts +19 -9
  143. package/dist/commands/core-checkpoint.js +301 -37
  144. package/dist/commands/core-command-catalog.d.ts +34 -0
  145. package/dist/commands/core-command-catalog.js +62 -0
  146. package/dist/commands/core-company-index-scope-flag.d.ts +3 -0
  147. package/dist/commands/core-company-index-scope-flag.js +6 -0
  148. package/dist/commands/core-delegate-w1b.d.ts +10 -0
  149. package/dist/commands/core-delegate-w1b.js +1219 -0
  150. package/dist/commands/core-delegate.d.ts +46 -0
  151. package/dist/commands/core-delegate.js +1040 -0
  152. package/dist/commands/core-dm-bind-native.d.ts +32 -0
  153. package/dist/commands/core-dm-bind-native.js +668 -0
  154. package/dist/commands/core-eval-trigger-native.d.ts +4 -0
  155. package/dist/commands/core-eval-trigger-native.js +12 -0
  156. package/dist/commands/core-git-pack-extension-check-native.d.ts +22 -0
  157. package/dist/commands/core-git-pack-extension-check-native.js +190 -0
  158. package/dist/commands/core-handoff-fast.d.ts +18 -0
  159. package/dist/commands/core-handoff-fast.js +104 -0
  160. package/dist/commands/core-handoff-open-steps.d.ts +21 -0
  161. package/dist/commands/core-handoff-open-steps.js +264 -0
  162. package/dist/commands/core-handoff.d.ts +24 -0
  163. package/dist/commands/core-handoff.js +1144 -0
  164. package/dist/commands/core-hq-session-native.d.ts +39 -0
  165. package/dist/commands/core-hq-session-native.js +579 -0
  166. package/dist/commands/core-job-native-utils.d.ts +6 -0
  167. package/dist/commands/core-job-native-utils.js +80 -0
  168. package/dist/commands/core-job-native.d.ts +5 -0
  169. package/dist/commands/core-job-native.js +16 -0
  170. package/dist/commands/core-job-notify-native.d.ts +36 -0
  171. package/dist/commands/core-job-notify-native.js +359 -0
  172. package/dist/commands/core-job-probe-native.d.ts +45 -0
  173. package/dist/commands/core-job-probe-native.js +564 -0
  174. package/dist/commands/core-job-remediate-native.d.ts +26 -0
  175. package/dist/commands/core-job-remediate-native.js +374 -0
  176. package/dist/commands/core-job-remote-launcher.d.ts +7 -0
  177. package/dist/commands/core-job-remote-launcher.js +51 -0
  178. package/dist/commands/core-job-run-native.d.ts +47 -0
  179. package/dist/commands/core-job-run-native.js +1215 -0
  180. package/dist/commands/core-jobs-native.d.ts +25 -0
  181. package/dist/commands/core-jobs-native.js +1339 -0
  182. package/dist/commands/core-knowledge-prefs.d.ts +11 -0
  183. package/dist/commands/core-knowledge-prefs.js +137 -0
  184. package/dist/commands/core-migrate-policy-triggers-native.d.ts +21 -0
  185. package/dist/commands/core-migrate-policy-triggers-native.js +374 -0
  186. package/dist/commands/core-native-handoff-flag.d.ts +4 -0
  187. package/dist/commands/core-native-handoff-flag.js +7 -0
  188. package/dist/commands/core-native-hook-helper-commands.d.ts +4 -0
  189. package/dist/commands/core-native-hook-helper-commands.js +56 -0
  190. package/dist/commands/core-native-hook-helpers-flag.d.ts +4 -0
  191. package/dist/commands/core-native-hook-helpers-flag.js +7 -0
  192. package/dist/commands/core-native-jobs-flag.d.ts +4 -0
  193. package/dist/commands/core-native-jobs-flag.js +7 -0
  194. package/dist/commands/core-native-policy-flag.d.ts +9 -0
  195. package/dist/commands/core-native-policy-flag.js +12 -0
  196. package/dist/commands/core-native-session-flag.d.ts +4 -0
  197. package/dist/commands/core-native-session-flag.js +7 -0
  198. package/dist/commands/core-native-utilities-flag.d.ts +4 -0
  199. package/dist/commands/core-native-utilities-flag.js +7 -0
  200. package/dist/commands/core-native-utilities.d.ts +29 -0
  201. package/dist/commands/core-native-utilities.js +54 -0
  202. package/dist/commands/core-native-worker-skills-flag.d.ts +4 -0
  203. package/dist/commands/core-native-worker-skills-flag.js +7 -0
  204. package/dist/commands/core-ontology-native.d.ts +17 -0
  205. package/dist/commands/core-ontology-native.js +916 -0
  206. package/dist/commands/core-ontology.d.ts +66 -0
  207. package/dist/commands/core-ontology.js +430 -0
  208. package/dist/commands/core-pin-native.d.ts +14 -0
  209. package/dist/commands/core-pin-native.js +236 -0
  210. package/dist/commands/core-policy-frontmatter.d.ts +8 -0
  211. package/dist/commands/core-policy-frontmatter.js +52 -0
  212. package/dist/commands/core-policy.d.ts +14 -0
  213. package/dist/commands/core-policy.js +1018 -0
  214. package/dist/commands/core-refresh-vault-access-native.d.ts +20 -0
  215. package/dist/commands/core-refresh-vault-access-native.js +229 -0
  216. package/dist/commands/core-register-project-native.d.ts +30 -0
  217. package/dist/commands/core-register-project-native.js +347 -0
  218. package/dist/commands/core-resolve-company-command.d.ts +4 -0
  219. package/dist/commands/core-resolve-company-command.js +42 -0
  220. package/dist/commands/core-resolve-company-native.d.ts +28 -0
  221. package/dist/commands/core-resolve-company-native.js +408 -0
  222. package/dist/commands/core-work-mesh-bind-trusted-native.d.ts +32 -0
  223. package/dist/commands/core-work-mesh-bind-trusted-native.js +190 -0
  224. package/dist/commands/core-work-mesh-live-rebind-native.d.ts +18 -0
  225. package/dist/commands/core-work-mesh-live-rebind-native.js +262 -0
  226. package/dist/commands/core-worker-lint-native.d.ts +4 -0
  227. package/dist/commands/core-worker-lint-native.js +160 -0
  228. package/dist/commands/core-worker-share-native.d.ts +4 -0
  229. package/dist/commands/core-worker-share-native.js +260 -0
  230. package/dist/commands/core-worker-skills-command.d.ts +8 -0
  231. package/dist/commands/core-worker-skills-command.js +33 -0
  232. package/dist/commands/core-worker-skills-runtime.d.ts +33 -0
  233. package/dist/commands/core-worker-skills-runtime.js +86 -0
  234. package/dist/commands/core.d.ts +4 -0
  235. package/dist/commands/core.js +277 -80
  236. package/dist/commands/crm.js +52 -3
  237. package/dist/commands/daemon.d.ts +63 -0
  238. package/dist/commands/daemon.js +877 -0
  239. package/dist/commands/db-provision.js +4 -4
  240. package/dist/commands/db-sql.js +7 -21
  241. package/dist/commands/deploy-comments.d.ts +3 -0
  242. package/dist/commands/deploy-comments.js +162 -0
  243. package/dist/commands/dm.d.ts +119 -12
  244. package/dist/commands/dm.js +388 -38
  245. package/dist/commands/doctor.d.ts +12 -0
  246. package/dist/commands/doctor.js +158 -12
  247. package/dist/commands/feedback.d.ts +6 -0
  248. package/dist/commands/feedback.js +86 -37
  249. package/dist/commands/files-browse.d.ts +32 -12
  250. package/dist/commands/files-browse.js +176 -60
  251. package/dist/commands/files.d.ts +17 -0
  252. package/dist/commands/files.js +300 -47
  253. package/dist/commands/group-grants.js +3 -2
  254. package/dist/commands/groups.js +6 -5
  255. package/dist/commands/index-cmd.d.ts +19 -1
  256. package/dist/commands/index-cmd.js +74 -7
  257. package/dist/commands/integrations-api.d.ts +15 -10
  258. package/dist/commands/integrations-api.js +27 -22
  259. package/dist/commands/integrations-connect.d.ts +51 -13
  260. package/dist/commands/integrations-connect.js +86 -71
  261. package/dist/commands/integrations-core.d.ts +6 -6
  262. package/dist/commands/integrations-core.js +25 -11
  263. package/dist/commands/integrations-import.d.ts +1 -1
  264. package/dist/commands/integrations-import.js +43 -24
  265. package/dist/commands/integrations-manage.js +20 -13
  266. package/dist/commands/integrations.d.ts +8 -0
  267. package/dist/commands/integrations.js +94 -7
  268. package/dist/commands/lanes-accounts.d.ts +28 -0
  269. package/dist/commands/lanes-accounts.js +595 -0
  270. package/dist/commands/lanes-autopilot.d.ts +11 -0
  271. package/dist/commands/lanes-autopilot.js +336 -0
  272. package/dist/commands/lanes-checks.d.ts +51 -0
  273. package/dist/commands/lanes-checks.js +941 -0
  274. package/dist/commands/lanes-hold.d.ts +43 -0
  275. package/dist/commands/lanes-hold.js +655 -0
  276. package/dist/commands/lanes-keep-alive-audit.d.ts +10 -0
  277. package/dist/commands/lanes-keep-alive-audit.js +19 -0
  278. package/dist/commands/lanes-kpis.d.ts +11 -0
  279. package/dist/commands/lanes-kpis.js +34 -0
  280. package/dist/commands/lanes-message.d.ts +9 -0
  281. package/dist/commands/lanes-message.js +946 -0
  282. package/dist/commands/lanes-move.d.ts +12 -0
  283. package/dist/commands/lanes-move.js +397 -0
  284. package/dist/commands/lanes-questions.d.ts +36 -0
  285. package/dist/commands/lanes-questions.js +1005 -0
  286. package/dist/commands/lanes-report.d.ts +11 -0
  287. package/dist/commands/lanes-report.js +333 -0
  288. package/dist/commands/lanes-resume.d.ts +6 -0
  289. package/dist/commands/lanes-resume.js +564 -0
  290. package/dist/commands/lanes-review.d.ts +10 -0
  291. package/dist/commands/lanes-review.js +56 -0
  292. package/dist/commands/lanes-shared.d.ts +449 -0
  293. package/dist/commands/lanes-shared.js +170 -0
  294. package/dist/commands/lanes-stories.d.ts +15 -0
  295. package/dist/commands/lanes-stories.js +347 -0
  296. package/dist/commands/lanes-watch.d.ts +7 -0
  297. package/dist/commands/lanes-watch.js +216 -0
  298. package/dist/commands/lanes.d.ts +149 -0
  299. package/dist/commands/lanes.js +8983 -0
  300. package/dist/commands/login.js +49 -6
  301. package/dist/commands/mcp-registration.d.ts +32 -25
  302. package/dist/commands/mcp-registration.js +256 -23
  303. package/dist/commands/mcp-status.js +1 -0
  304. package/dist/commands/meetings.js +55 -34
  305. package/dist/commands/members.js +5 -1
  306. package/dist/commands/mesh.d.ts +11 -0
  307. package/dist/commands/mesh.js +1086 -76
  308. package/dist/commands/monitor.d.ts +58 -0
  309. package/dist/commands/monitor.js +980 -0
  310. package/dist/commands/onboard-bot-membership.d.ts +32 -0
  311. package/dist/commands/onboard-bot-membership.js +40 -0
  312. package/dist/commands/onboard-create-identity.d.ts +26 -0
  313. package/dist/commands/onboard-create-identity.js +23 -0
  314. package/dist/commands/onboard-identity-guard.d.ts +1 -1
  315. package/dist/commands/onboard.js +24 -5
  316. package/dist/commands/outpost-pruner.d.ts +3 -0
  317. package/dist/commands/outpost-pruner.js +125 -0
  318. package/dist/commands/pack-install.js +3 -1
  319. package/dist/commands/packs.js +11 -1
  320. package/dist/commands/people.d.ts +4 -0
  321. package/dist/commands/people.js +37 -3
  322. package/dist/commands/personal-connector-settings-flag.d.ts +4 -0
  323. package/dist/commands/personal-connector-settings-flag.js +7 -0
  324. package/dist/commands/personal-targeted-push-flag.d.ts +4 -0
  325. package/dist/commands/personal-targeted-push-flag.js +7 -0
  326. package/dist/commands/personal-targeted-push-paths.d.ts +3 -0
  327. package/dist/commands/personal-targeted-push-paths.js +67 -0
  328. package/dist/commands/publish.d.ts +8 -1
  329. package/dist/commands/publish.js +17 -4
  330. package/dist/commands/reindex.js +56 -6
  331. package/dist/commands/report.d.ts +19 -0
  332. package/dist/commands/report.js +537 -0
  333. package/dist/commands/rescue.d.ts +4 -0
  334. package/dist/commands/rescue.js +27 -17
  335. package/dist/commands/run-feature-telemetry.d.ts +3 -0
  336. package/dist/commands/run-feature-telemetry.js +6 -0
  337. package/dist/commands/run.js +18 -4
  338. package/dist/commands/safe-extract.d.ts +11 -2
  339. package/dist/commands/safe-extract.js +36 -8
  340. package/dist/commands/secrets.d.ts +20 -2
  341. package/dist/commands/secrets.js +175 -71
  342. package/dist/commands/skill.d.ts +35 -4
  343. package/dist/commands/skill.js +357 -18
  344. package/dist/commands/staff/reset-test-account.d.ts +110 -0
  345. package/dist/commands/staff/reset-test-account.js +268 -0
  346. package/dist/commands/staff/test-account.d.ts +51 -0
  347. package/dist/commands/staff/test-account.js +196 -0
  348. package/dist/commands/sync-mode.d.ts +11 -0
  349. package/dist/commands/sync-mode.js +30 -0
  350. package/dist/commands/sync-narrow.js +36 -5
  351. package/dist/commands/team-sync.js +71 -10
  352. package/dist/commands/update.js +6 -0
  353. package/dist/commands/vault-retention-flag.d.ts +3 -0
  354. package/dist/commands/vault-retention-flag.js +9 -0
  355. package/dist/commands/vault-retention.d.ts +11 -0
  356. package/dist/commands/vault-retention.js +69 -0
  357. package/dist/commands/version.d.ts +10 -0
  358. package/dist/commands/version.js +11 -0
  359. package/dist/commands/whoami.d.ts +22 -0
  360. package/dist/commands/whoami.js +137 -4
  361. package/dist/commands/workers.d.ts +2 -14
  362. package/dist/commands/workers.js +7 -10
  363. package/dist/fast-core.d.ts +6 -7
  364. package/dist/fast-core.js +87 -24
  365. package/dist/fast-scaffold.d.ts +86 -0
  366. package/dist/fast-scaffold.js +364 -0
  367. package/dist/index.d.ts +3 -4
  368. package/dist/index.js +59 -9
  369. package/dist/lanes-drain-hook.d.ts +14 -0
  370. package/dist/lanes-drain-hook.js +203 -0
  371. package/dist/lazy-commands.d.ts +20 -44
  372. package/dist/lazy-commands.js +60 -58
  373. package/dist/lib/agent-kit/adopt-identity.d.ts +27 -0
  374. package/dist/lib/agent-kit/adopt-identity.js +60 -0
  375. package/dist/lib/agent-kit/attachment-download.d.ts +24 -0
  376. package/dist/lib/agent-kit/attachment-download.js +47 -0
  377. package/dist/lib/agent-kit/creds.d.ts +106 -0
  378. package/dist/lib/agent-kit/creds.js +163 -0
  379. package/dist/lib/agent-kit/fallback.d.ts +78 -0
  380. package/dist/lib/agent-kit/fallback.js +210 -0
  381. package/dist/lib/agent-kit/inbox-state.d.ts +83 -0
  382. package/dist/lib/agent-kit/inbox-state.js +159 -0
  383. package/dist/lib/agent-kit/kit-config.d.ts +56 -0
  384. package/dist/lib/agent-kit/kit-config.js +65 -0
  385. package/dist/lib/agent-kit/log.d.ts +16 -0
  386. package/dist/lib/agent-kit/log.js +46 -0
  387. package/dist/lib/agent-kit/mcp/attachments.d.ts +126 -0
  388. package/dist/lib/agent-kit/mcp/attachments.js +222 -0
  389. package/dist/lib/agent-kit/mcp/jsonrpc.d.ts +75 -0
  390. package/dist/lib/agent-kit/mcp/jsonrpc.js +164 -0
  391. package/dist/lib/agent-kit/mcp/tools.d.ts +64 -0
  392. package/dist/lib/agent-kit/mcp/tools.js +397 -0
  393. package/dist/lib/agent-kit/paths.d.ts +65 -0
  394. package/dist/lib/agent-kit/paths.js +118 -0
  395. package/dist/lib/agent-kit/private-file.d.ts +29 -0
  396. package/dist/lib/agent-kit/private-file.js +91 -0
  397. package/dist/lib/agent-kit/run/heartbeat.d.ts +72 -0
  398. package/dist/lib/agent-kit/run/heartbeat.js +128 -0
  399. package/dist/lib/agent-kit/run/inbox.d.ts +76 -0
  400. package/dist/lib/agent-kit/run/inbox.js +205 -0
  401. package/dist/lib/agent-kit/run/supervisor.d.ts +35 -0
  402. package/dist/lib/agent-kit/run/supervisor.js +85 -0
  403. package/dist/lib/agent-kit/run/sync.d.ts +33 -0
  404. package/dist/lib/agent-kit/run/sync.js +58 -0
  405. package/dist/lib/agent-kit/services.d.ts +31 -0
  406. package/dist/lib/agent-kit/services.js +55 -0
  407. package/dist/lib/agent-kit/skills.d.ts +18 -0
  408. package/dist/lib/agent-kit/skills.js +151 -0
  409. package/dist/lib/agent-kit/wake.d.ts +83 -0
  410. package/dist/lib/agent-kit/wake.js +243 -0
  411. package/dist/lib/agents/model-catalog.d.ts +62 -0
  412. package/dist/lib/agents/model-catalog.js +275 -0
  413. package/dist/lib/auth-login-provider-state.d.ts +8 -0
  414. package/dist/lib/auth-login-provider-state.js +63 -0
  415. package/dist/lib/aws-sdk-node-warning-output.d.ts +12 -0
  416. package/dist/lib/aws-sdk-node-warning-output.js +22 -0
  417. package/dist/lib/billing/free-month.d.ts +18 -0
  418. package/dist/lib/billing/free-month.js +31 -0
  419. package/dist/lib/billing/plan-limit-refusals.d.ts +69 -0
  420. package/dist/lib/billing/plan-limit-refusals.js +187 -0
  421. package/dist/lib/billing/plan-limit-upgrade-url.d.ts +11 -0
  422. package/dist/lib/billing/plan-limit-upgrade-url.js +66 -0
  423. package/dist/lib/billing/plan-lock.d.ts +143 -0
  424. package/dist/lib/billing/plan-lock.js +439 -0
  425. package/dist/lib/bot/api.d.ts +349 -0
  426. package/dist/lib/bot/api.js +316 -0
  427. package/dist/lib/bot/attachments.d.ts +45 -0
  428. package/dist/lib/bot/attachments.js +89 -0
  429. package/dist/lib/bot/cli-update.d.ts +138 -0
  430. package/dist/lib/bot/cli-update.js +278 -0
  431. package/dist/lib/bot/company-bind.d.ts +27 -0
  432. package/dist/lib/bot/company-bind.js +62 -0
  433. package/dist/lib/bot/config.d.ts +153 -0
  434. package/dist/lib/bot/config.js +233 -0
  435. package/dist/lib/bot/continuity-download.d.ts +28 -0
  436. package/dist/lib/bot/continuity-download.js +75 -0
  437. package/dist/lib/bot/continuity-install.d.ts +14 -0
  438. package/dist/lib/bot/continuity-install.js +101 -0
  439. package/dist/lib/bot/continuity.d.ts +67 -0
  440. package/dist/lib/bot/continuity.js +301 -0
  441. package/dist/lib/bot/creds.d.ts +24 -0
  442. package/dist/lib/bot/creds.js +51 -0
  443. package/dist/lib/bot/daemon.d.ts +173 -0
  444. package/dist/lib/bot/daemon.js +552 -0
  445. package/dist/lib/bot/inbox-poll-backoff-flag.d.ts +24 -0
  446. package/dist/lib/bot/inbox-poll-backoff-flag.js +135 -0
  447. package/dist/lib/bot/inbox-state.d.ts +18 -0
  448. package/dist/lib/bot/inbox-state.js +51 -0
  449. package/dist/lib/bot/index.d.ts +23 -0
  450. package/dist/lib/bot/index.js +23 -0
  451. package/dist/lib/bot/inflight.d.ts +119 -0
  452. package/dist/lib/bot/inflight.js +83 -0
  453. package/dist/lib/bot/job-completions.d.ts +89 -0
  454. package/dist/lib/bot/job-completions.js +132 -0
  455. package/dist/lib/bot/job-run.d.ts +109 -0
  456. package/dist/lib/bot/job-run.js +246 -0
  457. package/dist/lib/bot/local-config.d.ts +61 -0
  458. package/dist/lib/bot/local-config.js +145 -0
  459. package/dist/lib/bot/local-jobs.d.ts +89 -0
  460. package/dist/lib/bot/local-jobs.js +459 -0
  461. package/dist/lib/bot/local-name.d.ts +54 -0
  462. package/dist/lib/bot/local-name.js +114 -0
  463. package/dist/lib/bot/log.d.ts +13 -0
  464. package/dist/lib/bot/log.js +59 -0
  465. package/dist/lib/bot/owner-context.d.ts +79 -0
  466. package/dist/lib/bot/owner-context.js +175 -0
  467. package/dist/lib/bot/paths.d.ts +76 -0
  468. package/dist/lib/bot/paths.js +131 -0
  469. package/dist/lib/bot/progress.d.ts +132 -0
  470. package/dist/lib/bot/progress.js +289 -0
  471. package/dist/lib/bot/promote.d.ts +16 -0
  472. package/dist/lib/bot/promote.js +106 -0
  473. package/dist/lib/bot/promotion-hold.d.ts +24 -0
  474. package/dist/lib/bot/promotion-hold.js +103 -0
  475. package/dist/lib/bot/promotion-receipt.d.ts +9 -0
  476. package/dist/lib/bot/promotion-receipt.js +56 -0
  477. package/dist/lib/bot/promotion-upload.d.ts +16 -0
  478. package/dist/lib/bot/promotion-upload.js +80 -0
  479. package/dist/lib/bot/prompt.d.ts +136 -0
  480. package/dist/lib/bot/prompt.js +433 -0
  481. package/dist/lib/bot/room-policy.d.ts +63 -0
  482. package/dist/lib/bot/room-policy.js +91 -0
  483. package/dist/lib/bot/run.d.ts +217 -0
  484. package/dist/lib/bot/run.js +1869 -0
  485. package/dist/lib/bot/runnable.d.ts +51 -0
  486. package/dist/lib/bot/runnable.js +65 -0
  487. package/dist/lib/bot/runtime/claude.d.ts +50 -0
  488. package/dist/lib/bot/runtime/claude.js +170 -0
  489. package/dist/lib/bot/runtime/codex.d.ts +28 -0
  490. package/dist/lib/bot/runtime/codex.js +153 -0
  491. package/dist/lib/bot/runtime/grok-acp.d.ts +40 -0
  492. package/dist/lib/bot/runtime/grok-acp.js +265 -0
  493. package/dist/lib/bot/runtime/grok.d.ts +41 -0
  494. package/dist/lib/bot/runtime/grok.js +169 -0
  495. package/dist/lib/bot/runtime/index.d.ts +36 -0
  496. package/dist/lib/bot/runtime/index.js +417 -0
  497. package/dist/lib/bot/runtime/messages-stream.d.ts +56 -0
  498. package/dist/lib/bot/runtime/messages-stream.js +194 -0
  499. package/dist/lib/bot/runtime/sanitize.d.ts +18 -0
  500. package/dist/lib/bot/runtime/sanitize.js +28 -0
  501. package/dist/lib/bot/runtime/types.d.ts +159 -0
  502. package/dist/lib/bot/runtime/types.js +51 -0
  503. package/dist/lib/bot/runtime/windows.d.ts +10 -0
  504. package/dist/lib/bot/runtime/windows.js +53 -0
  505. package/dist/lib/bot/runtime-sign-in.d.ts +24 -0
  506. package/dist/lib/bot/runtime-sign-in.js +31 -0
  507. package/dist/lib/bot/scaffold.d.ts +38 -0
  508. package/dist/lib/bot/scaffold.js +94 -0
  509. package/dist/lib/bot/self-heal.d.ts +52 -0
  510. package/dist/lib/bot/self-heal.js +79 -0
  511. package/dist/lib/bot/self-process.d.ts +19 -0
  512. package/dist/lib/bot/self-process.js +35 -0
  513. package/dist/lib/bot/session.d.ts +19 -0
  514. package/dist/lib/bot/session.js +39 -0
  515. package/dist/lib/bot/setup-explain.d.ts +64 -0
  516. package/dist/lib/bot/setup-explain.js +141 -0
  517. package/dist/lib/bot/split.d.ts +32 -0
  518. package/dist/lib/bot/split.js +241 -0
  519. package/dist/lib/bot/status.d.ts +57 -0
  520. package/dist/lib/bot/status.js +66 -0
  521. package/dist/lib/bot/worker-source.d.ts +66 -0
  522. package/dist/lib/bot/worker-source.js +283 -0
  523. package/dist/lib/checkpoint-ontology/aliases.d.ts +17 -0
  524. package/dist/lib/checkpoint-ontology/aliases.js +44 -0
  525. package/dist/lib/checkpoint-ontology/apply.d.ts +110 -0
  526. package/dist/lib/checkpoint-ontology/apply.js +777 -0
  527. package/dist/lib/checkpoint-ontology/company-brief.d.ts +18 -0
  528. package/dist/lib/checkpoint-ontology/company-brief.js +337 -0
  529. package/dist/lib/checkpoint-ontology/company.d.ts +44 -0
  530. package/dist/lib/checkpoint-ontology/company.js +118 -0
  531. package/dist/lib/checkpoint-ontology/drop-aliases.d.ts +41 -0
  532. package/dist/lib/checkpoint-ontology/drop-aliases.js +76 -0
  533. package/dist/lib/checkpoint-ontology/entity-file.d.ts +109 -0
  534. package/dist/lib/checkpoint-ontology/entity-file.js +371 -0
  535. package/dist/lib/checkpoint-ontology/identity.d.ts +38 -0
  536. package/dist/lib/checkpoint-ontology/identity.js +95 -0
  537. package/dist/lib/checkpoint-ontology/merge-copies.d.ts +199 -0
  538. package/dist/lib/checkpoint-ontology/merge-copies.js +1086 -0
  539. package/dist/lib/checkpoint-ontology/multi-writer.d.ts +101 -0
  540. package/dist/lib/checkpoint-ontology/multi-writer.js +394 -0
  541. package/dist/lib/checkpoint-ontology/plan.d.ts +193 -0
  542. package/dist/lib/checkpoint-ontology/plan.js +504 -0
  543. package/dist/lib/checkpoint-ontology/queued-touches.d.ts +29 -0
  544. package/dist/lib/checkpoint-ontology/queued-touches.js +193 -0
  545. package/dist/lib/checkpoint-ontology/sync-client.d.ts +38 -0
  546. package/dist/lib/checkpoint-ontology/sync-client.js +84 -0
  547. package/dist/lib/checkpoint-ontology/tree.d.ts +55 -0
  548. package/dist/lib/checkpoint-ontology/tree.js +198 -0
  549. package/dist/lib/company-errors-sdk-warning-flag.d.ts +5 -0
  550. package/dist/lib/company-errors-sdk-warning-flag.js +8 -0
  551. package/dist/lib/company-skill-wrapper.d.ts +1 -0
  552. package/dist/lib/company-skill-wrapper.js +121 -29
  553. package/dist/lib/core-utils/codex-skill-bridge.d.ts +2 -1
  554. package/dist/lib/core-utils/hook-timeout-debug-context-flag.d.ts +20 -0
  555. package/dist/lib/core-utils/hook-timeout-debug-context-flag.js +81 -0
  556. package/dist/lib/core-utils/jq-json-serializer.d.ts +5 -0
  557. package/dist/lib/core-utils/jq-json-serializer.js +10 -0
  558. package/dist/lib/core-utils/qmd-reindex-after-sync.d.ts +14 -1
  559. package/dist/lib/core-utils/qmd-reindex-after-sync.js +101 -17
  560. package/dist/lib/core-utils/secret-patterns.d.ts +43 -0
  561. package/dist/lib/core-utils/secret-patterns.js +34 -0
  562. package/dist/lib/core-utils/sentry-report.d.ts +114 -0
  563. package/dist/lib/core-utils/sentry-report.js +1055 -0
  564. package/dist/lib/core-utils/soft-timeout.js +1 -1
  565. package/dist/lib/core-utils/timeout-guard-native.d.ts +7 -0
  566. package/dist/lib/core-utils/timeout-guard-native.js +40 -0
  567. package/dist/lib/core-utils/timeout-guard.d.ts +3 -3
  568. package/dist/lib/core-utils/timeout-guard.js +28 -13
  569. package/dist/lib/core-utils/token-usage-report.js +17 -3
  570. package/dist/lib/core-utils/worktree-resume.d.ts +20 -0
  571. package/dist/lib/core-utils/worktree-resume.js +1198 -0
  572. package/dist/lib/daemon/catalog.d.ts +134 -0
  573. package/dist/lib/daemon/catalog.js +358 -0
  574. package/dist/lib/daemon/config.d.ts +35 -0
  575. package/dist/lib/daemon/config.js +108 -0
  576. package/dist/lib/daemon/flag.d.ts +25 -0
  577. package/dist/lib/daemon/flag.js +59 -0
  578. package/dist/lib/daemon/handoff.d.ts +56 -0
  579. package/dist/lib/daemon/handoff.js +161 -0
  580. package/dist/lib/daemon/hq-cloud.d.ts +79 -0
  581. package/dist/lib/daemon/hq-cloud.js +183 -0
  582. package/dist/lib/daemon/install.d.ts +85 -0
  583. package/dist/lib/daemon/install.js +320 -0
  584. package/dist/lib/daemon/legacy-sync-env.d.ts +10 -0
  585. package/dist/lib/daemon/legacy-sync-env.js +58 -0
  586. package/dist/lib/daemon/legacy.d.ts +45 -0
  587. package/dist/lib/daemon/legacy.js +133 -0
  588. package/dist/lib/daemon/lock.d.ts +47 -0
  589. package/dist/lib/daemon/lock.js +138 -0
  590. package/dist/lib/daemon/machine-type.d.ts +50 -0
  591. package/dist/lib/daemon/machine-type.js +159 -0
  592. package/dist/lib/daemon/migrate.d.ts +77 -0
  593. package/dist/lib/daemon/migrate.js +265 -0
  594. package/dist/lib/daemon/paths.d.ts +24 -0
  595. package/dist/lib/daemon/paths.js +43 -0
  596. package/dist/lib/daemon/protocol-tail.d.ts +33 -0
  597. package/dist/lib/daemon/protocol-tail.js +131 -0
  598. package/dist/lib/daemon/remote-control.d.ts +74 -0
  599. package/dist/lib/daemon/remote-control.js +153 -0
  600. package/dist/lib/daemon/requests.d.ts +28 -0
  601. package/dist/lib/daemon/requests.js +65 -0
  602. package/dist/lib/daemon/run.d.ts +79 -0
  603. package/dist/lib/daemon/run.js +755 -0
  604. package/dist/lib/daemon/succession.d.ts +118 -0
  605. package/dist/lib/daemon/succession.js +263 -0
  606. package/dist/lib/daemon/supervisor.d.ts +132 -0
  607. package/dist/lib/daemon/supervisor.js +836 -0
  608. package/dist/lib/daemon/sync-runner.d.ts +58 -0
  609. package/dist/lib/daemon/sync-runner.js +277 -0
  610. package/dist/lib/daemon/tools.d.ts +52 -0
  611. package/dist/lib/daemon/tools.js +95 -0
  612. package/dist/lib/daemon/updater.d.ts +57 -0
  613. package/dist/lib/daemon/updater.js +163 -0
  614. package/dist/lib/db/control-plane.js +6 -0
  615. package/dist/lib/db/local.d.ts +0 -5
  616. package/dist/lib/db/local.js +1 -1
  617. package/dist/lib/db/migrate.d.ts +0 -12
  618. package/dist/lib/db/migrate.js +5 -5
  619. package/dist/lib/db/remote-sql.d.ts +2 -2
  620. package/dist/lib/db/remote-sql.js +3 -3
  621. package/dist/lib/db/sql.d.ts +0 -10
  622. package/dist/lib/db/sql.js +4 -8
  623. package/dist/lib/deploy-api.d.ts +5 -0
  624. package/dist/lib/deploy-api.js +21 -0
  625. package/dist/lib/deploy-apps.d.ts +13 -0
  626. package/dist/lib/deploy-apps.js +29 -0
  627. package/dist/lib/doctor/__testing__/fake-hq-tree.d.ts +1 -1
  628. package/dist/lib/doctor/__testing__/fake-hq-tree.js +1 -1
  629. package/dist/lib/doctor/__testing__/run-doctor.d.ts +8 -0
  630. package/dist/lib/doctor/__testing__/run-doctor.js +52 -0
  631. package/dist/lib/doctor/checks/bots.d.ts +13 -0
  632. package/dist/lib/doctor/checks/bots.js +189 -0
  633. package/dist/lib/doctor/checks/claude-wiring.js +70 -1
  634. package/dist/lib/doctor/checks/codex-wiring.d.ts +0 -4
  635. package/dist/lib/doctor/checks/codex-wiring.js +3 -35
  636. package/dist/lib/doctor/checks/grok-wiring.js +1 -34
  637. package/dist/lib/doctor/checks/integrations.js +11 -0
  638. package/dist/lib/doctor/checks/runtime-health.d.ts +4 -17
  639. package/dist/lib/doctor/checks/runtime-health.js +20 -7
  640. package/dist/lib/doctor/checks/scaffold-cli-floor.d.ts +6 -0
  641. package/dist/lib/doctor/checks/scaffold-cli-floor.js +73 -0
  642. package/dist/lib/doctor/checks/sync-health.d.ts +21 -0
  643. package/dist/lib/doctor/checks/sync-health.js +72 -2
  644. package/dist/lib/doctor/checks/sync-runtime.d.ts +11 -0
  645. package/dist/lib/doctor/checks/sync-runtime.js +216 -0
  646. package/dist/lib/doctor/checks/work-context.js +20 -6
  647. package/dist/lib/doctor/client-health-flag-token.d.ts +15 -0
  648. package/dist/lib/doctor/client-health-flag-token.js +66 -0
  649. package/dist/lib/doctor/client-health-reason-codes-flag.d.ts +27 -0
  650. package/dist/lib/doctor/client-health-reason-codes-flag.js +106 -0
  651. package/dist/lib/doctor/compat.d.ts +0 -16
  652. package/dist/lib/doctor/compat.js +4 -3
  653. package/dist/lib/doctor/deep/effects.js +1 -3
  654. package/dist/lib/doctor/deep/executor.d.ts +4 -10
  655. package/dist/lib/doctor/deep/executor.js +1 -1
  656. package/dist/lib/doctor/deep/parity.d.ts +2 -29
  657. package/dist/lib/doctor/deep/parity.js +7 -7
  658. package/dist/lib/doctor/deep/sandbox.d.ts +7 -25
  659. package/dist/lib/doctor/deep/sandbox.js +5 -7
  660. package/dist/lib/doctor/fix/apply.d.ts +79 -8
  661. package/dist/lib/doctor/fix/apply.js +292 -80
  662. package/dist/lib/doctor/fix/json-output.d.ts +28 -0
  663. package/dist/lib/doctor/fix/json-output.js +33 -0
  664. package/dist/lib/doctor/fix/refresh-sync-outcome.d.ts +12 -0
  665. package/dist/lib/doctor/fix/refresh-sync-outcome.js +25 -0
  666. package/dist/lib/doctor/fix/remediation.d.ts +14 -6
  667. package/dist/lib/doctor/fix/remediation.js +49 -9
  668. package/dist/lib/doctor/fixtures/schema.js +1 -3
  669. package/dist/lib/doctor/json-output.d.ts +17 -1
  670. package/dist/lib/doctor/json-output.js +7 -2
  671. package/dist/lib/doctor/platform.d.ts +0 -26
  672. package/dist/lib/doctor/platform.js +5 -5
  673. package/dist/lib/doctor/registry.d.ts +14 -0
  674. package/dist/lib/doctor/registry.js +71 -0
  675. package/dist/lib/doctor/report.js +1 -1
  676. package/dist/lib/doctor/shared.d.ts +8 -0
  677. package/dist/lib/doctor/shared.js +38 -0
  678. package/dist/lib/doctor/stray-gate-entries.d.ts +35 -0
  679. package/dist/lib/doctor/stray-gate-entries.js +83 -0
  680. package/dist/lib/doctor/types.d.ts +5 -0
  681. package/dist/lib/doctor/types.js +20 -0
  682. package/dist/lib/first-sync-next-step.d.ts +34 -0
  683. package/dist/lib/first-sync-next-step.js +179 -0
  684. package/dist/lib/flag-registry-endpoint.d.ts +5 -0
  685. package/dist/lib/flag-registry-endpoint.js +9 -0
  686. package/dist/lib/flag-registry-worker-source.generated.d.ts +2 -0
  687. package/dist/lib/flag-registry-worker-source.generated.js +3 -0
  688. package/dist/lib/flag-registry-worker.js +12 -1
  689. package/dist/lib/flag-registry.d.ts +26 -6
  690. package/dist/lib/flag-registry.js +133 -16
  691. package/dist/lib/flag-snapshot-file.d.ts +20 -0
  692. package/dist/lib/flag-snapshot-file.js +91 -0
  693. package/dist/lib/heartbeat-identity.d.ts +30 -0
  694. package/dist/lib/heartbeat-identity.js +76 -0
  695. package/dist/lib/index-render/companies.d.ts +4 -1
  696. package/dist/lib/index-render/companies.js +66 -3
  697. package/dist/lib/index-render/company-knowledge.js +80 -17
  698. package/dist/lib/index-render/index.d.ts +1 -0
  699. package/dist/lib/index-render/index.js +2 -1
  700. package/dist/lib/index-render/projects.js +82 -5
  701. package/dist/lib/index-render/shared.d.ts +13 -1
  702. package/dist/lib/index-render/shared.js +41 -2
  703. package/dist/lib/lanes/account-home.d.ts +8 -0
  704. package/dist/lib/lanes/account-home.js +10 -0
  705. package/dist/lib/lanes/accounts.d.ts +117 -0
  706. package/dist/lib/lanes/accounts.js +366 -0
  707. package/dist/lib/lanes/admission-host.d.ts +22 -0
  708. package/dist/lib/lanes/admission-host.js +37 -0
  709. package/dist/lib/lanes/admission.d.ts +26 -0
  710. package/dist/lib/lanes/admission.js +210 -0
  711. package/dist/lib/lanes/approval-gate.d.ts +8 -0
  712. package/dist/lib/lanes/approval-gate.js +90 -0
  713. package/dist/lib/lanes/autopilot-metrics.d.ts +99 -0
  714. package/dist/lib/lanes/autopilot-metrics.js +301 -0
  715. package/dist/lib/lanes/autopilot-registry.d.ts +62 -0
  716. package/dist/lib/lanes/autopilot-registry.js +192 -0
  717. package/dist/lib/lanes/autopilot.d.ts +133 -0
  718. package/dist/lib/lanes/autopilot.js +1222 -0
  719. package/dist/lib/lanes/blocker-freshness.d.ts +31 -0
  720. package/dist/lib/lanes/blocker-freshness.js +168 -0
  721. package/dist/lib/lanes/checked-company-path.d.ts +3 -0
  722. package/dist/lib/lanes/checked-company-path.js +39 -0
  723. package/dist/lib/lanes/claude-balance.d.ts +97 -0
  724. package/dist/lib/lanes/claude-balance.js +319 -0
  725. package/dist/lib/lanes/compaction.d.ts +110 -0
  726. package/dist/lib/lanes/compaction.js +293 -0
  727. package/dist/lib/lanes/config.d.ts +94 -0
  728. package/dist/lib/lanes/config.js +606 -0
  729. package/dist/lib/lanes/constants.d.ts +3 -0
  730. package/dist/lib/lanes/constants.js +3 -0
  731. package/dist/lib/lanes/delivery-core.d.ts +15 -0
  732. package/dist/lib/lanes/delivery-core.js +21 -0
  733. package/dist/lib/lanes/delivery.d.ts +180 -0
  734. package/dist/lib/lanes/delivery.js +443 -0
  735. package/dist/lib/lanes/disk-guard.d.ts +66 -0
  736. package/dist/lib/lanes/disk-guard.js +172 -0
  737. package/dist/lib/lanes/dropbox.d.ts +129 -0
  738. package/dist/lib/lanes/dropbox.js +601 -0
  739. package/dist/lib/lanes/effort.d.ts +51 -0
  740. package/dist/lib/lanes/effort.js +113 -0
  741. package/dist/lib/lanes/envelope-repair-dispatch.d.ts +26 -0
  742. package/dist/lib/lanes/envelope-repair-dispatch.js +74 -0
  743. package/dist/lib/lanes/errors.d.ts +39 -0
  744. package/dist/lib/lanes/errors.js +72 -0
  745. package/dist/lib/lanes/flag-keys.d.ts +22 -0
  746. package/dist/lib/lanes/flag-keys.js +22 -0
  747. package/dist/lib/lanes/grants.d.ts +30 -0
  748. package/dist/lib/lanes/grants.js +171 -0
  749. package/dist/lib/lanes/hire-grant-dispatch.d.ts +29 -0
  750. package/dist/lib/lanes/hire-grant-dispatch.js +315 -0
  751. package/dist/lib/lanes/hooks-install.d.ts +82 -0
  752. package/dist/lib/lanes/hooks-install.js +479 -0
  753. package/dist/lib/lanes/host-capacity.d.ts +69 -0
  754. package/dist/lib/lanes/host-capacity.js +254 -0
  755. package/dist/lib/lanes/hq-root.d.ts +19 -0
  756. package/dist/lib/lanes/hq-root.js +28 -0
  757. package/dist/lib/lanes/index.d.ts +76 -0
  758. package/dist/lib/lanes/index.js +42 -0
  759. package/dist/lib/lanes/keep-alive-audit.d.ts +46 -0
  760. package/dist/lib/lanes/keep-alive-audit.js +370 -0
  761. package/dist/lib/lanes/keep-alive.d.ts +68 -0
  762. package/dist/lib/lanes/keep-alive.js +343 -0
  763. package/dist/lib/lanes/kr-freshness.d.ts +76 -0
  764. package/dist/lib/lanes/kr-freshness.js +413 -0
  765. package/dist/lib/lanes/lane-company.d.ts +10 -0
  766. package/dist/lib/lanes/lane-company.js +41 -0
  767. package/dist/lib/lanes/liveness.d.ts +108 -0
  768. package/dist/lib/lanes/liveness.js +396 -0
  769. package/dist/lib/lanes/machine-identity.d.ts +34 -0
  770. package/dist/lib/lanes/machine-identity.js +92 -0
  771. package/dist/lib/lanes/manager-status-gate.d.ts +17 -0
  772. package/dist/lib/lanes/manager-status-gate.js +133 -0
  773. package/dist/lib/lanes/merge-command.d.ts +15 -0
  774. package/dist/lib/lanes/merge-command.js +629 -0
  775. package/dist/lib/lanes/mesh-events.d.ts +127 -0
  776. package/dist/lib/lanes/mesh-events.js +564 -0
  777. package/dist/lib/lanes/message-replay.d.ts +21 -0
  778. package/dist/lib/lanes/message-replay.js +122 -0
  779. package/dist/lib/lanes/models.d.ts +86 -0
  780. package/dist/lib/lanes/models.js +234 -0
  781. package/dist/lib/lanes/monitor.d.ts +48 -0
  782. package/dist/lib/lanes/monitor.js +428 -0
  783. package/dist/lib/lanes/move-account.d.ts +56 -0
  784. package/dist/lib/lanes/move-account.js +193 -0
  785. package/dist/lib/lanes/orphans.d.ts +25 -0
  786. package/dist/lib/lanes/orphans.js +102 -0
  787. package/dist/lib/lanes/outpost-dispatch.d.ts +147 -0
  788. package/dist/lib/lanes/outpost-dispatch.js +271 -0
  789. package/dist/lib/lanes/outpost-hire-cache.d.ts +22 -0
  790. package/dist/lib/lanes/outpost-hire-cache.js +153 -0
  791. package/dist/lib/lanes/outpost-identity.d.ts +33 -0
  792. package/dist/lib/lanes/outpost-identity.js +59 -0
  793. package/dist/lib/lanes/outpost-profile-repin.d.ts +17 -0
  794. package/dist/lib/lanes/outpost-profile-repin.js +84 -0
  795. package/dist/lib/lanes/outpost-pruner-install.d.ts +37 -0
  796. package/dist/lib/lanes/outpost-pruner-install.js +238 -0
  797. package/dist/lib/lanes/outpost-registry-worker-approval.d.ts +18 -0
  798. package/dist/lib/lanes/outpost-registry-worker-approval.js +109 -0
  799. package/dist/lib/lanes/outpost-snapshot-memo.d.ts +6 -0
  800. package/dist/lib/lanes/outpost-snapshot-memo.js +14 -0
  801. package/dist/lib/lanes/outpost-worktree-pruner-flag.d.ts +19 -0
  802. package/dist/lib/lanes/outpost-worktree-pruner-flag.js +86 -0
  803. package/dist/lib/lanes/outpost-worktree-pruner.d.ts +62 -0
  804. package/dist/lib/lanes/outpost-worktree-pruner.js +1201 -0
  805. package/dist/lib/lanes/profile.d.ts +69 -0
  806. package/dist/lib/lanes/profile.js +552 -0
  807. package/dist/lib/lanes/provider-rejection.d.ts +86 -0
  808. package/dist/lib/lanes/provider-rejection.js +286 -0
  809. package/dist/lib/lanes/questions.d.ts +90 -0
  810. package/dist/lib/lanes/questions.js +384 -0
  811. package/dist/lib/lanes/quota.d.ts +134 -0
  812. package/dist/lib/lanes/quota.js +471 -0
  813. package/dist/lib/lanes/reconcile-install.d.ts +90 -0
  814. package/dist/lib/lanes/reconcile-install.js +257 -0
  815. package/dist/lib/lanes/reconcile.d.ts +161 -0
  816. package/dist/lib/lanes/reconcile.js +3343 -0
  817. package/dist/lib/lanes/registry-flag.d.ts +35 -0
  818. package/dist/lib/lanes/registry-flag.js +164 -0
  819. package/dist/lib/lanes/registry-persona.d.ts +20 -0
  820. package/dist/lib/lanes/registry-persona.js +329 -0
  821. package/dist/lib/lanes/registry.d.ts +122 -0
  822. package/dist/lib/lanes/registry.js +570 -0
  823. package/dist/lib/lanes/reviews.d.ts +38 -0
  824. package/dist/lib/lanes/reviews.js +395 -0
  825. package/dist/lib/lanes/runaway-tool-guard.d.ts +38 -0
  826. package/dist/lib/lanes/runaway-tool-guard.js +284 -0
  827. package/dist/lib/lanes/session-relink.d.ts +25 -0
  828. package/dist/lib/lanes/session-relink.js +216 -0
  829. package/dist/lib/lanes/spawn.d.ts +355 -0
  830. package/dist/lib/lanes/spawn.js +2668 -0
  831. package/dist/lib/lanes/ssm-command-context.d.ts +12 -0
  832. package/dist/lib/lanes/ssm-command-context.js +52 -0
  833. package/dist/lib/lanes/store.d.ts +91 -0
  834. package/dist/lib/lanes/store.js +1822 -0
  835. package/dist/lib/lanes/stories.d.ts +23 -0
  836. package/dist/lib/lanes/stories.js +92 -0
  837. package/dist/lib/lanes/story-ledger.d.ts +80 -0
  838. package/dist/lib/lanes/story-ledger.js +815 -0
  839. package/dist/lib/lanes/story-switch.d.ts +21 -0
  840. package/dist/lib/lanes/story-switch.js +75 -0
  841. package/dist/lib/lanes/text-scan.d.ts +11 -0
  842. package/dist/lib/lanes/text-scan.js +103 -0
  843. package/dist/lib/lanes/throttle.d.ts +116 -0
  844. package/dist/lib/lanes/throttle.js +437 -0
  845. package/dist/lib/lanes/timestamp.d.ts +3 -0
  846. package/dist/lib/lanes/timestamp.js +26 -0
  847. package/dist/lib/lanes/tracker-checks.d.ts +77 -0
  848. package/dist/lib/lanes/tracker-checks.js +134 -0
  849. package/dist/lib/lanes/tracker-report-state.d.ts +10 -0
  850. package/dist/lib/lanes/tracker-report-state.js +124 -0
  851. package/dist/lib/lanes/tracker-report.d.ts +203 -0
  852. package/dist/lib/lanes/tracker-report.js +522 -0
  853. package/dist/lib/lanes/tracker-store.d.ts +18 -0
  854. package/dist/lib/lanes/tracker-store.js +106 -0
  855. package/dist/lib/lanes/types.d.ts +1030 -0
  856. package/dist/lib/lanes/types.js +418 -0
  857. package/dist/lib/lanes/wait.d.ts +39 -0
  858. package/dist/lib/lanes/wait.js +159 -0
  859. package/dist/lib/lanes/watch.d.ts +39 -0
  860. package/dist/lib/lanes/watch.js +249 -0
  861. package/dist/lib/lanes/watcher-main.d.ts +11 -0
  862. package/dist/lib/lanes/watcher-main.js +108 -0
  863. package/dist/lib/lanes/watcher.d.ts +287 -0
  864. package/dist/lib/lanes/watcher.js +1972 -0
  865. package/dist/lib/mesh/api.d.ts +103 -10
  866. package/dist/lib/mesh/api.js +334 -64
  867. package/dist/lib/mesh/client.d.ts +3 -2
  868. package/dist/lib/mesh/client.js +26 -7
  869. package/dist/lib/mesh/denial-codes.d.ts +5 -0
  870. package/dist/lib/mesh/denial-codes.js +14 -0
  871. package/dist/lib/mesh/live/backfill-held.d.ts +67 -16
  872. package/dist/lib/mesh/live/backfill-held.js +415 -61
  873. package/dist/lib/mesh/live/backoff.d.ts +2 -2
  874. package/dist/lib/mesh/live/backoff.js +16 -3
  875. package/dist/lib/mesh/live/daemon/board-refresh.d.ts +7 -1
  876. package/dist/lib/mesh/live/daemon/board-refresh.js +78 -30
  877. package/dist/lib/mesh/live/daemon/config.d.ts +36 -0
  878. package/dist/lib/mesh/live/daemon/config.js +120 -0
  879. package/dist/lib/mesh/live/daemon/credentials.d.ts +64 -10
  880. package/dist/lib/mesh/live/daemon/credentials.js +270 -20
  881. package/dist/lib/mesh/live/daemon/doctor.d.ts +53 -0
  882. package/dist/lib/mesh/live/daemon/doctor.js +190 -6
  883. package/dist/lib/mesh/live/daemon/index.d.ts +13 -10
  884. package/dist/lib/mesh/live/daemon/index.js +7 -6
  885. package/dist/lib/mesh/live/daemon/install.d.ts +255 -1
  886. package/dist/lib/mesh/live/daemon/install.js +811 -13
  887. package/dist/lib/mesh/live/daemon/legacy-listen.d.ts +43 -0
  888. package/dist/lib/mesh/live/daemon/legacy-listen.js +89 -0
  889. package/dist/lib/mesh/live/daemon/live-cache.d.ts +26 -0
  890. package/dist/lib/mesh/live/daemon/live-cache.js +116 -0
  891. package/dist/lib/mesh/live/daemon/mqtt-events.d.ts +7 -0
  892. package/dist/lib/mesh/live/daemon/mqtt-events.js +2 -0
  893. package/dist/lib/mesh/live/daemon/mqtt-events.test-d.d.ts +2 -0
  894. package/dist/lib/mesh/live/daemon/mqtt-events.test-d.js +10 -0
  895. package/dist/lib/mesh/live/daemon/paths.d.ts +2 -0
  896. package/dist/lib/mesh/live/daemon/paths.js +2 -0
  897. package/dist/lib/mesh/live/daemon/presence.d.ts +24 -5
  898. package/dist/lib/mesh/live/daemon/presence.js +79 -10
  899. package/dist/lib/mesh/live/daemon/run.d.ts +48 -2
  900. package/dist/lib/mesh/live/daemon/run.js +485 -33
  901. package/dist/lib/mesh/live/daemon/state.d.ts +19 -2
  902. package/dist/lib/mesh/live/daemon/state.js +34 -2
  903. package/dist/lib/mesh/live/daemon/transcript-watch.d.ts +45 -9
  904. package/dist/lib/mesh/live/daemon/transcript-watch.js +227 -31
  905. package/dist/lib/mesh/live/daemon/version-drift.d.ts +5 -0
  906. package/dist/lib/mesh/live/daemon/version-drift.js +47 -0
  907. package/dist/lib/mesh/live/daemon/work-subscribe.d.ts +32 -0
  908. package/dist/lib/mesh/live/daemon/work-subscribe.js +262 -0
  909. package/dist/lib/mesh/live/emit-client.d.ts +8 -0
  910. package/dist/lib/mesh/live/emit-client.js +23 -8
  911. package/dist/lib/mesh/live/emit-evidence.d.ts +19 -0
  912. package/dist/lib/mesh/live/emit-evidence.js +20 -2
  913. package/dist/lib/mesh/live/emit.d.ts +9 -0
  914. package/dist/lib/mesh/live/emit.js +28 -2
  915. package/dist/lib/mesh/live/enqueue.d.ts +5 -0
  916. package/dist/lib/mesh/live/enqueue.js +19 -0
  917. package/dist/lib/mesh/live/flush.d.ts +17 -5
  918. package/dist/lib/mesh/live/flush.js +391 -38
  919. package/dist/lib/mesh/live/format-spool-line.d.ts +5 -2
  920. package/dist/lib/mesh/live/format-spool-line.js +10 -0
  921. package/dist/lib/mesh/live/paths.d.ts +2 -0
  922. package/dist/lib/mesh/live/paths.js +4 -0
  923. package/dist/lib/mesh/live/report-summary.d.ts +45 -0
  924. package/dist/lib/mesh/live/report-summary.js +234 -0
  925. package/dist/lib/mesh/live/session-event.schema.json +24 -1
  926. package/dist/lib/mesh/live/session-events-client.d.ts +2 -0
  927. package/dist/lib/mesh/live/session-events-client.js +26 -0
  928. package/dist/lib/mesh/live/session-seq.d.ts +4 -0
  929. package/dist/lib/mesh/live/session-seq.js +33 -0
  930. package/dist/lib/mesh/live/spool.d.ts +19 -0
  931. package/dist/lib/mesh/live/spool.js +269 -3
  932. package/dist/lib/mesh/live/validate-session-event.d.ts +1 -1
  933. package/dist/lib/mesh/live/validate-session-event.js +1 -1
  934. package/dist/lib/mesh/project-board.d.ts +65 -0
  935. package/dist/lib/mesh/project-board.js +181 -0
  936. package/dist/lib/mesh/story-status.d.ts +22 -0
  937. package/dist/lib/mesh/story-status.js +49 -0
  938. package/dist/lib/monitor.d.ts +149 -0
  939. package/dist/lib/monitor.js +519 -0
  940. package/dist/lib/node-binary.d.ts +50 -0
  941. package/dist/lib/node-binary.js +133 -0
  942. package/dist/lib/notify-recipient.d.ts +7 -0
  943. package/dist/lib/notify-recipient.js +11 -0
  944. package/dist/lib/onboarding/checkpoint.d.ts +13 -0
  945. package/dist/lib/onboarding/checkpoint.js +44 -0
  946. package/dist/lib/onboarding/cli/onboard.d.ts +53 -0
  947. package/dist/lib/onboarding/cli/onboard.js +135 -0
  948. package/dist/lib/onboarding/cli/prompts.d.ts +28 -0
  949. package/dist/lib/onboarding/cli/prompts.js +83 -0
  950. package/dist/lib/onboarding/errors.d.ts +34 -0
  951. package/dist/lib/onboarding/errors.js +59 -0
  952. package/dist/lib/onboarding/index.d.ts +13 -0
  953. package/dist/lib/onboarding/index.js +13 -0
  954. package/dist/lib/onboarding/orchestrator.d.ts +47 -0
  955. package/dist/lib/onboarding/orchestrator.js +569 -0
  956. package/dist/lib/onboarding/types.d.ts +79 -0
  957. package/dist/lib/onboarding/types.js +8 -0
  958. package/dist/lib/plan-limit-nag.d.ts +102 -6
  959. package/dist/lib/plan-limit-nag.js +348 -43
  960. package/dist/lib/policy-validator.d.ts +7 -0
  961. package/dist/lib/policy-validator.js +187 -0
  962. package/dist/lib/process-flag-company-context.d.ts +8 -0
  963. package/dist/lib/process-flag-company-context.js +67 -0
  964. package/dist/lib/report-publish.d.ts +175 -0
  965. package/dist/lib/report-publish.js +421 -0
  966. package/dist/lib/report-run.d.ts +62 -0
  967. package/dist/lib/report-run.js +123 -0
  968. package/dist/lib/report-snapshot.d.ts +12 -0
  969. package/dist/lib/report-snapshot.js +135 -0
  970. package/dist/lib/report-templates.d.ts +9 -0
  971. package/dist/lib/report-templates.js +21 -0
  972. package/dist/lib/scaffold-cli-floor.d.ts +8 -0
  973. package/dist/lib/scaffold-cli-floor.js +50 -0
  974. package/dist/lib/scan-packages/index.d.ts +2 -0
  975. package/dist/lib/scan-packages/index.js +168 -6
  976. package/dist/lib/search-index/background.d.ts +8 -1
  977. package/dist/lib/search-index/background.js +55 -200
  978. package/dist/lib/search-index/collection-path-repair-flag.d.ts +4 -0
  979. package/dist/lib/search-index/collection-path-repair-flag.js +7 -0
  980. package/dist/lib/search-index/embed-lock.d.ts +34 -0
  981. package/dist/lib/search-index/embed-lock.js +295 -0
  982. package/dist/lib/search-index/index.d.ts +12 -0
  983. package/dist/lib/search-index/index.js +153 -7
  984. package/dist/lib/search-index/load-gate.d.ts +57 -0
  985. package/dist/lib/search-index/load-gate.js +270 -0
  986. package/dist/lib/search-index/max-doc-bytes.d.ts +219 -0
  987. package/dist/lib/search-index/max-doc-bytes.js +463 -0
  988. package/dist/lib/search-index/qmd-exit-diagnostics.d.ts +5 -0
  989. package/dist/lib/search-index/qmd-exit-diagnostics.js +40 -0
  990. package/dist/lib/search-index/reindex-single-flight-flag.d.ts +5 -0
  991. package/dist/lib/search-index/reindex-single-flight-flag.js +8 -0
  992. package/dist/lib/service-manager/index.d.ts +42 -0
  993. package/dist/lib/service-manager/index.js +105 -0
  994. package/dist/lib/service-manager/launchd.d.ts +81 -0
  995. package/dist/lib/service-manager/launchd.js +212 -0
  996. package/dist/lib/service-manager/systemd.d.ts +19 -0
  997. package/dist/lib/service-manager/systemd.js +72 -0
  998. package/dist/lib/service-manager/types.d.ts +34 -0
  999. package/dist/lib/service-manager/types.js +26 -0
  1000. package/dist/lib/test-utils/isolated-flag-company-context.d.ts +3 -0
  1001. package/dist/lib/test-utils/isolated-flag-company-context.js +18 -0
  1002. package/dist/lib/work-context/bind-best.d.ts +66 -0
  1003. package/dist/lib/work-context/bind-best.js +344 -0
  1004. package/dist/lib/work-context/bind-calling-session.d.ts +26 -0
  1005. package/dist/lib/work-context/bind-calling-session.js +63 -0
  1006. package/dist/lib/work-context/company-rebind.d.ts +23 -0
  1007. package/dist/lib/work-context/company-rebind.js +59 -0
  1008. package/dist/lib/work-context/company.d.ts +22 -20
  1009. package/dist/lib/work-context/company.js +124 -40
  1010. package/dist/lib/work-context/config.d.ts +58 -11
  1011. package/dist/lib/work-context/config.js +334 -83
  1012. package/dist/lib/work-context/contract.d.ts +13 -0
  1013. package/dist/lib/work-context/contract.schema.json +3 -1
  1014. package/dist/lib/work-context/default-company.d.ts +43 -0
  1015. package/dist/lib/work-context/default-company.js +83 -0
  1016. package/dist/lib/work-context/outbox-quarantine-status-flag.d.ts +4 -0
  1017. package/dist/lib/work-context/outbox-quarantine-status-flag.js +7 -0
  1018. package/dist/lib/work-context/outbox.d.ts +27 -5
  1019. package/dist/lib/work-context/outbox.js +135 -6
  1020. package/dist/lib/work-context/prd-sync.d.ts +56 -0
  1021. package/dist/lib/work-context/prd-sync.js +197 -0
  1022. package/dist/lib/work-context/preflight-contract.d.ts +28 -0
  1023. package/dist/lib/work-context/preflight-contract.js +85 -0
  1024. package/dist/lib/work-context/prompt-rebind.d.ts +25 -0
  1025. package/dist/lib/work-context/prompt-rebind.js +85 -0
  1026. package/dist/lib/work-context/reconcile.d.ts +15 -0
  1027. package/dist/lib/work-context/reconcile.js +405 -29
  1028. package/dist/lib/work-context/state.d.ts +93 -10
  1029. package/dist/lib/work-context/state.js +342 -29
  1030. package/dist/lib/work-context/windows-acl.d.ts +123 -0
  1031. package/dist/lib/work-context/windows-acl.js +425 -0
  1032. package/dist/lib/workers-registry/index.js +62 -8
  1033. package/dist/lib/workers-registry/read.d.ts +15 -0
  1034. package/dist/lib/workers-registry/read.js +17 -0
  1035. package/dist/main.d.ts +32 -0
  1036. package/dist/main.js +273 -73
  1037. package/dist/native-fast-route.d.ts +7 -0
  1038. package/dist/native-fast-route.js +45 -0
  1039. package/dist/node-network-compat-core.d.ts +12 -0
  1040. package/dist/node-network-compat-core.js +41 -0
  1041. package/dist/node-network-compat-fast.d.ts +7 -0
  1042. package/dist/node-network-compat-fast.js +23 -0
  1043. package/dist/node-network-compat.d.ts +2 -30
  1044. package/dist/node-network-compat.js +4 -51
  1045. package/dist/node-preflight.d.ts +7 -1
  1046. package/dist/node-preflight.js +5 -5
  1047. package/dist/register-all.d.ts +4 -29
  1048. package/dist/register-all.js +4 -233
  1049. package/dist/run/discover-schemas.d.ts +2 -1
  1050. package/dist/run/env-graph-guard.d.ts +2 -2
  1051. package/dist/run/env-graph-guard.js +5 -2
  1052. package/dist/run/hq-plugin.d.ts +4 -0
  1053. package/dist/run/hq-plugin.js +36 -8
  1054. package/dist/secrets-env-fast-path.d.ts +5 -0
  1055. package/dist/secrets-env-fast-path.js +16 -0
  1056. package/dist/secrets-env-fast-route.d.ts +18 -0
  1057. package/dist/secrets-env-fast-route.js +54 -0
  1058. package/dist/sentry-before-send.js +80 -0
  1059. package/dist/sentry.d.ts +16 -4
  1060. package/dist/sentry.js +179 -18
  1061. package/dist/startup-registration.d.ts +26 -2
  1062. package/dist/startup-registration.js +116 -15
  1063. package/dist/utils/checkpoint-stamp-write-error.d.ts +28 -0
  1064. package/dist/utils/checkpoint-stamp-write-error.js +99 -0
  1065. package/dist/utils/cli-network-lifecycle.d.ts +4 -0
  1066. package/dist/utils/cli-network-lifecycle.js +11 -0
  1067. package/dist/utils/cli-telemetry.d.ts +75 -1
  1068. package/dist/utils/cli-telemetry.js +433 -7
  1069. package/dist/utils/client-health.d.ts +0 -4
  1070. package/dist/utils/client-health.js +2 -2
  1071. package/dist/utils/cognito-refresh-sentry.d.ts +3 -0
  1072. package/dist/utils/cognito-refresh-sentry.js +49 -0
  1073. package/dist/utils/cognito-session.d.ts +71 -0
  1074. package/dist/utils/cognito-session.js +481 -27
  1075. package/dist/utils/console-origin.d.ts +9 -0
  1076. package/dist/utils/console-origin.js +28 -0
  1077. package/dist/utils/contribution-table.d.ts +1 -1
  1078. package/dist/utils/core-eval-trigger.d.ts +4 -0
  1079. package/dist/utils/core-eval-trigger.js +88 -0
  1080. package/dist/utils/environmental-error.d.ts +18 -0
  1081. package/dist/utils/environmental-error.js +240 -7
  1082. package/dist/utils/exclusive-lock.d.ts +32 -0
  1083. package/dist/utils/exclusive-lock.js +75 -0
  1084. package/dist/utils/expected-cli-error.d.ts +2 -0
  1085. package/dist/utils/expected-cli-error.js +4 -0
  1086. package/dist/utils/fast-stream-errors.d.ts +12 -0
  1087. package/dist/utils/fast-stream-errors.js +18 -0
  1088. package/dist/utils/feedback-diagnostics.d.ts +2 -1
  1089. package/dist/utils/feedback-log-bundle.d.ts +51 -26
  1090. package/dist/utils/feedback-log-bundle.js +211 -31
  1091. package/dist/utils/feedback-logs.d.ts +18 -47
  1092. package/dist/utils/feedback-logs.js +50 -21
  1093. package/dist/utils/feedback-screenshots.d.ts +0 -1
  1094. package/dist/utils/feedback-screenshots.js +1 -1
  1095. package/dist/utils/files-browse-acl.d.ts +5 -0
  1096. package/dist/utils/files-browse-acl.js +11 -0
  1097. package/dist/utils/hq-core-yaml.d.ts +10 -0
  1098. package/dist/utils/hq-core-yaml.js +40 -0
  1099. package/dist/utils/hq-root-resolver.d.ts +13 -0
  1100. package/dist/utils/hq-root-resolver.js +103 -0
  1101. package/dist/utils/hq-roots.d.ts +25 -2
  1102. package/dist/utils/hq-roots.js +67 -7
  1103. package/dist/utils/incomplete-install-error.d.ts +87 -19
  1104. package/dist/utils/incomplete-install-error.js +319 -68
  1105. package/dist/utils/install-tree-torn.d.ts +260 -24
  1106. package/dist/utils/install-tree-torn.js +998 -51
  1107. package/dist/utils/large-file-guard.d.ts +0 -10
  1108. package/dist/utils/large-file-guard.js +1 -1
  1109. package/dist/utils/local-files-overview.d.ts +4 -8
  1110. package/dist/utils/local-files-overview.js +48 -7
  1111. package/dist/utils/login-provider.d.ts +7 -0
  1112. package/dist/utils/login-provider.js +34 -0
  1113. package/dist/utils/pack-contributions.d.ts +2 -14
  1114. package/dist/utils/pack-contributions.js +7 -44
  1115. package/dist/utils/package-root-diagnostics.d.ts +1 -1
  1116. package/dist/utils/people.d.ts +7 -11
  1117. package/dist/utils/people.js +5 -20
  1118. package/dist/utils/plan-gate-error.d.ts +52 -10
  1119. package/dist/utils/plan-gate-error.js +364 -41
  1120. package/dist/utils/qmd-model-download-error.d.ts +0 -8
  1121. package/dist/utils/qmd-model-download-error.js +1 -1
  1122. package/dist/utils/qmd-query-document-error.d.ts +0 -6
  1123. package/dist/utils/qmd-query-document-error.js +1 -1
  1124. package/dist/utils/redact-error-text.d.ts +0 -2
  1125. package/dist/utils/redact-error-text.js +3 -2
  1126. package/dist/utils/redact-url.d.ts +14 -0
  1127. package/dist/utils/redact-url.js +218 -0
  1128. package/dist/utils/run-bundled-script.d.ts +6 -0
  1129. package/dist/utils/run-bundled-script.js +117 -4
  1130. package/dist/utils/sandbox-runner-client.d.ts +2 -1
  1131. package/dist/utils/scaffold-fast-import-guard.d.ts +2 -0
  1132. package/dist/utils/scaffold-fast-import-guard.js +40 -0
  1133. package/dist/utils/scaffold-packlist-guard.d.ts +7 -0
  1134. package/dist/utils/scaffold-packlist-guard.js +23 -0
  1135. package/dist/utils/scaffold-sibling-references.d.ts +22 -0
  1136. package/dist/utils/scaffold-sibling-references.js +156 -0
  1137. package/dist/utils/secret-load-availability.d.ts +8 -0
  1138. package/dist/utils/secret-load-availability.js +54 -0
  1139. package/dist/utils/secrets-cache.d.ts +7 -3
  1140. package/dist/utils/secrets-cache.js +162 -14
  1141. package/dist/utils/self-update.d.ts +34 -1
  1142. package/dist/utils/self-update.js +660 -42
  1143. package/dist/utils/sentry-fingerprint.d.ts +23 -1
  1144. package/dist/utils/sentry-fingerprint.js +223 -31
  1145. package/dist/utils/staged-install.d.ts +34 -0
  1146. package/dist/utils/staged-install.js +346 -0
  1147. package/dist/utils/staged-npm-install.d.ts +16 -0
  1148. package/dist/utils/staged-npm-install.js +264 -0
  1149. package/dist/utils/sync-log-sources.d.ts +15 -0
  1150. package/dist/utils/sync-log-sources.js +36 -0
  1151. package/dist/utils/table-width.d.ts +7 -0
  1152. package/dist/utils/table-width.js +15 -0
  1153. package/dist/utils/team-upgrade.d.ts +1 -1
  1154. package/dist/utils/team-upgrade.js +4 -3
  1155. package/dist/utils/update-command-supervisor.cjs +247 -0
  1156. package/dist/utils/upload-author.d.ts +15 -0
  1157. package/dist/utils/upload-author.js +39 -0
  1158. package/dist/utils/vault-api.d.ts +21 -1
  1159. package/dist/utils/vault-api.js +251 -84
  1160. package/dist/utils/version-check.d.ts +11 -1
  1161. package/dist/utils/version-check.js +32 -3
  1162. package/dist/utils/version-gate.d.ts +101 -17
  1163. package/dist/utils/version-gate.js +645 -70
  1164. package/dist/utils/version-report.d.ts +27 -0
  1165. package/dist/utils/version-report.js +105 -0
  1166. package/dist/utils/windows-spawn.d.ts +6 -0
  1167. package/dist/utils/windows-spawn.js +37 -0
  1168. package/dist/version-request.d.ts +14 -0
  1169. package/dist/version-request.js +36 -0
  1170. package/package.json +20 -8
  1171. package/scripts/mesh-daemon-if-stale.mjs +20 -0
  1172. package/templates/reports/blank.md +3 -0
  1173. package/templates/reports/daily-digest.md +11 -0
  1174. package/templates/runbooks/update-report.md +21 -0
  1175. package/dist/commands/scaffold-fast.d.ts +0 -41
  1176. package/dist/commands/scaffold-fast.js +0 -57
  1177. package/dist/lib/work-context/index.d.ts +0 -25
  1178. package/dist/lib/work-context/index.js +0 -21
@@ -0,0 +1,1219 @@
1
+ /** Native implementations of the second Wave 1 delegate command family. */
2
+ import { createHash } from "node:crypto";
3
+ import * as fs from "node:fs";
4
+ import * as os from "node:os";
5
+ import * as path from "node:path";
6
+ import { serializeJqJson } from "../lib/core-utils/jq-json-serializer.js";
7
+ import { matchingSecretPatterns } from "../lib/core-utils/secret-patterns.js";
8
+ import { describeCoreCommand } from "./core-command-catalog.js";
9
+ import { commandExists, isRecord, jsonAt, jqFallback, jqRawPath, jqRawPaths, moveFile, readJsonFile, subprocess, writeJsonAtomically, } from "./core-delegate.js";
10
+ import { resolveLiveRoot } from "../utils/hq-roots.js";
11
+ import { ACL_SOURCE_DISPLAY_LABELS } from "../utils/files-browse-acl.js";
12
+ import { runBundledScript } from "../utils/run-bundled-script.js";
13
+ const FLAG = "core-native-delegate";
14
+ const ASSETS = {
15
+ bundle: "core/scripts/hq-delegate-bundle.sh",
16
+ grant: "core/scripts/hq-delegate-grant.sh",
17
+ publish: "core/scripts/hq-delegate-publish.sh",
18
+ send: "core/scripts/hq-delegate-send.sh",
19
+ verify: "core/scripts/hq-delegate-verify.sh",
20
+ };
21
+ const DESCRIPTIONS = {
22
+ bundle: "Build a portable delegation bundle",
23
+ grant: "Grant and verify delegation vault access",
24
+ publish: "Publish canonical delegation files",
25
+ send: "Generate or send the delegation pickup prompt",
26
+ verify: "Probe delegation access and publish the handoff",
27
+ };
28
+ const USAGE = {
29
+ bundle: "hq-delegate-bundle.sh — freeze a project into a portable delegation bundle.\n\nUsage:\n core/scripts/hq-delegate-bundle.sh build \\\n --company <slug> --project <name> --to <principal> \\\n [--to-kind person|agent] [--to-name <display name>] \\\n [--mode transfer|share] [--dry-run]\n\n--dry-run prints the manifest JSON to stdout and writes nothing.\n\nWrites workspace/delegations/<delegationId>/{manifest.json,BRIEF.md} and\n",
30
+ grant: "hq-delegate-grant.sh — materialize a delegation's dossier in the vault and\nwrite the ACL grants its manifest declares, verifying each one landed.\n\nUsage:\n core/scripts/hq-delegate-grant.sh --manifest <path> [--yes]\n\nWithout --yes: prints the full grant plan (prefix, principal, permission —\nthe write grant is a privilege escalation and needs explicit confirmation)\nand exits 2 without mutating anything. The caller (the /delegate skill)\nconfirms with the user, then re-invokes with --yes.\n\nWith --yes:\n 1. hq sync push the project directory so the vault prefix exists\n 2. hq files share each manifest vaultPrefix to the recipient\n 3. read each grant back with hq files acl and match grantee + permission\n 4. advance manifest status building -> granted, stamping verifiedAt\n\nDirect ACL grants ONLY — this helper never mints a share-session URL\n(policy hq-delegate-never-inlines-secrets-or-share-urls).\n\nIdempotent: a prefix whose grant already exists is reported, not an error.\nA failed read-back exits non-zero and leaves manifest status unchanged.\n\n",
31
+ send: "hq-delegate-send.sh — generate the self-sufficient pickup prompt for a\ndelegation and deliver it by DM. The prompt IS the handoff: pasted into a\nfresh agent session on a clean HQ install, it pulls every file on demand\n(hq files get per prefix — no /hq-sync run) and reaches the first\nnext-step with no follow-up question to the delegator.\n\nUsage:\n core/scripts/hq-delegate-send.sh --manifest <path> [--send]\n [--headline <text>] [--note <text>]\n\nWithout --send: (re)generates PICKUP-PROMPT.md next to the manifest and\nprints its path — inspectable, idempotent, sends nothing.\nWith --send: requires manifest status \"verified\" (the US-008 probe must\nhave passed), then delivers ONE `hq dm` with --prompt-file/--details-file\nand advances status to \"sent\", recording the DM eventId.\n\nThe caller (the /delegate skill) humanizes --headline / --note per\ncore/knowledge/public/hq-core/humanize-before-send.md (channel dm, light)\nBEFORE invoking; this helper never rewrites recipients, flags, or the\ngenerated command lines.\n\nFail-closed: the generated prompt is scanned for secret-shaped content and\nshare-session URLs; a match aborts before anything is written or sent\n(policy hq-delegate-never-inlines-secrets-or-share-urls).\n\n",
32
+ verify: "hq-delegate-verify.sh — prove a delegation can actually be picked up\nbefore anyone is told it is theirs, or print the full plan without\ntouching anything.\n\nUsage (probe mode — after grants, before the DM):\n core/scripts/hq-delegate-verify.sh --manifest <path>\n\nProbes every manifest vaultPrefix with `hq files browse` and requires it\nreachable AND non-empty. All pass -> manifest advances granted -> verified\n(send is gated on this). Any failure -> non-zero, the failing prefix and\nlikely cause named, status left at its last successful value so a re-run\nresumes without re-granting.\n\nUsage (dry-run mode — full plan, zero mutation):\n core/scripts/hq-delegate-verify.sh --dry-run \\\n --company <slug> --project <name> --to <principal> [--mode transfer|share]\n\nPrints recipient, mode, every prefix with its permission, the secret\nnames an .env.schema would grant, repo + branch, and the DM headline that\nwould be sent. Exits 0. Creates nothing under workspace/delegations/ and\ninvokes no mutating command.\n\nEnv: HQ_ROOT — HQ root override (default: resolved from script location)\n",
33
+ publish: "usage: --manifest <path>",
34
+ };
35
+ function out(value) { process.stdout.write(value); }
36
+ function err(value) { process.stderr.write(value); }
37
+ function fail(name, message) {
38
+ err(`hq-delegate-${name}: ${message}\n`);
39
+ return 1;
40
+ }
41
+ function text(value, fallback = "") {
42
+ if (value === undefined || value === null)
43
+ return fallback;
44
+ if (typeof value === "string")
45
+ return value;
46
+ if (typeof value === "object")
47
+ return serializeJqJson(value, "pretty").replace(/\n+$/, "");
48
+ return String(value);
49
+ }
50
+ function list(value) { return Array.isArray(value) ? value : []; }
51
+ function currentTime() {
52
+ const value = process.env.HQ_DELEGATE_NOW;
53
+ const date = value === undefined ? new Date() : new Date(value);
54
+ return Number.isNaN(date.getTime()) ? "Invalid Date" : date.toISOString().replace(/\.\d{3}Z$/, "Z");
55
+ }
56
+ function jsonFile(file) {
57
+ try {
58
+ const value = readJsonFile(file);
59
+ return isRecord(value) ? value : undefined;
60
+ }
61
+ catch {
62
+ return undefined;
63
+ }
64
+ }
65
+ function malformedJsonFile(file) {
66
+ try {
67
+ JSON.parse(fs.readFileSync(file, "utf8"));
68
+ return false;
69
+ }
70
+ catch (error) {
71
+ return error instanceof SyntaxError;
72
+ }
73
+ }
74
+ function jsonText(value) { return serializeJqJson(value, "pretty"); }
75
+ function checksum(file) {
76
+ return createHash("sha256").update(fs.readFileSync(file)).digest("hex");
77
+ }
78
+ function safeFiles(root) {
79
+ const result = [];
80
+ const visit = (directory) => {
81
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
82
+ const file = path.join(directory, entry.name);
83
+ if (entry.isDirectory())
84
+ visit(file);
85
+ else if (entry.isFile() && entry.name !== ".DS_Store")
86
+ result.push(file);
87
+ }
88
+ };
89
+ visit(root);
90
+ return result.sort().slice(0, 200);
91
+ }
92
+ function secretScan(name, files) {
93
+ let bad = false;
94
+ for (const file of files) {
95
+ if (!fs.existsSync(file) || !fs.statSync(file).isFile())
96
+ continue;
97
+ const value = fs.readFileSync(file, "utf8");
98
+ for (const pattern of matchingSecretPatterns(value)) {
99
+ err(`secret-scan: pattern '${pattern}' matched in ${file}\n`);
100
+ bad = true;
101
+ }
102
+ }
103
+ return !bad;
104
+ }
105
+ function getPath(value, dotted, fallback) {
106
+ const found = jsonAt(value, dotted);
107
+ return found === undefined ? fallback : found;
108
+ }
109
+ function jqTrue(value) { return value !== undefined && value !== null && value !== false; }
110
+ function quoteBash(value) {
111
+ if (value === "")
112
+ return "''";
113
+ if (/^[A-Za-z0-9_./:@+-]+$/.test(value))
114
+ return value;
115
+ return `'${value.replaceAll("'", `'\\''`)}'`;
116
+ }
117
+ function delegationGroupId(principal) {
118
+ return "grp_dlg" + createHash("sha256").update(principal).digest("hex").slice(0, 32);
119
+ }
120
+ function stripAnsiSequences(value) {
121
+ const escape = String.fromCharCode(27);
122
+ return value.replace(new RegExp(`${escape}\\[[0-?]*[ -/]*[@-~]`, "g"), "");
123
+ }
124
+ function groupMemberIds(output) {
125
+ const plainOutput = stripAnsiSequences(output);
126
+ const lines = plainOutput.split(/\r?\n/);
127
+ const header = lines.findIndex((line) => /^PERSON_UID(?:\s|$)/.test(line.trimStart()));
128
+ if (header < 0)
129
+ return null;
130
+ return lines.slice(header + 1).filter((line) => line.trim() !== "")
131
+ .map((line) => line.trim().split(/\s{2,}/, 1)[0] ?? "");
132
+ }
133
+ function browseContainsExactKey(listing, expected) {
134
+ const lines = listing.split(/\r?\n/);
135
+ const aclLabels = Object.values(ACL_SOURCE_DISPLAY_LABELS);
136
+ return lines.slice(2).some((line) => {
137
+ const row = stripAnsiSequences(line).trimEnd();
138
+ const acl = aclLabels.find((label) => row.endsWith(label));
139
+ if (!acl)
140
+ return false;
141
+ const beforeAcl = row.slice(0, -acl.length).trimEnd();
142
+ const modifiedMatch = /^(.*) +(\S+)$/.exec(beforeAcl);
143
+ if (!modifiedMatch)
144
+ return false;
145
+ const modified = modifiedMatch[2] ?? "";
146
+ if (modified !== "—" && !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(modified))
147
+ return false;
148
+ const beforeModified = (modifiedMatch[1] ?? "").trimEnd();
149
+ const sizeMatch = /^(.*) +(\d+)$/.exec(beforeModified);
150
+ return (sizeMatch?.[1] ?? "").trimEnd() === expected;
151
+ });
152
+ }
153
+ function parseFlags(args, allowed) {
154
+ const values = {};
155
+ for (let i = 0; i < args.length;) {
156
+ const key = args[i] ?? "";
157
+ if (key === "-h" || key === "--help")
158
+ return { values, help: true };
159
+ if (!allowed.includes(key))
160
+ return { values, error: `unknown argument: ${key}` };
161
+ if (key === "--yes" || key === "--send" || key === "--dry-run") {
162
+ values[key] = true;
163
+ i += 1;
164
+ }
165
+ else {
166
+ values[key] = args[i + 1] ?? "";
167
+ i += 2;
168
+ }
169
+ }
170
+ return { values };
171
+ }
172
+ function usage(name) { return USAGE[name] ?? ""; }
173
+ function usageFailure(name) { err(usage(name)); return 1; }
174
+ function runShellFallback(name, args, context) {
175
+ const result = runBundledScript({
176
+ asset: ASSETS[name],
177
+ args,
178
+ cwd: context.cwd,
179
+ hqRoot: context.root ?? context.cwd,
180
+ captureOutput: true,
181
+ });
182
+ if (result.stdout?.length)
183
+ process.stdout.write(result.stdout);
184
+ if (result.stderr?.length)
185
+ process.stderr.write(result.stderr);
186
+ return result.code;
187
+ }
188
+ function runBundle(args, context, onMalformedWhoami) {
189
+ const root = context.root ?? context.cwd;
190
+ if (args[0] !== "build")
191
+ return usageFailure("bundle");
192
+ const parsed = parseFlags(args.slice(1), ["--company", "--project", "--to", "--to-kind", "--to-name", "--mode", "--dry-run"]);
193
+ if (parsed.help) {
194
+ out(usage("bundle"));
195
+ return 0;
196
+ }
197
+ if (parsed.error)
198
+ return fail("bundle", parsed.error);
199
+ const company = text(parsed.values["--company"]);
200
+ const project = text(parsed.values["--project"]);
201
+ const recipient = text(parsed.values["--to"]);
202
+ const toKind = text(parsed.values["--to-kind"], "person");
203
+ const toName = text(parsed.values["--to-name"]);
204
+ const mode = text(parsed.values["--mode"], "transfer");
205
+ const dryRun = parsed.values["--dry-run"] === true;
206
+ if (!company)
207
+ return fail("bundle", "--company is required");
208
+ if (!project)
209
+ return fail("bundle", "--project is required");
210
+ if (!recipient)
211
+ return fail("bundle", "--to is required");
212
+ if (mode !== "transfer" && mode !== "share")
213
+ return fail("bundle", "--mode must be transfer or share");
214
+ if (toKind !== "person" && toKind !== "agent")
215
+ return fail("bundle", "--to-kind must be person or agent");
216
+ const projectDir = path.join(root, "companies", company, "projects", project);
217
+ const prdPath = path.join(projectDir, "prd.json");
218
+ if (!fs.existsSync(projectDir) || !fs.statSync(projectDir).isDirectory())
219
+ return fail("bundle", `project directory not found: companies/${company}/projects/${project}`);
220
+ if (!fs.existsSync(prdPath) || !fs.statSync(prdPath).isFile())
221
+ return fail("bundle", `project has no prd.json: companies/${company}/projects/${project}/prd.json`);
222
+ let prd;
223
+ try {
224
+ prd = readJsonFile(prdPath);
225
+ }
226
+ catch {
227
+ return fail("bundle", `prd.json is not valid JSON: ${prdPath}`);
228
+ }
229
+ if (prd === null || prd === false)
230
+ return fail("bundle", `prd.json is not valid JSON: ${prdPath}`);
231
+ const who = subprocess("hq", ["whoami", "--json"], context.cwd, { stdout: "capture" });
232
+ if (who.code !== 0)
233
+ return fail("bundle", "could not read sender identity; update hq-cli if --json is unsupported");
234
+ let identity;
235
+ try {
236
+ identity = JSON.parse(who.stdout ?? "");
237
+ }
238
+ catch (error) {
239
+ if (error instanceof SyntaxError)
240
+ return onMalformedWhoami ? onMalformedWhoami() : runShellFallback("bundle", args, context);
241
+ identity = undefined;
242
+ }
243
+ const identityValue = isRecord(identity) ? identity : {};
244
+ const identityReady = identityValue.authenticated !== false && [identityValue.email, identityValue.personUid, identityValue.agentUid].some((entry) => typeof entry === "string" && entry.length > 0);
245
+ if (!identityReady)
246
+ return fail("bundle", "sender identity is missing or expired; run hq login");
247
+ const fromEmail = text(identityValue.email) || null;
248
+ const fromUid = text(identityValue.personUid) || text(identityValue.agentUid) || null;
249
+ const knowledge = list(getPath(prd, "metadata.knowledge", [])).filter((entry) => typeof entry === "string").map(String);
250
+ const readPrefixes = [...new Set(knowledge.filter((entry) => entry.startsWith(`companies/${company}/`)).map((entry) => {
251
+ const relative = entry.slice(`companies/${company}/`.length);
252
+ if (relative.endsWith("/"))
253
+ return relative;
254
+ const slash = relative.lastIndexOf("/");
255
+ return slash < 0 ? "/" : relative.slice(0, slash + 1);
256
+ }))].sort();
257
+ const vaultPrefixes = [
258
+ { prefix: `projects/${project}/`, permission: "write", reason: "project dossier" },
259
+ ...readPrefixes.map((prefix) => ({ prefix, permission: "read", reason: "referenced knowledge/policies" })),
260
+ ].sort((a, b) => a.prefix.localeCompare(b.prefix));
261
+ if (vaultPrefixes.some(({ prefix }) => !prefix.endsWith("/") || prefix.startsWith("companies/")))
262
+ return fail("bundle", "internal error: derived a non-folder or company-anchored prefix");
263
+ const repoPath = text(getPath(prd, "metadata.repoPath"));
264
+ const repo = repoPath ? {
265
+ path: repoPath,
266
+ remote: null,
267
+ branch: text(getPath(prd, "branchName")) || null,
268
+ baseBranch: text(getPath(prd, "metadata.baseBranch"), "main") || "main",
269
+ headSha: null,
270
+ dirtyFiles: [],
271
+ accessVerified: false,
272
+ } : null;
273
+ const boardFile = path.join(root, "companies", company, "board.json");
274
+ let boardId = null;
275
+ const board = jsonFile(boardFile);
276
+ if (board) {
277
+ const projects = list(board.projects);
278
+ const boardEntry = projects.find((entry) => isRecord(entry) && entry.prd_path === `companies/${company}/projects/${project}/prd.json`);
279
+ if (isRecord(boardEntry) && jqTrue(boardEntry.id))
280
+ boardId = boardEntry.id;
281
+ }
282
+ const checksums = {};
283
+ for (const file of safeFiles(projectDir))
284
+ checksums[path.relative(root, file).split(path.sep).join("/")] = checksum(file);
285
+ const createdAt = currentTime();
286
+ const idTime = createdAt.replace(/[-:TZ]/g, "").slice(0, 8) + "-" + createdAt.slice(11, 19).replaceAll(":", "");
287
+ const delegationId = `dlg-${idTime}-${project}`;
288
+ const policies = knowledge.filter((entry) => entry.startsWith(`companies/${company}/policies/`));
289
+ const manifest = {
290
+ schemaVersion: 1,
291
+ delegationId,
292
+ createdAt,
293
+ mode,
294
+ from: { email: fromEmail, personUid: fromUid },
295
+ to: { kind: toKind, principal: recipient, displayName: toName || null },
296
+ company,
297
+ project: { name: project, prdPath: `companies/${company}/projects/${project}/prd.json`, boardId },
298
+ vaultPrefixes: vaultPrefixes.filter((entry, index, all) => all.findIndex((candidate) => candidate.prefix === entry.prefix) === index),
299
+ repo,
300
+ secrets: [],
301
+ knowledge: [...new Set(knowledge.filter((entry) => !entry.startsWith(`companies/${company}/policies/`)))].sort(),
302
+ policies: [...new Set(policies)].sort(),
303
+ checksums,
304
+ status: "building",
305
+ };
306
+ const description = text(getPath(prd, "description"), "No description recorded.");
307
+ const goal = text(getPath(prd, "metadata.goal"));
308
+ const stories = list(getPath(prd, "userStories", []));
309
+ const done = stories.filter((story) => isRecord(story) && story.passes === true);
310
+ const next = stories.filter((story) => !isRecord(story) || story.passes !== true)
311
+ .sort((a, b) => Number(getPath(a, "priority", 0)) - Number(getPath(b, "priority", 0))).slice(0, 3);
312
+ const doneList = done.map((story) => `- ${text(getPath(story, "id"))}: ${text(getPath(story, "title"))}`).join("\n");
313
+ const nextList = next.map((story) => `### ${text(getPath(story, "id"))}: ${text(getPath(story, "title"))}\n\n${text(getPath(story, "description"))}\n`).join("\n");
314
+ const questions = list(getPath(prd, "metadata.openQuestions", [])).map((entry) => `- ${text(entry)}`).join("\n");
315
+ const traps = [
316
+ ...list(getPath(prd, "metadata.securityNotes", [])),
317
+ ...list(getPath(prd, "metadata.executionConventions", [])),
318
+ ].map((entry) => `- ${text(entry)}`).join("\n");
319
+ let brief = `# Delegation brief — ${project}\n\nThis brief describes the **${project}** project in the **${company}** company. Completed handoff steps are recorded in the manifest. Pull the files and acknowledge receipt; report any access error to the sender.\n\n## What this project is\n\n${description}`;
320
+ if (goal)
321
+ brief += `\n\n## The goal\n\n${goal}`;
322
+ brief += `\n\n## Where things stand\n\n${done.length} of ${stories.length} stories are complete.`;
323
+ if (doneList)
324
+ brief += `\n\nAlready done:\n\n${doneList}`;
325
+ brief += `\n\n## The next three steps\n\n${nextList || "All stories are complete. Remaining work, if any, is described in the project's post-implementation notes."}`;
326
+ if (questions)
327
+ brief += `\n## Open questions\n\n${questions}\n`;
328
+ if (traps)
329
+ brief += `\n## Known traps and conventions\n\n${traps}\n`;
330
+ brief += `\n## Where everything lives\n\nThe full PRD (every story, acceptance criteria, and decision history) is at \`companies/${company}/projects/${project}/prd.json\`. The pickup prompt that accompanied this brief pulls every file you need on demand — you do not need to run a full sync.\n`;
331
+ const stage = fs.mkdtempSync(path.join(os.tmpdir(), "tmp-"));
332
+ const manifestFile = path.join(stage, "manifest.json");
333
+ const briefFile = path.join(stage, "BRIEF.md");
334
+ fs.writeFileSync(manifestFile, jsonText(manifest));
335
+ fs.writeFileSync(briefFile, brief);
336
+ if (!secretScan("bundle", [manifestFile, briefFile])) {
337
+ fs.rmSync(stage, { recursive: true, force: true });
338
+ return fail("bundle", "generated bundle matched a secret-detection pattern — nothing written (see stderr above)");
339
+ }
340
+ if (dryRun) {
341
+ out(fs.readFileSync(manifestFile, "utf8"));
342
+ fs.rmSync(stage, { recursive: true, force: true });
343
+ err("hq-delegate-bundle: dry run — nothing written\n");
344
+ return 0;
345
+ }
346
+ const dest = path.join(root, "workspace", "delegations", delegationId);
347
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
348
+ moveFile(stage, dest);
349
+ out(`${delegationId}\n`);
350
+ err(`hq-delegate-bundle: wrote workspace/delegations/${delegationId}/{manifest.json,BRIEF.md}\n`);
351
+ return 0;
352
+ }
353
+ function runHq(args, context, stdout = "capture") {
354
+ return subprocess("hq", args, context.cwd, { stdout });
355
+ }
356
+ function commandSubstitutionBytes(value) {
357
+ const bytes = value.stdoutBytes ?? Buffer.from(value.stdout ?? "");
358
+ let end = bytes.length;
359
+ while (end > 0 && bytes[end - 1] === 0x0a)
360
+ end -= 1;
361
+ return bytes.subarray(0, end);
362
+ }
363
+ function emitJqParseDiagnostic(input, args, context) {
364
+ if (!commandExists("jq", context.cwd))
365
+ return;
366
+ const result = subprocess("jq", args, context.cwd, { input, stdout: "ignore", stderr: "pipe" });
367
+ const diagnostic = result.stderrBytes ?? Buffer.from(result.stderr ?? "");
368
+ if (diagnostic.length)
369
+ err(diagnostic);
370
+ }
371
+ const RESOLVE_FOUND_FILTER = '.status == "found" and (.person.personUid | type == "string") and (.person.companyUid | type == "string")';
372
+ const RESOLVE_NOT_FOUND_FILTER = '.status == "not_found"';
373
+ const ACL_FILTER = `
374
+ .schemaVersion == 1 and
375
+ (
376
+ .prefix == $prefix or
377
+ (($prefix | endswith("/*")) and .prefix == ($prefix | sub("\\\\*$"; "")))
378
+ ) and
379
+ (.companyUid | type == "string") and ($company == "" or .companyUid == $company) and
380
+ (.direct | type == "array") and (.exists | type == "boolean")
381
+ `;
382
+ function runGrant(args, context) {
383
+ const parsed = parseFlags(args, ["--manifest", "--yes"]);
384
+ if (parsed.help) {
385
+ out(usage("grant"));
386
+ return 0;
387
+ }
388
+ if (parsed.error)
389
+ return fail("grant", parsed.error);
390
+ const manifestPath = text(parsed.values["--manifest"]);
391
+ const yes = parsed.values["--yes"] === true;
392
+ if (!manifestPath)
393
+ return fail("grant", "--manifest is required");
394
+ if (!fs.existsSync(manifestPath) || !fs.statSync(manifestPath).isFile())
395
+ return fail("grant", `manifest not found: ${manifestPath}`);
396
+ let manifest;
397
+ try {
398
+ manifest = readJsonFile(manifestPath);
399
+ }
400
+ catch {
401
+ return fail("grant", `manifest is not valid JSON: ${manifestPath}`);
402
+ }
403
+ if (manifest === null || manifest === false)
404
+ return fail("grant", `manifest is not valid JSON: ${manifestPath}`);
405
+ if (!isRecord(manifest))
406
+ return fail("grant", "manifest has no company");
407
+ const company = jqRawPath(manifest, "company");
408
+ const project = jqRawPath(manifest, "project.name");
409
+ const principal = jqRawPath(manifest, "to.principal");
410
+ const display = jqRawPaths(manifest, ["to.displayName", "to.principal"]);
411
+ const status = jqRawPath(manifest, "status");
412
+ if (!company)
413
+ return fail("grant", "manifest has no company");
414
+ if (!project)
415
+ return fail("grant", "manifest has no project.name");
416
+ if (!principal)
417
+ return fail("grant", "manifest has no to.principal");
418
+ let grantPrincipal = principal;
419
+ if (principal.startsWith("agt_")) {
420
+ const legacyGroup = "grp_dlg-" + principal.slice(-9).toLowerCase();
421
+ const nextGroup = delegationGroupId(principal);
422
+ const recordedGroup = text(getPath(manifest, "grantPrincipal"));
423
+ grantPrincipal = recordedGroup === legacyGroup || recordedGroup === nextGroup ? recordedGroup : nextGroup;
424
+ }
425
+ if (status !== "building" && status !== "granted")
426
+ return fail("grant", `manifest status is '${status}' — grants run from 'building' (or re-run from 'granted'), not from there`);
427
+ const prefixes = list(getPath(manifest, "vaultPrefixes"));
428
+ if (prefixes.length === 0)
429
+ return fail("grant", "manifest has no vaultPrefixes");
430
+ const badPrefixes = prefixes.filter((entry) => {
431
+ const prefix = jqRawPath(entry, "prefix");
432
+ return !prefix.endsWith("/") || prefix.startsWith("companies/") || prefix.startsWith("/");
433
+ }).map((entry) => jqRawPath(entry, "prefix"));
434
+ if (badPrefixes.length)
435
+ return fail("grant", `prefix violates the hq-files prefix conventions (must be company-relative folder form ending in '/'): ${badPrefixes.join("\n")}`);
436
+ out(`Delegation grant plan — company '${company}', recipient '${principal}':\n`);
437
+ if (grantPrincipal !== principal)
438
+ out(` 0. Agent recipient: grants flow through group ${grantPrincipal} (created if absent, containing exactly ${display})\n`);
439
+ out(` 1. Push companies/${company}/projects/${project}/ to the vault (on-conflict keep)\n`);
440
+ for (const entry of prefixes)
441
+ out(` 2. Grant ${jqRawPath(entry, "permission")} on ${jqRawPath(entry, "prefix")} — ${jqRawPath(entry, "reason")}\n`);
442
+ const writePrefixes = prefixes.map((entry) => jqRawPath(entry, "permission") === "write" ? jqRawPath(entry, "prefix") : "").filter(Boolean);
443
+ if (writePrefixes.length) {
444
+ out(`\nNOTE: granting 'write' is a privilege escalation. The recipient will be able\nto upload, overwrite, and delete under: ${writePrefixes.map((prefix) => `${prefix} `).join("")}\n`);
445
+ }
446
+ if (!yes) {
447
+ out("\n");
448
+ err("hq-delegate-grant: confirmation required — re-run with --yes after the user approves\n");
449
+ return 2;
450
+ }
451
+ let result = runHq(["sync", "push", `companies/${company}/projects/${project}/`, "--company", company, "--on-conflict", "keep"], context, "inherit");
452
+ if (result.code !== 0)
453
+ return fail("grant", `vault push failed for companies/${company}/projects/${project}/`);
454
+ const referencePaths = [
455
+ ...list(getPath(manifest, "knowledge", [])),
456
+ ...list(getPath(manifest, "policies", [])),
457
+ ].filter((entry) => typeof entry === "string" && entry.startsWith(`companies/${company}/`));
458
+ for (const reference of referencePaths) {
459
+ if (fs.existsSync(path.join(context.root ?? context.cwd, reference))) {
460
+ result = runHq(["sync", "push", reference, "--company", company, "--on-conflict", "keep"], context, "inherit");
461
+ if (result.code !== 0)
462
+ return fail("grant", `vault push failed for referenced knowledge: ${reference}`);
463
+ }
464
+ else {
465
+ err(`hq-delegate-grant: referenced path missing locally (cannot push): ${reference} — the verify probe will fail if it is not already in the vault\n`);
466
+ }
467
+ }
468
+ if (grantPrincipal !== principal) {
469
+ result = runHq(["groups", "create", grantPrincipal, "--name", `Delegation: ${display}`, "--company", company], context, "inherit");
470
+ if (result.code !== 0)
471
+ err("hq-delegate-grant: group create reported an error (may already exist) — continuing\n");
472
+ result = runHq(["groups", "add", grantPrincipal, principal, "--company", company], context, "inherit");
473
+ if (result.code !== 0)
474
+ err("hq-delegate-grant: group add reported an error (may already be a member) — continuing\n");
475
+ const members = subprocess("hq", ["groups", "members", grantPrincipal, "--company", company], context.cwd, { env: { NO_COLOR: "1", FORCE_COLOR: "0" } });
476
+ if (members.code !== 0)
477
+ return fail("grant", "could not verify delegation group membership");
478
+ const memberIds = groupMemberIds(members.stdout ?? "");
479
+ if (memberIds === null || memberIds.length !== 1 || memberIds[0] !== principal) {
480
+ return fail("grant", "delegation group membership does not exactly match recipient");
481
+ }
482
+ }
483
+ let expectedType = "";
484
+ let expectedId = "";
485
+ let expectedCompany = "";
486
+ if (grantPrincipal.startsWith("grp_")) {
487
+ expectedType = "group";
488
+ expectedId = grantPrincipal;
489
+ }
490
+ else if (grantPrincipal === "@all") {
491
+ expectedType = "company-wide";
492
+ }
493
+ else {
494
+ const resolved = runHq(["people", "resolve", principal, "--company", company, "--json", "--membership-only"], context);
495
+ let response;
496
+ try {
497
+ response = JSON.parse(resolved.stdout ?? "");
498
+ }
499
+ catch (error) {
500
+ if (error instanceof SyntaxError) {
501
+ const input = commandSubstitutionBytes(resolved);
502
+ emitJqParseDiagnostic(input, ["-e", RESOLVE_FOUND_FILTER], context);
503
+ emitJqParseDiagnostic(input, ["-e", RESOLVE_NOT_FOUND_FILTER], context);
504
+ }
505
+ response = undefined;
506
+ }
507
+ if (isRecord(response) && response.status === "found" && isRecord(response.person) && typeof response.person.personUid === "string" && typeof response.person.companyUid === "string") {
508
+ if (resolved.code !== 0)
509
+ return fail("grant", "recipient resolution failed");
510
+ expectedType = "person";
511
+ expectedId = response.person.personUid;
512
+ expectedCompany = response.person.companyUid;
513
+ }
514
+ else if (isRecord(response) && response.status === "not_found") {
515
+ if (principal.includes("@")) {
516
+ expectedType = "email";
517
+ expectedId = principal.toLowerCase().trim();
518
+ }
519
+ else
520
+ return fail("grant", "unresolved recipient");
521
+ }
522
+ else
523
+ return fail("grant", "authoritative recipient lookup failed; update hq-cli if --membership-only is unsupported");
524
+ }
525
+ const readAcl = (prefix) => {
526
+ const response = runHq(["files", "acl", prefix, "--company", company, "--json"], context);
527
+ if (response.code !== 0)
528
+ return { ok: false };
529
+ let value;
530
+ try {
531
+ value = JSON.parse(response.stdout ?? "");
532
+ }
533
+ catch (error) {
534
+ if (error instanceof SyntaxError) {
535
+ const input = commandSubstitutionBytes(response);
536
+ emitJqParseDiagnostic(input, ["-e", "--arg", "prefix", prefix, "--arg", "company", expectedCompany, ACL_FILTER], context);
537
+ }
538
+ value = undefined;
539
+ }
540
+ const rawPrefix = isRecord(value) ? value.prefix : undefined;
541
+ const expectedPrefix = prefix.endsWith("/*") ? prefix.slice(0, -1) : prefix;
542
+ if (!isRecord(value) || value.schemaVersion !== 1 || (rawPrefix !== prefix && rawPrefix !== expectedPrefix) || typeof value.companyUid !== "string" || (expectedCompany !== "" && value.companyUid !== expectedCompany) || !Array.isArray(value.direct) || typeof value.exists !== "boolean") {
543
+ err(`hq-delegate-grant: invalid structured ACL response for ${prefix}\n`);
544
+ return { ok: false };
545
+ }
546
+ return { value, ok: true };
547
+ };
548
+ const now = currentTime();
549
+ for (let i = 0; i < prefixes.length; i += 1) {
550
+ const entry = prefixes[i];
551
+ if (!isRecord(entry) || !isRecord(manifest))
552
+ return fail("grant", "manifest has an invalid vaultPrefixes entry");
553
+ const prefix = jqRawPath(entry, "prefix");
554
+ const permission = jqRawPath(entry, "permission");
555
+ const aclPattern = `${prefix}*`;
556
+ const before = readAcl(aclPattern);
557
+ if (!before.ok || !before.value)
558
+ return fail("grant", `ACL preflight failed; no share attempted for ${prefix}`);
559
+ expectedCompany = text(before.value.companyUid);
560
+ const share = runHq(["files", "share", aclPattern, "--with", grantPrincipal, "--permission", permission, "--company", company], context, "inherit");
561
+ const shareRc = share.code;
562
+ if (shareRc !== 0)
563
+ err(`hq-delegate-grant: share reported an error on ${prefix}; checking exact grant\n`);
564
+ let landed = false;
565
+ for (const delay of [0, 1, 2]) {
566
+ if (delay)
567
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, delay * 1000);
568
+ const after = readAcl(aclPattern);
569
+ if (after.ok && after.value?.exists === true && list(after.value.direct).some((row) => isRecord(row) && row.granteeType === expectedType && row.granteeId === expectedId && row.permission === permission)) {
570
+ landed = true;
571
+ break;
572
+ }
573
+ }
574
+ if (!landed)
575
+ return fail("grant", `grant outcome unconfirmed for ${principal} on ${prefix}; retain this manifest and resume`);
576
+ const current = list(manifest.vaultPrefixes)[i];
577
+ if (!isRecord(current))
578
+ return fail("grant", "manifest has an invalid vaultPrefixes entry");
579
+ current.verifiedAt = now;
580
+ current.grantReceipt = { companyUid: expectedCompany, granteeType: expectedType, granteeId: expectedId, shareExitCode: shareRc, verifiedAt: now };
581
+ writeJsonAtomically(manifestPath, manifest, true);
582
+ out(`hq-delegate-grant: verified ${permission} on ${prefix} for ${principal}\n`);
583
+ }
584
+ manifest.status = "granted";
585
+ manifest.grantPrincipal = grantPrincipal;
586
+ manifest.vaultPrefixes = list(manifest.vaultPrefixes).map((entry) => isRecord(entry) ? { ...entry, verifiedAt: now } : entry);
587
+ writeJsonAtomically(manifestPath, manifest, true);
588
+ out(`hq-delegate-grant: all ${prefixes.length} grants verified — manifest status advanced to 'granted'\n`);
589
+ return 0;
590
+ }
591
+ function atomicCopy(source, target) {
592
+ const temporary = `${target}.tmp.${process.pid}.${Math.random().toString(16).slice(2)}`;
593
+ try {
594
+ fs.copyFileSync(source, temporary);
595
+ moveFile(temporary, target);
596
+ }
597
+ catch (error) {
598
+ try {
599
+ fs.rmSync(temporary, { force: true });
600
+ }
601
+ catch (cleanupError) {
602
+ throw new AggregateError([error, cleanupError], "atomic copy and cleanup failed");
603
+ }
604
+ throw error;
605
+ }
606
+ }
607
+ function fileRecord(key, value) { return serializeJqJson({ key, value }, "compact"); }
608
+ function runPublish(args, context) {
609
+ if (args[0] !== "--manifest" || !args[1] || !fs.existsSync(args[1]) || !fs.statSync(args[1]).isFile())
610
+ return fail("publish", "usage: --manifest <path>");
611
+ const manifestPath = args[1];
612
+ if (malformedJsonFile(manifestPath))
613
+ return runShellFallback("publish", args, context);
614
+ let preflightManifest;
615
+ try {
616
+ preflightManifest = readJsonFile(manifestPath);
617
+ }
618
+ catch {
619
+ preflightManifest = undefined;
620
+ }
621
+ if (isRecord(preflightManifest) && jqRawPath(preflightManifest, "mode") === "transfer") {
622
+ const root = context.root ?? context.cwd;
623
+ const prd = path.join(root, "companies", jqRawPath(preflightManifest, "company"), "projects", jqRawPath(preflightManifest, "project.name"), "prd.json");
624
+ if (fs.existsSync(prd) && fs.statSync(prd).isFile() && malformedJsonFile(prd)) {
625
+ return runShellFallback("publish", args, context);
626
+ }
627
+ }
628
+ const lock = `${manifestPath}.send-lock`;
629
+ const lockHeld = args[2] === "--lock-held";
630
+ let ownLock = false;
631
+ if (lockHeld) {
632
+ if (!fs.existsSync(lock) || !fs.statSync(lock).isDirectory())
633
+ return fail("publish", "verification lock missing");
634
+ }
635
+ else {
636
+ try {
637
+ fs.mkdirSync(lock);
638
+ ownLock = true;
639
+ }
640
+ catch {
641
+ return fail("publish", "verification or delivery is active; retry after it finishes");
642
+ }
643
+ if (args.length !== 2) {
644
+ fs.rmdirSync(lock);
645
+ return fail("publish", "usage: --manifest <path>");
646
+ }
647
+ }
648
+ let stage = "";
649
+ const cleanup = () => {
650
+ if (stage)
651
+ fs.rmSync(stage, { recursive: true, force: true });
652
+ if (ownLock) {
653
+ try {
654
+ fs.rmdirSync(lock);
655
+ }
656
+ catch { /* a concurrent actor may have removed the lock */ }
657
+ }
658
+ };
659
+ try {
660
+ const manifest = jsonFile(manifestPath);
661
+ if (!manifest)
662
+ return fail("publish", `jq: error: ${manifestPath}: Invalid JSON`);
663
+ const company = jqRawPath(manifest, "company");
664
+ const project = jqRawPath(manifest, "project.name");
665
+ const id = jqRawPath(manifest, "delegationId");
666
+ if (!company || !project || !id)
667
+ return fail("publish", "jq: error: required manifest field missing");
668
+ for (const part of [company, project, id])
669
+ if (!/^[A-Za-z0-9_-][A-Za-z0-9._-]*$/.test(part))
670
+ return fail("publish", "unsafe path segment");
671
+ if (manifest.status !== "granted" && manifest.status !== "verified")
672
+ return fail("publish", "confirmed grants required");
673
+ if (jqRawPath(manifest, "mode") === "transfer" && manifest.ownershipTransferredAt == null)
674
+ return fail("publish", "transfer must finish before publication");
675
+ const root = context.root ?? context.cwd;
676
+ const relative = `companies/${company}/projects/${project}`;
677
+ const projectDir = path.join(root, relative);
678
+ const bundleDir = path.dirname(path.resolve(manifestPath));
679
+ const brief = path.join(bundleDir, "BRIEF.md");
680
+ const prd = path.join(projectDir, "prd.json");
681
+ if (!fs.existsSync(brief) || !fs.statSync(brief).isFile())
682
+ return fail("publish", "BRIEF.md missing");
683
+ if (!fs.existsSync(prd) || !fs.statSync(prd).isFile())
684
+ return fail("publish", "PRD missing");
685
+ if (jqRawPath(manifest, "mode") === "transfer") {
686
+ const expectedOwner = jqRawPath(manifest, "to.principal");
687
+ const prdValue = jsonFile(prd);
688
+ if (!prdValue || jqRawPath(prdValue, "metadata.owner") !== expectedOwner)
689
+ return fail("publish", "local PRD owner does not match recipient");
690
+ }
691
+ stage = fs.mkdtempSync(path.join(os.tmpdir(), "tmp-"));
692
+ const stagedBrief = path.join(stage, "BRIEF.md");
693
+ fs.copyFileSync(brief, stagedBrief);
694
+ const hashFile = path.join(stage, "hashes");
695
+ const hashed = {};
696
+ for (const file of [prd, path.join(projectDir, "README.md"), path.join(projectDir, "journal", "delegations.md")]) {
697
+ if (fs.existsSync(file) && fs.statSync(file).isFile()) {
698
+ const key = path.relative(root, file).split(path.sep).join("/");
699
+ hashed[key] = checksum(file);
700
+ }
701
+ }
702
+ const dest = path.join(projectDir, "delegation", id);
703
+ hashed[`${relative}/delegation/${id}/BRIEF.md`] = checksum(stagedBrief);
704
+ fs.writeFileSync(hashFile, `${Object.entries(hashed).map(([key, value]) => fileRecord(key, value)).join("\n")}\n`);
705
+ const canonical = { ...manifest, checksums: hashed, status: "granted", recipientAccess: "unconfirmed" };
706
+ delete canonical.publication;
707
+ delete canonical.verifiedAt;
708
+ delete canonical.sentAt;
709
+ delete canonical.dmEventId;
710
+ const stagedManifest = path.join(stage, "manifest.json");
711
+ fs.writeFileSync(stagedManifest, jsonText(canonical));
712
+ if (!secretScan("publish", [stagedManifest, stagedBrief]))
713
+ return fail("publish", "unsafe generated dossier");
714
+ const shareSession = /share-session\/[A-Za-z0-9_-]+/;
715
+ if (shareSession.test(fs.readFileSync(stagedManifest, "utf8")) || shareSession.test(fs.readFileSync(stagedBrief, "utf8")))
716
+ return fail("publish", "share-session capability in dossier; nothing published");
717
+ fs.mkdirSync(dest, { recursive: true });
718
+ atomicCopy(stagedBrief, path.join(dest, "BRIEF.md"));
719
+ atomicCopy(stagedManifest, path.join(dest, "manifest.json"));
720
+ atomicCopy(stagedManifest, manifestPath);
721
+ const push = runHq(["sync", "push", `${relative}/`, "--company", company, "--on-conflict", "keep"], context, "inherit");
722
+ if (push.code !== 0)
723
+ return fail("publish", "final dossier push failed; resume publication");
724
+ const receipts = { ...hashed };
725
+ receipts[`${relative}/delegation/${id}/manifest.json`] = checksum(path.join(dest, "manifest.json"));
726
+ const stagedRemote = path.join(stage, "remote");
727
+ for (const [file, expected] of Object.entries(receipts)) {
728
+ let matched = false;
729
+ const cloudPath = file.startsWith(`companies/${company}/`) ? file.slice(`companies/${company}/`.length) : file;
730
+ for (const delay of [0, 1, 2]) {
731
+ if (delay)
732
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, delay * 1000);
733
+ const remote = runHq(["files", "cat", cloudPath, "--company", company], context);
734
+ if (remote.code === 0) {
735
+ fs.writeFileSync(stagedRemote, remote.stdout ?? "");
736
+ if (checksum(stagedRemote) === expected) {
737
+ matched = true;
738
+ break;
739
+ }
740
+ }
741
+ }
742
+ if (!matched)
743
+ return fail("publish", `canonical cloud content differs or is unreadable: ${file}; resolve before sending`);
744
+ }
745
+ const publication = { verifiedAt: currentTime(), manifestPath: `${relative}/delegation/${id}/manifest.json`, files: receipts };
746
+ const updated = { ...canonical, publication, recipientAccess: "unconfirmed" };
747
+ fs.writeFileSync(stagedManifest, jsonText(updated));
748
+ atomicCopy(stagedManifest, manifestPath);
749
+ out("hq-delegate-publish: canonical dossier bytes verified as sender; recipient access unconfirmed\n");
750
+ return 0;
751
+ }
752
+ finally {
753
+ cleanup();
754
+ }
755
+ }
756
+ function sortedJson(value) {
757
+ const sort = (entry) => {
758
+ if (Array.isArray(entry))
759
+ return entry.map(sort);
760
+ if (!isRecord(entry))
761
+ return entry;
762
+ return Object.fromEntries(Object.keys(entry).sort().map((key) => [key, sort(entry[key])]));
763
+ };
764
+ return serializeJqJson(sort(value), "compact").replace(/\n+$/, "");
765
+ }
766
+ function runSend(args, context) {
767
+ const parsed = parseFlags(args, ["--manifest", "--send", "--headline", "--note"]);
768
+ if (parsed.help) {
769
+ out(usage("send"));
770
+ return 0;
771
+ }
772
+ if (parsed.error)
773
+ return fail("send", parsed.error);
774
+ const manifestPath = text(parsed.values["--manifest"]);
775
+ const send = parsed.values["--send"] === true;
776
+ let headline = text(parsed.values["--headline"]);
777
+ const note = text(parsed.values["--note"]);
778
+ if (!manifestPath)
779
+ return fail("send", "--manifest is required");
780
+ if (!fs.existsSync(manifestPath) || !fs.statSync(manifestPath).isFile())
781
+ return fail("send", `manifest not found: ${manifestPath}`);
782
+ const manifest = jsonFile(manifestPath);
783
+ if (!manifest)
784
+ return fail("send", `manifest is not valid JSON: ${manifestPath}`);
785
+ if (send) {
786
+ const publishedPath = path.join(context.root ?? context.cwd, jqRawPath(manifest, "publication.manifestPath"));
787
+ if (fs.existsSync(publishedPath) && fs.statSync(publishedPath).isFile() && malformedJsonFile(publishedPath)) {
788
+ return runShellFallback("send", args, context);
789
+ }
790
+ }
791
+ const lock = `${manifestPath}.send-lock`;
792
+ if (send) {
793
+ try {
794
+ fs.mkdirSync(lock);
795
+ }
796
+ catch {
797
+ return fail("send", "verification or delivery is active; retry after it finishes");
798
+ }
799
+ }
800
+ let lockRemoved = false;
801
+ const removeLock = () => {
802
+ if (!send || lockRemoved)
803
+ return;
804
+ try {
805
+ fs.rmdirSync(lock);
806
+ lockRemoved = true;
807
+ }
808
+ catch { /* Preserve the command result if a concurrent process removed it. */ }
809
+ };
810
+ try {
811
+ const bundleDir = path.dirname(path.resolve(manifestPath));
812
+ const brief = path.join(bundleDir, "BRIEF.md");
813
+ const prompt = path.join(bundleDir, "PICKUP-PROMPT.md");
814
+ const company = jqRawPath(manifest, "company");
815
+ const project = jqRawPath(manifest, "project.name");
816
+ const principal = jqRawPath(manifest, "to.principal");
817
+ const display = jqRawPaths(manifest, ["to.displayName", "to.principal"]);
818
+ const from = jqRawPaths(manifest, ["from.email", "from.personUid"], "your teammate");
819
+ const delegationId = jqRawPath(manifest, "delegationId");
820
+ const mode = jqRawPath(manifest, "mode", "transfer");
821
+ if (!company)
822
+ return fail("send", "manifest has no company");
823
+ if (!project)
824
+ return fail("send", "manifest has no project.name");
825
+ if (!principal)
826
+ return fail("send", "manifest has no to.principal");
827
+ const root = context.root ?? context.cwd;
828
+ const prdRelative = jqRawPath(manifest, "project.prdPath");
829
+ const prdAbs = path.join(root, prdRelative);
830
+ const prd = fs.existsSync(prdAbs) ? jsonFile(prdAbs) : undefined;
831
+ let goal = "";
832
+ let stateLine = "";
833
+ let nextSteps = "";
834
+ if (prd) {
835
+ goal = text(jqFallback(getPath(prd, "metadata.goal"), getPath(prd, "description", "")));
836
+ const stories = list(getPath(prd, "userStories", []));
837
+ const complete = stories.filter((entry) => isRecord(entry) && entry.passes === true).length;
838
+ stateLine = `${complete} of ${stories.length} stories are complete.`;
839
+ nextSteps = stories.filter((entry) => !isRecord(entry) || entry.passes !== true)
840
+ .sort((a, b) => Number(getPath(a, "priority", 0)) - Number(getPath(b, "priority", 0)))
841
+ .slice(0, 3)
842
+ .map((entry, index) => `${index + 1}. **${text(getPath(entry, "id"))}: ${text(getPath(entry, "title"))}** — ${text(getPath(entry, "description"))}`)
843
+ .join("\n");
844
+ }
845
+ const getLines = list(getPath(manifest, "vaultPrefixes", [])).map((entry) => "hq files get " + quoteBash(jqRawPath(entry, "prefix")) + " --company " + quoteBash(company)).join("\n");
846
+ let repoSection = "";
847
+ const repoValue = getPath(manifest, "repo");
848
+ if (repoValue !== null && repoValue !== undefined) {
849
+ const repoPath = jqRawPath(manifest, "repo.path");
850
+ const remote = jqRawPath(manifest, "repo.remote");
851
+ const branch = jqRawPath(manifest, "repo.branch");
852
+ const base = jqRawPath(manifest, "repo.baseBranch", "main") || "main";
853
+ const sha = jqRawPath(manifest, "repo.headSha");
854
+ const access = jqRawPath(manifest, "repo.accessNote");
855
+ const branchCheck = branch ? subprocess("git", ["check-ref-format", "--branch", branch], context.cwd, { stdout: "ignore", stderr: "ignore" }) : { code: 1 };
856
+ if (branch && branchCheck.code === 0 && sha) {
857
+ repoSection = `## Get the code\n\nThe work lives on branch \`${branch}\` (base: \`${base}\`) at \`${sha}\`.\n\n\`\`\`bash\n# From your HQ root; clone first if the repo is not present${remote ? ` (remote: ${remote})` : ""}:\ngit -C ${quoteBash(repoPath)} fetch origin\ngit -C ${quoteBash(repoPath)} switch -- ${quoteBash(branch)}\n\`\`\`${access ? `\n\n> ${access}` : ""}`;
858
+ }
859
+ }
860
+ const secretNames = list(getPath(manifest, "secrets", [])).map((entry) => text(entry)).join(",");
861
+ let secretsSection = "";
862
+ if (secretNames) {
863
+ secretsSection = `## Credentials\n\nYou have been granted read access to the secret names this project needs: \`${secretNames}\`. Values never travel in this handoff — consume them at runtime:\n\n\`\`\`bash\n# Inject from the project's .env.schema:\nhq run -- <your command>\n# Or explicitly by name:\nhq secrets exec --only ${secretNames} --company ${company} -- <your command>\n\`\`\`\n`;
864
+ }
865
+ if (!headline)
866
+ headline = `Project handoff: ${project} — open the brief, pull the files, and acknowledge receipt`;
867
+ const message = mode === "share"
868
+ ? `${from} has shared the **${project}** project (${company}) with you${note ? ` — ${note}` : ""}. You are working on it together; ownership stays with them.`
869
+ : `${from} has delegated the **${project}** project (${company}) to you${note ? ` — ${note}` : ""}. Transfer status is recorded in the dossier. Work Mesh ownership requires separate confirmation. Delegation id: \`${delegationId}\`.`;
870
+ let body = `# Project handoff: ${project}\n\n${message}\n\nCompleted grant and publication steps are recorded as receipts in the manifest. Sender-side checks do not prove your access: pull the files below and acknowledge receipt, or report any access error.\n\n`;
871
+ if (goal)
872
+ body += `## The goal\n\n${goal}\n\n`;
873
+ if (stateLine)
874
+ body += `## Where things stand\n\n${stateLine}\n\n`;
875
+ body += `## Pull the files (on demand — no sync)\n\nRun these from your HQ root; each materializes exactly that path locally:\n\n\`\`\`bash\n${getLines}\n\`\`\`\n\nStart with the project dossier: \`companies/${company}/projects/${project}/\` now contains the PRD (\`prd.json\`), a full brief (\`README.md\` / the DM's details pane), and the delegation journal.\n\n`;
876
+ if (repoSection)
877
+ body += `${repoSection}\n\n`;
878
+ if (secretsSection)
879
+ body += `${secretsSection}\n`;
880
+ if (nextSteps)
881
+ body += `## Your next three steps\n\n${nextSteps}\n\n`;
882
+ body += `## If something is off\n\nThe manifest and BRIEF.md are published under \`delegation/${delegationId}/\` within \`companies/${company}/projects/${project}/\`. If a pull fails or a path looks empty, report it to ${from}.\n`;
883
+ const stage = fs.mkdtempSync(path.join(os.tmpdir(), "tmp-"));
884
+ const stagedPrompt = path.join(stage, "PICKUP-PROMPT.md");
885
+ fs.writeFileSync(stagedPrompt, body);
886
+ if (!secretScan("send", [stagedPrompt, brief])) {
887
+ fs.rmSync(stage, { recursive: true, force: true });
888
+ return fail("send", "generated pickup prompt matched a secret-detection pattern — aborting, nothing written or sent");
889
+ }
890
+ const pattern = /share-session\/[A-Za-z0-9_-]+/;
891
+ if (pattern.test(fs.readFileSync(stagedPrompt, "utf8")) || (fs.existsSync(brief) && pattern.test(fs.readFileSync(brief, "utf8")))) {
892
+ fs.rmSync(stage, { recursive: true, force: true });
893
+ return fail("send", "a share-session URL appeared in a delegation artifact — forbidden (direct grants only), aborting");
894
+ }
895
+ moveFile(stagedPrompt, prompt);
896
+ fs.rmSync(stage, { recursive: true, force: true });
897
+ out(`hq-delegate-send: pickup prompt written: ${prompt}\n`);
898
+ if (!send)
899
+ return 0;
900
+ if (jqRawPath(manifest, "status") !== "verified")
901
+ return fail("send", `manifest status is '${jqRawPath(manifest, "status")}' — the reachability probe (hq-delegate-verify.sh) must pass before sending`);
902
+ if (!fs.existsSync(brief))
903
+ return fail("send", "BRIEF.md missing from the bundle — cannot send without the details pane");
904
+ const publication = getPath(manifest, "publication");
905
+ const publishedFiles = getPath(publication, "files");
906
+ if (getPath(publication, "verifiedAt") == null || !isRecord(publishedFiles) || Object.keys(publishedFiles).length === 0)
907
+ return fail("send", "verified publication receipt missing; run verification again");
908
+ for (const [file, expected] of Object.entries(publishedFiles)) {
909
+ const absolute = path.join(root, file);
910
+ if (!fs.existsSync(absolute) || checksum(absolute) !== text(expected))
911
+ return fail("send", `published artifact changed: ${file}; run verification again`);
912
+ }
913
+ const publishedManifestPath = path.join(root, jqRawPath(manifest, "publication.manifestPath"));
914
+ if (!fs.existsSync(publishedManifestPath))
915
+ return fail("send", "published manifest missing; run verification again");
916
+ const publishedManifest = jsonFile(publishedManifestPath);
917
+ if (!publishedManifest)
918
+ return fail("send", "published manifest missing; run verification again");
919
+ const normalized = { ...manifest, status: "granted", recipientAccess: "unconfirmed" };
920
+ delete normalized.publication;
921
+ delete normalized.verifiedAt;
922
+ delete normalized.sentAt;
923
+ delete normalized.dmEventId;
924
+ if (sortedJson(normalized) !== sortedJson(publishedManifest))
925
+ return fail("send", "manifest changed since publication; run verification again");
926
+ if (checksum(brief) !== checksum(path.join(path.dirname(publishedManifestPath), "BRIEF.md")))
927
+ return fail("send", "brief changed since publication; run verification again");
928
+ manifest.status = "sending";
929
+ writeJsonAtomically(manifestPath, manifest, true);
930
+ const dm = runHq(["dm", principal, headline, "--prompt-file", prompt, "--details-file", brief], context);
931
+ if (dm.code !== 0)
932
+ return fail("send", "hq dm delivery outcome is uncertain; status is sending, inspect DM history before retrying");
933
+ const event = /eventId[: ]+([A-Za-z0-9_-]+)/.exec(dm.stdout ?? "")?.[1] ?? "";
934
+ if (!event)
935
+ return fail("send", "DM response has no receipt; status is sending, reconcile DM history before retrying");
936
+ manifest.status = "sent";
937
+ manifest.sentAt = currentTime();
938
+ manifest.dmEventId = event;
939
+ writeJsonAtomically(manifestPath, manifest, true);
940
+ out(`hq-delegate-send: DM delivered to ${display} (${principal}) (eventId ${event}) — status advanced to 'sent'\n`);
941
+ return 0;
942
+ }
943
+ finally {
944
+ removeLock();
945
+ }
946
+ }
947
+ function sleepNative(milliseconds) {
948
+ if (milliseconds > 0)
949
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);
950
+ }
951
+ function captureRun(run) {
952
+ const stdout = [];
953
+ const stderr = [];
954
+ const stdoutWrite = process.stdout.write.bind(process.stdout);
955
+ const stderrWrite = process.stderr.write.bind(process.stderr);
956
+ process.stdout.write = ((chunk) => { stdout.push(typeof chunk === "string" ? Buffer.from(chunk) : Buffer.from(chunk)); return true; });
957
+ process.stderr.write = ((chunk) => { stderr.push(typeof chunk === "string" ? Buffer.from(chunk) : Buffer.from(chunk)); return true; });
958
+ try {
959
+ return { code: run(), stdout: Buffer.concat(stdout), stderr: Buffer.concat(stderr) };
960
+ }
961
+ finally {
962
+ process.stdout.write = stdoutWrite;
963
+ process.stderr.write = stderrWrite;
964
+ }
965
+ }
966
+ function runVerify(args, context) {
967
+ const parsed = parseFlags(args, ["--manifest", "--dry-run", "--company", "--project", "--to", "--mode"]);
968
+ if (parsed.help) {
969
+ out(usage("verify"));
970
+ return 0;
971
+ }
972
+ if (parsed.error)
973
+ return fail("verify", parsed.error);
974
+ const dryRun = parsed.values["--dry-run"] === true;
975
+ const root = context.root ?? context.cwd;
976
+ if (dryRun) {
977
+ const company = text(parsed.values["--company"]);
978
+ const project = text(parsed.values["--project"]);
979
+ const recipient = text(parsed.values["--to"]);
980
+ const mode = text(parsed.values["--mode"], "transfer");
981
+ if (!company)
982
+ return fail("verify", "--dry-run requires --company");
983
+ if (!project)
984
+ return fail("verify", "--dry-run requires --project");
985
+ if (!recipient)
986
+ return fail("verify", "--dry-run requires --to");
987
+ let malformedWhoamiFallbackCode;
988
+ const plan = captureRun(() => runBundle(["build", "--company", company, "--project", project, "--to", recipient, "--mode", mode, "--dry-run"], context, () => {
989
+ malformedWhoamiFallbackCode = runShellFallback("verify", args, context);
990
+ return malformedWhoamiFallbackCode;
991
+ }));
992
+ if (malformedWhoamiFallbackCode !== undefined) {
993
+ if (plan.stdout.length)
994
+ out(plan.stdout);
995
+ if (plan.stderr.length)
996
+ err(plan.stderr);
997
+ return malformedWhoamiFallbackCode;
998
+ }
999
+ if (plan.stderr.length)
1000
+ err(plan.stderr);
1001
+ if (plan.code !== 0)
1002
+ return fail("verify", "could not derive the delegation plan (see builder error above)");
1003
+ let manifest;
1004
+ try {
1005
+ manifest = JSON.parse(plan.stdout.toString("utf8"));
1006
+ }
1007
+ catch (error) {
1008
+ if (error instanceof SyntaxError)
1009
+ return runShellFallback("verify", args, context);
1010
+ return fail("verify", "could not derive the delegation plan (see builder error above)");
1011
+ }
1012
+ const repoRelative = jqRawPath(manifest, "repo.path");
1013
+ const candidates = [path.join(root, "companies", company, "projects", project, ".env.schema"), ...(repoRelative ? [path.join(root, repoRelative, ".env.schema")] : [])];
1014
+ const schema = candidates.find((candidate) => fs.existsSync(candidate) && fs.statSync(candidate).isFile());
1015
+ let secretNames = "(none — no .env.schema found)";
1016
+ if (schema) {
1017
+ const names = [...new Set(fs.readFileSync(schema, "utf8").split(/\r?\n/).filter((line) => /^[A-Za-z_][A-Za-z0-9_]*=/.test(line)).map((line) => line.slice(0, line.indexOf("="))))].sort();
1018
+ secretNames = names.length ? `${names.join(" ")} ` : "(none declared)";
1019
+ }
1020
+ out("Delegation dry run — nothing will be pushed, granted, transferred, or sent.\n\n");
1021
+ out(` Recipient: ${recipient}\n Mode: ${mode}\n Company: ${company}\n Project: ${project}\n\n`);
1022
+ out(" Vault grants that would be written:\n");
1023
+ for (const entry of list(getPath(manifest, "vaultPrefixes", [])))
1024
+ out(` ${jqRawPath(entry, "permission")}\t on ${jqRawPath(entry, "prefix")}\t(${jqRawPath(entry, "reason")})\n`);
1025
+ out(`\n Secret names that would be granted (read): ${secretNames}\n\n`);
1026
+ const repoValue = getPath(manifest, "repo");
1027
+ if (repoValue !== null && repoValue !== undefined)
1028
+ out(` Repo handover: ${jqRawPath(manifest, "repo.path")} — branch ${jqRawPath(manifest, "repo.branch") || "(none)"} (base ${jqRawPath(manifest, "repo.baseBranch")})\n`);
1029
+ else
1030
+ out(" Repo handover: none (project has no repoPath)\n");
1031
+ out(`\n DM that would be sent to ${recipient}:\n "Project handoff: ${project} is yours now — open details for the brief, paste the prompt into your agent to pick it up"\n (prompt: generated pickup prompt; details: the delegation brief)\n`);
1032
+ return 0;
1033
+ }
1034
+ const manifestPath = text(parsed.values["--manifest"]);
1035
+ if (!manifestPath)
1036
+ return fail("verify", "--manifest is required (or --dry-run with --company/--project/--to)");
1037
+ if (!fs.existsSync(manifestPath) || !fs.statSync(manifestPath).isFile())
1038
+ return fail("verify", `manifest not found: ${manifestPath}`);
1039
+ if (malformedJsonFile(manifestPath))
1040
+ return runShellFallback("verify", args, context);
1041
+ const manifest = jsonFile(manifestPath);
1042
+ if (!manifest)
1043
+ return fail("verify", `jq: error: ${manifestPath}: Invalid JSON`);
1044
+ const lock = `${manifestPath}.send-lock`;
1045
+ try {
1046
+ fs.mkdirSync(lock);
1047
+ }
1048
+ catch {
1049
+ return fail("verify", "verification or delivery is active; retry after it finishes");
1050
+ }
1051
+ let cache = "";
1052
+ try {
1053
+ const company = jqRawPath(manifest, "company");
1054
+ const status = jqRawPath(manifest, "status");
1055
+ if (!company)
1056
+ return fail("verify", "manifest has no company");
1057
+ if (status !== "granted" && status !== "verified") {
1058
+ if (status === "building")
1059
+ return fail("verify", "manifest status is 'building' — run hq-delegate-grant.sh first (probe verifies grants, it cannot create them)");
1060
+ return fail("verify", `manifest status is '${status}' — probe runs from 'granted' (or re-runs from 'verified')`);
1061
+ }
1062
+ const prefixes = list(getPath(manifest, "vaultPrefixes", []));
1063
+ if (!prefixes.length)
1064
+ return fail("verify", "manifest has no vaultPrefixes to probe");
1065
+ out(`hq-delegate-verify: probing ${prefixes.length} prefix(es) in company '${company}'\n`);
1066
+ let failed = false;
1067
+ for (const entry of prefixes) {
1068
+ const prefix = jqRawPath(entry, "prefix");
1069
+ const browse = subprocess("hq", ["files", "browse", prefix, "--company", company], context.cwd, { stderr: "pipe" });
1070
+ const combined = `${browse.stdout ?? ""}${browse.stderr ?? ""}`;
1071
+ if (browse.code !== 0) {
1072
+ out(` FAIL ${prefix} — browse errored (likely cause: the grant did not land, or the caller's session expired — re-run /hq-login and hq-delegate-grant.sh)\n`);
1073
+ failed = true;
1074
+ }
1075
+ else if (!combined.replace(/\s/g, "") || combined.replace(/\s/g, "") === "Noobjectsunderthatprefix.") {
1076
+ out(` FAIL ${prefix} — reachable but EMPTY (likely cause: the dossier was never pushed to the vault — hq sync push companies/${company}/... and re-run)\n`);
1077
+ failed = true;
1078
+ }
1079
+ else
1080
+ out(` pass ${prefix}\n`);
1081
+ }
1082
+ const refs = [...list(getPath(manifest, "knowledge", [])), ...list(getPath(manifest, "policies", []))]
1083
+ .filter((entry) => typeof entry === "string" && entry.startsWith(`companies/${company}/`));
1084
+ cache = fs.mkdtempSync(path.join(os.tmpdir(), "tmp-"));
1085
+ const cacheMap = new Map();
1086
+ const browseParent = (parent) => {
1087
+ if (cacheMap.has(parent))
1088
+ return cacheMap.get(parent) ?? "";
1089
+ const retryCount = Number(process.env.HQ_DELEGATE_BROWSE_RETRIES ?? "3");
1090
+ const sleepMs = Number(process.env.HQ_DELEGATE_BROWSE_RETRY_SLEEP ?? "2") * 1000;
1091
+ let listing;
1092
+ let attempt = 1;
1093
+ while (true) {
1094
+ const browse = subprocess("hq", ["files", "browse", parent, "--company", company], context.cwd, { stderr: "ignore" });
1095
+ listing = browse.code === 0 ? browse.stdout ?? "" : "";
1096
+ if (listing.replace(/\s/g, "") || attempt >= retryCount)
1097
+ break;
1098
+ attempt += 1;
1099
+ sleepNative(sleepMs);
1100
+ }
1101
+ cacheMap.set(parent, listing);
1102
+ return listing;
1103
+ };
1104
+ if (refs.length) {
1105
+ out(`hq-delegate-verify: probing ${refs.length} referenced knowledge/policy file(s)\n`);
1106
+ for (const reference of refs) {
1107
+ const relative = reference.slice(`companies/${company}/`.length);
1108
+ const separator = relative.lastIndexOf("/");
1109
+ const parent = `${separator < 0 ? "." : relative.slice(0, separator)}/`;
1110
+ const listing = browseParent(parent);
1111
+ if (browseContainsExactKey(listing, reference))
1112
+ out(` pass ${relative}\n`);
1113
+ else {
1114
+ out(` FAIL ${relative} — granted prefix is reachable but this referenced file is NOT in the vault (likely cause: it was never pushed — hq sync push ${reference} --company ${company} and re-run)\n`);
1115
+ failed = true;
1116
+ }
1117
+ }
1118
+ }
1119
+ if (failed) {
1120
+ err(`hq-delegate-verify: probe FAILED — the DM must not be sent; fix the failing prefix(es) above and re-run (manifest status left at '${status}')\n`);
1121
+ return 1;
1122
+ }
1123
+ const publishCode = runPublish(["--manifest", manifestPath, "--lock-held"], context);
1124
+ if (publishCode !== 0)
1125
+ return fail("verify", "final dossier publication failed; notification blocked");
1126
+ manifest.status = "verified";
1127
+ manifest.verifiedAt = currentTime();
1128
+ writeJsonAtomically(manifestPath, manifest, true);
1129
+ out(`hq-delegate-verify: all ${prefixes.length} prefix(es) reachable — manifest status advanced to 'verified'\n`);
1130
+ return 0;
1131
+ }
1132
+ finally {
1133
+ if (cache)
1134
+ fs.rmSync(cache, { recursive: true, force: true });
1135
+ try {
1136
+ fs.rmdirSync(lock);
1137
+ }
1138
+ catch { /* Keep the primary command result. */ }
1139
+ }
1140
+ }
1141
+ export function runNativeDelegateW1b(name, args, context) {
1142
+ switch (name) {
1143
+ case "bundle": return runBundle(args, context);
1144
+ case "grant": return runGrant(args, context);
1145
+ case "publish": return runPublish(args, context);
1146
+ case "send": return runSend(args, context);
1147
+ case "verify": return runVerify(args, context);
1148
+ }
1149
+ }
1150
+ /** Fast-entry adapter; the shared family flag is resolved before this module loads. */
1151
+ export function runDelegateW1bFast(args, _stdin, _cwd, hqRoot, commandName) {
1152
+ const root = hqRoot ?? resolveLiveRoot();
1153
+ const context = { cwd: root, root };
1154
+ const saved = new Map();
1155
+ for (const key of ["HQ_ROOT", "CLAUDE_PROJECT_DIR", "PWD"])
1156
+ saved.set(key, process.env[key]);
1157
+ process.env.HQ_ROOT = root;
1158
+ process.env.CLAUDE_PROJECT_DIR = root;
1159
+ process.env.PWD = root;
1160
+ let code;
1161
+ try {
1162
+ code = runNativeDelegateW1b(commandName, [...args], context);
1163
+ }
1164
+ finally {
1165
+ for (const [key, value] of saved) {
1166
+ if (value === undefined)
1167
+ delete process.env[key];
1168
+ else
1169
+ process.env[key] = value;
1170
+ }
1171
+ }
1172
+ if (code !== 0)
1173
+ process.exitCode = code;
1174
+ return code;
1175
+ }
1176
+ export function registerCoreDelegateW1b(delegate, core) {
1177
+ for (const name of ["bundle", "grant", "publish", "send", "verify"]) {
1178
+ const command = delegate.command(name)
1179
+ .description(DESCRIPTIONS[name])
1180
+ .allowUnknownOption()
1181
+ .allowExcessArguments()
1182
+ .helpOption(false)
1183
+ .argument("[args...]", "arguments accepted for shell ABI compatibility")
1184
+ .action(async (args = []) => {
1185
+ const options = core.opts();
1186
+ const root = resolveLiveRoot({ hqRoot: options.hqRoot });
1187
+ const context = { cwd: root, root };
1188
+ const { resolveProcessFlagGate } = await import("../lib/flag-registry.js");
1189
+ if (!resolveProcessFlagGate(FLAG, { fallback: false }, () => false)) {
1190
+ const result = runBundledScript({ asset: ASSETS[name], args, cwd: root, hqRoot: root });
1191
+ if (result.code !== 0)
1192
+ process.exit(result.code);
1193
+ return;
1194
+ }
1195
+ const saved = new Map();
1196
+ for (const key of ["HQ_ROOT", "CLAUDE_PROJECT_DIR", "PWD"])
1197
+ saved.set(key, process.env[key]);
1198
+ process.env.HQ_ROOT = root;
1199
+ process.env.CLAUDE_PROJECT_DIR = root;
1200
+ process.env.PWD = root;
1201
+ let code;
1202
+ try {
1203
+ code = runNativeDelegateW1b(name, args, context);
1204
+ }
1205
+ finally {
1206
+ for (const [key, value] of saved) {
1207
+ if (value === undefined)
1208
+ delete process.env[key];
1209
+ else
1210
+ process.env[key] = value;
1211
+ }
1212
+ }
1213
+ if (code !== 0)
1214
+ process.exit(code);
1215
+ });
1216
+ describeCoreCommand(command, { execution: "native", asset: ASSETS[name], root: "live" });
1217
+ }
1218
+ }
1219
+ //# sourceMappingURL=core-delegate-w1b.js.map