@indigoai-us/hq-cli 5.345.127 → 5.345.129

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/assets/scaffold/core/scripts/handoff-knowledge-commit.sh +123 -0
  3. package/assets/scaffold/core/scripts/hq-detach.sh +169 -0
  4. package/dist/command-catalog.generated.d.ts +40 -2
  5. package/dist/command-catalog.generated.js +48 -2
  6. package/dist/commands/auth.js +19 -2
  7. package/dist/commands/core-bucket-c-handoff-knowledge-fast.d.ts +2 -0
  8. package/dist/commands/core-bucket-c-handoff-knowledge-fast.js +10 -0
  9. package/dist/commands/core-bucket-c-handoff-knowledge-native.d.ts +46 -0
  10. package/dist/commands/core-bucket-c-handoff-knowledge-native.js +284 -0
  11. package/dist/commands/core-bucket-c-hq-detach-fast.d.ts +2 -0
  12. package/dist/commands/core-bucket-c-hq-detach-fast.js +10 -0
  13. package/dist/commands/core-bucket-c-hq-detach-native.d.ts +43 -0
  14. package/dist/commands/core-bucket-c-hq-detach-native.js +241 -0
  15. package/dist/commands/core-bucket-c-work-mesh-offer-native.js +8 -2
  16. package/dist/commands/core.js +12 -0
  17. package/dist/commands/daemon.js +2 -0
  18. package/dist/commands/lanes-accounts.js +3 -1
  19. package/dist/commands/lanes-shared.d.ts +7 -0
  20. package/dist/commands/lanes.js +139 -17
  21. package/dist/commands/mesh.js +32 -19
  22. package/dist/commands/skill.js +9 -4
  23. package/dist/fast-scaffold.js +28 -0
  24. package/dist/lib/bot/inbox-poll-backoff-flag.d.ts +3 -5
  25. package/dist/lib/bot/inbox-poll-backoff-flag.js +20 -12
  26. package/dist/lib/bot/inbox-wake.d.ts +18 -0
  27. package/dist/lib/bot/inbox-wake.js +125 -0
  28. package/dist/lib/bot/run.d.ts +8 -0
  29. package/dist/lib/bot/run.js +51 -7
  30. package/dist/lib/bot/runtime/messages-stream.js +31 -3
  31. package/dist/lib/capacity/lane-login.js +1 -0
  32. package/dist/lib/daemon/catalog.d.ts +4 -0
  33. package/dist/lib/daemon/catalog.js +6 -3
  34. package/dist/lib/daemon/flag-monitor.d.ts +4 -1
  35. package/dist/lib/daemon/flag-monitor.js +12 -6
  36. package/dist/lib/daemon/flag.d.ts +2 -0
  37. package/dist/lib/daemon/flag.js +11 -5
  38. package/dist/lib/daemon/hq-child-bootstrap.mjs +47 -7
  39. package/dist/lib/daemon/kill-switch-flags.d.ts +5 -0
  40. package/dist/lib/daemon/kill-switch-flags.js +5 -0
  41. package/dist/lib/daemon/lanes-reconcile-loader.d.ts +7 -0
  42. package/dist/lib/daemon/lanes-reconcile-loader.js +24 -0
  43. package/dist/lib/daemon/lanes-reconcile-watcher.d.ts +17 -0
  44. package/dist/lib/daemon/lanes-reconcile-watcher.js +80 -0
  45. package/dist/lib/daemon/remote-control.d.ts +8 -5
  46. package/dist/lib/daemon/remote-control.js +8 -7
  47. package/dist/lib/daemon/run.d.ts +4 -1
  48. package/dist/lib/daemon/run.js +133 -20
  49. package/dist/lib/doctor/json-output.d.ts +15 -3
  50. package/dist/lib/doctor/json-output.js +13 -1
  51. package/dist/lib/lanes/accounts.js +2 -2
  52. package/dist/lib/lanes/daemon-reconcile.d.ts +3 -0
  53. package/dist/lib/lanes/daemon-reconcile.js +8 -0
  54. package/dist/lib/lanes/host-capacity.d.ts +4 -0
  55. package/dist/lib/lanes/host-capacity.js +10 -1
  56. package/dist/lib/lanes/index.d.ts +2 -2
  57. package/dist/lib/lanes/index.js +1 -1
  58. package/dist/lib/lanes/loop.d.ts +8 -0
  59. package/dist/lib/lanes/loop.js +35 -0
  60. package/dist/lib/lanes/quota-notice.d.ts +11 -11
  61. package/dist/lib/lanes/quota-notice.js +20 -29
  62. package/dist/lib/lanes/quota.d.ts +69 -50
  63. package/dist/lib/lanes/quota.js +146 -127
  64. package/dist/lib/lanes/reconcile-result.d.ts +10 -0
  65. package/dist/lib/lanes/reconcile-result.js +11 -0
  66. package/dist/lib/lanes/reconcile.d.ts +14 -0
  67. package/dist/lib/lanes/reconcile.js +77 -23
  68. package/dist/lib/lanes/watcher.d.ts +8 -0
  69. package/dist/lib/lanes/watcher.js +62 -20
  70. package/dist/lib/mesh/live/daemon/work-subscribe.d.ts +1 -1
  71. package/dist/lib/mesh/live/daemon/work-subscribe.js +8 -1
  72. package/dist/lib/mesh/live/paths.d.ts +2 -0
  73. package/dist/lib/mesh/live/paths.js +2 -0
  74. package/dist/lib/mesh/story-status.d.ts +2 -2
  75. package/dist/lib/mesh/story-status.js +2 -1
  76. package/dist/utils/resident-package-preload.js +18 -4
  77. package/package.json +1 -1
@@ -43,7 +43,7 @@ import { appendCappedHistory, listQuestionIds, readLane, readQuestion, retryUpda
43
43
  import { enforceRegistryApprovalGate } from "./approval-gate.js";
44
44
  import { readWorkerRunResult } from "./delivery.js";
45
45
  import { applyDefaultQuotaHold, clearAccountQuotaAfterSuccessfulTurnBestEffort, quotaSignalFromFields, readQuotaSignal, recordAccountQuota, } from "./quota.js";
46
- import { deliverQuotaHoldNotice, quotaHoldNotice } from "./quota-notice.js";
46
+ import { deliverQuotaNotice as deliverQuotaNoticeToSenior, quotaLaneNotice } from "./quota-notice.js";
47
47
  import { PROVIDER_REJECTED_REASON, QUOTA_STATUS, isProviderLoginFailure, providerRejectionDetails, readProviderRejection, } from "./provider-rejection.js";
48
48
  import { appendDropboxMessageAtPath, dropboxInboxHasMessages, readToolActivity, toolActivityPath } from "./dropbox.js";
49
49
  import { loadLanesConfig, providerProgressEventMinIntervalMs, providerQuotaDefaultHoldMs } from "./config.js";
@@ -154,14 +154,15 @@ function validFailureOutputTime(value, fallback) {
154
154
  : fallback;
155
155
  }
156
156
  export function routeProviderFailure(failure, readQuota, model, now) {
157
+ const structured = failure && failure.resets_at !== undefined ? { resets_at: failure.resets_at } : {};
157
158
  if (failure && failure.status === QUOTA_STATUS && isAccountQuotaFailure(failure)) {
158
159
  return {
159
- quota: quotaSignalFromFields({ api_error_status: QUOTA_STATUS, is_error: true, result: failure.message }, model, failure.output_at ? validFailureOutputTime(failure.output_at, now) : now),
160
+ quota: quotaSignalFromFields({ api_error_status: QUOTA_STATUS, is_error: true, result: failure.message, ...structured }, model, failure.output_at ? validFailureOutputTime(failure.output_at, now) : now),
160
161
  rejection: null,
161
162
  };
162
163
  }
163
164
  if (failure && failure.status === null && isAccountQuotaFailure(failure)) {
164
- const quota = quotaSignalFromFields({ api_error_status: undefined, is_error: true, result: failure.message }, model, failure.output_at ? validFailureOutputTime(failure.output_at, now) : now);
165
+ const quota = quotaSignalFromFields({ api_error_status: undefined, is_error: true, result: failure.message, ...structured }, model, failure.output_at ? validFailureOutputTime(failure.output_at, now) : now);
165
166
  if (quota)
166
167
  return { quota, rejection: null };
167
168
  }
@@ -1167,6 +1168,28 @@ async function settleKrFreshness(hqRoot, lane, manifestTurnId, at, deps, logDeci
1167
1168
  };
1168
1169
  });
1169
1170
  }
1171
+ /**
1172
+ * Tell the lane's senior once that a usage limit ended this lane. Called
1173
+ * only on the terminal write that changed the lane; the message id (lane id
1174
+ * and version) dedupes a retried append.
1175
+ */
1176
+ async function deliverQuotaNotice(hqRoot, lane, quota, at, deps, logDecision) {
1177
+ const notice = quotaLaneNotice(lane, quota);
1178
+ try {
1179
+ if (deps.deliverQuotaNotice) {
1180
+ await deps.deliverQuotaNotice(lane, notice.text);
1181
+ logDecision({ event: "quota_notice", at, delivered_to: "test_seam" });
1182
+ return;
1183
+ }
1184
+ const deliveredTo = deliverQuotaNoticeToSenior(hqRoot, lane, notice, at);
1185
+ logDecision({ event: "quota_notice", at, delivered_to: deliveredTo });
1186
+ }
1187
+ catch (err) {
1188
+ const message = err instanceof Error ? err.message : String(err);
1189
+ process.stderr.write(`hq lanes watcher: quota notice failed for ${lane.lane_id}: ${message}\n`);
1190
+ logDecision({ event: "quota_notice_failed", at, error: message });
1191
+ }
1192
+ }
1170
1193
  function findBlockerFreshnessSessionInbox(hqRoot, sessionId) {
1171
1194
  let candidates;
1172
1195
  try {
@@ -1457,6 +1480,18 @@ async function runWatcherLoopOwned(hqRoot, laneId, deps) {
1457
1480
  }
1458
1481
  const progressIntervalMs = deps.progressEventMinIntervalMs ?? readProgressIntervalMs(hqRoot, readLaneSoft(hqRoot, laneId));
1459
1482
  const spawnRepair = deps.spawnRepair ?? spawnEnvelopeRepair;
1483
+ const defaultAdmitQueued = async (root) => {
1484
+ const { admitQueuedNow } = await import("./reconcile.js");
1485
+ const host = (deps.resolveAdmissionHost ?? resolveProcessAdmissionHost)();
1486
+ const result = await admitQueuedNow(root, {
1487
+ now: () => new Date(now()),
1488
+ host,
1489
+ dryRun: false,
1490
+ spawnLaneDeps: { ...deps.retrySpawnDeps, admissionHost: host },
1491
+ ...(deps.retrySpawnDeps?.env ? { env: deps.retrySpawnDeps.env } : {}),
1492
+ });
1493
+ return result.admitted.map((entry) => entry.id);
1494
+ };
1460
1495
  const retryAccount = deps.retryAccount ?? ((root, lane, reason) => retryLaneOnAlternateAccount(root, lane, reason, "watcher", {
1461
1496
  ...deps.retrySpawnDeps,
1462
1497
  admissionHost: (deps.resolveAdmissionHost ?? resolveProcessAdmissionHost)(),
@@ -1765,28 +1800,17 @@ async function runWatcherLoopOwned(hqRoot, laneId, deps) {
1765
1800
  (classification.reason === "account_quota_exhausted" ||
1766
1801
  classification.reason === "account_model_unavailable")) {
1767
1802
  try {
1768
- const observedAt = new Date(now());
1769
- const quotaState = recordAccountQuota(hqRoot, quotaLane.provider, quotaLane.account, quota, {
1770
- now: observedAt,
1771
- unconfirmedHoldMs: providerQuotaDefaultHoldMs(loadLanesConfig(hqRoot).providers[quotaLane.provider]),
1772
- });
1773
- if (classification.reason === "account_quota_exhausted") {
1774
- const notice = quotaHoldNotice(quotaState, quotaLane.provider, quotaLane.account, quotaLane.lane_id);
1775
- if (notice) {
1776
- const deliveredTo = deliverQuotaHoldNotice(hqRoot, quotaLane, notice, observedAt.toISOString());
1777
- logDecision({ event: "quota_hold_notice", at: tick.emit.at, account: quotaLane.account, delivered_to: deliveredTo });
1778
- }
1779
- }
1803
+ recordAccountQuota(hqRoot, quotaLane.provider, quotaLane.account, quota, new Date(now()));
1780
1804
  }
1781
1805
  catch (err) {
1782
1806
  process.stderr.write(`hq lanes watcher: quota record failed for ${laneId}: ${err instanceof Error ? err.message : String(err)}\n`);
1783
1807
  }
1784
1808
  }
1785
- const accountRetryReason = quota
1786
- ? "usage_limit"
1787
- : isProviderLoginFailure(providerRejection)
1788
- ? "account_unavailable"
1789
- : null;
1809
+ // A usage limit fails only this lane: no automatic move to another
1810
+ // account. The senior is told and decides (owner decision 2026-10-14).
1811
+ const accountRetryReason = !quota && isProviderLoginFailure(providerRejection)
1812
+ ? "account_unavailable"
1813
+ : null;
1790
1814
  if (accountRetryReason && quotaLane?.account) {
1791
1815
  try {
1792
1816
  const retry = await retryAccount(hqRoot, quotaLane, accountRetryReason);
@@ -1945,6 +1969,24 @@ async function runWatcherLoopOwned(hqRoot, laneId, deps) {
1945
1969
  logDecision({ event: "keep_alive_terminal_trigger_failed", at: tick.emit.at, error: message });
1946
1970
  }
1947
1971
  }
1972
+ if (terminalWrite.changed &&
1973
+ (updated.terminal_reason === "account_quota_exhausted" || updated.terminal_reason === "account_model_unavailable")) {
1974
+ await deliverQuotaNotice(hqRoot, updated, quota ?? null, tick.emit.at, deps, logDecision);
1975
+ }
1976
+ if (terminalWrite.changed && updated.state !== "running" && updated.state !== "queued") {
1977
+ // The exit freed a running slot: admit queued lanes here rather
1978
+ // than waiting for a reconcile pass that may never run.
1979
+ try {
1980
+ const admitted = await (deps.admitQueued ?? defaultAdmitQueued)(hqRoot);
1981
+ if (admitted.length > 0)
1982
+ logDecision({ event: "queue_admitted", at: tick.emit.at, admitted });
1983
+ }
1984
+ catch (err) {
1985
+ const message = err instanceof Error ? err.message : String(err);
1986
+ process.stderr.write(`hq lanes watcher: queue admission failed after ${laneId}: ${message}\n`);
1987
+ logDecision({ event: "queue_admission_failed", at: tick.emit.at, error: message });
1988
+ }
1989
+ }
1948
1990
  }
1949
1991
  }
1950
1992
  lastSignalMs = tick.nextLastSignalMs;
@@ -14,7 +14,7 @@ export interface WorkCacheMqtt extends MeshMqttEventClient {
14
14
  export interface WorkCacheSubscriber {
15
15
  stop: () => Promise<void>;
16
16
  }
17
- export declare const AGENT_INBOX_PUSH_STATE_BASENAME = "agent-inbox-push.json";
17
+ export { AGENT_INBOX_PUSH_STATE_BASENAME } from "../paths.js";
18
18
  export declare function startWorkCacheSubscriber(opts: {
19
19
  meshRoot: string;
20
20
  fetchCredentials?: PersonalCredentialsFetcher;
@@ -8,7 +8,8 @@ import { createPersonalRealtimeFetcher, } from "./credentials.js";
8
8
  import { presignIotWssUrl } from "./presign.js";
9
9
  import { applyProjectViewPush, parseProjectViewPush } from "./live-cache.js";
10
10
  import { backoffDelayMs, RECONNECT_MIN_DELAY_MS } from "./presence.js";
11
- export const AGENT_INBOX_PUSH_STATE_BASENAME = "agent-inbox-push.json";
11
+ import { AGENT_INBOX_PUSH_STATE_BASENAME } from "../paths.js";
12
+ export { AGENT_INBOX_PUSH_STATE_BASENAME } from "../paths.js";
12
13
  const INBOX_PUSH_HEARTBEAT_MS = 5_000;
13
14
  function readInboxWakeSequence(meshRoot, onInfo) {
14
15
  const target = path.join(meshRoot, AGENT_INBOX_PUSH_STATE_BASENAME);
@@ -78,6 +79,7 @@ export async function startWorkCacheSubscriber(opts) {
78
79
  let heartbeatTimer = null;
79
80
  let generation = 0;
80
81
  let inboxSubscribed = false;
82
+ let inboxAgentUid;
81
83
  // Carry the sequence forward from the last state marker so a daemon restart
82
84
  // cannot reuse a value the watcher has already consumed.
83
85
  let wakeSequence = readInboxWakeSequence(opts.meshRoot, opts.onInfo);
@@ -92,6 +94,7 @@ export async function startWorkCacheSubscriber(opts) {
92
94
  connected,
93
95
  heartbeatAtMs: now().getTime(),
94
96
  wakeSequence,
97
+ ...(connected && inboxAgentUid ? { agentUid: inboxAgentUid } : {}),
95
98
  });
96
99
  }
97
100
  catch (error) {
@@ -115,6 +118,7 @@ export async function startWorkCacheSubscriber(opts) {
115
118
  if (stopped)
116
119
  return;
117
120
  inboxSubscribed = false;
121
+ inboxAgentUid = undefined;
118
122
  clearInboxHeartbeat();
119
123
  persistInboxState(false);
120
124
  const gen = ++generation;
@@ -133,6 +137,7 @@ export async function startWorkCacheSubscriber(opts) {
133
137
  bundle.topics.inbox === `hq/${bundle.actorUid}/inbox`
134
138
  ? bundle.topics.inbox
135
139
  : undefined;
140
+ inboxAgentUid = inboxTopic ? bundle.actorUid : undefined;
136
141
  if (!topic && !inboxTopic) {
137
142
  opts.onInfo?.("work cache subscribe skipped: credentials have no supported topic");
138
143
  return;
@@ -175,6 +180,7 @@ export async function startWorkCacheSubscriber(opts) {
175
180
  return;
176
181
  if (err) {
177
182
  inboxSubscribed = false;
183
+ inboxAgentUid = undefined;
178
184
  clearInboxHeartbeat();
179
185
  persistInboxState(false);
180
186
  opts.onInfo?.("agent inbox push subscribe failed");
@@ -212,6 +218,7 @@ export async function startWorkCacheSubscriber(opts) {
212
218
  if (stopped || gen !== generation)
213
219
  return;
214
220
  inboxSubscribed = false;
221
+ inboxAgentUid = undefined;
215
222
  clearInboxHeartbeat();
216
223
  persistInboxState(false);
217
224
  schedule();
@@ -2,6 +2,8 @@
2
2
  * Local Work Mesh Live paths under ~/.hq/work-mesh/.
3
3
  * Injectable root for tests (never touch the real HOME in unit tests).
4
4
  */
5
+ /** Content-free sequence file written by the mesh MQTT inbox subscriber. */
6
+ export declare const AGENT_INBOX_PUSH_STATE_BASENAME = "agent-inbox-push.json";
5
7
  export declare function workMeshRoot(home?: string, env?: NodeJS.ProcessEnv): string;
6
8
  export declare function workMeshSpoolPath(root?: string): string;
7
9
  export declare function workMeshHeldPath(root?: string): string;
@@ -5,6 +5,8 @@
5
5
  import * as os from "node:os";
6
6
  import * as path from "node:path";
7
7
  const WORK_MESH_DIRNAME = "work-mesh";
8
+ /** Content-free sequence file written by the mesh MQTT inbox subscriber. */
9
+ export const AGENT_INBOX_PUSH_STATE_BASENAME = "agent-inbox-push.json";
8
10
  export function workMeshRoot(home = os.homedir(), env = process.env) {
9
11
  const override = env.HQ_WORK_MESH_ROOT?.trim();
10
12
  if (override)
@@ -5,8 +5,8 @@ export type BoardStoryStatus = (typeof BOARD_STORY_STATUSES)[number];
5
5
  * need attention, while `dropped` is terminal; the Board has only one terminal
6
6
  * column (`done`).
7
7
  */
8
- export declare const LEDGER_STATES: readonly ["todo", "in_progress", "review", "waiting", "blocked", "done", "dropped"];
9
- export declare const ACCEPTED_LEDGER_STATES: readonly ["todo", "in_progress", "review", "waiting", "blocked", "done", "dropped", "in_review", "verification"];
8
+ export declare const LEDGER_STATES: readonly ["todo", "queued", "in_progress", "review", "waiting", "blocked", "done", "dropped"];
9
+ export declare const ACCEPTED_LEDGER_STATES: readonly ["todo", "queued", "in_progress", "review", "waiting", "blocked", "done", "dropped", "in_review", "verification"];
10
10
  export declare class UnknownProjectStoryStateError extends Error {
11
11
  readonly source: string;
12
12
  readonly storyId: string;
@@ -6,10 +6,11 @@ const boardStoryStatusSet = new Set(BOARD_STORY_STATUSES);
6
6
  * column (`done`).
7
7
  */
8
8
  export const LEDGER_STATES = [
9
- "todo", "in_progress", "review", "waiting", "blocked", "done", "dropped",
9
+ "todo", "queued", "in_progress", "review", "waiting", "blocked", "done", "dropped",
10
10
  ];
11
11
  const LEDGER_STATE_TO_BOARD_STATUS = {
12
12
  todo: "queued",
13
+ queued: "queued",
13
14
  in_progress: "in_progress",
14
15
  review: "review",
15
16
  // The four-column Board cannot represent waiting separately. Preserve the
@@ -53,21 +53,24 @@ export const RESIDENT_PACKAGE_MODULES = {
53
53
  "../lib/plan-limit-nag.js",
54
54
  "../utils/plan-gate-error.js",
55
55
  "../lib/daemon/mcp-oauth.js",
56
+ "../commands/lanes.js",
57
+ "commander",
56
58
  "@modelcontextprotocol/sdk/client/index.js",
57
59
  "@modelcontextprotocol/sdk/client/streamableHttp.js",
58
60
  "../utils/staged-npm-install.js",
59
61
  "open",
60
62
  "../lib/first-sync-next-step.js",
61
63
  "@indigoai-us/hq-cloud",
64
+ "../lib/lanes/reconcile.js",
62
65
  ],
63
66
  "daemon-logs-follow": [],
64
67
  "mesh-daemon": ["../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud"],
65
- "lanes-watch": ["../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud"],
66
- "monitor-wait": ["../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud"],
67
- "monitor-run": ["../commands/lanes.js", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud"],
68
+ "lanes-watch": ["../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud", "../lib/lanes/reconcile.js"],
69
+ "monitor-wait": ["../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud", "../lib/lanes/reconcile.js"],
70
+ "monitor-run": ["../commands/lanes.js", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud", "../lib/lanes/reconcile.js"],
68
71
  "agents-message-wait": ["../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud"],
69
72
  "integrations-oauth-wait": ["../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud"],
70
- "outpost-wait": ["../commands/lanes.js", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud"],
73
+ "outpost-wait": ["../commands/lanes.js", "../lib/plan-limit-nag.js", "../utils/plan-gate-error.js", "../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "open", "../utils/cognito-session.js", "../lib/first-sync-next-step.js", "@indigoai-us/hq-cloud", "../lib/lanes/reconcile.js"],
71
74
  "secrets-sandbox": [],
72
75
  "pkg-update": ["../sentry.js", "../lib/doctor/client-health-reason-codes-flag.js", "@indigoai-us/hq-flags-client", "../utils/cognito-session.js", "@indigoai-us/hq-cloud"],
73
76
  "pack-install": [
@@ -220,12 +223,15 @@ const LOADERS = {
220
223
  () => import("../lib/plan-limit-nag.js"),
221
224
  () => import("../utils/plan-gate-error.js"),
222
225
  () => import("../lib/daemon/mcp-oauth.js"),
226
+ () => import("../commands/lanes.js"),
227
+ () => import("commander"),
223
228
  () => import("@modelcontextprotocol/sdk/client/index.js"),
224
229
  () => import("@modelcontextprotocol/sdk/client/streamableHttp.js"),
225
230
  () => import("../utils/staged-npm-install.js"),
226
231
  () => import("open"),
227
232
  () => import("../lib/first-sync-next-step.js"),
228
233
  () => import("@indigoai-us/hq-cloud"),
234
+ () => import("../lib/lanes/reconcile.js"),
229
235
  ],
230
236
  "daemon-logs-follow": [],
231
237
  "mesh-daemon": [
@@ -255,6 +261,8 @@ const LOADERS = {
255
261
  () => import("../utils/cognito-session.js"),
256
262
  () => import("../lib/first-sync-next-step.js"),
257
263
  () => import("@indigoai-us/hq-cloud"),
264
+ // The watcher admits queued lanes in-process after a lane exits.
265
+ () => import("../lib/lanes/reconcile.js"),
258
266
  ],
259
267
  "monitor-wait": [
260
268
  async () => {
@@ -269,6 +277,8 @@ const LOADERS = {
269
277
  () => import("../utils/cognito-session.js"),
270
278
  () => import("../lib/first-sync-next-step.js"),
271
279
  () => import("@indigoai-us/hq-cloud"),
280
+ // The watcher admits queued lanes in-process after a lane exits.
281
+ () => import("../lib/lanes/reconcile.js"),
272
282
  ],
273
283
  "monitor-run": [
274
284
  () => import("../commands/lanes.js"),
@@ -284,6 +294,8 @@ const LOADERS = {
284
294
  () => import("../utils/cognito-session.js"),
285
295
  () => import("../lib/first-sync-next-step.js"),
286
296
  () => import("@indigoai-us/hq-cloud"),
297
+ // The watcher admits queued lanes in-process after a lane exits.
298
+ () => import("../lib/lanes/reconcile.js"),
287
299
  ],
288
300
  "agents-message-wait": [
289
301
  async () => {
@@ -327,6 +339,8 @@ const LOADERS = {
327
339
  () => import("../utils/cognito-session.js"),
328
340
  () => import("../lib/first-sync-next-step.js"),
329
341
  () => import("@indigoai-us/hq-cloud"),
342
+ // The watcher admits queued lanes in-process after a lane exits.
343
+ () => import("../lib/lanes/reconcile.js"),
330
344
  ],
331
345
  "secrets-sandbox": [],
332
346
  "pkg-update": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indigoai-us/hq-cli",
3
- "version": "5.345.127",
3
+ "version": "5.345.129",
4
4
  "description": "HQ by Indigo management CLI — modules and cloud sync",
5
5
  "main": "dist/index.js",
6
6
  "bin": {