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
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CronJob, CronAlert } from './types.js';
|
|
2
|
+
export declare class CronStore {
|
|
3
|
+
constructor();
|
|
4
|
+
static get cronDir(): string;
|
|
5
|
+
static get jobsFile(): string;
|
|
6
|
+
static get alertsDir(): string;
|
|
7
|
+
static get pidFile(): string;
|
|
8
|
+
static get logFile(): string;
|
|
9
|
+
loadJobs(): CronJob[];
|
|
10
|
+
saveJobs(jobs: CronJob[]): void;
|
|
11
|
+
getJob(id: string): CronJob | undefined;
|
|
12
|
+
createJob(name: string, schedule: string, prompt: string): CronJob;
|
|
13
|
+
updateJob(id: string, updates: Partial<Pick<CronJob, 'name' | 'schedule' | 'prompt' | 'enabled' | 'lastRun' | 'lastRunStatus' | 'lastResult'>>): CronJob | undefined;
|
|
14
|
+
deleteJob(id: string): boolean;
|
|
15
|
+
createAlert(alert: Omit<CronAlert, 'id' | 'timestamp' | 'acknowledged'>): CronAlert;
|
|
16
|
+
getAlert(id: string): CronAlert | undefined;
|
|
17
|
+
listAlerts(): CronAlert[];
|
|
18
|
+
acknowledgeAlert(id: string): boolean;
|
|
19
|
+
private atomicWrite;
|
|
20
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
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.CronStore = 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 crypto = __importStar(require("node:crypto"));
|
|
41
|
+
const CRON_DIR = path.join(os.homedir(), '.bernard', 'cron');
|
|
42
|
+
const JOBS_FILE = path.join(CRON_DIR, 'jobs.json');
|
|
43
|
+
const ALERTS_DIR = path.join(CRON_DIR, 'alerts');
|
|
44
|
+
const PID_FILE = path.join(CRON_DIR, 'daemon.pid');
|
|
45
|
+
const LOG_FILE = path.join(CRON_DIR, 'daemon.log');
|
|
46
|
+
const MAX_JOBS = 50;
|
|
47
|
+
class CronStore {
|
|
48
|
+
constructor() {
|
|
49
|
+
fs.mkdirSync(CRON_DIR, { recursive: true });
|
|
50
|
+
fs.mkdirSync(ALERTS_DIR, { recursive: true });
|
|
51
|
+
// Ensure jobs.json exists so daemon can fs.watch it
|
|
52
|
+
if (!fs.existsSync(JOBS_FILE)) {
|
|
53
|
+
this.atomicWrite(JOBS_FILE, '[]');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// --- Paths ---
|
|
57
|
+
static get cronDir() { return CRON_DIR; }
|
|
58
|
+
static get jobsFile() { return JOBS_FILE; }
|
|
59
|
+
static get alertsDir() { return ALERTS_DIR; }
|
|
60
|
+
static get pidFile() { return PID_FILE; }
|
|
61
|
+
static get logFile() { return LOG_FILE; }
|
|
62
|
+
// --- Jobs ---
|
|
63
|
+
loadJobs() {
|
|
64
|
+
if (!fs.existsSync(JOBS_FILE))
|
|
65
|
+
return [];
|
|
66
|
+
const raw = fs.readFileSync(JOBS_FILE, 'utf-8');
|
|
67
|
+
try {
|
|
68
|
+
return JSON.parse(raw);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
saveJobs(jobs) {
|
|
75
|
+
this.atomicWrite(JOBS_FILE, JSON.stringify(jobs, null, 2));
|
|
76
|
+
}
|
|
77
|
+
getJob(id) {
|
|
78
|
+
return this.loadJobs().find(j => j.id === id);
|
|
79
|
+
}
|
|
80
|
+
createJob(name, schedule, prompt) {
|
|
81
|
+
const jobs = this.loadJobs();
|
|
82
|
+
if (jobs.length >= MAX_JOBS) {
|
|
83
|
+
throw new Error(`Maximum of ${MAX_JOBS} cron jobs reached.`);
|
|
84
|
+
}
|
|
85
|
+
const job = {
|
|
86
|
+
id: crypto.randomUUID(),
|
|
87
|
+
name,
|
|
88
|
+
schedule,
|
|
89
|
+
prompt,
|
|
90
|
+
enabled: true,
|
|
91
|
+
createdAt: new Date().toISOString(),
|
|
92
|
+
};
|
|
93
|
+
jobs.push(job);
|
|
94
|
+
this.saveJobs(jobs);
|
|
95
|
+
return job;
|
|
96
|
+
}
|
|
97
|
+
updateJob(id, updates) {
|
|
98
|
+
const jobs = this.loadJobs();
|
|
99
|
+
const idx = jobs.findIndex(j => j.id === id);
|
|
100
|
+
if (idx === -1)
|
|
101
|
+
return undefined;
|
|
102
|
+
Object.assign(jobs[idx], updates);
|
|
103
|
+
this.saveJobs(jobs);
|
|
104
|
+
return jobs[idx];
|
|
105
|
+
}
|
|
106
|
+
deleteJob(id) {
|
|
107
|
+
const jobs = this.loadJobs();
|
|
108
|
+
const filtered = jobs.filter(j => j.id !== id);
|
|
109
|
+
if (filtered.length === jobs.length)
|
|
110
|
+
return false;
|
|
111
|
+
this.saveJobs(filtered);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
// --- Alerts ---
|
|
115
|
+
createAlert(alert) {
|
|
116
|
+
const full = {
|
|
117
|
+
...alert,
|
|
118
|
+
id: crypto.randomUUID(),
|
|
119
|
+
timestamp: new Date().toISOString(),
|
|
120
|
+
acknowledged: false,
|
|
121
|
+
};
|
|
122
|
+
const filePath = path.join(ALERTS_DIR, `${full.id}.json`);
|
|
123
|
+
this.atomicWrite(filePath, JSON.stringify(full, null, 2));
|
|
124
|
+
return full;
|
|
125
|
+
}
|
|
126
|
+
getAlert(id) {
|
|
127
|
+
const filePath = path.join(ALERTS_DIR, `${id}.json`);
|
|
128
|
+
if (!fs.existsSync(filePath))
|
|
129
|
+
return undefined;
|
|
130
|
+
try {
|
|
131
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
listAlerts() {
|
|
138
|
+
if (!fs.existsSync(ALERTS_DIR))
|
|
139
|
+
return [];
|
|
140
|
+
const files = fs.readdirSync(ALERTS_DIR).filter(f => f.endsWith('.json'));
|
|
141
|
+
const alerts = [];
|
|
142
|
+
for (const file of files) {
|
|
143
|
+
try {
|
|
144
|
+
const raw = fs.readFileSync(path.join(ALERTS_DIR, file), 'utf-8');
|
|
145
|
+
alerts.push(JSON.parse(raw));
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// skip corrupted alert files
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return alerts.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
152
|
+
}
|
|
153
|
+
acknowledgeAlert(id) {
|
|
154
|
+
const alert = this.getAlert(id);
|
|
155
|
+
if (!alert)
|
|
156
|
+
return false;
|
|
157
|
+
alert.acknowledged = true;
|
|
158
|
+
const filePath = path.join(ALERTS_DIR, `${id}.json`);
|
|
159
|
+
this.atomicWrite(filePath, JSON.stringify(alert, null, 2));
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
// --- Utility ---
|
|
163
|
+
atomicWrite(filePath, data) {
|
|
164
|
+
const tmp = filePath + '.tmp';
|
|
165
|
+
fs.writeFileSync(tmp, data, 'utf-8');
|
|
166
|
+
fs.renameSync(tmp, filePath);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.CronStore = CronStore;
|
|
170
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cron/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface CronJob {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
schedule: string;
|
|
5
|
+
prompt: string;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
lastRun?: string;
|
|
9
|
+
lastRunStatus?: 'success' | 'error' | 'running';
|
|
10
|
+
lastResult?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CronAlert {
|
|
13
|
+
id: string;
|
|
14
|
+
jobId: string;
|
|
15
|
+
jobName: string;
|
|
16
|
+
message: string;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
prompt: string;
|
|
19
|
+
response: string;
|
|
20
|
+
acknowledged: boolean;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cron/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface EmbeddingProvider {
|
|
2
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
3
|
+
dimensions(): number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Lazily load fastembed and return an EmbeddingProvider.
|
|
7
|
+
* Returns null if fastembed is unavailable or fails to initialize.
|
|
8
|
+
* Caches the result after first call.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getEmbeddingProvider(): Promise<EmbeddingProvider | null>;
|
|
11
|
+
/** Cosine similarity between two vectors. Returns 0 for zero-length vectors. */
|
|
12
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
13
|
+
/** Reset cached provider — for testing only. */
|
|
14
|
+
export declare function _resetEmbeddingProvider(): void;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getEmbeddingProvider = getEmbeddingProvider;
|
|
4
|
+
exports.cosineSimilarity = cosineSimilarity;
|
|
5
|
+
exports._resetEmbeddingProvider = _resetEmbeddingProvider;
|
|
6
|
+
const logger_js_1 = require("./logger.js");
|
|
7
|
+
let cachedProvider;
|
|
8
|
+
/**
|
|
9
|
+
* Lazily load fastembed and return an EmbeddingProvider.
|
|
10
|
+
* Returns null if fastembed is unavailable or fails to initialize.
|
|
11
|
+
* Caches the result after first call.
|
|
12
|
+
*/
|
|
13
|
+
async function getEmbeddingProvider() {
|
|
14
|
+
if (cachedProvider !== undefined)
|
|
15
|
+
return cachedProvider;
|
|
16
|
+
try {
|
|
17
|
+
const { EmbeddingModel, FlagEmbedding } = await import('fastembed');
|
|
18
|
+
const model = await FlagEmbedding.init({
|
|
19
|
+
model: EmbeddingModel.AllMiniLML6V2,
|
|
20
|
+
});
|
|
21
|
+
cachedProvider = {
|
|
22
|
+
async embed(texts) {
|
|
23
|
+
const results = [];
|
|
24
|
+
for await (const batch of model.embed(texts)) {
|
|
25
|
+
results.push(...batch);
|
|
26
|
+
}
|
|
27
|
+
return results;
|
|
28
|
+
},
|
|
29
|
+
dimensions() {
|
|
30
|
+
return 384;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
return cachedProvider;
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
(0, logger_js_1.debugLog)('embeddings:init', `Failed to load fastembed: ${err instanceof Error ? err.message : String(err)}`);
|
|
37
|
+
cachedProvider = null;
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Cosine similarity between two vectors. Returns 0 for zero-length vectors. */
|
|
42
|
+
function cosineSimilarity(a, b) {
|
|
43
|
+
if (a.length !== b.length || a.length === 0)
|
|
44
|
+
return 0;
|
|
45
|
+
let dot = 0;
|
|
46
|
+
let normA = 0;
|
|
47
|
+
let normB = 0;
|
|
48
|
+
for (let i = 0; i < a.length; i++) {
|
|
49
|
+
dot += a[i] * b[i];
|
|
50
|
+
normA += a[i] * a[i];
|
|
51
|
+
normB += b[i] * b[i];
|
|
52
|
+
}
|
|
53
|
+
if (normA === 0 || normB === 0)
|
|
54
|
+
return 0;
|
|
55
|
+
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
56
|
+
}
|
|
57
|
+
/** Reset cached provider — for testing only. */
|
|
58
|
+
function _resetEmbeddingProvider() {
|
|
59
|
+
cachedProvider = undefined;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":";;AAcA,oDA4BC;AAGD,4CAeC;AAGD,0DAEC;AAjED,2CAAuC;AAOvC,IAAI,cAAoD,CAAC;AAEzD;;;;GAIG;AACI,KAAK,UAAU,oBAAoB;IACxC,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;YACrC,KAAK,EAAE,cAAc,CAAC,aAAa;SACpC,CAAC,CAAC;QAEH,cAAc,GAAG;YACf,KAAK,CAAC,KAAK,CAAC,KAAe;gBACzB,MAAM,OAAO,GAAe,EAAE,CAAC;gBAC/B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7C,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;gBACzB,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,UAAU;gBACR,OAAO,GAAG,CAAC;YACb,CAAC;SACF,CAAC;QAEF,OAAO,cAAc,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAA,oBAAQ,EAAC,iBAAiB,EAAE,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7G,cAAc,GAAG,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,SAAgB,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,gDAAgD;AAChD,SAAgB,uBAAuB;IACrC,cAAc,GAAG,SAAS,CAAC;AAC7B,CAAC"}
|
package/dist/history.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
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.HistoryStore = 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 BERNARD_DIR = path.join(os.homedir(), '.bernard');
|
|
41
|
+
const HISTORY_FILE = path.join(BERNARD_DIR, 'conversation-history.json');
|
|
42
|
+
class HistoryStore {
|
|
43
|
+
load() {
|
|
44
|
+
try {
|
|
45
|
+
const data = fs.readFileSync(HISTORY_FILE, 'utf-8');
|
|
46
|
+
const parsed = JSON.parse(data);
|
|
47
|
+
if (!Array.isArray(parsed))
|
|
48
|
+
return [];
|
|
49
|
+
return parsed.filter((entry) => typeof entry === 'object' && entry !== null && 'role' in entry);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
save(messages) {
|
|
56
|
+
fs.mkdirSync(BERNARD_DIR, { recursive: true });
|
|
57
|
+
const tmp = HISTORY_FILE + '.tmp';
|
|
58
|
+
fs.writeFileSync(tmp, JSON.stringify(messages, null, 2), 'utf-8');
|
|
59
|
+
fs.renameSync(tmp, HISTORY_FILE);
|
|
60
|
+
}
|
|
61
|
+
clear() {
|
|
62
|
+
try {
|
|
63
|
+
fs.unlinkSync(HISTORY_FILE);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// file may not exist — ignore
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.HistoryStore = HistoryStore;
|
|
71
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAC9B,gDAAkC;AAClC,4CAA8B;AAG9B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACxD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,2BAA2B,CAAC,CAAC;AAEzE,MAAa,YAAY;IACvB,IAAI;QACF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAc,EAAE,EAAE,CACtC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,CAC9C,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAuB;QAC1B,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,YAAY,GAAG,MAAM,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACnC,CAAC;IAED,KAAK;QACH,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;CACF;AA5BD,oCA4BC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const commander_1 = require("commander");
|
|
38
|
+
const readline = __importStar(require("node:readline"));
|
|
39
|
+
const config_js_1 = require("./config.js");
|
|
40
|
+
const repl_js_1 = require("./repl.js");
|
|
41
|
+
const output_js_1 = require("./output.js");
|
|
42
|
+
const store_js_1 = require("./cron/store.js");
|
|
43
|
+
const mcp_js_1 = require("./mcp.js");
|
|
44
|
+
const setup_js_1 = require("./setup.js");
|
|
45
|
+
const program = new commander_1.Command();
|
|
46
|
+
program
|
|
47
|
+
.name('bernard')
|
|
48
|
+
.description('Local CLI AI agent with multi-provider support')
|
|
49
|
+
.version('0.1.0')
|
|
50
|
+
.option('-p, --provider <provider>', 'LLM provider (anthropic, openai, xai)')
|
|
51
|
+
.option('-m, --model <model>', 'Model name')
|
|
52
|
+
.option('-r, --resume', 'Resume the previous conversation')
|
|
53
|
+
.option('--alert <id>', 'Open with cron alert context')
|
|
54
|
+
.action(async (opts) => {
|
|
55
|
+
try {
|
|
56
|
+
await (0, setup_js_1.runFirstTimeSetup)();
|
|
57
|
+
const config = (0, config_js_1.loadConfig)({
|
|
58
|
+
provider: opts.provider,
|
|
59
|
+
model: opts.model,
|
|
60
|
+
});
|
|
61
|
+
let alertContext;
|
|
62
|
+
if (opts.alert) {
|
|
63
|
+
const store = new store_js_1.CronStore();
|
|
64
|
+
const alert = store.getAlert(opts.alert);
|
|
65
|
+
if (!alert) {
|
|
66
|
+
(0, output_js_1.printError)(`Alert "${opts.alert}" not found.`);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
store.acknowledgeAlert(alert.id);
|
|
70
|
+
alertContext = `## Cron Alert
|
|
71
|
+
|
|
72
|
+
This session was opened in response to a cron job alert.
|
|
73
|
+
|
|
74
|
+
**Job:** ${alert.jobName}
|
|
75
|
+
**Alert Time:** ${alert.timestamp}
|
|
76
|
+
**Alert Message:** ${alert.message}
|
|
77
|
+
**Original Job Prompt:** ${alert.prompt}
|
|
78
|
+
**AI Response:** ${alert.response}
|
|
79
|
+
|
|
80
|
+
The user has been notified and this session is open for them to review and act on this alert. Help the user understand and address the issue described above.`;
|
|
81
|
+
(0, output_js_1.printInfo)(`\n Alert from cron job: ${alert.jobName}`);
|
|
82
|
+
(0, output_js_1.printInfo)(` Message: ${alert.message}`);
|
|
83
|
+
(0, output_js_1.printInfo)(` Time: ${alert.timestamp}\n`);
|
|
84
|
+
}
|
|
85
|
+
(0, output_js_1.printWelcome)(config.provider, config.model);
|
|
86
|
+
await (0, repl_js_1.startRepl)(config, alertContext, !!opts.resume);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
90
|
+
(0, output_js_1.printError)(message);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
program
|
|
95
|
+
.command('add-key <provider> <key>')
|
|
96
|
+
.description('Store an API key for a provider')
|
|
97
|
+
.action((provider, key) => {
|
|
98
|
+
try {
|
|
99
|
+
(0, config_js_1.saveProviderKey)(provider, key);
|
|
100
|
+
(0, output_js_1.printInfo)(`API key for "${provider}" saved successfully.`);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
104
|
+
(0, output_js_1.printError)(message);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
program
|
|
109
|
+
.command('providers')
|
|
110
|
+
.description('List supported providers and their API key status')
|
|
111
|
+
.action(() => {
|
|
112
|
+
const statuses = (0, config_js_1.getProviderKeyStatus)();
|
|
113
|
+
(0, output_js_1.printInfo)('Providers:');
|
|
114
|
+
for (const { provider, hasKey } of statuses) {
|
|
115
|
+
const envVar = config_js_1.PROVIDER_ENV_VARS[provider];
|
|
116
|
+
const status = hasKey ? '\u2713' : '\u2717';
|
|
117
|
+
(0, output_js_1.printInfo)(` ${status} ${provider} (${envVar})`);
|
|
118
|
+
}
|
|
119
|
+
if (statuses.some((s) => !s.hasKey)) {
|
|
120
|
+
(0, output_js_1.printInfo)('\nTo add a key: bernard add-key <provider> <key>');
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
program
|
|
124
|
+
.command('list-options')
|
|
125
|
+
.description('List configurable options and their current values')
|
|
126
|
+
.action(() => {
|
|
127
|
+
try {
|
|
128
|
+
const config = (0, config_js_1.loadConfig)();
|
|
129
|
+
(0, output_js_1.printInfo)('Options:');
|
|
130
|
+
for (const [name, opt] of Object.entries(config_js_1.OPTIONS_REGISTRY)) {
|
|
131
|
+
const current = config[opt.configKey];
|
|
132
|
+
const isDefault = current === opt.default;
|
|
133
|
+
const label = isDefault ? '(default)' : '(custom)';
|
|
134
|
+
(0, output_js_1.printInfo)(` ${name} = ${current} ${label}`);
|
|
135
|
+
(0, output_js_1.printInfo)(` ${opt.description}`);
|
|
136
|
+
(0, output_js_1.printInfo)(` Env var: ${opt.envVar}`);
|
|
137
|
+
}
|
|
138
|
+
(0, output_js_1.printInfo)('\nTo set options from chat: start bernard and use /options');
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
142
|
+
(0, output_js_1.printError)(message);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
program
|
|
147
|
+
.command('reset-option <option>')
|
|
148
|
+
.description('Reset a single option to its default value')
|
|
149
|
+
.action((option) => {
|
|
150
|
+
try {
|
|
151
|
+
if (!config_js_1.OPTIONS_REGISTRY[option]) {
|
|
152
|
+
(0, output_js_1.printError)(`Unknown option "${option}". Valid options: ${Object.keys(config_js_1.OPTIONS_REGISTRY).join(', ')}`);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
(0, config_js_1.resetOption)(option);
|
|
156
|
+
(0, output_js_1.printInfo)(`Option "${option}" reset to default (${config_js_1.OPTIONS_REGISTRY[option].default}).`);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
160
|
+
(0, output_js_1.printError)(message);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
program
|
|
165
|
+
.command('reset-options')
|
|
166
|
+
.description('Reset all options to their default values')
|
|
167
|
+
.action(() => {
|
|
168
|
+
const rl = readline.createInterface({
|
|
169
|
+
input: process.stdin,
|
|
170
|
+
output: process.stdout,
|
|
171
|
+
});
|
|
172
|
+
(0, output_js_1.printInfo)('This will reset all options to their default values.');
|
|
173
|
+
rl.question('Are you sure? (y/N): ', (answer) => {
|
|
174
|
+
if (answer.trim().toLowerCase() === 'y') {
|
|
175
|
+
(0, config_js_1.resetAllOptions)();
|
|
176
|
+
(0, output_js_1.printInfo)('All options reset to defaults:');
|
|
177
|
+
for (const [name, opt] of Object.entries(config_js_1.OPTIONS_REGISTRY)) {
|
|
178
|
+
(0, output_js_1.printInfo)(` ${name} = ${opt.default}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
(0, output_js_1.printInfo)('Cancelled.');
|
|
183
|
+
}
|
|
184
|
+
rl.close();
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
program
|
|
188
|
+
.command('mcp-list')
|
|
189
|
+
.description('List configured MCP servers')
|
|
190
|
+
.action(() => {
|
|
191
|
+
try {
|
|
192
|
+
const servers = (0, mcp_js_1.listMCPServers)();
|
|
193
|
+
if (servers.length === 0) {
|
|
194
|
+
(0, output_js_1.printInfo)('No MCP servers configured.');
|
|
195
|
+
(0, output_js_1.printInfo)('Add servers to ~/.bernard/mcp.json');
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
(0, output_js_1.printInfo)('MCP Servers:');
|
|
199
|
+
for (const server of servers) {
|
|
200
|
+
if (server.url) {
|
|
201
|
+
const type = server.type ?? 'sse';
|
|
202
|
+
(0, output_js_1.printInfo)(` ${server.key} — ${server.url} (${type})`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
const args = server.args && server.args.length > 0 ? ` ${server.args.join(' ')}` : '';
|
|
206
|
+
(0, output_js_1.printInfo)(` ${server.key} — ${server.command}${args}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
212
|
+
(0, output_js_1.printError)(message);
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
program
|
|
217
|
+
.command('remove-mcp <key>')
|
|
218
|
+
.description('Remove a configured MCP server')
|
|
219
|
+
.action((key) => {
|
|
220
|
+
try {
|
|
221
|
+
(0, mcp_js_1.removeMCPServer)(key);
|
|
222
|
+
(0, output_js_1.printInfo)(`MCP server "${key}" removed.`);
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
226
|
+
(0, output_js_1.printError)(message);
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
program.parse();
|
|
231
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function debugLog(label: string, data: unknown): void;
|