@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.
- package/LICENSE +201 -0
- package/README.md +192 -164
- package/package.json +7 -4
- package/src/__test-utils__/fixtures/hook.fixtures.d.ts +46 -0
- package/src/__test-utils__/fixtures/hook.fixtures.js +114 -0
- package/src/__test-utils__/fixtures/hook.fixtures.js.map +1 -0
- package/src/__test-utils__/fixtures/index.d.ts +7 -0
- package/src/__test-utils__/fixtures/index.js +11 -0
- package/src/__test-utils__/fixtures/index.js.map +1 -0
- package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +46 -0
- package/src/__test-utils__/fixtures/plugin.fixtures.js +127 -0
- package/src/__test-utils__/fixtures/plugin.fixtures.js.map +1 -0
- package/src/__test-utils__/fixtures/provider.fixtures.d.ts +69 -0
- package/src/__test-utils__/fixtures/provider.fixtures.js +131 -0
- package/src/__test-utils__/fixtures/provider.fixtures.js.map +1 -0
- package/src/__test-utils__/fixtures/scope.fixtures.d.ts +14 -0
- package/src/__test-utils__/fixtures/scope.fixtures.js +59 -0
- package/src/__test-utils__/fixtures/scope.fixtures.js.map +1 -0
- package/src/__test-utils__/fixtures/tool.fixtures.d.ts +36 -0
- package/src/__test-utils__/fixtures/tool.fixtures.js +91 -0
- package/src/__test-utils__/fixtures/tool.fixtures.js.map +1 -0
- package/src/__test-utils__/helpers/assertion.helpers.d.ts +45 -0
- package/src/__test-utils__/helpers/assertion.helpers.js +153 -0
- package/src/__test-utils__/helpers/assertion.helpers.js.map +1 -0
- package/src/__test-utils__/helpers/async.helpers.d.ts +48 -0
- package/src/__test-utils__/helpers/async.helpers.js +112 -0
- package/src/__test-utils__/helpers/async.helpers.js.map +1 -0
- package/src/__test-utils__/helpers/index.d.ts +6 -0
- package/src/__test-utils__/helpers/index.js +10 -0
- package/src/__test-utils__/helpers/index.js.map +1 -0
- package/src/__test-utils__/helpers/setup.helpers.d.ts +54 -0
- package/src/__test-utils__/helpers/setup.helpers.js +106 -0
- package/src/__test-utils__/helpers/setup.helpers.js.map +1 -0
- package/src/__test-utils__/index.d.ts +9 -0
- package/src/__test-utils__/index.js +14 -0
- package/src/__test-utils__/index.js.map +1 -0
- package/src/__test-utils__/mocks/flow-instance.mock.d.ts +50 -0
- package/src/__test-utils__/mocks/flow-instance.mock.js +72 -0
- package/src/__test-utils__/mocks/flow-instance.mock.js.map +1 -0
- package/src/__test-utils__/mocks/hook-registry.mock.d.ts +25 -0
- package/src/__test-utils__/mocks/hook-registry.mock.js +65 -0
- package/src/__test-utils__/mocks/hook-registry.mock.js.map +1 -0
- package/src/__test-utils__/mocks/index.d.ts +8 -0
- package/src/__test-utils__/mocks/index.js +12 -0
- package/src/__test-utils__/mocks/index.js.map +1 -0
- package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +43 -0
- package/src/__test-utils__/mocks/plugin-registry.mock.js +70 -0
- package/src/__test-utils__/mocks/plugin-registry.mock.js.map +1 -0
- package/src/__test-utils__/mocks/provider-registry.mock.d.ts +39 -0
- package/src/__test-utils__/mocks/provider-registry.mock.js +72 -0
- package/src/__test-utils__/mocks/provider-registry.mock.js.map +1 -0
- package/src/__test-utils__/mocks/tool-registry.mock.d.ts +43 -0
- package/src/__test-utils__/mocks/tool-registry.mock.js +79 -0
- package/src/__test-utils__/mocks/tool-registry.mock.js.map +1 -0
- package/src/app/app.utils.js.map +1 -1
- package/src/app/instances/app.local.instance.js +8 -11
- package/src/app/instances/app.local.instance.js.map +1 -1
- package/src/auth/auth.registry.d.ts +2 -2
- package/src/auth/auth.registry.js +3 -3
- package/src/auth/auth.registry.js.map +1 -1
- package/src/auth/flows/oauth.authorize.flow.d.ts +8 -8
- package/src/auth/flows/oauth.register.flow.d.ts +4 -4
- package/src/auth/flows/oauth.token.flow.d.ts +4 -4
- package/src/auth/flows/well-known.jwks.flow.d.ts +12 -12
- package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +8 -8
- package/src/auth/flows/well-known.prm.flow.d.ts +4 -4
- package/src/auth/instances/instance.local-primary-auth.d.ts +3 -2
- package/src/auth/instances/instance.local-primary-auth.js +4 -2
- package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
- package/src/auth/instances/instance.remote-primary-auth.d.ts +3 -2
- package/src/auth/instances/instance.remote-primary-auth.js +3 -1
- package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
- package/src/auth/jwks/jwks.service.js +0 -1
- package/src/auth/jwks/jwks.service.js.map +1 -1
- package/src/common/decorators/tool.decorator.d.ts +97 -36
- package/src/common/decorators/tool.decorator.js +0 -1
- package/src/common/decorators/tool.decorator.js.map +1 -1
- package/src/common/entries/scope.entry.d.ts +1 -0
- package/src/common/entries/scope.entry.js +6 -0
- package/src/common/entries/scope.entry.js.map +1 -1
- package/src/common/entries/tool.entry.d.ts +54 -11
- package/src/common/entries/tool.entry.js +19 -0
- package/src/common/entries/tool.entry.js.map +1 -1
- package/src/common/interfaces/internal/registry.interface.d.ts +10 -2
- package/src/common/interfaces/internal/registry.interface.js.map +1 -1
- package/src/common/interfaces/plugin.interface.d.ts +1 -1
- package/src/common/interfaces/plugin.interface.js.map +1 -1
- package/src/common/interfaces/tool.interface.d.ts +12 -7
- package/src/common/interfaces/tool.interface.js +1 -1
- package/src/common/interfaces/tool.interface.js.map +1 -1
- package/src/common/metadata/front-mcp.metadata.d.ts +145 -145
- package/src/common/metadata/hook.metadata.d.ts +4 -2
- package/src/common/metadata/hook.metadata.js.map +1 -1
- package/src/common/metadata/prompt.metadata.d.ts +28 -28
- package/src/common/metadata/prompt.metadata.js.map +1 -1
- package/src/common/metadata/resource.metadata.d.ts +54 -54
- package/src/common/metadata/tool.metadata.d.ts +190 -7
- package/src/common/metadata/tool.metadata.js +41 -6
- package/src/common/metadata/tool.metadata.js.map +1 -1
- package/src/common/records/scope.record.d.ts +2 -2
- package/src/common/records/scope.record.js.map +1 -1
- package/src/common/schemas/http-output.schema.d.ts +106 -106
- package/src/common/tokens/tool.tokens.js.map +1 -1
- package/src/common/types/options/logging.options.d.ts +1 -2
- package/src/common/types/options/logging.options.js +1 -9
- package/src/common/types/options/logging.options.js.map +1 -1
- package/src/common/types/options/server-info.options.d.ts +19 -19
- package/src/errors/error-handler.d.ts +65 -0
- package/src/errors/error-handler.js +107 -0
- package/src/errors/error-handler.js.map +1 -0
- package/src/errors/index.d.ts +2 -0
- package/src/errors/index.js +26 -0
- package/src/errors/index.js.map +1 -0
- package/src/errors/mcp.error.d.ts +156 -0
- package/src/errors/mcp.error.js +243 -0
- package/src/errors/mcp.error.js.map +1 -0
- package/src/flows/flow.instance.js +7 -6
- package/src/flows/flow.instance.js.map +1 -1
- package/src/flows/flow.registry.js +1 -1
- package/src/flows/flow.registry.js.map +1 -1
- package/src/front-mcp/front-mcp.providers.d.ts +20 -20
- package/src/hooks/hook.registry.d.ts +5 -3
- package/src/hooks/hook.registry.js +13 -1
- package/src/hooks/hook.registry.js.map +1 -1
- package/src/plugin/plugin.registry.d.ts +7 -2
- package/src/plugin/plugin.registry.js +23 -11
- package/src/plugin/plugin.registry.js.map +1 -1
- package/src/prompt/prompt.registry.js +1 -0
- package/src/prompt/prompt.registry.js.map +1 -1
- package/src/resource/resource.registry.js +1 -0
- package/src/resource/resource.registry.js.map +1 -1
- package/src/scope/scope.instance.js +8 -2
- package/src/scope/scope.instance.js.map +1 -1
- package/src/scope/scope.registry.js +3 -2
- package/src/scope/scope.registry.js.map +1 -1
- package/src/scope/scope.utils.js +6 -4
- package/src/scope/scope.utils.js.map +1 -1
- package/src/store/adapters/store.memory.adapter.js +3 -1
- package/src/store/adapters/store.memory.adapter.js.map +1 -1
- package/src/tool/flows/call-tool.flow.d.ts +1012 -676
- package/src/tool/flows/call-tool.flow.js +94 -61
- package/src/tool/flows/call-tool.flow.js.map +1 -1
- package/src/tool/flows/tools-list.flow.d.ts +347 -590
- package/src/tool/flows/tools-list.flow.js +76 -49
- package/src/tool/flows/tools-list.flow.js.map +1 -1
- package/src/tool/tool.instance.d.ts +27 -8
- package/src/tool/tool.instance.js +40 -5
- package/src/tool/tool.instance.js.map +1 -1
- package/src/tool/tool.registry.js +19 -21
- package/src/tool/tool.registry.js.map +1 -1
- package/src/tool/tool.utils.d.ts +3 -2
- package/src/tool/tool.utils.js +377 -14
- package/src/tool/tool.utils.js.map +1 -1
- package/src/transport/adapters/transport.sse.adapter.js +2 -1
- package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
- package/src/transport/flows/handle.sse.flow.js +6 -13
- package/src/transport/flows/handle.sse.flow.js.map +1 -1
- package/src/transport/flows/handle.streamable-http.flow.js +1 -0
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.d.ts +1 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js +10 -5
- package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/index.d.ts +151 -268
- package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +124 -216
- package/src/transport/transport.local.js +1 -0
- package/src/transport/transport.local.js.map +1 -1
- package/src/utils/string.utils.js +1 -1
- 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":";;;AASA,4DAAoD;AACpD,+CAA2D;AAE3D,6CAOsB;AACtB,sDAA+C;AAC/C,0CAAqE;AACrE,mDAA6C;AAC7C,6CAAiF;AACjF,sFAAoD;AACpD,oFAAkD;AAGlD,MAAqB,YAAa,SAAQ,2BAIzC;IACC,8DAA8D;IAC9D,KAAK,CAAgB;IAErB,4EAA4E;IACpE,SAAS,GAAkB,EAAE,CAAC;IAEtC,oFAAoF;IAC5E,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEzD,wCAAwC;IAChC,QAAQ,GAAG,IAAI,GAAG,EAAgB,CAAC;IAE3C,8DAA8D;IACtD,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC,CAAQ,qBAAqB;IAC5E,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC,CAAa,mBAAmB;IAC1E,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC,CAAO,yBAAyB;IAChF,iBAAiB,GAAG,IAAI,GAAG,EAAuB,CAAC,CAAI,yCAAyC;IAChG,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC,CAAY,mBAAmB;IAElF,oBAAoB;IACZ,OAAO,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,IAAI,yBAAW,EAAE,CAAC;IAEpC,YAAY,SAA2B,EAAE,IAAgB,EAAE,KAAoB;QAC7E,mDAAmD;QACnD,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,qCAAqC;QACrC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACjC,CAAC;IAED,6EAA6E;IAE1D,QAAQ,CAAC,IAAgB;QAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAS,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAA,0BAAa,EAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC;IAC/B,CAAC;IAES,UAAU;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;YAClC,MAAM,IAAI,GAAG,IAAA,8BAAiB,EAAC,GAAG,CAAC,CAAC;YAEpC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,mEAAmE;gBACnE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,0GAA0G;IAEvF,KAAK,CAAC,UAAU;QACjC,uFAAuF;QACvF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;YAElC,gDAAgD;YAChD,MAAM,EAAE,GAAG,IAAI,4BAAY,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAA4B,EAAE,EAAE,CAAC,CAAC;YAErD,MAAM,OAAO,GAAiB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QACvE,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;YACvC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;YACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,kBAAkB,GAAG,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;gBACvE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;oBAC/E,IAAI,CAAC,cAAc,CAAC,eAA+B,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;gBAC9E,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QACzE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YAChE,IAAI,CAAC,cAAc,CAAC,YAA4B,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,mEAAmE;QACnE,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAGnB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QAC9C,MAAM,KAAK,CAAC,aAAa,CAAC,yBAAa,EAAE,wBAAY,CAAC,CAAA;IACxD,CAAC;IAED,gGAAgG;IAEhG;;;;;;;OAOG;IACH,cAAc,CAAC,KAAmB,EAAE,WAA0B;QAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO;QAErC,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,2BAA2B;QACrE,MAAM,OAAO,GAAiB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE7D,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAEnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEzB,6BAA6B;QAC7B,KAAK,CAAC,SAAS,CAAC,EAAC,SAAS,EAAE,KAAK,EAAC,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,gBAAyB,KAAK;QACrC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,KAAK,IAAI,IAAI,aAAa,CAAC,CAAC;IACpG,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,sEAAsE;IAC9D,cAAc;QACpB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,kEAAkE;IAE1D,OAAO;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAExC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAErB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAExC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAEzC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,gBAAgB;QACd,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,mEAAmE;IACnE,WAAW,CAAC,SAAiB;QAC3B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,6EAA6E;IAE7E;;;;;;OAMG;IACH,mBAAmB,CAAC,IAAwB;QAC1C,MAAM,GAAG,GAAG,EAAC,GAAG,gCAAmB,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAC,CAAC;QAEtD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACzC,MAAM,IAAI,GAAG,IAAA,6BAAgB,EAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAA,gCAAmB,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,IAAA,+BAAkB,EAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3D,OAAO,EAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,EAAwB,CAAC;QAE5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,IAAA,yBAAY,EAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxD,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAE/C,IAAI,GAAG,CAAC,wBAAwB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,SAAS;gBACT,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,MAAM,SAAS,GAAG,IAAA,yBAAY,EAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;oBACjD,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACrE,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;wBACvB,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;wBACvD,MAAM,IAAI,GAAG,IAAA,yBAAY,EAAC,GAAG,IAAI,GAAG,IAAA,mBAAM,EAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;wBAC3E,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;gBAED,WAAW;gBACX,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,KAAK,UAAU;wBACzC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC;wBAC7B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAChB,MAAM,IAAI,GAAG,IAAA,yBAAY,EAAC,GAAG,GAAG,GAAG,IAAA,mBAAM,EAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC1E,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,4BAA4B;gBAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,KAAK,UAAU;wBACzC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC;wBAC7B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAChB,MAAM,IAAI,GAAG,IAAA,yBAAY,EAAC,GAAG,GAAG,GAAG,IAAA,mBAAM,EAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC1E,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;aACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC;QAEjD,SAAS,YAAY,CAAC,SAAiB,EAAE,IAAsB,EAAE,GAAgC;YAC/F,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,IAAA,yBAAY,EAAC,GAAG,SAAS,GAAG,IAAA,mBAAM,EAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC9E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACnC,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,WAAW,CAAC,IAAY,EAAE,IAAwB;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,QAAQ,CAAC;IACpD,CAAC;IAED,6DAA6D;IAE7D,SAAS,CACP,IAAoE,EACpE,EAAkC;QAElC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,EAAE,CAAC;gBACD,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;aACjD,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC,CAAC;IAC9F,CAAC;IAEO,IAAI,CAAC,IAA6B;QACxC,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAC,CAAC,CAAC;IACzF,CAAC;IAED,uDAAuD;IAEvD,+BAA+B;IACvB,OAAO,CAAC,KAAY,EAAE,QAAsB,EAAE,OAAqB,EAAE,MAAoB;QAC/F,MAAM,QAAQ,GAAG,IAAA,uBAAU,EAAC,OAAO,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAA,4BAAe,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,GAAG,QAAQ,IAAI,IAAA,uBAAS,EAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAC,CAAC;IAC5F,CAAC;IAED,6FAA6F;IACrF,SAAS,CAAC,GAAgB,EAAE,OAAqB;QACvD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAA,uBAAU,EAAC,OAAO,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,IAAA,4BAAe,EAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,GAAG,QAAQ,IAAI,IAAA,uBAAS,EAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAO,8BAA8B;YAC3D,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,OAAO;YACP,QAAQ;YACR,aAAa;YACb,WAAW;YACX,MAAM,EAAE,GAAG,CAAC,MAAM,EAAW,kDAAkD;SAChF,CAAC;IACJ,CAAC;IAED,uFAAuF;IAC/E,YAAY,CAAC,IAAkB;QACrC,oFAAoF;QACpF,IAAI,CAAC;YACH,MAAM,IAAI,GAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,EAAE,UAAU,IAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,OAAO,IAAI,SAAS,CAAC;YAC/E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAE5D,MAAM,GAAG,GAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3D,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,EAAE,GAAG,IAAA,4BAAW,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAClC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM;oBAAE,OAAO,EAAE,CAAC;gBACnD,IAAI,GAAG,CAAC,IAAI;oBAAE,OAAO,GAAG,CAAC,IAAI,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iEAAiE;IACjE,MAAM;QACJ,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAClE,CAAC;CACF;AAnXD,+BAmXC;AAED,+DAA+D;AAE/D,gFAAgF;AAChF,SAAS,YAAY,CAAC,CAAe;IACnC,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","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"]}
|
package/src/tool/tool.utils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ToolMetadata, ToolType, Token, ToolRecord, EntryLineage } from '../common';
|
|
2
|
-
import { NameCase } from
|
|
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;
|
package/src/tool/tool.utils.js
CHANGED
|
@@ -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 &&
|
|
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() +
|
|
104
|
-
|
|
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
|
|
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 = (
|
|
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
|