@adhd/agent-mcp 2.0.1 → 2.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 (299) 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/docs/architecture-and-security.md +405 -0
  6. package/docs/marketing/.catalog/capabilities.md +143 -0
  7. package/docs/marketing/.catalog/consumer.md +111 -0
  8. package/docs/marketing/.catalog/distribution.md +223 -0
  9. package/docs/marketing/.catalog/doc-conformance.md +237 -0
  10. package/docs/marketing/.catalog/doc-ops.md +98 -0
  11. package/docs/marketing/.catalog/metrics.md +119 -0
  12. package/docs/marketing/.catalog/required-tooling.md +224 -0
  13. package/docs/marketing/.catalog/review.md +164 -0
  14. package/docs/provider-call-audit.md +254 -0
  15. package/llms.txt +133 -0
  16. package/package.json +30 -51
  17. package/src/__tests__/integration/harness.d.ts +871 -39
  18. package/src/__tests__/integration/harness.d.ts.map +1 -1
  19. package/src/__tests__/integration/harness.js +93 -87
  20. package/src/__tests__/integration/harness.js.map +1 -1
  21. package/src/__tests__/integration/scripted-provider.d.ts +1 -2
  22. package/src/__tests__/integration/scripted-provider.d.ts.map +1 -1
  23. package/src/__tests__/integration/scripted-provider.js +1 -3
  24. package/src/__tests__/integration/scripted-provider.js.map +1 -1
  25. package/src/config.d.ts +6 -69
  26. package/src/config.d.ts.map +1 -1
  27. package/src/config.js +1 -50
  28. package/src/config.js.map +1 -1
  29. package/src/db/client.d.ts +1516 -2
  30. package/src/db/client.d.ts.map +1 -1
  31. package/src/db/client.js +4 -2
  32. package/src/db/client.js.map +1 -1
  33. package/src/db/migrate-runner.d.ts +0 -28
  34. package/src/db/migrate-runner.d.ts.map +1 -1
  35. package/src/db/migrate-runner.js +0 -24
  36. package/src/db/migrate-runner.js.map +1 -1
  37. package/src/db/migrate.d.ts +0 -7
  38. package/src/db/migrate.d.ts.map +1 -1
  39. package/src/db/migrate.js +0 -7
  40. package/src/db/migrate.js.map +1 -1
  41. package/src/db/schema.d.ts +0 -1260
  42. package/src/db/schema.d.ts.map +1 -1
  43. package/src/db/schema.js +2 -179
  44. package/src/db/schema.js.map +1 -1
  45. package/src/index.d.ts +3 -42
  46. package/src/index.d.ts.map +1 -1
  47. package/src/index.js +32 -123
  48. package/src/index.js.map +1 -1
  49. package/src/logger.d.ts +0 -8
  50. package/src/logger.d.ts.map +1 -1
  51. package/src/logger.js +1 -12
  52. package/src/logger.js.map +1 -1
  53. package/src/scripts/agent-mcp-tail.d.ts +3 -0
  54. package/src/scripts/agent-mcp-tail.d.ts.map +1 -0
  55. package/src/scripts/agent-mcp-tail.js +227 -0
  56. package/src/scripts/agent-mcp-tail.js.map +1 -0
  57. package/src/server.d.ts +13 -34
  58. package/src/server.d.ts.map +1 -1
  59. package/src/server.js +234 -326
  60. package/src/server.js.map +1 -1
  61. package/src/store/agent-store.d.ts +3 -16
  62. package/src/store/agent-store.d.ts.map +1 -1
  63. package/src/store/agent-store.js +38 -41
  64. package/src/store/agent-store.js.map +1 -1
  65. package/src/streaming/chat-gateway.d.ts +17 -0
  66. package/src/streaming/chat-gateway.d.ts.map +1 -0
  67. package/src/streaming/chat-gateway.js +336 -0
  68. package/src/streaming/chat-gateway.js.map +1 -0
  69. package/src/streaming/event-bus.d.ts +4 -0
  70. package/src/streaming/event-bus.d.ts.map +1 -1
  71. package/src/streaming/event-bus.js +14 -1
  72. package/src/streaming/event-bus.js.map +1 -1
  73. package/src/streaming/sse-server.d.ts +3 -14
  74. package/src/streaming/sse-server.d.ts.map +1 -1
  75. package/src/streaming/sse-server.js +37 -37
  76. package/src/streaming/sse-server.js.map +1 -1
  77. package/src/utils/load-env.d.ts +0 -14
  78. package/src/utils/load-env.d.ts.map +1 -1
  79. package/src/utils/load-env.js +0 -18
  80. package/src/utils/load-env.js.map +1 -1
  81. package/drizzle/0000_nifty_sasquatch.sql +0 -55
  82. package/drizzle/0001_task_usage.sql +0 -16
  83. package/drizzle/0002_lumpy_silver_centurion.sql +0 -2
  84. package/drizzle/0003_nifty_shriek.sql +0 -2
  85. package/drizzle/0004_brief_shocker.sql +0 -4
  86. package/drizzle/0005_clear_lenny_balinger.sql +0 -25
  87. package/drizzle/0006_composed_prompts_cache.sql +0 -24
  88. package/drizzle/meta/0000_snapshot.json +0 -387
  89. package/drizzle/meta/0001_snapshot.json +0 -495
  90. package/drizzle/meta/0002_snapshot.json +0 -509
  91. package/drizzle/meta/0003_snapshot.json +0 -523
  92. package/drizzle/meta/0004_snapshot.json +0 -551
  93. package/drizzle/meta/0005_snapshot.json +0 -545
  94. package/drizzle/meta/0006_snapshot.json +0 -651
  95. package/drizzle/meta/_journal.json +0 -55
  96. package/src/clients/http-client.d.ts +0 -24
  97. package/src/clients/http-client.d.ts.map +0 -1
  98. package/src/clients/http-client.js +0 -98
  99. package/src/clients/http-client.js.map +0 -1
  100. package/src/clients/in-process.d.ts +0 -27
  101. package/src/clients/in-process.d.ts.map +0 -1
  102. package/src/clients/in-process.js +0 -37
  103. package/src/clients/in-process.js.map +0 -1
  104. package/src/clients/index.d.ts +0 -7
  105. package/src/clients/index.d.ts.map +0 -1
  106. package/src/clients/index.js +0 -5
  107. package/src/clients/index.js.map +0 -1
  108. package/src/clients/registry.d.ts +0 -54
  109. package/src/clients/registry.d.ts.map +0 -1
  110. package/src/clients/registry.js +0 -164
  111. package/src/clients/registry.js.map +0 -1
  112. package/src/clients/stdio-client.d.ts +0 -16
  113. package/src/clients/stdio-client.d.ts.map +0 -1
  114. package/src/clients/stdio-client.js +0 -97
  115. package/src/clients/stdio-client.js.map +0 -1
  116. package/src/clients/tool-naming.d.ts +0 -44
  117. package/src/clients/tool-naming.d.ts.map +0 -1
  118. package/src/clients/tool-naming.js +0 -65
  119. package/src/clients/tool-naming.js.map +0 -1
  120. package/src/clients/types.d.ts +0 -18
  121. package/src/clients/types.d.ts.map +0 -1
  122. package/src/clients/types.js +0 -2
  123. package/src/clients/types.js.map +0 -1
  124. package/src/engine/dag-engine.d.ts +0 -62
  125. package/src/engine/dag-engine.d.ts.map +0 -1
  126. package/src/engine/dag-engine.js +0 -158
  127. package/src/engine/dag-engine.js.map +0 -1
  128. package/src/engine/hooks.d.ts +0 -24
  129. package/src/engine/hooks.d.ts.map +0 -1
  130. package/src/engine/hooks.js +0 -50
  131. package/src/engine/hooks.js.map +0 -1
  132. package/src/engine/orchestrator.d.ts +0 -40
  133. package/src/engine/orchestrator.d.ts.map +0 -1
  134. package/src/engine/orchestrator.js +0 -507
  135. package/src/engine/orchestrator.js.map +0 -1
  136. package/src/engine/policy.d.ts +0 -66
  137. package/src/engine/policy.d.ts.map +0 -1
  138. package/src/engine/policy.js +0 -112
  139. package/src/engine/policy.js.map +0 -1
  140. package/src/engine/prompt-resolver.d.ts +0 -89
  141. package/src/engine/prompt-resolver.d.ts.map +0 -1
  142. package/src/engine/prompt-resolver.js +0 -96
  143. package/src/engine/prompt-resolver.js.map +0 -1
  144. package/src/engine/queue.d.ts +0 -29
  145. package/src/engine/queue.d.ts.map +0 -1
  146. package/src/engine/queue.js +0 -56
  147. package/src/engine/queue.js.map +0 -1
  148. package/src/plugins/index.d.ts +0 -2
  149. package/src/plugins/index.d.ts.map +0 -1
  150. package/src/plugins/index.js +0 -2
  151. package/src/plugins/index.js.map +0 -1
  152. package/src/plugins/loader.d.ts +0 -65
  153. package/src/plugins/loader.d.ts.map +0 -1
  154. package/src/plugins/loader.js +0 -222
  155. package/src/plugins/loader.js.map +0 -1
  156. package/src/plugins/usage-plugin.d.ts +0 -27
  157. package/src/plugins/usage-plugin.d.ts.map +0 -1
  158. package/src/plugins/usage-plugin.js +0 -148
  159. package/src/plugins/usage-plugin.js.map +0 -1
  160. package/src/providers/anthropic.d.ts +0 -13
  161. package/src/providers/anthropic.d.ts.map +0 -1
  162. package/src/providers/anthropic.js +0 -260
  163. package/src/providers/anthropic.js.map +0 -1
  164. package/src/providers/claudecli.d.ts +0 -153
  165. package/src/providers/claudecli.d.ts.map +0 -1
  166. package/src/providers/claudecli.js +0 -510
  167. package/src/providers/claudecli.js.map +0 -1
  168. package/src/providers/factory.d.ts +0 -10
  169. package/src/providers/factory.d.ts.map +0 -1
  170. package/src/providers/factory.js +0 -24
  171. package/src/providers/factory.js.map +0 -1
  172. package/src/providers/index.d.ts +0 -6
  173. package/src/providers/index.d.ts.map +0 -1
  174. package/src/providers/index.js +0 -5
  175. package/src/providers/index.js.map +0 -1
  176. package/src/providers/openai.d.ts +0 -14
  177. package/src/providers/openai.d.ts.map +0 -1
  178. package/src/providers/openai.js +0 -162
  179. package/src/providers/openai.js.map +0 -1
  180. package/src/providers/types.d.ts +0 -36
  181. package/src/providers/types.d.ts.map +0 -1
  182. package/src/providers/types.js +0 -2
  183. package/src/providers/types.js.map +0 -1
  184. package/src/store/composed-prompt-store.d.ts +0 -24
  185. package/src/store/composed-prompt-store.d.ts.map +0 -1
  186. package/src/store/composed-prompt-store.js +0 -75
  187. package/src/store/composed-prompt-store.js.map +0 -1
  188. package/src/store/index.d.ts +0 -5
  189. package/src/store/index.d.ts.map +0 -1
  190. package/src/store/index.js +0 -5
  191. package/src/store/index.js.map +0 -1
  192. package/src/store/session-store.d.ts +0 -45
  193. package/src/store/session-store.d.ts.map +0 -1
  194. package/src/store/session-store.js +0 -197
  195. package/src/store/session-store.js.map +0 -1
  196. package/src/store/task-store.d.ts +0 -55
  197. package/src/store/task-store.d.ts.map +0 -1
  198. package/src/store/task-store.js +0 -186
  199. package/src/store/task-store.js.map +0 -1
  200. package/src/tools/agent-crud.d.ts +0 -15
  201. package/src/tools/agent-crud.d.ts.map +0 -1
  202. package/src/tools/agent-crud.js +0 -32
  203. package/src/tools/agent-crud.js.map +0 -1
  204. package/src/tools/session.d.ts +0 -33
  205. package/src/tools/session.d.ts.map +0 -1
  206. package/src/tools/session.js +0 -73
  207. package/src/tools/session.js.map +0 -1
  208. package/src/tools/task.d.ts +0 -86
  209. package/src/tools/task.d.ts.map +0 -1
  210. package/src/tools/task.js +0 -406
  211. package/src/tools/task.js.map +0 -1
  212. package/src/tools/usage.d.ts +0 -60
  213. package/src/tools/usage.d.ts.map +0 -1
  214. package/src/tools/usage.js +0 -174
  215. package/src/tools/usage.js.map +0 -1
  216. package/src/types/agent.d.ts +0 -2
  217. package/src/types/agent.d.ts.map +0 -1
  218. package/src/types/agent.js +0 -3
  219. package/src/types/agent.js.map +0 -1
  220. package/src/types/execution.d.ts +0 -2
  221. package/src/types/execution.d.ts.map +0 -1
  222. package/src/types/execution.js +0 -3
  223. package/src/types/execution.js.map +0 -1
  224. package/src/types/index.d.ts +0 -2
  225. package/src/types/index.d.ts.map +0 -1
  226. package/src/types/index.js +0 -2
  227. package/src/types/index.js.map +0 -1
  228. package/src/types/mcp.d.ts +0 -2
  229. package/src/types/mcp.d.ts.map +0 -1
  230. package/src/types/mcp.js +0 -3
  231. package/src/types/mcp.js.map +0 -1
  232. package/src/types/message.d.ts +0 -2
  233. package/src/types/message.d.ts.map +0 -1
  234. package/src/types/message.js +0 -3
  235. package/src/types/message.js.map +0 -1
  236. package/src/types/session.d.ts +0 -2
  237. package/src/types/session.d.ts.map +0 -1
  238. package/src/types/session.js +0 -3
  239. package/src/types/session.js.map +0 -1
  240. package/src/types/task.d.ts +0 -2
  241. package/src/types/task.d.ts.map +0 -1
  242. package/src/types/task.js +0 -3
  243. package/src/types/task.js.map +0 -1
  244. package/src/utils/ids.d.ts +0 -2
  245. package/src/utils/ids.d.ts.map +0 -1
  246. package/src/utils/ids.js +0 -5
  247. package/src/utils/ids.js.map +0 -1
  248. package/src/utils/logger.d.ts +0 -2
  249. package/src/utils/logger.d.ts.map +0 -1
  250. package/src/utils/logger.js +0 -5
  251. package/src/utils/logger.js.map +0 -1
  252. package/src/utils/timestamps.d.ts +0 -2
  253. package/src/utils/timestamps.d.ts.map +0 -1
  254. package/src/utils/timestamps.js +0 -4
  255. package/src/utils/timestamps.js.map +0 -1
  256. package/src/validation/agent.d.ts +0 -400
  257. package/src/validation/agent.d.ts.map +0 -1
  258. package/src/validation/agent.js +0 -251
  259. package/src/validation/agent.js.map +0 -1
  260. package/src/validation/agents.d.ts +0 -2
  261. package/src/validation/agents.d.ts.map +0 -1
  262. package/src/validation/agents.js +0 -3
  263. package/src/validation/agents.js.map +0 -1
  264. package/src/validation/errors.d.ts +0 -32
  265. package/src/validation/errors.d.ts.map +0 -1
  266. package/src/validation/errors.js +0 -42
  267. package/src/validation/errors.js.map +0 -1
  268. package/src/validation/execution.d.ts +0 -86
  269. package/src/validation/execution.d.ts.map +0 -1
  270. package/src/validation/execution.js +0 -28
  271. package/src/validation/execution.js.map +0 -1
  272. package/src/validation/index.d.ts +0 -9
  273. package/src/validation/index.d.ts.map +0 -1
  274. package/src/validation/index.js +0 -9
  275. package/src/validation/index.js.map +0 -1
  276. package/src/validation/mcp.d.ts +0 -42
  277. package/src/validation/mcp.d.ts.map +0 -1
  278. package/src/validation/mcp.js +0 -28
  279. package/src/validation/mcp.js.map +0 -1
  280. package/src/validation/message.d.ts +0 -43
  281. package/src/validation/message.d.ts.map +0 -1
  282. package/src/validation/message.js +0 -23
  283. package/src/validation/message.js.map +0 -1
  284. package/src/validation/session.d.ts +0 -49
  285. package/src/validation/session.d.ts.map +0 -1
  286. package/src/validation/session.js +0 -34
  287. package/src/validation/session.js.map +0 -1
  288. package/src/validation/task.d.ts +0 -146
  289. package/src/validation/task.d.ts.map +0 -1
  290. package/src/validation/task.js +0 -95
  291. package/src/validation/task.js.map +0 -1
  292. package/src/validation/tasks.d.ts +0 -2
  293. package/src/validation/tasks.d.ts.map +0 -1
  294. package/src/validation/tasks.js +0 -3
  295. package/src/validation/tasks.js.map +0 -1
  296. package/src/validation/usage.d.ts +0 -89
  297. package/src/validation/usage.d.ts.map +0 -1
  298. package/src/validation/usage.js +0 -98
  299. package/src/validation/usage.js.map +0 -1
@@ -1,507 +0,0 @@
1
- import { logger } from "../logger.js";
2
- import { config } from "../config.js";
3
- import { ToolError } from "../validation/errors.js";
4
- import { generateId } from "../utils/ids.js";
5
- import { nowIso } from "../utils/timestamps.js";
6
- import { emitTaskEvent } from "../streaming/event-bus.js";
7
- import { windowMessages } from "../store/session-store.js";
8
- // ── HITL (Human-in-the-Loop) support ─────────────────────────────────────────
9
- /** Built-in tool name intercepted before any MCP client dispatch. */
10
- const HITL_TOOL_NAME = "request_human_input";
11
- /**
12
- * Tool definition advertised to the model when `allowHumanInput === true` on
13
- * the agent and the task is non-ephemeral.
14
- *
15
- * Name encodes as `builtin__request_human_input`:
16
- * - server = "builtin" (both OpenAI and Anthropic split on first "__")
17
- * - tool = "request_human_input" ← matches HITL_TOOL_NAME
18
- *
19
- * The existing Phase-1 intercept (`tc.tool === HITL_TOOL_NAME`) catches it
20
- * before Phase-2 dispatch, so it is never forwarded to any MCP client.
21
- */
22
- const HITL_BUILTIN_TOOL_DEFINITION = {
23
- name: "builtin__request_human_input",
24
- description: "Pause the task to ask the human operator a question. The task suspends " +
25
- "until a human answers via task_resume. Use when you need human confirmation, " +
26
- "a decision, or missing information you cannot obtain yourself.",
27
- inputSchema: {
28
- type: "object",
29
- properties: {
30
- prompt: {
31
- type: "string",
32
- description: "The question to ask the human.",
33
- },
34
- },
35
- required: ["prompt"],
36
- },
37
- };
38
- /**
39
- * Module-scoped resolver map: taskId → resolver function.
40
- * Populated when an orchestrator suspends awaiting human input.
41
- * Entries are cleared when resolved or when the task is cancelled.
42
- */
43
- const hitlResolvers = new Map();
44
- /**
45
- * Resolve a suspended HITL task with the provided user input.
46
- * Returns `true` if the resolver was found and called; `false` if the
47
- * process restarted and the in-memory resolver no longer exists.
48
- */
49
- export function resolveHitl(taskId, userInput) {
50
- const resolve = hitlResolvers.get(taskId);
51
- if (!resolve)
52
- return false;
53
- hitlResolvers.delete(taskId);
54
- resolve(userInput);
55
- return true;
56
- }
57
- /** Duck-type check — avoids importing the budget plugin to identify its errors. */
58
- function isEnforcementError(err) {
59
- return (typeof err === "object" &&
60
- err !== null &&
61
- err.isEnforcementError === true);
62
- }
63
- /** No-op IHookRegistry used as a fallback when none is provided. */
64
- const noopHooks = {
65
- register: () => undefined,
66
- emit: async () => undefined,
67
- registerEnforcement: () => undefined,
68
- enforce: async () => undefined,
69
- };
70
- export class Orchestrator {
71
- async run(input) {
72
- const { executionContext, registry, provider, policy, taskStore, sessionStore, signal, taskId, hooks = noopHooks, isEphemeral = false, } = input;
73
- // Working copy of messages — we append to this as the loop progresses
74
- const currentMessages = [...input.messages];
75
- const contextLimit = config.server.contextLimit;
76
- // BUG-002: track sessions opened by delegation during this task so we can
77
- // close them on failure or cancellation, preventing orphaned active sessions
78
- // that make sub-agents undeletable (AGENT_HAS_ACTIVE_SESSIONS).
79
- // On success we leave them open — the caller has the session IDs and may
80
- // want to continue using them. Only failure/cancel paths close them.
81
- const delegationSessions = new Set();
82
- let taskSucceeded = false;
83
- try {
84
- // Mark task as running
85
- taskStore.updateStatus(taskId, "running");
86
- emitTaskEvent({ type: "status_change", taskId, status: "running" });
87
- await hooks.emit("task:start", { executionContext, messages: currentMessages, rootTaskId: executionContext.rootTaskId });
88
- let finalContent = "";
89
- // Tool-use loop — break on "completed" stop reason, throw on cancellation/policy
90
- let looping = true;
91
- while (looping) {
92
- // Check for cancellation at the top of each iteration
93
- if (signal.aborted) {
94
- throw new ToolError("PROVIDER_ERROR", "Task was cancelled");
95
- }
96
- // Compose per-iteration signal: task cancellation OR provider timeout
97
- const composedSignal = AbortSignal.any([
98
- signal,
99
- AbortSignal.timeout(executionContext.agentDefinition.provider.timeoutMs ?? 60_000),
100
- ]);
101
- // Gather available tools from the registry
102
- const tools = await registry.listAllTools();
103
- // Append the built-in HITL tool when the agent opts in AND the
104
- // task is durable (non-ephemeral has a DB row for the resume token).
105
- if (executionContext.agentDefinition.allowHumanInput === true && !isEphemeral) {
106
- tools.push(HITL_BUILTIN_TOOL_DEFINITION);
107
- }
108
- // Emit MODEL_REQUEST event
109
- taskStore.appendEvent({
110
- taskId,
111
- type: "MODEL_REQUEST",
112
- payload: { messageCount: currentMessages.length, toolCount: tools.length },
113
- });
114
- logger.debug({
115
- taskId,
116
- sessionId: executionContext.sessionId,
117
- agentName: executionContext.agentName,
118
- messageCount: currentMessages.length,
119
- }, "MODEL_REQUEST");
120
- // Emit pre:model_request hook (observational — errors swallowed)
121
- await hooks.emit("pre:model_request", { executionContext, messages: currentMessages, tools });
122
- // Enforcement hooks — throws propagate; budget violations surface as BUDGET_EXCEEDED
123
- try {
124
- await hooks.enforce("pre:model_request", { executionContext, messages: currentMessages, tools });
125
- }
126
- catch (err) {
127
- if (isEnforcementError(err)) {
128
- throw new ToolError("BUDGET_EXCEEDED", err.message);
129
- }
130
- throw err;
131
- }
132
- // Call the LLM provider
133
- let providerResponse;
134
- try {
135
- const messagesToSend = contextLimit > 0
136
- ? windowMessages(currentMessages, contextLimit)
137
- : currentMessages;
138
- providerResponse = await provider.chat({
139
- messages: messagesToSend,
140
- tools: tools.length > 0 ? tools : undefined,
141
- signal: composedSignal,
142
- // executeTool is used by providers (e.g. claudecli) that manage
143
- // their own internal tool loop. Standard providers (anthropic,
144
- // openai) return stopReason "tool_calls" and ignore this.
145
- executeTool: async (server, tool, args) => {
146
- const client = await registry.getClient(server);
147
- try {
148
- const result = await client.callTool(tool, args, composedSignal);
149
- return { result, isError: false };
150
- }
151
- catch (error) {
152
- return {
153
- result: error instanceof Error ? error.message : String(error),
154
- isError: true,
155
- };
156
- }
157
- },
158
- });
159
- }
160
- catch (error) {
161
- // Order matters — see [inv:provider-error-dispatch]:
162
- // cancellation first, then timeout, then auth, then rate-limit, then generic.
163
- // signal.aborted = user-initiated task cancel; composedSignal.aborted-only = timeout.
164
- if (signal.aborted) {
165
- throw new ToolError("PROVIDER_ERROR", "Task was cancelled");
166
- }
167
- if (composedSignal.aborted ||
168
- (error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError"))) {
169
- const ms = executionContext.agentDefinition.provider.timeoutMs ?? 60_000;
170
- throw new ToolError("PROVIDER_TIMEOUT", `Provider call timed out after ${ms}ms. Increase timeoutMs on the agent's provider config.`);
171
- }
172
- if (error instanceof Error && (error.constructor.name === "AuthenticationError" ||
173
- ("status" in error && error.status === 401))) {
174
- throw new ToolError("PROVIDER_AUTH_ERROR", `Provider authentication failed: ${error.message}. ` +
175
- `Set ANTHROPIC_AUTH_TOKEN (run \`claude setup-token\` to obtain an OAuth access token) or use authTokenEnv in the provider config`);
176
- }
177
- if (error instanceof Error && (("status" in error && error.status === 429) ||
178
- error.message?.includes("rate limit") ||
179
- error.message?.includes("429"))) {
180
- throw new ToolError("PROVIDER_RATE_LIMITED", `Provider rate limit exceeded: ${error.message}`);
181
- }
182
- if (error instanceof Error && (("code" in error && error.code === "context_length_exceeded") ||
183
- error.message?.includes("context_length_exceeded") ||
184
- error.message?.includes("prompt is too long"))) {
185
- throw new ToolError("CONTEXT_WINDOW_EXCEEDED", `Context window exceeded. Set AGENT_MCP_CONTEXT_LIMIT to enable automatic truncation.`);
186
- }
187
- throw new ToolError("PROVIDER_ERROR", `Provider call failed: ${error instanceof Error ? error.message : String(error)}`);
188
- }
189
- const assistantMessage = {
190
- ...providerResponse.message,
191
- sessionId: executionContext.sessionId,
192
- };
193
- // Persist and append the assistant message
194
- await sessionStore.appendMessage(executionContext.sessionId, assistantMessage);
195
- currentMessages.push(assistantMessage);
196
- await hooks.emit("post:model_response", {
197
- executionContext,
198
- stopReason: providerResponse.stopReason,
199
- toolCallCount: assistantMessage.toolCalls?.length ?? 0,
200
- tokenUsage: providerResponse.usage,
201
- });
202
- await hooks.emit("message:appended", { executionContext, message: assistantMessage });
203
- // Emit MODEL_RESPONSE event
204
- taskStore.appendEvent({
205
- taskId,
206
- type: "MODEL_RESPONSE",
207
- payload: {
208
- stopReason: providerResponse.stopReason,
209
- hasContent: !!assistantMessage.content,
210
- toolCallCount: assistantMessage.toolCalls?.length ?? 0,
211
- },
212
- });
213
- logger.debug({
214
- taskId,
215
- agentName: executionContext.agentName,
216
- stopReason: providerResponse.stopReason,
217
- }, "MODEL_RESPONSE");
218
- if (providerResponse.stopReason === "completed") {
219
- finalContent = assistantMessage.content ?? "";
220
- looping = false;
221
- continue;
222
- }
223
- // Process tool calls
224
- const toolCalls = assistantMessage.toolCalls ?? [];
225
- // Phase 1 — serial pre-dispatch loop (policy + count).
226
- // Uses variable name `tc` to distinguish from the old sequential per-tool dispatch
227
- // that has been replaced by Phase 2 (Promise.all concurrent execution below).
228
- //
229
- // HITL intercept: `request_human_input` is intercepted here (before Phase 2)
230
- // and never reaches the MCP client. [inv:request-human-input-intercept]
231
- const hitlResults = new Map(); // toolCall.id → userInput
232
- for (const tc of toolCalls) {
233
- if (signal.aborted) {
234
- throw new ToolError("PROVIDER_ERROR", "Task was cancelled before tool call");
235
- }
236
- // ── HITL intercept ──────────────────────────────────────
237
- if (tc.tool === HITL_TOOL_NAME) {
238
- // Ephemeral tasks have no session row — cannot persist resume_token
239
- // (no DB row means task_resume cannot validate it and HITL cannot
240
- // be resumed after a process restart). Reject via isEphemeral flag.
241
- if (isEphemeral) {
242
- throw new ToolError("VALIDATION_ERROR", "request_human_input is not supported for ephemeral tasks");
243
- }
244
- // 1. Generate a resumeToken
245
- const resumeToken = crypto.randomUUID();
246
- // 2. Persist suspension to DB BEFORE awaiting [inv:resume-token-db-persisted]
247
- // This ordering ensures the token survives a process restart.
248
- await taskStore.updateStatus(taskId, "awaiting_input", { resumeToken });
249
- emitTaskEvent({ type: "status_change", taskId, status: "awaiting_input" });
250
- // 3. Register resolver and await userInput.
251
- // Wire into the AbortSignal so task_cancel unblocks this promise —
252
- // without this, cancelling an awaiting_input task leaves the promise
253
- // pending forever and the orchestrator's async context leaks.
254
- let abortHandler;
255
- const userInput = await new Promise((resolve, reject) => {
256
- hitlResolvers.set(taskId, resolve);
257
- abortHandler = () => {
258
- hitlResolvers.delete(taskId);
259
- reject(new ToolError("PROVIDER_ERROR", "Task cancelled while awaiting human input"));
260
- };
261
- signal.addEventListener("abort", abortHandler, { once: true });
262
- }).finally(() => {
263
- // Remove the abort listener once the promise settles so a
264
- // later cancellation of this (now-resumed) task does not fire
265
- // a stale handler / leak a listener on the long-lived signal.
266
- if (abortHandler)
267
- signal.removeEventListener("abort", abortHandler);
268
- });
269
- // 4. Mark running again
270
- await taskStore.updateStatus(taskId, "running");
271
- emitTaskEvent({ type: "status_change", taskId, status: "running" });
272
- // 5. Store userInput to inject as tool result in Phase 3
273
- hitlResults.set(tc.id, userInput);
274
- // Return resume token to the caller via event log; continue to next tc
275
- taskStore.appendEvent({
276
- taskId,
277
- type: "TOOL_CALL",
278
- payload: { tool: HITL_TOOL_NAME, callId: tc.id, resumeToken },
279
- });
280
- continue;
281
- }
282
- // ── end HITL intercept ──────────────────────────────────
283
- // Resolve the REAL {server,tool}: OpenAI-compatible/local models
284
- // rewrite '-' → '_' in tool names, so the returned name may not
285
- // match what we advertised. Resolving here keeps the qualified
286
- // name correct for the policy delegation check (otherwise a
287
- // mangled name would bypass the allowedAgents gate) and dispatch.
288
- const resolved = registry.resolveToolName?.(`${tc.server}__${tc.tool}`) ??
289
- { server: tc.server, tool: tc.tool };
290
- const qualifiedToolName = `${resolved.server}__${resolved.tool}`;
291
- await hooks.emit("pre:tool_call", {
292
- executionContext,
293
- toolName: qualifiedToolName,
294
- callId: tc.id,
295
- toolInput: tc.arguments,
296
- });
297
- policy.check({
298
- executionContext,
299
- targetTool: qualifiedToolName,
300
- targetAgentName: qualifiedToolName === "agent-mcp__agent"
301
- ? tc.arguments?.name
302
- : undefined,
303
- });
304
- // Increment AFTER policy.check — see [inv:toolCallCount-increment-after-check].
305
- // policy.check enforces "allow while toolCallCount < max" (it expects the
306
- // count of calls already accounted for), so incrementing BEFORE the check
307
- // fired the cap one call early (effective max-1). Counting per tool here —
308
- // still inside the serial pre-dispatch loop, not Phase 3 — keeps the limit
309
- // enforced WITHIN a single concurrent batch: each tool's check sees the
310
- // running count from prior tools in this same loop.
311
- executionContext.toolCallCount++;
312
- }
313
- // Phase 2 — Promise.all concurrent execution.
314
- // HITL calls are excluded (already handled in Phase 1 — their results
315
- // are in hitlResults and will be injected in Phase 3).
316
- const nonHitlToolCalls = toolCalls.filter(tc => tc.tool !== HITL_TOOL_NAME);
317
- const toolResults = await Promise.all(nonHitlToolCalls.map(async (toolCall) => {
318
- const resolved = registry.resolveToolName?.(`${toolCall.server}__${toolCall.tool}`) ??
319
- { server: toolCall.server, tool: toolCall.tool };
320
- const qualifiedToolName = `${resolved.server}__${resolved.tool}`;
321
- // Emit tool_call SSE event before dispatch
322
- emitTaskEvent({
323
- type: "tool_call",
324
- taskId,
325
- toolName: qualifiedToolName,
326
- toolCallId: toolCall.id,
327
- input: toolCall.arguments,
328
- });
329
- taskStore.appendEvent({
330
- taskId,
331
- type: "TOOL_CALL",
332
- payload: { tool: qualifiedToolName, callId: toolCall.id },
333
- });
334
- logger.info({ taskId, agentName: executionContext.agentName, tool: qualifiedToolName, callId: toolCall.id }, "TOOL_CALL");
335
- let toolResult;
336
- let isError = false;
337
- try {
338
- const client = await registry.getClient(resolved.server);
339
- // Thread the composed task-cancel/timeout signal so a
340
- // cancel mid-batch interrupts this in-flight call
341
- // instead of waiting for the whole batch (DEBT-003).
342
- toolResult = await client.callTool(resolved.tool, toolCall.arguments, composedSignal);
343
- // BUG-002: capture session IDs opened by delegation so we
344
- // can close them on failure, preventing undeletable sub-agents.
345
- if (qualifiedToolName === "agent-mcp__agent" && toolResult != null) {
346
- const maybeId = toolResult["session_id"];
347
- if (typeof maybeId === "string") {
348
- delegationSessions.add(maybeId);
349
- }
350
- }
351
- }
352
- catch (error) {
353
- // Re-throw fatal ToolError codes — these abort the entire task, not just this call.
354
- // See [inv:fatal-policy-codes] in _shared.md.
355
- const FATAL_CODES = ["MAX_DEPTH_EXCEEDED", "MAX_TOOL_LOOPS_EXCEEDED", "DELEGATION_NOT_ALLOWED"];
356
- if (error instanceof ToolError && FATAL_CODES.includes(error.code)) {
357
- throw error;
358
- }
359
- isError = true;
360
- toolResult = error instanceof Error ? error.message : String(error);
361
- logger.warn({ taskId, tool: qualifiedToolName, error: toolResult }, "TOOL_RESULT error");
362
- }
363
- taskStore.appendEvent({
364
- taskId,
365
- type: "TOOL_RESULT",
366
- payload: { callId: toolCall.id, tool: qualifiedToolName, isError },
367
- });
368
- // Emit tool_result SSE event after result received
369
- emitTaskEvent({
370
- type: "tool_result",
371
- taskId,
372
- toolCallId: toolCall.id,
373
- content: toolResult,
374
- });
375
- logger.debug({ taskId, tool: qualifiedToolName, isError }, "TOOL_RESULT");
376
- await hooks.emit("post:tool_call", {
377
- executionContext,
378
- toolName: qualifiedToolName,
379
- callId: toolCall.id,
380
- toolInput: toolCall.arguments,
381
- result: toolResult,
382
- isError,
383
- });
384
- return { toolCall, toolResult, isError };
385
- }));
386
- // Phase 3 — serial result append (preserves order per [inv:message-order]).
387
- // Build a lookup for non-HITL results; then iterate original toolCalls
388
- // order so HITL and non-HITL results are interleaved correctly.
389
- const toolResultByCallId = new Map(toolResults.map(r => [r.toolCall.id, r]));
390
- for (const tc of toolCalls) {
391
- let toolResult;
392
- let isError = false;
393
- if (hitlResults.has(tc.id)) {
394
- // HITL tool: inject userInput as the result
395
- toolResult = hitlResults.get(tc.id);
396
- }
397
- else {
398
- const r = toolResultByCallId.get(tc.id);
399
- if (!r)
400
- continue; // should not happen
401
- toolResult = r.toolResult;
402
- isError = r.isError;
403
- }
404
- const toolResultMessage = {
405
- id: generateId(),
406
- sessionId: executionContext.sessionId,
407
- role: "tool",
408
- toolResults: [{
409
- toolCallId: tc.id, // [inv:call-id-keying]
410
- result: toolResult,
411
- isError,
412
- }],
413
- createdAt: nowIso(),
414
- };
415
- await sessionStore.appendMessage(executionContext.sessionId, toolResultMessage);
416
- currentMessages.push(toolResultMessage);
417
- await hooks.emit("message:appended", { executionContext, message: toolResultMessage });
418
- }
419
- // Guard: provider signalled tool_calls but sent no tool call blocks —
420
- // prevents infinite spin on a malformed response.
421
- if (providerResponse.stopReason === "tool_calls" &&
422
- (assistantMessage.toolCalls ?? []).length === 0) {
423
- finalContent = assistantMessage.content ?? "";
424
- looping = false;
425
- }
426
- }
427
- // Task completed successfully
428
- taskStore.updateStatus(taskId, "completed", {
429
- result: finalContent,
430
- completedAt: nowIso(),
431
- });
432
- emitTaskEvent({ type: "status_change", taskId, status: "completed" });
433
- taskStore.appendEvent({
434
- taskId,
435
- type: "TASK_COMPLETED",
436
- payload: { result: finalContent },
437
- });
438
- logger.info({ taskId, agentName: executionContext.agentName }, "TASK_COMPLETED");
439
- await hooks.emit("task:completed", { executionContext, result: finalContent });
440
- // Emit done on the successful completion path
441
- emitTaskEvent({ type: "done", taskId, result: finalContent, error: null });
442
- taskSucceeded = true;
443
- return { result: finalContent };
444
- }
445
- catch (error) {
446
- // Determine if this is a cancellation or a real failure
447
- const isCancelled = signal.aborted;
448
- if (isCancelled) {
449
- // Status update handled by TaskStore.cancel() in most cases;
450
- // update here only if not already cancelled
451
- try {
452
- taskStore.updateStatus(taskId, "cancelled", {
453
- cancelledAt: nowIso(),
454
- // Persist the reason so a later SSE terminal-on-connect read
455
- // surfaces it instead of error:null (matches the live-bus done).
456
- error: "Task was cancelled",
457
- });
458
- }
459
- catch {
460
- // already cancelled — ignore
461
- }
462
- emitTaskEvent({ type: "status_change", taskId, status: "cancelled" });
463
- taskStore.appendEvent({ taskId, type: "TASK_CANCELLED" });
464
- await hooks.emit("task:cancelled", { executionContext });
465
- // Emit done on the cancellation path — SSE clients must not hang
466
- emitTaskEvent({ type: "done", taskId, result: null, error: "Task was cancelled" });
467
- }
468
- else {
469
- const errorMessage = error instanceof Error ? error.message : String(error);
470
- taskStore.updateStatus(taskId, "failed", {
471
- error: errorMessage,
472
- });
473
- emitTaskEvent({ type: "status_change", taskId, status: "failed" });
474
- taskStore.appendEvent({
475
- taskId,
476
- type: "TASK_FAILED",
477
- payload: { error: errorMessage },
478
- });
479
- logger.error({ taskId, agentName: executionContext.agentName, error }, "TASK_FAILED");
480
- await hooks.emit("task:failed", { executionContext, error: errorMessage });
481
- // Emit done on the failure path
482
- emitTaskEvent({ type: "done", taskId, result: null, error: errorMessage });
483
- }
484
- throw error;
485
- }
486
- finally {
487
- // BUG-002: close delegation-scoped sessions on failure/cancellation so
488
- // sub-agents don't become undeletable (AGENT_HAS_ACTIVE_SESSIONS guard).
489
- // On success the caller keeps the session IDs; on failure/cancel they're
490
- // orphaned and must be reaped here.
491
- if (!taskSucceeded) {
492
- for (const sessionId of delegationSessions) {
493
- try {
494
- sessionStore.close(sessionId);
495
- }
496
- catch {
497
- // Already closed or not found — ignore
498
- }
499
- }
500
- }
501
- // Per-task registry teardown — always runs
502
- await registry.closeAll();
503
- taskStore.unregisterCancellation(taskId);
504
- }
505
- }
506
- }
507
- //# sourceMappingURL=orchestrator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -1,66 +0,0 @@
1
- import type { ExecutionContext } from "../validation/index.js";
2
- /** Minimal PolicyTemplate shape consumed from @adhd/agent-policy. */
3
- export interface AgentPolicyTemplateRule {
4
- /** Policy type slug — "rate" | "permission" (others are ignored here). */
5
- type: string;
6
- /** Structured rule parameters deserialized from the JSON column. */
7
- rules: Record<string, unknown>;
8
- }
9
- export interface PolicyConfig {
10
- /** Absolute maximum recursion depth. Agent definitions cannot exceed this. */
11
- serverMaxDepth: number;
12
- /** Absolute maximum tool call loops per task. Agent definitions cannot exceed this. */
13
- serverMaxToolLoops: number;
14
- /**
15
- * Server-level allowed agents allowlist.
16
- * - undefined → unrestricted (any agent may be called)
17
- * - string[] → only agents in this list may be called
18
- * Per-agent allowedAgents takes full precedence over this when defined.
19
- */
20
- serverAllowedAgents?: string[];
21
- /**
22
- * Agent-policy template rules resolved for the current agent.
23
- *
24
- * When present, PolicyEngine reads rate/permission limits from these
25
- * templates and falls back to the serverMax* defaults only when no
26
- * matching template rule supplies the limit. Consuming the @adhd/agent-policy
27
- * template SHAPE here keeps policy semantics in one place.
28
- *
29
- * Pass the output of `AgentPolicyStore.resolveForAgent(agentSlug)` merged
30
- * with `PolicyTemplateStore.read(policySlug)` to supply template rules.
31
- */
32
- policyTemplateRules?: AgentPolicyTemplateRule[];
33
- }
34
- export interface PolicyCheckInput {
35
- executionContext: ExecutionContext;
36
- /**
37
- * The fully-qualified tool name being invoked: "<server>__<tool>".
38
- * The allowedAgents check only applies when this is "agent-mcp__agent".
39
- */
40
- targetTool: string;
41
- /**
42
- * When targetTool === "agent-mcp__agent", the name of the target agent.
43
- * Used for the allowedAgents check (#3).
44
- */
45
- targetAgentName?: string;
46
- }
47
- /**
48
- * PolicyEngine enforces the three SPEC §9 safety invariants:
49
- *
50
- * 1. Recursion depth limit
51
- * 2. Tool call loop limit
52
- * 3. AllowedAgents list (per-agent override takes full precedence over server default)
53
- *
54
- * Limits are resolved in priority order:
55
- * 1. Per-agent agentDefinition fields (highest — always wins)
56
- * 2. @adhd/agent-policy template rules (when policyTemplateRules is supplied)
57
- * 3. PolicyConfig server defaults (hardcoded fallback)
58
- *
59
- * Throws ToolError on any violation. Does not mutate state.
60
- */
61
- export declare class PolicyEngine {
62
- private readonly config;
63
- constructor(config: PolicyConfig);
64
- check(input: PolicyCheckInput): void;
65
- }
66
- //# sourceMappingURL=policy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAqB/D,qEAAqE;AACrE,MAAM,WAAW,uBAAuB;IACpC,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IACzB,8EAA8E;IAC9E,cAAc,EAAE,MAAM,CAAC;IACvB,uFAAuF;IACvF,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC7B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAyCD;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAEjD,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;CA2EvC"}