@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":"hook.registry.js","sourceRoot":"","sources":["../../../src/hooks/hook.registry.ts"],"names":[],"mappings":"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","sourcesContent":["// src/hooks/hook.registry.ts\n\nimport {\n FlowCtxOf,\n FlowInputOf,\n FlowName,\n FlowStagesOf,\n HookEntry,\n HookRecord,\n HookRegistryInterface,\n HookType,\n ScopeEntry,\n Token,\n} from \"../common\";\nimport {RegistryAbstract, RegistryBuildMapResult} from \"../regsitry\";\nimport ProviderRegistry from \"../provider/provider.registry\";\nimport {HookInstance} from \"./hook.instance\";\n\nexport default class HookRegistry\n extends RegistryAbstract<HookEntry, HookRecord, HookType[]>\n implements HookRegistryInterface {\n scope: ScopeEntry;\n\n /** Historical records by class (kept if you still want access to raw records) */\n recordsByCls: Map<Token, HookRecord[]> = new Map();\n\n /** Fast O(1) indexes of *instances*, sorted by priority (desc) */\n private entriesByCls: Map<Token, HookEntry[]> = new Map();\n private hooksByFlow: Map<FlowName, HookEntry[]> = new Map();\n private hooksByFlowStage: Map<FlowName, Map<string, HookEntry[]>> = new Map();\n\n constructor(providers: ProviderRegistry, list: HookType[]) {\n super(\"HookRegistry\", providers, list);\n this.scope = this.providers.getActiveScope();\n }\n\n protected override buildMap(): RegistryBuildMapResult<HookRecord> {\n const tokens = new Set<Token>();\n const defs = new Map<Token, HookRecord>();\n const graph = new Map<Token, Set<Token>>();\n /**\n * No need to build graph for hooks,\n * hooks are injected by other tokens\n */\n return {tokens, defs, graph};\n }\n\n protected buildGraph() {\n /**\n * Currently, hooks cannot be depended on other tokens,\n * in the future we can add this feature, so hooks can depends on:\n * - other hooks completions\n * - specific injected providers\n */\n }\n\n async initialize() {\n /**\n * No need to initialize hooks,\n * hooks are injected by other tokens\n */\n }\n\n /** Priority helper (default 0) */\n private getPriority(entry: Pick<HookEntry, \"metadata\"> | Pick<HookRecord, \"metadata\">): number {\n return entry.metadata?.priority ?? 0;\n }\n\n /** Binary insert by priority (desc). Stable for equal priorities. */\n private insertSorted(arr: HookEntry[], item: HookEntry) {\n const p = this.getPriority(item);\n let lo = 0;\n let hi = arr.length;\n // Insert AFTER existing equal-priority items to keep stable order.\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const mp = this.getPriority(arr[mid]);\n if (mp < p) {\n hi = mid;\n } else {\n lo = mid + 1;\n }\n }\n arr.splice(lo, 0, item);\n }\n\n private upsert<K, V>(map: Map<K, V>, key: K, init: () => V): V {\n let v = map.get(key);\n if (!v) {\n v = init();\n map.set(key, v);\n }\n return v;\n }\n\n private indexByClass(cls: Token, entry: HookEntry) {\n const list = this.upsert(this.entriesByCls, cls, () => []);\n this.insertSorted(list, entry);\n }\n\n private indexByFlow(flow: FlowName, entry: HookEntry) {\n const list = this.upsert(this.hooksByFlow, flow, () => []);\n this.insertSorted(list, entry);\n }\n\n private indexByFlowStage(flow: FlowName, stage: string, entry: HookEntry) {\n const stages = this.upsert(this.hooksByFlowStage, flow, () => new Map<string, HookEntry[]>());\n const list = this.upsert(stages, String(stage), () => []);\n this.insertSorted(list, entry);\n }\n\n private initializeOne(embedded: boolean, token: Token) {\n const rec = this.defs.get(token)!;\n const providers = this.providers; // nearest token provider registry\n const instance = new HookInstance(this.scope, providers, rec, token);\n this.instances.set(token, instance);\n\n // Keep raw records grouped by class (if needed elsewhere)\n const cls = rec.metadata.target;\n const recs = this.recordsByCls.get(cls) ?? [];\n recs.push(rec);\n this.recordsByCls.set(cls, recs);\n\n // Build fast indexes of *instances*, sorted by priority\n const entry = this.instances.get(token)!;\n const {flow, stage, target} = rec.metadata;\n\n\n if (embedded) {\n this.indexByClass(target.constructor ?? target, entry);\n } else {\n this.indexByFlowStage(flow, String(stage), entry);\n this.indexByFlow(flow, entry);\n }\n\n return instance.ready;\n }\n\n registerHooks(embedded:boolean,...records: HookRecord[]) {\n const readyArr: Promise<void>[] = [];\n for (const record of records) {\n this.defs.set(record.provide, record);\n this.tokens.add(record.provide);\n this.graph.set(record.provide, new Set());\n readyArr.push(this.initializeOne(embedded, record.provide));\n }\n return Promise.all(readyArr);\n }\n\n /** Hooks defined on a given *class* (metadata.target), sorted by priority (desc). */\n getClsHooks(token: Token): HookEntry[] {\n return this.entriesByCls.get(token) ?? [];\n }\n\n /** All hooks (instances, unordered) */\n getHooks(): HookEntry[] {\n return [...this.instances.values()];\n }\n\n /** Hooks for a given *flow*, sorted by priority (desc). */\n getFlowHooks<Name extends FlowName>(\n flow: Name\n ): HookEntry<FlowInputOf<Name>, Name, FlowStagesOf<Name>, FlowCtxOf<Name>>[] {\n const list = this.hooksByFlow.get(flow) ?? [];\n return list as HookEntry<FlowInputOf<Name>, Name, FlowStagesOf<Name>, FlowCtxOf<Name>>[];\n }\n\n /** Hooks for a specific *flow + stage*, sorted by priority (desc). */\n getFlowStageHooks<Name extends FlowName>(\n flow: Name,\n stage: FlowStagesOf<Name> | string\n ): HookEntry<FlowInputOf<Name>, Name, FlowStagesOf<Name>, FlowCtxOf<Name>>[] {\n const byStage = this.hooksByFlowStage.get(flow);\n const list = byStage?.get(String(stage)) ?? [];\n return list as HookEntry<FlowInputOf<Name>, Name, FlowStagesOf<Name>, FlowCtxOf<Name>>[];\n }\n}\n"]}
1
+ {"version":3,"file":"hook.registry.js","sourceRoot":"","sources":["../../../src/hooks/hook.registry.ts"],"names":[],"mappings":"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","sourcesContent":["// src/hooks/hook.registry.ts\n\nimport {\n FlowCtxOf,\n FlowInputOf,\n FlowName,\n FlowStagesOf,\n HookEntry,\n HookRecord,\n HookRegistryInterface,\n HookType,\n ScopeEntry,\n Token,\n} from '../common';\nimport { RegistryAbstract, RegistryBuildMapResult } from '../regsitry';\nimport ProviderRegistry from '../provider/provider.registry';\nimport { HookInstance } from './hook.instance';\n\nexport default class HookRegistry\n extends RegistryAbstract<HookEntry, HookRecord, HookType[]>\n implements HookRegistryInterface\n{\n scope: ScopeEntry;\n\n /** Historical records by class (kept if you still want access to raw records) */\n recordsByCls: Map<Token, HookRecord[]> = new Map();\n\n /** Fast O(1) indexes of *instances*, sorted by priority (desc) */\n private entriesByCls: Map<Token, HookEntry[]> = new Map();\n private hooksByFlow: Map<FlowName, HookEntry[]> = new Map();\n private hooksByFlowStage: Map<FlowName, Map<string, HookEntry[]>> = new Map();\n\n constructor(providers: ProviderRegistry, list: HookType[]) {\n super('HookRegistry', providers, list);\n this.scope = this.providers.getActiveScope();\n }\n\n protected override buildMap(): RegistryBuildMapResult<HookRecord> {\n const tokens = new Set<Token>();\n const defs = new Map<Token, HookRecord>();\n const graph = new Map<Token, Set<Token>>();\n /**\n * No need to build graph for hooks,\n * hooks are injected by other tokens\n */\n return { tokens, defs, graph };\n }\n\n protected buildGraph() {\n /**\n * Currently, hooks cannot be depended on other tokens,\n * in the future we can add this feature, so hooks can depends on:\n * - other hooks completions\n * - specific injected providers\n */\n }\n\n async initialize() {\n /**\n * No need to initialize hooks,\n * hooks are injected by other tokens\n */\n }\n\n /** Priority helper (default 0) */\n private getPriority(entry: Pick<HookEntry, 'metadata'> | Pick<HookRecord, 'metadata'>): number {\n return entry.metadata?.priority ?? 0;\n }\n\n /** Binary insert by priority (desc). Stable for equal priorities. */\n private insertSorted(arr: HookEntry[], item: HookEntry) {\n const p = this.getPriority(item);\n let lo = 0;\n let hi = arr.length;\n // Insert AFTER existing equal-priority items to keep stable order.\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const mp = this.getPriority(arr[mid]);\n if (mp < p) {\n hi = mid;\n } else {\n lo = mid + 1;\n }\n }\n arr.splice(lo, 0, item);\n }\n\n private upsert<K, V>(map: Map<K, V>, key: K, init: () => V): V {\n let v = map.get(key);\n if (!v) {\n v = init();\n map.set(key, v);\n }\n return v;\n }\n\n private indexByClass(cls: Token, entry: HookEntry) {\n const list = this.upsert(this.entriesByCls, cls, () => []);\n this.insertSorted(list, entry);\n }\n\n private indexByFlow(flow: FlowName, entry: HookEntry) {\n const list = this.upsert(this.hooksByFlow, flow, () => []);\n this.insertSorted(list, entry);\n }\n\n private indexByFlowStage(flow: FlowName, stage: string, entry: HookEntry) {\n const stages = this.upsert(this.hooksByFlowStage, flow, () => new Map<string, HookEntry[]>());\n const list = this.upsert(stages, String(stage), () => []);\n this.insertSorted(list, entry);\n }\n\n private initializeOne(embedded: boolean, token: Token) {\n const rec = this.defs.get(token)!;\n const providers = this.providers; // nearest token provider registry\n const instance = new HookInstance(this.scope, providers, rec, token);\n this.instances.set(token, instance);\n\n // Keep raw records grouped by class (if needed elsewhere)\n const cls = rec.metadata.target;\n const recs = this.recordsByCls.get(cls) ?? [];\n recs.push(rec);\n this.recordsByCls.set(cls, recs);\n\n // Build fast indexes of *instances*, sorted by priority\n const entry = this.instances.get(token)!;\n const { flow, stage, target } = rec.metadata;\n\n if (embedded) {\n this.indexByClass(target.constructor ?? target, entry);\n } else {\n this.indexByFlowStage(flow, String(stage), entry);\n this.indexByFlow(flow, entry);\n }\n\n return instance.ready;\n }\n\n registerHooks(embedded: boolean, ...records: HookRecord[]) {\n const readyArr: Promise<void>[] = [];\n for (const record of records) {\n this.defs.set(record.provide, record);\n this.tokens.add(record.provide);\n this.graph.set(record.provide, new Set());\n readyArr.push(this.initializeOne(embedded, record.provide));\n }\n return Promise.all(readyArr);\n }\n\n /** Hooks for a given *flow*, filtered by owner if provided, sorted by priority (desc). */\n getFlowHooksForOwner<Name extends FlowName>(\n flow: Name,\n ownerId?: string,\n ): HookEntry<FlowInputOf<Name>, Name, FlowStagesOf<Name>, FlowCtxOf<Name>>[] {\n const allHooks = this.getFlowHooks(flow);\n if (!ownerId) {\n return allHooks;\n }\n // Filter hooks to only include those that belong to the same owner or have no owner (global hooks)\n return allHooks.filter((hook) => {\n const hookOwner = hook.metadata.owner;\n return !hookOwner || hookOwner.id === ownerId;\n });\n }\n\n /** Hooks defined on a given *class* (metadata.target), sorted by priority (desc). */\n getClsHooks(token: Token): HookEntry[] {\n return this.entriesByCls.get(token) ?? [];\n }\n\n /** All hooks (instances, unordered) */\n getHooks(): HookEntry[] {\n return [...this.instances.values()];\n }\n\n /** Hooks for a given *flow*, sorted by priority (desc). */\n getFlowHooks<Name extends FlowName>(\n flow: Name,\n ): HookEntry<FlowInputOf<Name>, Name, FlowStagesOf<Name>, FlowCtxOf<Name>>[] {\n const list = this.hooksByFlow.get(flow) ?? [];\n return list as HookEntry<FlowInputOf<Name>, Name, FlowStagesOf<Name>, FlowCtxOf<Name>>[];\n }\n\n /** Hooks for a specific *flow + stage*, sorted by priority (desc). */\n getFlowStageHooks<Name extends FlowName>(\n flow: Name,\n stage: FlowStagesOf<Name> | string,\n ): HookEntry<FlowInputOf<Name>, Name, FlowStagesOf<Name>, FlowCtxOf<Name>>[] {\n const byStage = this.hooksByFlowStage.get(flow);\n const list = byStage?.get(String(stage)) ?? [];\n return list as HookEntry<FlowInputOf<Name>, Name, FlowStagesOf<Name>, FlowCtxOf<Name>>[];\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import 'reflect-metadata';
2
- import { PluginEntry, PluginRecord, PluginRegistryInterface, PluginType } from '../common';
2
+ import { PluginEntry, PluginRecord, PluginRegistryInterface, PluginType, Token } from '../common';
3
3
  import ProviderRegistry from '../provider/provider.registry';
4
4
  import { RegistryAbstract, RegistryBuildMapResult } from '../regsitry';
5
5
  export default class PluginRegistry extends RegistryAbstract<PluginEntry, PluginRecord, PluginType[]> implements PluginRegistryInterface {
@@ -16,7 +16,12 @@ export default class PluginRegistry extends RegistryAbstract<PluginEntry, Plugin
16
16
  /** prompts by token */
17
17
  private readonly pPrompts;
18
18
  private readonly scope;
19
- constructor(providers: ProviderRegistry, list: PluginType[]);
19
+ private readonly owner?;
20
+ constructor(providers: ProviderRegistry, list: PluginType[], owner?: {
21
+ kind: 'app' | 'plugin';
22
+ id: string;
23
+ ref: Token;
24
+ });
20
25
  getPlugins(): PluginEntry[];
21
26
  protected buildMap(list: PluginType[]): RegistryBuildMapResult<PluginRecord>;
22
27
  protected buildGraph(): void;
@@ -28,9 +28,11 @@ class PluginRegistry extends regsitry_1.RegistryAbstract {
28
28
  /** prompts by token */
29
29
  pPrompts = new Map();
30
30
  scope;
31
- constructor(providers, list) {
31
+ owner;
32
+ constructor(providers, list, owner) {
32
33
  super('PluginRegistry', providers, list);
33
34
  this.scope = providers.getActiveScope();
35
+ this.owner = owner;
34
36
  }
35
37
  getPlugins() {
36
38
  return [...this.instances.values()];
@@ -54,7 +56,7 @@ class PluginRegistry extends regsitry_1.RegistryAbstract {
54
56
  const deps = (0, plugin_utils_1.pluginDiscoveryDeps)(rec);
55
57
  for (const d of deps) {
56
58
  if (!this.providers.get(d)) {
57
- throw new Error(`Adapter ${(0, token_utils_1.tokenName)(token)} depends on ${(0, token_utils_1.tokenName)(d)}, which is not registered.`);
59
+ throw new Error(`Plugin ${(0, token_utils_1.tokenName)(token)} depends on ${(0, token_utils_1.tokenName)(d)}, which is not registered.`);
58
60
  }
59
61
  this.graph.get(token).add(d);
60
62
  }
@@ -66,7 +68,13 @@ class PluginRegistry extends regsitry_1.RegistryAbstract {
66
68
  const deps = this.graph.get(token);
67
69
  const providers = new provider_registry_1.default(rec.metadata.providers ?? [], this.providers);
68
70
  await providers.ready;
69
- const plugins = new PluginRegistry(providers, rec.metadata.plugins ?? []);
71
+ // Pass the owner context to nested plugins (plugins can be owned by apps or other plugins)
72
+ const pluginOwner = this.owner || {
73
+ kind: 'plugin',
74
+ id: rec.metadata.name,
75
+ ref: token,
76
+ };
77
+ const plugins = new PluginRegistry(providers, rec.metadata.plugins ?? [], pluginOwner);
70
78
  await plugins.ready;
71
79
  const adapters = new adapter_regsitry_1.default(providers, rec.metadata.adapters ?? []);
72
80
  await adapters.ready;
@@ -77,11 +85,7 @@ class PluginRegistry extends regsitry_1.RegistryAbstract {
77
85
  });
78
86
  const resources = new resource_registry_1.default(providers, rec.metadata.resources ?? []);
79
87
  const prompts = new prompt_registry_1.default(providers, rec.metadata.prompts ?? []);
80
- await Promise.all([
81
- tools.ready,
82
- resources.ready,
83
- prompts.ready,
84
- ]);
88
+ await Promise.all([tools.ready, resources.ready, prompts.ready]);
85
89
  this.pProviders.set(token, providers);
86
90
  this.pPlugins.set(token, plugins);
87
91
  this.pAdapters.set(token, adapters);
@@ -91,7 +95,7 @@ class PluginRegistry extends regsitry_1.RegistryAbstract {
91
95
  /**
92
96
  * Register exported providers to the parent providers registry.
93
97
  */
94
- const exported = (rec.metadata.exports ?? []).map(rawToken => {
98
+ const exported = (rec.metadata.exports ?? []).map((rawToken) => {
95
99
  const token = (0, provider_utils_1.normalizeProvider)(rawToken);
96
100
  return providers.getProviderInfo(token.provide);
97
101
  });
@@ -122,10 +126,18 @@ class PluginRegistry extends regsitry_1.RegistryAbstract {
122
126
  }
123
127
  const hooks = (0, hooks_utils_1.normalizeHooksFromCls)(pluginInstance);
124
128
  if (hooks.length > 0) {
125
- await this.scope.hooks.registerHooks(false, ...hooks);
129
+ // Add owner information to each hook before registering
130
+ const hooksWithOwner = hooks.map((hook) => ({
131
+ ...hook,
132
+ metadata: {
133
+ ...hook.metadata,
134
+ owner: this.owner,
135
+ },
136
+ }));
137
+ await this.scope.hooks.registerHooks(false, ...hooksWithOwner);
126
138
  }
127
139
  pluginInstance.get = providers.get.bind(providers);
128
- let dynamicProviders = rec.providers;
140
+ const dynamicProviders = rec.providers;
129
141
  if (dynamicProviders) {
130
142
  await providers.addDynamicProviders(dynamicProviders);
131
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.registry.js","sourceRoot":"","sources":["../../../src/plugin/plugin.registry.ts"],"names":[],"mappings":"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","sourcesContent":["// plugin-registry.ts\nimport 'reflect-metadata';\nimport {\n FlowName,\n PluginEntry,\n PluginKind,\n PluginRecord,\n PluginRegistryInterface,\n PluginType,\n Token,\n} from '../common';\nimport {normalizePlugin, pluginDiscoveryDeps} from './plugin.utils';\nimport ProviderRegistry from '../provider/provider.registry';\nimport {tokenName} from '../utils/token.utils';\nimport AdapterRegistry from '../adapter/adapter.regsitry';\nimport ToolRegistry from '../tool/tool.registry';\nimport ResourceRegistry from '../resource/resource.registry';\nimport PromptRegistry from '../prompt/prompt.registry';\nimport {Ctor} from '../types/token.types';\nimport {normalizeProvider} from '../provider/provider.utils';\nimport {RegistryAbstract, RegistryBuildMapResult} from '../regsitry';\nimport {Scope} from \"../scope\";\nimport {normalizeHooksFromCls} from \"../hooks/hooks.utils\";\n\nexport default class PluginRegistry extends RegistryAbstract<PluginEntry, PluginRecord, PluginType[]> implements PluginRegistryInterface {\n /** providers by token */\n private readonly pProviders: Map<Token, ProviderRegistry> = new Map();\n /** providers by token */\n private readonly pPlugins: Map<Token, PluginRegistry> = new Map();\n /** adapters by token */\n private readonly pAdapters: Map<Token, AdapterRegistry> = new Map();\n /** tools by token */\n private readonly pTools: Map<Token, ToolRegistry> = new Map();\n /** resources by token */\n private readonly pResources: Map<Token, ResourceRegistry> = new Map();\n /** prompts by token */\n private readonly pPrompts: Map<Token, PromptRegistry> = new Map();\n\n private readonly scope: Scope\n\n constructor(providers: ProviderRegistry, list: PluginType[]) {\n super('PluginRegistry', providers, list);\n this.scope = providers.getActiveScope();\n }\n\n getPlugins(): PluginEntry[] {\n return [...this.instances.values()];\n }\n\n protected override buildMap(list: PluginType[]): RegistryBuildMapResult<PluginRecord> {\n const tokens = new Set<Token>();\n const defs = new Map<Token, PluginRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n for (const raw of list) {\n const rec = normalizePlugin(raw);\n const provide = rec.provide;\n tokens.add(provide);\n defs.set(provide, rec);\n graph.set(provide, new Set());\n }\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 = pluginDiscoveryDeps(rec);\n\n for (const d of deps) {\n if (!this.providers.get(d)) {\n throw new Error(`Adapter ${tokenName(token)} depends on ${tokenName(d)}, which is not registered.`);\n }\n this.graph.get(token)!.add(d);\n }\n }\n }\n\n protected async initialize() {\n\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n const deps = this.graph.get(token)!;\n\n const providers = new ProviderRegistry(rec.metadata.providers ?? [], this.providers);\n await providers.ready;\n\n const plugins = new PluginRegistry(providers, rec.metadata.plugins ?? []);\n await plugins.ready;\n\n const adapters = new AdapterRegistry(providers, rec.metadata.adapters ?? []);\n await adapters.ready;\n\n const tools = new ToolRegistry(providers, rec.metadata.tools ?? [], {\n kind: 'plugin',\n id: rec.metadata.name,\n ref: token,\n });\n const resources = new ResourceRegistry(providers, rec.metadata.resources ?? []);\n const prompts = new PromptRegistry(providers, rec.metadata.prompts ?? []);\n\n await Promise.all([\n tools.ready,\n resources.ready,\n prompts.ready,\n ]);\n\n this.pProviders.set(token, providers);\n this.pPlugins.set(token, plugins);\n this.pAdapters.set(token, adapters);\n this.pTools.set(token, tools);\n this.pResources.set(token, resources);\n this.pPrompts.set(token, prompts);\n\n /**\n * Register exported providers to the parent providers registry.\n */\n const exported = (rec.metadata.exports ?? []).map(rawToken => {\n const token = normalizeProvider(rawToken);\n return providers.getProviderInfo(token.provide);\n });\n this.providers.mergeFromRegistry(providers, exported);\n\n const depsTokens = [...deps];\n const depsInstances = await Promise.all(depsTokens.map((t) => this.providers.resolveBootstrapDep(t)));\n\n let pluginInstance: PluginEntry;\n if (rec.kind === PluginKind.CLASS) {\n const klass = rec.useClass as any;\n pluginInstance = new klass(...depsInstances);\n } else if (rec.kind === PluginKind.CLASS_TOKEN) {\n const klass = rec.provide as any;\n pluginInstance = new (klass as Ctor<any>)(...depsInstances);\n } else if (rec.kind === PluginKind.FACTORY) {\n const deps = [...rec.inject()];\n const args: any[] = [];\n for (const d of deps) args.push(await this.providers.resolveBootstrapDep(d));\n pluginInstance = rec.useFactory(...args);\n } else if (rec.kind === PluginKind.VALUE) {\n pluginInstance = (rec as any).useValue;\n } else {\n throw Error('Invalid plugin kind');\n }\n\n const hooks = normalizeHooksFromCls(pluginInstance);\n if (hooks.length > 0) {\n await this.scope.hooks.registerHooks(false, ...hooks);\n }\n pluginInstance.get = providers.get.bind(providers) as any;\n let dynamicProviders = rec.providers;\n if (dynamicProviders) {\n await providers.addDynamicProviders(dynamicProviders)\n }\n this.instances.set(token, pluginInstance);\n }\n }\n\n\n}\n"]}
1
+ {"version":3,"file":"plugin.registry.js","sourceRoot":"","sources":["../../../src/plugin/plugin.registry.ts"],"names":[],"mappings":"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","sourcesContent":["// plugin-registry.ts\nimport 'reflect-metadata';\nimport { PluginEntry, PluginKind, PluginRecord, PluginRegistryInterface, PluginType, Token } from '../common';\nimport { normalizePlugin, pluginDiscoveryDeps } from './plugin.utils';\nimport ProviderRegistry from '../provider/provider.registry';\nimport { tokenName } from '../utils/token.utils';\nimport AdapterRegistry from '../adapter/adapter.regsitry';\nimport ToolRegistry from '../tool/tool.registry';\nimport ResourceRegistry from '../resource/resource.registry';\nimport PromptRegistry from '../prompt/prompt.registry';\nimport { Ctor } from '../types/token.types';\nimport { normalizeProvider } from '../provider/provider.utils';\nimport { RegistryAbstract, RegistryBuildMapResult } from '../regsitry';\nimport { Scope } from '../scope';\nimport { normalizeHooksFromCls } from '../hooks/hooks.utils';\n\nexport default class PluginRegistry\n extends RegistryAbstract<PluginEntry, PluginRecord, PluginType[]>\n implements PluginRegistryInterface\n{\n /** providers by token */\n private readonly pProviders: Map<Token, ProviderRegistry> = new Map();\n /** providers by token */\n private readonly pPlugins: Map<Token, PluginRegistry> = new Map();\n /** adapters by token */\n private readonly pAdapters: Map<Token, AdapterRegistry> = new Map();\n /** tools by token */\n private readonly pTools: Map<Token, ToolRegistry> = new Map();\n /** resources by token */\n private readonly pResources: Map<Token, ResourceRegistry> = new Map();\n /** prompts by token */\n private readonly pPrompts: Map<Token, PromptRegistry> = new Map();\n\n private readonly scope: Scope;\n private readonly owner?: { kind: 'app' | 'plugin'; id: string; ref: Token };\n\n constructor(\n providers: ProviderRegistry,\n list: PluginType[],\n owner?: { kind: 'app' | 'plugin'; id: string; ref: Token },\n ) {\n super('PluginRegistry', providers, list);\n this.scope = providers.getActiveScope();\n this.owner = owner;\n }\n\n getPlugins(): PluginEntry[] {\n return [...this.instances.values()];\n }\n\n protected override buildMap(list: PluginType[]): RegistryBuildMapResult<PluginRecord> {\n const tokens = new Set<Token>();\n const defs = new Map<Token, PluginRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n for (const raw of list) {\n const rec = normalizePlugin(raw);\n const provide = rec.provide;\n tokens.add(provide);\n defs.set(provide, rec);\n graph.set(provide, new Set());\n }\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 = pluginDiscoveryDeps(rec);\n\n for (const d of deps) {\n if (!this.providers.get(d)) {\n throw new Error(`Plugin ${tokenName(token)} depends on ${tokenName(d)}, which is not registered.`);\n }\n this.graph.get(token)!.add(d);\n }\n }\n }\n\n protected async initialize() {\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n const deps = this.graph.get(token)!;\n\n const providers = new ProviderRegistry(rec.metadata.providers ?? [], this.providers);\n await providers.ready;\n\n // Pass the owner context to nested plugins (plugins can be owned by apps or other plugins)\n const pluginOwner = this.owner || {\n kind: 'plugin' as const,\n id: rec.metadata.name,\n ref: token,\n };\n\n const plugins = new PluginRegistry(providers, rec.metadata.plugins ?? [], pluginOwner);\n await plugins.ready;\n\n const adapters = new AdapterRegistry(providers, rec.metadata.adapters ?? []);\n await adapters.ready;\n\n const tools = new ToolRegistry(providers, rec.metadata.tools ?? [], {\n kind: 'plugin',\n id: rec.metadata.name,\n ref: token,\n });\n const resources = new ResourceRegistry(providers, rec.metadata.resources ?? []);\n const prompts = new PromptRegistry(providers, rec.metadata.prompts ?? []);\n\n await Promise.all([tools.ready, resources.ready, prompts.ready]);\n\n this.pProviders.set(token, providers);\n this.pPlugins.set(token, plugins);\n this.pAdapters.set(token, adapters);\n this.pTools.set(token, tools);\n this.pResources.set(token, resources);\n this.pPrompts.set(token, prompts);\n\n /**\n * Register exported providers to the parent providers registry.\n */\n const exported = (rec.metadata.exports ?? []).map((rawToken) => {\n const token = normalizeProvider(rawToken);\n return providers.getProviderInfo(token.provide);\n });\n this.providers.mergeFromRegistry(providers, exported);\n\n const depsTokens = [...deps];\n const depsInstances = await Promise.all(depsTokens.map((t) => this.providers.resolveBootstrapDep(t)));\n\n let pluginInstance: PluginEntry;\n if (rec.kind === PluginKind.CLASS) {\n const klass = rec.useClass as any;\n pluginInstance = new klass(...depsInstances);\n } else if (rec.kind === PluginKind.CLASS_TOKEN) {\n const klass = rec.provide as any;\n pluginInstance = new (klass as Ctor<any>)(...depsInstances);\n } else if (rec.kind === PluginKind.FACTORY) {\n const deps = [...rec.inject()];\n const args: any[] = [];\n for (const d of deps) args.push(await this.providers.resolveBootstrapDep(d));\n pluginInstance = rec.useFactory(...args);\n } else if (rec.kind === PluginKind.VALUE) {\n pluginInstance = (rec as any).useValue;\n } else {\n throw Error('Invalid plugin kind');\n }\n\n const hooks = normalizeHooksFromCls(pluginInstance);\n if (hooks.length > 0) {\n // Add owner information to each hook before registering\n const hooksWithOwner = hooks.map((hook) => ({\n ...hook,\n metadata: {\n ...hook.metadata,\n owner: this.owner,\n },\n }));\n await this.scope.hooks.registerHooks(false, ...hooksWithOwner);\n }\n pluginInstance.get = providers.get.bind(providers) as any;\n const dynamicProviders = rec.providers;\n if (dynamicProviders) {\n await providers.addDynamicProviders(dynamicProviders);\n }\n this.instances.set(token, pluginInstance);\n }\n }\n}\n"]}
@@ -16,6 +16,7 @@ class PromptRegistry extends regsitry_1.RegistryAbstract {
16
16
  };
17
17
  }
18
18
  buildGraph() {
19
+ // TODO: implement graph building
19
20
  }
20
21
  initialize() {
21
22
  return Promise.resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.registry.js","sourceRoot":"","sources":["../../../src/prompt/prompt.registry.ts"],"names":[],"mappings":";;AAEA,0CAA+C;AAG/C,MAAqB,cAAe,SAAQ,2BAAyD;IAEnG,YAAY,SAA2B,EAAE,IAAkB;QACzD,KAAK,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAGS,QAAQ,CAAC,IAAkB;QACnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAS,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;QAE3C,OAAO;YACL,MAAM;YACN,IAAI;YACJ,KAAK;SACN,CAAC;IACJ,CAAC;IAED,UAAU;IAEV,CAAC;IAES,UAAU;QAClB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU;QACR,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,gBAAgB;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAtCD,iCAsCC","sourcesContent":["import ProviderRegistry from '../provider/provider.registry';\nimport { PromptEntry, PromptRecord, PromptRegistryInterface, PromptType, Token } from '../common';\nimport { RegistryAbstract } from '../regsitry';\n\n\nexport default class PromptRegistry extends RegistryAbstract<PromptEntry, PromptRecord, PromptType[]> implements PromptRegistryInterface {\n\n constructor(providers: ProviderRegistry, list: PromptType[]) {\n super('PromptRegistry', providers, list);\n }\n\n\n protected buildMap(list: PromptType[]) {\n const tokens = new Set<Token>();\n const defs = new Map<Token, PromptRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n return {\n tokens,\n defs,\n graph,\n };\n }\n\n buildGraph() {\n\n }\n\n protected initialize() {\n return Promise.resolve();\n }\n\n hasAny() {\n return this.tokens.size > 0;\n }\n\n getPrompts() {\n return [];\n }\n\n getInlinePrompts(): PromptEntry[] {\n return [];\n }\n}\n"]}
1
+ {"version":3,"file":"prompt.registry.js","sourceRoot":"","sources":["../../../src/prompt/prompt.registry.ts"],"names":[],"mappings":";;AAEA,0CAA+C;AAG/C,MAAqB,cAAe,SAAQ,2BAAyD;IAEnG,YAAY,SAA2B,EAAE,IAAkB;QACzD,KAAK,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAGS,QAAQ,CAAC,IAAkB;QACnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAS,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;QAE3C,OAAO;YACL,MAAM;YACN,IAAI;YACJ,KAAK;SACN,CAAC;IACJ,CAAC;IAED,UAAU;QACR,iCAAiC;IACnC,CAAC;IAES,UAAU;QAClB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU;QACR,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,gBAAgB;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAtCD,iCAsCC","sourcesContent":["import ProviderRegistry from '../provider/provider.registry';\nimport { PromptEntry, PromptRecord, PromptRegistryInterface, PromptType, Token } from '../common';\nimport { RegistryAbstract } from '../regsitry';\n\n\nexport default class PromptRegistry extends RegistryAbstract<PromptEntry, PromptRecord, PromptType[]> implements PromptRegistryInterface {\n\n constructor(providers: ProviderRegistry, list: PromptType[]) {\n super('PromptRegistry', providers, list);\n }\n\n\n protected buildMap(list: PromptType[]) {\n const tokens = new Set<Token>();\n const defs = new Map<Token, PromptRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n return {\n tokens,\n defs,\n graph,\n };\n }\n\n buildGraph() {\n // TODO: implement graph building\n }\n\n protected initialize() {\n return Promise.resolve();\n }\n\n hasAny() {\n return this.tokens.size > 0;\n }\n\n getPrompts() {\n return [];\n }\n\n getInlinePrompts(): PromptEntry[] {\n return [];\n }\n}\n"]}
@@ -16,6 +16,7 @@ class ResourceRegistry extends regsitry_1.RegistryAbstract {
16
16
  };
17
17
  }
18
18
  buildGraph() {
19
+ // TODO: implement graph building
19
20
  }
20
21
  initialize() {
21
22
  return Promise.resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"resource.registry.js","sourceRoot":"","sources":["../../../src/resource/resource.registry.ts"],"names":[],"mappings":";;AAQA,0CAA+C;AAG/C,MAAqB,gBAAiB,SAAQ,2BAA+D;IAG3G,YAAY,SAA2B,EAAE,IAAgB;QACvD,KAAK,CAAC,kBAAkB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAGS,QAAQ,CAAC,IAAoB;QACrC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAS,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;QAE3C,OAAO;YACL,MAAM;YACN,IAAI;YACJ,KAAK;SACN,CAAC;IACJ,CAAC;IAED,UAAU;IAEV,CAAC;IAES,UAAU;QAClB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAGD,YAAY;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,kBAAkB;QAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;CACF;AApCD,mCAoCC","sourcesContent":["import ProviderRegistry from '../provider/provider.registry';\nimport {\n ResourceEntry, ResourceRecord,\n ResourceRegistryInterface,\n ResourceType,\n Token,\n ToolType,\n} from '../common';\nimport { RegistryAbstract } from '../regsitry';\n\n\nexport default class ResourceRegistry extends RegistryAbstract<ResourceEntry, ResourceRecord, ResourceType[]>\n implements ResourceRegistryInterface {\n\n constructor(providers: ProviderRegistry, list: ToolType[]) {\n super('ResourceRegistry', providers, list);\n }\n\n\n protected buildMap(list: ResourceType[]) {\n const tokens = new Set<Token>();\n const defs = new Map<Token, ResourceRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n return {\n tokens,\n defs,\n graph,\n };\n }\n\n buildGraph() {\n\n }\n\n protected initialize() {\n return Promise.resolve();\n }\n\n\n getResources() {\n return [];\n }\n\n getInlineResources(): ResourceEntry<any, any>[] {\n throw new Error('Method not implemented.');\n }\n}\n"]}
1
+ {"version":3,"file":"resource.registry.js","sourceRoot":"","sources":["../../../src/resource/resource.registry.ts"],"names":[],"mappings":";;AAQA,0CAA+C;AAG/C,MAAqB,gBAAiB,SAAQ,2BAA+D;IAG3G,YAAY,SAA2B,EAAE,IAAgB;QACvD,KAAK,CAAC,kBAAkB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAGS,QAAQ,CAAC,IAAoB;QACrC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAS,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;QAE3C,OAAO;YACL,MAAM;YACN,IAAI;YACJ,KAAK;SACN,CAAC;IACJ,CAAC;IAED,UAAU;QACR,iCAAiC;IACnC,CAAC;IAES,UAAU;QAClB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAGD,YAAY;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,kBAAkB;QAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;CACF;AApCD,mCAoCC","sourcesContent":["import ProviderRegistry from '../provider/provider.registry';\nimport {\n ResourceEntry, ResourceRecord,\n ResourceRegistryInterface,\n ResourceType,\n Token,\n ToolType,\n} from '../common';\nimport { RegistryAbstract } from '../regsitry';\n\n\nexport default class ResourceRegistry extends RegistryAbstract<ResourceEntry, ResourceRecord, ResourceType[]>\n implements ResourceRegistryInterface {\n\n constructor(providers: ProviderRegistry, list: ToolType[]) {\n super('ResourceRegistry', providers, list);\n }\n\n\n protected buildMap(list: ResourceType[]) {\n const tokens = new Set<Token>();\n const defs = new Map<Token, ResourceRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n return {\n tokens,\n defs,\n graph,\n };\n }\n\n buildGraph() {\n // TODO: implement graph building\n }\n\n protected initialize() {\n return Promise.resolve();\n }\n\n\n getResources() {\n return [];\n }\n\n getInlineResources(): ResourceEntry<any, any>[] {\n throw new Error('Method not implemented.');\n }\n}\n"]}
@@ -24,7 +24,7 @@ class Scope extends common_1.ScopeEntry {
24
24
  scopeTools;
25
25
  transportService; // TODO: migrate transport service to transport.registry
26
26
  entryPath;
27
- routeBase = '';
27
+ routeBase;
28
28
  orchestrated = false;
29
29
  server;
30
30
  constructor(rec, globalProviders) {
@@ -34,6 +34,12 @@ class Scope extends common_1.ScopeEntry {
34
34
  this.globalProviders = globalProviders;
35
35
  this.server = this.globalProviders.get(common_1.FrontMcpServer);
36
36
  this.entryPath = rec.metadata.http?.entryPath ?? '';
37
+ if (rec.kind === 'SPLIT_BY_APP') {
38
+ this.routeBase = `/${rec.metadata.id}`;
39
+ }
40
+ else {
41
+ this.routeBase = '';
42
+ }
37
43
  this.scopeProviders = new provider_registry_1.default(this.defaultScopeProviders, globalProviders);
38
44
  this.ready = this.initialize();
39
45
  }
@@ -44,7 +50,7 @@ class Scope extends common_1.ScopeEntry {
44
50
  this.scopeFlows = new flow_registry_1.default(this.scopeProviders, [http_request_flow_1.default]);
45
51
  await this.scopeFlows.ready;
46
52
  this.transportService = new transport_registry_1.TransportService(this);
47
- this.scopeAuth = new auth_registry_1.AuthRegistry(this.scopeProviders, [], {
53
+ this.scopeAuth = new auth_registry_1.AuthRegistry(this, this.scopeProviders, [], {
48
54
  kind: 'scope',
49
55
  id: this.id,
50
56
  ref: common_1.ScopeEntry,
@@ -1 +1 @@
1
- {"version":3,"file":"scope.instance.js","sourceRoot":"","sources":["../../../src/scope/scope.instance.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport {\n FlowInputOf,\n FlowName, FlowOutputOf,\n FlowType,\n FrontMcpAuth,\n FrontMcpLogger,\n FrontMcpServer, HookRegistryInterface,\n ProviderScope,\n ScopeEntry,\n ScopeRecord,\n SessionProvider,\n Token,\n Type,\n} from '../common';\nimport AppRegistry from '../app/app.registry';\nimport ProviderRegistry from '../provider/provider.registry';\nimport {AuthRegistry} from '../auth/auth.registry';\nimport FlowRegistry from '../flows/flow.registry';\nimport HttpRequestFlow from './flows/http.request.flow';\nimport {TransportService} from '../transport/transport.registry';\nimport ToolRegistry from '../tool/tool.registry';\nimport HookRegistry from \"../hooks/hook.registry\";\n\n\nexport class Scope extends ScopeEntry {\n readonly id: string;\n private readonly globalProviders: ProviderRegistry;\n readonly logger: FrontMcpLogger;\n\n private readonly scopeProviders: ProviderRegistry;\n private scopeAuth: AuthRegistry;\n private scopeFlows: FlowRegistry;\n private scopeApps: AppRegistry;\n private scopeHooks: HookRegistry;\n private scopeTools: ToolRegistry;\n\n transportService: TransportService; // TODO: migrate transport service to transport.registry\n readonly entryPath: string;\n readonly routeBase: string = '';\n readonly orchestrated: boolean = false;\n\n readonly server: FrontMcpServer;\n\n constructor(rec: ScopeRecord, globalProviders: ProviderRegistry) {\n super(rec, rec.provide);\n this.id = rec.metadata.id;\n this.logger = globalProviders.get(FrontMcpLogger).child('FrontMcp.MultiAppScope');\n this.globalProviders = globalProviders;\n this.server = this.globalProviders.get(FrontMcpServer);\n this.entryPath = rec.metadata.http?.entryPath ?? '';\n this.scopeProviders = new ProviderRegistry(this.defaultScopeProviders, globalProviders);\n this.ready = this.initialize();\n }\n\n protected async initialize(): Promise<void> {\n await this.scopeProviders.ready;\n\n this.scopeHooks = new HookRegistry(this.scopeProviders, []);\n await this.scopeHooks.ready;\n\n this.scopeFlows = new FlowRegistry(this.scopeProviders, [HttpRequestFlow]);\n await this.scopeFlows.ready;\n\n this.transportService = new TransportService(this);\n\n this.scopeAuth = new AuthRegistry(this.scopeProviders, [], {\n kind: 'scope',\n id: this.id,\n ref: ScopeEntry,\n }, this.metadata.auth);\n await this.scopeAuth.ready\n\n this.scopeApps = new AppRegistry(this.scopeProviders, this.metadata.apps);\n await this.scopeApps.ready;\n\n this.scopeTools = new ToolRegistry(this.scopeProviders, [], {kind: 'scope', id: this.id, ref: Scope});\n await this.scopeTools.ready;\n\n\n await this.auth.ready;\n this.logger.info('Initializing multi-app scope', this.metadata);\n if (!this.metadata.auth) {\n // log large warning about using FrontMcp without authentication\n this.logger.warn(`\\n\\n*******************************\\n WARNING: FrontMcp is running without authentication. \\n This is a security risk and should only be used in development environments. \\n*******************************\\n\\n`);\n }\n }\n\n private get defaultScopeProviders() {\n return [{\n scope: ProviderScope.GLOBAL,\n name: 'ScopeEntry',\n provide: ScopeEntry,\n useValue: this,\n }, {\n scope: ProviderScope.GLOBAL,\n name: 'Scope',\n provide: Scope,\n useValue: this,\n }, {\n scope: ProviderScope.GLOBAL,\n name: 'FrontMcpLogger',\n provide: FrontMcpLogger,\n useValue: this.logger,\n }, {\n scope: ProviderScope.SESSION,\n name: 'SessionProvider',\n provide: SessionProvider,\n useClass: SessionProvider,\n }];\n }\n\n get auth(): FrontMcpAuth {\n return this.scopeAuth.getPrimary();\n }\n\n get hooks(): HookRegistryInterface {\n return this.scopeHooks;\n }\n\n get authProviders(): AuthRegistry {\n return this.scopeAuth;\n }\n\n get providers() {\n return this.scopeProviders;\n }\n\n get apps(): AppRegistry {\n return this.scopeApps;\n }\n\n get tools(): ToolRegistry {\n return this.scopeTools;\n }\n\n\n registryFlows(...flows: FlowType[]) {\n return this.scopeFlows.registryFlows(flows);\n }\n\n runFlow<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, deps?: Map<Token, Type>): Promise<FlowOutputOf<Name> | undefined> {\n return this.scopeFlows.runFlow(name, input, deps);\n }\n\n async runFlowForOutput<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, deps?: Map<Token, Type>): Promise<FlowOutputOf<Name>> {\n const result = await this.scopeFlows.runFlow(name, input, deps);\n if (result) {\n return result;\n }\n throw new Error(`flow exist without output`);\n }\n}\n"]}
1
+ {"version":3,"file":"scope.instance.js","sourceRoot":"","sources":["../../../src/scope/scope.instance.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport {\n FlowInputOf,\n FlowName, FlowOutputOf,\n FlowType,\n FrontMcpAuth,\n FrontMcpLogger,\n FrontMcpServer, HookRegistryInterface,\n ProviderScope,\n ScopeEntry,\n ScopeRecord,\n SessionProvider,\n Token,\n Type,\n} from '../common';\nimport AppRegistry from '../app/app.registry';\nimport ProviderRegistry from '../provider/provider.registry';\nimport {AuthRegistry} from '../auth/auth.registry';\nimport FlowRegistry from '../flows/flow.registry';\nimport HttpRequestFlow from './flows/http.request.flow';\nimport {TransportService} from '../transport/transport.registry';\nimport ToolRegistry from '../tool/tool.registry';\nimport HookRegistry from \"../hooks/hook.registry\";\n\n\nexport class Scope extends ScopeEntry {\n readonly id: string;\n private readonly globalProviders: ProviderRegistry;\n readonly logger: FrontMcpLogger;\n\n private readonly scopeProviders: ProviderRegistry;\n private scopeAuth: AuthRegistry;\n private scopeFlows: FlowRegistry;\n private scopeApps: AppRegistry;\n private scopeHooks: HookRegistry;\n private scopeTools: ToolRegistry;\n\n transportService: TransportService; // TODO: migrate transport service to transport.registry\n readonly entryPath: string;\n readonly routeBase: string;\n readonly orchestrated: boolean = false;\n\n readonly server: FrontMcpServer;\n\n constructor(rec: ScopeRecord, globalProviders: ProviderRegistry) {\n super(rec, rec.provide);\n this.id = rec.metadata.id;\n this.logger = globalProviders.get(FrontMcpLogger).child('FrontMcp.MultiAppScope');\n this.globalProviders = globalProviders;\n this.server = this.globalProviders.get(FrontMcpServer);\n this.entryPath = rec.metadata.http?.entryPath ?? '';\n\n if(rec.kind === 'SPLIT_BY_APP'){\n this.routeBase = `/${rec.metadata.id}`\n }else {\n this.routeBase = '';\n }\n\n this.scopeProviders = new ProviderRegistry(this.defaultScopeProviders, globalProviders);\n this.ready = this.initialize();\n }\n\n protected async initialize(): Promise<void> {\n await this.scopeProviders.ready;\n\n this.scopeHooks = new HookRegistry(this.scopeProviders, []);\n await this.scopeHooks.ready;\n\n this.scopeFlows = new FlowRegistry(this.scopeProviders, [HttpRequestFlow]);\n await this.scopeFlows.ready;\n\n this.transportService = new TransportService(this);\n\n this.scopeAuth = new AuthRegistry(this, this.scopeProviders, [], {\n kind: 'scope',\n id: this.id,\n ref: ScopeEntry,\n }, this.metadata.auth);\n await this.scopeAuth.ready\n\n this.scopeApps = new AppRegistry(this.scopeProviders, this.metadata.apps);\n await this.scopeApps.ready;\n\n this.scopeTools = new ToolRegistry(this.scopeProviders, [], {kind: 'scope', id: this.id, ref: Scope});\n await this.scopeTools.ready;\n\n\n await this.auth.ready;\n this.logger.info('Initializing multi-app scope', this.metadata);\n if (!this.metadata.auth) {\n // log large warning about using FrontMcp without authentication\n this.logger.warn(`\\n\\n*******************************\\n WARNING: FrontMcp is running without authentication. \\n This is a security risk and should only be used in development environments. \\n*******************************\\n\\n`);\n }\n }\n\n private get defaultScopeProviders() {\n return [{\n scope: ProviderScope.GLOBAL,\n name: 'ScopeEntry',\n provide: ScopeEntry,\n useValue: this,\n }, {\n scope: ProviderScope.GLOBAL,\n name: 'Scope',\n provide: Scope,\n useValue: this,\n }, {\n scope: ProviderScope.GLOBAL,\n name: 'FrontMcpLogger',\n provide: FrontMcpLogger,\n useValue: this.logger,\n }, {\n scope: ProviderScope.SESSION,\n name: 'SessionProvider',\n provide: SessionProvider,\n useClass: SessionProvider,\n }];\n }\n\n get auth(): FrontMcpAuth {\n return this.scopeAuth.getPrimary();\n }\n\n get hooks(): HookRegistryInterface {\n return this.scopeHooks;\n }\n\n get authProviders(): AuthRegistry {\n return this.scopeAuth;\n }\n\n get providers() {\n return this.scopeProviders;\n }\n\n get apps(): AppRegistry {\n return this.scopeApps;\n }\n\n get tools(): ToolRegistry {\n return this.scopeTools;\n }\n\n\n registryFlows(...flows: FlowType[]) {\n return this.scopeFlows.registryFlows(flows);\n }\n\n runFlow<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, deps?: Map<Token, Type>): Promise<FlowOutputOf<Name> | undefined> {\n return this.scopeFlows.runFlow(name, input, deps);\n }\n\n async runFlowForOutput<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, deps?: Map<Token, Type>): Promise<FlowOutputOf<Name>> {\n const result = await this.scopeFlows.runFlow(name, input, deps);\n if (result) {\n return result;\n }\n throw new Error(`flow exist without output`);\n }\n}\n"]}
@@ -8,6 +8,7 @@ const front_mcp_tokens_1 = require("../front-mcp/front-mcp.tokens");
8
8
  const app_utils_1 = require("../app/app.utils");
9
9
  const scope_utils_1 = require("./scope.utils");
10
10
  const token_utils_1 = require("../utils/token.utils");
11
+ const scope_instance_1 = require("./scope.instance");
11
12
  class ScopeRegistry extends regsitry_1.RegistryAbstract {
12
13
  constructor(globalProviders) {
13
14
  const metadata = globalProviders.get(front_mcp_tokens_1.FrontMcpConfig);
@@ -64,7 +65,7 @@ class ScopeRegistry extends regsitry_1.RegistryAbstract {
64
65
  const deps = (0, scope_utils_1.scopeDiscoveryDeps)(rec).slice(1);
65
66
  for (const d of deps) {
66
67
  if (!this.providers.get(d)) {
67
- throw new Error(`Adapter ${(0, token_utils_1.tokenName)(token)} depends on ${(0, token_utils_1.tokenName)(d)}, which is not registered.`);
68
+ throw new Error(`Scope ${(0, token_utils_1.tokenName)(token)} depends on ${(0, token_utils_1.tokenName)(d)}, which is not registered.`);
68
69
  }
69
70
  this.graph.get(token).add(d);
70
71
  }
@@ -76,7 +77,7 @@ class ScopeRegistry extends regsitry_1.RegistryAbstract {
76
77
  let scope;
77
78
  switch (rec.kind) {
78
79
  case common_1.ScopeKind.SPLIT_BY_APP:
79
- scope = new rec.provide(rec, this.providers);
80
+ scope = new scope_instance_1.Scope(rec, this.providers);
80
81
  break;
81
82
  case common_1.ScopeKind.MULTI_APP:
82
83
  scope = new rec.provide(rec, this.providers);
@@ -1 +1 @@
1
- {"version":3,"file":"scope.registry.js","sourceRoot":"","sources":["../../../src/scope/scope.registry.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport {\n AppType,\n FrontMcpConfigType,\n ScopeEntry,\n ScopeRecord,\n ScopeKind,\n Token,\n} from '../common';\nimport {RegistryAbstract, RegistryBuildMapResult} from '../regsitry';\nimport ProviderRegistry from '../provider/provider.registry';\nimport {FrontMcpConfig} from '../front-mcp/front-mcp.tokens';\nimport {normalizeApp} from '../app/app.utils';\nimport {normalizeAppScope, normalizeMultiAppScope, scopeDiscoveryDeps} from './scope.utils';\nimport {tokenName} from '../utils/token.utils';\n\nexport class ScopeRegistry extends RegistryAbstract<ScopeEntry, ScopeRecord, FrontMcpConfigType> {\n\n constructor(globalProviders: ProviderRegistry) {\n const metadata = globalProviders.get(FrontMcpConfig);\n super('ScopeRegistry', globalProviders, metadata);\n }\n\n protected override buildMap(metadata: FrontMcpConfigType): RegistryBuildMapResult<ScopeRecord> {\n const tokens = new Set<Token>();\n const defs = new Map<Token, ScopeRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n if (metadata.splitByApp) {\n for (const raw of metadata.apps) {\n const rec = normalizeAppScope(raw, metadata);\n const provide = rec.provide;\n tokens.add(provide);\n defs.set(provide, rec);\n graph.set(provide, new Set());\n }\n } else {\n const includeInParent: AppType[] = [];\n\n for (const raw of metadata.apps) {\n const app = normalizeApp(raw);\n const appMetadata = app.metadata;\n if (appMetadata.standalone === false) {\n includeInParent.push(raw);\n // default include in parent scope\n continue;\n }\n\n if (appMetadata.standalone === 'includeInParent') {\n includeInParent.push(raw);\n // include in the parent scope and continue to create a standalone app scope\n }\n\n const appScopeRec = normalizeAppScope(raw, metadata);\n const provide = appScopeRec.provide;\n tokens.add(provide);\n defs.set(provide, appScopeRec);\n graph.set(provide, new Set());\n }\n\n const rec = normalizeMultiAppScope(includeInParent, metadata);\n const provide = rec.provide;\n tokens.add(provide);\n defs.set(provide, rec);\n graph.set(provide, new Set());\n }\n\n return {\n tokens,\n defs,\n graph,\n };\n }\n\n protected override buildGraph() {\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n const deps = scopeDiscoveryDeps(rec).slice(1);\n\n for (const d of deps) {\n if (!this.providers.get(d)) {\n throw new Error(`Adapter ${tokenName(token)} depends on ${tokenName(d)}, which is not registered.`);\n }\n this.graph.get(token)!.add(d);\n }\n }\n }\n\n protected async initialize() {\n\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n\n let scope: ScopeEntry;\n switch (rec.kind) {\n case ScopeKind.SPLIT_BY_APP:\n scope = new rec.provide(rec, this.providers);\n break;\n case ScopeKind.MULTI_APP:\n scope = new rec.provide(rec, this.providers);\n break;\n default:\n throw new Error(`Invalid scope kind ${rec}`);\n }\n\n await scope.ready;\n this.instances.set(token, scope);\n }\n }\n\n}\n"]}
1
+ {"version":3,"file":"scope.registry.js","sourceRoot":"","sources":["../../../src/scope/scope.registry.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport {\n AppType,\n FrontMcpConfigType,\n ScopeEntry,\n ScopeRecord,\n ScopeKind,\n Token,\n} from '../common';\nimport {RegistryAbstract, RegistryBuildMapResult} from '../regsitry';\nimport ProviderRegistry from '../provider/provider.registry';\nimport {FrontMcpConfig} from '../front-mcp/front-mcp.tokens';\nimport {normalizeApp} from '../app/app.utils';\nimport {normalizeAppScope, normalizeMultiAppScope, scopeDiscoveryDeps} from './scope.utils';\nimport {tokenName} from '../utils/token.utils';\nimport {Scope} from \"./scope.instance\";\n\nexport class ScopeRegistry extends RegistryAbstract<ScopeEntry, ScopeRecord, FrontMcpConfigType> {\n\n constructor(globalProviders: ProviderRegistry) {\n const metadata = globalProviders.get(FrontMcpConfig);\n super('ScopeRegistry', globalProviders, metadata);\n }\n\n protected override buildMap(metadata: FrontMcpConfigType): RegistryBuildMapResult<ScopeRecord> {\n const tokens = new Set<Token>();\n const defs = new Map<Token, ScopeRecord>();\n const graph = new Map<Token, Set<Token>>();\n\n if (metadata.splitByApp) {\n for (const raw of metadata.apps) {\n const rec = normalizeAppScope(raw, metadata);\n const provide = rec.provide;\n tokens.add(provide);\n defs.set(provide, rec);\n graph.set(provide, new Set());\n }\n } else {\n const includeInParent: AppType[] = [];\n\n for (const raw of metadata.apps) {\n const app = normalizeApp(raw);\n const appMetadata = app.metadata;\n if (appMetadata.standalone === false) {\n includeInParent.push(raw);\n // default include in parent scope\n continue;\n }\n\n if (appMetadata.standalone === 'includeInParent') {\n includeInParent.push(raw);\n // include in the parent scope and continue to create a standalone app scope\n }\n\n const appScopeRec = normalizeAppScope(raw, metadata);\n const provide = appScopeRec.provide;\n tokens.add(provide);\n defs.set(provide, appScopeRec);\n graph.set(provide, new Set());\n }\n\n const rec = normalizeMultiAppScope(includeInParent, metadata);\n const provide = rec.provide;\n tokens.add(provide);\n defs.set(provide, rec);\n graph.set(provide, new Set());\n }\n\n return {\n tokens,\n defs,\n graph,\n };\n }\n\n protected override buildGraph() {\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n const deps = scopeDiscoveryDeps(rec).slice(1);\n\n for (const d of deps) {\n if (!this.providers.get(d)) {\n throw new Error(`Scope ${tokenName(token)} depends on ${tokenName(d)}, which is not registered.`);\n }\n this.graph.get(token)!.add(d);\n }\n }\n }\n\n protected async initialize() {\n\n for (const token of this.tokens) {\n const rec = this.defs.get(token)!;\n\n let scope: ScopeEntry;\n switch (rec.kind) {\n case ScopeKind.SPLIT_BY_APP:\n scope = new Scope(rec, this.providers);\n break;\n case ScopeKind.MULTI_APP:\n scope = new rec.provide(rec, this.providers);\n break;\n default:\n throw new Error(`Invalid scope kind ${rec}`);\n }\n\n await scope.ready;\n this.instances.set(token, scope);\n }\n }\n\n}\n"]}
@@ -23,14 +23,16 @@ function normalizeAppScope(appItem, metadata) {
23
23
  if (metadata.splitByApp === true && appMetadata.standalone === 'includeInParent') {
24
24
  throw new Error('standalone: includeInParent is not supported for splitByApp scope');
25
25
  }
26
+ const scopeId = appMetadata.id ?? appMetadata.name;
27
+ const token = Symbol(scopeId);
26
28
  return {
27
29
  kind: common_1.ScopeKind.SPLIT_BY_APP,
28
- provide: scope_instance_1.Scope,
30
+ provide: token,
29
31
  metadata: {
30
32
  ...metadata,
31
- id: appMetadata.id ?? appMetadata.name,
33
+ id: scopeId,
32
34
  apps: [appItem],
33
- auth: appMetadata.auth
35
+ auth: appMetadata.auth,
34
36
  },
35
37
  };
36
38
  }
@@ -53,7 +55,7 @@ function scopeDiscoveryDeps(rec) {
53
55
  case common_1.ScopeKind.MULTI_APP:
54
56
  return (0, token_utils_1.depsOfClass)(rec.provide, 'discovery').slice(1);
55
57
  case common_1.ScopeKind.SPLIT_BY_APP:
56
- return (0, token_utils_1.depsOfClass)(rec.provide, 'discovery').slice(1);
58
+ return []; // no deps for splitByApp scope;
57
59
  }
58
60
  }
59
61
  //# sourceMappingURL=scope.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scope.utils.js","sourceRoot":"","sources":["../../../src/scope/scope.utils.ts"],"names":[],"mappings":";;AAqBA,8CAqBC;AAED,wDAUC;AAKD,gDAOC;AAlED,sCASmB;AACnB,gDAA8C;AAC9C,sDAAiD;AACjD,qDAAuC;AAEvC;;;;;GAKG;AAEH,SAAgB,iBAAiB,CAAC,OAAgB,EAAE,QAA2D;IAC7G,MAAM,GAAG,GAAG,IAAA,wBAAY,EAAC,OAAO,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC;IAEjC;;OAEG;IACH,4CAA4C;IAC5C,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,IAAI,WAAW,CAAC,UAAU,KAAK,iBAAiB,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO;QACL,IAAI,EAAE,kBAAS,CAAC,YAAY;QAC5B,OAAO,EAAE,sBAAK;QACd,QAAQ,EAAE;YACR,GAAG,QAAQ;YACX,EAAE,EAAE,WAAW,CAAC,EAAE,IAAI,WAAW,CAAC,IAAI;YACtC,IAAI,EAAE,CAAC,OAAO,CAAC;YACf,IAAI,EAAE,WAAW,CAAC,IAAI;SACI;KAC7B,CAAC;AACJ,CAAC;AAED,SAAgB,sBAAsB,CAAC,YAAuB,EAAE,QAAgC;IAC9F,OAAO;QACL,IAAI,EAAE,kBAAS,CAAC,SAAS;QACzB,OAAO,EAAE,sBAAK;QACd,QAAQ,EAAE;YACR,GAAG,QAAQ;YACX,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,YAAY;SACM;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,GAAgB;IACjD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,kBAAS,CAAC,SAAS;YACtB,OAAO,IAAA,yBAAW,EAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxD,KAAK,kBAAS,CAAC,YAAY;YACzB,OAAO,IAAA,yBAAW,EAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC","sourcesContent":["import {\n AppScopeMetadata,\n AppType,\n FrontMcpMultiAppConfig,\n FrontMcpSplitByAppConfig,\n MultiAppScopeMetadata,\n Token,\n ScopeRecord,\n ScopeKind,\n} from '../common';\nimport {normalizeApp} from '../app/app.utils';\nimport {depsOfClass} from '../utils/token.utils';\nimport {Scope} from './scope.instance';\n\n/**\n * Normalize a raw scope metadata list into useful maps/sets.\n * - tokens: all provided tokens\n * - defs: AdapterRecord by token\n * - graph: initialized adjacency map (empty sets)\n */\n\nexport function normalizeAppScope(appItem: AppType, metadata: FrontMcpMultiAppConfig | FrontMcpSplitByAppConfig): ScopeRecord {\n const app = normalizeApp(appItem);\n const appMetadata = app.metadata;\n\n /**\n * Explicitly check for true for splitByApp scope.\n */\n // noinspection PointlessBooleanExpressionJS\n if (metadata.splitByApp === true && appMetadata.standalone === 'includeInParent') {\n throw new Error('standalone: includeInParent is not supported for splitByApp scope');\n }\n return {\n kind: ScopeKind.SPLIT_BY_APP,\n provide: Scope,\n metadata: {\n ...metadata,\n id: appMetadata.id ?? appMetadata.name,\n apps: [appItem],\n auth: appMetadata.auth\n } as any as AppScopeMetadata,\n };\n}\n\nexport function normalizeMultiAppScope(includedApps: AppType[], metadata: FrontMcpMultiAppConfig): ScopeRecord {\n return {\n kind: ScopeKind.MULTI_APP,\n provide: Scope,\n metadata: {\n ...metadata,\n id: 'root',\n apps: includedApps,\n } as MultiAppScopeMetadata,\n };\n}\n\n/**\n * For graph/cycle detection. Returns dependency tokens that should be graphed.\n */\nexport function scopeDiscoveryDeps(rec: ScopeRecord): Token[] {\n switch (rec.kind) {\n case ScopeKind.MULTI_APP:\n return depsOfClass(rec.provide, 'discovery').slice(1);\n case ScopeKind.SPLIT_BY_APP:\n return depsOfClass(rec.provide, 'discovery').slice(1);\n }\n}"]}
1
+ {"version":3,"file":"scope.utils.js","sourceRoot":"","sources":["../../../src/scope/scope.utils.ts"],"names":[],"mappings":";;AAqBA,8CAuBC;AAED,wDAUC;AAKD,gDAOC;AApED,sCASmB;AACnB,gDAA8C;AAC9C,sDAAiD;AACjD,qDAAuC;AAEvC;;;;;GAKG;AAEH,SAAgB,iBAAiB,CAAC,OAAgB,EAAE,QAA2D;IAC7G,MAAM,GAAG,GAAG,IAAA,wBAAY,EAAC,OAAO,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC;IAEjC;;OAEG;IACH,4CAA4C;IAC5C,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,IAAI,WAAW,CAAC,UAAU,KAAK,iBAAiB,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,WAAW,CAAC,IAAI,CAAA;IAClD,MAAM,KAAK,GAAkB,MAAM,CAAC,OAAO,CAAC,CAAA;IAC5C,OAAO;QACL,IAAI,EAAE,kBAAS,CAAC,YAAY;QAC5B,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE;YACR,GAAG,QAAQ;YACX,EAAE,EAAC,OAAO;YACV,IAAI,EAAE,CAAC,OAAO,CAAC;YACf,IAAI,EAAE,WAAW,CAAC,IAAI;SACH;KACtB,CAAC;AACJ,CAAC;AAED,SAAgB,sBAAsB,CAAC,YAAuB,EAAE,QAAgC;IAC9F,OAAO;QACL,IAAI,EAAE,kBAAS,CAAC,SAAS;QACzB,OAAO,EAAE,sBAAK;QACd,QAAQ,EAAE;YACR,GAAG,QAAQ;YACX,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,YAAY;SACM;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,GAAgB;IACjD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,kBAAS,CAAC,SAAS;YACtB,OAAO,IAAA,yBAAW,EAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxD,KAAK,kBAAS,CAAC,YAAY;YACzB,OAAO,EAAE,CAAA,CAAC,gCAAgC;IAC9C,CAAC;AACH,CAAC","sourcesContent":["import {\n AppScopeMetadata,\n AppType,\n FrontMcpMultiAppConfig,\n FrontMcpSplitByAppConfig,\n MultiAppScopeMetadata,\n Token,\n ScopeRecord,\n ScopeKind,\n} from '../common';\nimport {normalizeApp} from '../app/app.utils';\nimport {depsOfClass} from '../utils/token.utils';\nimport {Scope} from './scope.instance';\n\n/**\n * Normalize a raw scope metadata list into useful maps/sets.\n * - tokens: all provided tokens\n * - defs: AdapterRecord by token\n * - graph: initialized adjacency map (empty sets)\n */\n\nexport function normalizeAppScope(appItem: AppType, metadata: FrontMcpMultiAppConfig | FrontMcpSplitByAppConfig): ScopeRecord {\n const app = normalizeApp(appItem);\n const appMetadata = app.metadata;\n\n /**\n * Explicitly check for true for splitByApp scope.\n */\n // noinspection PointlessBooleanExpressionJS\n if (metadata.splitByApp === true && appMetadata.standalone === 'includeInParent') {\n throw new Error('standalone: includeInParent is not supported for splitByApp scope');\n }\n const scopeId = appMetadata.id ?? appMetadata.name\n const token:Token<AppType> = Symbol(scopeId)\n return {\n kind: ScopeKind.SPLIT_BY_APP,\n provide: token,\n metadata: {\n ...metadata,\n id:scopeId,\n apps: [appItem],\n auth: appMetadata.auth,\n } as AppScopeMetadata,\n };\n}\n\nexport function normalizeMultiAppScope(includedApps: AppType[], metadata: FrontMcpMultiAppConfig): ScopeRecord {\n return {\n kind: ScopeKind.MULTI_APP,\n provide: Scope,\n metadata: {\n ...metadata,\n id: 'root',\n apps: includedApps,\n } as MultiAppScopeMetadata,\n };\n}\n\n/**\n * For graph/cycle detection. Returns dependency tokens that should be graphed.\n */\nexport function scopeDiscoveryDeps(rec: ScopeRecord): Token[] {\n switch (rec.kind) {\n case ScopeKind.MULTI_APP:\n return depsOfClass(rec.provide, 'discovery').slice(1);\n case ScopeKind.SPLIT_BY_APP:\n return [] // no deps for splitByApp scope;\n }\n}"]}
@@ -6,7 +6,9 @@ const store_base_adapter_1 = require("./store.base.adapter");
6
6
  class ScopedInMemoryStore extends store_base_adapter_1.StoreBaseAdapter {
7
7
  map = new Map();
8
8
  bus = new events_1.EventEmitter();
9
- async connect() { }
9
+ async connect() {
10
+ // nothing to do
11
+ }
10
12
  async disconnect() {
11
13
  this.map.clear();
12
14
  this.bus.removeAllListeners();
@@ -1 +1 @@
1
- {"version":3,"file":"store.memory.adapter.js","sourceRoot":"","sources":["../../../../src/store/adapters/store.memory.adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'events';\nimport { StoreBaseAdapter } from './store.base.adapter';\nimport type { SetOptions } from '../store.types';\n\ninterface Entry {\n value: string;\n expiresAt?: number;\n}\n\nexport class ScopedInMemoryStore extends StoreBaseAdapter {\n private map = new Map<string, Entry>();\n private bus = new EventEmitter();\n\n async connect(): Promise<void> {}\n async disconnect(): Promise<void> {\n this.map.clear();\n this.bus.removeAllListeners();\n }\n\n private isExpired(e?: Entry): boolean {\n return !!e?.expiresAt && e.expiresAt <= Date.now();\n }\n private getEntry(key: string): Entry | undefined {\n const e = this.map.get(key);\n if (this.isExpired(e)) {\n this.map.delete(key);\n return undefined;\n }\n return e;\n }\n\n async get(key: string): Promise<string | null> {\n const e = this.getEntry(key);\n return e ? e.value : null;\n }\n async set(key: string, value: string, opts?: SetOptions): Promise<void> {\n const entry: Entry = { value };\n if (opts?.ttlSeconds && opts.ttlSeconds > 0) entry.expiresAt = Date.now() + Math.floor(opts.ttlSeconds) * 1000;\n this.map.set(key, entry);\n }\n async del(key: string): Promise<void> {\n this.map.delete(key);\n }\n async exists(key: string): Promise<boolean> {\n return this.getEntry(key) !== undefined;\n }\n override async mget(keys: string[]): Promise<(string | null)[]> {\n return Promise.all(keys.map((k) => this.get(k)));\n }\n override async mset(entries: Array<{ key: string; value: string; opts?: SetOptions }>): Promise<void> {\n for (const e of entries) await this.set(e.key, e.value, e.opts);\n }\n async incr(key: string): Promise<number> {\n const v = Number(await this.get(key)) || 0;\n const nv = v + 1;\n await this.set(key, String(nv));\n return nv;\n }\n async decr(key: string): Promise<number> {\n const v = Number(await this.get(key)) || 0;\n const nv = v - 1;\n await this.set(key, String(nv));\n return nv;\n }\n async expire(key: string, ttlSeconds: number): Promise<void> {\n const e = this.getEntry(key);\n if (!e) return;\n e.expiresAt = Date.now() + Math.floor(ttlSeconds) * 1000;\n this.map.set(key, e);\n }\n async ttl(key: string): Promise<number | null> {\n const e = this.getEntry(key);\n if (!e || !e.expiresAt) return null;\n const ms = e.expiresAt - Date.now();\n return ms > 0 ? Math.ceil(ms / 1000) : null;\n }\n override async publish(channel: string, message: string): Promise<number> {\n const c = this.bus.listenerCount(channel);\n setTimeout(() => this.bus.emit(channel, message), 0);\n return c;\n }\n override async subscribe(channel: string, handler: (message: string) => void): Promise<() => Promise<void>> {\n this.bus.on(channel, handler);\n return async () => {\n this.bus.off(channel, handler);\n };\n }\n}\n"]}
1
+ {"version":3,"file":"store.memory.adapter.js","sourceRoot":"","sources":["../../../../src/store/adapters/store.memory.adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'events';\nimport { StoreBaseAdapter } from './store.base.adapter';\nimport type { SetOptions } from '../store.types';\n\ninterface Entry {\n value: string;\n expiresAt?: number;\n}\n\nexport class ScopedInMemoryStore extends StoreBaseAdapter {\n private map = new Map<string, Entry>();\n private bus = new EventEmitter();\n\n async connect(): Promise<void> {\n // nothing to do\n }\n async disconnect(): Promise<void> {\n this.map.clear();\n this.bus.removeAllListeners();\n }\n\n private isExpired(e?: Entry): boolean {\n return !!e?.expiresAt && e.expiresAt <= Date.now();\n }\n private getEntry(key: string): Entry | undefined {\n const e = this.map.get(key);\n if (this.isExpired(e)) {\n this.map.delete(key);\n return undefined;\n }\n return e;\n }\n\n async get(key: string): Promise<string | null> {\n const e = this.getEntry(key);\n return e ? e.value : null;\n }\n async set(key: string, value: string, opts?: SetOptions): Promise<void> {\n const entry: Entry = { value };\n if (opts?.ttlSeconds && opts.ttlSeconds > 0) entry.expiresAt = Date.now() + Math.floor(opts.ttlSeconds) * 1000;\n this.map.set(key, entry);\n }\n async del(key: string): Promise<void> {\n this.map.delete(key);\n }\n async exists(key: string): Promise<boolean> {\n return this.getEntry(key) !== undefined;\n }\n override async mget(keys: string[]): Promise<(string | null)[]> {\n return Promise.all(keys.map((k) => this.get(k)));\n }\n override async mset(entries: Array<{ key: string; value: string; opts?: SetOptions }>): Promise<void> {\n for (const e of entries) await this.set(e.key, e.value, e.opts);\n }\n async incr(key: string): Promise<number> {\n const v = Number(await this.get(key)) || 0;\n const nv = v + 1;\n await this.set(key, String(nv));\n return nv;\n }\n async decr(key: string): Promise<number> {\n const v = Number(await this.get(key)) || 0;\n const nv = v - 1;\n await this.set(key, String(nv));\n return nv;\n }\n async expire(key: string, ttlSeconds: number): Promise<void> {\n const e = this.getEntry(key);\n if (!e) return;\n e.expiresAt = Date.now() + Math.floor(ttlSeconds) * 1000;\n this.map.set(key, e);\n }\n async ttl(key: string): Promise<number | null> {\n const e = this.getEntry(key);\n if (!e || !e.expiresAt) return null;\n const ms = e.expiresAt - Date.now();\n return ms > 0 ? Math.ceil(ms / 1000) : null;\n }\n override async publish(channel: string, message: string): Promise<number> {\n const c = this.bus.listenerCount(channel);\n setTimeout(() => this.bus.emit(channel, message), 0);\n return c;\n }\n override async subscribe(channel: string, handler: (message: string) => void): Promise<() => Promise<void>> {\n this.bus.on(channel, handler);\n return async () => {\n this.bus.off(channel, handler);\n };\n }\n}\n"]}