@tangle-network/agent-integrations 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/dist/bin/tangle-catalog-runtime.js +3 -2
- package/dist/bin/tangle-catalog-runtime.js.map +1 -1
- package/dist/catalog.js +3 -2
- package/dist/{chunk-UWRYFPJW.js → chunk-TUX6MJJ4.js} +1 -1
- package/dist/chunk-TUX6MJJ4.js.map +1 -0
- package/dist/chunk-YOKNZY2N.js +284 -0
- package/dist/chunk-YOKNZY2N.js.map +1 -0
- package/dist/consumer.d.ts +8 -0
- package/dist/consumer.js +12 -0
- package/dist/consumer.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +15 -7
- package/dist/registry.d.ts +240 -46
- package/dist/registry.js +3 -2
- package/dist/runtime.js +3 -2
- package/dist/specs.d.ts +1 -1
- package/dist/tangle-catalog-runtime.d.ts +1 -1
- package/dist/tangle-catalog-runtime.js +3 -2
- package/package.json +17 -10
- package/dist/chunk-UWRYFPJW.js.map +0 -1
package/README.md
CHANGED
|
@@ -288,6 +288,46 @@ For a full product checklist, see
|
|
|
288
288
|
[External Product Integration](./docs/external-product-integration.md) and
|
|
289
289
|
[Platform Control Plane Adoption](./docs/platform-control-plane.md).
|
|
290
290
|
|
|
291
|
+
## Consuming a Hosted Hub
|
|
292
|
+
|
|
293
|
+
`createIntegrationRuntime` is for a product that *hosts* a hub — it owns the
|
|
294
|
+
stores, the vault, and OAuth. A product that instead *consumes* a hosted hub
|
|
295
|
+
(`id.tangle.tools`) from its backend talks to it over HTTP with
|
|
296
|
+
`createIntegrationHubClient`:
|
|
297
|
+
|
|
298
|
+
```ts
|
|
299
|
+
import { createIntegrationHubClient } from '@tangle-network/agent-integrations/consumer'
|
|
300
|
+
|
|
301
|
+
const hub = createIntegrationHubClient({
|
|
302
|
+
product: 'blueprint-agent',
|
|
303
|
+
auth: {
|
|
304
|
+
mode: 'service',
|
|
305
|
+
serviceToken: process.env.SERVICE_TOKEN!,
|
|
306
|
+
serviceName: 'blueprint-agent',
|
|
307
|
+
},
|
|
308
|
+
})
|
|
309
|
+
|
|
310
|
+
// Is the user's GitHub connected? (resolve-manifest under the hood — the
|
|
311
|
+
// raw connection list is intentionally not service-token-reachable.)
|
|
312
|
+
const github = await hub.checkConnector({ userId, connectorId: 'github' })
|
|
313
|
+
|
|
314
|
+
// Mint a scoped, short-lived capability bundle for a sandbox process.
|
|
315
|
+
const { env } = await hub.mintCapabilityBundle({
|
|
316
|
+
userId,
|
|
317
|
+
subject: { type: 'sandbox', id: sandboxId },
|
|
318
|
+
manifestId: manifest.id,
|
|
319
|
+
})
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
The client speaks the platform's `/v1/integrations/*` surface and supports
|
|
323
|
+
both auth modes the route layer accepts — a `svc_*` service token
|
|
324
|
+
(`mode: 'service'`, acting user in `X-Platform-User-Id`) or a per-user
|
|
325
|
+
`sk-tan-*` key (`mode: 'user-key'`). It exposes the four service-token-reachable
|
|
326
|
+
operations — `resolveManifest`, `createGrants` / `listGrants`,
|
|
327
|
+
`mintCapabilityBundle`, `runHealthchecks` — plus the `checkConnector`
|
|
328
|
+
convenience. Provider credentials never cross this client; bundles carry only
|
|
329
|
+
short-lived capability tokens.
|
|
330
|
+
|
|
291
331
|
## Product Hub Ownership
|
|
292
332
|
|
|
293
333
|
Use a hosted hub when multiple apps intentionally share identity, billing,
|
|
@@ -4,14 +4,15 @@ import {
|
|
|
4
4
|
buildTangleCatalogRuntimePackageManifest,
|
|
5
5
|
renderTangleCatalogRuntimePnpmAddCommand,
|
|
6
6
|
startTangleCatalogRuntimeNodeServer
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-TUX6MJJ4.js";
|
|
8
|
+
import "../chunk-P24T3MLM.js";
|
|
8
9
|
import "../chunk-SVQ4PHDZ.js";
|
|
9
10
|
import "../chunk-H4XYLS7T.js";
|
|
11
|
+
import "../chunk-YOKNZY2N.js";
|
|
10
12
|
import "../chunk-4JQ754PA.js";
|
|
11
13
|
import "../chunk-376UBTNB.js";
|
|
12
14
|
import "../chunk-JU25UDN2.js";
|
|
13
15
|
import "../chunk-2TW2QKGZ.js";
|
|
14
|
-
import "../chunk-P24T3MLM.js";
|
|
15
16
|
import "../chunk-ATYHZXLL.js";
|
|
16
17
|
|
|
17
18
|
// src/bin/tangle-catalog-runtime.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/tangle-catalog-runtime.ts"],"sourcesContent":["#!/usr/bin/env node\nimport {\n buildTangleCatalogRuntimePackageManifest,\n renderTangleCatalogRuntimePnpmAddCommand,\n} from '../tangle-catalog.js'\nimport { auditTangleCatalogRuntimePackages } from '../tangle-catalog-runtime.js'\nimport { startTangleCatalogRuntimeNodeServer } from '../tangle-catalog-runtime-server.js'\n\nconst args = new Set(process.argv.slice(2))\nif (args.has('--print-package-json')) {\n console.log(JSON.stringify(buildTangleCatalogRuntimePackageManifest({\n agentIntegrationsVersion: process.env.TANGLE_AGENT_INTEGRATIONS_VERSION,\n }), null, 2))\n process.exit(0)\n}\n\nif (args.has('--print-pnpm-add')) {\n console.log(renderTangleCatalogRuntimePnpmAddCommand({\n agentIntegrationsVersion: process.env.TANGLE_AGENT_INTEGRATIONS_VERSION,\n }))\n process.exit(0)\n}\n\nif (args.has('--audit-packages')) {\n const connectorIds = process.env.TANGLE_CATALOG_AUDIT_CONNECTORS\n ?.split(',')\n .map((id) => id.trim())\n .filter(Boolean)\n console.log(JSON.stringify(await auditTangleCatalogRuntimePackages({ connectorIds }), null, 2))\n process.exit(0)\n}\n\nconst secret = process.env.TANGLE_CATALOG_RUNTIME_SECRET\nif (!secret || secret.length < 32) {\n console.error('TANGLE_CATALOG_RUNTIME_SECRET must be set to at least 32 characters.')\n process.exit(1)\n}\n\nconst authResolverUrl = process.env.TANGLE_CATALOG_AUTH_RESOLVER_URL\nconst authResolverSecret = process.env.TANGLE_CATALOG_AUTH_RESOLVER_SECRET\nif (Boolean(authResolverUrl) !== Boolean(authResolverSecret)) {\n console.error('TANGLE_CATALOG_AUTH_RESOLVER_URL and TANGLE_CATALOG_AUTH_RESOLVER_SECRET must be set together.')\n process.exit(1)\n}\n\nconst port = Number(process.env.PORT ?? process.env.TANGLE_CATALOG_RUNTIME_PORT ?? 4109)\nif (!Number.isInteger(port) || port < 1 || port > 65_535) {\n console.error('PORT must be an integer between 1 and 65535.')\n process.exit(1)\n}\n\nconst server = await startTangleCatalogRuntimeNodeServer({\n secret,\n host: process.env.HOST ?? process.env.TANGLE_CATALOG_RUNTIME_HOST ?? '0.0.0.0',\n port,\n authResolver: authResolverUrl && authResolverSecret\n ? {\n endpoint: authResolverUrl,\n secret: authResolverSecret,\n }\n : false,\n onLog: (event) => {\n const line = JSON.stringify({\n level: event.level,\n message: event.message,\n ...event.metadata,\n })\n if (event.level === 'error') console.error(line)\n else console.log(line)\n },\n})\n\nconsole.log(JSON.stringify({\n level: 'info',\n message: 'Tangle catalog runtime listening.',\n url: server.url,\n}))\n\nfor (const signal of ['SIGINT', 'SIGTERM'] as const) {\n process.once(signal, async () => {\n await server.close()\n process.exit(0)\n })\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/bin/tangle-catalog-runtime.ts"],"sourcesContent":["#!/usr/bin/env node\nimport {\n buildTangleCatalogRuntimePackageManifest,\n renderTangleCatalogRuntimePnpmAddCommand,\n} from '../tangle-catalog.js'\nimport { auditTangleCatalogRuntimePackages } from '../tangle-catalog-runtime.js'\nimport { startTangleCatalogRuntimeNodeServer } from '../tangle-catalog-runtime-server.js'\n\nconst args = new Set(process.argv.slice(2))\nif (args.has('--print-package-json')) {\n console.log(JSON.stringify(buildTangleCatalogRuntimePackageManifest({\n agentIntegrationsVersion: process.env.TANGLE_AGENT_INTEGRATIONS_VERSION,\n }), null, 2))\n process.exit(0)\n}\n\nif (args.has('--print-pnpm-add')) {\n console.log(renderTangleCatalogRuntimePnpmAddCommand({\n agentIntegrationsVersion: process.env.TANGLE_AGENT_INTEGRATIONS_VERSION,\n }))\n process.exit(0)\n}\n\nif (args.has('--audit-packages')) {\n const connectorIds = process.env.TANGLE_CATALOG_AUDIT_CONNECTORS\n ?.split(',')\n .map((id) => id.trim())\n .filter(Boolean)\n console.log(JSON.stringify(await auditTangleCatalogRuntimePackages({ connectorIds }), null, 2))\n process.exit(0)\n}\n\nconst secret = process.env.TANGLE_CATALOG_RUNTIME_SECRET\nif (!secret || secret.length < 32) {\n console.error('TANGLE_CATALOG_RUNTIME_SECRET must be set to at least 32 characters.')\n process.exit(1)\n}\n\nconst authResolverUrl = process.env.TANGLE_CATALOG_AUTH_RESOLVER_URL\nconst authResolverSecret = process.env.TANGLE_CATALOG_AUTH_RESOLVER_SECRET\nif (Boolean(authResolverUrl) !== Boolean(authResolverSecret)) {\n console.error('TANGLE_CATALOG_AUTH_RESOLVER_URL and TANGLE_CATALOG_AUTH_RESOLVER_SECRET must be set together.')\n process.exit(1)\n}\n\nconst port = Number(process.env.PORT ?? process.env.TANGLE_CATALOG_RUNTIME_PORT ?? 4109)\nif (!Number.isInteger(port) || port < 1 || port > 65_535) {\n console.error('PORT must be an integer between 1 and 65535.')\n process.exit(1)\n}\n\nconst server = await startTangleCatalogRuntimeNodeServer({\n secret,\n host: process.env.HOST ?? process.env.TANGLE_CATALOG_RUNTIME_HOST ?? '0.0.0.0',\n port,\n authResolver: authResolverUrl && authResolverSecret\n ? {\n endpoint: authResolverUrl,\n secret: authResolverSecret,\n }\n : false,\n onLog: (event) => {\n const line = JSON.stringify({\n level: event.level,\n message: event.message,\n ...event.metadata,\n })\n if (event.level === 'error') console.error(line)\n else console.log(line)\n },\n})\n\nconsole.log(JSON.stringify({\n level: 'info',\n message: 'Tangle catalog runtime listening.',\n url: server.url,\n}))\n\nfor (const signal of ['SIGINT', 'SIGTERM'] as const) {\n process.once(signal, async () => {\n await server.close()\n process.exit(0)\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAQA,IAAM,OAAO,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC,CAAC;AAC1C,IAAI,KAAK,IAAI,sBAAsB,GAAG;AACpC,UAAQ,IAAI,KAAK,UAAU,yCAAyC;AAAA,IAClE,0BAA0B,QAAQ,IAAI;AAAA,EACxC,CAAC,GAAG,MAAM,CAAC,CAAC;AACZ,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAI,KAAK,IAAI,kBAAkB,GAAG;AAChC,UAAQ,IAAI,yCAAyC;AAAA,IACnD,0BAA0B,QAAQ,IAAI;AAAA,EACxC,CAAC,CAAC;AACF,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAI,KAAK,IAAI,kBAAkB,GAAG;AAChC,QAAM,eAAe,QAAQ,IAAI,iCAC7B,MAAM,GAAG,EACV,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,EACrB,OAAO,OAAO;AACjB,UAAQ,IAAI,KAAK,UAAU,MAAM,kCAAkC,EAAE,aAAa,CAAC,GAAG,MAAM,CAAC,CAAC;AAC9F,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,SAAS,QAAQ,IAAI;AAC3B,IAAI,CAAC,UAAU,OAAO,SAAS,IAAI;AACjC,UAAQ,MAAM,sEAAsE;AACpF,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,kBAAkB,QAAQ,IAAI;AACpC,IAAM,qBAAqB,QAAQ,IAAI;AACvC,IAAI,QAAQ,eAAe,MAAM,QAAQ,kBAAkB,GAAG;AAC5D,UAAQ,MAAM,gGAAgG;AAC9G,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,OAAO,OAAO,QAAQ,IAAI,QAAQ,QAAQ,IAAI,+BAA+B,IAAI;AACvF,IAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,OAAQ;AACxD,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,SAAS,MAAM,oCAAoC;AAAA,EACvD;AAAA,EACA,MAAM,QAAQ,IAAI,QAAQ,QAAQ,IAAI,+BAA+B;AAAA,EACrE;AAAA,EACA,cAAc,mBAAmB,qBAC7B;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,IACA;AAAA,EACJ,OAAO,CAAC,UAAU;AAChB,UAAM,OAAO,KAAK,UAAU;AAAA,MAC1B,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,GAAG,MAAM;AAAA,IACX,CAAC;AACD,QAAI,MAAM,UAAU,QAAS,SAAQ,MAAM,IAAI;AAAA,QAC1C,SAAQ,IAAI,IAAI;AAAA,EACvB;AACF,CAAC;AAED,QAAQ,IAAI,KAAK,UAAU;AAAA,EACzB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,KAAK,OAAO;AACd,CAAC,CAAC;AAEF,WAAW,UAAU,CAAC,UAAU,SAAS,GAAY;AACnD,UAAQ,KAAK,QAAQ,YAAY;AAC/B,UAAM,OAAO,MAAM;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;","names":[]}
|
package/dist/catalog.js
CHANGED
|
@@ -5,14 +5,15 @@ import {
|
|
|
5
5
|
parseIntegrationToolName,
|
|
6
6
|
searchIntegrationTools,
|
|
7
7
|
toMcpTools
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-TUX6MJJ4.js";
|
|
9
|
+
import "./chunk-P24T3MLM.js";
|
|
9
10
|
import "./chunk-SVQ4PHDZ.js";
|
|
10
11
|
import "./chunk-H4XYLS7T.js";
|
|
12
|
+
import "./chunk-YOKNZY2N.js";
|
|
11
13
|
import "./chunk-4JQ754PA.js";
|
|
12
14
|
import "./chunk-376UBTNB.js";
|
|
13
15
|
import "./chunk-JU25UDN2.js";
|
|
14
16
|
import "./chunk-2TW2QKGZ.js";
|
|
15
|
-
import "./chunk-P24T3MLM.js";
|
|
16
17
|
import "./chunk-ATYHZXLL.js";
|
|
17
18
|
export {
|
|
18
19
|
buildIntegrationCatalogView,
|