patchwork-os 0.2.0-beta.6.canary.22 → 0.2.0-beta.6.canary.23

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.
@@ -0,0 +1,396 @@
1
+ /**
2
+ * Airtable connector — record access via the Airtable REST API v0.
3
+ *
4
+ * Auth: Personal Access Token (PAT) — `Authorization: Bearer <pat>`. PATs
5
+ * start with `pat...`.
6
+ * - Env var: AIRTABLE_ACCESS_TOKEN
7
+ * - Stored: getSecretJsonSync("airtable") → AirtableTokens
8
+ *
9
+ * Tools: listBases, getBaseSchema, listRecords, getRecord, createRecord,
10
+ * updateRecord. Write ops (create/update) are intentionally exposed — the
11
+ * point of the integration is round-trip record manipulation.
12
+ *
13
+ * Extends BaseConnector for unified auth, retry, rate-limit, error handling.
14
+ */
15
+ import { BaseConnector, } from "./baseConnector.js";
16
+ import { deleteSecretJsonSync, getSecretJsonSync, storeSecretJsonSync, } from "./tokenStorage.js";
17
+ const BASE_URL = "https://api.airtable.com";
18
+ const MAX_RECORDS_HARD_CAP = 1000;
19
+ export class AirtableConnector extends BaseConnector {
20
+ providerName = "airtable";
21
+ tokens = null;
22
+ getOAuthConfig() {
23
+ return null;
24
+ }
25
+ async authenticate() {
26
+ const tokens = loadTokens();
27
+ if (!tokens) {
28
+ throw new Error("Airtable not connected. Run: patchwork-os connect airtable or set AIRTABLE_ACCESS_TOKEN");
29
+ }
30
+ this.tokens = tokens;
31
+ return {
32
+ token: tokens.accessToken,
33
+ scopes: ["read", "write"],
34
+ };
35
+ }
36
+ async healthCheck() {
37
+ try {
38
+ const result = await this.apiCall(async () => {
39
+ const res = await fetch(`${BASE_URL}/v0/meta/whoami`, {
40
+ headers: this.buildHeaders(),
41
+ });
42
+ if (!res.ok)
43
+ throw res;
44
+ return res.json();
45
+ });
46
+ if ("error" in result)
47
+ return { ok: false, error: result.error };
48
+ return { ok: true };
49
+ }
50
+ catch (err) {
51
+ return { ok: false, error: this.normalizeError(err) };
52
+ }
53
+ }
54
+ normalizeError(error) {
55
+ if (error instanceof Response) {
56
+ const s = error.status;
57
+ if (s === 401)
58
+ return {
59
+ code: "auth_expired",
60
+ message: "Airtable authentication expired — reconnect",
61
+ retryable: false,
62
+ suggestedAction: "patchwork-os connect airtable",
63
+ };
64
+ if (s === 403)
65
+ return {
66
+ code: "permission_denied",
67
+ message: "Insufficient Airtable permissions for this base/table",
68
+ retryable: false,
69
+ };
70
+ if (s === 404)
71
+ return {
72
+ code: "not_found",
73
+ message: "Airtable resource not found",
74
+ retryable: false,
75
+ };
76
+ if (s === 422)
77
+ return {
78
+ code: "provider_error",
79
+ message: "Airtable validation error (invalid fields or formula)",
80
+ retryable: false,
81
+ };
82
+ if (s === 429)
83
+ return {
84
+ code: "rate_limited",
85
+ message: "Airtable API rate limit exceeded",
86
+ retryable: true,
87
+ suggestedAction: "Wait and retry",
88
+ };
89
+ return {
90
+ code: "provider_error",
91
+ message: `Airtable API error: HTTP ${s}`,
92
+ retryable: s >= 500,
93
+ };
94
+ }
95
+ if (error instanceof Error) {
96
+ if (error.message.includes("ENOTFOUND") ||
97
+ error.message.includes("ECONNREFUSED")) {
98
+ return {
99
+ code: "network_error",
100
+ message: `Cannot connect to Airtable: ${error.message}`,
101
+ retryable: true,
102
+ };
103
+ }
104
+ }
105
+ return {
106
+ code: "provider_error",
107
+ message: error instanceof Error ? error.message : String(error),
108
+ retryable: false,
109
+ };
110
+ }
111
+ getStatus() {
112
+ const tokens = loadTokens();
113
+ return {
114
+ id: "airtable",
115
+ status: tokens ? "connected" : "disconnected",
116
+ lastSync: tokens?.connected_at,
117
+ workspace: tokens?.email
118
+ ? `Airtable (${tokens.email})`
119
+ : tokens?.userId
120
+ ? `Airtable user ${tokens.userId}`
121
+ : undefined,
122
+ };
123
+ }
124
+ // ── API Methods ────────────────────────────────────────────────────────────
125
+ async listBases() {
126
+ const result = await this.apiCall(async () => {
127
+ const res = await fetch(`${BASE_URL}/v0/meta/bases`, {
128
+ headers: this.buildHeaders(),
129
+ });
130
+ if (!res.ok)
131
+ throw res;
132
+ return res.json();
133
+ });
134
+ if ("error" in result)
135
+ throw new Error(result.error.message);
136
+ return result.data;
137
+ }
138
+ async getBaseSchema(baseId) {
139
+ const result = await this.apiCall(async () => {
140
+ const res = await fetch(`${BASE_URL}/v0/meta/bases/${encodeURIComponent(baseId)}/tables`, { headers: this.buildHeaders() });
141
+ if (!res.ok)
142
+ throw res;
143
+ return res.json();
144
+ });
145
+ if ("error" in result)
146
+ throw new Error(result.error.message);
147
+ return result.data;
148
+ }
149
+ async listRecords(baseId, tableIdOrName, params = {}) {
150
+ const result = await this.apiCall(async () => {
151
+ const qs = new URLSearchParams();
152
+ if (params.filterByFormula)
153
+ qs.set("filterByFormula", params.filterByFormula);
154
+ if (params.view)
155
+ qs.set("view", params.view);
156
+ if (params.pageSize)
157
+ qs.set("pageSize", String(params.pageSize));
158
+ // Cap maxRecords at Airtable's 1000 hard limit. Default 100.
159
+ const maxRecords = Math.min(params.maxRecords ?? 100, MAX_RECORDS_HARD_CAP);
160
+ qs.set("maxRecords", String(maxRecords));
161
+ if (params.sort) {
162
+ params.sort.forEach((s, i) => {
163
+ qs.set(`sort[${i}][field]`, s.field);
164
+ if (s.direction)
165
+ qs.set(`sort[${i}][direction]`, s.direction);
166
+ });
167
+ }
168
+ if (params.fields) {
169
+ for (const f of params.fields)
170
+ qs.append("fields[]", f);
171
+ }
172
+ const url = `${BASE_URL}/v0/${encodeURIComponent(baseId)}/${encodeURIComponent(tableIdOrName)}?${qs}`;
173
+ const res = await fetch(url, { headers: this.buildHeaders() });
174
+ if (!res.ok)
175
+ throw res;
176
+ return res.json();
177
+ });
178
+ if ("error" in result)
179
+ throw new Error(result.error.message);
180
+ return result.data;
181
+ }
182
+ async getRecord(baseId, tableIdOrName, recordId) {
183
+ const result = await this.apiCall(async () => {
184
+ const url = `${BASE_URL}/v0/${encodeURIComponent(baseId)}/${encodeURIComponent(tableIdOrName)}/${encodeURIComponent(recordId)}`;
185
+ const res = await fetch(url, { headers: this.buildHeaders() });
186
+ if (!res.ok)
187
+ throw res;
188
+ return res.json();
189
+ });
190
+ if ("error" in result)
191
+ throw new Error(result.error.message);
192
+ return result.data;
193
+ }
194
+ async createRecord(baseId, tableIdOrName, fields) {
195
+ const result = await this.apiCall(async () => {
196
+ const url = `${BASE_URL}/v0/${encodeURIComponent(baseId)}/${encodeURIComponent(tableIdOrName)}`;
197
+ const res = await fetch(url, {
198
+ method: "POST",
199
+ headers: {
200
+ ...this.buildHeaders(),
201
+ "Content-Type": "application/json",
202
+ },
203
+ body: JSON.stringify({ records: [{ fields }] }),
204
+ });
205
+ if (!res.ok)
206
+ throw res;
207
+ const json = (await res.json());
208
+ const first = json.records?.[0];
209
+ if (!first)
210
+ throw new Error("Airtable returned no record in response");
211
+ return first;
212
+ });
213
+ if ("error" in result)
214
+ throw new Error(result.error.message);
215
+ return result.data;
216
+ }
217
+ async updateRecord(baseId, tableIdOrName, recordId, fields) {
218
+ const result = await this.apiCall(async () => {
219
+ const url = `${BASE_URL}/v0/${encodeURIComponent(baseId)}/${encodeURIComponent(tableIdOrName)}/${encodeURIComponent(recordId)}`;
220
+ const res = await fetch(url, {
221
+ method: "PATCH",
222
+ headers: {
223
+ ...this.buildHeaders(),
224
+ "Content-Type": "application/json",
225
+ },
226
+ body: JSON.stringify({ fields }),
227
+ });
228
+ if (!res.ok)
229
+ throw res;
230
+ return res.json();
231
+ });
232
+ if ("error" in result)
233
+ throw new Error(result.error.message);
234
+ return result.data;
235
+ }
236
+ // ── Helpers ────────────────────────────────────────────────────────────────
237
+ buildHeaders() {
238
+ const token = this.tokens?.accessToken ?? loadTokens()?.accessToken ?? "";
239
+ return {
240
+ Authorization: `Bearer ${token}`,
241
+ Accept: "application/json",
242
+ };
243
+ }
244
+ }
245
+ // ── Token persistence ────────────────────────────────────────────────────────
246
+ export function loadTokens() {
247
+ const envKey = process.env.AIRTABLE_ACCESS_TOKEN;
248
+ if (envKey) {
249
+ return {
250
+ accessToken: envKey,
251
+ connected_at: new Date().toISOString(),
252
+ };
253
+ }
254
+ return getSecretJsonSync("airtable");
255
+ }
256
+ export function saveTokens(tokens) {
257
+ storeSecretJsonSync("airtable", tokens);
258
+ }
259
+ export function clearTokens() {
260
+ try {
261
+ deleteSecretJsonSync("airtable");
262
+ }
263
+ catch {
264
+ // ignore
265
+ }
266
+ }
267
+ // ── Singleton instance ───────────────────────────────────────────────────────
268
+ let _instance = null;
269
+ function resetAirtableConnector() {
270
+ _instance = null;
271
+ }
272
+ export function getAirtableConnector() {
273
+ if (!_instance) {
274
+ _instance = new AirtableConnector();
275
+ }
276
+ return _instance;
277
+ }
278
+ export { getAirtableConnector as airtable };
279
+ /**
280
+ * POST /connections/airtable/connect { accessToken }
281
+ */
282
+ export async function handleAirtableConnect(body) {
283
+ let accessToken;
284
+ try {
285
+ const parsed = JSON.parse(body);
286
+ if (typeof parsed.accessToken !== "string" || !parsed.accessToken) {
287
+ return {
288
+ status: 400,
289
+ contentType: "application/json",
290
+ body: JSON.stringify({ ok: false, error: "accessToken is required" }),
291
+ };
292
+ }
293
+ accessToken = parsed.accessToken;
294
+ }
295
+ catch {
296
+ return {
297
+ status: 400,
298
+ contentType: "application/json",
299
+ body: JSON.stringify({ ok: false, error: "Invalid JSON body" }),
300
+ };
301
+ }
302
+ try {
303
+ const res = await fetch(`${BASE_URL}/v0/meta/whoami`, {
304
+ headers: {
305
+ Authorization: `Bearer ${accessToken}`,
306
+ Accept: "application/json",
307
+ },
308
+ });
309
+ if (!res.ok) {
310
+ return {
311
+ status: 401,
312
+ contentType: "application/json",
313
+ body: JSON.stringify({
314
+ ok: false,
315
+ error: `Credentials rejected by Airtable (HTTP ${res.status}) — check accessToken`,
316
+ }),
317
+ };
318
+ }
319
+ const who = (await res.json());
320
+ const userId = who.id ?? undefined;
321
+ const email = who.email ?? undefined;
322
+ const tokens = {
323
+ accessToken,
324
+ userId,
325
+ email,
326
+ connected_at: new Date().toISOString(),
327
+ };
328
+ saveTokens(tokens);
329
+ resetAirtableConnector();
330
+ return {
331
+ status: 200,
332
+ contentType: "application/json",
333
+ body: JSON.stringify({
334
+ ok: true,
335
+ userId,
336
+ email,
337
+ connectedAt: tokens.connected_at,
338
+ }),
339
+ };
340
+ }
341
+ catch (err) {
342
+ return {
343
+ status: 500,
344
+ contentType: "application/json",
345
+ body: JSON.stringify({
346
+ ok: false,
347
+ error: err instanceof Error ? err.message : String(err),
348
+ }),
349
+ };
350
+ }
351
+ }
352
+ /**
353
+ * POST /connections/airtable/test
354
+ */
355
+ export async function handleAirtableTest() {
356
+ const tokens = loadTokens();
357
+ if (!tokens) {
358
+ return {
359
+ status: 400,
360
+ contentType: "application/json",
361
+ body: JSON.stringify({ ok: false, error: "Airtable not connected" }),
362
+ };
363
+ }
364
+ try {
365
+ const connector = getAirtableConnector();
366
+ const check = await connector.healthCheck();
367
+ return {
368
+ status: check.ok ? 200 : 401,
369
+ contentType: "application/json",
370
+ body: JSON.stringify(check.ok ? { ok: true } : { ok: false, error: check.error?.message }),
371
+ };
372
+ }
373
+ catch (err) {
374
+ return {
375
+ status: 500,
376
+ contentType: "application/json",
377
+ body: JSON.stringify({
378
+ ok: false,
379
+ error: err instanceof Error ? err.message : String(err),
380
+ }),
381
+ };
382
+ }
383
+ }
384
+ /**
385
+ * DELETE /connections/airtable
386
+ */
387
+ export function handleAirtableDisconnect() {
388
+ clearTokens();
389
+ resetAirtableConnector();
390
+ return {
391
+ status: 200,
392
+ contentType: "application/json",
393
+ body: JSON.stringify({ ok: true }),
394
+ };
395
+ }
396
+ //# sourceMappingURL=airtable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"airtable.js","sourceRoot":"","sources":["../../src/connectors/airtable.ts"],"names":[],"mappings":"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"}
@@ -173,6 +173,38 @@ export const CONNECTORS = [
173
173
  authKind: "pat",
174
174
  supports: { connect: true, test: true, delete: true },
175
175
  },
176
+ // Wave 1b — PAT comms connectors.
177
+ {
178
+ id: "sendgrid",
179
+ label: "SendGrid",
180
+ authKind: "pat",
181
+ supports: { connect: true, test: true, delete: true },
182
+ },
183
+ {
184
+ id: "twilio",
185
+ label: "Twilio",
186
+ authKind: "pat",
187
+ supports: { connect: true, test: true, delete: true },
188
+ },
189
+ // Wave 2 — PAT SaaS connectors (skip Wave 3 OAuth-app connectors for now).
190
+ {
191
+ id: "figma",
192
+ label: "Figma",
193
+ authKind: "pat",
194
+ supports: { connect: true, test: true, delete: true },
195
+ },
196
+ {
197
+ id: "airtable",
198
+ label: "Airtable",
199
+ authKind: "pat",
200
+ supports: { connect: true, test: true, delete: true },
201
+ },
202
+ {
203
+ id: "webflow",
204
+ label: "Webflow",
205
+ authKind: "pat",
206
+ supports: { connect: true, test: true, delete: true },
207
+ },
176
208
  // jira: PAT. Concurrent work is wiring the bridge routes. The
177
209
  // `supports` capabilities here are deliberately empty until those
178
210
  // routes exist; flipping them in this file is the one-line change
@@ -1 +1 @@
1
- {"version":3,"file":"connectorRegistry.js","sourceRoot":"","sources":["../../src/connectors/connectorRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connectorRegistry.js","sourceRoot":"","sources":["../../src/connectors/connectorRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Figma connector — read-only access to Figma files, comments, and team
3
+ * projects via the Figma REST API.
4
+ *
5
+ * Auth: Personal Access Token sent as `X-Figma-Token: <token>`.
6
+ * - Env var: FIGMA_ACCESS_TOKEN
7
+ * - Stored: getSecretJsonSync("figma") → FigmaTokens
8
+ *
9
+ * Tools: getMe, getFile, getFileNodes, getImageUrls, getFileComments,
10
+ * listTeamProjects, listProjectFiles
11
+ *
12
+ * Extends BaseConnector for unified auth, retry, rate-limit, error handling.
13
+ */
14
+ import { type AuthContext, BaseConnector, type ConnectorError, type ConnectorStatus } from "./baseConnector.js";
15
+ export interface FigmaTokens {
16
+ accessToken: string;
17
+ userHandle?: string;
18
+ email?: string;
19
+ connected_at: string;
20
+ }
21
+ export interface FigmaUser {
22
+ id: string;
23
+ handle: string;
24
+ img_url?: string;
25
+ email?: string;
26
+ }
27
+ export interface FigmaFile {
28
+ name: string;
29
+ lastModified: string;
30
+ version: string;
31
+ document: unknown;
32
+ components?: Record<string, unknown>;
33
+ styles?: Record<string, unknown>;
34
+ schemaVersion?: number;
35
+ thumbnailUrl?: string;
36
+ }
37
+ export interface FigmaFileNodes {
38
+ name: string;
39
+ lastModified: string;
40
+ version: string;
41
+ nodes: Record<string, {
42
+ document: unknown;
43
+ } | null>;
44
+ }
45
+ export interface FigmaImageResult {
46
+ err: string | null;
47
+ images: Record<string, string | null>;
48
+ }
49
+ export interface FigmaComment {
50
+ id: string;
51
+ file_key: string;
52
+ message: string;
53
+ user: {
54
+ id: string;
55
+ handle: string;
56
+ };
57
+ created_at: string;
58
+ resolved_at?: string | null;
59
+ }
60
+ export interface FigmaCommentsResult {
61
+ comments: FigmaComment[];
62
+ }
63
+ export interface FigmaProject {
64
+ id: string;
65
+ name: string;
66
+ }
67
+ export interface FigmaTeamProjectsResult {
68
+ name: string;
69
+ projects: FigmaProject[];
70
+ }
71
+ export interface FigmaProjectFile {
72
+ key: string;
73
+ name: string;
74
+ thumbnail_url?: string;
75
+ last_modified: string;
76
+ }
77
+ export interface FigmaProjectFilesResult {
78
+ name: string;
79
+ files: FigmaProjectFile[];
80
+ }
81
+ export type FigmaImageFormat = "png" | "jpg" | "svg" | "pdf";
82
+ export declare class FigmaConnector extends BaseConnector {
83
+ readonly providerName = "figma";
84
+ private tokens;
85
+ protected getOAuthConfig(): null;
86
+ authenticate(): Promise<AuthContext>;
87
+ healthCheck(): Promise<{
88
+ ok: boolean;
89
+ error?: ConnectorError;
90
+ }>;
91
+ normalizeError(error: unknown): ConnectorError;
92
+ getStatus(): ConnectorStatus;
93
+ getMe(): Promise<FigmaUser>;
94
+ getFile(fileKey: string, params?: {
95
+ depth?: number;
96
+ geometry?: "paths";
97
+ }): Promise<FigmaFile>;
98
+ getFileNodes(fileKey: string, nodeIds: string[]): Promise<FigmaFileNodes>;
99
+ getImageUrls(fileKey: string, params: {
100
+ ids: string[];
101
+ format?: FigmaImageFormat;
102
+ scale?: number;
103
+ }): Promise<FigmaImageResult>;
104
+ getFileComments(fileKey: string): Promise<FigmaCommentsResult>;
105
+ listTeamProjects(teamId: string): Promise<FigmaTeamProjectsResult>;
106
+ listProjectFiles(projectId: string): Promise<FigmaProjectFilesResult>;
107
+ private buildHeaders;
108
+ }
109
+ export declare function loadTokens(): FigmaTokens | null;
110
+ export declare function saveTokens(tokens: FigmaTokens): void;
111
+ export declare function clearTokens(): void;
112
+ export declare function getFigmaConnector(): FigmaConnector;
113
+ export { getFigmaConnector as figma };
114
+ export interface ConnectorHandlerResult {
115
+ status: number;
116
+ body: string;
117
+ contentType?: string;
118
+ }
119
+ /**
120
+ * POST /connections/figma/connect { accessToken }
121
+ */
122
+ export declare function handleFigmaConnect(body: string): Promise<ConnectorHandlerResult>;
123
+ /**
124
+ * POST /connections/figma/test
125
+ */
126
+ export declare function handleFigmaTest(): Promise<ConnectorHandlerResult>;
127
+ /**
128
+ * DELETE /connections/figma
129
+ */
130
+ export declare function handleFigmaDisconnect(): ConnectorHandlerResult;