@aarmos/bridge 0.1.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.
Files changed (43) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +280 -0
  3. package/dist/bridge.js +129 -0
  4. package/dist/bridge.js.map +1 -0
  5. package/dist/commands/attest.js +62 -0
  6. package/dist/commands/attest.js.map +1 -0
  7. package/dist/commands/demo.js +169 -0
  8. package/dist/commands/demo.js.map +1 -0
  9. package/dist/commands/dev.js +56 -0
  10. package/dist/commands/dev.js.map +1 -0
  11. package/dist/commands/pack.js +94 -0
  12. package/dist/commands/pack.js.map +1 -0
  13. package/dist/commands/playbook.js +55 -0
  14. package/dist/commands/playbook.js.map +1 -0
  15. package/dist/commands/run.js +279 -0
  16. package/dist/commands/run.js.map +1 -0
  17. package/dist/commands/simulate.js +181 -0
  18. package/dist/commands/simulate.js.map +1 -0
  19. package/dist/commands/verify.js +81 -0
  20. package/dist/commands/verify.js.map +1 -0
  21. package/dist/index.js +231 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/lib/attest.js +160 -0
  24. package/dist/lib/attest.js.map +1 -0
  25. package/dist/lib/http-broker.js +82 -0
  26. package/dist/lib/http-broker.js.map +1 -0
  27. package/dist/lib/mcp-broker.js +80 -0
  28. package/dist/lib/mcp-broker.js.map +1 -0
  29. package/dist/lib/pack.js +80 -0
  30. package/dist/lib/pack.js.map +1 -0
  31. package/dist/lib/playbook.js +199 -0
  32. package/dist/lib/playbook.js.map +1 -0
  33. package/dist/lib/scope-templates.js +129 -0
  34. package/dist/lib/scope-templates.js.map +1 -0
  35. package/dist/rpc/router.js +321 -0
  36. package/dist/rpc/router.js.map +1 -0
  37. package/dist/session.js +100 -0
  38. package/dist/session.js.map +1 -0
  39. package/dist/watchers/files.js +31 -0
  40. package/dist/watchers/files.js.map +1 -0
  41. package/dist/watchers/git.js +39 -0
  42. package/dist/watchers/git.js.map +1 -0
  43. package/package.json +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attest.js","sourceRoot":"","sources":["../../src/commands/attest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import { createSession } from "../session.js";
4
+ import { handleRpc } from "../rpc/router.js";
5
+ /**
6
+ * `aarmos demo` — scripted end-to-end walkthrough of the dry-run pipeline.
7
+ *
8
+ * No PWA, no devtools, no pairing. It spins up an in-process Session against
9
+ * the current workspace (should be examples/basic-agent/ for the safe
10
+ * playground), proposes a couple of representative mutations, prints the
11
+ * previews the PWA would render, and — only if `--apply` is passed — commits
12
+ * them via the same `apply.batch` RPC the drawer uses.
13
+ */
14
+ export async function runDemo(opts) {
15
+ const workspace = path.resolve(opts.workspace ?? process.cwd());
16
+ const session = createSession({ workspace, extraShellAllow: [] });
17
+ log("");
18
+ log(` aarmos demo`);
19
+ log(` workspace : ${workspace}`);
20
+ log(` mode : ${opts.apply ? "PREVIEW + APPLY" : "PREVIEW ONLY (pass --apply to commit)"}`);
21
+ log("");
22
+ await ensureSampleFiles(workspace);
23
+ // Build the batch of proposed actions.
24
+ const todoPath = "notes/todo.md";
25
+ const existingTodo = await safeRead(path.join(workspace, todoPath));
26
+ const newTodo = (existingTodo ?? "# Todo\n\n") +
27
+ `- [ ] Added by \`aarmos demo\` at ${new Date().toISOString()}\n`;
28
+ const proposals = [
29
+ {
30
+ label: "Append a checklist item to notes/todo.md",
31
+ method: "fs.write",
32
+ params: { path: todoPath, data: newTodo, encoding: "utf8" },
33
+ },
34
+ {
35
+ label: "Inspect the workspace with `git status`",
36
+ method: "shell.exec",
37
+ params: { bin: "git", args: ["status", "--short"], cwd: "." },
38
+ },
39
+ {
40
+ label: "Say hello via `node src/hello.js aarmos`",
41
+ method: "shell.exec",
42
+ params: { bin: "node", args: ["src/hello.js", "aarmos"], cwd: "." },
43
+ },
44
+ ];
45
+ // 1) Dry-run: get previews for each proposal.
46
+ log(" proposed batch (dry-run previews):");
47
+ log("");
48
+ const collected = [];
49
+ for (let i = 0; i < proposals.length; i++) {
50
+ const p = proposals[i];
51
+ const res = await call(session, p.method, p.params);
52
+ log(` [${i + 1}] ${p.label}`);
53
+ if (isPreview(res)) {
54
+ renderPreview(res.action);
55
+ collected.push({ kind: res.action.kind, params: res.action.params });
56
+ }
57
+ else {
58
+ log(` (no preview) ${JSON.stringify(res)}`);
59
+ }
60
+ log("");
61
+ }
62
+ if (!opts.apply) {
63
+ log(" nothing was written. rerun with --apply to commit the batch.");
64
+ log("");
65
+ return;
66
+ }
67
+ // 2) Apply: commit the whole batch atomically via apply.batch.
68
+ log(" applying batch via apply.batch …");
69
+ const applyRes = (await call(session, "apply.batch", { actions: collected }));
70
+ log(` applied ${applyRes.applied}/${collected.length} action(s):`);
71
+ applyRes.results.forEach((r, i) => {
72
+ if (r.ok) {
73
+ log(` ✓ [${i + 1}] ${r.kind}`);
74
+ if (r.kind === "shell.exec" && r.result && typeof r.result === "object") {
75
+ const sh = r.result;
76
+ if (sh.stdout?.trim())
77
+ indented(sh.stdout.trim());
78
+ if (sh.stderr?.trim())
79
+ indented(sh.stderr.trim());
80
+ }
81
+ }
82
+ else {
83
+ log(` ✗ [${i + 1}] ${r.kind}: ${r.error}`);
84
+ }
85
+ });
86
+ log("");
87
+ }
88
+ function isPreview(x) {
89
+ return !!x && typeof x === "object" && x.preview === true;
90
+ }
91
+ async function call(session, method, params) {
92
+ const res = await handleRpc(session, { id: 1, type: "rpc", method, params });
93
+ if ("type" in res && res.type === "error")
94
+ throw new Error(res.error);
95
+ if ("type" in res && res.type === "result")
96
+ return res.result;
97
+ throw new Error("unexpected rpc envelope");
98
+ }
99
+ function renderPreview(action) {
100
+ const pv = action.preview;
101
+ if (action.kind === "fs.write") {
102
+ const before = String(pv.before ?? "");
103
+ const after = String(pv.after ?? "");
104
+ log(` path : ${pv.path}`);
105
+ log(` existed : ${pv.existed} bytes: ${pv.bytesBefore} → ${pv.bytesAfter}`);
106
+ log(` diff :`);
107
+ for (const line of unifiedDiff(before, after))
108
+ log(` ${line}`);
109
+ }
110
+ else {
111
+ log(` command : ${pv.commandLine}`);
112
+ log(` cwd : ${pv.cwd}`);
113
+ }
114
+ }
115
+ function unifiedDiff(before, after) {
116
+ // Tiny line-level diff — good enough for terminal preview parity with the drawer.
117
+ const a = before.split("\n");
118
+ const b = after.split("\n");
119
+ const out = [];
120
+ const max = Math.max(a.length, b.length);
121
+ for (let i = 0; i < max; i++) {
122
+ if (a[i] === b[i]) {
123
+ if (a[i] !== undefined)
124
+ out.push(` ${a[i]}`);
125
+ }
126
+ else {
127
+ if (a[i] !== undefined)
128
+ out.push(`- ${a[i]}`);
129
+ if (b[i] !== undefined)
130
+ out.push(`+ ${b[i]}`);
131
+ }
132
+ }
133
+ return out;
134
+ }
135
+ async function safeRead(abs) {
136
+ try {
137
+ return await fs.readFile(abs, "utf8");
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ }
143
+ async function ensureSampleFiles(workspace) {
144
+ // If the user ran `aarmos demo` outside the sample workspace, seed a minimal
145
+ // notes/todo.md so the demo still has something to diff against.
146
+ const todo = path.join(workspace, "notes/todo.md");
147
+ try {
148
+ await fs.access(todo);
149
+ }
150
+ catch {
151
+ await fs.mkdir(path.dirname(todo), { recursive: true });
152
+ await fs.writeFile(todo, "# Todo\n\n- [ ] Try the aarmos dry-run demo\n");
153
+ }
154
+ const hello = path.join(workspace, "src/hello.js");
155
+ try {
156
+ await fs.access(hello);
157
+ }
158
+ catch {
159
+ await fs.mkdir(path.dirname(hello), { recursive: true });
160
+ await fs.writeFile(hello, "const name = process.argv[2] || 'world';\nconsole.log(`hello, ${name} — from the aarmos sample workspace`);\n");
161
+ }
162
+ }
163
+ // eslint-disable-next-line no-console
164
+ function log(s) { console.log(s); }
165
+ function indented(s) {
166
+ for (const line of s.split("\n"))
167
+ log(` │ ${line}`);
168
+ }
169
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import crypto from "node:crypto";
2
+ import path from "node:path";
3
+ import open from "open";
4
+ import { startBridge } from "../bridge.js";
5
+ export async function startDev(opts) {
6
+ const workspace = path.resolve(process.cwd());
7
+ const pairingToken = crypto.randomBytes(24).toString("base64url");
8
+ const { port, url: wsUrl } = await startBridge({
9
+ port: opts.port,
10
+ workspace,
11
+ pairingToken,
12
+ extraShellAllow: opts.extraShellAllow,
13
+ sqlAllow: opts.sqlAllow,
14
+ readAllow: opts.readAllow,
15
+ allowedOrigins: buildAllowedOrigins(opts.pwaUrl),
16
+ });
17
+ const pairUrl = new URL(opts.pwaUrl);
18
+ pairUrl.searchParams.set("bridge", "1");
19
+ pairUrl.searchParams.set("port", String(port));
20
+ pairUrl.searchParams.set("token", pairingToken);
21
+ // eslint-disable-next-line no-console
22
+ console.log(`\n aarmos bridge ready`);
23
+ // eslint-disable-next-line no-console
24
+ console.log(` workspace : ${workspace}`);
25
+ // eslint-disable-next-line no-console
26
+ console.log(` ws : ${wsUrl}`);
27
+ if (opts.sqlAllow.length > 0) {
28
+ // eslint-disable-next-line no-console
29
+ console.log(` sql : ${opts.sqlAllow.map((s) => s.alias).join(", ")} (read-only)`);
30
+ }
31
+ if (opts.readAllow.length > 0) {
32
+ // eslint-disable-next-line no-console
33
+ console.log(` read : ${opts.readAllow.join(", ")}`);
34
+ }
35
+ // eslint-disable-next-line no-console
36
+ console.log(` pair url : ${pairUrl.toString()}\n`);
37
+ if (opts.autoOpen) {
38
+ try {
39
+ await open(pairUrl.toString());
40
+ }
41
+ catch {
42
+ // eslint-disable-next-line no-console
43
+ console.warn("[aarmos] could not auto-open browser; paste the pair url above");
44
+ }
45
+ }
46
+ }
47
+ function buildAllowedOrigins(pwaUrl) {
48
+ const url = new URL(pwaUrl);
49
+ const set = new Set([url.origin]);
50
+ // Common Lovable preview + local dev origins so pairing works from a preview build.
51
+ set.add("https://www.aarmatix.com");
52
+ set.add("http://localhost:8080");
53
+ set.add("http://127.0.0.1:8080");
54
+ return [...set];
55
+ }
56
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ // `aarmos pack ...` — install / list / verify certified playbook packs.
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import crypto from "node:crypto";
5
+ import { installPack, listInstalledPacks, loadPack, hashPack, packInstallDir, packBody, } from "../lib/pack.js";
6
+ import { verifyPlaybookSignature } from "../lib/playbook.js";
7
+ // eslint-disable-next-line no-console
8
+ const log = (s) => console.log(s);
9
+ const PACKS_DIR = ".aarmos/packs";
10
+ export async function packInstall(opts) {
11
+ const root = path.resolve(opts.workspace ?? process.cwd(), PACKS_DIR);
12
+ const { pack, installed } = await installPack(opts.source, root);
13
+ log("");
14
+ log(` installed ${pack.name}@${pack.version}`);
15
+ log(` hash : ${hashPack(pack)}`);
16
+ log(` signed : ${pack.signature ? pack.signature.pubKey : "(no)"}`);
17
+ log(` at : ${installed}`);
18
+ log("");
19
+ log(" Next: run one of the pack's playbooks");
20
+ for (const pb of pack.playbooks) {
21
+ log(` aarmos run --playbook ${path.join(packInstallDir(pack, PACKS_DIR), "playbook." + safe(pb.name) + ".json")}`);
22
+ }
23
+ // Also write each embedded playbook to its own file for easy `--playbook`.
24
+ const dir = packInstallDir(pack, root);
25
+ for (const pb of pack.playbooks) {
26
+ const pbFile = path.join(dir, `playbook.${safe(pb.name)}.json`);
27
+ await fs.writeFile(pbFile, JSON.stringify(pb, null, 2) + "\n", "utf8");
28
+ }
29
+ log("");
30
+ }
31
+ export async function packList(opts) {
32
+ const root = path.resolve(opts.workspace ?? process.cwd(), PACKS_DIR);
33
+ const packs = await listInstalledPacks(root);
34
+ log("");
35
+ log(` installed packs (${root})`);
36
+ if (packs.length === 0)
37
+ log(" (none)");
38
+ for (const p of packs) {
39
+ log(` ${p.name}@${p.version} hash=${hashPack(p).slice(0, 16)}… signed=${p.signature ? "yes" : "no"} playbooks=${p.playbooks.length}`);
40
+ }
41
+ log("");
42
+ }
43
+ export async function packVerify(opts) {
44
+ const pack = await loadPack(opts.source);
45
+ log("");
46
+ log(` aarmos pack verify — ${pack.name}@${pack.version}`);
47
+ log(` hash : ${hashPack(pack)}`);
48
+ if (!pack.signature) {
49
+ log(" signed : NO");
50
+ process.exitCode = 1;
51
+ return;
52
+ }
53
+ const ok = verifyPackSignatureDirect(pack);
54
+ log(` signer : ${pack.signature.pubKey}`);
55
+ log(` result : ${ok ? "OK" : "INVALID"}`);
56
+ if (opts.trustedPubkey && pack.signature.pubKey !== opts.trustedPubkey) {
57
+ log(" trust : REJECTED — signer not in trusted set");
58
+ process.exitCode = 1;
59
+ }
60
+ else if (!ok) {
61
+ process.exitCode = 1;
62
+ }
63
+ for (const pb of pack.playbooks) {
64
+ if (pb.signature) {
65
+ const v = verifyPlaybookSignature(pb);
66
+ log(` playbook signature (${pb.name}): ${v.ok ? "OK" : "INVALID"}${v.reason ? " " + v.reason : ""}`);
67
+ }
68
+ }
69
+ log("");
70
+ }
71
+ // Direct Ed25519 verify against the canonical pack body — kept here to
72
+ // avoid growing the pack library with a crypto surface just for the CLI.
73
+ function verifyPackSignatureDirect(pack) {
74
+ if (!pack.signature)
75
+ return false;
76
+ const body = Buffer.from(packBody(pack));
77
+ try {
78
+ const spkiPrefix = Buffer.from([0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00]);
79
+ const b64uDecode = (s) => Buffer.from(s.replace(/-/g, "+").replace(/_/g, "/") + "===".slice((s.length + 3) % 4), "base64");
80
+ const rawPub = b64uDecode(pack.signature.pubKey);
81
+ if (rawPub.length !== 32)
82
+ return false;
83
+ const der = Buffer.concat([spkiPrefix, rawPub]);
84
+ const key = crypto.createPublicKey({ key: der, format: "der", type: "spki" });
85
+ return crypto.verify(null, body, key, b64uDecode(pack.signature.sig));
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ function safe(s) {
92
+ return s.replace(/[^a-zA-Z0-9._-]/g, "_");
93
+ }
94
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ // `aarmos playbook keygen|sign|verify` — optional signing layer.
2
+ //
3
+ // Signing is opt-in. Dev loops never require it. Enterprise/CI pipelines
4
+ // pin an issuer pubkey and run `aarmos run --enforce-signatures` so an
5
+ // unsigned or tampered playbook can never touch production.
6
+ import fs from "node:fs/promises";
7
+ import path from "node:path";
8
+ import { generateSigningKeyPair, loadPlaybook, signPlaybook, verifyPlaybookSignature, writePlaybook, } from "../lib/playbook.js";
9
+ // eslint-disable-next-line no-console
10
+ const log = (s) => console.log(s);
11
+ export async function playbookKeygen(opts) {
12
+ const kp = await generateSigningKeyPair(path.resolve(opts.out), opts.name);
13
+ log("");
14
+ log(" aarmos playbook keygen");
15
+ log(` private : ${kp.privatePem} (chmod 600 — do not commit)`);
16
+ log(` public key : ${kp.publicKey}`);
17
+ log("");
18
+ log(" Distribute the public key to reviewers; pin it via");
19
+ log(` aarmos run --enforce-signatures --trusted-pubkey ${kp.publicKey}`);
20
+ log("");
21
+ }
22
+ export async function playbookSign(opts) {
23
+ const pb = await loadPlaybook(opts.playbook);
24
+ const pem = await fs.readFile(path.resolve(opts.key), "utf8");
25
+ const signed = await signPlaybook(pb, pem);
26
+ const outPath = path.resolve(opts.out ?? opts.playbook);
27
+ await writePlaybook(outPath, signed);
28
+ log("");
29
+ log(` signed ${opts.playbook}`);
30
+ log(` pubkey : ${signed.signature.pubKey}`);
31
+ log(` out : ${outPath}`);
32
+ log("");
33
+ }
34
+ export async function playbookVerify(opts) {
35
+ const pb = await loadPlaybook(opts.playbook);
36
+ const res = verifyPlaybookSignature(pb);
37
+ log("");
38
+ log(` aarmos playbook verify — ${opts.playbook}`);
39
+ if (!pb.signature) {
40
+ log(" unsigned");
41
+ process.exitCode = 1;
42
+ return;
43
+ }
44
+ log(` pubkey : ${pb.signature.pubKey}`);
45
+ log(` result : ${res.ok ? "OK" : "INVALID"}${res.reason ? " " + res.reason : ""}`);
46
+ if (opts.trustedPubkey && pb.signature.pubKey !== opts.trustedPubkey) {
47
+ log(` trust : REJECTED — signer not in trusted set`);
48
+ process.exitCode = 1;
49
+ return;
50
+ }
51
+ if (!res.ok)
52
+ process.exitCode = 1;
53
+ log("");
54
+ }
55
+ //# sourceMappingURL=playbook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook.js","sourceRoot":"","sources":["../../src/commands/playbook.ts"],"names":[],"mappings":"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"}