robotrock 1.3.2 → 1.3.4
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/README.md +22 -0
- package/dist/ai/index.js +8 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/trigger.js +8 -0
- package/dist/ai/trigger.js.map +1 -1
- package/dist/ai/workflow.js +8 -0
- package/dist/ai/workflow.js.map +1 -1
- package/dist/eve/agent/index.d.ts +67 -3
- package/dist/eve/agent/index.js +209 -153
- package/dist/eve/agent/index.js.map +1 -1
- package/dist/eve/index.d.ts +2 -1
- package/dist/eve/index.js +62 -47
- package/dist/eve/index.js.map +1 -1
- package/dist/eve/tools/admin/assign-tasks.d.ts +15 -4
- package/dist/eve/tools/admin/assign-tasks.js +8 -43
- package/dist/eve/tools/admin/assign-tasks.js.map +1 -1
- package/dist/eve/tools/admin/manage-groups.d.ts +2 -3
- package/dist/eve/tools/admin/manage-groups.js +18 -71
- package/dist/eve/tools/admin/manage-groups.js.map +1 -1
- package/dist/eve/tools/admin/manage-team-members.d.ts +2 -3
- package/dist/eve/tools/admin/manage-team-members.js +20 -64
- package/dist/eve/tools/admin/manage-team-members.js.map +1 -1
- package/dist/eve/tools/admin/query-tasks.d.ts +5 -6
- package/dist/eve/tools/admin/query-tasks.js +22 -86
- package/dist/eve/tools/admin/query-tasks.js.map +1 -1
- package/dist/eve/tools/catalog/search-products.d.ts +4 -5
- package/dist/eve/tools/catalog/search-products.js +2 -33
- package/dist/eve/tools/catalog/search-products.js.map +1 -1
- package/dist/eve/tools/identity/index.d.ts +0 -1
- package/dist/eve/tools/identity/index.js +15 -44
- package/dist/eve/tools/identity/index.js.map +1 -1
- package/dist/eve/tools/identity/my-access.d.ts +2 -3
- package/dist/eve/tools/identity/my-access.js +15 -44
- package/dist/eve/tools/identity/my-access.js.map +1 -1
- package/dist/eve/tools/identity/whoami.js.map +1 -1
- package/dist/eve/tools/inbox/create-task.js.map +1 -1
- package/dist/eve/tools/inbox/index.js.map +1 -1
- package/dist/eve/tools/index.d.ts +1 -1
- package/dist/eve/tools/index.js +44 -193
- package/dist/eve/tools/index.js.map +1 -1
- package/dist/{index-DePyAbTI.d.ts → index-Blq0XoAr.d.ts} +17 -16
- package/dist/index.d.ts +2 -1
- package/dist/index.js +19 -7
- package/dist/index.js.map +1 -1
- package/dist/tool-ui-hint-CMpug5sC.d.ts +13 -0
- package/package.json +2 -2
package/dist/ai/workflow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../core/src/utils/cn.ts","../../../core/src/utils/convex-sanitize.ts","../../../core/src/utils/deployment-secret-encryption.ts","../../../core/src/utils/safe-url.ts","../../../core/src/utils/task-app.ts","../../../core/src/utils/index.ts","../../../core/src/schemas/context-urls.ts","../../../core/src/schemas/task.ts","../../../core/src/schemas/json-schema.ts","../../../core/src/schemas/tool-result-display.ts","../../../core/src/schemas/agent-admin.ts","../../../core/src/schemas/index.ts","../../src/schemas/index.ts","../../../core/src/types/task.ts","../../../core/src/types/json-schema-infer.ts","../../../core/src/types/index.ts","../../../core/src/plans/index.ts","../../../core/src/handler-retry.ts","../../../core/src/legal.ts","../../../core/src/welcome-task.ts","../../../core/src/app-url.ts","../../../core/src/attribution/index.ts","../../../core/src/agent-service-auth.ts","../../../core/src/index.ts","../../src/approval-result.ts","../../src/http.ts","../../src/auth-headers.ts","../../src/chat-correlation.ts","../../src/chats.ts","../../src/client.ts","../../src/env.ts","../../src/record-handled-to-otel.ts","../../src/otel-platform.ts","../../src/handler-webhook.ts","../../src/wait-timing.ts","../../src/trigger/index.ts","../../src/workflow/index.ts","../../src/ai/approve-by-human-tool-core.ts","../../src/ai/context.ts","../../src/ai/human-tool-result.ts","../../src/ai/create-send-to-human-tool-core.ts","../../src/ai/create-send-update-tool-core.ts","../../src/ai/request-action-input-tool-core.ts","../../src/ai/report-status-tool-core.ts","../../src/ai/workflow-tools.ts","../../src/ai/format-tool-approval-task.ts","../../src/ai/tool-approval-bridge.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function for merging Tailwind CSS classes\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n","/**\n * Utilities for sanitizing objects before storing in Convex.\n *\n * Convex restricts object field names:\n * - Reserved prefixes: `$` (system) and `_` (system).\n * - Field names may only contain non-control ASCII characters (0x20–0x7E).\n *\n * User-supplied task context can contain arbitrary keys that violate these\n * rules — e.g. JSON Schema keys like `$ref`/`$id`, or human language keys with\n * accented/non-ASCII characters like `ideeën`. Convex rejects these both when\n * inserting (`ctx.db.insert`) and, crucially, when *serializing* mutation\n * arguments on the client (`ConvexHttpClient.mutation` / `ctx.runMutation`),\n * which happens before the mutation handler runs.\n *\n * These utilities transform offending keys to a reversible, Convex-safe form\n * when storing, and reverse the transformation when reading:\n * - `$`-prefixed keys -> `__dollar_`-prefixed keys.\n * - keys containing non-ASCII / control characters -> `__uesc_` + percent\n * encoding of the (already dollar-transformed) key.\n *\n * The transforms are idempotent: re-running `sanitizeForConvex` on an already\n * sanitized object is a no-op, so it is safe to sanitize at multiple boundaries\n * (e.g. once in the API before `client.mutation`, and again on the Convex\n * server before `ctx.db.insert`).\n *\n * Important: apply `sanitizeForConvex` **before** any Convex boundary that\n * serializes values — including `ctx.runMutation(...)` / `client.mutation(...)`\n * arguments, not only `ctx.db.insert`, because args are validated before your\n * mutation handler runs.\n *\n * NOTE: This is the single source of truth. `apps/app/convex/lib/sanitize.ts`\n * re-exports from here so Convex functions, the dashboard client, and the REST\n * API all share identical encoding.\n */\n\nconst DOLLAR_PREFIX = \"__dollar_\";\nconst ESCAPE_PREFIX = \"__uesc_\";\n\n/** Avoid stack overflow on pathological deep JSON (e.g. nested schema trees). */\nconst MAX_SANITIZE_DEPTH = 256;\n\nfunction isPlainObject(obj: unknown): obj is Record<string, unknown> {\n if (obj === null || typeof obj !== \"object\" || Array.isArray(obj)) {\n return false;\n }\n const proto = Object.getPrototypeOf(obj);\n return proto === Object.prototype || proto === null;\n}\n\n/** True when a key contains characters Convex disallows in field names. */\nfunction keyHasInvalidChars(key: string): boolean {\n for (let i = 0; i < key.length; i++) {\n const code = key.charCodeAt(i);\n // Allow printable ASCII only (space through tilde). Anything outside this\n // range (control chars, accented/non-ASCII, DEL, etc.) must be escaped.\n if (code < 0x20 || code > 0x7e) {\n return true;\n }\n }\n return false;\n}\n\n/** Transform a single key into a Convex-safe form. Idempotent. */\nfunction encodeKey(key: string): string {\n let next = key;\n if (next.startsWith(\"$\")) {\n next = DOLLAR_PREFIX + next.slice(1);\n }\n if (keyHasInvalidChars(next)) {\n next = ESCAPE_PREFIX + encodeURIComponent(next);\n }\n return next;\n}\n\n/** Reverse `encodeKey`. */\nfunction decodeKey(key: string): string {\n let next = key;\n if (next.startsWith(ESCAPE_PREFIX)) {\n try {\n next = decodeURIComponent(next.slice(ESCAPE_PREFIX.length));\n } catch {\n // Malformed percent-encoding: not something we produced, leave untouched.\n return key;\n }\n }\n if (next.startsWith(DOLLAR_PREFIX)) {\n next = \"$\" + next.slice(DOLLAR_PREFIX.length);\n }\n return next;\n}\n\n/**\n * Recursively transforms all object keys into a Convex-safe form.\n * Call this before storing data in Convex (and before serializing mutation args).\n */\nexport function sanitizeForConvex<T>(obj: T, depth = 0): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (depth > MAX_SANITIZE_DEPTH) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => sanitizeForConvex(item, depth + 1)) as T;\n }\n\n if (isPlainObject(obj)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[encodeKey(key)] = sanitizeForConvex(value, depth + 1);\n }\n return result as T;\n }\n\n return obj;\n}\n\n/**\n * Recursively reverses `sanitizeForConvex`.\n * Call this after reading data from Convex.\n */\nexport function desanitizeFromConvex<T>(obj: T, depth = 0): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (depth > MAX_SANITIZE_DEPTH) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => desanitizeFromConvex(item, depth + 1)) as T;\n }\n\n if (isPlainObject(obj)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[decodeKey(key)] = desanitizeFromConvex(value, depth + 1);\n }\n return result as T;\n }\n\n return obj;\n}\n\n/**\n * Normalize values for Convex public function **return** encoding (HTTP / wire JSON).\n * Nested `bigint` (e.g. Int64 from stored payloads), non-finite numbers, or reference\n * cycles can otherwise fail encoding and surface to clients as a generic \"Server Error\".\n */\nexport function toWireReturnSafe<T>(\n value: T,\n depth = 0,\n seen = new WeakSet<object>()\n): T {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (depth > MAX_SANITIZE_DEPTH) {\n return value;\n }\n\n if (typeof value === \"bigint\") {\n return value.toString() as T;\n }\n\n if (typeof value === \"number\") {\n if (Number.isFinite(value)) {\n return value;\n }\n return null as T;\n }\n\n if (typeof value !== \"object\") {\n return value;\n }\n\n if (seen.has(value as object)) {\n return null as T;\n }\n\n if (Array.isArray(value)) {\n seen.add(value);\n try {\n return value.map((item) =>\n toWireReturnSafe(item, depth + 1, seen)\n ) as T;\n } finally {\n seen.delete(value);\n }\n }\n\n if (value instanceof Date) {\n return value.toISOString() as T;\n }\n\n if (isPlainObject(value)) {\n seen.add(value);\n try {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[k] = toWireReturnSafe(v, depth + 1, seen);\n }\n return out as T;\n } finally {\n seen.delete(value);\n }\n }\n\n try {\n return String(value) as T;\n } catch {\n return null as T;\n }\n}\n","const ENCRYPTION_SALT = \"robotrock-deployment-service-token-v1\";\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nasync function deriveKey(pepper: string): Promise<CryptoKey> {\n const encoder = new TextEncoder();\n const keyMaterial = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(pepper),\n \"PBKDF2\",\n false,\n [\"deriveKey\"]\n );\n return crypto.subtle.deriveKey(\n {\n name: \"PBKDF2\",\n salt: encoder.encode(ENCRYPTION_SALT),\n iterations: 100_000,\n hash: \"SHA-256\",\n },\n keyMaterial,\n { name: \"AES-GCM\", length: 256 },\n false,\n [\"encrypt\", \"decrypt\"]\n );\n}\n\n/** Encrypt a deployment service token for server-side reachability probes. */\nexport async function encryptDeploymentSecret(\n plaintext: string,\n pepper: string\n): Promise<string> {\n const key = await deriveKey(pepper);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const ciphertext = await crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv },\n key,\n new TextEncoder().encode(plaintext)\n );\n const combined = new Uint8Array(iv.length + ciphertext.byteLength);\n combined.set(iv, 0);\n combined.set(new Uint8Array(ciphertext), iv.length);\n return bytesToBase64(combined);\n}\n\n/** Decrypt a deployment service token stored by Convex. */\nexport async function decryptDeploymentSecret(\n ciphertextBase64: string,\n pepper: string\n): Promise<string> {\n const combined = base64ToBytes(ciphertextBase64);\n if (combined.length < 13) {\n throw new Error(\"Invalid encrypted deployment secret.\");\n }\n const iv = combined.slice(0, 12);\n const ciphertext = combined.slice(12);\n const key = await deriveKey(pepper);\n const plaintext = await crypto.subtle.decrypt(\n { name: \"AES-GCM\", iv },\n key,\n ciphertext\n );\n return new TextDecoder().decode(plaintext);\n}\n","const BLOCKED_HOSTNAMES = new Set([\n \"localhost\",\n \"metadata.google.internal\",\n \"metadata.goog\",\n]);\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n}\n\nfunction isBlockedIpv4(host: string): boolean {\n const match = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(host);\n if (!match) {\n return false;\n }\n\n const octets = match.slice(1, 5).map((part) => Number(part));\n if (octets.some((octet) => Number.isNaN(octet) || octet < 0 || octet > 255)) {\n return true;\n }\n\n const [a, b, _c, _d] = octets;\n if (a === undefined || b === undefined) {\n return true;\n }\n if (a === 127 || a === 0) return true;\n if (a === 10) return true;\n if (a === 169 && b === 254) return true;\n if (a === 192 && b === 168) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 100 && b >= 64 && b <= 127) return true;\n\n return false;\n}\n\nfunction ipv4FromNumericHost(host: string): string | null {\n if (/^\\d+$/.test(host)) {\n const num = Number(host);\n if (!Number.isFinite(num) || num < 0 || num > 0xffffffff) {\n return null;\n }\n const a = (num >>> 24) & 0xff;\n const b = (num >>> 16) & 0xff;\n const c = (num >>> 8) & 0xff;\n const d = num & 0xff;\n return `${a}.${b}.${c}.${d}`;\n }\n\n const hexMatch = /^0x([0-9a-f]{1,8})$/i.exec(host);\n if (hexMatch) {\n const num = Number.parseInt(hexMatch[1]!, 16);\n if (!Number.isFinite(num) || num < 0 || num > 0xffffffff) {\n return null;\n }\n const a = (num >>> 24) & 0xff;\n const b = (num >>> 16) & 0xff;\n const c = (num >>> 8) & 0xff;\n const d = num & 0xff;\n return `${a}.${b}.${c}.${d}`;\n }\n\n return null;\n}\n\nfunction isBlockedIpv4Mapped(host: string): boolean {\n const mappedDotted = /^::ffff:(\\d{1,3}(?:\\.\\d{1,3}){3})$/i.exec(host);\n if (mappedDotted) {\n return isBlockedIpv4(mappedDotted[1]!);\n }\n\n const mappedHex = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i.exec(host);\n if (mappedHex) {\n const high = Number.parseInt(mappedHex[1]!, 16);\n const low = Number.parseInt(mappedHex[2]!, 16);\n if (Number.isFinite(high) && Number.isFinite(low)) {\n const a = (high >> 8) & 0xff;\n const b = high & 0xff;\n const c = (low >> 8) & 0xff;\n const d = low & 0xff;\n return isBlockedIpv4(`${a}.${b}.${c}.${d}`);\n }\n }\n\n return false;\n}\n\nfunction isBlockedIpv6(host: string): boolean {\n if (host === \"::1\" || host === \"0:0:0:0:0:0:0:1\") {\n return true;\n }\n if (host.startsWith(\"fc\") || host.startsWith(\"fd\")) {\n return true;\n }\n if (host.startsWith(\"fe80:\")) {\n return true;\n }\n if (isBlockedIpv4Mapped(host)) {\n return true;\n }\n return false;\n}\n\nfunction isBlockedHostname(hostname: string): boolean {\n const host = normalizeHostname(hostname);\n if (!host) {\n return true;\n }\n if (BLOCKED_HOSTNAMES.has(host)) {\n return true;\n }\n if (host.endsWith(\".localhost\") || host.endsWith(\".local\")) {\n return true;\n }\n\n const numericIpv4 = ipv4FromNumericHost(host);\n if (numericIpv4 && isBlockedIpv4(numericIpv4)) {\n return true;\n }\n\n return isBlockedIpv4(host) || isBlockedIpv6(host);\n}\n\n/**\n * True when a handler URL targets the local machine. Convex cloud cannot POST\n * these directly; loopback deliveries are queued in Redis and drained by a local\n * worker (see apps/api handler-outbound).\n */\nexport function isLoopbackHandlerUrl(urlString: string): boolean {\n let url: URL;\n try {\n url = new URL(urlString);\n } catch {\n return false;\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return false;\n }\n if (url.username || url.password) {\n return false;\n }\n\n const host = url.hostname.toLowerCase();\n return (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"[::1]\" ||\n host.endsWith(\".localhost\")\n );\n}\n\n/**\n * Webhook/trigger handler URLs may target a public host or loopback (local dev).\n */\nexport function isAllowedHandlerUrl(urlString: string): boolean {\n return isPublicHttpUrl(urlString) || isLoopbackHandlerUrl(urlString);\n}\n\n/**\n * Returns true when the URL uses http(s) and targets a public, non-reserved host.\n */\nexport function isPublicHttpUrl(urlString: string): boolean {\n let url: URL;\n try {\n url = new URL(urlString);\n } catch {\n return false;\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return false;\n }\n if (url.username || url.password) {\n return false;\n }\n\n return !isBlockedHostname(url.hostname);\n}\n\nexport const PUBLIC_HTTP_URL_ERROR =\n \"URL must be a public http:// or https:// address\";\n\nexport const HANDLER_URL_ERROR =\n \"Handler URL must be a public or loopback http:// or https:// address\";\n\nconst FORBIDDEN_HANDLER_HEADERS = new Set([\n \"host\",\n \"connection\",\n \"content-length\",\n \"transfer-encoding\",\n \"te\",\n \"trailer\",\n \"upgrade\",\n \"proxy-authorization\",\n \"proxy-connection\",\n \"keep-alive\",\n \"x-robotrock-signature\",\n \"x-robotrock-delivery-id\",\n \"x-robotrock-delivery-attempt\",\n]);\n\n/**\n * Allow only safe custom webhook headers; blocks overrides of delivery metadata.\n */\nexport function filterHandlerHeaders(\n headers: Record<string, string> | undefined\n): Record<string, string> {\n if (!headers) {\n return {};\n }\n\n const filtered: Record<string, string> = {};\n for (const [rawKey, value] of Object.entries(headers)) {\n const key = rawKey.toLowerCase().trim();\n if (!key || FORBIDDEN_HANDLER_HEADERS.has(key)) {\n continue;\n }\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(key)) {\n continue;\n }\n filtered[key] = value;\n }\n return filtered;\n}\n","/** Canonical app key for tasks submitted without an `app` field. */\nexport const DEFAULT_TASK_APP = \"default\" as const;\n\nexport type TaskAppKey = typeof DEFAULT_TASK_APP | (string & {});\n\n/**\n * Normalize an app identifier for storage and filtering.\n * Empty or missing values map to the default inbox.\n */\nexport function normalizeTaskApp(app: string | undefined | null): TaskAppKey {\n const trimmed = app?.trim();\n if (!trimmed) return DEFAULT_TASK_APP;\n return trimmed.toLowerCase();\n}\n\n/** Human-readable label for sidebar / UI (not for URLs or API payloads). */\nexport function formatTaskAppLabel(appKey: string): string {\n if (appKey === DEFAULT_TASK_APP) return \"Default\";\n return appKey\n .split(/[-_]+/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(\" \");\n}\n","export * from \"./cn\";\nexport * from \"./convex-sanitize\";\nexport * from \"./deployment-secret-encryption\";\nexport * from \"./safe-url\";\nexport * from \"./task-app\";\n\n","import { isPublicHttpUrl, PUBLIC_HTTP_URL_ERROR } from \"../utils/safe-url\";\n\ntype ContextInput = {\n data?: Record<string, unknown>;\n ui?: Record<string, unknown>;\n};\n\nfunction resolveLinkUrl(value: string): string {\n return value.startsWith(\"http://\") || value.startsWith(\"https://\")\n ? value\n : `https://${value}`;\n}\n\nfunction widgetType(\n ui: Record<string, unknown> | undefined,\n field: string\n): string | undefined {\n const fieldUi = ui?.[field];\n if (typeof fieldUi !== \"object\" || fieldUi === null) {\n return undefined;\n }\n const widget = (fieldUi as Record<string, unknown>)[\"ui:widget\"];\n return typeof widget === \"string\" ? widget : undefined;\n}\n\nfunction validateUrlValue(value: unknown, widget: string): string | null {\n if (widget === \"image\" || widget === \"link\") {\n if (typeof value !== \"string\") {\n return PUBLIC_HTTP_URL_ERROR;\n }\n const url = widget === \"link\" ? resolveLinkUrl(value) : value;\n if (!isPublicHttpUrl(url)) {\n return PUBLIC_HTTP_URL_ERROR;\n }\n return null;\n }\n\n if (widget === \"attachments\" && Array.isArray(value)) {\n for (const item of value) {\n if (typeof item !== \"object\" || item === null) {\n continue;\n }\n const url = (item as { url?: unknown }).url;\n if (typeof url === \"string\" && !isPublicHttpUrl(resolveLinkUrl(url))) {\n return PUBLIC_HTTP_URL_ERROR;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Validates URL-bearing context widget values (image, link, attachments).\n * Returns an error message or null when valid.\n */\nexport function validateContextPublicUrls(\n context: ContextInput | undefined\n): string | null {\n if (!context?.data) {\n return null;\n }\n\n for (const [field, value] of Object.entries(context.data)) {\n const widget = widgetType(context.ui, field);\n if (!widget) {\n continue;\n }\n const error = validateUrlValue(value, widget);\n if (error) {\n return `context.data.${field}: ${error}`;\n }\n }\n\n return null;\n}\n","import { z } from \"zod\";\nimport {\n isAllowedHandlerUrl,\n isPublicHttpUrl,\n HANDLER_URL_ERROR,\n PUBLIC_HTTP_URL_ERROR,\n} from \"../utils/safe-url\";\nimport { validateContextPublicUrls } from \"./context-urls\";\nimport type { JSONSchema7 } from \"./json-schema\";\n\n/**\n * Extended JSONSchema7 type that includes RJSF extensions like enumNames\n */\nexport type ExtendedJSONSchema7 = JSONSchema7 & {\n enumNames?: string[];\n [key: string]: unknown;\n};\n\n/**\n * UI Schema for RJSF form customization\n */\nexport type UiSchema = {\n \"ui:widget\"?: string;\n \"ui:title\"?: string;\n \"ui:description\"?: string;\n \"ui:placeholder\"?: string;\n \"ui:options\"?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n// Helper schemas\nexport const safeUrlSchema = z.string().refine((url) => isPublicHttpUrl(url), {\n message: PUBLIC_HTTP_URL_ERROR,\n});\n\nconst handlerUrlSchema = z.string().refine((url) => isAllowedHandlerUrl(url), {\n message: HANDLER_URL_ERROR,\n});\n\n// JSONSchema7 validation\nconst jsonSchema7Schema = z.custom<ExtendedJSONSchema7>(\n (val) => typeof val === \"object\" && val !== null,\n { message: \"Must be a valid JSON Schema object\" }\n);\n\n// UiSchema validation\nconst uiSchemaSchema = z.custom<UiSchema>((val) => typeof val === \"object\" && val !== null, {\n message: \"Must be a valid UiSchema object\",\n});\n\n// Handler schemas (per-action handlers for webhooks, triggers, etc.)\nconst webhookHandlerSchema = z.object({\n type: z.literal(\"webhook\"),\n url: handlerUrlSchema,\n headers: z.record(z.string(), z.string()),\n});\n\nconst triggerHandlerSchema = webhookHandlerSchema.extend({\n type: z.literal(\"trigger\"),\n tokenId: z.string().min(1),\n});\n\nconst handlerSchema = z.discriminatedUnion(\"type\", [webhookHandlerSchema, triggerHandlerSchema]);\n\n/** Action config without handlers — used for chat widgets and agent tool input. */\nexport const taskActionInputSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n description: z.string().optional(),\n schema: jsonSchema7Schema.optional(),\n ui: uiSchemaSchema.optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\n// Action schema with JSONSchema-based feedback and optional handlers\nconst taskActionSchema = taskActionInputSchema.extend({\n // Optional handlers for this action - if present, must have at least 1\n handlers: z.array(handlerSchema).min(1).optional(),\n});\n\n// UI Field Schema\nconst uiFieldSchemaSchema: z.ZodType<Record<string, unknown>> = z\n .object({\n \"ui:widget\": z.string().optional(),\n \"ui:title\": z.string().optional(),\n \"ui:description\": z.string().optional(),\n \"ui:options\": z.record(z.string(), z.unknown()).optional(),\n items: z.lazy(() => z.record(z.string(), uiFieldSchemaSchema)).optional(),\n })\n .passthrough();\n\n// Context UI Schema\nconst contextUiSchema = z.record(z.string(), uiFieldSchemaSchema).optional();\n\n// Context data schema\nconst contextDataSchema = z\n .object({\n data: z.record(z.string(), z.unknown()),\n ui: contextUiSchema,\n })\n .optional();\n\nexport const TASK_CONTEXT_FORMAT_VERSION = 2 as const;\nexport type TaskContextFormatVersion = typeof TASK_CONTEXT_FORMAT_VERSION;\n\n// Main TaskContext schema\nconst taskContextObjectBaseSchema = z.object({\n /** Source application id; omitted tasks are grouped in the default inbox. */\n app: z.string().min(1).optional(),\n type: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n validUntil: z.string().optional(),\n context: contextDataSchema,\n /** Task context wire format version. @default 2 */\n contextVersion: z.literal(2).optional(),\n /** @deprecated Use `contextVersion`. Accepted on ingest only. */\n version: z.literal(2).optional(),\n actions: z.array(taskActionSchema).min(1, \"At least one action is required\"),\n});\n\nfunction normalizeTaskContextVersion<T extends { contextVersion?: 2; version?: 2 }>(\n data: T\n): Omit<T, \"version\" | \"contextVersion\"> & { contextVersion: 2 } {\n const { version: legacyVersion, contextVersion, ...rest } = data;\n return {\n ...rest,\n contextVersion: contextVersion ?? legacyVersion ?? TASK_CONTEXT_FORMAT_VERSION,\n };\n}\n\nconst taskContextObjectSchema = taskContextObjectBaseSchema.transform(\n normalizeTaskContextVersion\n);\n\nfunction refineContextPublicUrls<T extends { context?: z.infer<typeof contextDataSchema> }>(\n data: T,\n ctx: z.RefinementCtx\n) {\n const error = validateContextPublicUrls(data.context);\n if (error) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: error,\n path: [\"context\"],\n });\n }\n}\n\nexport const taskContextSchema = taskContextObjectSchema.superRefine(\n refineContextPublicUrls\n);\n\n/**\n * Assignment targets at task create (not stored in task context JSON).\n * Unknown user emails are auto-provisioned as assignee memberships (count toward seat limits).\n *\n * Virtual group slugs (membership derived from tenantUsers, not groupMembers):\n * - `all` — all workspace members (omit assignTo defaults to this)\n * - `admins` — workspace users with tenant admin role\n */\nexport const VIRTUAL_ASSIGN_TO_GROUP_SLUGS = [\"all\", \"admins\"] as const;\n\nexport const assignToSchema = z\n .object({\n users: z.array(z.string().email()).optional(),\n groups: z.array(z.string().min(1)).optional(),\n })\n .refine(\n (data) => {\n const groups = data.groups ?? [];\n if (groups.includes(\"all\") && groups.length > 1) {\n return false;\n }\n return true;\n },\n { message: 'Cannot combine \"all\" with other group slugs' }\n );\n\n/** A short thread-scoped status update message (1-2 sentences). */\nexport const threadUpdateMessageSchema = z.string().min(1).max(500);\n\n/**\n * Lifecycle status carried by a thread update. Drives the icon and color shown\n * in the inbox status bar. Defaults to `info` when omitted.\n */\nexport const threadUpdateStatuses = [\n \"info\",\n \"queued\",\n \"running\",\n \"waiting\",\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n] as const;\n\nexport const threadUpdateStatusSchema = z.enum(threadUpdateStatuses);\n\n/** The default status applied when an update omits one. */\nexport const DEFAULT_THREAD_UPDATE_STATUS: ThreadUpdateStatus = \"info\";\n\n/** Shared shape for a thread update (standalone and at task creation). */\nexport const threadUpdateInputSchema = z.object({\n message: threadUpdateMessageSchema,\n status: threadUpdateStatusSchema.optional(),\n});\n\n/** Thread priority levels for inbox ordering and display. */\nexport const taskPriorities = [\"low\", \"normal\", \"high\", \"urgent\"] as const;\n\nexport const taskPrioritySchema = z.enum(taskPriorities);\n\nexport type TaskPriority = (typeof taskPriorities)[number];\n\nexport const DEFAULT_TASK_PRIORITY: TaskPriority = \"normal\";\n\nexport const LOWEST_TASK_PRIORITY: TaskPriority = \"low\";\n\nexport const TASK_PRIORITY_RANK: Record<TaskPriority, number> = {\n low: 1,\n normal: 2,\n high: 3,\n urgent: 4,\n};\n\n/**\n * Agent release at task create (not shown in inbox reviewer UI).\n * Used for feedback analysis over deploys.\n */\nexport const agentTelemetrySchema = z.object({\n /** Agent or app version (semver, git SHA, deploy tag — caller-defined). */\n version: z.string().min(1),\n});\n\n/** POST /v1 body: task context plus optional assignment. */\nexport const createTaskBodySchema = taskContextObjectBaseSchema\n .extend({\n assignTo: assignToSchema.optional(),\n /**\n * Groups related tasks together. When omitted, the server generates one and\n * returns it so the caller can reuse it on later tasks in the same thread.\n */\n threadId: z.string().min(1).optional(),\n /**\n * Optional thread priority. When set, applies to the whole thread and\n * overwrites any previous priority. Omit on later tasks to leave unchanged.\n */\n priority: taskPrioritySchema.optional(),\n /**\n * Optional initial status update logged against the task's thread. Shows in\n * the inbox status bar and the thread update log.\n */\n update: threadUpdateInputSchema.optional(),\n /** Agent release version — not shown in inbox UI. */\n agent: agentTelemetrySchema.optional(),\n })\n .transform(normalizeTaskContextVersion)\n .superRefine(refineContextPublicUrls);\n\n/** POST /v1/threads/:threadId/updates body: a standalone thread update. */\nexport const threadUpdateBodySchema = threadUpdateInputSchema;\n\n/** Action widget config for a seeded assistant message (mirrors the `requestActionInput` tool input). */\nexport const agentChatSeedActionSchema = z.object({\n /** Stable action id echoed back on submit; auto-derived from title when omitted. */\n id: z.string().min(1).optional(),\n title: z.string().min(1),\n description: z.string().optional(),\n /** JSON Schema object for the form fields. */\n schema: z.record(z.string(), z.unknown()).optional(),\n /** RJSF ui schema overrides (ui:widget, ui:enumNames, etc.). */\n ui: z.record(z.string(), z.unknown()).optional(),\n /** Optional default field values. */\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\n/** A single pre-seeded chat message injected into a programmatic agent chat. */\nexport const agentChatSeedMessageSchema = z.object({\n role: z.enum([\"user\", \"assistant\"]),\n text: z.string().min(1),\n /** Optional display-name override for the message sender. */\n senderName: z.string().min(1).optional(),\n /**\n * Optional structured input request rendered as a styled RobotRock action\n * widget below the message text. Use this instead of asking the user to reply\n * in plain text so the request is always a proper action form.\n */\n requestActionInput: z\n .object({\n prompt: z.string().optional(),\n action: agentChatSeedActionSchema,\n })\n .optional(),\n});\n\n/**\n * POST /v1/agent-chats body: create + assign one or more agent chat sessions.\n * Either `agentIdentifier` (new chat) or `parentChatId` (spawned from a chat) is required.\n */\nconst eveAgentChatTransportSchema = z.object({\n kind: z.literal(\"eve\"),\n chatId: z.string().min(1),\n baseUrl: z.string().url(),\n sessionId: z.string().optional(),\n continuationToken: z.string().optional(),\n streamIndex: z.number().int().nonnegative().optional(),\n isStreaming: z.boolean().optional(),\n});\n\nexport const createAgentChatBodySchema = z\n .object({\n /** Agent id (eve agent name). Required unless `parentChatId` is set. */\n agentIdentifier: z.string().min(1).optional(),\n /** Inherit tenant/connection/agent from an existing chat (agent-spawned chats). */\n parentChatId: z.string().min(1).optional(),\n /** Convex tenantEveConnections id; resolved from the tenant when omitted. */\n eveConnectionId: z.string().min(1).optional(),\n /** Source application id; groups the chat under an inbox section. */\n app: z.string().min(1).optional(),\n /** Email of the user who owns the chat. Required unless `parentChatId` is set. */\n ownerEmail: z.string().email().optional(),\n title: z.string().min(1),\n messages: z.array(agentChatSeedMessageSchema).default([]),\n /** Provenance label stored on the session (\"cron\" | \"agent\" | ...). */\n source: z.string().min(1).optional(),\n })\n .refine((data) => Boolean(data.agentIdentifier || data.parentChatId), {\n message: \"Provide either agentIdentifier or parentChatId\",\n })\n .refine((data) => Boolean(data.ownerEmail || data.parentChatId), {\n message: \"Provide ownerEmail unless parentChatId is set\",\n });\n\n/** POST /v1/agent-chats/transport body: persist live-chat cursor for the browser. */\nexport const agentChatTransportBodySchema = eveAgentChatTransportSchema;\n\n/** POST /v1/agent-chats/audit-tool body: log Eve tool executions from agent hooks. */\nexport const agentChatAuditToolBodySchema = z.object({\n eveSessionId: z.string().min(1),\n userId: z.string().min(1),\n toolCallId: z.string().min(1),\n toolName: z.string().min(1),\n input: z.record(z.string(), z.unknown()).default({}),\n success: z.boolean(),\n status: z.enum([\"completed\", \"failed\", \"rejected\"]),\n error: z.string().optional(),\n idempotencyKey: z.string().optional(),\n});\n\n/** POST /v1/agent-chats/audit-input body: log Eve HITL choices from agent hooks. */\nexport const agentChatAuditInputBodySchema = z.object({\n eveSessionId: z.string().min(1),\n userId: z.string().min(1),\n actionId: z.string().min(1),\n actionTitle: z.string().optional(),\n prompt: z.string().optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n idempotencyKey: z.string().optional(),\n /** Eve input request id — used to merge staged HITL metadata. */\n requestId: z.string().optional(),\n /** Eve tool call id — fallback lookup for staged HITL metadata. */\n toolCallId: z.string().optional(),\n});\n\nconst eveHitlStagedOptionSchema = z.object({\n id: z.string(),\n label: z.string(),\n});\n\n/** POST /v1/agent-chats/stage-hitl body: persist pending Eve HITL requests on the chat. */\nexport const agentChatStageHitlBodySchema = z.object({\n eveSessionId: z.string().min(1),\n requests: z.array(\n z.object({\n requestId: z.string().min(1),\n toolCallId: z.string().min(1),\n toolName: z.string().min(1),\n prompt: z.string().min(1),\n display: z.enum([\"confirmation\", \"select\", \"text\"]).optional(),\n allowFreeform: z.boolean().optional(),\n options: z.array(eveHitlStagedOptionSchema).optional(),\n toolInput: z.record(z.string(), z.unknown()).optional(),\n })\n ),\n});\n\n/** POST /v1/agent-chats/link-task body: associate an inbox task with an Eve chat session. */\nexport const agentChatLinkTaskBodySchema = z.object({\n eveSessionId: z.string().min(1),\n publicTaskId: z.string().min(1),\n toolCallId: z.string().min(1),\n});\n\n/** Where a thread update originated. */\nexport type ThreadUpdateSource = \"api\" | \"task_create\" | \"dashboard\";\n\n/** Lifecycle status carried by a thread update. */\nexport type ThreadUpdateStatus = (typeof threadUpdateStatuses)[number];\n\n/** A logged thread update as returned by the API. */\nexport interface ThreadUpdate {\n id: string;\n threadId: string;\n message: string;\n status: ThreadUpdateStatus;\n source: ThreadUpdateSource;\n createdAt: number;\n}\n\n// Type exports\nexport type AssignToInput = z.infer<typeof assignToSchema>;\nexport type CreateTaskBodyInput = z.input<typeof createTaskBodySchema>;\nexport type CreateTaskBody = z.output<typeof createTaskBodySchema>;\nexport type ThreadUpdateBodyInput = z.input<typeof threadUpdateBodySchema>;\nexport type ThreadUpdateBody = z.output<typeof threadUpdateBodySchema>;\nexport type ThreadUpdateInput = z.input<typeof threadUpdateInputSchema>;\nexport type AgentChatSeedAction = z.output<typeof agentChatSeedActionSchema>;\nexport type AgentChatSeedMessage = z.output<typeof agentChatSeedMessageSchema>;\nexport type CreateAgentChatBodyInput = z.input<typeof createAgentChatBodySchema>;\nexport type CreateAgentChatBody = z.output<typeof createAgentChatBodySchema>;\nexport type AgentChatTransportBody = z.output<typeof agentChatTransportBodySchema>;\nexport type AgentChatAuditToolBody = z.output<typeof agentChatAuditToolBodySchema>;\nexport type AgentChatAuditInputBody = z.output<typeof agentChatAuditInputBodySchema>;\nexport type AgentChatStageHitlBody = z.output<typeof agentChatStageHitlBodySchema>;\nexport type AgentChatLinkTaskBody = z.output<typeof agentChatLinkTaskBodySchema>;\nexport type TaskContextInput = z.input<typeof taskContextSchema>;\nexport type TaskContextOutput = z.output<typeof taskContextSchema>;\nexport type TaskContext = TaskContextOutput;\nexport type SafeUrl = z.infer<typeof safeUrlSchema>;\nexport type TaskActionInput = z.infer<typeof taskActionInputSchema>;\nexport type TaskAction = z.infer<typeof taskActionSchema>;\nexport type WebhookHandler = z.infer<typeof webhookHandlerSchema>;\nexport type TriggerHandler = z.infer<typeof triggerHandlerSchema>;\nexport type Handler = z.infer<typeof handlerSchema>;\nexport type ContextData = z.infer<typeof contextDataSchema>;\nexport type ContextUiSchema = z.infer<typeof contextUiSchema>;\nexport type UiFieldSchema = z.infer<typeof uiFieldSchemaSchema>;\nexport type AgentTelemetry = z.infer<typeof agentTelemetrySchema>;\nexport type AgentTelemetryInput = z.input<typeof agentTelemetrySchema>;\n","/**\n * JSON Schema Draft 7 type definitions\n * Simplified version for our use case\n */\nexport interface JSONSchema7 {\n $id?: string;\n $ref?: string;\n $schema?: string;\n $comment?: string;\n\n type?: JSONSchema7TypeName | JSONSchema7TypeName[];\n enum?: unknown[];\n const?: unknown;\n\n // Number validation\n multipleOf?: number;\n maximum?: number;\n exclusiveMaximum?: number;\n minimum?: number;\n exclusiveMinimum?: number;\n\n // String validation\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n format?: string;\n\n // Array validation\n items?: JSONSchema7 | JSONSchema7[];\n additionalItems?: JSONSchema7 | boolean;\n maxItems?: number;\n minItems?: number;\n uniqueItems?: boolean;\n contains?: JSONSchema7;\n\n // Object validation\n maxProperties?: number;\n minProperties?: number;\n required?: string[];\n properties?: Record<string, JSONSchema7>;\n patternProperties?: Record<string, JSONSchema7>;\n additionalProperties?: JSONSchema7 | boolean;\n dependencies?: Record<string, JSONSchema7 | string[]>;\n propertyNames?: JSONSchema7;\n\n // Conditional\n if?: JSONSchema7;\n then?: JSONSchema7;\n else?: JSONSchema7;\n\n // Combining\n allOf?: JSONSchema7[];\n anyOf?: JSONSchema7[];\n oneOf?: JSONSchema7[];\n not?: JSONSchema7;\n\n // Metadata\n title?: string;\n description?: string;\n default?: unknown;\n readOnly?: boolean;\n writeOnly?: boolean;\n examples?: unknown[];\n}\n\nexport type JSONSchema7TypeName =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"object\"\n | \"array\"\n | \"null\";\n\n","import { z } from \"zod\";\nimport type { UiSchema } from \"./task\";\n\nexport const toolDisplayMetadataSchema = z.object({\n widget: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport type ToolDisplayMetadata = z.infer<typeof toolDisplayMetadataSchema>;\n\nexport const toolDisplayEnvelopeSchema = z.object({\n display: toolDisplayMetadataSchema.optional(),\n data: z.record(z.string(), z.unknown()),\n ui: z\n .record(\n z.string(),\n z\n .object({\n \"ui:widget\": z.string().optional(),\n \"ui:title\": z.string().optional(),\n \"ui:description\": z.string().optional(),\n \"ui:options\": z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n )\n .optional(),\n});\n\nexport type ToolDisplayEnvelope<\n TData extends Record<string, unknown> = Record<string, unknown>,\n> = {\n display?: ToolDisplayMetadata;\n data: TData;\n ui?: Record<string, UiSchema>;\n};\n\n/** Detect agent-sent display envelopes without matching arbitrary tool payloads. */\nexport function isToolDisplayEnvelope(\n value: unknown\n): value is ToolDisplayEnvelope {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n if (!(\"data\" in record)) {\n return false;\n }\n\n const data = record.data;\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) {\n return false;\n }\n\n return \"display\" in record || \"ui\" in record;\n}\n","import { z } from \"zod\";\nimport { assignToSchema } from \"./task\";\n\nexport const tenantRoleSchema = z.enum([\"admin\", \"member\"]);\n\nexport const agentAdminUserSchema = z.object({\n id: z.string(),\n email: z.string().email(),\n name: z.string(),\n});\n\nexport const agentAdminMemberSchema = z.object({\n userId: z.string(),\n role: z.string(),\n membershipKind: z.enum([\"team\", \"assignee\"]),\n hasLoggedIn: z.boolean(),\n user: agentAdminUserSchema,\n});\n\nexport const agentAdminGroupSchema = z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n description: z.string().nullable(),\n memberCount: z.number().optional(),\n});\n\nexport const agentAdminGroupDetailSchema = agentAdminGroupSchema.extend({\n members: z.array(\n z.object({\n userId: z.string(),\n user: agentAdminUserSchema,\n })\n ),\n});\n\nexport const agentAdminTaskSummarySchema = z.object({\n id: z.string(),\n convexId: z.string(),\n status: z.string(),\n type: z.string().nullable(),\n name: z.string().nullable(),\n description: z.string().nullable(),\n validUntil: z.number(),\n createdAt: z.number(),\n threadPriority: z.string().nullable(),\n handledByUserId: z.string().nullable(),\n});\n\nexport const inviteMemberBodySchema = z.object({\n email: z.string().email(),\n role: tenantRoleSchema.optional(),\n});\n\nexport const updateMemberRoleBodySchema = z.object({\n role: tenantRoleSchema,\n});\n\nexport const createGroupBodySchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n});\n\nexport const updateGroupBodySchema = z.object({\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n});\n\nexport const addGroupMemberBodySchema = z.object({\n userId: z\n .string()\n .min(1)\n .describe(\"Convex user id or member email.\"),\n});\n\nexport const listTasksQuerySchema = z.object({\n statusFilter: z.enum([\"all\", \"open\", \"handled\", \"expired\"]).optional(),\n typeFilter: z.string().optional(),\n appFilter: z.string().optional(),\n sortField: z.enum([\"type\", \"date\", \"status\", \"validUntil\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n limit: z.coerce.number().int().positive().max(100).optional(),\n cursor: z.string().optional(),\n});\n\nexport const searchTasksQuerySchema = z.object({\n q: z.string().min(1),\n limit: z.coerce.number().int().positive().max(100).optional(),\n});\n\nexport const assignTasksResultSchema = z.object({\n taskId: z.string(),\n success: z.boolean(),\n message: z.string().optional(),\n name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n});\n\nexport const assignTasksResponseSchema = z.object({\n results: z.array(assignTasksResultSchema),\n});\n\nexport const assignTasksBodySchema = z.object({\n taskIds: z.array(z.string().min(1)).min(1).max(100),\n assignTo: assignToSchema.refine(\n (value) => (value.users?.length ?? 0) > 0 || (value.groups?.length ?? 0) > 0,\n { message: \"assignTo needs at least one user email or group slug.\" }\n ),\n});\n\nexport type AgentAdminMember = z.infer<typeof agentAdminMemberSchema>;\nexport type AgentAdminGroup = z.infer<typeof agentAdminGroupSchema>;\nexport type AgentAdminGroupDetail = z.infer<typeof agentAdminGroupDetailSchema>;\nexport type AgentAdminTaskSummary = z.infer<typeof agentAdminTaskSummarySchema>;\nexport type AgentAdminAssignTaskResult = z.infer<typeof assignTasksResultSchema>;\n","export * from \"./task\";\nexport * from \"./json-schema\";\nexport * from \"./context-urls\";\nexport * from \"./tool-result-display\";\nexport * from \"./agent-admin\";\n\n","import { z } from \"zod\";\nimport {\n isAllowedHandlerUrl,\n HANDLER_URL_ERROR,\n} from \"@robotrock/core/utils\";\nimport { validateContextPublicUrls } from \"@robotrock/core/schemas\";\n\nexport interface JSONSchema7 {\n $id?: string;\n $ref?: string;\n $schema?: string;\n $comment?: string;\n type?: JSONSchema7TypeName | JSONSchema7TypeName[];\n enum?: unknown[];\n const?: unknown;\n multipleOf?: number;\n maximum?: number;\n exclusiveMaximum?: number;\n minimum?: number;\n exclusiveMinimum?: number;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n format?: string;\n items?: JSONSchema7 | JSONSchema7[];\n additionalItems?: JSONSchema7 | boolean;\n maxItems?: number;\n minItems?: number;\n uniqueItems?: boolean;\n contains?: JSONSchema7;\n maxProperties?: number;\n minProperties?: number;\n required?: string[];\n properties?: Record<string, JSONSchema7>;\n patternProperties?: Record<string, JSONSchema7>;\n additionalProperties?: JSONSchema7 | boolean;\n dependencies?: Record<string, JSONSchema7 | string[]>;\n propertyNames?: JSONSchema7;\n if?: JSONSchema7;\n then?: JSONSchema7;\n else?: JSONSchema7;\n allOf?: JSONSchema7[];\n anyOf?: JSONSchema7[];\n oneOf?: JSONSchema7[];\n not?: JSONSchema7;\n title?: string;\n description?: string;\n default?: unknown;\n readOnly?: boolean;\n writeOnly?: boolean;\n examples?: unknown[];\n}\n\nexport type JSONSchema7TypeName =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"object\"\n | \"array\"\n | \"null\";\n\nexport type ExtendedJSONSchema7 = JSONSchema7 & {\n enumNames?: string[];\n [key: string]: unknown;\n};\n\nexport type UiSchema = {\n \"ui:widget\"?: string;\n \"ui:title\"?: string;\n \"ui:description\"?: string;\n \"ui:placeholder\"?: string;\n \"ui:options\"?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nconst handlerUrlSchema = z.string().refine((url) => isAllowedHandlerUrl(url), {\n message: HANDLER_URL_ERROR,\n});\n\nconst jsonSchema7Schema = z.custom<ExtendedJSONSchema7>(\n (val) => typeof val === \"object\" && val !== null,\n { message: \"Must be a valid JSON Schema object\" }\n);\n\nconst uiSchemaSchema = z.custom<UiSchema>((val) => typeof val === \"object\" && val !== null, {\n message: \"Must be a valid UiSchema object\",\n});\n\nconst webhookHandlerSchema = z.object({\n type: z.literal(\"webhook\"),\n url: handlerUrlSchema,\n headers: z.record(z.string(), z.string()),\n});\n\nconst triggerHandlerSchema = webhookHandlerSchema.extend({\n type: z.literal(\"trigger\"),\n tokenId: z.string().min(1),\n});\n\nconst handlerSchema = z.discriminatedUnion(\"type\", [webhookHandlerSchema, triggerHandlerSchema]);\n\n/** Action config without handlers — used for chat widgets and agent tool input. */\nexport const taskActionInputSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n description: z.string().optional(),\n schema: jsonSchema7Schema.optional(),\n ui: uiSchemaSchema.optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst taskActionSchema = taskActionInputSchema.extend({\n handlers: z.array(handlerSchema).min(1).optional(),\n});\n\nconst uiFieldSchemaSchema: z.ZodType<Record<string, unknown>> = z\n .object({\n \"ui:widget\": z.string().optional(),\n \"ui:title\": z.string().optional(),\n \"ui:description\": z.string().optional(),\n \"ui:options\": z.record(z.string(), z.unknown()).optional(),\n items: z.lazy(() => z.record(z.string(), uiFieldSchemaSchema)).optional(),\n })\n .passthrough();\n\nconst contextUiSchema = z.record(z.string(), uiFieldSchemaSchema).optional();\n\nconst contextDataSchema = z\n .object({\n data: z.record(z.string(), z.unknown()),\n ui: contextUiSchema,\n })\n .optional();\n\n/** Task context wire format version (always `2` today). */\nexport const TASK_CONTEXT_FORMAT_VERSION = 2 as const;\nexport type TaskContextFormatVersion = typeof TASK_CONTEXT_FORMAT_VERSION;\n\nconst taskContextObjectBaseSchema = z.object({\n app: z.string().min(1).optional(),\n type: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n validUntil: z.string().optional(),\n context: contextDataSchema,\n contextVersion: z.literal(2).optional(),\n /** @deprecated Use `contextVersion`. Accepted on ingest only. */\n version: z.literal(2).optional(),\n actions: z.array(taskActionSchema).min(1, \"At least one action is required\"),\n});\n\nfunction normalizeTaskContextVersion<T extends { contextVersion?: 2; version?: 2 }>(\n data: T\n): Omit<T, \"version\" | \"contextVersion\"> & { contextVersion: 2 } {\n const { version: legacyVersion, contextVersion, ...rest } = data;\n return {\n ...rest,\n contextVersion: contextVersion ?? legacyVersion ?? TASK_CONTEXT_FORMAT_VERSION,\n };\n}\n\nconst taskContextObjectSchema = taskContextObjectBaseSchema.transform(\n normalizeTaskContextVersion\n);\n\nfunction refineContextPublicUrls<T extends { context?: z.infer<typeof contextDataSchema> }>(\n data: T,\n ctx: z.RefinementCtx\n) {\n const error = validateContextPublicUrls(data.context);\n if (error) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: error,\n path: [\"context\"],\n });\n }\n}\n\nexport const taskContextSchema = taskContextObjectSchema.superRefine(\n refineContextPublicUrls\n);\n\n/**\n * Assignment targets at task create (not stored in task context JSON).\n * Unknown user emails are auto-provisioned as assignee memberships (count toward seat limits).\n *\n * Virtual group slugs (membership derived from tenantUsers, not groupMembers):\n * - `all` — all workspace members (omit assignTo defaults to this)\n * - `admins` — workspace users with tenant admin role\n */\nexport const VIRTUAL_ASSIGN_TO_GROUP_SLUGS = [\"all\", \"admins\"] as const;\n\nexport const assignToSchema = z\n .object({\n users: z.array(z.string().email()).optional(),\n groups: z.array(z.string().min(1)).optional(),\n })\n .refine(\n (data) => {\n const groups = data.groups ?? [];\n if (groups.includes(\"all\") && groups.length > 1) {\n return false;\n }\n return true;\n },\n { message: 'Cannot combine \"all\" with other group slugs' }\n );\n\n/** A short thread-scoped status update message (1-2 sentences). */\nexport const threadUpdateMessageSchema = z.string().min(1).max(500);\n\n/**\n * Lifecycle status carried by a thread update. Drives the icon and color shown\n * in the inbox status bar. Defaults to `info` when omitted.\n */\nexport const threadUpdateStatuses = [\n \"info\",\n \"queued\",\n \"running\",\n \"waiting\",\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n] as const;\n\nexport const threadUpdateStatusSchema = z.enum(threadUpdateStatuses);\n\n/** The default status applied when an update omits one. */\nexport const DEFAULT_THREAD_UPDATE_STATUS: ThreadUpdateStatus = \"info\";\n\n/** Shared shape for a thread update (standalone and at task creation). */\nexport const threadUpdateInputSchema = z.object({\n message: threadUpdateMessageSchema,\n status: threadUpdateStatusSchema.optional(),\n});\n\n/** Thread priority levels for inbox ordering and display. */\nexport const taskPriorities = [\"low\", \"normal\", \"high\", \"urgent\"] as const;\n\nexport const taskPrioritySchema = z.enum(taskPriorities);\n\nexport type TaskPriority = (typeof taskPriorities)[number];\n\nexport const DEFAULT_TASK_PRIORITY: TaskPriority = \"normal\";\n\nexport const LOWEST_TASK_PRIORITY: TaskPriority = \"low\";\n\nexport const TASK_PRIORITY_RANK: Record<TaskPriority, number> = {\n low: 1,\n normal: 2,\n high: 3,\n urgent: 4,\n};\n\nexport const agentTelemetrySchema = z.object({\n version: z.string().min(1),\n});\n\nexport const createTaskBodySchema = taskContextObjectBaseSchema\n .extend({\n assignTo: assignToSchema.optional(),\n /**\n * Groups related tasks together. When omitted, the server generates one and\n * returns it so the caller can reuse it on later tasks in the same thread.\n */\n threadId: z.string().min(1).optional(),\n /**\n * Optional thread priority. When set, applies to the whole thread and\n * overwrites any previous priority. Omit on later tasks to leave unchanged.\n */\n priority: taskPrioritySchema.optional(),\n /**\n * Optional initial status update logged against the task's thread. Shows in\n * the inbox status bar and the thread update log.\n */\n update: threadUpdateInputSchema.optional(),\n agent: agentTelemetrySchema.optional(),\n })\n .transform(normalizeTaskContextVersion)\n .superRefine(refineContextPublicUrls);\n\n/** POST /v1/threads/:threadId/updates body: a standalone thread update. */\nexport const threadUpdateBodySchema = threadUpdateInputSchema;\n\n/** Where a thread update originated. */\nexport type ThreadUpdateSource = \"api\" | \"task_create\" | \"dashboard\";\n\n/** Lifecycle status carried by a thread update. */\nexport type ThreadUpdateStatus = (typeof threadUpdateStatuses)[number];\n\n/** A logged thread update as returned by the API. */\nexport interface ThreadUpdate {\n id: string;\n threadId: string;\n message: string;\n status: ThreadUpdateStatus;\n source: ThreadUpdateSource;\n createdAt: number;\n}\n\nexport type AssignToInput = z.infer<typeof assignToSchema>;\nexport type CreateTaskBodyInput = z.input<typeof createTaskBodySchema>;\nexport type CreateTaskBody = z.output<typeof createTaskBodySchema>;\nexport type ThreadUpdateBodyInput = z.input<typeof threadUpdateBodySchema>;\nexport type ThreadUpdateBody = z.output<typeof threadUpdateBodySchema>;\nexport type ThreadUpdateInput = z.input<typeof threadUpdateInputSchema>;\nexport type TaskContextInput = z.input<typeof taskContextSchema>;\nexport type TaskContextOutput = z.output<typeof taskContextSchema>;\nexport type TaskContext = TaskContextOutput;\nexport type TaskActionInput = z.infer<typeof taskActionInputSchema>;\nexport type TaskAction = z.infer<typeof taskActionSchema>;\nexport type WebhookHandler = z.infer<typeof webhookHandlerSchema>;\nexport type TriggerHandler = z.infer<typeof triggerHandlerSchema>;\nexport type Handler = z.infer<typeof handlerSchema>;\nexport type AgentTelemetry = z.infer<typeof agentTelemetrySchema>;\nexport type AgentTelemetryInput = z.input<typeof agentTelemetrySchema>;\n\ntype InferObjectProperties<\n Props,\n Req extends PropertyKey,\n> = Props extends Record<string, unknown>\n ? ({\n [K in keyof Props as K extends Req ? K : never]-?: InferJsonSchema7<Props[K]>;\n } & {\n [K in keyof Props as K extends Req ? never : K]?: InferJsonSchema7<Props[K]>;\n } extends infer O\n ? { [K in keyof O]: O[K] }\n : never)\n : Record<string, unknown>;\n\ntype RequiredKeys<S> =\n S extends { readonly required: readonly string[] } ? S[\"required\"][number] : never;\n\nexport type InferJsonSchema7<S> = [S] extends [undefined]\n ? Record<string, never>\n : S extends { readonly const: infer C }\n ? C\n : S extends {\n readonly enum: readonly (infer E)[];\n }\n ? E\n : S extends {\n readonly type: \"object\";\n readonly properties?: infer Props;\n }\n ? InferObjectProperties<Props, RequiredKeys<S>>\n : S extends {\n readonly type: \"object\";\n readonly properties?: undefined;\n }\n ? Record<string, unknown>\n : S extends {\n readonly type: \"array\";\n readonly items?: infer Items;\n }\n ? Items extends readonly unknown[]\n ? InferJsonSchema7<Items[number]>[]\n : Items extends object\n ? InferJsonSchema7<Items>[]\n : unknown[]\n : S extends { readonly type: \"string\" }\n ? string\n : S extends { readonly type: \"number\" } | { readonly type: \"integer\" }\n ? number\n : S extends { readonly type: \"boolean\" }\n ? boolean\n : unknown;\n\nexport type TaskStatus = \"pending\" | \"open\" | \"handled\" | \"expired\";\n\nexport interface TaskResponse {\n success: boolean;\n task: {\n taskId: string;\n threadId: string;\n status: \"pending\" | \"open\";\n context: TaskContext;\n validUntil: string;\n submittedAt: string;\n };\n message: string;\n}\n\nexport interface ThreadUpdateResponse {\n success: boolean;\n update: ThreadUpdate;\n message: string;\n}\n\nexport interface Task {\n id: string;\n threadId?: string;\n createdAt: Date;\n status: TaskStatus;\n context: TaskContext;\n validUntil: number;\n handledAt?: number;\n handled?: {\n action: {\n id: string;\n data: unknown;\n };\n handledBy?: string;\n userId?: string;\n token?: string;\n };\n}\n\nexport type InferActionData<T extends { schema?: unknown }> = [\n Exclude<T[\"schema\"], undefined>,\n] extends [\n never,\n]\n ? Record<string, never>\n : Exclude<T[\"schema\"], undefined> extends infer S\n ? InferJsonSchema7<S>\n : Record<string, never>;\n\nexport type TupleElementIndices<T extends readonly unknown[]> = T extends readonly [\n unknown,\n ...unknown[],\n]\n ? Exclude<keyof T, keyof unknown[]>\n : number;\n\nexport interface TaskResult<T = Record<string, unknown>> {\n actionId: string;\n data: T;\n handledBy?: string;\n handledAt: Date;\n}\n\nexport interface ApprovalResult<T = Record<string, unknown>> extends TaskResult<T> {\n taskId: string;\n}\n\nexport type DiscriminatedApprovalResult<\n TActions extends readonly { id: string; schema?: unknown }[],\n> = {\n [I in TupleElementIndices<TActions>]: TActions[I] extends { id: string; schema?: unknown }\n ? Omit<ApprovalResult<InferActionData<TActions[I]>>, \"actionId\" | \"data\"> & {\n actionId: TActions[I][\"id\"];\n data: InferActionData<TActions[I]>;\n }\n : never\n}[TupleElementIndices<TActions>];\n","import type { TaskAction, TaskContext } from \"../schemas/task\";\nimport type { JSONSchema7 } from \"../schemas/json-schema\";\nimport type { InferJsonSchema7 } from \"./json-schema-infer\";\n\n/**\n * Task status enum\n */\nexport type TaskStatus = \"pending\" | \"open\" | \"handled\" | \"expired\";\n\n/**\n * Task response from the API\n */\nexport interface TaskResponse {\n success: boolean;\n task: {\n taskId: string;\n threadId: string;\n status: \"pending\" | \"open\";\n context: TaskContext;\n validUntil: string;\n submittedAt: string;\n };\n message: string;\n}\n\n/**\n * Task with full details\n */\nexport interface Task {\n id: string;\n threadId?: string;\n createdAt: Date;\n status: TaskStatus;\n context: TaskContext;\n validUntil: number;\n handledAt?: number;\n handled?: {\n action: {\n id: string;\n data: unknown;\n };\n handledBy?: string;\n userId?: string;\n token?: string;\n };\n}\n\n/**\n * Infer the form data shape from an action's JSON Schema (used for approval forms).\n */\nexport type InferActionData<T extends TaskAction> = [Exclude<T[\"schema\"], undefined>] extends [\n never,\n]\n ? Record<string, never>\n : Exclude<T[\"schema\"], undefined> extends infer S extends object\n ? InferJsonSchema7<S & JSONSchema7>\n : Record<string, never>;\n\n/**\n * Indices of a tuple (excludes array prototype keys). For a plain `TaskAction[]`, this is\n * `number`, so the inferred approval union is widened (less narrowing on `actionId`).\n */\nexport type TupleElementIndices<T extends readonly unknown[]> = T extends readonly [\n unknown,\n ...unknown[],\n]\n ? Exclude<keyof T, keyof unknown[]>\n : number;\n\n/**\n * Result type for a handled task\n */\nexport interface TaskResult<T = Record<string, unknown>> {\n actionId: string;\n data: T;\n handledBy?: string;\n handledAt: Date;\n}\n\n/**\n * Task completion payload returned by Trigger wait tokens / SDK helpers.\n */\nexport interface ApprovalResult<T = Record<string, unknown>> extends TaskResult<T> {\n taskId: string;\n}\n\n/**\n * Discriminated approval result inferred from a `task.actions` tuple (`id` + `schema`).\n */\nexport type DiscriminatedApprovalResult<TActions extends readonly TaskAction[]> = {\n [I in TupleElementIndices<TActions>]: TActions[I] extends TaskAction\n ? Omit<ApprovalResult<InferActionData<TActions[I]>>, \"actionId\" | \"data\"> & {\n actionId: TActions[I][\"id\"];\n data: InferActionData<TActions[I]>;\n }\n : never\n}[TupleElementIndices<TActions>];\n\n","import type { JSONSchema7 } from \"../schemas/json-schema\";\n\ntype InferObjectProperties<\n Props extends Record<string, JSONSchema7>,\n Req extends PropertyKey,\n> = {\n [K in keyof Props as K extends Req ? K : never]-?: InferJsonSchema7<Props[K]>;\n} & {\n [K in keyof Props as K extends Req ? never : K]?: InferJsonSchema7<Props[K]>;\n} extends infer O\n ? { [K in keyof O]: O[K] }\n : never;\n\ntype RequiredKeys<S extends JSONSchema7> =\n S extends { readonly required: readonly string[] } ? S[\"required\"][number] : never;\n\n/** Best-effort TypeScript inference for JSON schemas used by task action forms */\nexport type InferJsonSchema7<S extends JSONSchema7 | undefined> = [S] extends [undefined]\n ? Record<string, never>\n : S extends { readonly const: infer C }\n ? C\n : S extends {\n readonly enum: readonly (infer E)[];\n }\n ? E\n : S extends {\n readonly type: \"object\";\n readonly properties?: infer Props extends Record<string, JSONSchema7>;\n }\n ? InferObjectProperties<Props, RequiredKeys<S>>\n : S extends {\n readonly type: \"object\";\n readonly properties?: undefined;\n }\n ? Record<string, unknown>\n : S extends {\n readonly type: \"array\";\n readonly items?: infer Items;\n }\n ? Items extends JSONSchema7[]\n ? InferJsonSchema7<Items[number]>[]\n : Items extends JSONSchema7\n ? InferJsonSchema7<Items>[]\n : unknown[]\n : S extends { readonly type: \"string\" }\n ? string\n : S extends { readonly type: \"number\" } | { readonly type: \"integer\" }\n ? number\n : S extends { readonly type: \"boolean\" }\n ? boolean\n : unknown;\n","export * from \"./task\";\nexport * from \"./json-schema-infer\";\n\n","/**\n * Canonical plan configuration: numeric limits, pricing, and feature flags.\n *\n * Shared between the dashboard, public API, and marketing site so limits,\n * prices, and capabilities never drift across surfaces.\n */\n\nexport type PlanType = \"free\" | \"pro\" | \"enterprise\";\n\nexport interface PlanFeatures {\n attachments: \"linked\" | \"all\";\n auditTrail: boolean;\n ldapSync: boolean;\n customContexts: boolean;\n}\n\nexport interface PlanPricing {\n monthly: number; // in cents\n yearly: number; // in cents\n}\n\nexport interface PlanConfig {\n name: string;\n type: PlanType;\n features: PlanFeatures;\n pricing?: PlanPricing;\n}\n\n/** Sentinel used for \"no limit\". */\nexport const UNLIMITED = -1;\n\n/** Length of the complimentary Pro trial for new workspaces. */\nexport const PRO_TRIAL_DAYS = 30;\n\n/** Default max workspaces a user can create via the in-app form. */\nexport const DEFAULT_MAX_WORKSPACES_PER_USER = 5;\n\nexport const PRO_TRIAL_LABEL = \"Try Pro free for 30 days\";\nexport const PRO_TRIAL_SUBTITLE =\n \"First month free for every new workspace\";\nexport const PRO_TRIAL_CTA = \"Try for a month\";\nexport const PRO_TRIAL_BADGE = \"30 days free\";\nexport const PRO_TRIAL_NO_PAYMENT_NOTE =\n \"No credit card or payment info needed\";\nexport const PRO_TRIAL_PRICING_HEADLINE =\n \"Start for free — every new workspace gets a month of Pro (automatically converts to the Free plan if you don't upgrade).\";\n\nconst MS_PER_DAY = 86_400_000;\n\nexport type TrialState = \"none\" | \"active\" | \"expired\";\n\n/** Fields on a tenant record used to evaluate trial state. */\nexport interface TenantTrialFields {\n planType: string;\n subscriptionStatus?: string | null;\n proTrialEndsAt?: number | null;\n stripeSubscriptionId?: string | null;\n}\n\nexport function hasPaidProSubscription(\n tenant: TenantTrialFields\n): boolean {\n return (\n !!tenant.stripeSubscriptionId &&\n tenant.subscriptionStatus === \"active\"\n );\n}\n\nexport function getTrialState(\n tenant: TenantTrialFields,\n now = Date.now()\n): TrialState {\n if (hasPaidProSubscription(tenant)) {\n return \"none\";\n }\n if (\n tenant.subscriptionStatus !== \"trialing\" ||\n tenant.proTrialEndsAt == null\n ) {\n return \"none\";\n }\n return tenant.proTrialEndsAt > now ? \"active\" : \"expired\";\n}\n\nexport function isTrialExpiredBlocked(\n tenant: TenantTrialFields,\n now = Date.now()\n): boolean {\n if (hasPaidProSubscription(tenant)) {\n return false;\n }\n return getTrialState(tenant, now) === \"expired\";\n}\n\n/** Plan type used for limit resolution (Pro only when access is active). */\nexport function getEffectivePlanType(\n tenant: TenantTrialFields,\n now = Date.now()\n): PlanType {\n const normalized = normalizePlanType(tenant.planType);\n if (normalized === \"enterprise\") {\n return \"enterprise\";\n }\n if (hasPaidProSubscription(tenant)) {\n return \"pro\";\n }\n if (getTrialState(tenant, now) === \"active\") {\n return \"pro\";\n }\n if (isTrialExpiredBlocked(tenant, now)) {\n return \"free\";\n }\n if (normalized === \"pro\") {\n return \"pro\";\n }\n return \"free\";\n}\n\nexport function getProTrialEndsAt(now = Date.now()): number {\n return now + PRO_TRIAL_DAYS * MS_PER_DAY;\n}\n\nexport function getTrialDaysRemaining(\n tenant: TenantTrialFields,\n now = Date.now()\n): number | null {\n if (getTrialState(tenant, now) !== \"active\" || tenant.proTrialEndsAt == null) {\n return null;\n }\n return Math.max(\n 0,\n Math.ceil((tenant.proTrialEndsAt - now) / MS_PER_DAY)\n );\n}\n\nexport function getPlanDisplayName(planType: string | null | undefined): string {\n const normalized = normalizePlanType(planType);\n if (normalized === \"pro\") return \"Pro Plan\";\n if (normalized === \"enterprise\") return \"Enterprise Plan\";\n return \"Free Plan\";\n}\n\n/** Marketing-friendly rate limit copy (no specific numbers). */\nexport function getPricingRateLimitLabel(\n planType: string | null | undefined\n): string {\n const normalized = normalizePlanType(planType);\n if (normalized === \"enterprise\") return \"Custom API limits\";\n if (normalized === \"pro\") return \"Higher API limits\";\n return \"Standard API limits\";\n}\n\nexport interface PlanLimits {\n /** Tasks creatable per rolling 24h window. */\n tasksPerDay: number;\n /** Billable seats (team members + assignees). */\n members: number;\n /** Active API keys. */\n apiKeys: number;\n /** Groups. */\n groups: number;\n /** Audit-log retention in days. */\n auditLogRetention: number;\n /** Sustained request rate allowed per second. */\n rateLimitPerSecond: number;\n /** Task retention in days. */\n taskRetentionDays: number;\n}\n\n/** Per-tenant overrides; any field present replaces the plan default. */\nexport type PlanLimitsOverride = Partial<PlanLimits>;\n\nexport const PLANS: Record<PlanType, PlanConfig> = {\n free: {\n name: \"Free\",\n type: \"free\",\n features: {\n attachments: \"linked\",\n auditTrail: false,\n ldapSync: false,\n customContexts: false,\n },\n },\n pro: {\n name: \"Pro\",\n type: \"pro\",\n features: {\n attachments: \"all\",\n auditTrail: true,\n ldapSync: false,\n customContexts: false,\n },\n pricing: {\n monthly: 1999, // 19.99€ in cents\n yearly: 19999, // 199.99€ in cents\n },\n },\n enterprise: {\n name: \"Enterprise\",\n type: \"enterprise\",\n features: {\n attachments: \"all\",\n auditTrail: true,\n ldapSync: true,\n customContexts: true,\n },\n },\n};\n\nexport function getPlan(planType: PlanType): PlanConfig {\n return PLANS[planType] || PLANS.free;\n}\n\nexport const PLAN_LIMITS: Record<PlanType, PlanLimits> = {\n free: {\n tasksPerDay: 100,\n members: 3,\n apiKeys: 3,\n groups: 3,\n auditLogRetention: 30,\n rateLimitPerSecond: 2,\n taskRetentionDays: 7,\n },\n pro: {\n tasksPerDay: 1000,\n members: 20,\n apiKeys: 20,\n groups: 20,\n auditLogRetention: 365,\n rateLimitPerSecond: 25,\n taskRetentionDays: 30,\n },\n enterprise: {\n tasksPerDay: UNLIMITED,\n members: UNLIMITED,\n apiKeys: UNLIMITED,\n groups: UNLIMITED,\n auditLogRetention: UNLIMITED,\n rateLimitPerSecond: 25,\n taskRetentionDays: UNLIMITED,\n },\n};\n\n/** True when a limit value represents \"no limit\". */\nexport function isUnlimited(value: number): boolean {\n return value < 0;\n}\n\n/** Normalize an arbitrary plan string to a known {@link PlanType}. */\nexport function normalizePlanType(planType: string | null | undefined): PlanType {\n if (planType === \"pro\" || planType === \"enterprise\") {\n return planType;\n }\n return \"free\";\n}\n\n/** Resolve the runtime limits for a plan, falling back to `free`. */\nexport function getPlanLimits(planType: string | null | undefined): PlanLimits {\n return PLAN_LIMITS[normalizePlanType(planType)];\n}\n\n/**\n * Resolve the effective limits for a tenant: plan defaults with any per-tenant\n * {@link PlanLimitsOverride} applied on top. `undefined` override fields are\n * ignored so partial overrides only replace the values they specify.\n */\nexport function resolvePlanLimits(\n planType: string | null | undefined,\n overrides?: PlanLimitsOverride | null\n): PlanLimits {\n const base = getPlanLimits(planType);\n if (!overrides) {\n return base;\n }\n\n const resolved: PlanLimits = { ...base };\n for (const key of Object.keys(overrides) as (keyof PlanLimits)[]) {\n const value = overrides[key];\n if (typeof value === \"number\") {\n resolved[key] = value;\n }\n }\n return resolved;\n}\n","/** Delays between handler delivery attempts (after attempts 1–7). */\nexport const HANDLER_RETRY_DELAYS_MS = [\n 60_000, // 1m\n 300_000, // 5m\n 1_800_000, // 30m\n 3_600_000, // 1h\n 21_600_000, // 6h\n 86_400_000, // 24h\n 172_800_000, // 48h\n] as const;\n\nexport const HANDLER_MAX_ATTEMPTS = HANDLER_RETRY_DELAYS_MS.length + 1;\n\nexport const HANDLER_FETCH_TIMEOUT_MS = 30_000;\n\nexport function handlerRetryDelayMs(failedAttempt: number): number | null {\n if (failedAttempt < 1 || failedAttempt >= HANDLER_MAX_ATTEMPTS) {\n return null;\n }\n return HANDLER_RETRY_DELAYS_MS[failedAttempt - 1] ?? null;\n}\n\nexport function isRetriableHandlerFailure(\n statusCode: number | undefined,\n _error?: string\n): boolean {\n if (statusCode === undefined) {\n return true;\n }\n if (statusCode >= 200 && statusCode < 300) {\n return false;\n }\n if (statusCode === 408 || statusCode === 429) {\n return true;\n }\n if (statusCode >= 500) {\n return true;\n }\n return false;\n}\n","/** ISO date (YYYY-MM-DD) identifying the published Terms of Service version. Bump when terms change. */\nexport const CURRENT_TERMS_VERSION = \"2025-06-23\";\n\n/** Human-readable date for legal pages and UI. Keep in sync with CURRENT_TERMS_VERSION. */\nexport const CURRENT_TERMS_LAST_UPDATED = \"June 23, 2025\";\n\nexport const TERMS_URL = \"https://robotrock.io/terms\";\n","import type { TaskContextInput } from \"./schemas/task\";\n\nconst WELCOME_TASK_TYPE = \"welcome\";\n\nfunction docsPath(docsBaseUrl: string, path: string): string {\n const base = docsBaseUrl.replace(/\\/$/, \"\");\n if (!path || path === \"/\") {\n return `${base}/`;\n }\n return `${base}/${path.replace(/^\\//, \"\")}`;\n}\n\nfunction appAssetPath(appBaseUrl: string, path: string): string {\n const base = appBaseUrl.replace(/\\/$/, \"\");\n return `${base}/${path.replace(/^\\//, \"\")}`;\n}\n\n/** Task type used for idempotent welcome-task seeding. */\nexport const WELCOME_TASK_TYPE_ID = WELCOME_TASK_TYPE;\n\n/** Short summary shown in the inbox list and task detail header. */\nexport const WELCOME_TASK_INBOX_DESCRIPTION =\n \"Thanks for trying RobotRock — we're glad you're here.\";\n\nexport const WELCOME_TASK_HERO_BASENAME = \"robot-welcome\";\n\n/** Build the onboarding task shown in new workspaces. */\nexport function buildWelcomeTaskContext(\n docsBaseUrl: string,\n appBaseUrl = \"https://app.robotrock.io\"\n): TaskContextInput {\n const gettingStartedUrl = docsPath(docsBaseUrl, \"/\");\n const taskExamplesUrl = docsPath(docsBaseUrl, \"/task-examples/support-ticket\");\n const vercelAiUrl = docsPath(docsBaseUrl, \"/integrations/vercel-ai\");\n const vercelWorkflowUrl = docsPath(docsBaseUrl, \"/integrations/vercel-workflow\");\n const triggerUrl = docsPath(docsBaseUrl, \"/integrations/trigger\");\n const mcpUrl = docsPath(docsBaseUrl, \"/integrations/mcp\");\n const skillsUrl = docsPath(docsBaseUrl, \"/integrations/skills\");\n const heroImageUrl = appAssetPath(\n appBaseUrl,\n `/illustrations/${WELCOME_TASK_HERO_BASENAME}.png`\n );\n\n return {\n type: WELCOME_TASK_TYPE,\n name: \"Welcome to RobotRock\",\n description: WELCOME_TASK_INBOX_DESCRIPTION,\n context: {\n data: {\n hero: heroImageUrl,\n learnMore: `Your workspace is ready. This inbox is where your team steps in when an AI agent needs a human: approvals, reviews, questions, and anything else that shouldn't run on autopilot. You're looking at an example of what those tasks look like.\n\nWhen you're ready to integrate, the docs walk you through installation, your first \\`sendToHuman\\` call, and connecting your app.\n\n- **[Getting started guide](${gettingStartedUrl})** — install the SDK, add an API key, and send your first task\n- **[Task examples](${taskExamplesUrl})** — real-world patterns you can preview and try\n\n**Integrations**\n\n- [Vercel AI](${vercelAiUrl})\n- [Vercel Workflow](${vercelWorkflowUrl})\n- [Trigger.dev](${triggerUrl}) — durable HITL waits in background tasks; connect eve agents under Settings → Integrations → eve for the Agents page\n- [MCP](${mcpUrl})\n- [Agent skills](${skillsUrl})`,\n },\n ui: {\n hero: {\n \"ui:title\": \"\",\n \"ui:widget\": \"image\",\n },\n learnMore: {\n \"ui:title\": \"\",\n \"ui:widget\": \"markdown\",\n },\n },\n },\n actions: [\n {\n id: \"mark-done\",\n title: \"Mark as done\",\n description: \"Clear this welcome task from your open inbox.\",\n schema: {\n type: \"object\",\n properties: {},\n },\n },\n ],\n };\n}\n","export const PRODUCTION_APP_URL = \"https://app.robotrock.io\";\nexport const DEV_APP_URL = \"http://localhost:4004\";\nexport const PRODUCTION_API_URL = \"https://api.robotrock.io/v1\";\nexport const DEV_API_URL = \"http://localhost:4001/v1\";\nexport const DEV_DOCS_URL = \"http://localhost:4002\";\n\n/** Local dev server ports for all RobotRock apps (4000–4008). */\nexport const DEV_PORTS = {\n marketing: 4000,\n api: 4001,\n docs: 4002,\n status: 4003,\n app: 4004,\n admin: 4005,\n triggerTest: 4006,\n workflowTest: 4007,\n mcp: 4008,\n} as const;\n\n/** Production signup URL (stable constant for tests and production defaults). */\nexport const APP_SIGNUP_URL = `${PRODUCTION_APP_URL}/sign-up`;\n\nfunction readExplicitAppUrl(): string | undefined {\n const url =\n process.env.NEXT_PUBLIC_APP_URL?.trim() ||\n process.env.NEXT_PUBLIC_APP_PREVIEW_URL?.trim();\n return url ? url.replace(/\\/$/, \"\") : undefined;\n}\n\n/** Dashboard origin — localhost:4004 in dev unless overridden via env. */\nexport function getAppBaseUrl(): string {\n const explicit = readExplicitAppUrl();\n if (explicit) return explicit;\n if (process.env.NODE_ENV === \"development\") {\n return DEV_APP_URL;\n }\n return PRODUCTION_APP_URL;\n}\n\nexport function getAppSignupBaseUrl(): string {\n return `${getAppBaseUrl()}/sign-up`;\n}\n\n/** Ensure the RobotRock API base URL ends with `/v1` (no trailing slash). */\nexport function normalizeRobotRockApiBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n if (trimmed.endsWith(\"/v1\")) {\n return trimmed;\n }\n return `${trimmed}/v1`;\n}\n\n/**\n * RobotRock API origin for SDK / agent hooks.\n * Local dev defaults to `http://localhost:4001/v1` unless overridden.\n */\nexport function getRobotRockApiBaseUrl(): string {\n const explicit =\n process.env.ROBOTROCK_BASE_URL?.trim() ||\n process.env.ROBOTROCK_API_URL?.trim();\n if (explicit) {\n return normalizeRobotRockApiBaseUrl(explicit);\n }\n if (process.env.NODE_ENV === \"production\") {\n return PRODUCTION_API_URL;\n }\n return DEV_API_URL;\n}\n","import { z } from \"zod\";\nimport { getAppBaseUrl } from \"../app-url\";\n\nexport { APP_SIGNUP_URL } from \"../app-url\";\n\nexport const ATTRIBUTION_COOKIE_NAME = \"rr_attribution\";\nexport const ATTRIBUTION_COOKIE_MAX_AGE = 60 * 60 * 24 * 90; // 90 days\nexport const ATTRIBUTION_COOKIE_DOMAIN = \".robotrock.io\";\n\nconst UTM_PARAM_MAP = {\n utm_source: \"utmSource\",\n utm_medium: \"utmMedium\",\n utm_campaign: \"utmCampaign\",\n utm_content: \"utmContent\",\n utm_term: \"utmTerm\",\n gclid: \"gclid\",\n} as const;\n\nexport const attributionSchema = z.object({\n utmSource: z.string().optional(),\n utmMedium: z.string().optional(),\n utmCampaign: z.string().optional(),\n utmContent: z.string().optional(),\n utmTerm: z.string().optional(),\n gclid: z.string().optional(),\n landingUrl: z.string().optional(),\n referrer: z.string().optional(),\n capturedAt: z.number(),\n});\n\nexport type Attribution = z.infer<typeof attributionSchema>;\n\nexport function hasAttributionSignal(attribution: Partial<Attribution>): boolean {\n return Boolean(\n attribution.utmSource ||\n attribution.utmMedium ||\n attribution.utmCampaign ||\n attribution.utmContent ||\n attribution.utmTerm ||\n attribution.gclid\n );\n}\n\nexport function parseAttributionFromSearchParams(\n params: URLSearchParams | Record<string, string | string[] | undefined>\n): Partial<Attribution> {\n const getParam = (key: string): string | undefined => {\n if (params instanceof URLSearchParams) {\n return params.get(key)?.trim() || undefined;\n }\n const value = params[key];\n if (Array.isArray(value)) {\n return value[0]?.trim() || undefined;\n }\n return value?.trim() || undefined;\n };\n\n const result: Partial<Attribution> = {};\n\n for (const [param, field] of Object.entries(UTM_PARAM_MAP)) {\n const value = getParam(param);\n if (value) {\n result[field as keyof typeof UTM_PARAM_MAP & keyof Partial<Attribution>] =\n value;\n }\n }\n\n return result;\n}\n\nexport function buildAttributionFromRequest(input: {\n searchParams: URLSearchParams;\n landingUrl?: string;\n referrer?: string;\n capturedAt?: number;\n}): Attribution | null {\n const parsed = parseAttributionFromSearchParams(input.searchParams);\n if (!hasAttributionSignal(parsed)) {\n return null;\n }\n\n return attributionSchema.parse({\n ...parsed,\n landingUrl: input.landingUrl,\n referrer: input.referrer || undefined,\n capturedAt: input.capturedAt ?? Date.now(),\n });\n}\n\nexport function serializeAttributionCookie(attribution: Attribution): string {\n return encodeURIComponent(JSON.stringify(attribution));\n}\n\nexport function parseAttributionCookie(raw: string | undefined | null): Attribution | null {\n if (!raw) return null;\n\n const candidates = [raw];\n try {\n const decoded = decodeURIComponent(raw);\n if (decoded !== raw) {\n candidates.push(decoded);\n }\n } catch {\n // Keep only the raw value.\n }\n\n for (const candidate of candidates) {\n try {\n const parsed = attributionSchema.parse(JSON.parse(candidate));\n if (hasAttributionSignal(parsed)) {\n return parsed;\n }\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nexport function formatAttributionCampaign(\n attribution: Partial<Attribution> | null | undefined\n): string | null {\n if (!attribution) return null;\n return attribution.utmCampaign ?? attribution.utmSource ?? null;\n}\n\nexport function appendAttributionToUrl(\n baseUrl: string,\n attribution: Partial<Attribution> | null | undefined,\n origin = getAppBaseUrl()\n): string {\n if (!attribution || !hasAttributionSignal(attribution)) {\n return baseUrl;\n }\n\n const url = baseUrl.startsWith(\"http\")\n ? new URL(baseUrl)\n : new URL(baseUrl, origin);\n const paramEntries: Array<[string, string | undefined]> = [\n [\"utm_source\", attribution.utmSource],\n [\"utm_medium\", attribution.utmMedium],\n [\"utm_campaign\", attribution.utmCampaign],\n [\"utm_content\", attribution.utmContent],\n [\"utm_term\", attribution.utmTerm],\n [\"gclid\", attribution.gclid],\n ];\n\n for (const [param, value] of paramEntries) {\n if (value) {\n url.searchParams.set(param, value);\n }\n }\n\n return baseUrl.startsWith(\"http\")\n ? url.toString()\n : `${url.pathname}${url.search}${url.hash}`;\n}\n\nexport function getAttributionCookieDomain(hostname: string): string | undefined {\n if (hostname === \"localhost\" || hostname.endsWith(\".localhost\")) {\n return undefined;\n }\n if (hostname === \"robotrock.io\" || hostname.endsWith(\".robotrock.io\")) {\n return ATTRIBUTION_COOKIE_DOMAIN;\n }\n return undefined;\n}\n","export const AGENT_SERVICE_AUTH_FAILURE_CODES = [\n \"invalid_service_token\",\n \"tenant_not_found\",\n \"connection_not_found\",\n \"connection_not_robotrock_ready\",\n \"origin_mismatch\",\n \"deployment_not_verified\",\n] as const;\n\nexport type AgentServiceAuthFailureCode =\n (typeof AGENT_SERVICE_AUTH_FAILURE_CODES)[number];\n\nconst AGENT_SERVICE_AUTH_HINTS: Record<AgentServiceAuthFailureCode, string> = {\n invalid_service_token:\n \"Check ROBOTROCK_AGENT_SERVICE_TOKEN on the agent matches the active token in Developer → Agents.\",\n tenant_not_found:\n \"The workspace slug in the chat session does not match a RobotRock tenant.\",\n connection_not_found:\n \"Connect this workspace to the agent in Settings → Agents.\",\n connection_not_robotrock_ready:\n \"Finish workspace connection setup in Settings → Agents.\",\n origin_mismatch:\n \"The workspace connection URL must match the verified deployment URL in Developer → Agents.\",\n deployment_not_verified:\n \"Verify the agent at Developer → Agents before using hosted multi-tenant auth.\",\n};\n\nexport function agentServiceAuthHint(\n code: AgentServiceAuthFailureCode\n): string {\n return AGENT_SERVICE_AUTH_HINTS[code];\n}\n\nexport function redactServiceTokenPrefix(token: string): string {\n const trimmed = token.trim();\n if (!trimmed) {\n return \"(empty)\";\n }\n if (trimmed.length <= 8) {\n return `${trimmed.slice(0, 4)}…`;\n }\n return `${trimmed.slice(0, 12)}…`;\n}\n","// Re-export all schemas\nexport * from \"./schemas/index\";\n\n// Re-export all types\nexport * from \"./types/index\";\n\n// Re-export all utils\nexport * from \"./utils/index\";\n\n// Re-export plan limits\nexport * from \"./plans/index\";\n\n// Handler webhook retry policy\nexport * from \"./handler-retry\";\n\n// Legal constants (terms version, URLs)\nexport * from \"./legal\";\n\n// Onboarding welcome task for new workspaces\nexport * from \"./welcome-task\";\n\n// Marketing attribution (UTM / gclid capture)\nexport * from \"./attribution/index\";\n\n// Dev/prod app URLs and port constants\nexport * from \"./app-url\";\n\n// Agent service auth diagnostics\nexport * from \"./agent-service-auth\";\n","import type { DiscriminatedApprovalResult, Task } from \"./schemas/index.js\";\n\nexport class TaskTimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TaskTimeoutError\";\n }\n}\n\nexport class TaskExpiredError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TaskExpiredError\";\n }\n}\n\n/**\n * Map a handled API task to a discriminated approval result.\n * Runtime validation is minimal; TypeScript narrows via `task.actions` at the call site.\n */\nexport function toDiscriminatedApprovalResult<A extends readonly { id: string; schema?: unknown }[]>(\n actions: A,\n task: Task\n): DiscriminatedApprovalResult<A> {\n void actions;\n\n if (!task.handled) {\n throw new Error(\"Task has no handled result\");\n }\n\n return {\n actionId: task.handled.action.id,\n data: task.handled.action.data,\n handledBy: task.handled.handledBy,\n handledAt: new Date(task.handledAt ?? Date.now()),\n taskId: task.id,\n } as DiscriminatedApprovalResult<A>;\n}\n","export class RobotRockError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly response?: unknown\n ) {\n super(message);\n this.name = \"RobotRockError\";\n }\n}\n\ntype ParsedResponseBody = Record<string, unknown> | unknown[] | string | null;\n\nexport async function parseResponseBody(\n response: Response\n): Promise<ParsedResponseBody> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const bodyText = await response.text();\n\n if (!bodyText) {\n return null;\n }\n\n if (contentType.toLowerCase().includes(\"application/json\")) {\n try {\n return JSON.parse(bodyText) as ParsedResponseBody;\n } catch {\n // Fall through and return text body below so error messages stay useful.\n }\n }\n\n try {\n return JSON.parse(bodyText) as ParsedResponseBody;\n } catch {\n return bodyText;\n }\n}\n\nexport function getErrorMessage(\n data: ParsedResponseBody,\n fallback: string\n): string {\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const record = data as Record<string, unknown>;\n const maybeMessage = record.message;\n const maybeHint = record.hint;\n if (typeof maybeMessage === \"string\" && maybeMessage.trim()) {\n if (typeof maybeHint === \"string\" && maybeHint.trim()) {\n return `${maybeMessage.trim()} ${maybeHint.trim()}`;\n }\n return maybeMessage;\n }\n }\n\n if (typeof data === \"string\" && data.trim()) {\n const compact = data.replace(/\\s+/g, \" \").trim();\n const snippet = compact.length > 180 ? `${compact.slice(0, 180)}...` : compact;\n return `${fallback}. Server returned non-JSON response: ${snippet}`;\n }\n\n return fallback;\n}\n","export type RobotRockAuthConfig =\n | { kind: \"apiKey\"; apiKey: string; actingUserId?: string }\n | {\n kind: \"agentService\";\n token: string;\n tenantSlug: string;\n connectionId: string;\n actingUserId?: string;\n };\n\nexport const ROBOTROCK_ACTING_USER_ID_HEADER = \"x-robotrock-acting-user-id\";\n\nexport function buildRobotRockAuthHeaders(\n auth: RobotRockAuthConfig\n): Record<string, string> {\n if (auth.kind === \"apiKey\") {\n const headers: Record<string, string> = {\n \"X-Api-Key\": auth.apiKey,\n };\n if (auth.actingUserId?.trim()) {\n headers[ROBOTROCK_ACTING_USER_ID_HEADER] = auth.actingUserId.trim();\n }\n return headers;\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${auth.token}`,\n \"X-RobotRock-Tenant-Slug\": auth.tenantSlug,\n \"X-RobotRock-Connection-Id\": auth.connectionId,\n };\n\n if (auth.actingUserId?.trim()) {\n headers[ROBOTROCK_ACTING_USER_ID_HEADER] = auth.actingUserId.trim();\n }\n\n return headers;\n}\n\nexport function resolveRobotRockAuthConfig(overrides?: {\n apiKey?: string;\n agentService?: {\n token: string;\n tenantSlug: string;\n connectionId: string;\n actingUserId?: string;\n };\n}): RobotRockAuthConfig {\n if (overrides?.agentService) {\n return {\n kind: \"agentService\",\n ...overrides.agentService,\n };\n }\n\n const apiKey = overrides?.apiKey ?? process.env.ROBOTROCK_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"RobotRock auth is required. Set ROBOTROCK_API_KEY, ROBOTROCK_AGENT_SERVICE_TOKEN with tenant context, or pass auth when creating the client.\"\n );\n }\n\n return { kind: \"apiKey\", apiKey };\n}\n","export const ROBOTROCK_CHAT_ID_HEADER = \"x-robotrock-chat-id\";\nexport const ROBOTROCK_EVE_SESSION_ID_HEADER = \"x-robotrock-eve-session-id\";\n\nexport type ChatCorrelation = {\n chatId?: string;\n eveSessionId?: string;\n};\n\n/** Resolve chat correlation from env (programmatic / cron chats). */\nexport function resolveChatCorrelationFromEnv(): ChatCorrelation | undefined {\n const chatId = process.env.ROBOTROCK_CHAT_ID?.trim();\n const eveSessionId = process.env.ROBOTROCK_EVE_SESSION_ID?.trim();\n if (!chatId && !eveSessionId) {\n return undefined;\n }\n return {\n ...(chatId ? { chatId } : {}),\n ...(eveSessionId ? { eveSessionId } : {}),\n };\n}\n\n/** Attach chat correlation headers when a chat context is known. */\nexport function buildChatCorrelationHeaders(\n correlation?: ChatCorrelation\n): Record<string, string> {\n if (!correlation) {\n return {};\n }\n\n const headers: Record<string, string> = {};\n const chatId = correlation.chatId?.trim();\n const eveSessionId = correlation.eveSessionId?.trim();\n\n if (chatId) {\n headers[ROBOTROCK_CHAT_ID_HEADER] = chatId;\n }\n if (eveSessionId) {\n headers[ROBOTROCK_EVE_SESSION_ID_HEADER] = eveSessionId;\n }\n\n return headers;\n}\n","import {\n agentChatAuditInputBodySchema,\n agentChatAuditToolBodySchema,\n agentChatLinkTaskBodySchema,\n agentChatStageHitlBodySchema,\n createAgentChatBodySchema,\n type AgentChatAuditInputBody,\n type AgentChatAuditToolBody,\n type AgentChatLinkTaskBody,\n type AgentChatSeedMessage,\n type AgentChatStageHitlBody,\n} from \"@robotrock/core\";\nimport { RobotRockError, getErrorMessage, parseResponseBody } from \"./http.js\";\nimport {\n buildRobotRockAuthHeaders,\n type RobotRockAuthConfig,\n} from \"./auth-headers.js\";\nimport {\n buildChatCorrelationHeaders,\n type ChatCorrelation,\n} from \"./chat-correlation.js\";\n\n/** A chat created via {@link ChatsApi.create}. */\nexport type CreatedChat = {\n chatId: string;\n sessionId: string;\n userId?: string;\n agentIdentifier: string;\n deepLink: string;\n};\n\nexport type CreateChatResult = {\n tenantSlug: string;\n chats: CreatedChat[];\n};\n\nexport type CreateChatInput = {\n /** Agent to run the chat. Required unless `parentChatId` is provided. */\n agentIdentifier?: string;\n /** Spawn a chat from an existing chat; inherits its agent/app/owner and links audit. */\n parentChatId?: string;\n /** Trigger connection id to run the chat under (defaults to the tenant's). */\n connectionId?: string;\n /** Inbox app bucket. Overrides the client `app` when set. */\n app?: string;\n /** Email of the user who owns the chat. Required unless `parentChatId` is set. */\n ownerEmail?: string;\n /** Chat title shown in the inbox. */\n title: string;\n /** Seed messages to preload the conversation. Defaults to a welcome message. */\n messages?: AgentChatSeedMessage[];\n /** How the chat was created (statistics/audit). @default \"api\" */\n source?: string;\n};\n\nexport type CloseChatOptions = {\n /** Optional human-readable reason recorded on the audit trail. */\n reason?: string;\n};\n\nexport type LogChatToolExecutionInput = AgentChatAuditToolBody;\n\nexport type LogChatInputSubmissionInput = AgentChatAuditInputBody;\n\nexport type StageChatHitlRequestsInput = AgentChatStageHitlBody;\n\nexport type LinkChatTaskInput = AgentChatLinkTaskBody;\n\nexport type StagedChatHitlRequest = StageChatHitlRequestsInput[\"requests\"][number];\n\nexport interface ChatsApi {\n /** Create an agent chat owned by a single user. */\n create(input: CreateChatInput): Promise<CreateChatResult>;\n /** Close (archive) a chat by its public chatId — e.g. when an agent is done. */\n close(chatId: string, options?: CloseChatOptions): Promise<void>;\n /** Persist pending Eve HITL requests on the chat for durable audit logging. */\n stageHitlRequests(input: StageChatHitlRequestsInput): Promise<void>;\n /** Read pending Eve HITL requests staged on the chat. */\n getStagedHitlRequests(eveSessionId: string): Promise<StagedChatHitlRequest[]>;\n /** Log an Eve HITL choice to the RobotRock chat audit trail. */\n logInputSubmission(input: LogChatInputSubmissionInput): Promise<void>;\n /** Log a mutating Eve tool execution to the RobotRock chat audit trail. */\n logToolExecution(input: LogChatToolExecutionInput): Promise<void>;\n /** Link an inbox task to the originating Eve chat session. */\n linkTask(input: LinkChatTaskInput): Promise<void>;\n}\n\n/**\n * Build the `client.chats` namespace. Mirrors the `client.tasks` surface for the\n * long-lived chat resource, so a single client creates both tasks and chats.\n */\nexport function createChatsApi(config: {\n baseUrl: string;\n auth: RobotRockAuthConfig;\n app?: string;\n chatCorrelation?: ChatCorrelation;\n}): ChatsApi {\n const headers = (): Record<string, string> => ({\n \"Content-Type\": \"application/json\",\n ...buildRobotRockAuthHeaders(config.auth),\n ...buildChatCorrelationHeaders(config.chatCorrelation),\n });\n\n return {\n async create(input: CreateChatInput): Promise<CreateChatResult> {\n const bodyPayload = {\n ...input,\n app: input.app ?? config.app,\n messages: input.messages ?? [],\n };\n const validation = createAgentChatBodySchema.safeParse(bodyPayload);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid chat: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to create chat\"),\n response.status,\n data\n );\n }\n\n const result = data as unknown as CreateChatResult;\n return { tenantSlug: result.tenantSlug, chats: result.chats };\n },\n\n async close(chatId: string, options?: CloseChatOptions): Promise<void> {\n if (!chatId) {\n throw new RobotRockError(\"chatId is required to close a chat\", 400);\n }\n\n const response = await fetch(\n `${config.baseUrl}/agent-chats/${encodeURIComponent(chatId)}/close`,\n {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ reason: options?.reason }),\n }\n );\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to close chat\"),\n response.status,\n data\n );\n }\n },\n\n async stageHitlRequests(input: StageChatHitlRequestsInput): Promise<void> {\n const validation = agentChatStageHitlBodySchema.safeParse(input);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid stage HITL input: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats/stage-hitl`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to stage chat HITL requests\"),\n response.status,\n data\n );\n }\n },\n\n async getStagedHitlRequests(eveSessionId: string): Promise<StagedChatHitlRequest[]> {\n const trimmed = eveSessionId.trim();\n if (!trimmed) {\n throw new RobotRockError(\"eveSessionId is required\", 400);\n }\n\n const url = new URL(`${config.baseUrl}/agent-chats/staged-hitl`);\n url.searchParams.set(\"eveSessionId\", trimmed);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: headers(),\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to fetch staged chat HITL requests\"),\n response.status,\n data\n );\n }\n\n const requests = (data as { requests?: StagedChatHitlRequest[] }).requests;\n return Array.isArray(requests) ? requests : [];\n },\n\n async logInputSubmission(input: LogChatInputSubmissionInput): Promise<void> {\n const validation = agentChatAuditInputBodySchema.safeParse(input);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid audit input: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats/audit-input`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to log chat input submission\"),\n response.status,\n data\n );\n }\n },\n\n async logToolExecution(input: LogChatToolExecutionInput): Promise<void> {\n const validation = agentChatAuditToolBodySchema.safeParse(input);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid audit tool input: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats/audit-tool`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to log chat tool execution\"),\n response.status,\n data\n );\n }\n },\n\n async linkTask(input: LinkChatTaskInput): Promise<void> {\n const validation = agentChatLinkTaskBodySchema.safeParse(input);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid link task input: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats/link-task`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to link inbox task to chat\"),\n response.status,\n data\n );\n }\n },\n };\n}\n","import {\n type AssignToInput,\n type TaskContextInput,\n createTaskBodySchema,\n threadUpdateBodySchema,\n TASK_CONTEXT_FORMAT_VERSION,\n} from \"./schemas/index.js\";\nimport {\n type AgentAdminTaskSummary,\n listTasksQuerySchema,\n} from \"@robotrock/core\";\nimport type { z } from \"zod\";\nimport {\n TaskExpiredError,\n TaskTimeoutError,\n toDiscriminatedApprovalResult,\n} from \"./approval-result.js\";\nimport { RobotRockError, getErrorMessage, parseResponseBody } from \"./http.js\";\nimport { getRobotRockApiBaseUrl } from \"@robotrock/core\";\nimport { createChatsApi, type ChatsApi } from \"./chats.js\";\nimport {\n buildRobotRockAuthHeaders,\n resolveRobotRockAuthConfig,\n type RobotRockAuthConfig,\n} from \"./auth-headers.js\";\nimport {\n buildChatCorrelationHeaders,\n type ChatCorrelation,\n} from \"./chat-correlation.js\";\nimport type {\n DiscriminatedApprovalResult,\n Task,\n TaskPriority,\n TaskResponse,\n ThreadUpdate,\n ThreadUpdateResponse,\n ThreadUpdateStatus,\n TaskContextFormatVersion,\n} from \"./schemas/index.js\";\n\nexport type RobotRockWebhookConfig = {\n url: string;\n headers?: Record<string, string>;\n};\n\nexport interface RobotRockPollingOptions {\n /** Poll interval when no webhook is configured (ms). @default 2000 */\n intervalMs?: number;\n /**\n * Max time to poll when no webhook is configured (ms).\n * Polling also stops when the task's `validUntil` passes, whichever is sooner.\n * @default 86400000 (24h)\n */\n timeoutMs?: number;\n};\n\n/** Advanced client settings rarely changed by integrators. */\nexport type RobotRockAdvancedConfig = {\n /** Task context wire format version sent on every request. @default 2 */\n contextVersion?: TaskContextFormatVersion;\n};\n\ntype RobotRockClientBaseConfig = {\n /** Optional chat correlation headers for audit logging from agent sessions. */\n chatCorrelation?: ChatCorrelation;\n /** Optional override for API key. Falls back to ROBOTROCK_API_KEY when agentService is unset. */\n apiKey?: string;\n /** Hosted-agent service auth (mutually exclusive with apiKey). */\n agentService?: {\n token: string;\n tenantSlug: string;\n connectionId: string;\n actingUserId?: string;\n };\n /**\n * Base URL for the RobotRock API\n * @default \"https://api.robotrock.io/v1\"\n */\n baseUrl?: string;\n /**\n * Default inbox app bucket for every task from this client.\n * When omitted, the API uses your API key name.\n */\n app?: string;\n /**\n * Agent release version (semver, git SHA, deploy tag).\n * Defaults to `AGENT_VERSION` or `ROBOTROCK_AGENT_VERSION` from env when omitted.\n */\n version?: string;\n /** Advanced settings (context wire format, etc.). */\n advanced?: RobotRockAdvancedConfig;\n};\n\n/** Client config with a webhook (mutually exclusive with `polling`). */\nexport type RobotRockWebhookClientConfig = RobotRockClientBaseConfig & {\n webhook: RobotRockWebhookConfig;\n polling?: never;\n};\n\n/** Client config without a webhook; optional `polling` controls the wait loop. */\nexport type RobotRockPollingClientConfig = RobotRockClientBaseConfig & {\n webhook?: never;\n polling?: RobotRockPollingOptions;\n};\n\nexport type RobotRockConfig = RobotRockWebhookClientConfig | RobotRockPollingClientConfig;\n\nexport type SendToHumanActionInput = Omit<TaskContextInput[\"actions\"][number], \"handlers\">;\n\nexport type SendToHumanValidUntil = Date | string;\n\nexport type SendToHumanInput<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = Omit<TaskContextInput, \"app\" | \"actions\" | \"contextVersion\" | \"version\" | \"validUntil\"> & {\n actions: A;\n /** Task deadline; serialized to an ISO 8601 string on the wire. */\n validUntil?: SendToHumanValidUntil;\n /** Optional idempotency key to prevent duplicate tasks */\n idempotencyKey?: string;\n /** Assign to tenant users (email) and/or groups (slug). Narrows inbox visibility. */\n assignTo?: AssignToInput;\n /**\n * Groups related tasks together in the inbox. Omit to let the server generate\n * one (returned as `task.threadId`) and reuse it on later tasks in the thread.\n */\n threadId?: string;\n /**\n * Optional thread priority. When set, applies to the whole thread and\n * overwrites any previous priority. Omit on later tasks to leave unchanged.\n */\n priority?: TaskPriority;\n /**\n * Optional initial status update logged against the task's thread. Shows in\n * the inbox status bar and the thread update log.\n */\n update?: {\n /** A short status update (1-2 sentences). */\n message: string;\n /** Lifecycle status for the icon/color in the status bar. @default \"info\" */\n status?: ThreadUpdateStatus;\n };\n /**\n * Agent release version override. When omitted, uses the client `version`.\n * Used for statistics and feedback analysis.\n */\n version?: string;\n};\n\ntype SendToHumanWithAppInput<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = (SendToHumanInput<A> | Readonly<SendToHumanInput<A>>) & {\n /** Inbox app bucket. Overrides the client `app` when set. */\n app?: string;\n};\n\nexport type SendUpdateInput = {\n /** The thread to log the update against (from `task.threadId`). */\n threadId: string;\n /** A short status update (1-2 sentences). */\n message: string;\n /** Lifecycle status for the icon/color in the status bar. @default \"info\" */\n status?: ThreadUpdateStatus;\n};\n\nexport type SendToHumanResult<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> =\n | {\n mode: \"created\";\n task: TaskResponse[\"task\"];\n }\n | ({\n mode: \"handled\";\n task: TaskResponse[\"task\"];\n } & DiscriminatedApprovalResult<A>);\n\nconst DEFAULT_POLL_INTERVAL_MS = 2_000;\nconst DEFAULT_TIMEOUT_MS = 24 * 60 * 60 * 1_000;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction resolveAgentVersionFromEnv(): string | undefined {\n const fromEnv =\n process.env.AGENT_VERSION?.trim() || process.env.ROBOTROCK_AGENT_VERSION?.trim();\n return fromEnv || undefined;\n}\n\nfunction parseValidUntilMs(value: string | number | Date | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value instanceof Date) {\n const ms = value.getTime();\n return Number.isNaN(ms) ? undefined : ms;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nfunction serializeValidUntil(value: SendToHumanValidUntil): string {\n if (value instanceof Date) {\n const ms = value.getTime();\n if (Number.isNaN(ms)) {\n throw new RobotRockError(\"Invalid validUntil: Date is invalid\", 400);\n }\n return value.toISOString();\n }\n\n if (typeof value === \"string\" && !Number.isNaN(Date.parse(value))) {\n return new Date(value).toISOString();\n }\n\n throw new RobotRockError(\"Invalid validUntil: expected a Date or parseable date string\", 400);\n}\n\nexport { RobotRockError } from \"./http.js\";\n\nexport type ListTasksInput = z.infer<typeof listTasksQuerySchema>;\n\nexport type SearchTasksInput = {\n q: string;\n limit?: number;\n};\n\n/** Task CRUD surface, exposed as `client.tasks`. */\nexport interface TasksApi {\n /** Create a task via POST /v1 without waiting for a human response. */\n create<const A extends readonly SendToHumanActionInput[]>(\n task: SendToHumanWithAppInput<A>\n ): Promise<TaskResponse[\"task\"]>;\n /** Get a task by public task id. */\n get(taskId: string): Promise<Task | null>;\n /** Cancel a task by public task id. */\n cancel(taskId: string): Promise<void>;\n /** Log a status update against a thread. */\n sendUpdate(input: SendUpdateInput): Promise<ThreadUpdate>;\n /** List tasks in the workspace for this API key. */\n list(input?: ListTasksInput): Promise<{\n items: AgentAdminTaskSummary[];\n nextCursor: string | null;\n }>;\n /** Search tasks by type, name, description, or id. */\n search(input: SearchTasksInput): Promise<{\n items: AgentAdminTaskSummary[];\n total: number;\n }>;\n}\n\n/**\n * RobotRock API client for creating and querying human-in-the-loop tasks and\n * chats. CRUD lives under `client.tasks` and `client.chats`; the headline\n * `sendToHuman` verb stays top-level.\n */\nexport class RobotRock {\n private readonly auth: RobotRockAuthConfig;\n private readonly chatCorrelation?: ChatCorrelation;\n private readonly baseUrl: string;\n private readonly app?: string;\n private readonly agentVersion?: string;\n private readonly contextVersion: TaskContextFormatVersion;\n private readonly webhook?: RobotRockWebhookConfig;\n private readonly polling: RobotRockPollingOptions;\n\n /** Task CRUD: `create`, `get`, `cancel`, `sendUpdate`. */\n readonly tasks: TasksApi;\n /** Chat CRUD: `create`, `close`. */\n readonly chats: ChatsApi;\n\n constructor(config: RobotRockConfig) {\n if (config.webhook && config.polling) {\n throw new Error(\n \"RobotRock client cannot configure both webhook and polling. Use webhook for callbacks or polling to block until handled.\"\n );\n }\n\n const apiKey = config.apiKey ?? process.env.ROBOTROCK_API_KEY;\n const agentService = config.agentService;\n if (apiKey && agentService) {\n throw new Error(\n \"RobotRock client cannot configure both apiKey and agentService.\"\n );\n }\n\n this.auth = resolveRobotRockAuthConfig({\n ...(apiKey ? { apiKey } : {}),\n ...(agentService ? { agentService } : {}),\n });\n this.chatCorrelation = config.chatCorrelation;\n this.baseUrl = config.baseUrl ?? getRobotRockApiBaseUrl();\n this.app = config.app;\n this.agentVersion = config.version ?? resolveAgentVersionFromEnv();\n this.contextVersion =\n config.advanced?.contextVersion ?? TASK_CONTEXT_FORMAT_VERSION;\n this.webhook = config.webhook;\n this.polling = config.polling ?? {};\n\n this.tasks = {\n create: (task) => this.createTaskRequest(task),\n get: (taskId) => this.getTaskById(taskId),\n cancel: (taskId) => this.cancelTaskRequest(taskId),\n sendUpdate: (input) => this.sendThreadUpdate(input),\n list: (input) => this.listTasksRequest(input),\n search: (input) => this.searchTasksRequest(input),\n };\n this.chats = createChatsApi({\n baseUrl: this.baseUrl,\n auth: this.auth,\n app: this.app,\n chatCorrelation: this.chatCorrelation,\n });\n }\n\n private authHeaders(extra?: Record<string, string>): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n ...buildRobotRockAuthHeaders(this.auth),\n ...buildChatCorrelationHeaders(this.chatCorrelation),\n ...extra,\n };\n }\n\n private async createTaskRequest<const A extends readonly SendToHumanActionInput[]>(\n task: SendToHumanWithAppInput<A>\n ): Promise<TaskResponse[\"task\"]> {\n const normalizedTask = normalizeSendToHumanInput(task, {\n webhook: this.webhook,\n app: this.app,\n contextVersion: this.contextVersion,\n agentVersion: this.agentVersion,\n });\n const agentVersion = task.version ?? this.agentVersion;\n const bodyPayload = {\n ...normalizedTask,\n ...(task.assignTo !== undefined ? { assignTo: task.assignTo } : {}),\n ...(task.threadId !== undefined ? { threadId: task.threadId } : {}),\n ...(task.priority !== undefined ? { priority: task.priority } : {}),\n ...(task.update !== undefined ? { update: task.update } : {}),\n ...(agentVersion !== undefined ? { agent: { version: agentVersion } } : {}),\n };\n const validation = createTaskBodySchema.safeParse(bodyPayload);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid task: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const headers = this.authHeaders(\n task.idempotencyKey\n ? { \"Idempotency-Key\": task.idempotencyKey }\n : undefined\n );\n\n const response = await fetch(`${this.baseUrl}/`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(validation.data),\n });\n\n const data = await parseResponseBody(response);\n\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to create task\"),\n response.status,\n data\n );\n }\n\n return (data as unknown as TaskResponse).task;\n }\n\n async sendToHuman<const A extends readonly SendToHumanActionInput[]>(\n task: SendToHumanWithAppInput<A>\n ): Promise<SendToHumanResult<A>> {\n const normalizedTask = normalizeSendToHumanInput(task, {\n webhook: this.webhook,\n app: this.app,\n contextVersion: this.contextVersion,\n agentVersion: this.agentVersion,\n });\n const createdTaskTask = await this.createTaskRequest(task);\n const hasHandlers = normalizedTask.actions.some(\n (action) => Array.isArray(action.handlers) && action.handlers.length > 0\n );\n\n if (hasHandlers) {\n return {\n mode: \"created\",\n task: createdTaskTask,\n };\n }\n\n const timeoutMs = this.polling.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const pollIntervalMs = this.polling.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const pollingDeadline = Date.now() + timeoutMs;\n const validUntilMs = parseValidUntilMs(createdTaskTask.validUntil);\n const deadline =\n validUntilMs !== undefined ? Math.min(pollingDeadline, validUntilMs) : pollingDeadline;\n const taskId = createdTaskTask.taskId;\n\n while (Date.now() < deadline) {\n const existing = await this.getTaskById(taskId);\n\n if (existing?.status === \"handled\" && existing.handled) {\n return {\n mode: \"handled\",\n task: createdTaskTask,\n ...(toDiscriminatedApprovalResult(\n normalizedTask.actions as unknown as A,\n existing\n ) as DiscriminatedApprovalResult<A>),\n };\n }\n\n if (existing?.status === \"expired\" || (existing && Date.now() >= existing.validUntil)) {\n throw new TaskExpiredError(\"Task reached validUntil before a human completed it\");\n }\n\n const remainingMs = deadline - Date.now();\n await sleep(Math.min(pollIntervalMs, Math.max(0, remainingMs)));\n }\n\n if (validUntilMs !== undefined && Date.now() >= validUntilMs) {\n throw new TaskExpiredError(\"Task reached validUntil before a human completed it\");\n }\n\n throw new TaskTimeoutError(`No human response within ${timeoutMs}ms`);\n }\n\n /**\n * Create a task via POST /v1 without waiting for a human response.\n * @deprecated Use `client.tasks.create()` instead.\n */\n async createTask<const A extends readonly SendToHumanActionInput[]>(\n task: SendToHumanWithAppInput<A>\n ): Promise<TaskResponse[\"task\"]> {\n return this.tasks.create(task);\n }\n\n /**\n * Get a task by public task id (returned as `task.taskId` from {@link sendToHuman}).\n * @deprecated Use `client.tasks.get()` instead.\n */\n async getTask(taskId: string): Promise<Task | null> {\n return this.tasks.get(taskId);\n }\n\n /**\n * Log a status update against a thread.\n * @deprecated Use `client.tasks.sendUpdate()` instead.\n */\n async sendUpdate(input: SendUpdateInput): Promise<ThreadUpdate> {\n return this.tasks.sendUpdate(input);\n }\n\n /**\n * Cancel a task by public task id.\n * @deprecated Use `client.tasks.cancel()` instead.\n */\n async cancelTask(taskId: string): Promise<void> {\n return this.tasks.cancel(taskId);\n }\n\n private async getTaskById(taskId: string): Promise<Task | null> {\n const response = await fetch(`${this.baseUrl}/tasks/${taskId}`, {\n method: \"GET\",\n headers: this.authHeaders(),\n });\n\n if (response.status === 404) {\n return null;\n }\n\n const data = await parseResponseBody(response);\n\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to get task\"),\n response.status,\n data\n );\n }\n\n return data as unknown as Task;\n }\n\n private async sendThreadUpdate({\n threadId,\n message,\n status,\n }: SendUpdateInput): Promise<ThreadUpdate> {\n if (!threadId) {\n throw new RobotRockError(\"threadId is required to send an update\", 400);\n }\n\n const validation = threadUpdateBodySchema.safeParse({ message, status });\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid update: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(\n `${this.baseUrl}/threads/${encodeURIComponent(threadId)}/updates`,\n {\n method: \"POST\",\n headers: this.authHeaders(),\n body: JSON.stringify(validation.data),\n }\n );\n\n const data = await parseResponseBody(response);\n\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to send update\"),\n response.status,\n data\n );\n }\n\n return (data as unknown as ThreadUpdateResponse).update;\n }\n\n private async cancelTaskRequest(taskId: string): Promise<void> {\n const response = await fetch(`${this.baseUrl}/tasks/${taskId}/cancel`, {\n method: \"POST\",\n headers: this.authHeaders(),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to cancel task\"),\n response.status,\n data\n );\n }\n }\n\n private async listTasksRequest(input?: ListTasksInput): Promise<{\n items: AgentAdminTaskSummary[];\n nextCursor: string | null;\n }> {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(input ?? {})) {\n if (value !== undefined && value !== \"\") {\n params.set(key, String(value));\n }\n }\n const suffix = params.size > 0 ? `?${params.toString()}` : \"\";\n\n const response = await fetch(`${this.baseUrl}/tasks${suffix}`, {\n method: \"GET\",\n headers: this.authHeaders(),\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to list tasks\"),\n response.status,\n data\n );\n }\n\n return data as { items: AgentAdminTaskSummary[]; nextCursor: string | null };\n }\n\n private async searchTasksRequest(input: SearchTasksInput): Promise<{\n items: AgentAdminTaskSummary[];\n total: number;\n }> {\n const params = new URLSearchParams({ q: input.q });\n if (input.limit !== undefined) {\n params.set(\"limit\", String(input.limit));\n }\n\n const response = await fetch(`${this.baseUrl}/tasks/search?${params.toString()}`, {\n method: \"GET\",\n headers: this.authHeaders(),\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to search tasks\"),\n response.status,\n data\n );\n }\n\n return data as { items: AgentAdminTaskSummary[]; total: number };\n }\n}\n\nexport function createClient(config: RobotRockConfig): RobotRock {\n return new RobotRock(config);\n}\n\nexport function attachWebhookToActions(\n actions: readonly SendToHumanActionInput[],\n webhook: RobotRockWebhookConfig\n): TaskContextInput[\"actions\"] {\n return actions.map((action) => ({\n ...action,\n handlers: webhookToHandlers(webhook),\n }));\n}\n\nfunction webhookToHandlers(\n webhook: RobotRockWebhookConfig\n): TaskContextInput[\"actions\"][number][\"handlers\"] {\n return [\n {\n type: \"webhook\" as const,\n url: webhook.url,\n headers: webhook.headers ?? {},\n },\n ];\n}\n\nfunction normalizeSendToHumanInput<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n task: SendToHumanWithAppInput<A>,\n clientDefaults: {\n webhook?: RobotRockWebhookConfig;\n app?: string;\n contextVersion: TaskContextFormatVersion;\n agentVersion?: string;\n }\n): TaskContextInput {\n const {\n actions,\n idempotencyKey: _idempotencyKey,\n assignTo: _assignTo,\n threadId: _threadId,\n priority: _priority,\n update: _update,\n version: _version,\n validUntil,\n app: taskApp,\n ...rest\n } = task;\n\n const webhook = clientDefaults.webhook;\n const normalizedActions: TaskContextInput[\"actions\"] = webhook\n ? attachWebhookToActions(actions, webhook)\n : (actions as unknown as TaskContextInput[\"actions\"]);\n\n const app = taskApp ?? clientDefaults.app;\n\n return {\n ...rest,\n contextVersion: clientDefaults.contextVersion,\n ...(app ? { app } : {}),\n ...(validUntil !== undefined ? { validUntil: serializeValidUntil(validUntil) } : {}),\n actions: normalizedActions,\n };\n}\n\n","import { createClient, type RobotRock, type RobotRockConfig } from \"./client.js\";\nimport { getRobotRockApiBaseUrl } from \"@robotrock/core\";\n\n/**\n * Read RobotRock client config from environment variables.\n *\n * - `ROBOTROCK_API_KEY` (required when not passed explicitly)\n * - `ROBOTROCK_BASE_URL` or `ROBOTROCK_API_URL` (optional)\n * - `ROBOTROCK_APP` (optional inbox app bucket)\n */\nexport function resolveRobotRockConfig(\n overrides?: Partial<RobotRockConfig>\n): RobotRockConfig {\n const agentService = overrides?.agentService;\n const apiKey = overrides?.apiKey ?? process.env.ROBOTROCK_API_KEY;\n\n if (agentService && apiKey) {\n throw new Error(\n \"RobotRock client cannot configure both apiKey and agentService.\"\n );\n }\n\n const baseUrl = overrides?.baseUrl ?? getRobotRockApiBaseUrl();\n const app = overrides?.app ?? process.env.ROBOTROCK_APP;\n\n if (agentService) {\n return app\n ? { agentService, baseUrl, app }\n : { agentService, baseUrl };\n }\n\n if (!apiKey) {\n throw new Error(\n \"RobotRock API key is required. Set ROBOTROCK_API_KEY or pass agentService when creating the client.\"\n );\n }\n\n return app ? { apiKey, baseUrl, app } : { apiKey, baseUrl };\n}\n\n/** Use an explicit client or create one from env / optional config overrides. */\nexport function resolveRobotRockClient(\n client?: RobotRock,\n configOverrides?: Partial<RobotRockConfig>\n): RobotRock {\n if (client) {\n return client;\n }\n return createClient(resolveRobotRockConfig(configOverrides));\n}\n","import {\n context,\n trace,\n SpanStatusCode,\n type Span,\n} from \"@opentelemetry/api\";\nimport type { ApprovalResult, DiscriminatedApprovalResult } from \"./schemas/index.js\";\nimport type { RobotRockHandlerWebhookPayload } from \"./handler-webhook.js\";\n\n/** Minimal span surface used by handle-time OTel recording. */\nexport type OtelSpanLike = Pick<Span, \"spanContext\" | \"setAttribute\" | \"addEvent\" | \"setStatus\" | \"end\">;\n\nconst TRACER_NAME = \"robotrock\";\nconst WAIT_SPAN_NAME = \"robotrock.wait_for_human\";\nconst HANDLED_EVENT_NAME = \"robotrock.task_handled\";\n\nconst INVALID_TRACE_ID = \"00000000000000000000000000000000\";\n\nexport type RobotRockOtelHandle = {\n traceId: string;\n spanId: string;\n taskId: string;\n taskCreatedAt: number;\n threadId?: string;\n};\n\nexport type RobotRockOtelRecordOptions = {\n handle?: RobotRockOtelHandle;\n span?: OtelSpanLike | Span | null;\n includeActionData?: boolean;\n tracerName?: string;\n};\n\nexport type RobotRockHandledOtelInput = {\n taskId: string;\n threadId?: string;\n action: { id: string; title?: string; data: unknown };\n handledBy?: string;\n handledAt: string | number | Date;\n};\n\nfunction isValidTraceId(traceId: string | undefined): traceId is string {\n return (\n typeof traceId === \"string\" &&\n traceId.length > 0 &&\n traceId !== INVALID_TRACE_ID\n );\n}\n\nfunction resolveSpanContext(\n span?: OtelSpanLike | Span | null\n): { traceId: string; spanId: string } | undefined {\n const active = span ?? trace.getActiveSpan();\n const ctx = active?.spanContext();\n if (!ctx || !isValidTraceId(ctx.traceId)) {\n return undefined;\n }\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n\nfunction parseTaskCreatedAt(submittedAt?: string): number {\n if (submittedAt) {\n const parsed = Date.parse(submittedAt);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n return Date.now();\n}\n\nfunction parseHandledAtMs(handledAt: string | number | Date): number {\n if (handledAt instanceof Date) {\n return handledAt.getTime();\n }\n if (typeof handledAt === \"number\") {\n return handledAt;\n }\n const parsed = Date.parse(handledAt);\n return Number.isNaN(parsed) ? Date.now() : parsed;\n}\n\nexport type RobotRockHandledRecordInput =\n | RobotRockHandlerWebhookPayload\n | ApprovalResult\n | DiscriminatedApprovalResult<readonly { id: string; schema?: unknown }[]>;\n\n/** Normalize handled payloads from Trigger, Workflow, or polling. */\nexport function toRobotRockHandledOtelInput(\n handled: RobotRockHandledRecordInput\n): RobotRockHandledOtelInput {\n if (\"actionId\" in handled) {\n return {\n taskId: handled.taskId,\n action: {\n id: handled.actionId,\n data: handled.data,\n },\n handledBy: handled.handledBy,\n handledAt: handled.handledAt,\n };\n }\n\n return {\n taskId: handled.taskId,\n action: {\n id: handled.action.id,\n title: handled.action.title,\n data: handled.action.data,\n },\n handledBy: handled.handledBy,\n handledAt: handled.handledAt,\n };\n}\n\n/**\n * Capture trace + task metadata after RobotRock task create (before human wait).\n * Used by Trigger.dev and Vercel Workflow durable integrations.\n */\nexport function captureRobotRockOtelHandle(\n task: { taskId: string; threadId?: string; submittedAt?: string },\n options?: { span?: OtelSpanLike | Span | null }\n): RobotRockOtelHandle {\n const spanCtx = resolveSpanContext(options?.span);\n return {\n traceId: spanCtx?.traceId ?? \"\",\n spanId: spanCtx?.spanId ?? \"\",\n taskId: task.taskId,\n threadId: task.threadId,\n taskCreatedAt: parseTaskCreatedAt(task.submittedAt),\n };\n}\n\n/**\n * Start a child span for the human-wait phase on the active trace.\n */\nexport function startRobotRockHumanWaitSpan(\n handle: RobotRockOtelHandle,\n options?: { tracerName?: string; span?: OtelSpanLike | Span | null }\n): Span | undefined {\n const parent = (options?.span ?? trace.getActiveSpan()) as Span | undefined;\n if (!parent) {\n return undefined;\n }\n\n const tracer = trace.getTracer(options?.tracerName ?? TRACER_NAME);\n const span = tracer.startSpan(\n WAIT_SPAN_NAME,\n {},\n trace.setSpan(context.active(), parent)\n );\n\n span.setAttribute(\"robotrock.task_id\", handle.taskId);\n if (handle.threadId) {\n span.setAttribute(\"robotrock.thread_id\", handle.threadId);\n }\n\n return span;\n}\n\n/**\n * Record human action attributes and a span event on the active or wait span.\n */\nexport function recordRobotRockHandledToOtel(\n handled: RobotRockHandledRecordInput,\n options: RobotRockOtelRecordOptions = {}\n): void {\n const span = (options.span ?? trace.getActiveSpan()) as Span | undefined;\n if (!span) {\n return;\n }\n\n const input = toRobotRockHandledOtelInput(handled);\n const handledAtMs = parseHandledAtMs(input.handledAt);\n const handle = options.handle;\n const humanWaitMs =\n handle != null ? Math.max(0, handledAtMs - handle.taskCreatedAt) : undefined;\n\n span.setAttribute(\"robotrock.task_id\", input.taskId);\n span.setAttribute(\"robotrock.action.id\", input.action.id);\n if (input.action.title) {\n span.setAttribute(\"robotrock.action.title\", input.action.title);\n }\n if (input.handledBy) {\n span.setAttribute(\"robotrock.handled_by\", input.handledBy);\n }\n span.setAttribute(\"robotrock.handled_at\", new Date(handledAtMs).toISOString());\n if (humanWaitMs != null) {\n span.setAttribute(\"robotrock.human_wait_ms\", humanWaitMs);\n }\n if (input.threadId) {\n span.setAttribute(\"robotrock.thread_id\", input.threadId);\n }\n\n const eventAttributes: Record<string, string | number | boolean> = {\n \"robotrock.task_id\": input.taskId,\n \"robotrock.action.id\": input.action.id,\n };\n if (input.handledBy) {\n eventAttributes[\"robotrock.handled_by\"] = input.handledBy;\n }\n if (humanWaitMs != null) {\n eventAttributes[\"robotrock.human_wait_ms\"] = humanWaitMs;\n }\n\n if (options.includeActionData && input.action.data != null) {\n const serialized = JSON.stringify(input.action.data);\n const truncated =\n serialized.length > 512 ? `${serialized.slice(0, 512)}…` : serialized;\n span.setAttribute(\"robotrock.action.data\", truncated);\n eventAttributes[\"robotrock.action.data\"] = truncated;\n }\n\n span.addEvent(HANDLED_EVENT_NAME, eventAttributes);\n}\n\nexport type EndRobotRockHumanWaitSpanOptions = {\n handle?: RobotRockOtelHandle;\n outcome?: \"handled\" | \"timeout\" | \"error\";\n includeActionData?: boolean;\n};\n\n/**\n * End the human-wait child span, recording handled data or a timeout/error outcome.\n */\nexport function endRobotRockHumanWaitSpan(\n span: Span | undefined,\n handled: RobotRockHandledRecordInput | null,\n options: EndRobotRockHumanWaitSpanOptions = {}\n): void {\n if (!span) {\n return;\n }\n\n const outcome = options.outcome ?? (handled ? \"handled\" : \"timeout\");\n\n if (handled && outcome === \"handled\") {\n recordRobotRockHandledToOtel(handled, {\n span,\n handle: options.handle,\n includeActionData: options.includeActionData,\n });\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setAttribute(\"robotrock.outcome\", outcome);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n outcome === \"timeout\"\n ? \"Human response timed out before validUntil\"\n : \"Human wait failed\",\n });\n }\n\n span.end();\n}\n","import type { Span } from \"@opentelemetry/api\";\nimport {\n captureRobotRockOtelHandle,\n endRobotRockHumanWaitSpan,\n startRobotRockHumanWaitSpan,\n type RobotRockOtelHandle,\n} from \"./record-handled-to-otel.js\";\n\nexport type RobotRockPlatformOtelFields = {\n /**\n * Record human handle result on the active OTel span (Trigger / Workflow).\n * Defaults to `ROBOTROCK_OTEL_RECORD_HANDLED` env (`true` / `1`).\n */\n recordOtel?: boolean;\n /** Include truncated action feedback data on OTel spans (off by default). */\n otelIncludeActionData?: boolean;\n};\n\nexport function shouldRecordRobotRockOtel(recordOtel?: boolean): boolean {\n if (recordOtel === true) {\n return true;\n }\n if (recordOtel === false) {\n return false;\n }\n const env = process.env.ROBOTROCK_OTEL_RECORD_HANDLED;\n return env === \"true\" || env === \"1\";\n}\n\nexport function stripPlatformOtelFields<\n T extends RobotRockPlatformOtelFields & Record<string, unknown>,\n>(payload: T): Omit<T, \"recordOtel\" | \"otelIncludeActionData\"> {\n const { recordOtel: _recordOtel, otelIncludeActionData: _otelIncludeActionData, ...rest } =\n payload;\n return rest;\n}\n\nexport type RobotRockCreatedTask = {\n taskId: string;\n threadId?: string;\n submittedAt?: string;\n};\n\nexport type RobotRockHumanWaitOtelSession = {\n recordOtel: boolean;\n handle?: RobotRockOtelHandle;\n waitSpan?: Span;\n includeActionData?: boolean;\n};\n\nexport function beginRobotRockHumanWaitOtel(\n task: RobotRockCreatedTask,\n options: Pick<RobotRockPlatformOtelFields, \"recordOtel\" | \"otelIncludeActionData\"> = {}\n): RobotRockHumanWaitOtelSession {\n const recordOtel = shouldRecordRobotRockOtel(options.recordOtel);\n if (!recordOtel) {\n return { recordOtel: false };\n }\n\n const handle = captureRobotRockOtelHandle(task);\n const waitSpan = startRobotRockHumanWaitSpan(handle);\n\n return {\n recordOtel: true,\n handle,\n waitSpan,\n includeActionData: options.otelIncludeActionData,\n };\n}\n\nexport function finishRobotRockHumanWaitOtel(\n session: RobotRockHumanWaitOtelSession,\n handled: Parameters<typeof endRobotRockHumanWaitSpan>[1],\n outcome: \"handled\" | \"timeout\" | \"error\"\n): void {\n if (!session.recordOtel) {\n return;\n }\n\n endRobotRockHumanWaitSpan(session.waitSpan, handled, {\n handle: session.handle,\n outcome,\n includeActionData: session.includeActionData,\n });\n}\n","/**\n * JSON body posted when a RobotRock action handler runs (webhook or Trigger wait token).\n */\nexport interface RobotRockHandlerWebhookPayload {\n taskId: string;\n action: {\n id: string;\n title: string;\n data: unknown;\n };\n handledBy?: string;\n handledAt: string;\n handlerType: string;\n}\n\nexport function isRobotRockHandlerWebhookPayload(\n value: unknown\n): value is RobotRockHandlerWebhookPayload {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const v = value as Record<string, unknown>;\n if (typeof v.taskId !== \"string\" || typeof v.handledAt !== \"string\") {\n return false;\n }\n const action = v.action;\n if (typeof action !== \"object\" || action === null) {\n return false;\n }\n const a = action as Record<string, unknown>;\n return typeof a.id === \"string\" && \"data\" in a;\n}\n","/** Default wait when `validUntil` is omitted. */\nexport const DEFAULT_WAIT_DURATION_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport function resolveWaitTiming(validUntilInput?: Date | string): {\n validUntil: Date | string;\n timeout: string;\n} {\n const validUntilMs =\n validUntilInput !== undefined\n ? parseValidUntilMs(validUntilInput)\n : Date.now() + DEFAULT_WAIT_DURATION_MS;\n\n const durationMs = validUntilMs - Date.now();\n if (durationMs <= 0) {\n throw new Error(\"validUntil must be in the future\");\n }\n\n return {\n validUntil: validUntilInput ?? new Date(validUntilMs),\n timeout: durationMsToTimeout(durationMs),\n };\n}\n\nexport function parseValidUntilMs(value: Date | string): number {\n if (value instanceof Date) {\n const ms = value.getTime();\n if (Number.isNaN(ms)) {\n throw new Error(\"Invalid validUntil: Date is invalid\");\n }\n return ms;\n }\n\n const parsed = Date.parse(value);\n if (Number.isNaN(parsed)) {\n throw new Error(\"Invalid validUntil: expected a parseable date string\");\n }\n\n return parsed;\n}\n\n/** Duration string for Trigger.dev `wait.createToken` and Workflow `sleep`. */\nexport function durationMsToTimeout(durationMs: number): string {\n const seconds = Math.ceil(durationMs / 1000);\n if (seconds <= 0) {\n throw new Error(\"validUntil must be in the future\");\n }\n\n if (seconds >= 86_400) {\n return `${Math.ceil(seconds / 86_400)}d`;\n }\n if (seconds >= 3_600) {\n return `${Math.ceil(seconds / 3_600)}h`;\n }\n if (seconds >= 60) {\n return `${Math.ceil(seconds / 60)}m`;\n }\n\n return `${seconds}s`;\n}\n","import type { DiscriminatedApprovalResult } from \"../schemas/index.js\";\nimport { task, wait } from \"@trigger.dev/sdk\";\nimport {\n beginRobotRockHumanWaitOtel,\n finishRobotRockHumanWaitOtel,\n stripPlatformOtelFields,\n type RobotRockPlatformOtelFields,\n} from \"../otel-platform.js\";\nimport {\n createClient,\n type SendToHumanActionInput,\n type SendToHumanInput,\n} from \"../client.js\";\nimport { resolveRobotRockConfig } from \"../env.js\";\nimport { toDiscriminatedApprovalResult } from \"../approval-result.js\";\nimport {\n isRobotRockHandlerWebhookPayload,\n type RobotRockHandlerWebhookPayload,\n} from \"../handler-webhook.js\";\nimport { resolveWaitTiming } from \"../wait-timing.js\";\n\nexport type { RobotRockHandlerWebhookPayload } from \"../handler-webhook.js\";\nexport type { RobotRockPlatformOtelFields } from \"../otel-platform.js\";\n\nexport type SendToHumanPayload<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = SendToHumanInput<A> &\n RobotRockPlatformOtelFields & {\n /** Inbox app bucket. Overrides `ROBOTROCK_APP` when set. */\n app?: string;\n };\n\nexport type ApproveByHumanPayload = Omit<SendToHumanPayload, \"actions\">;\n\ntype Expand<T> = T extends unknown ? { [K in keyof T]: T[K] } : never;\n\nconst APPROVE_BY_HUMAN_ACTIONS = [\n { id: \"approve\", title: \"Approve\" },\n { id: \"decline\", title: \"Decline\" },\n] as const;\n\nasync function runSendToHuman<const A extends readonly SendToHumanActionInput[]>(\n payload: SendToHumanPayload<A>\n): Promise<Expand<DiscriminatedApprovalResult<A>>> {\n const { validUntil: validUntilInput, app, recordOtel, otelIncludeActionData, ...taskFields } =\n payload;\n const { validUntil, timeout } = resolveWaitTiming(validUntilInput);\n\n const token = await wait.createToken({ timeout });\n\n const baseConfig = resolveRobotRockConfig();\n const client = createClient({\n apiKey: baseConfig.apiKey,\n baseUrl: baseConfig.baseUrl,\n ...(baseConfig.app ? { app: baseConfig.app } : {}),\n ...(baseConfig.version ? { version: baseConfig.version } : {}),\n ...(baseConfig.advanced ? { advanced: baseConfig.advanced } : {}),\n webhook: { url: token.url },\n });\n\n const taskInput = stripPlatformOtelFields(taskFields);\n\n const sendResult = await client.sendToHuman({\n ...taskInput,\n validUntil,\n ...(app !== undefined ? { app } : {}),\n });\n\n const otelSession = beginRobotRockHumanWaitOtel(sendResult.task, {\n recordOtel,\n otelIncludeActionData,\n });\n\n let handledPayload: RobotRockHandlerWebhookPayload | null = null;\n let waitOutcome: \"handled\" | \"timeout\" | \"error\" | \"pending\" = \"pending\";\n\n try {\n const outcome = await wait.forToken<RobotRockHandlerWebhookPayload>(token.id);\n\n if (!outcome.ok) {\n waitOutcome = \"timeout\";\n throw new Error(`Human response timed out before validUntil (${timeout})`);\n }\n\n const output = outcome.output;\n if (!isRobotRockHandlerWebhookPayload(output)) {\n waitOutcome = \"error\";\n throw new Error(\n \"Wait token completed with unexpected payload; expected RobotRock handler body (taskId, action.id, action.data).\"\n );\n }\n\n handledPayload = output;\n waitOutcome = \"handled\";\n\n return toDiscriminatedApprovalResult(\n payload.actions,\n {\n id: output.taskId,\n createdAt: new Date(),\n status: \"handled\",\n context: sendResult.task.context,\n validUntil: Date.now(),\n handledAt: new Date(output.handledAt).getTime(),\n handled: {\n action: {\n id: output.action.id,\n data: output.action.data,\n },\n handledBy: output.handledBy,\n },\n }\n ) as unknown as Expand<DiscriminatedApprovalResult<A>>;\n } catch (error) {\n if (waitOutcome === \"pending\") {\n waitOutcome = \"error\";\n }\n throw error;\n } finally {\n if (waitOutcome !== \"pending\") {\n finishRobotRockHumanWaitOtel(\n otelSession,\n handledPayload,\n waitOutcome === \"handled\" ? \"handled\" : waitOutcome\n );\n }\n }\n}\n\n/**\n * Durable human-in-the-loop task for Trigger.dev.\n * Re-export from your `trigger/` directory so Trigger.dev discovers it on deploy.\n */\nexport const sendToHumanTask = task({\n id: \"robotrock/send-to-human\",\n run: async (payload: SendToHumanPayload) => runSendToHuman(payload),\n});\n\n/**\n * Simple approve/decline human gate for Trigger.dev.\n * Re-export from your `trigger/` directory so Trigger.dev discovers it on deploy.\n */\nexport const approveByHumanTask = task({\n id: \"robotrock/approve-by-human\",\n run: async (payload: ApproveByHumanPayload) =>\n runSendToHuman({\n ...payload,\n actions: APPROVE_BY_HUMAN_ACTIONS,\n }),\n});\n\nexport type {\n ApprovalResult,\n DiscriminatedApprovalResult,\n TaskContextInput,\n TaskResult,\n} from \"../schemas/index.js\";\n","import { createWebhook, sleep } from \"workflow\";\nimport type {\n DiscriminatedApprovalResult,\n ThreadUpdate,\n ThreadUpdateStatus,\n} from \"../schemas/index.js\";\nimport {\n createClient,\n type SendToHumanActionInput,\n type SendToHumanInput,\n} from \"../client.js\";\nimport { resolveRobotRockConfig } from \"../env.js\";\nimport { toDiscriminatedApprovalResult } from \"../approval-result.js\";\nimport {\n isRobotRockHandlerWebhookPayload,\n type RobotRockHandlerWebhookPayload,\n} from \"../handler-webhook.js\";\nimport { parseValidUntilMs, resolveWaitTiming } from \"../wait-timing.js\";\nimport {\n beginRobotRockHumanWaitOtel,\n finishRobotRockHumanWaitOtel,\n stripPlatformOtelFields,\n type RobotRockPlatformOtelFields,\n} from \"../otel-platform.js\";\n\nexport type SendToHumanWorkflowPayload<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = SendToHumanInput<A> &\n RobotRockPlatformOtelFields & {\n /** Inbox app bucket. Overrides `ROBOTROCK_APP` when set. */\n app?: string;\n };\n\nexport type ApproveByHumanWorkflowPayload = Omit<SendToHumanWorkflowPayload, \"actions\">;\n\ntype Expand<T> = T extends unknown ? { [K in keyof T]: T[K] } : never;\n\nconst APPROVE_BY_HUMAN_ACTIONS = [\n { id: \"approve\", title: \"Approve\" },\n { id: \"decline\", title: \"Decline\" },\n] as const;\n\ntype CreateTaskStepInput = {\n webhookUrl: string;\n app?: string;\n validUntil: Date | string;\n taskInput: Omit<SendToHumanWorkflowPayload, \"validUntil\" | \"app\" | \"recordOtel\" | \"otelIncludeActionData\">;\n};\n\n/**\n * Creates the RobotRock inbox task with the workflow webhook URL as the handler.\n * Marked as a step so API calls run in full Node.js with retries.\n */\nasync function createRobotRockTaskForWebhook(input: CreateTaskStepInput) {\n \"use step\";\n\n const baseConfig = resolveRobotRockConfig();\n const client = createClient({\n apiKey: baseConfig.apiKey,\n baseUrl: baseConfig.baseUrl,\n ...((input.app ?? baseConfig.app) ? { app: input.app ?? baseConfig.app } : {}),\n ...(baseConfig.version ? { version: baseConfig.version } : {}),\n ...(baseConfig.advanced ? { advanced: baseConfig.advanced } : {}),\n webhook: { url: input.webhookUrl },\n });\n\n return client.sendToHuman({\n ...input.taskInput,\n validUntil: input.validUntil,\n });\n}\n\nasync function parseRobotRockWebhookRequest(request: Request) {\n \"use step\";\n\n const body: unknown = await request.json();\n if (!isRobotRockHandlerWebhookPayload(body)) {\n throw new Error(\n \"Workflow webhook completed with unexpected payload; expected RobotRock handler body (taskId, action.id, action.data).\"\n );\n }\n\n return body;\n}\n\n/**\n * Durable human-in-the-loop wait for Vercel Workflow.\n *\n * Call from a function with `\"use workflow\"` as its first statement. Creates a\n * {@link createWebhook} URL, registers it as the RobotRock task webhook, and\n * suspends until a human handles an action or `validUntil` passes.\n */\nexport async function sendToHumanInWorkflow<\n const A extends readonly SendToHumanActionInput[],\n>(\n payload: SendToHumanWorkflowPayload<A>\n): Promise<Expand<DiscriminatedApprovalResult<A>>> {\n const { validUntil: validUntilInput, app, recordOtel, otelIncludeActionData, ...taskFields } =\n payload;\n const { validUntil, timeout } = resolveWaitTiming(validUntilInput);\n const timeoutMs = parseValidUntilMs(validUntil) - Date.now();\n\n using webhook = createWebhook();\n\n const sendResult = await createRobotRockTaskForWebhook({\n webhookUrl: webhook.url,\n app,\n validUntil,\n taskInput: stripPlatformOtelFields(taskFields),\n });\n\n const otelSession = beginRobotRockHumanWaitOtel(sendResult.task, {\n recordOtel,\n otelIncludeActionData,\n });\n\n let handledPayload: RobotRockHandlerWebhookPayload | null = null;\n let waitOutcome: \"handled\" | \"timeout\" | \"error\" | \"pending\" = \"pending\";\n\n try {\n const outcome = await Promise.race([\n webhook.then((request) => parseRobotRockWebhookRequest(request)),\n sleep(timeoutMs).then(() => ({ timedOut: true }) as const),\n ]);\n\n if (\"timedOut\" in outcome) {\n waitOutcome = \"timeout\";\n throw new Error(`Human response timed out before validUntil (${timeout})`);\n }\n\n handledPayload = outcome;\n waitOutcome = \"handled\";\n\n return toDiscriminatedApprovalResult(payload.actions, {\n id: outcome.taskId,\n createdAt: new Date(),\n status: \"handled\",\n context: sendResult.task.context,\n validUntil: Date.now(),\n handledAt: new Date(outcome.handledAt).getTime(),\n handled: {\n action: {\n id: outcome.action.id,\n data: outcome.action.data,\n },\n handledBy: outcome.handledBy,\n },\n }) as unknown as Expand<DiscriminatedApprovalResult<A>>;\n } catch (error) {\n if (waitOutcome === \"pending\") {\n waitOutcome = \"error\";\n }\n throw error;\n } finally {\n if (waitOutcome !== \"pending\") {\n finishRobotRockHumanWaitOtel(\n otelSession,\n handledPayload,\n waitOutcome === \"handled\" ? \"handled\" : waitOutcome\n );\n }\n }\n}\n\n/**\n * Approve / decline gate for Vercel Workflow (`sendToHumanInWorkflow` with fixed actions).\n */\nexport async function approveByHumanInWorkflow(\n payload: ApproveByHumanWorkflowPayload\n): Promise<Expand<DiscriminatedApprovalResult<typeof APPROVE_BY_HUMAN_ACTIONS>>> {\n return sendToHumanInWorkflow({\n ...payload,\n actions: APPROVE_BY_HUMAN_ACTIONS,\n });\n}\n\nexport type SendUpdateWorkflowPayload = {\n /** Thread to log the update against (from a prior task's `threadId`). */\n threadId: string;\n /** Short status update (1-2 sentences) shown in the inbox status bar. */\n message: string;\n /** Lifecycle status driving the status-bar icon/color. @default \"info\" */\n status?: ThreadUpdateStatus;\n /** Inbox app bucket. Overrides `ROBOTROCK_APP` when set. */\n app?: string;\n};\n\n/**\n * Posts a thread update via `client.sendUpdate()`. Marked as a step so the API\n * call runs in full Node.js with retries and is recorded in the workflow run.\n */\nasync function sendRobotRockUpdate(payload: SendUpdateWorkflowPayload): Promise<ThreadUpdate> {\n \"use step\";\n\n const { app, ...update } = payload;\n const baseConfig = resolveRobotRockConfig();\n const client = createClient({\n apiKey: baseConfig.apiKey,\n baseUrl: baseConfig.baseUrl,\n ...((app ?? baseConfig.app) ? { app: app ?? baseConfig.app } : {}),\n ...(baseConfig.version ? { version: baseConfig.version } : {}),\n ...(baseConfig.advanced ? { advanced: baseConfig.advanced } : {}),\n });\n\n return client.tasks.sendUpdate(update);\n}\n\n/**\n * Durable thread update for Vercel Workflow.\n *\n * Wraps {@link createClient}'s `sendUpdate` in a `\"use step\"` so progress\n * reports are retried and recorded in the run. Fire-and-forget: returns the\n * created update without suspending the workflow (no human wait involved).\n *\n * Call from a function with `\"use workflow\"` as its first statement.\n */\nexport async function sendUpdateInWorkflow(\n payload: SendUpdateWorkflowPayload\n): Promise<ThreadUpdate> {\n return sendRobotRockUpdate(payload);\n}\n\nexport type { RobotRockHandlerWebhookPayload } from \"../handler-webhook.js\";\nexport type { RobotRockPlatformOtelFields } from \"../otel-platform.js\";\nexport type {\n ApprovalResult,\n DiscriminatedApprovalResult,\n TaskContextInput,\n TaskResult,\n ThreadUpdate,\n ThreadUpdateStatus,\n} from \"../schemas/index.js\";\n","import { z } from \"zod\";\nimport type { RobotRock } from \"../client.js\";\nimport {\n approveByHumanForAi,\n normalizeRobotRockAiContext,\n type RobotRockAiContext,\n} from \"./context.js\";\nimport { toHumanToolResult } from \"./human-tool-result.js\";\nimport type { HumanToolResult } from \"./types.js\";\n\nexport const APPROVE_BY_HUMAN_ACTIONS = [\n { id: \"approve\", title: \"Approve\" },\n { id: \"decline\", title: \"Decline\" },\n] as const;\n\nexport const approveByHumanInputSchema = z.object({\n type: z\n .string()\n .optional()\n .describe(\"Task type slug; defaults to ai-approval\"),\n name: z.string().describe(\"Short title for the approval request\"),\n description: z\n .string()\n .describe(\"What needs approval and the consequences of approving or declining\"),\n contextSummary: z\n .string()\n .optional()\n .describe(\"Optional markdown summary shown to the reviewer\"),\n});\n\nexport type ApproveByHumanToolInput = z.infer<typeof approveByHumanInputSchema>;\n\nexport type ApproveByHumanToolOptions = {\n defaultType?: string;\n description?: string;\n toolName?: string;\n};\n\nexport type ApproveByHumanToolDurableOptions = ApproveByHumanToolOptions &\n RobotRockAiContext & { mode: \"trigger\" | \"workflow\" };\n\nexport type ApproveByHumanToolDefinition = {\n description: string;\n inputSchema: typeof approveByHumanInputSchema;\n execute: (input: ApproveByHumanToolInput) => Promise<HumanToolResult>;\n};\n\nfunction resolveApproveByHumanToolConfig(\n clientOrContext: RobotRock | ApproveByHumanToolDurableOptions,\n maybeOptions: ApproveByHumanToolOptions = {}\n): {\n aiContext: RobotRockAiContext;\n options: ApproveByHumanToolOptions;\n} {\n const isDurable =\n typeof clientOrContext === \"object\" &&\n clientOrContext !== null &&\n \"mode\" in clientOrContext &&\n (clientOrContext.mode === \"trigger\" || clientOrContext.mode === \"workflow\");\n\n const aiContext = normalizeRobotRockAiContext(\n isDurable\n ? {\n mode: (clientOrContext as ApproveByHumanToolDurableOptions).mode,\n app: (clientOrContext as ApproveByHumanToolDurableOptions).app,\n }\n : (clientOrContext as RobotRock)\n );\n const options = isDurable\n ? (clientOrContext as ApproveByHumanToolDurableOptions)\n : maybeOptions;\n\n return { aiContext, options };\n}\n\n/**\n * Plain tool definition for Vercel Workflow and DurableAgent (no `tool()` from the AI SDK).\n */\nexport function buildApproveByHumanToolDefinition(\n clientOrContext: RobotRock | ApproveByHumanToolDurableOptions,\n maybeOptions: ApproveByHumanToolOptions = {}\n): ApproveByHumanToolDefinition {\n const { aiContext, options } = resolveApproveByHumanToolConfig(\n clientOrContext,\n maybeOptions\n );\n const description =\n options.description ??\n \"Request explicit human approval before a sensitive or irreversible step. Returns whether the human approved or declined.\";\n\n return {\n description,\n inputSchema: approveByHumanInputSchema,\n execute: async (input: ApproveByHumanToolInput): Promise<HumanToolResult> => {\n const taskContext =\n input.contextSummary !== undefined\n ? {\n data: { summary: input.contextSummary },\n ui: {\n summary: { \"ui:widget\": \"textarea\", \"ui:options\": { rows: 6 } },\n },\n }\n : undefined;\n\n const result = await approveByHumanForAi(aiContext, {\n type: input.type ?? options.defaultType ?? \"ai-approval\",\n name: input.name,\n description: input.description,\n context: taskContext,\n });\n\n return toHumanToolResult(result);\n },\n };\n}\n","import {\n createClient,\n type RobotRock,\n type SendToHumanActionInput,\n type SendToHumanInput,\n type SendUpdateInput,\n} from \"../client.js\";\nimport { resolveRobotRockConfig } from \"../env.js\";\nimport type { DiscriminatedApprovalResult, ThreadUpdate } from \"../schemas/index.js\";\nconst APPROVE_BY_HUMAN_ACTIONS = [\n { id: \"approve\", title: \"Approve\" },\n { id: \"decline\", title: \"Decline\" },\n] as const;\n\n/** How RobotRock waits for a human inside AI SDK tool `execute`. */\nexport type RobotRockAiMode = \"polling\" | \"trigger\" | \"workflow\";\n\n/**\n * Polling: `client.sendToHuman()` blocks until handled (scripts, API routes with long timeout).\n * Trigger: `sendToHumanTask.triggerAndWait()` uses wait tokens (Trigger.dev workers).\n * Workflow: `sendToHumanInWorkflow()` uses workflow webhooks (Vercel Workflow).\n */\nexport type RobotRockAiPollingContext = {\n mode?: \"polling\";\n client: RobotRock;\n};\n\nexport type RobotRockAiTriggerContext = {\n mode: \"trigger\";\n /** Inbox app bucket; falls back to `ROBOTROCK_APP` in the Trigger worker. */\n app?: string;\n};\n\nexport type RobotRockAiWorkflowContext = {\n mode: \"workflow\";\n /** Inbox app bucket; falls back to `ROBOTROCK_APP` in the workflow run. */\n app?: string;\n};\n\nexport type RobotRockAiContext =\n | RobotRockAiPollingContext\n | RobotRockAiTriggerContext\n | RobotRockAiWorkflowContext;\n\n/** Shorthand for `{ mode: \"trigger\", app }`. */\nexport function createRobotRockAiTriggerContext(\n options: Omit<RobotRockAiTriggerContext, \"mode\"> = {}\n): RobotRockAiContext {\n return { mode: \"trigger\", ...options };\n}\n\n/** Shorthand for `{ mode: \"workflow\", app }`. */\nexport function createRobotRockAiWorkflowContext(\n options: Omit<RobotRockAiWorkflowContext, \"mode\"> = {}\n): RobotRockAiContext {\n return { mode: \"workflow\", ...options };\n}\n\nexport function isRobotRockClient(value: unknown): value is RobotRock {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"sendToHuman\" in value &&\n typeof (value as RobotRock).sendToHuman === \"function\"\n );\n}\n\nexport function normalizeRobotRockAiContext(\n clientOrContext: RobotRock | RobotRockAiContext\n): RobotRockAiContext {\n if (isRobotRockClient(clientOrContext)) {\n return { mode: \"polling\", client: clientOrContext };\n }\n\n if (clientOrContext.mode === \"trigger\" || clientOrContext.mode === \"workflow\") {\n return clientOrContext;\n }\n\n if (clientOrContext.mode === \"polling\" || clientOrContext.mode === undefined) {\n if (!(\"client\" in clientOrContext) || !clientOrContext.client) {\n throw new Error('RobotRock AI polling mode requires `client` on the context object.');\n }\n return { mode: \"polling\", client: clientOrContext.client };\n }\n\n throw new Error(`Unknown RobotRock AI mode: ${String((clientOrContext as { mode?: string }).mode)}`);\n}\n\nexport async function sendToHumanForAi<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n context: RobotRockAiContext,\n payload: SendToHumanInput<A>\n): Promise<DiscriminatedApprovalResult<A>> {\n if (context.mode === \"trigger\") {\n const { sendToHumanTask } = await import(\"../trigger/index.js\");\n const waitResult = await sendToHumanTask.triggerAndWait({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n\n if (!waitResult.ok) {\n throw waitResult.error;\n }\n\n return waitResult.output as DiscriminatedApprovalResult<A>;\n }\n\n if (context.mode === \"workflow\") {\n const { sendToHumanInWorkflow } = await import(\"../workflow/index.js\");\n const result = await sendToHumanInWorkflow({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n return result as unknown as DiscriminatedApprovalResult<A>;\n }\n\n const result = await context.client.sendToHuman(payload);\n\n if (result.mode !== \"handled\") {\n throw new Error(\n \"RobotRock task was created but not handled. Configure client polling or webhook, or use mode: 'trigger' / 'workflow' for durable waits.\"\n );\n }\n\n return {\n actionId: result.actionId,\n data: result.data,\n handledBy: result.handledBy,\n handledAt: result.handledAt,\n taskId: result.taskId,\n } as DiscriminatedApprovalResult<A>;\n}\n\n/**\n * Posts a thread update for an AI tool, routing by execution mode.\n *\n * `sendUpdate` is fire-and-forget (no human wait), so only the workflow path\n * needs durability — it runs inside a `\"use step\"`. Trigger and polling modes\n * issue the request directly.\n */\nexport async function sendUpdateForAi(\n context: RobotRockAiContext,\n payload: SendUpdateInput\n): Promise<ThreadUpdate> {\n if (context.mode === \"workflow\") {\n const { sendUpdateInWorkflow } = await import(\"../workflow/index.js\");\n return sendUpdateInWorkflow({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n }\n\n if (context.mode === \"trigger\") {\n const client = createClient(\n resolveRobotRockConfig(context.app ? { app: context.app } : undefined)\n );\n return client.tasks.sendUpdate(payload);\n }\n\n return context.client.tasks.sendUpdate(payload);\n}\n\n/**\n * Close an agent chat from a chat-agent tool. Idempotent server-side, so all\n * modes resolve a client and call `chats.close` directly (no durable step).\n */\nexport async function closeChatForAi(\n context: RobotRockAiContext,\n payload: { chatId: string; reason?: string }\n): Promise<void> {\n if (context.mode === \"trigger\" || context.mode === \"workflow\") {\n const client = createClient(\n resolveRobotRockConfig(context.app ? { app: context.app } : undefined)\n );\n await client.chats.close(payload.chatId, { reason: payload.reason });\n return;\n }\n\n await context.client.chats.close(payload.chatId, { reason: payload.reason });\n}\n\nexport async function approveByHumanForAi(\n context: RobotRockAiContext,\n payload: Omit<SendToHumanInput, \"actions\"> & { app?: string }\n): Promise<DiscriminatedApprovalResult<typeof APPROVE_BY_HUMAN_ACTIONS>> {\n if (context.mode === \"trigger\") {\n const { approveByHumanTask } = await import(\"../trigger/index.js\");\n const waitResult = await approveByHumanTask.triggerAndWait({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n\n if (!waitResult.ok) {\n throw waitResult.error;\n }\n\n return waitResult.output;\n }\n\n if (context.mode === \"workflow\") {\n const { approveByHumanInWorkflow } = await import(\"../workflow/index.js\");\n return await approveByHumanInWorkflow({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n }\n\n const result = await context.client.sendToHuman({\n ...payload,\n actions: APPROVE_BY_HUMAN_ACTIONS,\n });\n\n if (result.mode !== \"handled\") {\n throw new Error(\n \"RobotRock approval was not handled. Configure client polling or use mode: 'trigger' / 'workflow' for durable waits.\"\n );\n }\n\n return {\n actionId: result.actionId,\n data: result.data,\n handledBy: result.handledBy,\n handledAt: result.handledAt,\n taskId: result.taskId,\n } as DiscriminatedApprovalResult<typeof APPROVE_BY_HUMAN_ACTIONS>;\n}\n","import type { DiscriminatedApprovalResult } from \"../schemas/index.js\";\nimport type { HumanToolResult } from \"./types.js\";\n\nconst APPROVE_IDS = new Set([\"approve\", \"approved\"]);\nconst DECLINE_IDS = new Set([\"decline\", \"reject\", \"deny\", \"denied\"]);\n\nexport function toHumanToolResult(\n result: DiscriminatedApprovalResult<readonly { id: string }[]>\n): HumanToolResult {\n const payload: HumanToolResult = {\n taskId: result.taskId,\n actionId: result.actionId,\n data: result.data,\n handledBy: result.handledBy,\n handledAt: result.handledAt.toISOString(),\n };\n\n if (APPROVE_IDS.has(result.actionId)) {\n payload.approved = true;\n } else if (DECLINE_IDS.has(result.actionId)) {\n payload.approved = false;\n }\n\n return payload;\n}\n","import { z } from \"zod\";\nimport { assignToSchema } from \"../schemas/index.js\";\nimport type { RobotRock, SendToHumanActionInput, SendToHumanInput } from \"../client.js\";\nimport type { TaskContextInput } from \"../schemas/index.js\";\nimport {\n normalizeRobotRockAiContext,\n sendToHumanForAi,\n type RobotRockAiContext,\n} from \"./context.js\";\nimport { toHumanToolResult } from \"./human-tool-result.js\";\nimport type { HumanToolResult } from \"./types.js\";\n\nexport const sendToHumanToolInputSchema = z.object({\n type: z.string().describe(\"Task type slug shown in the RobotRock inbox\"),\n name: z.string().describe(\"Short title for the human reviewer\"),\n description: z\n .string()\n .optional()\n .describe(\"What you need from the human and why you cannot proceed alone\"),\n context: z\n .object({\n data: z.record(z.string(), z.unknown()).optional(),\n ui: z.record(z.string(), z.unknown()).optional(),\n })\n .optional()\n .describe(\"Optional structured context for the inbox UI\"),\n validUntil: z\n .string()\n .datetime()\n .optional()\n .describe(\"Optional ISO deadline for the task\"),\n assignTo: assignToSchema\n .optional()\n .describe(\n \"Assign to tenant member emails and/or group slugs; narrows who sees the task in the inbox\"\n ),\n});\n\nexport type SendToHumanToolInput = z.infer<typeof sendToHumanToolInputSchema>;\n\nexport type CreateSendToHumanToolOptions<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = {\n actions: A;\n defaultType?: string;\n description?: string;\n toolName?: string;\n /**\n * Group every task this tool creates onto a shared thread. Pass the same\n * value to {@link createSendUpdateTool} so updates land on the same thread.\n */\n threadId?: string;\n};\n\nexport type CreateSendToHumanToolDurableOptions<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = CreateSendToHumanToolOptions<A> & RobotRockAiContext & { mode: \"trigger\" | \"workflow\" };\n\nexport type SendToHumanToolDefinition = {\n description: string;\n inputSchema: typeof sendToHumanToolInputSchema;\n execute: (input: SendToHumanToolInput) => Promise<HumanToolResult>;\n};\n\nfunction resolveSendToHumanToolConfig<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n clientOrOptions: RobotRock | CreateSendToHumanToolDurableOptions<A>,\n maybeOptions?: CreateSendToHumanToolOptions<A>\n): {\n aiContext: RobotRockAiContext;\n options: CreateSendToHumanToolOptions<A>;\n} {\n const isDurable =\n typeof clientOrOptions === \"object\" &&\n clientOrOptions !== null &&\n \"mode\" in clientOrOptions &&\n (clientOrOptions.mode === \"trigger\" || clientOrOptions.mode === \"workflow\");\n\n const aiContext = normalizeRobotRockAiContext(\n isDurable\n ? {\n mode: (clientOrOptions as CreateSendToHumanToolDurableOptions<A>).mode,\n app: (clientOrOptions as CreateSendToHumanToolDurableOptions<A>).app,\n }\n : (clientOrOptions as RobotRock)\n );\n const options = (isDurable ? clientOrOptions : maybeOptions!) as CreateSendToHumanToolOptions<A>;\n\n return { aiContext, options };\n}\n\n/**\n * Plain tool definition for Vercel Workflow and DurableAgent (no `tool()` from the AI SDK).\n */\nexport function buildSendToHumanToolDefinition<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n clientOrOptions: RobotRock | CreateSendToHumanToolDurableOptions<A>,\n maybeOptions?: CreateSendToHumanToolOptions<A>\n): SendToHumanToolDefinition {\n const { aiContext, options } = resolveSendToHumanToolConfig(clientOrOptions, maybeOptions);\n const description =\n options.description ??\n \"Request structured input or a decision from a human in the RobotRock inbox. Use when you lack required information, need policy approval, or must confirm an irreversible step.\";\n\n return {\n description,\n inputSchema: sendToHumanToolInputSchema,\n execute: async (input: SendToHumanToolInput): Promise<HumanToolResult> => {\n const taskContext: TaskContextInput[\"context\"] | undefined = input.context\n ? ({\n data: input.context.data ?? {},\n ui: input.context.ui,\n } as TaskContextInput[\"context\"])\n : undefined;\n\n const payload: SendToHumanInput<A> = {\n type: input.type ?? options.defaultType ?? \"ai-human-input\",\n name: input.name,\n description: input.description,\n context: taskContext,\n validUntil: input.validUntil,\n assignTo: input.assignTo,\n actions: options.actions,\n ...(options.threadId ? { threadId: options.threadId } : {}),\n };\n\n const result = await sendToHumanForAi(aiContext, payload);\n\n return toHumanToolResult(result);\n },\n };\n}\n","import { z } from \"zod\";\nimport { threadUpdateStatusSchema } from \"../schemas/index.js\";\nimport { RobotRockError, type RobotRock } from \"../client.js\";\nimport type { ThreadUpdate } from \"../schemas/index.js\";\nimport {\n normalizeRobotRockAiContext,\n sendUpdateForAi,\n type RobotRockAiContext,\n} from \"./context.js\";\n\n/**\n * Result returned to the model by {@link createSendUpdateTool}.\n *\n * Updates are fire-and-forget, so a missing thread (no task created yet) is\n * reported as `{ posted: false }` instead of throwing — that way an agent loop\n * is never aborted by a non-critical progress update. Genuine failures (auth,\n * validation, server errors) still throw.\n */\nexport type SendUpdateToolResult =\n | { posted: true; threadId: string; update: ThreadUpdate }\n | {\n posted: false;\n threadId: string;\n reason: \"thread_not_found\";\n message: string;\n };\n\nexport const sendUpdateToolInputSchema = z.object({\n threadId: z\n .string()\n .optional()\n .describe(\n \"Thread to post the update to. Use the `threadId` returned by a prior send-to-human task. Omit only when a session threadId is configured on the tool.\"\n ),\n message: z\n .string()\n .describe(\"Short progress update (1-2 sentences) shown in the inbox status bar\"),\n status: threadUpdateStatusSchema\n .optional()\n .describe(\n \"Lifecycle status driving the status-bar icon/color: info, queued, running, waiting, succeeded, failed, cancelled\"\n ),\n});\n\nexport type SendUpdateToolInput = z.infer<typeof sendUpdateToolInputSchema>;\n\nexport type CreateSendUpdateToolOptions = {\n /**\n * Session thread to post updates to when the model does not supply `threadId`.\n * Pass the same value to {@link createSendToHumanTool} to auto-thread tasks\n * and updates together.\n */\n threadId?: string;\n description?: string;\n};\n\nexport type CreateSendUpdateToolDurableOptions = CreateSendUpdateToolOptions &\n RobotRockAiContext & { mode: \"trigger\" | \"workflow\" };\n\nexport type SendUpdateToolDefinition = {\n description: string;\n inputSchema: typeof sendUpdateToolInputSchema;\n execute: (input: SendUpdateToolInput) => Promise<SendUpdateToolResult>;\n};\n\nfunction resolveSendUpdateToolConfig(\n clientOrOptions: RobotRock | CreateSendUpdateToolDurableOptions,\n maybeOptions: CreateSendUpdateToolOptions = {}\n): {\n aiContext: RobotRockAiContext;\n options: CreateSendUpdateToolOptions;\n} {\n const isDurable =\n typeof clientOrOptions === \"object\" &&\n clientOrOptions !== null &&\n \"mode\" in clientOrOptions &&\n (clientOrOptions.mode === \"trigger\" || clientOrOptions.mode === \"workflow\");\n\n const aiContext = normalizeRobotRockAiContext(\n isDurable\n ? {\n mode: (clientOrOptions as CreateSendUpdateToolDurableOptions).mode,\n app: (clientOrOptions as CreateSendUpdateToolDurableOptions).app,\n }\n : (clientOrOptions as RobotRock)\n );\n const options = isDurable\n ? (clientOrOptions as CreateSendUpdateToolDurableOptions)\n : maybeOptions;\n\n return { aiContext, options };\n}\n\n/**\n * Plain tool definition for Vercel Workflow and DurableAgent (no `tool()` from the AI SDK).\n */\nexport function buildSendUpdateToolDefinition(\n clientOrOptions: RobotRock | CreateSendUpdateToolDurableOptions,\n maybeOptions: CreateSendUpdateToolOptions = {}\n): SendUpdateToolDefinition {\n const { aiContext, options } = resolveSendUpdateToolConfig(clientOrOptions, maybeOptions);\n const description =\n options.description ??\n \"Post a short progress update to the RobotRock thread you are working on. Use to report status changes (running, succeeded, failed) so humans can follow along in the inbox.\";\n\n return {\n description,\n inputSchema: sendUpdateToolInputSchema,\n execute: async (input: SendUpdateToolInput): Promise<SendUpdateToolResult> => {\n const threadId = input.threadId ?? options.threadId;\n if (!threadId) {\n throw new Error(\n \"createSendUpdateTool: no threadId. Pass `threadId` from a prior send-to-human result, or configure a session `threadId` in the tool options.\"\n );\n }\n\n try {\n const update = await sendUpdateForAi(aiContext, {\n threadId,\n message: input.message,\n status: input.status,\n });\n return { posted: true, threadId, update };\n } catch (error) {\n if (error instanceof RobotRockError && error.statusCode === 404) {\n return {\n posted: false,\n threadId,\n reason: \"thread_not_found\",\n message: `No task exists for thread \"${threadId}\" yet, so the update was not posted. Create a task on this thread with send-to-human before reporting progress.`,\n };\n }\n throw error;\n }\n },\n };\n}\n","import { z } from \"zod\";\n\nexport const REQUEST_ACTION_INPUT_TOOL_NAME = \"requestActionInput\" as const;\n\n/** Stable slug when the model omits `action.id` (common LLM mistake). */\nexport function defaultRequestActionInputActionId(title: string): string {\n const slug = title\n .trim()\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\n return slug.length > 0 ? slug : \"submit\";\n}\n\n/** Action shape for tool input — uses records so AI SDK can emit JSON Schema for the model. */\nconst requestActionInputActionSchema = z.object({\n id: z\n .string()\n .min(1)\n .optional()\n .describe(\n \"Stable action identifier echoed in tool output (e.g. pick-blog-topic). Strongly recommended — auto-derived from title when omitted.\"\n ),\n title: z.string().min(1),\n description: z.string().optional(),\n schema: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"JSON Schema object for the human feedback form\"),\n ui: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"RJSF ui schema overrides (ui:widget, ui:enumNames, etc.). Use ui:widget \\\"radio\\\" for 2–6 discrete choices rendered as tappable cards.\"\n ),\n data: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Optional default form field values\"),\n});\n\nexport function normalizeRequestActionInputToolInput(\n input: z.input<typeof requestActionInputToolInputSchema>\n): RequestActionInputToolInput {\n const parsed = requestActionInputToolInputSchema.parse(input);\n return {\n ...parsed,\n action: {\n ...parsed.action,\n id:\n parsed.action.id?.trim() ||\n defaultRequestActionInputActionId(parsed.action.title),\n },\n };\n}\n\nexport const requestActionInputToolOutputSchema = z.object({\n actionId: z.string().min(1),\n data: z.record(z.string(), z.unknown()),\n});\n\nexport type RequestActionInputToolOutput = z.infer<\n typeof requestActionInputToolOutputSchema\n>;\n\nexport const requestActionInputToolInputSchema = z.object({\n prompt: z\n .string()\n .optional()\n .describe(\"Optional heading shown above the action widget in chat\"),\n action: requestActionInputActionSchema.describe(\n \"Action widget config: JSON Schema form fields and optional RJSF ui overrides (same shape as RobotRock inbox actions)\"\n ),\n});\n\nexport type RequestActionInputToolInput = z.infer<\n typeof requestActionInputToolInputSchema\n>;\n\nexport type RequestActionInputToolOptions = {\n description?: string;\n toolName?: string;\n};\n\nexport type RequestActionInputToolDefinition = {\n description: string;\n inputSchema: typeof requestActionInputToolInputSchema;\n outputSchema: typeof requestActionInputToolOutputSchema;\n};\n\nexport function buildRequestActionInputToolDefinition(\n options: RequestActionInputToolOptions = {}\n): RequestActionInputToolDefinition {\n const description =\n options.description ??\n \"Ask the user for structured input via a RobotRock action widget in chat. Always set action.id (e.g. \\\"pick-blog-topic\\\") and action.title. Provide action.schema and optional action.ui using the same JSON Schema and RJSF ui shape as inbox action widgets. Put every field you need in a single call — never invoke this tool more than once per turn. For 2–6 discrete options, use a string enum with ui:widget \\\"radio\\\" and ui:enumNames — never markdown bullet lists. After the tool returns, act on the user's data immediately; do not ask them to confirm choices they already submitted.\";\n\n return {\n description,\n inputSchema: requestActionInputToolInputSchema,\n outputSchema: requestActionInputToolOutputSchema,\n };\n}\n\nexport function isRequestActionInputToolPart(\n part: { type?: string },\n toolName: string = REQUEST_ACTION_INPUT_TOOL_NAME\n): boolean {\n return part.type === `tool-${toolName}`;\n}\n","import { z } from \"zod\";\n\nexport const REPORT_STATUS_TOOL_NAME = \"reportStatus\" as const;\n\nexport const reportStatusPhaseSchema = z.enum([\n \"info\",\n \"running\",\n \"waiting\",\n \"succeeded\",\n \"failed\",\n]);\n\nexport type ReportStatusPhase = z.infer<typeof reportStatusPhaseSchema>;\n\nexport const reportStatusToolInputSchema = z.object({\n message: z\n .string()\n .min(1)\n .describe(\n \"Short progress update shown in chat (1-2 sentences). Use while researching, drafting, or waiting on external work.\"\n ),\n phase: reportStatusPhaseSchema\n .optional()\n .describe(\n \"Lifecycle phase for the status marker. Defaults to running. Use succeeded or failed when a step finishes.\"\n ),\n});\n\nexport const reportStatusToolOutputSchema = z.object({\n message: z.string().min(1),\n phase: reportStatusPhaseSchema,\n});\n\nexport type ReportStatusToolInput = z.infer<typeof reportStatusToolInputSchema>;\nexport type ReportStatusToolOutput = z.infer<typeof reportStatusToolOutputSchema>;\n\nexport type ReportStatusToolOptions = {\n description?: string;\n toolName?: string;\n};\n\nexport type ReportStatusToolDefinition = {\n description: string;\n inputSchema: typeof reportStatusToolInputSchema;\n outputSchema: typeof reportStatusToolOutputSchema;\n execute: (input: ReportStatusToolInput) => Promise<ReportStatusToolOutput>;\n};\n\nexport function normalizeReportStatusToolInput(\n input: z.input<typeof reportStatusToolInputSchema>\n): ReportStatusToolInput {\n const parsed = reportStatusToolInputSchema.parse(input);\n return {\n message: parsed.message.trim(),\n phase: parsed.phase,\n };\n}\n\nexport async function executeReportStatusTool(\n input: ReportStatusToolInput\n): Promise<ReportStatusToolOutput> {\n const normalized = normalizeReportStatusToolInput(input);\n return {\n message: normalized.message,\n phase: normalized.phase ?? \"running\",\n };\n}\n\nexport function buildReportStatusToolDefinition(\n options: ReportStatusToolOptions = {}\n): ReportStatusToolDefinition {\n const description =\n options.description ??\n \"Post a short progress update to the chat UI while you work. Call this before and during long steps (research, drafting, tool runs) so the user sees what is happening. Use phase \\\"running\\\" while in progress, \\\"succeeded\\\" or \\\"failed\\\" when a step completes, and \\\"waiting\\\" when blocked on external input.\";\n\n return {\n description,\n inputSchema: reportStatusToolInputSchema,\n outputSchema: reportStatusToolOutputSchema,\n execute: executeReportStatusTool,\n };\n}\n\nexport function isReportStatusToolPart(\n part: { type?: string },\n toolName: string = REPORT_STATUS_TOOL_NAME\n): boolean {\n return part.type === `tool-${toolName}`;\n}\n","import type { RobotRock, SendToHumanActionInput } from \"../client.js\";\nimport {\n buildApproveByHumanToolDefinition,\n type ApproveByHumanToolDurableOptions,\n type ApproveByHumanToolOptions,\n} from \"./approve-by-human-tool-core.js\";\nimport {\n buildSendToHumanToolDefinition,\n type CreateSendToHumanToolDurableOptions,\n type CreateSendToHumanToolOptions,\n} from \"./create-send-to-human-tool-core.js\";\nimport {\n buildSendUpdateToolDefinition,\n type CreateSendUpdateToolDurableOptions,\n type CreateSendUpdateToolOptions,\n} from \"./create-send-update-tool-core.js\";\nimport {\n buildRequestActionInputToolDefinition,\n type RequestActionInputToolOptions,\n} from \"./request-action-input-tool-core.js\";\nimport {\n buildReportStatusToolDefinition,\n type ReportStatusToolOptions,\n} from \"./report-status-tool-core.js\";\nimport type { RobotRockAiWorkflowContext } from \"./context.js\";\n\n/**\n * Workflow-safe approve/decline tool for `generateText`, `DurableAgent`, and similar.\n * Returns a plain `{ description, inputSchema, execute }` object — no AI SDK `tool()` helper.\n */\nexport function approveByHumanTool(\n clientOrContext: RobotRock | ApproveByHumanToolDurableOptions,\n maybeOptions: ApproveByHumanToolOptions = {}\n) {\n return buildApproveByHumanToolDefinition(clientOrContext, maybeOptions);\n}\n\n/**\n * Workflow-safe send-to-human tool. See {@link approveByHumanTool} for usage notes.\n */\nexport function createSendToHumanTool<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n clientOrOptions: RobotRock | CreateSendToHumanToolDurableOptions<A>,\n maybeOptions?: CreateSendToHumanToolOptions<A>\n) {\n return buildSendToHumanToolDefinition(clientOrOptions, maybeOptions);\n}\n\n/**\n * Workflow-safe send-update tool. See {@link approveByHumanTool} for usage notes.\n */\nexport function createSendUpdateTool(\n clientOrOptions: RobotRock | CreateSendUpdateToolDurableOptions,\n maybeOptions: CreateSendUpdateToolOptions = {}\n) {\n return buildSendUpdateToolDefinition(clientOrOptions, maybeOptions);\n}\n\n/**\n * Client-side action widget tool for chat UIs. No `execute` — the UI submits via `addToolOutput`.\n */\nexport function requestActionInputTool(options: RequestActionInputToolOptions = {}) {\n return buildRequestActionInputToolDefinition(options);\n}\n\n/**\n * Chat progress tool for workflow agents. Executes immediately and renders in chat UI.\n */\nexport function reportStatusTool(options: ReportStatusToolOptions = {}) {\n return buildReportStatusToolDefinition(options);\n}\n\nexport type CreateRobotRockAiWorkflowToolsOptions = {\n app?: string;\n threadId?: string;\n};\n\nexport function createRobotRockAiTools(options: CreateRobotRockAiWorkflowToolsOptions = {}) {\n const context: RobotRockAiWorkflowContext = { mode: \"workflow\", app: options.app };\n\n return {\n context,\n approveByHuman: (toolOptions?: ApproveByHumanToolOptions) =>\n buildApproveByHumanToolDefinition({ ...context, ...toolOptions }),\n sendToHuman: <A extends readonly SendToHumanActionInput[]>(\n toolOptions: CreateSendToHumanToolOptions<A>\n ) =>\n buildSendToHumanToolDefinition({\n ...context,\n ...(options.threadId ? { threadId: options.threadId } : {}),\n ...toolOptions,\n }),\n sendUpdate: (toolOptions: CreateSendUpdateToolOptions = {}) =>\n buildSendUpdateToolDefinition({\n ...context,\n ...(options.threadId ? { threadId: options.threadId } : {}),\n ...toolOptions,\n }),\n requestActionInput: (toolOptions: RequestActionInputToolOptions = {}) =>\n buildRequestActionInputToolDefinition(toolOptions),\n reportStatus: (toolOptions: ReportStatusToolOptions = {}) =>\n buildReportStatusToolDefinition(toolOptions),\n };\n}\n","import type { SendToHumanInput } from \"../client.js\";\nimport type { FormatToolApprovalTaskOptions, RobotRockToolCallInfo } from \"./types.js\";\n\nconst DEFAULT_APPROVE_ACTIONS = [\n { id: \"approve\", title: \"Approve execution\" },\n { id: \"deny\", title: \"Deny\" },\n] as const;\n\n/**\n * Build a RobotRock task payload for an AI SDK tool approval request.\n */\nexport function defaultFormatToolApprovalTask(\n toolCall: RobotRockToolCallInfo,\n options: FormatToolApprovalTaskOptions = {}\n): SendToHumanInput {\n const approveId = options.approveActionId ?? \"approve\";\n const denyId = options.denyActionId ?? \"deny\";\n\n return {\n type: options.type ?? \"ai-tool-approval\",\n name: `Approve: ${toolCall.toolName}`,\n description: `Review the proposed \\`${toolCall.toolName}\\` tool call before it runs.`,\n context: {\n data: {\n toolName: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n input: toolCall.input,\n },\n ui: {\n toolName: { \"ui:widget\": \"text\" },\n toolCallId: { \"ui:widget\": \"text\" },\n input: { \"ui:widget\": \"textarea\" },\n },\n },\n actions: [\n { id: approveId, title: \"Approve execution\" },\n { id: denyId, title: \"Deny\" },\n ],\n };\n}\n\nexport { DEFAULT_APPROVE_ACTIONS };\n","import type { ToolApprovalResponse } from \"ai\";\nimport type { RobotRock } from \"../client.js\";\nimport {\n normalizeRobotRockAiContext,\n sendToHumanForAi,\n type RobotRockAiContext,\n} from \"./context.js\";\nimport { defaultFormatToolApprovalTask } from \"./format-tool-approval-task.js\";\nimport type {\n ResolveToolApprovalsOptions,\n RobotRockToolApprovalConfig,\n RobotRockToolCallInfo,\n RunWithRobotRockApprovalsOptions,\n ToolApprovalRequestPart,\n} from \"./types.js\";\n\nexport type RobotRockToolApprovalDecision = \"user-approval\" | undefined;\n\nfunction buildToolMatcher(config: RobotRockToolApprovalConfig) {\n const names = config.tools ? new Set(config.tools) : null;\n\n return (toolCall: RobotRockToolCallInfo): boolean => {\n if (config.when?.(toolCall)) {\n return true;\n }\n if (names && names.has(toolCall.toolName)) {\n return true;\n }\n return false;\n };\n}\n\n/**\n * AI SDK 7+: pass the return value to `toolApproval` on `generateText`, `streamText`, or `ToolLoopAgent`.\n * Returns `'user-approval'` for configured tools so execution pauses until a human responds via RobotRock.\n */\nexport function createRobotRockToolApproval(config: RobotRockToolApprovalConfig) {\n const matches = buildToolMatcher(config);\n\n const toolApproval = async (options: {\n toolCall: RobotRockToolCallInfo;\n }): Promise<RobotRockToolApprovalDecision> => {\n return matches(options.toolCall) ? \"user-approval\" : undefined;\n };\n\n return toolApproval;\n}\n\n/**\n * AI SDK 5–6: use as `needsApproval` on tool definitions (or via {@link applyRobotRockToolApprovalToTools}).\n */\nexport function createRobotRockNeedsApproval(config: RobotRockToolApprovalConfig) {\n const matches = buildToolMatcher(config);\n\n return async (\n _input: unknown,\n options: { toolCallId: string; messages?: unknown[] }\n ): Promise<boolean> => {\n const toolCall = findToolCallInMessages(options.messages, options.toolCallId);\n if (!toolCall) {\n return false;\n }\n return matches(toolCall);\n };\n}\n\n/**\n * AI SDK 5–6: merge `needsApproval` into each matching tool in a tools object.\n */\nexport function applyRobotRockToolApprovalToTools<T extends Record<string, object>>(\n tools: T,\n config: RobotRockToolApprovalConfig\n): T {\n const names = config.tools ? new Set(config.tools) : null;\n const needsApproval = createRobotRockNeedsApproval(config);\n\n const next = { ...tools } as T;\n\n for (const key of Object.keys(tools) as Array<keyof T>) {\n const name = String(key);\n const shouldApply =\n (names && names.has(name)) || (names === null && config.when !== undefined);\n\n if (!shouldApply) {\n continue;\n }\n\n const existing = tools[key];\n next[key] = {\n ...existing,\n needsApproval,\n } as T[keyof T];\n }\n\n return next;\n}\n\nfunction findToolCallInMessages(\n messages: unknown[] | undefined,\n toolCallId: string\n): RobotRockToolCallInfo | undefined {\n if (!messages) {\n return undefined;\n }\n\n for (const message of messages) {\n if (typeof message !== \"object\" || message === null) {\n continue;\n }\n const role = (message as { role?: string }).role;\n if (role !== \"assistant\") {\n continue;\n }\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (const part of content) {\n if (typeof part !== \"object\" || part === null) {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === \"tool-call\" && p.toolCallId === toolCallId) {\n return {\n toolName: String(p.toolName ?? \"\"),\n toolCallId,\n input: p.input,\n };\n }\n }\n }\n\n return undefined;\n}\n\nfunction collectApprovalRequests(source: unknown): ToolApprovalRequestPart[] {\n const requests: ToolApprovalRequestPart[] = [];\n\n const visit = (value: unknown) => {\n if (!value) {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n visit(item);\n }\n return;\n }\n\n if (typeof value !== \"object\") {\n return;\n }\n\n const obj = value as Record<string, unknown>;\n\n if (obj.type === \"tool-approval-request\" && typeof obj.approvalId === \"string\") {\n if (obj.isAutomatic === true) {\n return;\n }\n\n const embedded = obj.toolCall as Record<string, unknown> | undefined;\n const toolCallId =\n typeof obj.toolCallId === \"string\"\n ? obj.toolCallId\n : typeof embedded?.toolCallId === \"string\"\n ? embedded.toolCallId\n : undefined;\n\n let toolCall: RobotRockToolCallInfo | undefined;\n if (embedded && typeof embedded.toolName === \"string\") {\n toolCall = {\n toolName: embedded.toolName,\n toolCallId: String(embedded.toolCallId ?? toolCallId ?? \"\"),\n input: embedded.input,\n };\n } else if (toolCallId) {\n toolCall = findToolCallInMessages(\n (source as { messages?: unknown[] }).messages,\n toolCallId\n );\n }\n\n requests.push({\n type: \"tool-approval-request\",\n approvalId: obj.approvalId,\n toolCallId,\n toolCall,\n isAutomatic: obj.isAutomatic === true,\n });\n return;\n }\n\n if (Array.isArray(obj.content)) {\n visit(obj.content);\n }\n if (Array.isArray(obj.steps)) {\n visit(obj.steps);\n }\n if (obj.response && typeof obj.response === \"object\") {\n visit((obj.response as { messages?: unknown[] }).messages);\n }\n };\n\n visit(source);\n\n if (typeof source === \"object\" && source !== null && Array.isArray((source as { content?: unknown[] }).content)) {\n visit((source as { content: unknown[] }).content);\n }\n\n const seen = new Set<string>();\n return requests.filter((r) => {\n if (seen.has(r.approvalId)) {\n return false;\n }\n seen.add(r.approvalId);\n return true;\n });\n}\n\nfunction resolveToolCallForRequest(\n request: ToolApprovalRequestPart,\n source: unknown,\n messages: unknown[]\n): RobotRockToolCallInfo {\n if (request.toolCall) {\n return request.toolCall;\n }\n\n const toolCallId = request.toolCallId;\n if (toolCallId) {\n const fromMessages = findToolCallInMessages(messages, toolCallId);\n if (fromMessages) {\n return fromMessages;\n }\n }\n\n if (typeof source === \"object\" && source !== null && Array.isArray((source as { toolCalls?: unknown[] }).toolCalls)) {\n for (const call of (source as { toolCalls: Array<Record<string, unknown>> }).toolCalls) {\n if (call.toolCallId === toolCallId) {\n return {\n toolName: String(call.toolName ?? \"\"),\n toolCallId: String(call.toolCallId ?? \"\"),\n input: call.input,\n };\n }\n }\n }\n\n throw new Error(\n `Could not resolve tool call for approval ${request.approvalId}. Pass messages that include the assistant tool-call.`\n );\n}\n\n/**\n * Create RobotRock tasks for pending AI SDK tool approvals and return `tool-approval-response` parts.\n */\nexport async function resolveToolApprovalsViaRobotRock(\n clientOrContext: RobotRock | RobotRockAiContext,\n source: unknown,\n options: ResolveToolApprovalsOptions = {}\n): Promise<{\n responses: ToolApprovalResponse[];\n messages: unknown[];\n}> {\n const context = normalizeRobotRockAiContext(clientOrContext);\n const approveId = options.approveActionId ?? \"approve\";\n const denyId = options.denyActionId ?? \"deny\";\n const formatTask = options.formatTask ?? defaultFormatToolApprovalTask;\n\n const baseMessages =\n typeof source === \"object\" && source !== null && Array.isArray((source as { messages?: unknown[] }).messages)\n ? [...(source as { messages: unknown[] }).messages]\n : [];\n\n const requests = collectApprovalRequests(source);\n const responses: ToolApprovalResponse[] = [];\n\n for (const request of requests) {\n const toolCall = resolveToolCallForRequest(request, source, baseMessages);\n const taskInput = formatTask(toolCall, {\n approveActionId: approveId,\n denyActionId: denyId,\n });\n\n const result = await sendToHumanForAi(context, taskInput);\n\n const approved = result.actionId === approveId;\n const reason =\n typeof result.data === \"object\" &&\n result.data !== null &&\n \"reason\" in result.data &&\n typeof (result.data as { reason?: unknown }).reason === \"string\"\n ? (result.data as { reason: string }).reason\n : approved\n ? \"Approved in RobotRock inbox\"\n : \"Denied in RobotRock inbox\";\n\n responses.push({\n type: \"tool-approval-response\",\n approvalId: request.approvalId,\n approved,\n reason,\n });\n }\n\n const messages = [...baseMessages];\n if (responses.length > 0) {\n messages.push({ role: \"tool\", content: responses });\n }\n\n return { responses, messages };\n}\n\n/**\n * Run `generate` in a loop until manual tool approvals are resolved via RobotRock or `maxRounds` is reached.\n */\nexport async function runWithRobotRockApprovals<T>(\n options: RunWithRobotRockApprovalsOptions<T>\n): Promise<T> {\n const clientOrContext =\n options.context ??\n (options.client\n ? options.client\n : (() => {\n throw new Error(\"runWithRobotRockApprovals requires `client` or `context`.\");\n })());\n\n const maxRounds = options.maxRounds ?? 20;\n let messages = options.messages ? [...options.messages] : [];\n let lastResult: T | undefined;\n\n for (let round = 0; round < maxRounds; round++) {\n lastResult = await options.generate(messages);\n const { responses, messages: nextMessages } = await resolveToolApprovalsViaRobotRock(\n clientOrContext,\n { ...(lastResult as object), messages },\n options.resolveOptions\n );\n\n if (responses.length === 0) {\n return lastResult;\n }\n\n messages = nextMessages;\n }\n\n throw new Error(`RobotRock approval loop exceeded maxRounds (${maxRounds})`);\n}\n\nexport { collectApprovalRequests };\n"],"mappings":"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","names":["context","z","z","z","normalizeTaskContextVersion","TASK_CONTEXT_FORMAT_VERSION","refineContextPublicUrls","handlerUrlSchema","jsonSchema7Schema","uiSchemaSchema","webhookHandlerSchema","triggerHandlerSchema","handlerSchema","taskActionInputSchema","taskActionSchema","uiFieldSchemaSchema","contextUiSchema","contextDataSchema","taskContextObjectBaseSchema","taskContextObjectSchema","taskContextSchema","assignToSchema","threadUpdateMessageSchema","threadUpdateStatuses","threadUpdateStatusSchema","threadUpdateInputSchema","taskPriorities","taskPrioritySchema","agentTelemetrySchema","createTaskBodySchema","init_schemas","init_task","init_task","z","task","headers","task","init_schemas","TASK_CONTEXT_FORMAT_VERSION","createTaskBodySchema","task","task","parseValidUntilMs","sleep","parseValidUntilMs","APPROVE_BY_HUMAN_ACTIONS","z","APPROVE_BY_HUMAN_ACTIONS","context","sendToHumanTask","sendToHumanInWorkflow","result","sendUpdateInWorkflow","context","approveByHumanTask","approveByHumanInWorkflow","APPROVE_BY_HUMAN_ACTIONS","z","init_schemas","z","z","assignToSchema","init_schemas","z","z","threadUpdateStatusSchema","z","z","z","z","z","context","context"]}
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../core/src/utils/cn.ts","../../../core/src/utils/convex-sanitize.ts","../../../core/src/utils/decode-html-entities.ts","../../../core/src/utils/deployment-secret-encryption.ts","../../../core/src/utils/safe-url.ts","../../../core/src/utils/task-app.ts","../../../core/src/utils/index.ts","../../../core/src/schemas/context-urls.ts","../../../core/src/schemas/task.ts","../../../core/src/schemas/json-schema.ts","../../../core/src/schemas/tool-result-display.ts","../../../core/src/schemas/agent-admin.ts","../../../core/src/schemas/index.ts","../../src/schemas/index.ts","../../../core/src/types/task.ts","../../../core/src/types/json-schema-infer.ts","../../../core/src/types/index.ts","../../../core/src/plans/index.ts","../../../core/src/handler-retry.ts","../../../core/src/legal.ts","../../../core/src/welcome-task.ts","../../../core/src/app-url.ts","../../../core/src/attribution/index.ts","../../../core/src/agent-service-auth.ts","../../../core/src/index.ts","../../src/approval-result.ts","../../src/http.ts","../../src/auth-headers.ts","../../src/chat-correlation.ts","../../src/chats.ts","../../src/client.ts","../../src/env.ts","../../src/record-handled-to-otel.ts","../../src/otel-platform.ts","../../src/handler-webhook.ts","../../src/wait-timing.ts","../../src/trigger/index.ts","../../src/workflow/index.ts","../../src/ai/approve-by-human-tool-core.ts","../../src/ai/context.ts","../../src/ai/human-tool-result.ts","../../src/ai/create-send-to-human-tool-core.ts","../../src/ai/create-send-update-tool-core.ts","../../src/ai/request-action-input-tool-core.ts","../../src/ai/report-status-tool-core.ts","../../src/ai/workflow-tools.ts","../../src/ai/format-tool-approval-task.ts","../../src/ai/tool-approval-bridge.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function for merging Tailwind CSS classes\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n","/**\n * Utilities for sanitizing objects before storing in Convex.\n *\n * Convex restricts object field names:\n * - Reserved prefixes: `$` (system) and `_` (system).\n * - Field names may only contain non-control ASCII characters (0x20–0x7E).\n *\n * User-supplied task context can contain arbitrary keys that violate these\n * rules — e.g. JSON Schema keys like `$ref`/`$id`, or human language keys with\n * accented/non-ASCII characters like `ideeën`. Convex rejects these both when\n * inserting (`ctx.db.insert`) and, crucially, when *serializing* mutation\n * arguments on the client (`ConvexHttpClient.mutation` / `ctx.runMutation`),\n * which happens before the mutation handler runs.\n *\n * These utilities transform offending keys to a reversible, Convex-safe form\n * when storing, and reverse the transformation when reading:\n * - `$`-prefixed keys -> `__dollar_`-prefixed keys.\n * - keys containing non-ASCII / control characters -> `__uesc_` + percent\n * encoding of the (already dollar-transformed) key.\n *\n * The transforms are idempotent: re-running `sanitizeForConvex` on an already\n * sanitized object is a no-op, so it is safe to sanitize at multiple boundaries\n * (e.g. once in the API before `client.mutation`, and again on the Convex\n * server before `ctx.db.insert`).\n *\n * Important: apply `sanitizeForConvex` **before** any Convex boundary that\n * serializes values — including `ctx.runMutation(...)` / `client.mutation(...)`\n * arguments, not only `ctx.db.insert`, because args are validated before your\n * mutation handler runs.\n *\n * NOTE: This is the single source of truth. `apps/app/convex/lib/sanitize.ts`\n * re-exports from here so Convex functions, the dashboard client, and the REST\n * API all share identical encoding.\n */\n\nconst DOLLAR_PREFIX = \"__dollar_\";\nconst ESCAPE_PREFIX = \"__uesc_\";\n\n/** Avoid stack overflow on pathological deep JSON (e.g. nested schema trees). */\nconst MAX_SANITIZE_DEPTH = 256;\n\nfunction isPlainObject(obj: unknown): obj is Record<string, unknown> {\n if (obj === null || typeof obj !== \"object\" || Array.isArray(obj)) {\n return false;\n }\n const proto = Object.getPrototypeOf(obj);\n return proto === Object.prototype || proto === null;\n}\n\n/** True when a key contains characters Convex disallows in field names. */\nfunction keyHasInvalidChars(key: string): boolean {\n for (let i = 0; i < key.length; i++) {\n const code = key.charCodeAt(i);\n // Allow printable ASCII only (space through tilde). Anything outside this\n // range (control chars, accented/non-ASCII, DEL, etc.) must be escaped.\n if (code < 0x20 || code > 0x7e) {\n return true;\n }\n }\n return false;\n}\n\n/** Transform a single key into a Convex-safe form. Idempotent. */\nfunction encodeKey(key: string): string {\n let next = key;\n if (next.startsWith(\"$\")) {\n next = DOLLAR_PREFIX + next.slice(1);\n }\n if (keyHasInvalidChars(next)) {\n next = ESCAPE_PREFIX + encodeURIComponent(next);\n }\n return next;\n}\n\n/** Reverse `encodeKey`. */\nfunction decodeKey(key: string): string {\n let next = key;\n if (next.startsWith(ESCAPE_PREFIX)) {\n try {\n next = decodeURIComponent(next.slice(ESCAPE_PREFIX.length));\n } catch {\n // Malformed percent-encoding: not something we produced, leave untouched.\n return key;\n }\n }\n if (next.startsWith(DOLLAR_PREFIX)) {\n next = \"$\" + next.slice(DOLLAR_PREFIX.length);\n }\n return next;\n}\n\n/**\n * Recursively transforms all object keys into a Convex-safe form.\n * Call this before storing data in Convex (and before serializing mutation args).\n */\nexport function sanitizeForConvex<T>(obj: T, depth = 0): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (depth > MAX_SANITIZE_DEPTH) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => sanitizeForConvex(item, depth + 1)) as T;\n }\n\n if (isPlainObject(obj)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[encodeKey(key)] = sanitizeForConvex(value, depth + 1);\n }\n return result as T;\n }\n\n return obj;\n}\n\n/**\n * Recursively reverses `sanitizeForConvex`.\n * Call this after reading data from Convex.\n */\nexport function desanitizeFromConvex<T>(obj: T, depth = 0): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (depth > MAX_SANITIZE_DEPTH) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => desanitizeFromConvex(item, depth + 1)) as T;\n }\n\n if (isPlainObject(obj)) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[decodeKey(key)] = desanitizeFromConvex(value, depth + 1);\n }\n return result as T;\n }\n\n return obj;\n}\n\n/**\n * Normalize values for Convex public function **return** encoding (HTTP / wire JSON).\n * Nested `bigint` (e.g. Int64 from stored payloads), non-finite numbers, or reference\n * cycles can otherwise fail encoding and surface to clients as a generic \"Server Error\".\n */\nexport function toWireReturnSafe<T>(\n value: T,\n depth = 0,\n seen = new WeakSet<object>()\n): T {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (depth > MAX_SANITIZE_DEPTH) {\n return value;\n }\n\n if (typeof value === \"bigint\") {\n return value.toString() as T;\n }\n\n if (typeof value === \"number\") {\n if (Number.isFinite(value)) {\n return value;\n }\n return null as T;\n }\n\n if (typeof value !== \"object\") {\n return value;\n }\n\n if (seen.has(value as object)) {\n return null as T;\n }\n\n if (Array.isArray(value)) {\n seen.add(value);\n try {\n return value.map((item) =>\n toWireReturnSafe(item, depth + 1, seen)\n ) as T;\n } finally {\n seen.delete(value);\n }\n }\n\n if (value instanceof Date) {\n return value.toISOString() as T;\n }\n\n if (isPlainObject(value)) {\n seen.add(value);\n try {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[k] = toWireReturnSafe(v, depth + 1, seen);\n }\n return out as T;\n } finally {\n seen.delete(value);\n }\n }\n\n try {\n return String(value) as T;\n } catch {\n return null as T;\n }\n}\n","/** Decode common HTML entities for UI display (inverse of email/HTML escaping). */\nexport function decodeHtmlEntities(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/'/g, \"'\")\n .replace(/&#(\\d+);/g, (_, code) => String.fromCharCode(Number(code)))\n .replace(/&#x([0-9a-f]+);/gi, (_, code) =>\n String.fromCharCode(parseInt(code, 16))\n );\n}\n","const ENCRYPTION_SALT = \"robotrock-deployment-service-token-v1\";\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nasync function deriveKey(pepper: string): Promise<CryptoKey> {\n const encoder = new TextEncoder();\n const keyMaterial = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(pepper),\n \"PBKDF2\",\n false,\n [\"deriveKey\"]\n );\n return crypto.subtle.deriveKey(\n {\n name: \"PBKDF2\",\n salt: encoder.encode(ENCRYPTION_SALT),\n iterations: 100_000,\n hash: \"SHA-256\",\n },\n keyMaterial,\n { name: \"AES-GCM\", length: 256 },\n false,\n [\"encrypt\", \"decrypt\"]\n );\n}\n\n/** Encrypt a deployment service token for server-side reachability probes. */\nexport async function encryptDeploymentSecret(\n plaintext: string,\n pepper: string\n): Promise<string> {\n const key = await deriveKey(pepper);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const ciphertext = await crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv },\n key,\n new TextEncoder().encode(plaintext)\n );\n const combined = new Uint8Array(iv.length + ciphertext.byteLength);\n combined.set(iv, 0);\n combined.set(new Uint8Array(ciphertext), iv.length);\n return bytesToBase64(combined);\n}\n\n/** Decrypt a deployment service token stored by Convex. */\nexport async function decryptDeploymentSecret(\n ciphertextBase64: string,\n pepper: string\n): Promise<string> {\n const combined = base64ToBytes(ciphertextBase64);\n if (combined.length < 13) {\n throw new Error(\"Invalid encrypted deployment secret.\");\n }\n const iv = combined.slice(0, 12);\n const ciphertext = combined.slice(12);\n const key = await deriveKey(pepper);\n const plaintext = await crypto.subtle.decrypt(\n { name: \"AES-GCM\", iv },\n key,\n ciphertext\n );\n return new TextDecoder().decode(plaintext);\n}\n","const BLOCKED_HOSTNAMES = new Set([\n \"localhost\",\n \"metadata.google.internal\",\n \"metadata.goog\",\n]);\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n}\n\nfunction isBlockedIpv4(host: string): boolean {\n const match = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(host);\n if (!match) {\n return false;\n }\n\n const octets = match.slice(1, 5).map((part) => Number(part));\n if (octets.some((octet) => Number.isNaN(octet) || octet < 0 || octet > 255)) {\n return true;\n }\n\n const [a, b, _c, _d] = octets;\n if (a === undefined || b === undefined) {\n return true;\n }\n if (a === 127 || a === 0) return true;\n if (a === 10) return true;\n if (a === 169 && b === 254) return true;\n if (a === 192 && b === 168) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 100 && b >= 64 && b <= 127) return true;\n\n return false;\n}\n\nfunction ipv4FromNumericHost(host: string): string | null {\n if (/^\\d+$/.test(host)) {\n const num = Number(host);\n if (!Number.isFinite(num) || num < 0 || num > 0xffffffff) {\n return null;\n }\n const a = (num >>> 24) & 0xff;\n const b = (num >>> 16) & 0xff;\n const c = (num >>> 8) & 0xff;\n const d = num & 0xff;\n return `${a}.${b}.${c}.${d}`;\n }\n\n const hexMatch = /^0x([0-9a-f]{1,8})$/i.exec(host);\n if (hexMatch) {\n const num = Number.parseInt(hexMatch[1]!, 16);\n if (!Number.isFinite(num) || num < 0 || num > 0xffffffff) {\n return null;\n }\n const a = (num >>> 24) & 0xff;\n const b = (num >>> 16) & 0xff;\n const c = (num >>> 8) & 0xff;\n const d = num & 0xff;\n return `${a}.${b}.${c}.${d}`;\n }\n\n return null;\n}\n\nfunction isBlockedIpv4Mapped(host: string): boolean {\n const mappedDotted = /^::ffff:(\\d{1,3}(?:\\.\\d{1,3}){3})$/i.exec(host);\n if (mappedDotted) {\n return isBlockedIpv4(mappedDotted[1]!);\n }\n\n const mappedHex = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i.exec(host);\n if (mappedHex) {\n const high = Number.parseInt(mappedHex[1]!, 16);\n const low = Number.parseInt(mappedHex[2]!, 16);\n if (Number.isFinite(high) && Number.isFinite(low)) {\n const a = (high >> 8) & 0xff;\n const b = high & 0xff;\n const c = (low >> 8) & 0xff;\n const d = low & 0xff;\n return isBlockedIpv4(`${a}.${b}.${c}.${d}`);\n }\n }\n\n return false;\n}\n\nfunction isBlockedIpv6(host: string): boolean {\n if (host === \"::1\" || host === \"0:0:0:0:0:0:0:1\") {\n return true;\n }\n if (host.startsWith(\"fc\") || host.startsWith(\"fd\")) {\n return true;\n }\n if (host.startsWith(\"fe80:\")) {\n return true;\n }\n if (isBlockedIpv4Mapped(host)) {\n return true;\n }\n return false;\n}\n\nfunction isBlockedHostname(hostname: string): boolean {\n const host = normalizeHostname(hostname);\n if (!host) {\n return true;\n }\n if (BLOCKED_HOSTNAMES.has(host)) {\n return true;\n }\n if (host.endsWith(\".localhost\") || host.endsWith(\".local\")) {\n return true;\n }\n\n const numericIpv4 = ipv4FromNumericHost(host);\n if (numericIpv4 && isBlockedIpv4(numericIpv4)) {\n return true;\n }\n\n return isBlockedIpv4(host) || isBlockedIpv6(host);\n}\n\n/**\n * True when a handler URL targets the local machine. Convex cloud cannot POST\n * these directly; loopback deliveries are queued in Redis and drained by a local\n * worker (see apps/api handler-outbound).\n */\nexport function isLoopbackHandlerUrl(urlString: string): boolean {\n let url: URL;\n try {\n url = new URL(urlString);\n } catch {\n return false;\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return false;\n }\n if (url.username || url.password) {\n return false;\n }\n\n const host = url.hostname.toLowerCase();\n return (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"[::1]\" ||\n host.endsWith(\".localhost\")\n );\n}\n\n/**\n * Webhook/trigger handler URLs may target a public host or loopback (local dev).\n */\nexport function isAllowedHandlerUrl(urlString: string): boolean {\n return isPublicHttpUrl(urlString) || isLoopbackHandlerUrl(urlString);\n}\n\n/**\n * Returns true when the URL uses http(s) and targets a public, non-reserved host.\n */\nexport function isPublicHttpUrl(urlString: string): boolean {\n let url: URL;\n try {\n url = new URL(urlString);\n } catch {\n return false;\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return false;\n }\n if (url.username || url.password) {\n return false;\n }\n\n return !isBlockedHostname(url.hostname);\n}\n\nexport const PUBLIC_HTTP_URL_ERROR =\n \"URL must be a public http:// or https:// address\";\n\nexport const HANDLER_URL_ERROR =\n \"Handler URL must be a public or loopback http:// or https:// address\";\n\nconst FORBIDDEN_HANDLER_HEADERS = new Set([\n \"host\",\n \"connection\",\n \"content-length\",\n \"transfer-encoding\",\n \"te\",\n \"trailer\",\n \"upgrade\",\n \"proxy-authorization\",\n \"proxy-connection\",\n \"keep-alive\",\n \"x-robotrock-signature\",\n \"x-robotrock-delivery-id\",\n \"x-robotrock-delivery-attempt\",\n]);\n\n/**\n * Allow only safe custom webhook headers; blocks overrides of delivery metadata.\n */\nexport function filterHandlerHeaders(\n headers: Record<string, string> | undefined\n): Record<string, string> {\n if (!headers) {\n return {};\n }\n\n const filtered: Record<string, string> = {};\n for (const [rawKey, value] of Object.entries(headers)) {\n const key = rawKey.toLowerCase().trim();\n if (!key || FORBIDDEN_HANDLER_HEADERS.has(key)) {\n continue;\n }\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(key)) {\n continue;\n }\n filtered[key] = value;\n }\n return filtered;\n}\n","/** Canonical app key for tasks submitted without an `app` field. */\nexport const DEFAULT_TASK_APP = \"default\" as const;\n\nexport type TaskAppKey = typeof DEFAULT_TASK_APP | (string & {});\n\n/**\n * Normalize an app identifier for storage and filtering.\n * Empty or missing values map to the default inbox.\n */\nexport function normalizeTaskApp(app: string | undefined | null): TaskAppKey {\n const trimmed = app?.trim();\n if (!trimmed) return DEFAULT_TASK_APP;\n return trimmed.toLowerCase();\n}\n\n/** Human-readable label for sidebar / UI (not for URLs or API payloads). */\nexport function formatTaskAppLabel(appKey: string): string {\n if (appKey === DEFAULT_TASK_APP) return \"Default\";\n return appKey\n .split(/[-_]+/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(\" \");\n}\n","export * from \"./cn\";\nexport * from \"./convex-sanitize\";\nexport * from \"./decode-html-entities\";\nexport * from \"./deployment-secret-encryption\";\nexport * from \"./safe-url\";\nexport * from \"./task-app\";\n\n","import { isPublicHttpUrl, PUBLIC_HTTP_URL_ERROR } from \"../utils/safe-url\";\n\ntype ContextInput = {\n data?: Record<string, unknown>;\n ui?: Record<string, unknown>;\n};\n\nfunction resolveLinkUrl(value: string): string {\n return value.startsWith(\"http://\") || value.startsWith(\"https://\")\n ? value\n : `https://${value}`;\n}\n\nfunction widgetType(\n ui: Record<string, unknown> | undefined,\n field: string\n): string | undefined {\n const fieldUi = ui?.[field];\n if (typeof fieldUi !== \"object\" || fieldUi === null) {\n return undefined;\n }\n const widget = (fieldUi as Record<string, unknown>)[\"ui:widget\"];\n return typeof widget === \"string\" ? widget : undefined;\n}\n\nfunction validateUrlValue(value: unknown, widget: string): string | null {\n if (widget === \"image\" || widget === \"link\") {\n if (typeof value !== \"string\") {\n return PUBLIC_HTTP_URL_ERROR;\n }\n const url = widget === \"link\" ? resolveLinkUrl(value) : value;\n if (!isPublicHttpUrl(url)) {\n return PUBLIC_HTTP_URL_ERROR;\n }\n return null;\n }\n\n if (widget === \"attachments\" && Array.isArray(value)) {\n for (const item of value) {\n if (typeof item !== \"object\" || item === null) {\n continue;\n }\n const url = (item as { url?: unknown }).url;\n if (typeof url === \"string\" && !isPublicHttpUrl(resolveLinkUrl(url))) {\n return PUBLIC_HTTP_URL_ERROR;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Validates URL-bearing context widget values (image, link, attachments).\n * Returns an error message or null when valid.\n */\nexport function validateContextPublicUrls(\n context: ContextInput | undefined\n): string | null {\n if (!context?.data) {\n return null;\n }\n\n for (const [field, value] of Object.entries(context.data)) {\n const widget = widgetType(context.ui, field);\n if (!widget) {\n continue;\n }\n const error = validateUrlValue(value, widget);\n if (error) {\n return `context.data.${field}: ${error}`;\n }\n }\n\n return null;\n}\n","import { z } from \"zod\";\nimport {\n isAllowedHandlerUrl,\n isPublicHttpUrl,\n HANDLER_URL_ERROR,\n PUBLIC_HTTP_URL_ERROR,\n} from \"../utils/safe-url\";\nimport { validateContextPublicUrls } from \"./context-urls\";\nimport type { JSONSchema7 } from \"./json-schema\";\n\n/**\n * Extended JSONSchema7 type that includes RJSF extensions like enumNames\n */\nexport type ExtendedJSONSchema7 = JSONSchema7 & {\n enumNames?: string[];\n [key: string]: unknown;\n};\n\n/**\n * UI Schema for RJSF form customization\n */\nexport type UiSchema = {\n \"ui:widget\"?: string;\n \"ui:title\"?: string;\n \"ui:description\"?: string;\n \"ui:placeholder\"?: string;\n \"ui:options\"?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n// Helper schemas\nexport const safeUrlSchema = z.string().refine((url) => isPublicHttpUrl(url), {\n message: PUBLIC_HTTP_URL_ERROR,\n});\n\nconst handlerUrlSchema = z.string().refine((url) => isAllowedHandlerUrl(url), {\n message: HANDLER_URL_ERROR,\n});\n\n// JSONSchema7 validation\nconst jsonSchema7Schema = z.custom<ExtendedJSONSchema7>(\n (val) => typeof val === \"object\" && val !== null,\n { message: \"Must be a valid JSON Schema object\" }\n);\n\n// UiSchema validation\nconst uiSchemaSchema = z.custom<UiSchema>((val) => typeof val === \"object\" && val !== null, {\n message: \"Must be a valid UiSchema object\",\n});\n\n// Handler schemas (per-action handlers for webhooks, triggers, etc.)\nconst webhookHandlerSchema = z.object({\n type: z.literal(\"webhook\"),\n url: handlerUrlSchema,\n headers: z.record(z.string(), z.string()),\n});\n\nconst triggerHandlerSchema = webhookHandlerSchema.extend({\n type: z.literal(\"trigger\"),\n tokenId: z.string().min(1),\n});\n\nconst handlerSchema = z.discriminatedUnion(\"type\", [webhookHandlerSchema, triggerHandlerSchema]);\n\n/** Action config without handlers — used for chat widgets and agent tool input. */\nexport const taskActionInputSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n description: z.string().optional(),\n schema: jsonSchema7Schema.optional(),\n ui: uiSchemaSchema.optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\n// Action schema with JSONSchema-based feedback and optional handlers\nconst taskActionSchema = taskActionInputSchema.extend({\n // Optional handlers for this action - if present, must have at least 1\n handlers: z.array(handlerSchema).min(1).optional(),\n});\n\n// UI Field Schema\nconst uiFieldSchemaSchema: z.ZodType<Record<string, unknown>> = z\n .object({\n \"ui:widget\": z.string().optional(),\n \"ui:title\": z.string().optional(),\n \"ui:description\": z.string().optional(),\n \"ui:options\": z.record(z.string(), z.unknown()).optional(),\n items: z.lazy(() => z.record(z.string(), uiFieldSchemaSchema)).optional(),\n })\n .passthrough();\n\n// Context UI Schema\nconst contextUiSchema = z.record(z.string(), uiFieldSchemaSchema).optional();\n\n// Context data schema\nconst contextDataSchema = z\n .object({\n data: z.record(z.string(), z.unknown()),\n ui: contextUiSchema,\n })\n .optional();\n\nexport const TASK_CONTEXT_FORMAT_VERSION = 2 as const;\nexport type TaskContextFormatVersion = typeof TASK_CONTEXT_FORMAT_VERSION;\n\n// Main TaskContext schema\nconst taskContextObjectBaseSchema = z.object({\n /** Source application id; omitted tasks are grouped in the default inbox. */\n app: z.string().min(1).optional(),\n type: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n validUntil: z.string().optional(),\n context: contextDataSchema,\n /** Task context wire format version. @default 2 */\n contextVersion: z.literal(2).optional(),\n /** @deprecated Use `contextVersion`. Accepted on ingest only. */\n version: z.literal(2).optional(),\n actions: z.array(taskActionSchema).min(1, \"At least one action is required\"),\n});\n\nfunction normalizeTaskContextVersion<T extends { contextVersion?: 2; version?: 2 }>(\n data: T\n): Omit<T, \"version\" | \"contextVersion\"> & { contextVersion: 2 } {\n const { version: legacyVersion, contextVersion, ...rest } = data;\n return {\n ...rest,\n contextVersion: contextVersion ?? legacyVersion ?? TASK_CONTEXT_FORMAT_VERSION,\n };\n}\n\nconst taskContextObjectSchema = taskContextObjectBaseSchema.transform(\n normalizeTaskContextVersion\n);\n\nfunction refineContextPublicUrls<T extends { context?: z.infer<typeof contextDataSchema> }>(\n data: T,\n ctx: z.RefinementCtx\n) {\n const error = validateContextPublicUrls(data.context);\n if (error) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: error,\n path: [\"context\"],\n });\n }\n}\n\nexport const taskContextSchema = taskContextObjectSchema.superRefine(\n refineContextPublicUrls\n);\n\n/**\n * Assignment targets at task create (not stored in task context JSON).\n * Unknown user emails are auto-provisioned as assignee memberships (count toward seat limits).\n *\n * Virtual group slugs (membership derived from tenantUsers, not groupMembers):\n * - `all` — all workspace members (omit assignTo defaults to this)\n * - `admins` — workspace users with tenant admin role\n */\nexport const VIRTUAL_ASSIGN_TO_GROUP_SLUGS = [\"all\", \"admins\"] as const;\n\nexport const assignToSchema = z\n .object({\n users: z.array(z.string().email()).optional(),\n groups: z.array(z.string().min(1)).optional(),\n })\n .refine(\n (data) => {\n const groups = data.groups ?? [];\n if (groups.includes(\"all\") && groups.length > 1) {\n return false;\n }\n return true;\n },\n { message: 'Cannot combine \"all\" with other group slugs' }\n );\n\n/** A short thread-scoped status update message (1-2 sentences). */\nexport const threadUpdateMessageSchema = z.string().min(1).max(500);\n\n/**\n * Lifecycle status carried by a thread update. Drives the icon and color shown\n * in the inbox status bar. Defaults to `info` when omitted.\n */\nexport const threadUpdateStatuses = [\n \"info\",\n \"queued\",\n \"running\",\n \"waiting\",\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n] as const;\n\nexport const threadUpdateStatusSchema = z.enum(threadUpdateStatuses);\n\n/** The default status applied when an update omits one. */\nexport const DEFAULT_THREAD_UPDATE_STATUS: ThreadUpdateStatus = \"info\";\n\n/** Shared shape for a thread update (standalone and at task creation). */\nexport const threadUpdateInputSchema = z.object({\n message: threadUpdateMessageSchema,\n status: threadUpdateStatusSchema.optional(),\n});\n\n/** Thread priority levels for inbox ordering and display. */\nexport const taskPriorities = [\"low\", \"normal\", \"high\", \"urgent\"] as const;\n\nexport const taskPrioritySchema = z.enum(taskPriorities);\n\nexport type TaskPriority = (typeof taskPriorities)[number];\n\nexport const DEFAULT_TASK_PRIORITY: TaskPriority = \"normal\";\n\nexport const LOWEST_TASK_PRIORITY: TaskPriority = \"low\";\n\nexport const TASK_PRIORITY_RANK: Record<TaskPriority, number> = {\n low: 1,\n normal: 2,\n high: 3,\n urgent: 4,\n};\n\n/**\n * Agent release at task create (not shown in inbox reviewer UI).\n * Used for feedback analysis over deploys.\n */\nexport const agentTelemetrySchema = z.object({\n /** Agent or app version (semver, git SHA, deploy tag — caller-defined). */\n version: z.string().min(1),\n});\n\n/** POST /v1 body: task context plus optional assignment. */\nexport const createTaskBodySchema = taskContextObjectBaseSchema\n .extend({\n assignTo: assignToSchema.optional(),\n /**\n * Groups related tasks together. When omitted, the server generates one and\n * returns it so the caller can reuse it on later tasks in the same thread.\n */\n threadId: z.string().min(1).optional(),\n /**\n * Optional thread priority. When set, applies to the whole thread and\n * overwrites any previous priority. Omit on later tasks to leave unchanged.\n */\n priority: taskPrioritySchema.optional(),\n /**\n * Optional initial status update logged against the task's thread. Shows in\n * the inbox status bar and the thread update log.\n */\n update: threadUpdateInputSchema.optional(),\n /** Agent release version — not shown in inbox UI. */\n agent: agentTelemetrySchema.optional(),\n })\n .transform(normalizeTaskContextVersion)\n .superRefine(refineContextPublicUrls);\n\n/** POST /v1/threads/:threadId/updates body: a standalone thread update. */\nexport const threadUpdateBodySchema = threadUpdateInputSchema;\n\n/** Action widget config for a seeded assistant message (mirrors the `requestActionInput` tool input). */\nexport const agentChatSeedActionSchema = z.object({\n /** Stable action id echoed back on submit; auto-derived from title when omitted. */\n id: z.string().min(1).optional(),\n title: z.string().min(1),\n description: z.string().optional(),\n /** JSON Schema object for the form fields. */\n schema: z.record(z.string(), z.unknown()).optional(),\n /** RJSF ui schema overrides (ui:widget, ui:enumNames, etc.). */\n ui: z.record(z.string(), z.unknown()).optional(),\n /** Optional default field values. */\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\n/** A single pre-seeded chat message injected into a programmatic agent chat. */\nexport const agentChatSeedMessageSchema = z.object({\n role: z.enum([\"user\", \"assistant\"]),\n text: z.string().min(1),\n /** Optional display-name override for the message sender. */\n senderName: z.string().min(1).optional(),\n /**\n * Optional structured input request rendered as a styled RobotRock action\n * widget below the message text. Use this instead of asking the user to reply\n * in plain text so the request is always a proper action form.\n */\n requestActionInput: z\n .object({\n prompt: z.string().optional(),\n action: agentChatSeedActionSchema,\n })\n .optional(),\n});\n\n/**\n * POST /v1/agent-chats body: create + assign one or more agent chat sessions.\n * Either `agentIdentifier` (new chat) or `parentChatId` (spawned from a chat) is required.\n */\nconst eveAgentChatTransportSchema = z.object({\n kind: z.literal(\"eve\"),\n chatId: z.string().min(1),\n baseUrl: z.string().url(),\n sessionId: z.string().optional(),\n continuationToken: z.string().optional(),\n streamIndex: z.number().int().nonnegative().optional(),\n isStreaming: z.boolean().optional(),\n});\n\nexport const createAgentChatBodySchema = z\n .object({\n /** Agent id (eve agent name). Required unless `parentChatId` is set. */\n agentIdentifier: z.string().min(1).optional(),\n /** Inherit tenant/connection/agent from an existing chat (agent-spawned chats). */\n parentChatId: z.string().min(1).optional(),\n /** Convex tenantEveConnections id; resolved from the tenant when omitted. */\n eveConnectionId: z.string().min(1).optional(),\n /** Source application id; groups the chat under an inbox section. */\n app: z.string().min(1).optional(),\n /** Email of the user who owns the chat. Required unless `parentChatId` is set. */\n ownerEmail: z.string().email().optional(),\n title: z.string().min(1),\n messages: z.array(agentChatSeedMessageSchema).default([]),\n /** Provenance label stored on the session (\"cron\" | \"agent\" | ...). */\n source: z.string().min(1).optional(),\n })\n .refine((data) => Boolean(data.agentIdentifier || data.parentChatId), {\n message: \"Provide either agentIdentifier or parentChatId\",\n })\n .refine((data) => Boolean(data.ownerEmail || data.parentChatId), {\n message: \"Provide ownerEmail unless parentChatId is set\",\n });\n\n/** POST /v1/agent-chats/transport body: persist live-chat cursor for the browser. */\nexport const agentChatTransportBodySchema = eveAgentChatTransportSchema;\n\n/** POST /v1/agent-chats/audit-tool body: log Eve tool executions from agent hooks. */\nexport const agentChatAuditToolBodySchema = z.object({\n eveSessionId: z.string().min(1),\n userId: z.string().min(1),\n toolCallId: z.string().min(1),\n toolName: z.string().min(1),\n input: z.record(z.string(), z.unknown()).default({}),\n success: z.boolean(),\n status: z.enum([\"completed\", \"failed\", \"rejected\"]),\n error: z.string().optional(),\n idempotencyKey: z.string().optional(),\n});\n\n/** POST /v1/agent-chats/audit-input body: log Eve HITL choices from agent hooks. */\nexport const agentChatAuditInputBodySchema = z.object({\n eveSessionId: z.string().min(1),\n userId: z.string().min(1),\n actionId: z.string().min(1),\n actionTitle: z.string().optional(),\n prompt: z.string().optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n idempotencyKey: z.string().optional(),\n /** Eve input request id — used to merge staged HITL metadata. */\n requestId: z.string().optional(),\n /** Eve tool call id — fallback lookup for staged HITL metadata. */\n toolCallId: z.string().optional(),\n});\n\nconst eveHitlStagedOptionSchema = z.object({\n id: z.string(),\n label: z.string(),\n});\n\n/** POST /v1/agent-chats/stage-hitl body: persist pending Eve HITL requests on the chat. */\nexport const agentChatStageHitlBodySchema = z.object({\n eveSessionId: z.string().min(1),\n requests: z.array(\n z.object({\n requestId: z.string().min(1),\n toolCallId: z.string().min(1),\n toolName: z.string().min(1),\n prompt: z.string().min(1),\n display: z.enum([\"confirmation\", \"select\", \"text\"]).optional(),\n allowFreeform: z.boolean().optional(),\n options: z.array(eveHitlStagedOptionSchema).optional(),\n toolInput: z.record(z.string(), z.unknown()).optional(),\n })\n ),\n});\n\n/** POST /v1/agent-chats/link-task body: associate an inbox task with an Eve chat session. */\nexport const agentChatLinkTaskBodySchema = z.object({\n eveSessionId: z.string().min(1),\n publicTaskId: z.string().min(1),\n toolCallId: z.string().min(1),\n});\n\n/** Where a thread update originated. */\nexport type ThreadUpdateSource = \"api\" | \"task_create\" | \"dashboard\";\n\n/** Lifecycle status carried by a thread update. */\nexport type ThreadUpdateStatus = (typeof threadUpdateStatuses)[number];\n\n/** A logged thread update as returned by the API. */\nexport interface ThreadUpdate {\n id: string;\n threadId: string;\n message: string;\n status: ThreadUpdateStatus;\n source: ThreadUpdateSource;\n createdAt: number;\n}\n\n// Type exports\nexport type AssignToInput = z.infer<typeof assignToSchema>;\nexport type CreateTaskBodyInput = z.input<typeof createTaskBodySchema>;\nexport type CreateTaskBody = z.output<typeof createTaskBodySchema>;\nexport type ThreadUpdateBodyInput = z.input<typeof threadUpdateBodySchema>;\nexport type ThreadUpdateBody = z.output<typeof threadUpdateBodySchema>;\nexport type ThreadUpdateInput = z.input<typeof threadUpdateInputSchema>;\nexport type AgentChatSeedAction = z.output<typeof agentChatSeedActionSchema>;\nexport type AgentChatSeedMessage = z.output<typeof agentChatSeedMessageSchema>;\nexport type CreateAgentChatBodyInput = z.input<typeof createAgentChatBodySchema>;\nexport type CreateAgentChatBody = z.output<typeof createAgentChatBodySchema>;\nexport type AgentChatTransportBody = z.output<typeof agentChatTransportBodySchema>;\nexport type AgentChatAuditToolBody = z.output<typeof agentChatAuditToolBodySchema>;\nexport type AgentChatAuditInputBody = z.output<typeof agentChatAuditInputBodySchema>;\nexport type AgentChatStageHitlBody = z.output<typeof agentChatStageHitlBodySchema>;\nexport type AgentChatLinkTaskBody = z.output<typeof agentChatLinkTaskBodySchema>;\nexport type TaskContextInput = z.input<typeof taskContextSchema>;\nexport type TaskContextOutput = z.output<typeof taskContextSchema>;\nexport type TaskContext = TaskContextOutput;\nexport type SafeUrl = z.infer<typeof safeUrlSchema>;\nexport type TaskActionInput = z.infer<typeof taskActionInputSchema>;\nexport type TaskAction = z.infer<typeof taskActionSchema>;\nexport type WebhookHandler = z.infer<typeof webhookHandlerSchema>;\nexport type TriggerHandler = z.infer<typeof triggerHandlerSchema>;\nexport type Handler = z.infer<typeof handlerSchema>;\nexport type ContextData = z.infer<typeof contextDataSchema>;\nexport type ContextUiSchema = z.infer<typeof contextUiSchema>;\nexport type UiFieldSchema = z.infer<typeof uiFieldSchemaSchema>;\nexport type AgentTelemetry = z.infer<typeof agentTelemetrySchema>;\nexport type AgentTelemetryInput = z.input<typeof agentTelemetrySchema>;\n","/**\n * JSON Schema Draft 7 type definitions\n * Simplified version for our use case\n */\nexport interface JSONSchema7 {\n $id?: string;\n $ref?: string;\n $schema?: string;\n $comment?: string;\n\n type?: JSONSchema7TypeName | JSONSchema7TypeName[];\n enum?: unknown[];\n const?: unknown;\n\n // Number validation\n multipleOf?: number;\n maximum?: number;\n exclusiveMaximum?: number;\n minimum?: number;\n exclusiveMinimum?: number;\n\n // String validation\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n format?: string;\n\n // Array validation\n items?: JSONSchema7 | JSONSchema7[];\n additionalItems?: JSONSchema7 | boolean;\n maxItems?: number;\n minItems?: number;\n uniqueItems?: boolean;\n contains?: JSONSchema7;\n\n // Object validation\n maxProperties?: number;\n minProperties?: number;\n required?: string[];\n properties?: Record<string, JSONSchema7>;\n patternProperties?: Record<string, JSONSchema7>;\n additionalProperties?: JSONSchema7 | boolean;\n dependencies?: Record<string, JSONSchema7 | string[]>;\n propertyNames?: JSONSchema7;\n\n // Conditional\n if?: JSONSchema7;\n then?: JSONSchema7;\n else?: JSONSchema7;\n\n // Combining\n allOf?: JSONSchema7[];\n anyOf?: JSONSchema7[];\n oneOf?: JSONSchema7[];\n not?: JSONSchema7;\n\n // Metadata\n title?: string;\n description?: string;\n default?: unknown;\n readOnly?: boolean;\n writeOnly?: boolean;\n examples?: unknown[];\n}\n\nexport type JSONSchema7TypeName =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"object\"\n | \"array\"\n | \"null\";\n\n","import { z } from \"zod\";\nimport type { UiSchema } from \"./task\";\n\nexport const toolDisplayMetadataSchema = z.object({\n widget: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport type ToolDisplayMetadata = z.infer<typeof toolDisplayMetadataSchema>;\n\nexport const toolDisplayEnvelopeSchema = z.object({\n display: toolDisplayMetadataSchema.optional(),\n data: z.record(z.string(), z.unknown()),\n ui: z\n .record(\n z.string(),\n z\n .object({\n \"ui:widget\": z.string().optional(),\n \"ui:title\": z.string().optional(),\n \"ui:description\": z.string().optional(),\n \"ui:options\": z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n )\n .optional(),\n});\n\nexport type ToolDisplayEnvelope<\n TData extends Record<string, unknown> = Record<string, unknown>,\n> = {\n display?: ToolDisplayMetadata;\n data: TData;\n ui?: Record<string, UiSchema>;\n};\n\n/** Detect agent-sent display envelopes without matching arbitrary tool payloads. */\nexport function isToolDisplayEnvelope(\n value: unknown\n): value is ToolDisplayEnvelope {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n if (!(\"data\" in record)) {\n return false;\n }\n\n const data = record.data;\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) {\n return false;\n }\n\n return \"display\" in record || \"ui\" in record;\n}\n","import { z } from \"zod\";\nimport { assignToSchema } from \"./task\";\n\nexport const tenantRoleSchema = z.enum([\"admin\", \"member\"]);\n\nexport const agentAdminUserSchema = z.object({\n id: z.string(),\n email: z.string().email(),\n name: z.string(),\n});\n\nexport const agentAdminMemberSchema = z.object({\n userId: z.string(),\n role: z.string(),\n membershipKind: z.enum([\"team\", \"assignee\"]),\n hasLoggedIn: z.boolean(),\n user: agentAdminUserSchema,\n});\n\nexport const agentAdminGroupSchema = z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n description: z.string().nullable(),\n memberCount: z.number().optional(),\n});\n\nexport const agentAdminGroupDetailSchema = agentAdminGroupSchema.extend({\n members: z.array(\n z.object({\n userId: z.string(),\n user: agentAdminUserSchema,\n })\n ),\n});\n\nexport const agentAdminTaskSummarySchema = z.object({\n id: z.string(),\n convexId: z.string(),\n status: z.string(),\n type: z.string().nullable(),\n name: z.string().nullable(),\n description: z.string().nullable(),\n validUntil: z.number(),\n createdAt: z.number(),\n threadPriority: z.string().nullable(),\n handledByUserId: z.string().nullable(),\n});\n\nexport const inviteMemberBodySchema = z.object({\n email: z.string().email(),\n role: tenantRoleSchema.optional(),\n});\n\nexport const updateMemberRoleBodySchema = z.object({\n role: tenantRoleSchema,\n});\n\nexport const createGroupBodySchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n});\n\nexport const updateGroupBodySchema = z.object({\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n});\n\nexport const addGroupMemberBodySchema = z.object({\n userId: z\n .string()\n .min(1)\n .describe(\"Convex user id or member email.\"),\n});\n\nexport const listTasksQuerySchema = z.object({\n statusFilter: z.enum([\"all\", \"open\", \"handled\", \"expired\"]).optional(),\n typeFilter: z.string().optional(),\n appFilter: z.string().optional(),\n sortField: z.enum([\"type\", \"date\", \"status\", \"validUntil\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n limit: z.coerce.number().int().positive().max(100).optional(),\n cursor: z.string().optional(),\n});\n\nexport const searchTasksQuerySchema = z.object({\n q: z.string().min(1),\n limit: z.coerce.number().int().positive().max(100).optional(),\n});\n\nexport const assignTasksResultSchema = z.object({\n taskId: z.string(),\n success: z.boolean(),\n message: z.string().optional(),\n name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n});\n\nexport const assignTasksResponseSchema = z.object({\n results: z.array(assignTasksResultSchema),\n});\n\nexport const assignTasksBodySchema = z.object({\n taskIds: z.array(z.string().min(1)).min(1).max(100),\n assignTo: assignToSchema.refine(\n (value) => (value.users?.length ?? 0) > 0 || (value.groups?.length ?? 0) > 0,\n { message: \"assignTo needs at least one user email or group slug.\" }\n ),\n});\n\nexport type AgentAdminMember = z.infer<typeof agentAdminMemberSchema>;\nexport type AgentAdminGroup = z.infer<typeof agentAdminGroupSchema>;\nexport type AgentAdminGroupDetail = z.infer<typeof agentAdminGroupDetailSchema>;\nexport type AgentAdminTaskSummary = z.infer<typeof agentAdminTaskSummarySchema>;\nexport type AgentAdminAssignTaskResult = z.infer<typeof assignTasksResultSchema>;\n","export * from \"./task\";\nexport * from \"./json-schema\";\nexport * from \"./context-urls\";\nexport * from \"./tool-result-display\";\nexport * from \"./agent-admin\";\n\n","import { z } from \"zod\";\nimport {\n isAllowedHandlerUrl,\n HANDLER_URL_ERROR,\n} from \"@robotrock/core/utils\";\nimport { validateContextPublicUrls } from \"@robotrock/core/schemas\";\n\nexport interface JSONSchema7 {\n $id?: string;\n $ref?: string;\n $schema?: string;\n $comment?: string;\n type?: JSONSchema7TypeName | JSONSchema7TypeName[];\n enum?: unknown[];\n const?: unknown;\n multipleOf?: number;\n maximum?: number;\n exclusiveMaximum?: number;\n minimum?: number;\n exclusiveMinimum?: number;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n format?: string;\n items?: JSONSchema7 | JSONSchema7[];\n additionalItems?: JSONSchema7 | boolean;\n maxItems?: number;\n minItems?: number;\n uniqueItems?: boolean;\n contains?: JSONSchema7;\n maxProperties?: number;\n minProperties?: number;\n required?: string[];\n properties?: Record<string, JSONSchema7>;\n patternProperties?: Record<string, JSONSchema7>;\n additionalProperties?: JSONSchema7 | boolean;\n dependencies?: Record<string, JSONSchema7 | string[]>;\n propertyNames?: JSONSchema7;\n if?: JSONSchema7;\n then?: JSONSchema7;\n else?: JSONSchema7;\n allOf?: JSONSchema7[];\n anyOf?: JSONSchema7[];\n oneOf?: JSONSchema7[];\n not?: JSONSchema7;\n title?: string;\n description?: string;\n default?: unknown;\n readOnly?: boolean;\n writeOnly?: boolean;\n examples?: unknown[];\n}\n\nexport type JSONSchema7TypeName =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"object\"\n | \"array\"\n | \"null\";\n\nexport type ExtendedJSONSchema7 = JSONSchema7 & {\n enumNames?: string[];\n [key: string]: unknown;\n};\n\nexport type UiSchema = {\n \"ui:widget\"?: string;\n \"ui:title\"?: string;\n \"ui:description\"?: string;\n \"ui:placeholder\"?: string;\n \"ui:options\"?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nconst handlerUrlSchema = z.string().refine((url) => isAllowedHandlerUrl(url), {\n message: HANDLER_URL_ERROR,\n});\n\nconst jsonSchema7Schema = z.custom<ExtendedJSONSchema7>(\n (val) => typeof val === \"object\" && val !== null,\n { message: \"Must be a valid JSON Schema object\" }\n);\n\nconst uiSchemaSchema = z.custom<UiSchema>((val) => typeof val === \"object\" && val !== null, {\n message: \"Must be a valid UiSchema object\",\n});\n\nconst webhookHandlerSchema = z.object({\n type: z.literal(\"webhook\"),\n url: handlerUrlSchema,\n headers: z.record(z.string(), z.string()),\n});\n\nconst triggerHandlerSchema = webhookHandlerSchema.extend({\n type: z.literal(\"trigger\"),\n tokenId: z.string().min(1),\n});\n\nconst handlerSchema = z.discriminatedUnion(\"type\", [webhookHandlerSchema, triggerHandlerSchema]);\n\n/** Action config without handlers — used for chat widgets and agent tool input. */\nexport const taskActionInputSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n description: z.string().optional(),\n schema: jsonSchema7Schema.optional(),\n ui: uiSchemaSchema.optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst taskActionSchema = taskActionInputSchema.extend({\n handlers: z.array(handlerSchema).min(1).optional(),\n});\n\nconst uiFieldSchemaSchema: z.ZodType<Record<string, unknown>> = z\n .object({\n \"ui:widget\": z.string().optional(),\n \"ui:title\": z.string().optional(),\n \"ui:description\": z.string().optional(),\n \"ui:options\": z.record(z.string(), z.unknown()).optional(),\n items: z.lazy(() => z.record(z.string(), uiFieldSchemaSchema)).optional(),\n })\n .passthrough();\n\nconst contextUiSchema = z.record(z.string(), uiFieldSchemaSchema).optional();\n\nconst contextDataSchema = z\n .object({\n data: z.record(z.string(), z.unknown()),\n ui: contextUiSchema,\n })\n .optional();\n\n/** Task context wire format version (always `2` today). */\nexport const TASK_CONTEXT_FORMAT_VERSION = 2 as const;\nexport type TaskContextFormatVersion = typeof TASK_CONTEXT_FORMAT_VERSION;\n\nconst taskContextObjectBaseSchema = z.object({\n app: z.string().min(1).optional(),\n type: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n validUntil: z.string().optional(),\n context: contextDataSchema,\n contextVersion: z.literal(2).optional(),\n /** @deprecated Use `contextVersion`. Accepted on ingest only. */\n version: z.literal(2).optional(),\n actions: z.array(taskActionSchema).min(1, \"At least one action is required\"),\n});\n\nfunction normalizeTaskContextVersion<T extends { contextVersion?: 2; version?: 2 }>(\n data: T\n): Omit<T, \"version\" | \"contextVersion\"> & { contextVersion: 2 } {\n const { version: legacyVersion, contextVersion, ...rest } = data;\n return {\n ...rest,\n contextVersion: contextVersion ?? legacyVersion ?? TASK_CONTEXT_FORMAT_VERSION,\n };\n}\n\nconst taskContextObjectSchema = taskContextObjectBaseSchema.transform(\n normalizeTaskContextVersion\n);\n\nfunction refineContextPublicUrls<T extends { context?: z.infer<typeof contextDataSchema> }>(\n data: T,\n ctx: z.RefinementCtx\n) {\n const error = validateContextPublicUrls(data.context);\n if (error) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: error,\n path: [\"context\"],\n });\n }\n}\n\nexport const taskContextSchema = taskContextObjectSchema.superRefine(\n refineContextPublicUrls\n);\n\n/**\n * Assignment targets at task create (not stored in task context JSON).\n * Unknown user emails are auto-provisioned as assignee memberships (count toward seat limits).\n *\n * Virtual group slugs (membership derived from tenantUsers, not groupMembers):\n * - `all` — all workspace members (omit assignTo defaults to this)\n * - `admins` — workspace users with tenant admin role\n */\nexport const VIRTUAL_ASSIGN_TO_GROUP_SLUGS = [\"all\", \"admins\"] as const;\n\nexport const assignToSchema = z\n .object({\n users: z.array(z.string().email()).optional(),\n groups: z.array(z.string().min(1)).optional(),\n })\n .refine(\n (data) => {\n const groups = data.groups ?? [];\n if (groups.includes(\"all\") && groups.length > 1) {\n return false;\n }\n return true;\n },\n { message: 'Cannot combine \"all\" with other group slugs' }\n );\n\n/** A short thread-scoped status update message (1-2 sentences). */\nexport const threadUpdateMessageSchema = z.string().min(1).max(500);\n\n/**\n * Lifecycle status carried by a thread update. Drives the icon and color shown\n * in the inbox status bar. Defaults to `info` when omitted.\n */\nexport const threadUpdateStatuses = [\n \"info\",\n \"queued\",\n \"running\",\n \"waiting\",\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n] as const;\n\nexport const threadUpdateStatusSchema = z.enum(threadUpdateStatuses);\n\n/** The default status applied when an update omits one. */\nexport const DEFAULT_THREAD_UPDATE_STATUS: ThreadUpdateStatus = \"info\";\n\n/** Shared shape for a thread update (standalone and at task creation). */\nexport const threadUpdateInputSchema = z.object({\n message: threadUpdateMessageSchema,\n status: threadUpdateStatusSchema.optional(),\n});\n\n/** Thread priority levels for inbox ordering and display. */\nexport const taskPriorities = [\"low\", \"normal\", \"high\", \"urgent\"] as const;\n\nexport const taskPrioritySchema = z.enum(taskPriorities);\n\nexport type TaskPriority = (typeof taskPriorities)[number];\n\nexport const DEFAULT_TASK_PRIORITY: TaskPriority = \"normal\";\n\nexport const LOWEST_TASK_PRIORITY: TaskPriority = \"low\";\n\nexport const TASK_PRIORITY_RANK: Record<TaskPriority, number> = {\n low: 1,\n normal: 2,\n high: 3,\n urgent: 4,\n};\n\nexport const agentTelemetrySchema = z.object({\n version: z.string().min(1),\n});\n\nexport const createTaskBodySchema = taskContextObjectBaseSchema\n .extend({\n assignTo: assignToSchema.optional(),\n /**\n * Groups related tasks together. When omitted, the server generates one and\n * returns it so the caller can reuse it on later tasks in the same thread.\n */\n threadId: z.string().min(1).optional(),\n /**\n * Optional thread priority. When set, applies to the whole thread and\n * overwrites any previous priority. Omit on later tasks to leave unchanged.\n */\n priority: taskPrioritySchema.optional(),\n /**\n * Optional initial status update logged against the task's thread. Shows in\n * the inbox status bar and the thread update log.\n */\n update: threadUpdateInputSchema.optional(),\n agent: agentTelemetrySchema.optional(),\n })\n .transform(normalizeTaskContextVersion)\n .superRefine(refineContextPublicUrls);\n\n/** POST /v1/threads/:threadId/updates body: a standalone thread update. */\nexport const threadUpdateBodySchema = threadUpdateInputSchema;\n\n/** Where a thread update originated. */\nexport type ThreadUpdateSource = \"api\" | \"task_create\" | \"dashboard\";\n\n/** Lifecycle status carried by a thread update. */\nexport type ThreadUpdateStatus = (typeof threadUpdateStatuses)[number];\n\n/** A logged thread update as returned by the API. */\nexport interface ThreadUpdate {\n id: string;\n threadId: string;\n message: string;\n status: ThreadUpdateStatus;\n source: ThreadUpdateSource;\n createdAt: number;\n}\n\nexport type AssignToInput = z.infer<typeof assignToSchema>;\nexport type CreateTaskBodyInput = z.input<typeof createTaskBodySchema>;\nexport type CreateTaskBody = z.output<typeof createTaskBodySchema>;\nexport type ThreadUpdateBodyInput = z.input<typeof threadUpdateBodySchema>;\nexport type ThreadUpdateBody = z.output<typeof threadUpdateBodySchema>;\nexport type ThreadUpdateInput = z.input<typeof threadUpdateInputSchema>;\nexport type TaskContextInput = z.input<typeof taskContextSchema>;\nexport type TaskContextOutput = z.output<typeof taskContextSchema>;\nexport type TaskContext = TaskContextOutput;\nexport type TaskActionInput = z.infer<typeof taskActionInputSchema>;\nexport type TaskAction = z.infer<typeof taskActionSchema>;\nexport type WebhookHandler = z.infer<typeof webhookHandlerSchema>;\nexport type TriggerHandler = z.infer<typeof triggerHandlerSchema>;\nexport type Handler = z.infer<typeof handlerSchema>;\nexport type AgentTelemetry = z.infer<typeof agentTelemetrySchema>;\nexport type AgentTelemetryInput = z.input<typeof agentTelemetrySchema>;\n\ntype InferObjectProperties<\n Props,\n Req extends PropertyKey,\n> = Props extends Record<string, unknown>\n ? ({\n [K in keyof Props as K extends Req ? K : never]-?: InferJsonSchema7<Props[K]>;\n } & {\n [K in keyof Props as K extends Req ? never : K]?: InferJsonSchema7<Props[K]>;\n } extends infer O\n ? { [K in keyof O]: O[K] }\n : never)\n : Record<string, unknown>;\n\ntype RequiredKeys<S> =\n S extends { readonly required: readonly string[] } ? S[\"required\"][number] : never;\n\nexport type InferJsonSchema7<S> = [S] extends [undefined]\n ? Record<string, never>\n : S extends { readonly const: infer C }\n ? C\n : S extends {\n readonly enum: readonly (infer E)[];\n }\n ? E\n : S extends {\n readonly type: \"object\";\n readonly properties?: infer Props;\n }\n ? InferObjectProperties<Props, RequiredKeys<S>>\n : S extends {\n readonly type: \"object\";\n readonly properties?: undefined;\n }\n ? Record<string, unknown>\n : S extends {\n readonly type: \"array\";\n readonly items?: infer Items;\n }\n ? Items extends readonly unknown[]\n ? InferJsonSchema7<Items[number]>[]\n : Items extends object\n ? InferJsonSchema7<Items>[]\n : unknown[]\n : S extends { readonly type: \"string\" }\n ? string\n : S extends { readonly type: \"number\" } | { readonly type: \"integer\" }\n ? number\n : S extends { readonly type: \"boolean\" }\n ? boolean\n : unknown;\n\nexport type TaskStatus = \"pending\" | \"open\" | \"handled\" | \"expired\";\n\nexport interface TaskResponse {\n success: boolean;\n task: {\n taskId: string;\n threadId: string;\n status: \"pending\" | \"open\";\n context: TaskContext;\n validUntil: string;\n submittedAt: string;\n };\n message: string;\n}\n\nexport interface ThreadUpdateResponse {\n success: boolean;\n update: ThreadUpdate;\n message: string;\n}\n\nexport interface Task {\n id: string;\n threadId?: string;\n createdAt: Date;\n status: TaskStatus;\n context: TaskContext;\n validUntil: number;\n handledAt?: number;\n handled?: {\n action: {\n id: string;\n data: unknown;\n };\n handledBy?: string;\n userId?: string;\n token?: string;\n };\n}\n\nexport type InferActionData<T extends { schema?: unknown }> = [\n Exclude<T[\"schema\"], undefined>,\n] extends [\n never,\n]\n ? Record<string, never>\n : Exclude<T[\"schema\"], undefined> extends infer S\n ? InferJsonSchema7<S>\n : Record<string, never>;\n\nexport type TupleElementIndices<T extends readonly unknown[]> = T extends readonly [\n unknown,\n ...unknown[],\n]\n ? Exclude<keyof T, keyof unknown[]>\n : number;\n\nexport interface TaskResult<T = Record<string, unknown>> {\n actionId: string;\n data: T;\n handledBy?: string;\n handledAt: Date;\n}\n\nexport interface ApprovalResult<T = Record<string, unknown>> extends TaskResult<T> {\n taskId: string;\n}\n\nexport type DiscriminatedApprovalResult<\n TActions extends readonly { id: string; schema?: unknown }[],\n> = {\n [I in TupleElementIndices<TActions>]: TActions[I] extends { id: string; schema?: unknown }\n ? Omit<ApprovalResult<InferActionData<TActions[I]>>, \"actionId\" | \"data\"> & {\n actionId: TActions[I][\"id\"];\n data: InferActionData<TActions[I]>;\n }\n : never\n}[TupleElementIndices<TActions>];\n","import type { TaskAction, TaskContext } from \"../schemas/task\";\nimport type { JSONSchema7 } from \"../schemas/json-schema\";\nimport type { InferJsonSchema7 } from \"./json-schema-infer\";\n\n/**\n * Task status enum\n */\nexport type TaskStatus = \"pending\" | \"open\" | \"handled\" | \"expired\";\n\n/**\n * Task response from the API\n */\nexport interface TaskResponse {\n success: boolean;\n task: {\n taskId: string;\n threadId: string;\n status: \"pending\" | \"open\";\n context: TaskContext;\n validUntil: string;\n submittedAt: string;\n };\n message: string;\n}\n\n/**\n * Task with full details\n */\nexport interface Task {\n id: string;\n threadId?: string;\n createdAt: Date;\n status: TaskStatus;\n context: TaskContext;\n validUntil: number;\n handledAt?: number;\n handled?: {\n action: {\n id: string;\n data: unknown;\n };\n handledBy?: string;\n userId?: string;\n token?: string;\n };\n}\n\n/**\n * Infer the form data shape from an action's JSON Schema (used for approval forms).\n */\nexport type InferActionData<T extends TaskAction> = [Exclude<T[\"schema\"], undefined>] extends [\n never,\n]\n ? Record<string, never>\n : Exclude<T[\"schema\"], undefined> extends infer S extends object\n ? InferJsonSchema7<S & JSONSchema7>\n : Record<string, never>;\n\n/**\n * Indices of a tuple (excludes array prototype keys). For a plain `TaskAction[]`, this is\n * `number`, so the inferred approval union is widened (less narrowing on `actionId`).\n */\nexport type TupleElementIndices<T extends readonly unknown[]> = T extends readonly [\n unknown,\n ...unknown[],\n]\n ? Exclude<keyof T, keyof unknown[]>\n : number;\n\n/**\n * Result type for a handled task\n */\nexport interface TaskResult<T = Record<string, unknown>> {\n actionId: string;\n data: T;\n handledBy?: string;\n handledAt: Date;\n}\n\n/**\n * Task completion payload returned by Trigger wait tokens / SDK helpers.\n */\nexport interface ApprovalResult<T = Record<string, unknown>> extends TaskResult<T> {\n taskId: string;\n}\n\n/**\n * Discriminated approval result inferred from a `task.actions` tuple (`id` + `schema`).\n */\nexport type DiscriminatedApprovalResult<TActions extends readonly TaskAction[]> = {\n [I in TupleElementIndices<TActions>]: TActions[I] extends TaskAction\n ? Omit<ApprovalResult<InferActionData<TActions[I]>>, \"actionId\" | \"data\"> & {\n actionId: TActions[I][\"id\"];\n data: InferActionData<TActions[I]>;\n }\n : never\n}[TupleElementIndices<TActions>];\n\n","import type { JSONSchema7 } from \"../schemas/json-schema\";\n\ntype InferObjectProperties<\n Props extends Record<string, JSONSchema7>,\n Req extends PropertyKey,\n> = {\n [K in keyof Props as K extends Req ? K : never]-?: InferJsonSchema7<Props[K]>;\n} & {\n [K in keyof Props as K extends Req ? never : K]?: InferJsonSchema7<Props[K]>;\n} extends infer O\n ? { [K in keyof O]: O[K] }\n : never;\n\ntype RequiredKeys<S extends JSONSchema7> =\n S extends { readonly required: readonly string[] } ? S[\"required\"][number] : never;\n\n/** Best-effort TypeScript inference for JSON schemas used by task action forms */\nexport type InferJsonSchema7<S extends JSONSchema7 | undefined> = [S] extends [undefined]\n ? Record<string, never>\n : S extends { readonly const: infer C }\n ? C\n : S extends {\n readonly enum: readonly (infer E)[];\n }\n ? E\n : S extends {\n readonly type: \"object\";\n readonly properties?: infer Props extends Record<string, JSONSchema7>;\n }\n ? InferObjectProperties<Props, RequiredKeys<S>>\n : S extends {\n readonly type: \"object\";\n readonly properties?: undefined;\n }\n ? Record<string, unknown>\n : S extends {\n readonly type: \"array\";\n readonly items?: infer Items;\n }\n ? Items extends JSONSchema7[]\n ? InferJsonSchema7<Items[number]>[]\n : Items extends JSONSchema7\n ? InferJsonSchema7<Items>[]\n : unknown[]\n : S extends { readonly type: \"string\" }\n ? string\n : S extends { readonly type: \"number\" } | { readonly type: \"integer\" }\n ? number\n : S extends { readonly type: \"boolean\" }\n ? boolean\n : unknown;\n","export * from \"./task\";\nexport * from \"./json-schema-infer\";\n\n","/**\n * Canonical plan configuration: numeric limits, pricing, and feature flags.\n *\n * Shared between the dashboard, public API, and marketing site so limits,\n * prices, and capabilities never drift across surfaces.\n */\n\nexport type PlanType = \"free\" | \"pro\" | \"enterprise\";\n\nexport interface PlanFeatures {\n attachments: \"linked\" | \"all\";\n auditTrail: boolean;\n ldapSync: boolean;\n customContexts: boolean;\n}\n\nexport interface PlanPricing {\n monthly: number; // in cents\n yearly: number; // in cents\n}\n\nexport interface PlanConfig {\n name: string;\n type: PlanType;\n features: PlanFeatures;\n pricing?: PlanPricing;\n}\n\n/** Sentinel used for \"no limit\". */\nexport const UNLIMITED = -1;\n\n/** Length of the complimentary Pro trial for new workspaces. */\nexport const PRO_TRIAL_DAYS = 30;\n\n/** Default max workspaces a user can create via the in-app form. */\nexport const DEFAULT_MAX_WORKSPACES_PER_USER = 5;\n\nexport const PRO_TRIAL_LABEL = \"Try Pro free for 30 days\";\nexport const PRO_TRIAL_SUBTITLE =\n \"First month free for every new workspace\";\nexport const PRO_TRIAL_CTA = \"Try for a month\";\nexport const PRO_TRIAL_BADGE = \"30 days free\";\nexport const PRO_TRIAL_NO_PAYMENT_NOTE =\n \"No credit card or payment info needed\";\nexport const PRO_TRIAL_PRICING_HEADLINE =\n \"Start for free — every new workspace gets a month of Pro (automatically converts to the Free plan if you don't upgrade).\";\n\nconst MS_PER_DAY = 86_400_000;\n\nexport type TrialState = \"none\" | \"active\" | \"expired\";\n\n/** Fields on a tenant record used to evaluate trial state. */\nexport interface TenantTrialFields {\n planType: string;\n subscriptionStatus?: string | null;\n proTrialEndsAt?: number | null;\n stripeSubscriptionId?: string | null;\n}\n\nexport function hasPaidProSubscription(\n tenant: TenantTrialFields\n): boolean {\n return (\n !!tenant.stripeSubscriptionId &&\n tenant.subscriptionStatus === \"active\"\n );\n}\n\nexport function getTrialState(\n tenant: TenantTrialFields,\n now = Date.now()\n): TrialState {\n if (hasPaidProSubscription(tenant)) {\n return \"none\";\n }\n if (\n tenant.subscriptionStatus !== \"trialing\" ||\n tenant.proTrialEndsAt == null\n ) {\n return \"none\";\n }\n return tenant.proTrialEndsAt > now ? \"active\" : \"expired\";\n}\n\nexport function isTrialExpiredBlocked(\n tenant: TenantTrialFields,\n now = Date.now()\n): boolean {\n if (hasPaidProSubscription(tenant)) {\n return false;\n }\n return getTrialState(tenant, now) === \"expired\";\n}\n\n/** Plan type used for limit resolution (Pro only when access is active). */\nexport function getEffectivePlanType(\n tenant: TenantTrialFields,\n now = Date.now()\n): PlanType {\n const normalized = normalizePlanType(tenant.planType);\n if (normalized === \"enterprise\") {\n return \"enterprise\";\n }\n if (hasPaidProSubscription(tenant)) {\n return \"pro\";\n }\n if (getTrialState(tenant, now) === \"active\") {\n return \"pro\";\n }\n if (isTrialExpiredBlocked(tenant, now)) {\n return \"free\";\n }\n if (normalized === \"pro\") {\n return \"pro\";\n }\n return \"free\";\n}\n\nexport function getProTrialEndsAt(now = Date.now()): number {\n return now + PRO_TRIAL_DAYS * MS_PER_DAY;\n}\n\nexport function getTrialDaysRemaining(\n tenant: TenantTrialFields,\n now = Date.now()\n): number | null {\n if (getTrialState(tenant, now) !== \"active\" || tenant.proTrialEndsAt == null) {\n return null;\n }\n return Math.max(\n 0,\n Math.ceil((tenant.proTrialEndsAt - now) / MS_PER_DAY)\n );\n}\n\nexport function getPlanDisplayName(planType: string | null | undefined): string {\n const normalized = normalizePlanType(planType);\n if (normalized === \"pro\") return \"Pro Plan\";\n if (normalized === \"enterprise\") return \"Enterprise Plan\";\n return \"Free Plan\";\n}\n\n/** Marketing-friendly rate limit copy (no specific numbers). */\nexport function getPricingRateLimitLabel(\n planType: string | null | undefined\n): string {\n const normalized = normalizePlanType(planType);\n if (normalized === \"enterprise\") return \"Custom API limits\";\n if (normalized === \"pro\") return \"Higher API limits\";\n return \"Standard API limits\";\n}\n\nexport interface PlanLimits {\n /** Tasks creatable per rolling 24h window. */\n tasksPerDay: number;\n /** Billable seats (team members + assignees). */\n members: number;\n /** Active API keys. */\n apiKeys: number;\n /** Groups. */\n groups: number;\n /** Audit-log retention in days. */\n auditLogRetention: number;\n /** Sustained request rate allowed per second. */\n rateLimitPerSecond: number;\n /** Task retention in days. */\n taskRetentionDays: number;\n}\n\n/** Per-tenant overrides; any field present replaces the plan default. */\nexport type PlanLimitsOverride = Partial<PlanLimits>;\n\nexport const PLANS: Record<PlanType, PlanConfig> = {\n free: {\n name: \"Free\",\n type: \"free\",\n features: {\n attachments: \"linked\",\n auditTrail: false,\n ldapSync: false,\n customContexts: false,\n },\n },\n pro: {\n name: \"Pro\",\n type: \"pro\",\n features: {\n attachments: \"all\",\n auditTrail: true,\n ldapSync: false,\n customContexts: false,\n },\n pricing: {\n monthly: 1999, // 19.99€ in cents\n yearly: 19999, // 199.99€ in cents\n },\n },\n enterprise: {\n name: \"Enterprise\",\n type: \"enterprise\",\n features: {\n attachments: \"all\",\n auditTrail: true,\n ldapSync: true,\n customContexts: true,\n },\n },\n};\n\nexport function getPlan(planType: PlanType): PlanConfig {\n return PLANS[planType] || PLANS.free;\n}\n\nexport const PLAN_LIMITS: Record<PlanType, PlanLimits> = {\n free: {\n tasksPerDay: 100,\n members: 3,\n apiKeys: 3,\n groups: 3,\n auditLogRetention: 30,\n rateLimitPerSecond: 2,\n taskRetentionDays: 7,\n },\n pro: {\n tasksPerDay: 1000,\n members: 20,\n apiKeys: 20,\n groups: 20,\n auditLogRetention: 365,\n rateLimitPerSecond: 25,\n taskRetentionDays: 30,\n },\n enterprise: {\n tasksPerDay: UNLIMITED,\n members: UNLIMITED,\n apiKeys: UNLIMITED,\n groups: UNLIMITED,\n auditLogRetention: UNLIMITED,\n rateLimitPerSecond: 25,\n taskRetentionDays: UNLIMITED,\n },\n};\n\n/** True when a limit value represents \"no limit\". */\nexport function isUnlimited(value: number): boolean {\n return value < 0;\n}\n\n/** Normalize an arbitrary plan string to a known {@link PlanType}. */\nexport function normalizePlanType(planType: string | null | undefined): PlanType {\n if (planType === \"pro\" || planType === \"enterprise\") {\n return planType;\n }\n return \"free\";\n}\n\n/** Resolve the runtime limits for a plan, falling back to `free`. */\nexport function getPlanLimits(planType: string | null | undefined): PlanLimits {\n return PLAN_LIMITS[normalizePlanType(planType)];\n}\n\n/**\n * Resolve the effective limits for a tenant: plan defaults with any per-tenant\n * {@link PlanLimitsOverride} applied on top. `undefined` override fields are\n * ignored so partial overrides only replace the values they specify.\n */\nexport function resolvePlanLimits(\n planType: string | null | undefined,\n overrides?: PlanLimitsOverride | null\n): PlanLimits {\n const base = getPlanLimits(planType);\n if (!overrides) {\n return base;\n }\n\n const resolved: PlanLimits = { ...base };\n for (const key of Object.keys(overrides) as (keyof PlanLimits)[]) {\n const value = overrides[key];\n if (typeof value === \"number\") {\n resolved[key] = value;\n }\n }\n return resolved;\n}\n","/** Delays between handler delivery attempts (after attempts 1–7). */\nexport const HANDLER_RETRY_DELAYS_MS = [\n 60_000, // 1m\n 300_000, // 5m\n 1_800_000, // 30m\n 3_600_000, // 1h\n 21_600_000, // 6h\n 86_400_000, // 24h\n 172_800_000, // 48h\n] as const;\n\nexport const HANDLER_MAX_ATTEMPTS = HANDLER_RETRY_DELAYS_MS.length + 1;\n\nexport const HANDLER_FETCH_TIMEOUT_MS = 30_000;\n\nexport function handlerRetryDelayMs(failedAttempt: number): number | null {\n if (failedAttempt < 1 || failedAttempt >= HANDLER_MAX_ATTEMPTS) {\n return null;\n }\n return HANDLER_RETRY_DELAYS_MS[failedAttempt - 1] ?? null;\n}\n\nexport function isRetriableHandlerFailure(\n statusCode: number | undefined,\n _error?: string\n): boolean {\n if (statusCode === undefined) {\n return true;\n }\n if (statusCode >= 200 && statusCode < 300) {\n return false;\n }\n if (statusCode === 408 || statusCode === 429) {\n return true;\n }\n if (statusCode >= 500) {\n return true;\n }\n return false;\n}\n","/** ISO date (YYYY-MM-DD) identifying the published Terms of Service version. Bump when terms change. */\nexport const CURRENT_TERMS_VERSION = \"2025-06-23\";\n\n/** Human-readable date for legal pages and UI. Keep in sync with CURRENT_TERMS_VERSION. */\nexport const CURRENT_TERMS_LAST_UPDATED = \"June 23, 2025\";\n\nexport const TERMS_URL = \"https://robotrock.io/terms\";\n","import type { TaskContextInput } from \"./schemas/task\";\n\nconst WELCOME_TASK_TYPE = \"welcome\";\n\nfunction docsPath(docsBaseUrl: string, path: string): string {\n const base = docsBaseUrl.replace(/\\/$/, \"\");\n if (!path || path === \"/\") {\n return `${base}/`;\n }\n return `${base}/${path.replace(/^\\//, \"\")}`;\n}\n\nfunction appAssetPath(appBaseUrl: string, path: string): string {\n const base = appBaseUrl.replace(/\\/$/, \"\");\n return `${base}/${path.replace(/^\\//, \"\")}`;\n}\n\n/** Task type used for idempotent welcome-task seeding. */\nexport const WELCOME_TASK_TYPE_ID = WELCOME_TASK_TYPE;\n\n/** Short summary shown in the inbox list and task detail header. */\nexport const WELCOME_TASK_INBOX_DESCRIPTION =\n \"Thanks for trying RobotRock — we're glad you're here.\";\n\nexport const WELCOME_TASK_HERO_BASENAME = \"robot-welcome\";\n\n/** Build the onboarding task shown in new workspaces. */\nexport function buildWelcomeTaskContext(\n docsBaseUrl: string,\n appBaseUrl = \"https://app.robotrock.io\"\n): TaskContextInput {\n const gettingStartedUrl = docsPath(docsBaseUrl, \"/\");\n const taskExamplesUrl = docsPath(docsBaseUrl, \"/task-examples/support-ticket\");\n const vercelAiUrl = docsPath(docsBaseUrl, \"/integrations/vercel-ai\");\n const vercelWorkflowUrl = docsPath(docsBaseUrl, \"/integrations/vercel-workflow\");\n const triggerUrl = docsPath(docsBaseUrl, \"/integrations/trigger\");\n const mcpUrl = docsPath(docsBaseUrl, \"/integrations/mcp\");\n const skillsUrl = docsPath(docsBaseUrl, \"/integrations/skills\");\n const heroImageUrl = appAssetPath(\n appBaseUrl,\n `/illustrations/${WELCOME_TASK_HERO_BASENAME}.png`\n );\n\n return {\n type: WELCOME_TASK_TYPE,\n name: \"Welcome to RobotRock\",\n description: WELCOME_TASK_INBOX_DESCRIPTION,\n context: {\n data: {\n hero: heroImageUrl,\n learnMore: `Your workspace is ready. This inbox is where your team steps in when an AI agent needs a human: approvals, reviews, questions, and anything else that shouldn't run on autopilot. You're looking at an example of what those tasks look like.\n\nWhen you're ready to integrate, the docs walk you through installation, your first \\`sendToHuman\\` call, and connecting your app.\n\n- **[Getting started guide](${gettingStartedUrl})** — install the SDK, add an API key, and send your first task\n- **[Task examples](${taskExamplesUrl})** — real-world patterns you can preview and try\n\n**Integrations**\n\n- [Vercel AI](${vercelAiUrl})\n- [Vercel Workflow](${vercelWorkflowUrl})\n- [Trigger.dev](${triggerUrl}) — durable HITL waits in background tasks; connect eve agents under Settings → Integrations → eve for the Agents page\n- [MCP](${mcpUrl})\n- [Agent skills](${skillsUrl})`,\n },\n ui: {\n hero: {\n \"ui:title\": \"\",\n \"ui:widget\": \"image\",\n },\n learnMore: {\n \"ui:title\": \"\",\n \"ui:widget\": \"markdown\",\n },\n },\n },\n actions: [\n {\n id: \"mark-done\",\n title: \"Mark as done\",\n description: \"Clear this welcome task from your open inbox.\",\n schema: {\n type: \"object\",\n properties: {},\n },\n },\n ],\n };\n}\n","export const PRODUCTION_APP_URL = \"https://app.robotrock.io\";\nexport const DEV_APP_URL = \"http://localhost:4004\";\nexport const PRODUCTION_API_URL = \"https://api.robotrock.io/v1\";\nexport const DEV_API_URL = \"http://localhost:4001/v1\";\nexport const DEV_DOCS_URL = \"http://localhost:4002\";\n\n/** Local dev server ports for all RobotRock apps (4000–4008). */\nexport const DEV_PORTS = {\n marketing: 4000,\n api: 4001,\n docs: 4002,\n status: 4003,\n app: 4004,\n admin: 4005,\n triggerTest: 4006,\n workflowTest: 4007,\n mcp: 4008,\n} as const;\n\n/** Production signup URL (stable constant for tests and production defaults). */\nexport const APP_SIGNUP_URL = `${PRODUCTION_APP_URL}/sign-up`;\n\nfunction readExplicitAppUrl(): string | undefined {\n const url =\n process.env.NEXT_PUBLIC_APP_URL?.trim() ||\n process.env.NEXT_PUBLIC_APP_PREVIEW_URL?.trim();\n return url ? url.replace(/\\/$/, \"\") : undefined;\n}\n\n/** Dashboard origin — localhost:4004 in dev unless overridden via env. */\nexport function getAppBaseUrl(): string {\n const explicit = readExplicitAppUrl();\n if (explicit) return explicit;\n if (process.env.NODE_ENV === \"development\") {\n return DEV_APP_URL;\n }\n return PRODUCTION_APP_URL;\n}\n\nexport function getAppSignupBaseUrl(): string {\n return `${getAppBaseUrl()}/sign-up`;\n}\n\n/** Ensure the RobotRock API base URL ends with `/v1` (no trailing slash). */\nexport function normalizeRobotRockApiBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n if (trimmed.endsWith(\"/v1\")) {\n return trimmed;\n }\n return `${trimmed}/v1`;\n}\n\n/**\n * RobotRock API origin for SDK / agent hooks.\n * Local dev defaults to `http://localhost:4001/v1` unless overridden.\n */\nexport function getRobotRockApiBaseUrl(): string {\n const explicit =\n process.env.ROBOTROCK_BASE_URL?.trim() ||\n process.env.ROBOTROCK_API_URL?.trim();\n if (explicit) {\n return normalizeRobotRockApiBaseUrl(explicit);\n }\n if (process.env.NODE_ENV === \"production\") {\n return PRODUCTION_API_URL;\n }\n return DEV_API_URL;\n}\n","import { z } from \"zod\";\nimport { getAppBaseUrl } from \"../app-url\";\n\nexport { APP_SIGNUP_URL } from \"../app-url\";\n\nexport const ATTRIBUTION_COOKIE_NAME = \"rr_attribution\";\nexport const ATTRIBUTION_COOKIE_MAX_AGE = 60 * 60 * 24 * 90; // 90 days\nexport const ATTRIBUTION_COOKIE_DOMAIN = \".robotrock.io\";\n\nconst UTM_PARAM_MAP = {\n utm_source: \"utmSource\",\n utm_medium: \"utmMedium\",\n utm_campaign: \"utmCampaign\",\n utm_content: \"utmContent\",\n utm_term: \"utmTerm\",\n gclid: \"gclid\",\n} as const;\n\nexport const attributionSchema = z.object({\n utmSource: z.string().optional(),\n utmMedium: z.string().optional(),\n utmCampaign: z.string().optional(),\n utmContent: z.string().optional(),\n utmTerm: z.string().optional(),\n gclid: z.string().optional(),\n landingUrl: z.string().optional(),\n referrer: z.string().optional(),\n capturedAt: z.number(),\n});\n\nexport type Attribution = z.infer<typeof attributionSchema>;\n\nexport function hasAttributionSignal(attribution: Partial<Attribution>): boolean {\n return Boolean(\n attribution.utmSource ||\n attribution.utmMedium ||\n attribution.utmCampaign ||\n attribution.utmContent ||\n attribution.utmTerm ||\n attribution.gclid\n );\n}\n\nexport function parseAttributionFromSearchParams(\n params: URLSearchParams | Record<string, string | string[] | undefined>\n): Partial<Attribution> {\n const getParam = (key: string): string | undefined => {\n if (params instanceof URLSearchParams) {\n return params.get(key)?.trim() || undefined;\n }\n const value = params[key];\n if (Array.isArray(value)) {\n return value[0]?.trim() || undefined;\n }\n return value?.trim() || undefined;\n };\n\n const result: Partial<Attribution> = {};\n\n for (const [param, field] of Object.entries(UTM_PARAM_MAP)) {\n const value = getParam(param);\n if (value) {\n result[field as keyof typeof UTM_PARAM_MAP & keyof Partial<Attribution>] =\n value;\n }\n }\n\n return result;\n}\n\nexport function buildAttributionFromRequest(input: {\n searchParams: URLSearchParams;\n landingUrl?: string;\n referrer?: string;\n capturedAt?: number;\n}): Attribution | null {\n const parsed = parseAttributionFromSearchParams(input.searchParams);\n if (!hasAttributionSignal(parsed)) {\n return null;\n }\n\n return attributionSchema.parse({\n ...parsed,\n landingUrl: input.landingUrl,\n referrer: input.referrer || undefined,\n capturedAt: input.capturedAt ?? Date.now(),\n });\n}\n\nexport function serializeAttributionCookie(attribution: Attribution): string {\n return encodeURIComponent(JSON.stringify(attribution));\n}\n\nexport function parseAttributionCookie(raw: string | undefined | null): Attribution | null {\n if (!raw) return null;\n\n const candidates = [raw];\n try {\n const decoded = decodeURIComponent(raw);\n if (decoded !== raw) {\n candidates.push(decoded);\n }\n } catch {\n // Keep only the raw value.\n }\n\n for (const candidate of candidates) {\n try {\n const parsed = attributionSchema.parse(JSON.parse(candidate));\n if (hasAttributionSignal(parsed)) {\n return parsed;\n }\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nexport function formatAttributionCampaign(\n attribution: Partial<Attribution> | null | undefined\n): string | null {\n if (!attribution) return null;\n return attribution.utmCampaign ?? attribution.utmSource ?? null;\n}\n\nexport function appendAttributionToUrl(\n baseUrl: string,\n attribution: Partial<Attribution> | null | undefined,\n origin = getAppBaseUrl()\n): string {\n if (!attribution || !hasAttributionSignal(attribution)) {\n return baseUrl;\n }\n\n const url = baseUrl.startsWith(\"http\")\n ? new URL(baseUrl)\n : new URL(baseUrl, origin);\n const paramEntries: Array<[string, string | undefined]> = [\n [\"utm_source\", attribution.utmSource],\n [\"utm_medium\", attribution.utmMedium],\n [\"utm_campaign\", attribution.utmCampaign],\n [\"utm_content\", attribution.utmContent],\n [\"utm_term\", attribution.utmTerm],\n [\"gclid\", attribution.gclid],\n ];\n\n for (const [param, value] of paramEntries) {\n if (value) {\n url.searchParams.set(param, value);\n }\n }\n\n return baseUrl.startsWith(\"http\")\n ? url.toString()\n : `${url.pathname}${url.search}${url.hash}`;\n}\n\nexport function getAttributionCookieDomain(hostname: string): string | undefined {\n if (hostname === \"localhost\" || hostname.endsWith(\".localhost\")) {\n return undefined;\n }\n if (hostname === \"robotrock.io\" || hostname.endsWith(\".robotrock.io\")) {\n return ATTRIBUTION_COOKIE_DOMAIN;\n }\n return undefined;\n}\n","export const AGENT_SERVICE_AUTH_FAILURE_CODES = [\n \"invalid_service_token\",\n \"tenant_not_found\",\n \"connection_not_found\",\n \"connection_not_robotrock_ready\",\n \"origin_mismatch\",\n \"deployment_not_verified\",\n] as const;\n\nexport type AgentServiceAuthFailureCode =\n (typeof AGENT_SERVICE_AUTH_FAILURE_CODES)[number];\n\nconst AGENT_SERVICE_AUTH_HINTS: Record<AgentServiceAuthFailureCode, string> = {\n invalid_service_token:\n \"Check ROBOTROCK_AGENT_SERVICE_TOKEN on the agent matches the active token in Developer → Agents.\",\n tenant_not_found:\n \"The workspace slug in the chat session does not match a RobotRock tenant.\",\n connection_not_found:\n \"Connect this workspace to the agent in Settings → Agents.\",\n connection_not_robotrock_ready:\n \"Finish workspace connection setup in Settings → Agents.\",\n origin_mismatch:\n \"The workspace connection URL must match the verified deployment URL in Developer → Agents.\",\n deployment_not_verified:\n \"Verify the agent at Developer → Agents before using hosted multi-tenant auth.\",\n};\n\nexport function agentServiceAuthHint(\n code: AgentServiceAuthFailureCode\n): string {\n return AGENT_SERVICE_AUTH_HINTS[code];\n}\n\nexport function redactServiceTokenPrefix(token: string): string {\n const trimmed = token.trim();\n if (!trimmed) {\n return \"(empty)\";\n }\n if (trimmed.length <= 8) {\n return `${trimmed.slice(0, 4)}…`;\n }\n return `${trimmed.slice(0, 12)}…`;\n}\n","// Re-export all schemas\nexport * from \"./schemas/index\";\n\n// Re-export all types\nexport * from \"./types/index\";\n\n// Re-export all utils\nexport * from \"./utils/index\";\n\n// Re-export plan limits\nexport * from \"./plans/index\";\n\n// Handler webhook retry policy\nexport * from \"./handler-retry\";\n\n// Legal constants (terms version, URLs)\nexport * from \"./legal\";\n\n// Onboarding welcome task for new workspaces\nexport * from \"./welcome-task\";\n\n// Marketing attribution (UTM / gclid capture)\nexport * from \"./attribution/index\";\n\n// Dev/prod app URLs and port constants\nexport * from \"./app-url\";\n\n// Agent service auth diagnostics\nexport * from \"./agent-service-auth\";\n","import type { DiscriminatedApprovalResult, Task } from \"./schemas/index.js\";\n\nexport class TaskTimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TaskTimeoutError\";\n }\n}\n\nexport class TaskExpiredError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TaskExpiredError\";\n }\n}\n\n/**\n * Map a handled API task to a discriminated approval result.\n * Runtime validation is minimal; TypeScript narrows via `task.actions` at the call site.\n */\nexport function toDiscriminatedApprovalResult<A extends readonly { id: string; schema?: unknown }[]>(\n actions: A,\n task: Task\n): DiscriminatedApprovalResult<A> {\n void actions;\n\n if (!task.handled) {\n throw new Error(\"Task has no handled result\");\n }\n\n return {\n actionId: task.handled.action.id,\n data: task.handled.action.data,\n handledBy: task.handled.handledBy,\n handledAt: new Date(task.handledAt ?? Date.now()),\n taskId: task.id,\n } as DiscriminatedApprovalResult<A>;\n}\n","export class RobotRockError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly response?: unknown\n ) {\n super(message);\n this.name = \"RobotRockError\";\n }\n}\n\ntype ParsedResponseBody = Record<string, unknown> | unknown[] | string | null;\n\nexport async function parseResponseBody(\n response: Response\n): Promise<ParsedResponseBody> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const bodyText = await response.text();\n\n if (!bodyText) {\n return null;\n }\n\n if (contentType.toLowerCase().includes(\"application/json\")) {\n try {\n return JSON.parse(bodyText) as ParsedResponseBody;\n } catch {\n // Fall through and return text body below so error messages stay useful.\n }\n }\n\n try {\n return JSON.parse(bodyText) as ParsedResponseBody;\n } catch {\n return bodyText;\n }\n}\n\nexport function getErrorMessage(\n data: ParsedResponseBody,\n fallback: string\n): string {\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const record = data as Record<string, unknown>;\n const maybeMessage = record.message;\n const maybeHint = record.hint;\n if (typeof maybeMessage === \"string\" && maybeMessage.trim()) {\n if (typeof maybeHint === \"string\" && maybeHint.trim()) {\n return `${maybeMessage.trim()} ${maybeHint.trim()}`;\n }\n return maybeMessage;\n }\n }\n\n if (typeof data === \"string\" && data.trim()) {\n const compact = data.replace(/\\s+/g, \" \").trim();\n const snippet = compact.length > 180 ? `${compact.slice(0, 180)}...` : compact;\n return `${fallback}. Server returned non-JSON response: ${snippet}`;\n }\n\n return fallback;\n}\n","export type RobotRockAuthConfig =\n | { kind: \"apiKey\"; apiKey: string; actingUserId?: string }\n | {\n kind: \"agentService\";\n token: string;\n tenantSlug: string;\n connectionId: string;\n actingUserId?: string;\n };\n\nexport const ROBOTROCK_ACTING_USER_ID_HEADER = \"x-robotrock-acting-user-id\";\n\nexport function buildRobotRockAuthHeaders(\n auth: RobotRockAuthConfig\n): Record<string, string> {\n if (auth.kind === \"apiKey\") {\n const headers: Record<string, string> = {\n \"X-Api-Key\": auth.apiKey,\n };\n if (auth.actingUserId?.trim()) {\n headers[ROBOTROCK_ACTING_USER_ID_HEADER] = auth.actingUserId.trim();\n }\n return headers;\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${auth.token}`,\n \"X-RobotRock-Tenant-Slug\": auth.tenantSlug,\n \"X-RobotRock-Connection-Id\": auth.connectionId,\n };\n\n if (auth.actingUserId?.trim()) {\n headers[ROBOTROCK_ACTING_USER_ID_HEADER] = auth.actingUserId.trim();\n }\n\n return headers;\n}\n\nexport function resolveRobotRockAuthConfig(overrides?: {\n apiKey?: string;\n agentService?: {\n token: string;\n tenantSlug: string;\n connectionId: string;\n actingUserId?: string;\n };\n}): RobotRockAuthConfig {\n if (overrides?.agentService) {\n return {\n kind: \"agentService\",\n ...overrides.agentService,\n };\n }\n\n const apiKey = overrides?.apiKey ?? process.env.ROBOTROCK_API_KEY;\n if (!apiKey) {\n throw new Error(\n \"RobotRock auth is required. Set ROBOTROCK_API_KEY, ROBOTROCK_AGENT_SERVICE_TOKEN with tenant context, or pass auth when creating the client.\"\n );\n }\n\n return { kind: \"apiKey\", apiKey };\n}\n","export const ROBOTROCK_CHAT_ID_HEADER = \"x-robotrock-chat-id\";\nexport const ROBOTROCK_EVE_SESSION_ID_HEADER = \"x-robotrock-eve-session-id\";\n\nexport type ChatCorrelation = {\n chatId?: string;\n eveSessionId?: string;\n};\n\n/** Resolve chat correlation from env (programmatic / cron chats). */\nexport function resolveChatCorrelationFromEnv(): ChatCorrelation | undefined {\n const chatId = process.env.ROBOTROCK_CHAT_ID?.trim();\n const eveSessionId = process.env.ROBOTROCK_EVE_SESSION_ID?.trim();\n if (!chatId && !eveSessionId) {\n return undefined;\n }\n return {\n ...(chatId ? { chatId } : {}),\n ...(eveSessionId ? { eveSessionId } : {}),\n };\n}\n\n/** Attach chat correlation headers when a chat context is known. */\nexport function buildChatCorrelationHeaders(\n correlation?: ChatCorrelation\n): Record<string, string> {\n if (!correlation) {\n return {};\n }\n\n const headers: Record<string, string> = {};\n const chatId = correlation.chatId?.trim();\n const eveSessionId = correlation.eveSessionId?.trim();\n\n if (chatId) {\n headers[ROBOTROCK_CHAT_ID_HEADER] = chatId;\n }\n if (eveSessionId) {\n headers[ROBOTROCK_EVE_SESSION_ID_HEADER] = eveSessionId;\n }\n\n return headers;\n}\n","import {\n agentChatAuditInputBodySchema,\n agentChatAuditToolBodySchema,\n agentChatLinkTaskBodySchema,\n agentChatStageHitlBodySchema,\n createAgentChatBodySchema,\n type AgentChatAuditInputBody,\n type AgentChatAuditToolBody,\n type AgentChatLinkTaskBody,\n type AgentChatSeedMessage,\n type AgentChatStageHitlBody,\n} from \"@robotrock/core\";\nimport { RobotRockError, getErrorMessage, parseResponseBody } from \"./http.js\";\nimport {\n buildRobotRockAuthHeaders,\n type RobotRockAuthConfig,\n} from \"./auth-headers.js\";\nimport {\n buildChatCorrelationHeaders,\n type ChatCorrelation,\n} from \"./chat-correlation.js\";\n\n/** A chat created via {@link ChatsApi.create}. */\nexport type CreatedChat = {\n chatId: string;\n sessionId: string;\n userId?: string;\n agentIdentifier: string;\n deepLink: string;\n};\n\nexport type CreateChatResult = {\n tenantSlug: string;\n chats: CreatedChat[];\n};\n\nexport type CreateChatInput = {\n /** Agent to run the chat. Required unless `parentChatId` is provided. */\n agentIdentifier?: string;\n /** Spawn a chat from an existing chat; inherits its agent/app/owner and links audit. */\n parentChatId?: string;\n /** Trigger connection id to run the chat under (defaults to the tenant's). */\n connectionId?: string;\n /** Inbox app bucket. Overrides the client `app` when set. */\n app?: string;\n /** Email of the user who owns the chat. Required unless `parentChatId` is set. */\n ownerEmail?: string;\n /** Chat title shown in the inbox. */\n title: string;\n /** Seed messages to preload the conversation. Defaults to a welcome message. */\n messages?: AgentChatSeedMessage[];\n /** How the chat was created (statistics/audit). @default \"api\" */\n source?: string;\n};\n\nexport type CloseChatOptions = {\n /** Optional human-readable reason recorded on the audit trail. */\n reason?: string;\n};\n\nexport type LogChatToolExecutionInput = AgentChatAuditToolBody;\n\nexport type LogChatInputSubmissionInput = AgentChatAuditInputBody;\n\nexport type StageChatHitlRequestsInput = AgentChatStageHitlBody;\n\nexport type LinkChatTaskInput = AgentChatLinkTaskBody;\n\nexport type StagedChatHitlRequest = StageChatHitlRequestsInput[\"requests\"][number];\n\nexport interface ChatsApi {\n /** Create an agent chat owned by a single user. */\n create(input: CreateChatInput): Promise<CreateChatResult>;\n /** Close (archive) a chat by its public chatId — e.g. when an agent is done. */\n close(chatId: string, options?: CloseChatOptions): Promise<void>;\n /** Persist pending Eve HITL requests on the chat for durable audit logging. */\n stageHitlRequests(input: StageChatHitlRequestsInput): Promise<void>;\n /** Read pending Eve HITL requests staged on the chat. */\n getStagedHitlRequests(eveSessionId: string): Promise<StagedChatHitlRequest[]>;\n /** Log an Eve HITL choice to the RobotRock chat audit trail. */\n logInputSubmission(input: LogChatInputSubmissionInput): Promise<void>;\n /** Log a mutating Eve tool execution to the RobotRock chat audit trail. */\n logToolExecution(input: LogChatToolExecutionInput): Promise<void>;\n /** Link an inbox task to the originating Eve chat session. */\n linkTask(input: LinkChatTaskInput): Promise<void>;\n}\n\n/**\n * Build the `client.chats` namespace. Mirrors the `client.tasks` surface for the\n * long-lived chat resource, so a single client creates both tasks and chats.\n */\nexport function createChatsApi(config: {\n baseUrl: string;\n auth: RobotRockAuthConfig;\n app?: string;\n chatCorrelation?: ChatCorrelation;\n}): ChatsApi {\n const headers = (): Record<string, string> => ({\n \"Content-Type\": \"application/json\",\n ...buildRobotRockAuthHeaders(config.auth),\n ...buildChatCorrelationHeaders(config.chatCorrelation),\n });\n\n return {\n async create(input: CreateChatInput): Promise<CreateChatResult> {\n const bodyPayload = {\n ...input,\n app: input.app ?? config.app,\n messages: input.messages ?? [],\n };\n const validation = createAgentChatBodySchema.safeParse(bodyPayload);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid chat: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to create chat\"),\n response.status,\n data\n );\n }\n\n const result = data as unknown as CreateChatResult;\n return { tenantSlug: result.tenantSlug, chats: result.chats };\n },\n\n async close(chatId: string, options?: CloseChatOptions): Promise<void> {\n if (!chatId) {\n throw new RobotRockError(\"chatId is required to close a chat\", 400);\n }\n\n const response = await fetch(\n `${config.baseUrl}/agent-chats/${encodeURIComponent(chatId)}/close`,\n {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ reason: options?.reason }),\n }\n );\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to close chat\"),\n response.status,\n data\n );\n }\n },\n\n async stageHitlRequests(input: StageChatHitlRequestsInput): Promise<void> {\n const validation = agentChatStageHitlBodySchema.safeParse(input);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid stage HITL input: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats/stage-hitl`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to stage chat HITL requests\"),\n response.status,\n data\n );\n }\n },\n\n async getStagedHitlRequests(eveSessionId: string): Promise<StagedChatHitlRequest[]> {\n const trimmed = eveSessionId.trim();\n if (!trimmed) {\n throw new RobotRockError(\"eveSessionId is required\", 400);\n }\n\n const url = new URL(`${config.baseUrl}/agent-chats/staged-hitl`);\n url.searchParams.set(\"eveSessionId\", trimmed);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: headers(),\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to fetch staged chat HITL requests\"),\n response.status,\n data\n );\n }\n\n const requests = (data as { requests?: StagedChatHitlRequest[] }).requests;\n return Array.isArray(requests) ? requests : [];\n },\n\n async logInputSubmission(input: LogChatInputSubmissionInput): Promise<void> {\n const validation = agentChatAuditInputBodySchema.safeParse(input);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid audit input: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats/audit-input`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to log chat input submission\"),\n response.status,\n data\n );\n }\n },\n\n async logToolExecution(input: LogChatToolExecutionInput): Promise<void> {\n const validation = agentChatAuditToolBodySchema.safeParse(input);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid audit tool input: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats/audit-tool`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to log chat tool execution\"),\n response.status,\n data\n );\n }\n },\n\n async linkTask(input: LinkChatTaskInput): Promise<void> {\n const validation = agentChatLinkTaskBodySchema.safeParse(input);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid link task input: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats/link-task`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to link inbox task to chat\"),\n response.status,\n data\n );\n }\n },\n };\n}\n","import {\n type AssignToInput,\n type TaskContextInput,\n createTaskBodySchema,\n threadUpdateBodySchema,\n TASK_CONTEXT_FORMAT_VERSION,\n} from \"./schemas/index.js\";\nimport {\n type AgentAdminTaskSummary,\n listTasksQuerySchema,\n} from \"@robotrock/core\";\nimport type { z } from \"zod\";\nimport {\n TaskExpiredError,\n TaskTimeoutError,\n toDiscriminatedApprovalResult,\n} from \"./approval-result.js\";\nimport { RobotRockError, getErrorMessage, parseResponseBody } from \"./http.js\";\nimport { getRobotRockApiBaseUrl } from \"@robotrock/core\";\nimport { createChatsApi, type ChatsApi } from \"./chats.js\";\nimport {\n buildRobotRockAuthHeaders,\n resolveRobotRockAuthConfig,\n type RobotRockAuthConfig,\n} from \"./auth-headers.js\";\nimport {\n buildChatCorrelationHeaders,\n type ChatCorrelation,\n} from \"./chat-correlation.js\";\nimport type {\n DiscriminatedApprovalResult,\n Task,\n TaskPriority,\n TaskResponse,\n ThreadUpdate,\n ThreadUpdateResponse,\n ThreadUpdateStatus,\n TaskContextFormatVersion,\n} from \"./schemas/index.js\";\n\nexport type RobotRockWebhookConfig = {\n url: string;\n headers?: Record<string, string>;\n};\n\nexport interface RobotRockPollingOptions {\n /** Poll interval when no webhook is configured (ms). @default 2000 */\n intervalMs?: number;\n /**\n * Max time to poll when no webhook is configured (ms).\n * Polling also stops when the task's `validUntil` passes, whichever is sooner.\n * @default 86400000 (24h)\n */\n timeoutMs?: number;\n};\n\n/** Advanced client settings rarely changed by integrators. */\nexport type RobotRockAdvancedConfig = {\n /** Task context wire format version sent on every request. @default 2 */\n contextVersion?: TaskContextFormatVersion;\n};\n\ntype RobotRockClientBaseConfig = {\n /** Optional chat correlation headers for audit logging from agent sessions. */\n chatCorrelation?: ChatCorrelation;\n /** Optional override for API key. Falls back to ROBOTROCK_API_KEY when agentService is unset. */\n apiKey?: string;\n /** Hosted-agent service auth (mutually exclusive with apiKey). */\n agentService?: {\n token: string;\n tenantSlug: string;\n connectionId: string;\n actingUserId?: string;\n };\n /**\n * Base URL for the RobotRock API\n * @default \"https://api.robotrock.io/v1\"\n */\n baseUrl?: string;\n /**\n * Default inbox app bucket for every task from this client.\n * When omitted, the API uses your API key name.\n */\n app?: string;\n /**\n * Agent release version (semver, git SHA, deploy tag).\n * Defaults to `AGENT_VERSION` or `ROBOTROCK_AGENT_VERSION` from env when omitted.\n */\n version?: string;\n /** Advanced settings (context wire format, etc.). */\n advanced?: RobotRockAdvancedConfig;\n};\n\n/** Client config with a webhook (mutually exclusive with `polling`). */\nexport type RobotRockWebhookClientConfig = RobotRockClientBaseConfig & {\n webhook: RobotRockWebhookConfig;\n polling?: never;\n};\n\n/** Client config without a webhook; optional `polling` controls the wait loop. */\nexport type RobotRockPollingClientConfig = RobotRockClientBaseConfig & {\n webhook?: never;\n polling?: RobotRockPollingOptions;\n};\n\nexport type RobotRockConfig = RobotRockWebhookClientConfig | RobotRockPollingClientConfig;\n\nexport type SendToHumanActionInput = Omit<TaskContextInput[\"actions\"][number], \"handlers\">;\n\nexport type SendToHumanValidUntil = Date | string;\n\nexport type SendToHumanInput<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = Omit<TaskContextInput, \"app\" | \"actions\" | \"contextVersion\" | \"version\" | \"validUntil\"> & {\n actions: A;\n /** Task deadline; serialized to an ISO 8601 string on the wire. */\n validUntil?: SendToHumanValidUntil;\n /** Optional idempotency key to prevent duplicate tasks */\n idempotencyKey?: string;\n /** Assign to tenant users (email) and/or groups (slug). Narrows inbox visibility. */\n assignTo?: AssignToInput;\n /**\n * Groups related tasks together in the inbox. Omit to let the server generate\n * one (returned as `task.threadId`) and reuse it on later tasks in the thread.\n */\n threadId?: string;\n /**\n * Optional thread priority. When set, applies to the whole thread and\n * overwrites any previous priority. Omit on later tasks to leave unchanged.\n */\n priority?: TaskPriority;\n /**\n * Optional initial status update logged against the task's thread. Shows in\n * the inbox status bar and the thread update log.\n */\n update?: {\n /** A short status update (1-2 sentences). */\n message: string;\n /** Lifecycle status for the icon/color in the status bar. @default \"info\" */\n status?: ThreadUpdateStatus;\n };\n /**\n * Agent release version override. When omitted, uses the client `version`.\n * Used for statistics and feedback analysis.\n */\n version?: string;\n};\n\ntype SendToHumanWithAppInput<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = (SendToHumanInput<A> | Readonly<SendToHumanInput<A>>) & {\n /** Inbox app bucket. Overrides the client `app` when set. */\n app?: string;\n};\n\nexport type SendUpdateInput = {\n /** The thread to log the update against (from `task.threadId`). */\n threadId: string;\n /** A short status update (1-2 sentences). */\n message: string;\n /** Lifecycle status for the icon/color in the status bar. @default \"info\" */\n status?: ThreadUpdateStatus;\n};\n\nexport type SendToHumanResult<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> =\n | {\n mode: \"created\";\n task: TaskResponse[\"task\"];\n }\n | ({\n mode: \"handled\";\n task: TaskResponse[\"task\"];\n } & DiscriminatedApprovalResult<A>);\n\nconst DEFAULT_POLL_INTERVAL_MS = 2_000;\nconst DEFAULT_TIMEOUT_MS = 24 * 60 * 60 * 1_000;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction resolveAgentVersionFromEnv(): string | undefined {\n const fromEnv =\n process.env.AGENT_VERSION?.trim() || process.env.ROBOTROCK_AGENT_VERSION?.trim();\n return fromEnv || undefined;\n}\n\nfunction parseValidUntilMs(value: string | number | Date | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value instanceof Date) {\n const ms = value.getTime();\n return Number.isNaN(ms) ? undefined : ms;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nfunction serializeValidUntil(value: SendToHumanValidUntil): string {\n if (value instanceof Date) {\n const ms = value.getTime();\n if (Number.isNaN(ms)) {\n throw new RobotRockError(\"Invalid validUntil: Date is invalid\", 400);\n }\n return value.toISOString();\n }\n\n if (typeof value === \"string\" && !Number.isNaN(Date.parse(value))) {\n return new Date(value).toISOString();\n }\n\n throw new RobotRockError(\"Invalid validUntil: expected a Date or parseable date string\", 400);\n}\n\nexport { RobotRockError } from \"./http.js\";\n\nexport type ListTasksInput = z.infer<typeof listTasksQuerySchema>;\n\nexport type SearchTasksInput = {\n q: string;\n limit?: number;\n};\n\n/** Task CRUD surface, exposed as `client.tasks`. */\nexport interface TasksApi {\n /** Create a task via POST /v1 without waiting for a human response. */\n create<const A extends readonly SendToHumanActionInput[]>(\n task: SendToHumanWithAppInput<A>\n ): Promise<TaskResponse[\"task\"]>;\n /** Get a task by public task id. */\n get(taskId: string): Promise<Task | null>;\n /** Cancel a task by public task id. */\n cancel(taskId: string): Promise<void>;\n /** Log a status update against a thread. */\n sendUpdate(input: SendUpdateInput): Promise<ThreadUpdate>;\n /** List tasks in the workspace for this API key. */\n list(input?: ListTasksInput): Promise<{\n items: AgentAdminTaskSummary[];\n nextCursor: string | null;\n }>;\n /** Search tasks by type, name, description, or id. */\n search(input: SearchTasksInput): Promise<{\n items: AgentAdminTaskSummary[];\n total: number;\n }>;\n}\n\n/**\n * RobotRock API client for creating and querying human-in-the-loop tasks and\n * chats. CRUD lives under `client.tasks` and `client.chats`; the headline\n * `sendToHuman` verb stays top-level.\n */\nexport class RobotRock {\n private readonly auth: RobotRockAuthConfig;\n private readonly chatCorrelation?: ChatCorrelation;\n private readonly baseUrl: string;\n private readonly app?: string;\n private readonly agentVersion?: string;\n private readonly contextVersion: TaskContextFormatVersion;\n private readonly webhook?: RobotRockWebhookConfig;\n private readonly polling: RobotRockPollingOptions;\n\n /** Task CRUD: `create`, `get`, `cancel`, `sendUpdate`. */\n readonly tasks: TasksApi;\n /** Chat CRUD: `create`, `close`. */\n readonly chats: ChatsApi;\n\n constructor(config: RobotRockConfig) {\n if (config.webhook && config.polling) {\n throw new Error(\n \"RobotRock client cannot configure both webhook and polling. Use webhook for callbacks or polling to block until handled.\"\n );\n }\n\n const apiKey = config.apiKey ?? process.env.ROBOTROCK_API_KEY;\n const agentService = config.agentService;\n if (apiKey && agentService) {\n throw new Error(\n \"RobotRock client cannot configure both apiKey and agentService.\"\n );\n }\n\n this.auth = resolveRobotRockAuthConfig({\n ...(apiKey ? { apiKey } : {}),\n ...(agentService ? { agentService } : {}),\n });\n this.chatCorrelation = config.chatCorrelation;\n this.baseUrl = config.baseUrl ?? getRobotRockApiBaseUrl();\n this.app = config.app;\n this.agentVersion = config.version ?? resolveAgentVersionFromEnv();\n this.contextVersion =\n config.advanced?.contextVersion ?? TASK_CONTEXT_FORMAT_VERSION;\n this.webhook = config.webhook;\n this.polling = config.polling ?? {};\n\n this.tasks = {\n create: (task) => this.createTaskRequest(task),\n get: (taskId) => this.getTaskById(taskId),\n cancel: (taskId) => this.cancelTaskRequest(taskId),\n sendUpdate: (input) => this.sendThreadUpdate(input),\n list: (input) => this.listTasksRequest(input),\n search: (input) => this.searchTasksRequest(input),\n };\n this.chats = createChatsApi({\n baseUrl: this.baseUrl,\n auth: this.auth,\n app: this.app,\n chatCorrelation: this.chatCorrelation,\n });\n }\n\n private authHeaders(extra?: Record<string, string>): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n ...buildRobotRockAuthHeaders(this.auth),\n ...buildChatCorrelationHeaders(this.chatCorrelation),\n ...extra,\n };\n }\n\n private async createTaskRequest<const A extends readonly SendToHumanActionInput[]>(\n task: SendToHumanWithAppInput<A>\n ): Promise<TaskResponse[\"task\"]> {\n const normalizedTask = normalizeSendToHumanInput(task, {\n webhook: this.webhook,\n app: this.app,\n contextVersion: this.contextVersion,\n agentVersion: this.agentVersion,\n });\n const agentVersion = task.version ?? this.agentVersion;\n const bodyPayload = {\n ...normalizedTask,\n ...(task.assignTo !== undefined ? { assignTo: task.assignTo } : {}),\n ...(task.threadId !== undefined ? { threadId: task.threadId } : {}),\n ...(task.priority !== undefined ? { priority: task.priority } : {}),\n ...(task.update !== undefined ? { update: task.update } : {}),\n ...(agentVersion !== undefined ? { agent: { version: agentVersion } } : {}),\n };\n const validation = createTaskBodySchema.safeParse(bodyPayload);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid task: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const headers = this.authHeaders(\n task.idempotencyKey\n ? { \"Idempotency-Key\": task.idempotencyKey }\n : undefined\n );\n\n const response = await fetch(`${this.baseUrl}/`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(validation.data),\n });\n\n const data = await parseResponseBody(response);\n\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to create task\"),\n response.status,\n data\n );\n }\n\n return (data as unknown as TaskResponse).task;\n }\n\n async sendToHuman<const A extends readonly SendToHumanActionInput[]>(\n task: SendToHumanWithAppInput<A>\n ): Promise<SendToHumanResult<A>> {\n const normalizedTask = normalizeSendToHumanInput(task, {\n webhook: this.webhook,\n app: this.app,\n contextVersion: this.contextVersion,\n agentVersion: this.agentVersion,\n });\n const createdTaskTask = await this.createTaskRequest(task);\n const hasHandlers = normalizedTask.actions.some(\n (action) => Array.isArray(action.handlers) && action.handlers.length > 0\n );\n\n if (hasHandlers) {\n return {\n mode: \"created\",\n task: createdTaskTask,\n };\n }\n\n const timeoutMs = this.polling.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const pollIntervalMs = this.polling.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const pollingDeadline = Date.now() + timeoutMs;\n const validUntilMs = parseValidUntilMs(createdTaskTask.validUntil);\n const deadline =\n validUntilMs !== undefined ? Math.min(pollingDeadline, validUntilMs) : pollingDeadline;\n const taskId = createdTaskTask.taskId;\n\n while (Date.now() < deadline) {\n const existing = await this.getTaskById(taskId);\n\n if (existing?.status === \"handled\" && existing.handled) {\n return {\n mode: \"handled\",\n task: createdTaskTask,\n ...(toDiscriminatedApprovalResult(\n normalizedTask.actions as unknown as A,\n existing\n ) as DiscriminatedApprovalResult<A>),\n };\n }\n\n if (existing?.status === \"expired\" || (existing && Date.now() >= existing.validUntil)) {\n throw new TaskExpiredError(\"Task reached validUntil before a human completed it\");\n }\n\n const remainingMs = deadline - Date.now();\n await sleep(Math.min(pollIntervalMs, Math.max(0, remainingMs)));\n }\n\n if (validUntilMs !== undefined && Date.now() >= validUntilMs) {\n throw new TaskExpiredError(\"Task reached validUntil before a human completed it\");\n }\n\n throw new TaskTimeoutError(`No human response within ${timeoutMs}ms`);\n }\n\n /**\n * Create a task via POST /v1 without waiting for a human response.\n * @deprecated Use `client.tasks.create()` instead.\n */\n async createTask<const A extends readonly SendToHumanActionInput[]>(\n task: SendToHumanWithAppInput<A>\n ): Promise<TaskResponse[\"task\"]> {\n return this.tasks.create(task);\n }\n\n /**\n * Get a task by public task id (returned as `task.taskId` from {@link sendToHuman}).\n * @deprecated Use `client.tasks.get()` instead.\n */\n async getTask(taskId: string): Promise<Task | null> {\n return this.tasks.get(taskId);\n }\n\n /**\n * Log a status update against a thread.\n * @deprecated Use `client.tasks.sendUpdate()` instead.\n */\n async sendUpdate(input: SendUpdateInput): Promise<ThreadUpdate> {\n return this.tasks.sendUpdate(input);\n }\n\n /**\n * Cancel a task by public task id.\n * @deprecated Use `client.tasks.cancel()` instead.\n */\n async cancelTask(taskId: string): Promise<void> {\n return this.tasks.cancel(taskId);\n }\n\n private async getTaskById(taskId: string): Promise<Task | null> {\n const response = await fetch(`${this.baseUrl}/tasks/${taskId}`, {\n method: \"GET\",\n headers: this.authHeaders(),\n });\n\n if (response.status === 404) {\n return null;\n }\n\n const data = await parseResponseBody(response);\n\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to get task\"),\n response.status,\n data\n );\n }\n\n return data as unknown as Task;\n }\n\n private async sendThreadUpdate({\n threadId,\n message,\n status,\n }: SendUpdateInput): Promise<ThreadUpdate> {\n if (!threadId) {\n throw new RobotRockError(\"threadId is required to send an update\", 400);\n }\n\n const validation = threadUpdateBodySchema.safeParse({ message, status });\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid update: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(\n `${this.baseUrl}/threads/${encodeURIComponent(threadId)}/updates`,\n {\n method: \"POST\",\n headers: this.authHeaders(),\n body: JSON.stringify(validation.data),\n }\n );\n\n const data = await parseResponseBody(response);\n\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to send update\"),\n response.status,\n data\n );\n }\n\n return (data as unknown as ThreadUpdateResponse).update;\n }\n\n private async cancelTaskRequest(taskId: string): Promise<void> {\n const response = await fetch(`${this.baseUrl}/tasks/${taskId}/cancel`, {\n method: \"POST\",\n headers: this.authHeaders(),\n });\n\n if (!response.ok) {\n const data = await parseResponseBody(response);\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to cancel task\"),\n response.status,\n data\n );\n }\n }\n\n private async listTasksRequest(input?: ListTasksInput): Promise<{\n items: AgentAdminTaskSummary[];\n nextCursor: string | null;\n }> {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(input ?? {})) {\n if (value !== undefined && value !== \"\") {\n params.set(key, String(value));\n }\n }\n const suffix = params.size > 0 ? `?${params.toString()}` : \"\";\n\n const response = await fetch(`${this.baseUrl}/tasks${suffix}`, {\n method: \"GET\",\n headers: this.authHeaders(),\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to list tasks\"),\n response.status,\n data\n );\n }\n\n return data as { items: AgentAdminTaskSummary[]; nextCursor: string | null };\n }\n\n private async searchTasksRequest(input: SearchTasksInput): Promise<{\n items: AgentAdminTaskSummary[];\n total: number;\n }> {\n const params = new URLSearchParams({ q: input.q });\n if (input.limit !== undefined) {\n params.set(\"limit\", String(input.limit));\n }\n\n const response = await fetch(`${this.baseUrl}/tasks/search?${params.toString()}`, {\n method: \"GET\",\n headers: this.authHeaders(),\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to search tasks\"),\n response.status,\n data\n );\n }\n\n return data as { items: AgentAdminTaskSummary[]; total: number };\n }\n}\n\nexport function createClient(config: RobotRockConfig): RobotRock {\n return new RobotRock(config);\n}\n\nexport function attachWebhookToActions(\n actions: readonly SendToHumanActionInput[],\n webhook: RobotRockWebhookConfig\n): TaskContextInput[\"actions\"] {\n return actions.map((action) => ({\n ...action,\n handlers: webhookToHandlers(webhook),\n }));\n}\n\nfunction webhookToHandlers(\n webhook: RobotRockWebhookConfig\n): TaskContextInput[\"actions\"][number][\"handlers\"] {\n return [\n {\n type: \"webhook\" as const,\n url: webhook.url,\n headers: webhook.headers ?? {},\n },\n ];\n}\n\nfunction normalizeSendToHumanInput<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n task: SendToHumanWithAppInput<A>,\n clientDefaults: {\n webhook?: RobotRockWebhookConfig;\n app?: string;\n contextVersion: TaskContextFormatVersion;\n agentVersion?: string;\n }\n): TaskContextInput {\n const {\n actions,\n idempotencyKey: _idempotencyKey,\n assignTo: _assignTo,\n threadId: _threadId,\n priority: _priority,\n update: _update,\n version: _version,\n validUntil,\n app: taskApp,\n ...rest\n } = task;\n\n const webhook = clientDefaults.webhook;\n const normalizedActions: TaskContextInput[\"actions\"] = webhook\n ? attachWebhookToActions(actions, webhook)\n : (actions as unknown as TaskContextInput[\"actions\"]);\n\n const app = taskApp ?? clientDefaults.app;\n\n return {\n ...rest,\n contextVersion: clientDefaults.contextVersion,\n ...(app ? { app } : {}),\n ...(validUntil !== undefined ? { validUntil: serializeValidUntil(validUntil) } : {}),\n actions: normalizedActions,\n };\n}\n\n","import { createClient, type RobotRock, type RobotRockConfig } from \"./client.js\";\nimport { getRobotRockApiBaseUrl } from \"@robotrock/core\";\n\n/**\n * Read RobotRock client config from environment variables.\n *\n * - `ROBOTROCK_API_KEY` (required when not passed explicitly)\n * - `ROBOTROCK_BASE_URL` or `ROBOTROCK_API_URL` (optional)\n * - `ROBOTROCK_APP` (optional inbox app bucket)\n */\nexport function resolveRobotRockConfig(\n overrides?: Partial<RobotRockConfig>\n): RobotRockConfig {\n const agentService = overrides?.agentService;\n const apiKey = overrides?.apiKey ?? process.env.ROBOTROCK_API_KEY;\n\n if (agentService && apiKey) {\n throw new Error(\n \"RobotRock client cannot configure both apiKey and agentService.\"\n );\n }\n\n const baseUrl = overrides?.baseUrl ?? getRobotRockApiBaseUrl();\n const app = overrides?.app ?? process.env.ROBOTROCK_APP;\n\n if (agentService) {\n return app\n ? { agentService, baseUrl, app }\n : { agentService, baseUrl };\n }\n\n if (!apiKey) {\n throw new Error(\n \"RobotRock API key is required. Set ROBOTROCK_API_KEY or pass agentService when creating the client.\"\n );\n }\n\n return app ? { apiKey, baseUrl, app } : { apiKey, baseUrl };\n}\n\n/** Use an explicit client or create one from env / optional config overrides. */\nexport function resolveRobotRockClient(\n client?: RobotRock,\n configOverrides?: Partial<RobotRockConfig>\n): RobotRock {\n if (client) {\n return client;\n }\n return createClient(resolveRobotRockConfig(configOverrides));\n}\n","import {\n context,\n trace,\n SpanStatusCode,\n type Span,\n} from \"@opentelemetry/api\";\nimport type { ApprovalResult, DiscriminatedApprovalResult } from \"./schemas/index.js\";\nimport type { RobotRockHandlerWebhookPayload } from \"./handler-webhook.js\";\n\n/** Minimal span surface used by handle-time OTel recording. */\nexport type OtelSpanLike = Pick<Span, \"spanContext\" | \"setAttribute\" | \"addEvent\" | \"setStatus\" | \"end\">;\n\nconst TRACER_NAME = \"robotrock\";\nconst WAIT_SPAN_NAME = \"robotrock.wait_for_human\";\nconst HANDLED_EVENT_NAME = \"robotrock.task_handled\";\n\nconst INVALID_TRACE_ID = \"00000000000000000000000000000000\";\n\nexport type RobotRockOtelHandle = {\n traceId: string;\n spanId: string;\n taskId: string;\n taskCreatedAt: number;\n threadId?: string;\n};\n\nexport type RobotRockOtelRecordOptions = {\n handle?: RobotRockOtelHandle;\n span?: OtelSpanLike | Span | null;\n includeActionData?: boolean;\n tracerName?: string;\n};\n\nexport type RobotRockHandledOtelInput = {\n taskId: string;\n threadId?: string;\n action: { id: string; title?: string; data: unknown };\n handledBy?: string;\n handledAt: string | number | Date;\n};\n\nfunction isValidTraceId(traceId: string | undefined): traceId is string {\n return (\n typeof traceId === \"string\" &&\n traceId.length > 0 &&\n traceId !== INVALID_TRACE_ID\n );\n}\n\nfunction resolveSpanContext(\n span?: OtelSpanLike | Span | null\n): { traceId: string; spanId: string } | undefined {\n const active = span ?? trace.getActiveSpan();\n const ctx = active?.spanContext();\n if (!ctx || !isValidTraceId(ctx.traceId)) {\n return undefined;\n }\n return { traceId: ctx.traceId, spanId: ctx.spanId };\n}\n\nfunction parseTaskCreatedAt(submittedAt?: string): number {\n if (submittedAt) {\n const parsed = Date.parse(submittedAt);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n return Date.now();\n}\n\nfunction parseHandledAtMs(handledAt: string | number | Date): number {\n if (handledAt instanceof Date) {\n return handledAt.getTime();\n }\n if (typeof handledAt === \"number\") {\n return handledAt;\n }\n const parsed = Date.parse(handledAt);\n return Number.isNaN(parsed) ? Date.now() : parsed;\n}\n\nexport type RobotRockHandledRecordInput =\n | RobotRockHandlerWebhookPayload\n | ApprovalResult\n | DiscriminatedApprovalResult<readonly { id: string; schema?: unknown }[]>;\n\n/** Normalize handled payloads from Trigger, Workflow, or polling. */\nexport function toRobotRockHandledOtelInput(\n handled: RobotRockHandledRecordInput\n): RobotRockHandledOtelInput {\n if (\"actionId\" in handled) {\n return {\n taskId: handled.taskId,\n action: {\n id: handled.actionId,\n data: handled.data,\n },\n handledBy: handled.handledBy,\n handledAt: handled.handledAt,\n };\n }\n\n return {\n taskId: handled.taskId,\n action: {\n id: handled.action.id,\n title: handled.action.title,\n data: handled.action.data,\n },\n handledBy: handled.handledBy,\n handledAt: handled.handledAt,\n };\n}\n\n/**\n * Capture trace + task metadata after RobotRock task create (before human wait).\n * Used by Trigger.dev and Vercel Workflow durable integrations.\n */\nexport function captureRobotRockOtelHandle(\n task: { taskId: string; threadId?: string; submittedAt?: string },\n options?: { span?: OtelSpanLike | Span | null }\n): RobotRockOtelHandle {\n const spanCtx = resolveSpanContext(options?.span);\n return {\n traceId: spanCtx?.traceId ?? \"\",\n spanId: spanCtx?.spanId ?? \"\",\n taskId: task.taskId,\n threadId: task.threadId,\n taskCreatedAt: parseTaskCreatedAt(task.submittedAt),\n };\n}\n\n/**\n * Start a child span for the human-wait phase on the active trace.\n */\nexport function startRobotRockHumanWaitSpan(\n handle: RobotRockOtelHandle,\n options?: { tracerName?: string; span?: OtelSpanLike | Span | null }\n): Span | undefined {\n const parent = (options?.span ?? trace.getActiveSpan()) as Span | undefined;\n if (!parent) {\n return undefined;\n }\n\n const tracer = trace.getTracer(options?.tracerName ?? TRACER_NAME);\n const span = tracer.startSpan(\n WAIT_SPAN_NAME,\n {},\n trace.setSpan(context.active(), parent)\n );\n\n span.setAttribute(\"robotrock.task_id\", handle.taskId);\n if (handle.threadId) {\n span.setAttribute(\"robotrock.thread_id\", handle.threadId);\n }\n\n return span;\n}\n\n/**\n * Record human action attributes and a span event on the active or wait span.\n */\nexport function recordRobotRockHandledToOtel(\n handled: RobotRockHandledRecordInput,\n options: RobotRockOtelRecordOptions = {}\n): void {\n const span = (options.span ?? trace.getActiveSpan()) as Span | undefined;\n if (!span) {\n return;\n }\n\n const input = toRobotRockHandledOtelInput(handled);\n const handledAtMs = parseHandledAtMs(input.handledAt);\n const handle = options.handle;\n const humanWaitMs =\n handle != null ? Math.max(0, handledAtMs - handle.taskCreatedAt) : undefined;\n\n span.setAttribute(\"robotrock.task_id\", input.taskId);\n span.setAttribute(\"robotrock.action.id\", input.action.id);\n if (input.action.title) {\n span.setAttribute(\"robotrock.action.title\", input.action.title);\n }\n if (input.handledBy) {\n span.setAttribute(\"robotrock.handled_by\", input.handledBy);\n }\n span.setAttribute(\"robotrock.handled_at\", new Date(handledAtMs).toISOString());\n if (humanWaitMs != null) {\n span.setAttribute(\"robotrock.human_wait_ms\", humanWaitMs);\n }\n if (input.threadId) {\n span.setAttribute(\"robotrock.thread_id\", input.threadId);\n }\n\n const eventAttributes: Record<string, string | number | boolean> = {\n \"robotrock.task_id\": input.taskId,\n \"robotrock.action.id\": input.action.id,\n };\n if (input.handledBy) {\n eventAttributes[\"robotrock.handled_by\"] = input.handledBy;\n }\n if (humanWaitMs != null) {\n eventAttributes[\"robotrock.human_wait_ms\"] = humanWaitMs;\n }\n\n if (options.includeActionData && input.action.data != null) {\n const serialized = JSON.stringify(input.action.data);\n const truncated =\n serialized.length > 512 ? `${serialized.slice(0, 512)}…` : serialized;\n span.setAttribute(\"robotrock.action.data\", truncated);\n eventAttributes[\"robotrock.action.data\"] = truncated;\n }\n\n span.addEvent(HANDLED_EVENT_NAME, eventAttributes);\n}\n\nexport type EndRobotRockHumanWaitSpanOptions = {\n handle?: RobotRockOtelHandle;\n outcome?: \"handled\" | \"timeout\" | \"error\";\n includeActionData?: boolean;\n};\n\n/**\n * End the human-wait child span, recording handled data or a timeout/error outcome.\n */\nexport function endRobotRockHumanWaitSpan(\n span: Span | undefined,\n handled: RobotRockHandledRecordInput | null,\n options: EndRobotRockHumanWaitSpanOptions = {}\n): void {\n if (!span) {\n return;\n }\n\n const outcome = options.outcome ?? (handled ? \"handled\" : \"timeout\");\n\n if (handled && outcome === \"handled\") {\n recordRobotRockHandledToOtel(handled, {\n span,\n handle: options.handle,\n includeActionData: options.includeActionData,\n });\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setAttribute(\"robotrock.outcome\", outcome);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n outcome === \"timeout\"\n ? \"Human response timed out before validUntil\"\n : \"Human wait failed\",\n });\n }\n\n span.end();\n}\n","import type { Span } from \"@opentelemetry/api\";\nimport {\n captureRobotRockOtelHandle,\n endRobotRockHumanWaitSpan,\n startRobotRockHumanWaitSpan,\n type RobotRockOtelHandle,\n} from \"./record-handled-to-otel.js\";\n\nexport type RobotRockPlatformOtelFields = {\n /**\n * Record human handle result on the active OTel span (Trigger / Workflow).\n * Defaults to `ROBOTROCK_OTEL_RECORD_HANDLED` env (`true` / `1`).\n */\n recordOtel?: boolean;\n /** Include truncated action feedback data on OTel spans (off by default). */\n otelIncludeActionData?: boolean;\n};\n\nexport function shouldRecordRobotRockOtel(recordOtel?: boolean): boolean {\n if (recordOtel === true) {\n return true;\n }\n if (recordOtel === false) {\n return false;\n }\n const env = process.env.ROBOTROCK_OTEL_RECORD_HANDLED;\n return env === \"true\" || env === \"1\";\n}\n\nexport function stripPlatformOtelFields<\n T extends RobotRockPlatformOtelFields & Record<string, unknown>,\n>(payload: T): Omit<T, \"recordOtel\" | \"otelIncludeActionData\"> {\n const { recordOtel: _recordOtel, otelIncludeActionData: _otelIncludeActionData, ...rest } =\n payload;\n return rest;\n}\n\nexport type RobotRockCreatedTask = {\n taskId: string;\n threadId?: string;\n submittedAt?: string;\n};\n\nexport type RobotRockHumanWaitOtelSession = {\n recordOtel: boolean;\n handle?: RobotRockOtelHandle;\n waitSpan?: Span;\n includeActionData?: boolean;\n};\n\nexport function beginRobotRockHumanWaitOtel(\n task: RobotRockCreatedTask,\n options: Pick<RobotRockPlatformOtelFields, \"recordOtel\" | \"otelIncludeActionData\"> = {}\n): RobotRockHumanWaitOtelSession {\n const recordOtel = shouldRecordRobotRockOtel(options.recordOtel);\n if (!recordOtel) {\n return { recordOtel: false };\n }\n\n const handle = captureRobotRockOtelHandle(task);\n const waitSpan = startRobotRockHumanWaitSpan(handle);\n\n return {\n recordOtel: true,\n handle,\n waitSpan,\n includeActionData: options.otelIncludeActionData,\n };\n}\n\nexport function finishRobotRockHumanWaitOtel(\n session: RobotRockHumanWaitOtelSession,\n handled: Parameters<typeof endRobotRockHumanWaitSpan>[1],\n outcome: \"handled\" | \"timeout\" | \"error\"\n): void {\n if (!session.recordOtel) {\n return;\n }\n\n endRobotRockHumanWaitSpan(session.waitSpan, handled, {\n handle: session.handle,\n outcome,\n includeActionData: session.includeActionData,\n });\n}\n","/**\n * JSON body posted when a RobotRock action handler runs (webhook or Trigger wait token).\n */\nexport interface RobotRockHandlerWebhookPayload {\n taskId: string;\n action: {\n id: string;\n title: string;\n data: unknown;\n };\n handledBy?: string;\n handledAt: string;\n handlerType: string;\n}\n\nexport function isRobotRockHandlerWebhookPayload(\n value: unknown\n): value is RobotRockHandlerWebhookPayload {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const v = value as Record<string, unknown>;\n if (typeof v.taskId !== \"string\" || typeof v.handledAt !== \"string\") {\n return false;\n }\n const action = v.action;\n if (typeof action !== \"object\" || action === null) {\n return false;\n }\n const a = action as Record<string, unknown>;\n return typeof a.id === \"string\" && \"data\" in a;\n}\n","/** Default wait when `validUntil` is omitted. */\nexport const DEFAULT_WAIT_DURATION_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport function resolveWaitTiming(validUntilInput?: Date | string): {\n validUntil: Date | string;\n timeout: string;\n} {\n const validUntilMs =\n validUntilInput !== undefined\n ? parseValidUntilMs(validUntilInput)\n : Date.now() + DEFAULT_WAIT_DURATION_MS;\n\n const durationMs = validUntilMs - Date.now();\n if (durationMs <= 0) {\n throw new Error(\"validUntil must be in the future\");\n }\n\n return {\n validUntil: validUntilInput ?? new Date(validUntilMs),\n timeout: durationMsToTimeout(durationMs),\n };\n}\n\nexport function parseValidUntilMs(value: Date | string): number {\n if (value instanceof Date) {\n const ms = value.getTime();\n if (Number.isNaN(ms)) {\n throw new Error(\"Invalid validUntil: Date is invalid\");\n }\n return ms;\n }\n\n const parsed = Date.parse(value);\n if (Number.isNaN(parsed)) {\n throw new Error(\"Invalid validUntil: expected a parseable date string\");\n }\n\n return parsed;\n}\n\n/** Duration string for Trigger.dev `wait.createToken` and Workflow `sleep`. */\nexport function durationMsToTimeout(durationMs: number): string {\n const seconds = Math.ceil(durationMs / 1000);\n if (seconds <= 0) {\n throw new Error(\"validUntil must be in the future\");\n }\n\n if (seconds >= 86_400) {\n return `${Math.ceil(seconds / 86_400)}d`;\n }\n if (seconds >= 3_600) {\n return `${Math.ceil(seconds / 3_600)}h`;\n }\n if (seconds >= 60) {\n return `${Math.ceil(seconds / 60)}m`;\n }\n\n return `${seconds}s`;\n}\n","import type { DiscriminatedApprovalResult } from \"../schemas/index.js\";\nimport { task, wait } from \"@trigger.dev/sdk\";\nimport {\n beginRobotRockHumanWaitOtel,\n finishRobotRockHumanWaitOtel,\n stripPlatformOtelFields,\n type RobotRockPlatformOtelFields,\n} from \"../otel-platform.js\";\nimport {\n createClient,\n type SendToHumanActionInput,\n type SendToHumanInput,\n} from \"../client.js\";\nimport { resolveRobotRockConfig } from \"../env.js\";\nimport { toDiscriminatedApprovalResult } from \"../approval-result.js\";\nimport {\n isRobotRockHandlerWebhookPayload,\n type RobotRockHandlerWebhookPayload,\n} from \"../handler-webhook.js\";\nimport { resolveWaitTiming } from \"../wait-timing.js\";\n\nexport type { RobotRockHandlerWebhookPayload } from \"../handler-webhook.js\";\nexport type { RobotRockPlatformOtelFields } from \"../otel-platform.js\";\n\nexport type SendToHumanPayload<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = SendToHumanInput<A> &\n RobotRockPlatformOtelFields & {\n /** Inbox app bucket. Overrides `ROBOTROCK_APP` when set. */\n app?: string;\n };\n\nexport type ApproveByHumanPayload = Omit<SendToHumanPayload, \"actions\">;\n\ntype Expand<T> = T extends unknown ? { [K in keyof T]: T[K] } : never;\n\nconst APPROVE_BY_HUMAN_ACTIONS = [\n { id: \"approve\", title: \"Approve\" },\n { id: \"decline\", title: \"Decline\" },\n] as const;\n\nasync function runSendToHuman<const A extends readonly SendToHumanActionInput[]>(\n payload: SendToHumanPayload<A>\n): Promise<Expand<DiscriminatedApprovalResult<A>>> {\n const { validUntil: validUntilInput, app, recordOtel, otelIncludeActionData, ...taskFields } =\n payload;\n const { validUntil, timeout } = resolveWaitTiming(validUntilInput);\n\n const token = await wait.createToken({ timeout });\n\n const baseConfig = resolveRobotRockConfig();\n const client = createClient({\n apiKey: baseConfig.apiKey,\n baseUrl: baseConfig.baseUrl,\n ...(baseConfig.app ? { app: baseConfig.app } : {}),\n ...(baseConfig.version ? { version: baseConfig.version } : {}),\n ...(baseConfig.advanced ? { advanced: baseConfig.advanced } : {}),\n webhook: { url: token.url },\n });\n\n const taskInput = stripPlatformOtelFields(taskFields);\n\n const sendResult = await client.sendToHuman({\n ...taskInput,\n validUntil,\n ...(app !== undefined ? { app } : {}),\n });\n\n const otelSession = beginRobotRockHumanWaitOtel(sendResult.task, {\n recordOtel,\n otelIncludeActionData,\n });\n\n let handledPayload: RobotRockHandlerWebhookPayload | null = null;\n let waitOutcome: \"handled\" | \"timeout\" | \"error\" | \"pending\" = \"pending\";\n\n try {\n const outcome = await wait.forToken<RobotRockHandlerWebhookPayload>(token.id);\n\n if (!outcome.ok) {\n waitOutcome = \"timeout\";\n throw new Error(`Human response timed out before validUntil (${timeout})`);\n }\n\n const output = outcome.output;\n if (!isRobotRockHandlerWebhookPayload(output)) {\n waitOutcome = \"error\";\n throw new Error(\n \"Wait token completed with unexpected payload; expected RobotRock handler body (taskId, action.id, action.data).\"\n );\n }\n\n handledPayload = output;\n waitOutcome = \"handled\";\n\n return toDiscriminatedApprovalResult(\n payload.actions,\n {\n id: output.taskId,\n createdAt: new Date(),\n status: \"handled\",\n context: sendResult.task.context,\n validUntil: Date.now(),\n handledAt: new Date(output.handledAt).getTime(),\n handled: {\n action: {\n id: output.action.id,\n data: output.action.data,\n },\n handledBy: output.handledBy,\n },\n }\n ) as unknown as Expand<DiscriminatedApprovalResult<A>>;\n } catch (error) {\n if (waitOutcome === \"pending\") {\n waitOutcome = \"error\";\n }\n throw error;\n } finally {\n if (waitOutcome !== \"pending\") {\n finishRobotRockHumanWaitOtel(\n otelSession,\n handledPayload,\n waitOutcome === \"handled\" ? \"handled\" : waitOutcome\n );\n }\n }\n}\n\n/**\n * Durable human-in-the-loop task for Trigger.dev.\n * Re-export from your `trigger/` directory so Trigger.dev discovers it on deploy.\n */\nexport const sendToHumanTask = task({\n id: \"robotrock/send-to-human\",\n run: async (payload: SendToHumanPayload) => runSendToHuman(payload),\n});\n\n/**\n * Simple approve/decline human gate for Trigger.dev.\n * Re-export from your `trigger/` directory so Trigger.dev discovers it on deploy.\n */\nexport const approveByHumanTask = task({\n id: \"robotrock/approve-by-human\",\n run: async (payload: ApproveByHumanPayload) =>\n runSendToHuman({\n ...payload,\n actions: APPROVE_BY_HUMAN_ACTIONS,\n }),\n});\n\nexport type {\n ApprovalResult,\n DiscriminatedApprovalResult,\n TaskContextInput,\n TaskResult,\n} from \"../schemas/index.js\";\n","import { createWebhook, sleep } from \"workflow\";\nimport type {\n DiscriminatedApprovalResult,\n ThreadUpdate,\n ThreadUpdateStatus,\n} from \"../schemas/index.js\";\nimport {\n createClient,\n type SendToHumanActionInput,\n type SendToHumanInput,\n} from \"../client.js\";\nimport { resolveRobotRockConfig } from \"../env.js\";\nimport { toDiscriminatedApprovalResult } from \"../approval-result.js\";\nimport {\n isRobotRockHandlerWebhookPayload,\n type RobotRockHandlerWebhookPayload,\n} from \"../handler-webhook.js\";\nimport { parseValidUntilMs, resolveWaitTiming } from \"../wait-timing.js\";\nimport {\n beginRobotRockHumanWaitOtel,\n finishRobotRockHumanWaitOtel,\n stripPlatformOtelFields,\n type RobotRockPlatformOtelFields,\n} from \"../otel-platform.js\";\n\nexport type SendToHumanWorkflowPayload<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = SendToHumanInput<A> &\n RobotRockPlatformOtelFields & {\n /** Inbox app bucket. Overrides `ROBOTROCK_APP` when set. */\n app?: string;\n };\n\nexport type ApproveByHumanWorkflowPayload = Omit<SendToHumanWorkflowPayload, \"actions\">;\n\ntype Expand<T> = T extends unknown ? { [K in keyof T]: T[K] } : never;\n\nconst APPROVE_BY_HUMAN_ACTIONS = [\n { id: \"approve\", title: \"Approve\" },\n { id: \"decline\", title: \"Decline\" },\n] as const;\n\ntype CreateTaskStepInput = {\n webhookUrl: string;\n app?: string;\n validUntil: Date | string;\n taskInput: Omit<SendToHumanWorkflowPayload, \"validUntil\" | \"app\" | \"recordOtel\" | \"otelIncludeActionData\">;\n};\n\n/**\n * Creates the RobotRock inbox task with the workflow webhook URL as the handler.\n * Marked as a step so API calls run in full Node.js with retries.\n */\nasync function createRobotRockTaskForWebhook(input: CreateTaskStepInput) {\n \"use step\";\n\n const baseConfig = resolveRobotRockConfig();\n const client = createClient({\n apiKey: baseConfig.apiKey,\n baseUrl: baseConfig.baseUrl,\n ...((input.app ?? baseConfig.app) ? { app: input.app ?? baseConfig.app } : {}),\n ...(baseConfig.version ? { version: baseConfig.version } : {}),\n ...(baseConfig.advanced ? { advanced: baseConfig.advanced } : {}),\n webhook: { url: input.webhookUrl },\n });\n\n return client.sendToHuman({\n ...input.taskInput,\n validUntil: input.validUntil,\n });\n}\n\nasync function parseRobotRockWebhookRequest(request: Request) {\n \"use step\";\n\n const body: unknown = await request.json();\n if (!isRobotRockHandlerWebhookPayload(body)) {\n throw new Error(\n \"Workflow webhook completed with unexpected payload; expected RobotRock handler body (taskId, action.id, action.data).\"\n );\n }\n\n return body;\n}\n\n/**\n * Durable human-in-the-loop wait for Vercel Workflow.\n *\n * Call from a function with `\"use workflow\"` as its first statement. Creates a\n * {@link createWebhook} URL, registers it as the RobotRock task webhook, and\n * suspends until a human handles an action or `validUntil` passes.\n */\nexport async function sendToHumanInWorkflow<\n const A extends readonly SendToHumanActionInput[],\n>(\n payload: SendToHumanWorkflowPayload<A>\n): Promise<Expand<DiscriminatedApprovalResult<A>>> {\n const { validUntil: validUntilInput, app, recordOtel, otelIncludeActionData, ...taskFields } =\n payload;\n const { validUntil, timeout } = resolveWaitTiming(validUntilInput);\n const timeoutMs = parseValidUntilMs(validUntil) - Date.now();\n\n using webhook = createWebhook();\n\n const sendResult = await createRobotRockTaskForWebhook({\n webhookUrl: webhook.url,\n app,\n validUntil,\n taskInput: stripPlatformOtelFields(taskFields),\n });\n\n const otelSession = beginRobotRockHumanWaitOtel(sendResult.task, {\n recordOtel,\n otelIncludeActionData,\n });\n\n let handledPayload: RobotRockHandlerWebhookPayload | null = null;\n let waitOutcome: \"handled\" | \"timeout\" | \"error\" | \"pending\" = \"pending\";\n\n try {\n const outcome = await Promise.race([\n webhook.then((request) => parseRobotRockWebhookRequest(request)),\n sleep(timeoutMs).then(() => ({ timedOut: true }) as const),\n ]);\n\n if (\"timedOut\" in outcome) {\n waitOutcome = \"timeout\";\n throw new Error(`Human response timed out before validUntil (${timeout})`);\n }\n\n handledPayload = outcome;\n waitOutcome = \"handled\";\n\n return toDiscriminatedApprovalResult(payload.actions, {\n id: outcome.taskId,\n createdAt: new Date(),\n status: \"handled\",\n context: sendResult.task.context,\n validUntil: Date.now(),\n handledAt: new Date(outcome.handledAt).getTime(),\n handled: {\n action: {\n id: outcome.action.id,\n data: outcome.action.data,\n },\n handledBy: outcome.handledBy,\n },\n }) as unknown as Expand<DiscriminatedApprovalResult<A>>;\n } catch (error) {\n if (waitOutcome === \"pending\") {\n waitOutcome = \"error\";\n }\n throw error;\n } finally {\n if (waitOutcome !== \"pending\") {\n finishRobotRockHumanWaitOtel(\n otelSession,\n handledPayload,\n waitOutcome === \"handled\" ? \"handled\" : waitOutcome\n );\n }\n }\n}\n\n/**\n * Approve / decline gate for Vercel Workflow (`sendToHumanInWorkflow` with fixed actions).\n */\nexport async function approveByHumanInWorkflow(\n payload: ApproveByHumanWorkflowPayload\n): Promise<Expand<DiscriminatedApprovalResult<typeof APPROVE_BY_HUMAN_ACTIONS>>> {\n return sendToHumanInWorkflow({\n ...payload,\n actions: APPROVE_BY_HUMAN_ACTIONS,\n });\n}\n\nexport type SendUpdateWorkflowPayload = {\n /** Thread to log the update against (from a prior task's `threadId`). */\n threadId: string;\n /** Short status update (1-2 sentences) shown in the inbox status bar. */\n message: string;\n /** Lifecycle status driving the status-bar icon/color. @default \"info\" */\n status?: ThreadUpdateStatus;\n /** Inbox app bucket. Overrides `ROBOTROCK_APP` when set. */\n app?: string;\n};\n\n/**\n * Posts a thread update via `client.sendUpdate()`. Marked as a step so the API\n * call runs in full Node.js with retries and is recorded in the workflow run.\n */\nasync function sendRobotRockUpdate(payload: SendUpdateWorkflowPayload): Promise<ThreadUpdate> {\n \"use step\";\n\n const { app, ...update } = payload;\n const baseConfig = resolveRobotRockConfig();\n const client = createClient({\n apiKey: baseConfig.apiKey,\n baseUrl: baseConfig.baseUrl,\n ...((app ?? baseConfig.app) ? { app: app ?? baseConfig.app } : {}),\n ...(baseConfig.version ? { version: baseConfig.version } : {}),\n ...(baseConfig.advanced ? { advanced: baseConfig.advanced } : {}),\n });\n\n return client.tasks.sendUpdate(update);\n}\n\n/**\n * Durable thread update for Vercel Workflow.\n *\n * Wraps {@link createClient}'s `sendUpdate` in a `\"use step\"` so progress\n * reports are retried and recorded in the run. Fire-and-forget: returns the\n * created update without suspending the workflow (no human wait involved).\n *\n * Call from a function with `\"use workflow\"` as its first statement.\n */\nexport async function sendUpdateInWorkflow(\n payload: SendUpdateWorkflowPayload\n): Promise<ThreadUpdate> {\n return sendRobotRockUpdate(payload);\n}\n\nexport type { RobotRockHandlerWebhookPayload } from \"../handler-webhook.js\";\nexport type { RobotRockPlatformOtelFields } from \"../otel-platform.js\";\nexport type {\n ApprovalResult,\n DiscriminatedApprovalResult,\n TaskContextInput,\n TaskResult,\n ThreadUpdate,\n ThreadUpdateStatus,\n} from \"../schemas/index.js\";\n","import { z } from \"zod\";\nimport type { RobotRock } from \"../client.js\";\nimport {\n approveByHumanForAi,\n normalizeRobotRockAiContext,\n type RobotRockAiContext,\n} from \"./context.js\";\nimport { toHumanToolResult } from \"./human-tool-result.js\";\nimport type { HumanToolResult } from \"./types.js\";\n\nexport const APPROVE_BY_HUMAN_ACTIONS = [\n { id: \"approve\", title: \"Approve\" },\n { id: \"decline\", title: \"Decline\" },\n] as const;\n\nexport const approveByHumanInputSchema = z.object({\n type: z\n .string()\n .optional()\n .describe(\"Task type slug; defaults to ai-approval\"),\n name: z.string().describe(\"Short title for the approval request\"),\n description: z\n .string()\n .describe(\"What needs approval and the consequences of approving or declining\"),\n contextSummary: z\n .string()\n .optional()\n .describe(\"Optional markdown summary shown to the reviewer\"),\n});\n\nexport type ApproveByHumanToolInput = z.infer<typeof approveByHumanInputSchema>;\n\nexport type ApproveByHumanToolOptions = {\n defaultType?: string;\n description?: string;\n toolName?: string;\n};\n\nexport type ApproveByHumanToolDurableOptions = ApproveByHumanToolOptions &\n RobotRockAiContext & { mode: \"trigger\" | \"workflow\" };\n\nexport type ApproveByHumanToolDefinition = {\n description: string;\n inputSchema: typeof approveByHumanInputSchema;\n execute: (input: ApproveByHumanToolInput) => Promise<HumanToolResult>;\n};\n\nfunction resolveApproveByHumanToolConfig(\n clientOrContext: RobotRock | ApproveByHumanToolDurableOptions,\n maybeOptions: ApproveByHumanToolOptions = {}\n): {\n aiContext: RobotRockAiContext;\n options: ApproveByHumanToolOptions;\n} {\n const isDurable =\n typeof clientOrContext === \"object\" &&\n clientOrContext !== null &&\n \"mode\" in clientOrContext &&\n (clientOrContext.mode === \"trigger\" || clientOrContext.mode === \"workflow\");\n\n const aiContext = normalizeRobotRockAiContext(\n isDurable\n ? {\n mode: (clientOrContext as ApproveByHumanToolDurableOptions).mode,\n app: (clientOrContext as ApproveByHumanToolDurableOptions).app,\n }\n : (clientOrContext as RobotRock)\n );\n const options = isDurable\n ? (clientOrContext as ApproveByHumanToolDurableOptions)\n : maybeOptions;\n\n return { aiContext, options };\n}\n\n/**\n * Plain tool definition for Vercel Workflow and DurableAgent (no `tool()` from the AI SDK).\n */\nexport function buildApproveByHumanToolDefinition(\n clientOrContext: RobotRock | ApproveByHumanToolDurableOptions,\n maybeOptions: ApproveByHumanToolOptions = {}\n): ApproveByHumanToolDefinition {\n const { aiContext, options } = resolveApproveByHumanToolConfig(\n clientOrContext,\n maybeOptions\n );\n const description =\n options.description ??\n \"Request explicit human approval before a sensitive or irreversible step. Returns whether the human approved or declined.\";\n\n return {\n description,\n inputSchema: approveByHumanInputSchema,\n execute: async (input: ApproveByHumanToolInput): Promise<HumanToolResult> => {\n const taskContext =\n input.contextSummary !== undefined\n ? {\n data: { summary: input.contextSummary },\n ui: {\n summary: { \"ui:widget\": \"textarea\", \"ui:options\": { rows: 6 } },\n },\n }\n : undefined;\n\n const result = await approveByHumanForAi(aiContext, {\n type: input.type ?? options.defaultType ?? \"ai-approval\",\n name: input.name,\n description: input.description,\n context: taskContext,\n });\n\n return toHumanToolResult(result);\n },\n };\n}\n","import {\n createClient,\n type RobotRock,\n type SendToHumanActionInput,\n type SendToHumanInput,\n type SendUpdateInput,\n} from \"../client.js\";\nimport { resolveRobotRockConfig } from \"../env.js\";\nimport type { DiscriminatedApprovalResult, ThreadUpdate } from \"../schemas/index.js\";\nconst APPROVE_BY_HUMAN_ACTIONS = [\n { id: \"approve\", title: \"Approve\" },\n { id: \"decline\", title: \"Decline\" },\n] as const;\n\n/** How RobotRock waits for a human inside AI SDK tool `execute`. */\nexport type RobotRockAiMode = \"polling\" | \"trigger\" | \"workflow\";\n\n/**\n * Polling: `client.sendToHuman()` blocks until handled (scripts, API routes with long timeout).\n * Trigger: `sendToHumanTask.triggerAndWait()` uses wait tokens (Trigger.dev workers).\n * Workflow: `sendToHumanInWorkflow()` uses workflow webhooks (Vercel Workflow).\n */\nexport type RobotRockAiPollingContext = {\n mode?: \"polling\";\n client: RobotRock;\n};\n\nexport type RobotRockAiTriggerContext = {\n mode: \"trigger\";\n /** Inbox app bucket; falls back to `ROBOTROCK_APP` in the Trigger worker. */\n app?: string;\n};\n\nexport type RobotRockAiWorkflowContext = {\n mode: \"workflow\";\n /** Inbox app bucket; falls back to `ROBOTROCK_APP` in the workflow run. */\n app?: string;\n};\n\nexport type RobotRockAiContext =\n | RobotRockAiPollingContext\n | RobotRockAiTriggerContext\n | RobotRockAiWorkflowContext;\n\n/** Shorthand for `{ mode: \"trigger\", app }`. */\nexport function createRobotRockAiTriggerContext(\n options: Omit<RobotRockAiTriggerContext, \"mode\"> = {}\n): RobotRockAiContext {\n return { mode: \"trigger\", ...options };\n}\n\n/** Shorthand for `{ mode: \"workflow\", app }`. */\nexport function createRobotRockAiWorkflowContext(\n options: Omit<RobotRockAiWorkflowContext, \"mode\"> = {}\n): RobotRockAiContext {\n return { mode: \"workflow\", ...options };\n}\n\nexport function isRobotRockClient(value: unknown): value is RobotRock {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"sendToHuman\" in value &&\n typeof (value as RobotRock).sendToHuman === \"function\"\n );\n}\n\nexport function normalizeRobotRockAiContext(\n clientOrContext: RobotRock | RobotRockAiContext\n): RobotRockAiContext {\n if (isRobotRockClient(clientOrContext)) {\n return { mode: \"polling\", client: clientOrContext };\n }\n\n if (clientOrContext.mode === \"trigger\" || clientOrContext.mode === \"workflow\") {\n return clientOrContext;\n }\n\n if (clientOrContext.mode === \"polling\" || clientOrContext.mode === undefined) {\n if (!(\"client\" in clientOrContext) || !clientOrContext.client) {\n throw new Error('RobotRock AI polling mode requires `client` on the context object.');\n }\n return { mode: \"polling\", client: clientOrContext.client };\n }\n\n throw new Error(`Unknown RobotRock AI mode: ${String((clientOrContext as { mode?: string }).mode)}`);\n}\n\nexport async function sendToHumanForAi<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n context: RobotRockAiContext,\n payload: SendToHumanInput<A>\n): Promise<DiscriminatedApprovalResult<A>> {\n if (context.mode === \"trigger\") {\n const { sendToHumanTask } = await import(\"../trigger/index.js\");\n const waitResult = await sendToHumanTask.triggerAndWait({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n\n if (!waitResult.ok) {\n throw waitResult.error;\n }\n\n return waitResult.output as DiscriminatedApprovalResult<A>;\n }\n\n if (context.mode === \"workflow\") {\n const { sendToHumanInWorkflow } = await import(\"../workflow/index.js\");\n const result = await sendToHumanInWorkflow({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n return result as unknown as DiscriminatedApprovalResult<A>;\n }\n\n const result = await context.client.sendToHuman(payload);\n\n if (result.mode !== \"handled\") {\n throw new Error(\n \"RobotRock task was created but not handled. Configure client polling or webhook, or use mode: 'trigger' / 'workflow' for durable waits.\"\n );\n }\n\n return {\n actionId: result.actionId,\n data: result.data,\n handledBy: result.handledBy,\n handledAt: result.handledAt,\n taskId: result.taskId,\n } as DiscriminatedApprovalResult<A>;\n}\n\n/**\n * Posts a thread update for an AI tool, routing by execution mode.\n *\n * `sendUpdate` is fire-and-forget (no human wait), so only the workflow path\n * needs durability — it runs inside a `\"use step\"`. Trigger and polling modes\n * issue the request directly.\n */\nexport async function sendUpdateForAi(\n context: RobotRockAiContext,\n payload: SendUpdateInput\n): Promise<ThreadUpdate> {\n if (context.mode === \"workflow\") {\n const { sendUpdateInWorkflow } = await import(\"../workflow/index.js\");\n return sendUpdateInWorkflow({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n }\n\n if (context.mode === \"trigger\") {\n const client = createClient(\n resolveRobotRockConfig(context.app ? { app: context.app } : undefined)\n );\n return client.tasks.sendUpdate(payload);\n }\n\n return context.client.tasks.sendUpdate(payload);\n}\n\n/**\n * Close an agent chat from a chat-agent tool. Idempotent server-side, so all\n * modes resolve a client and call `chats.close` directly (no durable step).\n */\nexport async function closeChatForAi(\n context: RobotRockAiContext,\n payload: { chatId: string; reason?: string }\n): Promise<void> {\n if (context.mode === \"trigger\" || context.mode === \"workflow\") {\n const client = createClient(\n resolveRobotRockConfig(context.app ? { app: context.app } : undefined)\n );\n await client.chats.close(payload.chatId, { reason: payload.reason });\n return;\n }\n\n await context.client.chats.close(payload.chatId, { reason: payload.reason });\n}\n\nexport async function approveByHumanForAi(\n context: RobotRockAiContext,\n payload: Omit<SendToHumanInput, \"actions\"> & { app?: string }\n): Promise<DiscriminatedApprovalResult<typeof APPROVE_BY_HUMAN_ACTIONS>> {\n if (context.mode === \"trigger\") {\n const { approveByHumanTask } = await import(\"../trigger/index.js\");\n const waitResult = await approveByHumanTask.triggerAndWait({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n\n if (!waitResult.ok) {\n throw waitResult.error;\n }\n\n return waitResult.output;\n }\n\n if (context.mode === \"workflow\") {\n const { approveByHumanInWorkflow } = await import(\"../workflow/index.js\");\n return await approveByHumanInWorkflow({\n ...payload,\n ...(context.app ? { app: context.app } : {}),\n });\n }\n\n const result = await context.client.sendToHuman({\n ...payload,\n actions: APPROVE_BY_HUMAN_ACTIONS,\n });\n\n if (result.mode !== \"handled\") {\n throw new Error(\n \"RobotRock approval was not handled. Configure client polling or use mode: 'trigger' / 'workflow' for durable waits.\"\n );\n }\n\n return {\n actionId: result.actionId,\n data: result.data,\n handledBy: result.handledBy,\n handledAt: result.handledAt,\n taskId: result.taskId,\n } as DiscriminatedApprovalResult<typeof APPROVE_BY_HUMAN_ACTIONS>;\n}\n","import type { DiscriminatedApprovalResult } from \"../schemas/index.js\";\nimport type { HumanToolResult } from \"./types.js\";\n\nconst APPROVE_IDS = new Set([\"approve\", \"approved\"]);\nconst DECLINE_IDS = new Set([\"decline\", \"reject\", \"deny\", \"denied\"]);\n\nexport function toHumanToolResult(\n result: DiscriminatedApprovalResult<readonly { id: string }[]>\n): HumanToolResult {\n const payload: HumanToolResult = {\n taskId: result.taskId,\n actionId: result.actionId,\n data: result.data,\n handledBy: result.handledBy,\n handledAt: result.handledAt.toISOString(),\n };\n\n if (APPROVE_IDS.has(result.actionId)) {\n payload.approved = true;\n } else if (DECLINE_IDS.has(result.actionId)) {\n payload.approved = false;\n }\n\n return payload;\n}\n","import { z } from \"zod\";\nimport { assignToSchema } from \"../schemas/index.js\";\nimport type { RobotRock, SendToHumanActionInput, SendToHumanInput } from \"../client.js\";\nimport type { TaskContextInput } from \"../schemas/index.js\";\nimport {\n normalizeRobotRockAiContext,\n sendToHumanForAi,\n type RobotRockAiContext,\n} from \"./context.js\";\nimport { toHumanToolResult } from \"./human-tool-result.js\";\nimport type { HumanToolResult } from \"./types.js\";\n\nexport const sendToHumanToolInputSchema = z.object({\n type: z.string().describe(\"Task type slug shown in the RobotRock inbox\"),\n name: z.string().describe(\"Short title for the human reviewer\"),\n description: z\n .string()\n .optional()\n .describe(\"What you need from the human and why you cannot proceed alone\"),\n context: z\n .object({\n data: z.record(z.string(), z.unknown()).optional(),\n ui: z.record(z.string(), z.unknown()).optional(),\n })\n .optional()\n .describe(\"Optional structured context for the inbox UI\"),\n validUntil: z\n .string()\n .datetime()\n .optional()\n .describe(\"Optional ISO deadline for the task\"),\n assignTo: assignToSchema\n .optional()\n .describe(\n \"Assign to tenant member emails and/or group slugs; narrows who sees the task in the inbox\"\n ),\n});\n\nexport type SendToHumanToolInput = z.infer<typeof sendToHumanToolInputSchema>;\n\nexport type CreateSendToHumanToolOptions<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = {\n actions: A;\n defaultType?: string;\n description?: string;\n toolName?: string;\n /**\n * Group every task this tool creates onto a shared thread. Pass the same\n * value to {@link createSendUpdateTool} so updates land on the same thread.\n */\n threadId?: string;\n};\n\nexport type CreateSendToHumanToolDurableOptions<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n> = CreateSendToHumanToolOptions<A> & RobotRockAiContext & { mode: \"trigger\" | \"workflow\" };\n\nexport type SendToHumanToolDefinition = {\n description: string;\n inputSchema: typeof sendToHumanToolInputSchema;\n execute: (input: SendToHumanToolInput) => Promise<HumanToolResult>;\n};\n\nfunction resolveSendToHumanToolConfig<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n clientOrOptions: RobotRock | CreateSendToHumanToolDurableOptions<A>,\n maybeOptions?: CreateSendToHumanToolOptions<A>\n): {\n aiContext: RobotRockAiContext;\n options: CreateSendToHumanToolOptions<A>;\n} {\n const isDurable =\n typeof clientOrOptions === \"object\" &&\n clientOrOptions !== null &&\n \"mode\" in clientOrOptions &&\n (clientOrOptions.mode === \"trigger\" || clientOrOptions.mode === \"workflow\");\n\n const aiContext = normalizeRobotRockAiContext(\n isDurable\n ? {\n mode: (clientOrOptions as CreateSendToHumanToolDurableOptions<A>).mode,\n app: (clientOrOptions as CreateSendToHumanToolDurableOptions<A>).app,\n }\n : (clientOrOptions as RobotRock)\n );\n const options = (isDurable ? clientOrOptions : maybeOptions!) as CreateSendToHumanToolOptions<A>;\n\n return { aiContext, options };\n}\n\n/**\n * Plain tool definition for Vercel Workflow and DurableAgent (no `tool()` from the AI SDK).\n */\nexport function buildSendToHumanToolDefinition<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n clientOrOptions: RobotRock | CreateSendToHumanToolDurableOptions<A>,\n maybeOptions?: CreateSendToHumanToolOptions<A>\n): SendToHumanToolDefinition {\n const { aiContext, options } = resolveSendToHumanToolConfig(clientOrOptions, maybeOptions);\n const description =\n options.description ??\n \"Request structured input or a decision from a human in the RobotRock inbox. Use when you lack required information, need policy approval, or must confirm an irreversible step.\";\n\n return {\n description,\n inputSchema: sendToHumanToolInputSchema,\n execute: async (input: SendToHumanToolInput): Promise<HumanToolResult> => {\n const taskContext: TaskContextInput[\"context\"] | undefined = input.context\n ? ({\n data: input.context.data ?? {},\n ui: input.context.ui,\n } as TaskContextInput[\"context\"])\n : undefined;\n\n const payload: SendToHumanInput<A> = {\n type: input.type ?? options.defaultType ?? \"ai-human-input\",\n name: input.name,\n description: input.description,\n context: taskContext,\n validUntil: input.validUntil,\n assignTo: input.assignTo,\n actions: options.actions,\n ...(options.threadId ? { threadId: options.threadId } : {}),\n };\n\n const result = await sendToHumanForAi(aiContext, payload);\n\n return toHumanToolResult(result);\n },\n };\n}\n","import { z } from \"zod\";\nimport { threadUpdateStatusSchema } from \"../schemas/index.js\";\nimport { RobotRockError, type RobotRock } from \"../client.js\";\nimport type { ThreadUpdate } from \"../schemas/index.js\";\nimport {\n normalizeRobotRockAiContext,\n sendUpdateForAi,\n type RobotRockAiContext,\n} from \"./context.js\";\n\n/**\n * Result returned to the model by {@link createSendUpdateTool}.\n *\n * Updates are fire-and-forget, so a missing thread (no task created yet) is\n * reported as `{ posted: false }` instead of throwing — that way an agent loop\n * is never aborted by a non-critical progress update. Genuine failures (auth,\n * validation, server errors) still throw.\n */\nexport type SendUpdateToolResult =\n | { posted: true; threadId: string; update: ThreadUpdate }\n | {\n posted: false;\n threadId: string;\n reason: \"thread_not_found\";\n message: string;\n };\n\nexport const sendUpdateToolInputSchema = z.object({\n threadId: z\n .string()\n .optional()\n .describe(\n \"Thread to post the update to. Use the `threadId` returned by a prior send-to-human task. Omit only when a session threadId is configured on the tool.\"\n ),\n message: z\n .string()\n .describe(\"Short progress update (1-2 sentences) shown in the inbox status bar\"),\n status: threadUpdateStatusSchema\n .optional()\n .describe(\n \"Lifecycle status driving the status-bar icon/color: info, queued, running, waiting, succeeded, failed, cancelled\"\n ),\n});\n\nexport type SendUpdateToolInput = z.infer<typeof sendUpdateToolInputSchema>;\n\nexport type CreateSendUpdateToolOptions = {\n /**\n * Session thread to post updates to when the model does not supply `threadId`.\n * Pass the same value to {@link createSendToHumanTool} to auto-thread tasks\n * and updates together.\n */\n threadId?: string;\n description?: string;\n};\n\nexport type CreateSendUpdateToolDurableOptions = CreateSendUpdateToolOptions &\n RobotRockAiContext & { mode: \"trigger\" | \"workflow\" };\n\nexport type SendUpdateToolDefinition = {\n description: string;\n inputSchema: typeof sendUpdateToolInputSchema;\n execute: (input: SendUpdateToolInput) => Promise<SendUpdateToolResult>;\n};\n\nfunction resolveSendUpdateToolConfig(\n clientOrOptions: RobotRock | CreateSendUpdateToolDurableOptions,\n maybeOptions: CreateSendUpdateToolOptions = {}\n): {\n aiContext: RobotRockAiContext;\n options: CreateSendUpdateToolOptions;\n} {\n const isDurable =\n typeof clientOrOptions === \"object\" &&\n clientOrOptions !== null &&\n \"mode\" in clientOrOptions &&\n (clientOrOptions.mode === \"trigger\" || clientOrOptions.mode === \"workflow\");\n\n const aiContext = normalizeRobotRockAiContext(\n isDurable\n ? {\n mode: (clientOrOptions as CreateSendUpdateToolDurableOptions).mode,\n app: (clientOrOptions as CreateSendUpdateToolDurableOptions).app,\n }\n : (clientOrOptions as RobotRock)\n );\n const options = isDurable\n ? (clientOrOptions as CreateSendUpdateToolDurableOptions)\n : maybeOptions;\n\n return { aiContext, options };\n}\n\n/**\n * Plain tool definition for Vercel Workflow and DurableAgent (no `tool()` from the AI SDK).\n */\nexport function buildSendUpdateToolDefinition(\n clientOrOptions: RobotRock | CreateSendUpdateToolDurableOptions,\n maybeOptions: CreateSendUpdateToolOptions = {}\n): SendUpdateToolDefinition {\n const { aiContext, options } = resolveSendUpdateToolConfig(clientOrOptions, maybeOptions);\n const description =\n options.description ??\n \"Post a short progress update to the RobotRock thread you are working on. Use to report status changes (running, succeeded, failed) so humans can follow along in the inbox.\";\n\n return {\n description,\n inputSchema: sendUpdateToolInputSchema,\n execute: async (input: SendUpdateToolInput): Promise<SendUpdateToolResult> => {\n const threadId = input.threadId ?? options.threadId;\n if (!threadId) {\n throw new Error(\n \"createSendUpdateTool: no threadId. Pass `threadId` from a prior send-to-human result, or configure a session `threadId` in the tool options.\"\n );\n }\n\n try {\n const update = await sendUpdateForAi(aiContext, {\n threadId,\n message: input.message,\n status: input.status,\n });\n return { posted: true, threadId, update };\n } catch (error) {\n if (error instanceof RobotRockError && error.statusCode === 404) {\n return {\n posted: false,\n threadId,\n reason: \"thread_not_found\",\n message: `No task exists for thread \"${threadId}\" yet, so the update was not posted. Create a task on this thread with send-to-human before reporting progress.`,\n };\n }\n throw error;\n }\n },\n };\n}\n","import { z } from \"zod\";\n\nexport const REQUEST_ACTION_INPUT_TOOL_NAME = \"requestActionInput\" as const;\n\n/** Stable slug when the model omits `action.id` (common LLM mistake). */\nexport function defaultRequestActionInputActionId(title: string): string {\n const slug = title\n .trim()\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\n return slug.length > 0 ? slug : \"submit\";\n}\n\n/** Action shape for tool input — uses records so AI SDK can emit JSON Schema for the model. */\nconst requestActionInputActionSchema = z.object({\n id: z\n .string()\n .min(1)\n .optional()\n .describe(\n \"Stable action identifier echoed in tool output (e.g. pick-blog-topic). Strongly recommended — auto-derived from title when omitted.\"\n ),\n title: z.string().min(1),\n description: z.string().optional(),\n schema: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"JSON Schema object for the human feedback form\"),\n ui: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"RJSF ui schema overrides (ui:widget, ui:enumNames, etc.). Use ui:widget \\\"radio\\\" for 2–6 discrete choices rendered as tappable cards.\"\n ),\n data: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Optional default form field values\"),\n});\n\nexport function normalizeRequestActionInputToolInput(\n input: z.input<typeof requestActionInputToolInputSchema>\n): RequestActionInputToolInput {\n const parsed = requestActionInputToolInputSchema.parse(input);\n return {\n ...parsed,\n action: {\n ...parsed.action,\n id:\n parsed.action.id?.trim() ||\n defaultRequestActionInputActionId(parsed.action.title),\n },\n };\n}\n\nexport const requestActionInputToolOutputSchema = z.object({\n actionId: z.string().min(1),\n data: z.record(z.string(), z.unknown()),\n});\n\nexport type RequestActionInputToolOutput = z.infer<\n typeof requestActionInputToolOutputSchema\n>;\n\nexport const requestActionInputToolInputSchema = z.object({\n prompt: z\n .string()\n .optional()\n .describe(\"Optional heading shown above the action widget in chat\"),\n action: requestActionInputActionSchema.describe(\n \"Action widget config: JSON Schema form fields and optional RJSF ui overrides (same shape as RobotRock inbox actions)\"\n ),\n});\n\nexport type RequestActionInputToolInput = z.infer<\n typeof requestActionInputToolInputSchema\n>;\n\nexport type RequestActionInputToolOptions = {\n description?: string;\n toolName?: string;\n};\n\nexport type RequestActionInputToolDefinition = {\n description: string;\n inputSchema: typeof requestActionInputToolInputSchema;\n outputSchema: typeof requestActionInputToolOutputSchema;\n};\n\nexport function buildRequestActionInputToolDefinition(\n options: RequestActionInputToolOptions = {}\n): RequestActionInputToolDefinition {\n const description =\n options.description ??\n \"Ask the user for structured input via a RobotRock action widget in chat. Always set action.id (e.g. \\\"pick-blog-topic\\\") and action.title. Provide action.schema and optional action.ui using the same JSON Schema and RJSF ui shape as inbox action widgets. Put every field you need in a single call — never invoke this tool more than once per turn. For 2–6 discrete options, use a string enum with ui:widget \\\"radio\\\" and ui:enumNames — never markdown bullet lists. After the tool returns, act on the user's data immediately; do not ask them to confirm choices they already submitted.\";\n\n return {\n description,\n inputSchema: requestActionInputToolInputSchema,\n outputSchema: requestActionInputToolOutputSchema,\n };\n}\n\nexport function isRequestActionInputToolPart(\n part: { type?: string },\n toolName: string = REQUEST_ACTION_INPUT_TOOL_NAME\n): boolean {\n return part.type === `tool-${toolName}`;\n}\n","import { z } from \"zod\";\n\nexport const REPORT_STATUS_TOOL_NAME = \"reportStatus\" as const;\n\nexport const reportStatusPhaseSchema = z.enum([\n \"info\",\n \"running\",\n \"waiting\",\n \"succeeded\",\n \"failed\",\n]);\n\nexport type ReportStatusPhase = z.infer<typeof reportStatusPhaseSchema>;\n\nexport const reportStatusToolInputSchema = z.object({\n message: z\n .string()\n .min(1)\n .describe(\n \"Short progress update shown in chat (1-2 sentences). Use while researching, drafting, or waiting on external work.\"\n ),\n phase: reportStatusPhaseSchema\n .optional()\n .describe(\n \"Lifecycle phase for the status marker. Defaults to running. Use succeeded or failed when a step finishes.\"\n ),\n});\n\nexport const reportStatusToolOutputSchema = z.object({\n message: z.string().min(1),\n phase: reportStatusPhaseSchema,\n});\n\nexport type ReportStatusToolInput = z.infer<typeof reportStatusToolInputSchema>;\nexport type ReportStatusToolOutput = z.infer<typeof reportStatusToolOutputSchema>;\n\nexport type ReportStatusToolOptions = {\n description?: string;\n toolName?: string;\n};\n\nexport type ReportStatusToolDefinition = {\n description: string;\n inputSchema: typeof reportStatusToolInputSchema;\n outputSchema: typeof reportStatusToolOutputSchema;\n execute: (input: ReportStatusToolInput) => Promise<ReportStatusToolOutput>;\n};\n\nexport function normalizeReportStatusToolInput(\n input: z.input<typeof reportStatusToolInputSchema>\n): ReportStatusToolInput {\n const parsed = reportStatusToolInputSchema.parse(input);\n return {\n message: parsed.message.trim(),\n phase: parsed.phase,\n };\n}\n\nexport async function executeReportStatusTool(\n input: ReportStatusToolInput\n): Promise<ReportStatusToolOutput> {\n const normalized = normalizeReportStatusToolInput(input);\n return {\n message: normalized.message,\n phase: normalized.phase ?? \"running\",\n };\n}\n\nexport function buildReportStatusToolDefinition(\n options: ReportStatusToolOptions = {}\n): ReportStatusToolDefinition {\n const description =\n options.description ??\n \"Post a short progress update to the chat UI while you work. Call this before and during long steps (research, drafting, tool runs) so the user sees what is happening. Use phase \\\"running\\\" while in progress, \\\"succeeded\\\" or \\\"failed\\\" when a step completes, and \\\"waiting\\\" when blocked on external input.\";\n\n return {\n description,\n inputSchema: reportStatusToolInputSchema,\n outputSchema: reportStatusToolOutputSchema,\n execute: executeReportStatusTool,\n };\n}\n\nexport function isReportStatusToolPart(\n part: { type?: string },\n toolName: string = REPORT_STATUS_TOOL_NAME\n): boolean {\n return part.type === `tool-${toolName}`;\n}\n","import type { RobotRock, SendToHumanActionInput } from \"../client.js\";\nimport {\n buildApproveByHumanToolDefinition,\n type ApproveByHumanToolDurableOptions,\n type ApproveByHumanToolOptions,\n} from \"./approve-by-human-tool-core.js\";\nimport {\n buildSendToHumanToolDefinition,\n type CreateSendToHumanToolDurableOptions,\n type CreateSendToHumanToolOptions,\n} from \"./create-send-to-human-tool-core.js\";\nimport {\n buildSendUpdateToolDefinition,\n type CreateSendUpdateToolDurableOptions,\n type CreateSendUpdateToolOptions,\n} from \"./create-send-update-tool-core.js\";\nimport {\n buildRequestActionInputToolDefinition,\n type RequestActionInputToolOptions,\n} from \"./request-action-input-tool-core.js\";\nimport {\n buildReportStatusToolDefinition,\n type ReportStatusToolOptions,\n} from \"./report-status-tool-core.js\";\nimport type { RobotRockAiWorkflowContext } from \"./context.js\";\n\n/**\n * Workflow-safe approve/decline tool for `generateText`, `DurableAgent`, and similar.\n * Returns a plain `{ description, inputSchema, execute }` object — no AI SDK `tool()` helper.\n */\nexport function approveByHumanTool(\n clientOrContext: RobotRock | ApproveByHumanToolDurableOptions,\n maybeOptions: ApproveByHumanToolOptions = {}\n) {\n return buildApproveByHumanToolDefinition(clientOrContext, maybeOptions);\n}\n\n/**\n * Workflow-safe send-to-human tool. See {@link approveByHumanTool} for usage notes.\n */\nexport function createSendToHumanTool<\n A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[],\n>(\n clientOrOptions: RobotRock | CreateSendToHumanToolDurableOptions<A>,\n maybeOptions?: CreateSendToHumanToolOptions<A>\n) {\n return buildSendToHumanToolDefinition(clientOrOptions, maybeOptions);\n}\n\n/**\n * Workflow-safe send-update tool. See {@link approveByHumanTool} for usage notes.\n */\nexport function createSendUpdateTool(\n clientOrOptions: RobotRock | CreateSendUpdateToolDurableOptions,\n maybeOptions: CreateSendUpdateToolOptions = {}\n) {\n return buildSendUpdateToolDefinition(clientOrOptions, maybeOptions);\n}\n\n/**\n * Client-side action widget tool for chat UIs. No `execute` — the UI submits via `addToolOutput`.\n */\nexport function requestActionInputTool(options: RequestActionInputToolOptions = {}) {\n return buildRequestActionInputToolDefinition(options);\n}\n\n/**\n * Chat progress tool for workflow agents. Executes immediately and renders in chat UI.\n */\nexport function reportStatusTool(options: ReportStatusToolOptions = {}) {\n return buildReportStatusToolDefinition(options);\n}\n\nexport type CreateRobotRockAiWorkflowToolsOptions = {\n app?: string;\n threadId?: string;\n};\n\nexport function createRobotRockAiTools(options: CreateRobotRockAiWorkflowToolsOptions = {}) {\n const context: RobotRockAiWorkflowContext = { mode: \"workflow\", app: options.app };\n\n return {\n context,\n approveByHuman: (toolOptions?: ApproveByHumanToolOptions) =>\n buildApproveByHumanToolDefinition({ ...context, ...toolOptions }),\n sendToHuman: <A extends readonly SendToHumanActionInput[]>(\n toolOptions: CreateSendToHumanToolOptions<A>\n ) =>\n buildSendToHumanToolDefinition({\n ...context,\n ...(options.threadId ? { threadId: options.threadId } : {}),\n ...toolOptions,\n }),\n sendUpdate: (toolOptions: CreateSendUpdateToolOptions = {}) =>\n buildSendUpdateToolDefinition({\n ...context,\n ...(options.threadId ? { threadId: options.threadId } : {}),\n ...toolOptions,\n }),\n requestActionInput: (toolOptions: RequestActionInputToolOptions = {}) =>\n buildRequestActionInputToolDefinition(toolOptions),\n reportStatus: (toolOptions: ReportStatusToolOptions = {}) =>\n buildReportStatusToolDefinition(toolOptions),\n };\n}\n","import type { SendToHumanInput } from \"../client.js\";\nimport type { FormatToolApprovalTaskOptions, RobotRockToolCallInfo } from \"./types.js\";\n\nconst DEFAULT_APPROVE_ACTIONS = [\n { id: \"approve\", title: \"Approve execution\" },\n { id: \"deny\", title: \"Deny\" },\n] as const;\n\n/**\n * Build a RobotRock task payload for an AI SDK tool approval request.\n */\nexport function defaultFormatToolApprovalTask(\n toolCall: RobotRockToolCallInfo,\n options: FormatToolApprovalTaskOptions = {}\n): SendToHumanInput {\n const approveId = options.approveActionId ?? \"approve\";\n const denyId = options.denyActionId ?? \"deny\";\n\n return {\n type: options.type ?? \"ai-tool-approval\",\n name: `Approve: ${toolCall.toolName}`,\n description: `Review the proposed \\`${toolCall.toolName}\\` tool call before it runs.`,\n context: {\n data: {\n toolName: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n input: toolCall.input,\n },\n ui: {\n toolName: { \"ui:widget\": \"text\" },\n toolCallId: { \"ui:widget\": \"text\" },\n input: { \"ui:widget\": \"textarea\" },\n },\n },\n actions: [\n { id: approveId, title: \"Approve execution\" },\n { id: denyId, title: \"Deny\" },\n ],\n };\n}\n\nexport { DEFAULT_APPROVE_ACTIONS };\n","import type { ToolApprovalResponse } from \"ai\";\nimport type { RobotRock } from \"../client.js\";\nimport {\n normalizeRobotRockAiContext,\n sendToHumanForAi,\n type RobotRockAiContext,\n} from \"./context.js\";\nimport { defaultFormatToolApprovalTask } from \"./format-tool-approval-task.js\";\nimport type {\n ResolveToolApprovalsOptions,\n RobotRockToolApprovalConfig,\n RobotRockToolCallInfo,\n RunWithRobotRockApprovalsOptions,\n ToolApprovalRequestPart,\n} from \"./types.js\";\n\nexport type RobotRockToolApprovalDecision = \"user-approval\" | undefined;\n\nfunction buildToolMatcher(config: RobotRockToolApprovalConfig) {\n const names = config.tools ? new Set(config.tools) : null;\n\n return (toolCall: RobotRockToolCallInfo): boolean => {\n if (config.when?.(toolCall)) {\n return true;\n }\n if (names && names.has(toolCall.toolName)) {\n return true;\n }\n return false;\n };\n}\n\n/**\n * AI SDK 7+: pass the return value to `toolApproval` on `generateText`, `streamText`, or `ToolLoopAgent`.\n * Returns `'user-approval'` for configured tools so execution pauses until a human responds via RobotRock.\n */\nexport function createRobotRockToolApproval(config: RobotRockToolApprovalConfig) {\n const matches = buildToolMatcher(config);\n\n const toolApproval = async (options: {\n toolCall: RobotRockToolCallInfo;\n }): Promise<RobotRockToolApprovalDecision> => {\n return matches(options.toolCall) ? \"user-approval\" : undefined;\n };\n\n return toolApproval;\n}\n\n/**\n * AI SDK 5–6: use as `needsApproval` on tool definitions (or via {@link applyRobotRockToolApprovalToTools}).\n */\nexport function createRobotRockNeedsApproval(config: RobotRockToolApprovalConfig) {\n const matches = buildToolMatcher(config);\n\n return async (\n _input: unknown,\n options: { toolCallId: string; messages?: unknown[] }\n ): Promise<boolean> => {\n const toolCall = findToolCallInMessages(options.messages, options.toolCallId);\n if (!toolCall) {\n return false;\n }\n return matches(toolCall);\n };\n}\n\n/**\n * AI SDK 5–6: merge `needsApproval` into each matching tool in a tools object.\n */\nexport function applyRobotRockToolApprovalToTools<T extends Record<string, object>>(\n tools: T,\n config: RobotRockToolApprovalConfig\n): T {\n const names = config.tools ? new Set(config.tools) : null;\n const needsApproval = createRobotRockNeedsApproval(config);\n\n const next = { ...tools } as T;\n\n for (const key of Object.keys(tools) as Array<keyof T>) {\n const name = String(key);\n const shouldApply =\n (names && names.has(name)) || (names === null && config.when !== undefined);\n\n if (!shouldApply) {\n continue;\n }\n\n const existing = tools[key];\n next[key] = {\n ...existing,\n needsApproval,\n } as T[keyof T];\n }\n\n return next;\n}\n\nfunction findToolCallInMessages(\n messages: unknown[] | undefined,\n toolCallId: string\n): RobotRockToolCallInfo | undefined {\n if (!messages) {\n return undefined;\n }\n\n for (const message of messages) {\n if (typeof message !== \"object\" || message === null) {\n continue;\n }\n const role = (message as { role?: string }).role;\n if (role !== \"assistant\") {\n continue;\n }\n const content = (message as { content?: unknown }).content;\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (const part of content) {\n if (typeof part !== \"object\" || part === null) {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === \"tool-call\" && p.toolCallId === toolCallId) {\n return {\n toolName: String(p.toolName ?? \"\"),\n toolCallId,\n input: p.input,\n };\n }\n }\n }\n\n return undefined;\n}\n\nfunction collectApprovalRequests(source: unknown): ToolApprovalRequestPart[] {\n const requests: ToolApprovalRequestPart[] = [];\n\n const visit = (value: unknown) => {\n if (!value) {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n visit(item);\n }\n return;\n }\n\n if (typeof value !== \"object\") {\n return;\n }\n\n const obj = value as Record<string, unknown>;\n\n if (obj.type === \"tool-approval-request\" && typeof obj.approvalId === \"string\") {\n if (obj.isAutomatic === true) {\n return;\n }\n\n const embedded = obj.toolCall as Record<string, unknown> | undefined;\n const toolCallId =\n typeof obj.toolCallId === \"string\"\n ? obj.toolCallId\n : typeof embedded?.toolCallId === \"string\"\n ? embedded.toolCallId\n : undefined;\n\n let toolCall: RobotRockToolCallInfo | undefined;\n if (embedded && typeof embedded.toolName === \"string\") {\n toolCall = {\n toolName: embedded.toolName,\n toolCallId: String(embedded.toolCallId ?? toolCallId ?? \"\"),\n input: embedded.input,\n };\n } else if (toolCallId) {\n toolCall = findToolCallInMessages(\n (source as { messages?: unknown[] }).messages,\n toolCallId\n );\n }\n\n requests.push({\n type: \"tool-approval-request\",\n approvalId: obj.approvalId,\n toolCallId,\n toolCall,\n isAutomatic: obj.isAutomatic === true,\n });\n return;\n }\n\n if (Array.isArray(obj.content)) {\n visit(obj.content);\n }\n if (Array.isArray(obj.steps)) {\n visit(obj.steps);\n }\n if (obj.response && typeof obj.response === \"object\") {\n visit((obj.response as { messages?: unknown[] }).messages);\n }\n };\n\n visit(source);\n\n if (typeof source === \"object\" && source !== null && Array.isArray((source as { content?: unknown[] }).content)) {\n visit((source as { content: unknown[] }).content);\n }\n\n const seen = new Set<string>();\n return requests.filter((r) => {\n if (seen.has(r.approvalId)) {\n return false;\n }\n seen.add(r.approvalId);\n return true;\n });\n}\n\nfunction resolveToolCallForRequest(\n request: ToolApprovalRequestPart,\n source: unknown,\n messages: unknown[]\n): RobotRockToolCallInfo {\n if (request.toolCall) {\n return request.toolCall;\n }\n\n const toolCallId = request.toolCallId;\n if (toolCallId) {\n const fromMessages = findToolCallInMessages(messages, toolCallId);\n if (fromMessages) {\n return fromMessages;\n }\n }\n\n if (typeof source === \"object\" && source !== null && Array.isArray((source as { toolCalls?: unknown[] }).toolCalls)) {\n for (const call of (source as { toolCalls: Array<Record<string, unknown>> }).toolCalls) {\n if (call.toolCallId === toolCallId) {\n return {\n toolName: String(call.toolName ?? \"\"),\n toolCallId: String(call.toolCallId ?? \"\"),\n input: call.input,\n };\n }\n }\n }\n\n throw new Error(\n `Could not resolve tool call for approval ${request.approvalId}. Pass messages that include the assistant tool-call.`\n );\n}\n\n/**\n * Create RobotRock tasks for pending AI SDK tool approvals and return `tool-approval-response` parts.\n */\nexport async function resolveToolApprovalsViaRobotRock(\n clientOrContext: RobotRock | RobotRockAiContext,\n source: unknown,\n options: ResolveToolApprovalsOptions = {}\n): Promise<{\n responses: ToolApprovalResponse[];\n messages: unknown[];\n}> {\n const context = normalizeRobotRockAiContext(clientOrContext);\n const approveId = options.approveActionId ?? \"approve\";\n const denyId = options.denyActionId ?? \"deny\";\n const formatTask = options.formatTask ?? defaultFormatToolApprovalTask;\n\n const baseMessages =\n typeof source === \"object\" && source !== null && Array.isArray((source as { messages?: unknown[] }).messages)\n ? [...(source as { messages: unknown[] }).messages]\n : [];\n\n const requests = collectApprovalRequests(source);\n const responses: ToolApprovalResponse[] = [];\n\n for (const request of requests) {\n const toolCall = resolveToolCallForRequest(request, source, baseMessages);\n const taskInput = formatTask(toolCall, {\n approveActionId: approveId,\n denyActionId: denyId,\n });\n\n const result = await sendToHumanForAi(context, taskInput);\n\n const approved = result.actionId === approveId;\n const reason =\n typeof result.data === \"object\" &&\n result.data !== null &&\n \"reason\" in result.data &&\n typeof (result.data as { reason?: unknown }).reason === \"string\"\n ? (result.data as { reason: string }).reason\n : approved\n ? \"Approved in RobotRock inbox\"\n : \"Denied in RobotRock inbox\";\n\n responses.push({\n type: \"tool-approval-response\",\n approvalId: request.approvalId,\n approved,\n reason,\n });\n }\n\n const messages = [...baseMessages];\n if (responses.length > 0) {\n messages.push({ role: \"tool\", content: responses });\n }\n\n return { responses, messages };\n}\n\n/**\n * Run `generate` in a loop until manual tool approvals are resolved via RobotRock or `maxRounds` is reached.\n */\nexport async function runWithRobotRockApprovals<T>(\n options: RunWithRobotRockApprovalsOptions<T>\n): Promise<T> {\n const clientOrContext =\n options.context ??\n (options.client\n ? options.client\n : (() => {\n throw new Error(\"runWithRobotRockApprovals requires `client` or `context`.\");\n })());\n\n const maxRounds = options.maxRounds ?? 20;\n let messages = options.messages ? [...options.messages] : [];\n let lastResult: T | undefined;\n\n for (let round = 0; round < maxRounds; round++) {\n lastResult = await options.generate(messages);\n const { responses, messages: nextMessages } = await resolveToolApprovalsViaRobotRock(\n clientOrContext,\n { ...(lastResult as object), messages },\n options.resolveOptions\n );\n\n if (responses.length === 0) {\n return lastResult;\n }\n\n messages = nextMessages;\n }\n\n throw new Error(`RobotRock approval loop exceeded maxRounds (${maxRounds})`);\n}\n\nexport { collectApprovalRequests };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,SAAS,kBAAkB,UAA0B;AACnD,SAAO,SAAS,YAAY,EAAE,QAAQ,YAAY,EAAE;AACtD;AAEA,SAAS,cAAc,MAAuB;AAC5C,QAAM,QAAQ,+CAA+C,KAAK,IAAI;AACtE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAC3D,MAAI,OAAO,KAAK,CAAC,UAAU,OAAO,MAAM,KAAK,KAAK,QAAQ,KAAK,QAAQ,GAAG,GAAG;AAC3E,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI;AACvB,MAAI,MAAM,UAAa,MAAM,QAAW;AACtC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,OAAO,MAAM,EAAG,QAAO;AACjC,MAAI,MAAM,GAAI,QAAO;AACrB,MAAI,MAAM,OAAO,MAAM,IAAK,QAAO;AACnC,MAAI,MAAM,OAAO,MAAM,IAAK,QAAO;AACnC,MAAI,MAAM,OAAO,KAAK,MAAM,KAAK,GAAI,QAAO;AAC5C,MAAI,MAAM,OAAO,KAAK,MAAM,KAAK,IAAK,QAAO;AAE7C,SAAO;AACT;AAEA,SAAS,oBAAoB,MAA6B;AACxD,MAAI,QAAQ,KAAK,IAAI,GAAG;AACtB,UAAM,MAAM,OAAO,IAAI;AACvB,QAAI,CAAC,OAAO,SAAS,GAAG,KAAK,MAAM,KAAK,MAAM,YAAY;AACxD,aAAO;AAAA,IACT;AACA,UAAM,IAAK,QAAQ,KAAM;AACzB,UAAM,IAAK,QAAQ,KAAM;AACzB,UAAM,IAAK,QAAQ,IAAK;AACxB,UAAM,IAAI,MAAM;AAChB,WAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,EAC5B;AAEA,QAAM,WAAW,uBAAuB,KAAK,IAAI;AACjD,MAAI,UAAU;AACZ,UAAM,MAAM,OAAO,SAAS,SAAS,CAAC,GAAI,EAAE;AAC5C,QAAI,CAAC,OAAO,SAAS,GAAG,KAAK,MAAM,KAAK,MAAM,YAAY;AACxD,aAAO;AAAA,IACT;AACA,UAAM,IAAK,QAAQ,KAAM;AACzB,UAAM,IAAK,QAAQ,KAAM;AACzB,UAAM,IAAK,QAAQ,IAAK;AACxB,UAAM,IAAI,MAAM;AAChB,WAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,EAC5B;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAuB;AAClD,QAAM,eAAe,sCAAsC,KAAK,IAAI;AACpE,MAAI,cAAc;AAChB,WAAO,cAAc,aAAa,CAAC,CAAE;AAAA,EACvC;AAEA,QAAM,YAAY,4CAA4C,KAAK,IAAI;AACvE,MAAI,WAAW;AACb,UAAM,OAAO,OAAO,SAAS,UAAU,CAAC,GAAI,EAAE;AAC9C,UAAM,MAAM,OAAO,SAAS,UAAU,CAAC,GAAI,EAAE;AAC7C,QAAI,OAAO,SAAS,IAAI,KAAK,OAAO,SAAS,GAAG,GAAG;AACjD,YAAM,IAAK,QAAQ,IAAK;AACxB,YAAM,IAAI,OAAO;AACjB,YAAM,IAAK,OAAO,IAAK;AACvB,YAAM,IAAI,MAAM;AAChB,aAAO,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,MAAuB;AAC5C,MAAI,SAAS,SAAS,SAAS,mBAAmB;AAChD,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,IAAI,GAAG;AAClD,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,oBAAoB,IAAI,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,UAA2B;AACpD,QAAM,OAAO,kBAAkB,QAAQ;AACvC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,IAAI,IAAI,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,QAAQ,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,oBAAoB,IAAI;AAC5C,MAAI,eAAe,cAAc,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO,cAAc,IAAI,KAAK,cAAc,IAAI;AAClD;AAOO,SAAS,qBAAqB,WAA4B;AAC/D,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,SAAS;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,aAAa,WAAW,IAAI,aAAa,UAAU;AACzD,WAAO;AAAA,EACT;AACA,MAAI,IAAI,YAAY,IAAI,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,IAAI,SAAS,YAAY;AACtC,SACE,SAAS,eACT,SAAS,eACT,SAAS,SACT,SAAS,WACT,KAAK,SAAS,YAAY;AAE9B;AAKO,SAAS,oBAAoB,WAA4B;AAC9D,SAAO,gBAAgB,SAAS,KAAK,qBAAqB,SAAS;AACrE;AAKO,SAAS,gBAAgB,WAA4B;AAC1D,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,SAAS;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,aAAa,WAAW,IAAI,aAAa,UAAU;AACzD,WAAO;AAAA,EACT;AACA,MAAI,IAAI,YAAY,IAAI,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,kBAAkB,IAAI,QAAQ;AACxC;AAlLA,IAAM,mBAoLO,uBAGA;AAvLb;AAAA;AAAA;AAAA,IAAM,oBAAoB,oBAAI,IAAI;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAgLM,IAAM,wBACX;AAEK,IAAM,oBACX;AAAA;AAAA;;;ACxLF;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MAAM,WAAW,SAAS,KAAK,MAAM,WAAW,UAAU,IAC7D,QACA,WAAW,KAAK;AACtB;AAEA,SAAS,WACP,IACA,OACoB;AACpB,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,WAAO;AAAA,EACT;AACA,QAAM,SAAU,QAAoC,WAAW;AAC/D,SAAO,OAAO,WAAW,WAAW,SAAS;AAC/C;AAEA,SAAS,iBAAiB,OAAgB,QAA+B;AACvE,MAAI,WAAW,WAAW,WAAW,QAAQ;AAC3C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,MAAM,WAAW,SAAS,eAAe,KAAK,IAAI;AACxD,QAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,iBAAiB,MAAM,QAAQ,KAAK,GAAG;AACpD,eAAW,QAAQ,OAAO;AACxB,UAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C;AAAA,MACF;AACA,YAAM,MAAO,KAA2B;AACxC,UAAI,OAAO,QAAQ,YAAY,CAAC,gBAAgB,eAAe,GAAG,CAAC,GAAG;AACpE,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,0BACdA,UACe;AACf,MAAI,CAACA,UAAS,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQA,SAAQ,IAAI,GAAG;AACzD,UAAM,SAAS,WAAWA,SAAQ,IAAI,KAAK;AAC3C,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,UAAM,QAAQ,iBAAiB,OAAO,MAAM;AAC5C,QAAI,OAAO;AACT,aAAO,gBAAgB,KAAK,KAAK,KAAK;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;AA3EA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,SAAS;AAyHlB,SAAS,4BACP,MAC+D;AAC/D,QAAM,EAAE,SAAS,eAAe,gBAAgB,GAAG,KAAK,IAAI;AAC5D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,kBAAkB,iBAAiB;AAAA,EACrD;AACF;AAMA,SAAS,wBACP,MACA,KACA;AACA,QAAM,QAAQ,0BAA0B,KAAK,OAAO;AACpD,MAAI,OAAO;AACT,QAAI,SAAS;AAAA,MACX,MAAM,EAAE,aAAa;AAAA,MACrB,SAAS;AAAA,MACT,MAAM,CAAC,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAnJA,IA+Ba,eAIP,kBAKA,mBAMA,gBAKA,sBAMA,sBAKA,eAGO,uBAUP,kBAMA,qBAWA,iBAGA,mBAOO,6BAIP,6BAyBA,yBAkBO,mBAcA,gBAiBA,2BAMA,sBAUA,0BAMA,yBAMA,gBAEA,oBAmBA,sBAMA,sBA4BA,2BAcA,4BAsBP,6BAUO,2BA4BA,8BAaA,+BAcP,2BAMO,8BAiBA;AAnYb;AAAA;AAAA;AACA;AAMA;AAwBO,IAAM,gBAAgB,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,gBAAgB,GAAG,GAAG;AAAA,MAC5E,SAAS;AAAA,IACX,CAAC;AAED,IAAM,mBAAmB,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,oBAAoB,GAAG,GAAG;AAAA,MAC5E,SAAS;AAAA,IACX,CAAC;AAGD,IAAM,oBAAoB,EAAE;AAAA,MAC1B,CAAC,QAAQ,OAAO,QAAQ,YAAY,QAAQ;AAAA,MAC5C,EAAE,SAAS,qCAAqC;AAAA,IAClD;AAGA,IAAM,iBAAiB,EAAE,OAAiB,CAAC,QAAQ,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAAA,MAC1F,SAAS;AAAA,IACX,CAAC;AAGD,IAAM,uBAAuB,EAAE,OAAO;AAAA,MACpC,MAAM,EAAE,QAAQ,SAAS;AAAA,MACzB,KAAK;AAAA,MACL,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,IAC1C,CAAC;AAED,IAAM,uBAAuB,qBAAqB,OAAO;AAAA,MACvD,MAAM,EAAE,QAAQ,SAAS;AAAA,MACzB,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,CAAC;AAED,IAAM,gBAAgB,EAAE,mBAAmB,QAAQ,CAAC,sBAAsB,oBAAoB,CAAC;AAGxF,IAAM,wBAAwB,EAAE,OAAO;AAAA,MAC5C,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACpB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACvB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,MACjC,QAAQ,kBAAkB,SAAS;AAAA,MACnC,IAAI,eAAe,SAAS;AAAA,MAC5B,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,IACnD,CAAC;AAGD,IAAM,mBAAmB,sBAAsB,OAAO;AAAA;AAAA,MAEpD,UAAU,EAAE,MAAM,aAAa,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACnD,CAAC;AAGD,IAAM,sBAA0D,EAC7D,OAAO;AAAA,MACN,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,MACjC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,MAChC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,MACtC,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,MACzD,OAAO,EAAE,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAAC,EAAE,SAAS;AAAA,IAC1E,CAAC,EACA,YAAY;AAGf,IAAM,kBAAkB,EAAE,OAAO,EAAE,OAAO,GAAG,mBAAmB,EAAE,SAAS;AAG3E,IAAM,oBAAoB,EACvB,OAAO;AAAA,MACN,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAAA,MACtC,IAAI;AAAA,IACN,CAAC,EACA,SAAS;AAEL,IAAM,8BAA8B;AAI3C,IAAM,8BAA8B,EAAE,OAAO;AAAA;AAAA,MAE3C,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MAChC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,MACjC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,MAChC,SAAS;AAAA;AAAA,MAET,gBAAgB,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA;AAAA,MAEtC,SAAS,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,MAC/B,SAAS,EAAE,MAAM,gBAAgB,EAAE,IAAI,GAAG,iCAAiC;AAAA,IAC7E,CAAC;AAYD,IAAM,0BAA0B,4BAA4B;AAAA,MAC1D;AAAA,IACF;AAgBO,IAAM,oBAAoB,wBAAwB;AAAA,MACvD;AAAA,IACF;AAYO,IAAM,iBAAiB,EAC3B,OAAO;AAAA,MACN,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS;AAAA,MAC5C,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,IAC9C,CAAC,EACA;AAAA,MACC,CAAC,SAAS;AACR,cAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,YAAI,OAAO,SAAS,KAAK,KAAK,OAAO,SAAS,GAAG;AAC/C,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,MACA,EAAE,SAAS,8CAA8C;AAAA,IAC3D;AAGK,IAAM,4BAA4B,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAM3D,IAAM,uBAAuB;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEO,IAAM,2BAA2B,EAAE,KAAK,oBAAoB;AAM5D,IAAM,0BAA0B,EAAE,OAAO;AAAA,MAC9C,SAAS;AAAA,MACT,QAAQ,yBAAyB,SAAS;AAAA,IAC5C,CAAC;AAGM,IAAM,iBAAiB,CAAC,OAAO,UAAU,QAAQ,QAAQ;AAEzD,IAAM,qBAAqB,EAAE,KAAK,cAAc;AAmBhD,IAAM,uBAAuB,EAAE,OAAO;AAAA;AAAA,MAE3C,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,CAAC;AAGM,IAAM,uBAAuB,4BACjC,OAAO;AAAA,MACN,UAAU,eAAe,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKlC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKrC,UAAU,mBAAmB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKtC,QAAQ,wBAAwB,SAAS;AAAA;AAAA,MAEzC,OAAO,qBAAqB,SAAS;AAAA,IACvC,CAAC,EACA,UAAU,2BAA2B,EACrC,YAAY,uBAAuB;AAM/B,IAAM,4BAA4B,EAAE,OAAO;AAAA;AAAA,MAEhD,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MAC/B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACvB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,MAEjC,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA;AAAA,MAEnD,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA;AAAA,MAE/C,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,IACnD,CAAC;AAGM,IAAM,6BAA6B,EAAE,OAAO;AAAA,MACjD,MAAM,EAAE,KAAK,CAAC,QAAQ,WAAW,CAAC;AAAA,MAClC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA;AAAA,MAEtB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMvC,oBAAoB,EACjB,OAAO;AAAA,QACN,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,QAAQ;AAAA,MACV,CAAC,EACA,SAAS;AAAA,IACd,CAAC;AAMD,IAAM,8BAA8B,EAAE,OAAO;AAAA,MAC3C,MAAM,EAAE,QAAQ,KAAK;AAAA,MACrB,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACxB,SAAS,EAAE,OAAO,EAAE,IAAI;AAAA,MACxB,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,MACvC,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,MACrD,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,IACpC,CAAC;AAEM,IAAM,4BAA4B,EACtC,OAAO;AAAA;AAAA,MAEN,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,MAE5C,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,MAEzC,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,MAE5C,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,MAEhC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,MACxC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACvB,UAAU,EAAE,MAAM,0BAA0B,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,MAExD,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACrC,CAAC,EACA,OAAO,CAAC,SAAS,QAAQ,KAAK,mBAAmB,KAAK,YAAY,GAAG;AAAA,MACpE,SAAS;AAAA,IACX,CAAC,EACA,OAAO,CAAC,SAAS,QAAQ,KAAK,cAAc,KAAK,YAAY,GAAG;AAAA,MAC/D,SAAS;AAAA,IACX,CAAC;AAMI,IAAM,+BAA+B,EAAE,OAAO;AAAA,MACnD,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC9B,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACxB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC5B,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC1B,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,MACnD,SAAS,EAAE,QAAQ;AAAA,MACnB,QAAQ,EAAE,KAAK,CAAC,aAAa,UAAU,UAAU,CAAC;AAAA,MAClD,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,IACtC,CAAC;AAGM,IAAM,gCAAgC,EAAE,OAAO;AAAA,MACpD,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC9B,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACxB,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC1B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,MACjC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,MACjD,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,MAEpC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,MAE/B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAClC,CAAC;AAED,IAAM,4BAA4B,EAAE,OAAO;AAAA,MACzC,IAAI,EAAE,OAAO;AAAA,MACb,OAAO,EAAE,OAAO;AAAA,IAClB,CAAC;AAGM,IAAM,+BAA+B,EAAE,OAAO;AAAA,MACnD,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC9B,UAAU,EAAE;AAAA,QACV,EAAE,OAAO;AAAA,UACP,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,UAC3B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,UAC5B,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,UAC1B,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,UACxB,SAAS,EAAE,KAAK,CAAC,gBAAgB,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,UAC7D,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA,UACpC,SAAS,EAAE,MAAM,yBAAyB,EAAE,SAAS;AAAA,UACrD,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGM,IAAM,8BAA8B,EAAE,OAAO;AAAA,MAClD,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC9B,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC9B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC9B,CAAC;AAAA;AAAA;;;ACvYD;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,KAAAC,UAAS;AAAlB,IAGa,2BAQA;AAXb;AAAA;AAAA;AAGO,IAAM,4BAA4BA,GAAE,OAAO;AAAA,MAChD,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACnC,CAAC;AAIM,IAAM,4BAA4BA,GAAE,OAAO;AAAA,MAChD,SAAS,0BAA0B,SAAS;AAAA,MAC5C,MAAMA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC;AAAA,MACtC,IAAIA,GACD;AAAA,QACCA,GAAE,OAAO;AAAA,QACTA,GACG,OAAO;AAAA,UACN,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,UACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,UAChC,kBAAkBA,GAAE,OAAO,EAAE,SAAS;AAAA,UACtC,cAAcA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,QAC3D,CAAC,EACA,YAAY;AAAA,MACjB,EACC,SAAS;AAAA,IACd,CAAC;AAAA;AAAA;;;AC3BD,SAAS,KAAAC,UAAS;AAAlB,IAGa,kBAEA,sBAMA,wBAQA,uBAQA,6BASA,6BAaA,wBAKA,4BAIA,uBAKA,uBAKA,0BAOA,sBAUA,wBAKA,yBASA,2BAIA;AAvGb;AAAA;AAAA;AACA;AAEO,IAAM,mBAAmBA,GAAE,KAAK,CAAC,SAAS,QAAQ,CAAC;AAEnD,IAAM,uBAAuBA,GAAE,OAAO;AAAA,MAC3C,IAAIA,GAAE,OAAO;AAAA,MACb,OAAOA,GAAE,OAAO,EAAE,MAAM;AAAA,MACxB,MAAMA,GAAE,OAAO;AAAA,IACjB,CAAC;AAEM,IAAM,yBAAyBA,GAAE,OAAO;AAAA,MAC7C,QAAQA,GAAE,OAAO;AAAA,MACjB,MAAMA,GAAE,OAAO;AAAA,MACf,gBAAgBA,GAAE,KAAK,CAAC,QAAQ,UAAU,CAAC;AAAA,MAC3C,aAAaA,GAAE,QAAQ;AAAA,MACvB,MAAM;AAAA,IACR,CAAC;AAEM,IAAM,wBAAwBA,GAAE,OAAO;AAAA,MAC5C,IAAIA,GAAE,OAAO;AAAA,MACb,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMA,GAAE,OAAO;AAAA,MACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACnC,CAAC;AAEM,IAAM,8BAA8B,sBAAsB,OAAO;AAAA,MACtE,SAASA,GAAE;AAAA,QACTA,GAAE,OAAO;AAAA,UACP,QAAQA,GAAE,OAAO;AAAA,UACjB,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAEM,IAAM,8BAA8BA,GAAE,OAAO;AAAA,MAClD,IAAIA,GAAE,OAAO;AAAA,MACb,UAAUA,GAAE,OAAO;AAAA,MACnB,QAAQA,GAAE,OAAO;AAAA,MACjB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,YAAYA,GAAE,OAAO;AAAA,MACrB,WAAWA,GAAE,OAAO;AAAA,MACpB,gBAAgBA,GAAE,OAAO,EAAE,SAAS;AAAA,MACpC,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AAAA,IACvC,CAAC;AAEM,IAAM,yBAAyBA,GAAE,OAAO;AAAA,MAC7C,OAAOA,GAAE,OAAO,EAAE,MAAM;AAAA,MACxB,MAAM,iBAAiB,SAAS;AAAA,IAClC,CAAC;AAEM,IAAM,6BAA6BA,GAAE,OAAO;AAAA,MACjD,MAAM;AAAA,IACR,CAAC;AAEM,IAAM,wBAAwBA,GAAE,OAAO;AAAA,MAC5C,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACnC,CAAC;AAEM,IAAM,wBAAwBA,GAAE,OAAO;AAAA,MAC5C,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MACjC,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACnC,CAAC;AAEM,IAAM,2BAA2BA,GAAE,OAAO;AAAA,MAC/C,QAAQA,GACL,OAAO,EACP,IAAI,CAAC,EACL,SAAS,iCAAiC;AAAA,IAC/C,CAAC;AAEM,IAAM,uBAAuBA,GAAE,OAAO;AAAA,MAC3C,cAAcA,GAAE,KAAK,CAAC,OAAO,QAAQ,WAAW,SAAS,CAAC,EAAE,SAAS;AAAA,MACrE,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,WAAWA,GAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,YAAY,CAAC,EAAE,SAAS;AAAA,MACrE,eAAeA,GAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS;AAAA,MAChD,OAAOA,GAAE,OAAO,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,MAC5D,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,CAAC;AAEM,IAAM,yBAAyBA,GAAE,OAAO;AAAA,MAC7C,GAAGA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACnB,OAAOA,GAAE,OAAO,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IAC9D,CAAC;AAEM,IAAM,0BAA0BA,GAAE,OAAO;AAAA,MAC9C,QAAQA,GAAE,OAAO;AAAA,MACjB,SAASA,GAAE,QAAQ;AAAA,MACnB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MACrC,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MAC5C,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IACvC,CAAC;AAEM,IAAM,4BAA4BA,GAAE,OAAO;AAAA,MAChD,SAASA,GAAE,MAAM,uBAAuB;AAAA,IAC1C,CAAC;AAEM,IAAM,wBAAwBA,GAAE,OAAO;AAAA,MAC5C,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,MAClD,UAAU,eAAe;AAAA,QACvB,CAAC,WAAW,MAAM,OAAO,UAAU,KAAK,MAAM,MAAM,QAAQ,UAAU,KAAK;AAAA,QAC3E,EAAE,SAAS,wDAAwD;AAAA,MACrE;AAAA,IACF,CAAC;AAAA;AAAA;;;AC7GD;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACJA,SAAS,KAAAC,UAAS;AAwJlB,SAASC,6BACP,MAC+D;AAC/D,QAAM,EAAE,SAAS,eAAe,gBAAgB,GAAG,KAAK,IAAI;AAC5D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,kBAAkB,iBAAiBC;AAAA,EACrD;AACF;AAMA,SAASC,yBACP,MACA,KACA;AACA,QAAM,QAAQ,0BAA0B,KAAK,OAAO;AACpD,MAAI,OAAO;AACT,QAAI,SAAS;AAAA,MACX,MAAMH,GAAE,aAAa;AAAA,MACrB,SAAS;AAAA,MACT,MAAM,CAAC,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAlLA,IA4EMI,mBAIAC,oBAKAC,iBAIAC,uBAMAC,uBAKAC,gBAGOC,wBASPC,mBAIAC,sBAUAC,kBAEAC,oBAQOZ,8BAGPa,8BAuBAC,0BAkBOC,oBAcAC,iBAiBAC,4BAMAC,uBAUAC,2BAMAC,0BAMAC,iBAEAC,qBAeAC,uBAIAC,uBAwBA;AA5Rb,IAAAC,gBAAA;AAAA;AAAA;AACA;AAIA;AAuEA,IAAMvB,oBAAmBJ,GAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,oBAAoB,GAAG,GAAG;AAAA,MAC5E,SAAS;AAAA,IACX,CAAC;AAED,IAAMK,qBAAoBL,GAAE;AAAA,MAC1B,CAAC,QAAQ,OAAO,QAAQ,YAAY,QAAQ;AAAA,MAC5C,EAAE,SAAS,qCAAqC;AAAA,IAClD;AAEA,IAAMM,kBAAiBN,GAAE,OAAiB,CAAC,QAAQ,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAAA,MAC1F,SAAS;AAAA,IACX,CAAC;AAED,IAAMO,wBAAuBP,GAAE,OAAO;AAAA,MACpC,MAAMA,GAAE,QAAQ,SAAS;AAAA,MACzB,KAAKI;AAAA,MACL,SAASJ,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC;AAAA,IAC1C,CAAC;AAED,IAAMQ,wBAAuBD,sBAAqB,OAAO;AAAA,MACvD,MAAMP,GAAE,QAAQ,SAAS;AAAA,MACzB,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,CAAC;AAED,IAAMS,iBAAgBT,GAAE,mBAAmB,QAAQ,CAACO,uBAAsBC,qBAAoB,CAAC;AAGxF,IAAME,yBAAwBV,GAAE,OAAO;AAAA,MAC5C,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACpB,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACvB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,QAAQK,mBAAkB,SAAS;AAAA,MACnC,IAAIC,gBAAe,SAAS;AAAA,MAC5B,MAAMN,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,IACnD,CAAC;AAED,IAAMW,oBAAmBD,uBAAsB,OAAO;AAAA,MACpD,UAAUV,GAAE,MAAMS,cAAa,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACnD,CAAC;AAED,IAAMG,uBAA0DZ,GAC7D,OAAO;AAAA,MACN,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,kBAAkBA,GAAE,OAAO,EAAE,SAAS;AAAA,MACtC,cAAcA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,MACzD,OAAOA,GAAE,KAAK,MAAMA,GAAE,OAAOA,GAAE,OAAO,GAAGY,oBAAmB,CAAC,EAAE,SAAS;AAAA,IAC1E,CAAC,EACA,YAAY;AAEf,IAAMC,mBAAkBb,GAAE,OAAOA,GAAE,OAAO,GAAGY,oBAAmB,EAAE,SAAS;AAE3E,IAAME,qBAAoBd,GACvB,OAAO;AAAA,MACN,MAAMA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC;AAAA,MACtC,IAAIa;AAAA,IACN,CAAC,EACA,SAAS;AAGL,IAAMX,+BAA8B;AAG3C,IAAMa,+BAA8Bf,GAAE,OAAO;AAAA,MAC3C,KAAKA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MAChC,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,SAASc;AAAA,MACT,gBAAgBd,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA;AAAA,MAEtC,SAASA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,MAC/B,SAASA,GAAE,MAAMW,iBAAgB,EAAE,IAAI,GAAG,iCAAiC;AAAA,IAC7E,CAAC;AAYD,IAAMK,2BAA0BD,6BAA4B;AAAA,MAC1Dd;AAAA,IACF;AAgBO,IAAMgB,qBAAoBD,yBAAwB;AAAA,MACvDb;AAAA,IACF;AAYO,IAAMe,kBAAiBlB,GAC3B,OAAO;AAAA,MACN,OAAOA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS;AAAA,MAC5C,QAAQA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,IAC9C,CAAC,EACA;AAAA,MACC,CAAC,SAAS;AACR,cAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,YAAI,OAAO,SAAS,KAAK,KAAK,OAAO,SAAS,GAAG;AAC/C,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,MACA,EAAE,SAAS,8CAA8C;AAAA,IAC3D;AAGK,IAAMmB,6BAA4BnB,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAM3D,IAAMoB,wBAAuB;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEO,IAAMC,4BAA2BrB,GAAE,KAAKoB,qBAAoB;AAM5D,IAAME,2BAA0BtB,GAAE,OAAO;AAAA,MAC9C,SAASmB;AAAA,MACT,QAAQE,0BAAyB,SAAS;AAAA,IAC5C,CAAC;AAGM,IAAME,kBAAiB,CAAC,OAAO,UAAU,QAAQ,QAAQ;AAEzD,IAAMC,sBAAqBxB,GAAE,KAAKuB,eAAc;AAehD,IAAME,wBAAuBzB,GAAE,OAAO;AAAA,MAC3C,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,CAAC;AAEM,IAAM0B,wBAAuBX,6BACjC,OAAO;AAAA,MACN,UAAUG,gBAAe,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKlC,UAAUlB,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKrC,UAAUwB,oBAAmB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKtC,QAAQF,yBAAwB,SAAS;AAAA,MACzC,OAAOG,sBAAqB,SAAS;AAAA,IACvC,CAAC,EACA,UAAUxB,4BAA2B,EACrC,YAAYE,wBAAuB;AAG/B,IAAM,yBAAyBmB;AAAA;AAAA;;;AC5RtC,IAAAM,aAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA,IAAAC;AACA;AAAA;AAAA;;;ACDA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IACa,yBAUA;AAXb;AAAA;AAAA;AACO,IAAM,0BAA0B;AAAA,MACrC;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAEO,IAAM,uBAAuB,wBAAwB,SAAS;AAAA;AAAA;;;ACXrE;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;AC4CO,SAAS,6BAA6B,SAAyB;AACpE,QAAM,UAAU,QAAQ,KAAK,EAAE,QAAQ,QAAQ,EAAE;AACjD,MAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,GAAG,OAAO;AACnB;AAMO,SAAS,yBAAiC;AAC/C,QAAM,WACJ,QAAQ,IAAI,oBAAoB,KAAK,KACrC,QAAQ,IAAI,mBAAmB,KAAK;AACtC,MAAI,UAAU;AACZ,WAAO,6BAA6B,QAAQ;AAAA,EAC9C;AACA,MAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAnEA,IAAa,oBAEA,oBACA,aAiBA;AApBb;AAAA;AAAA;AAAO,IAAM,qBAAqB;AAE3B,IAAM,qBAAqB;AAC3B,IAAM,cAAc;AAiBpB,IAAM,iBAAiB,GAAG,kBAAkB;AAAA;AAAA;;;ACpBnD,SAAS,KAAAC,UAAS;AAAlB,IAMa,4BAYA;AAlBb;AAAA;AAAA;AACA;AAEA;AAGO,IAAM,6BAA6B,KAAK,KAAK,KAAK;AAYlD,IAAM,oBAAoBA,GAAE,OAAO;AAAA,MACxC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,YAAYA,GAAE,OAAO;AAAA,IACvB,CAAC;AAAA;AAAA;;;AC5BD;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AACA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAGA;AAAA;AAAA;;;ACRO,SAAS,8BACd,SACAC,OACgC;AAChC,OAAK;AAEL,MAAI,CAACA,MAAK,SAAS;AACjB,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,UAAUA,MAAK,QAAQ,OAAO;AAAA,IAC9B,MAAMA,MAAK,QAAQ,OAAO;AAAA,IAC1B,WAAWA,MAAK,QAAQ;AAAA,IACxB,WAAW,IAAI,KAAKA,MAAK,aAAa,KAAK,IAAI,CAAC;AAAA,IAChD,QAAQA,MAAK;AAAA,EACf;AACF;AArCA,IAEa,kBAOA;AATb;AAAA;AAAA;AAEO,IAAM,mBAAN,cAA+B,MAAM;AAAA,MAC1C,YAAY,SAAiB;AAC3B,cAAM,OAAO;AACb,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAEO,IAAM,mBAAN,cAA+B,MAAM;AAAA,MAC1C,YAAY,SAAiB;AAC3B,cAAM,OAAO;AACb,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;ACDA,eAAsB,kBACpB,UAC6B;AAC7B,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,QAAM,WAAW,MAAM,SAAS,KAAK;AAErC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,YAAY,EAAE,SAAS,kBAAkB,GAAG;AAC1D,QAAI;AACF,aAAO,KAAK,MAAM,QAAQ;AAAA,IAC5B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,QAAQ;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBACd,MACA,UACQ;AACR,MAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC5D,UAAM,SAAS;AACf,UAAM,eAAe,OAAO;AAC5B,UAAM,YAAY,OAAO;AACzB,QAAI,OAAO,iBAAiB,YAAY,aAAa,KAAK,GAAG;AAC3D,UAAI,OAAO,cAAc,YAAY,UAAU,KAAK,GAAG;AACrD,eAAO,GAAG,aAAa,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC;AAAA,MACnD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,YAAY,KAAK,KAAK,GAAG;AAC3C,UAAM,UAAU,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC/C,UAAM,UAAU,QAAQ,SAAS,MAAM,GAAG,QAAQ,MAAM,GAAG,GAAG,CAAC,QAAQ;AACvE,WAAO,GAAG,QAAQ,wCAAwC,OAAO;AAAA,EACnE;AAEA,SAAO;AACT;AA7DA,IAAa;AAAb;AAAA;AAAA;AAAO,IAAM,iBAAN,cAA6B,MAAM;AAAA,MACxC,YACE,SACgB,YACA,UAChB;AACA,cAAM,OAAO;AAHG;AACA;AAGhB,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;ACGO,SAAS,0BACd,MACwB;AACxB,MAAI,KAAK,SAAS,UAAU;AAC1B,UAAMC,WAAkC;AAAA,MACtC,aAAa,KAAK;AAAA,IACpB;AACA,QAAI,KAAK,cAAc,KAAK,GAAG;AAC7B,MAAAA,SAAQ,+BAA+B,IAAI,KAAK,aAAa,KAAK;AAAA,IACpE;AACA,WAAOA;AAAA,EACT;AAEA,QAAM,UAAkC;AAAA,IACtC,eAAe,UAAU,KAAK,KAAK;AAAA,IACnC,2BAA2B,KAAK;AAAA,IAChC,6BAA6B,KAAK;AAAA,EACpC;AAEA,MAAI,KAAK,cAAc,KAAK,GAAG;AAC7B,YAAQ,+BAA+B,IAAI,KAAK,aAAa,KAAK;AAAA,EACpE;AAEA,SAAO;AACT;AAEO,SAAS,2BAA2B,WAQnB;AACtB,MAAI,WAAW,cAAc;AAC3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,GAAG,UAAU;AAAA,IACf;AAAA,EACF;AAEA,QAAM,SAAS,WAAW,UAAU,QAAQ,IAAI;AAChD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,UAAU,OAAO;AAClC;AA9DA,IAUa;AAVb;AAAA;AAAA;AAUO,IAAM,kCAAkC;AAAA;AAAA;;;ACYxC,SAAS,4BACd,aACwB;AACxB,MAAI,CAAC,aAAa;AAChB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAkC,CAAC;AACzC,QAAM,SAAS,YAAY,QAAQ,KAAK;AACxC,QAAM,eAAe,YAAY,cAAc,KAAK;AAEpD,MAAI,QAAQ;AACV,YAAQ,wBAAwB,IAAI;AAAA,EACtC;AACA,MAAI,cAAc;AAChB,YAAQ,+BAA+B,IAAI;AAAA,EAC7C;AAEA,SAAO;AACT;AAzCA,IAAa,0BACA;AADb;AAAA;AAAA;AAAO,IAAM,2BAA2B;AACjC,IAAM,kCAAkC;AAAA;AAAA;;;AC0FxC,SAAS,eAAe,QAKlB;AACX,QAAM,UAAU,OAA+B;AAAA,IAC7C,gBAAgB;AAAA,IAChB,GAAG,0BAA0B,OAAO,IAAI;AAAA,IACxC,GAAG,4BAA4B,OAAO,eAAe;AAAA,EACvD;AAEA,SAAO;AAAA,IACL,MAAM,OAAO,OAAmD;AAC9D,YAAM,cAAc;AAAA,QAClB,GAAG;AAAA,QACH,KAAK,MAAM,OAAO,OAAO;AAAA,QACzB,UAAU,MAAM,YAAY,CAAC;AAAA,MAC/B;AACA,YAAM,aAAa,0BAA0B,UAAU,WAAW;AAClE,UAAI,CAAC,WAAW,SAAS;AACvB,cAAM,IAAI;AAAA,UACR,iBAAiB,WAAW,MAAM,OAAO,CAAC,GAAG,OAAO;AAAA,UACpD;AAAA,UACA,WAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,gBAAgB;AAAA,QAC5D,QAAQ;AAAA,QACR,SAAS,QAAQ;AAAA,QACjB,MAAM,KAAK,UAAU,WAAW,IAAI;AAAA,MACtC,CAAC;AAED,YAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI;AAAA,UACR,gBAAgB,MAAM,uBAAuB;AAAA,UAC7C,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS;AACf,aAAO,EAAE,YAAY,OAAO,YAAY,OAAO,OAAO,MAAM;AAAA,IAC9D;AAAA,IAEA,MAAM,MAAM,QAAgB,SAA2C;AACrE,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,eAAe,sCAAsC,GAAG;AAAA,MACpE;AAEA,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,OAAO,OAAO,gBAAgB,mBAAmB,MAAM,CAAC;AAAA,QAC3D;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,QAAQ;AAAA,UACjB,MAAM,KAAK,UAAU,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,QAClD;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,cAAM,IAAI;AAAA,UACR,gBAAgB,MAAM,sBAAsB;AAAA,UAC5C,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,kBAAkB,OAAkD;AACxE,YAAM,aAAa,6BAA6B,UAAU,KAAK;AAC/D,UAAI,CAAC,WAAW,SAAS;AACvB,cAAM,IAAI;AAAA,UACR,6BAA6B,WAAW,MAAM,OAAO,CAAC,GAAG,OAAO;AAAA,UAChE;AAAA,UACA,WAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,2BAA2B;AAAA,QACvE,QAAQ;AAAA,QACR,SAAS,QAAQ;AAAA,QACjB,MAAM,KAAK,UAAU,WAAW,IAAI;AAAA,MACtC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,cAAM,IAAI;AAAA,UACR,gBAAgB,MAAM,oCAAoC;AAAA,UAC1D,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,sBAAsB,cAAwD;AAClF,YAAM,UAAU,aAAa,KAAK;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,eAAe,4BAA4B,GAAG;AAAA,MAC1D;AAEA,YAAM,MAAM,IAAI,IAAI,GAAG,OAAO,OAAO,0BAA0B;AAC/D,UAAI,aAAa,IAAI,gBAAgB,OAAO;AAE5C,YAAM,WAAW,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,QAC3C,QAAQ;AAAA,QACR,SAAS,QAAQ;AAAA,MACnB,CAAC;AAED,YAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI;AAAA,UACR,gBAAgB,MAAM,2CAA2C;AAAA,UACjE,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAY,KAAgD;AAClE,aAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC;AAAA,IAC/C;AAAA,IAEA,MAAM,mBAAmB,OAAmD;AAC1E,YAAM,aAAa,8BAA8B,UAAU,KAAK;AAChE,UAAI,CAAC,WAAW,SAAS;AACvB,cAAM,IAAI;AAAA,UACR,wBAAwB,WAAW,MAAM,OAAO,CAAC,GAAG,OAAO;AAAA,UAC3D;AAAA,UACA,WAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,4BAA4B;AAAA,QACxE,QAAQ;AAAA,QACR,SAAS,QAAQ;AAAA,QACjB,MAAM,KAAK,UAAU,WAAW,IAAI;AAAA,MACtC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,cAAM,IAAI;AAAA,UACR,gBAAgB,MAAM,qCAAqC;AAAA,UAC3D,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,iBAAiB,OAAiD;AACtE,YAAM,aAAa,6BAA6B,UAAU,KAAK;AAC/D,UAAI,CAAC,WAAW,SAAS;AACvB,cAAM,IAAI;AAAA,UACR,6BAA6B,WAAW,MAAM,OAAO,CAAC,GAAG,OAAO;AAAA,UAChE;AAAA,UACA,WAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,2BAA2B;AAAA,QACvE,QAAQ;AAAA,QACR,SAAS,QAAQ;AAAA,QACjB,MAAM,KAAK,UAAU,WAAW,IAAI;AAAA,MACtC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,cAAM,IAAI;AAAA,UACR,gBAAgB,MAAM,mCAAmC;AAAA,UACzD,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,OAAyC;AACtD,YAAM,aAAa,4BAA4B,UAAU,KAAK;AAC9D,UAAI,CAAC,WAAW,SAAS;AACvB,cAAM,IAAI;AAAA,UACR,4BAA4B,WAAW,MAAM,OAAO,CAAC,GAAG,OAAO;AAAA,UAC/D;AAAA,UACA,WAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,0BAA0B;AAAA,QACtE,QAAQ;AAAA,QACR,SAAS,QAAQ;AAAA,QACjB,MAAM,KAAK,UAAU,WAAW,IAAI;AAAA,MACtC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,cAAM,IAAI;AAAA,UACR,gBAAgB,MAAM,mCAAmC;AAAA,UACzD,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AArSA;AAAA;AAAA;AAAA;AAYA;AACA;AAIA;AAAA;AAAA;;;ACkKA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAAS,6BAAiD;AACxD,QAAM,UACJ,QAAQ,IAAI,eAAe,KAAK,KAAK,QAAQ,IAAI,yBAAyB,KAAK;AACjF,SAAO,WAAW;AACpB;AAEA,SAAS,kBAAkB,OAA+D;AACxF,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,MAAM;AACzB,UAAM,KAAK,MAAM,QAAQ;AACzB,WAAO,OAAO,MAAM,EAAE,IAAI,SAAY;AAAA,EACxC;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,EAC1C;AAEA,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,SAAO,OAAO,MAAM,MAAM,IAAI,SAAY;AAC5C;AAEA,SAAS,oBAAoB,OAAsC;AACjE,MAAI,iBAAiB,MAAM;AACzB,UAAM,KAAK,MAAM,QAAQ;AACzB,QAAI,OAAO,MAAM,EAAE,GAAG;AACpB,YAAM,IAAI,eAAe,uCAAuC,GAAG;AAAA,IACrE;AACA,WAAO,MAAM,YAAY;AAAA,EAC3B;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,MAAM,KAAK,MAAM,KAAK,CAAC,GAAG;AACjE,WAAO,IAAI,KAAK,KAAK,EAAE,YAAY;AAAA,EACrC;AAEA,QAAM,IAAI,eAAe,gEAAgE,GAAG;AAC9F;AAmYO,SAAS,aAAa,QAAoC;AAC/D,SAAO,IAAI,UAAU,MAAM;AAC7B;AAEO,SAAS,uBACd,SACA,SAC6B;AAC7B,SAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,IAC9B,GAAG;AAAA,IACH,UAAU,kBAAkB,OAAO;AAAA,EACrC,EAAE;AACJ;AAEA,SAAS,kBACP,SACiD;AACjD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,KAAK,QAAQ;AAAA,MACb,SAAS,QAAQ,WAAW,CAAC;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,SAAS,0BAGPC,OACA,gBAMkB;AAClB,QAAM;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT;AAAA,IACA,KAAK;AAAA,IACL,GAAG;AAAA,EACL,IAAIA;AAEJ,QAAM,UAAU,eAAe;AAC/B,QAAM,oBAAiD,UACnD,uBAAuB,SAAS,OAAO,IACtC;AAEL,QAAM,MAAM,WAAW,eAAe;AAEtC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,eAAe;AAAA,IAC/B,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,IACrB,GAAI,eAAe,SAAY,EAAE,YAAY,oBAAoB,UAAU,EAAE,IAAI,CAAC;AAAA,IAClF,SAAS;AAAA,EACX;AACF;AAhqBA,IAgLM,0BACA,oBAoFO;AArQb;AAAA;AAAA;AAAA,IAAAC;AAOA;AAKA;AAKA;AACA;AACA;AACA;AAKA;AAsMA;AA/CA,IAAM,2BAA2B;AACjC,IAAM,qBAAqB,KAAK,KAAK,KAAK;AAoFnC,IAAM,YAAN,MAAgB;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGR;AAAA;AAAA,MAEA;AAAA,MAET,YAAY,QAAyB;AACnC,YAAI,OAAO,WAAW,OAAO,SAAS;AACpC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,cAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAC5C,cAAM,eAAe,OAAO;AAC5B,YAAI,UAAU,cAAc;AAC1B,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,aAAK,OAAO,2BAA2B;AAAA,UACrC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,UAC3B,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,QACzC,CAAC;AACD,aAAK,kBAAkB,OAAO;AAC9B,aAAK,UAAU,OAAO,WAAW,uBAAuB;AACxD,aAAK,MAAM,OAAO;AAClB,aAAK,eAAe,OAAO,WAAW,2BAA2B;AACjE,aAAK,iBACH,OAAO,UAAU,kBAAkBC;AACrC,aAAK,UAAU,OAAO;AACtB,aAAK,UAAU,OAAO,WAAW,CAAC;AAElC,aAAK,QAAQ;AAAA,UACX,QAAQ,CAACF,UAAS,KAAK,kBAAkBA,KAAI;AAAA,UAC7C,KAAK,CAAC,WAAW,KAAK,YAAY,MAAM;AAAA,UACxC,QAAQ,CAAC,WAAW,KAAK,kBAAkB,MAAM;AAAA,UACjD,YAAY,CAAC,UAAU,KAAK,iBAAiB,KAAK;AAAA,UAClD,MAAM,CAAC,UAAU,KAAK,iBAAiB,KAAK;AAAA,UAC5C,QAAQ,CAAC,UAAU,KAAK,mBAAmB,KAAK;AAAA,QAClD;AACA,aAAK,QAAQ,eAAe;AAAA,UAC1B,SAAS,KAAK;AAAA,UACd,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,iBAAiB,KAAK;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,MAEQ,YAAY,OAAwD;AAC1E,eAAO;AAAA,UACL,gBAAgB;AAAA,UAChB,GAAG,0BAA0B,KAAK,IAAI;AAAA,UACtC,GAAG,4BAA4B,KAAK,eAAe;AAAA,UACnD,GAAG;AAAA,QACL;AAAA,MACF;AAAA,MAEA,MAAc,kBACZA,OAC+B;AAC/B,cAAM,iBAAiB,0BAA0BA,OAAM;AAAA,UACrD,SAAS,KAAK;AAAA,UACd,KAAK,KAAK;AAAA,UACV,gBAAgB,KAAK;AAAA,UACrB,cAAc,KAAK;AAAA,QACrB,CAAC;AACD,cAAM,eAAeA,MAAK,WAAW,KAAK;AAC1C,cAAM,cAAc;AAAA,UAClB,GAAG;AAAA,UACH,GAAIA,MAAK,aAAa,SAAY,EAAE,UAAUA,MAAK,SAAS,IAAI,CAAC;AAAA,UACjE,GAAIA,MAAK,aAAa,SAAY,EAAE,UAAUA,MAAK,SAAS,IAAI,CAAC;AAAA,UACjE,GAAIA,MAAK,aAAa,SAAY,EAAE,UAAUA,MAAK,SAAS,IAAI,CAAC;AAAA,UACjE,GAAIA,MAAK,WAAW,SAAY,EAAE,QAAQA,MAAK,OAAO,IAAI,CAAC;AAAA,UAC3D,GAAI,iBAAiB,SAAY,EAAE,OAAO,EAAE,SAAS,aAAa,EAAE,IAAI,CAAC;AAAA,QAC3E;AACA,cAAM,aAAaG,sBAAqB,UAAU,WAAW;AAC7D,YAAI,CAAC,WAAW,SAAS;AACvB,gBAAM,IAAI;AAAA,YACR,iBAAiB,WAAW,MAAM,OAAO,CAAC,GAAG,OAAO;AAAA,YACpD;AAAA,YACA,WAAW,MAAM;AAAA,UACnB;AAAA,QACF;AAEA,cAAM,UAAU,KAAK;AAAA,UACnBH,MAAK,iBACD,EAAE,mBAAmBA,MAAK,eAAe,IACzC;AAAA,QACN;AAEA,cAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,KAAK;AAAA,UAC/C,QAAQ;AAAA,UACR;AAAA,UACA,MAAM,KAAK,UAAU,WAAW,IAAI;AAAA,QACtC,CAAC;AAED,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAE7C,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI;AAAA,YACR,gBAAgB,MAAM,uBAAuB;AAAA,YAC7C,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAEA,eAAQ,KAAiC;AAAA,MAC3C;AAAA,MAEA,MAAM,YACJA,OAC+B;AAC/B,cAAM,iBAAiB,0BAA0BA,OAAM;AAAA,UACrD,SAAS,KAAK;AAAA,UACd,KAAK,KAAK;AAAA,UACV,gBAAgB,KAAK;AAAA,UACrB,cAAc,KAAK;AAAA,QACrB,CAAC;AACD,cAAM,kBAAkB,MAAM,KAAK,kBAAkBA,KAAI;AACzD,cAAM,cAAc,eAAe,QAAQ;AAAA,UACzC,CAAC,WAAW,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS;AAAA,QACzE;AAEA,YAAI,aAAa;AACf,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAEA,cAAM,YAAY,KAAK,QAAQ,aAAa;AAC5C,cAAM,iBAAiB,KAAK,QAAQ,cAAc;AAClD,cAAM,kBAAkB,KAAK,IAAI,IAAI;AACrC,cAAM,eAAe,kBAAkB,gBAAgB,UAAU;AACjE,cAAM,WACJ,iBAAiB,SAAY,KAAK,IAAI,iBAAiB,YAAY,IAAI;AACzE,cAAM,SAAS,gBAAgB;AAE/B,eAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,gBAAM,WAAW,MAAM,KAAK,YAAY,MAAM;AAE9C,cAAI,UAAU,WAAW,aAAa,SAAS,SAAS;AACtD,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM;AAAA,cACN,GAAI;AAAA,gBACF,eAAe;AAAA,gBACf;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,cAAI,UAAU,WAAW,aAAc,YAAY,KAAK,IAAI,KAAK,SAAS,YAAa;AACrF,kBAAM,IAAI,iBAAiB,qDAAqD;AAAA,UAClF;AAEA,gBAAM,cAAc,WAAW,KAAK,IAAI;AACxC,gBAAM,MAAM,KAAK,IAAI,gBAAgB,KAAK,IAAI,GAAG,WAAW,CAAC,CAAC;AAAA,QAChE;AAEA,YAAI,iBAAiB,UAAa,KAAK,IAAI,KAAK,cAAc;AAC5D,gBAAM,IAAI,iBAAiB,qDAAqD;AAAA,QAClF;AAEA,cAAM,IAAI,iBAAiB,4BAA4B,SAAS,IAAI;AAAA,MACtE;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,WACJA,OAC+B;AAC/B,eAAO,KAAK,MAAM,OAAOA,KAAI;AAAA,MAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,QAAQ,QAAsC;AAClD,eAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,WAAW,OAA+C;AAC9D,eAAO,KAAK,MAAM,WAAW,KAAK;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,WAAW,QAA+B;AAC9C,eAAO,KAAK,MAAM,OAAO,MAAM;AAAA,MACjC;AAAA,MAEA,MAAc,YAAY,QAAsC;AAC9D,cAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,UAAU,MAAM,IAAI;AAAA,UAC9D,QAAQ;AAAA,UACR,SAAS,KAAK,YAAY;AAAA,QAC5B,CAAC;AAED,YAAI,SAAS,WAAW,KAAK;AAC3B,iBAAO;AAAA,QACT;AAEA,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAE7C,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI;AAAA,YACR,gBAAgB,MAAM,oBAAoB;AAAA,YAC1C,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,iBAAiB;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAA2C;AACzC,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,eAAe,0CAA0C,GAAG;AAAA,QACxE;AAEA,cAAM,aAAa,uBAAuB,UAAU,EAAE,SAAS,OAAO,CAAC;AACvE,YAAI,CAAC,WAAW,SAAS;AACvB,gBAAM,IAAI;AAAA,YACR,mBAAmB,WAAW,MAAM,OAAO,CAAC,GAAG,OAAO;AAAA,YACtD;AAAA,YACA,WAAW,MAAM;AAAA,UACnB;AAAA,QACF;AAEA,cAAM,WAAW,MAAM;AAAA,UACrB,GAAG,KAAK,OAAO,YAAY,mBAAmB,QAAQ,CAAC;AAAA,UACvD;AAAA,YACE,QAAQ;AAAA,YACR,SAAS,KAAK,YAAY;AAAA,YAC1B,MAAM,KAAK,UAAU,WAAW,IAAI;AAAA,UACtC;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAE7C,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI;AAAA,YACR,gBAAgB,MAAM,uBAAuB;AAAA,YAC7C,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAEA,eAAQ,KAAyC;AAAA,MACnD;AAAA,MAEA,MAAc,kBAAkB,QAA+B;AAC7D,cAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,UAAU,MAAM,WAAW;AAAA,UACrE,QAAQ;AAAA,UACR,SAAS,KAAK,YAAY;AAAA,QAC5B,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,gBAAM,IAAI;AAAA,YACR,gBAAgB,MAAM,uBAAuB;AAAA,YAC7C,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAc,iBAAiB,OAG5B;AACD,cAAM,SAAS,IAAI,gBAAgB;AACnC,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC,GAAG;AACtD,cAAI,UAAU,UAAa,UAAU,IAAI;AACvC,mBAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,UAC/B;AAAA,QACF;AACA,cAAM,SAAS,OAAO,OAAO,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK;AAE3D,cAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,SAAS,MAAM,IAAI;AAAA,UAC7D,QAAQ;AAAA,UACR,SAAS,KAAK,YAAY;AAAA,QAC5B,CAAC;AAED,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI;AAAA,YACR,gBAAgB,MAAM,sBAAsB;AAAA,YAC5C,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,mBAAmB,OAG9B;AACD,cAAM,SAAS,IAAI,gBAAgB,EAAE,GAAG,MAAM,EAAE,CAAC;AACjD,YAAI,MAAM,UAAU,QAAW;AAC7B,iBAAO,IAAI,SAAS,OAAO,MAAM,KAAK,CAAC;AAAA,QACzC;AAEA,cAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,iBAAiB,OAAO,SAAS,CAAC,IAAI;AAAA,UAChF,QAAQ;AAAA,UACR,SAAS,KAAK,YAAY;AAAA,QAC5B,CAAC;AAED,cAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI;AAAA,YACR,gBAAgB,MAAM,wBAAwB;AAAA,YAC9C,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACplBO,SAAS,uBACd,WACiB;AACjB,QAAM,eAAe,WAAW;AAChC,QAAM,SAAS,WAAW,UAAU,QAAQ,IAAI;AAEhD,MAAI,gBAAgB,QAAQ;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,WAAW,WAAW,uBAAuB;AAC7D,QAAM,MAAM,WAAW,OAAO,QAAQ,IAAI;AAE1C,MAAI,cAAc;AAChB,WAAO,MACH,EAAE,cAAc,SAAS,IAAI,IAC7B,EAAE,cAAc,QAAQ;AAAA,EAC9B;AAEA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,EAAE,QAAQ,SAAS,IAAI,IAAI,EAAE,QAAQ,QAAQ;AAC5D;AAtCA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAoCP,SAAS,eAAe,SAAgD;AACtE,SACE,OAAO,YAAY,YACnB,QAAQ,SAAS,KACjB,YAAY;AAEhB;AAEA,SAAS,mBACP,MACiD;AACjD,QAAM,SAAS,QAAQ,MAAM,cAAc;AAC3C,QAAM,MAAM,QAAQ,YAAY;AAChC,MAAI,CAAC,OAAO,CAAC,eAAe,IAAI,OAAO,GAAG;AACxC,WAAO;AAAA,EACT;AACA,SAAO,EAAE,SAAS,IAAI,SAAS,QAAQ,IAAI,OAAO;AACpD;AAEA,SAAS,mBAAmB,aAA8B;AACxD,MAAI,aAAa;AACf,UAAM,SAAS,KAAK,MAAM,WAAW;AACrC,QAAI,CAAC,OAAO,MAAM,MAAM,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,KAAK,IAAI;AAClB;AAEA,SAAS,iBAAiB,WAA2C;AACnE,MAAI,qBAAqB,MAAM;AAC7B,WAAO,UAAU,QAAQ;AAAA,EAC3B;AACA,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,MAAM,SAAS;AACnC,SAAO,OAAO,MAAM,MAAM,IAAI,KAAK,IAAI,IAAI;AAC7C;AAQO,SAAS,4BACd,SAC2B;AAC3B,MAAI,cAAc,SAAS;AACzB,WAAO;AAAA,MACL,QAAQ,QAAQ;AAAA,MAChB,QAAQ;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,MAAM,QAAQ;AAAA,MAChB;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,QAAQ;AAAA,MACN,IAAI,QAAQ,OAAO;AAAA,MACnB,OAAO,QAAQ,OAAO;AAAA,MACtB,MAAM,QAAQ,OAAO;AAAA,IACvB;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,EACrB;AACF;AAMO,SAAS,2BACdI,OACA,SACqB;AACrB,QAAM,UAAU,mBAAmB,SAAS,IAAI;AAChD,SAAO;AAAA,IACL,SAAS,SAAS,WAAW;AAAA,IAC7B,QAAQ,SAAS,UAAU;AAAA,IAC3B,QAAQA,MAAK;AAAA,IACb,UAAUA,MAAK;AAAA,IACf,eAAe,mBAAmBA,MAAK,WAAW;AAAA,EACpD;AACF;AAKO,SAAS,4BACd,QACA,SACkB;AAClB,QAAM,SAAU,SAAS,QAAQ,MAAM,cAAc;AACrD,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,UAAU,SAAS,cAAc,WAAW;AACjE,QAAM,OAAO,OAAO;AAAA,IAClB;AAAA,IACA,CAAC;AAAA,IACD,MAAM,QAAQ,QAAQ,OAAO,GAAG,MAAM;AAAA,EACxC;AAEA,OAAK,aAAa,qBAAqB,OAAO,MAAM;AACpD,MAAI,OAAO,UAAU;AACnB,SAAK,aAAa,uBAAuB,OAAO,QAAQ;AAAA,EAC1D;AAEA,SAAO;AACT;AAKO,SAAS,6BACd,SACA,UAAsC,CAAC,GACjC;AACN,QAAM,OAAQ,QAAQ,QAAQ,MAAM,cAAc;AAClD,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,QAAM,QAAQ,4BAA4B,OAAO;AACjD,QAAM,cAAc,iBAAiB,MAAM,SAAS;AACpD,QAAM,SAAS,QAAQ;AACvB,QAAM,cACJ,UAAU,OAAO,KAAK,IAAI,GAAG,cAAc,OAAO,aAAa,IAAI;AAErE,OAAK,aAAa,qBAAqB,MAAM,MAAM;AACnD,OAAK,aAAa,uBAAuB,MAAM,OAAO,EAAE;AACxD,MAAI,MAAM,OAAO,OAAO;AACtB,SAAK,aAAa,0BAA0B,MAAM,OAAO,KAAK;AAAA,EAChE;AACA,MAAI,MAAM,WAAW;AACnB,SAAK,aAAa,wBAAwB,MAAM,SAAS;AAAA,EAC3D;AACA,OAAK,aAAa,wBAAwB,IAAI,KAAK,WAAW,EAAE,YAAY,CAAC;AAC7E,MAAI,eAAe,MAAM;AACvB,SAAK,aAAa,2BAA2B,WAAW;AAAA,EAC1D;AACA,MAAI,MAAM,UAAU;AAClB,SAAK,aAAa,uBAAuB,MAAM,QAAQ;AAAA,EACzD;AAEA,QAAM,kBAA6D;AAAA,IACjE,qBAAqB,MAAM;AAAA,IAC3B,uBAAuB,MAAM,OAAO;AAAA,EACtC;AACA,MAAI,MAAM,WAAW;AACnB,oBAAgB,sBAAsB,IAAI,MAAM;AAAA,EAClD;AACA,MAAI,eAAe,MAAM;AACvB,oBAAgB,yBAAyB,IAAI;AAAA,EAC/C;AAEA,MAAI,QAAQ,qBAAqB,MAAM,OAAO,QAAQ,MAAM;AAC1D,UAAM,aAAa,KAAK,UAAU,MAAM,OAAO,IAAI;AACnD,UAAM,YACJ,WAAW,SAAS,MAAM,GAAG,WAAW,MAAM,GAAG,GAAG,CAAC,WAAM;AAC7D,SAAK,aAAa,yBAAyB,SAAS;AACpD,oBAAgB,uBAAuB,IAAI;AAAA,EAC7C;AAEA,OAAK,SAAS,oBAAoB,eAAe;AACnD;AAWO,SAAS,0BACd,MACA,SACA,UAA4C,CAAC,GACvC;AACN,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,YAAY,UAAU,YAAY;AAE1D,MAAI,WAAW,YAAY,WAAW;AACpC,iCAA6B,SAAS;AAAA,MACpC;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AACD,SAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAAA,EAC5C,OAAO;AACL,SAAK,aAAa,qBAAqB,OAAO;AAC9C,SAAK,UAAU;AAAA,MACb,MAAM,eAAe;AAAA,MACrB,SACE,YAAY,YACR,+CACA;AAAA,IACR,CAAC;AAAA,EACH;AAEA,OAAK,IAAI;AACX;AA9PA,IAYM,aACA,gBACA,oBAEA;AAhBN;AAAA;AAAA;AAYA,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,qBAAqB;AAE3B,IAAM,mBAAmB;AAAA;AAAA;;;ACElB,SAAS,0BAA0B,YAA+B;AACvE,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AACA,MAAI,eAAe,OAAO;AACxB,WAAO;AAAA,EACT;AACA,QAAM,MAAM,QAAQ,IAAI;AACxB,SAAO,QAAQ,UAAU,QAAQ;AACnC;AAEO,SAAS,wBAEd,SAA6D;AAC7D,QAAM,EAAE,YAAY,aAAa,uBAAuB,wBAAwB,GAAG,KAAK,IACtF;AACF,SAAO;AACT;AAeO,SAAS,4BACdC,OACA,UAAqF,CAAC,GACvD;AAC/B,QAAM,aAAa,0BAA0B,QAAQ,UAAU;AAC/D,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,YAAY,MAAM;AAAA,EAC7B;AAEA,QAAM,SAAS,2BAA2BA,KAAI;AAC9C,QAAM,WAAW,4BAA4B,MAAM;AAEnD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,mBAAmB,QAAQ;AAAA,EAC7B;AACF;AAEO,SAAS,6BACd,SACA,SACA,SACM;AACN,MAAI,CAAC,QAAQ,YAAY;AACvB;AAAA,EACF;AAEA,4BAA0B,QAAQ,UAAU,SAAS;AAAA,IACnD,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,mBAAmB,QAAQ;AAAA,EAC7B,CAAC;AACH;AApFA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACcO,SAAS,iCACd,OACyC;AACzC,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,WAAW,YAAY,OAAO,EAAE,cAAc,UAAU;AACnE,WAAO;AAAA,EACT;AACA,QAAM,SAAS,EAAE;AACjB,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AACV,SAAO,OAAO,EAAE,OAAO,YAAY,UAAU;AAC/C;AA/BA;AAAA;AAAA;AAAA;AAAA;;;ACGO,SAAS,kBAAkB,iBAGhC;AACA,QAAM,eACJ,oBAAoB,SAChBC,mBAAkB,eAAe,IACjC,KAAK,IAAI,IAAI;AAEnB,QAAM,aAAa,eAAe,KAAK,IAAI;AAC3C,MAAI,cAAc,GAAG;AACnB,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,SAAO;AAAA,IACL,YAAY,mBAAmB,IAAI,KAAK,YAAY;AAAA,IACpD,SAAS,oBAAoB,UAAU;AAAA,EACzC;AACF;AAEO,SAASA,mBAAkB,OAA8B;AAC9D,MAAI,iBAAiB,MAAM;AACzB,UAAM,KAAK,MAAM,QAAQ;AACzB,QAAI,OAAO,MAAM,EAAE,GAAG;AACpB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,MAAI,OAAO,MAAM,MAAM,GAAG;AACxB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,SAAO;AACT;AAGO,SAAS,oBAAoB,YAA4B;AAC9D,QAAM,UAAU,KAAK,KAAK,aAAa,GAAI;AAC3C,MAAI,WAAW,GAAG;AAChB,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,MAAI,WAAW,OAAQ;AACrB,WAAO,GAAG,KAAK,KAAK,UAAU,KAAM,CAAC;AAAA,EACvC;AACA,MAAI,WAAW,MAAO;AACpB,WAAO,GAAG,KAAK,KAAK,UAAU,IAAK,CAAC;AAAA,EACtC;AACA,MAAI,WAAW,IAAI;AACjB,WAAO,GAAG,KAAK,KAAK,UAAU,EAAE,CAAC;AAAA,EACnC;AAEA,SAAO,GAAG,OAAO;AACnB;AA1DA,IACa;AADb;AAAA;AAAA;AACO,IAAM,2BAA2B,IAAI,KAAK,KAAK,KAAK;AAAA;AAAA;;;ACD3D;AAAA;AAAA;AAAA;AAAA;AACA,SAAS,MAAM,YAAY;AAwC3B,eAAe,eACb,SACiD;AACjD,QAAM,EAAE,YAAY,iBAAiB,KAAK,YAAY,uBAAuB,GAAG,WAAW,IACzF;AACF,QAAM,EAAE,YAAY,QAAQ,IAAI,kBAAkB,eAAe;AAEjE,QAAM,QAAQ,MAAM,KAAK,YAAY,EAAE,QAAQ,CAAC;AAEhD,QAAM,aAAa,uBAAuB;AAC1C,QAAM,SAAS,aAAa;AAAA,IAC1B,QAAQ,WAAW;AAAA,IACnB,SAAS,WAAW;AAAA,IACpB,GAAI,WAAW,MAAM,EAAE,KAAK,WAAW,IAAI,IAAI,CAAC;AAAA,IAChD,GAAI,WAAW,UAAU,EAAE,SAAS,WAAW,QAAQ,IAAI,CAAC;AAAA,IAC5D,GAAI,WAAW,WAAW,EAAE,UAAU,WAAW,SAAS,IAAI,CAAC;AAAA,IAC/D,SAAS,EAAE,KAAK,MAAM,IAAI;AAAA,EAC5B,CAAC;AAED,QAAM,YAAY,wBAAwB,UAAU;AAEpD,QAAM,aAAa,MAAM,OAAO,YAAY;AAAA,IAC1C,GAAG;AAAA,IACH;AAAA,IACA,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,EACrC,CAAC;AAED,QAAM,cAAc,4BAA4B,WAAW,MAAM;AAAA,IAC/D;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,iBAAwD;AAC5D,MAAI,cAA2D;AAE/D,MAAI;AACF,UAAM,UAAU,MAAM,KAAK,SAAyC,MAAM,EAAE;AAE5E,QAAI,CAAC,QAAQ,IAAI;AACf,oBAAc;AACd,YAAM,IAAI,MAAM,+CAA+C,OAAO,GAAG;AAAA,IAC3E;AAEA,UAAM,SAAS,QAAQ;AACvB,QAAI,CAAC,iCAAiC,MAAM,GAAG;AAC7C,oBAAc;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,qBAAiB;AACjB,kBAAc;AAEd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,QACE,IAAI,OAAO;AAAA,QACX,WAAW,oBAAI,KAAK;AAAA,QACpB,QAAQ;AAAA,QACR,SAAS,WAAW,KAAK;AAAA,QACzB,YAAY,KAAK,IAAI;AAAA,QACrB,WAAW,IAAI,KAAK,OAAO,SAAS,EAAE,QAAQ;AAAA,QAC9C,SAAS;AAAA,UACP,QAAQ;AAAA,YACN,IAAI,OAAO,OAAO;AAAA,YAClB,MAAM,OAAO,OAAO;AAAA,UACtB;AAAA,UACA,WAAW,OAAO;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,gBAAgB,WAAW;AAC7B,oBAAc;AAAA,IAChB;AACA,UAAM;AAAA,EACR,UAAE;AACA,QAAI,gBAAgB,WAAW;AAC7B;AAAA,QACE;AAAA,QACA;AAAA,QACA,gBAAgB,YAAY,YAAY;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACF;AA/HA,IAoCM,0BAiGO,iBASA;AA9Ib;AAAA;AAAA;AAEA;AAMA;AAKA;AACA;AACA;AAIA;AAiBA,IAAM,2BAA2B;AAAA,MAC/B,EAAE,IAAI,WAAW,OAAO,UAAU;AAAA,MAClC,EAAE,IAAI,WAAW,OAAO,UAAU;AAAA,IACpC;AA8FO,IAAM,kBAAkB,KAAK;AAAA,MAClC,IAAI;AAAA,MACJ,KAAK,OAAO,YAAgC,eAAe,OAAO;AAAA,IACpE,CAAC;AAMM,IAAM,qBAAqB,KAAK;AAAA,MACrC,IAAI;AAAA,MACJ,KAAK,OAAO,YACV,eAAe;AAAA,QACb,GAAG;AAAA,QACH,SAAS;AAAA,MACX,CAAC;AAAA,IACL,CAAC;AAAA;AAAA;;;ACrJD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,eAAe,SAAAC,cAAa;AAqDrC,eAAe,8BAA8B,OAA4B;AACvE;AAEA,QAAM,aAAa,uBAAuB;AAC1C,QAAM,SAAS,aAAa;AAAA,IAC1B,QAAQ,WAAW;AAAA,IACnB,SAAS,WAAW;AAAA,IACpB,GAAK,MAAM,OAAO,WAAW,MAAO,EAAE,KAAK,MAAM,OAAO,WAAW,IAAI,IAAI,CAAC;AAAA,IAC5E,GAAI,WAAW,UAAU,EAAE,SAAS,WAAW,QAAQ,IAAI,CAAC;AAAA,IAC5D,GAAI,WAAW,WAAW,EAAE,UAAU,WAAW,SAAS,IAAI,CAAC;AAAA,IAC/D,SAAS,EAAE,KAAK,MAAM,WAAW;AAAA,EACnC,CAAC;AAED,SAAO,OAAO,YAAY;AAAA,IACxB,GAAG,MAAM;AAAA,IACT,YAAY,MAAM;AAAA,EACpB,CAAC;AACH;AAEA,eAAe,6BAA6B,SAAkB;AAC5D;AAEA,QAAM,OAAgB,MAAM,QAAQ,KAAK;AACzC,MAAI,CAAC,iCAAiC,IAAI,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AASA,eAAsB,sBAGpB,SACiD;AAMjD;AAAA;AALA,UAAM,EAAE,YAAY,iBAAiB,KAAK,YAAY,uBAAuB,GAAG,WAAW,IACzF;AACF,UAAM,EAAE,YAAY,QAAQ,IAAI,kBAAkB,eAAe;AACjE,UAAM,YAAYC,mBAAkB,UAAU,IAAI,KAAK,IAAI;AAE3D,UAAM,UAAU,8BAAc;AAE9B,UAAM,aAAa,MAAM,8BAA8B;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,MACA,WAAW,wBAAwB,UAAU;AAAA,IAC/C,CAAC;AAED,UAAM,cAAc,4BAA4B,WAAW,MAAM;AAAA,MAC/D;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,iBAAwD;AAC5D,QAAI,cAA2D;AAE/D,QAAI;AACF,YAAM,UAAU,MAAM,QAAQ,KAAK;AAAA,QACjC,QAAQ,KAAK,CAAC,YAAY,6BAA6B,OAAO,CAAC;AAAA,QAC/DD,OAAM,SAAS,EAAE,KAAK,OAAO,EAAE,UAAU,KAAK,EAAW;AAAA,MAC3D,CAAC;AAED,UAAI,cAAc,SAAS;AACzB,sBAAc;AACd,cAAM,IAAI,MAAM,+CAA+C,OAAO,GAAG;AAAA,MAC3E;AAEA,uBAAiB;AACjB,oBAAc;AAEd,aAAO,8BAA8B,QAAQ,SAAS;AAAA,QACpD,IAAI,QAAQ;AAAA,QACZ,WAAW,oBAAI,KAAK;AAAA,QACpB,QAAQ;AAAA,QACR,SAAS,WAAW,KAAK;AAAA,QACzB,YAAY,KAAK,IAAI;AAAA,QACrB,WAAW,IAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ;AAAA,QAC/C,SAAS;AAAA,UACP,QAAQ;AAAA,YACN,IAAI,QAAQ,OAAO;AAAA,YACnB,MAAM,QAAQ,OAAO;AAAA,UACvB;AAAA,UACA,WAAW,QAAQ;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,gBAAgB,WAAW;AAC7B,sBAAc;AAAA,MAChB;AACA,YAAM;AAAA,IACR,UAAE;AACA,UAAI,gBAAgB,WAAW;AAC7B;AAAA,UACE;AAAA,UACA;AAAA,UACA,gBAAgB,YAAY,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,WA3DA;AAAA;AAAA;AAAA;AAAA;AA4DF;AAKA,eAAsB,yBACpB,SAC+E;AAC/E,SAAO,sBAAsB;AAAA,IAC3B,GAAG;AAAA,IACH,SAASE;AAAA,EACX,CAAC;AACH;AAiBA,eAAe,oBAAoB,SAA2D;AAC5F;AAEA,QAAM,EAAE,KAAK,GAAG,OAAO,IAAI;AAC3B,QAAM,aAAa,uBAAuB;AAC1C,QAAM,SAAS,aAAa;AAAA,IAC1B,QAAQ,WAAW;AAAA,IACnB,SAAS,WAAW;AAAA,IACpB,GAAK,OAAO,WAAW,MAAO,EAAE,KAAK,OAAO,WAAW,IAAI,IAAI,CAAC;AAAA,IAChE,GAAI,WAAW,UAAU,EAAE,SAAS,WAAW,QAAQ,IAAI,CAAC;AAAA,IAC5D,GAAI,WAAW,WAAW,EAAE,UAAU,WAAW,SAAS,IAAI,CAAC;AAAA,EACjE,CAAC;AAED,SAAO,OAAO,MAAM,WAAW,MAAM;AACvC;AAWA,eAAsB,qBACpB,SACuB;AACvB,SAAO,oBAAoB,OAAO;AACpC;AA5NA,IAqCMA;AArCN;AAAA;AAAA;AAMA;AAKA;AACA;AACA;AAIA;AACA;AAmBA,IAAMA,4BAA2B;AAAA,MAC/B,EAAE,IAAI,WAAW,OAAO,UAAU;AAAA,MAClC,EAAE,IAAI,WAAW,OAAO,UAAU;AAAA,IACpC;AAAA;AAAA;;;ACxCA,SAAS,KAAAC,UAAS;;;ACAlB;AAOA;AAEA,IAAMC,4BAA2B;AAAA,EAC/B,EAAE,IAAI,WAAW,OAAO,UAAU;AAAA,EAClC,EAAE,IAAI,WAAW,OAAO,UAAU;AACpC;AAwCO,SAAS,iCACd,UAAoD,CAAC,GACjC;AACpB,SAAO,EAAE,MAAM,YAAY,GAAG,QAAQ;AACxC;AAEO,SAAS,kBAAkB,OAAoC;AACpE,SACE,OAAO,UAAU,YACjB,UAAU,QACV,iBAAiB,SACjB,OAAQ,MAAoB,gBAAgB;AAEhD;AAEO,SAAS,4BACd,iBACoB;AACpB,MAAI,kBAAkB,eAAe,GAAG;AACtC,WAAO,EAAE,MAAM,WAAW,QAAQ,gBAAgB;AAAA,EACpD;AAEA,MAAI,gBAAgB,SAAS,aAAa,gBAAgB,SAAS,YAAY;AAC7E,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,SAAS,aAAa,gBAAgB,SAAS,QAAW;AAC5E,QAAI,EAAE,YAAY,oBAAoB,CAAC,gBAAgB,QAAQ;AAC7D,YAAM,IAAI,MAAM,oEAAoE;AAAA,IACtF;AACA,WAAO,EAAE,MAAM,WAAW,QAAQ,gBAAgB,OAAO;AAAA,EAC3D;AAEA,QAAM,IAAI,MAAM,8BAA8B,OAAQ,gBAAsC,IAAI,CAAC,EAAE;AACrG;AAEA,eAAsB,iBAGpBC,UACA,SACyC;AACzC,MAAIA,SAAQ,SAAS,WAAW;AAC9B,UAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAClC,UAAM,aAAa,MAAMA,iBAAgB,eAAe;AAAA,MACtD,GAAG;AAAA,MACH,GAAID,SAAQ,MAAM,EAAE,KAAKA,SAAQ,IAAI,IAAI,CAAC;AAAA,IAC5C,CAAC;AAED,QAAI,CAAC,WAAW,IAAI;AAClB,YAAM,WAAW;AAAA,IACnB;AAEA,WAAO,WAAW;AAAA,EACpB;AAEA,MAAIA,SAAQ,SAAS,YAAY;AAC/B,UAAM,EAAE,uBAAAE,uBAAsB,IAAI,MAAM;AACxC,UAAMC,UAAS,MAAMD,uBAAsB;AAAA,MACzC,GAAG;AAAA,MACH,GAAIF,SAAQ,MAAM,EAAE,KAAKA,SAAQ,IAAI,IAAI,CAAC;AAAA,IAC5C,CAAC;AACD,WAAOG;AAAA,EACT;AAEA,QAAM,SAAS,MAAMH,SAAQ,OAAO,YAAY,OAAO;AAEvD,MAAI,OAAO,SAAS,WAAW;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO;AAAA,EACjB;AACF;AASA,eAAsB,gBACpBA,UACA,SACuB;AACvB,MAAIA,SAAQ,SAAS,YAAY;AAC/B,UAAM,EAAE,sBAAAI,sBAAqB,IAAI,MAAM;AACvC,WAAOA,sBAAqB;AAAA,MAC1B,GAAG;AAAA,MACH,GAAIJ,SAAQ,MAAM,EAAE,KAAKA,SAAQ,IAAI,IAAI,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,MAAIA,SAAQ,SAAS,WAAW;AAC9B,UAAM,SAAS;AAAA,MACb,uBAAuBA,SAAQ,MAAM,EAAE,KAAKA,SAAQ,IAAI,IAAI,MAAS;AAAA,IACvE;AACA,WAAO,OAAO,MAAM,WAAW,OAAO;AAAA,EACxC;AAEA,SAAOA,SAAQ,OAAO,MAAM,WAAW,OAAO;AAChD;AAqBA,eAAsB,oBACpBK,UACA,SACuE;AACvE,MAAIA,SAAQ,SAAS,WAAW;AAC9B,UAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,UAAM,aAAa,MAAMA,oBAAmB,eAAe;AAAA,MACzD,GAAG;AAAA,MACH,GAAID,SAAQ,MAAM,EAAE,KAAKA,SAAQ,IAAI,IAAI,CAAC;AAAA,IAC5C,CAAC;AAED,QAAI,CAAC,WAAW,IAAI;AAClB,YAAM,WAAW;AAAA,IACnB;AAEA,WAAO,WAAW;AAAA,EACpB;AAEA,MAAIA,SAAQ,SAAS,YAAY;AAC/B,UAAM,EAAE,0BAAAE,0BAAyB,IAAI,MAAM;AAC3C,WAAO,MAAMA,0BAAyB;AAAA,MACpC,GAAG;AAAA,MACH,GAAIF,SAAQ,MAAM,EAAE,KAAKA,SAAQ,IAAI,IAAI,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAMA,SAAQ,OAAO,YAAY;AAAA,IAC9C,GAAG;AAAA,IACH,SAASG;AAAA,EACX,CAAC;AAED,MAAI,OAAO,SAAS,WAAW;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO;AAAA,EACjB;AACF;;;AC/NA,IAAM,cAAc,oBAAI,IAAI,CAAC,WAAW,UAAU,CAAC;AACnD,IAAM,cAAc,oBAAI,IAAI,CAAC,WAAW,UAAU,QAAQ,QAAQ,CAAC;AAE5D,SAAS,kBACd,QACiB;AACjB,QAAM,UAA2B;AAAA,IAC/B,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO,UAAU,YAAY;AAAA,EAC1C;AAEA,MAAI,YAAY,IAAI,OAAO,QAAQ,GAAG;AACpC,YAAQ,WAAW;AAAA,EACrB,WAAW,YAAY,IAAI,OAAO,QAAQ,GAAG;AAC3C,YAAQ,WAAW;AAAA,EACrB;AAEA,SAAO;AACT;;;AFTO,IAAM,4BAA4BC,GAAE,OAAO;AAAA,EAChD,MAAMA,GACH,OAAO,EACP,SAAS,EACT,SAAS,yCAAyC;AAAA,EACrD,MAAMA,GAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,EAChE,aAAaA,GACV,OAAO,EACP,SAAS,oEAAoE;AAAA,EAChF,gBAAgBA,GACb,OAAO,EACP,SAAS,EACT,SAAS,iDAAiD;AAC/D,CAAC;AAmBD,SAAS,gCACP,iBACA,eAA0C,CAAC,GAI3C;AACA,QAAM,YACJ,OAAO,oBAAoB,YAC3B,oBAAoB,QACpB,UAAU,oBACT,gBAAgB,SAAS,aAAa,gBAAgB,SAAS;AAElE,QAAM,YAAY;AAAA,IAChB,YACI;AAAA,MACE,MAAO,gBAAqD;AAAA,MAC5D,KAAM,gBAAqD;AAAA,IAC7D,IACC;AAAA,EACP;AACA,QAAM,UAAU,YACX,kBACD;AAEJ,SAAO,EAAE,WAAW,QAAQ;AAC9B;AAKO,SAAS,kCACd,iBACA,eAA0C,CAAC,GACb;AAC9B,QAAM,EAAE,WAAW,QAAQ,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACA,QAAM,cACJ,QAAQ,eACR;AAEF,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,SAAS,OAAO,UAA6D;AAC3E,YAAM,cACJ,MAAM,mBAAmB,SACrB;AAAA,QACE,MAAM,EAAE,SAAS,MAAM,eAAe;AAAA,QACtC,IAAI;AAAA,UACF,SAAS,EAAE,aAAa,YAAY,cAAc,EAAE,MAAM,EAAE,EAAE;AAAA,QAChE;AAAA,MACF,IACA;AAEN,YAAM,SAAS,MAAM,oBAAoB,WAAW;AAAA,QAClD,MAAM,MAAM,QAAQ,QAAQ,eAAe;AAAA,QAC3C,MAAM,MAAM;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,SAAS;AAAA,MACX,CAAC;AAED,aAAO,kBAAkB,MAAM;AAAA,IACjC;AAAA,EACF;AACF;;;AGjHAC;AADA,SAAS,KAAAC,UAAS;AAYX,IAAM,6BAA6BC,GAAE,OAAO;AAAA,EACjD,MAAMA,GAAE,OAAO,EAAE,SAAS,6CAA6C;AAAA,EACvE,MAAMA,GAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,EAC9D,aAAaA,GACV,OAAO,EACP,SAAS,EACT,SAAS,+DAA+D;AAAA,EAC3E,SAASA,GACN,OAAO;AAAA,IACN,MAAMA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,IACjD,IAAIA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,SAAS,EACT,SAAS,8CAA8C;AAAA,EAC1D,YAAYA,GACT,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,oCAAoC;AAAA,EAChD,UAAUC,gBACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AA4BD,SAAS,6BAGP,iBACA,cAIA;AACA,QAAM,YACJ,OAAO,oBAAoB,YAC3B,oBAAoB,QACpB,UAAU,oBACT,gBAAgB,SAAS,aAAa,gBAAgB,SAAS;AAElE,QAAM,YAAY;AAAA,IAChB,YACI;AAAA,MACE,MAAO,gBAA2D;AAAA,MAClE,KAAM,gBAA2D;AAAA,IACnE,IACC;AAAA,EACP;AACA,QAAM,UAAW,YAAY,kBAAkB;AAE/C,SAAO,EAAE,WAAW,QAAQ;AAC9B;AAKO,SAAS,+BAGd,iBACA,cAC2B;AAC3B,QAAM,EAAE,WAAW,QAAQ,IAAI,6BAA6B,iBAAiB,YAAY;AACzF,QAAM,cACJ,QAAQ,eACR;AAEF,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,SAAS,OAAO,UAA0D;AACxE,YAAM,cAAuD,MAAM,UAC9D;AAAA,QACC,MAAM,MAAM,QAAQ,QAAQ,CAAC;AAAA,QAC7B,IAAI,MAAM,QAAQ;AAAA,MACpB,IACA;AAEJ,YAAM,UAA+B;AAAA,QACnC,MAAM,MAAM,QAAQ,QAAQ,eAAe;AAAA,QAC3C,MAAM,MAAM;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,SAAS;AAAA,QACT,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,MAC3D;AAEA,YAAM,SAAS,MAAM,iBAAiB,WAAW,OAAO;AAExD,aAAO,kBAAkB,MAAM;AAAA,IACjC;AAAA,EACF;AACF;;;ACpIAC;AACA;AAFA,SAAS,KAAAC,UAAS;AA2BX,IAAM,4BAA4BC,GAAE,OAAO;AAAA,EAChD,UAAUA,GACP,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,SAASA,GACN,OAAO,EACP,SAAS,qEAAqE;AAAA,EACjF,QAAQC,0BACL,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAuBD,SAAS,4BACP,iBACA,eAA4C,CAAC,GAI7C;AACA,QAAM,YACJ,OAAO,oBAAoB,YAC3B,oBAAoB,QACpB,UAAU,oBACT,gBAAgB,SAAS,aAAa,gBAAgB,SAAS;AAElE,QAAM,YAAY;AAAA,IAChB,YACI;AAAA,MACE,MAAO,gBAAuD;AAAA,MAC9D,KAAM,gBAAuD;AAAA,IAC/D,IACC;AAAA,EACP;AACA,QAAM,UAAU,YACX,kBACD;AAEJ,SAAO,EAAE,WAAW,QAAQ;AAC9B;AAKO,SAAS,8BACd,iBACA,eAA4C,CAAC,GACnB;AAC1B,QAAM,EAAE,WAAW,QAAQ,IAAI,4BAA4B,iBAAiB,YAAY;AACxF,QAAM,cACJ,QAAQ,eACR;AAEF,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,SAAS,OAAO,UAA8D;AAC5E,YAAM,WAAW,MAAM,YAAY,QAAQ;AAC3C,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,gBAAgB,WAAW;AAAA,UAC9C;AAAA,UACA,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,QAChB,CAAC;AACD,eAAO,EAAE,QAAQ,MAAM,UAAU,OAAO;AAAA,MAC1C,SAAS,OAAO;AACd,YAAI,iBAAiB,kBAAkB,MAAM,eAAe,KAAK;AAC/D,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR;AAAA,YACA,QAAQ;AAAA,YACR,SAAS,8BAA8B,QAAQ;AAAA,UACjD;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;ACxIA,SAAS,KAAAC,UAAS;AAkBlB,IAAM,iCAAiCC,GAAE,OAAO;AAAA,EAC9C,IAAIA,GACD,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQA,GACL,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,SAAS,gDAAgD;AAAA,EAC5D,IAAIA,GACD,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,MAAMA,GACH,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,SAAS,oCAAoC;AAClD,CAAC;AAiBM,IAAM,qCAAqCC,GAAE,OAAO;AAAA,EACzD,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,MAAMA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC;AACxC,CAAC;AAMM,IAAM,oCAAoCA,GAAE,OAAO;AAAA,EACxD,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,wDAAwD;AAAA,EACpE,QAAQ,+BAA+B;AAAA,IACrC;AAAA,EACF;AACF,CAAC;AAiBM,SAAS,sCACd,UAAyC,CAAC,GACR;AAClC,QAAM,cACJ,QAAQ,eACR;AAEF,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AACF;;;ACzGA,SAAS,KAAAC,WAAS;AAIX,IAAM,0BAA0BC,IAAE,KAAK;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,8BAA8BA,IAAE,OAAO;AAAA,EAClD,SAASA,IACN,OAAO,EACP,IAAI,CAAC,EACL;AAAA,IACC;AAAA,EACF;AAAA,EACF,OAAO,wBACJ,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAEM,IAAM,+BAA+BA,IAAE,OAAO;AAAA,EACnD,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,OAAO;AACT,CAAC;AAiBM,SAAS,+BACd,OACuB;AACvB,QAAM,SAAS,4BAA4B,MAAM,KAAK;AACtD,SAAO;AAAA,IACL,SAAS,OAAO,QAAQ,KAAK;AAAA,IAC7B,OAAO,OAAO;AAAA,EAChB;AACF;AAEA,eAAsB,wBACpB,OACiC;AACjC,QAAM,aAAa,+BAA+B,KAAK;AACvD,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB,OAAO,WAAW,SAAS;AAAA,EAC7B;AACF;AAEO,SAAS,gCACd,UAAmC,CAAC,GACR;AAC5B,QAAM,cACJ,QAAQ,eACR;AAEF,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAAS;AAAA,EACX;AACF;;;ACnDO,SAAS,mBACd,iBACA,eAA0C,CAAC,GAC3C;AACA,SAAO,kCAAkC,iBAAiB,YAAY;AACxE;AAKO,SAAS,sBAGd,iBACA,cACA;AACA,SAAO,+BAA+B,iBAAiB,YAAY;AACrE;AAKO,SAAS,qBACd,iBACA,eAA4C,CAAC,GAC7C;AACA,SAAO,8BAA8B,iBAAiB,YAAY;AACpE;AAKO,SAAS,uBAAuB,UAAyC,CAAC,GAAG;AAClF,SAAO,sCAAsC,OAAO;AACtD;AAKO,SAAS,iBAAiB,UAAmC,CAAC,GAAG;AACtE,SAAO,gCAAgC,OAAO;AAChD;AAOO,SAAS,uBAAuB,UAAiD,CAAC,GAAG;AAC1F,QAAMC,WAAsC,EAAE,MAAM,YAAY,KAAK,QAAQ,IAAI;AAEjF,SAAO;AAAA,IACL,SAAAA;AAAA,IACA,gBAAgB,CAAC,gBACf,kCAAkC,EAAE,GAAGA,UAAS,GAAG,YAAY,CAAC;AAAA,IAClE,aAAa,CACX,gBAEA,+BAA+B;AAAA,MAC7B,GAAGA;AAAA,MACH,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,MACzD,GAAG;AAAA,IACL,CAAC;AAAA,IACH,YAAY,CAAC,cAA2C,CAAC,MACvD,8BAA8B;AAAA,MAC5B,GAAGA;AAAA,MACH,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,MACzD,GAAG;AAAA,IACL,CAAC;AAAA,IACH,oBAAoB,CAAC,cAA6C,CAAC,MACjE,sCAAsC,WAAW;AAAA,IACnD,cAAc,CAAC,cAAuC,CAAC,MACrD,gCAAgC,WAAW;AAAA,EAC/C;AACF;;;AC7FO,SAAS,8BACd,UACA,UAAyC,CAAC,GACxB;AAClB,QAAM,YAAY,QAAQ,mBAAmB;AAC7C,QAAM,SAAS,QAAQ,gBAAgB;AAEvC,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,YAAY,SAAS,QAAQ;AAAA,IACnC,aAAa,yBAAyB,SAAS,QAAQ;AAAA,IACvD,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,UAAU,SAAS;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,OAAO,SAAS;AAAA,MAClB;AAAA,MACA,IAAI;AAAA,QACF,UAAU,EAAE,aAAa,OAAO;AAAA,QAChC,YAAY,EAAE,aAAa,OAAO;AAAA,QAClC,OAAO,EAAE,aAAa,WAAW;AAAA,MACnC;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,EAAE,IAAI,WAAW,OAAO,oBAAoB;AAAA,MAC5C,EAAE,IAAI,QAAQ,OAAO,OAAO;AAAA,IAC9B;AAAA,EACF;AACF;;;ACrBA,SAAS,iBAAiB,QAAqC;AAC7D,QAAM,QAAQ,OAAO,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI;AAErD,SAAO,CAAC,aAA6C;AACnD,QAAI,OAAO,OAAO,QAAQ,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,SAAS,MAAM,IAAI,SAAS,QAAQ,GAAG;AACzC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAMO,SAAS,4BAA4B,QAAqC;AAC/E,QAAM,UAAU,iBAAiB,MAAM;AAEvC,QAAM,eAAe,OAAO,YAEkB;AAC5C,WAAO,QAAQ,QAAQ,QAAQ,IAAI,kBAAkB;AAAA,EACvD;AAEA,SAAO;AACT;AAKO,SAAS,6BAA6B,QAAqC;AAChF,QAAM,UAAU,iBAAiB,MAAM;AAEvC,SAAO,OACL,QACA,YACqB;AACrB,UAAM,WAAW,uBAAuB,QAAQ,UAAU,QAAQ,UAAU;AAC5E,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;AAKO,SAAS,kCACd,OACA,QACG;AACH,QAAM,QAAQ,OAAO,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI;AACrD,QAAM,gBAAgB,6BAA6B,MAAM;AAEzD,QAAM,OAAO,EAAE,GAAG,MAAM;AAExB,aAAW,OAAO,OAAO,KAAK,KAAK,GAAqB;AACtD,UAAM,OAAO,OAAO,GAAG;AACvB,UAAM,cACH,SAAS,MAAM,IAAI,IAAI,KAAO,UAAU,QAAQ,OAAO,SAAS;AAEnE,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,GAAG;AAC1B,SAAK,GAAG,IAAI;AAAA,MACV,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBACP,UACA,YACmC;AACnC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,aAAW,WAAW,UAAU;AAC9B,QAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD;AAAA,IACF;AACA,UAAM,OAAQ,QAA8B;AAC5C,QAAI,SAAS,aAAa;AACxB;AAAA,IACF;AACA,UAAM,UAAW,QAAkC;AACnD,QAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B;AAAA,IACF;AAEA,eAAW,QAAQ,SAAS;AAC1B,UAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C;AAAA,MACF;AACA,YAAM,IAAI;AACV,UAAI,EAAE,SAAS,eAAe,EAAE,eAAe,YAAY;AACzD,eAAO;AAAA,UACL,UAAU,OAAO,EAAE,YAAY,EAAE;AAAA,UACjC;AAAA,UACA,OAAO,EAAE;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,QAA4C;AAC3E,QAAM,WAAsC,CAAC;AAE7C,QAAM,QAAQ,CAAC,UAAmB;AAChC,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,QAAQ,OAAO;AACxB,cAAM,IAAI;AAAA,MACZ;AACA;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,UAAU;AAC7B;AAAA,IACF;AAEA,UAAM,MAAM;AAEZ,QAAI,IAAI,SAAS,2BAA2B,OAAO,IAAI,eAAe,UAAU;AAC9E,UAAI,IAAI,gBAAgB,MAAM;AAC5B;AAAA,MACF;AAEA,YAAM,WAAW,IAAI;AACrB,YAAM,aACJ,OAAO,IAAI,eAAe,WACtB,IAAI,aACJ,OAAO,UAAU,eAAe,WAC9B,SAAS,aACT;AAER,UAAI;AACJ,UAAI,YAAY,OAAO,SAAS,aAAa,UAAU;AACrD,mBAAW;AAAA,UACT,UAAU,SAAS;AAAA,UACnB,YAAY,OAAO,SAAS,cAAc,cAAc,EAAE;AAAA,UAC1D,OAAO,SAAS;AAAA,QAClB;AAAA,MACF,WAAW,YAAY;AACrB,mBAAW;AAAA,UACR,OAAoC;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAEA,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,YAAY,IAAI;AAAA,QAChB;AAAA,QACA;AAAA,QACA,aAAa,IAAI,gBAAgB;AAAA,MACnC,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,IAAI,OAAO,GAAG;AAC9B,YAAM,IAAI,OAAO;AAAA,IACnB;AACA,QAAI,MAAM,QAAQ,IAAI,KAAK,GAAG;AAC5B,YAAM,IAAI,KAAK;AAAA,IACjB;AACA,QAAI,IAAI,YAAY,OAAO,IAAI,aAAa,UAAU;AACpD,YAAO,IAAI,SAAsC,QAAQ;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,MAAM;AAEZ,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAS,OAAmC,OAAO,GAAG;AAC/G,UAAO,OAAkC,OAAO;AAAA,EAClD;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,SAAS,OAAO,CAAC,MAAM;AAC5B,QAAI,KAAK,IAAI,EAAE,UAAU,GAAG;AAC1B,aAAO;AAAA,IACT;AACA,SAAK,IAAI,EAAE,UAAU;AACrB,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,0BACP,SACA,QACA,UACuB;AACvB,MAAI,QAAQ,UAAU;AACpB,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,aAAa,QAAQ;AAC3B,MAAI,YAAY;AACd,UAAM,eAAe,uBAAuB,UAAU,UAAU;AAChE,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAS,OAAqC,SAAS,GAAG;AACnH,eAAW,QAAS,OAAyD,WAAW;AACtF,UAAI,KAAK,eAAe,YAAY;AAClC,eAAO;AAAA,UACL,UAAU,OAAO,KAAK,YAAY,EAAE;AAAA,UACpC,YAAY,OAAO,KAAK,cAAc,EAAE;AAAA,UACxC,OAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,4CAA4C,QAAQ,UAAU;AAAA,EAChE;AACF;AAKA,eAAsB,iCACpB,iBACA,QACA,UAAuC,CAAC,GAIvC;AACD,QAAMC,WAAU,4BAA4B,eAAe;AAC3D,QAAM,YAAY,QAAQ,mBAAmB;AAC7C,QAAM,SAAS,QAAQ,gBAAgB;AACvC,QAAM,aAAa,QAAQ,cAAc;AAEzC,QAAM,eACJ,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAS,OAAoC,QAAQ,IACxG,CAAC,GAAI,OAAmC,QAAQ,IAChD,CAAC;AAEP,QAAM,WAAW,wBAAwB,MAAM;AAC/C,QAAM,YAAoC,CAAC;AAE3C,aAAW,WAAW,UAAU;AAC9B,UAAM,WAAW,0BAA0B,SAAS,QAAQ,YAAY;AACxE,UAAM,YAAY,WAAW,UAAU;AAAA,MACrC,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB,CAAC;AAED,UAAM,SAAS,MAAM,iBAAiBA,UAAS,SAAS;AAExD,UAAM,WAAW,OAAO,aAAa;AACrC,UAAM,SACJ,OAAO,OAAO,SAAS,YACvB,OAAO,SAAS,QAChB,YAAY,OAAO,QACnB,OAAQ,OAAO,KAA8B,WAAW,WACnD,OAAO,KAA4B,SACpC,WACE,gCACA;AAER,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,GAAG,YAAY;AACjC,MAAI,UAAU,SAAS,GAAG;AACxB,aAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,UAAU,CAAC;AAAA,EACpD;AAEA,SAAO,EAAE,WAAW,SAAS;AAC/B;AAKA,eAAsB,0BACpB,SACY;AACZ,QAAM,kBACJ,QAAQ,YACP,QAAQ,SACL,QAAQ,UACP,MAAM;AACL,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E,GAAG;AAET,QAAM,YAAY,QAAQ,aAAa;AACvC,MAAI,WAAW,QAAQ,WAAW,CAAC,GAAG,QAAQ,QAAQ,IAAI,CAAC;AAC3D,MAAI;AAEJ,WAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS;AAC9C,iBAAa,MAAM,QAAQ,SAAS,QAAQ;AAC5C,UAAM,EAAE,WAAW,UAAU,aAAa,IAAI,MAAM;AAAA,MAClD;AAAA,MACA,EAAE,GAAI,YAAuB,SAAS;AAAA,MACtC,QAAQ;AAAA,IACV;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,eAAW;AAAA,EACb;AAEA,QAAM,IAAI,MAAM,+CAA+C,SAAS,GAAG;AAC7E;","names":["context","z","z","z","normalizeTaskContextVersion","TASK_CONTEXT_FORMAT_VERSION","refineContextPublicUrls","handlerUrlSchema","jsonSchema7Schema","uiSchemaSchema","webhookHandlerSchema","triggerHandlerSchema","handlerSchema","taskActionInputSchema","taskActionSchema","uiFieldSchemaSchema","contextUiSchema","contextDataSchema","taskContextObjectBaseSchema","taskContextObjectSchema","taskContextSchema","assignToSchema","threadUpdateMessageSchema","threadUpdateStatuses","threadUpdateStatusSchema","threadUpdateInputSchema","taskPriorities","taskPrioritySchema","agentTelemetrySchema","createTaskBodySchema","init_schemas","init_task","init_task","z","task","headers","task","init_schemas","TASK_CONTEXT_FORMAT_VERSION","createTaskBodySchema","task","task","parseValidUntilMs","sleep","parseValidUntilMs","APPROVE_BY_HUMAN_ACTIONS","z","APPROVE_BY_HUMAN_ACTIONS","context","sendToHumanTask","sendToHumanInWorkflow","result","sendUpdateInWorkflow","context","approveByHumanTask","approveByHumanInWorkflow","APPROVE_BY_HUMAN_ACTIONS","z","init_schemas","z","z","assignToSchema","init_schemas","z","z","threadUpdateStatusSchema","z","z","z","z","z","context","context"]}
|