@brainpilot/runtime 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/dist/agent-factory.d.ts +26 -0
- package/dist/agent-factory.d.ts.map +1 -0
- package/dist/agent-factory.js +90 -0
- package/dist/agent-factory.js.map +1 -0
- package/dist/event-bus.d.ts +23 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +64 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/events.d.ts +41 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +119 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/mailbox.d.ts +31 -0
- package/dist/mailbox.d.ts.map +1 -0
- package/dist/mailbox.js +99 -0
- package/dist/mailbox.js.map +1 -0
- package/dist/mas-agent.d.ts +65 -0
- package/dist/mas-agent.d.ts.map +1 -0
- package/dist/mas-agent.js +244 -0
- package/dist/mas-agent.js.map +1 -0
- package/dist/mcp-bridge.d.ts +51 -0
- package/dist/mcp-bridge.d.ts.map +1 -0
- package/dist/mcp-bridge.js +120 -0
- package/dist/mcp-bridge.js.map +1 -0
- package/dist/mock-agent.d.ts +37 -0
- package/dist/mock-agent.d.ts.map +1 -0
- package/dist/mock-agent.js +123 -0
- package/dist/mock-agent.js.map +1 -0
- package/dist/pi-provider.d.ts +25 -0
- package/dist/pi-provider.d.ts.map +1 -0
- package/dist/pi-provider.js +132 -0
- package/dist/pi-provider.js.map +1 -0
- package/dist/server.d.ts +30 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/dist/session-manager.d.ts +82 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +365 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/tools/system-tools.d.ts +44 -0
- package/dist/tools/system-tools.d.ts.map +1 -0
- package/dist/tools/system-tools.js +225 -0
- package/dist/tools/system-tools.js.map +1 -0
- package/dist/trace.d.ts +35 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +105 -0
- package/dist/trace.js.map +1 -0
- package/dist/types.d.ts +159 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MasAgent — wraps one Pi (or mock) AgentSession.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - Own the agent's authoritative `status` (idle/running/error/stopped) — §10.
|
|
6
|
+
* - Translate Pi events → AG-UI events (§6) onto the session EventBus.
|
|
7
|
+
* - Per-agent error isolation (§7 L2): a thrown prompt never escapes; it is
|
|
8
|
+
* converted to RUN_ERROR + system_message and the agent goes to `error`.
|
|
9
|
+
* - Map Pi `auto_retry_start/end` → agent_status_update + system_message;
|
|
10
|
+
* suppress internal events (turn_*, compaction_*).
|
|
11
|
+
* - Event-driven hooks (§8): track reply/trace/delegate per turn.
|
|
12
|
+
*/
|
|
13
|
+
import type { AgUiEvent, AgentState } from "@brainpilot/protocol";
|
|
14
|
+
import type { EventBus } from "./event-bus.js";
|
|
15
|
+
import type { AgentRole, IAgentSession } from "./types.js";
|
|
16
|
+
export type AgentStatus = "idle" | "running" | "error" | "stopped";
|
|
17
|
+
export interface MasAgentOpts {
|
|
18
|
+
sessionId: string;
|
|
19
|
+
name: string;
|
|
20
|
+
role: AgentRole;
|
|
21
|
+
session: IAgentSession;
|
|
22
|
+
bus: EventBus;
|
|
23
|
+
onStatusChange?: (name: string, status: AgentStatus) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare class MasAgent {
|
|
26
|
+
private readonly opts;
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly role: AgentRole;
|
|
29
|
+
private readonly sessionId;
|
|
30
|
+
private readonly session;
|
|
31
|
+
private readonly bus;
|
|
32
|
+
private readonly unsubscribe;
|
|
33
|
+
private _status;
|
|
34
|
+
private currentRunId;
|
|
35
|
+
private currentMessageId;
|
|
36
|
+
private inReasoning;
|
|
37
|
+
private activeToolExecutions;
|
|
38
|
+
private lastError;
|
|
39
|
+
private trackers;
|
|
40
|
+
constructor(opts: MasAgentOpts);
|
|
41
|
+
get status(): AgentStatus;
|
|
42
|
+
/** §10 authoritative state snapshot. */
|
|
43
|
+
state(): AgentState;
|
|
44
|
+
private setStatus;
|
|
45
|
+
/**
|
|
46
|
+
* Send a prompt and stream events. Error-isolated (§7 L2): never throws.
|
|
47
|
+
*/
|
|
48
|
+
prompt(text: string): Promise<void>;
|
|
49
|
+
abort(): Promise<void>;
|
|
50
|
+
stop(): void;
|
|
51
|
+
private recordError;
|
|
52
|
+
private resetTrackers;
|
|
53
|
+
/** Translate one Pi event into zero or more AG-UI events (§6). */
|
|
54
|
+
private onPiEvent;
|
|
55
|
+
private onAssistantDelta;
|
|
56
|
+
private onToolResult;
|
|
57
|
+
/** Expose tracker state (for hook tests). */
|
|
58
|
+
getTrackers(): {
|
|
59
|
+
replied: boolean;
|
|
60
|
+
traced: boolean;
|
|
61
|
+
delegated: boolean;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export type { AgUiEvent };
|
|
65
|
+
//# sourceMappingURL=mas-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mas-agent.d.ts","sourceRoot":"","sources":["../src/mas-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EAGd,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,QAAQ,CAAC;IACd,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC9D;AAED,qBAAa,QAAQ;IAkBP,OAAO,CAAC,QAAQ,CAAC,IAAI;IAjBjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,SAAS,CAA0B;IAG3C,OAAO,CAAC,QAAQ,CAAuD;gBAE1C,IAAI,EAAE,YAAY;IAS/C,IAAI,MAAM,IAAI,WAAW,CAExB;IAED,wCAAwC;IACxC,KAAK,IAAI,UAAU;IAQnB,OAAO,CAAC,SAAS;IAajB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,IAAI,IAAI,IAAI;IAMZ,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,aAAa;IAIrB,kEAAkE;IAClE,OAAO,CAAC,SAAS;IAuGjB,OAAO,CAAC,gBAAgB;IAiCxB,OAAO,CAAC,YAAY;IAOpB,6CAA6C;IAC7C,WAAW,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE;CAGzE;AAYD,YAAY,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { ev, newMessageId, newRunId } from "./events.js";
|
|
2
|
+
export class MasAgent {
|
|
3
|
+
opts;
|
|
4
|
+
name;
|
|
5
|
+
role;
|
|
6
|
+
sessionId;
|
|
7
|
+
session;
|
|
8
|
+
bus;
|
|
9
|
+
unsubscribe;
|
|
10
|
+
_status = "idle";
|
|
11
|
+
currentRunId;
|
|
12
|
+
currentMessageId;
|
|
13
|
+
inReasoning = false;
|
|
14
|
+
activeToolExecutions = new Set();
|
|
15
|
+
lastError;
|
|
16
|
+
// §8 hook trackers (reset each turn).
|
|
17
|
+
trackers = { replied: false, traced: false, delegated: false };
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
this.opts = opts;
|
|
20
|
+
this.name = opts.name;
|
|
21
|
+
this.role = opts.role;
|
|
22
|
+
this.sessionId = opts.sessionId;
|
|
23
|
+
this.session = opts.session;
|
|
24
|
+
this.bus = opts.bus;
|
|
25
|
+
this.unsubscribe = this.session.subscribe((e) => this.onPiEvent(e));
|
|
26
|
+
}
|
|
27
|
+
get status() {
|
|
28
|
+
return this._status;
|
|
29
|
+
}
|
|
30
|
+
/** §10 authoritative state snapshot. */
|
|
31
|
+
state() {
|
|
32
|
+
const s = { name: this.name, status: this._status };
|
|
33
|
+
if (this.currentRunId)
|
|
34
|
+
s.activeRunId = this.currentRunId;
|
|
35
|
+
if (this.activeToolExecutions.size)
|
|
36
|
+
s.activeToolExecutions = [...this.activeToolExecutions];
|
|
37
|
+
if (this.lastError)
|
|
38
|
+
s.lastError = this.lastError;
|
|
39
|
+
return s;
|
|
40
|
+
}
|
|
41
|
+
setStatus(status) {
|
|
42
|
+
if (this._status === status)
|
|
43
|
+
return;
|
|
44
|
+
this._status = status;
|
|
45
|
+
this.opts.onStatusChange?.(this.name, status);
|
|
46
|
+
this.bus.emit(ev.agentStatusUpdate({ sessionId: this.sessionId, runId: this.currentRunId }, this.name, status, {
|
|
47
|
+
activeRunId: this.currentRunId,
|
|
48
|
+
activeToolExecutions: [...this.activeToolExecutions],
|
|
49
|
+
lastError: this.lastError,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Send a prompt and stream events. Error-isolated (§7 L2): never throws.
|
|
54
|
+
*/
|
|
55
|
+
async prompt(text) {
|
|
56
|
+
this.currentRunId = newRunId();
|
|
57
|
+
this.resetTrackers();
|
|
58
|
+
this.setStatus("running");
|
|
59
|
+
this.bus.emit(ev.runStarted({ sessionId: this.sessionId, agentName: this.name, runId: this.currentRunId }));
|
|
60
|
+
try {
|
|
61
|
+
await this.session.prompt(text);
|
|
62
|
+
this.bus.emit(ev.runFinished({ sessionId: this.sessionId, agentName: this.name, runId: this.currentRunId }));
|
|
63
|
+
if (this._status !== "error")
|
|
64
|
+
this.setStatus("idle");
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const message = err?.message ?? String(err);
|
|
68
|
+
this.recordError(message, err?.stack);
|
|
69
|
+
this.bus.emit(ev.runError({ sessionId: this.sessionId, agentName: this.name, runId: this.currentRunId }, message));
|
|
70
|
+
this.setStatus("error");
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
this.currentRunId = undefined;
|
|
74
|
+
this.currentMessageId = undefined;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async abort() {
|
|
78
|
+
try {
|
|
79
|
+
await this.session.abort();
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
/* abort best-effort */
|
|
83
|
+
}
|
|
84
|
+
this.activeToolExecutions.clear();
|
|
85
|
+
this.setStatus("idle");
|
|
86
|
+
}
|
|
87
|
+
stop() {
|
|
88
|
+
this.unsubscribe();
|
|
89
|
+
this.session.dispose();
|
|
90
|
+
this.setStatus("stopped");
|
|
91
|
+
}
|
|
92
|
+
recordError(message, details) {
|
|
93
|
+
const prev = this.lastError?.consecutiveCount ?? 0;
|
|
94
|
+
this.lastError = { message, timestamp: new Date().toISOString(), consecutiveCount: prev + 1 };
|
|
95
|
+
this.bus.emit(ev.systemMessage(this.sessionId, "error", `⚠️ Agent ${this.name} 遇到错误: ${message}`, {
|
|
96
|
+
agent: this.name,
|
|
97
|
+
details,
|
|
98
|
+
recoverable: true,
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
resetTrackers() {
|
|
102
|
+
this.trackers = { replied: false, traced: false, delegated: false };
|
|
103
|
+
}
|
|
104
|
+
/** Translate one Pi event into zero or more AG-UI events (§6). */
|
|
105
|
+
onPiEvent(e) {
|
|
106
|
+
const ctx = { sessionId: this.sessionId, agentName: this.name, runId: this.currentRunId };
|
|
107
|
+
switch (e.type) {
|
|
108
|
+
case "agent_start":
|
|
109
|
+
case "turn_end":
|
|
110
|
+
case "agent_end":
|
|
111
|
+
case "compaction_start":
|
|
112
|
+
case "compaction_end":
|
|
113
|
+
case "queue_update":
|
|
114
|
+
// Internal / suppressed (§6 table: turn_*, compaction_* not exposed).
|
|
115
|
+
return;
|
|
116
|
+
case "turn_start":
|
|
117
|
+
this.resetTrackers();
|
|
118
|
+
return;
|
|
119
|
+
case "message_start": {
|
|
120
|
+
const msg = e;
|
|
121
|
+
if (msg.message?.role === "assistant") {
|
|
122
|
+
this.currentMessageId = newMessageId();
|
|
123
|
+
this.inReasoning = false;
|
|
124
|
+
this.bus.emit(ev.textMessageStart(ctx, this.currentMessageId));
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
case "message_update": {
|
|
129
|
+
const upd = e;
|
|
130
|
+
this.onAssistantDelta(ctx, upd.assistantMessageEvent);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
case "message_end": {
|
|
134
|
+
if (this.currentMessageId) {
|
|
135
|
+
if (this.inReasoning) {
|
|
136
|
+
this.bus.emit(ev.reasoningMessageEnd(ctx, this.currentMessageId));
|
|
137
|
+
this.inReasoning = false;
|
|
138
|
+
}
|
|
139
|
+
this.bus.emit(ev.textMessageEnd(ctx, this.currentMessageId));
|
|
140
|
+
this.currentMessageId = undefined;
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
case "tool_execution_start": {
|
|
145
|
+
const t = e;
|
|
146
|
+
this.activeToolExecutions.add(t.toolCallId);
|
|
147
|
+
this.bus.emit(ev.toolCallStart(ctx, t.toolCallId, t.toolName, this.currentMessageId));
|
|
148
|
+
const argsStr = safeStringify(t.args);
|
|
149
|
+
if (argsStr)
|
|
150
|
+
this.bus.emit(ev.toolCallArgs(ctx, t.toolCallId, argsStr));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
case "tool_execution_end": {
|
|
154
|
+
const t = e;
|
|
155
|
+
this.activeToolExecutions.delete(t.toolCallId);
|
|
156
|
+
this.bus.emit(ev.toolCallEnd(ctx, t.toolCallId));
|
|
157
|
+
const resultStr = typeof t.result === "string" ? t.result : safeStringify(t.result);
|
|
158
|
+
this.bus.emit(ev.toolCallResult(ctx, t.toolCallId, resultStr, t.isError));
|
|
159
|
+
// §8 hooks: mark replied/traced/delegated from tool results.
|
|
160
|
+
this.onToolResult(t.toolName, t.isError);
|
|
161
|
+
// §7 L1: surface tool errors as system_message.
|
|
162
|
+
if (t.isError) {
|
|
163
|
+
this.bus.emit(ev.systemMessage(this.sessionId, "warning", `❌ ${t.toolName} 执行失败`, {
|
|
164
|
+
agent: this.name,
|
|
165
|
+
details: resultStr,
|
|
166
|
+
recoverable: true,
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
case "auto_retry_start": {
|
|
172
|
+
const r = e;
|
|
173
|
+
this.bus.emit(ev.systemMessage(this.sessionId, "warning", `⏳ Agent ${this.name} 遇到 API 错误,正在自动重试 (${r.attempt}/${r.maxAttempts}),${r.delayMs / 1000}秒后重试...`, { agent: this.name, recoverable: true }));
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
case "auto_retry_end": {
|
|
177
|
+
const r = e;
|
|
178
|
+
if (!r.success) {
|
|
179
|
+
this.recordError(r.finalError ?? "retry exhausted");
|
|
180
|
+
this.setStatus("error");
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
default:
|
|
185
|
+
return; // unknown / future Pi events: ignore.
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
onAssistantDelta(ctx, amsg) {
|
|
189
|
+
if (!this.currentMessageId) {
|
|
190
|
+
this.currentMessageId = newMessageId();
|
|
191
|
+
this.bus.emit(ev.textMessageStart(ctx, this.currentMessageId));
|
|
192
|
+
}
|
|
193
|
+
const id = this.currentMessageId;
|
|
194
|
+
switch (amsg.type) {
|
|
195
|
+
case "text_delta":
|
|
196
|
+
this.bus.emit(ev.textMessageContent(ctx, id, String(amsg.delta ?? "")));
|
|
197
|
+
return;
|
|
198
|
+
case "reasoning_start":
|
|
199
|
+
this.inReasoning = true;
|
|
200
|
+
this.bus.emit(ev.reasoningMessageStart(ctx, id));
|
|
201
|
+
return;
|
|
202
|
+
case "reasoning_delta":
|
|
203
|
+
if (!this.inReasoning) {
|
|
204
|
+
this.inReasoning = true;
|
|
205
|
+
this.bus.emit(ev.reasoningMessageStart(ctx, id));
|
|
206
|
+
}
|
|
207
|
+
this.bus.emit(ev.reasoningMessageContent(ctx, id, String(amsg.delta ?? "")));
|
|
208
|
+
return;
|
|
209
|
+
case "reasoning_end":
|
|
210
|
+
this.bus.emit(ev.reasoningMessageEnd(ctx, id));
|
|
211
|
+
this.inReasoning = false;
|
|
212
|
+
return;
|
|
213
|
+
default:
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
onToolResult(toolName, isError) {
|
|
218
|
+
if (isError)
|
|
219
|
+
return;
|
|
220
|
+
if (toolName === "send_message")
|
|
221
|
+
this.trackers.replied = true;
|
|
222
|
+
if (toolName === "record_trace" || toolName.startsWith("create_trace"))
|
|
223
|
+
this.trackers.traced = true;
|
|
224
|
+
if (toolName === "create_agent")
|
|
225
|
+
this.trackers.delegated = true;
|
|
226
|
+
}
|
|
227
|
+
/** Expose tracker state (for hook tests). */
|
|
228
|
+
getTrackers() {
|
|
229
|
+
return { ...this.trackers };
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function safeStringify(v) {
|
|
233
|
+
if (v === undefined || v === null)
|
|
234
|
+
return "";
|
|
235
|
+
if (typeof v === "string")
|
|
236
|
+
return v;
|
|
237
|
+
try {
|
|
238
|
+
return JSON.stringify(v);
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return String(v);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=mas-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mas-agent.js","sourceRoot":"","sources":["../src/mas-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { SystemTool } from "./types.js";
|
|
2
|
+
export interface McpServerSpec {
|
|
3
|
+
command: string;
|
|
4
|
+
args?: string[];
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface McpServersConfig {
|
|
8
|
+
mcpServers: Record<string, McpServerSpec>;
|
|
9
|
+
}
|
|
10
|
+
/** Minimal subset of `@modelcontextprotocol/sdk` Client we depend on. */
|
|
11
|
+
export interface McpClientLike {
|
|
12
|
+
listTools(): Promise<{
|
|
13
|
+
tools: McpToolDescriptor[];
|
|
14
|
+
}>;
|
|
15
|
+
callTool(args: {
|
|
16
|
+
name: string;
|
|
17
|
+
arguments: Record<string, unknown>;
|
|
18
|
+
}): Promise<McpCallResult>;
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface McpToolDescriptor {
|
|
22
|
+
name: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
inputSchema?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
export interface McpCallResult {
|
|
27
|
+
content?: unknown;
|
|
28
|
+
isError?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export type McpConnectFn = (name: string, spec: McpServerSpec) => Promise<McpClientLike>;
|
|
31
|
+
/**
|
|
32
|
+
* Load `mcp_servers.json` from the data root. Looks under `bp_template/` first
|
|
33
|
+
* (the user-editable global template, §11A.2), then `.bp/`. Returns null when
|
|
34
|
+
* absent — MCP is entirely opt-in and adds zero overhead when unconfigured.
|
|
35
|
+
*/
|
|
36
|
+
export declare function loadMcpServersConfig(dataRoot: string): Promise<McpServersConfig | null>;
|
|
37
|
+
/** Real connect: spawn a stdio MCP server and hand back a thin client. */
|
|
38
|
+
export declare const defaultMcpConnect: McpConnectFn;
|
|
39
|
+
export declare class McpBridge {
|
|
40
|
+
private readonly connect;
|
|
41
|
+
private clients;
|
|
42
|
+
private _tools;
|
|
43
|
+
constructor(connect?: McpConnectFn);
|
|
44
|
+
get tools(): SystemTool[];
|
|
45
|
+
/** Connect every server in the config and collect their tools. */
|
|
46
|
+
connectAll(cfg: McpServersConfig): Promise<SystemTool[]>;
|
|
47
|
+
private wrap;
|
|
48
|
+
/** Close every server connection (best-effort). */
|
|
49
|
+
close(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=mcp-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-bridge.d.ts","sourceRoot":"","sources":["../src/mcp-bridge.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC3C;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,SAAS,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;KAAE,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEzF;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAa7F;AAED,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,EAAE,YAe/B,CAAC;AAEF,qBAAa,SAAS;IAIR,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,MAAM,CAAoB;gBAEL,OAAO,GAAE,YAAgC;IAEtE,IAAI,KAAK,IAAI,UAAU,EAAE,CAExB;IAED,kEAAkE;IAC5D,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAe9D,OAAO,CAAC,IAAI;IAYZ,mDAAmD;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External MCP bridge (§9 decision 2).
|
|
3
|
+
*
|
|
4
|
+
* Pi 0.79 has NO built-in MCP — by design it pushes such workflows to custom
|
|
5
|
+
* tools (https://pi.dev/docs/latest/usage). So we bridge: read `mcp_servers.json`,
|
|
6
|
+
* connect each declared server with `@modelcontextprotocol/sdk`, `tools/list`,
|
|
7
|
+
* and expose every discovered MCP tool as a BrainPilot `SystemTool` (which the
|
|
8
|
+
* real agent factory then wraps with Pi's `defineTool`).
|
|
9
|
+
*
|
|
10
|
+
* Tools are namespaced `mcp__<server>__<tool>` to avoid cross-server collisions.
|
|
11
|
+
* A failing server is logged and skipped — it never aborts the others.
|
|
12
|
+
*
|
|
13
|
+
* Config shape (standard MCP/Claude format), stdio servers only:
|
|
14
|
+
* { "mcpServers": { "fs": { "command": "npx", "args": ["-y", "..."], "env": {} } } }
|
|
15
|
+
*/
|
|
16
|
+
import { readFile } from "node:fs/promises";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
/**
|
|
19
|
+
* Load `mcp_servers.json` from the data root. Looks under `bp_template/` first
|
|
20
|
+
* (the user-editable global template, §11A.2), then `.bp/`. Returns null when
|
|
21
|
+
* absent — MCP is entirely opt-in and adds zero overhead when unconfigured.
|
|
22
|
+
*/
|
|
23
|
+
export async function loadMcpServersConfig(dataRoot) {
|
|
24
|
+
for (const rel of [join("bp_template", "mcp_servers.json"), join(".bp", "mcp_servers.json")]) {
|
|
25
|
+
try {
|
|
26
|
+
const raw = await readFile(join(dataRoot, rel), "utf8");
|
|
27
|
+
const cfg = JSON.parse(raw);
|
|
28
|
+
if (cfg && typeof cfg === "object" && "mcpServers" in cfg) {
|
|
29
|
+
return cfg;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* not present / unreadable — try the next location */
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/** Real connect: spawn a stdio MCP server and hand back a thin client. */
|
|
39
|
+
export const defaultMcpConnect = async (name, spec) => {
|
|
40
|
+
const { Client } = await import("@modelcontextprotocol/sdk/client/index.js");
|
|
41
|
+
const { StdioClientTransport } = await import("@modelcontextprotocol/sdk/client/stdio.js");
|
|
42
|
+
const transport = new StdioClientTransport({
|
|
43
|
+
command: spec.command,
|
|
44
|
+
args: spec.args ?? [],
|
|
45
|
+
...(spec.env ? { env: spec.env } : {}),
|
|
46
|
+
});
|
|
47
|
+
const client = new Client({ name: `brainpilot-${name}`, version: "0.1.0" });
|
|
48
|
+
await client.connect(transport);
|
|
49
|
+
return {
|
|
50
|
+
listTools: () => client.listTools(),
|
|
51
|
+
callTool: (a) => client.callTool(a),
|
|
52
|
+
close: () => client.close(),
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export class McpBridge {
|
|
56
|
+
connect;
|
|
57
|
+
clients = [];
|
|
58
|
+
_tools = [];
|
|
59
|
+
constructor(connect = defaultMcpConnect) {
|
|
60
|
+
this.connect = connect;
|
|
61
|
+
}
|
|
62
|
+
get tools() {
|
|
63
|
+
return this._tools;
|
|
64
|
+
}
|
|
65
|
+
/** Connect every server in the config and collect their tools. */
|
|
66
|
+
async connectAll(cfg) {
|
|
67
|
+
for (const [name, spec] of Object.entries(cfg.mcpServers)) {
|
|
68
|
+
try {
|
|
69
|
+
const client = await this.connect(name, spec);
|
|
70
|
+
this.clients.push(client);
|
|
71
|
+
const { tools } = await client.listTools();
|
|
72
|
+
for (const t of tools)
|
|
73
|
+
this._tools.push(this.wrap(name, client, t));
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// eslint-disable-next-line no-console
|
|
77
|
+
console.error(`[mcp] server '${name}' failed to connect:`, err.message);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return this._tools;
|
|
81
|
+
}
|
|
82
|
+
wrap(server, client, t) {
|
|
83
|
+
return {
|
|
84
|
+
name: `mcp__${server}__${t.name}`,
|
|
85
|
+
description: t.description ?? `MCP tool '${t.name}' from server '${server}'`,
|
|
86
|
+
parameters: t.inputSchema ?? { type: "object", properties: {} },
|
|
87
|
+
execute: async (params) => {
|
|
88
|
+
const res = await client.callTool({ name: t.name, arguments: params });
|
|
89
|
+
return { content: normalizeContent(res.content), isError: res.isError === true };
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Close every server connection (best-effort). */
|
|
94
|
+
async close() {
|
|
95
|
+
await Promise.all(this.clients.map((c) => c.close().catch(() => { })));
|
|
96
|
+
this.clients = [];
|
|
97
|
+
this._tools = [];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Map an MCP tool-call `content` payload into our text-content shape. */
|
|
101
|
+
function normalizeContent(content) {
|
|
102
|
+
if (Array.isArray(content)) {
|
|
103
|
+
return content.map((item) => {
|
|
104
|
+
if (item && typeof item === "object" && item.type === "text") {
|
|
105
|
+
return { type: "text", text: String(item.text ?? "") };
|
|
106
|
+
}
|
|
107
|
+
return { type: "text", text: safe(item) };
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return [{ type: "text", text: typeof content === "string" ? content : safe(content) }];
|
|
111
|
+
}
|
|
112
|
+
function safe(v) {
|
|
113
|
+
try {
|
|
114
|
+
return JSON.stringify(v);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return String(v);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=mcp-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../src/mcp-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock AgentSession (BP_MOCK=1). Deterministic, no API calls.
|
|
3
|
+
*
|
|
4
|
+
* Emits a scripted Pi event stream that exercises the SAME translator the real
|
|
5
|
+
* Pi session feeds (agent_start → message_start → message_update(text_delta)*
|
|
6
|
+
* → message_end → tool_execution_* (optional) → agent_end). This lets tests +
|
|
7
|
+
* CI cover the full orchestration path without burning quota.
|
|
8
|
+
*
|
|
9
|
+
* Prompt control protocol (so tests can drive behavior):
|
|
10
|
+
* - default: streams a short scripted assistant reply.
|
|
11
|
+
* - contains "[[tool:NAME {json}]]": invokes system tool NAME with parsed
|
|
12
|
+
* args and emits tool_execution_start/end around it.
|
|
13
|
+
* - contains "[[error]]": emits an agent-level failure (auto_retry then end).
|
|
14
|
+
*/
|
|
15
|
+
import type { IAgentSession, PiAgentEvent, SystemTool } from "./types.js";
|
|
16
|
+
export interface MockSessionConfig {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
agentName: string;
|
|
19
|
+
systemTools: SystemTool[];
|
|
20
|
+
/** Scripted assistant text (default: deterministic per agent). */
|
|
21
|
+
scriptText?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class MockAgentSession implements IAgentSession {
|
|
24
|
+
private readonly cfg;
|
|
25
|
+
readonly sessionId: string;
|
|
26
|
+
private readonly listeners;
|
|
27
|
+
private readonly toolMap;
|
|
28
|
+
private aborted;
|
|
29
|
+
private disposed;
|
|
30
|
+
constructor(cfg: MockSessionConfig);
|
|
31
|
+
subscribe(listener: (e: PiAgentEvent) => void): () => void;
|
|
32
|
+
private emit;
|
|
33
|
+
prompt(text: string): Promise<void>;
|
|
34
|
+
abort(): Promise<void>;
|
|
35
|
+
dispose(): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=mock-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-agent.d.ts","sourceRoot":"","sources":["../src/mock-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,qBAAa,gBAAiB,YAAW,aAAa;IAOxC,OAAO,CAAC,QAAQ,CAAC,GAAG;IANhC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEI,GAAG,EAAE,iBAAiB;IAKnD,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI;IAK1D,OAAO,CAAC,IAAI;IAUN,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgFnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,IAAI,IAAI;CAIhB"}
|