@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/rpc/router.js
DELETED
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { spawn } from "node:child_process";
|
|
5
|
-
import { simpleGit } from "simple-git";
|
|
6
|
-
import pg from "pg";
|
|
7
|
-
import { HttpCallParams, previewHttpCall, executeHttpCall } from "../lib/http-broker.js";
|
|
8
|
-
import { McpToolParams, previewMcpTool, executeMcpTool } from "../lib/mcp-broker.js";
|
|
9
|
-
import { testLlmConnection } from "../lib/llm-test.js";
|
|
10
|
-
const TestConnectionParams = z.object({
|
|
11
|
-
providerId: z.string().min(1),
|
|
12
|
-
baseUrl: z.string().url(),
|
|
13
|
-
apiKey: z.string().optional(),
|
|
14
|
-
model: z.string().min(1),
|
|
15
|
-
headers: z.record(z.string()).optional(),
|
|
16
|
-
timeoutMs: z.number().int().min(100).max(30_000).optional(),
|
|
17
|
-
});
|
|
18
|
-
const RpcRequest = z.object({
|
|
19
|
-
id: z.union([z.string(), z.number()]),
|
|
20
|
-
type: z.literal("rpc"),
|
|
21
|
-
method: z.string(),
|
|
22
|
-
params: z.unknown().optional(),
|
|
23
|
-
});
|
|
24
|
-
const BatchAction = z.object({
|
|
25
|
-
kind: z.enum(["fs.write", "shell.exec", "http.call", "mcp.tool"]),
|
|
26
|
-
params: z.unknown(),
|
|
27
|
-
});
|
|
28
|
-
export async function handleRpc(session, msg) {
|
|
29
|
-
const parsed = RpcRequest.safeParse(msg);
|
|
30
|
-
if (!parsed.success)
|
|
31
|
-
return { type: "error", error: "invalid rpc envelope" };
|
|
32
|
-
const { id, method, params } = parsed.data;
|
|
33
|
-
try {
|
|
34
|
-
const result = await dispatch(session, method, params);
|
|
35
|
-
return { id, type: "result", result };
|
|
36
|
-
}
|
|
37
|
-
catch (err) {
|
|
38
|
-
// Prefer a structured AarmosError when the thrown value carries one.
|
|
39
|
-
// Detection is duck-typed to avoid a hard runtime import from avar-core
|
|
40
|
-
// (bridge is used in contexts where the module graph is different).
|
|
41
|
-
const maybe = err && typeof err === "object" && "aarmos" in err
|
|
42
|
-
? err
|
|
43
|
-
.aarmos
|
|
44
|
-
: undefined;
|
|
45
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
46
|
-
return maybe
|
|
47
|
-
? { id, type: "error", error: message, aarmos: maybe }
|
|
48
|
-
: { id, type: "error", error: message };
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
async function dispatch(session, method, params) {
|
|
52
|
-
switch (method) {
|
|
53
|
-
// ---- reads (always live, never previewed) ------------------------------
|
|
54
|
-
case "fs.read": {
|
|
55
|
-
const { path: rel, encoding } = z
|
|
56
|
-
.object({ path: z.string(), encoding: z.enum(["utf8", "base64"]).default("utf8") })
|
|
57
|
-
.parse(params);
|
|
58
|
-
const abs = session.resolveInJail(rel);
|
|
59
|
-
const buf = await fs.readFile(abs);
|
|
60
|
-
return { path: rel, encoding, data: encoding === "utf8" ? buf.toString("utf8") : buf.toString("base64") };
|
|
61
|
-
}
|
|
62
|
-
case "fs.list": {
|
|
63
|
-
const { path: rel } = z.object({ path: z.string().default(".") }).parse(params);
|
|
64
|
-
const abs = session.resolveInJail(rel);
|
|
65
|
-
const entries = await fs.readdir(abs, { withFileTypes: true });
|
|
66
|
-
return entries.map((e) => ({ name: e.name, dir: e.isDirectory(), file: e.isFile() }));
|
|
67
|
-
}
|
|
68
|
-
case "git.status": {
|
|
69
|
-
return await simpleGit(session.workspace).status();
|
|
70
|
-
}
|
|
71
|
-
case "git.branch": {
|
|
72
|
-
return await simpleGit(session.workspace).branch();
|
|
73
|
-
}
|
|
74
|
-
// ---- mutations (previewed under dry-run) -------------------------------
|
|
75
|
-
case "fs.write": {
|
|
76
|
-
const preview = await previewFsWrite(session, params);
|
|
77
|
-
if (session.dryRun)
|
|
78
|
-
return { preview: true, action: preview };
|
|
79
|
-
return await executeFsWrite(session, params);
|
|
80
|
-
}
|
|
81
|
-
case "shell.exec": {
|
|
82
|
-
const preview = previewShellExec(session, params);
|
|
83
|
-
if (session.dryRun)
|
|
84
|
-
return { preview: true, action: preview };
|
|
85
|
-
return await executeShellExec(session, params);
|
|
86
|
-
}
|
|
87
|
-
case "http.call": {
|
|
88
|
-
const p = HttpCallParams.parse(params);
|
|
89
|
-
const preview = { kind: "http.call", params: p, preview: previewHttpCall(p, session.httpAllow) };
|
|
90
|
-
if (session.dryRun)
|
|
91
|
-
return { preview: true, action: preview };
|
|
92
|
-
return await executeHttpCall(p, session.httpAllow);
|
|
93
|
-
}
|
|
94
|
-
case "mcp.tool": {
|
|
95
|
-
const p = McpToolParams.parse(params);
|
|
96
|
-
const preview = { kind: "mcp.tool", params: p, preview: previewMcpTool(p, session.mcpAllow) };
|
|
97
|
-
if (session.dryRun)
|
|
98
|
-
return { preview: true, action: preview };
|
|
99
|
-
return await executeMcpTool(p, session.mcpAllow);
|
|
100
|
-
}
|
|
101
|
-
// ---- LLM diagnostics (no receipt, no chat) -----------------------------
|
|
102
|
-
// Dry-runs a BYO-LLM provider so the CLI can surface the same
|
|
103
|
-
// structured LLM_* AarmosError codes the PWA shows in Settings, without
|
|
104
|
-
// minting an AVAR chat receipt. Never routed through the sticky
|
|
105
|
-
// active-provider ring; caller supplies the config each call.
|
|
106
|
-
case "aarmos.testConnection": {
|
|
107
|
-
const p = TestConnectionParams.parse(params);
|
|
108
|
-
return await testLlmConnection(p);
|
|
109
|
-
}
|
|
110
|
-
// ---- session controls --------------------------------------------------
|
|
111
|
-
case "session.setDryRun": {
|
|
112
|
-
const { on } = z.object({ on: z.boolean() }).parse(params);
|
|
113
|
-
session.dryRun = on;
|
|
114
|
-
return { dryRun: session.dryRun };
|
|
115
|
-
}
|
|
116
|
-
case "session.state": {
|
|
117
|
-
return { dryRun: session.dryRun, workspace: session.workspace };
|
|
118
|
-
}
|
|
119
|
-
// ---- read-only Postgres (only if operator passed --allow-sql) ----------
|
|
120
|
-
case "db.list": {
|
|
121
|
-
return {
|
|
122
|
-
databases: [...session.sqlAllow.values()].map((s) => ({ alias: s.alias })),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
case "db.query": {
|
|
126
|
-
return await executeDbQuery(session, params);
|
|
127
|
-
}
|
|
128
|
-
// ---- scoped filesystem read (only if operator passed --allow-read) ------
|
|
129
|
-
case "fs.scopedRoots": {
|
|
130
|
-
return { roots: [...session.readAllow] };
|
|
131
|
-
}
|
|
132
|
-
case "fs.scopedRead": {
|
|
133
|
-
const { path: abs, encoding } = z
|
|
134
|
-
.object({
|
|
135
|
-
path: z.string(),
|
|
136
|
-
encoding: z.enum(["utf8", "base64"]).default("utf8"),
|
|
137
|
-
})
|
|
138
|
-
.parse(params);
|
|
139
|
-
const real = session.assertReadable(abs);
|
|
140
|
-
const buf = await fs.readFile(real);
|
|
141
|
-
// Soft cap: refuse to shovel enormous files through the WS in one shot.
|
|
142
|
-
if (buf.byteLength > 2 * 1024 * 1024) {
|
|
143
|
-
throw new Error(`file too large for scopedRead (${buf.byteLength} bytes; cap 2 MiB)`);
|
|
144
|
-
}
|
|
145
|
-
return {
|
|
146
|
-
path: real,
|
|
147
|
-
encoding,
|
|
148
|
-
bytes: buf.byteLength,
|
|
149
|
-
data: encoding === "utf8" ? buf.toString("utf8") : buf.toString("base64"),
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
case "fs.scopedList": {
|
|
153
|
-
const { path: abs } = z.object({ path: z.string() }).parse(params);
|
|
154
|
-
const real = session.assertReadable(abs);
|
|
155
|
-
const entries = await fs.readdir(real, { withFileTypes: true });
|
|
156
|
-
return {
|
|
157
|
-
path: real,
|
|
158
|
-
entries: entries.map((e) => ({
|
|
159
|
-
name: e.name,
|
|
160
|
-
absPath: path.join(real, e.name),
|
|
161
|
-
dir: e.isDirectory(),
|
|
162
|
-
file: e.isFile(),
|
|
163
|
-
})),
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
// ---- batch apply (commits an approved plan, ignoring dryRun) -----------
|
|
167
|
-
case "apply.batch": {
|
|
168
|
-
const { actions } = z.object({ actions: z.array(BatchAction) }).parse(params);
|
|
169
|
-
const results = [];
|
|
170
|
-
for (const a of actions) {
|
|
171
|
-
try {
|
|
172
|
-
let res;
|
|
173
|
-
if (a.kind === "fs.write")
|
|
174
|
-
res = await executeFsWrite(session, a.params);
|
|
175
|
-
else if (a.kind === "shell.exec")
|
|
176
|
-
res = await executeShellExec(session, a.params);
|
|
177
|
-
else if (a.kind === "http.call")
|
|
178
|
-
res = await executeHttpCall(HttpCallParams.parse(a.params), session.httpAllow);
|
|
179
|
-
else
|
|
180
|
-
res = await executeMcpTool(McpToolParams.parse(a.params), session.mcpAllow);
|
|
181
|
-
results.push({ ok: true, kind: a.kind, result: res });
|
|
182
|
-
}
|
|
183
|
-
catch (err) {
|
|
184
|
-
results.push({
|
|
185
|
-
ok: false,
|
|
186
|
-
kind: a.kind,
|
|
187
|
-
error: err instanceof Error ? err.message : String(err),
|
|
188
|
-
});
|
|
189
|
-
// Stop-on-first-error keeps partial-commit surprises out of the workspace.
|
|
190
|
-
break;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return { applied: results.length, results };
|
|
194
|
-
}
|
|
195
|
-
default:
|
|
196
|
-
throw new Error(`unknown method: ${method}`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
// -------- execution + preview helpers ----------------------------------------
|
|
200
|
-
const FsWriteParams = z.object({
|
|
201
|
-
path: z.string(),
|
|
202
|
-
data: z.string(),
|
|
203
|
-
encoding: z.enum(["utf8", "base64"]).default("utf8"),
|
|
204
|
-
});
|
|
205
|
-
async function previewFsWrite(session, params) {
|
|
206
|
-
const p = FsWriteParams.parse(params);
|
|
207
|
-
const abs = session.resolveInJail(p.path);
|
|
208
|
-
let before = null;
|
|
209
|
-
let existed = false;
|
|
210
|
-
try {
|
|
211
|
-
const buf = await fs.readFile(abs);
|
|
212
|
-
existed = true;
|
|
213
|
-
before = p.encoding === "utf8" ? buf.toString("utf8") : buf.toString("base64");
|
|
214
|
-
}
|
|
215
|
-
catch {
|
|
216
|
-
// new file
|
|
217
|
-
}
|
|
218
|
-
const after = p.data;
|
|
219
|
-
return {
|
|
220
|
-
kind: "fs.write",
|
|
221
|
-
params: p,
|
|
222
|
-
preview: {
|
|
223
|
-
path: p.path,
|
|
224
|
-
encoding: p.encoding,
|
|
225
|
-
existed,
|
|
226
|
-
bytesBefore: before?.length ?? 0,
|
|
227
|
-
bytesAfter: after.length,
|
|
228
|
-
before,
|
|
229
|
-
after,
|
|
230
|
-
},
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
async function executeFsWrite(session, params) {
|
|
234
|
-
const p = FsWriteParams.parse(params);
|
|
235
|
-
const abs = session.resolveInJail(p.path);
|
|
236
|
-
await fs.mkdir(pathDirname(abs), { recursive: true });
|
|
237
|
-
await fs.writeFile(abs, p.encoding === "utf8" ? p.data : Buffer.from(p.data, "base64"));
|
|
238
|
-
return { path: p.path, bytes: p.data.length };
|
|
239
|
-
}
|
|
240
|
-
const ShellExecParams = z.object({
|
|
241
|
-
bin: z.string(),
|
|
242
|
-
args: z.array(z.string()).default([]),
|
|
243
|
-
cwd: z.string().default("."),
|
|
244
|
-
});
|
|
245
|
-
function previewShellExec(session, params) {
|
|
246
|
-
const p = ShellExecParams.parse(params);
|
|
247
|
-
if (!session.shellAllow.has(p.bin))
|
|
248
|
-
throw new Error(`shell binary not allowed: ${p.bin}`);
|
|
249
|
-
const absCwd = session.resolveInJail(p.cwd);
|
|
250
|
-
return {
|
|
251
|
-
kind: "shell.exec",
|
|
252
|
-
params: p,
|
|
253
|
-
preview: {
|
|
254
|
-
commandLine: [p.bin, ...p.args].join(" "),
|
|
255
|
-
cwd: absCwd,
|
|
256
|
-
binary: p.bin,
|
|
257
|
-
args: p.args,
|
|
258
|
-
},
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
async function executeShellExec(session, params) {
|
|
262
|
-
const p = ShellExecParams.parse(params);
|
|
263
|
-
if (!session.shellAllow.has(p.bin))
|
|
264
|
-
throw new Error(`shell binary not allowed: ${p.bin}`);
|
|
265
|
-
const absCwd = session.resolveInJail(p.cwd);
|
|
266
|
-
return await execAllowed(p.bin, p.args, absCwd);
|
|
267
|
-
}
|
|
268
|
-
function pathDirname(p) {
|
|
269
|
-
const i = p.lastIndexOf("/");
|
|
270
|
-
return i >= 0 ? p.slice(0, i) : ".";
|
|
271
|
-
}
|
|
272
|
-
function execAllowed(bin, args, cwd) {
|
|
273
|
-
return new Promise((resolve) => {
|
|
274
|
-
const child = spawn(bin, args, { cwd, shell: false });
|
|
275
|
-
let stdout = "";
|
|
276
|
-
let stderr = "";
|
|
277
|
-
child.stdout.on("data", (b) => (stdout += b.toString()));
|
|
278
|
-
child.stderr.on("data", (b) => (stderr += b.toString()));
|
|
279
|
-
child.on("close", (code) => resolve({ code: code ?? 0, stdout, stderr }));
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
// -------- read-only Postgres --------------------------------------------------
|
|
283
|
-
//
|
|
284
|
-
// Guarantees enforced here, not by convention:
|
|
285
|
-
// 1. The operator must have opted in via `--allow-sql <alias>=<dsn>`.
|
|
286
|
-
// Without a matching alias, we throw before opening a connection.
|
|
287
|
-
// 2. The query runs inside `BEGIN READ ONLY` with a bounded
|
|
288
|
-
// `statement_timeout`. Any write (INSERT/UPDATE/DELETE/DDL) is
|
|
289
|
-
// rejected by Postgres itself with `read_only_sql_transaction`.
|
|
290
|
-
// 3. Rows are hard-capped; if the query returns more than `rowLimit`,
|
|
291
|
-
// we truncate and mark `truncated: true`. Model can page by `LIMIT`.
|
|
292
|
-
// 4. Parameters go through the extended query protocol (`$1`, `$2`, …)
|
|
293
|
-
// so a single call cannot smuggle in a second statement via `;`.
|
|
294
|
-
// 5. The DSN is never returned to the caller — only the alias, and
|
|
295
|
-
// row / column data.
|
|
296
|
-
const DbQueryParams = z.object({
|
|
297
|
-
alias: z.string().optional(),
|
|
298
|
-
sql: z.string().min(1),
|
|
299
|
-
params: z.array(z.unknown()).default([]),
|
|
300
|
-
rowLimit: z.number().int().min(1).max(10_000).default(500),
|
|
301
|
-
statementTimeoutMs: z.number().int().min(100).max(30_000).default(5_000),
|
|
302
|
-
});
|
|
303
|
-
async function executeDbQuery(session, params) {
|
|
304
|
-
const p = DbQueryParams.parse(params);
|
|
305
|
-
if (session.sqlAllow.size === 0) {
|
|
306
|
-
throw new Error("db.query is not permitted — start the CLI with --allow-sql <alias>=<dsn> to opt in.");
|
|
307
|
-
}
|
|
308
|
-
let entry;
|
|
309
|
-
if (p.alias) {
|
|
310
|
-
entry = session.sqlAllow.get(p.alias);
|
|
311
|
-
if (!entry)
|
|
312
|
-
throw new Error(`unknown --allow-sql alias: ${p.alias}`);
|
|
313
|
-
}
|
|
314
|
-
else if (session.sqlAllow.size === 1) {
|
|
315
|
-
entry = session.sqlAllow.values().next().value;
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
throw new Error(`alias required (registered: ${[...session.sqlAllow.keys()].join(", ")})`);
|
|
319
|
-
}
|
|
320
|
-
const client = new pg.Client({ connectionString: entry.dsn });
|
|
321
|
-
const started = Date.now();
|
|
322
|
-
try {
|
|
323
|
-
await client.connect();
|
|
324
|
-
await client.query("BEGIN READ ONLY");
|
|
325
|
-
await client.query(`SET LOCAL statement_timeout = ${p.statementTimeoutMs}`);
|
|
326
|
-
const res = await client.query({ text: p.sql, values: p.params });
|
|
327
|
-
await client.query("ROLLBACK");
|
|
328
|
-
const truncated = res.rows.length > p.rowLimit;
|
|
329
|
-
return {
|
|
330
|
-
alias: entry.alias,
|
|
331
|
-
command: res.command,
|
|
332
|
-
rowCount: res.rowCount,
|
|
333
|
-
returnedRows: Math.min(res.rows.length, p.rowLimit),
|
|
334
|
-
truncated,
|
|
335
|
-
fields: res.fields?.map((f) => ({ name: f.name, dataTypeID: f.dataTypeID })),
|
|
336
|
-
rows: truncated ? res.rows.slice(0, p.rowLimit) : res.rows,
|
|
337
|
-
elapsedMs: Date.now() - started,
|
|
338
|
-
};
|
|
339
|
-
}
|
|
340
|
-
finally {
|
|
341
|
-
try {
|
|
342
|
-
await client.end();
|
|
343
|
-
}
|
|
344
|
-
catch {
|
|
345
|
-
/* ignore */
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
//# sourceMappingURL=router.js.map
|
package/dist/rpc/router.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/rpc/router.ts"],"names":[],"mappings":"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"}
|
package/dist/session.js
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
export const DEFAULT_SHELL_ALLOW = [
|
|
4
|
-
"git",
|
|
5
|
-
"npm",
|
|
6
|
-
"pnpm",
|
|
7
|
-
"bun",
|
|
8
|
-
"node",
|
|
9
|
-
"ls",
|
|
10
|
-
"cat",
|
|
11
|
-
"rg",
|
|
12
|
-
"grep",
|
|
13
|
-
];
|
|
14
|
-
export function createSession(opts) {
|
|
15
|
-
const workspace = path.resolve(opts.workspace);
|
|
16
|
-
const shellAllow = new Set([...DEFAULT_SHELL_ALLOW, ...opts.extraShellAllow]);
|
|
17
|
-
const sqlAllow = new Map();
|
|
18
|
-
for (const entry of opts.sqlAllow ?? []) {
|
|
19
|
-
if (sqlAllow.has(entry.alias)) {
|
|
20
|
-
throw new Error(`duplicate --allow-sql alias: ${entry.alias}`);
|
|
21
|
-
}
|
|
22
|
-
sqlAllow.set(entry.alias, entry);
|
|
23
|
-
}
|
|
24
|
-
// Resolve each opted-in read root once, via realpath, so symlink games
|
|
25
|
-
// at request time can't sneak in an unlisted path.
|
|
26
|
-
const readAllow = [];
|
|
27
|
-
for (const raw of opts.readAllow ?? []) {
|
|
28
|
-
const abs = path.resolve(raw);
|
|
29
|
-
let real;
|
|
30
|
-
try {
|
|
31
|
-
real = fs.realpathSync(abs);
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
throw new Error(`--allow-read path does not exist: ${raw}`);
|
|
35
|
-
}
|
|
36
|
-
readAllow.push(real);
|
|
37
|
-
}
|
|
38
|
-
const httpAllow = new Set(opts.httpAllow ?? []);
|
|
39
|
-
const mcpAllow = new Set(opts.mcpAllow ?? []);
|
|
40
|
-
const capabilities = [
|
|
41
|
-
"fs.read",
|
|
42
|
-
"fs.write",
|
|
43
|
-
"fs.list",
|
|
44
|
-
"shell.exec",
|
|
45
|
-
"git.status",
|
|
46
|
-
"git.branch",
|
|
47
|
-
"events.fs",
|
|
48
|
-
"events.git",
|
|
49
|
-
"session.setDryRun",
|
|
50
|
-
"apply.batch",
|
|
51
|
-
];
|
|
52
|
-
if (sqlAllow.size > 0) {
|
|
53
|
-
capabilities.push("db.list", "db.query");
|
|
54
|
-
}
|
|
55
|
-
if (readAllow.length > 0) {
|
|
56
|
-
capabilities.push("fs.scopedRoots", "fs.scopedRead", "fs.scopedList");
|
|
57
|
-
}
|
|
58
|
-
if (httpAllow.size > 0)
|
|
59
|
-
capabilities.push("http.call");
|
|
60
|
-
if (mcpAllow.size > 0)
|
|
61
|
-
capabilities.push("mcp.tool");
|
|
62
|
-
return {
|
|
63
|
-
workspace,
|
|
64
|
-
shellAllow,
|
|
65
|
-
sqlAllow,
|
|
66
|
-
readAllow,
|
|
67
|
-
httpAllow,
|
|
68
|
-
mcpAllow,
|
|
69
|
-
dryRun: true,
|
|
70
|
-
capabilities,
|
|
71
|
-
resolveInJail(rel) {
|
|
72
|
-
const abs = path.resolve(workspace, rel);
|
|
73
|
-
const rrel = path.relative(workspace, abs);
|
|
74
|
-
if (rrel.startsWith("..") || path.isAbsolute(rrel)) {
|
|
75
|
-
throw new Error(`path escapes workspace: ${rel}`);
|
|
76
|
-
}
|
|
77
|
-
return abs;
|
|
78
|
-
},
|
|
79
|
-
assertReadable(abs) {
|
|
80
|
-
if (!path.isAbsolute(abs)) {
|
|
81
|
-
throw new Error(`fs.scoped* requires an absolute path: ${abs}`);
|
|
82
|
-
}
|
|
83
|
-
let real;
|
|
84
|
-
try {
|
|
85
|
-
real = fs.realpathSync(abs);
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
throw new Error(`path not found: ${abs}`);
|
|
89
|
-
}
|
|
90
|
-
for (const root of readAllow) {
|
|
91
|
-
const rel = path.relative(root, real);
|
|
92
|
-
if (rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel))) {
|
|
93
|
-
return real;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
throw new Error(`path is not inside any --allow-read root: ${abs}`);
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=session.js.map
|
package/dist/session.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/watchers/files.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import chokidar from "chokidar";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
/**
|
|
4
|
-
* Watches the workspace and streams debounced file-change events to the PWA.
|
|
5
|
-
* This is the fix for the "developer edits in VS Code, PWA drifts out of sync"
|
|
6
|
-
* problem: any external write invalidates PWA-side state within ~150ms.
|
|
7
|
-
*/
|
|
8
|
-
export function startFileWatcher(session, emit) {
|
|
9
|
-
const watcher = chokidar.watch(session.workspace, {
|
|
10
|
-
ignored: [
|
|
11
|
-
/(^|[/\\])\../, // dotfiles
|
|
12
|
-
/node_modules/,
|
|
13
|
-
/dist|build|\.next|\.turbo|\.cache/,
|
|
14
|
-
],
|
|
15
|
-
ignoreInitial: true,
|
|
16
|
-
awaitWriteFinish: { stabilityThreshold: 120, pollInterval: 40 },
|
|
17
|
-
persistent: true,
|
|
18
|
-
});
|
|
19
|
-
const send = (kind) => (p) => {
|
|
20
|
-
const rel = path.relative(session.workspace, p) || ".";
|
|
21
|
-
emit({ kind, path: rel, at: Date.now() });
|
|
22
|
-
};
|
|
23
|
-
watcher
|
|
24
|
-
.on("add", send("add"))
|
|
25
|
-
.on("change", send("change"))
|
|
26
|
-
.on("unlink", send("unlink"))
|
|
27
|
-
.on("addDir", send("addDir"))
|
|
28
|
-
.on("unlinkDir", send("unlinkDir"));
|
|
29
|
-
return () => void watcher.close();
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=files.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/watchers/files.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,IAA4B;IAC7E,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE;QAChD,OAAO,EAAE;YACP,cAAc,EAAE,WAAW;YAC3B,cAAc;YACd,mCAAmC;SACpC;QACD,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;QAC/D,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,IAAqB,EAAE,EAAE,CAAC,CAAC,CAAS,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC;QACvD,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,OAAO;SACJ,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;SACtB,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC5B,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC5B,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC5B,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAEtC,OAAO,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;AACpC,CAAC"}
|
package/dist/watchers/git.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { simpleGit } from "simple-git";
|
|
2
|
-
/**
|
|
3
|
-
* Polls git HEAD + current branch every 1.5s. Fires only on change.
|
|
4
|
-
* This catches `git checkout`, `git switch`, and `git commit` performed inside
|
|
5
|
-
* VS Code, keeping the PWA agent's view of the repo consistent.
|
|
6
|
-
*/
|
|
7
|
-
export function startGitWatcher(session, emit) {
|
|
8
|
-
const git = simpleGit(session.workspace);
|
|
9
|
-
let lastBranch = null;
|
|
10
|
-
let lastHead = null;
|
|
11
|
-
let stopped = false;
|
|
12
|
-
const tick = async () => {
|
|
13
|
-
if (stopped)
|
|
14
|
-
return;
|
|
15
|
-
try {
|
|
16
|
-
const status = await git.status();
|
|
17
|
-
const head = (await git.revparse(["HEAD"])).trim();
|
|
18
|
-
const branch = status.current ?? null;
|
|
19
|
-
if (branch !== lastBranch || head !== lastHead) {
|
|
20
|
-
const kind = branch !== lastBranch ? "branch" : "head";
|
|
21
|
-
lastBranch = branch;
|
|
22
|
-
lastHead = head;
|
|
23
|
-
emit({ kind, branch, head, at: Date.now() });
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
// not a git repo — quietly stop polling
|
|
28
|
-
stopped = true;
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
if (!stopped)
|
|
32
|
-
setTimeout(tick, 1500);
|
|
33
|
-
};
|
|
34
|
-
void tick();
|
|
35
|
-
return () => {
|
|
36
|
-
stopped = true;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=git.js.map
|
package/dist/watchers/git.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/watchers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAUvC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,IAA6B;IAC7E,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,OAAO;YAAE,OAAO;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;YACtC,IAAI,MAAM,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAqB,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;gBACzE,UAAU,GAAG,MAAM,CAAC;gBACpB,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;YACxC,OAAO,GAAG,IAAI,CAAC;YACf,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,KAAK,IAAI,EAAE,CAAC;IACZ,OAAO,GAAG,EAAE;QACV,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC"}
|