@adhd/agent-mcp 2.0.1 → 2.1.1

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 (290) hide show
  1. package/AGENTS.md +236 -0
  2. package/CHANGELOG.md +115 -0
  3. package/LICENSE +21 -0
  4. package/README.md +201 -0
  5. package/adhd-agent-mcp-2.1.1.tgz +0 -0
  6. package/docs/architecture-and-security.md +405 -0
  7. package/docs/marketing/.catalog/capabilities.md +143 -0
  8. package/docs/marketing/.catalog/consumer.md +111 -0
  9. package/docs/marketing/.catalog/distribution.md +223 -0
  10. package/docs/marketing/.catalog/doc-conformance.md +237 -0
  11. package/docs/marketing/.catalog/doc-ops.md +98 -0
  12. package/docs/marketing/.catalog/metrics.md +119 -0
  13. package/docs/marketing/.catalog/required-tooling.md +224 -0
  14. package/docs/marketing/.catalog/review.md +164 -0
  15. package/docs/provider-call-audit.md +254 -0
  16. package/drizzle/0007_smart_callisto.sql +40 -0
  17. package/drizzle/0008_cache_and_peak_context_usage.sql +19 -0
  18. package/drizzle/0009_restore_sessions_agent_fk.sql +29 -0
  19. package/drizzle/meta/0007_snapshot.json +658 -0
  20. package/drizzle/meta/_journal.json +22 -1
  21. package/llms.txt +133 -0
  22. package/package.json +30 -51
  23. package/src/__tests__/integration/harness.d.ts +871 -39
  24. package/src/__tests__/integration/harness.d.ts.map +1 -1
  25. package/src/__tests__/integration/harness.js +93 -87
  26. package/src/__tests__/integration/harness.js.map +1 -1
  27. package/src/__tests__/integration/scripted-provider.d.ts +1 -2
  28. package/src/__tests__/integration/scripted-provider.d.ts.map +1 -1
  29. package/src/__tests__/integration/scripted-provider.js +1 -3
  30. package/src/__tests__/integration/scripted-provider.js.map +1 -1
  31. package/src/config.d.ts +6 -69
  32. package/src/config.d.ts.map +1 -1
  33. package/src/config.js +1 -50
  34. package/src/config.js.map +1 -1
  35. package/src/db/client.d.ts +1516 -2
  36. package/src/db/client.d.ts.map +1 -1
  37. package/src/db/client.js +4 -2
  38. package/src/db/client.js.map +1 -1
  39. package/src/db/migrate-runner.d.ts +0 -28
  40. package/src/db/migrate-runner.d.ts.map +1 -1
  41. package/src/db/migrate-runner.js +0 -24
  42. package/src/db/migrate-runner.js.map +1 -1
  43. package/src/db/migrate.d.ts +0 -7
  44. package/src/db/migrate.d.ts.map +1 -1
  45. package/src/db/migrate.js +0 -7
  46. package/src/db/migrate.js.map +1 -1
  47. package/src/db/schema.d.ts +0 -1260
  48. package/src/db/schema.d.ts.map +1 -1
  49. package/src/db/schema.js +2 -179
  50. package/src/db/schema.js.map +1 -1
  51. package/src/index.d.ts +3 -42
  52. package/src/index.d.ts.map +1 -1
  53. package/src/index.js +32 -123
  54. package/src/index.js.map +1 -1
  55. package/src/logger.d.ts +0 -8
  56. package/src/logger.d.ts.map +1 -1
  57. package/src/logger.js +1 -12
  58. package/src/logger.js.map +1 -1
  59. package/src/scripts/agent-mcp-tail.d.ts +3 -0
  60. package/src/scripts/agent-mcp-tail.d.ts.map +1 -0
  61. package/src/scripts/agent-mcp-tail.js +227 -0
  62. package/src/scripts/agent-mcp-tail.js.map +1 -0
  63. package/src/server.d.ts +13 -34
  64. package/src/server.d.ts.map +1 -1
  65. package/src/server.js +234 -326
  66. package/src/server.js.map +1 -1
  67. package/src/store/agent-store.d.ts +3 -16
  68. package/src/store/agent-store.d.ts.map +1 -1
  69. package/src/store/agent-store.js +38 -41
  70. package/src/store/agent-store.js.map +1 -1
  71. package/src/streaming/chat-gateway.d.ts +17 -0
  72. package/src/streaming/chat-gateway.d.ts.map +1 -0
  73. package/src/streaming/chat-gateway.js +336 -0
  74. package/src/streaming/chat-gateway.js.map +1 -0
  75. package/src/streaming/event-bus.d.ts +4 -0
  76. package/src/streaming/event-bus.d.ts.map +1 -1
  77. package/src/streaming/event-bus.js +14 -1
  78. package/src/streaming/event-bus.js.map +1 -1
  79. package/src/streaming/sse-server.d.ts +3 -14
  80. package/src/streaming/sse-server.d.ts.map +1 -1
  81. package/src/streaming/sse-server.js +37 -37
  82. package/src/streaming/sse-server.js.map +1 -1
  83. package/src/utils/load-env.d.ts +0 -14
  84. package/src/utils/load-env.d.ts.map +1 -1
  85. package/src/utils/load-env.js +0 -18
  86. package/src/utils/load-env.js.map +1 -1
  87. package/src/clients/http-client.d.ts +0 -24
  88. package/src/clients/http-client.d.ts.map +0 -1
  89. package/src/clients/http-client.js +0 -98
  90. package/src/clients/http-client.js.map +0 -1
  91. package/src/clients/in-process.d.ts +0 -27
  92. package/src/clients/in-process.d.ts.map +0 -1
  93. package/src/clients/in-process.js +0 -37
  94. package/src/clients/in-process.js.map +0 -1
  95. package/src/clients/index.d.ts +0 -7
  96. package/src/clients/index.d.ts.map +0 -1
  97. package/src/clients/index.js +0 -5
  98. package/src/clients/index.js.map +0 -1
  99. package/src/clients/registry.d.ts +0 -54
  100. package/src/clients/registry.d.ts.map +0 -1
  101. package/src/clients/registry.js +0 -164
  102. package/src/clients/registry.js.map +0 -1
  103. package/src/clients/stdio-client.d.ts +0 -16
  104. package/src/clients/stdio-client.d.ts.map +0 -1
  105. package/src/clients/stdio-client.js +0 -97
  106. package/src/clients/stdio-client.js.map +0 -1
  107. package/src/clients/tool-naming.d.ts +0 -44
  108. package/src/clients/tool-naming.d.ts.map +0 -1
  109. package/src/clients/tool-naming.js +0 -65
  110. package/src/clients/tool-naming.js.map +0 -1
  111. package/src/clients/types.d.ts +0 -18
  112. package/src/clients/types.d.ts.map +0 -1
  113. package/src/clients/types.js +0 -2
  114. package/src/clients/types.js.map +0 -1
  115. package/src/engine/dag-engine.d.ts +0 -62
  116. package/src/engine/dag-engine.d.ts.map +0 -1
  117. package/src/engine/dag-engine.js +0 -158
  118. package/src/engine/dag-engine.js.map +0 -1
  119. package/src/engine/hooks.d.ts +0 -24
  120. package/src/engine/hooks.d.ts.map +0 -1
  121. package/src/engine/hooks.js +0 -50
  122. package/src/engine/hooks.js.map +0 -1
  123. package/src/engine/orchestrator.d.ts +0 -40
  124. package/src/engine/orchestrator.d.ts.map +0 -1
  125. package/src/engine/orchestrator.js +0 -507
  126. package/src/engine/orchestrator.js.map +0 -1
  127. package/src/engine/policy.d.ts +0 -66
  128. package/src/engine/policy.d.ts.map +0 -1
  129. package/src/engine/policy.js +0 -112
  130. package/src/engine/policy.js.map +0 -1
  131. package/src/engine/prompt-resolver.d.ts +0 -89
  132. package/src/engine/prompt-resolver.d.ts.map +0 -1
  133. package/src/engine/prompt-resolver.js +0 -96
  134. package/src/engine/prompt-resolver.js.map +0 -1
  135. package/src/engine/queue.d.ts +0 -29
  136. package/src/engine/queue.d.ts.map +0 -1
  137. package/src/engine/queue.js +0 -56
  138. package/src/engine/queue.js.map +0 -1
  139. package/src/plugins/index.d.ts +0 -2
  140. package/src/plugins/index.d.ts.map +0 -1
  141. package/src/plugins/index.js +0 -2
  142. package/src/plugins/index.js.map +0 -1
  143. package/src/plugins/loader.d.ts +0 -65
  144. package/src/plugins/loader.d.ts.map +0 -1
  145. package/src/plugins/loader.js +0 -222
  146. package/src/plugins/loader.js.map +0 -1
  147. package/src/plugins/usage-plugin.d.ts +0 -27
  148. package/src/plugins/usage-plugin.d.ts.map +0 -1
  149. package/src/plugins/usage-plugin.js +0 -148
  150. package/src/plugins/usage-plugin.js.map +0 -1
  151. package/src/providers/anthropic.d.ts +0 -13
  152. package/src/providers/anthropic.d.ts.map +0 -1
  153. package/src/providers/anthropic.js +0 -260
  154. package/src/providers/anthropic.js.map +0 -1
  155. package/src/providers/claudecli.d.ts +0 -153
  156. package/src/providers/claudecli.d.ts.map +0 -1
  157. package/src/providers/claudecli.js +0 -510
  158. package/src/providers/claudecli.js.map +0 -1
  159. package/src/providers/factory.d.ts +0 -10
  160. package/src/providers/factory.d.ts.map +0 -1
  161. package/src/providers/factory.js +0 -24
  162. package/src/providers/factory.js.map +0 -1
  163. package/src/providers/index.d.ts +0 -6
  164. package/src/providers/index.d.ts.map +0 -1
  165. package/src/providers/index.js +0 -5
  166. package/src/providers/index.js.map +0 -1
  167. package/src/providers/openai.d.ts +0 -14
  168. package/src/providers/openai.d.ts.map +0 -1
  169. package/src/providers/openai.js +0 -162
  170. package/src/providers/openai.js.map +0 -1
  171. package/src/providers/types.d.ts +0 -36
  172. package/src/providers/types.d.ts.map +0 -1
  173. package/src/providers/types.js +0 -2
  174. package/src/providers/types.js.map +0 -1
  175. package/src/store/composed-prompt-store.d.ts +0 -24
  176. package/src/store/composed-prompt-store.d.ts.map +0 -1
  177. package/src/store/composed-prompt-store.js +0 -75
  178. package/src/store/composed-prompt-store.js.map +0 -1
  179. package/src/store/index.d.ts +0 -5
  180. package/src/store/index.d.ts.map +0 -1
  181. package/src/store/index.js +0 -5
  182. package/src/store/index.js.map +0 -1
  183. package/src/store/session-store.d.ts +0 -45
  184. package/src/store/session-store.d.ts.map +0 -1
  185. package/src/store/session-store.js +0 -197
  186. package/src/store/session-store.js.map +0 -1
  187. package/src/store/task-store.d.ts +0 -55
  188. package/src/store/task-store.d.ts.map +0 -1
  189. package/src/store/task-store.js +0 -186
  190. package/src/store/task-store.js.map +0 -1
  191. package/src/tools/agent-crud.d.ts +0 -15
  192. package/src/tools/agent-crud.d.ts.map +0 -1
  193. package/src/tools/agent-crud.js +0 -32
  194. package/src/tools/agent-crud.js.map +0 -1
  195. package/src/tools/session.d.ts +0 -33
  196. package/src/tools/session.d.ts.map +0 -1
  197. package/src/tools/session.js +0 -73
  198. package/src/tools/session.js.map +0 -1
  199. package/src/tools/task.d.ts +0 -86
  200. package/src/tools/task.d.ts.map +0 -1
  201. package/src/tools/task.js +0 -406
  202. package/src/tools/task.js.map +0 -1
  203. package/src/tools/usage.d.ts +0 -60
  204. package/src/tools/usage.d.ts.map +0 -1
  205. package/src/tools/usage.js +0 -174
  206. package/src/tools/usage.js.map +0 -1
  207. package/src/types/agent.d.ts +0 -2
  208. package/src/types/agent.d.ts.map +0 -1
  209. package/src/types/agent.js +0 -3
  210. package/src/types/agent.js.map +0 -1
  211. package/src/types/execution.d.ts +0 -2
  212. package/src/types/execution.d.ts.map +0 -1
  213. package/src/types/execution.js +0 -3
  214. package/src/types/execution.js.map +0 -1
  215. package/src/types/index.d.ts +0 -2
  216. package/src/types/index.d.ts.map +0 -1
  217. package/src/types/index.js +0 -2
  218. package/src/types/index.js.map +0 -1
  219. package/src/types/mcp.d.ts +0 -2
  220. package/src/types/mcp.d.ts.map +0 -1
  221. package/src/types/mcp.js +0 -3
  222. package/src/types/mcp.js.map +0 -1
  223. package/src/types/message.d.ts +0 -2
  224. package/src/types/message.d.ts.map +0 -1
  225. package/src/types/message.js +0 -3
  226. package/src/types/message.js.map +0 -1
  227. package/src/types/session.d.ts +0 -2
  228. package/src/types/session.d.ts.map +0 -1
  229. package/src/types/session.js +0 -3
  230. package/src/types/session.js.map +0 -1
  231. package/src/types/task.d.ts +0 -2
  232. package/src/types/task.d.ts.map +0 -1
  233. package/src/types/task.js +0 -3
  234. package/src/types/task.js.map +0 -1
  235. package/src/utils/ids.d.ts +0 -2
  236. package/src/utils/ids.d.ts.map +0 -1
  237. package/src/utils/ids.js +0 -5
  238. package/src/utils/ids.js.map +0 -1
  239. package/src/utils/logger.d.ts +0 -2
  240. package/src/utils/logger.d.ts.map +0 -1
  241. package/src/utils/logger.js +0 -5
  242. package/src/utils/logger.js.map +0 -1
  243. package/src/utils/timestamps.d.ts +0 -2
  244. package/src/utils/timestamps.d.ts.map +0 -1
  245. package/src/utils/timestamps.js +0 -4
  246. package/src/utils/timestamps.js.map +0 -1
  247. package/src/validation/agent.d.ts +0 -400
  248. package/src/validation/agent.d.ts.map +0 -1
  249. package/src/validation/agent.js +0 -251
  250. package/src/validation/agent.js.map +0 -1
  251. package/src/validation/agents.d.ts +0 -2
  252. package/src/validation/agents.d.ts.map +0 -1
  253. package/src/validation/agents.js +0 -3
  254. package/src/validation/agents.js.map +0 -1
  255. package/src/validation/errors.d.ts +0 -32
  256. package/src/validation/errors.d.ts.map +0 -1
  257. package/src/validation/errors.js +0 -42
  258. package/src/validation/errors.js.map +0 -1
  259. package/src/validation/execution.d.ts +0 -86
  260. package/src/validation/execution.d.ts.map +0 -1
  261. package/src/validation/execution.js +0 -28
  262. package/src/validation/execution.js.map +0 -1
  263. package/src/validation/index.d.ts +0 -9
  264. package/src/validation/index.d.ts.map +0 -1
  265. package/src/validation/index.js +0 -9
  266. package/src/validation/index.js.map +0 -1
  267. package/src/validation/mcp.d.ts +0 -42
  268. package/src/validation/mcp.d.ts.map +0 -1
  269. package/src/validation/mcp.js +0 -28
  270. package/src/validation/mcp.js.map +0 -1
  271. package/src/validation/message.d.ts +0 -43
  272. package/src/validation/message.d.ts.map +0 -1
  273. package/src/validation/message.js +0 -23
  274. package/src/validation/message.js.map +0 -1
  275. package/src/validation/session.d.ts +0 -49
  276. package/src/validation/session.d.ts.map +0 -1
  277. package/src/validation/session.js +0 -34
  278. package/src/validation/session.js.map +0 -1
  279. package/src/validation/task.d.ts +0 -146
  280. package/src/validation/task.d.ts.map +0 -1
  281. package/src/validation/task.js +0 -95
  282. package/src/validation/task.js.map +0 -1
  283. package/src/validation/tasks.d.ts +0 -2
  284. package/src/validation/tasks.d.ts.map +0 -1
  285. package/src/validation/tasks.js +0 -3
  286. package/src/validation/tasks.js.map +0 -1
  287. package/src/validation/usage.d.ts +0 -89
  288. package/src/validation/usage.d.ts.map +0 -1
  289. package/src/validation/usage.js +0 -98
  290. package/src/validation/usage.js.map +0 -1
@@ -1,164 +0,0 @@
1
- import { logger } from "../logger.js";
2
- import { InProcessMcpClient } from "./in-process.js";
3
- import { HttpMcpClient, SseMcpClient } from "./http-client.js";
4
- import { StdioMcpClient } from "./stdio-client.js";
5
- import { TOOL_NAME_SEPARATOR, normalizeToolName } from "./tool-naming.js";
6
- /**
7
- * McpClientRegistry — per-task lifetime.
8
- *
9
- * Created fresh for each task() call and torn down in the Orchestrator's
10
- * finally block via closeAll(). Never reused across tasks.
11
- *
12
- * Self-referential detection (routes to InProcessMcpClient):
13
- * 1. Key === "agent-mcp" (always applies)
14
- * 2. URL matches selfUrl (only when selfUrl is defined — http/sse transport)
15
- * When TRANSPORT=stdio, selfUrl is undefined and only condition 1 applies.
16
- */
17
- export class McpClientRegistry {
18
- mcpServers;
19
- selfUrl;
20
- inProcessDescriptors;
21
- inProcessHandler;
22
- context;
23
- clients = new Map();
24
- connectPromises = new Map();
25
- // advertised tool name (and its normalized form) → real { server, tool }.
26
- // Populated by listAllTools(); lets resolveToolName() recover the real target
27
- // even when a model rewrites '-' → '_' in the name it calls back with.
28
- toolTargets = new Map();
29
- constructor(mcpServers, selfUrl, inProcessDescriptors, inProcessHandler, context) {
30
- this.mcpServers = mcpServers;
31
- this.selfUrl = selfUrl;
32
- this.inProcessDescriptors = inProcessDescriptors;
33
- this.inProcessHandler = inProcessHandler;
34
- this.context = context;
35
- }
36
- isSelfReferential(name, config) {
37
- if (name === "agent-mcp")
38
- return true;
39
- if (this.selfUrl &&
40
- (config.transport === "http" || config.transport === "sse") &&
41
- config.url === this.selfUrl) {
42
- return true;
43
- }
44
- return false;
45
- }
46
- /**
47
- * Map a (possibly model-normalized) server name back to a configured key.
48
- * OpenAI-compatible/local models rewrite '-' → '_', so a tool call to
49
- * 'agent_mcp__…' must still resolve to the configured 'agent-mcp' server.
50
- */
51
- resolveServerName(name) {
52
- if (this.mcpServers[name])
53
- return name;
54
- const norm = normalizeToolName(name);
55
- return Object.keys(this.mcpServers).find((k) => normalizeToolName(k) === norm) ?? name;
56
- }
57
- async getOrCreateClient(rawName) {
58
- const name = this.resolveServerName(rawName);
59
- const existing = this.clients.get(name);
60
- if (existing)
61
- return existing;
62
- const config = this.mcpServers[name];
63
- if (!config) {
64
- throw new Error(`No MCP server config found for server: '${rawName}'`);
65
- }
66
- if (this.isSelfReferential(name, config)) {
67
- const client = new InProcessMcpClient(this.inProcessDescriptors, this.inProcessHandler, this.context);
68
- this.clients.set(name, client);
69
- return client;
70
- }
71
- // Create and connect the appropriate transport client
72
- let connectPromise = this.connectPromises.get(name);
73
- if (connectPromise) {
74
- await connectPromise;
75
- return this.clients.get(name);
76
- }
77
- let client;
78
- if (config.transport === "stdio") {
79
- client = new StdioMcpClient(name, config);
80
- }
81
- else if (config.transport === "http") {
82
- client = new HttpMcpClient(name, config);
83
- }
84
- else if (config.transport === "sse") {
85
- client = new SseMcpClient(name, config);
86
- }
87
- else {
88
- const exhaustive = config;
89
- throw new Error(`Unknown MCP transport: ${exhaustive.transport}`);
90
- }
91
- connectPromise = client.connect().then(() => {
92
- this.clients.set(name, client);
93
- logger.debug({ server: name }, "MCP client connected");
94
- });
95
- this.connectPromises.set(name, connectPromise);
96
- await connectPromise;
97
- return this.clients.get(name);
98
- }
99
- /** Get a client for a specific server, connecting lazily if needed */
100
- async getClient(name) {
101
- return this.getOrCreateClient(name);
102
- }
103
- /**
104
- * List all tools across all configured servers.
105
- * Prefixes each tool name with "<server>__<tool>" for disambiguation.
106
- */
107
- async listAllTools() {
108
- const allTools = [];
109
- for (const serverName of Object.keys(this.mcpServers)) {
110
- try {
111
- const client = await this.getOrCreateClient(serverName);
112
- const tools = await client.listTools();
113
- for (const tool of tools) {
114
- const advertised = `${serverName}${TOOL_NAME_SEPARATOR}${tool.name}`;
115
- const target = { server: serverName, tool: tool.name };
116
- // Index both the advertised name and its normalized form so a
117
- // model that rewrites '-' → '_' still resolves to the real target.
118
- this.toolTargets.set(advertised, target);
119
- this.toolTargets.set(normalizeToolName(advertised), target);
120
- allTools.push({ ...tool, name: advertised });
121
- }
122
- }
123
- catch (error) {
124
- logger.warn({ server: serverName, error }, "Failed to list tools from MCP server");
125
- }
126
- }
127
- return allTools;
128
- }
129
- /**
130
- * Resolve a tool name AS RETURNED BY A MODEL back to its real { server, tool }.
131
- * Tries the exact advertised name, then the normalized form (handles models
132
- * that rewrite '-' → '_'), then falls back to a literal `__` split for names
133
- * the registry never advertised (preserves prior behavior).
134
- */
135
- resolveToolName(advertised) {
136
- const hit = this.toolTargets.get(advertised) ??
137
- this.toolTargets.get(normalizeToolName(advertised));
138
- if (hit)
139
- return hit;
140
- const i = advertised.indexOf(TOOL_NAME_SEPARATOR);
141
- return i === -1
142
- ? { server: advertised, tool: advertised }
143
- : {
144
- server: advertised.slice(0, i),
145
- tool: advertised.slice(i + TOOL_NAME_SEPARATOR.length),
146
- };
147
- }
148
- /** Tear down all clients — called from Orchestrator's finally block */
149
- async closeAll() {
150
- const closePromises = Array.from(this.clients.entries()).map(async ([name, client]) => {
151
- try {
152
- await client.close();
153
- logger.debug({ server: name }, "MCP client closed");
154
- }
155
- catch (error) {
156
- logger.warn({ server: name, error }, "Error closing MCP client");
157
- }
158
- });
159
- await Promise.allSettled(closePromises);
160
- this.clients.clear();
161
- this.connectPromises.clear();
162
- }
163
- }
164
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/clients/registry.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import type { ToolDefinition } from "../providers/types.js";
2
- import type { McpStdioConfig } from "../validation/index.js";
3
- import type { IMcpClient } from "./types.js";
4
- export declare class StdioMcpClient implements IMcpClient {
5
- private readonly serverName;
6
- private readonly config;
7
- private client;
8
- private transport;
9
- private childProcess;
10
- constructor(serverName: string, config: McpStdioConfig);
11
- connect(): Promise<void>;
12
- listTools(): Promise<ToolDefinition[]>;
13
- callTool(toolName: string, args: unknown, callerSignal?: AbortSignal): Promise<unknown>;
14
- close(): Promise<void>;
15
- }
16
- //# sourceMappingURL=stdio-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stdio-client.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/clients/stdio-client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,qBAAa,cAAe,YAAW,UAAU;IAMzC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAN3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,YAAY,CAA6B;gBAG5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc;IAGrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCxB,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCvF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB/B"}
@@ -1,97 +0,0 @@
1
- import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
- import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
- import { logger } from "../logger.js";
4
- import { config } from "../config.js";
5
- import { ToolError } from "../validation/errors.js";
6
- export class StdioMcpClient {
7
- serverName;
8
- config;
9
- client = null;
10
- transport = null;
11
- childProcess = null;
12
- constructor(serverName, config) {
13
- this.serverName = serverName;
14
- this.config = config;
15
- }
16
- async connect() {
17
- const transport = new StdioClientTransport({
18
- command: this.config.command,
19
- args: this.config.args ?? [],
20
- env: {
21
- ...config.subprocessEnv(),
22
- ...this.config.env,
23
- },
24
- });
25
- this.transport = transport;
26
- // Capture child process reference for lifecycle management.
27
- // The StdioClientTransport exposes it after start().
28
- const client = new Client({ name: "agent-mcp-client", version: "1.0.0" }, { capabilities: {} });
29
- this.client = client;
30
- await client.connect(transport);
31
- // Attach exit handler to the underlying child process.
32
- // StdioClientTransport exposes `process` after connect().
33
- const childProc = transport.process;
34
- if (childProc) {
35
- this.childProcess = childProc;
36
- childProc.on("exit", (code, signal) => {
37
- logger.warn({
38
- server: this.serverName,
39
- exitCode: code,
40
- signal,
41
- }, "MCP child process exited unexpectedly");
42
- });
43
- }
44
- }
45
- async listTools() {
46
- if (!this.client) {
47
- throw new ToolError("MCP_CLIENT_ERROR", `Client '${this.serverName}' not connected`);
48
- }
49
- const response = await this.client.listTools();
50
- return response.tools.map(tool => ({
51
- name: tool.name,
52
- description: tool.description ?? "",
53
- inputSchema: tool.inputSchema ?? {
54
- type: "object",
55
- properties: {},
56
- },
57
- }));
58
- }
59
- async callTool(toolName, args, callerSignal) {
60
- if (!this.client) {
61
- throw new ToolError("MCP_CLIENT_ERROR", `Client '${this.serverName}' not connected`);
62
- }
63
- // Compose the caller's cancellation/timeout signal (DEBT-003 — lets a
64
- // task cancel interrupt this in-flight call) with the client-level
65
- // per-call timeout. Either may fire first.
66
- const timeoutSignal = this.config.timeoutMs
67
- ? AbortSignal.timeout(this.config.timeoutMs)
68
- : undefined;
69
- const signal = callerSignal && timeoutSignal
70
- ? AbortSignal.any([callerSignal, timeoutSignal])
71
- : (callerSignal ?? timeoutSignal);
72
- const result = await this.client.callTool({ name: toolName, arguments: args }, undefined, signal ? { signal } : undefined);
73
- if (result.isError) {
74
- throw new ToolError("MCP_CLIENT_ERROR", `Tool '${toolName}' on server '${this.serverName}' returned an error: ${JSON.stringify(result.content)}`);
75
- }
76
- return result.content;
77
- }
78
- async close() {
79
- try {
80
- await this.client?.close();
81
- }
82
- catch {
83
- // ignore close errors
84
- }
85
- if (this.childProcess && !this.childProcess.killed) {
86
- this.childProcess.kill("SIGTERM");
87
- // Force-kill after 5 seconds if still alive
88
- const killTimer = setTimeout(() => {
89
- if (this.childProcess && !this.childProcess.killed) {
90
- this.childProcess.kill("SIGKILL");
91
- }
92
- }, 5_000);
93
- killTimer.unref();
94
- }
95
- }
96
- }
97
- //# sourceMappingURL=stdio-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stdio-client.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/clients/stdio-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGjF,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,MAAM,OAAO,cAAc;IAMF;IACA;IANb,MAAM,GAAkB,IAAI,CAAC;IAC7B,SAAS,GAAgC,IAAI,CAAC;IAC9C,YAAY,GAAwB,IAAI,CAAC;IAEjD,YACqB,UAAkB,EAClB,MAAsB;QADtB,eAAU,GAAV,UAAU,CAAQ;QAClB,WAAM,GAAN,MAAM,CAAgB;IACxC,CAAC;IAEJ,KAAK,CAAC,OAAO;QACT,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;YACvC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;YAC5B,GAAG,EAAE;gBACD,GAAG,MAAM,CAAC,aAAa,EAAE;gBACzB,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;aACK;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,4DAA4D;QAC5D,qDAAqD;QACrD,MAAM,MAAM,GAAG,IAAI,MAAM,CACrB,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC9C,EAAE,YAAY,EAAE,EAAE,EAAE,CACvB,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,uDAAuD;QACvD,0DAA0D;QAC1D,MAAM,SAAS,GAAI,SAAmD,CAAC,OAAO,CAAC;QAC/E,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBAClC,MAAM,CAAC,IAAI,CACP;oBACI,MAAM,EAAE,IAAI,CAAC,UAAU;oBACvB,QAAQ,EAAE,IAAI;oBACd,MAAM;iBACT,EACD,uCAAuC,CAC1C,CAAC;YACN,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,WAAW,IAAI,CAAC,UAAU,iBAAiB,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/C,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,WAAW,EAAG,IAAI,CAAC,WAAuC,IAAI;gBAC1D,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACjB;SACJ,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,IAAa,EAAE,YAA0B;QACtE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,WAAW,IAAI,CAAC,UAAU,iBAAiB,CAAC,CAAC;QACzF,CAAC;QAED,sEAAsE;QACtE,mEAAmE;QACnE,2CAA2C;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;YACvC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,MAAM,GACR,YAAY,IAAI,aAAa;YACzB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC,YAAY,IAAI,aAAa,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAA+B,EAAE,EAC9D,SAAS,EACT,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAClC,CAAC;QAEF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,SAAS,CACf,kBAAkB,EAClB,SAAS,QAAQ,gBAAgB,IAAI,CAAC,UAAU,wBAAwB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAC3G,CAAC;QACN,CAAC;QAED,OAAO,MAAM,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACL,sBAAsB;QAC1B,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACjD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAElC,4CAA4C;YAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;oBACjD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtC,CAAC;YACL,CAAC,EAAE,KAAK,CAAC,CAAC;YAEV,SAAS,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;IACL,CAAC;CACJ"}
@@ -1,44 +0,0 @@
1
- /**
2
- * Tool-name encoding shared across the registry and the orchestrator.
3
- *
4
- * Tools are advertised to the model as `<server>__<tool>`. Many OpenAI-compatible
5
- * and local models (e.g. LM Studio / qwen) restrict function names to
6
- * `[A-Za-z0-9_]` and silently rewrite other characters — notably `-` → `_` — so
7
- * an advertised `agent-mcp__agent` comes back from the model as
8
- * `agent_mcp__agent`. A literal lookup then fails ("No MCP server config found
9
- * for server: 'agent_mcp'"), which breaks recursion (the `agent-mcp` key) and any
10
- * MCP server whose name contains a hyphen. Anthropic preserves the name, so this
11
- * only bites the OpenAI-compatible providers — but the round-trip must be robust
12
- * for ALL of them.
13
- *
14
- * The fix: index both the advertised name and its normalized form, and normalize
15
- * the model's returned name the same way before resolving.
16
- */
17
- export declare const TOOL_NAME_SEPARATOR = "__";
18
- /** Normalize a tool name to the charset models restrict function names to. */
19
- export declare function normalizeToolName(name: string): string;
20
- export interface ResolvedToolName {
21
- server: string;
22
- tool: string;
23
- }
24
- /**
25
- * Resolve a tool name AS RETURNED BY A MODEL into { server, tool }.
26
- *
27
- * - A qualified `<server>__<tool>` name splits on the separator (prior behavior).
28
- * - A **bare** `<tool>` name (no separator) is resolved against the tool names the
29
- * model was actually advertised: if exactly one advertised tool has that
30
- * tool-part it is used; if several do, an actionable error lists the qualified
31
- * candidates; if none do, it falls back to a literal split so downstream
32
- * "unknown tool / no server config" handling still applies.
33
- *
34
- * Background (BACKLOG DEBT-004): capable models frequently emit the bare tool
35
- * name (`agent` / `task`) instead of the advertised `agent-mcp__agent`, which used
36
- * to hard-fail the whole task with "Invalid tool name (missing server prefix)".
37
- * Since the separator is unambiguous in advertised names, a bare name that maps to
38
- * exactly one advertised tool can be resolved deterministically.
39
- *
40
- * @param rawName the tool name the model returned
41
- * @param advertised the advertised tool names the model was given (`<server>__<tool>`)
42
- */
43
- export declare function resolveToolCallName(rawName: string, advertised?: readonly string[]): ResolvedToolName;
44
- //# sourceMappingURL=tool-naming.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-naming.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/clients/tool-naming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAUD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,SAAS,MAAM,EAAO,GAAG,gBAAgB,CAkBzG"}
@@ -1,65 +0,0 @@
1
- /**
2
- * Tool-name encoding shared across the registry and the orchestrator.
3
- *
4
- * Tools are advertised to the model as `<server>__<tool>`. Many OpenAI-compatible
5
- * and local models (e.g. LM Studio / qwen) restrict function names to
6
- * `[A-Za-z0-9_]` and silently rewrite other characters — notably `-` → `_` — so
7
- * an advertised `agent-mcp__agent` comes back from the model as
8
- * `agent_mcp__agent`. A literal lookup then fails ("No MCP server config found
9
- * for server: 'agent_mcp'"), which breaks recursion (the `agent-mcp` key) and any
10
- * MCP server whose name contains a hyphen. Anthropic preserves the name, so this
11
- * only bites the OpenAI-compatible providers — but the round-trip must be robust
12
- * for ALL of them.
13
- *
14
- * The fix: index both the advertised name and its normalized form, and normalize
15
- * the model's returned name the same way before resolving.
16
- */
17
- export const TOOL_NAME_SEPARATOR = "__";
18
- /** Normalize a tool name to the charset models restrict function names to. */
19
- export function normalizeToolName(name) {
20
- return name.replace(/[^A-Za-z0-9_]/g, "_");
21
- }
22
- /** Split a name on the first separator into { server, tool } (no resolution). */
23
- function splitToolName(name) {
24
- const i = name.indexOf(TOOL_NAME_SEPARATOR);
25
- return i === -1
26
- ? { server: name, tool: name }
27
- : { server: name.slice(0, i), tool: name.slice(i + TOOL_NAME_SEPARATOR.length) };
28
- }
29
- /**
30
- * Resolve a tool name AS RETURNED BY A MODEL into { server, tool }.
31
- *
32
- * - A qualified `<server>__<tool>` name splits on the separator (prior behavior).
33
- * - A **bare** `<tool>` name (no separator) is resolved against the tool names the
34
- * model was actually advertised: if exactly one advertised tool has that
35
- * tool-part it is used; if several do, an actionable error lists the qualified
36
- * candidates; if none do, it falls back to a literal split so downstream
37
- * "unknown tool / no server config" handling still applies.
38
- *
39
- * Background (BACKLOG DEBT-004): capable models frequently emit the bare tool
40
- * name (`agent` / `task`) instead of the advertised `agent-mcp__agent`, which used
41
- * to hard-fail the whole task with "Invalid tool name (missing server prefix)".
42
- * Since the separator is unambiguous in advertised names, a bare name that maps to
43
- * exactly one advertised tool can be resolved deterministically.
44
- *
45
- * @param rawName the tool name the model returned
46
- * @param advertised the advertised tool names the model was given (`<server>__<tool>`)
47
- */
48
- export function resolveToolCallName(rawName, advertised = []) {
49
- if (rawName.includes(TOOL_NAME_SEPARATOR))
50
- return splitToolName(rawName);
51
- const norm = normalizeToolName(rawName);
52
- const candidates = Array.from(new Set(advertised)).filter((a) => {
53
- const { tool } = splitToolName(a);
54
- return tool === rawName || normalizeToolName(tool) === norm;
55
- });
56
- if (candidates.length === 1)
57
- return splitToolName(candidates[0]);
58
- if (candidates.length > 1) {
59
- throw new Error(`Ambiguous tool name '${rawName}': multiple servers expose it — qualify with a server prefix, one of: ${candidates.join(", ")}`);
60
- }
61
- // No advertised match — preserve prior split (server = tool = rawName); the
62
- // registry then surfaces a normal "no server config" / unknown-tool error.
63
- return splitToolName(rawName);
64
- }
65
- //# sourceMappingURL=tool-naming.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-naming.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/clients/tool-naming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAOD,iFAAiF;AACjF,SAAS,aAAa,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5C,OAAO,CAAC,KAAK,CAAC,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QAC9B,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;AACzF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,aAAgC,EAAE;IACnF,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;IAEzE,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,IAAI,KAAK,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACX,wBAAwB,OAAO,yEAAyE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClI,CAAC;IACN,CAAC;IACD,4EAA4E;IAC5E,2EAA2E;IAC3E,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC"}
@@ -1,18 +0,0 @@
1
- import type { ToolDefinition } from "../providers/types.js";
2
- export interface IMcpClient {
3
- /** Returns all tools advertised by this MCP server */
4
- listTools(): Promise<ToolDefinition[]>;
5
- /**
6
- * Call a single tool on this server.
7
- * @param toolName the tool name (without server prefix)
8
- * @param args the arguments to pass
9
- * @param signal optional abort signal — when the task is cancelled (or
10
- * times out) this fires, so an in-flight tool call is
11
- * interrupted instead of running to completion. Composed
12
- * with any client-level timeout.
13
- */
14
- callTool(toolName: string, args: unknown, signal?: AbortSignal): Promise<unknown>;
15
- /** Tear down the client (kill child processes, close connections) */
16
- close(): Promise<void>;
17
- }
18
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/clients/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,UAAU;IACvB,sDAAsD;IACtD,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAEvC;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElF,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/clients/types.ts"],"names":[],"mappings":""}
@@ -1,62 +0,0 @@
1
- import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
2
- import type { TaskStore } from "../store/task-store.js";
3
- import type { BackgroundQueue } from "./queue.js";
4
- /**
5
- * DagEngine manages task dependency resolution.
6
- *
7
- * Two public methods:
8
- * - `validateNoCycle()` — synchronous BFS cycle check; called BEFORE row insert.
9
- * - `dispatchReady()` — post-terminal fan-in dispatch; called in the queue runFn
10
- * `finally` block so it fires on every terminal event (completed/failed/cancelled).
11
- *
12
- * The `dispatchFn` is injected at server startup (built in src/index.ts) to avoid
13
- * circular imports: DagEngine must NOT import from tools/task.ts.
14
- */
15
- export declare class DagEngine {
16
- private readonly db;
17
- private readonly queue;
18
- private readonly taskStore;
19
- /**
20
- * Injected at server startup to avoid circular imports with tools/task.ts.
21
- * Signature: (taskId: string) => Promise<void>
22
- * Built in index.ts by closing over the TaskDeps.
23
- */
24
- private readonly dispatchFn;
25
- constructor(db: BetterSQLite3Database<Record<string, never>>, queue: BackgroundQueue, taskStore: TaskStore,
26
- /**
27
- * Injected at server startup to avoid circular imports with tools/task.ts.
28
- * Signature: (taskId: string) => Promise<void>
29
- * Built in index.ts by closing over the TaskDeps.
30
- */
31
- dispatchFn: (taskId: string) => Promise<void>);
32
- /**
33
- * BFS cycle detection. Call BEFORE inserting the new task row.
34
- *
35
- * Walks the existing dependency graph upward from each member of `dependsOn`.
36
- * If `newTaskId` appears as an ancestor, adding it would create a cycle.
37
- *
38
- * Throws ToolError("VALIDATION_ERROR") if a cycle is detected.
39
- * Does NOT write any rows — purely a read operation.
40
- *
41
- * Invariant: [inv:cycle-check-synchronous]
42
- */
43
- validateNoCycle(newTaskId: string, dependsOn: string[]): void;
44
- /**
45
- * Called after a task reaches a terminal state (completed/failed/cancelled).
46
- *
47
- * Scans all `waiting` tasks for those that include `completedTaskId` in their
48
- * `depends_on`. For each:
49
- * - If all deps are in a terminal state, evaluate `on_upstream_failure`:
50
- * - "fail" (default): mark the downstream as failed immediately.
51
- * - "skip": dispatch anyway; only include completed upstreams in `inputs`.
52
- *
53
- * Uses optimistic locking (`AND status='waiting'` on the UPDATE) to prevent
54
- * double-enqueue when two concurrent terminal events race for the same fan-in
55
- * task.
56
- *
57
- * Invariants: [inv:waiting-no-queue], [inv:dispatch-on-completion],
58
- * [inv:inputs-populated-at-dispatch]
59
- */
60
- dispatchReady(completedTaskId: string): Promise<void>;
61
- }
62
- //# sourceMappingURL=dag-engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dag-engine.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/dag-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAIxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IAEd,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU;gBARV,EAAE,EAAE,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAChD,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,SAAS;IACrC;;;;OAIG;IACc,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;IAGlE;;;;;;;;;;OAUG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAgC7D;;;;;;;;;;;;;;;OAeG;IACG,aAAa,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkG9D"}