agl 40.4.0 → 40.5.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.
Files changed (149) hide show
  1. package/changelog.md +27 -0
  2. package/dist_serve/bundle.js +2228 -2177
  3. package/dist_serve/bundle.js.map +2 -2
  4. package/dist_ts/00_commitinfo_data.js +1 -1
  5. package/dist_ts/aglapi/aglapisurface.document.js +2 -2
  6. package/dist_ts/classes.accountsactions.d.ts +11 -1
  7. package/dist_ts/classes.accountsactions.js +59 -2
  8. package/dist_ts/classes.controller.js +5 -5
  9. package/dist_ts/classes.flexaccountaccess.js +3 -2
  10. package/dist_ts/classes.harnessreleases.d.ts +14 -4
  11. package/dist_ts/classes.harnessreleases.js +28 -4
  12. package/dist_ts/classes.inferencegateway.d.ts +28 -3
  13. package/dist_ts/classes.inferencegateway.js +177 -61
  14. package/dist_ts/classes.inferenceplacement.d.ts +5 -3
  15. package/dist_ts/classes.inferenceplacement.js +2 -2
  16. package/dist_ts/classes.inferencerouter.d.ts +349 -91
  17. package/dist_ts/classes.inferencerouter.js +804 -297
  18. package/dist_ts/classes.inferenceservice.d.ts +14 -2
  19. package/dist_ts/classes.inferenceservice.js +53 -14
  20. package/dist_ts/classes.inferencespend.d.ts +339 -0
  21. package/dist_ts/classes.inferencespend.js +815 -0
  22. package/dist_ts/classes.inferenceusagecache.d.ts +8 -0
  23. package/dist_ts/classes.inferenceusagecache.js +9 -5
  24. package/dist_ts/classes.inferenceusagetap.d.ts +50 -9
  25. package/dist_ts/classes.inferenceusagetap.js +185 -31
  26. package/dist_ts/classes.proxycontrol.d.ts +3 -2
  27. package/dist_ts/classes.proxycontrol.js +1 -2
  28. package/dist_ts/classes.proxydaemon.js +3 -2
  29. package/dist_ts/classes.proxystore.d.ts +6 -0
  30. package/dist_ts/classes.proxystore.js +11 -2
  31. package/dist_ts/fleet/classes.claudeworkers.d.ts +5 -4
  32. package/dist_ts/fleet/classes.claudeworkers.js +10 -9
  33. package/dist_ts/functions.claudecoderelease.d.ts +12 -6
  34. package/dist_ts/functions.claudecoderelease.js +13 -7
  35. package/dist_ts/functions.inferencecli.js +12 -8
  36. package/dist_ts/interfaces.auth.d.ts +1 -1
  37. package/dist_ts/interfaces.auth.js +3 -1
  38. package/dist_ts/plugins.d.ts +3 -1
  39. package/dist_ts/plugins.js +7 -2
  40. package/dist_ts_authswitch/authority-apikeys.d.ts +32 -0
  41. package/dist_ts_authswitch/authority-apikeys.js +65 -0
  42. package/dist_ts_authswitch/authority-contract.d.ts +142 -28
  43. package/dist_ts_authswitch/authority-contract.js +48 -1
  44. package/dist_ts_authswitch/authority-overview.js +8 -1
  45. package/dist_ts_authswitch/authority-placement.d.ts +7 -2
  46. package/dist_ts_authswitch/authority-placement.js +10 -3
  47. package/dist_ts_authswitch/authority-runtime-contract.d.ts +2 -2
  48. package/dist_ts_authswitch/authority-spend.d.ts +103 -0
  49. package/dist_ts_authswitch/authority-spend.js +110 -0
  50. package/dist_ts_authswitch/authority-subscription.d.ts +12 -1
  51. package/dist_ts_authswitch/authority-subscription.js +24 -1
  52. package/dist_ts_authswitch/authority-usagelimit.d.ts +7 -4
  53. package/dist_ts_authswitch/authority-usagelimit.js +89 -39
  54. package/dist_ts_authswitch/authority-usagewindows.d.ts +4 -1
  55. package/dist_ts_authswitch/authority-usagewindows.js +41 -16
  56. package/dist_ts_authswitch/classes.authoritybroker.d.ts +30 -19
  57. package/dist_ts_authswitch/classes.authoritybroker.js +152 -61
  58. package/dist_ts_authswitch/classes.authoritycli.d.ts +9 -4
  59. package/dist_ts_authswitch/classes.authoritycli.js +94 -29
  60. package/dist_ts_authswitch/classes.authorityclient.d.ts +24 -7
  61. package/dist_ts_authswitch/classes.authorityclient.js +31 -11
  62. package/dist_ts_authswitch/classes.authoritydaemon.js +39 -12
  63. package/dist_ts_authswitch/classes.authoritydatabase.d.ts +28 -5
  64. package/dist_ts_authswitch/classes.authoritydatabase.js +171 -9
  65. package/dist_ts_authswitch/classes.authorityimport.js +2 -2
  66. package/dist_ts_authswitch/classes.authoritymodels.d.ts +71 -3
  67. package/dist_ts_authswitch/classes.authoritymodels.js +249 -20
  68. package/dist_ts_authswitch/classes.authorityregistry.js +4 -2
  69. package/dist_ts_authswitch/classes.authorityusage.d.ts +69 -7
  70. package/dist_ts_authswitch/classes.authorityusage.js +118 -4
  71. package/dist_ts_authswitch/classes.claudenative.d.ts +16 -7
  72. package/dist_ts_authswitch/classes.claudenative.js +29 -16
  73. package/dist_ts_authswitch/classes.claudesignin.js +5 -2
  74. package/dist_ts_authswitch/testsupport.d.ts +24 -5
  75. package/dist_ts_authswitch/testsupport.js +56 -12
  76. package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.d.ts +12 -0
  77. package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.js +21 -0
  78. package/dist_ts_authswitch/ts_migration/index.js +3 -1
  79. package/dist_ts_interfaces/functions.authorityscope.d.ts +18 -7
  80. package/dist_ts_interfaces/functions.authorityscope.js +35 -8
  81. package/dist_ts_interfaces/interfaces.d.ts +1 -1
  82. package/dist_ts_interfaces/interfaces.js +1 -1
  83. package/dist_ts_interfaces/plugins.d.ts +2 -1
  84. package/dist_ts_interfaces/plugins.js +7 -4
  85. package/dist_ts_interfaces/requests.accounts.d.ts +56 -0
  86. package/dist_ts_interfaces/requests.accounts.js +11 -1
  87. package/dist_ts_interfaces/requests.d.ts +2 -2
  88. package/dist_ts_interfaces/requests.js +1 -1
  89. package/docs/authswitch.md +75 -12
  90. package/package.json +5 -5
  91. package/readme.md +198 -21
  92. package/ts/00_commitinfo_data.ts +1 -1
  93. package/ts/aglapi/aglapisurface.document.ts +2 -2
  94. package/ts/classes.accountsactions.ts +75 -1
  95. package/ts/classes.controller.ts +4 -4
  96. package/ts/classes.flexaccountaccess.ts +2 -1
  97. package/ts/classes.harnessreleases.ts +25 -4
  98. package/ts/classes.inferencegateway.ts +184 -64
  99. package/ts/classes.inferenceplacement.ts +6 -4
  100. package/ts/classes.inferencerouter.ts +1026 -314
  101. package/ts/classes.inferenceservice.ts +56 -13
  102. package/ts/classes.inferencespend.ts +870 -0
  103. package/ts/classes.inferenceusagecache.ts +16 -4
  104. package/ts/classes.inferenceusagetap.ts +159 -34
  105. package/ts/classes.proxycontrol.ts +3 -3
  106. package/ts/classes.proxydaemon.ts +2 -1
  107. package/ts/classes.proxystore.ts +11 -1
  108. package/ts/fleet/classes.claudeworkers.ts +9 -8
  109. package/ts/functions.claudecoderelease.ts +13 -6
  110. package/ts/functions.inferencecli.ts +11 -7
  111. package/ts/interfaces.auth.ts +2 -0
  112. package/ts/plugins.ts +7 -0
  113. package/ts_authswitch/authority-apikeys.ts +85 -0
  114. package/ts_authswitch/authority-contract.ts +167 -29
  115. package/ts_authswitch/authority-overview.ts +7 -0
  116. package/ts_authswitch/authority-placement.ts +12 -4
  117. package/ts_authswitch/authority-runtime-contract.ts +2 -2
  118. package/ts_authswitch/authority-spend.ts +168 -0
  119. package/ts_authswitch/authority-subscription.ts +28 -1
  120. package/ts_authswitch/authority-usagelimit.ts +95 -40
  121. package/ts_authswitch/authority-usagewindows.ts +42 -17
  122. package/ts_authswitch/classes.authoritybroker.ts +161 -68
  123. package/ts_authswitch/classes.authoritycli.ts +108 -32
  124. package/ts_authswitch/classes.authorityclient.ts +41 -10
  125. package/ts_authswitch/classes.authoritydaemon.ts +43 -13
  126. package/ts_authswitch/classes.authoritydatabase.ts +178 -8
  127. package/ts_authswitch/classes.authorityimport.ts +1 -1
  128. package/ts_authswitch/classes.authoritymodels.ts +165 -19
  129. package/ts_authswitch/classes.authorityregistry.ts +3 -0
  130. package/ts_authswitch/classes.authorityusage.ts +171 -10
  131. package/ts_authswitch/classes.claudenative.ts +28 -15
  132. package/ts_authswitch/classes.claudesignin.ts +4 -1
  133. package/ts_authswitch/native-contracts.md +81 -20
  134. package/ts_authswitch/readme.md +1 -1
  135. package/ts_authswitch/testsupport.ts +58 -11
  136. package/ts_authswitch/ts_migration/0011_account_api_key_fields.ts +20 -0
  137. package/ts_authswitch/ts_migration/index.ts +2 -0
  138. package/ts_interfaces/functions.authorityscope.ts +43 -8
  139. package/ts_interfaces/interfaces.ts +1 -1
  140. package/ts_interfaces/plugins.ts +6 -3
  141. package/ts_interfaces/requests.accounts.ts +48 -0
  142. package/ts_interfaces/requests.ts +4 -0
  143. package/ts_web/00_commitinfo_data.ts +1 -1
  144. package/ts_web/accounts.plugins.ts +3 -1
  145. package/ts_web/accounts.templates.ts +20 -11
  146. package/ts_web/classes.accountsreadmodel.ts +322 -70
  147. package/ts_web/elements.accounts.ts +219 -20
  148. package/ts_web/elements.codexconnections.ts +3 -1
  149. package/ts_web/plugins.ts +4 -2
@@ -0,0 +1,815 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import * as plugins from './plugins.js';
36
+ const hex64 = /^[a-f0-9]{64}$/;
37
+ /** A service tier as a spend answer names it (`IAuthSwitchSpendAnswer.serviceTier`). */
38
+ const serviceTierPattern = /^[a-z][a-z0-9_-]{0,63}$/;
39
+ const isRecord = (valueArg) => typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
40
+ /** The record's entry for a name the record itself holds, never one inherited from `Object.prototype`. */
41
+ const own = (recordArg, keyArg) => recordArg !== undefined && Object.prototype.hasOwnProperty.call(recordArg, keyArg) ? recordArg[keyArg] : undefined;
42
+ /** An error in one line, as the proxy's journal states it: its class and its own words, which carry no credential. */
43
+ const oneLine = (errorArg) => (errorArg instanceof Error ? `${errorArg.name}: ${errorArg.message}` : String(errorArg)).replace(/\s+/gu, ' ');
44
+ /** An account as the journal names it: the first 12 hex characters of the SHA-256 digest of its id. */
45
+ const accountDigest = (accountIdArg) => plugins.crypto.createHash('sha256').update(accountIdArg).digest('hex').slice(0, 12);
46
+ // Pricing ---------------------------------------------------------------------------------------------------------
47
+ /**
48
+ * The tool types of the Messages API whose calls the caller runs itself, so a request carrying them costs tokens only:
49
+ * a tool the caller defines (no `type`, or `custom`) and Anthropic's client tools and client toolsets, as Anthropic's
50
+ * tool reference lists them (https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-reference, read
51
+ * 2026-10-22). Every other type is a tool Anthropic runs, a server tool, priced by its exact type
52
+ * (`getAnthropicServerToolPrice`) or not at all. Claude Code 2.1.306 declares its own tools, its tool search included,
53
+ * as `custom` ones; its WebSearch runs in a request of its own with `web_search_20250305`, and `advisor_20260301` comes
54
+ * only with an `advisorModel` setting.
55
+ */
56
+ const anthropicClientToolTypes = new Set(['custom', 'memory_20250818', 'bash_20250124',
57
+ 'text_editor_20250728', 'text_editor_20250124', 'computer_toolset_20260801', 'computer_20251124', 'computer_20250124',
58
+ 'browser_toolset_20260801']);
59
+ /**
60
+ * The `type` of every server tool a Messages request declares: each tool whose type is neither absent nor one of the
61
+ * client tools (`anthropicClientToolTypes`); a type that is no string is named as it reads.
62
+ */
63
+ export const inferenceAnthropicServerToolTypes = (bodyArg) => (Array.isArray(bodyArg.tools) ? bodyArg.tools : []).flatMap((toolArg) => {
64
+ const type = isRecord(toolArg) ? toolArg.type : undefined;
65
+ if (type === undefined || type === null || (typeof type === 'string' && anthropicClientToolTypes.has(type)))
66
+ return [];
67
+ return [typeof type === 'string' ? type : JSON.stringify(type)];
68
+ });
69
+ /**
70
+ * The price of a request's answers: the model's, with the call fees of the server tools the request declares
71
+ * (`getAnthropicRequestPrice`); `undefined` when the model or one of the tools has no price.
72
+ */
73
+ const anthropicRequestPrice = (modelArg, serverToolTypesArg) => {
74
+ const price = plugins.anthropicProvider.getAnthropicModelPrice(modelArg);
75
+ return price && plugins.anthropicProvider.getAnthropicRequestPrice(price, serverToolTypesArg);
76
+ };
77
+ /**
78
+ * What of an Anthropic Messages request the proxy's price table (flexharness `getAnthropicModelPrice`,
79
+ * `getAnthropicRequestPrice`, `getAnthropicServerToolPrice`) cannot price, in words, or `undefined` when all of it can
80
+ * be: the model; a service tier other than `auto` and `standard_only`, the two a request may name
81
+ * (https://platform.claude.com/docs/en/api/service-tiers, read 2026-10-22), as the proxy sends a key with a spend limit
82
+ * on the standard tier only; a speed the model has no price for (`speed: "fast"` is Fast mode); an `inference_geo` the
83
+ * model has no surcharge for; a server tool whose exact type has no price, Anthropic's MCP connector included. A key
84
+ * with a monthly spend limit takes no such request, since its answer could not be priced (Decision Q4). The answer is
85
+ * still priced by the model that answered and what its usage states, never by this.
86
+ */
87
+ export const inferenceAnthropicUnpricedRequest = (bodyArg) => {
88
+ const model = typeof bodyArg.model === 'string' ? bodyArg.model : '';
89
+ const price = plugins.anthropicProvider.getAnthropicModelPrice(model);
90
+ if (!price)
91
+ return `the model ${model}, which AGL's price table does not list`;
92
+ const tier = bodyArg.service_tier;
93
+ if (tier !== undefined && tier !== null && tier !== 'auto' && tier !== 'standard_only') {
94
+ return `the service tier ${JSON.stringify(tier)}, of which only "auto" and "standard_only" go to a key with a spend limit`;
95
+ }
96
+ const speed = bodyArg.speed;
97
+ const service = speed === undefined || speed === null || speed === 'standard' ? 'standard' : speed === 'fast' ? 'fast' : undefined;
98
+ if (service === undefined || own(price.services, service) === undefined) {
99
+ return `the speed ${JSON.stringify(speed)} of ${model}, which AGL's price table does not price`;
100
+ }
101
+ const geo = bodyArg.inference_geo;
102
+ if (geo !== undefined && geo !== null && geo !== 'global'
103
+ && (typeof geo !== 'string' || own(price.surcharges, `inference_geo:${geo}`) === undefined)) {
104
+ return `inference_geo ${JSON.stringify(geo)} on ${model}, which AGL's price table does not price`;
105
+ }
106
+ if (Array.isArray(bodyArg.mcp_servers) && bodyArg.mcp_servers.length > 0) {
107
+ return 'the MCP connector (mcp_servers), whose calls AGL\'s price table does not price';
108
+ }
109
+ const serverTools = inferenceAnthropicServerToolTypes(bodyArg);
110
+ let requestPrice;
111
+ try {
112
+ requestPrice = plugins.anthropicProvider.getAnthropicRequestPrice(price, serverTools);
113
+ }
114
+ catch {
115
+ return `the server tools ${serverTools.map((typeArg) => JSON.stringify(typeArg)).join(', ')}, whose fees AGL's price `
116
+ + 'table states twice';
117
+ }
118
+ if (requestPrice)
119
+ return undefined;
120
+ const unpricedTool = serverTools.find((typeArg) => plugins.anthropicProvider.getAnthropicServerToolPrice(typeArg) === undefined);
121
+ return `the server tool ${JSON.stringify(unpricedTool)}, whose calls AGL's price table does not price`;
122
+ };
123
+ /**
124
+ * The bytes a request goes to an Anthropic API key with a spend limit as: the body the price check read
125
+ * (`inferenceAnthropicUnpricedRequest`), encoded again with `service_tier: "standard_only"`, so it is served on the
126
+ * standard tier the price table prices and never on Priority Tier, which has no published price (lane A ruling 6), and
127
+ * Anthropic receives exactly what was checked -- also when the client named `standard_only` itself.
128
+ */
129
+ export const inferenceAnthropicCheckedBytes = (bodyArg) => new TextEncoder().encode(JSON.stringify({ ...bodyArg, service_tier: 'standard_only' }));
130
+ /**
131
+ * The spend of an answer an Anthropic API key served, priced once by the model that answered and the usage it stated
132
+ * (`readAnthropicMessagesUsage`, `priceModelCall`), never by the requested model, with the call fees of the server tools
133
+ * the request declared (`serverToolTypesArg`, `getAnthropicRequestPrice`). An answer whose model has no price, whose usage
134
+ * cannot be read completely or priced -- a tier, a cache lifetime, a server tool or a region the price lacks -- counts
135
+ * as one that could not be priced (`microUsd: null`), which holds a key with a spend limit until its month ends. A stream
136
+ * cut before it stated any usage records nothing: the client received no token of it; one cut later is priced on the
137
+ * usage it stated by then. `requestedModelArg` names the answer when it named no model.
138
+ */
139
+ export const inferenceAnthropicSpend = (answeredArg, requestedModelArg, nowArg, serverToolTypesArg = []) => {
140
+ if (!answeredArg.usage && !answeredArg.complete)
141
+ return undefined;
142
+ const model = [answeredArg.model, requestedModelArg].find((modelArg) => plugins.authswitchUsageTokens.isAuthSwitchModelId(modelArg));
143
+ if (model === undefined)
144
+ throw new Error('A relayed answer names no model a spend report takes.');
145
+ const reportedTier = answeredArg.usage?.service_tier;
146
+ const answer = { answerId: plugins.crypto.randomUUID(), endedAt: new Date(nowArg).toISOString(), model,
147
+ serviceTier: typeof reportedTier === 'string' && serviceTierPattern.test(reportedTier) ? reportedTier : null };
148
+ const unpriced = (reasonArg) => ({ answer: { ...answer, microUsd: null, priceSource: null }, unpriced: reasonArg });
149
+ if (!answeredArg.usage)
150
+ return unpriced('the answer stated no usage');
151
+ let usage;
152
+ try {
153
+ usage = plugins.anthropicProvider.readAnthropicMessagesUsage(answeredArg.usage);
154
+ }
155
+ catch (errorArg) {
156
+ if (errorArg instanceof plugins.flexModels.ModelUsageReadError)
157
+ return unpriced(errorArg.message);
158
+ throw errorArg;
159
+ }
160
+ if (!plugins.anthropicProvider.getAnthropicModelPrice(model))
161
+ return unpriced(`AGL's price table does not list the model ${model}`);
162
+ let price;
163
+ try {
164
+ price = anthropicRequestPrice(model, serverToolTypesArg);
165
+ }
166
+ catch (errorArg) {
167
+ return unpriced(`AGL's price table disagrees with itself: ${oneLine(errorArg)}`);
168
+ }
169
+ if (!price)
170
+ return unpriced(`AGL's price table has no price for a server tool the request declared (${serverToolTypesArg.join(', ')})`);
171
+ const cost = plugins.flexModels.priceModelCall(price, usage);
172
+ if (!cost.priced)
173
+ return unpriced(`AGL's price table could not price it (${cost.reason}, service ${usage.service})`);
174
+ if (cost.microUsd > plugins.authswitchAuthority.authSwitchSpendAnswerMaxMicroUsd) {
175
+ return unpriced(`its price of ${cost.microUsd} micro-dollars is beyond what one answer can cost`);
176
+ }
177
+ return { answer: { ...answer, microUsd: cost.microUsd, priceSource: price.source.checkedAt } };
178
+ };
179
+ /**
180
+ * The tool types of the Responses API whose calls the caller runs itself, so a request declaring them costs tokens only,
181
+ * as OpenAI's Responses reference lists its tools (https://developers.openai.com/api/reference/resources/responses/methods/create
182
+ * and https://developers.openai.com/api/docs/guides/tools, read 2026-10-22): a function (`function`), a custom tool
183
+ * (`custom`), the local shell (`local_shell`), apply patch (`apply_patch`) and computer use (`computer`,
184
+ * `computer_use_preview`), whose calls the caller executes and answers. Two types are client tools in one mode only:
185
+ * `shell` with `environment.type: "local"` -- in a container OpenAI runs it
186
+ * (https://developers.openai.com/api/docs/guides/tools-shell) -- and `tool_search` with `execution: "client"`, whose
187
+ * search the caller runs and answers with a `tool_search_output` item; hosted, OpenAI runs it
188
+ * (https://developers.openai.com/api/docs/guides/tools-tool-search, read 2026-10-23). A `namespace` groups function and
189
+ * custom tools, each judged on its own. Every other type is a tool OpenAI runs, a server tool, priced only by the fee of
190
+ * its exact type (`IModelPrice.toolCallFees`: `web_search`, `file_search`), so `web_search_preview` and a dated
191
+ * `web_search_2025_08_26` have no price. Codex 0.163 sends `function`, `custom`, `tool_search` (`execution: "client"`)
192
+ * and `web_search` (`test/e2e/e2e.proxyspendcodex.node.ts`).
193
+ */
194
+ const openAiClientToolTypes = new Set(['function', 'custom', 'local_shell', 'apply_patch', 'computer',
195
+ 'computer_use_preview']);
196
+ /**
197
+ * The `type` of every server tool a Responses request declares, in `tools` and in the tools its input adds
198
+ * (`additional_tools` and `tool_search_output` items), a namespace's own tools included: each tool that is no client
199
+ * tool (`openAiClientToolTypes`, a local `shell`); a type that is no string is named as it reads.
200
+ */
201
+ export const inferenceOpenAiServerToolTypes = (bodyArg) => {
202
+ const declared = (toolsArg) => (Array.isArray(toolsArg) ? toolsArg : []).flatMap((toolArg) => {
203
+ const tool = isRecord(toolArg) ? toolArg : {};
204
+ const type = tool.type;
205
+ if (type === 'namespace')
206
+ return declared(tool.tools);
207
+ if ((typeof type === 'string' && openAiClientToolTypes.has(type))
208
+ || (type === 'shell' && isRecord(tool.environment) && tool.environment.type === 'local')
209
+ || (type === 'tool_search' && tool.execution === 'client'))
210
+ return [];
211
+ return [typeof type === 'string' ? type : String(JSON.stringify(type))];
212
+ });
213
+ const added = (Array.isArray(bodyArg.input) ? bodyArg.input : []).flatMap((itemArg) => isRecord(itemArg)
214
+ && (itemArg.type === 'additional_tools' || itemArg.type === 'tool_search_output') ? declared(itemArg.tools) : []);
215
+ return [...declared(bodyArg.tools), ...added];
216
+ };
217
+ /**
218
+ * The service tier a Responses request goes to an OpenAI API key with a spend limit on: the one the client named when it
219
+ * named a tier the price table prices for the model, else Standard (`default`), never `auto`, which a project set to Fast
220
+ * serves at Fast prices (`readme` of flexharness-providers' OpenAI provider).
221
+ */
222
+ const openAiCheckedTier = (bodyArg) => typeof bodyArg.service_tier === 'string' && bodyArg.service_tier !== 'auto' ? bodyArg.service_tier : 'default';
223
+ /**
224
+ * What of a Responses request the proxy's price table (flexharness `getOpenAiModelPrice`) cannot price, in words, or
225
+ * `undefined` when all of it can be: the model, by its exact id or a listed snapshot (a dated id the price lists not is
226
+ * unpriced); an explicit service tier the model has no price for (`auto` and none go out as `default`; `fast` names
227
+ * Fast mode; `scale` has no published price); a background response (`background: true`), whose answer never passes the
228
+ * proxy; a server tool whose exact type has no call fee (`inferenceOpenAiServerToolTypes`). An OpenAI API key with a
229
+ * monthly spend limit takes no such request (Decision Q4).
230
+ */
231
+ export const inferenceOpenAiUnpricedRequest = (bodyArg) => {
232
+ const model = typeof bodyArg.model === 'string' ? bodyArg.model : '';
233
+ const price = plugins.openAiProvider.getOpenAiModelPrice(model);
234
+ if (!price)
235
+ return `the model ${model}, which AGL's price table does not list`;
236
+ const tier = bodyArg.service_tier;
237
+ if (tier !== undefined && tier !== null && tier !== 'auto'
238
+ && (typeof tier !== 'string' || own(price.services, tier) === undefined)) {
239
+ return `the service tier ${JSON.stringify(tier)} of ${model}, which AGL's price table does not price`;
240
+ }
241
+ if (bodyArg.background === true) {
242
+ return 'a background response (background: true), whose answer does not pass the proxy to be priced';
243
+ }
244
+ const unpricedTool = inferenceOpenAiServerToolTypes(bodyArg).find((typeArg) => own(price.toolCallFees, typeArg) === undefined);
245
+ return unpricedTool === undefined ? undefined
246
+ : `the server tool ${JSON.stringify(unpricedTool)}, whose calls AGL's price table does not price`;
247
+ };
248
+ /**
249
+ * The bytes a Responses request goes to an OpenAI API key with a spend limit as: the body the price check read
250
+ * (`inferenceOpenAiUnpricedRequest`), the model rewritten to `wireModelArg`, encoded again with the service tier it was
251
+ * checked for (`default` when the client named `auto` or none), so OpenAI serves it on a tier the price table prices.
252
+ */
253
+ export const inferenceOpenAiCheckedBytes = (bodyArg, wireModelArg) => new TextEncoder().encode(JSON.stringify({ ...bodyArg, model: wireModelArg, service_tier: openAiCheckedTier(bodyArg) }));
254
+ /**
255
+ * The spend of a Responses answer an OpenAI API key served, priced once by the model that answered, the tier that served
256
+ * it and the usage it stated (`readOpenAiResponsesUsage`, `priceModelCall`), with every `web_search_call` item one web
257
+ * search and every `file_search_call` item one file search, counted once per item id whatever its action -- so AGL's
258
+ * figure can exceed OpenAI's bill. A completed, incomplete or failed answer that states its usage is priced; one whose
259
+ * model, tier or usage the price table cannot price counts as one that could not be priced (`microUsd: null`), which
260
+ * holds a key with a spend limit until its month ends, and so does one that arrived too large to read, or a completed
261
+ * or incomplete one that states no usage. A failed answer that states none, and one cut before its terminal event,
262
+ * record nothing (`undefined`): no usage is estimated, and the caller says so in the journal.
263
+ */
264
+ export const inferenceOpenAiSpend = (answeredArg, requestedModelArg, nowArg) => {
265
+ if (answeredArg.outcome === 'cut' || (answeredArg.outcome === 'answered' && !answeredArg.usage && answeredArg.status === 'failed')) {
266
+ return undefined;
267
+ }
268
+ const model = [answeredArg.model, requestedModelArg].find((modelArg) => plugins.authswitchUsageTokens.isAuthSwitchModelId(modelArg));
269
+ if (model === undefined)
270
+ throw new Error('A relayed answer names no model a spend report takes.');
271
+ const tier = answeredArg.serviceTier;
272
+ const answer = { answerId: plugins.crypto.randomUUID(), endedAt: new Date(nowArg).toISOString(), model,
273
+ serviceTier: typeof tier === 'string' && serviceTierPattern.test(tier) ? tier : null };
274
+ const unpriced = (reasonArg) => ({ answer: { ...answer, microUsd: null, priceSource: null }, unpriced: reasonArg });
275
+ if (answeredArg.outcome === 'unreadable')
276
+ return unpriced('its final event was too large to read');
277
+ if (!answeredArg.usage)
278
+ return unpriced('the answer stated no usage');
279
+ if (answeredArg.unidentifiedCalls)
280
+ return unpriced('it holds a web or file search call without an id, which cannot be counted once');
281
+ let usage;
282
+ try {
283
+ usage = plugins.openAiProvider.readOpenAiResponsesUsage(answeredArg.usage, tier);
284
+ }
285
+ catch (errorArg) {
286
+ if (errorArg instanceof plugins.flexModels.ModelUsageReadError)
287
+ return unpriced(errorArg.message);
288
+ throw errorArg;
289
+ }
290
+ const price = plugins.openAiProvider.getOpenAiModelPrice(model);
291
+ if (!price)
292
+ return unpriced(`AGL's price table does not list the model ${model}`);
293
+ const toolCalls = {
294
+ ...(answeredArg.webSearchCalls.size ? { web_search: answeredArg.webSearchCalls.size } : {}),
295
+ ...(answeredArg.fileSearchCalls.size ? { file_search: answeredArg.fileSearchCalls.size } : {}),
296
+ };
297
+ const cost = plugins.flexModels.priceModelCall(price, { ...usage, toolCalls });
298
+ if (!cost.priced)
299
+ return unpriced(`AGL's price table could not price it (${cost.reason}, service ${usage.service})`);
300
+ if (cost.microUsd > plugins.authswitchAuthority.authSwitchSpendAnswerMaxMicroUsd) {
301
+ return unpriced(`its price of ${cost.microUsd} micro-dollars is beyond what one answer can cost`);
302
+ }
303
+ return { answer: { ...answer, microUsd: cost.microUsd, priceSource: price.source.checkedAt } };
304
+ };
305
+ const answerOf = (documentArg) => ({ answerId: documentArg.id,
306
+ endedAt: documentArg.endedAt, model: documentArg.model, serviceTier: documentArg.serviceTier,
307
+ microUsd: documentArg.microUsd, priceSource: documentArg.priceSource });
308
+ const assertDocument = (valueArg) => {
309
+ const value = valueArg;
310
+ if (!isRecord(value) || Object.keys(value).length !== 8 || typeof value.accountId !== 'string' || !hex64.test(value.accountId)
311
+ || (value.loginId !== null && (typeof value.loginId !== 'string' || !hex64.test(value.loginId)))
312
+ || !plugins.authswitchAuthority.isAuthSwitchSpendAnswer(answerOf(value))) {
313
+ throw new Error('Invalid inference spend answer.');
314
+ }
315
+ };
316
+ let InferenceSpendModel = (() => {
317
+ let _classDecorators = [plugins.nosqldb.managed({ collectionName: 'agl_inference_spend' }), plugins.nosqldb.exactPersistence({ assertDocument })];
318
+ let _classDescriptor;
319
+ let _classExtraInitializers = [];
320
+ let _classThis;
321
+ let _classSuper = plugins.nosqldb.SmartDataDbDoc;
322
+ let _id_decorators;
323
+ let _id_initializers = [];
324
+ let _id_extraInitializers = [];
325
+ let _accountId_decorators;
326
+ let _accountId_initializers = [];
327
+ let _accountId_extraInitializers = [];
328
+ let _loginId_decorators;
329
+ let _loginId_initializers = [];
330
+ let _loginId_extraInitializers = [];
331
+ let _endedAt_decorators;
332
+ let _endedAt_initializers = [];
333
+ let _endedAt_extraInitializers = [];
334
+ let _model_decorators;
335
+ let _model_initializers = [];
336
+ let _model_extraInitializers = [];
337
+ let _serviceTier_decorators;
338
+ let _serviceTier_initializers = [];
339
+ let _serviceTier_extraInitializers = [];
340
+ let _microUsd_decorators;
341
+ let _microUsd_initializers = [];
342
+ let _microUsd_extraInitializers = [];
343
+ let _priceSource_decorators;
344
+ let _priceSource_initializers = [];
345
+ let _priceSource_extraInitializers = [];
346
+ var InferenceSpendModel = class extends _classSuper {
347
+ static { _classThis = this; }
348
+ static {
349
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
350
+ _id_decorators = [plugins.nosqldb.unI()];
351
+ _accountId_decorators = [plugins.nosqldb.svDb()];
352
+ _loginId_decorators = [plugins.nosqldb.svDb()];
353
+ _endedAt_decorators = [plugins.nosqldb.svDb()];
354
+ _model_decorators = [plugins.nosqldb.svDb()];
355
+ _serviceTier_decorators = [plugins.nosqldb.svDb()];
356
+ _microUsd_decorators = [plugins.nosqldb.svDb()];
357
+ _priceSource_decorators = [plugins.nosqldb.svDb()];
358
+ __esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
359
+ __esDecorate(null, null, _accountId_decorators, { kind: "field", name: "accountId", static: false, private: false, access: { has: obj => "accountId" in obj, get: obj => obj.accountId, set: (obj, value) => { obj.accountId = value; } }, metadata: _metadata }, _accountId_initializers, _accountId_extraInitializers);
360
+ __esDecorate(null, null, _loginId_decorators, { kind: "field", name: "loginId", static: false, private: false, access: { has: obj => "loginId" in obj, get: obj => obj.loginId, set: (obj, value) => { obj.loginId = value; } }, metadata: _metadata }, _loginId_initializers, _loginId_extraInitializers);
361
+ __esDecorate(null, null, _endedAt_decorators, { kind: "field", name: "endedAt", static: false, private: false, access: { has: obj => "endedAt" in obj, get: obj => obj.endedAt, set: (obj, value) => { obj.endedAt = value; } }, metadata: _metadata }, _endedAt_initializers, _endedAt_extraInitializers);
362
+ __esDecorate(null, null, _model_decorators, { kind: "field", name: "model", static: false, private: false, access: { has: obj => "model" in obj, get: obj => obj.model, set: (obj, value) => { obj.model = value; } }, metadata: _metadata }, _model_initializers, _model_extraInitializers);
363
+ __esDecorate(null, null, _serviceTier_decorators, { kind: "field", name: "serviceTier", static: false, private: false, access: { has: obj => "serviceTier" in obj, get: obj => obj.serviceTier, set: (obj, value) => { obj.serviceTier = value; } }, metadata: _metadata }, _serviceTier_initializers, _serviceTier_extraInitializers);
364
+ __esDecorate(null, null, _microUsd_decorators, { kind: "field", name: "microUsd", static: false, private: false, access: { has: obj => "microUsd" in obj, get: obj => obj.microUsd, set: (obj, value) => { obj.microUsd = value; } }, metadata: _metadata }, _microUsd_initializers, _microUsd_extraInitializers);
365
+ __esDecorate(null, null, _priceSource_decorators, { kind: "field", name: "priceSource", static: false, private: false, access: { has: obj => "priceSource" in obj, get: obj => obj.priceSource, set: (obj, value) => { obj.priceSource = value; } }, metadata: _metadata }, _priceSource_initializers, _priceSource_extraInitializers);
366
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
367
+ InferenceSpendModel = _classThis = _classDescriptor.value;
368
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
369
+ __runInitializers(_classThis, _classExtraInitializers);
370
+ }
371
+ id = __runInitializers(this, _id_initializers, void 0);
372
+ accountId = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _accountId_initializers, void 0));
373
+ loginId = (__runInitializers(this, _accountId_extraInitializers), __runInitializers(this, _loginId_initializers, void 0));
374
+ endedAt = (__runInitializers(this, _loginId_extraInitializers), __runInitializers(this, _endedAt_initializers, void 0));
375
+ model = (__runInitializers(this, _endedAt_extraInitializers), __runInitializers(this, _model_initializers, void 0));
376
+ serviceTier = (__runInitializers(this, _model_extraInitializers), __runInitializers(this, _serviceTier_initializers, void 0));
377
+ microUsd = (__runInitializers(this, _serviceTier_extraInitializers), __runInitializers(this, _microUsd_initializers, void 0));
378
+ priceSource = (__runInitializers(this, _microUsd_extraInitializers), __runInitializers(this, _priceSource_initializers, void 0));
379
+ constructor() {
380
+ super(...arguments);
381
+ __runInitializers(this, _priceSource_extraInitializers);
382
+ }
383
+ };
384
+ return InferenceSpendModel = _classThis;
385
+ })();
386
+ export { InferenceSpendModel };
387
+ /** How long one store write may take before it counts as failed. */
388
+ const storeWriteTimeoutMs = 30_000;
389
+ /** How many kept answers one read of the store loads at a time. */
390
+ const loadPage = 256;
391
+ /** The outbox's store in the proxy's database (`agl_inference_spend`, a model of `proxyModels`). */
392
+ export class InferenceSpendStore {
393
+ async load(signalArg) {
394
+ const entries = [];
395
+ let after;
396
+ for (;;) {
397
+ const stored = await InferenceSpendModel.exact.findStored({ ...(after === undefined ? {} : { filter: { id: { $gt: after } } }),
398
+ sort: { id: 1 }, limit: loadPage, signal: signalArg });
399
+ for (const entry of stored) {
400
+ const document = InferenceSpendModel.exact.toPersisted(entry);
401
+ entries.push({ accountId: document.accountId, loginId: document.loginId, answer: answerOf(document) });
402
+ }
403
+ if (stored.length < loadPage)
404
+ return entries;
405
+ after = entries.at(-1).answer.answerId;
406
+ }
407
+ }
408
+ async insert(entryArg, signalArg) {
409
+ const { answer } = entryArg;
410
+ const document = { id: answer.answerId, accountId: entryArg.accountId, loginId: entryArg.loginId,
411
+ endedAt: answer.endedAt,
412
+ model: answer.model, serviceTier: answer.serviceTier, microUsd: answer.microUsd, priceSource: answer.priceSource };
413
+ const inserted = await InferenceSpendModel.exact.insert(document, { signal: signalArg });
414
+ if (inserted.status !== 'conflict')
415
+ return;
416
+ const held = InferenceSpendModel.exact.toPersisted(inserted.document);
417
+ if (JSON.stringify(held) !== JSON.stringify(document))
418
+ throw new Error('The proxy keeps another answer under this answer id.');
419
+ }
420
+ async delete(answerIdsArg, signalArg) {
421
+ for (const id of answerIdsArg) {
422
+ const current = await InferenceSpendModel.exact.findStoredOne({ id }, { signal: signalArg });
423
+ if (!current)
424
+ continue;
425
+ const deleted = await InferenceSpendModel.exact.delete({ current }, { signal: signalArg });
426
+ if (deleted.status !== 'deleted' && await InferenceSpendModel.exact.findStoredOne({ id }, { signal: signalArg })) {
427
+ throw new Error('A spend answer could not be removed from the proxy\'s store.');
428
+ }
429
+ }
430
+ }
431
+ }
432
+ /** A count of answers in words: `1 answer`, `2 answers`. */
433
+ const answersText = (countArg) => `${countArg} ${countArg === 1 ? 'answer' : 'answers'}`;
434
+ const writeJournal = (entryArg) => {
435
+ process.stderr.write(entryArg.kind === 'unpriced'
436
+ ? `AGL proxy could not price an answer on API key ${entryArg.account} (${entryArg.model}): ${entryArg.reason}. It counts `
437
+ + 'as an answer that could not be priced, which holds a key with a monthly spend limit until its month ends or the '
438
+ + 'limit is removed.\n'
439
+ : entryArg.kind === 'refused'
440
+ ? `AGL proxy's spend report of API key ${entryArg.account} (${answersText(entryArg.answers)}) was refused by the accounts `
441
+ + `service: ${entryArg.error} The proxy keeps the answers and counts them, sends them again at ${entryArg.retryAt} `
442
+ + 'and at every start, and places nothing on the key while it has a monthly spend limit.\n'
443
+ : entryArg.kind === 'unreported'
444
+ ? `AGL proxy could not report the spend of API key ${entryArg.account} (${answersText(entryArg.answers)}) to the `
445
+ + `accounts service: ${entryArg.error} -- it keeps the answers, counts them against the key's limit and tries again.\n`
446
+ : entryArg.kind === 'unkept'
447
+ ? `AGL proxy could not keep the spend of ${answersText(entryArg.answers)} in its store: ${entryArg.error} -- it counts `
448
+ + 'them and tries again.\n'
449
+ : entryArg.kind === 'unremoved'
450
+ ? `AGL proxy could not remove ${answersText(entryArg.answers)}, acknowledged, from its store: ${entryArg.error} -- it `
451
+ + 'tries again; a start before then reports them again, which the accounts service records once.\n'
452
+ : entryArg.kind === 'unattributed'
453
+ ? `AGL proxy holds an answer on API key ${entryArg.account} (${entryArg.model}) with no login of the key to report `
454
+ + 'it on: it counts, and holds the key while it has a monthly spend limit, until the account service names a login.\n'
455
+ : `AGL proxy did not count an answer on API key ${entryArg.account} (${entryArg.model}): it ended without the provider `
456
+ + 'stating its usage, so nothing of it counts against the key\'s monthly spend limit, though the provider may bill it.\n');
457
+ };
458
+ /**
459
+ * The spend of the answers the proxy relayed on API keys, kept until the accounts service acknowledged it: durable in
460
+ * the proxy's database (`agl_inference_spend`), never expired, and counted against each key's limit while unacknowledged
461
+ * (`judged`), across restarts.
462
+ *
463
+ * `record` counts an answer at once and writes it to the store at once, on a chain of store writes that never waits for
464
+ * a report, so an answer recorded while a report is in flight is durable before that report settles. Answers are
465
+ * reported whether the store kept them yet or not -- the ledger records an answer once, so either makes it durable --
466
+ * per key and login in batches of at most 64 unique answers, one report in flight at a time, the first as soon as an
467
+ * answer is recorded and every one at start. An answer held in neither after a failed store write holds its key, with
468
+ * a spend limit, like a refused report (`held`). The in-memory index is complete because the proxy store has one owner
469
+ * (`ProxyStore` refuses a second engine); a second writer of `agl_inference_spend` would break it.
470
+ * An acknowledgement drops the report's answers and holds the usage the service answered in one step (`acknowledged`).
471
+ * A refusal of the report -- `invalid_input`, or a malformed request (`isAuthSwitchMalformedRequest`) -- holds its
472
+ * answers: they keep counting, the key with a spend limit takes no request while any is held (`held`), the refusal goes
473
+ * to the journal, and the answers are sent again after `heldRetryMs` and at every start, never dropped. Every other
474
+ * failure, `Internal server error` included, is passing: the key's reports wait, doubling from `retryMs` to
475
+ * `maxRetryMs`. Answers of months before the previous one are acknowledged by the service and counted nowhere, so they
476
+ * leave as every acknowledged answer does.
477
+ */
478
+ export class InferenceSpendOutbox {
479
+ options;
480
+ /** The answers not acknowledged yet, by key, then answer id: an id is held once, so no report names one twice. */
481
+ entries = new Map();
482
+ accounts = new Map();
483
+ /** Acknowledged answers still to be removed from the store. */
484
+ acknowledgedIds = new Set();
485
+ abort = new AbortController();
486
+ now;
487
+ retryMs;
488
+ maxRetryMs;
489
+ heldRetryMs;
490
+ /** The store writes of recorded answers, one at a time, apart from the reports. */
491
+ keepTail = Promise.resolve();
492
+ keepFailures = 0;
493
+ keepRetryAt = 0;
494
+ keepSaid = false;
495
+ keepTimer;
496
+ forgetFailures = 0;
497
+ forgetRetryAt = 0;
498
+ forgetSaid = false;
499
+ started = false;
500
+ stopped = false;
501
+ running;
502
+ again = false;
503
+ timer;
504
+ constructor(options) {
505
+ this.options = options;
506
+ this.now = options.now ?? Date.now;
507
+ this.retryMs = options.retryMs ?? 5_000;
508
+ this.maxRetryMs = options.maxRetryMs ?? 300_000;
509
+ this.heldRetryMs = options.heldRetryMs ?? 600_000;
510
+ }
511
+ /** Loads the answers a run before left unacknowledged and sends them all now. */
512
+ async start(signalArg) {
513
+ if (this.started || this.stopped)
514
+ throw new Error('The spend outbox cannot be started twice.');
515
+ for (const entry of await this.options.store.load(signalArg ?? this.abort.signal)) {
516
+ this.add(entry.accountId, { answer: entry.answer, loginId: entry.loginId, kept: true, keepFailed: false, heldUntil: null });
517
+ }
518
+ this.started = true;
519
+ this.kick();
520
+ }
521
+ /**
522
+ * Counts a relayed answer's spend at once, writes it to the store and reports it, naming the key's login it was served
523
+ * on (`loginIdArg`), until the accounts service acknowledged it; an answer that could not be priced goes to the journal
524
+ * as well. One recorded without a login (`null`) counts all the same, holds the key (`held`) and waits for a login to
525
+ * be named (`attribute`), which the journal says. Throws for an answer no report could carry, a defect of its caller.
526
+ */
527
+ record(accountIdArg, loginIdArg, recordArg) {
528
+ if (!hex64.test(accountIdArg) || (loginIdArg !== null && !hex64.test(loginIdArg))
529
+ || !plugins.authswitchAuthority.isAuthSwitchSpendAnswer(recordArg.answer)) {
530
+ throw new Error('A spend answer the accounts service would refuse was recorded.');
531
+ }
532
+ this.add(accountIdArg, { answer: { ...recordArg.answer }, loginId: loginIdArg, kept: false, keepFailed: false,
533
+ heldUntil: null });
534
+ if (recordArg.unpriced !== undefined) {
535
+ this.say({ kind: 'unpriced', account: accountDigest(accountIdArg), model: recordArg.answer.model, reason: recordArg.unpriced });
536
+ }
537
+ if (loginIdArg === null)
538
+ this.say({ kind: 'unattributed', account: accountDigest(accountIdArg), model: recordArg.answer.model });
539
+ this.keep();
540
+ this.kick();
541
+ }
542
+ /**
543
+ * Says in the journal that an answer relayed on the key ended without its provider stating its usage -- the client left,
544
+ * the stream was cut, or the response failed stating none -- so nothing of it is counted; no usage is estimated for it
545
+ * (`inferenceOpenAiSpend`).
546
+ */
547
+ uncounted(accountIdArg, modelArg) {
548
+ this.say({ kind: 'uncounted', account: accountDigest(accountIdArg), model: modelArg });
549
+ }
550
+ /** The answers relayed on a key whose spend the accounts service has not acknowledged yet. */
551
+ pending(accountIdArg) {
552
+ return [...this.entries.get(accountIdArg)?.values() ?? []]
553
+ .map((entryArg) => ({ endedAt: entryArg.answer.endedAt, microUsd: entryArg.answer.microUsd }));
554
+ }
555
+ /**
556
+ * Whether spend of the key is not recorded and might never be: the accounts service refused a report of its answers
557
+ * that is still held, an answer is held in neither the store, whose write failed, nor the accounts service's ledger,
558
+ * or an answer has no login of the key to be reported on yet.
559
+ */
560
+ held(accountIdArg) {
561
+ return [...this.entries.get(accountIdArg)?.values() ?? []]
562
+ .some((entryArg) => entryArg.heldUntil !== null || (entryArg.keepFailed && !entryArg.kept) || entryArg.loginId === null);
563
+ }
564
+ /**
565
+ * A key's usage as the proxy judges it now: its spend reading with the answers not acknowledged yet added, in the
566
+ * month now falls in (`authSwitchSpendWithPending`). Any other usage is answered as it is.
567
+ */
568
+ judged(accountIdArg, usageArg) {
569
+ if (usageArg.reading?.kind !== 'spend')
570
+ return usageArg;
571
+ return { ...usageArg, reading: { kind: 'spend', spend: plugins.authswitchSpend.authSwitchSpendWithPending(usageArg.reading.spend, this.pending(accountIdArg), this.now()) } };
572
+ }
573
+ /**
574
+ * Stops sending; what is held stays in the store for the next start. The store writes in progress finish, and what is
575
+ * still not kept or not removed is written once more.
576
+ */
577
+ async stop() {
578
+ if (this.stopped)
579
+ return;
580
+ this.stopped = true;
581
+ clearTimeout(this.timer);
582
+ this.timer = undefined;
583
+ clearTimeout(this.keepTimer);
584
+ this.keepTimer = undefined;
585
+ this.abort.abort(new Error('The spend outbox stopped.'));
586
+ await this.running;
587
+ await this.keepTail;
588
+ await this.keepOnce(true);
589
+ if (this.started)
590
+ await this.forget(AbortSignal.timeout(storeWriteTimeoutMs), true);
591
+ }
592
+ add(accountIdArg, entryArg) {
593
+ let entries = this.entries.get(accountIdArg);
594
+ if (!entries) {
595
+ entries = new Map();
596
+ this.entries.set(accountIdArg, entries);
597
+ }
598
+ entries.set(entryArg.answer.answerId, entryArg);
599
+ }
600
+ say(entryArg) {
601
+ try {
602
+ (this.options.journal ?? writeJournal)(entryArg);
603
+ }
604
+ catch { /* a journal line that fails changes nothing */ }
605
+ }
606
+ /** Runs the outbox's work now, or once more after the run in progress. */
607
+ kick() {
608
+ if (!this.started || this.stopped)
609
+ return;
610
+ if (this.running) {
611
+ this.again = true;
612
+ return;
613
+ }
614
+ clearTimeout(this.timer);
615
+ this.timer = undefined;
616
+ this.running = (async () => {
617
+ do {
618
+ this.again = false;
619
+ await this.cycle();
620
+ } while (this.again && !this.stopped);
621
+ })().catch(() => undefined).finally(() => {
622
+ this.running = undefined;
623
+ this.arm();
624
+ });
625
+ }
626
+ /** Removes what was acknowledged from the store, then sends every report that is due. */
627
+ async cycle() {
628
+ const signal = this.abort.signal;
629
+ if (this.now() >= this.forgetRetryAt)
630
+ await this.forget(signal, false);
631
+ for (let batch = this.nextBatch(); batch && !this.stopped; batch = this.nextBatch()) {
632
+ await this.send(batch.accountId, batch.loginId, batch.entries, signal);
633
+ }
634
+ }
635
+ /**
636
+ * Writes the recorded answers not kept yet to the store, on the outbox's chain of store writes, which runs apart from
637
+ * the reports and never waits for one; once they are kept the reports run. After a failed write the next waits,
638
+ * doubling from `retryMs`, unless an answer recorded meanwhile, or the stop, tries again sooner.
639
+ */
640
+ keep() {
641
+ if (this.stopped)
642
+ return;
643
+ clearTimeout(this.keepTimer);
644
+ this.keepTimer = undefined;
645
+ this.keepTail = this.keepTail.then(() => this.keepOnce(false));
646
+ }
647
+ /**
648
+ * One pass of the store writes: every answer not kept yet, one at a time. A write that fails is said once until the
649
+ * store takes writes again; the answers count meanwhile all the same.
650
+ */
651
+ async keepOnce(finalArg) {
652
+ if (this.stopped && !finalArg)
653
+ return;
654
+ const unkept = [...this.entries].flatMap(([accountId, entries]) => [...entries.values()]
655
+ .filter((entryArg) => !entryArg.kept).map((entryArg) => ({ accountId, entry: entryArg })));
656
+ if (!unkept.length)
657
+ return;
658
+ try {
659
+ for (const { accountId, entry } of unkept) {
660
+ await this.options.store.insert({ accountId, loginId: entry.loginId, answer: entry.answer }, AbortSignal.timeout(storeWriteTimeoutMs));
661
+ entry.kept = true;
662
+ // Acknowledged while it was written: it leaves the store again.
663
+ if (this.entries.get(accountId)?.get(entry.answer.answerId) !== entry)
664
+ this.acknowledgedIds.add(entry.answer.answerId);
665
+ }
666
+ this.keepFailures = 0;
667
+ this.keepRetryAt = 0;
668
+ this.keepSaid = false;
669
+ this.kick();
670
+ }
671
+ catch (errorArg) {
672
+ for (const { entry } of unkept)
673
+ if (!entry.kept)
674
+ entry.keepFailed = true;
675
+ this.keepFailures += 1;
676
+ this.keepRetryAt = this.now() + this.backoff(this.keepFailures);
677
+ if (!this.keepSaid) {
678
+ this.keepSaid = true;
679
+ this.say({ kind: 'unkept', answers: unkept.filter((itemArg) => !itemArg.entry.kept).length, error: oneLine(errorArg) });
680
+ }
681
+ if (this.stopped)
682
+ return;
683
+ clearTimeout(this.keepTimer);
684
+ this.keepTimer = setTimeout(() => this.keep(), Math.max(0, this.keepRetryAt - this.now()));
685
+ this.keepTimer.unref?.();
686
+ }
687
+ }
688
+ /** Removes the acknowledged answers from the store; a failed removal waits, doubling, said once. */
689
+ async forget(signalArg, finalArg) {
690
+ if (!this.acknowledgedIds.size)
691
+ return;
692
+ const ids = [...this.acknowledgedIds];
693
+ try {
694
+ await this.options.store.delete(ids, signalArg);
695
+ for (const id of ids)
696
+ this.acknowledgedIds.delete(id);
697
+ this.forgetFailures = 0;
698
+ this.forgetRetryAt = 0;
699
+ this.forgetSaid = false;
700
+ }
701
+ catch (errorArg) {
702
+ if (this.stopped && !finalArg)
703
+ return;
704
+ this.forgetFailures += 1;
705
+ this.forgetRetryAt = this.now() + this.backoff(this.forgetFailures);
706
+ if (!this.forgetSaid) {
707
+ this.forgetSaid = true;
708
+ this.say({ kind: 'unremoved', answers: ids.length, error: oneLine(errorArg) });
709
+ }
710
+ }
711
+ }
712
+ /**
713
+ * The next report due: a key's held answers once their wait ended, as a report of their own, else its other answers,
714
+ * kept or not; of one login, oldest first, at most 64, each id once. Answers recorded without a login take the one
715
+ * `attribute` names now; while it names none they wait, the key's reports backing off as after a passing failure.
716
+ */
717
+ nextBatch() {
718
+ const now = this.now();
719
+ for (const [accountId, entries] of this.entries) {
720
+ if ((this.accounts.get(accountId)?.retryAt ?? 0) > now)
721
+ continue;
722
+ const all = [...entries.values()];
723
+ if (all.some((entryArg) => entryArg.loginId === null)) {
724
+ const login = this.options.attribute(accountId);
725
+ if (login !== undefined && hex64.test(login))
726
+ for (const entry of all)
727
+ entry.loginId ??= login;
728
+ }
729
+ const named = all.filter((entryArg) => entryArg.loginId !== null);
730
+ const due = named.filter((entryArg) => entryArg.heldUntil !== null && entryArg.heldUntil <= now);
731
+ const fresh = named.filter((entryArg) => entryArg.heldUntil === null);
732
+ const oldest = (due.length ? due : fresh)
733
+ .sort((leftArg, rightArg) => Date.parse(leftArg.answer.endedAt) - Date.parse(rightArg.answer.endedAt));
734
+ const loginId = oldest[0]?.loginId;
735
+ if (loginId) {
736
+ return { accountId, loginId, entries: oldest.filter((entryArg) => entryArg.loginId === loginId)
737
+ .slice(0, plugins.authswitchAuthority.authSwitchSpendAnswerBatchLimit) };
738
+ }
739
+ if (named.length < all.length) {
740
+ // Nothing of the key can be reported until a login is named: ask again later.
741
+ const account = this.accounts.get(accountId) ?? { failures: 0, retryAt: 0, said: true };
742
+ account.failures += 1;
743
+ account.retryAt = now + this.backoff(account.failures);
744
+ this.accounts.set(accountId, account);
745
+ }
746
+ }
747
+ return undefined;
748
+ }
749
+ async send(accountIdArg, loginIdArg, entriesArg, signalArg) {
750
+ const account = this.accounts.get(accountIdArg) ?? { failures: 0, retryAt: 0, said: false };
751
+ this.accounts.set(accountIdArg, account);
752
+ let usage;
753
+ try {
754
+ usage = await this.options.report(accountIdArg, loginIdArg, entriesArg.map((entryArg) => ({ ...entryArg.answer })), signalArg);
755
+ }
756
+ catch (errorArg) {
757
+ if (this.stopped)
758
+ return;
759
+ const refusal = plugins.authswitchAuthority.asAuthSwitchRefusal(errorArg);
760
+ if (refusal?.code === 'invalid_input' || plugins.authswitchAuthority.isAuthSwitchMalformedRequest(errorArg)) {
761
+ const retryAt = this.now() + this.heldRetryMs;
762
+ for (const entry of entriesArg)
763
+ entry.heldUntil = retryAt;
764
+ this.say({ kind: 'refused', account: accountDigest(accountIdArg), answers: entriesArg.length,
765
+ error: refusal?.instruction ?? plugins.authswitchAuthority.authSwitchMalformedRequestText,
766
+ retryAt: new Date(retryAt).toISOString() });
767
+ return;
768
+ }
769
+ account.failures += 1;
770
+ account.retryAt = this.now() + this.backoff(account.failures);
771
+ if (!account.said) {
772
+ account.said = true;
773
+ this.say({ kind: 'unreported', account: accountDigest(accountIdArg),
774
+ answers: this.entries.get(accountIdArg)?.size ?? entriesArg.length, error: oneLine(errorArg) });
775
+ }
776
+ return;
777
+ }
778
+ // The one acknowledgement step: the service's answer, which counts the report's answers, replaces the held reading
779
+ // in the same synchronous step that drops them from what is pending.
780
+ this.options.acknowledged(accountIdArg, usage);
781
+ const entries = this.entries.get(accountIdArg);
782
+ for (const entry of entriesArg) {
783
+ entries?.delete(entry.answer.answerId);
784
+ // One the store has not kept yet leaves it once its write lands (`keepOnce`).
785
+ if (entry.kept)
786
+ this.acknowledgedIds.add(entry.answer.answerId);
787
+ }
788
+ if (entries?.size === 0)
789
+ this.entries.delete(accountIdArg);
790
+ this.accounts.delete(accountIdArg);
791
+ }
792
+ backoff(failuresArg) {
793
+ return Math.min(this.maxRetryMs, this.retryMs * 2 ** Math.max(0, failuresArg - 1));
794
+ }
795
+ /** Wakes the reports when the next held or waiting answer, or a removal to try again, is due. */
796
+ arm() {
797
+ clearTimeout(this.timer);
798
+ this.timer = undefined;
799
+ if (this.stopped || !this.started)
800
+ return;
801
+ let due = Number.POSITIVE_INFINITY;
802
+ if (this.acknowledgedIds.size)
803
+ due = Math.min(due, this.forgetRetryAt);
804
+ for (const [accountId, entries] of this.entries) {
805
+ const retryAt = this.accounts.get(accountId)?.retryAt ?? 0;
806
+ for (const entry of entries.values())
807
+ due = Math.min(due, Math.max(retryAt, entry.heldUntil ?? 0));
808
+ }
809
+ if (!Number.isFinite(due))
810
+ return;
811
+ this.timer = setTimeout(() => this.kick(), Math.max(0, due - this.now()));
812
+ this.timer.unref?.();
813
+ }
814
+ }
815
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pbmZlcmVuY2VzcGVuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMuaW5mZXJlbmNlc3BlbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBS3hDLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDO0FBQy9CLHdGQUF3RjtBQUN4RixNQUFNLGtCQUFrQixHQUFHLHlCQUF5QixDQUFDO0FBRXJELE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBaUIsRUFBdUMsRUFBRSxDQUMxRSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFaEYsMEdBQTBHO0FBQzFHLE1BQU0sR0FBRyxHQUFHLENBQUksU0FBa0QsRUFBRSxNQUFjLEVBQWlCLEVBQUUsQ0FDbkcsU0FBUyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUVySCxzSEFBc0g7QUFDdEgsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFpQixFQUFVLEVBQUUsQ0FDNUMsQ0FBQyxRQUFRLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWpILHVHQUF1RztBQUN2RyxNQUFNLGFBQWEsR0FBRyxDQUFDLFlBQW9CLEVB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LENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQztZQUMzRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRiJ9