@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,79 @@
1
+ /**
2
+ * CheckpointManager — MCPL state management with branching checkpoint trees.
3
+ *
4
+ * Manages per-(serverId, featureSet) checkpoint trees for stateful MCPL tools.
5
+ * Two modes:
6
+ * - hostState: true → host stores state data, applies JSON Patch deltas
7
+ * - hostState: false → host tracks opaque checkpoint IDs only
8
+ *
9
+ * Checkpoint tree metadata is persisted to Chronicle via a `mcpl/checkpoints`
10
+ * state slot. Host-managed state data is persisted per feature set.
11
+ *
12
+ * Spec reference: Section 8 (State Management).
13
+ */
14
+ import type { JsStore } from '@animalabs/chronicle';
15
+ import type { StateCheckpoint, JsonPatchOperation } from './types.js';
16
+ /**
17
+ * Apply a JSON Patch (RFC 6902) to a document.
18
+ * Supports: add, remove, replace, test.
19
+ * Operates on a deep-cloned document to avoid mutation.
20
+ */
21
+ export declare function applyJsonPatch(doc: unknown, ops: JsonPatchOperation[]): unknown;
22
+ export declare class CheckpointManager {
23
+ private store;
24
+ private emitTraceFn;
25
+ private trees;
26
+ constructor(store: JsStore, emitTraceFn: (event: {
27
+ type: string;
28
+ [key: string]: unknown;
29
+ }) => void);
30
+ /**
31
+ * Register a feature set as stateful.
32
+ * Called during initializeMcpl for feature sets with rollback or hostState.
33
+ */
34
+ registerFeatureSet(serverId: string, featureSet: string, opts: {
35
+ hostState: boolean;
36
+ rollback: boolean;
37
+ }): void;
38
+ /**
39
+ * Record a checkpoint returned in a tool call response.
40
+ * Updates the tree and persists to Chronicle.
41
+ */
42
+ recordCheckpoint(serverId: string, featureSet: string, checkpoint: StateCheckpoint): void;
43
+ /** Get current reconstructed state for host-managed feature sets. */
44
+ getCurrentState(serverId: string, featureSet: string): unknown | undefined;
45
+ /** Get current checkpoint ID for server-managed feature sets. */
46
+ getCurrentCheckpoint(serverId: string, featureSet: string): string | null;
47
+ /** Check if a (serverId, featureSet) pair is registered as stateful. */
48
+ isStateful(serverId: string, featureSet: string): boolean;
49
+ /** Check if a (serverId, featureSet) pair uses host-managed state. */
50
+ isHostManaged(serverId: string, featureSet: string): boolean;
51
+ /**
52
+ * Get the first stateful feature set for a given server.
53
+ * Returns null if no stateful feature sets are registered.
54
+ */
55
+ getStatefulFeatureSet(serverId: string): string | null;
56
+ /**
57
+ * Roll back to a previous checkpoint in the tree.
58
+ * Updates the current pointer and, for host-managed state, reconstructs
59
+ * the state at that checkpoint.
60
+ *
61
+ * Returns the reconstructed state (host-managed) or undefined (server-managed).
62
+ * Throws if the checkpoint is not found.
63
+ */
64
+ rollbackTo(serverId: string, featureSet: string, checkpoint: string): unknown | undefined;
65
+ /** Remove all state for a server (called on disconnect). */
66
+ removeServer(serverId: string): void;
67
+ /**
68
+ * Reconstruct host-managed state at a given checkpoint by walking
69
+ * from the nearest ancestor with full data down to the target.
70
+ */
71
+ private reconstructState;
72
+ /** Persist checkpoint tree metadata to Chronicle. */
73
+ private persistTree;
74
+ /** Load checkpoint tree from Chronicle on startup. */
75
+ private loadFromStore;
76
+ private key;
77
+ private stateId;
78
+ }
79
+ //# sourceMappingURL=checkpoint-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-manager.d.ts","sourceRoot":"","sources":["../../../src/mcpl/checkpoint-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAqFtE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAmE/E;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,WAAW,CAA4D;IAC/E,OAAO,CAAC,KAAK,CAAsC;gBAGjD,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KAAK,IAAI;IAoBxE;;;OAGG;IACH,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,GAC9C,IAAI;IA2CP;;;OAGG;IACH,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,eAAe,GAC1B,IAAI;IAmEP,qEAAqE;IACrE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI1E,iEAAiE;IACjE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQzE,wEAAwE;IACxE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAIzD,sEAAsE;IACtE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAI5D;;;OAGG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IActD;;;;;;;OAOG;IACH,UAAU,CACR,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,GAAG,SAAS;IA+BtB,4DAA4D;IAC5D,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAuBpC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoCxB,qDAAqD;IACrD,OAAO,CAAC,WAAW;IAwBnB,sDAAsD;IACtD,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,OAAO;CAGhB"}
@@ -0,0 +1,430 @@
1
+ /**
2
+ * CheckpointManager — MCPL state management with branching checkpoint trees.
3
+ *
4
+ * Manages per-(serverId, featureSet) checkpoint trees for stateful MCPL tools.
5
+ * Two modes:
6
+ * - hostState: true → host stores state data, applies JSON Patch deltas
7
+ * - hostState: false → host tracks opaque checkpoint IDs only
8
+ *
9
+ * Checkpoint tree metadata is persisted to Chronicle via a `mcpl/checkpoints`
10
+ * state slot. Host-managed state data is persisted per feature set.
11
+ *
12
+ * Spec reference: Section 8 (State Management).
13
+ */
14
+ // ============================================================================
15
+ // Constants
16
+ // ============================================================================
17
+ /** Chronicle state ID for checkpoint tree metadata. */
18
+ const CHECKPOINTS_STATE_ID = 'mcpl/checkpoints';
19
+ /** Prefix for per-feature-set host-managed state. */
20
+ const STATE_PREFIX = 'mcpl/state';
21
+ // ============================================================================
22
+ // JSON Patch (RFC 6902) — minimal implementation
23
+ // ============================================================================
24
+ /**
25
+ * Parse a JSON Pointer (RFC 6901) into path segments.
26
+ * E.g. "/foo/0/bar" → ["foo", "0", "bar"]
27
+ */
28
+ function parsePointer(pointer) {
29
+ if (pointer === '')
30
+ return [];
31
+ if (!pointer.startsWith('/')) {
32
+ throw new Error(`Invalid JSON Pointer: ${pointer}`);
33
+ }
34
+ return pointer.slice(1).split('/').map((s) => s.replace(/~1/g, '/').replace(/~0/g, '~'));
35
+ }
36
+ /**
37
+ * Navigate to a parent container and return [parent, lastKey].
38
+ * Throws if the path doesn't exist.
39
+ */
40
+ function navigateTo(doc, segments) {
41
+ let current = doc;
42
+ for (let i = 0; i < segments.length - 1; i++) {
43
+ const seg = segments[i];
44
+ if (Array.isArray(current)) {
45
+ current = current[Number(seg)];
46
+ }
47
+ else if (current !== null && typeof current === 'object') {
48
+ current = current[seg];
49
+ }
50
+ else {
51
+ throw new Error(`Cannot navigate path segment "${seg}": not an object/array`);
52
+ }
53
+ }
54
+ return [current, segments[segments.length - 1]];
55
+ }
56
+ /**
57
+ * Apply a JSON Patch (RFC 6902) to a document.
58
+ * Supports: add, remove, replace, test.
59
+ * Operates on a deep-cloned document to avoid mutation.
60
+ */
61
+ export function applyJsonPatch(doc, ops) {
62
+ let result = structuredClone(doc);
63
+ for (const op of ops) {
64
+ const segments = parsePointer(op.path);
65
+ switch (op.op) {
66
+ case 'add': {
67
+ if (segments.length === 0) {
68
+ result = op.value;
69
+ break;
70
+ }
71
+ const [parent, key] = navigateTo(result, segments);
72
+ if (Array.isArray(parent)) {
73
+ const idx = key === '-' ? parent.length : Number(key);
74
+ parent.splice(idx, 0, op.value);
75
+ }
76
+ else {
77
+ parent[key] = op.value;
78
+ }
79
+ break;
80
+ }
81
+ case 'remove': {
82
+ const [parent, key] = navigateTo(result, segments);
83
+ if (Array.isArray(parent)) {
84
+ parent.splice(Number(key), 1);
85
+ }
86
+ else {
87
+ delete parent[key];
88
+ }
89
+ break;
90
+ }
91
+ case 'replace': {
92
+ if (segments.length === 0) {
93
+ result = op.value;
94
+ break;
95
+ }
96
+ const [parent, key] = navigateTo(result, segments);
97
+ if (Array.isArray(parent)) {
98
+ parent[Number(key)] = op.value;
99
+ }
100
+ else {
101
+ parent[key] = op.value;
102
+ }
103
+ break;
104
+ }
105
+ case 'test': {
106
+ const [parent, key] = navigateTo(result, segments);
107
+ const actual = Array.isArray(parent)
108
+ ? parent[Number(key)]
109
+ : parent[key];
110
+ if (JSON.stringify(actual) !== JSON.stringify(op.value)) {
111
+ throw new Error(`JSON Patch test failed at "${op.path}": expected ${JSON.stringify(op.value)}, got ${JSON.stringify(actual)}`);
112
+ }
113
+ break;
114
+ }
115
+ case 'move':
116
+ case 'copy':
117
+ // Deferred — not needed for MVP
118
+ throw new Error(`JSON Patch op "${op.op}" not yet supported`);
119
+ }
120
+ }
121
+ return result;
122
+ }
123
+ // ============================================================================
124
+ // CheckpointManager
125
+ // ============================================================================
126
+ export class CheckpointManager {
127
+ store;
128
+ emitTraceFn;
129
+ trees = new Map();
130
+ constructor(store, emitTraceFn) {
131
+ this.store = store;
132
+ this.emitTraceFn = emitTraceFn;
133
+ // Register the checkpoint metadata state slot
134
+ try {
135
+ store.registerState({ id: CHECKPOINTS_STATE_ID, strategy: 'snapshot' });
136
+ }
137
+ catch {
138
+ // Already registered (e.g. framework restart)
139
+ }
140
+ // Load existing tree from Chronicle
141
+ this.loadFromStore();
142
+ }
143
+ // ==========================================================================
144
+ // Registration
145
+ // ==========================================================================
146
+ /**
147
+ * Register a feature set as stateful.
148
+ * Called during initializeMcpl for feature sets with rollback or hostState.
149
+ */
150
+ registerFeatureSet(serverId, featureSet, opts) {
151
+ const key = this.key(serverId, featureSet);
152
+ if (this.trees.has(key))
153
+ return; // Already registered (e.g. from loaded state)
154
+ this.trees.set(key, {
155
+ hostState: opts.hostState,
156
+ rollback: opts.rollback,
157
+ currentCheckpoint: null,
158
+ currentState: undefined,
159
+ nodes: new Map(),
160
+ });
161
+ // Register per-feature-set state slot for host-managed state
162
+ if (opts.hostState) {
163
+ const stateId = this.stateId(serverId, featureSet);
164
+ try {
165
+ this.store.registerState({ id: stateId, strategy: 'snapshot' });
166
+ }
167
+ catch {
168
+ // Already registered
169
+ }
170
+ // Load existing state if any
171
+ const existing = this.store.getStateJson(stateId);
172
+ if (existing !== null && existing !== undefined) {
173
+ const tree = this.trees.get(key);
174
+ tree.currentState = existing;
175
+ }
176
+ }
177
+ this.emitTraceFn({
178
+ type: 'mcpl:state_registered',
179
+ serverId,
180
+ featureSet,
181
+ hostState: opts.hostState,
182
+ rollback: opts.rollback,
183
+ });
184
+ this.persistTree();
185
+ }
186
+ // ==========================================================================
187
+ // Checkpoint recording
188
+ // ==========================================================================
189
+ /**
190
+ * Record a checkpoint returned in a tool call response.
191
+ * Updates the tree and persists to Chronicle.
192
+ */
193
+ recordCheckpoint(serverId, featureSet, checkpoint) {
194
+ const key = this.key(serverId, featureSet);
195
+ const tree = this.trees.get(key);
196
+ if (!tree)
197
+ return;
198
+ // Add node to tree
199
+ const node = {
200
+ checkpoint: checkpoint.checkpoint,
201
+ parent: checkpoint.parent,
202
+ children: [],
203
+ data: checkpoint.data,
204
+ patch: checkpoint.patch,
205
+ };
206
+ // Link to parent
207
+ if (checkpoint.parent) {
208
+ const parentNode = tree.nodes.get(checkpoint.parent);
209
+ if (parentNode) {
210
+ parentNode.children.push(checkpoint.checkpoint);
211
+ }
212
+ }
213
+ tree.nodes.set(checkpoint.checkpoint, node);
214
+ tree.currentCheckpoint = checkpoint.checkpoint;
215
+ // For host-managed state, reconstruct current state
216
+ if (tree.hostState) {
217
+ if (checkpoint.data !== undefined) {
218
+ // Full state provided — use directly
219
+ tree.currentState = structuredClone(checkpoint.data);
220
+ }
221
+ else if (checkpoint.patch) {
222
+ // Delta provided — apply to current state
223
+ try {
224
+ tree.currentState = applyJsonPatch(tree.currentState ?? {}, checkpoint.patch);
225
+ }
226
+ catch (err) {
227
+ console.error(`[CheckpointManager] JSON Patch failed for ${key}:`, err instanceof Error ? err.message : err);
228
+ // Keep existing state on patch failure
229
+ }
230
+ }
231
+ // Persist reconstructed state
232
+ this.store.setStateJson(this.stateId(serverId, featureSet), tree.currentState);
233
+ }
234
+ this.emitTraceFn({
235
+ type: 'mcpl:checkpoint_recorded',
236
+ serverId,
237
+ featureSet,
238
+ checkpoint: checkpoint.checkpoint,
239
+ parent: checkpoint.parent,
240
+ hasData: checkpoint.data !== undefined,
241
+ hasPatch: checkpoint.patch !== undefined,
242
+ });
243
+ this.persistTree();
244
+ }
245
+ // ==========================================================================
246
+ // State access (for tools/call params)
247
+ // ==========================================================================
248
+ /** Get current reconstructed state for host-managed feature sets. */
249
+ getCurrentState(serverId, featureSet) {
250
+ return this.trees.get(this.key(serverId, featureSet))?.currentState;
251
+ }
252
+ /** Get current checkpoint ID for server-managed feature sets. */
253
+ getCurrentCheckpoint(serverId, featureSet) {
254
+ return this.trees.get(this.key(serverId, featureSet))?.currentCheckpoint ?? null;
255
+ }
256
+ // ==========================================================================
257
+ // Queries
258
+ // ==========================================================================
259
+ /** Check if a (serverId, featureSet) pair is registered as stateful. */
260
+ isStateful(serverId, featureSet) {
261
+ return this.trees.has(this.key(serverId, featureSet));
262
+ }
263
+ /** Check if a (serverId, featureSet) pair uses host-managed state. */
264
+ isHostManaged(serverId, featureSet) {
265
+ return this.trees.get(this.key(serverId, featureSet))?.hostState ?? false;
266
+ }
267
+ /**
268
+ * Get the first stateful feature set for a given server.
269
+ * Returns null if no stateful feature sets are registered.
270
+ */
271
+ getStatefulFeatureSet(serverId) {
272
+ const prefix = `${serverId}:`;
273
+ for (const [key] of this.trees) {
274
+ if (key.startsWith(prefix)) {
275
+ return key.slice(prefix.length);
276
+ }
277
+ }
278
+ return null;
279
+ }
280
+ // ==========================================================================
281
+ // Rollback
282
+ // ==========================================================================
283
+ /**
284
+ * Roll back to a previous checkpoint in the tree.
285
+ * Updates the current pointer and, for host-managed state, reconstructs
286
+ * the state at that checkpoint.
287
+ *
288
+ * Returns the reconstructed state (host-managed) or undefined (server-managed).
289
+ * Throws if the checkpoint is not found.
290
+ */
291
+ rollbackTo(serverId, featureSet, checkpoint) {
292
+ const key = this.key(serverId, featureSet);
293
+ const tree = this.trees.get(key);
294
+ if (!tree)
295
+ throw new Error(`No stateful feature set: ${key}`);
296
+ const node = tree.nodes.get(checkpoint);
297
+ if (!node)
298
+ throw new Error(`Checkpoint not found: ${checkpoint}`);
299
+ tree.currentCheckpoint = checkpoint;
300
+ if (tree.hostState) {
301
+ // Reconstruct state at this checkpoint by walking from root
302
+ tree.currentState = this.reconstructState(tree, checkpoint);
303
+ this.store.setStateJson(this.stateId(serverId, featureSet), tree.currentState);
304
+ }
305
+ this.emitTraceFn({
306
+ type: 'mcpl:state_rollback',
307
+ serverId,
308
+ featureSet,
309
+ checkpoint,
310
+ });
311
+ this.persistTree();
312
+ return tree.currentState;
313
+ }
314
+ // ==========================================================================
315
+ // Cleanup
316
+ // ==========================================================================
317
+ /** Remove all state for a server (called on disconnect). */
318
+ removeServer(serverId) {
319
+ const prefix = `${serverId}:`;
320
+ const toRemove = [];
321
+ for (const [key] of this.trees) {
322
+ if (key.startsWith(prefix)) {
323
+ toRemove.push(key);
324
+ }
325
+ }
326
+ for (const key of toRemove) {
327
+ this.trees.delete(key);
328
+ }
329
+ if (toRemove.length > 0) {
330
+ this.persistTree();
331
+ }
332
+ }
333
+ // ==========================================================================
334
+ // Private: State reconstruction
335
+ // ==========================================================================
336
+ /**
337
+ * Reconstruct host-managed state at a given checkpoint by walking
338
+ * from the nearest ancestor with full data down to the target.
339
+ */
340
+ reconstructState(tree, checkpoint) {
341
+ // Build path from root to checkpoint
342
+ const path = [];
343
+ let current = checkpoint;
344
+ while (current !== null) {
345
+ const node = tree.nodes.get(current);
346
+ if (!node)
347
+ break;
348
+ path.unshift(node);
349
+ current = node.parent;
350
+ }
351
+ // Walk forward, applying data/patches
352
+ let state = {};
353
+ for (const node of path) {
354
+ if (node.data !== undefined) {
355
+ // Full state snapshot — use it, discard prior state
356
+ state = structuredClone(node.data);
357
+ }
358
+ else if (node.patch) {
359
+ // Delta — apply to current state
360
+ try {
361
+ state = applyJsonPatch(state, node.patch);
362
+ }
363
+ catch {
364
+ // On patch failure, keep last known good state
365
+ }
366
+ }
367
+ }
368
+ return state;
369
+ }
370
+ // ==========================================================================
371
+ // Private: Persistence
372
+ // ==========================================================================
373
+ /** Persist checkpoint tree metadata to Chronicle. */
374
+ persistTree() {
375
+ const serialized = { trees: {} };
376
+ for (const [key, tree] of this.trees) {
377
+ const nodes = {};
378
+ for (const [id, node] of tree.nodes) {
379
+ nodes[id] = {
380
+ parent: node.parent,
381
+ children: node.children,
382
+ data: node.data,
383
+ patch: node.patch,
384
+ };
385
+ }
386
+ serialized.trees[key] = {
387
+ hostState: tree.hostState,
388
+ rollback: tree.rollback,
389
+ current: tree.currentCheckpoint,
390
+ nodes,
391
+ };
392
+ }
393
+ this.store.setStateJson(CHECKPOINTS_STATE_ID, serialized);
394
+ }
395
+ /** Load checkpoint tree from Chronicle on startup. */
396
+ loadFromStore() {
397
+ const data = this.store.getStateJson(CHECKPOINTS_STATE_ID);
398
+ if (!data?.trees)
399
+ return;
400
+ for (const [key, entry] of Object.entries(data.trees)) {
401
+ const nodes = new Map();
402
+ for (const [id, nodeData] of Object.entries(entry.nodes)) {
403
+ nodes.set(id, {
404
+ checkpoint: id,
405
+ parent: nodeData.parent,
406
+ children: [...nodeData.children],
407
+ data: nodeData.data,
408
+ patch: nodeData.patch,
409
+ });
410
+ }
411
+ this.trees.set(key, {
412
+ hostState: entry.hostState,
413
+ rollback: entry.rollback,
414
+ currentCheckpoint: entry.current,
415
+ currentState: undefined, // Will be loaded per-feature-set during registerFeatureSet
416
+ nodes,
417
+ });
418
+ }
419
+ }
420
+ // ==========================================================================
421
+ // Private: Helpers
422
+ // ==========================================================================
423
+ key(serverId, featureSet) {
424
+ return `${serverId}:${featureSet}`;
425
+ }
426
+ stateId(serverId, featureSet) {
427
+ return `${STATE_PREFIX}/${serverId}/${featureSet}`;
428
+ }
429
+ }
430
+ //# sourceMappingURL=checkpoint-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-manager.js","sourceRoot":"","sources":["../../../src/mcpl/checkpoint-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
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
+ import type { JsonRpcError } from './types.js';
8
+ /** Message used a disabled feature set. */
9
+ export declare const FEATURE_SET_NOT_ENABLED = -32001;
10
+ /** Message used an undeclared feature set. */
11
+ export declare const UNKNOWN_FEATURE_SET = -32003;
12
+ /** Rollback targeted a pruned or unknown checkpoint. */
13
+ export declare const CHECKPOINT_NOT_FOUND = -32005;
14
+ /** Lacking scope to publish or observe channel. */
15
+ export declare const CHANNEL_NOT_PERMITTED = -32017;
16
+ /** Channel ID doesn't exist or not registered. */
17
+ export declare const UNKNOWN_CHANNEL = -32023;
18
+ /** Server could not open/connect the requested channel. */
19
+ export declare const CHANNEL_OPEN_FAILED = -32024;
20
+ /**
21
+ * Create a "feature set not enabled" error.
22
+ * Returned when a server sends a message tagged with a feature set
23
+ * that the host has disabled.
24
+ */
25
+ export declare function featureSetNotEnabled(featureSet: string, canEnable?: boolean): JsonRpcError;
26
+ /**
27
+ * Create an "unknown feature set" error.
28
+ * Returned when a server sends a message tagged with a feature set
29
+ * that was never declared in capabilities.
30
+ */
31
+ export declare function unknownFeatureSet(featureSet: string): JsonRpcError;
32
+ /**
33
+ * Create a "checkpoint not found" error.
34
+ * Returned when a rollback targets a pruned or unknown checkpoint.
35
+ */
36
+ export declare function checkpointNotFound(checkpoint: string): JsonRpcError;
37
+ /**
38
+ * Create a "channel not permitted" error.
39
+ * Returned when a server lacks scope to publish or observe a channel.
40
+ */
41
+ export declare function channelNotPermitted(channelId: string): JsonRpcError;
42
+ /**
43
+ * Create an "unknown channel" error.
44
+ * Returned when a channel ID doesn't exist or isn't registered.
45
+ */
46
+ export declare function unknownChannel(channelId: string): JsonRpcError;
47
+ /**
48
+ * Create a "channel open failed" error.
49
+ * Returned when a server could not open/connect the requested channel.
50
+ */
51
+ export declare function channelOpenFailed(channelId: string, reason?: string): JsonRpcError;
52
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/mcpl/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,2CAA2C;AAC3C,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAE9C,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAE1C,wDAAwD;AACxD,eAAO,MAAM,oBAAoB,SAAS,CAAC;AAE3C,mDAAmD;AACnD,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAE5C,kDAAkD;AAClD,eAAO,MAAM,eAAe,SAAS,CAAC;AAEtC,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAM1C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,OAAc,GACxB,YAAY,CAMd;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAMlE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAMnE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAMnE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAM9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,YAAY,CAMd"}