wiki-graph-sdk 0.8.0 → 0.8.2

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 (64) hide show
  1. package/README.md +46 -0
  2. package/dist/archives.cjs +98 -17
  3. package/dist/archives.cjs.map +1 -1
  4. package/dist/archives.d.ts +10 -2
  5. package/dist/archives.js +100 -17
  6. package/dist/archives.js.map +1 -1
  7. package/dist/conversions.cjs +23 -5
  8. package/dist/conversions.cjs.map +1 -1
  9. package/dist/conversions.d.ts +6 -1
  10. package/dist/conversions.js +24 -5
  11. package/dist/conversions.js.map +1 -1
  12. package/dist/default-worker.cjs +84 -21
  13. package/dist/default-worker.cjs.map +1 -1
  14. package/dist/default-worker.d.ts +1 -0
  15. package/dist/default-worker.js +88 -21
  16. package/dist/default-worker.js.map +1 -1
  17. package/dist/embedding.cjs +2 -1
  18. package/dist/embedding.cjs.map +1 -1
  19. package/dist/embedding.d.ts +4 -4
  20. package/dist/embedding.js +3 -1
  21. package/dist/embedding.js.map +1 -1
  22. package/dist/gc.cjs +52 -10
  23. package/dist/gc.cjs.map +1 -1
  24. package/dist/gc.d.ts +3 -0
  25. package/dist/gc.js +56 -10
  26. package/dist/gc.js.map +1 -1
  27. package/dist/host-pQiVAKEY.d.ts +10 -0
  28. package/dist/index.cjs +422 -57
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.d.ts +33 -12
  31. package/dist/index.js +427 -59
  32. package/dist/index.js.map +1 -1
  33. package/dist/{jobs-xIm_kshM.d.ts → jobs-CRK-DZ40.d.ts} +5 -0
  34. package/dist/local-config.cjs +2 -1
  35. package/dist/local-config.cjs.map +1 -1
  36. package/dist/local-config.js +3 -1
  37. package/dist/local-config.js.map +1 -1
  38. package/dist/maintenance.cjs +2 -1
  39. package/dist/maintenance.cjs.map +1 -1
  40. package/dist/maintenance.d.ts +4 -1
  41. package/dist/maintenance.js +3 -1
  42. package/dist/maintenance.js.map +1 -1
  43. package/dist/node-platform.cjs +18 -4
  44. package/dist/node-platform.cjs.map +1 -1
  45. package/dist/node-platform.d.ts +12 -3
  46. package/dist/node-platform.js +18 -4
  47. package/dist/node-platform.js.map +1 -1
  48. package/dist/runtime-config.cjs +4 -3
  49. package/dist/runtime-config.cjs.map +1 -1
  50. package/dist/runtime-config.d.ts +4 -1
  51. package/dist/runtime-config.js +5 -3
  52. package/dist/runtime-config.js.map +1 -1
  53. package/dist/stage-BnWI3Rqt.d.ts +33 -0
  54. package/dist/stage.cjs +22 -12
  55. package/dist/stage.cjs.map +1 -1
  56. package/dist/stage.d.ts +2 -14
  57. package/dist/stage.js +23 -12
  58. package/dist/stage.js.map +1 -1
  59. package/dist/worker.cjs +83 -43
  60. package/dist/worker.cjs.map +1 -1
  61. package/dist/worker.d.ts +7 -2
  62. package/dist/worker.js +87 -43
  63. package/dist/worker.js.map +1 -1
  64. package/package.json +2 -2
package/README.md CHANGED
@@ -23,6 +23,52 @@ for (const job of jobs) {
23
23
  wikiGraph.close();
24
24
  ```
25
25
 
26
+ Electron and other Node hosts may provide their own lifecycle identity and
27
+ storage layout without importing `wiki-graph-core`:
28
+
29
+ ```ts
30
+ import {
31
+ createNodeWikiGraphPlatform,
32
+ createNodeWikiGraphStorage,
33
+ createWikiGraphSDK,
34
+ } from "wiki-graph-sdk";
35
+
36
+ const wikiGraph = createWikiGraphSDK({
37
+ host: {
38
+ platform: createNodeWikiGraphPlatform({ lifecycle }),
39
+ storage: createNodeWikiGraphStorage({
40
+ libraryRoot: "/path/to/home",
41
+ documentStoreRoot: "/path/to/documents",
42
+ }),
43
+ },
44
+ });
45
+ ```
46
+
47
+ Storage is scoped to the SDK instance. Platform services, including lifecycle,
48
+ are process-wide; SDK instances in one process must use one compatible
49
+ platform. `host.storage` and `stateDir` cannot be supplied together.
50
+
51
+ Applications may replace the configured LLM and embedding implementations for
52
+ one SDK instance:
53
+
54
+ ```ts
55
+ const wikiGraph = createWikiGraphSDK({
56
+ providers: {
57
+ llm: myStreamingLLMProvider,
58
+ embedding: myEmbeddingProvider,
59
+ },
60
+ });
61
+
62
+ await wikiGraph.jobs.runWorker();
63
+ ```
64
+
65
+ An operation-level `llm` option (the typed SDK equivalent of CLI `--llm`)
66
+ takes precedence over the injected LLM provider. An injected provider takes
67
+ precedence over local database configuration. Injected objects are
68
+ process-local and are not persisted with durable jobs, so a worker in another
69
+ process must create its SDK with the same providers. The standalone default
70
+ worker continues to use local configuration.
71
+
26
72
  Job event subscriptions observe durable work without coupling observation to
27
73
  cancellation. Call `job.cancel()` explicitly to cancel a job; unsubscribing
28
74
  only stops the current listener.
package/dist/archives.cjs CHANGED
@@ -826,12 +826,16 @@ function getWikiGraphSDKRuntimeContext() {
826
826
  return runtimeContext.getStore() ?? {
827
827
  cwd: process.cwd(),
828
828
  env: process.env,
829
- envPolicy: "production"
829
+ envPolicy: "production",
830
+ providers: {}
830
831
  };
831
832
  }
832
833
  function getWikiGraphSDKStateDir() {
833
834
  return getWikiGraphSDKRuntimeContext().stateDir;
834
835
  }
836
+ function getWikiGraphSDKProviders() {
837
+ return getWikiGraphSDKRuntimeContext().providers ?? {};
838
+ }
835
839
 
836
840
  // src/local-config.ts
837
841
  var import_path = require("path");
@@ -1049,8 +1053,8 @@ var inlineLLMConfigSchema = import_zod.z.object({
1049
1053
  });
1050
1054
  async function loadWikiGraphRuntimeConfig(options) {
1051
1055
  const [embedding, localLLM, concurrent, wikimedia, wikispine] = await Promise.all([
1052
- readLocalConfigSection("embeddings"),
1053
- readLocalConfigSection("llm"),
1056
+ options?.skipEmbeddingConfig === true ? Promise.resolve({}) : readLocalConfigSection("embeddings"),
1057
+ options?.skipLLMConfig === true ? Promise.resolve({}) : readLocalConfigSection("llm"),
1054
1058
  readLocalConfigSection("concurrent"),
1055
1059
  readLocalConfigSection("wikimedia"),
1056
1060
  readLocalConfigSection("wikispine")
@@ -1246,6 +1250,14 @@ function formatError2(error) {
1246
1250
  return error instanceof Error ? error.message : String(error);
1247
1251
  }
1248
1252
 
1253
+ // src/providers.ts
1254
+ function resolveWikiGraphLLMJSON(options) {
1255
+ if (options.llm !== void 0 && options.llmJSON !== void 0) {
1256
+ throw new Error("Pass either llm or llmJSON, not both.");
1257
+ }
1258
+ return options.llm === void 0 ? options.llmJSON : JSON.stringify(options.llm);
1259
+ }
1260
+
1249
1261
  // src/runtime-path.ts
1250
1262
  var import_os2 = require("os");
1251
1263
  var import_path2 = require("path");
@@ -1440,12 +1452,18 @@ var WikiGraphConversionManager = class {
1440
1452
  }
1441
1453
  const requiresDigest = options.input.format !== "wikg";
1442
1454
  const requiresLLM = requiresDigest && targetStage !== "planned" && targetStage !== "sourced";
1455
+ const llmJSON = resolveWikiGraphLLMJSON(options);
1456
+ const injectedLLM = llmJSON === void 0 ? getWikiGraphSDKProviders().llm : void 0;
1443
1457
  const config = await loadWikiGraphRuntimeConfig({
1444
- ...options.llmJSON === void 0 ? {} : { llmJSON: options.llmJSON }
1458
+ ...llmJSON === void 0 ? {} : { llmJSON },
1459
+ ...injectedLLM === void 0 ? {} : { skipLLMConfig: true },
1460
+ ...getWikiGraphSDKProviders().embedding === void 0 ? {} : { skipEmbeddingConfig: true }
1445
1461
  });
1446
1462
  const app = new import_wiki_graph_core3.WikiGraph({
1447
1463
  ...options.verbose === true ? { verbose: true } : {},
1448
- ...requiresLLM ? { llm: buildWikiGraphLLMOptions(config) } : {}
1464
+ ...requiresLLM ? {
1465
+ llm: injectedLLM === void 0 ? buildWikiGraphLLMOptions(config) : { streamProvider: injectedLLM }
1466
+ } : {}
1449
1467
  });
1450
1468
  const documentDirectory = await prepareDigestDirectory(
1451
1469
  options.digestDirectory,
@@ -1733,6 +1751,8 @@ function createOpenAICompatibleName2(baseURL) {
1733
1751
 
1734
1752
  // src/query-runtime.ts
1735
1753
  async function createConfiguredEmbeddingProvider() {
1754
+ const injected = getWikiGraphSDKProviders().embedding;
1755
+ if (injected !== void 0) return injected;
1736
1756
  const config = await readWikiGraphEmbeddingConfig();
1737
1757
  if (config.provider === void 0 || config.model === void 0 || config.provider === "openai-compatible" && config.baseURL === void 0 || config.provider === "openai" && config.baseURL !== void 0) {
1738
1758
  return void 0;
@@ -1978,13 +1998,15 @@ var WikiGraphArchiveHandle = class {
1978
1998
  );
1979
1999
  }
1980
2000
  async search(query, options = {}) {
1981
- const embeddingProvider = await this.#runtime.run(
1982
- createConfiguredEmbeddingProvider,
2001
+ const embeddingProvider = await this.#resolveQueryEmbeddingProvider(
2002
+ options.queryMode,
1983
2003
  options.signal
1984
2004
  );
1985
2005
  return await this.#writeDocument(
1986
2006
  async (document) => {
1987
- const chapters = await this.#resolveQueryChapters(document, options);
2007
+ const chapters = await this.#resolveQueryChapters(document, options, {
2008
+ embeddingProvider
2009
+ });
1988
2010
  await ensureArchiveSearchIndex(document, {
1989
2011
  ...chapters === void 0 ? {} : { chapters },
1990
2012
  ...embeddingProvider === void 0 ? {} : { embeddingProvider }
@@ -2092,6 +2114,13 @@ var WikiGraphArchiveHandle = class {
2092
2114
  );
2093
2115
  return status;
2094
2116
  }
2117
+ /** Clear cached search sessions without changing the archive index. */
2118
+ async clearSearchSessions(options = {}) {
2119
+ await this.#runtime.run(
2120
+ async () => await (0, import_wiki_graph_core7.deleteArchiveSearchSessions)(this.path),
2121
+ options.signal
2122
+ );
2123
+ }
2095
2124
  async listChapters(options = {}) {
2096
2125
  return await this.#readDocument(
2097
2126
  async (document) => await (0, import_wiki_graph_core7.listChapters)(document),
@@ -2282,6 +2311,9 @@ var WikiGraphArchiveHandle = class {
2282
2311
  }
2283
2312
  async related(objectUri = this.objectUri, options = {}) {
2284
2313
  if (options.query === void 0) {
2314
+ if (options.queryMode !== void 0) {
2315
+ throw new Error("`queryMode` requires `query`.");
2316
+ }
2285
2317
  return await this.#readDocument(async (document) => {
2286
2318
  const chapters = await this.#resolveScope(document, {});
2287
2319
  return await (0, import_wiki_graph_core7.listRelatedArchiveObjects)(document, objectUri, {
@@ -2290,19 +2322,22 @@ var WikiGraphArchiveHandle = class {
2290
2322
  });
2291
2323
  }, options);
2292
2324
  }
2293
- const embeddingProvider = await this.#runtime.run(
2294
- createConfiguredEmbeddingProvider,
2325
+ const embeddingProvider = await this.#resolveQueryEmbeddingProvider(
2326
+ options.queryMode,
2295
2327
  options.signal
2296
2328
  );
2297
2329
  return await this.#writeDocument(
2298
2330
  async (document) => {
2299
- const chapters = await this.#resolveQueryChapters(document, options);
2331
+ const chapters = await this.#resolveQueryChapters(document, options, {
2332
+ embeddingProvider
2333
+ });
2300
2334
  await ensureArchiveSearchIndex(document, {
2301
2335
  ...chapters === void 0 ? {} : { chapters },
2302
2336
  ...embeddingProvider === void 0 ? {} : { embeddingProvider }
2303
2337
  });
2304
2338
  return await (0, import_wiki_graph_core7.listRelatedArchiveObjects)(document, objectUri, {
2305
2339
  ...withoutOperation(options),
2340
+ ...embeddingProvider === void 0 ? {} : { embeddingProvider },
2306
2341
  ...chapters === void 0 ? {} : { chapters }
2307
2342
  });
2308
2343
  },
@@ -2314,6 +2349,9 @@ var WikiGraphArchiveHandle = class {
2314
2349
  }
2315
2350
  async evidence(objectUri = this.objectUri, options = {}) {
2316
2351
  if (options.query === void 0) {
2352
+ if (options.queryMode !== void 0) {
2353
+ throw new Error("`queryMode` requires `query`.");
2354
+ }
2317
2355
  return await this.#readDocument(async (document) => {
2318
2356
  const chapters = await this.#resolveScope(document, {});
2319
2357
  return await (0, import_wiki_graph_core7.listArchiveEvidence)(document, objectUri, {
@@ -2322,19 +2360,22 @@ var WikiGraphArchiveHandle = class {
2322
2360
  });
2323
2361
  }, options);
2324
2362
  }
2325
- const embeddingProvider = await this.#runtime.run(
2326
- createConfiguredEmbeddingProvider,
2363
+ const embeddingProvider = await this.#resolveQueryEmbeddingProvider(
2364
+ options.queryMode,
2327
2365
  options.signal
2328
2366
  );
2329
2367
  return await this.#writeDocument(
2330
2368
  async (document) => {
2331
- const chapters = await this.#resolveQueryChapters(document, options);
2369
+ const chapters = await this.#resolveQueryChapters(document, options, {
2370
+ embeddingProvider
2371
+ });
2332
2372
  await ensureArchiveSearchIndex(document, {
2333
2373
  ...chapters === void 0 ? {} : { chapters },
2334
2374
  ...embeddingProvider === void 0 ? {} : { embeddingProvider }
2335
2375
  });
2336
2376
  return await (0, import_wiki_graph_core7.listArchiveEvidence)(document, objectUri, {
2337
2377
  ...withoutOperation(options),
2378
+ ...embeddingProvider === void 0 ? {} : { embeddingProvider },
2338
2379
  ...chapters === void 0 ? {} : { chapters }
2339
2380
  });
2340
2381
  },
@@ -2368,6 +2409,24 @@ var WikiGraphArchiveHandle = class {
2368
2409
  return meta;
2369
2410
  }, options);
2370
2411
  }
2412
+ async setArchiveTitle(title, options = {}) {
2413
+ const normalized = title?.trim() ?? null;
2414
+ if (title !== null && normalized === "") {
2415
+ throw new Error("Archive title cannot be empty.");
2416
+ }
2417
+ return await this.#writeDocument(async (document) => {
2418
+ if (normalized === null) {
2419
+ await document.metadata.deleteKey("", "title");
2420
+ } else {
2421
+ await document.metadata.put(
2422
+ { kind: import_wiki_graph_core7.ObjectMetadataKind.Archive, objectPath: "" },
2423
+ "title",
2424
+ normalized
2425
+ );
2426
+ }
2427
+ return normalized;
2428
+ }, options);
2429
+ }
2371
2430
  async readCover(options = {}) {
2372
2431
  const app = new import_wiki_graph_core7.WikiGraph({});
2373
2432
  return await this.#runtime.run(
@@ -2438,11 +2497,20 @@ var WikiGraphArchiveHandle = class {
2438
2497
  if (options.chapters !== void 0) return options.chapters;
2439
2498
  return (await resolveArchiveScope(document, this.objectUri, options.depth))?.chapterIds;
2440
2499
  }
2441
- async #resolveQueryChapters(document, options) {
2500
+ async #resolveQueryChapters(document, options, capabilities) {
2442
2501
  const chapters = await this.#resolveScope(document, options);
2443
- if (options.skipUnindexed !== true) return chapters;
2502
+ const coverageOptions = {
2503
+ ...chapters === void 0 ? {} : { chapters },
2504
+ ...capabilities.embeddingProvider === void 0 ? {} : { embeddingProvider: capabilities.embeddingProvider },
2505
+ requireEmbeddingProvider: true,
2506
+ ...options.queryMode === void 0 ? {} : { queryMode: options.queryMode }
2507
+ };
2508
+ if (options.skipUnindexed !== true) {
2509
+ await (0, import_wiki_graph_core7.assertArchiveIndexArtifactsReady)(document, coverageOptions);
2510
+ return chapters;
2511
+ }
2444
2512
  const queryable = await (0, import_wiki_graph_core7.listArchiveQueryableChapterIds)(document, {
2445
- ...chapters === void 0 ? {} : { chapters }
2513
+ ...coverageOptions
2446
2514
  });
2447
2515
  if (queryable.length === 0) {
2448
2516
  throw new Error(
@@ -2451,6 +2519,19 @@ var WikiGraphArchiveHandle = class {
2451
2519
  }
2452
2520
  return queryable;
2453
2521
  }
2522
+ async #resolveQueryEmbeddingProvider(queryMode, signal) {
2523
+ if (queryMode === "fts") return void 0;
2524
+ const provider = await this.#runtime.run(
2525
+ createConfiguredEmbeddingProvider,
2526
+ signal
2527
+ );
2528
+ if (queryMode === "embedding" && provider === void 0) {
2529
+ throw new Error(
2530
+ "Embedding query mode requires embeddings configuration at `wikg://local/config/embeddings`."
2531
+ );
2532
+ }
2533
+ return provider;
2534
+ }
2454
2535
  };
2455
2536
  async function ensureArchiveSearchIndex(document, options = {}) {
2456
2537
  const scope = options.chapters === void 0 ? {} : { chapters: options.chapters };