agent-shim 8.25.0 → 8.26.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
@@ -61796,7 +61796,7 @@ function registerIdentityCommand(program2, deps) {
61796
61796
  // package.json
61797
61797
  var package_default = {
61798
61798
  name: "agent-shim",
61799
- version: "8.25.0",
61799
+ version: "8.26.0",
61800
61800
  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.",
61801
61801
  license: "MIT",
61802
61802
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -69666,6 +69666,166 @@ var CheckReportJsonSchema = external_exports.strictObject({
69666
69666
 
69667
69667
  // src/frontdoor/controlSchemas.ts
69668
69668
  var import_node_path33 = __toESM(require("node:path"), 1);
69669
+
69670
+ // src/frontdoor/rcSchemas.ts
69671
+ var RcPermissionModeSchema = external_exports.enum(RC_PERMISSION_MODES);
69672
+ var RcSessionSummarySchema = external_exports.strictObject({
69673
+ id: external_exports.string(),
69674
+ createdAt: external_exports.number(),
69675
+ lastSeenAt: external_exports.number()
69676
+ });
69677
+ function workerFactSchema(value2) {
69678
+ return external_exports.strictObject({ value: value2, observedAt: external_exports.number() });
69679
+ }
69680
+ var RcPendingRequestSummarySchema = external_exports.strictObject({
69681
+ sessionId: external_exports.string(),
69682
+ requestId: external_exports.string(),
69683
+ type: external_exports.string(),
69684
+ summary: external_exports.string(),
69685
+ observedAt: external_exports.number()
69686
+ });
69687
+ var RcSessionStatusSchema = external_exports.strictObject({
69688
+ ...RcSessionSummarySchema.shape,
69689
+ workerState: workerFactSchema(external_exports.string()).optional(),
69690
+ workerIdleSeconds: workerFactSchema(external_exports.number()).optional(),
69691
+ pending: external_exports.readonly(external_exports.array(RcPendingRequestSummarySchema))
69692
+ });
69693
+ var RcStreamEnvelopeSchema = external_exports.looseObject({
69694
+ /** The envelope's own event id, when the host sent one. */
69695
+ event_id: external_exports.string().optional(),
69696
+ /** The envelope's event type, the discriminator a consumer switches on (`control_request`, `user`, and kin). */
69697
+ event_type: external_exports.string(),
69698
+ /** The sequence number the host assigned, the value a resume continues after. */
69699
+ sequence_num: external_exports.int(),
69700
+ /** Who emitted the event (`worker` for the CLI's half, a client id for a client's). */
69701
+ source: external_exports.string(),
69702
+ /** The event's payload, carried verbatim: its shape is the payload family's, narrowed by whichever consumer needs it. Optional in the schema's own type because the door forwards the host's envelope as it arrived, asserting only the fields it relies on itself. */
69703
+ payload: external_exports.unknown().optional(),
69704
+ /** When the host created the event; the protocol's own type for this field is not established here, so it is forwarded rather than asserted. */
69705
+ created_at: external_exports.unknown().optional()
69706
+ });
69707
+ var RcStreamEventSchema = external_exports.strictObject({
69708
+ session: external_exports.string(),
69709
+ envelope: RcStreamEnvelopeSchema
69710
+ });
69711
+ var RcRateLimitWindowSchema = external_exports.looseObject({
69712
+ /** The fraction of the window used, usually between 0 and 1, above 1 when usage legitimately runs past the window's cap (the CLI's own field description states both). */
69713
+ utilization: external_exports.number().optional(),
69714
+ /** When the window resets, in unix epoch seconds: the unit is the CLI's own field description, stated in the 2.1.289 bundle's schema. */
69715
+ resetsAt: external_exports.number().optional()
69716
+ });
69717
+ var RcRateLimitInfoSchema = external_exports.looseObject({
69718
+ /** The limiting window's own status (`allowed`, `allowed_warning`, `rejected`), asserted only as a string because the vocabulary grows with the CLI. */
69719
+ status: external_exports.string(),
69720
+ /** When the limiting window resets, in unix epoch seconds. */
69721
+ resetsAt: external_exports.number().optional(),
69722
+ /** Which window the top-level fields describe (`five_hour`, `seven_day`, and kin), the payload's own name for it. */
69723
+ rateLimitType: external_exports.string().optional(),
69724
+ /** The fraction of the limiting window used, on the same scale the per-window utilizations carry. */
69725
+ utilization: external_exports.number().optional(),
69726
+ /** Whether usage beyond the plan (extra usage) is currently covering the overflow, the payload's own flag for it. */
69727
+ isUsingOverage: external_exports.boolean().optional(),
69728
+ /** The overage's own status, the same vocabulary the limiting window's `status` carries. */
69729
+ overageStatus: external_exports.string().optional(),
69730
+ /** When the overage window resets, in unix epoch seconds. */
69731
+ overageResetsAt: external_exports.number().optional(),
69732
+ /** Each subscription window the account's response headers carried: the session (five-hour), weekly (seven-day), and overage-included weekly windows, each present only when the account's responses carry it. */
69733
+ unifiedWindows: external_exports.looseObject({ five_hour: RcRateLimitWindowSchema.optional(), seven_day: RcRateLimitWindowSchema.optional(), seven_day_overage_included: RcRateLimitWindowSchema.optional() }).optional()
69734
+ });
69735
+ var RcLiveRateLimitSchema = external_exports.strictObject({
69736
+ session: external_exports.string(),
69737
+ observedAt: external_exports.number(),
69738
+ rateLimit: RcRateLimitInfoSchema
69739
+ });
69740
+ var RcSessionQuerySchema = external_exports.strictObject({
69741
+ session: external_exports.string().min(1).optional()
69742
+ });
69743
+ var RcSendInputSchema = external_exports.strictObject({
69744
+ session: external_exports.string().min(1),
69745
+ text: external_exports.string().min(1)
69746
+ });
69747
+ var RcAnswerInputSchema = external_exports.strictObject({
69748
+ session: external_exports.string().min(1),
69749
+ request: external_exports.string().min(1),
69750
+ approve: external_exports.boolean(),
69751
+ text: external_exports.string().optional()
69752
+ }).refine((input2) => !input2.approve || input2.text === void 0 || input2.text === "", { message: "an approval carries no text (the protocol's allow result has no message field); text is the denial message" });
69753
+ var RcInterruptInputSchema = external_exports.strictObject({
69754
+ session: external_exports.string().min(1)
69755
+ });
69756
+ var RcSetModelInputSchema = external_exports.strictObject({
69757
+ session: external_exports.string().min(1),
69758
+ model: external_exports.string().min(1)
69759
+ });
69760
+ var RcSetPermissionModeInputSchema = external_exports.strictObject({
69761
+ session: external_exports.string().min(1),
69762
+ mode: RcPermissionModeSchema
69763
+ });
69764
+ var RcEndSessionInputSchema = external_exports.strictObject({
69765
+ session: external_exports.string().min(1),
69766
+ reason: external_exports.string().min(1).optional()
69767
+ });
69768
+ var RcGetUsageInputSchema = external_exports.strictObject({
69769
+ session: external_exports.string().min(1),
69770
+ skipBehaviors: external_exports.boolean().optional()
69771
+ });
69772
+ var RcGetContextUsageInputSchema = external_exports.strictObject({
69773
+ session: external_exports.string().min(1),
69774
+ detail: external_exports.enum(RC_CONTEXT_USAGE_DETAILS).optional()
69775
+ });
69776
+ var RcReadFileInputSchema = external_exports.strictObject({
69777
+ session: external_exports.string().min(1),
69778
+ path: external_exports.string().min(1),
69779
+ maxBytes: external_exports.number().int().positive().optional(),
69780
+ encoding: external_exports.enum(RC_READ_FILE_ENCODINGS).optional()
69781
+ });
69782
+ var RcFileSuggestionsInputSchema = external_exports.strictObject({
69783
+ session: external_exports.string().min(1),
69784
+ query: external_exports.string()
69785
+ });
69786
+ var RcKeepAliveInputSchema = external_exports.strictObject({
69787
+ session: external_exports.string().min(1)
69788
+ });
69789
+ var RcMcpStatusInputSchema = external_exports.strictObject({
69790
+ session: external_exports.string().min(1)
69791
+ });
69792
+ var RcMcpReconnectInputSchema = external_exports.strictObject({
69793
+ session: external_exports.string().min(1),
69794
+ serverName: external_exports.string().min(1)
69795
+ });
69796
+ var RcMcpAuthenticateInputSchema = external_exports.strictObject({
69797
+ session: external_exports.string().min(1),
69798
+ serverName: external_exports.string().min(1),
69799
+ redirectUri: external_exports.string().min(1)
69800
+ });
69801
+ var RcMcpOAuthCallbackUrlInputSchema = external_exports.strictObject({
69802
+ session: external_exports.string().min(1),
69803
+ serverName: external_exports.string().min(1),
69804
+ callbackUrl: external_exports.string().min(1)
69805
+ });
69806
+ var RcTeleportInputSchema = external_exports.strictObject({
69807
+ session: external_exports.string().min(1),
69808
+ marker: external_exports.string().min(1)
69809
+ });
69810
+ var RcListOutputSchema = external_exports.strictObject({ sessions: external_exports.readonly(external_exports.array(RcSessionSummarySchema)) });
69811
+ var RcStatusOutputSchema = external_exports.strictObject({ statuses: external_exports.readonly(external_exports.array(RcSessionStatusSchema)) });
69812
+ var RcPendingOutputSchema = external_exports.strictObject({ pending: external_exports.readonly(external_exports.array(RcPendingRequestSummarySchema)) });
69813
+ var RcWriteOutputSchema = external_exports.strictObject({
69814
+ session: external_exports.string(),
69815
+ sequenceNums: external_exports.readonly(external_exports.array(external_exports.number()))
69816
+ });
69817
+ var RcControlWriteOutputSchema = external_exports.strictObject({
69818
+ session: external_exports.string(),
69819
+ request: external_exports.string(),
69820
+ sequenceNums: external_exports.readonly(external_exports.array(external_exports.number()))
69821
+ });
69822
+ var RcAnswerOutputSchema = external_exports.strictObject({
69823
+ session: external_exports.string(),
69824
+ request: external_exports.string(),
69825
+ sequenceNums: external_exports.readonly(external_exports.array(external_exports.number()))
69826
+ });
69827
+
69828
+ // src/frontdoor/controlSchemas.ts
69669
69829
  var UsageListOutputSchema = external_exports.strictObject({ snapshots: external_exports.readonly(external_exports.array(UsageSnapshotSchema)) });
69670
69830
  var UsageWindowsInputSchema = external_exports.strictObject({
69671
69831
  identity: external_exports.string().min(1),
@@ -69689,6 +69849,12 @@ var UsageWindowsOutputSchema = external_exports.strictObject({
69689
69849
  fiveHour: EffectiveWindowSchema.optional(),
69690
69850
  sevenDay: EffectiveWindowSchema.optional()
69691
69851
  });
69852
+ var UsageLiveOutputSchema = external_exports.strictObject({
69853
+ /** The freshest observation the door holds, never narrowed by the read's session filter because it is the door's single latest statement of the account's quota; absent while no rate_limit_event has been filed at all. */
69854
+ latest: RcLiveRateLimitSchema.optional(),
69855
+ /** One observation per session whose stream has filed a rate_limit_event this door generation. */
69856
+ sessions: external_exports.readonly(external_exports.array(RcLiveRateLimitSchema))
69857
+ });
69692
69858
  var FrontDoorSessionStatusSchema = external_exports.strictObject({
69693
69859
  pid: external_exports.int().positive(),
69694
69860
  startedAt: external_exports.number(),
@@ -71992,137 +72158,6 @@ var RPCHandler = class extends NodeHttpHandler {
71992
72158
 
71993
72159
  // src/frontdoor/rcApi.ts
71994
72160
  var import_undici2 = __toESM(require_undici(), 1);
71995
-
71996
- // src/frontdoor/rcSchemas.ts
71997
- var RcPermissionModeSchema = external_exports.enum(RC_PERMISSION_MODES);
71998
- var RcSessionSummarySchema = external_exports.strictObject({
71999
- id: external_exports.string(),
72000
- createdAt: external_exports.number(),
72001
- lastSeenAt: external_exports.number()
72002
- });
72003
- function workerFactSchema(value2) {
72004
- return external_exports.strictObject({ value: value2, observedAt: external_exports.number() });
72005
- }
72006
- var RcPendingRequestSummarySchema = external_exports.strictObject({
72007
- sessionId: external_exports.string(),
72008
- requestId: external_exports.string(),
72009
- type: external_exports.string(),
72010
- summary: external_exports.string(),
72011
- observedAt: external_exports.number()
72012
- });
72013
- var RcSessionStatusSchema = external_exports.strictObject({
72014
- ...RcSessionSummarySchema.shape,
72015
- workerState: workerFactSchema(external_exports.string()).optional(),
72016
- workerIdleSeconds: workerFactSchema(external_exports.number()).optional(),
72017
- pending: external_exports.readonly(external_exports.array(RcPendingRequestSummarySchema))
72018
- });
72019
- var RcStreamEnvelopeSchema = external_exports.looseObject({
72020
- /** The envelope's own event id, when the host sent one. */
72021
- event_id: external_exports.string().optional(),
72022
- /** The envelope's event type, the discriminator a consumer switches on (`control_request`, `user`, and kin). */
72023
- event_type: external_exports.string(),
72024
- /** The sequence number the host assigned, the value a resume continues after. */
72025
- sequence_num: external_exports.int(),
72026
- /** Who emitted the event (`worker` for the CLI's half, a client id for a client's). */
72027
- source: external_exports.string(),
72028
- /** The event's payload, carried verbatim: its shape is the payload family's, narrowed by whichever consumer needs it. Optional in the schema's own type because the door forwards the host's envelope as it arrived, asserting only the fields it relies on itself. */
72029
- payload: external_exports.unknown().optional(),
72030
- /** When the host created the event; the protocol's own type for this field is not established here, so it is forwarded rather than asserted. */
72031
- created_at: external_exports.unknown().optional()
72032
- });
72033
- var RcStreamEventSchema = external_exports.strictObject({
72034
- session: external_exports.string(),
72035
- envelope: RcStreamEnvelopeSchema
72036
- });
72037
- var RcSessionQuerySchema = external_exports.strictObject({
72038
- session: external_exports.string().min(1).optional()
72039
- });
72040
- var RcSendInputSchema = external_exports.strictObject({
72041
- session: external_exports.string().min(1),
72042
- text: external_exports.string().min(1)
72043
- });
72044
- var RcAnswerInputSchema = external_exports.strictObject({
72045
- session: external_exports.string().min(1),
72046
- request: external_exports.string().min(1),
72047
- approve: external_exports.boolean(),
72048
- text: external_exports.string().optional()
72049
- }).refine((input2) => !input2.approve || input2.text === void 0 || input2.text === "", { message: "an approval carries no text (the protocol's allow result has no message field); text is the denial message" });
72050
- var RcInterruptInputSchema = external_exports.strictObject({
72051
- session: external_exports.string().min(1)
72052
- });
72053
- var RcSetModelInputSchema = external_exports.strictObject({
72054
- session: external_exports.string().min(1),
72055
- model: external_exports.string().min(1)
72056
- });
72057
- var RcSetPermissionModeInputSchema = external_exports.strictObject({
72058
- session: external_exports.string().min(1),
72059
- mode: RcPermissionModeSchema
72060
- });
72061
- var RcEndSessionInputSchema = external_exports.strictObject({
72062
- session: external_exports.string().min(1),
72063
- reason: external_exports.string().min(1).optional()
72064
- });
72065
- var RcGetUsageInputSchema = external_exports.strictObject({
72066
- session: external_exports.string().min(1),
72067
- skipBehaviors: external_exports.boolean().optional()
72068
- });
72069
- var RcGetContextUsageInputSchema = external_exports.strictObject({
72070
- session: external_exports.string().min(1),
72071
- detail: external_exports.enum(RC_CONTEXT_USAGE_DETAILS).optional()
72072
- });
72073
- var RcReadFileInputSchema = external_exports.strictObject({
72074
- session: external_exports.string().min(1),
72075
- path: external_exports.string().min(1),
72076
- maxBytes: external_exports.number().int().positive().optional(),
72077
- encoding: external_exports.enum(RC_READ_FILE_ENCODINGS).optional()
72078
- });
72079
- var RcFileSuggestionsInputSchema = external_exports.strictObject({
72080
- session: external_exports.string().min(1),
72081
- query: external_exports.string()
72082
- });
72083
- var RcKeepAliveInputSchema = external_exports.strictObject({
72084
- session: external_exports.string().min(1)
72085
- });
72086
- var RcMcpStatusInputSchema = external_exports.strictObject({
72087
- session: external_exports.string().min(1)
72088
- });
72089
- var RcMcpReconnectInputSchema = external_exports.strictObject({
72090
- session: external_exports.string().min(1),
72091
- serverName: external_exports.string().min(1)
72092
- });
72093
- var RcMcpAuthenticateInputSchema = external_exports.strictObject({
72094
- session: external_exports.string().min(1),
72095
- serverName: external_exports.string().min(1),
72096
- redirectUri: external_exports.string().min(1)
72097
- });
72098
- var RcMcpOAuthCallbackUrlInputSchema = external_exports.strictObject({
72099
- session: external_exports.string().min(1),
72100
- serverName: external_exports.string().min(1),
72101
- callbackUrl: external_exports.string().min(1)
72102
- });
72103
- var RcTeleportInputSchema = external_exports.strictObject({
72104
- session: external_exports.string().min(1),
72105
- marker: external_exports.string().min(1)
72106
- });
72107
- var RcListOutputSchema = external_exports.strictObject({ sessions: external_exports.readonly(external_exports.array(RcSessionSummarySchema)) });
72108
- var RcStatusOutputSchema = external_exports.strictObject({ statuses: external_exports.readonly(external_exports.array(RcSessionStatusSchema)) });
72109
- var RcPendingOutputSchema = external_exports.strictObject({ pending: external_exports.readonly(external_exports.array(RcPendingRequestSummarySchema)) });
72110
- var RcWriteOutputSchema = external_exports.strictObject({
72111
- session: external_exports.string(),
72112
- sequenceNums: external_exports.readonly(external_exports.array(external_exports.number()))
72113
- });
72114
- var RcControlWriteOutputSchema = external_exports.strictObject({
72115
- session: external_exports.string(),
72116
- request: external_exports.string(),
72117
- sequenceNums: external_exports.readonly(external_exports.array(external_exports.number()))
72118
- });
72119
- var RcAnswerOutputSchema = external_exports.strictObject({
72120
- session: external_exports.string(),
72121
- request: external_exports.string(),
72122
- sequenceNums: external_exports.readonly(external_exports.array(external_exports.number()))
72123
- });
72124
-
72125
- // src/frontdoor/rcApi.ts
72126
72161
  var RC_ORPC_PATH_PREFIX = "/__agent-shim/orpc";
72127
72162
  var RC_SUBSCRIBER_BUFFER_EVENTS = 100;
72128
72163
  function doorApiAuth(expectedToken) {
@@ -72334,6 +72369,16 @@ function createControlApiRouter(deps) {
72334
72369
  ...unified?.fiveHour === void 0 ? {} : { fiveHour: effectiveWindow(unified.fiveHour, now) },
72335
72370
  ...unified?.sevenDay === void 0 ? {} : { sevenDay: effectiveWindow(unified.sevenDay, now) }
72336
72371
  };
72372
+ }),
72373
+ live: authed.input(RcSessionQuerySchema).output(UsageLiveOutputSchema).handler(({ input: input2 }) => {
72374
+ const sessions = deps.liveRateLimits(input2.session);
72375
+ if (input2.session !== void 0 && sessions.length === 0) {
72376
+ if (deps.list().some((session) => session.id === input2.session)) {
72377
+ throw new ORPCError("NOT_FOUND", { message: `session ${input2.session} has filed no rate_limit_event on its stream yet: the worker emits one only once a turn has completed, so retry after this session's next turn` });
72378
+ }
72379
+ throw new ORPCError("NOT_FOUND", { message: rcSessionNotObservedMessage(input2.session) });
72380
+ }
72381
+ return { latest: deps.latestRateLimit(), sessions };
72337
72382
  })
72338
72383
  },
72339
72384
  frontdoor: {
@@ -73766,13 +73811,49 @@ function attachingProviderCredential(route, deps) {
73766
73811
  // src/frontdoor/rcCommands.ts
73767
73812
  var import_node_crypto14 = require("node:crypto");
73768
73813
 
73814
+ // src/frontdoor/rcLiveUsage.ts
73815
+ var RC_RATE_LIMIT_EVENT_TYPE = "rate_limit_event";
73816
+ function isRecord4(value2) {
73817
+ return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
73818
+ }
73819
+ function rcRateLimitInfoOf(event) {
73820
+ const payload = event.envelope.payload;
73821
+ if (!isRecord4(payload) || payload.type !== RC_RATE_LIMIT_EVENT_TYPE) {
73822
+ return void 0;
73823
+ }
73824
+ if (!isRecord4(payload.rate_limit_info)) {
73825
+ return void 0;
73826
+ }
73827
+ const parsed = RcRateLimitInfoSchema.safeParse(payload.rate_limit_info);
73828
+ return parsed.success ? parsed.data : void 0;
73829
+ }
73830
+ function createRcLiveUsage(deps) {
73831
+ const observed = /* @__PURE__ */ new Map();
73832
+ deps.hub.subscribe([DOOR_EVENT_SOURCE_RC], (event) => {
73833
+ const stream = RcStreamEventSchema.safeParse(event.payload);
73834
+ if (!stream.success) {
73835
+ return;
73836
+ }
73837
+ const rateLimit = rcRateLimitInfoOf(stream.data);
73838
+ if (rateLimit === void 0) {
73839
+ return;
73840
+ }
73841
+ observed.set(stream.data.session, { session: stream.data.session, observedAt: deps.now(), rateLimit });
73842
+ });
73843
+ const sorted = () => [...observed.values()].sort((left, right) => left.observedAt - right.observedAt || (left.session < right.session ? -1 : 1));
73844
+ return {
73845
+ liveOf: (sessionId) => sorted().filter((entry) => sessionId === void 0 || entry.session === sessionId),
73846
+ latestOf: () => sorted().at(-1)
73847
+ };
73848
+ }
73849
+
73769
73850
  // src/frontdoor/rcSelfHostMint.ts
73770
73851
  var import_node_path34 = __toESM(require("node:path"), 1);
73771
73852
 
73772
73853
  // src/frontdoor/rcSelfHostEndpoints.ts
73773
73854
  var RC_SOURCE_WORKER = "worker";
73774
73855
  var RC_SOURCE_CLIENT = "client";
73775
- function isRecord4(value2) {
73856
+ function isRecord5(value2) {
73776
73857
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
73777
73858
  }
73778
73859
  function parseJsonObject2(body) {
@@ -73782,7 +73863,7 @@ function parseJsonObject2(body) {
73782
73863
  } catch {
73783
73864
  return void 0;
73784
73865
  }
73785
- return isRecord4(parsed) ? parsed : void 0;
73866
+ return isRecord5(parsed) ? parsed : void 0;
73786
73867
  }
73787
73868
  function nonEmptyString2(record2, field) {
73788
73869
  const value2 = record2 === void 0 ? void 0 : record2[field];
@@ -73856,7 +73937,7 @@ async function serveRcClientChannels(ctx, tail, method, maxBatchEvents) {
73856
73937
  }
73857
73938
  const results = [];
73858
73939
  for (const event of events) {
73859
- if (!isRecord4(event) || !isRecord4(event.payload)) {
73940
+ if (!isRecord5(event) || !isRecord5(event.payload)) {
73860
73941
  await ctx.answerJson(response, HTTP_STATUS.badRequest, { type: "error", error: { type: "invalid_request_error", message: "every event in a teleport write is an object carrying one payload object" } });
73861
73942
  return true;
73862
73943
  }
@@ -74226,7 +74307,7 @@ var RC_SELF_HOST_WORKER_EPOCH = 1;
74226
74307
  var RC_STREAM_EVENT_NAME = "client_event";
74227
74308
  var CONFLICT_REASON_HEADER2 = "x-ccr-conflict-reason";
74228
74309
  var CONFLICT_REASON_EPOCH_STALE = "epoch_stale";
74229
- function isRecord5(value2) {
74310
+ function isRecord6(value2) {
74230
74311
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
74231
74312
  }
74232
74313
  function isWebSearchRefusal(value2) {
@@ -74310,7 +74391,7 @@ function parseJsonObject3(body) {
74310
74391
  } catch {
74311
74392
  return void 0;
74312
74393
  }
74313
- return isRecord5(parsed) ? parsed : void 0;
74394
+ return isRecord6(parsed) ? parsed : void 0;
74314
74395
  }
74315
74396
  function mintWorkerJwt(randomToken, issuedAt) {
74316
74397
  const encode3 = (value2) => Buffer.from(JSON.stringify(value2), "utf8").toString("base64url");
@@ -74557,7 +74638,7 @@ data: ${JSON.stringify(envelope)}
74557
74638
  if (status !== void 0) {
74558
74639
  session.workerStatus = status;
74559
74640
  }
74560
- if (isRecord5(body?.external_metadata)) {
74641
+ if (isRecord6(body?.external_metadata)) {
74561
74642
  session.externalMetadata = body.external_metadata;
74562
74643
  }
74563
74644
  await answerJson2(response, HTTP_STATUS.ok, {});
@@ -74587,7 +74668,7 @@ data: ${JSON.stringify(envelope)}
74587
74668
  }
74588
74669
  const results = [];
74589
74670
  for (const event of events) {
74590
- if (!isRecord5(event) || !isRecord5(event.payload)) {
74671
+ if (!isRecord6(event) || !isRecord6(event.payload)) {
74591
74672
  await answerJson2(response, HTTP_STATUS.badRequest, { type: "error", error: { type: "invalid_request_error", message: "every event in a batch is an object carrying one payload object" } });
74592
74673
  return;
74593
74674
  }
@@ -74620,7 +74701,7 @@ data: ${JSON.stringify(envelope)}
74620
74701
  return;
74621
74702
  }
74622
74703
  for (const event of events) {
74623
- if (isRecord5(event)) {
74704
+ if (isRecord6(event)) {
74624
74705
  session.internalEvents.push({ eventId: deps.newUuid(), body: event });
74625
74706
  }
74626
74707
  }
@@ -74716,7 +74797,7 @@ data: ${JSON.stringify(envelope)}
74716
74797
  }
74717
74798
  const results = [];
74718
74799
  for (const event of events) {
74719
- if (!isRecord5(event) || !isRecord5(event.payload)) {
74800
+ if (!isRecord6(event) || !isRecord6(event.payload)) {
74720
74801
  await answerJson2(response, HTTP_STATUS.badRequest, { type: "error", error: { type: "invalid_request_error", message: "every event in a write is an object carrying one payload object" } });
74721
74802
  return;
74722
74803
  }
@@ -74909,7 +74990,7 @@ var RC_SELF_HOST_RECORD_DIR = "rc-selfhost";
74909
74990
  var RC_SELF_HOST_RECORD_FILE = "credential.json";
74910
74991
  var SELF_HOST_EMAIL = "selfhost@agent-shim.invalid";
74911
74992
  var SELF_HOST_SUBSCRIPTION_TYPE = "max";
74912
- function isRecord6(value2) {
74993
+ function isRecord7(value2) {
74913
74994
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
74914
74995
  }
74915
74996
  function readJsonObject(fs20, file2) {
@@ -74923,7 +75004,7 @@ function readJsonObject(fs20, file2) {
74923
75004
  } catch {
74924
75005
  return void 0;
74925
75006
  }
74926
- return isRecord6(parsed) ? parsed : void 0;
75007
+ return isRecord7(parsed) ? parsed : void 0;
74927
75008
  }
74928
75009
  function readRcSelfHostRecord(fs20, frontdoorDir) {
74929
75010
  const parsed = readJsonObject(fs20, import_node_path34.default.join(frontdoorDir, RC_SELF_HOST_RECORD_DIR, RC_SELF_HOST_RECORD_FILE));
@@ -74947,7 +75028,7 @@ function mintRcSelfHostCredential(deps) {
74947
75028
  const recordFile = import_node_path34.default.join(recordDir, RC_SELF_HOST_RECORD_FILE);
74948
75029
  const previousRecord = readRcSelfHostRecord(deps.fs, deps.frontdoorDir);
74949
75030
  const existingCredentials = readJsonObject(deps.fs, credentialsFile);
74950
- const existingOauth = isRecord6(existingCredentials?.claudeAiOauth) ? existingCredentials.claudeAiOauth : void 0;
75031
+ const existingOauth = isRecord7(existingCredentials?.claudeAiOauth) ? existingCredentials.claudeAiOauth : void 0;
74951
75032
  const existingToken = typeof existingOauth?.accessToken === "string" && existingOauth.accessToken !== "" ? existingOauth.accessToken : void 0;
74952
75033
  const existingIsOwn = existingToken !== void 0 && previousRecord?.accessToken === existingToken;
74953
75034
  if (existingToken !== void 0 && !existingIsOwn && !deps.force) {
@@ -74964,7 +75045,7 @@ function mintRcSelfHostCredential(deps) {
74964
75045
  deps.fs.writeFilePrivate(credentialsFile, `${JSON.stringify({ ...existingCredentials, claudeAiOauth: { accessToken, refreshToken, expiresAt: null, scopes: [...RC_SELF_HOST_SCOPE_LIST], subscriptionType: SELF_HOST_SUBSCRIPTION_TYPE, rateLimitTier: null } }, null, 2)}
74965
75046
  `);
74966
75047
  const claudeJson = readJsonObject(deps.fs, claudeJsonFile) ?? {};
74967
- const existingBlock = (value2) => isRecord6(value2) ? value2 : {};
75048
+ const existingBlock = (value2) => isRecord7(value2) ? value2 : {};
74968
75049
  deps.fs.writeFilePrivate(claudeJsonFile, `${JSON.stringify({
74969
75050
  ...claudeJson,
74970
75051
  oauthAccount: {
@@ -75042,9 +75123,54 @@ function formatRcPendingList(pending) {
75042
75123
  function eventExcerpt(text2) {
75043
75124
  return text2.length <= RC_PENDING_SUMMARY_EXCERPT_CHARS ? text2 : `${text2.slice(0, RC_PENDING_SUMMARY_EXCERPT_CHARS)}...`;
75044
75125
  }
75126
+ var PERCENT_SCALE = 100;
75127
+ var MS_PER_SECOND8 = 1e3;
75128
+ function percentOf(fraction) {
75129
+ return `${String(Math.round(fraction * PERCENT_SCALE))}%`;
75130
+ }
75131
+ function resetInstantOf(epochSeconds) {
75132
+ return new Date(epochSeconds * MS_PER_SECOND8).toISOString();
75133
+ }
75134
+ function formatRcRateLimitInfo(info) {
75135
+ const parts = [info.status];
75136
+ if (info.rateLimitType !== void 0) {
75137
+ parts.push(info.rateLimitType);
75138
+ }
75139
+ if (info.utilization !== void 0) {
75140
+ parts.push(percentOf(info.utilization));
75141
+ }
75142
+ if (info.resetsAt !== void 0) {
75143
+ parts.push(`resets ${resetInstantOf(info.resetsAt)}`);
75144
+ }
75145
+ const windows = [];
75146
+ for (const name of ["five_hour", "seven_day", "seven_day_overage_included"]) {
75147
+ const window = info.unifiedWindows?.[name];
75148
+ if (window === void 0) {
75149
+ continue;
75150
+ }
75151
+ const bits = [];
75152
+ if (window.utilization !== void 0) {
75153
+ bits.push(percentOf(window.utilization));
75154
+ }
75155
+ if (window.resetsAt !== void 0) {
75156
+ bits.push(`resets ${resetInstantOf(window.resetsAt)}`);
75157
+ }
75158
+ windows.push(bits.length === 0 ? name : `${name} ${bits.join(" ")}`);
75159
+ }
75160
+ if (windows.length > 0) {
75161
+ parts.push(`windows ${windows.join(", ")}`);
75162
+ }
75163
+ if (info.isUsingOverage === true) {
75164
+ parts.push("overage in use");
75165
+ } else if (info.overageStatus !== void 0) {
75166
+ parts.push(`overage ${info.overageStatus}`);
75167
+ }
75168
+ return parts.join(" ");
75169
+ }
75045
75170
  function formatRcStreamEvent(event) {
75046
75171
  const { envelope } = event;
75047
- const sketch = envelope.payload === void 0 ? "" : ` ${eventExcerpt(JSON.stringify(envelope.payload))}`;
75172
+ const rateLimit = rcRateLimitInfoOf(event);
75173
+ const sketch = rateLimit !== void 0 ? ` ${formatRcRateLimitInfo(rateLimit)}` : envelope.payload === void 0 ? "" : ` ${eventExcerpt(JSON.stringify(envelope.payload))}`;
75048
75174
  return `${event.session} ${envelope.event_type} sequence_num ${String(envelope.sequence_num)} source ${envelope.source}${sketch}`;
75049
75175
  }
75050
75176
  function formatRcSelfHostMint(result) {
@@ -75270,7 +75396,7 @@ function registerRcCommand(frontdoor, paths) {
75270
75396
  ['agent-shim frontdoor rc teleport --session cse_00000000-0000-4000-8000-000000000000 --marker "__ULTRAPAN_TELEPORT_LOCAL__"']
75271
75397
  );
75272
75398
  withExamples(
75273
- rc.command("watch").description("Print the observed sessions' client read stream events as they arrive, the approvals the door's held stream receives above all, until Ctrl-C leaves. Read-only.").argument("[session]", "One cse_ session id, as `frontdoor rc list` shows it; every observed session when omitted.").option("--json", "Print each event as one JSON line as it arrives.").action(async (session, options) => {
75399
+ rc.command("watch").description("Print the observed sessions' client read stream events as they arrive, the approvals the door's held stream receives above all, with each rate_limit_event rendered as the account's quota state. Read-only, until Ctrl-C leaves.").argument("[session]", "One cse_ session id, as `frontdoor rc list` shows it; every observed session when omitted.").option("--json", "Print each event as one JSON line as it arrives.").action(async (session, options) => {
75274
75400
  const client = frontDoorRcApiFromState(realFarmFs, paths);
75275
75401
  const leave = new AbortController();
75276
75402
  const onInterrupt = () => {
@@ -75328,11 +75454,11 @@ var import_node_path35 = __toESM(require("node:path"), 1);
75328
75454
  function isSafeSessionId(sessionId) {
75329
75455
  return /^[A-Za-z0-9_-]+$/.test(sessionId);
75330
75456
  }
75331
- function isRecord7(value2) {
75457
+ function isRecord8(value2) {
75332
75458
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
75333
75459
  }
75334
75460
  function credentialOfJson(parsed) {
75335
- if (!isRecord7(parsed)) {
75461
+ if (!isRecord8(parsed)) {
75336
75462
  return void 0;
75337
75463
  }
75338
75464
  const { authorization, anthropicVersion, anthropicClientPlatform } = parsed;
@@ -75362,7 +75488,7 @@ function createRcCredentialStore(fs20, dir) {
75362
75488
  } catch {
75363
75489
  return void 0;
75364
75490
  }
75365
- return isRecord7(parsed) ? parsed : void 0;
75491
+ return isRecord8(parsed) ? parsed : void 0;
75366
75492
  };
75367
75493
  return {
75368
75494
  read: (sessionId) => {
@@ -75476,12 +75602,61 @@ function sketch(value, cap) {
75476
75602
  return text.length > cap ? text.slice(0, cap) + '...' : text;
75477
75603
  }
75478
75604
 
75479
- // The headline text of one Remote Control stream event: the assistant and user payloads that carry a content array of text blocks render as their prose, everything else as its type plus a sketch.
75605
+ // One utilization fraction as a whole percentage, the same rounding the CLI's own watch line applies.
75606
+ function percentOf(fraction) { return String(Math.round(fraction * 100)) + '%'; }
75607
+
75608
+ // The reset instant a rate-limit payload states (unix epoch seconds) as an ISO instant; no countdown is derived from it, because a ticking derivation would claim a freshness the event stream never promised.
75609
+ function resetInstantOf(epochSeconds) { return new Date(epochSeconds * 1000).toISOString(); }
75610
+
75611
+ // Whether one rate-limit payload is readable, narrowed the same way the door's live usage state narrows it: the event type and a rate_limit_info object.
75612
+ function rateLimitInfoOf(payload) {
75613
+ if (payload === undefined || payload === null || typeof payload !== 'object' || payload.type !== 'rate_limit_event') { return undefined; }
75614
+ var info = payload.rate_limit_info;
75615
+ if (info === undefined || info === null || typeof info !== 'object' || typeof info.status !== 'string') { return undefined; }
75616
+ return info;
75617
+ }
75618
+
75619
+ // One rate-limit payload's facts as the quota summary the feed and the header render: the limiting window's status and utilisation, each subscription window, and the overage state, every value the payload's own words.
75620
+ function quotaSummary(info) {
75621
+ var parts = [info.status];
75622
+ if (info.rateLimitType !== undefined) { parts.push(info.rateLimitType); }
75623
+ if (typeof info.utilization === 'number') { parts.push(percentOf(info.utilization)); }
75624
+ if (typeof info.resetsAt === 'number') { parts.push('resets ' + resetInstantOf(info.resetsAt)); }
75625
+ if (info.unifiedWindows !== undefined && info.unifiedWindows !== null && typeof info.unifiedWindows === 'object') {
75626
+ var names = ['five_hour', 'seven_day', 'seven_day_overage_included'];
75627
+ var windows = [];
75628
+ for (var i = 0; i < names.length; i++) {
75629
+ var window = info.unifiedWindows[names[i]];
75630
+ if (window === undefined || window === null) { continue; }
75631
+ var bits = [];
75632
+ if (typeof window.utilization === 'number') { bits.push(percentOf(window.utilization)); }
75633
+ if (typeof window.resetsAt === 'number') { bits.push('resets ' + resetInstantOf(window.resetsAt)); }
75634
+ windows.push(bits.length === 0 ? names[i] : names[i] + ' ' + bits.join(' '));
75635
+ }
75636
+ if (windows.length > 0) { parts.push('windows ' + windows.join(', ')); }
75637
+ }
75638
+ if (info.isUsingOverage === true) { parts.push('overage in use'); }
75639
+ else if (typeof info.overageStatus === 'string') { parts.push('overage ' + info.overageStatus); }
75640
+ return parts.join(' ');
75641
+ }
75642
+
75643
+ // The header's quota text from the door's freshest live observation: the quota summary plus when the door observed it, or the plain statement that none has arrived yet.
75644
+ function quotaText(latest) {
75645
+ if (latest === undefined || latest === null) { return 'quota: not observed yet'; }
75646
+ var info = rateLimitInfoOf({ type: 'rate_limit_event', rate_limit_info: latest.rateLimit });
75647
+ if (info === undefined) { return 'quota: not readable'; }
75648
+ return 'quota: ' + quotaSummary(info) + ' observed ' + new Date(latest.observedAt).toLocaleTimeString();
75649
+ }
75650
+
75651
+ // The headline text of one Remote Control stream event: a rate-limit payload renders as its quota summary, the assistant and user payloads that carry a content array of text blocks render as their prose, everything else as its type plus a sketch.
75480
75652
  function rcLine(event) {
75481
75653
  var envelope = event.envelope;
75482
75654
  var payload = envelope.payload;
75483
75655
  var headline = '';
75484
- if (payload !== undefined && payload !== null && typeof payload === 'object' && Array.isArray(payload.content)) {
75656
+ var rateLimit = rateLimitInfoOf(payload);
75657
+ if (rateLimit !== undefined) {
75658
+ headline = quotaSummary(rateLimit);
75659
+ } else if (payload !== undefined && payload !== null && typeof payload === 'object' && Array.isArray(payload.content)) {
75485
75660
  var parts = [];
75486
75661
  for (var i = 0; i < payload.content.length; i++) {
75487
75662
  var block = payload.content[i];
@@ -75610,6 +75785,13 @@ function refreshPending() {
75610
75785
  rpc('rc/pending', ui !== null && ui.selected !== null ? { session: ui.selected } : {}).then(function (result) { renderPending(result.pending); }, authOrReport('rc/pending'));
75611
75786
  }
75612
75787
 
75788
+ // The header's quota span, fed by the door's live read on the same refresh cycle as the session and pending lists: the freshest rate-limit observation any session's stream has filed, with its observation time so its freshness reads at a glance.
75789
+ function refreshQuota() {
75790
+ rpc('usage/live', {}).then(function (result) {
75791
+ if (ui !== null) { ui.quotaState.textContent = quotaText(result.latest); }
75792
+ }, authOrReport('usage/live'));
75793
+ }
75794
+
75613
75795
  // The one error path every call shares: a 401 means this token is not this generation's, so the page says so and asks for it again; anything else is reported in the feed.
75614
75796
  function authOrReport(what) {
75615
75797
  return function (error) {
@@ -75697,11 +75879,12 @@ function startPage(heldToken) {
75697
75879
  promptTarget: document.getElementById('prompt-target'),
75698
75880
  send: document.getElementById('send'),
75699
75881
  streamState: document.getElementById('stream-state'),
75882
+ quotaState: document.getElementById('quota-state'),
75700
75883
  selected: null,
75701
75884
  };
75702
75885
  document.getElementById('token-form').classList.add('hidden');
75703
75886
  ui.main.classList.remove('hidden');
75704
- document.getElementById('refresh').addEventListener('click', function () { refreshSessions(); refreshPending(); });
75887
+ document.getElementById('refresh').addEventListener('click', function () { refreshSessions(); refreshPending(); refreshQuota(); });
75705
75888
  document.getElementById('send').addEventListener('click', sendPrompt);
75706
75889
  document.getElementById('source-filter').addEventListener('change', function () { runFeed(); });
75707
75890
  ui.prompt.addEventListener('keydown', function (event) {
@@ -75709,7 +75892,8 @@ function startPage(heldToken) {
75709
75892
  });
75710
75893
  refreshSessions();
75711
75894
  refreshPending();
75712
- window.setInterval(function () { refreshSessions(); refreshPending(); }, 4000);
75895
+ refreshQuota();
75896
+ window.setInterval(function () { refreshSessions(); refreshPending(); refreshQuota(); }, 4000);
75713
75897
  runFeed();
75714
75898
  document.getElementById('door-state').textContent = 'connected';
75715
75899
  }
@@ -75788,6 +75972,7 @@ var RC_CLIENT_PAGE_HTML = `<!doctype html>
75788
75972
  <h1>agent-shim Remote Control</h1>
75789
75973
  <span class="state" id="door-state">connecting</span>
75790
75974
  <span class="state" id="stream-state"></span>
75975
+ <span class="state" id="quota-state">quota: not observed yet</span>
75791
75976
  </header>
75792
75977
  <div id="token-form">
75793
75978
  <h2>This door's control token</h2>
@@ -75926,7 +76111,7 @@ function createSseParser() {
75926
76111
  }
75927
76112
  };
75928
76113
  }
75929
- function isRecord8(value2) {
76114
+ function isRecord9(value2) {
75930
76115
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
75931
76116
  }
75932
76117
  function sequenceNumOf(value2) {
@@ -75948,7 +76133,7 @@ function parseRcStreamEnvelope(parsed) {
75948
76133
  } catch {
75949
76134
  return void 0;
75950
76135
  }
75951
- if (!isRecord8(data)) {
76136
+ if (!isRecord9(data)) {
75952
76137
  return void 0;
75953
76138
  }
75954
76139
  const eventType = data.event_type;
@@ -76236,7 +76421,7 @@ var ProviderQuotaError = class extends Error {
76236
76421
  this.name = "ProviderQuotaError";
76237
76422
  }
76238
76423
  };
76239
- var MS_PER_SECOND8 = 1e3;
76424
+ var MS_PER_SECOND9 = 1e3;
76240
76425
  var SECONDS_PER_HOUR = 3600;
76241
76426
  var HOURS_PER_DAY3 = 24;
76242
76427
  var DAYS_PER_MONTH = 30;
@@ -76248,8 +76433,8 @@ var ZAI_QUOTA_URL = `https://${ZAI_HOST}/api/monitor/usage/quota/limit`;
76248
76433
  var ZAI_UNIT_HOURS = 3;
76249
76434
  var ZAI_UNIT_MONTHS = 5;
76250
76435
  var ZAI_UNIT_MS = /* @__PURE__ */ new Map([
76251
- [ZAI_UNIT_HOURS, SECONDS_PER_HOUR * MS_PER_SECOND8],
76252
- [ZAI_UNIT_MONTHS, DAYS_PER_MONTH * HOURS_PER_DAY3 * SECONDS_PER_HOUR * MS_PER_SECOND8]
76436
+ [ZAI_UNIT_HOURS, SECONDS_PER_HOUR * MS_PER_SECOND9],
76437
+ [ZAI_UNIT_MONTHS, DAYS_PER_MONTH * HOURS_PER_DAY3 * SECONDS_PER_HOUR * MS_PER_SECOND9]
76253
76438
  ]);
76254
76439
  var ZAI_MEASURES = { TOKENS_LIMIT: "tokens", TIME_LIMIT: "tool-calls" };
76255
76440
  var ZaiLimitSchema = external_exports.object({
@@ -76313,7 +76498,7 @@ var OPENROUTER_HOST = "openrouter.ai";
76313
76498
  var OPENROUTER_KEY_URL = `https://${OPENROUTER_HOST}/api/v1/key`;
76314
76499
  var OPENROUTER_CREDITS_URL = `https://${OPENROUTER_HOST}/api/v1/credits`;
76315
76500
  var HTTP_FORBIDDEN = 403;
76316
- var MS_PER_DAY2 = HOURS_PER_DAY3 * SECONDS_PER_HOUR * MS_PER_SECOND8;
76501
+ var MS_PER_DAY2 = HOURS_PER_DAY3 * SECONDS_PER_HOUR * MS_PER_SECOND9;
76317
76502
  var OpenRouterKeySchema = external_exports.object({
76318
76503
  data: external_exports.object({
76319
76504
  limit: external_exports.number().nonnegative().nullable(),
@@ -76556,6 +76741,7 @@ function realFrontDoorSupervisorPorts(paths) {
76556
76741
  const rcCredentialStore = createRcCredentialStore(realFarmFs, paths.frontdoorRcCredentialsDir);
76557
76742
  const rcTracker = createRcSessionTracker({ now: () => Date.now(), idleMs: RC_IDLE_EXPIRY_MS, credentialStore: rcCredentialStore });
76558
76743
  const doorEvents = createDoorEventHub();
76744
+ const rcLiveUsage = createRcLiveUsage({ now: () => Date.now(), hub: doorEvents });
76559
76745
  const rcFanout = rcFanoutOnDoorHub(createRcEventFanout(), doorEvents);
76560
76746
  const rcHub = createRcStreamHub({
76561
76747
  now: () => Date.now(),
@@ -76658,6 +76844,9 @@ function realFrontDoorSupervisorPorts(paths) {
76658
76844
  const rcMcpOAuthCallbackUrl = async (sessionId, serverName, callbackUrl) => await submitRcSessionMcpOAuthCallbackUrl(rcControlRequestDeps, sessionId, serverName, callbackUrl);
76659
76845
  const rcTeleport = async (sessionId, marker) => await teleportRcSession(rcControlRequestDeps, sessionId, marker);
76660
76846
  const controlDeps = {
76847
+ list: rcTracker.list,
76848
+ liveRateLimits: rcLiveUsage.liveOf,
76849
+ latestRateLimit: rcLiveUsage.latestOf,
76661
76850
  usageSnapshots: () => listUsageSnapshots(realFarmFs, paths.usageSnapshotsDir),
76662
76851
  usageSnapshotOf: (identity) => readUsageSnapshot(realFarmFs, paths.usageSnapshotsDir, identity),
76663
76852
  now: () => Date.now(),
@@ -76678,7 +76867,6 @@ function realFrontDoorSupervisorPorts(paths) {
76678
76867
  [
76679
76868
  createDoorApiNodeHandler({
76680
76869
  expectedToken: rcControlToken,
76681
- list: rcTracker.list,
76682
76870
  statusOf: rcTracker.statusOf,
76683
76871
  pendingOf: rcTracker.pendingOf,
76684
76872
  inject: rcInject,