@msm-core/mini 0.1.0

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 (94) hide show
  1. package/README.md +297 -0
  2. package/dist/adapters/index.d.ts +9 -0
  3. package/dist/adapters/index.d.ts.map +1 -0
  4. package/dist/adapters/index.js +7 -0
  5. package/dist/adapters/index.js.map +1 -0
  6. package/dist/adapters/redis-control.d.ts +25 -0
  7. package/dist/adapters/redis-control.d.ts.map +1 -0
  8. package/dist/adapters/redis-control.js +48 -0
  9. package/dist/adapters/redis-control.js.map +1 -0
  10. package/dist/adapters/redis-lock.d.ts +31 -0
  11. package/dist/adapters/redis-lock.d.ts.map +1 -0
  12. package/dist/adapters/redis-lock.js +73 -0
  13. package/dist/adapters/redis-lock.js.map +1 -0
  14. package/dist/adapters/redis-memory.d.ts +42 -0
  15. package/dist/adapters/redis-memory.d.ts.map +1 -0
  16. package/dist/adapters/redis-memory.js +87 -0
  17. package/dist/adapters/redis-memory.js.map +1 -0
  18. package/dist/adapters/redis-types.d.ts +17 -0
  19. package/dist/adapters/redis-types.d.ts.map +1 -0
  20. package/dist/adapters/redis-types.js +2 -0
  21. package/dist/adapters/redis-types.js.map +1 -0
  22. package/dist/brain/anthropic.d.ts +10 -0
  23. package/dist/brain/anthropic.d.ts.map +1 -0
  24. package/dist/brain/anthropic.js +73 -0
  25. package/dist/brain/anthropic.js.map +1 -0
  26. package/dist/brain/factory.d.ts +7 -0
  27. package/dist/brain/factory.d.ts.map +1 -0
  28. package/dist/brain/factory.js +24 -0
  29. package/dist/brain/factory.js.map +1 -0
  30. package/dist/brain/gemini.d.ts +10 -0
  31. package/dist/brain/gemini.d.ts.map +1 -0
  32. package/dist/brain/gemini.js +113 -0
  33. package/dist/brain/gemini.js.map +1 -0
  34. package/dist/brain/ollama.d.ts +10 -0
  35. package/dist/brain/ollama.d.ts.map +1 -0
  36. package/dist/brain/ollama.js +38 -0
  37. package/dist/brain/ollama.js.map +1 -0
  38. package/dist/brain/openai.d.ts +11 -0
  39. package/dist/brain/openai.d.ts.map +1 -0
  40. package/dist/brain/openai.js +96 -0
  41. package/dist/brain/openai.js.map +1 -0
  42. package/dist/brain/types.d.ts +6 -0
  43. package/dist/brain/types.d.ts.map +1 -0
  44. package/dist/brain/types.js +2 -0
  45. package/dist/brain/types.js.map +1 -0
  46. package/dist/core/context-builder.d.ts +25 -0
  47. package/dist/core/context-builder.d.ts.map +1 -0
  48. package/dist/core/context-builder.js +107 -0
  49. package/dist/core/context-builder.js.map +1 -0
  50. package/dist/core/gates.d.ts +16 -0
  51. package/dist/core/gates.d.ts.map +1 -0
  52. package/dist/core/gates.js +70 -0
  53. package/dist/core/gates.js.map +1 -0
  54. package/dist/core/guards.d.ts +22 -0
  55. package/dist/core/guards.d.ts.map +1 -0
  56. package/dist/core/guards.js +119 -0
  57. package/dist/core/guards.js.map +1 -0
  58. package/dist/core/hooks.d.ts +13 -0
  59. package/dist/core/hooks.d.ts.map +1 -0
  60. package/dist/core/hooks.js +61 -0
  61. package/dist/core/hooks.js.map +1 -0
  62. package/dist/core/loop.d.ts +16 -0
  63. package/dist/core/loop.d.ts.map +1 -0
  64. package/dist/core/loop.js +255 -0
  65. package/dist/core/loop.js.map +1 -0
  66. package/dist/core/types.d.ts +310 -0
  67. package/dist/core/types.d.ts.map +1 -0
  68. package/dist/core/types.js +8 -0
  69. package/dist/core/types.js.map +1 -0
  70. package/dist/definition/parser.d.ts +12 -0
  71. package/dist/definition/parser.d.ts.map +1 -0
  72. package/dist/definition/parser.js +117 -0
  73. package/dist/definition/parser.js.map +1 -0
  74. package/dist/index.d.ts +22 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +25 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/quality/scorer.d.ts +18 -0
  79. package/dist/quality/scorer.d.ts.map +1 -0
  80. package/dist/quality/scorer.js +22 -0
  81. package/dist/quality/scorer.js.map +1 -0
  82. package/dist/server.d.ts +27 -0
  83. package/dist/server.d.ts.map +1 -0
  84. package/dist/server.js +118 -0
  85. package/dist/server.js.map +1 -0
  86. package/dist/tools/dedup.d.ts +20 -0
  87. package/dist/tools/dedup.d.ts.map +1 -0
  88. package/dist/tools/dedup.js +47 -0
  89. package/dist/tools/dedup.js.map +1 -0
  90. package/dist/tools/executor.d.ts +32 -0
  91. package/dist/tools/executor.d.ts.map +1 -0
  92. package/dist/tools/executor.js +75 -0
  93. package/dist/tools/executor.js.map +1 -0
  94. package/package.json +67 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shared Redis interface — minimal surface used across adapters.
3
+ * Compatible with ioredis and any Redis client with the same method signatures.
4
+ */
5
+ export interface RedisLike {
6
+ get(key: string): Promise<string | null>;
7
+ set(...args: any[]): Promise<any>;
8
+ setex(key: string, seconds: number, value: string): Promise<unknown>;
9
+ del(key: string | string[]): Promise<unknown>;
10
+ rpush(key: string, ...values: string[]): Promise<unknown>;
11
+ lrange(key: string, start: number, stop: number): Promise<string[]>;
12
+ expire(key: string, seconds: number): Promise<unknown>;
13
+ hget(key: string, field: string): Promise<string | null>;
14
+ hset(key: string, field: string, value: string): Promise<unknown>;
15
+ eval(script: string, numkeys: number, ...args: any[]): Promise<unknown>;
16
+ }
17
+ //# sourceMappingURL=redis-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-types.d.ts","sourceRoot":"","sources":["../../src/adapters/redis-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEzC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=redis-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-types.js","sourceRoot":"","sources":["../../src/adapters/redis-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Anthropic Brain — Claude via Messages API.
3
+ * Peer dependency: @anthropic-ai/sdk >= 0.20.0
4
+ */
5
+ import type { Brain } from "./types.js";
6
+ export declare function createAnthropicBrain(opts: {
7
+ apiKey?: string;
8
+ model?: string;
9
+ }): Brain;
10
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/brain/anthropic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,KAAK,EAIN,MAAM,YAAY,CAAC;AAGpB,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,KAAK,CA+ER"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Anthropic Brain — Claude via Messages API.
3
+ * Peer dependency: @anthropic-ai/sdk >= 0.20.0
4
+ */
5
+ export function createAnthropicBrain(opts) {
6
+ const model = opts.model ?? "claude-3-5-sonnet-20241022";
7
+ return {
8
+ name: "anthropic",
9
+ async run(input) {
10
+ const { default: Anthropic } = await import("@anthropic-ai/sdk");
11
+ const apiKey = opts.apiKey ?? process.env["ANTHROPIC_API_KEY"];
12
+ if (!apiKey)
13
+ throw new Error("msm-mini: ANTHROPIC_API_KEY not set");
14
+ const client = new Anthropic({ apiKey });
15
+ const messages = input.history.map((m) => ({
16
+ role: m.role === "assistant" ? "assistant" : "user",
17
+ content: m.content,
18
+ }));
19
+ messages.push({ role: "user", content: input.raw });
20
+ const tools = input.tools.length > 0
21
+ ? input.tools.map((t) => ({
22
+ name: t.name,
23
+ description: t.description,
24
+ input_schema: {
25
+ type: "object",
26
+ properties: Object.fromEntries(Object.entries(t.parameters).map(([k, v]) => [
27
+ k,
28
+ { type: v.type, description: v.description },
29
+ ])),
30
+ required: Object.entries(t.parameters)
31
+ .filter(([, v]) => v.required)
32
+ .map(([k]) => k),
33
+ },
34
+ }))
35
+ : undefined;
36
+ const baseParams = {
37
+ model,
38
+ max_tokens: 4096,
39
+ system: input.system_context,
40
+ messages: messages,
41
+ };
42
+ const response = await client.messages.create(tools
43
+ ? {
44
+ ...baseParams,
45
+ tools: tools,
46
+ }
47
+ : baseParams);
48
+ const content = response.content;
49
+ // Tool use
50
+ const toolUseBlock = content.find((b) => b.type === "tool_use");
51
+ if (toolUseBlock && toolUseBlock.type === "tool_use") {
52
+ const orchestration = {
53
+ action: "use_tool",
54
+ confidence: 0.9,
55
+ tool_name: toolUseBlock.name,
56
+ tool_params: toolUseBlock.input,
57
+ };
58
+ return { orchestration };
59
+ }
60
+ // Text
61
+ const textBlock = content.find((b) => b.type === "text");
62
+ const text = textBlock && textBlock.type === "text" ? textBlock.text : "";
63
+ const inputTokens = response.usage.input_tokens;
64
+ const outputTokens = response.usage.output_tokens;
65
+ return {
66
+ generation: { response_text: text },
67
+ orchestration: { action: "respond", confidence: 0.95 },
68
+ usage: { inputTokens, outputTokens },
69
+ };
70
+ },
71
+ };
72
+ }
73
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/brain/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Brain factory — create a Brain from an AgentDefinition's brain config.
3
+ * Uses async factory pattern — call and await before passing to createAgent().
4
+ */
5
+ import type { Brain, AgentDefinition } from "../core/types.js";
6
+ export declare function buildBrain(def: AgentDefinition): Brain;
7
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/brain/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAM/D,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,KAAK,CAiBtD"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Brain factory — create a Brain from an AgentDefinition's brain config.
3
+ * Uses async factory pattern — call and await before passing to createAgent().
4
+ */
5
+ import { createOpenAIBrain } from "./openai.js";
6
+ import { createAnthropicBrain } from "./anthropic.js";
7
+ import { createGeminiBrain } from "./gemini.js";
8
+ import { createOllamaBrain } from "./ollama.js";
9
+ export function buildBrain(def) {
10
+ const { provider, model, endpoint, apiKey } = def.brain;
11
+ switch (provider) {
12
+ case "openai":
13
+ return createOpenAIBrain({ ...(model ? { model } : {}), ...(endpoint ? { baseURL: endpoint } : {}), ...(apiKey ? { apiKey } : {}) });
14
+ case "anthropic":
15
+ return createAnthropicBrain({ ...(model ? { model } : {}), ...(apiKey ? { apiKey } : {}) });
16
+ case "gemini":
17
+ return createGeminiBrain({ ...(model ? { model } : {}), ...(apiKey ? { apiKey } : {}) });
18
+ case "ollama":
19
+ return createOllamaBrain({ ...(endpoint ? { endpoint } : {}), ...(model ? { model } : {}) });
20
+ default:
21
+ throw new Error(`msm-mini: unknown brain provider "${String(provider)}". Pass a Brain instance directly to createAgent().`);
22
+ }
23
+ }
24
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/brain/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,UAAU,CAAC,GAAoB;IAC7C,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;IAExD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvI,KAAK,WAAW;YACd,OAAO,oBAAoB,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9F,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3F,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/F;YACE,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,CAAC,QAAQ,CAAC,qDAAqD,CAC3G,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Gemini Brain — Google Gemini 2.5 Flash (primary brain for UTS).
3
+ * Peer dependency: @google/generative-ai >= 0.14.0
4
+ */
5
+ import type { Brain } from "./types.js";
6
+ export declare function createGeminiBrain(opts: {
7
+ apiKey?: string;
8
+ model?: string;
9
+ }): Brain;
10
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/brain/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,KAAK,EAIN,MAAM,YAAY,CAAC;AAIpB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,KAAK,CA+GR"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Gemini Brain — Google Gemini 2.5 Flash (primary brain for UTS).
3
+ * Peer dependency: @google/generative-ai >= 0.14.0
4
+ */
5
+ import { GoogleGenerativeAI } from "@google/generative-ai";
6
+ export function createGeminiBrain(opts) {
7
+ const model = opts.model ?? "gemini-2.5-flash";
8
+ return {
9
+ name: "gemini",
10
+ async run(input) {
11
+ const apiKey = opts.apiKey ??
12
+ process.env["GEMINI_API_KEY"] ??
13
+ process.env["GOOGLE_API_KEY"];
14
+ if (!apiKey)
15
+ throw new Error("msm-mini: GEMINI_API_KEY not set");
16
+ const genai = new GoogleGenerativeAI(apiKey);
17
+ const geminiModel = genai.getGenerativeModel({ model });
18
+ // Build Gemini contents array (user/model alternation)
19
+ const contents = buildGeminiContents(input);
20
+ // Build function declarations
21
+ const tools = input.tools.length > 0
22
+ ? [
23
+ {
24
+ functionDeclarations: input.tools.map((t) => ({
25
+ name: t.name,
26
+ description: t.description,
27
+ parameters: {
28
+ type: "OBJECT",
29
+ properties: Object.fromEntries(Object.entries(t.parameters).map(([k, v]) => [
30
+ k,
31
+ {
32
+ type: v.type.toUpperCase(),
33
+ description: v.description,
34
+ ...(v.enum ? { enum: v.enum } : {}),
35
+ },
36
+ ])),
37
+ required: Object.entries(t.parameters)
38
+ .filter(([, v]) => v.required)
39
+ .map(([k]) => k),
40
+ },
41
+ })),
42
+ },
43
+ ]
44
+ : undefined;
45
+ const request = tools
46
+ ? {
47
+ systemInstruction: input.system_context,
48
+ contents,
49
+ tools: tools,
50
+ }
51
+ : { systemInstruction: input.system_context, contents };
52
+ const result = await geminiModel.generateContent(request);
53
+ const response = result.response;
54
+ const parts = response?.candidates?.[0]?.content?.parts ?? [];
55
+ // Check for function call
56
+ const fnCallPart = parts.find((p) => "functionCall" in p && p.functionCall);
57
+ if (fnCallPart &&
58
+ "functionCall" in fnCallPart &&
59
+ fnCallPart.functionCall) {
60
+ const fc = fnCallPart.functionCall;
61
+ const orchestration = {
62
+ action: "use_tool",
63
+ confidence: 0.9,
64
+ tool_name: fc.name,
65
+ tool_params: fc.args,
66
+ };
67
+ return { orchestration };
68
+ }
69
+ // Text response
70
+ const textPart = parts.find((p) => "text" in p && typeof p.text === "string");
71
+ const text = textPart && "text" in textPart ? textPart.text : "";
72
+ // Token usage
73
+ const usage = response?.usageMetadata;
74
+ const inputTokens = usage?.promptTokenCount;
75
+ const outputTokens = usage?.candidatesTokenCount;
76
+ return {
77
+ generation: { response_text: text },
78
+ orchestration: { action: "respond", confidence: 0.95 },
79
+ // Gemini 2.5 Flash pricing: $0.075/1M input, $0.30/1M output
80
+ costUsd: usage
81
+ ? (usage.promptTokenCount ?? 0) * 0.000_000_075 +
82
+ (usage.candidatesTokenCount ?? 0) * 0.0000003
83
+ : 0,
84
+ ...(inputTokens !== undefined || outputTokens !== undefined
85
+ ? {
86
+ usage: {
87
+ ...(inputTokens !== undefined ? { inputTokens } : {}),
88
+ ...(outputTokens !== undefined ? { outputTokens } : {}),
89
+ },
90
+ }
91
+ : {}),
92
+ };
93
+ },
94
+ };
95
+ }
96
+ function buildGeminiContents(input) {
97
+ const contents = [];
98
+ for (const msg of input.history) {
99
+ const role = msg.role === "assistant" ? "model" : "user";
100
+ contents.push({ role, parts: [{ text: msg.content }] });
101
+ }
102
+ // Current user message
103
+ let userText = input.raw;
104
+ if (input.tool_results?.length) {
105
+ const resultSummary = input.tool_results
106
+ .map((r) => `[${r.tool}] ${r.status}: ${JSON.stringify(r.result ?? r.error)}`)
107
+ .join("\n");
108
+ userText = `Tool results:\n${resultSummary}\n\n${input.raw}`;
109
+ }
110
+ contents.push({ role: "user", parts: [{ text: userText }] });
111
+ return contents;
112
+ }
113
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/brain/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Ollama Brain — local model via Ollama REST API.
3
+ * No peer dependencies — plain HTTP fetch.
4
+ */
5
+ import type { Brain } from "./types.js";
6
+ export declare function createOllamaBrain(opts: {
7
+ endpoint?: string;
8
+ model?: string;
9
+ }): Brain;
10
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/brain/ollama.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAmD,MAAM,YAAY,CAAC;AAEzF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,KAAK,CAyCR"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Ollama Brain — local model via Ollama REST API.
3
+ * No peer dependencies — plain HTTP fetch.
4
+ */
5
+ export function createOllamaBrain(opts) {
6
+ const endpoint = opts.endpoint ?? process.env["OLLAMA_ENDPOINT"] ?? "http://localhost:11434";
7
+ const model = opts.model ?? "llama3.2";
8
+ return {
9
+ name: "ollama",
10
+ async run(input) {
11
+ const messages = [
12
+ { role: "system", content: input.system_context },
13
+ ...input.history.map((m) => ({ role: m.role, content: m.content })),
14
+ { role: "user", content: input.raw },
15
+ ];
16
+ const response = await fetch(`${endpoint}/api/chat`, {
17
+ method: "POST",
18
+ headers: { "Content-Type": "application/json" },
19
+ body: JSON.stringify({ model, messages, stream: false }),
20
+ });
21
+ if (!response.ok) {
22
+ throw new Error(`Ollama error: ${response.status} ${response.statusText}`);
23
+ }
24
+ const data = (await response.json());
25
+ const text = data.message?.content ?? "";
26
+ const inputTokens = data.prompt_eval_count;
27
+ const outputTokens = data.eval_count;
28
+ return {
29
+ generation: { response_text: text },
30
+ orchestration: { action: "respond", confidence: 0.85 },
31
+ ...(inputTokens !== undefined || outputTokens !== undefined
32
+ ? { usage: { ...(inputTokens !== undefined ? { inputTokens } : {}), ...(outputTokens !== undefined ? { outputTokens } : {}) } }
33
+ : {}),
34
+ };
35
+ },
36
+ };
37
+ }
38
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/brain/ollama.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,iBAAiB,CAAC,IAGjC;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,wBAAwB,CAAC;IAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC;IAEvC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,CAAC,GAAG,CAAC,KAAoB;YAC5B,MAAM,QAAQ,GAAG;gBACf,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,cAAc,EAAE;gBACjD,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE;aACrC,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,WAAW,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;aACzD,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC7E,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIlC,CAAC;YAEF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;YACrC,OAAO;gBACL,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;gBACnC,aAAa,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAwB;gBAC5E,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS;oBACzD,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC/H,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * OpenAI Brain — wraps the OpenAI Chat Completions API.
3
+ * Peer dependency: openai >= 4.0.0
4
+ */
5
+ import type { Brain } from "./types.js";
6
+ export declare function createOpenAIBrain(opts: {
7
+ apiKey?: string;
8
+ model?: string;
9
+ baseURL?: string;
10
+ }): Brain;
11
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/brain/openai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,KAAK,EAIN,MAAM,YAAY,CAAC;AAGpB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,KAAK,CAwGR"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * OpenAI Brain — wraps the OpenAI Chat Completions API.
3
+ * Peer dependency: openai >= 4.0.0
4
+ */
5
+ export function createOpenAIBrain(opts) {
6
+ const model = opts.model ?? "gpt-4o-mini";
7
+ return {
8
+ name: "openai",
9
+ async run(input) {
10
+ const { default: OpenAI } = await import("openai");
11
+ const client = new OpenAI({
12
+ apiKey: opts.apiKey ?? process.env["OPENAI_API_KEY"],
13
+ ...(opts.baseURL ? { baseURL: opts.baseURL } : {}),
14
+ });
15
+ const messages = [
16
+ { role: "system", content: input.system_context },
17
+ ...input.history.map((m) => ({
18
+ role: (m.role === "assistant" ? "assistant" : "user"),
19
+ content: m.content,
20
+ })),
21
+ { role: "user", content: input.raw },
22
+ ];
23
+ const tools = input.tools.length > 0
24
+ ? input.tools.map((t) => ({
25
+ type: "function",
26
+ function: {
27
+ name: t.name,
28
+ description: t.description,
29
+ parameters: {
30
+ type: "object",
31
+ properties: Object.fromEntries(Object.entries(t.parameters).map(([k, v]) => [
32
+ k,
33
+ {
34
+ type: v.type,
35
+ description: v.description,
36
+ enum: v.enum,
37
+ },
38
+ ])),
39
+ required: Object.entries(t.parameters)
40
+ .filter(([, v]) => v.required)
41
+ .map(([k]) => k),
42
+ },
43
+ },
44
+ }))
45
+ : undefined;
46
+ const body = tools
47
+ ? {
48
+ model,
49
+ messages: messages,
50
+ tools: tools,
51
+ tool_choice: "auto",
52
+ }
53
+ : { model, messages: messages };
54
+ const response = await client.chat.completions.create(body);
55
+ const choice = response.choices[0];
56
+ if (!choice)
57
+ return {};
58
+ const msg = choice.message;
59
+ // Tool call response
60
+ if (msg.tool_calls?.length) {
61
+ const call = msg.tool_calls[0];
62
+ if (!call)
63
+ return {};
64
+ let params = {};
65
+ try {
66
+ params = JSON.parse(call.function
67
+ ?.arguments ?? "{}");
68
+ }
69
+ catch { }
70
+ const orchestration = {
71
+ action: "use_tool",
72
+ confidence: 0.9,
73
+ tool_name: call.function?.name ?? "",
74
+ tool_params: params,
75
+ };
76
+ return { orchestration };
77
+ }
78
+ const text = msg.content ?? "";
79
+ const inputTokens = response.usage?.prompt_tokens;
80
+ const outputTokens = response.usage?.completion_tokens;
81
+ return {
82
+ generation: { response_text: text },
83
+ orchestration: { action: "respond", confidence: 0.95 },
84
+ ...(inputTokens !== undefined || outputTokens !== undefined
85
+ ? {
86
+ usage: {
87
+ ...(inputTokens !== undefined ? { inputTokens } : {}),
88
+ ...(outputTokens !== undefined ? { outputTokens } : {}),
89
+ },
90
+ }
91
+ : {}),
92
+ };
93
+ },
94
+ };
95
+ }
96
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/brain/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Brain types — the contract every brain implementation must satisfy.
3
+ * Re-exported here for clarity; primary definition is in core/types.ts.
4
+ */
5
+ export type { Brain, BrainRunInput, BrainPayload, BrainOrchestration, BrainGeneration } from "../core/types.js";
6
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/brain/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/brain/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Context Builder — Assembles brain input from session state + injected context.
3
+ *
4
+ * Priority order (highest first):
5
+ * 1. neverTruncate memories (from msm-context tiers marked protected)
6
+ * 2. normal memories, sorted by score
7
+ * 3. session history (last N messages)
8
+ * 4. tool catalog
9
+ *
10
+ * Token budget is enforced by dropping lowest-priority memories first.
11
+ * The agent never queries external stores — context arrives pre-assembled.
12
+ */
13
+ import type { AgentDefinition, AgentContext, BrainRunInput, Message, ToolDefinition } from "./types.js";
14
+ export interface ContextBudget {
15
+ /** Total token ceiling (default: 32_000) */
16
+ maxTokens: number;
17
+ /** Max history messages to include (default: 20) */
18
+ maxHistoryMessages: number;
19
+ }
20
+ /**
21
+ * Build the full system context string for the brain.
22
+ * Enforces token budget by truncating memories from the bottom.
23
+ */
24
+ export declare function buildContext(def: AgentDefinition, history: Message[], tools: ToolDefinition[], context?: AgentContext, budget?: ContextBudget): Pick<BrainRunInput, "system_context" | "history">;
25
+ //# sourceMappingURL=context-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/core/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,aAAa,EACb,OAAO,EAEP,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAoDD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,OAAO,EAAE,EAClB,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,CAAC,EAAE,YAAY,EACtB,MAAM,GAAE,aAA8B,GACrC,IAAI,CAAC,aAAa,EAAE,gBAAgB,GAAG,SAAS,CAAC,CA4BnD"}