@agentguard-run/spend 0.13.3 → 0.14.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.
@@ -0,0 +1,486 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HermesKanbanAdapter = void 0;
4
+ exports.createHermesKanbanAdapter = createHermesKanbanAdapter;
5
+ exports.hermesKanbanSignerFingerprint = hermesKanbanSignerFingerprint;
6
+ const crypto_1 = require("crypto");
7
+ const cost_table_1 = require("../cost-table");
8
+ const decision_log_1 = require("../decision-log");
9
+ const dag_1 = require("../receipts/dag");
10
+ const spend_guard_1 = require("../spend-guard");
11
+ const common_1 = require("./common");
12
+ const DEFAULT_PROFILE_MAP = {
13
+ researcher: { capability: 'READ_ONLY', toolAllowlist: ['web.fetch', 'file.read', 'notes.read', 'search.query'] },
14
+ writer: { capability: 'TRANSACT', toolAllowlist: ['draft.create', 'file.write', 'notes.write', 'email.draft'] },
15
+ reviewer: { capability: 'READ_ONLY', toolAllowlist: ['review.read', 'notes.read', 'decision.record'] },
16
+ director: { capability: 'ORCHESTRATE', toolAllowlist: ['task.assign', 'board.plan', 'decision.record'] },
17
+ orchestrator: { capability: 'ORCHESTRATE', toolAllowlist: ['task.assign', 'board.plan', 'decision.record'] },
18
+ };
19
+ const CAPABILITY_RANK = {
20
+ READ_ONLY: 0,
21
+ TRANSACT: 1,
22
+ ADMIN: 2,
23
+ ORCHESTRATE: 3,
24
+ };
25
+ const DATA_PLANE_KEYS = /^(title|summary|prompt|completion|content|messages|input|output|text|raw|source|notes|draft|body|transcript)$/i;
26
+ const SAFE_METADATA_KEYS = new Set([
27
+ 'assignee',
28
+ 'board_hash',
29
+ 'duration_ms',
30
+ 'event',
31
+ 'model',
32
+ 'model_id',
33
+ 'outcome',
34
+ 'priority',
35
+ 'profile',
36
+ 'provider',
37
+ 'risk_score',
38
+ 'state',
39
+ 'task_id',
40
+ 'ticket_id',
41
+ 'token_count',
42
+ 'workflow_id',
43
+ ]);
44
+ function createHermesKanbanAdapter(opts) {
45
+ return new HermesKanbanAdapter(opts);
46
+ }
47
+ class HermesKanbanAdapter {
48
+ opts;
49
+ taskGuards = new Map();
50
+ envelopes = new Map();
51
+ nodesByTaskId = new Map();
52
+ nodes = [];
53
+ profileMap;
54
+ config;
55
+ constructor(opts) {
56
+ this.opts = opts;
57
+ this.profileMap = { ...DEFAULT_PROFILE_MAP, ...(opts.profileMap ?? {}) };
58
+ this.config = opts.config ?? {};
59
+ }
60
+ governTask(input) {
61
+ assertTaskInput(input);
62
+ const profilePolicy = this.profilePolicy(input.profile);
63
+ const capCents = capForTask(input, profilePolicy, this.opts);
64
+ const boardHash = hashValue(input.boardSlug);
65
+ const taskHash = hashValue(input.taskId);
66
+ const scope = { ...this.opts.scope, taskId: input.taskId };
67
+ const envelope = {
68
+ taskId: input.taskId,
69
+ taskHash,
70
+ boardHash,
71
+ profile: normalizeProfile(input.profile),
72
+ state: 'governed',
73
+ capabilityCeiling: profilePolicy.capability,
74
+ toolAllowlist: [...(profilePolicy.toolAllowlist ?? [])],
75
+ capCents,
76
+ parentTaskIds: [...new Set(input.parentTaskIds ?? [])],
77
+ parentEntryHashes: [],
78
+ scope,
79
+ builderCode: safeBuilderCode(input.builderCode),
80
+ createdAt: new Date().toISOString(),
81
+ };
82
+ const taskPolicy = {
83
+ ...this.opts.policy,
84
+ id: `${this.opts.policy.id}:hermes-kanban:${taskHash.slice(0, 12)}`,
85
+ name: `${this.opts.policy.name} Hermes Kanban task`,
86
+ scope,
87
+ caps: [{ window: 'per_day', amountCents: capCents, action: 'block', reason: 'Hermes Kanban task cap' }],
88
+ requiredCapability: spendCapabilityForReceiptCapability(profilePolicy.capability),
89
+ };
90
+ this.envelopes.set(input.taskId, envelope);
91
+ this.taskGuards.set(input.taskId, new spend_guard_1.SpendGuard({
92
+ policy: taskPolicy,
93
+ ...this.config,
94
+ licenseKey: this.opts.licenseKey ?? this.config.licenseKey,
95
+ }));
96
+ return { ...envelope };
97
+ }
98
+ async enforceProviderCall(input) {
99
+ const envelope = this.requireEnvelope(input.taskId);
100
+ assertActive(envelope);
101
+ assertMetadataOnly(input.metadata ?? {});
102
+ validateTokens(input.inputTokens, input.outputTokens);
103
+ const guard = this.requireGuard(input.taskId);
104
+ const model = safeLabel(input.model) ?? this.opts.defaultModel ?? 'openai/gpt-4o-mini';
105
+ const call = {
106
+ provider: input.provider ?? (0, cost_table_1.inferProvider)(model),
107
+ model,
108
+ inputTokens: input.inputTokens,
109
+ outputTokens: input.outputTokens,
110
+ scope: envelope.scope,
111
+ workflowId: envelope.boardHash,
112
+ subagentId: envelope.taskId,
113
+ label: 'hermes-kanban',
114
+ capabilityClaim: spendCapabilityForReceiptCapability(envelope.capabilityCeiling),
115
+ requestShape: (0, common_1.safeRequestShape)({
116
+ framework: 'hermes-kanban',
117
+ event: 'provider-call',
118
+ taskId: envelope.taskId,
119
+ taskHash: envelope.taskHash,
120
+ boardHash: envelope.boardHash,
121
+ profile: envelope.profile,
122
+ metadata: filterReceiptMetadata(input.metadata ?? {}),
123
+ }),
124
+ };
125
+ const { decision, signed } = await guard.decide(call);
126
+ return { allow: decision.action !== 'block', decision, signed };
127
+ }
128
+ async guardCapability(input) {
129
+ const envelope = this.requireEnvelope(input.taskId);
130
+ assertActive(envelope);
131
+ assertMetadataOnly(input.toolArgs ?? {});
132
+ if (CAPABILITY_RANK[input.requestedCapability] > CAPABILITY_RANK[envelope.capabilityCeiling]) {
133
+ return {
134
+ approved: false,
135
+ reason: `Hermes Kanban profile ${envelope.profile} is capped at ${envelope.capabilityCeiling}`,
136
+ };
137
+ }
138
+ if (input.toolName && envelope.toolAllowlist.length > 0 && !toolAllowed(input.toolName, envelope.toolAllowlist)) {
139
+ return { approved: false, reason: `Tool ${input.toolName} is outside the Hermes Kanban profile allowlist` };
140
+ }
141
+ const gate = await this.requireGuard(input.taskId).guardToolCall({
142
+ toolName: input.toolName ?? 'hermes-kanban.tool',
143
+ toolArgs: (0, common_1.safeRequestShape)(input.toolArgs ?? {}),
144
+ workflowId: envelope.boardHash,
145
+ scope: envelope.scope,
146
+ });
147
+ return {
148
+ approved: gate.approved,
149
+ reason: gate.decision.reasons.join('; '),
150
+ signed: gate.signed,
151
+ decision: gate.decision,
152
+ editedArgs: gate.editedArgs,
153
+ };
154
+ }
155
+ async revokeTask(taskId) {
156
+ const envelope = this.requireEnvelope(taskId);
157
+ if (envelope.state === 'revoked')
158
+ return this.receiptResult(envelope, this.requireNode(taskId));
159
+ envelope.state = 'revoked';
160
+ envelope.revokedAt = new Date().toISOString();
161
+ const node = await this.signTaskNode(envelope, {
162
+ event: 'revoked',
163
+ action: 'block',
164
+ blocked: true,
165
+ capability: envelope.capabilityCeiling,
166
+ trustScore: 0.7,
167
+ });
168
+ this.nodesByTaskId.set(taskId, node);
169
+ this.nodes.push(node);
170
+ return this.receiptResult(envelope, node);
171
+ }
172
+ async emitTaskReceipt(input) {
173
+ const envelope = this.requireEnvelope(input.taskId);
174
+ assertActive(envelope);
175
+ assertMetadataOnly(input.metadata ?? {});
176
+ envelope.state = 'completed';
177
+ envelope.completedAt = new Date().toISOString();
178
+ const parentTaskIds = [...new Set(input.parentTaskIds ?? envelope.parentTaskIds)];
179
+ const parentNodes = parentTaskIds.map((id) => this.nodesByTaskId.get(id)).filter(Boolean);
180
+ envelope.parentEntryHashes = parentNodes.map((node) => node.entryHash);
181
+ const capability = input.capability ?? envelope.capabilityCeiling;
182
+ const triggers = reviewerCascadeTriggers(envelope, input, this.opts);
183
+ const node = await this.signTaskNode(envelope, {
184
+ event: 'completed',
185
+ action: 'allow',
186
+ blocked: false,
187
+ capability,
188
+ trustScore: triggers.length > 0 ? 0.9 : 0.94,
189
+ parentNodes,
190
+ metadata: input.metadata,
191
+ modelIds: input.modelIds,
192
+ tokenCounts: input.tokenCounts,
193
+ totalCostCents: input.totalCostCents,
194
+ reviewerCascade: triggers.length > 0 ? buildReviewerCascadeReceipt(input, this.opts, triggers) : undefined,
195
+ });
196
+ this.nodesByTaskId.set(input.taskId, node);
197
+ this.nodes.push(node);
198
+ return this.receiptResult(envelope, node);
199
+ }
200
+ getEnvelope(taskId) {
201
+ const envelope = this.envelopes.get(taskId);
202
+ return envelope ? { ...envelope, parentTaskIds: [...envelope.parentTaskIds], parentEntryHashes: [...envelope.parentEntryHashes], toolAllowlist: [...envelope.toolAllowlist] } : null;
203
+ }
204
+ getReceiptDag(rootTaskId) {
205
+ const root = rootTaskId ? this.nodesByTaskId.get(rootTaskId) : this.nodes[this.nodes.length - 1];
206
+ return {
207
+ nodes: [...this.nodes],
208
+ rootId: root?.entryHash ?? '0'.repeat(64),
209
+ workflowId: this.nodes[0]?.workflowId ?? null,
210
+ };
211
+ }
212
+ outboundPayloads() {
213
+ return [];
214
+ }
215
+ async verifyDag(publicKeyHex) {
216
+ const key = publicKeyHex ?? this.publicKeyHex();
217
+ return (0, dag_1.verifyReceiptDag)(this.getReceiptDag(), key);
218
+ }
219
+ async signTaskNode(envelope, args) {
220
+ if (!this.config.signingKeys)
221
+ throw new Error('Hermes Kanban receipts require signingKeys');
222
+ const parentNodes = args.parentNodes ?? [];
223
+ const decision = taskDecision(envelope, args, this.opts.policy);
224
+ return (0, dag_1.signDagNode)({
225
+ sequence: this.nodes.length,
226
+ decision,
227
+ privateKey: this.config.signingKeys.privateKey,
228
+ publicKey: this.config.signingKeys.publicKey,
229
+ parents: parentNodes,
230
+ workflowId: envelope.boardHash,
231
+ trustScore: args.trustScore,
232
+ blocked: args.blocked,
233
+ capability: args.capability,
234
+ builderCode: envelope.builderCode ?? null,
235
+ });
236
+ }
237
+ receiptResult(envelope, node) {
238
+ return {
239
+ node,
240
+ envelope: { ...envelope, parentTaskIds: [...envelope.parentTaskIds], parentEntryHashes: [...envelope.parentEntryHashes], toolAllowlist: [...envelope.toolAllowlist] },
241
+ dag: this.getReceiptDag(envelope.taskId),
242
+ };
243
+ }
244
+ requireEnvelope(taskId) {
245
+ const envelope = this.envelopes.get(taskId);
246
+ if (!envelope)
247
+ throw new Error(`Unknown Hermes Kanban task ${taskId}`);
248
+ return envelope;
249
+ }
250
+ requireGuard(taskId) {
251
+ const guard = this.taskGuards.get(taskId);
252
+ if (!guard)
253
+ throw new Error(`Unknown Hermes Kanban task ${taskId}`);
254
+ return guard;
255
+ }
256
+ requireNode(taskId) {
257
+ const node = this.nodesByTaskId.get(taskId);
258
+ if (!node)
259
+ throw new Error(`Hermes Kanban task ${taskId} has no receipt`);
260
+ return node;
261
+ }
262
+ profilePolicy(profile) {
263
+ return this.profileMap[normalizeProfile(profile)] ?? { capability: 'READ_ONLY', toolAllowlist: [] };
264
+ }
265
+ publicKeyHex() {
266
+ if (!this.config.signingKeys)
267
+ throw new Error('Hermes Kanban receipts require signingKeys');
268
+ return Buffer.from(this.config.signingKeys.publicKey).toString('hex');
269
+ }
270
+ }
271
+ exports.HermesKanbanAdapter = HermesKanbanAdapter;
272
+ function taskDecision(envelope, args, policy) {
273
+ const parentNodes = args.parentNodes ?? [];
274
+ const inputTokens = safeNonNegativeInteger(args.tokenCounts?.inputTokens);
275
+ const outputTokens = safeNonNegativeInteger(args.tokenCounts?.outputTokens);
276
+ const totalCostCents = safeNonNegativeInteger(args.totalCostCents);
277
+ const receipt = {
278
+ type: 'hermes_kanban_task',
279
+ event: args.event,
280
+ taskId: envelope.taskId,
281
+ taskHash: envelope.taskHash,
282
+ boardHash: envelope.boardHash,
283
+ profile: envelope.profile,
284
+ capability: args.capability,
285
+ capabilityCeiling: envelope.capabilityCeiling,
286
+ state: envelope.state,
287
+ parentTaskIds: [...envelope.parentTaskIds],
288
+ parentEntryHashes: parentNodes.map((node) => node.entryHash),
289
+ parentMsgHashes: parentNodes.map((node) => node.msgHash),
290
+ modelIds: safeModelIds(args.modelIds ?? []),
291
+ inputTokens,
292
+ outputTokens,
293
+ totalCostCents,
294
+ metadata: filterReceiptMetadata(args.metadata ?? {}),
295
+ };
296
+ if (args.reviewerCascade)
297
+ receipt.reviewerCascade = args.reviewerCascade;
298
+ const decision = {
299
+ decisionId: (0, crypto_1.randomUUID)(),
300
+ timestamp: new Date().toISOString(),
301
+ action: args.action,
302
+ triggeredCap: null,
303
+ triggeredScopeKey: null,
304
+ projectedCents: totalCostCents,
305
+ windowSpendBefore: 0,
306
+ windowSpendAfter: totalCostCents,
307
+ provider: 'unknown',
308
+ modelRequested: 'hermes-kanban',
309
+ modelResolved: 'hermes-kanban',
310
+ policyId: policy.id,
311
+ policyVersion: policy.version,
312
+ enforcementMode: policy.mode,
313
+ reasons: [`Hermes Kanban task ${args.event}: ${envelope.taskId}`],
314
+ entryType: 'outcome',
315
+ outcomeReceipt: receipt,
316
+ };
317
+ if (envelope.builderCode)
318
+ decision.builderCode = envelope.builderCode;
319
+ return decision;
320
+ }
321
+ function buildReviewerCascadeReceipt(input, opts, triggers) {
322
+ const cascade = opts.reviewerCascade ?? {};
323
+ return {
324
+ outcome: safeLabel(input.metadata?.outcome) ?? 'hermes_kanban_task',
325
+ drafter: {
326
+ model: cascade.drafterModel ?? opts.defaultModel ?? 'openai/gpt-4o-mini',
327
+ maxCostCents: safeNonNegativeInteger(cascade.drafterMaxCostCents ?? 25),
328
+ },
329
+ reviewer: {
330
+ model: cascade.reviewerModel ?? 'anthropic/claude-sonnet-4-6',
331
+ maxCostCents: safeNonNegativeInteger(cascade.reviewerMaxCostCents ?? 75),
332
+ },
333
+ triggerFired: triggers,
334
+ reviewerVerdict: input.reviewerVerdict ?? 'review_required',
335
+ };
336
+ }
337
+ function reviewerCascadeTriggers(envelope, input, opts) {
338
+ if (opts.reviewerCascade?.enabled === false)
339
+ return [];
340
+ const threshold = opts.reviewerCascade?.highRiskThreshold ?? 0.55;
341
+ const triggers = [];
342
+ if (envelope.profile === 'reviewer')
343
+ triggers.push('reviewer_profile');
344
+ if (typeof input.highRiskClassifierScore === 'number' && input.highRiskClassifierScore >= threshold)
345
+ triggers.push(`risk_score_above:${threshold}`);
346
+ if (input.keywordRisk === true)
347
+ triggers.push('keyword_prefilter');
348
+ return [...new Set(triggers)];
349
+ }
350
+ function capForTask(input, profilePolicy, opts) {
351
+ if (Number.isSafeInteger(profilePolicy.capCents) && profilePolicy.capCents >= 0)
352
+ return profilePolicy.capCents;
353
+ const runtimeMinutes = runtimeMinutesFor(input);
354
+ const runtimeBudget = opts.runtimeBudgetCentsPerMinute ?? 10;
355
+ const cap = Math.ceil(runtimeMinutes * runtimeBudget);
356
+ return Math.max(1, Math.min(cap, opts.defaultCapCents ?? cap));
357
+ }
358
+ function runtimeMinutesFor(input) {
359
+ if (Number.isFinite(input.maxRuntimeMinutes) && input.maxRuntimeMinutes > 0)
360
+ return input.maxRuntimeMinutes;
361
+ if (Number.isFinite(input.maxRuntimeMs) && input.maxRuntimeMs > 0)
362
+ return input.maxRuntimeMs / 60_000;
363
+ return 5;
364
+ }
365
+ function spendCapabilityForReceiptCapability(capability) {
366
+ if (capability === 'ORCHESTRATE')
367
+ return 'payment_execute';
368
+ if (capability === 'ADMIN')
369
+ return 'payment_initiate';
370
+ if (capability === 'TRANSACT')
371
+ return 'data_write';
372
+ return 'read_only';
373
+ }
374
+ function assertTaskInput(input) {
375
+ assertPlainRecord(input, 'task');
376
+ const allowed = new Set(['taskId', 'boardSlug', 'profile', 'parentTaskIds', 'maxRuntimeMinutes', 'maxRuntimeMs', 'metadata', 'builderCode']);
377
+ for (const key of Object.keys(input)) {
378
+ if (!allowed.has(key))
379
+ throw new Error(`Hermes Kanban task input cannot include data-plane or unknown field: ${key}`);
380
+ }
381
+ if (!safeLabel(input.taskId))
382
+ throw new Error('Hermes Kanban taskId is required');
383
+ if (!safeLabel(input.boardSlug))
384
+ throw new Error('Hermes Kanban boardSlug is required');
385
+ if (!safeLabel(input.profile))
386
+ throw new Error('Hermes Kanban profile is required');
387
+ assertMetadataOnly(input.metadata ?? {});
388
+ for (const parent of input.parentTaskIds ?? []) {
389
+ if (!safeLabel(parent))
390
+ throw new Error('Hermes Kanban parent task id must be a metadata identifier');
391
+ }
392
+ }
393
+ function assertMetadataOnly(value, path = 'metadata') {
394
+ if (value == null)
395
+ return;
396
+ if (Array.isArray(value)) {
397
+ for (let i = 0; i < value.length; i++)
398
+ assertMetadataOnly(value[i], `${path}[${i}]`);
399
+ return;
400
+ }
401
+ if (typeof value !== 'object')
402
+ return;
403
+ for (const [key, child] of Object.entries(value)) {
404
+ if (DATA_PLANE_KEYS.test(key))
405
+ throw new Error(`Hermes Kanban metadata cannot include data-plane field: ${path}.${key}`);
406
+ assertMetadataOnly(child, `${path}.${key}`);
407
+ }
408
+ }
409
+ function assertPlainRecord(value, name) {
410
+ if (!value || typeof value !== 'object' || Array.isArray(value))
411
+ throw new Error(`Hermes Kanban ${name} must be an object`);
412
+ }
413
+ function assertActive(envelope) {
414
+ if (envelope.state === 'revoked')
415
+ throw new spend_guard_1.AgentGuardBlockedError(blockedDecision(envelope, 'revoked'), envelope.scope);
416
+ if (envelope.state === 'completed')
417
+ throw new spend_guard_1.AgentGuardBlockedError(blockedDecision(envelope, 'completed'), envelope.scope);
418
+ }
419
+ function blockedDecision(envelope, state) {
420
+ return {
421
+ decisionId: (0, crypto_1.randomUUID)(),
422
+ timestamp: new Date().toISOString(),
423
+ action: 'block',
424
+ triggeredCap: null,
425
+ triggeredScopeKey: null,
426
+ projectedCents: 0,
427
+ windowSpendBefore: 0,
428
+ windowSpendAfter: 0,
429
+ provider: 'unknown',
430
+ modelRequested: 'hermes-kanban',
431
+ modelResolved: 'hermes-kanban',
432
+ policyId: 'hermes-kanban',
433
+ policyVersion: 1,
434
+ enforcementMode: 'enforce',
435
+ reasons: [`Hermes Kanban task ${envelope.taskId} is ${state}`],
436
+ };
437
+ }
438
+ function filterReceiptMetadata(metadata) {
439
+ assertMetadataOnly(metadata);
440
+ const out = {};
441
+ for (const [key, value] of Object.entries(metadata)) {
442
+ if (!SAFE_METADATA_KEYS.has(key))
443
+ continue;
444
+ if (value == null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
445
+ out[key] = value;
446
+ }
447
+ }
448
+ return out;
449
+ }
450
+ function validateTokens(inputTokens, outputTokens) {
451
+ if (!Number.isSafeInteger(inputTokens) || inputTokens < 0)
452
+ throw new Error('inputTokens must be a non-negative safe integer');
453
+ if (!Number.isSafeInteger(outputTokens) || outputTokens < 0)
454
+ throw new Error('outputTokens must be a non-negative safe integer');
455
+ }
456
+ function hashValue(value) {
457
+ return (0, decision_log_1.sha256Hex)((0, decision_log_1.canonicalJson)({ value }));
458
+ }
459
+ function normalizeProfile(profile) {
460
+ return profile.trim().toLowerCase().replace(/[^a-z0-9_.:-]/g, '_');
461
+ }
462
+ function safeLabel(value) {
463
+ if (typeof value !== 'string')
464
+ return undefined;
465
+ const trimmed = value.trim();
466
+ if (!trimmed || !/^[A-Za-z0-9_.:/-]{1,160}$/.test(trimmed))
467
+ return undefined;
468
+ return trimmed;
469
+ }
470
+ function safeBuilderCode(value) {
471
+ const label = safeLabel(value);
472
+ return label ? label.slice(0, 64) : undefined;
473
+ }
474
+ function safeModelIds(models) {
475
+ return models.map((model) => safeLabel(model)).filter(Boolean);
476
+ }
477
+ function safeNonNegativeInteger(value) {
478
+ return Number.isSafeInteger(value) && value >= 0 ? value : 0;
479
+ }
480
+ function toolAllowed(toolName, allowlist) {
481
+ return allowlist.some((allowed) => toolName === allowed || toolName.startsWith(`${allowed}.`));
482
+ }
483
+ function hermesKanbanSignerFingerprint(opts) {
484
+ return opts.config?.signingKeys ? (0, decision_log_1.computeSignerFingerprint)(opts.config.signingKeys.publicKey) : null;
485
+ }
486
+ //# sourceMappingURL=hermes-kanban.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-kanban.js","sourceRoot":"","sources":["../../src/frameworks/hermes-kanban.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,5 @@ export * from './openrouter';
3
3
  export * from './vercel-ai';
4
4
  export * from './claude-code';
5
5
  export * from './hermes';
6
+ export * from './hermes-kanban';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/frameworks/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/frameworks/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC"}
@@ -19,4 +19,5 @@ __exportStar(require("./openrouter"), exports);
19
19
  __exportStar(require("./vercel-ai"), exports);
20
20
  __exportStar(require("./claude-code"), exports);
21
21
  __exportStar(require("./hermes"), exports);
22
+ __exportStar(require("./hermes-kanban"), exports);
22
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/frameworks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,+CAA6B;AAC7B,8CAA4B;AAC5B,gDAA8B;AAC9B,2CAAyB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/frameworks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,+CAA6B;AAC7B,8CAA4B;AAC5B,gDAA8B;AAC9B,2CAAyB;AACzB,kDAAgC"}
package/dist/index.d.ts CHANGED
@@ -33,7 +33,7 @@ export { withSpendGuardAnthropic, type AnthropicBindingOptions } from './binding
33
33
  export { withSpendGuardBedrock, type BedrockBindingOptions } from './bindings/bedrock';
34
34
  export { recommend, defaultKey, type ModelRouteRecommendation, type RecommendOptions } from './router';
35
35
  export { DEFAULT_LOCALE, SUPPORTED_LOCALES, TRANSLATIONS, type SupportedLocale, resolveLocale, t, formatBlockedTrace, type BlockedTraceArgs, } from './i18n';
36
- export declare const AGENTGUARD_SPEND_VERSION = "0.13.3";
36
+ export declare const AGENTGUARD_SPEND_VERSION = "0.14.0";
37
37
  export declare const agentguard: {
38
38
  workflow: typeof runWorkflow;
39
39
  };
package/dist/index.js CHANGED
@@ -161,7 +161,7 @@ Object.defineProperty(exports, "TRANSLATIONS", { enumerable: true, get: function
161
161
  Object.defineProperty(exports, "resolveLocale", { enumerable: true, get: function () { return i18n_1.resolveLocale; } });
162
162
  Object.defineProperty(exports, "t", { enumerable: true, get: function () { return i18n_1.t; } });
163
163
  Object.defineProperty(exports, "formatBlockedTrace", { enumerable: true, get: function () { return i18n_1.formatBlockedTrace; } });
164
- exports.AGENTGUARD_SPEND_VERSION = '0.13.3';
164
+ exports.AGENTGUARD_SPEND_VERSION = '0.14.0';
165
165
  exports.agentguard = {
166
166
  workflow: context_1.workflow,
167
167
  };
package/dist/telemetry.js CHANGED
@@ -43,7 +43,7 @@ const https = __importStar(require("https"));
43
43
  const os = __importStar(require("os"));
44
44
  const path = __importStar(require("path"));
45
45
  const crypto_1 = require("crypto");
46
- const AGENTGUARD_SPEND_VERSION = '0.13.1';
46
+ const AGENTGUARD_SPEND_VERSION = '0.14.0';
47
47
  const STATE_DIR = path.join(os.homedir(), '.agentguard');
48
48
  const INSTALL_PATH = path.join(STATE_DIR, 'install.json');
49
49
  const BEACON_URL = 'https://agentguard.run/api/beacon';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentguard-run/spend",
3
- "version": "0.13.3",
3
+ "version": "0.14.0",
4
4
  "description": "All terminology and labels used in AgentGuard materials are descriptive of software functionality only, not legal definitions or guarantees of compliance. Terms like receipt, audit log, evidence, audit trail, and attestation refer solely to cryptographically-signed records produced by the software. Full functional-use disclaimer in README.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -100,6 +100,11 @@
100
100
  "require": "./dist/frameworks/hermes.js",
101
101
  "default": "./dist/frameworks/hermes.js"
102
102
  },
103
+ "./frameworks/hermes-kanban": {
104
+ "types": "./dist/frameworks/hermes-kanban.d.ts",
105
+ "require": "./dist/frameworks/hermes-kanban.js",
106
+ "default": "./dist/frameworks/hermes-kanban.js"
107
+ },
103
108
  "./frameworks/openrouter": {
104
109
  "types": "./dist/frameworks/openrouter.d.ts",
105
110
  "require": "./dist/frameworks/openrouter.js",