@framers/agentos 0.12.24 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/dist/api/AgentOS.d.ts +15 -0
- package/dist/api/AgentOS.d.ts.map +1 -1
- package/dist/api/AgentOS.js +82 -0
- package/dist/api/AgentOS.js.map +1 -1
- package/dist/api/agent.d.ts +7 -3
- package/dist/api/agent.d.ts.map +1 -1
- package/dist/api/agent.js.map +1 -1
- package/dist/api/embedText.d.ts.map +1 -1
- package/dist/api/embedText.js +1 -8
- package/dist/api/embedText.js.map +1 -1
- package/dist/api/gmi.d.ts.map +1 -1
- package/dist/api/gmi.js +38 -19
- package/dist/api/gmi.js.map +1 -1
- package/dist/api/runtime/AgentOSOrchestrator.d.ts.map +1 -1
- package/dist/api/runtime/AgentOSOrchestrator.js +23 -0
- package/dist/api/runtime/AgentOSOrchestrator.js.map +1 -1
- package/dist/api/runtime/agentCognitiveMemory.d.ts +12 -9
- package/dist/api/runtime/agentCognitiveMemory.d.ts.map +1 -1
- package/dist/api/runtime/agentCognitiveMemory.js +53 -17
- package/dist/api/runtime/agentCognitiveMemory.js.map +1 -1
- package/dist/api/runtime/completionGateway.d.ts.map +1 -1
- package/dist/api/runtime/completionGateway.js +7 -0
- package/dist/api/runtime/completionGateway.js.map +1 -1
- package/dist/api/runtime/gmiResults.d.ts +63 -6
- package/dist/api/runtime/gmiResults.d.ts.map +1 -1
- package/dist/api/runtime/gmiResults.js +83 -13
- package/dist/api/runtime/gmiResults.js.map +1 -1
- package/dist/api/runtime/gmiSession.d.ts +31 -6
- package/dist/api/runtime/gmiSession.d.ts.map +1 -1
- package/dist/api/runtime/gmiSession.js +144 -44
- package/dist/api/runtime/gmiSession.js.map +1 -1
- package/dist/api/runtime/gmiTranscript.d.ts +7 -6
- package/dist/api/runtime/gmiTranscript.d.ts.map +1 -1
- package/dist/api/runtime/gmiTranscript.js +6 -5
- package/dist/api/runtime/gmiTranscript.js.map +1 -1
- package/dist/api/runtime/provider-defaults.d.ts +9 -0
- package/dist/api/runtime/provider-defaults.d.ts.map +1 -1
- package/dist/api/runtime/provider-defaults.js +9 -0
- package/dist/api/runtime/provider-defaults.js.map +1 -1
- package/dist/api/types/AgentOSInput.d.ts +5 -0
- package/dist/api/types/AgentOSInput.d.ts.map +1 -1
- package/dist/api/types/OrchestratorConfig.d.ts +3 -0
- package/dist/api/types/OrchestratorConfig.d.ts.map +1 -1
- package/dist/cognition/emergent/executor/QuickJSExecutor.d.ts +8 -0
- package/dist/cognition/emergent/executor/QuickJSExecutor.d.ts.map +1 -1
- package/dist/cognition/emergent/executor/QuickJSExecutor.js +193 -36
- package/dist/cognition/emergent/executor/QuickJSExecutor.js.map +1 -1
- package/dist/cognition/emergent/executor/guest-prelude.d.ts +4 -0
- package/dist/cognition/emergent/executor/guest-prelude.d.ts.map +1 -1
- package/dist/cognition/emergent/executor/guest-prelude.js +21 -1
- package/dist/cognition/emergent/executor/guest-prelude.js.map +1 -1
- package/dist/cognition/emergent/executor/guest-surface.d.ts.map +1 -1
- package/dist/cognition/emergent/executor/guest-surface.js +7 -2
- package/dist/cognition/emergent/executor/guest-surface.js.map +1 -1
- package/dist/cognition/memory/CognitiveMemoryManager.d.ts +28 -21
- package/dist/cognition/memory/CognitiveMemoryManager.d.ts.map +1 -1
- package/dist/cognition/memory/CognitiveMemoryManager.js +76 -26
- package/dist/cognition/memory/CognitiveMemoryManager.js.map +1 -1
- package/dist/cognition/memory/retrieval/store/MemoryStore.d.ts +10 -2
- package/dist/cognition/memory/retrieval/store/MemoryStore.d.ts.map +1 -1
- package/dist/cognition/memory/retrieval/store/MemoryStore.js +11 -2
- package/dist/cognition/memory/retrieval/store/MemoryStore.js.map +1 -1
- package/dist/cognition/substrate/ConversationHistoryManager.d.ts +3 -1
- package/dist/cognition/substrate/ConversationHistoryManager.d.ts.map +1 -1
- package/dist/cognition/substrate/ConversationHistoryManager.js +9 -2
- package/dist/cognition/substrate/ConversationHistoryManager.js.map +1 -1
- package/dist/cognition/substrate/GMI.d.ts +33 -2
- package/dist/cognition/substrate/GMI.d.ts.map +1 -1
- package/dist/cognition/substrate/GMI.js +225 -71
- package/dist/cognition/substrate/GMI.js.map +1 -1
- package/dist/cognition/substrate/IGMI.d.ts +14 -3
- package/dist/cognition/substrate/IGMI.d.ts.map +1 -1
- package/dist/cognition/substrate/IGMI.js +2 -1
- package/dist/cognition/substrate/IGMI.js.map +1 -1
- package/dist/cognition/substrate/SentimentTracker.d.ts +8 -0
- package/dist/cognition/substrate/SentimentTracker.d.ts.map +1 -1
- package/dist/cognition/substrate/SentimentTracker.js +20 -0
- package/dist/cognition/substrate/SentimentTracker.js.map +1 -1
- package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts.map +1 -1
- package/dist/core/llm/providers/implementations/OpenAIProvider.js +23 -4
- package/dist/core/llm/providers/implementations/OpenAIProvider.js.map +1 -1
- package/dist/core/utils/errors.d.ts +4 -0
- package/dist/core/utils/errors.d.ts.map +1 -1
- package/dist/core/utils/errors.js +8 -0
- package/dist/core/utils/errors.js.map +1 -1
- package/dist/extensions/ExtensionRegistry.d.ts.map +1 -1
- package/dist/extensions/ExtensionRegistry.js +4 -1
- package/dist/extensions/ExtensionRegistry.js.map +1 -1
- package/dist/io/speech/SpeechRuntime.d.ts.map +1 -1
- package/dist/io/speech/SpeechRuntime.js +5 -0
- package/dist/io/speech/SpeechRuntime.js.map +1 -1
- package/dist/io/speech/providers/MiniMaxTextToSpeechProvider.d.ts +34 -3
- package/dist/io/speech/providers/MiniMaxTextToSpeechProvider.d.ts.map +1 -1
- package/dist/io/speech/providers/MiniMaxTextToSpeechProvider.js +120 -11
- package/dist/io/speech/providers/MiniMaxTextToSpeechProvider.js.map +1 -1
- package/dist/safety/runtime/SpendMeter.d.ts +135 -0
- package/dist/safety/runtime/SpendMeter.d.ts.map +1 -0
- package/dist/safety/runtime/SpendMeter.js +61 -0
- package/dist/safety/runtime/SpendMeter.js.map +1 -0
- package/dist/safety/runtime/SqlSpendMeter.d.ts +78 -0
- package/dist/safety/runtime/SqlSpendMeter.d.ts.map +1 -0
- package/dist/safety/runtime/SqlSpendMeter.js +268 -0
- package/dist/safety/runtime/SqlSpendMeter.js.map +1 -0
- package/dist/safety/runtime/index.d.ts +4 -0
- package/dist/safety/runtime/index.d.ts.map +1 -1
- package/dist/safety/runtime/index.js +2 -0
- package/dist/safety/runtime/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -20,12 +20,63 @@ const MIME_TYPES = {
|
|
|
20
20
|
flac: "audio/flac",
|
|
21
21
|
pcm: "audio/L16",
|
|
22
22
|
};
|
|
23
|
+
/** How long a URL-output download may take by default: 30 seconds. */
|
|
24
|
+
const DEFAULT_AUDIO_DOWNLOAD_TIMEOUT_MS = 30000;
|
|
25
|
+
/** The largest URL-output download accepted by default: 100 MiB. */
|
|
26
|
+
const DEFAULT_MAX_AUDIO_DOWNLOAD_BYTES = 100 * 1024 * 1024;
|
|
23
27
|
function decodeHexAudio(value) {
|
|
24
28
|
if (value.length % 2 !== 0 || !/^[0-9a-f]*$/i.test(value)) {
|
|
25
29
|
throw new Error("MiniMax speech returned invalid hex audio.");
|
|
26
30
|
}
|
|
27
31
|
return Buffer.from(value, "hex");
|
|
28
32
|
}
|
|
33
|
+
/** An int64 id field of a MiniMax response, written as a JSON integer. */
|
|
34
|
+
const INT64_ID_FIELD = /(?<!\\)("(?:task_id|file_id)"\s*:\s*)(-?\d+)(?=\s*[,}])/g;
|
|
35
|
+
/**
|
|
36
|
+
* Parse a MiniMax JSON body. JSON.parse rounds an integer past 2^53, so an
|
|
37
|
+
* id field holding one is read as its decimal string instead.
|
|
38
|
+
*/
|
|
39
|
+
function parseMiniMaxJson(text) {
|
|
40
|
+
return JSON.parse(text.replace(INT64_ID_FIELD, (match, prefix, digits) => Number.isSafeInteger(Number(digits)) ? match : `${prefix}"${digits}"`));
|
|
41
|
+
}
|
|
42
|
+
/** Whether `host` is listed: an exact name, or `*.domain` for its subdomains. */
|
|
43
|
+
function hostAllowed(host, allowed) {
|
|
44
|
+
const name = host.toLowerCase();
|
|
45
|
+
return allowed.some((entry) => {
|
|
46
|
+
const pattern = entry.trim().toLowerCase();
|
|
47
|
+
if (pattern.startsWith("*.")) {
|
|
48
|
+
return pattern.length > 2 && name.endsWith(pattern.slice(1));
|
|
49
|
+
}
|
|
50
|
+
return pattern !== "" && name === pattern;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function audioTooLarge(limit) {
|
|
54
|
+
return new Error(`MiniMax audio download is larger than ${limit} bytes (maxAudioDownloadBytes).`);
|
|
55
|
+
}
|
|
56
|
+
/** The response body, read until it ends or passes `limit` bytes. */
|
|
57
|
+
async function readCappedBody(response, limit) {
|
|
58
|
+
if (!response.body) {
|
|
59
|
+
const whole = Buffer.from(await response.arrayBuffer());
|
|
60
|
+
if (whole.length > limit)
|
|
61
|
+
throw audioTooLarge(limit);
|
|
62
|
+
return whole;
|
|
63
|
+
}
|
|
64
|
+
const reader = response.body.getReader();
|
|
65
|
+
const chunks = [];
|
|
66
|
+
let total = 0;
|
|
67
|
+
for (;;) {
|
|
68
|
+
const { done, value } = await reader.read();
|
|
69
|
+
if (done)
|
|
70
|
+
break;
|
|
71
|
+
total += value.byteLength;
|
|
72
|
+
if (total > limit) {
|
|
73
|
+
await reader.cancel().catch(() => undefined);
|
|
74
|
+
throw audioTooLarge(limit);
|
|
75
|
+
}
|
|
76
|
+
chunks.push(value);
|
|
77
|
+
}
|
|
78
|
+
return Buffer.concat(chunks, total);
|
|
79
|
+
}
|
|
29
80
|
/** Text-to-speech provider for MiniMax HTTP, async, and WebSocket APIs. */
|
|
30
81
|
export class MiniMaxTextToSpeechProvider {
|
|
31
82
|
constructor(config) {
|
|
@@ -56,7 +107,7 @@ export class MiniMaxTextToSpeechProvider {
|
|
|
56
107
|
throw new Error("MiniMax speech synthesis completed without audio output.");
|
|
57
108
|
}
|
|
58
109
|
const audioBuffer = outputFormat === "url"
|
|
59
|
-
?
|
|
110
|
+
? await this.downloadAudio(audio)
|
|
60
111
|
: decodeHexAudio(audio);
|
|
61
112
|
return this.result(audioBuffer, text, options, audioFormat, response);
|
|
62
113
|
}
|
|
@@ -64,8 +115,14 @@ export class MiniMaxTextToSpeechProvider {
|
|
|
64
115
|
const providerOptions = this.providerOptions(options);
|
|
65
116
|
return this.request("/v1/t2a_async_v2", this.buildRequest(text, options, providerOptions, this.audioFormat(options, providerOptions)));
|
|
66
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Query an async task's status: `GET /v1/query/t2a_async_query_v2` with
|
|
120
|
+
* `task_id` as a query parameter.
|
|
121
|
+
* https://platform.minimax.io/docs/api-reference/speech-t2a-async-query
|
|
122
|
+
*/
|
|
67
123
|
async queryAsync(taskId) {
|
|
68
|
-
|
|
124
|
+
const query = new URLSearchParams({ task_id: String(taskId) });
|
|
125
|
+
return this.request(`/v1/query/t2a_async_query_v2?${query.toString()}`);
|
|
69
126
|
}
|
|
70
127
|
async synthesizeWebSocket(text, options = {}) {
|
|
71
128
|
const providerOptions = this.providerOptions(options);
|
|
@@ -160,19 +217,71 @@ export class MiniMaxTextToSpeechProvider {
|
|
|
160
217
|
voice_modify: providerOptions.voiceModify,
|
|
161
218
|
};
|
|
162
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* Download the audio a `url` response links to. The link must be `https`
|
|
222
|
+
* on a host in `audioUrlHosts`. The request carries no key, refuses
|
|
223
|
+
* redirects, has a timeout, and fails on a non-2xx status or a body past
|
|
224
|
+
* `maxAudioDownloadBytes`.
|
|
225
|
+
*/
|
|
226
|
+
async downloadAudio(link) {
|
|
227
|
+
let url;
|
|
228
|
+
try {
|
|
229
|
+
url = new URL(link);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
throw new Error("MiniMax speech returned an audio URL that is not a URL.");
|
|
233
|
+
}
|
|
234
|
+
if (url.protocol !== "https:") {
|
|
235
|
+
throw new Error(`MiniMax speech returned a ${url.protocol} audio URL; only https is downloaded.`);
|
|
236
|
+
}
|
|
237
|
+
if (!hostAllowed(url.hostname, this.config.audioUrlHosts ?? [])) {
|
|
238
|
+
throw new Error(`MiniMax speech returned an audio URL on ${url.hostname}, which is not in ` +
|
|
239
|
+
"audioUrlHosts; list the host there to download URL output.");
|
|
240
|
+
}
|
|
241
|
+
const limit = this.config.maxAudioDownloadBytes ?? DEFAULT_MAX_AUDIO_DOWNLOAD_BYTES;
|
|
242
|
+
const timeoutMs = this.config.audioDownloadTimeoutMs ?? DEFAULT_AUDIO_DOWNLOAD_TIMEOUT_MS;
|
|
243
|
+
const signal = AbortSignal.timeout(timeoutMs);
|
|
244
|
+
try {
|
|
245
|
+
const response = await this.fetchImpl(url.href, { redirect: "error", signal });
|
|
246
|
+
if (!response.ok) {
|
|
247
|
+
await response.body?.cancel().catch(() => undefined);
|
|
248
|
+
throw new Error(`MiniMax audio download failed (${response.status}).`);
|
|
249
|
+
}
|
|
250
|
+
const declared = Number(response.headers?.get("content-length"));
|
|
251
|
+
if (Number.isFinite(declared) && declared > limit) {
|
|
252
|
+
await response.body?.cancel().catch(() => undefined);
|
|
253
|
+
throw audioTooLarge(limit);
|
|
254
|
+
}
|
|
255
|
+
const audio = await readCappedBody(response, limit);
|
|
256
|
+
if (audio.length === 0) {
|
|
257
|
+
throw new Error("MiniMax audio download returned no audio.");
|
|
258
|
+
}
|
|
259
|
+
return audio;
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
if (signal.aborted) {
|
|
263
|
+
throw new Error(`MiniMax audio download timed out after ${timeoutMs} ms.`);
|
|
264
|
+
}
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/** A JSON request to MiniMax: a POST when `body` is given, else a GET. */
|
|
163
269
|
async request(path, body) {
|
|
164
270
|
const baseUrl = this.config.baseUrl ?? `https://${this.host}`;
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
headers: {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
271
|
+
const authorization = `Bearer ${this.keyPool.next()}`;
|
|
272
|
+
const response = await this.fetchImpl(`${baseUrl}${path}`, body === undefined
|
|
273
|
+
? { method: "GET", headers: { Authorization: authorization } }
|
|
274
|
+
: {
|
|
275
|
+
method: "POST",
|
|
276
|
+
headers: {
|
|
277
|
+
Authorization: authorization,
|
|
278
|
+
"Content-Type": "application/json",
|
|
279
|
+
},
|
|
280
|
+
body: JSON.stringify(body),
|
|
281
|
+
});
|
|
173
282
|
let payload;
|
|
174
283
|
try {
|
|
175
|
-
payload = (await response.
|
|
284
|
+
payload = parseMiniMaxJson(await response.text());
|
|
176
285
|
}
|
|
177
286
|
catch {
|
|
178
287
|
throw new Error(`MiniMax speech returned invalid JSON (${response.status}).`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MiniMaxTextToSpeechProvider.js","sourceRoot":"","sources":["../../../../src/io/speech/providers/MiniMaxTextToSpeechProvider.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAUnE,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,cAAc;IACd,iBAAiB;IACjB,cAAc;IACd,iBAAiB;CACT,CAAC;AAEX,MAAM,YAAY,GAAwC;IACxD,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE,kBAAkB;CAC1B,CAAC;AAEF,MAAM,UAAU,GAA6C;IAC3D,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;CACjB,CAAC;AA4CF,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,2EAA2E;AAC3E,MAAM,OAAO,2BAA2B;IAUtC,YAA6B,MAAyC;QAAzC,WAAM,GAAN,MAAM,CAAmC;QATtD,OAAE,GAAG,aAAa,CAAC;QACnB,gBAAW,GAAG,aAAa,CAAC;QAC5B,sBAAiB,GAAG,IAAI,CAAC;QAQvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU,CACd,IAAY,EACZ,UAAkC,EAAE;QAEpC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC/D,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,IAAI,KAAK,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAwB,YAAY,EAAE;YACvE,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,CAAC;YACjE,MAAM,EAAE,KAAK;YACb,aAAa,EAAE,YAAY;YAC3B,eAAe,EAAE,eAAe,CAAC,cAAc;SAChD,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GACf,YAAY,KAAK,KAAK;YACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAChE,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,UAAkC,EAAE;QAEpC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,OAAO,CACjB,kBAAkB,EAClB,IAAI,CAAC,YAAY,CACf,IAAI,EACJ,OAAO,EACP,eAAe,EACf,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAC3C,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,IAAY,EACZ,UAAkC,EAAE;QAEpC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC/D,MAAM,SAAS,GACb,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,SAAS,IAAI,CAAC,IAAI,eAAe,CAAC;QAChE,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB;YACzC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;YAClD,CAAC,CAAC,IAAI,SAAS,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAE1C,OAAO,IAAI,OAAO,CAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5D,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;gBAC5B,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC;YAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC3B,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAIxC,CAAC;oBACF,IACE,OAAO,CAAC,SAAS,EAAE,WAAW;wBAC9B,OAAO,CAAC,SAAS,CAAC,WAAW,KAAK,CAAC,EACnC,CAAC;wBACD,IAAI,CACF,IAAI,KAAK,CACP,OAAO,CAAC,SAAS,CAAC,UAAU;4BAC1B,qCAAqC,CACxC,CACF,CAAC;wBACF,OAAO;oBACT,CAAC;oBACD,IAAI,OAAO,CAAC,KAAK,KAAK,mBAAmB,EAAE,CAAC;wBAC1C,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,SAAS,CAAC;4BACb,KAAK,EAAE,YAAY;4BACnB,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,CAAC;4BAC/D,IAAI,EAAE,SAAS;yBAChB,CAAC,CACH,CAAC;oBACJ,CAAC;yBAAM,IAAI,OAAO,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;wBAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;wBAC9D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;oBACxD,CAAC;yBAAM,IACL,OAAO,CAAC,KAAK,KAAK,gBAAgB;wBAClC,OAAO,CAAC,IAAI,EAAE,KAAK,EACnB,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClD,CAAC;yBAAM,IAAI,OAAO,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;wBAC7C,OAAO,GAAG,IAAI,CAAC;wBACf,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,CACL,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAC/D,CAAC;oBACJ,CAAC;yBAAM,IAAI,OAAO,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;wBAC3C,IAAI,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;oBACzD,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,OAAO;oBACV,IAAI,CACF,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAClE,CAAC;YACN,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe,CACrB,OAA+B;QAE/B,OAAO,CAAC,OAAO,CAAC,uBAAuB;YACrC,EAAE,CAAiC,CAAC;IACxC,CAAC;IAEO,WAAW,CACjB,OAA+B,EAC/B,eAA6C;QAE7C,MAAM,SAAS,GACb,eAAe,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC;QAC5E,IACE,SAAS,KAAK,KAAK;YACnB,SAAS,KAAK,KAAK;YACnB,SAAS,KAAK,MAAM;YACpB,SAAS,KAAK,KAAK,EACnB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,YAAY,CAClB,IAAY,EACZ,OAA+B,EAC/B,eAA6C,EAC7C,WAAqC;QAErC,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe;YAC5D,IAAI;YACJ,cAAc,EAAE,eAAe,CAAC,aAAa,IAAI,OAAO,CAAC,YAAY;YACrE,aAAa,EAAE;gBACb,QAAQ,EACN,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,6BAA6B;gBACrE,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,eAAe,CAAC,YAAY;aAChC;YACD,kBAAkB,EAAE,eAAe,CAAC,iBAAiB;YACrD,aAAa,EAAE,EAAE,GAAG,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE;YACvE,YAAY,EAAE,eAAe,CAAC,WAAW;SAC1C,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,IAAY,EACZ,IAA6B;QAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE;gBAC9C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,OAAgD,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAE/B,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,yCAAyC,QAAQ,CAAC,MAAM,IAAI,CAC7D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,SAAS,EAAE,WAAW,KAAK,CAAC,EAAE,CAAC;YACzD,MAAM,OAAO,GACX,OAAO,CAAC,SAAS,EAAE,UAAU;gBAC7B,QAAQ,CAAC,UAAU;gBACnB,gBAAgB,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,kCAAkC,QAAQ,CAAC,MAAM,MAAM,OAAO,EAAE,CACjE,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,MAAM,CACZ,WAAmB,EACnB,IAAY,EACZ,OAA+B,EAC/B,WAAqC,EACrC,QAAgC;QAEhC,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,6BAA6B,CAAC;QACtE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC;QACpE,OAAO;YACL,WAAW;YACX,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC;YACjC,IAAI,EAAE,CAAC;YACP,eAAe,EACb,QAAQ,EAAE,UAAU,EAAE,YAAY,KAAK,SAAS;gBAC9C,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI;gBACzC,CAAC,CAAC,SAAS;YACf,gBAAgB,EAAE,QAAQ;YAC1B,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,KAAK,EAAE;gBACL,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,IAAI,IAAI,CAAC,MAAM;gBACjE,SAAS,EAAE,KAAK;gBAChB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"MiniMaxTextToSpeechProvider.js","sourceRoot":"","sources":["../../../../src/io/speech/providers/MiniMaxTextToSpeechProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The spend meter contract: a persisted, per-account allowance of turns (or any unit a product
|
|
3
|
+
* meters), reserved atomically before a turn reaches a model provider and settled when the turn ends.
|
|
4
|
+
*
|
|
5
|
+
* A reservation is keyed by the caller's durable `operationId`, so a request retried with the same id replays its
|
|
6
|
+
* reservation instead of charging twice. A reservation that is never settled (the process died mid-turn) carries a
|
|
7
|
+
* lease; {@link ISpendMeter.reconcile} settles the expired ones, asking the product what became of each.
|
|
8
|
+
*
|
|
9
|
+
* @module safety/runtime/SpendMeter
|
|
10
|
+
*/
|
|
11
|
+
/** How a reservation ends: the turn counted, it did not, or its reply was replaced after it counted (refunded). */
|
|
12
|
+
export type SpendOutcome = 'consumed' | 'released' | 'replaced';
|
|
13
|
+
/** The state of one reservation row. A replaced reservation ends `released`, with the outcome `replaced`. */
|
|
14
|
+
export type SpendReservationState = 'reserved' | 'consumed' | 'released';
|
|
15
|
+
/** Why a reservation was refused. */
|
|
16
|
+
export type SpendDenyReason =
|
|
17
|
+
/** The period's allowance has no room for the units asked. */
|
|
18
|
+
'allowance_exhausted'
|
|
19
|
+
/** The operation already holds a live reservation (a concurrent duplicate of the same request). */
|
|
20
|
+
| 'in_flight'
|
|
21
|
+
/** The operation already counted: a retry of a request that finished. */
|
|
22
|
+
| 'already_consumed'
|
|
23
|
+
/** The operation was released and retried as many times as the meter allows. */
|
|
24
|
+
| 'retries_exhausted';
|
|
25
|
+
/** Token usage a settle may record beside the outcome. */
|
|
26
|
+
export interface SpendUsage {
|
|
27
|
+
promptTokens?: number;
|
|
28
|
+
completionTokens?: number;
|
|
29
|
+
totalTokens?: number;
|
|
30
|
+
totalCostUSD?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface SpendReserveRequest {
|
|
33
|
+
accountId: string;
|
|
34
|
+
/** The product's durable id for the request; a retry with the same id replays the reservation. */
|
|
35
|
+
operationId: string;
|
|
36
|
+
/** Units to reserve. Default 1. */
|
|
37
|
+
units?: number;
|
|
38
|
+
/** The clock, in epoch milliseconds; for tests. */
|
|
39
|
+
now?: number;
|
|
40
|
+
}
|
|
41
|
+
export type SpendReserveResult = {
|
|
42
|
+
status: 'reserved';
|
|
43
|
+
operationId: string;
|
|
44
|
+
accountId: string;
|
|
45
|
+
period: string;
|
|
46
|
+
units: number;
|
|
47
|
+
/** 1 for a first reservation, more for a retry of a released one. */
|
|
48
|
+
attempt: number;
|
|
49
|
+
/** Units left in the period after this reservation. */
|
|
50
|
+
remaining: number;
|
|
51
|
+
expiresAt: number;
|
|
52
|
+
} | {
|
|
53
|
+
status: 'denied';
|
|
54
|
+
reason: SpendDenyReason;
|
|
55
|
+
operationId: string;
|
|
56
|
+
accountId: string;
|
|
57
|
+
period: string;
|
|
58
|
+
remaining: number;
|
|
59
|
+
};
|
|
60
|
+
export interface SpendSettleRequest {
|
|
61
|
+
operationId: string;
|
|
62
|
+
outcome: SpendOutcome;
|
|
63
|
+
usage?: SpendUsage;
|
|
64
|
+
now?: number;
|
|
65
|
+
}
|
|
66
|
+
export interface SpendSettleResult {
|
|
67
|
+
/** `already_settled` when the reservation had already left the state this outcome moves it from. */
|
|
68
|
+
status: 'settled' | 'already_settled' | 'not_found';
|
|
69
|
+
state?: SpendReservationState;
|
|
70
|
+
}
|
|
71
|
+
export interface SpendMeterSnapshot {
|
|
72
|
+
accountId: string;
|
|
73
|
+
period: string;
|
|
74
|
+
allowance: number;
|
|
75
|
+
used: number;
|
|
76
|
+
reserved: number;
|
|
77
|
+
remaining: number;
|
|
78
|
+
}
|
|
79
|
+
export interface SpendReconcileResult {
|
|
80
|
+
consumed: number;
|
|
81
|
+
released: number;
|
|
82
|
+
/** Expired reservations still reserved after the pass (a concurrent settle, or the page limit). */
|
|
83
|
+
pending: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* A persisted per-account meter. Every method is safe to call from several processes at once against one store:
|
|
87
|
+
* two reservations cannot both take the last unit, and a reservation settles exactly once.
|
|
88
|
+
*/
|
|
89
|
+
export interface ISpendMeter {
|
|
90
|
+
/** Reserves units for an operation, or refuses. Rejects with {@link SpendMeterUnavailableError} when the store cannot answer. */
|
|
91
|
+
reserve(req: SpendReserveRequest): Promise<SpendReserveResult>;
|
|
92
|
+
/** Settles an operation's reservation. Idempotent per operation and outcome. */
|
|
93
|
+
settle(req: SpendSettleRequest): Promise<SpendSettleResult>;
|
|
94
|
+
/** Pushes a live reservation's lease forward while its turn runs. */
|
|
95
|
+
heartbeat(operationId: string, now?: number): Promise<void>;
|
|
96
|
+
/** Settles the reservations whose lease ran out. */
|
|
97
|
+
reconcile(opts?: {
|
|
98
|
+
now?: number;
|
|
99
|
+
limit?: number;
|
|
100
|
+
}): Promise<SpendReconcileResult>;
|
|
101
|
+
/** The account's current period: its allowance, the units used and reserved, and what remains. */
|
|
102
|
+
snapshot(accountId: string, now?: number): Promise<SpendMeterSnapshot>;
|
|
103
|
+
/**
|
|
104
|
+
* Writes the current period's allowance at once after a plan change; the units used stay. A store that reads the
|
|
105
|
+
* product's allowance at every reservation takes the product's answer again at the next one.
|
|
106
|
+
*/
|
|
107
|
+
setAllowance(accountId: string, allowance: number, now?: number): Promise<void>;
|
|
108
|
+
}
|
|
109
|
+
/** Thrown when the meter's store cannot answer within its retry policy. A caller fails closed on it: no turn runs. */
|
|
110
|
+
export declare class SpendMeterUnavailableError extends Error {
|
|
111
|
+
readonly cause?: unknown | undefined;
|
|
112
|
+
readonly code = "SPEND_METER_UNAVAILABLE";
|
|
113
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
114
|
+
}
|
|
115
|
+
export interface SpendRetryPolicy {
|
|
116
|
+
/** Tries in all, the first included. */
|
|
117
|
+
attempts: number;
|
|
118
|
+
baseDelayMs: number;
|
|
119
|
+
maxDelayMs: number;
|
|
120
|
+
/** No new try starts after this many milliseconds from the first. */
|
|
121
|
+
deadlineMs: number;
|
|
122
|
+
}
|
|
123
|
+
export declare const DEFAULT_SPEND_RETRY_POLICY: SpendRetryPolicy;
|
|
124
|
+
/**
|
|
125
|
+
* Runs `fn`, trying again on an error `isTransient` accepts, with a doubling delay, until the tries or the deadline
|
|
126
|
+
* run out. Any failure that ends the loop is thrown as a {@link SpendMeterUnavailableError} carrying the last error.
|
|
127
|
+
*/
|
|
128
|
+
export declare function withBoundedRetry<T>(fn: () => Promise<T>, policy: SpendRetryPolicy, isTransient: (e: unknown) => boolean): Promise<T>;
|
|
129
|
+
/**
|
|
130
|
+
* The store errors worth a second try: Postgres serialization failures and deadlocks (40001, 40P01), its connection
|
|
131
|
+
* class (08xxx) and an administrator's shutdown (57P01); SQLite's busy and locked; and the network errors a pool
|
|
132
|
+
* reports when a connection drops.
|
|
133
|
+
*/
|
|
134
|
+
export declare function isTransientStorageError(e: unknown): boolean;
|
|
135
|
+
//# sourceMappingURL=SpendMeter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpendMeter.d.ts","sourceRoot":"","sources":["../../../src/safety/runtime/SpendMeter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The spend meter contract: a persisted, per-account allowance of turns (or any unit a product
|
|
3
|
+
* meters), reserved atomically before a turn reaches a model provider and settled when the turn ends.
|
|
4
|
+
*
|
|
5
|
+
* A reservation is keyed by the caller's durable `operationId`, so a request retried with the same id replays its
|
|
6
|
+
* reservation instead of charging twice. A reservation that is never settled (the process died mid-turn) carries a
|
|
7
|
+
* lease; {@link ISpendMeter.reconcile} settles the expired ones, asking the product what became of each.
|
|
8
|
+
*
|
|
9
|
+
* @module safety/runtime/SpendMeter
|
|
10
|
+
*/
|
|
11
|
+
/** Thrown when the meter's store cannot answer within its retry policy. A caller fails closed on it: no turn runs. */
|
|
12
|
+
export class SpendMeterUnavailableError extends Error {
|
|
13
|
+
constructor(message, cause) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.cause = cause;
|
|
16
|
+
this.code = 'SPEND_METER_UNAVAILABLE';
|
|
17
|
+
this.name = 'SpendMeterUnavailableError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export const DEFAULT_SPEND_RETRY_POLICY = { attempts: 3, baseDelayMs: 50, maxDelayMs: 400, deadlineMs: 2000 };
|
|
21
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
22
|
+
/**
|
|
23
|
+
* Runs `fn`, trying again on an error `isTransient` accepts, with a doubling delay, until the tries or the deadline
|
|
24
|
+
* run out. Any failure that ends the loop is thrown as a {@link SpendMeterUnavailableError} carrying the last error.
|
|
25
|
+
*/
|
|
26
|
+
export async function withBoundedRetry(fn, policy, isTransient) {
|
|
27
|
+
const started = Date.now();
|
|
28
|
+
let last;
|
|
29
|
+
for (let attempt = 1; attempt <= Math.max(1, policy.attempts); attempt += 1) {
|
|
30
|
+
try {
|
|
31
|
+
return await fn();
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
last = e;
|
|
35
|
+
if (!isTransient(e))
|
|
36
|
+
break;
|
|
37
|
+
const delay = Math.min(policy.maxDelayMs, policy.baseDelayMs * 2 ** (attempt - 1));
|
|
38
|
+
if (attempt === policy.attempts || Date.now() - started + delay > policy.deadlineMs)
|
|
39
|
+
break;
|
|
40
|
+
await sleep(delay);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const message = last instanceof Error ? last.message : String(last);
|
|
44
|
+
throw new SpendMeterUnavailableError(`the spend meter's store did not answer: ${message}`, last);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The store errors worth a second try: Postgres serialization failures and deadlocks (40001, 40P01), its connection
|
|
48
|
+
* class (08xxx) and an administrator's shutdown (57P01); SQLite's busy and locked; and the network errors a pool
|
|
49
|
+
* reports when a connection drops.
|
|
50
|
+
*/
|
|
51
|
+
export function isTransientStorageError(e) {
|
|
52
|
+
const err = e;
|
|
53
|
+
const code = typeof err?.code === 'string' ? err.code : '';
|
|
54
|
+
if (code === '40001' || code === '40P01' || code === '57P01' || code.startsWith('08'))
|
|
55
|
+
return true;
|
|
56
|
+
if (code === 'SQLITE_BUSY' || code === 'SQLITE_LOCKED' || code === 'ECONNRESET' || code === 'ECONNREFUSED' || code === 'ETIMEDOUT' || code === 'EPIPE')
|
|
57
|
+
return true;
|
|
58
|
+
const message = typeof err?.message === 'string' ? err.message : '';
|
|
59
|
+
return /database is locked|SQLITE_BUSY|Connection terminated|connection timeout/i.test(message);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=SpendMeter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpendMeter.js","sourceRoot":"","sources":["../../../src/safety/runtime/SpendMeter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8GH,sHAAsH;AACtH,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAEnD,YAAY,OAAe,EAAW,KAAe;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QADqB,UAAK,GAAL,KAAK,CAAU;QAD5C,SAAI,GAAG,yBAAyB,CAAC;QAGxC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAWD,MAAM,CAAC,MAAM,0BAA0B,GAAqB,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,IAAK,EAAE,CAAC;AAEjI,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEtF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAI,EAAoB,EAAE,MAAwB,EAAE,WAAoC;IAC5H,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,IAAI,IAAa,CAAC;IAClB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,GAAG,CAAC,CAAC;YACT,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBAAE,MAAM;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;YACnF,IAAI,OAAO,KAAK,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC,UAAU;gBAAE,MAAM;YAC3F,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,IAAI,0BAA0B,CAAC,2CAA2C,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;AACnG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,CAAU;IAChD,MAAM,GAAG,GAAG,CAAiD,CAAC;IAC9D,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnG,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACpK,MAAM,OAAO,GAAG,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,0EAA0E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClG,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview {@link ISpendMeter} over a `@framers/sql-storage-adapter` store: Postgres for a deployment, SQLite for
|
|
3
|
+
* a single process and the tests.
|
|
4
|
+
*
|
|
5
|
+
* Every write is a conditional statement inside one transaction, never a read followed by a write, so the store's
|
|
6
|
+
* own row locking decides a race: two reservations cannot both take the last unit, and a settle and a reconcile on
|
|
7
|
+
* one operation make one transition between them.
|
|
8
|
+
*
|
|
9
|
+
* Give the meter an adapter of its own (or the product's own pool), never AgentOS's provenance-wrapped storage
|
|
10
|
+
* adapter, whose write hooks can turn a `run()` into a no-op.
|
|
11
|
+
*
|
|
12
|
+
* @module safety/runtime/SqlSpendMeter
|
|
13
|
+
*/
|
|
14
|
+
import type { StorageAdapter } from '@framers/sql-storage-adapter';
|
|
15
|
+
import { type ISpendMeter, type SpendMeterSnapshot, type SpendReconcileResult, type SpendReserveRequest, type SpendReserveResult, type SpendRetryPolicy, type SpendSettleRequest, type SpendSettleResult } from './SpendMeter.js';
|
|
16
|
+
/**
|
|
17
|
+
* The meter's two tables. Every time is epoch milliseconds in a BIGINT. There is no literal question mark anywhere in
|
|
18
|
+
* the text: the Postgres adapter rewrites each one to a numbered parameter. A product that runs its own migrations
|
|
19
|
+
* copies this text into one of them and passes `ensureSchema: false`.
|
|
20
|
+
*/
|
|
21
|
+
export declare const SPEND_METER_DDL = "\nCREATE TABLE IF NOT EXISTS agentos_spend_meter (\n account_id TEXT NOT NULL,\n period TEXT NOT NULL,\n allowance BIGINT NOT NULL,\n used BIGINT NOT NULL DEFAULT 0,\n reserved BIGINT NOT NULL DEFAULT 0,\n updated_at BIGINT NOT NULL,\n PRIMARY KEY (account_id, period),\n CHECK (used >= 0 AND reserved >= 0)\n);\nCREATE TABLE IF NOT EXISTS agentos_spend_reservations (\n operation_id TEXT PRIMARY KEY,\n account_id TEXT NOT NULL,\n period TEXT NOT NULL,\n units BIGINT NOT NULL,\n state TEXT NOT NULL CHECK (state IN ('reserved', 'consumed', 'released')),\n outcome TEXT,\n attempts BIGINT NOT NULL DEFAULT 1,\n reserved_at BIGINT NOT NULL,\n expires_at BIGINT NOT NULL,\n settled_at BIGINT,\n usage_json TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_spend_reservations_due ON agentos_spend_reservations (state, expires_at);\n";
|
|
22
|
+
/** What became of an operation whose lease ran out, as the product knows it: its reply was stored, it was not, or it cannot tell. */
|
|
23
|
+
export type SpendUnknownResolution = 'consumed' | 'released' | 'unknown';
|
|
24
|
+
export interface SqlSpendMeterOptions {
|
|
25
|
+
db: StorageAdapter;
|
|
26
|
+
/** The account's allowance for a period, in units. Read at every reservation, so a plan change applies at the next turn. */
|
|
27
|
+
allowanceFor(accountId: string, period: string): number | Promise<number>;
|
|
28
|
+
/** The period a moment falls in for an account, e.g. its calendar month in its own time zone ("2026-10"). */
|
|
29
|
+
periodOf(now: number, accountId: string): string | Promise<string>;
|
|
30
|
+
/** How long a reservation lives without a heartbeat. Default 45 seconds. */
|
|
31
|
+
leaseMs?: number;
|
|
32
|
+
/** Reservations an operation may take in all, its retries after a release included. Default 3. */
|
|
33
|
+
maxAttemptsPerOperation?: number;
|
|
34
|
+
retry?: SpendRetryPolicy;
|
|
35
|
+
/** Asked by {@link SqlSpendMeter.reconcile} for each expired reservation. */
|
|
36
|
+
resolveUnknown?(reservation: {
|
|
37
|
+
operationId: string;
|
|
38
|
+
accountId: string;
|
|
39
|
+
period: string;
|
|
40
|
+
units: number;
|
|
41
|
+
}): SpendUnknownResolution | Promise<SpendUnknownResolution>;
|
|
42
|
+
/** How an expired reservation settles when the product cannot tell. Default `release`: the person is not charged for a turn nobody saw finish. */
|
|
43
|
+
unknownAfterLease?: 'release' | 'consume';
|
|
44
|
+
/**
|
|
45
|
+
* Refuse a store that several processes cannot share (no transactions, no persistence or no concurrent access): a
|
|
46
|
+
* SQLite file per process would give every instance an allowance of its own. Default true; tests pass false.
|
|
47
|
+
*/
|
|
48
|
+
requireShared?: boolean;
|
|
49
|
+
/** Create the tables when they are missing. Default true. */
|
|
50
|
+
ensureSchema?: boolean;
|
|
51
|
+
}
|
|
52
|
+
export declare class SqlSpendMeter implements ISpendMeter {
|
|
53
|
+
private readonly opts;
|
|
54
|
+
private readonly db;
|
|
55
|
+
private readonly leaseMs;
|
|
56
|
+
private readonly maxAttempts;
|
|
57
|
+
private readonly retry;
|
|
58
|
+
private schemaReady;
|
|
59
|
+
private reconciler;
|
|
60
|
+
constructor(opts: SqlSpendMeterOptions);
|
|
61
|
+
/** Creates the tables unless they answer a read already. Called before the first statement; safe to call again. */
|
|
62
|
+
ensureSchema(): Promise<void>;
|
|
63
|
+
private run;
|
|
64
|
+
reserve(req: SpendReserveRequest): Promise<SpendReserveResult>;
|
|
65
|
+
private remainingIn;
|
|
66
|
+
settle(req: SpendSettleRequest): Promise<SpendSettleResult>;
|
|
67
|
+
heartbeat(operationId: string, now?: number): Promise<void>;
|
|
68
|
+
reconcile(opts?: {
|
|
69
|
+
now?: number;
|
|
70
|
+
limit?: number;
|
|
71
|
+
}): Promise<SpendReconcileResult>;
|
|
72
|
+
snapshot(accountId: string, now?: number): Promise<SpendMeterSnapshot>;
|
|
73
|
+
setAllowance(accountId: string, allowance: number, now?: number): Promise<void>;
|
|
74
|
+
/** Runs {@link reconcile} every interval until {@link stopReconciler}. A failed pass is retried on the next tick. */
|
|
75
|
+
startReconciler(intervalMs?: number, onError?: (e: unknown) => void): void;
|
|
76
|
+
stopReconciler(): void;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=SqlSpendMeter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqlSpendMeter.d.ts","sourceRoot":"","sources":["../../../src/safety/runtime/SqlSpendMeter.ts"],"names":[],"mappings":"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"}
|