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.mjs CHANGED
@@ -34,7 +34,10 @@ var init_categories_default = __esm({
34
34
  "usage-data",
35
35
  "ide",
36
36
  "cache",
37
- "scheduled_tasks.lock"
37
+ "scheduled_tasks.lock",
38
+ "policy-limits.json*",
39
+ "remote-settings.json*",
40
+ "state"
38
41
  ],
39
42
  history: [
40
43
  "projects",
@@ -260,7 +263,11 @@ var init_schema = __esm({
260
263
  headroom: z.boolean().optional(),
261
264
  trackUsage: z.boolean().optional(),
262
265
  /** 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. */
263
- claudeVersion: z.string().regex(NUMERIC_DOTTED_VERSION_RE, "must be an exact dotted-numeric Claude Code version such as 2.1.220").optional()
266
+ claudeVersion: z.string().regex(NUMERIC_DOTTED_VERSION_RE, "must be an exact dotted-numeric Claude Code version such as 2.1.220").optional(),
267
+ /** 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. */
268
+ delay: z.string().regex(DURATION_RE, "must be a duration such as 5s or 500ms").optional(),
269
+ /** 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. */
270
+ pause: z.boolean().optional()
264
271
  });
265
272
  CREDENTIAL_TARGETS = ["bearer", "apiKey", "oauthToken"];
266
273
  PROVIDER_CREDENTIAL_TARGETS = ["bearer", "apiKey"];
@@ -1363,6 +1370,12 @@ function flattenLayers(layers, options) {
1363
1370
  if (layer.launch.claudeVersion !== void 0) {
1364
1371
  launch.claudeVersion = layer.launch.claudeVersion;
1365
1372
  }
1373
+ if (layer.launch.delay !== void 0) {
1374
+ launch.delay = layer.launch.delay;
1375
+ }
1376
+ if (layer.launch.pause !== void 0) {
1377
+ launch.pause = layer.launch.pause;
1378
+ }
1366
1379
  }
1367
1380
  if (layer.entries === void 0) {
1368
1381
  continue;
@@ -1461,6 +1474,12 @@ var init_flatten = __esm({
1461
1474
  });
1462
1475
 
1463
1476
  // src/resolve/decide.ts
1477
+ function unclassifiedEntryMessage(names) {
1478
+ const quoted = names.map((name) => `"${name}"`).join(", ");
1479
+ const subject = names.length === 1 ? `${quoted} is not` : `${String(names.length)} entries are not`;
1480
+ const excluded = names.length === 1 ? "it is excluded" : `they are excluded: ${quoted}`;
1481
+ 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.`;
1482
+ }
1464
1483
  function selectRule(relPath, flattened, context) {
1465
1484
  const eliminated = [];
1466
1485
  for (const rule of matchingRules(flattened, relPath)) {
@@ -1498,7 +1517,7 @@ function resolveEntry(relPath, params) {
1498
1517
  diagnostics.push({
1499
1518
  code: "UNCLASSIFIED_ENTRY",
1500
1519
  severity: "warning",
1501
- 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.`,
1520
+ message: unclassifiedEntryMessage([head]),
1502
1521
  subject: head
1503
1522
  });
1504
1523
  return { decision: { relPath, shared: false, via: "unclassified", category }, diagnostics };
@@ -2931,7 +2950,7 @@ var init_package = __esm({
2931
2950
  "package.json"() {
2932
2951
  package_default = {
2933
2952
  name: "claude-use",
2934
- version: "11.26.0",
2953
+ version: "11.28.0",
2935
2954
  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.",
2936
2955
  license: "MIT",
2937
2956
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -4096,6 +4115,40 @@ var init_supervisor = __esm({
4096
4115
  }
4097
4116
  });
4098
4117
 
4118
+ // src/logStyle.ts
4119
+ import { styleText } from "node:util";
4120
+ function styledDiagnostic(style, colour, line) {
4121
+ const lead = DIAGNOSTIC_LEAD.exec(line);
4122
+ if (lead === null) {
4123
+ return style([colour], line);
4124
+ }
4125
+ const [whole, prefix = "", code = "", separator = ""] = lead;
4126
+ return `${style([colour], prefix)}${style([colour, "bold"], code)}${style([colour], `${separator}${line.slice(whole.length)}`)}`;
4127
+ }
4128
+ function createLogPort(sinks, styleFor) {
4129
+ return {
4130
+ info: (message) => {
4131
+ sinks.out(styleFor.out(["dim"], message));
4132
+ },
4133
+ warn: (message) => {
4134
+ sinks.warn(styledDiagnostic(styleFor.err, "yellow", message));
4135
+ },
4136
+ error: (message) => {
4137
+ sinks.err(styledDiagnostic(styleFor.err, "red", message));
4138
+ }
4139
+ };
4140
+ }
4141
+ function styleTextFor(stream) {
4142
+ return (formats, text) => styleText([...formats], text, { stream });
4143
+ }
4144
+ var DIAGNOSTIC_LEAD;
4145
+ var init_logStyle = __esm({
4146
+ "src/logStyle.ts"() {
4147
+ "use strict";
4148
+ DIAGNOSTIC_LEAD = /^(agent-shim: )([A-Z][A-Z0-9_]*)(: )/;
4149
+ }
4150
+ });
4151
+
4099
4152
  // src/realPorts.ts
4100
4153
  import { spawn as spawn2, spawnSync } from "node:child_process";
4101
4154
  import { createHash as createHash5 } from "node:crypto";
@@ -4340,7 +4393,7 @@ function realResolveClaudeBinary(isOwnBinary) {
4340
4393
  function realInstalledClaudeVersions() {
4341
4394
  return installedVersions(listVersionsDir(defaultVersionsDir()));
4342
4395
  }
4343
- var 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;
4396
+ var 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;
4344
4397
  var init_realPorts = __esm({
4345
4398
  "src/realPorts.ts"() {
4346
4399
  "use strict";
@@ -4351,6 +4404,7 @@ var init_realPorts = __esm({
4351
4404
  init_ensure();
4352
4405
  init_supervisor();
4353
4406
  init_state2();
4407
+ init_logStyle();
4354
4408
  realFsPort = {
4355
4409
  readFileUtf8(filePath) {
4356
4410
  try {
@@ -4482,6 +4536,31 @@ var init_realPorts = __esm({
4482
4536
  }
4483
4537
  };
4484
4538
  INT32_BYTE_LENGTH = 4;
4539
+ KEY_POLL_MS = 25;
4540
+ CTRL_C_BYTE = 3;
4541
+ realHoldPort = {
4542
+ attended: () => process.stdin.isTTY && process.stdout.isTTY,
4543
+ sleep: realSleepSync,
4544
+ waitForKey: () => {
4545
+ process.stdin.setRawMode(true);
4546
+ try {
4547
+ const buffer = Buffer.alloc(1);
4548
+ for (; ; ) {
4549
+ try {
4550
+ const read = fs3.readSync(process.stdin.fd, buffer, 0, buffer.length, null);
4551
+ return read > 0 && buffer[0] === CTRL_C_BYTE ? "interrupt" : "key";
4552
+ } catch (error) {
4553
+ if (!(error instanceof Error && "code" in error && error.code === "EAGAIN")) {
4554
+ throw error;
4555
+ }
4556
+ realSleepSync(KEY_POLL_MS);
4557
+ }
4558
+ }
4559
+ } finally {
4560
+ process.stdin.setRawMode(false);
4561
+ }
4562
+ }
4563
+ };
4485
4564
  PS_TIMEOUT_MS = 2e3;
4486
4565
  realRunPort = {
4487
4566
  run(command, args) {
@@ -4556,6 +4635,16 @@ var init_realPorts = __esm({
4556
4635
  argv: process.argv.slice(2),
4557
4636
  exit: (code) => process.exit(code)
4558
4637
  };
4638
+ realLogPort = createLogPort(
4639
+ { out: (line) => {
4640
+ console.log(line);
4641
+ }, warn: (line) => {
4642
+ console.warn(line);
4643
+ }, err: (line) => {
4644
+ console.error(line);
4645
+ } },
4646
+ { out: styleTextFor(process.stdout), err: styleTextFor(process.stderr) }
4647
+ );
4559
4648
  EXECUTE_BITS_MASK = 73;
4560
4649
  WINDOWS_DEFAULT_PATHEXT = ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PS1";
4561
4650
  }
@@ -7310,6 +7399,7 @@ function parseLauncherArgv(argv) {
7310
7399
  let configProfile;
7311
7400
  let provider;
7312
7401
  let claudeVersion;
7402
+ let delay;
7313
7403
  const booleans = {};
7314
7404
  const categoryFlags = [];
7315
7405
  const shareFlags = [];
@@ -7367,6 +7457,9 @@ function parseLauncherArgv(argv) {
7367
7457
  case "--claude-version":
7368
7458
  claudeVersion = value;
7369
7459
  break;
7460
+ case "--delay":
7461
+ delay = value;
7462
+ break;
7370
7463
  case "--category":
7371
7464
  categoryFlags.push(value);
7372
7465
  break;
@@ -7389,6 +7482,7 @@ function parseLauncherArgv(argv) {
7389
7482
  ...configProfile === void 0 ? {} : { configProfile },
7390
7483
  ...provider === void 0 ? {} : { provider },
7391
7484
  ...claudeVersion === void 0 ? {} : { claudeVersion },
7485
+ ...delay === void 0 ? {} : { delay },
7392
7486
  ...native ? { native: true } : {},
7393
7487
  ...booleans,
7394
7488
  categoryFlags,
@@ -7412,13 +7506,14 @@ var init_argv = __esm({
7412
7506
  positional;
7413
7507
  flag;
7414
7508
  };
7415
- VALUED_FLAGS = ["--identity", "--config-profile", "--provider", "--claude-version", "--category", "--share", "--hide"];
7509
+ VALUED_FLAGS = ["--identity", "--config-profile", "--provider", "--claude-version", "--delay", "--category", "--share", "--hide"];
7416
7510
  BOOLEAN_FLAGS = [
7417
7511
  { flag: "--headroom", key: "headroom" },
7418
7512
  { flag: "--track-usage", key: "trackUsage" },
7419
7513
  { flag: "--skip-permissions", key: "skipPermissions" },
7420
7514
  { flag: "--remote-control", key: "remoteControl" },
7421
- { flag: "--wait", key: "wait" }
7515
+ { flag: "--wait", key: "wait" },
7516
+ { flag: "--pause", key: "pause" }
7422
7517
  ];
7423
7518
  LAUNCHER_FLAG_NAMES = [
7424
7519
  ...VALUED_FLAGS,
@@ -7606,9 +7701,23 @@ function resolveLaunchFlags(params) {
7606
7701
  skipPermissions: params.flags?.skipPermissions ?? parseEnvBool("AGENT_SHIM_SKIP_PERMISSIONS", params.env.AGENT_SHIM_SKIP_PERMISSIONS) ?? params.cascade?.skipPermissions ?? false,
7607
7702
  remoteControl: params.flags?.remoteControl ?? parseEnvBool("AGENT_SHIM_REMOTE_CONTROL", params.env.AGENT_SHIM_REMOTE_CONTROL) ?? params.cascade?.remoteControl ?? false,
7608
7703
  headroom: params.flags?.headroom ?? parseEnvBool("AGENT_SHIM_HEADROOM", params.env.AGENT_SHIM_HEADROOM) ?? params.cascade?.headroom ?? false,
7609
- trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true
7704
+ trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true,
7705
+ pause: params.flags?.pause ?? parseEnvBool("AGENT_SHIM_PAUSE", params.env.AGENT_SHIM_PAUSE) ?? params.cascade?.pause ?? false,
7706
+ delayMs: resolveDelayMs(params)
7610
7707
  };
7611
7708
  }
7709
+ function resolveDelayMs(params) {
7710
+ const fromEnv = params.env.AGENT_SHIM_DELAY === "" ? void 0 : params.env.AGENT_SHIM_DELAY;
7711
+ const [literal, source] = params.flags?.delay !== void 0 ? [params.flags.delay, "--delay"] : fromEnv !== void 0 ? [fromEnv, "AGENT_SHIM_DELAY"] : [params.cascade?.delay, "launch.delay"];
7712
+ if (literal === void 0) {
7713
+ return 0;
7714
+ }
7715
+ try {
7716
+ return parseDuration(literal);
7717
+ } catch (error) {
7718
+ throw new UsageError(`${source}: ${error instanceof Error ? error.message : String(error)}`);
7719
+ }
7720
+ }
7612
7721
  function buildFlagArgs(flags) {
7613
7722
  const args = [];
7614
7723
  if (flags.skipPermissions) {
@@ -7680,6 +7789,8 @@ var init_flags = __esm({
7680
7789
  "src/launcher/flags.ts"() {
7681
7790
  "use strict";
7682
7791
  init_envBool();
7792
+ init_cliError();
7793
+ init_conditions();
7683
7794
  init_credential();
7684
7795
  init_headers();
7685
7796
  init_capability();
@@ -7863,6 +7974,67 @@ var init_claudeSession = __esm({
7863
7974
  }
7864
7975
  });
7865
7976
 
7977
+ // src/launcher/diagnostics.ts
7978
+ function diagnosticLines(diagnostics) {
7979
+ const unclassified = [...new Set(diagnostics.filter((diagnostic) => diagnostic.code === "UNCLASSIFIED_ENTRY").map((diagnostic) => diagnostic.subject))];
7980
+ const lines = [];
7981
+ let unclassifiedReported = false;
7982
+ for (const diagnostic of diagnostics) {
7983
+ if (diagnostic.severity === "info") {
7984
+ continue;
7985
+ }
7986
+ if (diagnostic.code === "UNCLASSIFIED_ENTRY") {
7987
+ if (!unclassifiedReported) {
7988
+ unclassifiedReported = true;
7989
+ lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${unclassifiedEntryMessage(unclassified.filter((name) => name !== void 0))}` });
7990
+ }
7991
+ continue;
7992
+ }
7993
+ lines.push({ severity: diagnostic.severity, text: `agent-shim: ${diagnostic.code}: ${diagnostic.message}` });
7994
+ }
7995
+ return lines;
7996
+ }
7997
+ function reportDiagnostics(log, diagnostics, options) {
7998
+ for (const line of diagnosticLines(diagnostics)) {
7999
+ if (line.severity === "error" && !options.errorsAsWarnings) {
8000
+ log.error(line.text);
8001
+ } else {
8002
+ log.warn(line.text);
8003
+ }
8004
+ }
8005
+ }
8006
+ var init_diagnostics = __esm({
8007
+ "src/launcher/diagnostics.ts"() {
8008
+ "use strict";
8009
+ init_decide();
8010
+ }
8011
+ });
8012
+
8013
+ // src/launcher/hold.ts
8014
+ function describeDelay(ms) {
8015
+ return ms % MS_PER_SECOND7 === 0 ? `${String(ms / MS_PER_SECOND7)}s` : `${String(ms)}ms`;
8016
+ }
8017
+ function holdBeforeLaunch(hold, port, log) {
8018
+ if (port === void 0 || !port.attended() || !hold.pause && hold.delayMs <= 0) {
8019
+ return "go";
8020
+ }
8021
+ if (hold.pause) {
8022
+ log.info("agent-shim: paused before launch; press any key to start, or Ctrl-C to cancel");
8023
+ return port.waitForKey() === "interrupt" ? "cancelled" : "go";
8024
+ }
8025
+ log.info(`agent-shim: starting in ${describeDelay(hold.delayMs)}`);
8026
+ port.sleep(hold.delayMs);
8027
+ return "go";
8028
+ }
8029
+ var LAUNCH_CANCELLED_EXIT, MS_PER_SECOND7;
8030
+ var init_hold = __esm({
8031
+ "src/launcher/hold.ts"() {
8032
+ "use strict";
8033
+ LAUNCH_CANCELLED_EXIT = 130;
8034
+ MS_PER_SECOND7 = 1e3;
8035
+ }
8036
+ });
8037
+
7866
8038
  // src/antigravity/cloudUpstream.ts
7867
8039
  var init_cloudUpstream = __esm({
7868
8040
  "src/antigravity/cloudUpstream.ts"() {
@@ -8046,20 +8218,20 @@ function filterCatalogue(models, catalogue) {
8046
8218
  const excluded = catalogue.exclude === void 0 ? void 0 : picomatch4(catalogue.exclude, { dot: true });
8047
8219
  return models.filter((model) => included?.(model.id) !== false && excluded?.(model.id) !== true);
8048
8220
  }
8049
- var 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;
8221
+ var 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;
8050
8222
  var init_providerCatalogue = __esm({
8051
8223
  "src/providerCatalogue.ts"() {
8052
8224
  "use strict";
8053
8225
  DEFAULT_CANDIDATE_URLS = 2;
8054
- MS_PER_SECOND7 = 1e3;
8226
+ MS_PER_SECOND8 = 1e3;
8055
8227
  SECONDS_PER_HOUR2 = 3600;
8056
8228
  HOURS_PER_DAY5 = 24;
8057
- MS_PER_HOUR5 = SECONDS_PER_HOUR2 * MS_PER_SECOND7;
8229
+ MS_PER_HOUR5 = SECONDS_PER_HOUR2 * MS_PER_SECOND8;
8058
8230
  HOURS_BETWEEN_RETRIES = 1;
8059
8231
  CATALOGUE_MAX_AGE_MS = HOURS_PER_DAY5 * MS_PER_HOUR5;
8060
8232
  CATALOGUE_RETRY_MS = HOURS_BETWEEN_RETRIES * MS_PER_HOUR5;
8061
8233
  CATALOGUE_REQUEST_SECONDS = 10;
8062
- CATALOGUE_REQUEST_TIMEOUT_MS = CATALOGUE_REQUEST_SECONDS * MS_PER_SECOND7;
8234
+ CATALOGUE_REQUEST_TIMEOUT_MS = CATALOGUE_REQUEST_SECONDS * MS_PER_SECOND8;
8063
8235
  CATALOGUE_REFRESH_TIMEOUT_MS = DEFAULT_CANDIDATE_URLS * CATALOGUE_REQUEST_TIMEOUT_MS;
8064
8236
  CatalogueModelSchema = z30.strictObject({ id: z30.string().min(1), name: z30.string().min(1).optional() });
8065
8237
  CatalogueCacheSchema = z30.strictObject({ fetchedAt: z30.number(), url: z30.string().min(1), models: z30.array(CatalogueModelSchema) });
@@ -8571,17 +8743,7 @@ function decideLaunch(params, readOnly) {
8571
8743
  const flattened = flattenLayers(assembled.layers, { home: params.farm.home });
8572
8744
  cascadeLaunch = flattened.launch;
8573
8745
  if (readOnly || farmContext === void 0) {
8574
- for (const diagnostic of [...assembled.diagnostics, ...flattened.diagnostics]) {
8575
- if (diagnostic.severity === "info") {
8576
- continue;
8577
- }
8578
- const message = `agent-shim: ${diagnostic.code}: ${diagnostic.message}`;
8579
- if (diagnostic.severity === "error" && !readOnly) {
8580
- log.error(message);
8581
- } else {
8582
- log.warn(message);
8583
- }
8584
- }
8746
+ reportDiagnostics(log, [...assembled.diagnostics, ...flattened.diagnostics], { errorsAsWarnings: readOnly });
8585
8747
  }
8586
8748
  }
8587
8749
  const pinnedVersion = resolveClaudeVersion({ env, ...parsedArgv.claudeVersion === void 0 ? {} : { flag: parsedArgv.claudeVersion }, ...cascadeLaunch?.claudeVersion === void 0 ? {} : { cascade: cascadeLaunch.claudeVersion } });
@@ -8593,7 +8755,9 @@ function decideLaunch(params, readOnly) {
8593
8755
  ...parsedArgv.skipPermissions === void 0 ? {} : { skipPermissions: parsedArgv.skipPermissions },
8594
8756
  ...parsedArgv.remoteControl === void 0 ? {} : { remoteControl: parsedArgv.remoteControl },
8595
8757
  ...parsedArgv.headroom === void 0 ? {} : { headroom: parsedArgv.headroom },
8596
- ...parsedArgv.trackUsage === void 0 ? {} : { trackUsage: parsedArgv.trackUsage }
8758
+ ...parsedArgv.trackUsage === void 0 ? {} : { trackUsage: parsedArgv.trackUsage },
8759
+ ...parsedArgv.pause === void 0 ? {} : { pause: parsedArgv.pause },
8760
+ ...parsedArgv.delay === void 0 ? {} : { delay: parsedArgv.delay }
8597
8761
  }
8598
8762
  });
8599
8763
  const loginlessProvider = requestedFlags.remoteControl && selectedProvider !== void 0 && farmIdentity !== void 0 && params.hasStoredLogin?.(farmIdentity) === false ? { identity: farmIdentity, provider: selectedProvider.name } : void 0;
@@ -8686,16 +8850,12 @@ function prepareLaunch(params) {
8686
8850
  }
8687
8851
  throw error;
8688
8852
  }
8689
- for (const diagnostic of result.diagnostics) {
8690
- if (diagnostic.severity === "error") {
8691
- log.error(`agent-shim: ${diagnostic.code}: ${diagnostic.message}`);
8692
- } else if (diagnostic.severity === "warning") {
8693
- log.warn(`agent-shim: ${diagnostic.code}: ${diagnostic.message}`);
8694
- }
8853
+ reportDiagnostics(log, result.diagnostics, { errorsAsWarnings: false });
8854
+ if (!result.noOp) {
8855
+ log.info(
8856
+ `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}`})`
8857
+ );
8695
8858
  }
8696
- log.info(
8697
- 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}`})`
8698
- );
8699
8859
  }
8700
8860
  if (decided.pinnedVersion !== void 0) {
8701
8861
  log.info(`agent-shim: Claude Code ${decided.pinnedVersion.version} (pinned by ${decided.pinnedVersion.source})`);
@@ -8742,7 +8902,8 @@ function prepareLaunch(params) {
8742
8902
  registered();
8743
8903
  }
8744
8904
  };
8745
- return { bin: decided.bin, args: finalArgv, env: finalEnv, sessionId, release, markChildStarted: updateCheck.markChildStarted, decision };
8905
+ const hold = () => holdBeforeLaunch({ delayMs: resolvedFlags.delayMs, pause: resolvedFlags.pause }, params.hold, log);
8906
+ return { bin: decided.bin, args: finalArgv, env: finalEnv, sessionId, release, markChildStarted: updateCheck.markChildStarted, hold, decision };
8746
8907
  }
8747
8908
  function resolveLaunch(params) {
8748
8909
  const decided = decideLaunch(params, true);
@@ -8775,6 +8936,9 @@ function resolveLaunch(params) {
8775
8936
  }
8776
8937
  function runLaunchPlan(plan, spawn3) {
8777
8938
  try {
8939
+ if (plan.hold() === "cancelled") {
8940
+ return LAUNCH_CANCELLED_EXIT;
8941
+ }
8778
8942
  plan.markChildStarted();
8779
8943
  const result = spawn3.spawnSync(plan.bin, plan.args, { stdio: "inherit", env: plan.env });
8780
8944
  if (result.error !== void 0) {
@@ -8801,6 +8965,8 @@ var init_launcher = __esm({
8801
8965
  init_flags();
8802
8966
  init_extraFlags();
8803
8967
  init_claudeSession();
8968
+ init_diagnostics();
8969
+ init_hold();
8804
8970
  init_modelPicker();
8805
8971
  init_providerCatalogue();
8806
8972
  init_pool();
@@ -9009,6 +9175,7 @@ function realPrepareLaunchParams(paths, options) {
9009
9175
  headroom: realHeadroomPort(paths, { spawnDaemon: options.spawnDaemon, cwd: farm.runtime.cwd }),
9010
9176
  frontdoor: realFrontDoorPort(paths, options.spawnDaemon),
9011
9177
  credentials: { ...realCredentialPort, cache: realCredentialCacheEnv(paths) },
9178
+ hold: realHoldPort,
9012
9179
  hasStoredLogin: (identity) => identitySignIn(realFarmFs, { platform: process.platform, run: realRunPort }, { farmRoot: path42.join(paths.identitiesDir, identity), hasCredentialBlock: false }).state !== "signed-out",
9013
9180
  ...farm.directoryIdentity === void 0 ? {} : { directoryPinnedIdentity: farm.directoryIdentity },
9014
9181
  ...farm.directoryConfigProfile === void 0 ? {} : { directoryRuleConfigProfile: farm.directoryConfigProfile },
@@ -9285,13 +9452,13 @@ var init_identityClaude = __esm({
9285
9452
 
9286
9453
  // src/usage/providerQuota.ts
9287
9454
  import { z as z31 } from "zod";
9288
- var 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;
9455
+ var 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;
9289
9456
  var init_providerQuota = __esm({
9290
9457
  "src/usage/providerQuota.ts"() {
9291
9458
  "use strict";
9292
9459
  init_cloudUpstream();
9293
9460
  init_schema2();
9294
- MS_PER_SECOND8 = 1e3;
9461
+ MS_PER_SECOND9 = 1e3;
9295
9462
  SECONDS_PER_HOUR3 = 3600;
9296
9463
  HOURS_PER_DAY6 = 24;
9297
9464
  DAYS_PER_MONTH = 30;
@@ -9300,8 +9467,8 @@ var init_providerQuota = __esm({
9300
9467
  ZAI_UNIT_HOURS = 3;
9301
9468
  ZAI_UNIT_MONTHS = 5;
9302
9469
  ZAI_UNIT_MS = /* @__PURE__ */ new Map([
9303
- [ZAI_UNIT_HOURS, SECONDS_PER_HOUR3 * MS_PER_SECOND8],
9304
- [ZAI_UNIT_MONTHS, DAYS_PER_MONTH * HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND8]
9470
+ [ZAI_UNIT_HOURS, SECONDS_PER_HOUR3 * MS_PER_SECOND9],
9471
+ [ZAI_UNIT_MONTHS, DAYS_PER_MONTH * HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND9]
9305
9472
  ]);
9306
9473
  ZaiLimitSchema = z31.object({
9307
9474
  type: z31.string(),
@@ -9321,7 +9488,7 @@ var init_providerQuota = __esm({
9321
9488
  OPENROUTER_HOST = "openrouter.ai";
9322
9489
  OPENROUTER_KEY_URL = `https://${OPENROUTER_HOST}/api/v1/key`;
9323
9490
  OPENROUTER_CREDITS_URL = `https://${OPENROUTER_HOST}/api/v1/credits`;
9324
- MS_PER_DAY3 = HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND8;
9491
+ MS_PER_DAY3 = HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND9;
9325
9492
  OpenRouterKeySchema = z31.object({
9326
9493
  data: z31.object({
9327
9494
  limit: z31.number().nonnegative().nullable(),
@@ -9337,8 +9504,8 @@ var init_providerQuota = __esm({
9337
9504
  ANTIGRAVITY_USER_URL = `https://${ANTIGRAVITY_HOST}/v1internal:loadCodeAssist`;
9338
9505
  FIVE_HOURS2 = 5;
9339
9506
  DAYS_PER_WEEK2 = 7;
9340
- FIVE_HOURS_MS = FIVE_HOURS2 * SECONDS_PER_HOUR3 * MS_PER_SECOND8;
9341
- WEEK_MS = DAYS_PER_WEEK2 * HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND8;
9507
+ FIVE_HOURS_MS = FIVE_HOURS2 * SECONDS_PER_HOUR3 * MS_PER_SECOND9;
9508
+ WEEK_MS = DAYS_PER_WEEK2 * HOURS_PER_DAY6 * SECONDS_PER_HOUR3 * MS_PER_SECOND9;
9342
9509
  AntigravityBucketSchema = z31.object({
9343
9510
  bucketId: z31.string(),
9344
9511
  remainingFraction: z31.number().optional(),
@@ -13257,6 +13424,12 @@ function applyProfileChange(paths, name, change) {
13257
13424
  if (change.launchClaudeVersion !== void 0) {
13258
13425
  launchPatch.claudeVersion = change.launchClaudeVersion === false ? void 0 : change.launchClaudeVersion;
13259
13426
  }
13427
+ if (change.launchDelay !== void 0) {
13428
+ launchPatch.delay = change.launchDelay === false ? void 0 : change.launchDelay;
13429
+ }
13430
+ if (change.launchPause !== void 0) {
13431
+ launchPatch.pause = change.launchPause;
13432
+ }
13260
13433
  if (Object.keys(launchPatch).length > 0) {
13261
13434
  setProfileLaunchFlags(paths, name, launchPatch);
13262
13435
  touched = true;
@@ -15472,7 +15645,9 @@ var ConfigProfileSetInputSchema = z24.strictObject({
15472
15645
  headroom: z24.boolean().optional(),
15473
15646
  trackUsage: z24.boolean().optional(),
15474
15647
  provider: z24.union([z24.string().min(1), z24.literal(false)]).optional(),
15475
- claudeVersion: z24.union([z24.string().min(1), z24.literal(false)]).optional()
15648
+ claudeVersion: z24.union([z24.string().min(1), z24.literal(false)]).optional(),
15649
+ delay: z24.union([z24.string().regex(DURATION_RE), z24.literal(false)]).optional(),
15650
+ pause: z24.boolean().optional()
15476
15651
  }).optional()
15477
15652
  });
15478
15653
  var ConfigProfileSetOutputSchema = storedMutationOutput("profile", "updated", ProfileValueSchema);
@@ -15682,7 +15857,9 @@ function createConfigApiRouter(deps) {
15682
15857
  ...launch?.headroom === void 0 ? {} : { launchHeadroom: launch.headroom },
15683
15858
  ...launch?.trackUsage === void 0 ? {} : { launchTrackUsage: launch.trackUsage },
15684
15859
  ...launch?.provider === void 0 ? {} : { launchProvider: launch.provider },
15685
- ...launch?.claudeVersion === void 0 ? {} : { launchClaudeVersion: launch.claudeVersion }
15860
+ ...launch?.claudeVersion === void 0 ? {} : { launchClaudeVersion: launch.claudeVersion },
15861
+ ...launch?.delay === void 0 ? {} : { launchDelay: launch.delay },
15862
+ ...launch?.pause === void 0 ? {} : { launchPause: launch.pause }
15686
15863
  });
15687
15864
  return { action: "updated", kind: "profile", name: input.name, value: profileValue(input.name, paths) };
15688
15865
  })
@@ -15990,7 +16167,10 @@ var LaunchFlagsSchema = z26.strictObject({
15990
16167
  skipPermissions: z26.boolean(),
15991
16168
  remoteControl: z26.boolean(),
15992
16169
  headroom: z26.boolean(),
15993
- trackUsage: z26.boolean()
16170
+ trackUsage: z26.boolean(),
16171
+ pause: z26.boolean(),
16172
+ /** How long the launch waits after its own output before it starts claude, in milliseconds. */
16173
+ delayMs: z26.number()
15994
16174
  });
15995
16175
  var LaunchResolveOutputSchema = z26.strictObject({
15996
16176
  decision: LaunchDecisionSchema,