@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.
- package/CHANGELOG.md +47 -0
- package/assets/scaffold/core/scripts/handoff-knowledge-commit.sh +123 -0
- package/assets/scaffold/core/scripts/hq-detach.sh +169 -0
- package/dist/command-catalog.generated.d.ts +40 -2
- package/dist/command-catalog.generated.js +48 -2
- package/dist/commands/auth.js +19 -2
- package/dist/commands/core-bucket-c-handoff-knowledge-fast.d.ts +2 -0
- package/dist/commands/core-bucket-c-handoff-knowledge-fast.js +10 -0
- package/dist/commands/core-bucket-c-handoff-knowledge-native.d.ts +46 -0
- package/dist/commands/core-bucket-c-handoff-knowledge-native.js +284 -0
- package/dist/commands/core-bucket-c-hq-detach-fast.d.ts +2 -0
- package/dist/commands/core-bucket-c-hq-detach-fast.js +10 -0
- package/dist/commands/core-bucket-c-hq-detach-native.d.ts +43 -0
- package/dist/commands/core-bucket-c-hq-detach-native.js +241 -0
- package/dist/commands/core-bucket-c-work-mesh-offer-native.js +8 -2
- package/dist/commands/core.js +12 -0
- package/dist/commands/daemon.js +2 -0
- package/dist/commands/lanes-accounts.js +3 -1
- package/dist/commands/lanes-shared.d.ts +7 -0
- package/dist/commands/lanes.js +139 -17
- package/dist/commands/mesh.js +32 -19
- package/dist/commands/skill.js +9 -4
- package/dist/fast-scaffold.js +28 -0
- package/dist/lib/bot/inbox-poll-backoff-flag.d.ts +3 -5
- package/dist/lib/bot/inbox-poll-backoff-flag.js +20 -12
- package/dist/lib/bot/inbox-wake.d.ts +18 -0
- package/dist/lib/bot/inbox-wake.js +125 -0
- package/dist/lib/bot/run.d.ts +8 -0
- package/dist/lib/bot/run.js +51 -7
- package/dist/lib/bot/runtime/messages-stream.js +31 -3
- package/dist/lib/capacity/lane-login.js +1 -0
- package/dist/lib/daemon/catalog.d.ts +4 -0
- package/dist/lib/daemon/catalog.js +6 -3
- package/dist/lib/daemon/flag-monitor.d.ts +4 -1
- package/dist/lib/daemon/flag-monitor.js +12 -6
- package/dist/lib/daemon/flag.d.ts +2 -0
- package/dist/lib/daemon/flag.js +11 -5
- package/dist/lib/daemon/hq-child-bootstrap.mjs +47 -7
- package/dist/lib/daemon/kill-switch-flags.d.ts +5 -0
- package/dist/lib/daemon/kill-switch-flags.js +5 -0
- package/dist/lib/daemon/lanes-reconcile-loader.d.ts +7 -0
- package/dist/lib/daemon/lanes-reconcile-loader.js +24 -0
- package/dist/lib/daemon/lanes-reconcile-watcher.d.ts +17 -0
- package/dist/lib/daemon/lanes-reconcile-watcher.js +80 -0
- package/dist/lib/daemon/remote-control.d.ts +8 -5
- package/dist/lib/daemon/remote-control.js +8 -7
- package/dist/lib/daemon/run.d.ts +4 -1
- package/dist/lib/daemon/run.js +133 -20
- package/dist/lib/doctor/json-output.d.ts +15 -3
- package/dist/lib/doctor/json-output.js +13 -1
- package/dist/lib/lanes/accounts.js +2 -2
- package/dist/lib/lanes/daemon-reconcile.d.ts +3 -0
- package/dist/lib/lanes/daemon-reconcile.js +8 -0
- package/dist/lib/lanes/host-capacity.d.ts +4 -0
- package/dist/lib/lanes/host-capacity.js +10 -1
- package/dist/lib/lanes/index.d.ts +2 -2
- package/dist/lib/lanes/index.js +1 -1
- package/dist/lib/lanes/loop.d.ts +8 -0
- package/dist/lib/lanes/loop.js +35 -0
- package/dist/lib/lanes/quota-notice.d.ts +11 -11
- package/dist/lib/lanes/quota-notice.js +20 -29
- package/dist/lib/lanes/quota.d.ts +69 -50
- package/dist/lib/lanes/quota.js +146 -127
- package/dist/lib/lanes/reconcile-result.d.ts +10 -0
- package/dist/lib/lanes/reconcile-result.js +11 -0
- package/dist/lib/lanes/reconcile.d.ts +14 -0
- package/dist/lib/lanes/reconcile.js +77 -23
- package/dist/lib/lanes/watcher.d.ts +8 -0
- package/dist/lib/lanes/watcher.js +62 -20
- package/dist/lib/mesh/live/daemon/work-subscribe.d.ts +1 -1
- package/dist/lib/mesh/live/daemon/work-subscribe.js +8 -1
- package/dist/lib/mesh/live/paths.d.ts +2 -0
- package/dist/lib/mesh/live/paths.js +2 -0
- package/dist/lib/mesh/story-status.d.ts +2 -2
- package/dist/lib/mesh/story-status.js +2 -1
- package/dist/utils/resident-package-preload.js +18 -4
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
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
|
|
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
|
-
|
|
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": [
|