@adhd/agent-mcp 0.0.1 → 0.0.2
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.
- package/package.json +2 -1
- package/src/engine/hooks.d.ts +7 -0
- package/src/engine/hooks.d.ts.map +1 -0
- package/src/engine/hooks.js +26 -0
- package/src/engine/hooks.js.map +1 -0
- package/src/engine/orchestrator.d.ts +2 -0
- package/src/engine/orchestrator.d.ts.map +1 -1
- package/src/engine/orchestrator.js +50 -1
- package/src/engine/orchestrator.js.map +1 -1
- package/src/index.js +6 -2
- package/src/index.js.map +1 -1
- package/src/providers/anthropic.d.ts +1 -1
- package/src/providers/anthropic.d.ts.map +1 -1
- package/src/providers/anthropic.js +105 -3
- package/src/providers/anthropic.js.map +1 -1
- package/src/providers/claudecli.d.ts +66 -0
- package/src/providers/claudecli.d.ts.map +1 -0
- package/src/providers/claudecli.js +331 -0
- package/src/providers/claudecli.js.map +1 -0
- package/src/providers/factory.d.ts +5 -2
- package/src/providers/factory.d.ts.map +1 -1
- package/src/providers/factory.js +7 -1
- package/src/providers/factory.js.map +1 -1
- package/src/providers/types.d.ts +14 -11
- package/src/providers/types.d.ts.map +1 -1
- package/src/server.d.ts +2 -0
- package/src/server.d.ts.map +1 -1
- package/src/server.js +95 -27
- package/src/server.js.map +1 -1
- package/src/store/agent-store.d.ts +3 -1
- package/src/store/agent-store.d.ts.map +1 -1
- package/src/store/agent-store.js +8 -5
- package/src/store/agent-store.js.map +1 -1
- package/src/store/session-store.d.ts +3 -1
- package/src/store/session-store.d.ts.map +1 -1
- package/src/store/session-store.js +6 -2
- package/src/store/session-store.js.map +1 -1
- package/src/tools/task.d.ts +7 -2
- package/src/tools/task.d.ts.map +1 -1
- package/src/tools/task.js +92 -3
- package/src/tools/task.js.map +1 -1
- package/src/validation/agent.d.ts +35 -3
- package/src/validation/agent.d.ts.map +1 -1
- package/src/validation/agent.js +19 -0
- package/src/validation/agent.js.map +1 -1
- package/src/validation/errors.d.ts +5 -3
- package/src/validation/errors.d.ts.map +1 -1
- package/src/validation/errors.js.map +1 -1
- package/src/validation/execution.d.ts +9 -1
- package/src/validation/execution.d.ts.map +1 -1
- package/src/validation/mcp.d.ts +1 -2
- package/src/validation/mcp.d.ts.map +1 -1
- package/src/validation/message.d.ts +1 -4
- package/src/validation/message.d.ts.map +1 -1
- package/src/validation/message.js.map +1 -1
- package/src/validation/session.d.ts +2 -2
- package/src/validation/session.d.ts.map +1 -1
- package/src/validation/task.d.ts +9 -6
- package/src/validation/task.d.ts.map +1 -1
- package/src/validation/task.js +8 -1
- package/src/validation/task.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adhd/agent-mcp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "Stateful MCP-native agent runtime with provider abstraction and recursive delegation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"db:migrate": "drizzle-kit migrate"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
+
"@adhd/agent-mcp-types": "*",
|
|
26
27
|
"@anthropic-ai/sdk": "0.96.0",
|
|
27
28
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
28
29
|
"better-sqlite3": "12.10.0",
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HookEvent, HookEventMap, HookHandler, IHookRegistry } from "@adhd/agent-mcp-types";
|
|
2
|
+
export declare class HookRegistry implements IHookRegistry {
|
|
3
|
+
private readonly handlers;
|
|
4
|
+
register<E extends HookEvent>(event: E, handler: HookHandler<E>): void;
|
|
5
|
+
emit<E extends HookEvent>(event: E, payload: HookEventMap[E]): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGjG,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkD;IAE3E,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAMhE,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAcnF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { logger } from "../logger.js";
|
|
2
|
+
export class HookRegistry {
|
|
3
|
+
handlers = new Map();
|
|
4
|
+
register(event, handler) {
|
|
5
|
+
const list = this.handlers.get(event) ?? [];
|
|
6
|
+
list.push(handler);
|
|
7
|
+
this.handlers.set(event, list);
|
|
8
|
+
}
|
|
9
|
+
async emit(event, payload) {
|
|
10
|
+
const list = this.handlers.get(event);
|
|
11
|
+
if (!list?.length)
|
|
12
|
+
return;
|
|
13
|
+
for (const handler of list) {
|
|
14
|
+
try {
|
|
15
|
+
await handler(payload);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
// Phase 1: all hooks are observational. Errors are logged and swallowed so a
|
|
19
|
+
// buggy plugin never kills a task. Intercepting semantics (pre:tool_call blocking,
|
|
20
|
+
// pre:model_request mutation) are Phase 2.
|
|
21
|
+
logger.warn({ event, err }, "hook handler error (swallowed)");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/hooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,OAAO,YAAY;IACN,QAAQ,GAAG,IAAI,GAAG,EAAuC,CAAC;IAE3E,QAAQ,CAAsB,KAAQ,EAAE,OAAuB;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAiC,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAsB,KAAQ,EAAE,OAAwB;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,MAAM;YAAE,OAAO;QAC1B,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAO,OAA0B,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,6EAA6E;gBAC7E,mFAAmF;gBACnF,2CAA2C;gBAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,gCAAgC,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { LLMProvider } from "../providers/types.js";
|
|
2
2
|
import type { ExecutionContext, Message } from "../validation/index.js";
|
|
3
|
+
import type { IHookRegistry } from "@adhd/agent-mcp-types";
|
|
3
4
|
import type { McpClientRegistry } from "../clients/registry.js";
|
|
4
5
|
import type { PolicyEngine } from "./policy.js";
|
|
5
6
|
import type { TaskStore } from "../store/task-store.js";
|
|
@@ -14,6 +15,7 @@ export interface OrchestratorRunInput {
|
|
|
14
15
|
sessionStore: SessionStore;
|
|
15
16
|
signal: AbortSignal;
|
|
16
17
|
taskId: string;
|
|
18
|
+
hooks?: IHookRegistry;
|
|
17
19
|
}
|
|
18
20
|
export interface OrchestratorRunResult {
|
|
19
21
|
result: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACjC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,aAAa,CAAC;CACzB;AAQD,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACf,GAAG,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CA2VzE"}
|
|
@@ -2,14 +2,20 @@ import { logger } from "../logger.js";
|
|
|
2
2
|
import { ToolError } from "../validation/errors.js";
|
|
3
3
|
import { generateId } from "../utils/ids.js";
|
|
4
4
|
import { nowIso } from "../utils/timestamps.js";
|
|
5
|
+
/** No-op IHookRegistry used as a fallback when none is provided. */
|
|
6
|
+
const noopHooks = {
|
|
7
|
+
register: () => undefined,
|
|
8
|
+
emit: async () => undefined,
|
|
9
|
+
};
|
|
5
10
|
export class Orchestrator {
|
|
6
11
|
async run(input) {
|
|
7
|
-
const { executionContext, registry, provider, policy, taskStore, sessionStore, signal, taskId, } = input;
|
|
12
|
+
const { executionContext, registry, provider, policy, taskStore, sessionStore, signal, taskId, hooks = noopHooks, } = input;
|
|
8
13
|
// Working copy of messages — we append to this as the loop progresses
|
|
9
14
|
const currentMessages = [...input.messages];
|
|
10
15
|
try {
|
|
11
16
|
// Mark task as running
|
|
12
17
|
taskStore.updateStatus(taskId, "running");
|
|
18
|
+
await hooks.emit("task:start", { executionContext, messages: currentMessages });
|
|
13
19
|
let finalContent = "";
|
|
14
20
|
// Tool-use loop — break on "completed" stop reason, throw on cancellation/policy
|
|
15
21
|
let looping = true;
|
|
@@ -37,6 +43,8 @@ export class Orchestrator {
|
|
|
37
43
|
agentName: executionContext.agentName,
|
|
38
44
|
messageCount: currentMessages.length,
|
|
39
45
|
}, "MODEL_REQUEST");
|
|
46
|
+
// Emit pre:model_request hook
|
|
47
|
+
await hooks.emit("pre:model_request", { executionContext, messages: currentMessages, tools });
|
|
40
48
|
// Call the LLM provider
|
|
41
49
|
let providerResponse;
|
|
42
50
|
try {
|
|
@@ -44,6 +52,22 @@ export class Orchestrator {
|
|
|
44
52
|
messages: currentMessages,
|
|
45
53
|
tools: tools.length > 0 ? tools : undefined,
|
|
46
54
|
signal: composedSignal,
|
|
55
|
+
// executeTool is used by providers (e.g. claudecli) that manage
|
|
56
|
+
// their own internal tool loop. Standard providers (anthropic,
|
|
57
|
+
// openai, lmstudio) return stopReason "tool_calls" and ignore this.
|
|
58
|
+
executeTool: async (server, tool, args) => {
|
|
59
|
+
const client = await registry.getClient(server);
|
|
60
|
+
try {
|
|
61
|
+
const result = await client.callTool(tool, args);
|
|
62
|
+
return { result, isError: false };
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
return {
|
|
66
|
+
result: error instanceof Error ? error.message : String(error),
|
|
67
|
+
isError: true,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
},
|
|
47
71
|
});
|
|
48
72
|
}
|
|
49
73
|
catch (error) {
|
|
@@ -64,6 +88,12 @@ export class Orchestrator {
|
|
|
64
88
|
// Persist and append the assistant message
|
|
65
89
|
await sessionStore.appendMessage(executionContext.sessionId, assistantMessage);
|
|
66
90
|
currentMessages.push(assistantMessage);
|
|
91
|
+
await hooks.emit("post:model_response", {
|
|
92
|
+
executionContext,
|
|
93
|
+
stopReason: providerResponse.stopReason,
|
|
94
|
+
toolCallCount: assistantMessage.toolCalls?.length ?? 0,
|
|
95
|
+
});
|
|
96
|
+
await hooks.emit("message:appended", { executionContext, message: assistantMessage });
|
|
67
97
|
// Emit MODEL_RESPONSE event
|
|
68
98
|
taskStore.appendEvent({
|
|
69
99
|
taskId,
|
|
@@ -92,6 +122,13 @@ export class Orchestrator {
|
|
|
92
122
|
throw new ToolError("PROVIDER_ERROR", "Task was cancelled before tool call");
|
|
93
123
|
}
|
|
94
124
|
const qualifiedToolName = `${toolCall.server}__${toolCall.tool}`;
|
|
125
|
+
// Emit pre:tool_call hook (observational in Phase 1)
|
|
126
|
+
await hooks.emit("pre:tool_call", {
|
|
127
|
+
executionContext,
|
|
128
|
+
toolName: qualifiedToolName,
|
|
129
|
+
callId: toolCall.id,
|
|
130
|
+
toolInput: toolCall.arguments,
|
|
131
|
+
});
|
|
95
132
|
// Policy check before executing the tool
|
|
96
133
|
policy.check({
|
|
97
134
|
executionContext,
|
|
@@ -156,6 +193,14 @@ export class Orchestrator {
|
|
|
156
193
|
tool: qualifiedToolName,
|
|
157
194
|
isError,
|
|
158
195
|
}, "TOOL_RESULT");
|
|
196
|
+
await hooks.emit("post:tool_call", {
|
|
197
|
+
executionContext,
|
|
198
|
+
toolName: qualifiedToolName,
|
|
199
|
+
callId: toolCall.id,
|
|
200
|
+
toolInput: toolCall.arguments,
|
|
201
|
+
result: toolResult,
|
|
202
|
+
isError,
|
|
203
|
+
});
|
|
159
204
|
// Append tool result message
|
|
160
205
|
const toolResultMessage = {
|
|
161
206
|
id: generateId(),
|
|
@@ -172,6 +217,7 @@ export class Orchestrator {
|
|
|
172
217
|
};
|
|
173
218
|
await sessionStore.appendMessage(executionContext.sessionId, toolResultMessage);
|
|
174
219
|
currentMessages.push(toolResultMessage);
|
|
220
|
+
await hooks.emit("message:appended", { executionContext, message: toolResultMessage });
|
|
175
221
|
// Increment toolCallCount AFTER the result is appended
|
|
176
222
|
// so the next policy check sees the updated value
|
|
177
223
|
executionContext.toolCallCount++;
|
|
@@ -188,6 +234,7 @@ export class Orchestrator {
|
|
|
188
234
|
payload: { result: finalContent },
|
|
189
235
|
});
|
|
190
236
|
logger.info({ taskId, agentName: executionContext.agentName }, "TASK_COMPLETED");
|
|
237
|
+
await hooks.emit("task:completed", { executionContext, result: finalContent });
|
|
191
238
|
return { result: finalContent };
|
|
192
239
|
}
|
|
193
240
|
catch (error) {
|
|
@@ -206,6 +253,7 @@ export class Orchestrator {
|
|
|
206
253
|
// already cancelled — ignore
|
|
207
254
|
}
|
|
208
255
|
taskStore.appendEvent({ taskId, type: "TASK_CANCELLED" });
|
|
256
|
+
void hooks.emit("task:cancelled", { executionContext });
|
|
209
257
|
}
|
|
210
258
|
else {
|
|
211
259
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -218,6 +266,7 @@ export class Orchestrator {
|
|
|
218
266
|
payload: { error: errorMessage },
|
|
219
267
|
});
|
|
220
268
|
logger.error({ taskId, agentName: executionContext.agentName, error }, "TASK_FAILED");
|
|
269
|
+
void hooks.emit("task:failed", { executionContext, error: errorMessage });
|
|
221
270
|
}
|
|
222
271
|
throw error;
|
|
223
272
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/orchestrator.ts"],"names":[],"mappings":"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"}
|
package/src/index.js
CHANGED
|
@@ -6,16 +6,19 @@ import { logger } from "./logger.js";
|
|
|
6
6
|
import { AgentStore, SessionStore, TaskStore } from "./store/index.js";
|
|
7
7
|
import { BackgroundQueue } from "./engine/queue.js";
|
|
8
8
|
import { Orchestrator } from "./engine/orchestrator.js";
|
|
9
|
+
import { HookRegistry } from "./engine/hooks.js";
|
|
9
10
|
import { PolicyEngine } from "./engine/policy.js";
|
|
10
11
|
import { startServer } from "./server.js";
|
|
11
12
|
async function main() {
|
|
12
13
|
// Run DB migrations synchronously before advertising tools
|
|
13
14
|
runMigrations();
|
|
15
|
+
// Instantiate hooks registry
|
|
16
|
+
const hooks = new HookRegistry();
|
|
14
17
|
// Instantiate stores
|
|
15
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
19
|
const dbAny = db;
|
|
17
|
-
const agentStore = new AgentStore(dbAny);
|
|
18
|
-
const sessionStore = new SessionStore(dbAny);
|
|
20
|
+
const agentStore = new AgentStore(dbAny, hooks);
|
|
21
|
+
const sessionStore = new SessionStore(dbAny, hooks);
|
|
19
22
|
const taskStore = new TaskStore(dbAny);
|
|
20
23
|
// Instantiate engine components
|
|
21
24
|
const queue = new BackgroundQueue();
|
|
@@ -35,6 +38,7 @@ async function main() {
|
|
|
35
38
|
queue,
|
|
36
39
|
orchestrator,
|
|
37
40
|
policy,
|
|
41
|
+
hooks,
|
|
38
42
|
});
|
|
39
43
|
const shutdown = async (signal) => {
|
|
40
44
|
logger.info({ signal }, "Server shutdown");
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/ai/agent-mcp/src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,KAAK,UAAU,IAAI;IACf,2DAA2D;IAC3D,aAAa,EAAE,CAAC;IAEhB,qBAAqB;IACrB,8DAA8D;IAC9D,MAAM,KAAK,GAAG,EAAS,CAAC;IACxB,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/ai/agent-mcp/src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,KAAK,UAAU,IAAI;IACf,2DAA2D;IAC3D,aAAa,EAAE,CAAC;IAEhB,6BAA6B;IAC7B,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IAEjC,qBAAqB;IACrB,8DAA8D;IAC9D,MAAM,KAAK,GAAG,EAAS,CAAC;IACxB,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;IAEvC,gCAAgC;IAChC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC5B,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QAC7D,kBAAkB,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACvE,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC9C,EAAE,KAAK,CAAC,GAAG,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,MAAM,CAAC,OAAO,CAAC;KACvB,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAAC;QAChC,UAAU;QACV,YAAY;QACZ,SAAS;QACT,KAAK;QACL,YAAY;QACZ,MAAM;QACN,KAAK;KACR,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACtC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAC3C,MAAM,KAAK,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACf,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ProviderConfig } from "../validation/index.js";
|
|
2
2
|
import type { LLMProvider, ProviderChatRequest, ProviderChatResponse } from "./types.js";
|
|
3
3
|
export declare class AnthropicProvider implements LLMProvider {
|
|
4
|
-
private
|
|
4
|
+
private client;
|
|
5
5
|
private readonly config;
|
|
6
6
|
constructor(config: Extract<ProviderConfig, {
|
|
7
7
|
type: "anthropic";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/providers/anthropic.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/providers/anthropic.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,wBAAwB,CAAC;AAEhF,OAAO,KAAK,EACR,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EAEvB,MAAM,YAAY,CAAC;AAsKpB,qBAAa,iBAAkB,YAAW,WAAW;IACjD,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;gBAE5D,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC;IA4B5D,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAgF1E"}
|
|
@@ -1,7 +1,83 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
+
import { execFile } from "child_process";
|
|
3
|
+
import { promisify } from "util";
|
|
2
4
|
import pRetry from "p-retry";
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
3
6
|
import { generateId } from "../utils/ids.js";
|
|
4
7
|
import { nowIso } from "../utils/timestamps.js";
|
|
8
|
+
// ─── OAuth keychain helpers ───────────────────────────────────────────────────
|
|
9
|
+
const KEYCHAIN_SERVICE = "Claude Code-credentials";
|
|
10
|
+
const OAUTH_TOKEN_URL = "https://platform.claude.com/v1/oauth/token";
|
|
11
|
+
const OAUTH_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
|
|
12
|
+
/** Refresh when fewer than this many ms remain on the access token. */
|
|
13
|
+
const REFRESH_BUFFER_MS = 5 * 60 * 1000; // 5 min
|
|
14
|
+
async function readKeychainCreds() {
|
|
15
|
+
const { stdout } = await execFileAsync("security", ["find-generic-password", "-s", KEYCHAIN_SERVICE, "-w"], { encoding: "utf8" });
|
|
16
|
+
const parsed = JSON.parse(stdout.trim());
|
|
17
|
+
return parsed.claudeAiOauth;
|
|
18
|
+
}
|
|
19
|
+
async function refreshOauthToken(refreshToken) {
|
|
20
|
+
// ⚠️ UNVERIFIED PATH — refresh confirmed blocked (HTTP 429) while the access token
|
|
21
|
+
// is still valid; the endpoint appears to enforce "no early refresh" as an OAuth
|
|
22
|
+
// policy. This function will only be called when the token is within
|
|
23
|
+
// REFRESH_BUFFER_MS of expiry (see getAccessToken below), which is the correct
|
|
24
|
+
// window. To confirm it actually works end-to-end:
|
|
25
|
+
//
|
|
26
|
+
// 1. Check the current expiry:
|
|
27
|
+
// security find-generic-password -s "Claude Code-credentials" -w \
|
|
28
|
+
// | python3 -c "import sys,json,time; d=json.load(sys.stdin);
|
|
29
|
+
// exp=d['claudeAiOauth']['expiresAt']/1000;
|
|
30
|
+
// print(time.strftime('%Y-%m-%d %H:%M:%S UTC', time.gmtime(exp)),
|
|
31
|
+
// f'({round((exp-time.time())/60,1)} min remaining)')"
|
|
32
|
+
//
|
|
33
|
+
// 2. Wait until ≤5 min remain (or temporarily lower REFRESH_BUFFER_MS to
|
|
34
|
+
// something large like 7*60*60*1000 to force the code path immediately).
|
|
35
|
+
//
|
|
36
|
+
// 3. Call getAccessToken() and confirm a new token is returned.
|
|
37
|
+
//
|
|
38
|
+
// If this ever returns a 429 in production it means the token expired and the
|
|
39
|
+
// refresh endpoint itself is down — the fallback in getAccessToken() will use
|
|
40
|
+
// the stored (expired) token and let the SDK surface a 401.
|
|
41
|
+
const body = new URLSearchParams({
|
|
42
|
+
grant_type: "refresh_token",
|
|
43
|
+
refresh_token: refreshToken,
|
|
44
|
+
client_id: OAUTH_CLIENT_ID,
|
|
45
|
+
});
|
|
46
|
+
const res = await fetch(OAUTH_TOKEN_URL, {
|
|
47
|
+
method: "POST",
|
|
48
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
49
|
+
body: body.toString(),
|
|
50
|
+
});
|
|
51
|
+
const json = await res.json();
|
|
52
|
+
if (!res.ok || !json.access_token) {
|
|
53
|
+
throw new Error(`OAuth refresh failed: ${JSON.stringify(json)}`);
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
accessToken: json.access_token,
|
|
57
|
+
refreshToken: json.refresh_token ?? refreshToken, // some providers rotate it
|
|
58
|
+
expiresAt: Date.now() + (json.expires_in ?? 3600) * 1000,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns a fresh access token, refreshing via OAuth if the stored one is
|
|
63
|
+
* within REFRESH_BUFFER_MS of expiry. Falls back to the stored token on
|
|
64
|
+
* refresh failure (it may still be valid).
|
|
65
|
+
*/
|
|
66
|
+
async function getAccessToken() {
|
|
67
|
+
const creds = await readKeychainCreds();
|
|
68
|
+
if (Date.now() < creds.expiresAt - REFRESH_BUFFER_MS) {
|
|
69
|
+
return creds.accessToken; // still good
|
|
70
|
+
}
|
|
71
|
+
// Token is expired or nearly so — refresh
|
|
72
|
+
try {
|
|
73
|
+
const fresh = await refreshOauthToken(creds.refreshToken);
|
|
74
|
+
return fresh.accessToken;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Refresh failed — fall back to stored token and let the SDK surface the 401
|
|
78
|
+
return creds.accessToken;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
5
81
|
function toAnthropicTools(tools) {
|
|
6
82
|
if (!tools)
|
|
7
83
|
return undefined;
|
|
@@ -65,11 +141,37 @@ export class AnthropicProvider {
|
|
|
65
141
|
config;
|
|
66
142
|
constructor(config) {
|
|
67
143
|
this.config = config;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
144
|
+
if (config.useClaudeOauth) {
|
|
145
|
+
// Deferred: client is built per-request in chat() after fetching a fresh token.
|
|
146
|
+
// Set a placeholder that will be replaced before any real call.
|
|
147
|
+
this.client = null;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Resolve credentials in priority order:
|
|
151
|
+
// 1. Explicit API key env var (e.g. ANTHROPIC_API_KEY)
|
|
152
|
+
// 2. Explicit auth token env var (e.g. ANTHROPIC_AUTH_TOKEN, for subscription users)
|
|
153
|
+
// 3. Neither — let SDK auto-detect from its own ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN
|
|
154
|
+
// env fallbacks (throws AuthenticationError if neither is set)
|
|
155
|
+
const apiKey = process.env[config.apiKeyEnv ?? "ANTHROPIC_API_KEY"] || undefined;
|
|
156
|
+
const authToken = process.env[config.authTokenEnv ?? "ANTHROPIC_AUTH_TOKEN"] || undefined;
|
|
157
|
+
if (apiKey) {
|
|
158
|
+
this.client = new Anthropic({ apiKey });
|
|
159
|
+
}
|
|
160
|
+
else if (authToken) {
|
|
161
|
+
this.client = new Anthropic({ authToken });
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// No credentials found via env — SDK will throw a clear AuthenticationError
|
|
165
|
+
this.client = new Anthropic();
|
|
166
|
+
}
|
|
71
167
|
}
|
|
72
168
|
async chat(request) {
|
|
169
|
+
// For useClaudeOauth mode, fetch a fresh token on every chat() call so
|
|
170
|
+
// long-running servers never hold a stale client across token expiry.
|
|
171
|
+
if (this.config.useClaudeOauth) {
|
|
172
|
+
const authToken = await getAccessToken();
|
|
173
|
+
this.client = new Anthropic({ authToken });
|
|
174
|
+
}
|
|
73
175
|
const retryConfig = this.config.retryConfig;
|
|
74
176
|
const systemMessages = request.messages.filter(m => m.role === "system");
|
|
75
177
|
const systemPrompt = systemMessages.map(m => m.content || "").join("\n") || undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/providers/anthropic.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
* Tool loop: when Claude Code emits a tool_use block, we execute it via the
|
|
25
|
+
* request.executeTool callback (wired by the orchestrator to the McpClientRegistry)
|
|
26
|
+
* and write a tool_result message back to stdin. This continues until Claude
|
|
27
|
+
* emits a "result" event, at which point chat() resolves with stopReason "completed".
|
|
28
|
+
*
|
|
29
|
+
* ⚠️ KNOWN ISSUE: Claude Code may crash with
|
|
30
|
+
* "Z is not an Object. (evaluating '"tool_use_id"in Z')"
|
|
31
|
+
* when a tool_result is written to stdin. This is a suspected Claude Code bug
|
|
32
|
+
* (github.com/anthropics/claude-code/issues/24594). If you hit this, the
|
|
33
|
+
* provider will throw PROVIDER_ERROR and the task will fail. Fall back to the
|
|
34
|
+
* anthropic provider with useClaudeOauth: true for a fully supported path.
|
|
35
|
+
*/
|
|
36
|
+
import type { LLMProvider, ProviderChatRequest, ProviderChatResponse } from "./types.js";
|
|
37
|
+
import type { McpServerConfig, ProviderConfig } from "../validation/index.js";
|
|
38
|
+
type ClaudeCliConfig = Extract<ProviderConfig, {
|
|
39
|
+
type: "claudecli";
|
|
40
|
+
}>;
|
|
41
|
+
export declare class ClaudeCliProvider implements LLMProvider {
|
|
42
|
+
private readonly config;
|
|
43
|
+
private readonly mcpServers;
|
|
44
|
+
constructor(config: ClaudeCliConfig, mcpServers?: Record<string, McpServerConfig>);
|
|
45
|
+
/**
|
|
46
|
+
* Build the subprocess environment. Inherits the parent process env and,
|
|
47
|
+
* on macOS, tries to inject ANTHROPIC_AUTH_TOKEN from the Claude Code keychain.
|
|
48
|
+
* This is required when --bare is set, because --bare skips the settings
|
|
49
|
+
* discovery that normally loads Claude Code's auth configuration.
|
|
50
|
+
*/
|
|
51
|
+
private buildSubprocessEnv;
|
|
52
|
+
/**
|
|
53
|
+
* Write the agent's McpServerConfig map to a temp JSON file in the format
|
|
54
|
+
* Claude Code's --mcp-config flag expects. Inline JSON strings are not parsed
|
|
55
|
+
* by the CLI — a file path is required.
|
|
56
|
+
*
|
|
57
|
+
* Maps our `transport` field to Claude Code's `type`. The caller is responsible
|
|
58
|
+
* for deleting the file (use the finally block in chat()).
|
|
59
|
+
*
|
|
60
|
+
* Returns undefined if there are no servers to configure.
|
|
61
|
+
*/
|
|
62
|
+
private writeMcpConfigFile;
|
|
63
|
+
chat(request: ProviderChatRequest): Promise<ProviderChatResponse>;
|
|
64
|
+
}
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=claudecli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudecli.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/providers/claudecli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAaH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAW,MAAM,wBAAwB,CAAC;AAEvF,KAAK,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AA4GtE,qBAAa,iBAAkB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;gBAEjD,MAAM,EAAE,eAAe,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAM;IAKrF;;;;;OAKG;YACW,kBAAkB;IA4BhC;;;;;;;;;OASG;YACW,kBAAkB;IA8B1B,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAuL1E"}
|