network-ai 4.15.3 → 5.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 (282) hide show
  1. package/INTEGRATION_GUIDE.md +12 -5
  2. package/QUICKSTART.md +32 -5
  3. package/README.md +42 -17
  4. package/bin/dashboard.ts +146 -0
  5. package/bin/mcp-server.ts +3 -2
  6. package/dist/adapters/adapter-registry.d.ts +33 -1
  7. package/dist/adapters/adapter-registry.d.ts.map +1 -1
  8. package/dist/adapters/adapter-registry.js +49 -0
  9. package/dist/adapters/adapter-registry.js.map +1 -1
  10. package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
  11. package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
  12. package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
  13. package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
  14. package/dist/adapters/browser-agent-adapter.d.ts +121 -0
  15. package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
  16. package/dist/adapters/browser-agent-adapter.js +219 -0
  17. package/dist/adapters/browser-agent-adapter.js.map +1 -0
  18. package/dist/adapters/copilot-adapter.d.ts +59 -0
  19. package/dist/adapters/copilot-adapter.d.ts.map +1 -0
  20. package/dist/adapters/copilot-adapter.js +132 -0
  21. package/dist/adapters/copilot-adapter.js.map +1 -0
  22. package/dist/adapters/custom-adapter.d.ts +1 -1
  23. package/dist/adapters/custom-adapter.js +1 -1
  24. package/dist/adapters/index.d.ts +17 -1
  25. package/dist/adapters/index.d.ts.map +1 -1
  26. package/dist/adapters/index.js +25 -1
  27. package/dist/adapters/index.js.map +1 -1
  28. package/dist/adapters/langchain-adapter.js +1 -1
  29. package/dist/adapters/langchain-adapter.js.map +1 -1
  30. package/dist/adapters/langgraph-adapter.d.ts +70 -0
  31. package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
  32. package/dist/adapters/langgraph-adapter.js +119 -0
  33. package/dist/adapters/langgraph-adapter.js.map +1 -0
  34. package/dist/adapters/mcp-adapter.d.ts +1 -1
  35. package/dist/adapters/mcp-adapter.js +3 -3
  36. package/dist/adapters/mcp-adapter.js.map +1 -1
  37. package/dist/adapters/openai-agents-adapter.d.ts +100 -0
  38. package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
  39. package/dist/adapters/openai-agents-adapter.js +118 -0
  40. package/dist/adapters/openai-agents-adapter.js.map +1 -0
  41. package/dist/adapters/openclaw-adapter.d.ts +1 -1
  42. package/dist/adapters/openclaw-adapter.js +3 -3
  43. package/dist/adapters/openclaw-adapter.js.map +1 -1
  44. package/dist/adapters/orchestrator-adapter.d.ts +118 -0
  45. package/dist/adapters/orchestrator-adapter.d.ts.map +1 -0
  46. package/dist/adapters/orchestrator-adapter.js +219 -0
  47. package/dist/adapters/orchestrator-adapter.js.map +1 -0
  48. package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
  49. package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
  50. package/dist/adapters/pydantic-ai-adapter.js +163 -0
  51. package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
  52. package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
  53. package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
  54. package/dist/adapters/vertex-ai-adapter.js +166 -0
  55. package/dist/adapters/vertex-ai-adapter.js.map +1 -0
  56. package/dist/bin/dashboard.d.ts +11 -0
  57. package/dist/bin/dashboard.d.ts.map +1 -0
  58. package/dist/bin/dashboard.js +135 -0
  59. package/dist/bin/dashboard.js.map +1 -0
  60. package/dist/bin/mcp-server.js +3 -2
  61. package/dist/bin/mcp-server.js.map +1 -1
  62. package/dist/demo-control-plane.d.ts +12 -0
  63. package/dist/demo-control-plane.d.ts.map +1 -0
  64. package/dist/demo-control-plane.js +147 -0
  65. package/dist/demo-control-plane.js.map +1 -0
  66. package/dist/demo-worktree-dashboard.d.ts +2 -0
  67. package/dist/demo-worktree-dashboard.d.ts.map +1 -0
  68. package/dist/demo-worktree-dashboard.js +131 -0
  69. package/dist/demo-worktree-dashboard.js.map +1 -0
  70. package/dist/examples/01-hello-swarm.d.ts +13 -0
  71. package/dist/examples/01-hello-swarm.d.ts.map +1 -0
  72. package/dist/examples/01-hello-swarm.js +165 -0
  73. package/dist/examples/01-hello-swarm.js.map +1 -0
  74. package/dist/examples/02-fsm-pipeline.d.ts +20 -0
  75. package/dist/examples/02-fsm-pipeline.d.ts.map +1 -0
  76. package/dist/examples/02-fsm-pipeline.js +189 -0
  77. package/dist/examples/02-fsm-pipeline.js.map +1 -0
  78. package/dist/examples/03-parallel-agents.d.ts +21 -0
  79. package/dist/examples/03-parallel-agents.d.ts.map +1 -0
  80. package/dist/examples/03-parallel-agents.js +192 -0
  81. package/dist/examples/03-parallel-agents.js.map +1 -0
  82. package/dist/examples/05-code-review-swarm.d.ts +21 -0
  83. package/dist/examples/05-code-review-swarm.d.ts.map +1 -0
  84. package/dist/examples/05-code-review-swarm.js +1177 -0
  85. package/dist/examples/05-code-review-swarm.js.map +1 -0
  86. package/dist/examples/06-ai-pipeline-demo.d.ts +24 -0
  87. package/dist/examples/06-ai-pipeline-demo.d.ts.map +1 -0
  88. package/dist/examples/06-ai-pipeline-demo.js +263 -0
  89. package/dist/examples/06-ai-pipeline-demo.js.map +1 -0
  90. package/dist/examples/07-full-showcase.d.ts +27 -0
  91. package/dist/examples/07-full-showcase.d.ts.map +1 -0
  92. package/dist/examples/07-full-showcase.js +946 -0
  93. package/dist/examples/07-full-showcase.js.map +1 -0
  94. package/dist/examples/08-control-plane-stress-demo.d.ts +19 -0
  95. package/dist/examples/08-control-plane-stress-demo.d.ts.map +1 -0
  96. package/dist/examples/08-control-plane-stress-demo.js +186 -0
  97. package/dist/examples/08-control-plane-stress-demo.js.map +1 -0
  98. package/dist/examples/09-real-langchain.d.ts +19 -0
  99. package/dist/examples/09-real-langchain.d.ts.map +1 -0
  100. package/dist/examples/09-real-langchain.js +231 -0
  101. package/dist/examples/09-real-langchain.js.map +1 -0
  102. package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts +16 -0
  103. package/dist/examples/10-nemoclaw-sandbox-swarm.d.ts.map +1 -0
  104. package/dist/examples/10-nemoclaw-sandbox-swarm.js +270 -0
  105. package/dist/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
  106. package/dist/examples/demo-runner.d.ts +2 -0
  107. package/dist/examples/demo-runner.d.ts.map +1 -0
  108. package/dist/examples/demo-runner.js +119 -0
  109. package/dist/examples/demo-runner.js.map +1 -0
  110. package/dist/index.d.ts +113 -559
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +310 -1074
  113. package/dist/index.js.map +1 -1
  114. package/dist/lib/adapter-test-harness.d.ts +88 -0
  115. package/dist/lib/adapter-test-harness.d.ts.map +1 -0
  116. package/dist/lib/adapter-test-harness.js +118 -0
  117. package/dist/lib/adapter-test-harness.js.map +1 -0
  118. package/dist/lib/agent-conversation.d.ts +115 -0
  119. package/dist/lib/agent-conversation.d.ts.map +1 -0
  120. package/dist/lib/agent-conversation.js +155 -0
  121. package/dist/lib/agent-conversation.js.map +1 -0
  122. package/dist/lib/agent-debate.d.ts +115 -0
  123. package/dist/lib/agent-debate.d.ts.map +1 -0
  124. package/dist/lib/agent-debate.js +146 -0
  125. package/dist/lib/agent-debate.js.map +1 -0
  126. package/dist/lib/agent-memory.d.ts +157 -0
  127. package/dist/lib/agent-memory.d.ts.map +1 -0
  128. package/dist/lib/agent-memory.js +336 -0
  129. package/dist/lib/agent-memory.js.map +1 -0
  130. package/dist/lib/agent-vcr.d.ts +133 -0
  131. package/dist/lib/agent-vcr.d.ts.map +1 -0
  132. package/dist/lib/agent-vcr.js +218 -0
  133. package/dist/lib/agent-vcr.js.map +1 -0
  134. package/dist/lib/anomaly-detector.d.ts +112 -0
  135. package/dist/lib/anomaly-detector.d.ts.map +1 -0
  136. package/dist/lib/anomaly-detector.js +178 -0
  137. package/dist/lib/anomaly-detector.js.map +1 -0
  138. package/dist/lib/approval-inbox.d.ts +147 -0
  139. package/dist/lib/approval-inbox.d.ts.map +1 -0
  140. package/dist/lib/approval-inbox.js +385 -0
  141. package/dist/lib/approval-inbox.js.map +1 -0
  142. package/dist/lib/auth-guardian.d.ts +170 -0
  143. package/dist/lib/auth-guardian.d.ts.map +1 -0
  144. package/dist/lib/auth-guardian.js +604 -0
  145. package/dist/lib/auth-guardian.js.map +1 -0
  146. package/dist/lib/auth-validator.d.ts +70 -0
  147. package/dist/lib/auth-validator.d.ts.map +1 -0
  148. package/dist/lib/auth-validator.js +32 -0
  149. package/dist/lib/auth-validator.js.map +1 -0
  150. package/dist/lib/blackboard-validator.d.ts +56 -0
  151. package/dist/lib/blackboard-validator.d.ts.map +1 -1
  152. package/dist/lib/blackboard-validator.js +181 -4
  153. package/dist/lib/blackboard-validator.js.map +1 -1
  154. package/dist/lib/comparison-runner.d.ts +99 -0
  155. package/dist/lib/comparison-runner.d.ts.map +1 -0
  156. package/dist/lib/comparison-runner.js +138 -0
  157. package/dist/lib/comparison-runner.js.map +1 -0
  158. package/dist/lib/config-watcher.d.ts +109 -0
  159. package/dist/lib/config-watcher.d.ts.map +1 -0
  160. package/dist/lib/config-watcher.js +215 -0
  161. package/dist/lib/config-watcher.js.map +1 -0
  162. package/dist/lib/control-plane.d.ts +128 -0
  163. package/dist/lib/control-plane.d.ts.map +1 -0
  164. package/dist/lib/control-plane.js +527 -0
  165. package/dist/lib/control-plane.js.map +1 -0
  166. package/dist/lib/cost-governor.d.ts +105 -0
  167. package/dist/lib/cost-governor.d.ts.map +1 -0
  168. package/dist/lib/cost-governor.js +128 -0
  169. package/dist/lib/cost-governor.js.map +1 -0
  170. package/dist/lib/cost-heatmap.d.ts +104 -0
  171. package/dist/lib/cost-heatmap.d.ts.map +1 -0
  172. package/dist/lib/cost-heatmap.js +161 -0
  173. package/dist/lib/cost-heatmap.js.map +1 -0
  174. package/dist/lib/coverage-reporter.d.ts +92 -0
  175. package/dist/lib/coverage-reporter.d.ts.map +1 -0
  176. package/dist/lib/coverage-reporter.js +177 -0
  177. package/dist/lib/coverage-reporter.js.map +1 -0
  178. package/dist/lib/dashboard-server.d.ts +71 -0
  179. package/dist/lib/dashboard-server.d.ts.map +1 -0
  180. package/dist/lib/dashboard-server.js +403 -0
  181. package/dist/lib/dashboard-server.js.map +1 -0
  182. package/dist/lib/dry-run.d.ts +73 -0
  183. package/dist/lib/dry-run.d.ts.map +1 -0
  184. package/dist/lib/dry-run.js +130 -0
  185. package/dist/lib/dry-run.js.map +1 -0
  186. package/dist/lib/errors.d.ts +15 -0
  187. package/dist/lib/errors.d.ts.map +1 -1
  188. package/dist/lib/errors.js +38 -0
  189. package/dist/lib/errors.js.map +1 -1
  190. package/dist/lib/event-bus.d.ts +167 -0
  191. package/dist/lib/event-bus.d.ts.map +1 -0
  192. package/dist/lib/event-bus.js +229 -0
  193. package/dist/lib/event-bus.js.map +1 -0
  194. package/dist/lib/explainability.d.ts +85 -0
  195. package/dist/lib/explainability.d.ts.map +1 -0
  196. package/dist/lib/explainability.js +102 -0
  197. package/dist/lib/explainability.js.map +1 -0
  198. package/dist/lib/goal-dsl.d.ts +157 -0
  199. package/dist/lib/goal-dsl.d.ts.map +1 -0
  200. package/dist/lib/goal-dsl.js +391 -0
  201. package/dist/lib/goal-dsl.js.map +1 -0
  202. package/dist/lib/job-queue.d.ts +183 -0
  203. package/dist/lib/job-queue.d.ts.map +1 -0
  204. package/dist/lib/job-queue.js +310 -0
  205. package/dist/lib/job-queue.js.map +1 -0
  206. package/dist/lib/learning-loop.d.ts +113 -0
  207. package/dist/lib/learning-loop.d.ts.map +1 -0
  208. package/dist/lib/learning-loop.js +181 -0
  209. package/dist/lib/learning-loop.js.map +1 -0
  210. package/dist/lib/lifecycle-hooks.d.ts +116 -0
  211. package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
  212. package/dist/lib/lifecycle-hooks.js +148 -0
  213. package/dist/lib/lifecycle-hooks.js.map +1 -0
  214. package/dist/lib/locked-blackboard.d.ts.map +1 -1
  215. package/dist/lib/locked-blackboard.js +9 -5
  216. package/dist/lib/locked-blackboard.js.map +1 -1
  217. package/dist/lib/mcp-tool-consumer.d.ts +153 -0
  218. package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
  219. package/dist/lib/mcp-tool-consumer.js +320 -0
  220. package/dist/lib/mcp-tool-consumer.js.map +1 -0
  221. package/dist/lib/metrics.d.ts +119 -0
  222. package/dist/lib/metrics.d.ts.map +1 -0
  223. package/dist/lib/metrics.js +284 -0
  224. package/dist/lib/metrics.js.map +1 -0
  225. package/dist/lib/orchestrator-types.d.ts +309 -0
  226. package/dist/lib/orchestrator-types.d.ts.map +1 -0
  227. package/dist/lib/orchestrator-types.js +61 -0
  228. package/dist/lib/orchestrator-types.js.map +1 -0
  229. package/dist/lib/otel-bridge.d.ts +74 -0
  230. package/dist/lib/otel-bridge.d.ts.map +1 -0
  231. package/dist/lib/otel-bridge.js +167 -0
  232. package/dist/lib/otel-bridge.js.map +1 -0
  233. package/dist/lib/playground.d.ts +76 -0
  234. package/dist/lib/playground.d.ts.map +1 -0
  235. package/dist/lib/playground.js +224 -0
  236. package/dist/lib/playground.js.map +1 -0
  237. package/dist/lib/quadtree.d.ts +114 -0
  238. package/dist/lib/quadtree.d.ts.map +1 -0
  239. package/dist/lib/quadtree.js +259 -0
  240. package/dist/lib/quadtree.js.map +1 -0
  241. package/dist/lib/shared-blackboard.d.ts +101 -0
  242. package/dist/lib/shared-blackboard.d.ts.map +1 -0
  243. package/dist/lib/shared-blackboard.js +249 -0
  244. package/dist/lib/shared-blackboard.js.map +1 -0
  245. package/dist/lib/speculative-executor.d.ts +89 -0
  246. package/dist/lib/speculative-executor.d.ts.map +1 -0
  247. package/dist/lib/speculative-executor.js +107 -0
  248. package/dist/lib/speculative-executor.js.map +1 -0
  249. package/dist/lib/swarm-transport.d.ts +150 -0
  250. package/dist/lib/swarm-transport.d.ts.map +1 -0
  251. package/dist/lib/swarm-transport.js +307 -0
  252. package/dist/lib/swarm-transport.js.map +1 -0
  253. package/dist/lib/task-decomposer.d.ts +41 -0
  254. package/dist/lib/task-decomposer.d.ts.map +1 -0
  255. package/dist/lib/task-decomposer.js +272 -0
  256. package/dist/lib/task-decomposer.js.map +1 -0
  257. package/dist/lib/timeline-scrubber.d.ts +84 -0
  258. package/dist/lib/timeline-scrubber.d.ts.map +1 -0
  259. package/dist/lib/timeline-scrubber.js +173 -0
  260. package/dist/lib/timeline-scrubber.js.map +1 -0
  261. package/dist/lib/topology.d.ts +361 -0
  262. package/dist/lib/topology.d.ts.map +1 -0
  263. package/dist/lib/topology.js +591 -0
  264. package/dist/lib/topology.js.map +1 -0
  265. package/dist/lib/work-tree-dashboard.d.ts +130 -0
  266. package/dist/lib/work-tree-dashboard.d.ts.map +1 -0
  267. package/dist/lib/work-tree-dashboard.js +583 -0
  268. package/dist/lib/work-tree-dashboard.js.map +1 -0
  269. package/dist/lib/work-tree-ui.d.ts +107 -0
  270. package/dist/lib/work-tree-ui.d.ts.map +1 -0
  271. package/dist/lib/work-tree-ui.js +333 -0
  272. package/dist/lib/work-tree-ui.js.map +1 -0
  273. package/dist/lib/work-tree.d.ts +184 -0
  274. package/dist/lib/work-tree.d.ts.map +1 -0
  275. package/dist/lib/work-tree.js +480 -0
  276. package/dist/lib/work-tree.js.map +1 -0
  277. package/dist/security.d.ts +95 -0
  278. package/dist/security.d.ts.map +1 -1
  279. package/dist/security.js +267 -4
  280. package/dist/security.js.map +1 -1
  281. package/package.json +8 -6
  282. package/types/agent-adapter.d.ts +5 -0
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Orchestrator Adapter — Wrap a child SwarmOrchestrator as an agent
3
+ *
4
+ * This adapter enables hierarchical multi-orchestrator coordination.
5
+ * A parent SwarmOrchestrator treats a child SwarmOrchestrator as just
6
+ * another agent via the adapter system. Each child has its own
7
+ * LockedBlackboard with its own filesystem mutex, so the propose →
8
+ * validate → commit pattern prevents overwrites at every level.
9
+ *
10
+ * Usage:
11
+ * const child = new SwarmOrchestrator('./boards/child-project', childRegistry);
12
+ * const adapter = new OrchestratorAdapter();
13
+ * adapter.registerOrchestrator('child-team', child, {
14
+ * description: 'Backend team orchestrator',
15
+ * });
16
+ *
17
+ * // Parent orchestrator delegates to the child as a normal agent
18
+ * await parentOrchestrator.addAdapter(adapter);
19
+ * await parentOrchestrator.execute('delegate_task', {
20
+ * targetAgent: 'orchestrator:child-team',
21
+ * taskPayload: { instruction: 'Refactor the auth module' },
22
+ * }, { agentId: 'root' });
23
+ *
24
+ * The child orchestrator receives the task, decomposes it across its own
25
+ * agents, and returns the aggregated result. The parent sees it as one
26
+ * atomic response — the hierarchy is transparent.
27
+ *
28
+ * @module OrchestratorAdapter
29
+ * @version 1.0.0
30
+ */
31
+ import { BaseAdapter } from './base-adapter';
32
+ import type { AdapterCapabilities, AgentPayload, AgentContext, AgentResult } from '../types/agent-adapter';
33
+ import type { SkillResult } from '../lib/orchestrator-types';
34
+ /**
35
+ * Configuration for a child orchestrator registered with this adapter.
36
+ */
37
+ export interface ChildOrchestratorConfig {
38
+ /** Human-readable description of the child orchestrator's domain */
39
+ description?: string;
40
+ /** Capabilities the child orchestrator advertises */
41
+ capabilities?: string[];
42
+ /** Default agent in the child swarm to target (if not specified in payload) */
43
+ defaultTargetAgent?: string;
44
+ /** Timeout for child orchestrator execution in ms (default: 120_000) */
45
+ timeout?: number;
46
+ }
47
+ /**
48
+ * Minimal interface for a SwarmOrchestrator. We don't import the concrete
49
+ * class to avoid circular dependencies — adapters stay self-contained.
50
+ */
51
+ export interface OrchestratorLike {
52
+ name: string;
53
+ execute(action: string, params: Record<string, unknown>, context: {
54
+ agentId: string;
55
+ taskId?: string;
56
+ sessionId?: string;
57
+ }): Promise<SkillResult>;
58
+ }
59
+ /**
60
+ * Snapshot of a child orchestrator's internal state, surfaced to the
61
+ * parent for unified visibility.
62
+ */
63
+ export interface ChildOrchestratorState {
64
+ /** The registered orchestrator id */
65
+ orchestratorId: string;
66
+ /** Whether the child is currently processing a task */
67
+ busy: boolean;
68
+ /** The swarm state snapshot (agents, blackboard, tasks) */
69
+ swarmState: unknown;
70
+ /** Timestamp of the last query */
71
+ queriedAt: string;
72
+ }
73
+ export declare class OrchestratorAdapter extends BaseAdapter {
74
+ readonly name = "orchestrator";
75
+ readonly version = "1.0.0";
76
+ private children;
77
+ get capabilities(): AdapterCapabilities;
78
+ /**
79
+ * Register a child SwarmOrchestrator as an agent.
80
+ * The child keeps its own blackboard, adapters, and lock — full isolation.
81
+ */
82
+ registerOrchestrator(orchestratorId: string, orchestrator: OrchestratorLike, config?: ChildOrchestratorConfig): void;
83
+ /**
84
+ * Remove a child orchestrator from this adapter.
85
+ */
86
+ removeOrchestrator(orchestratorId: string): boolean;
87
+ /**
88
+ * Execute a task on a child orchestrator.
89
+ *
90
+ * The payload is translated into a `delegate_task` call on the child.
91
+ * If `handoff.targetAgent` is set, it becomes the target within the child
92
+ * swarm. Otherwise, the child's `defaultTargetAgent` is used, or the
93
+ * child decides its own routing.
94
+ */
95
+ executeAgent(agentId: string, payload: AgentPayload, context: AgentContext): Promise<AgentResult>;
96
+ /**
97
+ * Query the internal state of a child orchestrator.
98
+ * Returns agents, blackboard snapshot, and tasks from the child swarm.
99
+ * The parent can use this for unified visibility across the hierarchy.
100
+ */
101
+ queryChildState(orchestratorId: string, scope?: 'all' | 'agents' | 'blackboard' | 'tasks'): Promise<ChildOrchestratorState | null>;
102
+ /**
103
+ * Query state of all registered child orchestrators.
104
+ * This is the foundation for the unified ControlPlane view.
105
+ */
106
+ queryAllChildStates(scope?: 'all' | 'agents' | 'blackboard' | 'tasks'): Promise<ChildOrchestratorState[]>;
107
+ /**
108
+ * Get the list of registered child orchestrator IDs.
109
+ */
110
+ listOrchestrators(): string[];
111
+ /**
112
+ * Check if a specific child orchestrator is currently busy.
113
+ */
114
+ isChildBusy(orchestratorId: string): boolean;
115
+ shutdown(): Promise<void>;
116
+ private timeoutAfter;
117
+ }
118
+ //# sourceMappingURL=orchestrator-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-adapter.d.ts","sourceRoot":"","sources":["../../adapters/orchestrator-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAEV,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CACL,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAChE,OAAO,CAAC,WAAW,CAAC,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,IAAI,EAAE,OAAO,CAAC;IACd,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,OAAO,WAAW;IAE3B,OAAO,CAAC,QAAQ,CAA2C;IAE3D,IAAI,YAAY,IAAI,mBAAmB,CAStC;IAED;;;OAGG;IACH,oBAAoB,CAClB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,gBAAgB,EAC9B,MAAM,CAAC,EAAE,uBAAuB,GAC/B,IAAI;IAmCP;;OAEG;IACH,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAQnD;;;;;;;OAOG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC;IAkGvB;;;;OAIG;IACG,eAAe,CACnB,cAAc,EAAE,MAAM,EACtB,KAAK,GAAE,KAAK,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAe,GACvD,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAkBzC;;;OAGG;IACG,mBAAmB,CACvB,KAAK,GAAE,KAAK,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAe,GACvD,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAQpC;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAI7B;;OAEG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAItC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,OAAO,CAAC,YAAY;CAKrB"}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ /**
3
+ * Orchestrator Adapter — Wrap a child SwarmOrchestrator as an agent
4
+ *
5
+ * This adapter enables hierarchical multi-orchestrator coordination.
6
+ * A parent SwarmOrchestrator treats a child SwarmOrchestrator as just
7
+ * another agent via the adapter system. Each child has its own
8
+ * LockedBlackboard with its own filesystem mutex, so the propose →
9
+ * validate → commit pattern prevents overwrites at every level.
10
+ *
11
+ * Usage:
12
+ * const child = new SwarmOrchestrator('./boards/child-project', childRegistry);
13
+ * const adapter = new OrchestratorAdapter();
14
+ * adapter.registerOrchestrator('child-team', child, {
15
+ * description: 'Backend team orchestrator',
16
+ * });
17
+ *
18
+ * // Parent orchestrator delegates to the child as a normal agent
19
+ * await parentOrchestrator.addAdapter(adapter);
20
+ * await parentOrchestrator.execute('delegate_task', {
21
+ * targetAgent: 'orchestrator:child-team',
22
+ * taskPayload: { instruction: 'Refactor the auth module' },
23
+ * }, { agentId: 'root' });
24
+ *
25
+ * The child orchestrator receives the task, decomposes it across its own
26
+ * agents, and returns the aggregated result. The parent sees it as one
27
+ * atomic response — the hierarchy is transparent.
28
+ *
29
+ * @module OrchestratorAdapter
30
+ * @version 1.0.0
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.OrchestratorAdapter = void 0;
34
+ const base_adapter_1 = require("./base-adapter");
35
+ class OrchestratorAdapter extends base_adapter_1.BaseAdapter {
36
+ name = 'orchestrator';
37
+ version = '1.0.0';
38
+ children = new Map();
39
+ get capabilities() {
40
+ return {
41
+ streaming: false,
42
+ parallel: true,
43
+ bidirectional: false,
44
+ discovery: true,
45
+ authentication: false,
46
+ statefulSessions: true,
47
+ };
48
+ }
49
+ /**
50
+ * Register a child SwarmOrchestrator as an agent.
51
+ * The child keeps its own blackboard, adapters, and lock — full isolation.
52
+ */
53
+ registerOrchestrator(orchestratorId, orchestrator, config) {
54
+ if (!orchestratorId || typeof orchestratorId !== 'string') {
55
+ throw new Error('orchestratorId must be a non-empty string');
56
+ }
57
+ if (!orchestrator || typeof orchestrator.execute !== 'function') {
58
+ throw new Error('orchestrator must implement execute()');
59
+ }
60
+ const childConfig = {
61
+ description: config?.description ?? `Child orchestrator: ${orchestratorId}`,
62
+ capabilities: config?.capabilities ?? ['orchestration', 'delegation', 'parallel'],
63
+ defaultTargetAgent: config?.defaultTargetAgent,
64
+ timeout: config?.timeout ?? 120_000,
65
+ };
66
+ this.children.set(orchestratorId, {
67
+ orchestrator,
68
+ config: childConfig,
69
+ busy: false,
70
+ });
71
+ this.registerLocalAgent({
72
+ id: orchestratorId,
73
+ name: orchestrator.name ?? orchestratorId,
74
+ description: childConfig.description,
75
+ capabilities: childConfig.capabilities,
76
+ status: 'available',
77
+ metadata: {
78
+ type: 'orchestrator',
79
+ timeout: childConfig.timeout,
80
+ defaultTargetAgent: childConfig.defaultTargetAgent,
81
+ },
82
+ });
83
+ }
84
+ /**
85
+ * Remove a child orchestrator from this adapter.
86
+ */
87
+ removeOrchestrator(orchestratorId) {
88
+ const removed = this.children.delete(orchestratorId);
89
+ if (removed) {
90
+ this.unregisterAgent(orchestratorId);
91
+ }
92
+ return removed;
93
+ }
94
+ /**
95
+ * Execute a task on a child orchestrator.
96
+ *
97
+ * The payload is translated into a `delegate_task` call on the child.
98
+ * If `handoff.targetAgent` is set, it becomes the target within the child
99
+ * swarm. Otherwise, the child's `defaultTargetAgent` is used, or the
100
+ * child decides its own routing.
101
+ */
102
+ async executeAgent(agentId, payload, context) {
103
+ this.ensureReady();
104
+ const child = this.children.get(agentId);
105
+ if (!child) {
106
+ return this.errorResult('ORCHESTRATOR_NOT_FOUND', `Child orchestrator "${agentId}" is not registered. Use registerOrchestrator().`, false);
107
+ }
108
+ const startTime = Date.now();
109
+ child.busy = true;
110
+ // Update agent status
111
+ const agentInfo = this.registeredAgents.get(agentId);
112
+ if (agentInfo)
113
+ agentInfo.status = 'busy';
114
+ try {
115
+ const instruction = payload.handoff?.instruction
116
+ ?? payload.params?.instruction
117
+ ?? JSON.stringify(payload.params);
118
+ // Determine the target agent within the child swarm
119
+ const innerTarget = payload.handoff?.targetAgent
120
+ ?? child.config.defaultTargetAgent
121
+ ?? 'orchestrator';
122
+ const childParams = {
123
+ targetAgent: innerTarget,
124
+ taskPayload: {
125
+ instruction,
126
+ context: payload.handoff?.context ?? payload.params?.context,
127
+ constraints: payload.handoff?.constraints ?? payload.params?.constraints,
128
+ expectedOutput: payload.handoff?.expectedOutput ?? payload.params?.expectedOutput,
129
+ },
130
+ timeout: child.config.timeout,
131
+ };
132
+ // Forward blackboard snapshot if provided (cross-level context sharing)
133
+ if (payload.blackboardSnapshot) {
134
+ childParams.parentBlackboardSnapshot = payload.blackboardSnapshot;
135
+ }
136
+ const childContext = {
137
+ agentId: context.agentId,
138
+ taskId: context.taskId,
139
+ sessionId: context.sessionId,
140
+ };
141
+ // Execute on the child orchestrator with timeout
142
+ const result = await Promise.race([
143
+ child.orchestrator.execute('delegate_task', childParams, childContext),
144
+ this.timeoutAfter(child.config.timeout ?? 120_000),
145
+ ]);
146
+ const elapsed = Date.now() - startTime;
147
+ if (!result.success) {
148
+ return this.errorResult(result.error?.code ?? 'CHILD_EXECUTION_FAILED', result.error?.message ?? 'Child orchestrator returned failure', result.error?.recoverable ?? true, result.error);
149
+ }
150
+ return this.successResult({
151
+ orchestratorId: agentId,
152
+ childResult: result.data,
153
+ hierarchy: true,
154
+ }, elapsed);
155
+ }
156
+ catch (error) {
157
+ const elapsed = Date.now() - startTime;
158
+ if (error instanceof Error && error.message === 'ORCHESTRATOR_TIMEOUT') {
159
+ return this.errorResult('CHILD_TIMEOUT', `Child orchestrator "${agentId}" timed out after ${child.config.timeout}ms`, true);
160
+ }
161
+ return this.errorResult('CHILD_EXECUTION_ERROR', error instanceof Error ? error.message : 'Child orchestrator execution failed', true, error);
162
+ }
163
+ finally {
164
+ child.busy = false;
165
+ const agentInfo2 = this.registeredAgents.get(agentId);
166
+ if (agentInfo2)
167
+ agentInfo2.status = 'available';
168
+ }
169
+ }
170
+ /**
171
+ * Query the internal state of a child orchestrator.
172
+ * Returns agents, blackboard snapshot, and tasks from the child swarm.
173
+ * The parent can use this for unified visibility across the hierarchy.
174
+ */
175
+ async queryChildState(orchestratorId, scope = 'all') {
176
+ const child = this.children.get(orchestratorId);
177
+ if (!child)
178
+ return null;
179
+ const result = await child.orchestrator.execute('query_swarm_state', { scope }, { agentId: 'parent-orchestrator' });
180
+ return {
181
+ orchestratorId,
182
+ busy: child.busy,
183
+ swarmState: result.success ? result.data : null,
184
+ queriedAt: new Date().toISOString(),
185
+ };
186
+ }
187
+ /**
188
+ * Query state of all registered child orchestrators.
189
+ * This is the foundation for the unified ControlPlane view.
190
+ */
191
+ async queryAllChildStates(scope = 'all') {
192
+ const entries = Array.from(this.children.keys());
193
+ const results = await Promise.all(entries.map(id => this.queryChildState(id, scope)));
194
+ return results.filter((s) => s !== null);
195
+ }
196
+ /**
197
+ * Get the list of registered child orchestrator IDs.
198
+ */
199
+ listOrchestrators() {
200
+ return Array.from(this.children.keys());
201
+ }
202
+ /**
203
+ * Check if a specific child orchestrator is currently busy.
204
+ */
205
+ isChildBusy(orchestratorId) {
206
+ return this.children.get(orchestratorId)?.busy ?? false;
207
+ }
208
+ async shutdown() {
209
+ this.children.clear();
210
+ await super.shutdown();
211
+ }
212
+ timeoutAfter(ms) {
213
+ return new Promise((_, reject) => {
214
+ setTimeout(() => reject(new Error('ORCHESTRATOR_TIMEOUT')), ms);
215
+ });
216
+ }
217
+ }
218
+ exports.OrchestratorAdapter = OrchestratorAdapter;
219
+ //# sourceMappingURL=orchestrator-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-adapter.js","sourceRoot":"","sources":["../../adapters/orchestrator-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Pydantic AI Adapter
3
+ *
4
+ * Integrates Pydantic AI (type-safe Python agent framework) with the
5
+ * SwarmOrchestrator via user-supplied runner functions.
6
+ *
7
+ * Pydantic AI provides structured, validated agent responses with
8
+ * dependency injection, streaming, and multi-step tool use. Since
9
+ * it's Python-native, this adapter wraps either:
10
+ * - A JS-compatible runner interface (for interop bridges)
11
+ * - An HTTP endpoint that fronts a Pydantic AI agent
12
+ *
13
+ * Usage:
14
+ * const adapter = new PydanticAIAdapter();
15
+ * adapter.registerAgent('data-analyst', {
16
+ * runner: myPydanticRunner,
17
+ * resultSchema: { type: 'object', properties: { answer: { type: 'string' } } },
18
+ * });
19
+ *
20
+ * @module PydanticAIAdapter
21
+ * @version 1.0.0
22
+ */
23
+ import { BaseAdapter } from './base-adapter';
24
+ import type { AdapterCapabilities, AgentPayload, AgentContext, AgentResult } from '../types/agent-adapter';
25
+ /** Pydantic AI run result */
26
+ export interface PydanticAIRunResult {
27
+ /** Structured data output (validated against resultSchema) */
28
+ data: unknown;
29
+ /** Raw text output if available */
30
+ text?: string;
31
+ /** Tool calls made during execution */
32
+ toolCalls?: Array<{
33
+ tool: string;
34
+ args: Record<string, unknown>;
35
+ result: unknown;
36
+ }>;
37
+ /** Message history */
38
+ messages?: Array<{
39
+ role: string;
40
+ content: string;
41
+ }>;
42
+ /** Token usage */
43
+ usage?: {
44
+ requestTokens: number;
45
+ responseTokens: number;
46
+ totalTokens: number;
47
+ };
48
+ /** Whether validation succeeded */
49
+ validated: boolean;
50
+ }
51
+ /**
52
+ * Runner interface for a Pydantic AI agent.
53
+ * Wraps `agent.run()` or an HTTP call to a Pydantic AI server.
54
+ */
55
+ export interface PydanticAIRunner {
56
+ run(prompt: string, deps?: Record<string, unknown>): Promise<PydanticAIRunResult>;
57
+ }
58
+ /**
59
+ * HTTP-based runner configuration.
60
+ * Sends POST requests to a Pydantic AI HTTP endpoint.
61
+ */
62
+ export interface PydanticAIHttpConfig {
63
+ /** Base URL of the Pydantic AI server */
64
+ baseUrl: string;
65
+ /** Auth header value (e.g. 'Bearer xxx') */
66
+ authorization?: string;
67
+ /** Additional headers */
68
+ headers?: Record<string, string>;
69
+ }
70
+ /** Configuration for a registered Pydantic AI agent */
71
+ export interface PydanticAIAgentConfig {
72
+ /** Direct runner instance */
73
+ runner?: PydanticAIRunner;
74
+ /** HTTP configuration (alternative to runner) */
75
+ http?: PydanticAIHttpConfig;
76
+ /** JSON schema for expected result structure */
77
+ resultSchema?: Record<string, unknown>;
78
+ /** Model name (for metadata) */
79
+ model?: string;
80
+ /** Dependencies to inject into each run */
81
+ defaultDeps?: Record<string, unknown>;
82
+ /** Per-invocation timeout in ms (default: 60000) */
83
+ timeoutMs?: number;
84
+ }
85
+ /**
86
+ * Adapter for Pydantic AI structured agent framework.
87
+ *
88
+ * Supports both direct runners (for JS/Python bridges) and
89
+ * HTTP endpoints (for remote Pydantic AI servers).
90
+ */
91
+ export declare class PydanticAIAdapter extends BaseAdapter {
92
+ readonly name = "pydantic-ai";
93
+ readonly version = "1.0.0";
94
+ private agents;
95
+ get capabilities(): AdapterCapabilities;
96
+ /**
97
+ * Register a Pydantic AI agent (runner or HTTP-backed).
98
+ */
99
+ registerPydanticAgent(agentId: string, config: PydanticAIAgentConfig): void;
100
+ executeAgent(agentId: string, payload: AgentPayload, _context: AgentContext): Promise<AgentResult>;
101
+ private executeHttp;
102
+ shutdown(): Promise<void>;
103
+ }
104
+ //# sourceMappingURL=pydantic-ai-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pydantic-ai-adapter.d.ts","sourceRoot":"","sources":["../../adapters/pydantic-ai-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAEV,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAMhC,6BAA6B;AAC7B,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,IAAI,EAAE,OAAO,CAAC;IACd,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpF,sBAAsB;IACtB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,kBAAkB;IAClB,KAAK,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CACD,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACpC,6BAA6B;IAC7B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,iDAAiD;IACjD,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,OAAO,WAAW;IAE3B,OAAO,CAAC,MAAM,CAA4C;IAE1D,IAAI,YAAY,IAAI,mBAAmB,CAStC;IAMD;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI;IAsBrE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;YA2D1F,WAAW;IA6CnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ /**
3
+ * Pydantic AI Adapter
4
+ *
5
+ * Integrates Pydantic AI (type-safe Python agent framework) with the
6
+ * SwarmOrchestrator via user-supplied runner functions.
7
+ *
8
+ * Pydantic AI provides structured, validated agent responses with
9
+ * dependency injection, streaming, and multi-step tool use. Since
10
+ * it's Python-native, this adapter wraps either:
11
+ * - A JS-compatible runner interface (for interop bridges)
12
+ * - An HTTP endpoint that fronts a Pydantic AI agent
13
+ *
14
+ * Usage:
15
+ * const adapter = new PydanticAIAdapter();
16
+ * adapter.registerAgent('data-analyst', {
17
+ * runner: myPydanticRunner,
18
+ * resultSchema: { type: 'object', properties: { answer: { type: 'string' } } },
19
+ * });
20
+ *
21
+ * @module PydanticAIAdapter
22
+ * @version 1.0.0
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.PydanticAIAdapter = void 0;
26
+ const base_adapter_1 = require("./base-adapter");
27
+ // ---------------------------------------------------------------------------
28
+ // Adapter
29
+ // ---------------------------------------------------------------------------
30
+ /**
31
+ * Adapter for Pydantic AI structured agent framework.
32
+ *
33
+ * Supports both direct runners (for JS/Python bridges) and
34
+ * HTTP endpoints (for remote Pydantic AI servers).
35
+ */
36
+ class PydanticAIAdapter extends base_adapter_1.BaseAdapter {
37
+ name = 'pydantic-ai';
38
+ version = '1.0.0';
39
+ agents = new Map();
40
+ get capabilities() {
41
+ return {
42
+ streaming: false,
43
+ parallel: true,
44
+ bidirectional: false,
45
+ discovery: true,
46
+ authentication: true,
47
+ statefulSessions: false,
48
+ };
49
+ }
50
+ // -----------------------------------------------------------------------
51
+ // Registration
52
+ // -----------------------------------------------------------------------
53
+ /**
54
+ * Register a Pydantic AI agent (runner or HTTP-backed).
55
+ */
56
+ registerPydanticAgent(agentId, config) {
57
+ if (!config.runner && !config.http) {
58
+ throw new Error('PydanticAIAgentConfig requires either runner or http');
59
+ }
60
+ this.agents.set(agentId, config);
61
+ this.registerLocalAgent({
62
+ id: agentId,
63
+ name: agentId,
64
+ status: 'available',
65
+ capabilities: ['structured-output', 'validation', 'tool-use'],
66
+ metadata: {
67
+ adapter: 'pydantic-ai',
68
+ model: config.model,
69
+ mode: config.runner ? 'direct' : 'http',
70
+ },
71
+ });
72
+ }
73
+ // -----------------------------------------------------------------------
74
+ // Execution
75
+ // -----------------------------------------------------------------------
76
+ async executeAgent(agentId, payload, _context) {
77
+ this.ensureReady();
78
+ const config = this.agents.get(agentId);
79
+ if (!config) {
80
+ return this.errorResult('PYDANTIC_AGENT_NOT_FOUND', `No agent registered as '${agentId}'`);
81
+ }
82
+ const prompt = payload.handoff?.instruction
83
+ ?? payload.params?.instruction
84
+ ?? payload.params?.prompt
85
+ ?? payload.action;
86
+ const deps = {
87
+ ...config.defaultDeps,
88
+ ...payload.params,
89
+ ...payload.handoff?.context,
90
+ };
91
+ const timeoutMs = config.timeoutMs ?? 60_000;
92
+ const start = Date.now();
93
+ try {
94
+ let result;
95
+ if (config.runner) {
96
+ result = await Promise.race([
97
+ config.runner.run(prompt, deps),
98
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Pydantic AI execution timed out')), timeoutMs)),
99
+ ]);
100
+ }
101
+ else if (config.http) {
102
+ result = await this.executeHttp(config.http, prompt, deps, timeoutMs);
103
+ }
104
+ else {
105
+ return this.errorResult('PYDANTIC_NO_RUNNER', 'No runner or HTTP config available');
106
+ }
107
+ const durationMs = Date.now() - start;
108
+ return this.successResult({
109
+ data: result.data,
110
+ text: result.text,
111
+ validated: result.validated,
112
+ toolCalls: result.toolCalls,
113
+ usage: result.usage,
114
+ }, durationMs);
115
+ }
116
+ catch (err) {
117
+ return this.errorResult('PYDANTIC_EXECUTION_FAILED', err instanceof Error ? err.message : String(err));
118
+ }
119
+ }
120
+ // -----------------------------------------------------------------------
121
+ // HTTP runner
122
+ // -----------------------------------------------------------------------
123
+ async executeHttp(httpConfig, prompt, deps, timeoutMs) {
124
+ const url = `${httpConfig.baseUrl.replace(/\/$/, '')}/run`;
125
+ const headers = {
126
+ 'Content-Type': 'application/json',
127
+ ...httpConfig.headers,
128
+ };
129
+ if (httpConfig.authorization) {
130
+ headers['Authorization'] = httpConfig.authorization;
131
+ }
132
+ const body = JSON.stringify({ prompt, deps });
133
+ // Use dynamic import for fetch (Node 18+) or global
134
+ const controller = new AbortController();
135
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
136
+ try {
137
+ const response = await fetch(url, {
138
+ method: 'POST',
139
+ headers,
140
+ body,
141
+ signal: controller.signal,
142
+ });
143
+ if (!response.ok) {
144
+ const text = await response.text();
145
+ throw new Error(`HTTP ${response.status}: ${text}`);
146
+ }
147
+ const data = await response.json();
148
+ return data;
149
+ }
150
+ finally {
151
+ clearTimeout(timer);
152
+ }
153
+ }
154
+ // -----------------------------------------------------------------------
155
+ // Lifecycle
156
+ // -----------------------------------------------------------------------
157
+ async shutdown() {
158
+ this.agents.clear();
159
+ await super.shutdown();
160
+ }
161
+ }
162
+ exports.PydanticAIAdapter = PydanticAIAdapter;
163
+ //# sourceMappingURL=pydantic-ai-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pydantic-ai-adapter.js","sourceRoot":"","sources":["../../adapters/pydantic-ai-adapter.ts"],"names":[],"mappings":"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"}