robotrock 1.1.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-admin.d.ts +82 -0
  3. package/dist/agent-admin.js +938 -0
  4. package/dist/agent-admin.js.map +1 -0
  5. package/dist/ai/index.d.ts +6 -5
  6. package/dist/ai/index.js +407 -188
  7. package/dist/ai/index.js.map +1 -1
  8. package/dist/ai/trigger.d.ts +4 -3
  9. package/dist/ai/trigger.js +407 -188
  10. package/dist/ai/trigger.js.map +1 -1
  11. package/dist/ai/workflow.d.ts +4 -3
  12. package/dist/ai/workflow.js +404 -185
  13. package/dist/ai/workflow.js.map +1 -1
  14. package/dist/auth-headers-qL-ZeEtd.d.ts +13 -0
  15. package/dist/{client-XTnFHGFE.d.ts → client-YO9Y1rkH.d.ts} +29 -17
  16. package/dist/eve/agent/index.d.ts +11 -35
  17. package/dist/eve/agent/index.js +678 -146
  18. package/dist/eve/agent/index.js.map +1 -1
  19. package/dist/eve/index.d.ts +5 -2
  20. package/dist/eve/index.js +195 -2
  21. package/dist/eve/index.js.map +1 -1
  22. package/dist/eve/tools/admin/assign-tasks.d.ts +39 -0
  23. package/dist/eve/tools/admin/assign-tasks.js +1060 -0
  24. package/dist/eve/tools/admin/assign-tasks.js.map +1 -0
  25. package/dist/eve/tools/admin/manage-groups.d.ts +53 -0
  26. package/dist/eve/tools/admin/manage-groups.js +1218 -0
  27. package/dist/eve/tools/admin/manage-groups.js.map +1 -0
  28. package/dist/eve/tools/admin/manage-team-members.d.ts +45 -0
  29. package/dist/eve/tools/admin/manage-team-members.js +1160 -0
  30. package/dist/eve/tools/admin/manage-team-members.js.map +1 -0
  31. package/dist/eve/tools/admin/query-tasks.d.ts +71 -0
  32. package/dist/eve/tools/admin/query-tasks.js +1161 -0
  33. package/dist/eve/tools/admin/query-tasks.js.map +1 -0
  34. package/dist/eve/tools/catalog/search-products.d.ts +57 -0
  35. package/dist/eve/tools/catalog/search-products.js +94 -0
  36. package/dist/eve/tools/catalog/search-products.js.map +1 -0
  37. package/dist/eve/tools/identity/index.d.ts +2 -0
  38. package/dist/eve/tools/identity/index.js +117 -27
  39. package/dist/eve/tools/identity/index.js.map +1 -1
  40. package/dist/eve/tools/identity/my-access.d.ts +6 -46
  41. package/dist/eve/tools/identity/my-access.js +91 -10
  42. package/dist/eve/tools/identity/my-access.js.map +1 -1
  43. package/dist/eve/tools/identity/whoami.d.ts +7 -8
  44. package/dist/eve/tools/identity/whoami.js +33 -17
  45. package/dist/eve/tools/identity/whoami.js.map +1 -1
  46. package/dist/eve/tools/inbox/create-task.d.ts +5 -4
  47. package/dist/eve/tools/inbox/create-task.js +365 -137
  48. package/dist/eve/tools/inbox/create-task.js.map +1 -1
  49. package/dist/eve/tools/inbox/index.d.ts +1 -0
  50. package/dist/eve/tools/inbox/index.js +365 -137
  51. package/dist/eve/tools/inbox/index.js.map +1 -1
  52. package/dist/eve/tools/index.d.ts +7 -0
  53. package/dist/eve/tools/index.js +1362 -168
  54. package/dist/eve/tools/index.js.map +1 -1
  55. package/dist/{index-BL9qKHA8.d.ts → index-DoQN48Bm.d.ts} +61 -2
  56. package/dist/index.d.ts +6 -3
  57. package/dist/index.js +325 -119
  58. package/dist/index.js.map +1 -1
  59. package/dist/schemas/index.d.ts +6 -1
  60. package/dist/schemas/index.js +177 -48
  61. package/dist/schemas/index.js.map +1 -1
  62. package/dist/{tool-approval-bridge-C4bTm8vu.d.ts → tool-approval-bridge-aMA79Z1B.d.ts} +1 -1
  63. package/dist/tool-reply-guidance-C3qrT1In.d.ts +25 -0
  64. package/dist/trigger/index.d.ts +2 -1
  65. package/dist/trigger/index.js +310 -108
  66. package/dist/trigger/index.js.map +1 -1
  67. package/dist/{trigger-Dn0DFiyU.d.ts → trigger-CXrbKVCL.d.ts} +2 -2
  68. package/dist/workflow/index.d.ts +2 -1
  69. package/dist/workflow/index.js +310 -108
  70. package/dist/workflow/index.js.map +1 -1
  71. package/package.json +30 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../core/src/schemas/task.ts","../../core/src/utils/safe-url.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/auth-headers.ts","../src/http.ts","../src/eve/agent/attributes.ts","../src/eve/agent/tenant.ts","../src/agent-admin.ts"],"sourcesContent":["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","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 { 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","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 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 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 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 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 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 { 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 } from \"./eve/agent/tenant.js\";\n\nexport type AgentAdminClientConfig = {\n baseUrl?: string;\n auth: RobotRockAuthConfig;\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 ...(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\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\n if (caller.connectionId && serviceToken) {\n return createAgentAdminApi({\n baseUrl,\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 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","headers"]}
@@ -1,12 +1,13 @@
1
- import { C as CloseChatToolDurableOptions, a as CloseChatToolOptions, c as closeChatToolInputSchema, b as CloseChatToolResult } from '../trigger-Dn0DFiyU.js';
2
- export { d as CLOSE_CHAT_TOOL_NAME, e as CloseChatToolInput, f as CreateRobotRockAiToolsOptions, R as RobotRockAiTools, g as approveByHumanTool, h as createRobotRockAiTools, i as createSendToHumanTool, j as createSendUpdateTool, r as reportStatusTool, k as requestActionInputTool } from '../trigger-Dn0DFiyU.js';
1
+ import { C as CloseChatToolDurableOptions, a as CloseChatToolOptions, c as closeChatToolInputSchema, b as CloseChatToolResult } from '../trigger-CXrbKVCL.js';
2
+ export { d as CLOSE_CHAT_TOOL_NAME, e as CloseChatToolInput, f as CreateRobotRockAiToolsOptions, R as RobotRockAiTools, g as approveByHumanTool, h as createRobotRockAiTools, i as createSendToHumanTool, j as createSendUpdateTool, r as reportStatusTool, k as requestActionInputTool } from '../trigger-CXrbKVCL.js';
3
3
  import { Tool } from 'ai';
4
4
  import { z } from 'zod';
5
- import { R as RobotRock, a as SendToHumanInput } from '../client-XTnFHGFE.js';
6
- import { u as RobotRockToolCallInfo, F as FormatToolApprovalTaskOptions, H as HumanToolResult } from '../tool-approval-bridge-C4bTm8vu.js';
7
- export { v as APPROVE_BY_HUMAN_ACTIONS, A as ApproveByHumanToolDurableOptions, a as ApproveByHumanToolOptions, i as CreateSendToHumanToolDurableOptions, C as CreateSendToHumanToolOptions, j as CreateSendUpdateToolDurableOptions, c as CreateSendUpdateToolOptions, w as REPORT_STATUS_TOOL_NAME, x as REQUEST_ACTION_INPUT_TOOL_NAME, y as ReportStatusPhase, z as ReportStatusToolInput, g as ReportStatusToolOptions, B as ReportStatusToolOutput, D as RequestActionInputToolInput, e as RequestActionInputToolOptions, E as RequestActionInputToolOutput, G as ResolveToolApprovalsOptions, k as RobotRockAiContext, l as RobotRockAiMode, m as RobotRockAiPollingContext, n as RobotRockAiTriggerContext, R as RobotRockAiWorkflowContext, I as RobotRockToolApprovalConfig, J as RobotRockToolApprovalDecision, K as RunWithRobotRockApprovalsOptions, L as SendUpdateToolResult, T as ToolApprovalRequestPart, o as applyRobotRockToolApprovalToTools, M as approveByHumanForAi, N as approveByHumanInputSchema, O as buildReportStatusToolDefinition, P as buildRequestActionInputToolDefinition, Q as closeChatForAi, U as collectApprovalRequests, V as createRobotRockAiTriggerContext, p as createRobotRockAiWorkflowContext, q as createRobotRockNeedsApproval, r as createRobotRockToolApproval, W as defaultRequestActionInputActionId, X as executeReportStatusTool, Y as isReportStatusToolPart, Z as isRequestActionInputToolPart, _ as normalizeReportStatusToolInput, $ as normalizeRequestActionInputToolInput, a0 as normalizeRobotRockAiContext, a1 as reportStatusPhaseSchema, a2 as reportStatusToolInputSchema, a3 as reportStatusToolOutputSchema, a4 as requestActionInputToolInputSchema, a5 as requestActionInputToolOutputSchema, s as resolveToolApprovalsViaRobotRock, t as runWithRobotRockApprovals, a6 as sendToHumanForAi, a7 as sendToHumanToolInputSchema, a8 as sendUpdateForAi, a9 as sendUpdateToolInputSchema } from '../tool-approval-bridge-C4bTm8vu.js';
5
+ import { R as RobotRock, a as SendToHumanInput } from '../client-YO9Y1rkH.js';
6
+ import { u as RobotRockToolCallInfo, F as FormatToolApprovalTaskOptions, H as HumanToolResult } from '../tool-approval-bridge-aMA79Z1B.js';
7
+ export { v as APPROVE_BY_HUMAN_ACTIONS, A as ApproveByHumanToolDurableOptions, a as ApproveByHumanToolOptions, i as CreateSendToHumanToolDurableOptions, C as CreateSendToHumanToolOptions, j as CreateSendUpdateToolDurableOptions, c as CreateSendUpdateToolOptions, w as REPORT_STATUS_TOOL_NAME, x as REQUEST_ACTION_INPUT_TOOL_NAME, y as ReportStatusPhase, z as ReportStatusToolInput, g as ReportStatusToolOptions, B as ReportStatusToolOutput, D as RequestActionInputToolInput, e as RequestActionInputToolOptions, E as RequestActionInputToolOutput, G as ResolveToolApprovalsOptions, k as RobotRockAiContext, l as RobotRockAiMode, m as RobotRockAiPollingContext, n as RobotRockAiTriggerContext, R as RobotRockAiWorkflowContext, I as RobotRockToolApprovalConfig, J as RobotRockToolApprovalDecision, K as RunWithRobotRockApprovalsOptions, L as SendUpdateToolResult, T as ToolApprovalRequestPart, o as applyRobotRockToolApprovalToTools, M as approveByHumanForAi, N as approveByHumanInputSchema, O as buildReportStatusToolDefinition, P as buildRequestActionInputToolDefinition, Q as closeChatForAi, U as collectApprovalRequests, V as createRobotRockAiTriggerContext, p as createRobotRockAiWorkflowContext, q as createRobotRockNeedsApproval, r as createRobotRockToolApproval, W as defaultRequestActionInputActionId, X as executeReportStatusTool, Y as isReportStatusToolPart, Z as isRequestActionInputToolPart, _ as normalizeReportStatusToolInput, $ as normalizeRequestActionInputToolInput, a0 as normalizeRobotRockAiContext, a1 as reportStatusPhaseSchema, a2 as reportStatusToolInputSchema, a3 as reportStatusToolOutputSchema, a4 as requestActionInputToolInputSchema, a5 as requestActionInputToolOutputSchema, s as resolveToolApprovalsViaRobotRock, t as runWithRobotRockApprovals, a6 as sendToHumanForAi, a7 as sendToHumanToolInputSchema, a8 as sendUpdateForAi, a9 as sendUpdateToolInputSchema } from '../tool-approval-bridge-aMA79Z1B.js';
8
8
  import { DiscriminatedApprovalResult } from '../schemas/index.js';
9
9
  import '@robotrock/core';
10
+ import '../auth-headers-qL-ZeEtd.js';
10
11
 
11
12
  /**
12
13
  * AI SDK tool that lets a chat agent close its own chat when done.