@zabaca/lattice 1.0.21 → 1.0.23

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 (2) hide show
  1. package/dist/main.js +45 -26
  2. package/package.json +2 -2
package/dist/main.js CHANGED
@@ -873,8 +873,7 @@ class GraphService {
873
873
  const allResults = [];
874
874
  const conn = await this.ensureConnected();
875
875
  const vectorStr = `[${queryVector.join(", ")}]`;
876
- try {
877
- const reader = await conn.runAndReadAll(`
876
+ const sql = `
878
877
  SELECT
879
878
  name,
880
879
  label,
@@ -883,10 +882,11 @@ class GraphService {
883
882
  array_cosine_similarity(embedding, ${vectorStr}::FLOAT[${this.embeddingDimensions}]) as similarity
884
883
  FROM nodes
885
884
  WHERE embedding IS NOT NULL
886
- ORDER BY similarity DESC
887
- LIMIT ${k}
888
- `);
889
- for (const row of reader.getRows()) {
885
+ `;
886
+ try {
887
+ const reader = await conn.runAndReadAll(sql);
888
+ const rows = reader.getRows();
889
+ for (const row of rows) {
890
890
  const [name, label, title, description, similarity] = row;
891
891
  allResults.push({
892
892
  name,
@@ -1289,13 +1289,18 @@ class VoyageEmbeddingProvider {
1289
1289
  class EmbeddingService {
1290
1290
  configService;
1291
1291
  logger = new Logger3(EmbeddingService.name);
1292
- provider;
1292
+ provider = null;
1293
1293
  config;
1294
1294
  constructor(configService) {
1295
1295
  this.configService = configService;
1296
1296
  this.config = this.loadConfig();
1297
- this.provider = this.createProvider();
1298
- this.logger.log(`Initialized embedding service with provider: ${this.provider.name}`);
1297
+ }
1298
+ getProvider() {
1299
+ if (!this.provider) {
1300
+ this.provider = this.createProvider();
1301
+ this.logger.log(`Initialized embedding provider: ${this.provider.name}`);
1302
+ }
1303
+ return this.provider;
1299
1304
  }
1300
1305
  loadConfig() {
1301
1306
  const providerEnv = this.configService.get("EMBEDDING_PROVIDER");
@@ -1342,35 +1347,36 @@ class EmbeddingService {
1342
1347
  }
1343
1348
  }
1344
1349
  getProviderName() {
1345
- return this.provider.name;
1350
+ return this.getProvider().name;
1346
1351
  }
1347
1352
  getDimensions() {
1348
- return this.provider.dimensions;
1353
+ return this.getProvider().dimensions;
1349
1354
  }
1350
1355
  async generateEmbedding(text) {
1351
1356
  if (!text || text.trim().length === 0) {
1352
1357
  throw new Error("Cannot generate embedding for empty text");
1353
1358
  }
1354
- return this.provider.generateEmbedding(text);
1359
+ return this.getProvider().generateEmbedding(text);
1355
1360
  }
1356
1361
  async generateQueryEmbedding(text) {
1357
1362
  if (!text || text.trim().length === 0) {
1358
1363
  throw new Error("Cannot generate embedding for empty text");
1359
1364
  }
1360
- if (this.provider.generateQueryEmbedding) {
1361
- return this.provider.generateQueryEmbedding(text);
1365
+ const provider = this.getProvider();
1366
+ if (provider.generateQueryEmbedding) {
1367
+ return provider.generateQueryEmbedding(text);
1362
1368
  }
1363
- return this.provider.generateEmbedding(text);
1369
+ return provider.generateEmbedding(text);
1364
1370
  }
1365
1371
  async generateEmbeddings(texts) {
1366
1372
  const validTexts = texts.filter((t) => t && t.trim().length > 0);
1367
1373
  if (validTexts.length === 0) {
1368
1374
  return [];
1369
1375
  }
1370
- return this.provider.generateEmbeddings(validTexts);
1376
+ return this.getProvider().generateEmbeddings(validTexts);
1371
1377
  }
1372
1378
  isRealProvider() {
1373
- return this.provider.name !== "mock";
1379
+ return this.getProvider().name !== "mock";
1374
1380
  }
1375
1381
  }
1376
1382
  EmbeddingService = __legacyDecorateClassTS([
@@ -3367,26 +3373,36 @@ GraphValidatorService = __legacyDecorateClassTS([
3367
3373
  // src/commands/sync.command.ts
3368
3374
  class SyncCommand extends CommandRunner7 {
3369
3375
  syncService;
3376
+ graphService;
3370
3377
  _graphValidator;
3371
3378
  watcher = null;
3372
3379
  isShuttingDown = false;
3373
- constructor(syncService, _graphValidator) {
3380
+ constructor(syncService, graphService, _graphValidator) {
3374
3381
  super();
3375
3382
  this.syncService = syncService;
3383
+ this.graphService = graphService;
3376
3384
  this._graphValidator = _graphValidator;
3377
3385
  }
3386
+ async safeExit(code) {
3387
+ try {
3388
+ await this.graphService.checkpoint();
3389
+ } catch (error) {
3390
+ console.error("Warning: checkpoint failed during exit");
3391
+ }
3392
+ process.exit(code);
3393
+ }
3378
3394
  async run(paths, options) {
3379
3395
  if (options.watch && options.dryRun) {
3380
3396
  console.log(`
3381
3397
  \u26A0\uFE0F Watch mode is not compatible with --dry-run mode
3382
3398
  `);
3383
- process.exit(1);
3399
+ await this.safeExit(1);
3384
3400
  }
3385
3401
  if (options.watch && options.force) {
3386
3402
  console.log(`
3387
3403
  \u26A0\uFE0F Watch mode is not compatible with --force mode (for safety)
3388
3404
  `);
3389
- process.exit(1);
3405
+ await this.safeExit(1);
3390
3406
  }
3391
3407
  if (options.force && paths.length === 0) {
3392
3408
  console.log(`
@@ -3394,7 +3410,7 @@ class SyncCommand extends CommandRunner7 {
3394
3410
  `);
3395
3411
  console.log(` Usage: lattice sync --force <path1> [path2] ...
3396
3412
  `);
3397
- process.exit(1);
3413
+ await this.safeExit(1);
3398
3414
  }
3399
3415
  const syncOptions = {
3400
3416
  force: options.force,
@@ -3441,12 +3457,12 @@ class SyncCommand extends CommandRunner7 {
3441
3457
  if (options.watch) {
3442
3458
  await this.enterWatchMode(syncOptions);
3443
3459
  } else {
3444
- process.exit(initialResult.errors.length > 0 ? 1 : 0);
3460
+ await this.safeExit(initialResult.errors.length > 0 ? 1 : 0);
3445
3461
  }
3446
3462
  } catch (error) {
3447
3463
  console.error(`
3448
3464
  \u274C Sync failed:`, error instanceof Error ? error.message : String(error));
3449
- process.exit(1);
3465
+ await this.safeExit(1);
3450
3466
  }
3451
3467
  }
3452
3468
  async enterWatchMode(syncOptions) {
@@ -3503,10 +3519,12 @@ class SyncCommand extends CommandRunner7 {
3503
3519
  debouncedSync();
3504
3520
  }
3505
3521
  });
3506
- process.on("SIGINT", () => this.shutdown());
3522
+ process.on("SIGINT", () => {
3523
+ this.shutdown().catch(console.error);
3524
+ });
3507
3525
  await new Promise(() => {});
3508
3526
  }
3509
- shutdown() {
3527
+ async shutdown() {
3510
3528
  if (this.isShuttingDown)
3511
3529
  return;
3512
3530
  this.isShuttingDown = true;
@@ -3516,7 +3534,7 @@ class SyncCommand extends CommandRunner7 {
3516
3534
  if (this.watcher) {
3517
3535
  this.watcher.close();
3518
3536
  }
3519
- process.exit(0);
3537
+ await this.safeExit(0);
3520
3538
  }
3521
3539
  printSyncResults(result, isWatchMode = false) {
3522
3540
  console.log(`
@@ -3706,6 +3724,7 @@ SyncCommand = __legacyDecorateClassTS([
3706
3724
  }),
3707
3725
  __legacyMetadataTS("design:paramtypes", [
3708
3726
  typeof SyncService === "undefined" ? Object : SyncService,
3727
+ typeof GraphService === "undefined" ? Object : GraphService,
3709
3728
  typeof GraphValidatorService === "undefined" ? Object : GraphValidatorService
3710
3729
  ])
3711
3730
  ], SyncCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zabaca/lattice",
3
- "version": "1.0.21",
3
+ "version": "1.0.23",
4
4
  "description": "Human-initiated, AI-powered knowledge graph for markdown documentation",
5
5
  "type": "module",
6
6
  "bin": {
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "@anthropic-ai/claude-agent-sdk": "^0.1.67",
47
- "@duckdb/node-api": "1.3.1-alpha.23",
47
+ "@duckdb/node-api": "1.4.3-r.1",
48
48
  "@nestjs/common": "^10.0.0",
49
49
  "@nestjs/config": "^3.0.0",
50
50
  "@nestjs/core": "^10.0.0",