@animalabs/agent-framework 0.1.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 (212) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -0
  3. package/dist/src/agent.d.ts +130 -0
  4. package/dist/src/agent.d.ts.map +1 -0
  5. package/dist/src/agent.js +406 -0
  6. package/dist/src/agent.js.map +1 -0
  7. package/dist/src/api/mcp-server.d.ts +37 -0
  8. package/dist/src/api/mcp-server.d.ts.map +1 -0
  9. package/dist/src/api/mcp-server.js +598 -0
  10. package/dist/src/api/mcp-server.js.map +1 -0
  11. package/dist/src/api/server.d.ts +83 -0
  12. package/dist/src/api/server.d.ts.map +1 -0
  13. package/dist/src/api/server.js +785 -0
  14. package/dist/src/api/server.js.map +1 -0
  15. package/dist/src/api/types.d.ts +395 -0
  16. package/dist/src/api/types.d.ts.map +1 -0
  17. package/dist/src/api/types.js +5 -0
  18. package/dist/src/api/types.js.map +1 -0
  19. package/dist/src/framework.d.ts +309 -0
  20. package/dist/src/framework.d.ts.map +1 -0
  21. package/dist/src/framework.js +2309 -0
  22. package/dist/src/framework.js.map +1 -0
  23. package/dist/src/gate/event-gate.d.ts +75 -0
  24. package/dist/src/gate/event-gate.d.ts.map +1 -0
  25. package/dist/src/gate/event-gate.js +503 -0
  26. package/dist/src/gate/event-gate.js.map +1 -0
  27. package/dist/src/gate/index.d.ts +3 -0
  28. package/dist/src/gate/index.d.ts.map +1 -0
  29. package/dist/src/gate/index.js +2 -0
  30. package/dist/src/gate/index.js.map +1 -0
  31. package/dist/src/gate/types.d.ts +82 -0
  32. package/dist/src/gate/types.d.ts.map +1 -0
  33. package/dist/src/gate/types.js +9 -0
  34. package/dist/src/gate/types.js.map +1 -0
  35. package/dist/src/index.d.ts +17 -0
  36. package/dist/src/index.d.ts.map +1 -0
  37. package/dist/src/index.js +18 -0
  38. package/dist/src/index.js.map +1 -0
  39. package/dist/src/mcpl/channel-registry.d.ts +141 -0
  40. package/dist/src/mcpl/channel-registry.d.ts.map +1 -0
  41. package/dist/src/mcpl/channel-registry.js +647 -0
  42. package/dist/src/mcpl/channel-registry.js.map +1 -0
  43. package/dist/src/mcpl/checkpoint-manager.d.ts +79 -0
  44. package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -0
  45. package/dist/src/mcpl/checkpoint-manager.js +430 -0
  46. package/dist/src/mcpl/checkpoint-manager.js.map +1 -0
  47. package/dist/src/mcpl/errors.d.ts +52 -0
  48. package/dist/src/mcpl/errors.d.ts.map +1 -0
  49. package/dist/src/mcpl/errors.js +93 -0
  50. package/dist/src/mcpl/errors.js.map +1 -0
  51. package/dist/src/mcpl/feature-set-manager.d.ts +91 -0
  52. package/dist/src/mcpl/feature-set-manager.d.ts.map +1 -0
  53. package/dist/src/mcpl/feature-set-manager.js +250 -0
  54. package/dist/src/mcpl/feature-set-manager.js.map +1 -0
  55. package/dist/src/mcpl/hook-orchestrator.d.ts +51 -0
  56. package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -0
  57. package/dist/src/mcpl/hook-orchestrator.js +217 -0
  58. package/dist/src/mcpl/hook-orchestrator.js.map +1 -0
  59. package/dist/src/mcpl/index.d.ts +14 -0
  60. package/dist/src/mcpl/index.d.ts.map +1 -0
  61. package/dist/src/mcpl/index.js +21 -0
  62. package/dist/src/mcpl/index.js.map +1 -0
  63. package/dist/src/mcpl/inference-router.d.ts +67 -0
  64. package/dist/src/mcpl/inference-router.d.ts.map +1 -0
  65. package/dist/src/mcpl/inference-router.js +249 -0
  66. package/dist/src/mcpl/inference-router.js.map +1 -0
  67. package/dist/src/mcpl/push-handler.d.ts +60 -0
  68. package/dist/src/mcpl/push-handler.d.ts.map +1 -0
  69. package/dist/src/mcpl/push-handler.js +162 -0
  70. package/dist/src/mcpl/push-handler.js.map +1 -0
  71. package/dist/src/mcpl/scope-manager.d.ts +76 -0
  72. package/dist/src/mcpl/scope-manager.d.ts.map +1 -0
  73. package/dist/src/mcpl/scope-manager.js +213 -0
  74. package/dist/src/mcpl/scope-manager.js.map +1 -0
  75. package/dist/src/mcpl/server-connection.d.ts +174 -0
  76. package/dist/src/mcpl/server-connection.d.ts.map +1 -0
  77. package/dist/src/mcpl/server-connection.js +559 -0
  78. package/dist/src/mcpl/server-connection.js.map +1 -0
  79. package/dist/src/mcpl/server-registry.d.ts +63 -0
  80. package/dist/src/mcpl/server-registry.d.ts.map +1 -0
  81. package/dist/src/mcpl/server-registry.js +119 -0
  82. package/dist/src/mcpl/server-registry.js.map +1 -0
  83. package/dist/src/mcpl/types.d.ts +755 -0
  84. package/dist/src/mcpl/types.d.ts.map +1 -0
  85. package/dist/src/mcpl/types.js +48 -0
  86. package/dist/src/mcpl/types.js.map +1 -0
  87. package/dist/src/module-registry.d.ts +93 -0
  88. package/dist/src/module-registry.d.ts.map +1 -0
  89. package/dist/src/module-registry.js +386 -0
  90. package/dist/src/module-registry.js.map +1 -0
  91. package/dist/src/modules/api/index.d.ts +22 -0
  92. package/dist/src/modules/api/index.d.ts.map +1 -0
  93. package/dist/src/modules/api/index.js +63 -0
  94. package/dist/src/modules/api/index.js.map +1 -0
  95. package/dist/src/modules/discord/discord-js-client.d.ts +58 -0
  96. package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -0
  97. package/dist/src/modules/discord/discord-js-client.js +273 -0
  98. package/dist/src/modules/discord/discord-js-client.js.map +1 -0
  99. package/dist/src/modules/discord/index.d.ts +82 -0
  100. package/dist/src/modules/discord/index.d.ts.map +1 -0
  101. package/dist/src/modules/discord/index.js +959 -0
  102. package/dist/src/modules/discord/index.js.map +1 -0
  103. package/dist/src/modules/discord/types.d.ts +327 -0
  104. package/dist/src/modules/discord/types.d.ts.map +1 -0
  105. package/dist/src/modules/discord/types.js +5 -0
  106. package/dist/src/modules/discord/types.js.map +1 -0
  107. package/dist/src/modules/index.d.ts +11 -0
  108. package/dist/src/modules/index.d.ts.map +1 -0
  109. package/dist/src/modules/index.js +7 -0
  110. package/dist/src/modules/index.js.map +1 -0
  111. package/dist/src/modules/workspace/index.d.ts +59 -0
  112. package/dist/src/modules/workspace/index.d.ts.map +1 -0
  113. package/dist/src/modules/workspace/index.js +831 -0
  114. package/dist/src/modules/workspace/index.js.map +1 -0
  115. package/dist/src/modules/workspace/sync.d.ts +48 -0
  116. package/dist/src/modules/workspace/sync.d.ts.map +1 -0
  117. package/dist/src/modules/workspace/sync.js +253 -0
  118. package/dist/src/modules/workspace/sync.js.map +1 -0
  119. package/dist/src/modules/workspace/types.d.ts +166 -0
  120. package/dist/src/modules/workspace/types.d.ts.map +1 -0
  121. package/dist/src/modules/workspace/types.js +5 -0
  122. package/dist/src/modules/workspace/types.js.map +1 -0
  123. package/dist/src/modules/workspace/watcher.d.ts +43 -0
  124. package/dist/src/modules/workspace/watcher.d.ts.map +1 -0
  125. package/dist/src/modules/workspace/watcher.js +120 -0
  126. package/dist/src/modules/workspace/watcher.js.map +1 -0
  127. package/dist/src/queue.d.ts +50 -0
  128. package/dist/src/queue.d.ts.map +1 -0
  129. package/dist/src/queue.js +95 -0
  130. package/dist/src/queue.js.map +1 -0
  131. package/dist/src/safe-slice.d.ts +8 -0
  132. package/dist/src/safe-slice.d.ts.map +1 -0
  133. package/dist/src/safe-slice.js +18 -0
  134. package/dist/src/safe-slice.js.map +1 -0
  135. package/dist/src/types/agent.d.ts +118 -0
  136. package/dist/src/types/agent.d.ts.map +1 -0
  137. package/dist/src/types/agent.js +2 -0
  138. package/dist/src/types/agent.js.map +1 -0
  139. package/dist/src/types/events.d.ts +220 -0
  140. package/dist/src/types/events.d.ts.map +1 -0
  141. package/dist/src/types/events.js +2 -0
  142. package/dist/src/types/events.js.map +1 -0
  143. package/dist/src/types/framework.d.ts +184 -0
  144. package/dist/src/types/framework.d.ts.map +1 -0
  145. package/dist/src/types/framework.js +2 -0
  146. package/dist/src/types/framework.js.map +1 -0
  147. package/dist/src/types/index.d.ts +7 -0
  148. package/dist/src/types/index.d.ts.map +1 -0
  149. package/dist/src/types/index.js +7 -0
  150. package/dist/src/types/index.js.map +1 -0
  151. package/dist/src/types/inference-log.d.ts +64 -0
  152. package/dist/src/types/inference-log.d.ts.map +1 -0
  153. package/dist/src/types/inference-log.js +5 -0
  154. package/dist/src/types/inference-log.js.map +1 -0
  155. package/dist/src/types/module.d.ts +302 -0
  156. package/dist/src/types/module.d.ts.map +1 -0
  157. package/dist/src/types/module.js +2 -0
  158. package/dist/src/types/module.js.map +1 -0
  159. package/dist/src/types/trace.d.ts +173 -0
  160. package/dist/src/types/trace.d.ts.map +1 -0
  161. package/dist/src/types/trace.js +2 -0
  162. package/dist/src/types/trace.js.map +1 -0
  163. package/dist/test/event-gate.test.d.ts +2 -0
  164. package/dist/test/event-gate.test.d.ts.map +1 -0
  165. package/dist/test/event-gate.test.js +535 -0
  166. package/dist/test/event-gate.test.js.map +1 -0
  167. package/dist/test/framework.test.d.ts +5 -0
  168. package/dist/test/framework.test.d.ts.map +1 -0
  169. package/dist/test/framework.test.js +738 -0
  170. package/dist/test/framework.test.js.map +1 -0
  171. package/dist/tsconfig.tsbuildinfo +1 -0
  172. package/package.json +58 -0
  173. package/src/agent.ts +512 -0
  174. package/src/api/mcp-server.ts +687 -0
  175. package/src/api/server.ts +1023 -0
  176. package/src/api/types.ts +542 -0
  177. package/src/framework.ts +2784 -0
  178. package/src/gate/event-gate.ts +623 -0
  179. package/src/gate/index.ts +12 -0
  180. package/src/gate/types.ts +112 -0
  181. package/src/index.ts +63 -0
  182. package/src/mcpl/channel-registry.ts +824 -0
  183. package/src/mcpl/checkpoint-manager.ts +545 -0
  184. package/src/mcpl/errors.ts +114 -0
  185. package/src/mcpl/feature-set-manager.ts +333 -0
  186. package/src/mcpl/hook-orchestrator.ts +281 -0
  187. package/src/mcpl/index.ts +134 -0
  188. package/src/mcpl/inference-router.ts +335 -0
  189. package/src/mcpl/push-handler.ts +232 -0
  190. package/src/mcpl/scope-manager.ts +262 -0
  191. package/src/mcpl/server-connection.ts +694 -0
  192. package/src/mcpl/server-registry.ts +144 -0
  193. package/src/mcpl/types.ts +991 -0
  194. package/src/module-registry.ts +547 -0
  195. package/src/modules/api/index.ts +94 -0
  196. package/src/modules/discord/discord-js-client.ts +353 -0
  197. package/src/modules/discord/index.ts +1146 -0
  198. package/src/modules/discord/types.ts +465 -0
  199. package/src/modules/index.ts +43 -0
  200. package/src/modules/workspace/index.ts +969 -0
  201. package/src/modules/workspace/sync.ts +314 -0
  202. package/src/modules/workspace/types.ts +202 -0
  203. package/src/modules/workspace/watcher.ts +142 -0
  204. package/src/queue.ts +106 -0
  205. package/src/safe-slice.ts +18 -0
  206. package/src/types/agent.ts +119 -0
  207. package/src/types/events.ts +252 -0
  208. package/src/types/framework.ts +211 -0
  209. package/src/types/index.ts +6 -0
  210. package/src/types/inference-log.ts +64 -0
  211. package/src/types/module.ts +367 -0
  212. package/src/types/trace.ts +196 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * MCPL error codes and helpers.
3
+ *
4
+ * Error codes from Spec Appendix A. Used when rejecting inbound messages
5
+ * from MCPL servers that violate permission or state constraints.
6
+ */
7
+ // ============================================================================
8
+ // Error Codes (Spec Appendix A)
9
+ // ============================================================================
10
+ /** Message used a disabled feature set. */
11
+ export const FEATURE_SET_NOT_ENABLED = -32001;
12
+ /** Message used an undeclared feature set. */
13
+ export const UNKNOWN_FEATURE_SET = -32003;
14
+ /** Rollback targeted a pruned or unknown checkpoint. */
15
+ export const CHECKPOINT_NOT_FOUND = -32005;
16
+ /** Lacking scope to publish or observe channel. */
17
+ export const CHANNEL_NOT_PERMITTED = -32017;
18
+ /** Channel ID doesn't exist or not registered. */
19
+ export const UNKNOWN_CHANNEL = -32023;
20
+ /** Server could not open/connect the requested channel. */
21
+ export const CHANNEL_OPEN_FAILED = -32024;
22
+ // ============================================================================
23
+ // Error Factories
24
+ // ============================================================================
25
+ /**
26
+ * Create a "feature set not enabled" error.
27
+ * Returned when a server sends a message tagged with a feature set
28
+ * that the host has disabled.
29
+ */
30
+ export function featureSetNotEnabled(featureSet, canEnable = true) {
31
+ return {
32
+ code: FEATURE_SET_NOT_ENABLED,
33
+ message: 'Feature set not enabled',
34
+ data: { featureSet, canEnable },
35
+ };
36
+ }
37
+ /**
38
+ * Create an "unknown feature set" error.
39
+ * Returned when a server sends a message tagged with a feature set
40
+ * that was never declared in capabilities.
41
+ */
42
+ export function unknownFeatureSet(featureSet) {
43
+ return {
44
+ code: UNKNOWN_FEATURE_SET,
45
+ message: 'Unknown feature set',
46
+ data: { featureSet },
47
+ };
48
+ }
49
+ /**
50
+ * Create a "checkpoint not found" error.
51
+ * Returned when a rollback targets a pruned or unknown checkpoint.
52
+ */
53
+ export function checkpointNotFound(checkpoint) {
54
+ return {
55
+ code: CHECKPOINT_NOT_FOUND,
56
+ message: 'Checkpoint not found',
57
+ data: { checkpoint },
58
+ };
59
+ }
60
+ /**
61
+ * Create a "channel not permitted" error.
62
+ * Returned when a server lacks scope to publish or observe a channel.
63
+ */
64
+ export function channelNotPermitted(channelId) {
65
+ return {
66
+ code: CHANNEL_NOT_PERMITTED,
67
+ message: 'Channel not permitted',
68
+ data: { channelId },
69
+ };
70
+ }
71
+ /**
72
+ * Create an "unknown channel" error.
73
+ * Returned when a channel ID doesn't exist or isn't registered.
74
+ */
75
+ export function unknownChannel(channelId) {
76
+ return {
77
+ code: UNKNOWN_CHANNEL,
78
+ message: 'Unknown channel',
79
+ data: { channelId },
80
+ };
81
+ }
82
+ /**
83
+ * Create a "channel open failed" error.
84
+ * Returned when a server could not open/connect the requested channel.
85
+ */
86
+ export function channelOpenFailed(channelId, reason) {
87
+ return {
88
+ code: CHANNEL_OPEN_FAILED,
89
+ message: 'Channel open failed',
90
+ data: { channelId, reason },
91
+ };
92
+ }
93
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/mcpl/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E,2CAA2C;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAK,CAAC;AAE9C,8CAA8C;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAK,CAAC;AAE1C,wDAAwD;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,CAAC;AAE3C,mDAAmD;AACnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,CAAC;AAE5C,kDAAkD;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC;AAEtC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAK,CAAC;AAE1C,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,YAAqB,IAAI;IAEzB,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,yBAAyB;QAClC,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;KAChC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,qBAAqB;QAC9B,IAAI,EAAE,EAAE,UAAU,EAAE;KACrB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,sBAAsB;QAC/B,IAAI,EAAE,EAAE,UAAU,EAAE;KACrB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,uBAAuB;QAChC,IAAI,EAAE,EAAE,SAAS,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,iBAAiB;QAC1B,IAAI,EAAE,EAAE,SAAS,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,MAAe;IAEf,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,qBAAqB;QAC9B,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * FeatureSetManager — Permission gate for MCPL feature sets.
3
+ *
4
+ * Manages per-server feature set state: which feature sets each server declares,
5
+ * which are enabled/disabled, and validates inbound messages against that state.
6
+ *
7
+ * Spec references: Section 6 (Feature Sets), Appendix A (Error Codes).
8
+ */
9
+ import type { McplCapabilities, FeatureSetDeclaration, FeatureSetsUpdateParams, FeatureSetsChangedParams } from './types.js';
10
+ /**
11
+ * Error thrown when a feature set validation fails.
12
+ * Carries the JSON-RPC error code and the offending feature set name.
13
+ */
14
+ export declare class McplFeatureSetError extends Error {
15
+ readonly code: number;
16
+ readonly featureSet: string;
17
+ constructor(code: number, featureSet: string, message: string);
18
+ }
19
+ /**
20
+ * Manages feature set state across all MCPL servers.
21
+ *
22
+ * This is the permission gate that all MCPL interactions pass through.
23
+ * Every inbound server message tagged with a `featureSet` must be validated
24
+ * through this manager before processing.
25
+ */
26
+ export declare class FeatureSetManager {
27
+ /** Per-server state, keyed by server ID. */
28
+ private servers;
29
+ /**
30
+ * Initialize a server's feature set state from its capabilities and host config.
31
+ *
32
+ * Called after a server connects and advertises its capabilities.
33
+ * Returns the `FeatureSetsUpdateParams` that should be sent to the server
34
+ * via `featureSets/update`.
35
+ *
36
+ * Initialization logic:
37
+ * 1. Store all declared feature sets from capabilities.
38
+ * 2. If `config.enabledFeatureSets` is provided, enable matching sets (supports wildcards).
39
+ * 3. If `config.disabledFeatureSets` is provided, disable matching sets (supports wildcards).
40
+ * 4. Feature sets not mentioned in either list default to disabled.
41
+ */
42
+ initializeServer(serverId: string, capabilities: McplCapabilities, config?: {
43
+ enabledFeatureSets?: string[];
44
+ disabledFeatureSets?: string[];
45
+ }): FeatureSetsUpdateParams;
46
+ /**
47
+ * Remove all tracking state for a server.
48
+ * Called when a server disconnects.
49
+ */
50
+ removeServer(serverId: string): void;
51
+ /**
52
+ * Check whether a feature set is enabled for a server.
53
+ * Returns false if the server is unknown or the feature set is not enabled.
54
+ */
55
+ isEnabled(serverId: string, featureSet: string): boolean;
56
+ /**
57
+ * Validate that an inbound message's feature set is declared and enabled.
58
+ *
59
+ * @throws McplFeatureSetError with code -32003 if the feature set is unknown
60
+ * @throws McplFeatureSetError with code -32001 if the feature set is not enabled
61
+ */
62
+ validateInbound(serverId: string, featureSet: string): void;
63
+ /**
64
+ * Enable feature sets for a server (supports wildcard patterns).
65
+ * Only declared feature sets can be enabled.
66
+ */
67
+ enable(serverId: string, featureSets: string[]): void;
68
+ /**
69
+ * Disable feature sets for a server (supports wildcard patterns).
70
+ * Only declared feature sets can be disabled.
71
+ */
72
+ disable(serverId: string, featureSets: string[]): void;
73
+ /**
74
+ * Handle a `featureSets/changed` notification from a server.
75
+ *
76
+ * - Adds new feature sets from `params.added` (default to disabled).
77
+ * - Removes feature sets listed in `params.removed`.
78
+ */
79
+ handleFeatureSetsChanged(serverId: string, params: FeatureSetsChangedParams): void;
80
+ /**
81
+ * Get all declared feature sets for a server.
82
+ * Returns null if the server is unknown.
83
+ */
84
+ getDeclaredFeatureSets(serverId: string): Record<string, FeatureSetDeclaration> | null;
85
+ /**
86
+ * Get the names of all enabled feature sets for a server.
87
+ * Returns an empty array if the server is unknown.
88
+ */
89
+ getEnabledFeatureSets(serverId: string): string[];
90
+ }
91
+ //# sourceMappingURL=feature-set-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-set-manager.d.ts","sourceRoot":"","sources":["../../../src/mcpl/feature-set-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAWpB;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,IAAI,EAAE,MAAM;aACZ,UAAU,EAAE,MAAM;gBADlB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClC,OAAO,EAAE,MAAM;CAKlB;AAgFD;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,4CAA4C;IAC5C,OAAO,CAAC,OAAO,CAAkC;IAEjD;;;;;;;;;;;;OAYG;IACH,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,gBAAgB,EAC9B,MAAM,CAAC,EAAE;QAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GACzE,uBAAuB;IA2C1B;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIpC;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAQxD;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IA4B3D;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;IAYrD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;IAYtD;;;;;OAKG;IACH,wBAAwB,CACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,wBAAwB,GAC/B,IAAI;IAuBP;;;OAGG;IACH,sBAAsB,CACpB,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAAG,IAAI;IAQ/C;;;OAGG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;CAOlD"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * FeatureSetManager — Permission gate for MCPL feature sets.
3
+ *
4
+ * Manages per-server feature set state: which feature sets each server declares,
5
+ * which are enabled/disabled, and validates inbound messages against that state.
6
+ *
7
+ * Spec references: Section 6 (Feature Sets), Appendix A (Error Codes).
8
+ */
9
+ import { FEATURE_SET_NOT_ENABLED, UNKNOWN_FEATURE_SET, } from './errors.js';
10
+ // ============================================================================
11
+ // Error Class
12
+ // ============================================================================
13
+ /**
14
+ * Error thrown when a feature set validation fails.
15
+ * Carries the JSON-RPC error code and the offending feature set name.
16
+ */
17
+ export class McplFeatureSetError extends Error {
18
+ code;
19
+ featureSet;
20
+ constructor(code, featureSet, message) {
21
+ super(message);
22
+ this.code = code;
23
+ this.featureSet = featureSet;
24
+ this.name = 'McplFeatureSetError';
25
+ }
26
+ }
27
+ // ============================================================================
28
+ // Wildcard Matching
29
+ // ============================================================================
30
+ /**
31
+ * Check whether a wildcard pattern matches a feature set name.
32
+ *
33
+ * Rules:
34
+ * - Split both pattern and name on `.`
35
+ * - `*` in a pattern segment matches exactly one segment (any value)
36
+ * - Literal segments must match exactly
37
+ * - Pattern and name must have the same number of segments
38
+ * (unless the last pattern segment is `*`, which matches one segment)
39
+ *
40
+ * Examples:
41
+ * `memory.*` matches `memory.retrieval` but not `memory.a.b`
42
+ * `memory.retrieval` matches only `memory.retrieval`
43
+ */
44
+ function wildcardMatch(pattern, name) {
45
+ const patternParts = pattern.split('.');
46
+ const nameParts = name.split('.');
47
+ if (patternParts.length !== nameParts.length) {
48
+ return false;
49
+ }
50
+ for (let i = 0; i < patternParts.length; i++) {
51
+ const p = patternParts[i];
52
+ if (p === '*') {
53
+ // Wildcard segment matches any single segment
54
+ continue;
55
+ }
56
+ if (p !== nameParts[i]) {
57
+ return false;
58
+ }
59
+ }
60
+ return true;
61
+ }
62
+ /**
63
+ * Find all declared feature set names that match any of the given patterns.
64
+ * Patterns may contain wildcards (e.g., `memory.*`).
65
+ */
66
+ function resolvePatterns(patterns, declared) {
67
+ const matched = new Set();
68
+ const declaredNames = Object.keys(declared);
69
+ for (const pattern of patterns) {
70
+ for (const name of declaredNames) {
71
+ if (wildcardMatch(pattern, name)) {
72
+ matched.add(name);
73
+ }
74
+ }
75
+ }
76
+ return [...matched];
77
+ }
78
+ // ============================================================================
79
+ // FeatureSetManager
80
+ // ============================================================================
81
+ /**
82
+ * Manages feature set state across all MCPL servers.
83
+ *
84
+ * This is the permission gate that all MCPL interactions pass through.
85
+ * Every inbound server message tagged with a `featureSet` must be validated
86
+ * through this manager before processing.
87
+ */
88
+ export class FeatureSetManager {
89
+ /** Per-server state, keyed by server ID. */
90
+ servers = new Map();
91
+ /**
92
+ * Initialize a server's feature set state from its capabilities and host config.
93
+ *
94
+ * Called after a server connects and advertises its capabilities.
95
+ * Returns the `FeatureSetsUpdateParams` that should be sent to the server
96
+ * via `featureSets/update`.
97
+ *
98
+ * Initialization logic:
99
+ * 1. Store all declared feature sets from capabilities.
100
+ * 2. If `config.enabledFeatureSets` is provided, enable matching sets (supports wildcards).
101
+ * 3. If `config.disabledFeatureSets` is provided, disable matching sets (supports wildcards).
102
+ * 4. Feature sets not mentioned in either list default to disabled.
103
+ */
104
+ initializeServer(serverId, capabilities, config) {
105
+ const declared = capabilities.featureSets ?? {};
106
+ const state = {
107
+ declared: { ...declared },
108
+ enabled: new Set(),
109
+ };
110
+ // Resolve which feature sets to enable
111
+ const enablePatterns = config?.enabledFeatureSets ?? [];
112
+ const disablePatterns = config?.disabledFeatureSets ?? [];
113
+ const toEnable = resolvePatterns(enablePatterns, declared);
114
+ const toDisable = resolvePatterns(disablePatterns, declared);
115
+ // Enable matching sets
116
+ for (const name of toEnable) {
117
+ state.enabled.add(name);
118
+ }
119
+ // Disable explicitly overrides enable (disable wins on conflict)
120
+ for (const name of toDisable) {
121
+ state.enabled.delete(name);
122
+ }
123
+ this.servers.set(serverId, state);
124
+ // Build the update params to send to the server
125
+ const enabled = [...state.enabled];
126
+ const allDeclared = Object.keys(declared);
127
+ const disabled = allDeclared.filter((n) => !state.enabled.has(n));
128
+ const params = {};
129
+ if (enabled.length > 0) {
130
+ params.enabled = enabled;
131
+ }
132
+ if (disabled.length > 0) {
133
+ params.disabled = disabled;
134
+ }
135
+ return params;
136
+ }
137
+ /**
138
+ * Remove all tracking state for a server.
139
+ * Called when a server disconnects.
140
+ */
141
+ removeServer(serverId) {
142
+ this.servers.delete(serverId);
143
+ }
144
+ /**
145
+ * Check whether a feature set is enabled for a server.
146
+ * Returns false if the server is unknown or the feature set is not enabled.
147
+ */
148
+ isEnabled(serverId, featureSet) {
149
+ const state = this.servers.get(serverId);
150
+ if (!state) {
151
+ return false;
152
+ }
153
+ return state.enabled.has(featureSet);
154
+ }
155
+ /**
156
+ * Validate that an inbound message's feature set is declared and enabled.
157
+ *
158
+ * @throws McplFeatureSetError with code -32003 if the feature set is unknown
159
+ * @throws McplFeatureSetError with code -32001 if the feature set is not enabled
160
+ */
161
+ validateInbound(serverId, featureSet) {
162
+ const state = this.servers.get(serverId);
163
+ if (!state) {
164
+ throw new McplFeatureSetError(UNKNOWN_FEATURE_SET, featureSet, `Unknown server: ${serverId}`);
165
+ }
166
+ if (!(featureSet in state.declared)) {
167
+ throw new McplFeatureSetError(UNKNOWN_FEATURE_SET, featureSet, `Unknown feature set: ${featureSet}`);
168
+ }
169
+ if (!state.enabled.has(featureSet)) {
170
+ throw new McplFeatureSetError(FEATURE_SET_NOT_ENABLED, featureSet, `Feature set not enabled: ${featureSet}`);
171
+ }
172
+ }
173
+ /**
174
+ * Enable feature sets for a server (supports wildcard patterns).
175
+ * Only declared feature sets can be enabled.
176
+ */
177
+ enable(serverId, featureSets) {
178
+ const state = this.servers.get(serverId);
179
+ if (!state) {
180
+ return;
181
+ }
182
+ const resolved = resolvePatterns(featureSets, state.declared);
183
+ for (const name of resolved) {
184
+ state.enabled.add(name);
185
+ }
186
+ }
187
+ /**
188
+ * Disable feature sets for a server (supports wildcard patterns).
189
+ * Only declared feature sets can be disabled.
190
+ */
191
+ disable(serverId, featureSets) {
192
+ const state = this.servers.get(serverId);
193
+ if (!state) {
194
+ return;
195
+ }
196
+ const resolved = resolvePatterns(featureSets, state.declared);
197
+ for (const name of resolved) {
198
+ state.enabled.delete(name);
199
+ }
200
+ }
201
+ /**
202
+ * Handle a `featureSets/changed` notification from a server.
203
+ *
204
+ * - Adds new feature sets from `params.added` (default to disabled).
205
+ * - Removes feature sets listed in `params.removed`.
206
+ */
207
+ handleFeatureSetsChanged(serverId, params) {
208
+ const state = this.servers.get(serverId);
209
+ if (!state) {
210
+ return;
211
+ }
212
+ // Add new feature sets (default to disabled)
213
+ if (params.added) {
214
+ for (const [name, declaration] of Object.entries(params.added)) {
215
+ state.declared[name] = declaration;
216
+ // New feature sets default to disabled — do not add to enabled set
217
+ }
218
+ }
219
+ // Remove feature sets
220
+ if (params.removed) {
221
+ for (const name of params.removed) {
222
+ delete state.declared[name];
223
+ state.enabled.delete(name);
224
+ }
225
+ }
226
+ }
227
+ /**
228
+ * Get all declared feature sets for a server.
229
+ * Returns null if the server is unknown.
230
+ */
231
+ getDeclaredFeatureSets(serverId) {
232
+ const state = this.servers.get(serverId);
233
+ if (!state) {
234
+ return null;
235
+ }
236
+ return { ...state.declared };
237
+ }
238
+ /**
239
+ * Get the names of all enabled feature sets for a server.
240
+ * Returns an empty array if the server is unknown.
241
+ */
242
+ getEnabledFeatureSets(serverId) {
243
+ const state = this.servers.get(serverId);
244
+ if (!state) {
245
+ return [];
246
+ }
247
+ return [...state.enabled];
248
+ }
249
+ }
250
+ //# sourceMappingURL=feature-set-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-set-manager.js","sourceRoot":"","sources":["../../../src/mcpl/feature-set-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * HookOrchestrator — manages before/after inference fan-out to MCPL servers.
3
+ *
4
+ * This is the bridge between the MCPL protocol and the agent-framework inference
5
+ * pipeline. It collects ContextInjection[] from MCPL servers via beforeInference
6
+ * and feeds them into context-manager's compile(). After inference, it notifies
7
+ * servers of the result via afterInference.
8
+ *
9
+ * Design principles:
10
+ * - Fail-open: timeouts and errors never block inference
11
+ * - Parallel fan-out with per-server timeouts
12
+ * - Loop prevention: rejects inference/request while inside a hook
13
+ */
14
+ import type { ContextInjection } from '@animalabs/context-manager';
15
+ import type { BeforeInferenceParams, AfterInferenceParams, AfterInferenceResult } from './types.js';
16
+ import type { McplServerRegistry } from './server-registry.js';
17
+ import type { FeatureSetManager } from './feature-set-manager.js';
18
+ export declare class HookOrchestrator {
19
+ private registry;
20
+ private featureSetManager;
21
+ private _isInHook;
22
+ constructor(registry: McplServerRegistry, featureSetManager: FeatureSetManager);
23
+ /**
24
+ * Whether a hook is currently executing.
25
+ * Used for loop prevention: inference/request from servers should be rejected
26
+ * while this is true (enforced by Step 6's InferenceRouter).
27
+ */
28
+ get isInHook(): boolean;
29
+ /**
30
+ * Fan out `context/beforeInference` to all capable MCPL servers in parallel.
31
+ *
32
+ * Returns aggregated ContextInjection[] ready for context-manager's compile().
33
+ * Fail-open: servers that time out or error are silently skipped.
34
+ */
35
+ beforeInference(params: BeforeInferenceParams): Promise<ContextInjection[]>;
36
+ /**
37
+ * Fan out `context/afterInference` to all capable MCPL servers.
38
+ *
39
+ * Non-blocking servers receive a notification (fire-and-forget).
40
+ * Blocking servers receive a request with a 10s timeout.
41
+ * Returns the first valid AfterInferenceResult from a blocking server, or null.
42
+ */
43
+ afterInference(params: AfterInferenceParams): Promise<AfterInferenceResult | null>;
44
+ private fanOutBeforeInference;
45
+ private fanOutAfterInference;
46
+ /**
47
+ * Check if a server's afterInference capability is blocking.
48
+ */
49
+ private isBlockingAfterInference;
50
+ }
51
+ //# sourceMappingURL=hook-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-orchestrator.d.ts","sourceRoot":"","sources":["../../../src/mcpl/hook-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAGV,qBAAqB,EAErB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AA0FlE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,SAAS,CAAS;gBAEd,QAAQ,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB;IAK9E;;;;OAIG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;;;OAKG;IACG,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAcjF;;;;;;OAMG;IACG,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAkB1E,qBAAqB;YA+CrB,oBAAoB;IAyClC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAQjC"}