@adhd/agent-mcp 2.0.0 → 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 +31 -50
  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 +4 -27
  46. package/src/index.d.ts.map +1 -1
  47. package/src/index.js +43 -114
  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,260 +0,0 @@
1
- import Anthropic from "@anthropic-ai/sdk";
2
- import pRetry from "p-retry";
3
- import { generateId } from "../utils/ids.js";
4
- import { nowIso } from "../utils/timestamps.js";
5
- import { resolveToolCallName } from "../clients/tool-naming.js";
6
- import { ToolError } from "../validation/errors.js";
7
- import { logger } from "../logger.js";
8
- import { config } from "../config.js";
9
- // ─── Model max-output token table ────────────────────────────────────────────
10
- // Maps model-name prefix → documented max output tokens (standard sync API,
11
- // no beta headers). Checked longest-prefix-first so "claude-opus-4-5" (64k)
12
- // wins over "claude-opus-4" (128k). Source: docs.anthropic.com/models/overview.
13
- // config.server.defaultMaxTokens is used as the fallback for unknown / future models.
14
- const MODEL_MAX_TOKENS = [
15
- // Claude 5 (GA 2026-06)
16
- ["claude-fable-5", 128_000],
17
- ["claude-mythos-5", 128_000],
18
- // Claude 4 — Opus (8/7/6 = 128k; 5 = 64k; 1/0 = 32k)
19
- ["claude-opus-4-8", 128_000],
20
- ["claude-opus-4-7", 128_000],
21
- ["claude-opus-4-6", 128_000],
22
- ["claude-opus-4-5", 64_000],
23
- ["claude-opus-4-1", 32_000],
24
- ["claude-opus-4-0", 32_000],
25
- ["claude-opus-4", 128_000], // catch future claude-opus-4-N ≥ 4-6 tier
26
- // Claude 4 — Sonnet (all known variants: 64k)
27
- ["claude-sonnet-4", 64_000],
28
- // Claude 4 — Haiku (all known variants: 64k)
29
- ["claude-haiku-4", 64_000],
30
- // Claude 3.5 family
31
- ["claude-3-5-sonnet", 8_192],
32
- ["claude-3-5-haiku", 8_192],
33
- // Claude 3 family
34
- ["claude-3-opus", 4_096],
35
- ["claude-3-sonnet", 4_096],
36
- ["claude-3-haiku", 4_096],
37
- ];
38
- function defaultMaxTokens(model) {
39
- for (const [prefix, maxTokens] of MODEL_MAX_TOKENS) {
40
- if (model.startsWith(prefix))
41
- return maxTokens;
42
- }
43
- // Unknown / future model — fall back to the global default
44
- return config.server.defaultMaxTokens;
45
- }
46
- function buildAnthropicClient(secret, timeoutMs) {
47
- if (secret.startsWith("sk-ant-api")) {
48
- return {
49
- client: new Anthropic({ apiKey: secret, timeout: timeoutMs }),
50
- useOauthIdentity: false,
51
- };
52
- }
53
- // OAuth / subscription token — requires the oauth-2025-04-20 beta header and
54
- // the Claude Code identity block in the system prompt (see below).
55
- const isOauth = secret.startsWith("sk-ant-oat");
56
- return {
57
- client: new Anthropic({
58
- authToken: secret,
59
- timeout: timeoutMs,
60
- ...(isOauth ? { defaultHeaders: { "anthropic-beta": "oauth-2025-04-20" } } : {}),
61
- }),
62
- useOauthIdentity: isOauth,
63
- };
64
- }
65
- function toAnthropicTools(tools) {
66
- if (!tools)
67
- return undefined;
68
- return tools.map(tool => ({
69
- name: tool.name,
70
- description: tool.description || "",
71
- input_schema: (tool.inputSchema || {
72
- type: "object",
73
- properties: {},
74
- }),
75
- }));
76
- }
77
- function toAnthropicMessages(messages) {
78
- // Filter out system messages — they're passed separately in the `system` field
79
- const nonSystem = messages.filter(m => m.role !== "system");
80
- return nonSystem.map((message) => {
81
- if (message.role === "tool") {
82
- const toolResult = message.toolResults?.[0];
83
- if (!toolResult) {
84
- throw new Error("Tool message missing tool result");
85
- }
86
- return {
87
- role: "user",
88
- content: [
89
- {
90
- type: "tool_result",
91
- tool_use_id: toolResult.toolCallId,
92
- content: JSON.stringify(toolResult.result),
93
- is_error: toolResult.isError,
94
- },
95
- ],
96
- };
97
- }
98
- if (message.role === "assistant" && message.toolCalls?.length) {
99
- const contentBlocks = [];
100
- if (message.content) {
101
- contentBlocks.push({ type: "text", text: message.content });
102
- }
103
- for (const tc of message.toolCalls) {
104
- contentBlocks.push({
105
- type: "tool_use",
106
- id: tc.id,
107
- name: tc.tool,
108
- input: tc.arguments,
109
- });
110
- }
111
- return { role: "assistant", content: contentBlocks };
112
- }
113
- if (message.role === "assistant") {
114
- return { role: "assistant", content: message.content || "" };
115
- }
116
- if (message.role === "user") {
117
- return { role: "user", content: message.content || "" };
118
- }
119
- // Should never reach here after filtering system messages
120
- throw new Error(`Unsupported message role for Anthropic: ${message.role}`);
121
- });
122
- }
123
- // Subscription OAuth tokens (sk-ant-oat…) only work against the Messages API when
124
- // BOTH of these hold (verified by direct-API bisect — see chat()):
125
- // 1. the request carries the `anthropic-beta: oauth-2025-04-20` header, and
126
- // 2. THIS identity is sent as the first `system` block in ARRAY form — not
127
- // concatenated with the agent's system prompt into a single string.
128
- // Bisect: identity-only string → 200; identity+prompt joined into one string → 429;
129
- // [identity block, prompt block] array → 200. Either omission yields a *misleading*
130
- // `429 rate_limit_error` (no rate-limit headers), which is why OAuth was silently
131
- // broken for any agent that had its own system prompt. Plain API keys need neither.
132
- const CLAUDE_CODE_IDENTITY = "You are Claude Code, Anthropic's official CLI for Claude.";
133
- export class AnthropicProvider {
134
- client;
135
- providerConfig;
136
- /** True when the resolved secret is a sk-ant-oat… OAuth token. */
137
- useOauthIdentity;
138
- constructor(providerConfig) {
139
- this.providerConfig = providerConfig;
140
- // Resolve the single unified secret via config (§3 / §3c)
141
- const resolved = config.getProviderConfig({
142
- provider: "anthropic",
143
- secret: providerConfig.env?.secret,
144
- model: providerConfig.env?.model,
145
- inlineModel: providerConfig.model,
146
- });
147
- if (!resolved.secret) {
148
- // No secret found and we're not a localhost server (anthropic has no localhost exemption)
149
- throw new ToolError("PROVIDER_AUTH_ERROR", `Anthropic requires a credential. ` +
150
- `Set ADHD_AGENT_ANTHROPIC_SECRET in your ~/.adhd/.env ` +
151
- `(run \`claude setup-token\` to obtain an OAuth access token, ` +
152
- `or use your console.anthropic.com API key).`);
153
- }
154
- const { client, useOauthIdentity } = buildAnthropicClient(resolved.secret, providerConfig.timeoutMs);
155
- this.client = client;
156
- this.useOauthIdentity = useOauthIdentity;
157
- }
158
- async chat(request) {
159
- const retryConfig = this.providerConfig.retryConfig;
160
- const systemMessages = request.messages.filter(m => m.role === "system");
161
- const systemPrompt = systemMessages.map(m => m.content || "").join("\n") || undefined;
162
- const run = async () => {
163
- // sk-ant-oat OAuth tokens require the Claude Code identity as a DISTINCT
164
- // first system block (array form) — NOT concatenated into one string.
165
- // Anthropic's OAuth gate rejects a single system string that isn't exactly
166
- // the identity with a misleading 429 rate_limit_error, so any agent that
167
- // has its own system prompt fails unless the identity is its own block.
168
- // (Proven by bisect: array form → 200; identity+prompt joined string → 429.)
169
- // API-key mode keeps the plain string.
170
- const effectiveSystem = this.useOauthIdentity
171
- ? [
172
- { type: "text", text: CLAUDE_CODE_IDENTITY },
173
- ...(systemPrompt
174
- ? [{ type: "text", text: systemPrompt }]
175
- : []),
176
- ]
177
- : systemPrompt;
178
- const effectiveModel = this.providerConfig.model ?? "";
179
- if (!effectiveModel) {
180
- logger.warn("AnthropicProvider: no model configured; API will likely reject");
181
- }
182
- // Use streaming to avoid the SDK's synchronous "Streaming is required
183
- // for operations that may take longer than 10 minutes" throw that fires
184
- // when max_tokens is large (e.g. 64k on haiku-4-5) with messages.create().
185
- const stream = this.client.messages.stream({
186
- model: effectiveModel,
187
- system: effectiveSystem,
188
- temperature: this.providerConfig.temperature,
189
- max_tokens: this.providerConfig.maxTokens ?? defaultMaxTokens(effectiveModel),
190
- messages: toAnthropicMessages(request.messages),
191
- tools: toAnthropicTools(request.tools),
192
- }, { signal: request.signal });
193
- const response = await stream.finalMessage();
194
- const toolCalls = [];
195
- const contentParts = [];
196
- for (const block of response.content) {
197
- if (block.type === "text") {
198
- contentParts.push(block.text);
199
- }
200
- if (block.type === "tool_use") {
201
- // Resolve qualified or bare tool names against the advertised set
202
- // (a bare `agent` → `agent-mcp__agent` when unambiguous; DEBT-004).
203
- const { server, tool } = resolveToolCallName(block.name, (request.tools ?? []).map((t) => t.name));
204
- toolCalls.push({
205
- id: block.id,
206
- server,
207
- tool,
208
- arguments: block.input,
209
- });
210
- }
211
- }
212
- const message = {
213
- id: generateId(),
214
- sessionId: "",
215
- role: "assistant",
216
- content: contentParts.length > 0 ? contentParts.join("\n") : undefined,
217
- toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
218
- createdAt: nowIso(),
219
- };
220
- const sdkUsage = response.usage;
221
- const STOP_REASON = {
222
- end_turn: "stop", max_tokens: "length", tool_use: "tool_calls",
223
- };
224
- const normalisedStopReason = STOP_REASON[response.stop_reason ?? ""] ?? "unknown";
225
- return {
226
- message,
227
- stopReason: toolCalls.length > 0 ? "tool_calls" : "completed",
228
- usage: {
229
- inputTokens: sdkUsage.input_tokens,
230
- outputTokens: sdkUsage.output_tokens,
231
- stopReason: normalisedStopReason,
232
- maxTokens: this.providerConfig.maxTokens ?? defaultMaxTokens(effectiveModel),
233
- cacheReadTokens: sdkUsage.cache_read_input_tokens ?? undefined,
234
- cacheCreationTokens: sdkUsage.cache_creation_input_tokens ?? undefined,
235
- },
236
- };
237
- };
238
- if (retryConfig) {
239
- return pRetry(run, {
240
- retries: retryConfig.retries,
241
- minTimeout: retryConfig.minTimeout,
242
- maxTimeout: retryConfig.maxTimeout,
243
- factor: retryConfig.factor,
244
- onFailedAttempt: error => {
245
- if (request.signal?.aborted) {
246
- throw error; // don't retry on cancellation
247
- }
248
- // Don't retry auth failures — credentials won't change between attempts
249
- if ("status" in error && error.status === 401) {
250
- throw new ToolError("PROVIDER_AUTH_ERROR", `Anthropic authentication failed. ` +
251
- `Check ADHD_AGENT_ANTHROPIC_SECRET in your ~/.adhd/.env ` +
252
- `(run \`claude setup-token\` to obtain a fresh OAuth access token).`);
253
- }
254
- },
255
- });
256
- }
257
- return run();
258
- }
259
- }
260
- //# sourceMappingURL=anthropic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -1,153 +0,0 @@
1
- /**
2
- * ClaudeCliProvider — drives the local `claude` CLI (Claude Code) as an LLM
3
- * backend using a persistent subprocess with bidirectional stream-json I/O.
4
- *
5
- * Auth: uses whatever credentials Claude Code already has configured
6
- * (subscription, API key, OAuth — whatever `claude auth status` shows).
7
- *
8
- * Flags applied on every invocation:
9
- * --system-prompt Replace Claude Code's default prompt with the agent's prompt
10
- * --mcp-config <tempfile> Writes the agent's mcpServers to a temp JSON file; path passed here
11
- * --strict-mcp-config Ignore all other MCP configs; only load what we pass
12
- * --input-format stream-json Accept NDJSON messages on stdin
13
- * --output-format stream-json Emit NDJSON events on stdout
14
- * --verbose Emit full event stream including tool calls and results
15
- *
16
- * --disallowedTools <name> (×N) — one pair per built-in not in allowedBuiltinTools.
17
- * All Claude Code built-ins are blocked by default; only tools explicitly listed
18
- * in the agent definition's allowedBuiltinTools field are permitted. MCP tools
19
- * (from --mcp-config) are unaffected.
20
- *
21
- * ⚠️ --tools "" is NOT used — it disables MCP tools as well as built-ins.
22
- * ⚠️ --bare is NOT used — it blocks --mcp-config from loading entirely.
23
- *
24
- * Agent-spec mode (config.systemPromptIsAgentSpec === true):
25
- * The agent's systemPrompt is treated as a complete Claude Code agent markdown
26
- * file (YAML frontmatter + body). Instead of --system-prompt + --disallowedTools,
27
- * the provider writes it to an isolated temp project dir and passes
28
- * --add-dir <tmpdir> --setting-sources project --agent <frontmatterName>
29
- * so Claude *internally parses the frontmatter header* — including the `tools:`
30
- * field — which then governs tool access and TAKES PRECEDENCE over the built-in
31
- * disallow enumeration. `--agent` matches the frontmatter `name:`, not the
32
- * filename; cwd is preserved so file/Bash tools keep their working root. Omit
33
- * `tools:` in the header to inherit all tools; list `mcp__<server>__<tool>`
34
- * entries to expose specific MCP tools. allowedBuiltinTools is ignored in this mode.
35
- *
36
- * Tool loop: when Claude Code emits a tool_use block, we execute it via the
37
- * request.executeTool callback (wired by the orchestrator to the McpClientRegistry)
38
- * and write a tool_result message back to stdin. This continues until Claude
39
- * emits a "result" event, at which point chat() resolves with stopReason "completed".
40
- *
41
- * ⚠️ KNOWN ISSUE: Claude Code may crash with
42
- * "Z is not an Object. (evaluating '"tool_use_id"in Z')"
43
- * when a tool_result is written to stdin. This is a suspected Claude Code bug
44
- * (github.com/anthropics/claude-code/issues/24594). If you hit this, the
45
- * provider will throw PROVIDER_ERROR and the task will fail. Fall back to the
46
- * anthropic provider with useClaudeOauth: true for a fully supported path.
47
- */
48
- import type { LLMProvider, ProviderChatRequest, ProviderChatResponse } from "./types.js";
49
- import type { McpServerConfig, ProviderConfig } from "../validation/index.js";
50
- type ClaudeCliConfig = Extract<ProviderConfig, {
51
- type: "claudecli";
52
- }>;
53
- /**
54
- * Compute the effective allowed built-in set and the `--disallowedTools` argv
55
- * entries that must be passed to the `claude` CLI subprocess.
56
- *
57
- * This is the single source of truth for [inv:no-third-tool-model]: the
58
- * allowed set is resolved in priority order:
59
- * 1. `compiledTools` (AGENT_TOOL / compile.tools model) — wins when present.
60
- * 2. `config.allowedBuiltinTools` — legacy / transition-window fallback.
61
- *
62
- * Extracted here so tests can assert the REAL produced argv without spawning
63
- * a subprocess. `chat()` must call this function; no divergence allowed.
64
- *
65
- * @param compiledTools - Platform-alias array from `compileAgent().tools`, or
66
- * `undefined` when the compiler integration is not available yet.
67
- * @param allowedBuiltinTools - Per-agent legacy allowlist from config.
68
- * @returns `{ effectiveAllowed, disallowedArgv }` where `disallowedArgv` is the
69
- * flat `["--disallowedTools", "<name>", ...]` fragment ready to push into args.
70
- */
71
- export declare function computeClaudeBuiltinArgs(params: {
72
- compiledTools: string[] | undefined;
73
- allowedBuiltinTools: string[] | undefined;
74
- }): {
75
- effectiveAllowed: string[];
76
- disallowedArgv: string[];
77
- };
78
- /**
79
- * Extracts the `name:` field from the leading YAML frontmatter block of a Claude
80
- * Code agent markdown system prompt. Only the first `---`-delimited block at the
81
- * very top of the string is considered. Returns undefined when there is no leading
82
- * frontmatter block or no `name:` key.
83
- *
84
- * Claude Code selects an agent (`--agent <name>`) by this frontmatter name — not
85
- * the on-disk filename — so the provider must read it to build the correct flag.
86
- */
87
- export declare function extractAgentSpecName(md: string): string | undefined;
88
- /**
89
- * Ensures an agent-spec markdown carries a frontmatter `name:` so the subprocess
90
- * can select it with `--agent`. Returns the markdown to write and the agent name
91
- * to pass to `--agent`.
92
- *
93
- * - If the prompt already names the agent, it is used verbatim and the markdown is
94
- * returned unchanged (the spec author's `tools:` header is the source of truth).
95
- * - If a frontmatter block exists but lacks `name:`, a generated name is injected
96
- * into it.
97
- * - If there is no frontmatter at all, the prompt is wrapped in a minimal block
98
- * (no `tools:` → Claude inherits all tools, matching pre-spec-mode behavior).
99
- */
100
- export declare function normalizeAgentSpec(md: string): {
101
- content: string;
102
- agentName: string;
103
- };
104
- export declare class ClaudeCliProvider implements LLMProvider {
105
- private readonly config;
106
- private readonly mcpServers;
107
- /**
108
- * Platform-alias tool list derived from the AGENT_TOOL / compiled.tools model.
109
- *
110
- * When supplied (via `compileAgent({ platform: "claude_code" }).tools`), this
111
- * array is the single source of truth for which Claude Code built-ins are
112
- * permitted — config.allowedBuiltinTools is ignored. When absent, the provider
113
- * falls back to config.allowedBuiltinTools (legacy / transition-window path).
114
- *
115
- * [inv:no-third-tool-model] — one tool-permission source, not two.
116
- */
117
- private readonly compiledTools;
118
- constructor(config: ClaudeCliConfig, mcpServers?: Record<string, McpServerConfig>, compiledTools?: string[]);
119
- /**
120
- * Build the subprocess environment for the claude CLI subprocess.
121
- *
122
- * Merges the live process.env (PATH, HOME, call-time vars) with the
123
- * config snapshot (ADHD_AGENT_* vars loaded from the .env hierarchy at
124
- * startup), with the config snapshot winning on conflicts. This ensures
125
- * the subprocess inherits both the user's shell context and any overrides
126
- * loaded via the .env hierarchy — and allows test-injected env vars (e.g.
127
- * CAPTURE_FILE) to flow through to the subprocess without a module reload.
128
- */
129
- private buildSubprocessEnv;
130
- /**
131
- * Write the agent's McpServerConfig map to a temp JSON file in the format
132
- * Claude Code's --mcp-config flag expects. Inline JSON strings are not parsed
133
- * by the CLI — a file path is required.
134
- *
135
- * Maps our `transport` field to Claude Code's `type`. The caller is responsible
136
- * for deleting the file (use the finally block in chat()).
137
- *
138
- * Returns undefined if there are no servers to configure.
139
- */
140
- private writeMcpConfigFile;
141
- /**
142
- * Writes an agent-spec markdown system prompt to an isolated temp project dir
143
- * as `<dir>/.claude/agents/<name>.md`, so the subprocess can discover and
144
- * parse it via `--add-dir <dir> --setting-sources project --agent <name>`.
145
- *
146
- * Returns the temp dir (for `--add-dir`) and the frontmatter agent name (for
147
- * `--agent`). The caller MUST delete the dir in its finally block.
148
- */
149
- private writeAgentSpecDir;
150
- chat(request: ProviderChatRequest): Promise<ProviderChatResponse>;
151
- }
152
- export {};
153
- //# sourceMappingURL=claudecli.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claudecli.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/providers/claudecli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAWH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAW,MAAM,wBAAwB,CAAC;AAKvF,KAAK,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AAkItE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC7C,aAAa,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACpC,mBAAmB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7C,GAAG;IAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAe3D;AAQD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAgBrF;AAID,qBAAa,iBAAkB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAC7D;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;gBAGjD,MAAM,EAAE,eAAe,EACvB,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAM,EAChD,aAAa,CAAC,EAAE,MAAM,EAAE;IAO5B;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;;;;;;;OASG;YACW,kBAAkB;IA8BhC;;;;;;;OAOG;YACW,iBAAiB;IAYzB,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAwO1E"}