@axiom-lattice/gateway 7.0.0 → 8.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{WechatChannelAdapter-7WHE5UGY.mjs → WechatChannelAdapter-QLPJJD6S.mjs} +55 -4
- package/dist/WechatChannelAdapter-QLPJJD6S.mjs.map +1 -0
- package/dist/{a2a-standard-DP53K7RC.mjs → a2a-standard-VL5I7B4W.mjs} +831 -59
- package/dist/a2a-standard-VL5I7B4W.mjs.map +1 -0
- package/dist/{chunk-FGSFOXIX.mjs → chunk-L6MBEEII.mjs} +2 -2
- package/dist/{chunk-J6B2VFJ7.mjs → chunk-W3YH4S6G.mjs} +2 -1
- package/dist/{chunk-MWWLJMYN.mjs → chunk-XUWD4VKY.mjs} +4 -2
- package/dist/chunk-XUWD4VKY.mjs.map +1 -0
- package/dist/embed/embed-page-AgentDetailSideApp-23TCREK6.js +1 -0
- package/dist/embed/embed-page-AgentGovernanceWorkbench-N3F65F3W.js +1 -0
- package/dist/embed/embed-page-LangfuseDashboard-WBE7GJPU.js +1 -0
- package/dist/embed/embed-page-MessageGraph-T3EFAXTX.js +6 -0
- package/dist/embed/embed-page-ReactChart-FJFQU4IV.js +1 -0
- package/dist/embed/embed-page-SkillFlow-2BUXCLAL.js +1 -0
- package/dist/embed/{embed-page-TasksSideApp-D7FFG2OC.js → embed-page-TasksSideApp-VFKEYFGR.js} +1 -1
- package/dist/embed/embed-page-ThreadMaintenancePanel-EPBJ4J3L.js +1 -0
- package/dist/embed/{embed-page-TopologyRuntimeView-IS6HEO4F.js → embed-page-TopologyRuntimeView-OWESU7IK.js} +1 -1
- package/dist/embed/{embed-page-WorkflowAutomationView-IDVSQTJB.js → embed-page-WorkflowAutomationView-5J2RQTZ7.js} +1 -1
- package/dist/embed/{embed-page-chunk-XFV3N2LD.js → embed-page-chunk-2ZBEWYJQ.js} +1 -1
- package/dist/embed/{embed-page-chunk-SRMYHWL3.js → embed-page-chunk-34RWKVD7.js} +1 -1
- package/dist/embed/{embed-page-chunk-JFMBLJXY.js → embed-page-chunk-6QLLZJVH.js} +1 -1
- package/dist/embed/embed-page-chunk-B2KNZ3EW.js +59 -0
- package/dist/embed/{embed-page-chunk-BOEX26H7.js → embed-page-chunk-BFVNPGSW.js} +8 -8
- package/dist/embed/embed-page-chunk-CKUSXUKW.js +6746 -0
- package/dist/embed/embed-page-chunk-CQLDPGEG.js +1 -0
- package/dist/embed/embed-page-chunk-D7YTSCUO.js +1 -0
- package/dist/embed/{embed-page-chunk-S2KVN3RB.js → embed-page-chunk-DJKD2PHO.js} +1 -1
- package/dist/embed/{embed-page-chunk-EYYKNTX7.js → embed-page-chunk-EU32IF7M.js} +1 -1
- package/dist/embed/embed-page-chunk-F7TA3LRH.js +459 -0
- package/dist/embed/embed-page-chunk-F7ZUYG42.js +121 -0
- package/dist/embed/{embed-page-chunk-NFMLKSPM.js → embed-page-chunk-GSUSX54K.js} +1 -1
- package/dist/embed/embed-page-chunk-JMTQCORF.js +211 -0
- package/dist/embed/embed-page-chunk-L7TDL27M.js +15 -0
- package/dist/embed/{embed-page-chunk-TVVAPR7I.js → embed-page-chunk-PTKGTA4B.js} +1 -1
- package/dist/embed/embed-page-chunk-R7TLHZR3.js +7 -0
- package/dist/embed/{embed-page-chunk-FEMHLB6I.js → embed-page-chunk-WKQHSEZ4.js} +1 -1
- package/dist/embed/embed-page-code-highlighter-72YW5HXH.js +1 -0
- package/dist/embed/{embed-page-en-ETUCVCSC.js → embed-page-en-E35GE7TA.js} +1 -1
- package/dist/embed/embed-page-en-EKHHBS6L.js +1 -0
- package/dist/embed/embed-page-en-G5J7KW6V.js +1 -0
- package/dist/embed/embed-page-en-HDSVQ4O6.js +1 -0
- package/dist/embed/embed-page-en-KAXIJJ4X.js +1 -0
- package/dist/embed/embed-page-en-OIICQSPX.js +3 -0
- package/dist/embed/embed-page-en-TMGUHZ6Y.js +1 -0
- package/dist/embed/embed-page-en-TSCGSJAI.js +1 -0
- package/dist/embed/embed-page-en-XJYWUJEL.js +1 -0
- package/dist/embed/{embed-page-en-2SWQHPAC.js → embed-page-en-ZCNNAMUD.js} +1 -1
- package/dist/embed/{embed-page-mermaid-KEBBKHQH.js → embed-page-mermaid-4PZJJXQU.js} +1 -1
- package/dist/embed/embed-page-zh-2UVQB4RP.js +3 -0
- package/dist/embed/embed-page-zh-6EBUEFKP.js +1 -0
- package/dist/embed/embed-page-zh-72QSTYRF.js +1 -0
- package/dist/embed/embed-page-zh-B3WBWQAV.js +1 -0
- package/dist/embed/embed-page-zh-IR652A6J.js +1 -0
- package/dist/embed/embed-page-zh-KEMYJJLT.js +1 -0
- package/dist/embed/embed-page-zh-Q22DIOB3.js +1 -0
- package/dist/embed/{embed-page-zh-PRMID3YQ.js → embed-page-zh-Z3URTIHW.js} +1 -1
- package/dist/embed/{embed-page-zh-D3IC6BGA.js → embed-page-zh-ZLK3GLM3.js} +1 -1
- package/dist/embed/embed-page.js +1 -1
- package/dist/index.d.mts +137 -14
- package/dist/index.d.ts +137 -14
- package/dist/index.js +3942 -1479
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2272 -635
- package/dist/index.mjs.map +1 -1
- package/dist/{open-NTH7AGD3.mjs → open-7ED27I5B.mjs} +3 -3
- package/dist/{open-exposure-AGNG4MC3.mjs → open-exposure-I3DN2X4E.mjs} +6 -4
- package/dist/{open-exposure-AGNG4MC3.mjs.map → open-exposure-I3DN2X4E.mjs.map} +1 -1
- package/package.json +13 -7
- package/dist/WechatChannelAdapter-7WHE5UGY.mjs.map +0 -1
- package/dist/a2a-standard-DP53K7RC.mjs.map +0 -1
- package/dist/chunk-MWWLJMYN.mjs.map +0 -1
- package/dist/embed/embed-page-AgentDetailSideApp-KNVDO3FZ.js +0 -1
- package/dist/embed/embed-page-AgentGovernanceWorkbench-QSKWVADP.js +0 -1
- package/dist/embed/embed-page-MessageGraph-VGXX4OWU.js +0 -6
- package/dist/embed/embed-page-ReactChart-PIISVBLU.js +0 -1
- package/dist/embed/embed-page-SkillFlow-JLI5MEZE.js +0 -1
- package/dist/embed/embed-page-ThreadMaintenancePanel-FSQVVIIG.js +0 -1
- package/dist/embed/embed-page-chunk-37LGEEJU.js +0 -21
- package/dist/embed/embed-page-chunk-436REIWY.js +0 -1
- package/dist/embed/embed-page-chunk-4W34QOXT.js +0 -517
- package/dist/embed/embed-page-chunk-BANVRQT7.js +0 -322
- package/dist/embed/embed-page-chunk-N66H4DNH.js +0 -6657
- package/dist/embed/embed-page-code-highlighter-66CSPTFK.js +0 -1
- package/dist/embed/embed-page-en-27OIE2UA.js +0 -1
- package/dist/embed/embed-page-en-7IHJFS63.js +0 -1
- package/dist/embed/embed-page-en-7NF4GCC2.js +0 -1
- package/dist/embed/embed-page-en-FP6DWSG3.js +0 -1
- package/dist/embed/embed-page-en-GHTROC4H.js +0 -1
- package/dist/embed/embed-page-en-WUFULCUS.js +0 -1
- package/dist/embed/embed-page-en-X6B6RVNL.js +0 -1
- package/dist/embed/embed-page-en-XUMHP5CL.js +0 -1
- package/dist/embed/embed-page-zh-EQ5X2M32.js +0 -1
- package/dist/embed/embed-page-zh-FXQGY5HD.js +0 -1
- package/dist/embed/embed-page-zh-G75LDQU4.js +0 -1
- package/dist/embed/embed-page-zh-KJXKOUIY.js +0 -1
- package/dist/embed/embed-page-zh-RMSS6PXD.js +0 -1
- package/dist/embed/embed-page-zh-VH6J7XZO.js +0 -1
- package/dist/embed/embed-page-zh-Y5X5Y2DF.js +0 -1
- /package/dist/{chunk-FGSFOXIX.mjs.map → chunk-L6MBEEII.mjs.map} +0 -0
- /package/dist/{chunk-J6B2VFJ7.mjs.map → chunk-W3YH4S6G.mjs.map} +0 -0
- /package/dist/{open-NTH7AGD3.mjs.map → open-7ED27I5B.mjs.map} +0 -0
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
buildTenantOpenPlugins,
|
|
7
7
|
mergeOpenCatalog
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-L6MBEEII.mjs";
|
|
9
9
|
import {
|
|
10
10
|
OpenRateLimiter
|
|
11
11
|
} from "./chunk-GXZFO3VU.mjs";
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
ValidationError,
|
|
19
19
|
openLattice
|
|
20
20
|
} from "./chunk-HVIKCUOF.mjs";
|
|
21
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-XUWD4VKY.mjs";
|
|
22
22
|
import "./chunk-EXPERMZR.mjs";
|
|
23
23
|
import "./chunk-NFEGQTCC.mjs";
|
|
24
24
|
|
|
@@ -288,4 +288,4 @@ function registerOpenRoutes(app, deps = {}) {
|
|
|
288
288
|
export {
|
|
289
289
|
registerOpenRoutes
|
|
290
290
|
};
|
|
291
|
-
//# sourceMappingURL=open-
|
|
291
|
+
//# sourceMappingURL=open-7ED27I5B.mjs.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildAgentCardForAssistant
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-W3YH4S6G.mjs";
|
|
4
4
|
import {
|
|
5
5
|
buildTenantOpenPlugins,
|
|
6
6
|
mergeOpenCatalog
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-L6MBEEII.mjs";
|
|
8
8
|
import {
|
|
9
9
|
openLattice
|
|
10
10
|
} from "./chunk-HVIKCUOF.mjs";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-XUWD4VKY.mjs";
|
|
12
12
|
import "./chunk-NFEGQTCC.mjs";
|
|
13
13
|
|
|
14
14
|
// src/routes/open-exposure.ts
|
|
@@ -74,6 +74,8 @@ function registerOpenExposureRoutes(app, deps = {}) {
|
|
|
74
74
|
assistantId,
|
|
75
75
|
cardUrl: `${baseUrl}/api/a2a/agents/${assistantId}/.well-known/agent-card.json`,
|
|
76
76
|
jsonrpcUrl: `${baseUrl}/api/a2a/agents/${assistantId}/jsonrpc`,
|
|
77
|
+
v1CardUrl: `${baseUrl}/a2a/v1/${assistantId}/.well-known/agent-card.json`,
|
|
78
|
+
v1JsonrpcUrl: `${baseUrl}/a2a/v1/${assistantId}`,
|
|
77
79
|
card: buildAgentCardForAssistant({
|
|
78
80
|
assistant,
|
|
79
81
|
baseUrl,
|
|
@@ -104,4 +106,4 @@ function registerOpenExposureRoutes(app, deps = {}) {
|
|
|
104
106
|
export {
|
|
105
107
|
registerOpenExposureRoutes
|
|
106
108
|
};
|
|
107
|
-
//# sourceMappingURL=open-exposure-
|
|
109
|
+
//# sourceMappingURL=open-exposure-I3DN2X4E.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/routes/open-exposure.ts"],"sourcesContent":["/**\n * Key exposure endpoint: what a given API key exposes to external callers —\n * the MCP tools (per grants) and the A2A agent cards (for granted agents).\n * Console-session guarded and tenant-scoped.\n */\n\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport type {\n A2AApiKeyStore,\n AssistantStore,\n OpenGrant,\n} from \"@axiom-lattice/protocols\";\nimport { effectiveGrants } from \"@axiom-lattice/protocols\";\nimport {\n openLattice,\n type OpenToolDescriptor,\n} from \"../services/open/openLattice\";\nimport {\n buildTenantOpenPlugins,\n mergeOpenCatalog,\n type TenantOpenPluginDeps,\n} from \"../services/open/tenantOpenPlugins\";\nimport { buildAgentCardForAssistant } from \"../services/a2a/A2AAgentCardBuilder\";\n\ninterface RequestWithUser extends FastifyRequest {\n user?: { id: string; tenantId?: string };\n}\n\n/** Overridable seams for the exposure route (tests / embedding). */\nexport interface OpenExposureDeps {\n /** Tenant sandbox plugin catalog seams; defaults to the live sandbox catalog. */\n tenantPluginDeps?: TenantOpenPluginDeps;\n}\n\nexport function registerOpenExposureRoutes(\n app: FastifyInstance,\n deps: OpenExposureDeps = {},\n): void {\n app.get<{ Params: { id: string } }>(\n \"/api/keys/:id/exposure\",\n async (\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n ) => {\n const tenantId = (request as RequestWithUser).user?.tenantId;\n if (!tenantId) {\n return reply.status(401).send({ success: false, error: \"Unauthorized\" });\n }\n\n const keyStore = getStoreLattice(\"default\", \"a2aApiKey\")\n .store as A2AApiKeyStore;\n const record = await keyStore.findById(request.params.id);\n if (!record || record.tenantId !== tenantId) {\n return reply.status(404).send({ success: false, error: \"Key not found\" });\n }\n\n const grants: OpenGrant[] = effectiveGrants(record);\n // Include the port: request.hostname strips it, request.headers.host keeps it.\n const forwardedHost = request.headers[\"x-forwarded-host\"];\n const host =\n (Array.isArray(forwardedHost) ? forwardedHost[0] : forwardedHost) ??\n (Array.isArray(request.headers.host) ? request.headers.host[0] : request.headers.host) ??\n request.hostname;\n const baseUrl = `${request.protocol}://${host}`;\n\n // MCP surface: the credential-filtered tool catalog.\n const globalCatalog = await openLattice.catalogFor(grants, { tenantId });\n\n // Tenant sandbox plugins live in per-tenant volumes, outside the\n // OpenLattice registry, so the globals are merged with the credential's\n // grant-filtered tenant tools (global wins) to mirror the actual Open MCP\n // session. A missing/unavailable sandbox catalog degrades to globals.\n let tenantTools: OpenToolDescriptor[] = [];\n let tenantCatalogDegraded = false;\n try {\n const tenant = await buildTenantOpenPlugins(tenantId, grants, {\n ...deps.tenantPluginDeps,\n reservedToolNames: new Set(globalCatalog.map((t) => t.toolName)),\n });\n tenantTools = tenant.tools;\n tenantCatalogDegraded = tenant.degraded;\n } catch (error) {\n tenantCatalogDegraded = true;\n request.log.warn(\n { tenantId, err: error },\n \"key exposure: tenant plugin catalog unavailable\",\n );\n }\n\n const tools = mergeOpenCatalog(globalCatalog, tenantTools).map((t) => ({\n domain: t.domain,\n toolName: t.toolName,\n description: t.description,\n annotations: t.annotations,\n hasUi: Boolean(t.ui),\n }));\n\n // A2A surface: one card per granted agent.\n const agentGrant = grants.find((g) => g.domain === \"agent\");\n const assistantStore = getStoreLattice(\"default\", \"assistant\")\n .store as AssistantStore;\n let pushNotifications = false;\n try {\n pushNotifications = Boolean(getStoreLattice(\"default\", \"store\").store);\n } catch {\n pushNotifications = false;\n }\n const agents: Array<{\n assistantId: string;\n cardUrl: string;\n jsonrpcUrl: string;\n card: unknown;\n }> = [];\n for (const assistantId of agentGrant?.items ?? []) {\n const assistant = await assistantStore.getAssistantById(\n tenantId,\n assistantId,\n );\n if (!assistant) continue;\n agents.push({\n assistantId,\n cardUrl: `${baseUrl}/api/a2a/agents/${assistantId}/.well-known/agent-card.json`,\n jsonrpcUrl: `${baseUrl}/api/a2a/agents/${assistantId}/jsonrpc`,\n card: buildAgentCardForAssistant({\n assistant,\n baseUrl,\n pushNotifications,\n }),\n });\n }\n\n return reply.status(200).send({\n success: true,\n data: {\n tenantId,\n projectId: record.projectId,\n grants,\n mcp: {\n endpoint: `${baseUrl}/open/mcp`,\n tools,\n // Surfaced so the console can distinguish \"no tenant tools granted\"\n // from \"tenant catalog unreadable\"; the live Open session degrades\n // to globals-only either way.\n tenantCatalogDegraded,\n },\n a2a: { agents },\n },\n });\n },\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAOA,SAAS,uBAAuB;AAMhC,SAAS,uBAAuB;AAsBzB,SAAS,2BACd,KACA,OAAyB,CAAC,GACpB;AACN,MAAI;AAAA,IACF;AAAA,IACA,OACE,SACA,UACG;AACH,YAAM,WAAY,QAA4B,MAAM;AACpD,UAAI,CAAC,UAAU;AACb,eAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,eAAe,CAAC;AAAA,MACzE;AAEA,YAAM,WAAW,gBAAgB,WAAW,WAAW,EACpD;AACH,YAAM,SAAS,MAAM,SAAS,SAAS,QAAQ,OAAO,EAAE;AACxD,UAAI,CAAC,UAAU,OAAO,aAAa,UAAU;AAC3C,eAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,gBAAgB,CAAC;AAAA,MAC1E;AAEA,YAAM,SAAsB,gBAAgB,MAAM;AAElD,YAAM,gBAAgB,QAAQ,QAAQ,kBAAkB;AACxD,YAAM,QACH,MAAM,QAAQ,aAAa,IAAI,cAAc,CAAC,IAAI,mBAClD,MAAM,QAAQ,QAAQ,QAAQ,IAAI,IAAI,QAAQ,QAAQ,KAAK,CAAC,IAAI,QAAQ,QAAQ,SACjF,QAAQ;AACV,YAAM,UAAU,GAAG,QAAQ,QAAQ,MAAM,IAAI;AAG7C,YAAM,gBAAgB,MAAM,YAAY,WAAW,QAAQ,EAAE,SAAS,CAAC;AAMvE,UAAI,cAAoC,CAAC;AACzC,UAAI,wBAAwB;AAC5B,UAAI;AACF,cAAM,SAAS,MAAM,uBAAuB,UAAU,QAAQ;AAAA,UAC5D,GAAG,KAAK;AAAA,UACR,mBAAmB,IAAI,IAAI,cAAc,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAA,QACjE,CAAC;AACD,sBAAc,OAAO;AACrB,gCAAwB,OAAO;AAAA,MACjC,SAAS,OAAO;AACd,gCAAwB;AACxB,gBAAQ,IAAI;AAAA,UACV,EAAE,UAAU,KAAK,MAAM;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,QAAQ,iBAAiB,eAAe,WAAW,EAAE,IAAI,CAAC,OAAO;AAAA,QACrE,QAAQ,EAAE;AAAA,QACV,UAAU,EAAE;AAAA,QACZ,aAAa,EAAE;AAAA,QACf,aAAa,EAAE;AAAA,QACf,OAAO,QAAQ,EAAE,EAAE;AAAA,MACrB,EAAE;AAGF,YAAM,aAAa,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO;AAC1D,YAAM,iBAAiB,gBAAgB,WAAW,WAAW,EAC1D;AACH,UAAI,oBAAoB;AACxB,UAAI;AACF,4BAAoB,QAAQ,gBAAgB,WAAW,OAAO,EAAE,KAAK;AAAA,MACvE,QAAQ;AACN,4BAAoB;AAAA,MACtB;AACA,YAAM,
|
|
1
|
+
{"version":3,"sources":["../src/routes/open-exposure.ts"],"sourcesContent":["/**\n * Key exposure endpoint: what a given API key exposes to external callers —\n * the MCP tools (per grants) and the A2A agent cards (for granted agents).\n * Console-session guarded and tenant-scoped.\n */\n\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport { getStoreLattice } from \"@axiom-lattice/core\";\nimport type {\n A2AApiKeyStore,\n AssistantStore,\n OpenGrant,\n} from \"@axiom-lattice/protocols\";\nimport { effectiveGrants } from \"@axiom-lattice/protocols\";\nimport {\n openLattice,\n type OpenToolDescriptor,\n} from \"../services/open/openLattice\";\nimport {\n buildTenantOpenPlugins,\n mergeOpenCatalog,\n type TenantOpenPluginDeps,\n} from \"../services/open/tenantOpenPlugins\";\nimport { buildAgentCardForAssistant } from \"../services/a2a/A2AAgentCardBuilder\";\n\ninterface RequestWithUser extends FastifyRequest {\n user?: { id: string; tenantId?: string };\n}\n\n/** Overridable seams for the exposure route (tests / embedding). */\nexport interface OpenExposureDeps {\n /** Tenant sandbox plugin catalog seams; defaults to the live sandbox catalog. */\n tenantPluginDeps?: TenantOpenPluginDeps;\n}\n\nexport function registerOpenExposureRoutes(\n app: FastifyInstance,\n deps: OpenExposureDeps = {},\n): void {\n app.get<{ Params: { id: string } }>(\n \"/api/keys/:id/exposure\",\n async (\n request: FastifyRequest<{ Params: { id: string } }>,\n reply: FastifyReply,\n ) => {\n const tenantId = (request as RequestWithUser).user?.tenantId;\n if (!tenantId) {\n return reply.status(401).send({ success: false, error: \"Unauthorized\" });\n }\n\n const keyStore = getStoreLattice(\"default\", \"a2aApiKey\")\n .store as A2AApiKeyStore;\n const record = await keyStore.findById(request.params.id);\n if (!record || record.tenantId !== tenantId) {\n return reply.status(404).send({ success: false, error: \"Key not found\" });\n }\n\n const grants: OpenGrant[] = effectiveGrants(record);\n // Include the port: request.hostname strips it, request.headers.host keeps it.\n const forwardedHost = request.headers[\"x-forwarded-host\"];\n const host =\n (Array.isArray(forwardedHost) ? forwardedHost[0] : forwardedHost) ??\n (Array.isArray(request.headers.host) ? request.headers.host[0] : request.headers.host) ??\n request.hostname;\n const baseUrl = `${request.protocol}://${host}`;\n\n // MCP surface: the credential-filtered tool catalog.\n const globalCatalog = await openLattice.catalogFor(grants, { tenantId });\n\n // Tenant sandbox plugins live in per-tenant volumes, outside the\n // OpenLattice registry, so the globals are merged with the credential's\n // grant-filtered tenant tools (global wins) to mirror the actual Open MCP\n // session. A missing/unavailable sandbox catalog degrades to globals.\n let tenantTools: OpenToolDescriptor[] = [];\n let tenantCatalogDegraded = false;\n try {\n const tenant = await buildTenantOpenPlugins(tenantId, grants, {\n ...deps.tenantPluginDeps,\n reservedToolNames: new Set(globalCatalog.map((t) => t.toolName)),\n });\n tenantTools = tenant.tools;\n tenantCatalogDegraded = tenant.degraded;\n } catch (error) {\n tenantCatalogDegraded = true;\n request.log.warn(\n { tenantId, err: error },\n \"key exposure: tenant plugin catalog unavailable\",\n );\n }\n\n const tools = mergeOpenCatalog(globalCatalog, tenantTools).map((t) => ({\n domain: t.domain,\n toolName: t.toolName,\n description: t.description,\n annotations: t.annotations,\n hasUi: Boolean(t.ui),\n }));\n\n // A2A surface: one card per granted agent.\n const agentGrant = grants.find((g) => g.domain === \"agent\");\n const assistantStore = getStoreLattice(\"default\", \"assistant\")\n .store as AssistantStore;\n let pushNotifications = false;\n try {\n pushNotifications = Boolean(getStoreLattice(\"default\", \"store\").store);\n } catch {\n pushNotifications = false;\n }\n const agents: Array<{\n assistantId: string;\n cardUrl: string;\n jsonrpcUrl: string;\n v1CardUrl: string;\n v1JsonrpcUrl: string;\n card: unknown;\n }> = [];\n for (const assistantId of agentGrant?.items ?? []) {\n const assistant = await assistantStore.getAssistantById(\n tenantId,\n assistantId,\n );\n if (!assistant) continue;\n agents.push({\n assistantId,\n cardUrl: `${baseUrl}/api/a2a/agents/${assistantId}/.well-known/agent-card.json`,\n jsonrpcUrl: `${baseUrl}/api/a2a/agents/${assistantId}/jsonrpc`,\n v1CardUrl: `${baseUrl}/a2a/v1/${assistantId}/.well-known/agent-card.json`,\n v1JsonrpcUrl: `${baseUrl}/a2a/v1/${assistantId}`,\n card: buildAgentCardForAssistant({\n assistant,\n baseUrl,\n pushNotifications,\n }),\n });\n }\n\n return reply.status(200).send({\n success: true,\n data: {\n tenantId,\n projectId: record.projectId,\n grants,\n mcp: {\n endpoint: `${baseUrl}/open/mcp`,\n tools,\n // Surfaced so the console can distinguish \"no tenant tools granted\"\n // from \"tenant catalog unreadable\"; the live Open session degrades\n // to globals-only either way.\n tenantCatalogDegraded,\n },\n a2a: { agents },\n },\n });\n },\n );\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axiom-lattice/gateway",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"description": "API Gateway for LangGraph agent-based applications",
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@a2a-js/sdk": "^0.3.13",
|
|
23
|
+
"@a2a-js/sdk-v1": "npm:@a2a-js/sdk@1.3.0",
|
|
23
24
|
"@fastify/cors": "^11.0.0",
|
|
24
25
|
"@fastify/http-proxy": "^9.5.0",
|
|
25
26
|
"@fastify/multipart": "^9.4.0",
|
|
@@ -31,8 +32,13 @@
|
|
|
31
32
|
"@fastify/websocket": "^11.0.1",
|
|
32
33
|
"@langchain/core": "1.1.30",
|
|
33
34
|
"@langchain/langgraph": "1.0.4",
|
|
35
|
+
"@langfuse/langchain": "^6.0.2",
|
|
36
|
+
"@langfuse/otel": "^6.0.2",
|
|
34
37
|
"@larksuiteoapi/node-sdk": "^1.47.0",
|
|
35
38
|
"@modelcontextprotocol/sdk": "1.25.3",
|
|
39
|
+
"@opentelemetry/api": "^1.9.1",
|
|
40
|
+
"@opentelemetry/sdk-trace-base": "2.6.1",
|
|
41
|
+
"@opentelemetry/sdk-trace-node": "2.6.1",
|
|
36
42
|
"@supabase/supabase-js": "^2.49.1",
|
|
37
43
|
"@wecom/aibot-node-sdk": "^1.0.7",
|
|
38
44
|
"bcryptjs": "^3.0.3",
|
|
@@ -49,11 +55,11 @@
|
|
|
49
55
|
"uuid": "^9.0.1",
|
|
50
56
|
"web-push": "^3.6.7",
|
|
51
57
|
"zod": "3.25.76",
|
|
52
|
-
"@axiom-lattice/cli-a2a": "0.2.
|
|
53
|
-
"@axiom-lattice/core": "
|
|
54
|
-
"@axiom-lattice/pg-stores": "
|
|
55
|
-
"@axiom-lattice/protocols": "
|
|
56
|
-
"@axiom-lattice/queue-redis": "1.1.
|
|
58
|
+
"@axiom-lattice/cli-a2a": "0.2.25",
|
|
59
|
+
"@axiom-lattice/core": "10.0.1",
|
|
60
|
+
"@axiom-lattice/pg-stores": "4.0.1",
|
|
61
|
+
"@axiom-lattice/protocols": "6.0.0",
|
|
62
|
+
"@axiom-lattice/queue-redis": "1.1.25"
|
|
57
63
|
},
|
|
58
64
|
"devDependencies": {
|
|
59
65
|
"@types/bcrypt": "^6.0.0",
|
|
@@ -78,7 +84,7 @@
|
|
|
78
84
|
"typescript": "^5.8.2",
|
|
79
85
|
"ws": "^8.19.0",
|
|
80
86
|
"@axiom-lattice/open-mcp-client": "0.2.0",
|
|
81
|
-
"@axiom-lattice/react-sdk": "
|
|
87
|
+
"@axiom-lattice/react-sdk": "8.1.1"
|
|
82
88
|
},
|
|
83
89
|
"scripts": {
|
|
84
90
|
"build": "tsup src/index.ts --format cjs,esm --dts --clean --sourcemap && pnpm copy:embed-assets",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/channels/wechat/WechatChannelAdapter.ts","../src/channels/wechat/context-store.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n ChannelAdapter,\n InboundMessage,\n OutboundMessage,\n ReplyTarget,\n ChannelInstallation,\n} from \"@axiom-lattice/protocols\";\nimport type { WechatChannelInstallationConfig } from \"@axiom-lattice/protocols\";\nimport { getUpdates, sendMessage } from \"./wechat-client\";\nimport { setContextToken, getContextToken, deleteContextToken } from \"./context-store\";\nimport { Logger } from \"../../logger/Logger\";\n\nconst logger = new Logger({ serviceName: \"lattice/gateway/wechat\" });\n\nconst wechatConfigSchema = z.object({\n botToken: z.string(),\n uin: z.string().optional(),\n});\n\nconst MAX_RECONNECT_DELAY_MS = 30_000;\nconst BASE_RECONNECT_DELAY_MS = 1_000;\nconst HEARTBEAT_INTERVAL_MS = 60_000;\nconst CHANNEL_VERSION = \"1.0.2\";\n\n// ─── Message type constants ───────────────────────────────────────────────\n\nconst MSG_TYPE_USER = 1;\nconst MSG_ITEM_TEXT = 1;\n\n// ─── Polling connection state ─────────────────────────────────────────────\n\ninterface PollingState {\n installationId: string;\n abortController: AbortController;\n lastActivity: number;\n heartbeatTimer: NodeJS.Timeout;\n}\n\nconst activeConnections = new Map<string, PollingState>();\n\n// ─── Message dedup ────────────────────────────────────────────────────────\n\nconst seenClientIds = new Set<string>();\n\nfunction addToDedup(clientId: string): boolean {\n if (!clientId || seenClientIds.has(clientId)) return false;\n seenClientIds.add(clientId);\n if (seenClientIds.size > 1000) {\n const first = seenClientIds.values().next().value;\n if (first !== undefined) seenClientIds.delete(first);\n }\n return true;\n}\n\n// ─── Text extraction from iLink message ───────────────────────────────────\n\nfunction extractText(msg: { item_list?: Array<{ type?: number; text_item?: { text?: string } }> }): string | null {\n if (!msg.item_list?.length) return null;\n for (const item of msg.item_list) {\n if (item.type === MSG_ITEM_TEXT && item.text_item?.text) {\n return item.text_item.text;\n }\n }\n return null;\n}\n\n// ─── Adapter ──────────────────────────────────────────────────────────────\n\nexport const wechatChannelAdapter: ChannelAdapter<WechatChannelInstallationConfig> = {\n channel: \"wechat\",\n\n configSchema: wechatConfigSchema,\n\n async receive(\n rawPayload: unknown,\n installation: ChannelInstallation<WechatChannelInstallationConfig>,\n ): Promise<InboundMessage | null> {\n const msg = rawPayload as {\n from_user_id?: string;\n client_id?: string;\n message_type?: number;\n item_list?: Array<{ type?: number; text_item?: { text?: string } }>;\n context_token?: string;\n };\n\n // Only process user messages (type 1), skip bot echoes (type 2)\n if (msg.message_type !== MSG_TYPE_USER) return null;\n\n const senderId = msg.from_user_id;\n if (!senderId) return null;\n\n const text = extractText(msg);\n if (!text) return null;\n\n // Cache context token for reply\n if (msg.context_token) {\n setContextToken(installation.id, senderId, msg.context_token);\n }\n\n return {\n channel: \"wechat\",\n channelInstallationId: installation.id,\n tenantId: installation.tenantId,\n sender: {\n id: senderId,\n displayName: senderId.split(\"@\")[0],\n },\n content: {\n text,\n },\n conversation: {\n id: senderId,\n type: \"direct\",\n },\n replyTarget: {\n adapterChannel: \"wechat\",\n channelInstallationId: installation.id,\n rawTarget: { senderId },\n },\n };\n },\n\n async sendReply(\n replyTarget: ReplyTarget,\n message: OutboundMessage,\n installation: ChannelInstallation<WechatChannelInstallationConfig>,\n ): Promise<void> {\n const senderId = replyTarget.rawTarget.senderId as string;\n const contextToken = getContextToken(installation.id, senderId);\n\n if (!contextToken) {\n logger.warn(\"WeChat context token expired, cannot send reply\", {\n installationId: installation.id,\n senderId,\n });\n deleteContextToken(installation.id, senderId);\n return;\n }\n\n const { botToken } = installation.config;\n await sendMessage(botToken, senderId, message.text, contextToken);\n },\n\n resolveThreadId(message: InboundMessage, binding: unknown): string {\n const date = new Date().toISOString().split(\"T\")[0];\n const agentId = (binding as { agentId: string }).agentId;\n return `wechat:dm:${message.sender.id}:${agentId}:${date}`;\n },\n\n async connect(\n installation: ChannelInstallation<WechatChannelInstallationConfig>,\n deps?: unknown,\n ): Promise<void> {\n const { id: installationId, tenantId, config } = installation;\n\n if (!config.botToken) {\n logger.warn(\"WeChat installation missing botToken, skipping\", { installationId });\n return;\n }\n\n if (activeConnections.has(installationId)) {\n logger.warn(\"WeChat polling already running for installation, skipping\", { installationId });\n return;\n }\n\n logger.info(\"WeChat polling starting\", { installationId, tenantId });\n\n const abortController = new AbortController();\n\n const heartbeatTimer = setInterval(() => {\n const state2 = activeConnections.get(installationId);\n if (!state2) {\n clearInterval(heartbeatTimer);\n return;\n }\n const elapsed = Date.now() - state2.lastActivity;\n if (elapsed > HEARTBEAT_INTERVAL_MS * 2) {\n logger.error(\"WeChat polling heartbeat lost — no activity\", {\n installationId,\n elapsedMs: elapsed,\n });\n state2.abortController.abort();\n }\n }, HEARTBEAT_INTERVAL_MS);\n\n const state: PollingState = {\n installationId,\n abortController,\n lastActivity: Date.now(),\n heartbeatTimer,\n };\n activeConnections.set(installationId, state);\n\n const router = (deps as { router?: { dispatch(msg: InboundMessage): Promise<unknown> } })?.router;\n\n let syncBuffer = \"\";\n let reconnectDelay = BASE_RECONNECT_DELAY_MS;\n\n const scheduleNextPoll = (): void => {\n poll().catch((err) => {\n logger.error(\"WeChat poll iteration crashed\", {\n installationId,\n error: err instanceof Error ? err.message : String(err),\n });\n const currentState = activeConnections.get(installationId);\n if (currentState && !currentState.abortController.signal.aborted) {\n setTimeout(scheduleNextPoll, reconnectDelay);\n }\n });\n };\n\n const poll = async (): Promise<void> => {\n const currentState = activeConnections.get(installationId);\n if (!currentState || currentState.abortController.signal.aborted) {\n logger.info(\"WeChat polling aborted\", { installationId });\n return;\n }\n\n try {\n const result = await getUpdates(\n config.botToken,\n syncBuffer,\n currentState.abortController.signal,\n );\n syncBuffer = result.syncBuffer;\n reconnectDelay = BASE_RECONNECT_DELAY_MS;\n currentState.lastActivity = Date.now();\n\n if (result.msgs.length > 0) {\n logger.info(\"WeChat poll received messages\", {\n installationId,\n count: result.msgs.length,\n });\n }\n\n for (const rawMsg of result.msgs) {\n // Only user messages, skip bot echoes and non-text\n if (rawMsg.message_type !== MSG_TYPE_USER) continue;\n\n const text = extractText(rawMsg);\n if (!text) continue;\n\n if (!addToDedup((rawMsg as { client_id?: string }).client_id ?? \"\")) continue;\n\n const inbound = await wechatChannelAdapter.receive(\n rawMsg,\n installation as ChannelInstallation<WechatChannelInstallationConfig>,\n );\n if (inbound && router) {\n const dispatchResult = await router.dispatch(inbound);\n if (!(dispatchResult as { success?: boolean }).success) {\n logger.warn(\"WeChat dispatch failed\", {\n installationId,\n error: (dispatchResult as { error?: { message?: string } }).error?.message,\n });\n }\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n logger.info(\"WeChat poll aborted by signal\", { installationId });\n return;\n }\n\n logger.error(\"WeChat poll error\", {\n installationId,\n error: err instanceof Error ? err.message : String(err),\n });\n await new Promise((resolve) => setTimeout(resolve, reconnectDelay));\n reconnectDelay = Math.min(reconnectDelay * 2, MAX_RECONNECT_DELAY_MS);\n }\n\n scheduleNextPoll();\n };\n\n scheduleNextPoll();\n logger.info(\"WeChat polling started\", { installationId });\n },\n\n async disconnect(installationId: string): Promise<void> {\n const state = activeConnections.get(installationId);\n if (!state) {\n logger.warn(\"WeChat polling not running, nothing to disconnect\", { installationId });\n return;\n }\n\n logger.info(\"WeChat polling disconnecting\", { installationId });\n state.abortController.abort();\n clearInterval(state.heartbeatTimer);\n activeConnections.delete(installationId);\n logger.info(\"WeChat polling disconnected\", { installationId });\n },\n};\n","interface ContextTokenEntry {\n token: string;\n installationId: string;\n senderId: string;\n updatedAt: number;\n}\n\nconst TOKEN_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst store = new Map<string, ContextTokenEntry>();\nconst timers = new Map<string, NodeJS.Timeout>();\n\nfunction makeKey(installationId: string, senderId: string): string {\n return `${installationId}::${senderId}`;\n}\n\nexport function getContextToken(installationId: string, senderId: string): string | undefined {\n const key = makeKey(installationId, senderId);\n const entry = store.get(key);\n if (!entry) return undefined;\n if (Date.now() - entry.updatedAt > TOKEN_TTL_MS) {\n deleteContextToken(installationId, senderId);\n return undefined;\n }\n return entry.token;\n}\n\nexport function setContextToken(installationId: string, senderId: string, token: string): void {\n const key = makeKey(installationId, senderId);\n\n const existingTimer = timers.get(key);\n if (existingTimer) clearTimeout(existingTimer);\n\n store.set(key, { token, installationId, senderId, updatedAt: Date.now() });\n\n const timer = setTimeout(() => {\n store.delete(key);\n timers.delete(key);\n }, TOKEN_TTL_MS);\n timers.set(key, timer);\n}\n\nexport function deleteContextToken(installationId: string, senderId: string): void {\n const key = makeKey(installationId, senderId);\n store.delete(key);\n const timer = timers.get(key);\n if (timer) {\n clearTimeout(timer);\n timers.delete(key);\n }\n}\n\nexport function getContextTokenStoreSize(): number {\n return store.size;\n}\n"],"mappings":"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","names":[]}
|