@frontmcp/sdk 0.3.0 → 0.4.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.
Files changed (169) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +192 -164
  3. package/package.json +7 -4
  4. package/src/__test-utils__/fixtures/hook.fixtures.d.ts +46 -0
  5. package/src/__test-utils__/fixtures/hook.fixtures.js +114 -0
  6. package/src/__test-utils__/fixtures/hook.fixtures.js.map +1 -0
  7. package/src/__test-utils__/fixtures/index.d.ts +7 -0
  8. package/src/__test-utils__/fixtures/index.js +11 -0
  9. package/src/__test-utils__/fixtures/index.js.map +1 -0
  10. package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +46 -0
  11. package/src/__test-utils__/fixtures/plugin.fixtures.js +127 -0
  12. package/src/__test-utils__/fixtures/plugin.fixtures.js.map +1 -0
  13. package/src/__test-utils__/fixtures/provider.fixtures.d.ts +69 -0
  14. package/src/__test-utils__/fixtures/provider.fixtures.js +131 -0
  15. package/src/__test-utils__/fixtures/provider.fixtures.js.map +1 -0
  16. package/src/__test-utils__/fixtures/scope.fixtures.d.ts +14 -0
  17. package/src/__test-utils__/fixtures/scope.fixtures.js +59 -0
  18. package/src/__test-utils__/fixtures/scope.fixtures.js.map +1 -0
  19. package/src/__test-utils__/fixtures/tool.fixtures.d.ts +36 -0
  20. package/src/__test-utils__/fixtures/tool.fixtures.js +91 -0
  21. package/src/__test-utils__/fixtures/tool.fixtures.js.map +1 -0
  22. package/src/__test-utils__/helpers/assertion.helpers.d.ts +45 -0
  23. package/src/__test-utils__/helpers/assertion.helpers.js +153 -0
  24. package/src/__test-utils__/helpers/assertion.helpers.js.map +1 -0
  25. package/src/__test-utils__/helpers/async.helpers.d.ts +48 -0
  26. package/src/__test-utils__/helpers/async.helpers.js +112 -0
  27. package/src/__test-utils__/helpers/async.helpers.js.map +1 -0
  28. package/src/__test-utils__/helpers/index.d.ts +6 -0
  29. package/src/__test-utils__/helpers/index.js +10 -0
  30. package/src/__test-utils__/helpers/index.js.map +1 -0
  31. package/src/__test-utils__/helpers/setup.helpers.d.ts +54 -0
  32. package/src/__test-utils__/helpers/setup.helpers.js +106 -0
  33. package/src/__test-utils__/helpers/setup.helpers.js.map +1 -0
  34. package/src/__test-utils__/index.d.ts +9 -0
  35. package/src/__test-utils__/index.js +14 -0
  36. package/src/__test-utils__/index.js.map +1 -0
  37. package/src/__test-utils__/mocks/flow-instance.mock.d.ts +50 -0
  38. package/src/__test-utils__/mocks/flow-instance.mock.js +72 -0
  39. package/src/__test-utils__/mocks/flow-instance.mock.js.map +1 -0
  40. package/src/__test-utils__/mocks/hook-registry.mock.d.ts +25 -0
  41. package/src/__test-utils__/mocks/hook-registry.mock.js +65 -0
  42. package/src/__test-utils__/mocks/hook-registry.mock.js.map +1 -0
  43. package/src/__test-utils__/mocks/index.d.ts +8 -0
  44. package/src/__test-utils__/mocks/index.js +12 -0
  45. package/src/__test-utils__/mocks/index.js.map +1 -0
  46. package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +43 -0
  47. package/src/__test-utils__/mocks/plugin-registry.mock.js +70 -0
  48. package/src/__test-utils__/mocks/plugin-registry.mock.js.map +1 -0
  49. package/src/__test-utils__/mocks/provider-registry.mock.d.ts +39 -0
  50. package/src/__test-utils__/mocks/provider-registry.mock.js +72 -0
  51. package/src/__test-utils__/mocks/provider-registry.mock.js.map +1 -0
  52. package/src/__test-utils__/mocks/tool-registry.mock.d.ts +43 -0
  53. package/src/__test-utils__/mocks/tool-registry.mock.js +79 -0
  54. package/src/__test-utils__/mocks/tool-registry.mock.js.map +1 -0
  55. package/src/app/app.utils.js.map +1 -1
  56. package/src/app/instances/app.local.instance.js +8 -11
  57. package/src/app/instances/app.local.instance.js.map +1 -1
  58. package/src/auth/auth.registry.d.ts +2 -2
  59. package/src/auth/auth.registry.js +3 -3
  60. package/src/auth/auth.registry.js.map +1 -1
  61. package/src/auth/flows/oauth.authorize.flow.d.ts +8 -8
  62. package/src/auth/flows/oauth.register.flow.d.ts +4 -4
  63. package/src/auth/flows/oauth.token.flow.d.ts +4 -4
  64. package/src/auth/flows/well-known.jwks.flow.d.ts +12 -12
  65. package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +8 -8
  66. package/src/auth/flows/well-known.prm.flow.d.ts +4 -4
  67. package/src/auth/instances/instance.local-primary-auth.d.ts +3 -2
  68. package/src/auth/instances/instance.local-primary-auth.js +4 -2
  69. package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
  70. package/src/auth/instances/instance.remote-primary-auth.d.ts +3 -2
  71. package/src/auth/instances/instance.remote-primary-auth.js +3 -1
  72. package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
  73. package/src/auth/jwks/jwks.service.js +0 -1
  74. package/src/auth/jwks/jwks.service.js.map +1 -1
  75. package/src/common/decorators/tool.decorator.d.ts +97 -36
  76. package/src/common/decorators/tool.decorator.js +0 -1
  77. package/src/common/decorators/tool.decorator.js.map +1 -1
  78. package/src/common/entries/scope.entry.d.ts +1 -0
  79. package/src/common/entries/scope.entry.js +6 -0
  80. package/src/common/entries/scope.entry.js.map +1 -1
  81. package/src/common/entries/tool.entry.d.ts +54 -11
  82. package/src/common/entries/tool.entry.js +19 -0
  83. package/src/common/entries/tool.entry.js.map +1 -1
  84. package/src/common/interfaces/internal/registry.interface.d.ts +10 -2
  85. package/src/common/interfaces/internal/registry.interface.js.map +1 -1
  86. package/src/common/interfaces/plugin.interface.d.ts +1 -1
  87. package/src/common/interfaces/plugin.interface.js.map +1 -1
  88. package/src/common/interfaces/tool.interface.d.ts +12 -7
  89. package/src/common/interfaces/tool.interface.js +1 -1
  90. package/src/common/interfaces/tool.interface.js.map +1 -1
  91. package/src/common/metadata/front-mcp.metadata.d.ts +145 -145
  92. package/src/common/metadata/hook.metadata.d.ts +4 -2
  93. package/src/common/metadata/hook.metadata.js.map +1 -1
  94. package/src/common/metadata/prompt.metadata.d.ts +28 -28
  95. package/src/common/metadata/prompt.metadata.js.map +1 -1
  96. package/src/common/metadata/resource.metadata.d.ts +54 -54
  97. package/src/common/metadata/tool.metadata.d.ts +190 -7
  98. package/src/common/metadata/tool.metadata.js +41 -6
  99. package/src/common/metadata/tool.metadata.js.map +1 -1
  100. package/src/common/records/scope.record.d.ts +2 -2
  101. package/src/common/records/scope.record.js.map +1 -1
  102. package/src/common/schemas/http-output.schema.d.ts +106 -106
  103. package/src/common/tokens/tool.tokens.js.map +1 -1
  104. package/src/common/types/options/logging.options.d.ts +1 -2
  105. package/src/common/types/options/logging.options.js +1 -9
  106. package/src/common/types/options/logging.options.js.map +1 -1
  107. package/src/common/types/options/server-info.options.d.ts +19 -19
  108. package/src/errors/error-handler.d.ts +65 -0
  109. package/src/errors/error-handler.js +107 -0
  110. package/src/errors/error-handler.js.map +1 -0
  111. package/src/errors/index.d.ts +2 -0
  112. package/src/errors/index.js +26 -0
  113. package/src/errors/index.js.map +1 -0
  114. package/src/errors/mcp.error.d.ts +156 -0
  115. package/src/errors/mcp.error.js +243 -0
  116. package/src/errors/mcp.error.js.map +1 -0
  117. package/src/flows/flow.instance.js +7 -6
  118. package/src/flows/flow.instance.js.map +1 -1
  119. package/src/flows/flow.registry.js +1 -1
  120. package/src/flows/flow.registry.js.map +1 -1
  121. package/src/front-mcp/front-mcp.providers.d.ts +20 -20
  122. package/src/hooks/hook.registry.d.ts +5 -3
  123. package/src/hooks/hook.registry.js +13 -1
  124. package/src/hooks/hook.registry.js.map +1 -1
  125. package/src/plugin/plugin.registry.d.ts +7 -2
  126. package/src/plugin/plugin.registry.js +23 -11
  127. package/src/plugin/plugin.registry.js.map +1 -1
  128. package/src/prompt/prompt.registry.js +1 -0
  129. package/src/prompt/prompt.registry.js.map +1 -1
  130. package/src/resource/resource.registry.js +1 -0
  131. package/src/resource/resource.registry.js.map +1 -1
  132. package/src/scope/scope.instance.js +8 -2
  133. package/src/scope/scope.instance.js.map +1 -1
  134. package/src/scope/scope.registry.js +3 -2
  135. package/src/scope/scope.registry.js.map +1 -1
  136. package/src/scope/scope.utils.js +6 -4
  137. package/src/scope/scope.utils.js.map +1 -1
  138. package/src/store/adapters/store.memory.adapter.js +3 -1
  139. package/src/store/adapters/store.memory.adapter.js.map +1 -1
  140. package/src/tool/flows/call-tool.flow.d.ts +1012 -676
  141. package/src/tool/flows/call-tool.flow.js +94 -61
  142. package/src/tool/flows/call-tool.flow.js.map +1 -1
  143. package/src/tool/flows/tools-list.flow.d.ts +347 -590
  144. package/src/tool/flows/tools-list.flow.js +76 -49
  145. package/src/tool/flows/tools-list.flow.js.map +1 -1
  146. package/src/tool/tool.instance.d.ts +27 -8
  147. package/src/tool/tool.instance.js +40 -5
  148. package/src/tool/tool.instance.js.map +1 -1
  149. package/src/tool/tool.registry.js +19 -21
  150. package/src/tool/tool.registry.js.map +1 -1
  151. package/src/tool/tool.utils.d.ts +3 -2
  152. package/src/tool/tool.utils.js +377 -14
  153. package/src/tool/tool.utils.js.map +1 -1
  154. package/src/transport/adapters/transport.sse.adapter.js +2 -1
  155. package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
  156. package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
  157. package/src/transport/flows/handle.sse.flow.js +6 -13
  158. package/src/transport/flows/handle.sse.flow.js.map +1 -1
  159. package/src/transport/flows/handle.streamable-http.flow.js +1 -0
  160. package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
  161. package/src/transport/mcp-handlers/call-tool-request.handler.d.ts +1 -1
  162. package/src/transport/mcp-handlers/call-tool-request.handler.js +10 -5
  163. package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
  164. package/src/transport/mcp-handlers/index.d.ts +151 -268
  165. package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +124 -216
  166. package/src/transport/transport.local.js +1 -0
  167. package/src/transport/transport.local.js.map +1 -1
  168. package/src/utils/string.utils.js +1 -1
  169. package/src/utils/string.utils.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tool.registry.js","sourceRoot":"","sources":["../../../src/tool/tool.registry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EntryLineage,\n EntryOwnerRef,\n Token,\n ToolEntry,\n ToolRecord,\n ToolRegistryInterface,\n ToolType\n} from '../common';\nimport {getMetadata} from '../utils/metadata.utils';\nimport {ToolChangeEvent, ToolEmitter} from './tool.events';\nimport ProviderRegistry from '../provider/provider.registry';\nimport {\n ensureMaxLen,\n normalizeOwnerPath,\n normalizeProviderId,\n normalizeSegment,\n normalizeTool, ownerKeyOf, qualifiedNameOf, sepFor,\n toolDiscoveryDeps\n} from './tool.utils';\nimport {tokenName} from '../utils/token.utils';\nimport {RegistryAbstract, RegistryBuildMapResult} from '../regsitry';\nimport {ToolInstance} from './tool.instance';\nimport {DEFAULT_EXPORT_OPTS, ExportNameOptions, IndexedTool} from \"./tool.types\";\nimport ToolsListFlow from \"./flows/tools-list.flow\";\nimport CallToolFlow from \"./flows/call-tool.flow\";\n\n\nexport default class ToolRegistry extends RegistryAbstract<\n ToolInstance, // IMPORTANT: instances map holds ToolInstance (not the interface)\n ToolRecord,\n ToolType[]\n> implements ToolRegistryInterface {\n /** Who owns this registry (used for provenance). Optional. */\n owner: EntryOwnerRef;\n\n /** Tools truly owned/constructed by THIS registry (with lineage applied) */\n private localRows: IndexedTool[] = [];\n\n /** Adopted tool rows from each child registry (references to the same instances) */\n private adopted = new Map<ToolRegistry, IndexedTool[]>();\n\n /** Children registries that we track */\n private children = new Set<ToolRegistry>();\n\n // ---- O(1) indexes over EFFECTIVE set (local + adopted) ----\n private byQualifiedId = new Map<string, IndexedTool>(); // qualifiedId -> row\n private byName = new Map<string, IndexedTool[]>(); // baseName -> rows\n private byOwnerAndName = new Map<string, IndexedTool>(); // \"ownerKey:name\" -> row\n private byProviderAndName = new Map<string, IndexedTool>(); // \"providerId:name\" -> row (best-effort)\n private byOwner = new Map<string, IndexedTool[]>(); // ownerKey -> rows\n\n // version + emitter\n private version = 0;\n private emitter = new ToolEmitter();\n\n constructor(providers: ProviderRegistry, list: ToolType[], owner: EntryOwnerRef) {\n // disable auto so subclass fields initialize first\n super('ToolRegistry', providers, list, false);\n this.owner = owner;\n\n // now it’s safe to run the lifecycle\n this.buildGraph();\n this.ready = this.initialize();\n }\n\n /* -------------------- Build-time: defs + dep checks -------------------- */\n\n protected override buildMap(list: ToolType[]): RegistryBuildMapResult<ToolRecord> {\n const tokens = new Set<Token>();\n const defs = new Map<Token, ToolRecord>();\n const graph = new Map<Token, Set<Token>>();\n for (const raw of list) {\n const rec = normalizeTool(raw);\n const provide = rec.provide;\n tokens.add(provide);\n defs.set(provide, rec);\n graph.set(provide, new Set());\n }\n return {tokens, defs, graph};\n }\n\n protected buildGraph() {\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n const deps = toolDiscoveryDeps(rec);\n\n for (const d of deps) {\n // Validate against hierarchical providers; throws early if missing\n this.providers.get(d);\n this.graph.get(token)!.add(d);\n }\n }\n }\n\n /* -------------------- Initialize: create ONE FrontMcpToolInstance per local tool -------------------- */\n\n protected override async initialize(): Promise<void> {\n // Instantiate each local tool once and store in this.instances (from RegistryAbstract)\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n\n // Single, authoritative instance per local tool\n const ti = new ToolInstance(rec, this.providers, this.owner);\n this.instances.set(token as Token<ToolInstance>, ti);\n\n const lineage: EntryLineage = this.owner ? [this.owner] : [];\n const row = this.makeRow(token, ti, lineage, this);\n this.localRows.push(row);\n }\n\n const childAppRegistries = this.providers.getRegistries('AppRegistry');\n childAppRegistries.forEach(appRegistry => {\n const apps = appRegistry.getApps();\n for (const app of apps) {\n const appToolsRegistries = app.providers.getRegistries('ToolRegistry');\n appToolsRegistries.filter(t => t.owner.kind === 'app').forEach(appToolRegistry => {\n this.adoptFromChild(appToolRegistry as ToolRegistry, appToolRegistry.owner);\n });\n }\n });\n\n const childToolRegistries = this.providers.getRegistries('ToolRegistry');\n childToolRegistries.filter(t => t != this).forEach(toolRegistry => {\n this.adoptFromChild(toolRegistry as ToolRegistry, toolRegistry.owner);\n });\n\n // Build effective indexes from (locals + already adopted children)\n this.reindex();\n this.bump('reset');\n\n\n const scope = this.providers.getActiveScope();\n await scope.registryFlows(ToolsListFlow, CallToolFlow)\n }\n\n /* -------------------- Adoption: reference child instances (no cloning) -------------------- */\n\n /**\n * Adopt tools from a child registry. Parent runs after children are ready.\n * We *reference* the child's tool instances; no duplicates are created.\n *\n * IMPORTANT:\n * - Child rows already include the child's own lineage (e.g., adapter:openapi).\n * - Here we only prepend the **parent's** owner, to avoid double-prefixing the child.\n */\n adoptFromChild(child: ToolRegistry, _childOwner: EntryOwnerRef): void {\n if (this.children.has(child)) return;\n\n const childRows = child.listAllIndexed(); // includes child's lineage\n const prepend: EntryLineage = this.owner ? [this.owner] : [];\n\n const adoptedRows = childRows.map(r => this.relineage(r, prepend));\n\n this.adopted.set(child, adoptedRows);\n this.children.add(child);\n\n // keep live if child changes\n child.subscribe({immediate: false}, () => {\n const latest = child.listAllIndexed().map(r => this.relineage(r, prepend));\n this.adopted.set(child, latest);\n this.reindex();\n this.bump('reset');\n });\n\n this.reindex();\n this.bump('reset');\n }\n\n getTools(includeHidden: boolean = false): ToolEntry<any, any>[] {\n const local = [...this.localRows].flat().map(t => t.instance);\n const adopted = [...this.adopted.values()].flat().map(t => t.instance);\n return [...local, ...adopted].filter(t => t.metadata.hideFromDiscovery !== true || includeHidden);\n }\n\n getInlineTools(): ToolEntry<any, any>[] {\n return [...this.instances.values()];\n }\n\n /** Internal snapshot of effective indexed rows (locals + adopted). */\n private listAllIndexed(): IndexedTool[] {\n return [...this.localRows, ...[...this.adopted.values()].flat()];\n }\n\n /* -------------------- Indexing & lookups -------------------- */\n\n private reindex() {\n const effective = this.listAllIndexed();\n\n this.byQualifiedId.clear();\n this.byName.clear();\n this.byOwnerAndName.clear();\n this.byProviderAndName.clear();\n this.byOwner.clear();\n\n for (const r of effective) {\n this.byQualifiedId.set(r.qualifiedId, r);\n\n const listByName = this.byName.get(r.baseName) ?? [];\n listByName.push(r);\n this.byName.set(r.baseName, listByName);\n\n const byOwnerKey = this.byOwner.get(r.ownerKey) ?? [];\n byOwnerKey.push(r);\n this.byOwner.set(r.ownerKey, byOwnerKey);\n\n const on = `${r.ownerKey}:${r.baseName}`;\n if (!this.byOwnerAndName.has(on)) this.byOwnerAndName.set(on, r);\n\n const provId = this.providerIdOf(r.instance);\n if (provId) {\n const pn = `${provId}:${r.baseName}`;\n if (!this.byProviderAndName.has(pn)) this.byProviderAndName.set(pn, r);\n }\n }\n }\n\n /** List all instances (locals + adopted). */\n listAllInstances(): readonly ToolInstance[] {\n return this.listAllIndexed().map(r => r.instance);\n }\n\n /** List instances by owner path (e.g. \"app:Portal/plugin:Okta\") */\n listByOwner(ownerPath: string): readonly ToolInstance[] {\n return (this.byOwner.get(ownerPath) ?? []).map(r => r.instance);\n }\n\n /* -------------------- Conflict-aware exported names -------------------- */\n\n /**\n * Produce unique, MCP-valid exported names.\n * - Base (standardized) = metadata.name cased (snake/camel/kebab/dot)\n * - If conflicting:\n * - Locals keep bare base (unless >1 locals conflict → they get owner prefixes)\n * - Children with same base get prefixed by providerId (or owner path)\n */\n exportResolvedNames(opts?: ExportNameOptions): Array<{ name: string; instance: ToolInstance }> {\n const cfg = {...DEFAULT_EXPORT_OPTS, ...(opts ?? {})};\n\n const rows = this.listAllIndexed().map(r => {\n const base = normalizeSegment(r.baseName, cfg.case);\n const isLocal = r.source === this;\n const provider = normalizeProviderId(this.providerIdOf(r.instance), cfg.case);\n const ownerPath = normalizeOwnerPath(r.ownerKey, cfg.case);\n return {base, row: r, isLocal, provider, ownerPath};\n });\n\n // group by standardized base\n const byBase = new Map<string, typeof rows>();\n for (const r of rows) {\n const list = byBase.get(r.base) ?? [];\n list.push(r);\n byBase.set(r.base, list);\n }\n\n const out = new Map<string, ToolInstance>();\n\n for (const [base, group] of byBase.entries()) {\n if (group.length === 1) {\n const g = group[0];\n out.set(ensureMaxLen(base, cfg.maxLen), g.row.instance);\n continue;\n }\n\n const locals = group.filter(g => g.isLocal);\n const children = group.filter(g => !g.isLocal);\n\n if (cfg.prefixChildrenOnConflict && locals.length > 0) {\n // Locals\n if (locals.length === 1) {\n const localName = ensureMaxLen(base, cfg.maxLen);\n out.set(disambiguate(localName, out, cfg), locals[0].row.instance);\n } else {\n for (const l of locals) {\n const pref = normalizeOwnerPath(l.ownerPath, cfg.case);\n const name = ensureMaxLen(`${pref}${sepFor(cfg.case)}${base}`, cfg.maxLen);\n out.set(disambiguate(name, out, cfg), l.row.instance);\n }\n }\n\n // Children\n for (const c of children) {\n const pre = cfg.prefixSource === 'provider'\n ? (c.provider ?? c.ownerPath)\n : c.ownerPath;\n const name = ensureMaxLen(`${pre}${sepFor(cfg.case)}${base}`, cfg.maxLen);\n out.set(disambiguate(name, out, cfg), c.row.instance);\n }\n } else {\n // Prefix everyone by source\n for (const r of group) {\n const pre = cfg.prefixSource === 'provider'\n ? (r.provider ?? r.ownerPath)\n : r.ownerPath;\n const name = ensureMaxLen(`${pre}${sepFor(cfg.case)}${base}`, cfg.maxLen);\n out.set(disambiguate(name, out, cfg), r.row.instance);\n }\n }\n }\n\n return [...out.entries()]\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([name, instance]) => ({name, instance}));\n\n function disambiguate(candidate: string, pool: Map<string, any>, cfg: Required<ExportNameOptions>): string {\n if (!pool.has(candidate)) return candidate;\n let n = 2;\n while (true) {\n const withN = ensureMaxLen(`${candidate}${sepFor(cfg.case)}${n}`, cfg.maxLen);\n if (!pool.has(withN)) return withN;\n n++;\n }\n }\n }\n\n /** Lookup by the exported (resolved) name. */\n getExported(name: string, opts?: ExportNameOptions): ToolInstance | undefined {\n const pairs = this.exportResolvedNames(opts);\n return pairs.find(p => p.name === name)?.instance;\n }\n\n /* -------------------- Subscriptions -------------------- */\n\n subscribe(\n opts: { immediate?: boolean; filter?: (i: ToolInstance) => boolean },\n cb: (evt: ToolChangeEvent) => void,\n ): () => void {\n const filter = opts.filter ?? (() => true);\n if (opts.immediate) {\n cb({\n kind: 'reset',\n scope: 'global',\n version: this.version,\n snapshot: this.listAllInstances().filter(filter),\n });\n }\n return this.emitter.on((e) => cb({...e, snapshot: this.listAllInstances().filter(filter)}));\n }\n\n private bump(kind: ToolChangeEvent['kind']) {\n const version = ++this.version;\n this.emitter.emit({kind, scope: 'global', version, snapshot: this.listAllInstances()});\n }\n\n /* -------------------- Helpers -------------------- */\n\n /** Build an IndexedTool row */\n private makeRow(token: Token, instance: ToolInstance, lineage: EntryLineage, source: ToolRegistry): IndexedTool {\n const ownerKey = ownerKeyOf(lineage);\n const baseName = instance.name;\n const qualifiedName = qualifiedNameOf(lineage, baseName);\n const qualifiedId = `${ownerKey}:${tokenName(token)}`;\n return {token, instance, baseName, lineage, ownerKey, qualifiedName, qualifiedId, source};\n }\n\n /** Clone a child row and prepend lineage (with adjacent de-dup to avoid double prefixes). */\n private relineage(row: IndexedTool, prepend: EntryLineage): IndexedTool {\n const merged = [...prepend, ...row.lineage];\n const lineage = dedupLineage(merged);\n\n const ownerKey = ownerKeyOf(lineage);\n const qualifiedName = qualifiedNameOf(lineage, row.baseName);\n const qualifiedId = `${ownerKey}:${tokenName(row.token)}`;\n return {\n token: row.token,\n instance: row.instance, // REFERENCE the same instance\n baseName: row.baseName,\n lineage,\n ownerKey,\n qualifiedName,\n qualifiedId,\n source: row.source, // keep original source (who constructed instance)\n };\n }\n\n /** Best-effort provider id used for prefixing (inspects class metadata if present). */\n private providerIdOf(inst: ToolInstance): string | undefined {\n // Try reading provider id from the tool class metadata (if your decorators set one)\n try {\n const meta: any = inst.getMetadata?.();\n const maybe = meta?.providerId ?? meta?.provider ?? meta?.ownerId ?? undefined;\n if (typeof maybe === 'string' && maybe.length) return maybe;\n\n const cls: any = (meta && meta.cls) ? meta.cls : undefined;\n if (cls) {\n const id = getMetadata('id', cls);\n if (typeof id === 'string' && id.length) return id;\n if (cls.name) return cls.name;\n }\n } catch {\n /* ignore */\n }\n return undefined;\n }\n\n /** True if this registry (or adopted children) has any tools. */\n hasAny(): boolean {\n return this.listAllIndexed().length > 0 || this.tokens.size > 0;\n }\n}\n\n/* -------------------- lineage utility -------------------- */\n\n/** Remove only adjacent duplicates like [adapter:x, adapter:x] → [adapter:x] */\nfunction dedupLineage(l: EntryLineage): EntryLineage {\n const out: EntryLineage = [];\n for (const o of l) {\n const last = out[out.length - 1];\n if (!last || last.kind !== o.kind || last.id !== o.id) out.push(o);\n }\n return out;\n}\n"]}
1
+ {"version":3,"file":"tool.registry.js","sourceRoot":"","sources":["../../../src/tool/tool.registry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EntryLineage,\n EntryOwnerRef,\n Token,\n ToolEntry,\n ToolRecord,\n ToolRegistryInterface,\n ToolType\n} from '../common';\nimport {getMetadata} from '../utils/metadata.utils';\nimport {ToolChangeEvent, ToolEmitter} from './tool.events';\nimport ProviderRegistry from '../provider/provider.registry';\nimport {\n ensureMaxLen,\n normalizeOwnerPath,\n normalizeProviderId,\n normalizeSegment,\n normalizeTool, ownerKeyOf, qualifiedNameOf, sepFor,\n toolDiscoveryDeps\n} from './tool.utils';\nimport {tokenName} from '../utils/token.utils';\nimport {RegistryAbstract, RegistryBuildMapResult} from '../regsitry';\nimport {ToolInstance} from './tool.instance';\nimport {DEFAULT_EXPORT_OPTS, ExportNameOptions, IndexedTool} from \"./tool.types\";\nimport ToolsListFlow from \"./flows/tools-list.flow\";\nimport CallToolFlow from \"./flows/call-tool.flow\";\n\n\nexport default class ToolRegistry\n extends RegistryAbstract<\n ToolInstance, // IMPORTANT: instances map holds ToolInstance (not the interface)\n ToolRecord,\n ToolType[]\n >\n implements ToolRegistryInterface\n{\n /** Who owns this registry (used for provenance). Optional. */\n owner: EntryOwnerRef;\n\n /** Tools truly owned/constructed by THIS registry (with lineage applied) */\n private localRows: IndexedTool[] = [];\n\n /** Adopted tool rows from each child registry (references to the same instances) */\n private adopted = new Map<ToolRegistry, IndexedTool[]>();\n\n /** Children registries that we track */\n private children = new Set<ToolRegistry>();\n\n // ---- O(1) indexes over EFFECTIVE set (local + adopted) ----\n private byQualifiedId = new Map<string, IndexedTool>(); // qualifiedId -> row\n private byName = new Map<string, IndexedTool[]>(); // baseName -> rows\n private byOwnerAndName = new Map<string, IndexedTool>(); // \"ownerKey:name\" -> row\n private byProviderAndName = new Map<string, IndexedTool>(); // \"providerId:name\" -> row (best-effort)\n private byOwner = new Map<string, IndexedTool[]>(); // ownerKey -> rows\n\n // version + emitter\n private version = 0;\n private emitter = new ToolEmitter();\n\n constructor(providers: ProviderRegistry, list: ToolType[], owner: EntryOwnerRef) {\n // disable auto so subclass fields initialize first\n super('ToolRegistry', providers, list, false);\n this.owner = owner;\n\n // now it’s safe to run the lifecycle\n this.buildGraph();\n this.ready = this.initialize();\n }\n\n /* -------------------- Build-time: defs + dep checks -------------------- */\n\n protected override buildMap(list: ToolType[]): RegistryBuildMapResult<ToolRecord> {\n const tokens = new Set<Token>();\n const defs = new Map<Token, ToolRecord>();\n const graph = new Map<Token, Set<Token>>();\n for (const raw of list) {\n const rec = normalizeTool(raw);\n const provide = rec.provide;\n tokens.add(provide);\n defs.set(provide, rec);\n graph.set(provide, new Set());\n }\n return { tokens, defs, graph };\n }\n\n protected buildGraph() {\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n const deps = toolDiscoveryDeps(rec);\n\n for (const d of deps) {\n // Validate against hierarchical providers; throws early if missing\n this.providers.get(d);\n this.graph.get(token)!.add(d);\n }\n }\n }\n\n /* -------------------- Initialize: create ONE FrontMcpToolInstance per local tool -------------------- */\n\n protected override async initialize(): Promise<void> {\n // Instantiate each local tool once and store in this.instances (from RegistryAbstract)\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n\n // Single, authoritative instance per local tool\n const ti = new ToolInstance(rec, this.providers, this.owner);\n this.instances.set(token as Token<ToolInstance>, ti);\n\n const lineage: EntryLineage = this.owner ? [this.owner] : [];\n const row = this.makeRow(token, ti, lineage, this);\n this.localRows.push(row);\n }\n\n const childAppRegistries = this.providers.getRegistries('AppRegistry');\n childAppRegistries.forEach((appRegistry) => {\n const apps = appRegistry.getApps();\n for (const app of apps) {\n const appToolsRegistries = app.providers.getRegistries('ToolRegistry');\n appToolsRegistries\n .filter((t) => t.owner.kind === 'app')\n .forEach((appToolRegistry) => {\n this.adoptFromChild(appToolRegistry as ToolRegistry, appToolRegistry.owner);\n });\n }\n });\n\n const childToolRegistries = this.providers.getRegistries('ToolRegistry');\n childToolRegistries\n .filter((t) => t != this)\n .forEach((toolRegistry) => {\n this.adoptFromChild(toolRegistry as ToolRegistry, toolRegistry.owner);\n });\n\n // Build effective indexes from (locals + already adopted children)\n this.reindex();\n this.bump('reset');\n\n const scope = this.providers.getActiveScope();\n await scope.registryFlows(ToolsListFlow, CallToolFlow);\n }\n\n /* -------------------- Adoption: reference child instances (no cloning) -------------------- */\n\n /**\n * Adopt tools from a child registry. Parent runs after children are ready.\n * We *reference* the child's tool instances; no duplicates are created.\n *\n * IMPORTANT:\n * - Child rows already include the child's own lineage (e.g., adapter:openapi).\n * - Here we only prepend the **parent's** owner, to avoid double-prefixing the child.\n */\n adoptFromChild(child: ToolRegistry, _childOwner: EntryOwnerRef): void {\n if (this.children.has(child)) return;\n\n const childRows = child.listAllIndexed(); // includes child's lineage\n const prepend: EntryLineage = this.owner ? [this.owner] : [];\n\n const adoptedRows = childRows.map((r) => this.relineage(r, prepend));\n\n this.adopted.set(child, adoptedRows);\n this.children.add(child);\n\n // keep live if child changes\n child.subscribe({ immediate: false }, () => {\n const latest = child.listAllIndexed().map((r) => this.relineage(r, prepend));\n this.adopted.set(child, latest);\n this.reindex();\n this.bump('reset');\n });\n\n this.reindex();\n this.bump('reset');\n }\n\n getTools(includeHidden = false): ToolEntry<any, any>[] {\n const local = [...this.localRows].flat().map(t => t.instance);\n const adopted = [...this.adopted.values()].flat().map(t => t.instance);\n return [...local, ...adopted].filter(t => t.metadata.hideFromDiscovery !== true || includeHidden);\n }\n\n getInlineTools(): ToolEntry<any, any>[] {\n return [...this.instances.values()];\n }\n\n /** Internal snapshot of effective indexed rows (locals + adopted). */\n private listAllIndexed(): IndexedTool[] {\n return [...this.localRows, ...[...this.adopted.values()].flat()];\n }\n\n /* -------------------- Indexing & lookups -------------------- */\n\n private reindex() {\n const effective = this.listAllIndexed();\n\n this.byQualifiedId.clear();\n this.byName.clear();\n this.byOwnerAndName.clear();\n this.byProviderAndName.clear();\n this.byOwner.clear();\n\n for (const r of effective) {\n this.byQualifiedId.set(r.qualifiedId, r);\n\n const listByName = this.byName.get(r.baseName) ?? [];\n listByName.push(r);\n this.byName.set(r.baseName, listByName);\n\n const byOwnerKey = this.byOwner.get(r.ownerKey) ?? [];\n byOwnerKey.push(r);\n this.byOwner.set(r.ownerKey, byOwnerKey);\n\n const on = `${r.ownerKey}:${r.baseName}`;\n if (!this.byOwnerAndName.has(on)) this.byOwnerAndName.set(on, r);\n\n const provId = this.providerIdOf(r.instance);\n if (provId) {\n const pn = `${provId}:${r.baseName}`;\n if (!this.byProviderAndName.has(pn)) this.byProviderAndName.set(pn, r);\n }\n }\n }\n\n /** List all instances (locals + adopted). */\n listAllInstances(): readonly ToolInstance[] {\n return this.listAllIndexed().map((r) => r.instance);\n }\n\n /** List instances by owner path (e.g. \"app:Portal/plugin:Okta\") */\n listByOwner(ownerPath: string): readonly ToolInstance[] {\n return (this.byOwner.get(ownerPath) ?? []).map((r) => r.instance);\n }\n\n /* -------------------- Conflict-aware exported names -------------------- */\n\n /**\n * Produce unique, MCP-valid exported names.\n * - Base (standardized) = metadata.name cased (snake/camel/kebab/dot)\n * - If conflicting:\n * - Locals keep bare base (unless >1 locals conflict → they get owner prefixes)\n * - Children with same base get prefixed by providerId (or owner path)\n */\n exportResolvedNames(opts?: ExportNameOptions): Array<{ name: string; instance: ToolInstance }> {\n const cfg = { ...DEFAULT_EXPORT_OPTS, ...(opts ?? {}) };\n\n const rows = this.listAllIndexed().map((r) => {\n const base = normalizeSegment(r.baseName, cfg.case);\n const isLocal = r.source === this;\n const provider = normalizeProviderId(this.providerIdOf(r.instance), cfg.case);\n const ownerPath = normalizeOwnerPath(r.ownerKey, cfg.case);\n return { base, row: r, isLocal, provider, ownerPath };\n });\n\n // group by standardized base\n const byBase = new Map<string, typeof rows>();\n for (const r of rows) {\n const list = byBase.get(r.base) ?? [];\n list.push(r);\n byBase.set(r.base, list);\n }\n\n const out = new Map<string, ToolInstance>();\n\n for (const [base, group] of byBase.entries()) {\n if (group.length === 1) {\n const g = group[0];\n out.set(ensureMaxLen(base, cfg.maxLen), g.row.instance);\n continue;\n }\n\n const locals = group.filter((g) => g.isLocal);\n const children = group.filter((g) => !g.isLocal);\n\n if (cfg.prefixChildrenOnConflict && locals.length > 0) {\n // Locals\n if (locals.length === 1) {\n const localName = ensureMaxLen(base, cfg.maxLen);\n out.set(disambiguate(localName, out, cfg), locals[0].row.instance);\n } else {\n for (const l of locals) {\n const pref = normalizeOwnerPath(l.ownerPath, cfg.case);\n const name = ensureMaxLen(`${pref}${sepFor(cfg.case)}${base}`, cfg.maxLen);\n out.set(disambiguate(name, out, cfg), l.row.instance);\n }\n }\n\n // Children\n for (const c of children) {\n const pre = cfg.prefixSource === 'provider' ? c.provider ?? c.ownerPath : c.ownerPath;\n const name = ensureMaxLen(`${pre}${sepFor(cfg.case)}${base}`, cfg.maxLen);\n out.set(disambiguate(name, out, cfg), c.row.instance);\n }\n } else {\n // Prefix everyone by source\n for (const r of group) {\n const pre = cfg.prefixSource === 'provider' ? r.provider ?? r.ownerPath : r.ownerPath;\n const name = ensureMaxLen(`${pre}${sepFor(cfg.case)}${base}`, cfg.maxLen);\n out.set(disambiguate(name, out, cfg), r.row.instance);\n }\n }\n }\n\n return [...out.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([name, instance]) => ({ name, instance }));\n\n function disambiguate(candidate: string, pool: Map<string, any>, cfg: Required<ExportNameOptions>): string {\n if (!pool.has(candidate)) return candidate;\n let n = 2;\n while (true) {\n const withN = ensureMaxLen(`${candidate}${sepFor(cfg.case)}${n}`, cfg.maxLen);\n if (!pool.has(withN)) return withN;\n n++;\n }\n }\n }\n\n /** Lookup by the exported (resolved) name. */\n getExported(name: string, opts?: ExportNameOptions): ToolInstance | undefined {\n const pairs = this.exportResolvedNames(opts);\n return pairs.find((p) => p.name === name)?.instance;\n }\n\n /* -------------------- Subscriptions -------------------- */\n\n subscribe(\n opts: { immediate?: boolean; filter?: (i: ToolInstance) => boolean },\n cb: (evt: ToolChangeEvent) => void,\n ): () => void {\n const filter = opts.filter ?? (() => true);\n if (opts.immediate) {\n cb({\n kind: 'reset',\n scope: 'global',\n version: this.version,\n snapshot: this.listAllInstances().filter(filter),\n });\n }\n return this.emitter.on((e) => cb({ ...e, snapshot: this.listAllInstances().filter(filter) }));\n }\n\n private bump(kind: ToolChangeEvent['kind']) {\n const version = ++this.version;\n this.emitter.emit({ kind, scope: 'global', version, snapshot: this.listAllInstances() });\n }\n\n /* -------------------- Helpers -------------------- */\n\n /** Build an IndexedTool row */\n private makeRow(token: Token, instance: ToolInstance, lineage: EntryLineage, source: ToolRegistry): IndexedTool {\n const ownerKey = ownerKeyOf(lineage);\n const baseName = instance.name;\n const qualifiedName = qualifiedNameOf(lineage, baseName);\n const qualifiedId = `${ownerKey}:${tokenName(token)}`;\n return { token, instance, baseName, lineage, ownerKey, qualifiedName, qualifiedId, source };\n }\n\n /** Clone a child row and prepend lineage (with adjacent de-dup to avoid double prefixes). */\n private relineage(row: IndexedTool, prepend: EntryLineage): IndexedTool {\n const merged = [...prepend, ...row.lineage];\n const lineage = dedupLineage(merged);\n\n const ownerKey = ownerKeyOf(lineage);\n const qualifiedName = qualifiedNameOf(lineage, row.baseName);\n const qualifiedId = `${ownerKey}:${tokenName(row.token)}`;\n return {\n token: row.token,\n instance: row.instance, // REFERENCE the same instance\n baseName: row.baseName,\n lineage,\n ownerKey,\n qualifiedName,\n qualifiedId,\n source: row.source, // keep original source (who constructed instance)\n };\n }\n\n /** Best-effort provider id used for prefixing (inspects class metadata if present). */\n private providerIdOf(inst: ToolInstance): string | undefined {\n // Try reading provider id from the tool class metadata (if your decorators set one)\n try {\n const meta: any = inst.getMetadata?.();\n const maybe = meta?.providerId ?? meta?.provider ?? meta?.ownerId ?? undefined;\n if (typeof maybe === 'string' && maybe.length) return maybe;\n\n const cls: any = meta && meta.cls ? meta.cls : undefined;\n if (cls) {\n const id = getMetadata('id', cls);\n if (typeof id === 'string' && id.length) return id;\n if (cls.name) return cls.name;\n }\n } catch {\n /* ignore */\n }\n return undefined;\n }\n\n /** True if this registry (or adopted children) has any tools. */\n hasAny(): boolean {\n return this.listAllIndexed().length > 0 || this.tokens.size > 0;\n }\n}\n\n/* -------------------- lineage utility -------------------- */\n\n/** Remove only adjacent duplicates like [adapter:x, adapter:x] → [adapter:x] */\nfunction dedupLineage(l: EntryLineage): EntryLineage {\n const out: EntryLineage = [];\n for (const o of l) {\n const last = out[out.length - 1];\n if (!last || last.kind !== o.kind || last.id !== o.id) out.push(o);\n }\n return out;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { ToolMetadata, ToolType, Token, ToolRecord, EntryLineage } from '../common';
2
- import { NameCase } from "./tool.types";
1
+ import { ToolMetadata, ToolType, Token, ToolRecord, EntryLineage, ParsedToolResult } from '../common';
2
+ import { NameCase } from './tool.types';
3
3
  export declare function collectToolMetadata(cls: ToolType): ToolMetadata;
4
4
  export declare function normalizeTool(item: any): ToolRecord;
5
5
  /**
@@ -18,3 +18,4 @@ export declare function ensureMaxLen(name: string, max: number): string;
18
18
  export declare function sepFor(kind: NameCase): string;
19
19
  export declare function ownerKeyOf(lineage: EntryLineage): string;
20
20
  export declare function qualifiedNameOf(lineage: EntryLineage, name: string): string;
21
+ export declare function buildParsedToolResult(descriptor: any, raw: unknown): ParsedToolResult;
@@ -13,9 +13,12 @@ exports.ensureMaxLen = ensureMaxLen;
13
13
  exports.sepFor = sepFor;
14
14
  exports.ownerKeyOf = ownerKeyOf;
15
15
  exports.qualifiedNameOf = qualifiedNameOf;
16
+ exports.buildParsedToolResult = buildParsedToolResult;
17
+ // file: libs/sdk/src/tool/tool.utils.ts
16
18
  const common_1 = require("../common");
17
19
  const token_utils_1 = require("../utils/token.utils");
18
20
  const metadata_utils_1 = require("../utils/metadata.utils");
21
+ const zod_1 = require("zod");
19
22
  function collectToolMetadata(cls) {
20
23
  const extended = (0, metadata_utils_1.getMetadata)(common_1.extendedToolMetadata, cls);
21
24
  const seed = (extended ? { ...extended } : {});
@@ -23,7 +26,7 @@ function collectToolMetadata(cls) {
23
26
  const value = (0, metadata_utils_1.getMetadata)(token, cls);
24
27
  if (value) {
25
28
  return Object.assign(metadata, {
26
- [key]: value
29
+ [key]: value,
27
30
  });
28
31
  }
29
32
  else {
@@ -32,7 +35,10 @@ function collectToolMetadata(cls) {
32
35
  }, seed);
33
36
  }
34
37
  function normalizeTool(item) {
35
- if (item && typeof item === 'function' && item[common_1.FrontMcpToolTokens.type] === 'function-tool' && item[common_1.FrontMcpToolTokens.metadata]) {
38
+ if (item &&
39
+ typeof item === 'function' &&
40
+ item[common_1.FrontMcpToolTokens.type] === 'function-tool' &&
41
+ item[common_1.FrontMcpToolTokens.metadata]) {
36
42
  return {
37
43
  kind: common_1.ToolKind.FUNCTION,
38
44
  provide: item(),
@@ -92,22 +98,25 @@ function toCase(words, kind) {
92
98
  const safe = words.filter(Boolean);
93
99
  switch (kind) {
94
100
  case 'snake':
95
- return safe.map(w => w.toLowerCase()).join('_');
101
+ return safe.map((w) => w.toLowerCase()).join('_');
96
102
  case 'kebab':
97
- return safe.map(w => w.toLowerCase()).join('-');
103
+ return safe.map((w) => w.toLowerCase()).join('-');
98
104
  case 'dot':
99
- return safe.map(w => w.toLowerCase()).join('.');
105
+ return safe.map((w) => w.toLowerCase()).join('.');
100
106
  case 'camel':
101
107
  if (safe.length === 0)
102
108
  return '';
103
- return safe[0].toLowerCase() + safe.slice(1)
104
- .map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('');
109
+ return (safe[0].toLowerCase() +
110
+ safe
111
+ .slice(1)
112
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
113
+ .join(''));
105
114
  }
106
115
  }
107
116
  function normalizeSegment(raw, kind) {
108
117
  const words = splitWords(raw);
109
118
  let cased = toCase(words, kind);
110
- cased = [...cased].filter(ch => MCP_ALLOWED.test(ch)).join('');
119
+ cased = [...cased].filter((ch) => MCP_ALLOWED.test(ch)).join('');
111
120
  return cased || 'x';
112
121
  }
113
122
  function normalizeProviderId(raw, kind) {
@@ -115,24 +124,26 @@ function normalizeProviderId(raw, kind) {
115
124
  return undefined;
116
125
  const tokens = raw.split(/\W+/);
117
126
  const cased = toCase(tokens, kind);
118
- const safe = [...cased].filter(ch => MCP_ALLOWED.test(ch)).join('');
127
+ const safe = [...cased].filter((ch) => MCP_ALLOWED.test(ch)).join('');
119
128
  return safe || undefined;
120
129
  }
121
130
  function normalizeOwnerPath(ownerKey, kind) {
122
131
  const levels = ownerKey.split('/');
123
- const normLevels = levels.map(level => {
132
+ const normLevels = levels.map((level) => {
124
133
  const parts = level.split(':'); // ["app","Portal"]
125
- return parts.map(p => normalizeSegment(p, kind)).join(kind === 'snake' ? '_' : kind === 'kebab' ? '-' : kind === 'dot' ? '.' : '');
134
+ return parts
135
+ .map((p) => normalizeSegment(p, kind))
136
+ .join(kind === 'snake' ? '_' : kind === 'kebab' ? '-' : kind === 'dot' ? '.' : '');
126
137
  });
127
138
  if (kind === 'camel')
128
- return normLevels.map(seg => seg.charAt(0).toLowerCase() + seg.slice(1)).join('');
139
+ return normLevels.map((seg) => seg.charAt(0).toLowerCase() + seg.slice(1)).join('');
129
140
  const sep = kind === 'snake' ? '_' : kind === 'kebab' ? '-' : '.';
130
141
  return normLevels.join(sep);
131
142
  }
132
143
  function shortHash(s) {
133
144
  let h = 5381;
134
145
  for (let i = 0; i < s.length; i++)
135
- h = ((h << 5) + h) + s.charCodeAt(i);
146
+ h = (h << 5) + h + s.charCodeAt(i);
136
147
  return (h >>> 0).toString(16).slice(-6).padStart(6, '0');
137
148
  }
138
149
  function ensureMaxLen(name, max) {
@@ -149,9 +160,361 @@ function sepFor(kind) {
149
160
  return kind === 'snake' ? '_' : kind === 'kebab' ? '-' : kind === 'dot' ? '.' : '';
150
161
  }
151
162
  function ownerKeyOf(lineage) {
152
- return lineage.map(o => `${o.kind}:${o.id}`).join('/');
163
+ return lineage.map((o) => `${o.kind}:${o.id}`).join('/');
153
164
  }
154
165
  function qualifiedNameOf(lineage, name) {
155
166
  return `${ownerKeyOf(lineage)}:${name}`;
156
167
  }
168
+ function buildParsedToolResult(descriptor, raw) {
169
+ const content = [];
170
+ let structuredData;
171
+ // No outputSchema → the best effort: treat the result as structured JSON and text fallback
172
+ if (!descriptor) {
173
+ const structuredContent = getStructuredContent(raw);
174
+ const sanitized = structuredContent ?? raw;
175
+ content.push(makeJsonTextContent(sanitized));
176
+ return { content, structuredContent };
177
+ }
178
+ if (Array.isArray(descriptor)) {
179
+ // Multiple content items; expect raw to be an array of the same length.
180
+ const values = Array.isArray(raw) ? raw : [raw];
181
+ const parsedItems = [];
182
+ // Parse all items first
183
+ descriptor.forEach((singleDescriptor, idx) => {
184
+ const value = values[idx];
185
+ const { blocks, parsedValue, isPrimitive } = parseSingleValue(singleDescriptor, value);
186
+ parsedItems.push({ blocks, parsedValue, isPrimitive });
187
+ content.push(...blocks);
188
+ });
189
+ // Check if we have at least one non-primitive item
190
+ const hasNonPrimitive = parsedItems.some(item => !item.isPrimitive);
191
+ if (hasNonPrimitive && parsedItems.length > 1) {
192
+ // Multiple items with at least one non-string/primitive: use numeric indices
193
+ structuredData = {};
194
+ parsedItems.forEach((item, idx) => {
195
+ if (item.parsedValue !== undefined) {
196
+ structuredData[idx] = item.parsedValue;
197
+ }
198
+ });
199
+ }
200
+ else if (parsedItems.length === 1 && parsedItems[0].parsedValue !== undefined) {
201
+ // Single item: wrap primitives in {content: value}, use objects directly
202
+ if (parsedItems[0].isPrimitive) {
203
+ structuredData = { content: parsedItems[0].parsedValue };
204
+ }
205
+ else if (typeof parsedItems[0].parsedValue === 'object' && parsedItems[0].parsedValue !== null) {
206
+ // Non-primitive object (date, json, etc.) - use directly
207
+ structuredData = parsedItems[0].parsedValue;
208
+ }
209
+ else {
210
+ // Non-primitive but not an object (shouldn't happen, but handle it)
211
+ structuredData = { content: parsedItems[0].parsedValue };
212
+ }
213
+ }
214
+ else if (hasNonPrimitive) {
215
+ // Multiple items but only one has a value
216
+ structuredData = {};
217
+ parsedItems.forEach((item, idx) => {
218
+ if (item.parsedValue !== undefined) {
219
+ structuredData[idx] = item.parsedValue;
220
+ }
221
+ });
222
+ }
223
+ }
224
+ else {
225
+ const { blocks, parsedValue, isPrimitive } = parseSingleValue(descriptor, raw);
226
+ content.push(...blocks);
227
+ // Single item: wrap primitives in {content: value}, use objects directly
228
+ if (parsedValue !== undefined) {
229
+ if (isPrimitive) {
230
+ structuredData = { content: parsedValue };
231
+ }
232
+ else if (typeof parsedValue === 'object' && parsedValue !== null) {
233
+ // Non-primitive object (date, json, etc.) - use directly
234
+ structuredData = parsedValue;
235
+ }
236
+ else {
237
+ // Non-primitive but not an object (number, boolean, etc.) - wrap it
238
+ structuredData = { content: parsedValue };
239
+ }
240
+ }
241
+ }
242
+ const result = { content };
243
+ // Add structuredContent if we have structured data
244
+ if (structuredData !== undefined) {
245
+ result.structuredContent = structuredData;
246
+ }
247
+ return result;
248
+ }
249
+ /**
250
+ * Parse a single schema descriptor + value into one or more ContentBlocks.
251
+ *
252
+ * Returns:
253
+ * - blocks: content blocks to append
254
+ * - parsedValue: the parsed/validated value (for structuredContent)
255
+ * - isPrimitive: whether this is a primitive string type
256
+ */
257
+ function parseSingleValue(descriptor, value) {
258
+ // Literal primitives + special content types
259
+ if (typeof descriptor === 'string') {
260
+ switch (descriptor) {
261
+ case 'string':
262
+ return {
263
+ blocks: [makePrimitiveTextContent(value)],
264
+ parsedValue: value,
265
+ isPrimitive: true,
266
+ };
267
+ case 'number': {
268
+ const numValue = typeof value === 'number' ? value : Number(value);
269
+ return {
270
+ blocks: [makePrimitiveTextContent(value)],
271
+ parsedValue: isNaN(numValue) ? null : numValue,
272
+ isPrimitive: false,
273
+ };
274
+ }
275
+ case 'boolean': {
276
+ const boolValue = typeof value === 'boolean' ? value : Boolean(value);
277
+ return {
278
+ blocks: [makePrimitiveTextContent(value)],
279
+ parsedValue: boolValue,
280
+ isPrimitive: false,
281
+ };
282
+ }
283
+ case 'date': {
284
+ let dateValue = null;
285
+ if (value instanceof Date) {
286
+ dateValue = value;
287
+ }
288
+ else if (typeof value === 'string' || typeof value === 'number') {
289
+ const parsed = new Date(value);
290
+ if (!isNaN(parsed.getTime())) {
291
+ dateValue = parsed;
292
+ }
293
+ }
294
+ return {
295
+ blocks: [makePrimitiveTextContent(value)],
296
+ parsedValue: dateValue ? {
297
+ iso: dateValue.toISOString(),
298
+ timeInMilli: dateValue.getTime(),
299
+ } : null,
300
+ isPrimitive: false,
301
+ };
302
+ }
303
+ case 'image':
304
+ return {
305
+ blocks: toContentArray('image', value),
306
+ parsedValue: undefined,
307
+ isPrimitive: false,
308
+ };
309
+ case 'audio':
310
+ return {
311
+ blocks: toContentArray('audio', value),
312
+ parsedValue: undefined,
313
+ isPrimitive: false,
314
+ };
315
+ case 'resource':
316
+ return {
317
+ blocks: toContentArray('resource', value),
318
+ parsedValue: undefined,
319
+ isPrimitive: false,
320
+ };
321
+ case 'resource_link':
322
+ return {
323
+ blocks: toContentArray('resource_link', value),
324
+ parsedValue: undefined,
325
+ isPrimitive: false,
326
+ };
327
+ default:
328
+ // Unknown literal: just stringify as text
329
+ return {
330
+ blocks: [makePrimitiveTextContent(value)],
331
+ parsedValue: value,
332
+ isPrimitive: true,
333
+ };
334
+ }
335
+ }
336
+ // Zod primitives
337
+ if (descriptor instanceof zod_1.ZodString) {
338
+ return {
339
+ blocks: [makePrimitiveTextContent(value)],
340
+ parsedValue: value,
341
+ isPrimitive: true,
342
+ };
343
+ }
344
+ if (descriptor instanceof zod_1.ZodNumber) {
345
+ const parseResult = descriptor.safeParse(value);
346
+ const numValue = parseResult.success ? parseResult.data : (typeof value === 'number' ? value : Number(value));
347
+ return {
348
+ blocks: [makePrimitiveTextContent(value)],
349
+ parsedValue: isNaN(numValue) ? null : numValue,
350
+ isPrimitive: false,
351
+ };
352
+ }
353
+ if (descriptor instanceof zod_1.ZodBoolean) {
354
+ const parseResult = descriptor.safeParse(value);
355
+ const boolValue = parseResult.success ? parseResult.data : Boolean(value);
356
+ return {
357
+ blocks: [makePrimitiveTextContent(value)],
358
+ parsedValue: boolValue,
359
+ isPrimitive: false,
360
+ };
361
+ }
362
+ if (descriptor instanceof zod_1.ZodBigInt) {
363
+ const parseResult = descriptor.safeParse(value);
364
+ const bigIntValue = parseResult.success ? parseResult.data : (typeof value === 'bigint' ? value : null);
365
+ return {
366
+ blocks: [makePrimitiveTextContent(value)],
367
+ parsedValue: bigIntValue !== null ? bigIntValue.toString() : null,
368
+ isPrimitive: false,
369
+ };
370
+ }
371
+ if (descriptor instanceof zod_1.ZodDate) {
372
+ const parseResult = descriptor.safeParse(value);
373
+ const dateValue = parseResult.success ? parseResult.data : (value instanceof Date ? value : null);
374
+ return {
375
+ blocks: [makePrimitiveTextContent(value)],
376
+ parsedValue: dateValue ? {
377
+ iso: dateValue.toISOString(),
378
+ timeInMilli: dateValue.getTime(),
379
+ } : null,
380
+ isPrimitive: false,
381
+ };
382
+ }
383
+ // Anything else (Zod object/array/union, ZodRawShape, plain object) → JSON/structured
384
+ // Use Zod parsing if it's a Zod schema
385
+ let parsedValue;
386
+ if (descriptor instanceof zod_1.z.ZodType) {
387
+ // Use Zod to parse and validate
388
+ const parseResult = descriptor.safeParse(value);
389
+ if (parseResult.success) {
390
+ parsedValue = getStructuredContent(parseResult.data);
391
+ }
392
+ else {
393
+ // Validation failed, use sanitized raw value
394
+ parsedValue = getStructuredContent(value);
395
+ }
396
+ }
397
+ else if (typeof descriptor === 'object' && descriptor !== null) {
398
+ // ZodRawShape or plain object - try to create a Zod object schema
399
+ try {
400
+ const schema = zod_1.z.object(descriptor);
401
+ const parseResult = schema.safeParse(value);
402
+ if (parseResult.success) {
403
+ parsedValue = getStructuredContent(parseResult.data);
404
+ }
405
+ else {
406
+ parsedValue = getStructuredContent(value);
407
+ }
408
+ }
409
+ catch {
410
+ // Fallback to sanitized content
411
+ parsedValue = getStructuredContent(value);
412
+ }
413
+ }
414
+ else {
415
+ parsedValue = getStructuredContent(value);
416
+ }
417
+ return {
418
+ blocks: [makeJsonTextContent(parsedValue)],
419
+ parsedValue,
420
+ isPrimitive: false,
421
+ };
422
+ }
423
+ function makePrimitiveTextContent(value) {
424
+ return {
425
+ type: 'text',
426
+ text: value == null ? '' : String(value),
427
+ };
428
+ }
429
+ function makeJsonTextContent(jsonValue) {
430
+ let text;
431
+ try {
432
+ text = JSON.stringify(jsonValue);
433
+ }
434
+ catch {
435
+ text = jsonValue == null ? '' : String(jsonValue);
436
+ }
437
+ return { type: 'text', text };
438
+ }
439
+ /**
440
+ * Normalize any `value` into an array of content objects with the given MCP `type`.
441
+ * If `value` is already a single content object (with a matching type), it's wrapped.
442
+ * If it's an array, every element is assumed to already be a content object.
443
+ */
444
+ function toContentArray(expectedType, value) {
445
+ if (Array.isArray(value)) {
446
+ return value.filter(Boolean).map((v) => v);
447
+ }
448
+ if (value && typeof value === 'object' && value.type === expectedType) {
449
+ return [value];
450
+ }
451
+ // If the value is null/undefined or doesn't match, we just skip it.
452
+ return [];
453
+ }
454
+ /**
455
+ * Sanitize arbitrary JS values into JSON-safe objects suitable for:
456
+ * - MCP `structuredContent`
457
+ * - JSON.stringify without circular reference errors
458
+ *
459
+ * Rules:
460
+ * - Drop functions and symbols.
461
+ * - BigInt → string.
462
+ * - Date → ISO string.
463
+ * - Error → { name, message, stack }.
464
+ * - Map → plain object.
465
+ * - Set → array.
466
+ * - Protect against circular references via WeakSet.
467
+ */
468
+ function getStructuredContent(value) {
469
+ const seen = new WeakSet();
470
+ function sanitize(val) {
471
+ if (typeof val === 'function' || typeof val === 'symbol') {
472
+ return undefined;
473
+ }
474
+ if (typeof val === 'bigint') {
475
+ return val.toString();
476
+ }
477
+ if (val instanceof Date) {
478
+ return val.toISOString();
479
+ }
480
+ if (val instanceof Error) {
481
+ return {
482
+ name: val.name,
483
+ message: val.message,
484
+ stack: val.stack,
485
+ };
486
+ }
487
+ if (val instanceof Map) {
488
+ const obj = {};
489
+ for (const [k, v] of val.entries()) {
490
+ obj[String(k)] = sanitize(v);
491
+ }
492
+ return obj;
493
+ }
494
+ if (val instanceof Set) {
495
+ return Array.from(val).map(sanitize);
496
+ }
497
+ if (Array.isArray(val)) {
498
+ return val.map(sanitize);
499
+ }
500
+ if (val && typeof val === 'object') {
501
+ if (seen.has(val)) {
502
+ // Drop circular references
503
+ return undefined;
504
+ }
505
+ seen.add(val);
506
+ const sanitized = {};
507
+ for (const [key, value] of Object.entries(val)) {
508
+ const clean = sanitize(value);
509
+ if (clean !== undefined) {
510
+ sanitized[key] = clean;
511
+ }
512
+ }
513
+ return sanitized;
514
+ }
515
+ // Primitives pass through
516
+ return val;
517
+ }
518
+ return sanitize(value);
519
+ }
157
520
  //# sourceMappingURL=tool.utils.js.map