@agent-native/dispatch 0.40.30 → 0.40.33
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/CHANGELOG.md +28 -25
- package/dist/actions/connect-external-agent.d.ts.map +1 -1
- package/dist/actions/connect-external-agent.js +2 -9
- package/dist/actions/connect-external-agent.js.map +1 -1
- package/dist/actions/list-connected-agents.js +7 -3
- package/dist/actions/list-connected-agents.js.map +1 -1
- package/dist/actions/list-dispatch-usage-metrics.js +1 -1
- package/dist/actions/list-dispatch-usage-metrics.js.map +1 -1
- package/dist/actions/list-workspace-connections.d.ts.map +1 -1
- package/dist/actions/list-workspace-connections.js +13 -18
- package/dist/actions/list-workspace-connections.js.map +1 -1
- package/dist/actions/provider-api-register.d.ts +8 -8
- package/dist/actions/provider-api-register.js +2 -14
- package/dist/actions/provider-api-register.js.map +1 -1
- package/dist/components/action-query-error.d.ts +2 -1
- package/dist/components/action-query-error.d.ts.map +1 -1
- package/dist/components/action-query-error.js +25 -2
- package/dist/components/action-query-error.js.map +1 -1
- package/dist/components/chat-home-apps.d.ts.map +1 -1
- package/dist/components/chat-home-apps.js +2 -2
- package/dist/components/chat-home-apps.js.map +1 -1
- package/dist/components/dispatch-control-plane.d.ts.map +1 -1
- package/dist/components/dispatch-control-plane.js +1 -1
- package/dist/components/dispatch-control-plane.js.map +1 -1
- package/dist/components/layout/Layout.d.ts +1 -0
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +7 -0
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +4 -9
- package/dist/db/index.js.map +1 -1
- package/dist/routes/pages/$appId.d.ts.map +1 -1
- package/dist/routes/pages/$appId.js +1 -1
- package/dist/routes/pages/$appId.js.map +1 -1
- package/dist/routes/pages/apps.js +1 -1
- package/dist/routes/pages/apps.js.map +1 -1
- package/dist/server/lib/admin-config.d.ts.map +1 -1
- package/dist/server/lib/admin-config.js +3 -1
- package/dist/server/lib/admin-config.js.map +1 -1
- package/dist/server/lib/app-creation-store.d.ts.map +1 -1
- package/dist/server/lib/app-creation-store.js +124 -65
- package/dist/server/lib/app-creation-store.js.map +1 -1
- package/dist/server/lib/community-apps.js +1 -1
- package/dist/server/lib/community-apps.js.map +1 -1
- package/dist/server/lib/mcp-access-store.d.ts.map +1 -1
- package/dist/server/lib/mcp-access-store.js +2 -10
- package/dist/server/lib/mcp-access-store.js.map +1 -1
- package/dist/server/lib/thread-debug-store.d.ts.map +1 -1
- package/dist/server/lib/thread-debug-store.js +2 -6
- package/dist/server/lib/thread-debug-store.js.map +1 -1
- package/dist/server/lib/usage-metrics-store.d.ts.map +1 -1
- package/dist/server/lib/usage-metrics-store.js +2 -11
- package/dist/server/lib/usage-metrics-store.js.map +1 -1
- package/dist/server/lib/vault-store.d.ts.map +1 -1
- package/dist/server/lib/vault-store.js +2 -9
- package/dist/server/lib/vault-store.js.map +1 -1
- package/dist/server/lib/workspace-app-action-auth.d.ts.map +1 -1
- package/dist/server/lib/workspace-app-action-auth.js +7 -2
- package/dist/server/lib/workspace-app-action-auth.js.map +1 -1
- package/dist/server/plugins/agent-chat.js +1 -1
- package/dist/server/plugins/agent-chat.js.map +1 -1
- package/package.json +3 -3
- package/src/actions/connect-external-agent.spec.ts +25 -11
- package/src/actions/connect-external-agent.ts +2 -9
- package/src/actions/index.spec.ts +3 -0
- package/src/actions/list-connected-agents.spec.ts +17 -1
- package/src/actions/list-connected-agents.ts +7 -2
- package/src/actions/list-dispatch-usage-metrics.ts +1 -1
- package/src/actions/list-workspace-connections.spec.ts +14 -3
- package/src/actions/list-workspace-connections.ts +13 -17
- package/src/actions/provider-api-register.spec.ts +15 -9
- package/src/actions/provider-api-register.ts +5 -13
- package/src/components/action-query-error.spec.tsx +20 -0
- package/src/components/action-query-error.tsx +40 -0
- package/src/components/chat-home-apps.spec.tsx +32 -1
- package/src/components/chat-home-apps.tsx +6 -1
- package/src/components/dispatch-control-plane.tsx +1 -0
- package/src/components/layout/Layout.tsx +9 -0
- package/src/db/index.spec.ts +74 -0
- package/src/db/index.ts +4 -9
- package/src/routes/pages/$appId.tsx +1 -0
- package/src/routes/pages/apps.spec.tsx +26 -2
- package/src/routes/pages/apps.tsx +2 -0
- package/src/server/lib/admin-config.spec.ts +51 -0
- package/src/server/lib/admin-config.ts +2 -1
- package/src/server/lib/app-creation-store.spec.ts +308 -10
- package/src/server/lib/app-creation-store.ts +174 -70
- package/src/server/lib/community-apps.ts +1 -1
- package/src/server/lib/mcp-access-store.spec.ts +39 -12
- package/src/server/lib/mcp-access-store.ts +3 -10
- package/src/server/lib/thread-debug-store.spec.ts +64 -0
- package/src/server/lib/thread-debug-store.ts +2 -9
- package/src/server/lib/usage-metrics-store.spec.ts +64 -0
- package/src/server/lib/usage-metrics-store.ts +2 -17
- package/src/server/lib/vault-store.spec.ts +26 -9
- package/src/server/lib/vault-store.ts +3 -10
- package/src/server/lib/workspace-app-action-auth.spec.ts +37 -6
- package/src/server/lib/workspace-app-action-auth.ts +12 -2
- package/src/server/plugins/agent-chat.spec.ts +14 -0
- package/src/server/plugins/agent-chat.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"community-apps.js","sourceRoot":"","sources":["../../../src/server/lib/community-apps.ts"],"names":[],"mappings":"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","sourcesContent":["import { fail } from \"@agent-native/core/action\";\nimport { getUserLabEnabled } from \"@agent-native/core/labs/server\";\nimport {\n getWorkspaceAppIdValidationError,\n normalizeWorkspaceAppId,\n} from \"@agent-native/core/shared\";\nimport {\n BUILTIN_AGENT_CATALOG_IDS,\n HIDDEN_FIRST_PARTY_AGENT_IDS,\n} from \"@agent-native/core/shared/first-party-agents\";\n\nimport { COMMUNITY_APPS_LAB } from \"../../shared/labs.js\";\nimport type {\n StartWorkspaceAppCreationResult,\n WorkspaceAppSummary,\n} from \"./app-creation-store.js\";\nimport {\n getAppCreationSettings,\n getWorkspaceInfo,\n isLocalAppCreationRuntime,\n listWorkspaceApps,\n startWorkspaceAppCreation,\n} from \"./app-creation-store.js\";\nimport {\n loadPinnedCommunitySourceAttachments,\n type PinnedCommunitySource,\n} from \"./community-source.js\";\nimport { CURATED_WORKSPACE_TEMPLATES } from \"./curated-workspace-templates.js\";\nimport {\n currentOrgId,\n currentOwnerEmail,\n recordAudit,\n} from \"./dispatch-store.js\";\n\nexport interface CuratedCommunityAppSource extends PinnedCommunitySource {\n id: string;\n name: string;\n description: string;\n appId: string;\n license: string;\n provenance: string;\n}\n\nexport interface CuratedCommunityApp extends CuratedCommunityAppSource {\n installed: boolean;\n pending: boolean;\n installable: boolean;\n installUnavailableReason?:\n | \"workspace-required\"\n | \"app-id-conflict\"\n | \"builder-install-unverified\";\n}\n\nexport const CURATED_COMMUNITY_APP_SOURCES: readonly CuratedCommunityAppSource[] =\n [\n {\n id: \"community-qr\",\n name: \"QR\",\n description: \"Generate public PNG or SVG QR images from links or text.\",\n appId: \"community-qr\",\n repo: \"BuilderIO/agent-native\",\n ref: \"main\",\n license: \"MIT\",\n provenance:\n \"Reviewed Agent-Native Framework template, sanitized for independent installation.\",\n templatePath: \"templates/community/qr\",\n files: [\n {\n path: \"AGENTS.md\",\n blobSha: \"7dc9e18bc426dfd21526f91225cc615759450816\",\n },\n {\n path: \"LICENSE\",\n blobSha: \"69c7182efb3eb1a8b7f6fd5989f3e4fd737d0645\",\n },\n {\n path: \"README.md\",\n blobSha: \"e05e72bb9213732f56ccbc96f7dcb1c3a064cb19\",\n },\n {\n path: \"actions/generate-qr-code.spec.ts\",\n blobSha: \"3459217b7252c6ee0076c68cfdb83001cc74f29e\",\n },\n {\n path: \"actions/generate-qr-code.ts\",\n blobSha: \"98d30e218bfed796d5e402d5ce19a8626d8da0cf\",\n },\n {\n path: \"actions/run.ts\",\n blobSha: \"b46ab15b667c34741364ba08f010f7aca9d0f02e\",\n },\n {\n path: \"agent-native.json\",\n blobSha: \"accc32476792b84557f69e2b48b317c27b5546dc\",\n },\n {\n path: \"package.json\",\n blobSha: \"c7803d346368f927621329b2acbf5f6cc744dc18\",\n },\n {\n path: \"server/db/index.ts\",\n blobSha: \"17007b456530f75a72e7209bdfe9f4bd4c9224e0\",\n },\n {\n path: \"server/db/schema.ts\",\n blobSha: \"2e4cd01c5f46463e78bc7beb6e954f3e526c0b57\",\n },\n {\n path: \"server/plugins/db.ts\",\n blobSha: \"78a5b431c1ad1ea14f593123c090f5376a36df10\",\n },\n {\n path: \"tsconfig.json\",\n blobSha: \"5267473a32dcab8e5dc2c9d9a720afed7f40174c\",\n },\n ],\n },\n ];\n\nconst communitySourceById = new Map(\n CURATED_COMMUNITY_APP_SOURCES.map((source) => [source.id, source]),\n);\n\nfunction requireCommunitySource(sourceId: string): CuratedCommunityAppSource {\n const source = communitySourceById.get(sourceId.trim());\n if (!source) {\n fail(\"That community app is not in Dispatch's reviewed install catalog.\", {\n errorCode: \"unknown_community_app_source\",\n statusCode: 404,\n });\n }\n return source;\n}\n\nfunction communitySourceFailureKind(\n error: unknown,\n): \"unavailable\" | \"integrity\" {\n if (!(error instanceof Error) || !(\"failureKind\" in error)) {\n return \"unavailable\";\n }\n return error.failureKind === \"integrity\" ? \"integrity\" : \"unavailable\";\n}\n\nfunction requireNonShadowingCommunityAppId(appId: string): void {\n const error = getWorkspaceAppIdValidationError(appId);\n if (error) {\n fail(error, { errorCode: \"invalid_community_app_id\", statusCode: 400 });\n }\n if (\n CURATED_WORKSPACE_TEMPLATES.some((template) => template.id === appId) ||\n BUILTIN_AGENT_CATALOG_IDS.includes(appId) ||\n HIDDEN_FIRST_PARTY_AGENT_IDS.has(appId)\n ) {\n fail(\"Community apps cannot use a first-party template app id.\", {\n errorCode: \"community_app_id_shadows_first_party\",\n statusCode: 409,\n });\n }\n}\n\nasync function requireCommunityAppsLab(): Promise<void> {\n const userEmail = currentOwnerEmail().trim();\n const orgId = currentOrgId();\n if (!userEmail || !orgId) {\n fail(\"Sign in to an organization to browse community apps.\", {\n errorCode: \"community_apps_identity_required\",\n statusCode: 403,\n });\n }\n const enabled = await getUserLabEnabled(userEmail, COMMUNITY_APPS_LAB, {\n orgId,\n });\n if (!enabled) {\n fail(\"Community app catalog and installs are disabled for this account.\", {\n errorCode: \"community_apps_lab_disabled\",\n statusCode: 403,\n });\n }\n}\n\nasync function hasAssociatedWorkspace(\n localRuntime = isLocalAppCreationRuntime(),\n): Promise<boolean> {\n if (localRuntime) return Boolean(getWorkspaceInfo().rootPath);\n return Boolean((await getAppCreationSettings()).builderProjectId);\n}\n\nexport async function listCuratedCommunityApps(): Promise<\n CuratedCommunityApp[]\n> {\n await requireCommunityAppsLab();\n const localRuntime = isLocalAppCreationRuntime();\n const [apps, workspaceAvailable] = await Promise.all([\n listWorkspaceApps({ includeAgentCards: false, includeArchived: true }),\n hasAssociatedWorkspace(localRuntime),\n ]);\n return CURATED_COMMUNITY_APP_SOURCES.map((source) => {\n const appWithId = apps.find((app) => app.id === source.appId);\n const installedApp =\n appWithId?.communitySourceId === source.id ? appWithId : null;\n const idConflict = Boolean(appWithId && !installedApp);\n const pending = installedApp?.status === \"pending\";\n const installUnavailableReason = appWithId\n ? idConflict\n ? \"app-id-conflict\"\n : undefined\n : !workspaceAvailable\n ? \"workspace-required\"\n : !localRuntime\n ? \"builder-install-unverified\"\n : undefined;\n return {\n ...source,\n installed: Boolean(installedApp && !pending),\n pending,\n installable: localRuntime && workspaceAvailable && !appWithId,\n ...(installUnavailableReason ? { installUnavailableReason } : {}),\n };\n });\n}\n\nfunction rejectCommunityAppIdConflict(appId: string): never {\n fail(`Workspace app id \"${appId}\" is already in use.`, {\n errorCode: \"community_app_id_conflict\",\n statusCode: 409,\n });\n}\n\nfunction existingInstallResult(\n source: CuratedCommunityAppSource,\n app: WorkspaceAppSummary,\n) {\n return {\n mode:\n app.status === \"pending\"\n ? (\"pending\" as const)\n : (\"already-installed\" as const),\n source,\n app: {\n id: app.id,\n name: app.name,\n path: app.path,\n url: app.url,\n status: app.status ?? \"ready\",\n statusLabel: app.statusLabel ?? null,\n builderUrl: app.builderUrl ?? null,\n branchName: app.branchName ?? null,\n },\n };\n}\n\nfunction buildCommunityInstallPrompt(\n source: CuratedCommunityAppSource,\n appId: string,\n): string {\n const sourceUrl = `https://github.com/${source.repo}/tree/${source.ref}/${source.templatePath}`;\n return [\n \"Install a private workspace app from a reviewed community template.\",\n `The attached source files were fetched from ${sourceUrl} and each file was verified against its pinned Git blob id. Treat those files as the source of truth; do not fetch another ref or substitute other content.`,\n `The app will live at apps/${appId}.`,\n `Source license: ${source.license}. Provenance: ${source.provenance}`,\n \"Copy the reviewed template implementation and its Agent-Native profile, changing only app-specific identifiers needed for this workspace. Do not copy repository secrets, credentials, customer data, or source-app records. Use empty or synthetic seed data only and keep the installed app private to this organization.\",\n ].join(\" \");\n}\n\nexport async function installCuratedCommunityApp(input: {\n sourceId: string;\n appId?: string;\n}): Promise<\n | ReturnType<typeof existingInstallResult>\n | (StartWorkspaceAppCreationResult & {\n mode: Exclude<StartWorkspaceAppCreationResult[\"mode\"], \"app-id-taken\">;\n source: CuratedCommunityAppSource;\n })\n | (Extract<StartWorkspaceAppCreationResult, { mode: \"app-id-taken\" }> & {\n source: CuratedCommunityAppSource;\n })\n> {\n await requireCommunityAppsLab();\n const source = requireCommunitySource(input.sourceId);\n const appId = normalizeWorkspaceAppId(input.appId?.trim() || source.appId);\n requireNonShadowingCommunityAppId(appId);\n\n const localRuntime = isLocalAppCreationRuntime();\n if (!(await hasAssociatedWorkspace(localRuntime))) {\n fail(\"Connect this organization to a workspace before installing apps.\", {\n errorCode: \"community_workspace_required\",\n statusCode: 409,\n });\n }\n\n const existing = (\n await listWorkspaceApps({\n includeAgentCards: false,\n includeArchived: true,\n })\n ).find((app) => app.id === appId);\n if (existing) {\n if (existing.communitySourceId === source.id) {\n return existingInstallResult(source, existing);\n }\n rejectCommunityAppIdConflict(appId);\n }\n\n if (!localRuntime) {\n fail(\n \"Community template installs in Builder workspaces are disabled until the generated branch files can be read back and verified.\",\n {\n errorCode: \"community_builder_install_unverified\",\n statusCode: 503,\n },\n );\n }\n\n let attachments: Awaited<\n ReturnType<typeof loadPinnedCommunitySourceAttachments>\n >;\n try {\n attachments = await loadPinnedCommunitySourceAttachments(source, appId);\n } catch (error) {\n fail(\n \"Dispatch could not verify the pinned community template source. Try again later.\",\n {\n errorCode:\n communitySourceFailureKind(error) === \"integrity\"\n ? \"community_source_integrity_failed\"\n : \"community_source_unavailable\",\n statusCode: 503,\n },\n );\n }\n\n const result = await startWorkspaceAppCreation({\n prompt: buildCommunityInstallPrompt(source, appId),\n appId,\n description: source.description,\n template: source.id,\n communitySourceId: source.id,\n attachments,\n });\n\n if (result.mode === \"app-id-taken\") {\n const raced = (\n await listWorkspaceApps({\n includeAgentCards: false,\n includeArchived: true,\n })\n ).find((app) => app.id === appId);\n if (raced?.communitySourceId === source.id) {\n return existingInstallResult(source, raced);\n }\n if (raced) rejectCommunityAppIdConflict(appId);\n return { ...result, source };\n }\n\n await recordAudit({\n action: \"workspace-app.community-install-requested\",\n targetType: \"workspace-app\",\n targetId: appId,\n summary: `Requested ${source.name} community app installation`,\n metadata: {\n sourceId: source.id,\n repo: source.repo,\n ref: source.ref,\n blobShas: source.files.map((file) => file.blobSha),\n license: source.license,\n },\n });\n return { ...result, source } as typeof result & {\n source: CuratedCommunityAppSource;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"community-apps.js","sourceRoot":"","sources":["../../../src/server/lib/community-apps.ts"],"names":[],"mappings":"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","sourcesContent":["import { fail } from \"@agent-native/core/action\";\nimport { getUserLabEnabled } from \"@agent-native/core/labs/server\";\nimport {\n getWorkspaceAppIdValidationError,\n normalizeWorkspaceAppId,\n} from \"@agent-native/core/shared\";\nimport {\n BUILTIN_AGENT_CATALOG_IDS,\n HIDDEN_FIRST_PARTY_AGENT_IDS,\n} from \"@agent-native/core/shared/first-party-agents\";\n\nimport { COMMUNITY_APPS_LAB } from \"../../shared/labs.js\";\nimport type {\n StartWorkspaceAppCreationResult,\n WorkspaceAppSummary,\n} from \"./app-creation-store.js\";\nimport {\n getAppCreationSettings,\n getWorkspaceInfo,\n isLocalAppCreationRuntime,\n listWorkspaceApps,\n startWorkspaceAppCreation,\n} from \"./app-creation-store.js\";\nimport {\n loadPinnedCommunitySourceAttachments,\n type PinnedCommunitySource,\n} from \"./community-source.js\";\nimport { CURATED_WORKSPACE_TEMPLATES } from \"./curated-workspace-templates.js\";\nimport {\n currentOrgId,\n currentOwnerEmail,\n recordAudit,\n} from \"./dispatch-store.js\";\n\nexport interface CuratedCommunityAppSource extends PinnedCommunitySource {\n id: string;\n name: string;\n description: string;\n appId: string;\n license: string;\n provenance: string;\n}\n\nexport interface CuratedCommunityApp extends CuratedCommunityAppSource {\n installed: boolean;\n pending: boolean;\n installable: boolean;\n installUnavailableReason?:\n | \"workspace-required\"\n | \"app-id-conflict\"\n | \"builder-install-unverified\";\n}\n\nexport const CURATED_COMMUNITY_APP_SOURCES: readonly CuratedCommunityAppSource[] =\n [\n {\n id: \"community-qr\",\n name: \"QR\",\n description: \"Generate public PNG or SVG QR images from links or text.\",\n appId: \"community-qr\",\n repo: \"BuilderIO/agent-native\",\n ref: \"main\",\n license: \"MIT\",\n provenance:\n \"Reviewed Agent-Native Framework template, sanitized for independent installation.\",\n templatePath: \"templates/community/qr\",\n files: [\n {\n path: \"AGENTS.md\",\n blobSha: \"7dc9e18bc426dfd21526f91225cc615759450816\",\n },\n {\n path: \"LICENSE\",\n blobSha: \"69c7182efb3eb1a8b7f6fd5989f3e4fd737d0645\",\n },\n {\n path: \"README.md\",\n blobSha: \"e05e72bb9213732f56ccbc96f7dcb1c3a064cb19\",\n },\n {\n path: \"actions/generate-qr-code.spec.ts\",\n blobSha: \"3459217b7252c6ee0076c68cfdb83001cc74f29e\",\n },\n {\n path: \"actions/generate-qr-code.ts\",\n blobSha: \"98d30e218bfed796d5e402d5ce19a8626d8da0cf\",\n },\n {\n path: \"actions/run.ts\",\n blobSha: \"b46ab15b667c34741364ba08f010f7aca9d0f02e\",\n },\n {\n path: \"agent-native.json\",\n blobSha: \"accc32476792b84557f69e2b48b317c27b5546dc\",\n },\n {\n path: \"package.json\",\n blobSha: \"de917f7c794eceef303bb6f5a434ece39a6ab6fd\",\n },\n {\n path: \"server/db/index.ts\",\n blobSha: \"17007b456530f75a72e7209bdfe9f4bd4c9224e0\",\n },\n {\n path: \"server/db/schema.ts\",\n blobSha: \"2e4cd01c5f46463e78bc7beb6e954f3e526c0b57\",\n },\n {\n path: \"server/plugins/db.ts\",\n blobSha: \"78a5b431c1ad1ea14f593123c090f5376a36df10\",\n },\n {\n path: \"tsconfig.json\",\n blobSha: \"5267473a32dcab8e5dc2c9d9a720afed7f40174c\",\n },\n ],\n },\n ];\n\nconst communitySourceById = new Map(\n CURATED_COMMUNITY_APP_SOURCES.map((source) => [source.id, source]),\n);\n\nfunction requireCommunitySource(sourceId: string): CuratedCommunityAppSource {\n const source = communitySourceById.get(sourceId.trim());\n if (!source) {\n fail(\"That community app is not in Dispatch's reviewed install catalog.\", {\n errorCode: \"unknown_community_app_source\",\n statusCode: 404,\n });\n }\n return source;\n}\n\nfunction communitySourceFailureKind(\n error: unknown,\n): \"unavailable\" | \"integrity\" {\n if (!(error instanceof Error) || !(\"failureKind\" in error)) {\n return \"unavailable\";\n }\n return error.failureKind === \"integrity\" ? \"integrity\" : \"unavailable\";\n}\n\nfunction requireNonShadowingCommunityAppId(appId: string): void {\n const error = getWorkspaceAppIdValidationError(appId);\n if (error) {\n fail(error, { errorCode: \"invalid_community_app_id\", statusCode: 400 });\n }\n if (\n CURATED_WORKSPACE_TEMPLATES.some((template) => template.id === appId) ||\n BUILTIN_AGENT_CATALOG_IDS.includes(appId) ||\n HIDDEN_FIRST_PARTY_AGENT_IDS.has(appId)\n ) {\n fail(\"Community apps cannot use a first-party template app id.\", {\n errorCode: \"community_app_id_shadows_first_party\",\n statusCode: 409,\n });\n }\n}\n\nasync function requireCommunityAppsLab(): Promise<void> {\n const userEmail = currentOwnerEmail().trim();\n const orgId = currentOrgId();\n if (!userEmail || !orgId) {\n fail(\"Sign in to an organization to browse community apps.\", {\n errorCode: \"community_apps_identity_required\",\n statusCode: 403,\n });\n }\n const enabled = await getUserLabEnabled(userEmail, COMMUNITY_APPS_LAB, {\n orgId,\n });\n if (!enabled) {\n fail(\"Community app catalog and installs are disabled for this account.\", {\n errorCode: \"community_apps_lab_disabled\",\n statusCode: 403,\n });\n }\n}\n\nasync function hasAssociatedWorkspace(\n localRuntime = isLocalAppCreationRuntime(),\n): Promise<boolean> {\n if (localRuntime) return Boolean(getWorkspaceInfo().rootPath);\n return Boolean((await getAppCreationSettings()).builderProjectId);\n}\n\nexport async function listCuratedCommunityApps(): Promise<\n CuratedCommunityApp[]\n> {\n await requireCommunityAppsLab();\n const localRuntime = isLocalAppCreationRuntime();\n const [apps, workspaceAvailable] = await Promise.all([\n listWorkspaceApps({ includeAgentCards: false, includeArchived: true }),\n hasAssociatedWorkspace(localRuntime),\n ]);\n return CURATED_COMMUNITY_APP_SOURCES.map((source) => {\n const appWithId = apps.find((app) => app.id === source.appId);\n const installedApp =\n appWithId?.communitySourceId === source.id ? appWithId : null;\n const idConflict = Boolean(appWithId && !installedApp);\n const pending = installedApp?.status === \"pending\";\n const installUnavailableReason = appWithId\n ? idConflict\n ? \"app-id-conflict\"\n : undefined\n : !workspaceAvailable\n ? \"workspace-required\"\n : !localRuntime\n ? \"builder-install-unverified\"\n : undefined;\n return {\n ...source,\n installed: Boolean(installedApp && !pending),\n pending,\n installable: localRuntime && workspaceAvailable && !appWithId,\n ...(installUnavailableReason ? { installUnavailableReason } : {}),\n };\n });\n}\n\nfunction rejectCommunityAppIdConflict(appId: string): never {\n fail(`Workspace app id \"${appId}\" is already in use.`, {\n errorCode: \"community_app_id_conflict\",\n statusCode: 409,\n });\n}\n\nfunction existingInstallResult(\n source: CuratedCommunityAppSource,\n app: WorkspaceAppSummary,\n) {\n return {\n mode:\n app.status === \"pending\"\n ? (\"pending\" as const)\n : (\"already-installed\" as const),\n source,\n app: {\n id: app.id,\n name: app.name,\n path: app.path,\n url: app.url,\n status: app.status ?? \"ready\",\n statusLabel: app.statusLabel ?? null,\n builderUrl: app.builderUrl ?? null,\n branchName: app.branchName ?? null,\n },\n };\n}\n\nfunction buildCommunityInstallPrompt(\n source: CuratedCommunityAppSource,\n appId: string,\n): string {\n const sourceUrl = `https://github.com/${source.repo}/tree/${source.ref}/${source.templatePath}`;\n return [\n \"Install a private workspace app from a reviewed community template.\",\n `The attached source files were fetched from ${sourceUrl} and each file was verified against its pinned Git blob id. Treat those files as the source of truth; do not fetch another ref or substitute other content.`,\n `The app will live at apps/${appId}.`,\n `Source license: ${source.license}. Provenance: ${source.provenance}`,\n \"Copy the reviewed template implementation and its Agent-Native profile, changing only app-specific identifiers needed for this workspace. Do not copy repository secrets, credentials, customer data, or source-app records. Use empty or synthetic seed data only and keep the installed app private to this organization.\",\n ].join(\" \");\n}\n\nexport async function installCuratedCommunityApp(input: {\n sourceId: string;\n appId?: string;\n}): Promise<\n | ReturnType<typeof existingInstallResult>\n | (StartWorkspaceAppCreationResult & {\n mode: Exclude<StartWorkspaceAppCreationResult[\"mode\"], \"app-id-taken\">;\n source: CuratedCommunityAppSource;\n })\n | (Extract<StartWorkspaceAppCreationResult, { mode: \"app-id-taken\" }> & {\n source: CuratedCommunityAppSource;\n })\n> {\n await requireCommunityAppsLab();\n const source = requireCommunitySource(input.sourceId);\n const appId = normalizeWorkspaceAppId(input.appId?.trim() || source.appId);\n requireNonShadowingCommunityAppId(appId);\n\n const localRuntime = isLocalAppCreationRuntime();\n if (!(await hasAssociatedWorkspace(localRuntime))) {\n fail(\"Connect this organization to a workspace before installing apps.\", {\n errorCode: \"community_workspace_required\",\n statusCode: 409,\n });\n }\n\n const existing = (\n await listWorkspaceApps({\n includeAgentCards: false,\n includeArchived: true,\n })\n ).find((app) => app.id === appId);\n if (existing) {\n if (existing.communitySourceId === source.id) {\n return existingInstallResult(source, existing);\n }\n rejectCommunityAppIdConflict(appId);\n }\n\n if (!localRuntime) {\n fail(\n \"Community template installs in Builder workspaces are disabled until the generated branch files can be read back and verified.\",\n {\n errorCode: \"community_builder_install_unverified\",\n statusCode: 503,\n },\n );\n }\n\n let attachments: Awaited<\n ReturnType<typeof loadPinnedCommunitySourceAttachments>\n >;\n try {\n attachments = await loadPinnedCommunitySourceAttachments(source, appId);\n } catch (error) {\n fail(\n \"Dispatch could not verify the pinned community template source. Try again later.\",\n {\n errorCode:\n communitySourceFailureKind(error) === \"integrity\"\n ? \"community_source_integrity_failed\"\n : \"community_source_unavailable\",\n statusCode: 503,\n },\n );\n }\n\n const result = await startWorkspaceAppCreation({\n prompt: buildCommunityInstallPrompt(source, appId),\n appId,\n description: source.description,\n template: source.id,\n communitySourceId: source.id,\n attachments,\n });\n\n if (result.mode === \"app-id-taken\") {\n const raced = (\n await listWorkspaceApps({\n includeAgentCards: false,\n includeArchived: true,\n })\n ).find((app) => app.id === appId);\n if (raced?.communitySourceId === source.id) {\n return existingInstallResult(source, raced);\n }\n if (raced) rejectCommunityAppIdConflict(appId);\n return { ...result, source };\n }\n\n await recordAudit({\n action: \"workspace-app.community-install-requested\",\n targetType: \"workspace-app\",\n targetId: appId,\n summary: `Requested ${source.name} community app installation`,\n metadata: {\n sourceId: source.id,\n repo: source.repo,\n ref: source.ref,\n blobShas: source.files.map((file) => file.blobSha),\n license: source.license,\n },\n });\n return { ...result, source } as typeof result & {\n source: CuratedCommunityAppSource;\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-access-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/mcp-access-store.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAErE,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,eAAe,CAAC;AAEpE,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,wBAAwB,CAAC;IAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8BD,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,OAAO,GACX,4BAA4B,CAc9B;
|
|
1
|
+
{"version":3,"file":"mcp-access-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/mcp-access-store.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAErE,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,eAAe,CAAC;AAEpE,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,wBAAwB,CAAC;IAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8BD,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,OAAO,GACX,4BAA4B,CAc9B;AA4BD,wBAAsB,+BAA+B,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAO7F;AAED,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,IAAI,EAAE,wBAAwB,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAgBxC;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,4BAA4B,GACrC,OAAO,CAKT"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getRequestOrgId, getRequestUserEmail, } from "@agent-native/core/server";
|
|
1
|
+
import { getRequestOrgId, getRequestUserEmail, readOrgMemberRole, } from "@agent-native/core/server";
|
|
3
2
|
import { getOrgSetting, getUserSetting, putOrgSetting, putUserSetting, } from "@agent-native/core/settings";
|
|
4
3
|
export const MCP_APP_ACCESS_SETTINGS_KEY = "dispatch-mcp-app-access";
|
|
5
4
|
class McpAppAccessError extends Error {
|
|
@@ -43,14 +42,7 @@ async function assertCanManageMcpAppAccess(scope) {
|
|
|
43
42
|
return;
|
|
44
43
|
let role = null;
|
|
45
44
|
try {
|
|
46
|
-
|
|
47
|
-
sql: `SELECT role FROM org_members
|
|
48
|
-
WHERE org_id = ? AND LOWER(email) = ?
|
|
49
|
-
AND federation_removal_pending_at IS NULL
|
|
50
|
-
LIMIT 1`,
|
|
51
|
-
args: [scope.id, scope.actor.toLowerCase()],
|
|
52
|
-
});
|
|
53
|
-
role = rows[0]?.role;
|
|
45
|
+
role = await readOrgMemberRole(scope.id, scope.actor);
|
|
54
46
|
}
|
|
55
47
|
catch {
|
|
56
48
|
// Fail closed when org membership cannot be verified.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-access-store.js","sourceRoot":"","sources":["../../../src/server/lib/mcp-access-store.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"mcp-access-store.js","sourceRoot":"","sources":["../../../src/server/lib/mcp-access-store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getRequestOrgId,\n getRequestUserEmail,\n readOrgMemberRole,\n} from \"@agent-native/core/server\";\nimport {\n getOrgSetting,\n getUserSetting,\n putOrgSetting,\n putUserSetting,\n} from \"@agent-native/core/settings\";\n\nexport const MCP_APP_ACCESS_SETTINGS_KEY = \"dispatch-mcp-app-access\";\n\nexport type DispatchMcpAppAccessMode = \"all-apps\" | \"selected-apps\";\n\nexport interface DispatchMcpAppAccessSettings {\n mode: DispatchMcpAppAccessMode;\n selectedAppIds: string[];\n updatedAt?: string;\n updatedBy?: string;\n}\n\nclass McpAppAccessError extends Error {\n statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = \"McpAppAccessError\";\n this.statusCode = statusCode;\n }\n}\n\ninterface AccessScope {\n kind: \"org\" | \"user\";\n id: string;\n actor: string;\n}\n\nfunction uniqueAppIds(values: unknown): string[] {\n const input = Array.isArray(values) ? values : [];\n return Array.from(\n new Set(\n input\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim().toLowerCase())\n .filter(Boolean),\n ),\n );\n}\n\nexport function normalizeMcpAppAccessSettings(\n raw: unknown,\n): DispatchMcpAppAccessSettings {\n const record =\n raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n const mode = record.mode === \"selected-apps\" ? \"selected-apps\" : \"all-apps\";\n return {\n mode,\n selectedAppIds: uniqueAppIds(record.selectedAppIds),\n updatedAt:\n typeof record.updatedAt === \"string\" ? record.updatedAt : undefined,\n updatedBy:\n typeof record.updatedBy === \"string\" ? record.updatedBy : undefined,\n };\n}\n\nfunction currentAccessScope(): AccessScope {\n const actor = getRequestUserEmail();\n if (!actor) throw new Error(\"no authenticated user\");\n const orgId = getRequestOrgId();\n if (orgId) return { kind: \"org\", id: orgId, actor };\n return { kind: \"user\", id: actor, actor };\n}\n\nasync function assertCanManageMcpAppAccess(scope: AccessScope): Promise<void> {\n if (scope.kind === \"user\") return;\n\n let role: string | null = null;\n try {\n role = await readOrgMemberRole(scope.id, scope.actor);\n } catch {\n // Fail closed when org membership cannot be verified.\n }\n\n if (role !== \"owner\" && role !== \"admin\") {\n throw new McpAppAccessError(\n \"Only organization owners and admins can change Dispatch MCP app access.\",\n 403,\n );\n }\n}\n\nexport async function getDispatchMcpAppAccessSettings(): Promise<DispatchMcpAppAccessSettings> {\n const scope = currentAccessScope();\n const raw =\n scope.kind === \"org\"\n ? await getOrgSetting(scope.id, MCP_APP_ACCESS_SETTINGS_KEY)\n : await getUserSetting(scope.id, MCP_APP_ACCESS_SETTINGS_KEY);\n return normalizeMcpAppAccessSettings(raw);\n}\n\nexport async function setDispatchMcpAppAccessSettings(input: {\n mode: DispatchMcpAppAccessMode;\n selectedAppIds?: string[];\n}): Promise<DispatchMcpAppAccessSettings> {\n const scope = currentAccessScope();\n await assertCanManageMcpAppAccess(scope);\n const next: DispatchMcpAppAccessSettings = {\n mode: input.mode,\n selectedAppIds: uniqueAppIds(input.selectedAppIds),\n updatedAt: new Date().toISOString(),\n updatedBy: scope.actor,\n };\n const value = next as unknown as Record<string, unknown>;\n if (scope.kind === \"org\") {\n await putOrgSetting(scope.id, MCP_APP_ACCESS_SETTINGS_KEY, value);\n } else {\n await putUserSetting(scope.id, MCP_APP_ACCESS_SETTINGS_KEY, value);\n }\n return next;\n}\n\nexport function isAppAllowedByMcpAccess(\n appId: string,\n settings: DispatchMcpAppAccessSettings,\n): boolean {\n const normalized = appId.trim().toLowerCase();\n if (!normalized) return false;\n if (settings.mode === \"all-apps\") return true;\n return settings.selectedAppIds.includes(normalized);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-debug-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/thread-debug-store.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,iCAAiC,CAAC;AAkCzC,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,YAAY,CAAC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AA0CD,QAAA,MAAM,yBAAyB,YAAI,SAAS,EAAE,SAAS,EAAE,WAAW,CAAU,CAAC;AAE/E,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/E,KAAK,6BAA6B,GAC9B,IAAI,GACJ,cAAc,GACd,aAAa,GACb,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"thread-debug-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/thread-debug-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { fail } from "@agent-native/core/action";
|
|
2
2
|
import { classifyAgentFailure, } from "@agent-native/core/agent/engine";
|
|
3
3
|
import { createDbExec, getDbExec } from "@agent-native/core/db";
|
|
4
|
-
import { getAppConfig } from "@agent-native/core/server";
|
|
4
|
+
import { getAppConfig, readOrgMemberRole } from "@agent-native/core/server";
|
|
5
5
|
import { ForbiddenError } from "@agent-native/core/sharing";
|
|
6
6
|
import { isThreadDebugNoiseEventType, THREAD_DEBUG_NOISE_EVENT_TYPES, } from "../../shared/thread-debug-noise.js";
|
|
7
7
|
import { isDispatchEnvironmentAdmin } from "./admin-config.js";
|
|
@@ -306,11 +306,7 @@ async function currentDbRows(sql, args = []) {
|
|
|
306
306
|
async function viewerOrgRole(orgId, viewerEmail) {
|
|
307
307
|
if (!orgId)
|
|
308
308
|
return null;
|
|
309
|
-
|
|
310
|
-
WHERE org_id = ? AND LOWER(email) = ?
|
|
311
|
-
AND federation_removal_pending_at IS NULL
|
|
312
|
-
LIMIT 1`, [orgId, viewerEmail.toLowerCase()]);
|
|
313
|
-
return typeof rows[0]?.role === "string" ? rows[0].role : null;
|
|
309
|
+
return readOrgMemberRole(orgId, viewerEmail);
|
|
314
310
|
}
|
|
315
311
|
async function currentOrgMembers(orgId) {
|
|
316
312
|
if (!orgId)
|
|
@@ -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 { fail } from \"@agent-native/core/action\";\nimport {\n classifyAgentFailure,\n type AgentFailureRegime,\n} from \"@agent-native/core/agent/engine\";\nimport { createDbExec, getDbExec, type DbExec } from \"@agent-native/core/db\";\nimport { getAppConfig } from \"@agent-native/core/server\";\nimport { ForbiddenError } from \"@agent-native/core/sharing\";\n\nimport {\n isThreadDebugNoiseEventType,\n THREAD_DEBUG_NOISE_EVENT_TYPES,\n} from \"../../shared/thread-debug-noise.js\";\nimport { isDispatchEnvironmentAdmin } from \"./admin-config.js\";\nimport { currentOrgId, currentOwnerEmail } from \"./dispatch-store.js\";\n\nconst NOISE_EVENT_SQL_FILTER = THREAD_DEBUG_NOISE_EVENT_TYPES.map(\n () => \"AND event_data NOT LIKE ?\",\n).join(\"\\n \");\nconst NOISE_EVENT_SQL_PARAMS = THREAD_DEBUG_NOISE_EVENT_TYPES.map(\n (type) => `{\"type\":\"${type}\"%`,\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 databaseUrlEnv?: 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 canInspectAll: boolean;\n}\n\nexport interface DebugAccess {\n viewerEmail: string;\n orgId: string | null;\n role: string | null;\n envAdmin: boolean;\n superOrg: 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 in_flight_since?: number | string | null;\n dispatch_payload?: 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 escapeLike(value: string): string {\n return value.replace(/([\\\\%_])/g, \"\\\\$1\");\n}\n\nfunction missingTableName(error: unknown): string | null {\n const message = String((error as Error)?.message ?? error);\n const patterns = [\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 ];\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(\n typeof value === \"string\" ? value : JSON.stringify(value),\n ) 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 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 databaseUrlEnv,\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 sources.push({\n id,\n label: labelFromSourceId(id),\n kind: \"env\",\n databaseUrl: value,\n databaseUrlEnv: key,\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 });\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 // A configured source whose URL env var is unset is a deploy\n // misconfiguration: untyped on purpose, so the boundary captures it.\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 fail(`Thread debug source \"${normalized}\" is not configured.`, {\n errorCode: \"thread_debug_source_not_configured\",\n statusCode: 404,\n });\n }\n return {\n id: normalized,\n label: labelFromSourceId(normalized),\n kind: \"env\",\n databaseUrl,\n databaseUrlEnv,\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 if (!execCache.has(cacheKey)) {\n execCache.set(\n cacheKey,\n createDbExec({\n url: source.databaseUrl,\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\n WHERE org_id = ? AND LOWER(email) = ?\n AND federation_removal_pending_at IS NULL\n 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\n WHERE org_id = ? AND federation_removal_pending_at IS NULL`,\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 = isDispatchEnvironmentAdmin(viewerEmail);\n const orgAdmin = role === \"owner\" || role === \"admin\";\n const canInspectAll = envAdmin || orgAdmin;\n // Remote sources keep their own org rosters, so Dispatch membership cannot\n // scope them; the observability super org is the one cross-org review grant.\n const superOrgId = getAppConfig().observability.superOrgId;\n const superOrg = Boolean(orgId && orgAdmin && superOrgId === orgId);\n const memberEmails = canInspectAll\n ? await currentOrgMembers(orgId)\n : [viewerEmail];\n return {\n viewerEmail,\n orgId,\n role,\n envAdmin,\n superOrg,\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.superOrg &&\n !access.memberEmails.some(\n (email) => email.toLowerCase() === requested.toLowerCase(),\n )\n ) {\n fail(\"The requested owner is not a member of the current organization.\", {\n errorCode: \"forbidden\",\n statusCode: 403,\n });\n }\n return {\n sql: `${column} = ?`,\n args: [requested],\n label: requested,\n };\n }\n\n if (access.superOrg) {\n return { sql: \"1 = 1\", args: [], label: \"all organizations\" };\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 inFlightSince: nullableNumberField(row.in_flight_since),\n hasDispatchPayload:\n row.dispatch_payload !== null &&\n row.dispatch_payload !== undefined &&\n String(row.dispatch_payload).length > 0,\n events,\n };\n}\n\nfunction parseRunEvent(row: Record<string, unknown>) {\n const raw =\n typeof row.event_data === \"string\"\n ? row.event_data\n : JSON.stringify(row.event_data ?? \"\");\n return {\n runId:\n typeof row.run_id === \"string\" || typeof row.run_id === \"number\"\n ? String(row.run_id)\n : \"\",\n seq: numberField(row.seq),\n eventAt: nullableNumberField(row.event_at),\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 superOrg: access.superOrg,\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 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(\n typeof value === \"string\" ? value : JSON.stringify(value),\n );\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(owner_email) LIKE ? ESCAPE '\\\\' OR LOWER(thread_data) LIKE ? ESCAPE '\\\\' OR LOWER(source_url) LIKE ? ESCAPE '\\\\' OR id = ? OR scope_id = ?\" +\n runIdClause +\n \")\",\n );\n args.push(pattern, pattern, pattern, pattern, pattern, q, q);\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 fail(\"A thread ID or request/run ID is required.\", {\n errorCode: \"thread_id_required\",\n statusCode: 400,\n });\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 fail(`Thread or request/run ID \"${requestedId}\" was not found.`, {\n errorCode: \"not_found\",\n statusCode: 404,\n });\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 let 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 // A deep-linked run can be older than the most recent `maxRuns` runs; fetch\n // it explicitly so the inspector opens the run someone was sent to debug\n // instead of silently falling back to the latest one.\n if (resolvedRunId && !runRows.some((run) => run.id === resolvedRunId)) {\n const lookupRunRows = await optionalRows<AgentRunRow>(\n exec,\n `SELECT r.*\n FROM agent_runs r\n WHERE r.thread_id = ? AND r.id = ?\n LIMIT 1`,\n [row.id, resolvedRunId],\n );\n if (lookupRunRows[0]) {\n runRows = [...runRows, lookupRunRows[0]].sort(\n (a, b) => Number(b.started_at) - Number(a.started_at),\n );\n }\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_at, event_data\n FROM agent_run_events\n WHERE run_id = ?\n ORDER BY seq ASC\n LIMIT ?`,\n [run.id, maxEvents],\n );\n // Streamed tool input deltas can fill the window long before the run ends,\n // hiding every later tool call; keep fetching the non-stream events past it.\n const lastSeq = eventRows.at(-1)?.seq;\n const laterRows =\n eventRows.length === maxEvents && lastSeq != null\n ? await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT run_id, seq, event_at, event_data\n FROM agent_run_events\n WHERE run_id = ?\n AND seq > ?\n ${NOISE_EVENT_SQL_FILTER}\n ORDER BY seq ASC\n LIMIT ?`,\n [run.id, lastSeq, ...NOISE_EVENT_SQL_PARAMS, maxEvents],\n )\n : [];\n // The SQL prefix match is only a fast path; drop any noise event whose\n // serialized keys did not start with \"type\".\n const events = eventRows.map(parseRunEvent);\n for (const entry of laterRows.map(parseRunEvent)) {\n if (!isThreadDebugNoiseEventType(entry.event?.type)) events.push(entry);\n }\n runs.push(serializeRun(run, events));\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 { fail } from \"@agent-native/core/action\";\nimport {\n classifyAgentFailure,\n type AgentFailureRegime,\n} from \"@agent-native/core/agent/engine\";\nimport { createDbExec, getDbExec, type DbExec } from \"@agent-native/core/db\";\nimport { getAppConfig, readOrgMemberRole } from \"@agent-native/core/server\";\nimport { ForbiddenError } from \"@agent-native/core/sharing\";\n\nimport {\n isThreadDebugNoiseEventType,\n THREAD_DEBUG_NOISE_EVENT_TYPES,\n} from \"../../shared/thread-debug-noise.js\";\nimport { isDispatchEnvironmentAdmin } from \"./admin-config.js\";\nimport { currentOrgId, currentOwnerEmail } from \"./dispatch-store.js\";\n\nconst NOISE_EVENT_SQL_FILTER = THREAD_DEBUG_NOISE_EVENT_TYPES.map(\n () => \"AND event_data NOT LIKE ?\",\n).join(\"\\n \");\nconst NOISE_EVENT_SQL_PARAMS = THREAD_DEBUG_NOISE_EVENT_TYPES.map(\n (type) => `{\"type\":\"${type}\"%`,\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 databaseUrlEnv?: 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 canInspectAll: boolean;\n}\n\nexport interface DebugAccess {\n viewerEmail: string;\n orgId: string | null;\n role: string | null;\n envAdmin: boolean;\n superOrg: 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 in_flight_since?: number | string | null;\n dispatch_payload?: 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 escapeLike(value: string): string {\n return value.replace(/([\\\\%_])/g, \"\\\\$1\");\n}\n\nfunction missingTableName(error: unknown): string | null {\n const message = String((error as Error)?.message ?? error);\n const patterns = [\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 ];\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(\n typeof value === \"string\" ? value : JSON.stringify(value),\n ) 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 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 databaseUrlEnv,\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 sources.push({\n id,\n label: labelFromSourceId(id),\n kind: \"env\",\n databaseUrl: value,\n databaseUrlEnv: key,\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 });\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 // A configured source whose URL env var is unset is a deploy\n // misconfiguration: untyped on purpose, so the boundary captures it.\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 fail(`Thread debug source \"${normalized}\" is not configured.`, {\n errorCode: \"thread_debug_source_not_configured\",\n statusCode: 404,\n });\n }\n return {\n id: normalized,\n label: labelFromSourceId(normalized),\n kind: \"env\",\n databaseUrl,\n databaseUrlEnv,\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 if (!execCache.has(cacheKey)) {\n execCache.set(\n cacheKey,\n createDbExec({\n url: source.databaseUrl,\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 return readOrgMemberRole(orgId, viewerEmail);\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\n WHERE org_id = ? AND federation_removal_pending_at IS NULL`,\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 = isDispatchEnvironmentAdmin(viewerEmail);\n const orgAdmin = role === \"owner\" || role === \"admin\";\n const canInspectAll = envAdmin || orgAdmin;\n // Remote sources keep their own org rosters, so Dispatch membership cannot\n // scope them; the observability super org is the one cross-org review grant.\n const superOrgId = getAppConfig().observability.superOrgId;\n const superOrg = Boolean(orgId && orgAdmin && superOrgId === orgId);\n const memberEmails = canInspectAll\n ? await currentOrgMembers(orgId)\n : [viewerEmail];\n return {\n viewerEmail,\n orgId,\n role,\n envAdmin,\n superOrg,\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.superOrg &&\n !access.memberEmails.some(\n (email) => email.toLowerCase() === requested.toLowerCase(),\n )\n ) {\n fail(\"The requested owner is not a member of the current organization.\", {\n errorCode: \"forbidden\",\n statusCode: 403,\n });\n }\n return {\n sql: `${column} = ?`,\n args: [requested],\n label: requested,\n };\n }\n\n if (access.superOrg) {\n return { sql: \"1 = 1\", args: [], label: \"all organizations\" };\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 inFlightSince: nullableNumberField(row.in_flight_since),\n hasDispatchPayload:\n row.dispatch_payload !== null &&\n row.dispatch_payload !== undefined &&\n String(row.dispatch_payload).length > 0,\n events,\n };\n}\n\nfunction parseRunEvent(row: Record<string, unknown>) {\n const raw =\n typeof row.event_data === \"string\"\n ? row.event_data\n : JSON.stringify(row.event_data ?? \"\");\n return {\n runId:\n typeof row.run_id === \"string\" || typeof row.run_id === \"number\"\n ? String(row.run_id)\n : \"\",\n seq: numberField(row.seq),\n eventAt: nullableNumberField(row.event_at),\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 superOrg: access.superOrg,\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 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(\n typeof value === \"string\" ? value : JSON.stringify(value),\n );\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(owner_email) LIKE ? ESCAPE '\\\\' OR LOWER(thread_data) LIKE ? ESCAPE '\\\\' OR LOWER(source_url) LIKE ? ESCAPE '\\\\' OR id = ? OR scope_id = ?\" +\n runIdClause +\n \")\",\n );\n args.push(pattern, pattern, pattern, pattern, pattern, q, q);\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 fail(\"A thread ID or request/run ID is required.\", {\n errorCode: \"thread_id_required\",\n statusCode: 400,\n });\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 fail(`Thread or request/run ID \"${requestedId}\" was not found.`, {\n errorCode: \"not_found\",\n statusCode: 404,\n });\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 let 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 // A deep-linked run can be older than the most recent `maxRuns` runs; fetch\n // it explicitly so the inspector opens the run someone was sent to debug\n // instead of silently falling back to the latest one.\n if (resolvedRunId && !runRows.some((run) => run.id === resolvedRunId)) {\n const lookupRunRows = await optionalRows<AgentRunRow>(\n exec,\n `SELECT r.*\n FROM agent_runs r\n WHERE r.thread_id = ? AND r.id = ?\n LIMIT 1`,\n [row.id, resolvedRunId],\n );\n if (lookupRunRows[0]) {\n runRows = [...runRows, lookupRunRows[0]].sort(\n (a, b) => Number(b.started_at) - Number(a.started_at),\n );\n }\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_at, event_data\n FROM agent_run_events\n WHERE run_id = ?\n ORDER BY seq ASC\n LIMIT ?`,\n [run.id, maxEvents],\n );\n // Streamed tool input deltas can fill the window long before the run ends,\n // hiding every later tool call; keep fetching the non-stream events past it.\n const lastSeq = eventRows.at(-1)?.seq;\n const laterRows =\n eventRows.length === maxEvents && lastSeq != null\n ? await optionalRows<Record<string, unknown>>(\n exec,\n `SELECT run_id, seq, event_at, event_data\n FROM agent_run_events\n WHERE run_id = ?\n AND seq > ?\n ${NOISE_EVENT_SQL_FILTER}\n ORDER BY seq ASC\n LIMIT ?`,\n [run.id, lastSeq, ...NOISE_EVENT_SQL_PARAMS, maxEvents],\n )\n : [];\n // The SQL prefix match is only a fast path; drop any noise event whose\n // serialized keys did not start with \"type\".\n const events = eventRows.map(parseRunEvent);\n for (const entry of laterRows.map(parseRunEvent)) {\n if (!isThreadDebugNoiseEventType(entry.event?.type)) events.push(entry);\n }\n runs.push(serializeRun(run, events));\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-metrics-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/usage-metrics-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usage-metrics-store.d.ts","sourceRoot":"","sources":["../../../src/server/lib/usage-metrics-store.ts"],"names":[],"mappings":"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"}
|