@tangle-network/agent-integrations 0.53.53 → 0.53.54

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 (65) hide show
  1. package/README.md +23 -0
  2. package/data/bundled-adapter-manifests.json +1 -0
  3. package/dist/audit-DMTzJQJU.d.ts +51 -0
  4. package/dist/catalog.d.ts +3 -3
  5. package/dist/catalog.js +2 -12
  6. package/dist/chunk-A4OJ5EQT.js +133156 -0
  7. package/dist/chunk-A4OJ5EQT.js.map +1 -0
  8. package/dist/chunk-ABA4HWIQ.js +58 -0
  9. package/dist/chunk-ABA4HWIQ.js.map +1 -0
  10. package/dist/chunk-DED3J7F6.js +1 -0
  11. package/dist/chunk-ESY2FBBM.js +33 -0
  12. package/dist/chunk-ESY2FBBM.js.map +1 -0
  13. package/dist/chunk-GIK6EXU2.js +121 -0
  14. package/dist/chunk-GIK6EXU2.js.map +1 -0
  15. package/dist/{chunk-TWR2KAZG.js → chunk-MH4IEJCL.js} +1 -1
  16. package/dist/chunk-MH4IEJCL.js.map +1 -0
  17. package/dist/chunk-QVWTBQXP.js +267 -0
  18. package/dist/chunk-QVWTBQXP.js.map +1 -0
  19. package/dist/{chunk-2GEGKSL5.js → chunk-QWOX5SIM.js} +6 -33
  20. package/dist/chunk-QWOX5SIM.js.map +1 -0
  21. package/dist/chunk-RSJRICPU.js +394 -0
  22. package/dist/chunk-RSJRICPU.js.map +1 -0
  23. package/dist/chunk-WPQJK4S4.js +400 -0
  24. package/dist/chunk-WPQJK4S4.js.map +1 -0
  25. package/dist/connect/index.d.ts +2 -2
  26. package/dist/connectors/adapters/index.d.ts +2 -2
  27. package/dist/connectors/index.d.ts +10 -22
  28. package/dist/connectors/index.js +12 -10
  29. package/dist/{consumer-BbQWkIzU.d.ts → consumer-CIq2D22y.d.ts} +4 -51
  30. package/dist/consumer.d.ts +5 -4
  31. package/dist/{core-types-A-xIaTzb.d.ts → core-types-DZJQRBya.d.ts} +2 -2
  32. package/dist/coverage-catalog.d.ts +2 -2
  33. package/dist/coverage-catalog.js +1 -1
  34. package/dist/{importers-BMigcDVf.d.ts → importers-Cyk5osDs.d.ts} +1 -1
  35. package/dist/index.d.ts +17 -104
  36. package/dist/index.js +72 -62
  37. package/dist/internal/bundled-manifest-runtime.d.ts +15 -0
  38. package/dist/internal/bundled-manifest-runtime.js +13 -0
  39. package/dist/internal/bundled-manifest-runtime.js.map +1 -0
  40. package/dist/mcp.d.ts +3 -3
  41. package/dist/mcp.js +10 -5
  42. package/dist/mcp.js.map +1 -1
  43. package/dist/middleware/index.d.ts +2 -2
  44. package/dist/registry-core-DqdQjTkh.d.ts +49 -0
  45. package/dist/registry.d.ts +6 -49
  46. package/dist/registry.js +16 -10
  47. package/dist/runtime.d.ts +3 -3
  48. package/dist/runtime.js +3 -12
  49. package/dist/specs.d.ts +2 -2
  50. package/dist/specs.js +4 -6
  51. package/dist/{tangle-id-gFOGXe4Y.d.ts → tangle-id-Oy2z4W3p.d.ts} +1 -1
  52. package/dist/{types-DpKEBiX6.d.ts → types-DIis6QtV.d.ts} +1 -1
  53. package/dist/worker.d.ts +99 -0
  54. package/dist/worker.js +28 -0
  55. package/dist/worker.js.map +1 -0
  56. package/docs/repo-structure.md +29 -6
  57. package/package.json +10 -1
  58. package/dist/chunk-2GEGKSL5.js.map +0 -1
  59. package/dist/chunk-E2QYXDJQ.js +0 -147
  60. package/dist/chunk-E2QYXDJQ.js.map +0 -1
  61. package/dist/chunk-P4FFI752.js +0 -1
  62. package/dist/chunk-TWR2KAZG.js.map +0 -1
  63. package/dist/chunk-ZC3ZE7TN.js +0 -4849
  64. package/dist/chunk-ZC3ZE7TN.js.map +0 -1
  65. /package/dist/{chunk-P4FFI752.js.map → chunk-DED3J7F6.js.map} +0 -0
@@ -0,0 +1,394 @@
1
+ // src/web-crypto.ts
2
+ var BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
3
+ async function sha256Base64Url(value) {
4
+ const crypto = requireWebCrypto();
5
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
6
+ return bytesToBase64Url(new Uint8Array(digest));
7
+ }
8
+ function createWebCryptoUuid() {
9
+ const crypto = requireWebCrypto();
10
+ if (typeof crypto.randomUUID === "function") return crypto.randomUUID();
11
+ const bytes = new Uint8Array(16);
12
+ crypto.getRandomValues(bytes);
13
+ bytes[6] = bytes[6] & 15 | 64;
14
+ bytes[8] = bytes[8] & 63 | 128;
15
+ return [...bytes].map((byte, index) => {
16
+ const value = byte.toString(16).padStart(2, "0");
17
+ return [4, 6, 8, 10].includes(index) ? `-${value}` : value;
18
+ }).join("");
19
+ }
20
+ function requireWebCrypto() {
21
+ const crypto = globalThis.crypto;
22
+ if (!crypto || !crypto.subtle || typeof crypto.getRandomValues !== "function") {
23
+ throw new Error("The Web Crypto API is required for integration security operations.");
24
+ }
25
+ return crypto;
26
+ }
27
+ function bytesToBase64Url(bytes) {
28
+ let encoded = "";
29
+ for (let index = 0; index < bytes.length; index += 3) {
30
+ const first = bytes[index];
31
+ const second = bytes[index + 1];
32
+ const third = bytes[index + 2];
33
+ encoded += BASE64_ALPHABET[first >> 2];
34
+ encoded += BASE64_ALPHABET[(first & 3) << 4 | (second === void 0 ? 0 : second >> 4)];
35
+ encoded += second === void 0 ? "=" : BASE64_ALPHABET[(second & 15) << 2 | (third === void 0 ? 0 : third >> 6)];
36
+ encoded += third === void 0 ? "=" : BASE64_ALPHABET[third & 63];
37
+ }
38
+ return encoded.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
39
+ }
40
+
41
+ // src/audit.ts
42
+ var InMemoryIntegrationAuditStore = class {
43
+ events = [];
44
+ record(event) {
45
+ this.events.push(event);
46
+ }
47
+ list(filter = {}) {
48
+ return this.events.filter((event) => matchesFilter(event, filter));
49
+ }
50
+ };
51
+ function createIntegrationAuditEvent(input) {
52
+ const occurredAt = input.occurredAt instanceof Date ? input.occurredAt.toISOString() : input.occurredAt ?? (input.now?.() ?? /* @__PURE__ */ new Date()).toISOString();
53
+ return {
54
+ ...input,
55
+ id: input.id ?? `audit_${createWebCryptoUuid()}`,
56
+ occurredAt,
57
+ metadata: input.metadata ? redactUnknown(input.metadata) : void 0
58
+ };
59
+ }
60
+ function createAuditingActionGuard(options) {
61
+ const now = options.now ?? (() => /* @__PURE__ */ new Date());
62
+ return {
63
+ async invokeAction(ctx, proceed) {
64
+ const startedAt = now();
65
+ try {
66
+ const result = await proceed();
67
+ await options.sink.record(actionEvent({
68
+ ctx,
69
+ request: ctx.request,
70
+ result,
71
+ type: result.ok ? "action.invoked" : "action.failed",
72
+ subject: options.subject,
73
+ occurredAt: startedAt,
74
+ includeInputPreview: options.includeInputPreview
75
+ }));
76
+ return result;
77
+ } catch (error) {
78
+ await options.sink.record(actionEvent({
79
+ ctx,
80
+ request: ctx.request,
81
+ type: "action.failed",
82
+ subject: options.subject,
83
+ occurredAt: startedAt,
84
+ includeInputPreview: options.includeInputPreview,
85
+ message: error instanceof Error ? error.message : "Integration action failed."
86
+ }));
87
+ throw error;
88
+ }
89
+ }
90
+ };
91
+ }
92
+ function sanitizeAuditConnection(connection) {
93
+ return {
94
+ id: connection.id,
95
+ owner: connection.owner,
96
+ providerId: connection.providerId,
97
+ connectorId: connection.connectorId,
98
+ status: connection.status,
99
+ grantedScopes: connection.grantedScopes,
100
+ account: connection.account,
101
+ hasSecretRef: Boolean(connection.secretRef),
102
+ createdAt: connection.createdAt,
103
+ updatedAt: connection.updatedAt,
104
+ expiresAt: connection.expiresAt,
105
+ lastUsedAt: connection.lastUsedAt
106
+ };
107
+ }
108
+ function actionEvent(input) {
109
+ return createIntegrationAuditEvent({
110
+ type: input.type,
111
+ occurredAt: input.occurredAt,
112
+ actor: input.subject ?? input.ctx.connection.owner,
113
+ connectionId: input.ctx.connection.id,
114
+ providerId: input.ctx.connection.providerId,
115
+ connectorId: input.ctx.connection.connectorId,
116
+ action: input.request.action,
117
+ risk: input.ctx.action?.risk,
118
+ dataClass: input.ctx.action?.dataClass,
119
+ ok: input.result?.ok ?? false,
120
+ message: input.message,
121
+ metadata: {
122
+ idempotencyKey: input.request.idempotencyKey,
123
+ dryRun: input.request.dryRun,
124
+ externalId: input.result?.externalId,
125
+ warnings: input.result?.warnings,
126
+ inputPreview: input.includeInputPreview ? redactUnknown(input.request.input) : void 0
127
+ }
128
+ });
129
+ }
130
+ function matchesFilter(event, filter) {
131
+ if (filter.type && event.type !== filter.type) return false;
132
+ if (filter.actor && (!event.actor || event.actor.type !== filter.actor.type || event.actor.id !== filter.actor.id)) return false;
133
+ if (filter.connectionId && event.connectionId !== filter.connectionId) return false;
134
+ if (filter.providerId && event.providerId !== filter.providerId) return false;
135
+ if (filter.connectorId && event.connectorId !== filter.connectorId) return false;
136
+ if (filter.action && event.action !== filter.action) return false;
137
+ return true;
138
+ }
139
+ function redactUnknown(value) {
140
+ if (Array.isArray(value)) return value.map(redactUnknown);
141
+ if (!value || typeof value !== "object") return value;
142
+ const out = {};
143
+ for (const [key, child] of Object.entries(value)) {
144
+ if (/token|secret|password|authorization|api[_-]?key|credential|refresh/i.test(key)) {
145
+ out[key] = "[REDACTED]";
146
+ } else {
147
+ out[key] = redactUnknown(child);
148
+ }
149
+ }
150
+ return out;
151
+ }
152
+
153
+ // src/guard.ts
154
+ var InMemoryIntegrationIdempotencyStore = class {
155
+ records = /* @__PURE__ */ new Map();
156
+ get(key) {
157
+ return this.records.get(key);
158
+ }
159
+ put(record) {
160
+ this.records.set(record.key, record);
161
+ }
162
+ };
163
+ var DefaultIntegrationActionGuard = class {
164
+ idempotency;
165
+ audit;
166
+ rateLimiter;
167
+ requireIdempotencyForMutations;
168
+ now;
169
+ constructor(options = {}) {
170
+ this.idempotency = options.idempotency;
171
+ this.audit = options.audit;
172
+ this.rateLimiter = options.rateLimiter;
173
+ this.requireIdempotencyForMutations = options.requireIdempotencyForMutations ?? false;
174
+ this.now = options.now ?? (() => /* @__PURE__ */ new Date());
175
+ }
176
+ async invokeAction(ctx, proceed) {
177
+ const idempotencyKey = ctx.request.idempotencyKey;
178
+ if (this.requireIdempotencyForMutations && ctx.action?.risk !== "read" && !idempotencyKey) {
179
+ return {
180
+ ok: false,
181
+ action: ctx.request.action,
182
+ output: {
183
+ idempotencyRequired: true,
184
+ message: "State-changing integration actions require an idempotency key."
185
+ }
186
+ };
187
+ }
188
+ const requestHash = idempotencyKey && this.idempotency ? await hashRequest(ctx) : void 0;
189
+ if (idempotencyKey && this.idempotency && requestHash) {
190
+ const existing = await this.idempotency.get(idempotencyKey);
191
+ if (existing) {
192
+ if (existing.requestHash !== requestHash) {
193
+ return {
194
+ ok: false,
195
+ action: ctx.request.action,
196
+ output: { idempotencyConflict: true, message: "Idempotency key was reused with different integration input." }
197
+ };
198
+ }
199
+ return {
200
+ ...existing.result,
201
+ metadata: { ...existing.result.metadata ?? {}, idempotentReplay: true }
202
+ };
203
+ }
204
+ }
205
+ if (ctx.request.dryRun && ctx.action?.risk !== "read") {
206
+ const result = {
207
+ ok: true,
208
+ action: ctx.request.action,
209
+ output: { dryRun: true },
210
+ metadata: { dryRun: true }
211
+ };
212
+ await this.writeIdempotency(idempotencyKey, requestHash, result);
213
+ return result;
214
+ }
215
+ const rateLimit = await this.rateLimiter?.check(ctx);
216
+ if (rateLimit && !rateLimit.allowed) {
217
+ return {
218
+ ok: false,
219
+ action: ctx.request.action,
220
+ output: { rateLimited: true, retryAfterMs: rateLimit.retryAfterMs, message: rateLimit.reason ?? "Integration rate limit exceeded." }
221
+ };
222
+ }
223
+ try {
224
+ const result = await proceed();
225
+ if (result.ok) {
226
+ await this.writeIdempotency(idempotencyKey, requestHash, result);
227
+ }
228
+ await this.audit?.record(createIntegrationAuditEvent({
229
+ type: result.ok ? "action.invoked" : "action.failed",
230
+ actor: ctx.connection.owner,
231
+ connectionId: ctx.connection.id,
232
+ providerId: ctx.connection.providerId,
233
+ connectorId: ctx.connection.connectorId,
234
+ action: ctx.request.action,
235
+ risk: ctx.action?.risk,
236
+ dataClass: ctx.action?.dataClass,
237
+ ok: result.ok,
238
+ metadata: { idempotencyKey, externalId: result.externalId, warnings: result.warnings },
239
+ now: this.now
240
+ }));
241
+ return result;
242
+ } catch (error) {
243
+ await this.audit?.record(createIntegrationAuditEvent({
244
+ type: "action.failed",
245
+ actor: ctx.connection.owner,
246
+ connectionId: ctx.connection.id,
247
+ providerId: ctx.connection.providerId,
248
+ connectorId: ctx.connection.connectorId,
249
+ action: ctx.request.action,
250
+ risk: ctx.action?.risk,
251
+ dataClass: ctx.action?.dataClass,
252
+ ok: false,
253
+ message: error instanceof Error ? error.message : "Integration action failed.",
254
+ metadata: { idempotencyKey },
255
+ now: this.now
256
+ }));
257
+ throw error;
258
+ }
259
+ }
260
+ async writeIdempotency(key, requestHash, result) {
261
+ if (!key || !this.idempotency || !requestHash) return;
262
+ await this.idempotency.put({
263
+ key,
264
+ requestHash,
265
+ result,
266
+ createdAt: this.now().toISOString()
267
+ });
268
+ }
269
+ };
270
+ function createDefaultIntegrationActionGuard(options = {}) {
271
+ return new DefaultIntegrationActionGuard(options);
272
+ }
273
+ async function hashRequest(ctx) {
274
+ return sha256Base64Url(JSON.stringify({
275
+ connectionId: ctx.connection.id,
276
+ action: ctx.request.action,
277
+ input: ctx.request.input ?? null,
278
+ dryRun: ctx.request.dryRun ?? false
279
+ }));
280
+ }
281
+
282
+ // src/policy.ts
283
+ var StaticIntegrationPolicyEngine = class {
284
+ rules;
285
+ defaultReadEffect;
286
+ defaultWriteEffect;
287
+ defaultDestructiveEffect;
288
+ now;
289
+ constructor(options = {}) {
290
+ this.rules = options.rules ?? [];
291
+ this.defaultReadEffect = options.defaultReadEffect ?? "allow";
292
+ this.defaultWriteEffect = options.defaultWriteEffect ?? "require_approval";
293
+ this.defaultDestructiveEffect = options.defaultDestructiveEffect ?? "deny";
294
+ this.now = options.now ?? (() => /* @__PURE__ */ new Date());
295
+ }
296
+ decide(ctx) {
297
+ const action = ctx.action;
298
+ if (!action) return { decision: "deny", reason: "Integration action is missing from connector catalog." };
299
+ const matched = this.rules.find((rule) => ruleMatches(rule, ctx));
300
+ const effect = matched?.effect ?? this.defaultEffect(action.risk);
301
+ const reason = matched?.reason ?? defaultReason(effect, action.risk);
302
+ if (effect === "allow") return { decision: "allow", reason, metadata: matched ? { ruleId: matched.id } : void 0 };
303
+ if (effect === "deny") return { decision: "deny", reason, metadata: matched ? { ruleId: matched.id } : void 0 };
304
+ return {
305
+ decision: "require_approval",
306
+ reason,
307
+ approval: buildApprovalRequest(ctx, reason, this.now()),
308
+ metadata: matched ? { ruleId: matched.id } : void 0
309
+ };
310
+ }
311
+ defaultEffect(risk) {
312
+ if (risk === "read") return this.defaultReadEffect;
313
+ if (risk === "write") return this.defaultWriteEffect;
314
+ return this.defaultDestructiveEffect;
315
+ }
316
+ };
317
+ function createDefaultIntegrationPolicyEngine(options = {}) {
318
+ return new StaticIntegrationPolicyEngine(options);
319
+ }
320
+ function buildApprovalRequest(ctx, reason, requestedAt) {
321
+ if (!ctx.action) {
322
+ throw new Error("Cannot build approval request without an action descriptor.");
323
+ }
324
+ return {
325
+ id: `approval_${createWebCryptoUuid()}`,
326
+ connectionId: ctx.connection.id,
327
+ providerId: ctx.connection.providerId,
328
+ connectorId: ctx.connection.connectorId,
329
+ action: ctx.request.action,
330
+ actor: { type: ctx.subject.type, id: ctx.subject.id },
331
+ risk: ctx.action.risk,
332
+ dataClass: ctx.action.dataClass,
333
+ reason,
334
+ requestedAt: requestedAt.toISOString(),
335
+ inputPreview: previewInput(ctx.request.input)
336
+ };
337
+ }
338
+ function redactApprovalRequest(request) {
339
+ return {
340
+ ...request,
341
+ inputPreview: redactUnknown2(request.inputPreview)
342
+ };
343
+ }
344
+ function ruleMatches(rule, ctx) {
345
+ if (!ctx.action) return false;
346
+ if (rule.providerId && rule.providerId !== ctx.connection.providerId) return false;
347
+ if (rule.connectorId && rule.connectorId !== ctx.connection.connectorId) return false;
348
+ if (rule.action && rule.action !== ctx.request.action) return false;
349
+ if (rule.risk && rule.risk !== ctx.action.risk) return false;
350
+ if (rule.maxRisk && riskRank(ctx.action.risk) > riskRank(rule.maxRisk)) return false;
351
+ if (rule.dataClass && rule.dataClass !== ctx.action.dataClass) return false;
352
+ return true;
353
+ }
354
+ function riskRank(risk) {
355
+ if (risk === "read") return 0;
356
+ if (risk === "write") return 1;
357
+ return 2;
358
+ }
359
+ function defaultReason(effect, risk) {
360
+ if (effect === "allow") return `${risk} integration action allowed by default policy.`;
361
+ if (effect === "deny") return `${risk} integration action denied by default policy.`;
362
+ return `${risk} integration action requires approval by default policy.`;
363
+ }
364
+ function previewInput(input) {
365
+ return redactUnknown2(input);
366
+ }
367
+ function redactUnknown2(value) {
368
+ if (Array.isArray(value)) return value.map(redactUnknown2);
369
+ if (!value || typeof value !== "object") return value;
370
+ const out = {};
371
+ for (const [key, child] of Object.entries(value)) {
372
+ if (/token|secret|password|authorization|api[_-]?key|credential/i.test(key)) {
373
+ out[key] = "[REDACTED]";
374
+ } else {
375
+ out[key] = redactUnknown2(child);
376
+ }
377
+ }
378
+ return out;
379
+ }
380
+
381
+ export {
382
+ InMemoryIntegrationAuditStore,
383
+ createIntegrationAuditEvent,
384
+ createAuditingActionGuard,
385
+ sanitizeAuditConnection,
386
+ InMemoryIntegrationIdempotencyStore,
387
+ DefaultIntegrationActionGuard,
388
+ createDefaultIntegrationActionGuard,
389
+ StaticIntegrationPolicyEngine,
390
+ createDefaultIntegrationPolicyEngine,
391
+ buildApprovalRequest,
392
+ redactApprovalRequest
393
+ };
394
+ //# sourceMappingURL=chunk-RSJRICPU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/web-crypto.ts","../src/audit.ts","../src/guard.ts","../src/policy.ts"],"sourcesContent":["const BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\nexport async function sha256Base64Url(value: string): Promise<string> {\n const crypto = requireWebCrypto()\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value))\n return bytesToBase64Url(new Uint8Array(digest))\n}\n\nexport function createWebCryptoUuid(): string {\n const crypto = requireWebCrypto()\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID()\n\n const bytes = new Uint8Array(16)\n crypto.getRandomValues(bytes)\n bytes[6] = (bytes[6]! & 0x0f) | 0x40\n bytes[8] = (bytes[8]! & 0x3f) | 0x80\n return [...bytes]\n .map((byte, index) => {\n const value = byte.toString(16).padStart(2, '0')\n return [4, 6, 8, 10].includes(index) ? `-${value}` : value\n })\n .join('')\n}\n\nfunction requireWebCrypto(): Crypto {\n const crypto = globalThis.crypto\n if (!crypto || !crypto.subtle || typeof crypto.getRandomValues !== 'function') {\n throw new Error('The Web Crypto API is required for integration security operations.')\n }\n return crypto\n}\n\nfunction bytesToBase64Url(bytes: Uint8Array): string {\n let encoded = ''\n for (let index = 0; index < bytes.length; index += 3) {\n const first = bytes[index]!\n const second = bytes[index + 1]\n const third = bytes[index + 2]\n encoded += BASE64_ALPHABET[first >> 2]\n encoded += BASE64_ALPHABET[((first & 0x03) << 4) | (second === undefined ? 0 : second >> 4)]\n encoded += second === undefined\n ? '='\n : BASE64_ALPHABET[((second & 0x0f) << 2) | (third === undefined ? 0 : third >> 6)]\n encoded += third === undefined ? '=' : BASE64_ALPHABET[third & 0x3f]\n }\n return encoded.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '')\n}\n","import type {\n IntegrationActionGuard,\n IntegrationActionRequest,\n IntegrationActionResult,\n IntegrationActor,\n IntegrationConnection,\n IntegrationConnectorAction,\n IntegrationDataClass,\n IntegrationGuardContext,\n} from './core-types.js'\nimport { createWebCryptoUuid } from './web-crypto.js'\n\nexport type IntegrationAuditEventType =\n | 'connection.created'\n | 'connection.updated'\n | 'connection.revoked'\n | 'grant.created'\n | 'grant.revoked'\n | 'capability.issued'\n | 'action.invoked'\n | 'action.failed'\n | 'trigger.subscribed'\n | 'trigger.received'\n | 'workflow.installed'\n | 'approval.requested'\n | 'approval.resolved'\n | 'healthcheck.completed'\n\nexport interface IntegrationAuditEvent {\n id: string\n type: IntegrationAuditEventType\n occurredAt: string\n actor?: IntegrationActor\n connectionId?: string\n providerId?: string\n connectorId?: string\n action?: string\n risk?: IntegrationConnectorAction['risk']\n dataClass?: IntegrationDataClass\n ok?: boolean\n message?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface IntegrationAuditSink {\n record(event: IntegrationAuditEvent): Promise<void> | void\n}\n\nexport interface IntegrationAuditStore extends IntegrationAuditSink {\n list(filter?: IntegrationAuditFilter): Promise<IntegrationAuditEvent[]> | IntegrationAuditEvent[]\n}\n\nexport interface IntegrationAuditFilter {\n type?: IntegrationAuditEventType\n actor?: IntegrationActor\n connectionId?: string\n providerId?: string\n connectorId?: string\n action?: string\n}\n\nexport class InMemoryIntegrationAuditStore implements IntegrationAuditStore {\n private readonly events: IntegrationAuditEvent[] = []\n\n record(event: IntegrationAuditEvent): void {\n this.events.push(event)\n }\n\n list(filter: IntegrationAuditFilter = {}): IntegrationAuditEvent[] {\n return this.events.filter((event) => matchesFilter(event, filter))\n }\n}\n\nexport function createIntegrationAuditEvent(input: Omit<IntegrationAuditEvent, 'id' | 'occurredAt'> & {\n id?: string\n occurredAt?: string | Date\n now?: () => Date\n}): IntegrationAuditEvent {\n const occurredAt = input.occurredAt instanceof Date\n ? input.occurredAt.toISOString()\n : input.occurredAt ?? (input.now?.() ?? new Date()).toISOString()\n return {\n ...input,\n id: input.id ?? `audit_${createWebCryptoUuid()}`,\n occurredAt,\n metadata: input.metadata ? redactUnknown(input.metadata) as Record<string, unknown> : undefined,\n }\n}\n\nexport function createAuditingActionGuard(options: {\n sink: IntegrationAuditSink\n subject?: IntegrationActor\n now?: () => Date\n includeInputPreview?: boolean\n}): IntegrationActionGuard {\n const now = options.now ?? (() => new Date())\n return {\n async invokeAction(ctx: IntegrationGuardContext, proceed: () => Promise<IntegrationActionResult>): Promise<IntegrationActionResult> {\n const startedAt = now()\n try {\n const result = await proceed()\n await options.sink.record(actionEvent({\n ctx,\n request: ctx.request,\n result,\n type: result.ok ? 'action.invoked' : 'action.failed',\n subject: options.subject,\n occurredAt: startedAt,\n includeInputPreview: options.includeInputPreview,\n }))\n return result\n } catch (error) {\n await options.sink.record(actionEvent({\n ctx,\n request: ctx.request,\n type: 'action.failed',\n subject: options.subject,\n occurredAt: startedAt,\n includeInputPreview: options.includeInputPreview,\n message: error instanceof Error ? error.message : 'Integration action failed.',\n }))\n throw error\n }\n },\n }\n}\n\nexport function sanitizeAuditConnection(connection: IntegrationConnection): Record<string, unknown> {\n return {\n id: connection.id,\n owner: connection.owner,\n providerId: connection.providerId,\n connectorId: connection.connectorId,\n status: connection.status,\n grantedScopes: connection.grantedScopes,\n account: connection.account,\n hasSecretRef: Boolean(connection.secretRef),\n createdAt: connection.createdAt,\n updatedAt: connection.updatedAt,\n expiresAt: connection.expiresAt,\n lastUsedAt: connection.lastUsedAt,\n }\n}\n\nfunction actionEvent(input: {\n ctx: IntegrationGuardContext\n request: IntegrationActionRequest\n result?: IntegrationActionResult\n type: 'action.invoked' | 'action.failed'\n subject?: IntegrationActor\n occurredAt: Date\n includeInputPreview?: boolean\n message?: string\n}): IntegrationAuditEvent {\n return createIntegrationAuditEvent({\n type: input.type,\n occurredAt: input.occurredAt,\n actor: input.subject ?? input.ctx.connection.owner,\n connectionId: input.ctx.connection.id,\n providerId: input.ctx.connection.providerId,\n connectorId: input.ctx.connection.connectorId,\n action: input.request.action,\n risk: input.ctx.action?.risk,\n dataClass: input.ctx.action?.dataClass,\n ok: input.result?.ok ?? false,\n message: input.message,\n metadata: {\n idempotencyKey: input.request.idempotencyKey,\n dryRun: input.request.dryRun,\n externalId: input.result?.externalId,\n warnings: input.result?.warnings,\n inputPreview: input.includeInputPreview ? redactUnknown(input.request.input) : undefined,\n },\n })\n}\n\nfunction matchesFilter(event: IntegrationAuditEvent, filter: IntegrationAuditFilter): boolean {\n if (filter.type && event.type !== filter.type) return false\n if (filter.actor && (!event.actor || event.actor.type !== filter.actor.type || event.actor.id !== filter.actor.id)) return false\n if (filter.connectionId && event.connectionId !== filter.connectionId) return false\n if (filter.providerId && event.providerId !== filter.providerId) return false\n if (filter.connectorId && event.connectorId !== filter.connectorId) return false\n if (filter.action && event.action !== filter.action) return false\n return true\n}\n\nfunction redactUnknown(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactUnknown)\n if (!value || typeof value !== 'object') return value\n const out: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value)) {\n if (/token|secret|password|authorization|api[_-]?key|credential|refresh/i.test(key)) {\n out[key] = '[REDACTED]'\n } else {\n out[key] = redactUnknown(child)\n }\n }\n return out\n}\n","import type {\n IntegrationActionGuard,\n IntegrationActionResult,\n IntegrationGuardContext,\n} from './core-types.js'\nimport type { IntegrationAuditSink } from './audit.js'\nimport { createIntegrationAuditEvent } from './audit.js'\nimport { sha256Base64Url } from './web-crypto.js'\n\nexport interface IntegrationIdempotencyRecord {\n key: string\n requestHash: string\n result: IntegrationActionResult\n createdAt: string\n}\n\nexport interface IntegrationIdempotencyStore {\n get(key: string): Promise<IntegrationIdempotencyRecord | undefined> | IntegrationIdempotencyRecord | undefined\n put(record: IntegrationIdempotencyRecord): Promise<void> | void\n}\n\nexport interface IntegrationRateLimitDecision {\n allowed: boolean\n retryAfterMs?: number\n reason?: string\n}\n\nexport interface IntegrationRateLimiter {\n check(ctx: IntegrationGuardContext): Promise<IntegrationRateLimitDecision> | IntegrationRateLimitDecision\n}\n\nexport class InMemoryIntegrationIdempotencyStore implements IntegrationIdempotencyStore {\n private readonly records = new Map<string, IntegrationIdempotencyRecord>()\n\n get(key: string): IntegrationIdempotencyRecord | undefined {\n return this.records.get(key)\n }\n\n put(record: IntegrationIdempotencyRecord): void {\n this.records.set(record.key, record)\n }\n}\n\nexport class DefaultIntegrationActionGuard implements IntegrationActionGuard {\n private readonly idempotency: IntegrationIdempotencyStore | undefined\n private readonly audit: IntegrationAuditSink | undefined\n private readonly rateLimiter: IntegrationRateLimiter | undefined\n private readonly requireIdempotencyForMutations: boolean\n private readonly now: () => Date\n\n constructor(options: {\n idempotency?: IntegrationIdempotencyStore\n audit?: IntegrationAuditSink\n rateLimiter?: IntegrationRateLimiter\n requireIdempotencyForMutations?: boolean\n now?: () => Date\n } = {}) {\n this.idempotency = options.idempotency\n this.audit = options.audit\n this.rateLimiter = options.rateLimiter\n this.requireIdempotencyForMutations = options.requireIdempotencyForMutations ?? false\n this.now = options.now ?? (() => new Date())\n }\n\n async invokeAction(ctx: IntegrationGuardContext, proceed: () => Promise<IntegrationActionResult>): Promise<IntegrationActionResult> {\n const idempotencyKey = ctx.request.idempotencyKey\n if (this.requireIdempotencyForMutations && ctx.action?.risk !== 'read' && !idempotencyKey) {\n return {\n ok: false,\n action: ctx.request.action,\n output: {\n idempotencyRequired: true,\n message: 'State-changing integration actions require an idempotency key.',\n },\n }\n }\n const requestHash = idempotencyKey && this.idempotency ? await hashRequest(ctx) : undefined\n if (idempotencyKey && this.idempotency && requestHash) {\n const existing = await this.idempotency.get(idempotencyKey)\n if (existing) {\n if (existing.requestHash !== requestHash) {\n return {\n ok: false,\n action: ctx.request.action,\n output: { idempotencyConflict: true, message: 'Idempotency key was reused with different integration input.' },\n }\n }\n return {\n ...existing.result,\n metadata: { ...(existing.result.metadata ?? {}), idempotentReplay: true },\n }\n }\n }\n\n if (ctx.request.dryRun && ctx.action?.risk !== 'read') {\n const result: IntegrationActionResult = {\n ok: true,\n action: ctx.request.action,\n output: { dryRun: true },\n metadata: { dryRun: true },\n }\n await this.writeIdempotency(idempotencyKey, requestHash, result)\n return result\n }\n\n const rateLimit = await this.rateLimiter?.check(ctx)\n if (rateLimit && !rateLimit.allowed) {\n return {\n ok: false,\n action: ctx.request.action,\n output: { rateLimited: true, retryAfterMs: rateLimit.retryAfterMs, message: rateLimit.reason ?? 'Integration rate limit exceeded.' },\n }\n }\n\n try {\n const result = await proceed()\n if (result.ok) {\n await this.writeIdempotency(idempotencyKey, requestHash, result)\n }\n await this.audit?.record(createIntegrationAuditEvent({\n type: result.ok ? 'action.invoked' : 'action.failed',\n actor: ctx.connection.owner,\n connectionId: ctx.connection.id,\n providerId: ctx.connection.providerId,\n connectorId: ctx.connection.connectorId,\n action: ctx.request.action,\n risk: ctx.action?.risk,\n dataClass: ctx.action?.dataClass,\n ok: result.ok,\n metadata: { idempotencyKey, externalId: result.externalId, warnings: result.warnings },\n now: this.now,\n }))\n return result\n } catch (error) {\n await this.audit?.record(createIntegrationAuditEvent({\n type: 'action.failed',\n actor: ctx.connection.owner,\n connectionId: ctx.connection.id,\n providerId: ctx.connection.providerId,\n connectorId: ctx.connection.connectorId,\n action: ctx.request.action,\n risk: ctx.action?.risk,\n dataClass: ctx.action?.dataClass,\n ok: false,\n message: error instanceof Error ? error.message : 'Integration action failed.',\n metadata: { idempotencyKey },\n now: this.now,\n }))\n throw error\n }\n }\n\n private async writeIdempotency(key: string | undefined, requestHash: string | undefined, result: IntegrationActionResult): Promise<void> {\n if (!key || !this.idempotency || !requestHash) return\n await this.idempotency.put({\n key,\n requestHash,\n result,\n createdAt: this.now().toISOString(),\n })\n }\n}\n\nexport function createDefaultIntegrationActionGuard(options: ConstructorParameters<typeof DefaultIntegrationActionGuard>[0] = {}): DefaultIntegrationActionGuard {\n return new DefaultIntegrationActionGuard(options)\n}\n\nasync function hashRequest(ctx: IntegrationGuardContext): Promise<string> {\n return sha256Base64Url(JSON.stringify({\n connectionId: ctx.connection.id,\n action: ctx.request.action,\n input: ctx.request.input ?? null,\n dryRun: ctx.request.dryRun ?? false,\n }))\n}\n","import type {\n IntegrationActionRisk,\n IntegrationApprovalRequest,\n IntegrationDataClass,\n IntegrationGuardContext,\n IntegrationPolicyDecision,\n IntegrationPolicyEngine,\n} from './core-types.js'\nimport { createWebCryptoUuid } from './web-crypto.js'\n\nexport type IntegrationPolicyEffect = 'allow' | 'require_approval' | 'deny'\n\nexport interface IntegrationPolicyRule {\n id: string\n effect: IntegrationPolicyEffect\n reason: string\n providerId?: string\n connectorId?: string\n action?: string\n maxRisk?: IntegrationActionRisk\n risk?: IntegrationActionRisk\n dataClass?: IntegrationDataClass\n}\n\nexport interface StaticIntegrationPolicyOptions {\n rules?: IntegrationPolicyRule[]\n defaultReadEffect?: IntegrationPolicyEffect\n defaultWriteEffect?: IntegrationPolicyEffect\n defaultDestructiveEffect?: IntegrationPolicyEffect\n now?: () => Date\n}\n\nexport interface IntegrationApprovalResolution {\n approvalId: string\n approved: boolean\n resolvedBy: string\n resolvedAt: string\n reason?: string\n metadata?: Record<string, unknown>\n}\n\nexport class StaticIntegrationPolicyEngine implements IntegrationPolicyEngine {\n private readonly rules: IntegrationPolicyRule[]\n private readonly defaultReadEffect: IntegrationPolicyEffect\n private readonly defaultWriteEffect: IntegrationPolicyEffect\n private readonly defaultDestructiveEffect: IntegrationPolicyEffect\n private readonly now: () => Date\n\n constructor(options: StaticIntegrationPolicyOptions = {}) {\n this.rules = options.rules ?? []\n this.defaultReadEffect = options.defaultReadEffect ?? 'allow'\n this.defaultWriteEffect = options.defaultWriteEffect ?? 'require_approval'\n this.defaultDestructiveEffect = options.defaultDestructiveEffect ?? 'deny'\n this.now = options.now ?? (() => new Date())\n }\n\n decide(ctx: IntegrationGuardContext & { subject: { type: string; id: string } }): IntegrationPolicyDecision {\n const action = ctx.action\n if (!action) return { decision: 'deny', reason: 'Integration action is missing from connector catalog.' }\n const matched = this.rules.find((rule) => ruleMatches(rule, ctx))\n const effect = matched?.effect ?? this.defaultEffect(action.risk)\n const reason = matched?.reason ?? defaultReason(effect, action.risk)\n if (effect === 'allow') return { decision: 'allow', reason, metadata: matched ? { ruleId: matched.id } : undefined }\n if (effect === 'deny') return { decision: 'deny', reason, metadata: matched ? { ruleId: matched.id } : undefined }\n return {\n decision: 'require_approval',\n reason,\n approval: buildApprovalRequest(ctx, reason, this.now()),\n metadata: matched ? { ruleId: matched.id } : undefined,\n }\n }\n\n private defaultEffect(risk: IntegrationActionRisk): IntegrationPolicyEffect {\n if (risk === 'read') return this.defaultReadEffect\n if (risk === 'write') return this.defaultWriteEffect\n return this.defaultDestructiveEffect\n }\n}\n\nexport function createDefaultIntegrationPolicyEngine(options: Omit<StaticIntegrationPolicyOptions, 'rules'> = {}): StaticIntegrationPolicyEngine {\n return new StaticIntegrationPolicyEngine(options)\n}\n\nexport function buildApprovalRequest(\n ctx: IntegrationGuardContext & { subject: { type: string; id: string } },\n reason: string,\n requestedAt: Date,\n): IntegrationApprovalRequest {\n if (!ctx.action) {\n throw new Error('Cannot build approval request without an action descriptor.')\n }\n return {\n id: `approval_${createWebCryptoUuid()}`,\n connectionId: ctx.connection.id,\n providerId: ctx.connection.providerId,\n connectorId: ctx.connection.connectorId,\n action: ctx.request.action,\n actor: { type: ctx.subject.type as never, id: ctx.subject.id },\n risk: ctx.action.risk,\n dataClass: ctx.action.dataClass,\n reason,\n requestedAt: requestedAt.toISOString(),\n inputPreview: previewInput(ctx.request.input),\n }\n}\n\nexport function redactApprovalRequest(request: IntegrationApprovalRequest): IntegrationApprovalRequest {\n return {\n ...request,\n inputPreview: redactUnknown(request.inputPreview),\n }\n}\n\nfunction ruleMatches(rule: IntegrationPolicyRule, ctx: IntegrationGuardContext): boolean {\n if (!ctx.action) return false\n if (rule.providerId && rule.providerId !== ctx.connection.providerId) return false\n if (rule.connectorId && rule.connectorId !== ctx.connection.connectorId) return false\n if (rule.action && rule.action !== ctx.request.action) return false\n if (rule.risk && rule.risk !== ctx.action.risk) return false\n if (rule.maxRisk && riskRank(ctx.action.risk) > riskRank(rule.maxRisk)) return false\n if (rule.dataClass && rule.dataClass !== ctx.action.dataClass) return false\n return true\n}\n\nfunction riskRank(risk: IntegrationActionRisk): number {\n if (risk === 'read') return 0\n if (risk === 'write') return 1\n return 2\n}\n\nfunction defaultReason(effect: IntegrationPolicyEffect, risk: IntegrationActionRisk): string {\n if (effect === 'allow') return `${risk} integration action allowed by default policy.`\n if (effect === 'deny') return `${risk} integration action denied by default policy.`\n return `${risk} integration action requires approval by default policy.`\n}\n\nfunction previewInput(input: unknown): unknown {\n return redactUnknown(input)\n}\n\nfunction redactUnknown(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactUnknown)\n if (!value || typeof value !== 'object') return value\n const out: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value)) {\n if (/token|secret|password|authorization|api[_-]?key|credential/i.test(key)) {\n out[key] = '[REDACTED]'\n } else {\n out[key] = redactUnknown(child)\n }\n }\n return out\n}\n"],"mappings":"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","names":["redactUnknown"]}