@aarmos/bridge 0.1.10 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridge.js +7 -129
- package/dist/chunk-GMH5B5YX.js +871 -0
- package/dist/index.js +1500 -219
- package/dist/verify-O6X7MFEE.js +409 -0
- package/package.json +4 -3
- package/dist/bridge.js.map +0 -1
- package/dist/commands/attest.js +0 -62
- package/dist/commands/attest.js.map +0 -1
- package/dist/commands/demo.js +0 -171
- package/dist/commands/demo.js.map +0 -1
- package/dist/commands/dev.js +0 -56
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/pack.js +0 -96
- package/dist/commands/pack.js.map +0 -1
- package/dist/commands/playbook.js +0 -55
- package/dist/commands/playbook.js.map +0 -1
- package/dist/commands/run.js +0 -290
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/simulate.js +0 -180
- package/dist/commands/simulate.js.map +0 -1
- package/dist/commands/verify.js +0 -87
- package/dist/commands/verify.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/attest.js +0 -167
- package/dist/lib/attest.js.map +0 -1
- package/dist/lib/http-broker.js +0 -82
- package/dist/lib/http-broker.js.map +0 -1
- package/dist/lib/llm-test.js +0 -174
- package/dist/lib/llm-test.js.map +0 -1
- package/dist/lib/mcp-broker.js +0 -85
- package/dist/lib/mcp-broker.js.map +0 -1
- package/dist/lib/pack.js +0 -84
- package/dist/lib/pack.js.map +0 -1
- package/dist/lib/playbook.js +0 -237
- package/dist/lib/playbook.js.map +0 -1
- package/dist/lib/scope-templates.js +0 -152
- package/dist/lib/scope-templates.js.map +0 -1
- package/dist/rpc/router.js +0 -349
- package/dist/rpc/router.js.map +0 -1
- package/dist/session.js +0 -100
- package/dist/session.js.map +0 -1
- package/dist/watchers/files.js +0 -31
- package/dist/watchers/files.js.map +0 -1
- package/dist/watchers/git.js +0 -39
- package/dist/watchers/git.js.map +0 -1
package/dist/lib/attest.js
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
// Attestation export — the audit-ready wedge.
|
|
2
|
-
//
|
|
3
|
-
// `aarmos attest` produces a single self-contained JSON artifact:
|
|
4
|
-
//
|
|
5
|
-
// {
|
|
6
|
-
// version: 1,
|
|
7
|
-
// createdAt, since, until,
|
|
8
|
-
// playbook?: { name, hash, signed, pubKey? },
|
|
9
|
-
// policyHash?: <sha256 of aarmos.json()>,
|
|
10
|
-
// packs: [{ name, version, hash }],
|
|
11
|
-
// receipts: [ ... hash-chained records from .aarmos/receipts.jsonl ... ],
|
|
12
|
-
// rootHash: <sha256 of the concatenated per-receipt hashes>,
|
|
13
|
-
// signature?: { alg: "ed25519", pubKey, sig } // over the body sans signature
|
|
14
|
-
// }
|
|
15
|
-
//
|
|
16
|
-
// `aarmos attest verify <file>` re-computes rootHash from the embedded
|
|
17
|
-
// receipts and, if a signature is present, verifies it. The verifier
|
|
18
|
-
// is a pure function of the file — no network, no daemon — so an
|
|
19
|
-
// auditor can run it air-gapped.
|
|
20
|
-
import fs from "node:fs/promises";
|
|
21
|
-
import path from "node:path";
|
|
22
|
-
import crypto from "node:crypto";
|
|
23
|
-
import { canonicalize, hashPlaybook, loadPlaybook } from "./playbook.js";
|
|
24
|
-
import { listInstalledPacks, hashPack } from "./pack.js";
|
|
25
|
-
export async function buildAttestation(opts) {
|
|
26
|
-
const until = opts.until ?? new Date();
|
|
27
|
-
const since = opts.since ?? new Date(0);
|
|
28
|
-
// --- receipts ---
|
|
29
|
-
const receipts = [];
|
|
30
|
-
try {
|
|
31
|
-
const raw = await fs.readFile(opts.receiptsFile, "utf8");
|
|
32
|
-
for (const line of raw.split("\n")) {
|
|
33
|
-
const t = line.trim();
|
|
34
|
-
if (!t)
|
|
35
|
-
continue;
|
|
36
|
-
let obj;
|
|
37
|
-
try {
|
|
38
|
-
obj = JSON.parse(t);
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
const at = Date.parse(obj.ts);
|
|
44
|
-
if (Number.isFinite(at) && at >= since.getTime() && at <= until.getTime()) {
|
|
45
|
-
receipts.push(obj);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
/* no receipts yet */
|
|
51
|
-
}
|
|
52
|
-
const rootHash = merkleRoot(receipts.map((r) => r.hash ?? ""));
|
|
53
|
-
// --- playbook ---
|
|
54
|
-
let playbookEntry;
|
|
55
|
-
if (opts.playbookFile) {
|
|
56
|
-
const pb = await loadPlaybook(opts.playbookFile);
|
|
57
|
-
playbookEntry = {
|
|
58
|
-
name: pb.name,
|
|
59
|
-
hash: hashPlaybook(pb),
|
|
60
|
-
signed: Boolean(pb.signature),
|
|
61
|
-
pubKey: pb.signature?.pubKey,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
// --- policy config (aarmos.json()) ---
|
|
65
|
-
let policyHash;
|
|
66
|
-
if (opts.policyFile) {
|
|
67
|
-
try {
|
|
68
|
-
const raw = await fs.readFile(opts.policyFile, "utf8");
|
|
69
|
-
policyHash = crypto.createHash("sha256").update(raw).digest("hex");
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
/* no policy file — omit */
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// --- installed packs ---
|
|
76
|
-
const packs = opts.packsDir
|
|
77
|
-
? (await listInstalledPacks(opts.packsDir)).map((p) => ({
|
|
78
|
-
name: p.name,
|
|
79
|
-
version: p.version,
|
|
80
|
-
hash: hashPack(p),
|
|
81
|
-
}))
|
|
82
|
-
: [];
|
|
83
|
-
return {
|
|
84
|
-
version: 1,
|
|
85
|
-
createdAt: new Date().toISOString(),
|
|
86
|
-
since: since.toISOString(),
|
|
87
|
-
until: until.toISOString(),
|
|
88
|
-
playbook: playbookEntry,
|
|
89
|
-
policyHash,
|
|
90
|
-
packs,
|
|
91
|
-
receipts,
|
|
92
|
-
rootHash,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
export function attestationBody(a) {
|
|
96
|
-
const { signature: _s, ...rest } = a;
|
|
97
|
-
void _s;
|
|
98
|
-
return canonicalize(rest);
|
|
99
|
-
}
|
|
100
|
-
export async function signAttestation(a, privateKeyPem) {
|
|
101
|
-
const key = crypto.createPrivateKey(privateKeyPem);
|
|
102
|
-
const sig = crypto.sign(null, Buffer.from(attestationBody(a)), key);
|
|
103
|
-
const pubDer = crypto.createPublicKey(key).export({ format: "der", type: "spki" });
|
|
104
|
-
const rawPub = pubDer.subarray(pubDer.length - 32);
|
|
105
|
-
const b64u = (b) => b.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
106
|
-
return { ...a, signature: { alg: "ed25519", pubKey: b64u(rawPub), sig: b64u(sig) } };
|
|
107
|
-
}
|
|
108
|
-
export function verifyAttestation(a) {
|
|
109
|
-
const recomputed = merkleRoot(a.receipts.map((r) => r.hash ?? ""));
|
|
110
|
-
if (recomputed !== a.rootHash) {
|
|
111
|
-
return { ok: false, reason: `rootHash mismatch (bundle=${a.rootHash} computed=${recomputed})` };
|
|
112
|
-
}
|
|
113
|
-
if (!a.signature)
|
|
114
|
-
return { ok: true };
|
|
115
|
-
if (a.signature.alg !== "ed25519") {
|
|
116
|
-
return { ok: false, reason: `unsupported alg: ${a.signature.alg}` };
|
|
117
|
-
}
|
|
118
|
-
try {
|
|
119
|
-
const spkiPrefix = Buffer.from([
|
|
120
|
-
0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00,
|
|
121
|
-
]);
|
|
122
|
-
const b64uDecode = (s) => Buffer.from(s.replace(/-/g, "+").replace(/_/g, "/") + "===".slice((s.length + 3) % 4), "base64");
|
|
123
|
-
const rawPub = b64uDecode(a.signature.pubKey);
|
|
124
|
-
if (rawPub.length !== 32)
|
|
125
|
-
return { ok: false, reason: "pubKey must be 32 bytes" };
|
|
126
|
-
const der = Buffer.concat([spkiPrefix, rawPub]);
|
|
127
|
-
const key = crypto.createPublicKey({ key: der, format: "der", type: "spki" });
|
|
128
|
-
const ok = crypto.verify(null, Buffer.from(attestationBody(a)), key, b64uDecode(a.signature.sig));
|
|
129
|
-
return ok ? { ok: true } : { ok: false, reason: "signature does not match bundle body" };
|
|
130
|
-
}
|
|
131
|
-
catch (err) {
|
|
132
|
-
return { ok: false, reason: err.message };
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/** Sequential hash chain: h(0) = sha256(""), h(i) = sha256(h(i-1) + receipts[i]). */
|
|
136
|
-
function merkleRoot(hashes) {
|
|
137
|
-
let acc = crypto.createHash("sha256").update("").digest("hex");
|
|
138
|
-
for (const h of hashes) {
|
|
139
|
-
acc = crypto
|
|
140
|
-
.createHash("sha256")
|
|
141
|
-
.update(acc + h)
|
|
142
|
-
.digest("hex");
|
|
143
|
-
}
|
|
144
|
-
return acc;
|
|
145
|
-
}
|
|
146
|
-
export function parseSince(s) {
|
|
147
|
-
const m = /^(\d+)\s*([hdm])$/.exec(s.trim());
|
|
148
|
-
if (m) {
|
|
149
|
-
const n = Number(m[1]);
|
|
150
|
-
const unit = m[2];
|
|
151
|
-
const ms = unit === "h" ? n * 3_600_000 : unit === "d" ? n * 86_400_000 : n * 60_000;
|
|
152
|
-
return new Date(Date.now() - ms);
|
|
153
|
-
}
|
|
154
|
-
const t = Date.parse(s);
|
|
155
|
-
if (Number.isFinite(t))
|
|
156
|
-
return new Date(t);
|
|
157
|
-
throw new Error(`--since: expected e.g. 24h, 7d, 30m, or an ISO date (got: ${s})`);
|
|
158
|
-
}
|
|
159
|
-
export async function writeAttestation(file, a) {
|
|
160
|
-
await fs.mkdir(path.dirname(path.resolve(file)), { recursive: true });
|
|
161
|
-
await fs.writeFile(path.resolve(file), JSON.stringify(a, null, 2) + "\n", "utf8");
|
|
162
|
-
}
|
|
163
|
-
export async function readAttestation(file) {
|
|
164
|
-
const raw = await fs.readFile(path.resolve(file), "utf8");
|
|
165
|
-
return JSON.parse(raw);
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=attest.js.map
|
package/dist/lib/attest.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"attest.js","sourceRoot":"","sources":["../../src/lib/attest.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/http-broker.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
// HTTP broker step kind — governed `http.call`.
|
|
2
|
-
//
|
|
3
|
-
// Scope model:
|
|
4
|
-
// - The operator opts hosts in via `--allow-http <host>` (repeatable).
|
|
5
|
-
// A step that targets a host outside the allowlist fails at simulate
|
|
6
|
-
// time and at run time, before any bytes leave the machine.
|
|
7
|
-
// - Bearer tokens are read from env vars named by the step
|
|
8
|
-
// (`bearerEnv`) — never inlined into the playbook JSON. Signing a
|
|
9
|
-
// playbook therefore does NOT bind a secret; the token is bound at
|
|
10
|
-
// the daemon.
|
|
11
|
-
// - Responses are capped at 1 MiB and previewed as
|
|
12
|
-
// `{ method, url, headers (redacted), bodyBytes }` so the PWA card
|
|
13
|
-
// stays useful without leaking a token.
|
|
14
|
-
import { z } from "zod";
|
|
15
|
-
export const HttpCallParams = z.object({
|
|
16
|
-
method: z.enum(["GET", "HEAD", "OPTIONS", "POST", "PUT", "PATCH", "DELETE"]).default("GET"),
|
|
17
|
-
url: z.string().url(),
|
|
18
|
-
headers: z.record(z.string()).optional(),
|
|
19
|
-
body: z.string().optional(), // caller stringifies JSON — keeps signing deterministic
|
|
20
|
-
bearerEnv: z.string().optional(),
|
|
21
|
-
timeoutMs: z.number().int().min(100).max(60_000).default(15_000),
|
|
22
|
-
});
|
|
23
|
-
export function hostOf(url) {
|
|
24
|
-
try {
|
|
25
|
-
return new URL(url).host;
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
return "";
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
export function previewHttpCall(p, allowed) {
|
|
32
|
-
const host = hostOf(p.url);
|
|
33
|
-
if (!allowed.has(host)) {
|
|
34
|
-
throw new Error(`http.call host not allowed: ${host} (start with --allow-http ${host} or add it to the pack)`);
|
|
35
|
-
}
|
|
36
|
-
const redactedHeaders = { ...(p.headers ?? {}) };
|
|
37
|
-
for (const k of Object.keys(redactedHeaders)) {
|
|
38
|
-
if (/^authorization$/i.test(k))
|
|
39
|
-
redactedHeaders[k] = "***";
|
|
40
|
-
}
|
|
41
|
-
if (p.bearerEnv)
|
|
42
|
-
redactedHeaders["Authorization"] = `Bearer $${p.bearerEnv}`;
|
|
43
|
-
return {
|
|
44
|
-
method: p.method,
|
|
45
|
-
url: p.url,
|
|
46
|
-
host,
|
|
47
|
-
headers: redactedHeaders,
|
|
48
|
-
bodyBytes: p.body?.length ?? 0,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
export async function executeHttpCall(p, allowed) {
|
|
52
|
-
const host = hostOf(p.url);
|
|
53
|
-
if (!allowed.has(host))
|
|
54
|
-
throw new Error(`http.call host not allowed: ${host}`);
|
|
55
|
-
const headers = { ...(p.headers ?? {}) };
|
|
56
|
-
if (p.bearerEnv) {
|
|
57
|
-
const tok = process.env[p.bearerEnv];
|
|
58
|
-
if (!tok)
|
|
59
|
-
throw new Error(`http.call: env ${p.bearerEnv} is not set on this host`);
|
|
60
|
-
headers["Authorization"] = `Bearer ${tok}`;
|
|
61
|
-
}
|
|
62
|
-
const controller = new AbortController();
|
|
63
|
-
const t = setTimeout(() => controller.abort(), p.timeoutMs);
|
|
64
|
-
try {
|
|
65
|
-
const res = await fetch(p.url, {
|
|
66
|
-
method: p.method,
|
|
67
|
-
headers,
|
|
68
|
-
body: p.body,
|
|
69
|
-
signal: controller.signal,
|
|
70
|
-
});
|
|
71
|
-
const bodyBuf = new Uint8Array(await res.arrayBuffer());
|
|
72
|
-
const capped = bodyBuf.length > 1_048_576 ? bodyBuf.slice(0, 1_048_576) : bodyBuf;
|
|
73
|
-
const bodySnippet = new TextDecoder("utf-8", { fatal: false }).decode(capped).slice(0, 4_000);
|
|
74
|
-
const outHeaders = {};
|
|
75
|
-
res.headers.forEach((v, k) => (outHeaders[k] = v));
|
|
76
|
-
return { status: res.status, headers: outHeaders, bodySnippet, bytes: bodyBuf.length };
|
|
77
|
-
}
|
|
78
|
-
finally {
|
|
79
|
-
clearTimeout(t);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=http-broker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http-broker.js","sourceRoot":"","sources":["../../src/lib/http-broker.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,eAAe;AACf,yEAAyE;AACzE,yEAAyE;AACzE,gEAAgE;AAChE,6DAA6D;AAC7D,sEAAsE;AACtE,uEAAuE;AACvE,kBAAkB;AAClB,qDAAqD;AACrD,uEAAuE;AACvE,4CAA4C;AAE5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3F,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,wDAAwD;IACrF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACjE,CAAC,CAAC;AAIH,MAAM,UAAU,MAAM,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAW,EAAE,OAAoB;IAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,6BAA6B,IAAI,yBAAyB,CAC9F,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,GAA2B,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7C,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,CAAC,SAAS;QAAE,eAAe,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC,CAAC,SAAS,EAAE,CAAC;IAC7E,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,IAAI;QACJ,OAAO,EAAE,eAAe;QACxB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,CAAW,EACX,OAAoB;IAOpB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,OAAO,GAA2B,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;IACjE,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,SAAS,0BAA0B,CAAC,CAAC;QACnF,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,GAAG,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;YAC7B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO;YACP,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAClF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9F,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IACzF,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/lib/llm-test.js
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
// Node-side "test connection" for a BYO-LLM config, mirroring the browser
|
|
2
|
-
// helper in src/lib/llm/test-connection.ts. Exposed as the `aarmos.testConnection`
|
|
3
|
-
// RPC so the CLI (via bridge) can dry-run a provider without minting a chat
|
|
4
|
-
// receipt. Pure fetch — no dependency on browser-only modules.
|
|
5
|
-
//
|
|
6
|
-
// The classifier maps raw provider errors into stable LLM_* AarmosError codes
|
|
7
|
-
// so every surface (Settings button, provider-health strip, CLI, bridge)
|
|
8
|
-
// speaks the same language. Codes intentionally live here (not avar-core):
|
|
9
|
-
// avar-core ships as the open verifier spec and must stay LLM-agnostic.
|
|
10
|
-
const DOCS = "https://aarmos.io/docs/byo-llm";
|
|
11
|
-
const DEFAULT_TIMEOUT_MS = 6_000;
|
|
12
|
-
const TEMPLATES = {
|
|
13
|
-
LLM_AUTH_INVALID: {
|
|
14
|
-
message: "Provider rejected the API key.",
|
|
15
|
-
hint: "Re-check the key in Settings → AI Provider. Rotated keys need to be pasted again.",
|
|
16
|
-
docsUrl: DOCS,
|
|
17
|
-
},
|
|
18
|
-
LLM_RATE_LIMITED: {
|
|
19
|
-
message: "Provider rate-limited the test request.",
|
|
20
|
-
hint: "Wait a few seconds and retry. Persistent 429s usually mean a per-minute cap on the account.",
|
|
21
|
-
docsUrl: DOCS,
|
|
22
|
-
},
|
|
23
|
-
LLM_QUOTA_EXCEEDED: {
|
|
24
|
-
message: "Provider account is out of credit/quota.",
|
|
25
|
-
hint: "Top up or switch provider. Test-connection uses 1 token — this is a real account problem, not the test.",
|
|
26
|
-
docsUrl: DOCS,
|
|
27
|
-
},
|
|
28
|
-
LLM_NETWORK: {
|
|
29
|
-
message: "Could not reach the provider.",
|
|
30
|
-
hint: "Check the machine's network. For self-hosted endpoints, verify the daemon is running.",
|
|
31
|
-
docsUrl: DOCS,
|
|
32
|
-
},
|
|
33
|
-
LLM_UNREACHABLE: {
|
|
34
|
-
message: "Custom endpoint did not respond.",
|
|
35
|
-
hint: "Verify the base URL is reachable from this machine (curl it) and CORS isn't blocking the browser client.",
|
|
36
|
-
docsUrl: DOCS,
|
|
37
|
-
},
|
|
38
|
-
LLM_TIMEOUT: {
|
|
39
|
-
message: "Provider did not respond within the test window.",
|
|
40
|
-
hint: "Retry, or raise the timeout. A cold container can take >6s on the first request.",
|
|
41
|
-
docsUrl: DOCS,
|
|
42
|
-
},
|
|
43
|
-
LLM_BAD_REQUEST: {
|
|
44
|
-
message: "Provider rejected the request shape.",
|
|
45
|
-
hint: "Usually a wrong model name or an endpoint that doesn't speak OpenAI-compatible chat completions.",
|
|
46
|
-
docsUrl: DOCS,
|
|
47
|
-
},
|
|
48
|
-
LLM_MODEL_NOT_FOUND: {
|
|
49
|
-
message: "Provider does not know that model.",
|
|
50
|
-
hint: "Pick a model the account has access to. Model IDs are case-sensitive.",
|
|
51
|
-
docsUrl: DOCS,
|
|
52
|
-
},
|
|
53
|
-
LLM_UNKNOWN: {
|
|
54
|
-
message: "Provider returned an unexpected error.",
|
|
55
|
-
hint: "Re-run with the CLI to see the raw upstream response, then file an issue if it looks like a bug.",
|
|
56
|
-
docsUrl: DOCS,
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
function makeError(code, overrides = {}) {
|
|
60
|
-
const base = TEMPLATES[code];
|
|
61
|
-
return {
|
|
62
|
-
code,
|
|
63
|
-
message: overrides.message ?? base.message,
|
|
64
|
-
hint: overrides.hint ?? base.hint,
|
|
65
|
-
docsUrl: overrides.docsUrl ?? base.docsUrl,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
export function classifyProviderError(status, message, providerId, isCustom, aborted = false) {
|
|
69
|
-
const msg = (message || "").toLowerCase();
|
|
70
|
-
const prefix = `${providerId}${status ? ` [${status}]` : ""}: `;
|
|
71
|
-
const wrap = (base) => ({
|
|
72
|
-
...base,
|
|
73
|
-
message: `${prefix}${message || base.message}`,
|
|
74
|
-
});
|
|
75
|
-
if (aborted || /abort/.test(msg))
|
|
76
|
-
return wrap(makeError("LLM_TIMEOUT"));
|
|
77
|
-
if (status === 401 ||
|
|
78
|
-
status === 403 ||
|
|
79
|
-
/invalid api key|unauthori[sz]ed|permission|forbidden/.test(msg)) {
|
|
80
|
-
return wrap(makeError("LLM_AUTH_INVALID"));
|
|
81
|
-
}
|
|
82
|
-
if (status === 429 || /rate.?limit|too many requests|rpm/.test(msg)) {
|
|
83
|
-
if (/quota|exhausted|billing|insufficient|credit/.test(msg)) {
|
|
84
|
-
return wrap(makeError("LLM_QUOTA_EXCEEDED"));
|
|
85
|
-
}
|
|
86
|
-
return wrap(makeError("LLM_RATE_LIMITED"));
|
|
87
|
-
}
|
|
88
|
-
if (status === 402 || /quota|exhausted|billing|insufficient|credit/.test(msg)) {
|
|
89
|
-
return wrap(makeError("LLM_QUOTA_EXCEEDED"));
|
|
90
|
-
}
|
|
91
|
-
if (status === 404 || /model.*(not.?found|does not exist|unknown)/.test(msg)) {
|
|
92
|
-
return wrap(makeError("LLM_MODEL_NOT_FOUND"));
|
|
93
|
-
}
|
|
94
|
-
if (status === 400 || status === 422)
|
|
95
|
-
return wrap(makeError("LLM_BAD_REQUEST"));
|
|
96
|
-
if (status === 0 || /failed to fetch|network|econnrefused|etimedout|enotfound|dns/.test(msg)) {
|
|
97
|
-
return wrap(makeError(isCustom ? "LLM_UNREACHABLE" : "LLM_NETWORK"));
|
|
98
|
-
}
|
|
99
|
-
return wrap(makeError("LLM_UNKNOWN"));
|
|
100
|
-
}
|
|
101
|
-
/** Return true when the URL is a safe absolute http(s) endpoint. */
|
|
102
|
-
function isValidEndpoint(u) {
|
|
103
|
-
try {
|
|
104
|
-
const url = new URL(u);
|
|
105
|
-
return url.protocol === "http:" || url.protocol === "https:";
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
export async function testLlmConnection(p) {
|
|
112
|
-
const providerId = p.providerId || "custom";
|
|
113
|
-
const isCustom = providerId === "custom" || !p.baseUrl.includes("api.openai.com");
|
|
114
|
-
if (!isValidEndpoint(p.baseUrl)) {
|
|
115
|
-
return {
|
|
116
|
-
ok: false,
|
|
117
|
-
latencyMs: 0,
|
|
118
|
-
error: classifyProviderError(0, `invalid baseUrl: ${p.baseUrl}`, providerId, isCustom),
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
if (!p.model) {
|
|
122
|
-
return {
|
|
123
|
-
ok: false,
|
|
124
|
-
latencyMs: 0,
|
|
125
|
-
error: classifyProviderError(400, "missing model id", providerId, isCustom),
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
const url = p.baseUrl.replace(/\/+$/, "") + "/chat/completions";
|
|
129
|
-
const headers = {
|
|
130
|
-
"Content-Type": "application/json",
|
|
131
|
-
...(p.apiKey ? { Authorization: `Bearer ${p.apiKey}` } : {}),
|
|
132
|
-
...(p.headers ?? {}),
|
|
133
|
-
};
|
|
134
|
-
const ctrl = new AbortController();
|
|
135
|
-
const timeoutMs = p.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
136
|
-
const timer = setTimeout(() => ctrl.abort(), timeoutMs);
|
|
137
|
-
const started = Date.now();
|
|
138
|
-
let aborted = false;
|
|
139
|
-
try {
|
|
140
|
-
const res = await fetch(url, {
|
|
141
|
-
method: "POST",
|
|
142
|
-
headers,
|
|
143
|
-
body: JSON.stringify({
|
|
144
|
-
model: p.model,
|
|
145
|
-
messages: [{ role: "user", content: "ping" }],
|
|
146
|
-
max_tokens: 1,
|
|
147
|
-
}),
|
|
148
|
-
signal: ctrl.signal,
|
|
149
|
-
});
|
|
150
|
-
const latencyMs = Date.now() - started;
|
|
151
|
-
if (res.ok)
|
|
152
|
-
return { ok: true, latencyMs, providerId, model: p.model };
|
|
153
|
-
const body = await res.text().catch(() => "");
|
|
154
|
-
return {
|
|
155
|
-
ok: false,
|
|
156
|
-
latencyMs,
|
|
157
|
-
error: classifyProviderError(res.status, body.slice(0, 240), providerId, isCustom),
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
catch (e) {
|
|
161
|
-
const latencyMs = Date.now() - started;
|
|
162
|
-
const raw = e instanceof Error ? e.message : String(e);
|
|
163
|
-
aborted = ctrl.signal.aborted;
|
|
164
|
-
return {
|
|
165
|
-
ok: false,
|
|
166
|
-
latencyMs,
|
|
167
|
-
error: classifyProviderError(0, raw, providerId, isCustom, aborted),
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
finally {
|
|
171
|
-
clearTimeout(timer);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=llm-test.js.map
|
package/dist/lib/llm-test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-test.js","sourceRoot":"","sources":["../../src/lib/llm-test.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/mcp-broker.js
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
// MCP broker step kind — governed `mcp.tool` calls over Streamable HTTP.
|
|
2
|
-
//
|
|
3
|
-
// The daemon speaks raw MCP JSON-RPC 2.0 to remote servers so the CLI
|
|
4
|
-
// stays dependency-free (no @ai-sdk/mcp on the server surface). Every
|
|
5
|
-
// endpoint must be opted in via `--allow-mcp <url>` — this is how we
|
|
6
|
-
// stop a playbook from silently rerouting itself to an attacker's MCP
|
|
7
|
-
// server after signing.
|
|
8
|
-
import { z } from "zod";
|
|
9
|
-
export const McpToolParams = z.object({
|
|
10
|
-
endpoint: z.string().url(),
|
|
11
|
-
tool: z.string().min(1),
|
|
12
|
-
args: z.record(z.unknown()).default({}),
|
|
13
|
-
bearerEnv: z.string().optional(),
|
|
14
|
-
/** Optional operator hint for the risk classifier. Defaults to "write". */
|
|
15
|
-
riskHint: z.enum(["read", "write", "destructive"]).optional(),
|
|
16
|
-
timeoutMs: z.number().int().min(100).max(60_000).default(15_000),
|
|
17
|
-
});
|
|
18
|
-
export function previewMcpTool(p, allowed) {
|
|
19
|
-
if (!allowed.has(p.endpoint)) {
|
|
20
|
-
throw new Error(`mcp.tool endpoint not allowed: ${p.endpoint} (start with --allow-mcp ${p.endpoint})`);
|
|
21
|
-
}
|
|
22
|
-
return {
|
|
23
|
-
endpoint: p.endpoint,
|
|
24
|
-
tool: p.tool,
|
|
25
|
-
argKeys: Object.keys(p.args ?? {}),
|
|
26
|
-
riskHint: p.riskHint ?? "write",
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
export async function executeMcpTool(p, allowed) {
|
|
30
|
-
if (!allowed.has(p.endpoint))
|
|
31
|
-
throw new Error(`mcp.tool endpoint not allowed: ${p.endpoint}`);
|
|
32
|
-
const headers = {
|
|
33
|
-
"Content-Type": "application/json",
|
|
34
|
-
// Streamable HTTP servers reject requests without both types.
|
|
35
|
-
Accept: "application/json, text/event-stream",
|
|
36
|
-
};
|
|
37
|
-
if (p.bearerEnv) {
|
|
38
|
-
const tok = process.env[p.bearerEnv];
|
|
39
|
-
if (!tok)
|
|
40
|
-
throw new Error(`mcp.tool: env ${p.bearerEnv} is not set on this host`);
|
|
41
|
-
headers["Authorization"] = `Bearer ${tok}`;
|
|
42
|
-
}
|
|
43
|
-
const body = JSON.stringify({
|
|
44
|
-
jsonrpc: "2.0",
|
|
45
|
-
id: Date.now(),
|
|
46
|
-
method: "tools/call",
|
|
47
|
-
params: { name: p.tool, arguments: p.args ?? {} },
|
|
48
|
-
});
|
|
49
|
-
const controller = new AbortController();
|
|
50
|
-
const t = setTimeout(() => controller.abort(), p.timeoutMs);
|
|
51
|
-
try {
|
|
52
|
-
const res = await fetch(p.endpoint, {
|
|
53
|
-
method: "POST",
|
|
54
|
-
headers,
|
|
55
|
-
body,
|
|
56
|
-
signal: controller.signal,
|
|
57
|
-
});
|
|
58
|
-
const text = await res.text();
|
|
59
|
-
// Streamable HTTP may return SSE frames; extract the first `data:` payload if so.
|
|
60
|
-
const payload = text.startsWith("event:") || text.includes("\ndata:") ? extractFirstSseData(text) : text;
|
|
61
|
-
let parsed = payload;
|
|
62
|
-
try {
|
|
63
|
-
parsed = JSON.parse(payload);
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
/* leave as text */
|
|
67
|
-
}
|
|
68
|
-
const envelope = parsed;
|
|
69
|
-
if (envelope && typeof envelope === "object" && "error" in envelope && envelope.error) {
|
|
70
|
-
return { ok: false, error: envelope.error };
|
|
71
|
-
}
|
|
72
|
-
return { ok: res.ok, result: envelope?.result ?? parsed };
|
|
73
|
-
}
|
|
74
|
-
finally {
|
|
75
|
-
clearTimeout(t);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
function extractFirstSseData(text) {
|
|
79
|
-
for (const line of text.split(/\r?\n/)) {
|
|
80
|
-
if (line.startsWith("data:"))
|
|
81
|
-
return line.slice(5).trim();
|
|
82
|
-
}
|
|
83
|
-
return text;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=mcp-broker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-broker.js","sourceRoot":"","sources":["../../src/lib/mcp-broker.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/pack.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
// Certified playbook packs — versioned bundles of playbooks, scope
|
|
2
|
-
// templates, and pre-classified risk rankings.
|
|
3
|
-
//
|
|
4
|
-
// Format (single JSON file, optionally signed):
|
|
5
|
-
// {
|
|
6
|
-
// "name": "@aarmos/k8s-safeguards",
|
|
7
|
-
// "version": "0.1.0",
|
|
8
|
-
// "instructions": "Governed kubectl playbooks for restart / scale / drain.",
|
|
9
|
-
// "playbooks": [ Playbook, ... ], // same shape as a standalone playbook
|
|
10
|
-
// "allow": {
|
|
11
|
-
// "shell": ["kubectl"],
|
|
12
|
-
// "http": ["api.github.com"],
|
|
13
|
-
// "mcp": ["https://mcp.example/atlassian"]
|
|
14
|
-
// },
|
|
15
|
-
// "signature"?: { alg: "ed25519", pubKey, sig }
|
|
16
|
-
// }
|
|
17
|
-
//
|
|
18
|
-
// The pack itself is signed with the SAME ed25519 primitive as
|
|
19
|
-
// playbooks (see lib/playbook.ts). `aarmos pack verify` and
|
|
20
|
-
// `aarmos run --enforce-signatures` both accept a pack pubkey.
|
|
21
|
-
//
|
|
22
|
-
// Install writes to `.aarmos/packs/<safe-name>-<version>/pack.json`
|
|
23
|
-
// so packs are inspectable, diff-able in git, and never mutate the
|
|
24
|
-
// operator's global state.
|
|
25
|
-
import fs from "node:fs/promises";
|
|
26
|
-
import path from "node:path";
|
|
27
|
-
import crypto from "node:crypto";
|
|
28
|
-
import { canonicalize } from "./playbook.js";
|
|
29
|
-
export function packBody(pack) {
|
|
30
|
-
const { signature: _s, ...rest } = pack;
|
|
31
|
-
void _s;
|
|
32
|
-
return canonicalize(rest);
|
|
33
|
-
}
|
|
34
|
-
export function hashPack(pack) {
|
|
35
|
-
return crypto.createHash("sha256").update(packBody(pack)).digest("hex");
|
|
36
|
-
}
|
|
37
|
-
export async function loadPack(p) {
|
|
38
|
-
const raw = await fs.readFile(path.resolve(p), "utf8");
|
|
39
|
-
const parsed = JSON.parse(raw);
|
|
40
|
-
if (!parsed?.name || typeof parsed.name !== "string")
|
|
41
|
-
throw new Error("pack.name required");
|
|
42
|
-
if (!parsed.version || typeof parsed.version !== "string")
|
|
43
|
-
throw new Error("pack.version required");
|
|
44
|
-
if (!Array.isArray(parsed.playbooks) || parsed.playbooks.length === 0) {
|
|
45
|
-
throw new Error("pack.playbooks must be a non-empty array");
|
|
46
|
-
}
|
|
47
|
-
return parsed;
|
|
48
|
-
}
|
|
49
|
-
const SAFE_NAME_RE = /[^a-zA-Z0-9._-]/g;
|
|
50
|
-
export function packInstallDir(pack, rootDir) {
|
|
51
|
-
const safe = pack.name.replace(SAFE_NAME_RE, "_");
|
|
52
|
-
return path.join(rootDir, `${safe}-${pack.version}`);
|
|
53
|
-
}
|
|
54
|
-
export async function installPack(source, rootDir) {
|
|
55
|
-
const pack = await loadPack(source);
|
|
56
|
-
const dir = packInstallDir(pack, rootDir);
|
|
57
|
-
await fs.mkdir(dir, { recursive: true });
|
|
58
|
-
const dest = path.join(dir, "pack.json");
|
|
59
|
-
await fs.writeFile(dest, JSON.stringify(pack, null, 2) + "\n", "utf8");
|
|
60
|
-
return { pack, installed: dest };
|
|
61
|
-
}
|
|
62
|
-
export async function listInstalledPacks(rootDir) {
|
|
63
|
-
const out = [];
|
|
64
|
-
try {
|
|
65
|
-
const entries = await fs.readdir(rootDir, { withFileTypes: true });
|
|
66
|
-
for (const e of entries) {
|
|
67
|
-
if (!e.isDirectory())
|
|
68
|
-
continue;
|
|
69
|
-
const file = path.join(rootDir, e.name, "pack.json");
|
|
70
|
-
try {
|
|
71
|
-
const raw = await fs.readFile(file, "utf8");
|
|
72
|
-
out.push(JSON.parse(raw));
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
/* ignore malformed */
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
/* no packs dir yet */
|
|
81
|
-
}
|
|
82
|
-
return out;
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=pack.js.map
|
package/dist/lib/pack.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/lib/pack.ts"],"names":[],"mappings":"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"}
|