@phigon/observer 8.0.1
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/README.md +303 -0
- package/dist/bin/guardian-runner-darwin-amd64 +0 -0
- package/dist/bin/guardian-runner-darwin-arm64 +0 -0
- package/dist/bin/guardian-runner-linux-amd64 +0 -0
- package/dist/bin/guardian-runner-linux-arm64 +0 -0
- package/dist/bin/guardian-runner-windows-amd64.exe +0 -0
- package/dist/bin/guardian-runner-windows-arm64.exe +0 -0
- package/dist/src/action-policy.d.ts +38 -0
- package/dist/src/action-policy.d.ts.map +1 -0
- package/dist/src/action-policy.js +269 -0
- package/dist/src/action-policy.js.map +1 -0
- package/dist/src/activity/adapters/claude.d.ts +3 -0
- package/dist/src/activity/adapters/claude.d.ts.map +1 -0
- package/dist/src/activity/adapters/claude.js +89 -0
- package/dist/src/activity/adapters/claude.js.map +1 -0
- package/dist/src/activity/adapters/codex.d.ts +3 -0
- package/dist/src/activity/adapters/codex.d.ts.map +1 -0
- package/dist/src/activity/adapters/codex.js +277 -0
- package/dist/src/activity/adapters/codex.js.map +1 -0
- package/dist/src/activity/adapters/copilot.d.ts +2 -0
- package/dist/src/activity/adapters/copilot.d.ts.map +1 -0
- package/dist/src/activity/adapters/copilot.js +4 -0
- package/dist/src/activity/adapters/copilot.js.map +1 -0
- package/dist/src/activity/adapters/generic.d.ts +2 -0
- package/dist/src/activity/adapters/generic.d.ts.map +1 -0
- package/dist/src/activity/adapters/generic.js +4 -0
- package/dist/src/activity/adapters/generic.js.map +1 -0
- package/dist/src/activity/adapters/hermes.d.ts +2 -0
- package/dist/src/activity/adapters/hermes.d.ts.map +1 -0
- package/dist/src/activity/adapters/hermes.js +4 -0
- package/dist/src/activity/adapters/hermes.js.map +1 -0
- package/dist/src/activity/adapters/openai-compatible.d.ts +4 -0
- package/dist/src/activity/adapters/openai-compatible.d.ts.map +1 -0
- package/dist/src/activity/adapters/openai-compatible.js +116 -0
- package/dist/src/activity/adapters/openai-compatible.js.map +1 -0
- package/dist/src/activity/adapters/openclaw.d.ts +2 -0
- package/dist/src/activity/adapters/openclaw.d.ts.map +1 -0
- package/dist/src/activity/adapters/openclaw.js +4 -0
- package/dist/src/activity/adapters/openclaw.js.map +1 -0
- package/dist/src/activity/adapters/opencode.d.ts +3 -0
- package/dist/src/activity/adapters/opencode.d.ts.map +1 -0
- package/dist/src/activity/adapters/opencode.js +137 -0
- package/dist/src/activity/adapters/opencode.js.map +1 -0
- package/dist/src/activity/bridges.d.ts +7 -0
- package/dist/src/activity/bridges.d.ts.map +1 -0
- package/dist/src/activity/bridges.js +17 -0
- package/dist/src/activity/bridges.js.map +1 -0
- package/dist/src/activity/collector.d.ts +90 -0
- package/dist/src/activity/collector.d.ts.map +1 -0
- package/dist/src/activity/collector.js +706 -0
- package/dist/src/activity/collector.js.map +1 -0
- package/dist/src/activity/index.d.ts +14 -0
- package/dist/src/activity/index.d.ts.map +1 -0
- package/dist/src/activity/index.js +14 -0
- package/dist/src/activity/index.js.map +1 -0
- package/dist/src/activity/ingest.d.ts +15 -0
- package/dist/src/activity/ingest.d.ts.map +1 -0
- package/dist/src/activity/ingest.js +103 -0
- package/dist/src/activity/ingest.js.map +1 -0
- package/dist/src/activity/native-capabilities.d.ts +14 -0
- package/dist/src/activity/native-capabilities.d.ts.map +1 -0
- package/dist/src/activity/native-capabilities.js +85 -0
- package/dist/src/activity/native-capabilities.js.map +1 -0
- package/dist/src/activity/normalize.d.ts +17 -0
- package/dist/src/activity/normalize.d.ts.map +1 -0
- package/dist/src/activity/normalize.js +416 -0
- package/dist/src/activity/normalize.js.map +1 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts +19 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/opencode-sqlite-source.js +305 -0
- package/dist/src/activity/opencode-sqlite-source.js.map +1 -0
- package/dist/src/activity/policy.d.ts +48 -0
- package/dist/src/activity/policy.d.ts.map +1 -0
- package/dist/src/activity/policy.js +436 -0
- package/dist/src/activity/policy.js.map +1 -0
- package/dist/src/activity/record.d.ts +7 -0
- package/dist/src/activity/record.d.ts.map +1 -0
- package/dist/src/activity/record.js +61 -0
- package/dist/src/activity/record.js.map +1 -0
- package/dist/src/activity/source-reader.d.ts +46 -0
- package/dist/src/activity/source-reader.d.ts.map +1 -0
- package/dist/src/activity/source-reader.js +594 -0
- package/dist/src/activity/source-reader.js.map +1 -0
- package/dist/src/activity/types.d.ts +21 -0
- package/dist/src/activity/types.d.ts.map +1 -0
- package/dist/src/activity/types.js +2 -0
- package/dist/src/activity/types.js.map +1 -0
- package/dist/src/agent-action-executor.d.ts +21 -0
- package/dist/src/agent-action-executor.d.ts.map +1 -0
- package/dist/src/agent-action-executor.js +248 -0
- package/dist/src/agent-action-executor.js.map +1 -0
- package/dist/src/agentic-guardian.d.ts +50 -0
- package/dist/src/agentic-guardian.d.ts.map +1 -0
- package/dist/src/agentic-guardian.js +220 -0
- package/dist/src/agentic-guardian.js.map +1 -0
- package/dist/src/atomic-replace.d.ts +4 -0
- package/dist/src/atomic-replace.d.ts.map +1 -0
- package/dist/src/atomic-replace.js +18 -0
- package/dist/src/atomic-replace.js.map +1 -0
- package/dist/src/cli.d.ts +11 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +1244 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +68 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +260 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/credential-store.d.ts +22 -0
- package/dist/src/credential-store.d.ts.map +1 -0
- package/dist/src/credential-store.js +91 -0
- package/dist/src/credential-store.js.map +1 -0
- package/dist/src/custom-agent-registry.d.ts +26 -0
- package/dist/src/custom-agent-registry.d.ts.map +1 -0
- package/dist/src/custom-agent-registry.js +288 -0
- package/dist/src/custom-agent-registry.js.map +1 -0
- package/dist/src/discovery/adapters/claude.d.ts +3 -0
- package/dist/src/discovery/adapters/claude.d.ts.map +1 -0
- package/dist/src/discovery/adapters/claude.js +26 -0
- package/dist/src/discovery/adapters/claude.js.map +1 -0
- package/dist/src/discovery/adapters/codex.d.ts +3 -0
- package/dist/src/discovery/adapters/codex.d.ts.map +1 -0
- package/dist/src/discovery/adapters/codex.js +23 -0
- package/dist/src/discovery/adapters/codex.js.map +1 -0
- package/dist/src/discovery/adapters/custom.d.ts +4 -0
- package/dist/src/discovery/adapters/custom.d.ts.map +1 -0
- package/dist/src/discovery/adapters/custom.js +24 -0
- package/dist/src/discovery/adapters/custom.js.map +1 -0
- package/dist/src/discovery/adapters/generic.d.ts +3 -0
- package/dist/src/discovery/adapters/generic.d.ts.map +1 -0
- package/dist/src/discovery/adapters/generic.js +126 -0
- package/dist/src/discovery/adapters/generic.js.map +1 -0
- package/dist/src/discovery/adapters/hermes.d.ts +3 -0
- package/dist/src/discovery/adapters/hermes.d.ts.map +1 -0
- package/dist/src/discovery/adapters/hermes.js +22 -0
- package/dist/src/discovery/adapters/hermes.js.map +1 -0
- package/dist/src/discovery/adapters/openclaw.d.ts +3 -0
- package/dist/src/discovery/adapters/openclaw.d.ts.map +1 -0
- package/dist/src/discovery/adapters/openclaw.js +22 -0
- package/dist/src/discovery/adapters/openclaw.js.map +1 -0
- package/dist/src/discovery/engine.d.ts +17 -0
- package/dist/src/discovery/engine.d.ts.map +1 -0
- package/dist/src/discovery/engine.js +164 -0
- package/dist/src/discovery/engine.js.map +1 -0
- package/dist/src/discovery/evidence.d.ts +29 -0
- package/dist/src/discovery/evidence.d.ts.map +1 -0
- package/dist/src/discovery/evidence.js +2 -0
- package/dist/src/discovery/evidence.js.map +1 -0
- package/dist/src/discovery/index.d.ts +11 -0
- package/dist/src/discovery/index.d.ts.map +1 -0
- package/dist/src/discovery/index.js +11 -0
- package/dist/src/discovery/index.js.map +1 -0
- package/dist/src/discovery/known-agent.d.ts +17 -0
- package/dist/src/discovery/known-agent.d.ts.map +1 -0
- package/dist/src/discovery/known-agent.js +193 -0
- package/dist/src/discovery/known-agent.js.map +1 -0
- package/dist/src/discovery/process-identity.d.ts +19 -0
- package/dist/src/discovery/process-identity.d.ts.map +1 -0
- package/dist/src/discovery/process-identity.js +73 -0
- package/dist/src/discovery/process-identity.js.map +1 -0
- package/dist/src/discovery/system-evidence.d.ts +9 -0
- package/dist/src/discovery/system-evidence.d.ts.map +1 -0
- package/dist/src/discovery/system-evidence.js +270 -0
- package/dist/src/discovery/system-evidence.js.map +1 -0
- package/dist/src/discovery/types.d.ts +21 -0
- package/dist/src/discovery/types.d.ts.map +1 -0
- package/dist/src/discovery/types.js +2 -0
- package/dist/src/discovery/types.js.map +1 -0
- package/dist/src/event-queue.d.ts +32 -0
- package/dist/src/event-queue.d.ts.map +1 -0
- package/dist/src/event-queue.js +125 -0
- package/dist/src/event-queue.js.map +1 -0
- package/dist/src/event-spool.d.ts +19 -0
- package/dist/src/event-spool.d.ts.map +1 -0
- package/dist/src/event-spool.js +350 -0
- package/dist/src/event-spool.js.map +1 -0
- package/dist/src/generated/phigon/v1/action_pb.d.ts +223 -0
- package/dist/src/generated/phigon/v1/action_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/action_pb.js +96 -0
- package/dist/src/generated/phigon/v1/action_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/common_pb.d.ts +255 -0
- package/dist/src/generated/phigon/v1/common_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/common_pb.js +242 -0
- package/dist/src/generated/phigon/v1/common_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/history_sync_pb.d.ts +119 -0
- package/dist/src/generated/phigon/v1/history_sync_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/history_sync_pb.js +46 -0
- package/dist/src/generated/phigon/v1/history_sync_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/identity_pb.d.ts +235 -0
- package/dist/src/generated/phigon/v1/identity_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/identity_pb.js +31 -0
- package/dist/src/generated/phigon/v1/identity_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/observer_service_pb.d.ts +362 -0
- package/dist/src/generated/phigon/v1/observer_service_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/observer_service_pb.js +120 -0
- package/dist/src/generated/phigon/v1/observer_service_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/policy_pb.d.ts +456 -0
- package/dist/src/generated/phigon/v1/policy_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/policy_pb.js +161 -0
- package/dist/src/generated/phigon/v1/policy_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/supervision_pb.d.ts +849 -0
- package/dist/src/generated/phigon/v1/supervision_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/supervision_pb.js +384 -0
- package/dist/src/generated/phigon/v1/supervision_pb.js.map +1 -0
- package/dist/src/generated/phigon/v1/telemetry_pb.d.ts +761 -0
- package/dist/src/generated/phigon/v1/telemetry_pb.d.ts.map +1 -0
- package/dist/src/generated/phigon/v1/telemetry_pb.js +309 -0
- package/dist/src/generated/phigon/v1/telemetry_pb.js.map +1 -0
- package/dist/src/guardian-containment.d.ts +30 -0
- package/dist/src/guardian-containment.d.ts.map +1 -0
- package/dist/src/guardian-containment.js +113 -0
- package/dist/src/guardian-containment.js.map +1 -0
- package/dist/src/guardian-decision-journal.d.ts +29 -0
- package/dist/src/guardian-decision-journal.d.ts.map +1 -0
- package/dist/src/guardian-decision-journal.js +55 -0
- package/dist/src/guardian-decision-journal.js.map +1 -0
- package/dist/src/guardian-execution-manifest.d.ts +29 -0
- package/dist/src/guardian-execution-manifest.d.ts.map +1 -0
- package/dist/src/guardian-execution-manifest.js +95 -0
- package/dist/src/guardian-execution-manifest.js.map +1 -0
- package/dist/src/guardian-hosted-client.d.ts +10 -0
- package/dist/src/guardian-hosted-client.d.ts.map +1 -0
- package/dist/src/guardian-hosted-client.js +45 -0
- package/dist/src/guardian-hosted-client.js.map +1 -0
- package/dist/src/guardian-managed-exec.d.ts +21 -0
- package/dist/src/guardian-managed-exec.d.ts.map +1 -0
- package/dist/src/guardian-managed-exec.js +249 -0
- package/dist/src/guardian-managed-exec.js.map +1 -0
- package/dist/src/guardian-model-bridge.d.ts +13 -0
- package/dist/src/guardian-model-bridge.d.ts.map +1 -0
- package/dist/src/guardian-model-bridge.js +87 -0
- package/dist/src/guardian-model-bridge.js.map +1 -0
- package/dist/src/guardian-native.d.ts +3 -0
- package/dist/src/guardian-native.d.ts.map +1 -0
- package/dist/src/guardian-native.js +13 -0
- package/dist/src/guardian-native.js.map +1 -0
- package/dist/src/guardian-process-monitor.d.ts +20 -0
- package/dist/src/guardian-process-monitor.d.ts.map +1 -0
- package/dist/src/guardian-process-monitor.js +98 -0
- package/dist/src/guardian-process-monitor.js.map +1 -0
- package/dist/src/health.d.ts +35 -0
- package/dist/src/health.d.ts.map +1 -0
- package/dist/src/health.js +41 -0
- package/dist/src/health.js.map +1 -0
- package/dist/src/historical-identity-store.d.ts +20 -0
- package/dist/src/historical-identity-store.d.ts.map +1 -0
- package/dist/src/historical-identity-store.js +391 -0
- package/dist/src/historical-identity-store.js.map +1 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +14 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/installation.d.ts +2 -0
- package/dist/src/installation.d.ts.map +1 -0
- package/dist/src/installation.js +44 -0
- package/dist/src/installation.js.map +1 -0
- package/dist/src/machine-command-executor.d.ts +28 -0
- package/dist/src/machine-command-executor.d.ts.map +1 -0
- package/dist/src/machine-command-executor.js +166 -0
- package/dist/src/machine-command-executor.js.map +1 -0
- package/dist/src/pair.d.ts +21 -0
- package/dist/src/pair.d.ts.map +1 -0
- package/dist/src/pair.js +125 -0
- package/dist/src/pair.js.map +1 -0
- package/dist/src/remove-machine.d.ts +15 -0
- package/dist/src/remove-machine.d.ts.map +1 -0
- package/dist/src/remove-machine.js +77 -0
- package/dist/src/remove-machine.js.map +1 -0
- package/dist/src/stream-client.d.ts +42 -0
- package/dist/src/stream-client.d.ts.map +1 -0
- package/dist/src/stream-client.js +867 -0
- package/dist/src/stream-client.js.map +1 -0
- package/dist/src/stream-state.d.ts +13 -0
- package/dist/src/stream-state.d.ts.map +1 -0
- package/dist/src/stream-state.js +128 -0
- package/dist/src/stream-state.js.map +1 -0
- package/dist/src/windows-process.d.ts +7 -0
- package/dist/src/windows-process.d.ts.map +1 -0
- package/dist/src/windows-process.js +17 -0
- package/dist/src/windows-process.js.map +1 -0
- package/package.json +78 -0
- package/scripts/install.mjs +308 -0
- package/scripts/managed-service.mjs +132 -0
- package/scripts/verify-guardian-release.mjs +42 -0
- package/scripts/windows-app-control.mjs +117 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { constants, createReadStream } from "node:fs";
|
|
3
|
+
import { access, realpath, stat } from "node:fs/promises";
|
|
4
|
+
import { delimiter, isAbsolute, resolve } from "node:path";
|
|
5
|
+
export function executionEnvironment(source) {
|
|
6
|
+
const result = {};
|
|
7
|
+
const seen = new Set();
|
|
8
|
+
for (const key of Object.keys(source).sort()) {
|
|
9
|
+
const value = source[key];
|
|
10
|
+
const normalized = process.platform === "win32" ? key.toUpperCase() : key;
|
|
11
|
+
if (value === undefined || seen.has(normalized))
|
|
12
|
+
continue;
|
|
13
|
+
seen.add(normalized);
|
|
14
|
+
// Machine management credentials and runtime injection must never be
|
|
15
|
+
// inherited by the supervised workload.
|
|
16
|
+
if (/^PHIGON_/iu.test(key) || /^(NODE_OPTIONS|NODE_PATH|LD_PRELOAD|LD_LIBRARY_PATH|DYLD_.*|PYTHONPATH|PYTHONHOME|RUBYOPT|PERL5OPT|BASH_ENV|ENV)$/iu.test(key))
|
|
17
|
+
continue;
|
|
18
|
+
result[key] = value;
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
export async function digestExecutable(path) {
|
|
23
|
+
const info = await stat(path);
|
|
24
|
+
if (!info.isFile() || info.size > 1 << 30)
|
|
25
|
+
throw new Error("Guardian execution input is not a supported regular file.");
|
|
26
|
+
const hash = createHash("sha256");
|
|
27
|
+
for await (const chunk of createReadStream(path))
|
|
28
|
+
hash.update(chunk);
|
|
29
|
+
return hash.digest("hex");
|
|
30
|
+
}
|
|
31
|
+
async function resolveExecutable(executable, cwd, env) {
|
|
32
|
+
const explicit = isAbsolute(executable) || /[/\\]/u.test(executable);
|
|
33
|
+
const pathKey = Object.keys(env).find((key) => key.toUpperCase() === "PATH");
|
|
34
|
+
const paths = explicit ? [resolve(cwd, executable)] : (env[pathKey ?? "PATH"] ?? "").split(delimiter)
|
|
35
|
+
.filter((entry) => entry !== "" && isAbsolute(entry)).map((entry) => resolve(entry, executable));
|
|
36
|
+
for (const path of paths) {
|
|
37
|
+
const candidates = process.platform === "win32" && !/\.exe$/iu.test(path) ? [path, `${path}.exe`] : [path];
|
|
38
|
+
for (const candidate of candidates) {
|
|
39
|
+
try {
|
|
40
|
+
const resolved = await realpath(candidate);
|
|
41
|
+
if (process.platform === "win32" && !/\.exe$/iu.test(resolved))
|
|
42
|
+
continue;
|
|
43
|
+
if (!(await stat(resolved)).isFile())
|
|
44
|
+
continue;
|
|
45
|
+
await access(resolved, process.platform === "win32" ? constants.F_OK : constants.X_OK);
|
|
46
|
+
return resolved;
|
|
47
|
+
}
|
|
48
|
+
catch { /* Try the next explicit PATH entry. */ }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
throw new Error("Guardian could not resolve a native executable. For scripts, name the interpreter explicitly.");
|
|
52
|
+
}
|
|
53
|
+
export async function createExecutionManifest(options) {
|
|
54
|
+
const cwd = await realpath(options.cwd ?? process.cwd());
|
|
55
|
+
if (options.cgroupRoot && (process.platform !== "linux" || !isAbsolute(options.cgroupRoot)))
|
|
56
|
+
throw new Error("Guardian cgroup configuration requires an absolute Linux cgroup-v2 root.");
|
|
57
|
+
const executable = await resolveExecutable(options.executable, cwd, options.environment);
|
|
58
|
+
const inputs = [];
|
|
59
|
+
// Bind existing file arguments, including directly named scripts/configs.
|
|
60
|
+
// Files read indirectly need an OS filesystem policy; they are not guessed.
|
|
61
|
+
for (const arg of options.arguments) {
|
|
62
|
+
if (arg.startsWith("-") || arg.includes("\0") || arg.length > 4096)
|
|
63
|
+
continue;
|
|
64
|
+
let path;
|
|
65
|
+
try {
|
|
66
|
+
path = await realpath(resolve(cwd, arg));
|
|
67
|
+
if (!(await stat(path)).isFile())
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!inputs.some((input) => input.path === path))
|
|
74
|
+
inputs.push({ path, digest: await digestExecutable(path) });
|
|
75
|
+
if (inputs.length > 64)
|
|
76
|
+
throw new Error("Guardian execution has too many file inputs.");
|
|
77
|
+
}
|
|
78
|
+
const environmentEntries = Object.entries(options.environment).filter((entry) => entry[1] !== undefined).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
|
|
79
|
+
const manifest = Object.freeze({
|
|
80
|
+
sandbox: options.sandbox ?? "",
|
|
81
|
+
executable, executable_digest: await digestExecutable(executable), arguments: Object.freeze([...options.arguments]),
|
|
82
|
+
working_directory: cwd, environment_digest: createHash("sha256").update(JSON.stringify(environmentEntries)).digest("hex"),
|
|
83
|
+
inputs: Object.freeze(inputs.map((input) => Object.freeze(input))), agent_id: options.agentId, model: options.model ?? "", cgroup_root: options.cgroupRoot ?? "",
|
|
84
|
+
});
|
|
85
|
+
if (Buffer.byteLength(JSON.stringify(manifest)) > 56 << 10)
|
|
86
|
+
throw new Error("Guardian execution manifest exceeds its bound.");
|
|
87
|
+
return manifest;
|
|
88
|
+
}
|
|
89
|
+
export async function verifyExecutionManifest(manifest, environment) {
|
|
90
|
+
const current = await createExecutionManifest({ executable: manifest.executable, arguments: manifest.arguments,
|
|
91
|
+
agentId: manifest.agent_id, model: manifest.model, cwd: manifest.working_directory, environment, cgroupRoot: manifest.cgroup_root, sandbox: manifest.sandbox });
|
|
92
|
+
if (JSON.stringify(current) !== JSON.stringify(manifest))
|
|
93
|
+
throw new Error("Phigon Guardian blocked execution because its executable, inputs, directory, or environment changed after review.");
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=guardian-execution-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian-execution-manifest.js","sourceRoot":"","sources":["../../src/guardian-execution-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class GuardianHostedClient {
|
|
2
|
+
private readonly options;
|
|
3
|
+
constructor(options: Readonly<{
|
|
4
|
+
controlPlaneURL: URL;
|
|
5
|
+
credential: string;
|
|
6
|
+
fetcher?: typeof fetch;
|
|
7
|
+
}>);
|
|
8
|
+
post(path: string, body: unknown, signal?: AbortSignal, timeoutMs?: number): Promise<Record<string, unknown>>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=guardian-hosted-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian-hosted-client.d.ts","sourceRoot":"","sources":["../../src/guardian-hosted-client.ts"],"names":[],"mappings":"AAEA,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,QAAQ,CAAC;QAAE,eAAe,EAAE,GAAG,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;KAAE,CAAC;IAE9G,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,SAAS,SAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAqBrH"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { GuardianDecisionUnavailableError } from "./agentic-guardian.js";
|
|
2
|
+
export class GuardianHostedClient {
|
|
3
|
+
options;
|
|
4
|
+
constructor(options) {
|
|
5
|
+
this.options = options;
|
|
6
|
+
}
|
|
7
|
+
async post(path, body, signal, timeoutMs = 370_000) {
|
|
8
|
+
try {
|
|
9
|
+
const timeout = AbortSignal.timeout(timeoutMs);
|
|
10
|
+
const response = await (this.options.fetcher ?? fetch)(new URL(path, this.options.controlPlaneURL), {
|
|
11
|
+
method: "POST", redirect: "error", headers: { Authorization: `Bearer ${this.options.credential}`, "Content-Type": "application/json" },
|
|
12
|
+
body: JSON.stringify(body), signal: signal === undefined ? timeout : AbortSignal.any([timeout, signal]),
|
|
13
|
+
});
|
|
14
|
+
const reader = response.body?.getReader();
|
|
15
|
+
if (!reader)
|
|
16
|
+
throw new Error("Missing response.");
|
|
17
|
+
const chunks = [];
|
|
18
|
+
let size = 0;
|
|
19
|
+
try {
|
|
20
|
+
while (true) {
|
|
21
|
+
const chunk = await reader.read();
|
|
22
|
+
if (chunk.done)
|
|
23
|
+
break;
|
|
24
|
+
size += chunk.value.byteLength;
|
|
25
|
+
if (size > 64 << 10)
|
|
26
|
+
throw new Error("Oversized response.");
|
|
27
|
+
chunks.push(chunk.value);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await reader.cancel();
|
|
32
|
+
}
|
|
33
|
+
if (!response.ok)
|
|
34
|
+
throw new Error(`Service returned ${response.status}.`);
|
|
35
|
+
const value = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
36
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
37
|
+
throw new Error("Invalid response.");
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
throw new GuardianDecisionUnavailableError("Phigon Guardian could not verify hosted enforcement; the action remains blocked.");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=guardian-hosted-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian-hosted-client.js","sourceRoot":"","sources":["../../src/guardian-hosted-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAC;AAEzE,MAAM,OAAO,oBAAoB;IACF;IAA7B,YAA6B,OAAuF;QAAvF,YAAO,GAAP,OAAO,CAAgF;IAAG,CAAC;IAExH,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,IAAa,EAAE,MAAoB,EAAE,SAAS,GAAG,OAAO;QAC/E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;gBAClG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBACtI,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;aACxG,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAClD,MAAM,MAAM,GAAiB,EAAE,CAAC;YAAC,IAAI,IAAI,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC;gBAAC,OAAO,IAAI,EAAE,CAAC;oBAAC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAAC,IAAI,KAAK,CAAC,IAAI;wBAAE,MAAM;oBAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;oBAC5G,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE;wBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACxF,CAAC;YAAC,CAAC;oBAAS,CAAC;gBAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YAAC,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1E,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1E,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC9G,OAAO,KAAgC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,gCAAgC,CAAC,kFAAkF,CAAC,CAAC;QACjI,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ExecutionManifest } from "./guardian-execution-manifest.js";
|
|
2
|
+
export type ManagedExecutionResult = Readonly<{
|
|
3
|
+
exitCode: number;
|
|
4
|
+
invocationId: string;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function executeManagedCommand(options: Readonly<{
|
|
7
|
+
executable: string;
|
|
8
|
+
arguments: readonly string[];
|
|
9
|
+
agentId: string;
|
|
10
|
+
sessionId: string;
|
|
11
|
+
dataDirectory: string;
|
|
12
|
+
manifest: ExecutionManifest;
|
|
13
|
+
environment: NodeJS.ProcessEnv;
|
|
14
|
+
lease?: Readonly<{
|
|
15
|
+
origin: string;
|
|
16
|
+
credential: string;
|
|
17
|
+
request: Readonly<Record<string, unknown>>;
|
|
18
|
+
}>;
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
}>): Promise<ManagedExecutionResult>;
|
|
21
|
+
//# sourceMappingURL=guardian-managed-exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian-managed-exec.d.ts","sourceRoot":"","sources":["../../src/guardian-managed-exec.ts"],"names":[],"mappings":"AAMA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAInG,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAAC;AAEH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,KAAK,CAAC,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;IACrG,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA2InC"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { chmod, mkdir, open, unlink } from "node:fs/promises";
|
|
4
|
+
import { join, resolve as resolvePath } from "node:path";
|
|
5
|
+
import { guardianRunnerPath } from "./guardian-native.js";
|
|
6
|
+
import { access } from "node:fs/promises";
|
|
7
|
+
import { verifyExecutionManifest } from "./guardian-execution-manifest.js";
|
|
8
|
+
import { StringDecoder } from "node:string_decoder";
|
|
9
|
+
import { spawn } from "node:child_process";
|
|
10
|
+
export async function executeManagedCommand(options) {
|
|
11
|
+
const runner = guardianRunnerPath();
|
|
12
|
+
await access(runner, constants.X_OK);
|
|
13
|
+
await verifyExecutionManifest(options.manifest, options.environment);
|
|
14
|
+
if (options.signal?.aborted)
|
|
15
|
+
throw new Error("Guardian execution authorization expired before start.");
|
|
16
|
+
const invocationId = randomUUID();
|
|
17
|
+
const journal = new ManagedCommandJournal(options.dataDirectory);
|
|
18
|
+
await journal.append({
|
|
19
|
+
invocationId,
|
|
20
|
+
agentId: options.agentId,
|
|
21
|
+
sessionId: options.sessionId,
|
|
22
|
+
phase: "requested",
|
|
23
|
+
executable: options.executable,
|
|
24
|
+
arguments: options.arguments,
|
|
25
|
+
});
|
|
26
|
+
if (options.signal?.aborted)
|
|
27
|
+
throw new Error("Guardian execution authorization expired before start.");
|
|
28
|
+
const leaseFile = options.lease === undefined ? undefined : resolvePath(options.dataDirectory, `guardian-lease-${randomUUID()}.json`);
|
|
29
|
+
const relays = new Map();
|
|
30
|
+
let leaseCreated = false;
|
|
31
|
+
try {
|
|
32
|
+
if (leaseFile !== undefined) {
|
|
33
|
+
const bootstrap = JSON.stringify(options.lease);
|
|
34
|
+
if (Buffer.byteLength(bootstrap) > 128 << 10)
|
|
35
|
+
throw new Error("Guardian native lease bootstrap exceeds its limit.");
|
|
36
|
+
const file = await open(leaseFile, "wx", 0o600);
|
|
37
|
+
leaseCreated = true;
|
|
38
|
+
try {
|
|
39
|
+
await file.writeFile(bootstrap);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
await file.close();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return await new Promise((resolve, reject) => {
|
|
46
|
+
const child = spawn(runner, ["--sha256", options.manifest.executable_digest, "--cwd", options.manifest.working_directory, "--cgroup-root", options.manifest.cgroup_root, "--sandbox", options.manifest.sandbox, "--lease-config", leaseFile ?? "",
|
|
47
|
+
"--", options.manifest.executable, ...options.manifest.arguments], {
|
|
48
|
+
shell: false,
|
|
49
|
+
windowsHide: true,
|
|
50
|
+
cwd: options.manifest.working_directory,
|
|
51
|
+
env: options.environment,
|
|
52
|
+
stdio: ["inherit", "pipe", "pipe"],
|
|
53
|
+
});
|
|
54
|
+
const terminate = () => { child.kill("SIGTERM"); };
|
|
55
|
+
options.signal?.addEventListener("abort", terminate, { once: true });
|
|
56
|
+
if (options.signal?.aborted)
|
|
57
|
+
terminate();
|
|
58
|
+
process.once("SIGINT", terminate);
|
|
59
|
+
process.once("SIGTERM", terminate);
|
|
60
|
+
const detach = () => {
|
|
61
|
+
options.signal?.removeEventListener("abort", terminate);
|
|
62
|
+
process.removeListener("SIGINT", terminate);
|
|
63
|
+
process.removeListener("SIGTERM", terminate);
|
|
64
|
+
};
|
|
65
|
+
const stdoutDecoder = new StringDecoder("utf8");
|
|
66
|
+
const stderrDecoder = new StringDecoder("utf8");
|
|
67
|
+
let writes = Promise.resolve();
|
|
68
|
+
let closed = false;
|
|
69
|
+
const mirrorAbort = new AbortController();
|
|
70
|
+
let mirrorDeadline;
|
|
71
|
+
child.once("exit", () => {
|
|
72
|
+
// Preserve normal output, but a stalled terminal cannot prevent final
|
|
73
|
+
// audit/exit handling after the native process has already stopped.
|
|
74
|
+
mirrorDeadline = setTimeout(() => mirrorAbort.abort(), 1_000);
|
|
75
|
+
});
|
|
76
|
+
const record = (stream, output, raw) => {
|
|
77
|
+
if (output === "" && raw === undefined)
|
|
78
|
+
return;
|
|
79
|
+
child.stdout?.pause();
|
|
80
|
+
child.stderr?.pause();
|
|
81
|
+
const batch = writes.then(async () => {
|
|
82
|
+
for (let offset = 0; offset < output.length; offset += 8_192) {
|
|
83
|
+
await journal.append({
|
|
84
|
+
invocationId,
|
|
85
|
+
agentId: options.agentId,
|
|
86
|
+
sessionId: options.sessionId,
|
|
87
|
+
phase: "running",
|
|
88
|
+
executable: options.executable,
|
|
89
|
+
arguments: options.arguments,
|
|
90
|
+
stream,
|
|
91
|
+
output: output.slice(offset, offset + 8_192),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (raw !== undefined && !mirrorAbort.signal.aborted) {
|
|
95
|
+
let relay = relays.get(stream);
|
|
96
|
+
if (!relay) {
|
|
97
|
+
relay = outputRelay(runner, stream === "stdout" ? process.stdout.fd : process.stderr.fd, options.dataDirectory, options.environment);
|
|
98
|
+
relays.set(stream, relay);
|
|
99
|
+
}
|
|
100
|
+
await relay.write(raw, mirrorAbort.signal);
|
|
101
|
+
}
|
|
102
|
+
}).then(() => {
|
|
103
|
+
// Resume only after the whole current queue, not its first 8 KiB.
|
|
104
|
+
if (writes === batch) {
|
|
105
|
+
child.stdout?.resume();
|
|
106
|
+
child.stderr?.resume();
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
writes = batch;
|
|
110
|
+
void batch.catch(() => { terminate(); mirrorAbort.abort(); child.stdout?.resume(); child.stderr?.resume(); });
|
|
111
|
+
};
|
|
112
|
+
child.stdout?.on("data", (chunk) => {
|
|
113
|
+
record("stdout", stdoutDecoder.write(chunk), chunk);
|
|
114
|
+
});
|
|
115
|
+
child.stderr?.on("data", (chunk) => {
|
|
116
|
+
record("stderr", stderrDecoder.write(chunk), chunk);
|
|
117
|
+
});
|
|
118
|
+
child.once("error", (error) => {
|
|
119
|
+
if (closed)
|
|
120
|
+
return;
|
|
121
|
+
closed = true;
|
|
122
|
+
detach();
|
|
123
|
+
mirrorAbort.abort();
|
|
124
|
+
writes.then(() => journal.append({
|
|
125
|
+
invocationId,
|
|
126
|
+
agentId: options.agentId,
|
|
127
|
+
sessionId: options.sessionId,
|
|
128
|
+
phase: "failed",
|
|
129
|
+
executable: options.executable,
|
|
130
|
+
arguments: options.arguments,
|
|
131
|
+
output: safeExecutionError(error),
|
|
132
|
+
exitCode: 1,
|
|
133
|
+
})).then(() => reject(error), reject).finally(() => clearTimeout(mirrorDeadline));
|
|
134
|
+
});
|
|
135
|
+
child.once("close", (code, signal) => {
|
|
136
|
+
if (closed)
|
|
137
|
+
return;
|
|
138
|
+
closed = true;
|
|
139
|
+
detach();
|
|
140
|
+
record("stdout", stdoutDecoder.end());
|
|
141
|
+
record("stderr", stderrDecoder.end());
|
|
142
|
+
const exitCode = options.signal?.aborted ? 77 : code ?? 1;
|
|
143
|
+
writes.then(() => journal.append({
|
|
144
|
+
invocationId,
|
|
145
|
+
agentId: options.agentId,
|
|
146
|
+
sessionId: options.sessionId,
|
|
147
|
+
phase: exitCode === 0 ? "succeeded" : "failed",
|
|
148
|
+
executable: options.executable,
|
|
149
|
+
arguments: options.arguments,
|
|
150
|
+
...(signal === null ? {} : { output: `Process exited after ${signal}.` }),
|
|
151
|
+
exitCode,
|
|
152
|
+
})).then(() => resolve({ exitCode, invocationId }), reject).finally(() => clearTimeout(mirrorDeadline));
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
for (const relay of relays.values())
|
|
158
|
+
relay.process.stdin?.end();
|
|
159
|
+
const deadline = setTimeout(() => { for (const relay of relays.values())
|
|
160
|
+
relay.process.kill("SIGKILL"); }, 1_000);
|
|
161
|
+
try {
|
|
162
|
+
await Promise.all([...relays.values()].map((relay) => relay.closed));
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
clearTimeout(deadline);
|
|
166
|
+
}
|
|
167
|
+
if (leaseFile !== undefined && leaseCreated) {
|
|
168
|
+
await unlink(leaseFile).catch((error) => { if (error.code !== "ENOENT")
|
|
169
|
+
throw error; });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Native relays isolate blocking console IO. Child stdin is an asynchronous
|
|
174
|
+
// IPC stream, so its backpressure can be cancelled without blocking Node or
|
|
175
|
+
// occupying its shared filesystem/DNS thread pool.
|
|
176
|
+
function outputRelay(runner, fd, cwd, environment) {
|
|
177
|
+
const child = spawn(runner, ["__relay"], { cwd, env: environment, windowsHide: true, stdio: ["pipe", fd, "ignore"] });
|
|
178
|
+
child.stdin?.on("error", () => { });
|
|
179
|
+
const closed = new Promise((resolve) => { child.once("exit", () => resolve()); child.once("error", () => resolve()); });
|
|
180
|
+
return { process: child, closed, write: async (data, signal) => {
|
|
181
|
+
if (signal.aborted)
|
|
182
|
+
return;
|
|
183
|
+
const pending = new Promise((resolve, reject) => {
|
|
184
|
+
if (!child.stdin) {
|
|
185
|
+
reject(new Error("Guardian output relay unavailable."));
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
child.stdin.write(data, (error) => error ? reject(error) : resolve());
|
|
189
|
+
});
|
|
190
|
+
await waitForTerminal(pending, signal);
|
|
191
|
+
} };
|
|
192
|
+
}
|
|
193
|
+
async function waitForTerminal(pending, signal) {
|
|
194
|
+
if (signal.aborted)
|
|
195
|
+
return;
|
|
196
|
+
let abort = () => { };
|
|
197
|
+
const cancelled = new Promise((resolve) => { abort = resolve; signal.addEventListener("abort", abort, { once: true }); });
|
|
198
|
+
try {
|
|
199
|
+
await Promise.race([pending, cancelled]);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
signal.removeEventListener("abort", abort);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
class ManagedCommandJournal {
|
|
206
|
+
#dataDirectory;
|
|
207
|
+
constructor(dataDirectory) {
|
|
208
|
+
this.#dataDirectory = dataDirectory;
|
|
209
|
+
}
|
|
210
|
+
async append(record) {
|
|
211
|
+
const directory = join(this.#dataDirectory, "bridges", "generic");
|
|
212
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
213
|
+
await chmod(this.#dataDirectory, 0o700);
|
|
214
|
+
await chmod(join(this.#dataDirectory, "bridges"), 0o700);
|
|
215
|
+
await chmod(directory, 0o700);
|
|
216
|
+
const path = join(directory, "guardian-managed-commands.jsonl");
|
|
217
|
+
const encoded = JSON.stringify({
|
|
218
|
+
type: "phigon_managed_command",
|
|
219
|
+
timestamp: new Date().toISOString(),
|
|
220
|
+
session_id: record.sessionId,
|
|
221
|
+
agent_id: record.agentId,
|
|
222
|
+
invocation_id: record.invocationId,
|
|
223
|
+
phase: record.phase,
|
|
224
|
+
executable: record.executable,
|
|
225
|
+
arguments: record.arguments,
|
|
226
|
+
stream: record.stream ?? "",
|
|
227
|
+
output: record.output ?? "",
|
|
228
|
+
exit_code: record.exitCode ?? null,
|
|
229
|
+
});
|
|
230
|
+
if (Buffer.byteLength(encoded, "utf8") > 96 << 10) {
|
|
231
|
+
throw new Error("Managed command telemetry chunk exceeded 96 KiB.");
|
|
232
|
+
}
|
|
233
|
+
const handle = await open(path, "a", 0o600);
|
|
234
|
+
try {
|
|
235
|
+
await handle.write(`${encoded}\n`);
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
await handle.close();
|
|
239
|
+
}
|
|
240
|
+
await chmod(path, 0o600);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function safeExecutionError(error) {
|
|
244
|
+
const code = error instanceof Error && "code" in error
|
|
245
|
+
? String(error.code ?? "unknown")
|
|
246
|
+
: "unknown";
|
|
247
|
+
return `Managed executable could not start (${code.slice(0, 32)}).`;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=guardian-managed-exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian-managed-exec.js","sourceRoot":"","sources":["../../src/guardian-managed-exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function startGuardianModelBridge(options: Readonly<{
|
|
2
|
+
controlPlaneURL: URL;
|
|
3
|
+
credential: string;
|
|
4
|
+
agentId: string;
|
|
5
|
+
provider: string;
|
|
6
|
+
fetcher?: typeof fetch;
|
|
7
|
+
maxConcurrentRequests?: number;
|
|
8
|
+
}>): Promise<Readonly<{
|
|
9
|
+
baseURL: string;
|
|
10
|
+
token: string;
|
|
11
|
+
close: () => Promise<void>;
|
|
12
|
+
}>>;
|
|
13
|
+
//# sourceMappingURL=guardian-model-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian-model-bridge.d.ts","sourceRoot":"","sources":["../../src/guardian-model-bridge.ts"],"names":[],"mappings":"AAIA,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC/D,eAAe,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAC5E,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAAC,CAyDrF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { randomBytes, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { once } from "node:events";
|
|
4
|
+
export async function startGuardianModelBridge(options) {
|
|
5
|
+
const token = randomBytes(32).toString("hex");
|
|
6
|
+
const maximum = options.maxConcurrentRequests ?? 8;
|
|
7
|
+
if (!Number.isInteger(maximum) || maximum < 1 || maximum > 64)
|
|
8
|
+
throw new Error("Invalid model bridge concurrency limit.");
|
|
9
|
+
const requests = new Set();
|
|
10
|
+
const server = createServer({ connectionsCheckingInterval: 1_000 }, (request, response) => {
|
|
11
|
+
void (async () => {
|
|
12
|
+
const presented = request.headers.authorization?.replace(/^Bearer /u, "") ?? request.headers["x-api-key"];
|
|
13
|
+
const supplied = typeof presented === "string" ? Buffer.from(presented) : Buffer.alloc(0);
|
|
14
|
+
if (request.method !== "POST" || request.headers.origin !== undefined || supplied.length !== token.length || !timingSafeEqual(supplied, Buffer.from(token)) ||
|
|
15
|
+
!["/v1/chat/completions", "/v1/responses", "/v1/embeddings", "/v1/messages"].includes(request.url ?? "")) {
|
|
16
|
+
response.writeHead(403, { Connection: "close" });
|
|
17
|
+
response.end("Phigon Guardian: model gateway access denied.");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Admission starts before body buffering. Slow uploads consume a slot too.
|
|
21
|
+
if (requests.size >= maximum) {
|
|
22
|
+
response.writeHead(429, { "Content-Type": "application/json", "Retry-After": "1", Connection: "close" });
|
|
23
|
+
response.end(JSON.stringify({ error: { code: "phigon_guardian_capacity", message: "Phigon Guardian model bridge is busy. Try again shortly." } }));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
requests.add(controller);
|
|
28
|
+
response.once("close", () => controller.abort());
|
|
29
|
+
try {
|
|
30
|
+
const chunks = [];
|
|
31
|
+
let size = 0;
|
|
32
|
+
for await (const chunk of request) {
|
|
33
|
+
const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
34
|
+
size += data.length;
|
|
35
|
+
if (size > 1 << 20) {
|
|
36
|
+
response.writeHead(413, { Connection: "close" });
|
|
37
|
+
response.end();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
chunks.push(data);
|
|
41
|
+
}
|
|
42
|
+
if (controller.signal.aborted)
|
|
43
|
+
return;
|
|
44
|
+
const upstream = await (options.fetcher ?? fetch)(new URL(`/v1/machine/guardian/models/${options.provider}${request.url}`, options.controlPlaneURL), {
|
|
45
|
+
method: "POST", redirect: "error", headers: { Authorization: `Bearer ${options.credential}`, "Content-Type": "application/json", "X-Phigon-Agent-ID": options.agentId },
|
|
46
|
+
body: Buffer.concat(chunks), signal: AbortSignal.any([controller.signal, AbortSignal.timeout(370_000)]),
|
|
47
|
+
});
|
|
48
|
+
response.writeHead(upstream.status, { "Content-Type": upstream.headers.get("content-type") ?? "application/json", "Cache-Control": "no-store" });
|
|
49
|
+
if (upstream.body)
|
|
50
|
+
for await (const chunk of upstream.body) {
|
|
51
|
+
if (!response.write(chunk))
|
|
52
|
+
await once(response, "drain", { signal: controller.signal });
|
|
53
|
+
}
|
|
54
|
+
response.end();
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
requests.delete(controller);
|
|
58
|
+
controller.abort();
|
|
59
|
+
}
|
|
60
|
+
})().catch(() => {
|
|
61
|
+
if (response.headersSent) {
|
|
62
|
+
response.destroy();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
response.writeHead(503, { "Content-Type": "application/json", Connection: "close" });
|
|
66
|
+
response.end(JSON.stringify({ error: { code: "phigon_guardian_unavailable", message: "Phigon Guardian blocked the model request because enforcement is unavailable." } }));
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
server.requestTimeout = 15_000;
|
|
70
|
+
server.headersTimeout = 10_000;
|
|
71
|
+
server.maxConnections = maximum * 4;
|
|
72
|
+
let closing;
|
|
73
|
+
await new Promise((resolve, reject) => { server.once("error", reject); server.listen(0, "127.0.0.1", resolve); });
|
|
74
|
+
const address = server.address();
|
|
75
|
+
if (address === null || typeof address === "string")
|
|
76
|
+
throw new Error("Guardian model bridge did not bind.");
|
|
77
|
+
return { baseURL: `http://127.0.0.1:${address.port}/v1`, token, close: () => {
|
|
78
|
+
if (closing)
|
|
79
|
+
return closing;
|
|
80
|
+
for (const controller of requests)
|
|
81
|
+
controller.abort();
|
|
82
|
+
server.closeAllConnections();
|
|
83
|
+
closing = new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
|
|
84
|
+
return closing;
|
|
85
|
+
} };
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=guardian-model-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian-model-bridge.js","sourceRoot":"","sources":["../../src/guardian-model-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian-native.d.ts","sourceRoot":"","sources":["../../src/guardian-native.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,IAAI,MAAM,CAI3C;AACD,wBAAsB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
export function guardianRunnerPath() {
|
|
4
|
+
const os = process.platform === "win32" ? "windows" : process.platform;
|
|
5
|
+
const arch = process.arch === "x64" ? "amd64" : process.arch;
|
|
6
|
+
return fileURLToPath(new URL(`../bin/guardian-runner-${os}-${arch}${os === "windows" ? ".exe" : ""}`, import.meta.url));
|
|
7
|
+
}
|
|
8
|
+
export async function killVerifiedWindowsProcess(processId, startedAt) {
|
|
9
|
+
await new Promise((resolve, reject) => execFile(guardianRunnerPath(), ["--kill-pid", String(processId), "--started-at", startedAt], {
|
|
10
|
+
windowsHide: true, timeout: 8_000, maxBuffer: 4096,
|
|
11
|
+
}, (error) => error ? reject(error) : resolve()));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=guardian-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardian-native.js","sourceRoot":"","sources":["../../src/guardian-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,kBAAkB;IAChC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACvE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7D,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,IAAI,IAAI,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1H,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,SAAiB,EAAE,SAAiB;IACnF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE;QACxI,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI;KACnD,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC"}
|