@friggframework/core 2.0.0--canary.696.5d9f1be.0 → 2.0.0--canary.698.b1a2d30.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 (30) hide show
  1. package/integrations/data-defined/README.md +31 -1
  2. package/integrations/data-defined/capabilities/AUDIT.md +451 -0
  3. package/integrations/data-defined/capabilities/asana.capabilities.json +22 -13
  4. package/integrations/data-defined/capabilities/fathom.capabilities.json +16 -6
  5. package/integrations/data-defined/capabilities/hubspot.capabilities.json +78 -27
  6. package/integrations/data-defined/capabilities/linear.capabilities.json +30 -10
  7. package/integrations/data-defined/capabilities/phone.capabilities.json +24 -7
  8. package/integrations/data-defined/capabilities/pipedrive.capabilities.json +26 -11
  9. package/integrations/data-defined/capabilities/salesforce.capabilities.json +64 -18
  10. package/integrations/data-defined/capabilities/slack.capabilities.json +12 -5
  11. package/integrations/data-defined/capabilities/stripe.capabilities.json +28 -10
  12. package/integrations/data-defined/data-defined-integration.js +2 -2
  13. package/integrations/data-defined/examples/asana-slack.definition.json +4 -5
  14. package/integrations/data-defined/examples/hubspot-slack.definition.json +4 -4
  15. package/integrations/data-defined/examples/klaviyo-hubspot.definition.json +1 -4
  16. package/integrations/data-defined/examples/phone-hubspot.definition.json +1 -5
  17. package/integrations/data-defined/expressions.js +2 -0
  18. package/integrations/data-defined/index.js +6 -0
  19. package/integrations/data-defined/manifests.js +18 -0
  20. package/integrations/data-defined/renderers/common.js +67 -0
  21. package/integrations/data-defined/renderers/html.js +129 -0
  22. package/integrations/data-defined/renderers/hubspot.js +54 -0
  23. package/integrations/data-defined/renderers/preview.js +154 -0
  24. package/integrations/data-defined/renderers/slack.js +146 -0
  25. package/integrations/data-defined/runtime.js +17 -2
  26. package/integrations/data-defined/schema/capability-manifest.v0.1.schema.json +40 -0
  27. package/integrations/data-defined/scripts/check-manifests.js +220 -0
  28. package/integrations/data-defined/tests/helpers-fake-crm.js +11 -6
  29. package/integrations/data-defined/validate.js +6 -0
  30. package/package.json +5 -5
@@ -19,7 +19,8 @@ installation (Integration.config) ─┘ │
19
19
  | `schema/capability-manifest.v0.1.schema.json` | What an API module declares it can do |
20
20
  | `schema/installation.v0.1.schema.json` | `Integration.config` for a data-defined installation |
21
21
  | `schema/records.md` | Database records: definition versions, installation, mappings, workflow runs |
22
- | `capabilities/*.capabilities.json` | Mock manifests (HubSpot, Phone, and the apps the examples use) |
22
+ | `capabilities/*.capabilities.json` | Capability manifests. Nine are checked against the real Api classes (`capabilities/AUDIT.md`); the other twelve are still mock-shaped |
23
+ | `scripts/check-manifests.js` | Checks every manifest `method` exists on the real module's Api class, with the arguments it takes |
23
24
  | `examples/*.definition.json` | Example definitions; `examples/records/` has Phone ↔ HubSpot database records |
24
25
  | `expressions.js` | `$.ref`, `{{template \| filter}}` and conditions. No eval. |
25
26
  | `steps.js`, `interpreter.js`, `transforms.js` | The step catalogue and the interpreter |
@@ -144,6 +145,29 @@ different document at the same version is refused. So is a version that is not n
144
145
  semver bump smaller than the changes. Publishing goes through a conditional write, so two concurrent publishes of one
145
146
  version cannot both win. With `memoryDefinitions()` (definitions bundled in the app) the admin routes answer 501.
146
147
 
148
+ ## Previews: in the app
149
+
150
+ An integration shows up inside the apps it connects: a HubSpot card, a Slack message, digest or approval request. A
151
+ preview renders exactly that from the current settings and sample or real records, with the same query, view and step
152
+ code production runs (`renderers/`):
153
+
154
+ | Function | Does |
155
+ |---|---|
156
+ | `previewSurface({ def, installation, surfaceId, record, ports, host? })` | `{ surface, view, html, slack?, hubspot? }`. `slack` is Block Kit (`{ blocks, text, truncated }`), `hubspot` a data description of `@hubspot/ui-extensions` components, `html` the same card framed as its host looks. `host` defaults to the surface's own |
157
+ | `previewWorkflow({ def, installation, workflowId, event?, record?, manifests, fixtures? })` | Dry run: `{ status, sends, calls, trace, waiting? }`. Each call is `{ stepId, module, capability, kind, args, output, rendered }`; `rendered` is `{ html, slack? }` for writes (a Slack post renders as the message, anything else as a "would call" card) |
158
+ | `recordingPorts({ def, manifests, fixtures })` | Ports that record and answer instead of calling an API; give them to `previewSurface` for sample data |
159
+ | `viewToSlack`, `viewToHubSpot`, `viewToHtml`, `slackMessageToHtml` | The renderers on their own. `decodeAction(value)` reads a Slack button click back to `{ integrationId?, workflow, surface }` |
160
+
161
+ Dry-run rules: nothing is performed (the base ports' API function throws, and the recorder sits in front of it).
162
+ `fixtures` answers calls, keyed `"<module key>.<capability>"` (a value, or `(args) => value`; `code:<ref>` for code
163
+ steps, which are never run), otherwise the manifest's own record shape with ids filled. A webhook workflow with no
164
+ `event` runs on the manifest's sample payload. A pausing step ends the preview with `waiting`.
165
+
166
+ Everything that is record data is escaped for its target (mrkdwn `& < >` plus fenced `* _ ~`, HTML, text children for
167
+ HubSpot), links are http(s) only, Block Kit limits are met by truncating with a marker (50 blocks, 3000/2000/150
168
+ characters, 25 buttons), and nothing throws on an odd tree. Text a *definition* writes into a Slack message (templates)
169
+ is sent as authored: a preview shows it as sent, including any raw record data a template interpolates.
170
+
147
171
  ## Syncs
148
172
 
149
173
  `sync-engine.js` runs `syncs`: backfill (a button or `onInstall`, one queued page per message, progress at
@@ -235,6 +259,12 @@ Exit codes: `0` valid, `1` invalid (or a warning with `--strict`), `2` could not
235
259
  unknown option, `ajv` not installed). Manifests are checked first and an invalid manifest fails the run, because a
236
260
  definition is only as trustworthy as the manifests it is checked against.
237
261
 
262
+ A manifest is only as real as its methods. `scripts/check-manifests.js <modules-dir>...` loads each module's Api class
263
+ (no network, nothing instantiated) and checks that every capability's `method` exists and is called the way it takes its
264
+ arguments (`args`: positional inputs, `"$rest"`, or a `{ "value" }` constant; no `args` means one object of all inputs).
265
+ A capability the real Api lacks is marked `"status": "unimplemented"` with a `note`: a definition that uses it validates
266
+ with a warning, not an error. `capabilities/AUDIT.md` has the table.
267
+
238
268
  `ajv` comes from the monorepo root (`@friggframework/schemas` depends on it); core's runtime stays dependency-free and
239
269
  loads it only for validation. `tests/schemas.test.js` runs both layers over every example and manifest and drives the
240
270
  CLI as a child process; it fails, rather than skips, if `ajv` is missing. Core's `npm test`, and so CI's
@@ -0,0 +1,451 @@
1
+ # Capability manifests against the real API modules
2
+
3
+ Audit of every `*.capabilities.json` in this directory against the Api class it names (ADR-063 phase 4). The manifests
4
+ began as bundled mocks; for each module whose source could be found, every `method` was checked to exist on the real
5
+ Api class and every call shape was read against the method's real signature.
6
+
7
+ Re-run it (no network, nothing instantiated):
8
+
9
+ ```bash
10
+ node packages/core/integrations/data-defined/scripts/check-manifests.js --stub-missing \
11
+ ~/phone-app/backend/src/api-modules ~/phone-app/backend/node_modules/@friggframework \
12
+ ~/api-module-library/packages/v1-ready ~/api-module-library/packages/needs-updating
13
+ ```
14
+
15
+ (`--stub-missing` stands in for dependencies that are not installed here, such as jsforce, stripe and @linear/sdk, so
16
+ the Api's methods can be read. Roots are searched in order and the first module that loads wins.)
17
+
18
+ ## How to read this
19
+
20
+ - **ok**: the method exists on the Api class and the call is shaped as the method takes it.
21
+ - **unimplemented**: the real Api has no method that does this (or none that can be called as the capability is
22
+ shaped). The manifest carries `"status": "unimplemented"` and a `note`; a definition that uses the capability
23
+ validates with a **warning**, never an error. The capability name is unchanged so existing definitions keep validating.
24
+ - **unverified**: no source for the module was available; its manifest is unchanged from the mock.
25
+ - **Call shape**. A capability with no `args` is called `api.method(input)` with one object holding every input.
26
+ Nearly every real method takes positional arguments instead (`getContactById(id)`, `updateContact(id, properties)`),
27
+ so the manifest now carries `args`: an ordered list of input names, `"$rest"` (the inputs not named elsewhere, as
28
+ one object) or `{ "value": x }` (a constant, e.g. the sObject name of Salesforce's generic `get(object, id)`).
29
+ `runtime.js` `argumentsFor` spreads them. An input that is declared but never passed is refused by the manifest check,
30
+ because it would be accepted and silently dropped.
31
+ - **Webhook verification.** Every manifest names `verifyWebhookSignature`. No real module has it (only clio, which has no
32
+ manifest). Each real module's `webhook` block is marked `"status": "unimplemented"`, and a workflow that triggers on
33
+ its events validates with a warning: every delivery would fail signature verification.
34
+
35
+ ## Summary
36
+
37
+ | Module | Source checked | Capabilities | Renamed method | Call shape fixed | Inputs changed | Unimplemented upstream |
38
+ |---|---|---|---|---|---|---|
39
+ | asana | ~/api-module-library/packages/v1-ready/asana | 6 | 3 | 1 | 2 | 3 |
40
+ | calendly | none found | 6 | - | - | - | - |
41
+ | docusign | none found | 5 | - | - | - | - |
42
+ | fathom | ~/api-module-library/packages/v1-ready/fathom | 5 | 2 | 2 | 0 | 1 |
43
+ | github | none found | 6 | - | - | - | - |
44
+ | hubspot | ~/api-module-library/packages/v1-ready/hubspot | 23 | 0 | 5 | 1 | 17 |
45
+ | jira | none found | 12 | - | - | - | - |
46
+ | klaviyo | none found | 14 | - | - | - | - |
47
+ | linear | ~/api-module-library/packages/v1-ready/linear | 9 | 0 | 0 | 0 | 9 |
48
+ | netsuite | none found | 15 | - | - | - | - |
49
+ | notion | none found | 6 | - | - | - | - |
50
+ | pipedrive | ~/phone-app/backend/node_modules/@friggframework/api-module-pipedrive | 11 | 4 | 3 | 1 | 2 |
51
+ | quickbooks | none found | 14 | - | - | - | - |
52
+ | phone | ~/phone-app/backend/src/api-modules/phone | 13 | 1 | 4 | 0 | 1 |
53
+ | salesforce | ~/api-module-library/packages/v1-ready/salesforce | 12 | 5 | 5 | 0 | 7 |
54
+ | shopify | none found | 15 | - | - | - | - |
55
+ | slack | ~/api-module-library/packages/needs-updating/slack | 7 | 2 | 1 | 0 | 1 |
56
+ | stripe | ~/api-module-library/packages/v1-ready/stripe | 9 | 1 | 0 | 0 | 8 |
57
+ | acmeerp | none found | 13 | - | - | - | - |
58
+ | webflow | none found | 5 | - | - | - | - |
59
+ | zendesk | none found | 8 | - | - | - | - |
60
+
61
+ Modules with no source to check against: calendly, docusign, github, jira, klaviyo, netsuite, notion, quickbooks, shopify, acmeerp, webflow, zendesk. Their capabilities are still mock-shaped:
62
+ nothing in them is known to exist.
63
+
64
+ Where a module has two candidates the first root given wins. Phone is checked against the deployed
65
+ `phone-app/backend/src/api-modules/phone` (the app's own module: `createUnifiedWebhook`, `updateContact`). The library's `v1-ready/phone` 1.0.0 lacks `updateContact` and has `createCallWebhook` and friends
66
+ instead of one webhook method. Pipedrive is checked against the built `@friggframework/api-module-pipedrive`
67
+ 2.1.0-next.7 (the library copy is TypeScript source with no `dist`).
68
+
69
+ Manifest versions in the files (for example HubSpot 1.4.0, Asana 1.5.1) are ahead of the module sources audited (HubSpot
70
+ 1.1.7, Asana 1.1.5): the manifests describe modules that were never released as written.
71
+
72
+ ## Asana (`asana`)
73
+
74
+ Checked against `~/api-module-library/packages/v1-ready/asana` (@friggframework/api-module-asana manifest 1.5.1).
75
+
76
+ | Capability | Method | Status | Real signature | Note |
77
+ |---|---|---|---|---|
78
+ | `task.get` | `getTaskById` | ok | `getTaskById(id)` | Api.getTaskById(id) takes only the id; field selection (opt_fields) is not supported. (method was `getTask`; called with one object; now positional; inputs were taskGid, opt_fields) |
79
+ | `task.search` | `searchTasksInWorkspace` | unimplemented | none | Api.listTasks({ workspaceId, assigneeId }) filters by workspace and assignee only; due_on, completed, projects_any and limit have no equivalent. |
80
+ | `project.list` | `listProjects` | ok | `listProjects(params)` | (method was `getProjects`; inputs were workspaceGid, archived) |
81
+ | `workspace.list` | `listWorkspaces` | ok | `listWorkspaces()` | (method was `getWorkspaces`) |
82
+ | `webhook.create` | `createWebhook` | unimplemented | none | Api has no webhook methods. |
83
+ | `webhook.delete` | `deleteWebhook` | unimplemented | none | Api has no webhook methods. |
84
+ | `webhook.verify` | `verifyWebhookSignature` | unimplemented | | The asana Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one. |
85
+
86
+ ## Calendly (`calendly`)
87
+
88
+ **No module source available** (No directory named calendly or api-module-calendly). Nothing here is verified; the manifest is still a mock.
89
+
90
+ | Capability | Method | Status | Real signature | Note |
91
+ |---|---|---|---|---|
92
+ | `invitee.get` | `getInvitee` | unverified | | |
93
+ | `event.get` | `getScheduledEvent` | unverified | | |
94
+ | `event.list` | `listScheduledEvents` | unverified | | |
95
+ | `eventType.list` | `listEventTypes` | unverified | | |
96
+ | `webhook.create` | `createWebhookSubscription` | unverified | | |
97
+ | `webhook.delete` | `deleteWebhookSubscription` | unverified | | |
98
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
99
+
100
+ ## DocuSign eSignature (`docusign`)
101
+
102
+ **No module source available** (No directory named docusign or api-module-docusign). Nothing here is verified; the manifest is still a mock.
103
+
104
+ | Capability | Method | Status | Real signature | Note |
105
+ |---|---|---|---|---|
106
+ | `envelope.get` | `getEnvelope` | unverified | | |
107
+ | `envelope.list` | `listStatusChanges` | unverified | | |
108
+ | `document.combined` | `getCombinedDocument` | unverified | | |
109
+ | `connect.create` | `createConnectConfiguration` | unverified | | |
110
+ | `connect.delete` | `deleteConnectConfiguration` | unverified | | |
111
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
112
+
113
+ ## Fathom (`fathom`)
114
+
115
+ Checked against `~/api-module-library/packages/v1-ready/fathom` (@friggframework/api-module-fathom manifest 0.4.0).
116
+
117
+ | Capability | Method | Status | Real signature | Note |
118
+ |---|---|---|---|---|
119
+ | `meeting.list` | `listMeetings` | ok | `listMeetings(params = {})` | |
120
+ | `meeting.summary` | `getSummary` | ok | `getSummary(recordingId, params = {})` | (method was `getRecordingSummary`; called with one object; now positional) |
121
+ | `meeting.transcript` | `getTranscript` | ok | `getTranscript(recordingId, params = {})` | (method was `getRecordingTranscript`; called with one object; now positional) |
122
+ | `webhook.create` | `createWebhook` | ok | `createWebhook(data)` | |
123
+ | `webhook.delete` | `deleteWebhook` | unimplemented | none | Api has createWebhook but no deleteWebhook. |
124
+ | `webhook.verify` | `verifyWebhookSignature` | unimplemented | | The fathom Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one. |
125
+
126
+ ## GitHub (`github`)
127
+
128
+ **No module source available** (No directory named github or api-module-github). Nothing here is verified; the manifest is still a mock.
129
+
130
+ | Capability | Method | Status | Real signature | Note |
131
+ |---|---|---|---|---|
132
+ | `issue.get` | `getIssue` | unverified | | |
133
+ | `issue.list` | `listIssuesForRepo` | unverified | | |
134
+ | `issue.create` | `createIssue` | unverified | | |
135
+ | `issue.update` | `updateIssue` | unverified | | |
136
+ | `issue.comment` | `createIssueComment` | unverified | | |
137
+ | `repo.list` | `listInstallationRepos` | unverified | | |
138
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
139
+
140
+ ## HubSpot (`hubspot`)
141
+
142
+ Checked against `~/api-module-library/packages/v1-ready/hubspot` (@friggframework/api-module-hubspot manifest 1.4.0).
143
+
144
+ | Capability | Method | Status | Real signature | Note |
145
+ |---|---|---|---|---|
146
+ | `contact.get` | `getContactById` | ok | `getContactById(contactId)` | Api.getContactById(id) always requests the portal's full property list; a properties argument is not supported. (called with one object; now positional; inputs were id, properties) |
147
+ | `contact.search` | `searchContacts` | unimplemented | none | Api has no contact search (searchCompanies, searchDeals, searchCustomObjects and searchLists only). |
148
+ | `contact.list` | `listContacts` | ok | `listContacts(params)` | Api.listContacts({ after, limit, properties }) has no modified-since filter, so updatedSince is ignored and a poll re-lists every contact. |
149
+ | `contact.create` | `createContact` | ok | `createContact(body)` | (called with one object; now positional) |
150
+ | `contact.update` | `updateContact` | ok | `updateContact(contactId, properties)` | (called with one object; now positional) |
151
+ | `deal.get` | `getDealById` | ok | `getDealById(dealId)` | (called with one object; now positional) |
152
+ | `deal.listForContact` | `listDealsForContact` | unimplemented | none | Api has no per-contact deal listing; associations come from getBatchAssociations(from, to, inputs). |
153
+ | `deal.contacts` | `listContactsForDeal` | unimplemented | none | Api has no per-deal contact listing; associations come from getBatchAssociations(from, to, inputs). |
154
+ | `task.create` | `createTask` | unimplemented | none | Api has no engagement or task methods. |
155
+ | `call.create` | `createCallEngagement` | unimplemented | none | Api has no engagement or task methods. |
156
+ | `note.create` | `createNote` | unimplemented | none | Api has no engagement or task methods. |
157
+ | `owner.list` | `listOwners` | unimplemented | none | Api has getOwnerById only. |
158
+ | `pipeline.stages` | `listDealStages` | unimplemented | none | Api.getPipelineDetails(objType) returns every pipeline for an object type, not the stages of one pipeline. |
159
+ | `contact.upsertByEmail` | `upsertContactByEmail` | unimplemented | none | Api has no upsert and no contact search to build one from. |
160
+ | `deal.update` | `updateDeal` | unimplemented (a method of that name exists, unusable as the capability is shaped) | `updateDeal(params)` | Api.updateDeal({ dealId, properties }) reads this.URLs.getDealById, which is not defined (the table has dealById), so it throws before sending. Fixed in api-module-library (claude/shared-conversation-8hgmbr, 5961c9a); stays unimplemented here until a release carries it. |
161
+ | `deal.search` | `searchDeals` | unimplemented (a method of that name exists, unusable as the capability is shaped) | `searchDeals(params)` | Api.searchDeals takes HubSpot filterGroups, sorts, props, limit and after, not open/closeDate/amount filters. |
162
+ | `task.get` | `getTaskById` | unimplemented | none | Api has no engagement or task methods. |
163
+ | `task.update` | `updateTask` | unimplemented | none | Api has no engagement or task methods. |
164
+ | `task.search` | `searchTasks` | unimplemented | none | Api has no engagement or task methods. |
165
+ | `owner.get` | `getOwnerById` | ok | `getOwnerById(ownerId)` | (called with one object; now positional) |
166
+ | `owner.findByEmail` | `getOwnerByEmail` | unimplemented | none | Api has getOwnerById only. |
167
+ | `subscription.definitions` | `listSubscriptionDefinitions` | unimplemented | none | Api has no email subscription methods. |
168
+ | `subscription.unsubscribe` | `unsubscribeEmail` | unimplemented | none | Api has no email subscription methods. |
169
+ | `webhook.verify` | `verifyWebhookSignature` | unimplemented | | The hubspot Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one. |
170
+
171
+ ## Jira Cloud (`jira`)
172
+
173
+ **No module source available** (No directory named jira or api-module-jira). Nothing here is verified; the manifest is still a mock.
174
+
175
+ | Capability | Method | Status | Real signature | Note |
176
+ |---|---|---|---|---|
177
+ | `issue.create` | `createIssue` | unverified | | |
178
+ | `issue.get` | `getIssue` | unverified | | |
179
+ | `issue.update` | `editIssue` | unverified | | |
180
+ | `issue.addComment` | `addComment` | unverified | | |
181
+ | `issue.transition` | `transitionIssue` | unverified | | |
182
+ | `issue.search` | `searchJql` | unverified | | |
183
+ | `remoteLink.create` | `createRemoteLink` | unverified | | |
184
+ | `project.list` | `listProjects` | unverified | | |
185
+ | `issueType.list` | `listIssueTypes` | unverified | | |
186
+ | `webhook.register` | `registerDynamicWebhooks` | unverified | | |
187
+ | `webhook.refresh` | `refreshWebhooks` | unverified | | |
188
+ | `webhook.delete` | `deleteWebhooks` | unverified | | |
189
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
190
+
191
+ ## Klaviyo (`klaviyo`)
192
+
193
+ **No module source available** (No directory named klaviyo or api-module-klaviyo). Nothing here is verified; the manifest is still a mock.
194
+
195
+ | Capability | Method | Status | Real signature | Note |
196
+ |---|---|---|---|---|
197
+ | `profile.get` | `getProfile` | unverified | | |
198
+ | `profile.search` | `getProfiles` | unverified | | |
199
+ | `profile.list` | `listProfiles` | unverified | | |
200
+ | `profile.create` | `createProfile` | unverified | | |
201
+ | `profile.update` | `updateProfile` | unverified | | |
202
+ | `profile.upsert` | `createOrUpdateProfile` | unverified | | |
203
+ | `profile.lists` | `getProfileLists` | unverified | | |
204
+ | `profile.subscribe` | `subscribeProfiles` | unverified | | |
205
+ | `profile.unsubscribe` | `unsubscribeProfiles` | unverified | | |
206
+ | `list.list` | `getLists` | unverified | | |
207
+ | `list.addProfiles` | `addProfilesToList` | unverified | | |
208
+ | `event.create` | `createEvent` | unverified | | |
209
+ | `webhook.create` | `createWebhook` | unverified | | |
210
+ | `webhook.delete` | `deleteWebhook` | unverified | | |
211
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
212
+
213
+ ## Linear (`linear`)
214
+
215
+ Checked against `~/api-module-library/packages/v1-ready/linear` (@friggframework/api-module-linear manifest 1.1.0).
216
+
217
+ | Capability | Method | Status | Real signature | Note |
218
+ |---|---|---|---|---|
219
+ | `issue.get` | `issue` | unimplemented | none | Api exposes getClient() (a @linear/sdk LinearClient) plus getUsers, getProjects and getUserIssues; issues, comments, attachments, teams and workflow states are reached through the SDK client, not Api methods. |
220
+ | `issue.byIdentifier` | `issueByIdentifier` | unimplemented | none | Api exposes getClient() (a @linear/sdk LinearClient) plus getUsers, getProjects and getUserIssues; issues, comments, attachments, teams and workflow states are reached through the SDK client, not Api methods. |
221
+ | `issue.search` | `searchIssues` | unimplemented | none | Api exposes getClient() (a @linear/sdk LinearClient) plus getUsers, getProjects and getUserIssues; issues, comments, attachments, teams and workflow states are reached through the SDK client, not Api methods. |
222
+ | `issue.create` | `issueCreate` | unimplemented | none | Api exposes getClient() (a @linear/sdk LinearClient) plus getUsers, getProjects and getUserIssues; issues, comments, attachments, teams and workflow states are reached through the SDK client, not Api methods. |
223
+ | `issue.update` | `issueUpdate` | unimplemented | none | Api exposes getClient() (a @linear/sdk LinearClient) plus getUsers, getProjects and getUserIssues; issues, comments, attachments, teams and workflow states are reached through the SDK client, not Api methods. |
224
+ | `comment.create` | `commentCreate` | unimplemented | none | Api exposes getClient() (a @linear/sdk LinearClient) plus getUsers, getProjects and getUserIssues; issues, comments, attachments, teams and workflow states are reached through the SDK client, not Api methods. |
225
+ | `attachment.link` | `attachmentLinkURL` | unimplemented | none | Api exposes getClient() (a @linear/sdk LinearClient) plus getUsers, getProjects and getUserIssues; issues, comments, attachments, teams and workflow states are reached through the SDK client, not Api methods. |
226
+ | `team.list` | `teams` | unimplemented | none | Api exposes getClient() (a @linear/sdk LinearClient) plus getUsers, getProjects and getUserIssues; issues, comments, attachments, teams and workflow states are reached through the SDK client, not Api methods. |
227
+ | `workflowState.list` | `workflowStates` | unimplemented | none | Api exposes getClient() (a @linear/sdk LinearClient) plus getUsers, getProjects and getUserIssues; issues, comments, attachments, teams and workflow states are reached through the SDK client, not Api methods. |
228
+ | `webhook.verify` | `verifyWebhookSignature` | unimplemented | | The linear Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one. |
229
+
230
+ ## NetSuite (`netsuite`)
231
+
232
+ **No module source available** (No directory named netsuite or api-module-netsuite). Nothing here is verified; the manifest is still a mock.
233
+
234
+ | Capability | Method | Status | Real signature | Note |
235
+ |---|---|---|---|---|
236
+ | `customer.get` | `getCustomer` | unverified | | |
237
+ | `customer.search` | `searchCustomers` | unverified | | |
238
+ | `customer.list` | `listCustomers` | unverified | | |
239
+ | `customer.create` | `createCustomer` | unverified | | |
240
+ | `customer.update` | `updateCustomer` | unverified | | |
241
+ | `salesOrder.create` | `createSalesOrder` | unverified | | |
242
+ | `salesOrder.get` | `getSalesOrder` | unverified | | |
243
+ | `salesOrder.update` | `updateSalesOrder` | unverified | | |
244
+ | `salesOrder.search` | `searchSalesOrders` | unverified | | |
245
+ | `creditMemo.create` | `createCreditMemo` | unverified | | |
246
+ | `itemFulfillment.get` | `getItemFulfillment` | unverified | | |
247
+ | `itemFulfillment.list` | `listItemFulfillments` | unverified | | |
248
+ | `item.search` | `searchItems` | unverified | | |
249
+ | `subsidiary.list` | `listSubsidiaries` | unverified | | |
250
+ | `location.list` | `listLocations` | unverified | | |
251
+
252
+ ## Notion (`notion`)
253
+
254
+ **No module source available** (No directory named notion or api-module-notion). Nothing here is verified; the manifest is still a mock.
255
+
256
+ | Capability | Method | Status | Real signature | Note |
257
+ |---|---|---|---|---|
258
+ | `page.create` | `createPage` | unverified | | |
259
+ | `page.get` | `retrievePage` | unverified | | |
260
+ | `page.update` | `updatePage` | unverified | | |
261
+ | `block.append` | `appendBlockChildren` | unverified | | |
262
+ | `database.query` | `queryDatabase` | unverified | | |
263
+ | `database.list` | `searchDatabases` | unverified | | |
264
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
265
+
266
+ ## Pipedrive (`pipedrive`)
267
+
268
+ Checked against `~/phone-app/backend/node_modules/@friggframework/api-module-pipedrive` (@friggframework/api-module-pipedrive manifest 2.1.0).
269
+
270
+ | Capability | Method | Status | Real signature | Note |
271
+ |---|---|---|---|---|
272
+ | `person.get` | `getPerson` | ok | `getPerson(personId, params)` | (called with one object; now positional) |
273
+ | `person.search` | `searchPersons` | ok | `searchPersons(params)` | |
274
+ | `person.list` | `listPersons` | ok | `listPersons(params)` | |
275
+ | `person.create` | `addPerson` | unimplemented | none | Api has no addPerson (persons can be listed, fetched and searched only). |
276
+ | `person.update` | `updatePerson` | unimplemented | none | Api has no updatePerson. |
277
+ | `activity.create` | `createActivity` | ok | `createActivity(params)` | (method was `addActivity`; called with one object; now positional) |
278
+ | `activity.list` | `listActivities` | ok | `listActivities(params)` | |
279
+ | `deal.listForPerson` | `listDeals` | ok | `listDeals(params)` | (method was `listPersonDeals`; inputs were personId, status) |
280
+ | `user.list` | `listUsers` | ok | `listUsers()` | (method was `getUsers`) |
281
+ | `webhook.create` | `createWebhook` | ok | `createWebhook(params)` | (method was `addWebhook`) |
282
+ | `webhook.delete` | `deleteWebhook` | ok | `deleteWebhook(webhookId)` | (called with one object; now positional) |
283
+ | `webhook.verify` | `verifyWebhookSignature` | unimplemented | | The pipedrive Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one. |
284
+
285
+ ## QuickBooks Online (`quickbooks`)
286
+
287
+ **No module source available** (No directory named quickbooks or api-module-quickbooks). Nothing here is verified; the manifest is still a mock.
288
+
289
+ | Capability | Method | Status | Real signature | Note |
290
+ |---|---|---|---|---|
291
+ | `customer.get` | `getCustomer` | unverified | | |
292
+ | `customer.query` | `queryCustomers` | unverified | | |
293
+ | `customer.list` | `listCustomers` | unverified | | |
294
+ | `customer.create` | `createCustomer` | unverified | | |
295
+ | `customer.update` | `updateCustomer` | unverified | | |
296
+ | `salesReceipt.create` | `createSalesReceipt` | unverified | | |
297
+ | `refundReceipt.create` | `createRefundReceipt` | unverified | | |
298
+ | `invoice.create` | `createInvoice` | unverified | | |
299
+ | `invoice.get` | `getInvoice` | unverified | | |
300
+ | `invoice.send` | `sendInvoice` | unverified | | |
301
+ | `payment.get` | `getPayment` | unverified | | |
302
+ | `deposit.create` | `createDeposit` | unverified | | |
303
+ | `item.list` | `listItems` | unverified | | |
304
+ | `account.list` | `listAccounts` | unverified | | |
305
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
306
+
307
+ ## Phone (`phone`)
308
+
309
+ Checked against `~/phone-app/backend/src/api-modules/phone` (@acme/api-module-phone manifest 2.1.0).
310
+
311
+ | Capability | Method | Status | Real signature | Note |
312
+ |---|---|---|---|---|
313
+ | `contact.get` | `getContact` | ok | `getContact(id)` | (called with one object; now positional) |
314
+ | `contact.search` | `searchContacts` | unimplemented | none | Api has no contact search; listContacts filters by externalIds and sources only. |
315
+ | `contact.list` | `listContacts` | ok | `listContacts(params = {})` | |
316
+ | `contact.create` | `createContact` | ok | `createContact(data)` | |
317
+ | `contact.update` | `updateContact` | ok | `updateContact(id, data)` | (called with one object; now positional) |
318
+ | `call.list` | `listCalls` | ok | `listCalls(params = {})` | |
319
+ | `call.recording` | `getCallRecordings` | ok | `getCallRecordings(callId)` | (called with one object; now positional) |
320
+ | `message.send` | `sendMessage` | ok | `sendMessage(data)` | |
321
+ | `message.list` | `listMessages` | ok | `listMessages(params = {})` | |
322
+ | `phoneNumber.list` | `listPhoneNumbers` | ok | `listPhoneNumbers(params = {})` | |
323
+ | `user.list` | `listUsers` | ok | `listUsers(params = {})` | |
324
+ | `webhook.create` | `createUnifiedWebhook` | ok | `createUnifiedWebhook(data)` | (method was `createWebhook`) |
325
+ | `webhook.delete` | `deleteWebhook` | ok | `deleteWebhook(id)` | (called with one object; now positional) |
326
+ | `webhook.verify` | `verifyWebhookSignature` | unimplemented | | The phone Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one. |
327
+
328
+ ## Salesforce (`salesforce`)
329
+
330
+ Checked against `~/api-module-library/packages/v1-ready/salesforce` (@friggframework/api-module-salesforce manifest 3.0.2).
331
+
332
+ | Capability | Method | Status | Real signature | Note |
333
+ |---|---|---|---|---|
334
+ | `lead.get` | `get` | ok | `get(object, id)` | (method was `getLead`; called with one object; now positional) |
335
+ | `lead.create` | `create` | ok | `create(object, data)` | (method was `createLead`; called with one object; now positional) |
336
+ | `lead.update` | `updateLead` | unimplemented | none | Api.update(object, data) needs the record id inside data (data.Id); the capability passes the id separately, so there is no way to call it. |
337
+ | `person.searchByEmail` | `searchPeopleByEmail` | unimplemented | none | Api.find(object, filter) searches one sObject at a time; searching Lead and Contact together would need two calls. |
338
+ | `event.create` | `create` | ok | `create(object, data)` | (method was `createEvent`; called with one object; now positional) |
339
+ | `event.update` | `updateEvent` | unimplemented | none | Api.update(object, data) needs the record id inside data (data.Id); the capability passes the id separately, so there is no way to call it. |
340
+ | `opportunity.get` | `get` | ok | `get(object, id)` | (method was `getOpportunity`; called with one object; now positional) |
341
+ | `opportunity.update` | `updateOpportunity` | unimplemented | none | Api.update(object, data) needs the record id inside data (data.Id); the capability passes the id separately, so there is no way to call it. |
342
+ | `task.create` | `create` | ok | `create(object, data)` | (method was `createTask`; called with one object; now positional) |
343
+ | `file.attach` | `createContentVersion` | unimplemented | none | Api has the generic create(object, data) only; ContentVersion field names differ from this capability's inputs. |
344
+ | `note.create` | `createContentNote` | unimplemented | none | Api has the generic create(object, data) only; ContentNote field names differ from this capability's inputs. |
345
+ | `user.list` | `listUsers` | unimplemented | none | Api has find(object, filter) but no user listing with an activeOnly filter. |
346
+ | `webhook.verify` | `verifyWebhookSignature` | unimplemented | | The salesforce Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one. |
347
+
348
+ ## Shopify (`shopify`)
349
+
350
+ **No module source available** (No directory named shopify or api-module-shopify). Nothing here is verified; the manifest is still a mock.
351
+
352
+ | Capability | Method | Status | Real signature | Note |
353
+ |---|---|---|---|---|
354
+ | `order.get` | `getOrder` | unverified | | |
355
+ | `order.list` | `listOrders` | unverified | | |
356
+ | `order.update` | `updateOrder` | unverified | | |
357
+ | `order.fulfillmentOrders` | `listFulfillmentOrders` | unverified | | |
358
+ | `fulfillment.create` | `createFulfillment` | unverified | | |
359
+ | `customer.get` | `getCustomer` | unverified | | |
360
+ | `customer.list` | `listCustomers` | unverified | | |
361
+ | `customer.search` | `searchCustomers` | unverified | | |
362
+ | `customer.create` | `createCustomer` | unverified | | |
363
+ | `customer.update` | `updateCustomer` | unverified | | |
364
+ | `checkout.list` | `listAbandonedCheckouts` | unverified | | |
365
+ | `variant.byInventoryItem` | `getVariantByInventoryItemId` | unverified | | |
366
+ | `location.list` | `listLocations` | unverified | | |
367
+ | `webhook.create` | `createWebhook` | unverified | | |
368
+ | `webhook.delete` | `deleteWebhook` | unverified | | |
369
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
370
+
371
+ ## Slack (`slack`)
372
+
373
+ Checked against `~/api-module-library/packages/needs-updating/slack` (@friggframework/api-module-slack manifest 2.0.0).
374
+
375
+ | Capability | Method | Status | Real signature | Note |
376
+ |---|---|---|---|---|
377
+ | `message.post` | `postMessage` | ok | `postMessage(body)` | |
378
+ | `message.update` | `updateMessage` | ok | `updateMessage(body)` | |
379
+ | `message.postEphemeral` | `postEphemeral` | ok | `postEphemeral(body)` | |
380
+ | `message.permalink` | `getMessagePermalink` | ok | `getMessagePermalink(query)` | (method was `getPermalink`) |
381
+ | `channel.list` | `listChannels` | ok | `listChannels(query)` | (method was `listConversations`) |
382
+ | `user.list` | `listUsers` | unimplemented | none | Api has lookupUserByEmail, getUserById and getUserProfileById, but no user listing. |
383
+ | `user.lookupByEmail` | `lookupUserByEmail` | ok | `lookupUserByEmail(email)` | (called with one object; now positional) |
384
+ | `webhook.verify` | `verifyWebhookSignature` | unimplemented | | The slack Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one. |
385
+
386
+ ## Stripe (`stripe`)
387
+
388
+ Checked against `~/api-module-library/packages/v1-ready/stripe` (@friggframework/api-module-stripe manifest 2.3.0).
389
+
390
+ | Capability | Method | Status | Real signature | Note |
391
+ |---|---|---|---|---|
392
+ | `customer.get` | `retrieveCustomer` | unimplemented | none | Api wraps balance transactions, charges, accounts and webhook endpoints only; customers, payment intents, refunds and payouts are not exposed. |
393
+ | `customer.list` | `listCustomers` | unimplemented | none | Api wraps balance transactions, charges, accounts and webhook endpoints only; customers, payment intents, refunds and payouts are not exposed. |
394
+ | `customer.search` | `searchCustomers` | unimplemented | none | Api wraps balance transactions, charges, accounts and webhook endpoints only; customers, payment intents, refunds and payouts are not exposed. |
395
+ | `customer.create` | `createCustomer` | unimplemented | none | Api wraps balance transactions, charges, accounts and webhook endpoints only; customers, payment intents, refunds and payouts are not exposed. |
396
+ | `customer.update` | `updateCustomer` | unimplemented | none | Api wraps balance transactions, charges, accounts and webhook endpoints only; customers, payment intents, refunds and payouts are not exposed. |
397
+ | `paymentIntent.get` | `retrievePaymentIntent` | unimplemented | none | Api wraps balance transactions, charges, accounts and webhook endpoints only; customers, payment intents, refunds and payouts are not exposed. |
398
+ | `refund.get` | `retrieveRefund` | unimplemented | none | Api wraps balance transactions, charges, accounts and webhook endpoints only; customers, payment intents, refunds and payouts are not exposed. |
399
+ | `payout.list` | `listPayouts` | unimplemented | none | Api wraps balance transactions, charges, accounts and webhook endpoints only; customers, payment intents, refunds and payouts are not exposed. |
400
+ | `balanceTransaction.list` | `getBalanceTransactions` | ok | `getBalanceTransactions(params)` | (method was `listBalanceTransactions`) |
401
+ | `webhook.verify` | `verifyWebhookSignature` | unimplemented | | The stripe Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one. |
402
+
403
+ ## Acme ERP (`acmeerp`)
404
+
405
+ **No module source available** (No directory named acmeerp or api-module-acmeerp). Nothing here is verified; the manifest is still a mock.
406
+
407
+ | Capability | Method | Status | Real signature | Note |
408
+ |---|---|---|---|---|
409
+ | `customer.get` | `getCustomer` | unverified | | |
410
+ | `customer.list` | `listCustomers` | unverified | | |
411
+ | `customer.create` | `createCustomer` | unverified | | |
412
+ | `customer.update` | `updateCustomer` | unverified | | |
413
+ | `job.get` | `getJob` | unverified | | |
414
+ | `job.search` | `searchJobs` | unverified | | |
415
+ | `job.lineItems` | `listJobLineItems` | unverified | | |
416
+ | `job.update` | `updateJob` | unverified | | |
417
+ | `job.markPaid` | `recordJobPayment` | unverified | | |
418
+ | `job.addNote` | `createJobNote` | unverified | | |
419
+ | `technician.list` | `listTechnicians` | unverified | | |
420
+ | `webhook.create` | `createWebhookSubscription` | unverified | | |
421
+ | `webhook.delete` | `deleteWebhookSubscription` | unverified | | |
422
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
423
+
424
+ ## Webflow (`webflow`)
425
+
426
+ **No module source available** (No directory named webflow or api-module-webflow). Nothing here is verified; the manifest is still a mock.
427
+
428
+ | Capability | Method | Status | Real signature | Note |
429
+ |---|---|---|---|---|
430
+ | `site.list` | `listSites` | unverified | | |
431
+ | `form.list` | `listForms` | unverified | | |
432
+ | `form.submissions` | `listFormSubmissions` | unverified | | |
433
+ | `webhook.create` | `createWebhook` | unverified | | |
434
+ | `webhook.delete` | `deleteWebhook` | unverified | | |
435
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
436
+
437
+ ## Zendesk Support (`zendesk`)
438
+
439
+ **No module source available** (No directory named zendesk or api-module-zendesk). Nothing here is verified; the manifest is still a mock.
440
+
441
+ | Capability | Method | Status | Real signature | Note |
442
+ |---|---|---|---|---|
443
+ | `ticket.get` | `showTicket` | unverified | | |
444
+ | `ticket.update` | `updateTicket` | unverified | | |
445
+ | `ticket.addComment` | `addTicketComment` | unverified | | |
446
+ | `ticket.search` | `searchTickets` | unverified | | |
447
+ | `user.get` | `showUser` | unverified | | |
448
+ | `group.list` | `listGroups` | unverified | | |
449
+ | `webhook.create` | `createWebhook` | unverified | | |
450
+ | `webhook.delete` | `deleteWebhook` | unverified | | |
451
+ | `webhook.verify` | `verifyWebhookSignature` | unverified | | |
@@ -151,22 +151,25 @@
151
151
  "headers": {
152
152
  "X-Hook-Secret": "$.headers.x-hook-secret"
153
153
  }
154
- }
154
+ },
155
+ "status": "unimplemented",
156
+ "note": "The asana Api has no verifyWebhookSignature method; webhook signatures cannot be checked until the module adds one."
155
157
  },
156
158
  "capabilities": {
157
159
  "task.get": {
158
160
  "kind": "read",
159
- "method": "getTask",
161
+ "method": "getTaskById",
160
162
  "input": {
161
163
  "taskGid": {
162
164
  "type": "string",
163
165
  "required": true
164
- },
165
- "opt_fields": {
166
- "type": "string"
167
166
  }
168
167
  },
169
- "output": "task"
168
+ "output": "task",
169
+ "args": [
170
+ "taskGid"
171
+ ],
172
+ "note": "Api.getTaskById(id) takes only the id; field selection (opt_fields) is not supported."
170
173
  },
171
174
  "task.search": {
172
175
  "kind": "search",
@@ -192,13 +195,15 @@
192
195
  "type": "number"
193
196
  }
194
197
  },
195
- "output": "task[]"
198
+ "output": "task[]",
199
+ "status": "unimplemented",
200
+ "note": "Api.listTasks({ workspaceId, assigneeId }) filters by workspace and assignee only; due_on, completed, projects_any and limit have no equivalent."
196
201
  },
197
202
  "project.list": {
198
203
  "kind": "read",
199
- "method": "getProjects",
204
+ "method": "listProjects",
200
205
  "input": {
201
- "workspaceGid": {
206
+ "workspace": {
202
207
  "type": "string",
203
208
  "required": true
204
209
  },
@@ -210,7 +215,7 @@
210
215
  },
211
216
  "workspace.list": {
212
217
  "kind": "read",
213
- "method": "getWorkspaces",
218
+ "method": "listWorkspaces",
214
219
  "input": {},
215
220
  "output": "workspace[]"
216
221
  },
@@ -230,7 +235,9 @@
230
235
  "type": "array"
231
236
  }
232
237
  },
233
- "output": "webhook"
238
+ "output": "webhook",
239
+ "status": "unimplemented",
240
+ "note": "Api has no webhook methods."
234
241
  },
235
242
  "webhook.delete": {
236
243
  "kind": "delete",
@@ -241,7 +248,9 @@
241
248
  "required": true
242
249
  }
243
250
  },
244
- "output": "void"
251
+ "output": "void",
252
+ "status": "unimplemented",
253
+ "note": "Api has no webhook methods."
245
254
  }
246
255
  },
247
256
  "options": {
@@ -255,7 +264,7 @@
255
264
  "label": "{{item.name}}",
256
265
  "value": "$.item.gid",
257
266
  "inputs": {
258
- "workspaceGid": {
267
+ "workspace": {
259
268
  "type": "string",
260
269
  "required": true
261
270
  }