@framers/agentos 0.12.23 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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/gmi.d.ts.map +1 -1
- package/dist/api/gmi.js +14 -0
- 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/gmiSession.d.ts +14 -4
- package/dist/api/runtime/gmiSession.d.ts.map +1 -1
- package/dist/api/runtime/gmiSession.js +113 -38
- 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/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/core/llm/providers/implementations/RequestyProvider.d.ts +8 -0
- package/dist/core/llm/providers/implementations/RequestyProvider.d.ts.map +1 -1
- package/dist/core/llm/providers/implementations/RequestyProvider.js +54 -15
- package/dist/core/llm/providers/implementations/RequestyProvider.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/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
|
@@ -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":"AAAA;;;;;;;;;GASG;AAEH,mHAAmH;AACnH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEhE,6GAA6G;AAC7G,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEzE,qCAAqC;AACrC,MAAM,MAAM,eAAe;AACzB,8DAA8D;AAC5D,qBAAqB;AACvB,mGAAmG;GACjG,WAAW;AACb,yEAAyE;GACvE,kBAAkB;AACpB,gFAAgF;GAC9E,mBAAmB,CAAC;AAExB,0DAA0D;AAC1D,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,kGAAkG;IAClG,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,kBAAkB,GAC1B;IACE,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEN,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,oGAAoG;IACpG,MAAM,EAAE,SAAS,GAAG,iBAAiB,GAAG,WAAW,CAAC;IACpD,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,iIAAiI;IACjI,OAAO,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/D,gFAAgF;IAChF,MAAM,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5D,qEAAqE;IACrE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,oDAAoD;IACpD,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClF,kGAAkG;IAClG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvE;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAED,sHAAsH;AACtH,qBAAa,0BAA2B,SAAQ,KAAK;IAEtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;IADrD,QAAQ,CAAC,IAAI,6BAA6B;gBAC9B,OAAO,EAAE,MAAM,EAAW,KAAK,CAAC,EAAE,OAAO,YAAA;CAItD;AAED,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,0BAA0B,EAAE,gBAAuF,CAAC;AAIjI;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAgB1I;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAO3D"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { DEFAULT_SPEND_RETRY_POLICY, isTransientStorageError, SpendMeterUnavailableError, withBoundedRetry, } from './SpendMeter.js';
|
|
2
|
+
/**
|
|
3
|
+
* The meter's two tables. Every time is epoch milliseconds in a BIGINT. There is no literal question mark anywhere in
|
|
4
|
+
* the text: the Postgres adapter rewrites each one to a numbered parameter. A product that runs its own migrations
|
|
5
|
+
* copies this text into one of them and passes `ensureSchema: false`.
|
|
6
|
+
*/
|
|
7
|
+
export const SPEND_METER_DDL = `
|
|
8
|
+
CREATE TABLE IF NOT EXISTS agentos_spend_meter (
|
|
9
|
+
account_id TEXT NOT NULL,
|
|
10
|
+
period TEXT NOT NULL,
|
|
11
|
+
allowance BIGINT NOT NULL,
|
|
12
|
+
used BIGINT NOT NULL DEFAULT 0,
|
|
13
|
+
reserved BIGINT NOT NULL DEFAULT 0,
|
|
14
|
+
updated_at BIGINT NOT NULL,
|
|
15
|
+
PRIMARY KEY (account_id, period),
|
|
16
|
+
CHECK (used >= 0 AND reserved >= 0)
|
|
17
|
+
);
|
|
18
|
+
CREATE TABLE IF NOT EXISTS agentos_spend_reservations (
|
|
19
|
+
operation_id TEXT PRIMARY KEY,
|
|
20
|
+
account_id TEXT NOT NULL,
|
|
21
|
+
period TEXT NOT NULL,
|
|
22
|
+
units BIGINT NOT NULL,
|
|
23
|
+
state TEXT NOT NULL CHECK (state IN ('reserved', 'consumed', 'released')),
|
|
24
|
+
outcome TEXT,
|
|
25
|
+
attempts BIGINT NOT NULL DEFAULT 1,
|
|
26
|
+
reserved_at BIGINT NOT NULL,
|
|
27
|
+
expires_at BIGINT NOT NULL,
|
|
28
|
+
settled_at BIGINT,
|
|
29
|
+
usage_json TEXT
|
|
30
|
+
);
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_spend_reservations_due ON agentos_spend_reservations (state, expires_at);
|
|
32
|
+
`;
|
|
33
|
+
/** Rolls a reservation's transaction back when the allowance has no room; caught inside the same try, never retried. */
|
|
34
|
+
class AllowanceExhausted extends Error {
|
|
35
|
+
constructor(remaining) {
|
|
36
|
+
super('allowance_exhausted');
|
|
37
|
+
this.remaining = remaining;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const num = (v) => (typeof v === 'number' ? v : Number(v ?? 0));
|
|
41
|
+
export class SqlSpendMeter {
|
|
42
|
+
constructor(opts) {
|
|
43
|
+
this.opts = opts;
|
|
44
|
+
this.schemaReady = null;
|
|
45
|
+
this.reconciler = null;
|
|
46
|
+
const caps = opts.db.capabilities;
|
|
47
|
+
if (opts.requireShared !== false && !(caps.has('transactions') && caps.has('persistence') && caps.has('concurrent'))) {
|
|
48
|
+
throw new Error(`SqlSpendMeter needs a store several processes share (transactions, persistence and concurrent access); "${opts.db.kind}" lacks one. Pass requireShared: false for a single process.`);
|
|
49
|
+
}
|
|
50
|
+
if (!caps.has('transactions'))
|
|
51
|
+
throw new Error(`SqlSpendMeter needs a store with transactions; "${opts.db.kind}" has none.`);
|
|
52
|
+
this.db = opts.db;
|
|
53
|
+
this.leaseMs = opts.leaseMs ?? 45000;
|
|
54
|
+
this.maxAttempts = opts.maxAttemptsPerOperation ?? 3;
|
|
55
|
+
this.retry = opts.retry ?? DEFAULT_SPEND_RETRY_POLICY;
|
|
56
|
+
}
|
|
57
|
+
/** Creates the tables unless they answer a read already. Called before the first statement; safe to call again. */
|
|
58
|
+
ensureSchema() {
|
|
59
|
+
if (this.opts.ensureSchema === false)
|
|
60
|
+
return Promise.resolve();
|
|
61
|
+
this.schemaReady ?? (this.schemaReady = (async () => {
|
|
62
|
+
try {
|
|
63
|
+
await this.db.get('SELECT 1 FROM agentos_spend_meter LIMIT 1');
|
|
64
|
+
await this.db.get('SELECT 1 FROM agentos_spend_reservations LIMIT 1');
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
await this.db.exec(SPEND_METER_DDL);
|
|
68
|
+
}
|
|
69
|
+
})().catch((e) => {
|
|
70
|
+
this.schemaReady = null;
|
|
71
|
+
throw e;
|
|
72
|
+
}));
|
|
73
|
+
return this.schemaReady;
|
|
74
|
+
}
|
|
75
|
+
run(fn) {
|
|
76
|
+
return withBoundedRetry(async () => {
|
|
77
|
+
await this.ensureSchema();
|
|
78
|
+
return fn();
|
|
79
|
+
}, this.retry, isTransientStorageError);
|
|
80
|
+
}
|
|
81
|
+
async reserve(req) {
|
|
82
|
+
const now = req.now ?? Date.now();
|
|
83
|
+
const units = Math.max(1, Math.trunc(req.units ?? 1));
|
|
84
|
+
let period;
|
|
85
|
+
let allowance;
|
|
86
|
+
try {
|
|
87
|
+
period = await this.opts.periodOf(now, req.accountId);
|
|
88
|
+
allowance = Math.max(0, Math.trunc(await this.opts.allowanceFor(req.accountId, period)));
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
throw new SpendMeterUnavailableError(`the allowance could not be read: ${e instanceof Error ? e.message : String(e)}`, e);
|
|
92
|
+
}
|
|
93
|
+
const base = { operationId: req.operationId, accountId: req.accountId, period };
|
|
94
|
+
const expiresAt = now + this.leaseMs;
|
|
95
|
+
return this.run(async () => {
|
|
96
|
+
try {
|
|
97
|
+
return await this.db.transaction(async (trx) => {
|
|
98
|
+
// (a) the reservation row: new, or a retry of one that was released
|
|
99
|
+
const inserted = await trx.run(`INSERT INTO agentos_spend_reservations (operation_id, account_id, period, units, state, attempts, reserved_at, expires_at)
|
|
100
|
+
VALUES (?, ?, ?, ?, 'reserved', 1, ?, ?) ON CONFLICT (operation_id) DO NOTHING`, [req.operationId, req.accountId, period, units, now, expiresAt]);
|
|
101
|
+
let attempt = 1;
|
|
102
|
+
if (!inserted.changes) {
|
|
103
|
+
const retried = await trx.run(`UPDATE agentos_spend_reservations
|
|
104
|
+
SET state = 'reserved', attempts = attempts + 1, account_id = ?, period = ?, units = ?, reserved_at = ?, expires_at = ?,
|
|
105
|
+
outcome = NULL, settled_at = NULL, usage_json = NULL
|
|
106
|
+
WHERE operation_id = ? AND state = 'released' AND attempts < ?`, [req.accountId, period, units, now, expiresAt, req.operationId, this.maxAttempts]);
|
|
107
|
+
const row = await trx.get('SELECT state, attempts FROM agentos_spend_reservations WHERE operation_id = ?', [req.operationId]);
|
|
108
|
+
if (!retried.changes) {
|
|
109
|
+
const reason = row?.state === 'reserved' ? 'in_flight' : row?.state === 'consumed' ? 'already_consumed' : 'retries_exhausted';
|
|
110
|
+
return { status: 'denied', reason, ...base, remaining: await this.remainingIn(trx, req.accountId, period, allowance) };
|
|
111
|
+
}
|
|
112
|
+
attempt = num(row?.attempts);
|
|
113
|
+
}
|
|
114
|
+
// (b) the period's row, with the allowance in force today
|
|
115
|
+
await trx.run(`INSERT INTO agentos_spend_meter (account_id, period, allowance, used, reserved, updated_at) VALUES (?, ?, ?, 0, 0, ?)
|
|
116
|
+
ON CONFLICT (account_id, period) DO UPDATE SET allowance = excluded.allowance`, [req.accountId, period, allowance, now]);
|
|
117
|
+
// (c) the units taken only where they fit: the row lock makes concurrent reservations queue here
|
|
118
|
+
const taken = await trx.run(`UPDATE agentos_spend_meter SET reserved = reserved + ?, updated_at = ?
|
|
119
|
+
WHERE account_id = ? AND period = ? AND used + reserved + ? <= allowance`, [units, now, req.accountId, period, units]);
|
|
120
|
+
if (!taken.changes)
|
|
121
|
+
throw new AllowanceExhausted(await this.remainingIn(trx, req.accountId, period, allowance));
|
|
122
|
+
return { status: 'reserved', ...base, units, attempt, remaining: await this.remainingIn(trx, req.accountId, period, allowance), expiresAt };
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
// the transaction rolled (a) and (b) back; the refusal is an answer, not a failure
|
|
127
|
+
if (e instanceof AllowanceExhausted)
|
|
128
|
+
return { status: 'denied', reason: 'allowance_exhausted', ...base, remaining: e.remaining };
|
|
129
|
+
throw e;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async remainingIn(trx, accountId, period, fallbackAllowance) {
|
|
134
|
+
const m = await trx.get('SELECT allowance, used, reserved FROM agentos_spend_meter WHERE account_id = ? AND period = ?', [accountId, period]);
|
|
135
|
+
if (!m)
|
|
136
|
+
return fallbackAllowance;
|
|
137
|
+
return Math.max(0, num(m.allowance) - num(m.used) - num(m.reserved));
|
|
138
|
+
}
|
|
139
|
+
async settle(req) {
|
|
140
|
+
const now = req.now ?? Date.now();
|
|
141
|
+
return this.run(() => this.db.transaction(async (trx) => {
|
|
142
|
+
const row = await trx.get('SELECT operation_id, account_id, period, units, state FROM agentos_spend_reservations WHERE operation_id = ?', [req.operationId]);
|
|
143
|
+
if (!row)
|
|
144
|
+
return { status: 'not_found' };
|
|
145
|
+
const move = transition(row.state, req.outcome);
|
|
146
|
+
if (!move)
|
|
147
|
+
return { status: 'already_settled', state: row.state };
|
|
148
|
+
// the move only from the state just read: a concurrent settle that got there first leaves nothing to change
|
|
149
|
+
const changed = await trx.run(`UPDATE agentos_spend_reservations SET state = ?, outcome = ?, settled_at = ?, usage_json = ? WHERE operation_id = ? AND state = ?`, [move.to, req.outcome, now, req.usage ? JSON.stringify(req.usage) : null, req.operationId, row.state]);
|
|
150
|
+
if (!changed.changes) {
|
|
151
|
+
const current = await trx.get('SELECT state FROM agentos_spend_reservations WHERE operation_id = ?', [req.operationId]);
|
|
152
|
+
return { status: 'already_settled', state: current?.state };
|
|
153
|
+
}
|
|
154
|
+
const units = num(row.units);
|
|
155
|
+
const sets = [];
|
|
156
|
+
const params = [];
|
|
157
|
+
if (move.reserved) {
|
|
158
|
+
sets.push('reserved = CASE WHEN reserved >= ? THEN reserved - ? ELSE 0 END');
|
|
159
|
+
params.push(units, units);
|
|
160
|
+
}
|
|
161
|
+
if (move.used > 0) {
|
|
162
|
+
sets.push('used = used + ?');
|
|
163
|
+
params.push(units);
|
|
164
|
+
}
|
|
165
|
+
else if (move.used < 0) {
|
|
166
|
+
sets.push('used = CASE WHEN used >= ? THEN used - ? ELSE 0 END');
|
|
167
|
+
params.push(units, units);
|
|
168
|
+
}
|
|
169
|
+
sets.push('updated_at = ?');
|
|
170
|
+
params.push(now, row.account_id, row.period);
|
|
171
|
+
await trx.run(`UPDATE agentos_spend_meter SET ${sets.join(', ')} WHERE account_id = ? AND period = ?`, params);
|
|
172
|
+
return { status: 'settled', state: move.to };
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
async heartbeat(operationId, now = Date.now()) {
|
|
176
|
+
// every write goes through a transaction: on a single-connection SQLite store that is what keeps it out of another's
|
|
177
|
+
await this.run(() => this.db.transaction((trx) => trx.run(`UPDATE agentos_spend_reservations SET expires_at = ? WHERE operation_id = ? AND state = 'reserved' AND expires_at < ?`, [
|
|
178
|
+
now + this.leaseMs,
|
|
179
|
+
operationId,
|
|
180
|
+
now + this.leaseMs,
|
|
181
|
+
])));
|
|
182
|
+
}
|
|
183
|
+
async reconcile(opts = {}) {
|
|
184
|
+
const now = opts.now ?? Date.now();
|
|
185
|
+
const limit = Math.max(1, Math.trunc(opts.limit ?? 100));
|
|
186
|
+
const due = await this.run(() => this.db.all(`SELECT operation_id, account_id, period, units, state FROM agentos_spend_reservations WHERE state = 'reserved' AND expires_at <= ? ORDER BY expires_at LIMIT ${limit}`, [now]));
|
|
187
|
+
const out = { consumed: 0, released: 0, pending: 0 };
|
|
188
|
+
for (const r of due) {
|
|
189
|
+
let resolution = 'unknown';
|
|
190
|
+
try {
|
|
191
|
+
if (this.opts.resolveUnknown) {
|
|
192
|
+
resolution = await this.opts.resolveUnknown({ operationId: r.operation_id, accountId: r.account_id, period: r.period, units: num(r.units) });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
resolution = 'unknown';
|
|
197
|
+
}
|
|
198
|
+
const outcome = resolution === 'consumed' ? 'consumed' : resolution === 'released' ? 'released' : this.opts.unknownAfterLease === 'consume' ? 'consumed' : 'released';
|
|
199
|
+
const settled = await this.settle({ operationId: r.operation_id, outcome, now });
|
|
200
|
+
if (settled.status !== 'settled')
|
|
201
|
+
out.pending += settled.state === 'reserved' ? 1 : 0;
|
|
202
|
+
else if (outcome === 'consumed')
|
|
203
|
+
out.consumed += 1;
|
|
204
|
+
else
|
|
205
|
+
out.released += 1;
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
async snapshot(accountId, now = Date.now()) {
|
|
210
|
+
let period;
|
|
211
|
+
let allowance;
|
|
212
|
+
try {
|
|
213
|
+
period = await this.opts.periodOf(now, accountId);
|
|
214
|
+
allowance = Math.max(0, Math.trunc(await this.opts.allowanceFor(accountId, period)));
|
|
215
|
+
}
|
|
216
|
+
catch (e) {
|
|
217
|
+
throw new SpendMeterUnavailableError(`the allowance could not be read: ${e instanceof Error ? e.message : String(e)}`, e);
|
|
218
|
+
}
|
|
219
|
+
const m = await this.run(() => this.db.get('SELECT allowance, used, reserved FROM agentos_spend_meter WHERE account_id = ? AND period = ?', [
|
|
220
|
+
accountId,
|
|
221
|
+
period,
|
|
222
|
+
]));
|
|
223
|
+
// what is enforced now: the period's stored allowance once the period has a row, else the product's answer
|
|
224
|
+
const enforced = m ? num(m.allowance) : allowance;
|
|
225
|
+
const used = num(m?.used);
|
|
226
|
+
const reserved = num(m?.reserved);
|
|
227
|
+
return { accountId, period, allowance: enforced, used, reserved, remaining: Math.max(0, enforced - used - reserved) };
|
|
228
|
+
}
|
|
229
|
+
async setAllowance(accountId, allowance, now = Date.now()) {
|
|
230
|
+
const value = Math.max(0, Math.trunc(allowance));
|
|
231
|
+
let period;
|
|
232
|
+
try {
|
|
233
|
+
period = await this.opts.periodOf(now, accountId);
|
|
234
|
+
}
|
|
235
|
+
catch (e) {
|
|
236
|
+
throw new SpendMeterUnavailableError(`the period could not be read: ${e instanceof Error ? e.message : String(e)}`, e);
|
|
237
|
+
}
|
|
238
|
+
await this.run(() => this.db.transaction((trx) => trx.run(`INSERT INTO agentos_spend_meter (account_id, period, allowance, used, reserved, updated_at) VALUES (?, ?, ?, 0, 0, ?)
|
|
239
|
+
ON CONFLICT (account_id, period) DO UPDATE SET allowance = excluded.allowance, updated_at = excluded.updated_at`, [accountId, period, value, now])));
|
|
240
|
+
}
|
|
241
|
+
/** Runs {@link reconcile} every interval until {@link stopReconciler}. A failed pass is retried on the next tick. */
|
|
242
|
+
startReconciler(intervalMs = 15000, onError) {
|
|
243
|
+
if (this.reconciler)
|
|
244
|
+
return;
|
|
245
|
+
this.reconciler = setInterval(() => {
|
|
246
|
+
this.reconcile().catch((e) => onError?.(e));
|
|
247
|
+
}, intervalMs);
|
|
248
|
+
this.reconciler.unref?.();
|
|
249
|
+
}
|
|
250
|
+
stopReconciler() {
|
|
251
|
+
if (this.reconciler)
|
|
252
|
+
clearInterval(this.reconciler);
|
|
253
|
+
this.reconciler = null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/** Where an outcome moves a reservation from its state, and what it does to the period's counters; null when it moves nothing. */
|
|
257
|
+
function transition(from, outcome) {
|
|
258
|
+
if (from === 'reserved') {
|
|
259
|
+
if (outcome === 'consumed')
|
|
260
|
+
return { to: 'consumed', reserved: true, used: 1 };
|
|
261
|
+
return { to: 'released', reserved: true, used: 0 };
|
|
262
|
+
}
|
|
263
|
+
// a reply replaced after its turn counted is refunded
|
|
264
|
+
if (from === 'consumed' && outcome === 'replaced')
|
|
265
|
+
return { to: 'released', reserved: false, used: -1 };
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=SqlSpendMeter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqlSpendMeter.js","sourceRoot":"","sources":["../../../src/safety/runtime/SqlSpendMeter.ts"],"names":[],"mappings":"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"}
|