@agent-native/core 0.16.1 → 0.16.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +21 -5
  2. package/dist/cli/code-agent-executor.js +1 -1
  3. package/dist/cli/code-agent-executor.js.map +1 -1
  4. package/dist/cli/code.d.ts.map +1 -1
  5. package/dist/cli/code.js +29 -4
  6. package/dist/cli/code.js.map +1 -1
  7. package/dist/client/AgentPanel.d.ts.map +1 -1
  8. package/dist/client/AgentPanel.js +9 -1
  9. package/dist/client/AgentPanel.js.map +1 -1
  10. package/dist/client/AssistantChat.js +2 -2
  11. package/dist/client/AssistantChat.js.map +1 -1
  12. package/dist/client/ConnectBuilderCard.js +1 -1
  13. package/dist/client/ConnectBuilderCard.js.map +1 -1
  14. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  15. package/dist/client/components/CodeRequiredDialog.js +3 -1
  16. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  17. package/dist/client/composer/AgentComposerFrame.d.ts +3 -1
  18. package/dist/client/composer/AgentComposerFrame.d.ts.map +1 -1
  19. package/dist/client/composer/AgentComposerFrame.js +3 -3
  20. package/dist/client/composer/AgentComposerFrame.js.map +1 -1
  21. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  22. package/dist/client/composer/ComposerPlusMenu.js +2 -7
  23. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  24. package/dist/client/composer/PromptComposer.d.ts +4 -1
  25. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  26. package/dist/client/composer/PromptComposer.js +3 -3
  27. package/dist/client/composer/PromptComposer.js.map +1 -1
  28. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  29. package/dist/client/composer/TiptapComposer.js +13 -3
  30. package/dist/client/composer/TiptapComposer.js.map +1 -1
  31. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  32. package/dist/client/composer/useVoiceDictation.js +16 -10
  33. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  34. package/dist/client/onboarding/OnboardingPanel.js +1 -1
  35. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  36. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  37. package/dist/client/settings/BackgroundAgentSection.js +9 -2
  38. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  39. package/dist/client/settings/BrowserSection.d.ts.map +1 -1
  40. package/dist/client/settings/BrowserSection.js +17 -3
  41. package/dist/client/settings/BrowserSection.js.map +1 -1
  42. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  43. package/dist/client/settings/SettingsPanel.js +5 -5
  44. package/dist/client/settings/SettingsPanel.js.map +1 -1
  45. package/dist/client/settings/useBuilderStatus.d.ts +15 -2
  46. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  47. package/dist/client/settings/useBuilderStatus.js +99 -11
  48. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  49. package/dist/client/settings/useBuilderStatus.spec.js +12 -6
  50. package/dist/client/settings/useBuilderStatus.spec.js.map +1 -1
  51. package/dist/code-agents/background-controller.d.ts +39 -0
  52. package/dist/code-agents/background-controller.d.ts.map +1 -0
  53. package/dist/code-agents/background-controller.js +249 -0
  54. package/dist/code-agents/background-controller.js.map +1 -0
  55. package/dist/code-agents/background-run.d.ts +58 -0
  56. package/dist/code-agents/background-run.d.ts.map +1 -0
  57. package/dist/code-agents/background-run.js +58 -0
  58. package/dist/code-agents/background-run.js.map +1 -0
  59. package/dist/code-agents/index.d.ts +2 -0
  60. package/dist/code-agents/index.d.ts.map +1 -1
  61. package/dist/code-agents/index.js +2 -0
  62. package/dist/code-agents/index.js.map +1 -1
  63. package/dist/connections/index.d.ts +1 -0
  64. package/dist/connections/index.d.ts.map +1 -1
  65. package/dist/connections/index.js +1 -0
  66. package/dist/connections/index.js.map +1 -1
  67. package/dist/connections/reader.d.ts +248 -0
  68. package/dist/connections/reader.d.ts.map +1 -0
  69. package/dist/connections/reader.js +461 -0
  70. package/dist/connections/reader.js.map +1 -0
  71. package/dist/credentials/index.d.ts +11 -0
  72. package/dist/credentials/index.d.ts.map +1 -1
  73. package/dist/credentials/index.js +40 -15
  74. package/dist/credentials/index.js.map +1 -1
  75. package/dist/index.d.ts +2 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +2 -2
  78. package/dist/index.js.map +1 -1
  79. package/dist/server/agent-chat-plugin.d.ts +18 -0
  80. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  81. package/dist/server/agent-chat-plugin.js +57 -9
  82. package/dist/server/agent-chat-plugin.js.map +1 -1
  83. package/dist/server/agent-teams.d.ts +66 -1
  84. package/dist/server/agent-teams.d.ts.map +1 -1
  85. package/dist/server/agent-teams.js +433 -16
  86. package/dist/server/agent-teams.js.map +1 -1
  87. package/dist/server/builder-browser.d.ts +11 -0
  88. package/dist/server/builder-browser.d.ts.map +1 -1
  89. package/dist/server/builder-browser.js +45 -0
  90. package/dist/server/builder-browser.js.map +1 -1
  91. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  92. package/dist/server/core-routes-plugin.js +25 -2
  93. package/dist/server/core-routes-plugin.js.map +1 -1
  94. package/dist/templates/workspace-root/AGENTS.md +5 -5
  95. package/dist/templates/workspace-root/README.md +1 -1
  96. package/dist/workspace-connections/credentials.d.ts +64 -0
  97. package/dist/workspace-connections/credentials.d.ts.map +1 -0
  98. package/dist/workspace-connections/credentials.js +378 -0
  99. package/dist/workspace-connections/credentials.js.map +1 -0
  100. package/dist/workspace-connections/index.d.ts +2 -1
  101. package/dist/workspace-connections/index.d.ts.map +1 -1
  102. package/dist/workspace-connections/index.js +2 -1
  103. package/dist/workspace-connections/index.js.map +1 -1
  104. package/dist/workspace-connections/store.d.ts +16 -0
  105. package/dist/workspace-connections/store.d.ts.map +1 -1
  106. package/dist/workspace-connections/store.js +57 -1
  107. package/dist/workspace-connections/store.js.map +1 -1
  108. package/docs/content/agent-teams.md +22 -5
  109. package/docs/content/cloneable-saas.md +2 -2
  110. package/docs/content/code-agents-ui.md +103 -3
  111. package/docs/content/creating-templates.md +16 -0
  112. package/docs/content/getting-started.md +40 -14
  113. package/docs/content/migration-workbench.md +25 -2
  114. package/docs/content/multi-app-workspace.md +1 -1
  115. package/docs/content/template-analytics.md +17 -1
  116. package/docs/content/template-brain.md +57 -28
  117. package/docs/content/template-dispatch.md +9 -2
  118. package/docs/content/workspace-connections.md +63 -14
  119. package/docs/content/workspace-management.md +9 -2
  120. package/docs/content/workspace.md +12 -5
  121. package/package.json +1 -1
  122. package/src/templates/workspace-root/AGENTS.md +5 -5
  123. package/src/templates/workspace-root/README.md +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/workspace-connections/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n getDbExec,\n intType,\n isPostgres,\n isUniqueViolation,\n retryOnDdlRace,\n safeJsonParse,\n type DbExec,\n} from \"../db/client.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport {\n listWorkspaceConnectionProviders,\n type WorkspaceConnectionCapability,\n type WorkspaceConnectionProvider,\n type WorkspaceConnectionTemplateUse,\n} from \"../connections/catalog.js\";\n\nexport type WorkspaceConnectionStatus =\n | \"connected\"\n | \"checking\"\n | \"needs_reauth\"\n | \"error\"\n | \"disabled\";\n\nexport interface WorkspaceConnectionCredentialRef {\n key: string;\n scope?: \"user\" | \"org\" | \"workspace\";\n provider?: string;\n label?: string;\n [key: string]: unknown;\n}\n\nexport interface WorkspaceConnection {\n id: string;\n provider: string;\n label: string;\n accountId: string | null;\n accountLabel: string | null;\n status: WorkspaceConnectionStatus;\n scopes: string[];\n config: Record<string, unknown>;\n allowedApps: string[];\n credentialRefs: WorkspaceConnectionCredentialRef[];\n ownerEmail: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n lastCheckedAt: string | null;\n lastError: string | null;\n}\n\nexport type SerializedWorkspaceConnection = WorkspaceConnection;\n\nexport interface WorkspaceConnectionGrant {\n id: string;\n connectionId: string;\n provider: string;\n appId: string;\n scopes: string[];\n config: Record<string, unknown>;\n credentialRefs: WorkspaceConnectionCredentialRef[];\n grantedByEmail: string;\n ownerEmail: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type SerializedWorkspaceConnectionGrant = WorkspaceConnectionGrant;\n\nexport interface ListWorkspaceConnectionsOptions {\n provider?: string;\n appId?: string;\n includeDisabled?: boolean;\n}\n\nexport interface ListWorkspaceConnectionGrantsOptions {\n connectionId?: string;\n appId?: string;\n provider?: string;\n}\n\nexport interface ListWorkspaceConnectionsForAppOptions {\n appId: string;\n provider?: string;\n includeDisabled?: boolean;\n}\n\nexport interface ResolveWorkspaceConnectionForAppOptions extends ListWorkspaceConnectionsForAppOptions {\n connectionId?: string;\n requireConnected?: boolean;\n}\n\nexport interface UpsertWorkspaceConnectionInput {\n id?: string;\n provider: string;\n label?: string;\n accountId?: string | null;\n accountLabel?: string | null;\n status?: WorkspaceConnectionStatus;\n scopes?: string[];\n config?: Record<string, unknown>;\n allowedApps?: string[];\n credentialRefs?: WorkspaceConnectionCredentialRef[];\n lastCheckedAt?: Date | number | string | null;\n lastError?: string | null;\n}\n\nexport interface UpsertWorkspaceConnectionGrantInput {\n id?: string;\n connectionId: string;\n appId: string;\n provider?: string;\n scopes?: string[];\n config?: Record<string, unknown>;\n credentialRefs?: WorkspaceConnectionCredentialRef[];\n}\n\nexport type WorkspaceConnectionAppAccessMode =\n | \"all-apps\"\n | \"allowed-app\"\n | \"explicit-grant\"\n | \"unavailable\";\n\nexport interface WorkspaceConnectionAppAccess {\n appId: string;\n available: boolean;\n mode: WorkspaceConnectionAppAccessMode;\n reason: string;\n grantId: string | null;\n}\n\nexport type WorkspaceConnectionGrantState =\n | \"connected\"\n | \"granted\"\n | \"needs_grant\"\n | \"not_connected\";\n\nexport type WorkspaceConnectionGrantAvailability =\n | \"available\"\n | \"needs_grant\"\n | \"not_connected\";\n\nexport type WorkspaceConnectionProviderReadinessStatus =\n | \"ready\"\n | \"checking\"\n | \"needs_credentials\"\n | \"needs_attention\"\n | \"disabled\"\n | \"not_configured\";\n\nexport interface WorkspaceConnectionPublicCredentialRef {\n key: string;\n scope?: string;\n provider?: string;\n label?: string;\n source: \"connection\" | \"grant\";\n}\n\nexport interface WorkspaceConnectionExplicitGrantSummary {\n id: string;\n appId: string;\n scopes: string[];\n credentialRefs: WorkspaceConnectionPublicCredentialRef[];\n updatedAt: string;\n}\n\nexport interface WorkspaceConnectionForAppSummary {\n id: string;\n label: string;\n provider: string;\n accountId: string | null;\n accountLabel: string | null;\n status: WorkspaceConnectionStatus;\n grantedToApp: boolean;\n grantScope: \"all-apps\" | \"selected-apps\";\n appAccess: WorkspaceConnectionAppAccess;\n allowedApps: string[];\n credentialRefs: WorkspaceConnectionPublicCredentialRef[];\n lastCheckedAt: string | null;\n lastError: string | null;\n explicitGrant: WorkspaceConnectionExplicitGrantSummary | null;\n}\n\nexport interface WorkspaceConnectionForApp extends SerializedWorkspaceConnection {\n appAccess: WorkspaceConnectionAppAccess;\n explicitGrant: SerializedWorkspaceConnectionGrant | null;\n}\n\nexport interface ResolvedWorkspaceConnectionForApp {\n available: boolean;\n connection: WorkspaceConnectionForApp | null;\n appAccess: WorkspaceConnectionAppAccess | null;\n reason: string;\n}\n\nexport interface WorkspaceConnectionProviderAppSummary {\n appId: string;\n provider: string;\n grantState: WorkspaceConnectionGrantState;\n grantAvailability: WorkspaceConnectionGrantAvailability;\n grantAvailabilityMessage: string;\n connectionCount: number;\n grantedConnectionCount: number;\n activeConnectionCount: number;\n ungrantedConnectionCount: number;\n unhealthyGrantedConnectionCount: number;\n explicitGrantCount: number;\n credentialRefCount: number;\n hasWorkspaceConnection: boolean;\n hasGrantedWorkspaceConnection: boolean;\n hasActiveWorkspaceConnection: boolean;\n statuses: WorkspaceConnectionStatus[];\n connections: WorkspaceConnectionForAppSummary[];\n}\n\nexport interface WorkspaceConnectionProviderReadiness {\n status: WorkspaceConnectionProviderReadinessStatus;\n connectionCount: number;\n activeConnectionCount: number;\n readyConnectionCount: number;\n requiredCredentialKeys: string[];\n missingRequiredCredentialKeys: string[];\n appGrant: WorkspaceConnectionProviderAppSummary | null;\n}\n\nexport interface WorkspaceConnectionProviderLike {\n id: string;\n label?: string;\n credentialKeys?: readonly {\n key: string;\n required?: boolean;\n }[];\n}\n\nexport interface SummarizeWorkspaceConnectionProviderForAppOptions {\n providerId: string;\n appId: string;\n connections: SerializedWorkspaceConnection[];\n grants?: SerializedWorkspaceConnectionGrant[];\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface SummarizeWorkspaceConnectionProviderReadinessOptions {\n provider: WorkspaceConnectionProviderLike;\n connections: SerializedWorkspaceConnection[];\n grants?: SerializedWorkspaceConnectionGrant[];\n appId?: string;\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface ListWorkspaceConnectionProviderCatalogForAppOptions {\n appId: string;\n provider?: string;\n capability?: WorkspaceConnectionCapability;\n templateUse?: WorkspaceConnectionTemplateUse;\n includeDisabled?: boolean;\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface WorkspaceConnectionProviderCatalogForAppItem extends WorkspaceConnectionProvider {\n workspaceConnection: WorkspaceConnectionProviderAppSummary;\n readiness: WorkspaceConnectionProviderReadiness;\n}\n\nexport interface WorkspaceConnectionProviderCatalogForApp {\n appId: string;\n providers: WorkspaceConnectionProviderCatalogForAppItem[];\n connections: SerializedWorkspaceConnection[];\n grants: SerializedWorkspaceConnectionGrant[];\n counts: {\n providers: number;\n connections: number;\n grants: number;\n readyProviders: number;\n };\n}\n\nlet _initPromise: Promise<void> | undefined;\n\nfunction workspaceConnectionsTable(): string {\n return isPostgres()\n ? \"public.workspace_connections\"\n : \"workspace_connections\";\n}\n\nfunction workspaceConnectionGrantsTable(): string {\n return isPostgres()\n ? \"public.workspace_connection_grants\"\n : \"workspace_connection_grants\";\n}\n\nfunction isDuplicateColumnError(err: unknown): boolean {\n const code = String((err as { code?: unknown })?.code ?? \"\");\n const message = String((err as { message?: unknown })?.message ?? err)\n .toLowerCase()\n .trim();\n return (\n code === \"42701\" ||\n message.includes(\"duplicate column\") ||\n message.includes(\"already exists\")\n );\n}\n\nasync function ensureColumn(\n client: DbExec,\n table: string,\n name: string,\n definition: string,\n): Promise<void> {\n try {\n await retryOnDdlRace(() =>\n client.execute(\n isPostgres()\n ? `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS ${name} ${definition}`\n : `ALTER TABLE ${table} ADD COLUMN ${name} ${definition}`,\n ),\n );\n } catch (err) {\n if (!isDuplicateColumnError(err)) throw err;\n }\n}\n\nasync function ensureWorkspaceConnectionColumns(\n client: DbExec,\n table: string,\n): Promise<void> {\n await ensureColumn(client, table, \"provider\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"label\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"account_id\", \"TEXT\");\n await ensureColumn(client, table, \"account_label\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"status\",\n \"TEXT NOT NULL DEFAULT 'connected'\",\n );\n await ensureColumn(\n client,\n table,\n \"scopes_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"config_json\",\n \"TEXT NOT NULL DEFAULT '{}'\",\n );\n await ensureColumn(\n client,\n table,\n \"allowed_apps_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"credential_refs_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(client, table, \"owner_email\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"org_id\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"created_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(\n client,\n table,\n \"updated_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(client, table, \"last_checked_at\", intType());\n await ensureColumn(client, table, \"last_error\", \"TEXT\");\n}\n\nasync function ensureWorkspaceConnectionGrantColumns(\n client: DbExec,\n table: string,\n): Promise<void> {\n await ensureColumn(\n client,\n table,\n \"connection_id\",\n \"TEXT NOT NULL DEFAULT ''\",\n );\n await ensureColumn(client, table, \"provider\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"app_id\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(\n client,\n table,\n \"scopes_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"config_json\",\n \"TEXT NOT NULL DEFAULT '{}'\",\n );\n await ensureColumn(\n client,\n table,\n \"credential_refs_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"granted_by_email\",\n \"TEXT NOT NULL DEFAULT ''\",\n );\n await ensureColumn(client, table, \"owner_email\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"org_id\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"created_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(\n client,\n table,\n \"updated_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n}\n\nexport async function ensureWorkspaceConnectionsTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${table} (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL DEFAULT '',\n label TEXT NOT NULL DEFAULT '',\n account_id TEXT,\n account_label TEXT,\n status TEXT NOT NULL DEFAULT 'connected',\n scopes_json TEXT NOT NULL DEFAULT '[]',\n config_json TEXT NOT NULL DEFAULT '{}',\n allowed_apps_json TEXT NOT NULL DEFAULT '[]',\n credential_refs_json TEXT NOT NULL DEFAULT '[]',\n owner_email TEXT NOT NULL DEFAULT '',\n org_id TEXT,\n created_at ${intType()} NOT NULL DEFAULT 0,\n updated_at ${intType()} NOT NULL DEFAULT 0,\n last_checked_at ${intType()},\n last_error TEXT\n )\n `),\n );\n\n await ensureWorkspaceConnectionColumns(client, table);\n\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_scope_provider ON ${table} (org_id, owner_email, provider)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_updated_at ON ${table} (updated_at)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${grantsTable} (\n id TEXT PRIMARY KEY,\n connection_id TEXT NOT NULL DEFAULT '',\n provider TEXT NOT NULL DEFAULT '',\n app_id TEXT NOT NULL DEFAULT '',\n scopes_json TEXT NOT NULL DEFAULT '[]',\n config_json TEXT NOT NULL DEFAULT '{}',\n credential_refs_json TEXT NOT NULL DEFAULT '[]',\n granted_by_email TEXT NOT NULL DEFAULT '',\n owner_email TEXT NOT NULL DEFAULT '',\n org_id TEXT,\n created_at ${intType()} NOT NULL DEFAULT 0,\n updated_at ${intType()} NOT NULL DEFAULT 0\n )\n `),\n );\n\n await ensureWorkspaceConnectionGrantColumns(client, grantsTable);\n\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_connection_grants_connection_app ON ${grantsTable} (connection_id, app_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_scope_app ON ${grantsTable} (org_id, owner_email, app_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_updated_at ON ${grantsTable} (updated_at)`,\n ),\n );\n })().catch((err) => {\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nfunction requireWorkspaceConnectionScope(): {\n ownerEmail: string;\n orgId: string | null;\n} {\n const ownerEmail = getRequestUserEmail()?.trim().toLowerCase();\n if (!ownerEmail) {\n throw new Error(\"Workspace connections require an authenticated user.\");\n }\n return {\n ownerEmail,\n orgId: getRequestOrgId()?.trim() || null,\n };\n}\n\nfunction scopedWhere(\n scope: ReturnType<typeof requireWorkspaceConnectionScope>,\n): { sql: string; args: string[] } {\n if (scope.orgId) {\n return { sql: \"org_id = ?\", args: [scope.orgId] };\n }\n return {\n sql: \"owner_email = ? AND org_id IS NULL\",\n args: [scope.ownerEmail],\n };\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nfunction normalizeRequiredString(value: unknown, label: string): string {\n const normalized = typeof value === \"string\" ? value.trim() : \"\";\n if (!normalized) {\n throw new Error(`${label} is required.`);\n }\n return normalized;\n}\n\nfunction normalizeObject(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n}\n\nfunction normalizeCredentialRefs(\n value: unknown,\n): WorkspaceConnectionCredentialRef[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter(\n (entry): entry is WorkspaceConnectionCredentialRef =>\n !!entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n typeof (entry as WorkspaceConnectionCredentialRef).key === \"string\",\n )\n .map((entry) => sanitizeCredentialRef(entry))\n .filter((entry) => entry.key.trim().length > 0);\n}\n\nfunction normalizeStatus(value: unknown): WorkspaceConnectionStatus {\n if (\n value === \"checking\" ||\n value === \"needs_reauth\" ||\n value === \"error\" ||\n value === \"disabled\"\n ) {\n return value;\n }\n return \"connected\";\n}\n\nfunction millis(\n value: Date | number | string | null | undefined,\n): number | null {\n if (value == null) return null;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n const parsed = Date.parse(String(value));\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction iso(value: unknown): string | null {\n if (value == null) return null;\n const num = Number(value);\n if (!Number.isFinite(num) || num <= 0) return null;\n return new Date(num).toISOString();\n}\n\nconst SECRET_KEYS = new Set([\n \"apikey\",\n \"authorization\",\n \"clientsecret\",\n \"cookie\",\n \"password\",\n \"privatekey\",\n \"refreshtoken\",\n \"secret\",\n \"token\",\n \"accesstoken\",\n]);\n\nfunction normalizedKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction sanitizeJson(value: unknown, allowCredentialRefKey = false): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => sanitizeJson(entry, allowCredentialRefKey));\n }\n if (!value || typeof value !== \"object\") return value;\n\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = normalizedKey(key);\n if (\n SECRET_KEYS.has(normalized) &&\n !(allowCredentialRefKey && normalized === \"key\")\n ) {\n result[key] = \"[redacted]\";\n continue;\n }\n result[key] = sanitizeJson(entry, allowCredentialRefKey);\n }\n return result;\n}\n\nfunction sanitizeConfig(\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n return sanitizeJson(normalizeObject(config), false) as Record<\n string,\n unknown\n >;\n}\n\nfunction sanitizeCredentialRef(\n ref: WorkspaceConnectionCredentialRef,\n): WorkspaceConnectionCredentialRef {\n const sanitized = sanitizeJson(ref, true) as WorkspaceConnectionCredentialRef;\n if (Object.prototype.hasOwnProperty.call(sanitized, \"value\")) {\n sanitized.value = \"[redacted]\";\n }\n return sanitized;\n}\n\nfunction parseRow(row: Record<string, unknown>): WorkspaceConnection {\n return serializeWorkspaceConnection({\n id: String(row.id),\n provider: String(row.provider ?? \"\"),\n label: String(row.label ?? \"\"),\n accountId: row.account_id == null ? null : String(row.account_id),\n accountLabel: row.account_label == null ? null : String(row.account_label),\n status: normalizeStatus(row.status),\n scopes: normalizeStringArray(safeJsonParse<unknown>(row.scopes_json, [])),\n config: normalizeObject(safeJsonParse<unknown>(row.config_json, {})),\n allowedApps: normalizeStringArray(\n safeJsonParse<unknown>(row.allowed_apps_json, []),\n ),\n credentialRefs: normalizeCredentialRefs(\n safeJsonParse<unknown>(row.credential_refs_json, []),\n ),\n ownerEmail: String(row.owner_email ?? \"\"),\n orgId: row.org_id == null ? null : String(row.org_id),\n createdAt: iso(row.created_at) ?? new Date(0).toISOString(),\n updatedAt: iso(row.updated_at) ?? new Date(0).toISOString(),\n lastCheckedAt: iso(row.last_checked_at),\n lastError: row.last_error == null ? null : String(row.last_error),\n });\n}\n\nfunction parseGrantRow(row: Record<string, unknown>): WorkspaceConnectionGrant {\n return serializeWorkspaceConnectionGrant({\n id: String(row.id),\n connectionId: String(row.connection_id ?? \"\"),\n provider: String(row.provider ?? \"\"),\n appId: String(row.app_id ?? \"\"),\n scopes: normalizeStringArray(safeJsonParse<unknown>(row.scopes_json, [])),\n config: normalizeObject(safeJsonParse<unknown>(row.config_json, {})),\n credentialRefs: normalizeCredentialRefs(\n safeJsonParse<unknown>(row.credential_refs_json, []),\n ),\n grantedByEmail: String(row.granted_by_email ?? \"\"),\n ownerEmail: String(row.owner_email ?? \"\"),\n orgId: row.org_id == null ? null : String(row.org_id),\n createdAt: iso(row.created_at) ?? new Date(0).toISOString(),\n updatedAt: iso(row.updated_at) ?? new Date(0).toISOString(),\n });\n}\n\nexport function serializeWorkspaceConnection(\n connection: WorkspaceConnection,\n): SerializedWorkspaceConnection {\n return {\n ...connection,\n scopes: normalizeStringArray(connection.scopes),\n config: sanitizeConfig(connection.config),\n allowedApps: normalizeStringArray(connection.allowedApps),\n credentialRefs: normalizeCredentialRefs(connection.credentialRefs),\n };\n}\n\nexport function serializeWorkspaceConnectionGrant(\n grant: WorkspaceConnectionGrant,\n): SerializedWorkspaceConnectionGrant {\n return {\n ...grant,\n scopes: normalizeStringArray(grant.scopes),\n config: sanitizeConfig(grant.config),\n credentialRefs: normalizeCredentialRefs(grant.credentialRefs),\n };\n}\n\nexport function getWorkspaceConnectionAppAccess(\n connection: Pick<\n SerializedWorkspaceConnection,\n \"id\" | \"allowedApps\" | \"label\"\n >,\n appId: string,\n grants: Pick<\n SerializedWorkspaceConnectionGrant,\n \"id\" | \"connectionId\" | \"appId\"\n >[] = [],\n): WorkspaceConnectionAppAccess {\n const normalizedAppId = appId.trim();\n if (!normalizedAppId) {\n return {\n appId: normalizedAppId,\n available: false,\n mode: \"unavailable\",\n reason: \"No app id was provided.\",\n grantId: null,\n };\n }\n\n if (connection.allowedApps.length === 0) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"all-apps\",\n reason: \"Connection is available to every app in the workspace.\",\n grantId: null,\n };\n }\n\n if (connection.allowedApps.includes(normalizedAppId)) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"allowed-app\",\n reason: `Connection is directly allowed for ${normalizedAppId}.`,\n grantId: null,\n };\n }\n\n const explicitGrant = grants.find(\n (grant) =>\n grant.connectionId === connection.id && grant.appId === normalizedAppId,\n );\n if (explicitGrant) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"explicit-grant\",\n reason: `Connection has an explicit grant for ${normalizedAppId}.`,\n grantId: explicitGrant.id,\n };\n }\n\n return {\n appId: normalizedAppId,\n available: false,\n mode: \"unavailable\",\n reason: `Grant ${normalizedAppId} access before this connection can be reused by the app.`,\n grantId: null,\n };\n}\n\nexport function workspaceConnectionIsAvailableToApp(\n connection: Pick<\n SerializedWorkspaceConnection,\n \"id\" | \"allowedApps\" | \"label\"\n >,\n appId: string,\n grants: Pick<\n SerializedWorkspaceConnectionGrant,\n \"id\" | \"connectionId\" | \"appId\"\n >[] = [],\n): boolean {\n return getWorkspaceConnectionAppAccess(connection, appId, grants).available;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(\n new Set(values.map((value) => value.trim()).filter(Boolean)),\n );\n}\n\nfunction publicCredentialRefs(\n refs: WorkspaceConnectionCredentialRef[],\n source: WorkspaceConnectionPublicCredentialRef[\"source\"],\n): WorkspaceConnectionPublicCredentialRef[] {\n return refs.map((ref) => ({\n key: ref.key,\n scope: ref.scope,\n provider: ref.provider,\n label: ref.label,\n source,\n }));\n}\n\nfunction grantsForConnection(\n connectionId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n appId?: string,\n): SerializedWorkspaceConnectionGrant[] {\n return grants.filter(\n (grant) =>\n grant.connectionId === connectionId && (!appId || grant.appId === appId),\n );\n}\n\nfunction explicitGrantForConnection(\n connectionId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n appId?: string,\n): SerializedWorkspaceConnectionGrant | undefined {\n return grantsForConnection(connectionId, grants, appId)[0];\n}\n\nfunction connectionForApp(\n connection: SerializedWorkspaceConnection,\n appId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n): WorkspaceConnectionForApp {\n const normalizedAppId = appId.trim();\n const appAccess = getWorkspaceConnectionAppAccess(\n connection,\n normalizedAppId,\n grants,\n );\n return {\n ...connection,\n appAccess,\n explicitGrant:\n explicitGrantForConnection(connection.id, grants, normalizedAppId) ??\n null,\n };\n}\n\nfunction serializeConnectionForApp(\n connection: SerializedWorkspaceConnection,\n appId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n): WorkspaceConnectionForAppSummary {\n const explicitGrant = explicitGrantForConnection(\n connection.id,\n grants,\n appId,\n );\n const appAccess = getWorkspaceConnectionAppAccess(connection, appId, grants);\n return {\n id: connection.id,\n label: connection.label,\n provider: connection.provider,\n accountId: connection.accountId,\n accountLabel: connection.accountLabel,\n status: connection.status,\n grantedToApp: appAccess.available,\n grantScope:\n connection.allowedApps.length === 0 ? \"all-apps\" : \"selected-apps\",\n appAccess,\n allowedApps: connection.allowedApps,\n credentialRefs: publicCredentialRefs(\n connection.credentialRefs,\n \"connection\",\n ),\n lastCheckedAt: connection.lastCheckedAt,\n lastError: connection.lastError,\n explicitGrant: explicitGrant\n ? {\n id: explicitGrant.id,\n appId: explicitGrant.appId,\n scopes: explicitGrant.scopes,\n credentialRefs: publicCredentialRefs(\n explicitGrant.credentialRefs,\n \"grant\",\n ),\n updatedAt: explicitGrant.updatedAt,\n }\n : null,\n };\n}\n\nfunction grantAvailabilityMessage(\n grantState: WorkspaceConnectionGrantState,\n providerId: string,\n appId: string,\n): string {\n switch (grantState) {\n case \"connected\":\n return `${appId} has an active ${providerId} workspace connection.`;\n case \"granted\":\n return `${appId} has ${providerId} access, but the granted connection is not connected yet.`;\n case \"needs_grant\":\n return `A ${providerId} workspace connection exists; grant ${appId} access to reuse it.`;\n case \"not_connected\":\n default:\n return `No shared ${providerId} workspace connection is available yet.`;\n }\n}\n\nexport function summarizeWorkspaceConnectionProviderForApp({\n providerId,\n appId,\n connections,\n grants = [],\n includeConnections = \"granted\",\n}: SummarizeWorkspaceConnectionProviderForAppOptions): WorkspaceConnectionProviderAppSummary {\n const normalizedProviderId = providerId.trim();\n const normalizedAppId = appId.trim();\n const allConnections = connections.filter(\n (connection) => connection.provider === normalizedProviderId,\n );\n const grantedConnections = allConnections.filter(\n (connection) =>\n getWorkspaceConnectionAppAccess(connection, normalizedAppId, grants)\n .available,\n );\n const connectedConnections = grantedConnections.filter(\n (connection) => connection.status === \"connected\",\n );\n const ungrantedConnectionCount =\n allConnections.length - grantedConnections.length;\n const unhealthyGrantedConnectionCount =\n grantedConnections.length - connectedConnections.length;\n const grantState: WorkspaceConnectionGrantState = connectedConnections.length\n ? \"connected\"\n : grantedConnections.length\n ? \"granted\"\n : allConnections.length\n ? \"needs_grant\"\n : \"not_connected\";\n const explicitGrantCount = allConnections.reduce(\n (count, connection) =>\n explicitGrantForConnection(connection.id, grants, normalizedAppId)\n ? count + 1\n : count,\n 0,\n );\n const credentialRefCount = allConnections.reduce((count, connection) => {\n const explicitGrant = explicitGrantForConnection(\n connection.id,\n grants,\n normalizedAppId,\n );\n return (\n count +\n connection.credentialRefs.length +\n (explicitGrant?.credentialRefs.length ?? 0)\n );\n }, 0);\n const visibleConnections =\n includeConnections === \"all\" ? allConnections : grantedConnections;\n\n return {\n appId: normalizedAppId,\n provider: normalizedProviderId,\n grantState,\n grantAvailability:\n grantState === \"connected\" || grantState === \"granted\"\n ? \"available\"\n : grantState,\n grantAvailabilityMessage: grantAvailabilityMessage(\n grantState,\n normalizedProviderId,\n normalizedAppId,\n ),\n connectionCount: allConnections.length,\n grantedConnectionCount: grantedConnections.length,\n activeConnectionCount: connectedConnections.length,\n ungrantedConnectionCount,\n unhealthyGrantedConnectionCount,\n explicitGrantCount,\n credentialRefCount,\n hasWorkspaceConnection: allConnections.length > 0,\n hasGrantedWorkspaceConnection: grantedConnections.length > 0,\n hasActiveWorkspaceConnection: connectedConnections.length > 0,\n statuses: uniqueStrings(\n allConnections.map((connection) => connection.status),\n ) as WorkspaceConnectionStatus[],\n connections: visibleConnections.map((connection) =>\n serializeConnectionForApp(connection, normalizedAppId, grants),\n ),\n };\n}\n\nfunction requiredCredentialKeys(provider: WorkspaceConnectionProviderLike) {\n return uniqueStrings(\n (provider.credentialKeys ?? [])\n .filter((credential) => credential.required ?? false)\n .map((credential) => credential.key),\n );\n}\n\nfunction missingRequiredCredentialKeys(\n provider: WorkspaceConnectionProviderLike,\n connection: SerializedWorkspaceConnection,\n grants: SerializedWorkspaceConnectionGrant[] = [],\n): string[] {\n const available = new Set(\n [\n ...connection.credentialRefs,\n ...grants.flatMap((grant) => grant.credentialRefs),\n ]\n .map((ref) => ref.key.trim())\n .filter(Boolean),\n );\n return requiredCredentialKeys(provider).filter((key) => !available.has(key));\n}\n\nexport function summarizeWorkspaceConnectionProviderReadiness({\n provider,\n connections,\n grants = [],\n appId,\n includeConnections,\n}: SummarizeWorkspaceConnectionProviderReadinessOptions): WorkspaceConnectionProviderReadiness {\n const providerConnections = connections.filter(\n (connection) => connection.provider === provider.id,\n );\n const activeConnections = providerConnections.filter(\n (connection) => connection.status !== \"disabled\",\n );\n const attentionConnections = activeConnections.filter(\n (connection) =>\n connection.status === \"error\" ||\n connection.status === \"needs_reauth\" ||\n Boolean(connection.lastError),\n );\n const missingKeys = uniqueStrings(\n activeConnections.flatMap((connection) =>\n missingRequiredCredentialKeys(\n provider,\n connection,\n grantsForConnection(connection.id, grants, appId),\n ),\n ),\n );\n const readyConnections = activeConnections.filter(\n (connection) =>\n connection.status === \"connected\" &&\n missingRequiredCredentialKeys(\n provider,\n connection,\n grantsForConnection(connection.id, grants, appId),\n ).length === 0,\n );\n const checkingConnections = activeConnections.filter(\n (connection) => connection.status === \"checking\",\n );\n\n let status: WorkspaceConnectionProviderReadinessStatus = \"not_configured\";\n if (readyConnections.length > 0) {\n status = \"ready\";\n } else if (attentionConnections.length > 0) {\n status = \"needs_attention\";\n } else if (missingKeys.length > 0) {\n status = \"needs_credentials\";\n } else if (checkingConnections.length > 0) {\n status = \"checking\";\n } else if (providerConnections.length > 0) {\n status = \"disabled\";\n }\n\n return {\n status,\n connectionCount: providerConnections.length,\n activeConnectionCount: activeConnections.length,\n readyConnectionCount: readyConnections.length,\n requiredCredentialKeys: requiredCredentialKeys(provider),\n missingRequiredCredentialKeys: missingKeys,\n appGrant: appId\n ? summarizeWorkspaceConnectionProviderForApp({\n providerId: provider.id,\n appId,\n connections,\n grants,\n includeConnections,\n })\n : null,\n };\n}\n\nexport async function listWorkspaceConnectionProviderCatalogForApp({\n appId,\n provider,\n capability,\n templateUse,\n includeDisabled = true,\n includeConnections = \"all\",\n}: ListWorkspaceConnectionProviderCatalogForAppOptions): Promise<WorkspaceConnectionProviderCatalogForApp> {\n const [connections, grants] = await Promise.all([\n listWorkspaceConnections({ provider, includeDisabled }),\n listWorkspaceConnectionGrants({ provider, appId }),\n ]);\n const providers = listWorkspaceConnectionProviders({\n capability,\n templateUse,\n })\n .filter((item) => !provider || item.id === provider)\n .map((item) => {\n const workspaceConnection = summarizeWorkspaceConnectionProviderForApp({\n providerId: item.id,\n appId,\n connections,\n grants,\n includeConnections,\n });\n const readiness = summarizeWorkspaceConnectionProviderReadiness({\n provider: item,\n connections,\n grants,\n appId,\n includeConnections,\n });\n return {\n ...item,\n workspaceConnection,\n readiness,\n };\n });\n\n return {\n appId,\n providers,\n connections,\n grants,\n counts: {\n providers: providers.length,\n connections: connections.length,\n grants: grants.length,\n readyProviders: providers.filter(\n (item) => item.readiness.status === \"ready\",\n ).length,\n },\n };\n}\n\nexport async function listWorkspaceConnectionsForApp({\n appId,\n provider,\n includeDisabled = false,\n}: ListWorkspaceConnectionsForAppOptions): Promise<\n WorkspaceConnectionForApp[]\n> {\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"listWorkspaceConnectionsForApp appId\",\n );\n const [connections, grants] = await Promise.all([\n listWorkspaceConnections({ provider, includeDisabled }),\n listWorkspaceConnectionGrants({ provider, appId: normalizedAppId }),\n ]);\n\n return connections\n .map((connection) => connectionForApp(connection, normalizedAppId, grants))\n .filter((connection) => connection.appAccess.available);\n}\n\nexport async function resolveWorkspaceConnectionForApp({\n appId,\n provider,\n includeDisabled = false,\n connectionId,\n requireConnected = false,\n}: ResolveWorkspaceConnectionForAppOptions): Promise<ResolvedWorkspaceConnectionForApp> {\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"resolveWorkspaceConnectionForApp appId\",\n );\n const normalizedConnectionId = connectionId?.trim();\n const requestedConnections = await listWorkspaceConnections({\n provider,\n includeDisabled: includeDisabled || Boolean(normalizedConnectionId),\n });\n const candidateConnections = normalizedConnectionId\n ? requestedConnections.filter(\n (connection) => connection.id === normalizedConnectionId,\n )\n : requestedConnections;\n const grants = await listWorkspaceConnectionGrants({\n provider,\n appId: normalizedAppId,\n connectionId: normalizedConnectionId,\n });\n\n if (normalizedConnectionId && candidateConnections.length === 0) {\n return {\n available: false,\n connection: null,\n appAccess: null,\n reason: `Workspace connection \"${normalizedConnectionId}\" was not found in the current request scope.`,\n };\n }\n\n for (const connection of candidateConnections) {\n const connectionWithAccess = connectionForApp(\n connection,\n normalizedAppId,\n grants,\n );\n\n if (!connectionWithAccess.appAccess.available) {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: connectionWithAccess.appAccess.reason,\n };\n }\n continue;\n }\n\n if (!includeDisabled && connection.status === \"disabled\") {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: `Workspace connection \"${connection.id}\" is disabled.`,\n };\n }\n continue;\n }\n\n if (requireConnected && connection.status !== \"connected\") {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: `Workspace connection \"${connection.id}\" is ${connection.status}; a connected workspace connection is required.`,\n };\n }\n continue;\n }\n\n return {\n available: true,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: connectionWithAccess.appAccess.reason,\n };\n }\n\n return {\n available: false,\n connection: null,\n appAccess: null,\n reason: provider\n ? `No available ${provider} workspace connection was found for ${normalizedAppId}.`\n : `No available workspace connection was found for ${normalizedAppId}.`,\n };\n}\n\nasync function getGrantedConnectionIdsForApp(\n client: DbExec,\n scope: ReturnType<typeof requireWorkspaceConnectionScope>,\n appId: string,\n): Promise<Set<string>> {\n const table = workspaceConnectionGrantsTable();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT connection_id FROM ${table} WHERE app_id = ? AND ${where.sql}`,\n args: [appId, ...where.args],\n });\n return new Set(\n rows\n .map((row) =>\n String((row as Record<string, unknown>).connection_id ?? \"\"),\n )\n .filter(Boolean),\n );\n}\n\nexport async function listWorkspaceConnections(\n options: ListWorkspaceConnectionsOptions = {},\n): Promise<SerializedWorkspaceConnection[]> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const clauses = [where.sql];\n const args: unknown[] = [...where.args];\n const appId = options.appId?.trim();\n\n if (options.provider) {\n clauses.push(\"provider = ?\");\n args.push(options.provider);\n }\n if (!options.includeDisabled) {\n clauses.push(\"status != ?\");\n args.push(\"disabled\");\n }\n\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE ${clauses.join(\n \" AND \",\n )} ORDER BY updated_at DESC`,\n args,\n });\n\n const connections = rows.map((row) =>\n parseRow(row as Record<string, unknown>),\n );\n if (!appId) return connections;\n\n const grantedConnectionIds = await getGrantedConnectionIdsForApp(\n client,\n scope,\n appId,\n );\n return connections.filter(\n (connection) =>\n connection.allowedApps.length === 0 ||\n connection.allowedApps.includes(appId) ||\n grantedConnectionIds.has(connection.id),\n );\n}\n\nexport async function getWorkspaceConnection(\n id: string,\n): Promise<SerializedWorkspaceConnection | null> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE id = ? AND ${where.sql} LIMIT 1`,\n args: [id, ...where.args],\n });\n if (rows.length === 0) return null;\n return parseRow(rows[0] as Record<string, unknown>);\n}\n\nexport async function upsertWorkspaceConnection(\n input: UpsertWorkspaceConnectionInput,\n): Promise<SerializedWorkspaceConnection> {\n await ensureWorkspaceConnectionsTable();\n const provider = input.provider.trim();\n if (!provider) {\n throw new Error(\"upsertWorkspaceConnection requires a provider.\");\n }\n\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const id = input.id?.trim() || randomUUID();\n const now = Date.now();\n const label = input.label?.trim() || input.accountLabel?.trim() || provider;\n const status = normalizeStatus(input.status);\n const scopes = normalizeStringArray(input.scopes);\n const config = sanitizeConfig(input.config);\n const allowedApps = normalizeStringArray(input.allowedApps);\n const credentialRefs = normalizeCredentialRefs(input.credentialRefs);\n const lastCheckedAt = millis(input.lastCheckedAt);\n const lastError = input.lastError ?? null;\n\n const update = await client.execute({\n sql: `UPDATE ${table}\n SET provider = ?, label = ?, account_id = ?, account_label = ?,\n status = ?, scopes_json = ?, config_json = ?, allowed_apps_json = ?,\n credential_refs_json = ?, updated_at = ?, last_checked_at = ?,\n last_error = ?\n WHERE id = ? AND ${where.sql}`,\n args: [\n provider,\n label,\n input.accountId ?? null,\n input.accountLabel ?? null,\n status,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(allowedApps),\n JSON.stringify(credentialRefs),\n now,\n lastCheckedAt,\n lastError,\n id,\n ...where.args,\n ],\n });\n\n if (update.rowsAffected === 0) {\n try {\n await client.execute({\n sql: `INSERT INTO ${table}\n (id, provider, label, account_id, account_label, status,\n scopes_json, config_json, allowed_apps_json, credential_refs_json,\n owner_email, org_id, created_at, updated_at, last_checked_at,\n last_error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n provider,\n label,\n input.accountId ?? null,\n input.accountLabel ?? null,\n status,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(allowedApps),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n scope.orgId,\n now,\n now,\n lastCheckedAt,\n lastError,\n ],\n });\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw new Error(\n `Workspace connection \"${id}\" already exists outside the current request scope.`,\n );\n }\n throw err;\n }\n }\n\n const connection = await getWorkspaceConnection(id);\n if (!connection) {\n throw new Error(`Workspace connection \"${id}\" was not found after upsert.`);\n }\n return connection;\n}\n\nexport async function listWorkspaceConnectionGrants(\n options: ListWorkspaceConnectionGrantsOptions = {},\n): Promise<SerializedWorkspaceConnectionGrant[]> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const clauses = [where.sql];\n const args: unknown[] = [...where.args];\n const connectionId = options.connectionId?.trim();\n const appId = options.appId?.trim();\n const provider = options.provider?.trim();\n\n if (connectionId) {\n clauses.push(\"connection_id = ?\");\n args.push(connectionId);\n }\n if (appId) {\n clauses.push(\"app_id = ?\");\n args.push(appId);\n }\n if (provider) {\n clauses.push(\"provider = ?\");\n args.push(provider);\n }\n\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE ${clauses.join(\n \" AND \",\n )} ORDER BY updated_at DESC`,\n args,\n });\n\n return rows.map((row) => parseGrantRow(row as Record<string, unknown>));\n}\n\nexport async function getWorkspaceConnectionGrant(\n connectionId: string,\n appId: string,\n): Promise<SerializedWorkspaceConnectionGrant | null> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"getWorkspaceConnectionGrant connectionId\",\n );\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"getWorkspaceConnectionGrant appId\",\n );\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE connection_id = ? AND app_id = ? AND ${where.sql} LIMIT 1`,\n args: [normalizedConnectionId, normalizedAppId, ...where.args],\n });\n if (rows.length === 0) return null;\n return parseGrantRow(rows[0] as Record<string, unknown>);\n}\n\nexport async function upsertWorkspaceConnectionGrant(\n input: UpsertWorkspaceConnectionGrantInput,\n): Promise<SerializedWorkspaceConnectionGrant> {\n await ensureWorkspaceConnectionsTable();\n const connectionId = normalizeRequiredString(\n input.connectionId,\n \"upsertWorkspaceConnectionGrant connectionId\",\n );\n const appId = normalizeRequiredString(\n input.appId,\n \"upsertWorkspaceConnectionGrant appId\",\n );\n\n const connection = await getWorkspaceConnection(connectionId);\n if (!connection) {\n throw new Error(\n `Workspace connection \"${connectionId}\" was not found in the current request scope.`,\n );\n }\n\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const id = input.id?.trim() || randomUUID();\n const now = Date.now();\n const provider = input.provider?.trim() || connection.provider;\n const scopes = normalizeStringArray(input.scopes);\n const config = sanitizeConfig(input.config);\n const credentialRefs = normalizeCredentialRefs(input.credentialRefs);\n\n const update = await client.execute({\n sql: `UPDATE ${table}\n SET provider = ?, scopes_json = ?, config_json = ?,\n credential_refs_json = ?, granted_by_email = ?, updated_at = ?\n WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [\n provider,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n now,\n connectionId,\n appId,\n ...where.args,\n ],\n });\n\n if (update.rowsAffected === 0) {\n try {\n await client.execute({\n sql: `INSERT INTO ${table}\n (id, connection_id, provider, app_id, scopes_json, config_json,\n credential_refs_json, granted_by_email, owner_email, org_id,\n created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n connectionId,\n provider,\n appId,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n scope.ownerEmail,\n scope.orgId,\n now,\n now,\n ],\n });\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw new Error(\n `Workspace connection grant for \"${connectionId}\" and \"${appId}\" already exists outside the current request scope.`,\n );\n }\n throw err;\n }\n }\n\n const grant = await getWorkspaceConnectionGrant(connectionId, appId);\n if (!grant) {\n throw new Error(\n `Workspace connection grant for \"${connectionId}\" and \"${appId}\" was not found after upsert.`,\n );\n }\n return grant;\n}\n\nexport async function revokeWorkspaceConnectionGrant(\n connectionId: string,\n appId: string,\n): Promise<boolean> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"revokeWorkspaceConnectionGrant connectionId\",\n );\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"revokeWorkspaceConnectionGrant appId\",\n );\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const result = await client.execute({\n sql: `DELETE FROM ${table} WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [normalizedConnectionId, normalizedAppId, ...where.args],\n });\n return result.rowsAffected > 0;\n}\n\nexport async function deleteWorkspaceConnection(id: string): Promise<boolean> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const result = await client.execute({\n sql: `DELETE FROM ${table} WHERE id = ? AND ${where.sql}`,\n args: [id, ...where.args],\n });\n if (result.rowsAffected > 0) {\n await client.execute({\n sql: `DELETE FROM ${grantsTable} WHERE connection_id = ? AND ${where.sql}`,\n args: [id, ...where.args],\n });\n }\n return result.rowsAffected > 0;\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/workspace-connections/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n getDbExec,\n intType,\n isPostgres,\n isUniqueViolation,\n retryOnDdlRace,\n safeJsonParse,\n type DbExec,\n} from \"../db/client.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport {\n listWorkspaceConnectionProviders,\n type WorkspaceConnectionCapability,\n type WorkspaceConnectionProvider,\n type WorkspaceConnectionTemplateUse,\n} from \"../connections/catalog.js\";\n\nexport type WorkspaceConnectionStatus =\n | \"connected\"\n | \"checking\"\n | \"needs_reauth\"\n | \"error\"\n | \"disabled\";\n\nexport interface WorkspaceConnectionCredentialRef {\n key: string;\n scope?: \"user\" | \"org\" | \"workspace\";\n provider?: string;\n label?: string;\n [key: string]: unknown;\n}\n\nexport interface WorkspaceConnection {\n id: string;\n provider: string;\n label: string;\n accountId: string | null;\n accountLabel: string | null;\n status: WorkspaceConnectionStatus;\n scopes: string[];\n config: Record<string, unknown>;\n allowedApps: string[];\n credentialRefs: WorkspaceConnectionCredentialRef[];\n ownerEmail: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n lastUsedAt?: string | null;\n lastCheckedAt: string | null;\n lastError: string | null;\n}\n\nexport type SerializedWorkspaceConnection = WorkspaceConnection;\n\nexport interface WorkspaceConnectionGrant {\n id: string;\n connectionId: string;\n provider: string;\n appId: string;\n scopes: string[];\n config: Record<string, unknown>;\n credentialRefs: WorkspaceConnectionCredentialRef[];\n grantedByEmail: string;\n ownerEmail: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n lastUsedAt?: string | null;\n}\n\nexport type SerializedWorkspaceConnectionGrant = WorkspaceConnectionGrant;\n\nexport interface ListWorkspaceConnectionsOptions {\n provider?: string;\n appId?: string;\n includeDisabled?: boolean;\n}\n\nexport interface ListWorkspaceConnectionGrantsOptions {\n connectionId?: string;\n appId?: string;\n provider?: string;\n}\n\nexport interface ListWorkspaceConnectionsForAppOptions {\n appId: string;\n provider?: string;\n includeDisabled?: boolean;\n}\n\nexport interface ResolveWorkspaceConnectionForAppOptions extends ListWorkspaceConnectionsForAppOptions {\n connectionId?: string;\n requireConnected?: boolean;\n}\n\nexport interface UpsertWorkspaceConnectionInput {\n id?: string;\n provider: string;\n label?: string;\n accountId?: string | null;\n accountLabel?: string | null;\n status?: WorkspaceConnectionStatus;\n scopes?: string[];\n config?: Record<string, unknown>;\n allowedApps?: string[];\n credentialRefs?: WorkspaceConnectionCredentialRef[];\n lastCheckedAt?: Date | number | string | null;\n lastError?: string | null;\n}\n\nexport interface UpsertWorkspaceConnectionGrantInput {\n id?: string;\n connectionId: string;\n appId: string;\n provider?: string;\n scopes?: string[];\n config?: Record<string, unknown>;\n credentialRefs?: WorkspaceConnectionCredentialRef[];\n}\n\nexport type WorkspaceConnectionAppAccessMode =\n | \"all-apps\"\n | \"allowed-app\"\n | \"explicit-grant\"\n | \"unavailable\";\n\nexport interface WorkspaceConnectionAppAccess {\n appId: string;\n available: boolean;\n mode: WorkspaceConnectionAppAccessMode;\n reason: string;\n grantId: string | null;\n}\n\nexport type WorkspaceConnectionGrantState =\n | \"connected\"\n | \"granted\"\n | \"needs_grant\"\n | \"not_connected\";\n\nexport type WorkspaceConnectionGrantAvailability =\n | \"available\"\n | \"needs_grant\"\n | \"not_connected\";\n\nexport type WorkspaceConnectionProviderReadinessStatus =\n | \"ready\"\n | \"checking\"\n | \"needs_credentials\"\n | \"needs_attention\"\n | \"disabled\"\n | \"not_configured\";\n\nexport interface WorkspaceConnectionPublicCredentialRef {\n key: string;\n scope?: string;\n provider?: string;\n label?: string;\n source: \"connection\" | \"grant\";\n}\n\nexport interface WorkspaceConnectionExplicitGrantSummary {\n id: string;\n appId: string;\n scopes: string[];\n credentialRefs: WorkspaceConnectionPublicCredentialRef[];\n updatedAt: string;\n lastUsedAt: string | null;\n}\n\nexport interface WorkspaceConnectionForAppSummary {\n id: string;\n label: string;\n provider: string;\n accountId: string | null;\n accountLabel: string | null;\n status: WorkspaceConnectionStatus;\n grantedToApp: boolean;\n grantScope: \"all-apps\" | \"selected-apps\";\n appAccess: WorkspaceConnectionAppAccess;\n allowedApps: string[];\n credentialRefs: WorkspaceConnectionPublicCredentialRef[];\n lastUsedAt: string | null;\n lastCheckedAt: string | null;\n lastError: string | null;\n explicitGrant: WorkspaceConnectionExplicitGrantSummary | null;\n}\n\nexport interface WorkspaceConnectionForApp extends SerializedWorkspaceConnection {\n appAccess: WorkspaceConnectionAppAccess;\n explicitGrant: SerializedWorkspaceConnectionGrant | null;\n}\n\nexport interface ResolvedWorkspaceConnectionForApp {\n available: boolean;\n connection: WorkspaceConnectionForApp | null;\n appAccess: WorkspaceConnectionAppAccess | null;\n reason: string;\n}\n\nexport interface WorkspaceConnectionProviderAppSummary {\n appId: string;\n provider: string;\n grantState: WorkspaceConnectionGrantState;\n grantAvailability: WorkspaceConnectionGrantAvailability;\n grantAvailabilityMessage: string;\n connectionCount: number;\n grantedConnectionCount: number;\n activeConnectionCount: number;\n ungrantedConnectionCount: number;\n unhealthyGrantedConnectionCount: number;\n explicitGrantCount: number;\n credentialRefCount: number;\n hasWorkspaceConnection: boolean;\n hasGrantedWorkspaceConnection: boolean;\n hasActiveWorkspaceConnection: boolean;\n lastUsedAt: string | null;\n statuses: WorkspaceConnectionStatus[];\n connections: WorkspaceConnectionForAppSummary[];\n}\n\nexport interface WorkspaceConnectionProviderReadiness {\n status: WorkspaceConnectionProviderReadinessStatus;\n connectionCount: number;\n activeConnectionCount: number;\n readyConnectionCount: number;\n requiredCredentialKeys: string[];\n missingRequiredCredentialKeys: string[];\n appGrant: WorkspaceConnectionProviderAppSummary | null;\n}\n\nexport interface WorkspaceConnectionProviderLike {\n id: string;\n label?: string;\n credentialKeys?: readonly {\n key: string;\n required?: boolean;\n }[];\n}\n\nexport interface SummarizeWorkspaceConnectionProviderForAppOptions {\n providerId: string;\n appId: string;\n connections: SerializedWorkspaceConnection[];\n grants?: SerializedWorkspaceConnectionGrant[];\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface SummarizeWorkspaceConnectionProviderReadinessOptions {\n provider: WorkspaceConnectionProviderLike;\n connections: SerializedWorkspaceConnection[];\n grants?: SerializedWorkspaceConnectionGrant[];\n appId?: string;\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface ListWorkspaceConnectionProviderCatalogForAppOptions {\n appId: string;\n provider?: string;\n capability?: WorkspaceConnectionCapability;\n templateUse?: WorkspaceConnectionTemplateUse;\n includeDisabled?: boolean;\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface MarkWorkspaceConnectionUsedOptions {\n connectionId: string;\n appId?: string | null;\n usedAt?: Date | number | string | null;\n}\n\nexport interface MarkWorkspaceConnectionUsedResult {\n connectionUpdated: boolean;\n grantUpdated: boolean;\n lastUsedAt: string;\n}\n\nexport interface WorkspaceConnectionProviderCatalogForAppItem extends WorkspaceConnectionProvider {\n workspaceConnection: WorkspaceConnectionProviderAppSummary;\n readiness: WorkspaceConnectionProviderReadiness;\n}\n\nexport interface WorkspaceConnectionProviderCatalogForApp {\n appId: string;\n providers: WorkspaceConnectionProviderCatalogForAppItem[];\n connections: SerializedWorkspaceConnection[];\n grants: SerializedWorkspaceConnectionGrant[];\n counts: {\n providers: number;\n connections: number;\n grants: number;\n readyProviders: number;\n };\n}\n\nlet _initPromise: Promise<void> | undefined;\n\nfunction workspaceConnectionsTable(): string {\n return isPostgres()\n ? \"public.workspace_connections\"\n : \"workspace_connections\";\n}\n\nfunction workspaceConnectionGrantsTable(): string {\n return isPostgres()\n ? \"public.workspace_connection_grants\"\n : \"workspace_connection_grants\";\n}\n\nfunction isDuplicateColumnError(err: unknown): boolean {\n const code = String((err as { code?: unknown })?.code ?? \"\");\n const message = String((err as { message?: unknown })?.message ?? err)\n .toLowerCase()\n .trim();\n return (\n code === \"42701\" ||\n message.includes(\"duplicate column\") ||\n message.includes(\"already exists\")\n );\n}\n\nasync function ensureColumn(\n client: DbExec,\n table: string,\n name: string,\n definition: string,\n): Promise<void> {\n try {\n await retryOnDdlRace(() =>\n client.execute(\n isPostgres()\n ? `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS ${name} ${definition}`\n : `ALTER TABLE ${table} ADD COLUMN ${name} ${definition}`,\n ),\n );\n } catch (err) {\n if (!isDuplicateColumnError(err)) throw err;\n }\n}\n\nasync function ensureWorkspaceConnectionColumns(\n client: DbExec,\n table: string,\n): Promise<void> {\n await ensureColumn(client, table, \"provider\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"label\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"account_id\", \"TEXT\");\n await ensureColumn(client, table, \"account_label\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"status\",\n \"TEXT NOT NULL DEFAULT 'connected'\",\n );\n await ensureColumn(\n client,\n table,\n \"scopes_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"config_json\",\n \"TEXT NOT NULL DEFAULT '{}'\",\n );\n await ensureColumn(\n client,\n table,\n \"allowed_apps_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"credential_refs_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(client, table, \"owner_email\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"org_id\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"created_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(\n client,\n table,\n \"updated_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(client, table, \"last_checked_at\", intType());\n await ensureColumn(client, table, \"last_used_at\", intType());\n await ensureColumn(client, table, \"last_error\", \"TEXT\");\n}\n\nasync function ensureWorkspaceConnectionGrantColumns(\n client: DbExec,\n table: string,\n): Promise<void> {\n await ensureColumn(\n client,\n table,\n \"connection_id\",\n \"TEXT NOT NULL DEFAULT ''\",\n );\n await ensureColumn(client, table, \"provider\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"app_id\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(\n client,\n table,\n \"scopes_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"config_json\",\n \"TEXT NOT NULL DEFAULT '{}'\",\n );\n await ensureColumn(\n client,\n table,\n \"credential_refs_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"granted_by_email\",\n \"TEXT NOT NULL DEFAULT ''\",\n );\n await ensureColumn(client, table, \"owner_email\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"org_id\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"created_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(\n client,\n table,\n \"updated_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(client, table, \"last_used_at\", intType());\n}\n\nexport async function ensureWorkspaceConnectionsTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${table} (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL DEFAULT '',\n label TEXT NOT NULL DEFAULT '',\n account_id TEXT,\n account_label TEXT,\n status TEXT NOT NULL DEFAULT 'connected',\n scopes_json TEXT NOT NULL DEFAULT '[]',\n config_json TEXT NOT NULL DEFAULT '{}',\n allowed_apps_json TEXT NOT NULL DEFAULT '[]',\n credential_refs_json TEXT NOT NULL DEFAULT '[]',\n owner_email TEXT NOT NULL DEFAULT '',\n org_id TEXT,\n created_at ${intType()} NOT NULL DEFAULT 0,\n updated_at ${intType()} NOT NULL DEFAULT 0,\n last_used_at ${intType()},\n last_checked_at ${intType()},\n last_error TEXT\n )\n `),\n );\n\n await ensureWorkspaceConnectionColumns(client, table);\n\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_scope_provider ON ${table} (org_id, owner_email, provider)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_updated_at ON ${table} (updated_at)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS ${grantsTable} (\n id TEXT PRIMARY KEY,\n connection_id TEXT NOT NULL DEFAULT '',\n provider TEXT NOT NULL DEFAULT '',\n app_id TEXT NOT NULL DEFAULT '',\n scopes_json TEXT NOT NULL DEFAULT '[]',\n config_json TEXT NOT NULL DEFAULT '{}',\n credential_refs_json TEXT NOT NULL DEFAULT '[]',\n granted_by_email TEXT NOT NULL DEFAULT '',\n owner_email TEXT NOT NULL DEFAULT '',\n org_id TEXT,\n created_at ${intType()} NOT NULL DEFAULT 0,\n updated_at ${intType()} NOT NULL DEFAULT 0,\n last_used_at ${intType()}\n )\n `),\n );\n\n await ensureWorkspaceConnectionGrantColumns(client, grantsTable);\n\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_connection_grants_connection_app ON ${grantsTable} (connection_id, app_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_scope_app ON ${grantsTable} (org_id, owner_email, app_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_updated_at ON ${grantsTable} (updated_at)`,\n ),\n );\n })().catch((err) => {\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nfunction requireWorkspaceConnectionScope(): {\n ownerEmail: string;\n orgId: string | null;\n} {\n const ownerEmail = getRequestUserEmail()?.trim().toLowerCase();\n if (!ownerEmail) {\n throw new Error(\"Workspace connections require an authenticated user.\");\n }\n return {\n ownerEmail,\n orgId: getRequestOrgId()?.trim() || null,\n };\n}\n\nfunction scopedWhere(\n scope: ReturnType<typeof requireWorkspaceConnectionScope>,\n): { sql: string; args: string[] } {\n if (scope.orgId) {\n return { sql: \"org_id = ?\", args: [scope.orgId] };\n }\n return {\n sql: \"owner_email = ? AND org_id IS NULL\",\n args: [scope.ownerEmail],\n };\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nfunction normalizeRequiredString(value: unknown, label: string): string {\n const normalized = typeof value === \"string\" ? value.trim() : \"\";\n if (!normalized) {\n throw new Error(`${label} is required.`);\n }\n return normalized;\n}\n\nfunction normalizeObject(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n}\n\nfunction normalizeCredentialRefs(\n value: unknown,\n): WorkspaceConnectionCredentialRef[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter(\n (entry): entry is WorkspaceConnectionCredentialRef =>\n !!entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n typeof (entry as WorkspaceConnectionCredentialRef).key === \"string\",\n )\n .map((entry) => sanitizeCredentialRef(entry))\n .filter((entry) => entry.key.trim().length > 0);\n}\n\nfunction normalizeStatus(value: unknown): WorkspaceConnectionStatus {\n if (\n value === \"checking\" ||\n value === \"needs_reauth\" ||\n value === \"error\" ||\n value === \"disabled\"\n ) {\n return value;\n }\n return \"connected\";\n}\n\nfunction millis(\n value: Date | number | string | null | undefined,\n): number | null {\n if (value == null) return null;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n const parsed = Date.parse(String(value));\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction iso(value: unknown): string | null {\n if (value == null) return null;\n const num = Number(value);\n if (!Number.isFinite(num) || num <= 0) return null;\n return new Date(num).toISOString();\n}\n\nconst SECRET_KEYS = new Set([\n \"apikey\",\n \"authorization\",\n \"clientsecret\",\n \"cookie\",\n \"password\",\n \"privatekey\",\n \"refreshtoken\",\n \"secret\",\n \"token\",\n \"accesstoken\",\n]);\n\nfunction normalizedKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction sanitizeJson(value: unknown, allowCredentialRefKey = false): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => sanitizeJson(entry, allowCredentialRefKey));\n }\n if (!value || typeof value !== \"object\") return value;\n\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = normalizedKey(key);\n if (\n SECRET_KEYS.has(normalized) &&\n !(allowCredentialRefKey && normalized === \"key\")\n ) {\n result[key] = \"[redacted]\";\n continue;\n }\n result[key] = sanitizeJson(entry, allowCredentialRefKey);\n }\n return result;\n}\n\nfunction sanitizeConfig(\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n return sanitizeJson(normalizeObject(config), false) as Record<\n string,\n unknown\n >;\n}\n\nfunction sanitizeCredentialRef(\n ref: WorkspaceConnectionCredentialRef,\n): WorkspaceConnectionCredentialRef {\n const sanitized = sanitizeJson(ref, true) as WorkspaceConnectionCredentialRef;\n if (Object.prototype.hasOwnProperty.call(sanitized, \"value\")) {\n sanitized.value = \"[redacted]\";\n }\n return sanitized;\n}\n\nfunction parseRow(row: Record<string, unknown>): WorkspaceConnection {\n return serializeWorkspaceConnection({\n id: String(row.id),\n provider: String(row.provider ?? \"\"),\n label: String(row.label ?? \"\"),\n accountId: row.account_id == null ? null : String(row.account_id),\n accountLabel: row.account_label == null ? null : String(row.account_label),\n status: normalizeStatus(row.status),\n scopes: normalizeStringArray(safeJsonParse<unknown>(row.scopes_json, [])),\n config: normalizeObject(safeJsonParse<unknown>(row.config_json, {})),\n allowedApps: normalizeStringArray(\n safeJsonParse<unknown>(row.allowed_apps_json, []),\n ),\n credentialRefs: normalizeCredentialRefs(\n safeJsonParse<unknown>(row.credential_refs_json, []),\n ),\n ownerEmail: String(row.owner_email ?? \"\"),\n orgId: row.org_id == null ? null : String(row.org_id),\n createdAt: iso(row.created_at) ?? new Date(0).toISOString(),\n updatedAt: iso(row.updated_at) ?? new Date(0).toISOString(),\n lastUsedAt: iso(row.last_used_at),\n lastCheckedAt: iso(row.last_checked_at),\n lastError: row.last_error == null ? null : String(row.last_error),\n });\n}\n\nfunction parseGrantRow(row: Record<string, unknown>): WorkspaceConnectionGrant {\n return serializeWorkspaceConnectionGrant({\n id: String(row.id),\n connectionId: String(row.connection_id ?? \"\"),\n provider: String(row.provider ?? \"\"),\n appId: String(row.app_id ?? \"\"),\n scopes: normalizeStringArray(safeJsonParse<unknown>(row.scopes_json, [])),\n config: normalizeObject(safeJsonParse<unknown>(row.config_json, {})),\n credentialRefs: normalizeCredentialRefs(\n safeJsonParse<unknown>(row.credential_refs_json, []),\n ),\n grantedByEmail: String(row.granted_by_email ?? \"\"),\n ownerEmail: String(row.owner_email ?? \"\"),\n orgId: row.org_id == null ? null : String(row.org_id),\n createdAt: iso(row.created_at) ?? new Date(0).toISOString(),\n updatedAt: iso(row.updated_at) ?? new Date(0).toISOString(),\n lastUsedAt: iso(row.last_used_at),\n });\n}\n\nexport function serializeWorkspaceConnection(\n connection: WorkspaceConnection,\n): SerializedWorkspaceConnection {\n return {\n ...connection,\n scopes: normalizeStringArray(connection.scopes),\n config: sanitizeConfig(connection.config),\n allowedApps: normalizeStringArray(connection.allowedApps),\n credentialRefs: normalizeCredentialRefs(connection.credentialRefs),\n };\n}\n\nexport function serializeWorkspaceConnectionGrant(\n grant: WorkspaceConnectionGrant,\n): SerializedWorkspaceConnectionGrant {\n return {\n ...grant,\n scopes: normalizeStringArray(grant.scopes),\n config: sanitizeConfig(grant.config),\n credentialRefs: normalizeCredentialRefs(grant.credentialRefs),\n };\n}\n\nexport function getWorkspaceConnectionAppAccess(\n connection: Pick<\n SerializedWorkspaceConnection,\n \"id\" | \"allowedApps\" | \"label\"\n >,\n appId: string,\n grants: Pick<\n SerializedWorkspaceConnectionGrant,\n \"id\" | \"connectionId\" | \"appId\"\n >[] = [],\n): WorkspaceConnectionAppAccess {\n const normalizedAppId = appId.trim();\n if (!normalizedAppId) {\n return {\n appId: normalizedAppId,\n available: false,\n mode: \"unavailable\",\n reason: \"No app id was provided.\",\n grantId: null,\n };\n }\n\n if (connection.allowedApps.length === 0) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"all-apps\",\n reason: \"Connection is available to every app in the workspace.\",\n grantId: null,\n };\n }\n\n if (connection.allowedApps.includes(normalizedAppId)) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"allowed-app\",\n reason: `Connection is directly allowed for ${normalizedAppId}.`,\n grantId: null,\n };\n }\n\n const explicitGrant = grants.find(\n (grant) =>\n grant.connectionId === connection.id && grant.appId === normalizedAppId,\n );\n if (explicitGrant) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"explicit-grant\",\n reason: `Connection has an explicit grant for ${normalizedAppId}.`,\n grantId: explicitGrant.id,\n };\n }\n\n return {\n appId: normalizedAppId,\n available: false,\n mode: \"unavailable\",\n reason: `Grant ${normalizedAppId} access before this connection can be reused by the app.`,\n grantId: null,\n };\n}\n\nexport function workspaceConnectionIsAvailableToApp(\n connection: Pick<\n SerializedWorkspaceConnection,\n \"id\" | \"allowedApps\" | \"label\"\n >,\n appId: string,\n grants: Pick<\n SerializedWorkspaceConnectionGrant,\n \"id\" | \"connectionId\" | \"appId\"\n >[] = [],\n): boolean {\n return getWorkspaceConnectionAppAccess(connection, appId, grants).available;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(\n new Set(values.map((value) => value.trim()).filter(Boolean)),\n );\n}\n\nfunction latestIso(values: Array<string | null | undefined>): string | null {\n const latest = values.reduce<number | null>((current, value) => {\n const parsed = value ? Date.parse(value) : NaN;\n if (!Number.isFinite(parsed)) return current;\n return current == null || parsed > current ? parsed : current;\n }, null);\n return latest == null ? null : new Date(latest).toISOString();\n}\n\nfunction publicCredentialRefs(\n refs: WorkspaceConnectionCredentialRef[],\n source: WorkspaceConnectionPublicCredentialRef[\"source\"],\n): WorkspaceConnectionPublicCredentialRef[] {\n return refs.map((ref) => ({\n key: ref.key,\n scope: ref.scope,\n provider: ref.provider,\n label: ref.label,\n source,\n }));\n}\n\nfunction grantsForConnection(\n connectionId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n appId?: string,\n): SerializedWorkspaceConnectionGrant[] {\n return grants.filter(\n (grant) =>\n grant.connectionId === connectionId && (!appId || grant.appId === appId),\n );\n}\n\nfunction explicitGrantForConnection(\n connectionId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n appId?: string,\n): SerializedWorkspaceConnectionGrant | undefined {\n return grantsForConnection(connectionId, grants, appId)[0];\n}\n\nfunction connectionForApp(\n connection: SerializedWorkspaceConnection,\n appId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n): WorkspaceConnectionForApp {\n const normalizedAppId = appId.trim();\n const appAccess = getWorkspaceConnectionAppAccess(\n connection,\n normalizedAppId,\n grants,\n );\n return {\n ...connection,\n appAccess,\n explicitGrant:\n explicitGrantForConnection(connection.id, grants, normalizedAppId) ??\n null,\n };\n}\n\nfunction serializeConnectionForApp(\n connection: SerializedWorkspaceConnection,\n appId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n): WorkspaceConnectionForAppSummary {\n const explicitGrant = explicitGrantForConnection(\n connection.id,\n grants,\n appId,\n );\n const appAccess = getWorkspaceConnectionAppAccess(connection, appId, grants);\n return {\n id: connection.id,\n label: connection.label,\n provider: connection.provider,\n accountId: connection.accountId,\n accountLabel: connection.accountLabel,\n status: connection.status,\n grantedToApp: appAccess.available,\n grantScope:\n connection.allowedApps.length === 0 ? \"all-apps\" : \"selected-apps\",\n appAccess,\n allowedApps: connection.allowedApps,\n credentialRefs: publicCredentialRefs(\n connection.credentialRefs,\n \"connection\",\n ),\n lastUsedAt: latestIso([connection.lastUsedAt, explicitGrant?.lastUsedAt]),\n lastCheckedAt: connection.lastCheckedAt,\n lastError: connection.lastError,\n explicitGrant: explicitGrant\n ? {\n id: explicitGrant.id,\n appId: explicitGrant.appId,\n scopes: explicitGrant.scopes,\n credentialRefs: publicCredentialRefs(\n explicitGrant.credentialRefs,\n \"grant\",\n ),\n updatedAt: explicitGrant.updatedAt,\n lastUsedAt: explicitGrant.lastUsedAt ?? null,\n }\n : null,\n };\n}\n\nfunction grantAvailabilityMessage(\n grantState: WorkspaceConnectionGrantState,\n providerId: string,\n appId: string,\n): string {\n switch (grantState) {\n case \"connected\":\n return `${appId} has an active ${providerId} workspace connection.`;\n case \"granted\":\n return `${appId} has ${providerId} access, but the granted connection is not connected yet.`;\n case \"needs_grant\":\n return `A ${providerId} workspace connection exists; grant ${appId} access to reuse it.`;\n case \"not_connected\":\n default:\n return `No shared ${providerId} workspace connection is available yet.`;\n }\n}\n\nexport function summarizeWorkspaceConnectionProviderForApp({\n providerId,\n appId,\n connections,\n grants = [],\n includeConnections = \"granted\",\n}: SummarizeWorkspaceConnectionProviderForAppOptions): WorkspaceConnectionProviderAppSummary {\n const normalizedProviderId = providerId.trim();\n const normalizedAppId = appId.trim();\n const allConnections = connections.filter(\n (connection) => connection.provider === normalizedProviderId,\n );\n const grantedConnections = allConnections.filter(\n (connection) =>\n getWorkspaceConnectionAppAccess(connection, normalizedAppId, grants)\n .available,\n );\n const connectedConnections = grantedConnections.filter(\n (connection) => connection.status === \"connected\",\n );\n const ungrantedConnectionCount =\n allConnections.length - grantedConnections.length;\n const unhealthyGrantedConnectionCount =\n grantedConnections.length - connectedConnections.length;\n const grantState: WorkspaceConnectionGrantState = connectedConnections.length\n ? \"connected\"\n : grantedConnections.length\n ? \"granted\"\n : allConnections.length\n ? \"needs_grant\"\n : \"not_connected\";\n const explicitGrantCount = allConnections.reduce(\n (count, connection) =>\n explicitGrantForConnection(connection.id, grants, normalizedAppId)\n ? count + 1\n : count,\n 0,\n );\n const credentialRefCount = allConnections.reduce((count, connection) => {\n const explicitGrant = explicitGrantForConnection(\n connection.id,\n grants,\n normalizedAppId,\n );\n return (\n count +\n connection.credentialRefs.length +\n (explicitGrant?.credentialRefs.length ?? 0)\n );\n }, 0);\n const visibleConnections =\n includeConnections === \"all\" ? allConnections : grantedConnections;\n const lastUsedAt = latestIso(\n grantedConnections.flatMap((connection) => [\n connection.lastUsedAt,\n explicitGrantForConnection(connection.id, grants, normalizedAppId)\n ?.lastUsedAt,\n ]),\n );\n\n return {\n appId: normalizedAppId,\n provider: normalizedProviderId,\n grantState,\n grantAvailability:\n grantState === \"connected\" || grantState === \"granted\"\n ? \"available\"\n : grantState,\n grantAvailabilityMessage: grantAvailabilityMessage(\n grantState,\n normalizedProviderId,\n normalizedAppId,\n ),\n connectionCount: allConnections.length,\n grantedConnectionCount: grantedConnections.length,\n activeConnectionCount: connectedConnections.length,\n ungrantedConnectionCount,\n unhealthyGrantedConnectionCount,\n explicitGrantCount,\n credentialRefCount,\n hasWorkspaceConnection: allConnections.length > 0,\n hasGrantedWorkspaceConnection: grantedConnections.length > 0,\n hasActiveWorkspaceConnection: connectedConnections.length > 0,\n lastUsedAt,\n statuses: uniqueStrings(\n allConnections.map((connection) => connection.status),\n ) as WorkspaceConnectionStatus[],\n connections: visibleConnections.map((connection) =>\n serializeConnectionForApp(connection, normalizedAppId, grants),\n ),\n };\n}\n\nfunction requiredCredentialKeys(provider: WorkspaceConnectionProviderLike) {\n return uniqueStrings(\n (provider.credentialKeys ?? [])\n .filter((credential) => credential.required ?? false)\n .map((credential) => credential.key),\n );\n}\n\nfunction missingRequiredCredentialKeys(\n provider: WorkspaceConnectionProviderLike,\n connection: SerializedWorkspaceConnection,\n grants: SerializedWorkspaceConnectionGrant[] = [],\n): string[] {\n const available = new Set(\n [\n ...connection.credentialRefs,\n ...grants.flatMap((grant) => grant.credentialRefs),\n ]\n .map((ref) => ref.key.trim())\n .filter(Boolean),\n );\n return requiredCredentialKeys(provider).filter((key) => !available.has(key));\n}\n\nexport function summarizeWorkspaceConnectionProviderReadiness({\n provider,\n connections,\n grants = [],\n appId,\n includeConnections,\n}: SummarizeWorkspaceConnectionProviderReadinessOptions): WorkspaceConnectionProviderReadiness {\n const providerConnections = connections.filter(\n (connection) => connection.provider === provider.id,\n );\n const activeConnections = providerConnections.filter(\n (connection) => connection.status !== \"disabled\",\n );\n const attentionConnections = activeConnections.filter(\n (connection) =>\n connection.status === \"error\" ||\n connection.status === \"needs_reauth\" ||\n Boolean(connection.lastError),\n );\n const missingKeys = uniqueStrings(\n activeConnections.flatMap((connection) =>\n missingRequiredCredentialKeys(\n provider,\n connection,\n grantsForConnection(connection.id, grants, appId),\n ),\n ),\n );\n const readyConnections = activeConnections.filter(\n (connection) =>\n connection.status === \"connected\" &&\n missingRequiredCredentialKeys(\n provider,\n connection,\n grantsForConnection(connection.id, grants, appId),\n ).length === 0,\n );\n const checkingConnections = activeConnections.filter(\n (connection) => connection.status === \"checking\",\n );\n\n let status: WorkspaceConnectionProviderReadinessStatus = \"not_configured\";\n if (readyConnections.length > 0) {\n status = \"ready\";\n } else if (attentionConnections.length > 0) {\n status = \"needs_attention\";\n } else if (missingKeys.length > 0) {\n status = \"needs_credentials\";\n } else if (checkingConnections.length > 0) {\n status = \"checking\";\n } else if (providerConnections.length > 0) {\n status = \"disabled\";\n }\n\n return {\n status,\n connectionCount: providerConnections.length,\n activeConnectionCount: activeConnections.length,\n readyConnectionCount: readyConnections.length,\n requiredCredentialKeys: requiredCredentialKeys(provider),\n missingRequiredCredentialKeys: missingKeys,\n appGrant: appId\n ? summarizeWorkspaceConnectionProviderForApp({\n providerId: provider.id,\n appId,\n connections,\n grants,\n includeConnections,\n })\n : null,\n };\n}\n\nexport async function listWorkspaceConnectionProviderCatalogForApp({\n appId,\n provider,\n capability,\n templateUse,\n includeDisabled = true,\n includeConnections = \"all\",\n}: ListWorkspaceConnectionProviderCatalogForAppOptions): Promise<WorkspaceConnectionProviderCatalogForApp> {\n const [connections, grants] = await Promise.all([\n listWorkspaceConnections({ provider, includeDisabled }),\n listWorkspaceConnectionGrants({ provider, appId }),\n ]);\n const providers = listWorkspaceConnectionProviders({\n capability,\n templateUse,\n })\n .filter((item) => !provider || item.id === provider)\n .map((item) => {\n const workspaceConnection = summarizeWorkspaceConnectionProviderForApp({\n providerId: item.id,\n appId,\n connections,\n grants,\n includeConnections,\n });\n const readiness = summarizeWorkspaceConnectionProviderReadiness({\n provider: item,\n connections,\n grants,\n appId,\n includeConnections,\n });\n return {\n ...item,\n workspaceConnection,\n readiness,\n };\n });\n\n return {\n appId,\n providers,\n connections,\n grants,\n counts: {\n providers: providers.length,\n connections: connections.length,\n grants: grants.length,\n readyProviders: providers.filter(\n (item) => item.readiness.status === \"ready\",\n ).length,\n },\n };\n}\n\nexport async function listWorkspaceConnectionsForApp({\n appId,\n provider,\n includeDisabled = false,\n}: ListWorkspaceConnectionsForAppOptions): Promise<\n WorkspaceConnectionForApp[]\n> {\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"listWorkspaceConnectionsForApp appId\",\n );\n const [connections, grants] = await Promise.all([\n listWorkspaceConnections({ provider, includeDisabled }),\n listWorkspaceConnectionGrants({ provider, appId: normalizedAppId }),\n ]);\n\n return connections\n .map((connection) => connectionForApp(connection, normalizedAppId, grants))\n .filter((connection) => connection.appAccess.available);\n}\n\nexport async function resolveWorkspaceConnectionForApp({\n appId,\n provider,\n includeDisabled = false,\n connectionId,\n requireConnected = false,\n}: ResolveWorkspaceConnectionForAppOptions): Promise<ResolvedWorkspaceConnectionForApp> {\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"resolveWorkspaceConnectionForApp appId\",\n );\n const normalizedConnectionId = connectionId?.trim();\n const requestedConnections = await listWorkspaceConnections({\n provider,\n includeDisabled: includeDisabled || Boolean(normalizedConnectionId),\n });\n const candidateConnections = normalizedConnectionId\n ? requestedConnections.filter(\n (connection) => connection.id === normalizedConnectionId,\n )\n : requestedConnections;\n const grants = await listWorkspaceConnectionGrants({\n provider,\n appId: normalizedAppId,\n connectionId: normalizedConnectionId,\n });\n\n if (normalizedConnectionId && candidateConnections.length === 0) {\n return {\n available: false,\n connection: null,\n appAccess: null,\n reason: `Workspace connection \"${normalizedConnectionId}\" was not found in the current request scope.`,\n };\n }\n\n for (const connection of candidateConnections) {\n const connectionWithAccess = connectionForApp(\n connection,\n normalizedAppId,\n grants,\n );\n\n if (!connectionWithAccess.appAccess.available) {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: connectionWithAccess.appAccess.reason,\n };\n }\n continue;\n }\n\n if (!includeDisabled && connection.status === \"disabled\") {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: `Workspace connection \"${connection.id}\" is disabled.`,\n };\n }\n continue;\n }\n\n if (requireConnected && connection.status !== \"connected\") {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: `Workspace connection \"${connection.id}\" is ${connection.status}; a connected workspace connection is required.`,\n };\n }\n continue;\n }\n\n return {\n available: true,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: connectionWithAccess.appAccess.reason,\n };\n }\n\n return {\n available: false,\n connection: null,\n appAccess: null,\n reason: provider\n ? `No available ${provider} workspace connection was found for ${normalizedAppId}.`\n : `No available workspace connection was found for ${normalizedAppId}.`,\n };\n}\n\nasync function getGrantedConnectionIdsForApp(\n client: DbExec,\n scope: ReturnType<typeof requireWorkspaceConnectionScope>,\n appId: string,\n): Promise<Set<string>> {\n const table = workspaceConnectionGrantsTable();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT connection_id FROM ${table} WHERE app_id = ? AND ${where.sql}`,\n args: [appId, ...where.args],\n });\n return new Set(\n rows\n .map((row) =>\n String((row as Record<string, unknown>).connection_id ?? \"\"),\n )\n .filter(Boolean),\n );\n}\n\nexport async function listWorkspaceConnections(\n options: ListWorkspaceConnectionsOptions = {},\n): Promise<SerializedWorkspaceConnection[]> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const clauses = [where.sql];\n const args: unknown[] = [...where.args];\n const appId = options.appId?.trim();\n\n if (options.provider) {\n clauses.push(\"provider = ?\");\n args.push(options.provider);\n }\n if (!options.includeDisabled) {\n clauses.push(\"status != ?\");\n args.push(\"disabled\");\n }\n\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE ${clauses.join(\n \" AND \",\n )} ORDER BY updated_at DESC`,\n args,\n });\n\n const connections = rows.map((row) =>\n parseRow(row as Record<string, unknown>),\n );\n if (!appId) return connections;\n\n const grantedConnectionIds = await getGrantedConnectionIdsForApp(\n client,\n scope,\n appId,\n );\n return connections.filter(\n (connection) =>\n connection.allowedApps.length === 0 ||\n connection.allowedApps.includes(appId) ||\n grantedConnectionIds.has(connection.id),\n );\n}\n\nexport async function getWorkspaceConnection(\n id: string,\n): Promise<SerializedWorkspaceConnection | null> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE id = ? AND ${where.sql} LIMIT 1`,\n args: [id, ...where.args],\n });\n if (rows.length === 0) return null;\n return parseRow(rows[0] as Record<string, unknown>);\n}\n\nexport async function upsertWorkspaceConnection(\n input: UpsertWorkspaceConnectionInput,\n): Promise<SerializedWorkspaceConnection> {\n await ensureWorkspaceConnectionsTable();\n const provider = input.provider.trim();\n if (!provider) {\n throw new Error(\"upsertWorkspaceConnection requires a provider.\");\n }\n\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const id = input.id?.trim() || randomUUID();\n const now = Date.now();\n const label = input.label?.trim() || input.accountLabel?.trim() || provider;\n const status = normalizeStatus(input.status);\n const scopes = normalizeStringArray(input.scopes);\n const config = sanitizeConfig(input.config);\n const allowedApps = normalizeStringArray(input.allowedApps);\n const credentialRefs = normalizeCredentialRefs(input.credentialRefs);\n const lastCheckedAt = millis(input.lastCheckedAt);\n const lastError = input.lastError ?? null;\n\n const update = await client.execute({\n sql: `UPDATE ${table}\n SET provider = ?, label = ?, account_id = ?, account_label = ?,\n status = ?, scopes_json = ?, config_json = ?, allowed_apps_json = ?,\n credential_refs_json = ?, updated_at = ?, last_checked_at = ?,\n last_error = ?\n WHERE id = ? AND ${where.sql}`,\n args: [\n provider,\n label,\n input.accountId ?? null,\n input.accountLabel ?? null,\n status,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(allowedApps),\n JSON.stringify(credentialRefs),\n now,\n lastCheckedAt,\n lastError,\n id,\n ...where.args,\n ],\n });\n\n if (update.rowsAffected === 0) {\n try {\n await client.execute({\n sql: `INSERT INTO ${table}\n (id, provider, label, account_id, account_label, status,\n scopes_json, config_json, allowed_apps_json, credential_refs_json,\n owner_email, org_id, created_at, updated_at, last_checked_at,\n last_error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n provider,\n label,\n input.accountId ?? null,\n input.accountLabel ?? null,\n status,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(allowedApps),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n scope.orgId,\n now,\n now,\n lastCheckedAt,\n lastError,\n ],\n });\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw new Error(\n `Workspace connection \"${id}\" already exists outside the current request scope.`,\n );\n }\n throw err;\n }\n }\n\n const connection = await getWorkspaceConnection(id);\n if (!connection) {\n throw new Error(`Workspace connection \"${id}\" was not found after upsert.`);\n }\n return connection;\n}\n\nexport async function listWorkspaceConnectionGrants(\n options: ListWorkspaceConnectionGrantsOptions = {},\n): Promise<SerializedWorkspaceConnectionGrant[]> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const clauses = [where.sql];\n const args: unknown[] = [...where.args];\n const connectionId = options.connectionId?.trim();\n const appId = options.appId?.trim();\n const provider = options.provider?.trim();\n\n if (connectionId) {\n clauses.push(\"connection_id = ?\");\n args.push(connectionId);\n }\n if (appId) {\n clauses.push(\"app_id = ?\");\n args.push(appId);\n }\n if (provider) {\n clauses.push(\"provider = ?\");\n args.push(provider);\n }\n\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE ${clauses.join(\n \" AND \",\n )} ORDER BY updated_at DESC`,\n args,\n });\n\n return rows.map((row) => parseGrantRow(row as Record<string, unknown>));\n}\n\nexport async function getWorkspaceConnectionGrant(\n connectionId: string,\n appId: string,\n): Promise<SerializedWorkspaceConnectionGrant | null> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"getWorkspaceConnectionGrant connectionId\",\n );\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"getWorkspaceConnectionGrant appId\",\n );\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE connection_id = ? AND app_id = ? AND ${where.sql} LIMIT 1`,\n args: [normalizedConnectionId, normalizedAppId, ...where.args],\n });\n if (rows.length === 0) return null;\n return parseGrantRow(rows[0] as Record<string, unknown>);\n}\n\nexport async function markWorkspaceConnectionUsed({\n connectionId,\n appId,\n usedAt,\n}: MarkWorkspaceConnectionUsedOptions): Promise<MarkWorkspaceConnectionUsedResult> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"markWorkspaceConnectionUsed connectionId\",\n );\n const normalizedAppId = appId?.trim();\n const usedAtMillis = millis(usedAt) ?? Date.now();\n const client = getDbExec();\n const connectionsTable = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n\n const connectionUpdate = await client.execute({\n sql: `UPDATE ${connectionsTable} SET last_used_at = ? WHERE id = ? AND ${where.sql}`,\n args: [usedAtMillis, normalizedConnectionId, ...where.args],\n });\n\n let grantUpdated = false;\n if (normalizedAppId) {\n const grantUpdate = await client.execute({\n sql: `UPDATE ${grantsTable} SET last_used_at = ? WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [\n usedAtMillis,\n normalizedConnectionId,\n normalizedAppId,\n ...where.args,\n ],\n });\n grantUpdated = grantUpdate.rowsAffected > 0;\n }\n\n return {\n connectionUpdated: connectionUpdate.rowsAffected > 0,\n grantUpdated,\n lastUsedAt: new Date(usedAtMillis).toISOString(),\n };\n}\n\nexport async function upsertWorkspaceConnectionGrant(\n input: UpsertWorkspaceConnectionGrantInput,\n): Promise<SerializedWorkspaceConnectionGrant> {\n await ensureWorkspaceConnectionsTable();\n const connectionId = normalizeRequiredString(\n input.connectionId,\n \"upsertWorkspaceConnectionGrant connectionId\",\n );\n const appId = normalizeRequiredString(\n input.appId,\n \"upsertWorkspaceConnectionGrant appId\",\n );\n\n const connection = await getWorkspaceConnection(connectionId);\n if (!connection) {\n throw new Error(\n `Workspace connection \"${connectionId}\" was not found in the current request scope.`,\n );\n }\n\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const id = input.id?.trim() || randomUUID();\n const now = Date.now();\n const provider = input.provider?.trim() || connection.provider;\n const scopes = normalizeStringArray(input.scopes);\n const config = sanitizeConfig(input.config);\n const credentialRefs = normalizeCredentialRefs(input.credentialRefs);\n\n const update = await client.execute({\n sql: `UPDATE ${table}\n SET provider = ?, scopes_json = ?, config_json = ?,\n credential_refs_json = ?, granted_by_email = ?, updated_at = ?\n WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [\n provider,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n now,\n connectionId,\n appId,\n ...where.args,\n ],\n });\n\n if (update.rowsAffected === 0) {\n try {\n await client.execute({\n sql: `INSERT INTO ${table}\n (id, connection_id, provider, app_id, scopes_json, config_json,\n credential_refs_json, granted_by_email, owner_email, org_id,\n created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n connectionId,\n provider,\n appId,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n scope.ownerEmail,\n scope.orgId,\n now,\n now,\n ],\n });\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw new Error(\n `Workspace connection grant for \"${connectionId}\" and \"${appId}\" already exists outside the current request scope.`,\n );\n }\n throw err;\n }\n }\n\n const grant = await getWorkspaceConnectionGrant(connectionId, appId);\n if (!grant) {\n throw new Error(\n `Workspace connection grant for \"${connectionId}\" and \"${appId}\" was not found after upsert.`,\n );\n }\n return grant;\n}\n\nexport async function revokeWorkspaceConnectionGrant(\n connectionId: string,\n appId: string,\n): Promise<boolean> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"revokeWorkspaceConnectionGrant connectionId\",\n );\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"revokeWorkspaceConnectionGrant appId\",\n );\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const result = await client.execute({\n sql: `DELETE FROM ${table} WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [normalizedConnectionId, normalizedAppId, ...where.args],\n });\n return result.rowsAffected > 0;\n}\n\nexport async function deleteWorkspaceConnection(id: string): Promise<boolean> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const result = await client.execute({\n sql: `DELETE FROM ${table} WHERE id = ? AND ${where.sql}`,\n args: [id, ...where.args],\n });\n if (result.rowsAffected > 0) {\n await client.execute({\n sql: `DELETE FROM ${grantsTable} WHERE connection_id = ? AND ${where.sql}`,\n args: [id, ...where.args],\n });\n }\n return result.rowsAffected > 0;\n}\n"]}
@@ -18,11 +18,22 @@ This keeps the main thread focused, lets sub-agents run in parallel, and gives y
18
18
 
19
19
  Sub-agent state is persisted in the `application_state` SQL table (under `agent-task:<taskId>`), so tasks survive serverless cold starts and work across multiple processes.
20
20
 
21
- Agent Teams runs on the same core `run-manager` harness as hosted agent chat:
22
- events are streamed and persisted, aborts propagate through SQL, heartbeats mark
23
- active work, and stale runs can be reaped consistently. New background-agent UIs
24
- should reuse `run-manager` or `spawnTask()` instead of introducing a separate
25
- runner with its own lifecycle rules.
21
+ Agent Teams runs on the same core `run-manager` harness/controller as hosted
22
+ agent chat: events are streamed and persisted, aborts propagate through SQL,
23
+ heartbeats mark active work, and stale runs can be reaped consistently. New
24
+ background-agent UIs should reuse `run-manager` or `spawnTask()` instead of
25
+ introducing a separate runner with its own lifecycle rules.
26
+
27
+ Agent-Native Code is the sibling local surface, not a second hosted-agent
28
+ lifecycle. Code currently keeps long-running local sessions in the file-backed
29
+ Code run store and exposes them through the shared background-run foundation.
30
+ The CLI commands (`agent-native`, `agent-native code`, `resume`, `status`,
31
+ `stop`, `ui`), the Desktop Code tab, background sessions, and sub-agent
32
+ sessions should present the same run model even when their persistence layer is
33
+ different. When a new surface needs both hosted sub-agents and local Code
34
+ sessions, adapt those sources into the shared background-run/run-manager
35
+ vocabulary instead of adding another queue, transcript model, or process
36
+ tracker.
26
37
 
27
38
  ## When to spawn a sub-agent {#when-to-spawn}
28
39
 
@@ -84,6 +95,12 @@ spawnTask()
84
95
 
85
96
  At any point the parent agent can resume the sub-agent with a follow-up via `sendToTask(taskId, message)`. If the sub-agent errors, `markTaskErrored(taskId, reason)` records the failure and surfaces it to the user.
86
97
 
98
+ Two-way messaging is durable. Parent follow-ups to running sub-agents are
99
+ delivered through the task lifecycle; if the sub-agent cannot consume them in
100
+ the current step, they should remain queued and be applied at a safe
101
+ continuation point. Sub-agents can also message back when they need clarification
102
+ instead of blocking invisibly.
103
+
87
104
  ## Reading task state {#reading-state}
88
105
 
89
106
  From server code or other actions:
@@ -18,14 +18,14 @@ Each one is a real app you could use today, and the launching pad for your own v
18
18
  | **Mail** | An agent-native Superhuman. Inbox, labels, AI triage, keyboard-first, drafts and sends through the agent. |
19
19
  | **Calendar** | An agent-native Google Calendar. Events, sync, public booking links, agent-driven scheduling. |
20
20
  | **Content** | An agent-native Notion / Google Docs. Markdown + Tiptap editor, Notion sync, real-time multi-user collab. |
21
- | **Brain** | A whole-company memory app: full-page company chat, cited decisions, review queue, and approved sources. |
21
+ | **Brain** | Clean company chat backed by cited institutional memory, approved sources, review gates, and citations. |
22
22
  | **Slides** | An agent-native Google Slides. React-based decks the agent generates and edits directly. |
23
23
  | **Video** | An agent-native video editor on Remotion. Prompt for a cut, the agent assembles it. |
24
24
  | **Analytics** | An agent-native Amplitude/Mixpanel. Connect data sources, prompt for charts, pin to dashboards. |
25
25
  | **Clips** | An agent-native Loom. Async screen + camera recording with transcription, chapters, AI summaries. |
26
26
  | **Design** | Agent-native HTML prototyping studio for interactive Alpine/Tailwind designs. |
27
27
  | **Forms** | An agent-native Typeform. Build, share, collect, and route submissions to Slack, Sheets, webhooks, or Discord. |
28
- | **Dispatch** | The workspace control plane: shared secrets, cross-app integrations, Slack/Telegram, scheduled jobs. |
28
+ | **Dispatch** | The workspace control plane: shared secrets, reusable integrations, Slack/Telegram, scheduled jobs. |
29
29
  | **Starter** | The minimal scaffold. Agent chat plus the architecture, nothing else. Build something new. |
30
30
 
31
31
  See the full catalog under [Templates](/templates), or jump straight to one — for example, [Dispatch](/docs/template-dispatch) is a great place to start if you want a workspace-style app.