robotrock 1.3.3 → 1.4.0
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 +32 -0
- package/dist/agent-admin.d.ts +5 -0
- package/dist/agent-admin.js +75 -2
- package/dist/agent-admin.js.map +1 -1
- package/dist/ai/index.d.ts +5 -5
- package/dist/ai/index.js +128 -4
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/trigger.d.ts +3 -3
- package/dist/ai/trigger.js +128 -4
- package/dist/ai/trigger.js.map +1 -1
- package/dist/ai/workflow.d.ts +3 -3
- package/dist/ai/workflow.js +128 -4
- package/dist/ai/workflow.js.map +1 -1
- package/dist/{client-CZ5eWH5v.d.ts → client-BxbxttFH.d.ts} +19 -1
- package/dist/eve/agent/index.d.ts +4 -3
- package/dist/eve/agent/index.js +736 -414
- package/dist/eve/agent/index.js.map +1 -1
- package/dist/eve/index.d.ts +4 -3
- package/dist/eve/index.js +437 -45
- package/dist/eve/index.js.map +1 -1
- package/dist/eve/tools/admin/assign-tasks.d.ts +40 -8
- package/dist/eve/tools/admin/assign-tasks.js +328 -66
- package/dist/eve/tools/admin/assign-tasks.js.map +1 -1
- package/dist/eve/tools/admin/get-workspace-usage.d.ts +71 -0
- package/dist/eve/tools/admin/get-workspace-usage.js +1353 -0
- package/dist/eve/tools/admin/get-workspace-usage.js.map +1 -0
- package/dist/eve/tools/admin/manage-groups.d.ts +122 -8
- package/dist/eve/tools/admin/manage-groups.js +348 -94
- package/dist/eve/tools/admin/manage-groups.js.map +1 -1
- package/dist/eve/tools/admin/manage-team-members.d.ts +86 -8
- package/dist/eve/tools/admin/manage-team-members.js +318 -72
- package/dist/eve/tools/admin/manage-team-members.js.map +1 -1
- package/dist/eve/tools/admin/query-tasks.d.ts +82 -8
- package/dist/eve/tools/admin/query-tasks.js +360 -113
- package/dist/eve/tools/admin/query-tasks.js.map +1 -1
- package/dist/eve/tools/catalog/generate-image.d.ts +64 -0
- package/dist/eve/tools/catalog/generate-image.js +2065 -0
- package/dist/eve/tools/catalog/generate-image.js.map +1 -0
- package/dist/eve/tools/catalog/generate-random-chart.d.ts +71 -0
- package/dist/eve/tools/catalog/generate-random-chart.js +372 -0
- package/dist/eve/tools/catalog/generate-random-chart.js.map +1 -0
- package/dist/eve/tools/catalog/search-products.d.ts +36 -44
- package/dist/eve/tools/catalog/search-products.js +237 -33
- package/dist/eve/tools/catalog/search-products.js.map +1 -1
- package/dist/eve/tools/identity/index.d.ts +2 -2
- package/dist/eve/tools/identity/index.js +35 -44
- package/dist/eve/tools/identity/index.js.map +1 -1
- package/dist/eve/tools/identity/my-access.d.ts +90 -6
- package/dist/eve/tools/identity/my-access.js +35 -44
- package/dist/eve/tools/identity/my-access.js.map +1 -1
- package/dist/eve/tools/identity/whoami.d.ts +1 -1
- package/dist/eve/tools/identity/whoami.js.map +1 -1
- package/dist/eve/tools/inbox/create-task.d.ts +1 -1
- package/dist/eve/tools/inbox/create-task.js +119 -2
- package/dist/eve/tools/inbox/create-task.js.map +1 -1
- package/dist/eve/tools/inbox/index.d.ts +1 -1
- package/dist/eve/tools/inbox/index.js +119 -2
- package/dist/eve/tools/inbox/index.js.map +1 -1
- package/dist/eve/tools/index.d.ts +5 -2
- package/dist/eve/tools/index.js +932 -288
- package/dist/eve/tools/index.js.map +1 -1
- package/dist/index-Drj0Rzf_.d.ts +905 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.js +335 -20
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.js +67 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/{tool-approval-bridge-DnGaRES4.d.ts → tool-approval-bridge-Cz7qQUpw.d.ts} +1 -1
- package/dist/{tool-reply-guidance-C3qrT1In.d.ts → tool-reply-guidance-CJko9liH.d.ts} +5 -2
- package/dist/tool-result-ui-meta-KT0VafEO.d.ts +52 -0
- package/dist/trigger/index.d.ts +1 -1
- package/dist/trigger/index.js +118 -2
- package/dist/trigger/index.js.map +1 -1
- package/dist/{trigger--qTIK0s6.d.ts → trigger-C1ooSegc.d.ts} +2 -2
- package/dist/workflow/index.d.ts +1 -1
- package/dist/workflow/index.js +118 -2
- package/dist/workflow/index.js.map +1 -1
- package/package.json +21 -4
- package/dist/index-DePyAbTI.d.ts +0 -203
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../core/src/eve/user-context-jwt.ts","../../../../core/src/eve/platform-user-context-public-key.ts","../../../src/eve/input-request.ts","../../../src/eve/input-audit.ts","../../../src/eve/index.ts","../../../src/eve/agent/constants.ts","../../../src/eve/agent/attributes.ts","../../../src/eve/agent/tenant.ts","../../../src/eve/agent/auth.ts","../../../src/eve/agent/platform-public-key.ts","../../../src/eve/agent/deployment-access.ts","../../../src/eve/agent/channel.ts","../../../src/schemas/index.ts","../../../../core/src/utils/safe-url.ts","../../../../core/src/schemas/task.ts","../../../../core/src/schemas/context-urls.ts","../../../../core/src/schemas/tool-result-display.ts","../../../../core/src/schemas/agent-admin.ts","../../../../core/src/handler-retry.ts","../../../../core/src/attribution/index.ts","../../../../core/src/app-url.ts","../../../src/approval-result.ts","../../../src/http.ts","../../../src/auth-headers.ts","../../../src/chat-correlation.ts","../../../src/chats.ts","../../../src/client.ts","../../../src/eve/agent/client-from-session.ts","../../../src/eve/agent/chat-audit-api.ts","../../../src/eve/agent/task-delegation.ts","../../../src/env.ts","../../../src/eve/agent/cron-chat.ts","../../../src/eve/agent/hooks/ready.ts","../../../src/eve/agent/hooks/chat-audit.ts","../../../src/agent-admin.ts"],"sourcesContent":["import { createHmac, createSign, createVerify, randomBytes } from \"crypto\";\n\nexport const ROBOTROCK_USER_CONTEXT_ISSUER =\n \"https://robotrock.io/eve-user-context\";\nexport const ROBOTROCK_USER_CONTEXT_AUDIENCE = \"eve\";\nexport const ROBOTROCK_USER_CONTEXT_TTL_SECONDS = 5 * 60;\nexport const ROBOTROCK_USER_CONTEXT_KEY_ID_DEFAULT = \"robotrock-platform-1\";\n\nexport type TenantRole = \"admin\" | \"member\";\n\nexport type RobotRockUserContextClaims = {\n sub: string;\n email: string;\n name: string;\n tenantSlug: string;\n connectionId?: string;\n chatId?: string;\n role: TenantRole;\n groups: string[];\n workosUserId?: string;\n iat: number;\n exp: number;\n};\n\nexport type VerifiedRobotRockUserContextClaims = RobotRockUserContextClaims & {\n iss: string;\n aud: string;\n};\n\n/** Generate a per-connection HMAC secret for proxy→Eve user context JWTs. */\nexport function generateUserContextSecret(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nfunction encodeJwtPart(value: object): string {\n return Buffer.from(JSON.stringify(value)).toString(\"base64url\");\n}\n\nfunction decodeJwtPart(part: string): Record<string, unknown> {\n return JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")) as Record<\n string,\n unknown\n >;\n}\n\ntype MintUserContextBaseArgs = {\n sub: string;\n email: string;\n name: string;\n tenantSlug: string;\n role: TenantRole;\n groups: string[];\n workosUserId?: string;\n connectionId?: string;\n chatId?: string;\n};\n\nfunction buildUserContextPayload(\n args: MintUserContextBaseArgs,\n now: number\n): VerifiedRobotRockUserContextClaims & { iss: string; aud: string } {\n return {\n iss: ROBOTROCK_USER_CONTEXT_ISSUER,\n aud: ROBOTROCK_USER_CONTEXT_AUDIENCE,\n sub: args.sub,\n email: args.email,\n name: args.name,\n tenantSlug: args.tenantSlug,\n role: args.role,\n groups: args.groups,\n ...(args.connectionId ? { connectionId: args.connectionId } : {}),\n ...(args.workosUserId ? { workosUserId: args.workosUserId } : {}),\n ...(args.chatId ? { chatId: args.chatId } : {}),\n iat: now,\n exp: now + ROBOTROCK_USER_CONTEXT_TTL_SECONDS,\n };\n}\n\n/** Mint a short-lived HMAC JWT for self-hosted Eve deployments. */\nexport function mintRobotRockUserContextJwt(\n args: MintUserContextBaseArgs & { secret: string }\n): string {\n const now = Math.floor(Date.now() / 1000);\n const header = { alg: \"HS256\", typ: \"JWT\" };\n const payload = buildUserContextPayload(args, now);\n\n const encodedHeader = encodeJwtPart(header);\n const encodedPayload = encodeJwtPart(payload);\n const signature = createHmac(\"sha256\", args.secret)\n .update(`${encodedHeader}.${encodedPayload}`)\n .digest(\"base64url\");\n\n return `${encodedHeader}.${encodedPayload}.${signature}`;\n}\n\n/** Mint a short-lived RS256 JWT for the platform-hosted Eve agent. */\nexport function mintRobotRockPlatformUserContextJwt(\n args: MintUserContextBaseArgs & {\n privateKeyPem: string;\n connectionId: string;\n keyId?: string;\n }\n): string {\n const now = Math.floor(Date.now() / 1000);\n const header = {\n alg: \"RS256\",\n typ: \"JWT\",\n kid: args.keyId?.trim() || ROBOTROCK_USER_CONTEXT_KEY_ID_DEFAULT,\n };\n const payload = buildUserContextPayload(\n { ...args, connectionId: args.connectionId },\n now\n );\n\n const encodedHeader = encodeJwtPart(header);\n const encodedPayload = encodeJwtPart(payload);\n const signer = createSign(\"RSA-SHA256\");\n signer.update(`${encodedHeader}.${encodedPayload}`);\n signer.end();\n const signature = signer.sign(args.privateKeyPem).toString(\"base64url\");\n\n return `${encodedHeader}.${encodedPayload}.${signature}`;\n}\n\nfunction readStringClaim(\n payload: Record<string, unknown>,\n key: string\n): string | undefined {\n const value = payload[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction readGroupsClaim(payload: Record<string, unknown>): string[] {\n const value = payload.groups;\n if (typeof value === \"string\" && value.length > 0) {\n return [value];\n }\n if (Array.isArray(value)) {\n return value.filter(\n (entry): entry is string => typeof entry === \"string\" && entry.length > 0\n );\n }\n return [];\n}\n\nfunction parseTenantRoleClaim(value: string | undefined): TenantRole | null {\n if (value === \"admin\" || value === \"member\") {\n return value;\n }\n return null;\n}\n\nfunction validateStandardClaims(\n payload: Record<string, unknown>,\n clockSkewSeconds: number\n): boolean {\n const now = Math.floor(Date.now() / 1000);\n const iss = readStringClaim(payload, \"iss\");\n const aud = readStringClaim(payload, \"aud\");\n const iat = payload.iat;\n const exp = payload.exp;\n\n if (iss !== ROBOTROCK_USER_CONTEXT_ISSUER) {\n return false;\n }\n if (aud !== ROBOTROCK_USER_CONTEXT_AUDIENCE) {\n return false;\n }\n if (typeof iat !== \"number\" || typeof exp !== \"number\") {\n return false;\n }\n if (iat > now + clockSkewSeconds) {\n return false;\n }\n if (exp < now - clockSkewSeconds) {\n return false;\n }\n return true;\n}\n\nexport type VerifyPlatformUserContextResult =\n | { ok: true; claims: VerifiedRobotRockUserContextClaims }\n | { ok: false };\n\n/** Verify a platform RS256 user-context JWT. */\nexport function verifyRobotRockPlatformUserContextJwt(args: {\n token: string;\n publicKeyPem: string;\n clockSkewSeconds?: number;\n}): VerifyPlatformUserContextResult {\n const parts = args.token.split(\".\");\n if (parts.length !== 3) {\n return { ok: false };\n }\n\n const [encodedHeader, encodedPayload, encodedSignature] = parts;\n if (!encodedHeader || !encodedPayload || !encodedSignature) {\n return { ok: false };\n }\n\n let header: Record<string, unknown>;\n let payload: Record<string, unknown>;\n try {\n header = decodeJwtPart(encodedHeader);\n payload = decodeJwtPart(encodedPayload);\n } catch {\n return { ok: false };\n }\n\n if (header.alg !== \"RS256\") {\n return { ok: false };\n }\n\n const verifier = createVerify(\"RSA-SHA256\");\n verifier.update(`${encodedHeader}.${encodedPayload}`);\n verifier.end();\n const signature = Buffer.from(encodedSignature, \"base64url\");\n if (!verifier.verify(args.publicKeyPem, signature)) {\n return { ok: false };\n }\n\n const clockSkewSeconds = args.clockSkewSeconds ?? 30;\n if (!validateStandardClaims(payload, clockSkewSeconds)) {\n return { ok: false };\n }\n\n const sub = readStringClaim(payload, \"sub\");\n const email = readStringClaim(payload, \"email\");\n const name = readStringClaim(payload, \"name\");\n const tenantSlug = readStringClaim(payload, \"tenantSlug\");\n const connectionId = readStringClaim(payload, \"connectionId\");\n const role = parseTenantRoleClaim(readStringClaim(payload, \"role\"));\n const workosUserId = readStringClaim(payload, \"workosUserId\");\n const chatId = readStringClaim(payload, \"chatId\");\n const iat = payload.iat;\n const exp = payload.exp;\n\n if (\n !sub ||\n !email ||\n !name ||\n !tenantSlug ||\n !connectionId ||\n !role ||\n typeof iat !== \"number\" ||\n typeof exp !== \"number\"\n ) {\n return { ok: false };\n }\n\n return {\n ok: true,\n claims: {\n iss: ROBOTROCK_USER_CONTEXT_ISSUER,\n aud: ROBOTROCK_USER_CONTEXT_AUDIENCE,\n sub,\n email,\n name,\n tenantSlug,\n connectionId,\n role,\n groups: readGroupsClaim(payload),\n ...(workosUserId ? { workosUserId } : {}),\n ...(chatId ? { chatId } : {}),\n iat,\n exp,\n },\n };\n}\n","/** Public URL where agents fetch the platform user-context verification key. */\nexport const ROBOTROCK_PLATFORM_USER_CONTEXT_PUBLIC_KEY_URL =\n \"https://app.robotrock.io/.well-known/robotrock-user-context-public-key\";\n","import type { SendToHumanActionInput } from \"../client.js\";\nimport {\n isPlatformTerminalAction,\n parsePlatformRejectRequestData,\n} from \"../platform-actions.js\";\n\n/** One selectable option in an Eve HITL input request. */\nexport type EveInputOption = {\n readonly id: string;\n readonly label: string;\n readonly description?: string;\n readonly style?: \"danger\" | \"default\" | \"primary\";\n};\n\n/** Eve HITL display mode — mirrors `InputRequest.display` from the eve runtime. */\nexport type EveInputRequestDisplay = \"confirmation\" | \"select\" | \"text\";\n\n/**\n * Minimal Eve `InputRequest` shape for RobotRock bridging. Intentionally\n * self-contained so the SDK does not depend on the `eve` package.\n */\nexport type EveInputRequest = {\n readonly requestId: string;\n readonly prompt: string;\n readonly display?: EveInputRequestDisplay;\n readonly allowFreeform?: boolean;\n readonly options?: readonly EveInputOption[];\n};\n\n/** Eve `InputResponse` shape returned when resuming a parked session. */\nexport type EveInputResponse = {\n readonly requestId: string;\n readonly optionId?: string;\n readonly text?: string;\n};\n\nexport const EVE_INPUT_SUBMIT_ACTION_ID = \"submit\" as const;\nexport const EVE_INPUT_OTHER_CHOICE_ID = \"__other__\" as const;\nexport const EVE_INPUT_OTHER_CHOICE_LABEL = \"Type your own answer\" as const;\n\nconst CONFIRMATION_DEFAULT_OPTIONS: readonly EveInputOption[] = [\n { id: \"approve\", label: \"Approve\", style: \"primary\" },\n { id: \"deny\", label: \"Deny\", style: \"danger\" },\n];\n\nconst SELECT_PER_OPTION_THRESHOLD = 6;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (value == null || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction readStringField(data: Record<string, unknown>, key: string): string | undefined {\n const value = data[key];\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Resolve the effective display mode when Eve omits `display`. */\nexport function resolveEveInputDisplay(\n request: EveInputRequest,\n toolName?: string\n): EveInputRequestDisplay {\n if (request.display) {\n return request.display;\n }\n if (toolName === \"ask_question\") {\n return request.options && request.options.length > 0 ? \"select\" : \"text\";\n }\n if (request.options && request.options.length > 0) {\n return \"select\";\n }\n return \"confirmation\";\n}\n\nfunction confirmationActions(request: EveInputRequest): readonly SendToHumanActionInput[] {\n const options =\n request.options && request.options.length > 0\n ? request.options\n : CONFIRMATION_DEFAULT_OPTIONS;\n\n return options.map((option) => ({\n id: option.id,\n title: option.label,\n ...(option.description ? { description: option.description } : {}),\n }));\n}\n\nfunction textSubmitAction(prompt: string): SendToHumanActionInput {\n return {\n id: EVE_INPUT_SUBMIT_ACTION_ID,\n title: \"Submit\",\n schema: {\n type: \"object\",\n required: [\"answer\"],\n properties: {\n answer: {\n type: \"string\",\n title: \"Your answer\",\n },\n },\n },\n ui: {\n answer: {\n \"ui:title\": prompt.trim() || \"Your answer\",\n \"ui:widget\": \"textarea\",\n },\n },\n };\n}\n\nfunction selectPerOptionActions(\n options: readonly EveInputOption[]\n): readonly SendToHumanActionInput[] {\n return options.map((option) => ({\n id: option.id,\n title: option.label,\n ...(option.description ? { description: option.description } : {}),\n }));\n}\n\nfunction selectFormAction(request: EveInputRequest): SendToHumanActionInput {\n const options = request.options ?? [];\n const allowFreeform = request.allowFreeform === true;\n const enumValues = options.map((option) => option.id);\n const enumNames = options.map((option) => option.label);\n\n if (allowFreeform) {\n enumValues.push(EVE_INPUT_OTHER_CHOICE_ID);\n enumNames.push(EVE_INPUT_OTHER_CHOICE_LABEL);\n }\n\n const properties: Record<string, unknown> = {\n choice: {\n type: \"string\",\n title: \"Choose one\",\n enum: enumValues,\n },\n };\n\n if (allowFreeform) {\n properties.other = {\n type: \"string\",\n title: \"Your answer\",\n };\n }\n\n const schema: Record<string, unknown> = {\n type: \"object\",\n required: [\"choice\"],\n properties,\n };\n\n if (allowFreeform) {\n schema.allOf = [\n {\n if: {\n properties: {\n choice: { const: EVE_INPUT_OTHER_CHOICE_ID },\n },\n required: [\"choice\"],\n },\n then: {\n required: [\"other\"],\n properties: {\n other: {\n type: \"string\",\n minLength: 1,\n },\n },\n },\n },\n ];\n }\n\n const ui: Record<string, unknown> = {\n choice: {\n \"ui:widget\": \"radio\",\n \"ui:enumNames\": enumNames,\n },\n };\n\n if (allowFreeform) {\n ui.other = {\n \"ui:placeholder\": \"Enter your answer\",\n };\n }\n\n return {\n id: EVE_INPUT_SUBMIT_ACTION_ID,\n title: \"Submit\",\n schema: schema as SendToHumanActionInput[\"schema\"],\n ui: ui as SendToHumanActionInput[\"ui\"],\n };\n}\n\n/** Keep select-form submissions mutually exclusive between preset choice and freeform other. */\nexport function normalizeEveSelectFormData(\n data: Record<string, unknown>\n): Record<string, unknown> {\n const choice =\n typeof data.choice === \"string\" ? data.choice.trim() : undefined;\n if (!choice) {\n return data;\n }\n if (choice === EVE_INPUT_OTHER_CHOICE_ID) {\n return {\n choice,\n ...(data.other !== undefined ? { other: data.other } : {}),\n };\n }\n return { choice };\n}\n\n/**\n * Map an Eve `InputRequest` to RobotRock inbox actions.\n */\nexport function eveInputRequestToActions(\n request: EveInputRequest,\n options?: { toolName?: string }\n): readonly SendToHumanActionInput[] {\n const display = resolveEveInputDisplay(request, options?.toolName);\n\n switch (display) {\n case \"confirmation\":\n return confirmationActions(request);\n case \"text\":\n return [textSubmitAction(request.prompt)];\n case \"select\": {\n const selectOptions = request.options ?? [];\n if (selectOptions.length === 0) {\n return [textSubmitAction(request.prompt)];\n }\n if (\n selectOptions.length <= SELECT_PER_OPTION_THRESHOLD &&\n request.allowFreeform !== true\n ) {\n return selectPerOptionActions(selectOptions);\n }\n return [selectFormAction(request)];\n }\n }\n}\n\n/** Task type slug for an Eve input request. */\nexport function eveInputRequestTaskType(\n request: EveInputRequest,\n options?: { toolName?: string }\n): string {\n const display = resolveEveInputDisplay(request, options?.toolName);\n if (display === \"confirmation\" && options?.toolName) {\n return `eve-approval:${options.toolName}`;\n }\n return `eve-input:${display}`;\n}\n\n/**\n * Map a handled RobotRock task action back to an Eve `InputResponse`.\n */\nexport function taskHandledToEveInputResponse(\n request: EveInputRequest,\n actionId: string,\n actionData: unknown,\n options?: { toolName?: string }\n): EveInputResponse {\n const base = { requestId: request.requestId };\n\n if (isPlatformTerminalAction(actionId)) {\n const feedback = parsePlatformRejectRequestData(actionData)?.feedback;\n return {\n ...base,\n optionId: \"deny\",\n ...(feedback ? { text: feedback } : {}),\n };\n }\n\n const display = resolveEveInputDisplay(request, options?.toolName);\n const selectOptions = request.options ?? [];\n const data = asRecord(actionData);\n\n if (display === \"confirmation\") {\n return { ...base, optionId: actionId };\n }\n\n const matchingOption = selectOptions.find((option) => option.id === actionId);\n if (matchingOption) {\n return { ...base, optionId: actionId };\n }\n\n if (actionId === EVE_INPUT_SUBMIT_ACTION_ID && data) {\n const submissionData =\n display === \"select\" && request.allowFreeform === true\n ? normalizeEveSelectFormData(data)\n : data;\n\n const answer = readStringField(submissionData, \"answer\");\n if (answer) {\n return { ...base, text: answer };\n }\n\n const choice = readStringField(submissionData, \"choice\");\n if (choice === EVE_INPUT_OTHER_CHOICE_ID) {\n const other = readStringField(submissionData, \"other\");\n if (other) {\n return { ...base, text: other };\n }\n }\n\n if (choice) {\n if (selectOptions.some((option) => option.id === choice)) {\n return { ...base, optionId: choice };\n }\n return { ...base, text: choice };\n }\n }\n\n if (data) {\n const answer = readStringField(data, \"answer\");\n if (answer) {\n return { ...base, text: answer };\n }\n }\n\n return { ...base, optionId: actionId };\n}\n","import {\n EVE_INPUT_SUBMIT_ACTION_ID,\n eveInputRequestToActions,\n resolveEveInputDisplay,\n type EveInputOption,\n type EveInputRequest,\n type EveInputRequestDisplay,\n type EveInputResponse,\n} from \"./input-request.js\";\n\nexport type EveInputAuditContext = {\n toolCallId: string;\n toolName?: string;\n requestId?: string;\n display?: EveInputRequestDisplay;\n toolInput?: unknown;\n};\n\nfunction matchOptionByText(\n text: string,\n options: readonly EveInputOption[]\n): EveInputOption | undefined {\n const normalized = text.trim().toLowerCase();\n if (normalized.length === 0) {\n return undefined;\n }\n\n const byId = options.find((option) => option.id.toLowerCase() === normalized);\n if (byId) {\n return byId;\n }\n\n const byLabel = options.find((option) => option.label.toLowerCase() === normalized);\n if (byLabel) {\n return byLabel;\n }\n\n const index = Number(normalized);\n if (Number.isInteger(index) && index > 0 && index <= options.length) {\n return options[index - 1];\n }\n\n return undefined;\n}\n\n/**\n * Map freeform composer text to an Eve `InputResponse`, mirroring Eve's\n * `resolveTextToResponse` rules (option id/label, numeric index, freeform text).\n */\nexport function resolveEveFreeformTextToInputResponse(\n request: EveInputRequest,\n text: string\n): EveInputResponse | undefined {\n const trimmed = text.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n const options = request.options ?? [];\n if (options.length > 0) {\n const matched = matchOptionByText(trimmed, options);\n if (matched) {\n return { requestId: request.requestId, optionId: matched.id };\n }\n }\n\n if (request.allowFreeform === true || options.length === 0) {\n return { requestId: request.requestId, text: trimmed };\n }\n\n return undefined;\n}\n\n/** Returns true for Eve's default approval gate (approve / deny options). */\nexport function isEveApprovalInputRequest(request: EveInputRequest): boolean {\n const options = request.options ?? [];\n return (\n options.length === 2 &&\n options[0]?.id === \"approve\" &&\n options[1]?.id === \"deny\"\n );\n}\n\nexport type EveInputActionSubmission = {\n actionId: string;\n actionTitle: string;\n formData: Record<string, unknown>;\n};\n\n/**\n * Map a resolved Eve `InputResponse` to RobotRock audit fields (action id/title).\n */\nexport function eveInputResponseToActionSubmission(\n request: EveInputRequest,\n response: EveInputResponse,\n options?: { toolName?: string }\n): EveInputActionSubmission {\n const display = resolveEveInputDisplay(request, options?.toolName);\n const actions = eveInputRequestToActions(request, options);\n\n if (response.optionId) {\n const action = actions.find((entry) => entry.id === response.optionId);\n if (action) {\n return {\n actionId: response.optionId,\n actionTitle: action.title,\n formData: {},\n };\n }\n\n const option = request.options?.find((entry) => entry.id === response.optionId);\n if (option) {\n return {\n actionId: response.optionId,\n actionTitle: option.label,\n formData: {},\n };\n }\n\n return {\n actionId: response.optionId,\n actionTitle: response.optionId,\n formData: {},\n };\n }\n\n const text = response.text?.trim();\n if (text) {\n if (display === \"text\") {\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: text,\n formData: { answer: text },\n };\n }\n\n if (display === \"select\") {\n const option = request.options?.find((entry) => entry.id === text);\n if (option) {\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: option.label,\n formData: { choice: option.id },\n };\n }\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: text,\n formData: { choice: text },\n };\n }\n\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: text,\n formData: { answer: text },\n };\n }\n\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: \"Responded\",\n formData: {},\n };\n}\n\n/** Audit payload for `chat_action_input_submitted`. */\nexport function buildEveInputAuditSubmissionData(\n context: EveInputAuditContext,\n formData: Record<string, unknown>\n): Record<string, unknown> {\n return {\n toolCallId: context.toolCallId,\n ...(context.toolName ? { toolName: context.toolName } : {}),\n ...(context.requestId ? { requestId: context.requestId } : {}),\n ...(context.display ? { display: context.display } : {}),\n ...(context.toolInput !== undefined ? { toolInput: context.toolInput } : {}),\n ...formData,\n };\n}\n\n/**\n * Parse an `ask_question` tool result output into an Eve input response shape.\n */\nexport function parseEveAskQuestionToolOutput(\n output: unknown\n): Pick<EveInputResponse, \"optionId\" | \"text\"> | null {\n if (output == null || typeof output !== \"object\") {\n return null;\n }\n\n const record = output as Record<string, unknown>;\n const value =\n record.type === \"json\" && record.value != null && typeof record.value === \"object\"\n ? (record.value as Record<string, unknown>)\n : record;\n\n const optionId = typeof value.optionId === \"string\" ? value.optionId : undefined;\n const text = typeof value.text === \"string\" ? value.text : undefined;\n\n if (!optionId && !text) {\n return null;\n }\n\n return { ...(optionId ? { optionId } : {}), ...(text ? { text } : {}) };\n}\n","export {\n EVE_INPUT_OTHER_CHOICE_ID,\n EVE_INPUT_OTHER_CHOICE_LABEL,\n EVE_INPUT_SUBMIT_ACTION_ID,\n eveInputRequestTaskType,\n eveInputRequestToActions,\n normalizeEveSelectFormData,\n resolveEveInputDisplay,\n taskHandledToEveInputResponse,\n type EveInputOption,\n type EveInputRequest,\n type EveInputRequestDisplay,\n type EveInputResponse,\n} from \"./input-request.js\";\nexport {\n buildEveInputAuditSubmissionData,\n eveInputResponseToActionSubmission,\n isEveApprovalInputRequest,\n parseEveAskQuestionToolOutput,\n resolveEveFreeformTextToInputResponse,\n type EveInputActionSubmission,\n type EveInputAuditContext,\n} from \"./input-audit.js\";\nexport {\n buildChatToolAuditPayload,\n sanitizeToolAuditInput,\n shouldAuditToolExecution,\n type ChatToolAuditInput,\n type ChatToolAuditPayload,\n} from \"./tool-audit.js\";\nexport {\n DEFAULT_TOOL_DISPLAY_LABELS,\n formatEveApprovalTitle,\n getToolDisplayLabel,\n setToolDisplayLabelOverrides,\n} from \"./tool-display.js\";\nexport {\n toolDisplayResult,\n type ToolDisplayResultOptions,\n} from \"./tool-result-display.js\";\nexport {\n formatToolListResult,\n formatToolObjectResult,\n isAgentAdminErrorResult,\n type FormatToolListResultOptions,\n type FormatToolObjectResultOptions,\n} from \"./tool-display-format.js\";\nexport {\n CREATE_INBOX_TASK_REPLY_GUIDANCE,\n MY_ACCESS_REPLY_GUIDANCE,\n SEARCH_PRODUCTS_REPLY_GUIDANCE,\n MANAGE_TEAM_MEMBERS_LIST_REPLY_GUIDANCE,\n MANAGE_TEAM_MEMBERS_DETAIL_REPLY_GUIDANCE,\n MANAGE_GROUPS_LIST_REPLY_GUIDANCE,\n MANAGE_GROUPS_DETAIL_REPLY_GUIDANCE,\n QUERY_TASKS_LIST_REPLY_GUIDANCE,\n QUERY_TASKS_DETAIL_REPLY_GUIDANCE,\n REFUND_CHARGE_REPLY_GUIDANCE,\n DEPLOY_RELEASE_REPLY_GUIDANCE,\n GET_WEATHER_REPLY_GUIDANCE,\n ADMIN_MUTATION_REPLY_GUIDANCE,\n TOOL_REPLY_GUIDANCE_FIELD,\n WHOAMI_REPLY_GUIDANCE,\n stripAgentOnlyToolFields,\n withReplyGuidance,\n type ToolResultWithReplyGuidance,\n} from \"./tool-reply-guidance.js\";\n/** Hook slug advertised in GET /eve/v1/info for RobotRock-ready auto-detection. */\nexport const ROBOTROCK_READY_HOOK_SLUG = \"robotrock-ready\";\n\nexport { buildTaskHandledResumeMessage } from \"./resume-message.js\";\n","export {\n ROBOTROCK_USER_CONTEXT_AUDIENCE,\n ROBOTROCK_USER_CONTEXT_ISSUER,\n} from \"@robotrock/core/eve/user-context-jwt\";\nexport { ROBOTROCK_PLATFORM_USER_CONTEXT_PUBLIC_KEY_URL } from \"@robotrock/core/eve/platform-user-context-public-key\";\nexport { ROBOTROCK_READY_HOOK_SLUG } from \"../index.js\";\n\n/** Header carrying the dashboard user-context JWT on proxied Eve requests. */\nexport const ROBOTROCK_USER_CONTEXT_HEADER = \"x-robotrock-user-token\";\n","export function readStringAttribute(\n attributes: Readonly<Record<string, string | readonly string[]>> | undefined,\n key: string\n): string | undefined {\n const value = attributes?.[key];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n if (Array.isArray(value) && typeof value[0] === \"string\" && value[0].length > 0) {\n return value[0];\n }\n return undefined;\n}\n\nexport function readStringArrayAttribute(\n attributes: Readonly<Record<string, string | readonly string[]>> | undefined,\n key: string\n): string[] {\n const value = attributes?.[key];\n if (typeof value === \"string\" && value.length > 0) {\n return [value];\n }\n if (Array.isArray(value)) {\n return value.filter(\n (entry): entry is string => typeof entry === \"string\" && entry.length > 0\n );\n }\n return [];\n}\n\nexport function parseTenantRole(\n value: string | undefined\n): \"admin\" | \"member\" | null {\n if (value === \"admin\" || value === \"member\") {\n return value;\n }\n return null;\n}\n","import type { SessionContext } from \"eve/context\";\nimport {\n parseTenantRole,\n readStringArrayAttribute,\n readStringAttribute,\n} from \"./attributes.js\";\n\nexport type TenantRole = \"admin\" | \"member\";\n\nexport type TenantCaller = {\n userId: string;\n email: string;\n name: string;\n tenantSlug: string;\n connectionId?: string;\n chatId?: string;\n role: TenantRole;\n isAdmin: boolean;\n groups: string[];\n workosUserId?: string;\n};\n\n/** Resolve the authenticated RobotRock dashboard user for the current session. */\nexport function tryResolveTenantCaller(ctx: SessionContext): TenantCaller | null {\n const caller = ctx.session.auth.initiator ?? ctx.session.auth.current;\n if (caller?.principalType !== \"user\") {\n return null;\n }\n\n const email = readStringAttribute(caller.attributes, \"email\");\n const name = readStringAttribute(caller.attributes, \"name\");\n const tenantSlug =\n readStringAttribute(caller.attributes, \"tenantSlug\") ??\n readStringAttribute(caller.attributes, \"tenantId\");\n const role = parseTenantRole(readStringAttribute(caller.attributes, \"role\"));\n if (!email || !tenantSlug || !caller.principalId || !role) {\n return null;\n }\n\n const workosUserId = readStringAttribute(caller.attributes, \"workosUserId\");\n const connectionId = readStringAttribute(caller.attributes, \"connectionId\");\n const chatId = readStringAttribute(caller.attributes, \"chatId\");\n const groups = readStringArrayAttribute(caller.attributes, \"groups\");\n\n return {\n userId: caller.principalId,\n email,\n name: name ?? email.split(\"@\")[0] ?? email,\n tenantSlug,\n ...(connectionId ? { connectionId } : {}),\n ...(chatId ? { chatId } : {}),\n role,\n isAdmin: role === \"admin\",\n groups,\n ...(workosUserId ? { workosUserId } : {}),\n };\n}\n\n/** Like {@link tryResolveTenantCaller} but throws when the session has no user. */\nexport function requireTenantCaller(ctx: SessionContext): TenantCaller {\n const caller = tryResolveTenantCaller(ctx);\n if (!caller) {\n throw new Error(\"An authenticated RobotRock tenant user is required.\");\n }\n return caller;\n}\n\nexport function isAdminCaller(ctx: SessionContext): boolean {\n return tryResolveTenantCaller(ctx)?.isAdmin === true;\n}\n\n/** Require an authenticated tenant admin for the current session. */\nexport function requireAdminCaller(ctx: SessionContext): TenantCaller {\n const caller = requireTenantCaller(ctx);\n if (!caller.isAdmin) {\n throw new Error(\"Tenant admin access is required.\");\n }\n return caller;\n}\n","import {\n verifyJwtHmac,\n extractBearerToken,\n type AuthFn,\n} from \"eve/channels/auth\";\nimport { verifyRobotRockPlatformUserContextJwt } from \"@robotrock/core/eve/user-context-jwt\";\nimport {\n parseTenantRole,\n readStringArrayAttribute,\n readStringAttribute,\n} from \"./attributes.js\";\nimport {\n ROBOTROCK_USER_CONTEXT_AUDIENCE,\n ROBOTROCK_USER_CONTEXT_HEADER,\n ROBOTROCK_USER_CONTEXT_ISSUER,\n} from \"./constants.js\";\nimport { resolvePlatformUserContextPublicKeyPem } from \"./platform-public-key.js\";\n\nfunction mapVerifiedClaimsToSessionAuth(claims: {\n sub: string;\n email: string;\n name: string;\n tenantSlug: string;\n connectionId?: string;\n chatId?: string;\n role: \"admin\" | \"member\";\n groups: string[];\n workosUserId?: string;\n}) {\n return {\n authenticator: \"robotrock\" as const,\n principalId: claims.sub,\n principalType: \"user\" as const,\n subject: claims.sub,\n issuer: ROBOTROCK_USER_CONTEXT_ISSUER,\n attributes: {\n email: claims.email,\n name: claims.name,\n tenantSlug: claims.tenantSlug,\n tenantId: claims.tenantSlug,\n role: claims.role,\n groups: claims.groups,\n ...(claims.connectionId ? { connectionId: claims.connectionId } : {}),\n ...(claims.workosUserId ? { workosUserId: claims.workosUserId } : {}),\n ...(claims.chatId ? { chatId: claims.chatId } : {}),\n },\n };\n}\n\nexport type RobotrockUserContextAuthOptions = {\n publicKeyPem?: string | (() => Promise<string | null>);\n hmacSecret?: string;\n};\n\n/**\n * Verifies the short-lived user-context JWT minted by the RobotRock dashboard\n * Eve proxy (`X-RobotRock-User-Token`). Hosted tenants use RS256 platform JWTs;\n * self-hosted deployments use per-connection HMAC secrets.\n */\nexport function robotrockUserContextAuth(\n options?: RobotrockUserContextAuthOptions\n): AuthFn<Request> {\n return async (request) => {\n const token = extractBearerToken(\n request.headers.get(ROBOTROCK_USER_CONTEXT_HEADER)\n );\n if (!token) {\n return null;\n }\n\n let publicKeyPem: string | null = null;\n if (typeof options?.publicKeyPem === \"function\") {\n publicKeyPem = await options.publicKeyPem();\n } else if (options?.publicKeyPem) {\n publicKeyPem = options.publicKeyPem;\n } else {\n publicKeyPem = await resolvePlatformUserContextPublicKeyPem();\n }\n\n if (publicKeyPem) {\n const platformResult = verifyRobotRockPlatformUserContextJwt({\n token,\n publicKeyPem,\n });\n if (platformResult.ok) {\n return mapVerifiedClaimsToSessionAuth(platformResult.claims);\n }\n }\n\n const secret =\n options?.hmacSecret?.trim() ??\n process.env.ROBOTROCK_USER_CONTEXT_SECRET?.trim();\n if (!secret) {\n return null;\n }\n\n const result = await verifyJwtHmac(token, {\n algorithm: \"HS256\",\n issuer: ROBOTROCK_USER_CONTEXT_ISSUER,\n audiences: [ROBOTROCK_USER_CONTEXT_AUDIENCE],\n secret,\n });\n if (!result.ok) {\n return null;\n }\n\n const email = readStringAttribute(result.sessionAuth.attributes, \"email\");\n const name = readStringAttribute(result.sessionAuth.attributes, \"name\");\n const tenantSlug = readStringAttribute(\n result.sessionAuth.attributes,\n \"tenantSlug\"\n );\n const connectionId = readStringAttribute(\n result.sessionAuth.attributes,\n \"connectionId\"\n );\n const role = parseTenantRole(\n readStringAttribute(result.sessionAuth.attributes, \"role\")\n );\n const groups = readStringArrayAttribute(result.sessionAuth.attributes, \"groups\");\n const subject = result.sessionAuth.subject;\n if (!email || !tenantSlug || !subject || !role) {\n return null;\n }\n\n const workosUserId = readStringAttribute(\n result.sessionAuth.attributes,\n \"workosUserId\"\n );\n const chatId = readStringAttribute(result.sessionAuth.attributes, \"chatId\");\n\n return mapVerifiedClaimsToSessionAuth({\n sub: subject,\n email,\n name: name ?? email.split(\"@\")[0] ?? email,\n tenantSlug,\n connectionId,\n chatId,\n role,\n groups,\n workosUserId,\n });\n };\n}\n\n/**\n * Bearer `ras_*` service token for RobotRock platform reachability probes\n * (`GET /eve/v1/info` during verify and tenant connect).\n */\nexport function robotrockAgentServiceAuth(): AuthFn<Request> {\n return async (request) => {\n const expected = process.env.ROBOTROCK_AGENT_SERVICE_TOKEN?.trim();\n if (!expected) {\n return null;\n }\n\n const bearer = extractBearerToken(request.headers.get(\"authorization\"));\n if (!bearer || bearer !== expected) {\n return null;\n }\n\n return {\n authenticator: \"robotrock-agent-service\",\n principalId: \"robotrock:platform\",\n principalType: \"runtime\",\n attributes: {},\n };\n };\n}\n\n/**\n * Bearer token for RobotRock platform reachability and dashboard proxy calls.\n *\n * When a workspace admin connects a protected single-tenant deployment, they\n * enter a Bearer token in **Settings → Agents**. RobotRock stores it in\n * WorkOS Vault and sends `Authorization: Bearer <token>` on:\n *\n * - `GET /eve/v1/info` and `GET /eve/v1/health` (connect / re-sync)\n * - `POST /eve/v1/session` and `POST /eve/v1/session/:sessionId` (chat + resume)\n * - `GET /eve/v1/session/:sessionId/stream` (chat streaming)\n * - optional icon paths (`/favicon.ico`, `/icon.svg`, `/icon.png`)\n *\n * Set `EVE_SELF_AUTH_TOKEN` on the agent to the same value. Use\n * `robotrockEveChannel()` so this authenticator is registered on the Eve channel.\n */\nexport function eveSelfServiceAuth(): AuthFn<Request> {\n return async (request) => {\n const expected = process.env.EVE_SELF_AUTH_TOKEN?.trim();\n if (!expected) {\n return null;\n }\n\n const bearer = extractBearerToken(request.headers.get(\"authorization\"));\n if (bearer !== expected) {\n return null;\n }\n\n return {\n authenticator: \"eve-self\",\n principalId: \"eve:runtime\",\n principalType: \"runtime\",\n attributes: {},\n };\n };\n}\n","import { ROBOTROCK_PLATFORM_USER_CONTEXT_PUBLIC_KEY_URL } from \"./constants.js\";\n\nlet cachedPublicKeyPem: string | null | undefined;\n\n/** Resolve the platform RS256 public key used to verify dashboard user-context JWTs. */\nexport async function resolvePlatformUserContextPublicKeyPem(): Promise<\n string | null\n> {\n const envOverride = process.env.ROBOTROCK_USER_CONTEXT_PUBLIC_KEY?.trim();\n if (envOverride) {\n return envOverride;\n }\n\n if (cachedPublicKeyPem !== undefined) {\n return cachedPublicKeyPem;\n }\n\n try {\n const response = await fetch(ROBOTROCK_PLATFORM_USER_CONTEXT_PUBLIC_KEY_URL, {\n headers: { Accept: \"text/plain\" },\n });\n if (!response.ok) {\n cachedPublicKeyPem = null;\n return null;\n }\n const pem = (await response.text()).trim();\n cachedPublicKeyPem = pem.length > 0 ? pem : null;\n return cachedPublicKeyPem;\n } catch {\n cachedPublicKeyPem = null;\n return null;\n }\n}\n\n/** Reset cached platform public key (tests only). */\nexport function resetPlatformUserContextPublicKeyCache(): void {\n cachedPublicKeyPem = undefined;\n}\n","/**\n * Eve HTTP routes RobotRock reaches when connecting, re-syncing, or proxying\n * dashboard chat. Use these paths when smoke-testing a protected deployment.\n *\n * Self-hosted agents that require deployment access: set `EVE_SELF_AUTH_TOKEN` on\n * the agent to the same value the workspace admin enters under **Settings →\n * Agents → Deployment access → Bearer token**. RobotRock stores that token in\n * WorkOS Vault and sends it as `Authorization: Bearer <token>` on every call\n * below (plus `X-RobotRock-User-Token` during inbox chat).\n */\n\n/** Routes RobotRock calls directly from the dashboard backend (connect / re-sync). */\nexport const ROBOTROCK_EVE_CONNECT_ROUTES = {\n /** Agent manifest + `robotrock-ready` hook detection. */\n info: { method: \"GET\", path: \"/eve/v1/info\" },\n /** Optional health probe (same auth as `/info` when the channel is protected). */\n health: { method: \"GET\", path: \"/eve/v1/health\" },\n} as const;\n\n/** Static assets RobotRock may HEAD/GET for the agent avatar in Settings. */\nexport const ROBOTROCK_EVE_ICON_PATHS = [\n \"/favicon.ico\",\n \"/icon.svg\",\n \"/icon.png\",\n] as const;\n\n/**\n * Routes proxied through `/{tenant}/api/eve/{connectionId}/…` during inbox chat\n * and task-handled resume. The Eve client issues these against the proxy host;\n * the proxy forwards them to the deployment with vault credentials attached.\n */\nexport const ROBOTROCK_EVE_CHAT_ROUTES = {\n createSession: { method: \"POST\", path: \"/eve/v1/session\" },\n continueSession: {\n method: \"POST\",\n path: \"/eve/v1/session/:sessionId\",\n },\n messageStream: {\n method: \"GET\",\n path: \"/eve/v1/session/:sessionId/stream\",\n },\n} as const;\n\n/** Env var on the Eve agent that must match the dashboard Bearer token. */\nexport const EVE_SELF_AUTH_TOKEN_ENV_VAR = \"EVE_SELF_AUTH_TOKEN\";\n\n/** All Eve route paths that should accept the dashboard Bearer token on protected deployments. */\nexport const ROBOTROCK_EVE_BEARER_PROTECTED_PATHS = [\n ROBOTROCK_EVE_CONNECT_ROUTES.info.path,\n ROBOTROCK_EVE_CONNECT_ROUTES.health.path,\n ROBOTROCK_EVE_CHAT_ROUTES.createSession.path,\n ROBOTROCK_EVE_CHAT_ROUTES.continueSession.path,\n ROBOTROCK_EVE_CHAT_ROUTES.messageStream.path,\n ...ROBOTROCK_EVE_ICON_PATHS,\n] as const;\n","import type { AuthFn } from \"eve/channels/auth\";\nimport { eveChannel } from \"eve/channels/eve\";\nimport { localDev, vercelOidc } from \"eve/channels/auth\";\nimport {\n eveSelfServiceAuth,\n robotrockAgentServiceAuth,\n robotrockUserContextAuth,\n type RobotrockUserContextAuthOptions,\n} from \"./auth.js\";\n\nexport type RobotrockEveChannelOptions = {\n /** Your existing webapp auth — stacked after RobotRock user-context auth. */\n auth?: AuthFn<Request>[];\n /** Include RobotRock user-context + service auth. @default true */\n robotrock?: boolean;\n /** Include localDev() fallback. @default true when NODE_ENV !== \"production\" */\n localDev?: boolean;\n /** Optional Vercel OIDC allowlist (dashboard ↔ agent on Vercel). */\n vercelOidc?: Parameters<typeof vercelOidc>[0] | false;\n /** Options passed to robotrockUserContextAuth when robotrock is enabled. */\n userContextAuth?: RobotrockUserContextAuthOptions;\n};\n\nfunction shouldEnableLocalDev(explicit?: boolean): boolean {\n if (explicit !== undefined) {\n return explicit;\n }\n return process.env.NODE_ENV !== \"production\";\n}\n\n/**\n * Compose the default Eve HTTP channel with RobotRock dashboard auth stacked\n * alongside optional existing webapp authenticators.\n */\nexport function robotrockEveChannel(options?: RobotrockEveChannelOptions) {\n const auth: AuthFn<Request>[] = [];\n const includeRobotrock = options?.robotrock !== false;\n\n if (includeRobotrock) {\n auth.push(robotrockUserContextAuth(options?.userContextAuth));\n }\n\n if (options?.auth?.length) {\n auth.push(...options.auth);\n }\n\n if (includeRobotrock) {\n auth.push(robotrockAgentServiceAuth());\n auth.push(eveSelfServiceAuth());\n }\n\n if (options?.vercelOidc !== false) {\n auth.push(vercelOidc(options?.vercelOidc ?? undefined));\n }\n\n if (shouldEnableLocalDev(options?.localDev)) {\n auth.push(localDev());\n }\n\n return eveChannel({ auth });\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","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","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","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 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","/** 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","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 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 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 {\n createClient,\n type RobotRock,\n} from \"../../client.js\";\nimport type { SessionContext } from \"eve/context\";\nimport {\n resolveChatCorrelationFromEnv,\n type ChatCorrelation,\n} from \"../../chat-correlation.js\";\nimport { tryResolveTenantCaller } from \"./tenant.js\";\n\nlet warnedMissingAuth = false;\n\nfunction resolveBoundChatCorrelation(ctx: SessionContext): ChatCorrelation {\n const caller = tryResolveTenantCaller(ctx);\n return {\n eveSessionId: ctx.session.id,\n ...(caller?.chatId ? { chatId: caller.chatId } : {}),\n ...resolveChatCorrelationFromEnv(),\n };\n}\n\n/** Create a RobotRock client bound to the current Eve session tenant context. */\nexport function tryCreateBoundRobotRockClient(\n ctx: SessionContext\n): RobotRock | null {\n const caller = tryResolveTenantCaller(ctx);\n const serviceToken = process.env.ROBOTROCK_AGENT_SERVICE_TOKEN?.trim();\n const chatCorrelation = resolveBoundChatCorrelation(ctx);\n\n if (caller?.connectionId && serviceToken) {\n return createClient({\n baseUrl: process.env.ROBOTROCK_BASE_URL?.trim(),\n chatCorrelation,\n agentService: {\n token: serviceToken,\n tenantSlug: caller.tenantSlug,\n connectionId: caller.connectionId,\n actingUserId: caller.userId,\n },\n });\n }\n\n const apiKey = process.env.ROBOTROCK_API_KEY?.trim();\n if (apiKey) {\n return createClient({\n apiKey,\n baseUrl: process.env.ROBOTROCK_BASE_URL?.trim(),\n chatCorrelation,\n });\n }\n\n if (!warnedMissingAuth) {\n warnedMissingAuth = true;\n console.warn(\n \"robotrock: set ROBOTROCK_AGENT_SERVICE_TOKEN for hosted multi-tenant auth, \" +\n \"or ROBOTROCK_API_KEY for single-tenant deployments.\"\n );\n }\n\n return null;\n}\n\n/** Reset missing-auth warning (tests only). */\nexport function resetBoundClientAuthWarning(): void {\n warnedMissingAuth = false;\n}\n","import type { StagedChatHitlRequest } from \"../../chats.js\";\nimport { RobotRockError } from \"../../http.js\";\nimport type { SessionContext } from \"eve/context\";\nimport { tryCreateBoundRobotRockClient } from \"./client-from-session.js\";\n\nlet warnedMissingAuth = false;\nlet warnedConnectionRefused = false;\n\nfunction isConnectionRefused(error: unknown): boolean {\n const inspect = (value: unknown): boolean => {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n if (\"code\" in value && value.code === \"ECONNREFUSED\") {\n return true;\n }\n if (\"cause\" in value) {\n return inspect(value.cause);\n }\n if (\"errors\" in value && Array.isArray(value.errors)) {\n return value.errors.some((entry) => inspect(entry));\n }\n return false;\n };\n\n return inspect(error);\n}\n\nfunction logAuditFailure(label: string, error: unknown): void {\n if (isConnectionRefused(error)) {\n if (!warnedConnectionRefused) {\n warnedConnectionRefused = true;\n console.warn(\n \"robotrock-chat-audit: RobotRock API is not reachable (connection refused). \" +\n \"Audit and task-link calls are skipped until the API is up.\"\n );\n }\n return;\n }\n\n const hint =\n error instanceof RobotRockError && error.statusCode === 405\n ? \" — set ROBOTROCK_BASE_URL=http://localhost:4001/v1 and run the local API\"\n : \"\";\n console.warn(`robotrock-chat-audit: failed to ${label}${hint}`, error);\n}\n\nexport type RobotRockChatAuditPayload = {\n eveSessionId: string;\n userId: string;\n actionId: string;\n actionTitle?: string;\n prompt?: string;\n data?: Record<string, unknown>;\n idempotencyKey?: string;\n requestId?: string;\n toolCallId?: string;\n};\n\nexport type RobotRockChatToolAuditPayload = {\n eveSessionId: string;\n userId: string;\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n success: boolean;\n status: \"completed\" | \"failed\" | \"rejected\";\n error?: string;\n idempotencyKey?: string;\n};\n\n/** Observe-only tool audit POST — never throws. */\nexport async function postRobotRockChatToolAudit(\n ctx: SessionContext,\n payload: RobotRockChatToolAuditPayload\n): Promise<void> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n if (!warnedMissingAuth) {\n warnedMissingAuth = true;\n console.warn(\n \"robotrock-chat-audit: RobotRock auth is unset; skipping tool audit logging.\"\n );\n }\n return;\n }\n\n try {\n await client.chats.logToolExecution(payload);\n } catch (error) {\n logAuditFailure(\"log tool execution\", error);\n }\n}\n\n/** Observe-only audit POST — never throws. */\nexport async function postRobotRockChatInputAudit(\n ctx: SessionContext,\n payload: RobotRockChatAuditPayload\n): Promise<void> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n if (!warnedMissingAuth) {\n warnedMissingAuth = true;\n console.warn(\n \"robotrock-chat-audit: RobotRock auth is unset; skipping HITL audit logging.\"\n );\n }\n return;\n }\n\n try {\n await client.chats.logInputSubmission(payload);\n } catch (error) {\n logAuditFailure(\"log input submission\", error);\n }\n}\n\n/** Persist pending HITL requests across Eve durable waits — never throws. */\nexport async function postRobotRockStageHitl(\n ctx: SessionContext,\n input: {\n eveSessionId: string;\n requests: StagedChatHitlRequest[];\n }\n): Promise<void> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n return;\n }\n\n if (input.requests.length === 0) {\n return;\n }\n\n try {\n await client.chats.stageHitlRequests(input);\n } catch (error) {\n logAuditFailure(\"stage HITL requests\", error);\n }\n}\n\n/** Load staged HITL requests from Convex — returns [] on failure. */\nexport async function fetchRobotRockStagedHitl(\n ctx: SessionContext,\n eveSessionId: string\n): Promise<StagedChatHitlRequest[]> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n return [];\n }\n\n try {\n return await client.chats.getStagedHitlRequests(eveSessionId);\n } catch (error) {\n logAuditFailure(\"fetch staged HITL requests\", error);\n return [];\n }\n}\n\n/** Register an inbox task with its originating Eve chat session — never throws. */\nexport async function postRobotRockLinkChatTask(\n ctx: SessionContext,\n input: {\n eveSessionId: string;\n publicTaskId: string;\n toolCallId: string;\n }\n): Promise<void> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n if (!warnedMissingAuth) {\n warnedMissingAuth = true;\n console.warn(\n \"robotrock-task-link: RobotRock auth is unset; skipping chat task link.\"\n );\n }\n return;\n }\n\n try {\n await client.chats.linkTask(input);\n } catch (error) {\n logAuditFailure(\"link task to chat\", error);\n }\n}\n\n/** Reset audit warning flags (tests only). */\nexport function resetChatAuditWarnings(): void {\n warnedMissingAuth = false;\n warnedConnectionRefused = false;\n}\n","import {\n attachWebhookToActions,\n RobotRockError,\n type RobotRock,\n type SendToHumanActionInput,\n type SendToHumanInput,\n} from \"../../client.js\";\nimport type { TaskPriority } from \"../../schemas/index.js\";\nimport type { SessionContext } from \"eve/context\";\nimport { tryCreateBoundRobotRockClient } from \"./client-from-session.js\";\nimport { tryResolveTenantCaller } from \"./tenant.js\";\n\nexport type CreateRobotRockTaskInput = SendToHumanInput<\n readonly SendToHumanActionInput[]\n> & {\n app?: string;\n};\n\nfunction resolveTaskApp(app?: string): string {\n return app?.trim() || process.env.ROBOTROCK_APP?.trim() || \"robotrock-agent\";\n}\n\nfunction resolveWebhookBaseUrl(baseUrl?: string): string {\n return (\n baseUrl?.trim() ||\n process.env.ROBOTROCK_BASE_URL?.trim() ||\n \"http://localhost:4001/v1\"\n );\n}\n\n/** Resolve the webhook URL RobotRock calls when a delegated inbox task is handled. */\nexport function resolveTaskHandledWebhookUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n const withV1 = trimmed.endsWith(\"/v1\") ? trimmed : `${trimmed}/v1`;\n return `${withV1}/agent-chats/task-handled`;\n}\n\nfunction requireBoundClient(ctx: SessionContext): RobotRock {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n throw new Error(\n \"RobotRock auth is unset. Configure ROBOTROCK_AGENT_SERVICE_TOKEN for hosted agents or ROBOTROCK_API_KEY for self-hosted deployments.\"\n );\n }\n return client;\n}\n\n/** Create an inbox task via POST /v1 without waiting for a human response. */\nexport async function createRobotRockTask(\n input: CreateRobotRockTaskInput,\n ctx: SessionContext\n) {\n const client = requireBoundClient(ctx);\n const { app, ...taskInput } = input;\n const resolvedApp = resolveTaskApp(app);\n\n const webhookUrl = resolveTaskHandledWebhookUrl(\n resolveWebhookBaseUrl(process.env.ROBOTROCK_BASE_URL)\n );\n\n try {\n const task = await client.tasks.create({\n ...taskInput,\n app: resolvedApp,\n actions: attachWebhookToActions(taskInput.actions, {\n url: webhookUrl,\n headers: {},\n }),\n });\n return {\n taskId: task.taskId,\n threadId: task.threadId,\n status: task.status,\n validUntil: task.validUntil,\n submittedAt: task.submittedAt,\n };\n } catch (error) {\n const caller = tryResolveTenantCaller(ctx);\n if (error instanceof RobotRockError) {\n const response =\n error.response && typeof error.response === \"object\"\n ? (error.response as Record<string, unknown>)\n : undefined;\n console.error(\"[create_robotrock_task] API request failed\", {\n status: error.statusCode,\n message: error.message,\n code: response?.code,\n hint: response?.hint,\n tenantSlug: caller?.tenantSlug,\n connectionId: caller?.connectionId,\n baseUrl: process.env.ROBOTROCK_BASE_URL?.trim() || null,\n });\n } else {\n console.error(\"[create_robotrock_task] unexpected error\", error);\n }\n throw error;\n }\n}\n\nexport type RobotRockTaskActionInput = {\n id: string;\n title: string;\n description?: string;\n};\n\nexport type RobotRockTaskAssignToInput = {\n users?: string[];\n groups?: string[];\n};\n\nexport type RobotRockTaskContextInput = {\n data?: Record<string, unknown>;\n ui?: Record<string, unknown>;\n};\n\nexport type RobotRockTaskToolInput = {\n type: string;\n name: string;\n description?: string;\n actions: RobotRockTaskActionInput[];\n assignTo?: RobotRockTaskAssignToInput;\n context?: RobotRockTaskContextInput;\n validUntilHours?: number;\n priority?: TaskPriority;\n updateMessage?: string;\n app?: string;\n};\n\nexport function buildRobotRockTaskPayload(\n input: RobotRockTaskToolInput,\n options?: { requestedByEmail?: string }\n): CreateRobotRockTaskInput {\n const contextData: Record<string, unknown> = {\n ...(input.context?.data ?? {}),\n };\n\n if (options?.requestedByEmail) {\n contextData.requestedBy = options.requestedByEmail;\n }\n\n const hasContext =\n Object.keys(contextData).length > 0 ||\n (input.context?.ui && Object.keys(input.context.ui).length > 0);\n\n const payload: CreateRobotRockTaskInput = {\n type: input.type,\n name: input.name,\n ...(input.description ? { description: input.description } : {}),\n actions: input.actions.map((action) => ({\n id: action.id,\n title: action.title,\n ...(action.description ? { description: action.description } : {}),\n })),\n ...(input.assignTo ? { assignTo: input.assignTo } : {}),\n ...(input.priority ? { priority: input.priority } : {}),\n ...(input.app ? { app: input.app } : {}),\n ...(input.validUntilHours\n ? {\n validUntil: new Date(Date.now() + input.validUntilHours * 60 * 60 * 1000),\n }\n : {}),\n ...(input.updateMessage\n ? {\n update: {\n message: input.updateMessage,\n status: \"waiting\" as const,\n },\n }\n : {}),\n };\n\n if (hasContext) {\n payload.context = {\n data: contextData,\n ...(input.context?.ui ? { ui: input.context.ui } : {}),\n };\n }\n\n return payload;\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 { createClient } from \"../../client.js\";\nimport type { CreateChatResult } from \"../../chats.js\";\nimport { resolveRobotRockConfig } from \"../../env.js\";\n\nexport type CreateRobotRockCronChatInput = {\n title: string;\n messages: { role: \"user\" | \"assistant\"; text: string }[];\n agentIdentifier?: string;\n ownerEmail: string;\n};\n\nfunction resolveCronAgentIdentifier(agentIdentifier?: string): string {\n return (\n agentIdentifier?.trim() ||\n process.env.ROBOTROCK_CRON_AGENT_IDENTIFIER?.trim() ||\n \"robotrock-agent\"\n );\n}\n\n/** Create an inbox chat from an Eve schedule via the RobotRock API. */\nexport async function createRobotRockCronChat(\n input: CreateRobotRockCronChatInput\n): Promise<CreateChatResult> {\n const apiKey = process.env.ROBOTROCK_API_KEY?.trim();\n if (!apiKey) {\n throw new Error(\"ROBOTROCK_API_KEY is unset\");\n }\n\n const client = createClient(resolveRobotRockConfig({ apiKey }));\n return client.chats.create({\n agentIdentifier: resolveCronAgentIdentifier(input.agentIdentifier),\n title: input.title,\n messages: input.messages,\n source: \"cron\",\n ownerEmail: input.ownerEmail,\n });\n}\n","import { defineHook } from \"eve/hooks\";\n\n/**\n * Marker hook for RobotRock dashboard auto-detection.\n *\n * RobotRock reads `GET /eve/v1/info` on connect and treats deployments with a\n * hook slug `robotrock-ready` as RobotRock-ready.\n */\nexport const robotrockReadyHook = defineHook({});\n\n/** Alias for agents that prefer a factory name. */\nexport function defineRobotRockReadyHook() {\n return defineHook({});\n}\n","import { defineHook } from \"eve/hooks\";\nimport type { HookContext, HookDefinition } from \"eve/hooks\";\nimport type { StagedChatHitlRequest } from \"../../../chats.js\";\nimport {\n buildEveInputAuditSubmissionData,\n eveInputResponseToActionSubmission,\n isEveApprovalInputRequest,\n parseEveAskQuestionToolOutput,\n resolveEveFreeformTextToInputResponse,\n} from \"../../input-audit.js\";\nimport type { EveInputRequest, EveInputRequestDisplay } from \"../../input-request.js\";\nimport {\n fetchRobotRockStagedHitl,\n postRobotRockChatInputAudit,\n postRobotRockStageHitl,\n} from \"../chat-audit-api.js\";\nimport { tryResolveTenantCaller } from \"../tenant.js\";\n\ntype PendingInputRequest = StagedChatHitlRequest;\n\nconst loggedIdempotencyKeys = new Set<string>();\n\nfunction toEveInputRequest(request: PendingInputRequest): EveInputRequest {\n return {\n requestId: request.requestId,\n prompt: request.prompt,\n ...(request.display ? { display: request.display } : {}),\n ...(request.allowFreeform !== undefined\n ? { allowFreeform: request.allowFreeform }\n : {}),\n ...(request.options ? { options: request.options } : {}),\n };\n}\n\nasync function logPendingInputResponse(\n ctx: HookContext,\n pending: PendingInputRequest,\n response: { requestId: string; optionId?: string; text?: string }\n): Promise<void> {\n const caller = tryResolveTenantCaller(ctx);\n if (!caller) {\n return;\n }\n\n const idempotencyKey = `${ctx.session.id}:${pending.requestId}`;\n if (loggedIdempotencyKeys.has(idempotencyKey)) {\n return;\n }\n\n const eveRequest = toEveInputRequest(pending);\n const submission = eveInputResponseToActionSubmission(eveRequest, response, {\n toolName: pending.toolName,\n });\n\n const toolInput =\n pending.display === \"confirmation\" ? pending.toolInput : undefined;\n\n await postRobotRockChatInputAudit(ctx, {\n eveSessionId: ctx.session.id,\n userId: caller.userId,\n actionId: submission.actionId,\n actionTitle: submission.actionTitle,\n prompt: pending.prompt,\n requestId: pending.requestId,\n toolCallId: pending.toolCallId,\n data: buildEveInputAuditSubmissionData(\n {\n toolCallId: pending.toolCallId,\n toolName: pending.toolName,\n requestId: pending.requestId,\n display: pending.display as EveInputRequestDisplay | undefined,\n toolInput,\n },\n submission.formData\n ),\n idempotencyKey,\n });\n\n loggedIdempotencyKeys.add(idempotencyKey);\n}\n\n/** Reset logged idempotency keys (tests only). */\nexport function resetRobotrockChatAuditIdempotencyKeys(): void {\n loggedIdempotencyKeys.clear();\n}\n\nexport const robotrockChatAuditHook: HookDefinition = defineHook({\n events: {\n async \"input.requested\"(event, ctx) {\n const requests: StagedChatHitlRequest[] = [];\n\n for (const request of event.data.requests) {\n if (request.action.kind !== \"tool-call\") {\n continue;\n }\n\n requests.push({\n requestId: request.requestId,\n prompt: request.prompt,\n toolName: request.action.toolName,\n toolCallId: request.action.callId,\n ...(request.display ? { display: request.display } : {}),\n ...(request.allowFreeform !== undefined\n ? { allowFreeform: request.allowFreeform }\n : {}),\n ...(request.options ? { options: request.options } : {}),\n ...(request.action.input !== undefined\n ? {\n toolInput:\n request.action.input != null &&\n typeof request.action.input === \"object\" &&\n !Array.isArray(request.action.input)\n ? (request.action.input as Record<string, unknown>)\n : undefined,\n }\n : {}),\n });\n }\n\n await postRobotRockStageHitl(ctx, {\n eveSessionId: ctx.session.id,\n requests,\n });\n },\n\n async \"message.received\"(event, ctx) {\n const message = event.data.message?.trim();\n if (!message) {\n return;\n }\n\n const staged = await fetchRobotRockStagedHitl(ctx, ctx.session.id);\n for (const pending of staged) {\n const response = resolveEveFreeformTextToInputResponse(\n toEveInputRequest(pending),\n message\n );\n if (!response) {\n continue;\n }\n await logPendingInputResponse(ctx, pending, response);\n }\n },\n\n async \"action.result\"(event, ctx) {\n const result = event.data.result;\n if (result.kind !== \"tool-result\") {\n return;\n }\n\n const staged = await fetchRobotRockStagedHitl(ctx, ctx.session.id);\n const pending = staged.find((entry) => entry.toolCallId === result.callId);\n if (!pending) {\n return;\n }\n\n const idempotencyKey = `${ctx.session.id}:${pending.requestId}`;\n if (loggedIdempotencyKeys.has(idempotencyKey)) {\n return;\n }\n\n if (pending.toolName === \"ask_question\") {\n const parsed = parseEveAskQuestionToolOutput(result.output);\n if (parsed) {\n await logPendingInputResponse(ctx, pending, {\n requestId: pending.requestId,\n ...parsed,\n });\n }\n } else if (isEveApprovalInputRequest(toEveInputRequest(pending))) {\n if (event.data.status === \"rejected\") {\n await logPendingInputResponse(ctx, pending, {\n requestId: pending.requestId,\n optionId: \"deny\",\n });\n } else if (event.data.status === \"completed\") {\n await logPendingInputResponse(ctx, pending, {\n requestId: pending.requestId,\n optionId: \"approve\",\n });\n }\n }\n },\n },\n});\n\n/** Alias for agents that prefer a factory name. */\nexport function defineRobotRockChatAuditHook(): HookDefinition {\n return robotrockChatAuditHook;\n}\n","import { getRobotRockApiBaseUrl } from \"@robotrock/core\";\nimport type { SessionContext } from \"eve/context\";\nimport {\n buildRobotRockAuthHeaders,\n resolveRobotRockAuthConfig,\n type RobotRockAuthConfig,\n} from \"./auth-headers.js\";\nimport { RobotRockError, getErrorMessage, parseResponseBody } from \"./http.js\";\nimport { requireAdminCaller, requireTenantCaller, tryResolveTenantCaller } from \"./eve/agent/tenant.js\";\nimport {\n buildChatCorrelationHeaders,\n resolveChatCorrelationFromEnv,\n type ChatCorrelation,\n} from \"./chat-correlation.js\";\n\nexport type AgentAdminClientConfig = {\n baseUrl?: string;\n auth: RobotRockAuthConfig;\n chatCorrelation?: ChatCorrelation;\n};\n\nasync function agentAdminFetch<T>(\n config: AgentAdminClientConfig,\n path: string,\n init?: RequestInit\n): Promise<T> {\n const baseUrl = (config.baseUrl?.trim() || getRobotRockApiBaseUrl()).replace(\n /\\/+$/,\n \"\"\n );\n const url = `${baseUrl}/agent-admin${path}`;\n\n const response = await fetch(url, {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n ...buildRobotRockAuthHeaders(config.auth),\n ...buildChatCorrelationHeaders(config.chatCorrelation),\n ...(init?.headers ?? {}),\n },\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, `Agent admin request failed (${response.status})`),\n response.status,\n data\n );\n }\n\n return data as T;\n}\n\nexport function createAgentAdminApi(config: AgentAdminClientConfig) {\n return {\n members: {\n list: () =>\n agentAdminFetch<{ members: unknown[] }>(config, \"/members\"),\n get: (memberRef: string) =>\n agentAdminFetch<{ member: unknown }>(config, `/members/${encodeURIComponent(memberRef)}`),\n invite: (body: { email: string; role?: \"admin\" | \"member\" }) =>\n agentAdminFetch<Record<string, unknown>>(config, \"/members\", {\n method: \"POST\",\n body: JSON.stringify(body),\n }),\n updateRole: (memberRef: string, role: \"admin\" | \"member\") =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/members/${encodeURIComponent(memberRef)}/role`,\n {\n method: \"PATCH\",\n body: JSON.stringify({ role }),\n }\n ),\n remove: (memberId: string) =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/members/${encodeURIComponent(memberId)}`,\n {\n method: \"DELETE\",\n }\n ),\n },\n groups: {\n list: () => agentAdminFetch<{ groups: unknown[] }>(config, \"/groups\"),\n get: (groupId: string) =>\n agentAdminFetch<{ group: unknown }>(\n config,\n `/groups/${encodeURIComponent(groupId)}`\n ),\n create: (body: { name: string; description?: string }) =>\n agentAdminFetch<{ group: unknown }>(config, \"/groups\", {\n method: \"POST\",\n body: JSON.stringify(body),\n }),\n update: (\n groupId: string,\n body: { name?: string; description?: string }\n ) =>\n agentAdminFetch<{ group: unknown }>(\n config,\n `/groups/${encodeURIComponent(groupId)}`,\n {\n method: \"PATCH\",\n body: JSON.stringify(body),\n }\n ),\n delete: (groupId: string) =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/groups/${encodeURIComponent(groupId)}`,\n {\n method: \"DELETE\",\n }\n ),\n addMember: (groupRef: string, memberRef: string) =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/groups/${encodeURIComponent(groupRef)}/members`,\n {\n method: \"POST\",\n body: JSON.stringify({ userId: memberRef }),\n }\n ),\n removeMember: (groupRef: string, memberRef: string) =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/groups/${encodeURIComponent(groupRef)}/members/${encodeURIComponent(memberRef)}`,\n { method: \"DELETE\" }\n ),\n },\n tasks: {\n list: (query?: Record<string, string | number | undefined>) => {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value !== undefined && value !== \"\") {\n params.set(key, String(value));\n }\n }\n const suffix = params.size > 0 ? `?${params.toString()}` : \"\";\n return agentAdminFetch<{ items: unknown[]; nextCursor: string | null }>(\n config,\n `/tasks${suffix}`\n );\n },\n search: (q: string, limit?: number) => {\n const params = new URLSearchParams({ q });\n if (limit !== undefined) {\n params.set(\"limit\", String(limit));\n }\n return agentAdminFetch<{ items: unknown[]; total: number }>(\n config,\n `/tasks/search?${params.toString()}`\n );\n },\n get: (taskId: string) =>\n agentAdminFetch<{ task: unknown }>(config, `/tasks/${taskId}`),\n assign: (body: {\n taskIds: string[];\n assignTo: { users?: string[]; groups?: string[] };\n }) =>\n agentAdminFetch<{\n results: Array<{\n taskId: string;\n success: boolean;\n message?: string;\n name?: string | null;\n description?: string | null;\n type?: string | null;\n }>;\n }>(config, \"/tasks/assign\", {\n method: \"POST\",\n body: JSON.stringify(body),\n }),\n },\n };\n}\n\nexport type AgentAdminApi = ReturnType<typeof createAgentAdminApi>;\n\nfunction resolveBoundChatCorrelation(ctx: SessionContext): ChatCorrelation {\n const caller = tryResolveTenantCaller(ctx);\n return {\n eveSessionId: ctx.session.id,\n ...(caller?.chatId ? { chatId: caller.chatId } : {}),\n ...resolveChatCorrelationFromEnv(),\n };\n}\n\n/** Create an agent-admin API client bound to the current Eve session. */\nexport function createBoundAgentAdminClient(ctx: SessionContext): AgentAdminApi {\n const caller = requireTenantCaller(ctx);\n const baseUrl = process.env.ROBOTROCK_BASE_URL?.trim();\n const serviceToken = process.env.ROBOTROCK_AGENT_SERVICE_TOKEN?.trim();\n const chatCorrelation = resolveBoundChatCorrelation(ctx);\n\n if (caller.connectionId && serviceToken) {\n return createAgentAdminApi({\n baseUrl,\n chatCorrelation,\n auth: resolveRobotRockAuthConfig({\n agentService: {\n token: serviceToken,\n tenantSlug: caller.tenantSlug,\n connectionId: caller.connectionId,\n actingUserId: caller.userId,\n },\n }),\n });\n }\n\n const apiKey = process.env.ROBOTROCK_API_KEY?.trim();\n if (apiKey) {\n return createAgentAdminApi({\n baseUrl,\n chatCorrelation,\n auth: {\n kind: \"apiKey\",\n apiKey,\n actingUserId: caller.userId,\n },\n });\n }\n\n throw new Error(\n \"Agent admin auth is unset. Set ROBOTROCK_AGENT_SERVICE_TOKEN for hosted multi-tenant agents, \" +\n \"or ROBOTROCK_API_KEY for self-hosted and localhost deployments.\"\n );\n}\n\n/** Require tenant admin and return a bound agent-admin client. */\nexport function requireBoundAgentAdminClient(ctx: SessionContext): AgentAdminApi {\n requireAdminCaller(ctx);\n return createBoundAgentAdminClient(ctx);\n}\n"],"mappings":"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","names":["z","z","z","z","handlerUrlSchema","z","jsonSchema7Schema","uiSchemaSchema","webhookHandlerSchema","triggerHandlerSchema","handlerSchema","taskActionInputSchema","taskActionSchema","uiFieldSchemaSchema","contextUiSchema","contextDataSchema","TASK_CONTEXT_FORMAT_VERSION","taskContextObjectBaseSchema","normalizeTaskContextVersion","taskContextObjectSchema","refineContextPublicUrls","taskContextSchema","assignToSchema","z","threadUpdateMessageSchema","threadUpdateStatuses","threadUpdateStatusSchema","threadUpdateInputSchema","z","threadUpdateMessageSchema","threadUpdateStatusSchema","taskPriorities","taskPrioritySchema","agentTelemetrySchema","z","createTaskBodySchema","taskContextObjectBaseSchema","assignToSchema","taskPrioritySchema","threadUpdateInputSchema","normalizeTaskContextVersion","refineContextPublicUrls","z","z","headers","TASK_CONTEXT_FORMAT_VERSION","createTaskBodySchema","warnedMissingAuth","warnedMissingAuth","defineHook","defineHook","resolveBoundChatCorrelation"]}
|
|
1
|
+
{"version":3,"sources":["../../../../core/src/eve/user-context-jwt.ts","../../../../core/src/eve/platform-user-context-public-key.ts","../../../../core/src/utils/decode-html-entities.ts","../../../../core/src/utils/safe-url.ts","../../../src/eve/input-request.ts","../../../src/eve/input-audit.ts","../../../src/eve/tool-result-ui-meta.ts","../../../src/eve/entity-schemas.ts","../../../src/eve/index.ts","../../../src/eve/agent/constants.ts","../../../src/eve/agent/attributes.ts","../../../src/eve/agent/tenant.ts","../../../src/eve/agent/auth.ts","../../../src/eve/agent/platform-public-key.ts","../../../src/eve/agent/deployment-access.ts","../../../src/eve/agent/channel.ts","../../../src/schemas/index.ts","../../../../core/src/schemas/task.ts","../../../../core/src/schemas/context-urls.ts","../../../../core/src/schemas/tool-result-display.ts","../../../../core/src/schemas/agent-admin.ts","../../../../core/src/handler-retry.ts","../../../../core/src/attribution/index.ts","../../../../core/src/app-url.ts","../../../src/approval-result.ts","../../../src/http.ts","../../../src/auth-headers.ts","../../../src/chat-correlation.ts","../../../src/chats.ts","../../../src/client.ts","../../../src/eve/agent/client-from-session.ts","../../../src/eve/agent/chat-audit-api.ts","../../../src/eve/agent/task-delegation.ts","../../../src/env.ts","../../../src/eve/agent/cron-chat.ts","../../../src/eve/agent/hooks/ready.ts","../../../src/eve/agent/hooks/chat-audit.ts","../../../src/agent-admin.ts"],"sourcesContent":["import { createHmac, createSign, createVerify, randomBytes } from \"crypto\";\n\nexport const ROBOTROCK_USER_CONTEXT_ISSUER =\n \"https://robotrock.io/eve-user-context\";\nexport const ROBOTROCK_USER_CONTEXT_AUDIENCE = \"eve\";\nexport const ROBOTROCK_USER_CONTEXT_TTL_SECONDS = 5 * 60;\nexport const ROBOTROCK_USER_CONTEXT_KEY_ID_DEFAULT = \"robotrock-platform-1\";\n\nexport type TenantRole = \"admin\" | \"member\";\n\nexport type RobotRockUserContextClaims = {\n sub: string;\n email: string;\n name: string;\n tenantSlug: string;\n connectionId?: string;\n chatId?: string;\n role: TenantRole;\n groups: string[];\n workosUserId?: string;\n iat: number;\n exp: number;\n};\n\nexport type VerifiedRobotRockUserContextClaims = RobotRockUserContextClaims & {\n iss: string;\n aud: string;\n};\n\n/** Generate a per-connection HMAC secret for proxy→Eve user context JWTs. */\nexport function generateUserContextSecret(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nfunction encodeJwtPart(value: object): string {\n return Buffer.from(JSON.stringify(value)).toString(\"base64url\");\n}\n\nfunction decodeJwtPart(part: string): Record<string, unknown> {\n return JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")) as Record<\n string,\n unknown\n >;\n}\n\ntype MintUserContextBaseArgs = {\n sub: string;\n email: string;\n name: string;\n tenantSlug: string;\n role: TenantRole;\n groups: string[];\n workosUserId?: string;\n connectionId?: string;\n chatId?: string;\n};\n\nfunction buildUserContextPayload(\n args: MintUserContextBaseArgs,\n now: number\n): VerifiedRobotRockUserContextClaims & { iss: string; aud: string } {\n return {\n iss: ROBOTROCK_USER_CONTEXT_ISSUER,\n aud: ROBOTROCK_USER_CONTEXT_AUDIENCE,\n sub: args.sub,\n email: args.email,\n name: args.name,\n tenantSlug: args.tenantSlug,\n role: args.role,\n groups: args.groups,\n ...(args.connectionId ? { connectionId: args.connectionId } : {}),\n ...(args.workosUserId ? { workosUserId: args.workosUserId } : {}),\n ...(args.chatId ? { chatId: args.chatId } : {}),\n iat: now,\n exp: now + ROBOTROCK_USER_CONTEXT_TTL_SECONDS,\n };\n}\n\n/** Mint a short-lived HMAC JWT for self-hosted Eve deployments. */\nexport function mintRobotRockUserContextJwt(\n args: MintUserContextBaseArgs & { secret: string }\n): string {\n const now = Math.floor(Date.now() / 1000);\n const header = { alg: \"HS256\", typ: \"JWT\" };\n const payload = buildUserContextPayload(args, now);\n\n const encodedHeader = encodeJwtPart(header);\n const encodedPayload = encodeJwtPart(payload);\n const signature = createHmac(\"sha256\", args.secret)\n .update(`${encodedHeader}.${encodedPayload}`)\n .digest(\"base64url\");\n\n return `${encodedHeader}.${encodedPayload}.${signature}`;\n}\n\n/** Mint a short-lived RS256 JWT for the platform-hosted Eve agent. */\nexport function mintRobotRockPlatformUserContextJwt(\n args: MintUserContextBaseArgs & {\n privateKeyPem: string;\n connectionId: string;\n keyId?: string;\n }\n): string {\n const now = Math.floor(Date.now() / 1000);\n const header = {\n alg: \"RS256\",\n typ: \"JWT\",\n kid: args.keyId?.trim() || ROBOTROCK_USER_CONTEXT_KEY_ID_DEFAULT,\n };\n const payload = buildUserContextPayload(\n { ...args, connectionId: args.connectionId },\n now\n );\n\n const encodedHeader = encodeJwtPart(header);\n const encodedPayload = encodeJwtPart(payload);\n const signer = createSign(\"RSA-SHA256\");\n signer.update(`${encodedHeader}.${encodedPayload}`);\n signer.end();\n const signature = signer.sign(args.privateKeyPem).toString(\"base64url\");\n\n return `${encodedHeader}.${encodedPayload}.${signature}`;\n}\n\nfunction readStringClaim(\n payload: Record<string, unknown>,\n key: string\n): string | undefined {\n const value = payload[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction readGroupsClaim(payload: Record<string, unknown>): string[] {\n const value = payload.groups;\n if (typeof value === \"string\" && value.length > 0) {\n return [value];\n }\n if (Array.isArray(value)) {\n return value.filter(\n (entry): entry is string => typeof entry === \"string\" && entry.length > 0\n );\n }\n return [];\n}\n\nfunction parseTenantRoleClaim(value: string | undefined): TenantRole | null {\n if (value === \"admin\" || value === \"member\") {\n return value;\n }\n return null;\n}\n\nfunction validateStandardClaims(\n payload: Record<string, unknown>,\n clockSkewSeconds: number\n): boolean {\n const now = Math.floor(Date.now() / 1000);\n const iss = readStringClaim(payload, \"iss\");\n const aud = readStringClaim(payload, \"aud\");\n const iat = payload.iat;\n const exp = payload.exp;\n\n if (iss !== ROBOTROCK_USER_CONTEXT_ISSUER) {\n return false;\n }\n if (aud !== ROBOTROCK_USER_CONTEXT_AUDIENCE) {\n return false;\n }\n if (typeof iat !== \"number\" || typeof exp !== \"number\") {\n return false;\n }\n if (iat > now + clockSkewSeconds) {\n return false;\n }\n if (exp < now - clockSkewSeconds) {\n return false;\n }\n return true;\n}\n\nexport type VerifyPlatformUserContextResult =\n | { ok: true; claims: VerifiedRobotRockUserContextClaims }\n | { ok: false };\n\n/** Verify a platform RS256 user-context JWT. */\nexport function verifyRobotRockPlatformUserContextJwt(args: {\n token: string;\n publicKeyPem: string;\n clockSkewSeconds?: number;\n}): VerifyPlatformUserContextResult {\n const parts = args.token.split(\".\");\n if (parts.length !== 3) {\n return { ok: false };\n }\n\n const [encodedHeader, encodedPayload, encodedSignature] = parts;\n if (!encodedHeader || !encodedPayload || !encodedSignature) {\n return { ok: false };\n }\n\n let header: Record<string, unknown>;\n let payload: Record<string, unknown>;\n try {\n header = decodeJwtPart(encodedHeader);\n payload = decodeJwtPart(encodedPayload);\n } catch {\n return { ok: false };\n }\n\n if (header.alg !== \"RS256\") {\n return { ok: false };\n }\n\n const verifier = createVerify(\"RSA-SHA256\");\n verifier.update(`${encodedHeader}.${encodedPayload}`);\n verifier.end();\n const signature = Buffer.from(encodedSignature, \"base64url\");\n if (!verifier.verify(args.publicKeyPem, signature)) {\n return { ok: false };\n }\n\n const clockSkewSeconds = args.clockSkewSeconds ?? 30;\n if (!validateStandardClaims(payload, clockSkewSeconds)) {\n return { ok: false };\n }\n\n const sub = readStringClaim(payload, \"sub\");\n const email = readStringClaim(payload, \"email\");\n const name = readStringClaim(payload, \"name\");\n const tenantSlug = readStringClaim(payload, \"tenantSlug\");\n const connectionId = readStringClaim(payload, \"connectionId\");\n const role = parseTenantRoleClaim(readStringClaim(payload, \"role\"));\n const workosUserId = readStringClaim(payload, \"workosUserId\");\n const chatId = readStringClaim(payload, \"chatId\");\n const iat = payload.iat;\n const exp = payload.exp;\n\n if (\n !sub ||\n !email ||\n !name ||\n !tenantSlug ||\n !connectionId ||\n !role ||\n typeof iat !== \"number\" ||\n typeof exp !== \"number\"\n ) {\n return { ok: false };\n }\n\n return {\n ok: true,\n claims: {\n iss: ROBOTROCK_USER_CONTEXT_ISSUER,\n aud: ROBOTROCK_USER_CONTEXT_AUDIENCE,\n sub,\n email,\n name,\n tenantSlug,\n connectionId,\n role,\n groups: readGroupsClaim(payload),\n ...(workosUserId ? { workosUserId } : {}),\n ...(chatId ? { chatId } : {}),\n iat,\n exp,\n },\n };\n}\n","/** Public URL where agents fetch the platform user-context verification key. */\nexport const ROBOTROCK_PLATFORM_USER_CONTEXT_PUBLIC_KEY_URL =\n \"https://app.robotrock.io/.well-known/robotrock-user-context-public-key\";\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 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","import type { SendToHumanActionInput } from \"../client.js\";\nimport { decodeHtmlEntities } from \"@robotrock/core/utils\";\nimport {\n isPlatformTerminalAction,\n parsePlatformRejectRequestData,\n} from \"../platform-actions.js\";\n\n/** One selectable option in an Eve HITL input request. */\nexport type EveInputOption = {\n readonly id: string;\n readonly label: string;\n readonly description?: string;\n readonly style?: \"danger\" | \"default\" | \"primary\";\n};\n\n/** Eve HITL display mode — mirrors `InputRequest.display` from the eve runtime. */\nexport type EveInputRequestDisplay = \"confirmation\" | \"select\" | \"text\";\n\n/**\n * Minimal Eve `InputRequest` shape for RobotRock bridging. Intentionally\n * self-contained so the SDK does not depend on the `eve` package.\n */\nexport type EveInputRequest = {\n readonly requestId: string;\n readonly prompt: string;\n readonly display?: EveInputRequestDisplay;\n readonly allowFreeform?: boolean;\n readonly options?: readonly EveInputOption[];\n};\n\n/** Eve `InputResponse` shape returned when resuming a parked session. */\nexport type EveInputResponse = {\n readonly requestId: string;\n readonly optionId?: string;\n readonly text?: string;\n};\n\nexport const EVE_INPUT_SUBMIT_ACTION_ID = \"submit\" as const;\nexport const EVE_INPUT_OTHER_CHOICE_ID = \"__other__\" as const;\nexport const EVE_INPUT_OTHER_CHOICE_LABEL = \"Type your own answer\" as const;\n\nconst CONFIRMATION_DEFAULT_OPTIONS: readonly EveInputOption[] = [\n { id: \"approve\", label: \"Approve\", style: \"primary\" },\n { id: \"deny\", label: \"Deny\", style: \"danger\" },\n];\n\nconst SELECT_PER_OPTION_THRESHOLD = 6;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (value == null || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction readStringField(data: Record<string, unknown>, key: string): string | undefined {\n const value = data[key];\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction decodeDisplayText(value: string): string {\n return decodeHtmlEntities(value);\n}\n\n/** Resolve the effective display mode when Eve omits `display`. */\nexport function resolveEveInputDisplay(\n request: EveInputRequest,\n toolName?: string\n): EveInputRequestDisplay {\n if (request.display) {\n return request.display;\n }\n if (toolName === \"ask_question\") {\n return request.options && request.options.length > 0 ? \"select\" : \"text\";\n }\n if (request.options && request.options.length > 0) {\n return \"select\";\n }\n return \"confirmation\";\n}\n\nfunction confirmationActions(request: EveInputRequest): readonly SendToHumanActionInput[] {\n const options =\n request.options && request.options.length > 0\n ? request.options\n : CONFIRMATION_DEFAULT_OPTIONS;\n\n return options.map((option) => ({\n id: option.id,\n title: decodeDisplayText(option.label),\n ...(option.description\n ? { description: decodeDisplayText(option.description) }\n : {}),\n }));\n}\n\nfunction textSubmitAction(prompt: string): SendToHumanActionInput {\n const decodedPrompt = decodeDisplayText(prompt);\n return {\n id: EVE_INPUT_SUBMIT_ACTION_ID,\n title: \"Submit\",\n schema: {\n type: \"object\",\n required: [\"answer\"],\n properties: {\n answer: {\n type: \"string\",\n title: \"Your answer\",\n },\n },\n },\n ui: {\n answer: {\n \"ui:title\": decodedPrompt.trim() || \"Your answer\",\n \"ui:widget\": \"textarea\",\n },\n },\n };\n}\n\nfunction selectPerOptionActions(\n options: readonly EveInputOption[]\n): readonly SendToHumanActionInput[] {\n return options.map((option) => ({\n id: option.id,\n title: decodeDisplayText(option.label),\n ...(option.description\n ? { description: decodeDisplayText(option.description) }\n : {}),\n }));\n}\n\nfunction selectFormAction(request: EveInputRequest): SendToHumanActionInput {\n const options = request.options ?? [];\n const allowFreeform = request.allowFreeform === true;\n const enumValues = options.map((option) => option.id);\n const enumNames = options.map((option) => decodeDisplayText(option.label));\n\n if (allowFreeform) {\n enumValues.push(EVE_INPUT_OTHER_CHOICE_ID);\n enumNames.push(EVE_INPUT_OTHER_CHOICE_LABEL);\n }\n\n const properties: Record<string, unknown> = {\n choice: {\n type: \"string\",\n title: \"Choose one\",\n enum: enumValues,\n },\n };\n\n if (allowFreeform) {\n properties.other = {\n type: \"string\",\n title: \"Your answer\",\n };\n }\n\n const schema: Record<string, unknown> = {\n type: \"object\",\n required: [\"choice\"],\n properties,\n };\n\n if (allowFreeform) {\n schema.allOf = [\n {\n if: {\n properties: {\n choice: { const: EVE_INPUT_OTHER_CHOICE_ID },\n },\n required: [\"choice\"],\n },\n then: {\n required: [\"other\"],\n properties: {\n other: {\n type: \"string\",\n minLength: 1,\n },\n },\n },\n },\n ];\n }\n\n const ui: Record<string, unknown> = {\n choice: {\n \"ui:widget\": \"radio\",\n \"ui:enumNames\": enumNames,\n },\n };\n\n if (allowFreeform) {\n ui.other = {\n \"ui:placeholder\": \"Enter your answer\",\n };\n }\n\n return {\n id: EVE_INPUT_SUBMIT_ACTION_ID,\n title: \"Submit\",\n schema: schema as SendToHumanActionInput[\"schema\"],\n ui: ui as SendToHumanActionInput[\"ui\"],\n };\n}\n\n/** Keep select-form submissions mutually exclusive between preset choice and freeform other. */\nexport function normalizeEveSelectFormData(\n data: Record<string, unknown>\n): Record<string, unknown> {\n const choice =\n typeof data.choice === \"string\" ? data.choice.trim() : undefined;\n if (!choice) {\n return data;\n }\n if (choice === EVE_INPUT_OTHER_CHOICE_ID) {\n return {\n choice,\n ...(data.other !== undefined ? { other: data.other } : {}),\n };\n }\n return { choice };\n}\n\n/**\n * Map an Eve `InputRequest` to RobotRock inbox actions.\n */\nexport function eveInputRequestToActions(\n request: EveInputRequest,\n options?: { toolName?: string }\n): readonly SendToHumanActionInput[] {\n const display = resolveEveInputDisplay(request, options?.toolName);\n\n switch (display) {\n case \"confirmation\":\n return confirmationActions(request);\n case \"text\":\n return [textSubmitAction(request.prompt)];\n case \"select\": {\n const selectOptions = request.options ?? [];\n if (selectOptions.length === 0) {\n return [textSubmitAction(request.prompt)];\n }\n if (\n selectOptions.length <= SELECT_PER_OPTION_THRESHOLD &&\n request.allowFreeform !== true\n ) {\n return selectPerOptionActions(selectOptions);\n }\n return [selectFormAction(request)];\n }\n }\n}\n\n/** Task type slug for an Eve input request. */\nexport function eveInputRequestTaskType(\n request: EveInputRequest,\n options?: { toolName?: string }\n): string {\n const display = resolveEveInputDisplay(request, options?.toolName);\n if (display === \"confirmation\" && options?.toolName) {\n return `eve-approval:${options.toolName}`;\n }\n return `eve-input:${display}`;\n}\n\n/**\n * Map a handled RobotRock task action back to an Eve `InputResponse`.\n */\nexport function taskHandledToEveInputResponse(\n request: EveInputRequest,\n actionId: string,\n actionData: unknown,\n options?: { toolName?: string }\n): EveInputResponse {\n const base = { requestId: request.requestId };\n\n if (isPlatformTerminalAction(actionId)) {\n const feedback = parsePlatformRejectRequestData(actionData)?.feedback;\n return {\n ...base,\n optionId: \"deny\",\n ...(feedback ? { text: feedback } : {}),\n };\n }\n\n const display = resolveEveInputDisplay(request, options?.toolName);\n const selectOptions = request.options ?? [];\n const data = asRecord(actionData);\n\n if (display === \"confirmation\") {\n return { ...base, optionId: actionId };\n }\n\n const matchingOption = selectOptions.find((option) => option.id === actionId);\n if (matchingOption) {\n return { ...base, optionId: actionId };\n }\n\n if (actionId === EVE_INPUT_SUBMIT_ACTION_ID && data) {\n const submissionData =\n display === \"select\" && request.allowFreeform === true\n ? normalizeEveSelectFormData(data)\n : data;\n\n const answer = readStringField(submissionData, \"answer\");\n if (answer) {\n return { ...base, text: answer };\n }\n\n const choice = readStringField(submissionData, \"choice\");\n if (choice === EVE_INPUT_OTHER_CHOICE_ID) {\n const other = readStringField(submissionData, \"other\");\n if (other) {\n return { ...base, text: other };\n }\n }\n\n if (choice) {\n if (selectOptions.some((option) => option.id === choice)) {\n return { ...base, optionId: choice };\n }\n return { ...base, text: choice };\n }\n }\n\n if (data) {\n const answer = readStringField(data, \"answer\");\n if (answer) {\n return { ...base, text: answer };\n }\n }\n\n return { ...base, optionId: actionId };\n}\n","import {\n EVE_INPUT_SUBMIT_ACTION_ID,\n eveInputRequestToActions,\n resolveEveInputDisplay,\n type EveInputOption,\n type EveInputRequest,\n type EveInputRequestDisplay,\n type EveInputResponse,\n} from \"./input-request.js\";\n\nexport type EveInputAuditContext = {\n toolCallId: string;\n toolName?: string;\n requestId?: string;\n display?: EveInputRequestDisplay;\n toolInput?: unknown;\n};\n\nfunction matchOptionByText(\n text: string,\n options: readonly EveInputOption[]\n): EveInputOption | undefined {\n const normalized = text.trim().toLowerCase();\n if (normalized.length === 0) {\n return undefined;\n }\n\n const byId = options.find((option) => option.id.toLowerCase() === normalized);\n if (byId) {\n return byId;\n }\n\n const byLabel = options.find((option) => option.label.toLowerCase() === normalized);\n if (byLabel) {\n return byLabel;\n }\n\n const index = Number(normalized);\n if (Number.isInteger(index) && index > 0 && index <= options.length) {\n return options[index - 1];\n }\n\n return undefined;\n}\n\n/**\n * Map freeform composer text to an Eve `InputResponse`, mirroring Eve's\n * `resolveTextToResponse` rules (option id/label, numeric index, freeform text).\n */\nexport function resolveEveFreeformTextToInputResponse(\n request: EveInputRequest,\n text: string\n): EveInputResponse | undefined {\n const trimmed = text.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n const options = request.options ?? [];\n if (options.length > 0) {\n const matched = matchOptionByText(trimmed, options);\n if (matched) {\n return { requestId: request.requestId, optionId: matched.id };\n }\n }\n\n if (request.allowFreeform === true || options.length === 0) {\n return { requestId: request.requestId, text: trimmed };\n }\n\n return undefined;\n}\n\n/** Returns true for Eve's default approval gate (approve / deny options). */\nexport function isEveApprovalInputRequest(request: EveInputRequest): boolean {\n const options = request.options ?? [];\n return (\n options.length === 2 &&\n options[0]?.id === \"approve\" &&\n options[1]?.id === \"deny\"\n );\n}\n\nexport type EveInputActionSubmission = {\n actionId: string;\n actionTitle: string;\n formData: Record<string, unknown>;\n};\n\nfunction buildOptionIdFormData(\n display: EveInputRequestDisplay | undefined,\n optionId: string\n): Record<string, unknown> {\n if (display === \"select\" || display === \"confirmation\") {\n return { choice: optionId };\n }\n return {};\n}\n\n/**\n * Map a resolved Eve `InputResponse` to RobotRock audit fields (action id/title).\n */\nexport function eveInputResponseToActionSubmission(\n request: EveInputRequest,\n response: EveInputResponse,\n options?: { toolName?: string }\n): EveInputActionSubmission {\n const display = resolveEveInputDisplay(request, options?.toolName);\n const actions = eveInputRequestToActions(request, options);\n\n if (response.optionId) {\n const action = actions.find((entry) => entry.id === response.optionId);\n if (action) {\n return {\n actionId: response.optionId,\n actionTitle: action.title,\n formData: buildOptionIdFormData(display, response.optionId),\n };\n }\n\n const option = request.options?.find((entry) => entry.id === response.optionId);\n if (option) {\n return {\n actionId: response.optionId,\n actionTitle: option.label,\n formData: buildOptionIdFormData(display, response.optionId),\n };\n }\n\n return {\n actionId: response.optionId,\n actionTitle: response.optionId,\n formData: buildOptionIdFormData(display, response.optionId),\n };\n }\n\n const text = response.text?.trim();\n if (text) {\n if (display === \"text\") {\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: text,\n formData: { answer: text },\n };\n }\n\n if (display === \"select\") {\n const option = request.options?.find((entry) => entry.id === text);\n if (option) {\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: option.label,\n formData: { choice: option.id },\n };\n }\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: text,\n formData: { choice: text },\n };\n }\n\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: text,\n formData: { answer: text },\n };\n }\n\n return {\n actionId: EVE_INPUT_SUBMIT_ACTION_ID,\n actionTitle: \"Responded\",\n formData: {},\n };\n}\n\n/** Audit payload for `chat_action_input_submitted`. */\nexport function buildEveInputAuditSubmissionData(\n context: EveInputAuditContext,\n formData: Record<string, unknown>\n): Record<string, unknown> {\n return {\n toolCallId: context.toolCallId,\n ...(context.toolName ? { toolName: context.toolName } : {}),\n ...(context.requestId ? { requestId: context.requestId } : {}),\n ...(context.display ? { display: context.display } : {}),\n ...(context.toolInput !== undefined ? { toolInput: context.toolInput } : {}),\n ...formData,\n };\n}\n\n/**\n * Parse an `ask_question` tool result output into an Eve input response shape.\n */\nexport function parseEveAskQuestionToolOutput(\n output: unknown\n): Pick<EveInputResponse, \"optionId\" | \"text\"> | null {\n if (output == null || typeof output !== \"object\") {\n return null;\n }\n\n const record = output as Record<string, unknown>;\n const value =\n record.type === \"json\" && record.value != null && typeof record.value === \"object\"\n ? (record.value as Record<string, unknown>)\n : record;\n\n const optionId = typeof value.optionId === \"string\" ? value.optionId : undefined;\n const text = typeof value.text === \"string\" ? value.text : undefined;\n\n if (!optionId && !text) {\n return null;\n }\n\n return { ...(optionId ? { optionId } : {}), ...(text ? { text } : {}) };\n}\n","import { isToolUiHint, type ToolUiHint } from \"./tool-ui-hint.js\";\n\n/** Nested agent-only UI metadata on tool execute results. */\nexport const TOOL_UI_FIELD = \"ui\" as const;\n\n/** Free-form entity id: lowercase slug used as cache key (e.g. member, task). */\nexport const TOOL_RESULT_UI_ENTITY_ID_RE = /^[a-z][a-z0-9_]{0,63}$/;\n\n/**\n * Recommended entity ids for RobotRock tools. Not exhaustive — any valid slug is accepted.\n * @deprecated Prefer free-form `ui.entity` strings; this list is documentation only.\n */\nexport const TOOL_RESULT_UI_ENTITIES = [\n \"product\",\n \"member\",\n \"task\",\n \"group\",\n \"status\",\n \"object\",\n] as const;\n\nexport type ToolResultUiEntity = string;\n\n/** Render layout hint (not a cached atom). Derived from uiHint / legacy pattern. */\nexport type ToolResultUiLayout = ToolUiHint;\n\nexport type ToolResultUiMeta = {\n /** Hybrid presentation override: true = always show card, false = never. */\n present?: boolean;\n /** Entity id for row layout cache (free-form slug). */\n entity?: ToolResultUiEntity;\n /** Path to row array for list cards (e.g. \"rows\", \"items\"). */\n rowsPath?: string;\n /** Viz/collection layout hint — chart | table | list. Not a pattern atom. */\n layout?: ToolResultUiLayout;\n};\n\nexport function isToolResultUiEntityId(value: unknown): value is string {\n return typeof value === \"string\" && TOOL_RESULT_UI_ENTITY_ID_RE.test(value);\n}\n\n/** @deprecated Use isToolResultUiEntityId. */\nexport function isToolResultUiEntity(value: unknown): value is string {\n return isToolResultUiEntityId(value);\n}\n\n/** Map legacy top-level uiHint into a layout hint. */\nexport function uiHintToLayout(hint: ToolUiHint): ToolResultUiLayout {\n return hint;\n}\n\n/**\n * Map legacy `ui.pattern` values into layout / rowsPath behavior.\n * Patterns are no longer cached atoms.\n */\nexport function legacyPatternToLayout(\n pattern: string\n): ToolResultUiLayout | undefined {\n switch (pattern) {\n case \"chart\":\n return \"chart\";\n case \"table\":\n return \"table\";\n case \"list\":\n case \"query\":\n return \"list\";\n default:\n return undefined;\n }\n}\n\nfunction readPresent(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction readRowsPath(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction readEntity(value: unknown): string | undefined {\n if (!isToolResultUiEntityId(value)) {\n return undefined;\n }\n return value;\n}\n\n/** Read and validate nested `ui` metadata (+ legacy uiHint / pattern → layout). */\nexport function extractToolResultUiMeta(\n output: unknown\n): ToolResultUiMeta | undefined {\n if (typeof output !== \"object\" || output === null || Array.isArray(output)) {\n return undefined;\n }\n\n const record = output as Record<string, unknown>;\n const rawUi = record[TOOL_UI_FIELD];\n const meta: ToolResultUiMeta = {};\n\n if (typeof rawUi === \"object\" && rawUi !== null && !Array.isArray(rawUi)) {\n const ui = rawUi as Record<string, unknown>;\n const present = readPresent(ui.present);\n if (present !== undefined) {\n meta.present = present;\n }\n const entity = readEntity(ui.entity);\n if (entity) {\n meta.entity = entity;\n }\n const rowsPath = readRowsPath(ui.rowsPath);\n if (rowsPath) {\n meta.rowsPath = rowsPath;\n }\n if (isToolUiHint(ui.layout)) {\n meta.layout = ui.layout;\n } else if (typeof ui.pattern === \"string\") {\n // Legacy nested pattern → layout hint only.\n const fromPattern = legacyPatternToLayout(ui.pattern);\n if (fromPattern) {\n meta.layout = fromPattern;\n }\n }\n }\n\n if (!meta.layout && isToolUiHint(record.uiHint)) {\n meta.layout = uiHintToLayout(record.uiHint);\n }\n\n if (\n meta.present === undefined &&\n meta.entity === undefined &&\n meta.rowsPath === undefined &&\n meta.layout === undefined\n ) {\n return undefined;\n }\n\n return meta;\n}\n\n/** Attach nested UI metadata to a tool execute result. */\nexport function withToolUi<T extends Record<string, unknown>>(\n result: T,\n ui: ToolResultUiMeta\n): T & { ui: ToolResultUiMeta } {\n const existing =\n typeof result[TOOL_UI_FIELD] === \"object\" &&\n result[TOOL_UI_FIELD] !== null &&\n !Array.isArray(result[TOOL_UI_FIELD])\n ? (result[TOOL_UI_FIELD] as ToolResultUiMeta)\n : {};\n\n return {\n ...result,\n [TOOL_UI_FIELD]: {\n ...existing,\n ...ui,\n },\n };\n}\n","import { z } from \"zod\";\nimport { TOOL_RESULT_UI_ENTITY_ID_RE } from \"./tool-result-ui-meta.js\";\n\n/** Tenant-relative inbox deep link for a task (matches dashboard inbox hrefs). */\nexport function buildTenantTaskUrl(\n tenantSlug: string,\n task: { id: string; type?: string | null; app?: string | null }\n): string {\n const q = new URLSearchParams();\n if (task.app && task.app !== \"default\") {\n q.set(\"app\", task.app);\n }\n if (task.type?.trim()) {\n q.set(\"type\", task.type.trim());\n }\n q.set(\"selected\", task.id);\n return `/${tenantSlug}/inbox?${q.toString()}`;\n}\n\n/** Tenant-relative group detail path (matches tenantGroup widget). */\nexport function buildTenantGroupUrl(tenantSlug: string, slug: string): string {\n return `/${tenantSlug}/team/groups/${slug}`;\n}\n\nexport const toolResultUiMetaSchema = z\n .object({\n present: z.boolean().optional(),\n entity: z.string().regex(TOOL_RESULT_UI_ENTITY_ID_RE).optional(),\n rowsPath: z.string().min(1).optional(),\n layout: z.enum([\"list\", \"chart\", \"table\"]).optional(),\n })\n .strict();\n\nconst agentOnlyFields = {\n replyGuidance: z.string().optional(),\n ui: toolResultUiMetaSchema.optional(),\n uiHint: z.enum([\"list\", \"chart\", \"table\"]).optional(),\n} as const;\n\nfunction withAgentOnlyFields<T extends z.ZodRawShape>(shape: T) {\n return z.object({\n ...shape,\n ...agentOnlyFields,\n });\n}\n\n/** Demo catalog product row (`search_products`). */\nexport const productEntityRowSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n price: z.number(),\n currency: z.string().min(1),\n inStock: z.boolean(),\n url: z.string().min(1),\n});\n\n/** Demo chart series point (`generate_random_chart`). */\nexport const metricPointEntityRowSchema = z\n .object({\n date: z.string().optional(),\n category: z.string().optional(),\n label: z.string().optional(),\n })\n .catchall(z.union([z.string(), z.number()]));\n\nexport const memberEntityRowSchema = z.object({\n name: z.string(),\n email: z.string(),\n role: z.string(),\n membershipKind: z.string(),\n profilePictureUrl: z.string().nullable(),\n});\n\nexport const taskEntityRowSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n status: z.string().min(1),\n type: z.string().nullable(),\n description: z.string().nullable(),\n validUntil: z.number(),\n createdAt: z.number(),\n url: z.string().min(1),\n threadPriority: z.string().nullable().optional(),\n});\n\nexport const groupEntityRowSchema = z.object({\n name: z.string().min(1),\n slug: z.string().min(1),\n description: z.string().nullable(),\n memberCount: z.number().nullable(),\n url: z.string().min(1),\n});\n\nexport const groupDetailEntitySchema = z.object({\n name: z.string().min(1),\n slug: z.string().min(1),\n description: z.string().nullable(),\n url: z.string().min(1),\n members: z.array(\n z.object({\n name: z.string(),\n email: z.string(),\n profilePictureUrl: z.string().nullable(),\n })\n ),\n});\n\n/** Assign-task / status list row — always includes task inbox url. */\nexport const statusEntityRowSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n status: z.string().min(1),\n url: z.string().min(1),\n type: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n});\n\nexport const agentAdminErrorResultSchema = z.object({\n ok: z.literal(false),\n status: z.number().optional(),\n message: z.string(),\n response: z.unknown().optional(),\n});\n\nexport const agentAdminMutationResultSchema = z\n .object({\n ...agentOnlyFields,\n })\n .passthrough();\n\nexport const searchProductsOutputSchema = withAgentOnlyFields({\n items: z.array(productEntityRowSchema),\n});\n\nexport const generateRandomChartOutputSchema = withAgentOnlyFields({\n title: z.string().min(1),\n axis: z.enum([\"time\", \"category\"]),\n series: z.array(metricPointEntityRowSchema),\n});\n\n/** Demo generated image (`generate_image`) — bytes live in Convex `_storage`. */\nexport const generateImageOutputSchema = withAgentOnlyFields({\n prompt: z.string().min(1),\n mediaType: z.string().min(1),\n model: z.string().min(1),\n storageId: z.string().min(1),\n url: z.string().min(1),\n /** @deprecated Legacy sessions only — prefer storageId/url. */\n base64: z.string().min(1).optional(),\n});\n\nexport const manageTeamMembersListOutputSchema = withAgentOnlyFields({\n members: z.array(memberEntityRowSchema),\n});\n\nexport const manageTeamMembersDetailOutputSchema = withAgentOnlyFields(\n memberEntityRowSchema.shape\n);\n\nexport const manageTeamMembersOutputSchema = z.union([\n manageTeamMembersListOutputSchema,\n manageTeamMembersDetailOutputSchema,\n agentAdminMutationResultSchema,\n agentAdminErrorResultSchema,\n]);\n\nexport const manageGroupsListOutputSchema = withAgentOnlyFields({\n groups: z.array(groupEntityRowSchema),\n});\n\nexport const manageGroupsDetailOutputSchema = withAgentOnlyFields(\n groupDetailEntitySchema.shape\n);\n\nexport const manageGroupsSummaryOutputSchema = withAgentOnlyFields(\n groupEntityRowSchema.shape\n);\n\nexport const manageGroupsOutputSchema = z.union([\n manageGroupsListOutputSchema,\n manageGroupsDetailOutputSchema,\n manageGroupsSummaryOutputSchema,\n agentAdminMutationResultSchema,\n agentAdminErrorResultSchema,\n]);\n\nexport const queryTasksListOutputSchema = withAgentOnlyFields({\n items: z.array(taskEntityRowSchema),\n nextCursor: z.string().nullable().optional(),\n});\n\nexport const queryTasksDetailOutputSchema = withAgentOnlyFields({\n id: z.string().nullable(),\n status: z.string().nullable(),\n type: z.string().nullable(),\n name: z.string().nullable(),\n description: z.string().nullable(),\n validUntil: z.number().nullable(),\n createdAt: z.number().nullable(),\n url: z.string().min(1).nullable(),\n});\n\nexport const queryTasksOutputSchema = z.union([\n queryTasksListOutputSchema,\n queryTasksDetailOutputSchema,\n agentAdminErrorResultSchema,\n]);\n\nexport const assignTasksOutputSchema = z.union([\n withAgentOnlyFields({\n results: z.array(statusEntityRowSchema),\n }),\n agentAdminErrorResultSchema,\n]);\n\nexport const workspaceUsageEntitySchema = z.object({\n workspace: z.string(),\n plan: z.string(),\n planType: z.string(),\n trialState: z.string(),\n daysRemaining: z.number().nullable(),\n isPaidPro: z.boolean(),\n subscriptionStatus: z.string(),\n tasksToday: z.string(),\n tasksResetAt: z.string(),\n openTasks: z.number(),\n totalTasks: z.number(),\n seats: z.string(),\n groups: z.string(),\n apiKeys: z.string(),\n rateLimitPerSecond: z.number(),\n});\n\nexport const getWorkspaceUsageOutputSchema = z.union([\n withAgentOnlyFields({\n usage: workspaceUsageEntitySchema,\n }),\n agentAdminErrorResultSchema,\n]);\n\nexport type ProductEntityRow = z.infer<typeof productEntityRowSchema>;\nexport type MetricPointEntityRow = z.infer<typeof metricPointEntityRowSchema>;\nexport type MemberEntityRow = z.infer<typeof memberEntityRowSchema>;\nexport type TaskEntityRow = z.infer<typeof taskEntityRowSchema>;\nexport type GroupEntityRow = z.infer<typeof groupEntityRowSchema>;\nexport type StatusEntityRow = z.infer<typeof statusEntityRowSchema>;\n","export {\n EVE_INPUT_OTHER_CHOICE_ID,\n EVE_INPUT_OTHER_CHOICE_LABEL,\n EVE_INPUT_SUBMIT_ACTION_ID,\n eveInputRequestTaskType,\n eveInputRequestToActions,\n normalizeEveSelectFormData,\n resolveEveInputDisplay,\n taskHandledToEveInputResponse,\n type EveInputOption,\n type EveInputRequest,\n type EveInputRequestDisplay,\n type EveInputResponse,\n} from \"./input-request.js\";\nexport {\n buildEveInputAuditSubmissionData,\n eveInputResponseToActionSubmission,\n isEveApprovalInputRequest,\n parseEveAskQuestionToolOutput,\n resolveEveFreeformTextToInputResponse,\n type EveInputActionSubmission,\n type EveInputAuditContext,\n} from \"./input-audit.js\";\nexport {\n buildChatToolAuditPayload,\n sanitizeToolAuditInput,\n shouldAuditToolExecution,\n type ChatToolAuditInput,\n type ChatToolAuditPayload,\n} from \"./tool-audit.js\";\nexport {\n DEFAULT_TOOL_DISPLAY_LABELS,\n formatEveApprovalTitle,\n getToolDisplayLabel,\n setToolDisplayLabelOverrides,\n} from \"./tool-display.js\";\nexport {\n toolDisplayResult,\n type ToolDisplayResultOptions,\n} from \"./tool-result-display.js\";\nexport {\n formatToolListResult,\n formatToolObjectResult,\n formatToolQueryResult,\n isAgentAdminErrorResult,\n type FormatToolListResultOptions,\n type FormatToolObjectResultOptions,\n type FormatToolQueryResultOptions,\n} from \"./tool-display-format.js\";\nexport {\n TOOL_UI_HINT_FIELD,\n extractToolUiHint,\n isToolUiHint,\n withUiHint,\n type ToolUiHint,\n} from \"./tool-ui-hint.js\";\nexport {\n TOOL_UI_FIELD,\n TOOL_RESULT_UI_ENTITIES,\n TOOL_RESULT_UI_ENTITY_ID_RE,\n extractToolResultUiMeta,\n isToolResultUiEntity,\n isToolResultUiEntityId,\n legacyPatternToLayout,\n uiHintToLayout,\n withToolUi,\n type ToolResultUiEntity,\n type ToolResultUiLayout,\n type ToolResultUiMeta,\n} from \"./tool-result-ui-meta.js\";\nexport {\n buildTenantGroupUrl,\n buildTenantTaskUrl,\n agentAdminErrorResultSchema,\n agentAdminMutationResultSchema,\n assignTasksOutputSchema,\n groupDetailEntitySchema,\n groupEntityRowSchema,\n manageGroupsDetailOutputSchema,\n manageGroupsListOutputSchema,\n manageGroupsOutputSchema,\n manageGroupsSummaryOutputSchema,\n manageTeamMembersDetailOutputSchema,\n manageTeamMembersListOutputSchema,\n manageTeamMembersOutputSchema,\n memberEntityRowSchema,\n generateImageOutputSchema,\n generateRandomChartOutputSchema,\n getWorkspaceUsageOutputSchema,\n metricPointEntityRowSchema,\n productEntityRowSchema,\n queryTasksDetailOutputSchema,\n queryTasksListOutputSchema,\n queryTasksOutputSchema,\n searchProductsOutputSchema,\n statusEntityRowSchema,\n taskEntityRowSchema,\n toolResultUiMetaSchema,\n workspaceUsageEntitySchema,\n type GroupEntityRow,\n type MemberEntityRow,\n type MetricPointEntityRow,\n type ProductEntityRow,\n type StatusEntityRow,\n type TaskEntityRow,\n} from \"./entity-schemas.js\";\nexport {\n CREATE_INBOX_TASK_REPLY_GUIDANCE,\n MY_ACCESS_REPLY_GUIDANCE,\n GET_WORKSPACE_USAGE_REPLY_GUIDANCE,\n GENERATE_IMAGE_REPLY_GUIDANCE,\n GENERATE_RANDOM_CHART_REPLY_GUIDANCE,\n SEARCH_PRODUCTS_REPLY_GUIDANCE,\n MANAGE_TEAM_MEMBERS_LIST_REPLY_GUIDANCE,\n MANAGE_TEAM_MEMBERS_DETAIL_REPLY_GUIDANCE,\n MANAGE_GROUPS_LIST_REPLY_GUIDANCE,\n MANAGE_GROUPS_DETAIL_REPLY_GUIDANCE,\n QUERY_TASKS_LIST_REPLY_GUIDANCE,\n QUERY_TASKS_DETAIL_REPLY_GUIDANCE,\n REFUND_CHARGE_REPLY_GUIDANCE,\n DEPLOY_RELEASE_REPLY_GUIDANCE,\n GET_WEATHER_REPLY_GUIDANCE,\n ADMIN_MUTATION_REPLY_GUIDANCE,\n TOOL_REPLY_GUIDANCE_FIELD,\n WHOAMI_REPLY_GUIDANCE,\n stripAgentOnlyToolFields,\n withReplyGuidance,\n type ToolResultWithReplyGuidance,\n} from \"./tool-reply-guidance.js\";\n/** Hook slug advertised in GET /eve/v1/info for RobotRock-ready auto-detection. */\nexport const ROBOTROCK_READY_HOOK_SLUG = \"robotrock-ready\";\n\nexport { buildTaskHandledResumeMessage } from \"./resume-message.js\";\n","export {\n ROBOTROCK_USER_CONTEXT_AUDIENCE,\n ROBOTROCK_USER_CONTEXT_ISSUER,\n} from \"@robotrock/core/eve/user-context-jwt\";\nexport { ROBOTROCK_PLATFORM_USER_CONTEXT_PUBLIC_KEY_URL } from \"@robotrock/core/eve/platform-user-context-public-key\";\nexport { ROBOTROCK_READY_HOOK_SLUG } from \"../index.js\";\n\n/** Header carrying the dashboard user-context JWT on proxied Eve requests. */\nexport const ROBOTROCK_USER_CONTEXT_HEADER = \"x-robotrock-user-token\";\n","export function readStringAttribute(\n attributes: Readonly<Record<string, string | readonly string[]>> | undefined,\n key: string\n): string | undefined {\n const value = attributes?.[key];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n if (Array.isArray(value) && typeof value[0] === \"string\" && value[0].length > 0) {\n return value[0];\n }\n return undefined;\n}\n\nexport function readStringArrayAttribute(\n attributes: Readonly<Record<string, string | readonly string[]>> | undefined,\n key: string\n): string[] {\n const value = attributes?.[key];\n if (typeof value === \"string\" && value.length > 0) {\n return [value];\n }\n if (Array.isArray(value)) {\n return value.filter(\n (entry): entry is string => typeof entry === \"string\" && entry.length > 0\n );\n }\n return [];\n}\n\nexport function parseTenantRole(\n value: string | undefined\n): \"admin\" | \"member\" | null {\n if (value === \"admin\" || value === \"member\") {\n return value;\n }\n return null;\n}\n","import type { SessionContext } from \"eve/context\";\nimport {\n parseTenantRole,\n readStringArrayAttribute,\n readStringAttribute,\n} from \"./attributes.js\";\n\nexport type TenantRole = \"admin\" | \"member\";\n\nexport type TenantCaller = {\n userId: string;\n email: string;\n name: string;\n tenantSlug: string;\n connectionId?: string;\n chatId?: string;\n role: TenantRole;\n isAdmin: boolean;\n groups: string[];\n workosUserId?: string;\n};\n\n/** Resolve the authenticated RobotRock dashboard user for the current session. */\nexport function tryResolveTenantCaller(ctx: SessionContext): TenantCaller | null {\n const caller = ctx.session.auth.initiator ?? ctx.session.auth.current;\n if (caller?.principalType !== \"user\") {\n return null;\n }\n\n const email = readStringAttribute(caller.attributes, \"email\");\n const name = readStringAttribute(caller.attributes, \"name\");\n const tenantSlug =\n readStringAttribute(caller.attributes, \"tenantSlug\") ??\n readStringAttribute(caller.attributes, \"tenantId\");\n const role = parseTenantRole(readStringAttribute(caller.attributes, \"role\"));\n if (!email || !tenantSlug || !caller.principalId || !role) {\n return null;\n }\n\n const workosUserId = readStringAttribute(caller.attributes, \"workosUserId\");\n const connectionId = readStringAttribute(caller.attributes, \"connectionId\");\n const chatId = readStringAttribute(caller.attributes, \"chatId\");\n const groups = readStringArrayAttribute(caller.attributes, \"groups\");\n\n return {\n userId: caller.principalId,\n email,\n name: name ?? email.split(\"@\")[0] ?? email,\n tenantSlug,\n ...(connectionId ? { connectionId } : {}),\n ...(chatId ? { chatId } : {}),\n role,\n isAdmin: role === \"admin\",\n groups,\n ...(workosUserId ? { workosUserId } : {}),\n };\n}\n\n/** Like {@link tryResolveTenantCaller} but throws when the session has no user. */\nexport function requireTenantCaller(ctx: SessionContext): TenantCaller {\n const caller = tryResolveTenantCaller(ctx);\n if (!caller) {\n throw new Error(\"An authenticated RobotRock tenant user is required.\");\n }\n return caller;\n}\n\nexport function isAdminCaller(ctx: SessionContext): boolean {\n return tryResolveTenantCaller(ctx)?.isAdmin === true;\n}\n\n/** Require an authenticated tenant admin for the current session. */\nexport function requireAdminCaller(ctx: SessionContext): TenantCaller {\n const caller = requireTenantCaller(ctx);\n if (!caller.isAdmin) {\n throw new Error(\"Tenant admin access is required.\");\n }\n return caller;\n}\n","import {\n verifyJwtHmac,\n extractBearerToken,\n type AuthFn,\n} from \"eve/channels/auth\";\nimport { verifyRobotRockPlatformUserContextJwt } from \"@robotrock/core/eve/user-context-jwt\";\nimport {\n parseTenantRole,\n readStringArrayAttribute,\n readStringAttribute,\n} from \"./attributes.js\";\nimport {\n ROBOTROCK_USER_CONTEXT_AUDIENCE,\n ROBOTROCK_USER_CONTEXT_HEADER,\n ROBOTROCK_USER_CONTEXT_ISSUER,\n} from \"./constants.js\";\nimport { resolvePlatformUserContextPublicKeyPem } from \"./platform-public-key.js\";\n\nfunction mapVerifiedClaimsToSessionAuth(claims: {\n sub: string;\n email: string;\n name: string;\n tenantSlug: string;\n connectionId?: string;\n chatId?: string;\n role: \"admin\" | \"member\";\n groups: string[];\n workosUserId?: string;\n}) {\n return {\n authenticator: \"robotrock\" as const,\n principalId: claims.sub,\n principalType: \"user\" as const,\n subject: claims.sub,\n issuer: ROBOTROCK_USER_CONTEXT_ISSUER,\n attributes: {\n email: claims.email,\n name: claims.name,\n tenantSlug: claims.tenantSlug,\n tenantId: claims.tenantSlug,\n role: claims.role,\n groups: claims.groups,\n ...(claims.connectionId ? { connectionId: claims.connectionId } : {}),\n ...(claims.workosUserId ? { workosUserId: claims.workosUserId } : {}),\n ...(claims.chatId ? { chatId: claims.chatId } : {}),\n },\n };\n}\n\nexport type RobotrockUserContextAuthOptions = {\n publicKeyPem?: string | (() => Promise<string | null>);\n hmacSecret?: string;\n};\n\n/**\n * Verifies the short-lived user-context JWT minted by the RobotRock dashboard\n * Eve proxy (`X-RobotRock-User-Token`). Hosted tenants use RS256 platform JWTs;\n * self-hosted deployments use per-connection HMAC secrets.\n */\nexport function robotrockUserContextAuth(\n options?: RobotrockUserContextAuthOptions\n): AuthFn<Request> {\n return async (request) => {\n const token = extractBearerToken(\n request.headers.get(ROBOTROCK_USER_CONTEXT_HEADER)\n );\n if (!token) {\n return null;\n }\n\n let publicKeyPem: string | null = null;\n if (typeof options?.publicKeyPem === \"function\") {\n publicKeyPem = await options.publicKeyPem();\n } else if (options?.publicKeyPem) {\n publicKeyPem = options.publicKeyPem;\n } else {\n publicKeyPem = await resolvePlatformUserContextPublicKeyPem();\n }\n\n if (publicKeyPem) {\n const platformResult = verifyRobotRockPlatformUserContextJwt({\n token,\n publicKeyPem,\n });\n if (platformResult.ok) {\n return mapVerifiedClaimsToSessionAuth(platformResult.claims);\n }\n }\n\n const secret =\n options?.hmacSecret?.trim() ??\n process.env.ROBOTROCK_USER_CONTEXT_SECRET?.trim();\n if (!secret) {\n return null;\n }\n\n const result = await verifyJwtHmac(token, {\n algorithm: \"HS256\",\n issuer: ROBOTROCK_USER_CONTEXT_ISSUER,\n audiences: [ROBOTROCK_USER_CONTEXT_AUDIENCE],\n secret,\n });\n if (!result.ok) {\n return null;\n }\n\n const email = readStringAttribute(result.sessionAuth.attributes, \"email\");\n const name = readStringAttribute(result.sessionAuth.attributes, \"name\");\n const tenantSlug = readStringAttribute(\n result.sessionAuth.attributes,\n \"tenantSlug\"\n );\n const connectionId = readStringAttribute(\n result.sessionAuth.attributes,\n \"connectionId\"\n );\n const role = parseTenantRole(\n readStringAttribute(result.sessionAuth.attributes, \"role\")\n );\n const groups = readStringArrayAttribute(result.sessionAuth.attributes, \"groups\");\n const subject = result.sessionAuth.subject;\n if (!email || !tenantSlug || !subject || !role) {\n return null;\n }\n\n const workosUserId = readStringAttribute(\n result.sessionAuth.attributes,\n \"workosUserId\"\n );\n const chatId = readStringAttribute(result.sessionAuth.attributes, \"chatId\");\n\n return mapVerifiedClaimsToSessionAuth({\n sub: subject,\n email,\n name: name ?? email.split(\"@\")[0] ?? email,\n tenantSlug,\n connectionId,\n chatId,\n role,\n groups,\n workosUserId,\n });\n };\n}\n\n/**\n * Bearer `ras_*` service token for RobotRock platform reachability probes\n * (`GET /eve/v1/info` during verify and tenant connect).\n */\nexport function robotrockAgentServiceAuth(): AuthFn<Request> {\n return async (request) => {\n const expected = process.env.ROBOTROCK_AGENT_SERVICE_TOKEN?.trim();\n if (!expected) {\n return null;\n }\n\n const bearer = extractBearerToken(request.headers.get(\"authorization\"));\n if (!bearer || bearer !== expected) {\n return null;\n }\n\n return {\n authenticator: \"robotrock-agent-service\",\n principalId: \"robotrock:platform\",\n principalType: \"runtime\",\n attributes: {},\n };\n };\n}\n\n/**\n * Bearer token for RobotRock platform reachability and dashboard proxy calls.\n *\n * When a workspace admin connects a protected single-tenant deployment, they\n * enter a Bearer token in **Settings → Agents**. RobotRock stores it in\n * WorkOS Vault and sends `Authorization: Bearer <token>` on:\n *\n * - `GET /eve/v1/info` and `GET /eve/v1/health` (connect / re-sync)\n * - `POST /eve/v1/session` and `POST /eve/v1/session/:sessionId` (chat + resume)\n * - `GET /eve/v1/session/:sessionId/stream` (chat streaming)\n * - optional icon paths (`/favicon.ico`, `/icon.svg`, `/icon.png`)\n *\n * Set `EVE_SELF_AUTH_TOKEN` on the agent to the same value. Use\n * `robotrockEveChannel()` so this authenticator is registered on the Eve channel.\n */\nexport function eveSelfServiceAuth(): AuthFn<Request> {\n return async (request) => {\n const expected = process.env.EVE_SELF_AUTH_TOKEN?.trim();\n if (!expected) {\n return null;\n }\n\n const bearer = extractBearerToken(request.headers.get(\"authorization\"));\n if (bearer !== expected) {\n return null;\n }\n\n return {\n authenticator: \"eve-self\",\n principalId: \"eve:runtime\",\n principalType: \"runtime\",\n attributes: {},\n };\n };\n}\n","import { ROBOTROCK_PLATFORM_USER_CONTEXT_PUBLIC_KEY_URL } from \"./constants.js\";\n\nlet cachedPublicKeyPem: string | null | undefined;\n\n/** Resolve the platform RS256 public key used to verify dashboard user-context JWTs. */\nexport async function resolvePlatformUserContextPublicKeyPem(): Promise<\n string | null\n> {\n const envOverride = process.env.ROBOTROCK_USER_CONTEXT_PUBLIC_KEY?.trim();\n if (envOverride) {\n return envOverride;\n }\n\n if (cachedPublicKeyPem !== undefined) {\n return cachedPublicKeyPem;\n }\n\n try {\n const response = await fetch(ROBOTROCK_PLATFORM_USER_CONTEXT_PUBLIC_KEY_URL, {\n headers: { Accept: \"text/plain\" },\n });\n if (!response.ok) {\n cachedPublicKeyPem = null;\n return null;\n }\n const pem = (await response.text()).trim();\n cachedPublicKeyPem = pem.length > 0 ? pem : null;\n return cachedPublicKeyPem;\n } catch {\n cachedPublicKeyPem = null;\n return null;\n }\n}\n\n/** Reset cached platform public key (tests only). */\nexport function resetPlatformUserContextPublicKeyCache(): void {\n cachedPublicKeyPem = undefined;\n}\n","/**\n * Eve HTTP routes RobotRock reaches when connecting, re-syncing, or proxying\n * dashboard chat. Use these paths when smoke-testing a protected deployment.\n *\n * Self-hosted agents that require deployment access: set `EVE_SELF_AUTH_TOKEN` on\n * the agent to the same value the workspace admin enters under **Settings →\n * Agents → Deployment access → Bearer token**. RobotRock stores that token in\n * WorkOS Vault and sends it as `Authorization: Bearer <token>` on every call\n * below (plus `X-RobotRock-User-Token` during inbox chat).\n */\n\n/** Routes RobotRock calls directly from the dashboard backend (connect / re-sync). */\nexport const ROBOTROCK_EVE_CONNECT_ROUTES = {\n /** Agent manifest + `robotrock-ready` hook detection. */\n info: { method: \"GET\", path: \"/eve/v1/info\" },\n /** Optional health probe (same auth as `/info` when the channel is protected). */\n health: { method: \"GET\", path: \"/eve/v1/health\" },\n} as const;\n\n/** Static assets RobotRock may HEAD/GET for the agent avatar in Settings. */\nexport const ROBOTROCK_EVE_ICON_PATHS = [\n \"/favicon.ico\",\n \"/icon.svg\",\n \"/icon.png\",\n] as const;\n\n/**\n * Routes proxied through `/{tenant}/api/eve/{connectionId}/…` during inbox chat\n * and task-handled resume. The Eve client issues these against the proxy host;\n * the proxy forwards them to the deployment with vault credentials attached.\n */\nexport const ROBOTROCK_EVE_CHAT_ROUTES = {\n createSession: { method: \"POST\", path: \"/eve/v1/session\" },\n continueSession: {\n method: \"POST\",\n path: \"/eve/v1/session/:sessionId\",\n },\n messageStream: {\n method: \"GET\",\n path: \"/eve/v1/session/:sessionId/stream\",\n },\n} as const;\n\n/** Env var on the Eve agent that must match the dashboard Bearer token. */\nexport const EVE_SELF_AUTH_TOKEN_ENV_VAR = \"EVE_SELF_AUTH_TOKEN\";\n\n/** All Eve route paths that should accept the dashboard Bearer token on protected deployments. */\nexport const ROBOTROCK_EVE_BEARER_PROTECTED_PATHS = [\n ROBOTROCK_EVE_CONNECT_ROUTES.info.path,\n ROBOTROCK_EVE_CONNECT_ROUTES.health.path,\n ROBOTROCK_EVE_CHAT_ROUTES.createSession.path,\n ROBOTROCK_EVE_CHAT_ROUTES.continueSession.path,\n ROBOTROCK_EVE_CHAT_ROUTES.messageStream.path,\n ...ROBOTROCK_EVE_ICON_PATHS,\n] as const;\n","import type { AuthFn } from \"eve/channels/auth\";\nimport { eveChannel } from \"eve/channels/eve\";\nimport { localDev, vercelOidc } from \"eve/channels/auth\";\nimport {\n eveSelfServiceAuth,\n robotrockAgentServiceAuth,\n robotrockUserContextAuth,\n type RobotrockUserContextAuthOptions,\n} from \"./auth.js\";\n\nexport type RobotrockEveChannelOptions = {\n /** Your existing webapp auth — stacked after RobotRock user-context auth. */\n auth?: AuthFn<Request>[];\n /** Include RobotRock user-context + service auth. @default true */\n robotrock?: boolean;\n /** Include localDev() fallback. @default true when NODE_ENV !== \"production\" */\n localDev?: boolean;\n /** Optional Vercel OIDC allowlist (dashboard ↔ agent on Vercel). */\n vercelOidc?: Parameters<typeof vercelOidc>[0] | false;\n /** Options passed to robotrockUserContextAuth when robotrock is enabled. */\n userContextAuth?: RobotrockUserContextAuthOptions;\n};\n\nfunction shouldEnableLocalDev(explicit?: boolean): boolean {\n if (explicit !== undefined) {\n return explicit;\n }\n return process.env.NODE_ENV !== \"production\";\n}\n\n/**\n * Compose the default Eve HTTP channel with RobotRock dashboard auth stacked\n * alongside optional existing webapp authenticators.\n */\nexport function robotrockEveChannel(options?: RobotrockEveChannelOptions) {\n const auth: AuthFn<Request>[] = [];\n const includeRobotrock = options?.robotrock !== false;\n\n if (includeRobotrock) {\n auth.push(robotrockUserContextAuth(options?.userContextAuth));\n }\n\n if (options?.auth?.length) {\n auth.push(...options.auth);\n }\n\n if (includeRobotrock) {\n auth.push(robotrockAgentServiceAuth());\n auth.push(eveSelfServiceAuth());\n }\n\n if (options?.vercelOidc !== false) {\n auth.push(vercelOidc(options?.vercelOidc ?? undefined));\n }\n\n if (shouldEnableLocalDev(options?.localDev)) {\n auth.push(localDev());\n }\n\n return eveChannel({ auth });\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 { 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/** Max tags per uploaded agent file. */\nexport const AGENT_FILE_TAGS_MAX = 20;\n/** Max characters per tag after trim. */\nexport const AGENT_FILE_TAG_MAX_LENGTH = 64;\n\n/** Normalize agent file tags: trim, lowercase, dedupe, drop empties. */\nexport function normalizeAgentFileTags(\n tags: readonly string[] | undefined\n): string[] | undefined {\n if (!tags?.length) return undefined;\n const seen = new Set<string>();\n const out: string[] = [];\n for (const raw of tags) {\n const tag = raw.trim().toLowerCase().slice(0, AGENT_FILE_TAG_MAX_LENGTH);\n if (!tag || seen.has(tag)) continue;\n seen.add(tag);\n out.push(tag);\n if (out.length >= AGENT_FILE_TAGS_MAX) break;\n }\n return out.length > 0 ? out : undefined;\n}\n\n/** POST /v1/agent-chats/images body: upload a generated image into Convex storage. */\nexport const agentChatUploadImageBodySchema = z\n .object({\n mediaType: z.string().min(1),\n /** Raw base64 (no data: URL prefix). */\n base64: z.string().min(1),\n chatId: z.string().min(1).optional(),\n publicTaskId: z.string().min(1).optional(),\n source: z.string().min(1).optional(),\n /** Display / search name (e.g. `sunset-robot.png`). */\n filename: z.string().min(1).max(255).optional(),\n /** Human-readable description (e.g. generation prompt). */\n description: z.string().min(1).max(2000).optional(),\n /**\n * Optional labels for later grouping/filtering.\n * Normalized to lowercase trimmed unique strings (max 20, 64 chars each).\n */\n tags: z\n .array(z.string().min(1).max(AGENT_FILE_TAG_MAX_LENGTH))\n .max(AGENT_FILE_TAGS_MAX)\n .optional()\n .transform((tags) => normalizeAgentFileTags(tags)),\n })\n .refine((data) => Boolean(data.chatId || data.publicTaskId), {\n message: \"Provide chatId and/or publicTaskId\",\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 AgentChatUploadImageBody = z.output<\n typeof agentChatUploadImageBodySchema\n>;\nexport type AgentChatUploadImageBodyInput = z.input<\n typeof agentChatUploadImageBodySchema\n>;\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","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 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 profilePictureUrl: z.string().nullable().optional(),\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 const agentAdminPlanLimitsSchema = z.object({\n tasksPerDay: z.number(),\n members: z.number(),\n apiKeys: z.number(),\n groups: z.number(),\n auditLogRetention: z.number(),\n rateLimitPerSecond: z.number(),\n taskRetentionDays: z.number(),\n});\n\n/** Workspace plan/seat/task usage for tenant-admin agents (no Stripe ids). */\nexport const agentAdminUsageSchema = z.object({\n workspace: z.string(),\n planName: z.string(),\n planType: z.string(),\n trialState: z.enum([\"none\", \"active\", \"expired\"]),\n daysRemaining: z.number().nullable(),\n isPaidPro: z.boolean(),\n subscriptionStatus: z.string().nullable(),\n tasksToday: z.number(),\n maxTasksPerDay: z.number().nullable(),\n tasksResetAt: z.number(),\n openTasks: z.number(),\n totalTasks: z.number(),\n seatsCurrent: z.number(),\n seatsMax: z.number().nullable(),\n groupsCurrent: z.number(),\n groupsMax: z.number().nullable(),\n apiKeysCurrent: z.number(),\n apiKeysMax: z.number().nullable(),\n rateLimitPerSecond: z.number(),\n limits: agentAdminPlanLimitsSchema,\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>;\nexport type AgentAdminUsage = z.infer<typeof agentAdminUsageSchema>;\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","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 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 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 actingUserId?: 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 {\n kind: \"apiKey\",\n apiKey,\n ...(overrides?.actingUserId?.trim()\n ? { actingUserId: overrides.actingUserId.trim() }\n : {}),\n };\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 agentChatUploadImageBodySchema,\n createAgentChatBodySchema,\n type AgentChatAuditInputBody,\n type AgentChatAuditToolBody,\n type AgentChatLinkTaskBody,\n type AgentChatSeedMessage,\n type AgentChatStageHitlBody,\n type AgentChatUploadImageBody,\n type AgentChatUploadImageBodyInput,\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 UploadChatImageInput = AgentChatUploadImageBodyInput;\n\nexport type UploadedChatImage = {\n storageId: string;\n url: string;\n mediaType: string;\n chatId?: string;\n publicTaskId?: string;\n filename?: string;\n description?: string;\n tags?: string[];\n};\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 * Upload an image into Convex storage linked to a chat and/or task.\n * Prefer this over embedding base64 in tool results / chat transcripts.\n */\n uploadImage(input: UploadChatImageInput): Promise<UploadedChatImage>;\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 async uploadImage(input: UploadChatImageInput): Promise<UploadedChatImage> {\n const validation = agentChatUploadImageBodySchema.safeParse(input);\n if (!validation.success) {\n throw new RobotRockError(\n `Invalid image upload: ${validation.error.issues[0]?.message}`,\n 400,\n validation.error.issues\n );\n }\n\n const response = await fetch(`${config.baseUrl}/agent-chats/images`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(validation.data satisfies AgentChatUploadImageBody),\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, \"Failed to upload chat image\"),\n response.status,\n data\n );\n }\n\n const uploaded = data as Partial<UploadedChatImage>;\n if (\n typeof uploaded.storageId !== \"string\" ||\n typeof uploaded.url !== \"string\" ||\n typeof uploaded.mediaType !== \"string\"\n ) {\n throw new RobotRockError(\n \"Image upload returned an invalid response\",\n 500,\n data\n );\n }\n\n return {\n storageId: uploaded.storageId,\n url: uploaded.url,\n mediaType: uploaded.mediaType,\n ...(typeof uploaded.chatId === \"string\"\n ? { chatId: uploaded.chatId }\n : {}),\n ...(typeof uploaded.publicTaskId === \"string\"\n ? { publicTaskId: uploaded.publicTaskId }\n : {}),\n ...(typeof uploaded.filename === \"string\"\n ? { filename: uploaded.filename }\n : {}),\n ...(typeof uploaded.description === \"string\"\n ? { description: uploaded.description }\n : {}),\n ...(Array.isArray(uploaded.tags)\n ? {\n tags: uploaded.tags.filter(\n (tag): tag is string => typeof tag === \"string\"\n ),\n }\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 /** Acting dashboard user id (required for user-scoped agent APIs like image upload). */\n actingUserId?: 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 ...(config.actingUserId ? { actingUserId: config.actingUserId } : {}),\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 {\n createClient,\n type RobotRock,\n} from \"../../client.js\";\nimport type { SessionContext } from \"eve/context\";\nimport {\n resolveChatCorrelationFromEnv,\n type ChatCorrelation,\n} from \"../../chat-correlation.js\";\nimport { tryResolveTenantCaller } from \"./tenant.js\";\n\nlet warnedMissingAuth = false;\n\nfunction resolveBoundChatCorrelation(ctx: SessionContext): ChatCorrelation {\n const caller = tryResolveTenantCaller(ctx);\n return {\n eveSessionId: ctx.session.id,\n ...(caller?.chatId ? { chatId: caller.chatId } : {}),\n ...resolveChatCorrelationFromEnv(),\n };\n}\n\n/** Create a RobotRock client bound to the current Eve session tenant context. */\nexport function tryCreateBoundRobotRockClient(\n ctx: SessionContext\n): RobotRock | null {\n const caller = tryResolveTenantCaller(ctx);\n const serviceToken = process.env.ROBOTROCK_AGENT_SERVICE_TOKEN?.trim();\n const chatCorrelation = resolveBoundChatCorrelation(ctx);\n\n if (caller?.connectionId && serviceToken) {\n return createClient({\n baseUrl: process.env.ROBOTROCK_BASE_URL?.trim(),\n chatCorrelation,\n agentService: {\n token: serviceToken,\n tenantSlug: caller.tenantSlug,\n connectionId: caller.connectionId,\n actingUserId: caller.userId,\n },\n });\n }\n\n const apiKey = process.env.ROBOTROCK_API_KEY?.trim();\n if (apiKey) {\n return createClient({\n apiKey,\n ...(caller?.userId ? { actingUserId: caller.userId } : {}),\n baseUrl: process.env.ROBOTROCK_BASE_URL?.trim(),\n chatCorrelation,\n });\n }\n\n if (!warnedMissingAuth) {\n warnedMissingAuth = true;\n console.warn(\n \"robotrock: set ROBOTROCK_AGENT_SERVICE_TOKEN for hosted multi-tenant auth, \" +\n \"or ROBOTROCK_API_KEY for single-tenant deployments.\"\n );\n }\n\n return null;\n}\n\n/** Reset missing-auth warning (tests only). */\nexport function resetBoundClientAuthWarning(): void {\n warnedMissingAuth = false;\n}\n","import type { StagedChatHitlRequest } from \"../../chats.js\";\nimport { RobotRockError } from \"../../http.js\";\nimport type { SessionContext } from \"eve/context\";\nimport { tryCreateBoundRobotRockClient } from \"./client-from-session.js\";\n\nlet warnedMissingAuth = false;\nlet warnedConnectionRefused = false;\n\nfunction isConnectionRefused(error: unknown): boolean {\n const inspect = (value: unknown): boolean => {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n if (\"code\" in value && value.code === \"ECONNREFUSED\") {\n return true;\n }\n if (\"cause\" in value) {\n return inspect(value.cause);\n }\n if (\"errors\" in value && Array.isArray(value.errors)) {\n return value.errors.some((entry) => inspect(entry));\n }\n return false;\n };\n\n return inspect(error);\n}\n\nfunction logAuditFailure(label: string, error: unknown): void {\n if (isConnectionRefused(error)) {\n if (!warnedConnectionRefused) {\n warnedConnectionRefused = true;\n console.warn(\n \"robotrock-chat-audit: RobotRock API is not reachable (connection refused). \" +\n \"Audit and task-link calls are skipped until the API is up.\"\n );\n }\n return;\n }\n\n const hint =\n error instanceof RobotRockError && error.statusCode === 405\n ? \" — set ROBOTROCK_BASE_URL=http://localhost:4001/v1 and run the local API\"\n : \"\";\n console.warn(`robotrock-chat-audit: failed to ${label}${hint}`, error);\n}\n\nexport type RobotRockChatAuditPayload = {\n eveSessionId: string;\n userId: string;\n actionId: string;\n actionTitle?: string;\n prompt?: string;\n data?: Record<string, unknown>;\n idempotencyKey?: string;\n requestId?: string;\n toolCallId?: string;\n};\n\nexport type RobotRockChatToolAuditPayload = {\n eveSessionId: string;\n userId: string;\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n success: boolean;\n status: \"completed\" | \"failed\" | \"rejected\";\n error?: string;\n idempotencyKey?: string;\n};\n\n/** Observe-only tool audit POST — never throws. */\nexport async function postRobotRockChatToolAudit(\n ctx: SessionContext,\n payload: RobotRockChatToolAuditPayload\n): Promise<void> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n if (!warnedMissingAuth) {\n warnedMissingAuth = true;\n console.warn(\n \"robotrock-chat-audit: RobotRock auth is unset; skipping tool audit logging.\"\n );\n }\n return;\n }\n\n try {\n await client.chats.logToolExecution(payload);\n } catch (error) {\n logAuditFailure(\"log tool execution\", error);\n }\n}\n\n/** Observe-only audit POST — never throws. */\nexport async function postRobotRockChatInputAudit(\n ctx: SessionContext,\n payload: RobotRockChatAuditPayload\n): Promise<void> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n if (!warnedMissingAuth) {\n warnedMissingAuth = true;\n console.warn(\n \"robotrock-chat-audit: RobotRock auth is unset; skipping HITL audit logging.\"\n );\n }\n return;\n }\n\n try {\n await client.chats.logInputSubmission(payload);\n } catch (error) {\n logAuditFailure(\"log input submission\", error);\n }\n}\n\n/** Persist pending HITL requests across Eve durable waits — never throws. */\nexport async function postRobotRockStageHitl(\n ctx: SessionContext,\n input: {\n eveSessionId: string;\n requests: StagedChatHitlRequest[];\n }\n): Promise<void> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n return;\n }\n\n if (input.requests.length === 0) {\n return;\n }\n\n try {\n await client.chats.stageHitlRequests(input);\n } catch (error) {\n logAuditFailure(\"stage HITL requests\", error);\n }\n}\n\n/** Load staged HITL requests from Convex — returns [] on failure. */\nexport async function fetchRobotRockStagedHitl(\n ctx: SessionContext,\n eveSessionId: string\n): Promise<StagedChatHitlRequest[]> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n return [];\n }\n\n try {\n return await client.chats.getStagedHitlRequests(eveSessionId);\n } catch (error) {\n logAuditFailure(\"fetch staged HITL requests\", error);\n return [];\n }\n}\n\n/** Register an inbox task with its originating Eve chat session — never throws. */\nexport async function postRobotRockLinkChatTask(\n ctx: SessionContext,\n input: {\n eveSessionId: string;\n publicTaskId: string;\n toolCallId: string;\n }\n): Promise<void> {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n if (!warnedMissingAuth) {\n warnedMissingAuth = true;\n console.warn(\n \"robotrock-task-link: RobotRock auth is unset; skipping chat task link.\"\n );\n }\n return;\n }\n\n try {\n await client.chats.linkTask(input);\n } catch (error) {\n logAuditFailure(\"link task to chat\", error);\n }\n}\n\n/** Reset audit warning flags (tests only). */\nexport function resetChatAuditWarnings(): void {\n warnedMissingAuth = false;\n warnedConnectionRefused = false;\n}\n","import {\n attachWebhookToActions,\n RobotRockError,\n type RobotRock,\n type SendToHumanActionInput,\n type SendToHumanInput,\n} from \"../../client.js\";\nimport type { TaskPriority } from \"../../schemas/index.js\";\nimport type { SessionContext } from \"eve/context\";\nimport { tryCreateBoundRobotRockClient } from \"./client-from-session.js\";\nimport { tryResolveTenantCaller } from \"./tenant.js\";\n\nexport type CreateRobotRockTaskInput = SendToHumanInput<\n readonly SendToHumanActionInput[]\n> & {\n app?: string;\n};\n\nfunction resolveTaskApp(app?: string): string {\n return app?.trim() || process.env.ROBOTROCK_APP?.trim() || \"robotrock-agent\";\n}\n\nfunction resolveWebhookBaseUrl(baseUrl?: string): string {\n return (\n baseUrl?.trim() ||\n process.env.ROBOTROCK_BASE_URL?.trim() ||\n \"http://localhost:4001/v1\"\n );\n}\n\n/** Resolve the webhook URL RobotRock calls when a delegated inbox task is handled. */\nexport function resolveTaskHandledWebhookUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n const withV1 = trimmed.endsWith(\"/v1\") ? trimmed : `${trimmed}/v1`;\n return `${withV1}/agent-chats/task-handled`;\n}\n\nfunction requireBoundClient(ctx: SessionContext): RobotRock {\n const client = tryCreateBoundRobotRockClient(ctx);\n if (!client) {\n throw new Error(\n \"RobotRock auth is unset. Configure ROBOTROCK_AGENT_SERVICE_TOKEN for hosted agents or ROBOTROCK_API_KEY for self-hosted deployments.\"\n );\n }\n return client;\n}\n\n/** Create an inbox task via POST /v1 without waiting for a human response. */\nexport async function createRobotRockTask(\n input: CreateRobotRockTaskInput,\n ctx: SessionContext\n) {\n const client = requireBoundClient(ctx);\n const { app, ...taskInput } = input;\n const resolvedApp = resolveTaskApp(app);\n\n const webhookUrl = resolveTaskHandledWebhookUrl(\n resolveWebhookBaseUrl(process.env.ROBOTROCK_BASE_URL)\n );\n\n try {\n const task = await client.tasks.create({\n ...taskInput,\n app: resolvedApp,\n actions: attachWebhookToActions(taskInput.actions, {\n url: webhookUrl,\n headers: {},\n }),\n });\n return {\n taskId: task.taskId,\n threadId: task.threadId,\n status: task.status,\n validUntil: task.validUntil,\n submittedAt: task.submittedAt,\n };\n } catch (error) {\n const caller = tryResolveTenantCaller(ctx);\n if (error instanceof RobotRockError) {\n const response =\n error.response && typeof error.response === \"object\"\n ? (error.response as Record<string, unknown>)\n : undefined;\n console.error(\"[create_robotrock_task] API request failed\", {\n status: error.statusCode,\n message: error.message,\n code: response?.code,\n hint: response?.hint,\n tenantSlug: caller?.tenantSlug,\n connectionId: caller?.connectionId,\n baseUrl: process.env.ROBOTROCK_BASE_URL?.trim() || null,\n });\n } else {\n console.error(\"[create_robotrock_task] unexpected error\", error);\n }\n throw error;\n }\n}\n\nexport type RobotRockTaskActionInput = {\n id: string;\n title: string;\n description?: string;\n};\n\nexport type RobotRockTaskAssignToInput = {\n users?: string[];\n groups?: string[];\n};\n\nexport type RobotRockTaskContextInput = {\n data?: Record<string, unknown>;\n ui?: Record<string, unknown>;\n};\n\nexport type RobotRockTaskToolInput = {\n type: string;\n name: string;\n description?: string;\n actions: RobotRockTaskActionInput[];\n assignTo?: RobotRockTaskAssignToInput;\n context?: RobotRockTaskContextInput;\n validUntilHours?: number;\n priority?: TaskPriority;\n updateMessage?: string;\n app?: string;\n};\n\nexport function buildRobotRockTaskPayload(\n input: RobotRockTaskToolInput,\n options?: { requestedByEmail?: string }\n): CreateRobotRockTaskInput {\n const contextData: Record<string, unknown> = {\n ...(input.context?.data ?? {}),\n };\n\n if (options?.requestedByEmail) {\n contextData.requestedBy = options.requestedByEmail;\n }\n\n const hasContext =\n Object.keys(contextData).length > 0 ||\n (input.context?.ui && Object.keys(input.context.ui).length > 0);\n\n const payload: CreateRobotRockTaskInput = {\n type: input.type,\n name: input.name,\n ...(input.description ? { description: input.description } : {}),\n actions: input.actions.map((action) => ({\n id: action.id,\n title: action.title,\n ...(action.description ? { description: action.description } : {}),\n })),\n ...(input.assignTo ? { assignTo: input.assignTo } : {}),\n ...(input.priority ? { priority: input.priority } : {}),\n ...(input.app ? { app: input.app } : {}),\n ...(input.validUntilHours\n ? {\n validUntil: new Date(Date.now() + input.validUntilHours * 60 * 60 * 1000),\n }\n : {}),\n ...(input.updateMessage\n ? {\n update: {\n message: input.updateMessage,\n status: \"waiting\" as const,\n },\n }\n : {}),\n };\n\n if (hasContext) {\n payload.context = {\n data: contextData,\n ...(input.context?.ui ? { ui: input.context.ui } : {}),\n };\n }\n\n return payload;\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 { createClient } from \"../../client.js\";\nimport type { CreateChatResult } from \"../../chats.js\";\nimport { resolveRobotRockConfig } from \"../../env.js\";\n\nexport type CreateRobotRockCronChatInput = {\n title: string;\n messages: { role: \"user\" | \"assistant\"; text: string }[];\n agentIdentifier?: string;\n ownerEmail: string;\n};\n\nfunction resolveCronAgentIdentifier(agentIdentifier?: string): string {\n return (\n agentIdentifier?.trim() ||\n process.env.ROBOTROCK_CRON_AGENT_IDENTIFIER?.trim() ||\n \"robotrock-agent\"\n );\n}\n\n/** Create an inbox chat from an Eve schedule via the RobotRock API. */\nexport async function createRobotRockCronChat(\n input: CreateRobotRockCronChatInput\n): Promise<CreateChatResult> {\n const apiKey = process.env.ROBOTROCK_API_KEY?.trim();\n if (!apiKey) {\n throw new Error(\"ROBOTROCK_API_KEY is unset\");\n }\n\n const client = createClient(resolveRobotRockConfig({ apiKey }));\n return client.chats.create({\n agentIdentifier: resolveCronAgentIdentifier(input.agentIdentifier),\n title: input.title,\n messages: input.messages,\n source: \"cron\",\n ownerEmail: input.ownerEmail,\n });\n}\n","import { defineHook } from \"eve/hooks\";\n\n/**\n * Marker hook for RobotRock dashboard auto-detection.\n *\n * RobotRock reads `GET /eve/v1/info` on connect and treats deployments with a\n * hook slug `robotrock-ready` as RobotRock-ready.\n */\nexport const robotrockReadyHook = defineHook({});\n\n/** Alias for agents that prefer a factory name. */\nexport function defineRobotRockReadyHook() {\n return defineHook({});\n}\n","import { defineHook } from \"eve/hooks\";\nimport type { HookContext, HookDefinition } from \"eve/hooks\";\nimport type { StagedChatHitlRequest } from \"../../../chats.js\";\nimport {\n buildEveInputAuditSubmissionData,\n eveInputResponseToActionSubmission,\n isEveApprovalInputRequest,\n parseEveAskQuestionToolOutput,\n resolveEveFreeformTextToInputResponse,\n} from \"../../input-audit.js\";\nimport type { EveInputRequest, EveInputRequestDisplay } from \"../../input-request.js\";\nimport {\n fetchRobotRockStagedHitl,\n postRobotRockChatInputAudit,\n postRobotRockStageHitl,\n} from \"../chat-audit-api.js\";\nimport { tryResolveTenantCaller } from \"../tenant.js\";\n\ntype PendingInputRequest = StagedChatHitlRequest;\n\nconst loggedIdempotencyKeys = new Set<string>();\n\nfunction toEveInputRequest(request: PendingInputRequest): EveInputRequest {\n return {\n requestId: request.requestId,\n prompt: request.prompt,\n ...(request.display ? { display: request.display } : {}),\n ...(request.allowFreeform !== undefined\n ? { allowFreeform: request.allowFreeform }\n : {}),\n ...(request.options ? { options: request.options } : {}),\n };\n}\n\nasync function logPendingInputResponse(\n ctx: HookContext,\n pending: PendingInputRequest,\n response: { requestId: string; optionId?: string; text?: string }\n): Promise<void> {\n const caller = tryResolveTenantCaller(ctx);\n if (!caller) {\n return;\n }\n\n const idempotencyKey = `${ctx.session.id}:${pending.requestId}`;\n if (loggedIdempotencyKeys.has(idempotencyKey)) {\n return;\n }\n\n const eveRequest = toEveInputRequest(pending);\n const submission = eveInputResponseToActionSubmission(eveRequest, response, {\n toolName: pending.toolName,\n });\n\n const toolInput =\n pending.display === \"confirmation\" ? pending.toolInput : undefined;\n\n await postRobotRockChatInputAudit(ctx, {\n eveSessionId: ctx.session.id,\n userId: caller.userId,\n actionId: submission.actionId,\n actionTitle: submission.actionTitle,\n prompt: pending.prompt,\n requestId: pending.requestId,\n toolCallId: pending.toolCallId,\n data: buildEveInputAuditSubmissionData(\n {\n toolCallId: pending.toolCallId,\n toolName: pending.toolName,\n requestId: pending.requestId,\n display: pending.display as EveInputRequestDisplay | undefined,\n toolInput,\n },\n submission.formData\n ),\n idempotencyKey,\n });\n\n loggedIdempotencyKeys.add(idempotencyKey);\n}\n\n/** Reset logged idempotency keys (tests only). */\nexport function resetRobotrockChatAuditIdempotencyKeys(): void {\n loggedIdempotencyKeys.clear();\n}\n\nexport const robotrockChatAuditHook: HookDefinition = defineHook({\n events: {\n async \"input.requested\"(event, ctx) {\n const requests: StagedChatHitlRequest[] = [];\n\n for (const request of event.data.requests) {\n if (request.action.kind !== \"tool-call\") {\n continue;\n }\n\n requests.push({\n requestId: request.requestId,\n prompt: request.prompt,\n toolName: request.action.toolName,\n toolCallId: request.action.callId,\n ...(request.display ? { display: request.display } : {}),\n ...(request.allowFreeform !== undefined\n ? { allowFreeform: request.allowFreeform }\n : {}),\n ...(request.options ? { options: request.options } : {}),\n ...(request.action.input !== undefined\n ? {\n toolInput:\n request.action.input != null &&\n typeof request.action.input === \"object\" &&\n !Array.isArray(request.action.input)\n ? (request.action.input as Record<string, unknown>)\n : undefined,\n }\n : {}),\n });\n }\n\n await postRobotRockStageHitl(ctx, {\n eveSessionId: ctx.session.id,\n requests,\n });\n },\n\n async \"message.received\"(event, ctx) {\n const message = event.data.message?.trim();\n if (!message) {\n return;\n }\n\n const staged = await fetchRobotRockStagedHitl(ctx, ctx.session.id);\n for (const pending of staged) {\n const response = resolveEveFreeformTextToInputResponse(\n toEveInputRequest(pending),\n message\n );\n if (!response) {\n continue;\n }\n await logPendingInputResponse(ctx, pending, response);\n }\n },\n\n async \"action.result\"(event, ctx) {\n const result = event.data.result;\n if (result.kind !== \"tool-result\") {\n return;\n }\n\n const staged = await fetchRobotRockStagedHitl(ctx, ctx.session.id);\n const pending = staged.find((entry) => entry.toolCallId === result.callId);\n if (!pending) {\n return;\n }\n\n const idempotencyKey = `${ctx.session.id}:${pending.requestId}`;\n if (loggedIdempotencyKeys.has(idempotencyKey)) {\n return;\n }\n\n if (pending.toolName === \"ask_question\") {\n const parsed = parseEveAskQuestionToolOutput(result.output);\n if (parsed) {\n await logPendingInputResponse(ctx, pending, {\n requestId: pending.requestId,\n ...parsed,\n });\n }\n } else if (isEveApprovalInputRequest(toEveInputRequest(pending))) {\n if (event.data.status === \"rejected\") {\n await logPendingInputResponse(ctx, pending, {\n requestId: pending.requestId,\n optionId: \"deny\",\n });\n } else if (event.data.status === \"completed\") {\n await logPendingInputResponse(ctx, pending, {\n requestId: pending.requestId,\n optionId: \"approve\",\n });\n }\n }\n },\n },\n});\n\n/** Alias for agents that prefer a factory name. */\nexport function defineRobotRockChatAuditHook(): HookDefinition {\n return robotrockChatAuditHook;\n}\n","import { getRobotRockApiBaseUrl } from \"@robotrock/core\";\nimport type { SessionContext } from \"eve/context\";\nimport {\n buildRobotRockAuthHeaders,\n resolveRobotRockAuthConfig,\n type RobotRockAuthConfig,\n} from \"./auth-headers.js\";\nimport { RobotRockError, getErrorMessage, parseResponseBody } from \"./http.js\";\nimport { requireAdminCaller, requireTenantCaller, tryResolveTenantCaller } from \"./eve/agent/tenant.js\";\nimport {\n buildChatCorrelationHeaders,\n resolveChatCorrelationFromEnv,\n type ChatCorrelation,\n} from \"./chat-correlation.js\";\n\nexport type AgentAdminClientConfig = {\n baseUrl?: string;\n auth: RobotRockAuthConfig;\n chatCorrelation?: ChatCorrelation;\n};\n\nasync function agentAdminFetch<T>(\n config: AgentAdminClientConfig,\n path: string,\n init?: RequestInit\n): Promise<T> {\n const baseUrl = (config.baseUrl?.trim() || getRobotRockApiBaseUrl()).replace(\n /\\/+$/,\n \"\"\n );\n const url = `${baseUrl}/agent-admin${path}`;\n\n const response = await fetch(url, {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n ...buildRobotRockAuthHeaders(config.auth),\n ...buildChatCorrelationHeaders(config.chatCorrelation),\n ...(init?.headers ?? {}),\n },\n });\n\n const data = await parseResponseBody(response);\n if (!response.ok) {\n throw new RobotRockError(\n getErrorMessage(data, `Agent admin request failed (${response.status})`),\n response.status,\n data\n );\n }\n\n return data as T;\n}\n\nexport function createAgentAdminApi(config: AgentAdminClientConfig) {\n return {\n usage: {\n get: () => agentAdminFetch<{ usage: unknown }>(config, \"/usage\"),\n },\n members: {\n list: () =>\n agentAdminFetch<{ members: unknown[] }>(config, \"/members\"),\n get: (memberRef: string) =>\n agentAdminFetch<{ member: unknown }>(config, `/members/${encodeURIComponent(memberRef)}`),\n invite: (body: { email: string; role?: \"admin\" | \"member\" }) =>\n agentAdminFetch<Record<string, unknown>>(config, \"/members\", {\n method: \"POST\",\n body: JSON.stringify(body),\n }),\n updateRole: (memberRef: string, role: \"admin\" | \"member\") =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/members/${encodeURIComponent(memberRef)}/role`,\n {\n method: \"PATCH\",\n body: JSON.stringify({ role }),\n }\n ),\n remove: (memberId: string) =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/members/${encodeURIComponent(memberId)}`,\n {\n method: \"DELETE\",\n }\n ),\n },\n groups: {\n list: () => agentAdminFetch<{ groups: unknown[] }>(config, \"/groups\"),\n get: (groupId: string) =>\n agentAdminFetch<{ group: unknown }>(\n config,\n `/groups/${encodeURIComponent(groupId)}`\n ),\n create: (body: { name: string; description?: string }) =>\n agentAdminFetch<{ group: unknown }>(config, \"/groups\", {\n method: \"POST\",\n body: JSON.stringify(body),\n }),\n update: (\n groupId: string,\n body: { name?: string; description?: string }\n ) =>\n agentAdminFetch<{ group: unknown }>(\n config,\n `/groups/${encodeURIComponent(groupId)}`,\n {\n method: \"PATCH\",\n body: JSON.stringify(body),\n }\n ),\n delete: (groupId: string) =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/groups/${encodeURIComponent(groupId)}`,\n {\n method: \"DELETE\",\n }\n ),\n addMember: (groupRef: string, memberRef: string) =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/groups/${encodeURIComponent(groupRef)}/members`,\n {\n method: \"POST\",\n body: JSON.stringify({ userId: memberRef }),\n }\n ),\n removeMember: (groupRef: string, memberRef: string) =>\n agentAdminFetch<Record<string, unknown>>(\n config,\n `/groups/${encodeURIComponent(groupRef)}/members/${encodeURIComponent(memberRef)}`,\n { method: \"DELETE\" }\n ),\n },\n tasks: {\n list: (query?: Record<string, string | number | undefined>) => {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value !== undefined && value !== \"\") {\n params.set(key, String(value));\n }\n }\n const suffix = params.size > 0 ? `?${params.toString()}` : \"\";\n return agentAdminFetch<{ items: unknown[]; nextCursor: string | null }>(\n config,\n `/tasks${suffix}`\n );\n },\n search: (q: string, limit?: number) => {\n const params = new URLSearchParams({ q });\n if (limit !== undefined) {\n params.set(\"limit\", String(limit));\n }\n return agentAdminFetch<{ items: unknown[]; total: number }>(\n config,\n `/tasks/search?${params.toString()}`\n );\n },\n get: (taskId: string) =>\n agentAdminFetch<{ task: unknown }>(config, `/tasks/${taskId}`),\n assign: (body: {\n taskIds: string[];\n assignTo: { users?: string[]; groups?: string[] };\n }) =>\n agentAdminFetch<{\n results: Array<{\n taskId: string;\n success: boolean;\n message?: string;\n name?: string | null;\n description?: string | null;\n type?: string | null;\n }>;\n }>(config, \"/tasks/assign\", {\n method: \"POST\",\n body: JSON.stringify(body),\n }),\n },\n };\n}\n\nexport type AgentAdminApi = ReturnType<typeof createAgentAdminApi>;\n\nfunction resolveBoundChatCorrelation(ctx: SessionContext): ChatCorrelation {\n const caller = tryResolveTenantCaller(ctx);\n return {\n eveSessionId: ctx.session.id,\n ...(caller?.chatId ? { chatId: caller.chatId } : {}),\n ...resolveChatCorrelationFromEnv(),\n };\n}\n\n/** Create an agent-admin API client bound to the current Eve session. */\nexport function createBoundAgentAdminClient(ctx: SessionContext): AgentAdminApi {\n const caller = requireTenantCaller(ctx);\n const baseUrl = process.env.ROBOTROCK_BASE_URL?.trim();\n const serviceToken = process.env.ROBOTROCK_AGENT_SERVICE_TOKEN?.trim();\n const chatCorrelation = resolveBoundChatCorrelation(ctx);\n\n if (caller.connectionId && serviceToken) {\n return createAgentAdminApi({\n baseUrl,\n chatCorrelation,\n auth: resolveRobotRockAuthConfig({\n agentService: {\n token: serviceToken,\n tenantSlug: caller.tenantSlug,\n connectionId: caller.connectionId,\n actingUserId: caller.userId,\n },\n }),\n });\n }\n\n const apiKey = process.env.ROBOTROCK_API_KEY?.trim();\n if (apiKey) {\n return createAgentAdminApi({\n baseUrl,\n chatCorrelation,\n auth: {\n kind: \"apiKey\",\n apiKey,\n actingUserId: caller.userId,\n },\n });\n }\n\n throw new Error(\n \"Agent admin auth is unset. Set ROBOTROCK_AGENT_SERVICE_TOKEN for hosted multi-tenant agents, \" +\n \"or ROBOTROCK_API_KEY for self-hosted and localhost deployments.\"\n );\n}\n\n/** Require tenant admin and return a bound agent-admin client. */\nexport function requireBoundAgentAdminClient(ctx: SessionContext): AgentAdminApi {\n requireAdminCaller(ctx);\n return createBoundAgentAdminClient(ctx);\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","handlerUrlSchema","z","jsonSchema7Schema","uiSchemaSchema","webhookHandlerSchema","triggerHandlerSchema","handlerSchema","taskActionInputSchema","taskActionSchema","uiFieldSchemaSchema","contextUiSchema","contextDataSchema","TASK_CONTEXT_FORMAT_VERSION","taskContextObjectBaseSchema","normalizeTaskContextVersion","taskContextObjectSchema","refineContextPublicUrls","taskContextSchema","assignToSchema","z","threadUpdateMessageSchema","threadUpdateStatuses","threadUpdateStatusSchema","threadUpdateInputSchema","z","threadUpdateMessageSchema","threadUpdateStatusSchema","taskPriorities","taskPrioritySchema","agentTelemetrySchema","z","createTaskBodySchema","taskContextObjectBaseSchema","assignToSchema","taskPrioritySchema","threadUpdateInputSchema","normalizeTaskContextVersion","refineContextPublicUrls","z","z","headers","TASK_CONTEXT_FORMAT_VERSION","createTaskBodySchema","warnedMissingAuth","warnedMissingAuth","defineHook","defineHook","resolveBoundChatCorrelation"]}
|