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