wiki-graph-core 0.4.0 → 0.4.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.cts CHANGED
@@ -1667,7 +1667,9 @@ declare function listArchiveEvidence(document: ReadonlyDocument, uri: string, op
1667
1667
  declare function packArchiveContext(document: ReadonlyDocument, id: string, budget: number): Promise<ArchivePack>;
1668
1668
 
1669
1669
  declare function findWikiGraphLibraryObjects(target: ParsedWikiGraphLibraryUri, query: string, options?: ArchiveFindOptions): Promise<ArchiveFindResult>;
1670
+ declare function findWikiGraphLibraryArchiveMembers(target: ParsedWikiGraphLibraryUri, query: string, options?: ArchiveFindOptions): Promise<ArchiveFindResult>;
1670
1671
  declare function listWikiGraphLibraryObjects(target: ParsedWikiGraphLibraryUri, options?: ArchiveCollectionOptions): Promise<ArchiveCollectionResult>;
1672
+ declare function listWikiGraphLibraryArchiveMembers(target: ParsedWikiGraphLibraryUri, options?: ArchiveCollectionOptions): Promise<ArchiveCollectionResult>;
1671
1673
  declare function readWikiGraphLibraryPage(target: ParsedWikiGraphLibraryUri, objectUri: string, options?: Parameters<typeof readArchivePage>[2]): Promise<ArchivePage>;
1672
1674
  declare function listWikiGraphLibraryEvidence(target: ParsedWikiGraphLibraryUri, objectUri: string, options?: ArchiveEvidenceOptions): Promise<ArchiveEvidence>;
1673
1675
  declare function listRelatedWikiGraphLibraryObjects(target: ParsedWikiGraphLibraryUri, objectUri: string, options?: ArchiveRelatedOptions): Promise<ArchiveRelatedResult>;
@@ -2496,9 +2498,14 @@ declare class WikiGraphArchiveFile {
2496
2498
  declare function ensureWikiGraphHomeSchemaCurrent(): Promise<void>;
2497
2499
  declare function readWikiGraphHomeSchemaVersion(coreDatabasePath?: string): Promise<number>;
2498
2500
 
2501
+ interface WikiGraphArchiveSchemaUpgradeResult {
2502
+ readonly changed: boolean;
2503
+ readonly repairedToc: boolean;
2504
+ readonly schemaChanged: boolean;
2505
+ }
2499
2506
  declare function ensureWikiGraphArchiveSchemaCurrent(archivePath: string): Promise<void>;
2500
2507
  declare function readWikiGraphArchiveSchemaVersion(archivePath: string): Promise<number>;
2501
- declare function upgradeWikiGraphArchiveSchema(archivePath: string): Promise<void>;
2508
+ declare function upgradeWikiGraphArchiveSchema(archivePath: string): Promise<WikiGraphArchiveSchemaUpgradeResult>;
2502
2509
 
2503
2510
  type WikiGraphMaintenanceUpgradeResult = {
2504
2511
  readonly kind: "home";
@@ -2695,4 +2702,4 @@ declare function collectReadingGraphObjects(chapterId: number, objects: AsyncIte
2695
2702
  }>;
2696
2703
  declare function createSummaryInputSnapshotFromReadingGraphObjects(chapterId: number, objects: AsyncIterable<WikgObject> | Iterable<WikgObject>): Promise<SummaryInputSnapshotData>;
2697
2704
 
2698
- export { AddBuildJobOptions, type AddChapterOptions, type AdvanceChapterStagesOptions, type AdvanceChapterStagesProgressCallback, type AdvanceChapterStagesProgressEvent, type AdvanceChapterStagesResult, type ArchiveBacklinkBucket, type ArchiveBacklinks, type ArchiveCollectionOptions, type ArchiveCollectionResult, type ArchiveCollectionType, type ArchiveEvidence, type ArchiveEvidenceItem, type ArchiveFindEvidencePreview, type ArchiveFindField, type ArchiveFindFilterType, type ArchiveFindHit, type ArchiveFindObjectType, type ArchiveFindOptions, type ArchiveFindOrder, type ArchiveFindPosition, type ArchiveFindResult, type ArchiveIndex, type ArchiveLibrarySource, type ArchiveListItem, type ArchiveListKind, type ArchiveNodeLabel, type ArchiveNodeSourceFragment, type ArchiveObjectType, type ArchivePack, type ArchivePage, type ArchiveRelatedResult, type ArchiveTriplePattern, type BookMeta, type BuildChapterGraphArtifactOptions, type BuildChapterKnowledgeGraphArtifactOptions, type BuildChapterSummaryArtifactOptions, BuildJob, BuildJobConflictScope, BuildJobEvent, BuildJobListOptions, BuildJobProgressReporter, BuildJobState, BuildJobTarget, type BuildWikimatchWindowsOptions, CHAPTER_STAGES, CLI_FULL_COMMAND, CLI_PRIMARY_COMMAND, type CachedDisambiguationRecord, type CachedPageRecord, type CachedQidRecord, type ChapterDetails, type ChapterEntry, type ChapterGraphBuildArtifact, type ChapterKnowledgeGraphBuildArtifact, type ChapterKnowledgeGraphInputSnapshot, type ChapterStage, type ChapterTree, type ChapterTreeApplyResult, type ChapterTreeInput, type ChapterTreeInputNode, type ChapterTreeMoveChange, type ChapterTreeNode, type ChapterTreeTitleChange, type ContinuationCursor, DEFAULT_EXTRACTION_PROMPT, DEFAULT_KNOWLEDGE_GRAPH_RECALL_PROMPT, DEFAULT_WIKISPINE_FETCH_ENDPOINT, Database, type DigestProgressEvent, DirectoryDocument, type DisambiguationExpansion, type DisambiguationLinkedQid, type DisambiguationMeaningPriority, type DisambiguationPageText, type DisambiguationProfile, type DisambiguationProfileError, type DisambiguationProfileMeaning, type DisambiguationProfileNormalizer, type DisambiguationProfileNormalizerInput, type Document, EVIDENCE_SELECTION_JSON_SHAPE, EVIDENCE_SELECTION_PROMPT_FRAGMENT, type EnrichmentStore, type EvidenceQuoteMatchStrategy, type EvidenceQuoteScore, type EvidenceSelection, type EvidenceSelectionCandidate, type EvidenceSelectionFailure, type EvidenceSelectionList, type EvidenceSelectionResolution, type EvidenceSelectionSentence, type EvidenceSentenceId, type GenerateChapterGraphOptions, type GenerateChapterSummaryOptions, type GuaranteedRequest, type GuaranteedRequestController, type JudgeWikimatchPolicyOptions, LLM, type LLMOptions, LLMPaymentRequiredError, type LLMRequestOptions, type LLMStreamProgressCallback, type LLMTokenUsage, type LLMTokenUsageCallback, type LLMessage, Language, LanguageCode, type LocatedWikiGraphUri, type MoveChapterOptions, ObjectMetadataKind, type ObjectMetadataTarget, type ParsedWikiGraphLibraryUri, type ParsedWikiGraphUri, type QidResolution, type QueryIndexScope, type QueryScope, RateLimiter, type ReadonlyDocument, type SerialDiscoveryItem, type SerialProgressEvent, type SerialsDiscoveredEvent, TOC_FILE_VERSION, WIKG_OBJECT_SCHEMA_VERSION, WIKI_GRAPH_CONTEXT_VERSION, WIKI_GRAPH_EDITOR_SCOPES, WIKI_GRAPH_JOB_URI_PREFIX, WIKI_GRAPH_READER_SCOPES, WIKI_GRAPH_SCOPES, WIKI_GRAPH_URI_PREFIX, type WikgObject, type WikiClient, WikiGraph, WikiGraphArchive, WikiGraphArchiveFile, type WikiGraphLLMOptions, type WikiGraphLibraryArchiveRecord, type WikiGraphLibraryIndexObjectHit, type WikiGraphLibraryIndexQueryResult, type WikiGraphLibraryIndexSource, type WikiGraphLibraryIndexState, type WikiGraphLibraryIndexStatus, type WikiGraphLibraryIndexTextHit, type WikiGraphLibraryRecord, type WikiGraphLibraryScanResult, type WikiGraphLibraryUpgradeResult, type WikiGraphMaintenanceUpgradeResult, type WikiGraphOpenSessionOptions, type WikiGraphOperation, type WikiGraphOptions, type WikiGraphProgressCallback, type WikiGraphProgressEvent, type WikiGraphProgressEventType, WikiGraphScope, type WikiGraphSerialEntry, type WikiGraphSourceSessionOptions, WikiGraphTask, WikiGraphTaskContext, type WikiGraphTaskContextOptions, type WikiGraphTaskIdentity, type WikiGraphTaskType, type WikiGraphTextStreamSessionOptions, type WikimatchAcceptedMention, type WikimatchCandidate, type WikimatchConflictGroup, type WikimatchPolicyDecision, type WikimatchPolicyDecisionOutput, type WikimatchPolicyFallback, type WikimatchPolicyJudgeInput, type WikimatchPolicyJudgeResult, type WikimatchPolicyResponse, type WikimatchPolicyUpdate, type WikimatchQidOption, type WikimatchTextRange, type WikimatchWindow, WikimediaClient, WikipageCache, WikipageResolver, type WikipageResolverOptions, type WikipageSitelink, type WikispineProvider, addBuildJob, addChapter, addWikiGraphLibraryArchive, advanceChapterStages, applyChapterTree, assertBuildJobInputRevision, assertNoActiveBuildJobConflicts, assertNoActiveBuildJobs, assertWikiGraphLibrarySchemaCurrent, boostBuildJob, buildChapterGraphArtifact, buildChapterKnowledgeGraphArtifact, buildChapterSummaryArtifact, buildChapterSummaryArtifactFromReadingGraphObjects, buildChapterSummaryArtifactFromSnapshot, buildWikimatchWindows, cancelBuildJob, cleanBuildJobs, clearChapterKnowledgeGraph, clearWikiGraphLibraryMetadata, collectChapterKnowledgeGraphObjects, collectReadingGraphObjects, commitChapterGraphArtifact, commitChapterKnowledgeGraphArtifact, commitChapterSummaryArtifact, createChapterKnowledgeGraphObjectStream, createChapterReadingGraphObjectStream, createContinuationCursor, createDefaultWikiGraphSampling, createDisambiguationProfileNormalizer, createEnrichmentProgressReporter, createEnv, createSummaryInputSnapshotFromReadingGraphObjects, createWikiGraphLibrary, createWikiGraphTaskId, createWikiGraphTempDirectory, deleteArchiveSearchSessions, deleteWikiGraphLibraryMetadataKey, disableWikiGraphLibraryIndex, ensureDefaultWikiGraphLibrary, ensureLibraryManagedArchiveHasNoSearchIndex, ensureWikiGraphArchiveSchemaCurrent, ensureWikiGraphHomeSchemaCurrent, finalizeWikiGraphLibraryArchiveWrite, findArchiveObjects, findWikiGraphLibraryObjects, formatChapterId, formatChapterUri, formatEdgeId, formatError, formatEvidenceSelectionChoicePrompt, formatLanguageForPrompt, formatLocatedChapterResourceUri, formatLocatedChapterSourceCollectionUri, formatLocatedChapterUri, formatLocatedWikiGraphUri, formatNodeId, formatSummaryId, formatWikiGraphCommandUri, formatWikiGraphLibraryUri, generateChapterGraph, generateChapterKnowledgeGraphArtifact, generateChapterKnowledgeGraphArtifactFromSnapshot, generateChapterSummary, getArchiveIndex, getBuildJob, getChapterDetails, getChapterTree, getLanguageCode, getWikiGraphLibraryArchive, getWikiGraphLibraryArchiveById, getWikiGraphLibraryMetadata, getWikipageLanguageCode, grepArchiveObjects, groundWikimatchCandidates, isArchiveSearchIndexCurrent, isWikiGraphJobUri, isWikiGraphLibraryUri, isWikiGraphUri, judgeWikimatchPolicy, listAllArchiveLinks, listArchiveCollection, listArchiveEvidence, listArchiveLinks, listArchiveObjects, listBuildJobs, listChapters, listRelatedArchiveObjects, listRelatedWikiGraphLibraryObjects, listWikiGraphLibraries, listWikiGraphLibraryArchives, listWikiGraphLibraryEvidence, listWikiGraphLibraryIndexArchiveIdsForObject, listWikiGraphLibraryObjects, listWikiGraphLibraryScope, markWikiGraphLibraryIndexDirty, migrateLegacySdpubToWikg, moveChapter, moveWikiGraphLibraryArchive, normalizeEvidenceDisplayText, normalizeEvidenceText, normalizeLanguageCode, openSharedStateDatabase, packArchiveContext, packWikiGraphLibraryContext, parseChapterPath, parseChapterTreeInput, parseChapterUriPath, parseLocatedWikiGraphUri, parsePolicyResponse, parseRetryAfterMs, parseWikgObject, parseWikiGraphLibraryUri, parseWikiGraphUriSyntax, pauseBuildJob, putWikiGraphLibraryMetadata, queryWikiGraphLibrarySearchIndex, rankEvidenceQuote, readArchiveIndexSettings, readArchivePage, readArchiveText, readBuildJobEvents, readChapterBuildInput, readContinuationCursor, readWikgArchiveFormatVersion, readWikgObjectsFromJsonl, readWikiGraphArchiveSchemaVersion, readWikiGraphHomeSchemaVersion, readWikiGraphLibraryIndexState, readWikiGraphLibraryPage, rebindWikiGraphLibrary, rebuildArchiveSearchIndex, rebuildWikiGraphLibraryIndex, recordBuildJobInputRevision, removeChapter, removeWikiGraphLibrary, removeWikiGraphLibraryArchive, replaceWikiGraphLibraryMetadata, requireArchiveUri, requireLocatedObjectOrArchiveUri, requireLocatedObjectUri, resetChapter, resolveBuildJobId, resolveChapterPath, resolveChapterPathReadonly, resolveDataDirPath, resolveDefaultWikiGraphLibraryDirectoryPath, resolveEvidenceSelection, resolveEvidenceSelectionList, resolveExtractionPrompt, resolveKnowledgeGraphRecallPrompt, resolveWikiGraphCoreDatabasePath, resolveWikiGraphHomeDirectoryPath, resolveWikiGraphLibrary, resolveWikiGraphLibraryArchivePath, resolveWikiGraphLibraryById, resolveWikiGraphLibraryQueryTargetById, resolveWikiGraphLibraryStagingDirectoryPath, resolveWikiGraphStateRootPath, resumeBuildJob, scanWikiGraphLibrary, scoreEvidenceQuote, setChapterSource, setChapterSummary, setChapterTitle, setFtsIndexEmbedded, snapshotChapterKnowledgeGraphInput, snapshotChapterSummaryInput, testWikispineRuntime, updateBuildJobTarget, upgradeWikiGraphArchiveSchema, upgradeWikiGraphLibrarySchema, upgradeWikiGraphMaintenanceTarget, validatePolicyResponse, withLoggingContext, withWikiGraphRuntimeEnvironment, withWikiGraphRuntimeStateDirectoryPath, writeWikgArchive, writeWikgObjectsToJsonl };
2705
+ export { AddBuildJobOptions, type AddChapterOptions, type AdvanceChapterStagesOptions, type AdvanceChapterStagesProgressCallback, type AdvanceChapterStagesProgressEvent, type AdvanceChapterStagesResult, type ArchiveBacklinkBucket, type ArchiveBacklinks, type ArchiveCollectionOptions, type ArchiveCollectionResult, type ArchiveCollectionType, type ArchiveEvidence, type ArchiveEvidenceItem, type ArchiveFindEvidencePreview, type ArchiveFindField, type ArchiveFindFilterType, type ArchiveFindHit, type ArchiveFindObjectType, type ArchiveFindOptions, type ArchiveFindOrder, type ArchiveFindPosition, type ArchiveFindResult, type ArchiveIndex, type ArchiveLibrarySource, type ArchiveListItem, type ArchiveListKind, type ArchiveNodeLabel, type ArchiveNodeSourceFragment, type ArchiveObjectType, type ArchivePack, type ArchivePage, type ArchiveRelatedResult, type ArchiveTriplePattern, type BookMeta, type BuildChapterGraphArtifactOptions, type BuildChapterKnowledgeGraphArtifactOptions, type BuildChapterSummaryArtifactOptions, BuildJob, BuildJobConflictScope, BuildJobEvent, BuildJobListOptions, BuildJobProgressReporter, BuildJobState, BuildJobTarget, type BuildWikimatchWindowsOptions, CHAPTER_STAGES, CLI_FULL_COMMAND, CLI_PRIMARY_COMMAND, type CachedDisambiguationRecord, type CachedPageRecord, type CachedQidRecord, type ChapterDetails, type ChapterEntry, type ChapterGraphBuildArtifact, type ChapterKnowledgeGraphBuildArtifact, type ChapterKnowledgeGraphInputSnapshot, type ChapterStage, type ChapterTree, type ChapterTreeApplyResult, type ChapterTreeInput, type ChapterTreeInputNode, type ChapterTreeMoveChange, type ChapterTreeNode, type ChapterTreeTitleChange, type ContinuationCursor, DEFAULT_EXTRACTION_PROMPT, DEFAULT_KNOWLEDGE_GRAPH_RECALL_PROMPT, DEFAULT_WIKISPINE_FETCH_ENDPOINT, Database, type DigestProgressEvent, DirectoryDocument, type DisambiguationExpansion, type DisambiguationLinkedQid, type DisambiguationMeaningPriority, type DisambiguationPageText, type DisambiguationProfile, type DisambiguationProfileError, type DisambiguationProfileMeaning, type DisambiguationProfileNormalizer, type DisambiguationProfileNormalizerInput, type Document, EVIDENCE_SELECTION_JSON_SHAPE, EVIDENCE_SELECTION_PROMPT_FRAGMENT, type EnrichmentStore, type EvidenceQuoteMatchStrategy, type EvidenceQuoteScore, type EvidenceSelection, type EvidenceSelectionCandidate, type EvidenceSelectionFailure, type EvidenceSelectionList, type EvidenceSelectionResolution, type EvidenceSelectionSentence, type EvidenceSentenceId, type GenerateChapterGraphOptions, type GenerateChapterSummaryOptions, type GuaranteedRequest, type GuaranteedRequestController, type JudgeWikimatchPolicyOptions, LLM, type LLMOptions, LLMPaymentRequiredError, type LLMRequestOptions, type LLMStreamProgressCallback, type LLMTokenUsage, type LLMTokenUsageCallback, type LLMessage, Language, LanguageCode, type LocatedWikiGraphUri, type MoveChapterOptions, ObjectMetadataKind, type ObjectMetadataTarget, type ParsedWikiGraphLibraryUri, type ParsedWikiGraphUri, type QidResolution, type QueryIndexScope, type QueryScope, RateLimiter, type ReadonlyDocument, type SerialDiscoveryItem, type SerialProgressEvent, type SerialsDiscoveredEvent, TOC_FILE_VERSION, WIKG_OBJECT_SCHEMA_VERSION, WIKI_GRAPH_CONTEXT_VERSION, WIKI_GRAPH_EDITOR_SCOPES, WIKI_GRAPH_JOB_URI_PREFIX, WIKI_GRAPH_READER_SCOPES, WIKI_GRAPH_SCOPES, WIKI_GRAPH_URI_PREFIX, type WikgObject, type WikiClient, WikiGraph, WikiGraphArchive, WikiGraphArchiveFile, type WikiGraphLLMOptions, type WikiGraphLibraryArchiveRecord, type WikiGraphLibraryIndexObjectHit, type WikiGraphLibraryIndexQueryResult, type WikiGraphLibraryIndexSource, type WikiGraphLibraryIndexState, type WikiGraphLibraryIndexStatus, type WikiGraphLibraryIndexTextHit, type WikiGraphLibraryRecord, type WikiGraphLibraryScanResult, type WikiGraphLibraryUpgradeResult, type WikiGraphMaintenanceUpgradeResult, type WikiGraphOpenSessionOptions, type WikiGraphOperation, type WikiGraphOptions, type WikiGraphProgressCallback, type WikiGraphProgressEvent, type WikiGraphProgressEventType, WikiGraphScope, type WikiGraphSerialEntry, type WikiGraphSourceSessionOptions, WikiGraphTask, WikiGraphTaskContext, type WikiGraphTaskContextOptions, type WikiGraphTaskIdentity, type WikiGraphTaskType, type WikiGraphTextStreamSessionOptions, type WikimatchAcceptedMention, type WikimatchCandidate, type WikimatchConflictGroup, type WikimatchPolicyDecision, type WikimatchPolicyDecisionOutput, type WikimatchPolicyFallback, type WikimatchPolicyJudgeInput, type WikimatchPolicyJudgeResult, type WikimatchPolicyResponse, type WikimatchPolicyUpdate, type WikimatchQidOption, type WikimatchTextRange, type WikimatchWindow, WikimediaClient, WikipageCache, WikipageResolver, type WikipageResolverOptions, type WikipageSitelink, type WikispineProvider, addBuildJob, addChapter, addWikiGraphLibraryArchive, advanceChapterStages, applyChapterTree, assertBuildJobInputRevision, assertNoActiveBuildJobConflicts, assertNoActiveBuildJobs, assertWikiGraphLibrarySchemaCurrent, boostBuildJob, buildChapterGraphArtifact, buildChapterKnowledgeGraphArtifact, buildChapterSummaryArtifact, buildChapterSummaryArtifactFromReadingGraphObjects, buildChapterSummaryArtifactFromSnapshot, buildWikimatchWindows, cancelBuildJob, cleanBuildJobs, clearChapterKnowledgeGraph, clearWikiGraphLibraryMetadata, collectChapterKnowledgeGraphObjects, collectReadingGraphObjects, commitChapterGraphArtifact, commitChapterKnowledgeGraphArtifact, commitChapterSummaryArtifact, createChapterKnowledgeGraphObjectStream, createChapterReadingGraphObjectStream, createContinuationCursor, createDefaultWikiGraphSampling, createDisambiguationProfileNormalizer, createEnrichmentProgressReporter, createEnv, createSummaryInputSnapshotFromReadingGraphObjects, createWikiGraphLibrary, createWikiGraphTaskId, createWikiGraphTempDirectory, deleteArchiveSearchSessions, deleteWikiGraphLibraryMetadataKey, disableWikiGraphLibraryIndex, ensureDefaultWikiGraphLibrary, ensureLibraryManagedArchiveHasNoSearchIndex, ensureWikiGraphArchiveSchemaCurrent, ensureWikiGraphHomeSchemaCurrent, finalizeWikiGraphLibraryArchiveWrite, findArchiveObjects, findWikiGraphLibraryArchiveMembers, findWikiGraphLibraryObjects, formatChapterId, formatChapterUri, formatEdgeId, formatError, formatEvidenceSelectionChoicePrompt, formatLanguageForPrompt, formatLocatedChapterResourceUri, formatLocatedChapterSourceCollectionUri, formatLocatedChapterUri, formatLocatedWikiGraphUri, formatNodeId, formatSummaryId, formatWikiGraphCommandUri, formatWikiGraphLibraryUri, generateChapterGraph, generateChapterKnowledgeGraphArtifact, generateChapterKnowledgeGraphArtifactFromSnapshot, generateChapterSummary, getArchiveIndex, getBuildJob, getChapterDetails, getChapterTree, getLanguageCode, getWikiGraphLibraryArchive, getWikiGraphLibraryArchiveById, getWikiGraphLibraryMetadata, getWikipageLanguageCode, grepArchiveObjects, groundWikimatchCandidates, isArchiveSearchIndexCurrent, isWikiGraphJobUri, isWikiGraphLibraryUri, isWikiGraphUri, judgeWikimatchPolicy, listAllArchiveLinks, listArchiveCollection, listArchiveEvidence, listArchiveLinks, listArchiveObjects, listBuildJobs, listChapters, listRelatedArchiveObjects, listRelatedWikiGraphLibraryObjects, listWikiGraphLibraries, listWikiGraphLibraryArchiveMembers, listWikiGraphLibraryArchives, listWikiGraphLibraryEvidence, listWikiGraphLibraryIndexArchiveIdsForObject, listWikiGraphLibraryObjects, listWikiGraphLibraryScope, markWikiGraphLibraryIndexDirty, migrateLegacySdpubToWikg, moveChapter, moveWikiGraphLibraryArchive, normalizeEvidenceDisplayText, normalizeEvidenceText, normalizeLanguageCode, openSharedStateDatabase, packArchiveContext, packWikiGraphLibraryContext, parseChapterPath, parseChapterTreeInput, parseChapterUriPath, parseLocatedWikiGraphUri, parsePolicyResponse, parseRetryAfterMs, parseWikgObject, parseWikiGraphLibraryUri, parseWikiGraphUriSyntax, pauseBuildJob, putWikiGraphLibraryMetadata, queryWikiGraphLibrarySearchIndex, rankEvidenceQuote, readArchiveIndexSettings, readArchivePage, readArchiveText, readBuildJobEvents, readChapterBuildInput, readContinuationCursor, readWikgArchiveFormatVersion, readWikgObjectsFromJsonl, readWikiGraphArchiveSchemaVersion, readWikiGraphHomeSchemaVersion, readWikiGraphLibraryIndexState, readWikiGraphLibraryPage, rebindWikiGraphLibrary, rebuildArchiveSearchIndex, rebuildWikiGraphLibraryIndex, recordBuildJobInputRevision, removeChapter, removeWikiGraphLibrary, removeWikiGraphLibraryArchive, replaceWikiGraphLibraryMetadata, requireArchiveUri, requireLocatedObjectOrArchiveUri, requireLocatedObjectUri, resetChapter, resolveBuildJobId, resolveChapterPath, resolveChapterPathReadonly, resolveDataDirPath, resolveDefaultWikiGraphLibraryDirectoryPath, resolveEvidenceSelection, resolveEvidenceSelectionList, resolveExtractionPrompt, resolveKnowledgeGraphRecallPrompt, resolveWikiGraphCoreDatabasePath, resolveWikiGraphHomeDirectoryPath, resolveWikiGraphLibrary, resolveWikiGraphLibraryArchivePath, resolveWikiGraphLibraryById, resolveWikiGraphLibraryQueryTargetById, resolveWikiGraphLibraryStagingDirectoryPath, resolveWikiGraphStateRootPath, resumeBuildJob, scanWikiGraphLibrary, scoreEvidenceQuote, setChapterSource, setChapterSummary, setChapterTitle, setFtsIndexEmbedded, snapshotChapterKnowledgeGraphInput, snapshotChapterSummaryInput, testWikispineRuntime, updateBuildJobTarget, upgradeWikiGraphArchiveSchema, upgradeWikiGraphLibrarySchema, upgradeWikiGraphMaintenanceTarget, validatePolicyResponse, withLoggingContext, withWikiGraphRuntimeEnvironment, withWikiGraphRuntimeStateDirectoryPath, writeWikgArchive, writeWikgObjectsToJsonl };
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export { resolveDataDirPath } from './runtime/common/data-dir.js';
10
10
  export { createEnv } from './runtime/common/template.js';
11
11
  export { ParsedWikiGraphLibraryUri, WikiGraphLibraryRecord, clearWikiGraphLibraryMetadata, createWikiGraphLibrary, deleteWikiGraphLibraryMetadataKey, ensureDefaultWikiGraphLibrary, formatWikiGraphLibraryUri, getWikiGraphLibraryMetadata, isWikiGraphLibraryUri, listWikiGraphLibraries, listWikiGraphLibraryScope, parseWikiGraphLibraryUri, putWikiGraphLibraryMetadata, removeWikiGraphLibrary, replaceWikiGraphLibraryMetadata, resolveDefaultWikiGraphLibraryDirectoryPath, resolveWikiGraphLibrary, resolveWikiGraphLibraryById, resolveWikiGraphLibraryStagingDirectoryPath } from './library/registry.js';
12
12
  export { WikiGraphLibraryArchiveRecord, WikiGraphLibraryScanResult, addWikiGraphLibraryArchive, ensureLibraryManagedArchiveHasNoSearchIndex, finalizeWikiGraphLibraryArchiveWrite, getWikiGraphLibraryArchive, getWikiGraphLibraryArchiveById, listWikiGraphLibraryArchives, moveWikiGraphLibraryArchive, rebindWikiGraphLibrary, removeWikiGraphLibraryArchive, resolveWikiGraphLibraryArchivePath, scanWikiGraphLibrary } from './library/membership.js';
13
- export { findWikiGraphLibraryObjects, listRelatedWikiGraphLibraryObjects, listWikiGraphLibraryEvidence, listWikiGraphLibraryObjects, packWikiGraphLibraryContext, readWikiGraphLibraryPage, resolveWikiGraphLibraryQueryTargetById } from './library/query.js';
13
+ export { findWikiGraphLibraryArchiveMembers, findWikiGraphLibraryObjects, listRelatedWikiGraphLibraryObjects, listWikiGraphLibraryArchiveMembers, listWikiGraphLibraryEvidence, listWikiGraphLibraryObjects, packWikiGraphLibraryContext, readWikiGraphLibraryPage, resolveWikiGraphLibraryQueryTargetById } from './library/query.js';
14
14
  export { WikiGraphLibraryIndexObjectHit, WikiGraphLibraryIndexQueryResult, WikiGraphLibraryIndexSource, WikiGraphLibraryIndexState, WikiGraphLibraryIndexStatus, WikiGraphLibraryIndexTextHit, disableWikiGraphLibraryIndex, listWikiGraphLibraryIndexArchiveIdsForObject, markWikiGraphLibraryIndexDirty, queryWikiGraphLibrarySearchIndex, readWikiGraphLibraryIndexState, rebuildWikiGraphLibraryIndex } from './library/search-index.js';
15
15
  export { resolveWikiGraphCoreDatabasePath, resolveWikiGraphHomeDirectoryPath, withWikiGraphRuntimeEnvironment, withWikiGraphRuntimeStateDirectoryPath } from './runtime/common/wiki-graph/dir.js';
16
16
  export { createWikiGraphTempDirectory, resolveWikiGraphStateRootPath } from './runtime/common/wiki-graph/temp.js';
package/dist/index.js CHANGED
@@ -42,11 +42,13 @@ import {
42
42
  isWikiGraphLibraryUri,
43
43
  findWikiGraphLibraryObjects,
44
44
  listRelatedWikiGraphLibraryObjects,
45
+ listWikiGraphLibraryArchiveMembers,
45
46
  listWikiGraphLibraryArchives,
46
47
  listWikiGraphLibraryEvidence,
47
48
  listWikiGraphLibraryIndexArchiveIdsForObject,
48
49
  listWikiGraphLibraryObjects,
49
50
  listWikiGraphLibraryScope,
51
+ findWikiGraphLibraryArchiveMembers,
50
52
  moveWikiGraphLibraryArchive,
51
53
  parseWikiGraphLibraryUri,
52
54
  putWikiGraphLibraryMetadata,
@@ -335,6 +337,7 @@ export {
335
337
  ensureWikiGraphHomeSchemaCurrent,
336
338
  finalizeWikiGraphLibraryArchiveWrite,
337
339
  findArchiveObjects,
340
+ findWikiGraphLibraryArchiveMembers,
338
341
  findWikiGraphLibraryObjects,
339
342
  formatChapterId,
340
343
  formatChapterUri,
@@ -380,6 +383,7 @@ export {
380
383
  listRelatedArchiveObjects,
381
384
  listRelatedWikiGraphLibraryObjects,
382
385
  listWikiGraphLibraries,
386
+ listWikiGraphLibraryArchiveMembers,
383
387
  listWikiGraphLibraryArchives,
384
388
  listWikiGraphLibraryEvidence,
385
389
  listWikiGraphLibraryIndexArchiveIdsForObject,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n formatLanguageForPrompt,\n getLanguageCode,\n getWikipageLanguageCode,\n Language,\n LanguageCode,\n normalizeLanguageCode,\n} from \"./runtime/common/language.js\";\nexport {\n createWikiGraphTaskId,\n WikiGraphTask,\n WikiGraphTaskContext,\n WIKI_GRAPH_CONTEXT_VERSION,\n type WikiGraphTaskContextOptions,\n type WikiGraphTaskIdentity,\n type WikiGraphTaskType,\n} from \"./runtime/context/index.js\";\nexport { LLM, LLMPaymentRequiredError } from \"./external/llm/index.js\";\nexport type {\n LLMessage,\n LLMOptions,\n LLMRequestOptions,\n LLMStreamProgressCallback,\n LLMTokenUsage,\n LLMTokenUsageCallback,\n} from \"./external/llm/index.js\";\nexport {\n WikiGraphScope,\n WIKI_GRAPH_EDITOR_SCOPES,\n WIKI_GRAPH_READER_SCOPES,\n WIKI_GRAPH_SCOPES,\n} from \"./runtime/common/llm-scope.js\";\nexport { withLoggingContext } from \"./runtime/common/logging.js\";\nexport {\n CLI_FULL_COMMAND,\n CLI_PRIMARY_COMMAND,\n} from \"./runtime/common/cli-command.js\";\nexport { resolveDataDirPath } from \"./runtime/common/data-dir.js\";\nexport { createEnv } from \"./runtime/common/template.js\";\nexport {\n clearWikiGraphLibraryMetadata,\n addWikiGraphLibraryArchive,\n createWikiGraphLibrary,\n deleteWikiGraphLibraryMetadataKey,\n ensureDefaultWikiGraphLibrary,\n ensureLibraryManagedArchiveHasNoSearchIndex,\n finalizeWikiGraphLibraryArchiveWrite,\n formatWikiGraphLibraryUri,\n getWikiGraphLibraryArchive,\n getWikiGraphLibraryArchiveById,\n getWikiGraphLibraryMetadata,\n listWikiGraphLibraries,\n isWikiGraphLibraryUri,\n findWikiGraphLibraryObjects,\n listRelatedWikiGraphLibraryObjects,\n listWikiGraphLibraryArchives,\n listWikiGraphLibraryEvidence,\n listWikiGraphLibraryIndexArchiveIdsForObject,\n listWikiGraphLibraryObjects,\n listWikiGraphLibraryScope,\n moveWikiGraphLibraryArchive,\n parseWikiGraphLibraryUri,\n putWikiGraphLibraryMetadata,\n packWikiGraphLibraryContext,\n queryWikiGraphLibrarySearchIndex,\n readWikiGraphLibraryIndexState,\n readWikiGraphLibraryPage,\n rebuildWikiGraphLibraryIndex,\n rebindWikiGraphLibrary,\n removeWikiGraphLibraryArchive,\n removeWikiGraphLibrary,\n replaceWikiGraphLibraryMetadata,\n resolveWikiGraphLibraryById,\n resolveWikiGraphLibraryQueryTargetById,\n resolveDefaultWikiGraphLibraryDirectoryPath,\n resolveWikiGraphLibraryArchivePath,\n resolveWikiGraphLibrary,\n resolveWikiGraphLibraryStagingDirectoryPath,\n scanWikiGraphLibrary,\n disableWikiGraphLibraryIndex,\n markWikiGraphLibraryIndexDirty,\n} from \"./library/index.js\";\nexport type {\n ParsedWikiGraphLibraryUri,\n WikiGraphLibraryArchiveRecord,\n WikiGraphLibraryIndexObjectHit,\n WikiGraphLibraryIndexQueryResult,\n WikiGraphLibraryIndexSource,\n WikiGraphLibraryIndexState,\n WikiGraphLibraryIndexStatus,\n WikiGraphLibraryIndexTextHit,\n WikiGraphLibraryRecord,\n WikiGraphLibraryScanResult,\n} from \"./library/index.js\";\nexport {\n resolveWikiGraphCoreDatabasePath,\n resolveWikiGraphHomeDirectoryPath,\n withWikiGraphRuntimeEnvironment,\n withWikiGraphRuntimeStateDirectoryPath,\n} from \"./runtime/common/wiki-graph/dir.js\";\nexport {\n createWikiGraphTempDirectory,\n resolveWikiGraphStateRootPath,\n} from \"./runtime/common/wiki-graph/temp.js\";\nexport {\n EVIDENCE_SELECTION_JSON_SHAPE,\n EVIDENCE_SELECTION_PROMPT_FRAGMENT,\n formatEvidenceSelectionChoicePrompt,\n normalizeEvidenceDisplayText,\n normalizeEvidenceText,\n rankEvidenceQuote,\n resolveEvidenceSelection,\n resolveEvidenceSelectionList,\n scoreEvidenceQuote,\n type EvidenceQuoteMatchStrategy,\n type EvidenceQuoteScore,\n type EvidenceSelection,\n type EvidenceSelectionCandidate,\n type EvidenceSelectionFailure,\n type EvidenceSelectionList,\n type EvidenceSelectionResolution,\n type EvidenceSelectionSentence,\n type EvidenceSentenceId,\n} from \"./graph/evidence-selection/index.js\";\nexport {\n RateLimiter,\n parseRetryAfterMs,\n WikimediaClient,\n WikipageCache,\n WikipageResolver,\n createDisambiguationProfileNormalizer,\n type CachedDisambiguationRecord,\n type CachedPageRecord,\n type CachedQidRecord,\n type DisambiguationExpansion,\n type DisambiguationLinkedQid,\n type DisambiguationMeaningPriority,\n type DisambiguationPageText,\n type DisambiguationProfile,\n type DisambiguationProfileError,\n type DisambiguationProfileMeaning,\n type DisambiguationProfileNormalizer,\n type DisambiguationProfileNormalizerInput,\n type EnrichmentStore,\n type QidResolution,\n type WikiClient,\n type WikipageResolverOptions,\n type WikipageSitelink,\n} from \"./external/wikipage/index.js\";\nexport {\n buildWikimatchWindows,\n judgeWikimatchPolicy,\n parsePolicyResponse,\n validatePolicyResponse,\n type BuildWikimatchWindowsOptions,\n type JudgeWikimatchPolicyOptions,\n type WikimatchAcceptedMention,\n type WikimatchCandidate,\n type WikimatchConflictGroup,\n type WikimatchPolicyDecision,\n type WikimatchPolicyDecisionOutput,\n type WikimatchPolicyFallback,\n type WikimatchPolicyJudgeInput,\n type WikimatchPolicyJudgeResult,\n type WikimatchPolicyResponse,\n type WikimatchPolicyUpdate,\n type WikimatchQidOption,\n type WikimatchTextRange,\n type WikimatchWindow,\n} from \"./external/wikimatch/index.js\";\nexport { createDefaultWikiGraphSampling } from \"./api/llm-sampling.js\";\nexport {\n type DigestProgressEvent,\n type SerialDiscoveryItem,\n WikiGraphArchive,\n WikiGraph,\n type WikiGraphOptions,\n type WikiGraphLLMOptions,\n type WikiGraphOpenSessionOptions,\n type WikiGraphProgressCallback,\n type WikiGraphProgressEvent,\n type WikiGraphProgressEventType,\n type WikiGraphOperation,\n type SerialsDiscoveredEvent,\n type SerialProgressEvent,\n type WikiGraphSourceSessionOptions,\n type WikiGraphTextStreamSessionOptions,\n} from \"./api/index.js\";\nexport type { WikiGraphSerialEntry } from \"./api/index.js\";\nexport {\n formatChapterUri,\n parseChapterPath,\n parseChapterUriPath,\n} from \"./document/chapter/path.js\";\nexport {\n formatLocatedChapterResourceUri,\n formatLocatedChapterSourceCollectionUri,\n formatLocatedChapterUri,\n isWikiGraphJobUri,\n isWikiGraphUri,\n readWikgArchiveFormatVersion,\n formatWikiGraphCommandUri,\n formatLocatedWikiGraphUri,\n parseLocatedWikiGraphUri,\n parseWikiGraphUriSyntax,\n requireArchiveUri,\n requireLocatedObjectOrArchiveUri,\n requireLocatedObjectUri,\n WikiGraphArchiveFile,\n WIKI_GRAPH_JOB_URI_PREFIX,\n WIKI_GRAPH_URI_PREFIX,\n writeWikgArchive,\n} from \"./storage/wikg/index.js\";\nexport type {\n LocatedWikiGraphUri,\n ParsedWikiGraphUri,\n} from \"./storage/wikg/index.js\";\nexport {\n DirectoryDocument,\n openSharedStateDatabase,\n} from \"./document/index.js\";\nexport type { Database, Document, ReadonlyDocument } from \"./document/index.js\";\nexport { TOC_FILE_VERSION } from \"./text/source/index.js\";\nexport type { BookMeta } from \"./text/source/index.js\";\nexport { isArchiveSearchIndexCurrent } from \"./retrieval/query/index.js\";\nexport {\n ensureWikiGraphArchiveSchemaCurrent,\n ensureWikiGraphHomeSchemaCurrent,\n readWikiGraphArchiveSchemaVersion,\n readWikiGraphHomeSchemaVersion,\n upgradeWikiGraphArchiveSchema,\n} from \"./storage/schema-upgrade/index.js\";\nexport {\n assertWikiGraphLibrarySchemaCurrent,\n upgradeWikiGraphLibrarySchema,\n upgradeWikiGraphMaintenanceTarget,\n type WikiGraphLibraryUpgradeResult,\n type WikiGraphMaintenanceUpgradeResult,\n} from \"./maintenance/upgrade.js\";\nexport { readArchiveIndexSettings } from \"./retrieval/search-index/index.js\";\nexport { migrateLegacySdpubToWikg } from \"./storage/migration/legacy-sdpub/upgrade/index.js\";\nexport type {\n GuaranteedRequest,\n GuaranteedRequestController,\n} from \"./external/guaranteed/index.js\";\nexport { formatError } from \"./utils/node-error.js\";\nexport {\n createContinuationCursor,\n deleteArchiveSearchSessions,\n findArchiveObjects,\n formatChapterId,\n formatEdgeId,\n formatNodeId,\n formatSummaryId,\n getArchiveIndex,\n grepArchiveObjects,\n listAllArchiveLinks,\n listArchiveCollection,\n listArchiveEvidence,\n listArchiveLinks,\n listArchiveObjects,\n listRelatedArchiveObjects,\n packArchiveContext,\n readArchivePage,\n readArchiveText,\n readContinuationCursor,\n rebuildArchiveSearchIndex,\n} from \"./api/index.js\";\nexport type {\n ArchiveBacklinkBucket,\n ArchiveBacklinks,\n ArchiveCollectionOptions,\n ArchiveCollectionResult,\n ArchiveCollectionType,\n ArchiveEvidence,\n ArchiveEvidenceItem,\n ArchiveFindEvidencePreview,\n ArchiveFindField,\n ArchiveFindFilterType,\n ArchiveFindHit,\n ArchiveFindObjectType,\n ArchiveFindOptions,\n ArchiveFindOrder,\n ArchiveFindPosition,\n ArchiveFindResult,\n ArchiveIndex,\n ArchiveLibrarySource,\n ArchiveListItem,\n ArchiveListKind,\n ArchiveNodeLabel,\n ArchiveNodeSourceFragment,\n ArchiveObjectType,\n ArchivePack,\n ArchivePage,\n ArchiveRelatedResult,\n ArchiveTriplePattern,\n ContinuationCursor,\n QueryIndexScope,\n QueryScope,\n} from \"./api/index.js\";\nexport { setFtsIndexEmbedded } from \"./retrieval/search-index/index.js\";\nexport {\n addBuildJob,\n assertBuildJobInputRevision,\n assertNoActiveBuildJobConflicts,\n assertNoActiveBuildJobs,\n boostBuildJob,\n cancelBuildJob,\n cleanBuildJobs,\n getBuildJob,\n listBuildJobs,\n pauseBuildJob,\n readBuildJobEvents,\n recordBuildJobInputRevision,\n resolveBuildJobId,\n resumeBuildJob,\n runBuildJobWorker,\n updateBuildJobTarget,\n} from \"./api/index.js\";\nexport type {\n AddBuildJobOptions,\n BuildJob,\n BuildJobConflictScope,\n BuildJobEvent,\n BuildJobExecutionContext,\n BuildJobListOptions,\n BuildJobProgressCounter,\n BuildJobProgressReporter,\n BuildJobState,\n BuildJobTarget,\n BuildJobWorkerOptions,\n} from \"./api/index.js\";\nexport {\n addChapter,\n advanceChapterStages,\n applyChapterTree,\n CHAPTER_STAGES,\n generateChapterGraph,\n generateChapterSummary,\n getChapterDetails,\n getChapterTree,\n listChapters,\n moveChapter,\n parseChapterTreeInput,\n removeChapter,\n resetChapter,\n resolveChapterPath,\n resolveChapterPathReadonly,\n setChapterSource,\n setChapterSummary,\n setChapterTitle,\n} from \"./api/index.js\";\nexport type {\n AddChapterOptions,\n AdvanceChapterStagesOptions,\n AdvanceChapterStagesProgressCallback,\n AdvanceChapterStagesProgressEvent,\n AdvanceChapterStagesResult,\n ChapterDetails,\n ChapterEntry,\n ChapterStage,\n ChapterTree,\n ChapterTreeApplyResult,\n ChapterTreeInput,\n ChapterTreeInputNode,\n ChapterTreeMoveChange,\n ChapterTreeNode,\n ChapterTreeTitleChange,\n GenerateChapterGraphOptions,\n GenerateChapterSummaryOptions,\n MoveChapterOptions,\n} from \"./api/index.js\";\nexport {\n buildChapterGraphArtifact,\n buildChapterSummaryArtifact,\n buildChapterSummaryArtifactFromReadingGraphObjects,\n buildChapterSummaryArtifactFromSnapshot,\n commitChapterGraphArtifact,\n commitChapterSummaryArtifact,\n readChapterBuildInput,\n snapshotChapterSummaryInput,\n} from \"./api/index.js\";\nexport type {\n BuildChapterGraphArtifactOptions,\n BuildChapterSummaryArtifactOptions,\n ChapterGraphBuildArtifact,\n} from \"./api/index.js\";\nexport {\n buildChapterKnowledgeGraphArtifact,\n clearChapterKnowledgeGraph,\n commitChapterKnowledgeGraphArtifact,\n createEnrichmentProgressReporter,\n generateChapterKnowledgeGraphArtifact,\n generateChapterKnowledgeGraphArtifactFromSnapshot,\n groundWikimatchCandidates,\n snapshotChapterKnowledgeGraphInput,\n} from \"./api/index.js\";\nexport type {\n BuildChapterKnowledgeGraphArtifactOptions,\n ChapterKnowledgeGraphBuildArtifact,\n ChapterKnowledgeGraphInputSnapshot,\n} from \"./api/index.js\";\nexport {\n DEFAULT_EXTRACTION_PROMPT,\n DEFAULT_KNOWLEDGE_GRAPH_RECALL_PROMPT,\n resolveExtractionPrompt,\n resolveKnowledgeGraphRecallPrompt,\n} from \"./runtime/common/prompts.js\";\nexport {\n DEFAULT_WIKISPINE_FETCH_ENDPOINT,\n testWikispineRuntime,\n} from \"./external/wikimatch/index.js\";\nexport type { WikispineProvider } from \"./external/wikimatch/index.js\";\nexport { ObjectMetadataKind } from \"./document/index.js\";\nexport type { ObjectMetadataTarget } from \"./document/index.js\";\nexport {\n collectChapterKnowledgeGraphObjects,\n collectReadingGraphObjects,\n createChapterKnowledgeGraphObjectStream,\n createChapterReadingGraphObjectStream,\n createSummaryInputSnapshotFromReadingGraphObjects,\n parseWikgObject,\n readWikgObjectsFromJsonl,\n WIKG_OBJECT_SCHEMA_VERSION,\n writeWikgObjectsToJsonl,\n} from \"./object-stream.js\";\nexport type { WikgObject } from \"./object-stream.js\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n formatLanguageForPrompt,\n getLanguageCode,\n getWikipageLanguageCode,\n Language,\n LanguageCode,\n normalizeLanguageCode,\n} from \"./runtime/common/language.js\";\nexport {\n createWikiGraphTaskId,\n WikiGraphTask,\n WikiGraphTaskContext,\n WIKI_GRAPH_CONTEXT_VERSION,\n type WikiGraphTaskContextOptions,\n type WikiGraphTaskIdentity,\n type WikiGraphTaskType,\n} from \"./runtime/context/index.js\";\nexport { LLM, LLMPaymentRequiredError } from \"./external/llm/index.js\";\nexport type {\n LLMessage,\n LLMOptions,\n LLMRequestOptions,\n LLMStreamProgressCallback,\n LLMTokenUsage,\n LLMTokenUsageCallback,\n} from \"./external/llm/index.js\";\nexport {\n WikiGraphScope,\n WIKI_GRAPH_EDITOR_SCOPES,\n WIKI_GRAPH_READER_SCOPES,\n WIKI_GRAPH_SCOPES,\n} from \"./runtime/common/llm-scope.js\";\nexport { withLoggingContext } from \"./runtime/common/logging.js\";\nexport {\n CLI_FULL_COMMAND,\n CLI_PRIMARY_COMMAND,\n} from \"./runtime/common/cli-command.js\";\nexport { resolveDataDirPath } from \"./runtime/common/data-dir.js\";\nexport { createEnv } from \"./runtime/common/template.js\";\nexport {\n clearWikiGraphLibraryMetadata,\n addWikiGraphLibraryArchive,\n createWikiGraphLibrary,\n deleteWikiGraphLibraryMetadataKey,\n ensureDefaultWikiGraphLibrary,\n ensureLibraryManagedArchiveHasNoSearchIndex,\n finalizeWikiGraphLibraryArchiveWrite,\n formatWikiGraphLibraryUri,\n getWikiGraphLibraryArchive,\n getWikiGraphLibraryArchiveById,\n getWikiGraphLibraryMetadata,\n listWikiGraphLibraries,\n isWikiGraphLibraryUri,\n findWikiGraphLibraryObjects,\n listRelatedWikiGraphLibraryObjects,\n listWikiGraphLibraryArchiveMembers,\n listWikiGraphLibraryArchives,\n listWikiGraphLibraryEvidence,\n listWikiGraphLibraryIndexArchiveIdsForObject,\n listWikiGraphLibraryObjects,\n listWikiGraphLibraryScope,\n findWikiGraphLibraryArchiveMembers,\n moveWikiGraphLibraryArchive,\n parseWikiGraphLibraryUri,\n putWikiGraphLibraryMetadata,\n packWikiGraphLibraryContext,\n queryWikiGraphLibrarySearchIndex,\n readWikiGraphLibraryIndexState,\n readWikiGraphLibraryPage,\n rebuildWikiGraphLibraryIndex,\n rebindWikiGraphLibrary,\n removeWikiGraphLibraryArchive,\n removeWikiGraphLibrary,\n replaceWikiGraphLibraryMetadata,\n resolveWikiGraphLibraryById,\n resolveWikiGraphLibraryQueryTargetById,\n resolveDefaultWikiGraphLibraryDirectoryPath,\n resolveWikiGraphLibraryArchivePath,\n resolveWikiGraphLibrary,\n resolveWikiGraphLibraryStagingDirectoryPath,\n scanWikiGraphLibrary,\n disableWikiGraphLibraryIndex,\n markWikiGraphLibraryIndexDirty,\n} from \"./library/index.js\";\nexport type {\n ParsedWikiGraphLibraryUri,\n WikiGraphLibraryArchiveRecord,\n WikiGraphLibraryIndexObjectHit,\n WikiGraphLibraryIndexQueryResult,\n WikiGraphLibraryIndexSource,\n WikiGraphLibraryIndexState,\n WikiGraphLibraryIndexStatus,\n WikiGraphLibraryIndexTextHit,\n WikiGraphLibraryRecord,\n WikiGraphLibraryScanResult,\n} from \"./library/index.js\";\nexport {\n resolveWikiGraphCoreDatabasePath,\n resolveWikiGraphHomeDirectoryPath,\n withWikiGraphRuntimeEnvironment,\n withWikiGraphRuntimeStateDirectoryPath,\n} from \"./runtime/common/wiki-graph/dir.js\";\nexport {\n createWikiGraphTempDirectory,\n resolveWikiGraphStateRootPath,\n} from \"./runtime/common/wiki-graph/temp.js\";\nexport {\n EVIDENCE_SELECTION_JSON_SHAPE,\n EVIDENCE_SELECTION_PROMPT_FRAGMENT,\n formatEvidenceSelectionChoicePrompt,\n normalizeEvidenceDisplayText,\n normalizeEvidenceText,\n rankEvidenceQuote,\n resolveEvidenceSelection,\n resolveEvidenceSelectionList,\n scoreEvidenceQuote,\n type EvidenceQuoteMatchStrategy,\n type EvidenceQuoteScore,\n type EvidenceSelection,\n type EvidenceSelectionCandidate,\n type EvidenceSelectionFailure,\n type EvidenceSelectionList,\n type EvidenceSelectionResolution,\n type EvidenceSelectionSentence,\n type EvidenceSentenceId,\n} from \"./graph/evidence-selection/index.js\";\nexport {\n RateLimiter,\n parseRetryAfterMs,\n WikimediaClient,\n WikipageCache,\n WikipageResolver,\n createDisambiguationProfileNormalizer,\n type CachedDisambiguationRecord,\n type CachedPageRecord,\n type CachedQidRecord,\n type DisambiguationExpansion,\n type DisambiguationLinkedQid,\n type DisambiguationMeaningPriority,\n type DisambiguationPageText,\n type DisambiguationProfile,\n type DisambiguationProfileError,\n type DisambiguationProfileMeaning,\n type DisambiguationProfileNormalizer,\n type DisambiguationProfileNormalizerInput,\n type EnrichmentStore,\n type QidResolution,\n type WikiClient,\n type WikipageResolverOptions,\n type WikipageSitelink,\n} from \"./external/wikipage/index.js\";\nexport {\n buildWikimatchWindows,\n judgeWikimatchPolicy,\n parsePolicyResponse,\n validatePolicyResponse,\n type BuildWikimatchWindowsOptions,\n type JudgeWikimatchPolicyOptions,\n type WikimatchAcceptedMention,\n type WikimatchCandidate,\n type WikimatchConflictGroup,\n type WikimatchPolicyDecision,\n type WikimatchPolicyDecisionOutput,\n type WikimatchPolicyFallback,\n type WikimatchPolicyJudgeInput,\n type WikimatchPolicyJudgeResult,\n type WikimatchPolicyResponse,\n type WikimatchPolicyUpdate,\n type WikimatchQidOption,\n type WikimatchTextRange,\n type WikimatchWindow,\n} from \"./external/wikimatch/index.js\";\nexport { createDefaultWikiGraphSampling } from \"./api/llm-sampling.js\";\nexport {\n type DigestProgressEvent,\n type SerialDiscoveryItem,\n WikiGraphArchive,\n WikiGraph,\n type WikiGraphOptions,\n type WikiGraphLLMOptions,\n type WikiGraphOpenSessionOptions,\n type WikiGraphProgressCallback,\n type WikiGraphProgressEvent,\n type WikiGraphProgressEventType,\n type WikiGraphOperation,\n type SerialsDiscoveredEvent,\n type SerialProgressEvent,\n type WikiGraphSourceSessionOptions,\n type WikiGraphTextStreamSessionOptions,\n} from \"./api/index.js\";\nexport type { WikiGraphSerialEntry } from \"./api/index.js\";\nexport {\n formatChapterUri,\n parseChapterPath,\n parseChapterUriPath,\n} from \"./document/chapter/path.js\";\nexport {\n formatLocatedChapterResourceUri,\n formatLocatedChapterSourceCollectionUri,\n formatLocatedChapterUri,\n isWikiGraphJobUri,\n isWikiGraphUri,\n readWikgArchiveFormatVersion,\n formatWikiGraphCommandUri,\n formatLocatedWikiGraphUri,\n parseLocatedWikiGraphUri,\n parseWikiGraphUriSyntax,\n requireArchiveUri,\n requireLocatedObjectOrArchiveUri,\n requireLocatedObjectUri,\n WikiGraphArchiveFile,\n WIKI_GRAPH_JOB_URI_PREFIX,\n WIKI_GRAPH_URI_PREFIX,\n writeWikgArchive,\n} from \"./storage/wikg/index.js\";\nexport type {\n LocatedWikiGraphUri,\n ParsedWikiGraphUri,\n} from \"./storage/wikg/index.js\";\nexport {\n DirectoryDocument,\n openSharedStateDatabase,\n} from \"./document/index.js\";\nexport type { Database, Document, ReadonlyDocument } from \"./document/index.js\";\nexport { TOC_FILE_VERSION } from \"./text/source/index.js\";\nexport type { BookMeta } from \"./text/source/index.js\";\nexport { isArchiveSearchIndexCurrent } from \"./retrieval/query/index.js\";\nexport {\n ensureWikiGraphArchiveSchemaCurrent,\n ensureWikiGraphHomeSchemaCurrent,\n readWikiGraphArchiveSchemaVersion,\n readWikiGraphHomeSchemaVersion,\n upgradeWikiGraphArchiveSchema,\n} from \"./storage/schema-upgrade/index.js\";\nexport {\n assertWikiGraphLibrarySchemaCurrent,\n upgradeWikiGraphLibrarySchema,\n upgradeWikiGraphMaintenanceTarget,\n type WikiGraphLibraryUpgradeResult,\n type WikiGraphMaintenanceUpgradeResult,\n} from \"./maintenance/upgrade.js\";\nexport { readArchiveIndexSettings } from \"./retrieval/search-index/index.js\";\nexport { migrateLegacySdpubToWikg } from \"./storage/migration/legacy-sdpub/upgrade/index.js\";\nexport type {\n GuaranteedRequest,\n GuaranteedRequestController,\n} from \"./external/guaranteed/index.js\";\nexport { formatError } from \"./utils/node-error.js\";\nexport {\n createContinuationCursor,\n deleteArchiveSearchSessions,\n findArchiveObjects,\n formatChapterId,\n formatEdgeId,\n formatNodeId,\n formatSummaryId,\n getArchiveIndex,\n grepArchiveObjects,\n listAllArchiveLinks,\n listArchiveCollection,\n listArchiveEvidence,\n listArchiveLinks,\n listArchiveObjects,\n listRelatedArchiveObjects,\n packArchiveContext,\n readArchivePage,\n readArchiveText,\n readContinuationCursor,\n rebuildArchiveSearchIndex,\n} from \"./api/index.js\";\nexport type {\n ArchiveBacklinkBucket,\n ArchiveBacklinks,\n ArchiveCollectionOptions,\n ArchiveCollectionResult,\n ArchiveCollectionType,\n ArchiveEvidence,\n ArchiveEvidenceItem,\n ArchiveFindEvidencePreview,\n ArchiveFindField,\n ArchiveFindFilterType,\n ArchiveFindHit,\n ArchiveFindObjectType,\n ArchiveFindOptions,\n ArchiveFindOrder,\n ArchiveFindPosition,\n ArchiveFindResult,\n ArchiveIndex,\n ArchiveLibrarySource,\n ArchiveListItem,\n ArchiveListKind,\n ArchiveNodeLabel,\n ArchiveNodeSourceFragment,\n ArchiveObjectType,\n ArchivePack,\n ArchivePage,\n ArchiveRelatedResult,\n ArchiveTriplePattern,\n ContinuationCursor,\n QueryIndexScope,\n QueryScope,\n} from \"./api/index.js\";\nexport { setFtsIndexEmbedded } from \"./retrieval/search-index/index.js\";\nexport {\n addBuildJob,\n assertBuildJobInputRevision,\n assertNoActiveBuildJobConflicts,\n assertNoActiveBuildJobs,\n boostBuildJob,\n cancelBuildJob,\n cleanBuildJobs,\n getBuildJob,\n listBuildJobs,\n pauseBuildJob,\n readBuildJobEvents,\n recordBuildJobInputRevision,\n resolveBuildJobId,\n resumeBuildJob,\n runBuildJobWorker,\n updateBuildJobTarget,\n} from \"./api/index.js\";\nexport type {\n AddBuildJobOptions,\n BuildJob,\n BuildJobConflictScope,\n BuildJobEvent,\n BuildJobExecutionContext,\n BuildJobListOptions,\n BuildJobProgressCounter,\n BuildJobProgressReporter,\n BuildJobState,\n BuildJobTarget,\n BuildJobWorkerOptions,\n} from \"./api/index.js\";\nexport {\n addChapter,\n advanceChapterStages,\n applyChapterTree,\n CHAPTER_STAGES,\n generateChapterGraph,\n generateChapterSummary,\n getChapterDetails,\n getChapterTree,\n listChapters,\n moveChapter,\n parseChapterTreeInput,\n removeChapter,\n resetChapter,\n resolveChapterPath,\n resolveChapterPathReadonly,\n setChapterSource,\n setChapterSummary,\n setChapterTitle,\n} from \"./api/index.js\";\nexport type {\n AddChapterOptions,\n AdvanceChapterStagesOptions,\n AdvanceChapterStagesProgressCallback,\n AdvanceChapterStagesProgressEvent,\n AdvanceChapterStagesResult,\n ChapterDetails,\n ChapterEntry,\n ChapterStage,\n ChapterTree,\n ChapterTreeApplyResult,\n ChapterTreeInput,\n ChapterTreeInputNode,\n ChapterTreeMoveChange,\n ChapterTreeNode,\n ChapterTreeTitleChange,\n GenerateChapterGraphOptions,\n GenerateChapterSummaryOptions,\n MoveChapterOptions,\n} from \"./api/index.js\";\nexport {\n buildChapterGraphArtifact,\n buildChapterSummaryArtifact,\n buildChapterSummaryArtifactFromReadingGraphObjects,\n buildChapterSummaryArtifactFromSnapshot,\n commitChapterGraphArtifact,\n commitChapterSummaryArtifact,\n readChapterBuildInput,\n snapshotChapterSummaryInput,\n} from \"./api/index.js\";\nexport type {\n BuildChapterGraphArtifactOptions,\n BuildChapterSummaryArtifactOptions,\n ChapterGraphBuildArtifact,\n} from \"./api/index.js\";\nexport {\n buildChapterKnowledgeGraphArtifact,\n clearChapterKnowledgeGraph,\n commitChapterKnowledgeGraphArtifact,\n createEnrichmentProgressReporter,\n generateChapterKnowledgeGraphArtifact,\n generateChapterKnowledgeGraphArtifactFromSnapshot,\n groundWikimatchCandidates,\n snapshotChapterKnowledgeGraphInput,\n} from \"./api/index.js\";\nexport type {\n BuildChapterKnowledgeGraphArtifactOptions,\n ChapterKnowledgeGraphBuildArtifact,\n ChapterKnowledgeGraphInputSnapshot,\n} from \"./api/index.js\";\nexport {\n DEFAULT_EXTRACTION_PROMPT,\n DEFAULT_KNOWLEDGE_GRAPH_RECALL_PROMPT,\n resolveExtractionPrompt,\n resolveKnowledgeGraphRecallPrompt,\n} from \"./runtime/common/prompts.js\";\nexport {\n DEFAULT_WIKISPINE_FETCH_ENDPOINT,\n testWikispineRuntime,\n} from \"./external/wikimatch/index.js\";\nexport type { WikispineProvider } from \"./external/wikimatch/index.js\";\nexport { ObjectMetadataKind } from \"./document/index.js\";\nexport type { ObjectMetadataTarget } from \"./document/index.js\";\nexport {\n collectChapterKnowledgeGraphObjects,\n collectReadingGraphObjects,\n createChapterKnowledgeGraphObjectStream,\n createChapterReadingGraphObjectStream,\n createSummaryInputSnapshotFromReadingGraphObjects,\n parseWikgObject,\n readWikgObjectsFromJsonl,\n WIKG_OBJECT_SCHEMA_VERSION,\n writeWikgObjectsToJsonl,\n} from \"./object-stream.js\";\nexport type { WikgObject } from \"./object-stream.js\";\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
- export { ParsedWikiGraphLibraryUri, WikiGraphLibraryRecord, clearWikiGraphLibraryMetadata, createWikiGraphLibrary, deleteWikiGraphLibraryMetadataKey, ensureDefaultWikiGraphLibrary, formatWikiGraphLibraryUri, getWikiGraphLibraryMetadata, isWikiGraphLibraryUri, listWikiGraphLibraries, listWikiGraphLibraryScope, parseWikiGraphLibraryUri, putWikiGraphLibraryMetadata, removeWikiGraphLibrary, replaceWikiGraphLibraryMetadata, resolveDefaultWikiGraphLibraryDirectoryPath, resolveWikiGraphLibrary, resolveWikiGraphLibraryById, resolveWikiGraphLibraryStagingDirectoryPath, updateWikiGraphLibraryFolderPathForRebind } from './registry.js';
1
+ export { ParsedWikiGraphLibraryUri, WikiGraphLibraryRecord, clearWikiGraphLibraryMetadata, createWikiGraphLibrary, deleteWikiGraphLibraryMetadataKey, ensureDefaultWikiGraphLibrary, formatWikiGraphLibraryUri, getWikiGraphLibraryMetadata, isWikiGraphLibraryUri, listWikiGraphLibraries, listWikiGraphLibraryScope, parseWikiGraphLibraryUri, putWikiGraphLibraryMetadata, removeWikiGraphLibrary, replaceWikiGraphLibraryMetadata, resolveDefaultWikiGraphLibraryDirectoryPath, resolveWikiGraphLibrary, resolveWikiGraphLibraryById, resolveWikiGraphLibraryForScan, resolveWikiGraphLibraryStagingDirectoryPath, updateWikiGraphLibraryFolderPathForRebind } from './registry.js';
2
2
  export { WikiGraphLibraryArchiveRecord, WikiGraphLibraryScanResult, addWikiGraphLibraryArchive, ensureLibraryManagedArchiveHasNoSearchIndex, finalizeWikiGraphLibraryArchiveWrite, getWikiGraphLibraryArchive, getWikiGraphLibraryArchiveById, listWikiGraphLibraryArchives, moveWikiGraphLibraryArchive, rebindWikiGraphLibrary, removeWikiGraphLibraryArchive, resolveWikiGraphLibraryArchivePath, scanWikiGraphLibrary } from './membership.js';
3
- export { createLibrarySources, findWikiGraphLibraryObjects, listRelatedWikiGraphLibraryObjects, listWikiGraphLibraryEvidence, listWikiGraphLibraryObjects, packWikiGraphLibraryContext, readWikiGraphLibraryPage, resolveWikiGraphLibraryQueryTargetById } from './query.js';
3
+ export { createLibrarySources, findWikiGraphLibraryArchiveMembers, findWikiGraphLibraryObjects, listRelatedWikiGraphLibraryObjects, listWikiGraphLibraryArchiveMembers, listWikiGraphLibraryEvidence, listWikiGraphLibraryObjects, packWikiGraphLibraryContext, readWikiGraphLibraryPage, resolveWikiGraphLibraryQueryTargetById } from './query.js';
4
4
  export { WikiGraphLibraryIndexListOptions, WikiGraphLibraryIndexObjectHit, WikiGraphLibraryIndexQueryOptions, WikiGraphLibraryIndexQueryResult, WikiGraphLibraryIndexSource, WikiGraphLibraryIndexState, WikiGraphLibraryIndexStatus, WikiGraphLibraryIndexTextHit, assertWikiGraphLibraryIndexReady, disableWikiGraphLibraryIndex, listWikiGraphLibraryIndexArchiveIdsForObject, listWikiGraphLibrarySearchIndex, markWikiGraphLibraryIndexDirty, queryWikiGraphLibrarySearchIndex, readWikiGraphLibraryIndexState, rebuildWikiGraphLibraryIndex, runLibraryIndexGc } from './search-index.js';
5
5
  export { LibraryLockMode, acquireWikiGraphLibraryLock, isWikiGraphLibraryLocked, tryAcquireWikiGraphLibraryLock, withWikiGraphLibraryLock } from './lock.js';
6
6
  import '../retrieval/query/archive-view/types.js';
@@ -27,6 +27,7 @@ import { isNodeError } from "../utils/node-error.js";
27
27
  import {
28
28
  parseWikiGraphLibraryUri,
29
29
  resolveWikiGraphLibrary,
30
+ resolveWikiGraphLibraryForScan,
30
31
  updateWikiGraphLibraryFolderPathForRebind
31
32
  } from "./registry.js";
32
33
  import { markWikiGraphLibraryIndexDirty } from "./search-index.js";
@@ -59,7 +60,7 @@ ${LIBRARY_ARCHIVES_TABLE_COLUMNS_SQL}
59
60
  ON library_archives(library_id, relative_path);
60
61
  `;
61
62
  async function scanWikiGraphLibrary(target) {
62
- const library = await resolveWikiGraphLibrary(target);
63
+ const library = await resolveWikiGraphLibraryForScan(target);
63
64
  return await withWikiGraphLibraryLock(library.id, "write", async () => {
64
65
  const result = await scanWikiGraphLibraryUnlocked(target, library, {
65
66
  pathIdentity: "trusted"
@@ -127,18 +128,16 @@ async function scanWikiGraphLibraryUnlocked(target, library, options) {
127
128
  status: matchingTokenArchives.length === 0 || file.mutationToken === void 0 ? "present" : "conflict"
128
129
  });
129
130
  }
130
- const now = (/* @__PURE__ */ new Date()).toISOString();
131
131
  for (const archive of existing) {
132
132
  if (seenArchiveIds.has(archive.id) || options.pathIdentity === "trusted" && currentPaths.has(archive.relativePath)) {
133
133
  continue;
134
134
  }
135
135
  await database.run(
136
136
  `
137
- UPDATE library_archives
138
- SET status = 'missing', updated_at = ?, last_scanned_at = ?
137
+ DELETE FROM library_archives
139
138
  WHERE id = ?
140
139
  `,
141
- [now, now, archive.id]
140
+ [archive.id]
142
141
  );
143
142
  }
144
143
  });
@@ -572,6 +571,7 @@ function archivePathMatchRank(archive) {
572
571
  return 2;
573
572
  }
574
573
  async function listWikgFiles(root) {
574
+ await assertLibraryFolderExists(root);
575
575
  const relativePaths = [];
576
576
  await walkLibraryDirectory(root, root, relativePaths);
577
577
  const files = [];
@@ -585,6 +585,19 @@ async function listWikgFiles(root) {
585
585
  }
586
586
  return files;
587
587
  }
588
+ async function assertLibraryFolderExists(root) {
589
+ try {
590
+ const rootStat = await stat(root);
591
+ if (!rootStat.isDirectory()) {
592
+ throw new Error(`Wiki Graph library folder is not a directory: ${root}`);
593
+ }
594
+ } catch (error) {
595
+ if (isNodeError(error) && error.code === "ENOENT") {
596
+ throw new Error(`Wiki Graph library folder is missing: ${root}`);
597
+ }
598
+ throw error;
599
+ }
600
+ }
588
601
  async function ensureLibraryArchiveFileHasNoSearchIndexAndInspect(root, relativePath) {
589
602
  await ensureLibraryManagedArchiveHasNoSearchIndex(join(root, relativePath));
590
603
  return await inspectLibraryArchiveFile(root, relativePath);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/library/membership.ts"],"sourcesContent":["import { randomBytes } from \"crypto\";\nimport {\n constants,\n copyFile,\n mkdir,\n opendir,\n realpath,\n rename,\n rm,\n stat,\n} from \"fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"path\";\n\nimport {\n getNumber,\n getOptionalString,\n getString,\n type Database,\n type SqlRow,\n} from \"../document/database.js\";\nimport { openSharedStateDatabase } from \"../document/index.js\";\nimport { resolveWikiGraphCoreDatabasePath } from \"../runtime/common/wiki-graph/dir.js\";\nimport { WIKI_GRAPH_ARCHIVE_EXTENSION } from \"../runtime/common/wiki-graph/uri.js\";\nimport {\n readWikgArchiveEntry,\n readWikgArchiveMutationToken,\n WikiGraphArchiveFile,\n} from \"../storage/wikg/index.js\";\nimport { isNodeError } from \"../utils/node-error.js\";\nimport {\n parseWikiGraphLibraryUri,\n resolveWikiGraphLibrary,\n updateWikiGraphLibraryFolderPathForRebind,\n type ParsedWikiGraphLibraryUri,\n type WikiGraphLibraryRecord,\n} from \"./registry.js\";\nimport { markWikiGraphLibraryIndexDirty } from \"./search-index.js\";\nimport { withWikiGraphLibraryLock } from \"./lock.js\";\n\nconst PUBLIC_ID_BYTES = 6;\nconst SEARCH_INDEX_ARCHIVE_ENTRY_PATH = \"fts.db\";\nconst LIBRARY_ARCHIVES_TABLE_COLUMNS_SQL = `\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n library_id INTEGER NOT NULL,\n public_id TEXT NOT NULL,\n relative_path TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'present',\n last_seen_mutation_token TEXT,\n last_seen_size INTEGER,\n last_seen_mtime_ms INTEGER,\n last_scanned_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(library_id, public_id)\n`;\nconst LIBRARY_ARCHIVE_MEMBERSHIP_SCHEMA_SQL = `\n CREATE TABLE IF NOT EXISTS library_archives (\n${LIBRARY_ARCHIVES_TABLE_COLUMNS_SQL}\n );\n\n CREATE INDEX IF NOT EXISTS idx_library_archives_library\n ON library_archives(library_id);\n\n CREATE INDEX IF NOT EXISTS idx_library_archives_library_path\n ON library_archives(library_id, relative_path);\n`;\n\ntype LibraryPathIdentityMode = \"trusted\" | \"untrusted\";\n\ntype WikiGraphLibraryArchiveStatus = \"conflict\" | \"missing\" | \"present\";\n\nexport interface WikiGraphLibraryArchiveRecord {\n readonly id: number;\n readonly publicId: string;\n readonly uri: string;\n readonly libraryId: number;\n readonly libraryUri: string;\n readonly relativePath: string;\n readonly path: string;\n readonly exists: boolean;\n readonly status: WikiGraphLibraryArchiveStatus;\n readonly lastSeenMutationToken?: string;\n readonly lastSeenSize?: number;\n readonly lastSeenMtimeMs?: number;\n readonly lastScannedAt?: string;\n readonly createdAt: string;\n readonly updatedAt: string;\n}\n\nexport interface WikiGraphLibraryScanResult {\n readonly library: WikiGraphLibraryRecord;\n readonly archives: readonly WikiGraphLibraryArchiveRecord[];\n}\n\ninterface DiscoveredLibraryArchiveFile {\n readonly relativePath: string;\n readonly path: string;\n readonly mutationToken?: string;\n readonly size: number;\n readonly mtimeMs: number;\n}\n\nexport async function scanWikiGraphLibrary(\n target: ParsedWikiGraphLibraryUri,\n): Promise<WikiGraphLibraryScanResult> {\n const library = await resolveWikiGraphLibrary(target);\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n const result = await scanWikiGraphLibraryUnlocked(target, library, {\n pathIdentity: \"trusted\",\n });\n\n await markWikiGraphLibraryIndexDirty(library);\n return result;\n });\n}\n\nexport async function rebindWikiGraphLibrary(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n readonly folderPath: string;\n}): Promise<WikiGraphLibraryScanResult> {\n if (input.target.kind !== \"scope\" || input.target.objectUri !== undefined) {\n throw new Error(\"Library rebind requires a library scope URI.\");\n }\n\n const library = await resolveWikiGraphLibrary(input.target);\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n const rebound = await updateWikiGraphLibraryFolderPathForRebind(\n library,\n input.folderPath,\n );\n const result = await scanWikiGraphLibraryUnlocked(input.target, rebound, {\n pathIdentity: \"untrusted\",\n });\n\n await markWikiGraphLibraryIndexDirty(rebound);\n return result;\n });\n}\n\nasync function scanWikiGraphLibraryUnlocked(\n target: ParsedWikiGraphLibraryUri,\n library: WikiGraphLibraryRecord,\n options: { readonly pathIdentity: LibraryPathIdentityMode },\n): Promise<WikiGraphLibraryScanResult> {\n const files = await listWikgFiles(library.folderPath);\n\n await withLibraryArchiveMembershipDatabase(async (database) => {\n await database.transaction(async () => {\n const existing = await listLibraryArchiveRows(database, library);\n const currentPaths = new Set(files.map((file) => file.relativePath));\n const seenArchiveIds = new Set<number>();\n\n for (const file of files) {\n const existingAtPath = findExistingArchiveAtPath(existing, file);\n if (\n options.pathIdentity === \"trusted\" &&\n existingAtPath !== undefined\n ) {\n await updateLibraryArchiveSeen(database, existingAtPath.id, file, {\n status: \"present\",\n });\n seenArchiveIds.add(existingAtPath.id);\n continue;\n }\n\n const matchingTokenArchives =\n file.mutationToken === undefined\n ? []\n : existing.filter(\n (archive) =>\n archive.lastSeenMutationToken === file.mutationToken &&\n !seenArchiveIds.has(archive.id),\n );\n const adoptable = matchingTokenArchives.filter(\n (archive) =>\n archive.relativePath === file.relativePath ||\n !currentPaths.has(archive.relativePath),\n );\n\n if (\n matchingTokenArchives.length === 1 &&\n adoptable.length === 1 &&\n file.mutationToken !== undefined\n ) {\n const archive = adoptable[0]!;\n await database.run(\n `\n UPDATE library_archives\n SET relative_path = ?\n WHERE id = ?\n `,\n [file.relativePath, archive.id],\n );\n await updateLibraryArchiveSeen(database, archive.id, file, {\n status: \"present\",\n });\n seenArchiveIds.add(archive.id);\n continue;\n }\n\n await insertLibraryArchive(database, library.id, file, {\n status:\n matchingTokenArchives.length === 0 ||\n file.mutationToken === undefined\n ? \"present\"\n : \"conflict\",\n });\n }\n\n const now = new Date().toISOString();\n for (const archive of existing) {\n if (\n seenArchiveIds.has(archive.id) ||\n (options.pathIdentity === \"trusted\" &&\n currentPaths.has(archive.relativePath))\n ) {\n continue;\n }\n await database.run(\n `\n UPDATE library_archives\n SET status = 'missing', updated_at = ?, last_scanned_at = ?\n WHERE id = ?\n `,\n [now, now, archive.id],\n );\n }\n });\n });\n\n return { library, archives: await listWikiGraphLibraryArchives(target) };\n}\n\nexport async function listWikiGraphLibraryArchives(\n target: ParsedWikiGraphLibraryUri,\n): Promise<readonly WikiGraphLibraryArchiveRecord[]> {\n const library = await resolveWikiGraphLibrary(target);\n return await withLibraryArchiveMembershipDatabase(\n async (database) => await listLibraryArchives(database, library),\n );\n}\n\nexport async function getWikiGraphLibraryArchive(\n target: ParsedWikiGraphLibraryUri,\n): Promise<WikiGraphLibraryArchiveRecord> {\n const library = await resolveWikiGraphLibrary(target);\n return await resolveLibraryArchiveTarget(target, library);\n}\n\nexport async function getWikiGraphLibraryArchiveById(\n library: WikiGraphLibraryRecord,\n archiveId: number,\n): Promise<WikiGraphLibraryArchiveRecord> {\n return await withLibraryArchiveMembershipDatabase(\n async (database) =>\n await requireLibraryArchiveById(database, library, archiveId),\n );\n}\n\nexport async function resolveWikiGraphLibraryArchivePath(\n archiveLocator: string,\n): Promise<string> {\n const target = parseWikiGraphLibraryUri(archiveLocator);\n if (target === undefined || target.kind !== \"archive\") {\n throw new Error(\n `Expected a Wiki Graph library archive locator: ${archiveLocator}`,\n );\n }\n\n const archive = await getWikiGraphLibraryArchive(target);\n if (!archive.exists || archive.status === \"missing\") {\n throw new Error(`Wiki Graph library archive is missing: ${archiveLocator}`);\n }\n if (archive.status === \"conflict\") {\n throw new Error(\n `Wiki Graph library archive has a conflict and cannot be resolved: ${archiveLocator}`,\n );\n }\n\n return archive.path;\n}\n\nexport async function addWikiGraphLibraryArchive(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n readonly inputPath: string;\n readonly to?: string;\n}): Promise<WikiGraphLibraryArchiveRecord> {\n if (input.inputPath.startsWith(\"wikg://\")) {\n throw new Error(\n \"Library add --input accepts a file path, not a Wiki Graph URI.\",\n );\n }\n if (/^[a-z][a-z0-9+.-]*:\\/\\//iu.test(input.inputPath)) {\n throw new Error(\"Library add does not support URL inputs yet.\");\n }\n\n const library = await resolveWikiGraphLibrary(input.target);\n await mkdir(library.folderPath, { recursive: true });\n const sourcePath = resolve(input.inputPath);\n const sourceStats = await stat(sourcePath);\n if (!sourceStats.isFile()) {\n throw new Error(`Library add --input must be a file: ${input.inputPath}`);\n }\n const sourceBasename = sourcePath.split(/[\\\\/]/u).at(-1) ?? \"\";\n const targetRelativePath = validateLibraryArchiveRelativePath(\n input.to ?? sourceBasename,\n );\n const targetPath = resolveLibraryRelativePath(\n library.folderPath,\n targetRelativePath,\n );\n\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n await mkdir(dirname(targetPath), { recursive: true });\n await assertInsideLibrary(\n await realpath(dirname(targetPath)),\n library.folderPath,\n );\n await copyFile(sourcePath, targetPath, constants.COPYFILE_EXCL);\n await assertInsideLibrary(await realpath(targetPath), library.folderPath);\n const targetFile = await ensureLibraryArchiveFileHasNoSearchIndexAndInspect(\n library.folderPath,\n targetRelativePath,\n );\n const archive = await withLibraryArchiveMembershipDatabase(\n async (database) => {\n await database.transaction(async () => {\n await ensureLibraryArchiveByRelativePath(\n database,\n library.id,\n targetFile,\n );\n });\n return await requireLibraryArchiveByRelativePath(\n database,\n library,\n targetRelativePath,\n );\n },\n );\n\n await markWikiGraphLibraryIndexDirty(library);\n return archive;\n });\n}\n\nexport async function finalizeWikiGraphLibraryArchiveWrite(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n}): Promise<boolean> {\n if (input.target.kind !== \"archive\") {\n throw new Error(\"Expected a Wiki Graph library archive URI.\");\n }\n\n const library = await resolveWikiGraphLibrary(input.target);\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n const archive = await resolveLibraryArchiveTarget(input.target, library);\n const removed = await ensureLibraryManagedArchiveHasNoSearchIndex(\n archive.path,\n );\n const refreshedFile = await inspectLibraryArchiveFile(\n library.folderPath,\n archive.relativePath,\n );\n\n await withLibraryArchiveMembershipDatabase(async (database) => {\n await updateLibraryArchiveSeen(database, archive.id, refreshedFile, {\n status: \"present\",\n });\n });\n\n return removed;\n });\n}\n\nexport async function ensureLibraryManagedArchiveHasNoSearchIndex(\n archivePath: string,\n): Promise<boolean> {\n if ((await readOptionalWikgMutationToken(archivePath)) === undefined) {\n return false;\n }\n\n const searchIndex = await readWikgArchiveEntry(\n archivePath,\n SEARCH_INDEX_ARCHIVE_ENTRY_PATH,\n );\n if (searchIndex === undefined) {\n return false;\n }\n\n await new WikiGraphArchiveFile(archivePath).write(\n async (document) => {\n await document.deleteSearchIndexDatabase();\n },\n { searchIndexWritebackPolicy: \"archive\" },\n );\n return true;\n}\n\nexport async function removeWikiGraphLibraryArchive(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n}): Promise<WikiGraphLibraryArchiveRecord> {\n const library = await resolveWikiGraphLibrary(input.target);\n const archive = await resolveLibraryArchiveTarget(input.target, library);\n\n await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n await rm(archive.path, { force: true });\n await withLibraryArchiveMembershipDatabase(async (database) => {\n await database.run(\"DELETE FROM library_archives WHERE id = ?\", [\n archive.id,\n ]);\n });\n await markWikiGraphLibraryIndexDirty(library);\n });\n\n return { ...archive, exists: false, status: \"missing\" };\n}\n\nexport async function moveWikiGraphLibraryArchive(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n readonly to: string;\n}): Promise<WikiGraphLibraryArchiveRecord> {\n const library = await resolveWikiGraphLibrary(input.target);\n const archive = await resolveLibraryArchiveTarget(input.target, library);\n const targetRelativePath = validateLibraryArchiveRelativePath(input.to);\n const targetPath = resolveLibraryRelativePath(\n library.folderPath,\n targetRelativePath,\n );\n\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n await mkdir(dirname(targetPath), { recursive: true });\n await assertInsideLibrary(\n await realpath(dirname(targetPath)),\n library.folderPath,\n );\n if (await pathExists(targetPath)) {\n throw new Error(\n `Library archive target already exists: ${targetRelativePath}`,\n );\n }\n await rename(archive.path, targetPath);\n await assertInsideLibrary(await realpath(targetPath), library.folderPath);\n const targetFile = await inspectLibraryArchiveFile(\n library.folderPath,\n targetRelativePath,\n );\n const moved = await withLibraryArchiveMembershipDatabase(\n async (database) => {\n await database.run(\n \"UPDATE library_archives SET relative_path = ? WHERE id = ?\",\n [targetRelativePath, archive.id],\n );\n await updateLibraryArchiveSeen(database, archive.id, targetFile, {\n status: \"present\",\n });\n return await requireLibraryArchiveByPublicId(\n database,\n library,\n archive.publicId,\n );\n },\n );\n\n await markWikiGraphLibraryIndexDirty(library);\n return moved;\n });\n}\n\nasync function withLibraryArchiveMembershipDatabase<T>(\n operation: (database: Database) => Promise<T>,\n): Promise<T> {\n const database = await openSharedStateDatabase(\n resolveWikiGraphCoreDatabasePath(),\n LIBRARY_ARCHIVE_MEMBERSHIP_SCHEMA_SQL,\n );\n\n try {\n await ensureLibraryArchiveMembershipColumns(database);\n await ensureLibraryArchiveMembershipPathIndex(database);\n return await operation(database);\n } finally {\n await database.close();\n }\n}\n\nasync function listLibraryArchives(\n database: Database,\n library: WikiGraphLibraryRecord,\n): Promise<WikiGraphLibraryArchiveRecord[]> {\n const rows = await queryLibraryArchiveRows(database, library.id);\n const archives: WikiGraphLibraryArchiveRecord[] = [];\n for (const row of rows) {\n const relativePath = getString(row, \"relative_path\");\n archives.push(\n mapLibraryArchiveRecord(\n library,\n row,\n await pathExists(join(library.folderPath, relativePath)),\n ),\n );\n }\n return archives;\n}\n\nasync function listLibraryArchiveRows(\n database: Database,\n library: WikiGraphLibraryRecord,\n): Promise<WikiGraphLibraryArchiveRecord[]> {\n const rows = await queryLibraryArchiveRows(database, library.id);\n return rows.map((row) => mapLibraryArchiveRecord(library, row, false));\n}\n\nasync function queryLibraryArchiveRows(\n database: Database,\n libraryId: number,\n): Promise<SqlRow[]> {\n return await database.queryAll(\n `\n SELECT id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at,\n created_at, updated_at\n FROM library_archives\n WHERE library_id = ?\n ORDER BY relative_path\n `,\n [libraryId],\n (row) => row,\n );\n}\n\nasync function ensureLibraryArchiveByRelativePath(\n database: Database,\n libraryId: number,\n file: DiscoveredLibraryArchiveFile,\n): Promise<void> {\n const existing = await database.queryOne(\n `\n SELECT id\n FROM library_archives\n WHERE library_id = ? AND relative_path = ?\n ORDER BY CASE status\n WHEN 'present' THEN 0\n WHEN 'conflict' THEN 1\n ELSE 2\n END, id DESC\n `,\n [libraryId, file.relativePath],\n (row) => getNumber(row, \"id\"),\n );\n if (existing !== undefined) {\n await updateLibraryArchiveSeen(database, existing, file, {\n status: \"present\",\n });\n return;\n }\n\n await insertLibraryArchive(database, libraryId, file, { status: \"present\" });\n}\n\nasync function insertLibraryArchive(\n database: Database,\n libraryId: number,\n file: DiscoveredLibraryArchiveFile,\n options: { readonly status: WikiGraphLibraryArchiveStatus },\n): Promise<void> {\n const now = new Date().toISOString();\n await database.run(\n `\n INSERT INTO library_archives (\n library_id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n [\n libraryId,\n await createUniqueLibraryArchivePublicId(database, libraryId),\n file.relativePath,\n options.status,\n file.mutationToken ?? null,\n file.size,\n Math.round(file.mtimeMs),\n now,\n now,\n now,\n ],\n );\n}\n\nasync function updateLibraryArchiveSeen(\n database: Database,\n archiveId: number,\n file: DiscoveredLibraryArchiveFile,\n options: { readonly status: WikiGraphLibraryArchiveStatus },\n): Promise<void> {\n const now = new Date().toISOString();\n await database.run(\n `\n UPDATE library_archives\n SET status = ?,\n last_seen_mutation_token = ?,\n last_seen_size = ?,\n last_seen_mtime_ms = ?,\n last_scanned_at = ?,\n updated_at = ?\n WHERE id = ?\n `,\n [\n options.status,\n file.mutationToken ?? null,\n file.size,\n Math.round(file.mtimeMs),\n now,\n now,\n archiveId,\n ],\n );\n}\n\nasync function requireLibraryArchiveByRelativePath(\n database: Database,\n library: WikiGraphLibraryRecord,\n relativePath: string,\n): Promise<WikiGraphLibraryArchiveRecord> {\n const archive = await database.queryOne(\n `\n SELECT id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at,\n created_at, updated_at\n FROM library_archives\n WHERE library_id = ? AND relative_path = ?\n ORDER BY CASE status\n WHEN 'present' THEN 0\n WHEN 'conflict' THEN 1\n ELSE 2\n END, id DESC\n `,\n [library.id, relativePath],\n (row) => mapLibraryArchiveRecord(library, row, true),\n );\n if (archive === undefined) {\n throw new Error(\n `Library archive registry record is missing: ${relativePath}`,\n );\n }\n return archive;\n}\n\nasync function requireLibraryArchiveByPublicId(\n database: Database,\n library: WikiGraphLibraryRecord,\n publicId: string,\n): Promise<WikiGraphLibraryArchiveRecord> {\n const row = await database.queryOne(\n `\n SELECT id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at,\n created_at, updated_at\n FROM library_archives\n WHERE library_id = ? AND public_id = ?\n `,\n [library.id, publicId],\n (row) => row,\n );\n if (row === undefined) {\n throw new Error(`Unknown Wiki Graph library archive: ${publicId}`);\n }\n const relativePath = getString(row, \"relative_path\");\n return mapLibraryArchiveRecord(\n library,\n row,\n await pathExists(join(library.folderPath, relativePath)),\n );\n}\n\nasync function requireLibraryArchiveById(\n database: Database,\n library: WikiGraphLibraryRecord,\n archiveId: number,\n): Promise<WikiGraphLibraryArchiveRecord> {\n const row = await database.queryOne(\n `\n SELECT id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at,\n created_at, updated_at\n FROM library_archives\n WHERE library_id = ? AND id = ?\n `,\n [library.id, archiveId],\n (row) => row,\n );\n if (row === undefined) {\n throw new Error(`Unknown Wiki Graph library archive: ${archiveId}`);\n }\n const relativePath = getString(row, \"relative_path\");\n return mapLibraryArchiveRecord(\n library,\n row,\n await pathExists(join(library.folderPath, relativePath)),\n );\n}\n\nasync function resolveLibraryArchiveTarget(\n target: ParsedWikiGraphLibraryUri,\n library: WikiGraphLibraryRecord,\n): Promise<WikiGraphLibraryArchiveRecord> {\n if (target.kind !== \"archive\" || target.archivePublicId === undefined) {\n throw new Error(\"Expected a Wiki Graph library archive URI.\");\n }\n return await withLibraryArchiveMembershipDatabase(\n async (database) =>\n await requireLibraryArchiveByPublicId(\n database,\n library,\n target.archivePublicId!,\n ),\n );\n}\n\nfunction mapLibraryArchiveRecord(\n library: WikiGraphLibraryRecord,\n row: SqlRow,\n exists: boolean,\n): WikiGraphLibraryArchiveRecord {\n const publicId = getString(row, \"public_id\");\n const relativePath = getString(row, \"relative_path\");\n const databaseStatus = normalizeArchiveStatus(\n getOptionalString(row, \"status\") ?? \"present\",\n );\n return {\n createdAt: getString(row, \"created_at\"),\n exists,\n id: getNumber(row, \"id\"),\n libraryId: library.id,\n libraryUri: library.uri,\n ...optionalStringField(\n row,\n \"last_seen_mutation_token\",\n \"lastSeenMutationToken\",\n ),\n ...optionalNumberField(row, \"last_seen_mtime_ms\", \"lastSeenMtimeMs\"),\n ...optionalNumberField(row, \"last_seen_size\", \"lastSeenSize\"),\n ...optionalStringField(row, \"last_scanned_at\", \"lastScannedAt\"),\n path: join(library.folderPath, relativePath),\n publicId,\n relativePath,\n status: exists ? databaseStatus : \"missing\",\n updatedAt: getString(row, \"updated_at\"),\n uri: `${library.uri}/arc/${publicId}`,\n };\n}\n\nfunction findExistingArchiveAtPath(\n archives: readonly WikiGraphLibraryArchiveRecord[],\n file: DiscoveredLibraryArchiveFile,\n): WikiGraphLibraryArchiveRecord | undefined {\n return archives\n .filter((archive) => archive.relativePath === file.relativePath)\n .sort((a, b) => archivePathMatchRank(a) - archivePathMatchRank(b))[0];\n}\n\nfunction archivePathMatchRank(archive: WikiGraphLibraryArchiveRecord): number {\n if (archive.status === \"present\") {\n return 0;\n }\n if (archive.status === \"conflict\") {\n return 1;\n }\n return 2;\n}\n\nasync function listWikgFiles(\n root: string,\n): Promise<DiscoveredLibraryArchiveFile[]> {\n const relativePaths: string[] = [];\n await walkLibraryDirectory(root, root, relativePaths);\n const files: DiscoveredLibraryArchiveFile[] = [];\n for (const relativePath of relativePaths.sort((a, b) => a.localeCompare(b))) {\n files.push(\n await ensureLibraryArchiveFileHasNoSearchIndexAndInspect(\n root,\n relativePath,\n ),\n );\n }\n return files;\n}\n\nasync function ensureLibraryArchiveFileHasNoSearchIndexAndInspect(\n root: string,\n relativePath: string,\n): Promise<DiscoveredLibraryArchiveFile> {\n await ensureLibraryManagedArchiveHasNoSearchIndex(join(root, relativePath));\n return await inspectLibraryArchiveFile(root, relativePath);\n}\n\nasync function walkLibraryDirectory(\n root: string,\n directory: string,\n files: string[],\n): Promise<void> {\n let entries;\n try {\n entries = await opendir(directory);\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n for await (const entry of entries) {\n const path = join(directory, entry.name);\n if (entry.isDirectory()) {\n await walkLibraryDirectory(root, path, files);\n } else if (\n entry.isFile() &&\n entry.name.endsWith(WIKI_GRAPH_ARCHIVE_EXTENSION)\n ) {\n files.push(relative(root, path).replace(/\\\\/gu, \"/\"));\n }\n }\n}\n\nasync function inspectLibraryArchiveFile(\n root: string,\n relativePath: string,\n): Promise<DiscoveredLibraryArchiveFile> {\n const path = join(root, relativePath);\n const fileStat = await stat(path);\n const mutationToken = await readOptionalWikgMutationToken(path);\n return {\n mtimeMs: fileStat.mtimeMs,\n ...(mutationToken === undefined ? {} : { mutationToken }),\n path,\n relativePath,\n size: fileStat.size,\n };\n}\n\nasync function readOptionalWikgMutationToken(\n path: string,\n): Promise<string | undefined> {\n try {\n return await readWikgArchiveMutationToken(path);\n } catch {\n return undefined;\n }\n}\n\nfunction validateLibraryArchiveRelativePath(relativePath: string): string {\n const normalized = relativePath\n .replace(/\\\\/gu, \"/\")\n .replace(/^\\/+|\\/+$/gu, \"\");\n if (\n normalized === \"\" ||\n isAbsolute(relativePath) ||\n normalized.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\n \"Library archive target must be a relative path inside the library folder.\",\n );\n }\n if (!normalized.endsWith(WIKI_GRAPH_ARCHIVE_EXTENSION)) {\n throw new Error(\"Library archive target must end with .wikg.\");\n }\n return normalized;\n}\n\nfunction resolveLibraryRelativePath(\n root: string,\n relativePath: string,\n): string {\n const path = resolve(root, relativePath);\n const rel = relative(resolve(root), path);\n if (rel === \"\" || rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(\"Library archive target escapes the library folder.\");\n }\n return path;\n}\n\nasync function assertInsideLibrary(path: string, root: string): Promise<void> {\n const rootRealPath = await realpath(root);\n const rel = relative(rootRealPath, path);\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(\"Library archive path escapes the library folder.\");\n }\n}\n\nasync function ensureLibraryArchiveMembershipColumns(\n database: Database,\n): Promise<void> {\n const columns = await database.queryAll(\n \"PRAGMA table_info(library_archives)\",\n undefined,\n (row) => getString(row, \"name\"),\n );\n const columnSet = new Set(columns);\n const additions: Array<readonly [string, string]> = [\n [\"status\", \"TEXT NOT NULL DEFAULT 'present'\"],\n [\"last_seen_mutation_token\", \"TEXT\"],\n [\"last_seen_size\", \"INTEGER\"],\n [\"last_seen_mtime_ms\", \"INTEGER\"],\n [\"last_scanned_at\", \"TEXT\"],\n ];\n for (const [name, definition] of additions) {\n if (!columnSet.has(name)) {\n await database.run(\n `ALTER TABLE library_archives ADD COLUMN ${name} ${definition}`,\n );\n }\n }\n}\n\nasync function ensureLibraryArchiveMembershipPathIndex(\n database: Database,\n): Promise<void> {\n if (await hasUniqueLibraryArchiveRelativePathIndex(database)) {\n await rebuildLibraryArchiveMembershipTable(database);\n }\n await database.run(\n `\n CREATE INDEX IF NOT EXISTS idx_library_archives_library_path\n ON library_archives(library_id, relative_path)\n `,\n );\n}\n\nasync function hasUniqueLibraryArchiveRelativePathIndex(\n database: Database,\n): Promise<boolean> {\n const indexes = await database.queryAll(\n \"PRAGMA index_list(library_archives)\",\n undefined,\n (row) => ({\n name: getString(row, \"name\"),\n unique: getNumber(row, \"unique\") === 1,\n }),\n );\n for (const index of indexes) {\n if (!index.unique) {\n continue;\n }\n const columns = await database.queryAll(\n `PRAGMA index_info(${sqlStringLiteral(index.name)})`,\n undefined,\n (row) => getString(row, \"name\"),\n );\n if (\n columns.length === 2 &&\n columns[0] === \"library_id\" &&\n columns[1] === \"relative_path\"\n ) {\n return true;\n }\n }\n return false;\n}\n\nasync function rebuildLibraryArchiveMembershipTable(\n database: Database,\n): Promise<void> {\n await database.transaction(async () => {\n await database.run(\n \"ALTER TABLE library_archives RENAME TO library_archives_unique_path_legacy\",\n );\n await database.run(`\n CREATE TABLE library_archives (\n${LIBRARY_ARCHIVES_TABLE_COLUMNS_SQL}\n )\n `);\n await database.run(`\n INSERT INTO library_archives (\n id, library_id, public_id, relative_path, status,\n last_seen_mutation_token, last_seen_size, last_seen_mtime_ms,\n last_scanned_at, created_at, updated_at\n )\n SELECT id, library_id, public_id, relative_path, status,\n last_seen_mutation_token, last_seen_size, last_seen_mtime_ms,\n last_scanned_at, created_at, updated_at\n FROM library_archives_unique_path_legacy\n `);\n await database.run(\"DROP TABLE library_archives_unique_path_legacy\");\n });\n}\n\nfunction sqlStringLiteral(value: string): string {\n return `'${value.replace(/'/gu, \"''\")}'`;\n}\n\nasync function createUniqueLibraryArchivePublicId(\n database: Database,\n libraryId: number,\n): Promise<string> {\n for (let attempt = 0; attempt < 20; attempt += 1) {\n const publicId = randomBytes(PUBLIC_ID_BYTES).toString(\"hex\");\n const existing = await database.queryOne(\n \"SELECT public_id FROM library_archives WHERE library_id = ? AND public_id = ?\",\n [libraryId, publicId],\n (row) => getString(row, \"public_id\"),\n );\n if (existing === undefined) {\n return publicId;\n }\n }\n throw new Error(\"Could not generate a unique library archive id.\");\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction normalizeArchiveStatus(value: string): WikiGraphLibraryArchiveStatus {\n if (value === \"conflict\" || value === \"missing\" || value === \"present\") {\n return value;\n }\n return \"present\";\n}\n\nfunction optionalNumberField<K extends string>(\n row: SqlRow,\n dbKey: string,\n outputKey: K,\n): Partial<Record<K, number>> {\n const value = row[dbKey];\n if (typeof value !== \"number\") {\n return {};\n }\n return { [outputKey]: value } as Partial<Record<K, number>>;\n}\n\nfunction optionalStringField<K extends string>(\n row: SqlRow,\n dbKey: string,\n outputKey: K,\n): Partial<Record<K, string>> {\n const value = getOptionalString(row, dbKey);\n if (value === undefined) {\n return {};\n }\n return { [outputKey]: value } as Partial<Record<K, string>>;\n}\n"],"mappings":"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","names":["row"]}
1
+ {"version":3,"sources":["../../src/library/membership.ts"],"sourcesContent":["import { randomBytes } from \"crypto\";\nimport {\n constants,\n copyFile,\n mkdir,\n opendir,\n realpath,\n rename,\n rm,\n stat,\n} from \"fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"path\";\n\nimport {\n getNumber,\n getOptionalString,\n getString,\n type Database,\n type SqlRow,\n} from \"../document/database.js\";\nimport { openSharedStateDatabase } from \"../document/index.js\";\nimport { resolveWikiGraphCoreDatabasePath } from \"../runtime/common/wiki-graph/dir.js\";\nimport { WIKI_GRAPH_ARCHIVE_EXTENSION } from \"../runtime/common/wiki-graph/uri.js\";\nimport {\n readWikgArchiveEntry,\n readWikgArchiveMutationToken,\n WikiGraphArchiveFile,\n} from \"../storage/wikg/index.js\";\nimport { isNodeError } from \"../utils/node-error.js\";\nimport {\n parseWikiGraphLibraryUri,\n resolveWikiGraphLibrary,\n resolveWikiGraphLibraryForScan,\n updateWikiGraphLibraryFolderPathForRebind,\n type ParsedWikiGraphLibraryUri,\n type WikiGraphLibraryRecord,\n} from \"./registry.js\";\nimport { markWikiGraphLibraryIndexDirty } from \"./search-index.js\";\nimport { withWikiGraphLibraryLock } from \"./lock.js\";\n\nconst PUBLIC_ID_BYTES = 6;\nconst SEARCH_INDEX_ARCHIVE_ENTRY_PATH = \"fts.db\";\nconst LIBRARY_ARCHIVES_TABLE_COLUMNS_SQL = `\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n library_id INTEGER NOT NULL,\n public_id TEXT NOT NULL,\n relative_path TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'present',\n last_seen_mutation_token TEXT,\n last_seen_size INTEGER,\n last_seen_mtime_ms INTEGER,\n last_scanned_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(library_id, public_id)\n`;\nconst LIBRARY_ARCHIVE_MEMBERSHIP_SCHEMA_SQL = `\n CREATE TABLE IF NOT EXISTS library_archives (\n${LIBRARY_ARCHIVES_TABLE_COLUMNS_SQL}\n );\n\n CREATE INDEX IF NOT EXISTS idx_library_archives_library\n ON library_archives(library_id);\n\n CREATE INDEX IF NOT EXISTS idx_library_archives_library_path\n ON library_archives(library_id, relative_path);\n`;\n\ntype LibraryPathIdentityMode = \"trusted\" | \"untrusted\";\n\ntype WikiGraphLibraryArchiveStatus = \"conflict\" | \"missing\" | \"present\";\n\nexport interface WikiGraphLibraryArchiveRecord {\n readonly id: number;\n readonly publicId: string;\n readonly uri: string;\n readonly libraryId: number;\n readonly libraryUri: string;\n readonly relativePath: string;\n readonly path: string;\n readonly exists: boolean;\n readonly status: WikiGraphLibraryArchiveStatus;\n readonly lastSeenMutationToken?: string;\n readonly lastSeenSize?: number;\n readonly lastSeenMtimeMs?: number;\n readonly lastScannedAt?: string;\n readonly createdAt: string;\n readonly updatedAt: string;\n}\n\nexport interface WikiGraphLibraryScanResult {\n readonly library: WikiGraphLibraryRecord;\n readonly archives: readonly WikiGraphLibraryArchiveRecord[];\n}\n\ninterface DiscoveredLibraryArchiveFile {\n readonly relativePath: string;\n readonly path: string;\n readonly mutationToken?: string;\n readonly size: number;\n readonly mtimeMs: number;\n}\n\nexport async function scanWikiGraphLibrary(\n target: ParsedWikiGraphLibraryUri,\n): Promise<WikiGraphLibraryScanResult> {\n const library = await resolveWikiGraphLibraryForScan(target);\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n const result = await scanWikiGraphLibraryUnlocked(target, library, {\n pathIdentity: \"trusted\",\n });\n\n await markWikiGraphLibraryIndexDirty(library);\n return result;\n });\n}\n\nexport async function rebindWikiGraphLibrary(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n readonly folderPath: string;\n}): Promise<WikiGraphLibraryScanResult> {\n if (input.target.kind !== \"scope\" || input.target.objectUri !== undefined) {\n throw new Error(\"Library rebind requires a library scope URI.\");\n }\n\n const library = await resolveWikiGraphLibrary(input.target);\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n const rebound = await updateWikiGraphLibraryFolderPathForRebind(\n library,\n input.folderPath,\n );\n const result = await scanWikiGraphLibraryUnlocked(input.target, rebound, {\n pathIdentity: \"untrusted\",\n });\n\n await markWikiGraphLibraryIndexDirty(rebound);\n return result;\n });\n}\n\nasync function scanWikiGraphLibraryUnlocked(\n target: ParsedWikiGraphLibraryUri,\n library: WikiGraphLibraryRecord,\n options: { readonly pathIdentity: LibraryPathIdentityMode },\n): Promise<WikiGraphLibraryScanResult> {\n const files = await listWikgFiles(library.folderPath);\n\n await withLibraryArchiveMembershipDatabase(async (database) => {\n await database.transaction(async () => {\n const existing = await listLibraryArchiveRows(database, library);\n const currentPaths = new Set(files.map((file) => file.relativePath));\n const seenArchiveIds = new Set<number>();\n\n for (const file of files) {\n const existingAtPath = findExistingArchiveAtPath(existing, file);\n if (\n options.pathIdentity === \"trusted\" &&\n existingAtPath !== undefined\n ) {\n await updateLibraryArchiveSeen(database, existingAtPath.id, file, {\n status: \"present\",\n });\n seenArchiveIds.add(existingAtPath.id);\n continue;\n }\n\n const matchingTokenArchives =\n file.mutationToken === undefined\n ? []\n : existing.filter(\n (archive) =>\n archive.lastSeenMutationToken === file.mutationToken &&\n !seenArchiveIds.has(archive.id),\n );\n const adoptable = matchingTokenArchives.filter(\n (archive) =>\n archive.relativePath === file.relativePath ||\n !currentPaths.has(archive.relativePath),\n );\n\n if (\n matchingTokenArchives.length === 1 &&\n adoptable.length === 1 &&\n file.mutationToken !== undefined\n ) {\n const archive = adoptable[0]!;\n await database.run(\n `\n UPDATE library_archives\n SET relative_path = ?\n WHERE id = ?\n `,\n [file.relativePath, archive.id],\n );\n await updateLibraryArchiveSeen(database, archive.id, file, {\n status: \"present\",\n });\n seenArchiveIds.add(archive.id);\n continue;\n }\n\n await insertLibraryArchive(database, library.id, file, {\n status:\n matchingTokenArchives.length === 0 ||\n file.mutationToken === undefined\n ? \"present\"\n : \"conflict\",\n });\n }\n\n for (const archive of existing) {\n if (\n seenArchiveIds.has(archive.id) ||\n (options.pathIdentity === \"trusted\" &&\n currentPaths.has(archive.relativePath))\n ) {\n continue;\n }\n await database.run(\n `\n DELETE FROM library_archives\n WHERE id = ?\n `,\n [archive.id],\n );\n }\n });\n });\n\n return { library, archives: await listWikiGraphLibraryArchives(target) };\n}\n\nexport async function listWikiGraphLibraryArchives(\n target: ParsedWikiGraphLibraryUri,\n): Promise<readonly WikiGraphLibraryArchiveRecord[]> {\n const library = await resolveWikiGraphLibrary(target);\n return await withLibraryArchiveMembershipDatabase(\n async (database) => await listLibraryArchives(database, library),\n );\n}\n\nexport async function getWikiGraphLibraryArchive(\n target: ParsedWikiGraphLibraryUri,\n): Promise<WikiGraphLibraryArchiveRecord> {\n const library = await resolveWikiGraphLibrary(target);\n return await resolveLibraryArchiveTarget(target, library);\n}\n\nexport async function getWikiGraphLibraryArchiveById(\n library: WikiGraphLibraryRecord,\n archiveId: number,\n): Promise<WikiGraphLibraryArchiveRecord> {\n return await withLibraryArchiveMembershipDatabase(\n async (database) =>\n await requireLibraryArchiveById(database, library, archiveId),\n );\n}\n\nexport async function resolveWikiGraphLibraryArchivePath(\n archiveLocator: string,\n): Promise<string> {\n const target = parseWikiGraphLibraryUri(archiveLocator);\n if (target === undefined || target.kind !== \"archive\") {\n throw new Error(\n `Expected a Wiki Graph library archive locator: ${archiveLocator}`,\n );\n }\n\n const archive = await getWikiGraphLibraryArchive(target);\n if (!archive.exists || archive.status === \"missing\") {\n throw new Error(`Wiki Graph library archive is missing: ${archiveLocator}`);\n }\n if (archive.status === \"conflict\") {\n throw new Error(\n `Wiki Graph library archive has a conflict and cannot be resolved: ${archiveLocator}`,\n );\n }\n\n return archive.path;\n}\n\nexport async function addWikiGraphLibraryArchive(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n readonly inputPath: string;\n readonly to?: string;\n}): Promise<WikiGraphLibraryArchiveRecord> {\n if (input.inputPath.startsWith(\"wikg://\")) {\n throw new Error(\n \"Library add --input accepts a file path, not a Wiki Graph URI.\",\n );\n }\n if (/^[a-z][a-z0-9+.-]*:\\/\\//iu.test(input.inputPath)) {\n throw new Error(\"Library add does not support URL inputs yet.\");\n }\n\n const library = await resolveWikiGraphLibrary(input.target);\n await mkdir(library.folderPath, { recursive: true });\n const sourcePath = resolve(input.inputPath);\n const sourceStats = await stat(sourcePath);\n if (!sourceStats.isFile()) {\n throw new Error(`Library add --input must be a file: ${input.inputPath}`);\n }\n const sourceBasename = sourcePath.split(/[\\\\/]/u).at(-1) ?? \"\";\n const targetRelativePath = validateLibraryArchiveRelativePath(\n input.to ?? sourceBasename,\n );\n const targetPath = resolveLibraryRelativePath(\n library.folderPath,\n targetRelativePath,\n );\n\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n await mkdir(dirname(targetPath), { recursive: true });\n await assertInsideLibrary(\n await realpath(dirname(targetPath)),\n library.folderPath,\n );\n await copyFile(sourcePath, targetPath, constants.COPYFILE_EXCL);\n await assertInsideLibrary(await realpath(targetPath), library.folderPath);\n const targetFile = await ensureLibraryArchiveFileHasNoSearchIndexAndInspect(\n library.folderPath,\n targetRelativePath,\n );\n const archive = await withLibraryArchiveMembershipDatabase(\n async (database) => {\n await database.transaction(async () => {\n await ensureLibraryArchiveByRelativePath(\n database,\n library.id,\n targetFile,\n );\n });\n return await requireLibraryArchiveByRelativePath(\n database,\n library,\n targetRelativePath,\n );\n },\n );\n\n await markWikiGraphLibraryIndexDirty(library);\n return archive;\n });\n}\n\nexport async function finalizeWikiGraphLibraryArchiveWrite(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n}): Promise<boolean> {\n if (input.target.kind !== \"archive\") {\n throw new Error(\"Expected a Wiki Graph library archive URI.\");\n }\n\n const library = await resolveWikiGraphLibrary(input.target);\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n const archive = await resolveLibraryArchiveTarget(input.target, library);\n const removed = await ensureLibraryManagedArchiveHasNoSearchIndex(\n archive.path,\n );\n const refreshedFile = await inspectLibraryArchiveFile(\n library.folderPath,\n archive.relativePath,\n );\n\n await withLibraryArchiveMembershipDatabase(async (database) => {\n await updateLibraryArchiveSeen(database, archive.id, refreshedFile, {\n status: \"present\",\n });\n });\n\n return removed;\n });\n}\n\nexport async function ensureLibraryManagedArchiveHasNoSearchIndex(\n archivePath: string,\n): Promise<boolean> {\n if ((await readOptionalWikgMutationToken(archivePath)) === undefined) {\n return false;\n }\n\n const searchIndex = await readWikgArchiveEntry(\n archivePath,\n SEARCH_INDEX_ARCHIVE_ENTRY_PATH,\n );\n if (searchIndex === undefined) {\n return false;\n }\n\n await new WikiGraphArchiveFile(archivePath).write(\n async (document) => {\n await document.deleteSearchIndexDatabase();\n },\n { searchIndexWritebackPolicy: \"archive\" },\n );\n return true;\n}\n\nexport async function removeWikiGraphLibraryArchive(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n}): Promise<WikiGraphLibraryArchiveRecord> {\n const library = await resolveWikiGraphLibrary(input.target);\n const archive = await resolveLibraryArchiveTarget(input.target, library);\n\n await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n await rm(archive.path, { force: true });\n await withLibraryArchiveMembershipDatabase(async (database) => {\n await database.run(\"DELETE FROM library_archives WHERE id = ?\", [\n archive.id,\n ]);\n });\n await markWikiGraphLibraryIndexDirty(library);\n });\n\n return { ...archive, exists: false, status: \"missing\" };\n}\n\nexport async function moveWikiGraphLibraryArchive(input: {\n readonly target: ParsedWikiGraphLibraryUri;\n readonly to: string;\n}): Promise<WikiGraphLibraryArchiveRecord> {\n const library = await resolveWikiGraphLibrary(input.target);\n const archive = await resolveLibraryArchiveTarget(input.target, library);\n const targetRelativePath = validateLibraryArchiveRelativePath(input.to);\n const targetPath = resolveLibraryRelativePath(\n library.folderPath,\n targetRelativePath,\n );\n\n return await withWikiGraphLibraryLock(library.id, \"write\", async () => {\n await mkdir(dirname(targetPath), { recursive: true });\n await assertInsideLibrary(\n await realpath(dirname(targetPath)),\n library.folderPath,\n );\n if (await pathExists(targetPath)) {\n throw new Error(\n `Library archive target already exists: ${targetRelativePath}`,\n );\n }\n await rename(archive.path, targetPath);\n await assertInsideLibrary(await realpath(targetPath), library.folderPath);\n const targetFile = await inspectLibraryArchiveFile(\n library.folderPath,\n targetRelativePath,\n );\n const moved = await withLibraryArchiveMembershipDatabase(\n async (database) => {\n await database.run(\n \"UPDATE library_archives SET relative_path = ? WHERE id = ?\",\n [targetRelativePath, archive.id],\n );\n await updateLibraryArchiveSeen(database, archive.id, targetFile, {\n status: \"present\",\n });\n return await requireLibraryArchiveByPublicId(\n database,\n library,\n archive.publicId,\n );\n },\n );\n\n await markWikiGraphLibraryIndexDirty(library);\n return moved;\n });\n}\n\nasync function withLibraryArchiveMembershipDatabase<T>(\n operation: (database: Database) => Promise<T>,\n): Promise<T> {\n const database = await openSharedStateDatabase(\n resolveWikiGraphCoreDatabasePath(),\n LIBRARY_ARCHIVE_MEMBERSHIP_SCHEMA_SQL,\n );\n\n try {\n await ensureLibraryArchiveMembershipColumns(database);\n await ensureLibraryArchiveMembershipPathIndex(database);\n return await operation(database);\n } finally {\n await database.close();\n }\n}\n\nasync function listLibraryArchives(\n database: Database,\n library: WikiGraphLibraryRecord,\n): Promise<WikiGraphLibraryArchiveRecord[]> {\n const rows = await queryLibraryArchiveRows(database, library.id);\n const archives: WikiGraphLibraryArchiveRecord[] = [];\n for (const row of rows) {\n const relativePath = getString(row, \"relative_path\");\n archives.push(\n mapLibraryArchiveRecord(\n library,\n row,\n await pathExists(join(library.folderPath, relativePath)),\n ),\n );\n }\n return archives;\n}\n\nasync function listLibraryArchiveRows(\n database: Database,\n library: WikiGraphLibraryRecord,\n): Promise<WikiGraphLibraryArchiveRecord[]> {\n const rows = await queryLibraryArchiveRows(database, library.id);\n return rows.map((row) => mapLibraryArchiveRecord(library, row, false));\n}\n\nasync function queryLibraryArchiveRows(\n database: Database,\n libraryId: number,\n): Promise<SqlRow[]> {\n return await database.queryAll(\n `\n SELECT id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at,\n created_at, updated_at\n FROM library_archives\n WHERE library_id = ?\n ORDER BY relative_path\n `,\n [libraryId],\n (row) => row,\n );\n}\n\nasync function ensureLibraryArchiveByRelativePath(\n database: Database,\n libraryId: number,\n file: DiscoveredLibraryArchiveFile,\n): Promise<void> {\n const existing = await database.queryOne(\n `\n SELECT id\n FROM library_archives\n WHERE library_id = ? AND relative_path = ?\n ORDER BY CASE status\n WHEN 'present' THEN 0\n WHEN 'conflict' THEN 1\n ELSE 2\n END, id DESC\n `,\n [libraryId, file.relativePath],\n (row) => getNumber(row, \"id\"),\n );\n if (existing !== undefined) {\n await updateLibraryArchiveSeen(database, existing, file, {\n status: \"present\",\n });\n return;\n }\n\n await insertLibraryArchive(database, libraryId, file, { status: \"present\" });\n}\n\nasync function insertLibraryArchive(\n database: Database,\n libraryId: number,\n file: DiscoveredLibraryArchiveFile,\n options: { readonly status: WikiGraphLibraryArchiveStatus },\n): Promise<void> {\n const now = new Date().toISOString();\n await database.run(\n `\n INSERT INTO library_archives (\n library_id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at, created_at, updated_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n [\n libraryId,\n await createUniqueLibraryArchivePublicId(database, libraryId),\n file.relativePath,\n options.status,\n file.mutationToken ?? null,\n file.size,\n Math.round(file.mtimeMs),\n now,\n now,\n now,\n ],\n );\n}\n\nasync function updateLibraryArchiveSeen(\n database: Database,\n archiveId: number,\n file: DiscoveredLibraryArchiveFile,\n options: { readonly status: WikiGraphLibraryArchiveStatus },\n): Promise<void> {\n const now = new Date().toISOString();\n await database.run(\n `\n UPDATE library_archives\n SET status = ?,\n last_seen_mutation_token = ?,\n last_seen_size = ?,\n last_seen_mtime_ms = ?,\n last_scanned_at = ?,\n updated_at = ?\n WHERE id = ?\n `,\n [\n options.status,\n file.mutationToken ?? null,\n file.size,\n Math.round(file.mtimeMs),\n now,\n now,\n archiveId,\n ],\n );\n}\n\nasync function requireLibraryArchiveByRelativePath(\n database: Database,\n library: WikiGraphLibraryRecord,\n relativePath: string,\n): Promise<WikiGraphLibraryArchiveRecord> {\n const archive = await database.queryOne(\n `\n SELECT id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at,\n created_at, updated_at\n FROM library_archives\n WHERE library_id = ? AND relative_path = ?\n ORDER BY CASE status\n WHEN 'present' THEN 0\n WHEN 'conflict' THEN 1\n ELSE 2\n END, id DESC\n `,\n [library.id, relativePath],\n (row) => mapLibraryArchiveRecord(library, row, true),\n );\n if (archive === undefined) {\n throw new Error(\n `Library archive registry record is missing: ${relativePath}`,\n );\n }\n return archive;\n}\n\nasync function requireLibraryArchiveByPublicId(\n database: Database,\n library: WikiGraphLibraryRecord,\n publicId: string,\n): Promise<WikiGraphLibraryArchiveRecord> {\n const row = await database.queryOne(\n `\n SELECT id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at,\n created_at, updated_at\n FROM library_archives\n WHERE library_id = ? AND public_id = ?\n `,\n [library.id, publicId],\n (row) => row,\n );\n if (row === undefined) {\n throw new Error(`Unknown Wiki Graph library archive: ${publicId}`);\n }\n const relativePath = getString(row, \"relative_path\");\n return mapLibraryArchiveRecord(\n library,\n row,\n await pathExists(join(library.folderPath, relativePath)),\n );\n}\n\nasync function requireLibraryArchiveById(\n database: Database,\n library: WikiGraphLibraryRecord,\n archiveId: number,\n): Promise<WikiGraphLibraryArchiveRecord> {\n const row = await database.queryOne(\n `\n SELECT id, public_id, relative_path, status, last_seen_mutation_token,\n last_seen_size, last_seen_mtime_ms, last_scanned_at,\n created_at, updated_at\n FROM library_archives\n WHERE library_id = ? AND id = ?\n `,\n [library.id, archiveId],\n (row) => row,\n );\n if (row === undefined) {\n throw new Error(`Unknown Wiki Graph library archive: ${archiveId}`);\n }\n const relativePath = getString(row, \"relative_path\");\n return mapLibraryArchiveRecord(\n library,\n row,\n await pathExists(join(library.folderPath, relativePath)),\n );\n}\n\nasync function resolveLibraryArchiveTarget(\n target: ParsedWikiGraphLibraryUri,\n library: WikiGraphLibraryRecord,\n): Promise<WikiGraphLibraryArchiveRecord> {\n if (target.kind !== \"archive\" || target.archivePublicId === undefined) {\n throw new Error(\"Expected a Wiki Graph library archive URI.\");\n }\n return await withLibraryArchiveMembershipDatabase(\n async (database) =>\n await requireLibraryArchiveByPublicId(\n database,\n library,\n target.archivePublicId!,\n ),\n );\n}\n\nfunction mapLibraryArchiveRecord(\n library: WikiGraphLibraryRecord,\n row: SqlRow,\n exists: boolean,\n): WikiGraphLibraryArchiveRecord {\n const publicId = getString(row, \"public_id\");\n const relativePath = getString(row, \"relative_path\");\n const databaseStatus = normalizeArchiveStatus(\n getOptionalString(row, \"status\") ?? \"present\",\n );\n return {\n createdAt: getString(row, \"created_at\"),\n exists,\n id: getNumber(row, \"id\"),\n libraryId: library.id,\n libraryUri: library.uri,\n ...optionalStringField(\n row,\n \"last_seen_mutation_token\",\n \"lastSeenMutationToken\",\n ),\n ...optionalNumberField(row, \"last_seen_mtime_ms\", \"lastSeenMtimeMs\"),\n ...optionalNumberField(row, \"last_seen_size\", \"lastSeenSize\"),\n ...optionalStringField(row, \"last_scanned_at\", \"lastScannedAt\"),\n path: join(library.folderPath, relativePath),\n publicId,\n relativePath,\n status: exists ? databaseStatus : \"missing\",\n updatedAt: getString(row, \"updated_at\"),\n uri: `${library.uri}/arc/${publicId}`,\n };\n}\n\nfunction findExistingArchiveAtPath(\n archives: readonly WikiGraphLibraryArchiveRecord[],\n file: DiscoveredLibraryArchiveFile,\n): WikiGraphLibraryArchiveRecord | undefined {\n return archives\n .filter((archive) => archive.relativePath === file.relativePath)\n .sort((a, b) => archivePathMatchRank(a) - archivePathMatchRank(b))[0];\n}\n\nfunction archivePathMatchRank(archive: WikiGraphLibraryArchiveRecord): number {\n if (archive.status === \"present\") {\n return 0;\n }\n if (archive.status === \"conflict\") {\n return 1;\n }\n return 2;\n}\n\nasync function listWikgFiles(\n root: string,\n): Promise<DiscoveredLibraryArchiveFile[]> {\n await assertLibraryFolderExists(root);\n const relativePaths: string[] = [];\n await walkLibraryDirectory(root, root, relativePaths);\n const files: DiscoveredLibraryArchiveFile[] = [];\n for (const relativePath of relativePaths.sort((a, b) => a.localeCompare(b))) {\n files.push(\n await ensureLibraryArchiveFileHasNoSearchIndexAndInspect(\n root,\n relativePath,\n ),\n );\n }\n return files;\n}\n\nasync function assertLibraryFolderExists(root: string): Promise<void> {\n try {\n const rootStat = await stat(root);\n if (!rootStat.isDirectory()) {\n throw new Error(`Wiki Graph library folder is not a directory: ${root}`);\n }\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n throw new Error(`Wiki Graph library folder is missing: ${root}`);\n }\n throw error;\n }\n}\n\nasync function ensureLibraryArchiveFileHasNoSearchIndexAndInspect(\n root: string,\n relativePath: string,\n): Promise<DiscoveredLibraryArchiveFile> {\n await ensureLibraryManagedArchiveHasNoSearchIndex(join(root, relativePath));\n return await inspectLibraryArchiveFile(root, relativePath);\n}\n\nasync function walkLibraryDirectory(\n root: string,\n directory: string,\n files: string[],\n): Promise<void> {\n let entries;\n try {\n entries = await opendir(directory);\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n for await (const entry of entries) {\n const path = join(directory, entry.name);\n if (entry.isDirectory()) {\n await walkLibraryDirectory(root, path, files);\n } else if (\n entry.isFile() &&\n entry.name.endsWith(WIKI_GRAPH_ARCHIVE_EXTENSION)\n ) {\n files.push(relative(root, path).replace(/\\\\/gu, \"/\"));\n }\n }\n}\n\nasync function inspectLibraryArchiveFile(\n root: string,\n relativePath: string,\n): Promise<DiscoveredLibraryArchiveFile> {\n const path = join(root, relativePath);\n const fileStat = await stat(path);\n const mutationToken = await readOptionalWikgMutationToken(path);\n return {\n mtimeMs: fileStat.mtimeMs,\n ...(mutationToken === undefined ? {} : { mutationToken }),\n path,\n relativePath,\n size: fileStat.size,\n };\n}\n\nasync function readOptionalWikgMutationToken(\n path: string,\n): Promise<string | undefined> {\n try {\n return await readWikgArchiveMutationToken(path);\n } catch {\n return undefined;\n }\n}\n\nfunction validateLibraryArchiveRelativePath(relativePath: string): string {\n const normalized = relativePath\n .replace(/\\\\/gu, \"/\")\n .replace(/^\\/+|\\/+$/gu, \"\");\n if (\n normalized === \"\" ||\n isAbsolute(relativePath) ||\n normalized.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\n \"Library archive target must be a relative path inside the library folder.\",\n );\n }\n if (!normalized.endsWith(WIKI_GRAPH_ARCHIVE_EXTENSION)) {\n throw new Error(\"Library archive target must end with .wikg.\");\n }\n return normalized;\n}\n\nfunction resolveLibraryRelativePath(\n root: string,\n relativePath: string,\n): string {\n const path = resolve(root, relativePath);\n const rel = relative(resolve(root), path);\n if (rel === \"\" || rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(\"Library archive target escapes the library folder.\");\n }\n return path;\n}\n\nasync function assertInsideLibrary(path: string, root: string): Promise<void> {\n const rootRealPath = await realpath(root);\n const rel = relative(rootRealPath, path);\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(\"Library archive path escapes the library folder.\");\n }\n}\n\nasync function ensureLibraryArchiveMembershipColumns(\n database: Database,\n): Promise<void> {\n const columns = await database.queryAll(\n \"PRAGMA table_info(library_archives)\",\n undefined,\n (row) => getString(row, \"name\"),\n );\n const columnSet = new Set(columns);\n const additions: Array<readonly [string, string]> = [\n [\"status\", \"TEXT NOT NULL DEFAULT 'present'\"],\n [\"last_seen_mutation_token\", \"TEXT\"],\n [\"last_seen_size\", \"INTEGER\"],\n [\"last_seen_mtime_ms\", \"INTEGER\"],\n [\"last_scanned_at\", \"TEXT\"],\n ];\n for (const [name, definition] of additions) {\n if (!columnSet.has(name)) {\n await database.run(\n `ALTER TABLE library_archives ADD COLUMN ${name} ${definition}`,\n );\n }\n }\n}\n\nasync function ensureLibraryArchiveMembershipPathIndex(\n database: Database,\n): Promise<void> {\n if (await hasUniqueLibraryArchiveRelativePathIndex(database)) {\n await rebuildLibraryArchiveMembershipTable(database);\n }\n await database.run(\n `\n CREATE INDEX IF NOT EXISTS idx_library_archives_library_path\n ON library_archives(library_id, relative_path)\n `,\n );\n}\n\nasync function hasUniqueLibraryArchiveRelativePathIndex(\n database: Database,\n): Promise<boolean> {\n const indexes = await database.queryAll(\n \"PRAGMA index_list(library_archives)\",\n undefined,\n (row) => ({\n name: getString(row, \"name\"),\n unique: getNumber(row, \"unique\") === 1,\n }),\n );\n for (const index of indexes) {\n if (!index.unique) {\n continue;\n }\n const columns = await database.queryAll(\n `PRAGMA index_info(${sqlStringLiteral(index.name)})`,\n undefined,\n (row) => getString(row, \"name\"),\n );\n if (\n columns.length === 2 &&\n columns[0] === \"library_id\" &&\n columns[1] === \"relative_path\"\n ) {\n return true;\n }\n }\n return false;\n}\n\nasync function rebuildLibraryArchiveMembershipTable(\n database: Database,\n): Promise<void> {\n await database.transaction(async () => {\n await database.run(\n \"ALTER TABLE library_archives RENAME TO library_archives_unique_path_legacy\",\n );\n await database.run(`\n CREATE TABLE library_archives (\n${LIBRARY_ARCHIVES_TABLE_COLUMNS_SQL}\n )\n `);\n await database.run(`\n INSERT INTO library_archives (\n id, library_id, public_id, relative_path, status,\n last_seen_mutation_token, last_seen_size, last_seen_mtime_ms,\n last_scanned_at, created_at, updated_at\n )\n SELECT id, library_id, public_id, relative_path, status,\n last_seen_mutation_token, last_seen_size, last_seen_mtime_ms,\n last_scanned_at, created_at, updated_at\n FROM library_archives_unique_path_legacy\n `);\n await database.run(\"DROP TABLE library_archives_unique_path_legacy\");\n });\n}\n\nfunction sqlStringLiteral(value: string): string {\n return `'${value.replace(/'/gu, \"''\")}'`;\n}\n\nasync function createUniqueLibraryArchivePublicId(\n database: Database,\n libraryId: number,\n): Promise<string> {\n for (let attempt = 0; attempt < 20; attempt += 1) {\n const publicId = randomBytes(PUBLIC_ID_BYTES).toString(\"hex\");\n const existing = await database.queryOne(\n \"SELECT public_id FROM library_archives WHERE library_id = ? AND public_id = ?\",\n [libraryId, publicId],\n (row) => getString(row, \"public_id\"),\n );\n if (existing === undefined) {\n return publicId;\n }\n }\n throw new Error(\"Could not generate a unique library archive id.\");\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction normalizeArchiveStatus(value: string): WikiGraphLibraryArchiveStatus {\n if (value === \"conflict\" || value === \"missing\" || value === \"present\") {\n return value;\n }\n return \"present\";\n}\n\nfunction optionalNumberField<K extends string>(\n row: SqlRow,\n dbKey: string,\n outputKey: K,\n): Partial<Record<K, number>> {\n const value = row[dbKey];\n if (typeof value !== \"number\") {\n return {};\n }\n return { [outputKey]: value } as Partial<Record<K, number>>;\n}\n\nfunction optionalStringField<K extends string>(\n row: SqlRow,\n dbKey: string,\n outputKey: K,\n): Partial<Record<K, string>> {\n const value = getOptionalString(row, dbKey);\n if (value === undefined) {\n return {};\n }\n return { [outputKey]: value } as Partial<Record<K, string>>;\n}\n"],"mappings":"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","names":["row"]}
@@ -1,4 +1,4 @@
1
- import { ArchiveFindOptions, ArchiveFindResult, ArchiveRelatedOptions, ArchiveRelatedResult, ArchiveEvidenceOptions, ArchiveEvidence, ArchiveCollectionOptions, ArchiveCollectionResult, ArchivePack, ArchivePage, ArchiveLibrarySource } from '../retrieval/query/archive-view/types.js';
1
+ import { ArchiveFindOptions, ArchiveFindResult, ArchiveRelatedOptions, ArchiveRelatedResult, ArchiveCollectionOptions, ArchiveCollectionResult, ArchiveEvidenceOptions, ArchiveEvidence, ArchivePack, ArchivePage, ArchiveLibrarySource } from '../retrieval/query/archive-view/types.js';
2
2
  import { readArchivePage } from '../retrieval/query/archive-view/pages.js';
3
3
  import { ParsedWikiGraphLibraryUri } from './registry.js';
4
4
  import '../document/types.js';
@@ -31,7 +31,9 @@ import '../external/wikipage/wikimedia-client/wiki.js';
31
31
  import '../external/wikipage/fetch-log.js';
32
32
 
33
33
  declare function findWikiGraphLibraryObjects(target: ParsedWikiGraphLibraryUri, query: string, options?: ArchiveFindOptions): Promise<ArchiveFindResult>;
34
+ declare function findWikiGraphLibraryArchiveMembers(target: ParsedWikiGraphLibraryUri, query: string, options?: ArchiveFindOptions): Promise<ArchiveFindResult>;
34
35
  declare function listWikiGraphLibraryObjects(target: ParsedWikiGraphLibraryUri, options?: ArchiveCollectionOptions): Promise<ArchiveCollectionResult>;
36
+ declare function listWikiGraphLibraryArchiveMembers(target: ParsedWikiGraphLibraryUri, options?: ArchiveCollectionOptions): Promise<ArchiveCollectionResult>;
35
37
  declare function readWikiGraphLibraryPage(target: ParsedWikiGraphLibraryUri, objectUri: string, options?: Parameters<typeof readArchivePage>[2]): Promise<ArchivePage>;
36
38
  declare function listWikiGraphLibraryEvidence(target: ParsedWikiGraphLibraryUri, objectUri: string, options?: ArchiveEvidenceOptions): Promise<ArchiveEvidence>;
37
39
  declare function listRelatedWikiGraphLibraryObjects(target: ParsedWikiGraphLibraryUri, objectUri: string, options?: ArchiveRelatedOptions): Promise<ArchiveRelatedResult>;
@@ -42,4 +44,4 @@ declare function createLibrarySources(values: readonly {
42
44
  readonly libraryArchiveUri?: string;
43
45
  }[]): readonly ArchiveLibrarySource[];
44
46
 
45
- export { createLibrarySources, findWikiGraphLibraryObjects, listRelatedWikiGraphLibraryObjects, listWikiGraphLibraryEvidence, listWikiGraphLibraryObjects, packWikiGraphLibraryContext, readWikiGraphLibraryPage, resolveWikiGraphLibraryQueryTargetById };
47
+ export { createLibrarySources, findWikiGraphLibraryArchiveMembers, findWikiGraphLibraryObjects, listRelatedWikiGraphLibraryObjects, listWikiGraphLibraryArchiveMembers, listWikiGraphLibraryEvidence, listWikiGraphLibraryObjects, packWikiGraphLibraryContext, readWikiGraphLibraryPage, resolveWikiGraphLibraryQueryTargetById };
@@ -72,12 +72,46 @@ async function findWikiGraphLibraryObjects(target, query, options = {}) {
72
72
  }
73
73
  return createFindResult(query, hits, options, result.terms);
74
74
  }
75
+ async function findWikiGraphLibraryArchiveMembers(target, query, options = {}) {
76
+ const terms = createLibraryArchiveMemberSearchTerms(query);
77
+ const archives = await listWikiGraphLibraryArchives(target);
78
+ const hits = archives.map(formatLibraryArchiveMemberHit).filter((hit) => matchesLibraryArchiveMemberSearch(hit, terms));
79
+ return createFindResult(query, hits, options, terms, "typed");
80
+ }
75
81
  function createLibraryQueryIndexHitLimit(options) {
76
82
  return Math.max(
77
83
  (options.limit ?? DEFAULT_LIBRARY_PAGE_LIMIT) * LIBRARY_QUERY_INDEX_LIMIT_MULTIPLIER,
78
84
  LIBRARY_QUERY_INDEX_MIN_LIMIT
79
85
  );
80
86
  }
87
+ function createLibraryArchiveMemberSearchTerms(query) {
88
+ return query.trim().toLocaleLowerCase().split(/\s+/u).filter((term) => term !== "");
89
+ }
90
+ function matchesLibraryArchiveMemberSearch(hit, terms) {
91
+ if (terms.length === 0) {
92
+ return true;
93
+ }
94
+ const haystack = `${hit.id}
95
+ ${hit.title}
96
+ ${hit.snippet}`.toLocaleLowerCase();
97
+ return terms.every((term) => haystack.includes(term));
98
+ }
99
+ function formatLibraryArchiveMemberHit(archive) {
100
+ const details = [
101
+ archive.relativePath,
102
+ archive.status,
103
+ archive.exists ? "exists" : "missing-file"
104
+ ].join(" ");
105
+ return {
106
+ archiveId: archive.id,
107
+ field: "metadata",
108
+ id: archive.uri,
109
+ libraryArchiveUri: archive.uri,
110
+ snippet: details,
111
+ title: archive.relativePath,
112
+ type: "meta"
113
+ };
114
+ }
81
115
  async function listWikiGraphLibraryObjects(target, options = {}) {
82
116
  const hits = [];
83
117
  const result = await listWikiGraphLibrarySearchIndex(target, {
@@ -105,6 +139,14 @@ async function listWikiGraphLibraryObjects(target, options = {}) {
105
139
  }
106
140
  return createCollectionResult(hits, options);
107
141
  }
142
+ async function listWikiGraphLibraryArchiveMembers(target, options = {}) {
143
+ return createCollectionResult(
144
+ (await listWikiGraphLibraryArchives(target)).map(
145
+ formatLibraryArchiveMemberHit
146
+ ),
147
+ options
148
+ );
149
+ }
108
150
  async function readWikiGraphLibraryPage(target, objectUri, options = {}) {
109
151
  const pages = await readIndexedArchiveResults(
110
152
  target,
@@ -411,8 +453,10 @@ function isTripleObjectUri(objectUri) {
411
453
  }
412
454
  export {
413
455
  createLibrarySources,
456
+ findWikiGraphLibraryArchiveMembers,
414
457
  findWikiGraphLibraryObjects,
415
458
  listRelatedWikiGraphLibraryObjects,
459
+ listWikiGraphLibraryArchiveMembers,
416
460
  listWikiGraphLibraryEvidence,
417
461
  listWikiGraphLibraryObjects,
418
462
  packWikiGraphLibraryContext,