@agent-native/core 0.77.8 → 0.77.10

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 (189) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +29 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/task-store.ts +25 -3
  5. package/corpus/core/src/agent/harness/store.ts +89 -55
  6. package/corpus/core/src/agent/observational-memory/store.ts +40 -14
  7. package/corpus/core/src/agent/run-store.ts +116 -59
  8. package/corpus/core/src/application-state/store.ts +36 -2
  9. package/corpus/core/src/audit/store.ts +37 -6
  10. package/corpus/core/src/browser-sessions/store.ts +31 -12
  11. package/corpus/core/src/chat-threads/store.ts +67 -3
  12. package/corpus/core/src/checkpoints/store.ts +14 -3
  13. package/corpus/core/src/cli/create.ts +9 -0
  14. package/corpus/core/src/collab/storage.ts +20 -2
  15. package/corpus/core/src/db/ddl-guard.ts +112 -0
  16. package/corpus/core/src/extensions/store.ts +76 -3
  17. package/corpus/core/src/integrations/a2a-continuations-store.ts +69 -26
  18. package/corpus/core/src/integrations/config-store.ts +19 -18
  19. package/corpus/core/src/integrations/pending-tasks-store.ts +40 -16
  20. package/corpus/core/src/integrations/remote-commands-store.ts +37 -23
  21. package/corpus/core/src/integrations/remote-devices-store.ts +64 -20
  22. package/corpus/core/src/integrations/remote-push-store.ts +75 -35
  23. package/corpus/core/src/integrations/remote-run-events-store.ts +38 -12
  24. package/corpus/core/src/integrations/thread-mapping-store.ts +11 -2
  25. package/corpus/core/src/mcp/connect-store.ts +53 -16
  26. package/corpus/core/src/mcp/oauth-store.ts +32 -7
  27. package/corpus/core/src/notifications/store.ts +20 -4
  28. package/corpus/core/src/oauth-tokens/store.ts +45 -2
  29. package/corpus/core/src/observability/store.ts +154 -47
  30. package/corpus/core/src/progress/store.ts +36 -21
  31. package/corpus/core/src/provider-api/corpus-jobs-store.ts +25 -5
  32. package/corpus/core/src/provider-api/custom-registry.ts +15 -4
  33. package/corpus/core/src/provider-api/quota-governor.ts +15 -3
  34. package/corpus/core/src/provider-api/staged-datasets-store.ts +22 -5
  35. package/corpus/core/src/resources/store.ts +66 -31
  36. package/corpus/core/src/secrets/storage.ts +18 -22
  37. package/corpus/core/src/server/agent-teams-run-queue.ts +22 -10
  38. package/corpus/core/src/server/auth.ts +22 -4
  39. package/corpus/core/src/server/better-auth-instance.ts +49 -15
  40. package/corpus/core/src/server/embed-session.ts +19 -4
  41. package/corpus/core/src/server/identity-sso-store.ts +40 -11
  42. package/corpus/core/src/server/recap-image-store.ts +28 -9
  43. package/corpus/core/src/settings/store.ts +14 -19
  44. package/corpus/core/src/usage/store.ts +51 -16
  45. package/corpus/core/src/workspace-connections/store.ts +200 -22
  46. package/corpus/templates/calendar/changelog/2026-06-25-booking-link-previews-now-show-the-content-directly-on-the-g.md +6 -0
  47. package/corpus/templates/calendar/server/lib/booking-og-image.ts +0 -2
  48. package/corpus/templates/forms/changelog/2026-06-25-form-previews-now-show-the-content-directly-on-the-grid-back.md +6 -0
  49. package/corpus/templates/forms/server/lib/form-og-image.ts +0 -2
  50. package/corpus/templates/plan/app/global.css +6 -11
  51. package/corpus/templates/plan/app/pages/PlansPage.tsx +12 -10
  52. package/corpus/templates/plan/changelog/2026-06-25-plan-access-request-pages-stay-visible-during-background-ref.md +6 -0
  53. package/corpus/templates/plan/changelog/2026-06-25-plan-documents-keep-their-full-reading-width-below-1200px-an.md +6 -0
  54. package/dist/a2a/task-store.d.ts.map +1 -1
  55. package/dist/a2a/task-store.js +19 -3
  56. package/dist/a2a/task-store.js.map +1 -1
  57. package/dist/agent/harness/store.d.ts.map +1 -1
  58. package/dist/agent/harness/store.js +63 -34
  59. package/dist/agent/harness/store.js.map +1 -1
  60. package/dist/agent/observational-memory/store.d.ts.map +1 -1
  61. package/dist/agent/observational-memory/store.js +30 -8
  62. package/dist/agent/observational-memory/store.js.map +1 -1
  63. package/dist/agent/run-store.d.ts.map +1 -1
  64. package/dist/agent/run-store.js +103 -46
  65. package/dist/agent/run-store.js.map +1 -1
  66. package/dist/application-state/store.d.ts.map +1 -1
  67. package/dist/application-state/store.js +28 -2
  68. package/dist/application-state/store.js.map +1 -1
  69. package/dist/audit/store.d.ts.map +1 -1
  70. package/dist/audit/store.js +18 -3
  71. package/dist/audit/store.js.map +1 -1
  72. package/dist/browser-sessions/store.d.ts.map +1 -1
  73. package/dist/browser-sessions/store.js +22 -7
  74. package/dist/browser-sessions/store.js.map +1 -1
  75. package/dist/chat-threads/store.d.ts.map +1 -1
  76. package/dist/chat-threads/store.js +51 -3
  77. package/dist/chat-threads/store.js.map +1 -1
  78. package/dist/checkpoints/store.d.ts.map +1 -1
  79. package/dist/checkpoints/store.js +12 -3
  80. package/dist/checkpoints/store.js.map +1 -1
  81. package/dist/cli/create.d.ts.map +1 -1
  82. package/dist/cli/create.js +9 -0
  83. package/dist/cli/create.js.map +1 -1
  84. package/dist/collab/routes.d.ts +2 -2
  85. package/dist/collab/storage.d.ts.map +1 -1
  86. package/dist/collab/storage.js +14 -2
  87. package/dist/collab/storage.js.map +1 -1
  88. package/dist/db/ddl-guard.d.ts +63 -0
  89. package/dist/db/ddl-guard.d.ts.map +1 -1
  90. package/dist/db/ddl-guard.js +85 -0
  91. package/dist/db/ddl-guard.js.map +1 -1
  92. package/dist/extensions/store.d.ts.map +1 -1
  93. package/dist/extensions/store.js +32 -3
  94. package/dist/extensions/store.js.map +1 -1
  95. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  96. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  97. package/dist/integrations/a2a-continuations-store.js +44 -24
  98. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  99. package/dist/integrations/config-store.d.ts.map +1 -1
  100. package/dist/integrations/config-store.js +17 -11
  101. package/dist/integrations/config-store.js.map +1 -1
  102. package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
  103. package/dist/integrations/pending-tasks-store.js +24 -16
  104. package/dist/integrations/pending-tasks-store.js.map +1 -1
  105. package/dist/integrations/remote-commands-store.d.ts.map +1 -1
  106. package/dist/integrations/remote-commands-store.js +29 -21
  107. package/dist/integrations/remote-commands-store.js.map +1 -1
  108. package/dist/integrations/remote-devices-store.d.ts.map +1 -1
  109. package/dist/integrations/remote-devices-store.js +33 -18
  110. package/dist/integrations/remote-devices-store.js.map +1 -1
  111. package/dist/integrations/remote-push-store.d.ts.map +1 -1
  112. package/dist/integrations/remote-push-store.js +53 -31
  113. package/dist/integrations/remote-push-store.js.map +1 -1
  114. package/dist/integrations/remote-run-events-store.d.ts.map +1 -1
  115. package/dist/integrations/remote-run-events-store.js +26 -10
  116. package/dist/integrations/remote-run-events-store.js.map +1 -1
  117. package/dist/integrations/thread-mapping-store.d.ts.map +1 -1
  118. package/dist/integrations/thread-mapping-store.js +10 -2
  119. package/dist/integrations/thread-mapping-store.js.map +1 -1
  120. package/dist/mcp/connect-store.d.ts.map +1 -1
  121. package/dist/mcp/connect-store.js +34 -16
  122. package/dist/mcp/connect-store.js.map +1 -1
  123. package/dist/mcp/oauth-store.d.ts.map +1 -1
  124. package/dist/mcp/oauth-store.js +22 -7
  125. package/dist/mcp/oauth-store.js.map +1 -1
  126. package/dist/notifications/routes.d.ts +2 -2
  127. package/dist/notifications/store.d.ts.map +1 -1
  128. package/dist/notifications/store.js +15 -3
  129. package/dist/notifications/store.js.map +1 -1
  130. package/dist/oauth-tokens/store.d.ts.map +1 -1
  131. package/dist/oauth-tokens/store.js +33 -2
  132. package/dist/oauth-tokens/store.js.map +1 -1
  133. package/dist/observability/routes.d.ts +7 -7
  134. package/dist/observability/store.d.ts.map +1 -1
  135. package/dist/observability/store.js +72 -29
  136. package/dist/observability/store.js.map +1 -1
  137. package/dist/progress/routes.d.ts +1 -1
  138. package/dist/progress/store.d.ts.map +1 -1
  139. package/dist/progress/store.js +31 -16
  140. package/dist/progress/store.js.map +1 -1
  141. package/dist/provider-api/corpus-jobs-store.d.ts.map +1 -1
  142. package/dist/provider-api/corpus-jobs-store.js +16 -5
  143. package/dist/provider-api/corpus-jobs-store.js.map +1 -1
  144. package/dist/provider-api/custom-registry.d.ts.map +1 -1
  145. package/dist/provider-api/custom-registry.js +14 -4
  146. package/dist/provider-api/custom-registry.js.map +1 -1
  147. package/dist/provider-api/quota-governor.d.ts.map +1 -1
  148. package/dist/provider-api/quota-governor.js +12 -3
  149. package/dist/provider-api/quota-governor.js.map +1 -1
  150. package/dist/provider-api/staged-datasets-store.d.ts.map +1 -1
  151. package/dist/provider-api/staged-datasets-store.js +16 -5
  152. package/dist/provider-api/staged-datasets-store.js.map +1 -1
  153. package/dist/resources/handlers.d.ts +3 -3
  154. package/dist/resources/store.d.ts.map +1 -1
  155. package/dist/resources/store.js +56 -25
  156. package/dist/resources/store.js.map +1 -1
  157. package/dist/secrets/storage.d.ts.map +1 -1
  158. package/dist/secrets/storage.js +10 -14
  159. package/dist/secrets/storage.js.map +1 -1
  160. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  161. package/dist/server/agent-teams-run-queue.d.ts.map +1 -1
  162. package/dist/server/agent-teams-run-queue.js +15 -4
  163. package/dist/server/agent-teams-run-queue.js.map +1 -1
  164. package/dist/server/auth.d.ts.map +1 -1
  165. package/dist/server/auth.js +16 -2
  166. package/dist/server/auth.js.map +1 -1
  167. package/dist/server/better-auth-instance.d.ts.map +1 -1
  168. package/dist/server/better-auth-instance.js +55 -21
  169. package/dist/server/better-auth-instance.js.map +1 -1
  170. package/dist/server/embed-session.d.ts.map +1 -1
  171. package/dist/server/embed-session.js +15 -4
  172. package/dist/server/embed-session.js.map +1 -1
  173. package/dist/server/identity-sso-store.d.ts.map +1 -1
  174. package/dist/server/identity-sso-store.js +30 -11
  175. package/dist/server/identity-sso-store.js.map +1 -1
  176. package/dist/server/recap-image-store.d.ts.map +1 -1
  177. package/dist/server/recap-image-store.js +21 -7
  178. package/dist/server/recap-image-store.js.map +1 -1
  179. package/dist/server/transcribe-voice.d.ts +1 -1
  180. package/dist/settings/store.d.ts.map +1 -1
  181. package/dist/settings/store.js +11 -13
  182. package/dist/settings/store.js.map +1 -1
  183. package/dist/usage/store.d.ts.map +1 -1
  184. package/dist/usage/store.js +36 -11
  185. package/dist/usage/store.js.map +1 -1
  186. package/dist/workspace-connections/store.d.ts.map +1 -1
  187. package/dist/workspace-connections/store.js +57 -7
  188. package/dist/workspace-connections/store.js.map +1 -1
  189. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/extensions/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { and, eq, gte, isNull } from \"drizzle-orm\";\n\nimport { appStatePut } from \"../application-state/store.js\";\nimport { getDbExec, isPostgres, retryOnDdlRace } from \"../db/client.js\";\nimport { createGetDb } from \"../db/create-get-db.js\";\nimport { recordChange } from \"../server/poll.js\";\nimport {\n getRequestUserEmail,\n getRequestOrgId,\n} from \"../server/request-context.js\";\nimport {\n accessFilter,\n assertAccess,\n resolveAccess,\n ForbiddenError,\n} from \"../sharing/access.js\";\nimport { registerShareableResource } from \"../sharing/registry.js\";\nimport {\n EXTENSION_CHANGE_MARKER_KEY,\n extensionChangeMarkerSession,\n extensionChangeMarkerValue,\n type ExtensionChangeTarget,\n} from \"./change-marker.js\";\nimport {\n applyExtensionContentUpdate,\n type ExtensionContentEdit,\n type ExtensionLegacyPatch,\n} from \"./content-patch.js\";\nimport {\n extensions,\n extensionHides,\n extensionShares,\n extensionHistory,\n EXTENSIONS_CREATE_SQL,\n EXTENSIONS_CREATE_SQL_PG,\n EXTENSION_SHARES_CREATE_SQL,\n EXTENSION_SHARES_CREATE_SQL_PG,\n EXTENSION_DATA_CREATE_SQL,\n EXTENSION_DATA_CREATE_SQL_PG,\n EXTENSION_DATA_ITEM_INDEX_SQL,\n EXTENSION_DATA_ITEM_INDEX_SQL_PG,\n EXTENSION_DATA_DROP_OLD_INDEX_SQL,\n EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG,\n EXTENSIONS_OWNER_INDEX_SQL,\n EXTENSIONS_ORG_INDEX_SQL,\n EXTENSIONS_UPDATED_INDEX_SQL,\n EXTENSIONS_HIDDEN_AT_COLUMN_SQL,\n EXTENSIONS_HIDDEN_BY_COLUMN_SQL,\n EXTENSIONS_HIDDEN_AT_INDEX_SQL,\n EXTENSION_SHARES_RESOURCE_INDEX_SQL,\n EXTENSION_HIDES_CREATE_SQL,\n EXTENSION_HIDES_CREATE_SQL_PG,\n EXTENSION_HIDES_UNIQUE_INDEX_SQL,\n EXTENSION_HIDES_OWNER_INDEX_SQL,\n EXTENSION_HISTORY_CREATE_SQL,\n EXTENSION_HISTORY_CREATE_SQL_PG,\n EXTENSION_HISTORY_VERSION_INDEX_SQL,\n EXTENSION_HISTORY_CREATED_INDEX_SQL,\n EXTENSION_CONSENTS_CREATE_SQL,\n EXTENSION_CONSENTS_CREATE_SQL_PG,\n EXTENSION_CONSENTS_VIEWER_INDEX_SQL,\n} from \"./schema.js\";\n\nconst getDb = createGetDb({\n extensions,\n extensionShares,\n extensionHides,\n extensionHistory,\n});\n\nlet _initPromise: Promise<void> | undefined;\n\nexport async function ensureExtensionsTables(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const pg = isPostgres();\n await retryOnDdlRace(() =>\n client.execute(pg ? EXTENSIONS_CREATE_SQL_PG : EXTENSIONS_CREATE_SQL),\n );\n await migrateMisnamedExtensionsTable(client, pg);\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_SHARES_CREATE_SQL_PG : EXTENSION_SHARES_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_DATA_CREATE_SQL_PG : EXTENSION_DATA_CREATE_SQL,\n ),\n );\n await ensureExtensionDataItemId(client, pg);\n await ensureExtensionDataScope(client, pg);\n await client.execute(\n pg\n ? EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG\n : EXTENSION_DATA_DROP_OLD_INDEX_SQL,\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_DATA_ITEM_INDEX_SQL_PG : EXTENSION_DATA_ITEM_INDEX_SQL,\n ),\n );\n await retryOnDdlRace(() => client.execute(EXTENSIONS_OWNER_INDEX_SQL));\n await retryOnDdlRace(() => client.execute(EXTENSIONS_ORG_INDEX_SQL));\n await retryOnDdlRace(() => client.execute(EXTENSIONS_UPDATED_INDEX_SQL));\n await ensureExtensionsGlobalHideColumns(client, pg);\n await retryOnDdlRace(() =>\n client.execute(EXTENSIONS_HIDDEN_AT_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_SHARES_RESOURCE_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_HIDES_CREATE_SQL_PG : EXTENSION_HIDES_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HIDES_UNIQUE_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HIDES_OWNER_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_HISTORY_CREATE_SQL_PG : EXTENSION_HISTORY_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HISTORY_VERSION_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HISTORY_CREATED_INDEX_SQL),\n );\n // tool_consents was introduced for an audit-C1 per-viewer consent\n // gate that we removed once we settled on intra-org trust as the\n // baseline. The table is kept (additive — never drop) so deploys\n // that already created it stay healthy; the runtime consent code\n // is gone. Idempotent CREATE IF NOT EXISTS for fresh schemas.\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_CONSENTS_CREATE_SQL_PG : EXTENSION_CONSENTS_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_CONSENTS_VIEWER_INDEX_SQL),\n );\n })();\n }\n\n try {\n await _initPromise;\n } catch (err) {\n _initPromise = undefined;\n throw err;\n }\n}\n\nasync function migrateMisnamedExtensionsTable(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n const sql = pg\n ? `INSERT INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)\n SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility\n FROM extensions\n ON CONFLICT (id) DO NOTHING`\n : `INSERT OR IGNORE INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)\n SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility\n FROM extensions`;\n\n try {\n await client.execute(sql);\n } catch (err: any) {\n const message = String(err?.message ?? err).toLowerCase();\n if (\n message.includes(\"no such table: extensions\") ||\n message.includes('relation \"extensions\" does not exist') ||\n message.includes(\"relation extensions does not exist\")\n ) {\n return;\n }\n throw err;\n }\n}\n\nasync function ensureExtensionDataItemId(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n if (pg) {\n await client.execute(\n `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS item_id TEXT`,\n );\n return;\n }\n\n // Keep this additive: legacy rows with item_id=id are still read correctly\n // through COALESCE(item_id, id), so SQLite never needs a table rebuild here.\n try {\n await client.execute(`ALTER TABLE tool_data ADD COLUMN item_id TEXT`);\n } catch (err: any) {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n ) {\n throw err;\n }\n }\n}\n\nasync function ensureExtensionDataScope(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n const addCol = (name: string, def: string) => {\n if (pg) {\n return client.execute(\n `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS ${name} ${def}`,\n );\n }\n return client\n .execute(`ALTER TABLE tool_data ADD COLUMN ${name} ${def}`)\n .catch((err: any) => {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n )\n throw err;\n });\n };\n await addCol(\"scope\", \"TEXT NOT NULL DEFAULT 'user'\");\n await addCol(\"org_id\", \"TEXT\");\n await addCol(\"scope_key\", \"TEXT NOT NULL DEFAULT 'local@localhost'\");\n // One-time backfill migration: replaces the dev-mode DEFAULT scope_key\n // with each row's real owner_email. Not a per-request fallback.\n await client.execute(\n // guard:allow-localhost-fallback — one-time backfill migration replacing dev-mode default scope_key with the row's real owner_email\n `UPDATE tool_data SET scope_key = owner_email WHERE scope_key = 'local@localhost' AND owner_email != 'local@localhost'`,\n );\n}\n\nasync function ensureExtensionsGlobalHideColumns(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n // Global (admin) hide columns on the `tools` row, distinct from the\n // per-user `tool_hidden_extensions` table. Additive — keep this idempotent\n // for both dialects. Postgres supports `ADD COLUMN IF NOT EXISTS`; SQLite\n // does not, so we drop the clause and swallow the duplicate-column error.\n const addCol = (pgSql: string, name: string, def: string) => {\n if (pg) {\n return retryOnDdlRace(() => client.execute(pgSql));\n }\n return client\n .execute(`ALTER TABLE tools ADD COLUMN ${name} ${def}`)\n .catch((err: any) => {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n )\n throw err;\n });\n };\n await addCol(EXTENSIONS_HIDDEN_AT_COLUMN_SQL, \"hidden_at\", \"TEXT\");\n await addCol(EXTENSIONS_HIDDEN_BY_COLUMN_SQL, \"hidden_by\", \"TEXT\");\n}\n\nexport function registerExtensionsShareable() {\n registerShareableResource({\n type: \"extension\",\n resourceTable: extensions,\n sharesTable: extensionShares,\n displayName: \"Extension\",\n titleColumn: \"name\",\n getDb: () => getDb(),\n // Extension HTML executes inside an iframe and calls actions / SQL / the\n // secrets-injecting proxy as the *viewer*. A public extension would let a\n // random authenticated user run code with the viewer's credentials — and\n // a malicious shared extension could re-share itself wider. Lock both:\n // no public visibility, and individual user shares must already be (or\n // be invited to) the org.\n allowPublic: false,\n requireOrgMemberForUserShares: true,\n });\n}\n\nexport interface ExtensionRow {\n id: string;\n name: string;\n description: string;\n content: string;\n icon: string | null;\n createdAt: string;\n updatedAt: string;\n hiddenAt: string | null;\n hiddenBy: string | null;\n ownerEmail: string;\n orgId: string | null;\n visibility: \"private\" | \"org\" | \"public\";\n}\n\nexport type ExtensionHistoryOperation =\n | \"create\"\n | \"baseline\"\n | \"metadata-update\"\n | \"content-update\"\n | \"restore\";\n\nexport interface ExtensionHistoryEntry {\n id: string;\n extensionId: string;\n version: number;\n operation: ExtensionHistoryOperation | string;\n summary: string;\n name: string;\n description: string;\n content?: string;\n icon: string | null;\n actorEmail: string | null;\n ownerEmail: string;\n orgId: string | null;\n visibility: \"private\" | \"org\" | \"public\";\n createdAt: string;\n persisted: boolean;\n contentLength: number;\n}\n\nexport interface ExtensionHistoryDiffLine {\n type: \"equal\" | \"insert\" | \"delete\";\n text: string;\n}\n\nexport interface ExtensionHistoryDetail {\n entry: ExtensionHistoryEntry;\n previous: ExtensionHistoryEntry | null;\n diff: ExtensionHistoryDiffLine[];\n stats: {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n };\n}\n\ninterface RawExtensionHistoryRow {\n id: string;\n tool_id?: string;\n extensionId?: string;\n version: number | string;\n operation: string;\n summary?: string | null;\n name: string;\n description?: string | null;\n content?: string | null;\n icon?: string | null;\n actor_email?: string | null;\n actorEmail?: string | null;\n owner_email?: string | null;\n ownerEmail?: string | null;\n org_id?: string | null;\n orgId?: string | null;\n visibility?: string | null;\n created_at?: string;\n createdAt?: string;\n}\n\nfunction targetKey(target: ExtensionChangeTarget): string | null {\n if (target.owner) return `owner:${target.owner}`;\n if (target.orgId) return `org:${target.orgId}`;\n return null;\n}\n\nfunction addExtensionChangeTarget(\n targets: Map<string, ExtensionChangeTarget>,\n target: ExtensionChangeTarget,\n): void {\n const key = targetKey(target);\n if (key) targets.set(key, target);\n}\n\nasync function extensionChangeTargetsForRow(\n row: ExtensionRow,\n): Promise<ExtensionChangeTarget[]> {\n const targets = new Map<string, ExtensionChangeTarget>();\n addExtensionChangeTarget(targets, { owner: row.ownerEmail });\n if (row.visibility === \"org\" && row.orgId) {\n addExtensionChangeTarget(targets, { orgId: row.orgId });\n }\n\n const db = getDb();\n const shares = (await db\n .select({\n principalType: extensionShares.principalType,\n principalId: extensionShares.principalId,\n })\n .from(extensionShares)\n .where(eq(extensionShares.resourceId, row.id))) as Array<{\n principalType: \"user\" | \"org\";\n principalId: string;\n }>;\n\n for (const share of shares) {\n if (share.principalType === \"user\") {\n addExtensionChangeTarget(targets, { owner: share.principalId });\n } else if (share.principalType === \"org\") {\n addExtensionChangeTarget(targets, { orgId: share.principalId });\n }\n }\n\n return Array.from(targets.values());\n}\n\nasync function extensionChangeTargetsForId(\n id: string,\n): Promise<ExtensionChangeTarget[]> {\n const db = getDb();\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = rows[0] as ExtensionRow | undefined;\n return row ? extensionChangeTargetsForRow(row) : [];\n}\n\nexport async function getExtensionChangeTargets(\n id: string,\n): Promise<ExtensionChangeTarget[]> {\n await ensureExtensionsTables();\n return extensionChangeTargetsForId(id);\n}\n\nfunction dedupeExtensionChangeTargets(\n targets: ExtensionChangeTarget[],\n): ExtensionChangeTarget[] {\n const unique = new Map<string, ExtensionChangeTarget>();\n for (const target of targets) {\n const key = targetKey(target);\n if (key) unique.set(key, target);\n }\n return Array.from(unique.values());\n}\n\nasync function notifyExtensionChanged(\n targets: ExtensionChangeTarget[],\n): Promise<void> {\n const uniqueTargets = dedupeExtensionChangeTargets(targets);\n if (uniqueTargets.length === 0) return;\n\n for (const target of uniqueTargets) {\n recordChange({\n source: \"extensions\",\n type: \"change\",\n key: \"*\",\n ...(target.owner ? { owner: target.owner } : {}),\n ...(target.orgId ? { orgId: target.orgId } : {}),\n });\n }\n\n await Promise.all(\n uniqueTargets.map(async (target) => {\n const sessionId = extensionChangeMarkerSession(target);\n if (!sessionId) return;\n await appStatePut(\n sessionId,\n EXTENSION_CHANGE_MARKER_KEY,\n extensionChangeMarkerValue(target),\n );\n }),\n );\n}\n\nexport async function notifyExtensionChangeForResource(\n id: string,\n beforeTargets: ExtensionChangeTarget[] = [],\n): Promise<void> {\n await ensureExtensionsTables();\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n}\n\nfunction extensionHistoryEntryFromRaw(\n row: RawExtensionHistoryRow,\n includeContent: boolean,\n): ExtensionHistoryEntry {\n const content = row.content ?? \"\";\n const visibility = normalizeVisibility(row.visibility);\n return {\n id: row.id,\n extensionId: String(row.tool_id ?? row.extensionId ?? \"\"),\n version: Number(row.version) || 1,\n operation: row.operation,\n summary: row.summary ?? \"\",\n name: row.name,\n description: row.description ?? \"\",\n ...(includeContent ? { content } : {}),\n icon: row.icon ?? null,\n actorEmail: row.actor_email ?? row.actorEmail ?? null,\n ownerEmail: row.owner_email ?? row.ownerEmail ?? \"\",\n orgId: row.org_id ?? row.orgId ?? null,\n visibility,\n createdAt: row.created_at ?? row.createdAt ?? new Date(0).toISOString(),\n persisted: true,\n contentLength: content.length,\n };\n}\n\nfunction extensionHistoryEntryFromExtension(\n row: ExtensionRow,\n includeContent: boolean,\n): ExtensionHistoryEntry {\n return {\n id: `current:${row.id}`,\n extensionId: row.id,\n version: 1,\n operation: \"baseline\",\n summary: \"Current version\",\n name: row.name,\n description: row.description,\n ...(includeContent ? { content: row.content } : {}),\n icon: row.icon,\n actorEmail: null,\n ownerEmail: row.ownerEmail,\n orgId: row.orgId,\n visibility: row.visibility,\n createdAt: row.updatedAt,\n persisted: false,\n contentLength: row.content.length,\n };\n}\n\nfunction normalizeVisibility(value: unknown): \"private\" | \"org\" | \"public\" {\n return value === \"org\" || value === \"public\" ? value : \"private\";\n}\n\nfunction currentActorEmail(): string | null {\n return getRequestUserEmail() ?? null;\n}\n\nfunction clampHistoryLimit(value: unknown): number {\n const limit = Number(value ?? 50);\n if (!Number.isFinite(limit)) return 50;\n return Math.min(Math.max(1, Math.floor(limit)), 100);\n}\n\nasync function historyVersionCount(extensionId: string): Promise<number> {\n const result = await getDbExec().execute({\n sql: `SELECT MAX(version) AS version FROM tool_history WHERE tool_id = ?`,\n args: [extensionId],\n });\n const value = (result.rows?.[0] as any)?.version;\n const version = Number(value ?? 0);\n return Number.isFinite(version) ? version : 0;\n}\n\nasync function hasExtensionHistory(extensionId: string): Promise<boolean> {\n const result = await getDbExec().execute({\n sql: `SELECT id FROM tool_history WHERE tool_id = ? LIMIT 1`,\n args: [extensionId],\n });\n return (result.rows?.length ?? 0) > 0;\n}\n\nasync function recordExtensionHistorySnapshot(\n row: ExtensionRow,\n operation: ExtensionHistoryOperation,\n summary: string,\n): Promise<ExtensionHistoryEntry> {\n const version = (await historyVersionCount(row.id)) + 1;\n const now = new Date().toISOString();\n const historyId = randomUUID();\n await getDbExec().execute({\n sql: `INSERT INTO tool_history (\n id, tool_id, version, operation, summary, name, description, content,\n icon, actor_email, owner_email, org_id, visibility, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n historyId,\n row.id,\n version,\n operation,\n summary,\n row.name,\n row.description,\n row.content,\n row.icon,\n currentActorEmail(),\n row.ownerEmail,\n row.orgId,\n row.visibility,\n now,\n ],\n });\n\n return {\n id: historyId,\n extensionId: row.id,\n version,\n operation,\n summary,\n name: row.name,\n description: row.description,\n content: row.content,\n icon: row.icon,\n actorEmail: currentActorEmail(),\n ownerEmail: row.ownerEmail,\n orgId: row.orgId,\n visibility: row.visibility,\n createdAt: now,\n persisted: true,\n contentLength: row.content.length,\n };\n}\n\nasync function ensureExtensionHistoryBaseline(\n row: ExtensionRow,\n): Promise<void> {\n if (await hasExtensionHistory(row.id)) return;\n await recordExtensionHistorySnapshot(\n row,\n \"baseline\",\n \"Saved starting version\",\n );\n}\n\nfunction summarizeMetadataChange(\n before: ExtensionRow,\n after: ExtensionRow,\n): string {\n const changes: string[] = [];\n if (before.name !== after.name) {\n changes.push(`Renamed from \"${before.name}\" to \"${after.name}\"`);\n }\n if (before.description !== after.description) {\n changes.push(\"Updated description\");\n }\n if (before.icon !== after.icon) {\n changes.push(\"Updated icon\");\n }\n if (before.visibility !== after.visibility) {\n changes.push(`Changed visibility to ${after.visibility}`);\n }\n return changes.join(\"; \") || \"Updated details\";\n}\n\nfunction summarizeContentChange(\n beforeContent: string,\n afterContent: string,\n): string {\n const stats = diffStats(createLineDiff(beforeContent, afterContent));\n if (!stats.changed) return \"Saved content\";\n return `Updated content (+${stats.addedLines} -${stats.deletedLines} lines)`;\n}\n\nfunction parseHistoryVersion(version: unknown): number | null {\n const parsed = Number(version);\n if (!Number.isInteger(parsed) || parsed < 1) return null;\n return parsed;\n}\n\nasync function getPersistedHistoryEntry(\n extensionId: string,\n version: number,\n includeContent: boolean,\n): Promise<ExtensionHistoryEntry | null> {\n const result = await getDbExec().execute({\n sql: `SELECT id, tool_id, version, operation, summary, name, description,\n content, icon, actor_email, owner_email, org_id, visibility, created_at\n FROM tool_history\n WHERE tool_id = ? AND version = ?\n LIMIT 1`,\n args: [extensionId, version],\n });\n const row = result.rows?.[0] as RawExtensionHistoryRow | undefined;\n return row ? extensionHistoryEntryFromRaw(row, includeContent) : null;\n}\n\nfunction splitLines(text: string): string[] {\n if (!text) return [];\n const parts = text.split(\"\\n\");\n return parts\n .map((line, index) => (index < parts.length - 1 ? `${line}\\n` : line))\n .filter((line) => line.length > 0);\n}\n\nfunction createLineDiff(\n beforeText: string,\n afterText: string,\n): ExtensionHistoryDiffLine[] {\n const before = splitLines(beforeText);\n const after = splitLines(afterText);\n if (before.length === 0 && after.length === 0) return [];\n\n const cells = before.length * after.length;\n if (cells > 40_000) return createBoundaryDiff(before, after);\n\n const dp = Array.from({ length: before.length + 1 }, () =>\n Array(after.length + 1).fill(0),\n );\n for (let i = before.length - 1; i >= 0; i -= 1) {\n for (let j = after.length - 1; j >= 0; j -= 1) {\n dp[i][j] =\n before[i] === after[j]\n ? dp[i + 1][j + 1] + 1\n : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n\n const diff: ExtensionHistoryDiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < before.length && j < after.length) {\n if (before[i] === after[j]) {\n diff.push({ type: \"equal\", text: before[i] });\n i += 1;\n j += 1;\n } else if (dp[i + 1][j] >= dp[i][j + 1]) {\n diff.push({ type: \"delete\", text: before[i] });\n i += 1;\n } else {\n diff.push({ type: \"insert\", text: after[j] });\n j += 1;\n }\n }\n while (i < before.length) {\n diff.push({ type: \"delete\", text: before[i] });\n i += 1;\n }\n while (j < after.length) {\n diff.push({ type: \"insert\", text: after[j] });\n j += 1;\n }\n return diff;\n}\n\nfunction createBoundaryDiff(\n before: string[],\n after: string[],\n): ExtensionHistoryDiffLine[] {\n let prefix = 0;\n while (\n prefix < before.length &&\n prefix < after.length &&\n before[prefix] === after[prefix]\n ) {\n prefix += 1;\n }\n\n let suffix = 0;\n while (\n suffix + prefix < before.length &&\n suffix + prefix < after.length &&\n before[before.length - 1 - suffix] === after[after.length - 1 - suffix]\n ) {\n suffix += 1;\n }\n\n return [\n ...before\n .slice(0, prefix)\n .map((text) => ({ type: \"equal\" as const, text })),\n ...before\n .slice(prefix, before.length - suffix)\n .map((text) => ({ type: \"delete\" as const, text })),\n ...after\n .slice(prefix, after.length - suffix)\n .map((text) => ({ type: \"insert\" as const, text })),\n ...before\n .slice(before.length - suffix)\n .map((text) => ({ type: \"equal\" as const, text })),\n ];\n}\n\nfunction diffStats(diff: ExtensionHistoryDiffLine[]): {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n} {\n const addedLines = diff.filter((line) => line.type === \"insert\").length;\n const deletedLines = diff.filter((line) => line.type === \"delete\").length;\n return {\n addedLines,\n deletedLines,\n changed: addedLines > 0 || deletedLines > 0,\n };\n}\n\nexport interface ListExtensionsOptions {\n includeHidden?: boolean;\n /**\n * Include extensions an admin/owner has globally hidden via `hidden_at`.\n * Off by default so globally-hidden extensions disappear for everyone.\n */\n includeGloballyHidden?: boolean;\n}\n\nexport async function listExtensions(\n options: ListExtensionsOptions = {},\n): Promise<ExtensionRow[]> {\n await ensureExtensionsTables();\n const db = getDb();\n // Build the WHERE with a single `and()` — drizzle replaces (not ANDs)\n // on repeated `.where()` calls, so combine the access filter and the\n // global-hidden filter into one condition.\n const base = accessFilter(extensions, extensionShares);\n const where = options.includeGloballyHidden\n ? base\n : and(base, isNull(extensions.hiddenAt));\n const rows = (await db\n .select()\n .from(extensions)\n .where(where)) as ExtensionRow[];\n\n if (options.includeHidden) return rows;\n\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n if (hiddenIds.size === 0) return rows;\n return rows.filter((row) => !hiddenIds.has(row.id));\n}\n\nexport async function getExtension(id: string): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n const access = await resolveAccess(\"extension\", id);\n return (access?.resource as ExtensionRow | undefined) ?? null;\n}\n\nexport interface ListExtensionHistoryOptions {\n limit?: number;\n includeContent?: boolean;\n}\n\nexport async function listExtensionHistory(\n id: string,\n options: ListExtensionHistoryOptions = {},\n): Promise<ExtensionHistoryEntry[]> {\n await ensureExtensionsTables();\n const extension = await getExtension(id);\n if (!extension) return [];\n\n const includeContent = options.includeContent === true;\n const limit = clampHistoryLimit(options.limit);\n const result = await getDbExec().execute({\n sql: `SELECT id, tool_id, version, operation, summary, name, description,\n content, icon, actor_email, owner_email, org_id, visibility, created_at\n FROM tool_history\n WHERE tool_id = ?\n ORDER BY version DESC\n LIMIT ?`,\n args: [id, limit],\n });\n\n const entries = (result.rows ?? []).map((row) =>\n extensionHistoryEntryFromRaw(row as RawExtensionHistoryRow, includeContent),\n );\n\n if (entries.length > 0) return entries;\n return [extensionHistoryEntryFromExtension(extension, includeContent)];\n}\n\nexport async function getExtensionHistoryVersion(\n id: string,\n versionValue: number | string,\n): Promise<ExtensionHistoryDetail | null> {\n await ensureExtensionsTables();\n const extension = await getExtension(id);\n if (!extension) return null;\n\n const version = parseHistoryVersion(versionValue);\n if (!version) return null;\n\n const persisted = await getPersistedHistoryEntry(id, version, true);\n const entry =\n persisted ??\n (!(await hasExtensionHistory(id)) && version === 1\n ? extensionHistoryEntryFromExtension(extension, true)\n : null);\n if (!entry) return null;\n\n const previous =\n version > 1 ? await getPersistedHistoryEntry(id, version - 1, true) : null;\n const previousContent = previous?.content ?? \"\";\n const currentContent = entry.content ?? \"\";\n const diff = createLineDiff(previousContent, currentContent);\n\n return {\n entry,\n previous,\n diff,\n stats: diffStats(diff),\n };\n}\n\nexport async function restoreExtensionHistoryVersion(\n id: string,\n versionValue: number | string,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n\n const version = parseHistoryVersion(versionValue);\n if (!version) return null;\n\n const existingRows = await getDb()\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const existing = existingRows[0] as ExtensionRow | undefined;\n if (!existing) return null;\n\n await ensureExtensionHistoryBaseline(existing);\n const target = await getPersistedHistoryEntry(id, version, true);\n if (!target) return null;\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n await getDb()\n .update(extensions)\n .set({\n name: target.name,\n description: target.description,\n content: target.content ?? \"\",\n icon: target.icon,\n updatedAt: new Date().toISOString(),\n })\n .where(eq(extensions.id, id));\n\n const rows = await getDb()\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"restore\",\n `Restored version ${version}`,\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport interface CreateExtensionData {\n name: string;\n description?: string;\n content?: string;\n icon?: string;\n}\n\nexport async function createExtension(\n data: CreateExtensionData,\n): Promise<ExtensionRow> {\n await ensureExtensionsTables();\n const db = getDb();\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n const orgId = getRequestOrgId();\n const id = randomUUID();\n const now = new Date().toISOString();\n const row: ExtensionRow = {\n id,\n name: data.name,\n description: data.description ?? \"\",\n content: data.content ?? \"\",\n icon: data.icon ?? null,\n createdAt: now,\n updatedAt: now,\n hiddenAt: null,\n hiddenBy: null,\n ownerEmail: userEmail,\n orgId: orgId ?? null,\n visibility: \"private\",\n };\n await db.insert(extensions).values(row);\n await recordExtensionHistorySnapshot(row, \"create\", \"Created extension\");\n await notifyExtensionChanged([{ owner: row.ownerEmail }]);\n return row;\n}\n\n/**\n * Returns an extension with the exact same name and content created by the\n * current user — in the current org/workspace scope — in the last 5 minutes,\n * or null if none exists. Used to make create-extension idempotent when a\n * connection drop causes the agent to retry the same tool call.\n *\n * Scoped by `orgId` the same way `createExtension` stamps it, so the same\n * `ownerEmail` working in two different orgs can create identically-named,\n * identical-content extensions without this lookup cross-matching and skipping\n * the second insert. Keyed on the FULL create inputs (name + content +\n * description + icon, normalized exactly as `createExtension` stores them), so\n * two creates that differ in any of them are treated as distinct — only a\n * byte-identical re-create (the connection-retry case) recovers the prior row,\n * and no intentional second create silently loses its metadata.\n */\nexport async function findRecentDuplicateExtension(data: {\n name: string;\n content: string;\n description?: string;\n icon?: string;\n}): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n const db = getDb();\n const userEmail = getRequestUserEmail();\n if (!userEmail) return null;\n const orgId = getRequestOrgId() ?? null;\n const description = data.description ?? \"\";\n const icon = data.icon ?? null;\n const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString();\n const rows = await db\n .select()\n .from(extensions)\n .where(\n and(\n eq(extensions.ownerEmail, userEmail),\n orgId === null ? isNull(extensions.orgId) : eq(extensions.orgId, orgId),\n eq(extensions.name, data.name),\n eq(extensions.content, data.content),\n eq(extensions.description, description),\n icon === null ? isNull(extensions.icon) : eq(extensions.icon, icon),\n gte(extensions.createdAt, fiveMinutesAgo),\n isNull(extensions.hiddenAt),\n ),\n )\n .limit(1);\n return rows[0] ?? null;\n}\n\nexport interface UpdateExtensionData {\n name?: string;\n description?: string;\n icon?: string;\n /**\n * Extensions cannot be public — `set-resource-visibility` and this store\n * helper both reject `\"public\"`. The type lists it so the framework's\n * generic share UI compiles, not because it's allowed at runtime.\n */\n visibility?: \"private\" | \"org\" | \"public\";\n}\n\nexport async function updateExtension(\n id: string,\n data: UpdateExtensionData,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n if (data.visibility === \"public\") {\n // Defense in depth — `registerExtensionsShareable` sets\n // `allowPublic: false`, so `set-resource-visibility` already rejects\n // this. Block direct callers too (HTTP `PUT /extensions/:id`, internal\n // refactors) so the rule holds regardless of entry point.\n throw new ForbiddenError(\n \"Extensions cannot be made public — share with specific people or your organization instead.\",\n );\n }\n const db = getDb();\n const beforeTargets = await extensionChangeTargetsForId(id);\n const updates: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n if (data.name !== undefined) updates.name = data.name;\n if (data.description !== undefined) updates.description = data.description;\n if (data.icon !== undefined) updates.icon = data.icon;\n if (data.visibility !== undefined) updates.visibility = data.visibility;\n const existingRows = await db\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const existing = existingRows[0] as ExtensionRow | undefined;\n if (!existing) return null;\n await ensureExtensionHistoryBaseline(existing);\n await db.update(extensions).set(updates).where(eq(extensions.id, id));\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"metadata-update\",\n summarizeMetadataChange(existing, row),\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport interface UpdateExtensionContentOpts {\n content?: string;\n patches?: ExtensionLegacyPatch[];\n edits?: ExtensionContentEdit[];\n format?: boolean;\n}\n\nexport async function updateExtensionContent(\n id: string,\n opts: UpdateExtensionContentOpts,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n const db = getDb();\n\n if (\n opts.content === undefined &&\n opts.patches === undefined &&\n opts.edits === undefined &&\n !opts.format\n ) {\n return null;\n }\n\n const existingRows = await db\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n if (!existingRows[0]) return null;\n const existing = existingRows[0] as ExtensionRow;\n const existingContent = existing.content;\n await ensureExtensionHistoryBaseline(existing);\n const update = await applyExtensionContentUpdate(existingContent, opts);\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n await db\n .update(extensions)\n .set({ content: update.content, updatedAt: new Date().toISOString() })\n .where(eq(extensions.id, id));\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"content-update\",\n summarizeContentChange(existingContent, row.content),\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport async function deleteExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const db = getDb();\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = rows[0] as ExtensionRow | undefined;\n if (!row) return false;\n const targets = await extensionChangeTargetsForRow(row);\n await db.delete(extensionShares).where(eq(extensionShares.resourceId, id));\n await db.delete(extensionHides).where(eq(extensionHides.extensionId, id));\n await getDbExec().execute({\n sql: `DELETE FROM tool_data WHERE tool_id = ?`,\n args: [id],\n });\n await getDbExec().execute({\n sql: `DELETE FROM tool_history WHERE tool_id = ?`,\n args: [id],\n });\n const { cascadeDeleteExtensionSlots } = await import(\"./slots/store.js\");\n await cascadeDeleteExtensionSlots(id);\n await db.delete(extensions).where(eq(extensions.id, id));\n await notifyExtensionChanged(targets);\n return true;\n}\n\nexport async function getHiddenExtensionIdsForCurrentUser(): Promise<\n Set<string>\n> {\n await ensureExtensionsTables();\n const userEmail = getRequestUserEmail();\n if (!userEmail) return new Set();\n\n const db = getDb();\n const rows = await db\n .select({ extensionId: extensionHides.extensionId })\n .from(extensionHides)\n .where(eq(extensionHides.ownerEmail, userEmail));\n return new Set(rows.map((row) => row.extensionId));\n}\n\nexport async function hideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"viewer\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `INSERT INTO tool_hidden_extensions (id, tool_id, owner_email, created_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT (owner_email, tool_id) DO NOTHING`,\n args: [randomUUID(), id, userEmail, now],\n });\n await notifyExtensionChanged([{ owner: userEmail }]);\n return true;\n}\n\nexport async function unhideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n await getDbExec().execute({\n sql: `DELETE FROM tool_hidden_extensions WHERE tool_id = ? AND owner_email = ?`,\n args: [id, userEmail],\n });\n await notifyExtensionChanged([{ owner: userEmail }]);\n return true;\n}\n\n/**\n * Globally hide an extension from EVERYONE's list by stamping `hidden_at` /\n * `hidden_by` on the `tools` row. Distinct from the per-user `hideExtension`\n * (`tool_hidden_extensions`) — this affects all viewers. Requires admin/owner\n * access. The extension is not deleted and stays accessible by id; pass\n * `includeGloballyHidden: true` to `listExtensions` to surface it again.\n */\nexport async function globalHideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `UPDATE tools SET hidden_at = ?, hidden_by = ?, updated_at = ? WHERE id = ?`,\n args: [now, userEmail, now, id],\n });\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n return true;\n}\n\n/**\n * Clear a global hide so the extension reappears in everyone's list. Requires\n * admin/owner access. Mirrors `globalHideExtension`.\n */\nexport async function globalUnhideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `UPDATE tools SET hidden_at = NULL, hidden_by = NULL, updated_at = ? WHERE id = ?`,\n args: [now, id],\n });\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n return true;\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/extensions/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,mBAAmB,EACnB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,GAE3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,2BAA2B,GAG5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,UAAU,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,2BAA2B,EAC3B,8BAA8B,EAC9B,yBAAyB,EACzB,4BAA4B,EAC5B,6BAA6B,EAC7B,gCAAgC,EAChC,iCAAiC,EACjC,oCAAoC,EACpC,0BAA0B,EAC1B,wBAAwB,EACxB,4BAA4B,EAC5B,+BAA+B,EAC/B,+BAA+B,EAC/B,8BAA8B,EAC9B,mCAAmC,EACnC,0BAA0B,EAC1B,6BAA6B,EAC7B,gCAAgC,EAChC,+BAA+B,EAC/B,4BAA4B,EAC5B,+BAA+B,EAC/B,mCAAmC,EACnC,mCAAmC,EACnC,6BAA6B,EAC7B,gCAAgC,EAChC,mCAAmC,GACpC,MAAM,aAAa,CAAC;AAErB,MAAM,KAAK,GAAG,WAAW,CAAC;IACxB,UAAU;IACV,eAAe;IACf,cAAc;IACd,gBAAgB;CACjB,CAAC,CAAC;AAEH,IAAI,YAAuC,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,IAAI,EAAE,EAAE,CAAC;gBACP,0FAA0F;gBAC1F,MAAM,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;gBAC3D,MAAM,8BAA8B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,sCAAsC;gBACxF,MAAM,iBAAiB,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;gBACvE,MAAM,iBAAiB,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;gBACnE,MAAM,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,8BAA8B;gBAC3E,MAAM,wBAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,8BAA8B;gBAC1E,qFAAqF;gBACrF,MAAM,MAAM,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;gBAC3D,MAAM,iBAAiB,CACrB,2BAA2B,EAC3B,gCAAgC,CACjC,CAAC;gBACF,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;gBACvE,MAAM,iBAAiB,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;gBACnE,MAAM,iBAAiB,CACrB,sBAAsB,EACtB,4BAA4B,CAC7B,CAAC;gBACF,MAAM,iCAAiC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,8BAA8B;gBACnF,MAAM,iBAAiB,CACrB,qBAAqB,EACrB,8BAA8B,CAC/B,CAAC;gBACF,MAAM,iBAAiB,CACrB,0BAA0B,EAC1B,mCAAmC,CACpC,CAAC;gBACF,MAAM,iBAAiB,CACrB,wBAAwB,EACxB,6BAA6B,CAC9B,CAAC;gBACF,MAAM,iBAAiB,CACrB,sCAAsC,EACtC,gCAAgC,CACjC,CAAC;gBACF,MAAM,iBAAiB,CACrB,kCAAkC,EAClC,+BAA+B,CAChC,CAAC;gBACF,MAAM,iBAAiB,CACrB,cAAc,EACd,+BAA+B,CAChC,CAAC;gBACF,MAAM,iBAAiB,CACrB,+BAA+B,EAC/B,mCAAmC,CACpC,CAAC;gBACF,MAAM,iBAAiB,CACrB,+BAA+B,EAC/B,mCAAmC,CACpC,CAAC;gBACF,MAAM,iBAAiB,CACrB,eAAe,EACf,gCAAgC,CACjC,CAAC;gBACF,MAAM,iBAAiB,CACrB,0BAA0B,EAC1B,mCAAmC,CACpC,CAAC;gBACF,OAAO;YACT,CAAC;YACD,6CAA6C;YAC7C,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CACtE,CAAC;YACF,MAAM,8BAA8B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjD,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,EAAE,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,2BAA2B,CAClE,CACF,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,EAAE,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,yBAAyB,CAC9D,CACF,CAAC;YACF,MAAM,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,wBAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,MAAM,CAAC,OAAO,CAClB,EAAE;gBACA,CAAC,CAAC,oCAAoC;gBACtC,CAAC,CAAC,iCAAiC,CACtC,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,EAAE,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,6BAA6B,CACtE,CACF,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACvE,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACrE,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACzE,MAAM,iCAAiC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAC/C,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,mCAAmC,CAAC,CACpD,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,EAAE,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,0BAA0B,CAChE,CACF,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CACjD,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAChD,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,EAAE,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,4BAA4B,CACpE,CACF,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,mCAAmC,CAAC,CACpD,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,mCAAmC,CAAC,CACpD,CAAC;YACF,kEAAkE;YAClE,iEAAiE;YACjE,iEAAiE;YACjE,iEAAiE;YACjE,8DAA8D;YAC9D,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,EAAE,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,6BAA6B,CACtE,CACF,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC,mCAAmC,CAAC,CACpD,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,GAAG,SAAS,CAAC;QACzB,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,MAAoC,EACpC,EAAW;IAEX,MAAM,GAAG,GAAG,EAAE;QACZ,CAAC,CAAC;;;mCAG6B;QAC/B,CAAC,CAAC;;uBAEiB,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D,IACE,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YAC7C,OAAO,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YACxD,OAAO,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EACtD,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,MAAoC,EACpC,EAAW;IAEX,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,kBAAkB,CACtB,WAAW,EACX,SAAS,EACT,6DAA6D,CAC9D,CAAC;QACF,OAAO;IACT,CAAC;IAED,2EAA2E;IAC3E,6EAA6E;IAC7E,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IACE,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC;aACzB,WAAW,EAAE;aACb,QAAQ,CAAC,WAAW,CAAC,EACxB,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,MAAoC,EACpC,EAAW;IAEX,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE;QAC3C,IAAI,EAAE,EAAE,CAAC;YACP,OAAO,kBAAkB,CACvB,WAAW,EACX,IAAI,EACJ,kDAAkD,IAAI,IAAI,GAAG,EAAE,CAChE,CAAC;QACJ,CAAC;QACD,OAAO,MAAM;aACV,OAAO,CAAC,oCAAoC,IAAI,IAAI,GAAG,EAAE,CAAC;aAC1D,KAAK,CAAC,CAAC,GAAQ,EAAE,EAAE;YAClB,IACE,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC;iBACzB,WAAW,EAAE;iBACb,QAAQ,CAAC,WAAW,CAAC;gBAExB,MAAM,GAAG,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IACF,MAAM,MAAM,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;IACtD,MAAM,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,MAAM,CAAC,WAAW,EAAE,yCAAyC,CAAC,CAAC;IACrE,uEAAuE;IACvE,gEAAgE;IAChE,MAAM,MAAM,CAAC,OAAO;IAClB,oIAAoI;IACpI,uHAAuH,CACxH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iCAAiC,CAC9C,MAAoC,EACpC,EAAW;IAEX,oEAAoE;IACpE,2EAA2E;IAC3E,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,GAAW,EAAE,EAAE;QAC1D,IAAI,EAAE,EAAE,CAAC;YACP,OAAO,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,MAAM;aACV,OAAO,CAAC,gCAAgC,IAAI,IAAI,GAAG,EAAE,CAAC;aACtD,KAAK,CAAC,CAAC,GAAQ,EAAE,EAAE;YAClB,IACE,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC;iBACzB,WAAW,EAAE;iBACb,QAAQ,CAAC,WAAW,CAAC;gBAExB,MAAM,GAAG,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IACF,MAAM,MAAM,CAAC,+BAA+B,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACnE,MAAM,MAAM,CAAC,+BAA+B,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,yBAAyB,CAAC;QACxB,IAAI,EAAE,WAAW;QACjB,aAAa,EAAE,UAAU;QACzB,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE;QACpB,yEAAyE;QACzE,0EAA0E;QAC1E,yEAAyE;QACzE,uEAAuE;QACvE,uEAAuE;QACvE,0BAA0B;QAC1B,WAAW,EAAE,KAAK;QAClB,6BAA6B,EAAE,IAAI;KACpC,CAAC,CAAC;AACL,CAAC;AAiFD,SAAS,SAAS,CAAC,MAA6B;IAC9C,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC;IACjD,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAC/B,OAA2C,EAC3C,MAA6B;IAE7B,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,GAAG;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,GAAiB;IAEjB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiC,CAAC;IACzD,wBAAwB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7D,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1C,wBAAwB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE;SACrB,MAAM,CAAC;QACN,aAAa,EAAE,eAAe,CAAC,aAAa;QAC5C,WAAW,EAAE,eAAe,CAAC,WAAW;KACzC,CAAC;SACD,IAAI,CAAC,eAAe,CAAC;SACrB,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAG9C,CAAC;IAEH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YACnC,wBAAwB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;YACzC,wBAAwB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,EAAU;IAEV,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAA6B,CAAC;IAChD,OAAO,GAAG,CAAC,CAAC,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,EAAU;IAEV,MAAM,sBAAsB,EAAE,CAAC;IAC/B,OAAO,2BAA2B,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,4BAA4B,CACnC,OAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiC,CAAC;IACxD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,GAAG;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,OAAgC;IAEhC,MAAM,aAAa,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEvC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,YAAY,CAAC;YACX,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE,GAAG;YACR,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CACf,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACjC,MAAM,SAAS,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,WAAW,CACf,SAAS,EACT,2BAA2B,EAC3B,0BAA0B,CAAC,MAAM,CAAC,CACnC,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,EAAU,EACV,aAAa,GAA4B,EAAE;IAE3C,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,sBAAsB,CAAC;QAC3B,GAAG,aAAa;QAChB,GAAG,CAAC,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;KAC3C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,4BAA4B,CACnC,GAA2B,EAC3B,cAAuB;IAEvB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACvD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QACzD,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;QAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;QAClC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI;QACtB,UAAU,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI;QACrD,UAAU,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE;QACnD,KAAK,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI;QACtC,UAAU;QACV,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QACvE,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,OAAO,CAAC,MAAM;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,kCAAkC,CACzC,GAAiB,EACjB,cAAuB;IAEvB,OAAO;QACL,EAAE,EAAE,WAAW,GAAG,CAAC,EAAE,EAAE;QACvB,WAAW,EAAE,GAAG,CAAC,EAAE;QACnB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,iBAAiB;QAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,KAAK;QAChB,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,mBAAmB,EAAE,IAAI,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IACpD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACvC,GAAG,EAAE,oEAAoE;QACzE,IAAI,EAAE,CAAC,WAAW,CAAC;KACpB,CAAC,CAAC;IACH,MAAM,KAAK,GAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAS,EAAE,OAAO,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IACpD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACvC,GAAG,EAAE,uDAAuD;QAC5D,IAAI,EAAE,CAAC,WAAW,CAAC;KACpB,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,GAAiB,EACjB,SAAoC,EACpC,OAAe;IAEf,MAAM,OAAO,GAAG,CAAC,MAAM,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC/B,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACxB,GAAG,EAAE;;;wDAG+C;QACpD,IAAI,EAAE;YACJ,SAAS;YACT,GAAG,CAAC,EAAE;YACN,OAAO;YACP,SAAS;YACT,OAAO;YACP,GAAG,CAAC,IAAI;YACR,GAAG,CAAC,WAAW;YACf,GAAG,CAAC,OAAO;YACX,GAAG,CAAC,IAAI;YACR,iBAAiB,EAAE;YACnB,GAAG,CAAC,UAAU;YACd,GAAG,CAAC,KAAK;YACT,GAAG,CAAC,UAAU;YACd,GAAG;SACJ;KACF,CAAC,CAAC;IAEH,OAAO;QACL,EAAE,EAAE,SAAS;QACb,WAAW,EAAE,GAAG,CAAC,EAAE;QACnB,OAAO;QACP,SAAS;QACT,OAAO;QACP,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,iBAAiB,EAAE;QAC/B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;KAClC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,GAAiB;IAEjB,IAAI,MAAM,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO;IAC9C,MAAM,8BAA8B,CAClC,GAAG,EACH,UAAU,EACV,wBAAwB,CACzB,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAoB,EACpB,KAAmB;IAEnB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC;AACjD,CAAC;AAED,SAAS,sBAAsB,CAC7B,aAAqB,EACrB,YAAoB;IAEpB,MAAM,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,eAAe,CAAC;IAC3C,OAAO,qBAAqB,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,YAAY,SAAS,CAAC;AAC/E,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,WAAmB,EACnB,OAAe,EACf,cAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACvC,GAAG,EAAE;;;;cAIK;QACV,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;KAC7B,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAuC,CAAC;IACnE,OAAO,GAAG,CAAC,CAAC,CAAC,4BAA4B,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxE,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACrE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CACrB,UAAkB,EAClB,SAAiB;IAEjB,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3C,IAAI,KAAK,GAAG,MAAM;QAAE,OAAO,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAE7D,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CACxD,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACN,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;oBACpB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;oBACtB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAA+B,EAAE,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC,IAAI,CAAC,CAAC;YACP,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/C,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAgB,EAChB,KAAe;IAEf,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OACE,MAAM,GAAG,MAAM,CAAC,MAAM;QACtB,MAAM,GAAG,KAAK,CAAC,MAAM;QACrB,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,EAChC,CAAC;QACD,MAAM,IAAI,CAAC,CAAC;IACd,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OACE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM;QAC/B,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM;QAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,EACvE,CAAC;QACD,MAAM,IAAI,CAAC,CAAC;IACd,CAAC;IAED,OAAO;QACL,GAAG,MAAM;aACN,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;aAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,GAAG,MAAM;aACN,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;aACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,GAAG,KAAK;aACL,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;aACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,GAAG,MAAM;aACN,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;aAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAgC;IAKjD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC1E,OAAO;QACL,UAAU;QACV,YAAY;QACZ,OAAO,EAAE,UAAU,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC;KAC5C,CAAC;AACJ,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAO,GAA0B,EAAE;IAEnC,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,sEAAsE;IACtE,qEAAqE;IACrE,2CAA2C;IAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,qBAAqB;QACzC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE;SACnB,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,KAAK,CAAC,CAAmB,CAAC;IAEnC,IAAI,OAAO,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,SAAS,GAAG,MAAM,mCAAmC,EAAE,CAAC;IAC9D,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAU;IAC3C,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACpD,OAAQ,MAAM,EAAE,QAAqC,IAAI,IAAI,CAAC;AAChE,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAU,EACV,OAAO,GAAgC,EAAE;IAEzC,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,KAAK,IAAI,CAAC;IACvD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACvC,GAAG,EAAE;;;;;cAKK;QACV,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC;KAClB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC9C,4BAA4B,CAAC,GAA6B,EAAE,cAAc,CAAC,CAC5E,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,OAAO,CAAC,kCAAkC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,EAAU,EACV,YAA6B;IAE7B,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACpE,MAAM,KAAK,GACT,SAAS;QACT,CAAC,CAAC,CAAC,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC;YAChD,CAAC,CAAC,kCAAkC,CAAC,SAAS,EAAE,IAAI,CAAC;YACrD,CAAC,CAAC,IAAI,CAAC,CAAC;IACZ,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,QAAQ,GACZ,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,wBAAwB,CAAC,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,MAAM,eAAe,GAAG,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC;IAChD,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAE7D,OAAO;QACL,KAAK;QACL,QAAQ;QACR,IAAI;QACJ,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,EAAU,EACV,YAA6B;IAE7B,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,YAAY,GAAG,MAAM,KAAK,EAAE;SAC/B,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAA6B,CAAC;IAC7D,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,EAAE;SACV,MAAM,CAAC,UAAU,CAAC;SAClB,GAAG,CAAC;QACH,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE;SACvB,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,GAAG,GAAI,IAAI,CAAC,CAAC,CAAkB,IAAI,IAAI,CAAC;IAC9C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,8BAA8B,CAClC,GAAG,EACH,SAAS,EACT,oBAAoB,OAAO,EAAE,CAC9B,CAAC;QACF,MAAM,sBAAsB,CAAC;YAC3B,GAAG,aAAa;YAChB,GAAG,CAAC,MAAM,4BAA4B,CAAC,GAAG,CAAC,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAyB;IAEzB,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,GAAG,GAAiB;QACxB,EAAE;QACF,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,SAAS;QACrB,KAAK,EAAE,KAAK,IAAI,IAAI;QACpB,UAAU,EAAE,SAAS;KACtB,CAAC;IACF,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,8BAA8B,CAAC,GAAG,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACzE,MAAM,sBAAsB,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,IAKlD;IACC,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,KAAK,GAAG,eAAe,EAAE,IAAI,IAAI,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,EACpC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,EACvE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAC9B,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EACpC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,EACvC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,EACnE,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,EACzC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC5B,CACF;SACA,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACzB,CAAC;AAcD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAU,EACV,IAAyB;IAEzB,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACjC,wDAAwD;QACxD,qEAAqE;QACrE,uEAAuE;QACvE,0DAA0D;QAC1D,MAAM,IAAI,cAAc,CACtB,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,OAAO,GAA4B;QACvC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAC3E,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACxE,MAAM,YAAY,GAAG,MAAM,EAAE;SAC1B,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAA6B,CAAC;IAC7D,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAI,IAAI,CAAC,CAAC,CAAkB,IAAI,IAAI,CAAC;IAC9C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,8BAA8B,CAClC,GAAG,EACH,iBAAiB,EACjB,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CACvC,CAAC;QACF,MAAM,sBAAsB,CAAC;YAC3B,GAAG,aAAa;YAChB,GAAG,CAAC,MAAM,4BAA4B,CAAC,GAAG,CAAC,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAU,EACV,IAAgC;IAEhC,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,IACE,IAAI,CAAC,OAAO,KAAK,SAAS;QAC1B,IAAI,CAAC,OAAO,KAAK,SAAS;QAC1B,IAAI,CAAC,KAAK,KAAK,SAAS;QACxB,CAAC,IAAI,CAAC,MAAM,EACZ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,EAAE;SAC1B,MAAM,EAAE;SACR,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAiB,CAAC;IACjD,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC;IACzC,MAAM,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAExE,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE;SACL,MAAM,CAAC,UAAU,CAAC;SAClB,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;SACrE,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAI,IAAI,CAAC,CAAC,CAAkB,IAAI,IAAI,CAAC;IAC9C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,8BAA8B,CAClC,GAAG,EACH,gBAAgB,EAChB,sBAAsB,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,CACrD,CAAC;QACF,MAAM,sBAAsB,CAAC;YAC3B,GAAG,aAAa;YAChB,GAAG,CAAC,MAAM,4BAA4B,CAAC,GAAG,CAAC,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAU;IAC9C,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAA6B,CAAC;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACxB,GAAG,EAAE,yCAAyC;QAC9C,IAAI,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;IACH,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACxB,GAAG,EAAE,4CAA4C;QACjD,IAAI,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;IACH,MAAM,EAAE,2BAA2B,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACzE,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mCAAmC;IAGvD,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAEjC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC;SACnD,IAAI,CAAC,cAAc,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU;IAC5C,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEzD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACxB,GAAG,EAAE;;oDAE2C;QAChD,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC;KACzC,CAAC,CAAC;IACH,MAAM,sBAAsB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAU;IAC9C,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEzD,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACxB,GAAG,EAAE,0EAA0E;QAC/E,IAAI,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC;KACtB,CAAC,CAAC;IACH,MAAM,sBAAsB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAU;IAClD,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEzD,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACxB,GAAG,EAAE,4EAA4E;QACjF,IAAI,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC;KAChC,CAAC,CAAC;IACH,MAAM,sBAAsB,CAAC;QAC3B,GAAG,aAAa;QAChB,GAAG,CAAC,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;KAC3C,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAU;IACpD,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEzD,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,SAAS,EAAE,CAAC,OAAO,CAAC;QACxB,GAAG,EAAE,kFAAkF;QACvF,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;KAChB,CAAC,CAAC;IACH,MAAM,sBAAsB,CAAC;QAC3B,GAAG,aAAa;QAChB,GAAG,CAAC,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;KAC3C,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { and, eq, gte, isNull } from \"drizzle-orm\";\n\nimport { appStatePut } from \"../application-state/store.js\";\nimport { getDbExec, isPostgres, retryOnDdlRace } from \"../db/client.js\";\nimport { createGetDb } from \"../db/create-get-db.js\";\nimport {\n ensureTableExists,\n ensureColumnExists,\n ensureIndexExists,\n} from \"../db/ddl-guard.js\";\nimport { recordChange } from \"../server/poll.js\";\nimport {\n getRequestUserEmail,\n getRequestOrgId,\n} from \"../server/request-context.js\";\nimport {\n accessFilter,\n assertAccess,\n resolveAccess,\n ForbiddenError,\n} from \"../sharing/access.js\";\nimport { registerShareableResource } from \"../sharing/registry.js\";\nimport {\n EXTENSION_CHANGE_MARKER_KEY,\n extensionChangeMarkerSession,\n extensionChangeMarkerValue,\n type ExtensionChangeTarget,\n} from \"./change-marker.js\";\nimport {\n applyExtensionContentUpdate,\n type ExtensionContentEdit,\n type ExtensionLegacyPatch,\n} from \"./content-patch.js\";\nimport {\n extensions,\n extensionHides,\n extensionShares,\n extensionHistory,\n EXTENSIONS_CREATE_SQL,\n EXTENSIONS_CREATE_SQL_PG,\n EXTENSION_SHARES_CREATE_SQL,\n EXTENSION_SHARES_CREATE_SQL_PG,\n EXTENSION_DATA_CREATE_SQL,\n EXTENSION_DATA_CREATE_SQL_PG,\n EXTENSION_DATA_ITEM_INDEX_SQL,\n EXTENSION_DATA_ITEM_INDEX_SQL_PG,\n EXTENSION_DATA_DROP_OLD_INDEX_SQL,\n EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG,\n EXTENSIONS_OWNER_INDEX_SQL,\n EXTENSIONS_ORG_INDEX_SQL,\n EXTENSIONS_UPDATED_INDEX_SQL,\n EXTENSIONS_HIDDEN_AT_COLUMN_SQL,\n EXTENSIONS_HIDDEN_BY_COLUMN_SQL,\n EXTENSIONS_HIDDEN_AT_INDEX_SQL,\n EXTENSION_SHARES_RESOURCE_INDEX_SQL,\n EXTENSION_HIDES_CREATE_SQL,\n EXTENSION_HIDES_CREATE_SQL_PG,\n EXTENSION_HIDES_UNIQUE_INDEX_SQL,\n EXTENSION_HIDES_OWNER_INDEX_SQL,\n EXTENSION_HISTORY_CREATE_SQL,\n EXTENSION_HISTORY_CREATE_SQL_PG,\n EXTENSION_HISTORY_VERSION_INDEX_SQL,\n EXTENSION_HISTORY_CREATED_INDEX_SQL,\n EXTENSION_CONSENTS_CREATE_SQL,\n EXTENSION_CONSENTS_CREATE_SQL_PG,\n EXTENSION_CONSENTS_VIEWER_INDEX_SQL,\n} from \"./schema.js\";\n\nconst getDb = createGetDb({\n extensions,\n extensionShares,\n extensionHides,\n extensionHistory,\n});\n\nlet _initPromise: Promise<void> | undefined;\n\nexport async function ensureExtensionsTables(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const pg = isPostgres();\n if (pg) {\n // PG guard: probe via information_schema, only issue DDL if missing, bounded lock_timeout\n await ensureTableExists(\"tools\", EXTENSIONS_CREATE_SQL_PG);\n await migrateMisnamedExtensionsTable(client, pg); // data migration, not DDL — unchanged\n await ensureTableExists(\"tool_shares\", EXTENSION_SHARES_CREATE_SQL_PG);\n await ensureTableExists(\"tool_data\", EXTENSION_DATA_CREATE_SQL_PG);\n await ensureExtensionDataItemId(client, pg); // ADD COLUMN — guarded inside\n await ensureExtensionDataScope(client, pg); // ADD COLUMN — guarded inside\n // DROP INDEX (for old index) — safe DDL, runs via client.execute; keep on both paths\n await client.execute(EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG);\n await ensureIndexExists(\n \"tool_data_scoped_item_idx\",\n EXTENSION_DATA_ITEM_INDEX_SQL_PG,\n );\n await ensureIndexExists(\"tools_owner_idx\", EXTENSIONS_OWNER_INDEX_SQL);\n await ensureIndexExists(\"tools_org_idx\", EXTENSIONS_ORG_INDEX_SQL);\n await ensureIndexExists(\n \"tools_updated_at_idx\",\n EXTENSIONS_UPDATED_INDEX_SQL,\n );\n await ensureExtensionsGlobalHideColumns(client, pg); // ADD COLUMN — guarded inside\n await ensureIndexExists(\n \"tools_hidden_at_idx\",\n EXTENSIONS_HIDDEN_AT_INDEX_SQL,\n );\n await ensureIndexExists(\n \"tool_shares_resource_idx\",\n EXTENSION_SHARES_RESOURCE_INDEX_SQL,\n );\n await ensureTableExists(\n \"tool_hidden_extensions\",\n EXTENSION_HIDES_CREATE_SQL_PG,\n );\n await ensureIndexExists(\n \"tool_hidden_extensions_user_tool_idx\",\n EXTENSION_HIDES_UNIQUE_INDEX_SQL,\n );\n await ensureIndexExists(\n \"tool_hidden_extensions_owner_idx\",\n EXTENSION_HIDES_OWNER_INDEX_SQL,\n );\n await ensureTableExists(\n \"tool_history\",\n EXTENSION_HISTORY_CREATE_SQL_PG,\n );\n await ensureIndexExists(\n \"tool_history_tool_version_idx\",\n EXTENSION_HISTORY_VERSION_INDEX_SQL,\n );\n await ensureIndexExists(\n \"tool_history_tool_created_idx\",\n EXTENSION_HISTORY_CREATED_INDEX_SQL,\n );\n await ensureTableExists(\n \"tool_consents\",\n EXTENSION_CONSENTS_CREATE_SQL_PG,\n );\n await ensureIndexExists(\n \"tool_consents_viewer_idx\",\n EXTENSION_CONSENTS_VIEWER_INDEX_SQL,\n );\n return;\n }\n // SQLite (local dev): keep existing behavior\n await retryOnDdlRace(() =>\n client.execute(pg ? EXTENSIONS_CREATE_SQL_PG : EXTENSIONS_CREATE_SQL),\n );\n await migrateMisnamedExtensionsTable(client, pg);\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_SHARES_CREATE_SQL_PG : EXTENSION_SHARES_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_DATA_CREATE_SQL_PG : EXTENSION_DATA_CREATE_SQL,\n ),\n );\n await ensureExtensionDataItemId(client, pg);\n await ensureExtensionDataScope(client, pg);\n await client.execute(\n pg\n ? EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG\n : EXTENSION_DATA_DROP_OLD_INDEX_SQL,\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_DATA_ITEM_INDEX_SQL_PG : EXTENSION_DATA_ITEM_INDEX_SQL,\n ),\n );\n await retryOnDdlRace(() => client.execute(EXTENSIONS_OWNER_INDEX_SQL));\n await retryOnDdlRace(() => client.execute(EXTENSIONS_ORG_INDEX_SQL));\n await retryOnDdlRace(() => client.execute(EXTENSIONS_UPDATED_INDEX_SQL));\n await ensureExtensionsGlobalHideColumns(client, pg);\n await retryOnDdlRace(() =>\n client.execute(EXTENSIONS_HIDDEN_AT_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_SHARES_RESOURCE_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_HIDES_CREATE_SQL_PG : EXTENSION_HIDES_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HIDES_UNIQUE_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HIDES_OWNER_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_HISTORY_CREATE_SQL_PG : EXTENSION_HISTORY_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HISTORY_VERSION_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HISTORY_CREATED_INDEX_SQL),\n );\n // tool_consents was introduced for an audit-C1 per-viewer consent\n // gate that we removed once we settled on intra-org trust as the\n // baseline. The table is kept (additive — never drop) so deploys\n // that already created it stay healthy; the runtime consent code\n // is gone. Idempotent CREATE IF NOT EXISTS for fresh schemas.\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_CONSENTS_CREATE_SQL_PG : EXTENSION_CONSENTS_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_CONSENTS_VIEWER_INDEX_SQL),\n );\n })();\n }\n\n try {\n await _initPromise;\n } catch (err) {\n _initPromise = undefined;\n throw err;\n }\n}\n\nasync function migrateMisnamedExtensionsTable(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n const sql = pg\n ? `INSERT INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)\n SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility\n FROM extensions\n ON CONFLICT (id) DO NOTHING`\n : `INSERT OR IGNORE INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)\n SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility\n FROM extensions`;\n\n try {\n await client.execute(sql);\n } catch (err: any) {\n const message = String(err?.message ?? err).toLowerCase();\n if (\n message.includes(\"no such table: extensions\") ||\n message.includes('relation \"extensions\" does not exist') ||\n message.includes(\"relation extensions does not exist\")\n ) {\n return;\n }\n throw err;\n }\n}\n\nasync function ensureExtensionDataItemId(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n if (pg) {\n await ensureColumnExists(\n \"tool_data\",\n \"item_id\",\n `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS item_id TEXT`,\n );\n return;\n }\n\n // Keep this additive: legacy rows with item_id=id are still read correctly\n // through COALESCE(item_id, id), so SQLite never needs a table rebuild here.\n try {\n await client.execute(`ALTER TABLE tool_data ADD COLUMN item_id TEXT`);\n } catch (err: any) {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n ) {\n throw err;\n }\n }\n}\n\nasync function ensureExtensionDataScope(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n const addCol = (name: string, def: string) => {\n if (pg) {\n return ensureColumnExists(\n \"tool_data\",\n name,\n `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS ${name} ${def}`,\n );\n }\n return client\n .execute(`ALTER TABLE tool_data ADD COLUMN ${name} ${def}`)\n .catch((err: any) => {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n )\n throw err;\n });\n };\n await addCol(\"scope\", \"TEXT NOT NULL DEFAULT 'user'\");\n await addCol(\"org_id\", \"TEXT\");\n await addCol(\"scope_key\", \"TEXT NOT NULL DEFAULT 'local@localhost'\");\n // One-time backfill migration: replaces the dev-mode DEFAULT scope_key\n // with each row's real owner_email. Not a per-request fallback.\n await client.execute(\n // guard:allow-localhost-fallback — one-time backfill migration replacing dev-mode default scope_key with the row's real owner_email\n `UPDATE tool_data SET scope_key = owner_email WHERE scope_key = 'local@localhost' AND owner_email != 'local@localhost'`,\n );\n}\n\nasync function ensureExtensionsGlobalHideColumns(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n // Global (admin) hide columns on the `tools` row, distinct from the\n // per-user `tool_hidden_extensions` table. Additive — keep this idempotent\n // for both dialects. Postgres supports `ADD COLUMN IF NOT EXISTS`; SQLite\n // does not, so we drop the clause and swallow the duplicate-column error.\n const addCol = (pgSql: string, name: string, def: string) => {\n if (pg) {\n return ensureColumnExists(\"tools\", name, pgSql);\n }\n return client\n .execute(`ALTER TABLE tools ADD COLUMN ${name} ${def}`)\n .catch((err: any) => {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n )\n throw err;\n });\n };\n await addCol(EXTENSIONS_HIDDEN_AT_COLUMN_SQL, \"hidden_at\", \"TEXT\");\n await addCol(EXTENSIONS_HIDDEN_BY_COLUMN_SQL, \"hidden_by\", \"TEXT\");\n}\n\nexport function registerExtensionsShareable() {\n registerShareableResource({\n type: \"extension\",\n resourceTable: extensions,\n sharesTable: extensionShares,\n displayName: \"Extension\",\n titleColumn: \"name\",\n getDb: () => getDb(),\n // Extension HTML executes inside an iframe and calls actions / SQL / the\n // secrets-injecting proxy as the *viewer*. A public extension would let a\n // random authenticated user run code with the viewer's credentials — and\n // a malicious shared extension could re-share itself wider. Lock both:\n // no public visibility, and individual user shares must already be (or\n // be invited to) the org.\n allowPublic: false,\n requireOrgMemberForUserShares: true,\n });\n}\n\nexport interface ExtensionRow {\n id: string;\n name: string;\n description: string;\n content: string;\n icon: string | null;\n createdAt: string;\n updatedAt: string;\n hiddenAt: string | null;\n hiddenBy: string | null;\n ownerEmail: string;\n orgId: string | null;\n visibility: \"private\" | \"org\" | \"public\";\n}\n\nexport type ExtensionHistoryOperation =\n | \"create\"\n | \"baseline\"\n | \"metadata-update\"\n | \"content-update\"\n | \"restore\";\n\nexport interface ExtensionHistoryEntry {\n id: string;\n extensionId: string;\n version: number;\n operation: ExtensionHistoryOperation | string;\n summary: string;\n name: string;\n description: string;\n content?: string;\n icon: string | null;\n actorEmail: string | null;\n ownerEmail: string;\n orgId: string | null;\n visibility: \"private\" | \"org\" | \"public\";\n createdAt: string;\n persisted: boolean;\n contentLength: number;\n}\n\nexport interface ExtensionHistoryDiffLine {\n type: \"equal\" | \"insert\" | \"delete\";\n text: string;\n}\n\nexport interface ExtensionHistoryDetail {\n entry: ExtensionHistoryEntry;\n previous: ExtensionHistoryEntry | null;\n diff: ExtensionHistoryDiffLine[];\n stats: {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n };\n}\n\ninterface RawExtensionHistoryRow {\n id: string;\n tool_id?: string;\n extensionId?: string;\n version: number | string;\n operation: string;\n summary?: string | null;\n name: string;\n description?: string | null;\n content?: string | null;\n icon?: string | null;\n actor_email?: string | null;\n actorEmail?: string | null;\n owner_email?: string | null;\n ownerEmail?: string | null;\n org_id?: string | null;\n orgId?: string | null;\n visibility?: string | null;\n created_at?: string;\n createdAt?: string;\n}\n\nfunction targetKey(target: ExtensionChangeTarget): string | null {\n if (target.owner) return `owner:${target.owner}`;\n if (target.orgId) return `org:${target.orgId}`;\n return null;\n}\n\nfunction addExtensionChangeTarget(\n targets: Map<string, ExtensionChangeTarget>,\n target: ExtensionChangeTarget,\n): void {\n const key = targetKey(target);\n if (key) targets.set(key, target);\n}\n\nasync function extensionChangeTargetsForRow(\n row: ExtensionRow,\n): Promise<ExtensionChangeTarget[]> {\n const targets = new Map<string, ExtensionChangeTarget>();\n addExtensionChangeTarget(targets, { owner: row.ownerEmail });\n if (row.visibility === \"org\" && row.orgId) {\n addExtensionChangeTarget(targets, { orgId: row.orgId });\n }\n\n const db = getDb();\n const shares = (await db\n .select({\n principalType: extensionShares.principalType,\n principalId: extensionShares.principalId,\n })\n .from(extensionShares)\n .where(eq(extensionShares.resourceId, row.id))) as Array<{\n principalType: \"user\" | \"org\";\n principalId: string;\n }>;\n\n for (const share of shares) {\n if (share.principalType === \"user\") {\n addExtensionChangeTarget(targets, { owner: share.principalId });\n } else if (share.principalType === \"org\") {\n addExtensionChangeTarget(targets, { orgId: share.principalId });\n }\n }\n\n return Array.from(targets.values());\n}\n\nasync function extensionChangeTargetsForId(\n id: string,\n): Promise<ExtensionChangeTarget[]> {\n const db = getDb();\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = rows[0] as ExtensionRow | undefined;\n return row ? extensionChangeTargetsForRow(row) : [];\n}\n\nexport async function getExtensionChangeTargets(\n id: string,\n): Promise<ExtensionChangeTarget[]> {\n await ensureExtensionsTables();\n return extensionChangeTargetsForId(id);\n}\n\nfunction dedupeExtensionChangeTargets(\n targets: ExtensionChangeTarget[],\n): ExtensionChangeTarget[] {\n const unique = new Map<string, ExtensionChangeTarget>();\n for (const target of targets) {\n const key = targetKey(target);\n if (key) unique.set(key, target);\n }\n return Array.from(unique.values());\n}\n\nasync function notifyExtensionChanged(\n targets: ExtensionChangeTarget[],\n): Promise<void> {\n const uniqueTargets = dedupeExtensionChangeTargets(targets);\n if (uniqueTargets.length === 0) return;\n\n for (const target of uniqueTargets) {\n recordChange({\n source: \"extensions\",\n type: \"change\",\n key: \"*\",\n ...(target.owner ? { owner: target.owner } : {}),\n ...(target.orgId ? { orgId: target.orgId } : {}),\n });\n }\n\n await Promise.all(\n uniqueTargets.map(async (target) => {\n const sessionId = extensionChangeMarkerSession(target);\n if (!sessionId) return;\n await appStatePut(\n sessionId,\n EXTENSION_CHANGE_MARKER_KEY,\n extensionChangeMarkerValue(target),\n );\n }),\n );\n}\n\nexport async function notifyExtensionChangeForResource(\n id: string,\n beforeTargets: ExtensionChangeTarget[] = [],\n): Promise<void> {\n await ensureExtensionsTables();\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n}\n\nfunction extensionHistoryEntryFromRaw(\n row: RawExtensionHistoryRow,\n includeContent: boolean,\n): ExtensionHistoryEntry {\n const content = row.content ?? \"\";\n const visibility = normalizeVisibility(row.visibility);\n return {\n id: row.id,\n extensionId: String(row.tool_id ?? row.extensionId ?? \"\"),\n version: Number(row.version) || 1,\n operation: row.operation,\n summary: row.summary ?? \"\",\n name: row.name,\n description: row.description ?? \"\",\n ...(includeContent ? { content } : {}),\n icon: row.icon ?? null,\n actorEmail: row.actor_email ?? row.actorEmail ?? null,\n ownerEmail: row.owner_email ?? row.ownerEmail ?? \"\",\n orgId: row.org_id ?? row.orgId ?? null,\n visibility,\n createdAt: row.created_at ?? row.createdAt ?? new Date(0).toISOString(),\n persisted: true,\n contentLength: content.length,\n };\n}\n\nfunction extensionHistoryEntryFromExtension(\n row: ExtensionRow,\n includeContent: boolean,\n): ExtensionHistoryEntry {\n return {\n id: `current:${row.id}`,\n extensionId: row.id,\n version: 1,\n operation: \"baseline\",\n summary: \"Current version\",\n name: row.name,\n description: row.description,\n ...(includeContent ? { content: row.content } : {}),\n icon: row.icon,\n actorEmail: null,\n ownerEmail: row.ownerEmail,\n orgId: row.orgId,\n visibility: row.visibility,\n createdAt: row.updatedAt,\n persisted: false,\n contentLength: row.content.length,\n };\n}\n\nfunction normalizeVisibility(value: unknown): \"private\" | \"org\" | \"public\" {\n return value === \"org\" || value === \"public\" ? value : \"private\";\n}\n\nfunction currentActorEmail(): string | null {\n return getRequestUserEmail() ?? null;\n}\n\nfunction clampHistoryLimit(value: unknown): number {\n const limit = Number(value ?? 50);\n if (!Number.isFinite(limit)) return 50;\n return Math.min(Math.max(1, Math.floor(limit)), 100);\n}\n\nasync function historyVersionCount(extensionId: string): Promise<number> {\n const result = await getDbExec().execute({\n sql: `SELECT MAX(version) AS version FROM tool_history WHERE tool_id = ?`,\n args: [extensionId],\n });\n const value = (result.rows?.[0] as any)?.version;\n const version = Number(value ?? 0);\n return Number.isFinite(version) ? version : 0;\n}\n\nasync function hasExtensionHistory(extensionId: string): Promise<boolean> {\n const result = await getDbExec().execute({\n sql: `SELECT id FROM tool_history WHERE tool_id = ? LIMIT 1`,\n args: [extensionId],\n });\n return (result.rows?.length ?? 0) > 0;\n}\n\nasync function recordExtensionHistorySnapshot(\n row: ExtensionRow,\n operation: ExtensionHistoryOperation,\n summary: string,\n): Promise<ExtensionHistoryEntry> {\n const version = (await historyVersionCount(row.id)) + 1;\n const now = new Date().toISOString();\n const historyId = randomUUID();\n await getDbExec().execute({\n sql: `INSERT INTO tool_history (\n id, tool_id, version, operation, summary, name, description, content,\n icon, actor_email, owner_email, org_id, visibility, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n historyId,\n row.id,\n version,\n operation,\n summary,\n row.name,\n row.description,\n row.content,\n row.icon,\n currentActorEmail(),\n row.ownerEmail,\n row.orgId,\n row.visibility,\n now,\n ],\n });\n\n return {\n id: historyId,\n extensionId: row.id,\n version,\n operation,\n summary,\n name: row.name,\n description: row.description,\n content: row.content,\n icon: row.icon,\n actorEmail: currentActorEmail(),\n ownerEmail: row.ownerEmail,\n orgId: row.orgId,\n visibility: row.visibility,\n createdAt: now,\n persisted: true,\n contentLength: row.content.length,\n };\n}\n\nasync function ensureExtensionHistoryBaseline(\n row: ExtensionRow,\n): Promise<void> {\n if (await hasExtensionHistory(row.id)) return;\n await recordExtensionHistorySnapshot(\n row,\n \"baseline\",\n \"Saved starting version\",\n );\n}\n\nfunction summarizeMetadataChange(\n before: ExtensionRow,\n after: ExtensionRow,\n): string {\n const changes: string[] = [];\n if (before.name !== after.name) {\n changes.push(`Renamed from \"${before.name}\" to \"${after.name}\"`);\n }\n if (before.description !== after.description) {\n changes.push(\"Updated description\");\n }\n if (before.icon !== after.icon) {\n changes.push(\"Updated icon\");\n }\n if (before.visibility !== after.visibility) {\n changes.push(`Changed visibility to ${after.visibility}`);\n }\n return changes.join(\"; \") || \"Updated details\";\n}\n\nfunction summarizeContentChange(\n beforeContent: string,\n afterContent: string,\n): string {\n const stats = diffStats(createLineDiff(beforeContent, afterContent));\n if (!stats.changed) return \"Saved content\";\n return `Updated content (+${stats.addedLines} -${stats.deletedLines} lines)`;\n}\n\nfunction parseHistoryVersion(version: unknown): number | null {\n const parsed = Number(version);\n if (!Number.isInteger(parsed) || parsed < 1) return null;\n return parsed;\n}\n\nasync function getPersistedHistoryEntry(\n extensionId: string,\n version: number,\n includeContent: boolean,\n): Promise<ExtensionHistoryEntry | null> {\n const result = await getDbExec().execute({\n sql: `SELECT id, tool_id, version, operation, summary, name, description,\n content, icon, actor_email, owner_email, org_id, visibility, created_at\n FROM tool_history\n WHERE tool_id = ? AND version = ?\n LIMIT 1`,\n args: [extensionId, version],\n });\n const row = result.rows?.[0] as RawExtensionHistoryRow | undefined;\n return row ? extensionHistoryEntryFromRaw(row, includeContent) : null;\n}\n\nfunction splitLines(text: string): string[] {\n if (!text) return [];\n const parts = text.split(\"\\n\");\n return parts\n .map((line, index) => (index < parts.length - 1 ? `${line}\\n` : line))\n .filter((line) => line.length > 0);\n}\n\nfunction createLineDiff(\n beforeText: string,\n afterText: string,\n): ExtensionHistoryDiffLine[] {\n const before = splitLines(beforeText);\n const after = splitLines(afterText);\n if (before.length === 0 && after.length === 0) return [];\n\n const cells = before.length * after.length;\n if (cells > 40_000) return createBoundaryDiff(before, after);\n\n const dp = Array.from({ length: before.length + 1 }, () =>\n Array(after.length + 1).fill(0),\n );\n for (let i = before.length - 1; i >= 0; i -= 1) {\n for (let j = after.length - 1; j >= 0; j -= 1) {\n dp[i][j] =\n before[i] === after[j]\n ? dp[i + 1][j + 1] + 1\n : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n\n const diff: ExtensionHistoryDiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < before.length && j < after.length) {\n if (before[i] === after[j]) {\n diff.push({ type: \"equal\", text: before[i] });\n i += 1;\n j += 1;\n } else if (dp[i + 1][j] >= dp[i][j + 1]) {\n diff.push({ type: \"delete\", text: before[i] });\n i += 1;\n } else {\n diff.push({ type: \"insert\", text: after[j] });\n j += 1;\n }\n }\n while (i < before.length) {\n diff.push({ type: \"delete\", text: before[i] });\n i += 1;\n }\n while (j < after.length) {\n diff.push({ type: \"insert\", text: after[j] });\n j += 1;\n }\n return diff;\n}\n\nfunction createBoundaryDiff(\n before: string[],\n after: string[],\n): ExtensionHistoryDiffLine[] {\n let prefix = 0;\n while (\n prefix < before.length &&\n prefix < after.length &&\n before[prefix] === after[prefix]\n ) {\n prefix += 1;\n }\n\n let suffix = 0;\n while (\n suffix + prefix < before.length &&\n suffix + prefix < after.length &&\n before[before.length - 1 - suffix] === after[after.length - 1 - suffix]\n ) {\n suffix += 1;\n }\n\n return [\n ...before\n .slice(0, prefix)\n .map((text) => ({ type: \"equal\" as const, text })),\n ...before\n .slice(prefix, before.length - suffix)\n .map((text) => ({ type: \"delete\" as const, text })),\n ...after\n .slice(prefix, after.length - suffix)\n .map((text) => ({ type: \"insert\" as const, text })),\n ...before\n .slice(before.length - suffix)\n .map((text) => ({ type: \"equal\" as const, text })),\n ];\n}\n\nfunction diffStats(diff: ExtensionHistoryDiffLine[]): {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n} {\n const addedLines = diff.filter((line) => line.type === \"insert\").length;\n const deletedLines = diff.filter((line) => line.type === \"delete\").length;\n return {\n addedLines,\n deletedLines,\n changed: addedLines > 0 || deletedLines > 0,\n };\n}\n\nexport interface ListExtensionsOptions {\n includeHidden?: boolean;\n /**\n * Include extensions an admin/owner has globally hidden via `hidden_at`.\n * Off by default so globally-hidden extensions disappear for everyone.\n */\n includeGloballyHidden?: boolean;\n}\n\nexport async function listExtensions(\n options: ListExtensionsOptions = {},\n): Promise<ExtensionRow[]> {\n await ensureExtensionsTables();\n const db = getDb();\n // Build the WHERE with a single `and()` — drizzle replaces (not ANDs)\n // on repeated `.where()` calls, so combine the access filter and the\n // global-hidden filter into one condition.\n const base = accessFilter(extensions, extensionShares);\n const where = options.includeGloballyHidden\n ? base\n : and(base, isNull(extensions.hiddenAt));\n const rows = (await db\n .select()\n .from(extensions)\n .where(where)) as ExtensionRow[];\n\n if (options.includeHidden) return rows;\n\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n if (hiddenIds.size === 0) return rows;\n return rows.filter((row) => !hiddenIds.has(row.id));\n}\n\nexport async function getExtension(id: string): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n const access = await resolveAccess(\"extension\", id);\n return (access?.resource as ExtensionRow | undefined) ?? null;\n}\n\nexport interface ListExtensionHistoryOptions {\n limit?: number;\n includeContent?: boolean;\n}\n\nexport async function listExtensionHistory(\n id: string,\n options: ListExtensionHistoryOptions = {},\n): Promise<ExtensionHistoryEntry[]> {\n await ensureExtensionsTables();\n const extension = await getExtension(id);\n if (!extension) return [];\n\n const includeContent = options.includeContent === true;\n const limit = clampHistoryLimit(options.limit);\n const result = await getDbExec().execute({\n sql: `SELECT id, tool_id, version, operation, summary, name, description,\n content, icon, actor_email, owner_email, org_id, visibility, created_at\n FROM tool_history\n WHERE tool_id = ?\n ORDER BY version DESC\n LIMIT ?`,\n args: [id, limit],\n });\n\n const entries = (result.rows ?? []).map((row) =>\n extensionHistoryEntryFromRaw(row as RawExtensionHistoryRow, includeContent),\n );\n\n if (entries.length > 0) return entries;\n return [extensionHistoryEntryFromExtension(extension, includeContent)];\n}\n\nexport async function getExtensionHistoryVersion(\n id: string,\n versionValue: number | string,\n): Promise<ExtensionHistoryDetail | null> {\n await ensureExtensionsTables();\n const extension = await getExtension(id);\n if (!extension) return null;\n\n const version = parseHistoryVersion(versionValue);\n if (!version) return null;\n\n const persisted = await getPersistedHistoryEntry(id, version, true);\n const entry =\n persisted ??\n (!(await hasExtensionHistory(id)) && version === 1\n ? extensionHistoryEntryFromExtension(extension, true)\n : null);\n if (!entry) return null;\n\n const previous =\n version > 1 ? await getPersistedHistoryEntry(id, version - 1, true) : null;\n const previousContent = previous?.content ?? \"\";\n const currentContent = entry.content ?? \"\";\n const diff = createLineDiff(previousContent, currentContent);\n\n return {\n entry,\n previous,\n diff,\n stats: diffStats(diff),\n };\n}\n\nexport async function restoreExtensionHistoryVersion(\n id: string,\n versionValue: number | string,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n\n const version = parseHistoryVersion(versionValue);\n if (!version) return null;\n\n const existingRows = await getDb()\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const existing = existingRows[0] as ExtensionRow | undefined;\n if (!existing) return null;\n\n await ensureExtensionHistoryBaseline(existing);\n const target = await getPersistedHistoryEntry(id, version, true);\n if (!target) return null;\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n await getDb()\n .update(extensions)\n .set({\n name: target.name,\n description: target.description,\n content: target.content ?? \"\",\n icon: target.icon,\n updatedAt: new Date().toISOString(),\n })\n .where(eq(extensions.id, id));\n\n const rows = await getDb()\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"restore\",\n `Restored version ${version}`,\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport interface CreateExtensionData {\n name: string;\n description?: string;\n content?: string;\n icon?: string;\n}\n\nexport async function createExtension(\n data: CreateExtensionData,\n): Promise<ExtensionRow> {\n await ensureExtensionsTables();\n const db = getDb();\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n const orgId = getRequestOrgId();\n const id = randomUUID();\n const now = new Date().toISOString();\n const row: ExtensionRow = {\n id,\n name: data.name,\n description: data.description ?? \"\",\n content: data.content ?? \"\",\n icon: data.icon ?? null,\n createdAt: now,\n updatedAt: now,\n hiddenAt: null,\n hiddenBy: null,\n ownerEmail: userEmail,\n orgId: orgId ?? null,\n visibility: \"private\",\n };\n await db.insert(extensions).values(row);\n await recordExtensionHistorySnapshot(row, \"create\", \"Created extension\");\n await notifyExtensionChanged([{ owner: row.ownerEmail }]);\n return row;\n}\n\n/**\n * Returns an extension with the exact same name and content created by the\n * current user — in the current org/workspace scope — in the last 5 minutes,\n * or null if none exists. Used to make create-extension idempotent when a\n * connection drop causes the agent to retry the same tool call.\n *\n * Scoped by `orgId` the same way `createExtension` stamps it, so the same\n * `ownerEmail` working in two different orgs can create identically-named,\n * identical-content extensions without this lookup cross-matching and skipping\n * the second insert. Keyed on the FULL create inputs (name + content +\n * description + icon, normalized exactly as `createExtension` stores them), so\n * two creates that differ in any of them are treated as distinct — only a\n * byte-identical re-create (the connection-retry case) recovers the prior row,\n * and no intentional second create silently loses its metadata.\n */\nexport async function findRecentDuplicateExtension(data: {\n name: string;\n content: string;\n description?: string;\n icon?: string;\n}): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n const db = getDb();\n const userEmail = getRequestUserEmail();\n if (!userEmail) return null;\n const orgId = getRequestOrgId() ?? null;\n const description = data.description ?? \"\";\n const icon = data.icon ?? null;\n const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString();\n const rows = await db\n .select()\n .from(extensions)\n .where(\n and(\n eq(extensions.ownerEmail, userEmail),\n orgId === null ? isNull(extensions.orgId) : eq(extensions.orgId, orgId),\n eq(extensions.name, data.name),\n eq(extensions.content, data.content),\n eq(extensions.description, description),\n icon === null ? isNull(extensions.icon) : eq(extensions.icon, icon),\n gte(extensions.createdAt, fiveMinutesAgo),\n isNull(extensions.hiddenAt),\n ),\n )\n .limit(1);\n return rows[0] ?? null;\n}\n\nexport interface UpdateExtensionData {\n name?: string;\n description?: string;\n icon?: string;\n /**\n * Extensions cannot be public — `set-resource-visibility` and this store\n * helper both reject `\"public\"`. The type lists it so the framework's\n * generic share UI compiles, not because it's allowed at runtime.\n */\n visibility?: \"private\" | \"org\" | \"public\";\n}\n\nexport async function updateExtension(\n id: string,\n data: UpdateExtensionData,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n if (data.visibility === \"public\") {\n // Defense in depth — `registerExtensionsShareable` sets\n // `allowPublic: false`, so `set-resource-visibility` already rejects\n // this. Block direct callers too (HTTP `PUT /extensions/:id`, internal\n // refactors) so the rule holds regardless of entry point.\n throw new ForbiddenError(\n \"Extensions cannot be made public — share with specific people or your organization instead.\",\n );\n }\n const db = getDb();\n const beforeTargets = await extensionChangeTargetsForId(id);\n const updates: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n if (data.name !== undefined) updates.name = data.name;\n if (data.description !== undefined) updates.description = data.description;\n if (data.icon !== undefined) updates.icon = data.icon;\n if (data.visibility !== undefined) updates.visibility = data.visibility;\n const existingRows = await db\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const existing = existingRows[0] as ExtensionRow | undefined;\n if (!existing) return null;\n await ensureExtensionHistoryBaseline(existing);\n await db.update(extensions).set(updates).where(eq(extensions.id, id));\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"metadata-update\",\n summarizeMetadataChange(existing, row),\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport interface UpdateExtensionContentOpts {\n content?: string;\n patches?: ExtensionLegacyPatch[];\n edits?: ExtensionContentEdit[];\n format?: boolean;\n}\n\nexport async function updateExtensionContent(\n id: string,\n opts: UpdateExtensionContentOpts,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n const db = getDb();\n\n if (\n opts.content === undefined &&\n opts.patches === undefined &&\n opts.edits === undefined &&\n !opts.format\n ) {\n return null;\n }\n\n const existingRows = await db\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n if (!existingRows[0]) return null;\n const existing = existingRows[0] as ExtensionRow;\n const existingContent = existing.content;\n await ensureExtensionHistoryBaseline(existing);\n const update = await applyExtensionContentUpdate(existingContent, opts);\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n await db\n .update(extensions)\n .set({ content: update.content, updatedAt: new Date().toISOString() })\n .where(eq(extensions.id, id));\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"content-update\",\n summarizeContentChange(existingContent, row.content),\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport async function deleteExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const db = getDb();\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = rows[0] as ExtensionRow | undefined;\n if (!row) return false;\n const targets = await extensionChangeTargetsForRow(row);\n await db.delete(extensionShares).where(eq(extensionShares.resourceId, id));\n await db.delete(extensionHides).where(eq(extensionHides.extensionId, id));\n await getDbExec().execute({\n sql: `DELETE FROM tool_data WHERE tool_id = ?`,\n args: [id],\n });\n await getDbExec().execute({\n sql: `DELETE FROM tool_history WHERE tool_id = ?`,\n args: [id],\n });\n const { cascadeDeleteExtensionSlots } = await import(\"./slots/store.js\");\n await cascadeDeleteExtensionSlots(id);\n await db.delete(extensions).where(eq(extensions.id, id));\n await notifyExtensionChanged(targets);\n return true;\n}\n\nexport async function getHiddenExtensionIdsForCurrentUser(): Promise<\n Set<string>\n> {\n await ensureExtensionsTables();\n const userEmail = getRequestUserEmail();\n if (!userEmail) return new Set();\n\n const db = getDb();\n const rows = await db\n .select({ extensionId: extensionHides.extensionId })\n .from(extensionHides)\n .where(eq(extensionHides.ownerEmail, userEmail));\n return new Set(rows.map((row) => row.extensionId));\n}\n\nexport async function hideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"viewer\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `INSERT INTO tool_hidden_extensions (id, tool_id, owner_email, created_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT (owner_email, tool_id) DO NOTHING`,\n args: [randomUUID(), id, userEmail, now],\n });\n await notifyExtensionChanged([{ owner: userEmail }]);\n return true;\n}\n\nexport async function unhideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n await getDbExec().execute({\n sql: `DELETE FROM tool_hidden_extensions WHERE tool_id = ? AND owner_email = ?`,\n args: [id, userEmail],\n });\n await notifyExtensionChanged([{ owner: userEmail }]);\n return true;\n}\n\n/**\n * Globally hide an extension from EVERYONE's list by stamping `hidden_at` /\n * `hidden_by` on the `tools` row. Distinct from the per-user `hideExtension`\n * (`tool_hidden_extensions`) — this affects all viewers. Requires admin/owner\n * access. The extension is not deleted and stays accessible by id; pass\n * `includeGloballyHidden: true` to `listExtensions` to surface it again.\n */\nexport async function globalHideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `UPDATE tools SET hidden_at = ?, hidden_by = ?, updated_at = ? WHERE id = ?`,\n args: [now, userEmail, now, id],\n });\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n return true;\n}\n\n/**\n * Clear a global hide so the extension reappears in everyone's list. Requires\n * admin/owner access. Mirrors `globalHideExtension`.\n */\nexport async function globalUnhideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `UPDATE tools SET hidden_at = NULL, hidden_by = NULL, updated_at = ? WHERE id = ?`,\n args: [now, id],\n });\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n return true;\n}\n"]}
@@ -3,18 +3,18 @@ declare const _default: import("../../action.js").ActionDefinition<{
3
3
  url?: string;
4
4
  filename?: string;
5
5
  }, {
6
- id?: undefined;
7
6
  error: string;
8
7
  configured?: undefined;
9
8
  connectPath?: undefined;
10
9
  url?: undefined;
10
+ id?: undefined;
11
11
  provider?: undefined;
12
12
  } | {
13
- id?: undefined;
14
13
  error: string;
15
14
  configured: boolean;
16
15
  connectPath: string;
17
16
  url?: undefined;
17
+ id?: undefined;
18
18
  provider?: undefined;
19
19
  } | {
20
20
  error?: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"a2a-continuations-store.d.ts","sourceRoot":"","sources":["../../src/integrations/a2a-continuations-store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAgFlD,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,eAAe,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA4BD,wBAAsB,qBAAqB,CAAC,KAAK,EAAE;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,eAAe,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,OAAO,CAAC,eAAe,CAAC,CA8C3B;AAED,wBAAsB,oCAAoC,CACxD,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAWjC;AAED,wBAAsB,0CAA0C,CAC9D,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,eAAe,EAAE,CAAC,CAmB5B;AA8BD,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAQjC;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA0CjC;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,SAAI,GACR,OAAO,CAAC,eAAe,EAAE,CAAC,CAmC5B;AAED,wBAAsB,4BAA4B,CAChD,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA0BjC;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUvE;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAUf"}
1
+ {"version":3,"file":"a2a-continuations-store.d.ts","sourceRoot":"","sources":["../../src/integrations/a2a-continuations-store.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAsHlD,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,eAAe,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA4BD,wBAAsB,qBAAqB,CAAC,KAAK,EAAE;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,eAAe,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,OAAO,CAAC,eAAe,CAAC,CA8C3B;AAED,wBAAsB,oCAAoC,CACxD,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAWjC;AAED,wBAAsB,0CAA0C,CAC9D,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,eAAe,EAAE,CAAC,CAmB5B;AA8BD,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAQjC;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA0CjC;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,SAAI,GACR,OAAO,CAAC,eAAe,EAAE,CAAC,CAmC5B;AAED,wBAAsB,4BAA4B,CAChD,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA0BjC;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUvE;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -1,36 +1,56 @@
1
1
  import { getDbExec, isPostgres, intType, retryOnDdlRace, } from "../db/client.js";
2
+ import { ensureTableExists, ensureColumnExists, ensureIndexExists, } from "../db/ddl-guard.js";
2
3
  import { isDuplicateColumnError } from "../db/migrations.js";
3
4
  let _initPromise;
4
5
  const PROCESSING_STUCK_AFTER_MS = 5 * 60 * 1000;
5
6
  const PROCESSING_NEXT_CHECK_STALE_AFTER_MS = 60 * 1000;
7
+ // Build the CREATE SQL lazily (not at module scope) so intType() runs at
8
+ // RUNTIME, not import time — a module-scope call breaks any consumer whose
9
+ // db/client mock doesn't stub intType (e.g. db-admin specs).
10
+ function buildCreateSql() {
11
+ return `
12
+ CREATE TABLE IF NOT EXISTS integration_a2a_continuations (
13
+ id TEXT PRIMARY KEY,
14
+ integration_task_id TEXT NOT NULL,
15
+ platform TEXT NOT NULL,
16
+ external_thread_id TEXT NOT NULL,
17
+ incoming_payload TEXT NOT NULL,
18
+ placeholder_ref TEXT,
19
+ owner_email TEXT NOT NULL,
20
+ org_id TEXT,
21
+ agent_name TEXT NOT NULL,
22
+ agent_url TEXT NOT NULL,
23
+ dedupe_key TEXT,
24
+ a2a_task_id TEXT NOT NULL,
25
+ a2a_auth_token TEXT,
26
+ status TEXT NOT NULL,
27
+ attempts ${intType()} NOT NULL DEFAULT 0,
28
+ next_check_at ${intType()} NOT NULL,
29
+ error_message TEXT,
30
+ created_at ${intType()} NOT NULL,
31
+ updated_at ${intType()} NOT NULL,
32
+ completed_at ${intType()}
33
+ )
34
+ `;
35
+ }
6
36
  async function ensureTable() {
7
37
  if (!_initPromise) {
8
38
  _initPromise = (async () => {
9
39
  const client = getDbExec();
10
- await retryOnDdlRace(() => client.execute(`
11
- CREATE TABLE IF NOT EXISTS integration_a2a_continuations (
12
- id TEXT PRIMARY KEY,
13
- integration_task_id TEXT NOT NULL,
14
- platform TEXT NOT NULL,
15
- external_thread_id TEXT NOT NULL,
16
- incoming_payload TEXT NOT NULL,
17
- placeholder_ref TEXT,
18
- owner_email TEXT NOT NULL,
19
- org_id TEXT,
20
- agent_name TEXT NOT NULL,
21
- agent_url TEXT NOT NULL,
22
- dedupe_key TEXT,
23
- a2a_task_id TEXT NOT NULL,
24
- a2a_auth_token TEXT,
25
- status TEXT NOT NULL,
26
- attempts ${intType()} NOT NULL DEFAULT 0,
27
- next_check_at ${intType()} NOT NULL,
28
- error_message TEXT,
29
- created_at ${intType()} NOT NULL,
30
- updated_at ${intType()} NOT NULL,
31
- completed_at ${intType()}
32
- )
33
- `));
40
+ const createSql = buildCreateSql();
41
+ if (isPostgres()) {
42
+ // PG guard: probe via information_schema, only issue DDL if missing, bounded lock_timeout
43
+ await ensureTableExists("integration_a2a_continuations", createSql);
44
+ await ensureIndexExists("idx_a2a_continuations_status_next", `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_status_next ON integration_a2a_continuations(status, next_check_at)`);
45
+ await ensureIndexExists("idx_a2a_continuations_integration_task", `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_integration_task ON integration_a2a_continuations(integration_task_id)`);
46
+ await ensureIndexExists("idx_a2a_continuations_remote_task", `CREATE UNIQUE INDEX IF NOT EXISTS idx_a2a_continuations_remote_task ON integration_a2a_continuations(integration_task_id, agent_url, a2a_task_id)`);
47
+ await ensureColumnExists("integration_a2a_continuations", "a2a_auth_token", `ALTER TABLE integration_a2a_continuations ADD COLUMN IF NOT EXISTS a2a_auth_token TEXT`);
48
+ await ensureColumnExists("integration_a2a_continuations", "dedupe_key", `ALTER TABLE integration_a2a_continuations ADD COLUMN IF NOT EXISTS dedupe_key TEXT`);
49
+ await ensureIndexExists("idx_a2a_continuations_dedupe_key", `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_dedupe_key ON integration_a2a_continuations(integration_task_id, agent_url, dedupe_key)`);
50
+ return;
51
+ }
52
+ // SQLite (local dev): keep existing behavior
53
+ await retryOnDdlRace(() => client.execute(createSql));
34
54
  await retryOnDdlRace(() => client.execute(`CREATE INDEX IF NOT EXISTS idx_a2a_continuations_status_next ON integration_a2a_continuations(status, next_check_at)`));
35
55
  await retryOnDdlRace(() => client.execute(`CREATE INDEX IF NOT EXISTS idx_a2a_continuations_integration_task ON integration_a2a_continuations(integration_task_id)`));
36
56
  await retryOnDdlRace(() => client.execute(`CREATE UNIQUE INDEX IF NOT EXISTS idx_a2a_continuations_remote_task ON integration_a2a_continuations(integration_task_id, agent_url, a2a_task_id)`));
@@ -1 +1 @@
1
- {"version":3,"file":"a2a-continuations-store.js","sourceRoot":"","sources":["../../src/integrations/a2a-continuations-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,IAAI,YAAuC,CAAC;AAC5C,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAChD,MAAM,oCAAoC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;qBAgBF,OAAO,EAAE;0BACJ,OAAO,EAAE;;uBAEZ,OAAO,EAAE;uBACT,OAAO,EAAE;yBACP,OAAO,EAAE;;OAE3B,CAAC,CACD,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,sHAAsH,CACvH,CACF,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,yHAAyH,CAC1H,CACF,CAAC;YACF,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,mJAAmJ,CACpJ,CACF,CAAC;YACF,MAAM,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,MAAM,CAAC,OAAO,CACZ,0IAA0I,CAC3I,CACF,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjB,sDAAsD;YACtD,YAAY,GAAG,SAAS,CAAC;YACzB,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAAkB;IAChE,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,GAAG,EAAE,CACxB,SAAS,EAAE,CAAC,OAAO,CACjB,wDAAwD,IAAI,IAAI,UAAU,EAAE,CAC7E,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,sBAAsB,CAAC,GAAG,CAAC;YAAE,OAAO;QACxC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAgCD,SAAS,iBAAiB,CAAC,GAA4B;IACrD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,iBAAiB,EAAE,GAAG,CAAC,mBAA6B;QACpD,QAAQ,EAAE,GAAG,CAAC,QAAkB;QAChC,gBAAgB,EAAE,GAAG,CAAC,kBAA4B;QAClD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAA0B,CAAoB;QACvE,cAAc,EAAG,GAAG,CAAC,eAAiC,IAAI,IAAI;QAC9D,UAAU,EAAE,GAAG,CAAC,WAAqB;QACrC,KAAK,EAAG,GAAG,CAAC,MAAwB,IAAI,IAAI;QAC5C,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,QAAQ,EAAE,GAAG,CAAC,SAAmB;QACjC,SAAS,EAAG,GAAG,CAAC,UAA4B,IAAI,IAAI;QACpD,SAAS,EAAE,GAAG,CAAC,WAAqB;QACpC,YAAY,EAAG,GAAG,CAAC,cAAgC,IAAI,IAAI;QAC3D,MAAM,EAAE,GAAG,CAAC,MAA+B;QAC3C,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC;QAC3C,YAAY,EAAG,GAAG,CAAC,aAA+B,IAAI,IAAI;QAC1D,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;QACtC,WAAW,EACT,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAsB,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAa3C;IACC,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC;YACnB,GAAG,EAAE;;;;sEAI2D;YAChE,IAAI,EAAE;gBACJ,EAAE;gBACF,KAAK,CAAC,iBAAiB;gBACvB,KAAK,CAAC,QAAQ;gBACd,KAAK,CAAC,gBAAgB;gBACtB,OAAO;gBACP,KAAK,CAAC,cAAc,IAAI,IAAI;gBAC5B,KAAK,CAAC,UAAU;gBAChB,KAAK,CAAC,KAAK,IAAI,IAAI;gBACnB,KAAK,CAAC,SAAS;gBACf,KAAK,CAAC,QAAQ;gBACd,KAAK,CAAC,SAAS,IAAI,IAAI;gBACvB,KAAK,CAAC,SAAS;gBACf,KAAK,CAAC,YAAY,IAAI,IAAI;gBAC1B,SAAS;gBACT,CAAC;gBACD,GAAG;gBACH,GAAG;gBACH,GAAG;aACJ;SACF,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,kBAAkB,CAAC,EAAE,CAAC,CAAE,CAAC;IACzC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QAClD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,SAAS,CAChB,CAAC;QACF,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,iBAAyB;IAEzB,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACpC,GAAG,EAAE;;;kBAGS;QACd,IAAI,EAAE,CAAC,iBAAiB,CAAC;KAC1B,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0CAA0C,CAC9D,iBAAyB,EACzB,QAAgB,EAChB,SAAyB;IAEzB,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,SAAS;QACP,CAAC,CAAC;YACE,GAAG,EAAE;;wCAEyB;YAC9B,IAAI,EAAE,CAAC,iBAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC;SAC/C;QACH,CAAC,CAAC;YACE,GAAG,EAAE;;wCAEyB;YAC9B,IAAI,EAAE,CAAC,iBAAiB,EAAE,QAAQ,CAAC;SACpC,CACN,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAA8B,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,4BAA4B,CAAC,GAAY;IAChD,MAAM,CAAC,GAAG,GAAiD,CAAC;IAC5D,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,OAAO,CACL,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtB,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC/B,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,iBAAyB,EACzB,QAAgB,EAChB,SAAiB;IAEjB,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACpC,GAAG,EAAE;;kBAES;QACd,IAAI,EAAE,CAAC,iBAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC;KAC/C,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAU;IAEV,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACpC,GAAG,EAAE,kEAAkE;QACvE,IAAI,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAU;IAEV,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,gBAAgB,GAAG,GAAG,GAAG,yBAAyB,CAAC;IACzD,MAAM,oBAAoB,GAAG,GAAG,GAAG,oCAAoC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE,UAAU,EAAE;YACf,CAAC,CAAC;;;;;;;;;;qBAUa;YACf,CAAC,CAAC;;;;;;;;;aASK;QACT,IAAI,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,gBAAgB,EAAE,oBAAoB,CAAC;KACtE,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,CAAC,CAAC;YACZ,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC;YACvD,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IACD,MAAM,QAAQ,GAAI,MAAc,EAAE,YAAY,IAAK,MAAc,EAAE,QAAQ,CAAC;IAC5E,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAK,GAAG,CAAC;IAET,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,gBAAgB,GAAG,GAAG,GAAG,yBAAyB,CAAC;IACzD,MAAM,oBAAoB,GAAG,GAAG,GAAG,oCAAoC,CAAC;IACxE,4EAA4E;IAC5E,wEAAwE;IACxE,2CAA2C;IAC3C,MAAM,MAAM,CAAC,OAAO,CAAC;QACnB,GAAG,EAAE;;0DAEiD;QACtD,IAAI,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;KACjD,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC;QACnB,GAAG,EAAE;;;wDAG+C;QACpD,IAAI,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,EAAE,oBAAoB,CAAC;KACpE,CAAC,CAAC;IACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACpC,GAAG,EAAE;;;kBAGS;QACd,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC;KACnB,CAAC,CAAC;IACH,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC;QAClE,IAAI,YAAY;YAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,EAAU;IAEV,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE,UAAU,EAAE;YACf,CAAC,CAAC;;;qBAGa;YACf,CAAC,CAAC;;gDAEwC;QAC5C,IAAI,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,EAAE,CAAC;KAC9B,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,CAAC,CAAC;YACZ,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC;YACvD,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IACD,MAAM,QAAQ,GAAI,MAAc,EAAE,YAAY,IAAK,MAAc,EAAE,QAAQ,CAAC;IAC5E,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,EAAU,EACV,OAAe;IAEf,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,CAAC,OAAO,CAAC;QACnB,GAAG,EAAE;;kEAEyD;QAC9D,IAAI,EAAE,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAAU;IACtD,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,CAAC,OAAO,CAAC;QACnB,GAAG,EAAE;;+EAEsE;QAC3E,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;KAClC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAU,EACV,YAAoB;IAEpB,MAAM,WAAW,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,CAAC,OAAO,CAAC;QACnB,GAAG,EAAE;;iDAEwC;QAC7C,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;KACvD,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n getDbExec,\n isPostgres,\n intType,\n retryOnDdlRace,\n} from \"../db/client.js\";\nimport { isDuplicateColumnError } from \"../db/migrations.js\";\nimport type { IncomingMessage } from \"./types.js\";\n\nlet _initPromise: Promise<void> | undefined;\nconst PROCESSING_STUCK_AFTER_MS = 5 * 60 * 1000;\nconst PROCESSING_NEXT_CHECK_STALE_AFTER_MS = 60 * 1000;\n\nasync function ensureTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n await retryOnDdlRace(() =>\n client.execute(`\n CREATE TABLE IF NOT EXISTS integration_a2a_continuations (\n id TEXT PRIMARY KEY,\n integration_task_id TEXT NOT NULL,\n platform TEXT NOT NULL,\n external_thread_id TEXT NOT NULL,\n incoming_payload TEXT NOT NULL,\n placeholder_ref TEXT,\n owner_email TEXT NOT NULL,\n org_id TEXT,\n agent_name TEXT NOT NULL,\n agent_url TEXT NOT NULL,\n dedupe_key TEXT,\n a2a_task_id TEXT NOT NULL,\n a2a_auth_token TEXT,\n status TEXT NOT NULL,\n attempts ${intType()} NOT NULL DEFAULT 0,\n next_check_at ${intType()} NOT NULL,\n error_message TEXT,\n created_at ${intType()} NOT NULL,\n updated_at ${intType()} NOT NULL,\n completed_at ${intType()}\n )\n `),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_status_next ON integration_a2a_continuations(status, next_check_at)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_integration_task ON integration_a2a_continuations(integration_task_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_a2a_continuations_remote_task ON integration_a2a_continuations(integration_task_id, agent_url, a2a_task_id)`,\n ),\n );\n await addColumnIfMissing(\"a2a_auth_token\", \"TEXT\");\n await addColumnIfMissing(\"dedupe_key\", \"TEXT\");\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_dedupe_key ON integration_a2a_continuations(integration_task_id, agent_url, dedupe_key)`,\n ),\n );\n })().catch((err) => {\n // Retry init on the next call after a failed startup.\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nasync function addColumnIfMissing(name: string, definition: string) {\n try {\n await retryOnDdlRace(() =>\n getDbExec().execute(\n `ALTER TABLE integration_a2a_continuations ADD COLUMN ${name} ${definition}`,\n ),\n );\n } catch (err) {\n if (isDuplicateColumnError(err)) return;\n throw err;\n }\n}\n\nexport type A2AContinuationStatus =\n | \"pending\"\n | \"processing\"\n | \"delivering\"\n | \"completed\"\n | \"failed\";\n\nexport interface A2AContinuation {\n id: string;\n integrationTaskId: string;\n platform: string;\n externalThreadId: string;\n incoming: IncomingMessage;\n placeholderRef: string | null;\n ownerEmail: string;\n orgId: string | null;\n agentName: string;\n agentUrl: string;\n dedupeKey: string | null;\n a2aTaskId: string;\n a2aAuthToken: string | null;\n status: A2AContinuationStatus;\n attempts: number;\n nextCheckAt: number;\n errorMessage: string | null;\n createdAt: number;\n updatedAt: number;\n completedAt: number | null;\n}\n\nfunction rowToContinuation(row: Record<string, unknown>): A2AContinuation {\n return {\n id: row.id as string,\n integrationTaskId: row.integration_task_id as string,\n platform: row.platform as string,\n externalThreadId: row.external_thread_id as string,\n incoming: JSON.parse(row.incoming_payload as string) as IncomingMessage,\n placeholderRef: (row.placeholder_ref as string | null) ?? null,\n ownerEmail: row.owner_email as string,\n orgId: (row.org_id as string | null) ?? null,\n agentName: row.agent_name as string,\n agentUrl: row.agent_url as string,\n dedupeKey: (row.dedupe_key as string | null) ?? null,\n a2aTaskId: row.a2a_task_id as string,\n a2aAuthToken: (row.a2a_auth_token as string | null) ?? null,\n status: row.status as A2AContinuationStatus,\n attempts: Number(row.attempts ?? 0),\n nextCheckAt: Number(row.next_check_at ?? 0),\n errorMessage: (row.error_message as string | null) ?? null,\n createdAt: Number(row.created_at ?? 0),\n updatedAt: Number(row.updated_at ?? 0),\n completedAt:\n row.completed_at == null ? null : Number(row.completed_at as number),\n };\n}\n\nexport async function insertA2AContinuation(input: {\n integrationTaskId: string;\n platform: string;\n externalThreadId: string;\n incoming: IncomingMessage;\n placeholderRef?: string | null;\n ownerEmail: string;\n orgId?: string | null;\n agentName: string;\n agentUrl: string;\n dedupeKey?: string | null;\n a2aTaskId: string;\n a2aAuthToken?: string | null;\n}): Promise<A2AContinuation> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n const id = `a2a-cont-${now}-${Math.random().toString(36).slice(2, 8)}`;\n const payload = JSON.stringify(input.incoming);\n\n try {\n await client.execute({\n sql: `INSERT INTO integration_a2a_continuations\n (id, integration_task_id, platform, external_thread_id, incoming_payload,\n placeholder_ref, owner_email, org_id, agent_name, agent_url, dedupe_key, a2a_task_id, a2a_auth_token,\n status, attempts, next_check_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n input.integrationTaskId,\n input.platform,\n input.externalThreadId,\n payload,\n input.placeholderRef ?? null,\n input.ownerEmail,\n input.orgId ?? null,\n input.agentName,\n input.agentUrl,\n input.dedupeKey ?? null,\n input.a2aTaskId,\n input.a2aAuthToken ?? null,\n \"pending\",\n 0,\n now,\n now,\n now,\n ],\n });\n return (await getA2AContinuation(id))!;\n } catch (err: any) {\n if (!isDuplicateContinuationError(err)) throw err;\n const existing = await findA2AContinuation(\n input.integrationTaskId,\n input.agentUrl,\n input.a2aTaskId,\n );\n if (existing) return existing;\n throw err;\n }\n}\n\nexport async function getA2AContinuationForIntegrationTask(\n integrationTaskId: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM integration_a2a_continuations\n WHERE integration_task_id = ?\n ORDER BY created_at ASC\n LIMIT 1`,\n args: [integrationTaskId],\n });\n return rows[0] ? rowToContinuation(rows[0] as Record<string, unknown>) : null;\n}\n\nexport async function getA2AContinuationsForIntegrationTaskAgent(\n integrationTaskId: string,\n agentUrl: string,\n dedupeKey?: string | null,\n): Promise<A2AContinuation[]> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute(\n dedupeKey\n ? {\n sql: `SELECT * FROM integration_a2a_continuations\n WHERE integration_task_id = ? AND agent_url = ? AND dedupe_key = ?\n ORDER BY created_at ASC`,\n args: [integrationTaskId, agentUrl, dedupeKey],\n }\n : {\n sql: `SELECT * FROM integration_a2a_continuations\n WHERE integration_task_id = ? AND agent_url = ?\n ORDER BY created_at ASC`,\n args: [integrationTaskId, agentUrl],\n },\n );\n return rows.map((row) => rowToContinuation(row as Record<string, unknown>));\n}\n\nfunction isDuplicateContinuationError(err: unknown): boolean {\n const e = err as { code?: string; message?: string } | null;\n if (!e) return false;\n if (e.code === \"23505\") return true;\n const msg = String(e.message ?? \"\").toLowerCase();\n return (\n msg.includes(\"unique\") ||\n msg.includes(\"duplicate entry\") ||\n msg.includes(\"duplicate key\")\n );\n}\n\nasync function findA2AContinuation(\n integrationTaskId: string,\n agentUrl: string,\n a2aTaskId: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM integration_a2a_continuations\n WHERE integration_task_id = ? AND agent_url = ? AND a2a_task_id = ?\n LIMIT 1`,\n args: [integrationTaskId, agentUrl, a2aTaskId],\n });\n return rows[0] ? rowToContinuation(rows[0] as Record<string, unknown>) : null;\n}\n\nexport async function getA2AContinuation(\n id: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM integration_a2a_continuations WHERE id = ? LIMIT 1`,\n args: [id],\n });\n return rows[0] ? rowToContinuation(rows[0] as Record<string, unknown>) : null;\n}\n\nexport async function claimA2AContinuation(\n id: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n const processingCutoff = now - PROCESSING_STUCK_AFTER_MS;\n const staleNextCheckCutoff = now - PROCESSING_NEXT_CHECK_STALE_AFTER_MS;\n const result = await client.execute({\n sql: isPostgres()\n ? `UPDATE integration_a2a_continuations\n SET status = ?, attempts = attempts + 1, updated_at = ?\n WHERE id = ?\n AND (\n status = 'pending'\n OR (\n status = 'processing'\n AND (updated_at <= ? OR next_check_at <= ?)\n )\n )\n RETURNING *`\n : `UPDATE integration_a2a_continuations\n SET status = ?, attempts = attempts + 1, updated_at = ?\n WHERE id = ?\n AND (\n status = 'pending'\n OR (\n status = 'processing'\n AND (updated_at <= ? OR next_check_at <= ?)\n )\n )`,\n args: [\"processing\", now, id, processingCutoff, staleNextCheckCutoff],\n });\n const rows = result.rows ?? [];\n if (isPostgres()) {\n return rows[0]\n ? rowToContinuation(rows[0] as Record<string, unknown>)\n : null;\n }\n const affected = (result as any)?.rowsAffected ?? (result as any)?.rowCount;\n if (affected === 0) return null;\n const fetched = await getA2AContinuation(id);\n if (!fetched || fetched.status !== \"processing\") return null;\n return fetched;\n}\n\nexport async function claimDueA2AContinuations(\n limit = 5,\n): Promise<A2AContinuation[]> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n const processingCutoff = now - PROCESSING_STUCK_AFTER_MS;\n const staleNextCheckCutoff = now - PROCESSING_NEXT_CHECK_STALE_AFTER_MS;\n // If a processor dies while holding a delivery claim, retry the final send.\n // The stale cutoff preserves the in-flight delivery guard while keeping\n // final integration replies at-least-once.\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, next_check_at = ?, updated_at = ?\n WHERE status = 'delivering' AND updated_at <= ?`,\n args: [\"pending\", now, now, now - 5 * 60 * 1000],\n });\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, next_check_at = ?, updated_at = ?\n WHERE status = 'processing'\n AND (updated_at <= ? OR next_check_at <= ?)`,\n args: [\"pending\", now, now, processingCutoff, staleNextCheckCutoff],\n });\n const { rows } = await client.execute({\n sql: `SELECT id FROM integration_a2a_continuations\n WHERE status = 'pending' AND next_check_at <= ?\n ORDER BY next_check_at ASC\n LIMIT ?`,\n args: [now, limit],\n });\n const claimed: A2AContinuation[] = [];\n for (const row of rows) {\n const continuation = await claimA2AContinuation(row.id as string);\n if (continuation) claimed.push(continuation);\n }\n return claimed;\n}\n\nexport async function claimA2AContinuationDelivery(\n id: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n const result = await client.execute({\n sql: isPostgres()\n ? `UPDATE integration_a2a_continuations\n SET status = ?, updated_at = ?\n WHERE id = ? AND status = 'processing'\n RETURNING *`\n : `UPDATE integration_a2a_continuations\n SET status = ?, updated_at = ?\n WHERE id = ? AND status = 'processing'`,\n args: [\"delivering\", now, id],\n });\n const rows = result.rows ?? [];\n if (isPostgres()) {\n return rows[0]\n ? rowToContinuation(rows[0] as Record<string, unknown>)\n : null;\n }\n const affected = (result as any)?.rowsAffected ?? (result as any)?.rowCount;\n if (affected === 0) return null;\n const fetched = await getA2AContinuation(id);\n if (!fetched || fetched.status !== \"delivering\") return null;\n return fetched;\n}\n\nexport async function rescheduleA2AContinuation(\n id: string,\n delayMs: number,\n): Promise<void> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, next_check_at = ?, updated_at = ?\n WHERE id = ? AND status IN ('processing', 'delivering')`,\n args: [\"pending\", now + delayMs, now, id],\n });\n}\n\nexport async function completeA2AContinuation(id: string): Promise<void> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, updated_at = ?, completed_at = ?\n WHERE id = ? AND status IN ('processing', 'delivering', 'completed')`,\n args: [\"completed\", now, now, id],\n });\n}\n\nexport async function failA2AContinuation(\n id: string,\n errorMessage: string,\n): Promise<void> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, updated_at = ?, error_message = ?\n WHERE id = ? AND status <> 'completed'`,\n args: [\"failed\", now, errorMessage.slice(0, 2000), id],\n });\n}\n"]}
1
+ {"version":3,"file":"a2a-continuations-store.js","sourceRoot":"","sources":["../../src/integrations/a2a-continuations-store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getDbExec,\n isPostgres,\n intType,\n retryOnDdlRace,\n} from \"../db/client.js\";\nimport {\n ensureTableExists,\n ensureColumnExists,\n ensureIndexExists,\n} from \"../db/ddl-guard.js\";\nimport { isDuplicateColumnError } from \"../db/migrations.js\";\nimport type { IncomingMessage } from \"./types.js\";\n\nlet _initPromise: Promise<void> | undefined;\nconst PROCESSING_STUCK_AFTER_MS = 5 * 60 * 1000;\nconst PROCESSING_NEXT_CHECK_STALE_AFTER_MS = 60 * 1000;\n\n// Build the CREATE SQL lazily (not at module scope) so intType() runs at\n// RUNTIME, not import time — a module-scope call breaks any consumer whose\n// db/client mock doesn't stub intType (e.g. db-admin specs).\nfunction buildCreateSql(): string {\n return `\n CREATE TABLE IF NOT EXISTS integration_a2a_continuations (\n id TEXT PRIMARY KEY,\n integration_task_id TEXT NOT NULL,\n platform TEXT NOT NULL,\n external_thread_id TEXT NOT NULL,\n incoming_payload TEXT NOT NULL,\n placeholder_ref TEXT,\n owner_email TEXT NOT NULL,\n org_id TEXT,\n agent_name TEXT NOT NULL,\n agent_url TEXT NOT NULL,\n dedupe_key TEXT,\n a2a_task_id TEXT NOT NULL,\n a2a_auth_token TEXT,\n status TEXT NOT NULL,\n attempts ${intType()} NOT NULL DEFAULT 0,\n next_check_at ${intType()} NOT NULL,\n error_message TEXT,\n created_at ${intType()} NOT NULL,\n updated_at ${intType()} NOT NULL,\n completed_at ${intType()}\n )\n`;\n}\n\nasync function ensureTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const createSql = buildCreateSql();\n if (isPostgres()) {\n // PG guard: probe via information_schema, only issue DDL if missing, bounded lock_timeout\n await ensureTableExists(\"integration_a2a_continuations\", createSql);\n await ensureIndexExists(\n \"idx_a2a_continuations_status_next\",\n `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_status_next ON integration_a2a_continuations(status, next_check_at)`,\n );\n await ensureIndexExists(\n \"idx_a2a_continuations_integration_task\",\n `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_integration_task ON integration_a2a_continuations(integration_task_id)`,\n );\n await ensureIndexExists(\n \"idx_a2a_continuations_remote_task\",\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_a2a_continuations_remote_task ON integration_a2a_continuations(integration_task_id, agent_url, a2a_task_id)`,\n );\n await ensureColumnExists(\n \"integration_a2a_continuations\",\n \"a2a_auth_token\",\n `ALTER TABLE integration_a2a_continuations ADD COLUMN IF NOT EXISTS a2a_auth_token TEXT`,\n );\n await ensureColumnExists(\n \"integration_a2a_continuations\",\n \"dedupe_key\",\n `ALTER TABLE integration_a2a_continuations ADD COLUMN IF NOT EXISTS dedupe_key TEXT`,\n );\n await ensureIndexExists(\n \"idx_a2a_continuations_dedupe_key\",\n `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_dedupe_key ON integration_a2a_continuations(integration_task_id, agent_url, dedupe_key)`,\n );\n return;\n }\n // SQLite (local dev): keep existing behavior\n await retryOnDdlRace(() => client.execute(createSql));\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_status_next ON integration_a2a_continuations(status, next_check_at)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_integration_task ON integration_a2a_continuations(integration_task_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_a2a_continuations_remote_task ON integration_a2a_continuations(integration_task_id, agent_url, a2a_task_id)`,\n ),\n );\n await addColumnIfMissing(\"a2a_auth_token\", \"TEXT\");\n await addColumnIfMissing(\"dedupe_key\", \"TEXT\");\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_a2a_continuations_dedupe_key ON integration_a2a_continuations(integration_task_id, agent_url, dedupe_key)`,\n ),\n );\n })().catch((err) => {\n // Retry init on the next call after a failed startup.\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nasync function addColumnIfMissing(name: string, definition: string) {\n try {\n await retryOnDdlRace(() =>\n getDbExec().execute(\n `ALTER TABLE integration_a2a_continuations ADD COLUMN ${name} ${definition}`,\n ),\n );\n } catch (err) {\n if (isDuplicateColumnError(err)) return;\n throw err;\n }\n}\n\nexport type A2AContinuationStatus =\n | \"pending\"\n | \"processing\"\n | \"delivering\"\n | \"completed\"\n | \"failed\";\n\nexport interface A2AContinuation {\n id: string;\n integrationTaskId: string;\n platform: string;\n externalThreadId: string;\n incoming: IncomingMessage;\n placeholderRef: string | null;\n ownerEmail: string;\n orgId: string | null;\n agentName: string;\n agentUrl: string;\n dedupeKey: string | null;\n a2aTaskId: string;\n a2aAuthToken: string | null;\n status: A2AContinuationStatus;\n attempts: number;\n nextCheckAt: number;\n errorMessage: string | null;\n createdAt: number;\n updatedAt: number;\n completedAt: number | null;\n}\n\nfunction rowToContinuation(row: Record<string, unknown>): A2AContinuation {\n return {\n id: row.id as string,\n integrationTaskId: row.integration_task_id as string,\n platform: row.platform as string,\n externalThreadId: row.external_thread_id as string,\n incoming: JSON.parse(row.incoming_payload as string) as IncomingMessage,\n placeholderRef: (row.placeholder_ref as string | null) ?? null,\n ownerEmail: row.owner_email as string,\n orgId: (row.org_id as string | null) ?? null,\n agentName: row.agent_name as string,\n agentUrl: row.agent_url as string,\n dedupeKey: (row.dedupe_key as string | null) ?? null,\n a2aTaskId: row.a2a_task_id as string,\n a2aAuthToken: (row.a2a_auth_token as string | null) ?? null,\n status: row.status as A2AContinuationStatus,\n attempts: Number(row.attempts ?? 0),\n nextCheckAt: Number(row.next_check_at ?? 0),\n errorMessage: (row.error_message as string | null) ?? null,\n createdAt: Number(row.created_at ?? 0),\n updatedAt: Number(row.updated_at ?? 0),\n completedAt:\n row.completed_at == null ? null : Number(row.completed_at as number),\n };\n}\n\nexport async function insertA2AContinuation(input: {\n integrationTaskId: string;\n platform: string;\n externalThreadId: string;\n incoming: IncomingMessage;\n placeholderRef?: string | null;\n ownerEmail: string;\n orgId?: string | null;\n agentName: string;\n agentUrl: string;\n dedupeKey?: string | null;\n a2aTaskId: string;\n a2aAuthToken?: string | null;\n}): Promise<A2AContinuation> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n const id = `a2a-cont-${now}-${Math.random().toString(36).slice(2, 8)}`;\n const payload = JSON.stringify(input.incoming);\n\n try {\n await client.execute({\n sql: `INSERT INTO integration_a2a_continuations\n (id, integration_task_id, platform, external_thread_id, incoming_payload,\n placeholder_ref, owner_email, org_id, agent_name, agent_url, dedupe_key, a2a_task_id, a2a_auth_token,\n status, attempts, next_check_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n input.integrationTaskId,\n input.platform,\n input.externalThreadId,\n payload,\n input.placeholderRef ?? null,\n input.ownerEmail,\n input.orgId ?? null,\n input.agentName,\n input.agentUrl,\n input.dedupeKey ?? null,\n input.a2aTaskId,\n input.a2aAuthToken ?? null,\n \"pending\",\n 0,\n now,\n now,\n now,\n ],\n });\n return (await getA2AContinuation(id))!;\n } catch (err: any) {\n if (!isDuplicateContinuationError(err)) throw err;\n const existing = await findA2AContinuation(\n input.integrationTaskId,\n input.agentUrl,\n input.a2aTaskId,\n );\n if (existing) return existing;\n throw err;\n }\n}\n\nexport async function getA2AContinuationForIntegrationTask(\n integrationTaskId: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM integration_a2a_continuations\n WHERE integration_task_id = ?\n ORDER BY created_at ASC\n LIMIT 1`,\n args: [integrationTaskId],\n });\n return rows[0] ? rowToContinuation(rows[0] as Record<string, unknown>) : null;\n}\n\nexport async function getA2AContinuationsForIntegrationTaskAgent(\n integrationTaskId: string,\n agentUrl: string,\n dedupeKey?: string | null,\n): Promise<A2AContinuation[]> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute(\n dedupeKey\n ? {\n sql: `SELECT * FROM integration_a2a_continuations\n WHERE integration_task_id = ? AND agent_url = ? AND dedupe_key = ?\n ORDER BY created_at ASC`,\n args: [integrationTaskId, agentUrl, dedupeKey],\n }\n : {\n sql: `SELECT * FROM integration_a2a_continuations\n WHERE integration_task_id = ? AND agent_url = ?\n ORDER BY created_at ASC`,\n args: [integrationTaskId, agentUrl],\n },\n );\n return rows.map((row) => rowToContinuation(row as Record<string, unknown>));\n}\n\nfunction isDuplicateContinuationError(err: unknown): boolean {\n const e = err as { code?: string; message?: string } | null;\n if (!e) return false;\n if (e.code === \"23505\") return true;\n const msg = String(e.message ?? \"\").toLowerCase();\n return (\n msg.includes(\"unique\") ||\n msg.includes(\"duplicate entry\") ||\n msg.includes(\"duplicate key\")\n );\n}\n\nasync function findA2AContinuation(\n integrationTaskId: string,\n agentUrl: string,\n a2aTaskId: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM integration_a2a_continuations\n WHERE integration_task_id = ? AND agent_url = ? AND a2a_task_id = ?\n LIMIT 1`,\n args: [integrationTaskId, agentUrl, a2aTaskId],\n });\n return rows[0] ? rowToContinuation(rows[0] as Record<string, unknown>) : null;\n}\n\nexport async function getA2AContinuation(\n id: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM integration_a2a_continuations WHERE id = ? LIMIT 1`,\n args: [id],\n });\n return rows[0] ? rowToContinuation(rows[0] as Record<string, unknown>) : null;\n}\n\nexport async function claimA2AContinuation(\n id: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n const processingCutoff = now - PROCESSING_STUCK_AFTER_MS;\n const staleNextCheckCutoff = now - PROCESSING_NEXT_CHECK_STALE_AFTER_MS;\n const result = await client.execute({\n sql: isPostgres()\n ? `UPDATE integration_a2a_continuations\n SET status = ?, attempts = attempts + 1, updated_at = ?\n WHERE id = ?\n AND (\n status = 'pending'\n OR (\n status = 'processing'\n AND (updated_at <= ? OR next_check_at <= ?)\n )\n )\n RETURNING *`\n : `UPDATE integration_a2a_continuations\n SET status = ?, attempts = attempts + 1, updated_at = ?\n WHERE id = ?\n AND (\n status = 'pending'\n OR (\n status = 'processing'\n AND (updated_at <= ? OR next_check_at <= ?)\n )\n )`,\n args: [\"processing\", now, id, processingCutoff, staleNextCheckCutoff],\n });\n const rows = result.rows ?? [];\n if (isPostgres()) {\n return rows[0]\n ? rowToContinuation(rows[0] as Record<string, unknown>)\n : null;\n }\n const affected = (result as any)?.rowsAffected ?? (result as any)?.rowCount;\n if (affected === 0) return null;\n const fetched = await getA2AContinuation(id);\n if (!fetched || fetched.status !== \"processing\") return null;\n return fetched;\n}\n\nexport async function claimDueA2AContinuations(\n limit = 5,\n): Promise<A2AContinuation[]> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n const processingCutoff = now - PROCESSING_STUCK_AFTER_MS;\n const staleNextCheckCutoff = now - PROCESSING_NEXT_CHECK_STALE_AFTER_MS;\n // If a processor dies while holding a delivery claim, retry the final send.\n // The stale cutoff preserves the in-flight delivery guard while keeping\n // final integration replies at-least-once.\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, next_check_at = ?, updated_at = ?\n WHERE status = 'delivering' AND updated_at <= ?`,\n args: [\"pending\", now, now, now - 5 * 60 * 1000],\n });\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, next_check_at = ?, updated_at = ?\n WHERE status = 'processing'\n AND (updated_at <= ? OR next_check_at <= ?)`,\n args: [\"pending\", now, now, processingCutoff, staleNextCheckCutoff],\n });\n const { rows } = await client.execute({\n sql: `SELECT id FROM integration_a2a_continuations\n WHERE status = 'pending' AND next_check_at <= ?\n ORDER BY next_check_at ASC\n LIMIT ?`,\n args: [now, limit],\n });\n const claimed: A2AContinuation[] = [];\n for (const row of rows) {\n const continuation = await claimA2AContinuation(row.id as string);\n if (continuation) claimed.push(continuation);\n }\n return claimed;\n}\n\nexport async function claimA2AContinuationDelivery(\n id: string,\n): Promise<A2AContinuation | null> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n const result = await client.execute({\n sql: isPostgres()\n ? `UPDATE integration_a2a_continuations\n SET status = ?, updated_at = ?\n WHERE id = ? AND status = 'processing'\n RETURNING *`\n : `UPDATE integration_a2a_continuations\n SET status = ?, updated_at = ?\n WHERE id = ? AND status = 'processing'`,\n args: [\"delivering\", now, id],\n });\n const rows = result.rows ?? [];\n if (isPostgres()) {\n return rows[0]\n ? rowToContinuation(rows[0] as Record<string, unknown>)\n : null;\n }\n const affected = (result as any)?.rowsAffected ?? (result as any)?.rowCount;\n if (affected === 0) return null;\n const fetched = await getA2AContinuation(id);\n if (!fetched || fetched.status !== \"delivering\") return null;\n return fetched;\n}\n\nexport async function rescheduleA2AContinuation(\n id: string,\n delayMs: number,\n): Promise<void> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, next_check_at = ?, updated_at = ?\n WHERE id = ? AND status IN ('processing', 'delivering')`,\n args: [\"pending\", now + delayMs, now, id],\n });\n}\n\nexport async function completeA2AContinuation(id: string): Promise<void> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, updated_at = ?, completed_at = ?\n WHERE id = ? AND status IN ('processing', 'delivering', 'completed')`,\n args: [\"completed\", now, now, id],\n });\n}\n\nexport async function failA2AContinuation(\n id: string,\n errorMessage: string,\n): Promise<void> {\n await ensureTable();\n const client = getDbExec();\n const now = Date.now();\n await client.execute({\n sql: `UPDATE integration_a2a_continuations\n SET status = ?, updated_at = ?, error_message = ?\n WHERE id = ? AND status <> 'completed'`,\n args: [\"failed\", now, errorMessage.slice(0, 2000), id],\n });\n}\n"]}