@oxdeai/cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/README.md +61 -0
- package/dist/cli.test.d.ts +1 -0
- package/dist/cli.test.js +274 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.js +552 -0
- package/dist/main.js.map +1 -0
- package/dist/store.d.ts +8 -0
- package/dist/store.js +86 -0
- package/dist/store.js.map +1 -0
- package/package.json +23 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@oxdeai/cli` will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on Keep a Changelog.
|
|
6
|
+
This project follows Semantic Versioning.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## [0.2.0] - 2026-03-08
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Unified `verify` command support for:
|
|
15
|
+
- `snapshot`
|
|
16
|
+
- `audit`
|
|
17
|
+
- `envelope`
|
|
18
|
+
- `authorization`
|
|
19
|
+
- Support for authorization/envelope verification options:
|
|
20
|
+
- expected issuer/audience/policy
|
|
21
|
+
- trusted keyset input
|
|
22
|
+
- signature verification requirement toggles
|
|
23
|
+
- Machine-readable and human-readable output paths with consistent command summaries.
|
|
24
|
+
- Dedicated CLI README with command surface, examples, and exit code contract.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- Stabilized tooling command surface around:
|
|
29
|
+
- `oxdeai build`
|
|
30
|
+
- `oxdeai verify`
|
|
31
|
+
- `oxdeai replay` (protocol-aware explicit stub)
|
|
32
|
+
- Normalized verification exit codes:
|
|
33
|
+
- `0` = `ok`
|
|
34
|
+
- `1` = `invalid` / malformed runtime failure
|
|
35
|
+
- `2` = usage error
|
|
36
|
+
- `3` = `inconclusive`
|
|
37
|
+
- Expanded CLI tests for authorization verification and malformed-input fail-closed behavior.
|
|
38
|
+
|
|
39
|
+
### Notes
|
|
40
|
+
|
|
41
|
+
- `@oxdeai/cli` is a tooling release line and is versioned independently from the protocol stack.
|
|
42
|
+
- Protocol compatibility claims are defined by:
|
|
43
|
+
- `@oxdeai/core`
|
|
44
|
+
- `@oxdeai/sdk`
|
|
45
|
+
- `@oxdeai/conformance`
|
package/README.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# @oxdeai/cli
|
|
2
|
+
|
|
3
|
+
Protocol-oriented command-line tooling for OxDeAI.
|
|
4
|
+
|
|
5
|
+
`@oxdeai/cli` is a thin Node.js wrapper around `@oxdeai/core` verification and local state workflows. It is framework-agnostic and intended for local policy operations, artifact inspection, and deterministic verification.
|
|
6
|
+
|
|
7
|
+
## Command Surface
|
|
8
|
+
|
|
9
|
+
- `oxdeai build`
|
|
10
|
+
- `oxdeai verify`
|
|
11
|
+
- `oxdeai replay`
|
|
12
|
+
|
|
13
|
+
Legacy helper commands are still available (`init`, `launch`, `state`, `audit`, `verify-audit`, `make-envelope`, `verify-envelope`, `snapshot-hash`) for local development workflows.
|
|
14
|
+
|
|
15
|
+
## Core Commands
|
|
16
|
+
|
|
17
|
+
### build
|
|
18
|
+
|
|
19
|
+
Builds a canonical snapshot verification payload from state.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
oxdeai build --state .oxdeai/state.json --out .oxdeai/snapshot.bin --json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### verify
|
|
26
|
+
|
|
27
|
+
Verifies one artifact kind at a time:
|
|
28
|
+
|
|
29
|
+
- `snapshot`
|
|
30
|
+
- `audit`
|
|
31
|
+
- `envelope`
|
|
32
|
+
- `authorization`
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
oxdeai verify --kind snapshot --file snapshot.bin --json
|
|
38
|
+
oxdeai verify --kind audit --file audit.ndjson --mode strict --json
|
|
39
|
+
oxdeai verify --kind envelope --file envelope.bin --trusted-keyset keyset.json --require-signature --json
|
|
40
|
+
oxdeai verify --kind authorization --file authorization.json --expected-issuer oxdeai://issuer --expected-audience rp://tool-gateway --json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### replay
|
|
44
|
+
|
|
45
|
+
Protocol-aware stub in `0.1.x`. It returns a clear unsupported response and points users to deterministic audit verification (`verify --kind audit`).
|
|
46
|
+
|
|
47
|
+
## Output and Exit Codes
|
|
48
|
+
|
|
49
|
+
- Human-readable output by default
|
|
50
|
+
- Machine-readable output with `--json`
|
|
51
|
+
|
|
52
|
+
Exit codes:
|
|
53
|
+
|
|
54
|
+
- `0` = verification `ok` / command success
|
|
55
|
+
- `1` = verification `invalid` or malformed input/runtime failure
|
|
56
|
+
- `2` = usage/flag parsing error
|
|
57
|
+
- `3` = verification `inconclusive`
|
|
58
|
+
|
|
59
|
+
## PDP / PEP Boundary
|
|
60
|
+
|
|
61
|
+
The CLI does not replace a runtime PEP. It is intended for deterministic protocol artifact handling, validation, and local operational tooling around the OxDeAI PDP/PEP model.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/cli.test.js
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtemp, readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { PolicyEngine, encodeCanonicalState, encodeEnvelope } from "@oxdeai/core";
|
|
7
|
+
import { runCli } from "./main.js";
|
|
8
|
+
function baseState() {
|
|
9
|
+
return {
|
|
10
|
+
policy_version: "v1",
|
|
11
|
+
period_id: "2026-03",
|
|
12
|
+
kill_switch: { global: false, agents: {} },
|
|
13
|
+
allowlists: {
|
|
14
|
+
action_types: ["PROVISION"],
|
|
15
|
+
assets: ["a100"],
|
|
16
|
+
targets: ["us-east-1"]
|
|
17
|
+
},
|
|
18
|
+
budget: {
|
|
19
|
+
budget_limit: { "agent-1": 1000000n },
|
|
20
|
+
spent_in_period: { "agent-1": 0n }
|
|
21
|
+
},
|
|
22
|
+
max_amount_per_action: { "agent-1": 1000000n },
|
|
23
|
+
velocity: { config: { window_seconds: 60, max_actions: 10 }, counters: {} },
|
|
24
|
+
replay: { window_seconds: 3600, max_nonces_per_agent: 256, nonces: {} },
|
|
25
|
+
concurrency: { max_concurrent: { "agent-1": 4 }, active: {}, active_auths: {} },
|
|
26
|
+
recursion: { max_depth: { "agent-1": 5 } },
|
|
27
|
+
tool_limits: { window_seconds: 60, max_calls: { "agent-1": 100 }, max_calls_by_tool: {}, calls: {} }
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function jsonWithBigInt(v) {
|
|
31
|
+
return JSON.stringify(v, (_k, x) => (typeof x === "bigint" ? `${x.toString()}n` : x), 2);
|
|
32
|
+
}
|
|
33
|
+
async function setup() {
|
|
34
|
+
const dir = await mkdtemp(join(tmpdir(), "oxdeai-cli-test-"));
|
|
35
|
+
const policyFile = join(dir, "policy.json");
|
|
36
|
+
const stateFile = join(dir, "state.json");
|
|
37
|
+
const auditFile = join(dir, "audit.ndjson");
|
|
38
|
+
await writeFile(policyFile, jsonWithBigInt(baseState()), "utf8");
|
|
39
|
+
return { dir, policyFile, stateFile, auditFile };
|
|
40
|
+
}
|
|
41
|
+
function ioCapture(now = 1_770_000_000) {
|
|
42
|
+
const out = [];
|
|
43
|
+
const err = [];
|
|
44
|
+
return {
|
|
45
|
+
out,
|
|
46
|
+
err,
|
|
47
|
+
io: {
|
|
48
|
+
out: (line) => out.push(line),
|
|
49
|
+
err: (line) => err.push(line),
|
|
50
|
+
now: () => now
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
test("init writes state and clears audit", async () => {
|
|
55
|
+
const { policyFile, stateFile, auditFile } = await setup();
|
|
56
|
+
await writeFile(auditFile, "{\"junk\":1}\n", "utf8");
|
|
57
|
+
const cap = ioCapture();
|
|
58
|
+
const code = await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile, "--json"], cap.io);
|
|
59
|
+
assert.equal(code, 0);
|
|
60
|
+
const stateText = await readFile(stateFile, "utf8");
|
|
61
|
+
assert.ok(stateText.length > 0);
|
|
62
|
+
const auditText = await readFile(auditFile, "utf8");
|
|
63
|
+
assert.equal(auditText, "");
|
|
64
|
+
assert.equal(cap.err.length, 0);
|
|
65
|
+
});
|
|
66
|
+
test("launch allow path mutates state and appends audit", async () => {
|
|
67
|
+
const { policyFile, stateFile, auditFile } = await setup();
|
|
68
|
+
const cap = ioCapture();
|
|
69
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
70
|
+
const code = await runCli(["launch", "PROVISION", "320", "us-east-1", "--agent", "agent-1", "--nonce", "42", "--state", stateFile, "--audit", auditFile, "--json"], cap.io);
|
|
71
|
+
assert.equal(code, 0);
|
|
72
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
73
|
+
assert.equal(latest.decision, "ALLOW");
|
|
74
|
+
assert.equal(typeof latest.authorization_id, "string");
|
|
75
|
+
const stateText = await readFile(stateFile, "utf8");
|
|
76
|
+
assert.ok(stateText.includes("\"spent_in_period\":{\"agent-1\":\"320n\"}"));
|
|
77
|
+
const auditText = await readFile(auditFile, "utf8");
|
|
78
|
+
assert.ok(auditText.trim().split("\n").length >= 3);
|
|
79
|
+
});
|
|
80
|
+
test("launch deny path keeps state unchanged", async () => {
|
|
81
|
+
const { policyFile, stateFile, auditFile } = await setup();
|
|
82
|
+
const denyState = baseState();
|
|
83
|
+
denyState.kill_switch.global = true;
|
|
84
|
+
await writeFile(policyFile, jsonWithBigInt(denyState), "utf8");
|
|
85
|
+
const cap = ioCapture();
|
|
86
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
87
|
+
const before = await readFile(stateFile, "utf8");
|
|
88
|
+
const code = await runCli(["launch", "PROVISION", "320", "us-east-1", "--agent", "agent-1", "--nonce", "77", "--state", stateFile, "--audit", auditFile, "--json"], cap.io);
|
|
89
|
+
assert.equal(code, 0);
|
|
90
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
91
|
+
assert.equal(latest.decision, "DENY");
|
|
92
|
+
const after = await readFile(stateFile, "utf8");
|
|
93
|
+
assert.equal(after, before);
|
|
94
|
+
});
|
|
95
|
+
test("audit command reports verify=true on valid chain", async () => {
|
|
96
|
+
const { policyFile, stateFile, auditFile } = await setup();
|
|
97
|
+
const cap = ioCapture();
|
|
98
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
99
|
+
await runCli(["launch", "PROVISION", "100", "us-east-1", "--agent", "agent-1", "--nonce", "9", "--state", stateFile, "--audit", auditFile], cap.io);
|
|
100
|
+
const code = await runCli(["audit", "--audit", auditFile, "--json"], cap.io);
|
|
101
|
+
assert.equal(code, 0);
|
|
102
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
103
|
+
assert.equal(latest.verify, true);
|
|
104
|
+
assert.equal(Array.isArray(latest.events), true);
|
|
105
|
+
});
|
|
106
|
+
test("state command prints valid json state", async () => {
|
|
107
|
+
const { policyFile, stateFile, auditFile } = await setup();
|
|
108
|
+
const cap = ioCapture();
|
|
109
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
110
|
+
const code = await runCli(["state", "--state", stateFile, "--json"], cap.io);
|
|
111
|
+
assert.equal(code, 0);
|
|
112
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
113
|
+
assert.equal(latest.policy_version, "v1");
|
|
114
|
+
assert.ok(latest.velocity?.config);
|
|
115
|
+
});
|
|
116
|
+
test("verify-audit returns strict result for current audit file", async () => {
|
|
117
|
+
const { policyFile, stateFile, auditFile } = await setup();
|
|
118
|
+
const cap = ioCapture();
|
|
119
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
120
|
+
await runCli(["launch", "PROVISION", "100", "us-east-1", "--agent", "agent-1", "--nonce", "11", "--state", stateFile, "--audit", auditFile], cap.io);
|
|
121
|
+
const code = await runCli(["verify-audit", "--audit", auditFile, "--json"], cap.io);
|
|
122
|
+
assert.equal(code, 3);
|
|
123
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
124
|
+
assert.equal(typeof latest.status, "string");
|
|
125
|
+
assert.equal(latest.status, "inconclusive");
|
|
126
|
+
assert.equal(Array.isArray(latest.violations), true);
|
|
127
|
+
});
|
|
128
|
+
test("snapshot-hash returns policyId and stateHash", async () => {
|
|
129
|
+
const { policyFile, stateFile, auditFile } = await setup();
|
|
130
|
+
const cap = ioCapture();
|
|
131
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
132
|
+
const code = await runCli(["snapshot-hash", "--state", stateFile, "--json"], cap.io);
|
|
133
|
+
assert.equal(code, 0);
|
|
134
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
135
|
+
assert.equal(typeof latest.policyId, "string");
|
|
136
|
+
assert.equal(typeof latest.stateHash, "string");
|
|
137
|
+
assert.equal(latest.status, "ok");
|
|
138
|
+
});
|
|
139
|
+
test("verify-envelope reads file and verifies", async () => {
|
|
140
|
+
const { policyFile, stateFile, auditFile, dir } = await setup();
|
|
141
|
+
const cap = ioCapture(1_770_000_123);
|
|
142
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
143
|
+
await runCli(["launch", "PROVISION", "100", "us-east-1", "--agent", "agent-1", "--nonce", "12", "--state", stateFile, "--audit", auditFile], cap.io);
|
|
144
|
+
const state = JSON.parse(await readFile(stateFile, "utf8"), (_k, v) => {
|
|
145
|
+
if (typeof v === "string" && /^-?\d+n$/.test(v))
|
|
146
|
+
return BigInt(v.slice(0, -1));
|
|
147
|
+
return v;
|
|
148
|
+
});
|
|
149
|
+
const events = (await readFile(auditFile, "utf8"))
|
|
150
|
+
.split("\n")
|
|
151
|
+
.map((l) => l.trim())
|
|
152
|
+
.filter(Boolean)
|
|
153
|
+
.map((line) => JSON.parse(line));
|
|
154
|
+
const engine = new PolicyEngine({
|
|
155
|
+
policy_version: state.policy_version,
|
|
156
|
+
engine_secret: "dev-secret",
|
|
157
|
+
authorization_ttl_seconds: 120
|
|
158
|
+
});
|
|
159
|
+
const snapshotBytes = encodeCanonicalState(engine.exportState(state));
|
|
160
|
+
const envelope = encodeEnvelope({ formatVersion: 1, snapshot: snapshotBytes, events });
|
|
161
|
+
const envelopePath = join(dir, "envelope.bin");
|
|
162
|
+
await writeFile(envelopePath, Buffer.from(envelope));
|
|
163
|
+
const code = await runCli(["verify-envelope", envelopePath, "--json"], cap.io);
|
|
164
|
+
assert.equal(code, 3);
|
|
165
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
166
|
+
assert.equal(typeof latest.status, "string");
|
|
167
|
+
assert.equal(latest.status, "inconclusive");
|
|
168
|
+
assert.equal(Array.isArray(latest.violations), true);
|
|
169
|
+
});
|
|
170
|
+
test("make-envelope writes envelope file that verify-envelope accepts", async () => {
|
|
171
|
+
const { policyFile, stateFile, auditFile, dir } = await setup();
|
|
172
|
+
const cap = ioCapture(1_770_000_222);
|
|
173
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
174
|
+
await runCli(["launch", "PROVISION", "100", "us-east-1", "--agent", "agent-1", "--nonce", "13", "--state", stateFile, "--audit", auditFile], cap.io);
|
|
175
|
+
const envelopePath = join(dir, "made-envelope.bin");
|
|
176
|
+
const makeCode = await runCli(["make-envelope", "--out", envelopePath, "--state", stateFile, "--audit", auditFile, "--json"], cap.io);
|
|
177
|
+
assert.equal(makeCode, 0);
|
|
178
|
+
const verifyCode = await runCli(["verify-envelope", envelopePath, "--json"], cap.io);
|
|
179
|
+
assert.equal(verifyCode, 3);
|
|
180
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
181
|
+
assert.equal(typeof latest.status, "string");
|
|
182
|
+
assert.equal(latest.status, "inconclusive");
|
|
183
|
+
assert.equal(Array.isArray(latest.violations), true);
|
|
184
|
+
});
|
|
185
|
+
test("build emits snapshot verification payload and optional file", async () => {
|
|
186
|
+
const { policyFile, stateFile, auditFile, dir } = await setup();
|
|
187
|
+
const cap = ioCapture();
|
|
188
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
189
|
+
const snapshotOut = join(dir, "snapshot.bin");
|
|
190
|
+
const code = await runCli(["build", "--state", stateFile, "--out", snapshotOut, "--json"], cap.io);
|
|
191
|
+
assert.equal(code, 0);
|
|
192
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
193
|
+
assert.equal(latest.status, "ok");
|
|
194
|
+
assert.equal(typeof latest.policyId, "string");
|
|
195
|
+
assert.equal(typeof latest.stateHash, "string");
|
|
196
|
+
const bytes = await readFile(snapshotOut);
|
|
197
|
+
assert.ok(bytes.length > 0);
|
|
198
|
+
});
|
|
199
|
+
test("verify supports --kind audit from file and replay command is clear stub", async () => {
|
|
200
|
+
const { policyFile, stateFile, auditFile } = await setup();
|
|
201
|
+
const cap = ioCapture();
|
|
202
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
203
|
+
await runCli(["launch", "PROVISION", "100", "us-east-1", "--agent", "agent-1", "--nonce", "20", "--state", stateFile, "--audit", auditFile], cap.io);
|
|
204
|
+
const verifyCode = await runCli(["verify", "--kind", "audit", "--file", auditFile, "--mode", "strict", "--json"], cap.io);
|
|
205
|
+
assert.equal(verifyCode, 3); // strict mode without checkpoint => inconclusive
|
|
206
|
+
const verifyLatest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
207
|
+
assert.equal(verifyLatest.status, "inconclusive");
|
|
208
|
+
const replayCode = await runCli(["replay", "--json"], cap.io);
|
|
209
|
+
assert.equal(replayCode, 0);
|
|
210
|
+
const replayLatest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
211
|
+
assert.equal(replayLatest.status, "unsupported");
|
|
212
|
+
});
|
|
213
|
+
test("verify supports --kind authorization from file", async () => {
|
|
214
|
+
const { policyFile, stateFile, auditFile, dir } = await setup();
|
|
215
|
+
const cap = ioCapture(1_770_000_500);
|
|
216
|
+
await runCli(["init", "--file", policyFile, "--state", stateFile, "--audit", auditFile], cap.io);
|
|
217
|
+
await runCli(["launch", "PROVISION", "100", "us-east-1", "--agent", "agent-1", "--nonce", "21", "--state", stateFile, "--audit", auditFile], cap.io);
|
|
218
|
+
const state = JSON.parse(await readFile(stateFile, "utf8"), (_k, v) => {
|
|
219
|
+
if (typeof v === "string" && /^-?\d+n$/.test(v))
|
|
220
|
+
return BigInt(v.slice(0, -1));
|
|
221
|
+
return v;
|
|
222
|
+
});
|
|
223
|
+
const engine = new PolicyEngine({
|
|
224
|
+
policy_version: state.policy_version,
|
|
225
|
+
engine_secret: "dev-secret",
|
|
226
|
+
authorization_ttl_seconds: 120
|
|
227
|
+
});
|
|
228
|
+
const intent = {
|
|
229
|
+
intent_id: "intent:agent-1:22",
|
|
230
|
+
type: "EXECUTE",
|
|
231
|
+
agent_id: "agent-1",
|
|
232
|
+
action_type: "PROVISION",
|
|
233
|
+
amount: 100n,
|
|
234
|
+
asset: "a100",
|
|
235
|
+
target: "us-east-1",
|
|
236
|
+
timestamp: cap.io.now(),
|
|
237
|
+
metadata_hash: "0x" + "0".repeat(64),
|
|
238
|
+
nonce: 22n,
|
|
239
|
+
signature: "cli-signature-placeholder"
|
|
240
|
+
};
|
|
241
|
+
const evaluated = engine.evaluatePure(intent, state, { mode: "fail-fast" });
|
|
242
|
+
assert.equal(evaluated.decision, "ALLOW");
|
|
243
|
+
const authPath = join(dir, "authorization.json");
|
|
244
|
+
await writeFile(authPath, jsonWithBigInt(evaluated.authorization), "utf8");
|
|
245
|
+
const code = await runCli([
|
|
246
|
+
"verify",
|
|
247
|
+
"--kind",
|
|
248
|
+
"authorization",
|
|
249
|
+
"--file",
|
|
250
|
+
authPath,
|
|
251
|
+
"--expected-issuer",
|
|
252
|
+
evaluated.authorization.issuer,
|
|
253
|
+
"--expected-audience",
|
|
254
|
+
evaluated.authorization.audience,
|
|
255
|
+
"--json"
|
|
256
|
+
], cap.io);
|
|
257
|
+
assert.equal(code, 0);
|
|
258
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
259
|
+
assert.equal(latest.status, "ok");
|
|
260
|
+
assert.equal(Array.isArray(latest.violations), true);
|
|
261
|
+
assert.equal(latest.violations.length, 0);
|
|
262
|
+
});
|
|
263
|
+
test("verify fails closed on malformed authorization payload", async () => {
|
|
264
|
+
const { dir } = await setup();
|
|
265
|
+
const cap = ioCapture();
|
|
266
|
+
const malformedPath = join(dir, "bad-auth.json");
|
|
267
|
+
await writeFile(malformedPath, "{\"not\":\"authorization\"}", "utf8");
|
|
268
|
+
const code = await runCli(["verify", "--kind", "authorization", "--file", malformedPath, "--json"], cap.io);
|
|
269
|
+
assert.equal(code, 1);
|
|
270
|
+
const latest = JSON.parse(cap.out[cap.out.length - 1] ?? "{}");
|
|
271
|
+
assert.equal(latest.status, "invalid");
|
|
272
|
+
assert.ok((latest.violations ?? []).length > 0);
|
|
273
|
+
});
|
|
274
|
+
//# sourceMappingURL=cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGlF,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,SAAS,SAAS;IAChB,OAAO;QACL,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,SAAS;QACpB,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1C,UAAU,EAAE;YACV,YAAY,EAAE,CAAC,WAAW,CAAC;YAC3B,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,OAAO,EAAE,CAAC,WAAW,CAAC;SACvB;QACD,MAAM,EAAE;YACN,YAAY,EAAE,EAAE,SAAS,EAAE,QAAU,EAAE;YACvC,eAAe,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;SACnC;QACD,qBAAqB,EAAE,EAAE,SAAS,EAAE,QAAU,EAAE;QAChD,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3E,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACvE,WAAW,EAAE,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QAC/E,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE;QAC1C,WAAW,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;KACrG,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,CAAU;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACjE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,GAAG,GAAG,aAAa;IACpC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,OAAO;QACL,GAAG;QACH,GAAG;QACH,EAAE,EAAE;YACF,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG;SACf;KACF,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;IACpD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAC3D,MAAM,SAAS,CAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACxH,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;IACnE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAEjG,MAAM,IAAI,GAAG,MAAM,MAAM,CACvB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EACxI,GAAG,CAAC,EAAE,CACP,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,4CAA4C,CAAC,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;IACxD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;IAC9B,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,SAAS,CAAC,UAAU,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IAE/D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEjD,MAAM,IAAI,GAAG,MAAM,MAAM,CACvB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EACxI,GAAG,CAAC,EAAE,CACP,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;IAClE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAEpJ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;IACvD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAEjG,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;IAC3E,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAErJ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;IAC9D,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAEjG,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;IACzD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAChE,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IACrC,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAErJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACpE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,CAAC;IACX,CAAC,CAAU,CAAC;IACZ,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;SAC/C,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,aAAa,EAAE,YAAY;QAC3B,yBAAyB,EAAE,GAAG;KAC/B,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,MAAM,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAErD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,iBAAiB,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/E,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;IACjF,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAChE,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IACrC,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAErJ,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAC3B,CAAC,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAC9F,GAAG,CAAC,EAAE,CACP,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE1B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,CAAC,iBAAiB,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAChE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAEjG,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACnG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;IACzF,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAErJ,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1H,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,iDAAiD;IAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;IAChE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAChE,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IACrC,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAErJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACpE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,CAAC;IACX,CAAC,CAAU,CAAC;IAEZ,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,aAAa,EAAE,YAAY;QAC3B,yBAAyB,EAAE,GAAG;KAC/B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG;QACb,SAAS,EAAE,mBAAmB;QAC9B,IAAI,EAAE,SAAkB;QACxB,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,WAAoB;QACjC,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,WAAW;QACnB,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE;QACvB,aAAa,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,KAAK,EAAE,GAAG;QACV,SAAS,EAAE,2BAA2B;KACvC,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;IAE3E,MAAM,IAAI,GAAG,MAAM,MAAM,CACvB;QACE,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,QAAQ;QACR,QAAQ;QACR,mBAAmB;QACnB,SAAS,CAAC,aAAa,CAAC,MAAM;QAC9B,qBAAqB;QACrB,SAAS,CAAC,aAAa,CAAC,QAAQ;QAChC,QAAQ;KACT,EACD,GAAG,CAAC,EAAE,CACP,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;IACxE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,aAAa,EAAE,6BAA6B,EAAE,MAAM,CAAC,CAAC;IAEtE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5G,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC"}
|
package/dist/main.d.ts
ADDED
package/dist/main.js
ADDED
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { PolicyEngine, encodeCanonicalState, encodeEnvelope, verifyAuditEvents, verifyAuthorization, verifyEnvelope, verifySnapshot } from "@oxdeai/core";
|
|
5
|
+
import { appendAuditEvents, normalizeStateBigInts, readAuditEvents, readStateFile, resetAuditFile, writeStateFile } from "./store.js";
|
|
6
|
+
const DEFAULT_STATE_PATH = ".oxdeai/state.json";
|
|
7
|
+
const DEFAULT_AUDIT_PATH = ".oxdeai/audit.ndjson";
|
|
8
|
+
const ACTION_TYPES = new Set(["PAYMENT", "PURCHASE", "PROVISION", "ONCHAIN_TX"]);
|
|
9
|
+
const EXIT_CODE_OK = 0;
|
|
10
|
+
const EXIT_CODE_INVALID = 1;
|
|
11
|
+
const EXIT_CODE_USAGE = 2;
|
|
12
|
+
const EXIT_CODE_INCONCLUSIVE = 3;
|
|
13
|
+
function usage() {
|
|
14
|
+
return `oxdeai CLI
|
|
15
|
+
|
|
16
|
+
Usage:
|
|
17
|
+
oxdeai build [--state <state.json>] [--out <snapshot.bin>] [--json]
|
|
18
|
+
oxdeai verify --kind <snapshot|audit|envelope|authorization> [--file <path>|-] [--mode <strict|best-effort>] [--expected-policy-id <hex>] [--expected-issuer <id>] [--expected-audience <id>] [--consumed-auth-id <id>] [--trusted-keyset <keyset.json>] [--require-signature] [--legacy-hmac-secret <secret>] [--json]
|
|
19
|
+
oxdeai replay [--json]
|
|
20
|
+
oxdeai init --file <policy.json> [--state <state.json>] [--audit <audit.ndjson>] [--json]
|
|
21
|
+
oxdeai launch <actionType> <amount> <target> --agent <id> --nonce <n> [--asset <asset>] [--state <state.json>] [--audit <audit.ndjson>] [--json]
|
|
22
|
+
oxdeai make-envelope --out <file> [--state <state.json>] [--audit <audit.ndjson>] [--json]
|
|
23
|
+
oxdeai verify-envelope <file> [--json]
|
|
24
|
+
oxdeai verify-audit [--audit <audit.ndjson>] [--json]
|
|
25
|
+
oxdeai snapshot-hash [--state <state.json>] [--json]
|
|
26
|
+
oxdeai audit [--audit <audit.ndjson>] [--json]
|
|
27
|
+
oxdeai state [--state <state.json>] [--json]`;
|
|
28
|
+
}
|
|
29
|
+
function parseFlags(argv) {
|
|
30
|
+
const args = [];
|
|
31
|
+
const flags = {};
|
|
32
|
+
for (let i = 0; i < argv.length; i++) {
|
|
33
|
+
const a = argv[i];
|
|
34
|
+
if (a === "--")
|
|
35
|
+
continue;
|
|
36
|
+
if (!a.startsWith("--")) {
|
|
37
|
+
args.push(a);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (a === "--json") {
|
|
41
|
+
flags.json = true;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const next = () => {
|
|
45
|
+
const v = argv[++i];
|
|
46
|
+
if (!v)
|
|
47
|
+
throw new Error(`Missing value for ${a}`);
|
|
48
|
+
return v;
|
|
49
|
+
};
|
|
50
|
+
if (a === "--state") {
|
|
51
|
+
flags.state = next();
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (a === "--audit") {
|
|
55
|
+
flags.audit = next();
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (a === "--file") {
|
|
59
|
+
flags.file = next();
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (a === "--out") {
|
|
63
|
+
flags.out = next();
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (a === "--agent") {
|
|
67
|
+
flags.agent = next();
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (a === "--nonce") {
|
|
71
|
+
flags.nonce = next();
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (a === "--asset") {
|
|
75
|
+
flags.asset = next();
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (a === "--kind") {
|
|
79
|
+
const v = next();
|
|
80
|
+
if (v !== "snapshot" && v !== "audit" && v !== "envelope" && v !== "authorization") {
|
|
81
|
+
throw new Error("Invalid --kind value (must be snapshot|audit|envelope|authorization)");
|
|
82
|
+
}
|
|
83
|
+
flags.kind = v;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (a === "--mode") {
|
|
87
|
+
const v = next();
|
|
88
|
+
if (v !== "strict" && v !== "best-effort") {
|
|
89
|
+
throw new Error("Invalid --mode value (must be strict|best-effort)");
|
|
90
|
+
}
|
|
91
|
+
flags.mode = v;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (a === "--expected-policy-id") {
|
|
95
|
+
flags.expectedPolicyId = next();
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (a === "--expected-issuer") {
|
|
99
|
+
flags.expectedIssuer = next();
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (a === "--expected-audience") {
|
|
103
|
+
flags.expectedAudience = next();
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (a === "--consumed-auth-id") {
|
|
107
|
+
flags.consumedAuthId = next();
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (a === "--trusted-keyset") {
|
|
111
|
+
flags.trustedKeyset = next();
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (a === "--require-signature") {
|
|
115
|
+
flags.requireSignatureVerification = true;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (a === "--legacy-hmac-secret") {
|
|
119
|
+
flags.legacyHmacSecret = next();
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (a.startsWith("--state=")) {
|
|
123
|
+
flags.state = a.slice(8);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (a.startsWith("--audit=")) {
|
|
127
|
+
flags.audit = a.slice(8);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (a.startsWith("--file=")) {
|
|
131
|
+
flags.file = a.slice(7);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (a.startsWith("--out=")) {
|
|
135
|
+
flags.out = a.slice(6);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (a.startsWith("--agent=")) {
|
|
139
|
+
flags.agent = a.slice(8);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (a.startsWith("--nonce=")) {
|
|
143
|
+
flags.nonce = a.slice(8);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (a.startsWith("--asset=")) {
|
|
147
|
+
flags.asset = a.slice(8);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (a.startsWith("--kind=")) {
|
|
151
|
+
const v = a.slice(7);
|
|
152
|
+
if (v !== "snapshot" && v !== "audit" && v !== "envelope" && v !== "authorization") {
|
|
153
|
+
throw new Error("Invalid --kind value (must be snapshot|audit|envelope|authorization)");
|
|
154
|
+
}
|
|
155
|
+
flags.kind = v;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (a.startsWith("--mode=")) {
|
|
159
|
+
const v = a.slice(7);
|
|
160
|
+
if (v !== "strict" && v !== "best-effort") {
|
|
161
|
+
throw new Error("Invalid --mode value (must be strict|best-effort)");
|
|
162
|
+
}
|
|
163
|
+
flags.mode = v;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (a.startsWith("--expected-policy-id=")) {
|
|
167
|
+
flags.expectedPolicyId = a.slice("--expected-policy-id=".length);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (a.startsWith("--expected-issuer=")) {
|
|
171
|
+
flags.expectedIssuer = a.slice("--expected-issuer=".length);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (a.startsWith("--expected-audience=")) {
|
|
175
|
+
flags.expectedAudience = a.slice("--expected-audience=".length);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (a.startsWith("--consumed-auth-id=")) {
|
|
179
|
+
flags.consumedAuthId = a.slice("--consumed-auth-id=".length);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (a.startsWith("--trusted-keyset=")) {
|
|
183
|
+
flags.trustedKeyset = a.slice("--trusted-keyset=".length);
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (a.startsWith("--legacy-hmac-secret=")) {
|
|
187
|
+
flags.legacyHmacSecret = a.slice("--legacy-hmac-secret=".length);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
throw new Error(`Unknown flag: ${a}`);
|
|
191
|
+
}
|
|
192
|
+
return { args, flags };
|
|
193
|
+
}
|
|
194
|
+
function toJson(value) {
|
|
195
|
+
return JSON.stringify(value, (_k, v) => (typeof v === "bigint" ? `${v.toString()}n` : v), 2);
|
|
196
|
+
}
|
|
197
|
+
function parseBigIntArg(input) {
|
|
198
|
+
const s = input.endsWith("n") ? input.slice(0, -1) : input;
|
|
199
|
+
return BigInt(s);
|
|
200
|
+
}
|
|
201
|
+
async function readStdinBytes() {
|
|
202
|
+
const chunks = [];
|
|
203
|
+
for await (const chunk of process.stdin) {
|
|
204
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
205
|
+
}
|
|
206
|
+
return Uint8Array.from(Buffer.concat(chunks));
|
|
207
|
+
}
|
|
208
|
+
function parseAuditInputBytes(bytes) {
|
|
209
|
+
const text = new TextDecoder().decode(bytes).trim();
|
|
210
|
+
if (text.length === 0)
|
|
211
|
+
return [];
|
|
212
|
+
if (text.startsWith("[")) {
|
|
213
|
+
const parsed = JSON.parse(text);
|
|
214
|
+
if (!Array.isArray(parsed))
|
|
215
|
+
throw new Error("audit payload must be a JSON array or NDJSON");
|
|
216
|
+
return parsed;
|
|
217
|
+
}
|
|
218
|
+
return text
|
|
219
|
+
.split("\n")
|
|
220
|
+
.map((line) => line.trim())
|
|
221
|
+
.filter(Boolean)
|
|
222
|
+
.map((line) => JSON.parse(line));
|
|
223
|
+
}
|
|
224
|
+
function parseJsonObjectBytes(bytes, label) {
|
|
225
|
+
const text = new TextDecoder().decode(bytes).trim();
|
|
226
|
+
if (text.length === 0)
|
|
227
|
+
throw new Error(`${label} payload is empty`);
|
|
228
|
+
const parsed = JSON.parse(text);
|
|
229
|
+
if (parsed === null || Array.isArray(parsed) || typeof parsed !== "object") {
|
|
230
|
+
throw new Error(`${label} payload must be a JSON object`);
|
|
231
|
+
}
|
|
232
|
+
return parsed;
|
|
233
|
+
}
|
|
234
|
+
function verificationExitCode(result) {
|
|
235
|
+
if (result.status === "ok")
|
|
236
|
+
return EXIT_CODE_OK;
|
|
237
|
+
if (result.status === "inconclusive")
|
|
238
|
+
return EXIT_CODE_INCONCLUSIVE;
|
|
239
|
+
return EXIT_CODE_INVALID;
|
|
240
|
+
}
|
|
241
|
+
function writePayload(out, flags, payload, humanSummary) {
|
|
242
|
+
if (flags.json) {
|
|
243
|
+
out(toJson(payload));
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (humanSummary) {
|
|
247
|
+
out(humanSummary);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
out(toJson(payload));
|
|
251
|
+
}
|
|
252
|
+
function verificationSummary(kind, result) {
|
|
253
|
+
const label = kind ?? "artifact";
|
|
254
|
+
const lines = [`${label}: ${result.status.toUpperCase()}`];
|
|
255
|
+
if (result.policyId)
|
|
256
|
+
lines.push(`policyId: ${result.policyId}`);
|
|
257
|
+
if (result.stateHash)
|
|
258
|
+
lines.push(`stateHash: ${result.stateHash}`);
|
|
259
|
+
if (result.auditHeadHash)
|
|
260
|
+
lines.push(`auditHeadHash: ${result.auditHeadHash}`);
|
|
261
|
+
if (result.violations.length === 0) {
|
|
262
|
+
lines.push("violations: none");
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
lines.push(`violations: ${result.violations.map((v) => v.code).join(", ")}`);
|
|
266
|
+
}
|
|
267
|
+
return lines.join("\n");
|
|
268
|
+
}
|
|
269
|
+
async function readTrustedKeySet(path) {
|
|
270
|
+
if (!path)
|
|
271
|
+
return undefined;
|
|
272
|
+
const text = await readFile(path, "utf8");
|
|
273
|
+
const parsed = JSON.parse(text);
|
|
274
|
+
if (Array.isArray(parsed))
|
|
275
|
+
return parsed;
|
|
276
|
+
if (parsed && typeof parsed === "object")
|
|
277
|
+
return [parsed];
|
|
278
|
+
throw new Error("trusted keyset payload must be a JSON object or array");
|
|
279
|
+
}
|
|
280
|
+
function buildValidationIntent(state) {
|
|
281
|
+
const agent = Object.keys(state.budget.budget_limit)[0] ?? "agent";
|
|
282
|
+
const action_type = state.allowlists.action_types?.[0] ?? "PAYMENT";
|
|
283
|
+
const target = state.allowlists.targets?.[0] ?? "target:probe";
|
|
284
|
+
return {
|
|
285
|
+
intent_id: "validate-intent",
|
|
286
|
+
type: "EXECUTE",
|
|
287
|
+
agent_id: agent,
|
|
288
|
+
action_type,
|
|
289
|
+
amount: 0n,
|
|
290
|
+
asset: state.allowlists.assets?.[0],
|
|
291
|
+
target,
|
|
292
|
+
timestamp: 0,
|
|
293
|
+
metadata_hash: "0x" + "0".repeat(64),
|
|
294
|
+
nonce: 0n,
|
|
295
|
+
signature: "validate-signature"
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
function validateStateStructure(state) {
|
|
299
|
+
const engine = new PolicyEngine({
|
|
300
|
+
policy_version: state.policy_version,
|
|
301
|
+
engine_secret: "validate-secret",
|
|
302
|
+
authorization_ttl_seconds: 1
|
|
303
|
+
});
|
|
304
|
+
const probe = buildValidationIntent(state);
|
|
305
|
+
const out = engine.evaluatePure(probe, structuredClone(state), { mode: "fail-fast" });
|
|
306
|
+
if (out.decision === "DENY" && out.reasons.includes("STATE_INVALID")) {
|
|
307
|
+
throw new Error("STATE_INVALID");
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function buildEngine(state) {
|
|
311
|
+
const secret = process.env["OXDEAI_ENGINE_SECRET"] ?? "dev-secret";
|
|
312
|
+
const ttl = Number(process.env["OXDEAI_AUTH_TTL_SECONDS"] ?? "120");
|
|
313
|
+
return new PolicyEngine({
|
|
314
|
+
policy_version: state.policy_version,
|
|
315
|
+
engine_secret: secret,
|
|
316
|
+
authorization_ttl_seconds: Number.isFinite(ttl) ? ttl : 120
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
export async function runCli(argv, io) {
|
|
320
|
+
const out = io?.out ?? ((line) => console.log(line));
|
|
321
|
+
const err = io?.err ?? ((line) => console.error(line));
|
|
322
|
+
const now = io?.now ?? (() => Math.floor(Date.now() / 1000));
|
|
323
|
+
let parsed;
|
|
324
|
+
try {
|
|
325
|
+
parsed = parseFlags(argv);
|
|
326
|
+
}
|
|
327
|
+
catch (e) {
|
|
328
|
+
err(e.message);
|
|
329
|
+
err(usage());
|
|
330
|
+
return EXIT_CODE_USAGE;
|
|
331
|
+
}
|
|
332
|
+
const { args, flags } = parsed;
|
|
333
|
+
const cmd = args[0];
|
|
334
|
+
if (!cmd) {
|
|
335
|
+
err(usage());
|
|
336
|
+
return EXIT_CODE_USAGE;
|
|
337
|
+
}
|
|
338
|
+
const statePath = flags.state ?? DEFAULT_STATE_PATH;
|
|
339
|
+
const auditPath = flags.audit ?? DEFAULT_AUDIT_PATH;
|
|
340
|
+
try {
|
|
341
|
+
if (cmd === "build") {
|
|
342
|
+
const state = await readStateFile(statePath);
|
|
343
|
+
const engine = buildEngine(state);
|
|
344
|
+
const snapshot = engine.exportState(state);
|
|
345
|
+
const snapshotBytes = encodeCanonicalState(snapshot);
|
|
346
|
+
const verified = verifySnapshot(snapshotBytes, flags.expectedPolicyId ? { expectedPolicyId: flags.expectedPolicyId } : undefined);
|
|
347
|
+
if (flags.out) {
|
|
348
|
+
await mkdir(dirname(flags.out), { recursive: true });
|
|
349
|
+
await writeFile(flags.out, Buffer.from(snapshotBytes));
|
|
350
|
+
}
|
|
351
|
+
const payload = {
|
|
352
|
+
ok: verified.ok,
|
|
353
|
+
status: verified.status,
|
|
354
|
+
policyId: snapshot.policyId,
|
|
355
|
+
stateHash: verified.stateHash,
|
|
356
|
+
violations: verified.violations,
|
|
357
|
+
snapshotBytes: snapshotBytes.length,
|
|
358
|
+
out: flags.out
|
|
359
|
+
};
|
|
360
|
+
writePayload(out, flags, payload, `build: ${verified.status.toUpperCase()}\npolicyId: ${snapshot.policyId}\nstateHash: ${verified.stateHash ?? "unknown"}${flags.out ? `\nout: ${flags.out}` : ""}`);
|
|
361
|
+
return verificationExitCode(verified);
|
|
362
|
+
}
|
|
363
|
+
if (cmd === "verify") {
|
|
364
|
+
if (!flags.kind)
|
|
365
|
+
throw new Error("Usage: verify --kind <snapshot|audit|envelope|authorization> [--file <path>|-]");
|
|
366
|
+
const mode = flags.mode ?? "strict";
|
|
367
|
+
const fromFile = flags.file && flags.file !== "-";
|
|
368
|
+
const bytes = fromFile
|
|
369
|
+
? Uint8Array.from(await readFile(flags.file))
|
|
370
|
+
: await readStdinBytes();
|
|
371
|
+
if (flags.kind === "snapshot") {
|
|
372
|
+
const res = verifySnapshot(bytes, flags.expectedPolicyId ? { expectedPolicyId: flags.expectedPolicyId } : undefined);
|
|
373
|
+
writePayload(out, flags, res, verificationSummary(flags.kind, res));
|
|
374
|
+
return verificationExitCode(res);
|
|
375
|
+
}
|
|
376
|
+
if (flags.kind === "envelope") {
|
|
377
|
+
const trustedKeySets = await readTrustedKeySet(flags.trustedKeyset);
|
|
378
|
+
const res = verifyEnvelope(bytes, {
|
|
379
|
+
mode,
|
|
380
|
+
expectedPolicyId: flags.expectedPolicyId,
|
|
381
|
+
expectedIssuer: flags.expectedIssuer,
|
|
382
|
+
trustedKeySets,
|
|
383
|
+
requireSignatureVerification: flags.requireSignatureVerification
|
|
384
|
+
});
|
|
385
|
+
writePayload(out, flags, res, verificationSummary(flags.kind, res));
|
|
386
|
+
return verificationExitCode(res);
|
|
387
|
+
}
|
|
388
|
+
if (flags.kind === "authorization") {
|
|
389
|
+
const trustedKeySets = await readTrustedKeySet(flags.trustedKeyset);
|
|
390
|
+
const auth = parseJsonObjectBytes(bytes, "authorization");
|
|
391
|
+
const res = verifyAuthorization(auth, {
|
|
392
|
+
now: now(),
|
|
393
|
+
expectedIssuer: flags.expectedIssuer,
|
|
394
|
+
expectedAudience: flags.expectedAudience,
|
|
395
|
+
expectedPolicyId: flags.expectedPolicyId,
|
|
396
|
+
consumedAuthIds: flags.consumedAuthId ? [flags.consumedAuthId] : [],
|
|
397
|
+
trustedKeySets,
|
|
398
|
+
requireSignatureVerification: flags.requireSignatureVerification,
|
|
399
|
+
legacyHmacSecret: flags.legacyHmacSecret
|
|
400
|
+
});
|
|
401
|
+
writePayload(out, flags, res, verificationSummary(flags.kind, res));
|
|
402
|
+
return verificationExitCode(res);
|
|
403
|
+
}
|
|
404
|
+
const events = parseAuditInputBytes(bytes);
|
|
405
|
+
const res = verifyAuditEvents(events, {
|
|
406
|
+
mode,
|
|
407
|
+
expectedPolicyId: flags.expectedPolicyId
|
|
408
|
+
});
|
|
409
|
+
writePayload(out, flags, res, verificationSummary(flags.kind, res));
|
|
410
|
+
return verificationExitCode(res);
|
|
411
|
+
}
|
|
412
|
+
if (cmd === "replay") {
|
|
413
|
+
const payload = {
|
|
414
|
+
ok: false,
|
|
415
|
+
status: "unsupported",
|
|
416
|
+
message: "Replay verifier is a protocol-aware stub in @oxdeai/cli v0.1.x. Use verify --kind audit for deterministic offline chain checks."
|
|
417
|
+
};
|
|
418
|
+
writePayload(out, flags, payload, `${payload.status.toUpperCase()}: ${payload.message}`);
|
|
419
|
+
return EXIT_CODE_OK;
|
|
420
|
+
}
|
|
421
|
+
if (cmd === "init") {
|
|
422
|
+
if (!flags.file)
|
|
423
|
+
throw new Error("Missing --file <policy.json>");
|
|
424
|
+
const text = await readFile(flags.file, "utf8");
|
|
425
|
+
const state = normalizeStateBigInts(JSON.parse(text));
|
|
426
|
+
validateStateStructure(state);
|
|
427
|
+
await writeStateFile(statePath, state);
|
|
428
|
+
await resetAuditFile(auditPath);
|
|
429
|
+
writePayload(out, flags, { ok: true }, "OK");
|
|
430
|
+
return EXIT_CODE_OK;
|
|
431
|
+
}
|
|
432
|
+
if (cmd === "state") {
|
|
433
|
+
const state = await readStateFile(statePath);
|
|
434
|
+
writePayload(out, flags, state);
|
|
435
|
+
return EXIT_CODE_OK;
|
|
436
|
+
}
|
|
437
|
+
if (cmd === "audit") {
|
|
438
|
+
const events = await readAuditEvents(auditPath);
|
|
439
|
+
const verified = verifyAuditEvents(events, { mode: "best-effort" });
|
|
440
|
+
const payload = {
|
|
441
|
+
headHash: verified.auditHeadHash && verified.auditHeadHash.length > 0 ? verified.auditHeadHash : "GENESIS",
|
|
442
|
+
verify: verified.ok,
|
|
443
|
+
events
|
|
444
|
+
};
|
|
445
|
+
writePayload(out, flags, payload);
|
|
446
|
+
return EXIT_CODE_OK;
|
|
447
|
+
}
|
|
448
|
+
if (cmd === "verify-audit") {
|
|
449
|
+
const events = await readAuditEvents(auditPath);
|
|
450
|
+
const verified = verifyAuditEvents(events, { mode: "strict" });
|
|
451
|
+
writePayload(out, flags, verified, verificationSummary("audit", verified));
|
|
452
|
+
return verificationExitCode(verified);
|
|
453
|
+
}
|
|
454
|
+
if (cmd === "verify-envelope") {
|
|
455
|
+
const file = args[1] ?? flags.file;
|
|
456
|
+
if (!file)
|
|
457
|
+
throw new Error("Usage: verify-envelope <file>");
|
|
458
|
+
const bytes = Uint8Array.from(await readFile(file));
|
|
459
|
+
const verified = verifyEnvelope(bytes, { mode: "strict" });
|
|
460
|
+
writePayload(out, flags, verified, verificationSummary("envelope", verified));
|
|
461
|
+
return verificationExitCode(verified);
|
|
462
|
+
}
|
|
463
|
+
if (cmd === "make-envelope") {
|
|
464
|
+
if (!flags.out)
|
|
465
|
+
throw new Error("Usage: make-envelope --out <file>");
|
|
466
|
+
const state = await readStateFile(statePath);
|
|
467
|
+
const events = await readAuditEvents(auditPath);
|
|
468
|
+
const engine = buildEngine(state);
|
|
469
|
+
const snapshotBytes = encodeCanonicalState(engine.exportState(state));
|
|
470
|
+
const envelope = encodeEnvelope({
|
|
471
|
+
formatVersion: 1,
|
|
472
|
+
snapshot: snapshotBytes,
|
|
473
|
+
events: events
|
|
474
|
+
});
|
|
475
|
+
await mkdir(dirname(flags.out), { recursive: true });
|
|
476
|
+
await writeFile(flags.out, Buffer.from(envelope));
|
|
477
|
+
const payload = { ok: true, file: flags.out };
|
|
478
|
+
writePayload(out, flags, payload, `OK: ${flags.out}`);
|
|
479
|
+
return EXIT_CODE_OK;
|
|
480
|
+
}
|
|
481
|
+
if (cmd === "snapshot-hash") {
|
|
482
|
+
const state = await readStateFile(statePath);
|
|
483
|
+
const engine = buildEngine(state);
|
|
484
|
+
const snapshot = engine.exportState(state);
|
|
485
|
+
const bytes = encodeCanonicalState(snapshot);
|
|
486
|
+
const verified = verifySnapshot(bytes);
|
|
487
|
+
const payload = {
|
|
488
|
+
policyId: snapshot.policyId,
|
|
489
|
+
stateHash: verified.stateHash,
|
|
490
|
+
status: verified.status,
|
|
491
|
+
violations: verified.violations
|
|
492
|
+
};
|
|
493
|
+
writePayload(out, flags, payload, `snapshot: ${verified.status.toUpperCase()}\npolicyId: ${snapshot.policyId}\nstateHash: ${verified.stateHash ?? "unknown"}`);
|
|
494
|
+
return verificationExitCode(verified);
|
|
495
|
+
}
|
|
496
|
+
if (cmd === "launch") {
|
|
497
|
+
const action = args[1];
|
|
498
|
+
const amountRaw = args[2];
|
|
499
|
+
const target = args[3];
|
|
500
|
+
if (!action || !amountRaw || !target)
|
|
501
|
+
throw new Error("Usage: launch <actionType> <amount> <target> --agent <id> --nonce <n>");
|
|
502
|
+
if (!ACTION_TYPES.has(action))
|
|
503
|
+
throw new Error(`Invalid actionType: ${action}`);
|
|
504
|
+
if (!flags.agent)
|
|
505
|
+
throw new Error("Missing --agent <id>");
|
|
506
|
+
if (!flags.nonce)
|
|
507
|
+
throw new Error("Missing --nonce <n>");
|
|
508
|
+
const state = await readStateFile(statePath);
|
|
509
|
+
const engine = buildEngine(state);
|
|
510
|
+
const ts = now();
|
|
511
|
+
const intent = {
|
|
512
|
+
intent_id: `intent:${flags.agent}:${flags.nonce}`,
|
|
513
|
+
type: "EXECUTE",
|
|
514
|
+
agent_id: flags.agent,
|
|
515
|
+
action_type: action,
|
|
516
|
+
amount: parseBigIntArg(amountRaw),
|
|
517
|
+
asset: flags.asset,
|
|
518
|
+
target,
|
|
519
|
+
timestamp: ts,
|
|
520
|
+
metadata_hash: "0x" + "0".repeat(64),
|
|
521
|
+
nonce: parseBigIntArg(flags.nonce),
|
|
522
|
+
signature: "cli-signature-placeholder"
|
|
523
|
+
};
|
|
524
|
+
const outEval = engine.evaluatePure(intent, state, { mode: "fail-fast" });
|
|
525
|
+
const emitted = engine.audit.snapshot();
|
|
526
|
+
await appendAuditEvents(auditPath, emitted);
|
|
527
|
+
if (outEval.decision === "ALLOW") {
|
|
528
|
+
await writeStateFile(statePath, outEval.nextState);
|
|
529
|
+
const payload = { decision: "ALLOW", authorization_id: outEval.authorization.authorization_id, reasons: [] };
|
|
530
|
+
writePayload(out, flags, payload, `ALLOW: ${payload.authorization_id}`);
|
|
531
|
+
return EXIT_CODE_OK;
|
|
532
|
+
}
|
|
533
|
+
const payload = { decision: "DENY", reasons: outEval.reasons };
|
|
534
|
+
writePayload(out, flags, payload, `DENY: ${toJson(payload.reasons)}`);
|
|
535
|
+
return EXIT_CODE_OK;
|
|
536
|
+
}
|
|
537
|
+
err(usage());
|
|
538
|
+
return EXIT_CODE_USAGE;
|
|
539
|
+
}
|
|
540
|
+
catch (e) {
|
|
541
|
+
err(e.message);
|
|
542
|
+
return EXIT_CODE_INVALID;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
async function main() {
|
|
546
|
+
const code = await runCli(process.argv.slice(2));
|
|
547
|
+
process.exit(code);
|
|
548
|
+
}
|
|
549
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
550
|
+
void main();
|
|
551
|
+
}
|
|
552
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { State } from "@oxdeai/core";
|
|
2
|
+
export declare function canonicalStringify(value: unknown): string;
|
|
3
|
+
export declare function normalizeStateBigInts(raw: unknown): State;
|
|
4
|
+
export declare function readStateFile(path: string): Promise<State>;
|
|
5
|
+
export declare function writeStateFile(path: string, state: State): Promise<void>;
|
|
6
|
+
export declare function resetAuditFile(path: string): Promise<void>;
|
|
7
|
+
export declare function appendAuditEvents(path: string, events: readonly unknown[]): Promise<void>;
|
|
8
|
+
export declare function readAuditEvents(path: string): Promise<unknown[]>;
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile, appendFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
function canonicalize(value) {
|
|
4
|
+
if (value === null)
|
|
5
|
+
return null;
|
|
6
|
+
if (typeof value === "bigint")
|
|
7
|
+
return `${value.toString()}n`;
|
|
8
|
+
if (typeof value === "boolean" || typeof value === "number" || typeof value === "string")
|
|
9
|
+
return value;
|
|
10
|
+
if (Array.isArray(value))
|
|
11
|
+
return value.map((v) => canonicalize(v));
|
|
12
|
+
if (typeof value === "object") {
|
|
13
|
+
const obj = value;
|
|
14
|
+
const out = {};
|
|
15
|
+
for (const key of Object.keys(obj).sort()) {
|
|
16
|
+
out[key] = canonicalize(obj[key]);
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
return String(value);
|
|
21
|
+
}
|
|
22
|
+
export function canonicalStringify(value) {
|
|
23
|
+
return JSON.stringify(canonicalize(value));
|
|
24
|
+
}
|
|
25
|
+
function parseBigIntLike(value) {
|
|
26
|
+
if (typeof value === "bigint")
|
|
27
|
+
return value;
|
|
28
|
+
if (typeof value === "number")
|
|
29
|
+
return BigInt(value);
|
|
30
|
+
if (typeof value === "string") {
|
|
31
|
+
const s = value.endsWith("n") ? value.slice(0, -1) : value;
|
|
32
|
+
return BigInt(s);
|
|
33
|
+
}
|
|
34
|
+
throw new Error("invalid bigint-like value");
|
|
35
|
+
}
|
|
36
|
+
function mapRecordBigInt(input) {
|
|
37
|
+
const rec = (input ?? {});
|
|
38
|
+
const out = {};
|
|
39
|
+
for (const key of Object.keys(rec))
|
|
40
|
+
out[key] = parseBigIntLike(rec[key]);
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
export function normalizeStateBigInts(raw) {
|
|
44
|
+
const s = raw;
|
|
45
|
+
return {
|
|
46
|
+
...s,
|
|
47
|
+
budget: {
|
|
48
|
+
...s.budget,
|
|
49
|
+
budget_limit: mapRecordBigInt(s.budget?.budget_limit),
|
|
50
|
+
spent_in_period: mapRecordBigInt(s.budget?.spent_in_period)
|
|
51
|
+
},
|
|
52
|
+
max_amount_per_action: mapRecordBigInt(s.max_amount_per_action)
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export async function readStateFile(path) {
|
|
56
|
+
const txt = await readFile(path, "utf8");
|
|
57
|
+
return normalizeStateBigInts(JSON.parse(txt));
|
|
58
|
+
}
|
|
59
|
+
export async function writeStateFile(path, state) {
|
|
60
|
+
await mkdir(dirname(path), { recursive: true });
|
|
61
|
+
await writeFile(path, `${canonicalStringify(state)}\n`, "utf8");
|
|
62
|
+
}
|
|
63
|
+
export async function resetAuditFile(path) {
|
|
64
|
+
await mkdir(dirname(path), { recursive: true });
|
|
65
|
+
await writeFile(path, "", "utf8");
|
|
66
|
+
}
|
|
67
|
+
export async function appendAuditEvents(path, events) {
|
|
68
|
+
if (events.length === 0)
|
|
69
|
+
return;
|
|
70
|
+
await mkdir(dirname(path), { recursive: true });
|
|
71
|
+
const body = events.map((e) => canonicalStringify(e)).join("\n") + "\n";
|
|
72
|
+
await appendFile(path, body, "utf8");
|
|
73
|
+
}
|
|
74
|
+
export async function readAuditEvents(path) {
|
|
75
|
+
try {
|
|
76
|
+
const txt = await readFile(path, "utf8");
|
|
77
|
+
const lines = txt.split("\n").map((l) => l.trim()).filter(Boolean);
|
|
78
|
+
return lines.map((line) => JSON.parse(line));
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error.code === "ENOENT")
|
|
82
|
+
return [];
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oxdeai/cli",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Protocol-focused CLI tooling for OxDeAI artifact build/verify/replay workflows",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"oxdeai": "dist/main.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md",
|
|
12
|
+
"CHANGELOG.md"
|
|
13
|
+
],
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@oxdeai/core": "workspace:*"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
19
|
+
"build": "rm -rf dist && tsc -p tsconfig.json",
|
|
20
|
+
"start": "node dist/main.js",
|
|
21
|
+
"test": "pnpm build && node --test \"dist/**/*.test.js\""
|
|
22
|
+
}
|
|
23
|
+
}
|