claude-use 11.26.0 → 11.28.0

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/index.cjs CHANGED
@@ -56,7 +56,10 @@ var init_categories_default = __esm({
56
56
  "usage-data",
57
57
  "ide",
58
58
  "cache",
59
- "scheduled_tasks.lock"
59
+ "scheduled_tasks.lock",
60
+ "policy-limits.json*",
61
+ "remote-settings.json*",
62
+ "state"
60
63
  ],
61
64
  history: [
62
65
  "projects",
@@ -282,7 +285,11 @@ var init_schema = __esm({
282
285
  headroom: import_zod.z.boolean().optional(),
283
286
  trackUsage: import_zod.z.boolean().optional(),
284
287
  /** The exact Claude Code version to run, as it is named in Claude Code's versions directory (`2.1.220`). A pin that is not installed fails the launch; it never falls back to the highest version. */
285
- claudeVersion: import_zod.z.string().regex(NUMERIC_DOTTED_VERSION_RE, "must be an exact dotted-numeric Claude Code version such as 2.1.220").optional()
288
+ claudeVersion: import_zod.z.string().regex(NUMERIC_DOTTED_VERSION_RE, "must be an exact dotted-numeric Claude Code version such as 2.1.220").optional(),
289
+ /** How long the launcher waits after its own output before it starts claude, so that output can be read before Claude Code takes over the terminal (`5s`, `500ms`). Applies only when a terminal is watching. */
290
+ delay: import_zod.z.string().regex(DURATION_RE, "must be a duration such as 5s or 500ms").optional(),
291
+ /** Whether the launcher waits for a key press after its own output before it starts claude. Takes the place of `delay` when both are set. Applies only when a terminal is watching. */
292
+ pause: import_zod.z.boolean().optional()
286
293
  });
287
294
  CREDENTIAL_TARGETS = ["bearer", "apiKey", "oauthToken"];
288
295
  PROVIDER_CREDENTIAL_TARGETS = ["bearer", "apiKey"];
@@ -1385,6 +1392,12 @@ function flattenLayers(layers, options) {
1385
1392
  if (layer.launch.claudeVersion !== void 0) {
1386
1393
  launch.claudeVersion = layer.launch.claudeVersion;
1387
1394
  }
1395
+ if (layer.launch.delay !== void 0) {
1396
+ launch.delay = layer.launch.delay;
1397
+ }
1398
+ if (layer.launch.pause !== void 0) {
1399
+ launch.pause = layer.launch.pause;
1400
+ }
1388
1401
  }
1389
1402
  if (layer.entries === void 0) {
1390
1403
  continue;
@@ -1483,6 +1496,12 @@ var init_flatten = __esm({
1483
1496
  });
1484
1497
 
1485
1498
  // src/resolve/decide.ts
1499
+ function unclassifiedEntryMessage(names) {
1500
+ const quoted = names.map((name) => `"${name}"`).join(", ");
1501
+ const subject = names.length === 1 ? `${quoted} is not` : `${String(names.length)} entries are not`;
1502
+ const excluded = names.length === 1 ? "it is excluded" : `they are excluded: ${quoted}`;
1503
+ return `${subject} in the category map, so ${excluded}. Run \`agent-shim configure\` to classify ${names.length === 1 ? "it" : "them"}, which records the answer in the local overlay without touching the shipped default map.`;
1504
+ }
1486
1505
  function selectRule(relPath, flattened, context) {
1487
1506
  const eliminated = [];
1488
1507
  for (const rule of matchingRules(flattened, relPath)) {
@@ -1520,7 +1539,7 @@ function resolveEntry(relPath, params) {
1520
1539
  diagnostics.push({
1521
1540
  code: "UNCLASSIFIED_ENTRY",
1522
1541
  severity: "warning",
1523
- message: `"${head}" is not in the category map, so it is excluded. Run \`agent-shim configure\` to classify it, which records the answer in the local overlay without touching the shipped default map.`,
1542
+ message: unclassifiedEntryMessage([head]),
1524
1543
  subject: head
1525
1544
  });
1526
1545
  return { decision: { relPath, shared: false, via: "unclassified", category }, diagnostics };
@@ -2955,7 +2974,7 @@ var init_package = __esm({
2955
2974
  "package.json"() {
2956
2975
  package_default = {
2957
2976
  name: "claude-use",
2958
- version: "11.26.0",
2977
+ version: "11.28.0",
2959
2978
  description: "A profile manager and launcher for Claude Code that lets one person run multiple logins from one machine while controlling what gets shared between them.",
2960
2979
  license: "MIT",
2961
2980
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -4121,6 +4140,40 @@ var init_supervisor = __esm({
4121
4140
  }
4122
4141
  });
4123
4142
 
4143
+ // src/logStyle.ts
4144
+ function styledDiagnostic(style, colour, line) {
4145
+ const lead = DIAGNOSTIC_LEAD.exec(line);
4146
+ if (lead === null) {
4147
+ return style([colour], line);
4148
+ }
4149
+ const [whole, prefix = "", code = "", separator = ""] = lead;
4150
+ return `${style([colour], prefix)}${style([colour, "bold"], code)}${style([colour], `${separator}${line.slice(whole.length)}`)}`;
4151
+ }
4152
+ function createLogPort(sinks, styleFor) {
4153
+ return {
4154
+ info: (message) => {
4155
+ sinks.out(styleFor.out(["dim"], message));
4156
+ },
4157
+ warn: (message) => {
4158
+ sinks.warn(styledDiagnostic(styleFor.err, "yellow", message));
4159
+ },
4160
+ error: (message) => {
4161
+ sinks.err(styledDiagnostic(styleFor.err, "red", message));
4162
+ }
4163
+ };
4164
+ }
4165
+ function styleTextFor(stream) {
4166
+ return (formats, text) => (0, import_node_util.styleText)([...formats], text, { stream });
4167
+ }
4168
+ var import_node_util, DIAGNOSTIC_LEAD;
4169
+ var init_logStyle = __esm({
4170
+ "src/logStyle.ts"() {
4171
+ "use strict";
4172
+ import_node_util = require("node:util");
4173
+ DIAGNOSTIC_LEAD = /^(agent-shim: )([A-Z][A-Z0-9_]*)(: )/;
4174
+ }
4175
+ });
4176
+
4124
4177
  // src/realPorts.ts
4125
4178
  function isEnoent3(error) {
4126
4179
  return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
@@ -4359,7 +4412,7 @@ function realResolveClaudeBinary(isOwnBinary) {
4359
4412
  function realInstalledClaudeVersions() {
4360
4413
  return installedVersions(listVersionsDir(defaultVersionsDir()));
4361
4414
  }
4362
- var import_node_child_process2, import_node_crypto8, import_node_fs2, import_node_os2, import_node_path14, import_node_sea, realFsPort, OWNER_ONLY_DIR_MODE, OWNER_ONLY_FILE_MODE, PERMISSION_BITS, realFarmFs, INT32_BYTE_LENGTH, PS_TIMEOUT_MS, realRunPort, MACOS_GUI_SESSION_MANAGER, realCredentialPort, SOCKET_PERMISSION_BITS, realHeadroomSocketTrust, realSpawnPort, realProcPort, EXECUTE_BITS_MASK, WINDOWS_DEFAULT_PATHEXT;
4415
+ var import_node_child_process2, import_node_crypto8, import_node_fs2, import_node_os2, import_node_path14, import_node_sea, realFsPort, OWNER_ONLY_DIR_MODE, OWNER_ONLY_FILE_MODE, PERMISSION_BITS, realFarmFs, INT32_BYTE_LENGTH, KEY_POLL_MS, CTRL_C_BYTE, realHoldPort, PS_TIMEOUT_MS, realRunPort, MACOS_GUI_SESSION_MANAGER, realCredentialPort, SOCKET_PERMISSION_BITS, realHeadroomSocketTrust, realSpawnPort, realProcPort, realLogPort, EXECUTE_BITS_MASK, WINDOWS_DEFAULT_PATHEXT;
4363
4416
  var init_realPorts = __esm({
4364
4417
  "src/realPorts.ts"() {
4365
4418
  "use strict";
@@ -4376,6 +4429,7 @@ var init_realPorts = __esm({
4376
4429
  init_ensure();
4377
4430
  init_supervisor();
4378
4431
  init_state2();
4432
+ init_logStyle();
4379
4433
  realFsPort = {
4380
4434
  readFileUtf8(filePath) {
4381
4435
  try {
@@ -4507,6 +4561,31 @@ var init_realPorts = __esm({
4507
4561
  }
4508
4562
  };
4509
4563
  INT32_BYTE_LENGTH = 4;
4564
+ KEY_POLL_MS = 25;
4565
+ CTRL_C_BYTE = 3;
4566
+ realHoldPort = {
4567
+ attended: () => process.stdin.isTTY && process.stdout.isTTY,
4568
+ sleep: realSleepSync,
4569
+ waitForKey: () => {
4570
+ process.stdin.setRawMode(true);
4571
+ try {
4572
+ const buffer = Buffer.alloc(1);
4573
+ for (; ; ) {
4574
+ try {
4575
+ const read = import_node_fs2.default.readSync(process.stdin.fd, buffer, 0, buffer.length, null);
4576
+ return read > 0 && buffer[0] === CTRL_C_BYTE ? "interrupt" : "key";
4577
+ } catch (error) {
4578
+ if (!(error instanceof Error && "code" in error && error.code === "EAGAIN")) {
4579
+ throw error;
4580
+ }
4581
+ realSleepSync(KEY_POLL_MS);
4582
+ }
4583
+ }
4584
+ } finally {
4585
+ process.stdin.setRawMode(false);
4586
+ }
4587
+ }
4588
+ };
4510
4589
  PS_TIMEOUT_MS = 2e3;
4511
4590
  realRunPort = {
4512
4591
  run(command, args) {
@@ -4581,6 +4660,16 @@ var init_realPorts = __esm({
4581
4660
  argv: process.argv.slice(2),
4582
4661
  exit: (code) => process.exit(code)
4583
4662
  };
4663
+ realLogPort = createLogPort(
4664
+ { out: (line) => {
4665
+ console.log(line);
4666
+ }, warn: (line) => {
4667
+ console.warn(line);
4668
+ }, err: (line) => {
4669
+ console.error(line);
4670
+ } },
4671
+ { out: styleTextFor(process.stdout), err: styleTextFor(process.stderr) }
4672
+ );
4584
4673
  EXECUTE_BITS_MASK = 73;
4585
4674
  WINDOWS_DEFAULT_PATHEXT = ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PS1";
4586
4675
  }
@@ -7337,6 +7426,7 @@ function parseLauncherArgv(argv) {
7337
7426
  let configProfile;
7338
7427
  let provider;
7339
7428
  let claudeVersion;
7429
+ let delay;
7340
7430
  const booleans = {};
7341
7431
  const categoryFlags = [];
7342
7432
  const shareFlags = [];
@@ -7394,6 +7484,9 @@ function parseLauncherArgv(argv) {
7394
7484
  case "--claude-version":
7395
7485
  claudeVersion = value;
7396
7486
  break;
7487
+ case "--delay":
7488
+ delay = value;
7489
+ break;
7397
7490
  case "--category":
7398
7491
  categoryFlags.push(value);
7399
7492
  break;
@@ -7416,6 +7509,7 @@ function parseLauncherArgv(argv) {
7416
7509
  ...configProfile === void 0 ? {} : { configProfile },
7417
7510
  ...provider === void 0 ? {} : { provider },
7418
7511
  ...claudeVersion === void 0 ? {} : { claudeVersion },
7512
+ ...delay === void 0 ? {} : { delay },
7419
7513
  ...native ? { native: true } : {},
7420
7514
  ...booleans,
7421
7515
  categoryFlags,
@@ -7439,13 +7533,14 @@ var init_argv = __esm({
7439
7533
  positional;
7440
7534
  flag;
7441
7535
  };
7442
- VALUED_FLAGS = ["--identity", "--config-profile", "--provider", "--claude-version", "--category", "--share", "--hide"];
7536
+ VALUED_FLAGS = ["--identity", "--config-profile", "--provider", "--claude-version", "--delay", "--category", "--share", "--hide"];
7443
7537
  BOOLEAN_FLAGS = [
7444
7538
  { flag: "--headroom", key: "headroom" },
7445
7539
  { flag: "--track-usage", key: "trackUsage" },
7446
7540
  { flag: "--skip-permissions", key: "skipPermissions" },
7447
7541
  { flag: "--remote-control", key: "remoteControl" },
7448
- { flag: "--wait", key: "wait" }
7542
+ { flag: "--wait", key: "wait" },
7543
+ { flag: "--pause", key: "pause" }
7449
7544
  ];
7450
7545
  LAUNCHER_FLAG_NAMES = [
7451
7546
  ...VALUED_FLAGS,
@@ -7632,9 +7727,23 @@ function resolveLaunchFlags(params) {
7632
7727
  skipPermissions: params.flags?.skipPermissions ?? parseEnvBool("AGENT_SHIM_SKIP_PERMISSIONS", params.env.AGENT_SHIM_SKIP_PERMISSIONS) ?? params.cascade?.skipPermissions ?? false,
7633
7728
  remoteControl: params.flags?.remoteControl ?? parseEnvBool("AGENT_SHIM_REMOTE_CONTROL", params.env.AGENT_SHIM_REMOTE_CONTROL) ?? params.cascade?.remoteControl ?? false,
7634
7729
  headroom: params.flags?.headroom ?? parseEnvBool("AGENT_SHIM_HEADROOM", params.env.AGENT_SHIM_HEADROOM) ?? params.cascade?.headroom ?? false,
7635
- trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true
7730
+ trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true,
7731
+ pause: params.flags?.pause ?? parseEnvBool("AGENT_SHIM_PAUSE", params.env.AGENT_SHIM_PAUSE) ?? params.cascade?.pause ?? false,
7732
+ delayMs: resolveDelayMs(params)
7636
7733
  };
7637
7734
  }
7735
+ function resolveDelayMs(params) {
7736
+ const fromEnv = params.env.AGENT_SHIM_DELAY === "" ? void 0 : params.env.AGENT_SHIM_DELAY;
7737
+ const [literal, source] = params.flags?.delay !== void 0 ? [params.flags.delay, "--delay"] : fromEnv !== void 0 ? [fromEnv, "AGENT_SHIM_DELAY"] : [params.cascade?.delay, "launch.delay"];
7738
+ if (literal === void 0) {
7739
+ return 0;
7740
+ }
7741
+ try {
7742
+ return parseDuration(literal);
7743
+ } catch (error) {
7744
+ throw new UsageError(`${source}: ${error instanceof Error ? error.message : String(error)}`);
7745
+ }
7746
+ }
7638
7747
  function buildFlagArgs(flags) {
7639
7748
  const args = [];
7640
7749
  if (flags.skipPermissions) {
@@ -7707,6 +7816,8 @@ var init_flags = __esm({
7707
7816
  "use strict";
7708
7817
  import_node_path36 = __toESM(require("node:path"), 1);
7709
7818
  init_envBool();
7819
+ init_cliError();
7820
+ init_conditions();
7710
7821
  init_credential();
7711
7822
  init_headers();
7712
7823
  init_capability();
@@ -7891,6 +8002,67 @@ var init_claudeSession = __esm({
7891
8002
  }
7892
8003
  });
7893
8004
 
8005
+ // src/launcher/diagnostics.ts
8006
+ function diagnosticLines(diagnostics) {
8007
+ const unclassified = [...new Set(diagnostics.filter((diagnostic) => diagnostic.code === "UNCLASSIFIED_ENTRY").map((diagnostic) => diagnostic.subject))];
8008
+ const lines = [];
8009
+ let unclassifiedReported = false;
8010
+ for (const diagnostic of diagnostics) {
8011
+ if (diagnostic.severity === "info") {
8012
+ continue;
8013
+ }
8014
+ if (diagnostic.code === "UNCLASSIFIED_ENTRY") {
8015
+ if (!unclassifiedReported) {
8016
+ unclassifiedReported = true;
8017
+ lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${unclassifiedEntryMessage(unclassified.filter((name) => name !== void 0))}` });
8018
+ }
8019
+ continue;
8020
+ }
8021
+ lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${diagnostic.message}` });
8022
+ }
8023
+ return lines;
8024
+ }
8025
+ function reportDiagnostics(log, diagnostics, options) {
8026
+ for (const line of diagnosticLines(diagnostics)) {
8027
+ if (line.severity === "error" && !options.errorsAsWarnings) {
8028
+ log.error(line.text);
8029
+ } else {
8030
+ log.warn(line.text);
8031
+ }
8032
+ }
8033
+ }
8034
+ var init_diagnostics = __esm({
8035
+ "src/launcher/diagnostics.ts"() {
8036
+ "use strict";
8037
+ init_decide();
8038
+ }
8039
+ });
8040
+
8041
+ // src/launcher/hold.ts
8042
+ function describeDelay(ms) {
8043
+ return ms % MS_PER_SECOND7 === 0 ? `${String(ms / MS_PER_SECOND7)}s` : `${String(ms)}ms`;
8044
+ }
8045
+ function holdBeforeLaunch(hold, port, log) {
8046
+ if (port === void 0 || !port.attended() || !hold.pause && hold.delayMs <= 0) {
8047
+ return "go";
8048
+ }
8049
+ if (hold.pause) {
8050
+ log.info("agent-shim: paused before launch; press any key to start, or Ctrl-C to cancel");
8051
+ return port.waitForKey() === "interrupt" ? "cancelled" : "go";
8052
+ }
8053
+ log.info(`agent-shim: starting in ${describeDelay(hold.delayMs)}`);
8054
+ port.sleep(hold.delayMs);
8055
+ return "go";
8056
+ }
8057
+ var LAUNCH_CANCELLED_EXIT, MS_PER_SECOND7;
8058
+ var init_hold = __esm({
8059
+ "src/launcher/hold.ts"() {
8060
+ "use strict";
8061
+ LAUNCH_CANCELLED_EXIT = 130;
8062
+ MS_PER_SECOND7 = 1e3;
8063
+ }
8064
+ });
8065
+
7894
8066
  // src/antigravity/cloudUpstream.ts
7895
8067
  var init_cloudUpstream = __esm({
7896
8068
  "src/antigravity/cloudUpstream.ts"() {
@@ -8071,7 +8243,7 @@ function filterCatalogue(models, catalogue) {
8071
8243
  const excluded = catalogue.exclude === void 0 ? void 0 : (0, import_picomatch4.default)(catalogue.exclude, { dot: true });
8072
8244
  return models.filter((model) => included?.(model.id) !== false && excluded?.(model.id) !== true);
8073
8245
  }
8074
- var import_node_path38, import_picomatch4, import_zod30, DEFAULT_CANDIDATE_URLS, MS_PER_SECOND7, SECONDS_PER_HOUR2, HOURS_PER_DAY5, MS_PER_HOUR5, HOURS_BETWEEN_RETRIES, CATALOGUE_MAX_AGE_MS, CATALOGUE_RETRY_MS, CATALOGUE_REQUEST_SECONDS, CATALOGUE_REQUEST_TIMEOUT_MS, CATALOGUE_REFRESH_TIMEOUT_MS, CatalogueModelSchema, CatalogueCacheSchema;
8246
+ var import_node_path38, import_picomatch4, import_zod30, DEFAULT_CANDIDATE_URLS, MS_PER_SECOND8, SECONDS_PER_HOUR2, HOURS_PER_DAY5, MS_PER_HOUR5, HOURS_BETWEEN_RETRIES, CATALOGUE_MAX_AGE_MS, CATALOGUE_RETRY_MS, CATALOGUE_REQUEST_SECONDS, CATALOGUE_REQUEST_TIMEOUT_MS, CATALOGUE_REFRESH_TIMEOUT_MS, CatalogueModelSchema, CatalogueCacheSchema;
8075
8247
  var init_providerCatalogue = __esm({
8076
8248
  "src/providerCatalogue.ts"() {
8077
8249
  "use strict";
@@ -8079,15 +8251,15 @@ var init_providerCatalogue = __esm({
8079
8251
  import_picomatch4 = __toESM(require("picomatch"), 1);
8080
8252
  import_zod30 = require("zod");
8081
8253
  DEFAULT_CANDIDATE_URLS = 2;
8082
- MS_PER_SECOND7 = 1e3;
8254
+ MS_PER_SECOND8 = 1e3;
8083
8255
  SECONDS_PER_HOUR2 = 3600;
8084
8256
  HOURS_PER_DAY5 = 24;
8085
- MS_PER_HOUR5 = SECONDS_PER_HOUR2 * MS_PER_SECOND7;
8257
+ MS_PER_HOUR5 = SECONDS_PER_HOUR2 * MS_PER_SECOND8;
8086
8258
  HOURS_BETWEEN_RETRIES = 1;
8087
8259
  CATALOGUE_MAX_AGE_MS = HOURS_PER_DAY5 * MS_PER_HOUR5;
8088
8260
  CATALOGUE_RETRY_MS = HOURS_BETWEEN_RETRIES * MS_PER_HOUR5;
8089
8261
  CATALOGUE_REQUEST_SECONDS = 10;
8090
- CATALOGUE_REQUEST_TIMEOUT_MS = CATALOGUE_REQUEST_SECONDS * MS_PER_SECOND7;
8262
+ CATALOGUE_REQUEST_TIMEOUT_MS = CATALOGUE_REQUEST_SECONDS * MS_PER_SECOND8;
8091
8263
  CATALOGUE_REFRESH_TIMEOUT_MS = DEFAULT_CANDIDATE_URLS * CATALOGUE_REQUEST_TIMEOUT_MS;
8092
8264
  CatalogueModelSchema = import_zod30.z.strictObject({ id: import_zod30.z.string().min(1), name: import_zod30.z.string().min(1).optional() });
8093
8265
  CatalogueCacheSchema = import_zod30.z.strictObject({ fetchedAt: import_zod30.z.number(), url: import_zod30.z.string().min(1), models: import_zod30.z.array(CatalogueModelSchema) });
@@ -8597,17 +8769,7 @@ function decideLaunch(params, readOnly) {
8597
8769
  const flattened = flattenLayers(assembled.layers, { home: params.farm.home });
8598
8770
  cascadeLaunch = flattened.launch;
8599
8771
  if (readOnly || farmContext === void 0) {
8600
- for (const diagnostic of [...assembled.diagnostics, ...flattened.diagnostics]) {
8601
- if (diagnostic.severity === "info") {
8602
- continue;
8603
- }
8604
- const message = `agent-shim: ${diagnostic.code}: ${diagnostic.message}`;
8605
- if (diagnostic.severity === "error" && !readOnly) {
8606
- log.error(message);
8607
- } else {
8608
- log.warn(message);
8609
- }
8610
- }
8772
+ reportDiagnostics(log, [...assembled.diagnostics, ...flattened.diagnostics], { errorsAsWarnings: readOnly });
8611
8773
  }
8612
8774
  }
8613
8775
  const pinnedVersion = resolveClaudeVersion({ env, ...parsedArgv.claudeVersion === void 0 ? {} : { flag: parsedArgv.claudeVersion }, ...cascadeLaunch?.claudeVersion === void 0 ? {} : { cascade: cascadeLaunch.claudeVersion } });
@@ -8619,7 +8781,9 @@ function decideLaunch(params, readOnly) {
8619
8781
  ...parsedArgv.skipPermissions === void 0 ? {} : { skipPermissions: parsedArgv.skipPermissions },
8620
8782
  ...parsedArgv.remoteControl === void 0 ? {} : { remoteControl: parsedArgv.remoteControl },
8621
8783
  ...parsedArgv.headroom === void 0 ? {} : { headroom: parsedArgv.headroom },
8622
- ...parsedArgv.trackUsage === void 0 ? {} : { trackUsage: parsedArgv.trackUsage }
8784
+ ...parsedArgv.trackUsage === void 0 ? {} : { trackUsage: parsedArgv.trackUsage },
8785
+ ...parsedArgv.pause === void 0 ? {} : { pause: parsedArgv.pause },
8786
+ ...parsedArgv.delay === void 0 ? {} : { delay: parsedArgv.delay }
8623
8787
  }
8624
8788
  });
8625
8789
  const loginlessProvider = requestedFlags.remoteControl && selectedProvider !== void 0 && farmIdentity !== void 0 && params.hasStoredLogin?.(farmIdentity) === false ? { identity: farmIdentity, provider: selectedProvider.name } : void 0;
@@ -8712,16 +8876,12 @@ function prepareLaunch(params) {
8712
8876
  }
8713
8877
  throw error;
8714
8878
  }
8715
- for (const diagnostic of result.diagnostics) {
8716
- if (diagnostic.severity === "error") {
8717
- log.error(`agent-shim: ${diagnostic.code}: ${diagnostic.message}`);
8718
- } else if (diagnostic.severity === "warning") {
8719
- log.warn(`agent-shim: ${diagnostic.code}: ${diagnostic.message}`);
8720
- }
8879
+ reportDiagnostics(log, result.diagnostics, { errorsAsWarnings: false });
8880
+ if (!result.noOp) {
8881
+ log.info(
8882
+ `agent-shim: farm at ${result.farmRoot} resynced (${String(result.manifest.links.length)} link(s), ${String(result.manifest.materialised.length)} built director(ies)${result.adopted.length === 0 ? "" : `, ${String(result.adopted.length)} adopted into ${resyncFarmRuntime.claudeHome}`})`
8883
+ );
8721
8884
  }
8722
- log.info(
8723
- result.noOp ? `agent-shim: farm at ${result.farmRoot} already matches the resolved cascade` : `agent-shim: farm at ${result.farmRoot} resynced (${String(result.manifest.links.length)} link(s), ${String(result.manifest.materialised.length)} built director(ies)${result.adopted.length === 0 ? "" : `, ${String(result.adopted.length)} adopted into ${resyncFarmRuntime.claudeHome}`})`
8724
- );
8725
8885
  }
8726
8886
  if (decided.pinnedVersion !== void 0) {
8727
8887
  log.info(`agent-shim: Claude Code ${decided.pinnedVersion.version} (pinned by ${decided.pinnedVersion.source})`);
@@ -8768,7 +8928,8 @@ function prepareLaunch(params) {
8768
8928
  registered();
8769
8929
  }
8770
8930
  };
8771
- return { bin: decided.bin, args: finalArgv, env: finalEnv, sessionId, release, markChildStarted: updateCheck.markChildStarted, decision };
8931
+ const hold = () => holdBeforeLaunch({ delayMs: resolvedFlags.delayMs, pause: resolvedFlags.pause }, params.hold, log);
8932
+ return { bin: decided.bin, args: finalArgv, env: finalEnv, sessionId, release, markChildStarted: updateCheck.markChildStarted, hold, decision };
8772
8933
  }
8773
8934
  function resolveLaunch(params) {
8774
8935
  const decided = decideLaunch(params, true);
@@ -8801,6 +8962,9 @@ function resolveLaunch(params) {
8801
8962
  }
8802
8963
  function runLaunchPlan(plan, spawn3) {
8803
8964
  try {
8965
+ if (plan.hold() === "cancelled") {
8966
+ return LAUNCH_CANCELLED_EXIT;
8967
+ }
8804
8968
  plan.markChildStarted();
8805
8969
  const result = spawn3.spawnSync(plan.bin, plan.args, { stdio: "inherit", env: plan.env });
8806
8970
  if (result.error !== void 0) {
@@ -8830,6 +8994,8 @@ var init_launcher = __esm({
8830
8994
  init_flags();
8831
8995
  init_extraFlags();
8832
8996
  init_claudeSession();
8997
+ init_diagnostics();
8998
+ init_hold();
8833
8999
  init_modelPicker();
8834
9000
  init_providerCatalogue();
8835
9001
  init_pool();
@@ -9035,6 +9201,7 @@ function realPrepareLaunchParams(paths, options) {
9035
9201
  headroom: realHeadroomPort(paths, { spawnDaemon: options.spawnDaemon, cwd: farm.runtime.cwd }),
9036
9202
  frontdoor: realFrontDoorPort(paths, options.spawnDaemon),
9037
9203
  credentials: { ...realCredentialPort, cache: realCredentialCacheEnv(paths) },
9204
+ hold: realHoldPort,
9038
9205
  hasStoredLogin: (identity) => identitySignIn(realFarmFs, { platform: process.platform, run: realRunPort }, { farmRoot: import_node_path42.default.join(paths.identitiesDir, identity), hasCredentialBlock: false }).state !== "signed-out",
9039
9206
  ...farm.directoryIdentity === void 0 ? {} : { directoryPinnedIdentity: farm.directoryIdentity },
9040
9207
  ...farm.directoryConfigProfile === void 0 ? {} : { directoryRuleConfigProfile: farm.directoryConfigProfile },
@@ -9313,14 +9480,14 @@ var init_identityClaude = __esm({
9313
9480
  });
9314
9481
 
9315
9482
  // src/usage/providerQuota.ts
9316
- var import_zod31, MS_PER_SECOND8, SECONDS_PER_HOUR3, HOURS_PER_DAY6, DAYS_PER_MONTH, ZAI_HOST, ZAI_QUOTA_URL, ZAI_UNIT_HOURS, ZAI_UNIT_MONTHS, ZAI_UNIT_MS, ZaiLimitSchema, ZaiResponseSchema, OPENROUTER_HOST, OPENROUTER_KEY_URL, OPENROUTER_CREDITS_URL, MS_PER_DAY3, OpenRouterKeySchema, OpenRouterCreditsSchema, ANTIGRAVITY_HOST, ANTIGRAVITY_QUOTA_URL, ANTIGRAVITY_USER_URL, FIVE_HOURS2, DAYS_PER_WEEK2, FIVE_HOURS_MS, WEEK_MS, AntigravityBucketSchema, AntigravitySummarySchema, GoogleTokenInfoSchema, AntigravityUserSchema;
9483
+ var import_zod31, MS_PER_SECOND9, SECONDS_PER_HOUR3, HOURS_PER_DAY6, DAYS_PER_MONTH, ZAI_HOST, ZAI_QUOTA_URL, ZAI_UNIT_HOURS, ZAI_UNIT_MONTHS, ZAI_UNIT_MS, ZaiLimitSchema, ZaiResponseSchema, OPENROUTER_HOST, OPENROUTER_KEY_URL, OPENROUTER_CREDITS_URL, MS_PER_DAY3, OpenRouterKeySchema, OpenRouterCreditsSchema, ANTIGRAVITY_HOST, ANTIGRAVITY_QUOTA_URL, ANTIGRAVITY_USER_URL, FIVE_HOURS2, DAYS_PER_WEEK2, FIVE_HOURS_MS, WEEK_MS, AntigravityBucketSchema, AntigravitySummarySchema, GoogleTokenInfoSchema, AntigravityUserSchema;
9317
9484
  var init_providerQuota = __esm({
9318
9485
  "src/usage/providerQuota.ts"() {
9319
9486
  "use strict";
9320
9487
  import_zod31 = require("zod");
9321
9488
  init_cloudUpstream();
9322
9489
  init_schema2();
9323
- MS_PER_SECOND8 = 1e3;
9490
+ MS_PER_SECOND9 = 1e3;
9324
9491
  SECONDS_PER_HOUR3 = 3600;
9325
9492
  HOURS_PER_DAY6 = 24;
9326
9493
  DAYS_PER_MONTH = 30;
@@ -9329,8 +9496,8 @@ var init_providerQuota = __esm({
9329
9496
  ZAI_UNIT_HOURS = 3;
9330
9497
  ZAI_UNIT_MONTHS = 5;
9331
9498
  ZAI_UNIT_MS = /* @__PURE__ */ new Map([
9332
- [ZAI_UNIT_HOURS, SECONDS_PER_HOUR3 * MS_PER_SECOND8],
9333
- [ZAI_UNIT_MONTHS, DAYS_PER_MONTH * HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND8]
9499
+ [ZAI_UNIT_HOURS, SECONDS_PER_HOUR3 * MS_PER_SECOND9],
9500
+ [ZAI_UNIT_MONTHS, DAYS_PER_MONTH * HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND9]
9334
9501
  ]);
9335
9502
  ZaiLimitSchema = import_zod31.z.object({
9336
9503
  type: import_zod31.z.string(),
@@ -9350,7 +9517,7 @@ var init_providerQuota = __esm({
9350
9517
  OPENROUTER_HOST = "openrouter.ai";
9351
9518
  OPENROUTER_KEY_URL = `https://${OPENROUTER_HOST}/api/v1/key`;
9352
9519
  OPENROUTER_CREDITS_URL = `https://${OPENROUTER_HOST}/api/v1/credits`;
9353
- MS_PER_DAY3 = HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND8;
9520
+ MS_PER_DAY3 = HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND9;
9354
9521
  OpenRouterKeySchema = import_zod31.z.object({
9355
9522
  data: import_zod31.z.object({
9356
9523
  limit: import_zod31.z.number().nonnegative().nullable(),
@@ -9366,8 +9533,8 @@ var init_providerQuota = __esm({
9366
9533
  ANTIGRAVITY_USER_URL = `https://${ANTIGRAVITY_HOST}/v1internal:loadCodeAssist`;
9367
9534
  FIVE_HOURS2 = 5;
9368
9535
  DAYS_PER_WEEK2 = 7;
9369
- FIVE_HOURS_MS = FIVE_HOURS2 * SECONDS_PER_HOUR3 * MS_PER_SECOND8;
9370
- WEEK_MS = DAYS_PER_WEEK2 * HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND8;
9536
+ FIVE_HOURS_MS = FIVE_HOURS2 * SECONDS_PER_HOUR3 * MS_PER_SECOND9;
9537
+ WEEK_MS = DAYS_PER_WEEK2 * HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND9;
9371
9538
  AntigravityBucketSchema = import_zod31.z.object({
9372
9539
  bucketId: import_zod31.z.string(),
9373
9540
  remainingFraction: import_zod31.z.number().optional(),
@@ -13670,6 +13837,12 @@ function applyProfileChange(paths, name, change) {
13670
13837
  if (change.launchClaudeVersion !== void 0) {
13671
13838
  launchPatch.claudeVersion = change.launchClaudeVersion === false ? void 0 : change.launchClaudeVersion;
13672
13839
  }
13840
+ if (change.launchDelay !== void 0) {
13841
+ launchPatch.delay = change.launchDelay === false ? void 0 : change.launchDelay;
13842
+ }
13843
+ if (change.launchPause !== void 0) {
13844
+ launchPatch.pause = change.launchPause;
13845
+ }
13673
13846
  if (Object.keys(launchPatch).length > 0) {
13674
13847
  setProfileLaunchFlags(paths, name, launchPatch);
13675
13848
  touched = true;
@@ -15885,7 +16058,9 @@ var ConfigProfileSetInputSchema = import_zod24.z.strictObject({
15885
16058
  headroom: import_zod24.z.boolean().optional(),
15886
16059
  trackUsage: import_zod24.z.boolean().optional(),
15887
16060
  provider: import_zod24.z.union([import_zod24.z.string().min(1), import_zod24.z.literal(false)]).optional(),
15888
- claudeVersion: import_zod24.z.union([import_zod24.z.string().min(1), import_zod24.z.literal(false)]).optional()
16061
+ claudeVersion: import_zod24.z.union([import_zod24.z.string().min(1), import_zod24.z.literal(false)]).optional(),
16062
+ delay: import_zod24.z.union([import_zod24.z.string().regex(DURATION_RE), import_zod24.z.literal(false)]).optional(),
16063
+ pause: import_zod24.z.boolean().optional()
15889
16064
  }).optional()
15890
16065
  });
15891
16066
  var ConfigProfileSetOutputSchema = storedMutationOutput("profile", "updated", ProfileValueSchema);
@@ -16095,7 +16270,9 @@ function createConfigApiRouter(deps) {
16095
16270
  ...launch?.headroom === void 0 ? {} : { launchHeadroom: launch.headroom },
16096
16271
  ...launch?.trackUsage === void 0 ? {} : { launchTrackUsage: launch.trackUsage },
16097
16272
  ...launch?.provider === void 0 ? {} : { launchProvider: launch.provider },
16098
- ...launch?.claudeVersion === void 0 ? {} : { launchClaudeVersion: launch.claudeVersion }
16273
+ ...launch?.claudeVersion === void 0 ? {} : { launchClaudeVersion: launch.claudeVersion },
16274
+ ...launch?.delay === void 0 ? {} : { launchDelay: launch.delay },
16275
+ ...launch?.pause === void 0 ? {} : { launchPause: launch.pause }
16099
16276
  });
16100
16277
  return { action: "updated", kind: "profile", name: input.name, value: profileValue(input.name, paths) };
16101
16278
  })
@@ -16403,7 +16580,10 @@ var LaunchFlagsSchema = import_zod26.z.strictObject({
16403
16580
  skipPermissions: import_zod26.z.boolean(),
16404
16581
  remoteControl: import_zod26.z.boolean(),
16405
16582
  headroom: import_zod26.z.boolean(),
16406
- trackUsage: import_zod26.z.boolean()
16583
+ trackUsage: import_zod26.z.boolean(),
16584
+ pause: import_zod26.z.boolean(),
16585
+ /** How long the launch waits after its own output before it starts claude, in milliseconds. */
16586
+ delayMs: import_zod26.z.number()
16407
16587
  });
16408
16588
  var LaunchResolveOutputSchema = import_zod26.z.strictObject({
16409
16589
  decision: LaunchDecisionSchema,