@agent-native/dispatch 0.17.3 → 0.17.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/create-workspace-resource.d.ts +13 -13
- package/dist/actions/delete-workspace-resource.d.ts +13 -13
- package/dist/actions/provider-api-register.d.ts +10 -10
- package/dist/client/transactional-emails.d.ts +57 -0
- package/dist/client/transactional-emails.d.ts.map +1 -0
- package/dist/client/transactional-emails.js +116 -0
- package/dist/client/transactional-emails.js.map +1 -0
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +8 -1
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/transactional-email-activity.d.ts +24 -0
- package/dist/components/transactional-email-activity.d.ts.map +1 -0
- package/dist/components/transactional-email-activity.js +31 -0
- package/dist/components/transactional-email-activity.js.map +1 -0
- package/dist/components/transactional-email-metrics.d.ts +40 -0
- package/dist/components/transactional-email-metrics.d.ts.map +1 -0
- package/dist/components/transactional-email-metrics.js +44 -0
- package/dist/components/transactional-email-metrics.js.map +1 -0
- package/dist/components/transactional-email-preview.d.ts +7 -0
- package/dist/components/transactional-email-preview.d.ts.map +1 -0
- package/dist/components/transactional-email-preview.js +41 -0
- package/dist/components/transactional-email-preview.js.map +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +2 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/pages/transactional-email.$appId.$id.d.ts +5 -0
- package/dist/routes/pages/transactional-email.$appId.$id.d.ts.map +1 -0
- package/dist/routes/pages/transactional-email.$appId.$id.js +144 -0
- package/dist/routes/pages/transactional-email.$appId.$id.js.map +1 -0
- package/dist/routes/pages/transactional-email.d.ts +5 -0
- package/dist/routes/pages/transactional-email.d.ts.map +1 -0
- package/dist/routes/pages/transactional-email.js +139 -0
- package/dist/routes/pages/transactional-email.js.map +1 -0
- package/dist/server/lib/thread-debug-store.d.ts.map +1 -1
- package/dist/server/lib/thread-debug-store.js +2 -1
- package/dist/server/lib/thread-debug-store.js.map +1 -1
- package/package.json +2 -2
- package/src/client/transactional-emails.spec.ts +91 -0
- package/src/client/transactional-emails.ts +201 -0
- package/src/components/layout/Layout.tsx +8 -0
- package/src/components/transactional-email-activity.tsx +102 -0
- package/src/components/transactional-email-metrics.tsx +127 -0
- package/src/components/transactional-email-preview.tsx +88 -0
- package/src/routes/index.ts +5 -0
- package/src/routes/pages/transactional-email.$appId.$id.tsx +362 -0
- package/src/routes/pages/transactional-email.tsx +571 -0
- package/src/server/lib/thread-debug-store.spec.ts +7 -3
- package/src/server/lib/thread-debug-store.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-debug-store.js","sourceRoot":"","sources":["../../../src/server/lib/thread-debug-store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n classifyAgentFailure,\n type AgentFailureRegime,\n} from \"@agent-native/core/agent/engine\";\nimport { createDbExec, getDbExec, type DbExec } from \"@agent-native/core/db\";\n\nimport { currentOrgId, currentOwnerEmail } from \"./dispatch-store.js\";\n\nconst CONFIG_ENV_KEY = \"AGENT_NATIVE_THREAD_DEBUG_DATABASES\";\nconst MAX_RAW_PREVIEW_CHARS = 1_500;\nconst DEFAULT_SEARCH_LIMIT = 25;\nconst MAX_SEARCH_LIMIT = 100;\nconst DEFAULT_RUN_LIMIT = 20;\nconst DEFAULT_EVENT_LIMIT = 600;\nconst DEFAULT_TRACE_SPAN_LIMIT = 500;\n\ninterface ThreadDebugSourceConfig {\n id: string;\n label: string;\n kind: \"current\" | \"env\" | \"configured\";\n databaseUrl?: string;\n databaseAuthToken?: string;\n databaseUrlEnv?: string | null;\n databaseAuthTokenEnv?: string | null;\n}\n\nexport interface ThreadDebugSource {\n id: string;\n label: string;\n kind: \"current\" | \"env\" | \"configured\";\n current: boolean;\n connected: boolean;\n databaseUrlEnv: string | null;\n databaseAuthTokenEnv: string | null;\n canInspectAll: boolean;\n}\n\nexport interface DebugAccess {\n viewerEmail: string;\n orgId: string | null;\n role: string | null;\n envAdmin: boolean;\n canInspectAll: boolean;\n memberEmails: string[];\n}\n\ninterface OwnerScope {\n sql: string;\n args: unknown[];\n label: string;\n}\n\ninterface ChatThreadRow {\n id: string;\n owner_email: string;\n title: string | null;\n preview: string | null;\n thread_data: string | null;\n message_count: number | string | null;\n created_at: number | string;\n updated_at: number | string;\n}\n\ninterface AgentRunRow {\n id: string;\n thread_id: string;\n status: string;\n abort_reason?: string | null;\n started_at: number | string;\n completed_at?: number | string | null;\n heartbeat_at?: number | string | null;\n turn_id?: string | null;\n last_progress_at?: number | string | null;\n error_code?: string | null;\n error_detail?: string | null;\n terminal_reason?: string | null;\n dispatch_mode?: string | null;\n worker_stage?: string | null;\n diag_stage?: string | null;\n peak_rss_mb?: number | string | null;\n}\n\nconst execCache = new Map<string, Promise<DbExec>>();\n\nconst UNSUCCESSFUL_RUN_STATUSES = [\"errored\", \"aborted\", \"truncated\"] as const;\n\nexport type AgentRunFailureStatus = (typeof UNSUCCESSFUL_RUN_STATUSES)[number];\n\ntype ThreadDebugSourceHealthStatus =\n | \"ok\"\n | \"disconnected\"\n | \"unsupported\"\n | \"unavailable\";\n\ninterface AgentRunFailureRow extends AgentRunRow {\n debug_owner_email: string;\n debug_thread_title?: string | null;\n debug_thread_preview?: string | null;\n debug_terminal_event_data?: string | null;\n}\n\nclass UnsupportedThreadDebugSchemaError extends Error {\n readonly code = \"thread_debug_schema_unsupported\";\n\n constructor(readonly table: string) {\n super(`This database does not have the required \"${table}\" table.`);\n this.name = \"UnsupportedThreadDebugSchemaError\";\n }\n}\n\nfunction envEmails(name: string): string[] {\n return (process.env[name] ?? \"\")\n .split(\",\")\n .map((value) => value.trim().toLowerCase())\n .filter(Boolean);\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/([\\\\%_])/g, \"\\\\$1\");\n}\n\nfunction isEnvAdmin(email: string): boolean {\n const normalized = email.trim().toLowerCase();\n return [\n ...envEmails(\"DISPATCH_ADMIN_EMAILS\"),\n ...envEmails(\"WORKSPACE_OWNER_EMAIL\"),\n ...envEmails(\"DISPATCH_DEFAULT_OWNER_EMAIL\"),\n ].includes(normalized);\n}\n\nfunction missingTableName(error: unknown): string | null {\n const message = String((error as Error)?.message ?? error);\n const patterns = [\n /no such table:\\s*(?:(?:main|public)\\.)?[\"'`]?([a-zA-Z_][\\w$]*)/i,\n /relation\\s+[\"'`](?:(?:public)\\.)?([a-zA-Z_][\\w$]*)[\"'`]\\s+does not exist/i,\n /table\\s+[\"'`](?:[^\"'`.]+\\.)?([a-zA-Z_][\\w$]*)[\"'`]\\s+does(?:n't| not)\\s+exist/i,\n /unknown table\\s+[\"'`]?(?:[^\"'`.\\s]+\\.)?([a-zA-Z_][\\w$]*)/i,\n /undefined table[^a-zA-Z_]+(?:[^.\\s]+\\.)?([a-zA-Z_][\\w$]*)/i,\n ];\n for (const pattern of patterns) {\n const match = message.match(pattern);\n if (match?.[1]) return match[1].toLowerCase();\n }\n return null;\n}\n\nfunction isMissingTableError(error: unknown): boolean {\n return missingTableName(error) !== null;\n}\n\nasync function optionalRows<T = Record<string, unknown>>(\n exec: DbExec,\n sql: string,\n args: unknown[] = [],\n): Promise<T[]> {\n try {\n return (await exec.execute({ sql, args })).rows as T[];\n } catch (error) {\n if (isMissingTableError(error)) return [];\n throw error;\n }\n}\n\nasync function queryRows<T = Record<string, unknown>>(\n exec: DbExec,\n sql: string,\n args: unknown[] = [],\n): Promise<T[]> {\n try {\n return (await exec.execute({ sql, args })).rows as T[];\n } catch (error) {\n const missingTable = missingTableName(error);\n if (missingTable) {\n throw new UnsupportedThreadDebugSchemaError(missingTable);\n }\n throw error;\n }\n}\n\nfunction numberField(value: unknown): number {\n const parsed = Number(value ?? 0);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction nullableNumberField(value: unknown): number | null {\n if (value == null) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction safeJsonParse<T>(value: unknown, fallback: T): T {\n if (value == null || value === \"\") return fallback;\n try {\n return JSON.parse(String(value)) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction safeJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction textFromContent(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .map((part: any) => {\n if (part?.type === \"text\" && typeof part.text === \"string\") {\n return part.text;\n }\n if (part?.type === \"tool-call\") {\n const name = part.toolName ?? part.name ?? \"tool\";\n return `[tool:${name}] ${safeJsonStringify(part.args ?? part.input ?? {})}`;\n }\n if (part?.type === \"tool-result\") {\n return `[tool-result:${part.toolName ?? part.toolCallId ?? \"tool\"}] ${\n typeof part.content === \"string\"\n ? part.content\n : safeJsonStringify(part.content)\n }`;\n }\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction normalizeMessages(threadData: any) {\n const messages = Array.isArray(threadData?.messages)\n ? threadData.messages\n : [];\n return messages.map((entry: any, index: number) => {\n const message = entry?.message ?? entry;\n const content = message?.content;\n const contentParts = Array.isArray(content) ? content : [];\n return {\n index,\n id: typeof message?.id === \"string\" ? message.id : null,\n role: typeof message?.role === \"string\" ? message.role : \"unknown\",\n createdAt: message?.createdAt ?? null,\n status: message?.status ?? null,\n text: textFromContent(content),\n contentParts,\n attachments: Array.isArray(message?.attachments)\n ? message.attachments\n : [],\n metadata: message?.metadata ?? null,\n parentId: entry?.parentId ?? null,\n };\n });\n}\n\nfunction snippetFor(row: ChatThreadRow, query: string): string {\n const raw = `${row.title ?? \"\"}\\n${row.preview ?? \"\"}\\n${row.thread_data ?? \"\"}`;\n const compact = raw.replace(/\\s+/g, \" \").trim();\n if (!query.trim()) {\n return compact.slice(0, MAX_RAW_PREVIEW_CHARS);\n }\n const lower = compact.toLowerCase();\n const needle = query.trim().toLowerCase();\n const match = lower.indexOf(needle);\n if (match === -1) return compact.slice(0, MAX_RAW_PREVIEW_CHARS);\n const start = Math.max(0, match - 160);\n const end = Math.min(compact.length, match + needle.length + 320);\n const prefix = start > 0 ? \"...\" : \"\";\n const suffix = end < compact.length ? \"...\" : \"\";\n return `${prefix}${compact.slice(start, end)}${suffix}`;\n}\n\nfunction envPrefixForSourceId(sourceId: string): string {\n return sourceId.toUpperCase().replace(/[^A-Z0-9]+/g, \"_\");\n}\n\nfunction sourceIdFromEnvPrefix(prefix: string): string {\n return prefix.toLowerCase().replace(/_/g, \"-\");\n}\n\nfunction labelFromSourceId(sourceId: string): string {\n return sourceId\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction currentDatabaseUrlEnv(): string | null {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName && process.env[`${appName}_DATABASE_URL`]) {\n return `${appName}_DATABASE_URL`;\n }\n return process.env.DATABASE_URL ? \"DATABASE_URL\" : null;\n}\n\nfunction parseConfiguredSources(): ThreadDebugSourceConfig[] {\n const raw = process.env[CONFIG_ENV_KEY];\n if (!raw) return [];\n const parsed = safeJsonParse<any>(raw, null);\n const entries = Array.isArray(parsed)\n ? parsed\n : parsed && typeof parsed === \"object\"\n ? Object.entries(parsed).map(([id, value]) => ({ id, ...(value as any) }))\n : [];\n\n return entries\n .map((entry: any): ThreadDebugSourceConfig | null => {\n const id = typeof entry?.id === \"string\" ? entry.id.trim() : \"\";\n if (!id) return null;\n const databaseUrlEnv =\n typeof entry.databaseUrlEnv === \"string\"\n ? entry.databaseUrlEnv.trim()\n : null;\n const databaseAuthTokenEnv =\n typeof entry.databaseAuthTokenEnv === \"string\"\n ? entry.databaseAuthTokenEnv.trim()\n : null;\n const databaseUrl =\n typeof entry.databaseUrl === \"string\" && entry.databaseUrl.trim()\n ? entry.databaseUrl.trim()\n : databaseUrlEnv\n ? process.env[databaseUrlEnv]\n : undefined;\n return {\n id,\n label:\n typeof entry.label === \"string\" && entry.label.trim()\n ? entry.label.trim()\n : labelFromSourceId(id),\n kind: \"configured\",\n databaseUrl,\n databaseAuthToken:\n typeof entry.databaseAuthToken === \"string\"\n ? entry.databaseAuthToken\n : databaseAuthTokenEnv\n ? process.env[databaseAuthTokenEnv]\n : undefined,\n databaseUrlEnv,\n databaseAuthTokenEnv,\n };\n })\n .filter((source): source is ThreadDebugSourceConfig => Boolean(source));\n}\n\nfunction discoverEnvSources(): ThreadDebugSourceConfig[] {\n const ignored = new Set([\n \"DATABASE_URL\",\n \"NETLIFY_DATABASE_URL\",\n \"NETLIFY_DATABASE_URL_UNPOOLED\",\n ]);\n const currentAppPrefix = process.env.APP_NAME?.toUpperCase().replace(\n /-/g,\n \"_\",\n );\n const sources: ThreadDebugSourceConfig[] = [];\n for (const [key, value] of Object.entries(process.env)) {\n if (!value || !key.endsWith(\"_DATABASE_URL\")) continue;\n if (ignored.has(key) || key.endsWith(\"_UNPOOLED_DATABASE_URL\")) continue;\n const prefix = key.slice(0, -\"_DATABASE_URL\".length);\n if (!prefix || prefix === \"NETLIFY\") continue;\n if (currentAppPrefix && prefix === currentAppPrefix) continue;\n const id = sourceIdFromEnvPrefix(prefix);\n const tokenEnv = `${prefix}_DATABASE_AUTH_TOKEN`;\n sources.push({\n id,\n label: labelFromSourceId(id),\n kind: \"env\",\n databaseUrl: value,\n databaseAuthToken: process.env[tokenEnv],\n databaseUrlEnv: key,\n databaseAuthTokenEnv: process.env[tokenEnv] ? tokenEnv : null,\n });\n }\n return sources;\n}\n\nfunction sourceConfigs(): ThreadDebugSourceConfig[] {\n const byId = new Map<string, ThreadDebugSourceConfig>();\n byId.set(\"current\", {\n id: \"current\",\n label: \"Current Dispatch DB\",\n kind: \"current\",\n databaseUrlEnv: currentDatabaseUrlEnv(),\n databaseAuthTokenEnv: process.env.DATABASE_AUTH_TOKEN\n ? \"DATABASE_AUTH_TOKEN\"\n : null,\n });\n for (const source of discoverEnvSources()) byId.set(source.id, source);\n for (const source of parseConfiguredSources()) byId.set(source.id, source);\n return [...byId.values()];\n}\n\nfunction resolveSourceConfig(sourceId = \"current\"): ThreadDebugSourceConfig {\n const normalized = sourceId.trim() || \"current\";\n const direct = sourceConfigs().find((source) => source.id === normalized);\n if (direct) {\n if (direct.kind !== \"current\" && !direct.databaseUrl) {\n throw new Error(\n `Thread debug source \"${normalized}\" is configured but disconnected.`,\n );\n }\n return direct;\n }\n\n const prefix = envPrefixForSourceId(normalized);\n const databaseUrlEnv = `${prefix}_DATABASE_URL`;\n const databaseUrl = process.env[databaseUrlEnv];\n if (!databaseUrl) {\n throw new Error(`Thread debug source \"${normalized}\" is not configured.`);\n }\n const tokenEnv = `${prefix}_DATABASE_AUTH_TOKEN`;\n return {\n id: normalized,\n label: labelFromSourceId(normalized),\n kind: \"env\",\n databaseUrl,\n databaseAuthToken: process.env[tokenEnv],\n databaseUrlEnv,\n databaseAuthTokenEnv: process.env[tokenEnv] ? tokenEnv : null,\n };\n}\n\nasync function execForSource(source: ThreadDebugSourceConfig): Promise<DbExec> {\n if (source.kind === \"current\") return getDbExec();\n if (!source.databaseUrl) {\n throw new Error(\n `Thread debug source \"${source.id}\" is configured but disconnected.`,\n );\n }\n const cacheKey = `${source.databaseUrl ?? \"\"}\\n${source.databaseAuthToken ?? \"\"}`;\n if (!execCache.has(cacheKey)) {\n execCache.set(\n cacheKey,\n createDbExec({\n url: source.databaseUrl,\n authToken: source.databaseAuthToken,\n }),\n );\n }\n return execCache.get(cacheKey)!;\n}\n\nasync function currentDbRows<T = Record<string, unknown>>(\n sql: string,\n args: unknown[] = [],\n): Promise<T[]> {\n return optionalRows<T>(getDbExec(), sql, args);\n}\n\nasync function viewerOrgRole(\n orgId: string | null,\n viewerEmail: string,\n): Promise<string | null> {\n if (!orgId) return null;\n const rows = await currentDbRows<{ role?: string }>(\n `SELECT role FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n [orgId, viewerEmail.toLowerCase()],\n );\n return typeof rows[0]?.role === \"string\" ? rows[0].role : null;\n}\n\nasync function currentOrgMembers(orgId: string | null): Promise<string[]> {\n if (!orgId) return [];\n const rows = await currentDbRows<{ email?: string }>(\n `SELECT email FROM org_members WHERE org_id = ?`,\n [orgId],\n );\n return rows.map((row) => String(row.email ?? \"\").trim()).filter(Boolean);\n}\n\nasync function resolveDebugAccess(): Promise<DebugAccess> {\n const viewerEmail = currentOwnerEmail();\n const orgId = currentOrgId();\n const role = await viewerOrgRole(orgId, viewerEmail);\n const envAdmin = isEnvAdmin(viewerEmail);\n const canInspectAll = envAdmin || role === \"owner\" || role === \"admin\";\n const memberEmails = canInspectAll\n ? await currentOrgMembers(orgId)\n : [viewerEmail];\n return {\n viewerEmail,\n orgId,\n role,\n envAdmin,\n canInspectAll,\n memberEmails: memberEmails.length > 0 ? memberEmails : [viewerEmail],\n };\n}\n\nfunction assertSourceAccess(\n source: ThreadDebugSourceConfig,\n access: DebugAccess,\n) {\n if (source.kind === \"current\") return;\n if (!access.canInspectAll) {\n throw new Error(\n \"Only Dispatch admins can inspect thread databases from other apps.\",\n );\n }\n}\n\nfunction ownerScope(\n access: DebugAccess,\n ownerEmail?: string,\n column = \"owner_email\",\n): OwnerScope {\n const requested = ownerEmail?.trim();\n if (!access.canInspectAll) {\n return {\n sql: `${column} = ?`,\n args: [access.viewerEmail],\n label: access.viewerEmail,\n };\n }\n\n if (requested && requested !== \"*\") {\n if (\n access.orgId &&\n !access.memberEmails.some(\n (email) => email.toLowerCase() === requested.toLowerCase(),\n )\n ) {\n throw new Error(\n \"The requested owner is not a member of the current organization.\",\n );\n }\n return {\n sql: `${column} = ?`,\n args: [requested],\n label: requested,\n };\n }\n\n if (access.envAdmin && !access.orgId) {\n return { sql: \"1 = 1\", args: [], label: \"all users\" };\n }\n\n const emails = access.memberEmails;\n if (emails.length === 0) {\n return {\n sql: `${column} = ?`,\n args: [access.viewerEmail],\n label: access.viewerEmail,\n };\n }\n const placeholders = emails.map(() => \"?\").join(\", \");\n return {\n sql: `${column} IN (${placeholders})`,\n args: emails,\n label: access.orgId ? \"current organization\" : \"all users\",\n };\n}\n\nfunction serializeThreadSummary(row: ChatThreadRow, query = \"\") {\n return {\n id: String(row.id),\n ownerEmail: String(row.owner_email ?? \"\"),\n title: String(row.title ?? \"\"),\n preview: String(row.preview ?? \"\"),\n messageCount: numberField(row.message_count),\n createdAt: numberField(row.created_at),\n updatedAt: numberField(row.updated_at),\n snippet: snippetFor(row, query),\n };\n}\n\nfunction serializeRun(row: AgentRunRow, events: any[] = []) {\n return {\n id: String(row.id),\n threadId: String(row.thread_id),\n turnId: row.turn_id ? String(row.turn_id) : null,\n status: String(row.status),\n abortReason: row.abort_reason ? String(row.abort_reason) : null,\n errorCode: row.error_code ? String(row.error_code) : null,\n errorDetail: row.error_detail ? String(row.error_detail) : null,\n terminalReason: row.terminal_reason ? String(row.terminal_reason) : null,\n startedAt: numberField(row.started_at),\n completedAt: nullableNumberField(row.completed_at),\n heartbeatAt: nullableNumberField(row.heartbeat_at),\n lastProgressAt: nullableNumberField(row.last_progress_at),\n dispatchMode: row.dispatch_mode ? String(row.dispatch_mode) : null,\n workerStage: row.worker_stage ? String(row.worker_stage) : null,\n diagStage: row.diag_stage ? String(row.diag_stage) : null,\n peakRssMb: nullableNumberField(row.peak_rss_mb),\n events,\n };\n}\n\nfunction parseRunEvent(row: Record<string, unknown>) {\n const raw = String(row.event_data ?? \"\");\n return {\n runId: String(row.run_id ?? \"\"),\n seq: numberField(row.seq),\n event: safeJsonParse(raw, { type: \"unparseable\", raw }),\n rawEventData: raw,\n };\n}\n\nexport async function listThreadDebugSources(): Promise<{\n access: Omit<DebugAccess, \"memberEmails\" | \"envAdmin\"> & {\n envAdmin: boolean;\n memberCount: number;\n };\n sources: ThreadDebugSource[];\n}> {\n const access = await resolveDebugAccess();\n return {\n access: {\n viewerEmail: access.viewerEmail,\n orgId: access.orgId,\n role: access.role,\n envAdmin: access.envAdmin,\n canInspectAll: access.canInspectAll,\n memberCount: access.memberEmails.length,\n },\n sources: sourceConfigs().map((source) => ({\n id: source.id,\n label: source.label,\n kind: source.kind,\n current: source.kind === \"current\",\n connected: source.kind === \"current\" || Boolean(source.databaseUrl),\n databaseUrlEnv: source.databaseUrlEnv ?? null,\n databaseAuthTokenEnv: source.databaseAuthTokenEnv ?? null,\n canInspectAll: access.canInspectAll,\n })),\n };\n}\n\nfunction publicSource(source: ThreadDebugSourceConfig) {\n return {\n id: source.id,\n label: source.label,\n kind: source.kind,\n databaseUrlEnv: source.databaseUrlEnv ?? null,\n };\n}\n\nfunction parseTerminalEvent(value: unknown): Record<string, unknown> | null {\n if (value == null || value === \"\") return null;\n try {\n const parsed = JSON.parse(String(value));\n return parsed && typeof parsed === \"object\"\n ? (parsed as Record<string, unknown>)\n : { type: \"unparseable\" };\n } catch {\n return { type: \"unparseable\" };\n }\n}\n\nfunction serializeRunFailure(\n row: AgentRunFailureRow,\n source: ThreadDebugSourceConfig,\n) {\n const startedAt = numberField(row.started_at);\n const completedAt = nullableNumberField(row.completed_at);\n const terminalEvent = parseTerminalEvent(row.debug_terminal_event_data);\n const failureTaxonomy = classifyAgentFailure({\n runId: row.id,\n errorCode: row.error_code,\n errorDetail: row.error_detail,\n terminalReason: row.terminal_reason,\n terminalEvent,\n });\n return {\n source: publicSource(source),\n id: String(row.id),\n threadId: String(row.thread_id),\n turnId: row.turn_id ? String(row.turn_id) : null,\n ownerEmail: String(row.debug_owner_email ?? \"\"),\n threadTitle: String(row.debug_thread_title ?? \"\"),\n threadPreview: String(row.debug_thread_preview ?? \"\"),\n status: String(row.status) as AgentRunFailureStatus,\n abortReason: row.abort_reason ? String(row.abort_reason) : null,\n errorCode: row.error_code ? String(row.error_code) : null,\n errorDetail: row.error_detail ? String(row.error_detail) : null,\n terminalReason: row.terminal_reason ? String(row.terminal_reason) : null,\n startedAt,\n completedAt,\n heartbeatAt: nullableNumberField(row.heartbeat_at),\n lastProgressAt: nullableNumberField(row.last_progress_at),\n durationMs: completedAt == null ? null : completedAt - startedAt,\n dispatchMode: row.dispatch_mode ? String(row.dispatch_mode) : null,\n workerStage: row.worker_stage ? String(row.worker_stage) : null,\n diagStage: row.diag_stage ? String(row.diag_stage) : null,\n peakRssMb: nullableNumberField(row.peak_rss_mb),\n terminalEvent,\n regime: failureTaxonomy.regime,\n failureTaxonomy,\n };\n}\n\nfunction sourceHealth(\n source: ThreadDebugSourceConfig,\n status: ThreadDebugSourceHealthStatus,\n failureCount: number,\n errorCode:\n | null\n | \"thread_debug_source_disconnected\"\n | \"thread_debug_schema_unsupported\"\n | \"thread_debug_source_unavailable\",\n) {\n return {\n source: publicSource(source),\n status,\n failureCount,\n errorCode,\n };\n}\n\nasync function failuresForSource(\n source: ThreadDebugSourceConfig,\n scope: OwnerScope,\n input: {\n status: AgentRunFailureStatus | \"all\";\n regime: AgentFailureRegime | \"all\";\n cutoff: number;\n limit: number;\n },\n) {\n const exec = await execForSource(source);\n const statuses =\n input.status === \"all\" ? [...UNSUCCESSFUL_RUN_STATUSES] : [input.status];\n const statusPlaceholders = statuses.map(() => \"?\").join(\", \");\n const regimeClause =\n input.regime === \"scheduled\"\n ? \"AND r.id LIKE 'job-%'\"\n : input.regime === \"interactive\"\n ? \"AND r.id NOT LIKE 'job-%'\"\n : \"\";\n const rows = await queryRows<AgentRunFailureRow>(\n exec,\n `SELECT r.*,\n t.owner_email AS debug_owner_email,\n t.title AS debug_thread_title,\n t.preview AS debug_thread_preview,\n (\n SELECT e.event_data\n FROM agent_run_events e\n WHERE e.run_id = r.id\n ORDER BY e.seq DESC\n LIMIT 1\n ) AS debug_terminal_event_data\n FROM agent_runs r\n JOIN chat_threads t ON t.id = r.thread_id\n WHERE r.status IN (${statusPlaceholders})\n AND ${scope.sql}\n ${regimeClause}\n AND COALESCE(r.completed_at, r.started_at) >= ?\n ORDER BY COALESCE(r.completed_at, r.started_at) DESC, r.id DESC\n LIMIT ?`,\n [...statuses, ...scope.args, input.cutoff, input.limit],\n );\n return rows.map((row) => serializeRunFailure(row, source));\n}\n\nexport async function listAgentRunFailures(input: {\n sourceId?: string;\n ownerEmail?: string;\n status?: AgentRunFailureStatus | \"all\";\n regime?: AgentFailureRegime | \"all\";\n lookbackHours?: number;\n limit?: number;\n}) {\n const access = await resolveDebugAccess();\n const requestedSourceId = input.sourceId?.trim() || \"all\";\n const status = input.status ?? \"all\";\n const regime = input.regime ?? \"all\";\n const lookbackHours = Math.max(1, Math.min(720, input.lookbackHours ?? 168));\n const limit = Math.max(1, Math.min(100, input.limit ?? DEFAULT_SEARCH_LIMIT));\n const scope = ownerScope(access, input.ownerEmail, \"t.owner_email\");\n const cutoff = Date.now() - lookbackHours * 60 * 60 * 1000;\n\n let sources: ThreadDebugSourceConfig[];\n if (requestedSourceId === \"all\") {\n sources = sourceConfigs().filter(\n (source) => source.kind === \"current\" || access.canInspectAll,\n );\n } else {\n const configured = sourceConfigs().find(\n (source) => source.id === requestedSourceId,\n );\n const source = configured ?? resolveSourceConfig(requestedSourceId);\n assertSourceAccess(source, access);\n if (source.kind !== \"current\" && !source.databaseUrl) {\n throw new Error(\n `Thread debug source \"${requestedSourceId}\" is configured but disconnected.`,\n );\n }\n sources = [source];\n }\n\n const results = await Promise.all(\n sources.map(async (source) => {\n if (source.kind !== \"current\" && !source.databaseUrl) {\n return {\n failures: [] as ReturnType<typeof serializeRunFailure>[],\n health: sourceHealth(\n source,\n \"disconnected\",\n 0,\n \"thread_debug_source_disconnected\",\n ),\n };\n }\n try {\n const failures = await failuresForSource(source, scope, {\n status,\n regime,\n cutoff,\n limit,\n });\n return {\n failures,\n health: sourceHealth(source, \"ok\", failures.length, null),\n };\n } catch (error) {\n if (error instanceof UnsupportedThreadDebugSchemaError) {\n return {\n failures: [] as ReturnType<typeof serializeRunFailure>[],\n health: sourceHealth(\n source,\n \"unsupported\",\n 0,\n \"thread_debug_schema_unsupported\",\n ),\n };\n }\n return {\n failures: [] as ReturnType<typeof serializeRunFailure>[],\n health: sourceHealth(\n source,\n \"unavailable\",\n 0,\n \"thread_debug_source_unavailable\",\n ),\n };\n }\n }),\n );\n\n const failures = results\n .flatMap((result) => result.failures)\n .sort(\n (a, b) =>\n (b.completedAt ?? b.startedAt) - (a.completedAt ?? a.startedAt) ||\n b.id.localeCompare(a.id) ||\n b.source.id.localeCompare(a.source.id),\n )\n .slice(0, limit);\n\n return {\n sourceId: requestedSourceId,\n status,\n regime,\n lookbackHours,\n limit,\n count: failures.length,\n partial: results.some((result) => result.health.status !== \"ok\"),\n access: {\n viewerEmail: access.viewerEmail,\n scope: scope.label,\n canInspectAll: access.canInspectAll,\n },\n sources: results.map((result) => result.health),\n failures,\n };\n}\n\nexport async function searchAgentThreads(input: {\n sourceId?: string;\n query?: string;\n ownerEmail?: string;\n limit?: number;\n}) {\n const source = resolveSourceConfig(input.sourceId ?? \"current\");\n const access = await resolveDebugAccess();\n assertSourceAccess(source, access);\n const exec = await execForSource(source);\n const limit = Math.max(\n 1,\n Math.min(MAX_SEARCH_LIMIT, input.limit ?? DEFAULT_SEARCH_LIMIT),\n );\n const q = input.query?.trim() ?? \"\";\n const scope = ownerScope(access, input.ownerEmail);\n const where = [scope.sql];\n const args: unknown[] = [...scope.args];\n const runThreadIds = q\n ? (\n await optionalRows<{ thread_id: string }>(\n exec,\n \"SELECT thread_id FROM agent_runs WHERE id = ? LIMIT 1\",\n [q],\n )\n )\n .map((row) => String(row.thread_id ?? \"\").trim())\n .filter(Boolean)\n : [];\n if (q) {\n const pattern = \"%\" + escapeLike(q.toLowerCase()) + \"%\";\n const runIdClause =\n runThreadIds.length > 0\n ? \" OR id IN (\" + runThreadIds.map(() => \"?\").join(\", \") + \")\"\n : \"\";\n where.push(\n \"(LOWER(title) LIKE ? ESCAPE '\\\\' OR LOWER(preview) LIKE ? ESCAPE '\\\\' OR LOWER(thread_data) LIKE ? ESCAPE '\\\\'\" +\n runIdClause +\n \")\",\n );\n args.push(pattern, pattern, pattern);\n args.push(...runThreadIds);\n }\n args.push(limit);\n\n const rows = await optionalRows<ChatThreadRow>(\n exec,\n `SELECT id, owner_email, title, preview, thread_data, message_count, created_at, updated_at\n FROM chat_threads\n WHERE ${where.join(\" AND \")}\n ORDER BY updated_at DESC\n LIMIT ?`,\n args,\n );\n return {\n source: {\n id: source.id,\n label: source.label,\n kind: source.kind,\n databaseUrlEnv: source.databaseUrlEnv ?? null,\n },\n access: {\n viewerEmail: access.viewerEmail,\n scope: scope.label,\n canInspectAll: access.canInspectAll,\n },\n query: q,\n count: rows.length,\n threads: rows.map((row) => serializeThreadSummary(row, q)),\n };\n}\n\nexport async function getAgentThreadDebug(input: {\n sourceId?: string;\n threadId?: string;\n runId?: string;\n ownerEmail?: string;\n maxRuns?: number;\n maxEvents?: number;\n maxTraceSpans?: number;\n}) {\n const source = resolveSourceConfig(input.sourceId ?? \"current\");\n const access = await resolveDebugAccess();\n assertSourceAccess(source, access);\n const exec = await execForSource(source);\n const scope = ownerScope(access, input.ownerEmail);\n const requestedId = input.runId?.trim() || input.threadId?.trim() || \"\";\n if (!requestedId) {\n throw new Error(\"A thread ID or request/run ID is required.\");\n }\n\n let rows = await queryRows<ChatThreadRow>(\n exec,\n `SELECT id, owner_email, title, preview, thread_data, message_count, created_at, updated_at\n FROM chat_threads\n WHERE id = ? AND ${scope.sql}\n LIMIT 1`,\n [input.threadId?.trim() || requestedId, ...scope.args],\n );\n let resolvedRunId = input.runId?.trim() || null;\n\n if (!rows[0]) {\n const runRows = await optionalRows<{ id: string; thread_id: string }>(\n exec,\n `SELECT id, thread_id\n FROM agent_runs\n WHERE id = ?\n LIMIT 1`,\n [requestedId],\n );\n const threadId = runRows[0]?.thread_id\n ? String(runRows[0].thread_id).trim()\n : \"\";\n if (threadId) {\n rows = await queryRows<ChatThreadRow>(\n exec,\n `SELECT id, owner_email, title, preview, thread_data, message_count, created_at, updated_at\n FROM chat_threads\n WHERE id = ? AND ${scope.sql}\n LIMIT 1`,\n [threadId, ...scope.args],\n );\n if (rows[0]) resolvedRunId = requestedId;\n }\n }\n\n const row = rows[0];\n if (!row) {\n throw new Error(`Thread or request/run ID \"${requestedId}\" was not found.`);\n }\n\n const threadData = safeJsonParse<Record<string, unknown>>(\n row.thread_data,\n {},\n );\n const maxRuns = Math.max(1, Math.min(50, input.maxRuns ?? DEFAULT_RUN_LIMIT));\n const maxEvents = Math.max(\n 1,\n Math.min(2_000, input.maxEvents ?? DEFAULT_EVENT_LIMIT),\n );\n const maxTraceSpans = Math.max(\n 1,\n Math.min(2_000, input.maxTraceSpans ?? DEFAULT_TRACE_SPAN_LIMIT),\n );\n\n const runRows = await optionalRows<AgentRunRow>(\n exec,\n `SELECT r.*\n FROM agent_runs r\n WHERE r.thread_id = ?\n ORDER BY r.started_at DESC\n LIMIT ?`,\n [row.id, maxRuns],\n );\n\n const runs = [];\n for (const run of runRows) {\n const eventRows = await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT run_id, seq, event_data\n FROM agent_run_events\n WHERE run_id = ?\n ORDER BY seq ASC\n LIMIT ?`,\n [run.id, maxEvents],\n );\n runs.push(serializeRun(run, eventRows.map(parseRunEvent)));\n }\n\n const runIds = runRows.map((run) => run.id);\n const runPlaceholders = runIds.map(() => \"?\").join(\", \");\n const traceSummaryRows = await optionalRows<Record<string, unknown>>(\n exec,\n runIds.length > 0\n ? `SELECT *\n FROM agent_trace_summaries\n WHERE thread_id = ? OR run_id IN (${runPlaceholders})\n ORDER BY created_at DESC\n LIMIT 50`\n : `SELECT *\n FROM agent_trace_summaries\n WHERE thread_id = ?\n ORDER BY created_at DESC\n LIMIT 50`,\n runIds.length > 0 ? [row.id, ...runIds] : [row.id],\n );\n const traceSpanRows = await optionalRows<Record<string, unknown>>(\n exec,\n runIds.length > 0\n ? `SELECT *\n FROM agent_trace_spans\n WHERE thread_id = ? OR run_id IN (${runPlaceholders})\n ORDER BY created_at ASC\n LIMIT ?`\n : `SELECT *\n FROM agent_trace_spans\n WHERE thread_id = ?\n ORDER BY created_at ASC\n LIMIT ?`,\n runIds.length > 0\n ? [row.id, ...runIds, maxTraceSpans]\n : [row.id, maxTraceSpans],\n );\n const feedbackRows = await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT *\n FROM agent_feedback\n WHERE thread_id = ?\n ORDER BY created_at DESC\n LIMIT 50`,\n [row.id],\n );\n const satisfactionRows = await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT *\n FROM agent_satisfaction_scores\n WHERE thread_id = ?\n ORDER BY computed_at DESC\n LIMIT 10`,\n [row.id],\n );\n const evalRows = await optionalRows<Record<string, unknown>>(\n exec,\n runIds.length > 0\n ? `SELECT *\n FROM agent_evals\n WHERE thread_id = ? OR run_id IN (${runPlaceholders})\n ORDER BY created_at DESC\n LIMIT 50`\n : `SELECT *\n FROM agent_evals\n WHERE thread_id = ?\n ORDER BY created_at DESC\n LIMIT 50`,\n runIds.length > 0 ? [row.id, ...runIds] : [row.id],\n );\n const checkpointRows = await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT id, thread_id, run_id, commit_sha, message, created_at\n FROM agent_checkpoints\n WHERE thread_id = ?\n ORDER BY created_at DESC\n LIMIT 50`,\n [row.id],\n );\n\n return {\n source: {\n id: source.id,\n label: source.label,\n kind: source.kind,\n databaseUrlEnv: source.databaseUrlEnv ?? null,\n },\n access: {\n viewerEmail: access.viewerEmail,\n scope: scope.label,\n canInspectAll: access.canInspectAll,\n },\n thread: {\n id: String(row.id),\n ownerEmail: String(row.owner_email ?? \"\"),\n title: String(row.title ?? \"\"),\n preview: String(row.preview ?? \"\"),\n messageCount: numberField(row.message_count),\n createdAt: numberField(row.created_at),\n updatedAt: numberField(row.updated_at),\n },\n lookup: {\n requestedId,\n threadId: String(row.id),\n runId: resolvedRunId,\n },\n messages: normalizeMessages(threadData),\n debug: (threadData as any)?._debug ?? null,\n debugRuns: Array.isArray((threadData as any)?._debugRuns)\n ? (threadData as any)._debugRuns\n : [],\n queuedMessages: (threadData as any)?.queuedMessages ?? [],\n threadData,\n rawThreadData: row.thread_data ?? \"\",\n runs,\n traces: {\n summaries: traceSummaryRows,\n spans: traceSpanRows,\n },\n feedback: feedbackRows,\n satisfaction: satisfactionRows,\n evals: evalRows,\n checkpoints: checkpointRows,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"thread-debug-store.js","sourceRoot":"","sources":["../../../src/server/lib/thread-debug-store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n classifyAgentFailure,\n type AgentFailureRegime,\n} from \"@agent-native/core/agent/engine\";\nimport { createDbExec, getDbExec, type DbExec } from \"@agent-native/core/db\";\nimport { ForbiddenError } from \"@agent-native/core/sharing\";\n\nimport { currentOrgId, currentOwnerEmail } from \"./dispatch-store.js\";\n\nconst CONFIG_ENV_KEY = \"AGENT_NATIVE_THREAD_DEBUG_DATABASES\";\nconst MAX_RAW_PREVIEW_CHARS = 1_500;\nconst DEFAULT_SEARCH_LIMIT = 25;\nconst MAX_SEARCH_LIMIT = 100;\nconst DEFAULT_RUN_LIMIT = 20;\nconst DEFAULT_EVENT_LIMIT = 600;\nconst DEFAULT_TRACE_SPAN_LIMIT = 500;\n\ninterface ThreadDebugSourceConfig {\n id: string;\n label: string;\n kind: \"current\" | \"env\" | \"configured\";\n databaseUrl?: string;\n databaseAuthToken?: string;\n databaseUrlEnv?: string | null;\n databaseAuthTokenEnv?: string | null;\n}\n\nexport interface ThreadDebugSource {\n id: string;\n label: string;\n kind: \"current\" | \"env\" | \"configured\";\n current: boolean;\n connected: boolean;\n databaseUrlEnv: string | null;\n databaseAuthTokenEnv: string | null;\n canInspectAll: boolean;\n}\n\nexport interface DebugAccess {\n viewerEmail: string;\n orgId: string | null;\n role: string | null;\n envAdmin: boolean;\n canInspectAll: boolean;\n memberEmails: string[];\n}\n\ninterface OwnerScope {\n sql: string;\n args: unknown[];\n label: string;\n}\n\ninterface ChatThreadRow {\n id: string;\n owner_email: string;\n title: string | null;\n preview: string | null;\n thread_data: string | null;\n message_count: number | string | null;\n created_at: number | string;\n updated_at: number | string;\n}\n\ninterface AgentRunRow {\n id: string;\n thread_id: string;\n status: string;\n abort_reason?: string | null;\n started_at: number | string;\n completed_at?: number | string | null;\n heartbeat_at?: number | string | null;\n turn_id?: string | null;\n last_progress_at?: number | string | null;\n error_code?: string | null;\n error_detail?: string | null;\n terminal_reason?: string | null;\n dispatch_mode?: string | null;\n worker_stage?: string | null;\n diag_stage?: string | null;\n peak_rss_mb?: number | string | null;\n}\n\nconst execCache = new Map<string, Promise<DbExec>>();\n\nconst UNSUCCESSFUL_RUN_STATUSES = [\"errored\", \"aborted\", \"truncated\"] as const;\n\nexport type AgentRunFailureStatus = (typeof UNSUCCESSFUL_RUN_STATUSES)[number];\n\ntype ThreadDebugSourceHealthStatus =\n | \"ok\"\n | \"disconnected\"\n | \"unsupported\"\n | \"unavailable\";\n\ninterface AgentRunFailureRow extends AgentRunRow {\n debug_owner_email: string;\n debug_thread_title?: string | null;\n debug_thread_preview?: string | null;\n debug_terminal_event_data?: string | null;\n}\n\nclass UnsupportedThreadDebugSchemaError extends Error {\n readonly code = \"thread_debug_schema_unsupported\";\n\n constructor(readonly table: string) {\n super(`This database does not have the required \"${table}\" table.`);\n this.name = \"UnsupportedThreadDebugSchemaError\";\n }\n}\n\nfunction envEmails(name: string): string[] {\n return (process.env[name] ?? \"\")\n .split(\",\")\n .map((value) => value.trim().toLowerCase())\n .filter(Boolean);\n}\n\nfunction escapeLike(value: string): string {\n return value.replace(/([\\\\%_])/g, \"\\\\$1\");\n}\n\nfunction isEnvAdmin(email: string): boolean {\n const normalized = email.trim().toLowerCase();\n return [\n ...envEmails(\"DISPATCH_ADMIN_EMAILS\"),\n ...envEmails(\"WORKSPACE_OWNER_EMAIL\"),\n ...envEmails(\"DISPATCH_DEFAULT_OWNER_EMAIL\"),\n ].includes(normalized);\n}\n\nfunction missingTableName(error: unknown): string | null {\n const message = String((error as Error)?.message ?? error);\n const patterns = [\n /no such table:\\s*(?:(?:main|public)\\.)?[\"'`]?([a-zA-Z_][\\w$]*)/i,\n /relation\\s+[\"'`](?:(?:public)\\.)?([a-zA-Z_][\\w$]*)[\"'`]\\s+does not exist/i,\n /table\\s+[\"'`](?:[^\"'`.]+\\.)?([a-zA-Z_][\\w$]*)[\"'`]\\s+does(?:n't| not)\\s+exist/i,\n /unknown table\\s+[\"'`]?(?:[^\"'`.\\s]+\\.)?([a-zA-Z_][\\w$]*)/i,\n /undefined table[^a-zA-Z_]+(?:[^.\\s]+\\.)?([a-zA-Z_][\\w$]*)/i,\n ];\n for (const pattern of patterns) {\n const match = message.match(pattern);\n if (match?.[1]) return match[1].toLowerCase();\n }\n return null;\n}\n\nfunction isMissingTableError(error: unknown): boolean {\n return missingTableName(error) !== null;\n}\n\nasync function optionalRows<T = Record<string, unknown>>(\n exec: DbExec,\n sql: string,\n args: unknown[] = [],\n): Promise<T[]> {\n try {\n return (await exec.execute({ sql, args })).rows as T[];\n } catch (error) {\n if (isMissingTableError(error)) return [];\n throw error;\n }\n}\n\nasync function queryRows<T = Record<string, unknown>>(\n exec: DbExec,\n sql: string,\n args: unknown[] = [],\n): Promise<T[]> {\n try {\n return (await exec.execute({ sql, args })).rows as T[];\n } catch (error) {\n const missingTable = missingTableName(error);\n if (missingTable) {\n throw new UnsupportedThreadDebugSchemaError(missingTable);\n }\n throw error;\n }\n}\n\nfunction numberField(value: unknown): number {\n const parsed = Number(value ?? 0);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction nullableNumberField(value: unknown): number | null {\n if (value == null) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction safeJsonParse<T>(value: unknown, fallback: T): T {\n if (value == null || value === \"\") return fallback;\n try {\n return JSON.parse(String(value)) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction safeJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction textFromContent(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .map((part: any) => {\n if (part?.type === \"text\" && typeof part.text === \"string\") {\n return part.text;\n }\n if (part?.type === \"tool-call\") {\n const name = part.toolName ?? part.name ?? \"tool\";\n return `[tool:${name}] ${safeJsonStringify(part.args ?? part.input ?? {})}`;\n }\n if (part?.type === \"tool-result\") {\n return `[tool-result:${part.toolName ?? part.toolCallId ?? \"tool\"}] ${\n typeof part.content === \"string\"\n ? part.content\n : safeJsonStringify(part.content)\n }`;\n }\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction normalizeMessages(threadData: any) {\n const messages = Array.isArray(threadData?.messages)\n ? threadData.messages\n : [];\n return messages.map((entry: any, index: number) => {\n const message = entry?.message ?? entry;\n const content = message?.content;\n const contentParts = Array.isArray(content) ? content : [];\n return {\n index,\n id: typeof message?.id === \"string\" ? message.id : null,\n role: typeof message?.role === \"string\" ? message.role : \"unknown\",\n createdAt: message?.createdAt ?? null,\n status: message?.status ?? null,\n text: textFromContent(content),\n contentParts,\n attachments: Array.isArray(message?.attachments)\n ? message.attachments\n : [],\n metadata: message?.metadata ?? null,\n parentId: entry?.parentId ?? null,\n };\n });\n}\n\nfunction snippetFor(row: ChatThreadRow, query: string): string {\n const raw = `${row.title ?? \"\"}\\n${row.preview ?? \"\"}\\n${row.thread_data ?? \"\"}`;\n const compact = raw.replace(/\\s+/g, \" \").trim();\n if (!query.trim()) {\n return compact.slice(0, MAX_RAW_PREVIEW_CHARS);\n }\n const lower = compact.toLowerCase();\n const needle = query.trim().toLowerCase();\n const match = lower.indexOf(needle);\n if (match === -1) return compact.slice(0, MAX_RAW_PREVIEW_CHARS);\n const start = Math.max(0, match - 160);\n const end = Math.min(compact.length, match + needle.length + 320);\n const prefix = start > 0 ? \"...\" : \"\";\n const suffix = end < compact.length ? \"...\" : \"\";\n return `${prefix}${compact.slice(start, end)}${suffix}`;\n}\n\nfunction envPrefixForSourceId(sourceId: string): string {\n return sourceId.toUpperCase().replace(/[^A-Z0-9]+/g, \"_\");\n}\n\nfunction sourceIdFromEnvPrefix(prefix: string): string {\n return prefix.toLowerCase().replace(/_/g, \"-\");\n}\n\nfunction labelFromSourceId(sourceId: string): string {\n return sourceId\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction currentDatabaseUrlEnv(): string | null {\n const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, \"_\");\n if (appName && process.env[`${appName}_DATABASE_URL`]) {\n return `${appName}_DATABASE_URL`;\n }\n return process.env.DATABASE_URL ? \"DATABASE_URL\" : null;\n}\n\nfunction parseConfiguredSources(): ThreadDebugSourceConfig[] {\n const raw = process.env[CONFIG_ENV_KEY];\n if (!raw) return [];\n const parsed = safeJsonParse<any>(raw, null);\n const entries = Array.isArray(parsed)\n ? parsed\n : parsed && typeof parsed === \"object\"\n ? Object.entries(parsed).map(([id, value]) => ({ id, ...(value as any) }))\n : [];\n\n return entries\n .map((entry: any): ThreadDebugSourceConfig | null => {\n const id = typeof entry?.id === \"string\" ? entry.id.trim() : \"\";\n if (!id) return null;\n const databaseUrlEnv =\n typeof entry.databaseUrlEnv === \"string\"\n ? entry.databaseUrlEnv.trim()\n : null;\n const databaseAuthTokenEnv =\n typeof entry.databaseAuthTokenEnv === \"string\"\n ? entry.databaseAuthTokenEnv.trim()\n : null;\n const databaseUrl =\n typeof entry.databaseUrl === \"string\" && entry.databaseUrl.trim()\n ? entry.databaseUrl.trim()\n : databaseUrlEnv\n ? process.env[databaseUrlEnv]\n : undefined;\n return {\n id,\n label:\n typeof entry.label === \"string\" && entry.label.trim()\n ? entry.label.trim()\n : labelFromSourceId(id),\n kind: \"configured\",\n databaseUrl,\n databaseAuthToken:\n typeof entry.databaseAuthToken === \"string\"\n ? entry.databaseAuthToken\n : databaseAuthTokenEnv\n ? process.env[databaseAuthTokenEnv]\n : undefined,\n databaseUrlEnv,\n databaseAuthTokenEnv,\n };\n })\n .filter((source): source is ThreadDebugSourceConfig => Boolean(source));\n}\n\nfunction discoverEnvSources(): ThreadDebugSourceConfig[] {\n const ignored = new Set([\n \"DATABASE_URL\",\n \"NETLIFY_DATABASE_URL\",\n \"NETLIFY_DATABASE_URL_UNPOOLED\",\n ]);\n const currentAppPrefix = process.env.APP_NAME?.toUpperCase().replace(\n /-/g,\n \"_\",\n );\n const sources: ThreadDebugSourceConfig[] = [];\n for (const [key, value] of Object.entries(process.env)) {\n if (!value || !key.endsWith(\"_DATABASE_URL\")) continue;\n if (ignored.has(key) || key.endsWith(\"_UNPOOLED_DATABASE_URL\")) continue;\n const prefix = key.slice(0, -\"_DATABASE_URL\".length);\n if (!prefix || prefix === \"NETLIFY\") continue;\n if (currentAppPrefix && prefix === currentAppPrefix) continue;\n const id = sourceIdFromEnvPrefix(prefix);\n const tokenEnv = `${prefix}_DATABASE_AUTH_TOKEN`;\n sources.push({\n id,\n label: labelFromSourceId(id),\n kind: \"env\",\n databaseUrl: value,\n databaseAuthToken: process.env[tokenEnv],\n databaseUrlEnv: key,\n databaseAuthTokenEnv: process.env[tokenEnv] ? tokenEnv : null,\n });\n }\n return sources;\n}\n\nfunction sourceConfigs(): ThreadDebugSourceConfig[] {\n const byId = new Map<string, ThreadDebugSourceConfig>();\n byId.set(\"current\", {\n id: \"current\",\n label: \"Current Dispatch DB\",\n kind: \"current\",\n databaseUrlEnv: currentDatabaseUrlEnv(),\n databaseAuthTokenEnv: process.env.DATABASE_AUTH_TOKEN\n ? \"DATABASE_AUTH_TOKEN\"\n : null,\n });\n for (const source of discoverEnvSources()) byId.set(source.id, source);\n for (const source of parseConfiguredSources()) byId.set(source.id, source);\n return [...byId.values()];\n}\n\nfunction resolveSourceConfig(sourceId = \"current\"): ThreadDebugSourceConfig {\n const normalized = sourceId.trim() || \"current\";\n const direct = sourceConfigs().find((source) => source.id === normalized);\n if (direct) {\n if (direct.kind !== \"current\" && !direct.databaseUrl) {\n throw new Error(\n `Thread debug source \"${normalized}\" is configured but disconnected.`,\n );\n }\n return direct;\n }\n\n const prefix = envPrefixForSourceId(normalized);\n const databaseUrlEnv = `${prefix}_DATABASE_URL`;\n const databaseUrl = process.env[databaseUrlEnv];\n if (!databaseUrl) {\n throw new Error(`Thread debug source \"${normalized}\" is not configured.`);\n }\n const tokenEnv = `${prefix}_DATABASE_AUTH_TOKEN`;\n return {\n id: normalized,\n label: labelFromSourceId(normalized),\n kind: \"env\",\n databaseUrl,\n databaseAuthToken: process.env[tokenEnv],\n databaseUrlEnv,\n databaseAuthTokenEnv: process.env[tokenEnv] ? tokenEnv : null,\n };\n}\n\nasync function execForSource(source: ThreadDebugSourceConfig): Promise<DbExec> {\n if (source.kind === \"current\") return getDbExec();\n if (!source.databaseUrl) {\n throw new Error(\n `Thread debug source \"${source.id}\" is configured but disconnected.`,\n );\n }\n const cacheKey = `${source.databaseUrl ?? \"\"}\\n${source.databaseAuthToken ?? \"\"}`;\n if (!execCache.has(cacheKey)) {\n execCache.set(\n cacheKey,\n createDbExec({\n url: source.databaseUrl,\n authToken: source.databaseAuthToken,\n }),\n );\n }\n return execCache.get(cacheKey)!;\n}\n\nasync function currentDbRows<T = Record<string, unknown>>(\n sql: string,\n args: unknown[] = [],\n): Promise<T[]> {\n return optionalRows<T>(getDbExec(), sql, args);\n}\n\nasync function viewerOrgRole(\n orgId: string | null,\n viewerEmail: string,\n): Promise<string | null> {\n if (!orgId) return null;\n const rows = await currentDbRows<{ role?: string }>(\n `SELECT role FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n [orgId, viewerEmail.toLowerCase()],\n );\n return typeof rows[0]?.role === \"string\" ? rows[0].role : null;\n}\n\nasync function currentOrgMembers(orgId: string | null): Promise<string[]> {\n if (!orgId) return [];\n const rows = await currentDbRows<{ email?: string }>(\n `SELECT email FROM org_members WHERE org_id = ?`,\n [orgId],\n );\n return rows.map((row) => String(row.email ?? \"\").trim()).filter(Boolean);\n}\n\nasync function resolveDebugAccess(): Promise<DebugAccess> {\n const viewerEmail = currentOwnerEmail();\n const orgId = currentOrgId();\n const role = await viewerOrgRole(orgId, viewerEmail);\n const envAdmin = isEnvAdmin(viewerEmail);\n const canInspectAll = envAdmin || role === \"owner\" || role === \"admin\";\n const memberEmails = canInspectAll\n ? await currentOrgMembers(orgId)\n : [viewerEmail];\n return {\n viewerEmail,\n orgId,\n role,\n envAdmin,\n canInspectAll,\n memberEmails: memberEmails.length > 0 ? memberEmails : [viewerEmail],\n };\n}\n\nfunction assertSourceAccess(\n source: ThreadDebugSourceConfig,\n access: DebugAccess,\n) {\n if (source.kind === \"current\") return;\n if (!access.canInspectAll) {\n throw new ForbiddenError(\n \"Only Dispatch admins can inspect thread databases from other apps.\",\n );\n }\n}\n\nfunction ownerScope(\n access: DebugAccess,\n ownerEmail?: string,\n column = \"owner_email\",\n): OwnerScope {\n const requested = ownerEmail?.trim();\n if (!access.canInspectAll) {\n return {\n sql: `${column} = ?`,\n args: [access.viewerEmail],\n label: access.viewerEmail,\n };\n }\n\n if (requested && requested !== \"*\") {\n if (\n access.orgId &&\n !access.memberEmails.some(\n (email) => email.toLowerCase() === requested.toLowerCase(),\n )\n ) {\n throw new Error(\n \"The requested owner is not a member of the current organization.\",\n );\n }\n return {\n sql: `${column} = ?`,\n args: [requested],\n label: requested,\n };\n }\n\n if (access.envAdmin && !access.orgId) {\n return { sql: \"1 = 1\", args: [], label: \"all users\" };\n }\n\n const emails = access.memberEmails;\n if (emails.length === 0) {\n return {\n sql: `${column} = ?`,\n args: [access.viewerEmail],\n label: access.viewerEmail,\n };\n }\n const placeholders = emails.map(() => \"?\").join(\", \");\n return {\n sql: `${column} IN (${placeholders})`,\n args: emails,\n label: access.orgId ? \"current organization\" : \"all users\",\n };\n}\n\nfunction serializeThreadSummary(row: ChatThreadRow, query = \"\") {\n return {\n id: String(row.id),\n ownerEmail: String(row.owner_email ?? \"\"),\n title: String(row.title ?? \"\"),\n preview: String(row.preview ?? \"\"),\n messageCount: numberField(row.message_count),\n createdAt: numberField(row.created_at),\n updatedAt: numberField(row.updated_at),\n snippet: snippetFor(row, query),\n };\n}\n\nfunction serializeRun(row: AgentRunRow, events: any[] = []) {\n return {\n id: String(row.id),\n threadId: String(row.thread_id),\n turnId: row.turn_id ? String(row.turn_id) : null,\n status: String(row.status),\n abortReason: row.abort_reason ? String(row.abort_reason) : null,\n errorCode: row.error_code ? String(row.error_code) : null,\n errorDetail: row.error_detail ? String(row.error_detail) : null,\n terminalReason: row.terminal_reason ? String(row.terminal_reason) : null,\n startedAt: numberField(row.started_at),\n completedAt: nullableNumberField(row.completed_at),\n heartbeatAt: nullableNumberField(row.heartbeat_at),\n lastProgressAt: nullableNumberField(row.last_progress_at),\n dispatchMode: row.dispatch_mode ? String(row.dispatch_mode) : null,\n workerStage: row.worker_stage ? String(row.worker_stage) : null,\n diagStage: row.diag_stage ? String(row.diag_stage) : null,\n peakRssMb: nullableNumberField(row.peak_rss_mb),\n events,\n };\n}\n\nfunction parseRunEvent(row: Record<string, unknown>) {\n const raw = String(row.event_data ?? \"\");\n return {\n runId: String(row.run_id ?? \"\"),\n seq: numberField(row.seq),\n event: safeJsonParse(raw, { type: \"unparseable\", raw }),\n rawEventData: raw,\n };\n}\n\nexport async function listThreadDebugSources(): Promise<{\n access: Omit<DebugAccess, \"memberEmails\" | \"envAdmin\"> & {\n envAdmin: boolean;\n memberCount: number;\n };\n sources: ThreadDebugSource[];\n}> {\n const access = await resolveDebugAccess();\n return {\n access: {\n viewerEmail: access.viewerEmail,\n orgId: access.orgId,\n role: access.role,\n envAdmin: access.envAdmin,\n canInspectAll: access.canInspectAll,\n memberCount: access.memberEmails.length,\n },\n sources: sourceConfigs().map((source) => ({\n id: source.id,\n label: source.label,\n kind: source.kind,\n current: source.kind === \"current\",\n connected: source.kind === \"current\" || Boolean(source.databaseUrl),\n databaseUrlEnv: source.databaseUrlEnv ?? null,\n databaseAuthTokenEnv: source.databaseAuthTokenEnv ?? null,\n canInspectAll: access.canInspectAll,\n })),\n };\n}\n\nfunction publicSource(source: ThreadDebugSourceConfig) {\n return {\n id: source.id,\n label: source.label,\n kind: source.kind,\n databaseUrlEnv: source.databaseUrlEnv ?? null,\n };\n}\n\nfunction parseTerminalEvent(value: unknown): Record<string, unknown> | null {\n if (value == null || value === \"\") return null;\n try {\n const parsed = JSON.parse(String(value));\n return parsed && typeof parsed === \"object\"\n ? (parsed as Record<string, unknown>)\n : { type: \"unparseable\" };\n } catch {\n return { type: \"unparseable\" };\n }\n}\n\nfunction serializeRunFailure(\n row: AgentRunFailureRow,\n source: ThreadDebugSourceConfig,\n) {\n const startedAt = numberField(row.started_at);\n const completedAt = nullableNumberField(row.completed_at);\n const terminalEvent = parseTerminalEvent(row.debug_terminal_event_data);\n const failureTaxonomy = classifyAgentFailure({\n runId: row.id,\n errorCode: row.error_code,\n errorDetail: row.error_detail,\n terminalReason: row.terminal_reason,\n terminalEvent,\n });\n return {\n source: publicSource(source),\n id: String(row.id),\n threadId: String(row.thread_id),\n turnId: row.turn_id ? String(row.turn_id) : null,\n ownerEmail: String(row.debug_owner_email ?? \"\"),\n threadTitle: String(row.debug_thread_title ?? \"\"),\n threadPreview: String(row.debug_thread_preview ?? \"\"),\n status: String(row.status) as AgentRunFailureStatus,\n abortReason: row.abort_reason ? String(row.abort_reason) : null,\n errorCode: row.error_code ? String(row.error_code) : null,\n errorDetail: row.error_detail ? String(row.error_detail) : null,\n terminalReason: row.terminal_reason ? String(row.terminal_reason) : null,\n startedAt,\n completedAt,\n heartbeatAt: nullableNumberField(row.heartbeat_at),\n lastProgressAt: nullableNumberField(row.last_progress_at),\n durationMs: completedAt == null ? null : completedAt - startedAt,\n dispatchMode: row.dispatch_mode ? String(row.dispatch_mode) : null,\n workerStage: row.worker_stage ? String(row.worker_stage) : null,\n diagStage: row.diag_stage ? String(row.diag_stage) : null,\n peakRssMb: nullableNumberField(row.peak_rss_mb),\n terminalEvent,\n regime: failureTaxonomy.regime,\n failureTaxonomy,\n };\n}\n\nfunction sourceHealth(\n source: ThreadDebugSourceConfig,\n status: ThreadDebugSourceHealthStatus,\n failureCount: number,\n errorCode:\n | null\n | \"thread_debug_source_disconnected\"\n | \"thread_debug_schema_unsupported\"\n | \"thread_debug_source_unavailable\",\n) {\n return {\n source: publicSource(source),\n status,\n failureCount,\n errorCode,\n };\n}\n\nasync function failuresForSource(\n source: ThreadDebugSourceConfig,\n scope: OwnerScope,\n input: {\n status: AgentRunFailureStatus | \"all\";\n regime: AgentFailureRegime | \"all\";\n cutoff: number;\n limit: number;\n },\n) {\n const exec = await execForSource(source);\n const statuses =\n input.status === \"all\" ? [...UNSUCCESSFUL_RUN_STATUSES] : [input.status];\n const statusPlaceholders = statuses.map(() => \"?\").join(\", \");\n const regimeClause =\n input.regime === \"scheduled\"\n ? \"AND r.id LIKE 'job-%'\"\n : input.regime === \"interactive\"\n ? \"AND r.id NOT LIKE 'job-%'\"\n : \"\";\n const rows = await queryRows<AgentRunFailureRow>(\n exec,\n `SELECT r.*,\n t.owner_email AS debug_owner_email,\n t.title AS debug_thread_title,\n t.preview AS debug_thread_preview,\n (\n SELECT e.event_data\n FROM agent_run_events e\n WHERE e.run_id = r.id\n ORDER BY e.seq DESC\n LIMIT 1\n ) AS debug_terminal_event_data\n FROM agent_runs r\n JOIN chat_threads t ON t.id = r.thread_id\n WHERE r.status IN (${statusPlaceholders})\n AND ${scope.sql}\n ${regimeClause}\n AND COALESCE(r.completed_at, r.started_at) >= ?\n ORDER BY COALESCE(r.completed_at, r.started_at) DESC, r.id DESC\n LIMIT ?`,\n [...statuses, ...scope.args, input.cutoff, input.limit],\n );\n return rows.map((row) => serializeRunFailure(row, source));\n}\n\nexport async function listAgentRunFailures(input: {\n sourceId?: string;\n ownerEmail?: string;\n status?: AgentRunFailureStatus | \"all\";\n regime?: AgentFailureRegime | \"all\";\n lookbackHours?: number;\n limit?: number;\n}) {\n const access = await resolveDebugAccess();\n const requestedSourceId = input.sourceId?.trim() || \"all\";\n const status = input.status ?? \"all\";\n const regime = input.regime ?? \"all\";\n const lookbackHours = Math.max(1, Math.min(720, input.lookbackHours ?? 168));\n const limit = Math.max(1, Math.min(100, input.limit ?? DEFAULT_SEARCH_LIMIT));\n const scope = ownerScope(access, input.ownerEmail, \"t.owner_email\");\n const cutoff = Date.now() - lookbackHours * 60 * 60 * 1000;\n\n let sources: ThreadDebugSourceConfig[];\n if (requestedSourceId === \"all\") {\n sources = sourceConfigs().filter(\n (source) => source.kind === \"current\" || access.canInspectAll,\n );\n } else {\n const configured = sourceConfigs().find(\n (source) => source.id === requestedSourceId,\n );\n const source = configured ?? resolveSourceConfig(requestedSourceId);\n assertSourceAccess(source, access);\n if (source.kind !== \"current\" && !source.databaseUrl) {\n throw new Error(\n `Thread debug source \"${requestedSourceId}\" is configured but disconnected.`,\n );\n }\n sources = [source];\n }\n\n const results = await Promise.all(\n sources.map(async (source) => {\n if (source.kind !== \"current\" && !source.databaseUrl) {\n return {\n failures: [] as ReturnType<typeof serializeRunFailure>[],\n health: sourceHealth(\n source,\n \"disconnected\",\n 0,\n \"thread_debug_source_disconnected\",\n ),\n };\n }\n try {\n const failures = await failuresForSource(source, scope, {\n status,\n regime,\n cutoff,\n limit,\n });\n return {\n failures,\n health: sourceHealth(source, \"ok\", failures.length, null),\n };\n } catch (error) {\n if (error instanceof UnsupportedThreadDebugSchemaError) {\n return {\n failures: [] as ReturnType<typeof serializeRunFailure>[],\n health: sourceHealth(\n source,\n \"unsupported\",\n 0,\n \"thread_debug_schema_unsupported\",\n ),\n };\n }\n return {\n failures: [] as ReturnType<typeof serializeRunFailure>[],\n health: sourceHealth(\n source,\n \"unavailable\",\n 0,\n \"thread_debug_source_unavailable\",\n ),\n };\n }\n }),\n );\n\n const failures = results\n .flatMap((result) => result.failures)\n .sort(\n (a, b) =>\n (b.completedAt ?? b.startedAt) - (a.completedAt ?? a.startedAt) ||\n b.id.localeCompare(a.id) ||\n b.source.id.localeCompare(a.source.id),\n )\n .slice(0, limit);\n\n return {\n sourceId: requestedSourceId,\n status,\n regime,\n lookbackHours,\n limit,\n count: failures.length,\n partial: results.some((result) => result.health.status !== \"ok\"),\n access: {\n viewerEmail: access.viewerEmail,\n scope: scope.label,\n canInspectAll: access.canInspectAll,\n },\n sources: results.map((result) => result.health),\n failures,\n };\n}\n\nexport async function searchAgentThreads(input: {\n sourceId?: string;\n query?: string;\n ownerEmail?: string;\n limit?: number;\n}) {\n const source = resolveSourceConfig(input.sourceId ?? \"current\");\n const access = await resolveDebugAccess();\n assertSourceAccess(source, access);\n const exec = await execForSource(source);\n const limit = Math.max(\n 1,\n Math.min(MAX_SEARCH_LIMIT, input.limit ?? DEFAULT_SEARCH_LIMIT),\n );\n const q = input.query?.trim() ?? \"\";\n const scope = ownerScope(access, input.ownerEmail);\n const where = [scope.sql];\n const args: unknown[] = [...scope.args];\n const runThreadIds = q\n ? (\n await optionalRows<{ thread_id: string }>(\n exec,\n \"SELECT thread_id FROM agent_runs WHERE id = ? LIMIT 1\",\n [q],\n )\n )\n .map((row) => String(row.thread_id ?? \"\").trim())\n .filter(Boolean)\n : [];\n if (q) {\n const pattern = \"%\" + escapeLike(q.toLowerCase()) + \"%\";\n const runIdClause =\n runThreadIds.length > 0\n ? \" OR id IN (\" + runThreadIds.map(() => \"?\").join(\", \") + \")\"\n : \"\";\n where.push(\n \"(LOWER(title) LIKE ? ESCAPE '\\\\' OR LOWER(preview) LIKE ? ESCAPE '\\\\' OR LOWER(thread_data) LIKE ? ESCAPE '\\\\'\" +\n runIdClause +\n \")\",\n );\n args.push(pattern, pattern, pattern);\n args.push(...runThreadIds);\n }\n args.push(limit);\n\n const rows = await optionalRows<ChatThreadRow>(\n exec,\n `SELECT id, owner_email, title, preview, thread_data, message_count, created_at, updated_at\n FROM chat_threads\n WHERE ${where.join(\" AND \")}\n ORDER BY updated_at DESC\n LIMIT ?`,\n args,\n );\n return {\n source: {\n id: source.id,\n label: source.label,\n kind: source.kind,\n databaseUrlEnv: source.databaseUrlEnv ?? null,\n },\n access: {\n viewerEmail: access.viewerEmail,\n scope: scope.label,\n canInspectAll: access.canInspectAll,\n },\n query: q,\n count: rows.length,\n threads: rows.map((row) => serializeThreadSummary(row, q)),\n };\n}\n\nexport async function getAgentThreadDebug(input: {\n sourceId?: string;\n threadId?: string;\n runId?: string;\n ownerEmail?: string;\n maxRuns?: number;\n maxEvents?: number;\n maxTraceSpans?: number;\n}) {\n const source = resolveSourceConfig(input.sourceId ?? \"current\");\n const access = await resolveDebugAccess();\n assertSourceAccess(source, access);\n const exec = await execForSource(source);\n const scope = ownerScope(access, input.ownerEmail);\n const requestedId = input.runId?.trim() || input.threadId?.trim() || \"\";\n if (!requestedId) {\n throw new Error(\"A thread ID or request/run ID is required.\");\n }\n\n let rows = await queryRows<ChatThreadRow>(\n exec,\n `SELECT id, owner_email, title, preview, thread_data, message_count, created_at, updated_at\n FROM chat_threads\n WHERE id = ? AND ${scope.sql}\n LIMIT 1`,\n [input.threadId?.trim() || requestedId, ...scope.args],\n );\n let resolvedRunId = input.runId?.trim() || null;\n\n if (!rows[0]) {\n const runRows = await optionalRows<{ id: string; thread_id: string }>(\n exec,\n `SELECT id, thread_id\n FROM agent_runs\n WHERE id = ?\n LIMIT 1`,\n [requestedId],\n );\n const threadId = runRows[0]?.thread_id\n ? String(runRows[0].thread_id).trim()\n : \"\";\n if (threadId) {\n rows = await queryRows<ChatThreadRow>(\n exec,\n `SELECT id, owner_email, title, preview, thread_data, message_count, created_at, updated_at\n FROM chat_threads\n WHERE id = ? AND ${scope.sql}\n LIMIT 1`,\n [threadId, ...scope.args],\n );\n if (rows[0]) resolvedRunId = requestedId;\n }\n }\n\n const row = rows[0];\n if (!row) {\n throw new Error(`Thread or request/run ID \"${requestedId}\" was not found.`);\n }\n\n const threadData = safeJsonParse<Record<string, unknown>>(\n row.thread_data,\n {},\n );\n const maxRuns = Math.max(1, Math.min(50, input.maxRuns ?? DEFAULT_RUN_LIMIT));\n const maxEvents = Math.max(\n 1,\n Math.min(2_000, input.maxEvents ?? DEFAULT_EVENT_LIMIT),\n );\n const maxTraceSpans = Math.max(\n 1,\n Math.min(2_000, input.maxTraceSpans ?? DEFAULT_TRACE_SPAN_LIMIT),\n );\n\n const runRows = await optionalRows<AgentRunRow>(\n exec,\n `SELECT r.*\n FROM agent_runs r\n WHERE r.thread_id = ?\n ORDER BY r.started_at DESC\n LIMIT ?`,\n [row.id, maxRuns],\n );\n\n const runs = [];\n for (const run of runRows) {\n const eventRows = await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT run_id, seq, event_data\n FROM agent_run_events\n WHERE run_id = ?\n ORDER BY seq ASC\n LIMIT ?`,\n [run.id, maxEvents],\n );\n runs.push(serializeRun(run, eventRows.map(parseRunEvent)));\n }\n\n const runIds = runRows.map((run) => run.id);\n const runPlaceholders = runIds.map(() => \"?\").join(\", \");\n const traceSummaryRows = await optionalRows<Record<string, unknown>>(\n exec,\n runIds.length > 0\n ? `SELECT *\n FROM agent_trace_summaries\n WHERE thread_id = ? OR run_id IN (${runPlaceholders})\n ORDER BY created_at DESC\n LIMIT 50`\n : `SELECT *\n FROM agent_trace_summaries\n WHERE thread_id = ?\n ORDER BY created_at DESC\n LIMIT 50`,\n runIds.length > 0 ? [row.id, ...runIds] : [row.id],\n );\n const traceSpanRows = await optionalRows<Record<string, unknown>>(\n exec,\n runIds.length > 0\n ? `SELECT *\n FROM agent_trace_spans\n WHERE thread_id = ? OR run_id IN (${runPlaceholders})\n ORDER BY created_at ASC\n LIMIT ?`\n : `SELECT *\n FROM agent_trace_spans\n WHERE thread_id = ?\n ORDER BY created_at ASC\n LIMIT ?`,\n runIds.length > 0\n ? [row.id, ...runIds, maxTraceSpans]\n : [row.id, maxTraceSpans],\n );\n const feedbackRows = await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT *\n FROM agent_feedback\n WHERE thread_id = ?\n ORDER BY created_at DESC\n LIMIT 50`,\n [row.id],\n );\n const satisfactionRows = await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT *\n FROM agent_satisfaction_scores\n WHERE thread_id = ?\n ORDER BY computed_at DESC\n LIMIT 10`,\n [row.id],\n );\n const evalRows = await optionalRows<Record<string, unknown>>(\n exec,\n runIds.length > 0\n ? `SELECT *\n FROM agent_evals\n WHERE thread_id = ? OR run_id IN (${runPlaceholders})\n ORDER BY created_at DESC\n LIMIT 50`\n : `SELECT *\n FROM agent_evals\n WHERE thread_id = ?\n ORDER BY created_at DESC\n LIMIT 50`,\n runIds.length > 0 ? [row.id, ...runIds] : [row.id],\n );\n const checkpointRows = await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT id, thread_id, run_id, commit_sha, message, created_at\n FROM agent_checkpoints\n WHERE thread_id = ?\n ORDER BY created_at DESC\n LIMIT 50`,\n [row.id],\n );\n\n return {\n source: {\n id: source.id,\n label: source.label,\n kind: source.kind,\n databaseUrlEnv: source.databaseUrlEnv ?? null,\n },\n access: {\n viewerEmail: access.viewerEmail,\n scope: scope.label,\n canInspectAll: access.canInspectAll,\n },\n thread: {\n id: String(row.id),\n ownerEmail: String(row.owner_email ?? \"\"),\n title: String(row.title ?? \"\"),\n preview: String(row.preview ?? \"\"),\n messageCount: numberField(row.message_count),\n createdAt: numberField(row.created_at),\n updatedAt: numberField(row.updated_at),\n },\n lookup: {\n requestedId,\n threadId: String(row.id),\n runId: resolvedRunId,\n },\n messages: normalizeMessages(threadData),\n debug: (threadData as any)?._debug ?? null,\n debugRuns: Array.isArray((threadData as any)?._debugRuns)\n ? (threadData as any)._debugRuns\n : [],\n queuedMessages: (threadData as any)?.queuedMessages ?? [],\n threadData,\n rawThreadData: row.thread_data ?? \"\",\n runs,\n traces: {\n summaries: traceSummaryRows,\n spans: traceSpanRows,\n },\n feedback: feedbackRows,\n satisfaction: satisfactionRows,\n evals: evalRows,\n checkpoints: checkpointRows,\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/dispatch",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.5",
|
|
4
4
|
"description": "Dispatch — workspace control plane for agent-native apps. Vault, integrations, destinations, scheduled jobs, and cross-app delegation, shipped as a single drop-in package.",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"typescript-7": "npm:typescript@^7.0.2",
|
|
99
99
|
"vite": "8.1.0",
|
|
100
100
|
"vitest": "^4.1.5",
|
|
101
|
-
"@agent-native/core": "0.
|
|
101
|
+
"@agent-native/core": "0.141.6"
|
|
102
102
|
},
|
|
103
103
|
"peerDependencies": {
|
|
104
104
|
"@agent-native/core": ">=0.8.0",
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
aggregateSharedEmails,
|
|
5
|
+
type AppEmailCatalog,
|
|
6
|
+
type AppTransactionalEmail,
|
|
7
|
+
type LocalTransactionalEmailCatalog,
|
|
8
|
+
} from "./transactional-emails";
|
|
9
|
+
|
|
10
|
+
const coreEmail: AppTransactionalEmail = {
|
|
11
|
+
id: "core.reset-password",
|
|
12
|
+
app: "core",
|
|
13
|
+
name: "Reset password",
|
|
14
|
+
trigger: "A password reset is requested.",
|
|
15
|
+
recipient: "The account address.",
|
|
16
|
+
recipientLabel: "Account address",
|
|
17
|
+
sender: "The configured sender.",
|
|
18
|
+
senderLabel: "Configured sender",
|
|
19
|
+
sent: 2,
|
|
20
|
+
failed: 1,
|
|
21
|
+
lastSentAt: 100,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const local: LocalTransactionalEmailCatalog = {
|
|
25
|
+
app: "dispatch",
|
|
26
|
+
statsAvailable: true,
|
|
27
|
+
statsError: null,
|
|
28
|
+
emails: [coreEmail],
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
function appCatalog(
|
|
32
|
+
appId: string,
|
|
33
|
+
email: AppTransactionalEmail,
|
|
34
|
+
): AppEmailCatalog {
|
|
35
|
+
return {
|
|
36
|
+
appId,
|
|
37
|
+
appName: appId,
|
|
38
|
+
appPath: `/${appId}`,
|
|
39
|
+
emails: [email],
|
|
40
|
+
error: null,
|
|
41
|
+
statsError: null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
describe("aggregateSharedEmails", () => {
|
|
46
|
+
it("sums shared email counts across sending apps", () => {
|
|
47
|
+
const result = aggregateSharedEmails(local, [
|
|
48
|
+
appCatalog("calendar", {
|
|
49
|
+
...coreEmail,
|
|
50
|
+
sent: 3,
|
|
51
|
+
failed: 0,
|
|
52
|
+
lastSentAt: 200,
|
|
53
|
+
}),
|
|
54
|
+
appCatalog("forms", {
|
|
55
|
+
...coreEmail,
|
|
56
|
+
sent: 1,
|
|
57
|
+
failed: 2,
|
|
58
|
+
lastSentAt: 150,
|
|
59
|
+
}),
|
|
60
|
+
]);
|
|
61
|
+
|
|
62
|
+
expect(result).toEqual({
|
|
63
|
+
statsError: null,
|
|
64
|
+
emails: [
|
|
65
|
+
{
|
|
66
|
+
...coreEmail,
|
|
67
|
+
sent: 6,
|
|
68
|
+
failed: 3,
|
|
69
|
+
lastSentAt: 200,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("does not present partial totals when an app log is unreadable", () => {
|
|
76
|
+
const unreadable = appCatalog("calendar", coreEmail);
|
|
77
|
+
unreadable.statsError = "database unavailable";
|
|
78
|
+
|
|
79
|
+
expect(aggregateSharedEmails(local, [unreadable])).toEqual({
|
|
80
|
+
statsError: "database unavailable",
|
|
81
|
+
emails: [
|
|
82
|
+
{
|
|
83
|
+
...coreEmail,
|
|
84
|
+
sent: null,
|
|
85
|
+
failed: null,
|
|
86
|
+
lastSentAt: null,
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads each mounted app's transactional email catalog from the browser.
|
|
3
|
+
*
|
|
4
|
+
* Workspace apps are path-mounted on a single origin, so the browser can call
|
|
5
|
+
* another app's action endpoint directly and its own session cookie carries the
|
|
6
|
+
* caller's identity. Fanning out here rather than server-side keeps every app's
|
|
7
|
+
* existing access checks in force — Dispatch never sees a catalog the signed-in
|
|
8
|
+
* user could not have loaded themselves.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export interface AppTransactionalEmail {
|
|
12
|
+
id: string;
|
|
13
|
+
app: string;
|
|
14
|
+
name: string;
|
|
15
|
+
trigger: string;
|
|
16
|
+
recipient: string;
|
|
17
|
+
recipientLabel: string;
|
|
18
|
+
sender: string;
|
|
19
|
+
senderLabel: string;
|
|
20
|
+
/** null when the send log could not be read — not the same as zero sends. */
|
|
21
|
+
sent: number | null;
|
|
22
|
+
failed: number | null;
|
|
23
|
+
lastSentAt: number | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AppEmailCatalog {
|
|
27
|
+
appId: string;
|
|
28
|
+
appName: string;
|
|
29
|
+
appPath: string;
|
|
30
|
+
emails: AppTransactionalEmail[];
|
|
31
|
+
/** Set when this app's catalog could not be read at all. */
|
|
32
|
+
error: string | null;
|
|
33
|
+
/** Set when the catalog loaded but its send counts did not. */
|
|
34
|
+
statsError: string | null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface LocalTransactionalEmailCatalog {
|
|
38
|
+
app: string;
|
|
39
|
+
statsAvailable: boolean;
|
|
40
|
+
statsError: string | null;
|
|
41
|
+
emails: AppTransactionalEmail[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function aggregateSharedEmails(
|
|
45
|
+
local: LocalTransactionalEmailCatalog,
|
|
46
|
+
appCatalogs: AppEmailCatalog[],
|
|
47
|
+
): { emails: AppTransactionalEmail[]; statsError: string | null } {
|
|
48
|
+
const catalogs = [
|
|
49
|
+
{
|
|
50
|
+
appId: local.app,
|
|
51
|
+
appName: local.app,
|
|
52
|
+
appPath: "",
|
|
53
|
+
emails: local.emails,
|
|
54
|
+
error: null,
|
|
55
|
+
statsError: local.statsAvailable ? null : local.statsError,
|
|
56
|
+
},
|
|
57
|
+
...appCatalogs.filter((catalog) => catalog.appId !== local.app),
|
|
58
|
+
];
|
|
59
|
+
const unreadable = catalogs.find(
|
|
60
|
+
(catalog) => catalog.error || catalog.statsError,
|
|
61
|
+
);
|
|
62
|
+
const statsAvailable = !unreadable;
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
statsError: unreadable?.error ?? unreadable?.statsError ?? null,
|
|
66
|
+
emails: local.emails
|
|
67
|
+
.filter((email) => email.app === "core")
|
|
68
|
+
.map((definition) => {
|
|
69
|
+
if (!statsAvailable) {
|
|
70
|
+
return { ...definition, sent: null, failed: null, lastSentAt: null };
|
|
71
|
+
}
|
|
72
|
+
let sent = 0;
|
|
73
|
+
let failed = 0;
|
|
74
|
+
let lastSentAt: number | null = null;
|
|
75
|
+
for (const catalog of catalogs) {
|
|
76
|
+
const email = catalog.emails.find(
|
|
77
|
+
(candidate) => candidate.id === definition.id,
|
|
78
|
+
);
|
|
79
|
+
sent += email?.sent ?? 0;
|
|
80
|
+
failed += email?.failed ?? 0;
|
|
81
|
+
if (
|
|
82
|
+
email?.lastSentAt != null &&
|
|
83
|
+
(lastSentAt === null || email.lastSentAt > lastSentAt)
|
|
84
|
+
) {
|
|
85
|
+
lastSentAt = email.lastSentAt;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { ...definition, sent, failed, lastSentAt };
|
|
89
|
+
}),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function actionUrl(appPath: string, action: string, query = ""): string {
|
|
94
|
+
const base = appPath.replace(/\/$/, "");
|
|
95
|
+
return `${base}/_agent-native/actions/${action}${query}`;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export async function callAppAction<T>(
|
|
99
|
+
appPath: string,
|
|
100
|
+
action: string,
|
|
101
|
+
params: Record<string, unknown>,
|
|
102
|
+
method: "GET" | "POST",
|
|
103
|
+
): Promise<T> {
|
|
104
|
+
const query =
|
|
105
|
+
method === "GET"
|
|
106
|
+
? `?${new URLSearchParams(
|
|
107
|
+
Object.entries(params).map(([key, value]) => [key, String(value)]),
|
|
108
|
+
)}`
|
|
109
|
+
: "";
|
|
110
|
+
const res = await fetch(actionUrl(appPath, action, query), {
|
|
111
|
+
method,
|
|
112
|
+
credentials: "include",
|
|
113
|
+
headers: {
|
|
114
|
+
Accept: "application/json",
|
|
115
|
+
"Content-Type": "application/json",
|
|
116
|
+
"X-Agent-Native-Frontend": "1",
|
|
117
|
+
},
|
|
118
|
+
...(method === "POST" ? { body: JSON.stringify(params) } : {}),
|
|
119
|
+
});
|
|
120
|
+
if (!res.ok) throw new Error(`${action} failed: HTTP ${res.status}`);
|
|
121
|
+
return (await res.json()) as T;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Load one app's catalog. Never throws — a single unreachable app must not
|
|
126
|
+
* blank the whole screen, but its failure is returned rather than swallowed so
|
|
127
|
+
* the UI can say "couldn't read" instead of showing it as having no emails.
|
|
128
|
+
*/
|
|
129
|
+
const CATALOG_TIMEOUT_MS = 10_000;
|
|
130
|
+
|
|
131
|
+
export async function fetchAppEmailCatalog(
|
|
132
|
+
app: { id: string; name: string; path: string },
|
|
133
|
+
windowDays: number,
|
|
134
|
+
): Promise<AppEmailCatalog> {
|
|
135
|
+
const base: AppEmailCatalog = {
|
|
136
|
+
appId: app.id,
|
|
137
|
+
appName: app.name,
|
|
138
|
+
appPath: app.path,
|
|
139
|
+
emails: [],
|
|
140
|
+
error: null,
|
|
141
|
+
statsError: null,
|
|
142
|
+
};
|
|
143
|
+
try {
|
|
144
|
+
const res = await fetch(
|
|
145
|
+
actionUrl(
|
|
146
|
+
app.path,
|
|
147
|
+
"list-transactional-emails",
|
|
148
|
+
`?windowDays=${windowDays}`,
|
|
149
|
+
),
|
|
150
|
+
{
|
|
151
|
+
credentials: "include",
|
|
152
|
+
headers: { Accept: "application/json" },
|
|
153
|
+
signal: AbortSignal.timeout(CATALOG_TIMEOUT_MS),
|
|
154
|
+
},
|
|
155
|
+
);
|
|
156
|
+
if (!res.ok) {
|
|
157
|
+
return { ...base, error: `HTTP ${res.status}` };
|
|
158
|
+
}
|
|
159
|
+
const body = (await res.json()) as {
|
|
160
|
+
emails?: AppTransactionalEmail[];
|
|
161
|
+
statsAvailable?: boolean;
|
|
162
|
+
statsError?: string | null;
|
|
163
|
+
};
|
|
164
|
+
return {
|
|
165
|
+
...base,
|
|
166
|
+
emails: body.emails ?? [],
|
|
167
|
+
statsError:
|
|
168
|
+
body.statsAvailable === false ? (body.statsError ?? "unknown") : null,
|
|
169
|
+
};
|
|
170
|
+
} catch (error) {
|
|
171
|
+
return {
|
|
172
|
+
...base,
|
|
173
|
+
error: error instanceof Error ? error.message : String(error),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export interface EmailPreview {
|
|
179
|
+
subject: string;
|
|
180
|
+
html: string;
|
|
181
|
+
text: string;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Render one email's preview with dummy data, from the owning app. */
|
|
185
|
+
export async function fetchEmailPreview(
|
|
186
|
+
appPath: string,
|
|
187
|
+
id: string,
|
|
188
|
+
): Promise<EmailPreview> {
|
|
189
|
+
const res = await fetch(
|
|
190
|
+
actionUrl(
|
|
191
|
+
appPath,
|
|
192
|
+
"render-transactional-email-preview",
|
|
193
|
+
`?id=${encodeURIComponent(id)}`,
|
|
194
|
+
),
|
|
195
|
+
{ credentials: "include", headers: { Accept: "application/json" } },
|
|
196
|
+
);
|
|
197
|
+
if (!res.ok) {
|
|
198
|
+
throw new Error(`Preview failed: HTTP ${res.status}`);
|
|
199
|
+
}
|
|
200
|
+
return (await res.json()) as EmailPreview;
|
|
201
|
+
}
|