@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"
@@ -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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indigoai-us/hq-cli",
3
- "version": "5.234.0",
3
+ "version": "5.234.1",
4
4
  "description": "HQ by Indigo management CLI — modules and cloud sync",
5
5
  "main": "dist/index.js",
6
6
  "bin": {