@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.
- package/README.md +23 -0
- package/data/bundled-adapter-manifests.json +1 -0
- package/dist/audit-DMTzJQJU.d.ts +51 -0
- package/dist/catalog.d.ts +3 -3
- package/dist/catalog.js +2 -12
- package/dist/chunk-A4OJ5EQT.js +133156 -0
- package/dist/chunk-A4OJ5EQT.js.map +1 -0
- package/dist/chunk-ABA4HWIQ.js +58 -0
- package/dist/chunk-ABA4HWIQ.js.map +1 -0
- package/dist/chunk-DED3J7F6.js +1 -0
- package/dist/chunk-ESY2FBBM.js +33 -0
- package/dist/chunk-ESY2FBBM.js.map +1 -0
- package/dist/chunk-GIK6EXU2.js +121 -0
- package/dist/chunk-GIK6EXU2.js.map +1 -0
- package/dist/{chunk-TWR2KAZG.js → chunk-MH4IEJCL.js} +1 -1
- package/dist/chunk-MH4IEJCL.js.map +1 -0
- package/dist/chunk-QVWTBQXP.js +267 -0
- package/dist/chunk-QVWTBQXP.js.map +1 -0
- package/dist/{chunk-2GEGKSL5.js → chunk-QWOX5SIM.js} +6 -33
- package/dist/chunk-QWOX5SIM.js.map +1 -0
- package/dist/chunk-RSJRICPU.js +394 -0
- package/dist/chunk-RSJRICPU.js.map +1 -0
- package/dist/chunk-WPQJK4S4.js +400 -0
- package/dist/chunk-WPQJK4S4.js.map +1 -0
- package/dist/connect/index.d.ts +2 -2
- package/dist/connectors/adapters/index.d.ts +2 -2
- package/dist/connectors/index.d.ts +10 -22
- package/dist/connectors/index.js +12 -10
- package/dist/{consumer-BbQWkIzU.d.ts → consumer-CIq2D22y.d.ts} +4 -51
- package/dist/consumer.d.ts +5 -4
- package/dist/{core-types-A-xIaTzb.d.ts → core-types-DZJQRBya.d.ts} +2 -2
- package/dist/coverage-catalog.d.ts +2 -2
- package/dist/coverage-catalog.js +1 -1
- package/dist/{importers-BMigcDVf.d.ts → importers-Cyk5osDs.d.ts} +1 -1
- package/dist/index.d.ts +17 -104
- package/dist/index.js +72 -62
- package/dist/internal/bundled-manifest-runtime.d.ts +15 -0
- package/dist/internal/bundled-manifest-runtime.js +13 -0
- package/dist/internal/bundled-manifest-runtime.js.map +1 -0
- package/dist/mcp.d.ts +3 -3
- package/dist/mcp.js +10 -5
- package/dist/mcp.js.map +1 -1
- package/dist/middleware/index.d.ts +2 -2
- package/dist/registry-core-DqdQjTkh.d.ts +49 -0
- package/dist/registry.d.ts +6 -49
- package/dist/registry.js +16 -10
- package/dist/runtime.d.ts +3 -3
- package/dist/runtime.js +3 -12
- package/dist/specs.d.ts +2 -2
- package/dist/specs.js +4 -6
- package/dist/{tangle-id-gFOGXe4Y.d.ts → tangle-id-Oy2z4W3p.d.ts} +1 -1
- package/dist/{types-DpKEBiX6.d.ts → types-DIis6QtV.d.ts} +1 -1
- package/dist/worker.d.ts +99 -0
- package/dist/worker.js +28 -0
- package/dist/worker.js.map +1 -0
- package/docs/repo-structure.md +29 -6
- package/package.json +10 -1
- package/dist/chunk-2GEGKSL5.js.map +0 -1
- package/dist/chunk-E2QYXDJQ.js +0 -147
- package/dist/chunk-E2QYXDJQ.js.map +0 -1
- package/dist/chunk-P4FFI752.js +0 -1
- package/dist/chunk-TWR2KAZG.js.map +0 -1
- package/dist/chunk-ZC3ZE7TN.js +0 -4849
- package/dist/chunk-ZC3ZE7TN.js.map +0 -1
- /package/dist/{chunk-P4FFI752.js.map → chunk-DED3J7F6.js.map} +0 -0
package/dist/mcp.js
CHANGED
|
@@ -2,18 +2,23 @@ import {
|
|
|
2
2
|
IntegrationError,
|
|
3
3
|
createCatalogExecutorProvider,
|
|
4
4
|
importMcpConnector
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-A4OJ5EQT.js";
|
|
6
|
+
import "./chunk-DED3J7F6.js";
|
|
6
7
|
import "./chunk-PIF635BP.js";
|
|
7
8
|
import "./chunk-PIEBVPSW.js";
|
|
8
9
|
import "./chunk-H4XYLS7T.js";
|
|
9
10
|
import "./chunk-ABWBYMCF.js";
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-P4FFI752.js";
|
|
13
|
-
import "./chunk-E2QYXDJQ.js";
|
|
11
|
+
import "./chunk-RSJRICPU.js";
|
|
12
|
+
import "./chunk-ABA4HWIQ.js";
|
|
14
13
|
import "./chunk-QL6CRJ3E.js";
|
|
15
14
|
import "./chunk-XC54EOUQ.js";
|
|
16
15
|
import "./chunk-DCSQH4O6.js";
|
|
16
|
+
import "./chunk-QVWTBQXP.js";
|
|
17
|
+
import "./chunk-WPQJK4S4.js";
|
|
18
|
+
import "./chunk-QWOX5SIM.js";
|
|
19
|
+
import "./chunk-MH4IEJCL.js";
|
|
20
|
+
import "./chunk-GIK6EXU2.js";
|
|
21
|
+
import "./chunk-ESY2FBBM.js";
|
|
17
22
|
import "./chunk-PZ5AY32C.js";
|
|
18
23
|
|
|
19
24
|
// src/mcp.ts
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp.ts"],"sourcesContent":["/**\n * Live MCP connector — attach a remote MCP (Model Context Protocol) server\n * as an {@link IntegrationProvider}, so its tools flow through the same\n * catalog / grants / approvals machinery as every other connector instead of\n * forming a parallel, ungoverned tool path.\n *\n * Transport is Streamable HTTP only (single POST endpoint, JSON or SSE\n * response framing) — this package runs in edge workers, so stdio servers are\n * out of scope; front them with any HTTP-bridging MCP host.\n *\n * Discovery reuses {@link importMcpConnector}: `tools/list` output becomes an\n * `IntegrationConnector` whose per-action risk comes from MCP tool\n * annotations (readOnlyHint / destructiveHint) with a text-heuristic\n * fallback, so non-read MCP tools default to `approvalRequired` — fail-closed\n * against servers that don't annotate.\n *\n * Credentials: the server's auth header is supplied at construction by the\n * product (which owns secret storage) and held in memory only. Connection\n * rows carry no MCP secrets.\n */\n\nimport { IntegrationError } from './core-error.js'\nimport type {\n IntegrationActionResult,\n IntegrationActionRisk,\n IntegrationConnector,\n IntegrationConnectorCategory,\n IntegrationDataClass,\n IntegrationProvider,\n} from './core-types.js'\nimport { createCatalogExecutorProvider } from './catalog-executor.js'\nimport { importMcpConnector, type McpCatalogTool } from './importers.js'\n\n/** Protocol revision sent on `initialize` and the `MCP-Protocol-Version`\n * header. Servers negotiate down from this. */\nexport const MCP_PROTOCOL_VERSION = '2025-06-18'\n\nexport interface McpServerConfig {\n /** The server's single Streamable-HTTP endpoint. */\n url: string\n /** Static request headers — typically `{ Authorization: 'Bearer …' }`.\n * Held in memory only; never persisted by this module. */\n headers?: Record<string, string>\n protocolVersion?: string\n clientInfo?: { name: string; version: string }\n /** Injectable for tests / custom egress policies (SSRF pinning). */\n fetchImpl?: typeof fetch\n}\n\nexport interface McpToolCallResult {\n /** MCP content blocks (text, image, resource, …) verbatim. */\n content: unknown[]\n isError: boolean\n /** `structuredContent` from servers that return it. */\n structured?: unknown\n}\n\ninterface JsonRpcResponse {\n jsonrpc: '2.0'\n id?: number | string | null\n result?: unknown\n error?: { code: number; message: string; data?: unknown }\n}\n\n/**\n * Minimal Streamable-HTTP MCP client: `initialize` handshake (capturing the\n * server's `Mcp-Session-Id`), paginated `tools/list`, and `tools/call`.\n * Lazily initializes on first use; safe to share across calls within an\n * isolate.\n */\nexport class McpHttpClient {\n private nextId = 1\n private sessionId: string | undefined\n private negotiatedVersion: string | undefined\n private initializing: Promise<void> | undefined\n\n constructor(private readonly config: McpServerConfig) {}\n\n private get fetchImpl(): typeof fetch {\n return this.config.fetchImpl ?? fetch\n }\n\n private async post(body: Record<string, unknown>): Promise<JsonRpcResponse | undefined> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n ...(this.config.headers ?? {}),\n }\n const version = this.negotiatedVersion ?? this.config.protocolVersion ?? MCP_PROTOCOL_VERSION\n headers['MCP-Protocol-Version'] = version\n if (this.sessionId) headers['Mcp-Session-Id'] = this.sessionId\n\n let response: Response\n try {\n response = await this.fetchImpl(this.config.url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n })\n } catch (error) {\n throw new IntegrationError(\n `MCP server unreachable: ${error instanceof Error ? error.message : String(error)}`,\n 'provider_failure',\n )\n }\n const session = response.headers.get('mcp-session-id')\n if (session) this.sessionId = session\n\n if (!response.ok) {\n throw new IntegrationError(`MCP server returned HTTP ${response.status}`, 'provider_failure')\n }\n // Notifications get 202/204 with no body.\n if (body.id === undefined) return undefined\n const contentType = response.headers.get('content-type') ?? ''\n const text = await response.text()\n const message = contentType.includes('text/event-stream')\n ? findSseResponse(text, body.id as number)\n : (JSON.parse(text) as JsonRpcResponse)\n if (!message) {\n throw new IntegrationError('MCP server response missing a result for the request', 'provider_failure')\n }\n if (message.error) {\n throw new IntegrationError(`MCP error ${message.error.code}: ${message.error.message}`, 'provider_failure')\n }\n return message\n }\n\n private async request(method: string, params?: Record<string, unknown>): Promise<unknown> {\n const response = await this.post({ jsonrpc: '2.0', id: this.nextId++, method, ...(params ? { params } : {}) })\n return response?.result\n }\n\n /** Idempotent handshake; concurrent callers share one in-flight init. */\n async initialize(): Promise<void> {\n if (this.negotiatedVersion) return\n this.initializing ??= (async () => {\n const result = (await this.request('initialize', {\n protocolVersion: this.config.protocolVersion ?? MCP_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: this.config.clientInfo ?? { name: 'tangle-agent-integrations', version: '1' },\n })) as { protocolVersion?: string } | undefined\n this.negotiatedVersion = result?.protocolVersion ?? this.config.protocolVersion ?? MCP_PROTOCOL_VERSION\n await this.post({ jsonrpc: '2.0', method: 'notifications/initialized' })\n })().catch((error) => {\n this.initializing = undefined\n throw error\n })\n await this.initializing\n }\n\n /** Full tool catalog, following `nextCursor` pagination. */\n async listTools(): Promise<McpCatalogTool[]> {\n await this.initialize()\n const tools: McpCatalogTool[] = []\n let cursor: string | undefined\n do {\n const result = (await this.request('tools/list', cursor ? { cursor } : {})) as\n | { tools?: McpCatalogTool[]; nextCursor?: string }\n | undefined\n tools.push(...(result?.tools ?? []))\n cursor = result?.nextCursor\n } while (cursor)\n return tools\n }\n\n async callTool(name: string, args: unknown): Promise<McpToolCallResult> {\n await this.initialize()\n const result = (await this.request('tools/call', { name, arguments: args ?? {} })) as\n | { content?: unknown[]; isError?: boolean; structuredContent?: unknown }\n | undefined\n return {\n content: result?.content ?? [],\n isError: result?.isError === true,\n structured: result?.structuredContent,\n }\n }\n}\n\nexport interface CreateMcpProviderOptions {\n /** Provider id, unique within the hub (e.g. `mcp:linear`). */\n id: string\n server: McpServerConfig\n connectorId: string\n connectorTitle: string\n category?: IntegrationConnectorCategory\n scopes?: string[]\n dataClass?: IntegrationDataClass\n /** Risk for tools whose annotations/name don't classify them. Defaults to\n * 'write' (⇒ approvalRequired) — fail-closed. */\n defaultRisk?: IntegrationActionRisk\n}\n\n/** Discover a live MCP server's tools as an {@link IntegrationConnector}. */\nexport async function discoverMcpConnector(\n client: McpHttpClient,\n options: CreateMcpProviderOptions,\n): Promise<IntegrationConnector> {\n const tools = await client.listTools()\n return importMcpConnector(\n { tools },\n {\n providerId: options.id,\n connectorId: options.connectorId,\n connectorTitle: options.connectorTitle,\n category: options.category,\n auth: 'custom',\n scopes: options.scopes,\n dataClass: options.dataClass,\n defaultRisk: options.defaultRisk ?? 'write',\n },\n )\n}\n\n/**\n * Build an {@link IntegrationProvider} over one remote MCP server: live\n * `tools/list` discovery at construction, `tools/call` on invoke. A tool\n * result with `isError` maps to `{ ok: false }` (the model sees the failure\n * content); transport and JSON-RPC failures throw {@link IntegrationError}.\n */\nexport async function createMcpProvider(options: CreateMcpProviderOptions): Promise<IntegrationProvider> {\n const client = new McpHttpClient(options.server)\n const connector = await discoverMcpConnector(client, options)\n return createCatalogExecutorProvider({\n id: options.id,\n kind: 'mcp',\n connectors: [connector],\n async executeAction({ request, action }): Promise<IntegrationActionResult> {\n const result = await client.callTool(action.id, request.input)\n return {\n ok: !result.isError,\n action: action.id,\n output: result.structured ?? result.content,\n metadata: { mcp: true, ...(result.isError ? { isError: true } : {}) },\n }\n },\n })\n}\n\nfunction findSseResponse(body: string, id: number): JsonRpcResponse | undefined {\n for (const event of body.split(/\\n\\n/)) {\n const data = event\n .split('\\n')\n .filter((line) => line.startsWith('data:'))\n .map((line) => line.slice(5).trim())\n .join('')\n if (!data) continue\n try {\n const parsed = JSON.parse(data) as JsonRpcResponse\n if (parsed.id === id) return parsed\n } catch {\n // non-JSON SSE frame (keepalive/comment) — skip\n }\n }\n return undefined\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/mcp.ts"],"sourcesContent":["/**\n * Live MCP connector — attach a remote MCP (Model Context Protocol) server\n * as an {@link IntegrationProvider}, so its tools flow through the same\n * catalog / grants / approvals machinery as every other connector instead of\n * forming a parallel, ungoverned tool path.\n *\n * Transport is Streamable HTTP only (single POST endpoint, JSON or SSE\n * response framing) — this package runs in edge workers, so stdio servers are\n * out of scope; front them with any HTTP-bridging MCP host.\n *\n * Discovery reuses {@link importMcpConnector}: `tools/list` output becomes an\n * `IntegrationConnector` whose per-action risk comes from MCP tool\n * annotations (readOnlyHint / destructiveHint) with a text-heuristic\n * fallback, so non-read MCP tools default to `approvalRequired` — fail-closed\n * against servers that don't annotate.\n *\n * Credentials: the server's auth header is supplied at construction by the\n * product (which owns secret storage) and held in memory only. Connection\n * rows carry no MCP secrets.\n */\n\nimport { IntegrationError } from './core-error.js'\nimport type {\n IntegrationActionResult,\n IntegrationActionRisk,\n IntegrationConnector,\n IntegrationConnectorCategory,\n IntegrationDataClass,\n IntegrationProvider,\n} from './core-types.js'\nimport { createCatalogExecutorProvider } from './catalog-executor.js'\nimport { importMcpConnector, type McpCatalogTool } from './importers.js'\n\n/** Protocol revision sent on `initialize` and the `MCP-Protocol-Version`\n * header. Servers negotiate down from this. */\nexport const MCP_PROTOCOL_VERSION = '2025-06-18'\n\nexport interface McpServerConfig {\n /** The server's single Streamable-HTTP endpoint. */\n url: string\n /** Static request headers — typically `{ Authorization: 'Bearer …' }`.\n * Held in memory only; never persisted by this module. */\n headers?: Record<string, string>\n protocolVersion?: string\n clientInfo?: { name: string; version: string }\n /** Injectable for tests / custom egress policies (SSRF pinning). */\n fetchImpl?: typeof fetch\n}\n\nexport interface McpToolCallResult {\n /** MCP content blocks (text, image, resource, …) verbatim. */\n content: unknown[]\n isError: boolean\n /** `structuredContent` from servers that return it. */\n structured?: unknown\n}\n\ninterface JsonRpcResponse {\n jsonrpc: '2.0'\n id?: number | string | null\n result?: unknown\n error?: { code: number; message: string; data?: unknown }\n}\n\n/**\n * Minimal Streamable-HTTP MCP client: `initialize` handshake (capturing the\n * server's `Mcp-Session-Id`), paginated `tools/list`, and `tools/call`.\n * Lazily initializes on first use; safe to share across calls within an\n * isolate.\n */\nexport class McpHttpClient {\n private nextId = 1\n private sessionId: string | undefined\n private negotiatedVersion: string | undefined\n private initializing: Promise<void> | undefined\n\n constructor(private readonly config: McpServerConfig) {}\n\n private get fetchImpl(): typeof fetch {\n return this.config.fetchImpl ?? fetch\n }\n\n private async post(body: Record<string, unknown>): Promise<JsonRpcResponse | undefined> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n ...(this.config.headers ?? {}),\n }\n const version = this.negotiatedVersion ?? this.config.protocolVersion ?? MCP_PROTOCOL_VERSION\n headers['MCP-Protocol-Version'] = version\n if (this.sessionId) headers['Mcp-Session-Id'] = this.sessionId\n\n let response: Response\n try {\n response = await this.fetchImpl(this.config.url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n })\n } catch (error) {\n throw new IntegrationError(\n `MCP server unreachable: ${error instanceof Error ? error.message : String(error)}`,\n 'provider_failure',\n )\n }\n const session = response.headers.get('mcp-session-id')\n if (session) this.sessionId = session\n\n if (!response.ok) {\n throw new IntegrationError(`MCP server returned HTTP ${response.status}`, 'provider_failure')\n }\n // Notifications get 202/204 with no body.\n if (body.id === undefined) return undefined\n const contentType = response.headers.get('content-type') ?? ''\n const text = await response.text()\n const message = contentType.includes('text/event-stream')\n ? findSseResponse(text, body.id as number)\n : (JSON.parse(text) as JsonRpcResponse)\n if (!message) {\n throw new IntegrationError('MCP server response missing a result for the request', 'provider_failure')\n }\n if (message.error) {\n throw new IntegrationError(`MCP error ${message.error.code}: ${message.error.message}`, 'provider_failure')\n }\n return message\n }\n\n private async request(method: string, params?: Record<string, unknown>): Promise<unknown> {\n const response = await this.post({ jsonrpc: '2.0', id: this.nextId++, method, ...(params ? { params } : {}) })\n return response?.result\n }\n\n /** Idempotent handshake; concurrent callers share one in-flight init. */\n async initialize(): Promise<void> {\n if (this.negotiatedVersion) return\n this.initializing ??= (async () => {\n const result = (await this.request('initialize', {\n protocolVersion: this.config.protocolVersion ?? MCP_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: this.config.clientInfo ?? { name: 'tangle-agent-integrations', version: '1' },\n })) as { protocolVersion?: string } | undefined\n this.negotiatedVersion = result?.protocolVersion ?? this.config.protocolVersion ?? MCP_PROTOCOL_VERSION\n await this.post({ jsonrpc: '2.0', method: 'notifications/initialized' })\n })().catch((error) => {\n this.initializing = undefined\n throw error\n })\n await this.initializing\n }\n\n /** Full tool catalog, following `nextCursor` pagination. */\n async listTools(): Promise<McpCatalogTool[]> {\n await this.initialize()\n const tools: McpCatalogTool[] = []\n let cursor: string | undefined\n do {\n const result = (await this.request('tools/list', cursor ? { cursor } : {})) as\n | { tools?: McpCatalogTool[]; nextCursor?: string }\n | undefined\n tools.push(...(result?.tools ?? []))\n cursor = result?.nextCursor\n } while (cursor)\n return tools\n }\n\n async callTool(name: string, args: unknown): Promise<McpToolCallResult> {\n await this.initialize()\n const result = (await this.request('tools/call', { name, arguments: args ?? {} })) as\n | { content?: unknown[]; isError?: boolean; structuredContent?: unknown }\n | undefined\n return {\n content: result?.content ?? [],\n isError: result?.isError === true,\n structured: result?.structuredContent,\n }\n }\n}\n\nexport interface CreateMcpProviderOptions {\n /** Provider id, unique within the hub (e.g. `mcp:linear`). */\n id: string\n server: McpServerConfig\n connectorId: string\n connectorTitle: string\n category?: IntegrationConnectorCategory\n scopes?: string[]\n dataClass?: IntegrationDataClass\n /** Risk for tools whose annotations/name don't classify them. Defaults to\n * 'write' (⇒ approvalRequired) — fail-closed. */\n defaultRisk?: IntegrationActionRisk\n}\n\n/** Discover a live MCP server's tools as an {@link IntegrationConnector}. */\nexport async function discoverMcpConnector(\n client: McpHttpClient,\n options: CreateMcpProviderOptions,\n): Promise<IntegrationConnector> {\n const tools = await client.listTools()\n return importMcpConnector(\n { tools },\n {\n providerId: options.id,\n connectorId: options.connectorId,\n connectorTitle: options.connectorTitle,\n category: options.category,\n auth: 'custom',\n scopes: options.scopes,\n dataClass: options.dataClass,\n defaultRisk: options.defaultRisk ?? 'write',\n },\n )\n}\n\n/**\n * Build an {@link IntegrationProvider} over one remote MCP server: live\n * `tools/list` discovery at construction, `tools/call` on invoke. A tool\n * result with `isError` maps to `{ ok: false }` (the model sees the failure\n * content); transport and JSON-RPC failures throw {@link IntegrationError}.\n */\nexport async function createMcpProvider(options: CreateMcpProviderOptions): Promise<IntegrationProvider> {\n const client = new McpHttpClient(options.server)\n const connector = await discoverMcpConnector(client, options)\n return createCatalogExecutorProvider({\n id: options.id,\n kind: 'mcp',\n connectors: [connector],\n async executeAction({ request, action }): Promise<IntegrationActionResult> {\n const result = await client.callTool(action.id, request.input)\n return {\n ok: !result.isError,\n action: action.id,\n output: result.structured ?? result.content,\n metadata: { mcp: true, ...(result.isError ? { isError: true } : {}) },\n }\n },\n })\n}\n\nfunction findSseResponse(body: string, id: number): JsonRpcResponse | undefined {\n for (const event of body.split(/\\n\\n/)) {\n const data = event\n .split('\\n')\n .filter((line) => line.startsWith('data:'))\n .map((line) => line.slice(5).trim())\n .join('')\n if (!data) continue\n try {\n const parsed = JSON.parse(data) as JsonRpcResponse\n if (parsed.id === id) return parsed\n } catch {\n // non-JSON SSE frame (keepalive/comment) — skip\n }\n }\n return undefined\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { T as TangleIdentityOptions, b as TangleIdentityClient, c as TangleTokenVerifyFailure } from '../tangle-id-
|
|
2
|
-
import '../types-
|
|
1
|
+
import { T as TangleIdentityOptions, b as TangleIdentityClient, c as TangleTokenVerifyFailure } from '../tangle-id-Oy2z4W3p.js';
|
|
2
|
+
import '../types-DIis6QtV.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @stable Drop-in request middleware that verifies id.tangle.tools
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { e as IntegrationConnector, i as IntegrationCatalogSource } from './core-types-DZJQRBya.js';
|
|
2
|
+
|
|
3
|
+
type IntegrationSupportTier = 'catalogOnly' | 'setupReady' | 'gatewayExecutable' | 'firstPartyExecutable' | 'sandboxExecutable';
|
|
4
|
+
interface IntegrationRegistrySourceRef {
|
|
5
|
+
sourceId: string;
|
|
6
|
+
providerId: string;
|
|
7
|
+
connectorId: string;
|
|
8
|
+
supportTier: IntegrationSupportTier;
|
|
9
|
+
actionCount: number;
|
|
10
|
+
triggerCount: number;
|
|
11
|
+
}
|
|
12
|
+
interface IntegrationRegistryConflict {
|
|
13
|
+
field: 'auth' | 'category';
|
|
14
|
+
values: Array<{
|
|
15
|
+
value: string;
|
|
16
|
+
sourceId: string;
|
|
17
|
+
connectorId: string;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
interface IntegrationRegistryEntry {
|
|
21
|
+
canonicalId: string;
|
|
22
|
+
connector: IntegrationConnector;
|
|
23
|
+
aliases: string[];
|
|
24
|
+
supportTier: IntegrationSupportTier;
|
|
25
|
+
sources: IntegrationRegistrySourceRef[];
|
|
26
|
+
conflicts: IntegrationRegistryConflict[];
|
|
27
|
+
}
|
|
28
|
+
interface IntegrationRegistry {
|
|
29
|
+
entries: IntegrationRegistryEntry[];
|
|
30
|
+
connectors: IntegrationConnector[];
|
|
31
|
+
byId: Map<string, IntegrationRegistryEntry>;
|
|
32
|
+
}
|
|
33
|
+
interface IntegrationRegistrySummary {
|
|
34
|
+
totalEntries: number;
|
|
35
|
+
totalSources: number;
|
|
36
|
+
toolBindableEntries: number;
|
|
37
|
+
conflictEntries: number;
|
|
38
|
+
bySupportTier: Record<IntegrationSupportTier, number>;
|
|
39
|
+
}
|
|
40
|
+
interface ComposeIntegrationRegistryOptions {
|
|
41
|
+
aliases?: Record<string, string>;
|
|
42
|
+
sourcePrecedence?: Record<string, number>;
|
|
43
|
+
}
|
|
44
|
+
declare function composeIntegrationRegistry(sources: IntegrationCatalogSource[], options?: ComposeIntegrationRegistryOptions): IntegrationRegistry;
|
|
45
|
+
declare function summarizeIntegrationRegistry(registry: IntegrationRegistry): IntegrationRegistrySummary;
|
|
46
|
+
declare function canonicalConnectorId(id: string, aliases?: Record<string, string>): string;
|
|
47
|
+
declare function inferIntegrationSupportTier(connector: IntegrationConnector): IntegrationSupportTier;
|
|
48
|
+
|
|
49
|
+
export { type ComposeIntegrationRegistryOptions as C, type IntegrationSupportTier as I, type IntegrationRegistry as a, type IntegrationRegistryConflict as b, type IntegrationRegistryEntry as c, type IntegrationRegistrySourceRef as d, type IntegrationRegistrySummary as e, canonicalConnectorId as f, composeIntegrationRegistry as g, inferIntegrationSupportTier as i, summarizeIntegrationRegistry as s };
|
package/dist/registry.d.ts
CHANGED
|
@@ -1,47 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import './
|
|
1
|
+
import { e as IntegrationConnector } from './core-types-DZJQRBya.js';
|
|
2
|
+
import { I as IntegrationSupportTier, a as IntegrationRegistry } from './registry-core-DqdQjTkh.js';
|
|
3
|
+
export { C as ComposeIntegrationRegistryOptions, b as IntegrationRegistryConflict, c as IntegrationRegistryEntry, d as IntegrationRegistrySourceRef, e as IntegrationRegistrySummary, f as canonicalConnectorId, g as composeIntegrationRegistry, i as inferIntegrationSupportTier, s as summarizeIntegrationRegistry } from './registry-core-DqdQjTkh.js';
|
|
4
|
+
import './types-DIis6QtV.js';
|
|
3
5
|
|
|
4
|
-
type IntegrationSupportTier = 'catalogOnly' | 'setupReady' | 'gatewayExecutable' | 'firstPartyExecutable' | 'sandboxExecutable';
|
|
5
|
-
interface IntegrationRegistrySourceRef {
|
|
6
|
-
sourceId: string;
|
|
7
|
-
providerId: string;
|
|
8
|
-
connectorId: string;
|
|
9
|
-
supportTier: IntegrationSupportTier;
|
|
10
|
-
actionCount: number;
|
|
11
|
-
triggerCount: number;
|
|
12
|
-
}
|
|
13
|
-
interface IntegrationRegistryConflict {
|
|
14
|
-
field: 'auth' | 'category';
|
|
15
|
-
values: Array<{
|
|
16
|
-
value: string;
|
|
17
|
-
sourceId: string;
|
|
18
|
-
connectorId: string;
|
|
19
|
-
}>;
|
|
20
|
-
}
|
|
21
|
-
interface IntegrationRegistryEntry {
|
|
22
|
-
canonicalId: string;
|
|
23
|
-
connector: IntegrationConnector;
|
|
24
|
-
aliases: string[];
|
|
25
|
-
supportTier: IntegrationSupportTier;
|
|
26
|
-
sources: IntegrationRegistrySourceRef[];
|
|
27
|
-
conflicts: IntegrationRegistryConflict[];
|
|
28
|
-
}
|
|
29
|
-
interface IntegrationRegistry {
|
|
30
|
-
entries: IntegrationRegistryEntry[];
|
|
31
|
-
connectors: IntegrationConnector[];
|
|
32
|
-
byId: Map<string, IntegrationRegistryEntry>;
|
|
33
|
-
}
|
|
34
|
-
interface IntegrationRegistrySummary {
|
|
35
|
-
totalEntries: number;
|
|
36
|
-
totalSources: number;
|
|
37
|
-
toolBindableEntries: number;
|
|
38
|
-
conflictEntries: number;
|
|
39
|
-
bySupportTier: Record<IntegrationSupportTier, number>;
|
|
40
|
-
}
|
|
41
|
-
interface ComposeIntegrationRegistryOptions {
|
|
42
|
-
aliases?: Record<string, string>;
|
|
43
|
-
sourcePrecedence?: Record<string, number>;
|
|
44
|
-
}
|
|
45
6
|
declare function buildDefaultIntegrationRegistry(options?: {
|
|
46
7
|
includeSpecs?: boolean;
|
|
47
8
|
includeTangleCatalog?: boolean;
|
|
@@ -68,11 +29,7 @@ interface IntegrationCatalogExecutability {
|
|
|
68
29
|
triggerCount: number;
|
|
69
30
|
}
|
|
70
31
|
/** Classify every entry in a composed registry by executability + auth kind
|
|
71
|
-
*
|
|
32
|
+
* WITHOUT executing anything. Defaults to {@link buildDefaultIntegrationRegistry}. */
|
|
72
33
|
declare function classifyIntegrationCatalogExecutability(registry?: IntegrationRegistry): IntegrationCatalogExecutability[];
|
|
73
|
-
declare function composeIntegrationRegistry(sources: IntegrationCatalogSource[], options?: ComposeIntegrationRegistryOptions): IntegrationRegistry;
|
|
74
|
-
declare function summarizeIntegrationRegistry(registry: IntegrationRegistry): IntegrationRegistrySummary;
|
|
75
|
-
declare function canonicalConnectorId(id: string, aliases?: Record<string, string>): string;
|
|
76
|
-
declare function inferIntegrationSupportTier(connector: IntegrationConnector): IntegrationSupportTier;
|
|
77
34
|
|
|
78
|
-
export { type
|
|
35
|
+
export { type IntegrationCatalogExecutability, IntegrationRegistry, IntegrationSupportTier, buildDefaultIntegrationRegistry, classifyIntegrationCatalogExecutability };
|
package/dist/registry.js
CHANGED
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildDefaultIntegrationRegistry,
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
inferIntegrationSupportTier,
|
|
7
|
-
summarizeIntegrationRegistry
|
|
8
|
-
} from "./chunk-ZC3ZE7TN.js";
|
|
3
|
+
classifyIntegrationCatalogExecutability
|
|
4
|
+
} from "./chunk-A4OJ5EQT.js";
|
|
5
|
+
import "./chunk-DED3J7F6.js";
|
|
9
6
|
import "./chunk-PIF635BP.js";
|
|
10
7
|
import "./chunk-PIEBVPSW.js";
|
|
11
8
|
import "./chunk-H4XYLS7T.js";
|
|
12
9
|
import "./chunk-ABWBYMCF.js";
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-P4FFI752.js";
|
|
16
|
-
import "./chunk-E2QYXDJQ.js";
|
|
10
|
+
import "./chunk-RSJRICPU.js";
|
|
11
|
+
import "./chunk-ABA4HWIQ.js";
|
|
17
12
|
import "./chunk-QL6CRJ3E.js";
|
|
18
13
|
import "./chunk-XC54EOUQ.js";
|
|
19
14
|
import "./chunk-DCSQH4O6.js";
|
|
15
|
+
import "./chunk-QVWTBQXP.js";
|
|
16
|
+
import {
|
|
17
|
+
canonicalConnectorId,
|
|
18
|
+
composeIntegrationRegistry,
|
|
19
|
+
inferIntegrationSupportTier,
|
|
20
|
+
summarizeIntegrationRegistry
|
|
21
|
+
} from "./chunk-WPQJK4S4.js";
|
|
22
|
+
import "./chunk-QWOX5SIM.js";
|
|
23
|
+
import "./chunk-MH4IEJCL.js";
|
|
24
|
+
import "./chunk-GIK6EXU2.js";
|
|
25
|
+
import "./chunk-ESY2FBBM.js";
|
|
20
26
|
import "./chunk-PZ5AY32C.js";
|
|
21
27
|
export {
|
|
22
28
|
buildDefaultIntegrationRegistry,
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IntegrationToolDefinition } from './catalog.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import './types-
|
|
2
|
+
import { I as IntegrationActor, f as IssuedIntegrationCapability, e as IntegrationConnector, d as IntegrationConnection } from './core-types-DZJQRBya.js';
|
|
3
|
+
import { c as IntegrationRegistryEntry, a as IntegrationRegistry } from './registry-core-DqdQjTkh.js';
|
|
4
|
+
import './types-DIis6QtV.js';
|
|
5
5
|
|
|
6
6
|
type IntegrationRequirementMode = 'read' | 'write' | 'trigger';
|
|
7
7
|
type IntegrationRequirementStatus = 'ready' | 'missing_connection' | 'not_executable' | 'unknown_connector';
|
package/dist/runtime.js
CHANGED
|
@@ -2,18 +2,9 @@ import {
|
|
|
2
2
|
InMemoryIntegrationGrantStore,
|
|
3
3
|
IntegrationRuntime,
|
|
4
4
|
createIntegrationRuntime
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-H4XYLS7T.js";
|
|
9
|
-
import "./chunk-ABWBYMCF.js";
|
|
10
|
-
import "./chunk-2GEGKSL5.js";
|
|
11
|
-
import "./chunk-TWR2KAZG.js";
|
|
12
|
-
import "./chunk-P4FFI752.js";
|
|
13
|
-
import "./chunk-E2QYXDJQ.js";
|
|
14
|
-
import "./chunk-QL6CRJ3E.js";
|
|
15
|
-
import "./chunk-XC54EOUQ.js";
|
|
16
|
-
import "./chunk-DCSQH4O6.js";
|
|
5
|
+
} from "./chunk-QVWTBQXP.js";
|
|
6
|
+
import "./chunk-WPQJK4S4.js";
|
|
7
|
+
import "./chunk-ESY2FBBM.js";
|
|
17
8
|
import "./chunk-PZ5AY32C.js";
|
|
18
9
|
export {
|
|
19
10
|
InMemoryIntegrationGrantStore,
|
package/dist/specs.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { O as OAuth2TokenClientAuthMethod, p as OAuth2UrlTemplateMetadataSpec } from './types-
|
|
1
|
+
import { h as IntegrationActionRisk, b as IntegrationDataClass, g as IntegrationConnectorCategory, a as IntegrationConnectorAction, G as IntegrationConnectorTrigger, e as IntegrationConnector } from './core-types-DZJQRBya.js';
|
|
2
|
+
import { O as OAuth2TokenClientAuthMethod, p as OAuth2UrlTemplateMetadataSpec } from './types-DIis6QtV.js';
|
|
3
3
|
|
|
4
4
|
type IntegrationAuthMode = 'oauth2' | 'api_key' | 'hmac' | 'none' | 'custom';
|
|
5
5
|
type IntegrationSpecStatus = 'catalog' | 'executable' | 'deprecated';
|
package/dist/specs.js
CHANGED
|
@@ -16,12 +16,10 @@ import {
|
|
|
16
16
|
validateCredentialFormat,
|
|
17
17
|
validateCredentialSet,
|
|
18
18
|
validateIntegrationSpec
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-XC54EOUQ.js";
|
|
24
|
-
import "./chunk-DCSQH4O6.js";
|
|
19
|
+
} from "./chunk-QWOX5SIM.js";
|
|
20
|
+
import "./chunk-MH4IEJCL.js";
|
|
21
|
+
import "./chunk-GIK6EXU2.js";
|
|
22
|
+
import "./chunk-ESY2FBBM.js";
|
|
25
23
|
import "./chunk-PZ5AY32C.js";
|
|
26
24
|
export {
|
|
27
25
|
INTEGRATION_FAMILIES,
|
|
@@ -539,4 +539,4 @@ interface ConnectorManifestValidationResult {
|
|
|
539
539
|
declare function validateConnectorManifest(manifest: ConnectorManifest): ConnectorManifestValidationResult;
|
|
540
540
|
declare function assertValidConnectorManifest(manifest: ConnectorManifest): void;
|
|
541
541
|
|
|
542
|
-
export { type AuthSpec as A, type ConnectorAdapter as C, type DataSourceMetadata as D, type EventHandlerResult as E, type InboundEvent as I, type OAuth2TokenClientAuthMethod as O, ProviderConfigError as P, type ResolvedDataSource as R, type TokenMetadataSource as T, type
|
|
542
|
+
export { type AuthSpec as A, type ConnectorAdapter as C, type DataSourceMetadata as D, type EventHandlerResult as E, type InboundEvent as I, type OAuth2TokenClientAuthMethod as O, ProviderConfigError as P, type ResolvedDataSource as R, type TokenMetadataSource as T, type ConnectorManifest as a, type ConnectorCredentials as b, type CASStrategy as c, type Capability as d, type CapabilityClass as e, type CapabilityMutation as f, type CapabilityMutationResult as g, type CapabilityParameterSchema as h, type CapabilityRead as i, type CapabilityReadResult as j, type ConnectorInvocation as k, type ConnectorManifestValidationIssue as l, type ConnectorManifestValidationResult as m, type ConsistencyModel as n, CredentialsExpired as o, type OAuth2UrlTemplateMetadataSpec as p, type ProviderHttpErrorInit as q, ProviderRateLimited as r, type ProviderRateLimitedInit as s, type RateLimitSpec as t, ResourceContention as u, assertValidConnectorManifest as v, validateConnectorManifest as w };
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { c as IntegrationActionGuard, m as IntegrationActionResult, p as IntegrationGuardContext, h as IntegrationActionRisk, b as IntegrationDataClass, n as IntegrationPolicyEngine, q as IntegrationPolicyDecision, o as IntegrationApprovalRequest } from './core-types-DZJQRBya.js';
|
|
2
|
+
export { C as CompleteAuthRequest, H as HttpIntegrationProviderOptions, l as IntegrationActionRequest, I as IntegrationActor, D as IntegrationCapability, i as IntegrationCatalogSource, d as IntegrationConnection, s as IntegrationConnectionStore, e as IntegrationConnector, a as IntegrationConnectorAction, g as IntegrationConnectorCategory, G as IntegrationConnectorTrigger, t as IntegrationCredentialsRotatedEvent, E as IntegrationHubOptions, v as IntegrationOAuthState, w as IntegrationOAuthStateOutcome, u as IntegrationOAuthStateStore, k as IntegrationProvider, j as IntegrationProviderKind, r as IntegrationSecretStore, y as IntegrationTriggerEvent, x as IntegrationTriggerSubscription, B as InvokeWithCapabilityRequest, F as IssueCapabilityRequest, f as IssuedIntegrationCapability, S as SecretRef, z as StartAuthRequest, A as StartAuthResult } from './core-types-DZJQRBya.js';
|
|
3
|
+
import { I as IntegrationAuditSink } from './audit-DMTzJQJU.js';
|
|
4
|
+
export { a as InMemoryIntegrationAuditStore, b as IntegrationAuditEvent, c as IntegrationAuditEventType, d as IntegrationAuditFilter, e as IntegrationAuditStore, f as createAuditingActionGuard, g as createIntegrationAuditEvent, s as sanitizeAuditConnection } from './audit-DMTzJQJU.js';
|
|
5
|
+
import './types-DIis6QtV.js';
|
|
6
|
+
|
|
7
|
+
interface IntegrationIdempotencyRecord {
|
|
8
|
+
key: string;
|
|
9
|
+
requestHash: string;
|
|
10
|
+
result: IntegrationActionResult;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
}
|
|
13
|
+
interface IntegrationIdempotencyStore {
|
|
14
|
+
get(key: string): Promise<IntegrationIdempotencyRecord | undefined> | IntegrationIdempotencyRecord | undefined;
|
|
15
|
+
put(record: IntegrationIdempotencyRecord): Promise<void> | void;
|
|
16
|
+
}
|
|
17
|
+
interface IntegrationRateLimitDecision {
|
|
18
|
+
allowed: boolean;
|
|
19
|
+
retryAfterMs?: number;
|
|
20
|
+
reason?: string;
|
|
21
|
+
}
|
|
22
|
+
interface IntegrationRateLimiter {
|
|
23
|
+
check(ctx: IntegrationGuardContext): Promise<IntegrationRateLimitDecision> | IntegrationRateLimitDecision;
|
|
24
|
+
}
|
|
25
|
+
declare class InMemoryIntegrationIdempotencyStore implements IntegrationIdempotencyStore {
|
|
26
|
+
private readonly records;
|
|
27
|
+
get(key: string): IntegrationIdempotencyRecord | undefined;
|
|
28
|
+
put(record: IntegrationIdempotencyRecord): void;
|
|
29
|
+
}
|
|
30
|
+
declare class DefaultIntegrationActionGuard implements IntegrationActionGuard {
|
|
31
|
+
private readonly idempotency;
|
|
32
|
+
private readonly audit;
|
|
33
|
+
private readonly rateLimiter;
|
|
34
|
+
private readonly requireIdempotencyForMutations;
|
|
35
|
+
private readonly now;
|
|
36
|
+
constructor(options?: {
|
|
37
|
+
idempotency?: IntegrationIdempotencyStore;
|
|
38
|
+
audit?: IntegrationAuditSink;
|
|
39
|
+
rateLimiter?: IntegrationRateLimiter;
|
|
40
|
+
requireIdempotencyForMutations?: boolean;
|
|
41
|
+
now?: () => Date;
|
|
42
|
+
});
|
|
43
|
+
invokeAction(ctx: IntegrationGuardContext, proceed: () => Promise<IntegrationActionResult>): Promise<IntegrationActionResult>;
|
|
44
|
+
private writeIdempotency;
|
|
45
|
+
}
|
|
46
|
+
declare function createDefaultIntegrationActionGuard(options?: ConstructorParameters<typeof DefaultIntegrationActionGuard>[0]): DefaultIntegrationActionGuard;
|
|
47
|
+
|
|
48
|
+
type IntegrationPolicyEffect = 'allow' | 'require_approval' | 'deny';
|
|
49
|
+
interface IntegrationPolicyRule {
|
|
50
|
+
id: string;
|
|
51
|
+
effect: IntegrationPolicyEffect;
|
|
52
|
+
reason: string;
|
|
53
|
+
providerId?: string;
|
|
54
|
+
connectorId?: string;
|
|
55
|
+
action?: string;
|
|
56
|
+
maxRisk?: IntegrationActionRisk;
|
|
57
|
+
risk?: IntegrationActionRisk;
|
|
58
|
+
dataClass?: IntegrationDataClass;
|
|
59
|
+
}
|
|
60
|
+
interface StaticIntegrationPolicyOptions {
|
|
61
|
+
rules?: IntegrationPolicyRule[];
|
|
62
|
+
defaultReadEffect?: IntegrationPolicyEffect;
|
|
63
|
+
defaultWriteEffect?: IntegrationPolicyEffect;
|
|
64
|
+
defaultDestructiveEffect?: IntegrationPolicyEffect;
|
|
65
|
+
now?: () => Date;
|
|
66
|
+
}
|
|
67
|
+
interface IntegrationApprovalResolution {
|
|
68
|
+
approvalId: string;
|
|
69
|
+
approved: boolean;
|
|
70
|
+
resolvedBy: string;
|
|
71
|
+
resolvedAt: string;
|
|
72
|
+
reason?: string;
|
|
73
|
+
metadata?: Record<string, unknown>;
|
|
74
|
+
}
|
|
75
|
+
declare class StaticIntegrationPolicyEngine implements IntegrationPolicyEngine {
|
|
76
|
+
private readonly rules;
|
|
77
|
+
private readonly defaultReadEffect;
|
|
78
|
+
private readonly defaultWriteEffect;
|
|
79
|
+
private readonly defaultDestructiveEffect;
|
|
80
|
+
private readonly now;
|
|
81
|
+
constructor(options?: StaticIntegrationPolicyOptions);
|
|
82
|
+
decide(ctx: IntegrationGuardContext & {
|
|
83
|
+
subject: {
|
|
84
|
+
type: string;
|
|
85
|
+
id: string;
|
|
86
|
+
};
|
|
87
|
+
}): IntegrationPolicyDecision;
|
|
88
|
+
private defaultEffect;
|
|
89
|
+
}
|
|
90
|
+
declare function createDefaultIntegrationPolicyEngine(options?: Omit<StaticIntegrationPolicyOptions, 'rules'>): StaticIntegrationPolicyEngine;
|
|
91
|
+
declare function buildApprovalRequest(ctx: IntegrationGuardContext & {
|
|
92
|
+
subject: {
|
|
93
|
+
type: string;
|
|
94
|
+
id: string;
|
|
95
|
+
};
|
|
96
|
+
}, reason: string, requestedAt: Date): IntegrationApprovalRequest;
|
|
97
|
+
declare function redactApprovalRequest(request: IntegrationApprovalRequest): IntegrationApprovalRequest;
|
|
98
|
+
|
|
99
|
+
export { DefaultIntegrationActionGuard, InMemoryIntegrationIdempotencyStore, IntegrationActionGuard, IntegrationActionResult, IntegrationActionRisk, IntegrationApprovalRequest, type IntegrationApprovalResolution, IntegrationAuditSink, IntegrationDataClass, IntegrationGuardContext, type IntegrationIdempotencyRecord, type IntegrationIdempotencyStore, IntegrationPolicyDecision, type IntegrationPolicyEffect, IntegrationPolicyEngine, type IntegrationPolicyRule, type IntegrationRateLimitDecision, type IntegrationRateLimiter, StaticIntegrationPolicyEngine, type StaticIntegrationPolicyOptions, buildApprovalRequest, createDefaultIntegrationActionGuard, createDefaultIntegrationPolicyEngine, redactApprovalRequest };
|
package/dist/worker.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DefaultIntegrationActionGuard,
|
|
3
|
+
InMemoryIntegrationAuditStore,
|
|
4
|
+
InMemoryIntegrationIdempotencyStore,
|
|
5
|
+
StaticIntegrationPolicyEngine,
|
|
6
|
+
buildApprovalRequest,
|
|
7
|
+
createAuditingActionGuard,
|
|
8
|
+
createDefaultIntegrationActionGuard,
|
|
9
|
+
createDefaultIntegrationPolicyEngine,
|
|
10
|
+
createIntegrationAuditEvent,
|
|
11
|
+
redactApprovalRequest,
|
|
12
|
+
sanitizeAuditConnection
|
|
13
|
+
} from "./chunk-RSJRICPU.js";
|
|
14
|
+
import "./chunk-PZ5AY32C.js";
|
|
15
|
+
export {
|
|
16
|
+
DefaultIntegrationActionGuard,
|
|
17
|
+
InMemoryIntegrationAuditStore,
|
|
18
|
+
InMemoryIntegrationIdempotencyStore,
|
|
19
|
+
StaticIntegrationPolicyEngine,
|
|
20
|
+
buildApprovalRequest,
|
|
21
|
+
createAuditingActionGuard,
|
|
22
|
+
createDefaultIntegrationActionGuard,
|
|
23
|
+
createDefaultIntegrationPolicyEngine,
|
|
24
|
+
createIntegrationAuditEvent,
|
|
25
|
+
redactApprovalRequest,
|
|
26
|
+
sanitizeAuditConnection
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/docs/repo-structure.md
CHANGED
|
@@ -20,17 +20,24 @@ This repo intentionally separates catalog breadth from executable runtime code.
|
|
|
20
20
|
`src/audit.ts`, `src/healthcheck.ts`, `src/credentials.ts`, and
|
|
21
21
|
`src/events.ts` are production control-plane primitives.
|
|
22
22
|
- `src/connectors/` contains first-party adapter contracts and implementations.
|
|
23
|
+
- `src/connectors/bundled-manifest-data.ts` contains the static manifest snapshot;
|
|
24
|
+
`src/connectors/bundled-manifests.ts` keeps runtime adapter discovery separate.
|
|
23
25
|
- `src/specs/` is the structured OAuth/setup/runbook source of truth.
|
|
24
|
-
- `src/registry.ts`, `src/
|
|
25
|
-
`src/tangle-catalog.ts` compose broad connector
|
|
26
|
-
execution behind configured native, gateway, or
|
|
26
|
+
- `src/registry-core.ts`, `src/registry.ts`, `src/gateway-catalog.ts`,
|
|
27
|
+
`src/coverage-catalog.ts`, and `src/tangle-catalog.ts` compose broad connector
|
|
28
|
+
catalogs while keeping execution behind configured native, gateway, or
|
|
29
|
+
sandbox runtimes.
|
|
30
|
+
- `src/worker.ts` is the Worker-safe entry point for guard, audit, policy, and
|
|
31
|
+
core contracts.
|
|
32
|
+
- `src/web-crypto.ts` provides the Web Crypto hashing and UUID helpers used by
|
|
33
|
+
the Worker-safe security primitives.
|
|
27
34
|
|
|
28
35
|
## Data
|
|
29
36
|
|
|
30
|
-
- Imported catalog JSON is large by design.
|
|
37
|
+
- Imported catalog JSON is large by design. Data-only runtime modules keep
|
|
31
38
|
long-tail discovery out of TypeScript source so `tsc --watch` does not
|
|
32
|
-
re-check a generated 40k-line module.
|
|
33
|
-
|
|
39
|
+
re-check a generated 40k-line module. Bundled `/specs` and `/catalog` data
|
|
40
|
+
does not import executable adapters or their Node-only clients.
|
|
34
41
|
|
|
35
42
|
## Build Artifacts
|
|
36
43
|
|
|
@@ -38,6 +45,22 @@ This repo intentionally separates catalog breadth from executable runtime code.
|
|
|
38
45
|
files to npm.
|
|
39
46
|
- `node_modules/` is local development state and is not published.
|
|
40
47
|
|
|
48
|
+
## Release Checks
|
|
49
|
+
|
|
50
|
+
- `scripts/generate-bundled-manifest-data.mjs` writes the adapter manifest
|
|
51
|
+
snapshot from the built runtime registry.
|
|
52
|
+
- `scripts/check-bundled-manifest-freshness.mjs` rejects stale snapshots during
|
|
53
|
+
`prepack` and in the publish workflow.
|
|
54
|
+
- `scripts/release.mjs` is the lifecycle-independent release entry point.
|
|
55
|
+
It builds, generates into a temporary file, checks freshness, packs one exact
|
|
56
|
+
archive, tests that archive, and publishes it only when `--publish` is set.
|
|
57
|
+
It skips an existing version only when the registry integrity matches the
|
|
58
|
+
tested archive.
|
|
59
|
+
- `scripts/test-release-artifact.mjs` verifies the metadata, exports, bundled
|
|
60
|
+
manifest freshness, and Worker entry point inside the exact archive.
|
|
61
|
+
- `tests/worker-safe-bundles.test.ts` packs the npm artifact and verifies the
|
|
62
|
+
`/worker`, `/specs`, and `/catalog` exports as browser bundles.
|
|
63
|
+
|
|
41
64
|
## Docs
|
|
42
65
|
|
|
43
66
|
- `docs/production-completion-checklist.md` defines what this package owns and
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tangle-network/agent-integrations",
|
|
3
|
-
"version": "0.53.
|
|
3
|
+
"version": "0.53.54",
|
|
4
4
|
"description": "Vendor-neutral integration contracts and runtime helpers for sandbox and agent apps.",
|
|
5
5
|
"homepage": "https://github.com/tangle-network/agent-integrations#readme",
|
|
6
6
|
"repository": {
|
|
@@ -24,6 +24,11 @@
|
|
|
24
24
|
"import": "./dist/catalog.js",
|
|
25
25
|
"default": "./dist/catalog.js"
|
|
26
26
|
},
|
|
27
|
+
"./worker": {
|
|
28
|
+
"types": "./dist/worker.d.ts",
|
|
29
|
+
"import": "./dist/worker.js",
|
|
30
|
+
"default": "./dist/worker.js"
|
|
31
|
+
},
|
|
27
32
|
"./connectors": {
|
|
28
33
|
"types": "./dist/connectors/index.d.ts",
|
|
29
34
|
"import": "./dist/connectors/index.js",
|
|
@@ -109,6 +114,7 @@
|
|
|
109
114
|
"@types/node": "^26.1.2",
|
|
110
115
|
"@types/pg": "8.20.0",
|
|
111
116
|
"@types/ssh2-sftp-client": "9.0.6",
|
|
117
|
+
"esbuild": "0.28.1",
|
|
112
118
|
"tsup": "^8.0.0",
|
|
113
119
|
"typescript": "^5.9.3",
|
|
114
120
|
"vite": "^8.1.5",
|
|
@@ -138,7 +144,10 @@
|
|
|
138
144
|
},
|
|
139
145
|
"scripts": {
|
|
140
146
|
"build": "tsup",
|
|
147
|
+
"generate:bundled-manifests": "pnpm build && node scripts/generate-bundled-manifest-data.mjs && pnpm build",
|
|
148
|
+
"check:bundled-manifest-freshness": "node scripts/check-bundled-manifest-freshness.mjs",
|
|
141
149
|
"dev": "tsup --watch",
|
|
150
|
+
"release": "node scripts/release.mjs",
|
|
142
151
|
"audit:execution": "pnpm build >/dev/null && node scripts/audit-integration-execution.mjs",
|
|
143
152
|
"test": "vitest run",
|
|
144
153
|
"test:watch": "vitest",
|