wiki-graph-sdk 0.8.0 → 0.8.1

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 (52) hide show
  1. package/README.md +21 -0
  2. package/dist/archives.cjs +91 -17
  3. package/dist/archives.cjs.map +1 -1
  4. package/dist/archives.d.ts +8 -2
  5. package/dist/archives.js +92 -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 +23 -5
  11. package/dist/conversions.js.map +1 -1
  12. package/dist/default-worker.cjs +34 -11
  13. package/dist/default-worker.cjs.map +1 -1
  14. package/dist/default-worker.d.ts +1 -0
  15. package/dist/default-worker.js +34 -11
  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 +2 -1
  21. package/dist/embedding.js.map +1 -1
  22. package/dist/index.cjs +336 -46
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.ts +26 -9
  25. package/dist/index.js +337 -47
  26. package/dist/index.js.map +1 -1
  27. package/dist/{jobs-xIm_kshM.d.ts → jobs-CRK-DZ40.d.ts} +5 -0
  28. package/dist/local-config.cjs +2 -1
  29. package/dist/local-config.cjs.map +1 -1
  30. package/dist/local-config.js +2 -1
  31. package/dist/local-config.js.map +1 -1
  32. package/dist/maintenance.cjs +2 -1
  33. package/dist/maintenance.cjs.map +1 -1
  34. package/dist/maintenance.d.ts +4 -1
  35. package/dist/maintenance.js +2 -1
  36. package/dist/maintenance.js.map +1 -1
  37. package/dist/runtime-config.cjs +4 -3
  38. package/dist/runtime-config.cjs.map +1 -1
  39. package/dist/runtime-config.d.ts +4 -1
  40. package/dist/runtime-config.js +4 -3
  41. package/dist/runtime-config.js.map +1 -1
  42. package/dist/stage-BnWI3Rqt.d.ts +33 -0
  43. package/dist/stage.cjs +22 -12
  44. package/dist/stage.cjs.map +1 -1
  45. package/dist/stage.d.ts +2 -14
  46. package/dist/stage.js +22 -12
  47. package/dist/stage.js.map +1 -1
  48. package/dist/worker.cjs +2 -1
  49. package/dist/worker.cjs.map +1 -1
  50. package/dist/worker.js +2 -1
  51. package/dist/worker.js.map +1 -1
  52. package/package.json +2 -2
package/README.md CHANGED
@@ -23,6 +23,27 @@ for (const job of jobs) {
23
23
  wikiGraph.close();
24
24
  ```
25
25
 
26
+ Applications may replace the configured LLM and embedding implementations for
27
+ one SDK instance:
28
+
29
+ ```ts
30
+ const wikiGraph = createWikiGraphSDK({
31
+ providers: {
32
+ llm: myStreamingLLMProvider,
33
+ embedding: myEmbeddingProvider,
34
+ },
35
+ });
36
+
37
+ await wikiGraph.jobs.runWorker();
38
+ ```
39
+
40
+ An operation-level `llm` option (the typed SDK equivalent of CLI `--llm`)
41
+ takes precedence over the injected LLM provider. An injected provider takes
42
+ precedence over local database configuration. Injected objects are
43
+ process-local and are not persisted with durable jobs, so a worker in another
44
+ process must create its SDK with the same providers. The standalone default
45
+ worker continues to use local configuration.
46
+
26
47
  Job event subscriptions observe durable work without coupling observation to
27
48
  cancellation. Call `job.cancel()` explicitly to cancel a job; unsubscribing
28
49
  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 }
@@ -2282,6 +2304,9 @@ var WikiGraphArchiveHandle = class {
2282
2304
  }
2283
2305
  async related(objectUri = this.objectUri, options = {}) {
2284
2306
  if (options.query === void 0) {
2307
+ if (options.queryMode !== void 0) {
2308
+ throw new Error("`queryMode` requires `query`.");
2309
+ }
2285
2310
  return await this.#readDocument(async (document) => {
2286
2311
  const chapters = await this.#resolveScope(document, {});
2287
2312
  return await (0, import_wiki_graph_core7.listRelatedArchiveObjects)(document, objectUri, {
@@ -2290,19 +2315,22 @@ var WikiGraphArchiveHandle = class {
2290
2315
  });
2291
2316
  }, options);
2292
2317
  }
2293
- const embeddingProvider = await this.#runtime.run(
2294
- createConfiguredEmbeddingProvider,
2318
+ const embeddingProvider = await this.#resolveQueryEmbeddingProvider(
2319
+ options.queryMode,
2295
2320
  options.signal
2296
2321
  );
2297
2322
  return await this.#writeDocument(
2298
2323
  async (document) => {
2299
- const chapters = await this.#resolveQueryChapters(document, options);
2324
+ const chapters = await this.#resolveQueryChapters(document, options, {
2325
+ embeddingProvider
2326
+ });
2300
2327
  await ensureArchiveSearchIndex(document, {
2301
2328
  ...chapters === void 0 ? {} : { chapters },
2302
2329
  ...embeddingProvider === void 0 ? {} : { embeddingProvider }
2303
2330
  });
2304
2331
  return await (0, import_wiki_graph_core7.listRelatedArchiveObjects)(document, objectUri, {
2305
2332
  ...withoutOperation(options),
2333
+ ...embeddingProvider === void 0 ? {} : { embeddingProvider },
2306
2334
  ...chapters === void 0 ? {} : { chapters }
2307
2335
  });
2308
2336
  },
@@ -2314,6 +2342,9 @@ var WikiGraphArchiveHandle = class {
2314
2342
  }
2315
2343
  async evidence(objectUri = this.objectUri, options = {}) {
2316
2344
  if (options.query === void 0) {
2345
+ if (options.queryMode !== void 0) {
2346
+ throw new Error("`queryMode` requires `query`.");
2347
+ }
2317
2348
  return await this.#readDocument(async (document) => {
2318
2349
  const chapters = await this.#resolveScope(document, {});
2319
2350
  return await (0, import_wiki_graph_core7.listArchiveEvidence)(document, objectUri, {
@@ -2322,19 +2353,22 @@ var WikiGraphArchiveHandle = class {
2322
2353
  });
2323
2354
  }, options);
2324
2355
  }
2325
- const embeddingProvider = await this.#runtime.run(
2326
- createConfiguredEmbeddingProvider,
2356
+ const embeddingProvider = await this.#resolveQueryEmbeddingProvider(
2357
+ options.queryMode,
2327
2358
  options.signal
2328
2359
  );
2329
2360
  return await this.#writeDocument(
2330
2361
  async (document) => {
2331
- const chapters = await this.#resolveQueryChapters(document, options);
2362
+ const chapters = await this.#resolveQueryChapters(document, options, {
2363
+ embeddingProvider
2364
+ });
2332
2365
  await ensureArchiveSearchIndex(document, {
2333
2366
  ...chapters === void 0 ? {} : { chapters },
2334
2367
  ...embeddingProvider === void 0 ? {} : { embeddingProvider }
2335
2368
  });
2336
2369
  return await (0, import_wiki_graph_core7.listArchiveEvidence)(document, objectUri, {
2337
2370
  ...withoutOperation(options),
2371
+ ...embeddingProvider === void 0 ? {} : { embeddingProvider },
2338
2372
  ...chapters === void 0 ? {} : { chapters }
2339
2373
  });
2340
2374
  },
@@ -2368,6 +2402,24 @@ var WikiGraphArchiveHandle = class {
2368
2402
  return meta;
2369
2403
  }, options);
2370
2404
  }
2405
+ async setArchiveTitle(title, options = {}) {
2406
+ const normalized = title?.trim() ?? null;
2407
+ if (title !== null && normalized === "") {
2408
+ throw new Error("Archive title cannot be empty.");
2409
+ }
2410
+ return await this.#writeDocument(async (document) => {
2411
+ if (normalized === null) {
2412
+ await document.metadata.deleteKey("", "title");
2413
+ } else {
2414
+ await document.metadata.put(
2415
+ { kind: import_wiki_graph_core7.ObjectMetadataKind.Archive, objectPath: "" },
2416
+ "title",
2417
+ normalized
2418
+ );
2419
+ }
2420
+ return normalized;
2421
+ }, options);
2422
+ }
2371
2423
  async readCover(options = {}) {
2372
2424
  const app = new import_wiki_graph_core7.WikiGraph({});
2373
2425
  return await this.#runtime.run(
@@ -2438,11 +2490,20 @@ var WikiGraphArchiveHandle = class {
2438
2490
  if (options.chapters !== void 0) return options.chapters;
2439
2491
  return (await resolveArchiveScope(document, this.objectUri, options.depth))?.chapterIds;
2440
2492
  }
2441
- async #resolveQueryChapters(document, options) {
2493
+ async #resolveQueryChapters(document, options, capabilities) {
2442
2494
  const chapters = await this.#resolveScope(document, options);
2443
- if (options.skipUnindexed !== true) return chapters;
2495
+ const coverageOptions = {
2496
+ ...chapters === void 0 ? {} : { chapters },
2497
+ ...capabilities.embeddingProvider === void 0 ? {} : { embeddingProvider: capabilities.embeddingProvider },
2498
+ requireEmbeddingProvider: true,
2499
+ ...options.queryMode === void 0 ? {} : { queryMode: options.queryMode }
2500
+ };
2501
+ if (options.skipUnindexed !== true) {
2502
+ await (0, import_wiki_graph_core7.assertArchiveIndexArtifactsReady)(document, coverageOptions);
2503
+ return chapters;
2504
+ }
2444
2505
  const queryable = await (0, import_wiki_graph_core7.listArchiveQueryableChapterIds)(document, {
2445
- ...chapters === void 0 ? {} : { chapters }
2506
+ ...coverageOptions
2446
2507
  });
2447
2508
  if (queryable.length === 0) {
2448
2509
  throw new Error(
@@ -2451,6 +2512,19 @@ var WikiGraphArchiveHandle = class {
2451
2512
  }
2452
2513
  return queryable;
2453
2514
  }
2515
+ async #resolveQueryEmbeddingProvider(queryMode, signal) {
2516
+ if (queryMode === "fts") return void 0;
2517
+ const provider = await this.#runtime.run(
2518
+ createConfiguredEmbeddingProvider,
2519
+ signal
2520
+ );
2521
+ if (queryMode === "embedding" && provider === void 0) {
2522
+ throw new Error(
2523
+ "Embedding query mode requires embeddings configuration at `wikg://local/config/embeddings`."
2524
+ );
2525
+ }
2526
+ return provider;
2527
+ }
2454
2528
  };
2455
2529
  async function ensureArchiveSearchIndex(document, options = {}) {
2456
2530
  const scope = options.chapters === void 0 ? {} : { chapters: options.chapters };