orbitx 0.2.9 → 0.3.2

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 (213) hide show
  1. package/Readme.md +478 -456
  2. package/dist/agents/backend.d.ts +4 -0
  3. package/dist/agents/backend.d.ts.map +1 -0
  4. package/dist/agents/backend.js +54 -0
  5. package/dist/agents/backend.js.map +1 -0
  6. package/dist/agents/frontend.d.ts +4 -0
  7. package/dist/agents/frontend.d.ts.map +1 -0
  8. package/dist/agents/frontend.js +50 -0
  9. package/dist/agents/frontend.js.map +1 -0
  10. package/dist/agents/index.d.ts +10 -0
  11. package/dist/agents/index.d.ts.map +1 -0
  12. package/dist/agents/index.js +22 -0
  13. package/dist/agents/index.js.map +1 -0
  14. package/dist/agents/planner.d.ts +4 -0
  15. package/dist/agents/planner.d.ts.map +1 -0
  16. package/dist/agents/planner.js +86 -0
  17. package/dist/agents/planner.js.map +1 -0
  18. package/dist/agents/protocol.d.ts +5 -0
  19. package/dist/agents/protocol.d.ts.map +1 -0
  20. package/dist/agents/protocol.js +70 -0
  21. package/dist/agents/protocol.js.map +1 -0
  22. package/dist/agents/reasoner.d.ts +5 -0
  23. package/dist/agents/reasoner.d.ts.map +1 -0
  24. package/dist/agents/reasoner.js +96 -0
  25. package/dist/agents/reasoner.js.map +1 -0
  26. package/dist/agents/research.d.ts +4 -0
  27. package/dist/agents/research.d.ts.map +1 -0
  28. package/dist/agents/research.js +28 -0
  29. package/dist/agents/research.js.map +1 -0
  30. package/dist/agents/tester.d.ts +4 -0
  31. package/dist/agents/tester.d.ts.map +1 -0
  32. package/dist/agents/tester.js +70 -0
  33. package/dist/agents/tester.js.map +1 -0
  34. package/dist/core/agent-definition.d.ts +61 -0
  35. package/dist/core/agent-definition.d.ts.map +1 -0
  36. package/dist/core/agent-definition.js +82 -0
  37. package/dist/core/agent-definition.js.map +1 -0
  38. package/dist/core/ai-ask.d.ts +28 -0
  39. package/dist/core/ai-ask.d.ts.map +1 -0
  40. package/dist/core/ai-ask.js +80 -0
  41. package/dist/core/ai-ask.js.map +1 -0
  42. package/dist/core/ai-provider.d.ts +3 -0
  43. package/dist/core/ai-provider.d.ts.map +1 -1
  44. package/dist/core/ai-provider.js.map +1 -1
  45. package/dist/core/anthropic-provider.d.ts +1 -0
  46. package/dist/core/anthropic-provider.d.ts.map +1 -1
  47. package/dist/core/anthropic-provider.js +3 -0
  48. package/dist/core/anthropic-provider.js.map +1 -1
  49. package/dist/core/base-agent.d.ts +51 -28
  50. package/dist/core/base-agent.d.ts.map +1 -1
  51. package/dist/core/base-agent.js +118 -26
  52. package/dist/core/base-agent.js.map +1 -1
  53. package/dist/core/deepseek-provider.d.ts +1 -0
  54. package/dist/core/deepseek-provider.d.ts.map +1 -1
  55. package/dist/core/deepseek-provider.js +3 -0
  56. package/dist/core/deepseek-provider.js.map +1 -1
  57. package/dist/core/mcp-auto-execution-policy.d.ts +22 -0
  58. package/dist/core/mcp-auto-execution-policy.d.ts.map +1 -0
  59. package/dist/core/mcp-auto-execution-policy.js +85 -0
  60. package/dist/core/mcp-auto-execution-policy.js.map +1 -0
  61. package/dist/core/mcp-computer.d.ts +14 -1
  62. package/dist/core/mcp-computer.d.ts.map +1 -1
  63. package/dist/core/mcp-computer.js +352 -71
  64. package/dist/core/mcp-computer.js.map +1 -1
  65. package/dist/core/ollama-provider.d.ts +1 -0
  66. package/dist/core/ollama-provider.d.ts.map +1 -1
  67. package/dist/core/ollama-provider.js +3 -0
  68. package/dist/core/ollama-provider.js.map +1 -1
  69. package/dist/core/openai-provider.d.ts +1 -0
  70. package/dist/core/openai-provider.d.ts.map +1 -1
  71. package/dist/core/openai-provider.js +3 -0
  72. package/dist/core/openai-provider.js.map +1 -1
  73. package/dist/core/stateless-agent.d.ts +30 -0
  74. package/dist/core/stateless-agent.d.ts.map +1 -0
  75. package/dist/core/stateless-agent.js +79 -0
  76. package/dist/core/stateless-agent.js.map +1 -0
  77. package/dist/core/swarm-base.d.ts +88 -0
  78. package/dist/core/swarm-base.d.ts.map +1 -0
  79. package/dist/core/swarm-base.js +427 -0
  80. package/dist/core/swarm-base.js.map +1 -0
  81. package/dist/index.d.ts +13 -5
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +7 -3
  84. package/dist/index.js.map +1 -1
  85. package/dist/tests/agents/default-agents.test.d.ts +2 -0
  86. package/dist/tests/agents/default-agents.test.d.ts.map +1 -0
  87. package/dist/tests/agents/default-agents.test.js +106 -0
  88. package/dist/tests/agents/default-agents.test.js.map +1 -0
  89. package/dist/tests/core/agent-definition.test.d.ts +2 -0
  90. package/dist/tests/core/agent-definition.test.d.ts.map +1 -0
  91. package/dist/tests/core/agent-definition.test.js +99 -0
  92. package/dist/tests/core/agent-definition.test.js.map +1 -0
  93. package/dist/tests/core/ai-ask.test.d.ts +2 -0
  94. package/dist/tests/core/ai-ask.test.d.ts.map +1 -0
  95. package/dist/tests/core/ai-ask.test.js +101 -0
  96. package/dist/tests/core/ai-ask.test.js.map +1 -0
  97. package/dist/tests/core/mcp-auto-execution-policy.test.d.ts +2 -0
  98. package/dist/tests/core/mcp-auto-execution-policy.test.d.ts.map +1 -0
  99. package/dist/tests/core/mcp-auto-execution-policy.test.js +107 -0
  100. package/dist/tests/core/mcp-auto-execution-policy.test.js.map +1 -0
  101. package/dist/tests/core/scripted-provider.d.ts +38 -0
  102. package/dist/tests/core/scripted-provider.d.ts.map +1 -0
  103. package/dist/tests/core/scripted-provider.js +85 -0
  104. package/dist/tests/core/scripted-provider.js.map +1 -0
  105. package/dist/tests/core/stateless-agent.test.d.ts +2 -0
  106. package/dist/tests/core/stateless-agent.test.d.ts.map +1 -0
  107. package/dist/tests/core/stateless-agent.test.js +73 -0
  108. package/dist/tests/core/stateless-agent.test.js.map +1 -0
  109. package/dist/tests/core/swarm-base.test.d.ts +2 -0
  110. package/dist/tests/core/swarm-base.test.d.ts.map +1 -0
  111. package/dist/tests/core/swarm-base.test.js +387 -0
  112. package/dist/tests/core/swarm-base.test.js.map +1 -0
  113. package/dist/tests/index.d.ts +6 -0
  114. package/dist/tests/index.d.ts.map +1 -1
  115. package/dist/tests/index.js +6 -0
  116. package/dist/tests/index.js.map +1 -1
  117. package/dist/tests/tools/agent/agent-tools.test.js +225 -153
  118. package/dist/tests/tools/agent/agent-tools.test.js.map +1 -1
  119. package/dist/tools/agent/active.d.ts +5 -0
  120. package/dist/tools/agent/active.d.ts.map +1 -0
  121. package/dist/tools/agent/active.js +40 -0
  122. package/dist/tools/agent/active.js.map +1 -0
  123. package/dist/tools/agent/fire.d.ts +5 -0
  124. package/dist/tools/agent/fire.d.ts.map +1 -0
  125. package/dist/tools/agent/fire.js +38 -0
  126. package/dist/tools/agent/fire.js.map +1 -0
  127. package/dist/tools/agent/hire.d.ts +2 -2
  128. package/dist/tools/agent/hire.d.ts.map +1 -1
  129. package/dist/tools/agent/hire.js +43 -10
  130. package/dist/tools/agent/hire.js.map +1 -1
  131. package/dist/tools/agent/index.d.ts +22 -19
  132. package/dist/tools/agent/index.d.ts.map +1 -1
  133. package/dist/tools/agent/index.js +29 -21
  134. package/dist/tools/agent/index.js.map +1 -1
  135. package/dist/tools/agent/prompt.d.ts +2 -2
  136. package/dist/tools/agent/prompt.d.ts.map +1 -1
  137. package/dist/tools/agent/prompt.js +19 -53
  138. package/dist/tools/agent/prompt.js.map +1 -1
  139. package/dist/tools/agent/registry.d.ts +74 -24
  140. package/dist/tools/agent/registry.d.ts.map +1 -1
  141. package/dist/tools/agent/registry.js +93 -48
  142. package/dist/tools/agent/registry.js.map +1 -1
  143. package/dist/tools/agent/report-group.d.ts +5 -0
  144. package/dist/tools/agent/report-group.d.ts.map +1 -0
  145. package/dist/tools/agent/report-group.js +50 -0
  146. package/dist/tools/agent/report-group.js.map +1 -0
  147. package/dist/tools/agent/report-parent.d.ts +5 -0
  148. package/dist/tools/agent/report-parent.d.ts.map +1 -0
  149. package/dist/tools/agent/report-parent.js +36 -0
  150. package/dist/tools/agent/report-parent.js.map +1 -0
  151. package/dist/tools/agent/types.d.ts +5 -0
  152. package/dist/tools/agent/types.d.ts.map +1 -0
  153. package/dist/tools/agent/types.js +17 -0
  154. package/dist/tools/agent/types.js.map +1 -0
  155. package/docs/agents.md +249 -228
  156. package/docs/api-reference.md +9 -4
  157. package/docs/getting-started.md +78 -78
  158. package/docs/index.md +24 -23
  159. package/docs/mcp-architecture.md +71 -6
  160. package/docs/providers.md +258 -254
  161. package/docs/skills.md +0 -1
  162. package/docs/streaming.md +133 -133
  163. package/docs/swarm.md +503 -0
  164. package/docs/tools.md +214 -212
  165. package/package.json +1 -1
  166. package/dist/core/image-describer.d.ts +0 -19
  167. package/dist/core/image-describer.d.ts.map +0 -1
  168. package/dist/core/image-describer.js +0 -37
  169. package/dist/core/image-describer.js.map +0 -1
  170. package/dist/core/worker-agent.d.ts +0 -43
  171. package/dist/core/worker-agent.d.ts.map +0 -1
  172. package/dist/core/worker-agent.js +0 -40
  173. package/dist/core/worker-agent.js.map +0 -1
  174. package/dist/skills/shopping.d.ts +0 -4
  175. package/dist/skills/shopping.d.ts.map +0 -1
  176. package/dist/skills/shopping.js +0 -71
  177. package/dist/skills/shopping.js.map +0 -1
  178. package/dist/tools/agent/interaction.d.ts +0 -25
  179. package/dist/tools/agent/interaction.d.ts.map +0 -1
  180. package/dist/tools/agent/interaction.js +0 -14
  181. package/dist/tools/agent/interaction.js.map +0 -1
  182. package/dist/tools/agent/list.d.ts +0 -5
  183. package/dist/tools/agent/list.d.ts.map +0 -1
  184. package/dist/tools/agent/list.js +0 -16
  185. package/dist/tools/agent/list.js.map +0 -1
  186. package/dist/tools/agent/report.d.ts +0 -12
  187. package/dist/tools/agent/report.d.ts.map +0 -1
  188. package/dist/tools/agent/report.js +0 -31
  189. package/dist/tools/agent/report.js.map +0 -1
  190. package/dist/tools/bash/interaction.d.ts +0 -29
  191. package/dist/tools/bash/interaction.d.ts.map +0 -1
  192. package/dist/tools/bash/interaction.js +0 -13
  193. package/dist/tools/bash/interaction.js.map +0 -1
  194. package/dist/tools/browser/interaction.d.ts +0 -49
  195. package/dist/tools/browser/interaction.d.ts.map +0 -1
  196. package/dist/tools/browser/interaction.js +0 -14
  197. package/dist/tools/browser/interaction.js.map +0 -1
  198. package/dist/tools/fs/interaction.d.ts +0 -37
  199. package/dist/tools/fs/interaction.d.ts.map +0 -1
  200. package/dist/tools/fs/interaction.js +0 -13
  201. package/dist/tools/fs/interaction.js.map +0 -1
  202. package/dist/tools/present/interaction.d.ts +0 -17
  203. package/dist/tools/present/interaction.d.ts.map +0 -1
  204. package/dist/tools/present/interaction.js +0 -15
  205. package/dist/tools/present/interaction.js.map +0 -1
  206. package/dist/tools/question-answer/interaction.d.ts +0 -14
  207. package/dist/tools/question-answer/interaction.d.ts.map +0 -1
  208. package/dist/tools/question-answer/interaction.js +0 -13
  209. package/dist/tools/question-answer/interaction.js.map +0 -1
  210. package/dist/tools/todo/interaction.d.ts +0 -30
  211. package/dist/tools/todo/interaction.d.ts.map +0 -1
  212. package/dist/tools/todo/interaction.js +0 -13
  213. package/dist/tools/todo/interaction.js.map +0 -1
@@ -1,68 +1,113 @@
1
+ import { randomUUID } from "crypto";
2
+ import EventEmitter from "events";
3
+ import { AsyncLocalStorage } from "async_hooks";
1
4
  /**
2
- * In-memory catalog of WorkerAgents a planner can see/hire/prompt, plus
3
- * which of them are currently "active" (hired). Scoped to one AgentTools()
4
- * call — not a process-wide singleton — so multiple independent planners in
5
- * the same process each get their own roster and hire state.
6
- *
7
- * WorkerAgent instances are live objects (their own AI provider, message
8
- * history, etc.), not serializable data, so — unlike MCPTool state such as
9
- * TodoTools' lists — this can't live in MCPStorage. The roster itself is
10
- * fixed at construction (only the developer can safely wire up a worker's
11
- * provider/instruction/tools); the model can only hire/prompt from what's
12
- * already here, never create new ones.
5
+ * How long a tool waits for the swarm's ack before giving up. Every listener
6
+ * answers immediately in practice (hiring is synchronous, delivery is
7
+ * fire-and-forget), so this only exists to turn a wiring mistake into a legible
8
+ * tool error instead of an agent that hangs forever.
13
9
  */
14
- export class AgentRegistry {
15
- #agents = new Map();
16
- #hired = new Set();
10
+ const ACK_TIMEOUT_MS = 30000;
11
+ export class AgentToolsRegistry extends EventEmitter {
12
+ id = randomUUID();
17
13
  #maxHired;
18
- constructor(agents, maxHired) {
14
+ #controller;
15
+ /**
16
+ * Which agent's turn we are inside.
17
+ *
18
+ * The whole swarm shares one MCPClient, so a tool's `execute(envID, inputs,
19
+ * toolCallId, mcp)` gets nothing that identifies its caller. Rather than have
20
+ * the swarm keep a tool-call-id ledger, it runs each agent's turn inside this
21
+ * context: a tool called during that turn reads the id straight off it, and
22
+ * parallel agents each get their own store for free.
23
+ */
24
+ #callers = new AsyncLocalStorage();
25
+ constructor(maxHired) {
26
+ super();
19
27
  if (maxHired !== undefined && (!Number.isInteger(maxHired) || maxHired < 1)) {
20
- throw new Error(`AgentTools: maxHired must be a positive integer when given, got ${maxHired}.`);
28
+ throw new Error(`getAgentTools: maxHired must be a positive integer when given, got ${maxHired}.`);
21
29
  }
22
30
  this.#maxHired = maxHired;
23
- for (const agent of agents) {
24
- const name = agent.getName();
25
- if (this.#agents.has(name)) {
26
- throw new Error(`AgentTools: duplicate worker agent name "${name}" — names must be unique across the roster.`);
27
- }
28
- this.#agents.set(name, agent);
29
- }
30
31
  }
31
32
  getMaxHired() {
32
33
  return this.#maxHired;
33
34
  }
34
- getHiredCount() {
35
- return this.#hired.size;
35
+ attach(controller) {
36
+ if (this.#controller && this.#controller !== controller) {
37
+ throw new Error(`getAgentTools: this tool set (${this.id}) is already attached to another swarm — build a separate getAgentTools() per swarm.`);
38
+ }
39
+ this.#controller = controller;
36
40
  }
37
- list() {
38
- return [...this.#agents.values()].map(agent => ({
39
- name: agent.getName(),
40
- description: agent.getDescription(),
41
- rating: agent.getRating(),
42
- hired: this.#hired.has(agent.getName()),
43
- }));
41
+ isAttached() {
42
+ return this.#controller !== undefined;
44
43
  }
45
- hire(name) {
46
- if (!this.#agents.has(name)) {
47
- throw new Error(`no worker agent named "${name}" — check agent-list for available names.`);
44
+ requireController() {
45
+ if (!this.#controller) {
46
+ throw new Error("no swarm is attached to these agent tools — pass the getAgentTools() handle to SwarmBase as `agentTools`.");
48
47
  }
49
- // Re-hiring an already-hired agent is a no-op — it must never count
50
- // against the limit a second time.
51
- if (this.#hired.has(name)) {
52
- return;
48
+ return this.#controller;
49
+ }
50
+ /** Run an agent's turn labelled with its id. SwarmBase wraps every `BaseAgent.run()` in this. */
51
+ runAs(agentId, fn) {
52
+ return this.#callers.run(agentId, fn);
53
+ }
54
+ currentAgentId() {
55
+ return this.#callers.getStore();
56
+ }
57
+ /** The caller and the swarm, or a tool error saying which of the two is missing. */
58
+ requireCaller() {
59
+ const controller = this.requireController();
60
+ const agentId = this.#callers.getStore();
61
+ if (!agentId) {
62
+ throw new Error("could not tell which agent made this call — agent tools only work on agents running inside a SwarmBase.");
53
63
  }
54
- if (this.#maxHired !== undefined && this.#hired.size >= this.#maxHired) {
55
- throw new Error(`cannot hire "${name}" — maximum of ${this.#maxHired} hired agent(s) already reached ` +
56
- `(currently hired: ${[...this.#hired].join(", ") || "none"}).`);
64
+ return { controller, agentId };
65
+ }
66
+ /** Ask the swarm to carry something out, and wait for its ack. */
67
+ request(event, agentId, payload) {
68
+ if (this.listenerCount(event) === 0) {
69
+ return Promise.reject(new Error(`no swarm is listening for "${event}" — pass the getAgentTools() handle to SwarmBase as \`agentTools\`.`));
57
70
  }
58
- this.#hired.add(name);
71
+ return new Promise((resolve, reject) => {
72
+ let settled = false;
73
+ const timer = setTimeout(() => {
74
+ if (settled)
75
+ return;
76
+ settled = true;
77
+ reject(new Error(`the swarm did not answer "${event}" within ${ACK_TIMEOUT_MS}ms.`));
78
+ }, ACK_TIMEOUT_MS);
79
+ timer.unref?.();
80
+ const done = (error, result) => {
81
+ if (settled)
82
+ return;
83
+ settled = true;
84
+ clearTimeout(timer);
85
+ if (error)
86
+ reject(error);
87
+ else
88
+ resolve(result);
89
+ };
90
+ this.emit(event, agentId, payload, done);
91
+ });
59
92
  }
60
- isHired(name) {
61
- return this.#hired.has(name);
93
+ /** Hired agents still active — the entrypoint agent is not one of them. */
94
+ countHired() {
95
+ const controller = this.requireController();
96
+ return controller.listAgents().filter(a => a.active && !controller.isEntrypoint(a.agentId)).length;
62
97
  }
63
- get(name) {
64
- return this.#agents.get(name);
98
+ getRemaining() {
99
+ if (this.#maxHired === undefined)
100
+ return undefined;
101
+ return Math.max(0, this.#maxHired - this.countHired());
102
+ }
103
+ /** Look an agent up the way a tool needs it: with an error the model can act on. */
104
+ requireAgent(controller, agentId) {
105
+ const info = controller.getAgentInfo(agentId);
106
+ if (!info) {
107
+ throw new Error(`there is no agent "${agentId}" in this swarm — check agent-active for the ids that exist.`);
108
+ }
109
+ return info;
65
110
  }
66
111
  }
67
- export default AgentRegistry;
112
+ export default AgentToolsRegistry;
68
113
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/agent/registry.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,aAAa;IACtB,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IACzC,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3B,SAAS,CAAU;IAEnB,YAAY,MAAqB,EAAE,QAAiB;QAChD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,mEAAmE,QAAQ,GAAG,CAAC,CAAC;QACpG,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,6CAA6C,CAAC,CAAC;YACnH,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAED,WAAW;QACP,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,aAAa;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,IAAI;QACA,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;YACrB,WAAW,EAAE,KAAK,CAAC,cAAc,EAAE;YACnC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;YACzB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;SAC1C,CAAC,CAAC,CAAC;IACR,CAAC;IAED,IAAI,CAAC,IAAY;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,2CAA2C,CAAC,CAAC;QAC/F,CAAC;QACD,oEAAoE;QACpE,mCAAmC;QACnC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO;QACX,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CACX,gBAAgB,IAAI,kBAAkB,IAAI,CAAC,SAAS,kCAAkC;gBACtF,qBAAqB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,IAAI,CACjE,CAAC;QACN,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,IAAY;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,GAAG,CAAC,IAAY;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACJ;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/agent/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { MCPTool } from "../../core/mcp.js";
2
+ import type AgentToolsRegistry from "./registry.js";
3
+ export declare const AgentReportGroupTool: (registry: AgentToolsRegistry) => MCPTool;
4
+ export default AgentReportGroupTool;
5
+ //# sourceMappingURL=report-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-group.d.ts","sourceRoot":"","sources":["../../../src/tools/agent/report-group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,kBAAkB,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,oBAAoB,GAAI,UAAU,kBAAkB,YAuD/D,CAAC;AAEH,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { MCPTool } from "../../core/mcp.js";
2
+ export const AgentReportGroupTool = (registry) => new MCPTool({
3
+ name: "agent-report-group",
4
+ description: "send a message to every other agent in your group — a decision you made, an interface you settled on, something you found that changes their work. Your parent does not see it, so this is not a substitute for agent-report-parent. You keep working after sending; it does not end your turn.",
5
+ inputs: [
6
+ {
7
+ name: "message",
8
+ type: "string",
9
+ description: "what your group needs to know, written to stand on its own — they cannot see your conversation",
10
+ required: true,
11
+ },
12
+ {
13
+ name: "group",
14
+ type: "string",
15
+ description: "which of your groups to send to. Only needed if you belong to more than one; otherwise your only group is used.",
16
+ required: false,
17
+ },
18
+ ],
19
+ execute: async (_envID, inputs) => {
20
+ const { message, group } = inputs;
21
+ if (!message || typeof message !== "string") {
22
+ throw new Error("message must be a non-empty string");
23
+ }
24
+ if (group !== undefined && typeof group !== "string") {
25
+ throw new Error("group must be a string when given");
26
+ }
27
+ const { controller, agentId } = registry.requireCaller();
28
+ const self = registry.requireAgent(controller, agentId);
29
+ if (self.groups.length === 0) {
30
+ throw new Error("you are not in any group — only agents hired into a group can send group messages.");
31
+ }
32
+ if (group !== undefined && !self.groups.includes(group)) {
33
+ throw new Error(`you are not in group "${group}" — your groups: ${self.groups.join(", ")}.`);
34
+ }
35
+ if (group === undefined && self.groups.length > 1) {
36
+ throw new Error(`you belong to more than one group, so name the one to send to: ${self.groups.join(", ")}.`);
37
+ }
38
+ const target = group ?? self.groups[0];
39
+ const members = controller.listAgents()
40
+ .filter(a => a.active && a.agentId !== agentId && a.groups.includes(target))
41
+ .map(a => a.agentId);
42
+ await registry.request("agent-report-group", agentId, {
43
+ to: members,
44
+ message: `[group "${target}" message from ${agentId} (${self.type})]\n${message}`,
45
+ });
46
+ return { delivered: true, group: target, to: members };
47
+ },
48
+ });
49
+ export default AgentReportGroupTool;
50
+ //# sourceMappingURL=report-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-group.js","sourceRoot":"","sources":["../../../src/tools/agent/report-group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAA4B,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;IAC9E,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,iSAAiS;IAC9S,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,gGAAgG;YAC7G,QAAQ,EAAE,IAAI;SACjB;QACD;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,iHAAiH;YAC9H,QAAQ,EAAE,KAAK;SAClB;KACJ;IACD,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EACf,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QAElC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAExD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;QAC1G,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,oBAAoB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,kEAAkE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjH,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aAC3E,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAEzB,MAAM,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,EAAE;YAClD,EAAE,EAAE,OAAO;YACX,OAAO,EAAE,WAAW,MAAM,kBAAkB,OAAO,KAAK,IAAI,CAAC,IAAI,OAAO,OAAO,EAAE;SACpF,CAAC,CAAC;QAEH,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;IAC3D,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { MCPTool } from "../../core/mcp.js";
2
+ import type AgentToolsRegistry from "./registry.js";
3
+ export declare const AgentReportParentTool: (registry: AgentToolsRegistry) => MCPTool;
4
+ export default AgentReportParentTool;
5
+ //# sourceMappingURL=report-parent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-parent.d.ts","sourceRoot":"","sources":["../../../src/tools/agent/report-parent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,kBAAkB,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,qBAAqB,GAAI,UAAU,kBAAkB,YAyChE,CAAC;AAEH,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { MCPTool } from "../../core/mcp.js";
2
+ export const AgentReportParentTool = (registry) => new MCPTool({
3
+ name: "agent-report-parent",
4
+ description: "report your result back to the agent that hired you, then stop. This ends your current turn immediately — do not call another tool or add commentary after it. Your parent decides what happens next: it may send you more work, or leave you idle.",
5
+ inputs: [
6
+ {
7
+ name: "report",
8
+ type: "string",
9
+ description: "the result, findings, or answer to hand back — written to stand on its own, since your parent cannot see your conversation or your reasoning",
10
+ required: true,
11
+ },
12
+ ],
13
+ stopIterationAfterUsingThisTool: true,
14
+ execute: async (_envID, inputs) => {
15
+ const { report } = inputs;
16
+ if (!report || typeof report !== "string") {
17
+ throw new Error("report must be a non-empty string");
18
+ }
19
+ const { controller, agentId } = registry.requireCaller();
20
+ const self = registry.requireAgent(controller, agentId);
21
+ if (!self.parentId) {
22
+ throw new Error("you have no parent to report to — you are this swarm's entrypoint agent, so your answer goes to the user directly.");
23
+ }
24
+ const parent = registry.requireAgent(controller, self.parentId);
25
+ if (!parent.active) {
26
+ throw new Error(`the agent that hired you (${self.parentId}) is no longer active, so there is nobody to report to.`);
27
+ }
28
+ await registry.request("agent-report-parent", agentId, {
29
+ to: [parent.agentId],
30
+ message: `[report from ${agentId} (${self.type}), an agent you hired]\n${report}`,
31
+ });
32
+ return { delivered: true, to: parent.agentId };
33
+ },
34
+ });
35
+ export default AgentReportParentTool;
36
+ //# sourceMappingURL=report-parent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-parent.js","sourceRoot":"","sources":["../../../src/tools/agent/report-parent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAA4B,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;IAC/E,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,qPAAqP;IAClQ,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,8IAA8I;YAC3J,QAAQ,EAAE,IAAI;SACjB;KACJ;IACD,+BAA+B,EAAE,IAAI;IACrC,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EACf,EAAE;QACd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAE1B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAExD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,oHAAoH,CAAC,CAAC;QAC1I,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,QAAQ,yDAAyD,CAAC,CAAC;QACzH,CAAC;QAED,MAAM,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,OAAO,EAAE;YACnD,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;YACpB,OAAO,EAAE,gBAAgB,OAAO,KAAK,IAAI,CAAC,IAAI,2BAA2B,MAAM,EAAE;SACpF,CAAC,CAAC;QAEH,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACnD,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { MCPTool } from "../../core/mcp.js";
2
+ import type AgentToolsRegistry from "./registry.js";
3
+ export declare const AgentTypesTool: (registry: AgentToolsRegistry) => MCPTool;
4
+ export default AgentTypesTool;
5
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/agent/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,kBAAkB,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,cAAc,GAAI,UAAU,kBAAkB,YAczD,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { MCPTool } from "../../core/mcp.js";
2
+ export const AgentTypesTool = (registry) => new MCPTool({
3
+ name: "agent-types",
4
+ description: "list every kind of agent you can hire into this swarm, with what each is good at, its per-task fit ratings, how many of that kind are already working, and how many hire slots remain. Check this before agent-hire so you pick the type that actually fits the task.",
5
+ inputs: [],
6
+ execute: async () => {
7
+ const controller = registry.requireController();
8
+ return {
9
+ types: controller.listTypes(),
10
+ hired: registry.countHired(),
11
+ maxHired: registry.getMaxHired() ?? null,
12
+ remaining: registry.getRemaining() ?? null,
13
+ };
14
+ },
15
+ });
16
+ export default AgentTypesTool;
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/agent/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAA4B,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;IACxE,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,uQAAuQ;IACpR,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,KAAK,IAAkB,EAAE;QAC9B,MAAM,UAAU,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAEhD,OAAO;YACH,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE;YAC7B,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE;YAC5B,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,IAAI;YACxC,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE,IAAI,IAAI;SAC7C,CAAC;IACN,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,cAAc,CAAC"}