wiki-graph-sdk 0.7.0 → 0.7.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.
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { LOCAL_CONFIG_SECTIONS, clearLocalConfigSection, deleteLocalConfigValue,
5
5
  import { W as WikiGraphJobRuntime, a as WikiGraphJobManager } from './jobs-Dd5PMSId.js';
6
6
  export { b as WikiGraphJob, c as WikiGraphJobBackend, d as WikiGraphJobChapterReference, e as WikiGraphJobCreateOptions, f as WikiGraphJobEnqueueOptions, g as WikiGraphJobEnqueuePlan, h as WikiGraphJobEnqueueResult, i as WikiGraphJobEventListener, j as WikiGraphJobEventsOptions, k as WikiGraphJobListOptions, l as WikiGraphJobSubscriptionOptions } from './jobs-Dd5PMSId.js';
7
7
  import { ContinuationCursor, QueryIndexScope, ArchiveSourceLocatorResult, ArchiveCollectionResult, ArchiveFindResult, ArchiveEvidence, ArchiveRelatedResult, WikiGraphLibraryRecord, WikiGraphLibraryArchiveRecord, WikiGraphLibraryScanResult, ParsedWikiGraphLibraryUri, WikiGraphLibraryIndexState, rebuildWikiGraphLibraryIndex, ArchiveFindOptions, ArchiveCollectionOptions, readWikiGraphLibraryPage, ArchivePage, listRelatedWikiGraphLibraryObjects, listWikiGraphLibraryEvidence, ArchivePack } from 'wiki-graph-core';
8
- export { ArchiveBacklinkBucket, ArchiveBacklinks, ArchiveCollectionOptions, ArchiveCollectionResult, ArchiveEvidence, ArchiveEvidenceItem, ArchiveFindEvidencePreview, ArchiveFindHit, ArchiveFindOptions, ArchiveFindResult, ArchiveListItem, ArchivePack, ArchivePage, ArchiveRelatedResult, ArchiveSourceLocator, ArchiveSourceLocatorResult, ArchiveTriplePattern, BookMeta, BuildJob, BuildJobEvent, BuildJobProgressCounter, BuildJobTarget, ChapterDetails, ChapterEntry, ChapterStage, ChapterTree, ChapterTreeApplyResult, ContinuationCursor, DEFAULT_EXTRACTION_PROMPT, DEFAULT_KNOWLEDGE_GRAPH_RECALL_PROMPT, File, IndexArtifactKind, LLMPaymentRequiredError, LocatedWikiGraphUri, ParsedWikiGraphLibraryUri, QueryIndexScope, SearchIndexEmbeddingProvider, WIKI_GRAPH_URI_PREFIX, WikiGraphError, WikiGraphLLMOptions, WikiGraphLibraryArchiveRecord, WikiGraphLibraryIndexState, WikiGraphLibraryRecord, WikiGraphLibraryScanResult, WikiGraphMaintenanceUpgradeResult, WikiGraphProgressCallback, WikiGraphProgressEvent, WikispineProvider, formatError, formatLocatedChapterResourceUri, formatLocatedChapterSourceCollectionUri, formatLocatedChapterUri, formatLocatedWikiGraphUri, formatWikiGraphCommandUri, formatWikiGraphLibraryUri, isSourceLocatorScopeUri, isWikiGraphLibraryUri, parseChapterPath, parseChapterTreeInput, parseChapterUriPath, parseLocatedWikiGraphUri, parseSourceTextJsonl, parseWikiGraphLibraryUri, parseWikiGraphUriSyntax, resolveExtractionPrompt, resolveKnowledgeGraphRecallPrompt } from 'wiki-graph-core';
8
+ export { ArchiveBacklinkBucket, ArchiveBacklinks, ArchiveCollectionOptions, ArchiveCollectionResult, ArchiveEvidence, ArchiveEvidenceItem, ArchiveFindEvidencePreview, ArchiveFindHit, ArchiveFindOptions, ArchiveFindResult, ArchiveListItem, ArchivePack, ArchivePage, ArchiveRelatedResult, ArchiveSourceLocator, ArchiveSourceLocatorResult, ArchiveTriplePattern, BookMeta, BuildJob, BuildJobEvent, BuildJobProgressCounter, BuildJobTarget, ChapterDetails, ChapterEntry, ChapterStage, ChapterTree, ChapterTreeApplyResult, ContinuationCursor, DEFAULT_EXTRACTION_PROMPT, DEFAULT_KNOWLEDGE_GRAPH_RECALL_PROMPT, File, IndexArtifactKind, LLMPaymentRequiredError, LocatedWikiGraphUri, ParsedWikiGraphLibraryUri, QueryIndexScope, SearchIndexEmbeddingProvider, SourceArtifactInput, WIKI_GRAPH_URI_PREFIX, WikiGraphError, WikiGraphLLMOptions, WikiGraphLibraryArchiveRecord, WikiGraphLibraryIndexState, WikiGraphLibraryRecord, WikiGraphLibraryScanResult, WikiGraphMaintenanceUpgradeResult, WikiGraphProgressCallback, WikiGraphProgressEvent, WikispineProvider, formatError, formatLocatedChapterResourceUri, formatLocatedChapterSourceCollectionUri, formatLocatedChapterUri, formatLocatedWikiGraphUri, formatWikiGraphCommandUri, formatWikiGraphLibraryUri, isSourceLocatorScopeUri, isWikiGraphLibraryUri, parseChapterPath, parseChapterTreeInput, parseChapterUriPath, parseLocatedWikiGraphUri, parseSourceTextJsonl, parseWikiGraphLibraryUri, parseWikiGraphUriSyntax, resolveExtractionPrompt, resolveKnowledgeGraphRecallPrompt } from 'wiki-graph-core';
9
9
  import { WikiGraphConversionManager } from './conversions.js';
10
10
  export { WikiGraphConversionFormat, WikiGraphConversionInput, WikiGraphConversionOptions, WikiGraphConversionResult, WikiGraphSourceFormat } from './conversions.js';
11
11
  export { WikiGraphQueueWorkerOptions, requireKnowledgeGraphWikispineConfig, runWikiGraphQueueWorker } from './default-worker.js';
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ globalThis.__WIKIGRAPH_DATA_DIR__ ??= __WIKIGRAPH_RESOLVE__(__WIKIGRAPH_FILE_URL
6
6
  import { randomUUID as randomUUID2 } from "crypto";
7
7
  import { link, mkdtemp, rename as rename2, rm as rm3, stat as stat2 } from "fs/promises";
8
8
  import { tmpdir } from "os";
9
- import { basename as basename2, dirname as dirname2, join as join3 } from "path";
9
+ import { basename as basename3, dirname as dirname2, join as join3 } from "path";
10
10
  import { Readable as Readable2 } from "stream";
11
11
  import {
12
12
  addChapter,
@@ -51,7 +51,10 @@ import {
51
51
  } from "wiki-graph-core";
52
52
 
53
53
  // src/conversions.ts
54
+ import { createHash } from "crypto";
55
+ import { createReadStream } from "fs";
54
56
  import { rm as rm2 } from "fs/promises";
57
+ import { basename as basename2 } from "path";
55
58
  import {
56
59
  WikiGraph
57
60
  } from "wiki-graph-core";
@@ -1396,6 +1399,9 @@ var WikiGraphConversionManager = class {
1396
1399
  if (options.targetStage !== void 0 && options.output.format !== "wikg") {
1397
1400
  throw new Error("targetStage is only supported for wikg output.");
1398
1401
  }
1402
+ if (options.output.format === "pcex") {
1403
+ throw new Error("pcex is supported only as a conversion input.");
1404
+ }
1399
1405
  if (options.targetStage !== void 0 && options.input.format === "wikg") {
1400
1406
  throw new Error(
1401
1407
  "targetStage is only supported when creating a wikg archive."
@@ -1414,7 +1420,13 @@ var WikiGraphConversionManager = class {
1414
1420
  options.digestDirectory,
1415
1421
  requiresDigest
1416
1422
  );
1423
+ let chapterCount;
1417
1424
  const write = async (archive) => {
1425
+ if (requiresDigest) await options.onSourceImported?.();
1426
+ if (typeof archive.readToc === "function") {
1427
+ const toc = await archive.readToc();
1428
+ chapterCount = toc === void 0 ? void 0 : countTocChapters(toc.items);
1429
+ }
1418
1430
  await writeArchive(archive, options.output.path, options.output.format);
1419
1431
  };
1420
1432
  if (options.input.format === "wikg") {
@@ -1447,16 +1459,28 @@ var WikiGraphConversionManager = class {
1447
1459
  };
1448
1460
  if (options.input.format === "epub") {
1449
1461
  await app.digestEpubSession(digestOptions, write);
1462
+ } else if (options.input.format === "pcex") {
1463
+ await app.digestPcexSession(
1464
+ {
1465
+ ...digestOptions,
1466
+ pdfDigest: options.input.sourcePdf.digest,
1467
+ ...options.input.sourcePdf.name === void 0 ? {} : { pdfName: options.input.sourcePdf.name }
1468
+ },
1469
+ write
1470
+ );
1450
1471
  } else if (options.input.format === "markdown") {
1451
1472
  await app.digestMarkdownSession(digestOptions, write);
1452
1473
  } else {
1453
1474
  await app.digestTxtSession(digestOptions, write);
1454
1475
  }
1455
1476
  }
1477
+ const sourceArtifact = await resolveSourceArtifact(options.input);
1456
1478
  return {
1479
+ ...chapterCount === void 0 ? {} : { chapterCount },
1457
1480
  inputFormat: options.input.format,
1458
1481
  outputFormat: options.output.format,
1459
- outputPath: options.output.path
1482
+ outputPath: options.output.path,
1483
+ ...sourceArtifact === void 0 ? {} : { sourceArtifact }
1460
1484
  };
1461
1485
  }
1462
1486
  };
@@ -1472,8 +1496,48 @@ async function writeArchive(archive, path, format) {
1472
1496
  const file = new NodeFile(resolveWikiGraphRuntimePath(path));
1473
1497
  if (format === "epub") await archive.exportEpub(file);
1474
1498
  else if (format === "wikg") await archive.saveAs(file);
1499
+ else if (format === "pcex") throw new Error("pcex output is not supported.");
1475
1500
  else await archive.exportText(file);
1476
1501
  }
1502
+ async function resolveSourceArtifact(input) {
1503
+ if (!("path" in input) || input.format === "wikg") return void 0;
1504
+ if (input.format === "pcex") {
1505
+ return {
1506
+ digest: input.sourcePdf.digest.trim().toLowerCase(),
1507
+ mediaType: "application/pdf",
1508
+ ...input.sourcePdf.name === void 0 ? {} : { name: input.sourcePdf.name }
1509
+ };
1510
+ }
1511
+ if (input.format !== "epub") return void 0;
1512
+ const path = resolveWikiGraphRuntimePath(input.path);
1513
+ const hash = createHash("sha256");
1514
+ try {
1515
+ for await (const chunk of createReadStream(path)) {
1516
+ hash.update(chunk);
1517
+ }
1518
+ } catch (error) {
1519
+ if (isNodeErrorCode(error, "ENOENT")) return void 0;
1520
+ throw error;
1521
+ }
1522
+ return {
1523
+ digest: hash.digest("hex"),
1524
+ mediaType: "application/epub+zip",
1525
+ name: basename2(path)
1526
+ };
1527
+ }
1528
+ function isNodeErrorCode(error, code) {
1529
+ return typeof error === "object" && error !== null && "code" in error && error.code === code;
1530
+ }
1531
+ function countTocChapters(items) {
1532
+ let count = 0;
1533
+ for (const item of items) {
1534
+ if (item.serialId !== void 0) count += 1;
1535
+ count += countTocChapters(
1536
+ item.children
1537
+ );
1538
+ }
1539
+ return count;
1540
+ }
1477
1541
 
1478
1542
  // src/query-runtime.ts
1479
1543
  import {
@@ -2188,7 +2252,7 @@ var WikiGraphArchiveManager = class {
2188
2252
  }
2189
2253
  const outputPath = join3(
2190
2254
  dirname2(path),
2191
- `.${basename2(path)}.${randomUUID2()}.tmp.wikg`
2255
+ `.${basename3(path)}.${randomUUID2()}.tmp.wikg`
2192
2256
  );
2193
2257
  try {
2194
2258
  if (options.importPath === void 0) {
@@ -3439,12 +3503,12 @@ import {
3439
3503
  getChapterDetails,
3440
3504
  openWikimediaResolver as openWikimediaResolver2,
3441
3505
  recordBuildJobInputRevision,
3442
- WikiGraphArchiveFile as WikiGraphArchiveFile3,
3506
+ WikiGraphArchiveFile as WikiGraphArchiveFile4,
3443
3507
  WikiGraphScope,
3444
3508
  withLoggingContext
3445
3509
  } from "wiki-graph-core";
3446
3510
  import {
3447
- applyChapterJobArtifactFile as applyChapterJobArtifactFile2,
3511
+ applyChapterJobArtifactFile as applyChapterJobArtifactFile3,
3448
3512
  createLocalChapterJobFileExecutor as createLocalChapterJobFileExecutor2,
3449
3513
  writeChapterJobInputFile as writeChapterJobInputFile2
3450
3514
  } from "wiki-graph-core/worker";
@@ -3486,10 +3550,12 @@ async function loadRequiredStageConfig(options) {
3486
3550
 
3487
3551
  // src/worker.ts
3488
3552
  import {
3553
+ applyChapterJobArtifactFile,
3489
3554
  runBuildJobWorker as runCoreBuildJobWorker
3490
3555
  } from "wiki-graph-core/worker";
3556
+ import { WikiGraphArchiveFile as WikiGraphArchiveFile3 } from "wiki-graph-core";
3491
3557
  import {
3492
- applyChapterJobArtifactFile,
3558
+ applyChapterJobArtifactFile as applyChapterJobArtifactFile2,
3493
3559
  createLocalChapterJobFileExecutor,
3494
3560
  writeChapterJobInputFile
3495
3561
  } from "wiki-graph-core/worker";
@@ -3531,7 +3597,7 @@ async function executeBuildJob(job, reporter, context) {
3531
3597
  let stage = await readChapterStage(job);
3532
3598
  if (stage === "sourced") {
3533
3599
  await executeStep(job, "reading-graph", execution, reporter, context, {
3534
- ...execution.extractionPrompt === void 0 ? {} : { extractionPrompt: execution.extractionPrompt }
3600
+ ...execution.extractionPrompt === void 0 ? {} : { prompt: execution.extractionPrompt }
3535
3601
  });
3536
3602
  stage = await readChapterStage(job);
3537
3603
  }
@@ -3564,8 +3630,8 @@ async function executeBuildJob(job, reporter, context) {
3564
3630
  }
3565
3631
  }
3566
3632
  await executeStep(job, job.target, execution, reporter, context, {
3567
- ...job.target === "reading-graph" ? { extractionPrompt: execution.extractionPrompt } : {},
3568
- ...job.target === "knowledge-graph" ? { policyPrompt: execution.knowledgeGraphPrompt } : {}
3633
+ ...job.target === "reading-graph" ? { prompt: execution.extractionPrompt } : {},
3634
+ ...job.target === "knowledge-graph" ? { prompt: execution.knowledgeGraphPrompt } : {}
3569
3635
  });
3570
3636
  } finally {
3571
3637
  await execution.close();
@@ -3580,7 +3646,7 @@ async function executeStep(job, kind, execution, reporter, context, inputOptions
3580
3646
  const stepWorkspace = await resetStepWorkspace(job.workspace, kind);
3581
3647
  const inputFile = await stepWorkspace.createFile("input.jsonl");
3582
3648
  const outputWorkspace = await stepWorkspace.createDirectory("output");
3583
- const revision = await new WikiGraphArchiveFile3(job.archive).readDocument(
3649
+ const revision = await new WikiGraphArchiveFile4(job.archive).readDocument(
3584
3650
  async (document) => {
3585
3651
  await getChapterDetails(document, job.chapterId);
3586
3652
  return await writeChapterJobInputFile2(
@@ -3622,9 +3688,9 @@ async function executeStep(job, kind, execution, reporter, context, inputOptions
3622
3688
  total: 1,
3623
3689
  unit: "item"
3624
3690
  });
3625
- await new WikiGraphArchiveFile3(job.archive).write(async (document) => {
3691
+ await new WikiGraphArchiveFile4(job.archive).write(async (document) => {
3626
3692
  assertJobStillRunning(await getBuildJob(job.jobId));
3627
- await applyChapterJobArtifactFile2(
3693
+ await applyChapterJobArtifactFile3(
3628
3694
  document,
3629
3695
  job.chapterId,
3630
3696
  kind,
@@ -3707,12 +3773,12 @@ async function resetStepWorkspace(workspace, kind) {
3707
3773
  return await workspace.createDirectory(name);
3708
3774
  }
3709
3775
  async function readChapterStage(job) {
3710
- return await new WikiGraphArchiveFile3(job.archive).readDocument(
3776
+ return await new WikiGraphArchiveFile4(job.archive).readDocument(
3711
3777
  async (document) => (await getChapterDetails(document, job.chapterId)).stage
3712
3778
  );
3713
3779
  }
3714
3780
  async function assertCurrentFtsArtifact(job) {
3715
- await new WikiGraphArchiveFile3(job.archive).readDocument(async (document) => {
3781
+ await new WikiGraphArchiveFile4(job.archive).readDocument(async (document) => {
3716
3782
  const revision = await document.serials.getRevision(job.chapterId);
3717
3783
  const artifact = await document.indexArtifacts.get(job.chapterId, "fts");
3718
3784
  if (artifact?.sourceRevision !== revision) {
@@ -3826,7 +3892,7 @@ import {
3826
3892
  resumeBuildJob,
3827
3893
  updateBuildJobTarget,
3828
3894
  resolveChapterPathReadonly as resolveChapterPathReadonly2,
3829
- WikiGraphArchiveFile as WikiGraphArchiveFile4
3895
+ WikiGraphArchiveFile as WikiGraphArchiveFile5
3830
3896
  } from "wiki-graph-core";
3831
3897
  var TERMINAL_STATES = /* @__PURE__ */ new Set(["canceled", "failed", "succeeded"]);
3832
3898
  var TERMINAL_EVENT_GRACE_READS = 3;
@@ -3917,7 +3983,7 @@ var WikiGraphJobManager = class {
3917
3983
  const entries = (await Promise.all(
3918
3984
  [...jobsByArchive].map(async ([archivePath, archiveJobs]) => {
3919
3985
  try {
3920
- const chapters = await new WikiGraphArchiveFile4(
3986
+ const chapters = await new WikiGraphArchiveFile5(
3921
3987
  new NodeFile(archivePath)
3922
3988
  ).readDocument(async (document) => await listChapters3(document));
3923
3989
  const chaptersById = new Map(
@@ -3956,7 +4022,7 @@ var WikiGraphJobManager = class {
3956
4022
  const target = options.target ?? "reading-summary";
3957
4023
  await validateQueueTargetConfig(target, options.llmJSON);
3958
4024
  const selectedExplicitly = options.chapterId !== void 0 || options.chapterIds !== void 0 || options.chapterPath !== void 0 || options.depth !== void 0;
3959
- const candidates = await new WikiGraphArchiveFile4(
4025
+ const candidates = await new WikiGraphArchiveFile5(
3960
4026
  location.archiveFile
3961
4027
  ).readDocument(async (document) => {
3962
4028
  const chapters = await listChapters3(document);
@@ -4017,7 +4083,7 @@ var WikiGraphJobManager = class {
4017
4083
  const target = options.target ?? "reading-summary";
4018
4084
  await validateQueueTargetConfig(target, options.llmJSON);
4019
4085
  const selectedExplicitly = options.chapterId !== void 0 || options.chapterIds !== void 0 || options.chapterPath !== void 0 || options.depth !== void 0;
4020
- const candidates = await new WikiGraphArchiveFile4(
4086
+ const candidates = await new WikiGraphArchiveFile5(
4021
4087
  location.archiveFile
4022
4088
  ).readDocument(async (document) => {
4023
4089
  const chapters = await listChapters3(document);
@@ -4585,7 +4651,7 @@ import {
4585
4651
  parseWikiGraphLibraryUri as parseWikiGraphLibraryUri3,
4586
4652
  upgradeWikiGraphMaintenanceTarget
4587
4653
  } from "wiki-graph-core";
4588
- import { basename as basename3 } from "path";
4654
+ import { basename as basename4 } from "path";
4589
4655
  var WikiGraphMaintenanceManager = class {
4590
4656
  #runtime;
4591
4657
  constructor(runtime) {
@@ -4625,7 +4691,7 @@ var WikiGraphMaintenanceManager = class {
4625
4691
  const resolvedOutputPath = resolveWikiGraphRuntimePath(outputPath);
4626
4692
  await migrateLegacySdpubToWikg(
4627
4693
  new NodeFile(resolvedInputPath),
4628
- new NodeFile(resolvedOutputPath, basename3(resolvedOutputPath))
4694
+ new NodeFile(resolvedOutputPath, basename4(resolvedOutputPath))
4629
4695
  );
4630
4696
  return {
4631
4697
  inputPath: resolvedInputPath,