@tangle-network/agent-core 0.9.4 → 0.9.6
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/auth/browser.d.ts +2 -22
- package/dist/auth/browser.js +1 -42
- package/dist/auth/index.d.ts +3 -17
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +8 -45
- package/dist/auth/index.js.map +1 -1
- package/dist/computer-use/index.d.ts.map +1 -1
- package/dist/computer-use/index.js +4 -3
- package/dist/computer-use/index.js.map +1 -1
- package/dist/{errors-DJ6U6cHY.js → errors-GuWACHTg.js} +11 -8
- package/dist/{errors-DJ6U6cHY.js.map → errors-GuWACHTg.js.map} +1 -1
- package/dist/events/index.d.ts +2 -2
- package/dist/events/index.js +1 -1
- package/dist/{events-CUWh9qrv.js → events-U7kxNUpM.js} +7 -5
- package/dist/{events-CUWh9qrv.js.map → events-U7kxNUpM.js.map} +1 -1
- package/dist/{index-D59fZ7n3.d.ts → index-BFYASYJk.d.ts} +1 -1
- package/dist/index-BFYASYJk.d.ts.map +1 -0
- package/dist/{index-Bgao-NCe.d.ts → index-BvjA5i93.d.ts} +1 -1
- package/dist/index-BvjA5i93.d.ts.map +1 -0
- package/dist/{index-HMlPCgTI.d.ts → index-CKDeaS7l.d.ts} +2 -3
- package/dist/index-CKDeaS7l.d.ts.map +1 -0
- package/dist/{index-CDLuQTT2.d.ts → index-CQPGv8jg.d.ts} +10 -11
- package/dist/index-CQPGv8jg.d.ts.map +1 -0
- package/dist/{index-C_1MnL24.d.ts → index-CuBvSsBf.d.ts} +1 -1
- package/dist/index-CuBvSsBf.d.ts.map +1 -0
- package/dist/{index-B4yy8ghH.d.ts → index-Dq6SfGaX.d.ts} +1 -1
- package/dist/index-Dq6SfGaX.d.ts.map +1 -0
- package/dist/index.d.ts +8 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -8
- package/dist/index.js.map +1 -1
- package/dist/interactions/index.d.ts +1 -2
- package/dist/interactions/index.d.ts.map +1 -1
- package/dist/interactions/index.js +2 -2
- package/dist/interactions/index.js.map +1 -1
- package/dist/interactions/mcp-server.d.ts +1 -2
- package/dist/interactions/mcp-server.d.ts.map +1 -1
- package/dist/interactions/mcp-server.js +3 -2
- package/dist/interactions/mcp-server.js.map +1 -1
- package/dist/{lifecycle-CXKYetbu.js → lifecycle-BljLcnY5.js} +1 -1
- package/dist/{lifecycle-CXKYetbu.js.map → lifecycle-BljLcnY5.js.map} +1 -1
- package/dist/resilience/index.d.ts +2 -2
- package/dist/resilience/index.js +1 -1
- package/dist/{resilience-BQzDfw_C.js → resilience-CFKHZSub.js} +4 -2
- package/dist/{resilience-BQzDfw_C.js.map → resilience-CFKHZSub.js.map} +1 -1
- package/dist/sse/index.d.ts.map +1 -1
- package/dist/sse/index.js +1 -1
- package/dist/sse/index.js.map +1 -1
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/{telemetry-x1wNw1P4.js → telemetry-DTOiMSzM.js} +1 -1
- package/dist/{telemetry-x1wNw1P4.js.map → telemetry-DTOiMSzM.js.map} +1 -1
- package/dist/{types-Cd5jUzcr.d.ts → tokens-browser-DCV3-WHc.d.ts} +28 -10
- package/dist/tokens-browser-DCV3-WHc.d.ts.map +1 -0
- package/dist/{tools-D-I3A7Us.d.ts → tools-DeZkIW3h.d.ts} +1 -2
- package/dist/tools-DeZkIW3h.d.ts.map +1 -0
- package/dist/transport/index.d.ts +2 -2
- package/dist/transport/index.js +1 -1
- package/dist/{transport-XLxpQmUW.js → transport-DAfw3oL0.js} +5 -4
- package/dist/{transport-XLxpQmUW.js.map → transport-DAfw3oL0.js.map} +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +1 -1
- package/dist/{types-DC6OJ1um.js → types--u-Om3vE.js} +56 -3
- package/dist/types--u-Om3vE.js.map +1 -0
- package/dist/{types-Ci7hcTnp.js → types-DVN5qATk.js} +1 -1
- package/dist/{types-Ci7hcTnp.js.map → types-DVN5qATk.js.map} +1 -1
- package/package.json +7 -7
- package/dist/auth/browser.d.ts.map +0 -1
- package/dist/auth/browser.js.map +0 -1
- package/dist/index-B4yy8ghH.d.ts.map +0 -1
- package/dist/index-Bgao-NCe.d.ts.map +0 -1
- package/dist/index-CDLuQTT2.d.ts.map +0 -1
- package/dist/index-C_1MnL24.d.ts.map +0 -1
- package/dist/index-D59fZ7n3.d.ts.map +0 -1
- package/dist/index-HMlPCgTI.d.ts.map +0 -1
- package/dist/tools-D-I3A7Us.d.ts.map +0 -1
- package/dist/types-Cd5jUzcr.d.ts.map +0 -1
- package/dist/types-DC6OJ1um.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/computer-use/action.ts","../../src/computer-use/anthropic.ts","../../src/computer-use/openai.ts"],"sourcesContent":["/**\n * Computer-use action schema — single source of truth.\n *\n * The sidecar's REST/MCP routes accept this union; provider translators\n * (Anthropic `computer`, OpenAI `computer_use_preview`) emit it. Keeping\n * the type, validator, and key alias table in one place prevents the\n * three-way drift that previously existed across sidecar + claude-code\n * provider + ad-hoc dispatchers.\n */\n\nexport type MouseButton = \"left\" | \"middle\" | \"right\";\n\nexport type ComputerUseAction =\n | { type: \"screenshot\" }\n | { type: \"cursor_position\" }\n | { type: \"click\"; x: number; y: number; button?: MouseButton }\n | { type: \"double_click\"; x: number; y: number }\n | { type: \"move\"; x: number; y: number }\n | {\n type: \"drag\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n }\n | { type: \"type\"; text: string; delayMs?: number }\n | { type: \"keypress\"; keys: string[] }\n | {\n type: \"scroll\";\n x: number;\n y: number;\n deltaY?: number;\n deltaX?: number;\n }\n | { type: \"wait\"; ms: number };\n\nexport type ComputerUseActionType = ComputerUseAction[\"type\"];\n\nexport class ComputerUseError extends Error {\n readonly code: string;\n constructor(message: string, code = \"COMPUTER_USE_FAILED\") {\n super(message);\n this.name = \"ComputerUseError\";\n this.code = code;\n }\n}\n\n/**\n * Provider-agnostic translation error. Both the Anthropic and OpenAI\n * translators throw this; the sandbox API and MCP server catch it\n * with `instanceof` to surface the failure as a tool result rather\n * than a 5xx.\n */\nexport class ComputerActionTranslationError extends Error {\n readonly code: string;\n constructor(message: string, code = \"COMPUTER_USE_UNSUPPORTED_ACTION\") {\n super(message);\n this.name = \"ComputerActionTranslationError\";\n this.code = code;\n }\n}\n\nconst VALID_ACTION_TYPES = new Set<ComputerUseActionType>([\n \"screenshot\",\n \"cursor_position\",\n \"click\",\n \"double_click\",\n \"move\",\n \"drag\",\n \"type\",\n \"keypress\",\n \"scroll\",\n \"wait\",\n]);\n\nconst VALID_BUTTONS: ReadonlySet<MouseButton> = new Set([\n \"left\",\n \"middle\",\n \"right\",\n]);\n\nfunction ensureFiniteInt(value: unknown, label: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new ComputerUseError(\n `Action field \"${label}\" must be a finite number, got ${typeof value}`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return Number.isInteger(value) ? value : Math.round(value);\n}\n\n/**\n * Parse and validate an unknown payload into a typed ComputerUseAction.\n * Throws ComputerUseError with COMPUTER_USE_INVALID_ACTION on any\n * structural problem.\n */\nexport function parseAction(input: unknown): ComputerUseAction {\n if (!input || typeof input !== \"object\") {\n throw new ComputerUseError(\n \"Action must be an object\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const obj = input as Record<string, unknown>;\n const type = obj.type;\n if (\n typeof type !== \"string\" ||\n !VALID_ACTION_TYPES.has(type as ComputerUseActionType)\n ) {\n throw new ComputerUseError(\n `Unknown action type \"${String(type)}\". Valid: ${[...VALID_ACTION_TYPES].join(\", \")}`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n\n switch (type as ComputerUseActionType) {\n case \"screenshot\":\n return { type: \"screenshot\" };\n case \"cursor_position\":\n return { type: \"cursor_position\" };\n case \"click\": {\n const x = ensureFiniteInt(obj.x, \"x\");\n const y = ensureFiniteInt(obj.y, \"y\");\n const button = obj.button ?? \"left\";\n if (\n typeof button !== \"string\" ||\n !VALID_BUTTONS.has(button as MouseButton)\n ) {\n throw new ComputerUseError(\n `Invalid button \"${String(button)}\". Valid: left, middle, right`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return { type: \"click\", x, y, button: button as MouseButton };\n }\n case \"double_click\":\n return {\n type: \"double_click\",\n x: ensureFiniteInt(obj.x, \"x\"),\n y: ensureFiniteInt(obj.y, \"y\"),\n };\n case \"move\":\n return {\n type: \"move\",\n x: ensureFiniteInt(obj.x, \"x\"),\n y: ensureFiniteInt(obj.y, \"y\"),\n };\n case \"drag\": {\n const from = obj.from as Record<string, unknown> | undefined;\n const to = obj.to as Record<string, unknown> | undefined;\n if (!from || !to) {\n throw new ComputerUseError(\n \"drag requires both from and to {x,y}\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return {\n type: \"drag\",\n from: {\n x: ensureFiniteInt(from.x, \"from.x\"),\n y: ensureFiniteInt(from.y, \"from.y\"),\n },\n to: {\n x: ensureFiniteInt(to.x, \"to.x\"),\n y: ensureFiniteInt(to.y, \"to.y\"),\n },\n };\n }\n case \"type\": {\n const text = obj.text;\n if (typeof text !== \"string\") {\n throw new ComputerUseError(\n 'type action requires string field \"text\"',\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const delayMs =\n obj.delayMs === undefined\n ? undefined\n : ensureFiniteInt(obj.delayMs, \"delayMs\");\n return { type: \"type\", text, delayMs };\n }\n case \"keypress\": {\n const keys = obj.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new ComputerUseError(\n \"keypress requires non-empty keys[] array\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const normalized: string[] = [];\n for (const k of keys) {\n if (typeof k !== \"string\" || k.length === 0) {\n throw new ComputerUseError(\n \"keypress keys[] must be non-empty strings\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n // Normalize on parse so the sidecar runtime can pass keys\n // straight to xdotool. Translators do their own normalization\n // for the same reason; calling normalizeKey twice is a no-op.\n normalized.push(normalizeKey(k));\n }\n return { type: \"keypress\", keys: normalized };\n }\n case \"scroll\": {\n const deltaY =\n obj.deltaY === undefined\n ? undefined\n : ensureFiniteInt(obj.deltaY, \"deltaY\");\n const deltaX =\n obj.deltaX === undefined\n ? undefined\n : ensureFiniteInt(obj.deltaX, \"deltaX\");\n // Reject (undefined, 0) on both axes — runScroll's wheel-button\n // dispatch skips zero, so the action would be a silent no-op\n // otherwise. Translators always emit non-zero, but a direct\n // parseAction caller could otherwise dispatch a successful\n // no-op scroll.\n const noY = deltaY === undefined || deltaY === 0;\n const noX = deltaX === undefined || deltaX === 0;\n if (noY && noX) {\n throw new ComputerUseError(\n \"scroll requires at least one non-zero deltaY or deltaX\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n // Treat 0 the same as undefined when shaping the return — runScroll\n // skips both branches on a zero axis, and the OpenAI translator\n // already strips zeros. Keep the on-the-wire shape consistent\n // across both code paths.\n return {\n type: \"scroll\",\n x: ensureFiniteInt(obj.x, \"x\"),\n y: ensureFiniteInt(obj.y, \"y\"),\n ...(deltaY ? { deltaY } : {}),\n ...(deltaX ? { deltaX } : {}),\n };\n }\n case \"wait\": {\n const ms = ensureFiniteInt(obj.ms, \"ms\");\n if (ms < 0) {\n throw new ComputerUseError(\n \"wait.ms must be non-negative\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return { type: \"wait\", ms };\n }\n }\n}\n\n/**\n * Map common provider key aliases (cmd, enter, page_up, …) onto the X11\n * keysym names xdotool expects. Anything not in the map passes through\n * unchanged so callers can supply real keysyms directly.\n *\n * This is the union of what the sidecar and the claude-code provider\n * each used to maintain separately.\n */\nconst KEY_ALIASES: Record<string, string> = {\n cmd: \"super\",\n command: \"super\",\n win: \"super\",\n windows: \"super\",\n meta: \"super\",\n super_l: \"super\",\n super_r: \"super\",\n enter: \"Return\",\n return: \"Return\",\n esc: \"Escape\",\n escape: \"Escape\",\n tab: \"Tab\",\n backspace: \"BackSpace\",\n delete: \"Delete\",\n del: \"Delete\",\n up: \"Up\",\n down: \"Down\",\n left: \"Left\",\n right: \"Right\",\n pageup: \"Prior\",\n page_up: \"Prior\",\n pagedown: \"Next\",\n page_down: \"Next\",\n home: \"Home\",\n end: \"End\",\n space: \"space\",\n ctrl: \"ctrl\",\n control: \"ctrl\",\n alt: \"alt\",\n shift: \"shift\",\n};\n\nexport function normalizeKey(key: string): string {\n const lower = key.toLowerCase();\n return KEY_ALIASES[lower] ?? key;\n}\n","/**\n * Anthropic `computer` tool → internal ComputerUseAction translator.\n *\n * The Anthropic Claude API (and `claude-code` CLI when run with the\n * computer-use beta) emits tool-use blocks of the form:\n *\n * { name: 'computer', input: { action, coordinate?, text?, ... } }\n *\n * This module translates the input shape into the canonical sidecar\n * action vocabulary defined in `./action.ts`. Pure function — no I/O,\n * no side effects.\n */\n\nimport {\n ComputerActionTranslationError,\n type ComputerUseAction,\n normalizeKey,\n} from \"./action.js\";\n\nexport interface AnthropicComputerInput {\n action: string;\n coordinate?: [number, number];\n start_coordinate?: [number, number];\n text?: string;\n scroll_direction?: \"up\" | \"down\" | \"left\" | \"right\";\n scroll_amount?: number;\n duration?: number;\n}\n\nfunction requireCoordinate(\n input: AnthropicComputerInput,\n field: \"coordinate\" | \"start_coordinate\",\n): [number, number] {\n const value = input[field];\n if (\n !Array.isArray(value) ||\n value.length !== 2 ||\n typeof value[0] !== \"number\" ||\n typeof value[1] !== \"number\"\n ) {\n throw new ComputerActionTranslationError(\n `Anthropic computer.${input.action} requires \"${field}: [x, y]\"`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return value as [number, number];\n}\n\nfunction requireText(input: AnthropicComputerInput): string {\n if (typeof input.text !== \"string\" || input.text.length === 0) {\n throw new ComputerActionTranslationError(\n `Anthropic computer.${input.action} requires non-empty \"text\"`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return input.text;\n}\n\n/**\n * Translate an Anthropic `computer` tool input into the sidecar action.\n * Throws `ComputerActionTranslationError` for malformed inputs or\n * unrecognized action names; the caller should surface the error as a\n * tool_result with `is_error: true` so the model can react.\n */\nexport function translateAnthropicComputerAction(\n input: AnthropicComputerInput,\n): ComputerUseAction {\n switch (input.action) {\n case \"screenshot\":\n return { type: \"screenshot\" };\n\n case \"cursor_position\":\n return { type: \"cursor_position\" };\n\n case \"left_click\":\n case \"right_click\":\n case \"middle_click\": {\n const [x, y] = requireCoordinate(input, \"coordinate\");\n const button =\n input.action === \"left_click\"\n ? \"left\"\n : input.action === \"right_click\"\n ? \"right\"\n : \"middle\";\n return { type: \"click\", x, y, button };\n }\n\n case \"double_click\": {\n const [x, y] = requireCoordinate(input, \"coordinate\");\n return { type: \"double_click\", x, y };\n }\n\n case \"mouse_move\": {\n const [x, y] = requireCoordinate(input, \"coordinate\");\n return { type: \"move\", x, y };\n }\n\n case \"left_click_drag\": {\n const [fromX, fromY] = requireCoordinate(input, \"start_coordinate\");\n const [toX, toY] = requireCoordinate(input, \"coordinate\");\n return {\n type: \"drag\",\n from: { x: fromX, y: fromY },\n to: { x: toX, y: toY },\n };\n }\n\n case \"type\":\n return { type: \"type\", text: requireText(input) };\n\n case \"key\": {\n const text = requireText(input);\n const keys = text.split(\"+\").map((token) => normalizeKey(token.trim()));\n return { type: \"keypress\", keys };\n }\n\n case \"scroll\": {\n const [x, y] = requireCoordinate(input, \"coordinate\");\n const direction = input.scroll_direction ?? \"down\";\n const magnitude =\n typeof input.scroll_amount === \"number\" && input.scroll_amount > 0\n ? input.scroll_amount\n : 3;\n switch (direction) {\n case \"up\":\n return { type: \"scroll\", x, y, deltaY: -magnitude };\n case \"down\":\n return { type: \"scroll\", x, y, deltaY: magnitude };\n case \"left\":\n return { type: \"scroll\", x, y, deltaX: -magnitude };\n case \"right\":\n return { type: \"scroll\", x, y, deltaX: magnitude };\n default:\n throw new ComputerActionTranslationError(\n `Unknown scroll_direction \"${direction}\"`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n }\n\n default:\n throw new ComputerActionTranslationError(\n `Unknown Anthropic computer action: ${input.action}`,\n \"COMPUTER_USE_UNSUPPORTED_ACTION\",\n );\n }\n}\n","/**\n * OpenAI `computer_use_preview` tool → internal ComputerUseAction\n * translator.\n *\n * The OpenAI Responses API emits computer-use tool calls with action\n * objects shaped per the `computer_use_preview` spec, e.g.:\n *\n * { type: \"click\", x: 100, y: 200, button: \"left\" }\n * { type: \"drag\", path: [{ x: 0, y: 0 }, { x: 50, y: 50 }] }\n * { type: \"scroll\", x, y, scroll_x: 0, scroll_y: -3 }\n * { type: \"keypress\", keys: [\"ENTER\"] }\n *\n * These are close to but not identical to the sidecar's internal action\n * shape (`./action.ts`). The differences this translator handles:\n * - drag.path[] (start + end points) → drag.from/to\n * - scroll_x/scroll_y → deltaX/deltaY\n * - click button \"wheel\"|\"back\"|\"forward\" → unsupported error\n * - cursor_position has no OpenAI equivalent (model uses screenshots)\n */\n\nimport {\n ComputerActionTranslationError,\n type ComputerUseAction,\n normalizeKey,\n} from \"./action.js\";\n\nexport interface OpenAIComputerInput {\n type: string;\n x?: number;\n y?: number;\n button?: string;\n text?: string;\n keys?: string[];\n path?: Array<{ x: number; y: number }>;\n scroll_x?: number;\n scroll_y?: number;\n ms?: number;\n duration?: number;\n}\n\nfunction requireNumber(value: number | undefined, label: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new ComputerActionTranslationError(\n `OpenAI computer_use action requires numeric \"${label}\"`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return value;\n}\n\nfunction requireXY(input: OpenAIComputerInput): { x: number; y: number } {\n return {\n x: requireNumber(input.x, \"x\"),\n y: requireNumber(input.y, \"y\"),\n };\n}\n\n/**\n * Translate an OpenAI `computer_use_preview` action into the sidecar\n * action. Throws `ComputerActionTranslationError` for unsupported\n * variants (wheel/back/forward buttons) or malformed inputs.\n */\nexport function translateOpenAIComputerAction(\n input: OpenAIComputerInput,\n): ComputerUseAction {\n switch (input.type) {\n case \"screenshot\":\n return { type: \"screenshot\" };\n\n case \"click\": {\n const { x, y } = requireXY(input);\n const buttonRaw = input.button ?? \"left\";\n if (\n buttonRaw !== \"left\" &&\n buttonRaw !== \"middle\" &&\n buttonRaw !== \"right\"\n ) {\n throw new ComputerActionTranslationError(\n `OpenAI computer_use click button \"${buttonRaw}\" is not supported by the sidecar (only left/middle/right)`,\n \"COMPUTER_USE_UNSUPPORTED_ACTION\",\n );\n }\n return { type: \"click\", x, y, button: buttonRaw };\n }\n\n case \"double_click\":\n return { type: \"double_click\", ...requireXY(input) };\n\n case \"move\":\n return { type: \"move\", ...requireXY(input) };\n\n case \"drag\": {\n if (!Array.isArray(input.path) || input.path.length < 2) {\n throw new ComputerActionTranslationError(\n \"OpenAI computer_use drag requires path[] with at least 2 points\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const start = input.path[0];\n const end = input.path[input.path.length - 1];\n return {\n type: \"drag\",\n from: {\n x: requireNumber(start.x, \"path[0].x\"),\n y: requireNumber(start.y, \"path[0].y\"),\n },\n to: {\n x: requireNumber(end.x, \"path[last].x\"),\n y: requireNumber(end.y, \"path[last].y\"),\n },\n };\n }\n\n case \"type\": {\n const text = input.text;\n if (typeof text !== \"string\" || text.length === 0) {\n throw new ComputerActionTranslationError(\n 'OpenAI computer_use type action requires non-empty string \"text\"',\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return { type: \"type\", text };\n }\n\n case \"keypress\": {\n if (!Array.isArray(input.keys) || input.keys.length === 0) {\n throw new ComputerActionTranslationError(\n \"OpenAI computer_use keypress requires non-empty keys[]\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const keys = input.keys.map((k) => {\n if (typeof k !== \"string\" || k.length === 0) {\n throw new ComputerActionTranslationError(\n \"OpenAI computer_use keypress keys[] must be non-empty strings\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return normalizeKey(k);\n });\n return { type: \"keypress\", keys };\n }\n\n case \"scroll\": {\n const { x, y } = requireXY(input);\n const sx =\n typeof input.scroll_x === \"number\" && Number.isFinite(input.scroll_x)\n ? input.scroll_x\n : 0;\n const sy =\n typeof input.scroll_y === \"number\" && Number.isFinite(input.scroll_y)\n ? input.scroll_y\n : 0;\n if (sx === 0 && sy === 0) {\n throw new ComputerActionTranslationError(\n \"OpenAI computer_use scroll requires non-zero scroll_x or scroll_y\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const action: ComputerUseAction = { type: \"scroll\", x, y };\n if (sy !== 0) action.deltaY = sy;\n if (sx !== 0) action.deltaX = sx;\n return action;\n }\n\n case \"wait\": {\n // OpenAI's wait uses `ms`; older preview drafts used `duration`\n // (seconds). Accept both, prefer ms. Match parseAction's strict\n // contract — neither field is a hard validation error rather\n // than a silent default, so the two paths claiming this\n // vocabulary agree.\n if (typeof input.ms === \"number\" && Number.isFinite(input.ms)) {\n return { type: \"wait\", ms: Math.max(0, Math.round(input.ms)) };\n }\n if (\n typeof input.duration === \"number\" &&\n Number.isFinite(input.duration)\n ) {\n return {\n type: \"wait\",\n ms: Math.max(0, Math.round(input.duration * 1000)),\n };\n }\n throw new ComputerActionTranslationError(\n 'OpenAI computer_use wait requires numeric \"ms\" or \"duration\"',\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n\n default:\n throw new ComputerActionTranslationError(\n `Unknown OpenAI computer_use action type: ${input.type}`,\n \"COMPUTER_USE_UNSUPPORTED_ACTION\",\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/computer-use/action.ts","../../src/computer-use/anthropic.ts","../../src/computer-use/openai.ts"],"sourcesContent":["/**\n * Computer-use action schema — single source of truth.\n *\n * The sidecar's REST/MCP routes accept this union; provider translators\n * (Anthropic `computer`, OpenAI `computer_use_preview`) emit it. Keeping\n * the type, validator, and key alias table in one place prevents the\n * three-way drift that previously existed across sidecar + claude-code\n * provider + ad-hoc dispatchers.\n */\n\nexport type MouseButton = \"left\" | \"middle\" | \"right\";\n\nexport type ComputerUseAction =\n | { type: \"screenshot\" }\n | { type: \"cursor_position\" }\n | { type: \"click\"; x: number; y: number; button?: MouseButton }\n | { type: \"double_click\"; x: number; y: number }\n | { type: \"move\"; x: number; y: number }\n | {\n type: \"drag\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n }\n | { type: \"type\"; text: string; delayMs?: number }\n | { type: \"keypress\"; keys: string[] }\n | {\n type: \"scroll\";\n x: number;\n y: number;\n deltaY?: number;\n deltaX?: number;\n }\n | { type: \"wait\"; ms: number };\n\nexport type ComputerUseActionType = ComputerUseAction[\"type\"];\n\nexport class ComputerUseError extends Error {\n readonly code: string;\n constructor(message: string, code = \"COMPUTER_USE_FAILED\") {\n super(message);\n this.name = \"ComputerUseError\";\n this.code = code;\n }\n}\n\n/**\n * Provider-agnostic translation error. Both the Anthropic and OpenAI\n * translators throw this; the sandbox API and MCP server catch it\n * with `instanceof` to surface the failure as a tool result rather\n * than a 5xx.\n */\nexport class ComputerActionTranslationError extends Error {\n readonly code: string;\n constructor(message: string, code = \"COMPUTER_USE_UNSUPPORTED_ACTION\") {\n super(message);\n this.name = \"ComputerActionTranslationError\";\n this.code = code;\n }\n}\n\nconst VALID_ACTION_TYPES = new Set<ComputerUseActionType>([\n \"screenshot\",\n \"cursor_position\",\n \"click\",\n \"double_click\",\n \"move\",\n \"drag\",\n \"type\",\n \"keypress\",\n \"scroll\",\n \"wait\",\n]);\n\nconst VALID_BUTTONS: ReadonlySet<MouseButton> = new Set([\n \"left\",\n \"middle\",\n \"right\",\n]);\n\nfunction ensureFiniteInt(value: unknown, label: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new ComputerUseError(\n `Action field \"${label}\" must be a finite number, got ${typeof value}`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return Number.isInteger(value) ? value : Math.round(value);\n}\n\n/**\n * Parse and validate an unknown payload into a typed ComputerUseAction.\n * Throws ComputerUseError with COMPUTER_USE_INVALID_ACTION on any\n * structural problem.\n */\nexport function parseAction(input: unknown): ComputerUseAction {\n if (!input || typeof input !== \"object\") {\n throw new ComputerUseError(\n \"Action must be an object\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const obj = input as Record<string, unknown>;\n const type = obj.type;\n if (\n typeof type !== \"string\" ||\n !VALID_ACTION_TYPES.has(type as ComputerUseActionType)\n ) {\n throw new ComputerUseError(\n `Unknown action type \"${String(type)}\". Valid: ${[...VALID_ACTION_TYPES].join(\", \")}`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n\n switch (type as ComputerUseActionType) {\n case \"screenshot\":\n return { type: \"screenshot\" };\n case \"cursor_position\":\n return { type: \"cursor_position\" };\n case \"click\": {\n const x = ensureFiniteInt(obj.x, \"x\");\n const y = ensureFiniteInt(obj.y, \"y\");\n const button = obj.button ?? \"left\";\n if (\n typeof button !== \"string\" ||\n !VALID_BUTTONS.has(button as MouseButton)\n ) {\n throw new ComputerUseError(\n `Invalid button \"${String(button)}\". Valid: left, middle, right`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return { type: \"click\", x, y, button: button as MouseButton };\n }\n case \"double_click\":\n return {\n type: \"double_click\",\n x: ensureFiniteInt(obj.x, \"x\"),\n y: ensureFiniteInt(obj.y, \"y\"),\n };\n case \"move\":\n return {\n type: \"move\",\n x: ensureFiniteInt(obj.x, \"x\"),\n y: ensureFiniteInt(obj.y, \"y\"),\n };\n case \"drag\": {\n const from = obj.from as Record<string, unknown> | undefined;\n const to = obj.to as Record<string, unknown> | undefined;\n if (!from || !to) {\n throw new ComputerUseError(\n \"drag requires both from and to {x,y}\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return {\n type: \"drag\",\n from: {\n x: ensureFiniteInt(from.x, \"from.x\"),\n y: ensureFiniteInt(from.y, \"from.y\"),\n },\n to: {\n x: ensureFiniteInt(to.x, \"to.x\"),\n y: ensureFiniteInt(to.y, \"to.y\"),\n },\n };\n }\n case \"type\": {\n const text = obj.text;\n if (typeof text !== \"string\") {\n throw new ComputerUseError(\n 'type action requires string field \"text\"',\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const delayMs =\n obj.delayMs === undefined\n ? undefined\n : ensureFiniteInt(obj.delayMs, \"delayMs\");\n return { type: \"type\", text, delayMs };\n }\n case \"keypress\": {\n const keys = obj.keys;\n if (!Array.isArray(keys) || keys.length === 0) {\n throw new ComputerUseError(\n \"keypress requires non-empty keys[] array\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const normalized: string[] = [];\n for (const k of keys) {\n if (typeof k !== \"string\" || k.length === 0) {\n throw new ComputerUseError(\n \"keypress keys[] must be non-empty strings\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n // Normalize on parse so the sidecar runtime can pass keys\n // straight to xdotool. Translators do their own normalization\n // for the same reason; calling normalizeKey twice is a no-op.\n normalized.push(normalizeKey(k));\n }\n return { type: \"keypress\", keys: normalized };\n }\n case \"scroll\": {\n const deltaY =\n obj.deltaY === undefined\n ? undefined\n : ensureFiniteInt(obj.deltaY, \"deltaY\");\n const deltaX =\n obj.deltaX === undefined\n ? undefined\n : ensureFiniteInt(obj.deltaX, \"deltaX\");\n // Reject (undefined, 0) on both axes — runScroll's wheel-button\n // dispatch skips zero, so the action would be a silent no-op\n // otherwise. Translators always emit non-zero, but a direct\n // parseAction caller could otherwise dispatch a successful\n // no-op scroll.\n const noY = deltaY === undefined || deltaY === 0;\n const noX = deltaX === undefined || deltaX === 0;\n if (noY && noX) {\n throw new ComputerUseError(\n \"scroll requires at least one non-zero deltaY or deltaX\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n // Treat 0 the same as undefined when shaping the return — runScroll\n // skips both branches on a zero axis, and the OpenAI translator\n // already strips zeros. Keep the on-the-wire shape consistent\n // across both code paths.\n return {\n type: \"scroll\",\n x: ensureFiniteInt(obj.x, \"x\"),\n y: ensureFiniteInt(obj.y, \"y\"),\n ...(deltaY ? { deltaY } : {}),\n ...(deltaX ? { deltaX } : {}),\n };\n }\n case \"wait\": {\n const ms = ensureFiniteInt(obj.ms, \"ms\");\n if (ms < 0) {\n throw new ComputerUseError(\n \"wait.ms must be non-negative\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return { type: \"wait\", ms };\n }\n }\n}\n\n/**\n * Map common provider key aliases (cmd, enter, page_up, …) onto the X11\n * keysym names xdotool expects. Anything not in the map passes through\n * unchanged so callers can supply real keysyms directly.\n *\n * This is the union of what the sidecar and the claude-code provider\n * each used to maintain separately.\n */\nconst KEY_ALIASES: Record<string, string> = {\n cmd: \"super\",\n command: \"super\",\n win: \"super\",\n windows: \"super\",\n meta: \"super\",\n super_l: \"super\",\n super_r: \"super\",\n enter: \"Return\",\n return: \"Return\",\n esc: \"Escape\",\n escape: \"Escape\",\n tab: \"Tab\",\n backspace: \"BackSpace\",\n delete: \"Delete\",\n del: \"Delete\",\n up: \"Up\",\n down: \"Down\",\n left: \"Left\",\n right: \"Right\",\n pageup: \"Prior\",\n page_up: \"Prior\",\n pagedown: \"Next\",\n page_down: \"Next\",\n home: \"Home\",\n end: \"End\",\n space: \"space\",\n ctrl: \"ctrl\",\n control: \"ctrl\",\n alt: \"alt\",\n shift: \"shift\",\n};\n\nexport function normalizeKey(key: string): string {\n const lower = key.toLowerCase();\n return KEY_ALIASES[lower] ?? key;\n}\n","/**\n * Anthropic `computer` tool → internal ComputerUseAction translator.\n *\n * The Anthropic Claude API (and `claude-code` CLI when run with the\n * computer-use beta) emits tool-use blocks of the form:\n *\n * { name: 'computer', input: { action, coordinate?, text?, ... } }\n *\n * This module translates the input shape into the canonical sidecar\n * action vocabulary defined in `./action.ts`. Pure function — no I/O,\n * no side effects.\n */\n\nimport {\n ComputerActionTranslationError,\n type ComputerUseAction,\n normalizeKey,\n} from \"./action.js\";\n\nexport interface AnthropicComputerInput {\n action: string;\n coordinate?: [number, number];\n start_coordinate?: [number, number];\n text?: string;\n scroll_direction?: \"up\" | \"down\" | \"left\" | \"right\";\n scroll_amount?: number;\n duration?: number;\n}\n\nfunction requireCoordinate(\n input: AnthropicComputerInput,\n field: \"coordinate\" | \"start_coordinate\",\n): [number, number] {\n const value = input[field];\n if (\n !Array.isArray(value) ||\n value.length !== 2 ||\n typeof value[0] !== \"number\" ||\n typeof value[1] !== \"number\"\n ) {\n throw new ComputerActionTranslationError(\n `Anthropic computer.${input.action} requires \"${field}: [x, y]\"`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return value as [number, number];\n}\n\nfunction requireText(input: AnthropicComputerInput): string {\n if (typeof input.text !== \"string\" || input.text.length === 0) {\n throw new ComputerActionTranslationError(\n `Anthropic computer.${input.action} requires non-empty \"text\"`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return input.text;\n}\n\n/**\n * Translate an Anthropic `computer` tool input into the sidecar action.\n * Throws `ComputerActionTranslationError` for malformed inputs or\n * unrecognized action names; the caller should surface the error as a\n * tool_result with `is_error: true` so the model can react.\n */\nexport function translateAnthropicComputerAction(\n input: AnthropicComputerInput,\n): ComputerUseAction {\n switch (input.action) {\n case \"screenshot\":\n return { type: \"screenshot\" };\n\n case \"cursor_position\":\n return { type: \"cursor_position\" };\n\n case \"left_click\":\n case \"right_click\":\n case \"middle_click\": {\n const [x, y] = requireCoordinate(input, \"coordinate\");\n const button =\n input.action === \"left_click\"\n ? \"left\"\n : input.action === \"right_click\"\n ? \"right\"\n : \"middle\";\n return { type: \"click\", x, y, button };\n }\n\n case \"double_click\": {\n const [x, y] = requireCoordinate(input, \"coordinate\");\n return { type: \"double_click\", x, y };\n }\n\n case \"mouse_move\": {\n const [x, y] = requireCoordinate(input, \"coordinate\");\n return { type: \"move\", x, y };\n }\n\n case \"left_click_drag\": {\n const [fromX, fromY] = requireCoordinate(input, \"start_coordinate\");\n const [toX, toY] = requireCoordinate(input, \"coordinate\");\n return {\n type: \"drag\",\n from: { x: fromX, y: fromY },\n to: { x: toX, y: toY },\n };\n }\n\n case \"type\":\n return { type: \"type\", text: requireText(input) };\n\n case \"key\": {\n const text = requireText(input);\n const keys = text.split(\"+\").map((token) => normalizeKey(token.trim()));\n return { type: \"keypress\", keys };\n }\n\n case \"scroll\": {\n const [x, y] = requireCoordinate(input, \"coordinate\");\n const direction = input.scroll_direction ?? \"down\";\n const magnitude =\n typeof input.scroll_amount === \"number\" && input.scroll_amount > 0\n ? input.scroll_amount\n : 3;\n switch (direction) {\n case \"up\":\n return { type: \"scroll\", x, y, deltaY: -magnitude };\n case \"down\":\n return { type: \"scroll\", x, y, deltaY: magnitude };\n case \"left\":\n return { type: \"scroll\", x, y, deltaX: -magnitude };\n case \"right\":\n return { type: \"scroll\", x, y, deltaX: magnitude };\n default:\n throw new ComputerActionTranslationError(\n `Unknown scroll_direction \"${direction}\"`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n }\n\n default:\n throw new ComputerActionTranslationError(\n `Unknown Anthropic computer action: ${input.action}`,\n \"COMPUTER_USE_UNSUPPORTED_ACTION\",\n );\n }\n}\n","/**\n * OpenAI `computer_use_preview` tool → internal ComputerUseAction\n * translator.\n *\n * The OpenAI Responses API emits computer-use tool calls with action\n * objects shaped per the `computer_use_preview` spec, e.g.:\n *\n * { type: \"click\", x: 100, y: 200, button: \"left\" }\n * { type: \"drag\", path: [{ x: 0, y: 0 }, { x: 50, y: 50 }] }\n * { type: \"scroll\", x, y, scroll_x: 0, scroll_y: -3 }\n * { type: \"keypress\", keys: [\"ENTER\"] }\n *\n * These are close to but not identical to the sidecar's internal action\n * shape (`./action.ts`). The differences this translator handles:\n * - drag.path[] (start + end points) → drag.from/to\n * - scroll_x/scroll_y → deltaX/deltaY\n * - click button \"wheel\"|\"back\"|\"forward\" → unsupported error\n * - cursor_position has no OpenAI equivalent (model uses screenshots)\n */\n\nimport {\n ComputerActionTranslationError,\n type ComputerUseAction,\n normalizeKey,\n} from \"./action.js\";\n\nexport interface OpenAIComputerInput {\n type: string;\n x?: number;\n y?: number;\n button?: string;\n text?: string;\n keys?: string[];\n path?: Array<{ x: number; y: number }>;\n scroll_x?: number;\n scroll_y?: number;\n ms?: number;\n duration?: number;\n}\n\nfunction requireNumber(value: number | undefined, label: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new ComputerActionTranslationError(\n `OpenAI computer_use action requires numeric \"${label}\"`,\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return value;\n}\n\nfunction requireXY(input: OpenAIComputerInput): { x: number; y: number } {\n return {\n x: requireNumber(input.x, \"x\"),\n y: requireNumber(input.y, \"y\"),\n };\n}\n\n/**\n * Translate an OpenAI `computer_use_preview` action into the sidecar\n * action. Throws `ComputerActionTranslationError` for unsupported\n * variants (wheel/back/forward buttons) or malformed inputs.\n */\nexport function translateOpenAIComputerAction(\n input: OpenAIComputerInput,\n): ComputerUseAction {\n switch (input.type) {\n case \"screenshot\":\n return { type: \"screenshot\" };\n\n case \"click\": {\n const { x, y } = requireXY(input);\n const buttonRaw = input.button ?? \"left\";\n if (\n buttonRaw !== \"left\" &&\n buttonRaw !== \"middle\" &&\n buttonRaw !== \"right\"\n ) {\n throw new ComputerActionTranslationError(\n `OpenAI computer_use click button \"${buttonRaw}\" is not supported by the sidecar (only left/middle/right)`,\n \"COMPUTER_USE_UNSUPPORTED_ACTION\",\n );\n }\n return { type: \"click\", x, y, button: buttonRaw };\n }\n\n case \"double_click\":\n return { type: \"double_click\", ...requireXY(input) };\n\n case \"move\":\n return { type: \"move\", ...requireXY(input) };\n\n case \"drag\": {\n if (!Array.isArray(input.path) || input.path.length < 2) {\n throw new ComputerActionTranslationError(\n \"OpenAI computer_use drag requires path[] with at least 2 points\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const start = input.path[0];\n const end = input.path[input.path.length - 1];\n return {\n type: \"drag\",\n from: {\n x: requireNumber(start.x, \"path[0].x\"),\n y: requireNumber(start.y, \"path[0].y\"),\n },\n to: {\n x: requireNumber(end.x, \"path[last].x\"),\n y: requireNumber(end.y, \"path[last].y\"),\n },\n };\n }\n\n case \"type\": {\n const text = input.text;\n if (typeof text !== \"string\" || text.length === 0) {\n throw new ComputerActionTranslationError(\n 'OpenAI computer_use type action requires non-empty string \"text\"',\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return { type: \"type\", text };\n }\n\n case \"keypress\": {\n if (!Array.isArray(input.keys) || input.keys.length === 0) {\n throw new ComputerActionTranslationError(\n \"OpenAI computer_use keypress requires non-empty keys[]\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const keys = input.keys.map((k) => {\n if (typeof k !== \"string\" || k.length === 0) {\n throw new ComputerActionTranslationError(\n \"OpenAI computer_use keypress keys[] must be non-empty strings\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n return normalizeKey(k);\n });\n return { type: \"keypress\", keys };\n }\n\n case \"scroll\": {\n const { x, y } = requireXY(input);\n const sx =\n typeof input.scroll_x === \"number\" && Number.isFinite(input.scroll_x)\n ? input.scroll_x\n : 0;\n const sy =\n typeof input.scroll_y === \"number\" && Number.isFinite(input.scroll_y)\n ? input.scroll_y\n : 0;\n if (sx === 0 && sy === 0) {\n throw new ComputerActionTranslationError(\n \"OpenAI computer_use scroll requires non-zero scroll_x or scroll_y\",\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n const action: ComputerUseAction = { type: \"scroll\", x, y };\n if (sy !== 0) action.deltaY = sy;\n if (sx !== 0) action.deltaX = sx;\n return action;\n }\n\n case \"wait\": {\n // OpenAI's wait uses `ms`; older preview drafts used `duration`\n // (seconds). Accept both, prefer ms. Match parseAction's strict\n // contract — neither field is a hard validation error rather\n // than a silent default, so the two paths claiming this\n // vocabulary agree.\n if (typeof input.ms === \"number\" && Number.isFinite(input.ms)) {\n return { type: \"wait\", ms: Math.max(0, Math.round(input.ms)) };\n }\n if (\n typeof input.duration === \"number\" &&\n Number.isFinite(input.duration)\n ) {\n return {\n type: \"wait\",\n ms: Math.max(0, Math.round(input.duration * 1000)),\n };\n }\n throw new ComputerActionTranslationError(\n 'OpenAI computer_use wait requires numeric \"ms\" or \"duration\"',\n \"COMPUTER_USE_INVALID_ACTION\",\n );\n }\n\n default:\n throw new ComputerActionTranslationError(\n `Unknown OpenAI computer_use action type: ${input.type}`,\n \"COMPUTER_USE_UNSUPPORTED_ACTION\",\n );\n }\n}\n"],"mappings":";AAoCA,IAAa,mBAAb,cAAsC,MAAM;CAC1C;CACA,YAAY,SAAiB,OAAO,uBAAuB;EACzD,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO;CACd;AACF;;;;;;;AAQA,IAAa,iCAAb,cAAoD,MAAM;CACxD;CACA,YAAY,SAAiB,OAAO,mCAAmC;EACrE,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO;CACd;AACF;AAEA,MAAM,qCAAqB,IAAI,IAA2B;CACxD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,gCAA0C,IAAI,IAAI;CACtD;CACA;CACA;AACF,CAAC;AAED,SAAS,gBAAgB,OAAgB,OAAuB;CAC9D,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GACrD,MAAM,IAAI,iBACR,iBAAiB,MAAM,iCAAiC,OAAO,SAC/D,6BACF;CAEF,OAAO,OAAO,UAAU,KAAK,IAAI,QAAQ,KAAK,MAAM,KAAK;AAC3D;;;;;;AAOA,SAAgB,YAAY,OAAmC;CAC7D,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,MAAM,IAAI,iBACR,4BACA,6BACF;CAEF,MAAM,MAAM;CACZ,MAAM,OAAO,IAAI;CACjB,IACE,OAAO,SAAS,YAChB,CAAC,mBAAmB,IAAI,IAA6B,GAErD,MAAM,IAAI,iBACR,wBAAwB,OAAO,IAAI,EAAE,YAAY,CAAC,GAAG,kBAAkB,CAAC,CAAC,KAAK,IAAI,KAClF,6BACF;CAGF,QAAQ,MAAR;EACE,KAAK,cACH,OAAO,EAAE,MAAM,aAAa;EAC9B,KAAK,mBACH,OAAO,EAAE,MAAM,kBAAkB;EACnC,KAAK,SAAS;GACZ,MAAM,IAAI,gBAAgB,IAAI,GAAG,GAAG;GACpC,MAAM,IAAI,gBAAgB,IAAI,GAAG,GAAG;GACpC,MAAM,SAAS,IAAI,UAAU;GAC7B,IACE,OAAO,WAAW,YAClB,CAAC,cAAc,IAAI,MAAqB,GAExC,MAAM,IAAI,iBACR,mBAAmB,OAAO,MAAM,EAAE,gCAClC,6BACF;GAEF,OAAO;IAAE,MAAM;IAAS;IAAG;IAAW;GAAsB;EAC9D;EACA,KAAK,gBACH,OAAO;GACL,MAAM;GACN,GAAG,gBAAgB,IAAI,GAAG,GAAG;GAC7B,GAAG,gBAAgB,IAAI,GAAG,GAAG;EAC/B;EACF,KAAK,QACH,OAAO;GACL,MAAM;GACN,GAAG,gBAAgB,IAAI,GAAG,GAAG;GAC7B,GAAG,gBAAgB,IAAI,GAAG,GAAG;EAC/B;EACF,KAAK,QAAQ;GACX,MAAM,OAAO,IAAI;GACjB,MAAM,KAAK,IAAI;GACf,IAAI,CAAC,QAAQ,CAAC,IACZ,MAAM,IAAI,iBACR,wCACA,6BACF;GAEF,OAAO;IACL,MAAM;IACN,MAAM;KACJ,GAAG,gBAAgB,KAAK,GAAG,QAAQ;KACnC,GAAG,gBAAgB,KAAK,GAAG,QAAQ;IACrC;IACA,IAAI;KACF,GAAG,gBAAgB,GAAG,GAAG,MAAM;KAC/B,GAAG,gBAAgB,GAAG,GAAG,MAAM;IACjC;GACF;EACF;EACA,KAAK,QAAQ;GACX,MAAM,OAAO,IAAI;GACjB,IAAI,OAAO,SAAS,UAClB,MAAM,IAAI,iBACR,8CACA,6BACF;GAMF,OAAO;IAAE,MAAM;IAAQ;IAAM,SAH3B,IAAI,YAAY,KAAA,IACZ,KAAA,IACA,gBAAgB,IAAI,SAAS,SAAS;GACP;EACvC;EACA,KAAK,YAAY;GACf,MAAM,OAAO,IAAI;GACjB,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAC1C,MAAM,IAAI,iBACR,4CACA,6BACF;GAEF,MAAM,aAAuB,CAAC;GAC9B,KAAK,MAAM,KAAK,MAAM;IACpB,IAAI,OAAO,MAAM,YAAY,EAAE,WAAW,GACxC,MAAM,IAAI,iBACR,6CACA,6BACF;IAKF,WAAW,KAAK,aAAa,CAAC,CAAC;GACjC;GACA,OAAO;IAAE,MAAM;IAAY,MAAM;GAAW;EAC9C;EACA,KAAK,UAAU;GACb,MAAM,SACJ,IAAI,WAAW,KAAA,IACX,KAAA,IACA,gBAAgB,IAAI,QAAQ,QAAQ;GAC1C,MAAM,SACJ,IAAI,WAAW,KAAA,IACX,KAAA,IACA,gBAAgB,IAAI,QAAQ,QAAQ;GAQ1C,KAFY,WAAW,KAAA,KAAa,WAAW,OACnC,WAAW,KAAA,KAAa,WAAW,IAE7C,MAAM,IAAI,iBACR,0DACA,6BACF;GAMF,OAAO;IACL,MAAM;IACN,GAAG,gBAAgB,IAAI,GAAG,GAAG;IAC7B,GAAG,gBAAgB,IAAI,GAAG,GAAG;IAC7B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;IAC3B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;GAC7B;EACF;EACA,KAAK,QAAQ;GACX,MAAM,KAAK,gBAAgB,IAAI,IAAI,IAAI;GACvC,IAAI,KAAK,GACP,MAAM,IAAI,iBACR,gCACA,6BACF;GAEF,OAAO;IAAE,MAAM;IAAQ;GAAG;EAC5B;CACF;AACF;;;;;;;;;AAUA,MAAM,cAAsC;CAC1C,KAAK;CACL,SAAS;CACT,KAAK;CACL,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACT,OAAO;CACP,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,KAAK;CACL,WAAW;CACX,QAAQ;CACR,KAAK;CACL,IAAI;CACJ,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ;CACR,SAAS;CACT,UAAU;CACV,WAAW;CACX,MAAM;CACN,KAAK;CACL,OAAO;CACP,MAAM;CACN,SAAS;CACT,KAAK;CACL,OAAO;AACT;AAEA,SAAgB,aAAa,KAAqB;CAChD,MAAM,QAAQ,IAAI,YAAY;CAC9B,OAAO,YAAY,UAAU;AAC/B;;;;;;;;;;;;;;;ACzQA,SAAS,kBACP,OACA,OACkB;CAClB,MAAM,QAAQ,MAAM;CACpB,IACE,CAAC,MAAM,QAAQ,KAAK,KACpB,MAAM,WAAW,KACjB,OAAO,MAAM,OAAO,YACpB,OAAO,MAAM,OAAO,UAEpB,MAAM,IAAI,+BACR,sBAAsB,MAAM,OAAO,aAAa,MAAM,YACtD,6BACF;CAEF,OAAO;AACT;AAEA,SAAS,YAAY,OAAuC;CAC1D,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,GAC1D,MAAM,IAAI,+BACR,sBAAsB,MAAM,OAAO,6BACnC,6BACF;CAEF,OAAO,MAAM;AACf;;;;;;;AAQA,SAAgB,iCACd,OACmB;CACnB,QAAQ,MAAM,QAAd;EACE,KAAK,cACH,OAAO,EAAE,MAAM,aAAa;EAE9B,KAAK,mBACH,OAAO,EAAE,MAAM,kBAAkB;EAEnC,KAAK;EACL,KAAK;EACL,KAAK,gBAAgB;GACnB,MAAM,CAAC,GAAG,KAAK,kBAAkB,OAAO,YAAY;GAOpD,OAAO;IAAE,MAAM;IAAS;IAAG;IAAG,QAL5B,MAAM,WAAW,eACb,SACA,MAAM,WAAW,gBACf,UACA;GAC6B;EACvC;EAEA,KAAK,gBAAgB;GACnB,MAAM,CAAC,GAAG,KAAK,kBAAkB,OAAO,YAAY;GACpD,OAAO;IAAE,MAAM;IAAgB;IAAG;GAAE;EACtC;EAEA,KAAK,cAAc;GACjB,MAAM,CAAC,GAAG,KAAK,kBAAkB,OAAO,YAAY;GACpD,OAAO;IAAE,MAAM;IAAQ;IAAG;GAAE;EAC9B;EAEA,KAAK,mBAAmB;GACtB,MAAM,CAAC,OAAO,SAAS,kBAAkB,OAAO,kBAAkB;GAClE,MAAM,CAAC,KAAK,OAAO,kBAAkB,OAAO,YAAY;GACxD,OAAO;IACL,MAAM;IACN,MAAM;KAAE,GAAG;KAAO,GAAG;IAAM;IAC3B,IAAI;KAAE,GAAG;KAAK,GAAG;IAAI;GACvB;EACF;EAEA,KAAK,QACH,OAAO;GAAE,MAAM;GAAQ,MAAM,YAAY,KAAK;EAAE;EAElD,KAAK,OAGH,OAAO;GAAE,MAAM;GAAY,MAFd,YAAY,KACT,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU,aAAa,MAAM,KAAK,CAAC,CACvC;EAAE;EAGlC,KAAK,UAAU;GACb,MAAM,CAAC,GAAG,KAAK,kBAAkB,OAAO,YAAY;GACpD,MAAM,YAAY,MAAM,oBAAoB;GAC5C,MAAM,YACJ,OAAO,MAAM,kBAAkB,YAAY,MAAM,gBAAgB,IAC7D,MAAM,gBACN;GACN,QAAQ,WAAR;IACE,KAAK,MACH,OAAO;KAAE,MAAM;KAAU;KAAG;KAAG,QAAQ,CAAC;IAAU;IACpD,KAAK,QACH,OAAO;KAAE,MAAM;KAAU;KAAG;KAAG,QAAQ;IAAU;IACnD,KAAK,QACH,OAAO;KAAE,MAAM;KAAU;KAAG;KAAG,QAAQ,CAAC;IAAU;IACpD,KAAK,SACH,OAAO;KAAE,MAAM;KAAU;KAAG;KAAG,QAAQ;IAAU;IACnD,SACE,MAAM,IAAI,+BACR,6BAA6B,UAAU,IACvC,6BACF;GACJ;EACF;EAEA,SACE,MAAM,IAAI,+BACR,sCAAsC,MAAM,UAC5C,iCACF;CACJ;AACF;;;;;;;;;;;;;;;;;;;;;;AC1GA,SAAS,cAAc,OAA2B,OAAuB;CACvE,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GACrD,MAAM,IAAI,+BACR,gDAAgD,MAAM,IACtD,6BACF;CAEF,OAAO;AACT;AAEA,SAAS,UAAU,OAAsD;CACvE,OAAO;EACL,GAAG,cAAc,MAAM,GAAG,GAAG;EAC7B,GAAG,cAAc,MAAM,GAAG,GAAG;CAC/B;AACF;;;;;;AAOA,SAAgB,8BACd,OACmB;CACnB,QAAQ,MAAM,MAAd;EACE,KAAK,cACH,OAAO,EAAE,MAAM,aAAa;EAE9B,KAAK,SAAS;GACZ,MAAM,EAAE,GAAG,MAAM,UAAU,KAAK;GAChC,MAAM,YAAY,MAAM,UAAU;GAClC,IACE,cAAc,UACd,cAAc,YACd,cAAc,SAEd,MAAM,IAAI,+BACR,qCAAqC,UAAU,6DAC/C,iCACF;GAEF,OAAO;IAAE,MAAM;IAAS;IAAG;IAAG,QAAQ;GAAU;EAClD;EAEA,KAAK,gBACH,OAAO;GAAE,MAAM;GAAgB,GAAG,UAAU,KAAK;EAAE;EAErD,KAAK,QACH,OAAO;GAAE,MAAM;GAAQ,GAAG,UAAU,KAAK;EAAE;EAE7C,KAAK,QAAQ;GACX,IAAI,CAAC,MAAM,QAAQ,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,GACpD,MAAM,IAAI,+BACR,mEACA,6BACF;GAEF,MAAM,QAAQ,MAAM,KAAK;GACzB,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,SAAS;GAC3C,OAAO;IACL,MAAM;IACN,MAAM;KACJ,GAAG,cAAc,MAAM,GAAG,WAAW;KACrC,GAAG,cAAc,MAAM,GAAG,WAAW;IACvC;IACA,IAAI;KACF,GAAG,cAAc,IAAI,GAAG,cAAc;KACtC,GAAG,cAAc,IAAI,GAAG,cAAc;IACxC;GACF;EACF;EAEA,KAAK,QAAQ;GACX,MAAM,OAAO,MAAM;GACnB,IAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAC9C,MAAM,IAAI,+BACR,sEACA,6BACF;GAEF,OAAO;IAAE,MAAM;IAAQ;GAAK;EAC9B;EAEA,KAAK;GACH,IAAI,CAAC,MAAM,QAAQ,MAAM,IAAI,KAAK,MAAM,KAAK,WAAW,GACtD,MAAM,IAAI,+BACR,0DACA,6BACF;GAWF,OAAO;IAAE,MAAM;IAAY,MATd,MAAM,KAAK,KAAK,MAAM;KACjC,IAAI,OAAO,MAAM,YAAY,EAAE,WAAW,GACxC,MAAM,IAAI,+BACR,iEACA,6BACF;KAEF,OAAO,aAAa,CAAC;IACvB,CAC8B;GAAE;EAGlC,KAAK,UAAU;GACb,MAAM,EAAE,GAAG,MAAM,UAAU,KAAK;GAChC,MAAM,KACJ,OAAO,MAAM,aAAa,YAAY,OAAO,SAAS,MAAM,QAAQ,IAChE,MAAM,WACN;GACN,MAAM,KACJ,OAAO,MAAM,aAAa,YAAY,OAAO,SAAS,MAAM,QAAQ,IAChE,MAAM,WACN;GACN,IAAI,OAAO,KAAK,OAAO,GACrB,MAAM,IAAI,+BACR,qEACA,6BACF;GAEF,MAAM,SAA4B;IAAE,MAAM;IAAU;IAAG;GAAE;GACzD,IAAI,OAAO,GAAG,OAAO,SAAS;GAC9B,IAAI,OAAO,GAAG,OAAO,SAAS;GAC9B,OAAO;EACT;EAEA,KAAK;GAMH,IAAI,OAAO,MAAM,OAAO,YAAY,OAAO,SAAS,MAAM,EAAE,GAC1D,OAAO;IAAE,MAAM;IAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,EAAE,CAAC;GAAE;GAE/D,IACE,OAAO,MAAM,aAAa,YAC1B,OAAO,SAAS,MAAM,QAAQ,GAE9B,OAAO;IACL,MAAM;IACN,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,WAAW,GAAI,CAAC;GACnD;GAEF,MAAM,IAAI,+BACR,oEACA,6BACF;EAGF,SACE,MAAM,IAAI,+BACR,4CAA4C,MAAM,QAClD,iCACF;CACJ;AACF"}
|
|
@@ -49,13 +49,16 @@ var SDKError = class SDKError extends Error {
|
|
|
49
49
|
retryable: false,
|
|
50
50
|
context: { body }
|
|
51
51
|
});
|
|
52
|
-
if (status === 429)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
if (status === 429) {
|
|
53
|
+
const retryAfter = typeof body === "object" && body !== null && "retryAfter" in body ? Number(body.retryAfter) * 1e3 : 1e3;
|
|
54
|
+
return new SDKError(message, {
|
|
55
|
+
code: "RATE_LIMITED",
|
|
56
|
+
status,
|
|
57
|
+
retryable: true,
|
|
58
|
+
retryAfterMs: retryAfter,
|
|
59
|
+
context: { body }
|
|
60
|
+
});
|
|
61
|
+
}
|
|
59
62
|
if (status >= 500) return new SDKError(message, {
|
|
60
63
|
code: "SERVER",
|
|
61
64
|
status,
|
|
@@ -143,4 +146,4 @@ function isRetryable(error) {
|
|
|
143
146
|
//#endregion
|
|
144
147
|
export { isRetryable as n, isSDKError as r, SDKError as t };
|
|
145
148
|
|
|
146
|
-
//# sourceMappingURL=errors-
|
|
149
|
+
//# sourceMappingURL=errors-GuWACHTg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors-
|
|
1
|
+
{"version":3,"file":"errors-GuWACHTg.js","names":[],"sources":["../src/errors/index.ts"],"sourcesContent":["/**\n * SDK Error Types\n *\n * Structured errors with codes, retry hints, and context.\n */\n\n/** Error categories for routing and handling */\nexport type ErrorCode =\n | \"NETWORK\"\n | \"TIMEOUT\"\n | \"AUTH\"\n | \"AUTH_EXPIRED\"\n | \"VALIDATION\"\n | \"NOT_FOUND\"\n | \"RATE_LIMITED\"\n | \"SERVER\"\n | \"CANCELLED\"\n | \"UNKNOWN\";\n\n/** SDK error with structured metadata */\nexport class SDKError extends Error {\n readonly code: ErrorCode;\n readonly status?: number;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly context?: Record<string, unknown>;\n\n constructor(\n message: string,\n options: {\n code: ErrorCode;\n status?: number;\n retryable?: boolean;\n retryAfterMs?: number;\n context?: Record<string, unknown>;\n cause?: Error;\n },\n ) {\n super(message, { cause: options.cause });\n this.name = \"SDKError\";\n this.code = options.code;\n this.status = options.status;\n this.retryable =\n options.retryable ?? this.inferRetryable(options.code, options.status);\n this.retryAfterMs = options.retryAfterMs;\n this.context = options.context;\n }\n\n private inferRetryable(code: ErrorCode, status?: number): boolean {\n // Network issues and server errors are typically retryable\n if (code === \"NETWORK\" || code === \"TIMEOUT\") return true;\n if (code === \"RATE_LIMITED\") return true;\n if (code === \"SERVER\" && status && status >= 500) return true;\n // Auth expired can be retried after refresh\n if (code === \"AUTH_EXPIRED\") return true;\n // Client errors are not retryable\n return false;\n }\n\n /** Create from HTTP response */\n static fromResponse(status: number, body?: unknown): SDKError {\n const message = SDKError.extractMessageFromBody(body) ?? `HTTP ${status}`;\n\n if (status === 401) {\n return new SDKError(message, {\n code: \"AUTH\",\n status,\n retryable: false,\n context: { body },\n });\n }\n if (status === 403) {\n return new SDKError(message, {\n code: \"AUTH\",\n status,\n retryable: false,\n context: { body },\n });\n }\n if (status === 404) {\n return new SDKError(message, {\n code: \"NOT_FOUND\",\n status,\n retryable: false,\n context: { body },\n });\n }\n if (status === 422 || status === 400) {\n return new SDKError(message, {\n code: \"VALIDATION\",\n status,\n retryable: false,\n context: { body },\n });\n }\n if (status === 429) {\n const retryAfter =\n typeof body === \"object\" && body !== null && \"retryAfter\" in body\n ? Number((body as { retryAfter: unknown }).retryAfter) * 1000\n : 1000;\n return new SDKError(message, {\n code: \"RATE_LIMITED\",\n status,\n retryable: true,\n retryAfterMs: retryAfter,\n context: { body },\n });\n }\n if (status >= 500) {\n return new SDKError(message, {\n code: \"SERVER\",\n status,\n retryable: true,\n context: { body },\n });\n }\n return new SDKError(message, {\n code: \"UNKNOWN\",\n status,\n context: { body },\n });\n }\n\n /** Create from caught error */\n static fromError(error: unknown): SDKError {\n if (error instanceof SDKError) return error;\n\n if (error instanceof Error) {\n // Detect network errors\n if (error.name === \"TypeError\" && error.message.includes(\"fetch\")) {\n return new SDKError(\"Network request failed\", {\n code: \"NETWORK\",\n cause: error,\n });\n }\n if (error.name === \"AbortError\") {\n return new SDKError(\"Request cancelled\", {\n code: \"CANCELLED\",\n retryable: false,\n cause: error,\n });\n }\n if (error.message.includes(\"timeout\") || error.name === \"TimeoutError\") {\n return new SDKError(\"Request timeout\", {\n code: \"TIMEOUT\",\n cause: error,\n });\n }\n return new SDKError(error.message, { code: \"UNKNOWN\", cause: error });\n }\n\n return new SDKError(String(error), { code: \"UNKNOWN\" });\n }\n\n /**\n * Extract a human-readable message from a parsed error response body.\n *\n * Probes shapes seen across our upstreams:\n * - `{ message: \"...\" }` — most internal services\n * - `{ error: \"...\" }` — flat-error shape\n * - `{ error: { message: \"...\" } }` — Hetzner Cloud API\n * - `{ error: { details: \"...\" } }` — Hetzner field-level details\n * - `string` — non-JSON text/plain errors\n *\n * Returns null if no message-like field is present so callers can\n * fall back to \"HTTP <status>\". Without this, Hetzner 422s logged\n * as opaque \"HTTP 422\" because the message lives at\n * `body.error.message`, blocking diagnosis of every autoscaler\n * failure (issue #785).\n */\n private static extractMessageFromBody(body: unknown): string | null {\n if (typeof body === \"string\" && body.trim().length > 0) {\n return body.length > 500 ? `${body.slice(0, 500)}…` : body;\n }\n if (typeof body !== \"object\" || body === null) return null;\n\n const top = body as { message?: unknown; error?: unknown };\n if (typeof top.message === \"string\" && top.message.length > 0) {\n return top.message;\n }\n if (typeof top.error === \"string\" && top.error.length > 0) {\n return top.error;\n }\n if (typeof top.error === \"object\" && top.error !== null) {\n const inner = top.error as {\n message?: unknown;\n details?: unknown;\n code?: unknown;\n };\n const message =\n typeof inner.message === \"string\" && inner.message.length > 0\n ? inner.message\n : null;\n const details =\n typeof inner.details === \"string\" && inner.details.length > 0\n ? inner.details\n : null;\n const code =\n typeof inner.code === \"string\" && inner.code.length > 0\n ? inner.code\n : null;\n const parts = [code, message, details].filter(\n (part): part is string => part !== null,\n );\n if (parts.length > 0) return parts.join(\": \");\n }\n return null;\n }\n\n /** Check if error is retryable after token refresh */\n isAuthExpired(): boolean {\n return (\n this.code === \"AUTH_EXPIRED\" ||\n (this.code === \"AUTH\" && this.status === 401)\n );\n }\n}\n\n/** Type guard for SDKError */\nexport function isSDKError(error: unknown): error is SDKError {\n return error instanceof SDKError;\n}\n\n/** Type guard for retryable errors */\nexport function isRetryable(error: unknown): boolean {\n return isSDKError(error) && error.retryable;\n}\n"],"mappings":"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"}
|
package/dist/events/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as EventChannel, c as EventBufferConfig, i as ChannelHandler, n as EventDeduplicator, o as BufferedEvent, r as ChannelConfig, s as EventBuffer, t as DeduplicatorConfig } from "../index-
|
|
2
|
-
export { BufferedEvent, ChannelConfig, ChannelHandler, DeduplicatorConfig, EventBuffer, EventBufferConfig, EventChannel, EventDeduplicator };
|
|
1
|
+
import { a as EventChannel, c as EventBufferConfig, i as ChannelHandler, n as EventDeduplicator, o as BufferedEvent, r as ChannelConfig, s as EventBuffer, t as DeduplicatorConfig } from "../index-CuBvSsBf.js";
|
|
2
|
+
export { type BufferedEvent, type ChannelConfig, type ChannelHandler, type DeduplicatorConfig, EventBuffer, type EventBufferConfig, EventChannel, EventDeduplicator };
|
package/dist/events/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as EventChannel, r as EventBuffer, t as EventDeduplicator } from "../events-
|
|
1
|
+
import { n as EventChannel, r as EventBuffer, t as EventDeduplicator } from "../events-U7kxNUpM.js";
|
|
2
2
|
export { EventBuffer, EventChannel, EventDeduplicator };
|
|
@@ -25,10 +25,12 @@ var EventBuffer = class {
|
|
|
25
25
|
timestamp: Date.now(),
|
|
26
26
|
eventType
|
|
27
27
|
};
|
|
28
|
-
if (this.events.length >= this.config.maxSize)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
if (this.events.length >= this.config.maxSize) {
|
|
29
|
+
if (this.config.overflowStrategy === "drop-oldest") {
|
|
30
|
+
const removed = this.events.shift();
|
|
31
|
+
if (removed) this.seenIds.delete(removed.id);
|
|
32
|
+
} else return;
|
|
33
|
+
}
|
|
32
34
|
this.events.push(event);
|
|
33
35
|
this.seenIds.add(id);
|
|
34
36
|
}
|
|
@@ -260,4 +262,4 @@ var EventDeduplicator = class {
|
|
|
260
262
|
//#endregion
|
|
261
263
|
export { EventChannel as n, EventBuffer as r, EventDeduplicator as t };
|
|
262
264
|
|
|
263
|
-
//# sourceMappingURL=events-
|
|
265
|
+
//# sourceMappingURL=events-U7kxNUpM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events-CUWh9qrv.js","names":["DEFAULT_CONFIG","DEFAULT_CONFIG"],"sources":["../src/events/buffer.ts","../src/events/channel.ts","../src/events/deduplication.ts"],"sourcesContent":["/**\n * Event Buffer\n *\n * Buffers events during disconnections for replay on reconnect.\n * Implements overflow handling with configurable strategies.\n */\n\nexport interface EventBufferConfig {\n /** Maximum number of events to buffer (default: 1000) */\n maxSize: number;\n /** Time-to-live in milliseconds for buffered events (default: 300000 = 5min) */\n ttlMs: number;\n /** Strategy when buffer is full: \"drop-oldest\" or \"drop-newest\" */\n overflowStrategy: \"drop-oldest\" | \"drop-newest\";\n}\n\nexport interface BufferedEvent<T = unknown> {\n id: string;\n data: T;\n timestamp: number;\n eventType?: string;\n}\n\nconst DEFAULT_CONFIG: EventBufferConfig = {\n maxSize: 1000,\n ttlMs: 300000,\n overflowStrategy: \"drop-oldest\",\n};\n\nexport class EventBuffer<T = unknown> {\n private readonly config: EventBufferConfig;\n private events: BufferedEvent<T>[] = [];\n private seenIds: Set<string> = new Set();\n private cleanupTimer?: ReturnType<typeof setInterval>;\n\n constructor(config: Partial<EventBufferConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.startCleanup();\n }\n\n /** Add an event to the buffer (deduplicates by ID) */\n push(id: string, data: T, eventType?: string): void {\n // Deduplicate by event ID to prevent duplicate events during replay\n if (this.seenIds.has(id)) {\n return;\n }\n\n const event: BufferedEvent<T> = {\n id,\n data,\n timestamp: Date.now(),\n eventType,\n };\n\n if (this.events.length >= this.config.maxSize) {\n if (this.config.overflowStrategy === \"drop-oldest\") {\n const removed = this.events.shift();\n if (removed) {\n this.seenIds.delete(removed.id);\n }\n } else {\n return; // drop-newest: don't add\n }\n }\n\n this.events.push(event);\n this.seenIds.add(id);\n }\n\n /** Get all buffered events */\n getAll(): BufferedEvent<T>[] {\n this.pruneExpired();\n return [...this.events];\n }\n\n /** Get events since a specific event ID */\n getSince(lastEventId: string): BufferedEvent<T>[] {\n this.pruneExpired();\n const index = this.events.findIndex((e) => e.id === lastEventId);\n if (index === -1) {\n return [...this.events];\n }\n return this.events.slice(index + 1);\n }\n\n /** Get events after a timestamp */\n getSinceTimestamp(timestamp: number): BufferedEvent<T>[] {\n this.pruneExpired();\n return this.events.filter((e) => e.timestamp > timestamp);\n }\n\n /** Clear all buffered events */\n clear(): void {\n this.events = [];\n this.seenIds.clear();\n }\n\n /** Get current buffer size */\n size(): number {\n return this.events.length;\n }\n\n /** Check if buffer is empty */\n isEmpty(): boolean {\n return this.events.length === 0;\n }\n\n /** Check if buffer is full */\n isFull(): boolean {\n return this.events.length >= this.config.maxSize;\n }\n\n /** Dispose of the buffer and cleanup resources */\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n this.clear();\n }\n\n private pruneExpired(): void {\n const cutoff = Date.now() - this.config.ttlMs;\n const expired = this.events.filter((e) => e.timestamp <= cutoff);\n for (const e of expired) {\n this.seenIds.delete(e.id);\n }\n this.events = this.events.filter((e) => e.timestamp > cutoff);\n }\n\n private startCleanup(): void {\n // Run cleanup every minute\n this.cleanupTimer = setInterval(() => this.pruneExpired(), 60000);\n }\n}\n","/**\n * Channel Pub/Sub\n *\n * Topic-based event distribution with wildcard pattern matching.\n * Supports patterns like \"message.*\", \"**\", and exact matches.\n */\n\nexport type ChannelHandler<T = unknown> = (message: T, topic: string) => void;\n\nexport interface ChannelConfig {\n /** Maximum number of subscribers per topic (default: 100) */\n maxSubscribersPerTopic: number;\n /** Enable wildcard patterns (default: true) */\n enableWildcards: boolean;\n}\n\ninterface Subscriber<T> {\n pattern: string;\n handler: ChannelHandler<T>;\n regex?: RegExp;\n}\n\nconst DEFAULT_CONFIG: ChannelConfig = {\n maxSubscribersPerTopic: 100,\n enableWildcards: true,\n};\n\nexport class EventChannel<T = unknown> {\n private readonly config: ChannelConfig;\n private readonly subscribers: Subscriber<T>[] = [];\n\n constructor(config: Partial<ChannelConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Subscribe to a topic or pattern.\n *\n * Patterns:\n * - \"exact.topic\" - matches only \"exact.topic\"\n * - \"prefix.*\" - matches \"prefix.foo\", \"prefix.bar\", etc.\n * - \"prefix.**\" - matches \"prefix.foo\", \"prefix.foo.bar\", etc.\n * - \"**\" - matches all topics\n *\n * Returns an unsubscribe function.\n */\n subscribe(pattern: string, handler: ChannelHandler<T>): () => void {\n const subscriber: Subscriber<T> = {\n pattern,\n handler,\n regex: this.config.enableWildcards\n ? this.patternToRegex(pattern)\n : undefined,\n };\n\n this.subscribers.push(subscriber);\n\n return () => {\n const index = this.subscribers.indexOf(subscriber);\n if (index !== -1) {\n this.subscribers.splice(index, 1);\n }\n };\n }\n\n /**\n * Publish a message to a topic.\n * Delivers to all matching subscribers.\n */\n publish(topic: string, message: T): number {\n let delivered = 0;\n\n for (const subscriber of this.subscribers) {\n if (this.matches(subscriber, topic)) {\n try {\n subscriber.handler(message, topic);\n delivered++;\n } catch (error) {\n console.error(`Error in channel handler for ${topic}:`, error);\n }\n }\n }\n\n return delivered;\n }\n\n /**\n * Check if any subscribers are listening to a topic.\n */\n hasSubscribers(topic: string): boolean {\n return this.subscribers.some((s) => this.matches(s, topic));\n }\n\n /**\n * Get the number of subscribers for a topic.\n */\n subscriberCount(topic: string): number {\n return this.subscribers.filter((s) => this.matches(s, topic)).length;\n }\n\n /**\n * Get all unique patterns being subscribed to.\n */\n getPatterns(): string[] {\n return [...new Set(this.subscribers.map((s) => s.pattern))];\n }\n\n /**\n * Clear all subscribers.\n */\n clear(): void {\n this.subscribers.length = 0;\n }\n\n /**\n * Get total subscriber count.\n */\n size(): number {\n return this.subscribers.length;\n }\n\n private matches(subscriber: Subscriber<T>, topic: string): boolean {\n if (!this.config.enableWildcards || !subscriber.regex) {\n return subscriber.pattern === topic;\n }\n return subscriber.regex.test(topic);\n }\n\n private patternToRegex(pattern: string): RegExp {\n // Handle special patterns\n if (pattern === \"**\") {\n return /^.*$/;\n }\n\n // Escape special regex characters except * and .\n let escaped = pattern.replace(/[+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n // Replace ** with match-all\n escaped = escaped.replace(/\\*\\*/g, \"<<<GLOBSTAR>>>\");\n\n // Replace * with single-segment match\n escaped = escaped.replace(/\\*/g, \"[^.]+\");\n\n // Restore globstar\n escaped = escaped.replace(/<<<GLOBSTAR>>>/g, \".*\");\n\n return new RegExp(`^${escaped}$`);\n }\n}\n","/**\n * Event Deduplication\n *\n * LRU-bounded set for tracking seen event IDs.\n * Prevents duplicate event processing during reconnections.\n */\n\nexport interface DeduplicatorConfig {\n /** Maximum number of event IDs to track (default: 10000) */\n maxSize: number;\n /** Time window in milliseconds for deduplication (default: 60000 = 1min) */\n windowMs: number;\n}\n\ninterface TrackedEvent {\n timestamp: number;\n}\n\nconst DEFAULT_CONFIG: DeduplicatorConfig = {\n maxSize: 10000,\n windowMs: 60000,\n};\n\nexport class EventDeduplicator {\n private readonly config: DeduplicatorConfig;\n private readonly seen: Map<string, TrackedEvent> = new Map();\n private cleanupTimer?: ReturnType<typeof setInterval>;\n\n constructor(config: Partial<DeduplicatorConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.startCleanup();\n }\n\n /**\n * Check if an event has been seen and mark it as seen.\n * Returns true if this is a duplicate, false if it's new.\n */\n isDuplicate(eventId: string): boolean {\n const now = Date.now();\n const existing = this.seen.get(eventId);\n\n if (existing && now - existing.timestamp < this.config.windowMs) {\n return true;\n }\n\n // Evict oldest if at capacity\n if (this.seen.size >= this.config.maxSize) {\n this.evictOldest();\n }\n\n this.seen.set(eventId, { timestamp: now });\n return false;\n }\n\n /**\n * Mark an event as seen without checking for duplicates.\n */\n markSeen(eventId: string): void {\n if (this.seen.size >= this.config.maxSize) {\n this.evictOldest();\n }\n this.seen.set(eventId, { timestamp: Date.now() });\n }\n\n /**\n * Check if an event has been seen (without marking).\n */\n hasSeen(eventId: string): boolean {\n const existing = this.seen.get(eventId);\n if (!existing) return false;\n return Date.now() - existing.timestamp < this.config.windowMs;\n }\n\n /**\n * Clear all tracked events.\n */\n clear(): void {\n this.seen.clear();\n }\n\n /**\n * Get the number of tracked events.\n */\n size(): number {\n return this.seen.size;\n }\n\n /**\n * Dispose of the deduplicator and cleanup resources.\n */\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n this.clear();\n }\n\n private evictOldest(): void {\n // Map maintains insertion order, so first entry is oldest\n const firstKey = this.seen.keys().next().value;\n if (firstKey !== undefined) {\n this.seen.delete(firstKey);\n }\n }\n\n private pruneExpired(): void {\n const cutoff = Date.now() - this.config.windowMs;\n for (const [id, entry] of this.seen) {\n if (entry.timestamp < cutoff) {\n this.seen.delete(id);\n }\n }\n }\n\n private startCleanup(): void {\n // Run cleanup every 30 seconds\n this.cleanupTimer = setInterval(() => this.pruneExpired(), 30000);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"events-U7kxNUpM.js","names":["DEFAULT_CONFIG","DEFAULT_CONFIG"],"sources":["../src/events/buffer.ts","../src/events/channel.ts","../src/events/deduplication.ts"],"sourcesContent":["/**\n * Event Buffer\n *\n * Buffers events during disconnections for replay on reconnect.\n * Implements overflow handling with configurable strategies.\n */\n\nexport interface EventBufferConfig {\n /** Maximum number of events to buffer (default: 1000) */\n maxSize: number;\n /** Time-to-live in milliseconds for buffered events (default: 300000 = 5min) */\n ttlMs: number;\n /** Strategy when buffer is full: \"drop-oldest\" or \"drop-newest\" */\n overflowStrategy: \"drop-oldest\" | \"drop-newest\";\n}\n\nexport interface BufferedEvent<T = unknown> {\n id: string;\n data: T;\n timestamp: number;\n eventType?: string;\n}\n\nconst DEFAULT_CONFIG: EventBufferConfig = {\n maxSize: 1000,\n ttlMs: 300000,\n overflowStrategy: \"drop-oldest\",\n};\n\nexport class EventBuffer<T = unknown> {\n private readonly config: EventBufferConfig;\n private events: BufferedEvent<T>[] = [];\n private seenIds: Set<string> = new Set();\n private cleanupTimer?: ReturnType<typeof setInterval>;\n\n constructor(config: Partial<EventBufferConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.startCleanup();\n }\n\n /** Add an event to the buffer (deduplicates by ID) */\n push(id: string, data: T, eventType?: string): void {\n // Deduplicate by event ID to prevent duplicate events during replay\n if (this.seenIds.has(id)) {\n return;\n }\n\n const event: BufferedEvent<T> = {\n id,\n data,\n timestamp: Date.now(),\n eventType,\n };\n\n if (this.events.length >= this.config.maxSize) {\n if (this.config.overflowStrategy === \"drop-oldest\") {\n const removed = this.events.shift();\n if (removed) {\n this.seenIds.delete(removed.id);\n }\n } else {\n return; // drop-newest: don't add\n }\n }\n\n this.events.push(event);\n this.seenIds.add(id);\n }\n\n /** Get all buffered events */\n getAll(): BufferedEvent<T>[] {\n this.pruneExpired();\n return [...this.events];\n }\n\n /** Get events since a specific event ID */\n getSince(lastEventId: string): BufferedEvent<T>[] {\n this.pruneExpired();\n const index = this.events.findIndex((e) => e.id === lastEventId);\n if (index === -1) {\n return [...this.events];\n }\n return this.events.slice(index + 1);\n }\n\n /** Get events after a timestamp */\n getSinceTimestamp(timestamp: number): BufferedEvent<T>[] {\n this.pruneExpired();\n return this.events.filter((e) => e.timestamp > timestamp);\n }\n\n /** Clear all buffered events */\n clear(): void {\n this.events = [];\n this.seenIds.clear();\n }\n\n /** Get current buffer size */\n size(): number {\n return this.events.length;\n }\n\n /** Check if buffer is empty */\n isEmpty(): boolean {\n return this.events.length === 0;\n }\n\n /** Check if buffer is full */\n isFull(): boolean {\n return this.events.length >= this.config.maxSize;\n }\n\n /** Dispose of the buffer and cleanup resources */\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n this.clear();\n }\n\n private pruneExpired(): void {\n const cutoff = Date.now() - this.config.ttlMs;\n const expired = this.events.filter((e) => e.timestamp <= cutoff);\n for (const e of expired) {\n this.seenIds.delete(e.id);\n }\n this.events = this.events.filter((e) => e.timestamp > cutoff);\n }\n\n private startCleanup(): void {\n // Run cleanup every minute\n this.cleanupTimer = setInterval(() => this.pruneExpired(), 60000);\n }\n}\n","/**\n * Channel Pub/Sub\n *\n * Topic-based event distribution with wildcard pattern matching.\n * Supports patterns like \"message.*\", \"**\", and exact matches.\n */\n\nexport type ChannelHandler<T = unknown> = (message: T, topic: string) => void;\n\nexport interface ChannelConfig {\n /** Maximum number of subscribers per topic (default: 100) */\n maxSubscribersPerTopic: number;\n /** Enable wildcard patterns (default: true) */\n enableWildcards: boolean;\n}\n\ninterface Subscriber<T> {\n pattern: string;\n handler: ChannelHandler<T>;\n regex?: RegExp;\n}\n\nconst DEFAULT_CONFIG: ChannelConfig = {\n maxSubscribersPerTopic: 100,\n enableWildcards: true,\n};\n\nexport class EventChannel<T = unknown> {\n private readonly config: ChannelConfig;\n private readonly subscribers: Subscriber<T>[] = [];\n\n constructor(config: Partial<ChannelConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Subscribe to a topic or pattern.\n *\n * Patterns:\n * - \"exact.topic\" - matches only \"exact.topic\"\n * - \"prefix.*\" - matches \"prefix.foo\", \"prefix.bar\", etc.\n * - \"prefix.**\" - matches \"prefix.foo\", \"prefix.foo.bar\", etc.\n * - \"**\" - matches all topics\n *\n * Returns an unsubscribe function.\n */\n subscribe(pattern: string, handler: ChannelHandler<T>): () => void {\n const subscriber: Subscriber<T> = {\n pattern,\n handler,\n regex: this.config.enableWildcards\n ? this.patternToRegex(pattern)\n : undefined,\n };\n\n this.subscribers.push(subscriber);\n\n return () => {\n const index = this.subscribers.indexOf(subscriber);\n if (index !== -1) {\n this.subscribers.splice(index, 1);\n }\n };\n }\n\n /**\n * Publish a message to a topic.\n * Delivers to all matching subscribers.\n */\n publish(topic: string, message: T): number {\n let delivered = 0;\n\n for (const subscriber of this.subscribers) {\n if (this.matches(subscriber, topic)) {\n try {\n subscriber.handler(message, topic);\n delivered++;\n } catch (error) {\n console.error(`Error in channel handler for ${topic}:`, error);\n }\n }\n }\n\n return delivered;\n }\n\n /**\n * Check if any subscribers are listening to a topic.\n */\n hasSubscribers(topic: string): boolean {\n return this.subscribers.some((s) => this.matches(s, topic));\n }\n\n /**\n * Get the number of subscribers for a topic.\n */\n subscriberCount(topic: string): number {\n return this.subscribers.filter((s) => this.matches(s, topic)).length;\n }\n\n /**\n * Get all unique patterns being subscribed to.\n */\n getPatterns(): string[] {\n return [...new Set(this.subscribers.map((s) => s.pattern))];\n }\n\n /**\n * Clear all subscribers.\n */\n clear(): void {\n this.subscribers.length = 0;\n }\n\n /**\n * Get total subscriber count.\n */\n size(): number {\n return this.subscribers.length;\n }\n\n private matches(subscriber: Subscriber<T>, topic: string): boolean {\n if (!this.config.enableWildcards || !subscriber.regex) {\n return subscriber.pattern === topic;\n }\n return subscriber.regex.test(topic);\n }\n\n private patternToRegex(pattern: string): RegExp {\n // Handle special patterns\n if (pattern === \"**\") {\n return /^.*$/;\n }\n\n // Escape special regex characters except * and .\n let escaped = pattern.replace(/[+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n // Replace ** with match-all\n escaped = escaped.replace(/\\*\\*/g, \"<<<GLOBSTAR>>>\");\n\n // Replace * with single-segment match\n escaped = escaped.replace(/\\*/g, \"[^.]+\");\n\n // Restore globstar\n escaped = escaped.replace(/<<<GLOBSTAR>>>/g, \".*\");\n\n return new RegExp(`^${escaped}$`);\n }\n}\n","/**\n * Event Deduplication\n *\n * LRU-bounded set for tracking seen event IDs.\n * Prevents duplicate event processing during reconnections.\n */\n\nexport interface DeduplicatorConfig {\n /** Maximum number of event IDs to track (default: 10000) */\n maxSize: number;\n /** Time window in milliseconds for deduplication (default: 60000 = 1min) */\n windowMs: number;\n}\n\ninterface TrackedEvent {\n timestamp: number;\n}\n\nconst DEFAULT_CONFIG: DeduplicatorConfig = {\n maxSize: 10000,\n windowMs: 60000,\n};\n\nexport class EventDeduplicator {\n private readonly config: DeduplicatorConfig;\n private readonly seen: Map<string, TrackedEvent> = new Map();\n private cleanupTimer?: ReturnType<typeof setInterval>;\n\n constructor(config: Partial<DeduplicatorConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.startCleanup();\n }\n\n /**\n * Check if an event has been seen and mark it as seen.\n * Returns true if this is a duplicate, false if it's new.\n */\n isDuplicate(eventId: string): boolean {\n const now = Date.now();\n const existing = this.seen.get(eventId);\n\n if (existing && now - existing.timestamp < this.config.windowMs) {\n return true;\n }\n\n // Evict oldest if at capacity\n if (this.seen.size >= this.config.maxSize) {\n this.evictOldest();\n }\n\n this.seen.set(eventId, { timestamp: now });\n return false;\n }\n\n /**\n * Mark an event as seen without checking for duplicates.\n */\n markSeen(eventId: string): void {\n if (this.seen.size >= this.config.maxSize) {\n this.evictOldest();\n }\n this.seen.set(eventId, { timestamp: Date.now() });\n }\n\n /**\n * Check if an event has been seen (without marking).\n */\n hasSeen(eventId: string): boolean {\n const existing = this.seen.get(eventId);\n if (!existing) return false;\n return Date.now() - existing.timestamp < this.config.windowMs;\n }\n\n /**\n * Clear all tracked events.\n */\n clear(): void {\n this.seen.clear();\n }\n\n /**\n * Get the number of tracked events.\n */\n size(): number {\n return this.seen.size;\n }\n\n /**\n * Dispose of the deduplicator and cleanup resources.\n */\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n this.clear();\n }\n\n private evictOldest(): void {\n // Map maintains insertion order, so first entry is oldest\n const firstKey = this.seen.keys().next().value;\n if (firstKey !== undefined) {\n this.seen.delete(firstKey);\n }\n }\n\n private pruneExpired(): void {\n const cutoff = Date.now() - this.config.windowMs;\n for (const [id, entry] of this.seen) {\n if (entry.timestamp < cutoff) {\n this.seen.delete(id);\n }\n }\n }\n\n private startCleanup(): void {\n // Run cleanup every 30 seconds\n this.cleanupTimer = setInterval(() => this.pruneExpired(), 30000);\n }\n}\n"],"mappings":"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"}
|
|
@@ -52,4 +52,4 @@ declare function isSDKError(error: unknown): error is SDKError;
|
|
|
52
52
|
declare function isRetryable(error: unknown): boolean;
|
|
53
53
|
//#endregion
|
|
54
54
|
export { isSDKError as i, SDKError as n, isRetryable as r, ErrorCode as t };
|
|
55
|
-
//# sourceMappingURL=index-
|
|
55
|
+
//# sourceMappingURL=index-BFYASYJk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BFYASYJk.d.ts","names":[],"sources":["../src/errors/index.ts"],"mappings":";;;;;;;KAOY;;cAaC,iBAAiB;WACnB,MAAM;WACN;WACA;WACA;WACA,UAAU;EAEnB,YACE,iBACA;IACE,MAAM;IACN;IACA;IACA;IACA,UAAU;IACV,QAAQ;;UAaJ;;SAYD,aAAa,gBAAgB,iBAAiB;;SAgE9C,UAAU,iBAAiB;;;;;;;;;;;;;;;;;iBA8CnB;;EAwCf;;;iBASc,WAAW,iBAAiB,SAAS;;iBAKrC,YAAY"}
|
|
@@ -399,4 +399,4 @@ declare function promptTokens(usage: TokenUsageCounts): number;
|
|
|
399
399
|
declare function cacheHitRate(usage: TokenUsageCounts): number | undefined;
|
|
400
400
|
//#endregion
|
|
401
401
|
export { CONTENT_KEY_FIELD as $, TANGLE_SUBJECT_KEY as A, GEN_AI_MODEL_KEYS as B, RUN_KEY_ATTRS as C, TANGLE_RUN_ID_KEY as D, TANGLE_RUN_ID_CAMEL_KEY as E, TRIGGER_ID_ATTRS as F, GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS as G, GEN_AI_OUTPUT_TOKEN_KEYS as H, TRIGGER_SOURCE_ATTRS as I, GEN_AI_USAGE_OUTPUT_TOKENS as J, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS as K, WORKFLOW_MARKER_ATTRS as L, TANGLE_TRIGGER_KIND_KEY as M, TANGLE_TRIGGER_SOURCE_KEY as N, TANGLE_RUN_KIND_KEY as O, TANGLE_WORKFLOW_ID_KEY as P, CONTENT_KEYS as Q, GEN_AI_CONVERSATION_ID as R, PARENT_RUN_KEY_ATTRS as S, SUBJECT_KEY_ATTRS as T, GEN_AI_REQUEST_MODEL as U, GEN_AI_OPERATION_NAME as V, GEN_AI_RESPONSE_MODEL as W, genAiUsageAttributes as X, GenAiUsage as Y, CONTENT_COMPLETION_KEY as Z, promptTokens as _, TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS as a, DeclaredIntentMatch as at, tokenCount as b, TOKEN_USAGE_COST_KEYS as c, asContentField as ct, TOKEN_USAGE_OUTPUT_KEYS as d, declaredTaskText as dt, CONTENT_PROMPT_KEY as et, TokenUsageCounts as f, extractContent as ft, firstUsageCostUsd as g, resolveDeclaredIntent as gt, firstTokenCount as h, normalizeContentAttributes as ht, TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS as i, ContentField as it, TANGLE_TRIGGER_ID_KEY as j, TANGLE_RUN_PARENT_ID_KEY as k, TOKEN_USAGE_DETAIL_KEYS as l, asContentString as lt, cacheHitRate as m, logRecordContentBag as mt, TOKEN_USAGE_CACHE_BAG_READ_KEYS as n, CONTENT_TOOL_NAME_KEY as nt, TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS as o, INDEXED_CONTENT_KEY_LIKE_PATTERNS as ot, addTokenUsage as p, hasContent as pt, GEN_AI_USAGE_INPUT_TOKENS as q, TOKEN_USAGE_CACHE_BAG_WRITE_KEYS as r, CONTENT_TOOL_RESULT_KEY as rt, TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS as s, NormalizedContent as st, TOKEN_USAGE_CACHE_BAG_KEYS as t, CONTENT_TOOL_ARGS_KEY as tt, TOKEN_USAGE_INPUT_KEYS as u, classifyAgent as ut, readTokenCostUsd as v, RUN_KIND_ATTRS as w, tokenUsageSource as x, readTokenUsage as y, GEN_AI_INPUT_TOKEN_KEYS as z };
|
|
402
|
-
//# sourceMappingURL=index-
|
|
402
|
+
//# sourceMappingURL=index-BvjA5i93.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BvjA5i93.d.ts","names":[],"sources":["../src/telemetry/content-attributes.ts","../src/telemetry/genai-attributes.ts","../src/telemetry/spine-attributes.ts","../src/telemetry/token-usage.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAiCiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;;;;KAMU,qBAAqB;;cAYpB;;cAEA;;cAEA;;cAEA;;cAEA;;;;;;;;cA+JA;;;;cAOA,mBAAmB,SAAS,eAAe;;;iBAKxC,eAAe;;;;iBAWf,gBAAgB;;;;;;;;;cAyKnB;;;;;;;;iBAoNG,2BACd,KAAK,6CACJ;;;;;;;iBAyGa,eACd,YAAY,6CACX;;;;;iBA0Ba,WACd,YAAY;;;;;;;;;;;;;;iBAkCE,oBACd,YAAY,4CACZ,kCACC;;;;;;;;;;;;;;iBA2Ca,cACd,KAAK;;;;;;UA6BU;EACf;;EAEA;;;;;;;;;;;;iBAac,sBACd,MAAM,6CACL;;;;;;;;;;iBA6Ba,iBAAiB,SAAS;;;;;;;;;;;;;;;;;;cC14B7B;;cAEA;;cAEA;;cAEA;;;;cAKA;;cAIA;;cAGA;;cAEA;;;;;cAMA;;;;;cAWA;;cAOA;;UAOI;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;;;iBAcc,qBACd,OAAO,aACN;;;;;;;;;;;;;;;;;;;;;;;;cCvEU;;cAEA;;cAEA;;cAEA;;cAEA;;cAEA;;cAEA;;cAEA;;;cAGA;;cAGA;;;;;;cAUA;;cASA;;cAOA;;;;;;cAUA;;;cAUA;;cAKA;;;;;;;;;;;;;;;;;;;;cC5EA;cAQA;cAQA;;;;;;;;;;;;;;;;;;;;;;;cA8BA;cAQA;cASA;cAGA;;;;cAYA;;;;;;;;;;;;;;;cAqBA;cAMA;cAIA;;;;;;;;;;;UAaI;;EAEf;EACA;;;;EAIA;;EAEA;;iBAGc,WAAW;iBAeX,gBACd,QAAQ,qCACR;iBAwBc,kBACd,QAAQ,qCACR;iBAUc,iBACd,MAAM,0BACL;iBA2Ga,eACd,MAAM,0BACL;iBA4Ba,iBACd,MAAM;iBAkBQ,cACd,SAAS,8BACT,MAAM,mBACL;;;;iBAqBa,aAAa,OAAO;;;;iBAWpB,aAAa,OAAO"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { n as SDKError } from "./index-
|
|
2
|
-
|
|
1
|
+
import { n as SDKError } from "./index-BFYASYJk.js";
|
|
3
2
|
//#region src/resilience/circuit-breaker.d.ts
|
|
4
3
|
type CircuitState = "closed" | "open" | "half-open";
|
|
5
4
|
interface CircuitBreakerConfig {
|
|
@@ -105,4 +104,4 @@ declare function createTimeoutController(timeoutMs: number): {
|
|
|
105
104
|
declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
106
105
|
//#endregion
|
|
107
106
|
export { ProtectionOptions as a, CircuitBreaker as c, CircuitOpenError as d, CircuitState as f, withTimeout as i, CircuitBreakerConfig as l, createTimeoutController as n, createProtectedFn as o, sleep as r, withProtection as s, TimeoutError as t, CircuitBreakerStats as u };
|
|
108
|
-
//# sourceMappingURL=index-
|
|
107
|
+
//# sourceMappingURL=index-CKDeaS7l.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CKDeaS7l.d.ts","names":[],"sources":["../src/resilience/circuit-breaker.ts","../src/resilience/protection.ts","../src/resilience/timeout.ts"],"mappings":";;KAeY;UAEK;;EAEf;;EAEA;;EAEA;;EAEA,iBAAiB;;UAGF;EACf,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;;cAGW,yBAAyB;WAC3B;WACA;EAET,YAAY,cAAc;;cAaf;mBAYQ;mBACA;UAZX;UACA;UACA;UACA;UAGA;UACA;UACA;EAER,YACmB,cACA,QAAQ;;;;;EAiBrB,QAAQ,GAAG,UAAU,QAAQ,KAAK,QAAQ;UA6BxC;UAiBA;;EAwBR,YAAY;;EAKZ,YAAY;;EAaZ;;EAcA;;EAQA;;;;UC5Le;;EAEf;;EAEA,UAAU;;EAEV;;;;;;;;;;;iBAYoB,eAAe,GACnC,UAAU,QAAQ,IAClB,UAAS,oBACR,QAAQ;;;;iBAoBK,kBAAkB,yBAAyB,SACzD,QAAQ,MAAM,UAAU,QAAQ,UAChC,SAAS,wBACJ,MAAM,UAAU,QAAQ;;;cC3ClB,qBAAqB;WACvB;EAET,YAAY,iBAAiB;;;;;;iBAef,YAAY,GAC1B,SAAS,QAAQ,IACjB,mBACA,mBACC,QAAQ;;;;;iBA2BK,wBAAwB;EACtC,YAAY;EACZ;;;;;;iBAyBc,MAAM,YAAY,SAAS,cAAc"}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { FilePart, Part, Part as Part$1, PartBase, ReasoningPart, StreamStatus, SubtaskPart, TextPart, ToolPart, ToolState, ToolStateCompleted, ToolStateError, ToolStatePending, ToolStateRunning, isFilePart, isReasoningPart, isSubtaskPart, isTextPart, isToolPart } from "@tangle-network/agent-interface";
|
|
3
|
-
|
|
4
3
|
//#region src/types/events.d.ts
|
|
5
4
|
declare const AgentEventTypeSchema: z.ZodEnum<{
|
|
6
|
-
error: "error";
|
|
7
|
-
heartbeat: "heartbeat";
|
|
8
|
-
status: "status";
|
|
9
|
-
"message.part.updated": "message.part.updated";
|
|
10
5
|
"connection.init": "connection.init";
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"execution.started": "execution.started";
|
|
6
|
+
done: "done";
|
|
7
|
+
error: "error";
|
|
14
8
|
"execution.completed": "execution.completed";
|
|
15
9
|
"execution.failed": "execution.failed";
|
|
16
|
-
"
|
|
10
|
+
"execution.started": "execution.started";
|
|
11
|
+
heartbeat: "heartbeat";
|
|
12
|
+
"history.replay.end": "history.replay.end";
|
|
13
|
+
"history.replay.start": "history.replay.start";
|
|
14
|
+
"message.part.updated": "message.part.updated";
|
|
17
15
|
result: "result";
|
|
18
|
-
|
|
16
|
+
"session.updated": "session.updated";
|
|
17
|
+
status: "status";
|
|
19
18
|
}>;
|
|
20
19
|
type AgentEventType = z.infer<typeof AgentEventTypeSchema>;
|
|
21
20
|
interface EventMetadata {
|
|
@@ -130,4 +129,4 @@ interface TerminalExitEvent {
|
|
|
130
129
|
type TerminalEvent = TerminalDataEvent | TerminalResizeEvent | TerminalExitEvent;
|
|
131
130
|
//#endregion
|
|
132
131
|
export { ToolStateCompleted as A, TerminalDataEvent as C, TextPart as D, TerminalResizeEvent as E, isReasoningPart as F, isSubtaskPart as I, isTextPart as L, ToolStatePending as M, ToolStateRunning as N, ToolPart as O, isFilePart as P, isToolPart as R, SubtaskPart as S, TerminalExitEvent as T, ReplayEndEvent as _, DoneEvent as a, SessionUpdatedEvent as b, ExecutionCompletedEvent as c, FilePart as d, HeartbeatEvent as f, ReasoningPart as g, PartBase as h, ConnectionInitEvent as i, ToolStateError as j, ToolState as k, ExecutionFailedEvent as l, Part$1 as m, AgentEventType as n, ErrorEvent as o, MessagePartUpdatedEvent as p, AgentEventTypeSchema as r, EventMetadata as s, AgentEvent as t, ExecutionStartedEvent as u, ReplayStartEvent as v, TerminalEvent as w, StatusEvent as x, ResultEvent as y };
|
|
133
|
-
//# sourceMappingURL=index-
|
|
132
|
+
//# sourceMappingURL=index-CQPGv8jg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CQPGv8jg.d.ts","names":[],"sources":["../src/types/events.ts"],"mappings":";;;cAsCa,sBAAoB,EAAA;;;;;;;;;;;;;;;KAgBrB,iBAAiB,EAAE,aAAa;UAG3B;EACf;EACA;EACA;EACA;;UAOe;EACf;EACA,MAAM;EACN;EACA,QAAQ;;UAIO;EACf;EACA,QAAQ;EACR;EACA,QAAQ;;UAIO;EACf;EACA;EACA;EACA;EACA,QAAQ;;UAIO;EACf;EACA;EACA,QAAQ;;UAIO;EACf;EACA;EACA;EACA;EACA;EACA,QAAQ;;UAIO;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAIe;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAIe;EACf;EACA;EACA;EACA;IAAS;IAAkB;;;UAIZ;EACf;EACA;EACA;EACA,aAAa;EACb,SAAS;EACT,WAAW;;UAII;EACf;EACA;;KAIU,aACR,0BACA,cACA,aACA,iBACA,sBACA,mBACA,iBACA,wBACA,0BACA,uBACA,sBACA,cACA;UAGa;EACf;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;;KAGU,gBACR,oBACA,sBACA"}
|
|
@@ -155,4 +155,4 @@ declare class EventDeduplicator {
|
|
|
155
155
|
}
|
|
156
156
|
//#endregion
|
|
157
157
|
export { EventChannel as a, EventBufferConfig as c, ChannelHandler as i, EventDeduplicator as n, BufferedEvent as o, ChannelConfig as r, EventBuffer as s, DeduplicatorConfig as t };
|
|
158
|
-
//# sourceMappingURL=index-
|
|
158
|
+
//# sourceMappingURL=index-CuBvSsBf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CuBvSsBf.d.ts","names":[],"sources":["../src/events/buffer.ts","../src/events/channel.ts","../src/events/deduplication.ts"],"mappings":";;;;;;;UAOiB;;EAEf;;EAEA;;EAEA;;UAGe,cAAc;EAC7B;EACA,MAAM;EACN;EACA;;cASW,YAAY;mBACN;UACT;UACA;UACA;EAER,YAAY,SAAQ,QAAQ;;EAM5B,KAAK,YAAY,MAAM,GAAG;;EA6B1B,UAAU,cAAc;;EAMxB,SAAS,sBAAsB,cAAc;;EAU7C,kBAAkB,oBAAoB,cAAc;;EAMpD;;EAMA;;EAKA;;EAKA;;EAKA;UAQQ;UASA;;;;;;;;;;KC3HE,eAAe,gBAAgB,SAAS,GAAG;UAEtC;;EAEf;;EAEA;;cAcW,aAAa;mBACP;mBACA;EAEjB,YAAY,SAAQ,QAAQ;;;;;;;;;;;;EAe5B,UAAU,iBAAiB,SAAS,eAAe;;;;;EAuBnD,QAAQ,eAAe,SAAS;;;;EAoBhC,eAAe;;;;EAOf,gBAAgB;;;;EAOhB;;;;EAOA;;;;EAOA;UAIQ;UAOA;;;;;;;;;;UCzHO;;EAEf;;EAEA;;cAYW;mBACM;mBACA;UACT;EAER,YAAY,SAAQ,QAAQ;;;;;EAS5B,YAAY;;;;EAoBZ,SAAS;;;;EAUT,QAAQ;;;;EASR;;;;EAOA;;;;EAOA;UAQQ;UAQA;UASA"}
|
|
@@ -349,4 +349,4 @@ declare class MockTransportAdapter extends BaseTransportAdapter {
|
|
|
349
349
|
}
|
|
350
350
|
//#endregion
|
|
351
351
|
export { TransportMode as S, StreamOptions as _, RecordedRequest as a, TransportEvents as b, TransportAdapter as c, ConnectionQuality as d, ConnectionState as f, SSEEvent as g, RequestOptions as h, MockTransportConfig as i, ConnectionManager as l, ReconnectionConfig as m, MockStreamEvent as n, BaseTransportAdapter as o, DEFAULT_RECONNECTION_CONFIG as p, MockTransportAdapter as r, Subscription as s, MockResponse as t, ConnectionManagerConfig as u, SubscriptionState as v, TransportMetrics as x, TransportConfig as y };
|
|
352
|
-
//# sourceMappingURL=index-
|
|
352
|
+
//# sourceMappingURL=index-Dq6SfGaX.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-Dq6SfGaX.d.ts","names":[],"sources":["../src/transport/types.ts","../src/transport/connection-manager.ts","../src/transport/interface.ts","../src/transport/mock.ts"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { i as isSDKError, n as SDKError, r as isRetryable, t as ErrorCode } from "./index-
|
|
2
|
-
import { C as ReadTokenAuth, S as
|
|
3
|
-
import { ChannelAccessResult, EnvTokenAuth, ProductAuth, ProductTokenIssuer, SidecarAuth, canBatchTokenAccessChannel, canProjectTokenAccessChannel, canSessionTokenAccessChannel, canTokenAccessChannel,
|
|
4
|
-
import { a as EventChannel, c as EventBufferConfig, i as ChannelHandler, n as EventDeduplicator, o as BufferedEvent, r as ChannelConfig, s as EventBuffer, t as DeduplicatorConfig } from "./index-
|
|
5
|
-
import { S as TransportMode, _ as StreamOptions, a as RecordedRequest, b as TransportEvents, c as TransportAdapter, d as ConnectionQuality, f as ConnectionState, g as SSEEvent, h as RequestOptions, i as MockTransportConfig, l as ConnectionManager, m as ReconnectionConfig, n as MockStreamEvent, o as BaseTransportAdapter, p as DEFAULT_RECONNECTION_CONFIG, r as MockTransportAdapter, s as Subscription, t as MockResponse, u as ConnectionManagerConfig, v as SubscriptionState, x as TransportMetrics, y as TransportConfig } from "./index-
|
|
6
|
-
import { a as ProtectionOptions, c as CircuitBreaker, d as CircuitOpenError, f as CircuitState, i as withTimeout, l as CircuitBreakerConfig, n as createTimeoutController, o as createProtectedFn, r as sleep, s as withProtection, t as TimeoutError, u as CircuitBreakerStats } from "./index-
|
|
1
|
+
import { i as isSDKError, n as SDKError, r as isRetryable, t as ErrorCode } from "./index-BFYASYJk.js";
|
|
2
|
+
import { C as AuthProvider, D as RefreshableTokenAuth, E as ReadTokenAuth, O as StaticTokenAuth, S as TokenValidationResult, T as NoAuth, _ as SendMessageRequest, a as BatchScopedTokenPayloadSchema, b as SessionScopedTokenPayloadSchema, c as CreateSessionResponse, d as ProductSchema, f as ProductSecrets, g as ReadTokenPayloadSchema, h as ReadTokenPayload, i as BatchScopedTokenPayload, l as Product, m as ProjectScopedTokenPayloadSchema, n as getTokenTTL, o as CreateSessionRequest, p as ProjectScopedTokenPayload, r as isTokenExpiringSoon, s as CreateSessionRequestSchema, t as decodeToken, u as ProductAuthInfo, v as SendMessageRequestSchema, w as CallbackAuth, x as TokenScope, y as SessionScopedTokenPayload } from "./tokens-browser-DCV3-WHc.js";
|
|
3
|
+
import { ChannelAccessResult, EnvTokenAuth, ProductAuth, ProductTokenIssuer, SidecarAuth, canBatchTokenAccessChannel, canProjectTokenAccessChannel, canSessionTokenAccessChannel, canTokenAccessChannel, extractProjectFromChannel, extractSessionFromChannel, generateApiKey, generateSecureToken, generateSigningSecret, getAllowedChannelPatterns, getTokenScope, hashApiKey, isBatchScopedToken, isProjectScopedToken, isSessionScopedToken, issueBatchScopedToken, issueProjectScopedToken, issueReadToken, issueSessionScopedToken, validateChannelSubscription, validateTokenScope, verifyApiKey, verifyReadToken } from "./auth/index.js";
|
|
4
|
+
import { a as EventChannel, c as EventBufferConfig, i as ChannelHandler, n as EventDeduplicator, o as BufferedEvent, r as ChannelConfig, s as EventBuffer, t as DeduplicatorConfig } from "./index-CuBvSsBf.js";
|
|
5
|
+
import { S as TransportMode, _ as StreamOptions, a as RecordedRequest, b as TransportEvents, c as TransportAdapter, d as ConnectionQuality, f as ConnectionState, g as SSEEvent, h as RequestOptions, i as MockTransportConfig, l as ConnectionManager, m as ReconnectionConfig, n as MockStreamEvent, o as BaseTransportAdapter, p as DEFAULT_RECONNECTION_CONFIG, r as MockTransportAdapter, s as Subscription, t as MockResponse, u as ConnectionManagerConfig, v as SubscriptionState, x as TransportMetrics, y as TransportConfig } from "./index-Dq6SfGaX.js";
|
|
6
|
+
import { a as ProtectionOptions, c as CircuitBreaker, d as CircuitOpenError, f as CircuitState, i as withTimeout, l as CircuitBreakerConfig, n as createTimeoutController, o as createProtectedFn, r as sleep, s as withProtection, t as TimeoutError, u as CircuitBreakerStats } from "./index-CKDeaS7l.js";
|
|
7
7
|
import { ParsedSSEEvent, SSEChunkParser, SSEEventData, SSEParserOptions, StreamTokenUsage, StreamUsageAccumulator, StreamUsageExtractor, consumeSSEStream, createStreamUsageExtractor, createUsageCallback, parseSSEData, parseSSEStream } from "./sse/index.js";
|
|
8
|
-
import { $ as CONTENT_KEY_FIELD, A as TANGLE_SUBJECT_KEY, B as GEN_AI_MODEL_KEYS, C as RUN_KEY_ATTRS, D as TANGLE_RUN_ID_KEY, E as TANGLE_RUN_ID_CAMEL_KEY, F as TRIGGER_ID_ATTRS, G as GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, H as GEN_AI_OUTPUT_TOKEN_KEYS, I as TRIGGER_SOURCE_ATTRS, J as GEN_AI_USAGE_OUTPUT_TOKENS, K as GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, L as WORKFLOW_MARKER_ATTRS, M as TANGLE_TRIGGER_KIND_KEY, N as TANGLE_TRIGGER_SOURCE_KEY, O as TANGLE_RUN_KIND_KEY, P as TANGLE_WORKFLOW_ID_KEY, Q as CONTENT_KEYS, R as GEN_AI_CONVERSATION_ID, S as PARENT_RUN_KEY_ATTRS, T as SUBJECT_KEY_ATTRS, U as GEN_AI_REQUEST_MODEL, V as GEN_AI_OPERATION_NAME, W as GEN_AI_RESPONSE_MODEL, X as genAiUsageAttributes, Y as GenAiUsage, Z as CONTENT_COMPLETION_KEY, _ as promptTokens, a as TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS, at as DeclaredIntentMatch, b as tokenCount, c as TOKEN_USAGE_COST_KEYS, ct as asContentField, d as TOKEN_USAGE_OUTPUT_KEYS, dt as declaredTaskText, et as CONTENT_PROMPT_KEY, f as TokenUsageCounts, ft as extractContent, g as firstUsageCostUsd, gt as resolveDeclaredIntent, h as firstTokenCount, ht as normalizeContentAttributes, i as TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS, it as ContentField, j as TANGLE_TRIGGER_ID_KEY, k as TANGLE_RUN_PARENT_ID_KEY, l as TOKEN_USAGE_DETAIL_KEYS, lt as asContentString, m as cacheHitRate, mt as logRecordContentBag, n as TOKEN_USAGE_CACHE_BAG_READ_KEYS, nt as CONTENT_TOOL_NAME_KEY, o as TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS, ot as INDEXED_CONTENT_KEY_LIKE_PATTERNS, p as addTokenUsage, pt as hasContent, q as GEN_AI_USAGE_INPUT_TOKENS, r as TOKEN_USAGE_CACHE_BAG_WRITE_KEYS, rt as CONTENT_TOOL_RESULT_KEY, s as TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS, st as NormalizedContent, t as TOKEN_USAGE_CACHE_BAG_KEYS, tt as CONTENT_TOOL_ARGS_KEY, u as TOKEN_USAGE_INPUT_KEYS, ut as classifyAgent, v as readTokenCostUsd, w as RUN_KIND_ATTRS, x as tokenUsageSource, y as readTokenUsage, z as GEN_AI_INPUT_TOKEN_KEYS } from "./index-
|
|
9
|
-
import { A as ToolStateCompleted, C as TerminalDataEvent, D as TextPart, E as TerminalResizeEvent, F as isReasoningPart, I as isSubtaskPart, L as isTextPart, M as ToolStatePending, N as ToolStateRunning, O as ToolPart, P as isFilePart, R as isToolPart, S as SubtaskPart, T as TerminalExitEvent, _ as ReplayEndEvent, a as DoneEvent, b as SessionUpdatedEvent, c as ExecutionCompletedEvent, d as FilePart, f as HeartbeatEvent, g as ReasoningPart, h as PartBase, i as ConnectionInitEvent, j as ToolStateError, k as ToolState, l as ExecutionFailedEvent, m as Part, n as AgentEventType, o as ErrorEvent, p as MessagePartUpdatedEvent, r as AgentEventTypeSchema, s as EventMetadata, t as AgentEvent, u as ExecutionStartedEvent, v as ReplayStartEvent, w as TerminalEvent, x as StatusEvent, y as ResultEvent } from "./index-
|
|
10
|
-
|
|
8
|
+
import { $ as CONTENT_KEY_FIELD, A as TANGLE_SUBJECT_KEY, B as GEN_AI_MODEL_KEYS, C as RUN_KEY_ATTRS, D as TANGLE_RUN_ID_KEY, E as TANGLE_RUN_ID_CAMEL_KEY, F as TRIGGER_ID_ATTRS, G as GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, H as GEN_AI_OUTPUT_TOKEN_KEYS, I as TRIGGER_SOURCE_ATTRS, J as GEN_AI_USAGE_OUTPUT_TOKENS, K as GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, L as WORKFLOW_MARKER_ATTRS, M as TANGLE_TRIGGER_KIND_KEY, N as TANGLE_TRIGGER_SOURCE_KEY, O as TANGLE_RUN_KIND_KEY, P as TANGLE_WORKFLOW_ID_KEY, Q as CONTENT_KEYS, R as GEN_AI_CONVERSATION_ID, S as PARENT_RUN_KEY_ATTRS, T as SUBJECT_KEY_ATTRS, U as GEN_AI_REQUEST_MODEL, V as GEN_AI_OPERATION_NAME, W as GEN_AI_RESPONSE_MODEL, X as genAiUsageAttributes, Y as GenAiUsage, Z as CONTENT_COMPLETION_KEY, _ as promptTokens, a as TOKEN_USAGE_CACHE_READ_INCLUSIVE_KEYS, at as DeclaredIntentMatch, b as tokenCount, c as TOKEN_USAGE_COST_KEYS, ct as asContentField, d as TOKEN_USAGE_OUTPUT_KEYS, dt as declaredTaskText, et as CONTENT_PROMPT_KEY, f as TokenUsageCounts, ft as extractContent, g as firstUsageCostUsd, gt as resolveDeclaredIntent, h as firstTokenCount, ht as normalizeContentAttributes, i as TOKEN_USAGE_CACHE_READ_EXCLUSIVE_KEYS, it as ContentField, j as TANGLE_TRIGGER_ID_KEY, k as TANGLE_RUN_PARENT_ID_KEY, l as TOKEN_USAGE_DETAIL_KEYS, lt as asContentString, m as cacheHitRate, mt as logRecordContentBag, n as TOKEN_USAGE_CACHE_BAG_READ_KEYS, nt as CONTENT_TOOL_NAME_KEY, o as TOKEN_USAGE_CACHE_WRITE_EXCLUSIVE_KEYS, ot as INDEXED_CONTENT_KEY_LIKE_PATTERNS, p as addTokenUsage, pt as hasContent, q as GEN_AI_USAGE_INPUT_TOKENS, r as TOKEN_USAGE_CACHE_BAG_WRITE_KEYS, rt as CONTENT_TOOL_RESULT_KEY, s as TOKEN_USAGE_CACHE_WRITE_INCLUSIVE_KEYS, st as NormalizedContent, t as TOKEN_USAGE_CACHE_BAG_KEYS, tt as CONTENT_TOOL_ARGS_KEY, u as TOKEN_USAGE_INPUT_KEYS, ut as classifyAgent, v as readTokenCostUsd, w as RUN_KIND_ATTRS, x as tokenUsageSource, y as readTokenUsage, z as GEN_AI_INPUT_TOKEN_KEYS } from "./index-BvjA5i93.js";
|
|
9
|
+
import { A as ToolStateCompleted, C as TerminalDataEvent, D as TextPart, E as TerminalResizeEvent, F as isReasoningPart, I as isSubtaskPart, L as isTextPart, M as ToolStatePending, N as ToolStateRunning, O as ToolPart, P as isFilePart, R as isToolPart, S as SubtaskPart, T as TerminalExitEvent, _ as ReplayEndEvent, a as DoneEvent, b as SessionUpdatedEvent, c as ExecutionCompletedEvent, d as FilePart, f as HeartbeatEvent, g as ReasoningPart, h as PartBase, i as ConnectionInitEvent, j as ToolStateError, k as ToolState, l as ExecutionFailedEvent, m as Part, n as AgentEventType, o as ErrorEvent, p as MessagePartUpdatedEvent, r as AgentEventTypeSchema, s as EventMetadata, t as AgentEvent, u as ExecutionStartedEvent, v as ReplayStartEvent, w as TerminalEvent, x as StatusEvent, y as ResultEvent } from "./index-CQPGv8jg.js";
|
|
11
10
|
//#region src/cache/index.d.ts
|
|
12
11
|
/**
|
|
13
12
|
* Response Caching
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/cache/index.ts","../src/middleware/index.ts","../src/storage/index.ts","../src/platform/index.ts","../src/retry/index.ts","../src/utils/channel-matching.ts","../src/utils/session-translator.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/cache/index.ts","../src/middleware/index.ts","../src/storage/index.ts","../src/platform/index.ts","../src/retry/index.ts","../src/utils/channel-matching.ts","../src/utils/session-translator.ts"],"mappings":"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"}
|