@agent-vm/agent-vm 0.0.33 → 0.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build/gondolin-image-builder.d.ts.map +1 -1
- package/dist/build/gondolin-image-builder.js +7 -12
- package/dist/build/gondolin-image-builder.js.map +1 -1
- package/dist/cli/agent-vm-cli-support.d.ts +7 -0
- package/dist/cli/agent-vm-cli-support.d.ts.map +1 -1
- package/dist/cli/agent-vm-cli-support.js +2 -0
- package/dist/cli/agent-vm-cli-support.js.map +1 -1
- package/dist/cli/build-command.d.ts.map +1 -1
- package/dist/cli/build-command.js +15 -7
- package/dist/cli/build-command.js.map +1 -1
- package/dist/cli/commands/command-definition-support.js +1 -1
- package/dist/cli/commands/command-definition-support.js.map +1 -1
- package/dist/cli/commands/create-app.d.ts +36 -0
- package/dist/cli/commands/create-app.d.ts.map +1 -1
- package/dist/cli/commands/create-app.js +2 -0
- package/dist/cli/commands/create-app.js.map +1 -1
- package/dist/cli/commands/manual-definition.d.ts +31 -0
- package/dist/cli/commands/manual-definition.d.ts.map +1 -0
- package/dist/cli/commands/manual-definition.js +64 -0
- package/dist/cli/commands/manual-definition.js.map +1 -0
- package/dist/cli/controller-operation-commands.d.ts.map +1 -1
- package/dist/cli/controller-operation-commands.js +2 -1
- package/dist/cli/controller-operation-commands.js.map +1 -1
- package/dist/cli/init-command.d.ts.map +1 -1
- package/dist/cli/init-command.js +68 -42
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli/manual-commands.d.ts +10 -0
- package/dist/cli/manual-commands.d.ts.map +1 -0
- package/dist/cli/manual-commands.js +25 -0
- package/dist/cli/manual-commands.js.map +1 -0
- package/dist/cli/manual-templates.d.ts +12 -0
- package/dist/cli/manual-templates.d.ts.map +1 -0
- package/dist/cli/manual-templates.js +214 -0
- package/dist/cli/manual-templates.js.map +1 -0
- package/dist/config/json-config-file.d.ts +2 -0
- package/dist/config/json-config-file.d.ts.map +1 -0
- package/dist/config/json-config-file.js +32 -0
- package/dist/config/json-config-file.js.map +1 -0
- package/dist/config/system-config.d.ts.map +1 -1
- package/dist/config/system-config.js +19 -10
- package/dist/config/system-config.js.map +1 -1
- package/dist/controller/controller-runtime-types.d.ts +1 -1
- package/dist/controller/controller-runtime-types.d.ts.map +1 -1
- package/dist/controller/controller-runtime.js +2 -2
- package/dist/controller/controller-runtime.js.map +1 -1
- package/dist/controller/http/controller-http-routes.d.ts +2 -2
- package/dist/controller/http/controller-http-routes.d.ts.map +1 -1
- package/dist/controller/http/controller-http-routes.js +55 -25
- package/dist/controller/http/controller-http-routes.js.map +1 -1
- package/dist/controller/http/controller-request-schemas.d.ts +2 -2
- package/dist/controller/http/controller-request-schemas.d.ts.map +1 -1
- package/dist/controller/http/controller-request-schemas.js +2 -2
- package/dist/controller/http/controller-request-schemas.js.map +1 -1
- package/dist/controller/leases/agent-sandbox-seeding.d.ts +11 -5
- package/dist/controller/leases/agent-sandbox-seeding.d.ts.map +1 -1
- package/dist/controller/leases/agent-sandbox-seeding.js +28 -20
- package/dist/controller/leases/agent-sandbox-seeding.js.map +1 -1
- package/dist/controller/leases/lease-manager.d.ts +3 -3
- package/dist/controller/leases/lease-manager.d.ts.map +1 -1
- package/dist/controller/leases/lease-manager.js +23 -6
- package/dist/controller/leases/lease-manager.js.map +1 -1
- package/dist/controller/leases/lease-work-mount-paths.d.ts +17 -0
- package/dist/controller/leases/lease-work-mount-paths.d.ts.map +1 -0
- package/dist/controller/leases/lease-work-mount-paths.js +120 -0
- package/dist/controller/leases/lease-work-mount-paths.js.map +1 -0
- package/dist/controller/worker-task-runner.d.ts.map +1 -1
- package/dist/controller/worker-task-runner.js +32 -10
- package/dist/controller/worker-task-runner.js.map +1 -1
- package/dist/controller/zone-runtimes/zone-runtime-types.d.ts +1 -1
- package/dist/controller/zone-runtimes/zone-runtime-types.d.ts.map +1 -1
- package/dist/gateway/gateway-image-builder.d.ts.map +1 -1
- package/dist/gateway/gateway-image-builder.js +2 -2
- package/dist/gateway/gateway-image-builder.js.map +1 -1
- package/dist/tool-vm/tool-vm-lifecycle.d.ts +3 -3
- package/dist/tool-vm/tool-vm-lifecycle.d.ts.map +1 -1
- package/dist/tool-vm/tool-vm-lifecycle.js +12 -12
- package/dist/tool-vm/tool-vm-lifecycle.js.map +1 -1
- package/package.json +8 -7
- package/dist/controller/leases/lease-workspace-paths.d.ts +0 -14
- package/dist/controller/leases/lease-workspace-paths.d.ts.map +0 -1
- package/dist/controller/leases/lease-workspace-paths.js +0 -104
- package/dist/controller/leases/lease-workspace-paths.js.map +0 -1
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { SystemConfig } from '../../config/system-config.js';
|
|
2
|
-
type ZoneConfig = SystemConfig['zones'][number];
|
|
3
|
-
export declare class LeaseWorkspaceValidationError extends Error {
|
|
4
|
-
}
|
|
5
|
-
export declare function validateResolvedToolWorkspaceDir(options: {
|
|
6
|
-
readonly workspaceDir: string;
|
|
7
|
-
readonly zone: ZoneConfig;
|
|
8
|
-
}): Promise<string>;
|
|
9
|
-
export declare function resolveLeaseWorkspaceDir(options: {
|
|
10
|
-
readonly workspaceDir: string;
|
|
11
|
-
readonly zone: ZoneConfig;
|
|
12
|
-
}): Promise<string>;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=lease-workspace-paths.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lease-workspace-paths.d.ts","sourceRoot":"","sources":["../../../src/controller/leases/lease-workspace-paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAQlE,KAAK,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,qBAAa,6BAA8B,SAAQ,KAAK;CAAG;AA8E3D,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC/D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBlB;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE;IACvD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAsClB"}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { realpath } from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
// These guest roots are mounted by the OpenClaw gateway image. Lease callers
|
|
4
|
-
// must speak in gateway paths; the controller owns translation to host paths.
|
|
5
|
-
const OPENCLAW_STATE_VM_ROOT = '/home/openclaw/.openclaw/state';
|
|
6
|
-
const OPENCLAW_STATE_SANDBOXES_VM_ROOT = `${OPENCLAW_STATE_VM_ROOT}/sandboxes`;
|
|
7
|
-
const OPENCLAW_ZONE_FILES_VM_ROOT = '/zone';
|
|
8
|
-
export class LeaseWorkspaceValidationError extends Error {
|
|
9
|
-
}
|
|
10
|
-
function pathContainsParentTraversal(inputPath) {
|
|
11
|
-
return inputPath.split(/[\\/]+/u).includes('..');
|
|
12
|
-
}
|
|
13
|
-
function isPathWithin(candidatePath, rootPath) {
|
|
14
|
-
const relativePath = path.relative(rootPath, candidatePath);
|
|
15
|
-
return relativePath === '' || (!relativePath.startsWith('..') && !path.isAbsolute(relativePath));
|
|
16
|
-
}
|
|
17
|
-
function mapGuestPathToHostPath(options) {
|
|
18
|
-
const normalizedWorkspaceDir = path.posix.normalize(options.workspaceDir);
|
|
19
|
-
if (normalizedWorkspaceDir !== options.guestRoot &&
|
|
20
|
-
!normalizedWorkspaceDir.startsWith(`${options.guestRoot}/`)) {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
const relativePath = path.posix.relative(options.guestRoot, normalizedWorkspaceDir);
|
|
24
|
-
return path.join(options.hostRoot, relativePath);
|
|
25
|
-
}
|
|
26
|
-
async function realpathIfDirectory(directoryPath) {
|
|
27
|
-
try {
|
|
28
|
-
return await realpath(directoryPath);
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
const code = error && typeof error === 'object' && 'code' in error ? String(error.code) : 'UNKNOWN';
|
|
32
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
33
|
-
throw new LeaseWorkspaceValidationError(`Lease workspace path '${directoryPath}' failed directory realpath check (${code}): ${message}`, { cause: error });
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
async function realpathAllowedRoot(directoryPath) {
|
|
37
|
-
try {
|
|
38
|
-
return await realpath(directoryPath);
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
throw error;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
async function validateResolvedLeaseWorkspaceDir(options) {
|
|
48
|
-
if (options.zone.gateway.type !== 'openclaw') {
|
|
49
|
-
throw new LeaseWorkspaceValidationError(`Zone '${options.zone.id}' does not support OpenClaw tool VM leases.`);
|
|
50
|
-
}
|
|
51
|
-
const hostSandboxRoot = path.join(options.zone.gateway.stateDir, 'sandboxes');
|
|
52
|
-
const [realCandidatePath, realSandboxRoot, realZoneFilesRoot] = await Promise.all([
|
|
53
|
-
realpathIfDirectory(options.workspaceDir),
|
|
54
|
-
realpathAllowedRoot(hostSandboxRoot),
|
|
55
|
-
realpathAllowedRoot(options.zone.gateway.zoneFilesDir),
|
|
56
|
-
]);
|
|
57
|
-
const allowedRoots = [realSandboxRoot, realZoneFilesRoot].filter((root) => root !== null);
|
|
58
|
-
if (!allowedRoots.some((root) => isPathWithin(realCandidatePath, root))) {
|
|
59
|
-
throw new LeaseWorkspaceValidationError(`Lease workspaceDir '${options.workspaceDir}' resolves outside allowed OpenClaw tool workspace roots for zone '${options.zone.id}'.`);
|
|
60
|
-
}
|
|
61
|
-
return realCandidatePath;
|
|
62
|
-
}
|
|
63
|
-
export async function validateResolvedToolWorkspaceDir(options) {
|
|
64
|
-
if (options.zone.gateway.type !== 'openclaw') {
|
|
65
|
-
throw new LeaseWorkspaceValidationError(`Zone '${options.zone.id}' does not support OpenClaw tool VM leases.`);
|
|
66
|
-
}
|
|
67
|
-
if (!path.isAbsolute(options.workspaceDir)) {
|
|
68
|
-
throw new LeaseWorkspaceValidationError(`Lease workspaceDir '${options.workspaceDir}' must be absolute.`);
|
|
69
|
-
}
|
|
70
|
-
if (pathContainsParentTraversal(options.workspaceDir)) {
|
|
71
|
-
throw new LeaseWorkspaceValidationError(`Lease workspaceDir '${options.workspaceDir}' must not contain '..' path segments.`);
|
|
72
|
-
}
|
|
73
|
-
return await validateResolvedLeaseWorkspaceDir(options);
|
|
74
|
-
}
|
|
75
|
-
export async function resolveLeaseWorkspaceDir(options) {
|
|
76
|
-
if (options.zone.gateway.type !== 'openclaw') {
|
|
77
|
-
throw new LeaseWorkspaceValidationError(`Zone '${options.zone.id}' does not support OpenClaw tool VM leases.`);
|
|
78
|
-
}
|
|
79
|
-
if (!path.isAbsolute(options.workspaceDir)) {
|
|
80
|
-
throw new LeaseWorkspaceValidationError(`Lease workspaceDir '${options.workspaceDir}' must be absolute.`);
|
|
81
|
-
}
|
|
82
|
-
if (pathContainsParentTraversal(options.workspaceDir)) {
|
|
83
|
-
throw new LeaseWorkspaceValidationError(`Lease workspaceDir '${options.workspaceDir}' must not contain '..' path segments.`);
|
|
84
|
-
}
|
|
85
|
-
const hostSandboxRoot = path.join(options.zone.gateway.stateDir, 'sandboxes');
|
|
86
|
-
const candidatePath = mapGuestPathToHostPath({
|
|
87
|
-
guestRoot: OPENCLAW_STATE_SANDBOXES_VM_ROOT,
|
|
88
|
-
hostRoot: hostSandboxRoot,
|
|
89
|
-
workspaceDir: options.workspaceDir,
|
|
90
|
-
}) ??
|
|
91
|
-
mapGuestPathToHostPath({
|
|
92
|
-
guestRoot: OPENCLAW_ZONE_FILES_VM_ROOT,
|
|
93
|
-
hostRoot: options.zone.gateway.zoneFilesDir,
|
|
94
|
-
workspaceDir: options.workspaceDir,
|
|
95
|
-
});
|
|
96
|
-
if (!candidatePath) {
|
|
97
|
-
throw new LeaseWorkspaceValidationError(`Lease workspaceDir '${options.workspaceDir}' must be under ${OPENCLAW_STATE_SANDBOXES_VM_ROOT} or ${OPENCLAW_ZONE_FILES_VM_ROOT}.`);
|
|
98
|
-
}
|
|
99
|
-
return await validateResolvedLeaseWorkspaceDir({
|
|
100
|
-
workspaceDir: candidatePath,
|
|
101
|
-
zone: options.zone,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=lease-workspace-paths.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lease-workspace-paths.js","sourceRoot":"","sources":["../../../src/controller/leases/lease-workspace-paths.ts"],"names":[],"mappings":"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"}
|