@bjorntech/key-ferry 0.0.0-stage → 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.
- package/LICENSE +21 -0
- package/README.md +209 -2
- package/SECURITY.md +87 -0
- package/dist/contracts.d.ts +133 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +29 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +44 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +260 -0
- package/dist/options.js.map +1 -0
- package/dist/plugin.d.ts +24 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +215 -0
- package/dist/plugin.js.map +1 -0
- package/dist/relay/index.d.ts +37 -0
- package/dist/relay/index.d.ts.map +1 -0
- package/dist/relay/index.js +480 -0
- package/dist/relay/index.js.map +1 -0
- package/dist/remote.d.ts +62 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +227 -0
- package/dist/remote.js.map +1 -0
- package/dist/rpc.d.ts +112 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +117 -0
- package/dist/rpc.js.map +1 -0
- package/dist/services/process.d.ts +56 -0
- package/dist/services/process.d.ts.map +1 -0
- package/dist/services/process.js +208 -0
- package/dist/services/process.js.map +1 -0
- package/dist/tui.d.ts +59 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +93 -0
- package/dist/tui.js.map +1 -0
- package/dist/varlock/manager.d.ts +6 -0
- package/dist/varlock/manager.d.ts.map +1 -0
- package/dist/varlock/manager.js +425 -0
- package/dist/varlock/manager.js.map +1 -0
- package/dist/varlock/protocol.d.ts +67 -0
- package/dist/varlock/protocol.d.ts.map +1 -0
- package/dist/varlock/protocol.js +248 -0
- package/dist/varlock/protocol.js.map +1 -0
- package/docs/architecture.md +179 -0
- package/docs/quality.md +102 -0
- package/docs/releasing.md +149 -0
- package/docs/troubleshooting.md +214 -0
- package/examples/.env.schema +17 -0
- package/examples/opencode.jsonc +44 -0
- package/package.json +96 -4
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
import { constants as fsConstants } from "node:fs";
|
|
2
|
+
import { access, mkdtemp, realpath, rm, stat, lstat } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join, relative } from "node:path";
|
|
5
|
+
import { Duration, Effect, Layer, Scope, Semaphore } from "effect";
|
|
6
|
+
import { ProjectKeyFerryManager, VarlockError, } from "../contracts.js";
|
|
7
|
+
import { Process, ProcessLive, } from "../services/process.js";
|
|
8
|
+
import { decodeSessionList, findOwnedSession, sanitizeSessionStatus, selectPlaceholderEnvironment, validateProxyWiring, } from "./protocol.js";
|
|
9
|
+
const DEFAULT_COMMAND = ["varlock"];
|
|
10
|
+
const DEFAULT_START_TIMEOUT = 30_000;
|
|
11
|
+
const DEFAULT_COMMAND_TIMEOUT = 10_000;
|
|
12
|
+
const DEFAULT_REFRESH_TIMEOUT = 30_000;
|
|
13
|
+
const DEFAULT_POLL_INTERVAL = 100;
|
|
14
|
+
const MAX_OUTPUT_BYTES = 2 * 1024 * 1024;
|
|
15
|
+
const MAX_TIMEOUT = 10 * 60_000;
|
|
16
|
+
const safeError = (code, retryable) => new VarlockError({ code, retryable, message: `Varlock ${code.replaceAll("_", " ")}` });
|
|
17
|
+
const fromProcessError = (error, code) => new VarlockError({
|
|
18
|
+
code,
|
|
19
|
+
retryable: error.code === "timeout" || error.code === "spawn-failed" || error.code === "io",
|
|
20
|
+
message: error.code === "timeout" ? "Varlock command timed out" : `Varlock command ${error.code}`,
|
|
21
|
+
});
|
|
22
|
+
function adapterOptions(options) {
|
|
23
|
+
const raw = options.adapter ?? {};
|
|
24
|
+
const command = raw.command === undefined ? [...DEFAULT_COMMAND] : raw.command;
|
|
25
|
+
const environmentKeys = raw.environmentKeys;
|
|
26
|
+
if (!Array.isArray(command) ||
|
|
27
|
+
command.length === 0 ||
|
|
28
|
+
command.length > 32 ||
|
|
29
|
+
command.some((v) => typeof v !== "string" || v.length === 0 || v.length > 1024 || v.includes("\0"))) {
|
|
30
|
+
throw safeError("invalid_config", false);
|
|
31
|
+
}
|
|
32
|
+
if (!Array.isArray(environmentKeys) ||
|
|
33
|
+
environmentKeys.length > 128 ||
|
|
34
|
+
environmentKeys.some((v) => typeof v !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(v) || v.length > 256)) {
|
|
35
|
+
throw safeError("invalid_config", false);
|
|
36
|
+
}
|
|
37
|
+
const numberOption = (name, fallback, min, max) => {
|
|
38
|
+
const value = raw[name];
|
|
39
|
+
if (value === undefined)
|
|
40
|
+
return fallback;
|
|
41
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < min || value > max)
|
|
42
|
+
throw safeError("invalid_config", false);
|
|
43
|
+
return value;
|
|
44
|
+
};
|
|
45
|
+
const strict = raw.requireStrictEgress;
|
|
46
|
+
if (strict !== undefined && typeof strict !== "boolean")
|
|
47
|
+
throw safeError("invalid_config", false);
|
|
48
|
+
return {
|
|
49
|
+
command: [...command],
|
|
50
|
+
environmentKeys: [...environmentKeys],
|
|
51
|
+
startupTimeoutMs: numberOption("startupTimeoutMs", DEFAULT_START_TIMEOUT, 100, MAX_TIMEOUT),
|
|
52
|
+
commandTimeoutMs: numberOption("commandTimeoutMs", DEFAULT_COMMAND_TIMEOUT, 100, MAX_TIMEOUT),
|
|
53
|
+
reloadTimeoutMs: numberOption("reloadTimeoutMs", DEFAULT_REFRESH_TIMEOUT, 100, MAX_TIMEOUT),
|
|
54
|
+
pollIntervalMs: numberOption("pollIntervalMs", DEFAULT_POLL_INTERVAL, 10, 10_000),
|
|
55
|
+
requireStrictEgress: strict ?? true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function safeProjectDirectory(value) {
|
|
59
|
+
if (typeof value !== "string" ||
|
|
60
|
+
value.length === 0 ||
|
|
61
|
+
value.length > 16_384 ||
|
|
62
|
+
value.includes("\0"))
|
|
63
|
+
throw safeError("invalid_config", false);
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
function parseEnvironmentOutput(raw) {
|
|
67
|
+
if (Buffer.byteLength(raw, "utf8") > MAX_OUTPUT_BYTES)
|
|
68
|
+
throw safeError("protocol_error", false);
|
|
69
|
+
let value;
|
|
70
|
+
try {
|
|
71
|
+
value = JSON.parse(raw);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
throw safeError("protocol_error", false);
|
|
75
|
+
}
|
|
76
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
77
|
+
throw safeError("protocol_error", false);
|
|
78
|
+
const result = Object.create(null);
|
|
79
|
+
const keys = Object.keys(value);
|
|
80
|
+
if (keys.length > 512)
|
|
81
|
+
throw safeError("protocol_error", false);
|
|
82
|
+
for (const key of keys) {
|
|
83
|
+
if (key === "__proto__" ||
|
|
84
|
+
key === "prototype" ||
|
|
85
|
+
key === "constructor" ||
|
|
86
|
+
!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key) ||
|
|
87
|
+
key.length > 256)
|
|
88
|
+
throw safeError("protocol_error", false);
|
|
89
|
+
const item = value[key];
|
|
90
|
+
if (typeof item !== "string" || item.length > 16_384 || item.includes("\0"))
|
|
91
|
+
throw safeError("protocol_error", false);
|
|
92
|
+
result[key] = item;
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
function statusSnapshot(state, projectDirectory) {
|
|
97
|
+
let endpoint;
|
|
98
|
+
if (state.session) {
|
|
99
|
+
try {
|
|
100
|
+
endpoint = validateProxyWiring(state.session.env).proxyUrl;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
endpoint = undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
phase: state.phase,
|
|
108
|
+
projectDirectory: projectDirectory,
|
|
109
|
+
generation: state.generation,
|
|
110
|
+
...(state.process ? { pid: state.process.pid } : {}),
|
|
111
|
+
...(endpoint ? { endpoint } : {}),
|
|
112
|
+
...(state.lastRefreshAt ? { lastRefreshAt: state.lastRefreshAt } : {}),
|
|
113
|
+
...(state.error ? { error: state.error } : {}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function commandParts(options, args) {
|
|
117
|
+
return { executable: options.command[0], args: [...options.command.slice(1), ...args] };
|
|
118
|
+
}
|
|
119
|
+
function runCommand(process, options, cwd, args, timeoutMs, environment) {
|
|
120
|
+
const parts = commandParts(options, args);
|
|
121
|
+
return process
|
|
122
|
+
.run({ ...parts, cwd, env: environment, maxBytes: MAX_OUTPUT_BYTES, timeoutMs })
|
|
123
|
+
.pipe(Effect.mapError((error) => fromProcessError(error, error.code === "timeout" ? "timeout" : "unavailable")), Effect.map(({ stdout, stderr }) => ({ stdout, stderr })));
|
|
124
|
+
}
|
|
125
|
+
function candidatesForOwner(records, pid, cwd) {
|
|
126
|
+
return records.filter((record) => record.ownerPid === pid && record.cwd === cwd && record.endedAt === undefined);
|
|
127
|
+
}
|
|
128
|
+
function requireRefreshProcess(state) {
|
|
129
|
+
if (!state.process || !state.session)
|
|
130
|
+
return Effect.fail(safeError("not_ready", true));
|
|
131
|
+
return Effect.void;
|
|
132
|
+
}
|
|
133
|
+
function prepareStart(state, healthCheck, snapshot) {
|
|
134
|
+
if (state.disposed)
|
|
135
|
+
return Effect.fail(safeError("disposed", false));
|
|
136
|
+
if (!state.process || !state.session)
|
|
137
|
+
return Effect.succeed(undefined);
|
|
138
|
+
return healthCheck().pipe(Effect.map(() => (state.phase === "ready" ? snapshot() : undefined)));
|
|
139
|
+
}
|
|
140
|
+
function requireRefreshSession(state) {
|
|
141
|
+
if (!state.process || !state.session)
|
|
142
|
+
return Effect.fail(safeError("not_ready", true));
|
|
143
|
+
return Effect.succeed(state.session);
|
|
144
|
+
}
|
|
145
|
+
function ensureRefreshReadiness({ state, healthCheck, start, }) {
|
|
146
|
+
return Effect.gen(function* () {
|
|
147
|
+
if (state.disposed)
|
|
148
|
+
return yield* Effect.fail(safeError("disposed", false));
|
|
149
|
+
yield* healthCheck();
|
|
150
|
+
if (!state.process || !state.session || state.phase !== "ready")
|
|
151
|
+
yield* start();
|
|
152
|
+
yield* requireRefreshProcess(state);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
function completeRefreshHandshake(reload, readStatus, session, ownerPid, projectDirectory, readEnvironment) {
|
|
156
|
+
return Effect.gen(function* () {
|
|
157
|
+
yield* reload;
|
|
158
|
+
const records = yield* readStatus;
|
|
159
|
+
const next = findOwnedSession(records, {
|
|
160
|
+
ownerPid,
|
|
161
|
+
sessionUuid: session.uuid,
|
|
162
|
+
projectDirectory,
|
|
163
|
+
});
|
|
164
|
+
if (!next)
|
|
165
|
+
return yield* Effect.fail(safeError("refresh_failed", true));
|
|
166
|
+
const environment = yield* readEnvironment(next).pipe(Effect.mapError(() => safeError("refresh_failed", true)));
|
|
167
|
+
return { session: next, environment };
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function validateRefreshCapability(state, session, requireStrictEgress, healthCheck, clearCapability) {
|
|
171
|
+
return Effect.gen(function* () {
|
|
172
|
+
yield* healthCheck();
|
|
173
|
+
if (!state.process || state.phase !== "ready")
|
|
174
|
+
return yield* Effect.fail(safeError("refresh_failed", true));
|
|
175
|
+
if (requireStrictEgress && session.egressMode !== "strict") {
|
|
176
|
+
const error = safeError("refresh_failed", false);
|
|
177
|
+
clearCapability("failed", error);
|
|
178
|
+
return yield* Effect.fail(error);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
function validateStartupEgress(state, requireStrictEgress, session, handle, clearCapability) {
|
|
183
|
+
if (!requireStrictEgress || session.egressMode === "strict")
|
|
184
|
+
return Effect.void;
|
|
185
|
+
const error = safeError("invalid_config", false);
|
|
186
|
+
return handle.stop.pipe(Effect.catch(() => Effect.void), Effect.tap(() => Effect.sync(() => {
|
|
187
|
+
state.process = undefined;
|
|
188
|
+
clearCapability("failed", error);
|
|
189
|
+
})), Effect.flatMap(() => Effect.fail(error)));
|
|
190
|
+
}
|
|
191
|
+
function assertRegularCertificate(pathInfo) {
|
|
192
|
+
if (!pathInfo.isFile() || pathInfo.isSymbolicLink())
|
|
193
|
+
throw new Error("not a regular certificate");
|
|
194
|
+
}
|
|
195
|
+
function assertContainedCertificate(certDirectoryReal, resolved) {
|
|
196
|
+
const outside = relative(certDirectoryReal, resolved);
|
|
197
|
+
if (outside === ".." || outside.startsWith("../") || outside.includes("\0"))
|
|
198
|
+
throw new Error("certificate outside owned directory");
|
|
199
|
+
}
|
|
200
|
+
function assertOwnedCertificate(cert) {
|
|
201
|
+
if (!cert.isFile() ||
|
|
202
|
+
cert.uid !== globalThis.process.getuid?.() ||
|
|
203
|
+
(Number(cert.mode) & 0o022) !== 0)
|
|
204
|
+
throw new Error("certificate ownership or permissions invalid");
|
|
205
|
+
}
|
|
206
|
+
function rejectUnavailableEnvironment(state) {
|
|
207
|
+
if (state.phase === "failed" || state.phase === "degraded")
|
|
208
|
+
return Effect.fail(safeError("not_ready", true));
|
|
209
|
+
return Effect.void;
|
|
210
|
+
}
|
|
211
|
+
export function makeProjectKeyFerryManager(options, processLayer = ProcessLive) {
|
|
212
|
+
return Layer.effect(ProjectKeyFerryManager, Effect.gen(function* () {
|
|
213
|
+
const processService = yield* Process;
|
|
214
|
+
// Process.spawn is scoped. Capture the layer scope once and provide it
|
|
215
|
+
// to lazy starts so a handle remains alive until this manager layer is
|
|
216
|
+
// released, rather than being released at the end of ensureStarted.
|
|
217
|
+
const managerScope = yield* Scope.Scope;
|
|
218
|
+
const config = adapterOptions(options);
|
|
219
|
+
const requestedCwd = safeProjectDirectory(options.projectDirectory);
|
|
220
|
+
const cwd = yield* Effect.tryPromise({
|
|
221
|
+
try: async () => {
|
|
222
|
+
const canonical = await realpath(requestedCwd);
|
|
223
|
+
const info = await stat(canonical);
|
|
224
|
+
if (!info.isDirectory())
|
|
225
|
+
throw new Error("project path is not a directory");
|
|
226
|
+
await access(canonical, fsConstants.R_OK | fsConstants.X_OK);
|
|
227
|
+
return canonical;
|
|
228
|
+
},
|
|
229
|
+
catch: () => safeError("invalid_config", false),
|
|
230
|
+
});
|
|
231
|
+
// The sidecar gets a stable snapshot, rather than inheriting a mutable
|
|
232
|
+
// host environment at each command. This is intentionally only for the
|
|
233
|
+
// trusted Varlock CLI boundary and is never copied into MCP config or
|
|
234
|
+
// returned by the manager.
|
|
235
|
+
const ambientEnvironment = Object.fromEntries(Object.entries(globalThis.process.env).filter((entry) => entry[1] !== undefined));
|
|
236
|
+
const certDirectory = yield* Effect.tryPromise({
|
|
237
|
+
try: () => mkdtemp(join(tmpdir(), "key-ferry-cert-")),
|
|
238
|
+
catch: () => safeError("start_failed", true),
|
|
239
|
+
});
|
|
240
|
+
const certDirectoryReal = yield* Effect.tryPromise({
|
|
241
|
+
try: () => realpath(certDirectory),
|
|
242
|
+
catch: () => safeError("start_failed", true),
|
|
243
|
+
});
|
|
244
|
+
const lock = yield* Semaphore.make(1);
|
|
245
|
+
const state = { phase: "stopped", generation: 0, disposed: false };
|
|
246
|
+
const clearCapability = (phase, error) => {
|
|
247
|
+
state.phase = phase;
|
|
248
|
+
state.environment = undefined;
|
|
249
|
+
state.session = undefined;
|
|
250
|
+
state.error = error;
|
|
251
|
+
state.generation += 1;
|
|
252
|
+
};
|
|
253
|
+
const healthCheck = () => {
|
|
254
|
+
if (!state.process)
|
|
255
|
+
return Effect.void;
|
|
256
|
+
return state.process.health.pipe(Effect.flatMap((health) => {
|
|
257
|
+
if (health.running)
|
|
258
|
+
return Effect.void;
|
|
259
|
+
clearCapability("degraded", safeError("unavailable", true));
|
|
260
|
+
return Effect.void;
|
|
261
|
+
}));
|
|
262
|
+
};
|
|
263
|
+
const status = Effect.suspend(() => healthCheck()).pipe(Effect.asVoid, Effect.map(() => statusSnapshot(state, cwd)));
|
|
264
|
+
const waitForSession = (handle) => {
|
|
265
|
+
const deadline = Date.now() + config.startupTimeoutMs;
|
|
266
|
+
const poll = () => Effect.gen(function* () {
|
|
267
|
+
const output = yield* runCommand(processService, config, cwd, ["proxy", "status", "--format", "json"], config.commandTimeoutMs, ambientEnvironment);
|
|
268
|
+
const records = yield* Effect.try({
|
|
269
|
+
try: () => decodeSessionList(output.stdout),
|
|
270
|
+
catch: () => safeError("protocol_error", false),
|
|
271
|
+
});
|
|
272
|
+
const candidates = candidatesForOwner(records, handle.pid, cwd);
|
|
273
|
+
if (candidates.length === 1) {
|
|
274
|
+
const candidate = candidates[0];
|
|
275
|
+
const owned = findOwnedSession(records, {
|
|
276
|
+
ownerPid: handle.pid,
|
|
277
|
+
sessionUuid: candidate.uuid,
|
|
278
|
+
projectDirectory: cwd,
|
|
279
|
+
});
|
|
280
|
+
if (owned)
|
|
281
|
+
return owned;
|
|
282
|
+
}
|
|
283
|
+
if (Date.now() >= deadline)
|
|
284
|
+
return yield* Effect.fail(safeError("timeout", true));
|
|
285
|
+
yield* Effect.sleep(Duration.millis(config.pollIntervalMs));
|
|
286
|
+
return yield* poll();
|
|
287
|
+
});
|
|
288
|
+
return poll();
|
|
289
|
+
};
|
|
290
|
+
const readEnvironment = (session) => runCommand(processService, config, cwd, ["proxy", "env", "--session", session.uuid, "--full", "--format", "json"], config.commandTimeoutMs, ambientEnvironment).pipe(Effect.flatMap(({ stdout }) => Effect.gen(function* () {
|
|
291
|
+
const decoded = yield* Effect.try({
|
|
292
|
+
try: () => {
|
|
293
|
+
const full = parseEnvironmentOutput(stdout);
|
|
294
|
+
const wiring = validateProxyWiring(full);
|
|
295
|
+
const selected = selectPlaceholderEnvironment(full, session, config.environmentKeys);
|
|
296
|
+
return { wiring, selected };
|
|
297
|
+
},
|
|
298
|
+
catch: () => safeError("protocol_error", false),
|
|
299
|
+
});
|
|
300
|
+
yield* Effect.tryPromise({
|
|
301
|
+
try: async () => {
|
|
302
|
+
const original = await lstat(decoded.wiring.caPath);
|
|
303
|
+
assertRegularCertificate(original);
|
|
304
|
+
const resolved = await realpath(decoded.wiring.caPath);
|
|
305
|
+
const cert = await stat(resolved);
|
|
306
|
+
assertContainedCertificate(certDirectoryReal, resolved);
|
|
307
|
+
// Varlock's CA certificate is public trust material and is
|
|
308
|
+
// currently written 0644. Reject group/other *writes*, but
|
|
309
|
+
// allow readable public certs. The directory remains
|
|
310
|
+
// manager-owned and private; private keys are never
|
|
311
|
+
// accepted through this path.
|
|
312
|
+
assertOwnedCertificate(cert);
|
|
313
|
+
},
|
|
314
|
+
catch: () => safeError("protocol_error", false),
|
|
315
|
+
});
|
|
316
|
+
return { ...decoded.wiring.env, ...decoded.selected };
|
|
317
|
+
})));
|
|
318
|
+
const startInternal = () => Effect.gen(function* () {
|
|
319
|
+
const existing = yield* prepareStart(state, healthCheck, () => statusSnapshot(state, cwd));
|
|
320
|
+
if (existing)
|
|
321
|
+
return existing;
|
|
322
|
+
state.phase = "starting";
|
|
323
|
+
state.error = undefined;
|
|
324
|
+
const parts = commandParts(config, [
|
|
325
|
+
"proxy",
|
|
326
|
+
"start",
|
|
327
|
+
"--allow-reload",
|
|
328
|
+
"--cert-dir",
|
|
329
|
+
certDirectory,
|
|
330
|
+
]);
|
|
331
|
+
const handle = yield* Effect.provideService(processService
|
|
332
|
+
.spawn({ ...parts, cwd, env: ambientEnvironment, terminateGraceMs: 500 })
|
|
333
|
+
.pipe(Effect.mapError((error) => fromProcessError(error, "start_failed"))), Scope.Scope, managerScope).pipe(Effect.catch((error) => Effect.gen(function* () {
|
|
334
|
+
clearCapability("failed", error);
|
|
335
|
+
return yield* Effect.fail(error);
|
|
336
|
+
})));
|
|
337
|
+
state.process = handle;
|
|
338
|
+
const result = yield* waitForSession(handle).pipe(Effect.flatMap((session) => readEnvironment(session).pipe(Effect.map((environment) => ({ session, environment })))), Effect.catch((error) => Effect.gen(function* () {
|
|
339
|
+
yield* handle.stop.pipe(Effect.catch(() => Effect.void));
|
|
340
|
+
state.process = undefined;
|
|
341
|
+
clearCapability("failed", error);
|
|
342
|
+
return yield* Effect.fail(error);
|
|
343
|
+
})));
|
|
344
|
+
yield* validateStartupEgress(state, config.requireStrictEgress, result.session, handle, clearCapability);
|
|
345
|
+
state.session = result.session;
|
|
346
|
+
state.environment = result.environment;
|
|
347
|
+
state.phase = "ready";
|
|
348
|
+
state.error = undefined;
|
|
349
|
+
return statusSnapshot(state, cwd);
|
|
350
|
+
});
|
|
351
|
+
const exclusive = (effect) => lock.withPermit(effect);
|
|
352
|
+
const ensureStarted = exclusive(startInternal());
|
|
353
|
+
const environmentEffect = exclusive(Effect.gen(function* () {
|
|
354
|
+
yield* healthCheck();
|
|
355
|
+
yield* rejectUnavailableEnvironment(state);
|
|
356
|
+
if (state.phase !== "ready" || !state.environment) {
|
|
357
|
+
yield* startInternal();
|
|
358
|
+
}
|
|
359
|
+
if (!state.environment)
|
|
360
|
+
return yield* Effect.fail(safeError("not_ready", true));
|
|
361
|
+
return state.environment;
|
|
362
|
+
}));
|
|
363
|
+
const refresh = exclusive(Effect.gen(function* () {
|
|
364
|
+
yield* ensureRefreshReadiness({ state, healthCheck, start: startInternal });
|
|
365
|
+
const session = yield* requireRefreshSession(state);
|
|
366
|
+
const reload = runCommand(processService, config, cwd, ["proxy", "reload", "--session", session.uuid], config.reloadTimeoutMs, ambientEnvironment).pipe(Effect.mapError((error) => new VarlockError({
|
|
367
|
+
...error,
|
|
368
|
+
code: error.code === "timeout" ? "timeout" : "refresh_failed",
|
|
369
|
+
message: error.message,
|
|
370
|
+
})));
|
|
371
|
+
const readStatus = runCommand(processService, config, cwd, ["proxy", "status", "--format", "json"], config.commandTimeoutMs, ambientEnvironment).pipe(Effect.flatMap(({ stdout }) => Effect.try({
|
|
372
|
+
try: () => decodeSessionList(stdout),
|
|
373
|
+
catch: () => safeError("protocol_error", false),
|
|
374
|
+
})));
|
|
375
|
+
const result = yield* completeRefreshHandshake(reload, readStatus, session, state.process.pid, cwd, readEnvironment);
|
|
376
|
+
yield* validateRefreshCapability(state, result.session, config.requireStrictEgress, healthCheck, clearCapability);
|
|
377
|
+
state.session = result.session;
|
|
378
|
+
state.environment = result.environment;
|
|
379
|
+
state.generation += 1;
|
|
380
|
+
state.lastRefreshAt = new Date().toISOString();
|
|
381
|
+
state.error = undefined;
|
|
382
|
+
return statusSnapshot(state, cwd);
|
|
383
|
+
})).pipe(Effect.catch((error) => Effect.gen(function* () {
|
|
384
|
+
if (error.code !== "disposed") {
|
|
385
|
+
const handle = state.process;
|
|
386
|
+
if (handle)
|
|
387
|
+
yield* handle.stop.pipe(Effect.catch(() => Effect.void));
|
|
388
|
+
state.process = undefined;
|
|
389
|
+
clearCapability("failed", error.code === "refresh_failed" ? error : safeError("refresh_failed", true));
|
|
390
|
+
}
|
|
391
|
+
return yield* Effect.fail(error.code === "disposed" ? error : safeError("refresh_failed", true));
|
|
392
|
+
})));
|
|
393
|
+
const dispose = lock.withPermit(Effect.gen(function* () {
|
|
394
|
+
if (state.disposed)
|
|
395
|
+
return;
|
|
396
|
+
state.disposed = true;
|
|
397
|
+
state.phase = "stopping";
|
|
398
|
+
const handle = state.process;
|
|
399
|
+
state.environment = undefined;
|
|
400
|
+
state.session = undefined;
|
|
401
|
+
if (handle)
|
|
402
|
+
yield* handle.stop.pipe(Effect.catch(() => Effect.void));
|
|
403
|
+
state.process = undefined;
|
|
404
|
+
state.phase = "stopped";
|
|
405
|
+
state.generation += 1;
|
|
406
|
+
}));
|
|
407
|
+
const service = {
|
|
408
|
+
status,
|
|
409
|
+
ensureStarted,
|
|
410
|
+
environment: environmentEffect,
|
|
411
|
+
refresh,
|
|
412
|
+
dispose,
|
|
413
|
+
withExclusive: (effect) => lock.withPermit(effect),
|
|
414
|
+
};
|
|
415
|
+
yield* Effect.addFinalizer(() => Effect.promise(() => rm(certDirectory, { recursive: true, force: true })));
|
|
416
|
+
// Finalizers run in reverse registration order, so stop the sidecar
|
|
417
|
+
// before removing the directory that contains its CA.
|
|
418
|
+
yield* Effect.addFinalizer(() => dispose);
|
|
419
|
+
return ProjectKeyFerryManager.of(service);
|
|
420
|
+
})).pipe(Layer.provide(processLayer));
|
|
421
|
+
}
|
|
422
|
+
export const projectKeyFerryManagerFactory = {
|
|
423
|
+
layer: (options) => makeProjectKeyFerryManager(options),
|
|
424
|
+
};
|
|
425
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/varlock/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** Pure validation for the Varlock proxy CLI protocol.
|
|
2
|
+
*
|
|
3
|
+
* This module deliberately does not know about process.env, subprocesses, or
|
|
4
|
+
* Effect. Treat every value passed to it as hostile CLI output. In
|
|
5
|
+
* particular, a session record is not a proof of ownership until the caller
|
|
6
|
+
* supplies the PID, UUID, and project directory it created.
|
|
7
|
+
*/
|
|
8
|
+
export declare const PROTOCOL_LIMITS: {
|
|
9
|
+
readonly jsonBytes: number;
|
|
10
|
+
readonly sessions: 128;
|
|
11
|
+
readonly mapEntries: 512;
|
|
12
|
+
readonly stringBytes: number;
|
|
13
|
+
readonly envKeyLength: 256;
|
|
14
|
+
};
|
|
15
|
+
export interface VarlockSessionRecord {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly uuid: string;
|
|
18
|
+
readonly ownerPid: number;
|
|
19
|
+
readonly cwd: string;
|
|
20
|
+
readonly startedAt: string;
|
|
21
|
+
readonly updatedAt: string;
|
|
22
|
+
readonly endedAt?: string;
|
|
23
|
+
readonly egressMode: "permissive" | "strict";
|
|
24
|
+
readonly env: Readonly<Record<string, string>>;
|
|
25
|
+
readonly placeholderOverrides?: Readonly<Record<string, string>>;
|
|
26
|
+
}
|
|
27
|
+
export interface OwnedSessionIdentity {
|
|
28
|
+
readonly ownerPid: number;
|
|
29
|
+
readonly sessionUuid: string;
|
|
30
|
+
readonly projectDirectory: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ProxyWiring {
|
|
33
|
+
readonly proxyUrl: string;
|
|
34
|
+
readonly caPath: string;
|
|
35
|
+
readonly env: Readonly<Record<string, string>>;
|
|
36
|
+
}
|
|
37
|
+
export interface SafeSessionStatus {
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly uuid: string;
|
|
40
|
+
readonly ownerPid: number;
|
|
41
|
+
readonly cwd: string;
|
|
42
|
+
readonly startedAt: string;
|
|
43
|
+
readonly updatedAt: string;
|
|
44
|
+
readonly egressMode: "permissive" | "strict";
|
|
45
|
+
readonly proxyUrl: string;
|
|
46
|
+
readonly running: boolean;
|
|
47
|
+
}
|
|
48
|
+
export declare class VarlockProtocolError extends Error {
|
|
49
|
+
readonly code: "protocol_error";
|
|
50
|
+
constructor(message?: string);
|
|
51
|
+
}
|
|
52
|
+
/** Decode only the JSON array emitted by `varlock proxy status --format json`. */
|
|
53
|
+
export declare function decodeSessionList(input: string): readonly VarlockSessionRecord[];
|
|
54
|
+
/** Exact ownership match. No cwd-prefix or PID-only matching is accepted. */
|
|
55
|
+
export declare function findOwnedSession(sessions: readonly VarlockSessionRecord[], identity: OwnedSessionIdentity): VarlockSessionRecord | undefined;
|
|
56
|
+
/** Validate wiring without returning credentials or writing ambient env state. */
|
|
57
|
+
export declare function validateProxyWiring(env: Readonly<Record<string, string>>): ProxyWiring;
|
|
58
|
+
/**
|
|
59
|
+
* Select explicitly requested child keys. A key is safe only when the session
|
|
60
|
+
* record has an exact placeholder assignment and the full env contains that
|
|
61
|
+
* exact placeholder. Prefixes are intentionally not trusted. Keys absent from
|
|
62
|
+
* placeholderOverrides (including @proxy=passthrough values) are rejected.
|
|
63
|
+
*/
|
|
64
|
+
export declare function selectPlaceholderEnvironment(fullEnv: Readonly<Record<string, string>>, session: VarlockSessionRecord, requestedKeys: readonly string[]): Readonly<Record<string, string>>;
|
|
65
|
+
/** Safe status allowlist; deliberately drops tokens, env maps, and placeholders. */
|
|
66
|
+
export declare function sanitizeSessionStatus(session: VarlockSessionRecord, running: boolean): SafeSessionStatus;
|
|
67
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/varlock/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AA8BX,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,YAAY,GAAG,QAAQ,CAAC;IAC7C,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,YAAY,GAAG,QAAQ,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;gBAE9B,OAAO,SAAsC;CAM1D;AAkFD,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAKhF;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,oBAAoB,EAAE,EACzC,QAAQ,EAAE,oBAAoB,GAC7B,oBAAoB,GAAG,SAAS,CAWlC;AAgCD,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,WAAW,CAwCtF;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACzC,OAAO,EAAE,oBAAoB,EAC7B,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAkBlC;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,OAAO,GACf,iBAAiB,CAanB"}
|