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/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
- return val?.trim() ?? fallback;
266
+ const trimmed = val?.trim();
267
+ return trimmed || fallback;
219
268
  }
220
269
 
221
270
  function numOr(val: number | string | undefined, fallback: number): number {