beercan 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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +187 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +546 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client.d.ts +8 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +29 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/config.d.ts +49 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +61 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/core/gatekeeper.d.ts +163 -0
  16. package/dist/core/gatekeeper.d.ts.map +1 -0
  17. package/dist/core/gatekeeper.js +247 -0
  18. package/dist/core/gatekeeper.js.map +1 -0
  19. package/dist/core/job-queue.d.ts +61 -0
  20. package/dist/core/job-queue.d.ts.map +1 -0
  21. package/dist/core/job-queue.js +123 -0
  22. package/dist/core/job-queue.js.map +1 -0
  23. package/dist/core/logger.d.ts +22 -0
  24. package/dist/core/logger.d.ts.map +1 -0
  25. package/dist/core/logger.js +65 -0
  26. package/dist/core/logger.js.map +1 -0
  27. package/dist/core/role-templates.d.ts +3 -0
  28. package/dist/core/role-templates.d.ts.map +1 -0
  29. package/dist/core/role-templates.js +179 -0
  30. package/dist/core/role-templates.js.map +1 -0
  31. package/dist/core/roles.d.ts +94 -0
  32. package/dist/core/roles.d.ts.map +1 -0
  33. package/dist/core/roles.js +206 -0
  34. package/dist/core/roles.js.map +1 -0
  35. package/dist/core/runner.d.ts +76 -0
  36. package/dist/core/runner.d.ts.map +1 -0
  37. package/dist/core/runner.js +307 -0
  38. package/dist/core/runner.js.map +1 -0
  39. package/dist/events/daemon.d.ts +9 -0
  40. package/dist/events/daemon.d.ts.map +1 -0
  41. package/dist/events/daemon.js +29 -0
  42. package/dist/events/daemon.js.map +1 -0
  43. package/dist/events/event-bus.d.ts +35 -0
  44. package/dist/events/event-bus.d.ts.map +1 -0
  45. package/dist/events/event-bus.js +41 -0
  46. package/dist/events/event-bus.js.map +1 -0
  47. package/dist/events/index.d.ts +41 -0
  48. package/dist/events/index.d.ts.map +1 -0
  49. package/dist/events/index.js +57 -0
  50. package/dist/events/index.js.map +1 -0
  51. package/dist/events/sources/filesystem-source.d.ts +23 -0
  52. package/dist/events/sources/filesystem-source.d.ts.map +1 -0
  53. package/dist/events/sources/filesystem-source.js +95 -0
  54. package/dist/events/sources/filesystem-source.js.map +1 -0
  55. package/dist/events/sources/macos-source.d.ts +23 -0
  56. package/dist/events/sources/macos-source.d.ts.map +1 -0
  57. package/dist/events/sources/macos-source.js +123 -0
  58. package/dist/events/sources/macos-source.js.map +1 -0
  59. package/dist/events/sources/polling-source.d.ts +23 -0
  60. package/dist/events/sources/polling-source.d.ts.map +1 -0
  61. package/dist/events/sources/polling-source.js +47 -0
  62. package/dist/events/sources/polling-source.js.map +1 -0
  63. package/dist/events/sources/webhook-source.d.ts +23 -0
  64. package/dist/events/sources/webhook-source.d.ts.map +1 -0
  65. package/dist/events/sources/webhook-source.js +132 -0
  66. package/dist/events/sources/webhook-source.js.map +1 -0
  67. package/dist/events/trigger-manager.d.ts +78 -0
  68. package/dist/events/trigger-manager.d.ts.map +1 -0
  69. package/dist/events/trigger-manager.js +130 -0
  70. package/dist/events/trigger-manager.js.map +1 -0
  71. package/dist/index.d.ts +123 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +225 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/mcp/index.d.ts +4 -0
  76. package/dist/mcp/index.d.ts.map +1 -0
  77. package/dist/mcp/index.js +3 -0
  78. package/dist/mcp/index.js.map +1 -0
  79. package/dist/mcp/manager.d.ts +99 -0
  80. package/dist/mcp/manager.d.ts.map +1 -0
  81. package/dist/mcp/manager.js +143 -0
  82. package/dist/mcp/manager.js.map +1 -0
  83. package/dist/mcp/tool-adapter.d.ts +20 -0
  84. package/dist/mcp/tool-adapter.d.ts.map +1 -0
  85. package/dist/mcp/tool-adapter.js +29 -0
  86. package/dist/mcp/tool-adapter.js.map +1 -0
  87. package/dist/memory/embeddings.d.ts +28 -0
  88. package/dist/memory/embeddings.d.ts.map +1 -0
  89. package/dist/memory/embeddings.js +90 -0
  90. package/dist/memory/embeddings.js.map +1 -0
  91. package/dist/memory/hybrid-search.d.ts +31 -0
  92. package/dist/memory/hybrid-search.d.ts.map +1 -0
  93. package/dist/memory/hybrid-search.js +114 -0
  94. package/dist/memory/hybrid-search.js.map +1 -0
  95. package/dist/memory/index.d.ts +55 -0
  96. package/dist/memory/index.d.ts.map +1 -0
  97. package/dist/memory/index.js +175 -0
  98. package/dist/memory/index.js.map +1 -0
  99. package/dist/memory/knowledge-graph.d.ts +21 -0
  100. package/dist/memory/knowledge-graph.d.ts.map +1 -0
  101. package/dist/memory/knowledge-graph.js +118 -0
  102. package/dist/memory/knowledge-graph.js.map +1 -0
  103. package/dist/memory/schemas.d.ts +187 -0
  104. package/dist/memory/schemas.d.ts.map +1 -0
  105. package/dist/memory/schemas.js +75 -0
  106. package/dist/memory/schemas.js.map +1 -0
  107. package/dist/memory/sqlite-vec-store.d.ts +22 -0
  108. package/dist/memory/sqlite-vec-store.d.ts.map +1 -0
  109. package/dist/memory/sqlite-vec-store.js +37 -0
  110. package/dist/memory/sqlite-vec-store.js.map +1 -0
  111. package/dist/memory/working-memory.d.ts +22 -0
  112. package/dist/memory/working-memory.d.ts.map +1 -0
  113. package/dist/memory/working-memory.js +53 -0
  114. package/dist/memory/working-memory.js.map +1 -0
  115. package/dist/scheduler/index.d.ts +3 -0
  116. package/dist/scheduler/index.d.ts.map +1 -0
  117. package/dist/scheduler/index.js +2 -0
  118. package/dist/scheduler/index.js.map +1 -0
  119. package/dist/scheduler/scheduler.d.ts +82 -0
  120. package/dist/scheduler/scheduler.d.ts.map +1 -0
  121. package/dist/scheduler/scheduler.js +127 -0
  122. package/dist/scheduler/scheduler.js.map +1 -0
  123. package/dist/schemas.d.ts +328 -0
  124. package/dist/schemas.d.ts.map +1 -0
  125. package/dist/schemas.js +77 -0
  126. package/dist/schemas.js.map +1 -0
  127. package/dist/storage/database.d.ts +97 -0
  128. package/dist/storage/database.d.ts.map +1 -0
  129. package/dist/storage/database.js +685 -0
  130. package/dist/storage/database.js.map +1 -0
  131. package/dist/tools/builtin/filesystem.d.ts +11 -0
  132. package/dist/tools/builtin/filesystem.d.ts.map +1 -0
  133. package/dist/tools/builtin/filesystem.js +137 -0
  134. package/dist/tools/builtin/filesystem.js.map +1 -0
  135. package/dist/tools/builtin/memory.d.ts +13 -0
  136. package/dist/tools/builtin/memory.d.ts.map +1 -0
  137. package/dist/tools/builtin/memory.js +299 -0
  138. package/dist/tools/builtin/memory.js.map +1 -0
  139. package/dist/tools/builtin/notification.d.ts +5 -0
  140. package/dist/tools/builtin/notification.d.ts.map +1 -0
  141. package/dist/tools/builtin/notification.js +36 -0
  142. package/dist/tools/builtin/notification.js.map +1 -0
  143. package/dist/tools/builtin/web.d.ts +7 -0
  144. package/dist/tools/builtin/web.d.ts.map +1 -0
  145. package/dist/tools/builtin/web.js +191 -0
  146. package/dist/tools/builtin/web.js.map +1 -0
  147. package/dist/tools/registry.d.ts +36 -0
  148. package/dist/tools/registry.d.ts.map +1 -0
  149. package/dist/tools/registry.js +49 -0
  150. package/dist/tools/registry.js.map +1 -0
  151. package/package.json +73 -0
package/dist/index.js ADDED
@@ -0,0 +1,225 @@
1
+ import { v4 as uuid } from "uuid";
2
+ import path from "path";
3
+ import fs from "fs";
4
+ import { getConfig, getProjectDir } from "./config.js";
5
+ import { BeerCanDB } from "./storage/database.js";
6
+ import { ToolRegistry } from "./tools/registry.js";
7
+ import { BloopRunner } from "./core/runner.js";
8
+ import { createAnthropicClient } from "./client.js";
9
+ import { PRESET_TEAMS } from "./core/roles.js";
10
+ import { Gatekeeper } from "./core/gatekeeper.js";
11
+ import { JobQueue } from "./core/job-queue.js";
12
+ import { Logger, setGlobalLogger } from "./core/logger.js";
13
+ import { MemoryManager } from "./memory/index.js";
14
+ import { MCPManager } from "./mcp/index.js";
15
+ import { Scheduler } from "./scheduler/index.js";
16
+ import { EventManager } from "./events/index.js";
17
+ import { readFileDefinition, readFileHandler, writeFileDefinition, writeFileHandler, listDirDefinition, listDirHandler, execDefinition, execHandler, } from "./tools/builtin/filesystem.js";
18
+ import { createMemoryTools } from "./tools/builtin/memory.js";
19
+ import { webFetchDefinition, webFetchHandler, httpRequestDefinition, httpRequestHandler, } from "./tools/builtin/web.js";
20
+ import { sendNotificationDefinition, sendNotificationHandler, } from "./tools/builtin/notification.js";
21
+ // ── BeerCan Engine ───────────────────────────────────────────
22
+ export class BeerCanEngine {
23
+ config = getConfig();
24
+ db;
25
+ tools;
26
+ runner;
27
+ gatekeeper;
28
+ jobQueue;
29
+ logger;
30
+ memoryManager;
31
+ mcpManager;
32
+ scheduler;
33
+ eventManager;
34
+ constructor() {
35
+ // Initialize logger
36
+ const logFile = this.config.logFile ?? path.join(this.config.dataDir, "beercan.log");
37
+ this.logger = new Logger(this.config.logLevel, logFile);
38
+ setGlobalLogger(this.logger);
39
+ // Initialize orchestrator database
40
+ const orchestratorDb = path.join(this.config.dataDir, "orchestrator.db");
41
+ fs.mkdirSync(this.config.dataDir, { recursive: true });
42
+ this.db = new BeerCanDB(orchestratorDb);
43
+ this.tools = new ToolRegistry();
44
+ this.memoryManager = new MemoryManager(this.db);
45
+ this.mcpManager = new MCPManager();
46
+ this.registerBuiltinTools();
47
+ this.logger.info("engine", "BeerCanEngine initialized", { dataDir: this.config.dataDir });
48
+ }
49
+ /** Must be called before using the engine — initializes async resources */
50
+ async init() {
51
+ const client = await createAnthropicClient();
52
+ this.runner = new BloopRunner(this.db, this.tools, client, this.memoryManager);
53
+ this.gatekeeper = new Gatekeeper(client, this.memoryManager);
54
+ this.jobQueue = new JobQueue(this.db, this.config.maxConcurrent);
55
+ this.jobQueue.setExecutor(async (opts) => {
56
+ const bloop = await this.runBloop(opts);
57
+ return { id: bloop.id, status: bloop.status };
58
+ });
59
+ this.scheduler = new Scheduler(this.db, this);
60
+ this.eventManager = new EventManager(this.db, this);
61
+ this.logger.info("engine", "Async init complete");
62
+ return this;
63
+ }
64
+ registerBuiltinTools() {
65
+ // Filesystem tools
66
+ this.tools.register(readFileDefinition, readFileHandler);
67
+ this.tools.register(writeFileDefinition, writeFileHandler);
68
+ this.tools.register(listDirDefinition, listDirHandler);
69
+ this.tools.register(execDefinition, execHandler);
70
+ // Web tools
71
+ this.tools.register(webFetchDefinition, webFetchHandler);
72
+ this.tools.register(httpRequestDefinition, httpRequestHandler);
73
+ // Notification tool
74
+ this.tools.register(sendNotificationDefinition, sendNotificationHandler);
75
+ // Memory tools — handlers access bloop context via runner getter
76
+ const memoryTools = createMemoryTools(this.memoryManager, () => this.runner?.getCurrentBloopContext() ?? null);
77
+ for (const { definition, handler } of memoryTools) {
78
+ this.tools.register(definition, handler);
79
+ }
80
+ }
81
+ // ── Project Management ───────────────────────────────────
82
+ createProject(opts) {
83
+ const now = new Date().toISOString();
84
+ const project = {
85
+ id: uuid(),
86
+ name: opts.name,
87
+ slug: opts.slug,
88
+ description: opts.description,
89
+ workDir: opts.workDir,
90
+ context: opts.context ?? {},
91
+ allowedTools: opts.allowedTools ?? ["*"],
92
+ tokenBudget: { dailyLimit: 100_000, perBloopLimit: 20_000 },
93
+ createdAt: now,
94
+ updatedAt: now,
95
+ };
96
+ const projectDir = getProjectDir(opts.slug);
97
+ fs.mkdirSync(projectDir, { recursive: true });
98
+ this.db.createProject(project);
99
+ this.logger.info("engine", `Project created: ${opts.slug}`, { projectId: project.id });
100
+ return project;
101
+ }
102
+ getProject(slug) {
103
+ return this.db.getProjectBySlug(slug);
104
+ }
105
+ listProjects() {
106
+ return this.db.listProjects();
107
+ }
108
+ // ── Bloop Queries ───────────────────────────────────────────
109
+ getBloop(id) {
110
+ return this.db.getBloop(id);
111
+ }
112
+ getProjectBloops(projectSlug, status) {
113
+ const project = this.db.getProjectBySlug(projectSlug);
114
+ if (!project)
115
+ return [];
116
+ return this.db.getProjectBloops(project.id, status);
117
+ }
118
+ // ── Bloop Execution ───────────────────────────────────────
119
+ /** Enqueue a bloop for execution via the job queue (concurrency-limited). */
120
+ enqueueBloop(opts) {
121
+ return this.jobQueue.enqueue(opts);
122
+ }
123
+ /** Execute a bloop directly (bypasses job queue). Used for CLI and direct API calls. */
124
+ async runBloop(opts) {
125
+ const project = this.db.getProjectBySlug(opts.projectSlug);
126
+ if (!project) {
127
+ throw new Error(`Project not found: ${opts.projectSlug}`);
128
+ }
129
+ await this.mcpManager.connectAll(opts.projectSlug, this.tools);
130
+ let team;
131
+ let gatekeeperResult = null;
132
+ if (opts.team === "auto" || opts.team === undefined) {
133
+ opts.onEvent?.({ type: "phase_start", phase: "gatekeeper", roleId: "gatekeeper" });
134
+ const memoryContext = await this.memoryManager.retrieveContext(opts.projectSlug, opts.goal, 3);
135
+ gatekeeperResult = await this.gatekeeper.analyze({
136
+ goal: opts.goal,
137
+ project,
138
+ memoryContext: memoryContext || undefined,
139
+ });
140
+ team = gatekeeperResult.team;
141
+ this.runner.registerRoles(gatekeeperResult.dynamicRoles);
142
+ const planSummary = `Gatekeeper Plan [${gatekeeperResult.plan.complexity}]: ${gatekeeperResult.plan.reasoning}\n` +
143
+ `Roles: ${gatekeeperResult.plan.roles.map((r) => `${r.name} (${r.phase})`).join(" → ")}\n` +
144
+ `Cycles: ${gatekeeperResult.plan.maxCycles} | Tokens used: ${gatekeeperResult.tokensUsed}`;
145
+ opts.onEvent?.({ type: "agent_message", role: "gatekeeper", content: planSummary });
146
+ const planContext = `--- Execution Plan (Gatekeeper) ---\nComplexity: ${gatekeeperResult.plan.complexity}\n` +
147
+ `Team: ${gatekeeperResult.plan.roles.map((r) => `${r.name} (${r.phase})`).join(" → ")}\n` +
148
+ `Strategy: ${gatekeeperResult.plan.reasoning}\nMax Cycles: ${gatekeeperResult.plan.maxCycles}`;
149
+ opts = { ...opts, extraContext: planContext + "\n" + (opts.extraContext ?? "") };
150
+ }
151
+ else if (typeof opts.team === "string") {
152
+ team = PRESET_TEAMS[opts.team] ?? PRESET_TEAMS.solo;
153
+ }
154
+ else {
155
+ team = opts.team;
156
+ }
157
+ this.logger.info("engine", `Bloop starting: ${opts.goal.slice(0, 80)}`, {
158
+ projectSlug: opts.projectSlug, team: typeof opts.team === "string" ? opts.team : "custom",
159
+ });
160
+ try {
161
+ return await this.runner.run({
162
+ project,
163
+ goal: opts.goal,
164
+ team,
165
+ extraContext: opts.extraContext,
166
+ onEvent: opts.onEvent,
167
+ });
168
+ }
169
+ finally {
170
+ if (gatekeeperResult) {
171
+ for (const role of gatekeeperResult.dynamicRoles) {
172
+ this.runner.unregisterRole(role.id);
173
+ }
174
+ }
175
+ }
176
+ }
177
+ // ── Subsystem Access ──────────────────────────────────────
178
+ registerRole(role) {
179
+ this.runner.registerRole(role);
180
+ }
181
+ get toolRegistry() {
182
+ return this.tools;
183
+ }
184
+ getGatekeeper() {
185
+ return this.gatekeeper;
186
+ }
187
+ getJobQueue() {
188
+ return this.jobQueue;
189
+ }
190
+ getScheduler() {
191
+ return this.scheduler;
192
+ }
193
+ getEventManager() {
194
+ return this.eventManager;
195
+ }
196
+ getMemoryManager() {
197
+ return this.memoryManager;
198
+ }
199
+ getMCPManager() {
200
+ return this.mcpManager;
201
+ }
202
+ getDB() {
203
+ return this.db;
204
+ }
205
+ async close() {
206
+ this.logger.info("engine", "Shutting down...");
207
+ if (this.jobQueue)
208
+ await this.jobQueue.drain();
209
+ await this.mcpManager.disconnectAll();
210
+ this.db.close();
211
+ this.logger.close();
212
+ }
213
+ }
214
+ // ── Public API ───────────────────────────────────────────────
215
+ export { PRESET_TEAMS, BUILTIN_ROLES } from "./core/roles.js";
216
+ export { ROLE_TEMPLATES } from "./core/role-templates.js";
217
+ export { Gatekeeper } from "./core/gatekeeper.js";
218
+ export { JobQueue } from "./core/job-queue.js";
219
+ export { Logger, getLogger } from "./core/logger.js";
220
+ export { ToolRegistry } from "./tools/registry.js";
221
+ export { MemoryManager, SqliteVecStore, KnowledgeGraph, WorkingMemory, HybridSearch } from "./memory/index.js";
222
+ export { MCPManager } from "./mcp/index.js";
223
+ export { Scheduler } from "./scheduler/index.js";
224
+ export { EventManager } from "./events/index.js";
225
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { MCPManager, MCPServerConfigSchema, MCPProjectConfigSchema } from "./manager.js";
2
+ export type { MCPServerConfig, MCPProjectConfig } from "./manager.js";
3
+ export { mcpToolToDefinition, parseMcpToolName } from "./tool-adapter.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACzF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { MCPManager, MCPServerConfigSchema, MCPProjectConfigSchema } from "./manager.js";
2
+ export { mcpToolToDefinition, parseMcpToolName } from "./tool-adapter.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEzF,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { z } from "zod";
2
+ import { ToolRegistry } from "../tools/registry.js";
3
+ export declare const MCPServerConfigSchema: z.ZodObject<{
4
+ name: z.ZodString;
5
+ type: z.ZodEnum<["stdio", "http"]>;
6
+ command: z.ZodOptional<z.ZodString>;
7
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
8
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
9
+ url: z.ZodOptional<z.ZodString>;
10
+ enabled: z.ZodDefault<z.ZodBoolean>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ type: "stdio" | "http";
13
+ name: string;
14
+ enabled: boolean;
15
+ command?: string | undefined;
16
+ args?: string[] | undefined;
17
+ env?: Record<string, string> | undefined;
18
+ url?: string | undefined;
19
+ }, {
20
+ type: "stdio" | "http";
21
+ name: string;
22
+ enabled?: boolean | undefined;
23
+ command?: string | undefined;
24
+ args?: string[] | undefined;
25
+ env?: Record<string, string> | undefined;
26
+ url?: string | undefined;
27
+ }>;
28
+ export type MCPServerConfig = z.infer<typeof MCPServerConfigSchema>;
29
+ export declare const MCPProjectConfigSchema: z.ZodObject<{
30
+ servers: z.ZodArray<z.ZodObject<{
31
+ name: z.ZodString;
32
+ type: z.ZodEnum<["stdio", "http"]>;
33
+ command: z.ZodOptional<z.ZodString>;
34
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
35
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
36
+ url: z.ZodOptional<z.ZodString>;
37
+ enabled: z.ZodDefault<z.ZodBoolean>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ type: "stdio" | "http";
40
+ name: string;
41
+ enabled: boolean;
42
+ command?: string | undefined;
43
+ args?: string[] | undefined;
44
+ env?: Record<string, string> | undefined;
45
+ url?: string | undefined;
46
+ }, {
47
+ type: "stdio" | "http";
48
+ name: string;
49
+ enabled?: boolean | undefined;
50
+ command?: string | undefined;
51
+ args?: string[] | undefined;
52
+ env?: Record<string, string> | undefined;
53
+ url?: string | undefined;
54
+ }>, "many">;
55
+ }, "strip", z.ZodTypeAny, {
56
+ servers: {
57
+ type: "stdio" | "http";
58
+ name: string;
59
+ enabled: boolean;
60
+ command?: string | undefined;
61
+ args?: string[] | undefined;
62
+ env?: Record<string, string> | undefined;
63
+ url?: string | undefined;
64
+ }[];
65
+ }, {
66
+ servers: {
67
+ type: "stdio" | "http";
68
+ name: string;
69
+ enabled?: boolean | undefined;
70
+ command?: string | undefined;
71
+ args?: string[] | undefined;
72
+ env?: Record<string, string> | undefined;
73
+ url?: string | undefined;
74
+ }[];
75
+ }>;
76
+ export type MCPProjectConfig = z.infer<typeof MCPProjectConfigSchema>;
77
+ export declare class MCPManager {
78
+ private connections;
79
+ private currentProject;
80
+ /**
81
+ * Connect to all MCP servers configured for a project.
82
+ * Reads config from `~/.beercan/projects/<slug>/mcp.json`.
83
+ */
84
+ connectAll(projectSlug: string, registry: ToolRegistry): Promise<void>;
85
+ /** Connect to a single MCP server and register its tools */
86
+ private connectServer;
87
+ /** Connect via stdio transport (spawns a local process) */
88
+ private connectStdio;
89
+ /** Disconnect all MCP servers */
90
+ disconnectAll(): Promise<void>;
91
+ /** List active connections */
92
+ listConnections(): Array<{
93
+ name: string;
94
+ tools: string[];
95
+ }>;
96
+ /** Load MCP config for a project */
97
+ private loadConfig;
98
+ }
99
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAoB,MAAM,sBAAsB,CAAC;AAMtE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;EAQhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAatE,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,cAAc,CAAuB;IAE7C;;;OAGG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5E,4DAA4D;YAC9C,aAAa;IAa3B,2DAA2D;YAC7C,YAAY;IAgE1B,iCAAiC;IAC3B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAYpC,8BAA8B;IAC9B,eAAe,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAO3D,oCAAoC;IACpC,OAAO,CAAC,UAAU;CAYnB"}
@@ -0,0 +1,143 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ import { z } from "zod";
4
+ import fs from "fs";
5
+ import path from "path";
6
+ import { mcpToolToDefinition } from "./tool-adapter.js";
7
+ import { getProjectDir } from "../config.js";
8
+ // ── MCP Server Config Schema ────────────────────────────────
9
+ export const MCPServerConfigSchema = z.object({
10
+ name: z.string(),
11
+ type: z.enum(["stdio", "http"]),
12
+ command: z.string().optional(), // for stdio
13
+ args: z.array(z.string()).optional(), // for stdio
14
+ env: z.record(z.string()).optional(), // for stdio
15
+ url: z.string().optional(), // for http
16
+ enabled: z.boolean().default(true),
17
+ });
18
+ export const MCPProjectConfigSchema = z.object({
19
+ servers: z.array(MCPServerConfigSchema),
20
+ });
21
+ // ── MCP Manager ─────────────────────────────────────────────
22
+ export class MCPManager {
23
+ connections = new Map();
24
+ currentProject = null;
25
+ /**
26
+ * Connect to all MCP servers configured for a project.
27
+ * Reads config from `~/.beercan/projects/<slug>/mcp.json`.
28
+ */
29
+ async connectAll(projectSlug, registry) {
30
+ // If already connected to this project, skip
31
+ if (this.currentProject === projectSlug && this.connections.size > 0) {
32
+ return;
33
+ }
34
+ // Disconnect previous project's servers
35
+ await this.disconnectAll();
36
+ this.currentProject = projectSlug;
37
+ const config = this.loadConfig(projectSlug);
38
+ if (!config || config.servers.length === 0)
39
+ return;
40
+ for (const serverConfig of config.servers) {
41
+ if (!serverConfig.enabled)
42
+ continue;
43
+ try {
44
+ await this.connectServer(serverConfig, registry);
45
+ }
46
+ catch (err) {
47
+ console.warn(`[mcp] Failed to connect to ${serverConfig.name}: ${err.message}`);
48
+ }
49
+ }
50
+ }
51
+ /** Connect to a single MCP server and register its tools */
52
+ async connectServer(config, registry) {
53
+ if (config.type === "stdio") {
54
+ await this.connectStdio(config, registry);
55
+ }
56
+ else if (config.type === "http") {
57
+ // HTTP transport — future implementation
58
+ // For now, log a warning
59
+ console.warn(`[mcp] HTTP transport not yet implemented for ${config.name}. Use stdio.`);
60
+ }
61
+ }
62
+ /** Connect via stdio transport (spawns a local process) */
63
+ async connectStdio(config, registry) {
64
+ if (!config.command) {
65
+ throw new Error(`Stdio server ${config.name} requires 'command'`);
66
+ }
67
+ const transport = new StdioClientTransport({
68
+ command: config.command,
69
+ args: config.args ?? [],
70
+ env: { ...process.env, ...(config.env ?? {}) },
71
+ });
72
+ const client = new Client({ name: "beercan", version: "0.1.0" }, { capabilities: {} });
73
+ await client.connect(transport);
74
+ // Discover and register tools
75
+ const toolsResult = await client.listTools();
76
+ const registeredTools = [];
77
+ for (const mcpTool of toolsResult.tools) {
78
+ const definition = mcpToolToDefinition(config.name, mcpTool);
79
+ // Create handler that delegates to MCP server
80
+ const handler = async (input) => {
81
+ const result = await client.callTool({
82
+ name: mcpTool.name,
83
+ arguments: input,
84
+ });
85
+ // MCP returns content as array of content blocks
86
+ if (Array.isArray(result.content)) {
87
+ return result.content
88
+ .map((block) => {
89
+ if (block.type === "text")
90
+ return block.text;
91
+ return JSON.stringify(block);
92
+ })
93
+ .join("\n");
94
+ }
95
+ return JSON.stringify(result.content);
96
+ };
97
+ registry.register(definition, handler);
98
+ registeredTools.push(definition.name);
99
+ }
100
+ this.connections.set(config.name, {
101
+ name: config.name,
102
+ client,
103
+ transport,
104
+ tools: registeredTools,
105
+ });
106
+ console.log(`[mcp] Connected to ${config.name}: ${registeredTools.length} tools registered`);
107
+ }
108
+ /** Disconnect all MCP servers */
109
+ async disconnectAll() {
110
+ for (const [name, conn] of this.connections) {
111
+ try {
112
+ await conn.client.close();
113
+ }
114
+ catch {
115
+ // Ignore close errors
116
+ }
117
+ }
118
+ this.connections.clear();
119
+ this.currentProject = null;
120
+ }
121
+ /** List active connections */
122
+ listConnections() {
123
+ return Array.from(this.connections.values()).map((c) => ({
124
+ name: c.name,
125
+ tools: c.tools,
126
+ }));
127
+ }
128
+ /** Load MCP config for a project */
129
+ loadConfig(projectSlug) {
130
+ const configPath = path.join(getProjectDir(projectSlug), "mcp.json");
131
+ if (!fs.existsSync(configPath))
132
+ return null;
133
+ try {
134
+ const raw = JSON.parse(fs.readFileSync(configPath, "utf-8"));
135
+ return MCPProjectConfigSchema.parse(raw);
136
+ }
137
+ catch (err) {
138
+ console.warn(`[mcp] Invalid config at ${configPath}: ${err.message}`);
139
+ return null;
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,+DAA+D;AAE/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAI,YAAY;IAC9C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,YAAY;IAClD,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,YAAY;IAClD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAQ,WAAW;IAC7C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CACnC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;CACxC,CAAC,CAAC;AAYH,+DAA+D;AAE/D,MAAM,OAAO,UAAU;IACb,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC/C,cAAc,GAAkB,IAAI,CAAC;IAE7C;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,QAAsB;QAC1D,6CAA6C;QAC7C,IAAI,IAAI,CAAC,cAAc,KAAK,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACrE,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;QAElC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnD,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,OAAO;gBAAE,SAAS;YAEpC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,8BAA8B,YAAY,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IAED,4DAA4D;IACpD,KAAK,CAAC,aAAa,CACzB,MAAuB,EACvB,QAAsB;QAEtB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,yCAAyC;YACzC,yBAAyB;YACzB,OAAO,CAAC,IAAI,CAAC,gDAAgD,MAAM,CAAC,IAAI,cAAc,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,2DAA2D;IACnD,KAAK,CAAC,YAAY,CACxB,MAAuB,EACvB,QAAsB;QAEtB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;YACvB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAA4B;SACzE,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EACrC,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;QAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,8BAA8B;QAC9B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE7D,8CAA8C;YAC9C,MAAM,OAAO,GAAgB,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;oBACnC,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC;gBAEH,iDAAiD;gBACjD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,OAAO,MAAM,CAAC,OAAO;yBAClB,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;wBAClB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;4BAAE,OAAO,KAAK,CAAC,IAAI,CAAC;wBAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAC/B,CAAC,CAAC;yBACD,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;gBAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC,CAAC;YAEF,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACvC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YAChC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM;YACN,SAAS;YACT,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CACT,sBAAsB,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,mBAAmB,CAChF,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,aAAa;QACjB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,8BAA8B;IAC9B,eAAe;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IAED,oCAAoC;IAC5B,UAAU,CAAC,WAAmB;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,OAAO,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,2BAA2B,UAAU,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { ToolDefinition } from "../schemas.js";
2
+ /**
3
+ * Convert an MCP tool definition to our ToolDefinition format.
4
+ * Namespaces the tool name as `mcp_<serverName>__<toolName>` to avoid collisions.
5
+ * Uses underscores because Anthropic's API only allows [a-zA-Z0-9_-] in tool names.
6
+ */
7
+ export declare function mcpToolToDefinition(serverName: string, mcpTool: {
8
+ name: string;
9
+ description?: string;
10
+ inputSchema?: Record<string, unknown>;
11
+ }): ToolDefinition;
12
+ /**
13
+ * Extract the server name and original tool name from a namespaced tool name.
14
+ * e.g., "mcp_filesystem__read_file" → { server: "filesystem", tool: "read_file" }
15
+ */
16
+ export declare function parseMcpToolName(namespacedName: string): {
17
+ server: string;
18
+ tool: string;
19
+ } | null;
20
+ //# sourceMappingURL=tool-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-adapter.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACrF,cAAc,CAYhB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIhG"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Convert an MCP tool definition to our ToolDefinition format.
3
+ * Namespaces the tool name as `mcp_<serverName>__<toolName>` to avoid collisions.
4
+ * Uses underscores because Anthropic's API only allows [a-zA-Z0-9_-] in tool names.
5
+ */
6
+ export function mcpToolToDefinition(serverName, mcpTool) {
7
+ // Sanitize server name: replace non-alphanumeric with underscore
8
+ const safeName = serverName.replace(/[^a-zA-Z0-9_-]/g, "_");
9
+ const safeToolName = mcpTool.name.replace(/[^a-zA-Z0-9_-]/g, "_");
10
+ return {
11
+ name: `mcp_${safeName}__${safeToolName}`,
12
+ description: mcpTool.description ?? `MCP tool: ${mcpTool.name} from ${serverName}`,
13
+ inputSchema: mcpTool.inputSchema ?? {
14
+ type: "object",
15
+ properties: {},
16
+ },
17
+ };
18
+ }
19
+ /**
20
+ * Extract the server name and original tool name from a namespaced tool name.
21
+ * e.g., "mcp_filesystem__read_file" → { server: "filesystem", tool: "read_file" }
22
+ */
23
+ export function parseMcpToolName(namespacedName) {
24
+ const match = namespacedName.match(/^mcp_([^_]+)__(.+)$/);
25
+ if (!match)
26
+ return null;
27
+ return { server: match[1], tool: match[2] };
28
+ }
29
+ //# sourceMappingURL=tool-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-adapter.js","sourceRoot":"","sources":["../../src/mcp/tool-adapter.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,OAAsF;IAEtF,iEAAiE;IACjE,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAClE,OAAO;QACL,IAAI,EAAE,OAAO,QAAQ,KAAK,YAAY,EAAE;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,aAAa,OAAO,CAAC,IAAI,SAAS,UAAU,EAAE;QAClF,WAAW,EAAG,OAAO,CAAC,WAAuC,IAAI;YAC/D,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAsB;IACrD,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Embedding providers for vector memory.
3
+ * Default: TF-IDF based local embeddings (no API calls needed).
4
+ * Pluggable: swap in Voyage AI or OpenAI for neural embeddings.
5
+ */
6
+ export interface EmbeddingProvider {
7
+ /** Generate embedding vector from text */
8
+ embed(text: string): Promise<number[]>;
9
+ /** Dimensionality of output vectors */
10
+ dimensions: number;
11
+ }
12
+ /**
13
+ * Simple but effective local embedder using hashed TF-IDF.
14
+ * No external API calls. Deterministic. Fast.
15
+ * Good enough for finding similar goals/results in a personal system.
16
+ */
17
+ export declare class LocalEmbedder implements EmbeddingProvider {
18
+ dimensions: number;
19
+ embed(text: string): Promise<number[]>;
20
+ }
21
+ export declare class EmbeddingCache {
22
+ private cache;
23
+ private maxSize;
24
+ constructor(maxSize?: number);
25
+ get(key: string): number[] | undefined;
26
+ set(key: string, value: number[]): void;
27
+ }
28
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/memory/embeddings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;;GAIG;AACH,qBAAa,aAAc,YAAW,iBAAiB;IACrD,UAAU,SAAc;IAElB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAG7C;AAsDD,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAAO;IAI1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAUtC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;CAQxC"}