@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,120 @@
1
+ /**
2
+ * Filesystem watcher with debounce, ignore patterns, and suppression.
3
+ */
4
+ import { watch } from 'chokidar';
5
+ /**
6
+ * Manages filesystem watching for a single mount.
7
+ * Handles debouncing, ignore patterns, and write suppression.
8
+ */
9
+ export class MountWatcher {
10
+ watcher = null;
11
+ pendingChanges = new Set();
12
+ debounceTimer = null;
13
+ suppressedPaths = new Set();
14
+ suppressionTimers = new Map();
15
+ debounceMs;
16
+ config;
17
+ onChangeCallback;
18
+ constructor(config, onChange) {
19
+ this.config = config;
20
+ this.debounceMs = config.watchDebounceMs ?? 300;
21
+ this.onChangeCallback = onChange;
22
+ }
23
+ /**
24
+ * Start watching the filesystem.
25
+ */
26
+ start() {
27
+ if (this.watcher)
28
+ return;
29
+ const ignored = this.config.ignore ?? [];
30
+ this.watcher = watch(this.config.path, {
31
+ ignored: ignored.length > 0 ? ignored : undefined,
32
+ persistent: true,
33
+ ignoreInitial: true,
34
+ followSymlinks: this.config.followSymlinks ?? false,
35
+ awaitWriteFinish: {
36
+ stabilityThreshold: 100,
37
+ pollInterval: 50,
38
+ },
39
+ });
40
+ const handleEvent = (filePath) => {
41
+ // Convert absolute path to mount-relative
42
+ const relative = this.toRelative(filePath);
43
+ if (!relative)
44
+ return;
45
+ // Skip if this path is suppressed (we just wrote it)
46
+ if (this.suppressedPaths.has(relative))
47
+ return;
48
+ this.pendingChanges.add(relative);
49
+ this.scheduleFire();
50
+ };
51
+ this.watcher.on('add', handleEvent);
52
+ this.watcher.on('change', handleEvent);
53
+ this.watcher.on('unlink', handleEvent);
54
+ }
55
+ /**
56
+ * Stop watching.
57
+ */
58
+ async stop() {
59
+ if (this.debounceTimer) {
60
+ clearTimeout(this.debounceTimer);
61
+ this.debounceTimer = null;
62
+ }
63
+ for (const timer of this.suppressionTimers.values()) {
64
+ clearTimeout(timer);
65
+ }
66
+ this.suppressionTimers.clear();
67
+ this.suppressedPaths.clear();
68
+ this.pendingChanges.clear();
69
+ if (this.watcher) {
70
+ await this.watcher.close();
71
+ this.watcher = null;
72
+ }
73
+ }
74
+ /**
75
+ * Suppress watcher events for a path temporarily.
76
+ * Used after materializing to avoid echo events.
77
+ * After the cooldown, the path is re-checked via the recheckCallback.
78
+ */
79
+ suppress(relativePath, cooldownMs = 500) {
80
+ this.suppressedPaths.add(relativePath);
81
+ // Clear existing timer for this path
82
+ const existing = this.suppressionTimers.get(relativePath);
83
+ if (existing)
84
+ clearTimeout(existing);
85
+ const timer = setTimeout(() => {
86
+ this.suppressedPaths.delete(relativePath);
87
+ this.suppressionTimers.delete(relativePath);
88
+ }, cooldownMs);
89
+ this.suppressionTimers.set(relativePath, timer);
90
+ }
91
+ /**
92
+ * Check if a path is currently suppressed.
93
+ */
94
+ isSuppressed(relativePath) {
95
+ return this.suppressedPaths.has(relativePath);
96
+ }
97
+ scheduleFire() {
98
+ if (this.debounceTimer) {
99
+ clearTimeout(this.debounceTimer);
100
+ }
101
+ this.debounceTimer = setTimeout(() => {
102
+ this.debounceTimer = null;
103
+ if (this.pendingChanges.size > 0) {
104
+ const paths = [...this.pendingChanges];
105
+ this.pendingChanges.clear();
106
+ this.onChangeCallback(paths);
107
+ }
108
+ }, this.debounceMs);
109
+ }
110
+ toRelative(absolutePath) {
111
+ const base = this.config.path.endsWith('/')
112
+ ? this.config.path
113
+ : this.config.path + '/';
114
+ if (absolutePath.startsWith(base)) {
115
+ return absolutePath.slice(base.length);
116
+ }
117
+ return null;
118
+ }
119
+ }
120
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../../src/modules/workspace/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { ProcessEvent, ProcessQueue } from './types/index.js';
2
+ /**
3
+ * Process queue for the framework.
4
+ * ProcessEvents from external sources and internal operations flow through here.
5
+ */
6
+ export declare class ProcessQueueImpl implements ProcessQueue {
7
+ private queue;
8
+ private waiters;
9
+ private closed;
10
+ /**
11
+ * Push a process event to the queue.
12
+ */
13
+ push(event: ProcessEvent): void;
14
+ /**
15
+ * Pop the next process event from the queue.
16
+ * Returns immediately if an event is available, otherwise waits.
17
+ */
18
+ pop(): Promise<ProcessEvent>;
19
+ /**
20
+ * Try to pop a process event without waiting.
21
+ * Returns null if queue is empty.
22
+ */
23
+ tryPop(): ProcessEvent | null;
24
+ /**
25
+ * Peek at the next process event without removing it.
26
+ */
27
+ peek(): ProcessEvent | null;
28
+ /**
29
+ * Get current queue depth.
30
+ */
31
+ get depth(): number;
32
+ /**
33
+ * Check if queue is empty.
34
+ */
35
+ get isEmpty(): boolean;
36
+ /**
37
+ * Clear all events from the queue.
38
+ */
39
+ clear(): void;
40
+ /**
41
+ * Close the queue.
42
+ * Rejects any pending waiters.
43
+ */
44
+ close(): void;
45
+ /**
46
+ * Check if queue is closed.
47
+ */
48
+ get isClosed(): boolean;
49
+ }
50
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,MAAM,CAAS;IAEvB;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAiB/B;;;OAGG;IACG,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;IAiBlC;;;OAGG;IACH,MAAM,IAAI,YAAY,GAAG,IAAI;IAI7B;;OAEG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI;IAI3B;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;CACF"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Process queue for the framework.
3
+ * ProcessEvents from external sources and internal operations flow through here.
4
+ */
5
+ export class ProcessQueueImpl {
6
+ queue = [];
7
+ waiters = [];
8
+ closed = false;
9
+ /**
10
+ * Push a process event to the queue.
11
+ */
12
+ push(event) {
13
+ if (this.closed) {
14
+ throw new Error('Queue is closed');
15
+ }
16
+ // If someone is waiting, deliver immediately
17
+ const waiter = this.waiters.shift();
18
+ if (waiter) {
19
+ waiter(event);
20
+ }
21
+ else if (event.type === 'external-message') {
22
+ // User input jumps to front so it's processed before queued internal events
23
+ this.queue.unshift(event);
24
+ }
25
+ else {
26
+ this.queue.push(event);
27
+ }
28
+ }
29
+ /**
30
+ * Pop the next process event from the queue.
31
+ * Returns immediately if an event is available, otherwise waits.
32
+ */
33
+ async pop() {
34
+ if (this.closed) {
35
+ throw new Error('Queue is closed');
36
+ }
37
+ // If there's an event waiting, return it
38
+ const event = this.queue.shift();
39
+ if (event) {
40
+ return event;
41
+ }
42
+ // Otherwise, wait for one
43
+ return new Promise((resolve) => {
44
+ this.waiters.push(resolve);
45
+ });
46
+ }
47
+ /**
48
+ * Try to pop a process event without waiting.
49
+ * Returns null if queue is empty.
50
+ */
51
+ tryPop() {
52
+ return this.queue.shift() ?? null;
53
+ }
54
+ /**
55
+ * Peek at the next process event without removing it.
56
+ */
57
+ peek() {
58
+ return this.queue[0] ?? null;
59
+ }
60
+ /**
61
+ * Get current queue depth.
62
+ */
63
+ get depth() {
64
+ return this.queue.length;
65
+ }
66
+ /**
67
+ * Check if queue is empty.
68
+ */
69
+ get isEmpty() {
70
+ return this.queue.length === 0;
71
+ }
72
+ /**
73
+ * Clear all events from the queue.
74
+ */
75
+ clear() {
76
+ this.queue = [];
77
+ }
78
+ /**
79
+ * Close the queue.
80
+ * Rejects any pending waiters.
81
+ */
82
+ close() {
83
+ this.closed = true;
84
+ // Reject pending waiters by not resolving them
85
+ // In a real implementation, we might want to reject with an error
86
+ this.waiters = [];
87
+ }
88
+ /**
89
+ * Check if queue is closed.
90
+ */
91
+ get isClosed() {
92
+ return this.closed;
93
+ }
94
+ }
95
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/queue.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACnB,KAAK,GAAmB,EAAE,CAAC;IAC3B,OAAO,GAAyC,EAAE,CAAC;IACnD,MAAM,GAAG,KAAK,CAAC;IAEvB;;OAEG;IACH,IAAI,CAAC,KAAmB;QACtB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,6CAA6C;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC7C,4EAA4E;YAC5E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,yCAAyC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0BAA0B;QAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,+CAA+C;QAC/C,kEAAkE;QAClE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Slice a string without splitting surrogate pairs.
3
+ *
4
+ * Regular String.prototype.slice can cut in the middle of a surrogate pair,
5
+ * producing invalid UTF-16. This function adjusts the end index to avoid that.
6
+ */
7
+ export declare function safeSlice(str: string, start: number, end: number): string;
8
+ //# sourceMappingURL=safe-slice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-slice.d.ts","sourceRoot":"","sources":["../../src/safe-slice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWzE"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Slice a string without splitting surrogate pairs.
3
+ *
4
+ * Regular String.prototype.slice can cut in the middle of a surrogate pair,
5
+ * producing invalid UTF-16. This function adjusts the end index to avoid that.
6
+ */
7
+ export function safeSlice(str, start, end) {
8
+ if (end >= str.length)
9
+ return str.slice(start);
10
+ // If we're about to cut between a high and low surrogate, back up one char
11
+ const code = str.charCodeAt(end - 1);
12
+ if (code >= 0xd800 && code <= 0xdbff) {
13
+ // end-1 is a high surrogate — don't split the pair
14
+ return str.slice(start, end - 1);
15
+ }
16
+ return str.slice(start, end);
17
+ }
18
+ //# sourceMappingURL=safe-slice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-slice.js","sourceRoot":"","sources":["../../src/safe-slice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa,EAAE,GAAW;IAC/D,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/C,2EAA2E;IAC3E,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;QACrC,mDAAmD;QACnD,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,118 @@
1
+ import type { ContentBlock, YieldingStream } from '@animalabs/membrane';
2
+ import type { ContextStrategy } from '@animalabs/context-manager';
3
+ import type { ToolCallId, ToolResult, ToolCall } from './events.js';
4
+ /**
5
+ * Configuration for an agent.
6
+ */
7
+ export interface AgentConfig {
8
+ /** Unique name for this agent */
9
+ name: string;
10
+ /** Model to use (e.g., 'claude-sonnet-4-20250514') */
11
+ model: string;
12
+ /** System prompt */
13
+ systemPrompt: string;
14
+ /** Context management strategy */
15
+ strategy?: ContextStrategy;
16
+ /**
17
+ * Which tools this agent can use.
18
+ * - 'all': all available tools
19
+ * - string[]: specific tool names (with module prefix)
20
+ */
21
+ allowedTools?: 'all' | string[];
22
+ /**
23
+ * Which modules can trigger inference for this agent.
24
+ * - 'all': any module
25
+ * - string[]: specific module names
26
+ */
27
+ triggerSources?: 'all' | string[];
28
+ /** Maximum tokens for response */
29
+ maxTokens?: number;
30
+ /** Temperature for inference */
31
+ temperature?: number;
32
+ /** Max input tokens before framework breaks a yielding stream and
33
+ * restarts with recompiled (compressed) context. Default: 150000. */
34
+ maxStreamTokens?: number;
35
+ }
36
+ /**
37
+ * Result of running inference.
38
+ */
39
+ export interface InferenceResult {
40
+ /** Tool calls to execute */
41
+ toolCalls: ToolCall[];
42
+ /** Speech content (text blocks) to send to handlers */
43
+ speechContent: ContentBlock[];
44
+ /** Raw request/response for logging */
45
+ raw?: {
46
+ request: unknown;
47
+ response: unknown;
48
+ };
49
+ /** Usage stats */
50
+ usage?: {
51
+ inputTokens: number;
52
+ outputTokens: number;
53
+ };
54
+ /** Stop reason */
55
+ stopReason?: string;
56
+ /** Whether inference was aborted */
57
+ aborted?: boolean;
58
+ /** Reason for abort, if available */
59
+ abortReason?: string;
60
+ }
61
+ /**
62
+ * Options for running inference.
63
+ */
64
+ export interface InferenceOptions {
65
+ /** Abort signal for cancellation */
66
+ signal?: AbortSignal;
67
+ }
68
+ /**
69
+ * Internal state of an agent.
70
+ */
71
+ export type AgentState = {
72
+ status: 'idle';
73
+ } | {
74
+ status: 'inferring';
75
+ promise: Promise<InferenceResult>;
76
+ abortController: AbortController;
77
+ } | {
78
+ status: 'streaming';
79
+ stream: YieldingStream;
80
+ } | {
81
+ status: 'waiting_for_tools';
82
+ pending: Map<ToolCallId, PendingToolCall>;
83
+ completed: CompletedToolCall[];
84
+ stream?: YieldingStream;
85
+ } | {
86
+ status: 'ready';
87
+ toolResults: CompletedToolCall[];
88
+ stream?: YieldingStream;
89
+ };
90
+ /**
91
+ * A tool call that's in progress.
92
+ */
93
+ export interface PendingToolCall {
94
+ id: ToolCallId;
95
+ name: string;
96
+ input: unknown;
97
+ startedAt: number;
98
+ }
99
+ /**
100
+ * A tool call that has completed.
101
+ */
102
+ export interface CompletedToolCall {
103
+ id: ToolCallId;
104
+ name: string;
105
+ input: unknown;
106
+ result: ToolResult;
107
+ durationMs: number;
108
+ }
109
+ /**
110
+ * Inference request for an agent.
111
+ */
112
+ export interface InferenceRequest {
113
+ agentName: string;
114
+ reason: string;
115
+ source: string;
116
+ timestamp: number;
117
+ }
118
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/types/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/types/agent.ts"],"names":[],"mappings":""}
@@ -0,0 +1,220 @@
1
+ import type { ContentBlock, ToolDefinition as MembraneToolDefinition } from '@animalabs/membrane';
2
+ import type { MessageId } from '@animalabs/context-manager';
3
+ /**
4
+ * Unique identifier for a tool call.
5
+ */
6
+ export type ToolCallId = string;
7
+ /**
8
+ * Re-export membrane's ToolDefinition for modules to use.
9
+ */
10
+ export type ToolDefinition = MembraneToolDefinition;
11
+ /**
12
+ * Events that flow through the framework's processing queue.
13
+ *
14
+ * ProcessEvents represent work to be done — modules respond to them via onProcess().
15
+ * They are distinct from TraceEvents, which are observability-only notifications.
16
+ *
17
+ * Modules can define their own namespaced events (e.g., 'api:message', 'discord:reaction').
18
+ */
19
+ export type ProcessEvent = ExternalMessageEvent | ToolCallEvent | ToolResultEvent | TimerFiredEvent | InferenceRequestEvent | MessageEditedEvent | MessageRemovedEvent | ModuleEvent | ApiMessageEvent | ApiInferenceRequestEvent | McplPushEvent | McplChannelIncomingEvent | CustomEvent;
20
+ /**
21
+ * API message event - from the API server.
22
+ */
23
+ export interface ApiMessageEvent {
24
+ type: 'api:message';
25
+ participant: string;
26
+ content: string;
27
+ metadata?: Record<string, unknown>;
28
+ triggerInference?: boolean;
29
+ targetAgents?: string[];
30
+ }
31
+ /**
32
+ * API inference request - from the API server.
33
+ */
34
+ export interface ApiInferenceRequestEvent {
35
+ type: 'api:inference-request';
36
+ agentName?: string;
37
+ reason?: string;
38
+ }
39
+ /**
40
+ * Generic custom event for module-specific namespaced events.
41
+ * Use this for events like 'discord:message', 'slack:reaction', etc.
42
+ */
43
+ export interface CustomEvent {
44
+ type: `${string}:${string}`;
45
+ [key: string]: unknown;
46
+ }
47
+ /**
48
+ * Message from an external source (Discord, HTTP, CLI, etc.)
49
+ */
50
+ export interface ExternalMessageEvent {
51
+ type: 'external-message';
52
+ /** Module that produced this event */
53
+ source: string;
54
+ /** Raw content from external system */
55
+ content: unknown;
56
+ /** External system metadata */
57
+ metadata: Record<string, unknown>;
58
+ /** Whether this should trigger inference */
59
+ triggerInference?: boolean;
60
+ /** Specific agents to trigger (if not all) */
61
+ targetAgents?: string[];
62
+ }
63
+ /**
64
+ * Result of a tool call.
65
+ */
66
+ export interface ToolResultEvent {
67
+ type: 'tool-result';
68
+ /** ID of the original tool call */
69
+ callId: ToolCallId;
70
+ /** Agent that made the call */
71
+ agentName: string;
72
+ /** Module that handled the call */
73
+ moduleName: string;
74
+ /** Result of the tool call */
75
+ result: ToolResult;
76
+ }
77
+ /**
78
+ * Tool call scheduled for execution.
79
+ */
80
+ export interface ToolCallEvent {
81
+ type: 'tool-call';
82
+ /** ID of the tool call */
83
+ callId: ToolCallId;
84
+ /** Agent that made the call */
85
+ agentName: string;
86
+ /** Module that will handle the call */
87
+ moduleName: string;
88
+ /** Un-prefixed tool name */
89
+ toolName: string;
90
+ /** Full tool call payload */
91
+ call: ToolCall;
92
+ }
93
+ /**
94
+ * Scheduled timer fired.
95
+ */
96
+ export interface TimerFiredEvent {
97
+ type: 'timer-fired';
98
+ /** Timer identifier */
99
+ timerId: string;
100
+ /** Reason for the timer */
101
+ reason: string;
102
+ /** Specific agent to wake (if any) */
103
+ agentName?: string;
104
+ }
105
+ /**
106
+ * Explicit request to run inference.
107
+ */
108
+ export interface InferenceRequestEvent {
109
+ type: 'inference-request';
110
+ /** Agent to run inference for */
111
+ agentName: string;
112
+ /** Reason for the request */
113
+ reason: string;
114
+ /** Module that requested it */
115
+ source: string;
116
+ }
117
+ /**
118
+ * External message was edited.
119
+ */
120
+ export interface MessageEditedEvent {
121
+ type: 'message-edited';
122
+ /** Module that produced this event */
123
+ source: string;
124
+ /** Our internal message ID */
125
+ messageId: MessageId;
126
+ /** New content */
127
+ newContent: ContentBlock[];
128
+ }
129
+ /**
130
+ * External message was removed.
131
+ */
132
+ export interface MessageRemovedEvent {
133
+ type: 'message-removed';
134
+ /** Module that produced this event */
135
+ source: string;
136
+ /** Our internal message ID */
137
+ messageId: MessageId;
138
+ }
139
+ /**
140
+ * Generic module-specific event.
141
+ */
142
+ export interface ModuleEvent {
143
+ type: 'module-event';
144
+ /** Module that produced this event */
145
+ source: string;
146
+ /** Module-specific event type */
147
+ eventType: string;
148
+ /** Module-specific payload */
149
+ payload: unknown;
150
+ }
151
+ /**
152
+ * Result of a tool execution.
153
+ */
154
+ export interface ToolResult {
155
+ /** Whether the tool succeeded */
156
+ success: boolean;
157
+ /** Result data (if success) */
158
+ data?: unknown;
159
+ /** Error message (if failure) */
160
+ error?: string;
161
+ /** Whether this was an error (for LLM) */
162
+ isError?: boolean;
163
+ /**
164
+ * When true, the framework saves tool_use + tool_result messages to context,
165
+ * cancels the active stream, and resets the agent to idle.
166
+ * This is a "sleep until next event" primitive — the LLM expects the call to block.
167
+ * Adapted from Anarchid/agent-framework@mcpl-module-proto.
168
+ */
169
+ endTurn?: boolean;
170
+ }
171
+ /**
172
+ * A tool call from the LLM.
173
+ */
174
+ export interface ToolCall {
175
+ /** Unique ID for this call */
176
+ id: ToolCallId;
177
+ /** Full tool name (module:tool) */
178
+ name: string;
179
+ /** Tool input */
180
+ input: unknown;
181
+ /** The agent that made this tool call. Set by the framework dispatch layer. */
182
+ callerAgentName?: string;
183
+ }
184
+ /**
185
+ * Push event from an MCPL server (Section 9).
186
+ * Converted from wire-format McplContentBlock to membrane ContentBlock.
187
+ */
188
+ export interface McplPushEvent {
189
+ type: 'mcpl:push-event';
190
+ serverId: string;
191
+ featureSet: string;
192
+ eventId: string;
193
+ content: ContentBlock[];
194
+ origin?: Record<string, unknown>;
195
+ timestamp: string;
196
+ inferenceId: string;
197
+ triggerInference?: boolean;
198
+ targetAgents?: string[];
199
+ }
200
+ /**
201
+ * Incoming channel message from an MCPL server (Section 14).
202
+ * Converted from wire-format McplContentBlock to membrane ContentBlock.
203
+ */
204
+ export interface McplChannelIncomingEvent {
205
+ type: 'mcpl:channel-incoming';
206
+ serverId: string;
207
+ channelId: string;
208
+ messageId: string;
209
+ threadId?: string;
210
+ author: {
211
+ id: string;
212
+ name: string;
213
+ };
214
+ content: ContentBlock[];
215
+ timestamp: string;
216
+ metadata?: Record<string, unknown>;
217
+ triggerInference?: boolean;
218
+ targetAgents?: string[];
219
+ }
220
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/types/events.ts"],"names":[],"mappings":"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"}