@frontmcp/sdk 0.2.1 → 0.2.2

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 (76) hide show
  1. package/package.json +3 -3
  2. package/src/decorators/front-mcp.decorator.js.map +1 -1
  3. package/src/decorators/hook.decorator.d.ts +12 -0
  4. package/src/decorators/{flow-hooks.decorator.js → hook.decorator.js} +18 -13
  5. package/src/decorators/hook.decorator.js.map +1 -0
  6. package/src/decorators/index.d.ts +1 -1
  7. package/src/decorators/index.js +1 -1
  8. package/src/decorators/index.js.map +1 -1
  9. package/src/decorators/tool.decorator.d.ts +34 -6
  10. package/src/decorators/tool.decorator.js +8 -1
  11. package/src/decorators/tool.decorator.js.map +1 -1
  12. package/src/dynamic/dynamic.plugin.d.ts +1 -0
  13. package/src/dynamic/dynamic.plugin.js +3 -0
  14. package/src/dynamic/dynamic.plugin.js.map +1 -1
  15. package/src/entries/base.entry.d.ts +1 -1
  16. package/src/entries/base.entry.js.map +1 -1
  17. package/src/entries/flow.entry.js.map +1 -1
  18. package/src/entries/hook.entry.d.ts +12 -0
  19. package/src/entries/hook.entry.js +20 -0
  20. package/src/entries/hook.entry.js.map +1 -0
  21. package/src/entries/index.d.ts +1 -0
  22. package/src/entries/index.js +1 -0
  23. package/src/entries/index.js.map +1 -1
  24. package/src/entries/plugin.entry.d.ts +2 -1
  25. package/src/entries/plugin.entry.js.map +1 -1
  26. package/src/entries/scope.entry.d.ts +2 -1
  27. package/src/entries/scope.entry.js.map +1 -1
  28. package/src/entries/tool.entry.d.ts +5 -2
  29. package/src/entries/tool.entry.js.map +1 -1
  30. package/src/interfaces/flow.interface.d.ts +9 -6
  31. package/src/interfaces/flow.interface.js +4 -2
  32. package/src/interfaces/flow.interface.js.map +1 -1
  33. package/src/interfaces/hook.interface.d.ts +3 -0
  34. package/src/{metadata/flow-hooks.metadata.js → interfaces/hook.interface.js} +1 -1
  35. package/src/interfaces/hook.interface.js.map +1 -0
  36. package/src/interfaces/index.d.ts +1 -0
  37. package/src/interfaces/index.js +1 -0
  38. package/src/interfaces/index.js.map +1 -1
  39. package/src/interfaces/internal/registry.interface.d.ts +30 -4
  40. package/src/interfaces/internal/registry.interface.js.map +1 -1
  41. package/src/interfaces/tool.interface.d.ts +11 -4
  42. package/src/interfaces/tool.interface.js +2 -1
  43. package/src/interfaces/tool.interface.js.map +1 -1
  44. package/src/metadata/flow.metadata.d.ts +2 -0
  45. package/src/metadata/flow.metadata.js.map +1 -1
  46. package/src/metadata/hook.metadata.d.ts +19 -0
  47. package/src/metadata/hook.metadata.js +3 -0
  48. package/src/metadata/hook.metadata.js.map +1 -0
  49. package/src/metadata/index.d.ts +1 -1
  50. package/src/metadata/index.js +1 -1
  51. package/src/metadata/index.js.map +1 -1
  52. package/src/metadata/tool.metadata.d.ts +0 -100
  53. package/src/metadata/tool.metadata.js +1 -6
  54. package/src/metadata/tool.metadata.js.map +1 -1
  55. package/src/records/hook.record.d.ts +11 -0
  56. package/src/records/hook.record.js +8 -0
  57. package/src/records/hook.record.js.map +1 -0
  58. package/src/records/index.d.ts +1 -0
  59. package/src/records/index.js +1 -0
  60. package/src/records/index.js.map +1 -1
  61. package/src/records/plugin.record.d.ts +13 -3
  62. package/src/records/plugin.record.js +1 -1
  63. package/src/records/plugin.record.js.map +1 -1
  64. package/src/records/tool.record.d.ts +1 -1
  65. package/src/records/tool.record.js.map +1 -1
  66. package/src/schemas/annotated-class.schema.js +5 -1
  67. package/src/schemas/annotated-class.schema.js.map +1 -1
  68. package/src/tokens/flow-hook.tokens.js +2 -2
  69. package/src/tokens/flow-hook.tokens.js.map +1 -1
  70. package/src/tokens/tool.tokens.d.ts +1 -0
  71. package/src/tokens/tool.tokens.js +2 -1
  72. package/src/tokens/tool.tokens.js.map +1 -1
  73. package/src/decorators/flow-hooks.decorator.d.ts +0 -12
  74. package/src/decorators/flow-hooks.decorator.js.map +0 -1
  75. package/src/metadata/flow-hooks.metadata.d.ts +0 -20
  76. package/src/metadata/flow-hooks.metadata.js.map +0 -1
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "@frontmcp/sdk",
3
- "version": "0.2.1",
4
- "type": "commonjs",
3
+ "version": "0.2.2",
5
4
  "main": "./src/index.js",
6
5
  "types": "./src/index.d.ts",
7
6
  "exports": {
@@ -26,5 +25,6 @@
26
25
  },
27
26
  "devDependencies": {
28
27
  "typescript": "^5.9.3"
29
- }
28
+ },
29
+ "type": "commonjs"
30
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"front-mcp.decorator.js","sourceRoot":"","sources":["../../../src/decorators/front-mcp.decorator.ts"],"names":[],"mappings":";;AAOA,4BAiCC;AAxCD,4BAA0B;AAC1B,sCAA2C;AAC3C,0CAAuE;AAEvE;;GAEG;AACH,SAAgB,QAAQ,CAAC,gBAAkC;IACzD,OAAO,CAAC,MAAgB,EAAE,EAAE;QAE1B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,iCAAsB,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACrF,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,2DAA2D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7H,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,gEAAgE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACvI,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,8EAA8E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/J,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,uBAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,uBAAc,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,gBAAgB,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE;gBACzC,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qFAAqF,CAAC,CAAC;gBAChH,CAAC;gBACD,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC;IAEH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { FrontMcpTokens } from '../tokens';\nimport { FrontMcpMetadata, frontMcpMetadataSchema } from '../metadata';\n\n/**\n * Decorator that marks a class as a FrontMcp Server and provides metadata\n */\nexport function FrontMcp(providedMetadata: FrontMcpMetadata): ClassDecorator {\n return (target: Function) => {\n\n const { error, data: metadata } = frontMcpMetadataSchema.safeParse(providedMetadata);\n if (error) {\n if (error.format().apps) {\n throw new Error(`Invalid metadata provided to @FrontMcp { apps: [?] }: \\n${JSON.stringify(error.format().apps, null, 2)}`);\n }\n if (error.format().providers) {\n throw new Error(`Invalid metadata provided to @FrontMcp { providers: [?] }: \\n${JSON.stringify(error.format().providers, null, 2)}`);\n }\n if (error.format().logging?.transports) {\n throw new Error(`Invalid metadata provided to @FrontMcp { logging: { transports: [?] } }: \\n${JSON.stringify(error.format().logging?.transports, null, 2)}`);\n }\n throw error;\n }\n\n Reflect.defineMetadata(FrontMcpTokens.type, true, target);\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpTokens[property] ?? property, metadata[property], target);\n }\n\n if (metadata.serve) {\n const core = '@frontmcp/core';\n import(core).then(({ FrontMcpInstance }) => {\n if (!FrontMcpInstance) {\n throw new Error(`${core} version mismatch, make sure you have the same version for all @frontmcp/* packages`);\n }\n FrontMcpInstance.bootstrap(metadata);\n });\n }\n\n };\n}\n"]}
1
+ {"version":3,"file":"front-mcp.decorator.js","sourceRoot":"","sources":["../../../src/decorators/front-mcp.decorator.ts"],"names":[],"mappings":";;AAOA,4BAiCC;AAxCD,4BAA0B;AAC1B,sCAAyC;AACzC,0CAAqE;AAErE;;GAEG;AACH,SAAgB,QAAQ,CAAC,gBAAkC;IACzD,OAAO,CAAC,MAAgB,EAAE,EAAE;QAE1B,MAAM,EAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAC,GAAG,iCAAsB,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACnF,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,2DAA2D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7H,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,gEAAgE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACvI,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,8EAA8E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/J,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,uBAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,uBAAc,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,gBAAgB,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC,gBAAgB,EAAC,EAAE,EAAE;gBACvC,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qFAAqF,CAAC,CAAC;gBAChH,CAAC;gBACD,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC;IAEH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport {FrontMcpTokens} from '../tokens';\nimport {FrontMcpMetadata, frontMcpMetadataSchema} from '../metadata';\n\n/**\n * Decorator that marks a class as a FrontMcp Server and provides metadata\n */\nexport function FrontMcp(providedMetadata: FrontMcpMetadata): ClassDecorator {\n return (target: Function) => {\n\n const {error, data: metadata} = frontMcpMetadataSchema.safeParse(providedMetadata);\n if (error) {\n if (error.format().apps) {\n throw new Error(`Invalid metadata provided to @FrontMcp { apps: [?] }: \\n${JSON.stringify(error.format().apps, null, 2)}`);\n }\n if (error.format().providers) {\n throw new Error(`Invalid metadata provided to @FrontMcp { providers: [?] }: \\n${JSON.stringify(error.format().providers, null, 2)}`);\n }\n if (error.format().logging?.transports) {\n throw new Error(`Invalid metadata provided to @FrontMcp { logging: { transports: [?] } }: \\n${JSON.stringify(error.format().logging?.transports, null, 2)}`);\n }\n throw error;\n }\n\n Reflect.defineMetadata(FrontMcpTokens.type, true, target);\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpTokens[property] ?? property, metadata[property], target);\n }\n\n if (metadata.serve) {\n const core = '@frontmcp/core';\n import(core).then(({FrontMcpInstance}) => {\n if (!FrontMcpInstance) {\n throw new Error(`${core} version mismatch, make sure you have the same version for all @frontmcp/* packages`);\n }\n FrontMcpInstance.bootstrap(metadata);\n });\n }\n\n };\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { HookOptions, FlowName } from '../metadata';
2
+ /** NEW: typed variants */
3
+ export declare function StageHookOf<Name extends FlowName>(flow: Name): (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
4
+ export declare function WillHookOf<Name extends FlowName>(flow: Name): (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
5
+ export declare function DidHookOf<Name extends FlowName>(flow: Name): (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
6
+ export declare function AroundHookOf<Name extends FlowName>(name: Name): (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
7
+ export declare function FlowHooksOf<Name extends FlowName>(name: Name): {
8
+ Stage: (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
9
+ Will: (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
10
+ Did: (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
11
+ Around: (stage: ExtendFlows[Name]["stage"], opts?: HookOptions<ExtendFlows[Name]["ctx"]>) => MethodDecorator;
12
+ };
@@ -13,41 +13,46 @@ function registerFlowHook(target, meta) {
13
13
  Reflect.defineMetadata(tokens_1.FrontMcpFlowHookTokens.hooks, arr, ctor);
14
14
  }
15
15
  /** Base factory (kept internal) */
16
- function make(kind) {
16
+ function make(flow, type) {
17
17
  return function (stage, opts = {}) {
18
18
  return (target, key, _desc) => {
19
+ const { priority = 0, filter, ...rest } = opts;
19
20
  registerFlowHook(target, {
20
- kind,
21
- stage: String(stage),
21
+ ...rest,
22
+ [tokens_1.FrontMcpFlowHookTokens.type]: true,
23
+ flow: flow,
24
+ type: type,
25
+ stage: stage,
22
26
  method: String(key),
23
- priority: opts.priority ?? 0,
24
- filter: opts.filter,
27
+ priority: priority,
28
+ filter: filter,
29
+ target: target,
25
30
  static: Boolean(target.constructor[key]),
26
31
  });
27
32
  };
28
33
  };
29
34
  }
30
35
  /** NEW: typed variants */
31
- function StageHookOf(name) {
32
- const base = make('stage');
36
+ function StageHookOf(flow) {
37
+ const base = make(flow, 'stage');
33
38
  return function (stage, opts = {}) {
34
39
  return base(stage, opts);
35
40
  };
36
41
  }
37
- function WillHookOf(name) {
38
- const base = make('will');
42
+ function WillHookOf(flow) {
43
+ const base = make(flow, 'will');
39
44
  return function (stage, opts = {}) {
40
45
  return base(stage, opts);
41
46
  };
42
47
  }
43
- function DidHookOf(name) {
44
- const base = make('did');
48
+ function DidHookOf(flow) {
49
+ const base = make(flow, 'did');
45
50
  return function (stage, opts = {}) {
46
51
  return base(stage, opts);
47
52
  };
48
53
  }
49
54
  function AroundHookOf(name) {
50
- const base = make('around');
55
+ const base = make(name, 'around');
51
56
  return function (stage, opts = {}) {
52
57
  return base(stage, opts);
53
58
  };
@@ -60,4 +65,4 @@ function FlowHooksOf(name) {
60
65
  Around: AroundHookOf(name),
61
66
  };
62
67
  }
63
- //# sourceMappingURL=flow-hooks.decorator.js.map
68
+ //# sourceMappingURL=hook.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.decorator.js","sourceRoot":"","sources":["../../../src/decorators/hook.decorator.ts"],"names":[],"mappings":";;AAiCA,kCAOC;AAED,gCAOC;AAED,8BAOC;AAED,oCAOC;AAED,kCAOC;AA3ED,sCAAiD;AAGjD,SAAS,gBAAgB,CAAC,MAAW,EAAE,IAAkB;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,+BAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,CAAC,cAAc,CAAC,+BAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,mCAAmC;AACnC,SAAS,IAAI,CAAC,IAAc,EAAE,IAAmB;IAC/C,OAAO,UAAoD,KAAQ,EAAE,OAAyB,EAAE;QAC9F,OAAO,CAAC,MAAW,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YACjC,MAAM,EAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAC,GAAG,IAAI,CAAC;YAC7C,gBAAgB,CAAC,MAAM,EAAE;gBACvB,GAAG,IAAI;gBACP,CAAC,+BAAsB,CAAC,IAAI,CAAC,EAAE,IAAI;gBACnC,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;gBACnB,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aACzC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,0BAA0B;AAC1B,SAAgB,WAAW,CAAwB,IAAU;IAG3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,UAAU,CAAwB,IAAU;IAG1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,SAAS,CAAwB,IAAU;IAGzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAAwB,IAAU;IAG5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,UAAU,KAAQ,EAAE,OAAyB,EAAE;QACpD,OAAO,IAAI,CAAS,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAwB,IAAU;IAC3D,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QACtB,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC;QACpB,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC","sourcesContent":["import {HookStageType, HookOptions, FlowName, HookMetadata} from '../metadata';\nimport {FrontMcpFlowHookTokens} from '../tokens';\n\n\nfunction registerFlowHook(target: any, meta: HookMetadata) {\n const ctor = target.constructor;\n const arr = Reflect.getMetadata(FrontMcpFlowHookTokens.hooks, ctor) ?? [];\n arr.push(meta);\n Reflect.defineMetadata(FrontMcpFlowHookTokens.hooks, arr, ctor);\n}\n\n/** Base factory (kept internal) */\nfunction make(flow: FlowName, type: HookStageType) {\n return function <Ctx = unknown, T extends string = string>(stage: T, opts: HookOptions<Ctx> = {}): MethodDecorator {\n return (target: any, key, _desc) => {\n const {priority = 0, filter, ...rest} = opts;\n registerFlowHook(target, {\n ...rest,\n [FrontMcpFlowHookTokens.type]: true,\n flow: flow,\n type: type,\n stage: stage,\n method: String(key),\n priority: priority,\n filter: filter,\n target: target,\n static: Boolean(target.constructor[key]),\n });\n };\n };\n}\n\n/** NEW: typed variants */\nexport function StageHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage']\n type Ctx = ExtendFlows[Name]['ctx']\n const base = make(flow, 'stage');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\nexport function WillHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage']\n type Ctx = ExtendFlows[Name]['ctx']\n const base = make(flow, 'will');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\nexport function DidHookOf<Name extends FlowName>(flow: Name) {\n type T = ExtendFlows[Name]['stage']\n type Ctx = ExtendFlows[Name]['ctx']\n const base = make(flow, 'did');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\nexport function AroundHookOf<Name extends FlowName>(name: Name) {\n type T = ExtendFlows[Name]['stage']\n type Ctx = ExtendFlows[Name]['ctx']\n const base = make(name, 'around');\n return function (stage: T, opts: HookOptions<Ctx> = {}) {\n return base<Ctx, T>(stage, opts);\n };\n}\n\nexport function FlowHooksOf<Name extends FlowName>(name: Name) {\n return {\n Stage: StageHookOf(name),\n Will: WillHookOf(name),\n Did: DidHookOf(name),\n Around: AroundHookOf(name),\n };\n}\n\n"]}
@@ -1,6 +1,6 @@
1
1
  export * from './front-mcp.decorator';
2
2
  export * from './flow.decorator';
3
- export * from './flow-hooks.decorator';
3
+ export * from './hook.decorator';
4
4
  export * from './app.decorator';
5
5
  export * from './provider.decorator';
6
6
  export * from './auth-provider.decorator';
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./front-mcp.decorator"), exports);
5
5
  tslib_1.__exportStar(require("./flow.decorator"), exports);
6
- tslib_1.__exportStar(require("./flow-hooks.decorator"), exports);
6
+ tslib_1.__exportStar(require("./hook.decorator"), exports);
7
7
  tslib_1.__exportStar(require("./app.decorator"), exports);
8
8
  tslib_1.__exportStar(require("./provider.decorator"), exports);
9
9
  tslib_1.__exportStar(require("./auth-provider.decorator"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/decorators/index.ts"],"names":[],"mappings":";;;AAAA,gEAAsC;AACtC,2DAAiC;AACjC,iEAAuC;AACvC,0DAAgC;AAChC,+DAAqC;AACrC,oEAA0C;AAC1C,8DAAoC;AACpC,6DAAmC;AACnC,2DAAiC;AACjC,+DAAqC;AACrC,6DAAmC;AACnC,6DAAmC","sourcesContent":["export * from './front-mcp.decorator';\nexport * from './flow.decorator';\nexport * from './flow-hooks.decorator';\nexport * from './app.decorator';\nexport * from './provider.decorator';\nexport * from './auth-provider.decorator';\nexport * from './adapter.decorator';\nexport * from './plugin.decorator';\nexport * from './tool.decorator';\nexport * from './resource.decorator';\nexport * from './prompt.decorator';\nexport * from './logger.decorator';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/decorators/index.ts"],"names":[],"mappings":";;;AAAA,gEAAsC;AACtC,2DAAiC;AACjC,2DAAiC;AACjC,0DAAgC;AAChC,+DAAqC;AACrC,oEAA0C;AAC1C,8DAAoC;AACpC,6DAAmC;AACnC,2DAAiC;AACjC,+DAAqC;AACrC,6DAAmC;AACnC,6DAAmC","sourcesContent":["export * from './front-mcp.decorator';\nexport * from './flow.decorator';\nexport * from './hook.decorator';\nexport * from './app.decorator';\nexport * from './provider.decorator';\nexport * from './auth-provider.decorator';\nexport * from './adapter.decorator';\nexport * from './plugin.decorator';\nexport * from './tool.decorator';\nexport * from './resource.decorator';\nexport * from './prompt.decorator';\nexport * from './logger.decorator';\n"]}
@@ -2,13 +2,41 @@ import 'reflect-metadata';
2
2
  import { ToolMetadata } from '../metadata';
3
3
  import z from 'zod';
4
4
  import { ToolContext } from "../interfaces";
5
+ export type FrontMcpToolExecuteHandler<In extends object, Out extends object> = (input: In, ctx: ToolContext<In, Out>) => Out | Promise<Out>;
5
6
  /**
6
7
  * Decorator that marks a class as a McpTool module and provides metadata
7
8
  */
8
- declare function FrontMcpTool(providedMetadata: ToolMetadata): ClassDecorator;
9
- export type FrontMcpToolExecuteHandler<In, Out> = (input: In, ctx: ToolContext<In, Out>) => Out | Promise<Out>;
10
- /**
11
- * Decorator that marks a class as a McpTool module and provides metadata
12
- */
13
- declare function frontMcpTool<T extends ToolMetadata, In = z.baseObjectInputType<T['inputSchema']>, Out = T['outputSchema'] extends z.ZodRawShape ? z.baseObjectInputType<T['outputSchema']> : unknown>(providedMetadata: T): (handler: FrontMcpToolExecuteHandler<In, Out>) => (() => void);
9
+ declare function frontMcpTool<T extends ToolMetadata, In extends object = z.baseObjectInputType<T['inputSchema']>, Out extends object = T['outputSchema'] extends z.ZodRawShape ? z.baseObjectInputType<T['outputSchema']> : object>(providedMetadata: T): (handler: FrontMcpToolExecuteHandler<In, Out>) => (() => void);
14
10
  export { FrontMcpTool, FrontMcpTool as Tool, frontMcpTool, frontMcpTool as tool, };
11
+ declare module "@frontmcp/sdk" {
12
+ type __Shape = z.ZodRawShape;
13
+ type __AsZodObj<T> = T extends z.ZodObject<infer S> ? z.ZodObject<S> : T extends z.ZodRawShape ? z.ZodObject<T> : never;
14
+ type __InputOf<Opt> = Opt extends {
15
+ inputSchema: infer I;
16
+ } ? z.infer<__AsZodObj<I>> : never;
17
+ type __OutputOf<Opt> = Opt extends {
18
+ outputSchema: infer O;
19
+ } ? z.infer<__AsZodObj<O>> : never;
20
+ type __ToolOptions<I extends __Shape, O extends __Shape> = ExtendFrontMcpToolMetadata & ToolMetadata<I | z.ZodObject<I>, O | z.ZodObject<O>>;
21
+ type __Ctor = new (...a: any[]) => any | (abstract new (...a: any[]) => any);
22
+ type __A<C extends __Ctor> = C extends new (...a: infer A) => any ? A : C extends abstract new (...a: infer A) => any ? A : never;
23
+ type __R<C extends __Ctor> = C extends new (...a: any[]) => infer R ? R : C extends abstract new (...a: any[]) => infer R ? R : never;
24
+ type __Param<C extends __Ctor> = __R<C> extends {
25
+ execute: (arg: infer P, ...r: any) => any;
26
+ } ? P : never;
27
+ type __Return<C extends __Ctor> = __R<C> extends {
28
+ execute: (...a: any) => infer R;
29
+ } ? R : never;
30
+ type __Unwrap<T> = T extends Promise<infer U> ? U : T;
31
+ type __IsAny<T> = 0 extends (1 & T) ? true : false;
32
+ type __Err<M extends string> = {
33
+ __type_error__: M;
34
+ } & {
35
+ never?: never;
36
+ };
37
+ type __MustExtendCtx<C extends __Ctor> = __R<C> extends ToolContext ? {} : __Err<"Class must extend ToolContext">;
38
+ type __MustParam<C extends __Ctor, In> = __IsAny<__Param<C>> extends true ? __Err<"execute(input) must not be any and must exactly match input schema"> : __Param<C> extends In ? (In extends __Param<C> ? {} : __Err<"execute(input) must be exactly the input schema (no widening or narrowing)">) : __Err<"execute(input) parameter does not match input schema">;
39
+ type __MustReturn<C extends __Ctor, Out> = __Unwrap<__Return<C>> extends Out ? {} : __Err<"execute return type must be output schema or Promise<output schema>">;
40
+ type __Rewrap<C extends __Ctor, In, Out> = C extends abstract new (...a: __A<C>) => __R<C> ? C & (abstract new (...a: __A<C>) => (ToolContext<In, Out> & __R<C>)) : C extends new (...a: __A<C>) => __R<C> ? C & (new (...a: __A<C>) => (ToolContext<In, Out> & __R<C>)) : never;
41
+ function Tool<I extends __Shape, O extends __Shape, T extends __ToolOptions<I, O>>(opts: T): <C extends __Ctor>(cls: C & __MustExtendCtx<C> & __MustParam<C, __InputOf<T>> & __MustReturn<C, __OutputOf<T>>) => __Rewrap<C, __InputOf<T>, __OutputOf<T>>;
42
+ }
@@ -14,9 +14,16 @@ function FrontMcpTool(providedMetadata) {
14
14
  return (target) => {
15
15
  const metadata = metadata_1.frontMcpToolMetadataSchema.parse(providedMetadata);
16
16
  Reflect.defineMetadata(tokens_1.FrontMcpToolTokens.type, true, target);
17
+ const extended = {};
17
18
  for (const property in metadata) {
18
- Reflect.defineMetadata(tokens_1.FrontMcpToolTokens[property] ?? property, metadata[property], target);
19
+ if (tokens_1.FrontMcpToolTokens[property]) {
20
+ Reflect.defineMetadata(tokens_1.FrontMcpToolTokens[property], metadata[property], target);
21
+ }
22
+ else {
23
+ extended[property] = metadata[property];
24
+ }
19
25
  }
26
+ Reflect.defineMetadata(tokens_1.extendedToolMetadata, extended, target);
20
27
  };
21
28
  }
22
29
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tool.decorator.js","sourceRoot":"","sources":["../../../src/decorators/tool.decorator.ts"],"names":[],"mappings":";;AA8CE,oCAAY;AACI,4BAAI;AACpB,oCAAY;AACI,4BAAI;AAjDtB,4BAA0B;AAC1B,sCAA+C;AAC/C,0CAAuE;AAIvE;;GAEG;AACH,SAAS,YAAY,CAAC,gBAA8B;IAElD,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAEpE,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAE9D,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAKD;;GAEG;AACH,SAAS,YAAY,CAGnB,gBAAmB;IACnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG;YACnB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B,CAAC,2BAAkB,CAAC,IAAI,CAAC,EAAE,eAAe;YAC1C,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACxC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { FrontMcpToolTokens } from '../tokens';\nimport { ToolMetadata, frontMcpToolMetadataSchema } from '../metadata';\nimport z from 'zod';\nimport {ToolContext} from \"../interfaces\";\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction FrontMcpTool(providedMetadata: ToolMetadata): ClassDecorator {\n\n return (target: any) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n\n Reflect.defineMetadata(FrontMcpToolTokens.type, true, target);\n\n for (const property in metadata) {\n Reflect.defineMetadata(FrontMcpToolTokens[property] ?? property, metadata[property], target);\n }\n };\n}\n\n\nexport type FrontMcpToolExecuteHandler<In, Out> = (input: In, ctx: ToolContext<In, Out>) => Out | Promise<Out>;\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction frontMcpTool<T extends ToolMetadata,\n In = z.baseObjectInputType<T['inputSchema']>,\n Out = T['outputSchema'] extends z.ZodRawShape ? z.baseObjectInputType<T['outputSchema']> : unknown\n>(providedMetadata: T): (handler: FrontMcpToolExecuteHandler<In, Out>) => (() => void) {\n return (execute) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n const toolFunction = function() {\n return execute;\n };\n Object.assign(toolFunction, {\n [FrontMcpToolTokens.type]: 'function-tool',\n [FrontMcpToolTokens.metadata]: metadata,\n });\n return toolFunction;\n };\n}\n\nexport {\n FrontMcpTool,\n FrontMcpTool as Tool,\n frontMcpTool,\n frontMcpTool as tool,\n};"]}
1
+ {"version":3,"file":"tool.decorator.js","sourceRoot":"","sources":["../../../src/decorators/tool.decorator.ts"],"names":[],"mappings":";;AAkDE,oCAAY;AACI,4BAAI;AACpB,oCAAY;AACI,4BAAI;AArDtB,4BAA0B;AAC1B,sCAAmE;AACnE,0CAAqE;AAIrE;;GAEG;AACH,SAAS,YAAY,CAAC,gBAA8B;IAElD,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAG,2BAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,cAAc,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YACnF,CAAC;iBAAK,CAAC;gBACL,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,cAAc,CAAC,6BAAoB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC;AACJ,CAAC;AAKD;;GAEG;AACH,SAAS,YAAY,CAGnB,gBAAmB;IACnB,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,qCAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG;YACnB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;YAC1B,CAAC,2BAAkB,CAAC,IAAI,CAAC,EAAE,eAAe;YAC1C,CAAC,2BAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACxC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import 'reflect-metadata';\nimport {extendedToolMetadata, FrontMcpToolTokens} from '../tokens';\nimport {ToolMetadata, frontMcpToolMetadataSchema} from '../metadata';\nimport z from 'zod';\nimport {ToolContext} from \"../interfaces\";\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction FrontMcpTool(providedMetadata: ToolMetadata): ClassDecorator {\n\n return (target: any) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n Reflect.defineMetadata(FrontMcpToolTokens.type, true, target);\n const extended = {};\n for (const property in metadata) {\n if(FrontMcpToolTokens[property]) {\n Reflect.defineMetadata(FrontMcpToolTokens[property], metadata[property], target);\n }else {\n extended[property] = metadata[property];\n }\n }\n Reflect.defineMetadata(extendedToolMetadata, extended, target);\n };\n}\n\n\nexport type FrontMcpToolExecuteHandler<In extends object, Out extends object> = (input: In, ctx: ToolContext<In, Out>) => Out | Promise<Out>;\n\n/**\n * Decorator that marks a class as a McpTool module and provides metadata\n */\nfunction frontMcpTool<T extends ToolMetadata,\n In extends object = z.baseObjectInputType<T['inputSchema']>,\n Out extends object = T['outputSchema'] extends z.ZodRawShape ? z.baseObjectInputType<T['outputSchema']> : object\n>(providedMetadata: T): (handler: FrontMcpToolExecuteHandler<In, Out>) => (() => void) {\n return (execute) => {\n const metadata = frontMcpToolMetadataSchema.parse(providedMetadata);\n const toolFunction = function () {\n return execute;\n };\n Object.assign(toolFunction, {\n [FrontMcpToolTokens.type]: 'function-tool',\n [FrontMcpToolTokens.metadata]: metadata,\n });\n return toolFunction;\n };\n}\n\nexport {\n FrontMcpTool,\n FrontMcpTool as Tool,\n frontMcpTool,\n frontMcpTool as tool,\n};\n\n\ndeclare module \"@frontmcp/sdk\" {\n // ---------- zod helpers ----------\n type __Shape = z.ZodRawShape; // = Record<string, z.ZodTypeAny>\n type __AsZodObj<T> =\n T extends z.ZodObject<infer S> ? z.ZodObject<S> :\n T extends z.ZodRawShape ? z.ZodObject<T> :\n never;\n\n export type __InputOf<Opt> =\n Opt extends { inputSchema: infer I } ? z.infer<__AsZodObj<I>> : never;\n\n export type __OutputOf<Opt> =\n Opt extends { outputSchema: infer O } ? z.infer<__AsZodObj<O>> : never;\n\n export type __ToolOptions<I extends __Shape, O extends __Shape> = ExtendFrontMcpToolMetadata & ToolMetadata<I | z.ZodObject<I>, O | z.ZodObject<O>>;\n\n // ---------- ctor & reflection ----------\n type __Ctor = new (...a: any[]) => any | (abstract new (...a: any[]) => any);\n type __A<C extends __Ctor> = C extends new (...a: infer A) => any ? A\n : C extends abstract new (...a: infer A) => any ? A : never;\n type __R<C extends __Ctor> = C extends new (...a: any[]) => infer R ? R\n : C extends abstract new (...a: any[]) => infer R ? R : never;\n\n type __Param<C extends __Ctor> =\n __R<C> extends { execute: (arg: infer P, ...r: any) => any } ? P : never;\n\n type __Return<C extends __Ctor> =\n __R<C> extends { execute: (...a: any) => infer R } ? R : never;\n\n type __Unwrap<T> = T extends Promise<infer U> ? U : T;\n type __IsAny<T> = 0 extends (1 & T) ? true : false;\n\n // ---------- friendly branded errors ----------\n type __Err<M extends string> = { __type_error__: M } & { never?: never };\n\n // Must extend ToolContext\n type __MustExtendCtx<C extends __Ctor> =\n __R<C> extends ToolContext ? {} :\n __Err<\"Class must extend ToolContext\">;\n\n // execute param must exactly match In (and not be any)\n type __MustParam<C extends __Ctor, In> =\n __IsAny<__Param<C>> extends true\n ? __Err<\"execute(input) must not be any and must exactly match input schema\">\n : __Param<C> extends In\n ? (In extends __Param<C> ? {} : __Err<\"execute(input) must be exactly the input schema (no widening or narrowing)\">)\n : __Err<\"execute(input) parameter does not match input schema\">;\n\n // execute return must be Out or Promise<Out>\n type __MustReturn<C extends __Ctor, Out> =\n __Unwrap<__Return<C>> extends Out ? {} :\n __Err<\"execute return type must be output schema or Promise<output schema>\">;\n\n // Rewrapped constructor: preserve concrete/abstract + original type, but guarantee ToolContext<In,Out> on instance\n type __Rewrap<C extends __Ctor, In, Out> =\n C extends abstract new (...a: __A<C>) => __R<C>\n ? C & (abstract new (...a: __A<C>) => (ToolContext<In, Out> & __R<C>))\n : C extends new (...a: __A<C>) => __R<C>\n ? C & (new (...a: __A<C>) => (ToolContext<In, Out> & __R<C>))\n : never;\n\n // ---------- the decorator ----------\n // @ts-expect-error - Module augmentation requires decorator overload\n export function Tool<\n I extends __Shape,\n O extends __Shape,\n T extends __ToolOptions<I, O>\n >(opts: T): <\n C extends __Ctor\n >(cls: C &\n __MustExtendCtx<C> &\n __MustParam<C, __InputOf<T>> &\n __MustReturn<C, __OutputOf<T>>\n ) => __Rewrap<C, __InputOf<T>, __OutputOf<T>>;\n}"]}
@@ -39,6 +39,7 @@ export declare abstract class DynamicPlugin<TOptions extends object> {
39
39
  * @param options
40
40
  */
41
41
  static dynamicProviders?(options: any): readonly ProviderType[];
42
+ get<T>(token: Reference<T>): T;
42
43
  /**
43
44
  * Static init() method to create a plugin provider.
44
45
  * @param options
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DynamicPlugin = void 0;
4
4
  const dynamic_utils_1 = require("./dynamic.utils");
5
5
  class DynamicPlugin {
6
+ get(token) {
7
+ throw new Error('Method not implemented.');
8
+ }
6
9
  /**
7
10
  * Static init() method to create a plugin provider.
8
11
  * @param options
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic.plugin.js","sourceRoot":"","sources":["../../../src/dynamic/dynamic.plugin.ts"],"names":[],"mappings":";;;AAEA,mDAAiF;AA0BjF,MAAsB,aAAa;IAYjC;;;OAGG;IACH,MAAM,CAAC,IAAI,CAET,OAA0F;QAE1F,MAAM,cAAc,GAAI,OAAe,CAAC,SAAgD,CAAC;QACzF,MAAM,YAAY,GAAG,OAAc,CAAC;QAEpC,IAAI,YAAY,IAAI,OAAO,EAAE,CAAC;YAC5B,OAAO;gBACL,GAAG,YAAY;gBACf,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,OAAO,CAAC,MAAgC;gBAChD,UAAU,EAAE,OAAO,CAAC,UAAiB;gBACrC,SAAS,EAAE,IAAA,qCAAqB,EAAC,cAAc,IAAI,EAAE,CAAC;aAEvD,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAA,uCAAuB,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,IAAA,qCAAqB,EAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3F,OAAO;YACL,GAAG,YAAY;YACf,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC;YAC3B,SAAS,EAAE,eAAe;SAC3B,CAAC;IACJ,CAAC;CACF;AA3CD,sCA2CC","sourcesContent":["// dynamic-plugin.ts\nimport { Reference, PluginType, ProviderType } from '../interfaces';\nimport { collectDynamicProviders, dedupePluginProviders } from './dynamic.utils';\n\n// keep your original options union; just add optional `providers`\ntype InitOptions<T> =\n | ((T & { useFactory?: never; inject?: never }) & { providers?: readonly ProviderType[] })\n | {\n inject: () => readonly Reference<any>[];\n useFactory: (...args: any[]) => T;\n providers?: readonly ProviderType[];\n};\n\ntype PluginClassWithOptions<T> = {\n new(...args: any[]): any;\n prototype: { __options_brand?: T };\n // optional hook contributed by plugin authors\n dynamicProviders?: (options: T) => readonly ProviderType[];\n};\n\ntype ValueMcpPlugin<T> = { provide: any; useValue: T; providers?: ProviderType[] };\ntype FactoryMcpPlugin<T> = { provide: any; inject: () => readonly Reference<any>[]; useFactory: (...args: any[]) => T };\n\ntype PluginReturn<T> = (ValueMcpPlugin<T> | FactoryMcpPlugin<T>) &\n PluginType & {\n providers?: readonly ProviderType[];\n};\n\nexport abstract class DynamicPlugin<TOptions extends object> {\n /**\n * Private property to ensure options are typed correctly.\n */\n declare __options_brand: TOptions;\n\n /**\n * Optional hook to contribute providers to the plugin.\n * @param options\n */\n static dynamicProviders?(options: any): readonly ProviderType[];\n\n /**\n * Static init() method to create a plugin provider.\n * @param options\n */\n static init<TThis extends PluginClassWithOptions<any>>(\n this: TThis,\n options: InitOptions<TThis['prototype'] extends { __options_brand?: infer O } ? O : never>,\n ): PluginReturn<TThis['prototype'] extends { __options_brand?: infer O } ? O : never> {\n const extraProviders = (options as any).providers as readonly ProviderType[] | undefined;\n const typedOptions = options as any;\n\n if ('useFactory' in options) {\n return {\n ...typedOptions,\n provide: this,\n inject: options.inject as () => Reference<any>[],\n useFactory: options.useFactory as any,\n providers: dedupePluginProviders(extraProviders ?? []),\n\n };\n }\n\n const dyn = collectDynamicProviders(this, typedOptions);\n const mergedProviders = dedupePluginProviders([...(dyn ?? []), ...(extraProviders ?? [])]);\n return {\n ...typedOptions,\n provide: this,\n useValue: new this(options),\n providers: mergedProviders,\n };\n }\n}"]}
1
+ {"version":3,"file":"dynamic.plugin.js","sourceRoot":"","sources":["../../../src/dynamic/dynamic.plugin.ts"],"names":[],"mappings":";;;AAEA,mDAA+E;AA0B/E,MAAsB,aAAa;IAYjC,GAAG,CAAI,KAAmB;QACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAI,CAET,OAA0F;QAE1F,MAAM,cAAc,GAAI,OAAe,CAAC,SAAgD,CAAC;QACzF,MAAM,YAAY,GAAG,OAAc,CAAC;QAEpC,IAAI,YAAY,IAAI,OAAO,EAAE,CAAC;YAC5B,OAAO;gBACL,GAAG,YAAY;gBACf,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,OAAO,CAAC,MAAgC;gBAChD,UAAU,EAAE,OAAO,CAAC,UAAiB;gBACrC,SAAS,EAAE,IAAA,qCAAqB,EAAC,cAAc,IAAI,EAAE,CAAC;aACvD,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAA,uCAAuB,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,IAAA,qCAAqB,EAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3F,OAAO;YACL,GAAG,YAAY;YACf,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC;YAC3B,SAAS,EAAE,eAAe;SAC3B,CAAC;IACJ,CAAC;CACF;AA9CD,sCA8CC","sourcesContent":["// dynamic-plugin.ts\nimport {Reference, PluginType, ProviderType, ProviderRegistryInterface} from '../interfaces';\nimport {collectDynamicProviders, dedupePluginProviders} from './dynamic.utils';\n\n// keep your original options union; just add optional `providers`\ntype InitOptions<T> =\n | ((T & { useFactory?: never; inject?: never }) & { providers?: readonly ProviderType[] })\n | {\n inject: () => readonly Reference<any>[];\n useFactory: (...args: any[]) => T;\n providers?: readonly ProviderType[];\n};\n\ntype PluginClassWithOptions<T> = {\n new(...args: any[]): any;\n prototype: { __options_brand?: T };\n // optional hook contributed by plugin authors\n dynamicProviders?: (options: T) => readonly ProviderType[];\n};\n\ntype ValueMcpPlugin<T> = { provide: any; useValue: T; providers?: ProviderType[] };\ntype FactoryMcpPlugin<T> = { provide: any; inject: () => readonly Reference<any>[]; useFactory: (...args: any[]) => T };\n\ntype PluginReturn<T> = (ValueMcpPlugin<T> | FactoryMcpPlugin<T>) &\n PluginType & {\n providers?: readonly ProviderType[];\n};\n\nexport abstract class DynamicPlugin<TOptions extends object> {\n /**\n * Private property to ensure options are typed correctly.\n */\n declare __options_brand: TOptions;\n\n /**\n * Optional hook to contribute providers to the plugin.\n * @param options\n */\n static dynamicProviders?(options: any): readonly ProviderType[];\n\n get<T>(token: Reference<T>): T {\n throw new Error('Method not implemented.');\n }\n\n /**\n * Static init() method to create a plugin provider.\n * @param options\n */\n static init<TThis extends PluginClassWithOptions<any>>(\n this: TThis,\n options: InitOptions<TThis['prototype'] extends { __options_brand?: infer O } ? O : never>,\n ): PluginReturn<TThis['prototype'] extends { __options_brand?: infer O } ? O : never> {\n const extraProviders = (options as any).providers as readonly ProviderType[] | undefined;\n const typedOptions = options as any;\n\n if ('useFactory' in options) {\n return {\n ...typedOptions,\n provide: this,\n inject: options.inject as () => Reference<any>[],\n useFactory: options.useFactory as any,\n providers: dedupePluginProviders(extraProviders ?? []),\n };\n }\n\n const dyn = collectDynamicProviders(this, typedOptions);\n const mergedProviders = dedupePluginProviders([...(dyn ?? []), ...(extraProviders ?? [])]);\n return {\n ...typedOptions,\n provide: this,\n useValue: new this(options),\n providers: mergedProviders,\n };\n }\n}"]}
@@ -12,7 +12,7 @@ export declare abstract class BaseEntry<Record extends {
12
12
  metadata: any;
13
13
  }, Interface, Metadata> {
14
14
  ready: Promise<void>;
15
- protected readonly record: Record;
15
+ readonly record: Record;
16
16
  protected readonly token: Token<Interface>;
17
17
  readonly metadata: Metadata;
18
18
  constructor(record: Record, token?: Token<Interface>, metadata?: Metadata);
@@ -1 +1 @@
1
- {"version":3,"file":"base.entry.js","sourceRoot":"","sources":["../../../src/entries/base.entry.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAQ1B,MAAsB,SAAS;IAC7B,KAAK,CAAgB;IACF,MAAM,CAAS;IACf,KAAK,CAAmB;IAClC,QAAQ,CAAW;IAE5B,YAAY,MAAc,EAAE,KAAwB,EAAE,QAAmB;QACvE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAC9C,CAAC;CAGF;AAbD,8BAaC","sourcesContent":["import 'reflect-metadata';\nimport { Token } from '../interfaces';\n\nexport type EntryOwnerKind = 'scope' | 'app' | 'plugin' | 'adapter';\nexport type EntryOwnerRef = { kind: EntryOwnerKind; id: string, ref: Token };\nexport type EntryLineage = EntryOwnerRef[]; // root -> leaf; e.g. [{kind:'app', id:'Portal'}, {kind:'plugin', id:'Okta'}]\n\n\nexport abstract class BaseEntry<Record extends { provide: any, metadata: any }, Interface, Metadata> {\n ready: Promise<void>;\n protected readonly record: Record;\n protected readonly token: Token<Interface>;\n readonly metadata: Metadata;\n\n constructor(record: Record, token?: Token<Interface>, metadata?: Metadata) {\n this.record = record;\n this.token = token ?? record.provide;\n this.metadata = metadata ?? record.metadata;\n }\n\n protected abstract initialize(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"base.entry.js","sourceRoot":"","sources":["../../../src/entries/base.entry.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAQ1B,MAAsB,SAAS;IAC7B,KAAK,CAAgB;IACZ,MAAM,CAAS;IACL,KAAK,CAAmB;IAClC,QAAQ,CAAW;IAE5B,YAAY,MAAc,EAAE,KAAwB,EAAE,QAAmB;QACvE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAC9C,CAAC;CAGF;AAbD,8BAaC","sourcesContent":["import 'reflect-metadata';\nimport { Token } from '../interfaces';\n\nexport type EntryOwnerKind = 'scope' | 'app' | 'plugin' | 'adapter';\nexport type EntryOwnerRef = { kind: EntryOwnerKind; id: string, ref: Token };\nexport type EntryLineage = EntryOwnerRef[]; // root -> leaf; e.g. [{kind:'app', id:'Portal'}, {kind:'plugin', id:'Okta'}]\n\n\nexport abstract class BaseEntry<Record extends { provide: any, metadata: any }, Interface, Metadata> {\n ready: Promise<void>;\n readonly record: Record;\n protected readonly token: Token<Interface>;\n readonly metadata: Metadata;\n\n constructor(record: Record, token?: Token<Interface>, metadata?: Metadata) {\n this.record = record;\n this.token = token ?? record.provide;\n this.metadata = metadata ?? record.metadata;\n }\n\n protected abstract initialize(): Promise<void>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"flow.entry.js","sourceRoot":"","sources":["../../../src/entries/flow.entry.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAC1B,6CAAyC;AAQzC,MAAsB,SAAiC,SAAQ,sBAAoD;IACxG,IAAI,CAAO;IACX,IAAI,CAAmB,CAAC,oEAAoE;IAC5F,MAAM,CAAc;IACpB,KAAK,CAAa;IAM3B,YAAsB,KAAiB,EAAC,MAAkB,EAAE,KAAuB,EAAE,QAA8B;QACjH,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CAEF;AAnBD,8BAmBC","sourcesContent":["import 'reflect-metadata';\nimport { BaseEntry } from './base.entry';\nimport { FlowRecord } from '../records';\nimport { FlowBase, FlowInputOf, FlowOutputOf, HttpMethod, ServerRequest, Token, Type } from '../interfaces';\nimport { FlowMetadata, FlowName } from '../metadata';\nimport { ScopeEntry } from './scope.entry';\nimport { z } from 'zod';\n\n\nexport abstract class FlowEntry<Name extends FlowName> extends BaseEntry<FlowRecord, FlowBase, FlowMetadata<never>> {\n readonly name: Name;\n readonly path?: RegExp | string; // string can be \"/test/**\" or \"/test/*/asds\", default to all paths;\n readonly method?: HttpMethod;\n readonly scope: ScopeEntry;\n\n abstract canActivate(request: ServerRequest): Promise<boolean>\n\n abstract run(input: FlowInputOf<Name>, deps: Map<Token, Type>): Promise<FlowOutputOf<Name> | undefined>\n\n protected constructor(scope: ScopeEntry,record: FlowRecord, token?: Token<FlowBase>, metadata?: FlowMetadata<never>) {\n super(record, token, metadata);\n const { path, method } = record.metadata.middleware ?? metadata?.middleware ?? {};\n this.name = metadata?.name ?? record.metadata?.name;\n this.path = path;\n this.method = method;\n this.scope = scope;\n }\n\n}\n\n"]}
1
+ {"version":3,"file":"flow.entry.js","sourceRoot":"","sources":["../../../src/entries/flow.entry.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAC1B,6CAAyC;AAOzC,MAAsB,SAAiC,SAAQ,sBAAoD;IACxG,IAAI,CAAO;IACX,IAAI,CAAmB,CAAC,oEAAoE;IAC5F,MAAM,CAAc;IACpB,KAAK,CAAa;IAM3B,YAAsB,KAAiB,EAAC,MAAkB,EAAE,KAAuB,EAAE,QAA8B;QACjH,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CAEF;AAnBD,8BAmBC","sourcesContent":["import 'reflect-metadata';\nimport { BaseEntry } from './base.entry';\nimport { FlowRecord } from '../records';\nimport { FlowBase, FlowInputOf, FlowOutputOf, HttpMethod, ServerRequest, Token, Type } from '../interfaces';\nimport { FlowMetadata, FlowName } from '../metadata';\nimport { ScopeEntry } from './scope.entry';\n\n\nexport abstract class FlowEntry<Name extends FlowName> extends BaseEntry<FlowRecord, FlowBase, FlowMetadata<never>> {\n readonly name: Name;\n readonly path?: RegExp | string; // string can be \"/test/**\" or \"/test/*/asds\", default to all paths;\n readonly method?: HttpMethod;\n readonly scope: ScopeEntry;\n\n abstract canActivate(request: ServerRequest): Promise<boolean>\n\n abstract run(input: FlowInputOf<Name>, deps: Map<Token, Type>): Promise<FlowOutputOf<Name> | undefined>\n\n protected constructor(scope: ScopeEntry,record: FlowRecord, token?: Token<FlowBase>, metadata?: FlowMetadata<never>) {\n super(record, token, metadata);\n const { path, method } = record.metadata.middleware ?? metadata?.middleware ?? {};\n this.name = metadata?.name ?? record.metadata?.name;\n this.path = path;\n this.method = method;\n this.scope = scope;\n }\n\n}\n\n"]}
@@ -0,0 +1,12 @@
1
+ import { ScopeEntry } from "./scope.entry";
2
+ import { HookOptions, HookMetadata, FlowName } from "../metadata";
3
+ import { HookRecord } from "../records";
4
+ import { HookBase, ProviderRegistryInterface, Token } from "../interfaces";
5
+ import { BaseEntry } from "./base.entry";
6
+ export declare abstract class HookEntry<In = any, Name extends FlowName = FlowName, Stage = string, Ctx = any> extends BaseEntry<HookRecord, HookBase<In, Ctx>, HookMetadata<Name, Stage, Ctx>> {
7
+ readonly scope: ScopeEntry;
8
+ readonly providers: ProviderRegistryInterface;
9
+ readonly options: HookOptions<Ctx>;
10
+ protected constructor(scope: ScopeEntry, providers: ProviderRegistryInterface, record: HookRecord, token: Token, metadata: HookMetadata<Name, Stage, Ctx>);
11
+ abstract run(input: In, ctx: Ctx): Promise<void>;
12
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HookEntry = void 0;
4
+ const base_entry_1 = require("./base.entry");
5
+ class HookEntry extends base_entry_1.BaseEntry {
6
+ scope;
7
+ providers;
8
+ options;
9
+ constructor(scope, providers, record, token, metadata) {
10
+ super(record, token, metadata);
11
+ this.scope = scope;
12
+ this.providers = providers;
13
+ this.options = {
14
+ filter: metadata.filter,
15
+ priority: metadata.priority
16
+ };
17
+ }
18
+ }
19
+ exports.HookEntry = HookEntry;
20
+ //# sourceMappingURL=hook.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.entry.js","sourceRoot":"","sources":["../../../src/entries/hook.entry.ts"],"names":[],"mappings":";;;AAIA,6CAAuC;AAEvC,MAAsB,SAAiF,SAAQ,sBAAwE;IAC5K,KAAK,CAAa;IAClB,SAAS,CAA4B;IACrC,OAAO,CAAmB;IAEnC,YAAsB,KAAiB,EAAE,SAAoC,EAAE,MAAkB,EAAE,KAAY,EAAE,QAAyC;QACxJ,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG;YACb,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAA;IACH,CAAC;CAGF;AAhBD,8BAgBC","sourcesContent":["import {ScopeEntry} from \"./scope.entry\";\nimport {HookOptions, HookMetadata, FlowName} from \"../metadata\";\nimport {HookRecord} from \"../records\";\nimport {HookBase, ProviderRegistryInterface, Token} from \"../interfaces\";\nimport {BaseEntry} from \"./base.entry\";\n\nexport abstract class HookEntry<In = any, Name extends FlowName = FlowName, Stage = string, Ctx = any> extends BaseEntry<HookRecord, HookBase<In, Ctx>, HookMetadata<Name, Stage, Ctx>> {\n readonly scope: ScopeEntry;\n readonly providers: ProviderRegistryInterface;\n readonly options: HookOptions<Ctx>;\n\n protected constructor(scope: ScopeEntry, providers: ProviderRegistryInterface, record: HookRecord, token: Token, metadata: HookMetadata<Name, Stage, Ctx>) {\n super(record, token, metadata);\n this.scope = scope;\n this.providers = providers;\n this.options = {\n filter: metadata.filter,\n priority: metadata.priority\n }\n }\n\n abstract run(input: In, ctx: Ctx): Promise<void>;\n}"]}
@@ -1,6 +1,7 @@
1
1
  export * from './base.entry';
2
2
  export * from './scope.entry';
3
3
  export * from './flow.entry';
4
+ export * from './hook.entry';
4
5
  export * from './app.entry';
5
6
  export * from './provider.entry';
6
7
  export * from './auth-provider.entry';
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./base.entry"), exports);
5
5
  tslib_1.__exportStar(require("./scope.entry"), exports);
6
6
  tslib_1.__exportStar(require("./flow.entry"), exports);
7
+ tslib_1.__exportStar(require("./hook.entry"), exports);
7
8
  tslib_1.__exportStar(require("./app.entry"), exports);
8
9
  tslib_1.__exportStar(require("./provider.entry"), exports);
9
10
  tslib_1.__exportStar(require("./auth-provider.entry"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/entries/index.ts"],"names":[],"mappings":";;;AAAA,uDAA6B;AAC7B,wDAA8B;AAC9B,uDAA6B;AAC7B,sDAA4B;AAC5B,2DAAiC;AACjC,gEAAsC;AACtC,yDAA+B;AAC/B,0DAAgC;AAChC,uDAA6B;AAC7B,2DAAiC;AACjC,yDAA+B;AAC/B,yDAA+B","sourcesContent":["export * from './base.entry';\nexport * from './scope.entry';\nexport * from './flow.entry';\nexport * from './app.entry';\nexport * from './provider.entry';\nexport * from './auth-provider.entry';\nexport * from './plugin.entry';\nexport * from './adapter.entry';\nexport * from './tool.entry';\nexport * from './resource.entry';\nexport * from './prompt.entry';\nexport * from './logger.entry';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/entries/index.ts"],"names":[],"mappings":";;;AAAA,uDAA6B;AAC7B,wDAA8B;AAC9B,uDAA6B;AAC7B,uDAA6B;AAC7B,sDAA4B;AAC5B,2DAAiC;AACjC,gEAAsC;AACtC,yDAA+B;AAC/B,0DAAgC;AAChC,uDAA6B;AAC7B,2DAAiC;AACjC,yDAA+B;AAC/B,yDAA+B","sourcesContent":["export * from './base.entry';\nexport * from './scope.entry';\nexport * from './flow.entry';\nexport * from './hook.entry';\nexport * from './app.entry';\nexport * from './provider.entry';\nexport * from './auth-provider.entry';\nexport * from './plugin.entry';\nexport * from './adapter.entry';\nexport * from './tool.entry';\nexport * from './resource.entry';\nexport * from './prompt.entry';\nexport * from './logger.entry';\n"]}
@@ -1,6 +1,7 @@
1
1
  import { BaseEntry } from './base.entry';
2
2
  import { PluginRecord } from '../records';
3
- import { PluginInterface } from '../interfaces';
3
+ import { PluginInterface, Token } from '../interfaces';
4
4
  import { PluginMetadata } from '../metadata';
5
5
  export declare abstract class PluginEntry extends BaseEntry<PluginRecord, PluginInterface, PluginMetadata> {
6
+ abstract get<T>(token: Token<T>): T;
6
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.entry.js","sourceRoot":"","sources":["../../../src/entries/plugin.entry.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAMzC,MAAsB,WAAY,SAAQ,sBAAwD;CAGjG;AAHD,kCAGC","sourcesContent":["import { BaseEntry } from './base.entry';\nimport { PluginRecord } from '../records';\nimport { PluginInterface } from '../interfaces';\nimport { PluginMetadata } from '../metadata';\n\n\nexport abstract class PluginEntry extends BaseEntry<PluginRecord, PluginInterface, PluginMetadata> {\n\n\n}"]}
1
+ {"version":3,"file":"plugin.entry.js","sourceRoot":"","sources":["../../../src/entries/plugin.entry.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAMvC,MAAsB,WAAY,SAAQ,sBAAwD;CAGjG;AAHD,kCAGC","sourcesContent":["import {BaseEntry} from './base.entry';\nimport {PluginRecord} from '../records';\nimport {PluginInterface, Token} from '../interfaces';\nimport {PluginMetadata} from '../metadata';\n\n\nexport abstract class PluginEntry extends BaseEntry<PluginRecord, PluginInterface, PluginMetadata> {\n\n abstract get<T>(token: Token<T>): T;\n}"]}
@@ -1,6 +1,6 @@
1
1
  import { BaseEntry } from './base.entry';
2
2
  import { ScopeRecord } from '../records';
3
- import { ScopeInterface, ProviderRegistryInterface, AppRegistryInterface, AuthRegistryInterface, FrontMcpAuth, Token, FlowInputOf, FlowOutputOf, Type, FlowType, FrontMcpLogger, ToolRegistryInterface } from '../interfaces';
3
+ import { ScopeInterface, ProviderRegistryInterface, AppRegistryInterface, AuthRegistryInterface, FrontMcpAuth, Token, FlowInputOf, FlowOutputOf, Type, FlowType, FrontMcpLogger, ToolRegistryInterface, HookRegistryInterface } from '../interfaces';
4
4
  import { FlowName, ScopeMetadata } from '../metadata';
5
5
  export declare abstract class ScopeEntry extends BaseEntry<ScopeRecord, ScopeInterface, ScopeMetadata> {
6
6
  abstract readonly id: string;
@@ -8,6 +8,7 @@ export declare abstract class ScopeEntry extends BaseEntry<ScopeRecord, ScopeInt
8
8
  abstract readonly routeBase: string;
9
9
  abstract readonly logger: FrontMcpLogger;
10
10
  abstract get auth(): FrontMcpAuth;
11
+ abstract get hooks(): HookRegistryInterface;
11
12
  abstract get authProviders(): AuthRegistryInterface;
12
13
  abstract get providers(): ProviderRegistryInterface;
13
14
  abstract get apps(): AppRegistryInterface;
@@ -1 +1 @@
1
- {"version":3,"file":"scope.entry.js","sourceRoot":"","sources":["../../../src/entries/scope.entry.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAYvC,MAAsB,UAAW,SAAQ,sBAAqD;CAmB7F;AAnBD,gCAmBC","sourcesContent":["import {BaseEntry} from './base.entry';\nimport {ScopeRecord} from '../records';\nimport {\n ScopeInterface,\n ProviderRegistryInterface,\n AppRegistryInterface,\n AuthRegistryInterface,\n FrontMcpAuth,\n Token, FlowInputOf, FlowOutputOf, Type, FlowType, FrontMcpLogger, ToolRegistryInterface,\n} from '../interfaces';\nimport {FlowName, ScopeMetadata} from '../metadata';\n\nexport abstract class ScopeEntry extends BaseEntry<ScopeRecord, ScopeInterface, ScopeMetadata> {\n abstract readonly id: string;\n abstract readonly entryPath: string;\n abstract readonly routeBase: string;\n abstract readonly logger: FrontMcpLogger;\n\n abstract get auth(): FrontMcpAuth;\n\n abstract get authProviders(): AuthRegistryInterface;\n\n abstract get providers(): ProviderRegistryInterface;\n\n abstract get apps(): AppRegistryInterface;\n\n abstract get tools(): ToolRegistryInterface;\n\n abstract registryFlows(...flows: FlowType[]): Promise<void>;\n\n abstract runFlow<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, additionalDeps?: Map<Token, Type>): Promise<FlowOutputOf<Name> | undefined>;\n}\n"]}
1
+ {"version":3,"file":"scope.entry.js","sourceRoot":"","sources":["../../../src/entries/scope.entry.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAYvC,MAAsB,UAAW,SAAQ,sBAAqD;CAqB7F;AArBD,gCAqBC","sourcesContent":["import {BaseEntry} from './base.entry';\nimport {ScopeRecord} from '../records';\nimport {\n ScopeInterface,\n ProviderRegistryInterface,\n AppRegistryInterface,\n AuthRegistryInterface,\n FrontMcpAuth,\n Token, FlowInputOf, FlowOutputOf, Type, FlowType, FrontMcpLogger, ToolRegistryInterface, HookRegistryInterface,\n} from '../interfaces';\nimport {FlowName, ScopeMetadata} from '../metadata';\n\nexport abstract class ScopeEntry extends BaseEntry<ScopeRecord, ScopeInterface, ScopeMetadata> {\n abstract readonly id: string;\n abstract readonly entryPath: string;\n abstract readonly routeBase: string;\n abstract readonly logger: FrontMcpLogger;\n\n abstract get auth(): FrontMcpAuth;\n\n abstract get hooks(): HookRegistryInterface;\n\n abstract get authProviders(): AuthRegistryInterface;\n\n abstract get providers(): ProviderRegistryInterface;\n\n abstract get apps(): AppRegistryInterface;\n\n abstract get tools(): ToolRegistryInterface;\n\n abstract registryFlows(...flows: FlowType[]): Promise<void>;\n\n abstract runFlow<Name extends FlowName>(name: Name, input: FlowInputOf<Name>, additionalDeps?: Map<Token, Type>): Promise<FlowOutputOf<Name> | undefined>;\n}\n"]}
@@ -5,9 +5,12 @@ import { ToolContext } from '../interfaces';
5
5
  import { ToolMetadata } from '../metadata';
6
6
  import { Request, Notification, CallToolRequest } from "@modelcontextprotocol/sdk/types.js";
7
7
  import { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
8
+ import { AuthInfo } from "@modelcontextprotocol/sdk/server/auth/types.js";
8
9
  export type ToolCallArgs = CallToolRequest["params"]["arguments"];
9
- export type ToolCallExtra = RequestHandlerExtra<Request, Notification>;
10
- export declare abstract class ToolEntry<In = z.ZodRawShape, Out = z.ZodRawShape> extends BaseEntry<ToolRecord, ToolContext<In, Out>, ToolMetadata> {
10
+ export type ToolCallExtra = RequestHandlerExtra<Request, Notification> & {
11
+ authInfo: AuthInfo;
12
+ };
13
+ export declare abstract class ToolEntry<In extends object = any, Out extends object = any> extends BaseEntry<ToolRecord, ToolContext<In, Out>, ToolMetadata> {
11
14
  owner: EntryOwnerRef;
12
15
  inputSchema: z.ZodObject<any>;
13
16
  rawInputSchema: z.ZodObject<any>;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.entry.js","sourceRoot":"","sources":["../../../src/entries/tool.entry.ts"],"names":[],"mappings":";;;AACA,6CAAsD;AAWtD,MAAsB,SAAmD,SAAQ,sBAAyD;IACxI,KAAK,CAAgB;IACrB,WAAW,CAAmB;IAC9B,cAAc,CAAmB;IACjC,YAAY,CAAmB;CAGhC;AAPD,8BAOC","sourcesContent":["import {z} from 'zod';\nimport {BaseEntry, EntryOwnerRef} from './base.entry';\nimport {ToolRecord} from '../records';\nimport {ToolContext} from '../interfaces';\nimport {ToolMetadata} from '../metadata';\nimport {Request, Notification, CallToolRequest} from \"@modelcontextprotocol/sdk/types.js\";\nimport {RequestHandlerExtra} from \"@modelcontextprotocol/sdk/shared/protocol.js\";\n\n\nexport type ToolCallArgs = CallToolRequest[\"params\"][\"arguments\"];\nexport type ToolCallExtra = RequestHandlerExtra<Request, Notification>;\n\nexport abstract class ToolEntry<In = z.ZodRawShape, Out = z.ZodRawShape> extends BaseEntry<ToolRecord, ToolContext<In, Out>, ToolMetadata> {\n owner: EntryOwnerRef;\n inputSchema: z.ZodObject<any>;\n rawInputSchema: z.ZodObject<any>;\n outputSchema: z.ZodObject<any>;\n\n abstract create(input: ToolCallArgs, ctx: ToolCallExtra): ToolContext<In, Out>;\n}\n"]}
1
+ {"version":3,"file":"tool.entry.js","sourceRoot":"","sources":["../../../src/entries/tool.entry.ts"],"names":[],"mappings":";;;AACA,6CAAsD;AActD,MAAsB,SAA6D,SAAQ,sBAAyD;IAClJ,KAAK,CAAgB;IACrB,WAAW,CAAmB;IAC9B,cAAc,CAAmB;IACjC,YAAY,CAAmB;CAGhC;AAPD,8BAOC","sourcesContent":["import {z} from 'zod';\nimport {BaseEntry, EntryOwnerRef} from './base.entry';\nimport {ToolRecord} from '../records';\nimport {ToolContext} from '../interfaces';\nimport {ToolMetadata} from '../metadata';\nimport {Request, Notification, CallToolRequest} from \"@modelcontextprotocol/sdk/types.js\";\nimport {RequestHandlerExtra} from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport {AuthInfo} from \"@modelcontextprotocol/sdk/server/auth/types.js\";\n\n\nexport type ToolCallArgs = CallToolRequest[\"params\"][\"arguments\"];\nexport type ToolCallExtra = RequestHandlerExtra<Request, Notification> & {\n authInfo: AuthInfo;\n};\n\nexport abstract class ToolEntry<In extends object = any, Out extends object = any> extends BaseEntry<ToolRecord, ToolContext<In, Out>, ToolMetadata> {\n owner: EntryOwnerRef;\n inputSchema: z.ZodObject<any>;\n rawInputSchema: z.ZodObject<any>;\n outputSchema: z.ZodObject<any>;\n\n abstract create(input: ToolCallArgs, ctx: ToolCallExtra): ToolContext<In, Out>;\n}\n"]}
@@ -1,13 +1,15 @@
1
1
  import { Token, Type } from './base.interface';
2
2
  import { FlowMetadata, FlowName } from '../metadata';
3
3
  import { z } from 'zod';
4
- import { ScopeEntry } from '../entries';
4
+ import { HookEntry, ScopeEntry } from '../entries';
5
5
  import { FlowStateOf } from './internal/flow.utils';
6
6
  import { FrontMcpLogger } from "./logger.interface";
7
7
  export type FlowInputOf<N extends FlowName> = z.infer<ExtendFlows[N]['input']>;
8
8
  export type FlowOutputOf<N extends FlowName> = z.infer<ExtendFlows[N]['output']>;
9
9
  export type FlowPlanOf<N extends FlowName> = ExtendFlows[N]['plan'];
10
10
  export type FlowCtxOf<N extends FlowName> = ExtendFlows[N]['ctx'];
11
+ export type FlowStagesOf<N extends FlowName> = ExtendFlows[N]['stage'];
12
+ export type FlowExecuteStagesOf<N extends FlowName> = ExtendFlows[N]['executeStage'];
11
13
  export type FlowControlType = 'respond' | 'fail' | 'abort' | 'next' | 'handled';
12
14
  export declare class FlowControl extends Error {
13
15
  readonly type: FlowControlType;
@@ -21,18 +23,19 @@ export declare class FlowControl extends Error {
21
23
  }
22
24
  export declare abstract class FlowBase<N extends FlowName = FlowName> {
23
25
  protected readonly metadata: FlowMetadata<N>;
24
- protected readonly rawInput: Partial<FlowInputOf<N>> | any;
26
+ readonly rawInput: Partial<FlowInputOf<N>> | any;
25
27
  protected readonly scope: ScopeEntry;
28
+ protected readonly appendContextHooks: (hooks: HookEntry[]) => void;
26
29
  protected readonly deps: ReadonlyMap<Token, unknown>;
27
30
  protected input: FlowInputOf<N>;
28
31
  state: FlowStateOf<N>;
29
32
  scopeLogger: FrontMcpLogger;
30
- constructor(metadata: FlowMetadata<N>, rawInput: Partial<FlowInputOf<N>> | any, scope: ScopeEntry, deps?: ReadonlyMap<Token, unknown>);
33
+ constructor(metadata: FlowMetadata<N>, rawInput: Partial<FlowInputOf<N>> | any, scope: ScopeEntry, appendContextHooks: (hooks: HookEntry[]) => void, deps?: ReadonlyMap<Token, unknown>);
31
34
  get<T>(token: Token<T>): T;
32
- protected respond(output: FlowOutputOf<N>): void;
33
- protected fail(error: Error): void;
35
+ respond(output: FlowOutputOf<N>): void;
36
+ fail(error: Error): void;
34
37
  protected abort(message: string): void;
35
38
  protected next(): void;
36
39
  protected handled(): void;
37
40
  }
38
- export type FlowType<Provide = FlowBase<FlowName>> = Type<Provide>;
41
+ export type FlowType<Provide = FlowBase> = Type<Provide>;
@@ -20,7 +20,7 @@ class FlowControl extends Error {
20
20
  throw new FlowControl('handled', null);
21
21
  }
22
22
  static fail(error) {
23
- throw new FlowControl('fail', error);
23
+ throw new FlowControl('fail', { error: error.message });
24
24
  }
25
25
  static abort(reason) {
26
26
  throw new FlowControl('abort', reason);
@@ -32,14 +32,16 @@ class FlowBase {
32
32
  metadata;
33
33
  rawInput;
34
34
  scope;
35
+ appendContextHooks;
35
36
  deps;
36
37
  input;
37
38
  state = flow_utils_1.FlowState.create({});
38
39
  scopeLogger;
39
- constructor(metadata, rawInput, scope, deps = new Map()) {
40
+ constructor(metadata, rawInput, scope, appendContextHooks, deps = new Map()) {
40
41
  this.metadata = metadata;
41
42
  this.rawInput = rawInput;
42
43
  this.scope = scope;
44
+ this.appendContextHooks = appendContextHooks;
43
45
  this.deps = deps;
44
46
  this.input = metadata.inputSchema?.parse?.(rawInput);
45
47
  this.scopeLogger = scope.logger;
@@ -1 +1 @@
1
- {"version":3,"file":"flow.interface.js","sourceRoot":"","sources":["../../../src/interfaces/flow.interface.ts"],"names":[],"mappings":";;;AAIA,sDAA6D;AAW7D,MAAa,WAAY,SAAQ,KAAK;IACR;IAAuC;IAAnE,YAA4B,IAAqB,EAAkB,MAAW;QAC5E,KAAK,EAAE,CAAC;QADkB,SAAI,GAAJ,IAAI,CAAiB;QAAkB,WAAM,GAAN,MAAM,CAAK;IAE9E,CAAC;IAED,MAAM,CAAC,OAAO,CAAI,MAAS;QACzB,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,IAAI;QACT,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,OAAO;QACZ,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAY;QACtB,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAc;QACzB,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;CAEF;AAzBD,kCAyBC;AAGD,uCAAuC;AACvC,MAAsB,QAAQ;IAMP;IACA;IACA;IACA;IARX,KAAK,CAAiB;IAChC,KAAK,GAAmB,sBAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,WAAW,CAAiB;IAE5B,YACqB,QAAyB,EACzB,QAAuC,EACvC,KAAiB,EACjB,OAAoC,IAAI,GAAG,EAAE;QAH7C,aAAQ,GAAR,QAAQ,CAAiB;QACzB,aAAQ,GAAR,QAAQ,CAA+B;QACvC,UAAK,GAAL,KAAK,CAAY;QACjB,SAAI,GAAJ,IAAI,CAAyC;QAEhE,IAAI,CAAC,KAAK,GAAI,QAAQ,CAAC,WAAmB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,GAAG,CAAI,KAAe;QACpB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAM,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAES,OAAO,CAAC,MAAuB;QACvC,MAAM,WAAW,CAAC,OAAO,CAAE,IAAI,CAAC,QAAQ,CAAC,YAAiC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,CAAC;IAES,IAAI,CAAC,KAAY;QACzB,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAES,KAAK,CAAC,OAAe;QAC7B,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAES,IAAI;QACZ,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAES,OAAO;QACf,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;CACF;AAvCD,4BAuCC","sourcesContent":["import {Token, Type} from './base.interface';\nimport {FlowMetadata, FlowName} from '../metadata';\nimport {z} from 'zod';\nimport {ScopeEntry} from '../entries';\nimport {FlowState, FlowStateOf} from './internal/flow.utils';\nimport {FrontMcpLogger} from \"./logger.interface\";\n\nexport type FlowInputOf<N extends FlowName> = z.infer<ExtendFlows[N]['input']>;\nexport type FlowOutputOf<N extends FlowName> = z.infer<ExtendFlows[N]['output']>;\nexport type FlowPlanOf<N extends FlowName> = ExtendFlows[N]['plan'];\nexport type FlowCtxOf<N extends FlowName> = ExtendFlows[N]['ctx'];\n\n\nexport type FlowControlType = 'respond' | 'fail' | 'abort' | 'next' | 'handled';\n\nexport class FlowControl extends Error {\n constructor(public readonly type: FlowControlType, public readonly output: any) {\n super();\n }\n\n static respond<T>(output: T): never {\n throw new FlowControl('respond', output);\n }\n\n static next(): never {\n throw new FlowControl('next', null);\n }\n\n static handled(): never {\n throw new FlowControl('handled', null);\n }\n\n static fail(error: Error): never {\n throw new FlowControl('fail', error);\n }\n\n static abort(reason: string): never {\n throw new FlowControl('abort', reason);\n }\n\n}\n\n\n// 1) The actual abstract class (value)\nexport abstract class FlowBase<N extends FlowName = FlowName> {\n protected input: FlowInputOf<N>;\n state: FlowStateOf<N> = FlowState.create({});\n scopeLogger: FrontMcpLogger;\n\n constructor(\n protected readonly metadata: FlowMetadata<N>,\n protected readonly rawInput: Partial<FlowInputOf<N>> | any,\n protected readonly scope: ScopeEntry,\n protected readonly deps: ReadonlyMap<Token, unknown> = new Map(),\n ) {\n this.input = (metadata.inputSchema as any)?.parse?.(rawInput);\n this.scopeLogger = scope.logger;\n }\n\n get<T>(token: Token<T>): T {\n if (this.deps.has(token)) return this.deps.get(token) as T;\n return this.scope.providers.get(token);\n }\n\n protected respond(output: FlowOutputOf<N>) {\n throw FlowControl.respond((this.metadata.outputSchema as z.ZodObject<any>).parse(output));\n }\n\n protected fail(error: Error) {\n throw FlowControl.fail(error);\n }\n\n protected abort(message: string) {\n throw FlowControl.abort(message);\n }\n\n protected next() {\n throw FlowControl.next();\n }\n\n protected handled() {\n throw FlowControl.handled();\n }\n}\n\nexport type FlowType<Provide = FlowBase<FlowName>> =\n | Type<Provide>\n\n"]}
1
+ {"version":3,"file":"flow.interface.js","sourceRoot":"","sources":["../../../src/interfaces/flow.interface.ts"],"names":[],"mappings":";;;AAIA,sDAA6D;AAa7D,MAAa,WAAY,SAAQ,KAAK;IACR;IAAuC;IAAnE,YAA4B,IAAqB,EAAkB,MAAW;QAC5E,KAAK,EAAE,CAAC;QADkB,SAAI,GAAJ,IAAI,CAAiB;QAAkB,WAAM,GAAN,MAAM,CAAK;IAE9E,CAAC;IAED,MAAM,CAAC,OAAO,CAAI,MAAS;QACzB,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,IAAI;QACT,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,OAAO;QACZ,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAY;QACtB,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,EAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAc;QACzB,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;CAEF;AAzBD,kCAyBC;AAGD,uCAAuC;AACvC,MAAsB,QAAQ;IAMP;IACV;IACU;IACA;IACA;IATX,KAAK,CAAiB;IAChC,KAAK,GAAmB,sBAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,WAAW,CAAiB;IAE5B,YACqB,QAAyB,EACnC,QAAuC,EAC7B,KAAiB,EACjB,kBAAgD,EAChD,OAAoC,IAAI,GAAG,EAAE;QAJ7C,aAAQ,GAAR,QAAQ,CAAiB;QACnC,aAAQ,GAAR,QAAQ,CAA+B;QAC7B,UAAK,GAAL,KAAK,CAAY;QACjB,uBAAkB,GAAlB,kBAAkB,CAA8B;QAChD,SAAI,GAAJ,IAAI,CAAyC;QAEhE,IAAI,CAAC,KAAK,GAAI,QAAQ,CAAC,WAAmB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,GAAG,CAAI,KAAe;QACpB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAM,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,MAAuB;QAC7B,MAAM,WAAW,CAAC,OAAO,CAAE,IAAI,CAAC,QAAQ,CAAC,YAAiC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,CAAC,KAAY;QACf,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAES,KAAK,CAAC,OAAe;QAC7B,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAES,IAAI;QACZ,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAES,OAAO;QACf,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;CAEF;AAzCD,4BAyCC","sourcesContent":["import {Token, Type} from './base.interface';\nimport {FlowMetadata, FlowName} from '../metadata';\nimport {z} from 'zod';\nimport {HookEntry, ScopeEntry} from '../entries';\nimport {FlowState, FlowStateOf} from './internal/flow.utils';\nimport {FrontMcpLogger} from \"./logger.interface\";\n\nexport type FlowInputOf<N extends FlowName> = z.infer<ExtendFlows[N]['input']>;\nexport type FlowOutputOf<N extends FlowName> = z.infer<ExtendFlows[N]['output']>;\nexport type FlowPlanOf<N extends FlowName> = ExtendFlows[N]['plan'];\nexport type FlowCtxOf<N extends FlowName> = ExtendFlows[N]['ctx'];\nexport type FlowStagesOf<N extends FlowName> = ExtendFlows[N]['stage'];\nexport type FlowExecuteStagesOf<N extends FlowName> = ExtendFlows[N]['executeStage'];\n\n\nexport type FlowControlType = 'respond' | 'fail' | 'abort' | 'next' | 'handled';\n\nexport class FlowControl extends Error {\n constructor(public readonly type: FlowControlType, public readonly output: any) {\n super();\n }\n\n static respond<T>(output: T): never {\n throw new FlowControl('respond', output);\n }\n\n static next(): never {\n throw new FlowControl('next', null);\n }\n\n static handled(): never {\n throw new FlowControl('handled', null);\n }\n\n static fail(error: Error): never {\n throw new FlowControl('fail', {error: error.message});\n }\n\n static abort(reason: string): never {\n throw new FlowControl('abort', reason);\n }\n\n}\n\n\n// 1) The actual abstract class (value)\nexport abstract class FlowBase<N extends FlowName = FlowName> {\n protected input: FlowInputOf<N>;\n state: FlowStateOf<N> = FlowState.create({});\n scopeLogger: FrontMcpLogger;\n\n constructor(\n protected readonly metadata: FlowMetadata<N>,\n readonly rawInput: Partial<FlowInputOf<N>> | any,\n protected readonly scope: ScopeEntry,\n protected readonly appendContextHooks: (hooks: HookEntry[]) => void,\n protected readonly deps: ReadonlyMap<Token, unknown> = new Map(),\n ) {\n this.input = (metadata.inputSchema as any)?.parse?.(rawInput);\n this.scopeLogger = scope.logger;\n }\n\n get<T>(token: Token<T>): T {\n if (this.deps.has(token)) return this.deps.get(token) as T;\n return this.scope.providers.get(token);\n }\n\n respond(output: FlowOutputOf<N>) {\n throw FlowControl.respond((this.metadata.outputSchema as z.ZodObject<any>).parse(output));\n }\n\n fail(error: Error) {\n throw FlowControl.fail(error);\n }\n\n protected abort(message: string) {\n throw FlowControl.abort(message);\n }\n\n protected next() {\n throw FlowControl.next();\n }\n\n protected handled() {\n throw FlowControl.handled();\n }\n\n}\n\nexport type FlowType<Provide = FlowBase> =\n | Type<Provide>\n\n"]}
@@ -0,0 +1,3 @@
1
+ import { Type } from './base.interface';
2
+ export type HookBase<In, Ctx> = (input: In, ctx?: Ctx) => Promise<void>;
3
+ export type HookType = Type<HookBase<any, any>>;
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=flow-hooks.metadata.js.map
3
+ //# sourceMappingURL=hook.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.interface.js","sourceRoot":"","sources":["../../../src/interfaces/hook.interface.ts"],"names":[],"mappings":"","sourcesContent":["import {Type} from './base.interface';\n\nexport type HookBase<In, Ctx> = (input: In, ctx?: Ctx) => Promise<void>;\n\nexport type HookType = Type<HookBase<any, any>>\n\n"]}
@@ -3,6 +3,7 @@ export * from './front-mcp.interface';
3
3
  export * from './server.interface';
4
4
  export * from './scope.interface';
5
5
  export * from './flow.interface';
6
+ export * from './hook.interface';
6
7
  export * from './app.interface';
7
8
  export * from './provider.interface';
8
9
  export * from './auth-provider.interface';
@@ -6,6 +6,7 @@ tslib_1.__exportStar(require("./front-mcp.interface"), exports);
6
6
  tslib_1.__exportStar(require("./server.interface"), exports);
7
7
  tslib_1.__exportStar(require("./scope.interface"), exports);
8
8
  tslib_1.__exportStar(require("./flow.interface"), exports);
9
+ tslib_1.__exportStar(require("./hook.interface"), exports);
9
10
  tslib_1.__exportStar(require("./app.interface"), exports);
10
11
  tslib_1.__exportStar(require("./provider.interface"), exports);
11
12
  tslib_1.__exportStar(require("./auth-provider.interface"), exports);