@sailorbridge/client 0.2.3 → 0.2.4

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/dist/src/cli.js CHANGED
@@ -2,10 +2,10 @@
2
2
  import { createRequire } from "node:module";
3
3
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
4
4
 
5
- // .dist-releases/1784888160293-2271563/src/cli.js
5
+ // .dist-releases/1784894032002-2676534/src/cli.js
6
6
  import { hostname as hostname3 } from "node:os";
7
7
  import { writeSync } from "node:fs";
8
- // .dist-releases/1784888160293-2271563/src/auth/host-pairing.js
8
+ // .dist-releases/1784894032002-2676534/src/auth/host-pairing.js
9
9
  import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
10
10
  import { homedir, hostname, platform } from "node:os";
11
11
  import path from "node:path";
@@ -220,7 +220,7 @@ function _assertObject(value) {
220
220
  throw new Error("host pairing response must be an object");
221
221
  return value;
222
222
  }
223
- // .dist-releases/1784888160293-2271563/src/host/repo-tip-reporter.js
223
+ // .dist-releases/1784894032002-2676534/src/host/repo-tip-reporter.js
224
224
  import { createHash } from "node:crypto";
225
225
  import { existsSync, mkdirSync } from "node:fs";
226
226
  import { homedir as homedir2 } from "node:os";
@@ -402,10 +402,10 @@ ${error.message}`));
402
402
  proc.on("close", (code) => finish(code ?? 1));
403
403
  });
404
404
  }
405
- // .dist-releases/1784888160293-2271563/src/host/request-consumer.js
405
+ // .dist-releases/1784894032002-2676534/src/host/request-consumer.js
406
406
  import { hostname as hostname2 } from "node:os";
407
407
 
408
- // .dist-releases/1784888160293-2271563/src/driver/secrets.js
408
+ // .dist-releases/1784894032002-2676534/src/driver/secrets.js
409
409
  function redactSensitiveText(text, env = {}, explicitSecrets = []) {
410
410
  let redacted = text;
411
411
  for (const [key, value] of Object.entries(env)) {
@@ -424,16 +424,16 @@ function isSensitiveEnvKey(key) {
424
424
  return /(TOKEN|KEY|SECRET|AUTHORIZATION|PASSWORD)/i.test(key);
425
425
  }
426
426
 
427
- // .dist-releases/1784888160293-2271563/src/version.js
428
- var CLIENT_VERSION = "0.2.3";
429
- var CLIENT_GIT_SHA = "ed59f81313f2-dirty";
430
- var CLIENT_BUILD_DIRTY = true;
427
+ // .dist-releases/1784894032002-2676534/src/version.js
428
+ var CLIENT_VERSION = "0.2.4";
429
+ var CLIENT_GIT_SHA = "22d3b8376a97";
430
+ var CLIENT_BUILD_DIRTY = false;
431
431
  var CLIENT_VERSION_LABEL = formatClientVersion(CLIENT_VERSION, CLIENT_GIT_SHA);
432
432
  function formatClientVersion(version, gitSha) {
433
433
  return `${version}+git.${gitSha}`;
434
434
  }
435
435
 
436
- // .dist-releases/1784888160293-2271563/src/host/request-consumer.js
436
+ // .dist-releases/1784894032002-2676534/src/host/request-consumer.js
437
437
  var MAX_ERROR_LENGTH = 500;
438
438
  function defaultHostIdentity(config) {
439
439
  const captainId = config.captainId?.trim();
@@ -489,7 +489,7 @@ function limitErrorMessage(error, explicitSecrets) {
489
489
  const trimmed = redactSensitiveText(message, process.env, explicitSecrets).trim() || "host request starter failed";
490
490
  return trimmed.length <= MAX_ERROR_LENGTH ? trimmed : `${trimmed.slice(0, MAX_ERROR_LENGTH - 3)}...`;
491
491
  }
492
- // .dist-releases/1784888160293-2271563/src/product/start-request.js
492
+ // .dist-releases/1784894032002-2676534/src/product/start-request.js
493
493
  async function createAgentStartRequest(options) {
494
494
  const apiUrl = _required(options.apiUrl, "product API URL").replace(/\/+$/u, "");
495
495
  const accessToken = _required(options.accessToken, "product API bearer token");
@@ -549,7 +549,7 @@ function _string(value, label) {
549
549
  throw new Error(`${label} must be a non-empty string`);
550
550
  return value;
551
551
  }
552
- // .dist-releases/1784888160293-2271563/src/product/pair.js
552
+ // .dist-releases/1784894032002-2676534/src/product/pair.js
553
553
  async function createPair(options) {
554
554
  const apiUrl = _required2(options.apiUrl, "product API URL").replace(/\/+$/u, "");
555
555
  const accessToken = _required2(options.accessToken, "product API bearer token");
@@ -626,7 +626,7 @@ function _string2(value, label) {
626
626
  throw new Error(`${label} must be a non-empty string`);
627
627
  return value;
628
628
  }
629
- // .dist-releases/1784888160293-2271563/src/product/worker.js
629
+ // .dist-releases/1784894032002-2676534/src/product/worker.js
630
630
  async function createWorker(options) {
631
631
  const apiUrl = _required3(options.apiUrl, "product API URL").replace(/\/+$/u, "");
632
632
  const accessToken = _required3(options.accessToken, "product API bearer token");
@@ -690,7 +690,7 @@ function _string3(value, label) {
690
690
  throw new Error(`${label} must be a non-empty string`);
691
691
  return value;
692
692
  }
693
- // .dist-releases/1784888160293-2271563/src/driver/events.js
693
+ // .dist-releases/1784894032002-2676534/src/driver/events.js
694
694
  class DriverEventEmitter {
695
695
  callbacks = new Map;
696
696
  on(type, callback) {
@@ -705,7 +705,7 @@ class DriverEventEmitter {
705
705
  }
706
706
  }
707
707
  }
708
- // .dist-releases/1784888160293-2271563/src/driver/async-queue.js
708
+ // .dist-releases/1784894032002-2676534/src/driver/async-queue.js
709
709
  class AsyncQueue {
710
710
  values = [];
711
711
  waiters = [];
@@ -744,7 +744,7 @@ class AsyncQueue {
744
744
  }
745
745
  }
746
746
 
747
- // .dist-releases/1784888160293-2271563/src/driver/types.js
747
+ // .dist-releases/1784894032002-2676534/src/driver/types.js
748
748
  class DriverUnsupportedError extends Error {
749
749
  constructor(message) {
750
750
  super(message);
@@ -759,7 +759,7 @@ class DriverTargetNotReadyError extends Error {
759
759
  }
760
760
  }
761
761
 
762
- // .dist-releases/1784888160293-2271563/src/driver/sdk-loader.js
762
+ // .dist-releases/1784894032002-2676534/src/driver/sdk-loader.js
763
763
  async function loadSdk(loader, packageName, env = {}, installHint = `Install the optional SDK dependency ${packageName} and its peers for this transport.`) {
764
764
  try {
765
765
  return await loader();
@@ -769,7 +769,7 @@ async function loadSdk(loader, packageName, env = {}, installHint = `Install the
769
769
  }
770
770
  }
771
771
 
772
- // .dist-releases/1784888160293-2271563/src/driver/claude/driver.js
772
+ // .dist-releases/1784894032002-2676534/src/driver/claude/driver.js
773
773
  class ClaudeAgentSdkDriver {
774
774
  options;
775
775
  capabilities = { structured: true, resume: true, attach: false };
@@ -945,7 +945,7 @@ function asRecord(value) {
945
945
  function stringValue(value) {
946
946
  return typeof value === "string" ? value : undefined;
947
947
  }
948
- // .dist-releases/1784888160293-2271563/src/driver/codex/driver.js
948
+ // .dist-releases/1784894032002-2676534/src/driver/codex/driver.js
949
949
  class CodexSdkDriver {
950
950
  options;
951
951
  capabilities = { structured: true, resume: true, attach: false };
@@ -1126,7 +1126,7 @@ function asRecord2(value) {
1126
1126
  function stringValue2(value) {
1127
1127
  return typeof value === "string" ? value : undefined;
1128
1128
  }
1129
- // .dist-releases/1784888160293-2271563/src/driver/liveness-heuristics.js
1129
+ // .dist-releases/1784894032002-2676534/src/driver/liveness-heuristics.js
1130
1130
  var BUSY_MARKERS = ["Working (", "Waiting for background", "Pasted Content", "tab to queue"];
1131
1131
  var ANSI_PATTERN = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1B\\)|[PX^_][\s\S]*?\x1B\\)/g;
1132
1132
  function stripAnsi(text) {
@@ -1153,7 +1153,7 @@ function classifyInteractiveOutput(input) {
1153
1153
  function isOutputStable(now, lastOutputAt, idleStableMs) {
1154
1154
  return Boolean(lastOutputAt && now.getTime() - lastOutputAt.getTime() >= idleStableMs);
1155
1155
  }
1156
- // .dist-releases/1784888160293-2271563/src/driver/pty/loader.js
1156
+ // .dist-releases/1784894032002-2676534/src/driver/pty/loader.js
1157
1157
  async function loadNodePty(loader = defaultNodePtyLoader) {
1158
1158
  try {
1159
1159
  return await loader();
@@ -1179,7 +1179,7 @@ async function defaultNodePtyLoader() {
1179
1179
  return loaded;
1180
1180
  }
1181
1181
 
1182
- // .dist-releases/1784888160293-2271563/src/driver/pty/driver.js
1182
+ // .dist-releases/1784894032002-2676534/src/driver/pty/driver.js
1183
1183
  class PtyDriver {
1184
1184
  options;
1185
1185
  capabilities = { structured: false, resume: false, attach: false };
@@ -1331,12 +1331,12 @@ function tail(text, lines) {
1331
1331
  function sleep(ms) {
1332
1332
  return new Promise((resolve) => setTimeout(resolve, ms));
1333
1333
  }
1334
- // .dist-releases/1784888160293-2271563/src/driver/tmux/driver.js
1334
+ // .dist-releases/1784894032002-2676534/src/driver/tmux/driver.js
1335
1335
  import { mkdtemp, rm, writeFile as writeFile2 } from "node:fs/promises";
1336
1336
  import { tmpdir } from "node:os";
1337
1337
  import { join } from "node:path";
1338
1338
 
1339
- // .dist-releases/1784888160293-2271563/src/driver/tmux/launch.js
1339
+ // .dist-releases/1784894032002-2676534/src/driver/tmux/launch.js
1340
1340
  var ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
1341
1341
  var PANE_BOOTSTRAP_COMMAND = 'tmux set-option -t "$TMUX_PANE" remain-on-exit on >/dev/null 2>&1 || true; tmux wait-for -S "$1"; shift; exec "$@"';
1342
1342
  function buildTmuxNewSessionArgs(input) {
@@ -1359,7 +1359,7 @@ function validateEnv(env) {
1359
1359
  }
1360
1360
  }
1361
1361
 
1362
- // .dist-releases/1784888160293-2271563/src/driver/tmux/paste.js
1362
+ // .dist-releases/1784894032002-2676534/src/driver/tmux/paste.js
1363
1363
  function buildDispatchPlan(text, useTyping) {
1364
1364
  return {
1365
1365
  mode: useTyping ? "type-literal" : "paste-buffer",
@@ -1383,7 +1383,7 @@ function arraysEqual(left, right) {
1383
1383
  return left.length === right.length && left.every((item, index) => item === right[index]);
1384
1384
  }
1385
1385
 
1386
- // .dist-releases/1784888160293-2271563/src/driver/tmux/liveness.js
1386
+ // .dist-releases/1784894032002-2676534/src/driver/tmux/liveness.js
1387
1387
  var SHELL_COMMANDS = new Set(["", "bash", "zsh", "sh", "fish", "pwsh", "powershell"]);
1388
1388
  function classifyTmuxLiveness(input) {
1389
1389
  if (!input.hasSession) {
@@ -1403,7 +1403,7 @@ function isTmuxProcessAlive(command, runningCommands) {
1403
1403
  return !SHELL_COMMANDS.has(command);
1404
1404
  }
1405
1405
 
1406
- // .dist-releases/1784888160293-2271563/src/driver/tmux/runner.js
1406
+ // .dist-releases/1784894032002-2676534/src/driver/tmux/runner.js
1407
1407
  import { spawn as spawn2 } from "node:child_process";
1408
1408
  var DEFAULT_TIMEOUT_MS = 15000;
1409
1409
 
@@ -1528,7 +1528,7 @@ class TmuxClient {
1528
1528
  }
1529
1529
  }
1530
1530
 
1531
- // .dist-releases/1784888160293-2271563/src/driver/tmux/driver.js
1531
+ // .dist-releases/1784894032002-2676534/src/driver/tmux/driver.js
1532
1532
  var ATTACHED_STOP_GRACE_MS = 1e4;
1533
1533
  var DEFAULT_STOP_TIMEOUT_MS = 15000;
1534
1534
  var DEFAULT_READY_TIMEOUT_MS = 90000;
@@ -1923,12 +1923,12 @@ function isMissingTmuxSessionError(error) {
1923
1923
  ${error.result.stderr}`.toLowerCase();
1924
1924
  return text.includes("can't find session") || text.includes("cannot find session") || text.includes("no such session") || text.includes("session not found");
1925
1925
  }
1926
- // .dist-releases/1784888160293-2271563/src/relay/client.js
1926
+ // .dist-releases/1784894032002-2676534/src/relay/client.js
1927
1927
  import { Buffer as Buffer2 } from "node:buffer";
1928
1928
  import http from "node:http";
1929
1929
  import https from "node:https";
1930
1930
 
1931
- // .dist-releases/1784888160293-2271563/src/relay/errors.js
1931
+ // .dist-releases/1784894032002-2676534/src/relay/errors.js
1932
1932
  class RelayError extends Error {
1933
1933
  method;
1934
1934
  path;
@@ -1965,7 +1965,7 @@ class RelayProtocolError extends RelayError {
1965
1965
  }
1966
1966
  }
1967
1967
 
1968
- // .dist-releases/1784888160293-2271563/src/worker/protocol.js
1968
+ // .dist-releases/1784894032002-2676534/src/worker/protocol.js
1969
1969
  var DEFAULT_RELAY_URL = DEFAULT_PRODUCT_API_URL;
1970
1970
  var DEFAULT_WORKER = "host";
1971
1971
  var DEFAULT_WORKDIR = "~/sailorbridge-workdir";
@@ -1995,7 +1995,7 @@ function effectiveJobKind(kind, spec) {
1995
1995
  return kind === "stream" || spec.stream === true ? "stream" : kind;
1996
1996
  }
1997
1997
 
1998
- // .dist-releases/1784888160293-2271563/src/relay/client.js
1998
+ // .dist-releases/1784894032002-2676534/src/relay/client.js
1999
1999
  var JSON_CONTENT_TYPE = "application/json";
2000
2000
  var MAX_MAILBOX_LIMIT = 16;
2001
2001
  var MAX_WAIT_TIMEOUT_SEC = 120;
@@ -4061,7 +4061,7 @@ function redact(value, token) {
4061
4061
  function bytesToBase64(bytes) {
4062
4062
  return Buffer2.from(bytes).toString("base64");
4063
4063
  }
4064
- // .dist-releases/1784888160293-2271563/src/relay/config.js
4064
+ // .dist-releases/1784894032002-2676534/src/relay/config.js
4065
4065
  import { existsSync as existsSync2, readFileSync } from "node:fs";
4066
4066
  import { homedir as homedir3 } from "node:os";
4067
4067
  import path3 from "node:path";
@@ -4079,6 +4079,7 @@ function loadRelayConfig(env = process.env) {
4079
4079
  const captainId = optionalCaptainId(env.SAILORBRIDGE_CAPTAIN_ID) ?? stored?.captain_id;
4080
4080
  const hostId = nonEmpty(env.SAILORBRIDGE_HOST_ID) ?? stored?.host_id;
4081
4081
  const hostDisplayName = nonEmpty(env.SAILORBRIDGE_HOST_DISPLAY_NAME);
4082
+ const keyScope = !envBearerToken && stored ? "host" : undefined;
4082
4083
  return {
4083
4084
  relayUrl,
4084
4085
  bearerToken,
@@ -4086,7 +4087,8 @@ function loadRelayConfig(env = process.env) {
4086
4087
  ...session ? { session } : {},
4087
4088
  ...captainId ? { captainId } : {},
4088
4089
  ...hostId ? { hostId } : {},
4089
- ...hostDisplayName ? { hostDisplayName } : {}
4090
+ ...hostDisplayName ? { hostDisplayName } : {},
4091
+ ...keyScope ? { keyScope } : {}
4090
4092
  };
4091
4093
  }
4092
4094
  function loadStoredHostCredential(env, options = {}) {
@@ -4136,7 +4138,7 @@ function storedCaptainId(value) {
4136
4138
  }
4137
4139
  return;
4138
4140
  }
4139
- // .dist-releases/1784888160293-2271563/src/supervisor/retirement.js
4141
+ // .dist-releases/1784894032002-2676534/src/supervisor/retirement.js
4140
4142
  var DEFAULT_THRESHOLD = 3;
4141
4143
  var DEFAULT_WINDOW_MS = 30000;
4142
4144
  var DEFAULT_COOLDOWN_MS = 1000;
@@ -4211,7 +4213,7 @@ function isAuthoritativeRetirementReason(reason) {
4211
4213
  return reason === "monitor_fetch" || reason === "agent_session_patch";
4212
4214
  }
4213
4215
 
4214
- // .dist-releases/1784888160293-2271563/src/supervisor/wait.js
4216
+ // .dist-releases/1784894032002-2676534/src/supervisor/wait.js
4215
4217
  async function waitForWakeableTimeout(ms, setWake, sleep3) {
4216
4218
  if (sleep3) {
4217
4219
  await Promise.race([
@@ -4242,7 +4244,7 @@ async function waitForWakeableTimeout(ms, setWake, sleep3) {
4242
4244
  setWake(null);
4243
4245
  }
4244
4246
 
4245
- // .dist-releases/1784888160293-2271563/src/supervisor/mailbox.js
4247
+ // .dist-releases/1784894032002-2676534/src/supervisor/mailbox.js
4246
4248
  var CLEAR_TAG = "CLEAR";
4247
4249
  var REFRESH_TAG = "WORKFLOW-REFRESH";
4248
4250
  var SYNC_TAG = "SYNC";
@@ -4425,7 +4427,7 @@ class MailboxSupervisor {
4425
4427
  if (this.stopped && !deliver)
4426
4428
  return 0;
4427
4429
  try {
4428
- await this.deliverRefreshCue();
4430
+ await this.deliverRefreshCue(refreshNotices(pending));
4429
4431
  } catch (error) {
4430
4432
  await this.recordSurfaceBatch(pending, { status: "failed", error: this.redact(errorMessage2(error)) });
4431
4433
  return 0;
@@ -4437,8 +4439,8 @@ class MailboxSupervisor {
4437
4439
  await this.claimDeliveredControls(messages);
4438
4440
  return pending.length;
4439
4441
  }
4440
- async deliverRefreshCue() {
4441
- const text = refreshCue(this.options.cli);
4442
+ async deliverRefreshCue(notices = []) {
4443
+ const text = refreshCue(this.options.cli, notices);
4442
4444
  await this.options.driver.send(text, { verifyText: REFRESH_TAG });
4443
4445
  }
4444
4446
  async handleSyncMessages(messages, deliver = false) {
@@ -4722,7 +4724,7 @@ function formatWorkDoorbell(input, toDisplay) {
4722
4724
  throw new Error("cannot format an empty work doorbell");
4723
4725
  const sender = message.sender_agent_name ?? message.sender_role ?? "unknown";
4724
4726
  const tag = canonicalDoorbellTag(tagOf(message));
4725
- return `[${sender}->${toDisplay}] ${tag} ${doorbellToken(message.id)} \uD83D\uDCEC ${messages.length} new message(s). Read and claim: sail mailbox claim; complete obligation tags; direct workflows use the returned lease token.`;
4727
+ return `[${sender}->${toDisplay}] ${tag} ${doorbellToken(message.id)} \uD83D\uDCEC ${messages.length} new message(s). Read: sail mailbox claim. Conversational tags: answer with one sail reply no ack owed. Obligation tags: complete them; their claim output prints the ack line.`;
4726
4728
  }
4727
4729
  function canonicalDoorbellTag(tag) {
4728
4730
  const printable = Array.from(tag, (char) => char >= " " && char <= "~" ? char : " ").join("");
@@ -4735,10 +4737,27 @@ function unsurfaced(messages) {
4735
4737
  function doorbellToken(messageId) {
4736
4738
  return `#${messageId}#`;
4737
4739
  }
4738
- function refreshCue(_cli) {
4739
- return `${REFRESH_TAG}
4740
+ function refreshCue(_cli, notices = []) {
4741
+ return [
4742
+ REFRESH_TAG,
4743
+ ...notices,
4744
+ "Run `sail refresh` now to reload your role and instructions, then continue."
4745
+ ].join(`
4740
4746
 
4741
- Run \`sail refresh\` now to reload your role and instructions, then continue.`;
4747
+ `);
4748
+ }
4749
+ function refreshNotices(messages) {
4750
+ const notices = [];
4751
+ for (const message of messages) {
4752
+ const payload = message.payload_json;
4753
+ if (!payload || typeof payload !== "object" || Array.isArray(payload))
4754
+ continue;
4755
+ const notice = payload.notice;
4756
+ if (typeof notice === "string" && notice.trim() && !notices.includes(notice.trim())) {
4757
+ notices.push(notice.trim());
4758
+ }
4759
+ }
4760
+ return notices;
4742
4761
  }
4743
4762
  function saveContextCue(agentName, checkpointId) {
4744
4763
  return [
@@ -4780,19 +4799,19 @@ function ordinaryDeliveryAttempt(error) {
4780
4799
  function _isMissingModerator(error) {
4781
4800
  return error instanceof RelayHttpError && error.status === 400 && error.body.includes("no agents match");
4782
4801
  }
4783
- // .dist-releases/1784888160293-2271563/src/supervisor/runtime.js
4802
+ // .dist-releases/1784894032002-2676534/src/supervisor/runtime.js
4784
4803
  import path9 from "node:path";
4785
4804
  import { execFile } from "node:child_process";
4786
4805
  import { promisify } from "node:util";
4787
4806
 
4788
- // .dist-releases/1784888160293-2271563/src/host/managed-materialization.js
4807
+ // .dist-releases/1784894032002-2676534/src/host/managed-materialization.js
4789
4808
  import { createHash as createHash2, randomBytes } from "node:crypto";
4790
4809
  import { constants as fsConstants } from "node:fs";
4791
4810
  import { lstat, mkdir as mkdir3, open, readdir, rename, rm as rm2 } from "node:fs/promises";
4792
4811
  import { homedir as homedir5 } from "node:os";
4793
4812
  import path5 from "node:path";
4794
4813
 
4795
- // .dist-releases/1784888160293-2271563/src/host/memory-stub.js
4814
+ // .dist-releases/1784894032002-2676534/src/host/memory-stub.js
4796
4815
  import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile3 } from "node:fs/promises";
4797
4816
  import { homedir as homedir4 } from "node:os";
4798
4817
  import path4 from "node:path";
@@ -4939,7 +4958,7 @@ function _safePathLabel(value, field) {
4939
4958
  return trimmed;
4940
4959
  }
4941
4960
 
4942
- // .dist-releases/1784888160293-2271563/src/host/managed-materialization.js
4961
+ // .dist-releases/1784894032002-2676534/src/host/managed-materialization.js
4943
4962
  var MANIFEST_FILE = ".sailorbridge-managed-manifest.json";
4944
4963
  var BANNER_PREFIX = "# SailorBridge managed file";
4945
4964
  var HASH_RE = /^sha256:[a-f0-9]{64}$/u;
@@ -5465,7 +5484,7 @@ function _expandHome2(value) {
5465
5484
  return value;
5466
5485
  }
5467
5486
 
5468
- // .dist-releases/1784888160293-2271563/src/host/credential-guardian.js
5487
+ // .dist-releases/1784894032002-2676534/src/host/credential-guardian.js
5469
5488
  import { lstat as lstat2, readFile as readFile3, rename as rename2, symlink, unlink, writeFile as writeFile4 } from "node:fs/promises";
5470
5489
  import path6 from "node:path";
5471
5490
  var DEFAULT_CREDENTIAL_SWEEP_INTERVAL_MS = 60000;
@@ -5611,7 +5630,7 @@ function _tmpSibling(filePath) {
5611
5630
  return path6.join(path6.dirname(filePath), `.${path6.basename(filePath)}.sb-guardian.${process.pid}.${tmpSequence}.tmp`);
5612
5631
  }
5613
5632
 
5614
- // .dist-releases/1784888160293-2271563/src/supervisor/resolve.js
5633
+ // .dist-releases/1784894032002-2676534/src/supervisor/resolve.js
5615
5634
  var DEFAULT_CAPTURE_LINES = 200;
5616
5635
  var MAX_CAPTURE_LINES = 1000;
5617
5636
 
@@ -5817,7 +5836,7 @@ function defaultSleep(ms) {
5817
5836
  return new Promise((resolve) => setTimeout(resolve, ms));
5818
5837
  }
5819
5838
 
5820
- // .dist-releases/1784888160293-2271563/src/supervisor/transcript-backfill.js
5839
+ // .dist-releases/1784894032002-2676534/src/supervisor/transcript-backfill.js
5821
5840
  import { createHash as createHash3 } from "node:crypto";
5822
5841
  import {
5823
5842
  closeSync,
@@ -6486,7 +6505,7 @@ function errorMessage4(error) {
6486
6505
  return error instanceof Error ? error.message : String(error);
6487
6506
  }
6488
6507
 
6489
- // .dist-releases/1784888160293-2271563/src/supervisor/usage-collector.js
6508
+ // .dist-releases/1784894032002-2676534/src/supervisor/usage-collector.js
6490
6509
  import { statSync as statSync2 } from "node:fs";
6491
6510
  import path8 from "node:path";
6492
6511
  var SUPPORTED_USAGE_ENGINES = new Set(["claude", "codex"]);
@@ -6895,7 +6914,7 @@ function sourceUnreadableReason(source) {
6895
6914
  }
6896
6915
  }
6897
6916
 
6898
- // .dist-releases/1784888160293-2271563/src/supervisor/runtime.js
6917
+ // .dist-releases/1784894032002-2676534/src/supervisor/runtime.js
6899
6918
  var RESOLVE_CAPTURE_LINES = 200;
6900
6919
  var SHORT_LIVED_EXIT_MS = 5000;
6901
6920
  var STARTUP_OBSERVATION_MS = 1e4;
@@ -7565,7 +7584,7 @@ function errorMessage5(error) {
7565
7584
  function formatRestartCommand(command) {
7566
7585
  return command.map((part) => /^[A-Za-z0-9_./:=@%+-]+$/.test(part) ? part : `'${part.replaceAll("'", "'\\''")}'`).join(" ");
7567
7586
  }
7568
- // .dist-releases/1784888160293-2271563/src/supervisor/transport.js
7587
+ // .dist-releases/1784894032002-2676534/src/supervisor/transport.js
7569
7588
  var SUPPORTED_PHASE1_CLI_KINDS = ["claude", "codex"];
7570
7589
  var PHASE1_ENGINE_GATE_MESSAGE = "Only claude and codex engines are available in this release; opencode and custom CLI engines will open in the next release.";
7571
7590
  var PHASE1_TRANSPORT_GATE_MESSAGE = "Only tmux transport is available in this release; sdk, headless, and pty transports will open in the next release.";
@@ -7773,7 +7792,7 @@ function hasCodexSafetyDriverOptions(options) {
7773
7792
  return options?.codex?.sandboxMode !== undefined || options?.codex?.approvalPolicy !== undefined || options?.codex?.yolo !== undefined;
7774
7793
  }
7775
7794
 
7776
- // .dist-releases/1784888160293-2271563/src/supervisor/cli-options.js
7795
+ // .dist-releases/1784894032002-2676534/src/supervisor/cli-options.js
7777
7796
  function parseSuperviseArgs(argv) {
7778
7797
  const split = argv.indexOf("--");
7779
7798
  const flagArgs = split >= 0 ? argv.slice(0, split) : argv;
@@ -7925,7 +7944,7 @@ function optionalBoolean(value, label) {
7925
7944
  return false;
7926
7945
  throw new Error(`${label} must be true or false`);
7927
7946
  }
7928
- // .dist-releases/1784888160293-2271563/src/supervisor/tmux-availability.js
7947
+ // .dist-releases/1784894032002-2676534/src/supervisor/tmux-availability.js
7929
7948
  import { spawn as spawn3 } from "node:child_process";
7930
7949
  import { createInterface } from "node:readline";
7931
7950
  function isTmuxAvailable(spawnFn = spawn3) {
@@ -8042,7 +8061,7 @@ function _tmuxMissingMessage(platform2) {
8042
8061
  const how = platform2 === "darwin" ? "brew install tmux" : platform2 === "linux" ? "install tmux via your package manager (e.g. sudo apt-get install -y tmux)" : "install tmux";
8043
8062
  return `tmux is required in this release but was not found. Install tmux (${how}) and re-run.`;
8044
8063
  }
8045
- // .dist-releases/1784888160293-2271563/src/output-format.js
8064
+ // .dist-releases/1784894032002-2676534/src/output-format.js
8046
8065
  function parseOutputArgs(argv) {
8047
8066
  const separator = argv.indexOf("--");
8048
8067
  const localArgv = separator < 0 ? argv : argv.slice(0, separator);
@@ -8135,7 +8154,7 @@ ${normalized.split(`
8135
8154
  `)}`;
8136
8155
  }
8137
8156
 
8138
- // .dist-releases/1784888160293-2271563/src/plain-output-fields.js
8157
+ // .dist-releases/1784894032002-2676534/src/plain-output-fields.js
8139
8158
  var PREVIEW_LIMIT = 20;
8140
8159
  var UNSAFE_DISPLAY_CODE_POINT = /[\u007f-\u009f\u2028-\u202e\u2066-\u2069]/gu;
8141
8160
  function renderTaskPlain(command, value) {
@@ -8543,7 +8562,7 @@ function _omissionLine(total) {
8543
8562
  return total > PREVIEW_LIMIT ? `Omitted ${total - PREVIEW_LIMIT}; rerun with --format json for the complete response.` : undefined;
8544
8563
  }
8545
8564
 
8546
- // .dist-releases/1784888160293-2271563/src/host/cli.js
8565
+ // .dist-releases/1784894032002-2676534/src/host/cli.js
8547
8566
  var HOST_RELAY_SUBCOMMANDS = new Set(["consume", "heartbeat", "list", "register"]);
8548
8567
  async function runHostCommandFromCli(client, argv, config, io) {
8549
8568
  const sub = argv[0] ?? "list";
@@ -8781,7 +8800,7 @@ function optionalDisplayName(value) {
8781
8800
  const trimmed = value?.trim();
8782
8801
  return trimmed || undefined;
8783
8802
  }
8784
- // .dist-releases/1784888160293-2271563/src/host/service.js
8803
+ // .dist-releases/1784894032002-2676534/src/host/service.js
8785
8804
  import { execFile as execFileCb } from "node:child_process";
8786
8805
  import { createHash as createHash4 } from "node:crypto";
8787
8806
  import { constants as fsConstants2 } from "node:fs";
@@ -9302,7 +9321,7 @@ function writeServiceLog(io, event, fields) {
9302
9321
  io.stderr.write(`${JSON.stringify({ ts: new Date().toISOString(), event, ...fields ?? {} })}
9303
9322
  `);
9304
9323
  }
9305
- // .dist-releases/1784888160293-2271563/src/host/git-remote.js
9324
+ // .dist-releases/1784894032002-2676534/src/host/git-remote.js
9306
9325
  var GIT_SECRET_PATH_MARKERS = [
9307
9326
  "token",
9308
9327
  "credential",
@@ -9394,7 +9413,7 @@ function looksLikeCredential(segment2) {
9394
9413
  return value.length >= 32 && /^[A-Za-z0-9_-]+$/u.test(value);
9395
9414
  }
9396
9415
 
9397
- // .dist-releases/1784888160293-2271563/src/host/start-spec.js
9416
+ // .dist-releases/1784894032002-2676534/src/host/start-spec.js
9398
9417
  var TRANSPORTS = ["auto", "sdk", "pty", "tmux", "headless"];
9399
9418
  var SUPPORTED_PHASE1_ENGINES = ["claude", "codex"];
9400
9419
  var ENGINE_PATTERN = /^[a-z][a-z0-9._-]{0,63}$/u;
@@ -9644,7 +9663,7 @@ function _trimmed(value, label) {
9644
9663
  throw new Error(`${label} must not be empty`);
9645
9664
  return trimmed;
9646
9665
  }
9647
- // .dist-releases/1784888160293-2271563/src/host/workspace.js
9666
+ // .dist-releases/1784894032002-2676534/src/host/workspace.js
9648
9667
  import { spawn as spawn4 } from "node:child_process";
9649
9668
  import { existsSync as existsSync4 } from "node:fs";
9650
9669
  import { mkdir as mkdir5, readdir as readdir2, rename as rename4, stat } from "node:fs/promises";
@@ -9875,7 +9894,7 @@ function _safeSegment(value) {
9875
9894
  throw new Error("workspace path segment is empty after sanitizing");
9876
9895
  return segment2;
9877
9896
  }
9878
- // .dist-releases/1784888160293-2271563/src/host/workspace-inventory.js
9897
+ // .dist-releases/1784894032002-2676534/src/host/workspace-inventory.js
9879
9898
  import { access as access2 } from "node:fs/promises";
9880
9899
  import { constants } from "node:fs";
9881
9900
  import { execFile as execFile2 } from "node:child_process";
@@ -9967,7 +9986,7 @@ async function canAccess(path12, mode, deps) {
9967
9986
  return false;
9968
9987
  }
9969
9988
  }
9970
- // .dist-releases/1784888160293-2271563/src/upgrade.js
9989
+ // .dist-releases/1784894032002-2676534/src/upgrade.js
9971
9990
  import { spawn as spawn5 } from "node:child_process";
9972
9991
  import { execFile as execFileCb2 } from "node:child_process";
9973
9992
  import { readFile as readFile5 } from "node:fs/promises";
@@ -10025,7 +10044,7 @@ function _writeUpgradeResult(output, before, after, service) {
10025
10044
  `);
10026
10045
  }
10027
10046
 
10028
- // .dist-releases/1784888160293-2271563/src/host/auto-update.js
10047
+ // .dist-releases/1784894032002-2676534/src/host/auto-update.js
10029
10048
  var AUTO_UPDATE_HARD_DEADLINE_MS = 24 * 60 * 60 * 1000;
10030
10049
  var AUTO_UPDATE_ATTEMPT_COOLDOWN_MS = 60 * 1000;
10031
10050
  var MAX_UPDATE_ERROR_LENGTH = 500;
@@ -10121,7 +10140,7 @@ function _releaseTuple(value) {
10121
10140
  return null;
10122
10141
  return [Number(match[1]), Number(match[2]), Number(match[3])];
10123
10142
  }
10124
- // .dist-releases/1784888160293-2271563/src/host/host-config.js
10143
+ // .dist-releases/1784894032002-2676534/src/host/host-config.js
10125
10144
  import { chmod as chmod3, mkdir as mkdir6, readFile as readFile6, writeFile as writeFile6 } from "node:fs/promises";
10126
10145
  import { homedir as homedir10 } from "node:os";
10127
10146
  import path13 from "node:path";
@@ -10213,7 +10232,7 @@ function _parseHostConfig(text, configPath) {
10213
10232
  ...record.auto_update === undefined ? {} : { auto_update: record.auto_update }
10214
10233
  };
10215
10234
  }
10216
- // .dist-releases/1784888160293-2271563/src/host/host-workspace-cli.js
10235
+ // .dist-releases/1784894032002-2676534/src/host/host-workspace-cli.js
10217
10236
  async function runHostWorkspaceCommandFromCli(argv, io, deps = {}) {
10218
10237
  const configPath = deps.configPath ?? defaultHostConfigPath();
10219
10238
  const sub = argv[0] ?? "list";
@@ -10257,7 +10276,7 @@ function _renderAddPlain(result) {
10257
10276
  return result.note ? `${status} ${result.path}
10258
10277
  ${result.note}` : `${status} ${result.path}`;
10259
10278
  }
10260
- // .dist-releases/1784888160293-2271563/src/host/agent-env.js
10279
+ // .dist-releases/1784894032002-2676534/src/host/agent-env.js
10261
10280
  var RUNTIME_NATIVE_HOME_ENV = new Set(["CLAUDE_CONFIG_DIR", "CODEX_HOME"]);
10262
10281
  function buildAgentEnv(options) {
10263
10282
  const env = {};
@@ -10286,15 +10305,15 @@ function buildAgentEnv(options) {
10286
10305
  }
10287
10306
  return env;
10288
10307
  }
10289
- // .dist-releases/1784888160293-2271563/src/host/runtime-env.js
10308
+ // .dist-releases/1784894032002-2676534/src/host/runtime-env.js
10290
10309
  import path17 from "node:path";
10291
10310
 
10292
- // .dist-releases/1784888160293-2271563/src/host/agent-defaults.js
10311
+ // .dist-releases/1784894032002-2676534/src/host/agent-defaults.js
10293
10312
  import { chmod as chmod4, mkdir as mkdir7, readFile as readFile8, stat as stat2, writeFile as writeFile7 } from "node:fs/promises";
10294
10313
  import { homedir as homedir11 } from "node:os";
10295
10314
  import path15 from "node:path";
10296
10315
 
10297
- // .dist-releases/1784888160293-2271563/src/host/claude-settings.js
10316
+ // .dist-releases/1784894032002-2676534/src/host/claude-settings.js
10298
10317
  import { readFile as readFile7 } from "node:fs/promises";
10299
10318
  import path14 from "node:path";
10300
10319
  async function readHostClaudeSettings(claudeConfigDir) {
@@ -10335,7 +10354,7 @@ function _nonEmptyString(value) {
10335
10354
  return typeof value === "string" && value.trim() ? value : null;
10336
10355
  }
10337
10356
 
10338
- // .dist-releases/1784888160293-2271563/src/host/agent-defaults.js
10357
+ // .dist-releases/1784894032002-2676534/src/host/agent-defaults.js
10339
10358
  var CODEX_BLOCK_BEGIN = "# sailorbridge-terse-defaults:begin";
10340
10359
  var CODEX_BLOCK_END = "# sailorbridge-terse-defaults:end";
10341
10360
  var CODEX_MODEL_BLOCK_BEGIN = "# sailorbridge-host-model-settings:begin";
@@ -11465,7 +11484,7 @@ function _escapeRegExp(value) {
11465
11484
  return value.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
11466
11485
  }
11467
11486
 
11468
- // .dist-releases/1784888160293-2271563/src/host/engine-auth.js
11487
+ // .dist-releases/1784894032002-2676534/src/host/engine-auth.js
11469
11488
  import { lstat as lstat4, mkdir as mkdir8, readlink, realpath, stat as stat3, symlink as symlink2, unlink as unlink2 } from "node:fs/promises";
11470
11489
  import { homedir as homedir12 } from "node:os";
11471
11490
  import path16 from "node:path";
@@ -11555,7 +11574,7 @@ async function _ensureSymlink(linkPath, targetPath, sharedTargetPath) {
11555
11574
  await symlink2(targetPath, linkPath);
11556
11575
  }
11557
11576
 
11558
- // .dist-releases/1784888160293-2271563/src/host/runtime-env.js
11577
+ // .dist-releases/1784894032002-2676534/src/host/runtime-env.js
11559
11578
  async function materializeAgentRuntimeEnv(options) {
11560
11579
  const env = buildAgentEnv({
11561
11580
  hostEnv: options.hostEnv,
@@ -11595,7 +11614,7 @@ function _ensureRootSandboxEscape(env, engine, uid) {
11595
11614
  function _currentUid() {
11596
11615
  return typeof process.getuid === "function" ? process.getuid() : null;
11597
11616
  }
11598
- // .dist-releases/1784888160293-2271563/src/host/context-statusline.js
11617
+ // .dist-releases/1784894032002-2676534/src/host/context-statusline.js
11599
11618
  function renderClaudeContextStatusLine(payload) {
11600
11619
  const percent = _usedPercentage(payload);
11601
11620
  if (percent === null)
@@ -11633,7 +11652,7 @@ function _bar(percent) {
11633
11652
  const filled = Math.min(10, Math.max(0, Math.trunc(percent / 10)));
11634
11653
  return "█".repeat(filled) + "░".repeat(10 - filled);
11635
11654
  }
11636
- // .dist-releases/1784888160293-2271563/src/host/scratch-sweeper.js
11655
+ // .dist-releases/1784894032002-2676534/src/host/scratch-sweeper.js
11637
11656
  import { execFile as execFile3 } from "node:child_process";
11638
11657
  import { lstat as lstat5, readdir as readdir3, realpath as realpath2, unlink as unlink3 } from "node:fs/promises";
11639
11658
  import path18 from "node:path";
@@ -11776,7 +11795,7 @@ function _errno(error) {
11776
11795
  return String(error.code);
11777
11796
  return error instanceof Error ? error.message : String(error);
11778
11797
  }
11779
- // .dist-releases/1784888160293-2271563/src/host/launcher.js
11798
+ // .dist-releases/1784894032002-2676534/src/host/launcher.js
11780
11799
  var MAX_TMUX_SESSION_SUFFIX = 100;
11781
11800
  async function launchSupervisedAgent(input, deps = {}) {
11782
11801
  const spec = parseAgentStartSpec(input.spec);
@@ -11927,7 +11946,7 @@ async function _tmuxSessionExists(session) {
11927
11946
  throw error;
11928
11947
  }
11929
11948
  }
11930
- // .dist-releases/1784888160293-2271563/src/worker/capability.js
11949
+ // .dist-releases/1784894032002-2676534/src/worker/capability.js
11931
11950
  import { accessSync, constants as constants2, mkdirSync as mkdirSync3, mkdtempSync, readFileSync as readFileSync3, rmSync, writeFileSync as writeFileSync2 } from "node:fs";
11932
11951
  import os from "node:os";
11933
11952
  import path19 from "node:path";
@@ -12070,7 +12089,7 @@ function commandPath(command) {
12070
12089
  return null;
12071
12090
  }
12072
12091
 
12073
- // .dist-releases/1784888160293-2271563/src/host/worker-start-spec.js
12092
+ // .dist-releases/1784894032002-2676534/src/host/worker-start-spec.js
12074
12093
  var MAX_TAGS = 32;
12075
12094
  var TAG_PATTERN = /^[a-z0-9][a-z0-9=._:/-]{0,63}$/iu;
12076
12095
  var RESERVED_TAG_KEYS = new Set(["os", "kernel", "arch", "gpu", "mode", "role", "tool"]);
@@ -12130,16 +12149,16 @@ function _trimmed2(value, label) {
12130
12149
  return trimmed;
12131
12150
  }
12132
12151
 
12133
- // .dist-releases/1784888160293-2271563/src/host/worker-launcher.js
12152
+ // .dist-releases/1784894032002-2676534/src/host/worker-launcher.js
12134
12153
  import { statSync as statSync3 } from "node:fs";
12135
12154
  import os4 from "node:os";
12136
12155
  import path22 from "node:path";
12137
- // .dist-releases/1784888160293-2271563/src/worker/client.js
12156
+ // .dist-releases/1784894032002-2676534/src/worker/client.js
12138
12157
  import { readFileSync as readFileSync5 } from "node:fs";
12139
12158
  import os3 from "node:os";
12140
12159
  import path21 from "node:path";
12141
12160
 
12142
- // .dist-releases/1784888160293-2271563/src/worker/errors.js
12161
+ // .dist-releases/1784894032002-2676534/src/worker/errors.js
12143
12162
  class LeaseFencingRejected extends Error {
12144
12163
  status;
12145
12164
  constructor(status, message) {
@@ -12203,7 +12222,7 @@ function countsTowardWorkerSessionRebuild(path20) {
12203
12222
  return true;
12204
12223
  }
12205
12224
 
12206
- // .dist-releases/1784888160293-2271563/src/worker/executor.js
12225
+ // .dist-releases/1784894032002-2676534/src/worker/executor.js
12207
12226
  import { spawn as spawn6 } from "node:child_process";
12208
12227
  import { mkdirSync as mkdirSync4, mkdtempSync as mkdtempSync2, readFileSync as readFileSync4, realpathSync, rmSync as rmSync2, statfsSync, writeFileSync as writeFileSync3 } from "node:fs";
12209
12228
  import { tmpdir as tmpdir2, loadavg } from "node:os";
@@ -12211,7 +12230,7 @@ import os2 from "node:os";
12211
12230
  import path20 from "node:path";
12212
12231
  import { TextDecoder } from "node:util";
12213
12232
 
12214
- // .dist-releases/1784888160293-2271563/src/worker/async-queue.js
12233
+ // .dist-releases/1784894032002-2676534/src/worker/async-queue.js
12215
12234
  class AsyncByteQueue {
12216
12235
  maxSize;
12217
12236
  values = [];
@@ -12271,7 +12290,7 @@ class AsyncByteQueue {
12271
12290
  }
12272
12291
  }
12273
12292
 
12274
- // .dist-releases/1784888160293-2271563/src/worker/http.js
12293
+ // .dist-releases/1784894032002-2676534/src/worker/http.js
12275
12294
  import { request as httpRequest } from "node:http";
12276
12295
  import { request as httpsRequest } from "node:https";
12277
12296
  import { URLSearchParams as URLSearchParams2 } from "node:url";
@@ -12465,7 +12484,7 @@ function pathOnly(path20) {
12465
12484
  return path20.split("?", 1)[0] || path20;
12466
12485
  }
12467
12486
 
12468
- // .dist-releases/1784888160293-2271563/src/worker/stream-upload.js
12487
+ // .dist-releases/1784894032002-2676534/src/worker/stream-upload.js
12469
12488
  async function uploadStream(session, jobId, stream, leaseToken, chunks, workerId) {
12470
12489
  if (!leaseToken.trim())
12471
12490
  throw new Error("lease_token is required");
@@ -12475,7 +12494,7 @@ async function uploadStream(session, jobId, stream, leaseToken, chunks, workerId
12475
12494
  await session.http.postBytes(`/api/v1/jobs/${encodeURIComponent(jobId)}/stream-upload?${query.toString()}`, chunks, { "X-Lease-Token": leaseToken }, UPLOAD_TIMEOUTS);
12476
12495
  }
12477
12496
 
12478
- // .dist-releases/1784888160293-2271563/src/worker/executor.js
12497
+ // .dist-releases/1784894032002-2676534/src/worker/executor.js
12479
12498
  class StreamingProcessFailure extends Error {
12480
12499
  exitCode;
12481
12500
  stdout;
@@ -13007,7 +13026,7 @@ function errorMessage6(error) {
13007
13026
  return error instanceof Error ? error.message : String(error);
13008
13027
  }
13009
13028
 
13010
- // .dist-releases/1784888160293-2271563/src/worker/client.js
13029
+ // .dist-releases/1784894032002-2676534/src/worker/client.js
13011
13030
  var TOKEN_FILES = [
13012
13031
  "~/.config/sailorbridge/token",
13013
13032
  "/etc/sailorbridge/token"
@@ -13404,7 +13423,7 @@ function errorName2(error) {
13404
13423
  function errorMessage7(error) {
13405
13424
  return error instanceof Error ? error.message : String(error);
13406
13425
  }
13407
- // .dist-releases/1784888160293-2271563/src/host/worker-launcher.js
13426
+ // .dist-releases/1784894032002-2676534/src/host/worker-launcher.js
13408
13427
  var DEFAULT_WORKER_READY_TIMEOUT_MS = 60000;
13409
13428
  async function launchSupervisedWorker(input, deps = {}) {
13410
13429
  const logger = input.logger ?? (() => {});
@@ -13501,7 +13520,7 @@ function _assertWorkdir(workdir) {
13501
13520
  return workdir;
13502
13521
  }
13503
13522
 
13504
- // .dist-releases/1784888160293-2271563/src/host/daemon.js
13523
+ // .dist-releases/1784894032002-2676534/src/host/daemon.js
13505
13524
  async function runHostDaemon(options) {
13506
13525
  const logger = options.logger ?? (() => {});
13507
13526
  const sleep3 = options.sleep ?? ((ms) => new Promise((resolve2) => setTimeout(resolve2, ms)));
@@ -13865,7 +13884,7 @@ async function _drainOnce(options, identity, starter, logger, redactSecrets, aut
13865
13884
  return false;
13866
13885
  }
13867
13886
  }
13868
- // .dist-releases/1784888160293-2271563/src/host/enrollment-redeem.js
13887
+ // .dist-releases/1784894032002-2676534/src/host/enrollment-redeem.js
13869
13888
  var DEFAULT_NOT_FOUND_RETRIES = 3;
13870
13889
  var NOT_FOUND_RETRY_DELAY_MS = 500;
13871
13890
  function createEnrollmentRedeemer(options) {
@@ -14002,7 +14021,7 @@ function _role2(enrollment) {
14002
14021
  }
14003
14022
  return _string4(enrollment.roles[0], "roles[0]").trim();
14004
14023
  }
14005
- // .dist-releases/1784888160293-2271563/src/host/tutorial.js
14024
+ // .dist-releases/1784894032002-2676534/src/host/tutorial.js
14006
14025
  function buildTutorialSteps(state) {
14007
14026
  const paired = state.hasCredential;
14008
14027
  return [
@@ -14073,7 +14092,7 @@ async function runTutorial(options) {
14073
14092
  }
14074
14093
  return steps;
14075
14094
  }
14076
- // .dist-releases/1784888160293-2271563/src/events.js
14095
+ // .dist-releases/1784894032002-2676534/src/events.js
14077
14096
  var EVENT_COMMANDS = new Set(["add", "list", "enable", "disable", "rm"]);
14078
14097
  var EVENT_FLAGS = new Set(["at", "days", "message", "run-date", "session", "tag", "tz"]);
14079
14098
  var PRODUCT_DAYS_MODES = new Set(["once", "daily", "weekday"]);
@@ -14163,7 +14182,7 @@ function _assertListArgs(args) {
14163
14182
  }
14164
14183
  }
14165
14184
 
14166
- // .dist-releases/1784888160293-2271563/src/text-input.js
14185
+ // .dist-releases/1784894032002-2676534/src/text-input.js
14167
14186
  import { readFile as readFile9 } from "node:fs/promises";
14168
14187
  var _readUtf8File = async (file) => await readFile9(file, "utf8");
14169
14188
  async function readTextInput(input) {
@@ -14207,7 +14226,7 @@ async function readTextFileOrStdin(path23, input, unusedInputMessage, readUtf8Fi
14207
14226
  return await readTextFile(path23, readUtf8File2);
14208
14227
  }
14209
14228
 
14210
- // .dist-releases/1784888160293-2271563/src/ask.js
14229
+ // .dist-releases/1784894032002-2676534/src/ask.js
14211
14230
  var ASK_FLAGS = new Set(["body-file", "option", "reason", "recommend", "session", "title"]);
14212
14231
  async function runAskFromCli(client2, argv, config, input) {
14213
14232
  const args = _parseAskArgs(argv);
@@ -14322,7 +14341,7 @@ function _singleAskValue(values, name) {
14322
14341
  return entries[0];
14323
14342
  }
14324
14343
 
14325
- // .dist-releases/1784888160293-2271563/src/task.js
14344
+ // .dist-releases/1784894032002-2676534/src/task.js
14326
14345
  import { readFile as readFile10 } from "node:fs/promises";
14327
14346
  import { basename } from "node:path";
14328
14347
  var TASK_FLAGS = new Set(["after", "all", "artifact-id", "before", "body-file", "commit", "depends", "description", "description-file", "draft", "findings", "image", "level", "limit", "owner-of-resume", "pair", "priority", "query", "reason", "resume-condition", "resume-dependency", "session", "status", "type", "version"]);
@@ -14812,7 +14831,7 @@ function _taskListFooter(shown, returned, total, hasMore, cursor) {
14812
14831
  return `Shown ${shown} of ${total}${local}${next}`;
14813
14832
  }
14814
14833
 
14815
- // .dist-releases/1784888160293-2271563/src/team.js
14834
+ // .dist-releases/1784894032002-2676534/src/team.js
14816
14835
  var TEAM_BOOTSTRAP_ENGINES = new Set(["claude", "codex"]);
14817
14836
  var SLOT_SPEC_RE = /^([^=\s]+)=([^:@\s]+):([^:@\s]+)$/;
14818
14837
  var TEAM_PLAIN_LIMIT = 20;
@@ -14967,7 +14986,7 @@ function _slotTable(slots) {
14967
14986
  Shown ${shown.length} of ${slots.length}${omitted ? `; ${omitted} omitted (use --format json)` : ""}`;
14968
14987
  }
14969
14988
 
14970
- // .dist-releases/1784888160293-2271563/src/memory.js
14989
+ // .dist-releases/1784894032002-2676534/src/memory.js
14971
14990
  var VALUE_FLAGS = new Set(["file", "source"]);
14972
14991
  var MEMORY_SEARCH_PLAIN_LIMIT = 20;
14973
14992
  async function runMemoryFromCli(client2, argv, config, input, format) {
@@ -15102,7 +15121,7 @@ function _summary(value) {
15102
15121
  return value.replace(/\s+/gu, " ").trim().slice(0, 180);
15103
15122
  }
15104
15123
 
15105
- // .dist-releases/1784888160293-2271563/src/mailbox-send.js
15124
+ // .dist-releases/1784894032002-2676534/src/mailbox-send.js
15106
15125
  var SEND_FLAGS = new Set(["body-file", "commit", "session", "tag", "task-id", "task-version", "to-agents", "to-roles", "to-host"]);
15107
15126
  function parseMailboxSendArgs(argv) {
15108
15127
  const parsed = argsFromValues(parseFlagValues(argv));
@@ -15201,7 +15220,7 @@ function splitList(value) {
15201
15220
  return list?.length ? list : undefined;
15202
15221
  }
15203
15222
 
15204
- // .dist-releases/1784888160293-2271563/src/reply.js
15223
+ // .dist-releases/1784894032002-2676534/src/reply.js
15205
15224
  var REPLY_FLAGS = new Set(["agent", "body-file", "in-reply-to", "session"]);
15206
15225
  async function sendReplyFromCli(client2, argv, config, io) {
15207
15226
  const args = _parseReplyArgs(argv);
@@ -15258,12 +15277,13 @@ function _requiredReplyValue(values, name) {
15258
15277
  return value;
15259
15278
  }
15260
15279
 
15261
- // .dist-releases/1784888160293-2271563/src/worker-command.js
15280
+ // .dist-releases/1784894032002-2676534/src/worker-command.js
15262
15281
  async function runWorkerCommandFromCli(client2, argv, config, io, format = "plain") {
15282
+ const command = argv[0];
15283
+ _requireWorkerCredential(config.keyScope, command);
15263
15284
  const captainId = config.captainId;
15264
15285
  if (!captainId)
15265
15286
  throw new Error("SAILORBRIDGE_CAPTAIN_ID is required for worker commands");
15266
- const command = argv[0];
15267
15287
  switch (command) {
15268
15288
  case "list":
15269
15289
  return _listWorkers(client2, captainId, _requireSession(config.session), argv.slice(1), io, format);
@@ -15275,6 +15295,14 @@ async function runWorkerCommandFromCli(client2, argv, config, io, format = "plai
15275
15295
  throw new Error("worker command must be job, list, run, or serve");
15276
15296
  }
15277
15297
  }
15298
+ function _requireWorkerCredential(keyScope, command) {
15299
+ if (keyScope !== "host")
15300
+ return;
15301
+ if (command === "list") {
15302
+ throw new Error("worker list cannot use a paired host credential. " + "Open this team's Workers page in the SailorBridge console.");
15303
+ }
15304
+ throw new Error("worker run/job requires a member-runtime credential; this command loaded a paired host credential. " + "Retry from a member workspace where SAILORBRIDGE_TOKEN is already set.");
15305
+ }
15278
15306
  function _requireSession(session) {
15279
15307
  if (!session)
15280
15308
  throw new Error("SAILORBRIDGE_SESSION is required for worker list and run");
@@ -15439,7 +15467,7 @@ function _writeSignalStatus(remoteCode, localStatus, remoteStderr, io) {
15439
15467
  `);
15440
15468
  }
15441
15469
 
15442
- // .dist-releases/1784888160293-2271563/src/create.js
15470
+ // .dist-releases/1784894032002-2676534/src/create.js
15443
15471
  var CREATE_ENGINES = new Set(["claude", "codex"]);
15444
15472
  var DEFAULT_ENGINE = "claude";
15445
15473
  var WORKSPACE_PLAIN_LIMIT = 20;
@@ -15829,7 +15857,7 @@ function _workerPlain(hostId, workdir, result) {
15829
15857
  `);
15830
15858
  }
15831
15859
 
15832
- // .dist-releases/1784888160293-2271563/src/cli.js
15860
+ // .dist-releases/1784894032002-2676534/src/cli.js
15833
15861
  var FORMATTED_COMMANDS = new Set([
15834
15862
  "ask",
15835
15863
  "create",
@@ -16509,7 +16537,7 @@ function _usageText() {
16509
16537
  sailorbridge event add --at HH:MM --tz IANA --days once|daily|weekday --message TEXT [--run-date YYYY-MM-DD] [--tag T] [--disabled] [--session S]
16510
16538
  sailorbridge event list [--session S]
16511
16539
  sailorbridge event enable|disable|rm EVENT_ID [--session S]
16512
- sailorbridge ask --title TITLE --option LABEL::DESCRIPTION --option LABEL::DESCRIPTION --recommend A --reason TEXT [--reason TEXT] [--body-file PATH|-] [--session S]
16540
+ sailorbridge ask --title TITLE --option LABEL::DESCRIPTION --option LABEL::DESCRIPTION --recommend A --reason TEXT [--reason TEXT] --body-file - [--session S]
16513
16541
  sailorbridge ask list [--session S]
16514
16542
  sailorbridge ask get|status DECISION_ID [--session S]
16515
16543
  sailorbridge task create [--description TEXT|-|--body-file PATH|-|--description-file PATH|-] [--pair PAIR] [--draft|--status draft|new] [--type feature|bug|docs|chore] [--priority high|normal|low] [--level d1|d2|d3|d4] [--depends TASK[,TASK]] [--artifact-id ID] [--image PATH] [--session S]
@@ -16599,5 +16627,5 @@ function _looksLikeNetworkFailure(message) {
16599
16627
  return /fetch failed|network|ECONN(?:REFUSED|RESET)|ENOTFOUND|ETIMEDOUT/iu.test(message);
16600
16628
  }
16601
16629
 
16602
- //# debugId=56B72B0801B5CDF264756E2164756E21
16630
+ //# debugId=F9747B92FC45FFDB64756E2164756E21
16603
16631
  //# sourceMappingURL=cli.js.map