@finalai/final-agent-provider 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/modules/channel-factories.d.mts +3 -1
  2. package/dist/modules/channel-factories.mjs +32 -18
  3. package/dist/modules/channel-factories.mjs.map +2 -2
  4. package/dist/modules/channels/address-context.mjs +16 -53
  5. package/dist/modules/channels/address-context.mjs.map +3 -3
  6. package/dist/modules/channels/agent-events.d.mts +3 -29
  7. package/dist/modules/channels/agent-events.mjs +67 -146
  8. package/dist/modules/channels/agent-events.mjs.map +3 -3
  9. package/dist/modules/channels/agent-schedules.d.mts +1 -0
  10. package/dist/modules/channels/agent-schedules.mjs +18 -19
  11. package/dist/modules/channels/agent-schedules.mjs.map +2 -2
  12. package/dist/modules/channels/delivery.d.mts +1 -1
  13. package/dist/modules/channels/delivery.mjs +5 -23
  14. package/dist/modules/channels/delivery.mjs.map +2 -2
  15. package/dist/modules/channels/fake-platform.d.mts +6 -1
  16. package/dist/modules/channels/fake-platform.mjs +31 -12
  17. package/dist/modules/channels/fake-platform.mjs.map +2 -2
  18. package/dist/modules/channels/index.d.mts +1 -0
  19. package/dist/modules/channels/index.mjs +1 -0
  20. package/dist/modules/channels/index.mjs.map +2 -2
  21. package/dist/modules/channels/prompt.d.mts +19 -2
  22. package/dist/modules/channels/prompt.mjs +44 -17
  23. package/dist/modules/channels/prompt.mjs.map +2 -2
  24. package/dist/modules/channels/routing.mjs +1 -15
  25. package/dist/modules/channels/routing.mjs.map +2 -2
  26. package/dist/modules/channels/service-input.d.mts +22 -0
  27. package/dist/modules/channels/service-input.mjs +32 -0
  28. package/dist/modules/channels/service-input.mjs.map +7 -0
  29. package/dist/modules/sandboxes/computer.d.mts +2 -0
  30. package/dist/modules/sandboxes/computer.mjs +52 -7
  31. package/dist/modules/sandboxes/computer.mjs.map +3 -3
  32. package/dist/modules/sandboxes/device.d.mts +2 -0
  33. package/dist/modules/sandboxes/device.mjs +26 -3
  34. package/dist/modules/sandboxes/device.mjs.map +2 -2
  35. package/dist/modules/sandboxes/testing/fake-backends.d.mts +3 -0
  36. package/dist/modules/sandboxes/testing/fake-backends.mjs +35 -3
  37. package/dist/modules/sandboxes/testing/fake-backends.mjs.map +2 -2
  38. package/package.json +5 -5
@@ -7,7 +7,16 @@ import { posix } from "node:path";
7
7
  import * as z from "zod";
8
8
  import { concatBytes, decodeBase64, encodeBase64 } from "../bytes.mjs";
9
9
  import { createFakeMachine, readFakeOutput } from "./fake-machine.mjs";
10
- const STATE = { Running: 3, Paused: 4, Stopped: 5, Deleted: 9, Shelved: 10 };
10
+ const STATE = {
11
+ Pending: 1,
12
+ Running: 3,
13
+ Paused: 4,
14
+ Stopped: 5,
15
+ Resuming: 6,
16
+ Deleted: 9,
17
+ Shelved: 10
18
+ };
19
+ const NOT_RUNNING = "Computer is not running; resume it explicitly before this operation";
11
20
  const FAKE_COMPUTERS_API_KEY = "fk_org_api_key";
12
21
  const FAKE_PLATFORM_SANDBOX_IMAGE = "cimv_0190e0000000700080000000000001";
13
22
  const json = (body, status = 200) => new Response(JSON.stringify(body), { status, headers: { "content-type": "application/json" } });
@@ -59,6 +68,16 @@ const createFakeComputersApi = (args = {}) => {
59
68
  const shelveReads = { count: 0 };
60
69
  const shelving = /* @__PURE__ */ new Map();
61
70
  const imageBuildReads = { count: 1 };
71
+ const bootReads = { count: 1 };
72
+ const booting = /* @__PURE__ */ new Map();
73
+ const boot = (computer, state) => {
74
+ if (bootReads.count <= 0) {
75
+ computer.state = STATE.Running;
76
+ return;
77
+ }
78
+ computer.state = state;
79
+ booting.set(computer.id, bootReads.count);
80
+ };
62
81
  const imageReads = /* @__PURE__ */ new Map();
63
82
  const bases = /* @__PURE__ */ new Map();
64
83
  const baseCaptureReads = { count: 1 };
@@ -134,10 +153,11 @@ const createFakeComputersApi = (args = {}) => {
134
153
  const computer2 = {
135
154
  id,
136
155
  name,
137
- state: STATE.Running,
156
+ state: STATE.Pending,
138
157
  body: jsonObjectSchema.parse(body),
139
158
  machine: args.machineFor?.({ id, name }) ?? createFakeMachine()
140
159
  };
160
+ boot(computer2, STATE.Pending);
141
161
  computers.set(id, computer2);
142
162
  if (key != null) byIdempotency.set(key, id);
143
163
  return json({ computer: wire(computer2) });
@@ -236,6 +256,13 @@ const createFakeComputersApi = (args = {}) => {
236
256
  installed: args.computerUseAvailable ?? false
237
257
  });
238
258
  if (request.method === "GET" && rest === "") {
259
+ const starting = booting.get(computer.id);
260
+ if (starting != null) {
261
+ if (starting <= 0) {
262
+ booting.delete(computer.id);
263
+ computer.state = STATE.Running;
264
+ } else booting.set(computer.id, starting - 1);
265
+ }
239
266
  const left = shelving.get(computer.id);
240
267
  if (left != null) {
241
268
  if (left <= 0) {
@@ -268,8 +295,10 @@ const createFakeComputersApi = (args = {}) => {
268
295
  actions.push({ computerId: computer.id, action: name });
269
296
  if (actionConflicts.has(name))
270
297
  return json({ error: "a lifecycle transition is committing" }, 409);
298
+ if (name !== "resume" && name !== "start") booting.delete(computer.id);
271
299
  if (name === "pause") computer.state = STATE.Paused;
272
- if (name === "resume" || name === "start") computer.state = STATE.Running;
300
+ if (name === "resume") boot(computer, STATE.Resuming);
301
+ if (name === "start") boot(computer, STATE.Pending);
273
302
  if (name === "stop") {
274
303
  computer.state = shelveReads.count > 0 ? STATE.Stopped : STATE.Shelved;
275
304
  if (shelveReads.count > 0) shelving.set(computer.id, shelveReads.count);
@@ -277,6 +306,8 @@ const createFakeComputersApi = (args = {}) => {
277
306
  if (name === "delete") computer.state = STATE.Deleted;
278
307
  return json({ computer: wire(computer) });
279
308
  }
309
+ if (computer.state !== STATE.Running && (rest === "/exec" || rest === "/run" || rest === "/files" || rest.startsWith("/processes/")))
310
+ return json({ error: NOT_RUNNING }, 409);
280
311
  if (request.method === "POST" && (rest === "/exec" || rest === "/run")) {
281
312
  const parsed = z.object({
282
313
  command: z.string(),
@@ -365,6 +396,7 @@ const createFakeComputersApi = (args = {}) => {
365
396
  actionConflicts,
366
397
  shelveReads,
367
398
  imageBuildReads,
399
+ bootReads,
368
400
  computerByName: (name) => [...computers.values()].find((computer) => computer.name === name)
369
401
  };
370
402
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/sandboxes/testing/fake-backends.ts"],
4
- "sourcesContent": ["import {\n jsonObjectSchema,\n jsonValueSchema,\n type JsonObject,\n type JsonValue,\n} from '@finalai/agent-provider';\nimport { ComputerEgressPolicy } from '@finalai/computers';\nimport { posix } from 'node:path';\nimport * as z from 'zod';\nimport { concatBytes, decodeBase64, encodeBase64 } from \"../bytes.mjs\";\nimport { createFakeMachine, readFakeOutput, type FakeMachineIface } from \"./fake-machine.mjs\";\n\n// A fake public Computers API (vm-service `/v1` over fetch, API-key bearer),\n// backed by in-memory machines. The `device` provider's fakes live with the\n// Device API (device-api-service/src/testing), which it is tested against.\n\nexport interface FakeComputerIface {\n id: string;\n name: string;\n state: number;\n body: JsonObject;\n machine: FakeMachineIface;\n}\n\nexport interface FakeImageIface {\n id: string;\n source: 'platform' | 'customer';\n reference: string;\n lineage: string;\n state: 'pending' | 'building' | 'ready' | 'failed' | 'expired';\n error: string | null;\n}\n\nexport interface FakeBaseIface {\n id: string;\n computerId: string;\n state: 'capturing' | 'ready' | 'failed' | 'expired';\n error: string | null;\n retained: boolean;\n}\n\nexport interface FakeComputersApiIface {\n fetch: typeof fetch;\n computers: Map<string, FakeComputerIface>;\n images: Map<string, FakeImageIface>;\n bases: Map<string, FakeBaseIface>;\n // Base reads a fresh capture answers `capturing` before it settles.\n baseCaptureReads: { count: number };\n // Set: the next captures settle `failed` with this error instead of `ready`.\n captureFailure: { error: string | null };\n requests: { method: string; path: string; body: JsonValue; headers: Headers }[];\n actions: { computerId: string; action: string }[];\n // Actions answered 409 (a conflicting transition) without changing the computer.\n actionConflicts: Set<string>;\n // Computer reads a stopped computer answers `stopped` before it is shelved.\n shelveReads: { count: number };\n // Image reads a fresh registration answers `building` before it is ready.\n imageBuildReads: { count: number };\n computerByName(name: string): FakeComputerIface | undefined;\n}\n\nconst STATE = { Running: 3, Paused: 4, Stopped: 5, Deleted: 9, Shelved: 10 } as const;\nexport const FAKE_COMPUTERS_API_KEY = 'fk_org_api_key';\nexport const FAKE_PLATFORM_SANDBOX_IMAGE = 'cimv_0190e0000000700080000000000001';\n\nconst json = (body: JsonValue, status = 200): Response =>\n new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });\n\n// What POST /v1/computers accepts (vm-service/src/routes/v1.ts); anything else,\n// such as the internal surface's image, lineage, projectArtifact or the\n// platform-only policies, is refused so a test fails when the provider asks for it.\nconst createComputerSchema = z.strictObject({\n name: z.string().optional(),\n regionSlug: z.string().optional(),\n imageVersionId: z.string().startsWith('cimv_').optional(),\n baseId: z.string().startsWith('part_').optional(),\n idlePolicy: z.enum(['shelve', 'pause', 'delete']).optional(),\n network: z\n .strictObject({\n egress: z.nativeEnum(ComputerEgressPolicy),\n allow: z.array(z.string()).optional(),\n })\n .optional(),\n teamId: z.string().startsWith('team_').optional(),\n vcpu: z.number().optional(),\n memoryMb: z.number().optional(),\n diskGb: z.number().optional(),\n userVolumeGb: z.number().nullable().optional(),\n env: z.record(z.string(), z.string()).optional(),\n setupScript: z.string().optional(),\n commandMode: z.number().optional(),\n customCommand: z.string().optional(),\n httpPort: z.number().optional(),\n httpPublic: z.boolean().optional(),\n ephemeral: z.boolean().optional(),\n idleTimeoutSeconds: z.number().optional(),\n autoResume: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n comment: z.string().optional(),\n});\n\nexport const createFakeComputersApi = (\n args: {\n machineFor?: (computer: { id: string; name: string }) => FakeMachineIface;\n computerUseAvailable?: boolean;\n screenAvailable?: boolean;\n } = {},\n): FakeComputersApiIface => {\n const computers = new Map<string, FakeComputerIface>();\n const images = new Map<string, FakeImageIface>([\n [\n FAKE_PLATFORM_SANDBOX_IMAGE,\n {\n id: FAKE_PLATFORM_SANDBOX_IMAGE,\n source: 'platform',\n reference: 'ghcr.io/final/sandbox:release',\n lineage: 'sandbox',\n state: 'ready',\n error: null,\n },\n ],\n ]);\n const requests: FakeComputersApiIface['requests'] = [];\n const actions: FakeComputersApiIface['actions'] = [];\n const actionConflicts = new Set<string>();\n const shelveReads = { count: 0 };\n const shelving = new Map<string, number>();\n const imageBuildReads = { count: 1 };\n const imageReads = new Map<string, number>();\n const bases = new Map<string, FakeBaseIface>();\n const baseCaptureReads = { count: 1 };\n const captureFailure: FakeComputersApiIface['captureFailure'] = { error: null };\n const captureErrors = new Map<string, string>();\n const baseReads = new Map<string, number>();\n let computerCount = 0;\n const byIdempotency = new Map<string, string>();\n\n const wire = (computer: FakeComputerIface) => ({\n id: computer.id,\n name: computer.name,\n state: computer.state,\n imageVersionId: z\n .string()\n .nullable()\n .catch(null)\n .parse(computer.body.imageVersionId ?? null),\n teamId: z\n .string()\n .nullable()\n .catch(null)\n .parse(computer.body.teamId ?? null),\n hostname: `${computer.name}-k3p9x7qd.virtual-machine.lax-2.example`,\n tags: [],\n });\n const imageWire = (image: FakeImageIface) => ({\n ...image,\n digest: `sha256:${image.id}`,\n sizes: ['standard'],\n registryCredentialId: null,\n createdAt: null,\n readyAt: null,\n lastUsedAt: null,\n });\n const baseWire = (base: FakeBaseIface) => ({\n ...base,\n image: 'ghcr.io/final/sandbox:release',\n digest: `sha256:${'b'.repeat(64)}`,\n diskGb: 20,\n createdAt: null,\n readyAt: null,\n lastUsedAt: null,\n });\n const find = (idOrName: string): FakeComputerIface | undefined =>\n computers.get(idOrName) ??\n [...computers.values()].find(\n (computer) => computer.name === idOrName && computer.state !== STATE.Deleted,\n );\n\n const handle = async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const text = request.method === 'GET' ? '' : await request.text();\n const body = text === '' ? null : jsonValueSchema.parse(JSON.parse(text));\n requests.push({ method: request.method, path: url.pathname, body, headers: request.headers });\n if (!url.pathname.startsWith('/v1/')) return json({ error: 'not found' }, 404);\n if (request.headers.get('authorization') !== `Bearer ${FAKE_COMPUTERS_API_KEY}`) {\n return json({ error: 'unauthorized' }, 401);\n }\n const path = url.pathname.slice('/v1'.length);\n if (request.method === 'POST' && path === '/computers') {\n const parsed = createComputerSchema.safeParse(body);\n if (!parsed.success) return json({ error: 'invalid body' }, 400);\n if ((parsed.data.imageVersionId == null) === (parsed.data.baseId == null)) {\n return json({ error: 'pass exactly one of imageVersionId and baseId' }, 400);\n }\n if (parsed.data.imageVersionId != null) {\n const image = images.get(parsed.data.imageVersionId);\n if (image == null) return json({ error: 'image version not found' }, 404);\n if (image.state !== 'ready') return json({ error: `image version is ${image.state}` }, 409);\n }\n if (parsed.data.baseId != null) {\n const base = bases.get(parsed.data.baseId);\n if (base == null) return json({ error: 'base not found' }, 404);\n if (base.state !== 'ready') return json({ error: `base is ${base.state}` }, 409);\n }\n const key = request.headers.get('idempotency-key');\n if (parsed.data.ephemeral === true && parsed.data.idlePolicy === 'pause')\n return json({ error: 'ephemeral VMs are always deleted when idle' }, 400);\n const existing = key == null ? undefined : computers.get(byIdempotency.get(key) ?? '');\n if (existing != null) return json({ computer: wire(existing) });\n computerCount += 1;\n const id = `comp_0190a0000000700080000000${String(computerCount).padStart(4, '0')}`;\n const name = parsed.data.name ?? `computer-${computerCount}`;\n const computer: FakeComputerIface = {\n id,\n name,\n state: STATE.Running,\n body: jsonObjectSchema.parse(body),\n machine: args.machineFor?.({ id, name }) ?? createFakeMachine(),\n };\n computers.set(id, computer);\n if (key != null) byIdempotency.set(key, id);\n return json({ computer: wire(computer) });\n }\n if (request.method === 'GET' && path === '/images') {\n const lineage = url.searchParams.get('lineage');\n const state = url.searchParams.get('state');\n const matching = [...images.values()]\n .filter((image) => lineage == null || image.lineage === lineage)\n .filter((image) => state == null || image.state === state)\n .reverse();\n return json({ images: matching.map(imageWire) });\n }\n if (request.method === 'POST' && path === '/images') {\n const parsed = z\n .strictObject({\n reference: z.string(),\n registryCredentialId: z.string().optional(),\n sizes: z.array(z.string()).optional(),\n })\n .safeParse(body);\n if (!parsed.success) return json({ error: 'invalid body' }, 400);\n const known = [...images.values()].find(\n (image) =>\n image.reference === parsed.data.reference &&\n (image.state === 'pending' || image.state === 'building' || image.state === 'ready'),\n );\n if (known != null) return json({ image: imageWire(known) });\n const id = `cimv_0190f0000000700080000000${String(images.size + 1).padStart(4, '0')}`;\n const image: FakeImageIface = {\n id,\n source: 'customer',\n reference: parsed.data.reference,\n lineage: parsed.data.reference,\n state: 'building',\n error: null,\n };\n images.set(id, image);\n return json({ image: imageWire(image) }, 201);\n }\n const imageMatch = /^\\/images\\/([^/]+)$/.exec(path);\n if (request.method === 'GET' && imageMatch != null) {\n const image = images.get(decodeURIComponent(imageMatch[1] ?? ''));\n if (image == null) return json({ error: 'image not found' }, 404);\n const reads = (imageReads.get(image.id) ?? 0) + 1;\n imageReads.set(image.id, reads);\n if (image.state === 'building' && reads > imageBuildReads.count) image.state = 'ready';\n return json({ image: imageWire(image) });\n }\n if (request.method === 'POST' && path === '/tokens') {\n const parsed = z\n .strictObject({\n name: z.string(),\n computerId: z.string().startsWith('comp_').optional(),\n scopes: z.array(z.string()).optional(),\n expiresAt: z.string().optional(),\n })\n .safeParse(body);\n if (!parsed.success) return json({ error: 'invalid body' }, 400);\n return json({ id: 'ctok_1', token: 'fvm1.http-token' });\n }\n const baseMatch = /^\\/bases\\/([^/]+)$/.exec(path);\n if (request.method === 'PATCH' && baseMatch != null) {\n const base = bases.get(decodeURIComponent(baseMatch[1] ?? ''));\n if (base == null) return json({ error: 'base not found' }, 404);\n const retained = z.object({ retained: z.boolean() }).parse(body);\n base.retained = retained.retained;\n return json({ base: baseWire(base) });\n }\n if (request.method === 'GET' && baseMatch != null) {\n const base = bases.get(decodeURIComponent(baseMatch[1] ?? ''));\n if (base == null) return json({ error: 'base not found' }, 404);\n const reads = (baseReads.get(base.id) ?? 0) + 1;\n baseReads.set(base.id, reads);\n if (base.state === 'capturing' && reads > baseCaptureReads.count) {\n const error = captureErrors.get(base.id) ?? null;\n base.state = error == null ? 'ready' : 'failed';\n base.error = error;\n }\n return json({ base: baseWire(base) });\n }\n const computerMatch = /^\\/computers\\/([^/]+)(\\/.*)?$/.exec(path);\n if (computerMatch == null) return json({ error: `no route ${path}` }, 404);\n const computer = find(decodeURIComponent(computerMatch[1] ?? ''));\n if (computer == null || computer.state === STATE.Deleted)\n return json({ error: 'computer not found' }, 404);\n const rest = computerMatch[2] ?? '';\n const machine = computer.machine;\n if (request.method === 'GET' && rest === '/screen')\n return json({ available: args.screenAvailable ?? false });\n if (request.method === 'POST' && rest === '/screen')\n return json({\n url: `https://computer-api.example/v1/computers/${computer.id}/screen/view#screen-token`,\n token: 'screen-token',\n expiresAt: new Date(Date.now() + 900_000).toISOString(),\n });\n if (request.method === 'PATCH' && rest === '') {\n const patch = createComputerSchema.pick({ network: true }).parse(body);\n if (patch.network != null) computer.body.network = patch.network;\n return json({ computer: wire(computer) });\n }\n if (request.method === 'GET' && rest === '/computer-use')\n return json({\n available: args.computerUseAvailable ?? false,\n installed: args.computerUseAvailable ?? false,\n });\n if (request.method === 'GET' && rest === '') {\n const left = shelving.get(computer.id);\n if (left != null) {\n if (left <= 0) {\n shelving.delete(computer.id);\n computer.state = STATE.Shelved;\n } else shelving.set(computer.id, left - 1);\n }\n return json({ computer: wire(computer) });\n }\n if (request.method === 'POST' && rest === '/capture') {\n if (computer.state !== STATE.Running) return json({ error: 'not running' }, 409);\n if (computer.body.userVolumeGb !== null) return json({ error: 'has a user volume' }, 409);\n const id = `part_0190b0000000700080000000${String(bases.size + 1).padStart(4, '0')}`;\n const capture = z.object({ retained: z.boolean().default(false) }).parse(body ?? {});\n const base: FakeBaseIface = {\n id,\n computerId: computer.id,\n state: 'capturing',\n error: null,\n retained: capture.retained,\n };\n bases.set(id, base);\n if (captureFailure.error != null) captureErrors.set(id, captureFailure.error);\n computer.state = STATE.Stopped;\n return json({ base: baseWire(base) }, 202);\n }\n const action = /^\\/actions\\/(.+)$/.exec(rest);\n if (request.method === 'POST' && action != null) {\n const name = action[1] ?? '';\n actions.push({ computerId: computer.id, action: name });\n if (actionConflicts.has(name))\n return json({ error: 'a lifecycle transition is committing' }, 409);\n if (name === 'pause') computer.state = STATE.Paused;\n if (name === 'resume' || name === 'start') computer.state = STATE.Running;\n // A computer that is not ephemeral shelves on stop (vm-service vm-ops).\n if (name === 'stop') {\n computer.state = shelveReads.count > 0 ? STATE.Stopped : STATE.Shelved;\n if (shelveReads.count > 0) shelving.set(computer.id, shelveReads.count);\n }\n if (name === 'delete') computer.state = STATE.Deleted;\n return json({ computer: wire(computer) });\n }\n if (request.method === 'POST' && (rest === '/exec' || rest === '/run')) {\n const parsed = z\n .object({\n command: z.string(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n })\n .parse(body);\n const process = machine.exec({\n id: `proc-${machine.execs.length + 1}`,\n command: parsed.command,\n cwd: parsed.cwd ?? '/',\n env: parsed.env ?? {},\n });\n if (rest === '/exec')\n return json({ id: process.id, bootId: process.bootId, pid: 1, state: 'running' });\n const output = await readFakeOutput(process, { stdout: 0, stderr: 0, waitMs: 50 });\n return json({\n id: process.id,\n bootId: process.bootId,\n pid: 1,\n timedOut: false,\n elapsedMs: 1,\n ...outputBody(output, process, 0, 0),\n });\n }\n const processMatch = /^\\/processes\\/([^/]+)\\/(output|input|terminate)$/.exec(rest);\n if (processMatch != null) {\n const process = machine.processes.get(processMatch[1] ?? '');\n if (process == null) return json({ error: 'process not found' }, 404);\n if (processMatch[2] === 'output') {\n const stdoutOffset = Number(url.searchParams.get('stdoutOffset') ?? 0);\n const stderrOffset = Number(url.searchParams.get('stderrOffset') ?? 0);\n const output = await readFakeOutput(process, {\n stdout: stdoutOffset,\n stderr: stderrOffset,\n waitMs: Number(url.searchParams.get('waitMs') ?? 0),\n });\n return json(outputBody(output, process, stdoutOffset, stderrOffset));\n }\n if (processMatch[2] === 'terminate') {\n process.terminate();\n return json({ ok: true });\n }\n const input = z\n .object({\n dataB64: z.string().optional(),\n eof: z.boolean().optional(),\n signal: z.string().optional(),\n })\n .parse(body);\n if (input.dataB64 != null) process.write(decodeBase64(input.dataB64));\n if (input.eof === true) process.eof();\n if (input.signal != null) process.terminate(input.signal);\n return json({ ok: true });\n }\n if (rest === '/files' && request.method === 'GET') {\n const path = url.searchParams.get('path') ?? '';\n // Reads follow symlinks.\n const content = machine.files.get(machine.links.get(path) ?? path);\n if (content == null) return json({ error: `${path}: No such file or directory` }, 502);\n const offset = Number(url.searchParams.get('offset') ?? 0);\n const length = Number(url.searchParams.get('length') ?? content.byteLength);\n const slice = content.subarray(offset, offset + length);\n return json({\n dataB64: encodeBase64(slice),\n eof: offset + slice.byteLength >= content.byteLength,\n offset,\n });\n }\n if (rest === '/files' && request.method === 'PUT') {\n const parsed = z\n .object({ path: z.string(), dataB64: z.string(), append: z.boolean().optional() })\n .parse(body);\n if (!machine.dirs.has(posix.dirname(parsed.path)))\n return json({ error: 'No such file or directory' }, 502);\n const data = decodeBase64(parsed.dataB64);\n const previous =\n parsed.append === true\n ? (machine.files.get(parsed.path) ?? new Uint8Array())\n : new Uint8Array();\n machine.files.set(parsed.path, concatBytes([previous, data]));\n return json({ bytesWritten: data.byteLength });\n }\n return json({ error: `no route ${request.method} ${path}` }, 404);\n };\n\n return {\n fetch: async (input, init) => handle(new Request(input, init)),\n computers,\n images,\n bases,\n baseCaptureReads,\n captureFailure,\n requests,\n actions,\n actionConflicts,\n shelveReads,\n imageBuildReads,\n computerByName: (name) => [...computers.values()].find((computer) => computer.name === name),\n };\n};\n\nconst outputBody = (\n output: { stdout: Uint8Array; stderr: Uint8Array; exited: boolean },\n process: {\n exitCode: number | null;\n signal: string | null;\n stdout: Uint8Array;\n stderr: Uint8Array;\n },\n stdoutOffset: number,\n stderrOffset: number,\n) => ({\n stdout: {\n dataB64: encodeBase64(output.stdout),\n offset: stdoutOffset,\n nextOffset: stdoutOffset + output.stdout.byteLength,\n eof: output.exited && stdoutOffset + output.stdout.byteLength >= process.stdout.byteLength,\n },\n stderr: {\n dataB64: encodeBase64(output.stderr),\n offset: stderrOffset,\n nextOffset: stderrOffset + output.stderr.byteLength,\n eof: output.exited && stderrOffset + output.stderr.byteLength >= process.stderr.byteLength,\n },\n state: output.exited ? 'exited' : 'running',\n result: output.exited ? { exitCode: process.exitCode, signal: process.signal } : null,\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n jsonObjectSchema,\n jsonValueSchema,\n type JsonObject,\n type JsonValue,\n} from '@finalai/agent-provider';\nimport { ComputerEgressPolicy } from '@finalai/computers';\nimport { posix } from 'node:path';\nimport * as z from 'zod';\nimport { concatBytes, decodeBase64, encodeBase64 } from \"../bytes.mjs\";\nimport { createFakeMachine, readFakeOutput, type FakeMachineIface } from \"./fake-machine.mjs\";\n\n// A fake public Computers API (vm-service `/v1` over fetch, API-key bearer),\n// backed by in-memory machines. The `device` provider's fakes live with the\n// Device API (device-api-service/src/testing), which it is tested against.\n\nexport interface FakeComputerIface {\n id: string;\n name: string;\n state: number;\n body: JsonObject;\n machine: FakeMachineIface;\n}\n\nexport interface FakeImageIface {\n id: string;\n source: 'platform' | 'customer';\n reference: string;\n lineage: string;\n state: 'pending' | 'building' | 'ready' | 'failed' | 'expired';\n error: string | null;\n}\n\nexport interface FakeBaseIface {\n id: string;\n computerId: string;\n state: 'capturing' | 'ready' | 'failed' | 'expired';\n error: string | null;\n retained: boolean;\n}\n\nexport interface FakeComputersApiIface {\n fetch: typeof fetch;\n computers: Map<string, FakeComputerIface>;\n images: Map<string, FakeImageIface>;\n bases: Map<string, FakeBaseIface>;\n // Base reads a fresh capture answers `capturing` before it settles.\n baseCaptureReads: { count: number };\n // Set: the next captures settle `failed` with this error instead of `ready`.\n captureFailure: { error: string | null };\n requests: { method: string; path: string; body: JsonValue; headers: Headers }[];\n actions: { computerId: string; action: string }[];\n // Actions answered 409 (a conflicting transition) without changing the computer.\n actionConflicts: Set<string>;\n // Computer reads a stopped computer answers `stopped` before it is shelved.\n shelveReads: { count: number };\n // Image reads a fresh registration answers `building` before it is ready.\n imageBuildReads: { count: number };\n // Computer reads a created or started computer answers `pending` (a resumed\n // one `resuming`) before it runs; until then commands and files answer 409.\n bootReads: { count: number };\n computerByName(name: string): FakeComputerIface | undefined;\n}\n\nconst STATE = {\n Pending: 1,\n Running: 3,\n Paused: 4,\n Stopped: 5,\n Resuming: 6,\n Deleted: 9,\n Shelved: 10,\n} as const;\nconst NOT_RUNNING = 'Computer is not running; resume it explicitly before this operation';\nexport const FAKE_COMPUTERS_API_KEY = 'fk_org_api_key';\nexport const FAKE_PLATFORM_SANDBOX_IMAGE = 'cimv_0190e0000000700080000000000001';\n\nconst json = (body: JsonValue, status = 200): Response =>\n new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });\n\n// What POST /v1/computers accepts (vm-service/src/routes/v1.ts); anything else,\n// such as the internal surface's image, lineage, projectArtifact or the\n// platform-only policies, is refused so a test fails when the provider asks for it.\nconst createComputerSchema = z.strictObject({\n name: z.string().optional(),\n regionSlug: z.string().optional(),\n imageVersionId: z.string().startsWith('cimv_').optional(),\n baseId: z.string().startsWith('part_').optional(),\n idlePolicy: z.enum(['shelve', 'pause', 'delete']).optional(),\n network: z\n .strictObject({\n egress: z.nativeEnum(ComputerEgressPolicy),\n allow: z.array(z.string()).optional(),\n })\n .optional(),\n teamId: z.string().startsWith('team_').optional(),\n vcpu: z.number().optional(),\n memoryMb: z.number().optional(),\n diskGb: z.number().optional(),\n userVolumeGb: z.number().nullable().optional(),\n env: z.record(z.string(), z.string()).optional(),\n setupScript: z.string().optional(),\n commandMode: z.number().optional(),\n customCommand: z.string().optional(),\n httpPort: z.number().optional(),\n httpPublic: z.boolean().optional(),\n ephemeral: z.boolean().optional(),\n idleTimeoutSeconds: z.number().optional(),\n autoResume: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n comment: z.string().optional(),\n});\n\nexport const createFakeComputersApi = (\n args: {\n machineFor?: (computer: { id: string; name: string }) => FakeMachineIface;\n computerUseAvailable?: boolean;\n screenAvailable?: boolean;\n } = {},\n): FakeComputersApiIface => {\n const computers = new Map<string, FakeComputerIface>();\n const images = new Map<string, FakeImageIface>([\n [\n FAKE_PLATFORM_SANDBOX_IMAGE,\n {\n id: FAKE_PLATFORM_SANDBOX_IMAGE,\n source: 'platform',\n reference: 'ghcr.io/final/sandbox:release',\n lineage: 'sandbox',\n state: 'ready',\n error: null,\n },\n ],\n ]);\n const requests: FakeComputersApiIface['requests'] = [];\n const actions: FakeComputersApiIface['actions'] = [];\n const actionConflicts = new Set<string>();\n const shelveReads = { count: 0 };\n const shelving = new Map<string, number>();\n const imageBuildReads = { count: 1 };\n const bootReads = { count: 1 };\n const booting = new Map<string, number>();\n const boot = (computer: FakeComputerIface, state: number) => {\n if (bootReads.count <= 0) {\n computer.state = STATE.Running;\n return;\n }\n computer.state = state;\n booting.set(computer.id, bootReads.count);\n };\n const imageReads = new Map<string, number>();\n const bases = new Map<string, FakeBaseIface>();\n const baseCaptureReads = { count: 1 };\n const captureFailure: FakeComputersApiIface['captureFailure'] = { error: null };\n const captureErrors = new Map<string, string>();\n const baseReads = new Map<string, number>();\n let computerCount = 0;\n const byIdempotency = new Map<string, string>();\n\n const wire = (computer: FakeComputerIface) => ({\n id: computer.id,\n name: computer.name,\n state: computer.state,\n imageVersionId: z\n .string()\n .nullable()\n .catch(null)\n .parse(computer.body.imageVersionId ?? null),\n teamId: z\n .string()\n .nullable()\n .catch(null)\n .parse(computer.body.teamId ?? null),\n hostname: `${computer.name}-k3p9x7qd.virtual-machine.lax-2.example`,\n tags: [],\n });\n const imageWire = (image: FakeImageIface) => ({\n ...image,\n digest: `sha256:${image.id}`,\n sizes: ['standard'],\n registryCredentialId: null,\n createdAt: null,\n readyAt: null,\n lastUsedAt: null,\n });\n const baseWire = (base: FakeBaseIface) => ({\n ...base,\n image: 'ghcr.io/final/sandbox:release',\n digest: `sha256:${'b'.repeat(64)}`,\n diskGb: 20,\n createdAt: null,\n readyAt: null,\n lastUsedAt: null,\n });\n const find = (idOrName: string): FakeComputerIface | undefined =>\n computers.get(idOrName) ??\n [...computers.values()].find(\n (computer) => computer.name === idOrName && computer.state !== STATE.Deleted,\n );\n\n const handle = async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const text = request.method === 'GET' ? '' : await request.text();\n const body = text === '' ? null : jsonValueSchema.parse(JSON.parse(text));\n requests.push({ method: request.method, path: url.pathname, body, headers: request.headers });\n if (!url.pathname.startsWith('/v1/')) return json({ error: 'not found' }, 404);\n if (request.headers.get('authorization') !== `Bearer ${FAKE_COMPUTERS_API_KEY}`) {\n return json({ error: 'unauthorized' }, 401);\n }\n const path = url.pathname.slice('/v1'.length);\n if (request.method === 'POST' && path === '/computers') {\n const parsed = createComputerSchema.safeParse(body);\n if (!parsed.success) return json({ error: 'invalid body' }, 400);\n if ((parsed.data.imageVersionId == null) === (parsed.data.baseId == null)) {\n return json({ error: 'pass exactly one of imageVersionId and baseId' }, 400);\n }\n if (parsed.data.imageVersionId != null) {\n const image = images.get(parsed.data.imageVersionId);\n if (image == null) return json({ error: 'image version not found' }, 404);\n if (image.state !== 'ready') return json({ error: `image version is ${image.state}` }, 409);\n }\n if (parsed.data.baseId != null) {\n const base = bases.get(parsed.data.baseId);\n if (base == null) return json({ error: 'base not found' }, 404);\n if (base.state !== 'ready') return json({ error: `base is ${base.state}` }, 409);\n }\n const key = request.headers.get('idempotency-key');\n if (parsed.data.ephemeral === true && parsed.data.idlePolicy === 'pause')\n return json({ error: 'ephemeral VMs are always deleted when idle' }, 400);\n const existing = key == null ? undefined : computers.get(byIdempotency.get(key) ?? '');\n if (existing != null) return json({ computer: wire(existing) });\n computerCount += 1;\n const id = `comp_0190a0000000700080000000${String(computerCount).padStart(4, '0')}`;\n const name = parsed.data.name ?? `computer-${computerCount}`;\n const computer: FakeComputerIface = {\n id,\n name,\n state: STATE.Pending,\n body: jsonObjectSchema.parse(body),\n machine: args.machineFor?.({ id, name }) ?? createFakeMachine(),\n };\n boot(computer, STATE.Pending);\n computers.set(id, computer);\n if (key != null) byIdempotency.set(key, id);\n return json({ computer: wire(computer) });\n }\n if (request.method === 'GET' && path === '/images') {\n const lineage = url.searchParams.get('lineage');\n const state = url.searchParams.get('state');\n const matching = [...images.values()]\n .filter((image) => lineage == null || image.lineage === lineage)\n .filter((image) => state == null || image.state === state)\n .reverse();\n return json({ images: matching.map(imageWire) });\n }\n if (request.method === 'POST' && path === '/images') {\n const parsed = z\n .strictObject({\n reference: z.string(),\n registryCredentialId: z.string().optional(),\n sizes: z.array(z.string()).optional(),\n })\n .safeParse(body);\n if (!parsed.success) return json({ error: 'invalid body' }, 400);\n const known = [...images.values()].find(\n (image) =>\n image.reference === parsed.data.reference &&\n (image.state === 'pending' || image.state === 'building' || image.state === 'ready'),\n );\n if (known != null) return json({ image: imageWire(known) });\n const id = `cimv_0190f0000000700080000000${String(images.size + 1).padStart(4, '0')}`;\n const image: FakeImageIface = {\n id,\n source: 'customer',\n reference: parsed.data.reference,\n lineage: parsed.data.reference,\n state: 'building',\n error: null,\n };\n images.set(id, image);\n return json({ image: imageWire(image) }, 201);\n }\n const imageMatch = /^\\/images\\/([^/]+)$/.exec(path);\n if (request.method === 'GET' && imageMatch != null) {\n const image = images.get(decodeURIComponent(imageMatch[1] ?? ''));\n if (image == null) return json({ error: 'image not found' }, 404);\n const reads = (imageReads.get(image.id) ?? 0) + 1;\n imageReads.set(image.id, reads);\n if (image.state === 'building' && reads > imageBuildReads.count) image.state = 'ready';\n return json({ image: imageWire(image) });\n }\n if (request.method === 'POST' && path === '/tokens') {\n const parsed = z\n .strictObject({\n name: z.string(),\n computerId: z.string().startsWith('comp_').optional(),\n scopes: z.array(z.string()).optional(),\n expiresAt: z.string().optional(),\n })\n .safeParse(body);\n if (!parsed.success) return json({ error: 'invalid body' }, 400);\n return json({ id: 'ctok_1', token: 'fvm1.http-token' });\n }\n const baseMatch = /^\\/bases\\/([^/]+)$/.exec(path);\n if (request.method === 'PATCH' && baseMatch != null) {\n const base = bases.get(decodeURIComponent(baseMatch[1] ?? ''));\n if (base == null) return json({ error: 'base not found' }, 404);\n const retained = z.object({ retained: z.boolean() }).parse(body);\n base.retained = retained.retained;\n return json({ base: baseWire(base) });\n }\n if (request.method === 'GET' && baseMatch != null) {\n const base = bases.get(decodeURIComponent(baseMatch[1] ?? ''));\n if (base == null) return json({ error: 'base not found' }, 404);\n const reads = (baseReads.get(base.id) ?? 0) + 1;\n baseReads.set(base.id, reads);\n if (base.state === 'capturing' && reads > baseCaptureReads.count) {\n const error = captureErrors.get(base.id) ?? null;\n base.state = error == null ? 'ready' : 'failed';\n base.error = error;\n }\n return json({ base: baseWire(base) });\n }\n const computerMatch = /^\\/computers\\/([^/]+)(\\/.*)?$/.exec(path);\n if (computerMatch == null) return json({ error: `no route ${path}` }, 404);\n const computer = find(decodeURIComponent(computerMatch[1] ?? ''));\n if (computer == null || computer.state === STATE.Deleted)\n return json({ error: 'computer not found' }, 404);\n const rest = computerMatch[2] ?? '';\n const machine = computer.machine;\n if (request.method === 'GET' && rest === '/screen')\n return json({ available: args.screenAvailable ?? false });\n if (request.method === 'POST' && rest === '/screen')\n return json({\n url: `https://computer-api.example/v1/computers/${computer.id}/screen/view#screen-token`,\n token: 'screen-token',\n expiresAt: new Date(Date.now() + 900_000).toISOString(),\n });\n if (request.method === 'PATCH' && rest === '') {\n const patch = createComputerSchema.pick({ network: true }).parse(body);\n if (patch.network != null) computer.body.network = patch.network;\n return json({ computer: wire(computer) });\n }\n if (request.method === 'GET' && rest === '/computer-use')\n return json({\n available: args.computerUseAvailable ?? false,\n installed: args.computerUseAvailable ?? false,\n });\n if (request.method === 'GET' && rest === '') {\n const starting = booting.get(computer.id);\n if (starting != null) {\n if (starting <= 0) {\n booting.delete(computer.id);\n computer.state = STATE.Running;\n } else booting.set(computer.id, starting - 1);\n }\n const left = shelving.get(computer.id);\n if (left != null) {\n if (left <= 0) {\n shelving.delete(computer.id);\n computer.state = STATE.Shelved;\n } else shelving.set(computer.id, left - 1);\n }\n return json({ computer: wire(computer) });\n }\n if (request.method === 'POST' && rest === '/capture') {\n if (computer.state !== STATE.Running) return json({ error: 'not running' }, 409);\n if (computer.body.userVolumeGb !== null) return json({ error: 'has a user volume' }, 409);\n const id = `part_0190b0000000700080000000${String(bases.size + 1).padStart(4, '0')}`;\n const capture = z.object({ retained: z.boolean().default(false) }).parse(body ?? {});\n const base: FakeBaseIface = {\n id,\n computerId: computer.id,\n state: 'capturing',\n error: null,\n retained: capture.retained,\n };\n bases.set(id, base);\n if (captureFailure.error != null) captureErrors.set(id, captureFailure.error);\n computer.state = STATE.Stopped;\n return json({ base: baseWire(base) }, 202);\n }\n const action = /^\\/actions\\/(.+)$/.exec(rest);\n if (request.method === 'POST' && action != null) {\n const name = action[1] ?? '';\n actions.push({ computerId: computer.id, action: name });\n if (actionConflicts.has(name))\n return json({ error: 'a lifecycle transition is committing' }, 409);\n if (name !== 'resume' && name !== 'start') booting.delete(computer.id);\n if (name === 'pause') computer.state = STATE.Paused;\n if (name === 'resume') boot(computer, STATE.Resuming);\n if (name === 'start') boot(computer, STATE.Pending);\n // A computer that is not ephemeral shelves on stop (vm-service vm-ops).\n if (name === 'stop') {\n computer.state = shelveReads.count > 0 ? STATE.Stopped : STATE.Shelved;\n if (shelveReads.count > 0) shelving.set(computer.id, shelveReads.count);\n }\n if (name === 'delete') computer.state = STATE.Deleted;\n return json({ computer: wire(computer) });\n }\n if (\n computer.state !== STATE.Running &&\n (rest === '/exec' || rest === '/run' || rest === '/files' || rest.startsWith('/processes/'))\n )\n return json({ error: NOT_RUNNING }, 409);\n if (request.method === 'POST' && (rest === '/exec' || rest === '/run')) {\n const parsed = z\n .object({\n command: z.string(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n })\n .parse(body);\n const process = machine.exec({\n id: `proc-${machine.execs.length + 1}`,\n command: parsed.command,\n cwd: parsed.cwd ?? '/',\n env: parsed.env ?? {},\n });\n if (rest === '/exec')\n return json({ id: process.id, bootId: process.bootId, pid: 1, state: 'running' });\n const output = await readFakeOutput(process, { stdout: 0, stderr: 0, waitMs: 50 });\n return json({\n id: process.id,\n bootId: process.bootId,\n pid: 1,\n timedOut: false,\n elapsedMs: 1,\n ...outputBody(output, process, 0, 0),\n });\n }\n const processMatch = /^\\/processes\\/([^/]+)\\/(output|input|terminate)$/.exec(rest);\n if (processMatch != null) {\n const process = machine.processes.get(processMatch[1] ?? '');\n if (process == null) return json({ error: 'process not found' }, 404);\n if (processMatch[2] === 'output') {\n const stdoutOffset = Number(url.searchParams.get('stdoutOffset') ?? 0);\n const stderrOffset = Number(url.searchParams.get('stderrOffset') ?? 0);\n const output = await readFakeOutput(process, {\n stdout: stdoutOffset,\n stderr: stderrOffset,\n waitMs: Number(url.searchParams.get('waitMs') ?? 0),\n });\n return json(outputBody(output, process, stdoutOffset, stderrOffset));\n }\n if (processMatch[2] === 'terminate') {\n process.terminate();\n return json({ ok: true });\n }\n const input = z\n .object({\n dataB64: z.string().optional(),\n eof: z.boolean().optional(),\n signal: z.string().optional(),\n })\n .parse(body);\n if (input.dataB64 != null) process.write(decodeBase64(input.dataB64));\n if (input.eof === true) process.eof();\n if (input.signal != null) process.terminate(input.signal);\n return json({ ok: true });\n }\n if (rest === '/files' && request.method === 'GET') {\n const path = url.searchParams.get('path') ?? '';\n // Reads follow symlinks.\n const content = machine.files.get(machine.links.get(path) ?? path);\n if (content == null) return json({ error: `${path}: No such file or directory` }, 502);\n const offset = Number(url.searchParams.get('offset') ?? 0);\n const length = Number(url.searchParams.get('length') ?? content.byteLength);\n const slice = content.subarray(offset, offset + length);\n return json({\n dataB64: encodeBase64(slice),\n eof: offset + slice.byteLength >= content.byteLength,\n offset,\n });\n }\n if (rest === '/files' && request.method === 'PUT') {\n const parsed = z\n .object({ path: z.string(), dataB64: z.string(), append: z.boolean().optional() })\n .parse(body);\n if (!machine.dirs.has(posix.dirname(parsed.path)))\n return json({ error: 'No such file or directory' }, 502);\n const data = decodeBase64(parsed.dataB64);\n const previous =\n parsed.append === true\n ? (machine.files.get(parsed.path) ?? new Uint8Array())\n : new Uint8Array();\n machine.files.set(parsed.path, concatBytes([previous, data]));\n return json({ bytesWritten: data.byteLength });\n }\n return json({ error: `no route ${request.method} ${path}` }, 404);\n };\n\n return {\n fetch: async (input, init) => handle(new Request(input, init)),\n computers,\n images,\n bases,\n baseCaptureReads,\n captureFailure,\n requests,\n actions,\n actionConflicts,\n shelveReads,\n imageBuildReads,\n bootReads,\n computerByName: (name) => [...computers.values()].find((computer) => computer.name === name),\n };\n};\n\nconst outputBody = (\n output: { stdout: Uint8Array; stderr: Uint8Array; exited: boolean },\n process: {\n exitCode: number | null;\n signal: string | null;\n stdout: Uint8Array;\n stderr: Uint8Array;\n },\n stdoutOffset: number,\n stderrOffset: number,\n) => ({\n stdout: {\n dataB64: encodeBase64(output.stdout),\n offset: stdoutOffset,\n nextOffset: stdoutOffset + output.stdout.byteLength,\n eof: output.exited && stdoutOffset + output.stdout.byteLength >= process.stdout.byteLength,\n },\n stderr: {\n dataB64: encodeBase64(output.stderr),\n offset: stderrOffset,\n nextOffset: stderrOffset + output.stderr.byteLength,\n eof: output.exited && stderrOffset + output.stderr.byteLength >= process.stderr.byteLength,\n },\n state: output.exited ? 'exited' : 'running',\n result: output.exited ? { exitCode: process.exitCode, signal: process.signal } : null,\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["computer", "image", "path"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finalai/final-agent-provider",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
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",
@@ -208,14 +208,14 @@
208
208
  },
209
209
  "dependencies": {
210
210
  "@agentclientprotocol/sdk": "1.8.0",
211
- "@finalai/acp-session": "0.1.4",
212
- "@finalai/agent-protocol": "0.1.4",
213
- "@finalai/agent-provider": "0.1.6",
211
+ "@finalai/acp-session": "0.1.6",
212
+ "@finalai/agent-protocol": "0.2.1",
213
+ "@finalai/agent-provider": "0.2.1",
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.5"
218
+ "@finalai/agent-definition": "0.1.8"
219
219
  },
220
220
  "engines": {
221
221
  "node": ">=26"