@finalai/final-agent-provider 0.2.0 → 0.2.2
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/modules/sandboxes/computer.d.mts +2 -0
- package/dist/modules/sandboxes/computer.mjs +70 -18
- package/dist/modules/sandboxes/computer.mjs.map +3 -3
- package/dist/modules/sandboxes/device.d.mts +2 -0
- package/dist/modules/sandboxes/device.mjs +27 -4
- package/dist/modules/sandboxes/device.mjs.map +2 -2
- package/dist/modules/sandboxes/session.d.mts +1 -1
- package/dist/modules/sandboxes/session.mjs +1 -1
- package/dist/modules/sandboxes/session.mjs.map +2 -2
- package/dist/modules/sandboxes/testing/fake-backends.d.mts +3 -0
- package/dist/modules/sandboxes/testing/fake-backends.mjs +35 -3
- package/dist/modules/sandboxes/testing/fake-backends.mjs.map +2 -2
- package/dist/modules/sandboxes/testing/fake-machine.mjs +8 -0
- package/dist/modules/sandboxes/testing/fake-machine.mjs.map +2 -2
- package/package.json +3 -3
|
@@ -161,6 +161,14 @@ const createFakeMachine = () => {
|
|
|
161
161
|
control.exit(3);
|
|
162
162
|
return true;
|
|
163
163
|
}
|
|
164
|
+
if (script.startsWith("printenv ")) {
|
|
165
|
+
const name = script.slice("printenv ".length);
|
|
166
|
+
const value = Object.hasOwn(control.exec.env, name) ? control.exec.env[name] : void 0;
|
|
167
|
+
if (value != null) control.stdout(`${value}
|
|
168
|
+
`);
|
|
169
|
+
control.exit(value == null ? 1 : 0);
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
164
172
|
if (script === "echo" || script.startsWith("echo ")) {
|
|
165
173
|
control.stdout(`${script.slice("echo ".length)}
|
|
166
174
|
`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/sandboxes/testing/fake-machine.ts"],
|
|
4
|
-
"sourcesContent": ["import { SANDBOX_SEED_MARKER, SANDBOX_SEED_PROTOCOL } from '@finalai/agent-provider/sandbox';\nimport { posix } from 'node:path';\nimport * as z from 'zod';\nimport { concatBytes } from \"../bytes.mjs\";\nimport { GUIDE_COMMAND_PROTOCOL } from \"../workspace-setup.mjs\";\nimport { quotedShellArguments } from \"./quoted-shell-arguments.mjs\";\n\n// An in-memory machine behind the fake Computers API, data plane and Device: a file\n// tree plus managed processes whose behaviour tests script by command.\n\nexport interface FakeExecIface {\n command: string;\n // The command with the provider's `bash -lc '\u2026'` / `exec '\u2026'` wrapper removed.\n script: string;\n cwd: string;\n env: Record<string, string>;\n}\n\nexport interface FakeProcessControlIface {\n readonly exec: FakeExecIface;\n stdout(text: string | Uint8Array): void;\n stderr(text: string | Uint8Array): void;\n exit(code: number, signal?: string | null): void;\n onStdin(listener: (data: Uint8Array) => void): void;\n onEof(listener: () => void): void;\n}\n\nexport interface FakeBehaviorIface {\n (process: FakeProcessControlIface): void;\n}\n\nexport interface FakeProcessIface {\n id: string;\n bootId: string;\n exec: FakeExecIface;\n stdout: Uint8Array;\n stderr: Uint8Array;\n exited: boolean;\n exitCode: number | null;\n signal: string | null;\n write(data: Uint8Array): void;\n eof(): void;\n terminate(signal?: string): void;\n // Resolves on the next change (output or exit), or after `ms`.\n changed(ms: number): Promise<void>;\n}\n\nexport interface FakeMachineIface {\n files: Map<string, Uint8Array>;\n dirs: Set<string>;\n // Symlink path \u2192 target path.\n links: Map<string, string>;\n execs: FakeExecIface[];\n processes: Map<string, FakeProcessIface>;\n // Tests register behaviours; the first whose predicate matches runs.\n on(match: (exec: FakeExecIface) => boolean, behavior: FakeBehaviorIface): void;\n exec(args: {\n id: string;\n command: string;\n cwd: string;\n env: Record<string, string>;\n }): FakeProcessIface;\n mkdirp(path: string): void;\n readText(path: string): string | null;\n}\n\n// Removes the session handle's `bash -lc '\u2026'` or `exec '\u2026' '\u2026'` wrapper.\nexport const unwrapCommand = (command: string): string => {\n if (command.startsWith('bash -lc '))\n return quotedShellArguments(command.slice('bash -lc '.length)).join(' ');\n if (command.startsWith('exec bash -lc '))\n return quotedShellArguments(command.slice('exec bash -lc '.length)).join(' ');\n if (command.startsWith('exec '))\n return quotedShellArguments(command.slice('exec '.length)).join(' ');\n return command;\n};\n\n// The first single-quoted argument after `marker` in a script.\nexport const quotedAfter = (script: string, marker: string): string | null => {\n const index = script.indexOf(marker);\n if (index < 0) return null;\n return quotedShellArguments(script.slice(index + marker.length))[0] ?? null;\n};\n\nconst bytes = (data: string | Uint8Array): Uint8Array =>\n data instanceof Uint8Array ? data : new TextEncoder().encode(data);\n\nexport const createFakeMachine = (): FakeMachineIface => {\n const files = new Map<string, Uint8Array>();\n const dirs = new Set<string>(['/', '/workspaces', '/tmp']);\n const links = new Map<string, string>();\n const behaviors: { match: (exec: FakeExecIface) => boolean; behavior: FakeBehaviorIface }[] = [];\n const execs: FakeExecIface[] = [];\n const processes = new Map<string, FakeProcessIface>();\n\n const mkdirp = (path: string): void => {\n let current = posix.normalize(path);\n while (current !== '/' && !dirs.has(current)) {\n dirs.add(current);\n current = posix.dirname(current);\n }\n };\n\n // Built-in behaviour for the provider's own helper scripts.\n const builtin = (control: FakeProcessControlIface): boolean => {\n const script = control.exec.script;\n if (script.includes(GUIDE_COMMAND_PROTOCOL)) {\n const chunks: Uint8Array[] = [];\n control.onStdin((data) => chunks.push(data));\n control.onEof(() => {\n const payload = z\n .object({ root: z.string(), files: z.record(z.string(), z.string()) })\n .parse(JSON.parse(new TextDecoder().decode(concatBytes(chunks))));\n if (\n [...links.keys()].some(\n (path) => payload.root === path || payload.root.startsWith(`${path}/`),\n )\n ) {\n control.stderr('symlink command directory');\n control.exit(1);\n return;\n }\n for (const [name, content] of Object.entries(payload.files)) {\n const path = posix.join(payload.root, name);\n const existing = files.get(path);\n if (\n links.has(path) ||\n (existing != null && new TextDecoder().decode(existing) !== content)\n ) {\n control.stderr('guide command differs from its pinned source');\n control.exit(1);\n return;\n }\n mkdirp(payload.root);\n files.set(path, bytes(content));\n }\n control.exit(0);\n });\n return true;\n }\n if (script.includes(SANDBOX_SEED_PROTOCOL)) {\n const chunks: Uint8Array[] = [];\n control.onStdin((data) => chunks.push(data));\n control.onEof(() => {\n const payload = z\n .object({ root: z.string(), files: z.record(z.string(), z.string()) })\n .parse(JSON.parse(new TextDecoder().decode(concatBytes(chunks))));\n const marker = posix.join(payload.root, '.final', SANDBOX_SEED_MARKER);\n if (files.has(marker)) {\n control.exit(0);\n return;\n }\n for (const [path, content] of Object.entries(payload.files)) {\n const target = posix.join(payload.root, path);\n if (files.has(target)) continue;\n mkdirp(posix.dirname(target));\n files.set(target, bytes(content));\n }\n mkdirp(posix.dirname(marker));\n files.set(marker, bytes(SANDBOX_SEED_PROTOCOL));\n control.exit(0);\n });\n return true;\n }\n // The provider's helper scripts, matched by how they start.\n const leading = (marker: string): string | null =>\n script.startsWith(marker) ? quotedAfter(script, marker) : null;\n const statPath = leading('if [ ! -e ');\n if (statPath != null && script.includes('stat -c')) {\n // Like `stat` without -L: a symlink reports its own length.\n const link = links.get(statPath);\n if (link != null) control.stdout(`symbolic link|${link.length}|1700000000|777\\n`);\n else if (dirs.has(statPath)) control.stdout(`directory|4096|1700000000|755\\n`);\n else if (files.has(statPath))\n control.stdout(`regular file|${files.get(statPath)?.byteLength ?? 0}|1700000000|644\\n`);\n else control.stdout('missing\\n');\n control.exit(0);\n return true;\n }\n const listPath = leading('[ -d ');\n if (listPath != null && script.includes('find ')) {\n if (!dirs.has(listPath)) {\n control.stderr('Not a directory\\n');\n control.exit(2);\n return true;\n }\n const entries: string[] = [];\n for (const dir of dirs) {\n if (dir !== listPath && posix.dirname(dir) === listPath)\n entries.push(`d\\t4096\\t${posix.basename(dir)}\\0`);\n }\n for (const [path, content] of files) {\n if (posix.dirname(path) === listPath)\n entries.push(`f\\t${content.byteLength}\\t${posix.basename(path)}\\0`);\n }\n control.stdout(entries.join(''));\n control.exit(0);\n return true;\n }\n const mkdirPath = leading('mkdir -p -- ');\n if (mkdirPath != null) {\n mkdirp(mkdirPath);\n control.exit(0);\n return true;\n }\n const removePath = leading('if [ -d ');\n if (removePath != null && script.includes('rm')) {\n if (dirs.has(removePath)) {\n for (const dir of [...dirs])\n if (dir === removePath || dir.startsWith(`${removePath}/`)) dirs.delete(dir);\n for (const path of [...files.keys()])\n if (path.startsWith(`${removePath}/`)) files.delete(path);\n } else if (files.has(removePath)) {\n files.delete(removePath);\n } else if (!script.includes('-f')) {\n control.stderr(`rm: cannot remove: No such file or directory\\n`);\n control.exit(1);\n return true;\n }\n control.exit(0);\n return true;\n }\n if (script.includes('git clone')) {\n const destination = quotedAfter(script.slice(script.indexOf('git clone')), \"' \");\n if (destination != null) mkdirp(`${destination}/.git`);\n control.exit(0);\n return true;\n }\n // Enough of a shell for the conformance kit's process cases.\n if (script === 'cat') {\n control.onStdin((data) => control.stdout(data));\n control.onEof(() => control.exit(0));\n return true;\n }\n if (script.startsWith('sleep ')) return true;\n if (script === 'echo out; echo err >&2; exit 3') {\n control.stdout('out\\n');\n control.stderr('err\\n');\n control.exit(3);\n return true;\n }\n if (script === 'echo' || script.startsWith('echo ')) {\n control.stdout(`${script.slice('echo '.length)}\\n`);\n control.exit(0);\n return true;\n }\n return false;\n };\n\n const exec: FakeMachineIface['exec'] = (args) => {\n const record: FakeExecIface = {\n command: args.command,\n script: unwrapCommand(args.command),\n cwd: args.cwd,\n env: args.env,\n };\n execs.push(record);\n const stdinListeners: ((data: Uint8Array) => void)[] = [];\n const eofListeners: (() => void)[] = [];\n let waiters: (() => void)[] = [];\n const notify = (): void => {\n const pending = waiters;\n waiters = [];\n for (const wake of pending) wake();\n };\n const process: FakeProcessIface = {\n id: args.id,\n bootId: 'boot-1',\n exec: record,\n stdout: new Uint8Array(),\n stderr: new Uint8Array(),\n exited: false,\n exitCode: null,\n signal: null,\n write: (data) => {\n for (const listener of stdinListeners) listener(data);\n },\n eof: () => {\n for (const listener of eofListeners) listener();\n },\n terminate: (signal) => {\n if (process.exited) return;\n process.exited = true;\n process.signal = signal ?? 'SIGKILL';\n notify();\n },\n changed: (ms) =>\n new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n waiters.push(() => {\n clearTimeout(timer);\n resolve();\n });\n }),\n };\n const control: FakeProcessControlIface = {\n exec: record,\n stdout: (data) => {\n process.stdout = concatBytes([process.stdout, bytes(data)]);\n notify();\n },\n stderr: (data) => {\n process.stderr = concatBytes([process.stderr, bytes(data)]);\n notify();\n },\n exit: (code, signal = null) => {\n if (process.exited) return;\n process.exited = true;\n process.exitCode = signal == null ? code : null;\n process.signal = signal;\n notify();\n },\n onStdin: (listener) => stdinListeners.push(listener),\n onEof: (listener) => eofListeners.push(listener),\n };\n processes.set(args.id, process);\n const custom = behaviors.find((entry) => entry.match(record));\n if (custom != null) custom.behavior(control);\n else if (!builtin(control)) control.exit(0);\n return process;\n };\n\n return {\n files,\n dirs,\n links,\n execs,\n processes,\n on: (match, behavior) => behaviors.push({ match, behavior }),\n exec,\n mkdirp,\n readText: (path) => {\n const content = files.get(path);\n return content == null ? null : new TextDecoder().decode(content);\n },\n };\n};\n\n// Output from offsets, waiting up to `waitMs` (capped for fast tests) for news.\nexport const readFakeOutput = async (\n process: FakeProcessIface,\n offsets: { stdout: number; stderr: number; waitMs: number },\n): Promise<{ stdout: Uint8Array; stderr: Uint8Array; exited: boolean }> => {\n if (\n !process.exited &&\n process.stdout.byteLength <= offsets.stdout &&\n process.stderr.byteLength <= offsets.stderr &&\n offsets.waitMs > 0\n ) {\n await process.changed(Math.min(offsets.waitMs, 50));\n }\n return {\n stdout: process.stdout.subarray(offsets.stdout),\n stderr: process.stderr.subarray(offsets.stderr),\n exited: process.exited,\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { SANDBOX_SEED_MARKER, SANDBOX_SEED_PROTOCOL } from '@finalai/agent-provider/sandbox';\nimport { posix } from 'node:path';\nimport * as z from 'zod';\nimport { concatBytes } from \"../bytes.mjs\";\nimport { GUIDE_COMMAND_PROTOCOL } from \"../workspace-setup.mjs\";\nimport { quotedShellArguments } from \"./quoted-shell-arguments.mjs\";\n\n// An in-memory machine behind the fake Computers API, data plane and Device: a file\n// tree plus managed processes whose behaviour tests script by command.\n\nexport interface FakeExecIface {\n command: string;\n // The command with the provider's `bash -lc '\u2026'` / `exec '\u2026'` wrapper removed.\n script: string;\n cwd: string;\n env: Record<string, string>;\n}\n\nexport interface FakeProcessControlIface {\n readonly exec: FakeExecIface;\n stdout(text: string | Uint8Array): void;\n stderr(text: string | Uint8Array): void;\n exit(code: number, signal?: string | null): void;\n onStdin(listener: (data: Uint8Array) => void): void;\n onEof(listener: () => void): void;\n}\n\nexport interface FakeBehaviorIface {\n (process: FakeProcessControlIface): void;\n}\n\nexport interface FakeProcessIface {\n id: string;\n bootId: string;\n exec: FakeExecIface;\n stdout: Uint8Array;\n stderr: Uint8Array;\n exited: boolean;\n exitCode: number | null;\n signal: string | null;\n write(data: Uint8Array): void;\n eof(): void;\n terminate(signal?: string): void;\n // Resolves on the next change (output or exit), or after `ms`.\n changed(ms: number): Promise<void>;\n}\n\nexport interface FakeMachineIface {\n files: Map<string, Uint8Array>;\n dirs: Set<string>;\n // Symlink path \u2192 target path.\n links: Map<string, string>;\n execs: FakeExecIface[];\n processes: Map<string, FakeProcessIface>;\n // Tests register behaviours; the first whose predicate matches runs.\n on(match: (exec: FakeExecIface) => boolean, behavior: FakeBehaviorIface): void;\n exec(args: {\n id: string;\n command: string;\n cwd: string;\n env: Record<string, string>;\n }): FakeProcessIface;\n mkdirp(path: string): void;\n readText(path: string): string | null;\n}\n\n// Removes the session handle's `bash -lc '\u2026'` or `exec '\u2026' '\u2026'` wrapper.\nexport const unwrapCommand = (command: string): string => {\n if (command.startsWith('bash -lc '))\n return quotedShellArguments(command.slice('bash -lc '.length)).join(' ');\n if (command.startsWith('exec bash -lc '))\n return quotedShellArguments(command.slice('exec bash -lc '.length)).join(' ');\n if (command.startsWith('exec '))\n return quotedShellArguments(command.slice('exec '.length)).join(' ');\n return command;\n};\n\n// The first single-quoted argument after `marker` in a script.\nexport const quotedAfter = (script: string, marker: string): string | null => {\n const index = script.indexOf(marker);\n if (index < 0) return null;\n return quotedShellArguments(script.slice(index + marker.length))[0] ?? null;\n};\n\nconst bytes = (data: string | Uint8Array): Uint8Array =>\n data instanceof Uint8Array ? data : new TextEncoder().encode(data);\n\nexport const createFakeMachine = (): FakeMachineIface => {\n const files = new Map<string, Uint8Array>();\n const dirs = new Set<string>(['/', '/workspaces', '/tmp']);\n const links = new Map<string, string>();\n const behaviors: { match: (exec: FakeExecIface) => boolean; behavior: FakeBehaviorIface }[] = [];\n const execs: FakeExecIface[] = [];\n const processes = new Map<string, FakeProcessIface>();\n\n const mkdirp = (path: string): void => {\n let current = posix.normalize(path);\n while (current !== '/' && !dirs.has(current)) {\n dirs.add(current);\n current = posix.dirname(current);\n }\n };\n\n // Built-in behaviour for the provider's own helper scripts.\n const builtin = (control: FakeProcessControlIface): boolean => {\n const script = control.exec.script;\n if (script.includes(GUIDE_COMMAND_PROTOCOL)) {\n const chunks: Uint8Array[] = [];\n control.onStdin((data) => chunks.push(data));\n control.onEof(() => {\n const payload = z\n .object({ root: z.string(), files: z.record(z.string(), z.string()) })\n .parse(JSON.parse(new TextDecoder().decode(concatBytes(chunks))));\n if (\n [...links.keys()].some(\n (path) => payload.root === path || payload.root.startsWith(`${path}/`),\n )\n ) {\n control.stderr('symlink command directory');\n control.exit(1);\n return;\n }\n for (const [name, content] of Object.entries(payload.files)) {\n const path = posix.join(payload.root, name);\n const existing = files.get(path);\n if (\n links.has(path) ||\n (existing != null && new TextDecoder().decode(existing) !== content)\n ) {\n control.stderr('guide command differs from its pinned source');\n control.exit(1);\n return;\n }\n mkdirp(payload.root);\n files.set(path, bytes(content));\n }\n control.exit(0);\n });\n return true;\n }\n if (script.includes(SANDBOX_SEED_PROTOCOL)) {\n const chunks: Uint8Array[] = [];\n control.onStdin((data) => chunks.push(data));\n control.onEof(() => {\n const payload = z\n .object({ root: z.string(), files: z.record(z.string(), z.string()) })\n .parse(JSON.parse(new TextDecoder().decode(concatBytes(chunks))));\n const marker = posix.join(payload.root, '.final', SANDBOX_SEED_MARKER);\n if (files.has(marker)) {\n control.exit(0);\n return;\n }\n for (const [path, content] of Object.entries(payload.files)) {\n const target = posix.join(payload.root, path);\n if (files.has(target)) continue;\n mkdirp(posix.dirname(target));\n files.set(target, bytes(content));\n }\n mkdirp(posix.dirname(marker));\n files.set(marker, bytes(SANDBOX_SEED_PROTOCOL));\n control.exit(0);\n });\n return true;\n }\n // The provider's helper scripts, matched by how they start.\n const leading = (marker: string): string | null =>\n script.startsWith(marker) ? quotedAfter(script, marker) : null;\n const statPath = leading('if [ ! -e ');\n if (statPath != null && script.includes('stat -c')) {\n // Like `stat` without -L: a symlink reports its own length.\n const link = links.get(statPath);\n if (link != null) control.stdout(`symbolic link|${link.length}|1700000000|777\\n`);\n else if (dirs.has(statPath)) control.stdout(`directory|4096|1700000000|755\\n`);\n else if (files.has(statPath))\n control.stdout(`regular file|${files.get(statPath)?.byteLength ?? 0}|1700000000|644\\n`);\n else control.stdout('missing\\n');\n control.exit(0);\n return true;\n }\n const listPath = leading('[ -d ');\n if (listPath != null && script.includes('find ')) {\n if (!dirs.has(listPath)) {\n control.stderr('Not a directory\\n');\n control.exit(2);\n return true;\n }\n const entries: string[] = [];\n for (const dir of dirs) {\n if (dir !== listPath && posix.dirname(dir) === listPath)\n entries.push(`d\\t4096\\t${posix.basename(dir)}\\0`);\n }\n for (const [path, content] of files) {\n if (posix.dirname(path) === listPath)\n entries.push(`f\\t${content.byteLength}\\t${posix.basename(path)}\\0`);\n }\n control.stdout(entries.join(''));\n control.exit(0);\n return true;\n }\n const mkdirPath = leading('mkdir -p -- ');\n if (mkdirPath != null) {\n mkdirp(mkdirPath);\n control.exit(0);\n return true;\n }\n const removePath = leading('if [ -d ');\n if (removePath != null && script.includes('rm')) {\n if (dirs.has(removePath)) {\n for (const dir of [...dirs])\n if (dir === removePath || dir.startsWith(`${removePath}/`)) dirs.delete(dir);\n for (const path of [...files.keys()])\n if (path.startsWith(`${removePath}/`)) files.delete(path);\n } else if (files.has(removePath)) {\n files.delete(removePath);\n } else if (!script.includes('-f')) {\n control.stderr(`rm: cannot remove: No such file or directory\\n`);\n control.exit(1);\n return true;\n }\n control.exit(0);\n return true;\n }\n if (script.includes('git clone')) {\n const destination = quotedAfter(script.slice(script.indexOf('git clone')), \"' \");\n if (destination != null) mkdirp(`${destination}/.git`);\n control.exit(0);\n return true;\n }\n // Enough of a shell for the conformance kit's process cases.\n if (script === 'cat') {\n control.onStdin((data) => control.stdout(data));\n control.onEof(() => control.exit(0));\n return true;\n }\n if (script.startsWith('sleep ')) return true;\n if (script === 'echo out; echo err >&2; exit 3') {\n control.stdout('out\\n');\n control.stderr('err\\n');\n control.exit(3);\n return true;\n }\n if (script.startsWith('printenv ')) {\n const name = script.slice('printenv '.length);\n const value = Object.hasOwn(control.exec.env, name) ? control.exec.env[name] : undefined;\n if (value != null) control.stdout(`${value}\\n`);\n control.exit(value == null ? 1 : 0);\n return true;\n }\n if (script === 'echo' || script.startsWith('echo ')) {\n control.stdout(`${script.slice('echo '.length)}\\n`);\n control.exit(0);\n return true;\n }\n return false;\n };\n\n const exec: FakeMachineIface['exec'] = (args) => {\n const record: FakeExecIface = {\n command: args.command,\n script: unwrapCommand(args.command),\n cwd: args.cwd,\n env: args.env,\n };\n execs.push(record);\n const stdinListeners: ((data: Uint8Array) => void)[] = [];\n const eofListeners: (() => void)[] = [];\n let waiters: (() => void)[] = [];\n const notify = (): void => {\n const pending = waiters;\n waiters = [];\n for (const wake of pending) wake();\n };\n const process: FakeProcessIface = {\n id: args.id,\n bootId: 'boot-1',\n exec: record,\n stdout: new Uint8Array(),\n stderr: new Uint8Array(),\n exited: false,\n exitCode: null,\n signal: null,\n write: (data) => {\n for (const listener of stdinListeners) listener(data);\n },\n eof: () => {\n for (const listener of eofListeners) listener();\n },\n terminate: (signal) => {\n if (process.exited) return;\n process.exited = true;\n process.signal = signal ?? 'SIGKILL';\n notify();\n },\n changed: (ms) =>\n new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n waiters.push(() => {\n clearTimeout(timer);\n resolve();\n });\n }),\n };\n const control: FakeProcessControlIface = {\n exec: record,\n stdout: (data) => {\n process.stdout = concatBytes([process.stdout, bytes(data)]);\n notify();\n },\n stderr: (data) => {\n process.stderr = concatBytes([process.stderr, bytes(data)]);\n notify();\n },\n exit: (code, signal = null) => {\n if (process.exited) return;\n process.exited = true;\n process.exitCode = signal == null ? code : null;\n process.signal = signal;\n notify();\n },\n onStdin: (listener) => stdinListeners.push(listener),\n onEof: (listener) => eofListeners.push(listener),\n };\n processes.set(args.id, process);\n const custom = behaviors.find((entry) => entry.match(record));\n if (custom != null) custom.behavior(control);\n else if (!builtin(control)) control.exit(0);\n return process;\n };\n\n return {\n files,\n dirs,\n links,\n execs,\n processes,\n on: (match, behavior) => behaviors.push({ match, behavior }),\n exec,\n mkdirp,\n readText: (path) => {\n const content = files.get(path);\n return content == null ? null : new TextDecoder().decode(content);\n },\n };\n};\n\n// Output from offsets, waiting up to `waitMs` (capped for fast tests) for news.\nexport const readFakeOutput = async (\n process: FakeProcessIface,\n offsets: { stdout: number; stderr: number; waitMs: number },\n): Promise<{ stdout: Uint8Array; stderr: Uint8Array; exited: boolean }> => {\n if (\n !process.exited &&\n process.stdout.byteLength <= offsets.stdout &&\n process.stderr.byteLength <= offsets.stderr &&\n offsets.waitMs > 0\n ) {\n await process.changed(Math.min(offsets.waitMs, 50));\n }\n return {\n stdout: process.stdout.subarray(offsets.stdout),\n stderr: process.stderr.subarray(offsets.stderr),\n exited: process.exited,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@finalai/final-agent-provider",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Final's provider package: serverless, remote and local harnesses; the computer and device sandboxes; the messaging, schedule and event channels.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -210,12 +210,12 @@
|
|
|
210
210
|
"@agentclientprotocol/sdk": "1.8.0",
|
|
211
211
|
"@finalai/acp-session": "0.1.4",
|
|
212
212
|
"@finalai/agent-protocol": "0.1.4",
|
|
213
|
-
"@finalai/agent-provider": "0.1.
|
|
213
|
+
"@finalai/agent-provider": "0.1.7",
|
|
214
214
|
"@finalai/computers": "0.1.4",
|
|
215
215
|
"@finalai/websockets": "0.1.4",
|
|
216
216
|
"ws": "^8.21.3",
|
|
217
217
|
"zod": "4.6.5",
|
|
218
|
-
"@finalai/agent-definition": "0.1.
|
|
218
|
+
"@finalai/agent-definition": "0.1.6"
|
|
219
219
|
},
|
|
220
220
|
"engines": {
|
|
221
221
|
"node": ">=26"
|