@brainpilot/runtime 0.0.3 → 0.0.5

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 (42) hide show
  1. package/dist/agent-factory.d.ts +1 -1
  2. package/dist/agent-factory.d.ts.map +1 -1
  3. package/dist/agent-factory.js +23 -8
  4. package/dist/agent-factory.js.map +1 -1
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/mcp-bridge.d.ts +15 -2
  10. package/dist/mcp-bridge.d.ts.map +1 -1
  11. package/dist/mcp-bridge.js +53 -10
  12. package/dist/mcp-bridge.js.map +1 -1
  13. package/dist/mem-watchdog.d.ts +63 -0
  14. package/dist/mem-watchdog.d.ts.map +1 -0
  15. package/dist/mem-watchdog.js +81 -0
  16. package/dist/mem-watchdog.js.map +1 -0
  17. package/dist/personas.d.ts +37 -0
  18. package/dist/personas.d.ts.map +1 -0
  19. package/dist/personas.js +325 -0
  20. package/dist/personas.js.map +1 -0
  21. package/dist/pi-provider.d.ts +27 -1
  22. package/dist/pi-provider.d.ts.map +1 -1
  23. package/dist/pi-provider.js +64 -0
  24. package/dist/pi-provider.js.map +1 -1
  25. package/dist/provider-config.d.ts +18 -0
  26. package/dist/provider-config.d.ts.map +1 -0
  27. package/dist/provider-config.js +47 -0
  28. package/dist/provider-config.js.map +1 -0
  29. package/dist/server.d.ts.map +1 -1
  30. package/dist/server.js +64 -0
  31. package/dist/server.js.map +1 -1
  32. package/dist/session-manager.d.ts +70 -1
  33. package/dist/session-manager.d.ts.map +1 -1
  34. package/dist/session-manager.js +222 -4
  35. package/dist/session-manager.js.map +1 -1
  36. package/dist/tools/system-tools.d.ts +11 -2
  37. package/dist/tools/system-tools.d.ts.map +1 -1
  38. package/dist/tools/system-tools.js +21 -2
  39. package/dist/tools/system-tools.js.map +1 -1
  40. package/dist/types.d.ts +16 -0
  41. package/dist/types.d.ts.map +1 -1
  42. package/package.json +2 -2
@@ -15,7 +15,7 @@
15
15
  * schema, which `defineTool` accepts — verified empirically).
16
16
  */
17
17
  import type { AgentSessionFactory } from "./types.js";
18
- export declare function isMockMode(): boolean;
18
+ export declare function isMockMode(env?: Record<string, string | undefined>): boolean;
19
19
  export declare const mockAgentFactory: AgentSessionFactory;
20
20
  /**
21
21
  * Wrap the real Pi SDK. Imported lazily so mock-mode tests never load the SDK
@@ -1 +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"}
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,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,OAAO,CAEzF;AAED,eAAO,MAAM,gBAAgB,EAAE,mBAE9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,mBAkD9B,CAAC;AAEF,wBAAgB,aAAa,IAAI,mBAAmB,CAEnD"}
@@ -1,7 +1,7 @@
1
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";
2
+ import { resolveGatewayModel, resolveSessionModel } from "./pi-provider.js";
3
+ export function isMockMode(env = process.env) {
4
+ return env.BP_MOCK === "1" || env.BP_MOCK === "true";
5
5
  }
6
6
  export const mockAgentFactory = async ({ sessionId, agentName, systemTools }) => {
7
7
  return new MockAgentSession({ sessionId, agentName, systemTools });
@@ -15,17 +15,31 @@ export const realAgentFactory = async (params) => {
15
15
  const { createAgentSession, defineTool, SessionManager, DefaultResourceLoader, getAgentDir } = sdk;
16
16
  const customTools = params.systemTools.map((t) => adaptTool(defineTool, t));
17
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);
18
+ // Target a custom Anthropic-compatible gateway. A per-session providerConfig
19
+ // (from providers.json) wins and isolates its key via setRuntimeApiKey;
20
+ // otherwise fall back to the env-based gateway (Docker/static compat).
21
+ const resolved = params.providerConfig
22
+ ? resolveSessionModel(sdk, agentDir, params.providerConfig)
23
+ : resolveGatewayModel(sdk, agentDir);
24
+ const { model, modelRegistry, authStorage } = resolved;
21
25
  // `createAgentSession` has NO `systemPrompt`/`instructions` option — the
22
26
  // per-role persona is injected through a DefaultResourceLoader. We use
23
27
  // `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.
28
+ // guidance is preserved and our role persona is appended after it.
29
+ //
30
+ // Skills: Pi's DefaultResourceLoader otherwise auto-discovers skills from the
31
+ // HOST machine's global dirs (~/.pi/agent/skills, ~/.agents/skills), which
32
+ // makes agent behaviour depend on whoever runs the runtime — not reproducible.
33
+ // We set `noSkills: true` to drop that implicit discovery and load skills ONLY
34
+ // from BrainPilot's own app-controlled dirs (`bp_template/skills/` shared +
35
+ // `.bp/<sid>/skills/` per-session, passed as `skillPaths`). `additionalSkillPaths`
36
+ // bypasses Pi's project-trust gate, so this works in our non-interactive runtime.
37
+ // Custom loaders are NOT auto-reloaded by the SDK, so we must reload() before use.
26
38
  const resourceLoader = new DefaultResourceLoader({
27
39
  cwd: params.cwd,
28
40
  agentDir,
41
+ noSkills: true,
42
+ additionalSkillPaths: params.skillPaths,
29
43
  appendSystemPrompt: params.systemPrompt ? [params.systemPrompt] : [],
30
44
  });
31
45
  await resourceLoader.reload();
@@ -37,6 +51,7 @@ export const realAgentFactory = async (params) => {
37
51
  sessionManager: SessionManager.open(params.historyPath),
38
52
  ...(model ? { model } : {}),
39
53
  ...(modelRegistry ? { modelRegistry } : {}),
54
+ ...(authStorage ? { authStorage } : {}),
40
55
  });
41
56
  return new RealAgentSession(session);
42
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"agent-factory.js","sourceRoot":"","sources":["../src/agent-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-factory.js","sourceRoot":"","sources":["../src/agent-factory.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAsB,MAAM,kBAAkB,CAAC;AAEhG,MAAM,UAAU,UAAU,CAAC,MAA0C,OAAO,CAAC,GAAG;IAC9E,OAAO,GAAG,CAAC,OAAO,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAwB,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE;IACnG,OAAO,IAAI,gBAAgB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAwB,KAAK,EAAE,MAAM,EAAE,EAAE;IACpE,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAqB,CAAC;IAClF,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAEnG,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,6EAA6E;IAC7E,wEAAwE;IACxE,uEAAuE;IACvE,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc;QACpC,CAAC,CAAC,mBAAmB,CAAC,GAA+B,EAAE,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC;QACvF,CAAC,CAAC,mBAAmB,CAAC,GAA+B,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IAEvD,yEAAyE;IACzE,uEAAuE;IACvE,0EAA0E;IAC1E,mEAAmE;IACnE,EAAE;IACF,8EAA8E;IAC9E,2EAA2E;IAC3E,+EAA+E;IAC/E,+EAA+E;IAC/E,4EAA4E;IAC5E,mFAAmF;IACnF,kFAAkF;IAClF,mFAAmF;IACnF,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC;QAC/C,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ;QACR,QAAQ,EAAE,IAAI;QACd,oBAAoB,EAAE,MAAM,CAAC,UAAU;QACvC,kBAAkB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;KACrE,CAAC,CAAC;IACH,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;IAE9B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC;QAC3C,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,gBAAgB;QAC9B,WAAW;QACX,cAAc;QACd,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACvD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAC;IAEH,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC5D,CAAC;AAED,qEAAqE;AACrE,SAAS,SAAS,CAAC,UAA+B,EAAE,IAAgB;IAClE,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,wEAAwE;QACxE,KAAK,EAAE,IAAI,CAAC,IAAI;QAChB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,KAAK,EAAE,WAAmB,EAAE,MAA+B,EAAE,EAAE;YACtE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAC7C,mEAAmE;YACnE,sEAAsE;YACtE,oEAAoE;YACpE,uCAAuC;YACvC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC/C,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,MAAM,gBAAgB;IACS;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAC7C,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1B,CAAC;IACD,SAAS,CAAC,QAAmC;QAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAiB,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,KAAK;QACH,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IACD,OAAO;QACL,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -16,8 +16,9 @@ export { EventBus } from "./event-bus.js";
16
16
  export { ev, newMessageId, newRunId } from "./events.js";
17
17
  export { MockAgentSession } from "./mock-agent.js";
18
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";
19
+ export { allSystemTools, systemToolsForRole, systemToolNamesForRole, builtinToolNamesForRole, AGENT_TOOL_CONFIG, BUILTIN_TOOL_CONFIG, BUILTIN_TOOL_CONFIG_BY_NAME, } from "./tools/system-tools.js";
20
20
  export type { ToolDeps } from "./tools/system-tools.js";
21
+ export { PERSONAS, BUILTIN_PERSONA_NAMES, personaFor, } from "./personas.js";
21
22
  export { createServer, startServer } from "./server.js";
22
23
  export type { StartServerOptions } from "./server.js";
23
24
  export { McpBridge, loadMcpServersConfig, defaultMcpConnect } from "./mcp-bridge.js";
@@ -1 +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"}
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,EACnB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,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 CHANGED
@@ -13,7 +13,8 @@ export { EventBus } from "./event-bus.js";
13
13
  export { ev, newMessageId, newRunId } from "./events.js";
14
14
  export { MockAgentSession } from "./mock-agent.js";
15
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";
16
+ export { allSystemTools, systemToolsForRole, systemToolNamesForRole, builtinToolNamesForRole, AGENT_TOOL_CONFIG, BUILTIN_TOOL_CONFIG, BUILTIN_TOOL_CONFIG_BY_NAME, } from "./tools/system-tools.js";
17
+ export { PERSONAS, BUILTIN_PERSONA_NAMES, personaFor, } from "./personas.js";
17
18
  export { createServer, startServer } from "./server.js";
18
19
  export { McpBridge, loadMcpServersConfig, defaultMcpConnect } from "./mcp-bridge.js";
19
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"}
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,EACnB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,8 +1,19 @@
1
1
  import type { SystemTool } from "./types.js";
2
+ /** Wire transport for an MCP server. Absent ⇒ "stdio" (back-compat). */
3
+ export type McpTransportType = "stdio" | "http" | "sse";
2
4
  export interface McpServerSpec {
3
- command: string;
5
+ /** Transport. Defaults to "stdio" when omitted. */
6
+ type?: McpTransportType;
7
+ /** stdio: executable to spawn. */
8
+ command?: string;
9
+ /** stdio: arguments for `command`. */
4
10
  args?: string[];
11
+ /** stdio: extra environment for the spawned process. */
5
12
  env?: Record<string, string>;
13
+ /** http/sse: endpoint URL of the remote MCP server. */
14
+ url?: string;
15
+ /** http/sse: extra HTTP headers (e.g. Authorization) sent on every request. */
16
+ headers?: Record<string, string>;
6
17
  }
7
18
  export interface McpServersConfig {
8
19
  mcpServers: Record<string, McpServerSpec>;
@@ -34,8 +45,10 @@ export type McpConnectFn = (name: string, spec: McpServerSpec) => Promise<McpCli
34
45
  * absent — MCP is entirely opt-in and adds zero overhead when unconfigured.
35
46
  */
36
47
  export declare function loadMcpServersConfig(dataRoot: string): Promise<McpServersConfig | null>;
37
- /** Real connect: spawn a stdio MCP server and hand back a thin client. */
48
+ /** Real connect: open the transport named by `spec.type` and hand back a thin client. */
38
49
  export declare const defaultMcpConnect: McpConnectFn;
50
+ /** Build the SDK transport for a server spec; defaults to stdio. Exported for tests. */
51
+ export declare function openTransport(name: string, spec: McpServerSpec): Promise<import("@modelcontextprotocol/sdk/client/streamableHttp.js").StreamableHTTPClientTransport | import("@modelcontextprotocol/sdk/client/sse.js").SSEClientTransport | import("@modelcontextprotocol/sdk/client/stdio.js").StdioClientTransport>;
39
52
  export declare class McpBridge {
40
53
  private readonly connect;
41
54
  private clients;
@@ -1 +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"}
1
+ {"version":3,"file":"mcp-bridge.d.ts","sourceRoot":"","sources":["../src/mcp-bridge.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAE/D,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;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,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,EAAE,YAS/B,CAAC;AAEF,wFAAwF;AACxF,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,yPA2BpE;AAED,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;IAsB9D,OAAO,CAAC,IAAI;IAYZ,mDAAmD;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
@@ -10,8 +10,11 @@
10
10
  * Tools are namespaced `mcp__<server>__<tool>` to avoid cross-server collisions.
11
11
  * A failing server is logged and skipped — it never aborts the others.
12
12
  *
13
- * Config shape (standard MCP/Claude format), stdio servers only:
14
- * { "mcpServers": { "fs": { "command": "npx", "args": ["-y", "..."], "env": {} } } }
13
+ * Config shape (standard MCP/Claude format). Three transports are supported,
14
+ * selected by the optional `type` field (defaults to "stdio" for back-compat):
15
+ * stdio: { "fs": { "command": "npx", "args": ["-y", "..."], "env": {} } }
16
+ * http: { "api": { "type": "http", "url": "https://host/mcp", "headers": {} } }
17
+ * sse: { "evt": { "type": "sse", "url": "https://host/sse", "headers": {} } }
15
18
  */
16
19
  import { readFile } from "node:fs/promises";
17
20
  import { join } from "node:path";
@@ -35,23 +38,44 @@ export async function loadMcpServersConfig(dataRoot) {
35
38
  }
36
39
  return null;
37
40
  }
38
- /** Real connect: spawn a stdio MCP server and hand back a thin client. */
41
+ /** Real connect: open the transport named by `spec.type` and hand back a thin client. */
39
42
  export const defaultMcpConnect = async (name, spec) => {
40
43
  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
44
  const client = new Client({ name: `brainpilot-${name}`, version: "0.1.0" });
48
- await client.connect(transport);
45
+ await client.connect(await openTransport(name, spec));
49
46
  return {
50
47
  listTools: () => client.listTools(),
51
48
  callTool: (a) => client.callTool(a),
52
49
  close: () => client.close(),
53
50
  };
54
51
  };
52
+ /** Build the SDK transport for a server spec; defaults to stdio. Exported for tests. */
53
+ export async function openTransport(name, spec) {
54
+ const type = spec.type ?? "stdio";
55
+ if (type === "http" || type === "sse") {
56
+ if (!spec.url) {
57
+ throw new Error(`mcp server '${name}': type '${type}' requires a 'url'`);
58
+ }
59
+ const url = new URL(spec.url);
60
+ // Custom headers (e.g. Authorization) ride on `requestInit` for both transports.
61
+ const opts = spec.headers ? { requestInit: { headers: spec.headers } } : undefined;
62
+ if (type === "http") {
63
+ const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
64
+ return new StreamableHTTPClientTransport(url, opts);
65
+ }
66
+ const { SSEClientTransport } = await import("@modelcontextprotocol/sdk/client/sse.js");
67
+ return new SSEClientTransport(url, opts);
68
+ }
69
+ if (!spec.command) {
70
+ throw new Error(`mcp server '${name}': type 'stdio' requires a 'command'`);
71
+ }
72
+ const { StdioClientTransport } = await import("@modelcontextprotocol/sdk/client/stdio.js");
73
+ return new StdioClientTransport({
74
+ command: spec.command,
75
+ args: spec.args ?? [],
76
+ ...(spec.env ? { env: spec.env } : {}),
77
+ });
78
+ }
55
79
  export class McpBridge {
56
80
  connect;
57
81
  clients = [];
@@ -65,6 +89,13 @@ export class McpBridge {
65
89
  /** Connect every server in the config and collect their tools. */
66
90
  async connectAll(cfg) {
67
91
  for (const [name, spec] of Object.entries(cfg.mcpServers)) {
92
+ if (isPlaceholderSpec(spec)) {
93
+ // A scaffolded slot whose url/command hasn't been filled in yet — skip
94
+ // quietly so the default config never delays launch or logs an error.
95
+ // eslint-disable-next-line no-console
96
+ console.info(`[mcp] server '${name}' not configured yet — skipping`);
97
+ continue;
98
+ }
68
99
  try {
69
100
  const client = await this.connect(name, spec);
70
101
  this.clients.push(client);
@@ -97,6 +128,18 @@ export class McpBridge {
97
128
  this._tools = [];
98
129
  }
99
130
  }
131
+ /**
132
+ * A spec is a "placeholder" when its required address field is blank: an
133
+ * http/sse entry with no `url`, or a stdio entry with no `command`. The scaffold
134
+ * ships one such slot (`type:"http", url:""`) so the runtime treats an unfilled
135
+ * default as opt-in rather than a misconfiguration.
136
+ */
137
+ function isPlaceholderSpec(spec) {
138
+ const type = spec.type ?? "stdio";
139
+ if (type === "http" || type === "sse")
140
+ return !spec.url?.trim();
141
+ return !spec.command?.trim();
142
+ }
100
143
  /** Map an MCP tool-call `content` payload into our text-content shape. */
101
144
  function normalizeContent(content) {
102
145
  if (Array.isArray(content)) {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../src/mcp-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../src/mcp-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Memory watchdog (§R-4 / issue #20) — opt-in, in-process soft defense against
3
+ * the container memory budget.
4
+ *
5
+ * The hosted instance-per-user layer injects `BP_MEM_LIMIT_MB` and enforces a
6
+ * hard cgroup ceiling. This watchdog lets the runtime *self-throttle* before
7
+ * the kernel OOM-kills it: past a soft threshold (default 85% of the budget)
8
+ * the SessionManager refuses new sessions/messages and emits a system message.
9
+ *
10
+ * STRICT OPT-IN: `BP_MEM_LIMIT_MB` unset (or non-positive / unparseable) means
11
+ * the feature is entirely disabled — identical behavior to today. We never
12
+ * invent a ceiling for single-user self-hosting; the cgroup `--memory` (when
13
+ * present) remains the only backstop in that case.
14
+ *
15
+ * The RSS reader and interval are injectable so the policy is unit-testable
16
+ * without real memory pressure or wall-clock timers.
17
+ */
18
+ /**
19
+ * Parse `BP_MEM_LIMIT_MB` into a byte budget. Returns `null` (feature off)
20
+ * unless the value is a positive, finite number of megabytes.
21
+ */
22
+ export declare function parseMemLimitMb(env?: NodeJS.ProcessEnv): number | null;
23
+ export interface MemWatchdogOptions {
24
+ /** Budget in bytes (typically from {@link parseMemLimitMb}). */
25
+ limitBytes: number;
26
+ /** Fraction of the budget at which to start throttling (default 0.85). */
27
+ softRatio?: number;
28
+ /** Poll interval in ms (default 2000). */
29
+ pollMs?: number;
30
+ /** RSS reader; default reads the real process RSS. Injected in tests. */
31
+ readRss?: () => number;
32
+ /**
33
+ * Called once on the rising edge into the throttled state (not every tick),
34
+ * so the caller can emit a single warning rather than spamming.
35
+ */
36
+ onThrottle?: (snapshot: MemSnapshot) => void;
37
+ }
38
+ export interface MemSnapshot {
39
+ limitBytes: number;
40
+ rss: number;
41
+ /** rss / limitBytes. */
42
+ ratio: number;
43
+ }
44
+ export declare class MemWatchdog {
45
+ private readonly limitBytes;
46
+ private readonly softRatio;
47
+ private readonly pollMs;
48
+ private readonly readRss;
49
+ private readonly onThrottle?;
50
+ private timer;
51
+ private throttling;
52
+ constructor(opts: MemWatchdogOptions);
53
+ /** Current footprint relative to the budget. */
54
+ snapshot(): MemSnapshot;
55
+ /** True once RSS has reached the soft threshold — the signal to refuse work. */
56
+ isOverSoftLimit(): boolean;
57
+ /** Begin polling. The interval is `unref()`d so it never holds the process open. */
58
+ start(): void;
59
+ stop(): void;
60
+ /** Evaluate the threshold; fire {@link MemWatchdogOptions.onThrottle} on the rising edge. */
61
+ tick(): void;
62
+ }
63
+ //# sourceMappingURL=mem-watchdog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-watchdog.d.ts","sourceRoot":"","sources":["../src/mem-watchdog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,IAAI,CAMnF;AAED,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAkC;IAC9D,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,UAAU,CAAS;gBAEf,IAAI,EAAE,kBAAkB;IAQpC,gDAAgD;IAChD,QAAQ,IAAI,WAAW;IAKvB,gFAAgF;IAChF,eAAe,IAAI,OAAO;IAI1B,oFAAoF;IACpF,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IAOZ,6FAA6F;IAC7F,IAAI,IAAI,IAAI;CAUb"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Memory watchdog (§R-4 / issue #20) — opt-in, in-process soft defense against
3
+ * the container memory budget.
4
+ *
5
+ * The hosted instance-per-user layer injects `BP_MEM_LIMIT_MB` and enforces a
6
+ * hard cgroup ceiling. This watchdog lets the runtime *self-throttle* before
7
+ * the kernel OOM-kills it: past a soft threshold (default 85% of the budget)
8
+ * the SessionManager refuses new sessions/messages and emits a system message.
9
+ *
10
+ * STRICT OPT-IN: `BP_MEM_LIMIT_MB` unset (or non-positive / unparseable) means
11
+ * the feature is entirely disabled — identical behavior to today. We never
12
+ * invent a ceiling for single-user self-hosting; the cgroup `--memory` (when
13
+ * present) remains the only backstop in that case.
14
+ *
15
+ * The RSS reader and interval are injectable so the policy is unit-testable
16
+ * without real memory pressure or wall-clock timers.
17
+ */
18
+ /**
19
+ * Parse `BP_MEM_LIMIT_MB` into a byte budget. Returns `null` (feature off)
20
+ * unless the value is a positive, finite number of megabytes.
21
+ */
22
+ export function parseMemLimitMb(env = process.env) {
23
+ const raw = env.BP_MEM_LIMIT_MB;
24
+ if (raw === undefined || raw.trim() === "")
25
+ return null;
26
+ const mb = Number(raw);
27
+ if (!Number.isFinite(mb) || mb <= 0)
28
+ return null;
29
+ return Math.floor(mb) * 1024 * 1024;
30
+ }
31
+ export class MemWatchdog {
32
+ limitBytes;
33
+ softRatio;
34
+ pollMs;
35
+ readRss;
36
+ onThrottle;
37
+ timer = null;
38
+ throttling = false;
39
+ constructor(opts) {
40
+ this.limitBytes = opts.limitBytes;
41
+ this.softRatio = opts.softRatio ?? 0.85;
42
+ this.pollMs = opts.pollMs ?? 2000;
43
+ this.readRss = opts.readRss ?? (() => process.memoryUsage().rss);
44
+ this.onThrottle = opts.onThrottle;
45
+ }
46
+ /** Current footprint relative to the budget. */
47
+ snapshot() {
48
+ const rss = this.readRss();
49
+ return { limitBytes: this.limitBytes, rss, ratio: rss / this.limitBytes };
50
+ }
51
+ /** True once RSS has reached the soft threshold — the signal to refuse work. */
52
+ isOverSoftLimit() {
53
+ return this.readRss() >= this.limitBytes * this.softRatio;
54
+ }
55
+ /** Begin polling. The interval is `unref()`d so it never holds the process open. */
56
+ start() {
57
+ if (this.timer)
58
+ return;
59
+ this.timer = setInterval(() => this.tick(), this.pollMs);
60
+ this.timer.unref?.();
61
+ }
62
+ stop() {
63
+ if (this.timer) {
64
+ clearInterval(this.timer);
65
+ this.timer = null;
66
+ }
67
+ }
68
+ /** Evaluate the threshold; fire {@link MemWatchdogOptions.onThrottle} on the rising edge. */
69
+ tick() {
70
+ const over = this.isOverSoftLimit();
71
+ if (over && !this.throttling) {
72
+ this.throttling = true;
73
+ this.onThrottle?.(this.snapshot());
74
+ }
75
+ else if (!over && this.throttling) {
76
+ // Fell back below the threshold — re-arm so a later spike warns again.
77
+ this.throttling = false;
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=mem-watchdog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-watchdog.js","sourceRoot":"","sources":["../src/mem-watchdog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AACtC,CAAC;AAyBD,MAAM,OAAO,WAAW;IACL,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,MAAM,CAAS;IACf,OAAO,CAAe;IACtB,UAAU,CAAmC;IACtD,KAAK,GAA0C,IAAI,CAAC;IACpD,UAAU,GAAG,KAAK,CAAC;IAE3B,YAAY,IAAwB;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;IAED,gDAAgD;IAChD,QAAQ;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAC5E,CAAC;IAED,gFAAgF;IAChF,eAAe;QACb,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5D,CAAC;IAED,oFAAoF;IACpF,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,6FAA6F;IAC7F,IAAI;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpC,uEAAuE;YACvE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Per-agent system personas (system prompts), single source of truth.
3
+ *
4
+ * These are injected into each agent session via the Pi SDK's
5
+ * `appendSystemPrompt` (see `agent-factory.ts`) — appended AFTER Pi's built-in
6
+ * tool-calling guidance, so the model keeps its native tool protocol and gains
7
+ * our role persona on top.
8
+ *
9
+ * Ported and adapted from the legacy `claude/agents/*.md` prompts. THREE
10
+ * deliberate changes vs. legacy, required by the current architecture:
11
+ *
12
+ * 1. Tool names are BARE (`send_message`, `record_trace`, …). Legacy used the
13
+ * old Claude-SDK `mcp__builtin__` prefix; Pi registers tools under their
14
+ * plain names, so any `mcp__*` reference would break tool calls.
15
+ * 2. No Docker mount paths (`/workspace`, `/data`, `/shared`, `/root/.claude`).
16
+ * Each agent runs with its session workspace as cwd; refer to files by
17
+ * relative path.
18
+ * 3. Capabilities match the REAL tool allowlist (`AGENT_TOOL_CONFIG` /
19
+ * `BUILTIN_TOOL_CONFIG` in `tools/system-tools.ts`). Personas only promise
20
+ * what the role can actually do.
21
+ *
22
+ * Scaffold (`@brainpilot/cli`) writes these out as user-editable
23
+ * `bp_template/agents/<name>/prompt.md` copies; the runtime loads the on-disk
24
+ * copy when present and falls back to these constants otherwise.
25
+ */
26
+ /** Per-agent-name persona registry. The single source of truth. */
27
+ export declare const PERSONAS: Record<string, string>;
28
+ /** Built-in agent names that ship with a curated persona. */
29
+ export declare const BUILTIN_PERSONA_NAMES: string[];
30
+ /**
31
+ * Resolve the persona for an agent. Prefers the curated persona keyed by name;
32
+ * for unknown experts, returns a generic expert persona that still carries the
33
+ * messaging + trace contract. `role` is accepted for future role-level
34
+ * defaulting and to keep the call site stable.
35
+ */
36
+ export declare function personaFor(agentName: string, _role?: string): string;
37
+ //# sourceMappingURL=personas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../src/personas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AA0RH,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAO3C,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB,UAAwB,CAAC;AAkB3D;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpE"}