@agentguard-run/spend 0.15.4 → 0.15.6
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/README.md +11 -0
- package/dist/adapters/ndjson-store.d.ts +45 -0
- package/dist/adapters/ndjson-store.d.ts.map +1 -0
- package/dist/adapters/ndjson-store.js +132 -0
- package/dist/adapters/ndjson-store.js.map +1 -0
- package/dist/bindings/anthropic.d.ts +3 -1
- package/dist/bindings/anthropic.d.ts.map +1 -1
- package/dist/bindings/anthropic.js +1 -0
- package/dist/bindings/anthropic.js.map +1 -1
- package/dist/bindings/bedrock.d.ts +3 -1
- package/dist/bindings/bedrock.d.ts.map +1 -1
- package/dist/bindings/bedrock.js +1 -0
- package/dist/bindings/bedrock.js.map +1 -1
- package/dist/cli/demo.d.ts.map +1 -1
- package/dist/cli/demo.js +73 -0
- package/dist/cli/demo.js.map +1 -1
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +86 -34
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/wizard.d.ts +12 -1
- package/dist/cli/wizard.d.ts.map +1 -1
- package/dist/cli/wizard.js +35 -5
- package/dist/cli/wizard.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/spend-guard.d.ts +3 -1
- package/dist/spend-guard.d.ts.map +1 -1
- package/dist/spend-guard.js +1 -0
- package/dist/spend-guard.js.map +1 -1
- package/package.json +1 -1
- package/src/bindings/anthropic.ts +4 -1
- package/src/bindings/bedrock.ts +4 -1
- package/src/cli/wizard.ts +40 -5
package/README.md
CHANGED
|
@@ -86,7 +86,18 @@ const response = await guardedClient.chat.completions.create({
|
|
|
86
86
|
|
|
87
87
|
Then run your agent. AgentGuard decides locally before any provider call starts, signs the receipt, and applies allow, downgrade, shadow, or block.
|
|
88
88
|
|
|
89
|
+
By default the wizard wires a file-backed `NdjsonDecisionLogStore` and a locally generated Ed25519 signing key, so every decision is signed and appended to `~/.agentguard/my-tenant/decisions.ndjson` with no extra setup.
|
|
89
90
|
|
|
91
|
+
### See it: run `agentguard serve`
|
|
92
|
+
|
|
93
|
+
After your agent runs (or after `agentguard demo`), open the local dashboard to SEE governed spend, the dollars saved by policy, per-agent and per-provider breakdowns, and a tamper-evidence badge with click-to-verify receipts:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
agentguard serve
|
|
97
|
+
# → dashboard at http://localhost:8787
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The dashboard reads only your local `~/.agentguard/*/decisions.ndjson`. No outbound network calls.
|
|
90
101
|
|
|
91
102
|
## Workflow-level caps
|
|
92
103
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-backed DecisionLogStore.
|
|
3
|
+
*
|
|
4
|
+
* Appends one signed decision entry per line (NDJSON) to
|
|
5
|
+
* ~/.agentguard/<tenant>/decisions.ndjson
|
|
6
|
+
*
|
|
7
|
+
* This is the default persistence used by the CLI/wizard path so that a signed
|
|
8
|
+
* ledger survives across process runs and can be read by `agentguard serve`
|
|
9
|
+
* and `aggregateLedger` without the user having to wire up Postgres or Redis.
|
|
10
|
+
*
|
|
11
|
+
* Same interface as PostgresDecisionLogStore / InMemoryDecisionLogStore. The
|
|
12
|
+
* append is line-atomic (fs.appendFileSync of a single "\n"-terminated line),
|
|
13
|
+
* so concurrent writers do not interleave partial lines. Ordering/chain
|
|
14
|
+
* integrity remains the SpendGuard decision lock's responsibility.
|
|
15
|
+
*
|
|
16
|
+
* When `publicKeyHex` is supplied, it is embedded on each written line so that
|
|
17
|
+
* `agentguard serve`'s click-to-verify and `aggregateLedger` integrity checks
|
|
18
|
+
* can recover the verifying key from the ledger itself. The extra field is
|
|
19
|
+
* ignored by the DecisionLogStore read path (only SignedDecisionLogEntry fields
|
|
20
|
+
* are consumed by the SDK).
|
|
21
|
+
*
|
|
22
|
+
* Patent notice: Protected by U.S. patent-pending technology
|
|
23
|
+
* (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
|
|
24
|
+
* 64/071,781; 64/071,789).
|
|
25
|
+
*/
|
|
26
|
+
import type { SignedDecisionLogEntry, DecisionLogStore } from '../types';
|
|
27
|
+
export interface NdjsonStoreOptions {
|
|
28
|
+
/** Base directory. Defaults to AGENTGUARD_HOME or ~/.agentguard. */
|
|
29
|
+
home?: string;
|
|
30
|
+
/** Optional hex public key embedded per line so the ledger is self-verifying. */
|
|
31
|
+
publicKeyHex?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class NdjsonDecisionLogStore implements DecisionLogStore {
|
|
34
|
+
readonly filePath: string;
|
|
35
|
+
private readonly publicKeyHex?;
|
|
36
|
+
constructor(tenant: string, options?: NdjsonStoreOptions);
|
|
37
|
+
append(entry: SignedDecisionLogEntry): Promise<void>;
|
|
38
|
+
getLatest(signerFingerprint?: string): Promise<SignedDecisionLogEntry | null>;
|
|
39
|
+
read(fromSequence: number, limit: number, signerFingerprint?: string): Promise<SignedDecisionLogEntry[]>;
|
|
40
|
+
/** Remove the underlying file (used by deterministic flows like `agentguard demo`). */
|
|
41
|
+
reset(): void;
|
|
42
|
+
/** Parsed entries in sequence order, optionally filtered by signer. */
|
|
43
|
+
private readAll;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=ndjson-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ndjson-store.d.ts","sourceRoot":"","sources":["../../src/adapters/ndjson-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;gBAE3B,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;IAOtD,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD,SAAS,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAK7E,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAO9G,uFAAuF;IACvF,KAAK,IAAI,IAAI;IAQb,uEAAuE;IACvE,OAAO,CAAC,OAAO;CAqBhB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* File-backed DecisionLogStore.
|
|
4
|
+
*
|
|
5
|
+
* Appends one signed decision entry per line (NDJSON) to
|
|
6
|
+
* ~/.agentguard/<tenant>/decisions.ndjson
|
|
7
|
+
*
|
|
8
|
+
* This is the default persistence used by the CLI/wizard path so that a signed
|
|
9
|
+
* ledger survives across process runs and can be read by `agentguard serve`
|
|
10
|
+
* and `aggregateLedger` without the user having to wire up Postgres or Redis.
|
|
11
|
+
*
|
|
12
|
+
* Same interface as PostgresDecisionLogStore / InMemoryDecisionLogStore. The
|
|
13
|
+
* append is line-atomic (fs.appendFileSync of a single "\n"-terminated line),
|
|
14
|
+
* so concurrent writers do not interleave partial lines. Ordering/chain
|
|
15
|
+
* integrity remains the SpendGuard decision lock's responsibility.
|
|
16
|
+
*
|
|
17
|
+
* When `publicKeyHex` is supplied, it is embedded on each written line so that
|
|
18
|
+
* `agentguard serve`'s click-to-verify and `aggregateLedger` integrity checks
|
|
19
|
+
* can recover the verifying key from the ledger itself. The extra field is
|
|
20
|
+
* ignored by the DecisionLogStore read path (only SignedDecisionLogEntry fields
|
|
21
|
+
* are consumed by the SDK).
|
|
22
|
+
*
|
|
23
|
+
* Patent notice: Protected by U.S. patent-pending technology
|
|
24
|
+
* (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
|
|
25
|
+
* 64/071,781; 64/071,789).
|
|
26
|
+
*/
|
|
27
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
30
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
31
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
32
|
+
}
|
|
33
|
+
Object.defineProperty(o, k2, desc);
|
|
34
|
+
}) : (function(o, m, k, k2) {
|
|
35
|
+
if (k2 === undefined) k2 = k;
|
|
36
|
+
o[k2] = m[k];
|
|
37
|
+
}));
|
|
38
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
39
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
40
|
+
}) : function(o, v) {
|
|
41
|
+
o["default"] = v;
|
|
42
|
+
});
|
|
43
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
44
|
+
var ownKeys = function(o) {
|
|
45
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
46
|
+
var ar = [];
|
|
47
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
48
|
+
return ar;
|
|
49
|
+
};
|
|
50
|
+
return ownKeys(o);
|
|
51
|
+
};
|
|
52
|
+
return function (mod) {
|
|
53
|
+
if (mod && mod.__esModule) return mod;
|
|
54
|
+
var result = {};
|
|
55
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
56
|
+
__setModuleDefault(result, mod);
|
|
57
|
+
return result;
|
|
58
|
+
};
|
|
59
|
+
})();
|
|
60
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
+
exports.NdjsonDecisionLogStore = void 0;
|
|
62
|
+
const fs = __importStar(require("fs"));
|
|
63
|
+
const os = __importStar(require("os"));
|
|
64
|
+
const path = __importStar(require("path"));
|
|
65
|
+
function defaultHome() {
|
|
66
|
+
return process.env.AGENTGUARD_HOME || path.join(os.homedir(), '.agentguard');
|
|
67
|
+
}
|
|
68
|
+
class NdjsonDecisionLogStore {
|
|
69
|
+
filePath;
|
|
70
|
+
publicKeyHex;
|
|
71
|
+
constructor(tenant, options = {}) {
|
|
72
|
+
const cleanTenant = String(tenant || 'default').replace(/[^A-Za-z0-9._-]/g, '_') || 'default';
|
|
73
|
+
const home = options.home ?? defaultHome();
|
|
74
|
+
this.filePath = path.join(home, cleanTenant, 'decisions.ndjson');
|
|
75
|
+
this.publicKeyHex = options.publicKeyHex;
|
|
76
|
+
}
|
|
77
|
+
async append(entry) {
|
|
78
|
+
fs.mkdirSync(path.dirname(this.filePath), { recursive: true });
|
|
79
|
+
const record = { ...entry };
|
|
80
|
+
if (this.publicKeyHex)
|
|
81
|
+
record.publicKeyHex = this.publicKeyHex;
|
|
82
|
+
fs.appendFileSync(this.filePath, JSON.stringify(record) + '\n');
|
|
83
|
+
}
|
|
84
|
+
async getLatest(signerFingerprint) {
|
|
85
|
+
const entries = this.readAll(signerFingerprint);
|
|
86
|
+
return entries.length ? entries[entries.length - 1] : null;
|
|
87
|
+
}
|
|
88
|
+
async read(fromSequence, limit, signerFingerprint) {
|
|
89
|
+
const entries = this.readAll(signerFingerprint);
|
|
90
|
+
const start = entries.findIndex((e) => e.sequence >= fromSequence);
|
|
91
|
+
if (start === -1)
|
|
92
|
+
return [];
|
|
93
|
+
return entries.slice(start, start + limit);
|
|
94
|
+
}
|
|
95
|
+
/** Remove the underlying file (used by deterministic flows like `agentguard demo`). */
|
|
96
|
+
reset() {
|
|
97
|
+
try {
|
|
98
|
+
fs.rmSync(this.filePath, { force: true });
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// best-effort
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Parsed entries in sequence order, optionally filtered by signer. */
|
|
105
|
+
readAll(signerFingerprint) {
|
|
106
|
+
let content;
|
|
107
|
+
try {
|
|
108
|
+
content = fs.readFileSync(this.filePath, 'utf-8');
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
const out = [];
|
|
114
|
+
for (const line of content.split('\n')) {
|
|
115
|
+
if (!line.trim())
|
|
116
|
+
continue;
|
|
117
|
+
try {
|
|
118
|
+
const parsed = JSON.parse(line);
|
|
119
|
+
if (signerFingerprint && parsed.signerFingerprint !== signerFingerprint)
|
|
120
|
+
continue;
|
|
121
|
+
out.push(parsed);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// skip malformed line
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
out.sort((a, b) => (a.sequence ?? 0) - (b.sequence ?? 0));
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.NdjsonDecisionLogStore = NdjsonDecisionLogStore;
|
|
132
|
+
//# sourceMappingURL=ndjson-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ndjson-store.js","sourceRoot":"","sources":["../../src/adapters/ndjson-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/** Native Anthropic binding for AgentGuard Spend. */
|
|
2
|
-
import type { CapabilityTier, SpendPolicy, SpendScope } from '../types';
|
|
2
|
+
import type { CapabilityTier, AttestationChainInput, SpendPolicy, SpendScope } from '../types';
|
|
3
3
|
import { type SpendGuardConfig } from '../spend-guard';
|
|
4
4
|
export interface AnthropicBindingOptions {
|
|
5
5
|
policy: SpendPolicy;
|
|
6
6
|
scope: SpendScope;
|
|
7
7
|
capabilityClaim?: CapabilityTier;
|
|
8
|
+
/** Optional DAG-TAT chain backing the capability claim (required when policy.attestation lists it). */
|
|
9
|
+
attestation?: AttestationChainInput;
|
|
8
10
|
config?: Omit<SpendGuardConfig, 'policy'>;
|
|
9
11
|
}
|
|
10
12
|
export declare function withSpendGuardAnthropic(client: any, opts: AnthropicBindingOptions): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/bindings/anthropic.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,KAAK,EAAE,cAAc,EAAyB,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/bindings/anthropic.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAyB,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtH,OAAO,EAGL,KAAK,gBAAgB,EAMtB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,uGAAuG;IACvG,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;CAC3C;AAED,wBAAgB,uBAAuB,CAErC,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,uBAAuB,GAE5B,GAAG,CAyCL"}
|
|
@@ -56,6 +56,7 @@ function buildAnthropicCall(params, guard, opts) {
|
|
|
56
56
|
outputTokens: (0, spend_guard_1.outputTokensFromParams)(params),
|
|
57
57
|
scope: opts.scope,
|
|
58
58
|
capabilityClaim: opts.capabilityClaim,
|
|
59
|
+
attestation: opts.attestation,
|
|
59
60
|
label: stringValue(metadata?.label),
|
|
60
61
|
workflowId: stringValue(metadata?.workflow_id) || stringValue(metadata?.workflowId),
|
|
61
62
|
subagentId: stringValue(metadata?.subagent_id) || stringValue(metadata?.subagentId),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/bindings/anthropic.ts"],"names":[],"mappings":";AAAA,qDAAqD;;
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/bindings/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/** Native AWS Bedrock binding for AgentGuard Spend. */
|
|
2
|
-
import type { CapabilityTier, SpendPolicy, SpendScope } from '../types';
|
|
2
|
+
import type { CapabilityTier, AttestationChainInput, SpendPolicy, SpendScope } from '../types';
|
|
3
3
|
import { type SpendGuardConfig } from '../spend-guard';
|
|
4
4
|
export interface BedrockBindingOptions {
|
|
5
5
|
policy: SpendPolicy;
|
|
6
6
|
scope: SpendScope;
|
|
7
7
|
capabilityClaim?: CapabilityTier;
|
|
8
|
+
/** Optional DAG-TAT chain backing the capability claim (required when policy.attestation lists it). */
|
|
9
|
+
attestation?: AttestationChainInput;
|
|
8
10
|
config?: Omit<SpendGuardConfig, 'policy'>;
|
|
9
11
|
}
|
|
10
12
|
export declare function withSpendGuardBedrock(client: any, opts: BedrockBindingOptions): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../src/bindings/bedrock.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAyB,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../src/bindings/bedrock.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAyB,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtH,OAAO,EAGL,KAAK,gBAAgB,EAKtB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,uGAAuG;IACvG,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;CAC3C;AAOD,wBAAgB,qBAAqB,CAEnC,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,qBAAqB,GAE1B,GAAG,CAgCL"}
|
package/dist/bindings/bedrock.js
CHANGED
|
@@ -56,6 +56,7 @@ function buildBedrockCall(command, guard, opts) {
|
|
|
56
56
|
outputTokens: outputTokensFromBody(body),
|
|
57
57
|
scope: opts.scope,
|
|
58
58
|
capabilityClaim: opts.capabilityClaim,
|
|
59
|
+
attestation: opts.attestation,
|
|
59
60
|
label: stringValue(metadata?.label),
|
|
60
61
|
workflowId: stringValue(metadata?.workflow_id) || stringValue(metadata?.workflowId),
|
|
61
62
|
subagentId: stringValue(metadata?.subagent_id) || stringValue(metadata?.subagentId),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/bindings/bedrock.ts"],"names":[],"mappings":";AAAA,uDAAuD;;
|
|
1
|
+
{"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/bindings/bedrock.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/demo.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwBH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkO7D"}
|
package/dist/cli/demo.js
CHANGED
|
@@ -50,6 +50,7 @@ const os = __importStar(require("os"));
|
|
|
50
50
|
const path = __importStar(require("path"));
|
|
51
51
|
const ed = __importStar(require("@noble/ed25519"));
|
|
52
52
|
const decision_log_1 = require("../decision-log");
|
|
53
|
+
const ndjson_store_1 = require("../adapters/ndjson-store");
|
|
53
54
|
const i18n_1 = require("../i18n");
|
|
54
55
|
const index_1 = require("../index");
|
|
55
56
|
const colors_1 = require("./colors");
|
|
@@ -171,6 +172,78 @@ async function runDemo(argv) {
|
|
|
171
172
|
catch {
|
|
172
173
|
// best-effort persist; demo still prints if disk write fails
|
|
173
174
|
}
|
|
175
|
+
// Persist a signed, hash-chained ledger to ~/.agentguard/demo/decisions.ndjson
|
|
176
|
+
// so `agentguard serve` shows a populated dashboard (spend + $ saved by policy +
|
|
177
|
+
// verifiable trail). Deterministic: the file is reset on each run.
|
|
178
|
+
try {
|
|
179
|
+
const publicKeyHex = Buffer.from(publicKey).toString('hex');
|
|
180
|
+
const store = new ndjson_store_1.NdjsonDecisionLogStore('demo', { publicKeyHex });
|
|
181
|
+
store.reset();
|
|
182
|
+
// seq 0: the BLOCKED marketing decision (already signed above) — the $ saved line.
|
|
183
|
+
await store.append(signedEntry);
|
|
184
|
+
// seq 1: an ALLOWED governed call so "Spent" and "Allowed" are non-zero.
|
|
185
|
+
const allowedDecision = {
|
|
186
|
+
decisionId: 'agentguard-demo-decision-allow-v1',
|
|
187
|
+
timestamp: '2026-05-24T18:05:00.000Z',
|
|
188
|
+
policyId: decision.policyId,
|
|
189
|
+
policyVersion: 1,
|
|
190
|
+
enforcementMode: 'enforce',
|
|
191
|
+
action: 'allow',
|
|
192
|
+
reasons: ['Within all caps'],
|
|
193
|
+
provider: 'anthropic',
|
|
194
|
+
modelRequested: 'claude-sonnet-4-5',
|
|
195
|
+
modelResolved: 'claude-sonnet-4-5',
|
|
196
|
+
projectedCents: 4231, // $42.31
|
|
197
|
+
windowSpendBefore: 0,
|
|
198
|
+
windowSpendAfter: 4231,
|
|
199
|
+
triggeredCap: null,
|
|
200
|
+
triggeredScopeKey: `tenantId=demo|agentId=${agentId}`,
|
|
201
|
+
};
|
|
202
|
+
const signedAllowed = await (0, decision_log_1.signDecision)({
|
|
203
|
+
sequence: 1,
|
|
204
|
+
decision: allowedDecision,
|
|
205
|
+
previousHash: signedEntry.entryHash,
|
|
206
|
+
privateKey: privateSeed,
|
|
207
|
+
publicKey,
|
|
208
|
+
});
|
|
209
|
+
await store.append(signedAllowed);
|
|
210
|
+
// seq 2: a DOWNGRADED call routed to a cheaper model — the "Downgraded" line +
|
|
211
|
+
// additional savings (requested vs resolved).
|
|
212
|
+
const downgradeDecision = {
|
|
213
|
+
decisionId: 'agentguard-demo-decision-downgrade-v1',
|
|
214
|
+
timestamp: '2026-05-24T18:10:00.000Z',
|
|
215
|
+
policyId: decision.policyId,
|
|
216
|
+
policyVersion: 1,
|
|
217
|
+
enforcementMode: 'enforce',
|
|
218
|
+
action: 'downgrade',
|
|
219
|
+
reasons: ['Per-call cap reached, routed to fallback model'],
|
|
220
|
+
provider: 'anthropic',
|
|
221
|
+
modelRequested: 'claude-opus-4-7',
|
|
222
|
+
modelResolved: 'claude-haiku-4-5',
|
|
223
|
+
projectedCents: 8000, // $80.00 projected for the requested (expensive) model
|
|
224
|
+
windowSpendBefore: 4231,
|
|
225
|
+
windowSpendAfter: 5211,
|
|
226
|
+
triggeredCap: {
|
|
227
|
+
amountCents: 5000,
|
|
228
|
+
window: 'per_call',
|
|
229
|
+
action: 'downgrade',
|
|
230
|
+
reason: 'Per-call budget reached, routing to fallback model',
|
|
231
|
+
},
|
|
232
|
+
triggeredScopeKey: `tenantId=demo|agentId=${agentId}`,
|
|
233
|
+
actualCents: 980,
|
|
234
|
+
};
|
|
235
|
+
const signedDowngrade = await (0, decision_log_1.signDecision)({
|
|
236
|
+
sequence: 2,
|
|
237
|
+
decision: downgradeDecision,
|
|
238
|
+
previousHash: signedAllowed.entryHash,
|
|
239
|
+
privateKey: privateSeed,
|
|
240
|
+
publicKey,
|
|
241
|
+
});
|
|
242
|
+
await store.append(signedDowngrade);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// best-effort; demo still prints and the single-entry receipt persists above
|
|
246
|
+
}
|
|
174
247
|
const receiptId = entryHash.slice(0, 16);
|
|
175
248
|
console.log((0, colors_1.dim)(' ───────────────────────────────────────────'));
|
|
176
249
|
console.log(` ${(0, colors_1.dim)('receipt ')} ${receiptId}${(0, colors_1.dim)('...')}`);
|
package/dist/cli/demo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/serve.d.ts
CHANGED
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
*
|
|
7
7
|
* No outbound network calls. Pure Node stdlib HTTP server.
|
|
8
8
|
*/
|
|
9
|
-
export declare const DASHBOARD_HTML = "<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\" />\n<title>AgentGuard Spend \u00B7 Local Dashboard</title>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n<style>\n:root { --bg:#07101E; --surface:#0C1828; --surface-2:#0F1F35; --border:rgba(42,188,180,0.18); --border-dim:rgba(255,255,255,0.08); --teal:#2abcb4; --teal-glow:rgba(42,188,180,0.15); --text:#FFF; --text-2:#DCE8F0; --muted:#8AA0B3; --green:#4ade80; --amber:#F1C40F; --red:#FF6B6B; --code:#E6F0F5; }\n* { box-sizing: border-box; margin: 0; padding: 0; }\nhtml, body { background: var(--bg); color: var(--text-2); font-family: 'DM Sans', -apple-system, system-ui, sans-serif; font-size: 15px; min-height: 100vh; -webkit-font-smoothing: antialiased; }\na { color: var(--teal); text-decoration: none; } a:hover { text-decoration: underline; }\ncode, .mono { font-family: 'JetBrains Mono', monospace; font-size: 13px; }\n.topbar { display: flex; align-items: center; justify-content: space-between; padding: 16px 32px; border-bottom: 1px solid var(--border-dim); background: rgba(7,16,30,0.92); backdrop-filter: blur(10px); position: sticky; top: 0; z-index: 50; }\n.brand { display: inline-flex; align-items: center; gap: 12px; }\n.brand .hex { width: 22px; height: 22px; background: var(--teal); color: var(--bg); display: inline-flex; align-items: center; justify-content: center; font-weight: 800; font-size: 13px; border-radius: 4px; }\n.brand .name { font-family: 'Cormorant Garamond', Georgia, serif; font-size: 22px; color: var(--text); }\n.brand .name .accent { color: var(--teal); }\n.brand .tag { margin-left: 8px; font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--teal); padding: 3px 8px; border: 1px solid var(--border); border-radius: 3px; }\n.refresh-btn { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--teal); background: transparent; border: 1px solid var(--teal); border-radius: 4px; padding: 7px 14px; cursor: pointer; }\n.refresh-btn:hover { background: var(--teal-glow); }\n.shell { padding: 32px; max-width: 1280px; margin: 0 auto; }\n.stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 28px; }\n@media (max-width: 800px) { .stats-row { grid-template-columns: repeat(2, 1fr); } }\n.stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.stat-card .label { font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--muted); margin-bottom: 8px; }\n.stat-card .value { font-size: 28px; font-weight: 800; color: var(--text); font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }\n.stat-card.green .value { color: var(--green); }\n.stat-card.red .value { color: var(--red); }\n.stat-card.amber .value { color: var(--amber); }\n.stat-card .sub { color: var(--muted); font-size: 12px; margin-top: 4px; }\n.section { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 24px 26px; margin-bottom: 24px; }\n.section h2 { font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--teal); margin-bottom: 16px; }\n.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }\n@media (max-width: 800px) { .two-col { grid-template-columns: 1fr; } }\n.bar-row { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border-dim); font-size: 13.5px; }\n.bar-row:last-child { border-bottom: none; }\n.bar-row .name { width: 35%; color: var(--text); }\n.bar-row .bar { flex: 1; height: 10px; background: var(--surface-2); border-radius: 2px; overflow: hidden; }\n.bar-row .bar-fill { height: 100%; background: var(--teal); transition: width 0.4s; }\n.bar-row .amount { width: 80px; text-align: right; color: var(--green); font-weight: 700; font-family: 'JetBrains Mono', monospace; font-size: 13px; }\ntable { width: 100%; border-collapse: collapse; font-size: 13px; }\nth { text-align: left; padding: 10px 12px; font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); border-bottom: 1px solid var(--border); }\ntd { padding: 12px; border-bottom: 1px solid var(--border-dim); vertical-align: top; }\ntd.action-block { color: var(--red); font-weight: 700; }\ntd.action-downgrade { color: var(--amber); font-weight: 700; }\ntd.action-allow { color: var(--green); }\ntd.action-shadow { color: var(--muted); }\ntd .mono { color: var(--code); }\n.pill { display: inline-block; padding: 2px 8px; border-radius: 3px; font-family: 'JetBrains Mono', monospace; font-size: 11px; background: var(--surface-2); color: var(--text-2); border: 1px solid var(--border-dim); }\n.empty { text-align: center; padding: 56px 20px; color: var(--muted); font-size: 14px; }\n.empty code { display: block; margin-top: 8px; font-size: 14px; color: var(--teal); }\n.live-indicator { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--green); margin-right: 6px; animation: pulse 2s ease-in-out infinite; }\n@keyframes pulse { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(74,222,128,0.4); } 50% { opacity: 0.7; box-shadow: 0 0 0 6px rgba(74,222,128,0); } }\n</style></head><body>\n<div class=\"topbar\">\n <div class=\"brand\"><span class=\"hex\">\u2B21</span><span class=\"name\">Agent<span class=\"accent\">Guard</span></span><span class=\"tag\">Spend \u00B7 Local Dashboard</span></div>\n <div><span class=\"mono\" style=\"color: var(--muted); margin-right: 16px;\"><span class=\"live-indicator\"></span>v__VERSION__ \u00B7 localhost:__PORT__</span><button class=\"refresh-btn\" onclick=\"loadStats()\">Refresh</button></div>\n</div>\n<div class=\"shell\">\n <div class=\"stats-row\">\n <div class=\"stat-card green\"><div class=\"label\">Spent (all-time)</div><div class=\"value\" id=\"spent\">$0.00</div><div class=\"sub\" id=\"spent-sub\">across <span id=\"call-count\">0</span> calls</div></div>\n <div class=\"stat-card red\"><div class=\"label\">Saved by blocks</div><div class=\"value\" id=\"saved\">+$0.00</div><div class=\"sub\"><span id=\"blocked-count\">0</span> calls blocked</div></div>\n <div class=\"stat-card amber\"><div class=\"label\">Downgraded</div><div class=\"value\" id=\"downgraded\">0</div><div class=\"sub\">calls routed to cheaper model</div></div>\n <div class=\"stat-card\"><div class=\"label\">Allowed</div><div class=\"value\" id=\"allowed\">0</div><div class=\"sub\">policy-checked & passed</div></div>\n </div>\n <div class=\"two-col\">\n <div class=\"section\"><h2>Spend by Agent</h2><div id=\"by-agent\"></div></div>\n <div class=\"section\"><h2>Spend by Provider</h2><div id=\"by-provider\"></div></div>\n </div>\n <div class=\"section\">\n <h2>Recent Decisions</h2>\n <table><thead><tr><th style=\"width:80px\">Action</th><th>Agent</th><th>Provider \u00B7 Model</th><th style=\"width:120px;text-align:right\">Amount</th><th style=\"width:120px\">Receipt</th></tr></thead><tbody id=\"recent-rows\"></tbody></table>\n </div>\n <div style=\"text-align: center; color: var(--muted); font-size: 12px; margin-top: 32px;\">Local-only. No outbound network calls. Reads from <code class=\"mono\">~/.agentguard/*/decisions.ndjson</code>.<br/>Source: <a href=\"https://agentguard.run\">agentguard.run</a> \u00B7 <a href=\"https://www.npmjs.com/package/@agentguard-run/spend\">npm</a> \u00B7 <a href=\"https://pypi.org/project/agentguard-spend/\">pypi</a></div>\n</div>\n<script>\nfunction formatCents(cents) { const sign = cents < 0 ? '-' : ''; const abs = Math.abs(Math.round(cents)); const dollars = Math.floor(abs / 100); const remainder = abs % 100; return sign + '$' + dollars.toLocaleString() + '.' + String(remainder).padStart(2, '0'); }\nfunction escapeHtml(value) { return String(value == null ? '' : value).replace(/[&<>\"']/g, function(ch) { return ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[ch]; }); }\nfunction safeClassToken(value) { const clean = String(value || 'allow').toLowerCase().replace(/[^a-z0-9_-]/g, '').slice(0, 24); return clean || 'allow'; }\nfunction safeHash(value) { return String(value || '').toLowerCase().replace(/[^0-9a-f]/g, '').slice(0, 128); }\nfunction renderBars(containerId, items, key) { const el = document.getElementById(containerId); if (!items.length) { el.innerHTML = '<div style=\"color:var(--muted);font-size:13px;padding:8px 0\">no data yet</div>'; return; } const max = Math.max(...items.map(i => Number(i.spent_cents) || 0)) || 1; el.innerHTML = items.slice(0, 8).map(i => '<div class=\"bar-row\"><span class=\"name\">' + escapeHtml(i[key]) + '</span><span class=\"bar\"><span class=\"bar-fill\" style=\"width:' + ((Number(i.spent_cents) || 0)/max*100).toFixed(1) + '%\"></span></span><span class=\"amount\">' + escapeHtml(formatCents(i.spent_cents)) + '</span></div>').join(''); }\nfunction renderRecent(items) { const tbody = document.getElementById('recent-rows'); if (!items.length) { tbody.innerHTML = '<tr><td colspan=\"5\"><div class=\"empty\">no decisions yet.<br>run <code>agentguard demo</code> to see a real signed receipt here.</div></td></tr>'; return; } tbody.innerHTML = items.map(d => { const dec = d.decision || {}; const scope = String(dec.triggeredScopeKey || ''); const agentMatch = scope.match(/agentId=([^|]+)/); const agent = agentMatch ? escapeHtml(agentMatch[1]) : '<span style=\"color:var(--muted)\">-</span>'; const action = safeClassToken(dec.action || 'allow'); const entryHash = safeHash(d.entryHash); const shortHash = entryHash ? escapeHtml(entryHash.slice(0, 12)) + '...' : 'missing'; return '<tr><td class=\"action-' + action + '\">' + escapeHtml(action.toUpperCase()) + '</td><td class=\"mono\">' + agent + '</td><td><span class=\"pill\">' + escapeHtml(dec.provider || '?') + '</span> ' + escapeHtml(dec.modelRequested || '') + '</td><td style=\"text-align:right\" class=\"mono\">' + escapeHtml(formatCents(dec.projectedCents || 0)) + '</td><td class=\"mono\"><a href=\"#\" data-entry-hash=\"' + entryHash + '\">' + shortHash + '</a></td></tr>'; }).join(''); tbody.querySelectorAll('a[data-entry-hash]').forEach(function(a) { a.addEventListener('click', function(event) { event.preventDefault(); verifyReceipt(a.getAttribute('data-entry-hash') || ''); }); }); }\nasync function verifyReceipt(hash) { try { const r = await fetch('/api/verify/' + hash); const d = await r.json(); alert(d.ok ? '\u2713 verified: full chain valid' : '\u2717 verification failed: ' + (d.reason || 'unknown')); } catch (e) { alert('verify error: ' + e); } return false; }\nasync function loadStats() { try { const r = await fetch('/api/stats'); const s = await r.json(); document.getElementById('spent').textContent = formatCents(s.totals.spent_cents); document.getElementById('saved').textContent = '+' + formatCents(s.totals.saved_cents); document.getElementById('downgraded').textContent = s.totals.downgraded; document.getElementById('allowed').textContent = s.totals.allowed; document.getElementById('call-count').textContent = s.totals.calls; document.getElementById('blocked-count').textContent = s.totals.blocked; renderBars('by-agent', s.by_agent, 'agent'); renderBars('by-provider', s.by_provider, 'provider'); renderRecent(s.recent); } catch (e) { console.error('load failed:', e); } }\nloadStats();\nsetInterval(loadStats, 5000);\n</script></body></html>\n";
|
|
9
|
+
export declare const DASHBOARD_HTML = "<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\" />\n<title>AgentGuard Spend \u00B7 Local Dashboard</title>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n<style>\n:root { --bg:#07101E; --surface:#0C1828; --surface-2:#0F1F35; --border:rgba(42,188,180,0.18); --border-dim:rgba(255,255,255,0.08); --teal:#2abcb4; --teal-glow:rgba(42,188,180,0.15); --text:#FFF; --text-2:#DCE8F0; --muted:#8AA0B3; --green:#4ade80; --amber:#F1C40F; --red:#FF6B6B; --code:#E6F0F5; }\n* { box-sizing: border-box; margin: 0; padding: 0; }\nhtml, body { background: var(--bg); color: var(--text-2); font-family: 'DM Sans', -apple-system, system-ui, sans-serif; font-size: 15px; min-height: 100vh; -webkit-font-smoothing: antialiased; }\na { color: var(--teal); text-decoration: none; } a:hover { text-decoration: underline; }\ncode, .mono { font-family: 'JetBrains Mono', monospace; font-size: 13px; }\n.topbar { display: flex; align-items: center; justify-content: space-between; padding: 16px 32px; border-bottom: 1px solid var(--border-dim); background: rgba(7,16,30,0.92); backdrop-filter: blur(10px); position: sticky; top: 0; z-index: 50; }\n.brand { display: inline-flex; align-items: center; gap: 12px; }\n.brand .hex { width: 22px; height: 22px; background: var(--teal); color: var(--bg); display: inline-flex; align-items: center; justify-content: center; font-weight: 800; font-size: 13px; border-radius: 4px; }\n.brand .name { font-family: 'Cormorant Garamond', Georgia, serif; font-size: 22px; color: var(--text); }\n.brand .name .accent { color: var(--teal); }\n.brand .tag { margin-left: 8px; font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--teal); padding: 3px 8px; border: 1px solid var(--border); border-radius: 3px; }\n.refresh-btn { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--teal); background: transparent; border: 1px solid var(--teal); border-radius: 4px; padding: 7px 14px; cursor: pointer; }\n.refresh-btn:hover { background: var(--teal-glow); }\n.shell { padding: 32px; max-width: 1280px; margin: 0 auto; }\n.stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 28px; }\n@media (max-width: 800px) { .stats-row { grid-template-columns: repeat(2, 1fr); } }\n.stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.stat-card .label { font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--muted); margin-bottom: 8px; }\n.stat-card .value { font-size: 28px; font-weight: 800; color: var(--text); font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }\n.stat-card.green .value { color: var(--green); }\n.stat-card.red .value { color: var(--red); }\n.stat-card.amber .value { color: var(--amber); }\n.stat-card .sub { color: var(--muted); font-size: 12px; margin-top: 4px; }\n.section { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 24px 26px; margin-bottom: 24px; }\n.section h2 { font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--teal); margin-bottom: 16px; }\n.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }\n@media (max-width: 800px) { .two-col { grid-template-columns: 1fr; } }\n.bar-row { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border-dim); font-size: 13.5px; }\n.bar-row:last-child { border-bottom: none; }\n.bar-row .name { width: 35%; color: var(--text); }\n.bar-row .bar { flex: 1; height: 10px; background: var(--surface-2); border-radius: 2px; overflow: hidden; }\n.bar-row .bar-fill { height: 100%; background: var(--teal); transition: width 0.4s; }\n.bar-row .amount { width: 80px; text-align: right; color: var(--green); font-weight: 700; font-family: 'JetBrains Mono', monospace; font-size: 13px; }\ntable { width: 100%; border-collapse: collapse; font-size: 13px; }\nth { text-align: left; padding: 10px 12px; font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); border-bottom: 1px solid var(--border); }\ntd { padding: 12px; border-bottom: 1px solid var(--border-dim); vertical-align: top; }\ntd.action-block { color: var(--red); font-weight: 700; }\ntd.action-downgrade { color: var(--amber); font-weight: 700; }\ntd.action-allow { color: var(--green); }\ntd.action-shadow { color: var(--muted); }\ntd .mono { color: var(--code); }\n.pill { display: inline-block; padding: 2px 8px; border-radius: 3px; font-family: 'JetBrains Mono', monospace; font-size: 11px; background: var(--surface-2); color: var(--text-2); border: 1px solid var(--border-dim); }\n.empty { text-align: center; padding: 56px 20px; color: var(--muted); font-size: 14px; }\n.empty code { display: block; margin-top: 8px; font-size: 14px; color: var(--teal); }\n.live-indicator { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--green); margin-right: 6px; animation: pulse 2s ease-in-out infinite; }\n@keyframes pulse { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(74,222,128,0.4); } 50% { opacity: 0.7; box-shadow: 0 0 0 6px rgba(74,222,128,0); } }\n</style></head><body>\n<div class=\"topbar\">\n <div class=\"brand\"><span class=\"hex\">\u2B21</span><span class=\"name\">Agent<span class=\"accent\">Guard</span></span><span class=\"tag\">Spend \u00B7 Local Dashboard</span></div>\n <div><span class=\"mono\" id=\"tamper-badge\" title=\"hash-chain + Ed25519 signature verification of the local ledger\" style=\"margin-right:16px;padding:4px 10px;border-radius:3px;border:1px solid var(--border-dim);color:var(--muted);\">tamper-evidence: \u2026</span><span class=\"mono\" style=\"color: var(--muted); margin-right: 16px;\"><span class=\"live-indicator\"></span>v__VERSION__ \u00B7 localhost:__PORT__</span><button class=\"refresh-btn\" onclick=\"loadStats()\">Refresh</button></div>\n</div>\n<div class=\"shell\">\n <div class=\"stats-row\">\n <div class=\"stat-card green\"><div class=\"label\">Spent (all-time)</div><div class=\"value\" id=\"spent\">$0.00</div><div class=\"sub\" id=\"spent-sub\">across <span id=\"call-count\">0</span> calls</div></div>\n <div class=\"stat-card red\"><div class=\"label\">Saved by blocks</div><div class=\"value\" id=\"saved\">+$0.00</div><div class=\"sub\"><span id=\"blocked-count\">0</span> calls blocked</div></div>\n <div class=\"stat-card amber\"><div class=\"label\">Downgraded</div><div class=\"value\" id=\"downgraded\">0</div><div class=\"sub\">calls routed to cheaper model</div></div>\n <div class=\"stat-card\"><div class=\"label\">Allowed</div><div class=\"value\" id=\"allowed\">0</div><div class=\"sub\">policy-checked & passed</div></div>\n </div>\n <div class=\"two-col\">\n <div class=\"section\"><h2>Spend by Agent</h2><div id=\"by-agent\"></div></div>\n <div class=\"section\"><h2>Spend by Provider</h2><div id=\"by-provider\"></div></div>\n </div>\n <div class=\"section\">\n <h2>Recent Decisions</h2>\n <table><thead><tr><th style=\"width:80px\">Action</th><th>Agent</th><th>Provider \u00B7 Model</th><th style=\"width:120px;text-align:right\">Amount</th><th style=\"width:120px\">Receipt</th></tr></thead><tbody id=\"recent-rows\"></tbody></table>\n </div>\n <div style=\"text-align: center; color: var(--muted); font-size: 12px; margin-top: 32px;\">Local-only. No outbound network calls. Reads from <code class=\"mono\">~/.agentguard/*/decisions.ndjson</code>.<br/>Source: <a href=\"https://agentguard.run\">agentguard.run</a> \u00B7 <a href=\"https://www.npmjs.com/package/@agentguard-run/spend\">npm</a> \u00B7 <a href=\"https://pypi.org/project/agentguard-spend/\">pypi</a></div>\n</div>\n<script>\nfunction formatCents(cents) { const sign = cents < 0 ? '-' : ''; const abs = Math.abs(Math.round(cents)); const dollars = Math.floor(abs / 100); const remainder = abs % 100; return sign + '$' + dollars.toLocaleString() + '.' + String(remainder).padStart(2, '0'); }\nfunction escapeHtml(value) { return String(value == null ? '' : value).replace(/[&<>\"']/g, function(ch) { return ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[ch]; }); }\nfunction safeClassToken(value) { const clean = String(value || 'allow').toLowerCase().replace(/[^a-z0-9_-]/g, '').slice(0, 24); return clean || 'allow'; }\nfunction safeHash(value) { return String(value || '').toLowerCase().replace(/[^0-9a-f]/g, '').slice(0, 128); }\nfunction renderBars(containerId, items, key) { const el = document.getElementById(containerId); if (!items.length) { el.innerHTML = '<div style=\"color:var(--muted);font-size:13px;padding:8px 0\">no data yet</div>'; return; } const max = Math.max(...items.map(i => Number(i.spent_cents) || 0)) || 1; el.innerHTML = items.slice(0, 8).map(i => '<div class=\"bar-row\"><span class=\"name\">' + escapeHtml(i[key]) + '</span><span class=\"bar\"><span class=\"bar-fill\" style=\"width:' + ((Number(i.spent_cents) || 0)/max*100).toFixed(1) + '%\"></span></span><span class=\"amount\">' + escapeHtml(formatCents(i.spent_cents)) + '</span></div>').join(''); }\nfunction renderRecent(items) { const tbody = document.getElementById('recent-rows'); if (!items.length) { tbody.innerHTML = '<tr><td colspan=\"5\"><div class=\"empty\">no decisions yet.<br>run <code>agentguard demo</code> to see a real signed receipt here.</div></td></tr>'; return; } tbody.innerHTML = items.map(d => { const dec = d.decision || {}; const scope = String(dec.triggeredScopeKey || ''); const agentMatch = scope.match(/agentId=([^|]+)/); const agent = agentMatch ? escapeHtml(agentMatch[1]) : '<span style=\"color:var(--muted)\">-</span>'; const action = safeClassToken(dec.action || 'allow'); const entryHash = safeHash(d.entryHash); const shortHash = entryHash ? escapeHtml(entryHash.slice(0, 12)) + '...' : 'missing'; return '<tr><td class=\"action-' + action + '\">' + escapeHtml(action.toUpperCase()) + '</td><td class=\"mono\">' + agent + '</td><td><span class=\"pill\">' + escapeHtml(dec.provider || '?') + '</span> ' + escapeHtml(dec.modelRequested || '') + '</td><td style=\"text-align:right\" class=\"mono\">' + escapeHtml(formatCents(dec.projectedCents || 0)) + '</td><td class=\"mono\"><a href=\"#\" data-entry-hash=\"' + entryHash + '\">' + shortHash + '</a></td></tr>'; }).join(''); tbody.querySelectorAll('a[data-entry-hash]').forEach(function(a) { a.addEventListener('click', function(event) { event.preventDefault(); verifyReceipt(a.getAttribute('data-entry-hash') || ''); }); }); }\nasync function verifyReceipt(hash) { try { const r = await fetch('/api/verify/' + hash); const d = await r.json(); alert(d.ok ? '\u2713 verified: full chain valid' : '\u2717 verification failed: ' + (d.reason || 'unknown')); } catch (e) { alert('verify error: ' + e); } return false; }\nfunction renderTamper(integrity) { const el = document.getElementById('tamper-badge'); if (!el) return; const i = integrity || {}; if (i.verified) { el.textContent = '\u2713 tamper-evidence: ' + (i.entries || 0) + ' entries verified'; el.style.color = 'var(--green)'; el.style.borderColor = 'var(--green)'; } else { el.textContent = '\u2717 tamper-evidence: ' + (i.reason || 'unverified'); el.style.color = 'var(--red)'; el.style.borderColor = 'var(--red)'; } }\nasync function loadStats() { try { const r = await fetch('/api/stats'); const s = await r.json(); renderTamper(s.integrity); document.getElementById('spent').textContent = formatCents(s.totals.spent_cents); document.getElementById('saved').textContent = '+' + formatCents(s.totals.saved_cents); document.getElementById('downgraded').textContent = s.totals.downgraded; document.getElementById('allowed').textContent = s.totals.allowed; document.getElementById('call-count').textContent = s.totals.calls; document.getElementById('blocked-count').textContent = s.totals.blocked; renderBars('by-agent', s.by_agent, 'agent'); renderBars('by-provider', s.by_provider, 'provider'); renderRecent(s.recent); } catch (e) { console.error('load failed:', e); } }\nloadStats();\nsetInterval(loadStats, 5000);\n</script></body></html>\n";
|
|
10
10
|
export declare function runServe(argv: string[]): Promise<number>;
|
|
11
11
|
//# sourceMappingURL=serve.d.ts.map
|
package/dist/cli/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiJH,eAAO,MAAM,cAAc,kkYAsF1B,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmH9D"}
|