@friggframework/core 2.0.0-next.12 → 2.0.0-next.120

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 (410) hide show
  1. package/.eslintrc.json +18 -1
  2. package/CLAUDE.md +830 -0
  3. package/README.md +996 -50
  4. package/admin-scripts/index.js +52 -0
  5. package/admin-scripts/repositories/admin-script-execution-repository-documentdb.js +21 -0
  6. package/admin-scripts/repositories/admin-script-execution-repository-factory.js +51 -0
  7. package/admin-scripts/repositories/admin-script-execution-repository-interface.js +171 -0
  8. package/admin-scripts/repositories/admin-script-execution-repository-mongo.js +238 -0
  9. package/admin-scripts/repositories/admin-script-execution-repository-postgres.js +278 -0
  10. package/admin-scripts/repositories/script-schedule-repository-documentdb.js +21 -0
  11. package/admin-scripts/repositories/script-schedule-repository-factory.js +51 -0
  12. package/admin-scripts/repositories/script-schedule-repository-interface.js +108 -0
  13. package/admin-scripts/repositories/script-schedule-repository-mongo.js +179 -0
  14. package/admin-scripts/repositories/script-schedule-repository-postgres.js +210 -0
  15. package/application/commands/README.md +451 -0
  16. package/application/commands/admin-script-commands.js +359 -0
  17. package/application/commands/credential-commands.js +262 -0
  18. package/application/commands/entity-commands.js +294 -0
  19. package/application/commands/integration-commands.js +419 -0
  20. package/application/commands/integration-mapping-commands.js +25 -0
  21. package/application/commands/process-commands.js +135 -0
  22. package/application/commands/report-commands.js +188 -0
  23. package/application/commands/scheduler-commands.js +263 -0
  24. package/application/commands/usage-commands.js +56 -0
  25. package/application/commands/user-commands.js +312 -0
  26. package/application/index.js +83 -0
  27. package/artifacts/repositories/artifact-repository-factory.js +19 -0
  28. package/artifacts/repositories/artifact-repository-interface.js +27 -0
  29. package/artifacts/repositories/artifact-repository-local.js +42 -0
  30. package/artifacts/repositories/artifact-repository-s3.js +61 -0
  31. package/assertions/index.js +0 -3
  32. package/core/CLAUDE.md +715 -0
  33. package/core/Worker.js +55 -24
  34. package/core/create-handler.js +121 -38
  35. package/core/index.js +8 -1
  36. package/core/invocation-scope.js +225 -0
  37. package/core/parameters-to-env.js +257 -0
  38. package/core/secrets-to-env.js +7 -6
  39. package/core/ssm-preload.mjs +34 -0
  40. package/credential/repositories/credential-active-type.js +32 -0
  41. package/credential/repositories/credential-repository-documentdb.js +355 -0
  42. package/credential/repositories/credential-repository-factory.js +54 -0
  43. package/credential/repositories/credential-repository-interface.js +113 -0
  44. package/credential/repositories/credential-repository-mongo.js +294 -0
  45. package/credential/repositories/credential-repository-postgres.js +312 -0
  46. package/credential/repositories/credential-repository.js +300 -0
  47. package/credential/use-cases/get-credential-for-user.js +25 -0
  48. package/credential/use-cases/update-authentication-status.js +15 -0
  49. package/database/MONGODB_TRANSACTION_FIX.md +198 -0
  50. package/database/adapters/lambda-invoker.js +97 -0
  51. package/database/config.js +147 -0
  52. package/database/documentdb-encryption-service.js +334 -0
  53. package/database/documentdb-utils.js +196 -0
  54. package/database/encryption/README.md +863 -0
  55. package/database/encryption/documentdb-encryption-service.md +3575 -0
  56. package/database/encryption/encryption-schema-registry.js +404 -0
  57. package/database/encryption/field-encryption-service.js +254 -0
  58. package/database/encryption/integration-mapping-encryption.js +97 -0
  59. package/database/encryption/logger.js +82 -0
  60. package/database/encryption/prisma-encryption-extension.js +241 -0
  61. package/database/index.js +21 -21
  62. package/database/prisma.js +182 -0
  63. package/database/repositories/health-check-repository-documentdb.js +138 -0
  64. package/database/repositories/health-check-repository-factory.js +48 -0
  65. package/database/repositories/health-check-repository-interface.js +82 -0
  66. package/database/repositories/health-check-repository-mongodb.js +89 -0
  67. package/database/repositories/health-check-repository-postgres.js +82 -0
  68. package/database/repositories/migration-status-repository-s3.js +137 -0
  69. package/database/use-cases/check-database-health-use-case.js +29 -0
  70. package/database/use-cases/check-database-state-use-case.js +81 -0
  71. package/database/use-cases/check-encryption-health-use-case.js +83 -0
  72. package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
  73. package/database/use-cases/get-migration-status-use-case.js +93 -0
  74. package/database/use-cases/resolve-migration-via-worker-use-case.js +49 -0
  75. package/database/use-cases/run-database-migration-use-case.js +139 -0
  76. package/database/use-cases/test-encryption-use-case.js +253 -0
  77. package/database/use-cases/trigger-database-migration-use-case.js +157 -0
  78. package/database/utils/mongodb-collection-utils.js +94 -0
  79. package/database/utils/mongodb-schema-init.js +108 -0
  80. package/database/utils/prisma-runner.js +491 -0
  81. package/database/utils/prisma-schema-parser.js +182 -0
  82. package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +517 -0
  83. package/encrypt/Cryptor.js +34 -168
  84. package/encrypt/index.js +1 -2
  85. package/errors/client-safe-error.js +26 -0
  86. package/errors/fetch-error.js +59 -57
  87. package/errors/index.js +6 -0
  88. package/errors/mapping-already-exists-error.js +14 -0
  89. package/generated/prisma-mongodb/client.d.ts +1 -0
  90. package/generated/prisma-mongodb/client.js +5 -0
  91. package/generated/prisma-mongodb/default.d.ts +1 -0
  92. package/generated/prisma-mongodb/default.js +5 -0
  93. package/generated/prisma-mongodb/edge.d.ts +1 -0
  94. package/generated/prisma-mongodb/edge.js +386 -0
  95. package/generated/prisma-mongodb/index-browser.js +368 -0
  96. package/generated/prisma-mongodb/index.d.ts +27065 -0
  97. package/generated/prisma-mongodb/index.js +411 -0
  98. package/generated/prisma-mongodb/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  99. package/generated/prisma-mongodb/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
  100. package/generated/prisma-mongodb/package.json +183 -0
  101. package/generated/prisma-mongodb/runtime/edge-esm.js +35 -0
  102. package/generated/prisma-mongodb/runtime/edge.js +35 -0
  103. package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
  104. package/generated/prisma-mongodb/runtime/index-browser.js +17 -0
  105. package/generated/prisma-mongodb/runtime/library.d.ts +3982 -0
  106. package/generated/prisma-mongodb/runtime/library.js +147 -0
  107. package/generated/prisma-mongodb/runtime/react-native.js +84 -0
  108. package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +85 -0
  109. package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +38 -0
  110. package/generated/prisma-mongodb/schema.prisma +455 -0
  111. package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +5 -0
  112. package/generated/prisma-mongodb/wasm-worker-loader.mjs +5 -0
  113. package/generated/prisma-mongodb/wasm.d.ts +1 -0
  114. package/generated/prisma-mongodb/wasm.js +393 -0
  115. package/generated/prisma-postgresql/client.d.ts +1 -0
  116. package/generated/prisma-postgresql/client.js +5 -0
  117. package/generated/prisma-postgresql/default.d.ts +1 -0
  118. package/generated/prisma-postgresql/default.js +5 -0
  119. package/generated/prisma-postgresql/edge.d.ts +1 -0
  120. package/generated/prisma-postgresql/edge.js +407 -0
  121. package/generated/prisma-postgresql/index-browser.js +389 -0
  122. package/generated/prisma-postgresql/index.d.ts +29904 -0
  123. package/generated/prisma-postgresql/index.js +432 -0
  124. package/generated/prisma-postgresql/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  125. package/generated/prisma-postgresql/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
  126. package/generated/prisma-postgresql/package.json +183 -0
  127. package/generated/prisma-postgresql/query_engine_bg.js +2 -0
  128. package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
  129. package/generated/prisma-postgresql/runtime/edge-esm.js +35 -0
  130. package/generated/prisma-postgresql/runtime/edge.js +35 -0
  131. package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
  132. package/generated/prisma-postgresql/runtime/index-browser.js +17 -0
  133. package/generated/prisma-postgresql/runtime/library.d.ts +3982 -0
  134. package/generated/prisma-postgresql/runtime/library.js +147 -0
  135. package/generated/prisma-postgresql/runtime/react-native.js +84 -0
  136. package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +85 -0
  137. package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +38 -0
  138. package/generated/prisma-postgresql/schema.prisma +436 -0
  139. package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +5 -0
  140. package/generated/prisma-postgresql/wasm-worker-loader.mjs +5 -0
  141. package/generated/prisma-postgresql/wasm.d.ts +1 -0
  142. package/generated/prisma-postgresql/wasm.js +414 -0
  143. package/handlers/WEBHOOKS.md +682 -0
  144. package/handlers/app-definition-loader.js +103 -0
  145. package/handlers/app-handler-helpers.js +20 -6
  146. package/handlers/backend-utils.js +272 -46
  147. package/handlers/database-migration-handler.js +236 -0
  148. package/handlers/integration-event-dispatcher.js +68 -0
  149. package/handlers/middleware/admin-auth.js +73 -0
  150. package/handlers/routers/HEALTHCHECK.md +342 -0
  151. package/handlers/routers/auth.js +4 -15
  152. package/handlers/routers/db-migration.handler.js +29 -0
  153. package/handlers/routers/db-migration.js +329 -0
  154. package/handlers/routers/health.js +518 -0
  155. package/handlers/routers/integration-defined-routers.js +85 -10
  156. package/handlers/routers/integration-webhook-routers.js +87 -0
  157. package/handlers/routers/user.js +27 -5
  158. package/handlers/routers/websocket.js +31 -9
  159. package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
  160. package/handlers/use-cases/check-integrations-health-use-case.js +44 -0
  161. package/handlers/workers/db-migration.js +438 -0
  162. package/handlers/workers/dlq-processor.js +89 -0
  163. package/handlers/workers/integration-defined-workers.js +13 -7
  164. package/index.js +123 -47
  165. package/infrastructure/scheduler/eventbridge-scheduler-adapter.js +184 -0
  166. package/infrastructure/scheduler/index.js +33 -0
  167. package/infrastructure/scheduler/mock-scheduler-adapter.js +143 -0
  168. package/infrastructure/scheduler/scheduler-service-factory.js +73 -0
  169. package/infrastructure/scheduler/scheduler-service-interface.js +47 -0
  170. package/integrations/EXTENSIONS.md +240 -0
  171. package/integrations/WEBHOOK-QUICKSTART.md +151 -0
  172. package/integrations/extension.js +254 -0
  173. package/integrations/index.js +20 -10
  174. package/integrations/integration-base.js +777 -74
  175. package/integrations/integration-router.js +399 -180
  176. package/integrations/options.js +1 -1
  177. package/integrations/repositories/config-patch-shared.js +43 -0
  178. package/integrations/repositories/integration-mapping-query-pipeline.js +152 -0
  179. package/integrations/repositories/integration-mapping-query.js +193 -0
  180. package/integrations/repositories/integration-mapping-repository-documentdb.js +406 -0
  181. package/integrations/repositories/integration-mapping-repository-factory.js +57 -0
  182. package/integrations/repositories/integration-mapping-repository-interface.js +183 -0
  183. package/integrations/repositories/integration-mapping-repository-mongo.js +284 -0
  184. package/integrations/repositories/integration-mapping-repository-postgres.js +403 -0
  185. package/integrations/repositories/integration-mapping-repository.js +185 -0
  186. package/integrations/repositories/integration-repository-documentdb.js +354 -0
  187. package/integrations/repositories/integration-repository-factory.js +51 -0
  188. package/integrations/repositories/integration-repository-interface.js +219 -0
  189. package/integrations/repositories/integration-repository-mongo.js +502 -0
  190. package/integrations/repositories/integration-repository-postgres.js +550 -0
  191. package/integrations/repositories/process-repository-documentdb.js +311 -0
  192. package/integrations/repositories/process-repository-factory.js +53 -0
  193. package/integrations/repositories/process-repository-interface.js +136 -0
  194. package/integrations/repositories/process-repository-mongo.js +262 -0
  195. package/integrations/repositories/process-repository-postgres.js +380 -0
  196. package/integrations/repositories/process-update-ops-shared.js +112 -0
  197. package/integrations/repositories/report-id.js +13 -0
  198. package/integrations/tests/doubles/config-capturing-integration.js +81 -0
  199. package/integrations/tests/doubles/dummy-integration-class.js +113 -0
  200. package/integrations/tests/doubles/test-integration-repository.js +146 -0
  201. package/integrations/use-cases/add-entities-to-integration.js +92 -0
  202. package/integrations/use-cases/create-integration.js +253 -0
  203. package/integrations/use-cases/create-process.js +130 -0
  204. package/integrations/use-cases/delete-integration-for-user.js +130 -0
  205. package/integrations/use-cases/find-integration-by-entity-external-id.js +74 -0
  206. package/integrations/use-cases/find-integration-context-by-external-entity-id.js +76 -0
  207. package/integrations/use-cases/get-integration-for-user.js +78 -0
  208. package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
  209. package/integrations/use-cases/get-integration-instance.js +83 -0
  210. package/integrations/use-cases/get-integrations-for-user.js +88 -0
  211. package/integrations/use-cases/get-possible-integrations.js +27 -0
  212. package/integrations/use-cases/get-process.js +89 -0
  213. package/integrations/use-cases/index.js +19 -0
  214. package/integrations/use-cases/list-integrations-by-entity-external-id.js +46 -0
  215. package/integrations/use-cases/load-integration-context.js +71 -0
  216. package/integrations/use-cases/patch-integration-config.js +39 -0
  217. package/integrations/use-cases/process-errors.js +28 -0
  218. package/integrations/use-cases/remove-entities-from-integration.js +70 -0
  219. package/integrations/use-cases/update-integration-config.js +32 -0
  220. package/integrations/use-cases/update-integration-messages.js +44 -0
  221. package/integrations/use-cases/update-integration-status.js +32 -0
  222. package/integrations/use-cases/update-integration.js +92 -0
  223. package/integrations/use-cases/update-process-metrics.js +222 -0
  224. package/integrations/use-cases/update-process-state.js +163 -0
  225. package/integrations/utils/assert-entity-ids-input.js +42 -0
  226. package/integrations/utils/map-integration-dto.js +37 -0
  227. package/jest-global-setup-noop.js +3 -0
  228. package/jest-global-teardown-noop.js +3 -0
  229. package/jest.config.js +2 -0
  230. package/logs/.eslintrc.json +26 -1
  231. package/logs/__fixtures__/events.js +82 -0
  232. package/logs/__fixtures__/matchers.js +45 -0
  233. package/logs/__fixtures__/secrets.js +59 -0
  234. package/logs/__fixtures__/vectors.js +329 -0
  235. package/logs/__fixtures__/with-env.js +45 -0
  236. package/logs/context.js +109 -0
  237. package/logs/contract-keys.js +67 -0
  238. package/logs/debug-shims.js +46 -0
  239. package/logs/denied-keys.js +21 -0
  240. package/logs/index.js +14 -3
  241. package/logs/jest-logger-setup.js +25 -0
  242. package/logs/levels.js +71 -0
  243. package/logs/logger-runtime.js +137 -0
  244. package/logs/logger.js +134 -46
  245. package/logs/record.js +276 -0
  246. package/logs/redact.js +328 -0
  247. package/logs/serialize.js +329 -0
  248. package/logs/sinks.js +93 -0
  249. package/logs/summarize-event.js +163 -0
  250. package/{module-plugin → modules}/index.js +0 -10
  251. package/modules/module-factory.js +56 -0
  252. package/modules/module.js +320 -0
  253. package/modules/repositories/module-repository-documentdb.js +350 -0
  254. package/modules/repositories/module-repository-factory.js +40 -0
  255. package/modules/repositories/module-repository-interface.js +145 -0
  256. package/modules/repositories/module-repository-mongo.js +436 -0
  257. package/modules/repositories/module-repository-postgres.js +481 -0
  258. package/modules/repositories/module-repository.js +369 -0
  259. package/modules/requester/api-key.js +52 -0
  260. package/modules/requester/oauth-2.js +561 -0
  261. package/modules/requester/requester.js +605 -0
  262. package/{module-plugin → modules}/test/mock-api/api.js +8 -3
  263. package/{module-plugin → modules}/test/mock-api/definition.js +14 -10
  264. package/modules/tests/doubles/test-module-factory.js +16 -0
  265. package/modules/tests/doubles/test-module-repository.js +39 -0
  266. package/modules/use-cases/get-entities-for-user.js +32 -0
  267. package/modules/use-cases/get-entity-options-by-id.js +71 -0
  268. package/modules/use-cases/get-entity-options-by-type.js +34 -0
  269. package/modules/use-cases/get-module-instance-from-type.js +34 -0
  270. package/modules/use-cases/get-module.js +74 -0
  271. package/modules/use-cases/process-authorization-callback.js +294 -0
  272. package/modules/use-cases/refresh-entity-options.js +72 -0
  273. package/modules/use-cases/test-module-auth.js +72 -0
  274. package/modules/utils/map-module-dto.js +20 -0
  275. package/modules/utils/to-credential-id.js +14 -0
  276. package/package.json +91 -52
  277. package/prisma-mongodb/schema.prisma +455 -0
  278. package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
  279. package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
  280. package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
  281. package/prisma-postgresql/migrations/20251112195422_update_user_unique_constraints/migration.sql +25 -0
  282. package/prisma-postgresql/migrations/20260422120000_add_entity_data_column/migration.sql +10 -0
  283. package/prisma-postgresql/migrations/20260422120001_create_process_table/migration.sql +48 -0
  284. package/prisma-postgresql/migrations/20260625000000_add_user_organization_id_index/migration.sql +2 -0
  285. package/prisma-postgresql/migrations/20260703000000_add_integration_status_in_creation_in_deletion/migration.sql +11 -0
  286. package/prisma-postgresql/migrations/20260703000001_integration_status_default_in_creation/migration.sql +8 -0
  287. package/prisma-postgresql/migrations/20260705000000_create_usage_counter/migration.sql +26 -0
  288. package/prisma-postgresql/migrations/20260706000000_add_admin_script_execution_and_schedule/migration.sql +61 -0
  289. package/prisma-postgresql/migrations/migration_lock.toml +3 -0
  290. package/prisma-postgresql/schema.prisma +436 -0
  291. package/queues/queue-delivery.js +41 -0
  292. package/queues/queuer-util.js +89 -21
  293. package/reporting/README.md +154 -0
  294. package/reporting/builtin-reports.js +6 -0
  295. package/reporting/index.js +13 -0
  296. package/reporting/report-base.js +49 -0
  297. package/reporting/reports/integrations-report.js +221 -0
  298. package/syncs/manager.js +468 -443
  299. package/syncs/repositories/sync-repository-documentdb.js +240 -0
  300. package/syncs/repositories/sync-repository-factory.js +43 -0
  301. package/syncs/repositories/sync-repository-interface.js +109 -0
  302. package/syncs/repositories/sync-repository-mongo.js +239 -0
  303. package/syncs/repositories/sync-repository-postgres.js +319 -0
  304. package/syncs/sync.js +0 -1
  305. package/telemetry/README.md +331 -0
  306. package/telemetry/bind-telemetry-context.js +77 -0
  307. package/telemetry/canonical-counters.js +52 -0
  308. package/telemetry/exporters.js +85 -0
  309. package/telemetry/index.js +26 -0
  310. package/telemetry/instrument-handler.js +104 -0
  311. package/telemetry/no-op-telemetry.js +71 -0
  312. package/telemetry/north-star.js +103 -0
  313. package/telemetry/otel-telemetry.js +232 -0
  314. package/telemetry/plugin-subscribers.js +77 -0
  315. package/telemetry/telemetry-config.js +120 -0
  316. package/telemetry/telemetry-context.js +51 -0
  317. package/telemetry/telemetry-event-bus.js +58 -0
  318. package/telemetry/telemetry-runtime.js +164 -0
  319. package/telemetry/telemetry-service.js +52 -0
  320. package/telemetry/usage-rollup-subscriber.js +116 -0
  321. package/token/repositories/token-repository-documentdb.js +137 -0
  322. package/token/repositories/token-repository-factory.js +40 -0
  323. package/token/repositories/token-repository-interface.js +131 -0
  324. package/token/repositories/token-repository-mongo.js +219 -0
  325. package/token/repositories/token-repository-postgres.js +264 -0
  326. package/token/repositories/token-repository.js +219 -0
  327. package/types/associations/index.d.ts +0 -17
  328. package/types/core/index.d.ts +12 -4
  329. package/types/database/index.d.ts +10 -2
  330. package/types/encrypt/index.d.ts +5 -3
  331. package/types/errors/index.d.ts +24 -10
  332. package/types/integrations/index.d.ts +3 -8
  333. package/types/logs/index.d.ts +61 -2
  334. package/types/module-plugin/index.d.ts +20 -69
  335. package/types/syncs/index.d.ts +0 -17
  336. package/usage/README.md +54 -0
  337. package/usage/index.js +17 -0
  338. package/usage/repositories/usage-repository-documentdb.js +194 -0
  339. package/usage/repositories/usage-repository-factory.js +25 -0
  340. package/usage/repositories/usage-repository-interface.js +37 -0
  341. package/usage/repositories/usage-repository-prisma.js +146 -0
  342. package/usage/tracked-metrics.js +38 -0
  343. package/usage/usage-windows.js +24 -0
  344. package/user/repositories/user-repository-documentdb.js +426 -0
  345. package/user/repositories/user-repository-factory.js +52 -0
  346. package/user/repositories/user-repository-interface.js +214 -0
  347. package/user/repositories/user-repository-mongo.js +323 -0
  348. package/user/repositories/user-repository-postgres.js +377 -0
  349. package/user/tests/doubles/test-user-repository.js +72 -0
  350. package/user/use-cases/authenticate-user.js +143 -0
  351. package/user/use-cases/authenticate-with-shared-secret.js +48 -0
  352. package/user/use-cases/create-individual-user.js +61 -0
  353. package/user/use-cases/create-organization-user.js +47 -0
  354. package/user/use-cases/create-token-for-user-id.js +30 -0
  355. package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
  356. package/user/use-cases/get-user-from-bearer-token.js +82 -0
  357. package/user/use-cases/get-user-from-x-frigg-headers.js +132 -0
  358. package/user/use-cases/login-user.js +122 -0
  359. package/user/user.js +125 -0
  360. package/utils/backend-path.js +38 -0
  361. package/utils/index.js +6 -0
  362. package/websocket/repositories/websocket-connection-repository-documentdb.js +119 -0
  363. package/websocket/repositories/websocket-connection-repository-factory.js +44 -0
  364. package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
  365. package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
  366. package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
  367. package/websocket/repositories/websocket-connection-repository.js +161 -0
  368. package/assertions/is-equal.js +0 -17
  369. package/associations/model.js +0 -54
  370. package/database/models/IndividualUser.js +0 -76
  371. package/database/models/OrganizationUser.js +0 -29
  372. package/database/models/State.js +0 -9
  373. package/database/models/Token.js +0 -70
  374. package/database/models/UserModel.js +0 -7
  375. package/database/models/WebsocketConnection.js +0 -49
  376. package/database/mongo.js +0 -45
  377. package/database/mongoose.js +0 -5
  378. package/encrypt/Cryptor.test.js +0 -32
  379. package/encrypt/encrypt.js +0 -132
  380. package/encrypt/encrypt.test.js +0 -1069
  381. package/encrypt/test-encrypt.js +0 -107
  382. package/errors/base-error.test.js +0 -32
  383. package/errors/fetch-error.test.js +0 -79
  384. package/errors/halt-error.test.js +0 -11
  385. package/errors/validation-errors.test.js +0 -120
  386. package/handlers/routers/middleware/loadUser.js +0 -15
  387. package/handlers/routers/middleware/requireLoggedInUser.js +0 -12
  388. package/integrations/create-frigg-backend.js +0 -31
  389. package/integrations/integration-factory.js +0 -251
  390. package/integrations/integration-mapping.js +0 -43
  391. package/integrations/integration-model.js +0 -46
  392. package/integrations/integration-user.js +0 -144
  393. package/integrations/test/integration-base.test.js +0 -144
  394. package/lambda/TimeoutCatcher.test.js +0 -68
  395. package/logs/logger.test.js +0 -76
  396. package/module-plugin/auther.js +0 -393
  397. package/module-plugin/credential.js +0 -22
  398. package/module-plugin/entity-manager.js +0 -70
  399. package/module-plugin/entity.js +0 -46
  400. package/module-plugin/manager.js +0 -169
  401. package/module-plugin/module-factory.js +0 -61
  402. package/module-plugin/requester/api-key.js +0 -36
  403. package/module-plugin/requester/oauth-2.js +0 -219
  404. package/module-plugin/requester/requester.js +0 -165
  405. package/module-plugin/requester/requester.test.js +0 -28
  406. package/module-plugin/test/auther.test.js +0 -97
  407. package/syncs/model.js +0 -62
  408. /package/{module-plugin → modules}/ModuleConstants.js +0 -0
  409. /package/{module-plugin → modules}/requester/basic.js +0 -0
  410. /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
@@ -1,20 +1,3 @@
1
- declare module "@friggframework/associations/model" {
2
- import { Model } from "mongoose";
3
-
4
- export class Association extends Model {
5
- integrationId: string;
6
- name: string;
7
- type: string;
8
- primaryObject: string;
9
- objects: {
10
- entityId: string;
11
- objectType: string;
12
- objId: string;
13
- metadata?: object;
14
- }[];
15
- }
16
- }
17
-
18
1
  declare module "@friggframework/associations/association" {
19
2
  export default class Association implements IFriggAssociation {
20
3
  data: any;
@@ -1,5 +1,5 @@
1
1
  declare module "@friggframework/core" {
2
- import { SQS } from "aws-sdk";
2
+ import type { SendMessageCommandInput } from "@aws-sdk/client-sqs";
3
3
 
4
4
  export class Delegate implements IFriggDelegate {
5
5
  delegate: any;
@@ -26,10 +26,18 @@ declare module "@friggframework/core" {
26
26
  ): Promise<any>;
27
27
  }
28
28
 
29
+ export interface BatchItemFailure {
30
+ itemIdentifier: string;
31
+ }
32
+
33
+ export interface BatchItemFailuresResponse {
34
+ batchItemFailures: BatchItemFailure[];
35
+ }
36
+
29
37
  export class Worker implements IWorker {
30
38
  getQueueURL(params: GetQueueURLParams): Promise<string | undefined>;
31
39
 
32
- run(params: { Records: any }): Promise<void>;
40
+ run(params: { Records: any }, context?: object): Promise<BatchItemFailuresResponse>;
33
41
 
34
42
  send(params: object & { QueueUrl: any }, delay?: number): Promise<string>;
35
43
 
@@ -38,7 +46,7 @@ declare module "@friggframework/core" {
38
46
 
39
47
  interface IWorker {
40
48
  getQueueURL(params: GetQueueURLParams): Promise<string | undefined>;
41
- run(params: { Records: any }): Promise<void>;
49
+ run(params: { Records: any }, context?: object): Promise<BatchItemFailuresResponse>;
42
50
  send(params: object & { QueueUrl: any }, delay?: number): Promise<string>;
43
51
  sendAsyncSQSMessage(params: SendSQSMessageParams): Promise<string>;
44
52
  }
@@ -50,5 +58,5 @@ declare module "@friggframework/core" {
50
58
  QueueOwnerAWSAccountId?: string;
51
59
  };
52
60
 
53
- type SendSQSMessageParams = SQS.SendMessageRequest;
61
+ type SendSQSMessageParams = SendMessageCommandInput;
54
62
  }
@@ -1,3 +1,11 @@
1
- declare module "@friggframework/database/mongo" {
2
- export function connectToDatabase(): Promise<void>;
1
+ declare module "@friggframework/database" {
2
+ export const prisma: any;
3
+ export function connectPrisma(): Promise<any>;
4
+ export function disconnectPrisma(): Promise<void>;
5
+ export class TokenRepository {
6
+ constructor(params: { prismaClient: any });
7
+ }
8
+ export class WebsocketConnectionRepository {
9
+ constructor(params: { prismaClient: any });
10
+ }
3
11
  }
@@ -1,5 +1,7 @@
1
1
  declare module "@friggframework/encrypt" {
2
- import { Schema } from "mongoose";
3
-
4
- export function Encrypt(schema: Schema, options: any): void;
2
+ export class Cryptor {
3
+ constructor(params: { shouldUseAws?: boolean });
4
+ encrypt(plaintext: string): Promise<string>;
5
+ decrypt(ciphertext: string): Promise<string>;
6
+ }
5
7
  }
@@ -6,11 +6,30 @@ declare module "@friggframework/errors" {
6
6
  export class FetchError extends BaseError {
7
7
  constructor(options?: FetchErrorConstructor);
8
8
 
9
+ statusCode?: number;
10
+ method: string;
11
+ /** Request URL without userinfo; each query value is `REDACTED`. */
12
+ url: string;
13
+ /** Non-enumerable. The raw response, or `null`. */
14
+ readonly response: FetchErrorResponse | null;
15
+ /** Non-enumerable. The raw response body; never part of `message`. */
16
+ readonly body: any;
17
+ isTimeout?: boolean;
18
+ timeoutMs?: number;
19
+
9
20
  static create(options?: CreateFetchErrorParams): Promise<FetchError>;
10
21
  }
11
22
 
23
+ type FetchErrorResponse = {
24
+ headers?: object;
25
+ status?: number;
26
+ statusText?: string;
27
+ bodyUsed?: boolean;
28
+ text?: () => Promise<string>;
29
+ };
30
+
12
31
  type FetchErrorConstructor = {
13
- resource?: string;
32
+ resource?: string | URL | { url: string };
14
33
  init?: Partial<{
15
34
  method: string;
16
35
  credentials: string;
@@ -19,18 +38,13 @@ declare module "@friggframework/errors" {
19
38
  body: URLSearchParams | any;
20
39
  returnFullRes: false;
21
40
  }>;
22
- response?: {
23
- headers?: object;
24
- status?: number;
25
- statusText?: string;
26
- text?: () => Promise<string>;
27
- };
41
+ response?: FetchErrorResponse | null;
42
+ cause?: unknown;
28
43
  responseBody?: any;
44
+ body?: any;
29
45
  };
30
46
 
31
- type CreateFetchErrorParams = Omit<FetchErrorConstructor, "responseBody"> & {
32
- body: any;
33
- };
47
+ type CreateFetchErrorParams = FetchErrorConstructor;
34
48
 
35
49
  export class HaltError extends BaseError {
36
50
  isHaltError: boolean;
@@ -1,9 +1,7 @@
1
1
  declare module "@friggframework/integrations" {
2
2
  import { Delegate, IFriggDelegate } from "@friggframework/core";
3
- import { Model } from "mongoose";
4
- import { EntityManager } from "@friggframework/module-plugin";
5
3
 
6
- export class Integration extends Model {
4
+ export interface Integration {
7
5
  entities: any[];
8
6
  userId: string;
9
7
  status: string; // IntegrationStatus
@@ -19,8 +17,7 @@ declare module "@friggframework/integrations" {
19
17
 
20
18
  export class IntegrationManager
21
19
  extends Delegate
22
- implements IFriggIntegrationManager
23
- {
20
+ implements IFriggIntegrationManager {
24
21
  integration: Integration;
25
22
  primaryInstance: any;
26
23
  targetInstance: any;
@@ -56,7 +53,6 @@ declare module "@friggframework/integrations" {
56
53
  entities: { id: string; user: any },
57
54
  userId: string,
58
55
  config: any,
59
- EntityManager: EntityManager
60
56
  ): Promise<any>;
61
57
 
62
58
  static getFormattedIntegration(
@@ -116,8 +112,7 @@ declare module "@friggframework/integrations" {
116
112
  }
117
113
 
118
114
  export class IntegrationConfigManager
119
- implements IFriggIntegrationConfigManager
120
- {
115
+ implements IFriggIntegrationConfigManager {
121
116
  options: IntegrationOptions[];
122
117
  primary: any;
123
118
 
@@ -1,5 +1,64 @@
1
- declare module "@friggframework/logs/logger" {
1
+ declare module "@friggframework/core/logs" {
2
+ export type LogLevel = "TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "FATAL";
3
+
4
+ export type LogFields = Record<string, unknown>;
5
+
6
+ export interface LogRecord {
7
+ readonly timestamp: string;
8
+ readonly level: LogLevel;
9
+ readonly message: string;
10
+ readonly logger: string;
11
+ readonly [key: string]: unknown;
12
+ }
13
+
14
+ export interface Logger {
15
+ readonly name: string;
16
+ trace(message: unknown, fields?: LogFields): void;
17
+ debug(message: unknown, fields?: LogFields): void;
18
+ info(message: unknown, fields?: LogFields): void;
19
+ warn(message: unknown, fields?: LogFields): void;
20
+ error(message: unknown, fields?: LogFields): void;
21
+ fatal(message: unknown, fields?: LogFields): void;
22
+ child(bindings: LogFields | (() => LogFields)): Logger;
23
+ isLevelEnabled(level: string): boolean;
24
+ }
25
+
26
+ export interface LogSink {
27
+ name: string;
28
+ write(record: LogRecord): void;
29
+ flush?(options: { signal?: AbortSignal }): Promise<void> | void;
30
+ }
31
+
32
+ export interface MemorySink extends LogSink {
33
+ readonly records: LogRecord[];
34
+ clear(): void;
35
+ }
36
+
37
+ export interface SerializedError {
38
+ type: string;
39
+ message: string;
40
+ code?: string | number;
41
+ status?: number;
42
+ stack?: string;
43
+ cause?: SerializedError | string;
44
+ }
45
+
46
+ export function getLogger(name?: string): Logger;
47
+ export function createMemorySink(options?: { install?: boolean }): MemorySink;
48
+ export function resetLoggerForTests(options?: {
49
+ level?: LogLevel | Lowercase<LogLevel>;
50
+ sinks?: LogSink[];
51
+ /** Record frigg.* WARN+ records without eventName. Kept across resets that omit it. */
52
+ trackViolations?: boolean;
53
+ }): void;
54
+ export function serializeError(error: unknown): SerializedError;
55
+ export function redactValue(value: unknown): unknown;
56
+ export function toSanitizedSurrogate(error: unknown): Error;
57
+
58
+ /** @deprecated Use getLogger or this.logger. */
2
59
  export function debug(...messages: any[]): void;
60
+ /** @deprecated Use getLogger or this.logger. */
3
61
  export function initDebugLog(...initMessages: any[]): void;
4
- export function flushDebugLog(error: any): void;
62
+ /** @deprecated Use getLogger or this.logger. */
63
+ export function flushDebugLog(error?: any): void;
5
64
  }
@@ -1,75 +1,26 @@
1
1
  declare module "@friggframework/module-plugin" {
2
- import { Model } from "mongoose";
3
2
  import { Delegate, IFriggDelegate } from "@friggframework/core";
4
3
 
5
- export class Credential extends Model {
6
- userId: string;
7
- auth_is_valid: boolean;
8
- subType: string;
9
- externalId: string;
4
+ export interface Credential {
5
+ id?: string;
6
+ userId?: string;
7
+ authIsValid?: boolean;
8
+ externalId?: string;
9
+ data?: any;
10
10
  }
11
11
 
12
- export class EntityManager implements IFriggEntityManager {
13
- static primaryEntityClass: any;
14
- static entityManagerClasses: any[];
15
- static entityTypes: string[];
16
- static getEntitiesForUser(userId: string): Promise<any[]>;
17
- static checkIsValidType(entityType: string): boolean;
18
- static getEntityManagerClass(entityType?: string): any;
19
-
20
- static getEntityManagerInstanceFromEntityId(
21
- entityId: string,
22
- userId: string
23
- ): Promise<any>;
24
- }
25
-
26
- interface IFriggEntityManager {}
27
-
28
- export class Entity extends Model {
29
- credentialId: string;
30
- subType: string;
31
- userId: string;
32
- name: string;
33
- externalId: string;
12
+ export interface Entity {
13
+ id?: string;
14
+ credentialId?: string;
15
+ userId?: string;
16
+ name?: string;
17
+ moduleName?: string;
18
+ externalId?: string;
19
+ data?: any;
34
20
  }
35
21
 
36
22
  export type MappedEntity = Entity & { id: string; type: any };
37
- export class ModuleManager extends Delegate implements IFriggModuleManager {
38
- static Entity: Entity;
39
- static Credential: Credential;
40
23
 
41
- constructor(params: { userId: string });
42
-
43
- static getName(): any;
44
- static getInstance(params: any): Promise<any>;
45
- static getEntitiesForUserId(userId: string): Promise<MappedEntity[]>;
46
-
47
- batchCreateSyncObjects(syncObjects: any, syncManager: any): Promise<any>;
48
- batchUpdateSyncObjects(syncObjects: any, syncManager: any): Promise<any>;
49
- findOrCreateEntity(params: any): Promise<any>;
50
- getAllSyncObjects(SyncClass: any): Promise<any>;
51
- getAuthorizationRequirements(params: any): Promise<any>;
52
- getEntityId(): Promise<string>;
53
- getEntityOptions(): Promise<any>;
54
- markCredentialsInvalid(): Promise<Credential>;
55
- processAuthorizationCallback(params: any): Promise<any>;
56
- testAuth(params: any): Promise<any>;
57
- validateAuthorizationRequirements(): Promise<boolean>;
58
- }
59
-
60
- interface IFriggModuleManager extends IFriggDelegate {
61
- getEntityId(): Promise<string>;
62
- validateAuthorizationRequirements(): Promise<boolean>;
63
- getAuthorizationRequirements(params: any): Promise<any>;
64
- testAuth(params: any): Promise<any>;
65
- processAuthorizationCallback(params: any): Promise<any>;
66
- getEntityOptions(): Promise<any>;
67
- findOrCreateEntity(params: any): Promise<any>;
68
- getAllSyncObjects(SyncClass: any): Promise<any>;
69
- batchCreateSyncObjects(syncObjects: any, syncManager: any): Promise<any>;
70
- batchUpdateSyncObjects(syncObjects: any, syncManager: any): Promise<any>;
71
- markCredentialsInvalid(): Promise<Credential>;
72
- }
73
24
 
74
25
  export class Requester implements IFriggRequester {
75
26
  DLGT_INVALID_AUTH: string;
@@ -90,6 +41,7 @@ declare module "@friggframework/module-plugin" {
90
41
  ): Promise<any>;
91
42
  parseBody(response: any): Promise<any>;
92
43
  refreshAuth(): Promise<any>;
44
+ _adoptNewerCredential(): Promise<boolean>;
93
45
 
94
46
  delegate: any;
95
47
  delegateTypes: any[];
@@ -121,6 +73,7 @@ declare module "@friggframework/module-plugin" {
121
73
  _put(options: RequestOptions): Promise<any>;
122
74
  _delete(options: RequestOptions): Promise<any>;
123
75
  refreshAuth(): Promise<any>;
76
+ _adoptNewerCredential(): Promise<boolean>;
124
77
  }
125
78
 
126
79
  type RequestOptions = {
@@ -138,8 +91,7 @@ declare module "@friggframework/module-plugin" {
138
91
 
139
92
  export class ApiKeyRequester
140
93
  extends Requester
141
- implements IFriggApiKeyRequester
142
- {
94
+ implements IFriggApiKeyRequester {
143
95
  API_KEY_NAME: string;
144
96
  API_KEY_VALUE: any;
145
97
 
@@ -160,8 +112,7 @@ declare module "@friggframework/module-plugin" {
160
112
 
161
113
  export class BasicAuthRequester
162
114
  extends Requester
163
- implements IFriggBasicAuthRequester
164
- {
115
+ implements IFriggBasicAuthRequester {
165
116
  password: string;
166
117
  username: string;
167
118
 
@@ -189,8 +140,7 @@ declare module "@friggframework/module-plugin" {
189
140
 
190
141
  export class OAuth2Requester
191
142
  extends Requester
192
- implements IFriggOAuth2Requester
193
- {
143
+ implements IFriggOAuth2Requester {
194
144
  DLGT_TOKEN_DEAUTHORIZED: string;
195
145
  DLGT_TOKEN_UPDATE: string;
196
146
  accessTokenExpire: any;
@@ -253,6 +203,7 @@ declare module "@friggframework/module-plugin" {
253
203
  addAuthHeaders(headers: object): Promise<object>;
254
204
  isAuthenticated(): boolean;
255
205
  refreshAuth(): Promise<void>;
206
+ _adoptNewerCredential(): Promise<boolean>;
256
207
  getTokenFromUsernamePassword(): Promise<Token>;
257
208
  getTokenFromClientCredentials(): Promise<Token>;
258
209
  }
@@ -1,18 +1,3 @@
1
- declare module "@friggframework/syncs/model" {
2
- import { Model } from "mongoose";
3
-
4
- export class Sync extends Model {
5
- entities: any[];
6
- hash: string;
7
- name: string;
8
- dataIdentifiers: {
9
- entity: any;
10
- id: object;
11
- hash: string;
12
- }[];
13
- }
14
- }
15
-
16
1
  declare module "@friggframework/syncs/manager" {
17
2
  import Sync from "@friggframework/syncs/sync";
18
3
 
@@ -28,7 +13,6 @@ declare module "@friggframework/syncs/manager" {
28
13
  confirmCreate(
29
14
  syncObj: Sync,
30
15
  createdId: string,
31
- moduleManager: any
32
16
  ): Promise<any>;
33
17
  confirmUpdate(syncObj: Sync): Promise<any>;
34
18
  createSyncDBObject(objArr: any[], entities: any[]): Promise<any>;
@@ -50,7 +34,6 @@ declare module "@friggframework/syncs/manager" {
50
34
  confirmCreate(
51
35
  syncObj: Sync,
52
36
  createdId: string,
53
- moduleManager: any
54
37
  ): Promise<any>;
55
38
  confirmUpdate(syncObj: Sync): Promise<any>;
56
39
  }
@@ -0,0 +1,54 @@
1
+ # Usage Store
2
+
3
+ The durable, Frigg-owned store behind ADR-011 feature-usage tracking. Holds
4
+ per-integration counters that the reporting endpoint reads for cross-integration
5
+ comparison and trend series.
6
+
7
+ Populated by the telemetry usage rollup and read via `frigg.usage.*` — see
8
+ [`telemetry/README.md`](../telemetry/README.md) for the full guide, config, and
9
+ usage examples. This README covers the store internals only.
10
+
11
+ ## Fact row
12
+
13
+ `UsageCounter { integrationId, integrationType, metric, window, value, updatedAt }`,
14
+ uniquely keyed by `(integrationId, integrationType, metric, window)`. `window` is
15
+ `day:YYYY-MM-DD` or `hour:YYYY-MM-DDTHH` (UTC).
16
+
17
+ ## Isolation (ADR-010 Decision 3)
18
+
19
+ The store is deliberately isolated from user/integration-scoped data:
20
+
21
+ - **No `userId`** and **no foreign key** to `Integration` — a user-scoped query
22
+ can never return a usage row, and usage history survives integration deletion.
23
+ - **Not** in the encryption registry — dimensions are bounded and non-sensitive.
24
+
25
+ ## Repository triad
26
+
27
+ Mirrors the reporting/process pattern — an interface plus PostgreSQL, MongoDB and
28
+ DocumentDB adapters selected by `DB_TYPE`:
29
+
30
+ ```js
31
+ const { createUsageRepository } = require('@friggframework/core'); // usage-repository-factory
32
+
33
+ class UsageRepositoryInterface {
34
+ async increment({ integrationId, integrationType, metric, window, value }) {} // atomic upsert
35
+ async getTotalsByDimension({ metric, groupBy, since, bucket }) {} // comparison (one window granularity)
36
+ async getTimeSeries({ metric, integrationType, from, to, bucket }) {} // trend (aggregated across instances)
37
+ }
38
+ ```
39
+
40
+ - **`increment`** is atomic: PostgreSQL uses Prisma `upsert` with
41
+ `{ value: { increment } }`; a concurrent first-insert race (`P2002`) retries
42
+ once onto the atomic update path.
43
+ - **`getTotalsByDimension`** filters to a single window granularity (default `day`) so day and
44
+ hour rows are never double-summed. Requires a `metric`; `groupBy` is
45
+ allow-listed to `integrationType` / `metric`.
46
+ - **`getTimeSeries`** aggregates across integration instances (`groupBy(window) + sum`)
47
+ and range-filters on the window key. Requires an `integrationType`.
48
+
49
+ > **DocumentDB:** the adapter overrides increment/getTotalsByDimension/getTimeSeries with raw commands
50
+ > (`$runCommandRaw`: a `$inc` upsert via `documentdb-utils.updateOne`, and a
51
+ > cursor-drained `$aggregate` `$group/$sum`) — matching every other DocumentDB
52
+ > adapter, since Prisma's Mongo engine emits upsert/groupBy shapes DocumentDB
53
+ > rejects and cursor reads truncate at ~101 docs. Command shapes are unit-tested;
54
+ > run an end-to-end check against a real cluster before GA.
package/usage/index.js ADDED
@@ -0,0 +1,17 @@
1
+ const {
2
+ createUsageRepository,
3
+ UsageRepositoryPrisma,
4
+ UsageRepositoryDocumentDB,
5
+ } = require('./repositories/usage-repository-factory');
6
+ const {
7
+ UsageRepositoryInterface,
8
+ } = require('./repositories/usage-repository-interface');
9
+ const { computeTrackedMetrics } = require('./tracked-metrics');
10
+
11
+ module.exports = {
12
+ createUsageRepository,
13
+ computeTrackedMetrics,
14
+ UsageRepositoryInterface,
15
+ UsageRepositoryPrisma,
16
+ UsageRepositoryDocumentDB,
17
+ };