{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/components/capabilities/protocol.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,2IAWvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAKtE,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,iBAAiB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,wBAAwB,GACjC;IACA,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,OAAO,CAAC;CACf,GACD;IACA,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,uBAAuB,CAAC;CAC9B,CAAC;AAsCL,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,yBAAyB,CAmBxF;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,CAQrF;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,OAAO,GAAG,wBAAwB,CAQpH;AAED,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,yBAAyB,EAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACb,wBAAwB,CAU1B","sourcesContent":["import { canonicalJson } from \"../../storage.ts\";\n\nexport const EVO_CAPABILITY_NAMES = [\n\t\"infer\",\n\t\"read-file\",\n\t\"write-file\",\n\t\"list-dir\",\n\t\"exec\",\n\t\"http-fetch\",\n\t\"retrieve\",\n\t\"memory-read\",\n\t\"memory-write\",\n\t\"spawn-agent\",\n] as const;\n\nexport type EvoCapabilityName = (typeof EVO_CAPABILITY_NAMES)[number];\n\nconst CAPABILITY_NAMES = new Set<string>(EVO_CAPABILITY_NAMES);\nconst FRAME_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\n\nexport interface EvoCapabilityRequestFrame {\n\ttype: \"capability-request\";\n\t/** Host request id of the invoke that owns this nested call. */\n\tinvokeId: number;\n\t/** Component-chosen id, unique within an invoke. */\n\tid: string;\n\tcapability: EvoCapabilityName;\n\tpayload: unknown;\n}\n\nexport interface EvoCapabilityFrameError {\n\tcode: string;\n\tmessage: string;\n}\n\nexport type EvoCapabilityResultFrame =\n\t| {\n\t\t\ttype: \"capability-result\";\n\t\t\tinvokeId: number;\n\t\t\tid: string;\n\t\t\tok: true;\n\t\t\tresult: unknown;\n\t  }\n\t| {\n\t\t\ttype: \"capability-result\";\n\t\t\tinvokeId: number;\n\t\t\tid: string;\n\t\t\tok: false;\n\t\t\terror: EvoCapabilityFrameError;\n\t  };\n\nfunction asRecord(value: unknown, label: string): Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(`${label} must be an object`);\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction rejectUnknownKeys(record: Record<string, unknown>, allowed: readonly string[], label: string): void {\n\tconst allowedKeys = new Set(allowed);\n\tfor (const key of Object.keys(record)) {\n\t\tif (!allowedKeys.has(key)) throw new Error(`${label} has unknown key: ${key}`);\n\t}\n}\n\nfunction requireFrameId(value: unknown, label: string): string {\n\tif (typeof value !== \"string\" || !FRAME_ID_PATTERN.test(value)) {\n\t\tthrow new Error(`${label} must be a safe identifier of at most 128 characters`);\n\t}\n\treturn value;\n}\n\nfunction requireInvokeId(value: unknown, label: string): number {\n\tif (!Number.isSafeInteger(value) || (value as number) <= 0) {\n\t\tthrow new Error(`${label} must be a positive safe integer`);\n\t}\n\treturn value as number;\n}\n\nfunction requireJson(value: unknown, label: string): unknown {\n\ttry {\n\t\treturn JSON.parse(canonicalJson(value)) as unknown;\n\t} catch (error) {\n\t\tthrow new Error(`${label} must be JSON data`, { cause: error });\n\t}\n}\n\nexport function parseEvoCapabilityRequestFrame(value: unknown): EvoCapabilityRequestFrame {\n\tconst frame = asRecord(value, \"capability request frame\");\n\trejectUnknownKeys(frame, [\"type\", \"invokeId\", \"id\", \"capability\", \"payload\"], \"capability request frame\");\n\tif (frame.type !== \"capability-request\") {\n\t\tthrow new Error(\"capability request frame.type must be 'capability-request'\");\n\t}\n\tconst invokeId = requireInvokeId(frame.invokeId, \"capability request frame.invokeId\");\n\tconst id = requireFrameId(frame.id, \"capability request frame.id\");\n\tif (typeof frame.capability !== \"string\" || !CAPABILITY_NAMES.has(frame.capability)) {\n\t\tthrow new Error(\"capability request frame.capability is unsupported\");\n\t}\n\tif (!Object.hasOwn(frame, \"payload\")) throw new Error(\"capability request frame.payload is required\");\n\treturn {\n\t\ttype: \"capability-request\",\n\t\tinvokeId,\n\t\tid,\n\t\tcapability: frame.capability as EvoCapabilityName,\n\t\tpayload: requireJson(frame.payload, \"capability request frame.payload\"),\n\t};\n}\n\nexport function parseEvoCapabilityRequestLine(line: string): EvoCapabilityRequestFrame {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(line) as unknown;\n\t} catch (error) {\n\t\tthrow new Error(\"Component process returned invalid JSON\", { cause: error });\n\t}\n\treturn parseEvoCapabilityRequestFrame(value);\n}\n\nexport function capabilitySuccessFrame(request: EvoCapabilityRequestFrame, result: unknown): EvoCapabilityResultFrame {\n\treturn {\n\t\ttype: \"capability-result\",\n\t\tinvokeId: request.invokeId,\n\t\tid: request.id,\n\t\tok: true,\n\t\tresult: requireJson(result, \"capability result\"),\n\t};\n}\n\nexport function capabilityErrorFrame(\n\trequest: EvoCapabilityRequestFrame,\n\tcode: string,\n\tmessage: string,\n): EvoCapabilityResultFrame {\n\tif (!/^[a-z][a-z0-9_-]{0,63}$/.test(code)) throw new Error(\"capability error code is invalid\");\n\tif (!message || message.length > 1_024) throw new Error(\"capability error message is invalid\");\n\treturn {\n\t\ttype: \"capability-result\",\n\t\tinvokeId: request.invokeId,\n\t\tid: request.id,\n\t\tok: false,\n\t\terror: { code, message },\n\t};\n}\n"]}