@agentguard-run/spend 0.1.6 → 0.1.7
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/cli/doctor.d.ts +5 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +208 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/explain.d.ts +5 -0
- package/dist/cli/explain.d.ts.map +1 -0
- package/dist/cli/explain.js +172 -0
- package/dist/cli/explain.js.map +1 -0
- package/dist/cli/init.d.ts +5 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +208 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +18 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+FH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyF/D"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `agentguard doctor` — check installation health and configuration.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.runDoctor = runDoctor;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const index_1 = require("../index");
|
|
44
|
+
const colors_1 = require("./colors");
|
|
45
|
+
function checkRequire(name) {
|
|
46
|
+
try {
|
|
47
|
+
const m = require(name);
|
|
48
|
+
const version = m.VERSION || m.version || '?';
|
|
49
|
+
return { ok: true, note: `v${version}` };
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return { ok: false, note: 'not installed (optional)' };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function checkWritable(p) {
|
|
56
|
+
try {
|
|
57
|
+
fs.mkdirSync(p, { recursive: true });
|
|
58
|
+
const testFile = path.join(p, '.doctor-write-test');
|
|
59
|
+
fs.writeFileSync(testFile, 'ok');
|
|
60
|
+
fs.unlinkSync(testFile);
|
|
61
|
+
return { ok: true, note: p };
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
return { ok: false, note: String(e) };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function checkCrypto() {
|
|
68
|
+
try {
|
|
69
|
+
const ed = await Promise.resolve().then(() => __importStar(require('@noble/ed25519')));
|
|
70
|
+
const priv = new Uint8Array(32);
|
|
71
|
+
for (let i = 0; i < 32; i++)
|
|
72
|
+
priv[i] = i;
|
|
73
|
+
const pub = await ed.getPublicKeyAsync(priv);
|
|
74
|
+
if (pub.length === 32) {
|
|
75
|
+
return { ok: true, note: 'Ed25519 key derivation OK (32-byte public key)' };
|
|
76
|
+
}
|
|
77
|
+
return { ok: false, note: `unexpected public key size: ${pub.length}` };
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
return { ok: false, note: `crypto backend failed: ${e}` };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function checkDryRunBlock() {
|
|
84
|
+
try {
|
|
85
|
+
const { SpendGuard } = await Promise.resolve().then(() => __importStar(require('../spend-guard')));
|
|
86
|
+
const { InMemorySpendStore } = await Promise.resolve().then(() => __importStar(require('../store-memory')));
|
|
87
|
+
const { InMemoryDecisionLogStore } = await Promise.resolve().then(() => __importStar(require('../decision-log')));
|
|
88
|
+
const ed = await Promise.resolve().then(() => __importStar(require('@noble/ed25519')));
|
|
89
|
+
const privateKey = new Uint8Array(32);
|
|
90
|
+
for (let i = 0; i < 32; i++)
|
|
91
|
+
privateKey[i] = i;
|
|
92
|
+
const publicKey = await ed.getPublicKeyAsync(privateKey);
|
|
93
|
+
const policy = {
|
|
94
|
+
id: 'doctor-v1',
|
|
95
|
+
name: 'Doctor dry-run policy',
|
|
96
|
+
scope: { tenantId: 'doctor' },
|
|
97
|
+
caps: [
|
|
98
|
+
{ amountCents: 0, window: 'per_day', action: 'block', reason: 'doctor check' },
|
|
99
|
+
],
|
|
100
|
+
mode: 'enforce',
|
|
101
|
+
version: 1,
|
|
102
|
+
effectiveFrom: '2026-01-01T00:00:00.000Z',
|
|
103
|
+
};
|
|
104
|
+
const guard = new SpendGuard({
|
|
105
|
+
policy,
|
|
106
|
+
spendStore: new InMemorySpendStore(),
|
|
107
|
+
logStore: new InMemoryDecisionLogStore(),
|
|
108
|
+
signingKeys: { privateKey, publicKey },
|
|
109
|
+
});
|
|
110
|
+
const result = await guard.decide({
|
|
111
|
+
provider: 'openai',
|
|
112
|
+
model: 'gpt-4o',
|
|
113
|
+
inputTokens: 100,
|
|
114
|
+
outputTokens: 50,
|
|
115
|
+
scope: { tenantId: 'doctor', agentId: 'dry-run' },
|
|
116
|
+
});
|
|
117
|
+
if (result.decision?.action === 'block') {
|
|
118
|
+
return { ok: true, note: 'block path fires correctly' };
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
ok: false,
|
|
122
|
+
note: `expected action=block, got action=${result.decision?.action}`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
return { ok: false, note: `dry-run block failed: ${e}` };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function runDoctor(argv) {
|
|
130
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
131
|
+
console.log('agentguard doctor');
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
console.log('');
|
|
135
|
+
console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
|
|
136
|
+
console.log('');
|
|
137
|
+
console.log(' ' + (0, colors_1.cyanBold)('agentguard doctor') + (0, colors_1.dim)(' · setup health check'));
|
|
138
|
+
console.log('');
|
|
139
|
+
const checks = [];
|
|
140
|
+
// 1. Core package self-check
|
|
141
|
+
checks.push({
|
|
142
|
+
name: '@agentguard-run/spend package',
|
|
143
|
+
ok: true,
|
|
144
|
+
note: `v${index_1.AGENTGUARD_SPEND_VERSION}`,
|
|
145
|
+
});
|
|
146
|
+
// 2. Crypto
|
|
147
|
+
const cryptoCheck = await checkCrypto();
|
|
148
|
+
checks.push({ name: 'Ed25519 crypto backend', ...cryptoCheck });
|
|
149
|
+
// 3. Optional providers
|
|
150
|
+
for (const provider of ['openai', '@anthropic-ai/sdk', '@aws-sdk/client-bedrock-runtime']) {
|
|
151
|
+
const r = checkRequire(provider);
|
|
152
|
+
checks.push({ name: `provider: ${provider}`, ...r, optional: true });
|
|
153
|
+
}
|
|
154
|
+
// 4. ~/.agentguard writable
|
|
155
|
+
checks.push({
|
|
156
|
+
name: '~/.agentguard/ writable',
|
|
157
|
+
...checkWritable(path.join(os.homedir(), '.agentguard')),
|
|
158
|
+
});
|
|
159
|
+
// 5. Policy file in cwd
|
|
160
|
+
const policyPath = path.join(process.cwd(), 'agentguard.policy.yaml');
|
|
161
|
+
if (fs.existsSync(policyPath)) {
|
|
162
|
+
checks.push({ name: 'policy file (cwd)', ok: true, note: `found: ${path.basename(policyPath)}` });
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
checks.push({
|
|
166
|
+
name: 'policy file (cwd)',
|
|
167
|
+
ok: false,
|
|
168
|
+
note: `not found in ${path.basename(process.cwd())}/ — run 'agentguard init'`,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
// 6. Dry-run block
|
|
172
|
+
const dryRun = await checkDryRunBlock();
|
|
173
|
+
checks.push({ name: 'dry-run block simulation', ...dryRun });
|
|
174
|
+
const labelWidth = Math.max(...checks.map((c) => c.name.length)) + 2;
|
|
175
|
+
let passCount = 0;
|
|
176
|
+
let optionalFailCount = 0;
|
|
177
|
+
let failCount = 0;
|
|
178
|
+
for (const c of checks) {
|
|
179
|
+
let mark;
|
|
180
|
+
if (c.ok) {
|
|
181
|
+
mark = (0, colors_1.green)('✓');
|
|
182
|
+
passCount++;
|
|
183
|
+
}
|
|
184
|
+
else if (c.optional) {
|
|
185
|
+
mark = (0, colors_1.dim)('·');
|
|
186
|
+
optionalFailCount++;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
mark = (0, colors_1.redBold)('✗');
|
|
190
|
+
failCount++;
|
|
191
|
+
}
|
|
192
|
+
console.log(` ${mark} ${c.name.padEnd(labelWidth)}${(0, colors_1.dim)(c.note)}`);
|
|
193
|
+
}
|
|
194
|
+
console.log('');
|
|
195
|
+
console.log((0, colors_1.dim)(' ───────────────────────────────────────────'));
|
|
196
|
+
if (failCount === 0) {
|
|
197
|
+
console.log(` ${(0, colors_1.greenBold)('healthy')} ` +
|
|
198
|
+
(0, colors_1.dim)(`(${passCount} passing, ${optionalFailCount} optional providers not installed)`));
|
|
199
|
+
console.log('');
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
console.log(` ${(0, colors_1.redBold)('issues found')} ` + (0, colors_1.dim)(`(${failCount} failing, ${passCount} passing)`));
|
|
203
|
+
console.log('');
|
|
204
|
+
console.log((0, colors_1.dim)(" fix the ✗ items above, then re-run 'agentguard doctor'."));
|
|
205
|
+
console.log('');
|
|
206
|
+
return 1;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/cli/explain.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6GhE"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `agentguard explain` — decode a signed receipt with cap math + signature breakdown.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.runExplain = runExplain;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const index_1 = require("../index");
|
|
44
|
+
const colors_1 = require("./colors");
|
|
45
|
+
const DEMO_RECEIPT = path.join(os.homedir(), '.agentguard', 'demo', 'latest-receipt.json');
|
|
46
|
+
const WINDOW_LABELS = {
|
|
47
|
+
per_call: 'per call',
|
|
48
|
+
per_minute: 'per minute',
|
|
49
|
+
per_hour: 'per hour',
|
|
50
|
+
per_day: 'per day',
|
|
51
|
+
per_month: 'per month',
|
|
52
|
+
};
|
|
53
|
+
const WINDOW_RESETS = {
|
|
54
|
+
per_call: 'next call',
|
|
55
|
+
per_minute: 'top of next minute (UTC)',
|
|
56
|
+
per_hour: 'top of next hour (UTC)',
|
|
57
|
+
per_day: 'UTC midnight',
|
|
58
|
+
per_month: '1st of next month (UTC)',
|
|
59
|
+
};
|
|
60
|
+
function formatCents(cents) {
|
|
61
|
+
const sign = cents < 0 ? '-' : '';
|
|
62
|
+
const abs = Math.abs(Math.round(cents));
|
|
63
|
+
const dollars = Math.floor(abs / 100);
|
|
64
|
+
const remainder = abs % 100;
|
|
65
|
+
const dollarsStr = dollars.toLocaleString('en-US');
|
|
66
|
+
const remainderStr = String(remainder).padStart(2, '0');
|
|
67
|
+
return `${sign}$${dollarsStr}.${remainderStr}`;
|
|
68
|
+
}
|
|
69
|
+
async function runExplain(argv) {
|
|
70
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
71
|
+
console.log('agentguard explain [latest|<path>]');
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
const receiptArg = argv.find((a) => !a.startsWith('-')) || 'latest';
|
|
75
|
+
console.log('');
|
|
76
|
+
console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
|
|
77
|
+
console.log('');
|
|
78
|
+
console.log(' ' + (0, colors_1.cyanBold)(`agentguard explain ${receiptArg}`));
|
|
79
|
+
console.log('');
|
|
80
|
+
let source;
|
|
81
|
+
if (receiptArg === 'latest') {
|
|
82
|
+
if (!fs.existsSync(DEMO_RECEIPT)) {
|
|
83
|
+
console.log(' ' + (0, colors_1.redBold)('error: ') + 'no demo receipt found.');
|
|
84
|
+
console.log(` run ${(0, colors_1.greenBold)('agentguard demo')} first to produce a receipt.`);
|
|
85
|
+
console.log('');
|
|
86
|
+
return 2;
|
|
87
|
+
}
|
|
88
|
+
source = DEMO_RECEIPT;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
source = path.resolve(receiptArg.replace(/^~/, os.homedir()));
|
|
92
|
+
if (!fs.existsSync(source)) {
|
|
93
|
+
console.log(' ' + (0, colors_1.redBold)('error: ') + `receipt file not found: ${source}`);
|
|
94
|
+
console.log('');
|
|
95
|
+
return 2;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const raw = JSON.parse(fs.readFileSync(source, 'utf-8'));
|
|
99
|
+
const decision = raw.decision;
|
|
100
|
+
const cap = decision.triggeredCap;
|
|
101
|
+
const agentId = String(decision.triggeredScopeKey || 'unknown')
|
|
102
|
+
.split('|')
|
|
103
|
+
.pop()
|
|
104
|
+
.replace('agentId=', '');
|
|
105
|
+
// 1. What happened
|
|
106
|
+
console.log((0, colors_1.dim)(' what happened'));
|
|
107
|
+
console.log((0, colors_1.dim)(' ─────────────'));
|
|
108
|
+
const action = decision.action || '?';
|
|
109
|
+
const colorAction = action === 'block'
|
|
110
|
+
? (0, colors_1.redBold)(action.toUpperCase())
|
|
111
|
+
: action === 'downgrade'
|
|
112
|
+
? (0, colors_1.yellow)(action.toUpperCase())
|
|
113
|
+
: (0, colors_1.green)(action.toUpperCase());
|
|
114
|
+
console.log(` action ${colorAction}`);
|
|
115
|
+
console.log(` agent ${agentId}`);
|
|
116
|
+
console.log(` provider ${decision.provider || '?'}`);
|
|
117
|
+
console.log(` model ${decision.modelRequested || '?'}`);
|
|
118
|
+
console.log('');
|
|
119
|
+
// 2. Cap math
|
|
120
|
+
console.log((0, colors_1.dim)(' cap math'));
|
|
121
|
+
console.log((0, colors_1.dim)(' ────────'));
|
|
122
|
+
const projected = decision.projectedCents || 0;
|
|
123
|
+
const windowBefore = decision.windowSpendBefore || 0;
|
|
124
|
+
console.log(` this call would have cost ${(0, colors_1.greenBold)(formatCents(projected))}`);
|
|
125
|
+
console.log(` spent in window before ${formatCents(windowBefore)}`);
|
|
126
|
+
if (cap) {
|
|
127
|
+
const capCents = cap.amountCents || 0;
|
|
128
|
+
const window = cap.window || '?';
|
|
129
|
+
const windowLabel = WINDOW_LABELS[window] || window;
|
|
130
|
+
const remaining = Math.max(0, capCents - windowBefore);
|
|
131
|
+
const overBy = Math.max(0, projected - remaining);
|
|
132
|
+
console.log(` cap ${(0, colors_1.redBold)(formatCents(capCents))} ${(0, colors_1.dim)(windowLabel)}`);
|
|
133
|
+
console.log(` remaining in window ${formatCents(remaining)}`);
|
|
134
|
+
if (overBy > 0)
|
|
135
|
+
console.log(` call exceeds remaining by ${(0, colors_1.redBold)(formatCents(overBy))}`);
|
|
136
|
+
const saved = Math.max(0, projected - remaining);
|
|
137
|
+
if (saved > 0)
|
|
138
|
+
console.log(` amount saved by block ${(0, colors_1.greenBold)('+' + formatCents(saved))}`);
|
|
139
|
+
console.log('');
|
|
140
|
+
console.log((0, colors_1.dim)(' what unblocks'));
|
|
141
|
+
console.log((0, colors_1.dim)(' ─────────────'));
|
|
142
|
+
const reset = WINDOW_RESETS[window] || 'next window boundary';
|
|
143
|
+
console.log(` window resets at ${(0, colors_1.greenBold)(reset)}`);
|
|
144
|
+
if (cap.downgradeTo)
|
|
145
|
+
console.log(` downgrade target ${(0, colors_1.greenBold)(cap.downgradeTo)}`);
|
|
146
|
+
console.log('');
|
|
147
|
+
}
|
|
148
|
+
// 3. Cryptographic receipt
|
|
149
|
+
console.log((0, colors_1.dim)(' cryptographic receipt'));
|
|
150
|
+
console.log((0, colors_1.dim)(' ─────────────────────'));
|
|
151
|
+
console.log(` sequence ${raw.sequence ?? '?'}`);
|
|
152
|
+
console.log(` entry hash ${String(raw.entryHash || '?').slice(0, 48)}${(0, colors_1.dim)('...')}`);
|
|
153
|
+
console.log(` prev hash ${String(raw.previousHash || '?').slice(0, 48)}${(0, colors_1.dim)('...')}`);
|
|
154
|
+
console.log(` signer (fp) ${String(raw.signerFingerprint || '?').slice(0, 32)}${(0, colors_1.dim)('...')}`);
|
|
155
|
+
const signature = String(raw.signature || '');
|
|
156
|
+
console.log(` signature ${signature.slice(0, 48)}${signature.length > 48 ? (0, colors_1.dim)('...') : ''}`);
|
|
157
|
+
console.log('');
|
|
158
|
+
console.log(` ${(0, colors_1.dim)('to verify cryptographically:')} ${(0, colors_1.greenBold)('agentguard verify --trace latest')}`);
|
|
159
|
+
console.log('');
|
|
160
|
+
// 4. Policy
|
|
161
|
+
console.log((0, colors_1.dim)(' policy'));
|
|
162
|
+
console.log((0, colors_1.dim)(' ──────'));
|
|
163
|
+
console.log(` id ${decision.policyId || '?'}`);
|
|
164
|
+
console.log(` version ${decision.policyVersion || '?'}`);
|
|
165
|
+
console.log(` mode ${decision.enforcementMode || '?'}`);
|
|
166
|
+
const reasons = decision.reasons || [];
|
|
167
|
+
if (reasons.length > 0)
|
|
168
|
+
console.log(` reasons ${reasons.join('; ')}`);
|
|
169
|
+
console.log('');
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=explain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/cli/explain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuGH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2E7D"}
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `agentguard init` — scaffold a project to use AgentGuard Spend.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.runInit = runInit;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const index_1 = require("../index");
|
|
43
|
+
const colors_1 = require("./colors");
|
|
44
|
+
const POLICY_TEMPLATE = (now) => `# AgentGuard Spend policy (generated by \`agentguard init\`)
|
|
45
|
+
# All amounts are integer cents. 500 = $5.00.
|
|
46
|
+
id: my-default-policy-v1
|
|
47
|
+
name: My default AgentGuard policy
|
|
48
|
+
version: 1
|
|
49
|
+
effectiveFrom: "${now}"
|
|
50
|
+
mode: enforce
|
|
51
|
+
|
|
52
|
+
scope:
|
|
53
|
+
tenantId: my-tenant
|
|
54
|
+
|
|
55
|
+
caps:
|
|
56
|
+
# Soft daily cap: when $5/day reached, downgrade to a cheaper model.
|
|
57
|
+
- amountCents: 500
|
|
58
|
+
window: per_day
|
|
59
|
+
action: downgrade
|
|
60
|
+
downgradeTo: gpt-4o-mini
|
|
61
|
+
reason: "Soft daily cap reached, routing to gpt-4o-mini"
|
|
62
|
+
|
|
63
|
+
# Hard daily ceiling: at $20/day, block the call.
|
|
64
|
+
- amountCents: 2000
|
|
65
|
+
window: per_day
|
|
66
|
+
action: block
|
|
67
|
+
reason: "Hard daily ceiling ($20/day)"
|
|
68
|
+
|
|
69
|
+
# Per-minute burst guard: catches runaway loops.
|
|
70
|
+
- amountCents: 200
|
|
71
|
+
window: per_minute
|
|
72
|
+
action: block
|
|
73
|
+
reason: "Per-minute burst guard ($2/min)"
|
|
74
|
+
`;
|
|
75
|
+
const QUICKSTART_TEMPLATE = `/**
|
|
76
|
+
* AgentGuard Spend quickstart (generated by \`agentguard init\`).
|
|
77
|
+
*
|
|
78
|
+
* Run after \`npm install @agentguard-run/spend openai\`:
|
|
79
|
+
* node agentguard_quickstart.js
|
|
80
|
+
*/
|
|
81
|
+
import OpenAI from 'openai';
|
|
82
|
+
import {
|
|
83
|
+
withSpendGuard,
|
|
84
|
+
AgentGuardBlockedError,
|
|
85
|
+
type SpendPolicy,
|
|
86
|
+
} from '@agentguard-run/spend';
|
|
87
|
+
import { randomBytes } from 'crypto';
|
|
88
|
+
|
|
89
|
+
const policy: SpendPolicy = {
|
|
90
|
+
id: 'my-default-policy-v1',
|
|
91
|
+
name: 'My default AgentGuard policy',
|
|
92
|
+
scope: { tenantId: 'my-tenant' },
|
|
93
|
+
caps: [
|
|
94
|
+
{
|
|
95
|
+
amountCents: 500,
|
|
96
|
+
window: 'per_day',
|
|
97
|
+
action: 'downgrade',
|
|
98
|
+
downgradeTo: 'gpt-4o-mini',
|
|
99
|
+
reason: 'Soft daily cap reached, routing to gpt-4o-mini',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
amountCents: 2000,
|
|
103
|
+
window: 'per_day',
|
|
104
|
+
action: 'block',
|
|
105
|
+
reason: 'Hard daily ceiling (\$20/day)',
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
mode: 'enforce',
|
|
109
|
+
version: 1,
|
|
110
|
+
effectiveFrom: '${new Date().toISOString()}',
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const privateKey = new Uint8Array(randomBytes(32));
|
|
114
|
+
|
|
115
|
+
const client = withSpendGuard(new OpenAI(), {
|
|
116
|
+
policy,
|
|
117
|
+
scope: { tenantId: 'my-tenant', agentId: 'my-first-agent' },
|
|
118
|
+
config: {
|
|
119
|
+
policy,
|
|
120
|
+
signingKeys: { privateKey, publicKey: new Uint8Array(32) },
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
try {
|
|
125
|
+
const response = await client.chat.completions.create({
|
|
126
|
+
model: 'gpt-4o',
|
|
127
|
+
messages: [{ role: 'user', content: 'Hello from AgentGuard!' }],
|
|
128
|
+
});
|
|
129
|
+
console.log(response.choices[0].message.content);
|
|
130
|
+
} catch (err) {
|
|
131
|
+
if (err instanceof AgentGuardBlockedError) {
|
|
132
|
+
console.error(err.message);
|
|
133
|
+
} else {
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
`;
|
|
138
|
+
async function runInit(argv) {
|
|
139
|
+
const force = argv.includes('--force');
|
|
140
|
+
const policyOnly = argv.includes('--policy-only');
|
|
141
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
142
|
+
console.log('agentguard init [--force] [--policy-only]');
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
const cwd = process.cwd();
|
|
146
|
+
const policyPath = path.join(cwd, 'agentguard.policy.yaml');
|
|
147
|
+
const quickstartPath = path.join(cwd, 'agentguard_quickstart.ts');
|
|
148
|
+
const gitignorePath = path.join(cwd, '.gitignore');
|
|
149
|
+
console.log('');
|
|
150
|
+
console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
|
|
151
|
+
console.log('');
|
|
152
|
+
console.log(' ' + (0, colors_1.cyanBold)('agentguard init') + (0, colors_1.dim)(' · scaffold a project'));
|
|
153
|
+
console.log('');
|
|
154
|
+
const created = [];
|
|
155
|
+
const skipped = [];
|
|
156
|
+
if (fs.existsSync(policyPath) && !force) {
|
|
157
|
+
skipped.push([path.basename(policyPath), 'already exists (use --force to overwrite)']);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const now = new Date().toISOString();
|
|
161
|
+
fs.writeFileSync(policyPath, POLICY_TEMPLATE(now));
|
|
162
|
+
created.push(path.basename(policyPath));
|
|
163
|
+
}
|
|
164
|
+
if (!policyOnly) {
|
|
165
|
+
if (fs.existsSync(quickstartPath) && !force) {
|
|
166
|
+
skipped.push([path.basename(quickstartPath), 'already exists (use --force to overwrite)']);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
fs.writeFileSync(quickstartPath, QUICKSTART_TEMPLATE);
|
|
170
|
+
created.push(path.basename(quickstartPath));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
let gitignoreModified = false;
|
|
174
|
+
if (fs.existsSync(gitignorePath)) {
|
|
175
|
+
const existing = fs.readFileSync(gitignorePath, 'utf-8');
|
|
176
|
+
if (!existing.includes('.agentguard')) {
|
|
177
|
+
const prefix = existing.endsWith('\n') ? '' : '\n';
|
|
178
|
+
fs.appendFileSync(gitignorePath, prefix + '.agentguard/\n');
|
|
179
|
+
gitignoreModified = true;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
fs.writeFileSync(gitignorePath, '.agentguard/\n');
|
|
184
|
+
gitignoreModified = true;
|
|
185
|
+
created.push('.gitignore');
|
|
186
|
+
}
|
|
187
|
+
for (const p of created)
|
|
188
|
+
console.log(` ${(0, colors_1.green)('+ created')} ${p}`);
|
|
189
|
+
if (gitignoreModified && !created.includes('.gitignore')) {
|
|
190
|
+
console.log(` ${(0, colors_1.green)('~ updated')} .gitignore ${(0, colors_1.dim)('(added .agentguard/)')}`);
|
|
191
|
+
}
|
|
192
|
+
for (const [p, reason] of skipped) {
|
|
193
|
+
console.log(` ${(0, colors_1.yellow)('= skipped')} ${p} ${(0, colors_1.dim)('(' + reason + ')')}`);
|
|
194
|
+
}
|
|
195
|
+
if (created.length === 0 && !gitignoreModified) {
|
|
196
|
+
console.log(` ${(0, colors_1.yellow)('nothing to do')} ${(0, colors_1.dim)('all files exist; pass --force to overwrite')}`);
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
console.log('');
|
|
200
|
+
console.log((0, colors_1.dim)(' ───────────────────────────────────────────'));
|
|
201
|
+
console.log(` ${(0, colors_1.dim)('next:')}`);
|
|
202
|
+
console.log(` 1. edit ${(0, colors_1.greenBold)('agentguard.policy.yaml')} to set your caps`);
|
|
203
|
+
console.log(` 2. ${(0, colors_1.greenBold)('node agentguard_quickstart.js')} ${(0, colors_1.dim)('to see it in action')}`);
|
|
204
|
+
console.log(` 3. ${(0, colors_1.greenBold)('agentguard doctor')} ${(0, colors_1.dim)('to verify your setup')}`);
|
|
205
|
+
console.log('');
|
|
206
|
+
return 0;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6BH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAqClF"}
|
package/dist/cli/main.js
CHANGED
|
@@ -52,12 +52,18 @@ usage:
|
|
|
52
52
|
commands:
|
|
53
53
|
demo Run a deterministic simulation with a real cryptographic receipt.
|
|
54
54
|
verify Verify a signed AgentGuard receipt.
|
|
55
|
+
init Scaffold a project (policy.yaml + quickstart + .gitignore).
|
|
56
|
+
doctor Check installation health and configuration.
|
|
57
|
+
explain Decode a signed receipt with cap math + signature breakdown.
|
|
55
58
|
--version Show the installed SDK version.
|
|
56
59
|
--help Show this help.
|
|
57
60
|
|
|
58
61
|
examples:
|
|
62
|
+
agentguard init
|
|
63
|
+
agentguard doctor
|
|
59
64
|
agentguard demo
|
|
60
65
|
agentguard verify --trace latest
|
|
66
|
+
agentguard explain latest
|
|
61
67
|
|
|
62
68
|
docs: https://agentguard.run
|
|
63
69
|
install: pip install agentguard-spend / npm install @agentguard-run/spend
|
|
@@ -81,6 +87,18 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
81
87
|
const { runVerify } = await Promise.resolve().then(() => __importStar(require('./verify')));
|
|
82
88
|
return runVerify(rest);
|
|
83
89
|
}
|
|
90
|
+
if (command === 'init') {
|
|
91
|
+
const { runInit } = await Promise.resolve().then(() => __importStar(require('./init')));
|
|
92
|
+
return runInit(rest);
|
|
93
|
+
}
|
|
94
|
+
if (command === 'doctor') {
|
|
95
|
+
const { runDoctor } = await Promise.resolve().then(() => __importStar(require('./doctor')));
|
|
96
|
+
return runDoctor(rest);
|
|
97
|
+
}
|
|
98
|
+
if (command === 'explain') {
|
|
99
|
+
const { runExplain } = await Promise.resolve().then(() => __importStar(require('./explain')));
|
|
100
|
+
return runExplain(rest);
|
|
101
|
+
}
|
|
84
102
|
process.stderr.write(`agentguard: unknown command '${command}'\n\n`);
|
|
85
103
|
process.stderr.write(HELP);
|
|
86
104
|
return 2;
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BH,oBAqCC;AAhED,oCAAoD;AAEpD,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBZ,CAAC;AAEK,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,cAAc,gCAAwB,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,QAAQ,GAAC,CAAC;QAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;QAC/C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,QAAQ,GAAC,CAAC;QAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;QAC/C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,wDAAa,WAAW,GAAC,CAAC;QACjD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO,OAAO,CAAC,CAAC;IACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8CAA8C;AAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,GAAG,EAAE,EAAE;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export { canonicalJson, sha256Hex, computeEntryHash, computeSignerFingerprint, s
|
|
|
12
12
|
export { InMemorySpendStore } from './store-memory';
|
|
13
13
|
export { SpendGuard, withSpendGuard, AgentGuardBlockedError, type SpendGuardConfig, type OpenAIBindingOptions, } from './spend-guard';
|
|
14
14
|
export { DEFAULT_LOCALE, SUPPORTED_LOCALES, TRANSLATIONS, type SupportedLocale, resolveLocale, t, formatBlockedTrace, type BlockedTraceArgs, } from './i18n';
|
|
15
|
-
export declare const AGENTGUARD_SPEND_VERSION = "0.1.
|
|
15
|
+
export declare const AGENTGUARD_SPEND_VERSION = "0.1.7";
|
|
16
16
|
/** Patent marking. 35 U.S.C. § 287 constructive notice. */
|
|
17
17
|
export declare const PATENT_NOTICE: string;
|
|
18
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -46,7 +46,7 @@ Object.defineProperty(exports, "TRANSLATIONS", { enumerable: true, get: function
|
|
|
46
46
|
Object.defineProperty(exports, "resolveLocale", { enumerable: true, get: function () { return i18n_1.resolveLocale; } });
|
|
47
47
|
Object.defineProperty(exports, "t", { enumerable: true, get: function () { return i18n_1.t; } });
|
|
48
48
|
Object.defineProperty(exports, "formatBlockedTrace", { enumerable: true, get: function () { return i18n_1.formatBlockedTrace; } });
|
|
49
|
-
exports.AGENTGUARD_SPEND_VERSION = '0.1.
|
|
49
|
+
exports.AGENTGUARD_SPEND_VERSION = '0.1.7';
|
|
50
50
|
/** Patent marking. 35 U.S.C. § 287 constructive notice. */
|
|
51
51
|
exports.PATENT_NOTICE = 'Protected by U.S. patent-pending technology ' +
|
|
52
52
|
'(App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626; ' +
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentguard-run/spend",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
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",
|