@agentguard-run/spend 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/PATENTS.md +37 -0
  2. package/dist/adapters/postgres-store.d.ts +8 -2
  3. package/dist/adapters/postgres-store.d.ts.map +1 -1
  4. package/dist/adapters/postgres-store.js +58 -6
  5. package/dist/adapters/postgres-store.js.map +1 -1
  6. package/dist/adapters/redis-store.d.ts +10 -2
  7. package/dist/adapters/redis-store.d.ts.map +1 -1
  8. package/dist/adapters/redis-store.js +90 -24
  9. package/dist/adapters/redis-store.js.map +1 -1
  10. package/dist/cli/demo.d.ts +2 -2
  11. package/dist/cli/demo.js +4 -4
  12. package/dist/cli/demo.js.map +1 -1
  13. package/dist/cli/doctor.d.ts +1 -1
  14. package/dist/cli/doctor.js +2 -2
  15. package/dist/cli/doctor.js.map +1 -1
  16. package/dist/cli/explain.d.ts +1 -1
  17. package/dist/cli/explain.js +1 -1
  18. package/dist/cli/init.d.ts +1 -1
  19. package/dist/cli/init.js +1 -1
  20. package/dist/cli/main.d.ts.map +1 -1
  21. package/dist/cli/main.js +7 -1
  22. package/dist/cli/main.js.map +1 -1
  23. package/dist/cli/serve.d.ts +1 -1
  24. package/dist/cli/serve.d.ts.map +1 -1
  25. package/dist/cli/serve.js +19 -14
  26. package/dist/cli/serve.js.map +1 -1
  27. package/dist/cli/telemetry.d.ts +2 -0
  28. package/dist/cli/telemetry.d.ts.map +1 -0
  29. package/dist/cli/telemetry.js +37 -0
  30. package/dist/cli/telemetry.js.map +1 -0
  31. package/dist/cli/verify.d.ts +2 -2
  32. package/dist/cli/verify.d.ts.map +1 -1
  33. package/dist/cli/verify.js +53 -36
  34. package/dist/cli/verify.js.map +1 -1
  35. package/dist/cost-table.d.ts +2 -2
  36. package/dist/cost-table.d.ts.map +1 -1
  37. package/dist/cost-table.js +23 -3
  38. package/dist/cost-table.js.map +1 -1
  39. package/dist/decision-log.d.ts +5 -4
  40. package/dist/decision-log.d.ts.map +1 -1
  41. package/dist/decision-log.js +40 -15
  42. package/dist/decision-log.js.map +1 -1
  43. package/dist/i18n.js +3 -3
  44. package/dist/i18n.js.map +1 -1
  45. package/dist/index.d.ts +5 -4
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +13 -6
  48. package/dist/index.js.map +1 -1
  49. package/dist/policy.d.ts +8 -21
  50. package/dist/policy.d.ts.map +1 -1
  51. package/dist/policy.js +226 -109
  52. package/dist/policy.js.map +1 -1
  53. package/dist/spend-guard.d.ts +6 -2
  54. package/dist/spend-guard.d.ts.map +1 -1
  55. package/dist/spend-guard.js +95 -26
  56. package/dist/spend-guard.js.map +1 -1
  57. package/dist/store-memory.d.ts +8 -2
  58. package/dist/store-memory.d.ts.map +1 -1
  59. package/dist/store-memory.js +34 -2
  60. package/dist/store-memory.js.map +1 -1
  61. package/dist/telemetry.d.ts +11 -0
  62. package/dist/telemetry.d.ts.map +1 -0
  63. package/dist/telemetry.js +149 -0
  64. package/dist/telemetry.js.map +1 -0
  65. package/dist/types.d.ts +23 -4
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/types.js +2 -2
  68. package/package.json +22 -8
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * AgentGuard(TM) Spend Core SDK entry point
3
+ * AgentGuard(TM) Spend: Core SDK entry point
4
4
  *
5
5
  * `withSpendGuard()` wraps a provider SDK client (OpenAI, Anthropic, Bedrock)
6
6
  * and enforces a SpendPolicy locally before each call is sent to the provider.
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * Patent notice: Protected by U.S. patent-pending technology
15
15
  * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
16
- * and an additional application filed May 2026).
16
+ * 64/071,781; 64/071,789).
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.AgentGuardBlockedError = exports.SpendGuard = void 0;
@@ -24,16 +24,19 @@ const store_memory_1 = require("./store-memory");
24
24
  const decision_log_2 = require("./decision-log");
25
25
  const cost_table_1 = require("./cost-table");
26
26
  const i18n_1 = require("./i18n");
27
+ const telemetry_1 = require("./telemetry");
27
28
  class SpendGuard {
28
29
  config;
29
30
  spendStore;
30
31
  logStore;
31
32
  nextSequence = 0;
32
33
  previousHash = decision_log_1.GENESIS_PREVIOUS_HASH;
34
+ decisionLock = Promise.resolve();
33
35
  constructor(config) {
34
36
  this.config = config;
35
37
  this.spendStore = config.spendStore ?? new store_memory_1.InMemorySpendStore();
36
38
  this.logStore = config.logStore ?? new decision_log_2.InMemoryDecisionLogStore();
39
+ (0, telemetry_1.recordTelemetryEvent)('sdk_init');
37
40
  }
38
41
  /**
39
42
  * Hydrate the chain pointer from the log store. Call this once at startup
@@ -41,35 +44,67 @@ class SpendGuard {
41
44
  * previous run.
42
45
  */
43
46
  async hydrate() {
44
- const latest = await this.logStore.getLatest();
45
- if (latest) {
46
- this.nextSequence = latest.sequence + 1;
47
- this.previousHash = latest.entryHash;
48
- }
47
+ await this.withDecisionLock(async () => {
48
+ const latest = await this.logStore.getLatest(this.getSignerFingerprint());
49
+ if (latest) {
50
+ this.nextSequence = latest.sequence + 1;
51
+ this.previousHash = latest.entryHash;
52
+ }
53
+ });
49
54
  }
50
55
  /**
51
56
  * Evaluate the policy for a call and append to the decision log.
52
57
  * Returns the decision plus the signed log entry (or null if unsigned).
53
58
  */
54
59
  async decide(call) {
55
- const decision = await (0, policy_1.evaluatePolicy)(this.config.policy, call, this.spendStore);
56
- let signed = null;
57
- if (this.config.signingKeys) {
58
- signed = await (0, decision_log_1.signDecision)({
59
- sequence: this.nextSequence,
60
- decision,
61
- previousHash: this.previousHash,
62
- privateKey: this.config.signingKeys.privateKey,
63
- publicKey: this.config.signingKeys.publicKey,
64
- });
65
- await this.logStore.append(signed);
66
- this.nextSequence += 1;
67
- this.previousHash = signed.entryHash;
68
- }
60
+ const result = await this.withDecisionLock(async () => {
61
+ const decision = await (0, policy_1.evaluatePolicy)(this.config.policy, call, this.spendStore);
62
+ let signed = null;
63
+ if (this.config.signingKeys) {
64
+ await this.refreshChainHead();
65
+ signed = await (0, decision_log_1.signDecision)({
66
+ sequence: this.nextSequence,
67
+ decision,
68
+ previousHash: this.previousHash,
69
+ privateKey: this.config.signingKeys.privateKey,
70
+ publicKey: this.config.signingKeys.publicKey,
71
+ });
72
+ await this.logStore.append(signed);
73
+ this.nextSequence += 1;
74
+ this.previousHash = signed.entryHash;
75
+ }
76
+ return { decision, signed };
77
+ });
69
78
  if (this.config.onDecision) {
70
- await this.config.onDecision(decision, signed);
79
+ await this.config.onDecision(result.decision, result.signed);
80
+ }
81
+ return result;
82
+ }
83
+ getSignerFingerprint() {
84
+ return this.config.signingKeys
85
+ ? (0, decision_log_1.computeSignerFingerprint)(this.config.signingKeys.publicKey)
86
+ : undefined;
87
+ }
88
+ async refreshChainHead() {
89
+ const latest = await this.logStore.getLatest(this.getSignerFingerprint());
90
+ if (latest && latest.sequence >= this.nextSequence) {
91
+ this.nextSequence = latest.sequence + 1;
92
+ this.previousHash = latest.entryHash;
93
+ }
94
+ }
95
+ async withDecisionLock(fn) {
96
+ const previous = this.decisionLock;
97
+ let release;
98
+ this.decisionLock = new Promise((resolve) => {
99
+ release = resolve;
100
+ });
101
+ await previous;
102
+ try {
103
+ return await fn();
104
+ }
105
+ finally {
106
+ release();
71
107
  }
72
- return { decision, signed };
73
108
  }
74
109
  /** Default token estimator: approx 1 token per 4 characters of English. */
75
110
  defaultTokenEstimator(text) {
@@ -129,13 +164,18 @@ function withSpendGuard(client, opts) {
129
164
  const originalCreate = client?.chat?.completions?.create?.bind(client.chat.completions);
130
165
  if (!originalCreate) {
131
166
  throw new Error('withSpendGuard: expected an OpenAI client with chat.completions.create. ' +
132
- 'For Anthropic or Bedrock, use withAnthropicSpendGuard or withBedrockSpendGuard.');
167
+ 'For Anthropic or AWS Bedrock, use the Python SDK (agentguard-spend) which has dedicated bindings. ' +
168
+ 'Native Node bindings for Anthropic + Bedrock are on the roadmap.');
133
169
  }
134
170
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
135
171
  client.chat.completions.create = async (params) => {
136
172
  const inputText = serializeMessages(params?.messages ?? []);
137
173
  const inputTokens = guard.estimateTokens(inputText);
138
- const outputTokens = typeof params?.max_tokens === 'number' ? params.max_tokens : 512;
174
+ const outputTokens = typeof params?.max_completion_tokens === 'number'
175
+ ? params.max_completion_tokens
176
+ : typeof params?.max_tokens === 'number'
177
+ ? params.max_tokens
178
+ : 512;
139
179
  const provider = (0, cost_table_1.inferProvider)(params?.model ?? '');
140
180
  const call = {
141
181
  provider,
@@ -154,7 +194,9 @@ function withSpendGuard(client, opts) {
154
194
  params = { ...params, model: decision.modelResolved };
155
195
  }
156
196
  // shadow + allow + downgrade all proceed to the provider.
157
- return originalCreate(params);
197
+ const response = await originalCreate(params);
198
+ await trueUpSpend(guard, opts.policy, call, decision, response);
199
+ return response;
158
200
  };
159
201
  // Attach the guard so callers can introspect or await hydration.
160
202
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -170,4 +212,31 @@ function serializeMessages(messages) {
170
212
  .map((m) => (typeof m?.content === 'string' ? m.content : JSON.stringify(m?.content ?? '')))
171
213
  .join('\n');
172
214
  }
215
+ async function trueUpSpend(guard, policy, call, decision, response) {
216
+ if (decision.action !== 'allow' && decision.action !== 'downgrade' && decision.action !== 'shadow')
217
+ return;
218
+ const usage = extractUsage(response);
219
+ if (!usage)
220
+ return;
221
+ const estimatedCents = (0, cost_table_1.computeCallCents)(decision.modelResolved, call.inputTokens, call.outputTokens);
222
+ const actualCents = (0, cost_table_1.computeCallCents)(decision.modelResolved, usage.inputTokens, usage.outputTokens);
223
+ if (estimatedCents === null || actualCents === null)
224
+ return;
225
+ const delta = actualCents - estimatedCents;
226
+ if (delta === 0)
227
+ return;
228
+ await (0, policy_1.adjustPolicyWindowSpend)(policy, guard.getSpendStore(), delta);
229
+ }
230
+ function extractUsage(response) {
231
+ const usage = response?.usage;
232
+ if (!usage)
233
+ return null;
234
+ const input = usage.prompt_tokens ?? usage.input_tokens;
235
+ const output = usage.completion_tokens ?? usage.output_tokens;
236
+ if (!Number.isSafeInteger(input) || !Number.isSafeInteger(output))
237
+ return null;
238
+ if (input < 0 || output < 0)
239
+ return null;
240
+ return { inputTokens: input, outputTokens: output };
241
+ }
173
242
  //# sourceMappingURL=spend-guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spend-guard.js","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spend-guard.js","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * AgentGuard(TM) Spend In-memory spend store
2
+ * AgentGuard(TM) Spend: In-memory spend store
3
3
  *
4
4
  * Reference implementation of the SpendStore interface. Suitable for tests,
5
5
  * examples, and single-process shadow deployments. Production callers with
@@ -9,7 +9,7 @@
9
9
  * Licensed under the alpha evaluation license; see LICENSE in the package
10
10
  * root. Patent notice: Protected by U.S. patent-pending technology
11
11
  * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
12
- * and an additional application filed May 2026).
12
+ * 64/071,781; 64/071,789).
13
13
  */
14
14
  import type { SpendStore, SpendWindow } from './types';
15
15
  export declare const WINDOW_DURATION_MS: Record<SpendWindow, number>;
@@ -29,6 +29,12 @@ export declare class InMemorySpendStore implements SpendStore {
29
29
  private rollIfStale;
30
30
  getWindowSpend(scopeKey: string, window: SpendWindow): Promise<number>;
31
31
  incrementWindowSpend(scopeKey: string, window: SpendWindow, cents: number): Promise<number>;
32
+ reserveWindowSpend(scopeKey: string, window: SpendWindow, cents: number, limitCents: number): Promise<{
33
+ allowed: boolean;
34
+ before: number;
35
+ after: number;
36
+ }>;
37
+ settleWindowSpend(scopeKey: string, window: SpendWindow, deltaCents: number): Promise<number>;
32
38
  /** Clear all state. Test helper. */
33
39
  reset(): void;
34
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store-memory.d.ts","sourceRoot":"","sources":["../src/store-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AASvD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAM1D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAItE;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,KAAK,CAAkC;IAE/C,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,WAAW;IAYb,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAMlB,oCAAoC;IACpC,KAAK,IAAI,IAAI;CAGd"}
1
+ {"version":3,"file":"store-memory.d.ts","sourceRoot":"","sources":["../src/store-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AASvD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAM1D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAItE;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,KAAK,CAAkC;IAE/C,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,WAAW;IAYb,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAOZ,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBzD,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IAOlB,oCAAoC;IACpC,KAAK,IAAI,IAAI;CAGd"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * AgentGuard(TM) Spend In-memory spend store
3
+ * AgentGuard(TM) Spend: In-memory spend store
4
4
  *
5
5
  * Reference implementation of the SpendStore interface. Suitable for tests,
6
6
  * examples, and single-process shadow deployments. Production callers with
@@ -10,7 +10,7 @@
10
10
  * Licensed under the alpha evaluation license; see LICENSE in the package
11
11
  * root. Patent notice: Protected by U.S. patent-pending technology
12
12
  * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
13
- * and an additional application filed May 2026).
13
+ * 64/071,781; 64/071,789).
14
14
  */
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.InMemorySpendStore = exports.WINDOW_DURATION_MS = void 0;
@@ -58,14 +58,46 @@ class InMemorySpendStore {
58
58
  return state.cents;
59
59
  }
60
60
  async incrementWindowSpend(scopeKey, window, cents) {
61
+ validateCents('cents', cents);
61
62
  const state = this.rollIfStale(scopeKey, window, Date.now());
62
63
  state.cents += cents;
63
64
  return state.cents;
64
65
  }
66
+ async reserveWindowSpend(scopeKey, window, cents, limitCents) {
67
+ validateCents('cents', cents);
68
+ validateCents('limitCents', limitCents);
69
+ const state = this.rollIfStale(scopeKey, window, Date.now());
70
+ const before = state.cents;
71
+ const after = before + cents;
72
+ if (!Number.isSafeInteger(after)) {
73
+ throw new Error('reserveWindowSpend: computed cents must be a safe integer');
74
+ }
75
+ if (after > limitCents) {
76
+ return { allowed: false, before, after };
77
+ }
78
+ state.cents = after;
79
+ return { allowed: true, before, after };
80
+ }
81
+ async settleWindowSpend(scopeKey, window, deltaCents) {
82
+ validateDelta(deltaCents);
83
+ const state = this.rollIfStale(scopeKey, window, Date.now());
84
+ state.cents = Math.max(0, state.cents + deltaCents);
85
+ return state.cents;
86
+ }
65
87
  /** Clear all state. Test helper. */
66
88
  reset() {
67
89
  this.state.clear();
68
90
  }
69
91
  }
70
92
  exports.InMemorySpendStore = InMemorySpendStore;
93
+ function validateCents(name, cents) {
94
+ if (!Number.isSafeInteger(cents) || cents < 0) {
95
+ throw new Error(`${name} must be a non-negative safe integer`);
96
+ }
97
+ }
98
+ function validateDelta(deltaCents) {
99
+ if (!Number.isSafeInteger(deltaCents)) {
100
+ throw new Error('deltaCents must be a safe integer');
101
+ }
102
+ }
71
103
  //# sourceMappingURL=store-memory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store-memory.js","sourceRoot":"","sources":["../src/store-memory.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAwBH,kCAIC;AAjBY,QAAA,kBAAkB,GAAgC;IAC7D,QAAQ,EAAE,CAAC,EAAE,uCAAuC;IACpD,UAAU,EAAE,MAAM;IAClB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,UAAU;IACnB,SAAS,EAAE,EAAE,GAAG,UAAU,EAAE,sEAAsE;CACnG,CAAC;AAEF;;;;GAIG;AACH,SAAgB,WAAW,CAAC,MAAmB,EAAE,KAAa;IAC5D,MAAM,GAAG,GAAG,0BAAkB,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,sBAAsB;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAa,kBAAkB;IACrB,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEvC,GAAG,CAAC,QAAgB,EAAE,MAAmB;QAC/C,OAAO,GAAG,QAAQ,KAAK,MAAM,EAAE,CAAC;IAClC,CAAC;IAEO,WAAW,CAAC,QAAgB,EAAE,MAAmB,EAAE,KAAa;QACtE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;YACtE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,MAAmB;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,QAAgB,EAChB,MAAmB,EACnB,KAAa;QAEb,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;QACrB,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,oCAAoC;IACpC,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAtCD,gDAsCC"}
1
+ {"version":3,"file":"store-memory.js","sourceRoot":"","sources":["../src/store-memory.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAwBH,kCAIC;AAjBY,QAAA,kBAAkB,GAAgC;IAC7D,QAAQ,EAAE,CAAC,EAAE,uCAAuC;IACpD,UAAU,EAAE,MAAM;IAClB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,UAAU;IACnB,SAAS,EAAE,EAAE,GAAG,UAAU,EAAE,sEAAsE;CACnG,CAAC;AAEF;;;;GAIG;AACH,SAAgB,WAAW,CAAC,MAAmB,EAAE,KAAa;IAC5D,MAAM,GAAG,GAAG,0BAAkB,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,sBAAsB;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAa,kBAAkB;IACrB,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEvC,GAAG,CAAC,QAAgB,EAAE,MAAmB;QAC/C,OAAO,GAAG,QAAQ,KAAK,MAAM,EAAE,CAAC;IAClC,CAAC;IAEO,WAAW,CAAC,QAAgB,EAAE,MAAmB,EAAE,KAAa;QACtE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;YACtE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,MAAmB;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,QAAgB,EAChB,MAAmB,EACnB,KAAa;QAEb,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;QACrB,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,MAAmB,EACnB,KAAa,EACb,UAAkB;QAElB,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,aAAa,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,KAAK,GAAG,UAAU,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3C,CAAC;QACD,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,MAAmB,EACnB,UAAkB;QAElB,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,oCAAoC;IACpC,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAvED,gDAuEC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa;IAChD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,sCAAsC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB;IACvC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface TelemetryStatus {
2
+ enabled: boolean;
3
+ anonymousInstallId: string | null;
4
+ statePath: string;
5
+ }
6
+ export declare function telemetryStatus(): TelemetryStatus;
7
+ export declare function enableTelemetry(): TelemetryStatus;
8
+ export declare function disableTelemetry(): TelemetryStatus;
9
+ export declare function resetTelemetryInstallId(): TelemetryStatus;
10
+ export declare function recordTelemetryEvent(event: string): void;
11
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD,wBAAgB,eAAe,IAAI,eAAe,CAOjD;AAED,wBAAgB,eAAe,IAAI,eAAe,CAKjD;AAED,wBAAgB,gBAAgB,IAAI,eAAe,CAKlD;AAED,wBAAgB,uBAAuB,IAAI,eAAe,CAKzD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAwCxD"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.telemetryStatus = telemetryStatus;
37
+ exports.enableTelemetry = enableTelemetry;
38
+ exports.disableTelemetry = disableTelemetry;
39
+ exports.resetTelemetryInstallId = resetTelemetryInstallId;
40
+ exports.recordTelemetryEvent = recordTelemetryEvent;
41
+ const fs = __importStar(require("fs"));
42
+ const https = __importStar(require("https"));
43
+ const os = __importStar(require("os"));
44
+ const path = __importStar(require("path"));
45
+ const crypto_1 = require("crypto");
46
+ const AGENTGUARD_SPEND_VERSION = '0.2.0';
47
+ const STATE_DIR = path.join(os.homedir(), '.agentguard');
48
+ const STATE_PATH = path.join(STATE_DIR, 'telemetry.json');
49
+ const BEACON_URL = 'https://agentguard.run/api/beacon';
50
+ const sentEvents = new Set();
51
+ function telemetryStatus() {
52
+ const state = loadState();
53
+ return {
54
+ enabled: telemetryEnabled(state),
55
+ anonymousInstallId: state.anonymousInstallId ?? null,
56
+ statePath: STATE_PATH,
57
+ };
58
+ }
59
+ function enableTelemetry() {
60
+ const state = ensureInstallId(loadState());
61
+ state.enabled = true;
62
+ saveState(state);
63
+ return telemetryStatus();
64
+ }
65
+ function disableTelemetry() {
66
+ const state = loadState();
67
+ state.enabled = false;
68
+ saveState(state);
69
+ return telemetryStatus();
70
+ }
71
+ function resetTelemetryInstallId() {
72
+ const state = loadState();
73
+ state.anonymousInstallId = (0, crypto_1.randomUUID)();
74
+ saveState(state);
75
+ return telemetryStatus();
76
+ }
77
+ function recordTelemetryEvent(event) {
78
+ if (sentEvents.has(event))
79
+ return;
80
+ const state = loadState();
81
+ if (!telemetryEnabled(state))
82
+ return;
83
+ const withId = ensureInstallId(state);
84
+ saveState(withId);
85
+ sentEvents.add(event);
86
+ const payload = JSON.stringify({
87
+ event,
88
+ sdk_name: '@agentguard-run/spend',
89
+ sdk_version: AGENTGUARD_SPEND_VERSION,
90
+ runtime: `node-${process.version}`,
91
+ os_family: process.platform,
92
+ anonymous_install_id: withId.anonymousInstallId,
93
+ ci_env_detected: isCI(),
94
+ tty: Boolean(process.stdout?.isTTY),
95
+ });
96
+ try {
97
+ const url = new URL(BEACON_URL);
98
+ const req = https.request({
99
+ method: 'POST',
100
+ hostname: url.hostname,
101
+ path: url.pathname,
102
+ headers: {
103
+ 'content-type': 'application/json',
104
+ 'content-length': Buffer.byteLength(payload),
105
+ },
106
+ timeout: 1000,
107
+ }, (res) => res.resume());
108
+ req.on('error', () => undefined);
109
+ req.on('timeout', () => req.destroy());
110
+ req.end(payload);
111
+ }
112
+ catch {
113
+ // Telemetry is best effort and never affects SDK behavior.
114
+ }
115
+ }
116
+ function telemetryEnabled(state) {
117
+ if (process.env.AGENTGUARD_NO_BEACON === '1')
118
+ return false;
119
+ if (process.env.AGENTGUARD_TELEMETRY === '1')
120
+ return true;
121
+ return state.enabled === true;
122
+ }
123
+ function loadState() {
124
+ try {
125
+ return JSON.parse(fs.readFileSync(STATE_PATH, 'utf-8'));
126
+ }
127
+ catch {
128
+ return {};
129
+ }
130
+ }
131
+ function saveState(state) {
132
+ fs.mkdirSync(STATE_DIR, { recursive: true });
133
+ fs.writeFileSync(STATE_PATH, JSON.stringify(state, null, 2) + '\n', { mode: 0o600 });
134
+ }
135
+ function ensureInstallId(state) {
136
+ if (!state.anonymousInstallId)
137
+ state.anonymousInstallId = (0, crypto_1.randomUUID)();
138
+ return state;
139
+ }
140
+ function isCI() {
141
+ return Boolean(process.env.CI ||
142
+ process.env.GITHUB_ACTIONS ||
143
+ process.env.GITLAB_CI ||
144
+ process.env.CIRCLECI ||
145
+ process.env.BUILDKITE ||
146
+ process.env.VERCEL ||
147
+ process.env.NETLIFY);
148
+ }
149
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  /**
2
- * AgentGuard(TM) Spend Core type definitions
2
+ * AgentGuard(TM) Spend: Core type definitions
3
3
  *
4
4
  * Patent notice: Protected by U.S. patent-pending technology
5
5
  * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
6
- * and an additional application filed May 2026).
6
+ * 64/071,781; 64/071,789).
7
7
  *
8
8
  * Design rule: NO DATA PLANE INVOLVEMENT.
9
9
  * All policy decisions are made locally in the customer runtime.
@@ -157,6 +157,14 @@ export interface SignedDecisionLogEntry {
157
157
  /** Hex-encoded public key fingerprint (first 8 bytes of SHA-256(pubkey)) */
158
158
  signerFingerprint: string;
159
159
  }
160
+ export interface SpendReservation {
161
+ /** True when cents were reserved against the window. */
162
+ allowed: boolean;
163
+ /** Cents spent in the window before this reservation attempt. */
164
+ before: number;
165
+ /** Cents that would be or were spent after the reservation. */
166
+ after: number;
167
+ }
160
168
  /**
161
169
  * Storage backend for spend state. Implementations may use Redis, Postgres,
162
170
  * SQLite, in-memory, or anything else. Spend state never leaves the customer
@@ -172,6 +180,17 @@ export interface SpendStore {
172
180
  * Returns the new total. Implementations MUST be atomic to prevent races.
173
181
  */
174
182
  incrementWindowSpend(scopeKey: string, window: SpendWindow, cents: number): Promise<number>;
183
+ /**
184
+ * Atomically reserve cents if the post-reservation total is <= limitCents.
185
+ * Implementations that omit this method will still work, but cannot provide
186
+ * distributed cap safety under concurrent writers.
187
+ */
188
+ reserveWindowSpend?(scopeKey: string, window: SpendWindow, cents: number, limitCents: number): Promise<SpendReservation>;
189
+ /**
190
+ * Adjust a prior reservation after provider usage is known. Negative deltas
191
+ * must clamp at zero rather than creating negative spend.
192
+ */
193
+ settleWindowSpend?(scopeKey: string, window: SpendWindow, deltaCents: number): Promise<number>;
175
194
  }
176
195
  /**
177
196
  * Storage backend for the signed decision log. Implementations may append to a
@@ -181,8 +200,8 @@ export interface DecisionLogStore {
181
200
  /** Append a new signed entry to the chain. */
182
201
  append(entry: SignedDecisionLogEntry): Promise<void>;
183
202
  /** Get the most recent entry, or null if empty. */
184
- getLatest(): Promise<SignedDecisionLogEntry | null>;
203
+ getLatest(signerFingerprint?: string): Promise<SignedDecisionLogEntry | null>;
185
204
  /** Iterate from sequence onward (used by verification tools). */
186
- read(fromSequence: number, limit: number): Promise<SignedDecisionLogEntry[]>;
205
+ read(fromSequence: number, limit: number, signerFingerprint?: string): Promise<SignedDecisionLogEntry[]>;
187
206
  }
188
207
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  /**
3
- * AgentGuard(TM) Spend Core type definitions
3
+ * AgentGuard(TM) Spend: Core type definitions
4
4
  *
5
5
  * Patent notice: Protected by U.S. patent-pending technology
6
6
  * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
7
- * and an additional application filed May 2026).
7
+ * 64/071,781; 64/071,789).
8
8
  *
9
9
  * Design rule: NO DATA PLANE INVOLVEMENT.
10
10
  * All policy decisions are made locally in the customer runtime.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentguard-run/spend",
3
- "version": "0.1.9",
3
+ "version": "0.2.0",
4
4
  "description": "Local-runtime spend caps and capability-gated model routing for AI agents. Prompts, API keys, and signing keys stay inside the customer runtime. Zero data plane involvement.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -79,13 +79,27 @@
79
79
  "@langchain/core": ">=0.3.0"
80
80
  },
81
81
  "peerDependenciesMeta": {
82
- "openai": { "optional": true },
83
- "@anthropic-ai/sdk": { "optional": true },
84
- "@aws-sdk/client-bedrock-runtime": { "optional": true },
85
- "ioredis": { "optional": true },
86
- "pg": { "optional": true },
87
- "@aws-sdk/client-kms": { "optional": true },
88
- "@langchain/core": { "optional": true }
82
+ "openai": {
83
+ "optional": true
84
+ },
85
+ "@anthropic-ai/sdk": {
86
+ "optional": true
87
+ },
88
+ "@aws-sdk/client-bedrock-runtime": {
89
+ "optional": true
90
+ },
91
+ "ioredis": {
92
+ "optional": true
93
+ },
94
+ "pg": {
95
+ "optional": true
96
+ },
97
+ "@aws-sdk/client-kms": {
98
+ "optional": true
99
+ },
100
+ "@langchain/core": {
101
+ "optional": true
102
+ }
89
103
  },
90
104
  "devDependencies": {
91
105
  "@types/node": "^20.0.0",