ex-brain 0.2.5 → 0.2.7
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/package.json +3 -1
- package/src/commands/index.ts +431 -231
- package/src/db/client.ts +14 -1
- package/src/markdown/document-loader.ts +486 -0
- package/src/mcp/server.ts +148 -0
- package/src/repositories/brain-repo.ts +10 -2
- package/src/settings.ts +51 -2
package/src/settings.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { join, resolve } from "node:path";
|
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { fileExists, readTextFile } from "./markdown/io";
|
|
5
5
|
|
|
6
|
-
const SETTINGS_DIR = join(homedir(), ".ebrain");
|
|
6
|
+
export const SETTINGS_DIR = join(homedir(), ".ebrain");
|
|
7
7
|
export const SETTINGS_PATH = join(SETTINGS_DIR, "settings.json");
|
|
8
8
|
export const DEFAULT_DB_PATH = resolve(SETTINGS_DIR, "data", "ebrain.db");
|
|
9
9
|
|
|
@@ -150,6 +150,54 @@ export async function readSettingsFile(): Promise<unknown | null> {
|
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
+
/**
|
|
154
|
+
* Generate a minimal settings.json if it doesn't already exist.
|
|
155
|
+
* Returns true if a new file was created.
|
|
156
|
+
*/
|
|
157
|
+
export async function createDefaultSettings(): Promise<boolean> {
|
|
158
|
+
if (await fileExists(SETTINGS_PATH)) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const { mkdirSync, writeFileSync } = await import("node:fs");
|
|
163
|
+
mkdirSync(SETTINGS_DIR, { recursive: true });
|
|
164
|
+
|
|
165
|
+
// All fields present but empty — user fills in their values
|
|
166
|
+
const defaults = {
|
|
167
|
+
db: {
|
|
168
|
+
path: "",
|
|
169
|
+
remote: {
|
|
170
|
+
host: "",
|
|
171
|
+
port: 0,
|
|
172
|
+
user: "",
|
|
173
|
+
password: "",
|
|
174
|
+
database: "",
|
|
175
|
+
tenant: "",
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
embed: {
|
|
179
|
+
provider: "hash",
|
|
180
|
+
baseURL: "",
|
|
181
|
+
model: "",
|
|
182
|
+
dimensions: 0,
|
|
183
|
+
apiKey: "",
|
|
184
|
+
apiKeyEnv: "",
|
|
185
|
+
},
|
|
186
|
+
llm: {
|
|
187
|
+
baseURL: "",
|
|
188
|
+
model: "",
|
|
189
|
+
apiKey: "",
|
|
190
|
+
apiKeyEnv: "",
|
|
191
|
+
},
|
|
192
|
+
extraction: {
|
|
193
|
+
confidenceThreshold: 0.7,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
writeFileSync(SETTINGS_PATH, JSON.stringify(defaults, null, 2) + "\n", "utf-8");
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
|
|
153
201
|
export function resolveSettings(parsed: z.infer<typeof SettingsSchema>): ResolvedSettings {
|
|
154
202
|
const dbConf = parsed.db ?? {};
|
|
155
203
|
const remoteConf = dbConf.remote ?? {};
|
|
@@ -215,7 +263,8 @@ function resolveExtraction(conf: { confidenceThreshold?: number }): ResolvedExtr
|
|
|
215
263
|
// ---------------------------------------------------------------------------
|
|
216
264
|
|
|
217
265
|
function nonEmpty(val: string | undefined, fallback: string): string {
|
|
218
|
-
|
|
266
|
+
const trimmed = val?.trim();
|
|
267
|
+
return trimmed || fallback;
|
|
219
268
|
}
|
|
220
269
|
|
|
221
270
|
function numOr(val: number | string | undefined, fallback: number): number {
|