@indigoai-us/hq-cli 5.234.0 → 5.234.1
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
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [5.234.1] — 2026-09-27
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- A primary resume now confirms and syncs an Outpost lane queued during
|
|
10
|
+
owner-side admission. (#926)
|
|
11
|
+
- Outpost messages and account moves for children of primary-hosted lanes now
|
|
12
|
+
carry the bounded hire-grant context required by the owner. (#926)
|
|
13
|
+
- Outpost message resumes, moves, and admission queues now sync the returned
|
|
14
|
+
owner lane record back to the primary. (#926)
|
|
15
|
+
|
|
5
16
|
## [5.234.0] — 2026-09-27
|
|
6
17
|
|
|
7
18
|
### Added
|
|
@@ -8005,6 +8005,9 @@ export declare const COMMAND_CATALOG: readonly [{
|
|
|
8005
8005
|
}, {
|
|
8006
8006
|
readonly flags: "--worker <profile>";
|
|
8007
8007
|
readonly description: "Attach a personal worker profile when this message resumes the lane";
|
|
8008
|
+
}, {
|
|
8009
|
+
readonly flags: "--grant-context <base64url>";
|
|
8010
|
+
readonly description: "";
|
|
8008
8011
|
}, {
|
|
8009
8012
|
readonly flags: "--no-compact";
|
|
8010
8013
|
readonly description: "Skip the resume-time compaction check for this message";
|
|
@@ -10353,6 +10353,10 @@ export const COMMAND_CATALOG = [
|
|
|
10353
10353
|
"flags": "--worker <profile>",
|
|
10354
10354
|
"description": "Attach a personal worker profile when this message resumes the lane"
|
|
10355
10355
|
},
|
|
10356
|
+
{
|
|
10357
|
+
"flags": "--grant-context <base64url>",
|
|
10358
|
+
"description": ""
|
|
10359
|
+
},
|
|
10356
10360
|
{
|
|
10357
10361
|
"flags": "--no-compact",
|
|
10358
10362
|
"description": "Skip the resume-time compaction check for this message"
|
package/dist/commands/lanes.js
CHANGED
|
@@ -3841,7 +3841,7 @@ async function dispatchOutpostLaneCommand(ctx, lane, action, options) {
|
|
|
3841
3841
|
grantHierarchy = hierarchy;
|
|
3842
3842
|
grantContext = createOutpostHireGrantContext(lane, hierarchy);
|
|
3843
3843
|
}
|
|
3844
|
-
else if (action === "resume" &&
|
|
3844
|
+
else if ((action === "resume" || action === "message") &&
|
|
3845
3845
|
lane.senior.kind === "lane") {
|
|
3846
3846
|
grantContext = createOutpostHireGrantContext(lane, loadAllLanes(ctx.hqRoot()));
|
|
3847
3847
|
}
|
|
@@ -3987,9 +3987,14 @@ async function dispatchOutpostLaneCommand(ctx, lane, action, options) {
|
|
|
3987
3987
|
: action === "reparent"
|
|
3988
3988
|
? remote.lane !== null && typeof remote.lane === "object" &&
|
|
3989
3989
|
Array.isArray(remote.changed_descendant_ids)
|
|
3990
|
-
: (remote.delivery_status === "worker_spawned" ||
|
|
3990
|
+
: (((remote.delivery_status === "worker_spawned" ||
|
|
3991
3991
|
remote.delivery_status === "queued_on_target_account") &&
|
|
3992
|
-
remote.lane !== undefined)
|
|
3992
|
+
remote.lane !== undefined) ||
|
|
3993
|
+
(remote.delivery_status === "queued_on_admission" &&
|
|
3994
|
+
remote.lane !== null &&
|
|
3995
|
+
typeof remote.lane === "object" &&
|
|
3996
|
+
!Array.isArray(remote.lane) &&
|
|
3997
|
+
remote.lane.state === "queued")));
|
|
3993
3998
|
if (!resultConfirmed) {
|
|
3994
3999
|
throw new LanesError("outpost_delivery_unconfirmed", `Outpost ${outpostId} completed exec without a confirmed ${action} result for lane ${lane.lane_id}`, {
|
|
3995
4000
|
lane_id: lane.lane_id,
|
|
@@ -4010,6 +4015,21 @@ async function dispatchOutpostLaneCommand(ctx, lane, action, options) {
|
|
|
4010
4015
|
});
|
|
4011
4016
|
return;
|
|
4012
4017
|
}
|
|
4018
|
+
if (action === "message" &&
|
|
4019
|
+
(remote.delivery_status === "worker_spawned" ||
|
|
4020
|
+
remote.delivery_status === "queued_on_target_account" ||
|
|
4021
|
+
remote.delivery_status === "queued_on_admission")) {
|
|
4022
|
+
const ownerLane = syncLaneRecordFromOwner(ctx.hqRoot(), lane.lane_id, outpostId, remote.lane, undefined, { allowNonTerminal: true });
|
|
4023
|
+
printJson({
|
|
4024
|
+
...remote,
|
|
4025
|
+
lane_id: ownerLane.lane_id,
|
|
4026
|
+
lane: ownerLane,
|
|
4027
|
+
outpost_id: outpostId,
|
|
4028
|
+
outpost_command_id: dispatched.commandId,
|
|
4029
|
+
outpost_transport: "outposts_exec",
|
|
4030
|
+
});
|
|
4031
|
+
return;
|
|
4032
|
+
}
|
|
4013
4033
|
if (action === "reparent" || action === "resume") {
|
|
4014
4034
|
const ownerLane = syncLaneRecordFromOwner(ctx.hqRoot(), lane.lane_id, outpostId, remote.lane, undefined, { allowNonTerminal: true });
|
|
4015
4035
|
const descendants = [];
|
|
@@ -5872,7 +5892,7 @@ async function prepareAccountMove(ctx, lane, input) {
|
|
|
5872
5892
|
next.queued_at = undefined;
|
|
5873
5893
|
}
|
|
5874
5894
|
return next;
|
|
5875
|
-
}));
|
|
5895
|
+
}), input.grantContext);
|
|
5876
5896
|
return { lane: moved, from, to: target, copy, queued };
|
|
5877
5897
|
}, ctx.sleep);
|
|
5878
5898
|
}
|
|
@@ -5990,6 +6010,14 @@ function assertCurrentResumeAccountAvailable(ctx, lane) {
|
|
|
5990
6010
|
}
|
|
5991
6011
|
async function runMessage(ctx, laneId, opts) {
|
|
5992
6012
|
const hqRoot = ctx.hqRoot();
|
|
6013
|
+
const hireGrantContext = opts.grantContext === undefined
|
|
6014
|
+
? undefined
|
|
6015
|
+
: (() => {
|
|
6016
|
+
if (!ctx.isSsmOwnerDispatch()) {
|
|
6017
|
+
throw new LanesError("hire_grant_dispatch_unauthorized", "Message grant context is only valid on an Outpost owner dispatch", { lane_id: laneId });
|
|
6018
|
+
}
|
|
6019
|
+
return parseOutpostHireGrantContext(opts.grantContext, laneId);
|
|
6020
|
+
})();
|
|
5993
6021
|
let accepted = false;
|
|
5994
6022
|
let claimedMessages = [];
|
|
5995
6023
|
const markAccepted = () => {
|
|
@@ -6066,7 +6094,7 @@ async function runMessage(ctx, laneId, opts) {
|
|
|
6066
6094
|
}
|
|
6067
6095
|
// Check before transcript recovery, account probing, or message writes.
|
|
6068
6096
|
// The final state transition repeats this check under the senior lock.
|
|
6069
|
-
await withResumeHireAdmission(ctx, lane, () => undefined);
|
|
6097
|
+
await withResumeHireAdmission(ctx, lane, () => undefined, hireGrantContext);
|
|
6070
6098
|
lane = laneWithRecoveredProviderSession(hqRoot, lane);
|
|
6071
6099
|
const keepCurrentAccount = opts.account !== undefined && accountRequestKeepsCurrentLane(lane, opts.account);
|
|
6072
6100
|
if (keepCurrentAccount)
|
|
@@ -6162,6 +6190,7 @@ async function runMessage(ctx, laneId, opts) {
|
|
|
6162
6190
|
cliModel: opts.model?.trim() || undefined,
|
|
6163
6191
|
...(resumeProfile !== undefined ? { workerProfile: resumeProfile } : {}),
|
|
6164
6192
|
...(resumeEffort !== undefined ? { effort: resumeEffort } : {}),
|
|
6193
|
+
...(hireGrantContext !== undefined ? { grantContext: hireGrantContext } : {}),
|
|
6165
6194
|
pending: {
|
|
6166
6195
|
trigger: "message",
|
|
6167
6196
|
text: deliveryText,
|
|
@@ -6186,6 +6215,7 @@ async function runMessage(ctx, laneId, opts) {
|
|
|
6186
6215
|
...(automatic.historyReason !== undefined ? { accountHistoryReason: automatic.historyReason } : {}),
|
|
6187
6216
|
...(resumeProfile !== undefined ? { workerProfile: resumeProfile } : {}),
|
|
6188
6217
|
...(resumeEffort !== undefined ? { effort: resumeEffort } : {}),
|
|
6218
|
+
...(hireGrantContext !== undefined ? { grantContext: hireGrantContext } : {}),
|
|
6189
6219
|
pending: {
|
|
6190
6220
|
trigger: "message",
|
|
6191
6221
|
text: deliveryText,
|
|
@@ -6300,7 +6330,7 @@ async function runMessage(ctx, laneId, opts) {
|
|
|
6300
6330
|
});
|
|
6301
6331
|
archiveResumeMessage(hqRoot, laneId, dropboxMessage);
|
|
6302
6332
|
return started;
|
|
6303
|
-
});
|
|
6333
|
+
}, hireGrantContext);
|
|
6304
6334
|
}, ctx.sleep);
|
|
6305
6335
|
},
|
|
6306
6336
|
}, mechanism);
|
|
@@ -9752,6 +9782,7 @@ export function registerLanesCommand(parent, deps = {}) {
|
|
|
9752
9782
|
.option("--model <id>", "Model for the moved lane (with --account only)")
|
|
9753
9783
|
.option("--effort <level>", "Reasoning effort for the resumed provider turn")
|
|
9754
9784
|
.option("--worker <profile>", "Attach a personal worker profile when this message resumes the lane")
|
|
9785
|
+
.addOption(new Option("--grant-context <base64url>").hideHelp())
|
|
9755
9786
|
.option("--no-compact", "Skip the resume-time compaction check for this message")
|
|
9756
9787
|
.action(wrap(async (laneId, opts) => {
|
|
9757
9788
|
await runMessage(ctx, laneId, opts);
|