@cortexkit/antigravity-auth-core 3.0.29 → 3.0.31

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.
Files changed (46) hide show
  1. package/dist/agy-request-metadata.d.ts.map +1 -1
  2. package/dist/agy-request-metadata.js +3 -0
  3. package/dist/agy-request-metadata.js.map +1 -1
  4. package/dist/common-auth-embedded/claustrum/consumer.d.ts +12 -0
  5. package/dist/common-auth-embedded/claustrum/consumer.js +36 -0
  6. package/dist/common-auth-embedded/claustrum/custody.d.ts +16 -4
  7. package/dist/common-auth-embedded/claustrum/custody.js +74 -9
  8. package/dist/common-auth-embedded/claustrum/hub.d.ts +3 -2
  9. package/dist/common-auth-embedded/claustrum/hub.js +8 -0
  10. package/dist/common-auth-embedded/claustrum/index.d.ts +1 -0
  11. package/dist/common-auth-embedded/claustrum/roster.d.ts +4 -0
  12. package/dist/common-auth-embedded/claustrum/roster.js +34 -8
  13. package/dist/common-auth-embedded/claustrum/usage.d.ts +41 -0
  14. package/dist/common-auth-embedded/claustrum/usage.js +145 -0
  15. package/dist/common-auth-embedded/commands/builtins.d.ts +5 -0
  16. package/dist/common-auth-embedded/commands/builtins.js +38 -0
  17. package/dist/common-auth-embedded/fs/file-read-cache.js +10 -5
  18. package/dist/common-auth-embedded/fs/private-files.d.ts +5 -0
  19. package/dist/common-auth-embedded/fs/private-files.js +7 -0
  20. package/dist/common-auth-embedded/fs/refresh-file-lock.js +142 -47
  21. package/dist/common-auth-embedded/fs/with-lock.js +2 -5
  22. package/dist/common-auth-embedded/routing/admission.d.ts +7 -2
  23. package/dist/common-auth-embedded/routing/admission.js +17 -7
  24. package/dist/common-auth-embedded/source-output.json +129 -97
  25. package/dist/common-auth-embedded/store/attribution.js +3 -2
  26. package/dist/common-auth-embedded/store/errors.d.ts +1 -1
  27. package/dist/common-auth-embedded/store/hooks.d.ts +5 -1
  28. package/dist/common-auth-embedded/store/hooks.js +20 -5
  29. package/dist/common-auth-embedded/store/index.d.ts +1 -0
  30. package/dist/common-auth-embedded/store/limits-namespace.d.ts +13 -0
  31. package/dist/common-auth-embedded/store/limits-namespace.js +46 -0
  32. package/dist/common-auth-embedded/store/pool.d.ts +10 -1
  33. package/dist/common-auth-embedded/store/pool.js +2 -0
  34. package/dist/common-auth-embedded/store/provider-state.js +5 -5
  35. package/dist/common-auth-embedded/store/refresh.js +1 -1
  36. package/dist/common-auth-embedded/store/schema.js +9 -4
  37. package/dist/common-auth-embedded/store/settings.d.ts +2 -0
  38. package/dist/common-auth-embedded/store/settings.js +11 -4
  39. package/dist/model-registry.d.ts +1 -1
  40. package/dist/model-registry.d.ts.map +1 -1
  41. package/dist/model-registry.js +7 -41
  42. package/dist/model-registry.js.map +1 -1
  43. package/dist/transform/model-resolver.d.ts.map +1 -1
  44. package/dist/transform/model-resolver.js +6 -4
  45. package/dist/transform/model-resolver.js.map +1 -1
  46. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"agy-request-metadata.d.ts","sourceRoot":"","sources":["../src/agy-request-metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agy-request-metadata.d.ts","sourceRoot":"","sources":["../src/agy-request-metadata.ts"],"names":[],"mappings":"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"}
@@ -108,6 +108,9 @@ export class AgyRequestSessionStore {
108
108
  }
109
109
  // Historical metadata remains readable; host admission refuses these retired routes.
110
110
  const HISTORICAL_AGY_MODEL_ENUMS = {
111
+ 'gemini-3.5-flash-extra-low': 'MODEL_PLACEHOLDER_M187',
112
+ 'gemini-3.5-flash-low': 'MODEL_PLACEHOLDER_M20',
113
+ 'gemini-3-flash-agent': 'MODEL_PLACEHOLDER_M84',
111
114
  'gemini-3.1-pro-low': 'MODEL_PLACEHOLDER_M36',
112
115
  'gemini-3.1-pro-high': 'MODEL_PLACEHOLDER_M37',
113
116
  'gemini-pro-agent': 'MODEL_PLACEHOLDER_M16',
@@ -1 +1 @@
1
- {"version":3,"file":"agy-request-metadata.js","sourceRoot":"","sources":["../src/agy-request-metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agy-request-metadata.js","sourceRoot":"","sources":["../src/agy-request-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,qBAAqB,GAAG,mBAAmB,CAAA;AACjD,MAAM,cAAc,GAAG,cAAc,CAAA;AACrC,MAAM,4BAA4B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AACxD,MAAM,0BAA0B,GAAG,GAAG,CAAA;AAEtC,MAAM,uBAAuB,GAAG;IAC9B,UAAU;IACV,mBAAmB;IACnB,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,kBAAkB;IAClB,WAAW;CACH,CAAA;AAiDV,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,IAAI,GAAG,qBAAqB,CAAA;IAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9C,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;QACpB,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,GAAG,cAAc,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,YAAoB,EACpB,MAA0D,EAAE;IAE5D,OAAO;QACL,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,UAAU,EAAE;QAClD,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,UAAU,EAAE;QAC9C,gBAAgB,EAAE,aAAa,CAAC,YAAY,CAAC;KAC9C,CAAA;AACH,CAAC;AAED,MAAM,OAAO,sBAAsB;IAChB,OAAO,GAAG,IAAI,GAAG,EAAmC,CAAA;IACpD,YAAY,CAAQ;IACpB,KAAK,CAAQ;IACb,UAAU,CAAQ;IAClB,GAAG,CAAc;IAElC,YACE,YAAoB,EACpB,UAAyC,EAAE;QAE3C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,4BAA4B,CAAA;QAC1D,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,0BAA0B,CAAA;QAClE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;IACpC,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,cAAc,GAAG,SAAS,CAAA;YACnC,OAAO,QAAQ,CAAC,OAAO,CAAA;QACzB,CAAC;QAED,MAAM,OAAO,GAAG,8BAA8B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACjE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACpB,OAAO;YACP,cAAc,EAAE,SAAS;YACzB,oBAAoB,EAAE,CAAC;SACxB,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,oBAAoB,GAAG,CAAC,CAChC,CAAA;QACD,MAAM,CAAC,oBAAoB,GAAG,SAAS,CAAA;QACvC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;IAC/B,CAAC;IAED,iBAAiB,CAAC,GAAW;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,CAAC,eAAe,GAAG,UAAU,EAAE,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IAC1B,CAAC;IAEO,KAAK,CAAC,SAAiB,EAAE,YAAoB;QACnD,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,CAAA;QACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,YAAY,IAAI,KAAK,CAAC,cAAc,GAAG,MAAM,EAAE,CAAC;gBAC1D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;QAED,OACE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU;YACpC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAC/B,CAAC;YACD,IAAI,SAAS,GAAkB,IAAI,CAAA;YACnC,IAAI,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAA;YAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxC,IAAI,GAAG,KAAK,YAAY,IAAI,KAAK,CAAC,cAAc,GAAG,YAAY,EAAE,CAAC;oBAChE,SAAS,GAAG,GAAG,CAAA;oBACf,YAAY,GAAG,KAAK,CAAC,cAAc,CAAA;gBACrC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAK;YACP,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;CACF;AAED,qFAAqF;AACrF,MAAM,0BAA0B,GAAqC;IACnE,4BAA4B,EAAE,wBAAwB;IACtD,sBAAsB,EAAE,uBAAuB;IAC/C,sBAAsB,EAAE,uBAAuB;IAC/C,oBAAoB,EAAE,uBAAuB;IAC7C,qBAAqB,EAAE,uBAAuB;IAC9C,kBAAkB,EAAE,uBAAuB;IAC3C,sBAAsB,EAAE,uBAAuB;IAC/C,yBAAyB,EAAE,uBAAuB;IAClD,uBAAuB,EAAE,uBAAuB;IAChD,sBAAsB,EAAE,wBAAwB;IAChD,yBAAyB,EAAE,wBAAwB;IACnD,uBAAuB,EAAE,wBAAwB;IACjD,mBAAmB,EAAE,uBAAuB;IAC5C,0BAA0B,EAAE,uBAAuB;CACpD,CAAA;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IACjC,OAAO,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,0BAA0B,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,OAAgC;IAEhC,MAAM,OAAO,GAA4B,EAAE,CAAA;IAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAE/C,KAAK,MAAM,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAC1C,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;YAC3B,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAA;IACrB,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAgC,EAChC,OAAqC,OAAO;IAE5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,CAAA;IACtC,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAE5D,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,IAAI,qBAAqB,GAAG,CAAC,CAAA;IAC7B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACnE,SAAQ;QACV,MAAM,KAAK,GAAI,OAAmC,CAAC,KAAK,CAAA;QACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAQ;QACnC,SAAS,IAAI,KAAK,CAAC,MAAM,CAAA;QACzB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,qBAAqB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC7C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBAC1D,OAAO,KAAK,CAAA;gBACd,OAAO,kBAAkB,IAAI,IAAI,CAAA;YACnC,CAAC,CAAC,CAAC,MAAM,CAAA;QACX,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,qBAAqB,CAAC,CAAA;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,OAAiC,EACjC,OAAgC,EAChC,KAAa,EACb,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EACtB,UAA0C,EAAE;IAE5C,MAAM,aAAa,GACjB,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC;QACpD,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;IAC1D,MAAM,WAAW,GAAG,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACtE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,QAAQ,CAAA;IAC5D,OAAO,CAAC,kBAAkB;QACxB,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,WAAW,CAAA;IACpD,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACxC,MAAM,MAAM,GAAqB;QAC/B,GAAG,CAAC,OAAO,CAAC,eAAe;YACzB,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,eAAe,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;QACP,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC;QACtC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;QAClD,wBAAwB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;QAC/D,qBAAqB,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;KACrE,CAAA;IAED,OAAO;QACL,SAAS,EAAE,SAAS,OAAO,CAAC,cAAc,IAAI,SAAS,IAAI,OAAO,CAAC,YAAY,IAAI,aAAa,GAAG,CAAC,EAAE;QACtG,SAAS,EAAE,OAAO,CAAC,gBAAgB;QACnC,MAAM;QACN,aAAa;KACd,CAAA;AACH,CAAC"}
@@ -6,6 +6,7 @@ import { type ClaustrumLogger } from './errors.js';
6
6
  import type { CustodyLease } from './hub.js';
7
7
  import { type InsulaQuotaOptions, type InsulaQuotaResult } from './insula.js';
8
8
  import { type AccountMapper, type ProjectionOptions, type QuotaReceipt, type ReorderVaultRosterResult, type VaultRosterFile } from './roster.js';
9
+ import type { ClaustrumUsageReading, ClaustrumUsageReportState } from './usage.js';
9
10
  import { type WatchMode } from './watch.js';
10
11
  export interface ClaustrumConsumerOptions<Q = QuotaObservation> {
11
12
  /**
@@ -229,6 +230,17 @@ export declare class ClaustrumConsumer<Q = QuotaObservation> {
229
230
  * poll, and a route whose credential or account changed is refused.
230
231
  */
231
232
  authorize(routeId: string, signal?: AbortSignal): Promise<ClaustrumScopedAttempt>;
233
+ /**
234
+ * Queue reply quota metadata without waiting or throwing. Pass rate-limit
235
+ * headers only, never tokens: the library does not filter header names.
236
+ * The credential must have been served by this host and still belong to the route.
237
+ */
238
+ reportUsage(input: {
239
+ routeId: string;
240
+ credentialId: string;
241
+ reading: ClaustrumUsageReading;
242
+ }): void;
243
+ usageReportState(): ClaustrumUsageReportState;
232
244
  reportFailure(attempt: ClaustrumScopedAttempt, status: number, source: ClaustrumReporterSource): Promise<void>;
233
245
  /**
234
246
  * Send on a vault route. `dispatch` builds and sends the request with the
@@ -738,6 +738,42 @@ export class ClaustrumConsumer {
738
738
  combined.dispose();
739
739
  }
740
740
  }
741
+ /**
742
+ * Queue reply quota metadata without waiting or throwing. Pass rate-limit
743
+ * headers only, never tokens: the library does not filter header names.
744
+ * The credential must have been served by this host and still belong to the route.
745
+ */
746
+ reportUsage(input) {
747
+ if (this.#shutdown.signal.aborted)
748
+ return;
749
+ try {
750
+ const row = this.#roster?.rows.find((row) => row.routeId === input.routeId);
751
+ if (!row?.enabled ||
752
+ row.state !== 'active' ||
753
+ (row.credentialId !== input.credentialId &&
754
+ !row.aliases?.includes(input.credentialId)))
755
+ return;
756
+ if (this.#hub) {
757
+ if (this.#lease && this.#hub.leaseLive(this.#lease))
758
+ this.#lease.custody.reportUsage(input);
759
+ }
760
+ else
761
+ this.#custody?.reportUsage(input);
762
+ }
763
+ catch {
764
+ // Quota bookkeeping must never reject a provider request.
765
+ }
766
+ }
767
+ usageReportState() {
768
+ try {
769
+ return ((this.#hub
770
+ ? this.#lease?.custody
771
+ : this.#custody)?.usageReportState() ?? { pending: 0, inFlight: false, dropped: 0 });
772
+ }
773
+ catch {
774
+ return { pending: 0, inFlight: false, dropped: 0 };
775
+ }
776
+ }
741
777
  async reportFailure(attempt, status, source) {
742
778
  this.#assertOpen();
743
779
  if (this.#hub) {
@@ -1,14 +1,15 @@
1
1
  import { type ClaustrumClient, type ClaustrumReporterSource, type EnrollmentTokenFile } from '@cortexkit/claustrum-client';
2
2
  import { type ClaustrumLogger } from './errors.js';
3
3
  import type { InsulaUsageTransport } from './insula.js';
4
+ import { type ClaustrumUsageReading, type ClaustrumUsageReportState, type ScopedUsageSource } from './usage.js';
4
5
  import { type ScopedWatchSource, type WatchMode } from './watch.js';
5
6
  /**
6
- * `watchScoped` is present from claustrum-client 0.12.0. Hosts detect it at
7
- * run time and keep polling without it.
7
+ * claustrum-client adds watchScoped in 0.12.0 and reportUsageScoped in 0.14.0.
8
+ * Older clients keep polling and simply do not send reply quota readings.
8
9
  */
9
10
  export type ClaustrumScopedClient = Pick<ClaustrumClient, 'listScoped' | 'getScoped' | 'reportAuthFailureScoped' | 'close'> & {
10
11
  insula?: InsulaUsageTransport;
11
- } & ScopedWatchSource;
12
+ } & ScopedWatchSource & ScopedUsageSource;
12
13
  /** The two credential types a plugin's family can hold; routing differs by type. */
13
14
  export type VaultCredentialType = 'oauth' | 'api_key';
14
15
  /**
@@ -332,7 +333,18 @@ export declare class ClaustrumScopedCustody {
332
333
  * other mode the host keeps its usual list timer.
333
334
  */
334
335
  watchRoster(options: ClaustrumRosterWatchOptions): ClaustrumRosterWatch;
336
+ /**
337
+ * Queue reply quota metadata and return synchronously. Pass rate-limit
338
+ * headers only, never tokens: the library does not filter header names.
339
+ * Only credentials served by this custody and retained in its roster report.
340
+ * Hosts managing their own roster must call retain() when that roster changes.
341
+ */
342
+ reportUsage(input: {
343
+ credentialId: string;
344
+ reading: ClaustrumUsageReading;
345
+ }): void;
346
+ usageReportState(): ClaustrumUsageReportState;
335
347
  close(): void;
336
- /** Stop immediately; allow token reads 2 s and share an owner's timeout warning. */
348
+ /** Stop accepting work; give token reads and reply reports one shared 2 s drain. */
337
349
  dispose(onTimeout?: (pendingOperations: number) => void): Promise<void>;
338
350
  }
@@ -6,6 +6,7 @@ import { readClaustrumEnrollmentToken } from './enrollment.js';
6
6
  import { ClaustrumConsumerError } from './errors.js';
7
7
  import { CUSTODY_PLACEHOLDER_PREFIX } from './host-slot.js';
8
8
  import { drainShutdown, shutdownWarning } from './shutdown.js';
9
+ import { ScopedUsageReporter, } from './usage.js';
9
10
  import { ScopedRosterWatch, } from './watch.js';
10
11
  /** Only a new version of the same account may replace an in-flight 401. */
11
12
  export function isScopedCredentialRotation(served, current) {
@@ -28,6 +29,14 @@ function scopedRetryReason(served, current) {
28
29
  return 'rotated';
29
30
  }
30
31
  const defaultLogger = createLogger('claustrum');
32
+ function checkedEnrollmentToken(value) {
33
+ if (!/^[0-9a-f]{64}$/.test(value.token) ||
34
+ !Number.isSafeInteger(value.token_generation) ||
35
+ value.token_generation < 1) {
36
+ throw new ClaustrumConsumerError('invalid-token', 'Invalid Claustrum enrollment token');
37
+ }
38
+ return value.token;
39
+ }
31
40
  // Opt-in diagnostics let tests retain wait phases without logging each vault read.
32
41
  const phaseDiagnostics = channel('common-auth.claustrum.phases');
33
42
  /**
@@ -183,6 +192,8 @@ export class ClaustrumScopedCustody {
183
192
  #reports = new WeakMap();
184
193
  #kept = new Map();
185
194
  #keptAttempts = new WeakMap();
195
+ #usage;
196
+ #usageServed = new Map();
186
197
  #setTimeout;
187
198
  #clearTimeout;
188
199
  #outage = false;
@@ -197,6 +208,7 @@ export class ClaustrumScopedCustody {
197
208
  #watches = new Set();
198
209
  #tokenReads = new Set();
199
210
  #warnShutdown;
211
+ #onDrainTimeout;
200
212
  #disposing;
201
213
  constructor(options) {
202
214
  const tokenPath = options.tokenPath;
@@ -218,6 +230,14 @@ export class ClaustrumScopedCustody {
218
230
  this.#warnShutdown = shutdownWarning(this.#logger);
219
231
  this.#setTimeout = options.setTimeoutImpl ?? setTimeout;
220
232
  this.#clearTimeout = options.clearTimeoutImpl ?? clearTimeout;
233
+ this.#usage = new ScopedUsageReporter({
234
+ client: this.#client,
235
+ owns: (id) => this.#usageServed.has(id),
236
+ token: async () => checkedEnrollmentToken(await this.#readToken()),
237
+ logger: this.#logger,
238
+ setTimeout: this.#setTimeout,
239
+ clearTimeout: this.#clearTimeout,
240
+ });
221
241
  }
222
242
  /** A watch losing its transport is the same outage as an unreachable read. */
223
243
  transportLost(error) {
@@ -303,12 +323,7 @@ export class ClaustrumScopedCustody {
303
323
  });
304
324
  }
305
325
  this.#check(signal);
306
- if (!/^[0-9a-f]{64}$/.test(value.token) ||
307
- !Number.isSafeInteger(value.token_generation) ||
308
- value.token_generation < 1) {
309
- throw new ClaustrumConsumerError('invalid-token', 'Invalid Claustrum enrollment token');
310
- }
311
- return value.token;
326
+ return checkedEnrollmentToken(value);
312
327
  }
313
328
  async #call(operation, signal) {
314
329
  this.#check(signal);
@@ -370,6 +385,7 @@ export class ClaustrumScopedCustody {
370
385
  }
371
386
  catch (error) {
372
387
  this.#kept.clear();
388
+ this.#clearUsageOwnership();
373
389
  throw error;
374
390
  }
375
391
  if (phaseDiagnostics.hasSubscribers)
@@ -473,11 +489,19 @@ export class ClaustrumScopedCustody {
473
489
  else {
474
490
  this.reachable();
475
491
  this.#kept.clear();
492
+ this.#clearUsageOwnership();
476
493
  }
477
494
  }
478
495
  /** Discard bearer material when a route is removed, declined or rebound. */
479
496
  forget(credentialId) {
480
497
  this.#kept.delete(credentialId);
498
+ this.#usageServed.delete(credentialId);
499
+ this.#usage.forget(credentialId);
500
+ }
501
+ #clearUsageOwnership() {
502
+ for (const id of this.#usageServed.keys())
503
+ this.#usage.forget(id);
504
+ this.#usageServed.clear();
481
505
  }
482
506
  /** Apply an already-held roster; this never fetches credentials or writes it. */
483
507
  retain(identities) {
@@ -490,6 +514,14 @@ export class ClaustrumScopedCustody {
490
514
  identity.accountIdentity !== kept.attempt.expectedAccountIdentity)
491
515
  this.forget(id);
492
516
  }
517
+ for (const [id, served] of this.#usageServed) {
518
+ const identity = current.get(id);
519
+ if (!identity?.enabled ||
520
+ identity.state !== 'active' ||
521
+ identity.credentialType !== served.credentialType ||
522
+ identity.accountIdentity !== served.accountIdentity)
523
+ this.forget(id);
524
+ }
493
525
  }
494
526
  /** A frozen, non-secret summary for a plugin's status display. */
495
527
  keptReceiptState() {
@@ -527,6 +559,7 @@ export class ClaustrumScopedCustody {
527
559
  }
528
560
  catch (error) {
529
561
  this.#kept.clear();
562
+ this.#clearUsageOwnership();
530
563
  throw error;
531
564
  }
532
565
  if (this.#outage && kept) {
@@ -536,6 +569,7 @@ export class ClaustrumScopedCustody {
536
569
  try {
537
570
  const attempt = await this.#authorizeFresh({ credentialId, credentialType, accountIdentity }, token, signal);
538
571
  this.#kept.set(credentialId, { attempt, routeId, since: null });
572
+ this.#usageServed.set(credentialId, { ...identity });
539
573
  return attempt;
540
574
  }
541
575
  catch (error) {
@@ -750,6 +784,25 @@ export class ClaustrumScopedCustody {
750
784
  },
751
785
  };
752
786
  }
787
+ /**
788
+ * Queue reply quota metadata and return synchronously. Pass rate-limit
789
+ * headers only, never tokens: the library does not filter header names.
790
+ * Only credentials served by this custody and retained in its roster report.
791
+ * Hosts managing their own roster must call retain() when that roster changes.
792
+ */
793
+ reportUsage(input) {
794
+ if (this.#closed)
795
+ return;
796
+ try {
797
+ this.#usage.report(input.credentialId, input.reading);
798
+ }
799
+ catch {
800
+ // Quota bookkeeping must never reject a provider request.
801
+ }
802
+ }
803
+ usageReportState() {
804
+ return this.#usage.state();
805
+ }
753
806
  close() {
754
807
  if (this.#closed)
755
808
  return;
@@ -761,12 +814,24 @@ export class ClaustrumScopedCustody {
761
814
  watch.stop();
762
815
  this.#watches.clear();
763
816
  this.#kept.clear();
764
- this.#client.close();
817
+ const usage = this.#usage.close();
818
+ if (usage) {
819
+ this.#tokenReads.add(usage);
820
+ void usage.then(() => this.#tokenReads.delete(usage));
821
+ }
822
+ else
823
+ this.#client.close();
824
+ this.#disposing = drainShutdown(this.#tokenReads, (count) => (this.#onDrainTimeout ?? this.#warnShutdown)(count)).finally(() => {
825
+ this.#usage.drop();
826
+ this.#usageServed.clear();
827
+ if (usage)
828
+ this.#client.close();
829
+ });
765
830
  }
766
- /** Stop immediately; allow token reads 2 s and share an owner's timeout warning. */
831
+ /** Stop accepting work; give token reads and reply reports one shared 2 s drain. */
767
832
  async dispose(onTimeout = this.#warnShutdown) {
833
+ this.#onDrainTimeout = onTimeout;
768
834
  this.close();
769
- this.#disposing ??= drainShutdown(this.#tokenReads, onTimeout);
770
835
  await this.#disposing;
771
836
  }
772
837
  }
@@ -107,11 +107,12 @@ export interface ClaustrumHubMemberOptions<_Q = QuotaObservation> {
107
107
  logger?: ClaustrumLogger;
108
108
  }
109
109
  /** What a lease may do with the shared custody. */
110
- export type ClaustrumLeasedCustody = Pick<ClaustrumScopedCustody, 'authorize' | 'reportFailure' | 'forget' | 'keptReceiptState'>;
110
+ export type ClaustrumLeasedCustody = Pick<ClaustrumScopedCustody, 'authorize' | 'reportFailure' | 'reportUsage' | 'usageReportState' | 'forget' | 'keptReceiptState'>;
111
111
  /**
112
112
  * One acquisition of the hub's shared custody. `custody` throws `closed`
113
113
  * after `release()`, and once the connection it belongs to ended for any
114
- * reason, vault mode going off included. `release()` is idempotent.
114
+ * reason, vault mode going off included. Best-effort `reportUsage` instead
115
+ * ignores reports through an ended lease. `release()` is idempotent.
115
116
  */
116
117
  export interface CustodyLease {
117
118
  readonly custody: ClaustrumLeasedCustody;
@@ -523,6 +523,14 @@ export class ClaustrumDiscoveryHub {
523
523
  check();
524
524
  return custody.reportFailure(attempt, status, source);
525
525
  },
526
+ reportUsage: (input) => {
527
+ if (!state.released && !generation.ended)
528
+ custody.reportUsage(input);
529
+ },
530
+ usageReportState: () => {
531
+ check();
532
+ return custody.usageReportState();
533
+ },
526
534
  forget: (credentialId) => {
527
535
  check();
528
536
  custody.forget(credentialId);
@@ -12,6 +12,7 @@ export { acquireInsulaQuotaSource, type InsulaQuotaContext, type InsulaQuotaLook
12
12
  export { acceptAccount, type DeclinedAccount, declineAccount, isDeclined, } from './interlock.js';
13
13
  export { drainVaultQuota } from './quota-writer.js';
14
14
  export { type AccountMapper, acceptVaultRoute, DEFAULT_ROUTE_PREFIX, declineVaultRoute, type MutateVaultRosterOptions, mutateVaultRoster, type ProjectionOptions, projectVaultRoster, type QuotaReceipt, type ReorderVaultRosterOptions, type ReorderVaultRosterResult, readVaultRoster, recordVaultAccountQuota, recordVaultQuota, refreshVaultRoster, reorderVaultRoster, resolveVaultPrimary, type VaultPrimary, type VaultPrimaryBinding, type VaultPrimaryUnavailableReason, type VaultRosterFile, type VaultRosterLockContext, type VaultRosterRow, type VaultRosterSeed, vaultRosterSeed, vaultRoutingRows, } from './roster.js';
15
+ export type { ClaustrumUsageReading, ClaustrumUsageReportState, } from './usage.js';
15
16
  export { type ChangeNotice, ChangeNoticeReader, RESUBSCRIBE_BACKOFF_MS, SAFETY_POLL_MS, ScopedRosterWatch, type ScopedRosterWatchOptions, type ScopedWatchEnd, type ScopedWatchHandle, type ScopedWatchNoticeShape, type ScopedWatchSource, WATCH_RETRY_MS, type WatchMode, } from './watch.js';
16
17
  /** How long `connectClaustrumScopedClient` waits by default. */
17
18
  export declare const SCOPED_CONNECT_TIMEOUT_MS = 10000;
@@ -48,6 +48,8 @@ export interface VaultRosterFile {
48
48
  complete: boolean;
49
49
  /** The unusable records of an incomplete reply: a safe id and a fixed reason. */
50
50
  rejected?: SkippedVaultRecord[];
51
+ /** Opaque limits data; roster-only writers preserve even newer schemas. */
52
+ limits?: unknown;
51
53
  rows: VaultRosterRow[];
52
54
  declined: DeclinedAccount[];
53
55
  }
@@ -118,6 +120,8 @@ export interface VaultRosterLockContext {
118
120
  }
119
121
  export interface MutateVaultRosterOptions {
120
122
  signal?: AbortSignal;
123
+ /** Runs under the roster lock once published, even if a later step fails. Must not throw. */
124
+ onPublished?: () => void;
121
125
  /**
122
126
  * Runs when the new roster is fully staged on disk, immediately before the
123
127
  * rename that publishes it, so a caller can confirm a lease of its own at
@@ -1,6 +1,7 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { stat } from 'node:fs/promises';
3
3
  import { resolve } from 'node:path';
4
+ import { FileReadCache } from '../fs/file-read-cache.js';
4
5
  import { acquireRefreshFileLock, LockContentionError, LockOwnershipError, lockPathFor, PrivateFileError, withLock, writeJsonAtomic, } from '../fs/index.js';
5
6
  import { readPrivateText, windowsPrivateFiles } from '../fs/private-files.js';
6
7
  import { decodeQuotaMap, isQuotaObservation, mergeQuotaObservation, } from '../quota/index.js';
@@ -209,6 +210,7 @@ export function projectVaultRoster(previous, inventory, options = {}) {
209
210
  return {
210
211
  version: 1,
211
212
  view: inventory.view,
213
+ ...(previous?.limits !== undefined && { limits: previous.limits }),
212
214
  complete,
213
215
  ...(!complete && {
214
216
  rejected: inventory.skipped.map((record) => ({
@@ -319,6 +321,7 @@ function decodeRoster(value) {
319
321
  // that was used whole, so it reads as complete.
320
322
  complete: value.complete !== false,
321
323
  ...(rejected && { rejected }),
324
+ ...(value.limits !== undefined && { limits: value.limits }),
322
325
  rows,
323
326
  declined,
324
327
  };
@@ -331,7 +334,18 @@ function decodeRoster(value) {
331
334
  export function decodedVaultRoster(roster) {
332
335
  return decodeRoster(JSON.parse(JSON.stringify(roster)));
333
336
  }
337
+ const rosterReadCache = new FileReadCache({
338
+ followSymlinks: true,
339
+ });
334
340
  export async function readVaultRoster(path) {
341
+ // Windows permission, owner and ancestry checks must still run on every read.
342
+ if (windowsPrivateFiles)
343
+ return readFreshVaultRoster(path);
344
+ const roster = await rosterReadCache.read([path], ([resolvedPath = path]) => readFreshVaultRoster(resolvedPath));
345
+ // Callers edit rows and nested limits data; none may own the cached objects.
346
+ return structuredClone(roster);
347
+ }
348
+ async function readFreshVaultRoster(path) {
335
349
  let text;
336
350
  try {
337
351
  text = await readPrivateText(path, windowsPrivateFiles);
@@ -364,7 +378,8 @@ const DISCOVERY_LEASE = { name: 'claustrum-roster', ttlMs: 30_000 };
364
378
  */
365
379
  export async function mutateVaultRoster(path, change, options = {}) {
366
380
  return withLock(path, { ...WRITE_LOCK, signal: options.signal }, async (lock) => {
367
- const current = await readVaultRoster(path);
381
+ // A read-modify-write always observes the file under its write lock.
382
+ const current = await readFreshVaultRoster(path);
368
383
  const { next, result } = await change(current, {
369
384
  assertOwned: () => lock.assertOwned(),
370
385
  });
@@ -372,13 +387,24 @@ export async function mutateVaultRoster(path, change, options = {}) {
372
387
  await lock.assertOwned();
373
388
  // Staging the file takes several awaited steps; check both the caller's
374
389
  // lease and this lock again at the last moment before the rename.
375
- await writeJsonAtomic(path, next, {
376
- beforeRename: async () => {
377
- await options.beforePublish?.();
378
- options.signal?.throwIfAborted();
379
- await lock.assertOwned();
380
- },
381
- });
390
+ try {
391
+ await writeJsonAtomic(path, next, {
392
+ beforeRename: async () => {
393
+ await options.beforePublish?.();
394
+ options.signal?.throwIfAborted();
395
+ await lock.assertOwned();
396
+ },
397
+ });
398
+ }
399
+ catch (error) {
400
+ if (error &&
401
+ typeof error === 'object' &&
402
+ 'published' in error &&
403
+ error.published === true)
404
+ options.onPublished?.();
405
+ throw error;
406
+ }
407
+ options.onPublished?.();
382
408
  }
383
409
  return result;
384
410
  });
@@ -0,0 +1,41 @@
1
+ import type { ClaustrumLogger } from './errors.js';
2
+ /** Reply quota metadata, never authorization headers or bearer material. */
3
+ export interface ClaustrumUsageReading {
4
+ provider: string;
5
+ observedAtMs: number;
6
+ headers?: Record<string, string>;
7
+ frame?: unknown;
8
+ account?: string;
9
+ }
10
+ /** Structural to also typecheck with the claustrum-client 0.6.2 peer minimum. */
11
+ export interface ScopedUsageSource {
12
+ reportUsageScoped?(input: {
13
+ credentialId: string;
14
+ reading: Record<string, unknown>;
15
+ enrollmentToken?: string;
16
+ }): Promise<void>;
17
+ }
18
+ export interface ClaustrumUsageReportState {
19
+ readonly pending: number;
20
+ readonly inFlight: boolean;
21
+ readonly dropped: number;
22
+ }
23
+ /** One queue per custody connection, shared by every hub member on it. */
24
+ export declare class ScopedUsageReporter {
25
+ #private;
26
+ private readonly options;
27
+ constructor(options: {
28
+ client: ScopedUsageSource;
29
+ owns: (credentialId: string) => boolean;
30
+ token: () => Promise<string>;
31
+ logger: ClaustrumLogger;
32
+ setTimeout: typeof setTimeout;
33
+ clearTimeout: typeof clearTimeout;
34
+ });
35
+ state(): ClaustrumUsageReportState;
36
+ report(credentialId: string, reading: ClaustrumUsageReading): void;
37
+ forget(credentialId: string): void;
38
+ /** Start the final flush; the custody's existing shutdown drain bounds it. */
39
+ close(): Promise<void> | undefined;
40
+ drop(): void;
41
+ }