@adhd/agent-mcp 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drizzle/0000_nifty_sasquatch.sql +55 -0
- package/drizzle/meta/0000_snapshot.json +387 -0
- package/drizzle/meta/_journal.json +13 -0
- package/package.json +51 -0
- package/src/clients/http-client.d.ts +24 -0
- package/src/clients/http-client.d.ts.map +1 -0
- package/src/clients/http-client.js +96 -0
- package/src/clients/http-client.js.map +1 -0
- package/src/clients/in-process.d.ts +27 -0
- package/src/clients/in-process.d.ts.map +1 -0
- package/src/clients/in-process.js +32 -0
- package/src/clients/in-process.js.map +1 -0
- package/src/clients/index.d.ts +7 -0
- package/src/clients/index.d.ts.map +1 -0
- package/src/clients/index.js +5 -0
- package/src/clients/index.js.map +1 -0
- package/src/clients/registry.d.ts +37 -0
- package/src/clients/registry.d.ts.map +1 -0
- package/src/clients/registry.js +125 -0
- package/src/clients/registry.js.map +1 -0
- package/src/clients/stdio-client.d.ts +16 -0
- package/src/clients/stdio-client.d.ts.map +1 -0
- package/src/clients/stdio-client.js +90 -0
- package/src/clients/stdio-client.js.map +1 -0
- package/src/clients/types.d.ts +14 -0
- package/src/clients/types.d.ts.map +1 -0
- package/src/clients/types.js +2 -0
- package/src/clients/types.js.map +1 -0
- package/src/db/client.d.ts +6 -0
- package/src/db/client.d.ts.map +1 -0
- package/src/db/client.js +19 -0
- package/src/db/client.js.map +1 -0
- package/src/db/migrate.d.ts +6 -0
- package/src/db/migrate.d.ts.map +1 -0
- package/src/db/migrate.js +12 -0
- package/src/db/migrate.js.map +1 -0
- package/src/db/schema.d.ts +733 -0
- package/src/db/schema.d.ts.map +1 -0
- package/src/db/schema.js +100 -0
- package/src/db/schema.js.map +1 -0
- package/src/engine/orchestrator.d.ts +24 -0
- package/src/engine/orchestrator.d.ts.map +1 -0
- package/src/engine/orchestrator.js +231 -0
- package/src/engine/orchestrator.js.map +1 -0
- package/src/engine/policy.d.ts +42 -0
- package/src/engine/policy.d.ts.map +1 -0
- package/src/engine/policy.js +45 -0
- package/src/engine/policy.js.map +1 -0
- package/src/engine/queue.d.ts +23 -0
- package/src/engine/queue.d.ts.map +1 -0
- package/src/engine/queue.js +45 -0
- package/src/engine/queue.js.map +1 -0
- package/src/index.d.ts +3 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +51 -0
- package/src/index.js.map +1 -0
- package/src/logger.d.ts +11 -0
- package/src/logger.d.ts.map +1 -0
- package/src/logger.js +17 -0
- package/src/logger.js.map +1 -0
- package/src/providers/anthropic.d.ts +11 -0
- package/src/providers/anthropic.d.ts.map +1 -0
- package/src/providers/anthropic.js +133 -0
- package/src/providers/anthropic.js.map +1 -0
- package/src/providers/factory.d.ts +7 -0
- package/src/providers/factory.d.ts.map +1 -0
- package/src/providers/factory.js +21 -0
- package/src/providers/factory.js.map +1 -0
- package/src/providers/index.d.ts +6 -0
- package/src/providers/index.d.ts.map +1 -0
- package/src/providers/index.js +5 -0
- package/src/providers/index.js.map +1 -0
- package/src/providers/lmstudio.d.ts +8 -0
- package/src/providers/lmstudio.d.ts.map +1 -0
- package/src/providers/lmstudio.js +15 -0
- package/src/providers/lmstudio.js.map +1 -0
- package/src/providers/openai.d.ts +12 -0
- package/src/providers/openai.d.ts.map +1 -0
- package/src/providers/openai.js +129 -0
- package/src/providers/openai.js.map +1 -0
- package/src/providers/types.d.ts +32 -0
- package/src/providers/types.d.ts.map +1 -0
- package/src/providers/types.js +2 -0
- package/src/providers/types.js.map +1 -0
- package/src/server.d.ts +23 -0
- package/src/server.d.ts.map +1 -0
- package/src/server.js +539 -0
- package/src/server.js.map +1 -0
- package/src/store/agent-store.d.ts +12 -0
- package/src/store/agent-store.d.ts.map +1 -0
- package/src/store/agent-store.js +97 -0
- package/src/store/agent-store.js.map +1 -0
- package/src/store/index.d.ts +4 -0
- package/src/store/index.d.ts.map +1 -0
- package/src/store/index.js +4 -0
- package/src/store/index.js.map +1 -0
- package/src/store/session-store.d.ts +23 -0
- package/src/store/session-store.d.ts.map +1 -0
- package/src/store/session-store.js +152 -0
- package/src/store/session-store.js.map +1 -0
- package/src/store/task-store.d.ts +49 -0
- package/src/store/task-store.d.ts.map +1 -0
- package/src/store/task-store.js +154 -0
- package/src/store/task-store.js.map +1 -0
- package/src/tools/agent-crud.d.ts +13 -0
- package/src/tools/agent-crud.d.ts.map +1 -0
- package/src/tools/agent-crud.js +17 -0
- package/src/tools/agent-crud.js.map +1 -0
- package/src/tools/session.d.ts +21 -0
- package/src/tools/session.d.ts.map +1 -0
- package/src/tools/session.js +41 -0
- package/src/tools/session.js.map +1 -0
- package/src/tools/task.d.ts +38 -0
- package/src/tools/task.d.ts.map +1 -0
- package/src/tools/task.js +136 -0
- package/src/tools/task.js.map +1 -0
- package/src/types/agent.d.ts +2 -0
- package/src/types/agent.d.ts.map +1 -0
- package/src/types/agent.js +3 -0
- package/src/types/agent.js.map +1 -0
- package/src/types/execution.d.ts +2 -0
- package/src/types/execution.d.ts.map +1 -0
- package/src/types/execution.js +3 -0
- package/src/types/execution.js.map +1 -0
- package/src/types/index.d.ts +2 -0
- package/src/types/index.d.ts.map +1 -0
- package/src/types/index.js +2 -0
- package/src/types/index.js.map +1 -0
- package/src/types/mcp.d.ts +2 -0
- package/src/types/mcp.d.ts.map +1 -0
- package/src/types/mcp.js +3 -0
- package/src/types/mcp.js.map +1 -0
- package/src/types/message.d.ts +2 -0
- package/src/types/message.d.ts.map +1 -0
- package/src/types/message.js +3 -0
- package/src/types/message.js.map +1 -0
- package/src/types/session.d.ts +2 -0
- package/src/types/session.d.ts.map +1 -0
- package/src/types/session.js +3 -0
- package/src/types/session.js.map +1 -0
- package/src/types/task.d.ts +2 -0
- package/src/types/task.d.ts.map +1 -0
- package/src/types/task.js +3 -0
- package/src/types/task.js.map +1 -0
- package/src/utils/ids.d.ts +2 -0
- package/src/utils/ids.d.ts.map +1 -0
- package/src/utils/ids.js +5 -0
- package/src/utils/ids.js.map +1 -0
- package/src/utils/logger.d.ts +2 -0
- package/src/utils/logger.d.ts.map +1 -0
- package/src/utils/logger.js +5 -0
- package/src/utils/logger.js.map +1 -0
- package/src/utils/timestamps.d.ts +2 -0
- package/src/utils/timestamps.d.ts.map +1 -0
- package/src/utils/timestamps.js +4 -0
- package/src/utils/timestamps.js.map +1 -0
- package/src/validation/agent.d.ts +276 -0
- package/src/validation/agent.d.ts.map +1 -0
- package/src/validation/agent.js +94 -0
- package/src/validation/agent.js.map +1 -0
- package/src/validation/agents.d.ts +2 -0
- package/src/validation/agents.d.ts.map +1 -0
- package/src/validation/agents.js +3 -0
- package/src/validation/agents.js.map +1 -0
- package/src/validation/errors.d.ts +23 -0
- package/src/validation/errors.d.ts.map +1 -0
- package/src/validation/errors.js +33 -0
- package/src/validation/errors.js.map +1 -0
- package/src/validation/execution.d.ts +83 -0
- package/src/validation/execution.d.ts.map +1 -0
- package/src/validation/execution.js +23 -0
- package/src/validation/execution.js.map +1 -0
- package/src/validation/index.d.ts +8 -0
- package/src/validation/index.d.ts.map +1 -0
- package/src/validation/index.js +8 -0
- package/src/validation/index.js.map +1 -0
- package/src/validation/mcp.d.ts +43 -0
- package/src/validation/mcp.d.ts.map +1 -0
- package/src/validation/mcp.js +28 -0
- package/src/validation/mcp.js.map +1 -0
- package/src/validation/message.d.ts +46 -0
- package/src/validation/message.d.ts.map +1 -0
- package/src/validation/message.js +23 -0
- package/src/validation/message.js.map +1 -0
- package/src/validation/session.d.ts +49 -0
- package/src/validation/session.d.ts.map +1 -0
- package/src/validation/session.js +34 -0
- package/src/validation/session.js.map +1 -0
- package/src/validation/task.d.ts +94 -0
- package/src/validation/task.d.ts.map +1 -0
- package/src/validation/task.js +60 -0
- package/src/validation/task.js.map +1 -0
- package/src/validation/tasks.d.ts +2 -0
- package/src/validation/tasks.d.ts.map +1 -0
- package/src/validation/tasks.js +3 -0
- package/src/validation/tasks.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/db/schema.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMtB,CAAC;AAKH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBxB,CAAC;AAKH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAexB,CAAC;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBrB,CAAC;AAKH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoB1B,CAAC"}
|
package/src/db/schema.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
2
|
+
// ──────────────────────────────────────────────
|
|
3
|
+
// agents
|
|
4
|
+
// ──────────────────────────────────────────────
|
|
5
|
+
export const agentsTable = sqliteTable("agents", {
|
|
6
|
+
name: text("name").primaryKey(),
|
|
7
|
+
version: integer("version").notNull().default(1),
|
|
8
|
+
data: text("data").notNull(), // JSON blob: AgentDefinition
|
|
9
|
+
createdAt: text("created_at").notNull(),
|
|
10
|
+
updatedAt: text("updated_at").notNull(),
|
|
11
|
+
});
|
|
12
|
+
// ──────────────────────────────────────────────
|
|
13
|
+
// sessions
|
|
14
|
+
// ──────────────────────────────────────────────
|
|
15
|
+
export const sessionsTable = sqliteTable("sessions", {
|
|
16
|
+
id: text("id").primaryKey(),
|
|
17
|
+
agentName: text("agent_name")
|
|
18
|
+
.notNull()
|
|
19
|
+
.references(() => agentsTable.name, {
|
|
20
|
+
onDelete: "cascade"
|
|
21
|
+
}),
|
|
22
|
+
agentVersion: integer("agent_version").notNull(),
|
|
23
|
+
// Full JSON snapshot of AgentDefinition at session creation time.
|
|
24
|
+
// Not exposed in the public Session type — accessed only via
|
|
25
|
+
// SessionStore.getAgentDefinition(sessionId).
|
|
26
|
+
agentData: text("agent_data").notNull(),
|
|
27
|
+
status: text("status", {
|
|
28
|
+
enum: ["active", "closed"]
|
|
29
|
+
}).notNull().default("active"),
|
|
30
|
+
createdAt: text("created_at").notNull(),
|
|
31
|
+
updatedAt: text("updated_at").notNull(),
|
|
32
|
+
closedAt: text("closed_at"),
|
|
33
|
+
});
|
|
34
|
+
// ──────────────────────────────────────────────
|
|
35
|
+
// messages
|
|
36
|
+
// ──────────────────────────────────────────────
|
|
37
|
+
export const messagesTable = sqliteTable("messages", {
|
|
38
|
+
id: text("id").primaryKey(),
|
|
39
|
+
sessionId: text("session_id")
|
|
40
|
+
.notNull()
|
|
41
|
+
.references(() => sessionsTable.id, {
|
|
42
|
+
onDelete: "cascade"
|
|
43
|
+
}),
|
|
44
|
+
role: text("role", {
|
|
45
|
+
enum: ["system", "user", "assistant", "tool"]
|
|
46
|
+
}).notNull(),
|
|
47
|
+
content: text("content"),
|
|
48
|
+
// JSON blobs for tool call / result payloads
|
|
49
|
+
toolCalls: text("tool_calls"),
|
|
50
|
+
toolResults: text("tool_results"),
|
|
51
|
+
createdAt: text("created_at").notNull(),
|
|
52
|
+
});
|
|
53
|
+
// ──────────────────────────────────────────────
|
|
54
|
+
// tasks
|
|
55
|
+
// ──────────────────────────────────────────────
|
|
56
|
+
export const tasksTable = sqliteTable("tasks", {
|
|
57
|
+
id: text("id").primaryKey(),
|
|
58
|
+
sessionId: text("session_id")
|
|
59
|
+
.notNull()
|
|
60
|
+
.references(() => sessionsTable.id, {
|
|
61
|
+
onDelete: "cascade"
|
|
62
|
+
}),
|
|
63
|
+
parentTaskId: text("parent_task_id"),
|
|
64
|
+
recursionDepth: integer("recursion_depth").notNull().default(0),
|
|
65
|
+
status: text("status", {
|
|
66
|
+
enum: ["pending", "running", "completed", "failed", "cancelled"]
|
|
67
|
+
}).notNull().default("pending"),
|
|
68
|
+
prompt: text("prompt").notNull(),
|
|
69
|
+
result: text("result"),
|
|
70
|
+
error: text("error"),
|
|
71
|
+
createdAt: text("created_at").notNull(),
|
|
72
|
+
updatedAt: text("updated_at").notNull(),
|
|
73
|
+
completedAt: text("completed_at"),
|
|
74
|
+
cancelledAt: text("cancelled_at"),
|
|
75
|
+
});
|
|
76
|
+
// ──────────────────────────────────────────────
|
|
77
|
+
// task_events
|
|
78
|
+
// ──────────────────────────────────────────────
|
|
79
|
+
export const taskEventsTable = sqliteTable("task_events", {
|
|
80
|
+
id: text("id").primaryKey(),
|
|
81
|
+
taskId: text("task_id")
|
|
82
|
+
.notNull()
|
|
83
|
+
.references(() => tasksTable.id, {
|
|
84
|
+
onDelete: "cascade"
|
|
85
|
+
}),
|
|
86
|
+
type: text("type", {
|
|
87
|
+
enum: [
|
|
88
|
+
"MODEL_REQUEST",
|
|
89
|
+
"MODEL_RESPONSE",
|
|
90
|
+
"TOOL_CALL",
|
|
91
|
+
"TOOL_RESULT",
|
|
92
|
+
"TASK_COMPLETED",
|
|
93
|
+
"TASK_FAILED",
|
|
94
|
+
"TASK_CANCELLED"
|
|
95
|
+
]
|
|
96
|
+
}).notNull(),
|
|
97
|
+
payload: text("payload"), // JSON
|
|
98
|
+
createdAt: text("created_at").notNull(),
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/db/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { LLMProvider } from "../providers/types.js";
|
|
2
|
+
import type { ExecutionContext, Message } from "../validation/index.js";
|
|
3
|
+
import type { McpClientRegistry } from "../clients/registry.js";
|
|
4
|
+
import type { PolicyEngine } from "./policy.js";
|
|
5
|
+
import type { TaskStore } from "../store/task-store.js";
|
|
6
|
+
import type { SessionStore } from "../store/session-store.js";
|
|
7
|
+
export interface OrchestratorRunInput {
|
|
8
|
+
executionContext: ExecutionContext;
|
|
9
|
+
messages: Message[];
|
|
10
|
+
registry: McpClientRegistry;
|
|
11
|
+
provider: LLMProvider;
|
|
12
|
+
policy: PolicyEngine;
|
|
13
|
+
taskStore: TaskStore;
|
|
14
|
+
sessionStore: SessionStore;
|
|
15
|
+
signal: AbortSignal;
|
|
16
|
+
taskId: string;
|
|
17
|
+
}
|
|
18
|
+
export interface OrchestratorRunResult {
|
|
19
|
+
result: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class Orchestrator {
|
|
22
|
+
run(input: OrchestratorRunInput): Promise<OrchestratorRunResult>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +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;AAKxE,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;CAClB;AAED,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACf,GAAG,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CA2SzE"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { logger } from "../logger.js";
|
|
2
|
+
import { ToolError } from "../validation/errors.js";
|
|
3
|
+
import { generateId } from "../utils/ids.js";
|
|
4
|
+
import { nowIso } from "../utils/timestamps.js";
|
|
5
|
+
export class Orchestrator {
|
|
6
|
+
async run(input) {
|
|
7
|
+
const { executionContext, registry, provider, policy, taskStore, sessionStore, signal, taskId, } = input;
|
|
8
|
+
// Working copy of messages — we append to this as the loop progresses
|
|
9
|
+
const currentMessages = [...input.messages];
|
|
10
|
+
try {
|
|
11
|
+
// Mark task as running
|
|
12
|
+
taskStore.updateStatus(taskId, "running");
|
|
13
|
+
let finalContent = "";
|
|
14
|
+
// Tool-use loop — break on "completed" stop reason, throw on cancellation/policy
|
|
15
|
+
let looping = true;
|
|
16
|
+
while (looping) {
|
|
17
|
+
// Check for cancellation at the top of each iteration
|
|
18
|
+
if (signal.aborted) {
|
|
19
|
+
throw new ToolError("PROVIDER_ERROR", "Task was cancelled");
|
|
20
|
+
}
|
|
21
|
+
// Compose per-iteration signal: task cancellation OR provider timeout
|
|
22
|
+
const composedSignal = AbortSignal.any([
|
|
23
|
+
signal,
|
|
24
|
+
AbortSignal.timeout(executionContext.agentDefinition.provider.timeoutMs ?? 60_000),
|
|
25
|
+
]);
|
|
26
|
+
// Gather available tools from the registry
|
|
27
|
+
const tools = await registry.listAllTools();
|
|
28
|
+
// Emit MODEL_REQUEST event
|
|
29
|
+
taskStore.appendEvent({
|
|
30
|
+
taskId,
|
|
31
|
+
type: "MODEL_REQUEST",
|
|
32
|
+
payload: { messageCount: currentMessages.length, toolCount: tools.length },
|
|
33
|
+
});
|
|
34
|
+
logger.debug({
|
|
35
|
+
taskId,
|
|
36
|
+
sessionId: executionContext.sessionId,
|
|
37
|
+
agentName: executionContext.agentName,
|
|
38
|
+
messageCount: currentMessages.length,
|
|
39
|
+
}, "MODEL_REQUEST");
|
|
40
|
+
// Call the LLM provider
|
|
41
|
+
let providerResponse;
|
|
42
|
+
try {
|
|
43
|
+
providerResponse = await provider.chat({
|
|
44
|
+
messages: currentMessages,
|
|
45
|
+
tools: tools.length > 0 ? tools : undefined,
|
|
46
|
+
signal: composedSignal,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (signal.aborted) {
|
|
51
|
+
throw new ToolError("PROVIDER_ERROR", "Task was cancelled during provider call");
|
|
52
|
+
}
|
|
53
|
+
if (composedSignal.aborted ||
|
|
54
|
+
(error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError"))) {
|
|
55
|
+
const ms = executionContext.agentDefinition.provider.timeoutMs ?? 60_000;
|
|
56
|
+
throw new ToolError("PROVIDER_ERROR", `Provider call timed out after ${ms}ms. Increase timeoutMs on the agent's provider config.`);
|
|
57
|
+
}
|
|
58
|
+
throw new ToolError("PROVIDER_ERROR", `Provider call failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
59
|
+
}
|
|
60
|
+
const assistantMessage = {
|
|
61
|
+
...providerResponse.message,
|
|
62
|
+
sessionId: executionContext.sessionId,
|
|
63
|
+
};
|
|
64
|
+
// Persist and append the assistant message
|
|
65
|
+
await sessionStore.appendMessage(executionContext.sessionId, assistantMessage);
|
|
66
|
+
currentMessages.push(assistantMessage);
|
|
67
|
+
// Emit MODEL_RESPONSE event
|
|
68
|
+
taskStore.appendEvent({
|
|
69
|
+
taskId,
|
|
70
|
+
type: "MODEL_RESPONSE",
|
|
71
|
+
payload: {
|
|
72
|
+
stopReason: providerResponse.stopReason,
|
|
73
|
+
hasContent: !!assistantMessage.content,
|
|
74
|
+
toolCallCount: assistantMessage.toolCalls?.length ?? 0,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
logger.debug({
|
|
78
|
+
taskId,
|
|
79
|
+
agentName: executionContext.agentName,
|
|
80
|
+
stopReason: providerResponse.stopReason,
|
|
81
|
+
}, "MODEL_RESPONSE");
|
|
82
|
+
if (providerResponse.stopReason === "completed") {
|
|
83
|
+
finalContent = assistantMessage.content ?? "";
|
|
84
|
+
looping = false;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// Process tool calls
|
|
88
|
+
const toolCalls = assistantMessage.toolCalls ?? [];
|
|
89
|
+
for (const toolCall of toolCalls) {
|
|
90
|
+
// Check for cancellation before each tool call
|
|
91
|
+
if (signal.aborted) {
|
|
92
|
+
throw new ToolError("PROVIDER_ERROR", "Task was cancelled before tool call");
|
|
93
|
+
}
|
|
94
|
+
const qualifiedToolName = `${toolCall.server}__${toolCall.tool}`;
|
|
95
|
+
// Policy check before executing the tool
|
|
96
|
+
policy.check({
|
|
97
|
+
executionContext,
|
|
98
|
+
targetTool: qualifiedToolName,
|
|
99
|
+
targetAgentName: qualifiedToolName === "agent-mcp__agent"
|
|
100
|
+
? toolCall.arguments?.name
|
|
101
|
+
: undefined,
|
|
102
|
+
});
|
|
103
|
+
// Emit TOOL_CALL event
|
|
104
|
+
taskStore.appendEvent({
|
|
105
|
+
taskId,
|
|
106
|
+
type: "TOOL_CALL",
|
|
107
|
+
payload: {
|
|
108
|
+
tool: qualifiedToolName,
|
|
109
|
+
callId: toolCall.id,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
logger.info({
|
|
113
|
+
taskId,
|
|
114
|
+
agentName: executionContext.agentName,
|
|
115
|
+
tool: qualifiedToolName,
|
|
116
|
+
callId: toolCall.id,
|
|
117
|
+
}, "TOOL_CALL");
|
|
118
|
+
let toolResult;
|
|
119
|
+
let isError = false;
|
|
120
|
+
try {
|
|
121
|
+
const client = await registry.getClient(toolCall.server);
|
|
122
|
+
toolResult = await client.callTool(toolCall.tool, toolCall.arguments);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
isError = true;
|
|
126
|
+
toolResult = error instanceof Error ? error.message : String(error);
|
|
127
|
+
logger.warn({
|
|
128
|
+
taskId,
|
|
129
|
+
tool: qualifiedToolName,
|
|
130
|
+
error: toolResult,
|
|
131
|
+
}, "TOOL_RESULT error");
|
|
132
|
+
// Re-throw policy violations and cancellation — these are fatal
|
|
133
|
+
if (error instanceof ToolError) {
|
|
134
|
+
const fatalCodes = [
|
|
135
|
+
"MAX_DEPTH_EXCEEDED",
|
|
136
|
+
"MAX_TOOL_LOOPS_EXCEEDED",
|
|
137
|
+
"DELEGATION_NOT_ALLOWED",
|
|
138
|
+
];
|
|
139
|
+
if (fatalCodes.includes(error.code)) {
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Emit TOOL_RESULT event
|
|
145
|
+
taskStore.appendEvent({
|
|
146
|
+
taskId,
|
|
147
|
+
type: "TOOL_RESULT",
|
|
148
|
+
payload: {
|
|
149
|
+
callId: toolCall.id,
|
|
150
|
+
tool: qualifiedToolName,
|
|
151
|
+
isError,
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
logger.debug({
|
|
155
|
+
taskId,
|
|
156
|
+
tool: qualifiedToolName,
|
|
157
|
+
isError,
|
|
158
|
+
}, "TOOL_RESULT");
|
|
159
|
+
// Append tool result message
|
|
160
|
+
const toolResultMessage = {
|
|
161
|
+
id: generateId(),
|
|
162
|
+
sessionId: executionContext.sessionId,
|
|
163
|
+
role: "tool",
|
|
164
|
+
toolResults: [
|
|
165
|
+
{
|
|
166
|
+
toolCallId: toolCall.id,
|
|
167
|
+
result: toolResult,
|
|
168
|
+
isError,
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
createdAt: nowIso(),
|
|
172
|
+
};
|
|
173
|
+
await sessionStore.appendMessage(executionContext.sessionId, toolResultMessage);
|
|
174
|
+
currentMessages.push(toolResultMessage);
|
|
175
|
+
// Increment toolCallCount AFTER the result is appended
|
|
176
|
+
// so the next policy check sees the updated value
|
|
177
|
+
executionContext.toolCallCount++;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Task completed successfully
|
|
181
|
+
taskStore.updateStatus(taskId, "completed", {
|
|
182
|
+
result: finalContent,
|
|
183
|
+
completedAt: nowIso(),
|
|
184
|
+
});
|
|
185
|
+
taskStore.appendEvent({
|
|
186
|
+
taskId,
|
|
187
|
+
type: "TASK_COMPLETED",
|
|
188
|
+
payload: { result: finalContent },
|
|
189
|
+
});
|
|
190
|
+
logger.info({ taskId, agentName: executionContext.agentName }, "TASK_COMPLETED");
|
|
191
|
+
return { result: finalContent };
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
// Determine if this is a cancellation or a real failure
|
|
195
|
+
const isCancelled = signal.aborted ||
|
|
196
|
+
(error instanceof ToolError && error.code === "PROVIDER_ERROR" && error.message.includes("cancelled"));
|
|
197
|
+
if (isCancelled) {
|
|
198
|
+
// Status update handled by TaskStore.cancel() in most cases;
|
|
199
|
+
// update here only if not already cancelled
|
|
200
|
+
try {
|
|
201
|
+
taskStore.updateStatus(taskId, "cancelled", {
|
|
202
|
+
cancelledAt: nowIso(),
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// already cancelled — ignore
|
|
207
|
+
}
|
|
208
|
+
taskStore.appendEvent({ taskId, type: "TASK_CANCELLED" });
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
212
|
+
taskStore.updateStatus(taskId, "failed", {
|
|
213
|
+
error: errorMessage,
|
|
214
|
+
});
|
|
215
|
+
taskStore.appendEvent({
|
|
216
|
+
taskId,
|
|
217
|
+
type: "TASK_FAILED",
|
|
218
|
+
payload: { error: errorMessage },
|
|
219
|
+
});
|
|
220
|
+
logger.error({ taskId, agentName: executionContext.agentName, error }, "TASK_FAILED");
|
|
221
|
+
}
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
// Per-task registry teardown — always runs
|
|
226
|
+
await registry.closeAll();
|
|
227
|
+
taskStore.unregisterCancellation(taskId);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ExecutionContext } from "../validation/index.js";
|
|
2
|
+
export interface PolicyConfig {
|
|
3
|
+
/** Absolute maximum recursion depth. Agent definitions cannot exceed this. */
|
|
4
|
+
serverMaxDepth: number;
|
|
5
|
+
/** Absolute maximum tool call loops per task. Agent definitions cannot exceed this. */
|
|
6
|
+
serverMaxToolLoops: number;
|
|
7
|
+
/**
|
|
8
|
+
* Server-level allowed agents allowlist.
|
|
9
|
+
* - undefined → unrestricted (any agent may be called)
|
|
10
|
+
* - string[] → only agents in this list may be called
|
|
11
|
+
* Per-agent allowedAgents takes full precedence over this when defined.
|
|
12
|
+
*/
|
|
13
|
+
serverAllowedAgents?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface PolicyCheckInput {
|
|
16
|
+
executionContext: ExecutionContext;
|
|
17
|
+
/**
|
|
18
|
+
* The fully-qualified tool name being invoked: "<server>__<tool>".
|
|
19
|
+
* The allowedAgents check only applies when this is "agent-mcp__agent".
|
|
20
|
+
*/
|
|
21
|
+
targetTool: string;
|
|
22
|
+
/**
|
|
23
|
+
* When targetTool === "agent-mcp__agent", the name of the target agent.
|
|
24
|
+
* Used for the allowedAgents check (#3).
|
|
25
|
+
*/
|
|
26
|
+
targetAgentName?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* PolicyEngine enforces the three SPEC §9 safety invariants:
|
|
30
|
+
*
|
|
31
|
+
* 1. Recursion depth limit
|
|
32
|
+
* 2. Tool call loop limit
|
|
33
|
+
* 3. AllowedAgents list (per-agent override takes full precedence over server default)
|
|
34
|
+
*
|
|
35
|
+
* Throws ToolError on any violation. Does not mutate state.
|
|
36
|
+
*/
|
|
37
|
+
export declare class PolicyEngine {
|
|
38
|
+
private readonly config;
|
|
39
|
+
constructor(config: PolicyConfig);
|
|
40
|
+
check(input: PolicyCheckInput): void;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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;AAG/D,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;CAClC;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;AAED;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAEjD,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;CAkDvC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ToolError } from "../validation/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* PolicyEngine enforces the three SPEC §9 safety invariants:
|
|
4
|
+
*
|
|
5
|
+
* 1. Recursion depth limit
|
|
6
|
+
* 2. Tool call loop limit
|
|
7
|
+
* 3. AllowedAgents list (per-agent override takes full precedence over server default)
|
|
8
|
+
*
|
|
9
|
+
* Throws ToolError on any violation. Does not mutate state.
|
|
10
|
+
*/
|
|
11
|
+
export class PolicyEngine {
|
|
12
|
+
config;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
check(input) {
|
|
17
|
+
const { executionContext, targetTool, targetAgentName } = input;
|
|
18
|
+
const callingAgent = executionContext.agentDefinition;
|
|
19
|
+
// ── Check 1: Recursion depth ──────────────────────────────────────
|
|
20
|
+
const effectiveMaxDepth = Math.min(callingAgent.maxToolLoops ?? this.config.serverMaxDepth, this.config.serverMaxDepth);
|
|
21
|
+
if (executionContext.recursionDepth >= effectiveMaxDepth) {
|
|
22
|
+
throw new ToolError("MAX_DEPTH_EXCEEDED", `Recursion depth ${executionContext.recursionDepth} has reached or exceeded the maximum of ${effectiveMaxDepth}`);
|
|
23
|
+
}
|
|
24
|
+
// ── Check 2: Tool call loop limit ─────────────────────────────────
|
|
25
|
+
const effectiveMaxToolLoops = Math.min(callingAgent.maxToolLoops ?? this.config.serverMaxToolLoops, this.config.serverMaxToolLoops);
|
|
26
|
+
if (executionContext.toolCallCount >= effectiveMaxToolLoops) {
|
|
27
|
+
throw new ToolError("MAX_TOOL_LOOPS_EXCEEDED", `Tool call count ${executionContext.toolCallCount} has reached or exceeded the maximum of ${effectiveMaxToolLoops}`);
|
|
28
|
+
}
|
|
29
|
+
// ── Check 3: AllowedAgents (only for agent delegation) ────────────
|
|
30
|
+
if (targetTool === "agent-mcp__agent" && targetAgentName !== undefined) {
|
|
31
|
+
// Per-agent allowedAgents takes FULL precedence over server default.
|
|
32
|
+
const agentAllowedAgents = callingAgent.permissions.allowedAgents;
|
|
33
|
+
const effectiveAllowedAgents = agentAllowedAgents !== undefined
|
|
34
|
+
? agentAllowedAgents // agent-level: always wins
|
|
35
|
+
: this.config.serverAllowedAgents; // fall back to server default
|
|
36
|
+
// If effectiveAllowedAgents is undefined → unrestricted
|
|
37
|
+
if (effectiveAllowedAgents !== undefined) {
|
|
38
|
+
if (!effectiveAllowedAgents.includes(targetAgentName)) {
|
|
39
|
+
throw new ToolError("DELEGATION_NOT_ALLOWED", `Agent '${executionContext.agentName}' is not allowed to delegate to '${targetAgentName}'`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AA8BpD;;;;;;;;GAQG;AACH,MAAM,OAAO,YAAY;IACQ;IAA7B,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAErD,KAAK,CAAC,KAAuB;QACzB,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;QAChE,MAAM,YAAY,GAAG,gBAAgB,CAAC,eAAe,CAAC;QAEtD,qEAAqE;QACrE,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAC9B,YAAY,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EACvD,IAAI,CAAC,MAAM,CAAC,cAAc,CAC7B,CAAC;QAEF,IAAI,gBAAgB,CAAC,cAAc,IAAI,iBAAiB,EAAE,CAAC;YACvD,MAAM,IAAI,SAAS,CACf,oBAAoB,EACpB,mBAAmB,gBAAgB,CAAC,cAAc,2CAA2C,iBAAiB,EAAE,CACnH,CAAC;QACN,CAAC;QAED,qEAAqE;QACrE,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAClC,YAAY,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAC3D,IAAI,CAAC,MAAM,CAAC,kBAAkB,CACjC,CAAC;QAEF,IAAI,gBAAgB,CAAC,aAAa,IAAI,qBAAqB,EAAE,CAAC;YAC1D,MAAM,IAAI,SAAS,CACf,yBAAyB,EACzB,mBAAmB,gBAAgB,CAAC,aAAa,2CAA2C,qBAAqB,EAAE,CACtH,CAAC;QACN,CAAC;QAED,qEAAqE;QACrE,IAAI,UAAU,KAAK,kBAAkB,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YACrE,qEAAqE;YACrE,MAAM,kBAAkB,GAAG,YAAY,CAAC,WAAW,CAAC,aAAa,CAAC;YAClE,MAAM,sBAAsB,GACxB,kBAAkB,KAAK,SAAS;gBAC5B,CAAC,CAAC,kBAAkB,CAAS,2BAA2B;gBACxD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,8BAA8B;YAEzE,wDAAwD;YACxD,IAAI,sBAAsB,KAAK,SAAS,EAAE,CAAC;gBACvC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;oBACpD,MAAM,IAAI,SAAS,CACf,wBAAwB,EACxB,UAAU,gBAAgB,CAAC,SAAS,oCAAoC,eAAe,GAAG,CAC7F,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type BackgroundTaskFn = () => Promise<void>;
|
|
2
|
+
/**
|
|
3
|
+
* BackgroundQueue wraps p-queue to run async tasks with concurrency limiting.
|
|
4
|
+
*
|
|
5
|
+
* TaskStore is NOT a dependency of BackgroundQueue's constructor — it is
|
|
6
|
+
* injected into each enqueue call to avoid circular dependencies. The queue
|
|
7
|
+
* only knows how to run tasks; the caller controls persistence.
|
|
8
|
+
*/
|
|
9
|
+
export declare class BackgroundQueue {
|
|
10
|
+
private readonly queue;
|
|
11
|
+
constructor(concurrency?: number);
|
|
12
|
+
/**
|
|
13
|
+
* Enqueue a background task.
|
|
14
|
+
*
|
|
15
|
+
* The task function is responsible for calling
|
|
16
|
+
* `taskStore.updateStatus(taskId, ...)` on completion or failure.
|
|
17
|
+
* The orchestrator handles this internally via try/catch/finally.
|
|
18
|
+
*/
|
|
19
|
+
enqueue(taskId: string, runFn: BackgroundTaskFn): void;
|
|
20
|
+
get pending(): number;
|
|
21
|
+
get size(): number;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/queue.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnD;;;;;;GAMG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,WAAW,CAAC,EAAE,MAAM;IAQhC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAetD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;CACJ"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import PQueue from "p-queue";
|
|
2
|
+
import { logger } from "../logger.js";
|
|
3
|
+
/**
|
|
4
|
+
* BackgroundQueue wraps p-queue to run async tasks with concurrency limiting.
|
|
5
|
+
*
|
|
6
|
+
* TaskStore is NOT a dependency of BackgroundQueue's constructor — it is
|
|
7
|
+
* injected into each enqueue call to avoid circular dependencies. The queue
|
|
8
|
+
* only knows how to run tasks; the caller controls persistence.
|
|
9
|
+
*/
|
|
10
|
+
export class BackgroundQueue {
|
|
11
|
+
queue;
|
|
12
|
+
constructor(concurrency) {
|
|
13
|
+
const resolvedConcurrency = concurrency ??
|
|
14
|
+
parseInt(process.env["QUEUE_CONCURRENCY"] ?? "5", 10);
|
|
15
|
+
this.queue = new PQueue({ concurrency: resolvedConcurrency });
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Enqueue a background task.
|
|
19
|
+
*
|
|
20
|
+
* The task function is responsible for calling
|
|
21
|
+
* `taskStore.updateStatus(taskId, ...)` on completion or failure.
|
|
22
|
+
* The orchestrator handles this internally via try/catch/finally.
|
|
23
|
+
*/
|
|
24
|
+
enqueue(taskId, runFn) {
|
|
25
|
+
this.queue.add(async () => {
|
|
26
|
+
logger.debug({ taskId }, "Background task dequeued");
|
|
27
|
+
try {
|
|
28
|
+
await runFn();
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
// The orchestrator's try/catch already updates the task status.
|
|
32
|
+
// Log here for observability, but don't rethrow (would crash the queue).
|
|
33
|
+
logger.error({ taskId, error }, "Background task failed");
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
logger.debug({ taskId, pending: this.queue.pending, size: this.queue.size }, "Background task enqueued");
|
|
37
|
+
}
|
|
38
|
+
get pending() {
|
|
39
|
+
return this.queue.pending;
|
|
40
|
+
}
|
|
41
|
+
get size() {
|
|
42
|
+
return this.queue.size;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../../../../packages/ai/agent-mcp/src/engine/queue.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IACP,KAAK,CAAS;IAE/B,YAAY,WAAoB;QAC5B,MAAM,mBAAmB,GACrB,WAAW;YACX,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAE1D,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAClE,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,MAAc,EAAE,KAAuB;QAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACrD,IAAI,CAAC;gBACD,MAAM,KAAK,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,gEAAgE;gBAChE,yEAAyE;gBACzE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAC9D,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,0BAA0B,CAAC,CAAC;IAC7G,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAC3B,CAAC;CACJ"}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/ai/agent-mcp/src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "dotenv/config";
|
|
3
|
+
import { db } from "./db/client.js";
|
|
4
|
+
import { runMigrations } from "./db/migrate.js";
|
|
5
|
+
import { logger } from "./logger.js";
|
|
6
|
+
import { AgentStore, SessionStore, TaskStore } from "./store/index.js";
|
|
7
|
+
import { BackgroundQueue } from "./engine/queue.js";
|
|
8
|
+
import { Orchestrator } from "./engine/orchestrator.js";
|
|
9
|
+
import { PolicyEngine } from "./engine/policy.js";
|
|
10
|
+
import { startServer } from "./server.js";
|
|
11
|
+
async function main() {
|
|
12
|
+
// Run DB migrations synchronously before advertising tools
|
|
13
|
+
runMigrations();
|
|
14
|
+
// Instantiate stores
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
+
const dbAny = db;
|
|
17
|
+
const agentStore = new AgentStore(dbAny);
|
|
18
|
+
const sessionStore = new SessionStore(dbAny);
|
|
19
|
+
const taskStore = new TaskStore(dbAny);
|
|
20
|
+
// Instantiate engine components
|
|
21
|
+
const queue = new BackgroundQueue();
|
|
22
|
+
const orchestrator = new Orchestrator();
|
|
23
|
+
const policy = new PolicyEngine({
|
|
24
|
+
serverMaxDepth: parseInt(process.env["MAX_DEPTH"] ?? "5", 10),
|
|
25
|
+
serverMaxToolLoops: parseInt(process.env["MAX_TOOL_LOOPS"] ?? "10", 10),
|
|
26
|
+
serverAllowedAgents: process.env["ALLOWED_AGENTS"]
|
|
27
|
+
?.split(",")
|
|
28
|
+
.map(s => s.trim())
|
|
29
|
+
.filter(Boolean),
|
|
30
|
+
});
|
|
31
|
+
const { close } = await startServer({
|
|
32
|
+
agentStore,
|
|
33
|
+
sessionStore,
|
|
34
|
+
taskStore,
|
|
35
|
+
queue,
|
|
36
|
+
orchestrator,
|
|
37
|
+
policy,
|
|
38
|
+
});
|
|
39
|
+
const shutdown = async (signal) => {
|
|
40
|
+
logger.info({ signal }, "Server shutdown");
|
|
41
|
+
await close();
|
|
42
|
+
process.exit(0);
|
|
43
|
+
};
|
|
44
|
+
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
45
|
+
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
46
|
+
}
|
|
47
|
+
main().catch(err => {
|
|
48
|
+
logger.fatal({ err }, "Fatal startup error");
|
|
49
|
+
process.exit(1);
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +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;IACzC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7C,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;KACT,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"}
|
package/src/logger.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import pino from "pino";
|
|
2
|
+
/**
|
|
3
|
+
* Application logger.
|
|
4
|
+
*
|
|
5
|
+
* CRITICAL: All output goes to fd 2 (stderr).
|
|
6
|
+
* When TRANSPORT=stdio, stdout is the MCP JSON-RPC stream — any write
|
|
7
|
+
* to stdout would corrupt the framing. Never use console.log or pino's
|
|
8
|
+
* default stdout destination.
|
|
9
|
+
*/
|
|
10
|
+
export declare const logger: pino.Logger<never, boolean>;
|
|
11
|
+
//# sourceMappingURL=logger.d.ts.map
|