@friggframework/core 2.0.0--canary.689.e2b05a4.0 → 2.0.0--canary.703.6a9383b.0

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 (139) hide show
  1. package/CLAUDE.md +0 -40
  2. package/application/commands/integration-commands.js +0 -63
  3. package/database/documentdb-utils.js +2 -0
  4. package/generated/prisma-mongodb/edge.js +52 -4
  5. package/generated/prisma-mongodb/index-browser.js +49 -1
  6. package/generated/prisma-mongodb/index.d.ts +3504 -58
  7. package/generated/prisma-mongodb/index.js +52 -4
  8. package/generated/prisma-mongodb/package.json +1 -1
  9. package/generated/prisma-mongodb/schema.prisma +65 -0
  10. package/generated/prisma-mongodb/wasm.js +52 -4
  11. package/generated/prisma-postgresql/edge.js +52 -4
  12. package/generated/prisma-postgresql/index-browser.js +49 -1
  13. package/generated/prisma-postgresql/index.d.ts +3872 -142
  14. package/generated/prisma-postgresql/index.js +52 -4
  15. package/generated/prisma-postgresql/package.json +1 -1
  16. package/generated/prisma-postgresql/schema.prisma +63 -0
  17. package/generated/prisma-postgresql/wasm.js +52 -4
  18. package/handlers/app-handler-helpers.js +5 -2
  19. package/handlers/integration-event-dispatcher.js +7 -3
  20. package/handlers/routers/integration-webhook-routers.js +26 -38
  21. package/handlers/workers/integration-triggers.js +25 -0
  22. package/index.js +11 -0
  23. package/infrastructure/scheduler/recurrence.js +204 -0
  24. package/integrations/define/DESIGN.md +108 -0
  25. package/integrations/define/config.js +98 -0
  26. package/integrations/define/define-app.js +52 -0
  27. package/integrations/define/define-extension.js +154 -0
  28. package/integrations/define/define-integration.js +292 -0
  29. package/integrations/define/examples/deal-alerts.js +138 -0
  30. package/integrations/define/extension-binding.js +174 -0
  31. package/integrations/define/index.js +11 -0
  32. package/integrations/define/json-schema-lite.js +68 -0
  33. package/integrations/define/subscriptions.js +93 -0
  34. package/integrations/define/tests/fixtures/hubspot.js +109 -0
  35. package/integrations/define/tests/fixtures/slack.js +26 -0
  36. package/integrations/define/use.js +39 -0
  37. package/integrations/definitions/README.md +278 -0
  38. package/integrations/definitions/canonical.js +11 -0
  39. package/integrations/definitions/capabilities/AUDIT.md +480 -0
  40. package/integrations/definitions/capabilities/acmeerp.capabilities.json +633 -0
  41. package/integrations/definitions/capabilities/asana.capabilities.json +279 -0
  42. package/integrations/definitions/capabilities/calendly.capabilities.json +385 -0
  43. package/integrations/definitions/capabilities/docusign.capabilities.json +314 -0
  44. package/integrations/definitions/capabilities/fathom.capabilities.json +238 -0
  45. package/integrations/definitions/capabilities/github.capabilities.json +585 -0
  46. package/integrations/definitions/capabilities/hubspot.capabilities.json +822 -0
  47. package/integrations/definitions/capabilities/jira.capabilities.json +391 -0
  48. package/integrations/definitions/capabilities/klaviyo.capabilities.json +503 -0
  49. package/integrations/definitions/capabilities/linear.capabilities.json +378 -0
  50. package/integrations/definitions/capabilities/netsuite.capabilities.json +535 -0
  51. package/integrations/definitions/capabilities/notion.capabilities.json +208 -0
  52. package/integrations/definitions/capabilities/phone.capabilities.json +511 -0
  53. package/integrations/definitions/capabilities/pipedrive.capabilities.json +430 -0
  54. package/integrations/definitions/capabilities/quickbooks.capabilities.json +635 -0
  55. package/integrations/definitions/capabilities/salesforce.capabilities.json +568 -0
  56. package/integrations/definitions/capabilities/shopify.capabilities.json +1128 -0
  57. package/integrations/definitions/capabilities/slack.capabilities.json +373 -0
  58. package/integrations/definitions/capabilities/stripe.capabilities.json +630 -0
  59. package/integrations/definitions/capabilities/webflow.capabilities.json +196 -0
  60. package/integrations/definitions/capabilities/zendesk.capabilities.json +422 -0
  61. package/integrations/definitions/compile.js +80 -0
  62. package/integrations/definitions/config-form.js +137 -0
  63. package/integrations/definitions/examples/acme-erp-quickbooks.definition.json +467 -0
  64. package/integrations/definitions/examples/asana-slack.definition.json +219 -0
  65. package/integrations/definitions/examples/calendly-salesforce.definition.json +459 -0
  66. package/integrations/definitions/examples/docusign-salesforce.definition.json +305 -0
  67. package/integrations/definitions/examples/fathom-hubspot-notion.definition.json +575 -0
  68. package/integrations/definitions/examples/github-linear.definition.json +322 -0
  69. package/integrations/definitions/examples/hubspot-slack.definition.json +427 -0
  70. package/integrations/definitions/examples/klaviyo-hubspot.definition.json +336 -0
  71. package/integrations/definitions/examples/phone-hubspot.definition.json +633 -0
  72. package/integrations/definitions/examples/pipedrive-hubspot.definition.json +136 -0
  73. package/integrations/definitions/examples/pipedrive-phone.definition.json +340 -0
  74. package/integrations/definitions/examples/records/phone-hubspot.definition-version.json +652 -0
  75. package/integrations/definitions/examples/records/phone-hubspot.integration.json +86 -0
  76. package/integrations/definitions/examples/records/phone-hubspot.mappings.json +39 -0
  77. package/integrations/definitions/examples/records/phone-hubspot.workflow-run.json +62 -0
  78. package/integrations/definitions/examples/shopify-klaviyo.definition.json +488 -0
  79. package/integrations/definitions/examples/shopify-netsuite.definition.json +622 -0
  80. package/integrations/definitions/examples/stripe-quickbooks.definition.json +476 -0
  81. package/integrations/definitions/examples/webflow-hubspot-slack.definition.json +262 -0
  82. package/integrations/definitions/examples/zendesk-jira.definition.json +604 -0
  83. package/integrations/definitions/expressions.js +229 -0
  84. package/integrations/definitions/index.js +48 -0
  85. package/integrations/definitions/integration-runtime.js +779 -0
  86. package/integrations/definitions/interpreter.js +104 -0
  87. package/integrations/definitions/manifests.js +177 -0
  88. package/integrations/definitions/renderers/common.js +67 -0
  89. package/integrations/definitions/renderers/html.js +129 -0
  90. package/integrations/definitions/renderers/hubspot.js +59 -0
  91. package/integrations/definitions/renderers/preview.js +154 -0
  92. package/integrations/definitions/renderers/slack.js +146 -0
  93. package/integrations/definitions/repositories/definition-version-repository.js +67 -0
  94. package/integrations/definitions/repositories/workflow-run-repository.js +80 -0
  95. package/integrations/definitions/router.js +170 -0
  96. package/integrations/definitions/runtime.js +268 -0
  97. package/integrations/definitions/schema/capability-manifest.v0.1.schema.json +549 -0
  98. package/integrations/definitions/schema/installation.v0.1.schema.json +130 -0
  99. package/integrations/definitions/schema/integration-definition.v0.1.schema.json +909 -0
  100. package/integrations/definitions/schema/records.md +105 -0
  101. package/integrations/definitions/schema-check.js +58 -0
  102. package/integrations/definitions/scripts/check-manifests.js +220 -0
  103. package/integrations/definitions/scripts/validate.js +66 -0
  104. package/integrations/definitions/steps.js +123 -0
  105. package/integrations/definitions/sync-engine.js +297 -0
  106. package/integrations/definitions/tests/helpers-fake-crm.js +49 -0
  107. package/integrations/definitions/transforms.js +91 -0
  108. package/integrations/definitions/use-cases/definition-use-cases.js +245 -0
  109. package/integrations/definitions/validate.js +436 -0
  110. package/integrations/definitions/versioning.js +176 -0
  111. package/integrations/definitions/webhooks.js +119 -0
  112. package/integrations/index.js +12 -0
  113. package/integrations/integration-base.js +134 -2
  114. package/integrations/integration-router.js +6 -1
  115. package/integrations/integration-types.js +73 -0
  116. package/integrations/repositories/integration-repository-documentdb.js +6 -34
  117. package/integrations/repositories/integration-repository-interface.js +3 -30
  118. package/integrations/repositories/integration-repository-mongo.js +19 -56
  119. package/integrations/repositories/integration-repository-postgres.js +5 -59
  120. package/integrations/triggers.js +244 -0
  121. package/integrations/use-cases/create-integration.js +33 -61
  122. package/integrations/use-cases/delete-integration-for-user.js +4 -4
  123. package/integrations/use-cases/get-integration-for-user.js +4 -2
  124. package/integrations/use-cases/get-integration-instance.js +4 -4
  125. package/integrations/use-cases/get-integrations-for-user.js +4 -4
  126. package/integrations/use-cases/get-possible-integrations.js +7 -2
  127. package/integrations/use-cases/run-trigger-tick.js +155 -0
  128. package/integrations/use-cases/run-trigger.js +77 -0
  129. package/integrations/use-cases/update-integration.js +4 -4
  130. package/package.json +7 -5
  131. package/prisma-mongodb/schema.prisma +65 -0
  132. package/prisma-postgresql/migrations/20261018000000_add_data_defined_integrations/migration.sql +66 -0
  133. package/prisma-postgresql/migrations/20261019000000_workflow_run_waits/migration.sql +7 -0
  134. package/prisma-postgresql/migrations/20261019120000_definition_workspace/migration.sql +5 -0
  135. package/prisma-postgresql/schema.prisma +63 -0
  136. package/queues/queuer-util.js +9 -2
  137. package/integrations/use-cases/add-entities-to-integration.js +0 -92
  138. package/integrations/use-cases/remove-entities-from-integration.js +0 -70
  139. package/integrations/utils/assert-entity-ids-input.js +0 -42
package/CLAUDE.md CHANGED
@@ -206,51 +206,11 @@ packages/core/
206
206
  - `delete-integration-for-user.js` - Remove integration
207
207
  - `get-integration-instance.js` - Load integration with modules
208
208
  - `load-integration-context.js` - Full integration context loading
209
- - `add-entities-to-integration.js` / `remove-entities-from-integration.js` - Attach or detach entities on an existing integration
210
209
 
211
210
  **Repositories**:
212
211
  - `integration-repository-factory.js` - Creates database-specific repositories
213
212
  - `integration-repository-mongo.js` - MongoDB implementation
214
213
  - `integration-repository-postgres.js` - PostgreSQL implementation
215
- - `addEntitiesToIntegration(integrationId, entityIds)` /
216
- `removeEntitiesFromIntegration(integrationId, entityIds)` change the entity
217
- set of an existing integration (all three adapters; `null` for an unknown
218
- integration). Reach them through the `addEntitiesToIntegration` /
219
- `removeEntitiesFromIntegration` commands. The add use case
220
- (`add-entities-to-integration.js`) rejects unknown entities
221
- (`ENTITIES_NOT_FOUND`, 404), entities of another user
222
- (`ENTITY_USER_MISMATCH`, 403) and entities of a module the integration does
223
- not already hold (`ENTITY_MODULE_MISMATCH`, 400). The remove use case
224
- (`remove-entities-from-integration.js`) refuses to leave a module with no
225
- entity (`LAST_ENTITY_OF_MODULE`, 409). Re-adding an attached entity or
226
- removing a detached one changes nothing; a detached entity is not deleted.
227
- `integration-repository-entities-parity.test.js` runs every adapter against
228
- real databases when `INTEGRATION_ENTITIES_PARITY_MONGO_URL` /
229
- `INTEGRATION_ENTITIES_PARITY_POSTGRES_URL` are set. The DocumentDB adapter
230
- writes only `Integration.entityIds` (as its `createIntegration` does), not
231
- `Entity.integrationIds`.
232
- **One credential, many accounts**: when one credential covers several
233
- provider accounts, give each account its own entity (externalId = account
234
- id) and attach them all to one integration; webhooks then route with
235
- `findIntegrationByEntityExternalId`. Traps:
236
- (1) `IntegrationBase` keys modules by module name, so `this.<moduleKey>`
237
- holds only one entity's module, and on the queue/webhook path
238
- (`get-integration-instance.js`) `this.entities` holds entity **ids**, not
239
- records. For per-account work (a webhook for one account, teardown of every
240
- account in `onDelete`), load
241
- `this.commands.loadIntegrationContextById(this.id)` and use
242
- `context.modules`: one module per entity, each with its record on
243
- `module.entity` (pick by `module.entity.externalId`).
244
- (2) `findIntegrationByEntityExternalId` counts every entity with that
245
- externalId, attached or not, across users: reuse an existing entity
246
- (`findEntity`) when an account comes back, or delete it when it is revoked,
247
- never create a second one.
248
- (3) `createIntegration` reuses an existing integration of the same user
249
- and type whose entities include all requested ones (an exact match wins),
250
- so a reconnect that sends the original entities finds the integration that
251
- now holds more.
252
- (4) Every module's delegate is the integration: an auth failure on any
253
- account marks the shared credential invalid and the integration ERROR.
254
214
  - `integration-mapping-repository-*.js` - Mapping data persistence.
255
215
  `queryMappings(integrationId, { where, orderBy, skip, take, omit })`
256
216
  returns `{ mappings, total }`: one filtered, ordered page of an
@@ -29,12 +29,6 @@ const {
29
29
  const {
30
30
  PatchIntegrationConfig,
31
31
  } = require('../../integrations/use-cases/patch-integration-config');
32
- const {
33
- AddEntitiesToIntegration,
34
- } = require('../../integrations/use-cases/add-entities-to-integration');
35
- const {
36
- RemoveEntitiesFromIntegration,
37
- } = require('../../integrations/use-cases/remove-entities-from-integration');
38
32
  const {
39
33
  getModulesDefinitionFromIntegrationClasses,
40
34
  } = require('../../integrations/utils/map-integration-dto');
@@ -46,11 +40,6 @@ const ERROR_CODE_MAP = {
46
40
  EXTERNAL_ID_REQUIRED: 400,
47
41
  TYPE_REQUIRED: 400,
48
42
  INTEGRATION_RECORD_NOT_FOUND: 404,
49
- INVALID_INTEGRATION_DATA: 400,
50
- ENTITIES_NOT_FOUND: 404,
51
- ENTITY_USER_MISMATCH: 403,
52
- ENTITY_MODULE_MISMATCH: 400,
53
- LAST_ENTITY_OF_MODULE: 409,
54
43
  };
55
44
 
56
45
  function mapErrorToResponse(error) {
@@ -174,17 +163,6 @@ function createIntegrationCommands({ integrationClass } = {}) {
174
163
  integrationRepository,
175
164
  });
176
165
 
177
- const addEntitiesToIntegrationUseCase = new AddEntitiesToIntegration({
178
- integrationRepository,
179
- moduleRepository,
180
- });
181
-
182
- const removeEntitiesFromIntegrationUseCase =
183
- new RemoveEntitiesFromIntegration({
184
- integrationRepository,
185
- moduleRepository,
186
- });
187
-
188
166
  return {
189
167
  findIntegrationById,
190
168
  listIntegrations,
@@ -329,47 +307,6 @@ function createIntegrationCommands({ integrationClass } = {}) {
329
307
  }
330
308
  },
331
309
 
332
- /**
333
- * Attach entities to an existing integration. Every entity must
334
- * exist, belong to the integration's user, and be of a module the
335
- * integration already holds; entities that are already attached are
336
- * left as they are.
337
- * @param {Object} params
338
- * @param {string} params.integrationId - Integration ID
339
- * @param {Array<string>} params.entityIds - Entity IDs to attach
340
- * @returns {Promise<Object>} Updated integration
341
- */
342
- async addEntitiesToIntegration({ integrationId, entityIds }) {
343
- try {
344
- return await addEntitiesToIntegrationUseCase.execute(
345
- integrationId,
346
- entityIds
347
- );
348
- } catch (error) {
349
- return mapErrorToResponse(error);
350
- }
351
- },
352
-
353
- /**
354
- * Detach entities from an integration. Entities that are not
355
- * attached are ignored; detached entities are not deleted. Each
356
- * module must keep at least one entity.
357
- * @param {Object} params
358
- * @param {string} params.integrationId - Integration ID
359
- * @param {Array<string>} params.entityIds - Entity IDs to detach
360
- * @returns {Promise<Object>} Updated integration
361
- */
362
- async removeEntitiesFromIntegration({ integrationId, entityIds }) {
363
- try {
364
- return await removeEntitiesFromIntegrationUseCase.execute(
365
- integrationId,
366
- entityIds
367
- );
368
- } catch (error) {
369
- return mapErrorToResponse(error);
370
- }
371
- },
372
-
373
310
  /**
374
311
  * Delete an integration by ID
375
312
  * @param {string} integrationId - Integration ID to delete
@@ -25,6 +25,8 @@ async function findMany(client, collection, filter = {}, options = {}) {
25
25
  if (options.projection) command.projection = options.projection;
26
26
  if (options.sort) command.sort = options.sort;
27
27
  if (options.limit) command.limit = options.limit;
28
+ // The first batch holds 101 documents unless asked for more; a page wants all of its rows.
29
+ if (options.batchSize) command.batchSize = options.batchSize;
28
30
  const result = await client.$runCommandRaw(command);
29
31
  return result?.cursor?.firstBatch || [];
30
32
  }