@indigoai-us/hq-cli 5.314.0 → 5.315.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4311 -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/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/resolve-company.sh +199 -0
- package/assets/scaffold/core/scripts/resume-thread-lock.sh +285 -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 +10753 -0
- package/dist/command-catalog.generated.js +13859 -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 +127 -0
- package/dist/commands/bot-jobs.js +454 -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-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-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-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-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 +277 -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 +8983 -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 +6 -7
- package/dist/fast-core.js +87 -24
- package/dist/fast-scaffold.d.ts +86 -0
- package/dist/fast-scaffold.js +364 -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-run.d.ts +109 -0
- package/dist/lib/bot/job-run.js +246 -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 +217 -0
- package/dist/lib/bot/run.js +1869 -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/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 +133 -0
- package/dist/lib/lanes/autopilot.js +1222 -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 +66 -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 +22 -0
- package/dist/lib/lanes/flag-keys.js +22 -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 +479 -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 +46 -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 +147 -0
- package/dist/lib/lanes/outpost-dispatch.js +271 -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
package/dist/commands/agents.js
CHANGED
|
@@ -15,8 +15,11 @@
|
|
|
15
15
|
* hq agents start|stop <uid> — EC2 start/stop
|
|
16
16
|
* hq agents retry <uid> — resume setup from first non-done step
|
|
17
17
|
* hq agents rm <uid> --yes — deprovision (destructive; flag-guarded)
|
|
18
|
+
* hq agents rotate <uid> — new enrollment code for an external agent
|
|
19
|
+
* hq agents revoke <uid> --yes — revoke an external agent (--remove deletes it)
|
|
18
20
|
* hq agents jobs list <uid> — off-box job roster (schedule + rate)
|
|
19
21
|
* hq agents jobs pause <uid> <jobId> — flip schedule State=DISABLED
|
|
22
|
+
* hq agents jobs resume <uid> <jobId> — flip schedule State=ENABLED
|
|
20
23
|
* hq agents jobs cancel <uid> <jobId> — delete schedule + drop the job
|
|
21
24
|
*
|
|
22
25
|
* Agents are company-scoped. `--company <slug>` may sit on the group
|
|
@@ -28,11 +31,17 @@ import chalk from "chalk";
|
|
|
28
31
|
import { randomUUID } from "node:crypto";
|
|
29
32
|
import * as readline from "node:readline";
|
|
30
33
|
import { resolveVaultCredential } from "../utils/resolve-vault-credential.js";
|
|
34
|
+
import { maxLength } from "../utils/table-width.js";
|
|
35
|
+
import { DEFAULT_VAULT_API_URL } from "../utils/cognito-session.js";
|
|
31
36
|
import { gateApiKeyCapabilities } from "../utils/api-key-command-gate.js";
|
|
37
|
+
import { queueCliLimitNoticeEngagement, queueCliLimitNoticeExposure, } from "../utils/cli-telemetry.js";
|
|
32
38
|
import { vaultApiFetch, getCompanyUid } from "../utils/vault-api.js";
|
|
39
|
+
import { consoleOrigin } from "./integrations-connect.js";
|
|
33
40
|
import { launchSessionManagerPlugin, SessionManagerPluginLaunchError, TerminalSessionTimeoutError, waitForTerminalSession, } from "@indigoai-us/hq-cloud/outposts/node";
|
|
34
41
|
import { peekIdToken } from "../utils/id-token.js";
|
|
35
|
-
import { isPlanGateError } from "../utils/plan-gate-error.js";
|
|
42
|
+
import { canOfferTeamUpgrade, formatUpgradeRefusal, isPlanGateError, offerUpgradeLink, } from "../utils/plan-gate-error.js";
|
|
43
|
+
import { AGENT_UID_PATTERN, isAgentUid } from "../lib/notify-recipient.js";
|
|
44
|
+
import { AGENT_MODEL_PROVIDERS, modelSelectionErrorMessage, readAgentModelCatalog, validateAgentModelSelection, } from "../lib/agents/model-catalog.js";
|
|
36
45
|
import { confirmChargeOrExit, formatUsd, parseBillingPayload, surfaceBillingBlocked, } from "../utils/billing-gate.js";
|
|
37
46
|
/** Reasoning-effort values hq-pro accepts on `runtime-config`. */
|
|
38
47
|
export const VALID_EFFORTS = new Set([
|
|
@@ -50,6 +59,107 @@ export const VALID_PROVIDERS = new Set(["codex", "grok", "claude", "agents-v2"])
|
|
|
50
59
|
export const VALID_AUTH_MODES = new Set(["subscription", "apiKey"]);
|
|
51
60
|
/** Customer-facing agent size keys served by hq-pro's authoritative catalog. */
|
|
52
61
|
export const VALID_AGENT_SIZE_KEYS = new Set(["basic", "power", "dev"]);
|
|
62
|
+
// Keep cloud agent create slugs aligned with hq-pro-agents POST /v1/agents.
|
|
63
|
+
const AGENT_SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,62}$/;
|
|
64
|
+
const CLAUDE_PROVISION_COMMAND = "hq agents provision <name> --provider agents-v2 --model <model-id>";
|
|
65
|
+
const CLAUDE_API_KEY_ARGS = "--auth-mode apiKey --api-key-env <VAR>";
|
|
66
|
+
function claudeProvisionGuidance() {
|
|
67
|
+
return [
|
|
68
|
+
"The account must be enabled for Claude. Subscription auth is the default.",
|
|
69
|
+
"Use `hq agents models` to see the current model ids.",
|
|
70
|
+
`Create an agent with: ${CLAUDE_PROVISION_COMMAND}`,
|
|
71
|
+
`For API-key auth, add: ${CLAUDE_API_KEY_ARGS}`,
|
|
72
|
+
"The CLI accepts --provider claude for script compatibility, but the server rejects new agents that use it.",
|
|
73
|
+
].join("\n");
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* `hq agents create` exits with this distinct status when payment is required.
|
|
77
|
+
* Scripts can distinguish the expected upgrade state from an ordinary command
|
|
78
|
+
* failure without parsing human output.
|
|
79
|
+
*/
|
|
80
|
+
export const AGENT_CREATE_PAYMENT_REQUIRED_EXIT_CODE = 3;
|
|
81
|
+
function isCheckoutUrl(value) {
|
|
82
|
+
if (typeof value !== "string" || !value.trim())
|
|
83
|
+
return false;
|
|
84
|
+
try {
|
|
85
|
+
const url = new URL(value);
|
|
86
|
+
return url.protocol === "https:" && !url.username && !url.password;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Decode only the priced response defined by the agent-create contract. A
|
|
94
|
+
* lookalike 403 must stay an ordinary API error rather than opening a browser
|
|
95
|
+
* or guessing at a price.
|
|
96
|
+
*/
|
|
97
|
+
export function agentCreatePlanLimitFromPayload(status, body) {
|
|
98
|
+
if (status !== 403 || !body || typeof body !== "object")
|
|
99
|
+
return null;
|
|
100
|
+
const payload = body;
|
|
101
|
+
if (payload.code !== "AGENT_PLAN_LIMIT" ||
|
|
102
|
+
payload.reasonCode !== "plan_limit" ||
|
|
103
|
+
payload.requiredPlan !== "agents-500" ||
|
|
104
|
+
typeof payload.amountMinor !== "number" ||
|
|
105
|
+
!Number.isSafeInteger(payload.amountMinor) ||
|
|
106
|
+
payload.amountMinor < 0 ||
|
|
107
|
+
typeof payload.currency !== "string" ||
|
|
108
|
+
!/^[A-Za-z]{3}$/.test(payload.currency)) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
if (payload.checkoutUrl !== undefined && !isCheckoutUrl(payload.checkoutUrl)) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
requiredPlan: "agents-500",
|
|
116
|
+
amountMinor: payload.amountMinor,
|
|
117
|
+
currency: payload.currency.toUpperCase(),
|
|
118
|
+
...(typeof payload.checkoutUrl === "string"
|
|
119
|
+
? { checkoutUrl: payload.checkoutUrl }
|
|
120
|
+
: {}),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function formatServerPrice(amountMinor, currency) {
|
|
124
|
+
return new Intl.NumberFormat("en-US", {
|
|
125
|
+
style: "currency",
|
|
126
|
+
currency,
|
|
127
|
+
}).format(amountMinor / 100);
|
|
128
|
+
}
|
|
129
|
+
async function offerAgentCheckout(url) {
|
|
130
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
|
|
131
|
+
try {
|
|
132
|
+
return await offerUpgradeLink(url, {
|
|
133
|
+
interactive: true,
|
|
134
|
+
ask: (question) => new Promise((resolve) => rl.question(question, resolve)),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
console.error("Could not open the upgrade page automatically. Use the URL above.");
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
rl.close();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Print a server-priced plan block without minting or rewriting its URL. */
|
|
146
|
+
export async function surfaceAgentCreatePlanLimit(planLimit, opts = {}) {
|
|
147
|
+
const price = `${formatServerPrice(planLimit.amountMinor, planLimit.currency)}/month`;
|
|
148
|
+
const reason = `HQ Workforce plan required to create an agent (${price}).`;
|
|
149
|
+
const argv = opts.json ? [...process.argv, "--json"] : process.argv;
|
|
150
|
+
const interactive = canOfferTeamUpgrade(argv);
|
|
151
|
+
if (!planLimit.checkoutUrl) {
|
|
152
|
+
console.error(reason);
|
|
153
|
+
console.error("Ask a company owner to upgrade before creating an agent.");
|
|
154
|
+
queueCliLimitNoticeExposure("agents", "refusal", opts.companyUid);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
console.error(formatUpgradeRefusal(reason, planLimit.checkoutUrl, { urlOnly: !interactive }));
|
|
158
|
+
const exposure = queueCliLimitNoticeExposure("agents", "refusal", opts.companyUid);
|
|
159
|
+
if (interactive && await offerAgentCheckout(planLimit.checkoutUrl)) {
|
|
160
|
+
queueCliLimitNoticeEngagement(exposure);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
53
163
|
/**
|
|
54
164
|
* Resolve a closed-set option value, or exit(1) with a message naming the
|
|
55
165
|
* offending input and the legal set.
|
|
@@ -112,14 +222,35 @@ export class AgentsHttpError extends Error {
|
|
|
112
222
|
code;
|
|
113
223
|
/** hq-pro's billing envelope on a `402 billing_required` provision block. */
|
|
114
224
|
billing;
|
|
115
|
-
|
|
225
|
+
/** Strictly decoded priced `403 AGENT_PLAN_LIMIT` create response. */
|
|
226
|
+
agentCreatePlanLimit;
|
|
227
|
+
constructor(status, message, code, billing, agentCreatePlanLimit) {
|
|
116
228
|
super(message);
|
|
117
229
|
this.name = "AgentsHttpError";
|
|
118
230
|
this.status = status;
|
|
119
231
|
this.code = code;
|
|
120
232
|
this.billing = billing;
|
|
233
|
+
this.agentCreatePlanLimit = agentCreatePlanLimit;
|
|
121
234
|
}
|
|
122
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* STATUS column for `hq agents list`.
|
|
238
|
+
*
|
|
239
|
+
* `agentStatus` is the agent's own stored runtime status and is NOT rewritten
|
|
240
|
+
* when a teardown starts — an agent that never finished provisioning and is
|
|
241
|
+
* now being removed keeps reading `provisioning` until the teardown completes
|
|
242
|
+
* and archives it. Observed live on liverecover/sean 2026-09-21: a removal that
|
|
243
|
+
* stalled on an object-locked vault bucket sat in the roster as `provisioning`,
|
|
244
|
+
* so the operator believed the removal had never been accepted. The roster
|
|
245
|
+
* already carries `setupPhase`, so prefer it whenever a teardown is in flight.
|
|
246
|
+
*/
|
|
247
|
+
export function rosterStatusLabel(agent) {
|
|
248
|
+
if (agent.setupPhase === "deprovisioning")
|
|
249
|
+
return "removing";
|
|
250
|
+
if (agent.setupPhase === "deprovisioned")
|
|
251
|
+
return "removed";
|
|
252
|
+
return agent.agentStatus ?? "";
|
|
253
|
+
}
|
|
123
254
|
/**
|
|
124
255
|
* Authenticated JSON round-trip against the agents control plane. Throws
|
|
125
256
|
* `AgentsHttpError` on any non-2xx (never swallows — hq-never-swallow-errors),
|
|
@@ -134,7 +265,7 @@ export async function agentsRequest(opts) {
|
|
|
134
265
|
// decline copy ("Your card was declined…") while `error` is the generic
|
|
135
266
|
// "payment required" — error-first would feed surfaceBillingBlocked the
|
|
136
267
|
// generic string and lose the decline reason (mirrors outpostRequest).
|
|
137
|
-
body.message ?? body.error ?? res.statusText, body.code, parseBillingPayload(body));
|
|
268
|
+
body.message ?? body.error ?? res.statusText, body.code, parseBillingPayload(body), agentCreatePlanLimitFromPayload(res.status, body) ?? undefined);
|
|
138
269
|
}
|
|
139
270
|
return (await res.json());
|
|
140
271
|
}
|
|
@@ -146,6 +277,51 @@ export function slugifyAgentName(name) {
|
|
|
146
277
|
.replace(/[^a-z0-9]+/g, "-")
|
|
147
278
|
.replace(/^-+|-+$/g, "");
|
|
148
279
|
}
|
|
280
|
+
async function readProvisionSlackTokensFromStdin() {
|
|
281
|
+
let value = "";
|
|
282
|
+
for await (const chunk of process.stdin)
|
|
283
|
+
value += String(chunk);
|
|
284
|
+
return value;
|
|
285
|
+
}
|
|
286
|
+
function parseProvisionSlackTokensFromStdin(value) {
|
|
287
|
+
const lines = value
|
|
288
|
+
.split(/\r?\n/)
|
|
289
|
+
.map((line) => line.trim())
|
|
290
|
+
.filter(Boolean);
|
|
291
|
+
if (lines.length < 1 || lines.length > 2) {
|
|
292
|
+
throw new Error("--slack-tokens-stdin expects one line with the bot token and an optional second line with the Socket Mode app token.");
|
|
293
|
+
}
|
|
294
|
+
return { botToken: lines[0], ...(lines[1] ? { appToken: lines[1] } : {}) };
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Resolve write-only Slack credentials without printing them. Flags are useful
|
|
298
|
+
* for automation; HQ_SLACK_BOT_TOKEN/HQ_SLACK_APP_TOKEN and stdin avoid shell
|
|
299
|
+
* history. Multiple sources are rejected so the selected credential is clear.
|
|
300
|
+
*/
|
|
301
|
+
export async function resolveProvisionSlackTokens(options, environment = process.env, readStdin = readProvisionSlackTokensFromStdin) {
|
|
302
|
+
const optionBotToken = options.slackBotToken?.trim();
|
|
303
|
+
const optionAppToken = options.slackAppToken?.trim();
|
|
304
|
+
const environmentBotToken = environment.HQ_SLACK_BOT_TOKEN?.trim();
|
|
305
|
+
const environmentAppToken = environment.HQ_SLACK_APP_TOKEN?.trim();
|
|
306
|
+
const hasFlagOrEnvironment = Boolean(optionBotToken || optionAppToken || environmentBotToken || environmentAppToken);
|
|
307
|
+
if (options.slackTokensStdin) {
|
|
308
|
+
if (hasFlagOrEnvironment) {
|
|
309
|
+
throw new Error("Use --slack-tokens-stdin or the Slack token flags/environment variables, not both.");
|
|
310
|
+
}
|
|
311
|
+
return parseProvisionSlackTokensFromStdin(await readStdin());
|
|
312
|
+
}
|
|
313
|
+
if ((optionBotToken || optionAppToken) && (environmentBotToken || environmentAppToken)) {
|
|
314
|
+
throw new Error("Use Slack token flags or HQ_SLACK_BOT_TOKEN/HQ_SLACK_APP_TOKEN, not both.");
|
|
315
|
+
}
|
|
316
|
+
const botToken = optionBotToken || environmentBotToken;
|
|
317
|
+
const appToken = optionAppToken || environmentAppToken;
|
|
318
|
+
if (!botToken && !appToken)
|
|
319
|
+
return undefined;
|
|
320
|
+
if (!botToken) {
|
|
321
|
+
throw new Error("A Slack app token requires a Slack bot token.");
|
|
322
|
+
}
|
|
323
|
+
return { botToken, ...(appToken ? { appToken } : {}) };
|
|
324
|
+
}
|
|
149
325
|
/** Closed set shared with hq-pro's agent_create_* funnel contract. */
|
|
150
326
|
export const CLI_AGENT_CREATE_SURFACE = "cli_agents_create";
|
|
151
327
|
/** Read hq-pro's company-specific creation prices and capacities. */
|
|
@@ -242,7 +418,7 @@ export async function promptForAgentCreateSize(view) {
|
|
|
242
418
|
}
|
|
243
419
|
}
|
|
244
420
|
/** Confirm creation using the server quote, preserving $0 as a real answer. */
|
|
245
|
-
export function confirmAgentCreateQuoteOrExit(option, yes) {
|
|
421
|
+
export function confirmAgentCreateQuoteOrExit(option, yes, quiet = false) {
|
|
246
422
|
if (option.notBilled || option.netMonthlyCents === 0) {
|
|
247
423
|
const message = `${option.productName} is ${formatUsd(0)}/month for this company — ` +
|
|
248
424
|
"there is no per-agent charge.";
|
|
@@ -250,14 +426,26 @@ export function confirmAgentCreateQuoteOrExit(option, yes) {
|
|
|
250
426
|
console.error(chalk.yellow(`${message}\nRe-run with --yes to confirm agent provisioning.`));
|
|
251
427
|
process.exit(1);
|
|
252
428
|
}
|
|
253
|
-
|
|
429
|
+
if (!quiet) {
|
|
430
|
+
console.log(chalk.dim(`${message} Provisioning…`));
|
|
431
|
+
}
|
|
254
432
|
return;
|
|
255
433
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
434
|
+
if (!quiet) {
|
|
435
|
+
confirmChargeOrExit({
|
|
436
|
+
resource: "agent",
|
|
437
|
+
unitCents: option.netMonthlyCents,
|
|
438
|
+
yes,
|
|
439
|
+
});
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
if (!yes) {
|
|
443
|
+
confirmChargeOrExit({
|
|
444
|
+
resource: "agent",
|
|
445
|
+
unitCents: option.netMonthlyCents,
|
|
446
|
+
yes,
|
|
447
|
+
});
|
|
448
|
+
}
|
|
261
449
|
}
|
|
262
450
|
export async function provisionAgent(token, input) {
|
|
263
451
|
return agentsRequest({
|
|
@@ -281,6 +469,277 @@ export async function getAgentStatus(token, agentUid) {
|
|
|
281
469
|
path: `/v1/agents/${encodeURIComponent(agentUid)}/status`,
|
|
282
470
|
});
|
|
283
471
|
}
|
|
472
|
+
function recordValue(value) {
|
|
473
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
474
|
+
? value
|
|
475
|
+
: null;
|
|
476
|
+
}
|
|
477
|
+
function nonEmptyString(value) {
|
|
478
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
479
|
+
}
|
|
480
|
+
function safeActionUrl(value) {
|
|
481
|
+
const raw = nonEmptyString(value);
|
|
482
|
+
if (!raw)
|
|
483
|
+
return null;
|
|
484
|
+
try {
|
|
485
|
+
const url = new URL(raw);
|
|
486
|
+
return url.protocol === "https:" && !url.username && !url.password ? raw : null;
|
|
487
|
+
}
|
|
488
|
+
catch {
|
|
489
|
+
return null;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
function signInProviderName(url) {
|
|
493
|
+
const parsed = new URL(url);
|
|
494
|
+
if (parsed.hostname === "auth.openai.com" &&
|
|
495
|
+
parsed.pathname.startsWith("/codex/")) {
|
|
496
|
+
return "Codex";
|
|
497
|
+
}
|
|
498
|
+
if (parsed.hostname === "accounts.x.ai")
|
|
499
|
+
return "Grok";
|
|
500
|
+
if (parsed.hostname.endsWith("anthropic.com"))
|
|
501
|
+
return "Claude";
|
|
502
|
+
return "your provider";
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Brain slot a device sign-in URL belongs to, or null when the provider has no
|
|
506
|
+
* per-brain slot (Claude) or the host is unknown.
|
|
507
|
+
*/
|
|
508
|
+
function signInBrainSlot(url) {
|
|
509
|
+
const provider = signInProviderName(url);
|
|
510
|
+
if (provider === "Grok")
|
|
511
|
+
return "grok";
|
|
512
|
+
if (provider === "Codex")
|
|
513
|
+
return "codex";
|
|
514
|
+
return null;
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* True when the box probe already reports that brain as signed in. A device
|
|
518
|
+
* pairing file can outlive the sign-in it started, so the probe — not the
|
|
519
|
+
* leftover code — decides whether a human still has work to do.
|
|
520
|
+
*/
|
|
521
|
+
function brainAlreadySignedIn(status, url) {
|
|
522
|
+
const slot = signInBrainSlot(url);
|
|
523
|
+
if (!slot)
|
|
524
|
+
return false;
|
|
525
|
+
const brains = recordValue(recordValue(status.agent)?.brains);
|
|
526
|
+
return brains?.[slot] === "signed-in";
|
|
527
|
+
}
|
|
528
|
+
function currentDeviceSignInAction(status) {
|
|
529
|
+
const pairing = recordValue(status.pairing);
|
|
530
|
+
const url = safeActionUrl(pairing?.url);
|
|
531
|
+
if (!url)
|
|
532
|
+
return null;
|
|
533
|
+
if (brainAlreadySignedIn(status, url))
|
|
534
|
+
return null;
|
|
535
|
+
const rawCode = nonEmptyString(pairing?.code);
|
|
536
|
+
const code = rawCode && /^[A-Z0-9]{4,8}-[A-Z0-9]{4,8}$/i.test(rawCode)
|
|
537
|
+
? rawCode
|
|
538
|
+
: undefined;
|
|
539
|
+
const provider = signInProviderName(url);
|
|
540
|
+
return {
|
|
541
|
+
type: provider === "Codex" ? "codex-device-sign-in" : "provider-sign-in",
|
|
542
|
+
title: `Sign in to ${provider}`,
|
|
543
|
+
summary: `sign in to ${provider}`,
|
|
544
|
+
instruction: code
|
|
545
|
+
? "Open this page and enter the code."
|
|
546
|
+
: "Open this page and follow the sign-in instructions.",
|
|
547
|
+
url,
|
|
548
|
+
urlLabel: "Open",
|
|
549
|
+
code,
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
const SLACK_APP_TOKEN_INSTRUCTION = "Create an app-level token with the connections:write scope, then paste it into HQ. HQ verifies the token and resumes setup; if Slack asks you to install the app, follow the install link shown there.";
|
|
553
|
+
function consolePasteUrl(companyKey, agentUid) {
|
|
554
|
+
const base = process.env.HQ_CONSOLE_URL?.trim().replace(/\/+$/, "") || "https://hq.computer";
|
|
555
|
+
return `${base}/companies/${encodeURIComponent(companyKey)}/agents?setup=${encodeURIComponent(agentUid)}`;
|
|
556
|
+
}
|
|
557
|
+
function slackAppIdFromSetupState(status) {
|
|
558
|
+
const steps = recordValue(status.setupState)?.steps;
|
|
559
|
+
if (!Array.isArray(steps))
|
|
560
|
+
return null;
|
|
561
|
+
for (const step of steps) {
|
|
562
|
+
const item = recordValue(step);
|
|
563
|
+
if (item?.name !== "channels" || item.status === "done")
|
|
564
|
+
continue;
|
|
565
|
+
const match = /https:\/\/api\.slack\.com\/apps\/(A[A-Z0-9]+)/.exec(JSON.stringify(item));
|
|
566
|
+
if (match)
|
|
567
|
+
return match[1];
|
|
568
|
+
}
|
|
569
|
+
return null;
|
|
570
|
+
}
|
|
571
|
+
function serverPendingActions(status) {
|
|
572
|
+
if (!Array.isArray(status.pendingActions))
|
|
573
|
+
return [];
|
|
574
|
+
const actions = [];
|
|
575
|
+
for (const raw of status.pendingActions) {
|
|
576
|
+
const item = recordValue(raw);
|
|
577
|
+
const type = nonEmptyString(item?.type);
|
|
578
|
+
const title = nonEmptyString(item?.title);
|
|
579
|
+
if (!item || !type || !title)
|
|
580
|
+
continue;
|
|
581
|
+
const url = safeActionUrl(item.url) ?? undefined;
|
|
582
|
+
const pasteUrl = safeActionUrl(item.pasteUrl) ?? undefined;
|
|
583
|
+
const rawCode = nonEmptyString(item.code);
|
|
584
|
+
actions.push({
|
|
585
|
+
type,
|
|
586
|
+
title,
|
|
587
|
+
summary: title.charAt(0).toLowerCase() + title.slice(1),
|
|
588
|
+
instruction: nonEmptyString(item.instruction) ?? "Open this page and follow the instructions.",
|
|
589
|
+
...(url ? { url, urlLabel: type === "slack-app-token" ? "Get token" : "Open" } : {}),
|
|
590
|
+
...(pasteUrl ? { pasteUrl } : {}),
|
|
591
|
+
...(rawCode && /^[A-Z0-9]{4,8}-[A-Z0-9]{4,8}$/i.test(rawCode) ? { code: rawCode } : {}),
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
return actions;
|
|
595
|
+
}
|
|
596
|
+
function pendingSlackAction(status, companySlug) {
|
|
597
|
+
const agent = recordValue(status.agent);
|
|
598
|
+
const configuredSlack = recordValue(recordValue(agent?.channels)?.slack);
|
|
599
|
+
const stepAppId = slackAppIdFromSetupState(status);
|
|
600
|
+
const appId = nonEmptyString(configuredSlack?.appId) ?? stepAppId;
|
|
601
|
+
const agentUid = nonEmptyString(agent?.uid);
|
|
602
|
+
const companyUid = nonEmptyString(agent?.companyUid);
|
|
603
|
+
const tokenPage = safeActionUrl(configuredSlack?.appTokenPendingUrl) ??
|
|
604
|
+
(stepAppId ? `https://api.slack.com/apps/${stepAppId}/general` : null);
|
|
605
|
+
if (tokenPage &&
|
|
606
|
+
appId && /^A[A-Z0-9]+$/.test(appId) &&
|
|
607
|
+
new URL(tokenPage).hostname === "api.slack.com" &&
|
|
608
|
+
agentUid && AGENT_UID_PATTERN.test(agentUid) &&
|
|
609
|
+
companyUid && /^cmp_[A-Za-z0-9_-]+$/.test(companyUid)) {
|
|
610
|
+
const companyUrlKey = companySlug && /^[a-z0-9][a-z0-9-]*$/.test(companySlug)
|
|
611
|
+
? companySlug
|
|
612
|
+
: companyUid;
|
|
613
|
+
return {
|
|
614
|
+
type: "slack-app-token",
|
|
615
|
+
title: `Finish ${nonEmptyString(agent?.name) ?? "the agent"}'s Slack connection`,
|
|
616
|
+
summary: "connect it to Slack",
|
|
617
|
+
instruction: SLACK_APP_TOKEN_INSTRUCTION,
|
|
618
|
+
url: `https://api.slack.com/apps/${appId}/general`,
|
|
619
|
+
urlLabel: "Get token",
|
|
620
|
+
pasteUrl: consolePasteUrl(companyUrlKey, agentUid),
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
const diagnostics = recordValue(agent?.channelDiagnostics);
|
|
624
|
+
const slack = recordValue(diagnostics?.slack);
|
|
625
|
+
const url = safeActionUrl(slack?.pendingInstallUrl);
|
|
626
|
+
if (!url)
|
|
627
|
+
return null;
|
|
628
|
+
if (slack?.inboundCapability === "socket-mode-degraded") {
|
|
629
|
+
return {
|
|
630
|
+
type: "slack-app-token",
|
|
631
|
+
title: "Finish setting up the Slack app",
|
|
632
|
+
summary: "finish setting up the Slack app",
|
|
633
|
+
instruction: "Open this page, create the app-level token, then provide it in the agent's Slack setup.",
|
|
634
|
+
url,
|
|
635
|
+
urlLabel: "Open",
|
|
636
|
+
...(agentUid && AGENT_UID_PATTERN.test(agentUid) && companyUid && /^cmp_[A-Za-z0-9_-]+$/.test(companyUid)
|
|
637
|
+
? {
|
|
638
|
+
pasteUrl: consolePasteUrl(companySlug && /^[a-z0-9][a-z0-9-]*$/.test(companySlug) ? companySlug : companyUid, agentUid),
|
|
639
|
+
}
|
|
640
|
+
: {}),
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
if (slack?.inboundCapability !== "pending-install")
|
|
644
|
+
return null;
|
|
645
|
+
return {
|
|
646
|
+
type: "slack-install",
|
|
647
|
+
title: "Install the Slack app",
|
|
648
|
+
summary: "install the Slack app so it can talk to your workspace",
|
|
649
|
+
instruction: "Open this link and install the app in your workspace.",
|
|
650
|
+
url,
|
|
651
|
+
urlLabel: "Install",
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* The server owns action detection. This client converts its safe, current
|
|
656
|
+
* status fields into a list so another operator action can be added without
|
|
657
|
+
* changing the renderers or command control flow.
|
|
658
|
+
*/
|
|
659
|
+
function pendingOperatorActions(status, companySlug) {
|
|
660
|
+
const fromServer = serverPendingActions(status);
|
|
661
|
+
if (fromServer.length > 0)
|
|
662
|
+
return fromServer;
|
|
663
|
+
return [
|
|
664
|
+
currentDeviceSignInAction(status),
|
|
665
|
+
pendingSlackAction(status, companySlug),
|
|
666
|
+
].filter((action) => action !== null);
|
|
667
|
+
}
|
|
668
|
+
async function consoleCompanySlug(token, status, companyRef) {
|
|
669
|
+
if (companyRef && /^[a-z0-9][a-z0-9-]*$/.test(companyRef))
|
|
670
|
+
return companyRef;
|
|
671
|
+
const agent = recordValue(status.agent);
|
|
672
|
+
const slack = recordValue(recordValue(agent?.channels)?.slack);
|
|
673
|
+
if (!slack?.appTokenPendingUrl && !slackAppIdFromSetupState(status))
|
|
674
|
+
return undefined;
|
|
675
|
+
const companyUid = nonEmptyString(agent?.companyUid);
|
|
676
|
+
if (!companyUid)
|
|
677
|
+
return undefined;
|
|
678
|
+
try {
|
|
679
|
+
const response = await vaultApiFetch({
|
|
680
|
+
token,
|
|
681
|
+
path: "/membership/me",
|
|
682
|
+
signal: AbortSignal.timeout(10_000),
|
|
683
|
+
});
|
|
684
|
+
if (!response.ok)
|
|
685
|
+
return undefined;
|
|
686
|
+
const body = recordValue(await response.json());
|
|
687
|
+
const memberships = Array.isArray(body?.memberships) ? body.memberships : [];
|
|
688
|
+
const membership = memberships.map(recordValue).find((item) => item?.companyUid === companyUid && item?.status === "active");
|
|
689
|
+
const slug = nonEmptyString(membership?.companySlug);
|
|
690
|
+
return slug && /^[a-z0-9][a-z0-9-]*$/.test(slug) ? slug : undefined;
|
|
691
|
+
}
|
|
692
|
+
catch {
|
|
693
|
+
return undefined;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
function pendingActionsJson(actions) {
|
|
697
|
+
return actions.map(({ type, title, instruction, url, pasteUrl, code }) => ({
|
|
698
|
+
type,
|
|
699
|
+
title,
|
|
700
|
+
instruction,
|
|
701
|
+
...(url ? { url } : {}),
|
|
702
|
+
...(pasteUrl ? { pasteUrl } : {}),
|
|
703
|
+
...(code ? { code } : {}),
|
|
704
|
+
}));
|
|
705
|
+
}
|
|
706
|
+
function statusAgentSlug(status) {
|
|
707
|
+
return nonEmptyString(recordValue(status.agent)?.slug);
|
|
708
|
+
}
|
|
709
|
+
/** The provision endpoint returns this nested identity; old response shapes omit it. */
|
|
710
|
+
function provisionedAgentIdentity(result) {
|
|
711
|
+
const agent = recordValue(result.agent);
|
|
712
|
+
const uid = nonEmptyString(agent?.uid) ?? nonEmptyString(agent?.agentUid);
|
|
713
|
+
const slug = nonEmptyString(agent?.slug);
|
|
714
|
+
return uid && slug ? { uid, slug } : null;
|
|
715
|
+
}
|
|
716
|
+
function printPendingOperatorActions(slug, actions) {
|
|
717
|
+
if (actions.length === 0)
|
|
718
|
+
return;
|
|
719
|
+
const first = actions[0];
|
|
720
|
+
console.log(chalk.yellow(actions.length === 1
|
|
721
|
+
? `Your agent's box is up. One step left: ${first.summary}.`
|
|
722
|
+
: "Your agent's box is up. A few steps remain before it can talk to your workspace."));
|
|
723
|
+
for (const action of actions) {
|
|
724
|
+
console.log("");
|
|
725
|
+
console.log(chalk.bold(`${action.title}:`));
|
|
726
|
+
console.log(action.instruction);
|
|
727
|
+
if (action.url)
|
|
728
|
+
console.log(chalk.cyan(`${action.urlLabel ?? "Open"}: ${action.url}`));
|
|
729
|
+
if (action.pasteUrl)
|
|
730
|
+
console.log(chalk.cyan(`Paste token: ${action.pasteUrl}`));
|
|
731
|
+
if (action.code)
|
|
732
|
+
console.log(chalk.bold(`Code: ${action.code}`));
|
|
733
|
+
}
|
|
734
|
+
const currentCodeHint = actions.some((action) => action.code)
|
|
735
|
+
? "current sign-in code and instructions"
|
|
736
|
+
: "these instructions";
|
|
737
|
+
const statusCommand = slug
|
|
738
|
+
? `Run \`hq agents status ${slug}\` any time to get ${currentCodeHint} again.`
|
|
739
|
+
: `Run \`hq agents status\` again any time to get ${currentCodeHint}.`;
|
|
740
|
+
console.log("");
|
|
741
|
+
console.log(chalk.dim(`Until that's done, the agent will show as still setting up. ${statusCommand}`));
|
|
742
|
+
}
|
|
284
743
|
export async function patchAgentProfile(token, agentUid, patch) {
|
|
285
744
|
return agentsRequest({
|
|
286
745
|
token,
|
|
@@ -304,6 +763,54 @@ export async function startStopAgent(token, agentUid, action) {
|
|
|
304
763
|
method: "POST",
|
|
305
764
|
});
|
|
306
765
|
}
|
|
766
|
+
/** Submit a human-provided Claude subscription code through hq-pro's route. */
|
|
767
|
+
export async function submitAgentLoginCode(token, agentUid, code) {
|
|
768
|
+
return agentsRequest({
|
|
769
|
+
token,
|
|
770
|
+
path: `/v1/agents/${encodeURIComponent(agentUid)}/login-code`,
|
|
771
|
+
method: "POST",
|
|
772
|
+
body: { code },
|
|
773
|
+
});
|
|
774
|
+
}
|
|
775
|
+
async function readLoginCode(code) {
|
|
776
|
+
let value = code;
|
|
777
|
+
if (value === undefined) {
|
|
778
|
+
if (process.stdin.isTTY) {
|
|
779
|
+
console.error("Enter the Claude sign-in code, then press Enter:");
|
|
780
|
+
}
|
|
781
|
+
const rl = readline.createInterface({ input: process.stdin });
|
|
782
|
+
try {
|
|
783
|
+
value = await new Promise((resolve, reject) => {
|
|
784
|
+
rl.once("error", reject);
|
|
785
|
+
rl.once("close", () => resolve(""));
|
|
786
|
+
rl.question("", resolve);
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
finally {
|
|
790
|
+
rl.close();
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
const trimmed = value.trim();
|
|
794
|
+
if (!trimmed) {
|
|
795
|
+
throw new Error("Claude sign-in code required. Pass it as an argument or provide it on stdin.");
|
|
796
|
+
}
|
|
797
|
+
return trimmed;
|
|
798
|
+
}
|
|
799
|
+
function redactLoginCode(message, code) {
|
|
800
|
+
return code ? message.split(code).join("[redacted]") : message;
|
|
801
|
+
}
|
|
802
|
+
function agentConsoleResolveUrl(agentUid) {
|
|
803
|
+
const apiUrl = process.env.HQ_VAULT_API_URL?.trim() || DEFAULT_VAULT_API_URL;
|
|
804
|
+
const origin = consoleOrigin(apiUrl);
|
|
805
|
+
if (!origin)
|
|
806
|
+
return undefined;
|
|
807
|
+
// Keep the owner's canonical production sign-in URL while honoring an
|
|
808
|
+
// explicit console override or deriving the console for another API host.
|
|
809
|
+
const consoleBase = !process.env.HQ_CONSOLE_URL?.trim() && origin === "https://hq.computer"
|
|
810
|
+
? "https://hq.getindigo.ai"
|
|
811
|
+
: origin;
|
|
812
|
+
return `${consoleBase}/resolve/agents/${encodeURIComponent(agentUid)}`;
|
|
813
|
+
}
|
|
307
814
|
export async function openAgentTerminal(token, agentUid, body) {
|
|
308
815
|
return agentsRequest({
|
|
309
816
|
token,
|
|
@@ -319,11 +826,14 @@ export async function retryAgent(token, agentUid) {
|
|
|
319
826
|
method: "POST",
|
|
320
827
|
});
|
|
321
828
|
}
|
|
322
|
-
export async function deprovisionAgent(token, agentUid) {
|
|
829
|
+
export async function deprovisionAgent(token, agentUid, confirmDestroyAgentsV2) {
|
|
323
830
|
return agentsRequest({
|
|
324
831
|
token,
|
|
325
832
|
path: `/v1/agents/${encodeURIComponent(agentUid)}`,
|
|
326
833
|
method: "DELETE",
|
|
834
|
+
body: confirmDestroyAgentsV2 === undefined
|
|
835
|
+
? undefined
|
|
836
|
+
: { confirmDestroyAgentsV2 },
|
|
327
837
|
});
|
|
328
838
|
}
|
|
329
839
|
export async function listAgentJobs(token, agentUid) {
|
|
@@ -340,6 +850,13 @@ export async function pauseAgentJob(token, agentUid, jobId) {
|
|
|
340
850
|
method: "POST",
|
|
341
851
|
});
|
|
342
852
|
}
|
|
853
|
+
export async function resumeAgentJob(token, agentUid, jobId) {
|
|
854
|
+
return agentsRequest({
|
|
855
|
+
token,
|
|
856
|
+
path: `/v1/agents/${encodeURIComponent(agentUid)}/jobs/${encodeURIComponent(jobId)}/resume`,
|
|
857
|
+
method: "POST",
|
|
858
|
+
});
|
|
859
|
+
}
|
|
343
860
|
export async function cancelAgentJob(token, agentUid, jobId) {
|
|
344
861
|
return agentsRequest({
|
|
345
862
|
token,
|
|
@@ -356,7 +873,7 @@ export async function cancelAgentJob(token, agentUid, jobId) {
|
|
|
356
873
|
* the agent is cross-company) must print a clear message and exit non-zero,
|
|
357
874
|
* never throw a stack trace.
|
|
358
875
|
*/
|
|
359
|
-
export function formatJobsHttpError(err, jobId) {
|
|
876
|
+
export function formatJobsHttpError(err, jobId, action) {
|
|
360
877
|
if (err.status === 401)
|
|
361
878
|
return "Not authenticated — run `hq login`.";
|
|
362
879
|
// A 403 CROSS_AGENT_JOB is hq-pro's self-only jobs guard, not a role problem:
|
|
@@ -366,12 +883,17 @@ export function formatJobsHttpError(err, jobId) {
|
|
|
366
883
|
// closed locally before the request, see crossAgentJobsRefusal).
|
|
367
884
|
if (err.status === 403 && err.code === "CROSS_AGENT_JOB") {
|
|
368
885
|
return ("Jobs are scoped to the calling agent's own identity — an agent may only " +
|
|
369
|
-
"list, pause, or cancel its OWN jobs (use the on-box `hq-agent-jobs` tool). " +
|
|
886
|
+
"list, pause, resume, or cancel its OWN jobs (use the on-box `hq-agent-jobs` tool). " +
|
|
370
887
|
"Managing another agent's jobs needs a person session with owner/admin on " +
|
|
371
888
|
"the company.");
|
|
372
889
|
}
|
|
373
890
|
if (err.status === 403)
|
|
374
891
|
return "You need owner/admin on this company.";
|
|
892
|
+
if (action === "resume" &&
|
|
893
|
+
err.status === 404 &&
|
|
894
|
+
(err.code === "JOB_NOT_FOUND" || err.code === "SCHEDULE_NOT_FOUND")) {
|
|
895
|
+
return "job not found or its schedule was deleted; it cannot be resumed";
|
|
896
|
+
}
|
|
375
897
|
if (err.status === 404 && err.code === "JOB_NOT_FOUND") {
|
|
376
898
|
const id = jobId ?? extractQuotedJobId(err.message) ?? "unknown";
|
|
377
899
|
return `Job '${id}' not found.`;
|
|
@@ -400,7 +922,7 @@ export function formatJobsTable(jobs) {
|
|
|
400
922
|
j.lastRunOutcome ?? "-",
|
|
401
923
|
j.status ?? "",
|
|
402
924
|
]);
|
|
403
|
-
const widths = cols.map((c, i) =>
|
|
925
|
+
const widths = cols.map((c, i) => maxLength(rows, (row) => row[i].length, c.length));
|
|
404
926
|
const render = (cells) => cells.map((cell, i) => cell.padEnd(widths[i])).join(" ");
|
|
405
927
|
return [chalk.bold(render(cols)), ...rows.map(render)].join("\n");
|
|
406
928
|
}
|
|
@@ -410,20 +932,62 @@ export function formatPauseResult(result) {
|
|
|
410
932
|
const from = result.previousState ?? "ENABLED";
|
|
411
933
|
return `Paused ${result.jobId} (${from} → ${result.scheduleState})`;
|
|
412
934
|
}
|
|
935
|
+
export function formatResumeResult(result) {
|
|
936
|
+
if (!result.changed)
|
|
937
|
+
return "Already active";
|
|
938
|
+
const from = result.previousState ?? "DISABLED";
|
|
939
|
+
return `Resumed ${result.jobId} (${from} → ${result.scheduleState})`;
|
|
940
|
+
}
|
|
413
941
|
/** Human-readable "hot-applied to the running box" vs "saved for next launch". */
|
|
414
942
|
export function appliedHint(applied) {
|
|
415
943
|
return applied
|
|
416
944
|
? "applied to the running box now"
|
|
417
945
|
: "saved — takes effect on the agent's next launch";
|
|
418
946
|
}
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
947
|
+
async function validateAgentModelOption(token, chosenProvider, modelId) {
|
|
948
|
+
const result = await readAgentModelCatalog(token);
|
|
949
|
+
if (!result.ok) {
|
|
950
|
+
if (result.reason === "unavailable") {
|
|
951
|
+
console.error(chalk.yellow("model validation skipped: catalog unavailable (the server still validates)."));
|
|
952
|
+
return;
|
|
953
|
+
}
|
|
954
|
+
throw new Error(`Could not read the model catalog (HTTP ${result.status}). Check your hq login and try again.`);
|
|
955
|
+
}
|
|
956
|
+
if (result.source === "cache") {
|
|
957
|
+
console.error(chalk.yellow(`Model catalog unavailable; validating against the cached catalog from ${new Date(result.fetchedAt).toISOString()}.`));
|
|
958
|
+
}
|
|
959
|
+
const selection = validateAgentModelSelection(result.catalog, modelId, chosenProvider);
|
|
960
|
+
if (!selection.ok) {
|
|
961
|
+
throw new Error(modelSelectionErrorMessage(modelId, selection));
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
/** Stable human table shared by the all-provider and provider-filtered forms. */
|
|
965
|
+
export function formatAgentModelsTable(catalog, selectedProvider) {
|
|
966
|
+
const providers = selectedProvider ? [selectedProvider] : AGENT_MODEL_PROVIDERS;
|
|
967
|
+
const sections = providers.map((provider) => {
|
|
968
|
+
const view = catalog.providers[provider];
|
|
969
|
+
const columns = ["ID", "LABEL", "DEFAULT", "NEW", "AVAILABILITY"];
|
|
970
|
+
const rows = view.models.map((model) => [
|
|
971
|
+
model.id,
|
|
972
|
+
model.label,
|
|
973
|
+
model.id === view.defaultModel ? "yes" : "",
|
|
974
|
+
model.isNew ? "yes" : "",
|
|
975
|
+
model.selectable ? "available" : "not yet on agents",
|
|
976
|
+
]);
|
|
977
|
+
const widths = columns.map((column, index) => Math.max(column.length, ...rows.map((row) => row[index].length)));
|
|
978
|
+
const render = (cells) => cells.map((cell, index) => cell.padEnd(widths[index])).join(" ").trimEnd();
|
|
979
|
+
return [
|
|
980
|
+
chalk.bold(provider.toUpperCase()),
|
|
981
|
+
render(columns),
|
|
982
|
+
...rows.map(render),
|
|
983
|
+
].join("\n");
|
|
984
|
+
});
|
|
985
|
+
return sections.join("\n\n");
|
|
986
|
+
}
|
|
987
|
+
function catalogUnavailableMessage() {
|
|
988
|
+
return ("Model catalog is unavailable and no cached copy exists. " +
|
|
989
|
+
"Check your connection and try again after model-catalog.serve is enabled.");
|
|
990
|
+
}
|
|
427
991
|
/**
|
|
428
992
|
* Resolve an agent reference to its `agt_` uid. An `agt_…` value is used
|
|
429
993
|
* directly; anything else is treated as a slug or display name and resolved
|
|
@@ -518,6 +1082,9 @@ async function resolveJobsTargetOrExit(ref, company) {
|
|
|
518
1082
|
}
|
|
519
1083
|
/** Send a DM to an agent. Returns nothing meaningful beyond success. */
|
|
520
1084
|
export async function sendAgentDm(token, agentUid, message) {
|
|
1085
|
+
if (!isAgentUid(agentUid)) {
|
|
1086
|
+
throw new Error(`Invalid agent recipient '${agentUid}': expected an agt_ uid.`);
|
|
1087
|
+
}
|
|
521
1088
|
await agentsRequest({
|
|
522
1089
|
token,
|
|
523
1090
|
path: "/v1/notify/dm",
|
|
@@ -550,6 +1117,59 @@ function shortTime(iso) {
|
|
|
550
1117
|
function sleep(ms) {
|
|
551
1118
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
552
1119
|
}
|
|
1120
|
+
/**
|
|
1121
|
+
* POST /v1/agents/{uid}/rotate — invalidate the current secret and host key
|
|
1122
|
+
* and issue a fresh one-time enrollment code (returned exactly once).
|
|
1123
|
+
*/
|
|
1124
|
+
export async function rotateAgent(token, agentUid) {
|
|
1125
|
+
const data = await agentsRequest({
|
|
1126
|
+
token,
|
|
1127
|
+
path: `/v1/agents/${encodeURIComponent(agentUid)}/rotate`,
|
|
1128
|
+
method: "POST",
|
|
1129
|
+
});
|
|
1130
|
+
const e = data.enrollment ?? {};
|
|
1131
|
+
if (typeof e.code !== "string" || !e.code) {
|
|
1132
|
+
throw new AgentsHttpError(502, "rotate succeeded but the response carried no enrollment code");
|
|
1133
|
+
}
|
|
1134
|
+
return {
|
|
1135
|
+
agentUid: data.agentUid ?? agentUid,
|
|
1136
|
+
enrollment: {
|
|
1137
|
+
code: e.code,
|
|
1138
|
+
expiresAt: typeof e.expiresAt === "string" ? e.expiresAt : "",
|
|
1139
|
+
enrollmentId: typeof e.enrollmentId === "string" ? e.enrollmentId : "",
|
|
1140
|
+
},
|
|
1141
|
+
};
|
|
1142
|
+
}
|
|
1143
|
+
/** Display form of a 24-char code: six groups of four. */
|
|
1144
|
+
export function groupEnrollmentCode(code) {
|
|
1145
|
+
const flat = code.replace(/[\s-]+/g, "").toUpperCase();
|
|
1146
|
+
return flat.match(/.{1,4}/g)?.join("-") ?? flat;
|
|
1147
|
+
}
|
|
1148
|
+
/**
|
|
1149
|
+
* POST /v1/agents/{uid}/revoke — disable the Cognito user, drop membership,
|
|
1150
|
+
* mark the enrollment revoked; `remove` also deletes the entity.
|
|
1151
|
+
*/
|
|
1152
|
+
export async function revokeAgent(token, agentUid, remove) {
|
|
1153
|
+
const data = await agentsRequest({
|
|
1154
|
+
token,
|
|
1155
|
+
path: `/v1/agents/${encodeURIComponent(agentUid)}/revoke`,
|
|
1156
|
+
method: "POST",
|
|
1157
|
+
body: { remove },
|
|
1158
|
+
});
|
|
1159
|
+
return { removed: data.removed === true || remove };
|
|
1160
|
+
}
|
|
1161
|
+
/** Lines printed after a rotate: the code is shown once and never stored. */
|
|
1162
|
+
export function formatRotateOutput(result) {
|
|
1163
|
+
const lines = [
|
|
1164
|
+
`Rotated ${result.agentUid}. The old secret and host key no longer mint.`,
|
|
1165
|
+
"",
|
|
1166
|
+
` enrollment code: ${groupEnrollmentCode(result.enrollment.code)}`,
|
|
1167
|
+
];
|
|
1168
|
+
if (result.enrollment.expiresAt)
|
|
1169
|
+
lines.push(` expires: ${result.enrollment.expiresAt} (15 minutes)`);
|
|
1170
|
+
lines.push("", "Shown once. On the agent's host run:", ` hq agent enroll ${groupEnrollmentCode(result.enrollment.code)} --replace`, " hq agent probe");
|
|
1171
|
+
return lines;
|
|
1172
|
+
}
|
|
553
1173
|
// ---------------------------------------------------------------------------
|
|
554
1174
|
// Command registration
|
|
555
1175
|
// ---------------------------------------------------------------------------
|
|
@@ -577,9 +1197,9 @@ function fail(err) {
|
|
|
577
1197
|
}
|
|
578
1198
|
process.exit(1);
|
|
579
1199
|
}
|
|
580
|
-
function failJobs(err, jobId) {
|
|
1200
|
+
function failJobs(err, jobId, action) {
|
|
581
1201
|
if (err instanceof AgentsHttpError) {
|
|
582
|
-
console.error(chalk.red(formatJobsHttpError(err, jobId)));
|
|
1202
|
+
console.error(chalk.red(formatJobsHttpError(err, jobId, action)));
|
|
583
1203
|
process.exit(1);
|
|
584
1204
|
}
|
|
585
1205
|
fail(err);
|
|
@@ -602,9 +1222,16 @@ export function registerAgentsCommand(program) {
|
|
|
602
1222
|
bySubcommand: {
|
|
603
1223
|
message: { capability: "agents:use", routeAvailable: false },
|
|
604
1224
|
thread: { capability: "agents:use", routeAvailable: false },
|
|
1225
|
+
// The catalog read endpoint is JWT-only; hq-pro has no keyed parallel.
|
|
1226
|
+
models: { capability: "agents:use", routeAvailable: false },
|
|
605
1227
|
// Interactive terminals are for humans: hq-pro serves no keyed
|
|
606
1228
|
// `/v1/keys/agents/{uid}/terminal` route, so machine keys fail closed.
|
|
607
1229
|
terminal: { capability: "agents:use", routeAvailable: false },
|
|
1230
|
+
// External-agent lifecycle is an admin action on the JWT-only
|
|
1231
|
+
// /v1/agents/{uid}/rotate|revoke routes (api-contract v1); no keyed
|
|
1232
|
+
// parallel exists, so machine keys fail closed here too.
|
|
1233
|
+
rotate: { capability: "agents:use", routeAvailable: false },
|
|
1234
|
+
revoke: { capability: "agents:use", routeAvailable: false },
|
|
608
1235
|
},
|
|
609
1236
|
});
|
|
610
1237
|
// `--company` may live on the group or the subcommand; the subcommand value
|
|
@@ -612,6 +1239,43 @@ export function registerAgentsCommand(program) {
|
|
|
612
1239
|
// `hq agents --company acme list`.
|
|
613
1240
|
const companyOf = (sub) => sub.opts().company ??
|
|
614
1241
|
agents.opts().company;
|
|
1242
|
+
agents
|
|
1243
|
+
.command("models")
|
|
1244
|
+
.description("List the model catalog available to cloud agents")
|
|
1245
|
+
.option("--provider <provider>", "Filter to one provider: codex, grok, or claude")
|
|
1246
|
+
.option("--json", "Print the stable catalog JSON shape")
|
|
1247
|
+
.action(async (opts) => {
|
|
1248
|
+
try {
|
|
1249
|
+
const token = (await resolveVaultCredential()).token;
|
|
1250
|
+
const result = await readAgentModelCatalog(token);
|
|
1251
|
+
if (!result.ok) {
|
|
1252
|
+
if (result.reason === "request_failed") {
|
|
1253
|
+
throw new Error(`Could not read the model catalog (HTTP ${result.status}). Check your hq login and try again.`);
|
|
1254
|
+
}
|
|
1255
|
+
console.error(chalk.red(catalogUnavailableMessage()));
|
|
1256
|
+
process.exit(1);
|
|
1257
|
+
}
|
|
1258
|
+
if (result.source === "cache") {
|
|
1259
|
+
console.error(chalk.yellow(`Model catalog unavailable; showing cached catalog from ${new Date(result.fetchedAt).toISOString()}.`));
|
|
1260
|
+
}
|
|
1261
|
+
const providers = opts.provider
|
|
1262
|
+
? { [opts.provider]: result.catalog.providers[opts.provider] }
|
|
1263
|
+
: result.catalog.providers;
|
|
1264
|
+
if (opts.json) {
|
|
1265
|
+
// Stable shape: { generatedAt, providers }. A provider filter selects
|
|
1266
|
+
// one key but never changes or flattens the response envelope.
|
|
1267
|
+
process.stdout.write(JSON.stringify({ generatedAt: result.catalog.generatedAt, providers }, null, 2) + "\n");
|
|
1268
|
+
return;
|
|
1269
|
+
}
|
|
1270
|
+
console.log(formatAgentModelsTable(result.catalog, opts.provider));
|
|
1271
|
+
}
|
|
1272
|
+
catch (err) {
|
|
1273
|
+
fail(err);
|
|
1274
|
+
}
|
|
1275
|
+
});
|
|
1276
|
+
agents.commands.find((command) => command.name() === "models")
|
|
1277
|
+
?.options.find((option) => option.long === "--provider")
|
|
1278
|
+
?.choices(AGENT_MODEL_PROVIDERS);
|
|
615
1279
|
agents
|
|
616
1280
|
.command("message <agent> <message...>")
|
|
617
1281
|
.alias("msg")
|
|
@@ -764,31 +1428,56 @@ export function registerAgentsCommand(program) {
|
|
|
764
1428
|
});
|
|
765
1429
|
agents
|
|
766
1430
|
.command("provision <name>")
|
|
767
|
-
.
|
|
1431
|
+
.aliases(["new", "create"])
|
|
768
1432
|
.description("Provision a new cloud agent (company-specific monthly price shown before creation)")
|
|
769
1433
|
.option("--company <slug>", "Company slug (resolves to companyUid)")
|
|
770
1434
|
.option("--slug <slug>", "Agent slug (defaults to a slug of <name>)")
|
|
771
|
-
.option("--provider <provider>", "Runtime: codex | grok | claude
|
|
1435
|
+
.option("--provider <provider>", "Runtime: agents-v2 (recommended) | codex | grok | claude (accepted for script compatibility; use agents-v2 for new Claude agents)")
|
|
1436
|
+
.option("--model <model>", "Brain model from `hq agents models`")
|
|
772
1437
|
.option("--auth-mode <mode>", "Auth: subscription | apiKey (default subscription)", "subscription")
|
|
773
1438
|
.option("--api-key-env <VAR>", "Env var holding the API key for --auth-mode apiKey (never pass the key as a flag)")
|
|
1439
|
+
.option("--slack-bot-token <xoxb-token>", "Reuse an existing Slack bot token; HQ_SLACK_BOT_TOKEN or --slack-tokens-stdin avoid shell history")
|
|
1440
|
+
.option("--slack-app-token <xapp-token>", "Socket Mode app token for --provider agents-v2; HQ_SLACK_APP_TOKEN or --slack-tokens-stdin avoid shell history")
|
|
1441
|
+
.option("--slack-tokens-stdin", "Read the bot token and optional app token from one or two stdin lines")
|
|
774
1442
|
.option("--title <title>", "Org-chart job title")
|
|
775
1443
|
.option("--description <text>", "Short description / bio")
|
|
776
1444
|
.option("--size <size>", "Agent box size: basic | power | dev (omitted keeps the current default)")
|
|
777
1445
|
.option("--yes", "Confirm the quoted monthly cost and provision the agent")
|
|
1446
|
+
.option("--json", "Emit machine-readable output and never open a browser")
|
|
1447
|
+
.addHelpText("after", `\n${claudeProvisionGuidance()}\n`)
|
|
778
1448
|
.action(async function (name, opts) {
|
|
779
1449
|
try {
|
|
1450
|
+
const slug = opts.slug ?? slugifyAgentName(name);
|
|
1451
|
+
if (!AGENT_SLUG_PATTERN.test(slug)) {
|
|
1452
|
+
console.error(chalk.red("Agent slug must start with a lowercase letter or digit, contain only lowercase letters, digits, and hyphens, and be at most 63 characters. " +
|
|
1453
|
+
"Update --slug or the agent name."));
|
|
1454
|
+
process.exit(1);
|
|
1455
|
+
}
|
|
780
1456
|
// Both of these previously fell back to their default on an
|
|
781
1457
|
// unrecognised value, silently provisioning a billable box the operator
|
|
782
1458
|
// did not ask for. They now exit(1) instead — see parseEnumOption.
|
|
783
1459
|
const authMode = parseEnumOption(opts.authMode, VALID_AUTH_MODES, "--auth-mode") ?? "subscription";
|
|
784
|
-
const
|
|
1460
|
+
const explicitProvider = parseEnumOption(opts.provider, VALID_PROVIDERS, "--provider");
|
|
1461
|
+
if (opts.model !== undefined &&
|
|
1462
|
+
!/^[A-Za-z0-9._-]{1,64}$/.test(opts.model)) {
|
|
1463
|
+
console.error(chalk.red("--model must be a model identifier (letters, digits, dot, dash, underscore; max 64 chars)."));
|
|
1464
|
+
process.exit(1);
|
|
1465
|
+
}
|
|
1466
|
+
const provider = explicitProvider ?? (opts.model ? "agents-v2" : undefined);
|
|
1467
|
+
const slackTokens = await resolveProvisionSlackTokens(opts);
|
|
1468
|
+
if (slackTokens?.appToken && provider !== "agents-v2") {
|
|
1469
|
+
throw new Error("A Slack app token can only be supplied with --provider agents-v2 for Socket Mode.");
|
|
1470
|
+
}
|
|
1471
|
+
if (slackTokens && provider === "agents-v2" && !slackTokens.appToken) {
|
|
1472
|
+
throw new Error("--provider agents-v2 requires a Slack app token when reusing a Slack bot token.");
|
|
1473
|
+
}
|
|
785
1474
|
// claude is subscription-only on hq-pro (rejectIncompatibleProviderAuthMode
|
|
786
1475
|
// returns AGENT_PROVIDER_INCOMPATIBLE_WITH_AUTH_MODE). Catch it here so the
|
|
787
1476
|
// operator gets a direct message instead of a 400 from the control plane
|
|
788
1477
|
// AFTER clearing the charge gate. The server stays authoritative; this is
|
|
789
1478
|
// only a friendlier, earlier copy of the same rule.
|
|
790
1479
|
if (provider === "claude" && authMode === "apiKey") {
|
|
791
|
-
console.error(chalk.red(
|
|
1480
|
+
console.error(chalk.red(`Use agents-v2 for new Claude agents. The claude provider remains accepted for script compatibility.\n${claudeProvisionGuidance()}`));
|
|
792
1481
|
process.exit(1);
|
|
793
1482
|
}
|
|
794
1483
|
// Resolve the API key from the environment (never from a flag value) when
|
|
@@ -809,6 +1498,9 @@ export function registerAgentsCommand(program) {
|
|
|
809
1498
|
}
|
|
810
1499
|
const token = (await resolveVaultCredential()).token;
|
|
811
1500
|
const companyUid = await getCompanyUid(token, companyOf(this));
|
|
1501
|
+
if (opts.model !== undefined) {
|
|
1502
|
+
await validateAgentModelOption(token, provider, opts.model);
|
|
1503
|
+
}
|
|
812
1504
|
const idempotencyKey = `hq-cli-${randomUUID()}`;
|
|
813
1505
|
const sizeKey = parseEnumOption(opts.size, VALID_AGENT_SIZE_KEYS, "--size");
|
|
814
1506
|
const shouldChooseInteractively = !sizeKey && process.stdin.isTTY === true;
|
|
@@ -818,13 +1510,12 @@ export function registerAgentsCommand(program) {
|
|
|
818
1510
|
: shouldChooseInteractively
|
|
819
1511
|
? await promptForAgentCreateSize(createOptions)
|
|
820
1512
|
: requireDefaultAgentCreateSize(createOptions);
|
|
821
|
-
if (!shouldChooseInteractively) {
|
|
1513
|
+
if (!shouldChooseInteractively && !opts.json) {
|
|
822
1514
|
console.log(chalk.dim(formatAgentCreateSize(quotedSize)));
|
|
823
1515
|
}
|
|
824
1516
|
// Every path confirms hq-pro's company-specific quote. Omission still
|
|
825
1517
|
// leaves the POST size implicit, preserving the server-side default.
|
|
826
|
-
confirmAgentCreateQuoteOrExit(quotedSize, opts.yes);
|
|
827
|
-
const slug = opts.slug ?? slugifyAgentName(name);
|
|
1518
|
+
confirmAgentCreateQuoteOrExit(quotedSize, opts.yes, opts.json);
|
|
828
1519
|
try {
|
|
829
1520
|
const result = await provisionAgent(token, {
|
|
830
1521
|
companyUid,
|
|
@@ -832,7 +1523,12 @@ export function registerAgentsCommand(program) {
|
|
|
832
1523
|
slug,
|
|
833
1524
|
codexAuthMode: authMode,
|
|
834
1525
|
...(provider ? { provider } : {}),
|
|
1526
|
+
...(opts.model ? { codexModel: opts.model } : {}),
|
|
835
1527
|
...(codexApiKey ? { codexApiKey } : {}),
|
|
1528
|
+
...(slackTokens ? { slackBotToken: slackTokens.botToken } : {}),
|
|
1529
|
+
...(slackTokens?.appToken
|
|
1530
|
+
? { slackAppToken: slackTokens.appToken }
|
|
1531
|
+
: {}),
|
|
836
1532
|
idempotencyKey,
|
|
837
1533
|
...(opts.title ? { title: opts.title } : {}),
|
|
838
1534
|
...(opts.description ? { description: opts.description } : {}),
|
|
@@ -848,11 +1544,79 @@ export function registerAgentsCommand(program) {
|
|
|
848
1544
|
quoteCatalogVersion: createOptions.catalogVersion,
|
|
849
1545
|
surface: CLI_AGENT_CREATE_SURFACE,
|
|
850
1546
|
});
|
|
851
|
-
const
|
|
852
|
-
|
|
853
|
-
|
|
1547
|
+
const identity = provisionedAgentIdentity(result);
|
|
1548
|
+
const claudeSignIn = provider === "agents-v2" &&
|
|
1549
|
+
authMode === "subscription" &&
|
|
1550
|
+
opts.model?.toLowerCase().startsWith("claude-") &&
|
|
1551
|
+
identity
|
|
1552
|
+
? {
|
|
1553
|
+
consoleUrl: agentConsoleResolveUrl(identity.uid) ?? null,
|
|
1554
|
+
loginCodeCommand: `hq agents login-code ${identity.uid}`,
|
|
1555
|
+
}
|
|
1556
|
+
: undefined;
|
|
1557
|
+
const status = identity
|
|
1558
|
+
? await getAgentStatus(token, identity.uid)
|
|
1559
|
+
: null;
|
|
1560
|
+
const actions = status
|
|
1561
|
+
? pendingOperatorActions(status, await consoleCompanySlug(token, status, companyOf(this)))
|
|
1562
|
+
: [];
|
|
1563
|
+
const slackInstall = actions.find((action) => action.type === "slack-install");
|
|
1564
|
+
if (opts.json) {
|
|
1565
|
+
console.log(JSON.stringify({
|
|
1566
|
+
...result,
|
|
1567
|
+
...(actions.length > 0
|
|
1568
|
+
? { pendingActions: pendingActionsJson(actions) }
|
|
1569
|
+
: {}),
|
|
1570
|
+
...(slackInstall?.url
|
|
1571
|
+
? {
|
|
1572
|
+
slackInstallPending: true,
|
|
1573
|
+
slackInstallUrl: slackInstall.url,
|
|
1574
|
+
}
|
|
1575
|
+
: {}),
|
|
1576
|
+
...(claudeSignIn ? { claudeSignIn } : {}),
|
|
1577
|
+
}));
|
|
1578
|
+
}
|
|
1579
|
+
else {
|
|
1580
|
+
console.log(chalk.green(`Provisioning started for agent "${name}".`));
|
|
1581
|
+
if (claudeSignIn) {
|
|
1582
|
+
if (claudeSignIn.consoleUrl) {
|
|
1583
|
+
console.log(chalk.yellow(`To sign in, open ${claudeSignIn.consoleUrl}, authorize Claude, then paste the code on that page.`));
|
|
1584
|
+
}
|
|
1585
|
+
else {
|
|
1586
|
+
console.log(chalk.yellow("The console URL for this control plane is unknown. Set HQ_CONSOLE_URL to configure it."));
|
|
1587
|
+
}
|
|
1588
|
+
console.log(chalk.dim(`A human CLI session can also submit the code with: ${claudeSignIn.loginCodeCommand}`));
|
|
1589
|
+
}
|
|
1590
|
+
if (actions.length > 0) {
|
|
1591
|
+
printPendingOperatorActions(identity?.slug ?? null, actions);
|
|
1592
|
+
}
|
|
1593
|
+
else {
|
|
1594
|
+
console.log(chalk.dim(`Track setup: hq agents status ${identity?.slug ?? slug} --company <slug>`));
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
854
1597
|
}
|
|
855
1598
|
catch (err) {
|
|
1599
|
+
if (provider === "claude" &&
|
|
1600
|
+
err instanceof AgentsHttpError &&
|
|
1601
|
+
err.code === "LEGACY_MANAGED_PROVIDER_RETIRED") {
|
|
1602
|
+
throw new Error(`${err.message}\n\n${claudeProvisionGuidance()}`);
|
|
1603
|
+
}
|
|
1604
|
+
if (err instanceof AgentsHttpError &&
|
|
1605
|
+
err.status === 403 &&
|
|
1606
|
+
err.code === "AGENT_PLAN_LIMIT") {
|
|
1607
|
+
if (!err.agentCreatePlanLimit) {
|
|
1608
|
+
throw new Error("HQ Pro returned an unrecognized agent payment-required response.");
|
|
1609
|
+
}
|
|
1610
|
+
await surfaceAgentCreatePlanLimit(err.agentCreatePlanLimit, {
|
|
1611
|
+
...opts,
|
|
1612
|
+
companyUid,
|
|
1613
|
+
});
|
|
1614
|
+
// Keep the payment-required status through normal CLI teardown.
|
|
1615
|
+
// Unlike process.exit(), this is testable and cannot be caught by
|
|
1616
|
+
// this action's outer error boundary as a generic failure.
|
|
1617
|
+
process.exitCode = AGENT_CREATE_PAYMENT_REQUIRED_EXIT_CODE;
|
|
1618
|
+
return;
|
|
1619
|
+
}
|
|
856
1620
|
// No card on file → surface the shareable payment link instead of an
|
|
857
1621
|
// opaque 402, then exit non-zero so scripts can react.
|
|
858
1622
|
if (err instanceof AgentsHttpError &&
|
|
@@ -868,6 +1632,32 @@ export function registerAgentsCommand(program) {
|
|
|
868
1632
|
fail(err);
|
|
869
1633
|
}
|
|
870
1634
|
});
|
|
1635
|
+
agents
|
|
1636
|
+
.command("login-code <agentUid> [code]")
|
|
1637
|
+
.description("Submit a Claude subscription sign-in code for an agent")
|
|
1638
|
+
.action(async (agentUid, codeArg) => {
|
|
1639
|
+
let code = "";
|
|
1640
|
+
try {
|
|
1641
|
+
code = await readLoginCode(codeArg);
|
|
1642
|
+
const token = (await resolveVaultCredential()).token;
|
|
1643
|
+
await submitAgentLoginCode(token, agentUid, code);
|
|
1644
|
+
console.log(chalk.green(`Sent the Claude sign-in code to agent ${agentUid}.`));
|
|
1645
|
+
}
|
|
1646
|
+
catch (err) {
|
|
1647
|
+
if (err instanceof AgentsHttpError &&
|
|
1648
|
+
err.status === 403 &&
|
|
1649
|
+
err.code === "OUTPOST_ACCOUNT_MANAGEMENT_FORBIDDEN") {
|
|
1650
|
+
const consoleUrl = agentConsoleResolveUrl(agentUid);
|
|
1651
|
+
console.error(chalk.yellow(consoleUrl
|
|
1652
|
+
? `A person must paste this code in the agent console: ${consoleUrl}`
|
|
1653
|
+
: "A person must paste this code in the agent console. Set HQ_CONSOLE_URL to configure it for this control plane."));
|
|
1654
|
+
process.exit(1);
|
|
1655
|
+
}
|
|
1656
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
1657
|
+
console.error(chalk.red(`Could not submit Claude sign-in code: ${redactLoginCode(detail, code)}`));
|
|
1658
|
+
process.exit(1);
|
|
1659
|
+
}
|
|
1660
|
+
});
|
|
871
1661
|
agents
|
|
872
1662
|
.command("list")
|
|
873
1663
|
.description("List the company's agents")
|
|
@@ -901,7 +1691,7 @@ export function registerAgentsCommand(program) {
|
|
|
901
1691
|
}
|
|
902
1692
|
const nameW = Math.max(4, ...roster.map((a) => (a.name ?? "").length));
|
|
903
1693
|
const slugW = Math.max(4, ...roster.map((a) => (a.slug ?? "").length));
|
|
904
|
-
const statusW = Math.max(6, ...roster.map((a) => (a
|
|
1694
|
+
const statusW = Math.max(6, ...roster.map((a) => rosterStatusLabel(a).length));
|
|
905
1695
|
const modelW = Math.max(5, ...roster.map((a) => (a.codexModel ?? "").length));
|
|
906
1696
|
console.log(chalk.bold([
|
|
907
1697
|
"NAME".padEnd(nameW),
|
|
@@ -914,7 +1704,7 @@ export function registerAgentsCommand(program) {
|
|
|
914
1704
|
console.log([
|
|
915
1705
|
(a.name ?? "").padEnd(nameW),
|
|
916
1706
|
(a.slug ?? "").padEnd(slugW),
|
|
917
|
-
(a
|
|
1707
|
+
rosterStatusLabel(a).padEnd(statusW),
|
|
918
1708
|
(a.codexModel ?? "").padEnd(modelW),
|
|
919
1709
|
a.uid,
|
|
920
1710
|
].join(" "));
|
|
@@ -925,16 +1715,28 @@ export function registerAgentsCommand(program) {
|
|
|
925
1715
|
}
|
|
926
1716
|
});
|
|
927
1717
|
agents
|
|
928
|
-
.command("status <
|
|
1718
|
+
.command("status <agent>")
|
|
929
1719
|
.description("Show an agent's setup state and runtime detail")
|
|
930
1720
|
.option("--company <slug>", "Company slug (resolves to companyUid)")
|
|
931
1721
|
.option("--json", "Emit raw JSON")
|
|
932
|
-
.action(async function (
|
|
1722
|
+
.action(async function (agent, opts) {
|
|
933
1723
|
try {
|
|
934
1724
|
const token = (await resolveVaultCredential()).token;
|
|
1725
|
+
const agentUid = await resolveAgentUid(token, agent, companyOf(this));
|
|
935
1726
|
const status = await getAgentStatus(token, agentUid);
|
|
1727
|
+
const actions = pendingOperatorActions(status, await consoleCompanySlug(token, status, companyOf(this)));
|
|
936
1728
|
if (opts.json) {
|
|
937
|
-
process.stdout.write(JSON.stringify(
|
|
1729
|
+
process.stdout.write(JSON.stringify({
|
|
1730
|
+
...status,
|
|
1731
|
+
...(actions.length > 0
|
|
1732
|
+
? { pendingActions: pendingActionsJson(actions) }
|
|
1733
|
+
: {}),
|
|
1734
|
+
}, null, 2) + "\n");
|
|
1735
|
+
return;
|
|
1736
|
+
}
|
|
1737
|
+
if (actions.length > 0) {
|
|
1738
|
+
printPendingOperatorActions(statusAgentSlug(status) ??
|
|
1739
|
+
(AGENT_UID_PATTERN.test(agent.trim()) ? null : agent.trim()), actions);
|
|
938
1740
|
return;
|
|
939
1741
|
}
|
|
940
1742
|
// Pretty but faithful: dump the top-level fields as key: value.
|
|
@@ -1004,9 +1806,10 @@ export function registerAgentsCommand(program) {
|
|
|
1004
1806
|
});
|
|
1005
1807
|
agents
|
|
1006
1808
|
.command("config <agentUid>")
|
|
1809
|
+
.alias("update")
|
|
1007
1810
|
.description("Update an agent's runtime config (model / reasoning effort / service tier), or migrate its brain/runtime provider with --provider (DESTRUCTIVE: terminates + reprovisions the box)")
|
|
1008
1811
|
.option("--company <slug>", "Company slug (resolves to companyUid)")
|
|
1009
|
-
.option("--model <model>", "
|
|
1812
|
+
.option("--model <model>", "Model id from `hq agents models`")
|
|
1010
1813
|
.option("--effort <effort>", "Reasoning effort: minimal | low | medium | high | xhigh")
|
|
1011
1814
|
.option("--tier <tier>", "Service tier (speed): default | priority")
|
|
1012
1815
|
.option("--provider <provider>", "Migrate brain/runtime provider (codex | grok | claude | agents-v2). DESTRUCTIVE: terminates and reprovisions the box; requires --model and --yes.")
|
|
@@ -1075,6 +1878,9 @@ export function registerAgentsCommand(program) {
|
|
|
1075
1878
|
process.exit(1);
|
|
1076
1879
|
}
|
|
1077
1880
|
const token = (await resolveVaultCredential()).token;
|
|
1881
|
+
if (opts.model !== undefined) {
|
|
1882
|
+
await validateAgentModelOption(token, opts.provider?.trim().toLowerCase(), opts.model);
|
|
1883
|
+
}
|
|
1078
1884
|
const result = await patchAgentRuntimeConfig(token, agentUid, patch);
|
|
1079
1885
|
if (opts.json) {
|
|
1080
1886
|
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
@@ -1094,8 +1900,16 @@ export function registerAgentsCommand(program) {
|
|
|
1094
1900
|
.action(async function (agentUid) {
|
|
1095
1901
|
try {
|
|
1096
1902
|
const token = (await resolveVaultCredential()).token;
|
|
1097
|
-
await startStopAgent(token, agentUid, action);
|
|
1098
|
-
|
|
1903
|
+
const result = await startStopAgent(token, agentUid, action);
|
|
1904
|
+
const runtimeStatus = result.runtime?.status;
|
|
1905
|
+
const successMessage = action === "start"
|
|
1906
|
+
? `Started agent ${agentUid}.`
|
|
1907
|
+
: runtimeStatus === "terminated"
|
|
1908
|
+
? `Stopped agent ${agentUid}.`
|
|
1909
|
+
: typeof runtimeStatus === "string"
|
|
1910
|
+
? `Stop accepted for agent ${agentUid} (status: ${runtimeStatus}).`
|
|
1911
|
+
: `Stop accepted for agent ${agentUid}.`;
|
|
1912
|
+
console.log(chalk.green(successMessage));
|
|
1099
1913
|
}
|
|
1100
1914
|
catch (err) {
|
|
1101
1915
|
fail(err);
|
|
@@ -1122,6 +1936,7 @@ export function registerAgentsCommand(program) {
|
|
|
1122
1936
|
.description("Deprovision (permanently tear down) an agent")
|
|
1123
1937
|
.option("--company <slug>", "Company slug (resolves to companyUid)")
|
|
1124
1938
|
.option("--yes", "Confirm the irreversible teardown (required)")
|
|
1939
|
+
.option("--confirm-destroy-agents-v2 <instance-id>", "Confirm agents-v2 teardown by naming the live EC2 instance ID")
|
|
1125
1940
|
.action(async function (agentUid, opts) {
|
|
1126
1941
|
if (!opts.yes) {
|
|
1127
1942
|
console.error(chalk.yellow(`This will permanently deprovision agent ${agentUid} and tear down its ` +
|
|
@@ -1131,7 +1946,13 @@ export function registerAgentsCommand(program) {
|
|
|
1131
1946
|
}
|
|
1132
1947
|
try {
|
|
1133
1948
|
const token = (await resolveVaultCredential()).token;
|
|
1134
|
-
const
|
|
1949
|
+
const status = await getAgentStatus(token, agentUid);
|
|
1950
|
+
if (recordValue(status.agent)?.runtimeKind === "external") {
|
|
1951
|
+
await revokeAgent(token, agentUid, true);
|
|
1952
|
+
console.log(chalk.green(`Revoked and removed external agent ${agentUid}.`));
|
|
1953
|
+
return;
|
|
1954
|
+
}
|
|
1955
|
+
const result = await deprovisionAgent(token, agentUid, opts.confirmDestroyAgentsV2);
|
|
1135
1956
|
if (result.terminal === false) {
|
|
1136
1957
|
console.log(chalk.yellow(`Deprovision in progress for agent ${agentUid} (not yet fully torn down — re-run to continue).`));
|
|
1137
1958
|
}
|
|
@@ -1143,12 +1964,56 @@ export function registerAgentsCommand(program) {
|
|
|
1143
1964
|
fail(err);
|
|
1144
1965
|
}
|
|
1145
1966
|
});
|
|
1967
|
+
agents
|
|
1968
|
+
.command("rotate <agentUid>")
|
|
1969
|
+
.description("Issue a fresh enrollment code for an external agent (old secret + host key stop minting)")
|
|
1970
|
+
.option("--company <slug>", "Company slug (resolves to companyUid)")
|
|
1971
|
+
.option("--json", "Emit raw JSON (code included — pipe carefully)")
|
|
1972
|
+
.action(async function (agentUid, opts) {
|
|
1973
|
+
try {
|
|
1974
|
+
const token = (await resolveVaultCredential()).token;
|
|
1975
|
+
const result = await rotateAgent(token, agentUid);
|
|
1976
|
+
if (opts.json) {
|
|
1977
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1978
|
+
return;
|
|
1979
|
+
}
|
|
1980
|
+
for (const line of formatRotateOutput(result))
|
|
1981
|
+
console.log(line);
|
|
1982
|
+
}
|
|
1983
|
+
catch (err) {
|
|
1984
|
+
fail(err);
|
|
1985
|
+
}
|
|
1986
|
+
});
|
|
1987
|
+
agents
|
|
1988
|
+
.command("revoke <agentUid>")
|
|
1989
|
+
.description("Revoke an external agent: disable its login and drop it from the team")
|
|
1990
|
+
.option("--company <slug>", "Company slug (resolves to companyUid)")
|
|
1991
|
+
.option("--remove", "Also delete the agent entity (it disappears from the roster)")
|
|
1992
|
+
.option("--yes", "Confirm the revoke (required)")
|
|
1993
|
+
.action(async function (agentUid, opts) {
|
|
1994
|
+
if (!opts.yes) {
|
|
1995
|
+
console.error(chalk.yellow(`This will revoke agent ${agentUid}: its credentials stop working immediately and it ` +
|
|
1996
|
+
`leaves the team${opts.remove ? ", and the agent record is deleted" : ""}. ` +
|
|
1997
|
+
`Re-run with --yes to confirm: hq agents revoke ${agentUid}${opts.remove ? " --remove" : ""} --yes`));
|
|
1998
|
+
process.exit(1);
|
|
1999
|
+
}
|
|
2000
|
+
try {
|
|
2001
|
+
const token = (await resolveVaultCredential()).token;
|
|
2002
|
+
const result = await revokeAgent(token, agentUid, opts.remove === true);
|
|
2003
|
+
console.log(chalk.green(result.removed
|
|
2004
|
+
? `Revoked and removed agent ${agentUid}.`
|
|
2005
|
+
: `Revoked agent ${agentUid}. Its next mint will be refused (401).`));
|
|
2006
|
+
}
|
|
2007
|
+
catch (err) {
|
|
2008
|
+
fail(err);
|
|
2009
|
+
}
|
|
2010
|
+
});
|
|
1146
2011
|
// Off-box job control (US-003). Nested group so `hq agents jobs --help`
|
|
1147
|
-
// lists list|pause|cancel. Same vaultApiFetch + person JWT as the rest of
|
|
2012
|
+
// lists list|pause|resume|cancel. Same vaultApiFetch + person JWT as the rest of
|
|
1148
2013
|
// this file; keyed HQ_API_KEY rewrites /v1/agents → /v1/keys/agents.
|
|
1149
2014
|
const jobs = agents
|
|
1150
2015
|
.command("jobs")
|
|
1151
|
-
.description("List, pause, or cancel an agent's scheduled jobs");
|
|
2016
|
+
.description("List, pause, resume, or cancel an agent's scheduled jobs");
|
|
1152
2017
|
jobs
|
|
1153
2018
|
.command("list <agentUid>")
|
|
1154
2019
|
.description("List an agent's scheduled jobs")
|
|
@@ -1186,6 +2051,20 @@ export function registerAgentsCommand(program) {
|
|
|
1186
2051
|
failJobs(err, jobId);
|
|
1187
2052
|
}
|
|
1188
2053
|
});
|
|
2054
|
+
jobs
|
|
2055
|
+
.command("resume <agentUid> <jobId>")
|
|
2056
|
+
.description("Resume a paused job's schedule")
|
|
2057
|
+
.option("--company <slug>", "Company slug (to resolve an agent by name/slug)")
|
|
2058
|
+
.action(async function (agentUid, jobId) {
|
|
2059
|
+
const { token, targetUid } = await resolveJobsTargetOrExit(agentUid, companyOf(this));
|
|
2060
|
+
try {
|
|
2061
|
+
const result = await resumeAgentJob(token, targetUid, jobId);
|
|
2062
|
+
console.log(chalk.green(formatResumeResult(result)));
|
|
2063
|
+
}
|
|
2064
|
+
catch (err) {
|
|
2065
|
+
failJobs(err, jobId, "resume");
|
|
2066
|
+
}
|
|
2067
|
+
});
|
|
1189
2068
|
jobs
|
|
1190
2069
|
.command("cancel <agentUid> <jobId>")
|
|
1191
2070
|
.description("Cancel a job and delete its schedule")
|