@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.
- package/LICENSE +21 -0
- package/README.md +233 -0
- package/dist/src/agent.d.ts +130 -0
- package/dist/src/agent.d.ts.map +1 -0
- package/dist/src/agent.js +406 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/api/mcp-server.d.ts +37 -0
- package/dist/src/api/mcp-server.d.ts.map +1 -0
- package/dist/src/api/mcp-server.js +598 -0
- package/dist/src/api/mcp-server.js.map +1 -0
- package/dist/src/api/server.d.ts +83 -0
- package/dist/src/api/server.d.ts.map +1 -0
- package/dist/src/api/server.js +785 -0
- package/dist/src/api/server.js.map +1 -0
- package/dist/src/api/types.d.ts +395 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +5 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/framework.d.ts +309 -0
- package/dist/src/framework.d.ts.map +1 -0
- package/dist/src/framework.js +2309 -0
- package/dist/src/framework.js.map +1 -0
- package/dist/src/gate/event-gate.d.ts +75 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -0
- package/dist/src/gate/event-gate.js +503 -0
- package/dist/src/gate/event-gate.js.map +1 -0
- package/dist/src/gate/index.d.ts +3 -0
- package/dist/src/gate/index.d.ts.map +1 -0
- package/dist/src/gate/index.js +2 -0
- package/dist/src/gate/index.js.map +1 -0
- package/dist/src/gate/types.d.ts +82 -0
- package/dist/src/gate/types.d.ts.map +1 -0
- package/dist/src/gate/types.js +9 -0
- package/dist/src/gate/types.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +18 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcpl/channel-registry.d.ts +141 -0
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -0
- package/dist/src/mcpl/channel-registry.js +647 -0
- package/dist/src/mcpl/channel-registry.js.map +1 -0
- package/dist/src/mcpl/checkpoint-manager.d.ts +79 -0
- package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -0
- package/dist/src/mcpl/checkpoint-manager.js +430 -0
- package/dist/src/mcpl/checkpoint-manager.js.map +1 -0
- package/dist/src/mcpl/errors.d.ts +52 -0
- package/dist/src/mcpl/errors.d.ts.map +1 -0
- package/dist/src/mcpl/errors.js +93 -0
- package/dist/src/mcpl/errors.js.map +1 -0
- package/dist/src/mcpl/feature-set-manager.d.ts +91 -0
- package/dist/src/mcpl/feature-set-manager.d.ts.map +1 -0
- package/dist/src/mcpl/feature-set-manager.js +250 -0
- package/dist/src/mcpl/feature-set-manager.js.map +1 -0
- package/dist/src/mcpl/hook-orchestrator.d.ts +51 -0
- package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -0
- package/dist/src/mcpl/hook-orchestrator.js +217 -0
- package/dist/src/mcpl/hook-orchestrator.js.map +1 -0
- package/dist/src/mcpl/index.d.ts +14 -0
- package/dist/src/mcpl/index.d.ts.map +1 -0
- package/dist/src/mcpl/index.js +21 -0
- package/dist/src/mcpl/index.js.map +1 -0
- package/dist/src/mcpl/inference-router.d.ts +67 -0
- package/dist/src/mcpl/inference-router.d.ts.map +1 -0
- package/dist/src/mcpl/inference-router.js +249 -0
- package/dist/src/mcpl/inference-router.js.map +1 -0
- package/dist/src/mcpl/push-handler.d.ts +60 -0
- package/dist/src/mcpl/push-handler.d.ts.map +1 -0
- package/dist/src/mcpl/push-handler.js +162 -0
- package/dist/src/mcpl/push-handler.js.map +1 -0
- package/dist/src/mcpl/scope-manager.d.ts +76 -0
- package/dist/src/mcpl/scope-manager.d.ts.map +1 -0
- package/dist/src/mcpl/scope-manager.js +213 -0
- package/dist/src/mcpl/scope-manager.js.map +1 -0
- package/dist/src/mcpl/server-connection.d.ts +174 -0
- package/dist/src/mcpl/server-connection.d.ts.map +1 -0
- package/dist/src/mcpl/server-connection.js +559 -0
- package/dist/src/mcpl/server-connection.js.map +1 -0
- package/dist/src/mcpl/server-registry.d.ts +63 -0
- package/dist/src/mcpl/server-registry.d.ts.map +1 -0
- package/dist/src/mcpl/server-registry.js +119 -0
- package/dist/src/mcpl/server-registry.js.map +1 -0
- package/dist/src/mcpl/types.d.ts +755 -0
- package/dist/src/mcpl/types.d.ts.map +1 -0
- package/dist/src/mcpl/types.js +48 -0
- package/dist/src/mcpl/types.js.map +1 -0
- package/dist/src/module-registry.d.ts +93 -0
- package/dist/src/module-registry.d.ts.map +1 -0
- package/dist/src/module-registry.js +386 -0
- package/dist/src/module-registry.js.map +1 -0
- package/dist/src/modules/api/index.d.ts +22 -0
- package/dist/src/modules/api/index.d.ts.map +1 -0
- package/dist/src/modules/api/index.js +63 -0
- package/dist/src/modules/api/index.js.map +1 -0
- package/dist/src/modules/discord/discord-js-client.d.ts +58 -0
- package/dist/src/modules/discord/discord-js-client.d.ts.map +1 -0
- package/dist/src/modules/discord/discord-js-client.js +273 -0
- package/dist/src/modules/discord/discord-js-client.js.map +1 -0
- package/dist/src/modules/discord/index.d.ts +82 -0
- package/dist/src/modules/discord/index.d.ts.map +1 -0
- package/dist/src/modules/discord/index.js +959 -0
- package/dist/src/modules/discord/index.js.map +1 -0
- package/dist/src/modules/discord/types.d.ts +327 -0
- package/dist/src/modules/discord/types.d.ts.map +1 -0
- package/dist/src/modules/discord/types.js +5 -0
- package/dist/src/modules/discord/types.js.map +1 -0
- package/dist/src/modules/index.d.ts +11 -0
- package/dist/src/modules/index.d.ts.map +1 -0
- package/dist/src/modules/index.js +7 -0
- package/dist/src/modules/index.js.map +1 -0
- package/dist/src/modules/workspace/index.d.ts +59 -0
- package/dist/src/modules/workspace/index.d.ts.map +1 -0
- package/dist/src/modules/workspace/index.js +831 -0
- package/dist/src/modules/workspace/index.js.map +1 -0
- package/dist/src/modules/workspace/sync.d.ts +48 -0
- package/dist/src/modules/workspace/sync.d.ts.map +1 -0
- package/dist/src/modules/workspace/sync.js +253 -0
- package/dist/src/modules/workspace/sync.js.map +1 -0
- package/dist/src/modules/workspace/types.d.ts +166 -0
- package/dist/src/modules/workspace/types.d.ts.map +1 -0
- package/dist/src/modules/workspace/types.js +5 -0
- package/dist/src/modules/workspace/types.js.map +1 -0
- package/dist/src/modules/workspace/watcher.d.ts +43 -0
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -0
- package/dist/src/modules/workspace/watcher.js +120 -0
- package/dist/src/modules/workspace/watcher.js.map +1 -0
- package/dist/src/queue.d.ts +50 -0
- package/dist/src/queue.d.ts.map +1 -0
- package/dist/src/queue.js +95 -0
- package/dist/src/queue.js.map +1 -0
- package/dist/src/safe-slice.d.ts +8 -0
- package/dist/src/safe-slice.d.ts.map +1 -0
- package/dist/src/safe-slice.js +18 -0
- package/dist/src/safe-slice.js.map +1 -0
- package/dist/src/types/agent.d.ts +118 -0
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js +2 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/src/types/events.d.ts +220 -0
- package/dist/src/types/events.d.ts.map +1 -0
- package/dist/src/types/events.js +2 -0
- package/dist/src/types/events.js.map +1 -0
- package/dist/src/types/framework.d.ts +184 -0
- package/dist/src/types/framework.d.ts.map +1 -0
- package/dist/src/types/framework.js +2 -0
- package/dist/src/types/framework.js.map +1 -0
- package/dist/src/types/index.d.ts +7 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +7 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/inference-log.d.ts +64 -0
- package/dist/src/types/inference-log.d.ts.map +1 -0
- package/dist/src/types/inference-log.js +5 -0
- package/dist/src/types/inference-log.js.map +1 -0
- package/dist/src/types/module.d.ts +302 -0
- package/dist/src/types/module.d.ts.map +1 -0
- package/dist/src/types/module.js +2 -0
- package/dist/src/types/module.js.map +1 -0
- package/dist/src/types/trace.d.ts +173 -0
- package/dist/src/types/trace.d.ts.map +1 -0
- package/dist/src/types/trace.js +2 -0
- package/dist/src/types/trace.js.map +1 -0
- package/dist/test/event-gate.test.d.ts +2 -0
- package/dist/test/event-gate.test.d.ts.map +1 -0
- package/dist/test/event-gate.test.js +535 -0
- package/dist/test/event-gate.test.js.map +1 -0
- package/dist/test/framework.test.d.ts +5 -0
- package/dist/test/framework.test.d.ts.map +1 -0
- package/dist/test/framework.test.js +738 -0
- package/dist/test/framework.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +58 -0
- package/src/agent.ts +512 -0
- package/src/api/mcp-server.ts +687 -0
- package/src/api/server.ts +1023 -0
- package/src/api/types.ts +542 -0
- package/src/framework.ts +2784 -0
- package/src/gate/event-gate.ts +623 -0
- package/src/gate/index.ts +12 -0
- package/src/gate/types.ts +112 -0
- package/src/index.ts +63 -0
- package/src/mcpl/channel-registry.ts +824 -0
- package/src/mcpl/checkpoint-manager.ts +545 -0
- package/src/mcpl/errors.ts +114 -0
- package/src/mcpl/feature-set-manager.ts +333 -0
- package/src/mcpl/hook-orchestrator.ts +281 -0
- package/src/mcpl/index.ts +134 -0
- package/src/mcpl/inference-router.ts +335 -0
- package/src/mcpl/push-handler.ts +232 -0
- package/src/mcpl/scope-manager.ts +262 -0
- package/src/mcpl/server-connection.ts +694 -0
- package/src/mcpl/server-registry.ts +144 -0
- package/src/mcpl/types.ts +991 -0
- package/src/module-registry.ts +547 -0
- package/src/modules/api/index.ts +94 -0
- package/src/modules/discord/discord-js-client.ts +353 -0
- package/src/modules/discord/index.ts +1146 -0
- package/src/modules/discord/types.ts +465 -0
- package/src/modules/index.ts +43 -0
- package/src/modules/workspace/index.ts +969 -0
- package/src/modules/workspace/sync.ts +314 -0
- package/src/modules/workspace/types.ts +202 -0
- package/src/modules/workspace/watcher.ts +142 -0
- package/src/queue.ts +106 -0
- package/src/safe-slice.ts +18 -0
- package/src/types/agent.ts +119 -0
- package/src/types/events.ts +252 -0
- package/src/types/framework.ts +211 -0
- package/src/types/index.ts +6 -0
- package/src/types/inference-log.ts +64 -0
- package/src/types/module.ts +367 -0
- 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"}
|