@marifold/core 0.69.0 → 0.70.5
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/agent/AgentRunner.d.ts +7 -1
- package/dist/agent/AgentRunner.d.ts.map +1 -1
- package/dist/agent/AgentRunner.js +50 -16
- package/dist/agent/AgentRunner.js.map +1 -1
- package/dist/agent/RunArtifacts.d.ts +6 -1
- package/dist/agent/RunArtifacts.d.ts.map +1 -1
- package/dist/agent/RunArtifacts.js +16 -3
- package/dist/agent/RunArtifacts.js.map +1 -1
- package/dist/agent/RunWorkspace.d.ts +3 -0
- package/dist/agent/RunWorkspace.d.ts.map +1 -1
- package/dist/agent/RunWorkspace.js +5 -0
- package/dist/agent/RunWorkspace.js.map +1 -1
- package/dist/agent/ScopedProcess.d.ts.map +1 -1
- package/dist/agent/ScopedProcess.js +1 -0
- package/dist/agent/ScopedProcess.js.map +1 -1
- package/dist/agent/ToolRegistry.d.ts +6 -1
- package/dist/agent/ToolRegistry.d.ts.map +1 -1
- package/dist/agent/ToolRegistry.js +4 -1
- package/dist/agent/ToolRegistry.js.map +1 -1
- package/dist/agent/tools/ReadFileTool.d.ts.map +1 -1
- package/dist/agent/tools/ReadFileTool.js +4 -0
- package/dist/agent/tools/ReadFileTool.js.map +1 -1
- package/dist/agent/tools/WriteFileTool.d.ts.map +1 -1
- package/dist/agent/tools/WriteFileTool.js +4 -0
- package/dist/agent/tools/WriteFileTool.js.map +1 -1
- package/dist/app/SkillAppInstanceRegistry.d.ts.map +1 -1
- package/dist/app/SkillAppInstanceRegistry.js +5 -0
- package/dist/app/SkillAppInstanceRegistry.js.map +1 -1
- package/dist/config/ChatGptCatalogVersion.d.ts +3 -0
- package/dist/config/ChatGptCatalogVersion.d.ts.map +1 -0
- package/dist/config/ChatGptCatalogVersion.js +55 -0
- package/dist/config/ChatGptCatalogVersion.js.map +1 -0
- package/dist/config/ProviderInspector.d.ts.map +1 -1
- package/dist/config/ProviderInspector.js +2 -5
- package/dist/config/ProviderInspector.js.map +1 -1
- package/dist/errors/MarifoldError.d.ts +1 -1
- package/dist/errors/MarifoldError.d.ts.map +1 -1
- package/dist/errors/MarifoldError.js.map +1 -1
- package/dist/images/AvatarThumbnail.d.ts +3 -0
- package/dist/images/AvatarThumbnail.d.ts.map +1 -0
- package/dist/images/AvatarThumbnail.js +16 -0
- package/dist/images/AvatarThumbnail.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -4
- package/dist/index.js.map +1 -1
- package/dist/profiles/ProfileManager.d.ts.map +1 -1
- package/dist/profiles/ProfileManager.js +2 -3
- package/dist/profiles/ProfileManager.js.map +1 -1
- package/dist/runs/RunRegistry.d.ts +27 -1
- package/dist/runs/RunRegistry.d.ts.map +1 -1
- package/dist/runs/RunRegistry.js +75 -16
- package/dist/runs/RunRegistry.js.map +1 -1
- package/dist/runtime/MarifoldRuntime.d.ts +9 -2
- package/dist/runtime/MarifoldRuntime.d.ts.map +1 -1
- package/dist/runtime/MarifoldRuntime.js +26 -5
- package/dist/runtime/MarifoldRuntime.js.map +1 -1
- package/dist/workspace/DeviceDelegateTool.d.ts +40 -0
- package/dist/workspace/DeviceDelegateTool.d.ts.map +1 -0
- package/dist/workspace/DeviceDelegateTool.js +79 -0
- package/dist/workspace/DeviceDelegateTool.js.map +1 -0
- package/dist/workspace/WorkspaceArtifactTransfer.d.ts +8 -0
- package/dist/workspace/WorkspaceArtifactTransfer.d.ts.map +1 -0
- package/dist/workspace/WorkspaceArtifactTransfer.js +45 -0
- package/dist/workspace/WorkspaceArtifactTransfer.js.map +1 -0
- package/dist/workspace/WorkspaceExecutor.d.ts +19 -0
- package/dist/workspace/WorkspaceExecutor.d.ts.map +1 -0
- package/dist/workspace/WorkspaceExecutor.js +212 -0
- package/dist/workspace/WorkspaceExecutor.js.map +1 -0
- package/dist/workspace/WorkspaceManager.d.ts +43 -0
- package/dist/workspace/WorkspaceManager.d.ts.map +1 -0
- package/dist/workspace/WorkspaceManager.js +378 -0
- package/dist/workspace/WorkspaceManager.js.map +1 -0
- package/dist/workspace/WorkspaceRuns.d.ts +18 -0
- package/dist/workspace/WorkspaceRuns.d.ts.map +1 -0
- package/dist/workspace/WorkspaceRuns.js +152 -0
- package/dist/workspace/WorkspaceRuns.js.map +1 -0
- package/dist/workspace/WorkspaceStore.d.ts +49 -0
- package/dist/workspace/WorkspaceStore.d.ts.map +1 -0
- package/dist/workspace/WorkspaceStore.js +419 -0
- package/dist/workspace/WorkspaceStore.js.map +1 -0
- package/dist/workspace/WorkspaceTerminal.d.ts +4 -0
- package/dist/workspace/WorkspaceTerminal.d.ts.map +1 -0
- package/dist/workspace/WorkspaceTerminal.js +80 -0
- package/dist/workspace/WorkspaceTerminal.js.map +1 -0
- package/dist/workspace/bridge/BridgePeer.d.ts +48 -0
- package/dist/workspace/bridge/BridgePeer.d.ts.map +1 -0
- package/dist/workspace/bridge/BridgePeer.js +307 -0
- package/dist/workspace/bridge/BridgePeer.js.map +1 -0
- package/dist/workspace/bridge/ChunkTransfers.d.ts +19 -0
- package/dist/workspace/bridge/ChunkTransfers.d.ts.map +1 -0
- package/dist/workspace/bridge/ChunkTransfers.js +125 -0
- package/dist/workspace/bridge/ChunkTransfers.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeviceDelegateTool = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const ToolRegistry_1 = require("../agent/ToolRegistry");
|
|
6
|
+
class DeviceDelegateTool {
|
|
7
|
+
start;
|
|
8
|
+
kind = 'delegate';
|
|
9
|
+
definition = {
|
|
10
|
+
name: 'delegate_device',
|
|
11
|
+
description: 'Ask another online device in this personal workspace to carry out one bounded objective with this profile and model. The child cannot delegate again. Approval is required. Use the device name or ID from the device context. Filesystem paths belong to the selected device; do not translate them from the requesting device.',
|
|
12
|
+
parameters: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: { device: { type: 'string' }, objective: { type: 'string' } },
|
|
15
|
+
required: ['device', 'objective'],
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
constructor(start) {
|
|
19
|
+
this.start = start;
|
|
20
|
+
}
|
|
21
|
+
summarizeCall(input) {
|
|
22
|
+
return `ask device ${String(input.device)} to ${String(input.objective).slice(0, 160)}`;
|
|
23
|
+
}
|
|
24
|
+
assessRisk() {
|
|
25
|
+
return { escalate: true, persistable: false, reason: 'This starts agent work on another device.' };
|
|
26
|
+
}
|
|
27
|
+
async execute(input, context) {
|
|
28
|
+
if (context.signal?.aborted)
|
|
29
|
+
throw new Error('Run cancelled.');
|
|
30
|
+
const child = await this.start((0, ToolRegistry_1.requireStringInput)(input, 'device', this.definition.name), (0, ToolRegistry_1.requireStringInput)(input, 'objective', this.definition.name));
|
|
31
|
+
const cancel = () => child.cancel();
|
|
32
|
+
context.signal?.addEventListener('abort', cancel, { once: true });
|
|
33
|
+
if (context.signal?.aborted)
|
|
34
|
+
cancel();
|
|
35
|
+
let status = 'failed';
|
|
36
|
+
let summary = '';
|
|
37
|
+
let error = '';
|
|
38
|
+
try {
|
|
39
|
+
for await (const { event } of child.events) {
|
|
40
|
+
if (event.type === 'done') {
|
|
41
|
+
status = event.status;
|
|
42
|
+
summary = event.summary ?? summary;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (event.type === 'status' || event.type === 'plan' || event.type === 'step')
|
|
46
|
+
continue;
|
|
47
|
+
if (event.type === 'error')
|
|
48
|
+
error = event.message;
|
|
49
|
+
let forwarded = event;
|
|
50
|
+
if (event.type === 'text') {
|
|
51
|
+
summary = event.text;
|
|
52
|
+
forwarded = { ...event, phase: 'progress' };
|
|
53
|
+
}
|
|
54
|
+
if (event.type === 'artifact')
|
|
55
|
+
forwarded = {
|
|
56
|
+
type: 'artifact',
|
|
57
|
+
artifact: {
|
|
58
|
+
...event.artifact,
|
|
59
|
+
id: (0, node_crypto_1.createHash)('sha256').update(`${child.runId}:${event.artifact.id}`).digest('hex').slice(0, 24),
|
|
60
|
+
source: { runId: child.runId, artifactId: event.artifact.id },
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
context.emitEvent?.(forwarded);
|
|
64
|
+
}
|
|
65
|
+
if (status !== 'completed')
|
|
66
|
+
throw new ToolRegistry_1.UncertainToolOutcomeError(`Device run ${child.runId} ended ${status}. Inspect its results before retrying any effects. ${error}`);
|
|
67
|
+
return {
|
|
68
|
+
content: `Device run ${child.runId} completed.\n${summary}`,
|
|
69
|
+
summary: `device run ${child.runId} completed`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
context.signal?.removeEventListener('abort', cancel);
|
|
74
|
+
child.cancel();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.DeviceDelegateTool = DeviceDelegateTool;
|
|
79
|
+
//# sourceMappingURL=DeviceDelegateTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceDelegateTool.js","sourceRoot":"","sources":["../../src/workspace/DeviceDelegateTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function artifactReadLength(value: unknown): number;
|
|
2
|
+
export interface ArtifactChunk {
|
|
3
|
+
data: string;
|
|
4
|
+
size: number;
|
|
5
|
+
}
|
|
6
|
+
/** Ordered, bounded read-ahead; the first response also detects older 32 KiB readers. */
|
|
7
|
+
export declare function workspaceArtifactStream(size: number, read: (offset: number, length: number) => Promise<ArtifactChunk>): AsyncGenerator<Buffer>;
|
|
8
|
+
//# sourceMappingURL=WorkspaceArtifactTransfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceArtifactTransfer.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceArtifactTransfer.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKzD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yFAAyF;AACzF,wBAAuB,uBAAuB,CAC5C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,GAC/D,cAAc,CAAC,MAAM,CAAC,CA2BxB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.artifactReadLength = artifactReadLength;
|
|
4
|
+
exports.workspaceArtifactStream = workspaceArtifactStream;
|
|
5
|
+
const DOWNLOAD_CHUNK = 128 * 1024;
|
|
6
|
+
function artifactReadLength(value) {
|
|
7
|
+
if (value === undefined)
|
|
8
|
+
return 32 * 1024;
|
|
9
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1 || value > DOWNLOAD_CHUNK)
|
|
10
|
+
throw new Error('Invalid artifact read length.');
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
/** Ordered, bounded read-ahead; the first response also detects older 32 KiB readers. */
|
|
14
|
+
async function* workspaceArtifactStream(size, read) {
|
|
15
|
+
if (!Number.isSafeInteger(size) || size < 0)
|
|
16
|
+
throw new Error('Invalid artifact size.');
|
|
17
|
+
if (size === 0)
|
|
18
|
+
return;
|
|
19
|
+
const decode = (chunk, expected, initial = false) => {
|
|
20
|
+
const bytes = Buffer.from(chunk.data, 'base64');
|
|
21
|
+
if (chunk.size !== size || bytes.length === 0 || bytes.length > expected ||
|
|
22
|
+
(!initial && bytes.length !== expected))
|
|
23
|
+
throw new Error('Artifact changed or transfer ended early.');
|
|
24
|
+
return bytes;
|
|
25
|
+
};
|
|
26
|
+
const first = decode(await read(0, DOWNLOAD_CHUNK), Math.min(size, DOWNLOAD_CHUNK), true);
|
|
27
|
+
yield first;
|
|
28
|
+
const chunkSize = first.length;
|
|
29
|
+
let offset = chunkSize;
|
|
30
|
+
const pending = [];
|
|
31
|
+
while (offset < size || pending.length) {
|
|
32
|
+
while (offset < size && pending.length < 4) {
|
|
33
|
+
const length = Math.min(chunkSize, size - offset);
|
|
34
|
+
pending.push(read(offset, length)
|
|
35
|
+
.then(chunk => ({ bytes: decode(chunk, length) }))
|
|
36
|
+
.catch(error => ({ error })));
|
|
37
|
+
offset += length;
|
|
38
|
+
}
|
|
39
|
+
const result = await pending.shift();
|
|
40
|
+
if ('error' in result)
|
|
41
|
+
throw result.error;
|
|
42
|
+
yield result.bytes;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=WorkspaceArtifactTransfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceArtifactTransfer.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceArtifactTransfer.ts"],"names":[],"mappings":";;;;AAAA,MAAM,cAAc,GAAG,GAAG,GAAG,IAAI,CAAC;AAElC,4BAAmC,KAAc;IAC/C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,cAAc;QAClG,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,yFAAyF;AAClF,KAAK,SAAS,CAAC,yBACpB,IAAY,EACZ,IAAgE;IAEhE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACvF,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO;IACvB,MAAM,MAAM,GAAG,CAAC,KAAoB,EAAE,QAAgB,EAAE,OAAO,GAAG,KAAK,EAAU,EAAE;QACjF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;YACtE,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACxG,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1F,MAAM,KAAK,CAAC;IACZ,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/B,IAAI,MAAM,GAAG,SAAS,CAAC;IAEvB,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,OAAO,MAAM,GAAG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,MAAM,GAAG,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;iBAC9B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;iBACjD,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,IAAI,MAAM,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAG,CAAC;QACtC,IAAI,OAAO,IAAI,MAAM;YAAE,MAAM,MAAM,CAAC,KAAK,CAAC;QAC1C,MAAM,MAAM,CAAC,KAAK,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type AgentTool } from '../agent/ToolRegistry';
|
|
2
|
+
import type { WorkspaceOperationContext } from './WorkspaceManager';
|
|
3
|
+
import type { MarifoldAgentConfig } from '../agent/ApprovalPolicy';
|
|
4
|
+
export declare function executionTools(): AgentTool[];
|
|
5
|
+
/** A device owns its own capability construction. Host paths, trusted folders,
|
|
6
|
+
* shell environments, and credentials are never accepted as grants over RPC. */
|
|
7
|
+
export declare class WorkspaceExecutor {
|
|
8
|
+
private readonly config;
|
|
9
|
+
private readonly runsDir?;
|
|
10
|
+
private readonly protectedPaths;
|
|
11
|
+
private runs;
|
|
12
|
+
private registry;
|
|
13
|
+
private timer;
|
|
14
|
+
constructor(config: () => MarifoldAgentConfig, runsDir?: string | undefined, protectedPaths?: string[]);
|
|
15
|
+
close(): void;
|
|
16
|
+
cancelWorkspace(workspaceId: string): void;
|
|
17
|
+
handle(operation: string, value: unknown, context: WorkspaceOperationContext): Promise<unknown>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=WorkspaceExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceExecutor.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceExecutor.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgB,KAAK,SAAS,EAA6B,MAAM,uBAAuB,CAAC;AAQhG,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAS5C;AAQD;gFACgF;AAChF,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IANjC,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,KAAK,CAAiC;IAC9C,YACmB,MAAM,EAAE,MAAM,mBAAmB,EACjC,OAAO,CAAC,EAAE,MAAM,YAAA,EAChB,cAAc,GAAE,MAAM,EAAO,EAW/C;IACD,KAAK,IAAI,IAAI,CAIZ;IACD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAMzC;IACK,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqGpG;CACF"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.WorkspaceExecutor = void 0;
|
|
37
|
+
exports.executionTools = executionTools;
|
|
38
|
+
const WorkspaceArtifactTransfer_1 = require("./WorkspaceArtifactTransfer");
|
|
39
|
+
const fs = __importStar(require("node:fs"));
|
|
40
|
+
const path = __importStar(require("node:path"));
|
|
41
|
+
const workspace_protocol_1 = require("@marifold/workspace-protocol");
|
|
42
|
+
const RunWorkspace_1 = require("../agent/RunWorkspace");
|
|
43
|
+
const RunArtifacts_1 = require("../agent/RunArtifacts");
|
|
44
|
+
const ToolRegistry_1 = require("../agent/ToolRegistry");
|
|
45
|
+
const InspectAttachmentTool_1 = require("../agent/tools/InspectAttachmentTool");
|
|
46
|
+
const ReadAttachmentTool_1 = require("../agent/tools/ReadAttachmentTool");
|
|
47
|
+
const SearchAttachmentTool_1 = require("../agent/tools/SearchAttachmentTool");
|
|
48
|
+
const ReadFileTool_1 = require("../agent/tools/ReadFileTool");
|
|
49
|
+
const WriteFileTool_1 = require("../agent/tools/WriteFileTool");
|
|
50
|
+
const ShellExecTool_1 = require("../agent/tools/ShellExecTool");
|
|
51
|
+
const WorkspacePaths_1 = require("./WorkspacePaths");
|
|
52
|
+
function executionTools() {
|
|
53
|
+
return [
|
|
54
|
+
new InspectAttachmentTool_1.InspectAttachmentTool(),
|
|
55
|
+
new ReadAttachmentTool_1.ReadAttachmentTool(),
|
|
56
|
+
new SearchAttachmentTool_1.SearchAttachmentTool(),
|
|
57
|
+
new ReadFileTool_1.ReadFileTool(),
|
|
58
|
+
new WriteFileTool_1.WriteFileTool(),
|
|
59
|
+
new ShellExecTool_1.ShellExecTool(),
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
/** A device owns its own capability construction. Host paths, trusted folders,
|
|
63
|
+
* shell environments, and credentials are never accepted as grants over RPC. */
|
|
64
|
+
class WorkspaceExecutor {
|
|
65
|
+
config;
|
|
66
|
+
runsDir;
|
|
67
|
+
protectedPaths;
|
|
68
|
+
runs = new Map();
|
|
69
|
+
registry = new ToolRegistry_1.ToolRegistry();
|
|
70
|
+
timer;
|
|
71
|
+
constructor(config, runsDir, protectedPaths = []) {
|
|
72
|
+
this.config = config;
|
|
73
|
+
this.runsDir = runsDir;
|
|
74
|
+
this.protectedPaths = protectedPaths;
|
|
75
|
+
for (const tool of executionTools())
|
|
76
|
+
this.registry.register(tool);
|
|
77
|
+
this.timer = setInterval(() => {
|
|
78
|
+
for (const [id, run] of this.runs)
|
|
79
|
+
if (run.lease < Date.now()) {
|
|
80
|
+
run.abort.abort();
|
|
81
|
+
this.runs.delete(id);
|
|
82
|
+
}
|
|
83
|
+
}, 5000);
|
|
84
|
+
this.timer.unref();
|
|
85
|
+
}
|
|
86
|
+
close() {
|
|
87
|
+
clearInterval(this.timer);
|
|
88
|
+
for (const run of this.runs.values())
|
|
89
|
+
run.abort.abort();
|
|
90
|
+
this.runs.clear();
|
|
91
|
+
}
|
|
92
|
+
cancelWorkspace(workspaceId) {
|
|
93
|
+
for (const [key, run] of this.runs)
|
|
94
|
+
if (key.startsWith(`${workspaceId}:`)) {
|
|
95
|
+
run.abort.abort();
|
|
96
|
+
this.runs.delete(key);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async handle(operation, value, context) {
|
|
100
|
+
const b = (0, workspace_protocol_1.record)(value);
|
|
101
|
+
const runId = (0, workspace_protocol_1.identifier)(b.runId);
|
|
102
|
+
const key = `${context.workspaceId}:${runId}`;
|
|
103
|
+
// Completed output is read-only and recoverable after a guest restart. Never
|
|
104
|
+
// reconstruct execution capabilities or grants from an on-disk run directory.
|
|
105
|
+
if (operation === 'executor.artifact') {
|
|
106
|
+
const artifact = (0, RunArtifacts_1.resolveRunArtifact)(`ws_${(0, workspace_protocol_1.identifier)(context.workspaceId)}_${runId}`, (0, workspace_protocol_1.identifier)(b.artifactId), this.runsDir ?? path.join((0, WorkspacePaths_1.marifoldHome)(), 'runs'));
|
|
107
|
+
if (!artifact)
|
|
108
|
+
throw new Error('Artifact is unavailable.');
|
|
109
|
+
const offset = b.offset;
|
|
110
|
+
if (typeof offset !== 'number' || !Number.isSafeInteger(offset) || offset < 0 || offset > artifact.size)
|
|
111
|
+
throw new Error('Invalid artifact offset.');
|
|
112
|
+
const fd = fs.openSync(artifact.path, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
|
|
113
|
+
try {
|
|
114
|
+
const bytes = Buffer.alloc(Math.min((0, WorkspaceArtifactTransfer_1.artifactReadLength)(b.length), artifact.size - offset));
|
|
115
|
+
const n = fs.readSync(fd, bytes, 0, bytes.length, offset);
|
|
116
|
+
return { data: bytes.subarray(0, n).toString('base64'), size: artifact.size };
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
fs.closeSync(fd);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (operation === 'executor.prepare') {
|
|
123
|
+
if (this.runs.has(key))
|
|
124
|
+
throw new Error('Execution already prepared.');
|
|
125
|
+
if (this.runs.size >= 50)
|
|
126
|
+
throw new Error('Execution capacity reached.');
|
|
127
|
+
if (Array.isArray(b.images) && b.images.some((image) => !image || typeof image !== 'object' || 'path' in image))
|
|
128
|
+
throw new Error('Remote image inputs must carry bytes or URLs, never device paths.');
|
|
129
|
+
const config = this.config();
|
|
130
|
+
const workspace = (0, RunWorkspace_1.createRunWorkspace)({
|
|
131
|
+
deniedRoots: this.protectedPaths,
|
|
132
|
+
id: `ws_${context.workspaceId}_${runId}`,
|
|
133
|
+
cwd: typeof b.cwd === 'string' ? b.cwd : undefined,
|
|
134
|
+
trustedFolders: config.trustedFolders,
|
|
135
|
+
files: Array.isArray(b.files) ? b.files : undefined,
|
|
136
|
+
images: Array.isArray(b.images) ? b.images : undefined,
|
|
137
|
+
...(this.runsDir ? { runsDir: this.runsDir } : {}),
|
|
138
|
+
});
|
|
139
|
+
this.runs.set(key, {
|
|
140
|
+
workspace,
|
|
141
|
+
abort: new AbortController(),
|
|
142
|
+
lease: Date.now() + 45000,
|
|
143
|
+
grants: new Map(),
|
|
144
|
+
completed: false,
|
|
145
|
+
});
|
|
146
|
+
return workspace;
|
|
147
|
+
}
|
|
148
|
+
const run = this.runs.get(key);
|
|
149
|
+
if (!run)
|
|
150
|
+
throw new Error('Execution is unavailable or its lease expired. Start a new run explicitly.');
|
|
151
|
+
if (operation === 'executor.cancel') {
|
|
152
|
+
run.abort.abort();
|
|
153
|
+
return { cancelled: true };
|
|
154
|
+
}
|
|
155
|
+
if (operation === 'executor.lease') {
|
|
156
|
+
if (!run.completed && !run.abort.signal.aborted)
|
|
157
|
+
run.lease = Date.now() + 45000;
|
|
158
|
+
return { active: !run.abort.signal.aborted };
|
|
159
|
+
}
|
|
160
|
+
if (operation === 'executor.artifacts') {
|
|
161
|
+
run.completed = true;
|
|
162
|
+
run.lease = Date.now() + 24 * 60 * 60 * 1000;
|
|
163
|
+
return (0, RunArtifacts_1.listRunArtifacts)(run.workspace);
|
|
164
|
+
}
|
|
165
|
+
if (run.completed || run.abort.signal.aborted)
|
|
166
|
+
throw new Error('Execution has ended.');
|
|
167
|
+
const tool = this.registry.get(String(b.tool));
|
|
168
|
+
if (!tool || tool.kind === 'interaction')
|
|
169
|
+
throw new Error('Unsupported execution tool.');
|
|
170
|
+
const input = (0, workspace_protocol_1.record)(b.input);
|
|
171
|
+
const toolContext = {
|
|
172
|
+
workspace: run.workspace,
|
|
173
|
+
cwd: run.workspace.cwd,
|
|
174
|
+
trustedFolders: this.config().trustedFolders,
|
|
175
|
+
outputLimit: this.config().toolOutputLimit,
|
|
176
|
+
signal: run.abort.signal,
|
|
177
|
+
};
|
|
178
|
+
const risk = (await tool.assessRisk?.(input, toolContext)) ?? { escalate: false };
|
|
179
|
+
const blocked = risk.blocked || (!risk.trusted && this.config().approval[tool.kind] === 'deny');
|
|
180
|
+
const hash = (0, workspace_protocol_1.digest)(JSON.stringify([tool.definition.name, input]));
|
|
181
|
+
if (operation === 'executor.assess') {
|
|
182
|
+
const grant = (0, workspace_protocol_1.randomId)();
|
|
183
|
+
for (const [id, g] of run.grants)
|
|
184
|
+
if (g.expires < Date.now())
|
|
185
|
+
run.grants.delete(id);
|
|
186
|
+
if (run.grants.size >= 128)
|
|
187
|
+
throw new Error('Too many outstanding execution grants.');
|
|
188
|
+
if (!blocked)
|
|
189
|
+
run.grants.set(grant, { hash, expires: Date.now() + 6 * 60 * 1000 });
|
|
190
|
+
return {
|
|
191
|
+
...risk,
|
|
192
|
+
blocked,
|
|
193
|
+
grant,
|
|
194
|
+
persistable: false,
|
|
195
|
+
trusted: false,
|
|
196
|
+
escalate: true,
|
|
197
|
+
reason: blocked
|
|
198
|
+
? (risk.reason ?? 'Denied by execution device policy.')
|
|
199
|
+
: (risk.reason ?? 'Approve this call on the selected device.'),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (operation !== 'executor.execute')
|
|
203
|
+
throw new Error('Unsupported executor operation.');
|
|
204
|
+
const grant = run.grants.get(String(b.grant));
|
|
205
|
+
run.grants.delete(String(b.grant));
|
|
206
|
+
if (blocked || !grant || grant.hash !== hash || grant.expires < Date.now())
|
|
207
|
+
throw new Error('Execution grant is invalid or expired.');
|
|
208
|
+
return tool.execute(input, toolContext);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.WorkspaceExecutor = WorkspaceExecutor;
|
|
212
|
+
//# sourceMappingURL=WorkspaceExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceExecutor.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { WorkspaceSummary } from '@marifold/workspace-protocol';
|
|
2
|
+
import { WorkspaceStore } from './WorkspaceStore';
|
|
3
|
+
export interface WorkspaceOperationContext {
|
|
4
|
+
workspaceId: string;
|
|
5
|
+
senderDeviceId: string;
|
|
6
|
+
hostDeviceId: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class WorkspaceManager {
|
|
9
|
+
readonly store: WorkspaceStore;
|
|
10
|
+
private peers;
|
|
11
|
+
private hostStatus;
|
|
12
|
+
private presence;
|
|
13
|
+
onMembershipRemoved?: (workspaceId: string, deviceId?: string) => void;
|
|
14
|
+
private heartbeat?;
|
|
15
|
+
private remoteHandler?;
|
|
16
|
+
private executorHandler?;
|
|
17
|
+
constructor(configPath: string);
|
|
18
|
+
start(handler: NonNullable<WorkspaceManager['remoteHandler']>, executor?: WorkspaceManager['executorHandler']): void;
|
|
19
|
+
close(): void;
|
|
20
|
+
list(): WorkspaceSummary[];
|
|
21
|
+
create(name: string, url: string, registrationToken: string): Promise<{
|
|
22
|
+
workspace: WorkspaceSummary;
|
|
23
|
+
invitation: string;
|
|
24
|
+
}>;
|
|
25
|
+
add(url: string, token: string, executor?: boolean): Promise<WorkspaceSummary>;
|
|
26
|
+
devices(id: string): {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
host: boolean;
|
|
30
|
+
platform: string;
|
|
31
|
+
architecture: string;
|
|
32
|
+
executor: boolean;
|
|
33
|
+
online: boolean;
|
|
34
|
+
}[];
|
|
35
|
+
request(id: string, operation: string, input: unknown, requestId?: string): Promise<unknown>;
|
|
36
|
+
execute(id: string, device: string, operation: string, input: unknown, requestId?: string): Promise<unknown>;
|
|
37
|
+
remove(id: string): Promise<void>;
|
|
38
|
+
setExecutor(id: string, enabled: boolean): Promise<void>;
|
|
39
|
+
private connect;
|
|
40
|
+
private checkHost;
|
|
41
|
+
private dispatch;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=WorkspaceManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceManager.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceManager.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,gBAAgB,EAGjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AAGvE,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AACD,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAAkG;IAClH,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE,OAAO,CAAC,SAAS,CAAC,CAAiC;IACnD,OAAO,CAAC,aAAa,CAAC,CAA8F;IACpH,OAAO,CAAC,eAAe,CAAC,CAA8F;IACtH,YAAY,UAAU,EAAE,MAAM,EAE7B;IACD,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAQnH;IACD,KAAK,IAAI,IAAI,CAIZ;IACD,IAAI,IAAI,gBAAgB,EAAE,CAazB;IACK,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC;QAAE,SAAS,EAAE,gBAAgB,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAoB9D;IACK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuDjF;IACD,OAAO,CAAC,EAAE,EAAE,MAAM;;;;;;;;QAmBjB;IACK,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,SAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CA8BrG;IACK,OAAO,CACX,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,SAAS,SAAa,GACrB,OAAO,CAAC,OAAO,CAAC,CAelB;IACK,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBtC;IACK,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D;IACD,OAAO,CAAC,OAAO;YAiCD,SAAS;YAoBT,QAAQ;CAoFvB"}
|