network-ai 5.10.2 → 5.11.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 (272) hide show
  1. package/INTEGRATION_GUIDE.md +2 -2
  2. package/README.md +5 -3
  3. package/SKILL.md +3 -3
  4. package/dist/esm/adapters/a2a-adapter.js +235 -0
  5. package/dist/esm/adapters/a2a-adapter.js.map +1 -0
  6. package/dist/esm/adapters/adapter-registry.js +613 -0
  7. package/dist/esm/adapters/adapter-registry.js.map +1 -0
  8. package/dist/esm/adapters/agno-adapter.js +140 -0
  9. package/dist/esm/adapters/agno-adapter.js.map +1 -0
  10. package/dist/esm/adapters/anthropic-computer-use-adapter.js +180 -0
  11. package/dist/esm/adapters/anthropic-computer-use-adapter.js.map +1 -0
  12. package/dist/esm/adapters/aps-adapter.js +289 -0
  13. package/dist/esm/adapters/aps-adapter.js.map +1 -0
  14. package/dist/esm/adapters/autogen-adapter.js +141 -0
  15. package/dist/esm/adapters/autogen-adapter.js.map +1 -0
  16. package/dist/esm/adapters/base-adapter.js +104 -0
  17. package/dist/esm/adapters/base-adapter.js.map +1 -0
  18. package/dist/esm/adapters/browser-agent-adapter.js +219 -0
  19. package/dist/esm/adapters/browser-agent-adapter.js.map +1 -0
  20. package/dist/esm/adapters/codex-adapter.js +318 -0
  21. package/dist/esm/adapters/codex-adapter.js.map +1 -0
  22. package/dist/esm/adapters/copilot-adapter.js +132 -0
  23. package/dist/esm/adapters/copilot-adapter.js.map +1 -0
  24. package/dist/esm/adapters/crewai-adapter.js +148 -0
  25. package/dist/esm/adapters/crewai-adapter.js.map +1 -0
  26. package/dist/esm/adapters/custom-adapter.js +142 -0
  27. package/dist/esm/adapters/custom-adapter.js.map +1 -0
  28. package/dist/esm/adapters/custom-streaming-adapter.js +181 -0
  29. package/dist/esm/adapters/custom-streaming-adapter.js.map +1 -0
  30. package/dist/esm/adapters/dspy-adapter.js +127 -0
  31. package/dist/esm/adapters/dspy-adapter.js.map +1 -0
  32. package/dist/esm/adapters/haystack-adapter.js +149 -0
  33. package/dist/esm/adapters/haystack-adapter.js.map +1 -0
  34. package/dist/esm/adapters/hermes-adapter.js +217 -0
  35. package/dist/esm/adapters/hermes-adapter.js.map +1 -0
  36. package/dist/esm/adapters/index.js +109 -0
  37. package/dist/esm/adapters/index.js.map +1 -0
  38. package/dist/esm/adapters/langchain-adapter.js +134 -0
  39. package/dist/esm/adapters/langchain-adapter.js.map +1 -0
  40. package/dist/esm/adapters/langchain-streaming-adapter.js +161 -0
  41. package/dist/esm/adapters/langchain-streaming-adapter.js.map +1 -0
  42. package/dist/esm/adapters/langgraph-adapter.js +119 -0
  43. package/dist/esm/adapters/langgraph-adapter.js.map +1 -0
  44. package/dist/esm/adapters/llamaindex-adapter.js +135 -0
  45. package/dist/esm/adapters/llamaindex-adapter.js.map +1 -0
  46. package/dist/esm/adapters/mcp-adapter.js +200 -0
  47. package/dist/esm/adapters/mcp-adapter.js.map +1 -0
  48. package/dist/esm/adapters/minimax-adapter.js +233 -0
  49. package/dist/esm/adapters/minimax-adapter.js.map +1 -0
  50. package/dist/esm/adapters/nemoclaw-adapter.js +465 -0
  51. package/dist/esm/adapters/nemoclaw-adapter.js.map +1 -0
  52. package/dist/esm/adapters/openai-agents-adapter.js +118 -0
  53. package/dist/esm/adapters/openai-agents-adapter.js.map +1 -0
  54. package/dist/esm/adapters/openai-assistants-adapter.js +130 -0
  55. package/dist/esm/adapters/openai-assistants-adapter.js.map +1 -0
  56. package/dist/esm/adapters/openclaw-adapter.js +107 -0
  57. package/dist/esm/adapters/openclaw-adapter.js.map +1 -0
  58. package/dist/esm/adapters/orchestrator-adapter.js +218 -0
  59. package/dist/esm/adapters/orchestrator-adapter.js.map +1 -0
  60. package/dist/esm/adapters/pydantic-ai-adapter.js +163 -0
  61. package/dist/esm/adapters/pydantic-ai-adapter.js.map +1 -0
  62. package/dist/esm/adapters/rlm-adapter.js +167 -0
  63. package/dist/esm/adapters/rlm-adapter.js.map +1 -0
  64. package/dist/esm/adapters/semantic-kernel-adapter.js +123 -0
  65. package/dist/esm/adapters/semantic-kernel-adapter.js.map +1 -0
  66. package/dist/esm/adapters/streaming-base-adapter.js +74 -0
  67. package/dist/esm/adapters/streaming-base-adapter.js.map +1 -0
  68. package/dist/esm/adapters/vertex-ai-adapter.js +166 -0
  69. package/dist/esm/adapters/vertex-ai-adapter.js.map +1 -0
  70. package/dist/esm/demo-control-plane.js +147 -0
  71. package/dist/esm/demo-control-plane.js.map +1 -0
  72. package/dist/esm/demo-worktree-dashboard.js +131 -0
  73. package/dist/esm/demo-worktree-dashboard.js.map +1 -0
  74. package/dist/esm/examples/01-hello-swarm.js +165 -0
  75. package/dist/esm/examples/01-hello-swarm.js.map +1 -0
  76. package/dist/esm/examples/02-fsm-pipeline.js +189 -0
  77. package/dist/esm/examples/02-fsm-pipeline.js.map +1 -0
  78. package/dist/esm/examples/03-parallel-agents.js +192 -0
  79. package/dist/esm/examples/03-parallel-agents.js.map +1 -0
  80. package/dist/esm/examples/05-code-review-swarm.js +1177 -0
  81. package/dist/esm/examples/05-code-review-swarm.js.map +1 -0
  82. package/dist/esm/examples/06-ai-pipeline-demo.js +263 -0
  83. package/dist/esm/examples/06-ai-pipeline-demo.js.map +1 -0
  84. package/dist/esm/examples/07-full-showcase.js +946 -0
  85. package/dist/esm/examples/07-full-showcase.js.map +1 -0
  86. package/dist/esm/examples/08-control-plane-stress-demo.js +186 -0
  87. package/dist/esm/examples/08-control-plane-stress-demo.js.map +1 -0
  88. package/dist/esm/examples/09-real-langchain.js +231 -0
  89. package/dist/esm/examples/09-real-langchain.js.map +1 -0
  90. package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js +270 -0
  91. package/dist/esm/examples/10-nemoclaw-sandbox-swarm.js.map +1 -0
  92. package/dist/esm/examples/demo-runner.js +119 -0
  93. package/dist/esm/examples/demo-runner.js.map +1 -0
  94. package/dist/esm/index.js +1352 -0
  95. package/dist/esm/index.js.map +1 -0
  96. package/dist/esm/lib/adapter-hooks.js +216 -0
  97. package/dist/esm/lib/adapter-hooks.js.map +1 -0
  98. package/dist/esm/lib/adapter-test-harness.js +118 -0
  99. package/dist/esm/lib/adapter-test-harness.js.map +1 -0
  100. package/dist/esm/lib/agent-conversation.js +155 -0
  101. package/dist/esm/lib/agent-conversation.js.map +1 -0
  102. package/dist/esm/lib/agent-debate.js +146 -0
  103. package/dist/esm/lib/agent-debate.js.map +1 -0
  104. package/dist/esm/lib/agent-memory.js +336 -0
  105. package/dist/esm/lib/agent-memory.js.map +1 -0
  106. package/dist/esm/lib/agent-runtime.js +818 -0
  107. package/dist/esm/lib/agent-runtime.js.map +1 -0
  108. package/dist/esm/lib/agent-vcr.js +218 -0
  109. package/dist/esm/lib/agent-vcr.js.map +1 -0
  110. package/dist/esm/lib/anomaly-detector.js +178 -0
  111. package/dist/esm/lib/anomaly-detector.js.map +1 -0
  112. package/dist/esm/lib/approval-inbox.js +385 -0
  113. package/dist/esm/lib/approval-inbox.js.map +1 -0
  114. package/dist/esm/lib/auth-guardian.js +692 -0
  115. package/dist/esm/lib/auth-guardian.js.map +1 -0
  116. package/dist/esm/lib/auth-validator.js +32 -0
  117. package/dist/esm/lib/auth-validator.js.map +1 -0
  118. package/dist/esm/lib/blackboard-backend-crdt.js +251 -0
  119. package/dist/esm/lib/blackboard-backend-crdt.js.map +1 -0
  120. package/dist/esm/lib/blackboard-backend-redis.js +244 -0
  121. package/dist/esm/lib/blackboard-backend-redis.js.map +1 -0
  122. package/dist/esm/lib/blackboard-backend.js +141 -0
  123. package/dist/esm/lib/blackboard-backend.js.map +1 -0
  124. package/dist/esm/lib/blackboard-validator.js +985 -0
  125. package/dist/esm/lib/blackboard-validator.js.map +1 -0
  126. package/dist/esm/lib/circuit-breaker.js +164 -0
  127. package/dist/esm/lib/circuit-breaker.js.map +1 -0
  128. package/dist/esm/lib/claim-verifier.js +173 -0
  129. package/dist/esm/lib/claim-verifier.js.map +1 -0
  130. package/dist/esm/lib/comparison-runner.js +138 -0
  131. package/dist/esm/lib/comparison-runner.js.map +1 -0
  132. package/dist/esm/lib/compliance-monitor.js +261 -0
  133. package/dist/esm/lib/compliance-monitor.js.map +1 -0
  134. package/dist/esm/lib/confidence-filter.js +210 -0
  135. package/dist/esm/lib/confidence-filter.js.map +1 -0
  136. package/dist/esm/lib/config-watcher.js +215 -0
  137. package/dist/esm/lib/config-watcher.js.map +1 -0
  138. package/dist/esm/lib/consistency.js +274 -0
  139. package/dist/esm/lib/consistency.js.map +1 -0
  140. package/dist/esm/lib/console-ui.js +276 -0
  141. package/dist/esm/lib/console-ui.js.map +1 -0
  142. package/dist/esm/lib/context-throttler.js +171 -0
  143. package/dist/esm/lib/context-throttler.js.map +1 -0
  144. package/dist/esm/lib/control-plane.js +527 -0
  145. package/dist/esm/lib/control-plane.js.map +1 -0
  146. package/dist/esm/lib/cost-governor.js +128 -0
  147. package/dist/esm/lib/cost-governor.js.map +1 -0
  148. package/dist/esm/lib/cost-heatmap.js +161 -0
  149. package/dist/esm/lib/cost-heatmap.js.map +1 -0
  150. package/dist/esm/lib/coverage-gate.js +213 -0
  151. package/dist/esm/lib/coverage-gate.js.map +1 -0
  152. package/dist/esm/lib/coverage-reporter.js +177 -0
  153. package/dist/esm/lib/coverage-reporter.js.map +1 -0
  154. package/dist/esm/lib/crdt.js +141 -0
  155. package/dist/esm/lib/crdt.js.map +1 -0
  156. package/dist/esm/lib/dashboard-server.js +403 -0
  157. package/dist/esm/lib/dashboard-server.js.map +1 -0
  158. package/dist/esm/lib/dry-run.js +130 -0
  159. package/dist/esm/lib/dry-run.js.map +1 -0
  160. package/dist/esm/lib/env-manager.js +518 -0
  161. package/dist/esm/lib/env-manager.js.map +1 -0
  162. package/dist/esm/lib/errors.js +201 -0
  163. package/dist/esm/lib/errors.js.map +1 -0
  164. package/dist/esm/lib/event-bus.js +229 -0
  165. package/dist/esm/lib/event-bus.js.map +1 -0
  166. package/dist/esm/lib/explainability.js +102 -0
  167. package/dist/esm/lib/explainability.js.map +1 -0
  168. package/dist/esm/lib/fan-out.js +237 -0
  169. package/dist/esm/lib/fan-out.js.map +1 -0
  170. package/dist/esm/lib/federated-budget.js +322 -0
  171. package/dist/esm/lib/federated-budget.js.map +1 -0
  172. package/dist/esm/lib/fsm-journey.js +478 -0
  173. package/dist/esm/lib/fsm-journey.js.map +1 -0
  174. package/dist/esm/lib/goal-decomposer.js +698 -0
  175. package/dist/esm/lib/goal-decomposer.js.map +1 -0
  176. package/dist/esm/lib/goal-dsl.js +391 -0
  177. package/dist/esm/lib/goal-dsl.js.map +1 -0
  178. package/dist/esm/lib/job-queue.js +310 -0
  179. package/dist/esm/lib/job-queue.js.map +1 -0
  180. package/dist/esm/lib/landscape-agent.js +134 -0
  181. package/dist/esm/lib/landscape-agent.js.map +1 -0
  182. package/dist/esm/lib/learning-loop.js +181 -0
  183. package/dist/esm/lib/learning-loop.js.map +1 -0
  184. package/dist/esm/lib/lifecycle-hooks.js +148 -0
  185. package/dist/esm/lib/lifecycle-hooks.js.map +1 -0
  186. package/dist/esm/lib/locked-blackboard.js +1295 -0
  187. package/dist/esm/lib/locked-blackboard.js.map +1 -0
  188. package/dist/esm/lib/logger.js +150 -0
  189. package/dist/esm/lib/logger.js.map +1 -0
  190. package/dist/esm/lib/mcp-blackboard-tools.js +298 -0
  191. package/dist/esm/lib/mcp-blackboard-tools.js.map +1 -0
  192. package/dist/esm/lib/mcp-bridge.js +357 -0
  193. package/dist/esm/lib/mcp-bridge.js.map +1 -0
  194. package/dist/esm/lib/mcp-tool-consumer.js +287 -0
  195. package/dist/esm/lib/mcp-tool-consumer.js.map +1 -0
  196. package/dist/esm/lib/mcp-tools-control.js +392 -0
  197. package/dist/esm/lib/mcp-tools-control.js.map +1 -0
  198. package/dist/esm/lib/mcp-tools-extended.js +371 -0
  199. package/dist/esm/lib/mcp-tools-extended.js.map +1 -0
  200. package/dist/esm/lib/mcp-transport-http.js +528 -0
  201. package/dist/esm/lib/mcp-transport-http.js.map +1 -0
  202. package/dist/esm/lib/mcp-transport-sse.js +503 -0
  203. package/dist/esm/lib/mcp-transport-sse.js.map +1 -0
  204. package/dist/esm/lib/metrics.js +284 -0
  205. package/dist/esm/lib/metrics.js.map +1 -0
  206. package/dist/esm/lib/orchestrator-types.js +66 -0
  207. package/dist/esm/lib/orchestrator-types.js.map +1 -0
  208. package/dist/esm/lib/otel-bridge.js +167 -0
  209. package/dist/esm/lib/otel-bridge.js.map +1 -0
  210. package/dist/esm/lib/partition-planner.js +246 -0
  211. package/dist/esm/lib/partition-planner.js.map +1 -0
  212. package/dist/esm/lib/phase-pipeline.js +367 -0
  213. package/dist/esm/lib/phase-pipeline.js.map +1 -0
  214. package/dist/esm/lib/playground.js +224 -0
  215. package/dist/esm/lib/playground.js.map +1 -0
  216. package/dist/esm/lib/qa-orchestrator.js +296 -0
  217. package/dist/esm/lib/qa-orchestrator.js.map +1 -0
  218. package/dist/esm/lib/quadtree.js +259 -0
  219. package/dist/esm/lib/quadtree.js.map +1 -0
  220. package/dist/esm/lib/route-classifier.js +217 -0
  221. package/dist/esm/lib/route-classifier.js.map +1 -0
  222. package/dist/esm/lib/semantic-search.js +235 -0
  223. package/dist/esm/lib/semantic-search.js.map +1 -0
  224. package/dist/esm/lib/shared-blackboard.js +249 -0
  225. package/dist/esm/lib/shared-blackboard.js.map +1 -0
  226. package/dist/esm/lib/skill-composer.js +190 -0
  227. package/dist/esm/lib/skill-composer.js.map +1 -0
  228. package/dist/esm/lib/speculative-executor.js +107 -0
  229. package/dist/esm/lib/speculative-executor.js.map +1 -0
  230. package/dist/esm/lib/strategy-agent.js +626 -0
  231. package/dist/esm/lib/strategy-agent.js.map +1 -0
  232. package/dist/esm/lib/swarm-transport.js +307 -0
  233. package/dist/esm/lib/swarm-transport.js.map +1 -0
  234. package/dist/esm/lib/swarm-utils.js +510 -0
  235. package/dist/esm/lib/swarm-utils.js.map +1 -0
  236. package/dist/esm/lib/task-decomposer.js +272 -0
  237. package/dist/esm/lib/task-decomposer.js.map +1 -0
  238. package/dist/esm/lib/telemetry-provider.js +207 -0
  239. package/dist/esm/lib/telemetry-provider.js.map +1 -0
  240. package/dist/esm/lib/timeline-scrubber.js +173 -0
  241. package/dist/esm/lib/timeline-scrubber.js.map +1 -0
  242. package/dist/esm/lib/topology.js +591 -0
  243. package/dist/esm/lib/topology.js.map +1 -0
  244. package/dist/esm/lib/transport-agent.js +366 -0
  245. package/dist/esm/lib/transport-agent.js.map +1 -0
  246. package/dist/esm/lib/work-tree-dashboard.js +583 -0
  247. package/dist/esm/lib/work-tree-dashboard.js.map +1 -0
  248. package/dist/esm/lib/work-tree-ui.js +333 -0
  249. package/dist/esm/lib/work-tree-ui.js.map +1 -0
  250. package/dist/esm/lib/work-tree.js +480 -0
  251. package/dist/esm/lib/work-tree.js.map +1 -0
  252. package/dist/esm/run.js +144 -0
  253. package/dist/esm/run.js.map +1 -0
  254. package/dist/esm/security.js +1122 -0
  255. package/dist/esm/security.js.map +1 -0
  256. package/dist/index.d.ts +2 -0
  257. package/dist/index.d.ts.map +1 -1
  258. package/dist/index.js +6 -1
  259. package/dist/index.js.map +1 -1
  260. package/dist/lib/mcp-transport-http.d.ts +203 -0
  261. package/dist/lib/mcp-transport-http.d.ts.map +1 -0
  262. package/dist/lib/mcp-transport-http.js +528 -0
  263. package/dist/lib/mcp-transport-http.js.map +1 -0
  264. package/dist/lib/phase-pipeline.d.ts +31 -0
  265. package/dist/lib/phase-pipeline.d.ts.map +1 -1
  266. package/dist/lib/phase-pipeline.js +93 -1
  267. package/dist/lib/phase-pipeline.js.map +1 -1
  268. package/dist/lib/semantic-search.d.ts +42 -6
  269. package/dist/lib/semantic-search.d.ts.map +1 -1
  270. package/dist/lib/semantic-search.js +87 -6
  271. package/dist/lib/semantic-search.js.map +1 -1
  272. package/package.json +24 -4
@@ -0,0 +1,392 @@
1
+ "use strict";
2
+ /**
3
+ * Control-Plane MCP Tools — Phase 6 Part 4
4
+ *
5
+ * Exposes orchestrator configuration and agent lifecycle operations as MCP
6
+ * tools, giving an external AI agent full control-plane access to Network-AI.
7
+ *
8
+ * Tools exposed:
9
+ * config_get — read current CONFIG values
10
+ * config_set — update any CONFIG field at runtime
11
+ * agent_list — list all currently registered agents and their status
12
+ * agent_spawn — dispatch a task to a named agent
13
+ * agent_stop — mark a running agent as stopped
14
+ * fsm_transition — write an FSM state transition to the blackboard
15
+ * orchestrator_info — get orchestrator version, adapter count, blackboard stats
16
+ *
17
+ * @module mcp-tools-control
18
+ * @version 1.0.0
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.ControlMcpTools = void 0;
22
+ // ============================================================================
23
+ // TOOL DEFINITIONS
24
+ // ============================================================================
25
+ const CONTROL_TOOL_DEFINITIONS = [
26
+ {
27
+ name: 'config_get',
28
+ description: 'Read one or all live orchestrator configuration values. Returns {ok:true, key, value} for a single key, or {ok:true, config:{...}} for all keys. Returns {ok:false, error:"Unknown config key: \\"...\\" Known keys: ..."} if the key is not recognised. Call without a key to discover available config names; use config_set to update values at runtime.',
29
+ inputSchema: {
30
+ type: 'object',
31
+ properties: {
32
+ key: { type: 'string', description: 'Specific config key to read. Omit to return all values.' },
33
+ },
34
+ required: [],
35
+ },
36
+ },
37
+ {
38
+ name: 'config_set',
39
+ description: 'Update a live orchestrator configuration value at runtime. Changes take effect immediately for all subsequent operations and are written to the audit log — there is no undo. Returns {ok:true, key, value, previous} on success. Returns {ok:false, error:"Unknown config key..."} with a list of valid keys if the key is not recognised, or {ok:false, error:"..."} if value is not valid JSON. Call config_get first to read the current value and confirm the key name before updating.',
40
+ inputSchema: {
41
+ type: 'object',
42
+ properties: {
43
+ key: { type: 'string', description: 'Config key to update (e.g. "maxParallelAgents", "defaultTimeout", "enableTracing")' },
44
+ value: { type: 'string', description: 'New value (JSON-encoded). E.g. "10" for a number, "true" for boolean, \'"string"\' for string.' },
45
+ },
46
+ required: ['key', 'value'],
47
+ },
48
+ },
49
+ {
50
+ name: 'agent_list',
51
+ description: 'List all agents registered with the orchestrator and their current status. Read-only — no side effects. Returns {ok:true, agents:[{agentId, status, lastSeen, taskCount}], count}. Returns {ok:false, error:"..."} if the registry is unavailable. status_filter accepts one of: "active", "idle", "stopped", or "error" — omit to return all statuses. Call before agent_spawn or agent_stop to confirm the target agent exists and has the expected status.',
52
+ inputSchema: {
53
+ type: 'object',
54
+ properties: {
55
+ status_filter: { type: 'string', description: 'Filter by status (optional): active, idle, stopped, error' },
56
+ },
57
+ required: [],
58
+ },
59
+ },
60
+ {
61
+ name: 'agent_spawn',
62
+ description: 'Write a task record to the blackboard to dispatch work to a named agent on its next poll cycle. Returns {ok:true, taskKey, agentId, instruction, written:true} on success. Returns {ok:false, error:"..."} if agent_id, task_key, or instruction is missing, or if payload_json is malformed. Call agent_list first to confirm the target agent is registered; verify the task was recorded with blackboard_read after spawning.',
63
+ inputSchema: {
64
+ type: 'object',
65
+ properties: {
66
+ agent_id: { type: 'string', description: 'ID of the agent to assign the task to (e.g. "code_writer", "data_analyst")' },
67
+ task_key: { type: 'string', description: 'Blackboard key for the task (e.g. "task:write:auth_module")' },
68
+ instruction: { type: 'string', description: 'Natural language instruction for the agent' },
69
+ payload_json: { type: 'string', description: 'Optional JSON-encoded extra payload for the agent' },
70
+ ttl: { type: 'string', description: 'Time-to-live for the task entry in seconds (default: 3600)' },
71
+ },
72
+ required: ['agent_id', 'task_key', 'instruction'],
73
+ },
74
+ },
75
+ {
76
+ name: 'agent_stop',
77
+ description: 'Signal a running agent to stop by writing a stop record to the blackboard and marking it stopped in the registry. Returns {ok:true, agentId, reason, stopped:true}. Returns {ok:false, error:"..."} if agent_id is missing. agent_id must match a value returned by agent_list; reason is optional but written to the audit log under eventType "agent_stop" and helps trace the cause of the stop. The agent observes the stop signal on its next poll — it does not terminate immediately. Call agent_list first to confirm the agent is currently active.',
78
+ inputSchema: {
79
+ type: 'object',
80
+ properties: {
81
+ agent_id: { type: 'string', description: 'ID of the agent to stop' },
82
+ reason: { type: 'string', description: 'Reason for stopping (optional, for audit)' },
83
+ },
84
+ required: ['agent_id'],
85
+ },
86
+ },
87
+ {
88
+ name: 'fsm_transition',
89
+ description: 'Advance a named FSM (Finite State Machine) to a new state and record the transition on the blackboard. Transitions are irreversible via this tool — new_state is written directly without validating against a predefined state graph, so the caller must ensure the transition is valid. Returns {ok:true, fsmId, transition:{from, to}, blackboardWritten:true} on success. Returns {ok:false, error:"..."} if fsm_id, new_state, or agent_id is missing, or if metadata_json is not valid JSON. Avoid concurrent transitions to the same FSM from multiple agents; call orchestrator_info first to read the current FSM state before transitioning.',
90
+ inputSchema: {
91
+ type: 'object',
92
+ properties: {
93
+ fsm_id: { type: 'string', description: 'FSM identifier (e.g. "order_pipeline", "code_review_workflow")' },
94
+ new_state: { type: 'string', description: 'The state to transition to' },
95
+ metadata_json: { type: 'string', description: 'Optional JSON metadata to attach to the transition' },
96
+ agent_id: { type: 'string', description: 'Agent performing the transition (for audit)' },
97
+ },
98
+ required: ['fsm_id', 'new_state', 'agent_id'],
99
+ },
100
+ },
101
+ {
102
+ name: 'orchestrator_info',
103
+ description: 'Return a full health snapshot of the orchestrator: version, config values, registered agent count, blackboard key count, and system uptime. Returns {ok:true, version, config:{...}, agentCount, blackboardKeyCount, uptime}. This tool always succeeds — it never returns {ok:false}. Use as the first call when connecting to confirm the server is healthy and to discover current config before calling config_get or agent_list.',
104
+ inputSchema: {
105
+ type: 'object',
106
+ properties: {},
107
+ required: [],
108
+ },
109
+ },
110
+ ];
111
+ // ============================================================================
112
+ // CONTROL MCP TOOLS
113
+ // ============================================================================
114
+ /**
115
+ * MCP tool provider for orchestrator control-plane operations.
116
+ *
117
+ * @example
118
+ * ```typescript
119
+ * import { ControlMcpTools } from 'network-ai';
120
+ *
121
+ * const controlTools = new ControlMcpTools({
122
+ * config: CONFIG, // live reference — mutations take effect immediately
123
+ * agentRegistry: agentMap,
124
+ * blackboard: orchestrator.getBlackboard(),
125
+ * systemToken: 'system-orchestrator-token',
126
+ * });
127
+ *
128
+ * combined.register(controlTools);
129
+ * ```
130
+ */
131
+ class ControlMcpTools {
132
+ _config;
133
+ _agentRegistry;
134
+ _blackboard;
135
+ _systemToken;
136
+ _stoppedAgents = new Map(); // agentId -> reason
137
+ constructor(options) {
138
+ this._config = options.config;
139
+ this._agentRegistry = options.agentRegistry;
140
+ this._blackboard = options.blackboard;
141
+ this._systemToken = options.systemToken ?? 'system-orchestrator-token';
142
+ }
143
+ getDefinitions() {
144
+ return CONTROL_TOOL_DEFINITIONS;
145
+ }
146
+ async call(toolName, args) {
147
+ try {
148
+ switch (toolName) {
149
+ case 'config_get': return this._configGet(args);
150
+ case 'config_set': return this._configSet(args);
151
+ case 'agent_list': return this._agentList(args);
152
+ case 'agent_spawn': return this._agentSpawn(args);
153
+ case 'agent_stop': return this._agentStop(args);
154
+ case 'fsm_transition': return this._fsmTransition(args);
155
+ case 'orchestrator_info': return this._orchestratorInfo();
156
+ default:
157
+ return { ok: false, tool: toolName, error: `Unknown control tool: "${toolName}"` };
158
+ }
159
+ }
160
+ catch (err) {
161
+ return { ok: false, tool: toolName, error: err instanceof Error ? err.message : String(err) };
162
+ }
163
+ }
164
+ // --------------------------------------------------------------------------
165
+ // Config tools
166
+ // --------------------------------------------------------------------------
167
+ _configGet(args) {
168
+ const key = args['key'] ? String(args['key']) : null;
169
+ if (key) {
170
+ if (!(key in this._config)) {
171
+ return { ok: false, tool: 'config_get', error: `Unknown config key: "${key}". Known keys: ${Object.keys(this._config).join(', ')}` };
172
+ }
173
+ return { ok: true, tool: 'config_get', data: { [key]: this._config[key] } };
174
+ }
175
+ // Return entire config (exclude any function values)
176
+ const snapshot = {};
177
+ for (const [k, v] of Object.entries(this._config)) {
178
+ if (typeof v !== 'function')
179
+ snapshot[k] = v;
180
+ }
181
+ return { ok: true, tool: 'config_get', data: snapshot };
182
+ }
183
+ _configSet(args) {
184
+ const key = String(args['key'] ?? '');
185
+ const rawValue = String(args['value'] ?? '');
186
+ if (!key)
187
+ return { ok: false, tool: 'config_set', error: 'key is required' };
188
+ if (!rawValue && rawValue !== '0')
189
+ return { ok: false, tool: 'config_set', error: 'value is required' };
190
+ // Defense-in-depth: only permit known, safe config keys
191
+ const ALLOWED_KEYS = new Set([
192
+ 'maxParallelAgents',
193
+ 'defaultTimeout',
194
+ 'enableTracing',
195
+ 'grantTokenTTL',
196
+ 'maxBlackboardValueSize',
197
+ ]);
198
+ if (!ALLOWED_KEYS.has(key)) {
199
+ return {
200
+ ok: false,
201
+ tool: 'config_set',
202
+ error: `Unknown or immutable config key: "${key}". Allowed keys: ${[...ALLOWED_KEYS].join(', ')}`,
203
+ };
204
+ }
205
+ let parsed;
206
+ try {
207
+ parsed = JSON.parse(rawValue);
208
+ }
209
+ catch {
210
+ // Treat as raw string if not valid JSON
211
+ parsed = rawValue;
212
+ }
213
+ const previous = this._config[key];
214
+ this._config[key] = parsed;
215
+ return {
216
+ ok: true,
217
+ tool: 'config_set',
218
+ data: { key, previous, current: parsed, applied: true },
219
+ };
220
+ }
221
+ // --------------------------------------------------------------------------
222
+ // Agent tools
223
+ // --------------------------------------------------------------------------
224
+ _agentList(args) {
225
+ const statusFilter = args['status_filter'] ? String(args['status_filter']).toLowerCase() : null;
226
+ const agents = [];
227
+ if (this._agentRegistry) {
228
+ for (const [id, status] of this._agentRegistry) {
229
+ const entry = { ...status };
230
+ entry.agentId = id; // map key takes precedence
231
+ // Mark stopped agents
232
+ if (this._stoppedAgents.has(id)) {
233
+ entry.status = 'stopped';
234
+ entry.stopReason = this._stoppedAgents.get(id);
235
+ }
236
+ if (!statusFilter || String(entry.status).toLowerCase() === statusFilter) {
237
+ agents.push(entry);
238
+ }
239
+ }
240
+ }
241
+ // Also include stopped agents that may not be in the registry
242
+ for (const [id, reason] of this._stoppedAgents) {
243
+ if (!agents.find(a => a.agentId === id)) {
244
+ const entry = { agentId: id, status: 'stopped', stopReason: reason };
245
+ if (!statusFilter || statusFilter === 'stopped') {
246
+ agents.push(entry);
247
+ }
248
+ }
249
+ }
250
+ return { ok: true, tool: 'agent_list', data: { agents, count: agents.length } };
251
+ }
252
+ _agentSpawn(args) {
253
+ const agentId = String(args['agent_id'] ?? '');
254
+ const taskKey = String(args['task_key'] ?? '');
255
+ const instruction = String(args['instruction'] ?? '');
256
+ const ttl = Number(args['ttl']) || 3600;
257
+ if (!agentId)
258
+ return { ok: false, tool: 'agent_spawn', error: 'agent_id is required' };
259
+ if (!taskKey)
260
+ return { ok: false, tool: 'agent_spawn', error: 'task_key is required' };
261
+ if (!instruction)
262
+ return { ok: false, tool: 'agent_spawn', error: 'instruction is required' };
263
+ let extraPayload = undefined;
264
+ if (args['payload_json']) {
265
+ try {
266
+ extraPayload = JSON.parse(String(args['payload_json']));
267
+ }
268
+ catch {
269
+ return { ok: false, tool: 'agent_spawn', error: 'payload_json must be valid JSON' };
270
+ }
271
+ }
272
+ const task = {
273
+ agentId,
274
+ instruction,
275
+ payload: extraPayload,
276
+ spawnedAt: new Date().toISOString(),
277
+ spawnedBy: 'mcp-control',
278
+ status: 'pending',
279
+ };
280
+ if (this._blackboard) {
281
+ this._blackboard.write(taskKey, JSON.stringify(task), 'mcp-control', ttl, this._systemToken);
282
+ }
283
+ return {
284
+ ok: true,
285
+ tool: 'agent_spawn',
286
+ data: {
287
+ agentId,
288
+ taskKey,
289
+ task,
290
+ blackboardWritten: !!this._blackboard,
291
+ message: this._blackboard
292
+ ? `Task written to blackboard at key "${taskKey}". Agent "${agentId}" will pick it up on next poll.`
293
+ : `No blackboard configured — task object returned but NOT persisted. Configure blackboard in ControlMcpTools.`,
294
+ },
295
+ };
296
+ }
297
+ _agentStop(args) {
298
+ const agentId = String(args['agent_id'] ?? '');
299
+ const reason = String(args['reason'] ?? 'stopped via MCP control tool');
300
+ if (!agentId)
301
+ return { ok: false, tool: 'agent_stop', error: 'agent_id is required' };
302
+ this._stoppedAgents.set(agentId, reason);
303
+ const stopKey = `agent:stop:${agentId}`;
304
+ if (this._blackboard) {
305
+ this._blackboard.write(stopKey, JSON.stringify({ agentId, reason, stoppedAt: new Date().toISOString() }), 'mcp-control', 300, this._systemToken);
306
+ }
307
+ return {
308
+ ok: true,
309
+ tool: 'agent_stop',
310
+ data: { agentId, reason, stopped: true, blackboardWritten: !!this._blackboard },
311
+ };
312
+ }
313
+ // --------------------------------------------------------------------------
314
+ // FSM tool
315
+ // --------------------------------------------------------------------------
316
+ _fsmTransition(args) {
317
+ const fsmId = String(args['fsm_id'] ?? '');
318
+ const newState = String(args['new_state'] ?? '');
319
+ const agentId = String(args['agent_id'] ?? '');
320
+ if (!fsmId)
321
+ return { ok: false, tool: 'fsm_transition', error: 'fsm_id is required' };
322
+ if (!newState)
323
+ return { ok: false, tool: 'fsm_transition', error: 'new_state is required' };
324
+ if (!agentId)
325
+ return { ok: false, tool: 'fsm_transition', error: 'agent_id is required' };
326
+ let metadata = undefined;
327
+ if (args['metadata_json']) {
328
+ try {
329
+ metadata = JSON.parse(String(args['metadata_json']));
330
+ }
331
+ catch {
332
+ return { ok: false, tool: 'fsm_transition', error: 'metadata_json must be valid JSON' };
333
+ }
334
+ }
335
+ const stateKey = `fsm:${fsmId}:state`;
336
+ const historyKey = `fsm:${fsmId}:history`;
337
+ let previousState = null;
338
+ if (this._blackboard) {
339
+ previousState = this._blackboard.read(stateKey)?.value ?? null;
340
+ }
341
+ const transition = {
342
+ from: previousState,
343
+ to: newState,
344
+ by: agentId,
345
+ at: new Date().toISOString(),
346
+ metadata,
347
+ };
348
+ if (this._blackboard) {
349
+ this._blackboard.write(stateKey, newState, agentId, undefined, this._systemToken);
350
+ // Append to history (read existing, push new entry)
351
+ const existing = this._blackboard.read(historyKey);
352
+ const history = existing ? JSON.parse(String(existing.value)) : [];
353
+ history.push(transition);
354
+ this._blackboard.write(historyKey, JSON.stringify(history), agentId, undefined, this._systemToken);
355
+ }
356
+ return {
357
+ ok: true,
358
+ tool: 'fsm_transition',
359
+ data: { fsmId, transition, blackboardWritten: !!this._blackboard },
360
+ };
361
+ }
362
+ // --------------------------------------------------------------------------
363
+ // Info
364
+ // --------------------------------------------------------------------------
365
+ _orchestratorInfo() {
366
+ const snapshot = {};
367
+ for (const [k, v] of Object.entries(this._config)) {
368
+ if (typeof v !== 'function')
369
+ snapshot[k] = v;
370
+ }
371
+ const bbSnapshot = this._blackboard?.getSnapshot() ?? {};
372
+ return {
373
+ ok: true,
374
+ tool: 'orchestrator_info',
375
+ data: {
376
+ version: '4.0.3',
377
+ config: snapshot,
378
+ agents: {
379
+ registered: this._agentRegistry?.size ?? 0,
380
+ stopped: this._stoppedAgents.size,
381
+ },
382
+ blackboard: {
383
+ keys: Object.keys(bbSnapshot).length,
384
+ available: !!this._blackboard,
385
+ },
386
+ ts: new Date().toISOString(),
387
+ },
388
+ };
389
+ }
390
+ }
391
+ exports.ControlMcpTools = ControlMcpTools;
392
+ //# sourceMappingURL=mcp-tools-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools-control.js","sourceRoot":"","sources":["../../../lib/mcp-tools-control.ts"],"names":[],"mappings":"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"}