@rivet-dev/agentos-core 0.0.0-codex-agentos-native-platform-e2e.78ef941 → 0.0.0-glibc.4af31c1
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 +4 -7
- package/dist/agent-os.d.ts +150 -45
- package/dist/agent-os.js +769 -541
- package/dist/agentos-package.d.ts +29 -0
- package/dist/agentos-package.js +88 -0
- package/dist/base-filesystem.d.ts +2 -15
- package/dist/base-filesystem.js +23 -171
- package/dist/cron/types.d.ts +1 -1
- package/dist/default-software.d.ts +8 -0
- package/dist/default-software.js +10 -0
- package/dist/generated/AcpLimitsConfig.d.ts +4 -0
- package/dist/generated/AcpLimitsConfig.js +2 -0
- package/dist/generated/CreateVmConfig.d.ts +26 -0
- package/dist/generated/CreateVmConfig.js +1 -0
- package/dist/generated/FsPermissionRule.d.ts +6 -0
- package/dist/generated/FsPermissionRule.js +1 -0
- package/dist/generated/FsPermissionRuleSet.d.ts +6 -0
- package/dist/generated/FsPermissionRuleSet.js +1 -0
- package/dist/generated/FsPermissionScope.d.ts +3 -0
- package/dist/generated/FsPermissionScope.js +1 -0
- package/dist/generated/HttpLimitsConfig.d.ts +3 -0
- package/dist/generated/HttpLimitsConfig.js +2 -0
- package/dist/generated/JsModuleResolution.d.ts +1 -0
- package/dist/generated/JsModuleResolution.js +2 -0
- package/dist/generated/JsRuntimeConfig.d.ts +31 -0
- package/dist/generated/JsRuntimeConfig.js +1 -0
- package/dist/generated/JsRuntimeLimitsConfig.d.ts +11 -0
- package/dist/generated/JsRuntimeLimitsConfig.js +2 -0
- package/dist/generated/JsRuntimePlatform.d.ts +1 -0
- package/dist/generated/JsRuntimePlatform.js +2 -0
- package/dist/generated/MountPluginDescriptor.d.ts +4 -0
- package/dist/generated/MountPluginDescriptor.js +2 -0
- package/dist/generated/NativeRootFilesystemConfig.d.ts +5 -0
- package/dist/generated/NativeRootFilesystemConfig.js +1 -0
- package/dist/generated/PatternPermissionRule.d.ts +6 -0
- package/dist/generated/PatternPermissionRule.js +1 -0
- package/dist/generated/PatternPermissionRuleSet.d.ts +6 -0
- package/dist/generated/PatternPermissionRuleSet.js +1 -0
- package/dist/generated/PatternPermissionScope.d.ts +3 -0
- package/dist/generated/PatternPermissionScope.js +1 -0
- package/dist/generated/PermissionMode.d.ts +1 -0
- package/dist/generated/PermissionMode.js +2 -0
- package/dist/generated/PermissionsPolicy.d.ts +10 -0
- package/dist/generated/PermissionsPolicy.js +1 -0
- package/dist/generated/PluginLimitsConfig.d.ts +4 -0
- package/dist/generated/PluginLimitsConfig.js +2 -0
- package/dist/generated/PythonLimitsConfig.d.ts +6 -0
- package/dist/generated/PythonLimitsConfig.js +2 -0
- package/dist/generated/ResourceLimitsConfig.d.ts +24 -0
- package/dist/generated/ResourceLimitsConfig.js +2 -0
- package/dist/generated/RootFilesystemConfig.d.ts +9 -0
- package/dist/generated/RootFilesystemConfig.js +1 -0
- package/dist/generated/RootFilesystemEntry.d.ts +13 -0
- package/dist/generated/RootFilesystemEntry.js +1 -0
- package/dist/generated/RootFilesystemEntryEncoding.d.ts +1 -0
- package/dist/generated/RootFilesystemEntryEncoding.js +2 -0
- package/dist/generated/RootFilesystemEntryKind.d.ts +1 -0
- package/dist/generated/RootFilesystemEntryKind.js +2 -0
- package/dist/generated/RootFilesystemLowerDescriptor.d.ts +7 -0
- package/dist/generated/RootFilesystemLowerDescriptor.js +1 -0
- package/dist/generated/RootFilesystemMode.d.ts +1 -0
- package/dist/generated/RootFilesystemMode.js +2 -0
- package/dist/generated/ToolLimitsConfig.d.ts +10 -0
- package/dist/generated/ToolLimitsConfig.js +2 -0
- package/dist/generated/VmDnsConfig.d.ts +6 -0
- package/dist/generated/VmDnsConfig.js +2 -0
- package/dist/generated/VmLimitsConfig.d.ts +18 -0
- package/dist/generated/VmLimitsConfig.js +1 -0
- package/dist/generated/VmListenPolicyConfig.d.ts +5 -0
- package/dist/generated/VmListenPolicyConfig.js +2 -0
- package/dist/generated/WasmLimitsConfig.d.ts +7 -0
- package/dist/generated/WasmLimitsConfig.js +2 -0
- package/dist/host-dir-mount.d.ts +1 -1
- package/dist/host-tools-zod.js +27 -7
- package/dist/host-tools.js +9 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/layers.d.ts +2 -2
- package/dist/layers.js +19 -10
- package/dist/options-schema.d.ts +453 -0
- package/dist/options-schema.js +268 -0
- package/dist/packages.d.ts +17 -116
- package/dist/packages.js +35 -322
- package/dist/runtime-compat.d.ts +22 -9
- package/dist/runtime-compat.js +126 -141
- package/dist/runtime.d.ts +32 -5
- package/dist/sandbox.d.ts +112 -0
- package/dist/sandbox.js +264 -0
- package/dist/sidecar/agentos-protocol.d.ts +88 -1
- package/dist/sidecar/agentos-protocol.js +134 -18
- package/dist/sidecar/native-process-client.d.ts +6 -3
- package/dist/sidecar/native-process-client.js +5 -3
- package/dist/sidecar/permissions.d.ts +1 -1
- package/dist/sidecar/permissions.js +3 -3
- package/dist/sidecar/rpc-client.d.ts +62 -4
- package/dist/sidecar/rpc-client.js +339 -85
- package/dist/types.d.ts +10 -3
- package/package.json +40 -34
- package/dist/agents.d.ts +0 -63
- package/dist/agents.js +0 -42
- package/fixtures/AGENTOS_SYSTEM_PROMPT.md +0 -21
package/dist/packages.js
CHANGED
|
@@ -1,335 +1,48 @@
|
|
|
1
|
-
import { existsSync, readFileSync,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
/**
|
|
5
|
-
* Resolve a package directory by walking up the directory tree.
|
|
6
|
-
* Supports both nested (pnpm) and flat (npm) node_modules layouts.
|
|
7
|
-
*/
|
|
8
|
-
export function resolvePackageDir(startDir, packageName) {
|
|
9
|
-
const localPkgJson = join(startDir, "package.json");
|
|
10
|
-
if (existsSync(localPkgJson)) {
|
|
11
|
-
try {
|
|
12
|
-
const localPkg = JSON.parse(readFileSync(localPkgJson, "utf-8"));
|
|
13
|
-
if (localPkg.name === packageName) {
|
|
14
|
-
return realpathSync(startDir);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
// Ignore malformed local package metadata and continue walking.
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
let searchDir = startDir;
|
|
22
|
-
while (true) {
|
|
23
|
-
const candidate = join(searchDir, "node_modules", packageName);
|
|
24
|
-
if (existsSync(join(candidate, "package.json"))) {
|
|
25
|
-
return realpathSync(candidate);
|
|
26
|
-
}
|
|
27
|
-
const parent = dirname(searchDir);
|
|
28
|
-
if (parent === searchDir)
|
|
29
|
-
break;
|
|
30
|
-
searchDir = parent;
|
|
31
|
-
}
|
|
32
|
-
throw new Error(`Package "${packageName}" not found starting from ${startDir}. ` +
|
|
33
|
-
`Ensure it is installed.`);
|
|
34
|
-
}
|
|
35
|
-
const LOCAL_REGISTRY_COMMAND_DIR = resolve(dirname(fileURLToPath(import.meta.url)), "../../..", "registry/native/target/wasm32-wasip1/release/commands");
|
|
36
|
-
function readPackageName(packageDir) {
|
|
37
|
-
const pkg = JSON.parse(readFileSync(join(packageDir, "package.json"), "utf-8"));
|
|
38
|
-
if (typeof pkg.name !== "string" || pkg.name.length === 0) {
|
|
39
|
-
throw new Error(`Package at ${packageDir} is missing a valid name`);
|
|
40
|
-
}
|
|
41
|
-
return pkg.name;
|
|
42
|
-
}
|
|
43
|
-
function pushSoftwareRoot(softwareRoots, seenVmPaths, hostPath, vmPath) {
|
|
44
|
-
if (seenVmPaths.has(vmPath)) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
seenVmPaths.add(vmPath);
|
|
48
|
-
softwareRoots.push({ hostPath, vmPath });
|
|
49
|
-
}
|
|
50
|
-
function findPnpmStoreRoot(hostPath) {
|
|
51
|
-
const marker = `${sep}node_modules${sep}.pnpm${sep}`;
|
|
52
|
-
const markerIndex = hostPath.indexOf(marker);
|
|
53
|
-
if (markerIndex === -1) {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
const nodeModulesRoot = `${hostPath.slice(0, markerIndex)}${sep}node_modules`;
|
|
57
|
-
const pnpmStoreRoot = join(nodeModulesRoot, ".pnpm");
|
|
58
|
-
return existsSync(pnpmStoreRoot) ? pnpmStoreRoot : null;
|
|
59
|
-
}
|
|
60
|
-
function pushPackageSoftwareRoot(softwareRoots, seenVmPaths, hostPath, vmPath) {
|
|
61
|
-
pushSoftwareRoot(softwareRoots, seenVmPaths, hostPath, vmPath);
|
|
62
|
-
const pnpmStoreRoot = findPnpmStoreRoot(hostPath);
|
|
63
|
-
if (!pnpmStoreRoot) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
pushSoftwareRoot(softwareRoots, seenVmPaths, pnpmStoreRoot, "/root/node_modules/.pnpm");
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Create a SoftwareContext for a software descriptor.
|
|
70
|
-
* Resolves npm package paths relative to the descriptor's packageDir.
|
|
71
|
-
*/
|
|
72
|
-
function createSoftwareContext(packageDir, requires) {
|
|
73
|
-
// Pre-resolve all required packages to host paths
|
|
74
|
-
const resolvedPackages = new Map();
|
|
75
|
-
for (const reqPkg of requires) {
|
|
76
|
-
const hostDir = resolvePackageDir(packageDir, reqPkg);
|
|
77
|
-
const pkg = JSON.parse(readFileSync(join(hostDir, "package.json"), "utf-8"));
|
|
78
|
-
const vmDir = `/root/node_modules/${reqPkg}`;
|
|
79
|
-
resolvedPackages.set(reqPkg, { hostDir, vmDir, pkg });
|
|
80
|
-
}
|
|
81
|
-
return {
|
|
82
|
-
resolveBin(packageName, binName) {
|
|
83
|
-
const resolved = resolvedPackages.get(packageName);
|
|
84
|
-
if (!resolved) {
|
|
85
|
-
throw new Error(`Package "${packageName}" is not in the requires list. ` +
|
|
86
|
-
`Available: ${[...resolvedPackages.keys()].join(", ")}`);
|
|
87
|
-
}
|
|
88
|
-
const { pkg, vmDir } = resolved;
|
|
89
|
-
let binEntry;
|
|
90
|
-
const effectiveBinName = binName ?? packageName;
|
|
91
|
-
if (typeof pkg.bin === "string") {
|
|
92
|
-
binEntry = pkg.bin;
|
|
93
|
-
}
|
|
94
|
-
else if (typeof pkg.bin === "object" && pkg.bin !== null) {
|
|
95
|
-
const binMap = pkg.bin;
|
|
96
|
-
binEntry = binMap[effectiveBinName] ?? Object.values(binMap)[0];
|
|
97
|
-
}
|
|
98
|
-
if (!binEntry) {
|
|
99
|
-
throw new Error(`No bin entry "${effectiveBinName}" found in ${packageName}/package.json`);
|
|
100
|
-
}
|
|
101
|
-
return `${vmDir}/${binEntry}`;
|
|
102
|
-
},
|
|
103
|
-
resolvePackage(packageName) {
|
|
104
|
-
const resolved = resolvedPackages.get(packageName);
|
|
105
|
-
if (!resolved) {
|
|
106
|
-
throw new Error(`Package "${packageName}" is not in the requires list. ` +
|
|
107
|
-
`Available: ${[...resolvedPackages.keys()].join(", ")}`);
|
|
108
|
-
}
|
|
109
|
-
return resolved.vmDir;
|
|
110
|
-
},
|
|
111
|
-
};
|
|
112
|
-
}
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { tryReadAgentosPackageManifest } from "./agentos-package.js";
|
|
113
4
|
// ── defineSoftware ───────────────────────────────────────────────────
|
|
114
5
|
/**
|
|
115
|
-
* Define a software descriptor.
|
|
116
|
-
*
|
|
6
|
+
* Define a software descriptor. A type-safe identity function that validates the
|
|
7
|
+
* package-dir reference at compile time. The sidecar materializes the package into
|
|
8
|
+
* the `/opt/agentos` projection.
|
|
117
9
|
*/
|
|
118
10
|
export function defineSoftware(desc) {
|
|
119
11
|
return desc;
|
|
120
12
|
}
|
|
121
|
-
/**
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
commandPermissions[commandName] = tier;
|
|
139
|
-
}
|
|
140
|
-
function appendDeclaredCommand(declaredCommands, seen, commandName) {
|
|
141
|
-
if (typeof commandName !== "string" || seen.has(commandName)) {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
seen.add(commandName);
|
|
145
|
-
declaredCommands.push(commandName);
|
|
146
|
-
}
|
|
147
|
-
function collectCommandMetadata(pkg) {
|
|
148
|
-
const declaredCommands = [];
|
|
149
|
-
const seen = new Set();
|
|
150
|
-
const aliases = {};
|
|
151
|
-
if ("aliases" in pkg && pkg.aliases) {
|
|
152
|
-
for (const [aliasName, targetName] of Object.entries(pkg.aliases)) {
|
|
153
|
-
if (typeof targetName !== "string") {
|
|
154
|
-
continue;
|
|
155
|
-
}
|
|
156
|
-
aliases[aliasName] = targetName;
|
|
157
|
-
appendDeclaredCommand(declaredCommands, seen, aliasName);
|
|
158
|
-
appendDeclaredCommand(declaredCommands, seen, targetName);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
const rawCommands = pkg.commands;
|
|
162
|
-
if (Array.isArray(rawCommands)) {
|
|
163
|
-
for (const rawCommand of rawCommands) {
|
|
164
|
-
if (typeof rawCommand !== "object" || rawCommand === null) {
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
const name = rawCommand.name;
|
|
168
|
-
const aliasOf = rawCommand.aliasOf;
|
|
169
|
-
appendDeclaredCommand(declaredCommands, seen, name);
|
|
170
|
-
appendDeclaredCommand(declaredCommands, seen, aliasOf);
|
|
171
|
-
if (typeof name === "string" && typeof aliasOf === "string") {
|
|
172
|
-
aliases[name] = aliasOf;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
const permissions = pkg.permissions;
|
|
177
|
-
if (permissions) {
|
|
178
|
-
for (const commandName of permissions.full ?? []) {
|
|
179
|
-
appendDeclaredCommand(declaredCommands, seen, commandName);
|
|
180
|
-
}
|
|
181
|
-
for (const commandName of permissions.readWrite ?? []) {
|
|
182
|
-
appendDeclaredCommand(declaredCommands, seen, commandName);
|
|
183
|
-
}
|
|
184
|
-
if (Array.isArray(permissions.readOnly)) {
|
|
185
|
-
for (const commandName of permissions.readOnly) {
|
|
186
|
-
appendDeclaredCommand(declaredCommands, seen, commandName);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
for (const commandName of permissions.isolated ?? []) {
|
|
190
|
-
appendDeclaredCommand(declaredCommands, seen, commandName);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
const commandDir = resolveLocalCommandDirFallback(pkg.commandDir, declaredCommands);
|
|
194
|
-
return {
|
|
195
|
-
commandDir,
|
|
196
|
-
declaredCommands,
|
|
197
|
-
aliases,
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
function hasUsableCommandDir(commandDir, declaredCommands) {
|
|
201
|
-
if (!existsSync(commandDir)) {
|
|
202
|
-
return false;
|
|
203
|
-
}
|
|
204
|
-
return declaredCommands.every((commandName) => existsSync(join(commandDir, commandName)));
|
|
205
|
-
}
|
|
206
|
-
function resolveLocalCommandDirFallback(commandDir, declaredCommands) {
|
|
207
|
-
if (declaredCommands.length === 0 ||
|
|
208
|
-
hasUsableCommandDir(commandDir, declaredCommands) ||
|
|
209
|
-
!hasUsableCommandDir(LOCAL_REGISTRY_COMMAND_DIR, declaredCommands)) {
|
|
210
|
-
return commandDir;
|
|
211
|
-
}
|
|
212
|
-
return LOCAL_REGISTRY_COMMAND_DIR;
|
|
213
|
-
}
|
|
214
|
-
function collectRegistryPackagePermissions(commandPermissions, pkg) {
|
|
215
|
-
const rawCommands = pkg.commands;
|
|
216
|
-
if (!Array.isArray(rawCommands))
|
|
217
|
-
return;
|
|
218
|
-
for (const rawCommand of rawCommands) {
|
|
219
|
-
if (typeof rawCommand !== "object" ||
|
|
220
|
-
rawCommand === null ||
|
|
221
|
-
!Object.hasOwn(rawCommand, "name") ||
|
|
222
|
-
!Object.hasOwn(rawCommand, "permissionTier")) {
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the agent-SDK snapshot bundle (an esbuild IIFE at
|
|
15
|
+
* `<dir>/dist/sdk-snapshot.js`) for the first snapshot-enabled agent package in
|
|
16
|
+
* the software set. Returns its source so it can be evaluated once into the
|
|
17
|
+
* per-sidecar V8 startup snapshot (`jsRuntime.snapshotUserlandCode`) and reused
|
|
18
|
+
* across sessions. Returns `undefined` when no agent opts in (`agent.snapshot`)
|
|
19
|
+
* or the bundle is absent -- the runtime then keeps the per-session import path.
|
|
20
|
+
*/
|
|
21
|
+
export function resolveAgentSnapshotBundle(software) {
|
|
22
|
+
const descriptors = software.flat();
|
|
23
|
+
for (const entry of descriptors) {
|
|
24
|
+
// Only transition package DIRS are readable host-side (their
|
|
25
|
+
// agentos-package.json is the toolchain-input manifest). Packed
|
|
26
|
+
// `.aospkg` refs carry the bundle inside the mount tar; the sidecar
|
|
27
|
+
// reads it from the packed vbare manifest's snapshotBundlePath.
|
|
28
|
+
const path = entry.packagePath;
|
|
29
|
+
if (path === undefined || !statIsDirectory(path))
|
|
223
30
|
continue;
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
const permissionTier = rawCommand
|
|
227
|
-
.permissionTier;
|
|
228
|
-
if (typeof name !== "string" || !isPermissionTier(permissionTier))
|
|
31
|
+
const manifest = tryReadAgentosPackageManifest(path);
|
|
32
|
+
if (!manifest?.agent?.snapshot)
|
|
229
33
|
continue;
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
function collectTypedDescriptorPermissions(commandPermissions, pkg) {
|
|
234
|
-
const permissions = pkg.permissions;
|
|
235
|
-
if (!permissions)
|
|
236
|
-
return;
|
|
237
|
-
for (const commandName of permissions.full ?? []) {
|
|
238
|
-
registerPermission(commandPermissions, commandName, "full");
|
|
239
|
-
}
|
|
240
|
-
for (const commandName of permissions.readWrite ?? []) {
|
|
241
|
-
registerPermission(commandPermissions, commandName, "read-write");
|
|
242
|
-
}
|
|
243
|
-
if (Array.isArray(permissions.readOnly)) {
|
|
244
|
-
for (const commandName of permissions.readOnly) {
|
|
245
|
-
registerPermission(commandPermissions, commandName, "read-only");
|
|
34
|
+
const bundlePath = join(path, "dist", "sdk-snapshot.js");
|
|
35
|
+
if (existsSync(bundlePath)) {
|
|
36
|
+
return readFileSync(bundlePath, "utf-8");
|
|
246
37
|
}
|
|
247
38
|
}
|
|
248
|
-
|
|
249
|
-
registerPermission(commandPermissions, commandName, "isolated");
|
|
250
|
-
}
|
|
39
|
+
return undefined;
|
|
251
40
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
* are processed for module mounting and agent registration.
|
|
259
|
-
*/
|
|
260
|
-
export function processSoftware(software) {
|
|
261
|
-
const commandDirs = [];
|
|
262
|
-
const commandPackages = [];
|
|
263
|
-
const commandPermissions = {};
|
|
264
|
-
const softwareRoots = [];
|
|
265
|
-
const seenSoftwareVmPaths = new Set();
|
|
266
|
-
const agentConfigs = new Map();
|
|
267
|
-
// Flatten nested arrays (meta-packages export arrays of sub-packages).
|
|
268
|
-
const flat = software.flat();
|
|
269
|
-
for (const pkg of flat) {
|
|
270
|
-
if (!isTypedDescriptor(pkg)) {
|
|
271
|
-
// Duck-typed: any object with commandDir is a WASM command source.
|
|
272
|
-
const commandMetadata = collectCommandMetadata(pkg);
|
|
273
|
-
commandDirs.push(commandMetadata.commandDir);
|
|
274
|
-
commandPackages.push(commandMetadata);
|
|
275
|
-
collectRegistryPackagePermissions(commandPermissions, pkg);
|
|
276
|
-
continue;
|
|
277
|
-
}
|
|
278
|
-
switch (pkg.type) {
|
|
279
|
-
case "wasm-commands": {
|
|
280
|
-
const commandMetadata = collectCommandMetadata(pkg);
|
|
281
|
-
commandDirs.push(commandMetadata.commandDir);
|
|
282
|
-
commandPackages.push(commandMetadata);
|
|
283
|
-
collectTypedDescriptorPermissions(commandPermissions, pkg);
|
|
284
|
-
break;
|
|
285
|
-
}
|
|
286
|
-
case "agent": {
|
|
287
|
-
// Collect module roots for all required npm packages.
|
|
288
|
-
// Walks up directory tree to support flat (npm) and nested (pnpm) layouts.
|
|
289
|
-
const ctx = createSoftwareContext(pkg.packageDir, pkg.requires);
|
|
290
|
-
const declaringPackageName = readPackageName(pkg.packageDir);
|
|
291
|
-
pushPackageSoftwareRoot(softwareRoots, seenSoftwareVmPaths, pkg.packageDir, `/root/node_modules/${declaringPackageName}`);
|
|
292
|
-
for (const reqPkg of pkg.requires) {
|
|
293
|
-
const hostDir = resolvePackageDir(pkg.packageDir, reqPkg);
|
|
294
|
-
const vmDir = `/root/node_modules/${reqPkg}`;
|
|
295
|
-
pushPackageSoftwareRoot(softwareRoots, seenSoftwareVmPaths, hostDir, vmDir);
|
|
296
|
-
}
|
|
297
|
-
// Compute static + dynamic env vars.
|
|
298
|
-
const staticEnv = pkg.agent.staticEnv ?? {};
|
|
299
|
-
const dynamicEnv = pkg.agent.env ? pkg.agent.env(ctx) : {};
|
|
300
|
-
const combinedEnv = { ...staticEnv, ...dynamicEnv };
|
|
301
|
-
// Register agent config.
|
|
302
|
-
const agentConfig = {
|
|
303
|
-
acpAdapter: pkg.agent.acpAdapter,
|
|
304
|
-
agentPackage: pkg.agent.agentPackage,
|
|
305
|
-
declaringPackageDir: pkg.packageDir,
|
|
306
|
-
launchArgs: pkg.agent.launchArgs,
|
|
307
|
-
defaultEnv: Object.keys(combinedEnv).length > 0 ? combinedEnv : undefined,
|
|
308
|
-
};
|
|
309
|
-
agentConfigs.set(pkg.agent.id, agentConfig);
|
|
310
|
-
break;
|
|
311
|
-
}
|
|
312
|
-
case "tool": {
|
|
313
|
-
// Collect module roots for all required npm packages.
|
|
314
|
-
// Walks up directory tree to support flat (npm) and nested (pnpm) layouts.
|
|
315
|
-
const declaringPackageName = readPackageName(pkg.packageDir);
|
|
316
|
-
pushPackageSoftwareRoot(softwareRoots, seenSoftwareVmPaths, pkg.packageDir, `/root/node_modules/${declaringPackageName}`);
|
|
317
|
-
for (const reqPkg of pkg.requires) {
|
|
318
|
-
const hostDir = resolvePackageDir(pkg.packageDir, reqPkg);
|
|
319
|
-
const vmDir = `/root/node_modules/${reqPkg}`;
|
|
320
|
-
pushPackageSoftwareRoot(softwareRoots, seenSoftwareVmPaths, hostDir, vmDir);
|
|
321
|
-
}
|
|
322
|
-
// Tool bin registration is handled by the caller (AgentOs.create)
|
|
323
|
-
// since it requires kernel access.
|
|
324
|
-
break;
|
|
325
|
-
}
|
|
326
|
-
}
|
|
41
|
+
function statIsDirectory(path) {
|
|
42
|
+
try {
|
|
43
|
+
return statSync(path).isDirectory();
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
327
47
|
}
|
|
328
|
-
return {
|
|
329
|
-
commandDirs,
|
|
330
|
-
commandPackages,
|
|
331
|
-
commandPermissions,
|
|
332
|
-
softwareRoots,
|
|
333
|
-
agentConfigs,
|
|
334
|
-
};
|
|
335
48
|
}
|
package/dist/runtime-compat.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NodeModulesMountConfig } from "./host-dir-mount.js";
|
|
1
2
|
export declare const AF_INET = 2;
|
|
2
3
|
export declare const AF_UNIX = 1;
|
|
3
4
|
export declare const SOCK_STREAM = 1;
|
|
@@ -81,7 +82,7 @@ export type NetworkPermissions = PermissionMode | RulePermissions<PatternPermiss
|
|
|
81
82
|
export type ChildProcessPermissions = PermissionMode | RulePermissions<PatternPermissionRule>;
|
|
82
83
|
export type ProcessPermissions = PermissionMode | RulePermissions<PatternPermissionRule>;
|
|
83
84
|
export type EnvPermissions = PermissionMode | RulePermissions<PatternPermissionRule>;
|
|
84
|
-
export type
|
|
85
|
+
export type BindingPermissions = PermissionMode | RulePermissions<PatternPermissionRule>;
|
|
85
86
|
export interface ProcessInfo {
|
|
86
87
|
pid: number;
|
|
87
88
|
ppid: number;
|
|
@@ -98,15 +99,15 @@ export interface ProcessInfo {
|
|
|
98
99
|
}
|
|
99
100
|
export interface ManagedProcess {
|
|
100
101
|
pid: number;
|
|
101
|
-
writeStdin(data: Uint8Array | string): void
|
|
102
|
-
closeStdin(): void
|
|
102
|
+
writeStdin(data: Uint8Array | string): Promise<void>;
|
|
103
|
+
closeStdin(): Promise<void>;
|
|
103
104
|
kill(signal?: number): void;
|
|
104
105
|
wait(): Promise<number>;
|
|
105
106
|
readonly exitCode: number | null;
|
|
106
107
|
}
|
|
107
108
|
export interface ShellHandle {
|
|
108
109
|
pid: number;
|
|
109
|
-
write(data: Uint8Array | string): void
|
|
110
|
+
write(data: Uint8Array | string): Promise<void>;
|
|
110
111
|
onData: ((data: Uint8Array) => void) | null;
|
|
111
112
|
resize(cols: number, rows: number): void;
|
|
112
113
|
kill(signal?: number): void;
|
|
@@ -168,7 +169,7 @@ export interface Permissions {
|
|
|
168
169
|
childProcess?: ChildProcessPermissions;
|
|
169
170
|
process?: ProcessPermissions;
|
|
170
171
|
env?: EnvPermissions;
|
|
171
|
-
|
|
172
|
+
binding?: BindingPermissions;
|
|
172
173
|
}
|
|
173
174
|
export interface ResourceBudgets {
|
|
174
175
|
maxOutputBytes?: number;
|
|
@@ -229,6 +230,7 @@ export interface SystemDriver {
|
|
|
229
230
|
network?: NetworkAdapter;
|
|
230
231
|
commandExecutor?: CommandExecutor;
|
|
231
232
|
permissions?: Permissions;
|
|
233
|
+
mounts: readonly NodeModulesMountConfig[];
|
|
232
234
|
runtime: {
|
|
233
235
|
process: ProcessConfig;
|
|
234
236
|
os: OSConfig;
|
|
@@ -263,6 +265,13 @@ export interface NodeRuntimeDriverFactory {
|
|
|
263
265
|
export interface KernelInterface {
|
|
264
266
|
vfs: VirtualFileSystem;
|
|
265
267
|
}
|
|
268
|
+
export interface KernelRecursiveDirEntry {
|
|
269
|
+
name: string;
|
|
270
|
+
path: string;
|
|
271
|
+
isDirectory: boolean;
|
|
272
|
+
isSymbolicLink: boolean;
|
|
273
|
+
size: number;
|
|
274
|
+
}
|
|
266
275
|
export interface Kernel extends KernelInterface {
|
|
267
276
|
mount(driver: KernelRuntimeDriver): Promise<void>;
|
|
268
277
|
dispose(): Promise<void>;
|
|
@@ -278,11 +287,18 @@ export interface Kernel extends KernelInterface {
|
|
|
278
287
|
writeFile(path: string, content: string | Uint8Array): Promise<void>;
|
|
279
288
|
mkdir(path: string): Promise<void>;
|
|
280
289
|
readdir(path: string): Promise<string[]>;
|
|
290
|
+
readdirRecursive(path: string, options?: {
|
|
291
|
+
maxDepth?: number;
|
|
292
|
+
}): Promise<KernelRecursiveDirEntry[]>;
|
|
281
293
|
stat(path: string): Promise<VirtualStat>;
|
|
282
294
|
exists(path: string): Promise<boolean>;
|
|
283
295
|
removeFile(path: string): Promise<void>;
|
|
284
296
|
removeDir(path: string): Promise<void>;
|
|
297
|
+
removePath(path: string, options?: {
|
|
298
|
+
recursive?: boolean;
|
|
299
|
+
}): Promise<void>;
|
|
285
300
|
rename(oldPath: string, newPath: string): Promise<void>;
|
|
301
|
+
movePath(oldPath: string, newPath: string): Promise<void>;
|
|
286
302
|
readonly commands: ReadonlyMap<string, string>;
|
|
287
303
|
readonly processes: ReadonlyMap<number, ProcessInfo>;
|
|
288
304
|
readonly env: Record<string, string>;
|
|
@@ -304,17 +320,14 @@ export interface BindingTree {
|
|
|
304
320
|
[key: string]: BindingFunction | BindingTree;
|
|
305
321
|
}
|
|
306
322
|
export type BindingFunction = (...args: unknown[]) => unknown;
|
|
307
|
-
export interface ModuleAccessOptions {
|
|
308
|
-
cwd?: string;
|
|
309
|
-
}
|
|
310
323
|
export interface NodeDriverOptions {
|
|
311
324
|
filesystem?: VirtualFileSystem;
|
|
312
325
|
networkAdapter?: NetworkAdapter;
|
|
313
326
|
commandExecutor?: CommandExecutor;
|
|
314
327
|
permissions?: Permissions;
|
|
328
|
+
mounts?: readonly NodeModulesMountConfig[];
|
|
315
329
|
processConfig?: ProcessConfig;
|
|
316
330
|
osConfig?: OSConfig;
|
|
317
|
-
moduleAccess?: ModuleAccessOptions;
|
|
318
331
|
}
|
|
319
332
|
export interface DefaultNetworkAdapterOptions {
|
|
320
333
|
loopbackExemptPorts?: number[];
|