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.
- package/.env.example +21 -0
- package/LICENSE +21 -0
- package/README.md +629 -0
- package/dist/agent.d.ts +24 -0
- package/dist/agent.js +174 -0
- package/dist/agent.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.js +267 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +37 -0
- package/dist/context.js +245 -0
- package/dist/context.js.map +1 -0
- package/dist/cron/client.d.ts +4 -0
- package/dist/cron/client.js +113 -0
- package/dist/cron/client.js.map +1 -0
- package/dist/cron/daemon.d.ts +1 -0
- package/dist/cron/daemon.js +132 -0
- package/dist/cron/daemon.js.map +1 -0
- package/dist/cron/log-store.d.ts +51 -0
- package/dist/cron/log-store.js +135 -0
- package/dist/cron/log-store.js.map +1 -0
- package/dist/cron/notify.d.ts +7 -0
- package/dist/cron/notify.js +136 -0
- package/dist/cron/notify.js.map +1 -0
- package/dist/cron/runner.d.ts +6 -0
- package/dist/cron/runner.js +219 -0
- package/dist/cron/runner.js.map +1 -0
- package/dist/cron/scheduler.d.ts +16 -0
- package/dist/cron/scheduler.js +105 -0
- package/dist/cron/scheduler.js.map +1 -0
- package/dist/cron/store.d.ts +20 -0
- package/dist/cron/store.js +170 -0
- package/dist/cron/store.js.map +1 -0
- package/dist/cron/types.d.ts +21 -0
- package/dist/cron/types.js +3 -0
- package/dist/cron/types.js.map +1 -0
- package/dist/embeddings.d.ts +14 -0
- package/dist/embeddings.js +61 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/history.d.ts +6 -0
- package/dist/history.js +71 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +231 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +1 -0
- package/dist/logger.js +24 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp.d.ts +43 -0
- package/dist/mcp.js +303 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +17 -0
- package/dist/memory.js +106 -0
- package/dist/memory.js.map +1 -0
- package/dist/output.d.ts +13 -0
- package/dist/output.js +151 -0
- package/dist/output.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/types.d.ts +5 -0
- package/dist/providers/types.js +3 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/rag-worker.d.ts +10 -0
- package/dist/rag-worker.js +84 -0
- package/dist/rag-worker.js.map +1 -0
- package/dist/rag.d.ts +53 -0
- package/dist/rag.js +242 -0
- package/dist/rag.js.map +1 -0
- package/dist/repl.d.ts +2 -0
- package/dist/repl.js +531 -0
- package/dist/repl.js.map +1 -0
- package/dist/setup.d.ts +1 -0
- package/dist/setup.js +104 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/cron-logs.d.ts +67 -0
- package/dist/tools/cron-logs.js +131 -0
- package/dist/tools/cron-logs.js.map +1 -0
- package/dist/tools/cron.d.ts +98 -0
- package/dist/tools/cron.js +248 -0
- package/dist/tools/cron.js.map +1 -0
- package/dist/tools/datetime.d.ts +4 -0
- package/dist/tools/datetime.js +25 -0
- package/dist/tools/datetime.js.map +1 -0
- package/dist/tools/index.d.ts +317 -0
- package/dist/tools/index.js +28 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/mcp-url.d.ts +16 -0
- package/dist/tools/mcp-url.js +27 -0
- package/dist/tools/mcp-url.js.map +1 -0
- package/dist/tools/mcp.d.ts +28 -0
- package/dist/tools/mcp.js +107 -0
- package/dist/tools/mcp.js.map +1 -0
- package/dist/tools/memory.d.ts +40 -0
- package/dist/tools/memory.js +99 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/shell.d.ts +15 -0
- package/dist/tools/shell.js +60 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/subagent.d.ts +21 -0
- package/dist/tools/subagent.js +81 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/time.d.ts +50 -0
- package/dist/tools/time.js +61 -0
- package/dist/tools/time.js.map +1 -0
- package/dist/tools/types.d.ts +8 -0
- package/dist/tools/types.js +3 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/web.d.ts +16 -0
- package/dist/tools/web.js +136 -0
- package/dist/tools/web.js.map +1 -0
- 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,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 @@
|
|
|
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
|
package/dist/rag.js.map
ADDED
|
@@ -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