@open-multi-agent/core 1.4.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 (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +373 -0
  3. package/dist/agent/agent.d.ts +153 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +559 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/loop-detector.d.ts +39 -0
  8. package/dist/agent/loop-detector.d.ts.map +1 -0
  9. package/dist/agent/loop-detector.js +122 -0
  10. package/dist/agent/loop-detector.js.map +1 -0
  11. package/dist/agent/pool.d.ts +158 -0
  12. package/dist/agent/pool.d.ts.map +1 -0
  13. package/dist/agent/pool.js +320 -0
  14. package/dist/agent/pool.js.map +1 -0
  15. package/dist/agent/runner.d.ts +242 -0
  16. package/dist/agent/runner.d.ts.map +1 -0
  17. package/dist/agent/runner.js +943 -0
  18. package/dist/agent/runner.js.map +1 -0
  19. package/dist/agent/structured-output.d.ts +33 -0
  20. package/dist/agent/structured-output.d.ts.map +1 -0
  21. package/dist/agent/structured-output.js +116 -0
  22. package/dist/agent/structured-output.js.map +1 -0
  23. package/dist/cli/oma.d.ts +30 -0
  24. package/dist/cli/oma.d.ts.map +1 -0
  25. package/dist/cli/oma.js +433 -0
  26. package/dist/cli/oma.js.map +1 -0
  27. package/dist/dashboard/layout-tasks.d.ts +23 -0
  28. package/dist/dashboard/layout-tasks.d.ts.map +1 -0
  29. package/dist/dashboard/layout-tasks.js +79 -0
  30. package/dist/dashboard/layout-tasks.js.map +1 -0
  31. package/dist/dashboard/render-team-run-dashboard.d.ts +11 -0
  32. package/dist/dashboard/render-team-run-dashboard.d.ts.map +1 -0
  33. package/dist/dashboard/render-team-run-dashboard.js +456 -0
  34. package/dist/dashboard/render-team-run-dashboard.js.map +1 -0
  35. package/dist/errors.d.ts +14 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +20 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/index.d.ts +79 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +92 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/llm/adapter.d.ts +54 -0
  44. package/dist/llm/adapter.d.ts.map +1 -0
  45. package/dist/llm/adapter.js +101 -0
  46. package/dist/llm/adapter.js.map +1 -0
  47. package/dist/llm/anthropic.d.ts +57 -0
  48. package/dist/llm/anthropic.d.ts.map +1 -0
  49. package/dist/llm/anthropic.js +432 -0
  50. package/dist/llm/anthropic.js.map +1 -0
  51. package/dist/llm/azure-openai.d.ts +74 -0
  52. package/dist/llm/azure-openai.d.ts.map +1 -0
  53. package/dist/llm/azure-openai.js +267 -0
  54. package/dist/llm/azure-openai.js.map +1 -0
  55. package/dist/llm/bedrock.d.ts +41 -0
  56. package/dist/llm/bedrock.d.ts.map +1 -0
  57. package/dist/llm/bedrock.js +345 -0
  58. package/dist/llm/bedrock.js.map +1 -0
  59. package/dist/llm/copilot.d.ts +92 -0
  60. package/dist/llm/copilot.d.ts.map +1 -0
  61. package/dist/llm/copilot.js +433 -0
  62. package/dist/llm/copilot.js.map +1 -0
  63. package/dist/llm/deepseek.d.ts +21 -0
  64. package/dist/llm/deepseek.d.ts.map +1 -0
  65. package/dist/llm/deepseek.js +24 -0
  66. package/dist/llm/deepseek.js.map +1 -0
  67. package/dist/llm/gemini.d.ts +65 -0
  68. package/dist/llm/gemini.d.ts.map +1 -0
  69. package/dist/llm/gemini.js +427 -0
  70. package/dist/llm/gemini.js.map +1 -0
  71. package/dist/llm/grok.d.ts +21 -0
  72. package/dist/llm/grok.d.ts.map +1 -0
  73. package/dist/llm/grok.js +24 -0
  74. package/dist/llm/grok.js.map +1 -0
  75. package/dist/llm/minimax.d.ts +21 -0
  76. package/dist/llm/minimax.d.ts.map +1 -0
  77. package/dist/llm/minimax.js +24 -0
  78. package/dist/llm/minimax.js.map +1 -0
  79. package/dist/llm/openai-common.d.ts +65 -0
  80. package/dist/llm/openai-common.d.ts.map +1 -0
  81. package/dist/llm/openai-common.js +286 -0
  82. package/dist/llm/openai-common.js.map +1 -0
  83. package/dist/llm/openai.d.ts +63 -0
  84. package/dist/llm/openai.d.ts.map +1 -0
  85. package/dist/llm/openai.js +256 -0
  86. package/dist/llm/openai.js.map +1 -0
  87. package/dist/llm/qiniu.d.ts +21 -0
  88. package/dist/llm/qiniu.d.ts.map +1 -0
  89. package/dist/llm/qiniu.js +24 -0
  90. package/dist/llm/qiniu.js.map +1 -0
  91. package/dist/mcp.d.ts +3 -0
  92. package/dist/mcp.d.ts.map +1 -0
  93. package/dist/mcp.js +2 -0
  94. package/dist/mcp.js.map +1 -0
  95. package/dist/memory/shared.d.ts +162 -0
  96. package/dist/memory/shared.d.ts.map +1 -0
  97. package/dist/memory/shared.js +294 -0
  98. package/dist/memory/shared.js.map +1 -0
  99. package/dist/memory/store.d.ts +72 -0
  100. package/dist/memory/store.d.ts.map +1 -0
  101. package/dist/memory/store.js +121 -0
  102. package/dist/memory/store.js.map +1 -0
  103. package/dist/orchestrator/orchestrator.d.ts +245 -0
  104. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  105. package/dist/orchestrator/orchestrator.js +1400 -0
  106. package/dist/orchestrator/orchestrator.js.map +1 -0
  107. package/dist/orchestrator/scheduler.d.ts +112 -0
  108. package/dist/orchestrator/scheduler.d.ts.map +1 -0
  109. package/dist/orchestrator/scheduler.js +256 -0
  110. package/dist/orchestrator/scheduler.js.map +1 -0
  111. package/dist/task/queue.d.ts +191 -0
  112. package/dist/task/queue.d.ts.map +1 -0
  113. package/dist/task/queue.js +408 -0
  114. package/dist/task/queue.js.map +1 -0
  115. package/dist/task/task.d.ts +90 -0
  116. package/dist/task/task.d.ts.map +1 -0
  117. package/dist/task/task.js +206 -0
  118. package/dist/task/task.js.map +1 -0
  119. package/dist/team/messaging.d.ts +106 -0
  120. package/dist/team/messaging.d.ts.map +1 -0
  121. package/dist/team/messaging.js +183 -0
  122. package/dist/team/messaging.js.map +1 -0
  123. package/dist/team/team.d.ts +141 -0
  124. package/dist/team/team.d.ts.map +1 -0
  125. package/dist/team/team.js +293 -0
  126. package/dist/team/team.js.map +1 -0
  127. package/dist/tool/built-in/bash.d.ts +12 -0
  128. package/dist/tool/built-in/bash.d.ts.map +1 -0
  129. package/dist/tool/built-in/bash.js +133 -0
  130. package/dist/tool/built-in/bash.js.map +1 -0
  131. package/dist/tool/built-in/delegate.d.ts +29 -0
  132. package/dist/tool/built-in/delegate.d.ts.map +1 -0
  133. package/dist/tool/built-in/delegate.js +92 -0
  134. package/dist/tool/built-in/delegate.js.map +1 -0
  135. package/dist/tool/built-in/file-edit.d.ts +14 -0
  136. package/dist/tool/built-in/file-edit.d.ts.map +1 -0
  137. package/dist/tool/built-in/file-edit.js +130 -0
  138. package/dist/tool/built-in/file-edit.js.map +1 -0
  139. package/dist/tool/built-in/file-read.d.ts +12 -0
  140. package/dist/tool/built-in/file-read.d.ts.map +1 -0
  141. package/dist/tool/built-in/file-read.js +82 -0
  142. package/dist/tool/built-in/file-read.js.map +1 -0
  143. package/dist/tool/built-in/file-write.d.ts +11 -0
  144. package/dist/tool/built-in/file-write.d.ts.map +1 -0
  145. package/dist/tool/built-in/file-write.js +70 -0
  146. package/dist/tool/built-in/file-write.js.map +1 -0
  147. package/dist/tool/built-in/fs-walk.d.ts +23 -0
  148. package/dist/tool/built-in/fs-walk.d.ts.map +1 -0
  149. package/dist/tool/built-in/fs-walk.js +78 -0
  150. package/dist/tool/built-in/fs-walk.js.map +1 -0
  151. package/dist/tool/built-in/glob.d.ts +12 -0
  152. package/dist/tool/built-in/glob.d.ts.map +1 -0
  153. package/dist/tool/built-in/glob.js +82 -0
  154. package/dist/tool/built-in/glob.js.map +1 -0
  155. package/dist/tool/built-in/grep.d.ts +15 -0
  156. package/dist/tool/built-in/grep.d.ts.map +1 -0
  157. package/dist/tool/built-in/grep.js +218 -0
  158. package/dist/tool/built-in/grep.js.map +1 -0
  159. package/dist/tool/built-in/index.d.ts +48 -0
  160. package/dist/tool/built-in/index.d.ts.map +1 -0
  161. package/dist/tool/built-in/index.js +56 -0
  162. package/dist/tool/built-in/index.js.map +1 -0
  163. package/dist/tool/executor.d.ts +100 -0
  164. package/dist/tool/executor.d.ts.map +1 -0
  165. package/dist/tool/executor.js +184 -0
  166. package/dist/tool/executor.js.map +1 -0
  167. package/dist/tool/framework.d.ts +167 -0
  168. package/dist/tool/framework.d.ts.map +1 -0
  169. package/dist/tool/framework.js +402 -0
  170. package/dist/tool/framework.js.map +1 -0
  171. package/dist/tool/mcp.d.ts +31 -0
  172. package/dist/tool/mcp.d.ts.map +1 -0
  173. package/dist/tool/mcp.js +175 -0
  174. package/dist/tool/mcp.js.map +1 -0
  175. package/dist/tool/text-tool-extractor.d.ts +32 -0
  176. package/dist/tool/text-tool-extractor.d.ts.map +1 -0
  177. package/dist/tool/text-tool-extractor.js +195 -0
  178. package/dist/tool/text-tool-extractor.js.map +1 -0
  179. package/dist/types.d.ts +916 -0
  180. package/dist/types.d.ts.map +1 -0
  181. package/dist/types.js +8 -0
  182. package/dist/types.js.map +1 -0
  183. package/dist/utils/keywords.d.ts +18 -0
  184. package/dist/utils/keywords.d.ts.map +1 -0
  185. package/dist/utils/keywords.js +32 -0
  186. package/dist/utils/keywords.js.map +1 -0
  187. package/dist/utils/semaphore.d.ts +49 -0
  188. package/dist/utils/semaphore.d.ts.map +1 -0
  189. package/dist/utils/semaphore.js +89 -0
  190. package/dist/utils/semaphore.js.map +1 -0
  191. package/dist/utils/tokens.d.ts +7 -0
  192. package/dist/utils/tokens.d.ts.map +1 -0
  193. package/dist/utils/tokens.js +30 -0
  194. package/dist/utils/tokens.js.map +1 -0
  195. package/dist/utils/trace.d.ts +12 -0
  196. package/dist/utils/trace.d.ts.map +1 -0
  197. package/dist/utils/trace.js +30 -0
  198. package/dist/utils/trace.js.map +1 -0
  199. package/docs/DECISIONS.md +49 -0
  200. package/docs/cli.md +265 -0
  201. package/docs/context-management.md +24 -0
  202. package/docs/featured-partner.md +28 -0
  203. package/docs/observability.md +56 -0
  204. package/docs/providers.md +78 -0
  205. package/docs/shared-memory.md +27 -0
  206. package/docs/tool-configuration.md +152 -0
  207. package/package.json +96 -0
@@ -0,0 +1,206 @@
1
+ /**
2
+ * @fileoverview Pure task utility functions.
3
+ *
4
+ * These helpers operate on plain {@link Task} values without any mutable
5
+ * state, making them safe to use in reducers, tests, and reactive pipelines.
6
+ * Stateful orchestration belongs in {@link TaskQueue}.
7
+ */
8
+ import { randomUUID } from 'node:crypto';
9
+ // ---------------------------------------------------------------------------
10
+ // Factory
11
+ // ---------------------------------------------------------------------------
12
+ /**
13
+ * Creates a new {@link Task} with a generated UUID, `'pending'` status, and
14
+ * `createdAt`/`updatedAt` timestamps set to the current instant.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const task = createTask({
19
+ * title: 'Research competitors',
20
+ * description: 'Identify the top 5 competitors and their pricing',
21
+ * assignee: 'researcher',
22
+ * })
23
+ * ```
24
+ */
25
+ export function createTask(input) {
26
+ const now = new Date();
27
+ return {
28
+ id: randomUUID(),
29
+ title: input.title,
30
+ description: input.description,
31
+ status: 'pending',
32
+ assignee: input.assignee,
33
+ dependsOn: input.dependsOn ? [...input.dependsOn] : undefined,
34
+ memoryScope: input.memoryScope,
35
+ result: undefined,
36
+ createdAt: now,
37
+ updatedAt: now,
38
+ maxRetries: input.maxRetries,
39
+ retryDelayMs: input.retryDelayMs,
40
+ retryBackoff: input.retryBackoff,
41
+ };
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Readiness
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * Returns `true` when `task` can be started immediately.
48
+ *
49
+ * A task is considered ready when:
50
+ * 1. Its status is `'pending'`.
51
+ * 2. Every task listed in `task.dependsOn` has status `'completed'`.
52
+ *
53
+ * Tasks whose dependencies are missing from `allTasks` are treated as
54
+ * unresolvable and therefore **not** ready.
55
+ *
56
+ * @param task - The task to evaluate.
57
+ * @param allTasks - The full collection of tasks in the current queue/plan.
58
+ * @param taskById - Optional pre-built id→task map. When provided the function
59
+ * skips rebuilding the map, reducing the complexity of
60
+ * call-sites that invoke `isTaskReady` inside a loop from
61
+ * O(n²) to O(n).
62
+ */
63
+ export function isTaskReady(task, allTasks, taskById) {
64
+ if (task.status !== 'pending')
65
+ return false;
66
+ if (!task.dependsOn || task.dependsOn.length === 0)
67
+ return true;
68
+ const map = taskById ?? new Map(allTasks.map((t) => [t.id, t]));
69
+ for (const depId of task.dependsOn) {
70
+ const dep = map.get(depId);
71
+ if (!dep || dep.status !== 'completed')
72
+ return false;
73
+ }
74
+ return true;
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Topological sort
78
+ // ---------------------------------------------------------------------------
79
+ /**
80
+ * Returns `tasks` sorted so that each task appears after all of its
81
+ * dependencies — a standard topological (Kahn's algorithm) ordering.
82
+ *
83
+ * Tasks with no dependencies come first. If the graph contains a cycle the
84
+ * function returns a partial result containing only the tasks that could be
85
+ * ordered; use {@link validateTaskDependencies} to detect cycles before calling
86
+ * this function in production paths.
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * const ordered = getTaskDependencyOrder(tasks)
91
+ * for (const task of ordered) {
92
+ * await run(task)
93
+ * }
94
+ * ```
95
+ */
96
+ export function getTaskDependencyOrder(tasks) {
97
+ if (tasks.length === 0)
98
+ return [];
99
+ const taskById = new Map(tasks.map((t) => [t.id, t]));
100
+ // Build adjacency: dependsOn edges become "predecessors" for in-degree count.
101
+ const inDegree = new Map();
102
+ // successors[id] = list of task IDs that depend on `id`
103
+ const successors = new Map();
104
+ for (const task of tasks) {
105
+ if (!inDegree.has(task.id))
106
+ inDegree.set(task.id, 0);
107
+ if (!successors.has(task.id))
108
+ successors.set(task.id, []);
109
+ for (const depId of task.dependsOn ?? []) {
110
+ // Only count dependencies that exist in this task set.
111
+ if (taskById.has(depId)) {
112
+ inDegree.set(task.id, (inDegree.get(task.id) ?? 0) + 1);
113
+ const deps = successors.get(depId) ?? [];
114
+ deps.push(task.id);
115
+ successors.set(depId, deps);
116
+ }
117
+ }
118
+ }
119
+ // Kahn's algorithm: start with all nodes of in-degree 0.
120
+ const queue = [];
121
+ for (const [id, degree] of inDegree) {
122
+ if (degree === 0)
123
+ queue.push(id);
124
+ }
125
+ const ordered = [];
126
+ while (queue.length > 0) {
127
+ const id = queue.shift();
128
+ const task = taskById.get(id);
129
+ if (task)
130
+ ordered.push(task);
131
+ for (const successorId of successors.get(id) ?? []) {
132
+ const newDegree = (inDegree.get(successorId) ?? 0) - 1;
133
+ inDegree.set(successorId, newDegree);
134
+ if (newDegree === 0)
135
+ queue.push(successorId);
136
+ }
137
+ }
138
+ return ordered;
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // Validation
142
+ // ---------------------------------------------------------------------------
143
+ /**
144
+ * Validates the dependency graph of a task collection.
145
+ *
146
+ * Checks for:
147
+ * - References to unknown task IDs in `dependsOn`.
148
+ * - Cycles (a task depending on itself, directly or transitively).
149
+ * - Self-dependencies (`task.dependsOn` includes its own `id`).
150
+ *
151
+ * @returns An object with `valid: true` when no issues were found, or
152
+ * `valid: false` with a non-empty `errors` array describing each
153
+ * problem.
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * const { valid, errors } = validateTaskDependencies(tasks)
158
+ * if (!valid) throw new Error(errors.join('\n'))
159
+ * ```
160
+ */
161
+ export function validateTaskDependencies(tasks) {
162
+ const errors = [];
163
+ const taskById = new Map(tasks.map((t) => [t.id, t]));
164
+ // Pass 1: check for unknown references and self-dependencies.
165
+ for (const task of tasks) {
166
+ for (const depId of task.dependsOn ?? []) {
167
+ if (depId === task.id) {
168
+ errors.push(`Task "${task.title}" (${task.id}) depends on itself.`);
169
+ continue;
170
+ }
171
+ if (!taskById.has(depId)) {
172
+ errors.push(`Task "${task.title}" (${task.id}) references unknown dependency "${depId}".`);
173
+ }
174
+ }
175
+ }
176
+ // Pass 2: cycle detection via DFS colouring (white=0, grey=1, black=2).
177
+ const colour = new Map();
178
+ for (const task of tasks)
179
+ colour.set(task.id, 0);
180
+ const visit = (id, path) => {
181
+ if (colour.get(id) === 2)
182
+ return; // Already fully explored.
183
+ if (colour.get(id) === 1) {
184
+ // Found a back-edge — cycle.
185
+ const cycleStart = path.indexOf(id);
186
+ const cycle = path.slice(cycleStart).concat(id);
187
+ errors.push(`Cyclic dependency detected: ${cycle.join(' -> ')}`);
188
+ return;
189
+ }
190
+ colour.set(id, 1);
191
+ const task = taskById.get(id);
192
+ for (const depId of task?.dependsOn ?? []) {
193
+ if (taskById.has(depId)) {
194
+ visit(depId, [...path, id]);
195
+ }
196
+ }
197
+ colour.set(id, 2);
198
+ };
199
+ for (const task of tasks) {
200
+ if (colour.get(task.id) === 0) {
201
+ visit(task.id, []);
202
+ }
203
+ }
204
+ return { valid: errors.length === 0, errors };
205
+ }
206
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/task/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @fileoverview Inter-agent message bus.
3
+ *
4
+ * Provides a lightweight pub/sub system so agents can exchange typed messages
5
+ * without direct references to each other. All messages are retained in memory
6
+ * for replay and audit; read-state is tracked per recipient.
7
+ */
8
+ /** A single message exchanged between agents (or broadcast to all). */
9
+ export interface Message {
10
+ /** Stable UUID for this message. */
11
+ readonly id: string;
12
+ /** Name of the sending agent. */
13
+ readonly from: string;
14
+ /**
15
+ * Recipient agent name, or `'*'` when the message is a broadcast intended
16
+ * for every agent except the sender.
17
+ */
18
+ readonly to: string;
19
+ readonly content: string;
20
+ readonly timestamp: Date;
21
+ }
22
+ /**
23
+ * In-memory message bus for inter-agent communication.
24
+ *
25
+ * Agents can send point-to-point messages or broadcasts. Subscribers are
26
+ * notified synchronously (within the same microtask) when a new message
27
+ * arrives addressed to them.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const bus = new MessageBus()
32
+ *
33
+ * const unsubscribe = bus.subscribe('worker', (msg) => {
34
+ * console.log(`worker received: ${msg.content}`)
35
+ * })
36
+ *
37
+ * bus.send('coordinator', 'worker', 'Start task A')
38
+ * bus.broadcast('coordinator', 'All agents: stand by')
39
+ *
40
+ * unsubscribe()
41
+ * ```
42
+ */
43
+ export declare class MessageBus {
44
+ /** All messages ever sent, in insertion order. */
45
+ private readonly messages;
46
+ /**
47
+ * Per-agent set of message IDs that have already been marked as read.
48
+ * A message absent from this set is considered unread.
49
+ */
50
+ private readonly readState;
51
+ /**
52
+ * Active subscribers keyed by agent name. Each subscriber is a callback
53
+ * paired with a unique subscription ID used for unsubscription.
54
+ */
55
+ private readonly subscribers;
56
+ /**
57
+ * Send a message from `from` to `to`.
58
+ *
59
+ * @returns The persisted {@link Message} including its generated ID and timestamp.
60
+ */
61
+ send(from: string, to: string, content: string): Message;
62
+ /**
63
+ * Broadcast a message from `from` to all other agents (`to === '*'`).
64
+ *
65
+ * @returns The persisted broadcast {@link Message}.
66
+ */
67
+ broadcast(from: string, content: string): Message;
68
+ /**
69
+ * Returns messages that have not yet been marked as read by `agentName`,
70
+ * including both direct messages and broadcasts addressed to them.
71
+ */
72
+ getUnread(agentName: string): Message[];
73
+ /**
74
+ * Returns every message (read or unread) addressed to `agentName`,
75
+ * preserving insertion order.
76
+ */
77
+ getAll(agentName: string): Message[];
78
+ /**
79
+ * Mark a set of messages as read for `agentName`.
80
+ * Passing IDs that were already marked, or do not exist, is a no-op.
81
+ */
82
+ markRead(agentName: string, messageIds: string[]): void;
83
+ /**
84
+ * Returns all messages exchanged between `agent1` and `agent2` (in either
85
+ * direction), sorted chronologically.
86
+ */
87
+ getConversation(agent1: string, agent2: string): Message[];
88
+ /**
89
+ * Subscribe to new messages addressed to `agentName`.
90
+ *
91
+ * The `callback` is invoked synchronously after each matching message is
92
+ * persisted. Returns an unsubscribe function; calling it is idempotent.
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * const off = bus.subscribe('agent-b', (msg) => handleMessage(msg))
97
+ * // Later…
98
+ * off()
99
+ * ```
100
+ */
101
+ subscribe(agentName: string, callback: (message: Message) => void): () => void;
102
+ private persist;
103
+ private notifySubscribers;
104
+ private fireCallbacks;
105
+ }
106
+ //# sourceMappingURL=messaging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/team/messaging.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,uEAAuE;AACvE,MAAM,WAAW,OAAO;IACtB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;CACzB;AAmBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,UAAU;IACrB,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAEzC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAE3D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGzB;IAMH;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAYxD;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAQjD;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAOvC;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAIpC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;IAYvD;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE;IAY1D;;;;;;;;;;;;OAYG;IACH,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GACnC,MAAM,IAAI;IAiBb,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,aAAa;CAOtB"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * @fileoverview Inter-agent message bus.
3
+ *
4
+ * Provides a lightweight pub/sub system so agents can exchange typed messages
5
+ * without direct references to each other. All messages are retained in memory
6
+ * for replay and audit; read-state is tracked per recipient.
7
+ */
8
+ import { randomUUID } from 'node:crypto';
9
+ // ---------------------------------------------------------------------------
10
+ // Internal helpers
11
+ // ---------------------------------------------------------------------------
12
+ /** Returns true when `message` is addressed to `agentName`. */
13
+ function isAddressedTo(message, agentName) {
14
+ if (message.to === '*') {
15
+ // Broadcasts are delivered to everyone except the sender.
16
+ return message.from !== agentName;
17
+ }
18
+ return message.to === agentName;
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // MessageBus
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * In-memory message bus for inter-agent communication.
25
+ *
26
+ * Agents can send point-to-point messages or broadcasts. Subscribers are
27
+ * notified synchronously (within the same microtask) when a new message
28
+ * arrives addressed to them.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * const bus = new MessageBus()
33
+ *
34
+ * const unsubscribe = bus.subscribe('worker', (msg) => {
35
+ * console.log(`worker received: ${msg.content}`)
36
+ * })
37
+ *
38
+ * bus.send('coordinator', 'worker', 'Start task A')
39
+ * bus.broadcast('coordinator', 'All agents: stand by')
40
+ *
41
+ * unsubscribe()
42
+ * ```
43
+ */
44
+ export class MessageBus {
45
+ /** All messages ever sent, in insertion order. */
46
+ messages = [];
47
+ /**
48
+ * Per-agent set of message IDs that have already been marked as read.
49
+ * A message absent from this set is considered unread.
50
+ */
51
+ readState = new Map();
52
+ /**
53
+ * Active subscribers keyed by agent name. Each subscriber is a callback
54
+ * paired with a unique subscription ID used for unsubscription.
55
+ */
56
+ subscribers = new Map();
57
+ // ---------------------------------------------------------------------------
58
+ // Write operations
59
+ // ---------------------------------------------------------------------------
60
+ /**
61
+ * Send a message from `from` to `to`.
62
+ *
63
+ * @returns The persisted {@link Message} including its generated ID and timestamp.
64
+ */
65
+ send(from, to, content) {
66
+ const message = {
67
+ id: randomUUID(),
68
+ from,
69
+ to,
70
+ content,
71
+ timestamp: new Date(),
72
+ };
73
+ this.persist(message);
74
+ return message;
75
+ }
76
+ /**
77
+ * Broadcast a message from `from` to all other agents (`to === '*'`).
78
+ *
79
+ * @returns The persisted broadcast {@link Message}.
80
+ */
81
+ broadcast(from, content) {
82
+ return this.send(from, '*', content);
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Read operations
86
+ // ---------------------------------------------------------------------------
87
+ /**
88
+ * Returns messages that have not yet been marked as read by `agentName`,
89
+ * including both direct messages and broadcasts addressed to them.
90
+ */
91
+ getUnread(agentName) {
92
+ const read = this.readState.get(agentName) ?? new Set();
93
+ return this.messages.filter((m) => isAddressedTo(m, agentName) && !read.has(m.id));
94
+ }
95
+ /**
96
+ * Returns every message (read or unread) addressed to `agentName`,
97
+ * preserving insertion order.
98
+ */
99
+ getAll(agentName) {
100
+ return this.messages.filter((m) => isAddressedTo(m, agentName));
101
+ }
102
+ /**
103
+ * Mark a set of messages as read for `agentName`.
104
+ * Passing IDs that were already marked, or do not exist, is a no-op.
105
+ */
106
+ markRead(agentName, messageIds) {
107
+ if (messageIds.length === 0)
108
+ return;
109
+ let read = this.readState.get(agentName);
110
+ if (!read) {
111
+ read = new Set();
112
+ this.readState.set(agentName, read);
113
+ }
114
+ for (const id of messageIds) {
115
+ read.add(id);
116
+ }
117
+ }
118
+ /**
119
+ * Returns all messages exchanged between `agent1` and `agent2` (in either
120
+ * direction), sorted chronologically.
121
+ */
122
+ getConversation(agent1, agent2) {
123
+ return this.messages.filter((m) => (m.from === agent1 && m.to === agent2) ||
124
+ (m.from === agent2 && m.to === agent1));
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Subscriptions
128
+ // ---------------------------------------------------------------------------
129
+ /**
130
+ * Subscribe to new messages addressed to `agentName`.
131
+ *
132
+ * The `callback` is invoked synchronously after each matching message is
133
+ * persisted. Returns an unsubscribe function; calling it is idempotent.
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * const off = bus.subscribe('agent-b', (msg) => handleMessage(msg))
138
+ * // Later…
139
+ * off()
140
+ * ```
141
+ */
142
+ subscribe(agentName, callback) {
143
+ let agentSubs = this.subscribers.get(agentName);
144
+ if (!agentSubs) {
145
+ agentSubs = new Map();
146
+ this.subscribers.set(agentName, agentSubs);
147
+ }
148
+ const id = Symbol();
149
+ agentSubs.set(id, callback);
150
+ return () => {
151
+ agentSubs.delete(id);
152
+ };
153
+ }
154
+ // ---------------------------------------------------------------------------
155
+ // Private helpers
156
+ // ---------------------------------------------------------------------------
157
+ persist(message) {
158
+ this.messages.push(message);
159
+ this.notifySubscribers(message);
160
+ }
161
+ notifySubscribers(message) {
162
+ // Notify direct subscribers of `message.to` (unless broadcast).
163
+ if (message.to !== '*') {
164
+ this.fireCallbacks(message.to, message);
165
+ return;
166
+ }
167
+ // Broadcast: notify all subscribers except the sender.
168
+ for (const [agentName, subs] of this.subscribers) {
169
+ if (agentName !== message.from && subs.size > 0) {
170
+ this.fireCallbacks(agentName, message);
171
+ }
172
+ }
173
+ }
174
+ fireCallbacks(agentName, message) {
175
+ const subs = this.subscribers.get(agentName);
176
+ if (!subs)
177
+ return;
178
+ for (const callback of subs.values()) {
179
+ callback(message);
180
+ }
181
+ }
182
+ }
183
+ //# sourceMappingURL=messaging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/team/messaging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * @fileoverview Team — the central coordination object for a named group of agents.
3
+ *
4
+ * A {@link Team} owns the agent roster, the inter-agent {@link MessageBus},
5
+ * the {@link TaskQueue}, and (optionally) a {@link SharedMemory} instance.
6
+ * It also exposes a typed event bus so orchestrators can react to lifecycle
7
+ * events without polling.
8
+ */
9
+ import type { AgentConfig, MemoryStore, Task, TeamConfig } from '../types.js';
10
+ import { SharedMemory } from '../memory/shared.js';
11
+ import type { Message } from './messaging.js';
12
+ export type { Message };
13
+ /**
14
+ * Coordinates a named group of agents with shared messaging, task queuing,
15
+ * and optional shared memory.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const team = new Team({
20
+ * name: 'research-team',
21
+ * agents: [researcherConfig, writerConfig],
22
+ * sharedMemory: true,
23
+ * maxConcurrency: 2,
24
+ * })
25
+ *
26
+ * team.on('task:complete', (data) => {
27
+ * const event = data as OrchestratorEvent
28
+ * console.log(`Task done: ${event.task}`)
29
+ * })
30
+ *
31
+ * const task = team.addTask({
32
+ * title: 'Research topic',
33
+ * description: 'Gather background on quantum computing',
34
+ * status: 'pending',
35
+ * assignee: 'researcher',
36
+ * })
37
+ * ```
38
+ */
39
+ export declare class Team {
40
+ readonly name: string;
41
+ readonly config: TeamConfig;
42
+ private readonly agentMap;
43
+ private readonly bus;
44
+ private readonly queue;
45
+ private readonly memory;
46
+ private readonly events;
47
+ constructor(config: TeamConfig);
48
+ /** Returns a shallow copy of the agent configs in registration order. */
49
+ getAgents(): AgentConfig[];
50
+ /**
51
+ * Looks up an agent by name.
52
+ *
53
+ * @returns The {@link AgentConfig} or `undefined` when the name is not known.
54
+ */
55
+ getAgent(name: string): AgentConfig | undefined;
56
+ /**
57
+ * Sends a point-to-point message from `from` to `to`.
58
+ *
59
+ * The message is persisted on the bus and any active subscribers for `to`
60
+ * are notified synchronously.
61
+ */
62
+ sendMessage(from: string, to: string, content: string): void;
63
+ /**
64
+ * Returns all messages (read or unread) addressed to `agentName`, in
65
+ * chronological order.
66
+ */
67
+ getMessages(agentName: string): Message[];
68
+ /**
69
+ * Broadcasts `content` from `from` to every other agent.
70
+ *
71
+ * The `to` field of the resulting message is `'*'`.
72
+ */
73
+ broadcast(from: string, content: string): void;
74
+ /**
75
+ * Creates a new task, adds it to the queue, and returns the persisted
76
+ * {@link Task} (with generated `id`, `createdAt`, and `updatedAt`).
77
+ *
78
+ * @param task - Everything except the generated fields.
79
+ */
80
+ addTask(task: Omit<Task, 'id' | 'createdAt' | 'updatedAt'>): Task;
81
+ /** Returns a snapshot of all tasks in the queue (any status). */
82
+ getTasks(): Task[];
83
+ /** Returns all tasks whose `assignee` is `agentName`. */
84
+ getTasksByAssignee(agentName: string): Task[];
85
+ /**
86
+ * Applies a partial update to the task identified by `taskId`.
87
+ *
88
+ * @throws {Error} when the task is not found.
89
+ */
90
+ updateTask(taskId: string, update: Partial<Task>): Task;
91
+ /**
92
+ * Returns the next `'pending'` task for `agentName`, respecting dependencies.
93
+ *
94
+ * Tries to find a task explicitly assigned to the agent first; falls back to
95
+ * the first unassigned pending task.
96
+ *
97
+ * @returns `undefined` when no ready task exists for this agent.
98
+ */
99
+ getNextTask(agentName: string): Task | undefined;
100
+ /**
101
+ * Returns the shared {@link MemoryStore} for this team, or `undefined` if
102
+ * `sharedMemory` was not enabled in {@link TeamConfig}.
103
+ *
104
+ * Note: the returned value satisfies the {@link MemoryStore} interface.
105
+ * Callers that need the full {@link SharedMemory} API can use the
106
+ * `as SharedMemory` cast, but depending on the concrete type is discouraged.
107
+ */
108
+ getSharedMemory(): MemoryStore | undefined;
109
+ /**
110
+ * Returns the raw {@link SharedMemory} instance (team-internal accessor).
111
+ * Use this when you need the namespacing / `getSummary` features.
112
+ *
113
+ * @internal
114
+ */
115
+ getSharedMemoryInstance(): SharedMemory | undefined;
116
+ /**
117
+ * Subscribes to a team event.
118
+ *
119
+ * Built-in events:
120
+ * - `'task:ready'` — emitted when a task becomes runnable.
121
+ * - `'task:complete'` — emitted when a task completes successfully.
122
+ * - `'task:failed'` — emitted when a task fails.
123
+ * - `'all:complete'` — emitted when every task in the queue has terminated.
124
+ * - `'message'` — emitted on point-to-point messages.
125
+ * - `'broadcast'` — emitted on broadcast messages.
126
+ *
127
+ * `data` is typed as `unknown`; cast to {@link OrchestratorEvent} for
128
+ * structured access.
129
+ *
130
+ * @returns An unsubscribe function.
131
+ */
132
+ on(event: string, handler: (data: unknown) => void): () => void;
133
+ /**
134
+ * Emits a custom event on the team's event bus.
135
+ *
136
+ * Orchestrators can use this to signal domain-specific lifecycle milestones
137
+ * (e.g. `'phase:research:complete'`) without modifying the Team class.
138
+ */
139
+ emit(event: string, data: unknown): void;
140
+ }
141
+ //# sourceMappingURL=team.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team.d.ts","sourceRoot":"","sources":["../../src/team/team.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAEX,IAAI,EAEJ,UAAU,EACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAI7C,YAAY,EAAE,OAAO,EAAE,CAAA;AAsCvB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,IAAI;IACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAE3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAErB,MAAM,EAAE,UAAU;IA2D9B,yEAAyE;IACzE,SAAS,IAAI,WAAW,EAAE;IAI1B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAQ/C;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAU5D;;;OAGG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAIzC;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAc9C;;;;;OAKG;IACH,OAAO,CACL,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACjD,IAAI;IAkBP,iEAAiE;IACjE,QAAQ,IAAI,IAAI,EAAE;IAIlB,yDAAyD;IACzD,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE;IAI7C;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAUvD;;;;;;;OAOG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAahD;;;;;;;OAOG;IACH,eAAe,IAAI,WAAW,GAAG,SAAS;IAI1C;;;;;OAKG;IACH,uBAAuB,IAAI,YAAY,GAAG,SAAS;IAQnD;;;;;;;;;;;;;;;OAeG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAI/D;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;CAGzC"}