agent-shim 10.1.0 → 11.1.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/cli.cjs CHANGED
@@ -33969,7 +33969,7 @@ var init_package = __esm({
33969
33969
  "package.json"() {
33970
33970
  package_default = {
33971
33971
  name: "agent-shim",
33972
- version: "10.1.0",
33972
+ version: "11.1.0",
33973
33973
  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.",
33974
33974
  license: "MIT",
33975
33975
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -62734,7 +62734,7 @@ function resolveLaunchFlags(params) {
62734
62734
  skipPermissions: params.flags?.skipPermissions ?? parseEnvBool("AGENT_SHIM_SKIP_PERMISSIONS", params.env.AGENT_SHIM_SKIP_PERMISSIONS) ?? params.cascade?.skipPermissions ?? false,
62735
62735
  remoteControl: params.flags?.remoteControl ?? parseEnvBool("AGENT_SHIM_REMOTE_CONTROL", params.env.AGENT_SHIM_REMOTE_CONTROL) ?? params.cascade?.remoteControl ?? false,
62736
62736
  headroom: params.flags?.headroom ?? parseEnvBool("AGENT_SHIM_HEADROOM", params.env.AGENT_SHIM_HEADROOM) ?? params.cascade?.headroom ?? false,
62737
- trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? params.trackUsageDefault ?? false
62737
+ trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true
62738
62738
  };
62739
62739
  }
62740
62740
  function buildFlagArgs(flags) {
@@ -63237,8 +63237,6 @@ function decideLaunch(params, readOnly) {
63237
63237
  const discovered = params.resolveClaudeBinary(pinnedVersion === void 0 ? void 0 : { version: pinnedVersion.version });
63238
63238
  const flags = resolveLaunchFlags({
63239
63239
  env,
63240
- // A pool pick reads the usage the front door records, so a pool launch records its own unless something says otherwise.
63241
- ...poolExplanation === void 0 ? {} : { trackUsageDefault: true },
63242
63240
  ...cascadeLaunch === void 0 ? {} : { cascade: cascadeLaunch },
63243
63241
  flags: {
63244
63242
  ...parsedArgv.skipPermissions === void 0 ? {} : { skipPermissions: parsedArgv.skipPermissions },
@@ -113455,6 +113453,7 @@ function createDoorPipelines(deps) {
113455
113453
  responseObservers: deps.responseObservers,
113456
113454
  admit: admitLaunch(deps.isLiveToken),
113457
113455
  headroom: { headroomSocket: deps.headroomSocket, hopSecret: deps.hopSecret, custody: deps.custody, log: deps.log },
113456
+ headroomDecision: deps.headroomDecision,
113458
113457
  now: deps.now,
113459
113458
  log: deps.log
113460
113459
  },
@@ -113462,12 +113461,45 @@ function createDoorPipelines(deps) {
113462
113461
  resolveRoute: deps.resolveRoute,
113463
113462
  responseObservers: [],
113464
113463
  admit: admitHop(deps.hopSecret, deps.custody),
113464
+ headroomDecision: deps.headroomDecision,
113465
113465
  now: deps.now,
113466
113466
  log: deps.log
113467
113467
  }
113468
113468
  };
113469
113469
  }
113470
113470
 
113471
+ // src/frontdoor/headroomDecision.ts
113472
+ init_pick();
113473
+ function createHeadroomDecision() {
113474
+ const sessions = /* @__PURE__ */ new Map();
113475
+ return {
113476
+ decide: (sessionId, wanted, nowMs) => {
113477
+ if (sessionId === void 0) {
113478
+ return wanted;
113479
+ }
113480
+ const state = sessions.get(sessionId);
113481
+ const atBoundary = state === void 0 || nowMs - state.lastEndedAtMs > PROMPT_CACHE_TTL_MS || state.cacheReadInputTokens === 0;
113482
+ const viaHeadroom = atBoundary ? wanted : state.viaHeadroom;
113483
+ sessions.set(sessionId, { viaHeadroom, lastEndedAtMs: state?.lastEndedAtMs ?? nowMs, cacheReadInputTokens: state?.cacheReadInputTokens ?? 0 });
113484
+ return viaHeadroom;
113485
+ },
113486
+ observe: ({ sessionId, endedAtMs, cacheReadInputTokens }) => {
113487
+ if (sessionId === void 0 || cacheReadInputTokens === void 0) {
113488
+ return;
113489
+ }
113490
+ const state = sessions.get(sessionId);
113491
+ if (state !== void 0) {
113492
+ sessions.set(sessionId, { ...state, lastEndedAtMs: endedAtMs, cacheReadInputTokens });
113493
+ }
113494
+ for (const [id2, held] of sessions) {
113495
+ if (endedAtMs - held.lastEndedAtMs > PROMPT_CACHE_TTL_MS) {
113496
+ sessions.delete(id2);
113497
+ }
113498
+ }
113499
+ }
113500
+ };
113501
+ }
113502
+
113471
113503
  // src/frontdoor/commands.ts
113472
113504
  init_capability();
113473
113505
  init_capture();
@@ -126453,7 +126485,8 @@ async function serveRouted(request7, deps) {
126453
126485
  response2.end();
126454
126486
  return;
126455
126487
  }
126456
- const viaHeadroom = identified.session.headroom && resolution.route.headroomEligible && deps.headroom !== void 0;
126488
+ const wantsHeadroom = deps.headroomDecision.decide(identified.session.sessionId, identified.session.headroom, deps.now());
126489
+ const viaHeadroom = wantsHeadroom && resolution.route.headroomEligible && deps.headroom !== void 0;
126457
126490
  const response = createRoutedResponse(request7.response, { deps, session: identified.session, route: resolution.route.name, request: { ...observed, viaHeadroom } });
126458
126491
  try {
126459
126492
  if (viaHeadroom) {
@@ -130627,8 +130660,14 @@ function realFrontDoorSupervisorPorts(paths) {
130627
130660
  log(`job keeper failed: ${error63 instanceof Error ? error63.message : String(error63)}`);
130628
130661
  }
130629
130662
  }, ANTHROPIC_USAGE_FRESHNESS_MS).unref();
130663
+ const headroomDecision = createHeadroomDecision();
130664
+ const recordUsage = withQuotaRefresh(usageStore.record, quotaRefresher);
130630
130665
  const usageMiddleware = createUsageMiddleware({
130631
- record: withQuotaRefresh(usageStore.record, quotaRefresher),
130666
+ // Each finished response also tells the per-session headroom decision when the session's cache was last touched and whether it read from it.
130667
+ record: (record2) => {
130668
+ headroomDecision.observe({ sessionId: record2.sessionId, endedAtMs: Date.parse(record2.at) + record2.durationMs, cacheReadInputTokens: record2.usage?.cacheReadInputTokens });
130669
+ recordUsage(record2);
130670
+ },
130632
130671
  defer: (task) => {
130633
130672
  setImmediate(task);
130634
130673
  },
@@ -130643,6 +130682,7 @@ function realFrontDoorSupervisorPorts(paths) {
130643
130682
  headroomSocket: () => headroomSocketTarget(realFarmFs, realHeadroomSocketTrust, paths),
130644
130683
  // The per-generation capability the direct listener demands: held only in this process's memory, so a loopback process that discovers the direct port still cannot use it.
130645
130684
  hopSecret: (0, import_node_crypto20.randomUUID)(),
130685
+ headroomDecision,
130646
130686
  custody: createCredentialCustody(() => (0, import_node_crypto20.randomUUID)()),
130647
130687
  log
130648
130688
  });
package/dist/index.cjs CHANGED
@@ -2758,7 +2758,7 @@ var init_package = __esm({
2758
2758
  "package.json"() {
2759
2759
  package_default = {
2760
2760
  name: "agent-shim",
2761
- version: "10.1.0",
2761
+ version: "11.1.0",
2762
2762
  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.",
2763
2763
  license: "MIT",
2764
2764
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -7145,7 +7145,7 @@ function resolveLaunchFlags(params) {
7145
7145
  skipPermissions: params.flags?.skipPermissions ?? parseEnvBool("AGENT_SHIM_SKIP_PERMISSIONS", params.env.AGENT_SHIM_SKIP_PERMISSIONS) ?? params.cascade?.skipPermissions ?? false,
7146
7146
  remoteControl: params.flags?.remoteControl ?? parseEnvBool("AGENT_SHIM_REMOTE_CONTROL", params.env.AGENT_SHIM_REMOTE_CONTROL) ?? params.cascade?.remoteControl ?? false,
7147
7147
  headroom: params.flags?.headroom ?? parseEnvBool("AGENT_SHIM_HEADROOM", params.env.AGENT_SHIM_HEADROOM) ?? params.cascade?.headroom ?? false,
7148
- trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? params.trackUsageDefault ?? false
7148
+ trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true
7149
7149
  };
7150
7150
  }
7151
7151
  function buildFlagArgs(flags) {
@@ -7648,8 +7648,6 @@ function decideLaunch(params, readOnly) {
7648
7648
  const discovered = params.resolveClaudeBinary(pinnedVersion === void 0 ? void 0 : { version: pinnedVersion.version });
7649
7649
  const flags = resolveLaunchFlags({
7650
7650
  env,
7651
- // A pool pick reads the usage the front door records, so a pool launch records its own unless something says otherwise.
7652
- ...poolExplanation === void 0 ? {} : { trackUsageDefault: true },
7653
7651
  ...cascadeLaunch === void 0 ? {} : { cascade: cascadeLaunch },
7654
7652
  flags: {
7655
7653
  ...parsedArgv.skipPermissions === void 0 ? {} : { skipPermissions: parsedArgv.skipPermissions },
package/dist/index.mjs CHANGED
@@ -2734,7 +2734,7 @@ var init_package = __esm({
2734
2734
  "package.json"() {
2735
2735
  package_default = {
2736
2736
  name: "agent-shim",
2737
- version: "10.1.0",
2737
+ version: "11.1.0",
2738
2738
  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.",
2739
2739
  license: "MIT",
2740
2740
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -7119,7 +7119,7 @@ function resolveLaunchFlags(params) {
7119
7119
  skipPermissions: params.flags?.skipPermissions ?? parseEnvBool("AGENT_SHIM_SKIP_PERMISSIONS", params.env.AGENT_SHIM_SKIP_PERMISSIONS) ?? params.cascade?.skipPermissions ?? false,
7120
7120
  remoteControl: params.flags?.remoteControl ?? parseEnvBool("AGENT_SHIM_REMOTE_CONTROL", params.env.AGENT_SHIM_REMOTE_CONTROL) ?? params.cascade?.remoteControl ?? false,
7121
7121
  headroom: params.flags?.headroom ?? parseEnvBool("AGENT_SHIM_HEADROOM", params.env.AGENT_SHIM_HEADROOM) ?? params.cascade?.headroom ?? false,
7122
- trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? params.trackUsageDefault ?? false
7122
+ trackUsage: params.flags?.trackUsage ?? parseEnvBool("AGENT_SHIM_TRACK_USAGE", params.env.AGENT_SHIM_TRACK_USAGE) ?? params.cascade?.trackUsage ?? true
7123
7123
  };
7124
7124
  }
7125
7125
  function buildFlagArgs(flags) {
@@ -7623,8 +7623,6 @@ function decideLaunch(params, readOnly) {
7623
7623
  const discovered = params.resolveClaudeBinary(pinnedVersion === void 0 ? void 0 : { version: pinnedVersion.version });
7624
7624
  const flags = resolveLaunchFlags({
7625
7625
  env,
7626
- // A pool pick reads the usage the front door records, so a pool launch records its own unless something says otherwise.
7627
- ...poolExplanation === void 0 ? {} : { trackUsageDefault: true },
7628
7626
  ...cascadeLaunch === void 0 ? {} : { cascade: cascadeLaunch },
7629
7627
  flags: {
7630
7628
  ...parsedArgv.skipPermissions === void 0 ? {} : { skipPermissions: parsedArgv.skipPermissions },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-shim",
3
- "version": "10.1.0",
3
+ "version": "11.1.0",
4
4
  "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.",
5
5
  "license": "MIT",
6
6
  "author": "Joseph Mearman <joseph@mearman.co.uk>",