@indigoai-us/hq-cli 5.312.2-beta.0 → 5.314.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 +1 -4293
- package/assets/scaffold/core/scripts/checkpoint-stop-gate.sh +43 -281
- package/assets/scaffold/core/scripts/hook-lib.sh +50 -345
- package/assets/scaffold/core/scripts/hq-session.sh +23 -184
- package/assets/scaffold/core/scripts/lib/session-id.sh +2 -3
- package/assets/scaffold/core/scripts/lib/session-scope-capability.sh +1 -1
- package/assets/scaffold/core/scripts/lib/work-mesh-enqueue.sh +1 -2
- package/assets/scaffold/core/scripts/qmd-reindex-after-sync.sh +87 -10
- package/assets/scaffold/core/scripts/rebuild-company-knowledge-index.sh +3 -36
- package/assets/scaffold/core/scripts/rebuild-projects-index.sh +12 -99
- package/assets/scaffold/core/scripts/token-usage-report.sh +20 -81
- package/dist/bin/hq-auth-refresh.d.ts +0 -2
- package/dist/bin/hq-auth-refresh.js +6 -12
- package/dist/commands/__fixtures__/access-vault.d.ts +0 -2
- package/dist/commands/__fixtures__/access-vault.js +1 -1
- package/dist/commands/_patterns.d.ts +0 -16
- package/dist/commands/_patterns.js +3 -20
- package/dist/commands/access.d.ts +1 -2
- package/dist/commands/access.js +49 -58
- package/dist/commands/agents.d.ts +4 -106
- package/dist/commands/agents.js +45 -924
- package/dist/commands/auth.d.ts +0 -1
- package/dist/commands/auth.js +19 -189
- package/dist/commands/billing.d.ts +0 -3
- package/dist/commands/billing.js +1 -6
- package/dist/commands/channels.js +1 -56
- package/dist/commands/cloud-demote.js +2 -3
- package/dist/commands/cloud-provision.d.ts +0 -14
- package/dist/commands/cloud-provision.js +58 -232
- package/dist/commands/cloud.d.ts +15 -49
- package/dist/commands/cloud.js +122 -358
- package/dist/commands/company-transfer.d.ts +28 -4
- package/dist/commands/company-transfer.js +49 -5
- package/dist/commands/company.js +3 -66
- package/dist/commands/core-checkpoint.d.ts +9 -19
- package/dist/commands/core-checkpoint.js +37 -301
- package/dist/commands/core.d.ts +0 -4
- package/dist/commands/core.js +80 -270
- package/dist/commands/crm.js +3 -52
- package/dist/commands/db-provision.js +4 -4
- package/dist/commands/db-sql.js +21 -7
- package/dist/commands/dm.d.ts +12 -119
- package/dist/commands/dm.js +38 -388
- package/dist/commands/doctor.d.ts +0 -12
- package/dist/commands/doctor.js +12 -158
- package/dist/commands/feedback.d.ts +0 -6
- package/dist/commands/feedback.js +37 -86
- package/dist/commands/files-browse.d.ts +12 -32
- package/dist/commands/files-browse.js +60 -176
- package/dist/commands/files.d.ts +0 -17
- package/dist/commands/files.js +47 -300
- package/dist/commands/group-grants.js +2 -3
- package/dist/commands/groups.js +5 -6
- package/dist/commands/index-cmd.d.ts +1 -19
- package/dist/commands/index-cmd.js +7 -74
- package/dist/commands/integrations-api.d.ts +10 -15
- package/dist/commands/integrations-api.js +22 -27
- package/dist/commands/integrations-connect.d.ts +13 -51
- package/dist/commands/integrations-connect.js +71 -86
- package/dist/commands/integrations-core.d.ts +6 -6
- package/dist/commands/integrations-core.js +11 -25
- package/dist/commands/integrations-import.d.ts +1 -1
- package/dist/commands/integrations-import.js +24 -43
- package/dist/commands/integrations-manage.js +13 -20
- package/dist/commands/integrations.d.ts +0 -8
- package/dist/commands/integrations.js +7 -94
- package/dist/commands/login.js +6 -49
- package/dist/commands/mcp-registration.d.ts +25 -32
- package/dist/commands/mcp-registration.js +23 -256
- package/dist/commands/mcp-status.js +0 -1
- package/dist/commands/meetings.js +34 -55
- package/dist/commands/members.js +1 -5
- package/dist/commands/mesh.d.ts +0 -11
- package/dist/commands/mesh.js +76 -1086
- package/dist/commands/onboard-identity-guard.d.ts +1 -1
- package/dist/commands/onboard.js +5 -24
- package/dist/commands/pack-install.js +1 -3
- package/dist/commands/packs.js +1 -11
- package/dist/commands/people.d.ts +0 -4
- package/dist/commands/people.js +3 -37
- package/dist/commands/publish.d.ts +1 -8
- package/dist/commands/publish.js +4 -17
- package/dist/commands/reindex.js +6 -56
- package/dist/commands/rescue.d.ts +0 -4
- package/dist/commands/rescue.js +17 -27
- package/dist/commands/run.js +4 -18
- package/dist/commands/safe-extract.d.ts +2 -11
- package/dist/commands/safe-extract.js +8 -36
- package/dist/commands/scaffold-fast.d.ts +41 -0
- package/dist/commands/scaffold-fast.js +57 -0
- package/dist/commands/secrets.d.ts +2 -20
- package/dist/commands/secrets.js +71 -175
- package/dist/commands/skill.d.ts +4 -35
- package/dist/commands/skill.js +18 -357
- package/dist/commands/sync-mode.d.ts +0 -11
- package/dist/commands/sync-mode.js +0 -30
- package/dist/commands/sync-narrow.js +5 -36
- package/dist/commands/team-sync.js +10 -71
- package/dist/commands/update.js +0 -6
- package/dist/commands/whoami.d.ts +0 -22
- package/dist/commands/whoami.js +4 -137
- package/dist/commands/workers.d.ts +14 -2
- package/dist/commands/workers.js +10 -7
- package/dist/fast-core.d.ts +7 -6
- package/dist/fast-core.js +24 -80
- package/dist/index.d.ts +4 -3
- package/dist/index.js +9 -59
- package/dist/lazy-commands.d.ts +44 -20
- package/dist/lazy-commands.js +58 -60
- package/dist/lib/company-skill-wrapper.d.ts +0 -1
- package/dist/lib/company-skill-wrapper.js +29 -121
- package/dist/lib/core-utils/codex-skill-bridge.d.ts +1 -2
- package/dist/lib/core-utils/qmd-reindex-after-sync.d.ts +1 -14
- package/dist/lib/core-utils/qmd-reindex-after-sync.js +17 -101
- package/dist/lib/core-utils/soft-timeout.js +1 -1
- package/dist/lib/core-utils/timeout-guard.d.ts +3 -3
- package/dist/lib/core-utils/timeout-guard.js +13 -28
- package/dist/lib/core-utils/token-usage-report.js +3 -17
- package/dist/lib/db/control-plane.js +0 -6
- package/dist/lib/db/local.d.ts +5 -0
- package/dist/lib/db/local.js +1 -1
- package/dist/lib/db/migrate.d.ts +12 -0
- 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 +10 -0
- package/dist/lib/db/sql.js +8 -4
- 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/checks/claude-wiring.js +1 -70
- package/dist/lib/doctor/checks/codex-wiring.d.ts +4 -0
- package/dist/lib/doctor/checks/codex-wiring.js +35 -3
- package/dist/lib/doctor/checks/grok-wiring.js +34 -1
- package/dist/lib/doctor/checks/integrations.js +0 -11
- package/dist/lib/doctor/checks/runtime-health.d.ts +17 -4
- package/dist/lib/doctor/checks/runtime-health.js +7 -20
- package/dist/lib/doctor/checks/sync-health.d.ts +0 -21
- package/dist/lib/doctor/checks/sync-health.js +2 -72
- package/dist/lib/doctor/checks/work-context.js +6 -12
- package/dist/lib/doctor/compat.d.ts +16 -0
- package/dist/lib/doctor/compat.js +3 -4
- package/dist/lib/doctor/deep/effects.js +3 -1
- package/dist/lib/doctor/deep/executor.d.ts +10 -4
- package/dist/lib/doctor/deep/executor.js +1 -1
- package/dist/lib/doctor/deep/parity.d.ts +29 -2
- package/dist/lib/doctor/deep/parity.js +7 -7
- package/dist/lib/doctor/deep/sandbox.d.ts +25 -7
- package/dist/lib/doctor/deep/sandbox.js +7 -5
- package/dist/lib/doctor/fix/apply.d.ts +8 -79
- package/dist/lib/doctor/fix/apply.js +80 -292
- package/dist/lib/doctor/fix/remediation.d.ts +6 -14
- package/dist/lib/doctor/fix/remediation.js +9 -49
- package/dist/lib/doctor/fixtures/schema.js +3 -1
- package/dist/lib/doctor/json-output.d.ts +1 -17
- package/dist/lib/doctor/json-output.js +2 -7
- package/dist/lib/doctor/platform.d.ts +26 -0
- package/dist/lib/doctor/platform.js +5 -5
- package/dist/lib/doctor/registry.d.ts +0 -14
- package/dist/lib/doctor/registry.js +0 -71
- package/dist/lib/doctor/report.js +1 -1
- package/dist/lib/doctor/types.d.ts +0 -5
- package/dist/lib/doctor/types.js +0 -20
- package/dist/lib/flag-registry-worker.js +1 -12
- package/dist/lib/flag-registry.d.ts +6 -26
- package/dist/lib/flag-registry.js +16 -133
- package/dist/lib/index-render/companies.d.ts +1 -4
- package/dist/lib/index-render/companies.js +3 -66
- package/dist/lib/index-render/company-knowledge.js +17 -80
- package/dist/lib/index-render/index.d.ts +0 -1
- package/dist/lib/index-render/index.js +1 -2
- package/dist/lib/index-render/projects.js +5 -82
- package/dist/lib/index-render/shared.d.ts +1 -13
- package/dist/lib/index-render/shared.js +2 -41
- package/dist/lib/mesh/api.d.ts +10 -103
- package/dist/lib/mesh/api.js +64 -334
- package/dist/lib/mesh/client.d.ts +2 -3
- package/dist/lib/mesh/client.js +2 -3
- package/dist/lib/mesh/live/backfill-held.d.ts +16 -67
- package/dist/lib/mesh/live/backfill-held.js +61 -415
- package/dist/lib/mesh/live/backoff.d.ts +2 -2
- package/dist/lib/mesh/live/backoff.js +3 -16
- package/dist/lib/mesh/live/daemon/board-refresh.d.ts +1 -7
- package/dist/lib/mesh/live/daemon/board-refresh.js +30 -78
- package/dist/lib/mesh/live/daemon/credentials.d.ts +10 -64
- package/dist/lib/mesh/live/daemon/credentials.js +20 -270
- package/dist/lib/mesh/live/daemon/doctor.d.ts +0 -51
- package/dist/lib/mesh/live/daemon/doctor.js +6 -180
- package/dist/lib/mesh/live/daemon/index.d.ts +10 -13
- package/dist/lib/mesh/live/daemon/index.js +6 -7
- package/dist/lib/mesh/live/daemon/install.d.ts +1 -255
- package/dist/lib/mesh/live/daemon/install.js +13 -811
- package/dist/lib/mesh/live/daemon/paths.d.ts +0 -2
- package/dist/lib/mesh/live/daemon/paths.js +0 -2
- package/dist/lib/mesh/live/daemon/presence.d.ts +5 -24
- package/dist/lib/mesh/live/daemon/presence.js +10 -79
- package/dist/lib/mesh/live/daemon/run.d.ts +2 -48
- package/dist/lib/mesh/live/daemon/run.js +33 -485
- package/dist/lib/mesh/live/daemon/state.d.ts +2 -19
- package/dist/lib/mesh/live/daemon/state.js +2 -34
- package/dist/lib/mesh/live/daemon/transcript-watch.d.ts +9 -45
- package/dist/lib/mesh/live/daemon/transcript-watch.js +31 -227
- package/dist/lib/mesh/live/emit-client.d.ts +0 -8
- package/dist/lib/mesh/live/emit-client.js +8 -23
- package/dist/lib/mesh/live/emit-evidence.d.ts +0 -19
- package/dist/lib/mesh/live/emit-evidence.js +2 -20
- package/dist/lib/mesh/live/emit.d.ts +0 -9
- package/dist/lib/mesh/live/emit.js +2 -28
- package/dist/lib/mesh/live/enqueue.d.ts +0 -5
- package/dist/lib/mesh/live/enqueue.js +0 -19
- package/dist/lib/mesh/live/flush.d.ts +5 -17
- package/dist/lib/mesh/live/flush.js +38 -391
- package/dist/lib/mesh/live/format-spool-line.d.ts +2 -5
- package/dist/lib/mesh/live/format-spool-line.js +0 -10
- package/dist/lib/mesh/live/paths.d.ts +0 -2
- package/dist/lib/mesh/live/paths.js +0 -4
- package/dist/lib/mesh/live/session-event.schema.json +1 -24
- package/dist/lib/mesh/live/session-events-client.d.ts +0 -2
- package/dist/lib/mesh/live/session-events-client.js +0 -26
- package/dist/lib/mesh/live/spool.d.ts +0 -19
- package/dist/lib/mesh/live/spool.js +3 -269
- 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/plan-limit-nag.d.ts +6 -102
- package/dist/lib/plan-limit-nag.js +43 -348
- package/dist/lib/scan-packages/index.d.ts +0 -2
- package/dist/lib/scan-packages/index.js +6 -168
- package/dist/lib/search-index/background.d.ts +1 -8
- package/dist/lib/search-index/background.js +200 -55
- package/dist/lib/search-index/index.d.ts +0 -12
- package/dist/lib/search-index/index.js +7 -153
- package/dist/lib/work-context/company.d.ts +20 -22
- package/dist/lib/work-context/company.js +40 -124
- package/dist/lib/work-context/config.d.ts +11 -58
- package/dist/lib/work-context/config.js +83 -334
- package/dist/lib/work-context/contract.d.ts +0 -10
- package/dist/lib/work-context/index.d.ts +25 -0
- package/dist/lib/work-context/index.js +21 -0
- package/dist/lib/work-context/outbox.d.ts +1 -14
- package/dist/lib/work-context/outbox.js +1 -87
- package/dist/lib/work-context/reconcile.d.ts +0 -15
- package/dist/lib/work-context/reconcile.js +25 -380
- package/dist/lib/work-context/state.d.ts +10 -93
- package/dist/lib/work-context/state.js +29 -342
- package/dist/lib/workers-registry/index.js +8 -62
- package/dist/main.d.ts +0 -12
- package/dist/main.js +73 -266
- package/dist/node-network-compat.d.ts +30 -2
- package/dist/node-network-compat.js +51 -4
- package/dist/node-preflight.d.ts +1 -7
- package/dist/node-preflight.js +5 -5
- package/dist/register-all.d.ts +29 -4
- package/dist/register-all.js +233 -4
- package/dist/run/discover-schemas.d.ts +1 -2
- package/dist/run/env-graph-guard.d.ts +2 -2
- package/dist/run/env-graph-guard.js +2 -5
- package/dist/run/hq-plugin.d.ts +0 -4
- package/dist/run/hq-plugin.js +8 -36
- package/dist/sentry-before-send.js +0 -80
- package/dist/sentry.d.ts +2 -8
- package/dist/sentry.js +13 -117
- package/dist/startup-registration.d.ts +2 -26
- package/dist/startup-registration.js +15 -116
- package/dist/utils/cli-telemetry.d.ts +1 -74
- package/dist/utils/cli-telemetry.js +7 -434
- package/dist/utils/client-health.d.ts +4 -0
- package/dist/utils/client-health.js +2 -2
- package/dist/utils/cognito-session.d.ts +0 -71
- package/dist/utils/cognito-session.js +27 -481
- package/dist/utils/contribution-table.d.ts +1 -1
- package/dist/utils/environmental-error.d.ts +0 -18
- package/dist/utils/environmental-error.js +7 -240
- package/dist/utils/expected-cli-error.d.ts +0 -2
- package/dist/utils/expected-cli-error.js +0 -4
- package/dist/utils/feedback-diagnostics.d.ts +1 -2
- package/dist/utils/feedback-log-bundle.d.ts +26 -51
- package/dist/utils/feedback-log-bundle.js +31 -211
- package/dist/utils/feedback-logs.d.ts +47 -18
- package/dist/utils/feedback-logs.js +21 -50
- package/dist/utils/feedback-screenshots.d.ts +1 -0
- package/dist/utils/feedback-screenshots.js +1 -1
- package/dist/utils/hq-roots.d.ts +2 -25
- package/dist/utils/hq-roots.js +7 -67
- package/dist/utils/incomplete-install-error.d.ts +19 -87
- package/dist/utils/incomplete-install-error.js +68 -319
- package/dist/utils/install-tree-torn.d.ts +24 -260
- package/dist/utils/install-tree-torn.js +51 -998
- package/dist/utils/large-file-guard.d.ts +10 -0
- package/dist/utils/large-file-guard.js +1 -1
- package/dist/utils/local-files-overview.d.ts +8 -4
- package/dist/utils/local-files-overview.js +7 -48
- package/dist/utils/login-provider.d.ts +0 -7
- package/dist/utils/login-provider.js +0 -34
- package/dist/utils/pack-contributions.d.ts +9 -2
- package/dist/utils/pack-contributions.js +43 -6
- package/dist/utils/package-root-diagnostics.d.ts +1 -1
- package/dist/utils/people.d.ts +11 -7
- package/dist/utils/people.js +20 -5
- package/dist/utils/plan-gate-error.d.ts +10 -52
- package/dist/utils/plan-gate-error.js +41 -364
- package/dist/utils/qmd-model-download-error.d.ts +8 -0
- package/dist/utils/qmd-model-download-error.js +1 -1
- package/dist/utils/qmd-query-document-error.d.ts +6 -0
- package/dist/utils/qmd-query-document-error.js +1 -1
- package/dist/utils/redact-error-text.js +1 -2
- package/dist/utils/run-bundled-script.d.ts +0 -6
- package/dist/utils/run-bundled-script.js +4 -117
- package/dist/utils/secrets-cache.d.ts +3 -7
- package/dist/utils/secrets-cache.js +14 -162
- package/dist/utils/self-update.d.ts +1 -34
- package/dist/utils/self-update.js +42 -660
- package/dist/utils/sentry-fingerprint.d.ts +1 -23
- package/dist/utils/sentry-fingerprint.js +31 -223
- package/dist/utils/team-upgrade.d.ts +1 -1
- package/dist/utils/team-upgrade.js +3 -4
- package/dist/utils/vault-api.d.ts +1 -21
- package/dist/utils/vault-api.js +84 -251
- package/dist/utils/version-check.d.ts +1 -11
- package/dist/utils/version-check.js +3 -32
- package/dist/utils/version-gate.d.ts +17 -101
- package/dist/utils/version-gate.js +70 -645
- package/dist/utils/windows-spawn.d.ts +0 -6
- package/dist/utils/windows-spawn.js +0 -37
- package/package.json +8 -20
- package/README.md +0 -113
- package/assets/bot-workers/setup/context/USER-GUIDE.md +0 -404
- package/assets/bot-workers/setup/context/quick-reference.md +0 -199
- package/assets/bot-workers/setup/skills/agents-and-team.md +0 -167
- package/assets/bot-workers/setup/skills/explain-hq.md +0 -35
- package/assets/bot-workers/setup/skills/first-company.md +0 -74
- package/assets/bot-workers/setup/skills/joining-a-team.md +0 -125
- package/assets/bot-workers/setup/skills/pricing.md +0 -92
- package/assets/bot-workers/setup/skills/standing-help.md +0 -81
- package/assets/bot-workers/setup/skills/your-business.md +0 -281
- package/assets/bot-workers/setup/worker.yaml +0 -791
- package/assets/lanes-hooks/hq-lanes-drain.json +0 -15
- package/assets/lanes-hooks/hq-lanes-drain.mjs +0 -275
- package/assets/lanes-hooks/hq-lanes-drain.sh +0 -21
- package/assets/lanes-reconcile/hq-lanes-reconcile.service +0 -11
- package/assets/lanes-reconcile/hq-lanes-reconcile.timer +0 -12
- package/assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh +0 -485
- package/assets/scaffold/core/scripts/audit-log.sh +0 -384
- package/assets/scaffold/core/scripts/clean-worktree-reconcile-handoff.sh +0 -171
- package/assets/scaffold/core/scripts/eval-trigger.sh +0 -193
- package/assets/scaffold/core/scripts/git-pack-extension-check.sh +0 -164
- package/assets/scaffold/core/scripts/handoff-finalize.sh +0 -688
- package/assets/scaffold/core/scripts/handoff-open-steps.sh +0 -81
- package/assets/scaffold/core/scripts/handoff-post.sh +0 -252
- package/assets/scaffold/core/scripts/hq-delegate-bundle.sh +0 -307
- package/assets/scaffold/core/scripts/hq-delegate-grant.sh +0 -252
- package/assets/scaffold/core/scripts/hq-delegate-pickup.sh +0 -99
- package/assets/scaffold/core/scripts/hq-delegate-publish.sh +0 -91
- package/assets/scaffold/core/scripts/hq-delegate-repo.sh +0 -158
- package/assets/scaffold/core/scripts/hq-delegate-resolve.sh +0 -145
- package/assets/scaffold/core/scripts/hq-delegate-secrets.sh +0 -129
- package/assets/scaffold/core/scripts/hq-delegate-send.sh +0 -259
- package/assets/scaffold/core/scripts/hq-delegate-transfer.sh +0 -175
- package/assets/scaffold/core/scripts/hq-delegate-verify.sh +0 -238
- package/assets/scaffold/core/scripts/hq-dm-bind.sh +0 -585
- package/assets/scaffold/core/scripts/hq-job-notify.sh +0 -389
- package/assets/scaffold/core/scripts/hq-job-probe.sh +0 -835
- package/assets/scaffold/core/scripts/hq-job-remediate.sh +0 -359
- package/assets/scaffold/core/scripts/hq-job-run.sh +0 -1025
- package/assets/scaffold/core/scripts/hq-pin.sh +0 -118
- package/assets/scaffold/core/scripts/jobs-schedule-parse.sh +0 -310
- package/assets/scaffold/core/scripts/jobs-validate.sh +0 -451
- package/assets/scaffold/core/scripts/knowledge-prefs.sh +0 -55
- package/assets/scaffold/core/scripts/lib/portable.sh +0 -211
- package/assets/scaffold/core/scripts/lib/secret-patterns.sh +0 -58
- package/assets/scaffold/core/scripts/ontology-audience-grant.sh +0 -81
- package/assets/scaffold/core/scripts/ontology-brief.mjs +0 -93
- package/assets/scaffold/core/scripts/ontology-candidate.sh +0 -100
- package/assets/scaffold/core/scripts/ontology-garden.mjs +0 -238
- package/assets/scaffold/core/scripts/ontology-source-worklist.sh +0 -79
- package/assets/scaffold/core/scripts/outpost-jobs-reconcile.sh +0 -834
- package/assets/scaffold/core/scripts/policy-age-report.sh +0 -156
- package/assets/scaffold/core/scripts/policy-retire.sh +0 -199
- package/assets/scaffold/core/scripts/qmd-reindex-bg.sh +0 -40
- package/assets/scaffold/core/scripts/read-policy-frontmatter.sh +0 -32
- package/assets/scaffold/core/scripts/refresh-vault-access.sh +0 -188
- package/assets/scaffold/core/scripts/resolve-company.sh +0 -199
- package/assets/scaffold/core/scripts/resume-thread-lock.sh +0 -285
- package/assets/scaffold/core/scripts/source-yaml-validate.sh +0 -36
- package/assets/scaffold/core/scripts/verify-story-deliverables.sh +0 -148
- package/assets/scaffold/core/scripts/work-mesh-live-bind-trusted.sh +0 -152
- package/assets/scaffold/core/scripts/worktree-gc.sh +0 -362
- package/contracts/preflight/v1/fixtures.json +0 -87
- package/contracts/preflight/v1/schema.json +0 -58
- package/dist/command-catalog.generated.d.ts +0 -10655
- package/dist/command-catalog.generated.js +0 -13737
- package/dist/command-registration-plan.d.ts +0 -474
- package/dist/command-registration-plan.js +0 -136
- package/dist/commands/agent-enroll.d.ts +0 -146
- package/dist/commands/agent-enroll.js +0 -401
- package/dist/commands/agent-inbox.d.ts +0 -9
- package/dist/commands/agent-inbox.js +0 -102
- package/dist/commands/agent-kit.d.ts +0 -87
- package/dist/commands/agent-kit.js +0 -480
- package/dist/commands/agent-mcp.d.ts +0 -24
- package/dist/commands/agent-mcp.js +0 -127
- package/dist/commands/agent-probe.d.ts +0 -77
- package/dist/commands/agent-probe.js +0 -335
- package/dist/commands/agent.d.ts +0 -13
- package/dist/commands/agent.js +0 -40
- package/dist/commands/billing-sponsor.d.ts +0 -83
- package/dist/commands/billing-sponsor.js +0 -344
- package/dist/commands/bot-companies.d.ts +0 -40
- package/dist/commands/bot-companies.js +0 -64
- package/dist/commands/bot-continuity.d.ts +0 -28
- package/dist/commands/bot-continuity.js +0 -68
- package/dist/commands/bot-jobs.d.ts +0 -127
- package/dist/commands/bot-jobs.js +0 -454
- package/dist/commands/bot.d.ts +0 -278
- package/dist/commands/bot.js +0 -1982
- package/dist/commands/cloud-retire.d.ts +0 -51
- package/dist/commands/cloud-retire.js +0 -154
- package/dist/commands/core-audit-log-native.d.ts +0 -9
- package/dist/commands/core-audit-log-native.js +0 -257
- package/dist/commands/core-checkpoint-gate-setting.d.ts +0 -59
- package/dist/commands/core-checkpoint-gate-setting.js +0 -163
- package/dist/commands/core-checkpoint-stop-gate-native.d.ts +0 -34
- package/dist/commands/core-checkpoint-stop-gate-native.js +0 -725
- package/dist/commands/core-command-catalog.d.ts +0 -34
- package/dist/commands/core-command-catalog.js +0 -62
- package/dist/commands/core-company-index-scope-flag.d.ts +0 -3
- package/dist/commands/core-company-index-scope-flag.js +0 -6
- package/dist/commands/core-delegate-w1b.d.ts +0 -10
- package/dist/commands/core-delegate-w1b.js +0 -1219
- package/dist/commands/core-delegate.d.ts +0 -46
- package/dist/commands/core-delegate.js +0 -1040
- package/dist/commands/core-dm-bind-native.d.ts +0 -32
- package/dist/commands/core-dm-bind-native.js +0 -668
- package/dist/commands/core-git-pack-extension-check-native.d.ts +0 -22
- package/dist/commands/core-git-pack-extension-check-native.js +0 -190
- package/dist/commands/core-handoff-fast.d.ts +0 -18
- package/dist/commands/core-handoff-fast.js +0 -104
- package/dist/commands/core-handoff-open-steps.d.ts +0 -21
- package/dist/commands/core-handoff-open-steps.js +0 -264
- package/dist/commands/core-handoff.d.ts +0 -24
- package/dist/commands/core-handoff.js +0 -1144
- package/dist/commands/core-hq-session-native.d.ts +0 -39
- package/dist/commands/core-hq-session-native.js +0 -579
- package/dist/commands/core-job-native-utils.d.ts +0 -6
- package/dist/commands/core-job-native-utils.js +0 -80
- package/dist/commands/core-job-native.d.ts +0 -5
- package/dist/commands/core-job-native.js +0 -16
- package/dist/commands/core-job-notify-native.d.ts +0 -36
- package/dist/commands/core-job-notify-native.js +0 -359
- package/dist/commands/core-job-probe-native.d.ts +0 -45
- package/dist/commands/core-job-probe-native.js +0 -564
- package/dist/commands/core-job-remediate-native.d.ts +0 -26
- package/dist/commands/core-job-remediate-native.js +0 -374
- package/dist/commands/core-job-remote-launcher.d.ts +0 -7
- package/dist/commands/core-job-remote-launcher.js +0 -51
- package/dist/commands/core-job-run-native.d.ts +0 -47
- package/dist/commands/core-job-run-native.js +0 -1215
- package/dist/commands/core-jobs-native.d.ts +0 -25
- package/dist/commands/core-jobs-native.js +0 -1339
- package/dist/commands/core-knowledge-prefs.d.ts +0 -12
- package/dist/commands/core-knowledge-prefs.js +0 -137
- package/dist/commands/core-native-handoff-flag.d.ts +0 -4
- package/dist/commands/core-native-handoff-flag.js +0 -7
- package/dist/commands/core-native-jobs-flag.d.ts +0 -4
- package/dist/commands/core-native-jobs-flag.js +0 -7
- package/dist/commands/core-native-policy-flag.d.ts +0 -9
- package/dist/commands/core-native-policy-flag.js +0 -12
- package/dist/commands/core-native-session-flag.d.ts +0 -4
- package/dist/commands/core-native-session-flag.js +0 -7
- package/dist/commands/core-native-utilities-flag.d.ts +0 -4
- package/dist/commands/core-native-utilities-flag.js +0 -7
- package/dist/commands/core-native-utilities.d.ts +0 -29
- package/dist/commands/core-native-utilities.js +0 -54
- package/dist/commands/core-native-worker-skills-flag.d.ts +0 -4
- package/dist/commands/core-native-worker-skills-flag.js +0 -7
- package/dist/commands/core-ontology-native.d.ts +0 -17
- package/dist/commands/core-ontology-native.js +0 -916
- package/dist/commands/core-ontology.d.ts +0 -66
- package/dist/commands/core-ontology.js +0 -430
- package/dist/commands/core-pin-native.d.ts +0 -14
- package/dist/commands/core-pin-native.js +0 -236
- package/dist/commands/core-policy-frontmatter.d.ts +0 -8
- package/dist/commands/core-policy-frontmatter.js +0 -52
- package/dist/commands/core-policy.d.ts +0 -14
- package/dist/commands/core-policy.js +0 -1018
- package/dist/commands/core-refresh-vault-access-native.d.ts +0 -20
- package/dist/commands/core-refresh-vault-access-native.js +0 -229
- package/dist/commands/core-resolve-company-command.d.ts +0 -4
- package/dist/commands/core-resolve-company-command.js +0 -42
- package/dist/commands/core-resolve-company-native.d.ts +0 -28
- package/dist/commands/core-resolve-company-native.js +0 -408
- package/dist/commands/core-work-mesh-bind-trusted-native.d.ts +0 -32
- package/dist/commands/core-work-mesh-bind-trusted-native.js +0 -190
- package/dist/commands/core-worker-lint-native.d.ts +0 -4
- package/dist/commands/core-worker-lint-native.js +0 -160
- package/dist/commands/core-worker-share-native.d.ts +0 -5
- package/dist/commands/core-worker-share-native.js +0 -260
- package/dist/commands/core-worker-skills-command.d.ts +0 -8
- package/dist/commands/core-worker-skills-command.js +0 -33
- package/dist/commands/core-worker-skills-runtime.d.ts +0 -33
- package/dist/commands/core-worker-skills-runtime.js +0 -86
- package/dist/commands/daemon.d.ts +0 -63
- package/dist/commands/daemon.js +0 -877
- package/dist/commands/deploy-comments.d.ts +0 -3
- package/dist/commands/deploy-comments.js +0 -162
- package/dist/commands/lanes-accounts.d.ts +0 -28
- package/dist/commands/lanes-accounts.js +0 -595
- package/dist/commands/lanes-autopilot.d.ts +0 -11
- package/dist/commands/lanes-autopilot.js +0 -336
- package/dist/commands/lanes-checks.d.ts +0 -51
- package/dist/commands/lanes-checks.js +0 -941
- package/dist/commands/lanes-hold.d.ts +0 -43
- package/dist/commands/lanes-hold.js +0 -655
- package/dist/commands/lanes-kpis.d.ts +0 -11
- package/dist/commands/lanes-kpis.js +0 -34
- package/dist/commands/lanes-message.d.ts +0 -9
- package/dist/commands/lanes-message.js +0 -934
- package/dist/commands/lanes-move.d.ts +0 -12
- package/dist/commands/lanes-move.js +0 -397
- package/dist/commands/lanes-questions.d.ts +0 -36
- package/dist/commands/lanes-questions.js +0 -1004
- package/dist/commands/lanes-report.d.ts +0 -11
- package/dist/commands/lanes-report.js +0 -333
- package/dist/commands/lanes-resume.d.ts +0 -6
- package/dist/commands/lanes-resume.js +0 -561
- package/dist/commands/lanes-review.d.ts +0 -10
- package/dist/commands/lanes-review.js +0 -56
- package/dist/commands/lanes-shared.d.ts +0 -448
- package/dist/commands/lanes-shared.js +0 -170
- package/dist/commands/lanes-stories.d.ts +0 -15
- package/dist/commands/lanes-stories.js +0 -347
- package/dist/commands/lanes-watch.d.ts +0 -7
- package/dist/commands/lanes-watch.js +0 -216
- package/dist/commands/lanes.d.ts +0 -149
- package/dist/commands/lanes.js +0 -8843
- package/dist/commands/monitor.d.ts +0 -58
- package/dist/commands/monitor.js +0 -980
- package/dist/commands/onboard-bot-membership.d.ts +0 -32
- package/dist/commands/onboard-bot-membership.js +0 -40
- package/dist/commands/onboard-create-identity.d.ts +0 -26
- package/dist/commands/onboard-create-identity.js +0 -23
- package/dist/commands/outpost-pruner.d.ts +0 -3
- package/dist/commands/outpost-pruner.js +0 -125
- package/dist/commands/personal-connector-settings-flag.d.ts +0 -4
- package/dist/commands/personal-connector-settings-flag.js +0 -7
- package/dist/commands/personal-targeted-push-flag.d.ts +0 -4
- package/dist/commands/personal-targeted-push-flag.js +0 -7
- package/dist/commands/personal-targeted-push-paths.d.ts +0 -3
- package/dist/commands/personal-targeted-push-paths.js +0 -67
- package/dist/commands/report.d.ts +0 -19
- package/dist/commands/report.js +0 -537
- package/dist/commands/run-feature-telemetry.d.ts +0 -3
- package/dist/commands/run-feature-telemetry.js +0 -6
- package/dist/commands/staff/reset-test-account.d.ts +0 -110
- package/dist/commands/staff/reset-test-account.js +0 -268
- package/dist/commands/staff/test-account.d.ts +0 -51
- package/dist/commands/staff/test-account.js +0 -196
- package/dist/commands/vault-retention-flag.d.ts +0 -3
- package/dist/commands/vault-retention-flag.js +0 -9
- package/dist/commands/vault-retention.d.ts +0 -11
- package/dist/commands/vault-retention.js +0 -69
- package/dist/commands/version.d.ts +0 -10
- package/dist/commands/version.js +0 -11
- package/dist/fast-scaffold.d.ts +0 -84
- package/dist/fast-scaffold.js +0 -353
- package/dist/lanes-drain-hook.d.ts +0 -14
- package/dist/lanes-drain-hook.js +0 -203
- package/dist/lib/agent-kit/adopt-identity.d.ts +0 -27
- package/dist/lib/agent-kit/adopt-identity.js +0 -60
- package/dist/lib/agent-kit/attachment-download.d.ts +0 -24
- package/dist/lib/agent-kit/attachment-download.js +0 -47
- package/dist/lib/agent-kit/creds.d.ts +0 -106
- package/dist/lib/agent-kit/creds.js +0 -163
- package/dist/lib/agent-kit/fallback.d.ts +0 -78
- package/dist/lib/agent-kit/fallback.js +0 -210
- package/dist/lib/agent-kit/inbox-state.d.ts +0 -83
- package/dist/lib/agent-kit/inbox-state.js +0 -159
- package/dist/lib/agent-kit/kit-config.d.ts +0 -56
- package/dist/lib/agent-kit/kit-config.js +0 -65
- package/dist/lib/agent-kit/log.d.ts +0 -16
- package/dist/lib/agent-kit/log.js +0 -46
- package/dist/lib/agent-kit/mcp/attachments.d.ts +0 -126
- package/dist/lib/agent-kit/mcp/attachments.js +0 -222
- package/dist/lib/agent-kit/mcp/jsonrpc.d.ts +0 -75
- package/dist/lib/agent-kit/mcp/jsonrpc.js +0 -164
- package/dist/lib/agent-kit/mcp/tools.d.ts +0 -64
- package/dist/lib/agent-kit/mcp/tools.js +0 -397
- package/dist/lib/agent-kit/paths.d.ts +0 -65
- package/dist/lib/agent-kit/paths.js +0 -118
- package/dist/lib/agent-kit/private-file.d.ts +0 -29
- package/dist/lib/agent-kit/private-file.js +0 -91
- package/dist/lib/agent-kit/run/heartbeat.d.ts +0 -72
- package/dist/lib/agent-kit/run/heartbeat.js +0 -128
- package/dist/lib/agent-kit/run/inbox.d.ts +0 -76
- package/dist/lib/agent-kit/run/inbox.js +0 -205
- package/dist/lib/agent-kit/run/supervisor.d.ts +0 -35
- package/dist/lib/agent-kit/run/supervisor.js +0 -85
- package/dist/lib/agent-kit/run/sync.d.ts +0 -33
- package/dist/lib/agent-kit/run/sync.js +0 -58
- package/dist/lib/agent-kit/services.d.ts +0 -31
- package/dist/lib/agent-kit/services.js +0 -55
- package/dist/lib/agent-kit/skills.d.ts +0 -18
- package/dist/lib/agent-kit/skills.js +0 -151
- package/dist/lib/agent-kit/wake.d.ts +0 -83
- package/dist/lib/agent-kit/wake.js +0 -243
- package/dist/lib/agents/model-catalog.d.ts +0 -62
- package/dist/lib/agents/model-catalog.js +0 -275
- package/dist/lib/auth-login-provider-state.d.ts +0 -8
- package/dist/lib/auth-login-provider-state.js +0 -63
- package/dist/lib/aws-sdk-node-warning-output.d.ts +0 -12
- package/dist/lib/aws-sdk-node-warning-output.js +0 -22
- package/dist/lib/billing/free-month.d.ts +0 -18
- package/dist/lib/billing/free-month.js +0 -31
- package/dist/lib/billing/plan-limit-refusals.d.ts +0 -69
- package/dist/lib/billing/plan-limit-refusals.js +0 -187
- package/dist/lib/billing/plan-limit-upgrade-url.d.ts +0 -11
- package/dist/lib/billing/plan-limit-upgrade-url.js +0 -66
- package/dist/lib/billing/plan-lock.d.ts +0 -143
- package/dist/lib/billing/plan-lock.js +0 -439
- package/dist/lib/bot/api.d.ts +0 -349
- package/dist/lib/bot/api.js +0 -316
- package/dist/lib/bot/attachments.d.ts +0 -45
- package/dist/lib/bot/attachments.js +0 -89
- package/dist/lib/bot/cli-update.d.ts +0 -138
- package/dist/lib/bot/cli-update.js +0 -278
- package/dist/lib/bot/company-bind.d.ts +0 -27
- package/dist/lib/bot/company-bind.js +0 -62
- package/dist/lib/bot/config.d.ts +0 -153
- package/dist/lib/bot/config.js +0 -233
- package/dist/lib/bot/continuity-download.d.ts +0 -28
- package/dist/lib/bot/continuity-download.js +0 -75
- package/dist/lib/bot/continuity-install.d.ts +0 -14
- package/dist/lib/bot/continuity-install.js +0 -101
- package/dist/lib/bot/continuity.d.ts +0 -67
- package/dist/lib/bot/continuity.js +0 -301
- package/dist/lib/bot/creds.d.ts +0 -24
- package/dist/lib/bot/creds.js +0 -51
- package/dist/lib/bot/daemon.d.ts +0 -173
- package/dist/lib/bot/daemon.js +0 -552
- package/dist/lib/bot/inbox-poll-backoff-flag.d.ts +0 -24
- package/dist/lib/bot/inbox-poll-backoff-flag.js +0 -135
- package/dist/lib/bot/inbox-state.d.ts +0 -18
- package/dist/lib/bot/inbox-state.js +0 -51
- package/dist/lib/bot/index.d.ts +0 -23
- package/dist/lib/bot/index.js +0 -23
- package/dist/lib/bot/inflight.d.ts +0 -119
- package/dist/lib/bot/inflight.js +0 -83
- package/dist/lib/bot/job-completions.d.ts +0 -89
- package/dist/lib/bot/job-completions.js +0 -132
- package/dist/lib/bot/job-run.d.ts +0 -109
- package/dist/lib/bot/job-run.js +0 -246
- package/dist/lib/bot/local-config.d.ts +0 -61
- package/dist/lib/bot/local-config.js +0 -145
- package/dist/lib/bot/local-jobs.d.ts +0 -89
- package/dist/lib/bot/local-jobs.js +0 -459
- package/dist/lib/bot/local-name.d.ts +0 -54
- package/dist/lib/bot/local-name.js +0 -114
- package/dist/lib/bot/log.d.ts +0 -13
- package/dist/lib/bot/log.js +0 -59
- package/dist/lib/bot/owner-context.d.ts +0 -79
- package/dist/lib/bot/owner-context.js +0 -175
- package/dist/lib/bot/paths.d.ts +0 -76
- package/dist/lib/bot/paths.js +0 -131
- package/dist/lib/bot/progress.d.ts +0 -132
- package/dist/lib/bot/progress.js +0 -289
- package/dist/lib/bot/promote.d.ts +0 -16
- package/dist/lib/bot/promote.js +0 -106
- package/dist/lib/bot/promotion-hold.d.ts +0 -24
- package/dist/lib/bot/promotion-hold.js +0 -103
- package/dist/lib/bot/promotion-receipt.d.ts +0 -9
- package/dist/lib/bot/promotion-receipt.js +0 -56
- package/dist/lib/bot/promotion-upload.d.ts +0 -16
- package/dist/lib/bot/promotion-upload.js +0 -80
- package/dist/lib/bot/prompt.d.ts +0 -136
- package/dist/lib/bot/prompt.js +0 -433
- package/dist/lib/bot/room-policy.d.ts +0 -63
- package/dist/lib/bot/room-policy.js +0 -91
- package/dist/lib/bot/run.d.ts +0 -217
- package/dist/lib/bot/run.js +0 -1869
- package/dist/lib/bot/runnable.d.ts +0 -51
- package/dist/lib/bot/runnable.js +0 -65
- package/dist/lib/bot/runtime/claude.d.ts +0 -50
- package/dist/lib/bot/runtime/claude.js +0 -170
- package/dist/lib/bot/runtime/codex.d.ts +0 -28
- package/dist/lib/bot/runtime/codex.js +0 -153
- package/dist/lib/bot/runtime/grok-acp.d.ts +0 -40
- package/dist/lib/bot/runtime/grok-acp.js +0 -265
- package/dist/lib/bot/runtime/grok.d.ts +0 -41
- package/dist/lib/bot/runtime/grok.js +0 -169
- package/dist/lib/bot/runtime/index.d.ts +0 -36
- package/dist/lib/bot/runtime/index.js +0 -417
- package/dist/lib/bot/runtime/messages-stream.d.ts +0 -56
- package/dist/lib/bot/runtime/messages-stream.js +0 -194
- package/dist/lib/bot/runtime/sanitize.d.ts +0 -18
- package/dist/lib/bot/runtime/sanitize.js +0 -28
- package/dist/lib/bot/runtime/types.d.ts +0 -159
- package/dist/lib/bot/runtime/types.js +0 -51
- package/dist/lib/bot/runtime/windows.d.ts +0 -10
- package/dist/lib/bot/runtime/windows.js +0 -53
- package/dist/lib/bot/runtime-sign-in.d.ts +0 -24
- package/dist/lib/bot/runtime-sign-in.js +0 -31
- package/dist/lib/bot/scaffold.d.ts +0 -38
- package/dist/lib/bot/scaffold.js +0 -94
- package/dist/lib/bot/self-heal.d.ts +0 -52
- package/dist/lib/bot/self-heal.js +0 -79
- package/dist/lib/bot/self-process.d.ts +0 -19
- package/dist/lib/bot/self-process.js +0 -35
- package/dist/lib/bot/session.d.ts +0 -19
- package/dist/lib/bot/session.js +0 -39
- package/dist/lib/bot/setup-explain.d.ts +0 -64
- package/dist/lib/bot/setup-explain.js +0 -141
- package/dist/lib/bot/split.d.ts +0 -32
- package/dist/lib/bot/split.js +0 -241
- package/dist/lib/bot/status.d.ts +0 -57
- package/dist/lib/bot/status.js +0 -66
- package/dist/lib/bot/worker-source.d.ts +0 -66
- package/dist/lib/bot/worker-source.js +0 -283
- package/dist/lib/checkpoint-ontology/aliases.d.ts +0 -17
- package/dist/lib/checkpoint-ontology/aliases.js +0 -44
- package/dist/lib/checkpoint-ontology/apply.d.ts +0 -110
- package/dist/lib/checkpoint-ontology/apply.js +0 -777
- package/dist/lib/checkpoint-ontology/company-brief.d.ts +0 -18
- package/dist/lib/checkpoint-ontology/company-brief.js +0 -337
- package/dist/lib/checkpoint-ontology/company.d.ts +0 -44
- package/dist/lib/checkpoint-ontology/company.js +0 -118
- package/dist/lib/checkpoint-ontology/drop-aliases.d.ts +0 -41
- package/dist/lib/checkpoint-ontology/drop-aliases.js +0 -76
- package/dist/lib/checkpoint-ontology/entity-file.d.ts +0 -109
- package/dist/lib/checkpoint-ontology/entity-file.js +0 -371
- package/dist/lib/checkpoint-ontology/identity.d.ts +0 -38
- package/dist/lib/checkpoint-ontology/identity.js +0 -95
- package/dist/lib/checkpoint-ontology/merge-copies.d.ts +0 -199
- package/dist/lib/checkpoint-ontology/merge-copies.js +0 -1086
- package/dist/lib/checkpoint-ontology/multi-writer.d.ts +0 -101
- package/dist/lib/checkpoint-ontology/multi-writer.js +0 -394
- package/dist/lib/checkpoint-ontology/plan.d.ts +0 -193
- package/dist/lib/checkpoint-ontology/plan.js +0 -504
- package/dist/lib/checkpoint-ontology/queued-touches.d.ts +0 -29
- package/dist/lib/checkpoint-ontology/queued-touches.js +0 -193
- package/dist/lib/checkpoint-ontology/sync-client.d.ts +0 -38
- package/dist/lib/checkpoint-ontology/sync-client.js +0 -84
- package/dist/lib/checkpoint-ontology/tree.d.ts +0 -55
- package/dist/lib/checkpoint-ontology/tree.js +0 -198
- package/dist/lib/company-errors-sdk-warning-flag.d.ts +0 -5
- package/dist/lib/company-errors-sdk-warning-flag.js +0 -8
- package/dist/lib/core-utils/hook-timeout-debug-context-flag.d.ts +0 -20
- package/dist/lib/core-utils/hook-timeout-debug-context-flag.js +0 -81
- package/dist/lib/core-utils/jq-json-serializer.d.ts +0 -5
- package/dist/lib/core-utils/jq-json-serializer.js +0 -10
- package/dist/lib/core-utils/secret-patterns.d.ts +0 -43
- package/dist/lib/core-utils/secret-patterns.js +0 -34
- package/dist/lib/core-utils/sentry-report.d.ts +0 -114
- package/dist/lib/core-utils/sentry-report.js +0 -1034
- package/dist/lib/core-utils/timeout-guard-native.d.ts +0 -7
- package/dist/lib/core-utils/timeout-guard-native.js +0 -40
- package/dist/lib/core-utils/worktree-resume.d.ts +0 -20
- package/dist/lib/core-utils/worktree-resume.js +0 -1198
- package/dist/lib/daemon/catalog.d.ts +0 -134
- package/dist/lib/daemon/catalog.js +0 -358
- package/dist/lib/daemon/config.d.ts +0 -35
- package/dist/lib/daemon/config.js +0 -108
- package/dist/lib/daemon/flag.d.ts +0 -25
- package/dist/lib/daemon/flag.js +0 -59
- package/dist/lib/daemon/handoff.d.ts +0 -56
- package/dist/lib/daemon/handoff.js +0 -161
- package/dist/lib/daemon/hq-cloud.d.ts +0 -79
- package/dist/lib/daemon/hq-cloud.js +0 -183
- package/dist/lib/daemon/install.d.ts +0 -85
- package/dist/lib/daemon/install.js +0 -320
- package/dist/lib/daemon/legacy-sync-env.d.ts +0 -10
- package/dist/lib/daemon/legacy-sync-env.js +0 -58
- package/dist/lib/daemon/legacy.d.ts +0 -45
- package/dist/lib/daemon/legacy.js +0 -133
- package/dist/lib/daemon/lock.d.ts +0 -47
- package/dist/lib/daemon/lock.js +0 -138
- package/dist/lib/daemon/machine-type.d.ts +0 -50
- package/dist/lib/daemon/machine-type.js +0 -159
- package/dist/lib/daemon/migrate.d.ts +0 -77
- package/dist/lib/daemon/migrate.js +0 -265
- package/dist/lib/daemon/paths.d.ts +0 -24
- package/dist/lib/daemon/paths.js +0 -43
- package/dist/lib/daemon/protocol-tail.d.ts +0 -33
- package/dist/lib/daemon/protocol-tail.js +0 -131
- package/dist/lib/daemon/remote-control.d.ts +0 -74
- package/dist/lib/daemon/remote-control.js +0 -153
- package/dist/lib/daemon/requests.d.ts +0 -28
- package/dist/lib/daemon/requests.js +0 -65
- package/dist/lib/daemon/run.d.ts +0 -79
- package/dist/lib/daemon/run.js +0 -755
- package/dist/lib/daemon/succession.d.ts +0 -118
- package/dist/lib/daemon/succession.js +0 -263
- package/dist/lib/daemon/supervisor.d.ts +0 -132
- package/dist/lib/daemon/supervisor.js +0 -836
- package/dist/lib/daemon/sync-runner.d.ts +0 -58
- package/dist/lib/daemon/sync-runner.js +0 -277
- package/dist/lib/daemon/tools.d.ts +0 -52
- package/dist/lib/daemon/tools.js +0 -95
- package/dist/lib/daemon/updater.d.ts +0 -57
- package/dist/lib/daemon/updater.js +0 -163
- package/dist/lib/deploy-api.d.ts +0 -5
- package/dist/lib/deploy-api.js +0 -21
- package/dist/lib/deploy-apps.d.ts +0 -13
- package/dist/lib/deploy-apps.js +0 -29
- package/dist/lib/doctor/__testing__/run-doctor.d.ts +0 -8
- package/dist/lib/doctor/__testing__/run-doctor.js +0 -52
- package/dist/lib/doctor/checks/bots.d.ts +0 -13
- package/dist/lib/doctor/checks/bots.js +0 -189
- package/dist/lib/doctor/checks/scaffold-cli-floor.d.ts +0 -6
- package/dist/lib/doctor/checks/scaffold-cli-floor.js +0 -73
- package/dist/lib/doctor/checks/sync-runtime.d.ts +0 -11
- package/dist/lib/doctor/checks/sync-runtime.js +0 -216
- package/dist/lib/doctor/client-health-flag-token.d.ts +0 -15
- package/dist/lib/doctor/client-health-flag-token.js +0 -66
- package/dist/lib/doctor/client-health-reason-codes-flag.d.ts +0 -27
- package/dist/lib/doctor/client-health-reason-codes-flag.js +0 -106
- package/dist/lib/doctor/fix/json-output.d.ts +0 -28
- package/dist/lib/doctor/fix/json-output.js +0 -33
- package/dist/lib/doctor/fix/refresh-sync-outcome.d.ts +0 -12
- package/dist/lib/doctor/fix/refresh-sync-outcome.js +0 -25
- package/dist/lib/doctor/shared.d.ts +0 -8
- package/dist/lib/doctor/shared.js +0 -38
- package/dist/lib/doctor/stray-gate-entries.d.ts +0 -35
- package/dist/lib/doctor/stray-gate-entries.js +0 -83
- package/dist/lib/first-sync-next-step.d.ts +0 -37
- package/dist/lib/first-sync-next-step.js +0 -189
- package/dist/lib/flag-registry-endpoint.d.ts +0 -5
- package/dist/lib/flag-registry-endpoint.js +0 -9
- package/dist/lib/flag-registry-worker-source.generated.d.ts +0 -2
- package/dist/lib/flag-registry-worker-source.generated.js +0 -3
- package/dist/lib/flag-snapshot-file.d.ts +0 -20
- package/dist/lib/flag-snapshot-file.js +0 -91
- package/dist/lib/heartbeat-identity.d.ts +0 -30
- package/dist/lib/heartbeat-identity.js +0 -76
- package/dist/lib/lanes/account-home.d.ts +0 -8
- package/dist/lib/lanes/account-home.js +0 -10
- package/dist/lib/lanes/accounts.d.ts +0 -117
- package/dist/lib/lanes/accounts.js +0 -366
- package/dist/lib/lanes/admission-host.d.ts +0 -22
- package/dist/lib/lanes/admission-host.js +0 -37
- package/dist/lib/lanes/admission.d.ts +0 -26
- package/dist/lib/lanes/admission.js +0 -210
- package/dist/lib/lanes/approval-gate.d.ts +0 -8
- package/dist/lib/lanes/approval-gate.js +0 -90
- package/dist/lib/lanes/autopilot-metrics.d.ts +0 -99
- package/dist/lib/lanes/autopilot-metrics.js +0 -301
- package/dist/lib/lanes/autopilot-registry.d.ts +0 -62
- package/dist/lib/lanes/autopilot-registry.js +0 -192
- package/dist/lib/lanes/autopilot.d.ts +0 -120
- package/dist/lib/lanes/autopilot.js +0 -1061
- package/dist/lib/lanes/blocker-freshness.d.ts +0 -31
- package/dist/lib/lanes/blocker-freshness.js +0 -168
- package/dist/lib/lanes/checked-company-path.d.ts +0 -3
- package/dist/lib/lanes/checked-company-path.js +0 -39
- package/dist/lib/lanes/claude-balance.d.ts +0 -97
- package/dist/lib/lanes/claude-balance.js +0 -319
- package/dist/lib/lanes/compaction.d.ts +0 -110
- package/dist/lib/lanes/compaction.js +0 -293
- package/dist/lib/lanes/config.d.ts +0 -91
- package/dist/lib/lanes/config.js +0 -592
- package/dist/lib/lanes/constants.d.ts +0 -3
- package/dist/lib/lanes/constants.js +0 -3
- package/dist/lib/lanes/delivery-core.d.ts +0 -15
- package/dist/lib/lanes/delivery-core.js +0 -21
- package/dist/lib/lanes/delivery.d.ts +0 -180
- package/dist/lib/lanes/delivery.js +0 -443
- package/dist/lib/lanes/dropbox.d.ts +0 -129
- package/dist/lib/lanes/dropbox.js +0 -601
- package/dist/lib/lanes/effort.d.ts +0 -51
- package/dist/lib/lanes/effort.js +0 -113
- package/dist/lib/lanes/envelope-repair-dispatch.d.ts +0 -26
- package/dist/lib/lanes/envelope-repair-dispatch.js +0 -74
- package/dist/lib/lanes/errors.d.ts +0 -39
- package/dist/lib/lanes/errors.js +0 -72
- package/dist/lib/lanes/flag-keys.d.ts +0 -13
- package/dist/lib/lanes/flag-keys.js +0 -13
- package/dist/lib/lanes/grants.d.ts +0 -29
- package/dist/lib/lanes/grants.js +0 -166
- package/dist/lib/lanes/hire-grant-dispatch.d.ts +0 -29
- package/dist/lib/lanes/hire-grant-dispatch.js +0 -316
- package/dist/lib/lanes/hooks-install.d.ts +0 -82
- package/dist/lib/lanes/hooks-install.js +0 -479
- package/dist/lib/lanes/host-capacity.d.ts +0 -69
- package/dist/lib/lanes/host-capacity.js +0 -254
- package/dist/lib/lanes/hq-root.d.ts +0 -19
- package/dist/lib/lanes/hq-root.js +0 -28
- package/dist/lib/lanes/index.d.ts +0 -76
- package/dist/lib/lanes/index.js +0 -42
- package/dist/lib/lanes/keep-alive.d.ts +0 -68
- package/dist/lib/lanes/keep-alive.js +0 -343
- package/dist/lib/lanes/kr-freshness.d.ts +0 -76
- package/dist/lib/lanes/kr-freshness.js +0 -413
- package/dist/lib/lanes/lane-company.d.ts +0 -10
- package/dist/lib/lanes/lane-company.js +0 -41
- package/dist/lib/lanes/liveness.d.ts +0 -108
- package/dist/lib/lanes/liveness.js +0 -396
- package/dist/lib/lanes/machine-identity.d.ts +0 -34
- package/dist/lib/lanes/machine-identity.js +0 -92
- package/dist/lib/lanes/manager-status-gate.d.ts +0 -17
- package/dist/lib/lanes/manager-status-gate.js +0 -133
- package/dist/lib/lanes/merge-command.d.ts +0 -15
- package/dist/lib/lanes/merge-command.js +0 -629
- package/dist/lib/lanes/mesh-events.d.ts +0 -127
- package/dist/lib/lanes/mesh-events.js +0 -564
- package/dist/lib/lanes/message-replay.d.ts +0 -21
- package/dist/lib/lanes/message-replay.js +0 -122
- package/dist/lib/lanes/models.d.ts +0 -86
- package/dist/lib/lanes/models.js +0 -234
- package/dist/lib/lanes/monitor.d.ts +0 -48
- package/dist/lib/lanes/monitor.js +0 -428
- package/dist/lib/lanes/move-account.d.ts +0 -56
- package/dist/lib/lanes/move-account.js +0 -193
- package/dist/lib/lanes/orphans.d.ts +0 -25
- package/dist/lib/lanes/orphans.js +0 -102
- package/dist/lib/lanes/outpost-dispatch.d.ts +0 -147
- package/dist/lib/lanes/outpost-dispatch.js +0 -271
- package/dist/lib/lanes/outpost-hire-cache.d.ts +0 -22
- package/dist/lib/lanes/outpost-hire-cache.js +0 -153
- package/dist/lib/lanes/outpost-identity.d.ts +0 -33
- package/dist/lib/lanes/outpost-identity.js +0 -59
- package/dist/lib/lanes/outpost-profile-repin.d.ts +0 -17
- package/dist/lib/lanes/outpost-profile-repin.js +0 -84
- package/dist/lib/lanes/outpost-pruner-install.d.ts +0 -37
- package/dist/lib/lanes/outpost-pruner-install.js +0 -238
- package/dist/lib/lanes/outpost-registry-worker-approval.d.ts +0 -18
- package/dist/lib/lanes/outpost-registry-worker-approval.js +0 -109
- package/dist/lib/lanes/outpost-snapshot-memo.d.ts +0 -6
- package/dist/lib/lanes/outpost-snapshot-memo.js +0 -14
- package/dist/lib/lanes/outpost-worktree-pruner-flag.d.ts +0 -19
- package/dist/lib/lanes/outpost-worktree-pruner-flag.js +0 -86
- package/dist/lib/lanes/outpost-worktree-pruner.d.ts +0 -62
- package/dist/lib/lanes/outpost-worktree-pruner.js +0 -1201
- package/dist/lib/lanes/profile.d.ts +0 -69
- package/dist/lib/lanes/profile.js +0 -552
- package/dist/lib/lanes/provider-rejection.d.ts +0 -86
- package/dist/lib/lanes/provider-rejection.js +0 -286
- package/dist/lib/lanes/questions.d.ts +0 -90
- package/dist/lib/lanes/questions.js +0 -384
- package/dist/lib/lanes/quota.d.ts +0 -134
- package/dist/lib/lanes/quota.js +0 -471
- package/dist/lib/lanes/reconcile-install.d.ts +0 -90
- package/dist/lib/lanes/reconcile-install.js +0 -257
- package/dist/lib/lanes/reconcile.d.ts +0 -155
- package/dist/lib/lanes/reconcile.js +0 -3193
- package/dist/lib/lanes/registry-flag.d.ts +0 -29
- package/dist/lib/lanes/registry-flag.js +0 -139
- package/dist/lib/lanes/registry-persona.d.ts +0 -20
- package/dist/lib/lanes/registry-persona.js +0 -329
- package/dist/lib/lanes/registry.d.ts +0 -122
- package/dist/lib/lanes/registry.js +0 -570
- package/dist/lib/lanes/reviews.d.ts +0 -38
- package/dist/lib/lanes/reviews.js +0 -395
- package/dist/lib/lanes/runaway-tool-guard.d.ts +0 -38
- package/dist/lib/lanes/runaway-tool-guard.js +0 -284
- package/dist/lib/lanes/session-relink.d.ts +0 -25
- package/dist/lib/lanes/session-relink.js +0 -216
- package/dist/lib/lanes/spawn.d.ts +0 -350
- package/dist/lib/lanes/spawn.js +0 -2643
- package/dist/lib/lanes/ssm-command-context.d.ts +0 -12
- package/dist/lib/lanes/ssm-command-context.js +0 -52
- package/dist/lib/lanes/store.d.ts +0 -91
- package/dist/lib/lanes/store.js +0 -1811
- package/dist/lib/lanes/stories.d.ts +0 -23
- package/dist/lib/lanes/stories.js +0 -92
- package/dist/lib/lanes/story-ledger.d.ts +0 -80
- package/dist/lib/lanes/story-ledger.js +0 -815
- package/dist/lib/lanes/story-switch.d.ts +0 -21
- package/dist/lib/lanes/story-switch.js +0 -75
- package/dist/lib/lanes/text-scan.d.ts +0 -11
- package/dist/lib/lanes/text-scan.js +0 -103
- package/dist/lib/lanes/throttle.d.ts +0 -116
- package/dist/lib/lanes/throttle.js +0 -437
- package/dist/lib/lanes/timestamp.d.ts +0 -3
- package/dist/lib/lanes/timestamp.js +0 -26
- package/dist/lib/lanes/tracker-checks.d.ts +0 -77
- package/dist/lib/lanes/tracker-checks.js +0 -134
- package/dist/lib/lanes/tracker-report-state.d.ts +0 -10
- package/dist/lib/lanes/tracker-report-state.js +0 -124
- package/dist/lib/lanes/tracker-report.d.ts +0 -203
- package/dist/lib/lanes/tracker-report.js +0 -522
- package/dist/lib/lanes/tracker-store.d.ts +0 -18
- package/dist/lib/lanes/tracker-store.js +0 -106
- package/dist/lib/lanes/types.d.ts +0 -1020
- package/dist/lib/lanes/types.js +0 -417
- package/dist/lib/lanes/wait.d.ts +0 -39
- package/dist/lib/lanes/wait.js +0 -159
- package/dist/lib/lanes/watch.d.ts +0 -39
- package/dist/lib/lanes/watch.js +0 -249
- package/dist/lib/lanes/watcher-main.d.ts +0 -11
- package/dist/lib/lanes/watcher-main.js +0 -108
- package/dist/lib/lanes/watcher.d.ts +0 -287
- package/dist/lib/lanes/watcher.js +0 -1972
- package/dist/lib/mesh/live/daemon/config.d.ts +0 -36
- package/dist/lib/mesh/live/daemon/config.js +0 -120
- package/dist/lib/mesh/live/daemon/legacy-listen.d.ts +0 -43
- package/dist/lib/mesh/live/daemon/legacy-listen.js +0 -89
- package/dist/lib/mesh/live/daemon/live-cache.d.ts +0 -26
- package/dist/lib/mesh/live/daemon/live-cache.js +0 -116
- package/dist/lib/mesh/live/daemon/mqtt-events.d.ts +0 -7
- package/dist/lib/mesh/live/daemon/mqtt-events.js +0 -2
- package/dist/lib/mesh/live/daemon/mqtt-events.test-d.d.ts +0 -2
- package/dist/lib/mesh/live/daemon/mqtt-events.test-d.js +0 -10
- package/dist/lib/mesh/live/daemon/version-drift.d.ts +0 -5
- package/dist/lib/mesh/live/daemon/version-drift.js +0 -47
- package/dist/lib/mesh/live/daemon/work-subscribe.d.ts +0 -32
- package/dist/lib/mesh/live/daemon/work-subscribe.js +0 -262
- package/dist/lib/mesh/live/report-summary.d.ts +0 -45
- package/dist/lib/mesh/live/report-summary.js +0 -234
- package/dist/lib/mesh/live/session-seq.d.ts +0 -4
- package/dist/lib/mesh/live/session-seq.js +0 -33
- package/dist/lib/mesh/project-board.d.ts +0 -65
- package/dist/lib/mesh/project-board.js +0 -181
- package/dist/lib/mesh/story-status.d.ts +0 -22
- package/dist/lib/mesh/story-status.js +0 -49
- package/dist/lib/monitor.d.ts +0 -149
- package/dist/lib/monitor.js +0 -519
- package/dist/lib/node-binary.d.ts +0 -50
- package/dist/lib/node-binary.js +0 -133
- package/dist/lib/notify-recipient.d.ts +0 -7
- package/dist/lib/notify-recipient.js +0 -11
- package/dist/lib/onboarding/checkpoint.d.ts +0 -13
- package/dist/lib/onboarding/checkpoint.js +0 -44
- package/dist/lib/onboarding/cli/onboard.d.ts +0 -53
- package/dist/lib/onboarding/cli/onboard.js +0 -135
- package/dist/lib/onboarding/cli/prompts.d.ts +0 -28
- package/dist/lib/onboarding/cli/prompts.js +0 -83
- package/dist/lib/onboarding/errors.d.ts +0 -34
- package/dist/lib/onboarding/errors.js +0 -59
- package/dist/lib/onboarding/index.d.ts +0 -13
- package/dist/lib/onboarding/index.js +0 -13
- package/dist/lib/onboarding/orchestrator.d.ts +0 -47
- package/dist/lib/onboarding/orchestrator.js +0 -569
- package/dist/lib/onboarding/types.d.ts +0 -79
- package/dist/lib/onboarding/types.js +0 -8
- package/dist/lib/policy-validator.d.ts +0 -7
- package/dist/lib/policy-validator.js +0 -187
- package/dist/lib/process-flag-company-context.d.ts +0 -8
- package/dist/lib/process-flag-company-context.js +0 -67
- package/dist/lib/report-publish.d.ts +0 -175
- package/dist/lib/report-publish.js +0 -421
- package/dist/lib/report-run.d.ts +0 -62
- package/dist/lib/report-run.js +0 -123
- package/dist/lib/report-snapshot.d.ts +0 -12
- package/dist/lib/report-snapshot.js +0 -135
- package/dist/lib/report-templates.d.ts +0 -9
- package/dist/lib/report-templates.js +0 -21
- package/dist/lib/scaffold-cli-floor.d.ts +0 -8
- package/dist/lib/scaffold-cli-floor.js +0 -50
- package/dist/lib/search-index/collection-path-repair-flag.d.ts +0 -4
- package/dist/lib/search-index/collection-path-repair-flag.js +0 -7
- package/dist/lib/search-index/embed-lock.d.ts +0 -32
- package/dist/lib/search-index/embed-lock.js +0 -286
- package/dist/lib/search-index/load-gate.d.ts +0 -57
- package/dist/lib/search-index/load-gate.js +0 -270
- package/dist/lib/search-index/max-doc-bytes.d.ts +0 -219
- package/dist/lib/search-index/max-doc-bytes.js +0 -463
- package/dist/lib/search-index/qmd-exit-diagnostics.d.ts +0 -5
- package/dist/lib/search-index/qmd-exit-diagnostics.js +0 -40
- package/dist/lib/search-index/reindex-single-flight-flag.d.ts +0 -5
- package/dist/lib/search-index/reindex-single-flight-flag.js +0 -8
- package/dist/lib/service-manager/index.d.ts +0 -42
- package/dist/lib/service-manager/index.js +0 -105
- package/dist/lib/service-manager/launchd.d.ts +0 -81
- package/dist/lib/service-manager/launchd.js +0 -212
- package/dist/lib/service-manager/systemd.d.ts +0 -19
- package/dist/lib/service-manager/systemd.js +0 -72
- package/dist/lib/service-manager/types.d.ts +0 -34
- package/dist/lib/service-manager/types.js +0 -26
- package/dist/lib/test-utils/isolated-flag-company-context.d.ts +0 -3
- package/dist/lib/test-utils/isolated-flag-company-context.js +0 -18
- package/dist/lib/work-context/bind-best.d.ts +0 -66
- package/dist/lib/work-context/bind-best.js +0 -344
- package/dist/lib/work-context/bind-calling-session.d.ts +0 -26
- package/dist/lib/work-context/bind-calling-session.js +0 -63
- package/dist/lib/work-context/company-rebind.d.ts +0 -23
- package/dist/lib/work-context/company-rebind.js +0 -59
- package/dist/lib/work-context/default-company.d.ts +0 -43
- package/dist/lib/work-context/default-company.js +0 -83
- package/dist/lib/work-context/outbox-quarantine-status-flag.d.ts +0 -4
- package/dist/lib/work-context/outbox-quarantine-status-flag.js +0 -7
- package/dist/lib/work-context/prd-sync.d.ts +0 -56
- package/dist/lib/work-context/prd-sync.js +0 -197
- package/dist/lib/work-context/preflight-contract.d.ts +0 -28
- package/dist/lib/work-context/preflight-contract.js +0 -85
- package/dist/lib/work-context/prompt-rebind.d.ts +0 -25
- package/dist/lib/work-context/prompt-rebind.js +0 -85
- package/dist/lib/work-context/windows-acl.d.ts +0 -123
- package/dist/lib/work-context/windows-acl.js +0 -425
- package/dist/lib/workers-registry/read.d.ts +0 -15
- package/dist/lib/workers-registry/read.js +0 -17
- package/dist/native-fast-route.d.ts +0 -7
- package/dist/native-fast-route.js +0 -45
- package/dist/node-network-compat-core.d.ts +0 -12
- package/dist/node-network-compat-core.js +0 -41
- package/dist/node-network-compat-fast.d.ts +0 -7
- package/dist/node-network-compat-fast.js +0 -23
- package/dist/secrets-env-fast-path.d.ts +0 -5
- package/dist/secrets-env-fast-path.js +0 -16
- package/dist/secrets-env-fast-route.d.ts +0 -18
- package/dist/secrets-env-fast-route.js +0 -54
- package/dist/utils/checkpoint-stamp-write-error.d.ts +0 -28
- package/dist/utils/checkpoint-stamp-write-error.js +0 -99
- package/dist/utils/cli-network-lifecycle.d.ts +0 -4
- package/dist/utils/cli-network-lifecycle.js +0 -11
- package/dist/utils/cognito-refresh-sentry.d.ts +0 -3
- package/dist/utils/cognito-refresh-sentry.js +0 -49
- package/dist/utils/console-origin.d.ts +0 -9
- package/dist/utils/console-origin.js +0 -28
- package/dist/utils/exclusive-lock.d.ts +0 -32
- package/dist/utils/exclusive-lock.js +0 -75
- package/dist/utils/fast-stream-errors.d.ts +0 -12
- package/dist/utils/fast-stream-errors.js +0 -18
- package/dist/utils/files-browse-acl.d.ts +0 -5
- package/dist/utils/files-browse-acl.js +0 -11
- package/dist/utils/hq-core-yaml.d.ts +0 -10
- package/dist/utils/hq-core-yaml.js +0 -40
- package/dist/utils/hq-root-resolver.d.ts +0 -13
- package/dist/utils/hq-root-resolver.js +0 -103
- package/dist/utils/redact-url.d.ts +0 -14
- package/dist/utils/redact-url.js +0 -218
- package/dist/utils/scaffold-fast-import-guard.d.ts +0 -2
- package/dist/utils/scaffold-fast-import-guard.js +0 -40
- package/dist/utils/scaffold-packlist-guard.d.ts +0 -7
- package/dist/utils/scaffold-packlist-guard.js +0 -23
- package/dist/utils/scaffold-sibling-references.d.ts +0 -22
- package/dist/utils/scaffold-sibling-references.js +0 -156
- package/dist/utils/secret-load-availability.d.ts +0 -8
- package/dist/utils/secret-load-availability.js +0 -54
- package/dist/utils/staged-install.d.ts +0 -34
- package/dist/utils/staged-install.js +0 -346
- package/dist/utils/staged-npm-install.d.ts +0 -16
- package/dist/utils/staged-npm-install.js +0 -264
- package/dist/utils/sync-log-sources.d.ts +0 -15
- package/dist/utils/sync-log-sources.js +0 -36
- package/dist/utils/table-width.d.ts +0 -7
- package/dist/utils/table-width.js +0 -15
- package/dist/utils/update-command-supervisor.cjs +0 -247
- package/dist/utils/upload-author.d.ts +0 -15
- package/dist/utils/upload-author.js +0 -39
- package/dist/utils/version-report.d.ts +0 -27
- package/dist/utils/version-report.js +0 -105
- package/dist/version-request.d.ts +0 -14
- package/dist/version-request.js +0 -36
- package/scripts/mesh-daemon-if-stale.mjs +0 -20
- package/templates/reports/blank.md +0 -3
- package/templates/reports/daily-digest.md +0 -11
- package/templates/runbooks/update-report.md +0 -21
package/dist/commands/mesh.js
CHANGED
|
@@ -5,57 +5,37 @@
|
|
|
5
5
|
* require hq-pack-work-mesh on disk and does not start MQTT listen.
|
|
6
6
|
* Distinct from `hq doctor` (hook guardrails).
|
|
7
7
|
*/
|
|
8
|
-
import { resolve as resolvePath } from "node:path";
|
|
9
8
|
import * as os from "node:os";
|
|
10
|
-
import { readFileSync } from "node:fs";
|
|
11
|
-
import { findHqRoot } from "../utils/manifest.js";
|
|
12
|
-
import { CLI_VERSION } from "../cli-version.js";
|
|
13
9
|
import chalk from "chalk";
|
|
14
|
-
import {
|
|
10
|
+
import { loadCachedTokens, isMachineIdentity } from "../utils/cognito-session.js";
|
|
15
11
|
import * as readline from "node:readline/promises";
|
|
16
|
-
import { STORY_STATUSES, appendThreadEvent, ensureProjectThread, eventPayload,
|
|
17
|
-
import { closeSupersededProjectThread, ensureMissingBoardStories, ensureProjectBoard, boardStoryStatus, formatStoryStatusChanges, mergeProjectStories, prdSyncEventsThatChangeBoard, } from "../lib/mesh/project-board.js";
|
|
18
|
-
import { mapSourceStoryStatus } from "../lib/mesh/story-status.js";
|
|
19
|
-
import { buildPreflightFixtures } from "../lib/work-context/preflight-contract.js";
|
|
12
|
+
import { STORY_STATUSES, appendThreadEvent, callerLabelFromToken, ensureProjectThread, eventPayload, listActiveMembershipCompanies, listActiveThreads, patchStoryStatus, resolveActiveMembershipCompany, resolveMeshPrincipalUid, warmMeshConversationCache, } from "../lib/mesh/api.js";
|
|
20
13
|
import { createCandidatesFetcher, createMigratePoster, createOrganizePoster, createWorkSessionDeliverer, fetchCompanyLive, formatCompanyLiveTable, openMeshTransport, probeMigrationCapabilityForMemberships, requireToken, } from "../lib/mesh/client.js";
|
|
21
|
-
import { clearDefaultCompany,
|
|
22
|
-
import {
|
|
23
|
-
import { DefaultCompanyUnavailableError, } from "../lib/work-context/errors.js";
|
|
14
|
+
import { clearDefaultCompany, getDefaultCompany, readDeviceConfig, recordMigrationCapabilitySnapshot, setDefaultCompany, } from "../lib/work-context/config.js";
|
|
15
|
+
import { DefaultCompanyLockedError, DefaultCompanyUnavailableError, } from "../lib/work-context/errors.js";
|
|
24
16
|
import { isValidSessionId } from "../lib/mesh/live/session-identity.js";
|
|
25
17
|
import { CLI_KIND_TO_SCHEMA, resolveEnqueueSessionId, } from "../lib/mesh/live/index.js";
|
|
26
18
|
import { flushSessionEvents } from "../lib/mesh/live/flush.js";
|
|
27
19
|
import { backfillHeldSessions } from "../lib/mesh/live/backfill-held.js";
|
|
28
20
|
import { createSessionEventsPoster, resolveVaultApiBase, } from "../lib/mesh/live/session-events-client.js";
|
|
29
|
-
|
|
30
|
-
// Leave 500 ms of headroom inside SessionStart's 2 s process-group limit.
|
|
31
|
-
const OFFLINE_MEMBERSHIP_VALIDATION_TIMEOUT_MS = 1_500;
|
|
32
|
-
import { buildEmitEvidence, machineEmitDisposition } from "../lib/mesh/live/emit-evidence.js";
|
|
33
|
-
import { appendHeldLine } from "../lib/mesh/live/spool.js";
|
|
21
|
+
import { buildEmitEvidence } from "../lib/mesh/live/emit-evidence.js";
|
|
34
22
|
import { createEmitPoster, buildMeshEmitEvent } from "../lib/mesh/live/emit-client.js";
|
|
35
|
-
import {
|
|
36
|
-
import { emitEvents, formatEmitRejectionLines } from "../lib/mesh/live/emit.js";
|
|
23
|
+
import { emitEvents } from "../lib/mesh/live/emit.js";
|
|
37
24
|
import { readEmitRetry, writeEmitRetry } from "../lib/mesh/live/emit-retry.js";
|
|
38
25
|
import { generateUlid } from "../lib/mesh/live/ulid.js";
|
|
39
26
|
import { readLegacyBacklog } from "../lib/mesh/live/emit-replay.js";
|
|
40
27
|
import { resolveMeshEmitMode, writeMeshConfigMode, } from "../lib/mesh/live/daemon/mode.js";
|
|
41
28
|
import { workMeshRoot } from "../lib/mesh/live/paths.js";
|
|
42
|
-
import { buildInstallPaths, collectDaemonDoctor,
|
|
43
|
-
import { defaultRunCommand } from "../lib/service-manager/launchd.js";
|
|
29
|
+
import { buildInstallPaths, collectDaemonDoctor, daemonServiceStatus, detectPlatform, formatDaemonDoctor, installDaemonService, readDaemonState, runMeshDaemon, uninstallDaemonService, daemonDir, } from "../lib/mesh/live/daemon/index.js";
|
|
44
30
|
import { workContextRoot } from "../lib/work-context/paths.js";
|
|
45
31
|
import { formatMigrateConfirmation, submitSessionMigration, } from "../lib/work-context/migrate.js";
|
|
46
32
|
import { formatOrganizeList, prepareOrganizeDecision, settleOrganizeAskWithoutBind, submitOrganizeDecision, } from "../lib/work-context/organize.js";
|
|
47
|
-
import {
|
|
48
|
-
import { findLocalPrd, listNeedsProjectSessions } from "../lib/work-context/bind-best.js";
|
|
49
|
-
import { bindCallingSession, formatSessionBoundLine } from "../lib/work-context/bind-calling-session.js";
|
|
50
|
-
import { rebindNeedsProjectOnPrompt } from "../lib/work-context/prompt-rebind.js";
|
|
51
|
-
import { planPrdSync, rebindSessionToProject } from "../lib/work-context/prd-sync.js";
|
|
52
|
-
import { reserveSessionSeq } from "../lib/mesh/live/session-seq.js";
|
|
33
|
+
import { readSessionState } from "../lib/work-context/state.js";
|
|
53
34
|
import { loadObservationFromFile, markUntracked, parseObservationJson, reconcileObservation, } from "../lib/work-context/reconcile.js";
|
|
54
35
|
import { resolveCompany } from "../lib/work-context/company.js";
|
|
55
36
|
import { deriveRemoteOwnerSlug, deriveRepoIdentityKey, } from "../lib/work-context/repo-remote.js";
|
|
56
37
|
import { promptRepoCompany, } from "../lib/work-context/repo-prompt.js";
|
|
57
38
|
import { requeueQuarantinedOutbox } from "../lib/work-context/outbox.js";
|
|
58
|
-
import { handOffInstallHere } from "../lib/daemon/handoff.js";
|
|
59
39
|
export function formatCheckLines(threads, company, projectId) {
|
|
60
40
|
if (threads.length === 0) {
|
|
61
41
|
return ["Work mesh: no active project threads found."];
|
|
@@ -63,22 +43,14 @@ export function formatCheckLines(threads, company, projectId) {
|
|
|
63
43
|
const scope = projectId
|
|
64
44
|
? `${company.companySlug || company.companyUid}/${projectId}`
|
|
65
45
|
: company.companySlug || company.companyUid;
|
|
66
|
-
const lines = [`Work mesh: ${threads.length} thread(s) for ${scope}`];
|
|
46
|
+
const lines = [`Work mesh: ${threads.length} active thread(s) for ${scope}`];
|
|
67
47
|
for (const thread of threads.slice(0, 8)) {
|
|
68
48
|
const owner = thread.ownerUid ? ` owner=${thread.ownerUid}` : "";
|
|
69
49
|
const summary = thread.progressSummary ||
|
|
70
50
|
thread.sourceSignalSummary ||
|
|
71
51
|
thread.blockedReason ||
|
|
72
52
|
"";
|
|
73
|
-
|
|
74
|
-
const laneDetails = lane
|
|
75
|
-
? ` lane=${lane.laneId} laneStatus=${thread.laneStatus ?? "unknown"}` +
|
|
76
|
-
` story=${lane.storyId ?? "unknown"} profile=${lane.workerProfile ?? "unknown"}` +
|
|
77
|
-
` model=${lane.model ?? "unknown"} account=${lane.account ?? "unknown"}` +
|
|
78
|
-
`${lane.parentLaneId ? ` parent=${lane.parentLaneId}` : ""}`
|
|
79
|
-
: "";
|
|
80
|
-
const machine = thread.senderMachineUid ? ` machine=${thread.senderMachineUid}` : "";
|
|
81
|
-
lines.push(`- ${thread.threadStatus ?? "unknown"} ${thread.threadId ?? "?"}${owner}${machine}${laneDetails}${summary ? `: ${summary}` : ""}`);
|
|
53
|
+
lines.push(`- ${thread.threadStatus ?? "unknown"} ${thread.threadId ?? "?"}${owner}${summary ? `: ${summary}` : ""}`);
|
|
82
54
|
}
|
|
83
55
|
return lines;
|
|
84
56
|
}
|
|
@@ -113,20 +85,12 @@ async function runCheck(opts) {
|
|
|
113
85
|
async function runEvent(verb, opts) {
|
|
114
86
|
const { token, company } = await withCompany(opts);
|
|
115
87
|
const projectId = requireProject(opts);
|
|
116
|
-
const eventKind = verb === "start" ? "claim" : verb;
|
|
117
|
-
let claimant = "";
|
|
118
|
-
if (eventKind === "claim") {
|
|
119
|
-
const resolvedClaimant = await resolveMeshPrincipalUid(token, loadCachedTokens());
|
|
120
|
-
if (!resolvedClaimant) {
|
|
121
|
-
fail("Could not resolve the authenticated claimant. Sign in again and retry `hq mesh start`.");
|
|
122
|
-
}
|
|
123
|
-
claimant = resolvedClaimant;
|
|
124
|
-
}
|
|
125
88
|
const ensured = await ensureProjectThread(token, company, projectId, {
|
|
126
89
|
threadId: opts.threadId,
|
|
127
90
|
summary: opts.summary,
|
|
128
91
|
});
|
|
129
|
-
const
|
|
92
|
+
const eventKind = verb === "start" ? "claim" : verb;
|
|
93
|
+
const event = await appendThreadEvent(token, company.companyUid, ensured.threadId, eventKind, eventPayload(eventKind, opts, callerLabelFromToken(token)));
|
|
130
94
|
if (opts.json) {
|
|
131
95
|
console.log(JSON.stringify({
|
|
132
96
|
ok: true,
|
|
@@ -145,705 +109,33 @@ async function runEvent(verb, opts) {
|
|
|
145
109
|
async function runStory(opts) {
|
|
146
110
|
const storyId = opts.story?.trim();
|
|
147
111
|
const status = opts.status?.trim();
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
fail("story requires --story <id>");
|
|
151
|
-
}
|
|
152
|
-
if (!status && !assignee) {
|
|
153
|
-
fail("story requires --status queued|in_progress|review|done or --assignee <uid|me|none>");
|
|
154
|
-
}
|
|
155
|
-
if (status && !STORY_STATUSES.has(status)) {
|
|
156
|
-
fail("story --status must be queued|in_progress|review|done");
|
|
112
|
+
if (!storyId || !status || !STORY_STATUSES.has(status)) {
|
|
113
|
+
fail("story requires --story <id> and --status queued|in_progress|review|done");
|
|
157
114
|
}
|
|
158
115
|
const { token, company } = await withCompany(opts);
|
|
159
116
|
const projectId = requireProject(opts);
|
|
160
|
-
|
|
161
|
-
let clearAssignee = false;
|
|
162
|
-
if (assignee === "none") {
|
|
163
|
-
clearAssignee = true;
|
|
164
|
-
}
|
|
165
|
-
else if (assignee === "me") {
|
|
166
|
-
const resolved = await resolveMeshPrincipalUid(token, loadCachedTokens());
|
|
167
|
-
if (!resolved || resolved === "session") {
|
|
168
|
-
fail("`--assignee me` needs the signed-in person or agent. The synthetic session identity cannot be assigned. Sign in again and retry `hq mesh story`.");
|
|
169
|
-
}
|
|
170
|
-
assigneeUid = resolved;
|
|
171
|
-
}
|
|
172
|
-
else if (assignee) {
|
|
173
|
-
if (!/^(prs|agt)_/.test(assignee)) {
|
|
174
|
-
fail("`--assignee` must be a person or agent uid, `me`, or `none`.");
|
|
175
|
-
}
|
|
176
|
-
assigneeUid = assignee;
|
|
177
|
-
}
|
|
178
|
-
const patched = await patchStory(token, company.companyUid, projectId, storyId, {
|
|
179
|
-
...(status ? { status } : {}),
|
|
180
|
-
...(assigneeUid ? { assigneeUid } : {}),
|
|
181
|
-
...(clearAssignee ? { clearAssignee: true } : {}),
|
|
182
|
-
});
|
|
117
|
+
const patched = await patchStoryStatus(token, company.companyUid, projectId, storyId, status);
|
|
183
118
|
if (opts.json) {
|
|
184
119
|
console.log(JSON.stringify({ ok: true, action: "story", company, ...patched, storyId }, null, 2));
|
|
185
120
|
return;
|
|
186
121
|
}
|
|
187
|
-
|
|
188
|
-
? "assignee cleared"
|
|
189
|
-
: assignee
|
|
190
|
-
? `assignee ${patched.assigneeUid ?? assigneeUid}`
|
|
191
|
-
: "";
|
|
192
|
-
const statusPart = status ? `${storyId} → ${patched.status}` : storyId;
|
|
193
|
-
console.log(`Work mesh: story ${statusPart}${assignment ? ` ${assignment}` : ""} (v${patched.version ?? "?"})`);
|
|
194
|
-
}
|
|
195
|
-
function record(value) {
|
|
196
|
-
return value && typeof value === "object" && !Array.isArray(value)
|
|
197
|
-
? value
|
|
198
|
-
: null;
|
|
199
|
-
}
|
|
200
|
-
function parseProjectRepoSpec(value, source) {
|
|
201
|
-
const raw = value.trim();
|
|
202
|
-
const separator = raw.lastIndexOf("@");
|
|
203
|
-
const path = (separator > 0 ? raw.slice(0, separator) : raw).trim();
|
|
204
|
-
const branch = (separator > 0 ? raw.slice(separator + 1) : "").trim();
|
|
205
|
-
if (!path)
|
|
206
|
-
fail(`${source} requires a non-empty repository path.`);
|
|
207
|
-
if (separator > 0 && !branch)
|
|
208
|
-
fail(`${source} has an empty branch after @.`);
|
|
209
|
-
return { path, branch };
|
|
210
|
-
}
|
|
211
|
-
function parseProjectRepos(value, source) {
|
|
212
|
-
if (!Array.isArray(value))
|
|
213
|
-
fail(`${source} must be a JSON repository array.`);
|
|
214
|
-
return value.map((raw, index) => {
|
|
215
|
-
if (typeof raw === "string")
|
|
216
|
-
return parseProjectRepoSpec(raw, `${source}[${index}]`);
|
|
217
|
-
const repo = record(raw);
|
|
218
|
-
const path = typeof repo?.path === "string"
|
|
219
|
-
? repo.path.trim()
|
|
220
|
-
: typeof repo?.repoPath === "string"
|
|
221
|
-
? repo.repoPath.trim()
|
|
222
|
-
: typeof repo?.repo === "string"
|
|
223
|
-
? repo.repo.trim()
|
|
224
|
-
: "";
|
|
225
|
-
const branchValue = repo?.branch ?? repo?.branchName;
|
|
226
|
-
const branch = branchValue === undefined ? "" : typeof branchValue === "string" ? branchValue.trim() : null;
|
|
227
|
-
if (!repo || !path)
|
|
228
|
-
fail(`${source}[${index}].path requires a string.`);
|
|
229
|
-
if (branch === null)
|
|
230
|
-
fail(`${source}[${index}].branch requires a string.`);
|
|
231
|
-
return { path, branch };
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
function parseProjectReposJson(raw, source) {
|
|
235
|
-
try {
|
|
236
|
-
return parseProjectRepos(JSON.parse(raw), source);
|
|
237
|
-
}
|
|
238
|
-
catch (err) {
|
|
239
|
-
if (err instanceof SyntaxError)
|
|
240
|
-
fail(`${source} must contain valid JSON.`);
|
|
241
|
-
throw err;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
function projectStoriesFromJson(value, source) {
|
|
245
|
-
const plan = Array.isArray(value) ? null : record(value);
|
|
246
|
-
const rawStories = Array.isArray(value)
|
|
247
|
-
? value
|
|
248
|
-
: Array.isArray(plan?.userStories)
|
|
249
|
-
? plan.userStories
|
|
250
|
-
: Array.isArray(plan?.stories)
|
|
251
|
-
? plan.stories
|
|
252
|
-
: null;
|
|
253
|
-
if (!rawStories) {
|
|
254
|
-
fail(`${source} must be a JSON story array or an object with userStories.`);
|
|
255
|
-
}
|
|
256
|
-
const stories = rawStories.map((raw, index) => {
|
|
257
|
-
const story = record(raw);
|
|
258
|
-
const id = typeof story?.id === "string" ? story.id.trim() : "";
|
|
259
|
-
const title = typeof story?.title === "string" ? story.title.trim() : "";
|
|
260
|
-
if (!story || !id || !title) {
|
|
261
|
-
fail(`${source} userStories[${index}] requires string id and title.`);
|
|
262
|
-
}
|
|
263
|
-
const status = mapSourceStoryStatus(story, `${source} userStories[${index}]`);
|
|
264
|
-
const resolvedStatus = status || (story.passes === true ? "done" : undefined);
|
|
265
|
-
return {
|
|
266
|
-
id,
|
|
267
|
-
title,
|
|
268
|
-
...(typeof story.description === "string" ? { description: story.description } : {}),
|
|
269
|
-
...(Array.isArray(story.acceptanceCriteria)
|
|
270
|
-
? {
|
|
271
|
-
acceptanceCriteria: story.acceptanceCriteria.filter((item) => typeof item === "string"),
|
|
272
|
-
}
|
|
273
|
-
: {}),
|
|
274
|
-
...(resolvedStatus ? { status: resolvedStatus } : {}),
|
|
275
|
-
// hq-pro makes passes mirror the Board status. A completed PRD story
|
|
276
|
-
// without an explicit status must therefore become done.
|
|
277
|
-
passes: resolvedStatus === "done",
|
|
278
|
-
...(typeof story.priority === "number" && Number.isFinite(story.priority)
|
|
279
|
-
? { priority: story.priority }
|
|
280
|
-
: {}),
|
|
281
|
-
};
|
|
282
|
-
});
|
|
283
|
-
const metadata = record(plan?.metadata);
|
|
284
|
-
const repos = metadata && Object.hasOwn(metadata, "repos")
|
|
285
|
-
? parseProjectRepos(metadata.repos, `${source} metadata.repos`)
|
|
286
|
-
: undefined;
|
|
287
|
-
return {
|
|
288
|
-
...(typeof plan?.name === "string" ? { name: plan.name } : {}),
|
|
289
|
-
...(typeof plan?.description === "string" ? { description: plan.description } : {}),
|
|
290
|
-
stories,
|
|
291
|
-
...(repos ? { repos } : {}),
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
function parseProjectPlan(raw, source) {
|
|
295
|
-
try {
|
|
296
|
-
return projectStoriesFromJson(JSON.parse(raw), source);
|
|
297
|
-
}
|
|
298
|
-
catch (err) {
|
|
299
|
-
if (err instanceof SyntaxError)
|
|
300
|
-
fail(`${source} must contain valid JSON.`);
|
|
301
|
-
throw err;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
function httpStatus(err) {
|
|
305
|
-
if (err && typeof err === "object" && "status" in err && typeof err.status === "number") {
|
|
306
|
-
return err.status;
|
|
307
|
-
}
|
|
308
|
-
return undefined;
|
|
309
|
-
}
|
|
310
|
-
function mergeProjectRepos(current, planned) {
|
|
311
|
-
const plannedPaths = new Set(planned.map((repo) => repo.path));
|
|
312
|
-
return [...planned, ...current.filter((repo) => !plannedPaths.has(repo.path))];
|
|
313
|
-
}
|
|
314
|
-
async function runProjectSet(projectId, opts) {
|
|
315
|
-
if (opts.channel !== undefined && !opts.channel.trim()) {
|
|
316
|
-
fail("PROJECT_CHANNEL_INVALID: --channel must be a non-empty channel id.");
|
|
317
|
-
}
|
|
318
|
-
if (opts.storiesFile && opts.storiesJson) {
|
|
319
|
-
fail("Pass only one of --stories-file or --stories-json.");
|
|
320
|
-
}
|
|
321
|
-
if (opts.reposJson && opts.repo?.length) {
|
|
322
|
-
fail("Pass only one of --repos-json or --repo.");
|
|
323
|
-
}
|
|
324
|
-
const source = opts.storiesFile
|
|
325
|
-
? parseProjectPlan(readFileSync(opts.storiesFile, "utf8"), opts.storiesFile)
|
|
326
|
-
: opts.storiesJson
|
|
327
|
-
? parseProjectPlan(opts.storiesJson, "--stories-json")
|
|
328
|
-
: undefined;
|
|
329
|
-
const explicitRepos = opts.reposJson
|
|
330
|
-
? parseProjectReposJson(opts.reposJson, "--repos-json")
|
|
331
|
-
: opts.repo?.length
|
|
332
|
-
? opts.repo.map((repo, index) => parseProjectRepoSpec(repo, `--repo[${index}]`))
|
|
333
|
-
: undefined;
|
|
334
|
-
const { token, company } = await withCompany(opts);
|
|
335
|
-
let current;
|
|
336
|
-
try {
|
|
337
|
-
current = await getProjectView(token, company.companyUid, projectId);
|
|
338
|
-
}
|
|
339
|
-
catch (err) {
|
|
340
|
-
if (httpStatus(err) === 404 && opts.create) {
|
|
341
|
-
if (!source && !opts.name?.trim()) {
|
|
342
|
-
fail("`--create` needs --name or a stories file when the Board view does not exist.");
|
|
343
|
-
}
|
|
344
|
-
current = undefined;
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
throw err;
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
if (!current && !opts.create) {
|
|
351
|
-
fail(`Work mesh project ${projectId} has no Board view. Re-run with --create to add one.`);
|
|
352
|
-
}
|
|
353
|
-
const principalUid = await resolveMeshPrincipalUid(token, loadCachedTokens());
|
|
354
|
-
const PROJECT_CHANGED = "The Board changed while you were editing. Re-run to pick up the latest.";
|
|
355
|
-
let view;
|
|
356
|
-
let registration;
|
|
357
|
-
if (!current) {
|
|
358
|
-
const ensured = await ensureProjectBoard({
|
|
359
|
-
token,
|
|
360
|
-
company,
|
|
361
|
-
projectId,
|
|
362
|
-
name: opts.name?.trim() || source?.name || projectId,
|
|
363
|
-
description: opts.description !== undefined ? opts.description : source?.description ?? "",
|
|
364
|
-
stories: source?.stories ?? [],
|
|
365
|
-
repos: explicitRepos ?? source?.repos ?? [],
|
|
366
|
-
channelId: opts.channel,
|
|
367
|
-
});
|
|
368
|
-
view = ensured.view;
|
|
369
|
-
registration = ensured.registration;
|
|
370
|
-
}
|
|
371
|
-
else if (opts.name !== undefined || opts.description !== undefined || source !== undefined || explicitRepos !== undefined) {
|
|
372
|
-
const stories = source
|
|
373
|
-
? mergeProjectStories(current.stories, source.stories, { resetStatus: Boolean(opts.resetStatus) })
|
|
374
|
-
: current.stories;
|
|
375
|
-
const statusChangeLine = source ? formatStoryStatusChanges(current.stories, stories) : undefined;
|
|
376
|
-
try {
|
|
377
|
-
view = await putProjectView(token, company.companyUid, projectId, {
|
|
378
|
-
name: opts.name?.trim() || source?.name || current.name,
|
|
379
|
-
...(opts.description !== undefined
|
|
380
|
-
? { description: opts.description }
|
|
381
|
-
: source?.description !== undefined
|
|
382
|
-
? { description: source.description }
|
|
383
|
-
: { description: current.description }),
|
|
384
|
-
stories,
|
|
385
|
-
repos: explicitRepos ?? source?.repos ?? current.repos,
|
|
386
|
-
...(current.version !== undefined ? { expectedVersion: current.version } : {}),
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
catch (err) {
|
|
390
|
-
const conflict = err;
|
|
391
|
-
if (conflict.status === 409 && conflict.code === "VERSION_CONFLICT") {
|
|
392
|
-
if (opts.json) {
|
|
393
|
-
console.log(JSON.stringify({ ok: false, code: "VERSION_CONFLICT", error: PROJECT_CHANGED }));
|
|
394
|
-
}
|
|
395
|
-
fail(PROJECT_CHANGED);
|
|
396
|
-
}
|
|
397
|
-
throw err;
|
|
398
|
-
}
|
|
399
|
-
if (statusChangeLine) {
|
|
400
|
-
if (opts.json)
|
|
401
|
-
console.error(statusChangeLine);
|
|
402
|
-
else
|
|
403
|
-
console.log(statusChangeLine);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
else {
|
|
407
|
-
view = current;
|
|
408
|
-
}
|
|
409
|
-
if (current && opts.channel !== undefined) {
|
|
410
|
-
registration = await registerMeshProject(token, company.companyUid, projectId, opts.channel);
|
|
411
|
-
}
|
|
412
|
-
if (!current && opts.create) {
|
|
413
|
-
noteCallingSessionBound(view.projectId, company);
|
|
414
|
-
}
|
|
415
|
-
if (opts.json) {
|
|
416
|
-
console.log(JSON.stringify({
|
|
417
|
-
ok: true,
|
|
418
|
-
action: "project.set",
|
|
419
|
-
principalUid,
|
|
420
|
-
...view,
|
|
421
|
-
...(registration ? { registration } : {}),
|
|
422
|
-
}, null, 2));
|
|
423
|
-
return;
|
|
424
|
-
}
|
|
425
|
-
console.log(`Work mesh: project ${view.projectId} set (${view.name}; ${view.stories.length} stories)`);
|
|
426
|
-
}
|
|
427
|
-
async function runProjectRegister(projectId, opts) {
|
|
428
|
-
if (opts.channel !== undefined && !opts.channel.trim()) {
|
|
429
|
-
fail("PROJECT_CHANNEL_INVALID: --channel must be a non-empty channel id.");
|
|
430
|
-
}
|
|
431
|
-
const { token, company } = await withCompany(opts);
|
|
432
|
-
const principalUid = await resolveMeshPrincipalUid(token, loadCachedTokens());
|
|
433
|
-
const companyRef = company.companySlug || company.companyUid;
|
|
434
|
-
try {
|
|
435
|
-
const board = await getProjectView(token, company.companyUid, projectId);
|
|
436
|
-
if (board.companyUid !== company.companyUid || board.projectId !== projectId) {
|
|
437
|
-
fail(`Work mesh project ${projectId} has no Board view in company ${companyRef}. Create the Board before registering it.`);
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
catch (err) {
|
|
441
|
-
if (httpStatus(err) === 404) {
|
|
442
|
-
fail(`Work mesh project ${projectId} has no Board view in company ${companyRef}. Create the Board before registering it.`);
|
|
443
|
-
}
|
|
444
|
-
throw err;
|
|
445
|
-
}
|
|
446
|
-
let registration;
|
|
447
|
-
try {
|
|
448
|
-
registration = await registerMeshProject(token, company.companyUid, projectId, opts.channel);
|
|
449
|
-
}
|
|
450
|
-
catch (err) {
|
|
451
|
-
const failure = err;
|
|
452
|
-
if (failure.status === 403 && failure.code === "PROJECT_NOT_IN_COMPANY") {
|
|
453
|
-
fail(`Work mesh project ${projectId} could not be registered in company ${companyRef}: the Board or its genesis thread is missing. Run "hq mesh project ensure ${projectId} --company ${companyRef} --stories-file <prd.json>" to create or restore them.`);
|
|
454
|
-
}
|
|
455
|
-
throw err;
|
|
456
|
-
}
|
|
457
|
-
const boardState = "registered";
|
|
458
|
-
if (opts.json) {
|
|
459
|
-
console.log(JSON.stringify({ ok: true, action: "project.register", principalUid, boardState, ...registration }, null, 2));
|
|
460
|
-
return;
|
|
461
|
-
}
|
|
462
|
-
console.log(`Work mesh: project ${registration.projectId} registered (${boardState}; channel ${registration.channelId} ${registration.channelCreated ? "created" : "bound"})`);
|
|
463
|
-
}
|
|
464
|
-
async function runProjectEnsure(projectId, opts) {
|
|
465
|
-
if (!opts.storiesFile?.trim())
|
|
466
|
-
fail("`--stories-file <prd.json>` is required.");
|
|
467
|
-
const source = parseProjectPlan(readFileSync(opts.storiesFile, "utf8"), opts.storiesFile);
|
|
468
|
-
const { token, company } = await withCompany(opts);
|
|
469
|
-
let current;
|
|
470
|
-
try {
|
|
471
|
-
current = await getProjectView(token, company.companyUid, projectId);
|
|
472
|
-
}
|
|
473
|
-
catch (err) {
|
|
474
|
-
if (httpStatus(err) !== 404)
|
|
475
|
-
throw err;
|
|
476
|
-
}
|
|
477
|
-
if (opts.dryRun) {
|
|
478
|
-
if (current && (current.companyUid !== company.companyUid || current.projectId !== projectId)) {
|
|
479
|
-
fail("Work mesh project ensure dry-run: Board company or project id did not match the request.");
|
|
480
|
-
}
|
|
481
|
-
const stories = current ? mergeProjectStories(current.stories, source.stories) : source.stories;
|
|
482
|
-
const sourceStatuses = source.stories.map((story) => ({
|
|
483
|
-
id: story.id,
|
|
484
|
-
title: story.title,
|
|
485
|
-
status: boardStoryStatus(story),
|
|
486
|
-
}));
|
|
487
|
-
const boardStatuses = stories.map((story) => ({
|
|
488
|
-
id: story.id,
|
|
489
|
-
title: story.title,
|
|
490
|
-
status: boardStoryStatus(story),
|
|
491
|
-
}));
|
|
492
|
-
if (opts.json) {
|
|
493
|
-
console.log(JSON.stringify({
|
|
494
|
-
ok: true,
|
|
495
|
-
action: "project.ensure.dry-run",
|
|
496
|
-
projectId,
|
|
497
|
-
companyUid: company.companyUid,
|
|
498
|
-
sourceStatuses,
|
|
499
|
-
stories: boardStatuses,
|
|
500
|
-
}, null, 2));
|
|
501
|
-
}
|
|
502
|
-
else {
|
|
503
|
-
console.log(`Work mesh: project ${projectId} dry run (${sourceStatuses.length} source stories)`);
|
|
504
|
-
console.log("Source statuses:");
|
|
505
|
-
for (const story of sourceStatuses)
|
|
506
|
-
console.log(`${story.id}\t${story.status}`);
|
|
507
|
-
console.log("Merged Board statuses:");
|
|
508
|
-
for (const story of boardStatuses)
|
|
509
|
-
console.log(`${story.id}\t${story.status}`);
|
|
510
|
-
}
|
|
511
|
-
return;
|
|
512
|
-
}
|
|
513
|
-
// Genesis thread, then the view, then register. Register returns 403
|
|
514
|
-
// PROJECT_NOT_IN_COMPANY until both exist. A missing view uses that chain
|
|
515
|
-
// from ensureProjectBoard; an existing view is merged, then registered.
|
|
516
|
-
let registration;
|
|
517
|
-
let verified;
|
|
518
|
-
if (!current) {
|
|
519
|
-
const ensured = await ensureProjectBoard({
|
|
520
|
-
token,
|
|
521
|
-
company,
|
|
522
|
-
projectId,
|
|
523
|
-
name: source.name || projectId,
|
|
524
|
-
description: source.description ?? "",
|
|
525
|
-
stories: source.stories,
|
|
526
|
-
repos: source.repos ?? [],
|
|
527
|
-
});
|
|
528
|
-
registration = ensured.registration;
|
|
529
|
-
verified = ensured.view;
|
|
530
|
-
}
|
|
531
|
-
else {
|
|
532
|
-
const genesis = await ensureProjectThread(token, company, projectId, {
|
|
533
|
-
summary: source.name || projectId,
|
|
534
|
-
});
|
|
535
|
-
if (!genesis.threadId)
|
|
536
|
-
fail("Work mesh did not return a threadId.");
|
|
537
|
-
{
|
|
538
|
-
const stories = mergeProjectStories(current.stories, source.stories);
|
|
539
|
-
const repos = mergeProjectRepos(current.repos, source.repos ?? []);
|
|
540
|
-
const name = source.name || current.name;
|
|
541
|
-
const description = source.description !== undefined ? source.description : current.description;
|
|
542
|
-
const changed = name !== current.name ||
|
|
543
|
-
description !== current.description ||
|
|
544
|
-
JSON.stringify(stories) !== JSON.stringify(current.stories) ||
|
|
545
|
-
JSON.stringify(repos) !== JSON.stringify(current.repos);
|
|
546
|
-
if (changed) {
|
|
547
|
-
await putProjectView(token, company.companyUid, projectId, {
|
|
548
|
-
name,
|
|
549
|
-
description,
|
|
550
|
-
stories,
|
|
551
|
-
repos,
|
|
552
|
-
...(current.version !== undefined ? { expectedVersion: current.version } : {}),
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
registration = await registerMeshProject(token, company.companyUid, projectId);
|
|
557
|
-
await closeSupersededProjectThread({
|
|
558
|
-
token,
|
|
559
|
-
companyUid: company.companyUid,
|
|
560
|
-
openedThreadId: genesis.threadId,
|
|
561
|
-
canonicalThreadId: registration.threadId,
|
|
562
|
-
created: genesis.created,
|
|
563
|
-
});
|
|
564
|
-
if (!registration.threadId || !registration.channelId) {
|
|
565
|
-
fail("Work mesh registration did not return a threadId and channelId.");
|
|
566
|
-
}
|
|
567
|
-
verified = await getProjectView(token, company.companyUid, projectId);
|
|
568
|
-
}
|
|
569
|
-
if (verified.companyUid !== company.companyUid) {
|
|
570
|
-
fail(`Work mesh project ensure: company mismatch (expected ${company.companyUid}, got ${verified.companyUid}).`);
|
|
571
|
-
}
|
|
572
|
-
if (verified.projectId !== projectId) {
|
|
573
|
-
fail(`Work mesh project ensure: project id mismatch (expected ${projectId}, got ${verified.projectId}).`);
|
|
574
|
-
}
|
|
575
|
-
for (const story of source.stories) {
|
|
576
|
-
if (!verified.stories.some((row) => row.id === story.id)) {
|
|
577
|
-
fail(`Work mesh project ensure: missing story ${story.id}.`);
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
for (const repo of source.repos ?? []) {
|
|
581
|
-
if (!verified.repos.some((row) => row.path === repo.path)) {
|
|
582
|
-
fail(`Work mesh project ensure: missing repo ${repo.path}.`);
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
if (verified.version === undefined) {
|
|
586
|
-
fail("Work mesh project ensure: verified view has no version.");
|
|
587
|
-
}
|
|
588
|
-
const payload = {
|
|
589
|
-
projectId: verified.projectId,
|
|
590
|
-
threadId: registration.threadId,
|
|
591
|
-
channelId: registration.channelId,
|
|
592
|
-
version: verified.version,
|
|
593
|
-
stories: verified.stories,
|
|
594
|
-
};
|
|
595
|
-
noteCallingSessionBound(payload.projectId, company);
|
|
596
|
-
if (opts.json) {
|
|
597
|
-
console.log(JSON.stringify(payload));
|
|
598
|
-
return;
|
|
599
|
-
}
|
|
600
|
-
console.log(`Work mesh: project ${payload.projectId} ensured (thread ${payload.threadId}, channel ${payload.channelId}, ${payload.stories.length} stories)`);
|
|
601
|
-
}
|
|
602
|
-
async function runPrdSync(opts) {
|
|
603
|
-
const sessionId = opts.session.trim();
|
|
604
|
-
const file = opts.file.trim();
|
|
605
|
-
if (!sessionId || !file)
|
|
606
|
-
fail("Usage: hq mesh context prd-sync --session <sid> --file <prd.json>");
|
|
607
|
-
const root = workContextHomeRoot();
|
|
608
|
-
const plan = planPrdSync({ sessionId, file, root });
|
|
609
|
-
if (plan.rebindTo) {
|
|
610
|
-
rebindSessionToProject({ sessionId, root, projectId: plan.rebindTo });
|
|
611
|
-
}
|
|
612
|
-
if (!plan.changed) {
|
|
613
|
-
const payload = { ok: true, action: "context.prd-sync", changed: 0, ...(plan.skip ? { skip: plan.skip } : {}) };
|
|
614
|
-
if (opts.json)
|
|
615
|
-
console.log(JSON.stringify(payload));
|
|
616
|
-
else
|
|
617
|
-
console.log(plan.skip ? `Work mesh: prd-sync skipped (${plan.skip})` : "Work mesh: prd-sync unchanged");
|
|
618
|
-
return;
|
|
619
|
-
}
|
|
620
|
-
let token;
|
|
621
|
-
try {
|
|
622
|
-
token = await requireToken();
|
|
623
|
-
}
|
|
624
|
-
catch {
|
|
625
|
-
token = null;
|
|
626
|
-
}
|
|
627
|
-
if (!token) {
|
|
628
|
-
console.error("work-mesh: prd-sync has changes but no token; snapshot not advanced");
|
|
629
|
-
return;
|
|
630
|
-
}
|
|
631
|
-
// Attribution evidence: without company and project the server files these
|
|
632
|
-
// as unassigned and the Board never moves. After a same-company switch,
|
|
633
|
-
// this is the new project's id so ingest writes SESSION_STATE.projectId
|
|
634
|
-
// and bound-forward posts the channel line there.
|
|
635
|
-
const bound = readSessionState(sessionId, root);
|
|
636
|
-
const evidenceBase = {
|
|
637
|
-
...(bound?.companySlug ? { companySlug: bound.companySlug } : {}),
|
|
638
|
-
...(bound?.projectId ? { project: bound.projectId } : {}),
|
|
639
|
-
touchedPaths: [resolvePath(file)],
|
|
640
|
-
};
|
|
641
|
-
let toEmit = plan.events;
|
|
642
|
-
if (bound?.companyUid && bound.projectId) {
|
|
643
|
-
try {
|
|
644
|
-
const live = await getProjectView(token, bound.companyUid, bound.projectId);
|
|
645
|
-
toEmit = prdSyncEventsThatChangeBoard(plan.events, live.stories);
|
|
646
|
-
}
|
|
647
|
-
catch {
|
|
648
|
-
// Board unread — emit the snapshot diff; the server drops same-status.
|
|
649
|
-
}
|
|
650
|
-
if (toEmit.length === 0) {
|
|
651
|
-
plan.commit();
|
|
652
|
-
if (opts.json) {
|
|
653
|
-
console.log(JSON.stringify({ ok: true, action: "context.prd-sync", changed: 0 }));
|
|
654
|
-
}
|
|
655
|
-
else {
|
|
656
|
-
console.log("Work mesh: prd-sync unchanged");
|
|
657
|
-
}
|
|
658
|
-
return;
|
|
659
|
-
}
|
|
660
|
-
try {
|
|
661
|
-
const source = parseProjectPlan(readFileSync(file, "utf8"), file);
|
|
662
|
-
await ensureMissingBoardStories({
|
|
663
|
-
token,
|
|
664
|
-
company: {
|
|
665
|
-
companyUid: bound.companyUid,
|
|
666
|
-
companySlug: bound.companySlug || bound.companyUid,
|
|
667
|
-
},
|
|
668
|
-
projectId: bound.projectId,
|
|
669
|
-
name: source.name || bound.projectId,
|
|
670
|
-
description: source.description ?? "",
|
|
671
|
-
stories: source.stories,
|
|
672
|
-
repos: source.repos ?? [],
|
|
673
|
-
requiredIds: toEmit.map((event) => event.taskId),
|
|
674
|
-
});
|
|
675
|
-
}
|
|
676
|
-
catch (err) {
|
|
677
|
-
const reason = err instanceof Error ? err.message : String(err);
|
|
678
|
-
console.error(`work-mesh: prd-sync ensure failed; emitting anyway (${reason.slice(0, 160)})`);
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
const alreadyOnBoard = plan.events
|
|
682
|
-
.filter((event) => !toEmit.some((row) => row.taskId === event.taskId))
|
|
683
|
-
.map((event) => event.taskId);
|
|
684
|
-
const meshRoot = workMeshHomeRoot();
|
|
685
|
-
const seqFirst = reserveSessionSeq(sessionId, toEmit.length);
|
|
686
|
-
const events = toEmit.map((event, index) => buildMeshEmitEvent({
|
|
687
|
-
eventId: generateUlid(Date.now() + index),
|
|
688
|
-
kind: "task_status",
|
|
689
|
-
sessionId,
|
|
690
|
-
harness: "hq-sessions",
|
|
691
|
-
adapterVersion: "1.0.0",
|
|
692
|
-
at: new Date().toISOString(),
|
|
693
|
-
seq: seqFirst + index,
|
|
694
|
-
source: "hooks",
|
|
695
|
-
taskId: event.taskId,
|
|
696
|
-
status: event.status,
|
|
697
|
-
summary: event.status === "done"
|
|
698
|
-
? `${event.taskId} passes`
|
|
699
|
-
: event.status === "in_progress"
|
|
700
|
-
? `${event.taskId} in progress`
|
|
701
|
-
: `${event.taskId} in review`,
|
|
702
|
-
evidence: { ...evidenceBase, task: event.taskId },
|
|
703
|
-
}));
|
|
704
|
-
const poster = createEmitPoster({ token, baseUrl: resolveVaultApiBase(process.env) });
|
|
705
|
-
const emitted = await emitEvents({
|
|
706
|
-
workMeshRoot: meshRoot,
|
|
707
|
-
poster,
|
|
708
|
-
newEvents: events,
|
|
709
|
-
});
|
|
710
|
-
if (emitted.unassigned > 0 || emitted.rejected > 0) {
|
|
711
|
-
console.error(`work-mesh: prd-sync sent ${events.length}; unassigned=${emitted.unassigned} rejected=${emitted.rejected}`);
|
|
712
|
-
for (const line of formatEmitRejectionLines(emitted.rejections))
|
|
713
|
-
console.error(line);
|
|
714
|
-
}
|
|
715
|
-
const blocked = new Set(emitted.rejections.map((row) => row.eventId));
|
|
716
|
-
for (const pending of readEmitRetry(meshRoot)) {
|
|
717
|
-
const id = typeof pending.eventId === "string" ? pending.eventId : "";
|
|
718
|
-
if (id)
|
|
719
|
-
blocked.add(id);
|
|
720
|
-
}
|
|
721
|
-
const advanced = events.flatMap((event) => (event.eventId && event.taskId && !blocked.has(event.eventId) ? [event.taskId] : []));
|
|
722
|
-
plan.commit([...alreadyOnBoard, ...advanced]);
|
|
723
|
-
if (plan.taskId && advanced.includes(plan.taskId)) {
|
|
724
|
-
updateSessionState(sessionId, root, (current) => {
|
|
725
|
-
if (!current)
|
|
726
|
-
return null;
|
|
727
|
-
return {
|
|
728
|
-
...current,
|
|
729
|
-
taskId: plan.taskId,
|
|
730
|
-
contextStatus: current.projectId ? "bound" : current.contextStatus,
|
|
731
|
-
updatedAt: new Date().toISOString(),
|
|
732
|
-
};
|
|
733
|
-
});
|
|
734
|
-
}
|
|
735
|
-
if (opts.json) {
|
|
736
|
-
console.log(JSON.stringify({ ok: true, action: "context.prd-sync", changed: toEmit.length, taskId: plan.taskId }));
|
|
737
|
-
return;
|
|
738
|
-
}
|
|
739
|
-
console.log(`Work mesh: prd-sync emitted ${toEmit.length} task_status`);
|
|
740
|
-
}
|
|
741
|
-
function noteCallingSessionBound(projectId, company) {
|
|
742
|
-
try {
|
|
743
|
-
const bound = bindCallingSession({
|
|
744
|
-
root: workContextHomeRoot(),
|
|
745
|
-
projectId,
|
|
746
|
-
company,
|
|
747
|
-
});
|
|
748
|
-
if (bound.bound)
|
|
749
|
-
console.error(formatSessionBoundLine(bound.sessionId, bound.projectId));
|
|
750
|
-
}
|
|
751
|
-
catch {
|
|
752
|
-
/* session bind is local and must not fail project ensure */
|
|
753
|
-
}
|
|
122
|
+
console.log(`Work mesh: story ${storyId} → ${patched.status} (v${patched.version ?? "?"})`);
|
|
754
123
|
}
|
|
755
124
|
async function runDoctor(opts) {
|
|
756
125
|
if (opts.apply) {
|
|
757
126
|
fail("`hq mesh doctor --apply` (paced Board PUTs from local prd.json) is not in the CLI yet.\n" +
|
|
758
127
|
"Omit --apply to warm the conversation cache (directory, inbox, pair DMs).");
|
|
759
128
|
}
|
|
760
|
-
const identity = collectDaemonDoctor();
|
|
761
|
-
const identityLines = formatCliIdentityLines(identity);
|
|
762
|
-
if (!opts.json) {
|
|
763
|
-
for (const line of identityLines)
|
|
764
|
-
console.log(line);
|
|
765
|
-
}
|
|
766
129
|
const token = await requireToken();
|
|
767
130
|
const principalUid = await resolveMeshPrincipalUid(token, loadCachedTokens());
|
|
768
|
-
if (!principalUid) {
|
|
769
|
-
fail("Could not resolve the authenticated principal. Sign in again and retry `hq mesh doctor`.");
|
|
770
|
-
}
|
|
771
131
|
const warmed = await warmMeshConversationCache(token, principalUid);
|
|
772
|
-
const needsProject = listNeedsProjectSessions(workContextHomeRoot());
|
|
773
132
|
if (opts.json) {
|
|
774
|
-
console.log(JSON.stringify({
|
|
775
|
-
ok: true,
|
|
776
|
-
action: "doctor",
|
|
777
|
-
...warmed,
|
|
778
|
-
needsProject,
|
|
779
|
-
cliMismatchLine: identity.cliMismatchLine ?? null,
|
|
780
|
-
hqOnPath: identity.hqOnPath,
|
|
781
|
-
multipleHqOnPath: identity.multipleHqOnPath,
|
|
782
|
-
}, null, 2));
|
|
133
|
+
console.log(JSON.stringify({ ok: true, action: "doctor", ...warmed }, null, 2));
|
|
783
134
|
return;
|
|
784
135
|
}
|
|
785
136
|
console.log(`Work mesh cache warmed at ${warmed.cacheRoot}` +
|
|
786
137
|
` (directory=${warmed.directory} inbox=${warmed.inbox}` +
|
|
787
138
|
` contacts=${warmed.contacts} pair-threads=${warmed.threads})`);
|
|
788
|
-
if (needsProject.length === 0) {
|
|
789
|
-
console.log("needs_project sessions: none");
|
|
790
|
-
return;
|
|
791
|
-
}
|
|
792
|
-
console.log(`needs_project sessions: ${needsProject.length}`);
|
|
793
|
-
for (const row of needsProject) {
|
|
794
|
-
const choices = row.candidates.map((candidate) => candidate.projectId).join(", ") || "(none)";
|
|
795
|
-
console.log(`- ${row.sessionId}: ${row.reason ?? "no reason recorded"}; candidates: ${choices}`);
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
async function runBindProject(target, opts) {
|
|
799
|
-
const sessionId = opts.session.trim();
|
|
800
|
-
const root = workContextHomeRoot();
|
|
801
|
-
const current = readSessionState(sessionId, root);
|
|
802
|
-
if (!current)
|
|
803
|
-
fail(`No work-context state for session ${sessionId}.`);
|
|
804
|
-
let projectId = target.trim();
|
|
805
|
-
if (projectId === "new") {
|
|
806
|
-
const slug = opts.slug?.trim();
|
|
807
|
-
if (!slug)
|
|
808
|
-
fail("Usage: hq mesh context bind-project new <slug> --session <sid>");
|
|
809
|
-
const hqRoot = process.env.HQ_ROOT?.trim() || findHqRoot();
|
|
810
|
-
const prdPath = findLocalPrd(hqRoot, current.companySlug, slug);
|
|
811
|
-
if (!prdPath) {
|
|
812
|
-
fail(`No PRD for ${slug}. Run /prd before binding a new project.`);
|
|
813
|
-
}
|
|
814
|
-
if (!current.companyUid)
|
|
815
|
-
fail(`Session ${sessionId} has no company. Bind a company first.`);
|
|
816
|
-
const { token, company } = await withCompany({ company: opts.company ?? current.companySlug });
|
|
817
|
-
const plan = parseProjectPlan(readFileSync(prdPath, "utf8"), prdPath);
|
|
818
|
-
await ensureProjectBoard({
|
|
819
|
-
token,
|
|
820
|
-
company: {
|
|
821
|
-
companyUid: current.companyUid,
|
|
822
|
-
companySlug: current.companySlug || company.companySlug,
|
|
823
|
-
},
|
|
824
|
-
projectId: slug,
|
|
825
|
-
name: plan.name || slug,
|
|
826
|
-
description: plan.description ?? "",
|
|
827
|
-
stories: plan.stories,
|
|
828
|
-
repos: plan.repos ?? [],
|
|
829
|
-
});
|
|
830
|
-
projectId = slug;
|
|
831
|
-
}
|
|
832
|
-
else if (/^[1-9][0-9]*$/.test(projectId)) {
|
|
833
|
-
const index = Number(projectId) - 1;
|
|
834
|
-
const chosen = current.projectCandidates?.[index];
|
|
835
|
-
if (!chosen)
|
|
836
|
-
fail(`No candidate ${projectId} on session ${sessionId}.`);
|
|
837
|
-
projectId = chosen.projectId;
|
|
838
|
-
}
|
|
839
|
-
const updated = updateSessionState(sessionId, root, (state) => state ? applyOperatorProjectBinding(state, projectId) : null);
|
|
840
|
-
if (!updated)
|
|
841
|
-
fail(`No work-context state for session ${sessionId}.`);
|
|
842
|
-
if (opts.json) {
|
|
843
|
-
console.log(JSON.stringify({ ok: true, action: "context.bind-project", sessionId, projectId, contextStatus: updated.contextStatus }));
|
|
844
|
-
return;
|
|
845
|
-
}
|
|
846
|
-
console.log(`Work mesh: session ${sessionId} bound to project ${projectId}`);
|
|
847
139
|
}
|
|
848
140
|
async function runContextReconcile(opts) {
|
|
849
141
|
if (!opts.observationFile && !opts.observationJson) {
|
|
@@ -860,92 +152,25 @@ async function runContextReconcile(opts) {
|
|
|
860
152
|
let fetchCandidates;
|
|
861
153
|
let validateMembership;
|
|
862
154
|
let offline = Boolean(opts.offline);
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
}
|
|
869
|
-
else {
|
|
870
|
-
const cached = loadCachedTokens();
|
|
871
|
-
if (cached && !isExpiring(cached, 120)) {
|
|
872
|
-
token = cached.accessToken;
|
|
873
|
-
}
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
|
-
else {
|
|
877
|
-
token = await requireToken();
|
|
878
|
-
}
|
|
879
|
-
if (token) {
|
|
880
|
-
const sessionToken = token;
|
|
881
|
-
const membershipValidationTimeoutMs = offline
|
|
882
|
-
? OFFLINE_MEMBERSHIP_VALIDATION_TIMEOUT_MS
|
|
883
|
-
: ONLINE_MEMBERSHIP_VALIDATION_TIMEOUT_MS;
|
|
155
|
+
if (!offline) {
|
|
156
|
+
try {
|
|
157
|
+
const token = await requireToken();
|
|
158
|
+
deliver = createWorkSessionDeliverer({ token });
|
|
159
|
+
fetchCandidates = createCandidatesFetcher({ token });
|
|
884
160
|
validateMembership = async (candidate) => {
|
|
885
|
-
const membership = await
|
|
886
|
-
|
|
887
|
-
void resolveActiveMembershipCompany(sessionToken, candidate).then((value) => {
|
|
888
|
-
clearTimeout(timer);
|
|
889
|
-
resolve(value);
|
|
890
|
-
}, (error) => {
|
|
891
|
-
clearTimeout(timer);
|
|
892
|
-
reject(error);
|
|
893
|
-
});
|
|
894
|
-
});
|
|
895
|
-
if (!membership || typeof membership.companyUid !== "string" || !membership.companyUid) {
|
|
161
|
+
const membership = await resolveActiveMembershipCompany(token, candidate);
|
|
162
|
+
if (!membership)
|
|
896
163
|
return false;
|
|
897
|
-
}
|
|
898
164
|
return { uid: membership.companyUid };
|
|
899
165
|
};
|
|
900
|
-
if (!offline) {
|
|
901
|
-
deliver = createWorkSessionDeliverer({ token: sessionToken });
|
|
902
|
-
fetchCandidates = createCandidatesFetcher({ token: sessionToken });
|
|
903
|
-
}
|
|
904
166
|
}
|
|
905
|
-
|
|
906
|
-
catch {
|
|
907
|
-
if (!offline) {
|
|
167
|
+
catch {
|
|
908
168
|
offline = true;
|
|
909
169
|
if (!opts.machine) {
|
|
910
170
|
console.error(chalk.yellow("No Cognito session; reconciling offline (outbox only)."));
|
|
911
171
|
}
|
|
912
172
|
}
|
|
913
173
|
}
|
|
914
|
-
if (token) {
|
|
915
|
-
const activation = await ensureDefaultCompany({
|
|
916
|
-
root,
|
|
917
|
-
listMemberships: () => listActiveMembershipCompanies(token),
|
|
918
|
-
log: (message) => console.error(chalk.dim(message)),
|
|
919
|
-
});
|
|
920
|
-
if (activation.status === "needs_choice") {
|
|
921
|
-
const interactive = !offline &&
|
|
922
|
-
!opts.machine &&
|
|
923
|
-
Boolean(process.stdin.isTTY && process.stdout.isTTY) &&
|
|
924
|
-
!isMachineIdentity();
|
|
925
|
-
if (interactive) {
|
|
926
|
-
const choices = activation.memberships
|
|
927
|
-
.map((membership, index) => `${index + 1}. ${membership.slug}`)
|
|
928
|
-
.join("\n");
|
|
929
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
|
|
930
|
-
try {
|
|
931
|
-
const answer = await rl.question(`Choose this device's default company:\n${choices}\nSelection: `);
|
|
932
|
-
const selected = activation.memberships[Number.parseInt(answer, 10) - 1];
|
|
933
|
-
if (selected) {
|
|
934
|
-
await setDefaultCompany(selected.slug, {
|
|
935
|
-
root,
|
|
936
|
-
validateMembership: (candidate) => candidate === selected.slug ? { uid: selected.uid } : false,
|
|
937
|
-
});
|
|
938
|
-
}
|
|
939
|
-
}
|
|
940
|
-
finally {
|
|
941
|
-
rl.close();
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
else if (!offline && !opts.machine) {
|
|
945
|
-
console.error(chalk.yellow("Multiple active memberships. Run `hq mesh context default set <slug>` to choose this device's default company."));
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
}
|
|
949
174
|
const outcome = await reconcileObservation(obs, {
|
|
950
175
|
root,
|
|
951
176
|
env: process.env,
|
|
@@ -953,20 +178,6 @@ async function runContextReconcile(opts) {
|
|
|
953
178
|
fetchCandidates,
|
|
954
179
|
offline,
|
|
955
180
|
validateMembership,
|
|
956
|
-
ensureProjectBoard: token
|
|
957
|
-
? async ({ companyUid, projectId, prdPath }) => {
|
|
958
|
-
const plan = parseProjectPlan(readFileSync(prdPath, "utf8"), prdPath);
|
|
959
|
-
await ensureProjectBoard({
|
|
960
|
-
token,
|
|
961
|
-
company: { companyUid, companySlug: companyUid },
|
|
962
|
-
projectId,
|
|
963
|
-
name: plan.name || projectId,
|
|
964
|
-
description: plan.description ?? "",
|
|
965
|
-
stories: plan.stories,
|
|
966
|
-
repos: plan.repos ?? [],
|
|
967
|
-
});
|
|
968
|
-
}
|
|
969
|
-
: undefined,
|
|
970
181
|
});
|
|
971
182
|
for (const line of outcome.diagnostics) {
|
|
972
183
|
console.error(line);
|
|
@@ -1083,21 +294,19 @@ async function runContextBackfillHeld(opts) {
|
|
|
1083
294
|
const parsedLimit = opts.limit ? Number.parseInt(opts.limit, 10) : 0;
|
|
1084
295
|
const limit = Number.isFinite(parsedLimit) && parsedLimit > 0 ? parsedLimit : 0;
|
|
1085
296
|
const companyHint = opts.company?.trim() || undefined;
|
|
1086
|
-
|
|
1087
|
-
//
|
|
1088
|
-
//
|
|
1089
|
-
//
|
|
297
|
+
// Build the reconcile network seam exactly like `hq mesh context reconcile`.
|
|
298
|
+
// Not needed in --dry-run (reconcile is never invoked then). Explicit types
|
|
299
|
+
// because these are captured in the reconcile closure below (no control-flow
|
|
300
|
+
// narrowing, unlike the inline reconcile handler).
|
|
1090
301
|
let deliver;
|
|
1091
302
|
let fetchCandidates;
|
|
1092
303
|
let validateMembership;
|
|
1093
304
|
let offline = Boolean(opts.offline);
|
|
1094
|
-
if (!offline) {
|
|
305
|
+
if (!dryRun && !offline) {
|
|
1095
306
|
try {
|
|
1096
307
|
const token = await requireToken();
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
fetchCandidates = createCandidatesFetcher({ token });
|
|
1100
|
-
}
|
|
308
|
+
deliver = createWorkSessionDeliverer({ token });
|
|
309
|
+
fetchCandidates = createCandidatesFetcher({ token });
|
|
1101
310
|
validateMembership = async (candidate) => {
|
|
1102
311
|
const membership = await resolveActiveMembershipCompany(token, candidate);
|
|
1103
312
|
if (!membership)
|
|
@@ -1115,14 +324,11 @@ async function runContextBackfillHeld(opts) {
|
|
|
1115
324
|
const result = await backfillHeldSessions({
|
|
1116
325
|
workMeshRoot: meshRoot,
|
|
1117
326
|
workContextRoot: root,
|
|
1118
|
-
hqRoot: process.env.HQ_ROOT?.trim() || findHqRoot(),
|
|
1119
327
|
dryRun,
|
|
1120
328
|
limit,
|
|
1121
329
|
// Mirror the reconcile closure's non-forcing hint in the dry-run predictor
|
|
1122
330
|
// so `--dry-run` and the real run report the same counts.
|
|
1123
331
|
remoteOwnerHint: companyHint || undefined,
|
|
1124
|
-
useDeviceDefault,
|
|
1125
|
-
validateMembership,
|
|
1126
332
|
reconcile: (obs) => reconcileObservation(
|
|
1127
333
|
// Pass --company as a non-forcing hint (remoteOwnerSlug feeds
|
|
1128
334
|
// deterministic resolution BELOW the identity-file / device default,
|
|
@@ -1134,8 +340,6 @@ async function runContextBackfillHeld(opts) {
|
|
|
1134
340
|
fetchCandidates,
|
|
1135
341
|
offline,
|
|
1136
342
|
validateMembership,
|
|
1137
|
-
allowDeviceDefault: useDeviceDefault,
|
|
1138
|
-
deviceDefaultConfidence: useDeviceDefault,
|
|
1139
343
|
}),
|
|
1140
344
|
});
|
|
1141
345
|
if (opts.json) {
|
|
@@ -1150,9 +354,6 @@ async function runContextBackfillHeld(opts) {
|
|
|
1150
354
|
`${result.unresolved} unresolved, ` +
|
|
1151
355
|
`${result.errors} error(s).` +
|
|
1152
356
|
(dryRun ? " (dry-run: nothing written)" : ""));
|
|
1153
|
-
for (const { sessionId, reason } of result.unresolvedReasons) {
|
|
1154
|
-
console.log(`Unresolved ${sessionId}: ${reason}`);
|
|
1155
|
-
}
|
|
1156
357
|
if (!dryRun && result.reconciled > 0) {
|
|
1157
358
|
console.log("Reconciled session state files were rewritten with a resolved company; " +
|
|
1158
359
|
"the mesh daemon's held retry will re-attribute and post those events.");
|
|
@@ -1161,38 +362,20 @@ async function runContextBackfillHeld(opts) {
|
|
|
1161
362
|
async function runContextDefaultGet(opts) {
|
|
1162
363
|
const root = workContextHomeRoot();
|
|
1163
364
|
const cfg = readDeviceConfig({ root });
|
|
1164
|
-
const current =
|
|
1165
|
-
? cfg.defaultCompany
|
|
1166
|
-
: null;
|
|
1167
|
-
const memberships = cfg.defaultCompanyMemberships?.memberships ?? [];
|
|
1168
|
-
const disabled = isDefaultCompanyDisabled({ root });
|
|
1169
|
-
const source = disabled ? "disabled" : current?.source ?? (current ? "chosen" : "unset");
|
|
365
|
+
const current = getDefaultCompany({ root });
|
|
1170
366
|
if (opts.json) {
|
|
1171
|
-
console.log(JSON.stringify({
|
|
1172
|
-
ok: true,
|
|
1173
|
-
slug: current?.slug ?? null,
|
|
1174
|
-
uid: current?.uid ?? null,
|
|
1175
|
-
enabled: current?.enabled ?? false,
|
|
1176
|
-
source,
|
|
1177
|
-
needsChoice: !current && !disabled && memberships.length > 1,
|
|
1178
|
-
memberships,
|
|
1179
|
-
repairHeldWithDefault: cfg.repairHeldWithDefault === true,
|
|
1180
|
-
}, null, 2));
|
|
1181
|
-
return;
|
|
1182
|
-
}
|
|
1183
|
-
if (disabled) {
|
|
1184
|
-
console.log("Default company disabled on this device.");
|
|
367
|
+
console.log(JSON.stringify({ ok: true, config: cfg, defaultCompany: current }, null, 2));
|
|
1185
368
|
return;
|
|
1186
369
|
}
|
|
1187
370
|
if (!current) {
|
|
1188
371
|
console.log("No device default company (default-company mode may be dark).");
|
|
1189
372
|
return;
|
|
1190
373
|
}
|
|
1191
|
-
console.log(`Default company: ${current.slug}${current.uid ? ` (${current.uid})` : ""} enabled=${current.enabled}
|
|
374
|
+
console.log(`Default company: ${current.slug}${current.uid ? ` (${current.uid})` : ""} enabled=${current.enabled}`);
|
|
1192
375
|
}
|
|
1193
376
|
async function runContextDefaultSet(slug, opts) {
|
|
1194
377
|
const root = workContextHomeRoot();
|
|
1195
|
-
void opts.company; // retained for CLI compatibility
|
|
378
|
+
void opts.company; // retained for CLI compatibility; unlock is memberships-wide
|
|
1196
379
|
let token;
|
|
1197
380
|
try {
|
|
1198
381
|
token = await requireToken();
|
|
@@ -1200,38 +383,42 @@ async function runContextDefaultSet(slug, opts) {
|
|
|
1200
383
|
catch {
|
|
1201
384
|
token = undefined;
|
|
1202
385
|
}
|
|
1203
|
-
//
|
|
1204
|
-
// verified member from choosing their own device-local preference.
|
|
386
|
+
// US-017B: unlock only when EVERY active membership advertises migration.
|
|
1205
387
|
let migrationCapability = false;
|
|
1206
|
-
let migrationWarning;
|
|
1207
388
|
if (token) {
|
|
1208
389
|
const probe = await probeMigrationCapabilityForMemberships(token);
|
|
1209
390
|
recordMigrationCapabilitySnapshot(probe, { root });
|
|
1210
391
|
migrationCapability = probe.unlocked;
|
|
1211
|
-
if (probe.offline) {
|
|
1212
|
-
|
|
1213
|
-
|
|
392
|
+
if (probe.offline && !opts.allowWithoutMigration) {
|
|
393
|
+
console.error(chalk.red("DEFAULT_COMPANY_LOCKED: cannot probe migration capability (offline or not logged in)"));
|
|
394
|
+
process.exitCode = 1;
|
|
395
|
+
return;
|
|
1214
396
|
}
|
|
1215
|
-
|
|
397
|
+
if (!probe.unlocked && !opts.allowWithoutMigration) {
|
|
1216
398
|
const detail = probe.companies.length === 0
|
|
1217
399
|
? "no active memberships"
|
|
1218
400
|
: probe.companies
|
|
1219
401
|
.filter((c) => !c.migration)
|
|
1220
402
|
.map((c) => c.companySlug || c.companyUid)
|
|
1221
403
|
.join(", ");
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
404
|
+
console.error(chalk.red(`DEFAULT_COMPANY_LOCKED: migration capability is not true for every company you belong to (${detail || "locked"})`));
|
|
405
|
+
process.exitCode = 1;
|
|
406
|
+
return;
|
|
1225
407
|
}
|
|
1226
408
|
}
|
|
1227
|
-
else {
|
|
1228
|
-
|
|
1229
|
-
|
|
409
|
+
else if (!opts.allowWithoutMigration) {
|
|
410
|
+
console.error(chalk.red("DEFAULT_COMPANY_LOCKED: cannot probe migration capability (no Cognito session)"));
|
|
411
|
+
process.exitCode = 1;
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
if (!migrationCapability && opts.allowWithoutMigration) {
|
|
415
|
+
console.error(chalk.yellow("Warning: --allow-without-migration bypasses DEFAULT_COMPANY_LOCKED; a wrong default is hard to correct until migration is available for every company you belong to."));
|
|
1230
416
|
}
|
|
1231
417
|
try {
|
|
1232
418
|
const cfg = await setDefaultCompany(slug, {
|
|
1233
419
|
root,
|
|
1234
420
|
migrationCapability,
|
|
421
|
+
allowWithoutMigration: opts.allowWithoutMigration,
|
|
1235
422
|
validateMembership: async (candidate) => {
|
|
1236
423
|
if (!token) {
|
|
1237
424
|
throw new DefaultCompanyUnavailableError(`Cannot verify membership for company "${candidate}" (no Cognito session; offline or not logged in)`);
|
|
@@ -1249,20 +436,16 @@ async function runContextDefaultSet(slug, opts) {
|
|
|
1249
436
|
return { uid: membership.companyUid };
|
|
1250
437
|
},
|
|
1251
438
|
});
|
|
1252
|
-
const configured = opts.repairHeldWithDefault
|
|
1253
|
-
? setRepairHeldWithDefault(true, { root })
|
|
1254
|
-
: cfg;
|
|
1255
439
|
if (opts.json) {
|
|
1256
|
-
console.log(JSON.stringify({ ok: true, config:
|
|
440
|
+
console.log(JSON.stringify({ ok: true, config: cfg }, null, 2));
|
|
1257
441
|
return;
|
|
1258
442
|
}
|
|
1259
|
-
const stored =
|
|
443
|
+
const stored = cfg.defaultCompany;
|
|
1260
444
|
console.log(`Default company set to ${stored?.slug ?? slug}${stored?.uid ? ` (${stored.uid})` : ""}`);
|
|
1261
|
-
if (migrationWarning)
|
|
1262
|
-
console.error(chalk.yellow(migrationWarning));
|
|
1263
445
|
}
|
|
1264
446
|
catch (err) {
|
|
1265
|
-
if (err instanceof
|
|
447
|
+
if (err instanceof DefaultCompanyLockedError ||
|
|
448
|
+
err instanceof DefaultCompanyUnavailableError) {
|
|
1266
449
|
console.error(chalk.red(`${err.code}: ${err.message}`));
|
|
1267
450
|
process.exitCode = 1;
|
|
1268
451
|
return;
|
|
@@ -1532,16 +715,13 @@ async function runSessionStatus(opts) {
|
|
|
1532
715
|
}
|
|
1533
716
|
const { token, company } = await withCompany({ company: opts.company });
|
|
1534
717
|
const live = await fetchCompanyLive(token, company.companyUid);
|
|
1535
|
-
const unattributedEvents = collectDaemonDoctor().unattributedEvents;
|
|
1536
718
|
if (opts.json) {
|
|
1537
|
-
console.log(JSON.stringify({ ok: true, action: "session-status", company, live
|
|
719
|
+
console.log(JSON.stringify({ ok: true, action: "session-status", company, live }, null, 2));
|
|
1538
720
|
return;
|
|
1539
721
|
}
|
|
1540
722
|
for (const line of formatCompanyLiveTable(live, company.companySlug || company.companyUid)) {
|
|
1541
723
|
console.log(line);
|
|
1542
724
|
}
|
|
1543
|
-
console.log(`unattributed events: ${unattributedEvents.total} ` +
|
|
1544
|
-
`(spool=${unattributedEvents.spool} held=${unattributedEvents.held} dead-letter=${unattributedEvents.deadLetter})`);
|
|
1545
725
|
}
|
|
1546
726
|
const HARNESSES = new Set([
|
|
1547
727
|
"claude-code",
|
|
@@ -1574,21 +754,6 @@ async function runSessionEnqueue(cliKind, opts) {
|
|
|
1574
754
|
const sessionId = resolveEnqueueSessionId(opts.sessionId, process.env);
|
|
1575
755
|
if (!sessionId)
|
|
1576
756
|
fail("sessionId required (--session-id or HQ_SESSION_ID)");
|
|
1577
|
-
if (kind === "turn_start") {
|
|
1578
|
-
try {
|
|
1579
|
-
rebindNeedsProjectOnPrompt({
|
|
1580
|
-
sessionId,
|
|
1581
|
-
root: workContextHomeRoot(),
|
|
1582
|
-
hqRoot: opts.hqRoot?.trim() || process.env.HQ_ROOT,
|
|
1583
|
-
cwd: opts.cwd,
|
|
1584
|
-
companySlug: opts.companySlug,
|
|
1585
|
-
env: process.env,
|
|
1586
|
-
});
|
|
1587
|
-
}
|
|
1588
|
-
catch {
|
|
1589
|
-
/* prompt rebind is fail-soft */
|
|
1590
|
-
}
|
|
1591
|
-
}
|
|
1592
757
|
const evidence = buildEmitEvidence({
|
|
1593
758
|
sessionId: sessionId,
|
|
1594
759
|
hqRoot: opts.hqRoot,
|
|
@@ -1598,16 +763,7 @@ async function runSessionEnqueue(cliKind, opts) {
|
|
|
1598
763
|
companySlug: opts.companySlug,
|
|
1599
764
|
project: opts.project,
|
|
1600
765
|
task: opts.task,
|
|
1601
|
-
env: process.env,
|
|
1602
766
|
});
|
|
1603
|
-
const reportFields = kind === "session_end"
|
|
1604
|
-
? enrichSessionEndEvent({
|
|
1605
|
-
kind,
|
|
1606
|
-
sessionId: sessionId,
|
|
1607
|
-
cwd: opts.cwd,
|
|
1608
|
-
summary: opts.summary,
|
|
1609
|
-
})
|
|
1610
|
-
: {};
|
|
1611
767
|
const event = buildMeshEmitEvent({
|
|
1612
768
|
eventId: opts.eventId?.trim() || generateUlid(Date.now()),
|
|
1613
769
|
kind: kind,
|
|
@@ -1621,35 +777,10 @@ async function runSessionEnqueue(cliKind, opts) {
|
|
|
1621
777
|
taskId: opts.taskId,
|
|
1622
778
|
status: opts.status,
|
|
1623
779
|
reason: opts.reason,
|
|
1624
|
-
summary: opts.summary
|
|
1625
|
-
(typeof reportFields.summary === "string" ? reportFields.summary : undefined),
|
|
1626
|
-
repo: typeof reportFields.repo === "string" ? reportFields.repo : undefined,
|
|
1627
|
-
gitBranch: typeof reportFields.gitBranch === "string"
|
|
1628
|
-
? reportFields.gitBranch
|
|
1629
|
-
: undefined,
|
|
1630
|
-
prUrls: Array.isArray(reportFields.prUrls)
|
|
1631
|
-
? reportFields.prUrls
|
|
1632
|
-
: undefined,
|
|
780
|
+
summary: opts.summary,
|
|
1633
781
|
evidence,
|
|
1634
782
|
});
|
|
1635
783
|
const meshRoot = workMeshHomeRoot();
|
|
1636
|
-
// A machine credential with no company must not be posted. The server files
|
|
1637
|
-
// that as company NONE. Hold it and say why.
|
|
1638
|
-
if (machineEmitDisposition({ machine: isMachineIdentity(), companySlug: evidence.companySlug }) === "hold") {
|
|
1639
|
-
appendHeldLine(JSON.stringify({
|
|
1640
|
-
event,
|
|
1641
|
-
heldReason: "NEEDS_COMPANY",
|
|
1642
|
-
heldAt: new Date().toISOString(),
|
|
1643
|
-
reason: "machine session has no company; event was not sent",
|
|
1644
|
-
}), meshRoot);
|
|
1645
|
-
const heldMessage = `work-mesh: held ${kind}; needs_company (machine session has no company; not sent)`;
|
|
1646
|
-
if (opts.json) {
|
|
1647
|
-
console.log(JSON.stringify({ ok: true, action: "emit", kind, held: true, reason: "needs_company" }, null, 2));
|
|
1648
|
-
return;
|
|
1649
|
-
}
|
|
1650
|
-
console.error(heldMessage);
|
|
1651
|
-
return;
|
|
1652
|
-
}
|
|
1653
784
|
// Resolve a token non-interactively (same path as every CLI call). If the box
|
|
1654
785
|
// is not logged in, retain the event locally for the next invocation to drain.
|
|
1655
786
|
let token;
|
|
@@ -1685,9 +816,6 @@ async function runSessionEnqueue(cliKind, opts) {
|
|
|
1685
816
|
console.error(`work-mesh: emit ${kind} accepted=${summary.accepted}` +
|
|
1686
817
|
` unassigned=${summary.unassigned} rejected=${summary.rejected}` +
|
|
1687
818
|
` retryDepth=${summary.retryDepth}`);
|
|
1688
|
-
for (const line of formatEmitRejectionLines(summary.rejections)) {
|
|
1689
|
-
console.error(line);
|
|
1690
|
-
}
|
|
1691
819
|
}
|
|
1692
820
|
async function runMeshMode(action, opts) {
|
|
1693
821
|
const meshRoot = workMeshHomeRoot();
|
|
@@ -1772,9 +900,6 @@ async function runMeshEmit(opts) {
|
|
|
1772
900
|
` unassigned=${summary.unassigned} rejected=${summary.rejected}` +
|
|
1773
901
|
` retryDepth=${summary.retryDepth}` +
|
|
1774
902
|
(opts.replayLegacy ? ` (legacy scanned=${scanned} skipped=${skipped})` : ""));
|
|
1775
|
-
for (const line of formatEmitRejectionLines(summary.rejections)) {
|
|
1776
|
-
console.log(line);
|
|
1777
|
-
}
|
|
1778
903
|
}
|
|
1779
904
|
async function runSessionFlush(opts) {
|
|
1780
905
|
const token = await requireToken();
|
|
@@ -1873,43 +998,9 @@ export function registerMeshCommand(program) {
|
|
|
1873
998
|
.option("--summary <text>", "Note text")).action((opts) => wrap(() => runEvent("note", opts))());
|
|
1874
999
|
addSharedFlags(mesh
|
|
1875
1000
|
.command("story")
|
|
1876
|
-
.description("PATCH one Board story status
|
|
1001
|
+
.description("PATCH one Board story status")
|
|
1877
1002
|
.requiredOption("--story <id>", "Story id, e.g. US-001")
|
|
1878
|
-
.
|
|
1879
|
-
.option("--assignee <uid|me|none>", "Assign a person or agent uid, yourself, or clear")).action((opts) => wrap(() => runStory(opts))());
|
|
1880
|
-
const project = mesh
|
|
1881
|
-
.command("project")
|
|
1882
|
-
.description("Set a project Board view or register its project channel");
|
|
1883
|
-
project
|
|
1884
|
-
.command("set <projectId>")
|
|
1885
|
-
.description("PUT the project Board view from flags or a PRD JSON file")
|
|
1886
|
-
.requiredOption("--company <slug|uid>", "Company slug or cloud uid")
|
|
1887
|
-
.option("--name <name>", "Project name")
|
|
1888
|
-
.option("--description <text>", "Project description")
|
|
1889
|
-
.option("--stories-file <path>", "PRD JSON file with userStories")
|
|
1890
|
-
.option("--stories-json <json>", "Story array or JSON object with userStories")
|
|
1891
|
-
.option("--repos-json <json>", "Repository array, such as [{path,branch}]")
|
|
1892
|
-
.option("--repo <path[@branch]>", "Repository binding (repeatable)", collectRepeatable)
|
|
1893
|
-
.option("--channel <channelId>", "Bind the project to an existing company or project channel")
|
|
1894
|
-
.option("--create", "Create the Board view when the GET is a 404")
|
|
1895
|
-
.option("--reset-status", "Overwrite live story status from the PRD (prints a one-line summary of changes)")
|
|
1896
|
-
.option("--json", "Print machine-readable JSON")
|
|
1897
|
-
.action((projectId, opts) => wrap(() => runProjectSet(projectId, opts))());
|
|
1898
|
-
project
|
|
1899
|
-
.command("ensure <projectId>")
|
|
1900
|
-
.description("Idempotently register a PRD on the Board and verify the view")
|
|
1901
|
-
.requiredOption("--company <slug|uid>", "Company slug or cloud uid")
|
|
1902
|
-
.requiredOption("--stories-file <path>", "PRD JSON file with userStories and metadata.repos")
|
|
1903
|
-
.option("--dry-run", "Read the current Board and print computed story statuses without writing")
|
|
1904
|
-
.option("--json", "Print {projectId, threadId, channelId, version, stories}")
|
|
1905
|
-
.action((projectId, opts) => wrap(() => runProjectEnsure(projectId, opts))());
|
|
1906
|
-
project
|
|
1907
|
-
.command("register <projectId>")
|
|
1908
|
-
.description("Register an existing Board and bind its project channel; use project ensure to create or repair a Board")
|
|
1909
|
-
.requiredOption("--company <slug|uid>", "Company slug or cloud uid")
|
|
1910
|
-
.option("--channel <channelId>", "Bind the project to an existing company or project channel")
|
|
1911
|
-
.option("--json", "Print machine-readable JSON")
|
|
1912
|
-
.action((projectId, opts) => wrap(() => runProjectRegister(projectId, opts))());
|
|
1003
|
+
.requiredOption("--status <status>", "queued|in_progress|review|done")).action((opts) => wrap(() => runStory(opts))());
|
|
1913
1004
|
mesh
|
|
1914
1005
|
.command("doctor")
|
|
1915
1006
|
.description("Warm ~/.hq/work-mesh/cache from hq-pro (directory, inbox, pair DMs). Not `hq doctor`.")
|
|
@@ -1939,29 +1030,12 @@ export function registerMeshCommand(program) {
|
|
|
1939
1030
|
context
|
|
1940
1031
|
.command("backfill-held")
|
|
1941
1032
|
.description("Reconcile ENDED sessions whose held events lack a company so the daemon re-attributes the backlog (explicit, opt-in; no fleet fan-out)")
|
|
1942
|
-
.option("--dry-run", "Report what would be reconciled; write nothing
|
|
1033
|
+
.option("--dry-run", "Report what would be reconciled; write nothing, no network")
|
|
1943
1034
|
.option("--offline", "Reconcile outbox-only (no candidates/register network)")
|
|
1944
1035
|
.option("--limit <n>", "Cap sessions processed (default 0 = no cap)")
|
|
1945
|
-
.option("--company <slug>", "Optional non-forcing company hint")
|
|
1946
|
-
.option("--use-device-default", "Opt in to historical repair using the device default (lower-confidence attribution)")
|
|
1036
|
+
.option("--company <slug>", "Optional non-forcing company hint (resolver default still wins)")
|
|
1947
1037
|
.option("--json", "Print machine-readable JSON")
|
|
1948
1038
|
.action((opts) => wrap(() => runContextBackfillHeld(opts))());
|
|
1949
|
-
context
|
|
1950
|
-
.command("bind-project")
|
|
1951
|
-
.description("Bind this session to a project id, a numbered candidate, or new <slug>")
|
|
1952
|
-
.argument("<target>", "Project id, candidate number, or new")
|
|
1953
|
-
.argument("[slug]", "Project slug when target is new")
|
|
1954
|
-
.requiredOption("--session <sid>", "Canonical session id")
|
|
1955
|
-
.option("--company <slug|uid>", "Company override when creating a Board")
|
|
1956
|
-
.option("--json", "Print machine-readable JSON")
|
|
1957
|
-
.action((target, slug, opts) => wrap(() => runBindProject(target, { ...opts, slug }))());
|
|
1958
|
-
context
|
|
1959
|
-
.command("prd-sync")
|
|
1960
|
-
.description("Emit task_status for PRD story passes/status changes on a bound session")
|
|
1961
|
-
.requiredOption("--session <sid>", "Canonical session id")
|
|
1962
|
-
.requiredOption("--file <path>", "prd.json written by the bound session")
|
|
1963
|
-
.option("--json", "Print machine-readable JSON")
|
|
1964
|
-
.action((opts) => wrap(() => runPrdSync(opts))());
|
|
1965
1039
|
context
|
|
1966
1040
|
.command("organize")
|
|
1967
1041
|
.description("List or submit one-time project/task decisions (US-007B / US-005B)")
|
|
@@ -2011,11 +1085,10 @@ export function registerMeshCommand(program) {
|
|
|
2011
1085
|
.action((opts) => wrap(() => runContextDefaultGet(opts))());
|
|
2012
1086
|
def
|
|
2013
1087
|
.command("set")
|
|
2014
|
-
.description("Set the device default company slug
|
|
1088
|
+
.description("Set the device default company slug (unlocked when migration is true for every membership)")
|
|
2015
1089
|
.argument("<slug>", "Company slug")
|
|
2016
|
-
.option("--allow-without-migration", "
|
|
2017
|
-
.option("--
|
|
2018
|
-
.option("--company <slug|uid>", "Deprecated no-op; the selected company is verified directly")
|
|
1090
|
+
.option("--allow-without-migration", "Bypass DEFAULT_COMPANY_LOCKED with a warning")
|
|
1091
|
+
.option("--company <slug|uid>", "Deprecated no-op; unlock probes every active membership")
|
|
2019
1092
|
.option("--json", "Print machine-readable JSON")
|
|
2020
1093
|
.action((slug, opts) => wrap(() => runContextDefaultSet(slug, opts))());
|
|
2021
1094
|
def
|
|
@@ -2029,19 +1102,6 @@ export function registerMeshCommand(program) {
|
|
|
2029
1102
|
.argument("<sessionId>", "Canonical session id")
|
|
2030
1103
|
.option("--machine", "Write exactly one ContextResult JSON line to stdout")
|
|
2031
1104
|
.action((sessionId, opts) => wrap(() => runContextUntracked(sessionId, opts))());
|
|
2032
|
-
const contract = mesh
|
|
2033
|
-
.command("contract")
|
|
2034
|
-
.description("Print versioned work-mesh contracts for other repositories");
|
|
2035
|
-
contract
|
|
2036
|
-
.command("preflight")
|
|
2037
|
-
.description("Offline preflight ContextResult contract (contracts/preflight/v1)")
|
|
2038
|
-
.option("--print-fixtures", "Write the fixture file JSON to stdout")
|
|
2039
|
-
.action((opts) => wrap(async () => {
|
|
2040
|
-
if (!opts.printFixtures) {
|
|
2041
|
-
throw new Error("Pass --print-fixtures. The stable package path is contracts/preflight/v1/fixtures.json.");
|
|
2042
|
-
}
|
|
2043
|
-
process.stdout.write(`${JSON.stringify(buildPreflightFixtures(), null, 2)}\n`);
|
|
2044
|
-
})());
|
|
2045
1105
|
const session = mesh
|
|
2046
1106
|
.command("session")
|
|
2047
1107
|
.description("Local session-event spool: enqueue (printf-compatible), flush, and live status");
|
|
@@ -2088,14 +1148,11 @@ export function registerMeshCommand(program) {
|
|
|
2088
1148
|
daemon
|
|
2089
1149
|
.command("run")
|
|
2090
1150
|
.description("Start the single-instance daemon (pid lock, spool watch, presence)")
|
|
2091
|
-
.
|
|
2092
|
-
.action((opts) => wrap(() => runDaemonRun(opts))());
|
|
1151
|
+
.action(() => wrap(() => runDaemonRun())());
|
|
2093
1152
|
daemon
|
|
2094
1153
|
.command("install")
|
|
2095
|
-
.description("Install LaunchAgent (macOS)
|
|
1154
|
+
.description("Install LaunchAgent (macOS) or systemd user unit (Linux)")
|
|
2096
1155
|
.option("--system-user <user>", "Write a root-owned unit template for agent boxes (e.g. ec2-user)")
|
|
2097
|
-
.option("--hq-root <path>", "HQ root to record for the service (else HQ_ROOT, else the nearest HQ root above cwd)")
|
|
2098
|
-
.option("--if-stale", "Reinstall and restart only when this CLI is newer than the daemon's recorded version")
|
|
2099
1156
|
.option("--json", "Print machine-readable JSON")
|
|
2100
1157
|
.action((opts) => wrap(() => runDaemonInstall(opts))());
|
|
2101
1158
|
daemon
|
|
@@ -2114,65 +1171,18 @@ export function registerMeshCommand(program) {
|
|
|
2114
1171
|
.option("--json", "Print machine-readable JSON")
|
|
2115
1172
|
.action((opts) => wrap(() => runDaemonDoctorCmd(opts))());
|
|
2116
1173
|
}
|
|
2117
|
-
async function runDaemonRun(
|
|
2118
|
-
const
|
|
2119
|
-
const handle = await runMeshDaemon({
|
|
2120
|
-
...(hqRoot ? { hqRoot } : {}),
|
|
2121
|
-
enableWorkCache: true,
|
|
2122
|
-
});
|
|
1174
|
+
async function runDaemonRun() {
|
|
1175
|
+
const handle = await runMeshDaemon();
|
|
2123
1176
|
// Stay alive until signal handlers call stop + exit.
|
|
2124
1177
|
await new Promise(() => {
|
|
2125
1178
|
void handle;
|
|
2126
1179
|
});
|
|
2127
1180
|
}
|
|
2128
1181
|
async function runDaemonInstall(opts) {
|
|
2129
|
-
// `hq daemon` runs mesh on this machine: installing a second unit would run it twice.
|
|
2130
|
-
// An explicit --hq-root is verified the same way as below and saved for the daemon.
|
|
2131
|
-
const explicitRoot = opts.hqRoot ? resolveInstallHqRoot({ explicit: opts.hqRoot }).root : undefined;
|
|
2132
|
-
const handedOff = opts.systemUser
|
|
2133
|
-
? null
|
|
2134
|
-
: handOffInstallHere(["mesh"], process.env, { hqRoot: explicitRoot, ifStale: opts.ifStale });
|
|
2135
|
-
if (handedOff) {
|
|
2136
|
-
console.log(opts.json ? JSON.stringify({ ok: true, action: "hq-daemon", reinstalled: false, message: handedOff }) : handedOff);
|
|
2137
|
-
return;
|
|
2138
|
-
}
|
|
2139
|
-
// Verified root only: a repo's own .claude/ must never become the daemon's
|
|
2140
|
-
// HQ root (that path is persisted as trusted and used for attribution).
|
|
2141
|
-
const hqRoot = resolveInstallHqRoot({ explicit: opts.hqRoot });
|
|
2142
|
-
const paths = buildInstallPaths({
|
|
2143
|
-
systemUser: opts.systemUser,
|
|
2144
|
-
hqRoot: hqRoot.root,
|
|
2145
|
-
hqRootSource: hqRoot.source,
|
|
2146
|
-
hqBinary: resolveRunningCliEntry(),
|
|
2147
|
-
nodeBinary: resolveAbsoluteNodeBinary(),
|
|
2148
|
-
});
|
|
2149
|
-
if (opts.ifStale) {
|
|
2150
|
-
const stale = installDaemonIfStale({
|
|
2151
|
-
currentVersion: CLI_VERSION,
|
|
2152
|
-
platform: detectPlatform(),
|
|
2153
|
-
paths,
|
|
2154
|
-
systemUser: opts.systemUser,
|
|
2155
|
-
});
|
|
2156
|
-
if (opts.json) {
|
|
2157
|
-
console.log(JSON.stringify({
|
|
2158
|
-
ok: true,
|
|
2159
|
-
action: stale.reinstalled ? "install" : "unchanged",
|
|
2160
|
-
reinstalled: stale.reinstalled,
|
|
2161
|
-
message: stale.message,
|
|
2162
|
-
hqBinary: paths.hqBinary,
|
|
2163
|
-
nodeBinary: paths.nodeBinary,
|
|
2164
|
-
hqRoot: hqRoot.root,
|
|
2165
|
-
}, null, 2));
|
|
2166
|
-
return;
|
|
2167
|
-
}
|
|
2168
|
-
console.log(stale.message);
|
|
2169
|
-
return;
|
|
2170
|
-
}
|
|
2171
1182
|
const result = installDaemonService({
|
|
2172
1183
|
platform: detectPlatform(),
|
|
2173
|
-
paths,
|
|
1184
|
+
paths: buildInstallPaths({ systemUser: opts.systemUser }),
|
|
2174
1185
|
systemUser: opts.systemUser,
|
|
2175
|
-
run: defaultRunCommand,
|
|
2176
1186
|
});
|
|
2177
1187
|
if (opts.json) {
|
|
2178
1188
|
console.log(JSON.stringify({
|
|
@@ -2181,15 +1191,10 @@ async function runDaemonInstall(opts) {
|
|
|
2181
1191
|
platform: result.platform,
|
|
2182
1192
|
dest: result.dest,
|
|
2183
1193
|
message: result.message,
|
|
2184
|
-
hqRoot: hqRoot.root,
|
|
2185
|
-
hqRootSource: hqRoot.source,
|
|
2186
|
-
...(result.notice ? { notice: result.notice } : {}),
|
|
2187
1194
|
}, null, 2));
|
|
2188
1195
|
return;
|
|
2189
1196
|
}
|
|
2190
1197
|
console.log(result.message);
|
|
2191
|
-
if (result.notice)
|
|
2192
|
-
console.log(result.notice);
|
|
2193
1198
|
}
|
|
2194
1199
|
async function runDaemonUninstall(opts) {
|
|
2195
1200
|
const result = uninstallDaemonService({
|
|
@@ -2208,14 +1213,12 @@ async function runDaemonUninstall(opts) {
|
|
|
2208
1213
|
}
|
|
2209
1214
|
console.log(result.message);
|
|
2210
1215
|
}
|
|
2211
|
-
|
|
2212
|
-
const paths = deps.paths ?? buildInstallPaths({});
|
|
1216
|
+
async function runDaemonStatus(opts) {
|
|
2213
1217
|
const result = daemonServiceStatus({
|
|
2214
|
-
platform:
|
|
2215
|
-
paths,
|
|
2216
|
-
isLoaded: daemonServiceIsLoaded(deps.run ?? defaultRunCommand, deps.uid),
|
|
1218
|
+
platform: detectPlatform(),
|
|
1219
|
+
paths: buildInstallPaths({}),
|
|
2217
1220
|
});
|
|
2218
|
-
const state = readDaemonState(
|
|
1221
|
+
const state = readDaemonState(daemonDir());
|
|
2219
1222
|
const presenceRefusal = state?.presenceRefusal ?? null;
|
|
2220
1223
|
if (opts.json) {
|
|
2221
1224
|
console.log(JSON.stringify({
|
|
@@ -2225,21 +1228,12 @@ export async function runDaemonStatus(opts, deps = {}) {
|
|
|
2225
1228
|
running: result.running ?? false,
|
|
2226
1229
|
dest: result.dest,
|
|
2227
1230
|
message: result.message,
|
|
2228
|
-
...(result.lastResult !== undefined ? { lastResult: result.lastResult } : {}),
|
|
2229
|
-
...(result.lastRunFailed !== undefined ? { lastRunFailed: result.lastRunFailed } : {}),
|
|
2230
|
-
...(result.recordedHqRoot !== undefined ? { hqRoot: result.recordedHqRoot } : {}),
|
|
2231
|
-
...(result.rootValid !== undefined ? { rootValid: result.rootValid } : {}),
|
|
2232
|
-
...(result.notice ? { notice: result.notice } : {}),
|
|
2233
1231
|
mqttState: state?.mqttState,
|
|
2234
1232
|
presenceRefusal,
|
|
2235
1233
|
}, null, 2));
|
|
2236
1234
|
return;
|
|
2237
1235
|
}
|
|
2238
1236
|
console.log(result.message);
|
|
2239
|
-
if (result.recordedHqRoot)
|
|
2240
|
-
console.log(`hq root: ${result.recordedHqRoot}`);
|
|
2241
|
-
if (result.notice)
|
|
2242
|
-
console.log(result.notice);
|
|
2243
1237
|
if (presenceRefusal) {
|
|
2244
1238
|
console.log(`presence refusal: ${presenceRefusal.code} (HTTP ${presenceRefusal.status}); next retry at ${presenceRefusal.nextRetryAt}`);
|
|
2245
1239
|
}
|
|
@@ -2248,11 +1242,7 @@ export async function runDaemonStatus(opts, deps = {}) {
|
|
|
2248
1242
|
}
|
|
2249
1243
|
}
|
|
2250
1244
|
async function runDaemonDoctorCmd(opts) {
|
|
2251
|
-
|
|
2252
|
-
// only reads, so an unresolvable root is reported as absent, not fatal.
|
|
2253
|
-
const report = collectDaemonDoctor({
|
|
2254
|
-
hqRoot: process.env.HQ_ROOT?.trim() || findAncestorHqRoot(process.cwd()) || undefined,
|
|
2255
|
-
});
|
|
1245
|
+
const report = collectDaemonDoctor();
|
|
2256
1246
|
if (opts.json) {
|
|
2257
1247
|
console.log(JSON.stringify({ ok: !report.unhealthy, ...report }, null, 2));
|
|
2258
1248
|
return;
|