bernard-agent 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 (112) hide show
  1. package/.env.example +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +629 -0
  4. package/dist/agent.d.ts +24 -0
  5. package/dist/agent.js +174 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/config.d.ts +44 -0
  8. package/dist/config.js +267 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/context.d.ts +37 -0
  11. package/dist/context.js +245 -0
  12. package/dist/context.js.map +1 -0
  13. package/dist/cron/client.d.ts +4 -0
  14. package/dist/cron/client.js +113 -0
  15. package/dist/cron/client.js.map +1 -0
  16. package/dist/cron/daemon.d.ts +1 -0
  17. package/dist/cron/daemon.js +132 -0
  18. package/dist/cron/daemon.js.map +1 -0
  19. package/dist/cron/log-store.d.ts +51 -0
  20. package/dist/cron/log-store.js +135 -0
  21. package/dist/cron/log-store.js.map +1 -0
  22. package/dist/cron/notify.d.ts +7 -0
  23. package/dist/cron/notify.js +136 -0
  24. package/dist/cron/notify.js.map +1 -0
  25. package/dist/cron/runner.d.ts +6 -0
  26. package/dist/cron/runner.js +219 -0
  27. package/dist/cron/runner.js.map +1 -0
  28. package/dist/cron/scheduler.d.ts +16 -0
  29. package/dist/cron/scheduler.js +105 -0
  30. package/dist/cron/scheduler.js.map +1 -0
  31. package/dist/cron/store.d.ts +20 -0
  32. package/dist/cron/store.js +170 -0
  33. package/dist/cron/store.js.map +1 -0
  34. package/dist/cron/types.d.ts +21 -0
  35. package/dist/cron/types.js +3 -0
  36. package/dist/cron/types.js.map +1 -0
  37. package/dist/embeddings.d.ts +14 -0
  38. package/dist/embeddings.js +61 -0
  39. package/dist/embeddings.js.map +1 -0
  40. package/dist/history.d.ts +6 -0
  41. package/dist/history.js +71 -0
  42. package/dist/history.js.map +1 -0
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.js +231 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/logger.d.ts +1 -0
  47. package/dist/logger.js +24 -0
  48. package/dist/logger.js.map +1 -0
  49. package/dist/mcp.d.ts +43 -0
  50. package/dist/mcp.js +303 -0
  51. package/dist/mcp.js.map +1 -0
  52. package/dist/memory.d.ts +17 -0
  53. package/dist/memory.js +106 -0
  54. package/dist/memory.js.map +1 -0
  55. package/dist/output.d.ts +13 -0
  56. package/dist/output.js +151 -0
  57. package/dist/output.js.map +1 -0
  58. package/dist/providers/index.d.ts +2 -0
  59. package/dist/providers/index.js +19 -0
  60. package/dist/providers/index.js.map +1 -0
  61. package/dist/providers/types.d.ts +5 -0
  62. package/dist/providers/types.js +3 -0
  63. package/dist/providers/types.js.map +1 -0
  64. package/dist/rag-worker.d.ts +10 -0
  65. package/dist/rag-worker.js +84 -0
  66. package/dist/rag-worker.js.map +1 -0
  67. package/dist/rag.d.ts +53 -0
  68. package/dist/rag.js +242 -0
  69. package/dist/rag.js.map +1 -0
  70. package/dist/repl.d.ts +2 -0
  71. package/dist/repl.js +531 -0
  72. package/dist/repl.js.map +1 -0
  73. package/dist/setup.d.ts +1 -0
  74. package/dist/setup.js +104 -0
  75. package/dist/setup.js.map +1 -0
  76. package/dist/tools/cron-logs.d.ts +67 -0
  77. package/dist/tools/cron-logs.js +131 -0
  78. package/dist/tools/cron-logs.js.map +1 -0
  79. package/dist/tools/cron.d.ts +98 -0
  80. package/dist/tools/cron.js +248 -0
  81. package/dist/tools/cron.js.map +1 -0
  82. package/dist/tools/datetime.d.ts +4 -0
  83. package/dist/tools/datetime.js +25 -0
  84. package/dist/tools/datetime.js.map +1 -0
  85. package/dist/tools/index.d.ts +317 -0
  86. package/dist/tools/index.js +28 -0
  87. package/dist/tools/index.js.map +1 -0
  88. package/dist/tools/mcp-url.d.ts +16 -0
  89. package/dist/tools/mcp-url.js +27 -0
  90. package/dist/tools/mcp-url.js.map +1 -0
  91. package/dist/tools/mcp.d.ts +28 -0
  92. package/dist/tools/mcp.js +107 -0
  93. package/dist/tools/mcp.js.map +1 -0
  94. package/dist/tools/memory.d.ts +40 -0
  95. package/dist/tools/memory.js +99 -0
  96. package/dist/tools/memory.js.map +1 -0
  97. package/dist/tools/shell.d.ts +15 -0
  98. package/dist/tools/shell.js +60 -0
  99. package/dist/tools/shell.js.map +1 -0
  100. package/dist/tools/subagent.d.ts +21 -0
  101. package/dist/tools/subagent.js +81 -0
  102. package/dist/tools/subagent.js.map +1 -0
  103. package/dist/tools/time.d.ts +50 -0
  104. package/dist/tools/time.js +61 -0
  105. package/dist/tools/time.js.map +1 -0
  106. package/dist/tools/types.d.ts +8 -0
  107. package/dist/tools/types.js +3 -0
  108. package/dist/tools/types.js.map +1 -0
  109. package/dist/tools/web.d.ts +16 -0
  110. package/dist/tools/web.js +136 -0
  111. package/dist/tools/web.js.map +1 -0
  112. package/package.json +73 -0
package/dist/output.js ADDED
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.startSpinner = startSpinner;
7
+ exports.stopSpinner = stopSpinner;
8
+ exports.printWelcome = printWelcome;
9
+ exports.printAssistantText = printAssistantText;
10
+ exports.printToolCall = printToolCall;
11
+ exports.printToolResult = printToolResult;
12
+ exports.printError = printError;
13
+ exports.printInfo = printInfo;
14
+ exports.printConversationReplay = printConversationReplay;
15
+ exports.printSubAgentStart = printSubAgentStart;
16
+ exports.printSubAgentEnd = printSubAgentEnd;
17
+ exports.printHelp = printHelp;
18
+ const chalk_1 = __importDefault(require("chalk"));
19
+ const MAX_TOOL_OUTPUT_LENGTH = 2000;
20
+ const MAX_REPLAY_LENGTH = 200;
21
+ // Rotating colors for sub-agent prefixes
22
+ const PREFIX_COLORS = [chalk_1.default.magenta, chalk_1.default.blue, chalk_1.default.green, chalk_1.default.yellow];
23
+ function formatPrefix(prefix) {
24
+ if (!prefix)
25
+ return '';
26
+ // Extract numeric id from "sub:N"
27
+ const match = prefix.match(/^sub:(\d+)$/);
28
+ const colorIndex = match ? (parseInt(match[1], 10) - 1) % PREFIX_COLORS.length : 0;
29
+ const colorFn = PREFIX_COLORS[colorIndex];
30
+ return colorFn(`[${prefix}] `);
31
+ }
32
+ // Spinner state
33
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
34
+ let spinnerTimer = null;
35
+ let spinnerFrameIndex = 0;
36
+ function startSpinner(message = 'Thinking') {
37
+ if (spinnerTimer)
38
+ return; // already running
39
+ spinnerFrameIndex = 0;
40
+ process.stdout.write('\x1B[?25l'); // hide cursor
41
+ spinnerTimer = setInterval(() => {
42
+ const frame = SPINNER_FRAMES[spinnerFrameIndex % SPINNER_FRAMES.length];
43
+ process.stdout.write(`\r${chalk_1.default.cyan(frame)} ${chalk_1.default.gray(message)}`);
44
+ spinnerFrameIndex++;
45
+ }, 80);
46
+ }
47
+ function stopSpinner() {
48
+ if (!spinnerTimer)
49
+ return;
50
+ clearInterval(spinnerTimer);
51
+ spinnerTimer = null;
52
+ process.stdout.write('\r\x1B[2K'); // clear line
53
+ process.stdout.write('\x1B[?25h'); // show cursor
54
+ }
55
+ function printWelcome(provider, model) {
56
+ console.log(chalk_1.default.bold.cyan('\n Bernard') + chalk_1.default.gray(' — AI CLI Assistant'));
57
+ console.log(chalk_1.default.gray(` Provider: ${provider} | Model: ${model}`));
58
+ console.log(chalk_1.default.gray(' Type /help for commands, exit to quit\n'));
59
+ }
60
+ function printAssistantText(text, prefix) {
61
+ stopSpinner();
62
+ if (text.trim()) {
63
+ const label = formatPrefix(prefix);
64
+ console.log(label + chalk_1.default.white(text));
65
+ }
66
+ }
67
+ function printToolCall(toolName, args, prefix) {
68
+ stopSpinner();
69
+ const label = formatPrefix(prefix);
70
+ const argsStr = toolName === 'shell'
71
+ ? String(args.command || '')
72
+ : JSON.stringify(args);
73
+ console.log(label + chalk_1.default.yellow(` ▶ ${toolName}`) + chalk_1.default.gray(`: ${argsStr}`));
74
+ }
75
+ function printToolResult(toolName, result, prefix) {
76
+ stopSpinner();
77
+ const label = formatPrefix(prefix);
78
+ let output;
79
+ if (typeof result === 'string') {
80
+ output = result;
81
+ }
82
+ else if (result && typeof result === 'object' && 'output' in result) {
83
+ output = String(result.output);
84
+ }
85
+ else {
86
+ output = JSON.stringify(result, null, 2);
87
+ }
88
+ if (output.length > MAX_TOOL_OUTPUT_LENGTH) {
89
+ output = output.slice(0, MAX_TOOL_OUTPUT_LENGTH) + chalk_1.default.gray('\n ... (truncated)');
90
+ }
91
+ const lines = output.split('\n').map(line => label + chalk_1.default.gray(` ${line}`)).join('\n');
92
+ console.log(lines);
93
+ }
94
+ function printError(message) {
95
+ stopSpinner();
96
+ console.error(chalk_1.default.red(`Error: ${message}`));
97
+ }
98
+ function printInfo(message) {
99
+ console.log(chalk_1.default.gray(message));
100
+ }
101
+ function printConversationReplay(messages) {
102
+ console.log(chalk_1.default.dim(' Previous conversation:'));
103
+ for (const msg of messages) {
104
+ if (msg.role === 'tool')
105
+ continue;
106
+ const text = extractText(msg);
107
+ if (!text)
108
+ continue;
109
+ const truncated = text.length > MAX_REPLAY_LENGTH
110
+ ? text.slice(0, MAX_REPLAY_LENGTH) + '…'
111
+ : text;
112
+ const prefix = msg.role === 'user' ? ' you> ' : ' assistant> ';
113
+ console.log(chalk_1.default.dim(prefix + truncated));
114
+ }
115
+ console.log(chalk_1.default.dim(' ———'));
116
+ console.log();
117
+ }
118
+ function extractText(msg) {
119
+ if (typeof msg.content === 'string')
120
+ return msg.content;
121
+ if (!Array.isArray(msg.content))
122
+ return null;
123
+ const textParts = msg.content
124
+ .filter((p) => typeof p === 'object' && p !== null && 'type' in p && p.type === 'text')
125
+ .map(p => p.text);
126
+ return textParts.length > 0 ? textParts.join(' ') : null;
127
+ }
128
+ function printSubAgentStart(id, task) {
129
+ const colorFn = PREFIX_COLORS[(id - 1) % PREFIX_COLORS.length];
130
+ const displayTask = task.length > 80 ? task.slice(0, 80) + '…' : task;
131
+ console.log(colorFn(`┌─ sub:${id} — ${displayTask}`));
132
+ }
133
+ function printSubAgentEnd(id) {
134
+ const colorFn = PREFIX_COLORS[(id - 1) % PREFIX_COLORS.length];
135
+ console.log(colorFn(`└─ sub:${id} done`));
136
+ }
137
+ function printHelp() {
138
+ console.log(chalk_1.default.cyan('\nCommands:'));
139
+ console.log(chalk_1.default.white(' /help') + chalk_1.default.gray(' — Show this help'));
140
+ console.log(chalk_1.default.white(' /clear') + chalk_1.default.gray(' — Clear conversation history and scratch notes'));
141
+ console.log(chalk_1.default.white(' /memory') + chalk_1.default.gray(' — List persistent memories'));
142
+ console.log(chalk_1.default.white(' /scratch') + chalk_1.default.gray(' — List session scratch notes'));
143
+ console.log(chalk_1.default.white(' /mcp') + chalk_1.default.gray(' — List MCP servers and tools'));
144
+ console.log(chalk_1.default.white(' /cron') + chalk_1.default.gray(' — Show cron jobs and daemon status'));
145
+ console.log(chalk_1.default.white(' /provider') + chalk_1.default.gray(' — Switch LLM provider'));
146
+ console.log(chalk_1.default.white(' /model') + chalk_1.default.gray(' — Switch model for current provider'));
147
+ console.log(chalk_1.default.white(' /options') + chalk_1.default.gray(' — View and set options (max-tokens, shell-timeout)'));
148
+ console.log(chalk_1.default.white(' exit') + chalk_1.default.gray(' — Quit Bernard'));
149
+ console.log();
150
+ }
151
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { LanguageModel } from 'ai';
2
+ export declare function getModel(provider: string, model: string): LanguageModel;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getModel = getModel;
4
+ const anthropic_1 = require("@ai-sdk/anthropic");
5
+ const openai_1 = require("@ai-sdk/openai");
6
+ const xai_1 = require("@ai-sdk/xai");
7
+ function getModel(provider, model) {
8
+ switch (provider) {
9
+ case 'anthropic':
10
+ return (0, anthropic_1.anthropic)(model);
11
+ case 'openai':
12
+ return (0, openai_1.openai)(model);
13
+ case 'xai':
14
+ return (0, xai_1.xai)(model);
15
+ default:
16
+ throw new Error(`Unknown provider: ${provider}. Supported: anthropic, openai, xai`);
17
+ }
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;AAKA,4BAWC;AAhBD,iDAA8C;AAC9C,2CAAwC;AACxC,qCAAkC;AAGlC,SAAgB,QAAQ,CAAC,QAAgB,EAAE,KAAa;IACtD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,IAAA,qBAAS,EAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,QAAQ;YACX,OAAO,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,IAAA,SAAG,EAAC,KAAK,CAAC,CAAC;QACpB;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,qCAAqC,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type ProviderName = 'anthropic' | 'openai' | 'xai';
2
+ export interface ProviderConfig {
3
+ provider: ProviderName;
4
+ model: string;
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Background worker for exit-time RAG fact extraction.
4
+ * Invoked as: node dist/rag-worker.js <tempfile>
5
+ *
6
+ * Reads a JSON temp file containing { serialized, provider, model },
7
+ * extracts facts via LLM, stores them in RAGStore, then cleans up.
8
+ * Runs detached from the parent process — silent failure is fine.
9
+ */
10
+ export {};
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Background worker for exit-time RAG fact extraction.
5
+ * Invoked as: node dist/rag-worker.js <tempfile>
6
+ *
7
+ * Reads a JSON temp file containing { serialized, provider, model },
8
+ * extracts facts via LLM, stores them in RAGStore, then cleans up.
9
+ * Runs detached from the parent process — silent failure is fine.
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const fs = __importStar(require("node:fs"));
46
+ const config_js_1 = require("./config.js");
47
+ const context_js_1 = require("./context.js");
48
+ const rag_js_1 = require("./rag.js");
49
+ async function main() {
50
+ const tempFile = process.argv[2];
51
+ if (!tempFile)
52
+ process.exit(1);
53
+ // Read and parse the temp file
54
+ let payload;
55
+ try {
56
+ const raw = fs.readFileSync(tempFile, 'utf-8');
57
+ payload = JSON.parse(raw);
58
+ }
59
+ catch {
60
+ process.exit(1);
61
+ }
62
+ if (!payload.serialized || !payload.provider || !payload.model) {
63
+ fs.unlinkSync(tempFile);
64
+ process.exit(1);
65
+ }
66
+ // Load config (reads .env + stored keys), override provider/model from temp file
67
+ const config = (0, config_js_1.loadConfig)({ provider: payload.provider, model: payload.model });
68
+ // Extract facts via LLM
69
+ const facts = await (0, context_js_1.extractFacts)(payload.serialized, config);
70
+ // Store facts if any were extracted
71
+ if (facts.length > 0) {
72
+ const ragStore = new rag_js_1.RAGStore();
73
+ await ragStore.addFacts(facts, 'exit');
74
+ }
75
+ // Clean up temp file
76
+ try {
77
+ fs.unlinkSync(tempFile);
78
+ }
79
+ catch {
80
+ // Ignore — file may already be gone
81
+ }
82
+ }
83
+ main().catch(() => process.exit(1));
84
+ //# sourceMappingURL=rag-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-worker.js","sourceRoot":"","sources":["../src/rag-worker.ts"],"names":[],"mappings":";;AAEA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,4CAA8B;AAC9B,2CAAyC;AACzC,6CAA4C;AAC5C,qCAAoC;AAQpC,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/B,+BAA+B;IAC/B,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/D,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iFAAiF;IACjF,MAAM,MAAM,GAAG,IAAA,sBAAU,EAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAEhF,wBAAwB;IACxB,MAAM,KAAK,GAAG,MAAM,IAAA,yBAAY,EAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7D,oCAAoC;IACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAC;QAChC,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
package/dist/rag.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ export interface RAGMemory {
2
+ id: string;
3
+ fact: string;
4
+ embedding: number[];
5
+ source: string;
6
+ createdAt: string;
7
+ accessCount: number;
8
+ lastAccessed?: string;
9
+ }
10
+ export interface RAGSearchResult {
11
+ fact: string;
12
+ similarity: number;
13
+ }
14
+ export interface RAGStoreConfig {
15
+ topK?: number;
16
+ similarityThreshold?: number;
17
+ maxMemories?: number;
18
+ }
19
+ export declare class RAGStore {
20
+ private memories;
21
+ private topK;
22
+ private similarityThreshold;
23
+ private maxMemories;
24
+ constructor(config?: RAGStoreConfig);
25
+ /** Delete .pending-*.json temp files older than 1 hour (handles crashed workers). */
26
+ static cleanupStaleTemp(): void;
27
+ /**
28
+ * Embed and store new facts. Deduplicates against existing memories.
29
+ * Returns the number of facts actually added.
30
+ */
31
+ addFacts(facts: string[], source: string): Promise<number>;
32
+ /**
33
+ * Search for memories relevant to the query.
34
+ * Returns top-k results above the similarity threshold, sorted by similarity.
35
+ */
36
+ search(query: string): Promise<RAGSearchResult[]>;
37
+ /** List all facts as plain text lines. */
38
+ listFacts(): string[];
39
+ /** Clear all memories. */
40
+ clear(): void;
41
+ /** Total number of stored memories. */
42
+ count(): number;
43
+ /**
44
+ * Prune memories if over the cap.
45
+ * Score = recency decay (half-life 90 days) + log2(accessCount + 1)
46
+ * Keeps top N by score.
47
+ */
48
+ private prune;
49
+ /** Load memories from disk. */
50
+ private load;
51
+ /** Persist memories to disk atomically (write to tmp, then rename). */
52
+ private persist;
53
+ }
package/dist/rag.js ADDED
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RAGStore = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const os = __importStar(require("node:os"));
40
+ const embeddings_js_1 = require("./embeddings.js");
41
+ const logger_js_1 = require("./logger.js");
42
+ const RAG_DIR = path.join(os.homedir(), '.bernard', 'rag');
43
+ const MEMORIES_FILE = path.join(RAG_DIR, 'memories.json');
44
+ const DEFAULT_TOP_K = 5;
45
+ const DEFAULT_SIMILARITY_THRESHOLD = 0.35;
46
+ const DEFAULT_MAX_MEMORIES = 5000;
47
+ const DEDUP_THRESHOLD = 0.92;
48
+ const PRUNE_HALF_LIFE_DAYS = 90;
49
+ const STALE_TEMP_MAX_AGE_MS = 60 * 60 * 1000; // 1 hour
50
+ class RAGStore {
51
+ memories = [];
52
+ topK;
53
+ similarityThreshold;
54
+ maxMemories;
55
+ constructor(config) {
56
+ this.topK = config?.topK ?? DEFAULT_TOP_K;
57
+ this.similarityThreshold = config?.similarityThreshold ?? DEFAULT_SIMILARITY_THRESHOLD;
58
+ this.maxMemories = config?.maxMemories ?? DEFAULT_MAX_MEMORIES;
59
+ fs.mkdirSync(RAG_DIR, { recursive: true });
60
+ this.load();
61
+ RAGStore.cleanupStaleTemp();
62
+ }
63
+ /** Delete .pending-*.json temp files older than 1 hour (handles crashed workers). */
64
+ static cleanupStaleTemp() {
65
+ try {
66
+ const entries = fs.readdirSync(RAG_DIR);
67
+ const now = Date.now();
68
+ for (const entry of entries) {
69
+ if (!entry.startsWith('.pending-') || !entry.endsWith('.json'))
70
+ continue;
71
+ const filePath = path.join(RAG_DIR, entry);
72
+ try {
73
+ const stat = fs.statSync(filePath);
74
+ if (now - stat.mtimeMs > STALE_TEMP_MAX_AGE_MS) {
75
+ fs.unlinkSync(filePath);
76
+ (0, logger_js_1.debugLog)('rag:cleanupStaleTemp', `Deleted stale temp file: ${entry}`);
77
+ }
78
+ }
79
+ catch {
80
+ // Ignore per-file errors
81
+ }
82
+ }
83
+ }
84
+ catch {
85
+ // Ignore — directory may not exist yet
86
+ }
87
+ }
88
+ /**
89
+ * Embed and store new facts. Deduplicates against existing memories.
90
+ * Returns the number of facts actually added.
91
+ */
92
+ async addFacts(facts, source) {
93
+ if (facts.length === 0)
94
+ return 0;
95
+ const provider = await (0, embeddings_js_1.getEmbeddingProvider)();
96
+ if (!provider) {
97
+ (0, logger_js_1.debugLog)('rag:addFacts', 'No embedding provider available, skipping');
98
+ return 0;
99
+ }
100
+ let embeddings;
101
+ try {
102
+ embeddings = await provider.embed(facts);
103
+ }
104
+ catch (err) {
105
+ (0, logger_js_1.debugLog)('rag:addFacts', `Embedding failed: ${err instanceof Error ? err.message : String(err)}`);
106
+ return 0;
107
+ }
108
+ let added = 0;
109
+ const now = new Date().toISOString();
110
+ for (let i = 0; i < facts.length; i++) {
111
+ const fact = facts[i];
112
+ const embedding = embeddings[i];
113
+ // Deduplicate: skip if too similar to an existing memory
114
+ const isDuplicate = this.memories.some((m) => (0, embeddings_js_1.cosineSimilarity)(m.embedding, embedding) > DEDUP_THRESHOLD);
115
+ if (isDuplicate) {
116
+ (0, logger_js_1.debugLog)('rag:dedup', `Skipping duplicate fact: ${fact.slice(0, 80)}`);
117
+ continue;
118
+ }
119
+ this.memories.push({
120
+ id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
121
+ fact,
122
+ embedding,
123
+ source,
124
+ createdAt: now,
125
+ accessCount: 0,
126
+ });
127
+ added++;
128
+ }
129
+ if (added > 0) {
130
+ this.prune();
131
+ this.persist();
132
+ }
133
+ (0, logger_js_1.debugLog)('rag:addFacts', { added, total: this.memories.length });
134
+ return added;
135
+ }
136
+ /**
137
+ * Search for memories relevant to the query.
138
+ * Returns top-k results above the similarity threshold, sorted by similarity.
139
+ */
140
+ async search(query) {
141
+ if (this.memories.length === 0)
142
+ return [];
143
+ const provider = await (0, embeddings_js_1.getEmbeddingProvider)();
144
+ if (!provider)
145
+ return [];
146
+ let queryEmbedding;
147
+ try {
148
+ const embeddings = await provider.embed([query]);
149
+ queryEmbedding = embeddings[0];
150
+ }
151
+ catch (err) {
152
+ (0, logger_js_1.debugLog)('rag:search', `Query embedding failed: ${err instanceof Error ? err.message : String(err)}`);
153
+ return [];
154
+ }
155
+ const scored = this.memories
156
+ .map((m) => ({
157
+ memory: m,
158
+ similarity: (0, embeddings_js_1.cosineSimilarity)(queryEmbedding, m.embedding),
159
+ }))
160
+ .filter((s) => s.similarity >= this.similarityThreshold)
161
+ .sort((a, b) => b.similarity - a.similarity)
162
+ .slice(0, this.topK);
163
+ // Update access metadata
164
+ const now = new Date().toISOString();
165
+ for (const { memory } of scored) {
166
+ memory.accessCount++;
167
+ memory.lastAccessed = now;
168
+ }
169
+ if (scored.length > 0) {
170
+ this.persist();
171
+ }
172
+ return scored.map((s) => ({
173
+ fact: s.memory.fact,
174
+ similarity: s.similarity,
175
+ }));
176
+ }
177
+ /** List all facts as plain text lines. */
178
+ listFacts() {
179
+ return this.memories.map((m) => {
180
+ const date = m.createdAt.slice(0, 10);
181
+ return `[${date}] (accessed ${m.accessCount}x) ${m.fact}`;
182
+ });
183
+ }
184
+ /** Clear all memories. */
185
+ clear() {
186
+ this.memories = [];
187
+ this.persist();
188
+ }
189
+ /** Total number of stored memories. */
190
+ count() {
191
+ return this.memories.length;
192
+ }
193
+ /**
194
+ * Prune memories if over the cap.
195
+ * Score = recency decay (half-life 90 days) + log2(accessCount + 1)
196
+ * Keeps top N by score.
197
+ */
198
+ prune() {
199
+ if (this.memories.length <= this.maxMemories)
200
+ return;
201
+ const now = Date.now();
202
+ const halfLifeMs = PRUNE_HALF_LIFE_DAYS * 24 * 60 * 60 * 1000;
203
+ const scored = this.memories.map((m) => {
204
+ const ageMs = now - new Date(m.createdAt).getTime();
205
+ const recency = Math.pow(0.5, ageMs / halfLifeMs);
206
+ const access = Math.log2(m.accessCount + 1);
207
+ return { memory: m, score: recency + access };
208
+ });
209
+ scored.sort((a, b) => b.score - a.score);
210
+ this.memories = scored.slice(0, this.maxMemories).map((s) => s.memory);
211
+ (0, logger_js_1.debugLog)('rag:prune', { kept: this.memories.length });
212
+ }
213
+ /** Load memories from disk. */
214
+ load() {
215
+ try {
216
+ if (!fs.existsSync(MEMORIES_FILE))
217
+ return;
218
+ const data = fs.readFileSync(MEMORIES_FILE, 'utf-8');
219
+ const parsed = JSON.parse(data);
220
+ if (Array.isArray(parsed)) {
221
+ this.memories = parsed;
222
+ }
223
+ }
224
+ catch (err) {
225
+ (0, logger_js_1.debugLog)('rag:load', `Failed to load memories: ${err instanceof Error ? err.message : String(err)}`);
226
+ this.memories = [];
227
+ }
228
+ }
229
+ /** Persist memories to disk atomically (write to tmp, then rename). */
230
+ persist() {
231
+ try {
232
+ const tmpFile = MEMORIES_FILE + '.tmp';
233
+ fs.writeFileSync(tmpFile, JSON.stringify(this.memories), 'utf-8');
234
+ fs.renameSync(tmpFile, MEMORIES_FILE);
235
+ }
236
+ catch (err) {
237
+ (0, logger_js_1.debugLog)('rag:persist', `Failed to persist memories: ${err instanceof Error ? err.message : String(err)}`);
238
+ }
239
+ }
240
+ }
241
+ exports.RAGStore = RAGStore;
242
+ //# sourceMappingURL=rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag.js","sourceRoot":"","sources":["../src/rag.ts"],"names":[],"mappings":"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"}
package/dist/repl.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { type BernardConfig } from './config.js';
2
+ export declare function startRepl(config: BernardConfig, alertContext?: string, resume?: boolean): Promise<void>;