@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.
- package/dist/agent-factory.d.ts +1 -1
- package/dist/agent-factory.d.ts.map +1 -1
- package/dist/agent-factory.js +23 -8
- package/dist/agent-factory.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-bridge.d.ts +15 -2
- package/dist/mcp-bridge.d.ts.map +1 -1
- package/dist/mcp-bridge.js +53 -10
- package/dist/mcp-bridge.js.map +1 -1
- package/dist/mem-watchdog.d.ts +63 -0
- package/dist/mem-watchdog.d.ts.map +1 -0
- package/dist/mem-watchdog.js +81 -0
- package/dist/mem-watchdog.js.map +1 -0
- package/dist/personas.d.ts +37 -0
- package/dist/personas.d.ts.map +1 -0
- package/dist/personas.js +325 -0
- package/dist/personas.js.map +1 -0
- package/dist/pi-provider.d.ts +27 -1
- package/dist/pi-provider.d.ts.map +1 -1
- package/dist/pi-provider.js +64 -0
- package/dist/pi-provider.js.map +1 -1
- package/dist/provider-config.d.ts +18 -0
- package/dist/provider-config.d.ts.map +1 -0
- package/dist/provider-config.js +47 -0
- package/dist/provider-config.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +64 -0
- package/dist/server.js.map +1 -1
- package/dist/session-manager.d.ts +70 -1
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +222 -4
- package/dist/session-manager.js.map +1 -1
- package/dist/tools/system-tools.d.ts +11 -2
- package/dist/tools/system-tools.d.ts.map +1 -1
- package/dist/tools/system-tools.js +21 -2
- package/dist/tools/system-tools.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/agent-factory.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/agent-factory.js
CHANGED
|
@@ -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
|
|
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
|
|
19
|
-
// (
|
|
20
|
-
|
|
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.
|
|
25
|
-
//
|
|
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":"AAiBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAsB,MAAM,kBAAkB,CAAC;
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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"}
|
package/dist/mcp-bridge.d.ts
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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;
|
package/dist/mcp-bridge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-bridge.d.ts","sourceRoot":"","sources":["../src/mcp-bridge.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/mcp-bridge.js
CHANGED
|
@@ -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)
|
|
14
|
-
*
|
|
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:
|
|
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(
|
|
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)) {
|
package/dist/mcp-bridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../src/mcp-bridge.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|