@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,26 @@
1
+ /**
2
+ * Agent session factories.
3
+ *
4
+ * - `mockAgentFactory`: deterministic, no API. Used when BP_MOCK=1.
5
+ * - `realAgentFactory`: wraps `@earendil-works/pi-coding-agent`'s AgentSession.
6
+ *
7
+ * `selectFactory()` picks based on env (BP_MOCK).
8
+ *
9
+ * Real factory notes (confirmed against installed Pi SDK v0.79):
10
+ * - `createAgentSession({ cwd, tools, customTools, sessionManager, ... })`
11
+ * returns `{ session }`.
12
+ * - `session.subscribe(cb)` streams `AgentSessionEvent`s; `session.prompt()`,
13
+ * `session.abort()`, `session.dispose()`.
14
+ * - `SystemTool` is adapted to Pi's `defineTool` (params is a plain JSON
15
+ * schema, which `defineTool` accepts — verified empirically).
16
+ */
17
+ import type { AgentSessionFactory } from "./types.js";
18
+ export declare function isMockMode(): boolean;
19
+ export declare const mockAgentFactory: AgentSessionFactory;
20
+ /**
21
+ * Wrap the real Pi SDK. Imported lazily so mock-mode tests never load the SDK
22
+ * (and never need API credentials).
23
+ */
24
+ export declare const realAgentFactory: AgentSessionFactory;
25
+ export declare function selectFactory(): AgentSessionFactory;
26
+ //# sourceMappingURL=agent-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-factory.d.ts","sourceRoot":"","sources":["../src/agent-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAA2C,MAAM,YAAY,CAAC;AAI/F,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,eAAO,MAAM,gBAAgB,EAAE,mBAE9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,mBAsC9B,CAAC;AAEF,wBAAgB,aAAa,IAAI,mBAAmB,CAEnD"}
@@ -0,0 +1,90 @@
1
+ import { MockAgentSession } from "./mock-agent.js";
2
+ import { resolveGatewayModel } from "./pi-provider.js";
3
+ export function isMockMode() {
4
+ return process.env.BP_MOCK === "1" || process.env.BP_MOCK === "true";
5
+ }
6
+ export const mockAgentFactory = async ({ sessionId, agentName, systemTools }) => {
7
+ return new MockAgentSession({ sessionId, agentName, systemTools });
8
+ };
9
+ /**
10
+ * Wrap the real Pi SDK. Imported lazily so mock-mode tests never load the SDK
11
+ * (and never need API credentials).
12
+ */
13
+ export const realAgentFactory = async (params) => {
14
+ const sdk = (await import("@earendil-works/pi-coding-agent"));
15
+ const { createAgentSession, defineTool, SessionManager, DefaultResourceLoader, getAgentDir } = sdk;
16
+ const customTools = params.systemTools.map((t) => adaptTool(defineTool, t));
17
+ const agentDir = getAgentDir();
18
+ // Target a custom Anthropic-compatible gateway when ANTHROPIC_BASE_URL is set
19
+ // (Pi ignores that env var on its own). Returns {} for the default endpoint.
20
+ const { model, modelRegistry } = resolveGatewayModel(sdk, agentDir);
21
+ // `createAgentSession` has NO `systemPrompt`/`instructions` option — the
22
+ // per-role persona is injected through a DefaultResourceLoader. We use
23
+ // `appendSystemPrompt` (NOT `systemPrompt`) so Pi's built-in tool-calling
24
+ // guidance is preserved and our role persona is appended after it. Custom
25
+ // loaders are NOT auto-reloaded by the SDK, so we must reload() before use.
26
+ const resourceLoader = new DefaultResourceLoader({
27
+ cwd: params.cwd,
28
+ agentDir,
29
+ appendSystemPrompt: params.systemPrompt ? [params.systemPrompt] : [],
30
+ });
31
+ await resourceLoader.reload();
32
+ const { session } = await createAgentSession({
33
+ cwd: params.cwd,
34
+ tools: params.allowedToolNames,
35
+ customTools,
36
+ resourceLoader,
37
+ sessionManager: SessionManager.open(params.historyPath),
38
+ ...(model ? { model } : {}),
39
+ ...(modelRegistry ? { modelRegistry } : {}),
40
+ });
41
+ return new RealAgentSession(session);
42
+ };
43
+ export function selectFactory() {
44
+ return isMockMode() ? mockAgentFactory : realAgentFactory;
45
+ }
46
+ /** Adapt a BrainPilot SystemTool to a Pi `defineTool` definition. */
47
+ function adaptTool(defineTool, tool) {
48
+ return defineTool({
49
+ name: tool.name,
50
+ // `label` is a REQUIRED field on Pi's ToolDefinition (UI display name).
51
+ label: tool.name,
52
+ description: tool.description,
53
+ parameters: tool.parameters,
54
+ execute: async (_toolCallId, params) => {
55
+ const res = await tool.execute(params ?? {});
56
+ // Pi's AgentToolResult has NO `isError`; failures are signalled by
57
+ // THROWING. Surface our SystemToolResult.isError as a thrown error so
58
+ // the agent sees a failed tool call (→ tool_execution_end isError →
59
+ // system_message warning in MasAgent).
60
+ if (res.isError) {
61
+ const text = res.content.map((c) => c.text).join("\n");
62
+ throw new Error(text || `${tool.name} failed`);
63
+ }
64
+ return { content: res.content, details: {} };
65
+ },
66
+ });
67
+ }
68
+ /** Thin adapter implementing IAgentSession over the real Pi AgentSession. */
69
+ class RealAgentSession {
70
+ s;
71
+ constructor(s) {
72
+ this.s = s;
73
+ }
74
+ get sessionId() {
75
+ return this.s.sessionId;
76
+ }
77
+ subscribe(listener) {
78
+ return this.s.subscribe((e) => listener(e));
79
+ }
80
+ prompt(text) {
81
+ return this.s.prompt(text);
82
+ }
83
+ abort() {
84
+ return this.s.abort();
85
+ }
86
+ dispose() {
87
+ this.s.dispose();
88
+ }
89
+ }
90
+ //# sourceMappingURL=agent-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-factory.js","sourceRoot":"","sources":["../src/agent-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AgUiEvent } from "@brainpilot/protocol";
2
+ import type { EventListener } from "./types.js";
3
+ export declare class EventBus {
4
+ private readonly opts;
5
+ private readonly listeners;
6
+ /** Ring buffer of recent events for late SSE subscribers / replay. */
7
+ private readonly buffer;
8
+ private readonly maxBuffer;
9
+ private writeChain;
10
+ constructor(opts?: {
11
+ persistPath?: string;
12
+ maxBuffer?: number;
13
+ });
14
+ subscribe(listener: EventListener): () => void;
15
+ /** Snapshot of buffered events (for SSE replay on connect). */
16
+ recent(): AgUiEvent[];
17
+ emit(event: AgUiEvent): void;
18
+ private persist;
19
+ /** Await all pending persistence writes (used by emergencySave). */
20
+ flush(): Promise<void>;
21
+ clear(): void;
22
+ }
23
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAAa,QAAQ;IAQjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAAoC;gBAGnC,IAAI,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAK1E,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAK9C,+DAA+D;IAC/D,MAAM,IAAI,SAAS,EAAE;IAIrB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAa5B,OAAO,CAAC,OAAO;IAWf,oEAAoE;IAC9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * EventBus — per-session AG-UI event fan-out + optional jsonl persistence.
3
+ *
4
+ * The runtime is the sole producer of AG-UI events. Each SessionManager owns
5
+ * one bus per session; the HTTP SSE endpoint subscribes to stream events to
6
+ * clients. Events are also appended to `events.jsonl` for replay/recovery
7
+ * (§5 file ownership table).
8
+ */
9
+ import { appendFile, mkdir } from "node:fs/promises";
10
+ import { dirname } from "node:path";
11
+ export class EventBus {
12
+ opts;
13
+ listeners = new Set();
14
+ /** Ring buffer of recent events for late SSE subscribers / replay. */
15
+ buffer = [];
16
+ maxBuffer;
17
+ writeChain = Promise.resolve();
18
+ constructor(opts = {}) {
19
+ this.opts = opts;
20
+ this.maxBuffer = opts.maxBuffer ?? 500;
21
+ }
22
+ subscribe(listener) {
23
+ this.listeners.add(listener);
24
+ return () => this.listeners.delete(listener);
25
+ }
26
+ /** Snapshot of buffered events (for SSE replay on connect). */
27
+ recent() {
28
+ return [...this.buffer];
29
+ }
30
+ emit(event) {
31
+ this.buffer.push(event);
32
+ if (this.buffer.length > this.maxBuffer)
33
+ this.buffer.shift();
34
+ for (const l of this.listeners) {
35
+ try {
36
+ l(event);
37
+ }
38
+ catch {
39
+ // A misbehaving listener must never break event fan-out.
40
+ }
41
+ }
42
+ if (this.opts.persistPath)
43
+ this.persist(event);
44
+ }
45
+ persist(event) {
46
+ const path = this.opts.persistPath;
47
+ // Serialize writes to avoid interleaving; swallow IO errors (best-effort).
48
+ this.writeChain = this.writeChain
49
+ .then(async () => {
50
+ await mkdir(dirname(path), { recursive: true });
51
+ await appendFile(path, JSON.stringify(event) + "\n", "utf8");
52
+ })
53
+ .catch(() => { });
54
+ }
55
+ /** Await all pending persistence writes (used by emergencySave). */
56
+ async flush() {
57
+ await this.writeChain;
58
+ }
59
+ clear() {
60
+ this.listeners.clear();
61
+ this.buffer.length = 0;
62
+ }
63
+ }
64
+ //# sourceMappingURL=event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,OAAO,QAAQ;IAQA;IAPF,SAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;IACtD,sEAAsE;IACrD,MAAM,GAAgB,EAAE,CAAC;IACzB,SAAS,CAAS;IAC3B,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtD,YACmB,OAAqD,EAAE;QAAvD,SAAI,GAAJ,IAAI,CAAmD;QAExE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,QAAuB;QAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,+DAA+D;IAC/D,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,KAAgB;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,CAAC,CAAC,KAAK,CAAC,CAAC;YACX,CAAC;YAAC,MAAM,CAAC;gBACP,yDAAyD;YAC3D,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAEO,OAAO,CAAC,KAAgB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAY,CAAC;QACpC,2EAA2E;QAC3E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;aAC9B,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/D,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,41 @@
1
+ import type { AgUiEvent } from "@brainpilot/protocol";
2
+ interface Ctx {
3
+ sessionId: string;
4
+ agentName?: string;
5
+ runId?: string;
6
+ threadId?: string;
7
+ }
8
+ export declare function newMessageId(): string;
9
+ export declare function newRunId(): string;
10
+ export declare const ev: {
11
+ runStarted(ctx: Ctx, parentRunId?: string): AgUiEvent;
12
+ runFinished(ctx: Ctx, result?: unknown): AgUiEvent;
13
+ runError(ctx: Ctx, message: string, code?: string): AgUiEvent;
14
+ textMessageStart(ctx: Ctx, messageId: string, role?: string): AgUiEvent;
15
+ textMessageContent(ctx: Ctx, messageId: string, delta: string): AgUiEvent;
16
+ textMessageEnd(ctx: Ctx, messageId: string): AgUiEvent;
17
+ reasoningMessageStart(ctx: Ctx, messageId: string): AgUiEvent;
18
+ reasoningMessageContent(ctx: Ctx, messageId: string, delta: string): AgUiEvent;
19
+ reasoningMessageEnd(ctx: Ctx, messageId: string): AgUiEvent;
20
+ toolCallStart(ctx: Ctx, toolCallId: string, toolName: string, parentMessageId?: string): AgUiEvent;
21
+ toolCallArgs(ctx: Ctx, toolCallId: string, delta: string): AgUiEvent;
22
+ toolCallEnd(ctx: Ctx, toolCallId: string): AgUiEvent;
23
+ toolCallResult(ctx: Ctx, toolCallId: string, content: string, isError?: boolean, messageId?: string): AgUiEvent;
24
+ agentStatusUpdate(ctx: Ctx, name: string, status: "idle" | "running" | "error" | "stopped", extra?: {
25
+ activeRunId?: string;
26
+ activeToolExecutions?: string[];
27
+ lastError?: {
28
+ message: string;
29
+ timestamp: string;
30
+ consecutiveCount: number;
31
+ };
32
+ }): AgUiEvent;
33
+ systemMessage(sessionId: string, level: "info" | "warning" | "error" | "fatal", message: string, opts?: {
34
+ agent?: string;
35
+ details?: string;
36
+ recoverable?: boolean;
37
+ }): AgUiEvent;
38
+ custom(ctx: Ctx, name: string, value: unknown): AgUiEvent;
39
+ };
40
+ export {};
41
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMtD,UAAU,GAAG;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AACD,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,eAAO,MAAM,EAAE;oBACG,GAAG,gBAAgB,MAAM,GAAG,SAAS;qBAGpC,GAAG,WAAW,OAAO,GAAG,SAAS;kBAGpC,GAAG,WAAW,MAAM,kBAA2B,SAAS;0BAGhD,GAAG,aAAa,MAAM,kBAAuB,SAAS;4BAGpD,GAAG,aAAa,MAAM,SAAS,MAAM,GAAG,SAAS;wBAGrD,GAAG,aAAa,MAAM,GAAG,SAAS;+BAG3B,GAAG,aAAa,MAAM,GAAG,SAAS;iCAGhC,GAAG,aAAa,MAAM,SAAS,MAAM,GAAG,SAAS;6BAGrD,GAAG,aAAa,MAAM,GAAG,SAAS;uBAGxC,GAAG,cAAc,MAAM,YAAY,MAAM,oBAAoB,MAAM,GAAG,SAAS;sBAShF,GAAG,cAAc,MAAM,SAAS,MAAM,GAAG,SAAS;qBAGnD,GAAG,cAAc,MAAM,GAAG,SAAS;wBAGhC,GAAG,cAAc,MAAM,WAAW,MAAM,iCAA+B,MAAM,GAAG,SAAS;2BAWtG,GAAG,QACF,MAAM,UACJ,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,UACxC;QACN,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,SAAS,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,gBAAgB,EAAE,MAAM,CAAA;SAAE,CAAC;KAC9E,GACA,SAAS;6BAoBC,MAAM,SACV,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,WACpC,MAAM,SACR;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GACjE,SAAS;gBAYA,GAAG,QAAQ,MAAM,SAAS,OAAO,GAAG,SAAS;CAG1D,CAAC"}
package/dist/events.js ADDED
@@ -0,0 +1,119 @@
1
+ /**
2
+ * AG-UI event constructors. Every outgoing event is built here so the wire
3
+ * shape (snake_case fields, UPPERCASE/snake_case `type`) matches
4
+ * `@brainpilot/protocol` exactly. We validate via `parseEvent` in tests.
5
+ *
6
+ * The protocol event envelope carries `session_id`, optional `run_id`,
7
+ * `thread_id`, `agent_name`, and `_ts`. We always inject `session_id` and
8
+ * `agent_name` + `_ts`; `run_id` when known.
9
+ */
10
+ import { randomUUID } from "node:crypto";
11
+ function ts() {
12
+ return new Date().toISOString();
13
+ }
14
+ function envelope(ctx) {
15
+ const e = { session_id: ctx.sessionId, _ts: ts() };
16
+ if (ctx.agentName !== undefined)
17
+ e.agent_name = ctx.agentName;
18
+ if (ctx.runId !== undefined)
19
+ e.run_id = ctx.runId;
20
+ if (ctx.threadId !== undefined)
21
+ e.thread_id = ctx.threadId;
22
+ return e;
23
+ }
24
+ export function newMessageId() {
25
+ return `msg_${randomUUID()}`;
26
+ }
27
+ export function newRunId() {
28
+ return `run_${randomUUID()}`;
29
+ }
30
+ export const ev = {
31
+ runStarted(ctx, parentRunId) {
32
+ return { type: "RUN_STARTED", ...envelope(ctx), parent_run_id: parentRunId };
33
+ },
34
+ runFinished(ctx, result) {
35
+ return { type: "RUN_FINISHED", ...envelope(ctx), result };
36
+ },
37
+ runError(ctx, message, code = "RUNTIME_ERROR") {
38
+ return { type: "RUN_ERROR", ...envelope(ctx), message, code };
39
+ },
40
+ textMessageStart(ctx, messageId, role = "assistant") {
41
+ return { type: "TEXT_MESSAGE_START", ...envelope(ctx), message_id: messageId, role };
42
+ },
43
+ textMessageContent(ctx, messageId, delta) {
44
+ return { type: "TEXT_MESSAGE_CONTENT", ...envelope(ctx), message_id: messageId, delta };
45
+ },
46
+ textMessageEnd(ctx, messageId) {
47
+ return { type: "TEXT_MESSAGE_END", ...envelope(ctx), message_id: messageId };
48
+ },
49
+ reasoningMessageStart(ctx, messageId) {
50
+ return { type: "REASONING_MESSAGE_START", ...envelope(ctx), message_id: messageId };
51
+ },
52
+ reasoningMessageContent(ctx, messageId, delta) {
53
+ return { type: "REASONING_MESSAGE_CONTENT", ...envelope(ctx), message_id: messageId, delta };
54
+ },
55
+ reasoningMessageEnd(ctx, messageId) {
56
+ return { type: "REASONING_MESSAGE_END", ...envelope(ctx), message_id: messageId };
57
+ },
58
+ toolCallStart(ctx, toolCallId, toolName, parentMessageId) {
59
+ return {
60
+ type: "TOOL_CALL_START",
61
+ ...envelope(ctx),
62
+ tool_call_id: toolCallId,
63
+ tool_call_name: toolName,
64
+ parent_message_id: parentMessageId,
65
+ };
66
+ },
67
+ toolCallArgs(ctx, toolCallId, delta) {
68
+ return { type: "TOOL_CALL_ARGS", ...envelope(ctx), tool_call_id: toolCallId, delta };
69
+ },
70
+ toolCallEnd(ctx, toolCallId) {
71
+ return { type: "TOOL_CALL_END", ...envelope(ctx), tool_call_id: toolCallId };
72
+ },
73
+ toolCallResult(ctx, toolCallId, content, isError = false, messageId) {
74
+ return {
75
+ type: "TOOL_CALL_RESULT",
76
+ ...envelope(ctx),
77
+ tool_call_id: toolCallId,
78
+ message_id: messageId ?? newMessageId(),
79
+ content,
80
+ is_error: isError,
81
+ };
82
+ },
83
+ agentStatusUpdate(ctx, name, status, extra) {
84
+ const e = {
85
+ type: "agent_status_update",
86
+ ...envelope({ ...ctx, agentName: name }),
87
+ name,
88
+ status,
89
+ };
90
+ if (extra?.activeRunId !== undefined)
91
+ e.active_run_id = extra.activeRunId;
92
+ if (extra?.activeToolExecutions && extra.activeToolExecutions.length)
93
+ e.active_tool_executions = extra.activeToolExecutions;
94
+ if (extra?.lastError) {
95
+ e.last_error = {
96
+ message: extra.lastError.message,
97
+ timestamp: extra.lastError.timestamp,
98
+ consecutive_count: extra.lastError.consecutiveCount,
99
+ };
100
+ }
101
+ return e;
102
+ },
103
+ systemMessage(sessionId, level, message, opts) {
104
+ return {
105
+ type: "system_message",
106
+ session_id: sessionId,
107
+ agent: opts?.agent,
108
+ level,
109
+ message,
110
+ details: opts?.details,
111
+ timestamp: ts(),
112
+ recoverable: opts?.recoverable ?? true,
113
+ };
114
+ },
115
+ custom(ctx, name, value) {
116
+ return { type: "CUSTOM", ...envelope(ctx), name, value };
117
+ },
118
+ };
119
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @brainpilot/runtime — Pi SDK multi-agent orchestration + STATE AUTHORITY.
3
+ *
4
+ * Public surface: SessionManager, MasAgent, Mailbox, GraphOfTrace, event
5
+ * helpers, agent factories, server bootstrap.
6
+ */
7
+ export declare const RUNTIME_NAME = "@brainpilot/runtime";
8
+ export { SessionManager } from "./session-manager.js";
9
+ export type { SessionManagerOptions } from "./session-manager.js";
10
+ export { MasAgent } from "./mas-agent.js";
11
+ export type { AgentStatus, MasAgentOpts } from "./mas-agent.js";
12
+ export { Mailbox } from "./mailbox.js";
13
+ export type { MailboxMessage, MsgType } from "./mailbox.js";
14
+ export { GraphOfTrace } from "./trace.js";
15
+ export { EventBus } from "./event-bus.js";
16
+ export { ev, newMessageId, newRunId } from "./events.js";
17
+ export { MockAgentSession } from "./mock-agent.js";
18
+ export { selectFactory, isMockMode, mockAgentFactory, realAgentFactory, } from "./agent-factory.js";
19
+ export { allSystemTools, systemToolsForRole, systemToolNamesForRole, builtinToolNamesForRole, AGENT_TOOL_CONFIG, BUILTIN_TOOL_CONFIG, } from "./tools/system-tools.js";
20
+ export type { ToolDeps } from "./tools/system-tools.js";
21
+ export { createServer, startServer } from "./server.js";
22
+ export type { StartServerOptions } from "./server.js";
23
+ export { McpBridge, loadMcpServersConfig, defaultMcpConnect } from "./mcp-bridge.js";
24
+ export type { McpServersConfig, McpServerSpec, McpClientLike, McpConnectFn } from "./mcp-bridge.js";
25
+ export type { AgentRole, IAgentSession, AgentSessionFactory, PiAgentEvent, PiAssistantMessageEvent, SystemTool, SystemToolResult, EventListener, } from "./types.js";
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrF,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpG,YAAY,EACV,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,uBAAuB,EACvB,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @brainpilot/runtime — Pi SDK multi-agent orchestration + STATE AUTHORITY.
3
+ *
4
+ * Public surface: SessionManager, MasAgent, Mailbox, GraphOfTrace, event
5
+ * helpers, agent factories, server bootstrap.
6
+ */
7
+ export const RUNTIME_NAME = "@brainpilot/runtime";
8
+ export { SessionManager } from "./session-manager.js";
9
+ export { MasAgent } from "./mas-agent.js";
10
+ export { Mailbox } from "./mailbox.js";
11
+ export { GraphOfTrace } from "./trace.js";
12
+ export { EventBus } from "./event-bus.js";
13
+ export { ev, newMessageId, newRunId } from "./events.js";
14
+ export { MockAgentSession } from "./mock-agent.js";
15
+ export { selectFactory, isMockMode, mockAgentFactory, realAgentFactory, } from "./agent-factory.js";
16
+ export { allSystemTools, systemToolsForRole, systemToolNamesForRole, builtinToolNamesForRole, AGENT_TOOL_CONFIG, BUILTIN_TOOL_CONFIG, } from "./tools/system-tools.js";
17
+ export { createServer, startServer } from "./server.js";
18
+ export { McpBridge, loadMcpServersConfig, defaultMcpConnect } from "./mcp-bridge.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,31 @@
1
+ export type MsgType = "user_message" | "result_deliver" | "task_delegate" | "trace_event" | "system";
2
+ export interface MailboxMessage {
3
+ fromAgent: string;
4
+ toAgent: string;
5
+ content: string;
6
+ msgType: MsgType;
7
+ timestamp: number;
8
+ }
9
+ export declare class Mailbox {
10
+ readonly sessionId: string;
11
+ private readonly baseDir?;
12
+ private readonly inboxes;
13
+ private writeChain;
14
+ constructor(sessionId: string, baseDir?: string | undefined);
15
+ private inbox;
16
+ /** Write a message to `toAgent`'s inbox (in-memory + persisted). */
17
+ write(msg: Omit<MailboxMessage, "timestamp"> & {
18
+ timestamp?: number;
19
+ }): Promise<void>;
20
+ /** Atomically drain `agent`'s inbox (returns messages, clears the box). */
21
+ read(agent: string): Promise<MailboxMessage[]>;
22
+ /** Non-destructive peek. */
23
+ peek(agent: string): readonly MailboxMessage[];
24
+ count(agent: string): number;
25
+ private inboxPath;
26
+ private persist;
27
+ /** Recover all persisted inboxes from disk into memory (crash recovery). */
28
+ recover(): Promise<void>;
29
+ flush(): Promise<void>;
30
+ }
31
+ //# sourceMappingURL=mailbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../src/mailbox.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,OAAO,GACf,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,aAAa,GACb,QAAQ,CAAC;AAEb,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,OAAO;IAKhB,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAL3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,UAAU,CAAoC;gBAG3C,SAAS,EAAE,MAAM,EACT,OAAO,CAAC,EAAE,MAAM,YAAA;IAGnC,OAAO,CAAC,KAAK;IASb,oEAAoE;IAC9D,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3F,2EAA2E;IACrE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAOpD,4BAA4B;IAC5B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE;IAI9C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI5B,OAAO,CAAC,SAAS;YAKH,OAAO;IAarB,4EAA4E;IACtE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Mailbox — Principal↔Expert message bus (§5/§9).
3
+ *
4
+ * Single-process model: no fcntl needed. An in-memory per-agent inbox provides
5
+ * real-time delivery; each inbox is also persisted to
6
+ * `.bp/{sid}/mailbox/{agent}.json` so unread messages survive a crash (§12.1).
7
+ *
8
+ * Delivery semantics (ported from legacy `mailbox.py`): reading an inbox
9
+ * atomically drains it (avoids re-delivery). Writes append.
10
+ */
11
+ import { mkdir, readFile, writeFile, readdir } from "node:fs/promises";
12
+ import { join } from "node:path";
13
+ export class Mailbox {
14
+ sessionId;
15
+ baseDir;
16
+ inboxes = new Map();
17
+ writeChain = Promise.resolve();
18
+ constructor(sessionId, baseDir) {
19
+ this.sessionId = sessionId;
20
+ this.baseDir = baseDir;
21
+ }
22
+ inbox(agent) {
23
+ let box = this.inboxes.get(agent);
24
+ if (!box) {
25
+ box = [];
26
+ this.inboxes.set(agent, box);
27
+ }
28
+ return box;
29
+ }
30
+ /** Write a message to `toAgent`'s inbox (in-memory + persisted). */
31
+ async write(msg) {
32
+ const full = { ...msg, timestamp: msg.timestamp ?? Date.now() };
33
+ this.inbox(full.toAgent).push(full);
34
+ await this.persist(full.toAgent);
35
+ }
36
+ /** Atomically drain `agent`'s inbox (returns messages, clears the box). */
37
+ async read(agent) {
38
+ const box = this.inbox(agent);
39
+ const out = box.splice(0, box.length);
40
+ if (out.length > 0)
41
+ await this.persist(agent);
42
+ return out;
43
+ }
44
+ /** Non-destructive peek. */
45
+ peek(agent) {
46
+ return [...this.inbox(agent)];
47
+ }
48
+ count(agent) {
49
+ return this.inbox(agent).length;
50
+ }
51
+ inboxPath(agent) {
52
+ if (!this.baseDir)
53
+ return undefined;
54
+ return join(this.baseDir, `${agent}.json`);
55
+ }
56
+ async persist(agent) {
57
+ const path = this.inboxPath(agent);
58
+ if (!path)
59
+ return;
60
+ const snapshot = [...this.inbox(agent)];
61
+ this.writeChain = this.writeChain
62
+ .then(async () => {
63
+ await mkdir(this.baseDir, { recursive: true });
64
+ await writeFile(path, JSON.stringify(snapshot, null, 2), "utf8");
65
+ })
66
+ .catch(() => { });
67
+ await this.writeChain;
68
+ }
69
+ /** Recover all persisted inboxes from disk into memory (crash recovery). */
70
+ async recover() {
71
+ if (!this.baseDir)
72
+ return;
73
+ let files;
74
+ try {
75
+ files = await readdir(this.baseDir);
76
+ }
77
+ catch {
78
+ return; // no mailbox dir yet
79
+ }
80
+ for (const f of files) {
81
+ if (!f.endsWith(".json"))
82
+ continue;
83
+ const agent = f.slice(0, -".json".length);
84
+ try {
85
+ const raw = await readFile(join(this.baseDir, f), "utf8");
86
+ const msgs = JSON.parse(raw);
87
+ if (Array.isArray(msgs) && msgs.length)
88
+ this.inboxes.set(agent, msgs);
89
+ }
90
+ catch {
91
+ // skip corrupt inbox file
92
+ }
93
+ }
94
+ }
95
+ async flush() {
96
+ await this.writeChain;
97
+ }
98
+ }
99
+ //# sourceMappingURL=mailbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../src/mailbox.ts"],"names":[],"mappings":"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"}