@zackbart/connecta 0.36.0 → 0.36.1

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 (58) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +1 -1
  3. package/bin/version.mjs +1 -1
  4. package/dist/http/hatch-paging.js +2 -2
  5. package/dist/http/paging.js +3 -88
  6. package/dist/http/provider.js +1 -2
  7. package/dist/http/tools.js +1 -23
  8. package/dist/program-writes.js +0 -1
  9. package/dist/providers/_shared/sensitive-fields.js +0 -16
  10. package/dist/providers/breeze/api.js +2 -2
  11. package/dist/providers/ccb/api.js +1 -1
  12. package/dist/providers/cloudflare/api.js +8 -8
  13. package/dist/providers/cloudflare/lib/config.d.ts +2 -1
  14. package/dist/providers/docs/api.js +1 -1
  15. package/dist/providers/drive/api.js +1 -1
  16. package/dist/providers/drive/lib/hatch.js +1 -1
  17. package/dist/providers/drive/tools.js +1 -1
  18. package/dist/providers/forms/api.js +1 -1
  19. package/dist/providers/forms/lib/hatch.js +1 -1
  20. package/dist/providers/forms/tools.js +1 -1
  21. package/dist/providers/github/api.js +1 -1
  22. package/dist/providers/github/lib/discovery.js +2 -2
  23. package/dist/providers/gmail/api.js +1 -1
  24. package/dist/providers/granola/api.js +155 -0
  25. package/dist/providers/granola/index.d.ts +10 -0
  26. package/dist/providers/granola/index.js +68 -0
  27. package/dist/providers/granola/openapi.generated.js +30 -0
  28. package/dist/providers/granola/safety.js +37 -0
  29. package/dist/providers/granola/skill.generated.js +5 -0
  30. package/dist/providers/granola/tools.js +2 -0
  31. package/dist/providers/overflow/api.js +26 -26
  32. package/dist/providers/planning-center/api.js +4 -4
  33. package/dist/providers/planning-center/lib/constants.d.ts +1 -1
  34. package/dist/providers/planning-center/lib/json-api.js +2 -2
  35. package/dist/providers/quickbooks/lib/query.js +1 -1
  36. package/dist/providers/quickbooks/safety.js +1 -1
  37. package/dist/providers/sheets/api.js +1 -1
  38. package/dist/providers/sheets/lib/hatch.js +2 -2
  39. package/dist/providers/sheets/lib/requests.js +1 -1
  40. package/dist/providers/slides/api.js +1 -1
  41. package/dist/providers/stripe/api.js +7 -7
  42. package/dist/providers/tithely/api.js +2 -2
  43. package/dist/providers/vercel/api.js +12 -12
  44. package/dist/providers/vercel/lib/pin.js +1 -1
  45. package/dist/routes/mcp.js +1 -1
  46. package/dist/runtime/admission.js +0 -12
  47. package/dist/storage/keys.js +2 -3
  48. package/dist/version.d.ts +1 -1
  49. package/dist/version.js +1 -1
  50. package/documentation/architecture.md +124 -74
  51. package/documentation/auth.md +9 -2
  52. package/documentation/code-mode.md +6 -6
  53. package/documentation/meta-tools.md +5 -2
  54. package/documentation/operator-tests.md +11 -2
  55. package/documentation/operator-ui.md +1 -2
  56. package/documentation/providers.md +110 -0
  57. package/package.json +6 -2
  58. package/templates/node/package.json +1 -1
@@ -190,8 +190,17 @@ OAuth provider validates the code exchange and PKCE. Credential Test calls a
190
190
  loopback downstream endpoint. Operator APIs, cookie/bearer admission, CSRF,
191
191
  assets, handoffs, callbacks, and encrypted storage use production code.
192
192
 
193
- The flows cover Clerk sign-in/reload/sign-out; OAuth connect/consent/callback/
194
- connected reread/reload; and credential save/test/replace/remove. They collect
193
+ The flows use a real SQLite file and cover Clerk sign-in/reload/sign-out,
194
+ actual Settings provenance and asset cache validators; OAuth
195
+ connect/consent/callback/connected reread/disconnect; and credential
196
+ save/test/replace/remove. They close and reopen the app, database and vault
197
+ before rereading OAuth and credential state. A rejected SQL replacement leaves
198
+ the previous secret usable downstream after restart. Trigger rows read from an
199
+ independent SQL connection require one save, one replacement and one removal;
200
+ reads and the rejected save commit no credential writes. Actual MCP calls
201
+ check that credential edits preserve a reader pool's read access and refusal. Activity renders
202
+ successful calls recorded before the SQLite restart without exposing either
203
+ credential value. They collect
195
204
  CSP violations across every document and popup, and fail on unexpected network
196
205
  traffic. No credentials enter visual fixtures or screenshot baselines.
197
206
 
@@ -644,8 +644,7 @@ and each personal connector's exact `manage`;
644
644
  The Overview's map and attention rows are pure functions of the contract in
645
645
  [connection-map.ts](https://github.com/zackbart/connecta/blob/main/src/operator-ui/connection-map.ts)
646
646
  and [overview.ts](https://github.com/zackbart/connecta/blob/main/src/operator-ui/overview.ts),
647
- covered by `test/operator-connection-map.test.ts` and
648
- `test/operator-overview.test.ts`; `src/operator-ui/styles/overview.css` holds
647
+ exercised in Chromium by `test/browser/operator-overview.spec.ts`; `src/operator-ui/styles/overview.css` holds
649
648
  the page's styles.
650
649
 
651
650
  `src/operator-ui/config-summary.ts` maps the snapshot and its provenance to
@@ -7,6 +7,95 @@ roster](./integrating.md#add-or-remove-a-connector) covers the general
7
7
  procedure and the providers not listed here. Agent guidance for each
8
8
  provider ships with its connection's usage guide, not here.
9
9
 
10
+ ## Granola
11
+
12
+ ```ts
13
+ import { granola } from "@zackbart/connecta/providers/granola";
14
+
15
+ const notes = granola("granola", { purpose: "Shared workspace meeting notes" });
16
+ ```
17
+
18
+ Use a **workspace API key**, created by a Business or Enterprise workspace
19
+ admin in Granola desktop Settings → Connectors → Workspace API keys → Create
20
+ new key. Save it in this connection's credential slot through the operator UI;
21
+ configure an encrypted vault as described in [shared credentials](./auth.md#connect-a-shared-credential).
22
+ The shared, single-secret field is `value`. The provider fixes the origin to
23
+ `https://public-api.granola.ai`, uses bearer authentication, and exposes reads
24
+ only. It accepts `purpose`, optional `title`, `instructions`, and
25
+ `maxResultBytes` and the common `readOnly` restriction. Even `readOnly: false`
26
+ exposes only the five reviewed reads; it accepts no inline secret, origin override, personal auth
27
+ scope, or option enabling writes.
28
+
29
+ Workspace keys belong to the workspace, survive their creator leaving and do
30
+ not expire; an admin can revoke them. They reach public notes and spaces with
31
+ Granola API access enabled. For an existing space an admin uses Integrations →
32
+ Granola API → Allow access with a workspace API key. Folders inherit the space
33
+ setting. Workspace ownership does not grant unrelated private notes or the
34
+ owner's private handwritten notes. Discover accessible IDs before filtering.
35
+ Only notes with a generated summary and transcript are returned; a 404 does
36
+ not prove absence. A successful credential test confirms accessible spaces,
37
+ not the key's ownership type or access to every meeting. Granola enforces
38
+ these permissions; Connecta cannot infer workspace versus personal key type
39
+ from the secret. Do not substitute a personal API key or MCP OAuth token.
40
+
41
+ The REST surface is `granola_api_search`, `granola_api_details`, and
42
+ `granola_api_read`. Search discovers API operations, not meeting content.
43
+ Reads cover `/v1/notes`, `/v1/notes/{note_id}`,
44
+ `/v1/notes/{note_id}/transcript`, `/v1/folders`, and `/v1/spaces`. Use API IDs
45
+ (`not_`, `fol_`, `spa_`), not UUIDs copied from web links. Date/folder/space
46
+ filters and response `fields` narrowing follow the reviewed operation details.
47
+ Audit, legal holds, webhook management and writes are refused, even if their
48
+ contracts appear in operation discovery.
49
+
50
+ Omit `query.cursor` on the first read. Continue with `page.nextCursor` as the
51
+ top-level `cursor`, retaining the path and query filters. Continuations are
52
+ bound to that request and are not raw Granola tokens. The vendor uses
53
+ `query.page_size`: notes/folders/spaces default to 10 with maximum 30;
54
+ transcripts default to 50 with maximum 100. Empty pages can have more data.
55
+ No total count is inferred. HTTP 413 when using `include: "transcript"`
56
+ requires a new note-detail read without include and paged transcript reads;
57
+ the provider sends no hidden fallback requests. Photo download URLs grant
58
+ unauthenticated access and are always withheld. Meeting text and sent
59
+ credentials cross the same value-safety boundary before selection or paging.
60
+
61
+ Granola documents 25 requests per 5-second burst and 5 requests/second
62
+ sustained, shared across the workspace key's scope. The default per-runtime
63
+ admission is 25 calls in a rolling 5-second window with concurrency 2. Other
64
+ processes and integrations share the vendor allowance; the local counter
65
+ cannot enforce a workspace-wide limit. A 429 returns `rate_limited` and
66
+ Retry-After when supplied (otherwise a 5-second hint); calls are not retried
67
+ automatically. Requests have a 30-second deadline and 4 MiB response ceiling.
68
+ Oversized responses fail without presenting a partial success; inline result
69
+ cuts retain the standard `truncated` paths.
70
+
71
+ For hosted Granola MCP, use a distinct generic `remoteMcp()` connection to
72
+ `https://mcp.granola.ai/mcp` with its user OAuth or enterprise-managed
73
+ authorization. Granola MCP does not accept workspace API keys or service
74
+ accounts. Its natural-language search is not a REST-provider capability.
75
+ See [Granola's workspace-key guide](https://docs.granola.ai/help-center/sharing/integrations/granola-api#workspace-api-keys)
76
+ and [API overview](https://docs.granola.ai/introduction).
77
+
78
+ ### Migrate a deployment-local Granola API adapter
79
+
80
+ Replace the local `api("granola", …)` construction with
81
+ `granola("granola", { purpose: "Shared workspace meeting notes" })`, retaining
82
+ the same encrypted vault, encryption key, connector ID, shared owner and
83
+ single-secret `value` field. The provider reuses that credential without
84
+ copying it. Existing addresses `granola.granola_api_search`,
85
+ `granola.granola_api_details`, and `granola.granola_api_read` remain stable.
86
+ Keep existing pool references to `granola`. A differently named or personal
87
+ credential field requires the operator to save a workspace key in the shared
88
+ slot; do not read out or copy stored secrets through an agent.
89
+
90
+ Compare local argument contracts before replacing the factory: the maintained
91
+ search is operation discovery, details uses an indexed operation, and read
92
+ uses a relative path and query. Replace raw `query.cursor` continuations with
93
+ the bound top-level `cursor`, and start new pagination sequences after the
94
+ upgrade. Responses use `{ status, data, page? }`. Remove local write tools or
95
+ natural-language-search assumptions; do not keep duplicate factories with the
96
+ same connector ID. If a local adapter used other tool names, update its
97
+ callers explicitly. No data migration or downstream write is required.
98
+
10
99
  ## API sources and tool inventory
11
100
 
12
101
  Maintained providers pair reviewed API contracts and indexes with Connecta's
@@ -143,6 +232,20 @@ discovery for your deployment's catalog.
143
232
 
144
233
  </details>
145
234
 
235
+ <details>
236
+ <summary>Granola (3 tools)</summary>
237
+
238
+ [Setup](#granola). **API source:** [Upstream OpenAPI](https://docs.granola.ai/api-reference/openapi.json).
239
+
240
+ - **Named reads:** None.
241
+ - **Named writes:** None.
242
+ - **API reads:** `granola_api_details`, `granola_api_read`, `granola_api_search`.
243
+ - **API writes:** None.
244
+
245
+ **Contributor evidence (optional):** [contracts, adapters and review](https://github.com/zackbart/connecta/tree/main/src/providers/granola).
246
+
247
+ </details>
248
+
146
249
  <details>
147
250
  <summary>Overflow (17 tools)</summary>
148
251
 
@@ -1318,6 +1421,13 @@ would change existing payment settings. Deletes, voids, delivery, payment
1318
1421
  execution, batch and other accounting writes remain unavailable. The API hatch
1319
1422
  refuses POSTs even when named writes are enabled.
1320
1423
 
1424
+ Sparse field preservation, a current SyncToken and requestid do not establish
1425
+ that an invoice update cannot send email. For example, changing only DueDate
1426
+ on an invoice with NeedToSend and enabled card/ACH payments retains those
1427
+ settings; omitting email fields does not disable them. Do not reset delivery or
1428
+ payment settings to work around the unavailable update, or replace the invoice
1429
+ with a new one. No unsent-only update tool is currently exposed either.
1430
+
1321
1431
  Each write requires `requestId`, a stable identifier for the exact intent,
1322
1432
  unique across all requests/tools for this company: 1–50 ASCII letters, digits,
1323
1433
  underscores or hyphens, beginning with a letter or digit. It is sent as Intuit's
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zackbart/connecta",
3
- "version": "0.36.0",
3
+ "version": "0.36.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "One MCP to rule them all — a single MCP endpoint aggregating many downstream connectors behind a code-first surface of six meta-tools.",
@@ -107,6 +107,10 @@
107
107
  "types": "./dist/providers/gmail/index.d.ts",
108
108
  "import": "./dist/providers/gmail/index.js"
109
109
  },
110
+ "./providers/granola": {
111
+ "types": "./dist/providers/granola/index.d.ts",
112
+ "import": "./dist/providers/granola/index.js"
113
+ },
110
114
  "./providers/overflow": {
111
115
  "types": "./dist/providers/overflow/index.d.ts",
112
116
  "import": "./dist/providers/overflow/index.js"
@@ -191,7 +195,7 @@
191
195
  "preeval:outcomes": "node scripts/generate-version.mjs && pnpm run build:operator-ui",
192
196
  "eval:perf": "tsx eval/run-perf.ts",
193
197
  "eval:report": "tsx eval/report.ts",
194
- "check:static": "node --test scripts/check-provider-exemptions.test.mjs && pnpm run format:check && pnpm run check:providers-generated && pnpm run check:docs && pnpm run check:changes && pnpm run check:operator-ui && pnpm run check:clerk-sdk && pnpm run check:lint && pnpm run check:unused && pnpm run typecheck",
198
+ "check:static": "pnpm run format:check && pnpm run check:providers-generated && pnpm run check:docs && pnpm run check:changes && pnpm run check:operator-ui && pnpm run check:clerk-sdk && pnpm run check:lint && pnpm run check:unused && pnpm run typecheck",
195
199
  "check:build": "pnpm run build && pnpm run check:declarations && pnpm run check:bundle",
196
200
  "check:fast": "pnpm run check:static && vitest run --config vitest.config.node.ts --changed origin/main --passWithNoTests",
197
201
  "check": "pnpm run check:static && pnpm run test && pnpm run check:build",
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@clerk/backend": "^3.12.0",
21
- "@zackbart/connecta": "0.36.0",
21
+ "@zackbart/connecta": "0.36.1",
22
22
  "quickjs-emscripten": "0.32.0",
23
23
  "undici": "6.29.1"
24
24
  },