@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,1339 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { JSON_SCHEMA, load, loadAll } from "js-yaml";
5
+ import { matchingSecretPatterns } from "../lib/core-utils/secret-patterns.js";
6
+ import { serializeJqJson } from "../lib/core-utils/jq-json-serializer.js";
7
+ import { resolveLiveRoot } from "../utils/hq-roots.js";
8
+ import { runBundledScript } from "../utils/run-bundled-script.js";
9
+ import { describeCoreCommand } from "./core-command-catalog.js";
10
+ const SCHEDULE_PARSE_ASSET = "core/scripts/jobs-schedule-parse.sh";
11
+ const VALIDATE_ASSET = "core/scripts/jobs-validate.sh";
12
+ const RECONCILE_ASSET = "core/scripts/outpost-jobs-reconcile.sh";
13
+ const SCHEDULE_PARSE_USAGE = 'usage: jobs-schedule-parse.sh [--tz IANA] "<nl or cron schedule>"\n';
14
+ const VALIDATE_USAGE = "usage: jobs-validate.sh <file-or-dir> [file-or-dir...]\n";
15
+ const CRON_RE = /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$/;
16
+ const DAY_NAMES = {
17
+ sun: 0, sunday: 0, mon: 1, monday: 1, tue: 2, tues: 2, tuesday: 2,
18
+ wed: 3, wednesday: 3, thu: 4, thur: 4, thurs: 4, thursday: 4,
19
+ fri: 5, friday: 5, sat: 6, saturday: 6,
20
+ };
21
+ const DAY_LABELS = {
22
+ "0": "Sunday", "1": "Monday", "2": "Tuesday", "3": "Wednesday",
23
+ "4": "Thursday", "5": "Friday", "6": "Saturday", "1-5": "weekday",
24
+ "*": "day",
25
+ };
26
+ function parseClock(text) {
27
+ const match = /^(\d{1,2})(?::(\d{2}))?\s*(am|pm)?$/i.exec(text.trim().toLowerCase().replace(/ /g, ""));
28
+ if (!match)
29
+ return undefined;
30
+ let hour = Number.parseInt(match[1], 10);
31
+ const minute = Number.parseInt(match[2] || "0", 10);
32
+ const meridiem = match[3];
33
+ if (minute > 59)
34
+ return undefined;
35
+ if (meridiem) {
36
+ if (hour < 1 || hour > 12)
37
+ return undefined;
38
+ hour = meridiem === "am"
39
+ ? (hour === 12 ? 0 : hour)
40
+ : (hour === 12 ? 12 : hour + 12);
41
+ }
42
+ else if (hour > 23) {
43
+ return undefined;
44
+ }
45
+ return [hour, minute];
46
+ }
47
+ function formatClock(hour, minute) {
48
+ const hour12 = hour % 12 || 12;
49
+ return `${hour12}:${String(minute).padStart(2, "0")} ${hour < 12 ? "AM" : "PM"}`;
50
+ }
51
+ function humanizeCron(cron, timezone) {
52
+ const fields = cron.split(/\s+/);
53
+ if (fields.length !== 5)
54
+ return `Cron \`${cron}\` (${timezone})`;
55
+ const [minute, hour, dayOfMonth, month, dayOfWeek] = fields;
56
+ if (/^\d+$/.test(minute) && /^\d+$/.test(hour) && dayOfMonth === "*"
57
+ && month === "*" && (dayOfWeek === "*" || dayOfWeek === "1-5")) {
58
+ const day = dayOfWeek === "1-5" ? "Every weekday" : "Every day";
59
+ return `${day} at ${formatClock(+hour, +minute)} (${timezone})`;
60
+ }
61
+ if (/^\d+$/.test(minute) && /^\d+$/.test(hour) && dayOfMonth === "*"
62
+ && month === "*" && /^\d+$/.test(dayOfWeek)) {
63
+ const day = DAY_LABELS[dayOfWeek] || `day ${dayOfWeek}`;
64
+ return `Every ${day} at ${formatClock(+hour, +minute)} (${timezone})`;
65
+ }
66
+ if (minute.startsWith("*/") && hour === "*" && dayOfMonth === "*"
67
+ && month === "*" && dayOfWeek === "*") {
68
+ return `Every ${minute.slice(2)} minutes (${timezone})`;
69
+ }
70
+ if (minute === "0" && hour.startsWith("*/") && dayOfMonth === "*"
71
+ && month === "*" && dayOfWeek === "*") {
72
+ return `Every ${hour.slice(2)} hours (${timezone})`;
73
+ }
74
+ if (minute === "0" && hour === "*" && dayOfMonth === "*"
75
+ && month === "*" && dayOfWeek === "*") {
76
+ return `Every hour on the hour (${timezone})`;
77
+ }
78
+ return `Cron \`${cron}\` (${timezone})`;
79
+ }
80
+ function parseNaturalLanguage(text) {
81
+ const normalized = text.trim().toLowerCase();
82
+ let match = /^every\s+(\d+)\s+minutes?$/.exec(normalized);
83
+ if (match) {
84
+ const minutes = Number(match[1]);
85
+ if (minutes < 1 || minutes > 59)
86
+ return [null, "minute interval must be 1..59"];
87
+ return [`*/${minutes} * * * *`, `Every ${minutes} minutes`];
88
+ }
89
+ if (normalized === "every hour" || normalized === "hourly") {
90
+ return ["0 * * * *", "Every hour on the hour"];
91
+ }
92
+ match = /^every\s+(\d+)\s+hours?$/.exec(normalized);
93
+ if (match) {
94
+ const hours = Number(match[1]);
95
+ if (hours < 1 || hours > 23)
96
+ return [null, "hour interval must be 1..23"];
97
+ return [`0 */${hours} * * *`, `Every ${hours} hours`];
98
+ }
99
+ match = /^(?:every\s+)?(weekday|weekdays|day|daily)\s+(?:at\s+)?(.+)$/.exec(normalized);
100
+ if (match) {
101
+ const clock = parseClock(match[2]);
102
+ if (!clock)
103
+ return [null, `could not parse time: ${match[2]}`];
104
+ const [hour, minute] = clock;
105
+ const weekdays = match[1] === "weekday" || match[1] === "weekdays";
106
+ return [
107
+ `${minute} ${hour} * * ${weekdays ? "1-5" : "*"}`,
108
+ `${weekdays ? "Every weekday" : "Every day"} at ${formatClock(hour, minute)}`,
109
+ ];
110
+ }
111
+ match = /^(?:every\s+)?(sun(?:day)?|mon(?:day)?|tue(?:s|sday)?|wed(?:nesday)?|thu(?:r|rs|rsday)?|fri(?:day)?|sat(?:urday)?)s?\s+(?:at\s+)?(.+)$/.exec(normalized);
112
+ if (match) {
113
+ const day = DAY_NAMES[match[1]];
114
+ const clock = parseClock(match[2]);
115
+ if (!clock)
116
+ return [null, `could not parse time: ${match[2]}`];
117
+ return [
118
+ `${clock[1]} ${clock[0]} * * ${day}`,
119
+ `Every ${DAY_LABELS[String(day)]} at ${formatClock(...clock)}`,
120
+ ];
121
+ }
122
+ match = /^at\s+(.+?)\s+every\s+(weekday|weekdays|day|daily)$/.exec(normalized);
123
+ if (match) {
124
+ const clock = parseClock(match[1]);
125
+ if (!clock)
126
+ return [null, `could not parse time: ${match[1]}`];
127
+ const weekdays = match[2] === "weekday" || match[2] === "weekdays";
128
+ return [
129
+ `${clock[1]} ${clock[0]} * * ${weekdays ? "1-5" : "*"}`,
130
+ `${weekdays ? "Every weekday" : "Every day"} at ${formatClock(...clock)}`,
131
+ ];
132
+ }
133
+ return [
134
+ null,
135
+ "unrecognized schedule — try 'every weekday at 9am', 'every day at 14:30', "
136
+ + "'every monday at 9am', a 5-field cron, or 'every 15 minutes'",
137
+ ];
138
+ }
139
+ function isValidTimezone(timezone) {
140
+ const wellFormed = /^(UTC|[A-Za-z0-9_+-]+(\/[A-Za-z0-9_+-]+)+)$/;
141
+ if (!wellFormed.test(timezone))
142
+ return false;
143
+ try {
144
+ new Intl.DateTimeFormat(undefined, { timeZone: timezone });
145
+ return true;
146
+ }
147
+ catch {
148
+ // Hosts without tzdata accept the same well-formed names as the shell.
149
+ return wellFormed.test(timezone);
150
+ }
151
+ }
152
+ export function detectHostTimezone(override, resolveLocaltime = fs.realpathSync, readTimedatectl = () => {
153
+ const result = spawnSync("timedatectl", ["show", "-p", "Timezone", "--value"], { encoding: "utf8", timeout: 2000, stdio: ["ignore", "pipe", "ignore"] });
154
+ if (result.error || result.status !== 0)
155
+ return "";
156
+ return result.stdout || "";
157
+ }) {
158
+ if (override)
159
+ return override;
160
+ const environmentTimezone = (process.env.TZ || "").trim();
161
+ if (environmentTimezone && environmentTimezone.includes("/"))
162
+ return environmentTimezone;
163
+ try {
164
+ const realpath = resolveLocaltime("/etc/localtime");
165
+ const parts = realpath.split(path.sep).filter(Boolean);
166
+ const zoneinfo = parts.indexOf("zoneinfo");
167
+ if (zoneinfo >= 0 && parts.slice(zoneinfo + 1).length) {
168
+ return parts.slice(zoneinfo + 1).join("/");
169
+ }
170
+ }
171
+ catch {
172
+ // Ignore an unavailable local timezone link.
173
+ }
174
+ try {
175
+ const timezone = readTimedatectl().trim();
176
+ if (timezone && timezone.includes("/"))
177
+ return timezone;
178
+ }
179
+ catch {
180
+ // Ignore unavailable timedatectl.
181
+ }
182
+ return "UTC";
183
+ }
184
+ export function runScheduleParse(argv) {
185
+ let timezoneOverride = "";
186
+ const args = [...argv];
187
+ while (args.length) {
188
+ const argument = args[0];
189
+ if (argument === "--tz") {
190
+ if (args.length < 2) {
191
+ process.stderr.write(SCHEDULE_PARSE_USAGE);
192
+ return 2;
193
+ }
194
+ timezoneOverride = args[1];
195
+ args.splice(0, 2);
196
+ }
197
+ else if (argument === "--json") {
198
+ args.shift();
199
+ }
200
+ else if (argument === "-h" || argument === "--help") {
201
+ process.stderr.write(SCHEDULE_PARSE_USAGE);
202
+ return 2;
203
+ }
204
+ else if (argument === "--") {
205
+ args.shift();
206
+ break;
207
+ }
208
+ else if (argument.startsWith("-")) {
209
+ process.stderr.write(`jobs-schedule-parse: unknown flag: ${argument}\n${SCHEDULE_PARSE_USAGE}`);
210
+ return 2;
211
+ }
212
+ else {
213
+ break;
214
+ }
215
+ }
216
+ if (!args.length) {
217
+ process.stderr.write(SCHEDULE_PARSE_USAGE);
218
+ return 2;
219
+ }
220
+ const input = args.join(" ").trim();
221
+ if (!input) {
222
+ process.stdout.write('{"ok":false,"error":"empty schedule"}\n');
223
+ return 1;
224
+ }
225
+ const timezone = detectHostTimezone(timezoneOverride);
226
+ if (!isValidTimezone(timezone)) {
227
+ process.stdout.write(`${JSON.stringify({ ok: false, error: `invalid IANA timezone: ${timezone}` })}\n`);
228
+ return 1;
229
+ }
230
+ if (CRON_RE.test(input) && !/[A-Za-z]/.test(input)) {
231
+ process.stdout.write(`${JSON.stringify({ ok: true, cron: input, timezone, human: humanizeCron(input, timezone), source: "cron" })}\n`);
232
+ return 0;
233
+ }
234
+ const namedCron = /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(mon-fri|monday-friday)$/i.exec(input);
235
+ if (namedCron) {
236
+ const cron = `${namedCron[1]} ${namedCron[2]} ${namedCron[3]} ${namedCron[4]} 1-5`;
237
+ process.stdout.write(`${JSON.stringify({ ok: true, cron, timezone, human: humanizeCron(cron, timezone), source: "cron" })}\n`);
238
+ return 0;
239
+ }
240
+ const [cron, message] = parseNaturalLanguage(input);
241
+ if (cron === null) {
242
+ process.stdout.write(`${JSON.stringify({ ok: false, error: message })}\n`);
243
+ return 1;
244
+ }
245
+ process.stdout.write(`${JSON.stringify({ ok: true, cron, timezone, human: `${message} (${timezone})`, source: "nl" })}\n`);
246
+ return 0;
247
+ }
248
+ function isValidCronField(value, minimum, maximum) {
249
+ return value.split(",").every((part) => {
250
+ if (part === "*")
251
+ return true;
252
+ if (/^\*\/[1-9]\d*$/.test(part))
253
+ return true;
254
+ if (/^(sun|mon|tue|wed|thu|fri|sat)$/i.test(part))
255
+ return maximum === 7;
256
+ if (/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)$/i.test(part))
257
+ return maximum === 12;
258
+ const range = /^(\d+)-(\d+)(?:\/([1-9]\d*))?$/.exec(part);
259
+ if (range) {
260
+ return Number(range[1]) >= minimum && Number(range[2]) <= maximum
261
+ && Number(range[1]) <= Number(range[2]);
262
+ }
263
+ const number = /^(\d+)(?:\/([1-9]\d*))?$/.exec(part);
264
+ if (!number)
265
+ return false;
266
+ return Number(number[1]) >= minimum && Number(number[1]) <= maximum;
267
+ });
268
+ }
269
+ function validateCron(file, cron, emit) {
270
+ const fields = cron.trim().split(/\s+/);
271
+ if (fields.length !== 5) {
272
+ emit(file, "schedule", `invalid cron — expected 5 fields (minute hour dom month dow), got ${fields.length}`);
273
+ return;
274
+ }
275
+ const names = ["minute", "hour", "day-of-month", "month", "day-of-week"];
276
+ const ranges = [[0, 59], [0, 23], [1, 31], [1, 12], [0, 7]];
277
+ fields.forEach((field, index) => {
278
+ const [minimum, maximum] = ranges[index];
279
+ if (!isValidCronField(field, minimum, maximum)) {
280
+ emit(file, "schedule", `invalid cron ${names[index]} field '${field}'`);
281
+ }
282
+ });
283
+ }
284
+ function asText(value) {
285
+ if (value === null || value === undefined || value === false)
286
+ return "";
287
+ if (typeof value === "string")
288
+ return value;
289
+ if (typeof value === "object")
290
+ return JSON.stringify(value, null, 2);
291
+ return String(value);
292
+ }
293
+ function matchingJobSecretPatterns(value) {
294
+ return matchingSecretPatterns(value, { requireBoundary: false });
295
+ }
296
+ function validateCwd(file, field, cwd, emit) {
297
+ if (cwd.startsWith("/")) {
298
+ emit(file, field, "absolute cwd not allowed — use an HQ-root-relative path");
299
+ return;
300
+ }
301
+ if (cwd.split("/").includes("..")) {
302
+ emit(file, field, "cwd must not contain '..' path components");
303
+ }
304
+ }
305
+ function validateJobId(file, value, seenIds, emit) {
306
+ if (!value)
307
+ return;
308
+ if (!/^[a-z][a-z0-9-]{1,62}$/.test(value)) {
309
+ emit(file, "id", `must match [a-z][a-z0-9-]{1,62}, got '${value}'`);
310
+ }
311
+ if (seenIds.includes(value))
312
+ emit(file, "id", `duplicate id '${value}'`);
313
+ seenIds.push(value);
314
+ }
315
+ function validateExec(file, exec, emit) {
316
+ if (exec === undefined || exec === null) {
317
+ emit(file, "exec", "missing required field");
318
+ return;
319
+ }
320
+ if (typeof exec !== "object" || Array.isArray(exec)) {
321
+ emit(file, "exec", "must be an object with prompt or skill");
322
+ return;
323
+ }
324
+ const definition = exec;
325
+ const prompt = asText(definition.prompt);
326
+ const skill = asText(definition.skill);
327
+ if (!prompt && !skill)
328
+ emit(file, "exec", "must set prompt or skill");
329
+ else if (prompt && skill)
330
+ emit(file, "exec", "set exactly one of prompt or skill, not both");
331
+ for (const [field, value] of [["exec.prompt", prompt], ["exec.skill", skill]]) {
332
+ for (const name of matchingJobSecretPatterns(value)) {
333
+ emit(file, field, `inline credential-shaped value matched pattern '${name}' (names only; never values)`);
334
+ }
335
+ }
336
+ if (definition.args !== undefined) {
337
+ if (!definition.args || typeof definition.args !== "object" || Array.isArray(definition.args)) {
338
+ emit(file, "exec.args", "must be a mapping when present");
339
+ }
340
+ else {
341
+ const collectStrings = (value) => {
342
+ if (typeof value === "string")
343
+ return [value];
344
+ if (Array.isArray(value))
345
+ return value.flatMap(collectStrings);
346
+ if (value && typeof value === "object")
347
+ return Object.values(value).flatMap(collectStrings);
348
+ return [];
349
+ };
350
+ for (const value of collectStrings(definition.args)) {
351
+ for (const name of matchingJobSecretPatterns(value)) {
352
+ emit(file, "exec.args", `inline credential-shaped value matched pattern '${name}' (names only; never values)`);
353
+ }
354
+ }
355
+ }
356
+ }
357
+ const surface = asText(definition.surface);
358
+ if (surface && !["headless", "remote"].includes(surface)) {
359
+ emit(file, "exec.surface", `unknown surface '${surface}' (allowed: headless|remote)`);
360
+ }
361
+ for (const key of Object.keys(definition)) {
362
+ if (!["prompt", "skill", "args", "surface"].includes(key)) {
363
+ emit(file, `exec.${key}`, "unknown exec key (allowed: prompt, skill, args, surface)");
364
+ }
365
+ }
366
+ }
367
+ function validateRequirements(file, requirements, runtime, emit) {
368
+ if (requirements === undefined || requirements === null)
369
+ return;
370
+ if (!requirements || typeof requirements !== "object" || Array.isArray(requirements)) {
371
+ emit(file, "requirements", "must be a mapping");
372
+ return;
373
+ }
374
+ const value = requirements;
375
+ for (const key of Object.keys(value)) {
376
+ if (["runtime", "secrets", "company", "cwd", "tools"].includes(key))
377
+ continue;
378
+ const message = ["readiness", "last_probe", "last_run", "failure_class", "pending_probe"].includes(key)
379
+ ? "unknown requirements key (status belongs in hq-pro, not requirements)"
380
+ : "unknown requirements key (allowed: runtime, secrets, company, cwd, tools)";
381
+ emit(file, `requirements.${key}`, message);
382
+ }
383
+ const requiredRuntime = asText(value.runtime);
384
+ if (requiredRuntime && !["claude", "codex"].includes(requiredRuntime)) {
385
+ emit(file, "requirements.runtime", `unknown runtime '${requiredRuntime}' (allowed: claude|codex)`);
386
+ }
387
+ if (requiredRuntime && runtime && value.runtime !== runtime) {
388
+ emit(file, "requirements.runtime", `mismatches top-level runtime ('${requiredRuntime}' vs '${runtime}')`);
389
+ }
390
+ if (value.secrets !== undefined) {
391
+ if (!Array.isArray(value.secrets)) {
392
+ emit(file, "requirements.secrets", "must be an array of vault key names");
393
+ }
394
+ else {
395
+ for (const secret of value.secrets) {
396
+ const name = asText(secret);
397
+ for (const pattern of matchingJobSecretPatterns(name)) {
398
+ emit(file, "requirements.secrets", `inline credential-shaped value matched pattern '${pattern}' (names only; never values)`);
399
+ }
400
+ if (name && !/^[A-Za-z][A-Za-z0-9._:/-]{0,127}$/.test(name)) {
401
+ emit(file, "requirements.secrets", `invalid vault key name '${name}' (use names only)`);
402
+ }
403
+ if (name.includes("=")) {
404
+ emit(file, "requirements.secrets", "looks like KEY=value inline credential — names only");
405
+ }
406
+ }
407
+ }
408
+ }
409
+ if (value.tools !== undefined && !Array.isArray(value.tools)) {
410
+ emit(file, "requirements.tools", "must be an array of strings");
411
+ }
412
+ if (value.cwd)
413
+ validateCwd(file, "requirements.cwd", asText(value.cwd), emit);
414
+ const company = asText(value.company);
415
+ if (company && !/^[a-z0-9]([a-z0-9_-]*[a-z0-9])?$/.test(company)) {
416
+ emit(file, "requirements.company", `invalid company slug '${company}' (lowercase kebab/underscore)`);
417
+ }
418
+ }
419
+ function validateJob(file, document, seenIds, emit) {
420
+ if (!document || typeof document !== "object" || Array.isArray(document)) {
421
+ emit(file, "yaml", "job root must be a mapping");
422
+ return;
423
+ }
424
+ const job = document;
425
+ for (const field of ["id", "name", "schedule", "runtime", "timeout_seconds", "notify", "enabled", "owner", "created_at"]) {
426
+ const missing = field === "enabled" ? !Object.hasOwn(job, field) : asText(job[field]) === "";
427
+ if (missing)
428
+ emit(file, field, "missing required field");
429
+ }
430
+ const id = asText(job.id);
431
+ const schedule = asText(job.schedule);
432
+ const timezone = asText(job.timezone);
433
+ const runtime = asText(job.runtime);
434
+ const timeout = asText(job.timeout_seconds);
435
+ const notify = asText(job.notify);
436
+ if (job.timezone !== undefined && (typeof job.timezone !== "string" || !job.timezone)) {
437
+ emit(file, "timezone", "must be a non-empty string when present");
438
+ }
439
+ validateJobId(file, id, seenIds, emit);
440
+ if (schedule) {
441
+ const fields = schedule.trim().split(/\s+/);
442
+ if (fields.length !== 5) {
443
+ const message = /[a-z]/i.test(schedule)
444
+ ? "natural-language schedule is not allowed — store canonical cron only"
445
+ : `invalid cron — expected 5 fields (minute hour dom month dow), got ${fields.length}`;
446
+ emit(file, "schedule", message);
447
+ }
448
+ else {
449
+ validateCron(file, schedule, emit);
450
+ }
451
+ }
452
+ if (timezone && !(/^[A-Za-z_]+(\/[A-Za-z0-9_+-]+)+$/.test(timezone) || timezone === "UTC")) {
453
+ emit(file, "timezone", `not an IANA-looking timezone '${timezone}'`);
454
+ }
455
+ if (runtime && !["claude", "codex"].includes(runtime)) {
456
+ emit(file, "runtime", `unknown runtime '${runtime}' (allowed: claude|codex)`);
457
+ }
458
+ validateExec(file, job.exec, emit);
459
+ if (timeout) {
460
+ if (!/^\d+$/.test(timeout))
461
+ emit(file, "timeout_seconds", `must be an integer, got '${timeout}'`);
462
+ else if (+timeout < 60 || +timeout > 14400) {
463
+ emit(file, "timeout_seconds", `must be between 60 and 14400, got ${timeout}`);
464
+ }
465
+ }
466
+ if (notify && !["dm", "none", "profile"].includes(notify)) {
467
+ emit(file, "notify", `unknown notify '${notify}' (allowed: dm|none|profile)`);
468
+ }
469
+ if (job.enabled !== undefined && typeof job.enabled !== "boolean") {
470
+ emit(file, "enabled", `must be boolean true|false, got '${String(job.enabled)}'`);
471
+ }
472
+ const createdAt = asText(job.created_at);
473
+ if (createdAt && !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(Z|[+-]\d{2}:\d{2})$/.test(createdAt)) {
474
+ emit(file, "created_at", `must be ISO-8601 datetime, got '${createdAt}'`);
475
+ }
476
+ validateRequirements(file, job.requirements, runtime, emit);
477
+ if (job.cwd)
478
+ validateCwd(file, "cwd", asText(job.cwd), emit);
479
+ }
480
+ function parseJobFile(contents) {
481
+ const documents = [];
482
+ loadAll(contents, (document) => documents.push(document), { schema: JSON_SCHEMA, json: true });
483
+ if (documents.length > 1)
484
+ return [];
485
+ const parsed = documents.length === 0
486
+ ? load(contents, { schema: JSON_SCHEMA, json: true })
487
+ : documents[0];
488
+ return expandYamlMergeKeys(parsed);
489
+ }
490
+ function expandYamlMergeKeys(value) {
491
+ if (Array.isArray(value))
492
+ return value.map(expandYamlMergeKeys);
493
+ if (!value || typeof value !== "object")
494
+ return value;
495
+ const mapping = value;
496
+ const merged = mapping["<<"];
497
+ const sources = Array.isArray(merged) ? merged : merged === undefined ? [] : [merged];
498
+ const result = {};
499
+ for (const source of [...sources].reverse()) {
500
+ if (source && typeof source === "object" && !Array.isArray(source)) {
501
+ Object.assign(result, expandYamlMergeKeys(source));
502
+ }
503
+ }
504
+ for (const [key, entry] of Object.entries(mapping)) {
505
+ if (key !== "<<")
506
+ result[key] = expandYamlMergeKeys(entry);
507
+ }
508
+ return result;
509
+ }
510
+ function collectJobFiles(args, emit) {
511
+ const files = [];
512
+ const collect = (argument) => {
513
+ try {
514
+ const stat = fs.statSync(argument);
515
+ if (stat.isFile()) {
516
+ if (/\.(yaml|yml)$/.test(argument))
517
+ files.push({ diskPath: argument, displayPath: argument });
518
+ else
519
+ emit(argument, "path", "not a .yaml/.yml job file");
520
+ return;
521
+ }
522
+ if (stat.isDirectory()) {
523
+ const strippedArgument = argument.replace(/\/+$/, "") || path.parse(argument).root;
524
+ const walk = (directory, displayDirectory) => {
525
+ const entries = fs.readdirSync(directory, { withFileTypes: true });
526
+ for (const entry of entries) {
527
+ const file = path.join(directory, entry.name);
528
+ const displayFile = `${displayDirectory.replace(/\/$/, "")}/${entry.name}`;
529
+ if (entry.isDirectory())
530
+ walk(file, displayFile);
531
+ else if (entry.isFile() && /\.(yaml|yml)$/.test(entry.name)) {
532
+ files.push({ diskPath: file, displayPath: displayFile });
533
+ }
534
+ }
535
+ };
536
+ walk(argument, strippedArgument);
537
+ return;
538
+ }
539
+ emit(argument, "path", "file or directory not found");
540
+ }
541
+ catch {
542
+ emit(argument, "path", "file or directory not found");
543
+ }
544
+ };
545
+ args.forEach(collect);
546
+ return files;
547
+ }
548
+ function comparePathsLikeSort(left, right) {
549
+ return Buffer.compare(Buffer.from(left), Buffer.from(right));
550
+ }
551
+ export function validateJobs(args) {
552
+ if (!args.length) {
553
+ process.stderr.write(VALIDATE_USAGE);
554
+ return 2;
555
+ }
556
+ const errors = [];
557
+ const emit = (file, field, message) => {
558
+ errors.push(`jobs-validate: ${file}: ${field}: ${message}`);
559
+ };
560
+ const seenIds = [];
561
+ const files = collectJobFiles(args, emit).sort((left, right) => comparePathsLikeSort(left.diskPath, right.diskPath));
562
+ if (!files.length) {
563
+ for (const error of errors)
564
+ process.stderr.write(`${error}\n`);
565
+ process.stderr.write("jobs-validate: no job YAML files found\n");
566
+ return 1;
567
+ }
568
+ for (const { diskPath, displayPath } of files) {
569
+ try {
570
+ validateJob(displayPath, parseJobFile(fs.readFileSync(diskPath, "utf8")), seenIds, emit);
571
+ }
572
+ catch {
573
+ emit(displayPath, "yaml", "failed to parse YAML");
574
+ }
575
+ }
576
+ for (const error of errors)
577
+ process.stderr.write(`${error}\n`);
578
+ if (errors.length) {
579
+ process.stderr.write(`jobs-validate: ${errors.length} error(s)\n`);
580
+ return 1;
581
+ }
582
+ return 0;
583
+ }
584
+ const RECONCILE_USAGE = `outpost-jobs-reconcile.sh — registry YAML → systemd user timers (US-004).
585
+
586
+ Reads personal/jobs/*.yaml and companies/*/jobs/*.yaml from the box HQ tree,
587
+ validates each with jobs-validate.sh, and materializes disposable units:
588
+ ~/.config/systemd/user/hq-job-{id}.service
589
+ ~/.config/systemd/user/hq-job-{id}.timer
590
+ with Persistent=true and RandomizedDelaySec. Timers are armed only when
591
+ hq-pro jobs status readiness=ready (box cache from probe ingest, or live
592
+ GET when available). Disabled/deleted jobs have units removed.
593
+
594
+ Company-scoped jobs materialize only when job.owner matches this Outpost's
595
+ owner identity (creator's box only in v1).
596
+
597
+ Usage:
598
+ core/scripts/outpost-jobs-reconcile.sh [options]
599
+ core/scripts/outpost-jobs-reconcile.sh --after-sync # post-sync entrypoint
600
+
601
+ Options:
602
+ --hq-root DIR HQ tree root (default: HQ_ROOT or repo root above core/)
603
+ --dry-run Write units to unit dir / print plan; skip systemctl
604
+ --no-probe Do not probe non-ready jobs
605
+ --probe-only Probe non-ready jobs then exit (no unit changes)
606
+ --ensure-hook Install personal/hooks/Stop/90-outpost-jobs-reconcile.sh
607
+ --after-sync Alias for default reconcile + probe path (sync Stop hook)
608
+ -h, --help
609
+
610
+ Env / overrides (tests):
611
+ HQ_ROOT, HOME, HQ_JOB_UNIT_DIR, HQ_JOB_SYSTEMCTL, HQ_JOB_STATUS_CACHE_DIR
612
+ HQ_JOB_OWNER_EMAIL, HQ_JOB_OWNER_UID, OUTPOST_USER_ID, OUTPOST_ID
613
+ HQ_JOB_RANDOMIZE_SEC (default 60), HQ_JOB_RECONCILE_STATE
614
+ HQ_PRO_API_URL / HQ_API_URL / HQ_VAULT_API_URL, HQ_ACCESS_TOKEN (optional GET)
615
+
616
+ Exit: 0 success; 1 partial failures; 2 usage/config.
617
+ `;
618
+ function commandResult(command, args) {
619
+ const result = spawnSync(command, args, {
620
+ encoding: "utf8",
621
+ stdio: ["ignore", "pipe", "pipe"],
622
+ });
623
+ return {
624
+ status: result.status ?? (result.error ? 127 : 1),
625
+ stdout: result.stdout ?? "",
626
+ stderr: result.stderr ?? "",
627
+ };
628
+ }
629
+ function isExecutable(file) {
630
+ try {
631
+ fs.accessSync(file, fs.constants.X_OK);
632
+ return fs.statSync(file).isFile();
633
+ }
634
+ catch {
635
+ return false;
636
+ }
637
+ }
638
+ function findExecutable(command, searchPath) {
639
+ if (path.isAbsolute(command) || command.includes(path.sep)) {
640
+ return isExecutable(command) ? command : undefined;
641
+ }
642
+ for (const directory of searchPath.split(path.delimiter)) {
643
+ if (!directory)
644
+ continue;
645
+ const candidate = path.join(directory, command);
646
+ if (isExecutable(candidate))
647
+ return candidate;
648
+ }
649
+ return undefined;
650
+ }
651
+ function shellText(value) {
652
+ if (value === undefined || value === null)
653
+ return "";
654
+ if (typeof value === "string")
655
+ return value;
656
+ if (typeof value === "object")
657
+ return JSON.stringify(value);
658
+ return String(value);
659
+ }
660
+ function parseIdentityAssignments(contents) {
661
+ const values = [];
662
+ for (const line of contents.split(/\r?\n/)) {
663
+ const assignment = /^\s*(?:export\s+)?(OUTPOST_USER_ID|OUTPOST_OWNER_EMAIL|OWNER_EMAIL)\s*=\s*(.*?)\s*$/.exec(line);
664
+ if (!assignment)
665
+ continue;
666
+ let value = assignment[2] ?? "";
667
+ if ((value.startsWith("'") && value.endsWith("'")) || (value.startsWith('"') && value.endsWith('"'))) {
668
+ value = value.slice(1, -1);
669
+ }
670
+ else {
671
+ value = value.replace(/\s+#.*$/, "");
672
+ }
673
+ values.push(value);
674
+ }
675
+ return values;
676
+ }
677
+ function identityFileTokens(options) {
678
+ if (process.env.HQ_JOB_SKIP_SYSTEM_IDENTITY === "1")
679
+ return [];
680
+ const filename = "/etc/outpost/codex-identity.env";
681
+ try {
682
+ const contents = options.identityFileReader
683
+ ? options.identityFileReader(filename)
684
+ : fs.readFileSync(filename, "utf8");
685
+ return contents ? parseIdentityAssignments(contents) : [];
686
+ }
687
+ catch {
688
+ return [];
689
+ }
690
+ }
691
+ function resolveBoxOwners(options) {
692
+ const owners = [];
693
+ const add = (value) => {
694
+ if (!value || value === "null" || owners.includes(value))
695
+ return;
696
+ owners.push(value);
697
+ };
698
+ add(process.env.HQ_JOB_OWNER_EMAIL);
699
+ add(process.env.HQ_JOB_OWNER_UID);
700
+ add(process.env.OUTPOST_USER_ID);
701
+ const searchPath = process.env.PATH ?? "";
702
+ if (findExecutable("hq", searchPath)) {
703
+ const run = options.commandRunner ?? commandResult;
704
+ let result = run("hq", ["whoami", "--json"]);
705
+ if (result.status !== 0)
706
+ result = run("hq", ["whoami"]);
707
+ const who = result.stdout;
708
+ if (who) {
709
+ let parsed;
710
+ try {
711
+ parsed = JSON.parse(who);
712
+ }
713
+ catch {
714
+ parsed = undefined;
715
+ }
716
+ let email = "";
717
+ if (parsed && typeof parsed === "object") {
718
+ const record = parsed;
719
+ const user = record.user && typeof record.user === "object"
720
+ ? record.user
721
+ : undefined;
722
+ email = shellText(record.email ?? user?.email);
723
+ add(email);
724
+ add(shellText(record.personUid ?? record.person_uid ?? record.uid));
725
+ }
726
+ if (!email) {
727
+ const humanEmail = /.*Email:\s*(.*)/i.exec(who)?.[1]
728
+ ?? /.*email\s*[:=]\s*(.*)/i.exec(who)?.[1];
729
+ if (humanEmail)
730
+ add(humanEmail.replace(/\s/g, ""));
731
+ }
732
+ }
733
+ }
734
+ for (const value of identityFileTokens(options))
735
+ add(value);
736
+ return owners;
737
+ }
738
+ function ownerMatches(jobOwner, owners) {
739
+ if (!jobOwner)
740
+ return false;
741
+ return owners.some((owner) => owner === jobOwner
742
+ || (owner.includes("@") && owner.toLowerCase() === jobOwner.toLowerCase()));
743
+ }
744
+ function compareReconcilePaths(left, right) {
745
+ return Buffer.compare(Buffer.from(left), Buffer.from(right));
746
+ }
747
+ function addYamlFilesAtDepth(directory, maxDepth) {
748
+ const result = [];
749
+ const walk = (current, depth) => {
750
+ let entries;
751
+ try {
752
+ entries = fs.readdirSync(current, { withFileTypes: true });
753
+ }
754
+ catch {
755
+ return;
756
+ }
757
+ for (const entry of entries) {
758
+ const file = path.join(current, entry.name);
759
+ if (entry.isFile() && depth <= maxDepth && /\.(yaml|yml)$/.test(entry.name)) {
760
+ result.push(file);
761
+ }
762
+ else if (entry.isDirectory() && depth < maxDepth) {
763
+ walk(file, depth + 1);
764
+ }
765
+ }
766
+ };
767
+ walk(directory, 1);
768
+ return result;
769
+ }
770
+ function collectReconcileJobs(root) {
771
+ const files = addYamlFilesAtDepth(path.join(root, "personal", "jobs"), 1);
772
+ const companies = path.join(root, "companies");
773
+ let companyEntries = [];
774
+ try {
775
+ companyEntries = fs.readdirSync(companies, { withFileTypes: true });
776
+ }
777
+ catch { /* A missing companies tree is empty. */ }
778
+ for (const company of companyEntries) {
779
+ if (!company.isDirectory())
780
+ continue;
781
+ files.push(...addYamlFilesAtDepth(path.join(companies, company.name, "jobs"), 1));
782
+ }
783
+ return files
784
+ .filter((file) => !file.includes(".conflict-") && !file.includes(`${path.sep}.conflicts${path.sep}`))
785
+ .sort(compareReconcilePaths);
786
+ }
787
+ function readJobValue(file) {
788
+ try {
789
+ const parsed = parseJobFile(fs.readFileSync(file, "utf8"));
790
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
791
+ ? parsed
792
+ : {};
793
+ }
794
+ catch {
795
+ return {};
796
+ }
797
+ }
798
+ function reconcileJobIsValid(file) {
799
+ const errors = [];
800
+ try {
801
+ validateJob(file, parseJobFile(fs.readFileSync(file, "utf8")), [], (_path, _field, message) => errors.push(message));
802
+ return errors.length === 0;
803
+ }
804
+ catch {
805
+ return false;
806
+ }
807
+ }
808
+ function parseData(contents) {
809
+ return load(contents, { schema: JSON_SCHEMA, json: true });
810
+ }
811
+ function recordOf(value) {
812
+ return value !== null && typeof value === "object" && !Array.isArray(value)
813
+ ? value
814
+ : undefined;
815
+ }
816
+ function writeReadinessCache(cacheDir, id, readiness, source, options) {
817
+ const filename = path.join(cacheDir, `${id}.json`);
818
+ const updatedAt = (options.now?.() ?? new Date()).toISOString().replace(/\.\d{3}Z$/, "Z");
819
+ fs.writeFileSync(filename, serializeJqJson({ job_id: id, readiness, updated_at: updatedAt, source }, "compact"));
820
+ try {
821
+ fs.chmodSync(filename, 0o600);
822
+ }
823
+ catch { /* The shell ignores chmod failure. */ }
824
+ }
825
+ function cachedReadiness(cacheDir, home, id) {
826
+ try {
827
+ const record = recordOf(parseData(fs.readFileSync(path.join(cacheDir, `${id}.json`), "utf8")));
828
+ const value = record?.readiness;
829
+ if (value !== undefined && value !== null && value !== false)
830
+ return shellText(value);
831
+ if (value === false)
832
+ return "unknown";
833
+ }
834
+ catch { /* The shell falls through to the probe marker. */ }
835
+ try {
836
+ const marker = JSON.parse(fs.readFileSync(path.join(home, ".hq", "jobs", "probes", id, "last-attempt.json"), "utf8"));
837
+ const reported = marker.reported_readiness;
838
+ if (reported !== undefined && reported !== null && reported !== false && reported !== "")
839
+ return shellText(reported);
840
+ }
841
+ catch { /* No successful prior probe marker. */ }
842
+ return "unknown";
843
+ }
844
+ async function liveReadiness(id, cacheDir, options) {
845
+ if (process.env.HQ_JOB_DISABLE_LIVE_READINESS === "1")
846
+ return undefined;
847
+ const token = process.env.HQ_ACCESS_TOKEN;
848
+ if (!token)
849
+ return undefined;
850
+ const api = process.env.HQ_PRO_API_URL || process.env.HQ_API_URL || process.env.HQ_VAULT_API_URL || "https://hqapi.hq.computer";
851
+ const url = `${api.replace(/\/$/, "")}/outpost/jobs/status/${id}`;
852
+ try {
853
+ const response = await (options.fetcher ?? fetch)(url, {
854
+ method: "GET",
855
+ headers: { authorization: `Bearer ${token}`, accept: "application/json" },
856
+ signal: AbortSignal.timeout(15_000),
857
+ });
858
+ if (!response.ok)
859
+ return undefined;
860
+ const body = recordOf(await response.json());
861
+ const status = recordOf(body?.status);
862
+ const readiness = status?.readiness !== undefined && status.readiness !== null && status.readiness !== false
863
+ ? status.readiness
864
+ : body?.readiness;
865
+ if (readiness === undefined || readiness === null || readiness === false || readiness === "")
866
+ return undefined;
867
+ const result = shellText(readiness);
868
+ writeReadinessCache(cacheDir, id, result, "api-get", options);
869
+ return result;
870
+ }
871
+ catch {
872
+ return undefined;
873
+ }
874
+ }
875
+ async function jobReadiness(id, cacheDir, home, options) {
876
+ return await liveReadiness(id, cacheDir, options) ?? cachedReadiness(cacheDir, home, id);
877
+ }
878
+ function probeValue(output, field) {
879
+ try {
880
+ const record = recordOf(JSON.parse(output));
881
+ const value = record?.[field];
882
+ return value === undefined || value === null ? "" : shellText(value);
883
+ }
884
+ catch {
885
+ return "";
886
+ }
887
+ }
888
+ function cronDowNumber(value) {
889
+ const names = { "0": "Sun", "1": "Mon", "2": "Tue", "3": "Wed", "4": "Thu", "5": "Fri", "6": "Sat", "7": "Sun" };
890
+ return names[value];
891
+ }
892
+ function cronDowTokenToSystemd(token) {
893
+ if (/^[0-7]+-[0-7]+$/.test(token)) {
894
+ const [from, to] = token.split("-");
895
+ const start = cronDowNumber(from ?? "");
896
+ const end = cronDowNumber(to ?? "");
897
+ return start && end ? `${start}..${end}` : undefined;
898
+ }
899
+ const lower = token.toLowerCase();
900
+ const names = {
901
+ sun: "Sun", "0": "Sun", "7": "Sun", mon: "Mon", "1": "Mon",
902
+ tue: "Tue", "2": "Tue", wed: "Wed", "3": "Wed", thu: "Thu", "4": "Thu",
903
+ fri: "Fri", "5": "Fri", sat: "Sat", "6": "Sat", "mon..fri": "Mon..Fri", "1-5": "Mon..Fri",
904
+ };
905
+ return names[lower];
906
+ }
907
+ function cronDowToSystemd(field) {
908
+ if (field === "*" || field === "*/1")
909
+ return "";
910
+ const mapped = [];
911
+ for (const part of field.split(/[\s,]+/)) {
912
+ const value = cronDowTokenToSystemd(part);
913
+ if (!value)
914
+ return undefined;
915
+ mapped.push(value);
916
+ }
917
+ return mapped.join(",");
918
+ }
919
+ function padCronField(value) {
920
+ return value.length === 1 ? `0${value}` : value;
921
+ }
922
+ function cronTimeField(field) {
923
+ if (field === "*")
924
+ return "";
925
+ if (field.includes("/"))
926
+ return `*/${field.slice(field.indexOf("/") + 1)}`;
927
+ if (field.includes("-"))
928
+ return field;
929
+ return /^\d+$/.test(field) ? padCronField(field) : field;
930
+ }
931
+ function cronToOnCalendar(fields) {
932
+ const [minute = "", hour = "", dom = "", month = "", dow = ""] = fields;
933
+ const dowValue = cronDowToSystemd(dow) ?? "";
934
+ const monthValue = month === "*" ? "*" : padCronField(month);
935
+ const dayValue = dom === "*" ? "*" : padCronField(dom);
936
+ const date = `*-${monthValue}-${dayValue}`;
937
+ const minuteValue = cronTimeField(minute) || "00";
938
+ const hourValue = cronTimeField(hour) || "*";
939
+ let time;
940
+ if (hourValue === "*")
941
+ time = `*:${minuteValue}:00`;
942
+ else if (hourValue.includes("/"))
943
+ time = `0/${hourValue.slice(hourValue.indexOf("/") + 1)}:${minuteValue}:00`;
944
+ else
945
+ time = `${hourValue}:${minuteValue}:00`;
946
+ return dowValue ? `${dowValue} ${date} ${time}` : `${date} ${time}`;
947
+ }
948
+ function normalizeServicePath(value) {
949
+ const entries = [];
950
+ for (const entry of value.split(":")) {
951
+ if (entry.startsWith("/") && !entries.includes(entry))
952
+ entries.push(entry);
953
+ }
954
+ return entries.join(":");
955
+ }
956
+ function servicePathValue() {
957
+ let servicePath = normalizeServicePath(process.env.PATH || "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");
958
+ const hq = findExecutable("hq", servicePath);
959
+ if (hq) {
960
+ let binDirectory = "";
961
+ try {
962
+ binDirectory = fs.realpathSync(path.dirname(hq));
963
+ }
964
+ catch { /* `pwd -P` failed in the shell equivalent. */ }
965
+ if (binDirectory && !servicePath.split(":").includes(binDirectory))
966
+ servicePath = [binDirectory, servicePath].filter(Boolean).join(":");
967
+ }
968
+ return servicePath;
969
+ }
970
+ function systemdQuote(value) {
971
+ return `"${value.replace(/%/g, "%%").replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t")}"`;
972
+ }
973
+ function serviceUnit(root, runner, id) {
974
+ const pathValue = systemdQuote(`PATH=${servicePathValue()}`);
975
+ return `# Generated by outpost-jobs-reconcile.sh — disposable derived state. Do not edit.\n[Unit]\nDescription=HQ Outpost scheduled job: ${id}\nDocumentation=file://${root}/core/knowledge/public/hq-core/outpost-jobs-spec.md\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=oneshot\nEnvironment=HQ_ROOT=${root}\nEnvironment=${pathValue}\nExecStart=${runner} --hq-root ${root} --job-id ${id}\nNice=10\n\n[Install]\nWantedBy=default.target\n`;
976
+ }
977
+ function timerUnit(id, onCalendar, randomize, root) {
978
+ return `# Generated by outpost-jobs-reconcile.sh — disposable derived state. Do not edit.\n[Unit]\nDescription=HQ Outpost scheduled job timer: ${id}\nDocumentation=file://${root}/core/knowledge/public/hq-core/outpost-jobs-spec.md\n\n[Timer]\nOnCalendar=${onCalendar}\nPersistent=true\nRandomizedDelaySec=${randomize}\nUnit=hq-job-${id}.service\n\n[Install]\nWantedBy=timers.target\n`;
979
+ }
980
+ function systemctlResult(args, dryRun, command, options) {
981
+ if (dryRun) {
982
+ process.stderr.write(`outpost-jobs-reconcile: dry-run systemctl --user ${args.join(" ")}\n`);
983
+ return { status: 0, stdout: "", stderr: "" };
984
+ }
985
+ if (command === ":" || command === "true")
986
+ return { status: 0, stdout: "", stderr: "" };
987
+ if (!options.schedulerRunner && !findExecutable(command, process.env.PATH ?? "")) {
988
+ process.stderr.write(`outpost-jobs-reconcile: systemctl not available — units written but not enabled (${args.join(" ")})\n`);
989
+ return { status: 0, stdout: "", stderr: "" };
990
+ }
991
+ if (process.env.HQ_JOB_TEST_SCHEDULER_STUB === "1" && !options.schedulerRunner) {
992
+ return { status: 127, stdout: "", stderr: "scheduler stub was requested but no injected runner was supplied" };
993
+ }
994
+ try {
995
+ const runner = options.schedulerRunner ?? commandResult;
996
+ return runner(command, ["--user", ...args]);
997
+ }
998
+ catch (error) {
999
+ return { status: 127, stdout: "", stderr: error instanceof Error ? error.message : String(error) };
1000
+ }
1001
+ }
1002
+ function installSyncHook(root) {
1003
+ const directory = path.join(root, "personal", "hooks", "Stop");
1004
+ const filename = path.join(directory, "90-outpost-jobs-reconcile.sh");
1005
+ fs.mkdirSync(directory, { recursive: true });
1006
+ const contents = [
1007
+ "#!/usr/bin/env bash",
1008
+ "# Auto-installed by outpost-jobs-reconcile.sh --ensure-hook (US-004).",
1009
+ "# hq-sync-runner executes personal/hooks/Stop/* after each sync cycle.",
1010
+ "set -u",
1011
+ 'HQ_ROOT="${OUTPOST_HQ_ROOT:-${HQ_ROOT:-/home/ec2-user/hq}}"',
1012
+ 'RECONCILE="$HQ_ROOT/core/scripts/outpost-jobs-reconcile.sh"',
1013
+ 'if [ -x "$RECONCILE" ] || [ -f "$RECONCILE" ]; then',
1014
+ ' bash "$RECONCILE" --hq-root "$HQ_ROOT" --after-sync >>"${HOME}/.hq/jobs/reconcile/after-sync.log" 2>&1 || true',
1015
+ "fi",
1016
+ "",
1017
+ ].join("\n");
1018
+ fs.writeFileSync(filename, contents);
1019
+ fs.chmodSync(filename, 0o755);
1020
+ process.stderr.write(`outpost-jobs-reconcile: installed sync Stop hook: ${filename}\n`);
1021
+ }
1022
+ function disableRemoveUnits(id, unitDir, command, dryRun, options) {
1023
+ for (const args of [["disable", "--now", `hq-job-${id}.timer`], ["stop", `hq-job-${id}.service`]]) {
1024
+ const result = systemctlResult(args, dryRun, command, options);
1025
+ if (result.stdout)
1026
+ process.stdout.write(result.stdout);
1027
+ }
1028
+ fs.rmSync(path.join(unitDir, `hq-job-${id}.service`), { force: true });
1029
+ fs.rmSync(path.join(unitDir, `hq-job-${id}.timer`), { force: true });
1030
+ }
1031
+ function jobEnabled(job) {
1032
+ return job.enabled === undefined ? "true" : shellText(job.enabled);
1033
+ }
1034
+ function isCompanyJobPath(file) {
1035
+ return file.split(path.sep).join("/").includes("/companies/");
1036
+ }
1037
+ function reconcileDie(message) {
1038
+ process.stderr.write(`outpost-jobs-reconcile: ${message}\n`);
1039
+ return 2;
1040
+ }
1041
+ export async function runReconcile(argv, rootArg, options = {}) {
1042
+ let root = rootArg ?? process.env.HQ_ROOT ?? "";
1043
+ let dryRun = false;
1044
+ let noProbe = false;
1045
+ let probeOnly = false;
1046
+ let ensureHook = false;
1047
+ const args = [...argv];
1048
+ for (let index = 0; index < args.length;) {
1049
+ const arg = args[index];
1050
+ if (arg === "--hq-root") {
1051
+ const value = args[index + 1] ?? "";
1052
+ if (!value)
1053
+ return reconcileDie("--hq-root requires a directory");
1054
+ root = value;
1055
+ index += 2;
1056
+ }
1057
+ else if (arg === "--dry-run") {
1058
+ dryRun = true;
1059
+ index += 1;
1060
+ }
1061
+ else if (arg === "--no-probe") {
1062
+ noProbe = true;
1063
+ index += 1;
1064
+ }
1065
+ else if (arg === "--probe-only") {
1066
+ probeOnly = true;
1067
+ index += 1;
1068
+ }
1069
+ else if (arg === "--ensure-hook") {
1070
+ ensureHook = true;
1071
+ index += 1;
1072
+ }
1073
+ else if (arg === "--after-sync") {
1074
+ index += 1;
1075
+ }
1076
+ else if (arg === "-h" || arg === "--help") {
1077
+ process.stdout.write(`${RECONCILE_USAGE}\n`);
1078
+ return 0;
1079
+ }
1080
+ else if (arg?.startsWith("-")) {
1081
+ return reconcileDie(`unknown option: ${arg}`);
1082
+ }
1083
+ else if (arg !== undefined) {
1084
+ return reconcileDie(`unexpected argument: ${arg}`);
1085
+ }
1086
+ }
1087
+ if (!root)
1088
+ root = resolveLiveRoot();
1089
+ const validator = path.join(root, "core", "scripts", "jobs-validate.sh");
1090
+ const runner = path.join(root, "core", "scripts", "hq-job-run.sh");
1091
+ const probe = path.join(root, "core", "scripts", "hq-job-probe.sh");
1092
+ if (!fs.existsSync(validator))
1093
+ return reconcileDie("missing jobs-validate.sh");
1094
+ if (!fs.existsSync(runner))
1095
+ return reconcileDie("missing hq-job-run.sh");
1096
+ if (!fs.existsSync(probe))
1097
+ return reconcileDie("missing hq-job-probe.sh");
1098
+ const home = process.env.HOME ?? "";
1099
+ const unitDir = process.env.HQ_JOB_UNIT_DIR || path.join(home, ".config", "systemd", "user");
1100
+ const cacheDir = process.env.HQ_JOB_STATUS_CACHE_DIR || path.join(home, ".hq", "jobs", "status-cache");
1101
+ const stateDir = process.env.HQ_JOB_RECONCILE_STATE || path.join(home, ".hq", "jobs", "reconcile");
1102
+ const systemctl = process.env.HQ_JOB_SYSTEMCTL || "systemctl";
1103
+ const randomize = process.env.HQ_JOB_RANDOMIZE_SEC || "60";
1104
+ for (const directory of [unitDir, cacheDir, stateDir])
1105
+ fs.mkdirSync(directory, { recursive: true });
1106
+ const log = (message) => {
1107
+ process.stderr.write(`outpost-jobs-reconcile: ${message}\n`);
1108
+ };
1109
+ const commandRunner = options.commandRunner ?? commandResult;
1110
+ const owners = resolveBoxOwners(options);
1111
+ let errors = 0;
1112
+ let armed = 0;
1113
+ let skipped = 0;
1114
+ let removed = 0;
1115
+ let probed = 0;
1116
+ const desired = new Set();
1117
+ if (ensureHook)
1118
+ installSyncHook(root);
1119
+ if (!noProbe) {
1120
+ for (const file of collectReconcileJobs(root)) {
1121
+ if (!reconcileJobIsValid(file))
1122
+ continue;
1123
+ const job = readJobValue(file);
1124
+ const id = shellText(job.id);
1125
+ if (!id)
1126
+ continue;
1127
+ if (isCompanyJobPath(file) && !ownerMatches(shellText(job.owner), owners))
1128
+ continue;
1129
+ const readiness = await jobReadiness(id, cacheDir, home, options);
1130
+ if (readiness === "ready")
1131
+ continue;
1132
+ log(`probe ${id} (cached readiness=${readiness})`);
1133
+ const result = commandRunner("bash", [probe, "--hq-root", root, file]);
1134
+ probed += 1;
1135
+ const probeReadiness = probeValue(result.stdout, "readiness");
1136
+ if (probeReadiness) {
1137
+ const ingest = probeValue(result.stdout, "ingest");
1138
+ if (ingest === "ok" || ingest === "dry_run")
1139
+ writeReadinessCache(cacheDir, id, probeReadiness, "probe", options);
1140
+ else if (probeReadiness === "blocked")
1141
+ writeReadinessCache(cacheDir, id, "blocked", "probe-local", options);
1142
+ }
1143
+ if (result.status >= 2 && result.status !== 3)
1144
+ errors += 1;
1145
+ }
1146
+ }
1147
+ if (probeOnly) {
1148
+ log(`probe-only done (probed=${probed} errors=${errors})`);
1149
+ return errors === 0 ? 0 : 1;
1150
+ }
1151
+ for (const file of collectReconcileJobs(root)) {
1152
+ const job = readJobValue(file);
1153
+ const idHint = shellText(job.id);
1154
+ const timezone = shellText(job.timezone);
1155
+ if (timezone && !/^[A-Za-z0-9/_+-]+$/.test(timezone)) {
1156
+ log(`skip ${idHint || "unknown"} — invalid timezone contains unsafe characters`);
1157
+ errors += 1;
1158
+ continue;
1159
+ }
1160
+ if (!reconcileJobIsValid(file)) {
1161
+ log(`skip invalid job YAML: ${file}`);
1162
+ errors += 1;
1163
+ continue;
1164
+ }
1165
+ const id = idHint;
1166
+ const name = shellText(job.name);
1167
+ const owner = shellText(job.owner);
1168
+ const schedule = shellText(job.schedule);
1169
+ const companyJob = isCompanyJobPath(file);
1170
+ const timerPath = path.join(unitDir, `hq-job-${id}.timer`);
1171
+ const servicePath = path.join(unitDir, `hq-job-${id}.service`);
1172
+ if (companyJob && !ownerMatches(owner, owners)) {
1173
+ log(`skip company job ${id} — owner '${owner}' does not match this Outpost`);
1174
+ skipped += 1;
1175
+ if (fs.existsSync(timerPath)) {
1176
+ disableRemoveUnits(id, unitDir, systemctl, dryRun, options);
1177
+ removed += 1;
1178
+ }
1179
+ continue;
1180
+ }
1181
+ const enabled = jobEnabled(job);
1182
+ if (enabled === "false" || enabled === "False" || enabled === "0") {
1183
+ log(`remove units for disabled job ${id}`);
1184
+ if (fs.existsSync(timerPath) || fs.existsSync(servicePath)) {
1185
+ disableRemoveUnits(id, unitDir, systemctl, dryRun, options);
1186
+ removed += 1;
1187
+ }
1188
+ continue;
1189
+ }
1190
+ const readiness = await jobReadiness(id, cacheDir, home, options);
1191
+ if (readiness !== "ready") {
1192
+ log(`skip arming ${id} — readiness=${readiness} (need ready)`);
1193
+ skipped += 1;
1194
+ if (fs.existsSync(timerPath)) {
1195
+ disableRemoveUnits(id, unitDir, systemctl, dryRun, options);
1196
+ removed += 1;
1197
+ log(`stopped timer for non-ready job ${id}`);
1198
+ }
1199
+ continue;
1200
+ }
1201
+ const cron = schedule.trim().split(/\s+/);
1202
+ if (cron.length !== 5) {
1203
+ log(`skip ${id} — schedule not 5-field cron: ${schedule}`);
1204
+ errors += 1;
1205
+ continue;
1206
+ }
1207
+ let onCalendar = cronToOnCalendar(cron);
1208
+ if (timezone && !` ${onCalendar} `.includes(` ${timezone} `))
1209
+ onCalendar = `${onCalendar} ${timezone}`;
1210
+ desired.add(id);
1211
+ const service = serviceUnit(root, runner, id);
1212
+ const timer = timerUnit(id, onCalendar, randomize, root);
1213
+ const unchanged = fs.existsSync(servicePath) && fs.existsSync(timerPath)
1214
+ && fs.readFileSync(servicePath, "utf8") === service
1215
+ && fs.readFileSync(timerPath, "utf8") === timer;
1216
+ if (unchanged) {
1217
+ log(`noop ${id} — units unchanged (${name})`);
1218
+ const reload = systemctlResult(["daemon-reload"], dryRun, systemctl, options);
1219
+ if (reload.stdout)
1220
+ process.stdout.write(reload.stdout);
1221
+ if (reload.stderr)
1222
+ process.stderr.write(reload.stderr);
1223
+ const enabledResult = systemctlResult(["enable", "--now", `hq-job-${id}.timer`], dryRun, systemctl, options);
1224
+ const output = `${enabledResult.stdout}${enabledResult.stderr}`.replace(/\n+$/, "");
1225
+ if (enabledResult.status !== 0) {
1226
+ log(`systemctl enable timer failed for job ${id} exit=${enabledResult.status}: ${output || "no error message"}`);
1227
+ skipped += 1;
1228
+ errors += 1;
1229
+ }
1230
+ else {
1231
+ if (output)
1232
+ process.stderr.write(`${output}\n`);
1233
+ armed += 1;
1234
+ }
1235
+ continue;
1236
+ }
1237
+ fs.writeFileSync(servicePath, service);
1238
+ fs.writeFileSync(timerPath, timer);
1239
+ const reload = systemctlResult(["daemon-reload"], dryRun, systemctl, options);
1240
+ if (reload.stdout)
1241
+ process.stdout.write(reload.stdout);
1242
+ if (reload.stderr)
1243
+ process.stderr.write(reload.stderr);
1244
+ const enabledResult = systemctlResult(["enable", "--now", `hq-job-${id}.timer`], dryRun, systemctl, options);
1245
+ const output = `${enabledResult.stdout}${enabledResult.stderr}`.replace(/\n+$/, "");
1246
+ if (enabledResult.status === 0) {
1247
+ if (output)
1248
+ process.stderr.write(`${output}\n`);
1249
+ if (!dryRun)
1250
+ log(`armed ${id} OnCalendar=${onCalendar} readiness=ready`);
1251
+ armed += 1;
1252
+ }
1253
+ else {
1254
+ log(`systemctl enable timer failed for job ${id} exit=${enabledResult.status}: ${output || "no error message"}`);
1255
+ skipped += 1;
1256
+ errors += 1;
1257
+ }
1258
+ }
1259
+ let unitNames = [];
1260
+ try {
1261
+ unitNames = fs.readdirSync(unitDir);
1262
+ }
1263
+ catch { /* The shell's unmatched glob is ignored. */ }
1264
+ for (const unitName of unitNames) {
1265
+ const match = /^hq-job-(.+)\.timer$/.exec(unitName);
1266
+ if (!match)
1267
+ continue;
1268
+ const id = match[1];
1269
+ if (desired.has(id))
1270
+ continue;
1271
+ log(`remove orphaned units for deleted/unarmed job ${id}`);
1272
+ disableRemoveUnits(id, unitDir, systemctl, dryRun, options);
1273
+ removed += 1;
1274
+ }
1275
+ const timestamp = (options.now?.() ?? new Date()).toISOString().replace(/\.\d{3}Z$/, "Z");
1276
+ fs.writeFileSync(path.join(stateDir, "last-reconcile.json"), serializeJqJson({
1277
+ armed, skipped, removed, probed, errors, dry_run: dryRun, at: timestamp,
1278
+ }, "compact"));
1279
+ log(`done armed=${armed} skipped=${skipped} removed=${removed} probed=${probed} errors=${errors}`);
1280
+ return errors === 0 ? 0 : 1;
1281
+ }
1282
+ export function registerCoreJobsNativeCommand(core) {
1283
+ const jobs = core.command("jobs").description("Scheduled jobs helpers");
1284
+ const register = (name, asset, summary, run) => {
1285
+ const command = jobs.command(name)
1286
+ .description(summary)
1287
+ .helpOption(false)
1288
+ .allowUnknownOption()
1289
+ .allowExcessArguments(true)
1290
+ .argument("[args...]", "Arguments passed to the scaffold helper")
1291
+ .action(async (args, _options, current) => {
1292
+ const argv = rawArgumentsForCommand(current, args);
1293
+ const groupHqRoot = core.opts().hqRoot;
1294
+ const { coreNativeJobsEnabled } = await import("./core-native-jobs-flag.js");
1295
+ if (!await coreNativeJobsEnabled()) {
1296
+ const hqRoot = asset === RECONCILE_ASSET && !argv.includes("--hq-root")
1297
+ && !argv.includes("--help") && !argv.includes("-h")
1298
+ ? resolveLiveRoot({ hqRoot: groupHqRoot })
1299
+ : undefined;
1300
+ const result = runBundledScript({ asset, args: argv, cwd: process.cwd(), ...(hqRoot ? { hqRoot } : {}) });
1301
+ if (result.code !== 0)
1302
+ process.exit(result.code);
1303
+ return;
1304
+ }
1305
+ const result = await run(argv, groupHqRoot ?? process.env.HQ_ROOT);
1306
+ if (result !== 0)
1307
+ process.exit(result);
1308
+ });
1309
+ describeCoreCommand(command, { execution: "native", asset, root: "live" });
1310
+ };
1311
+ register("schedule-parse", SCHEDULE_PARSE_ASSET, "Resolve natural-language or raw cron schedules", runScheduleParse);
1312
+ register("validate", VALIDATE_ASSET, "Validate scheduled-job YAML files", validateJobs);
1313
+ register("reconcile", RECONCILE_ASSET, "Materialize scheduled jobs on this outpost", runReconcile);
1314
+ }
1315
+ export function rawArgumentsForCommand(command, fallback, raw = process.argv) {
1316
+ const names = [];
1317
+ for (let current = command; current?.parent; current = current.parent) {
1318
+ names.unshift(current.name());
1319
+ }
1320
+ let start = -1;
1321
+ let cursor = 0;
1322
+ for (const name of names) {
1323
+ const index = raw.indexOf(name, cursor);
1324
+ if (index < 0)
1325
+ return command.args.length ? command.args : fallback;
1326
+ cursor = index + 1;
1327
+ start = cursor;
1328
+ }
1329
+ return start >= 0 ? raw.slice(start) : (command.args.length ? command.args : fallback);
1330
+ }
1331
+ /** Fast-entry adapter; the shared family flag is resolved before this module loads. */
1332
+ export async function runJobsFast(args, _stdin, _cwd, _liveRoot, commandName, hqRootArg) {
1333
+ if (commandName === "schedule-parse")
1334
+ return runScheduleParse([...args]);
1335
+ if (commandName === "validate")
1336
+ return validateJobs([...args]);
1337
+ return runReconcile([...args], hqRootArg ?? process.env.HQ_ROOT);
1338
+ }
1339
+ //# sourceMappingURL=core-jobs-native.js.map