@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.
Files changed (57) hide show
  1. package/dist/agent-factory.d.ts +26 -0
  2. package/dist/agent-factory.d.ts.map +1 -0
  3. package/dist/agent-factory.js +90 -0
  4. package/dist/agent-factory.js.map +1 -0
  5. package/dist/event-bus.d.ts +23 -0
  6. package/dist/event-bus.d.ts.map +1 -0
  7. package/dist/event-bus.js +64 -0
  8. package/dist/event-bus.js.map +1 -0
  9. package/dist/events.d.ts +41 -0
  10. package/dist/events.d.ts.map +1 -0
  11. package/dist/events.js +119 -0
  12. package/dist/events.js.map +1 -0
  13. package/dist/index.d.ts +26 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +19 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/mailbox.d.ts +31 -0
  18. package/dist/mailbox.d.ts.map +1 -0
  19. package/dist/mailbox.js +99 -0
  20. package/dist/mailbox.js.map +1 -0
  21. package/dist/mas-agent.d.ts +65 -0
  22. package/dist/mas-agent.d.ts.map +1 -0
  23. package/dist/mas-agent.js +244 -0
  24. package/dist/mas-agent.js.map +1 -0
  25. package/dist/mcp-bridge.d.ts +51 -0
  26. package/dist/mcp-bridge.d.ts.map +1 -0
  27. package/dist/mcp-bridge.js +120 -0
  28. package/dist/mcp-bridge.js.map +1 -0
  29. package/dist/mock-agent.d.ts +37 -0
  30. package/dist/mock-agent.d.ts.map +1 -0
  31. package/dist/mock-agent.js +123 -0
  32. package/dist/mock-agent.js.map +1 -0
  33. package/dist/pi-provider.d.ts +25 -0
  34. package/dist/pi-provider.d.ts.map +1 -0
  35. package/dist/pi-provider.js +132 -0
  36. package/dist/pi-provider.js.map +1 -0
  37. package/dist/server.d.ts +30 -0
  38. package/dist/server.d.ts.map +1 -0
  39. package/dist/server.js +149 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/session-manager.d.ts +82 -0
  42. package/dist/session-manager.d.ts.map +1 -0
  43. package/dist/session-manager.js +365 -0
  44. package/dist/session-manager.js.map +1 -0
  45. package/dist/tools/system-tools.d.ts +44 -0
  46. package/dist/tools/system-tools.d.ts.map +1 -0
  47. package/dist/tools/system-tools.js +225 -0
  48. package/dist/tools/system-tools.js.map +1 -0
  49. package/dist/trace.d.ts +35 -0
  50. package/dist/trace.d.ts.map +1 -0
  51. package/dist/trace.js +105 -0
  52. package/dist/trace.js.map +1 -0
  53. package/dist/types.d.ts +159 -0
  54. package/dist/types.d.ts.map +1 -0
  55. package/dist/types.js +2 -0
  56. package/dist/types.js.map +1 -0
  57. package/package.json +40 -0
@@ -0,0 +1,123 @@
1
+ const TOOL_RE = /\[\[tool:([a-zA-Z_]+)\s*(\{.*?\})?\]\]/;
2
+ export class MockAgentSession {
3
+ cfg;
4
+ sessionId;
5
+ listeners = new Set();
6
+ toolMap;
7
+ aborted = false;
8
+ disposed = false;
9
+ constructor(cfg) {
10
+ this.cfg = cfg;
11
+ this.sessionId = cfg.sessionId;
12
+ this.toolMap = new Map(cfg.systemTools.map((t) => [t.name, t]));
13
+ }
14
+ subscribe(listener) {
15
+ this.listeners.add(listener);
16
+ return () => this.listeners.delete(listener);
17
+ }
18
+ emit(e) {
19
+ for (const l of this.listeners) {
20
+ try {
21
+ l(e);
22
+ }
23
+ catch {
24
+ /* isolate */
25
+ }
26
+ }
27
+ }
28
+ async prompt(text) {
29
+ if (this.disposed)
30
+ return;
31
+ this.aborted = false;
32
+ this.emit({ type: "agent_start" });
33
+ this.emit({ type: "turn_start" });
34
+ if (text.includes("[[error]]")) {
35
+ this.emit({
36
+ type: "auto_retry_start",
37
+ attempt: 1,
38
+ maxAttempts: 3,
39
+ delayMs: 0,
40
+ errorMessage: "mock API error",
41
+ });
42
+ this.emit({ type: "auto_retry_end", success: false, attempt: 1, finalError: "mock API error" });
43
+ this.emit({ type: "agent_end", messages: [], willRetry: false });
44
+ return;
45
+ }
46
+ // Stream a short assistant message.
47
+ const msg = { role: "assistant", content: [] };
48
+ this.emit({ type: "message_start", message: { ...msg } });
49
+ const script = this.cfg.scriptText ?? `mock reply from ${this.cfg.agentName}`;
50
+ for (const chunk of script.match(/.{1,8}/g) ?? [script]) {
51
+ if (this.aborted)
52
+ break;
53
+ this.emit({
54
+ type: "message_update",
55
+ message: { ...msg },
56
+ assistantMessageEvent: { type: "text_delta", delta: chunk },
57
+ });
58
+ }
59
+ this.emit({
60
+ type: "message_end",
61
+ message: { role: "assistant", content: [{ type: "text", text: script }] },
62
+ });
63
+ // Optional tool invocation driven by the prompt.
64
+ const m = TOOL_RE.exec(text);
65
+ if (m && !this.aborted) {
66
+ const toolName = m[1];
67
+ const args = m[2] ? safeJson(m[2]) : {};
68
+ const tool = this.toolMap.get(toolName);
69
+ const toolCallId = `tc_${toolName}_${Date.now()}`;
70
+ this.emit({ type: "tool_execution_start", toolCallId, toolName, args });
71
+ if (tool) {
72
+ try {
73
+ const res = await tool.execute(args);
74
+ const textOut = res.content.map((c) => c.text).join("");
75
+ this.emit({
76
+ type: "tool_execution_end",
77
+ toolCallId,
78
+ toolName,
79
+ result: textOut,
80
+ isError: res.isError ?? false,
81
+ });
82
+ }
83
+ catch (err) {
84
+ this.emit({
85
+ type: "tool_execution_end",
86
+ toolCallId,
87
+ toolName,
88
+ result: String(err.message),
89
+ isError: true,
90
+ });
91
+ }
92
+ }
93
+ else {
94
+ // Tool not available to this agent (access-controlled away).
95
+ this.emit({
96
+ type: "tool_execution_end",
97
+ toolCallId,
98
+ toolName,
99
+ result: `tool ${toolName} not available`,
100
+ isError: true,
101
+ });
102
+ }
103
+ }
104
+ this.emit({ type: "turn_end" });
105
+ this.emit({ type: "agent_end", messages: [], willRetry: false });
106
+ }
107
+ async abort() {
108
+ this.aborted = true;
109
+ }
110
+ dispose() {
111
+ this.disposed = true;
112
+ this.listeners.clear();
113
+ }
114
+ }
115
+ function safeJson(s) {
116
+ try {
117
+ return JSON.parse(s);
118
+ }
119
+ catch {
120
+ return {};
121
+ }
122
+ }
123
+ //# sourceMappingURL=mock-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-agent.js","sourceRoot":"","sources":["../src/mock-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /** The synthetic provider id under which the auto-generated gateway lives. */
2
+ export declare const GATEWAY_PROVIDER = "bp-gateway";
3
+ /** Minimal structural surface of the Pi SDK bits this module needs. */
4
+ export interface PiProviderSdk {
5
+ AuthStorage: {
6
+ create(path: string): unknown;
7
+ };
8
+ ModelRegistry: {
9
+ create(authStorage: unknown, modelsJsonPath?: string): {
10
+ refresh(): void;
11
+ getError(): string | undefined;
12
+ find(provider: string, modelId: string): unknown;
13
+ };
14
+ };
15
+ }
16
+ export interface ResolvedProvider {
17
+ model?: unknown;
18
+ modelRegistry?: unknown;
19
+ }
20
+ /**
21
+ * Resolve a custom model from env, or return `{}` when none is configured.
22
+ * `agentDir` is Pi's global config dir (getAgentDir()).
23
+ */
24
+ export declare function resolveGatewayModel(sdk: PiProviderSdk, agentDir: string): ResolvedProvider;
25
+ //# sourceMappingURL=pi-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-provider.d.ts","sourceRoot":"","sources":["../src/pi-provider.ts"],"names":[],"mappings":"AAyBA,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAM7C,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE;QAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC/C,aAAa,EAAE;QACb,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG;YACrD,OAAO,IAAI,IAAI,CAAC;YAChB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;SAClD,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAUD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAmD1F"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * pi-provider.ts — resolve a custom LLM provider for the Pi SDK from env.
3
+ *
4
+ * Pi does NOT honour `ANTHROPIC_BASE_URL` / `ANTHROPIC_MODEL` (it only reads
5
+ * `ANTHROPIC_API_KEY`, and otherwise hits the built-in Anthropic endpoint with
6
+ * a built-in model). To target a third-party model we register it as a custom
7
+ * Pi provider via a `models.json` + ModelRegistry and select its model.
8
+ *
9
+ * Three configuration tiers (simplest first):
10
+ *
11
+ * 1. Nothing set → Pi uses its built-in endpoint.
12
+ * 2. ANTHROPIC_BASE_URL + ANTHROPIC_MODEL → we auto-generate a one-provider
13
+ * `bp-gateway-models.json` for an Anthropic-compatible gateway. Optional
14
+ * ANTHROPIC_CONTEXT_WINDOW / ANTHROPIC_MAX_TOKENS tune the model limits.
15
+ * 3. BP_MODELS_JSON + ANTHROPIC_MODEL → advanced: use the user's own
16
+ * hand-written models.json verbatim (multi-provider, custom headers,
17
+ * `compat` flags, openai-compatible APIs, …). BP_MODEL_PROVIDER picks the
18
+ * provider (defaults to the file's first provider key).
19
+ *
20
+ * Returns the resolved `{ model, modelRegistry }` to pass to
21
+ * `createAgentSession`, or `{}` when nothing custom is configured.
22
+ */
23
+ import { mkdirSync, writeFileSync, readFileSync } from "node:fs";
24
+ import { join } from "node:path";
25
+ /** The synthetic provider id under which the auto-generated gateway lives. */
26
+ export const GATEWAY_PROVIDER = "bp-gateway";
27
+ /** Defaults applied to an auto-generated gateway model when env is unset. */
28
+ const DEFAULT_CONTEXT_WINDOW = 200_000;
29
+ const DEFAULT_MAX_TOKENS = 8_192;
30
+ /** Parse a positive integer env var, or `undefined` if unset/invalid. */
31
+ function intEnv(name) {
32
+ const raw = process.env[name]?.trim();
33
+ if (!raw)
34
+ return undefined;
35
+ const n = Number(raw);
36
+ return Number.isInteger(n) && n > 0 ? n : undefined;
37
+ }
38
+ /**
39
+ * Resolve a custom model from env, or return `{}` when none is configured.
40
+ * `agentDir` is Pi's global config dir (getAgentDir()).
41
+ */
42
+ export function resolveGatewayModel(sdk, agentDir) {
43
+ const modelId = process.env.ANTHROPIC_MODEL?.trim();
44
+ // Tier 3 — advanced: user supplies their own models.json verbatim.
45
+ const customPath = process.env.BP_MODELS_JSON?.trim();
46
+ if (customPath) {
47
+ // A custom file is meaningless without knowing which model to select.
48
+ if (!modelId)
49
+ return {};
50
+ const provider = resolveCustomProvider(customPath);
51
+ return select(sdk, agentDir, customPath, provider, modelId);
52
+ }
53
+ // Tier 2 — simple gateway: auto-generate a one-provider models.json.
54
+ const baseUrl = process.env.ANTHROPIC_BASE_URL?.trim();
55
+ // Tier 1 — neither set → let Pi use its built-in providers/models.
56
+ if (!baseUrl || !modelId)
57
+ return {};
58
+ mkdirSync(agentDir, { recursive: true });
59
+ const modelsJsonPath = join(agentDir, "bp-gateway-models.json");
60
+ const desired = JSON.stringify({
61
+ providers: {
62
+ [GATEWAY_PROVIDER]: {
63
+ baseUrl,
64
+ api: "anthropic-messages",
65
+ // Resolved at request time from the same env the gateway key lives in.
66
+ apiKey: "$ANTHROPIC_API_KEY",
67
+ models: [
68
+ {
69
+ id: modelId,
70
+ input: ["text"],
71
+ contextWindow: intEnv("ANTHROPIC_CONTEXT_WINDOW") ?? DEFAULT_CONTEXT_WINDOW,
72
+ maxTokens: intEnv("ANTHROPIC_MAX_TOKENS") ?? DEFAULT_MAX_TOKENS,
73
+ },
74
+ ],
75
+ },
76
+ },
77
+ }, null, 2);
78
+ // Write idempotently (avoid churn when many agents start).
79
+ let current;
80
+ try {
81
+ current = readFileSync(modelsJsonPath, "utf8");
82
+ }
83
+ catch {
84
+ /* not written yet */
85
+ }
86
+ if (current !== desired)
87
+ writeFileSync(modelsJsonPath, desired);
88
+ return select(sdk, agentDir, modelsJsonPath, GATEWAY_PROVIDER, modelId);
89
+ }
90
+ /**
91
+ * Pick the provider for a user-supplied models.json: explicit BP_MODEL_PROVIDER,
92
+ * else the file's first provider key. Throws if the file is unreadable/empty.
93
+ */
94
+ function resolveCustomProvider(modelsJsonPath) {
95
+ const explicit = process.env.BP_MODEL_PROVIDER?.trim();
96
+ if (explicit)
97
+ return explicit;
98
+ let raw;
99
+ try {
100
+ raw = readFileSync(modelsJsonPath, "utf8");
101
+ }
102
+ catch (e) {
103
+ throw new Error(`BP_MODELS_JSON unreadable (${modelsJsonPath}): ${e.message}`);
104
+ }
105
+ let providers;
106
+ try {
107
+ providers = JSON.parse(raw).providers;
108
+ }
109
+ catch (e) {
110
+ throw new Error(`BP_MODELS_JSON is not valid JSON (${modelsJsonPath}): ${e.message}`);
111
+ }
112
+ const first = providers && Object.keys(providers)[0];
113
+ if (!first) {
114
+ throw new Error(`BP_MODELS_JSON has no "providers" (${modelsJsonPath}); set BP_MODEL_PROVIDER`);
115
+ }
116
+ return first;
117
+ }
118
+ /** Load the registry against `modelsJsonPath` and resolve `provider/modelId`. */
119
+ function select(sdk, agentDir, modelsJsonPath, provider, modelId) {
120
+ const authStorage = sdk.AuthStorage.create(join(agentDir, "auth.json"));
121
+ const modelRegistry = sdk.ModelRegistry.create(authStorage, modelsJsonPath);
122
+ modelRegistry.refresh();
123
+ const err = modelRegistry.getError();
124
+ if (err)
125
+ throw new Error(`Pi models.json load error (${modelsJsonPath}): ${err}`);
126
+ const model = modelRegistry.find(provider, modelId);
127
+ if (!model) {
128
+ throw new Error(`model not found in ${modelsJsonPath}: ${provider}/${modelId}`);
129
+ }
130
+ return { model, modelRegistry };
131
+ }
132
+ //# sourceMappingURL=pi-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-provider.js","sourceRoot":"","sources":["../src/pi-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * HTTP server (§15.4 / RUNTIME_ROUTES) — implements every Runtime route on top
3
+ * of the SessionManager. Uses hono + @hono/node-server. The SSE endpoint
4
+ * streams AG-UI events for a session.
5
+ *
6
+ * Routes (from `@brainpilot/protocol` RUNTIME_ROUTES):
7
+ * GET /health, GET /metrics
8
+ * POST /sessions, GET /sessions, GET /sessions/:id, DELETE /sessions/:id
9
+ * GET /sessions/:id/state, POST /sessions/:id/messages
10
+ * GET /sse/:id (+ alias GET /sessions/:id/events)
11
+ * POST /sessions/:id/interrupt, GET /sessions/:id/agents, POST /sessions/:id/evict
12
+ */
13
+ import { Hono } from "hono";
14
+ import { SessionManager, type SessionManagerOptions } from "./session-manager.js";
15
+ export declare function createServer(opts?: SessionManagerOptions & {
16
+ manager?: SessionManager;
17
+ }): {
18
+ app: Hono;
19
+ manager: SessionManager;
20
+ };
21
+ export interface StartServerOptions extends SessionManagerOptions {
22
+ port?: number;
23
+ manager?: SessionManager;
24
+ }
25
+ export declare function startServer(opts?: StartServerOptions): {
26
+ manager: SessionManager;
27
+ port: number;
28
+ close: () => Promise<void>;
29
+ };
30
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElF,wBAAgB,YAAY,CAAC,IAAI,GAAE,qBAAqB,GAAG;IAAE,OAAO,CAAC,EAAE,cAAc,CAAA;CAAO,GAAG;IAC7F,GAAG,EAAE,IAAI,CAAC;IACV,OAAO,EAAE,cAAc,CAAC;CACzB,CA+FA;AAUD,MAAM,WAAW,kBAAmB,SAAQ,qBAAqB;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG;IAC1D,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CA+BA"}
package/dist/server.js ADDED
@@ -0,0 +1,149 @@
1
+ /**
2
+ * HTTP server (§15.4 / RUNTIME_ROUTES) — implements every Runtime route on top
3
+ * of the SessionManager. Uses hono + @hono/node-server. The SSE endpoint
4
+ * streams AG-UI events for a session.
5
+ *
6
+ * Routes (from `@brainpilot/protocol` RUNTIME_ROUTES):
7
+ * GET /health, GET /metrics
8
+ * POST /sessions, GET /sessions, GET /sessions/:id, DELETE /sessions/:id
9
+ * GET /sessions/:id/state, POST /sessions/:id/messages
10
+ * GET /sse/:id (+ alias GET /sessions/:id/events)
11
+ * POST /sessions/:id/interrupt, GET /sessions/:id/agents, POST /sessions/:id/evict
12
+ */
13
+ import { Hono } from "hono";
14
+ import { serve } from "@hono/node-server";
15
+ import { stream } from "hono/streaming";
16
+ import { CreateSessionRequestSchema, SendMessageRequestSchema, InterruptRequestSchema, } from "@brainpilot/protocol";
17
+ import { SessionManager } from "./session-manager.js";
18
+ export function createServer(opts = {}) {
19
+ const manager = opts.manager ?? new SessionManager(opts);
20
+ const app = new Hono();
21
+ app.get("/health", (c) => c.json({ status: "ok" }));
22
+ app.get("/metrics", (c) => c.json(manager.metrics()));
23
+ app.post("/sessions", async (c) => {
24
+ const body = await safeBody(c);
25
+ const parsed = CreateSessionRequestSchema.safeParse(body);
26
+ const input = parsed.success ? parsed.data : {};
27
+ const session = await manager.createSession(input);
28
+ return c.json({ id: session.id, session }, 201);
29
+ });
30
+ app.get("/sessions", (c) => c.json({ sessions: manager.listSessions() }));
31
+ app.get("/sessions/:id", (c) => {
32
+ const s = manager.getSession(c.req.param("id"));
33
+ return s ? c.json(s) : c.json({ error: "not found" }, 404);
34
+ });
35
+ app.delete("/sessions/:id", async (c) => {
36
+ const id = c.req.param("id");
37
+ const deleted = await manager.deleteSession(id);
38
+ return c.json({ id, deleted }, deleted ? 200 : 404);
39
+ });
40
+ app.get("/sessions/:id/state", (c) => {
41
+ const state = manager.getSessionState(c.req.param("id"));
42
+ return state ? c.json(state) : c.json({ error: "not found" }, 404);
43
+ });
44
+ app.post("/sessions/:id/messages", async (c) => {
45
+ const id = c.req.param("id");
46
+ const body = await safeBody(c);
47
+ const parsed = SendMessageRequestSchema.safeParse(body);
48
+ if (!parsed.success)
49
+ return c.json({ error: "invalid body" }, 400);
50
+ if (!manager.getSession(id))
51
+ return c.json({ error: "not found" }, 404);
52
+ const res = await manager.sendMessage(id, parsed.data.content, parsed.data.agent ?? "principal");
53
+ return c.json(res);
54
+ });
55
+ app.post("/sessions/:id/interrupt", async (c) => {
56
+ const id = c.req.param("id");
57
+ const body = await safeBody(c);
58
+ const parsed = InterruptRequestSchema.safeParse(body);
59
+ const agent = parsed.success ? parsed.data.agent : undefined;
60
+ const interrupted = await manager.interrupt(id, agent);
61
+ return c.json({ interrupted });
62
+ });
63
+ app.get("/sessions/:id/agents", (c) => c.json({ agents: manager.listAgents(c.req.param("id")) }));
64
+ app.post("/sessions/:id/evict", async (c) => {
65
+ const res = await manager.evictSession(c.req.param("id"));
66
+ return c.json(res, res.evicted ? 200 : 404);
67
+ });
68
+ const sseHandler = (id, c) => {
69
+ if (!manager.getSession(id))
70
+ return c.json({ error: "not found" }, 404);
71
+ c.header("Content-Type", "text/event-stream");
72
+ c.header("Cache-Control", "no-cache");
73
+ c.header("Connection", "keep-alive");
74
+ return stream(c, async (s) => {
75
+ let closed = false;
76
+ const send = (event) => {
77
+ if (closed)
78
+ return;
79
+ void s.write(`data: ${JSON.stringify(event)}\n\n`);
80
+ };
81
+ // Replay buffered events, then live-subscribe.
82
+ for (const e of manager.recentEvents(id))
83
+ send(e);
84
+ const unsub = manager.subscribe(id, send);
85
+ s.onAbort(() => {
86
+ closed = true;
87
+ unsub?.();
88
+ });
89
+ // Keep the stream open until the client disconnects.
90
+ await new Promise((resolve) => {
91
+ const iv = setInterval(() => {
92
+ if (closed) {
93
+ clearInterval(iv);
94
+ resolve();
95
+ }
96
+ else {
97
+ void s.write(": ping\n\n");
98
+ }
99
+ }, 15000);
100
+ });
101
+ });
102
+ };
103
+ app.get("/sse/:id", (c) => sseHandler(c.req.param("id"), c));
104
+ app.get("/sessions/:id/events", (c) => sseHandler(c.req.param("id"), c));
105
+ return { app, manager };
106
+ }
107
+ async function safeBody(c) {
108
+ try {
109
+ return await c.req.json();
110
+ }
111
+ catch {
112
+ return {};
113
+ }
114
+ }
115
+ export function startServer(opts = {}) {
116
+ const { app, manager } = createServer(opts);
117
+ const port = opts.port ??
118
+ (process.env.PORT ? Number(process.env.PORT) : undefined) ??
119
+ (process.env.BP_RUNTIME_PORT ? Number(process.env.BP_RUNTIME_PORT) : undefined) ??
120
+ 8081;
121
+ const server = serve({ fetch: app.fetch, port });
122
+ // §7 L4 global safety net.
123
+ const onFatal = async (err) => {
124
+ try {
125
+ await manager.emergencySaveAll();
126
+ }
127
+ catch {
128
+ /* best effort */
129
+ }
130
+ // eslint-disable-next-line no-console
131
+ console.error("[runtime] fatal:", err);
132
+ };
133
+ process.on("uncaughtException", (err) => void onFatal(err));
134
+ process.on("unhandledRejection", (reason) => void onFatal(reason));
135
+ return {
136
+ manager,
137
+ port,
138
+ close: () => new Promise((resolve) => {
139
+ server.close(() => resolve());
140
+ }),
141
+ };
142
+ }
143
+ // Allow `node dist/server.js` to boot directly.
144
+ if (process.argv[1] && import.meta.url === `file://${process.argv[1]}`) {
145
+ const { port } = startServer();
146
+ // eslint-disable-next-line no-console
147
+ console.log(`[runtime] listening on :${port} (mock=${process.env.BP_MOCK ?? "0"})`);
148
+ }
149
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { AgUiEvent, AgentStatus, Session } from "@brainpilot/protocol";
2
+ import { MasAgent } from "./mas-agent.js";
3
+ import { McpBridge } from "./mcp-bridge.js";
4
+ import type { AgentSessionFactory, EventListener } from "./types.js";
5
+ export interface SessionManagerOptions {
6
+ /** Data root (default: BP_DATA_DIR or cwd/.bp-data). */
7
+ dataRoot?: string;
8
+ /** Override the agent session factory (default: env-selected). */
9
+ agentFactory?: AgentSessionFactory;
10
+ /** Persist events.jsonl / mailbox / trace.json (default true). */
11
+ persist?: boolean;
12
+ /** Override the external MCP bridge (default: real stdio bridge). Tests inject a fake. */
13
+ mcpBridge?: McpBridge;
14
+ }
15
+ export declare class SessionManager {
16
+ private readonly sessions;
17
+ private readonly dataRoot;
18
+ private readonly agentFactory;
19
+ private readonly persist;
20
+ private lastActivityAt;
21
+ private mcpBridge;
22
+ private mcpTools;
23
+ private mcpLoaded;
24
+ constructor(opts?: SessionManagerOptions);
25
+ /**
26
+ * Load external MCP tools once. No-op in mock mode (BP_MOCK=1) and when no
27
+ * `mcp_servers.json` is present, so the default path stays zero-overhead.
28
+ */
29
+ private ensureMcpTools;
30
+ private bpDir;
31
+ private workspaceDir;
32
+ private historyPath;
33
+ createSession(input?: {
34
+ id?: string;
35
+ title?: string;
36
+ }): Promise<Session>;
37
+ getSession(id: string): Session | undefined;
38
+ listSessions(): Session[];
39
+ deleteSession(id: string): Promise<boolean>;
40
+ /** Evict idle session: stop agents + drop from memory, KEEP disk (§修正2). */
41
+ evictSession(id: string): Promise<{
42
+ evicted: boolean;
43
+ agentsKilled: number;
44
+ }>;
45
+ /** Send a user message to an agent (default principal). §7 L3 isolated. */
46
+ sendMessage(sessionId: string, content: string, agentName?: string): Promise<{
47
+ accepted: boolean;
48
+ runId?: string;
49
+ }>;
50
+ /** Interrupt a session (or a specific agent). */
51
+ interrupt(sessionId: string, agentName?: string): Promise<boolean>;
52
+ /** Ensure an agent exists (create or resurrect). */
53
+ ensureAgent(sessionId: string, name: string): Promise<MasAgent>;
54
+ destroyAgent(sessionId: string, name: string): Promise<void>;
55
+ /** §10 polling fallback: list agents with authoritative status. */
56
+ listAgents(sessionId: string): AgentStatus[];
57
+ getSessionState(sessionId: string): {
58
+ runState: {
59
+ active: boolean;
60
+ runId: string | null;
61
+ };
62
+ agents: AgentStatus[];
63
+ lastActivityTs: string;
64
+ } | undefined;
65
+ metrics(): {
66
+ activeSessions: number;
67
+ runningAgents: number;
68
+ lastActivityAt: string | null;
69
+ memRss: number;
70
+ };
71
+ subscribe(sessionId: string, listener: EventListener): (() => void) | undefined;
72
+ recentEvents(sessionId: string): AgUiEvent[];
73
+ /** §7: flush all persisted state before exit. */
74
+ emergencySaveAll(): Promise<void>;
75
+ private touch;
76
+ private toSession;
77
+ private writeMeta;
78
+ private loadTrace;
79
+ /** Restore session list from disk (§10 策略A: agents start idle, lazily revived). */
80
+ restoreFromDisk(): Promise<string[]>;
81
+ }
82
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}