@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,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionManager — orchestration core + STATE AUTHORITY (§10).
|
|
3
|
+
*
|
|
4
|
+
* Owns all sessions. Each session owns its agents (MasAgent), Mailbox, trace
|
|
5
|
+
* (GraphOfTrace), and EventBus. The manager is the sole authority for agent
|
|
6
|
+
* status; it surfaces `GET /sessions/:id/agents`, `agent_status_update` SSE
|
|
7
|
+
* events, and feeds `/metrics`.
|
|
8
|
+
*
|
|
9
|
+
* Persistence (§5): config/history/state live under `<dataRoot>/.bp/{sid}/`,
|
|
10
|
+
* work files under `<dataRoot>/workspaces/{sid}/`.
|
|
11
|
+
*/
|
|
12
|
+
import { mkdir, readFile, writeFile, readdir, rm } from "node:fs/promises";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { randomUUID } from "node:crypto";
|
|
15
|
+
import { EventBus } from "./event-bus.js";
|
|
16
|
+
import { Mailbox } from "./mailbox.js";
|
|
17
|
+
import { GraphOfTrace } from "./trace.js";
|
|
18
|
+
import { MasAgent } from "./mas-agent.js";
|
|
19
|
+
import { systemToolsForRole, builtinToolNamesForRole } from "./tools/system-tools.js";
|
|
20
|
+
import { ev } from "./events.js";
|
|
21
|
+
import { selectFactory, isMockMode } from "./agent-factory.js";
|
|
22
|
+
import { McpBridge, loadMcpServersConfig } from "./mcp-bridge.js";
|
|
23
|
+
/** Roles inferred from agent name. */
|
|
24
|
+
function roleFor(name) {
|
|
25
|
+
if (name === "principal")
|
|
26
|
+
return "principal";
|
|
27
|
+
if (name === "trace")
|
|
28
|
+
return "trace";
|
|
29
|
+
return "expert";
|
|
30
|
+
}
|
|
31
|
+
export class SessionManager {
|
|
32
|
+
sessions = new Map();
|
|
33
|
+
dataRoot;
|
|
34
|
+
agentFactory;
|
|
35
|
+
persist;
|
|
36
|
+
lastActivityAt = 0;
|
|
37
|
+
// External MCP tools (§9 decision 2): loaded once, lazily, shared by all
|
|
38
|
+
// non-trace agents. Null until first agent is created.
|
|
39
|
+
mcpBridge;
|
|
40
|
+
mcpTools = [];
|
|
41
|
+
mcpLoaded = false;
|
|
42
|
+
constructor(opts = {}) {
|
|
43
|
+
this.dataRoot = opts.dataRoot ?? process.env.BP_DATA_DIR ?? join(process.cwd(), ".bp-data");
|
|
44
|
+
this.agentFactory = opts.agentFactory ?? selectFactory();
|
|
45
|
+
this.persist = opts.persist ?? true;
|
|
46
|
+
this.mcpBridge = opts.mcpBridge ?? null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load external MCP tools once. No-op in mock mode (BP_MOCK=1) and when no
|
|
50
|
+
* `mcp_servers.json` is present, so the default path stays zero-overhead.
|
|
51
|
+
*/
|
|
52
|
+
async ensureMcpTools() {
|
|
53
|
+
if (this.mcpLoaded)
|
|
54
|
+
return this.mcpTools;
|
|
55
|
+
this.mcpLoaded = true;
|
|
56
|
+
if (isMockMode() && !this.mcpBridge)
|
|
57
|
+
return this.mcpTools;
|
|
58
|
+
try {
|
|
59
|
+
const cfg = await loadMcpServersConfig(this.dataRoot);
|
|
60
|
+
if (!cfg)
|
|
61
|
+
return this.mcpTools;
|
|
62
|
+
if (!this.mcpBridge)
|
|
63
|
+
this.mcpBridge = new McpBridge();
|
|
64
|
+
this.mcpTools = await this.mcpBridge.connectAll(cfg);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
// eslint-disable-next-line no-console
|
|
68
|
+
console.error("[mcp] bridge load failed:", err.message);
|
|
69
|
+
}
|
|
70
|
+
return this.mcpTools;
|
|
71
|
+
}
|
|
72
|
+
bpDir(sid) {
|
|
73
|
+
return join(this.dataRoot, ".bp", sid);
|
|
74
|
+
}
|
|
75
|
+
workspaceDir(sid) {
|
|
76
|
+
return join(this.dataRoot, "workspaces", sid);
|
|
77
|
+
}
|
|
78
|
+
historyPath(sid, agent) {
|
|
79
|
+
return join(this.bpDir(sid), "history", `${agent}.jsonl`);
|
|
80
|
+
}
|
|
81
|
+
/* ---------------------------- session CRUD ---------------------------- */
|
|
82
|
+
async createSession(input = {}) {
|
|
83
|
+
const id = input.id ?? randomUUID();
|
|
84
|
+
if (this.sessions.has(id))
|
|
85
|
+
return this.toSession(this.sessions.get(id));
|
|
86
|
+
const nowIso = new Date().toISOString();
|
|
87
|
+
const persistBase = this.persist ? this.bpDir(id) : undefined;
|
|
88
|
+
const bus = new EventBus({ persistPath: persistBase ? join(persistBase, "events.jsonl") : undefined });
|
|
89
|
+
const mailbox = new Mailbox(id, persistBase ? join(persistBase, "mailbox") : undefined);
|
|
90
|
+
const trace = new GraphOfTrace(id, persistBase ? join(persistBase, "trace.json") : undefined);
|
|
91
|
+
const entry = {
|
|
92
|
+
id,
|
|
93
|
+
title: input.title ?? "Untitled session",
|
|
94
|
+
createdAt: nowIso,
|
|
95
|
+
updatedAt: nowIso,
|
|
96
|
+
lastActivityAt: Date.now(),
|
|
97
|
+
bus,
|
|
98
|
+
mailbox,
|
|
99
|
+
trace,
|
|
100
|
+
agents: new Map(),
|
|
101
|
+
tasks: new Map(),
|
|
102
|
+
runActive: false,
|
|
103
|
+
activeRunId: null,
|
|
104
|
+
};
|
|
105
|
+
this.sessions.set(id, entry);
|
|
106
|
+
this.touch(entry);
|
|
107
|
+
if (this.persist) {
|
|
108
|
+
await mkdir(join(this.bpDir(id), "history"), { recursive: true });
|
|
109
|
+
await mkdir(this.workspaceDir(id), { recursive: true });
|
|
110
|
+
await this.writeMeta(entry);
|
|
111
|
+
await mailbox.recover();
|
|
112
|
+
await this.loadTrace(entry);
|
|
113
|
+
}
|
|
114
|
+
return this.toSession(entry);
|
|
115
|
+
}
|
|
116
|
+
getSession(id) {
|
|
117
|
+
const e = this.sessions.get(id);
|
|
118
|
+
return e ? this.toSession(e) : undefined;
|
|
119
|
+
}
|
|
120
|
+
listSessions() {
|
|
121
|
+
return [...this.sessions.values()].map((e) => this.toSession(e));
|
|
122
|
+
}
|
|
123
|
+
async deleteSession(id) {
|
|
124
|
+
const e = this.sessions.get(id);
|
|
125
|
+
if (!e)
|
|
126
|
+
return false;
|
|
127
|
+
for (const a of e.agents.values())
|
|
128
|
+
a.stop();
|
|
129
|
+
e.bus.clear();
|
|
130
|
+
this.sessions.delete(id);
|
|
131
|
+
if (this.persist) {
|
|
132
|
+
await rm(this.bpDir(id), { recursive: true, force: true }).catch(() => { });
|
|
133
|
+
await rm(this.workspaceDir(id), { recursive: true, force: true }).catch(() => { });
|
|
134
|
+
}
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
/** Evict idle session: stop agents + drop from memory, KEEP disk (§修正2). */
|
|
138
|
+
async evictSession(id) {
|
|
139
|
+
const e = this.sessions.get(id);
|
|
140
|
+
if (!e)
|
|
141
|
+
return { evicted: false, agentsKilled: 0 };
|
|
142
|
+
let killed = 0;
|
|
143
|
+
for (const a of e.agents.values()) {
|
|
144
|
+
a.stop();
|
|
145
|
+
killed++;
|
|
146
|
+
}
|
|
147
|
+
await e.bus.flush();
|
|
148
|
+
await e.mailbox.flush();
|
|
149
|
+
await e.trace.flush();
|
|
150
|
+
e.bus.clear();
|
|
151
|
+
this.sessions.delete(id);
|
|
152
|
+
return { evicted: true, agentsKilled: killed };
|
|
153
|
+
}
|
|
154
|
+
/* ----------------------------- messaging ----------------------------- */
|
|
155
|
+
/** Send a user message to an agent (default principal). §7 L3 isolated. */
|
|
156
|
+
async sendMessage(sessionId, content, agentName = "principal") {
|
|
157
|
+
const entry = this.sessions.get(sessionId);
|
|
158
|
+
if (!entry)
|
|
159
|
+
throw new Error(`session not found: ${sessionId}`);
|
|
160
|
+
this.touch(entry);
|
|
161
|
+
const agent = await this.ensureAgent(sessionId, agentName);
|
|
162
|
+
entry.runActive = true;
|
|
163
|
+
entry.activeRunId = `run_${randomUUID()}`;
|
|
164
|
+
const runId = entry.activeRunId;
|
|
165
|
+
// Fire-and-track: don't block the HTTP response on the full run.
|
|
166
|
+
void agent
|
|
167
|
+
.prompt(content)
|
|
168
|
+
.catch((err) => {
|
|
169
|
+
entry.bus.emit(ev.systemMessage(sessionId, "error", `发送消息失败: ${err.message}`, { agent: agentName }));
|
|
170
|
+
})
|
|
171
|
+
.finally(() => {
|
|
172
|
+
entry.runActive = false;
|
|
173
|
+
entry.activeRunId = null;
|
|
174
|
+
this.touch(entry);
|
|
175
|
+
});
|
|
176
|
+
return { accepted: true, runId };
|
|
177
|
+
}
|
|
178
|
+
/** Interrupt a session (or a specific agent). */
|
|
179
|
+
async interrupt(sessionId, agentName) {
|
|
180
|
+
const entry = this.sessions.get(sessionId);
|
|
181
|
+
if (!entry)
|
|
182
|
+
return false;
|
|
183
|
+
const targets = agentName ? [entry.agents.get(agentName)].filter(Boolean) : [...entry.agents.values()];
|
|
184
|
+
for (const a of targets)
|
|
185
|
+
await a.abort();
|
|
186
|
+
entry.runActive = false;
|
|
187
|
+
entry.activeRunId = null;
|
|
188
|
+
return targets.length > 0;
|
|
189
|
+
}
|
|
190
|
+
/* ------------------------------ agents ------------------------------- */
|
|
191
|
+
/** Ensure an agent exists (create or resurrect). */
|
|
192
|
+
async ensureAgent(sessionId, name) {
|
|
193
|
+
const entry = this.sessions.get(sessionId);
|
|
194
|
+
if (!entry)
|
|
195
|
+
throw new Error(`session not found: ${sessionId}`);
|
|
196
|
+
const existing = entry.agents.get(name);
|
|
197
|
+
if (existing && existing.status !== "stopped")
|
|
198
|
+
return existing;
|
|
199
|
+
const role = roleFor(name);
|
|
200
|
+
const deps = {
|
|
201
|
+
sessionId,
|
|
202
|
+
fromAgent: name,
|
|
203
|
+
mailbox: entry.mailbox,
|
|
204
|
+
trace: entry.trace,
|
|
205
|
+
ensureAgent: async (target) => {
|
|
206
|
+
await this.ensureAgent(sessionId, target);
|
|
207
|
+
},
|
|
208
|
+
destroyAgent: async (target) => {
|
|
209
|
+
await this.destroyAgent(sessionId, target);
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
const systemTools = systemToolsForRole(role, name, deps);
|
|
213
|
+
// External MCP tools go to non-trace agents (trace agent is graph-only, §9).
|
|
214
|
+
const mcpTools = role === "trace" ? [] : await this.ensureMcpTools();
|
|
215
|
+
const agentTools = [...systemTools, ...mcpTools];
|
|
216
|
+
const builtins = builtinToolNamesForRole(role);
|
|
217
|
+
const allowedToolNames = [...builtins, ...agentTools.map((t) => t.name)];
|
|
218
|
+
const session = await this.agentFactory({
|
|
219
|
+
sessionId,
|
|
220
|
+
agentName: name,
|
|
221
|
+
role,
|
|
222
|
+
historyPath: this.historyPath(sessionId, name),
|
|
223
|
+
cwd: this.workspaceDir(sessionId),
|
|
224
|
+
systemTools: agentTools,
|
|
225
|
+
allowedToolNames,
|
|
226
|
+
systemPrompt: `You are the ${name} agent (${role}).`,
|
|
227
|
+
});
|
|
228
|
+
const agent = new MasAgent({
|
|
229
|
+
sessionId,
|
|
230
|
+
name,
|
|
231
|
+
role,
|
|
232
|
+
session,
|
|
233
|
+
bus: entry.bus,
|
|
234
|
+
onStatusChange: () => this.touch(entry),
|
|
235
|
+
});
|
|
236
|
+
entry.agents.set(name, agent);
|
|
237
|
+
if (!entry.tasks.has(name))
|
|
238
|
+
entry.tasks.set(name, "");
|
|
239
|
+
return agent;
|
|
240
|
+
}
|
|
241
|
+
async destroyAgent(sessionId, name) {
|
|
242
|
+
const entry = this.sessions.get(sessionId);
|
|
243
|
+
if (!entry)
|
|
244
|
+
return;
|
|
245
|
+
const agent = entry.agents.get(name);
|
|
246
|
+
if (!agent)
|
|
247
|
+
return;
|
|
248
|
+
agent.stop();
|
|
249
|
+
entry.agents.delete(name); // history on disk is kept (§5).
|
|
250
|
+
}
|
|
251
|
+
/* -------------------------- state authority -------------------------- */
|
|
252
|
+
/** §10 polling fallback: list agents with authoritative status. */
|
|
253
|
+
listAgents(sessionId) {
|
|
254
|
+
const entry = this.sessions.get(sessionId);
|
|
255
|
+
if (!entry)
|
|
256
|
+
return [];
|
|
257
|
+
return [...entry.agents.values()].map((a) => {
|
|
258
|
+
const st = a.state();
|
|
259
|
+
const out = {
|
|
260
|
+
name: a.name,
|
|
261
|
+
status: st.status,
|
|
262
|
+
task: entry.tasks.get(a.name) ?? "",
|
|
263
|
+
updatedAt: new Date().toISOString(),
|
|
264
|
+
alive: st.status !== "stopped",
|
|
265
|
+
};
|
|
266
|
+
return out;
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
getSessionState(sessionId) {
|
|
270
|
+
const entry = this.sessions.get(sessionId);
|
|
271
|
+
if (!entry)
|
|
272
|
+
return undefined;
|
|
273
|
+
return {
|
|
274
|
+
runState: { active: entry.runActive, runId: entry.activeRunId },
|
|
275
|
+
agents: this.listAgents(sessionId),
|
|
276
|
+
lastActivityTs: new Date(entry.lastActivityAt).toISOString(),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
metrics() {
|
|
280
|
+
let runningAgents = 0;
|
|
281
|
+
for (const e of this.sessions.values()) {
|
|
282
|
+
for (const a of e.agents.values())
|
|
283
|
+
if (a.status === "running")
|
|
284
|
+
runningAgents++;
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
activeSessions: this.sessions.size,
|
|
288
|
+
runningAgents,
|
|
289
|
+
lastActivityAt: this.lastActivityAt ? new Date(this.lastActivityAt).toISOString() : null,
|
|
290
|
+
memRss: process.memoryUsage().rss,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/* ----------------------------- SSE/events ---------------------------- */
|
|
294
|
+
subscribe(sessionId, listener) {
|
|
295
|
+
const entry = this.sessions.get(sessionId);
|
|
296
|
+
return entry?.bus.subscribe(listener);
|
|
297
|
+
}
|
|
298
|
+
recentEvents(sessionId) {
|
|
299
|
+
return this.sessions.get(sessionId)?.bus.recent() ?? [];
|
|
300
|
+
}
|
|
301
|
+
/* ----------------------------- shutdown ------------------------------ */
|
|
302
|
+
/** §7: flush all persisted state before exit. */
|
|
303
|
+
async emergencySaveAll() {
|
|
304
|
+
await Promise.all([...this.sessions.values()].flatMap((e) => [e.bus.flush(), e.mailbox.flush(), e.trace.flush(), this.writeMeta(e)]));
|
|
305
|
+
await this.mcpBridge?.close().catch(() => { });
|
|
306
|
+
}
|
|
307
|
+
/* ------------------------------ helpers ------------------------------ */
|
|
308
|
+
touch(entry) {
|
|
309
|
+
entry.lastActivityAt = Date.now();
|
|
310
|
+
entry.updatedAt = new Date().toISOString();
|
|
311
|
+
this.lastActivityAt = entry.lastActivityAt;
|
|
312
|
+
}
|
|
313
|
+
toSession(e) {
|
|
314
|
+
return { id: e.id, title: e.title, createdAt: e.createdAt, updatedAt: e.updatedAt };
|
|
315
|
+
}
|
|
316
|
+
async writeMeta(entry) {
|
|
317
|
+
if (!this.persist)
|
|
318
|
+
return;
|
|
319
|
+
const meta = {
|
|
320
|
+
id: entry.id,
|
|
321
|
+
title: entry.title,
|
|
322
|
+
createdAt: entry.createdAt,
|
|
323
|
+
updatedAt: entry.updatedAt,
|
|
324
|
+
lastActivityAt: entry.lastActivityAt,
|
|
325
|
+
};
|
|
326
|
+
await mkdir(this.bpDir(entry.id), { recursive: true }).catch(() => { });
|
|
327
|
+
await writeFile(join(this.bpDir(entry.id), "meta.json"), JSON.stringify(meta, null, 2), "utf8").catch(() => { });
|
|
328
|
+
}
|
|
329
|
+
async loadTrace(entry) {
|
|
330
|
+
try {
|
|
331
|
+
const raw = await readFile(join(this.bpDir(entry.id), "trace.json"), "utf8");
|
|
332
|
+
entry.trace.load(JSON.parse(raw));
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
/* no trace yet */
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/** Restore session list from disk (§10 策略A: agents start idle, lazily revived). */
|
|
339
|
+
async restoreFromDisk() {
|
|
340
|
+
const restored = [];
|
|
341
|
+
const root = join(this.dataRoot, ".bp");
|
|
342
|
+
let ids;
|
|
343
|
+
try {
|
|
344
|
+
ids = await readdir(root);
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
return restored;
|
|
348
|
+
}
|
|
349
|
+
for (const id of ids) {
|
|
350
|
+
try {
|
|
351
|
+
const raw = await readFile(join(root, id, "meta.json"), "utf8");
|
|
352
|
+
const meta = JSON.parse(raw);
|
|
353
|
+
if (!this.sessions.has(meta.id)) {
|
|
354
|
+
await this.createSession({ id: meta.id, title: meta.title });
|
|
355
|
+
restored.push(meta.id);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
/* skip non-session dirs */
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return restored;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BrainPilot system tools (§9 decision 1) — defined as plain `SystemTool`
|
|
3
|
+
* objects (name + JSON-schema params + execute closure). The real agent
|
|
4
|
+
* factory wraps these with Pi's `defineTool`; the mock invokes `execute`
|
|
5
|
+
* directly. Closures capture session context (mailbox, trace, manager).
|
|
6
|
+
*
|
|
7
|
+
* Per-agent access control (§9, ported from legacy `agent_tool_config`) is
|
|
8
|
+
* applied by `toolsForRole` — each role only receives its allowed tools.
|
|
9
|
+
*/
|
|
10
|
+
import type { AgentRole, SystemTool } from "../types.js";
|
|
11
|
+
import type { Mailbox } from "../mailbox.js";
|
|
12
|
+
import type { GraphOfTrace } from "../trace.js";
|
|
13
|
+
export interface ToolDeps {
|
|
14
|
+
sessionId: string;
|
|
15
|
+
fromAgent: string;
|
|
16
|
+
mailbox: Mailbox;
|
|
17
|
+
trace: GraphOfTrace;
|
|
18
|
+
/** Ensure an agent exists (auto-create/resurrect). */
|
|
19
|
+
ensureAgent: (name: string) => Promise<void>;
|
|
20
|
+
/** Destroy an agent (memory only; history kept). */
|
|
21
|
+
destroyAgent: (name: string) => Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare function createSendMessageTool(deps: ToolDeps): SystemTool;
|
|
24
|
+
export declare function createCreateAgentTool(deps: ToolDeps): SystemTool;
|
|
25
|
+
export declare function createDestroyAgentTool(deps: ToolDeps): SystemTool;
|
|
26
|
+
export declare function createRecordTraceTool(deps: ToolDeps): SystemTool;
|
|
27
|
+
export declare function createTraceNodeTool(deps: ToolDeps): SystemTool;
|
|
28
|
+
export declare function createUpdateTraceNodeTool(deps: ToolDeps): SystemTool;
|
|
29
|
+
export declare function createAddTraceRelationTool(deps: ToolDeps): SystemTool;
|
|
30
|
+
export declare function createGetTraceGraphTool(deps: ToolDeps): SystemTool;
|
|
31
|
+
/** All system tools, keyed by name. */
|
|
32
|
+
export declare function allSystemTools(deps: ToolDeps): Map<string, SystemTool>;
|
|
33
|
+
/**
|
|
34
|
+
* Per-agent system-tool access control (§9, ported from legacy
|
|
35
|
+
* `agent_tool_config`). Returns the system tools a role may use. Built-in Pi
|
|
36
|
+
* tools (read/bash/grep/...) are controlled separately via `builtinToolsForRole`.
|
|
37
|
+
*/
|
|
38
|
+
export declare const AGENT_TOOL_CONFIG: Record<string, string[]>;
|
|
39
|
+
/** Built-in Pi tool allowlist per role. */
|
|
40
|
+
export declare const BUILTIN_TOOL_CONFIG: Record<string, string[]>;
|
|
41
|
+
export declare function systemToolNamesForRole(role: AgentRole, agentName: string): string[];
|
|
42
|
+
export declare function builtinToolNamesForRole(role: AgentRole): string[];
|
|
43
|
+
export declare function systemToolsForRole(role: AgentRole, agentName: string, deps: ToolDeps): SystemTool[];
|
|
44
|
+
//# sourceMappingURL=system-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-tools.d.ts","sourceRoot":"","sources":["../../src/tools/system-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAW,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,sDAAsD;IACtD,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,oDAAoD;IACpD,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAMD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAsBhE;AAOD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAehE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAejE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CA0BhE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CA4B9D;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAwBpE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAwBrE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAOlE;AAED,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAYtE;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAMtD,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAKxD,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAMnF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAEjE;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,GACb,UAAU,EAAE,CAId"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
function ok(text) {
|
|
2
|
+
return { content: [{ type: "text", text }] };
|
|
3
|
+
}
|
|
4
|
+
export function createSendMessageTool(deps) {
|
|
5
|
+
return {
|
|
6
|
+
name: "send_message",
|
|
7
|
+
description: "Send a message to another agent (e.g. principal or an expert).",
|
|
8
|
+
parameters: {
|
|
9
|
+
type: "object",
|
|
10
|
+
properties: {
|
|
11
|
+
content: { type: "string", description: "Message body" },
|
|
12
|
+
to: { type: "string", description: "Target agent name", default: "principal" },
|
|
13
|
+
msg_type: { type: "string", enum: ["result_deliver", "task_delegate"] },
|
|
14
|
+
},
|
|
15
|
+
required: ["content"],
|
|
16
|
+
},
|
|
17
|
+
execute: async (params) => {
|
|
18
|
+
const to = params.to ?? "principal";
|
|
19
|
+
const content = String(params.content ?? "");
|
|
20
|
+
const msgType = params.msg_type ?? deriveMsgType(deps.fromAgent, to);
|
|
21
|
+
await deps.ensureAgent(to);
|
|
22
|
+
await deps.mailbox.write({ fromAgent: deps.fromAgent, toAgent: to, content, msgType });
|
|
23
|
+
return ok(`delivered to ${to}`);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function deriveMsgType(from, to) {
|
|
28
|
+
if (to === "principal")
|
|
29
|
+
return "result_deliver";
|
|
30
|
+
return "task_delegate";
|
|
31
|
+
}
|
|
32
|
+
export function createCreateAgentTool(deps) {
|
|
33
|
+
return {
|
|
34
|
+
name: "create_agent",
|
|
35
|
+
description: "Create (or resurrect) an expert agent by type.",
|
|
36
|
+
parameters: {
|
|
37
|
+
type: "object",
|
|
38
|
+
properties: { agent_type: { type: "string" } },
|
|
39
|
+
required: ["agent_type"],
|
|
40
|
+
},
|
|
41
|
+
execute: async (params) => {
|
|
42
|
+
const name = String(params.agent_type ?? "");
|
|
43
|
+
await deps.ensureAgent(name);
|
|
44
|
+
return ok(`agent ${name} ready`);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function createDestroyAgentTool(deps) {
|
|
49
|
+
return {
|
|
50
|
+
name: "destroy_agent",
|
|
51
|
+
description: "Destroy an expert agent (history preserved; can be revived).",
|
|
52
|
+
parameters: {
|
|
53
|
+
type: "object",
|
|
54
|
+
properties: { agent_type: { type: "string" } },
|
|
55
|
+
required: ["agent_type"],
|
|
56
|
+
},
|
|
57
|
+
execute: async (params) => {
|
|
58
|
+
const name = String(params.agent_type ?? "");
|
|
59
|
+
await deps.destroyAgent(name);
|
|
60
|
+
return ok(`agent ${name} destroyed`);
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function createRecordTraceTool(deps) {
|
|
65
|
+
return {
|
|
66
|
+
name: "record_trace",
|
|
67
|
+
description: "Record a reasoning/trace event into the Graph of Trace.",
|
|
68
|
+
parameters: {
|
|
69
|
+
type: "object",
|
|
70
|
+
properties: {
|
|
71
|
+
description: { type: "string" },
|
|
72
|
+
artifacts: { type: "array", items: { type: "string" } },
|
|
73
|
+
context: { type: "string" },
|
|
74
|
+
},
|
|
75
|
+
required: ["description"],
|
|
76
|
+
},
|
|
77
|
+
execute: async (params) => {
|
|
78
|
+
const node = deps.trace.createNode({
|
|
79
|
+
title: String(params.description ?? "trace"),
|
|
80
|
+
type: "trace",
|
|
81
|
+
status: "completed",
|
|
82
|
+
agent: deps.fromAgent,
|
|
83
|
+
description: String(params.description ?? ""),
|
|
84
|
+
content: String(params.context ?? ""),
|
|
85
|
+
artifacts: (params.artifacts ?? []).map((p) => ({ path: p })),
|
|
86
|
+
});
|
|
87
|
+
return ok(`trace recorded: ${node.id}`);
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function createTraceNodeTool(deps) {
|
|
92
|
+
return {
|
|
93
|
+
name: "create_trace_node",
|
|
94
|
+
description: "Create a node in the Graph of Trace.",
|
|
95
|
+
parameters: {
|
|
96
|
+
type: "object",
|
|
97
|
+
properties: {
|
|
98
|
+
title: { type: "string" },
|
|
99
|
+
type: { type: "string" },
|
|
100
|
+
status: { type: "string" },
|
|
101
|
+
description: { type: "string" },
|
|
102
|
+
parent_id: { type: "string" },
|
|
103
|
+
},
|
|
104
|
+
required: ["title"],
|
|
105
|
+
},
|
|
106
|
+
execute: async (params) => {
|
|
107
|
+
const parentId = params.parent_id ? String(params.parent_id) : undefined;
|
|
108
|
+
const node = deps.trace.createNode({
|
|
109
|
+
title: String(params.title ?? ""),
|
|
110
|
+
type: params.type ? String(params.type) : undefined,
|
|
111
|
+
status: params.status ? String(params.status) : undefined,
|
|
112
|
+
description: params.description ? String(params.description) : undefined,
|
|
113
|
+
agent: deps.fromAgent,
|
|
114
|
+
parents: parentId ? [{ id: parentId, relation: "parent" }] : undefined,
|
|
115
|
+
});
|
|
116
|
+
return ok(`node ${node.id} created`);
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export function createUpdateTraceNodeTool(deps) {
|
|
121
|
+
return {
|
|
122
|
+
name: "update_trace_node",
|
|
123
|
+
description: "Update fields of an existing trace node.",
|
|
124
|
+
parameters: {
|
|
125
|
+
type: "object",
|
|
126
|
+
properties: {
|
|
127
|
+
node_id: { type: "string" },
|
|
128
|
+
status: { type: "string" },
|
|
129
|
+
summary: { type: "string" },
|
|
130
|
+
content: { type: "string" },
|
|
131
|
+
},
|
|
132
|
+
required: ["node_id"],
|
|
133
|
+
},
|
|
134
|
+
execute: async (params) => {
|
|
135
|
+
const id = String(params.node_id ?? "");
|
|
136
|
+
const updates = {};
|
|
137
|
+
for (const k of ["status", "summary", "content", "title", "description"]) {
|
|
138
|
+
if (params[k] !== undefined)
|
|
139
|
+
updates[k] = params[k];
|
|
140
|
+
}
|
|
141
|
+
const node = deps.trace.updateNode(id, updates);
|
|
142
|
+
return node ? ok(`node ${id} updated`) : { ...ok(`node ${id} not found`), isError: true };
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
export function createAddTraceRelationTool(deps) {
|
|
147
|
+
return {
|
|
148
|
+
name: "add_trace_relation",
|
|
149
|
+
description: "Add a relation (edge) between two trace nodes.",
|
|
150
|
+
parameters: {
|
|
151
|
+
type: "object",
|
|
152
|
+
properties: {
|
|
153
|
+
from_id: { type: "string" },
|
|
154
|
+
to_id: { type: "string" },
|
|
155
|
+
explanation: { type: "string" },
|
|
156
|
+
},
|
|
157
|
+
required: ["from_id", "to_id", "explanation"],
|
|
158
|
+
},
|
|
159
|
+
execute: async (params) => {
|
|
160
|
+
const okEdge = deps.trace.addRelation(String(params.from_id ?? ""), String(params.to_id ?? ""), String(params.explanation ?? ""));
|
|
161
|
+
return okEdge
|
|
162
|
+
? ok("relation added")
|
|
163
|
+
: { ...ok("relation failed: node not found"), isError: true };
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
export function createGetTraceGraphTool(deps) {
|
|
168
|
+
return {
|
|
169
|
+
name: "get_trace_graph",
|
|
170
|
+
description: "Get the current Graph of Trace as JSON.",
|
|
171
|
+
parameters: { type: "object", properties: {} },
|
|
172
|
+
execute: async () => ok(JSON.stringify(deps.trace.getGraph())),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** All system tools, keyed by name. */
|
|
176
|
+
export function allSystemTools(deps) {
|
|
177
|
+
const tools = [
|
|
178
|
+
createSendMessageTool(deps),
|
|
179
|
+
createCreateAgentTool(deps),
|
|
180
|
+
createDestroyAgentTool(deps),
|
|
181
|
+
createRecordTraceTool(deps),
|
|
182
|
+
createTraceNodeTool(deps),
|
|
183
|
+
createUpdateTraceNodeTool(deps),
|
|
184
|
+
createAddTraceRelationTool(deps),
|
|
185
|
+
createGetTraceGraphTool(deps),
|
|
186
|
+
];
|
|
187
|
+
return new Map(tools.map((t) => [t.name, t]));
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Per-agent system-tool access control (§9, ported from legacy
|
|
191
|
+
* `agent_tool_config`). Returns the system tools a role may use. Built-in Pi
|
|
192
|
+
* tools (read/bash/grep/...) are controlled separately via `builtinToolsForRole`.
|
|
193
|
+
*/
|
|
194
|
+
export const AGENT_TOOL_CONFIG = {
|
|
195
|
+
principal: ["send_message", "create_agent", "destroy_agent", "record_trace"],
|
|
196
|
+
trace: ["create_trace_node", "update_trace_node", "add_trace_relation", "get_trace_graph"],
|
|
197
|
+
expert: ["send_message", "record_trace"],
|
|
198
|
+
// Default for any other expert-like agent.
|
|
199
|
+
_default: ["send_message", "record_trace"],
|
|
200
|
+
};
|
|
201
|
+
/** Built-in Pi tool allowlist per role. */
|
|
202
|
+
export const BUILTIN_TOOL_CONFIG = {
|
|
203
|
+
principal: [],
|
|
204
|
+
trace: ["read"],
|
|
205
|
+
expert: ["read", "grep", "find"],
|
|
206
|
+
_default: ["read", "grep", "find"],
|
|
207
|
+
};
|
|
208
|
+
export function systemToolNamesForRole(role, agentName) {
|
|
209
|
+
// `trace` agent keyed by role; principal by role; experts share `_default`
|
|
210
|
+
// unless a named override exists.
|
|
211
|
+
if (role === "principal")
|
|
212
|
+
return AGENT_TOOL_CONFIG.principal;
|
|
213
|
+
if (role === "trace")
|
|
214
|
+
return AGENT_TOOL_CONFIG.trace;
|
|
215
|
+
return AGENT_TOOL_CONFIG[agentName] ?? AGENT_TOOL_CONFIG.expert ?? AGENT_TOOL_CONFIG._default;
|
|
216
|
+
}
|
|
217
|
+
export function builtinToolNamesForRole(role) {
|
|
218
|
+
return BUILTIN_TOOL_CONFIG[role] ?? BUILTIN_TOOL_CONFIG._default;
|
|
219
|
+
}
|
|
220
|
+
export function systemToolsForRole(role, agentName, deps) {
|
|
221
|
+
const allowed = new Set(systemToolNamesForRole(role, agentName));
|
|
222
|
+
const all = allSystemTools(deps);
|
|
223
|
+
return [...allowed].map((n) => all.get(n)).filter((t) => !!t);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=system-tools.js.map
|