@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.
Files changed (109) hide show
  1. package/README.md +11 -11
  2. package/dist/api/AgentOS.d.ts +15 -0
  3. package/dist/api/AgentOS.d.ts.map +1 -1
  4. package/dist/api/AgentOS.js +82 -0
  5. package/dist/api/AgentOS.js.map +1 -1
  6. package/dist/api/agent.d.ts +7 -3
  7. package/dist/api/agent.d.ts.map +1 -1
  8. package/dist/api/agent.js.map +1 -1
  9. package/dist/api/embedText.d.ts.map +1 -1
  10. package/dist/api/embedText.js +1 -8
  11. package/dist/api/embedText.js.map +1 -1
  12. package/dist/api/gmi.d.ts.map +1 -1
  13. package/dist/api/gmi.js +38 -19
  14. package/dist/api/gmi.js.map +1 -1
  15. package/dist/api/runtime/AgentOSOrchestrator.d.ts.map +1 -1
  16. package/dist/api/runtime/AgentOSOrchestrator.js +23 -0
  17. package/dist/api/runtime/AgentOSOrchestrator.js.map +1 -1
  18. package/dist/api/runtime/agentCognitiveMemory.d.ts +12 -9
  19. package/dist/api/runtime/agentCognitiveMemory.d.ts.map +1 -1
  20. package/dist/api/runtime/agentCognitiveMemory.js +53 -17
  21. package/dist/api/runtime/agentCognitiveMemory.js.map +1 -1
  22. package/dist/api/runtime/completionGateway.d.ts.map +1 -1
  23. package/dist/api/runtime/completionGateway.js +7 -0
  24. package/dist/api/runtime/completionGateway.js.map +1 -1
  25. package/dist/api/runtime/gmiResults.d.ts +63 -6
  26. package/dist/api/runtime/gmiResults.d.ts.map +1 -1
  27. package/dist/api/runtime/gmiResults.js +83 -13
  28. package/dist/api/runtime/gmiResults.js.map +1 -1
  29. package/dist/api/runtime/gmiSession.d.ts +31 -6
  30. package/dist/api/runtime/gmiSession.d.ts.map +1 -1
  31. package/dist/api/runtime/gmiSession.js +144 -44
  32. package/dist/api/runtime/gmiSession.js.map +1 -1
  33. package/dist/api/runtime/gmiTranscript.d.ts +7 -6
  34. package/dist/api/runtime/gmiTranscript.d.ts.map +1 -1
  35. package/dist/api/runtime/gmiTranscript.js +6 -5
  36. package/dist/api/runtime/gmiTranscript.js.map +1 -1
  37. package/dist/api/runtime/provider-defaults.d.ts +9 -0
  38. package/dist/api/runtime/provider-defaults.d.ts.map +1 -1
  39. package/dist/api/runtime/provider-defaults.js +9 -0
  40. package/dist/api/runtime/provider-defaults.js.map +1 -1
  41. package/dist/api/types/AgentOSInput.d.ts +5 -0
  42. package/dist/api/types/AgentOSInput.d.ts.map +1 -1
  43. package/dist/api/types/OrchestratorConfig.d.ts +3 -0
  44. package/dist/api/types/OrchestratorConfig.d.ts.map +1 -1
  45. package/dist/cognition/emergent/executor/QuickJSExecutor.d.ts +8 -0
  46. package/dist/cognition/emergent/executor/QuickJSExecutor.d.ts.map +1 -1
  47. package/dist/cognition/emergent/executor/QuickJSExecutor.js +193 -36
  48. package/dist/cognition/emergent/executor/QuickJSExecutor.js.map +1 -1
  49. package/dist/cognition/emergent/executor/guest-prelude.d.ts +4 -0
  50. package/dist/cognition/emergent/executor/guest-prelude.d.ts.map +1 -1
  51. package/dist/cognition/emergent/executor/guest-prelude.js +21 -1
  52. package/dist/cognition/emergent/executor/guest-prelude.js.map +1 -1
  53. package/dist/cognition/emergent/executor/guest-surface.d.ts.map +1 -1
  54. package/dist/cognition/emergent/executor/guest-surface.js +7 -2
  55. package/dist/cognition/emergent/executor/guest-surface.js.map +1 -1
  56. package/dist/cognition/memory/CognitiveMemoryManager.d.ts +28 -21
  57. package/dist/cognition/memory/CognitiveMemoryManager.d.ts.map +1 -1
  58. package/dist/cognition/memory/CognitiveMemoryManager.js +76 -26
  59. package/dist/cognition/memory/CognitiveMemoryManager.js.map +1 -1
  60. package/dist/cognition/memory/retrieval/store/MemoryStore.d.ts +10 -2
  61. package/dist/cognition/memory/retrieval/store/MemoryStore.d.ts.map +1 -1
  62. package/dist/cognition/memory/retrieval/store/MemoryStore.js +11 -2
  63. package/dist/cognition/memory/retrieval/store/MemoryStore.js.map +1 -1
  64. package/dist/cognition/substrate/ConversationHistoryManager.d.ts +3 -1
  65. package/dist/cognition/substrate/ConversationHistoryManager.d.ts.map +1 -1
  66. package/dist/cognition/substrate/ConversationHistoryManager.js +9 -2
  67. package/dist/cognition/substrate/ConversationHistoryManager.js.map +1 -1
  68. package/dist/cognition/substrate/GMI.d.ts +33 -2
  69. package/dist/cognition/substrate/GMI.d.ts.map +1 -1
  70. package/dist/cognition/substrate/GMI.js +225 -71
  71. package/dist/cognition/substrate/GMI.js.map +1 -1
  72. package/dist/cognition/substrate/IGMI.d.ts +14 -3
  73. package/dist/cognition/substrate/IGMI.d.ts.map +1 -1
  74. package/dist/cognition/substrate/IGMI.js +2 -1
  75. package/dist/cognition/substrate/IGMI.js.map +1 -1
  76. package/dist/cognition/substrate/SentimentTracker.d.ts +8 -0
  77. package/dist/cognition/substrate/SentimentTracker.d.ts.map +1 -1
  78. package/dist/cognition/substrate/SentimentTracker.js +20 -0
  79. package/dist/cognition/substrate/SentimentTracker.js.map +1 -1
  80. package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts.map +1 -1
  81. package/dist/core/llm/providers/implementations/OpenAIProvider.js +23 -4
  82. package/dist/core/llm/providers/implementations/OpenAIProvider.js.map +1 -1
  83. package/dist/core/utils/errors.d.ts +4 -0
  84. package/dist/core/utils/errors.d.ts.map +1 -1
  85. package/dist/core/utils/errors.js +8 -0
  86. package/dist/core/utils/errors.js.map +1 -1
  87. package/dist/extensions/ExtensionRegistry.d.ts.map +1 -1
  88. package/dist/extensions/ExtensionRegistry.js +4 -1
  89. package/dist/extensions/ExtensionRegistry.js.map +1 -1
  90. package/dist/io/speech/SpeechRuntime.d.ts.map +1 -1
  91. package/dist/io/speech/SpeechRuntime.js +5 -0
  92. package/dist/io/speech/SpeechRuntime.js.map +1 -1
  93. package/dist/io/speech/providers/MiniMaxTextToSpeechProvider.d.ts +34 -3
  94. package/dist/io/speech/providers/MiniMaxTextToSpeechProvider.d.ts.map +1 -1
  95. package/dist/io/speech/providers/MiniMaxTextToSpeechProvider.js +120 -11
  96. package/dist/io/speech/providers/MiniMaxTextToSpeechProvider.js.map +1 -1
  97. package/dist/safety/runtime/SpendMeter.d.ts +135 -0
  98. package/dist/safety/runtime/SpendMeter.d.ts.map +1 -0
  99. package/dist/safety/runtime/SpendMeter.js +61 -0
  100. package/dist/safety/runtime/SpendMeter.js.map +1 -0
  101. package/dist/safety/runtime/SqlSpendMeter.d.ts +78 -0
  102. package/dist/safety/runtime/SqlSpendMeter.d.ts.map +1 -0
  103. package/dist/safety/runtime/SqlSpendMeter.js +268 -0
  104. package/dist/safety/runtime/SqlSpendMeter.js.map +1 -0
  105. package/dist/safety/runtime/index.d.ts +4 -0
  106. package/dist/safety/runtime/index.d.ts.map +1 -1
  107. package/dist/safety/runtime/index.js +2 -0
  108. package/dist/safety/runtime/index.js.map +1 -1
  109. 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
- ? Buffer.from(await (await this.fetchImpl(audio)).arrayBuffer())
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
- return this.request("/v1/query/t2a_async_query_v2", { task_id: taskId });
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 response = await this.fetchImpl(`${baseUrl}${path}`, {
166
- method: "POST",
167
- headers: {
168
- Authorization: `Bearer ${this.keyPool.next()}`,
169
- "Content-Type": "application/json",
170
- },
171
- body: JSON.stringify(body),
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.json());
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":"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"}
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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"}