wiki-graph-sdk 0.8.1 → 0.8.3
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/README.md +30 -0
- package/dist/archives.cjs +25 -19
- package/dist/archives.cjs.map +1 -1
- package/dist/archives.d.ts +2 -0
- package/dist/archives.js +14 -7
- package/dist/archives.js.map +1 -1
- package/dist/conversions.cjs +11 -12
- package/dist/conversions.cjs.map +1 -1
- package/dist/conversions.js +7 -7
- package/dist/conversions.js.map +1 -1
- package/dist/default-worker.cjs +83 -20
- package/dist/default-worker.cjs.map +1 -1
- package/dist/default-worker.js +84 -17
- package/dist/default-worker.js.map +1 -1
- package/dist/embedding.cjs +6 -7
- package/dist/embedding.cjs.map +1 -1
- package/dist/embedding.js +7 -7
- package/dist/embedding.js.map +1 -1
- package/dist/gc.cjs +106 -12
- package/dist/gc.cjs.map +1 -1
- package/dist/gc.d.ts +3 -0
- package/dist/gc.js +110 -12
- package/dist/gc.js.map +1 -1
- package/dist/host-IbqJ8WSV.d.ts +18 -0
- package/dist/index.cjs +127 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.js +119 -21
- package/dist/index.js.map +1 -1
- package/dist/local-config.cjs +6 -7
- package/dist/local-config.cjs.map +1 -1
- package/dist/local-config.js +7 -7
- package/dist/local-config.js.map +1 -1
- package/dist/maintenance.cjs.map +1 -1
- package/dist/maintenance.js +1 -0
- package/dist/maintenance.js.map +1 -1
- package/dist/node-platform.cjs +18 -4
- package/dist/node-platform.cjs.map +1 -1
- package/dist/node-platform.d.ts +12 -3
- package/dist/node-platform.js +18 -4
- package/dist/node-platform.js.map +1 -1
- package/dist/runtime-config.cjs +6 -7
- package/dist/runtime-config.cjs.map +1 -1
- package/dist/runtime-config.js +7 -7
- package/dist/runtime-config.js.map +1 -1
- package/dist/stage.cjs +6 -7
- package/dist/stage.cjs.map +1 -1
- package/dist/stage.js +7 -7
- package/dist/stage.js.map +1 -1
- package/dist/worker.cjs +113 -50
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.ts +7 -2
- package/dist/worker.js +125 -58
- package/dist/worker.js.map +1 -1
- package/package.json +2 -2
package/dist/worker.cjs
CHANGED
|
@@ -712,18 +712,23 @@ function resolveNodeDataDirectory() {
|
|
|
712
712
|
directory = parent;
|
|
713
713
|
}
|
|
714
714
|
}
|
|
715
|
-
function createNodeWikiGraphStorage(
|
|
715
|
+
function createNodeWikiGraphStorage(stateRootOrOptions = pathModule.join(
|
|
716
|
+
os.homedir(),
|
|
717
|
+
".wikigraph"
|
|
718
|
+
)) {
|
|
719
|
+
const libraryRoot = typeof stateRootOrOptions === "string" ? stateRootOrOptions : stateRootOrOptions.libraryRoot;
|
|
720
|
+
const documentStoreRoot = typeof stateRootOrOptions === "string" ? pathModule.join(stateRootOrOptions, "documents") : stateRootOrOptions.documentStoreRoot;
|
|
716
721
|
return {
|
|
717
|
-
library: new NodeDirectory(
|
|
718
|
-
documentStore: new NodeDirectory(
|
|
722
|
+
library: new NodeDirectory(libraryRoot),
|
|
723
|
+
documentStore: new NodeDirectory(documentStoreRoot)
|
|
719
724
|
};
|
|
720
725
|
}
|
|
721
|
-
function installNodeWikiGraphPlatform(stateRoot) {
|
|
722
|
-
(0, import_platform.installWikiGraphPlatform)(nodeWikiGraphPlatform);
|
|
723
|
-
(0, import_platform.installWikiGraphStorage)(createNodeWikiGraphStorage(stateRoot));
|
|
724
|
-
}
|
|
725
726
|
function ensureNodeWikiGraphPlatform() {
|
|
726
|
-
|
|
727
|
+
try {
|
|
728
|
+
(0, import_platform.getWikiGraphPlatform)();
|
|
729
|
+
} catch {
|
|
730
|
+
(0, import_platform.installWikiGraphPlatform)(nodeWikiGraphPlatform);
|
|
731
|
+
}
|
|
727
732
|
try {
|
|
728
733
|
(0, import_platform.getWikiGraphStorage)();
|
|
729
734
|
} catch {
|
|
@@ -737,14 +742,8 @@ async function withNodeWikiGraphStorage(stateRoot, operation) {
|
|
|
737
742
|
);
|
|
738
743
|
}
|
|
739
744
|
|
|
740
|
-
// src/
|
|
741
|
-
var
|
|
742
|
-
var import_path2 = require("path");
|
|
743
|
-
var import_wiki_graph_core = require("wiki-graph-core");
|
|
744
|
-
|
|
745
|
-
// src/runtime-path.ts
|
|
746
|
-
var import_os = require("os");
|
|
747
|
-
var import_path = require("path");
|
|
745
|
+
// src/host.ts
|
|
746
|
+
var import_platform2 = require("wiki-graph-core/platform");
|
|
748
747
|
|
|
749
748
|
// src/runtime-context.ts
|
|
750
749
|
var import_async_hooks = require("async_hooks");
|
|
@@ -765,6 +764,9 @@ function getRuntimeContextStorage() {
|
|
|
765
764
|
});
|
|
766
765
|
return storage;
|
|
767
766
|
}
|
|
767
|
+
async function withWikiGraphSDKRuntimeContext(context, operation) {
|
|
768
|
+
return await runtimeContext.run(context, operation);
|
|
769
|
+
}
|
|
768
770
|
function getWikiGraphSDKRuntimeContext() {
|
|
769
771
|
return runtimeContext.getStore() ?? {
|
|
770
772
|
cwd: process.cwd(),
|
|
@@ -774,7 +776,59 @@ function getWikiGraphSDKRuntimeContext() {
|
|
|
774
776
|
};
|
|
775
777
|
}
|
|
776
778
|
|
|
779
|
+
// src/host.ts
|
|
780
|
+
function prepareWikiGraphSDKHost(host) {
|
|
781
|
+
if (host?.platform === void 0) {
|
|
782
|
+
ensureNodeWikiGraphPlatform();
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
785
|
+
(0, import_platform2.installWikiGraphPlatform)(host.platform);
|
|
786
|
+
}
|
|
787
|
+
function assertWikiGraphSDKHostOptions(options) {
|
|
788
|
+
if (options.host?.storage !== void 0 && options.host.stateDir === void 0) {
|
|
789
|
+
throw new TypeError(
|
|
790
|
+
"Wiki Graph SDK host.storage requires host.stateDir so SDK configuration cannot fall back to the default user state directory."
|
|
791
|
+
);
|
|
792
|
+
}
|
|
793
|
+
if (options.stateDir !== void 0 && (options.host?.stateDir !== void 0 || options.host?.storage !== void 0)) {
|
|
794
|
+
throw new TypeError(
|
|
795
|
+
"Wiki Graph SDK host state/storage and top-level stateDir cannot be used together. Put the state directory in host.stateDir when providing host.storage."
|
|
796
|
+
);
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
async function withWikiGraphSDKHost(options, operation) {
|
|
800
|
+
const current = getWikiGraphSDKRuntimeContext();
|
|
801
|
+
const effective = {
|
|
802
|
+
...options.host === void 0 ? current.host === void 0 ? {} : { host: current.host } : { host: options.host },
|
|
803
|
+
...options.stateDir === void 0 ? current.stateDir === void 0 ? {} : { stateDir: current.stateDir } : { stateDir: options.stateDir }
|
|
804
|
+
};
|
|
805
|
+
assertWikiGraphSDKHostOptions(effective);
|
|
806
|
+
prepareWikiGraphSDKHost(effective.host);
|
|
807
|
+
const runWithContext = async () => await withWikiGraphSDKRuntimeContext(
|
|
808
|
+
{
|
|
809
|
+
...current,
|
|
810
|
+
...effective.host === void 0 ? {} : { host: effective.host },
|
|
811
|
+
...effective.stateDir === void 0 ? {} : { stateDir: effective.stateDir }
|
|
812
|
+
},
|
|
813
|
+
operation
|
|
814
|
+
);
|
|
815
|
+
if (effective.host?.storage !== void 0) {
|
|
816
|
+
return await (0, import_platform2.withWikiGraphStorage)(effective.host.storage, runWithContext);
|
|
817
|
+
}
|
|
818
|
+
return await withNodeWikiGraphStorage(
|
|
819
|
+
effective.host?.stateDir ?? effective.stateDir,
|
|
820
|
+
runWithContext
|
|
821
|
+
);
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
// src/archive/target.ts
|
|
825
|
+
var import_promises2 = require("fs/promises");
|
|
826
|
+
var import_path2 = require("path");
|
|
827
|
+
var import_wiki_graph_core = require("wiki-graph-core");
|
|
828
|
+
|
|
777
829
|
// src/runtime-path.ts
|
|
830
|
+
var import_os = require("os");
|
|
831
|
+
var import_path = require("path");
|
|
778
832
|
function resolveWikiGraphRuntimePath(path) {
|
|
779
833
|
const context = getWikiGraphSDKRuntimeContext();
|
|
780
834
|
const environmentHome = context.env.HOME?.trim();
|
|
@@ -967,9 +1021,11 @@ async function writeWikiGraphArchiveLocation(location, operation, options = {})
|
|
|
967
1021
|
// src/worker.ts
|
|
968
1022
|
var import_worker2 = require("wiki-graph-core/worker");
|
|
969
1023
|
async function extractWikiGraphJobSnapshots(options) {
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
1024
|
+
return await withWikiGraphSDKHost(
|
|
1025
|
+
{
|
|
1026
|
+
...options.host === void 0 ? {} : { host: options.host },
|
|
1027
|
+
...options.stateDir === void 0 ? {} : { stateDir: options.stateDir }
|
|
1028
|
+
},
|
|
973
1029
|
async () => await new import_wiki_graph_core3.WikiGraphArchiveFile(
|
|
974
1030
|
new NodeFile(options.wikgPath)
|
|
975
1031
|
).readDocument(async (document) => {
|
|
@@ -997,39 +1053,46 @@ async function extractWikiGraphJobSnapshots(options) {
|
|
|
997
1053
|
);
|
|
998
1054
|
}
|
|
999
1055
|
async function applyWikiGraphJobArtifacts(options) {
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
)
|
|
1012
|
-
|
|
1013
|
-
document
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1056
|
+
return await withWikiGraphSDKHost(
|
|
1057
|
+
{
|
|
1058
|
+
...options.host === void 0 ? {} : { host: options.host },
|
|
1059
|
+
...options.stateDir === void 0 ? {} : { stateDir: options.stateDir }
|
|
1060
|
+
},
|
|
1061
|
+
async () => {
|
|
1062
|
+
const location = await resolveWikiGraphArchiveLocation(options.archive);
|
|
1063
|
+
let applied = 0;
|
|
1064
|
+
await writeWikiGraphArchiveLocation(
|
|
1065
|
+
location,
|
|
1066
|
+
async (document) => {
|
|
1067
|
+
for await (const artifact of options.artifacts) {
|
|
1068
|
+
options.signal?.throwIfAborted();
|
|
1069
|
+
const revision = await document.serials.getRevision(
|
|
1070
|
+
artifact.chapterId
|
|
1071
|
+
);
|
|
1072
|
+
await (0, import_worker.applyChapterJobArtifactFile)(
|
|
1073
|
+
document,
|
|
1074
|
+
artifact.chapterId,
|
|
1075
|
+
artifact.kind,
|
|
1076
|
+
revision,
|
|
1077
|
+
new NodeFile(artifact.artifactPath)
|
|
1078
|
+
);
|
|
1079
|
+
applied += 1;
|
|
1080
|
+
}
|
|
1081
|
+
},
|
|
1082
|
+
{ invalidateContinuationCursors: true }
|
|
1083
|
+
);
|
|
1084
|
+
options.signal?.throwIfAborted();
|
|
1085
|
+
return { applied };
|
|
1086
|
+
}
|
|
1087
|
+
);
|
|
1027
1088
|
}
|
|
1028
1089
|
async function runBuildJobWorker(options) {
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1090
|
+
const { host, stateDir, ...coreOptions } = options;
|
|
1091
|
+
await withWikiGraphSDKHost(
|
|
1092
|
+
{
|
|
1093
|
+
...host === void 0 ? {} : { host },
|
|
1094
|
+
...stateDir === void 0 ? {} : { stateDir }
|
|
1095
|
+
},
|
|
1033
1096
|
async () => await (0, import_worker.runBuildJobWorker)(coreOptions)
|
|
1034
1097
|
);
|
|
1035
1098
|
}
|
package/dist/worker.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/worker.ts","../src/node-platform.ts","../src/archive/target.ts","../src/runtime-path.ts","../src/runtime-context.ts","../src/archive/write.ts"],"sourcesContent":["import {\n applyChapterJobArtifactFile,\n runBuildJobWorker as runCoreBuildJobWorker,\n writeChapterJobInputFile,\n type ChapterJobInputOptions,\n type BuildJobWorkerOptions as CoreBuildJobWorkerOptions,\n} from \"wiki-graph-core/worker\";\nimport {\n resolveChapterPathReadonly,\n WikiGraphArchiveFile,\n} from \"wiki-graph-core\";\nimport type { ChapterJobKind } from \"wiki-graph-job\";\n\nimport {\n ensureNodeWikiGraphPlatform,\n NodeFile,\n installNodeWikiGraphPlatform,\n withNodeWikiGraphStorage,\n} from \"./node-platform.js\";\nimport {\n resolveWikiGraphArchiveLocation,\n type WikiGraphArchiveTarget,\n} from \"./archive/target.js\";\nimport { writeWikiGraphArchiveLocation } from \"./archive/write.js\";\n\nexport {\n applyChapterJobArtifactFile,\n createLocalChapterJobFileExecutor,\n writeChapterJobInputFile,\n} from \"wiki-graph-core/worker\";\nexport type {\n BuildJob,\n BuildJobExecutionContext,\n BuildJobProgressReporter,\n BuildJobWorkerOptions,\n ChapterJobInputOptions,\n LocalChapterJobFileExecutorOptions,\n} from \"wiki-graph-core/worker\";\nexport type { ChapterJobFileExecutor, ChapterJobKind } from \"wiki-graph-job\";\n\nexport interface WikiGraphJobArtifactInput {\n readonly artifactPath: string;\n readonly chapterId: number;\n readonly kind: ChapterJobKind;\n}\n\nexport interface WikiGraphJobSnapshotInput {\n readonly chapterPath: string;\n readonly kind: ChapterJobKind;\n readonly options?: ChapterJobInputOptions;\n readonly outputPath: string;\n}\n\nexport interface WikiGraphJobSnapshotResult extends WikiGraphJobSnapshotInput {\n readonly chapterId: number;\n readonly revision: number;\n}\n\nexport interface ExtractWikiGraphJobSnapshotsOptions {\n readonly onSnapshot?: (\n snapshot: WikiGraphJobSnapshotResult,\n ) => void | Promise<void>;\n readonly requests: readonly WikiGraphJobSnapshotInput[];\n readonly signal?: AbortSignal;\n readonly stateDir: string;\n readonly wikgPath: string;\n}\n\nexport async function extractWikiGraphJobSnapshots(\n options: ExtractWikiGraphJobSnapshotsOptions,\n): Promise<readonly WikiGraphJobSnapshotResult[]> {\n ensureNodeWikiGraphPlatform();\n return await withNodeWikiGraphStorage(\n options.stateDir,\n async () =>\n await new WikiGraphArchiveFile(\n new NodeFile(options.wikgPath),\n ).readDocument(async (document) => {\n const results: WikiGraphJobSnapshotResult[] = [];\n for (const request of options.requests) {\n options.signal?.throwIfAborted();\n const chapterId = await resolveChapterPathReadonly(\n document,\n request.chapterPath,\n );\n const revision = await writeChapterJobInputFile(\n document,\n chapterId,\n request.kind,\n new NodeFile(request.outputPath),\n request.options,\n );\n const result = { ...request, chapterId, revision };\n results.push(result);\n await options.onSnapshot?.(result);\n }\n options.signal?.throwIfAborted();\n return results;\n }),\n );\n}\n\nexport interface ApplyWikiGraphJobArtifactsOptions {\n readonly archive: WikiGraphArchiveTarget;\n readonly artifacts: AsyncIterable<WikiGraphJobArtifactInput>;\n readonly signal?: AbortSignal;\n readonly stateDir: string;\n}\n\nexport async function applyWikiGraphJobArtifacts(\n options: ApplyWikiGraphJobArtifactsOptions,\n): Promise<{ readonly applied: number }> {\n ensureNodeWikiGraphPlatform();\n return await withNodeWikiGraphStorage(options.stateDir, async () => {\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n let applied = 0;\n await writeWikiGraphArchiveLocation(\n location,\n async (document) => {\n for await (const artifact of options.artifacts) {\n options.signal?.throwIfAborted();\n const revision = await document.serials.getRevision(\n artifact.chapterId,\n );\n await applyChapterJobArtifactFile(\n document,\n artifact.chapterId,\n artifact.kind,\n revision,\n new NodeFile(artifact.artifactPath),\n );\n applied += 1;\n }\n },\n { invalidateContinuationCursors: true },\n );\n options.signal?.throwIfAborted();\n return { applied };\n });\n}\n\nexport interface WikiGraphBuildJobWorkerOptions extends CoreBuildJobWorkerOptions {\n /** Wiki Graph state root. Defaults to `~/.wikigraph`. */\n readonly stateDir?: string;\n}\n\n/** Run the persistent build worker with invocation-scoped Node storage. */\nexport async function runBuildJobWorker(\n options: WikiGraphBuildJobWorkerOptions,\n): Promise<void> {\n installNodeWikiGraphPlatform();\n const { stateDir, ...coreOptions } = options;\n await withNodeWikiGraphStorage(\n stateDir,\n async () => await runCoreBuildJobWorker(coreOptions),\n );\n}\n","/* eslint-disable no-restricted-syntax, @typescript-eslint/parameter-properties */\nimport * as asyncHooks from \"node:async_hooks\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as pathModule from \"node:path\";\nimport * as process from \"node:process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as sqlite3 from \"sqlite3\";\nimport * as yauzl from \"yauzl\";\nimport * as yazl from \"yazl\";\nimport { Environment, Loader, type LoaderSource } from \"nunjucks\";\n\nconst nodeProcess =\n (process as unknown as { default?: typeof process }).default ?? process;\nconst nodeSqlite3 =\n (sqlite3 as unknown as { default?: typeof sqlite3 }).default ?? sqlite3;\n\nimport {\n getWikiGraphStorage,\n installWikiGraphPlatform,\n installWikiGraphStorage,\n withWikiGraphStorage,\n type Directory,\n type File,\n type FileReader,\n type ReadonlyFile,\n type FileWriter,\n type HostDatabaseConnection,\n type HostDatabaseOpenOptions,\n type HostDatabaseRow,\n type HostDatabaseValue,\n type HostZipWriteEntry,\n type HostZipReader,\n type WikiGraphPlatform,\n type WikiGraphStorage,\n normalizeTemplateName,\n} from \"wiki-graph-core/platform\";\n\n/** Stable across independently bundled SDK entry points. */\nconst NODE_RESOURCE_KIND = Symbol.for(\"wiki-graph-sdk.node-resource.v1\");\n\n/** Install the Node implementation used by the CLI and its workers. */\nexport class NodeFile implements File {\n public readonly kind = \"file\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"file\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(\n public readonly path: string,\n name = pathModule.basename(path),\n ) {\n this.identity = encodeNodeResourceIdentity(\"file\", path);\n this.name = name;\n }\n\n public async openReader(): Promise<FileReader> {\n const handle = await fsPromises.open(this.path, \"r\");\n let closed = false;\n try {\n const stats = await handle.stat();\n if (!stats.isFile())\n throw new Error(\"File reader requires a regular file\");\n const { size } = stats;\n return {\n size,\n close: async () => {\n if (!closed) await handle.close();\n closed = true;\n },\n read: async (offset, length) => {\n if (closed) throw new Error(\"Cannot read from a closed FileReader\");\n assertFileRange(offset, length, size);\n const buffer = Buffer.allocUnsafe(length);\n let bytesRead = 0;\n while (bytesRead < length) {\n const result = await handle.read(\n buffer,\n bytesRead,\n length - bytesRead,\n offset + bytesRead,\n );\n if (result.bytesRead === 0) {\n throw new Error(\"File changed while reading its byte range\");\n }\n bytesRead += result.bytesRead;\n }\n return new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\n },\n };\n } catch (error) {\n await handle.close();\n throw error;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async openWriter(): Promise<FileWriter> {\n await fsPromises.mkdir(pathModule.dirname(this.path), { recursive: true });\n const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;\n const handle = await fsPromises.open(temporary, \"wx\");\n let closed = false;\n return {\n write: async (data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n await writeNodeFileHandle(handle, data);\n },\n writeAt: async (offset, data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n assertFileOffset(offset);\n await writeNodeFileHandle(handle, data, offset);\n },\n commit: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rename(temporary, this.path);\n }\n closed = true;\n },\n abort: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rm(temporary, { force: true });\n }\n closed = true;\n },\n };\n }\n}\n\n/** @internal Completes writes even when the Node file handle reports a short write. */\nexport async function writeNodeFileHandle(\n handle: Pick<fsPromises.FileHandle, \"write\">,\n data: Uint8Array | string,\n position?: number,\n): Promise<void> {\n const buffer = Buffer.from(data);\n let written = 0;\n while (written < buffer.byteLength) {\n const result = await handle.write(\n buffer,\n written,\n buffer.byteLength - written,\n position === undefined ? null : position + written,\n );\n if (result.bytesWritten === 0) {\n throw new Error(\"File writer made no progress\");\n }\n written += result.bytesWritten;\n }\n}\n\nfunction assertFileRange(offset: number, length: number, size: number): void {\n assertFileOffset(offset);\n if (!Number.isSafeInteger(length) || length < 0) {\n throw new RangeError(\n \"File read length must be a non-negative safe integer\",\n );\n }\n if (offset > size || length > size - offset) {\n throw new RangeError(\"File read range exceeds the file size\");\n }\n}\n\nfunction assertFileOffset(offset: number): void {\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new RangeError(\"File offset must be a non-negative safe integer\");\n }\n}\n\nexport class NodeDirectory implements Directory {\n public readonly kind = \"directory\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"directory\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(public readonly path: string) {\n this.identity = encodeNodeResourceIdentity(\"directory\", path);\n this.name = pathModule.basename(path);\n }\n\n public async getFile(name: string): Promise<File | undefined> {\n assertChildName(name);\n const file = new NodeFile(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(file.path)).isFile() ? file : undefined;\n } catch {\n return undefined;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async getDirectory(name: string): Promise<Directory | undefined> {\n assertChildName(name);\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(directory.path)).isDirectory()\n ? directory\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n public async list(): Promise<ReadonlyArray<File | Directory>> {\n const entries = await fsPromises.readdir(this.path, {\n withFileTypes: true,\n });\n return entries.map((entry) =>\n entry.isDirectory()\n ? new NodeDirectory(pathModule.join(this.path, entry.name))\n : new NodeFile(pathModule.join(this.path, entry.name), entry.name),\n );\n }\n\n public async createFile(name: string): Promise<File> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const file = new NodeFile(pathModule.join(this.path, name));\n await fsPromises.writeFile(file.path, \"\", { flag: \"wx\" });\n return file;\n }\n\n public async createDirectory(name: string): Promise<Directory> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n await fsPromises.mkdir(directory.path);\n return directory;\n }\n\n public async remove(\n name: string,\n options?: { readonly recursive?: boolean },\n ): Promise<void> {\n assertChildName(name);\n await fsPromises.rm(pathModule.join(this.path, name), {\n force: true,\n recursive: options?.recursive === true,\n });\n }\n}\n\nfunction encodeNodeResourceIdentity(\n kind: \"directory\" | \"file\",\n path: string,\n): string {\n return `node-${kind}:${Buffer.from(pathModule.resolve(path), \"utf8\").toString(\"base64url\")}`;\n}\n\nfunction decodeNodeResourceIdentity(\n identity: string,\n kind: \"directory\" | \"file\",\n): string | undefined {\n const prefix = `node-${kind}:`;\n if (!identity.startsWith(prefix)) {\n // State created before opaque resource identities stored native paths.\n return pathModule.isAbsolute(identity) ? identity : undefined;\n }\n try {\n return Buffer.from(identity.slice(prefix.length), \"base64url\").toString(\n \"utf8\",\n );\n } catch {\n return undefined;\n }\n}\n\nexport function getNodeResourcePath(resource: File | Directory): string {\n const brandedPath = getBrandedNodeResourcePath(resource, resource.kind);\n if (brandedPath !== undefined) return brandedPath;\n if (\n typeof resource === \"object\" &&\n resource !== null &&\n \"path\" in resource &&\n typeof resource.path === \"string\"\n ) {\n return resource.path;\n }\n throw new TypeError(\"Expected a Node File or Directory resource\");\n}\n\nfunction assertChildName(name: string): void {\n if (\n name.length === 0 ||\n name === \".\" ||\n name === \"..\" ||\n pathModule.isAbsolute(name) ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\")\n ) {\n throw new TypeError(`Directory child must be a relative name: ${name}`);\n }\n}\n\nclass NodeDatabaseConnection implements HostDatabaseConnection {\n public constructor(private readonly database: sqlite3.Database) {}\n\n public async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.close((error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async execute(sql: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.exec(sql, (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async queryAll(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<readonly HostDatabaseRow[]> {\n return await new Promise((resolve, reject) => {\n this.database.all(sql, [...params], (error, rows: HostDatabaseRow[]) => {\n if (error) reject(error);\n else resolve(rows);\n });\n });\n }\n\n public async queryOne(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<HostDatabaseRow | undefined> {\n return await new Promise((resolve, reject) => {\n this.database.get(sql, [...params], (error, row: HostDatabaseRow) => {\n if (error) reject(error);\n else resolve(row);\n });\n });\n }\n\n public async run(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.run(sql, [...params], (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n}\n\nasync function openNodeDatabase(\n file: ReadonlyFile,\n options: HostDatabaseOpenOptions,\n): Promise<NodeDatabaseConnection> {\n const flags =\n (options.mode === \"readonly\"\n ? nodeSqlite3.OPEN_READONLY\n : nodeSqlite3.OPEN_READWRITE |\n (options.create ? nodeSqlite3.OPEN_CREATE : 0)) |\n nodeSqlite3.OPEN_FULLMUTEX;\n return new NodeDatabaseConnection(await openNativeNodeDatabase(file, flags));\n}\n\nasync function openNativeNodeDatabase(\n file: ReadonlyFile,\n flags: number,\n): Promise<sqlite3.Database> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node database adapter requires a NodeFile\");\n }\n return await new Promise((resolve, reject) => {\n const database = new nodeSqlite3.Database(path, flags, (error) => {\n if (error) reject(error);\n else resolve(database);\n });\n });\n}\n\nasync function openNodeZip(file: ReadonlyFile): Promise<HostZipReader> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node ZIP adapter requires a NodeFile\");\n }\n const zipFile = await new Promise<yauzl.ZipFile>((resolve, reject) => {\n yauzl.open(\n path,\n { autoClose: false, lazyEntries: true },\n (error, opened) => {\n if (error || opened === undefined)\n reject(error ?? new Error(\"Cannot open ZIP\"));\n else resolve(opened);\n },\n );\n });\n\n const entries = await new Promise<Map<string, yauzl.Entry>>(\n (resolve, reject) => {\n const discovered = new Map<string, yauzl.Entry>();\n const rejectAndClose = (error: unknown) => {\n zipFile.close();\n reject(\n error instanceof Error\n ? error\n : new Error(\"Cannot scan ZIP central directory\"),\n );\n };\n const resolveEntries = () => {\n zipFile.off(\"error\", rejectAndClose);\n resolve(discovered);\n };\n zipFile.on(\"entry\", (entry: yauzl.Entry) => {\n if (!entry.fileName.endsWith(\"/\")) {\n discovered.set(entry.fileName, entry);\n }\n zipFile.readEntry();\n });\n zipFile.once(\"error\", rejectAndClose);\n zipFile.once(\"end\", resolveEntries);\n zipFile.readEntry();\n },\n );\n\n let closed = false;\n return {\n close: () => {\n if (!closed) zipFile.close();\n closed = true;\n return Promise.resolve();\n },\n copyEntry: async (name, target) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return false;\n await copyNodeZipEntry(zipFile, entry, target);\n return true;\n },\n getEntrySize: (name) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n return Promise.resolve(entries.get(name)?.uncompressedSize);\n },\n listEntries: () => Promise.resolve([...entries.keys()]),\n readEntryRange: async (name, offset, length) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return undefined;\n return await readNodeZipEntryRange(zipFile, entry, offset, length);\n },\n readEntry: async (name) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return undefined;\n return await readNodeZipEntry(zipFile, entry);\n },\n };\n}\n\nasync function copyNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n target: File,\n): Promise<void> {\n const writer = await target.openWriter();\n try {\n const stream = await openNodeZipEntryStream(zipFile, entry);\n await writeNodeStream(stream, writer);\n await writer.commit();\n } catch (error) {\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function readNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n): Promise<Uint8Array> {\n return await collectNodeStream(await openNodeZipEntryStream(zipFile, entry));\n}\n\nasync function readNodeZipEntryRange(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n offset: number,\n length: number,\n): Promise<Uint8Array> {\n assertFileRange(offset, length, entry.uncompressedSize);\n if (length === 0) return new Uint8Array();\n if (entry.compressionMethod !== 0) {\n const content = await collectDecodedNodeStreamRange(\n await openNodeZipEntryStream(zipFile, entry),\n offset,\n length,\n );\n return new Uint8Array(\n content.buffer,\n content.byteOffset,\n content.byteLength,\n );\n }\n const content = await collectNodeStream(\n await openNodeZipEntryStream(zipFile, entry, {\n decompress: null,\n decrypt: null,\n end: offset + length,\n start: offset,\n }),\n );\n return new Uint8Array(content.buffer, content.byteOffset, content.byteLength);\n}\n\nasync function collectDecodedNodeStreamRange(\n input: NodeJS.ReadableStream,\n offset: number,\n length: number,\n): Promise<Buffer> {\n const chunks: Buffer[] = [];\n const end = offset + length;\n let position = 0;\n let collected = 0;\n for await (const value of input) {\n const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);\n const chunkEnd = position + chunk.byteLength;\n if (chunkEnd > offset && position < end) {\n const selected = chunk.subarray(\n Math.max(0, offset - position),\n Math.min(chunk.byteLength, end - position),\n );\n chunks.push(selected);\n collected += selected.byteLength;\n }\n position = chunkEnd;\n if (position >= end) break;\n }\n if (collected !== length) {\n throw new Error(\"ZIP entry changed while reading its byte range\");\n }\n return Buffer.concat(chunks, collected);\n}\n\nasync function openNodeZipEntryStream(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n options?: yauzl.ZipFileOptions,\n): Promise<NodeJS.ReadableStream> {\n return await new Promise<NodeJS.ReadableStream>((resolve, reject) => {\n const callback = (error: Error | null, opened: Readable) => {\n if (error || opened === undefined) {\n reject(error ?? new Error(`Cannot read ZIP entry: ${entry.fileName}`));\n } else {\n resolve(opened);\n }\n };\n if (options === undefined) zipFile.openReadStream(entry, callback);\n else zipFile.openReadStream(entry, options, callback);\n });\n}\n\nasync function writeNodeZip(\n file: File,\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Promise<void> {\n const zipFile = new yazl.ZipFile();\n const writer = await file.openWriter();\n const outputStream = zipFile.outputStream as Readable;\n const outputDone = writeNodeStream(outputStream, writer);\n const entryState = { cancelled: false, complete: false };\n let iterator:\n | Iterator<HostZipWriteEntry>\n | AsyncIterator<HostZipWriteEntry>\n | undefined;\n\n try {\n iterator = getNodeZipEntryIterator(entries);\n const entriesDone = addNodeZipEntries(zipFile, iterator, entryState);\n await Promise.race([entriesDone, outputDone]);\n if (!entryState.complete) {\n throw new Error(\"ZIP output ended before entry production completed\");\n }\n zipFile.end();\n await outputDone;\n await writer.commit();\n } catch (error) {\n entryState.cancelled = true;\n if (!entryState.complete && iterator !== undefined) {\n closeNodeZipEntryIterator(iterator);\n }\n if (!outputStream.destroyed) {\n outputStream.destroy(\n error instanceof Error ? error : new Error(\"Cannot write ZIP archive\"),\n );\n }\n await outputDone.catch(() => undefined);\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function addNodeZipEntries(\n zipFile: yazl.ZipFile,\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n state: { cancelled: boolean; complete: boolean },\n): Promise<void> {\n while (!state.cancelled) {\n const result = await iterator.next();\n if (state.cancelled) return;\n if (result.done) {\n state.complete = true;\n return;\n }\n if (\"file\" in result.value) {\n zipFile.addReadStream(\n createNodeFileReadStream(result.value.file),\n result.value.name,\n { compress: false },\n );\n } else if (\"data\" in result.value) {\n zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {\n compress: false,\n });\n } else {\n zipFile.addReadStream(\n createNodeRangeReadStream(result.value),\n result.value.name,\n { compress: false, size: result.value.size },\n );\n }\n }\n}\n\nfunction createNodeFileReadStream(file: ReadonlyFile): Readable {\n return Readable.from(\n (async function* () {\n const reader = await file.openReader();\n try {\n for (let offset = 0; offset < reader.size; ) {\n const chunk = await reader.read(\n offset,\n Math.min(64 * 1024, reader.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n } finally {\n await reader.close();\n }\n })(),\n );\n}\n\nfunction getBrandedNodeResourcePath(\n resource: unknown,\n kind: \"directory\" | \"file\",\n): string | undefined {\n if (typeof resource !== \"object\" || resource === null) return undefined;\n const candidate = resource as {\n readonly [NODE_RESOURCE_KIND]?: unknown;\n readonly path?: unknown;\n };\n return candidate[NODE_RESOURCE_KIND] === kind &&\n typeof candidate.path === \"string\"\n ? candidate.path\n : undefined;\n}\n\nfunction createNodeRangeReadStream(\n entry: Extract<HostZipWriteEntry, { readonly size: number }>,\n): Readable {\n return Readable.from(\n (async function* () {\n for (let offset = 0; offset < entry.size; ) {\n const chunk = await entry.read(\n offset,\n Math.min(64 * 1024, entry.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n })(),\n );\n}\n\nfunction getNodeZipEntryIterator(\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry> {\n const asyncIterator = (entries as AsyncIterable<HostZipWriteEntry>)[\n Symbol.asyncIterator\n ];\n return asyncIterator === undefined\n ? (entries as Iterable<HostZipWriteEntry>)[Symbol.iterator]()\n : asyncIterator.call(entries);\n}\n\nfunction closeNodeZipEntryIterator(\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n): void {\n if (iterator.return === undefined) return;\n try {\n void Promise.resolve(iterator.return()).catch(() => undefined);\n } catch {\n // Preserve the failure that caused iteration to stop.\n }\n}\n\nasync function writeNodeStream(\n input: NodeJS.ReadableStream,\n writer: FileWriter,\n): Promise<void> {\n await pipeline(\n input,\n new Writable({\n write: (chunk: Buffer, _encoding, callback) => {\n void writer.write(chunk).then(\n () => callback(),\n (error: unknown) =>\n callback(\n error instanceof Error\n ? error\n : new Error(\"Cannot stream ZIP archive\"),\n ),\n );\n },\n }),\n );\n}\n\nasync function collectNodeStream(\n input: NodeJS.ReadableStream,\n): Promise<Buffer> {\n return await new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n input.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n input.once(\"error\", reject);\n input.once(\"end\", () => resolve(Buffer.concat(chunks)));\n });\n}\n\nexport const nodeWikiGraphPlatform: WikiGraphPlatform = {\n asyncContext: {\n create: <T>() => new asyncHooks.AsyncLocalStorage<T>(),\n },\n database: { open: openNodeDatabase },\n lifecycle: {\n instanceId: `node-process:${nodeProcess.pid}`,\n isInstanceAlive: (instanceId) => {\n const match = /^node-process:(\\d+)$/u.exec(instanceId);\n if (match === null) return Promise.resolve(undefined);\n try {\n nodeProcess.kill(Number(match[1]), 0);\n return Promise.resolve(true);\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ESRCH\"\n ) {\n return Promise.resolve(false);\n }\n return Promise.resolve(true);\n }\n },\n },\n resources: {\n getDirectory: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n getFile: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"file\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeFile(path),\n );\n },\n resolveLegacyDirectory: (reference) => {\n const path = decodeNodeResourceIdentity(reference, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n },\n templates: {\n createEnvironment: (options) =>\n new Environment(new NodeTemplateLoader(), options),\n },\n zip: {\n open: openNodeZip,\n write: writeNodeZip,\n },\n};\n\nclass NodeTemplateLoader extends Loader {\n readonly #dataDirectory: string | undefined;\n\n public constructor(dataDirectory?: string) {\n super();\n this.#dataDirectory = dataDirectory;\n }\n\n public getSource(templateName: string): LoaderSource {\n const name = normalizeTemplateName(templateName);\n const filePath = pathModule.join(\n this.#dataDirectory ?? resolveNodeDataDirectory(),\n name,\n );\n return {\n noCache: false,\n path: name,\n src: fs.readFileSync(filePath, \"utf8\"),\n };\n }\n}\n\nexport function createNodeTemplateEnvironment(\n dataDirectory: string,\n options: {\n readonly autoescape?: boolean;\n readonly trimBlocks?: boolean;\n } = {},\n): Environment {\n return new Environment(new NodeTemplateLoader(dataDirectory), {\n autoescape: options.autoescape ?? true,\n trimBlocks: options.trimBlocks ?? true,\n });\n}\n\nfunction resolveNodeDataDirectory(): string {\n const injected = (globalThis as { __WIKIGRAPH_DATA_DIR__?: unknown })\n .__WIKIGRAPH_DATA_DIR__;\n if (typeof injected === \"string\" && injected !== \"\") return injected;\n let directory = nodeProcess.cwd();\n while (true) {\n for (const candidate of [\n pathModule.join(directory, \"data\"),\n pathModule.join(directory, \"packages\", \"core\", \"data\"),\n ]) {\n try {\n if (fs.statSync(candidate).isDirectory()) return candidate;\n } catch {\n // Keep looking toward the filesystem root.\n }\n }\n const parent = pathModule.dirname(directory);\n if (parent === directory)\n throw new Error(\"Could not locate data directory\");\n directory = parent;\n }\n}\n\nexport function createNodeWikiGraphStorage(\n stateRoot = pathModule.join(os.homedir(), \".wikigraph\"),\n): WikiGraphStorage {\n return {\n library: new NodeDirectory(stateRoot),\n documentStore: new NodeDirectory(pathModule.join(stateRoot, \"documents\")),\n };\n}\n\nexport function installNodeWikiGraphPlatform(stateRoot?: string): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n installWikiGraphStorage(createNodeWikiGraphStorage(stateRoot));\n}\n\nexport function ensureNodeWikiGraphPlatform(): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n try {\n getWikiGraphStorage();\n } catch {\n installWikiGraphStorage(createNodeWikiGraphStorage());\n }\n}\n\nexport async function withNodeWikiGraphStorage<T>(\n stateRoot: string | undefined,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await withWikiGraphStorage(\n stateRoot === undefined ? undefined : createNodeWikiGraphStorage(stateRoot),\n operation,\n );\n}\n","import { realpath, stat } from \"fs/promises\";\nimport { basename, dirname, isAbsolute, join, relative, resolve } from \"path\";\n\nimport {\n formatLocatedWikiGraphUri,\n formatWikiGraphLibraryUri,\n listWikiGraphLibraries,\n listWikiGraphLibraryArchives,\n parseLocatedWikiGraphUri,\n parseWikiGraphLibraryUri,\n resolveWikiGraphLibrary,\n resolveWikiGraphLibraryArchiveFile,\n type ParsedWikiGraphLibraryUri,\n type QueryIndexScope,\n type File,\n} from \"wiki-graph-core\";\n\nimport { getNodeResourcePath, NodeFile } from \"../node-platform.js\";\nimport { resolveWikiGraphRuntimePath } from \"../runtime-path.js\";\n\nexport type WikiGraphArchiveTarget =\n | {\n readonly kind: \"standalone\";\n readonly objectUri?: string;\n readonly path: string;\n }\n | {\n readonly kind: \"library\";\n readonly uri: string;\n };\n\nexport interface WikiGraphArchiveLocation {\n readonly archiveFile: File;\n readonly archiveKey: string;\n /** Logical archive locator. Never contains a managed archive's physical path. */\n readonly archivePath: string;\n readonly indexScope: QueryIndexScope;\n readonly libraryArchiveTarget?: ParsedWikiGraphLibraryUri;\n readonly locatedUri: string;\n readonly publicArchiveUri?: string;\n readonly target: WikiGraphArchiveTarget;\n}\n\nexport class WikiGraphArchiveOwnershipError extends Error {\n public readonly code = \"WIKI_GRAPH_ARCHIVE_OWNERSHIP_MISMATCH\";\n\n public constructor(message: string) {\n super(message);\n this.name = \"WikiGraphArchiveOwnershipError\";\n }\n}\n\nexport async function resolveWikiGraphArchiveLocation(\n target: WikiGraphArchiveTarget,\n): Promise<WikiGraphArchiveLocation> {\n if (target.kind === \"standalone\") {\n return await resolveStandaloneLocation(target);\n }\n return await resolveLibraryLocation(target);\n}\n\nexport async function assertStandaloneWikiGraphArchivePath(\n inputPath: string,\n): Promise<string> {\n const path = resolveWikiGraphRuntimePath(inputPath);\n const candidate = await canonicalPath(path);\n const candidateIdentity = await readFileIdentity(path);\n const libraries = await listWikiGraphLibraries();\n const matches = await findMatchingMembers(\n libraries,\n candidate,\n candidateIdentity,\n );\n if (matches.length > 0) {\n const match = requireUnambiguousManagedMatch(path, matches);\n throw new WikiGraphArchiveOwnershipError(\n `Standalone archive path belongs to registered library ${formatWikiGraphLibraryUri(\n match.library.isDefault ? undefined : match.library.publicId,\n )}: ${path}. Use the library UUID URI ${match.archive.uri} instead.`,\n );\n }\n for (const library of libraries) {\n const rootPath = getNodeResourcePath(library.folder);\n const root = await canonicalPath(rootPath);\n if (!isWithin(root, candidate)) continue;\n throw new WikiGraphArchiveOwnershipError(\n `Standalone archive path belongs to registered library ${formatWikiGraphLibraryUri(\n library.isDefault ? undefined : library.publicId,\n )}: ${path}. Scan the library, then address the archive by its library UUID URI.`,\n );\n }\n return path;\n}\n\nexport function archiveTargetFromLogicalLocator(\n locator: string,\n objectUri?: string,\n): WikiGraphArchiveTarget {\n if (locator.startsWith(\"wikg://lib/\")) {\n return { kind: \"library\", uri: withObjectUri(locator, objectUri) };\n }\n return {\n kind: \"standalone\",\n path: locator,\n ...(objectUri === undefined ? {} : { objectUri }),\n };\n}\n\nexport async function resolveWikiGraphArchiveTarget(\n file: File,\n): Promise<WikiGraphArchiveTarget> {\n const path = getNodeResourcePath(file);\n const candidate = await canonicalPath(path);\n const candidateIdentity = await readFileIdentity(path);\n const matches = await findMatchingMembers(\n await listWikiGraphLibraries(),\n candidate,\n candidateIdentity,\n );\n if (matches.length > 0) {\n const match = requireUnambiguousManagedMatch(path, matches);\n return { kind: \"library\", uri: match.archive.uri };\n }\n return { kind: \"standalone\", path: getNodeResourcePath(file) };\n}\n\nasync function resolveStandaloneLocation(\n target: Extract<WikiGraphArchiveTarget, { readonly kind: \"standalone\" }>,\n): Promise<WikiGraphArchiveLocation> {\n if (target.path.startsWith(\"wikg://lib/\")) {\n throw new WikiGraphArchiveOwnershipError(\n `A library archive URI cannot be used as a standalone path: ${target.path}`,\n );\n }\n const path = await assertStandaloneWikiGraphArchivePath(target.path);\n const normalized: WikiGraphArchiveTarget = {\n kind: \"standalone\",\n path,\n ...(target.objectUri === undefined ? {} : { objectUri: target.objectUri }),\n };\n return {\n archiveFile: new NodeFile(path),\n archiveKey: path,\n archivePath: path,\n indexScope: { archiveKey: path, archivePath: path, kind: \"archive-index\" },\n locatedUri: formatLocatedWikiGraphUri(path, target.objectUri),\n target: normalized,\n };\n}\n\nasync function resolveLibraryLocation(\n target: Extract<WikiGraphArchiveTarget, { readonly kind: \"library\" }>,\n): Promise<WikiGraphArchiveLocation> {\n const parsedLocated = parseLocatedWikiGraphUri(target.uri);\n const archiveUri = parsedLocated.archivePath ?? target.uri;\n const parsed = parseWikiGraphLibraryUri(archiveUri);\n if (parsed?.kind !== \"archive\") {\n throw new WikiGraphArchiveOwnershipError(\n `Library archive target must be a UUID archive URI: ${target.uri}`,\n );\n }\n // Resolving the library first distinguishes a missing membership database\n // from an ordinary file path and prevents path fallback.\n await resolveWikiGraphLibrary(parsed);\n const archiveFile = await resolveWikiGraphLibraryArchiveFile(archiveUri);\n const normalized: WikiGraphArchiveTarget = {\n kind: \"library\",\n uri: target.uri,\n };\n return {\n archiveFile,\n archiveKey: archiveUri,\n archivePath: archiveUri,\n indexScope: {\n archiveKey: archiveUri,\n archivePath: archiveUri,\n kind: \"archive-index\",\n },\n libraryArchiveTarget: parsed,\n locatedUri: target.uri,\n publicArchiveUri: archiveUri,\n target: normalized,\n };\n}\n\nfunction withObjectUri(archiveLocator: string, objectUri?: string): string {\n if (objectUri === undefined) return archiveLocator;\n const path = objectUri.replace(/^wikg:\\/\\//u, \"\");\n return `${archiveLocator.replace(/\\/$/u, \"\")}/${path}`;\n}\n\nasync function canonicalPath(path: string): Promise<string> {\n try {\n return await realpath(path);\n } catch {\n const absolute = resolve(path);\n const parent = dirname(absolute);\n return parent === absolute\n ? absolute\n : join(await canonicalPath(parent), basename(absolute));\n }\n}\n\nfunction isWithin(root: string, candidate: string): boolean {\n const child = relative(root, candidate);\n return child === \"\" || (!child.startsWith(\"..\") && !isAbsolute(child));\n}\n\ntype ListedLibrary = Awaited<ReturnType<typeof listWikiGraphLibraries>>[number];\ntype ListedArchive = Awaited<\n ReturnType<typeof listWikiGraphLibraryArchives>\n>[number];\n\ninterface ManagedArchiveMatch {\n readonly archive: ListedArchive;\n readonly library: ListedLibrary;\n readonly memberPath: string;\n}\n\nasync function findMatchingMembers(\n libraries: Awaited<ReturnType<typeof listWikiGraphLibraries>>,\n candidate: string,\n candidateIdentity?: string,\n): Promise<readonly ManagedArchiveMatch[]> {\n const members: ManagedArchiveMatch[] = [];\n for (const library of libraries) {\n const archives = await listWikiGraphLibraryArchives({\n isDefault: library.isDefault,\n kind: \"scope\",\n ...(library.isDefault ? {} : { publicId: library.publicId }),\n });\n for (const archive of archives) {\n if (archive.file === undefined) continue;\n members.push({\n archive,\n library,\n memberPath: getNodeResourcePath(archive.file),\n });\n }\n }\n\n const exact: ManagedArchiveMatch[] = [];\n for (const member of members) {\n if ((await canonicalPath(member.memberPath)) === candidate) {\n exact.push(member);\n }\n }\n if (exact.length > 0 || candidateIdentity === undefined) return exact;\n\n const identityMatches: ManagedArchiveMatch[] = [];\n for (const member of members) {\n if ((await readFileIdentity(member.memberPath)) === candidateIdentity) {\n identityMatches.push(member);\n }\n }\n return identityMatches;\n}\n\nfunction requireUnambiguousManagedMatch(\n path: string,\n matches: readonly ManagedArchiveMatch[],\n): ManagedArchiveMatch {\n if (matches.length === 1) return matches[0]!;\n throw new WikiGraphArchiveOwnershipError(\n `Archive file identity is ambiguous across managed archives: ${path}. Use an explicit library UUID URI (${matches\n .map((match) => match.archive.uri)\n .join(\", \")}).`,\n );\n}\n\nasync function readFileIdentity(path: string): Promise<string | undefined> {\n try {\n const value = await stat(path);\n return `${value.dev}:${value.ino}`;\n } catch {\n return undefined;\n }\n}\n","import { homedir } from \"os\";\nimport { isAbsolute, resolve } from \"path\";\n\nimport { getWikiGraphSDKRuntimeContext } from \"./runtime-context.js\";\n\nexport function resolveWikiGraphRuntimePath(path: string): string {\n const context = getWikiGraphSDKRuntimeContext();\n const environmentHome = context.env.HOME?.trim();\n const home =\n environmentHome === undefined || environmentHome === \"\"\n ? homedir()\n : environmentHome;\n if (path === \"~\") return home;\n if (path.startsWith(\"~/\")) return resolve(home, path.slice(2));\n return isAbsolute(path) ? path : resolve(context.cwd, path);\n}\n","import { AsyncLocalStorage } from \"async_hooks\";\n\nimport type { WikiGraphSDKProviders } from \"./providers.js\";\n\nexport type WikiGraphSDKEnvPolicy = \"development\" | \"production\";\n\nexport interface WikiGraphSDKRuntimeContext {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n readonly envPolicy: WikiGraphSDKEnvPolicy;\n readonly providers?: WikiGraphSDKProviders;\n readonly stateDir?: string | undefined;\n}\n\n/** Shared by independently bundled SDK entry points in the same process. */\nconst RUNTIME_CONTEXT_KEY = Symbol.for(\"wiki-graph-sdk.runtime-context.v1\");\nconst runtimeContext = getRuntimeContextStorage();\n\nfunction getRuntimeContextStorage(): AsyncLocalStorage<WikiGraphSDKRuntimeContext> {\n const runtimeGlobal = globalThis as unknown as Record<PropertyKey, unknown>;\n const existing = runtimeGlobal[RUNTIME_CONTEXT_KEY];\n if (existing !== undefined) {\n return existing as AsyncLocalStorage<WikiGraphSDKRuntimeContext>;\n }\n\n const storage = new AsyncLocalStorage<WikiGraphSDKRuntimeContext>();\n Object.defineProperty(runtimeGlobal, RUNTIME_CONTEXT_KEY, {\n configurable: false,\n enumerable: false,\n value: storage,\n writable: false,\n });\n return storage;\n}\n\nexport async function withWikiGraphSDKRuntimeContext<T>(\n context: WikiGraphSDKRuntimeContext,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await runtimeContext.run(context, operation);\n}\n\nexport function getWikiGraphSDKRuntimeContext(): WikiGraphSDKRuntimeContext {\n return (\n runtimeContext.getStore() ?? {\n cwd: process.cwd(),\n env: process.env,\n envPolicy: \"production\",\n providers: {},\n }\n );\n}\n\nexport function getWikiGraphSDKStateDir(): string | undefined {\n return getWikiGraphSDKRuntimeContext().stateDir;\n}\n\nexport function getWikiGraphSDKProviders(): WikiGraphSDKProviders {\n return getWikiGraphSDKRuntimeContext().providers ?? {};\n}\n","import {\n WikiGraphArchiveFile,\n writeWikiGraphLibraryArchive,\n type DirectoryDocument,\n type File,\n} from \"wiki-graph-core\";\n\nimport type { WikiGraphArchiveLocation } from \"./target.js\";\n\nexport interface WriteWikiGraphArchiveLocationOptions {\n readonly invalidateContinuationCursors?: boolean;\n readonly onIndexSyncError?: (error: unknown) => void;\n readonly refreshLibraryIndex?: boolean;\n readonly searchIndexWritebackPolicy?: \"archive\" | \"cache\";\n}\n\nexport async function writeWikiGraphArchiveLocation<T>(\n location: WikiGraphArchiveLocation,\n operation: (document: DirectoryDocument) => Promise<T> | T,\n options: WriteWikiGraphArchiveLocationOptions = {},\n): Promise<T> {\n const cacheOnly = options.searchIndexWritebackPolicy === \"cache\";\n const write = async (archiveFile: File = location.archiveFile) =>\n await new WikiGraphArchiveFile(archiveFile).write(operation, {\n ...(cacheOnly\n ? {}\n : { derivedStateKeys: [location.archiveKey, location.archivePath] }),\n ...(options.invalidateContinuationCursors === undefined\n ? {}\n : {\n invalidateContinuationCursors:\n options.invalidateContinuationCursors,\n }),\n ...(options.searchIndexWritebackPolicy === undefined\n ? {}\n : { searchIndexWritebackPolicy: options.searchIndexWritebackPolicy }),\n });\n\n if (\n location.libraryArchiveTarget === undefined ||\n cacheOnly ||\n options.refreshLibraryIndex === false\n ) {\n return await write();\n }\n return await writeWikiGraphLibraryArchive({\n additionalDerivedStateKeys: [location.archiveKey, location.archivePath],\n ...(options.invalidateContinuationCursors === undefined\n ? {}\n : {\n invalidateContinuationCursors: options.invalidateContinuationCursors,\n }),\n ...(options.onIndexSyncError === undefined\n ? {}\n : { onIndexSyncError: options.onIndexSyncError }),\n operation: async (archiveFile) => await write(archiveFile),\n target: location.libraryArchiveTarget,\n });\n}\n"],"mappings":"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","names":["import_wiki_graph_core","process","resolve","content","import_promises","import_path","import_wiki_graph_core","import_worker","runCoreBuildJobWorker"]}
|
|
1
|
+
{"version":3,"sources":["../src/worker.ts","../src/node-platform.ts","../src/host.ts","../src/runtime-context.ts","../src/archive/target.ts","../src/runtime-path.ts","../src/archive/write.ts"],"sourcesContent":["import {\n applyChapterJobArtifactFile,\n runBuildJobWorker as runCoreBuildJobWorker,\n writeChapterJobInputFile,\n type ChapterJobInputOptions,\n type BuildJobWorkerOptions as CoreBuildJobWorkerOptions,\n} from \"wiki-graph-core/worker\";\nimport {\n resolveChapterPathReadonly,\n WikiGraphArchiveFile,\n} from \"wiki-graph-core\";\nimport type { ChapterJobKind } from \"wiki-graph-job\";\n\nimport { NodeFile } from \"./node-platform.js\";\nimport { withWikiGraphSDKHost, type WikiGraphSDKHost } from \"./host.js\";\nimport {\n resolveWikiGraphArchiveLocation,\n type WikiGraphArchiveTarget,\n} from \"./archive/target.js\";\nimport { writeWikiGraphArchiveLocation } from \"./archive/write.js\";\n\nexport {\n applyChapterJobArtifactFile,\n createLocalChapterJobFileExecutor,\n writeChapterJobInputFile,\n} from \"wiki-graph-core/worker\";\nexport type {\n BuildJob,\n BuildJobExecutionContext,\n BuildJobProgressReporter,\n BuildJobWorkerOptions,\n ChapterJobInputOptions,\n LocalChapterJobFileExecutorOptions,\n} from \"wiki-graph-core/worker\";\nexport type { ChapterJobFileExecutor, ChapterJobKind } from \"wiki-graph-job\";\n\nexport interface WikiGraphJobArtifactInput {\n readonly artifactPath: string;\n readonly chapterId: number;\n readonly kind: ChapterJobKind;\n}\n\nexport interface WikiGraphJobSnapshotInput {\n readonly chapterPath: string;\n readonly kind: ChapterJobKind;\n readonly options?: ChapterJobInputOptions;\n readonly outputPath: string;\n}\n\nexport interface WikiGraphJobSnapshotResult extends WikiGraphJobSnapshotInput {\n readonly chapterId: number;\n readonly revision: number;\n}\n\nexport interface ExtractWikiGraphJobSnapshotsOptions {\n readonly host?: WikiGraphSDKHost;\n readonly onSnapshot?: (\n snapshot: WikiGraphJobSnapshotResult,\n ) => void | Promise<void>;\n readonly requests: readonly WikiGraphJobSnapshotInput[];\n readonly signal?: AbortSignal;\n readonly stateDir?: string;\n readonly wikgPath: string;\n}\n\nexport async function extractWikiGraphJobSnapshots(\n options: ExtractWikiGraphJobSnapshotsOptions,\n): Promise<readonly WikiGraphJobSnapshotResult[]> {\n return await withWikiGraphSDKHost(\n {\n ...(options.host === undefined ? {} : { host: options.host }),\n ...(options.stateDir === undefined ? {} : { stateDir: options.stateDir }),\n },\n async () =>\n await new WikiGraphArchiveFile(\n new NodeFile(options.wikgPath),\n ).readDocument(async (document) => {\n const results: WikiGraphJobSnapshotResult[] = [];\n for (const request of options.requests) {\n options.signal?.throwIfAborted();\n const chapterId = await resolveChapterPathReadonly(\n document,\n request.chapterPath,\n );\n const revision = await writeChapterJobInputFile(\n document,\n chapterId,\n request.kind,\n new NodeFile(request.outputPath),\n request.options,\n );\n const result = { ...request, chapterId, revision };\n results.push(result);\n await options.onSnapshot?.(result);\n }\n options.signal?.throwIfAborted();\n return results;\n }),\n );\n}\n\nexport interface ApplyWikiGraphJobArtifactsOptions {\n readonly archive: WikiGraphArchiveTarget;\n readonly artifacts: AsyncIterable<WikiGraphJobArtifactInput>;\n readonly host?: WikiGraphSDKHost;\n readonly signal?: AbortSignal;\n readonly stateDir?: string;\n}\n\nexport async function applyWikiGraphJobArtifacts(\n options: ApplyWikiGraphJobArtifactsOptions,\n): Promise<{ readonly applied: number }> {\n return await withWikiGraphSDKHost(\n {\n ...(options.host === undefined ? {} : { host: options.host }),\n ...(options.stateDir === undefined ? {} : { stateDir: options.stateDir }),\n },\n async () => {\n const location = await resolveWikiGraphArchiveLocation(options.archive);\n let applied = 0;\n await writeWikiGraphArchiveLocation(\n location,\n async (document) => {\n for await (const artifact of options.artifacts) {\n options.signal?.throwIfAborted();\n const revision = await document.serials.getRevision(\n artifact.chapterId,\n );\n await applyChapterJobArtifactFile(\n document,\n artifact.chapterId,\n artifact.kind,\n revision,\n new NodeFile(artifact.artifactPath),\n );\n applied += 1;\n }\n },\n { invalidateContinuationCursors: true },\n );\n options.signal?.throwIfAborted();\n return { applied };\n },\n );\n}\n\nexport interface WikiGraphBuildJobWorkerOptions extends CoreBuildJobWorkerOptions {\n readonly host?: WikiGraphSDKHost;\n /** Wiki Graph state root. Defaults to `~/.wikigraph`. */\n readonly stateDir?: string;\n}\n\n/** Run the persistent build worker with invocation-scoped Node storage. */\nexport async function runBuildJobWorker(\n options: WikiGraphBuildJobWorkerOptions,\n): Promise<void> {\n const { host, stateDir, ...coreOptions } = options;\n await withWikiGraphSDKHost(\n {\n ...(host === undefined ? {} : { host }),\n ...(stateDir === undefined ? {} : { stateDir }),\n },\n async () => await runCoreBuildJobWorker(coreOptions),\n );\n}\n","/* eslint-disable no-restricted-syntax, @typescript-eslint/parameter-properties */\nimport * as asyncHooks from \"node:async_hooks\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as pathModule from \"node:path\";\nimport * as process from \"node:process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as sqlite3 from \"sqlite3\";\nimport * as yauzl from \"yauzl\";\nimport * as yazl from \"yazl\";\nimport { Environment, Loader, type LoaderSource } from \"nunjucks\";\n\nconst nodeProcess =\n (process as unknown as { default?: typeof process }).default ?? process;\nconst nodeSqlite3 =\n (sqlite3 as unknown as { default?: typeof sqlite3 }).default ?? sqlite3;\n\nimport {\n getWikiGraphPlatform,\n getWikiGraphStorage,\n installWikiGraphPlatform,\n installWikiGraphStorage,\n withWikiGraphStorage,\n type Directory,\n type File,\n type FileReader,\n type ReadonlyFile,\n type FileWriter,\n type HostDatabaseConnection,\n type HostDatabaseOpenOptions,\n type HostDatabaseRow,\n type HostDatabaseValue,\n type HostLifecycleProvider,\n type HostZipWriteEntry,\n type HostZipReader,\n type WikiGraphPlatform,\n type WikiGraphStorage,\n normalizeTemplateName,\n} from \"wiki-graph-core/platform\";\n\n/** Stable across independently bundled SDK entry points. */\nconst NODE_RESOURCE_KIND = Symbol.for(\"wiki-graph-sdk.node-resource.v1\");\n\n/** Install the Node implementation used by the CLI and its workers. */\nexport class NodeFile implements File {\n public readonly kind = \"file\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"file\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(\n public readonly path: string,\n name = pathModule.basename(path),\n ) {\n this.identity = encodeNodeResourceIdentity(\"file\", path);\n this.name = name;\n }\n\n public async openReader(): Promise<FileReader> {\n const handle = await fsPromises.open(this.path, \"r\");\n let closed = false;\n try {\n const stats = await handle.stat();\n if (!stats.isFile())\n throw new Error(\"File reader requires a regular file\");\n const { size } = stats;\n return {\n size,\n close: async () => {\n if (!closed) await handle.close();\n closed = true;\n },\n read: async (offset, length) => {\n if (closed) throw new Error(\"Cannot read from a closed FileReader\");\n assertFileRange(offset, length, size);\n const buffer = Buffer.allocUnsafe(length);\n let bytesRead = 0;\n while (bytesRead < length) {\n const result = await handle.read(\n buffer,\n bytesRead,\n length - bytesRead,\n offset + bytesRead,\n );\n if (result.bytesRead === 0) {\n throw new Error(\"File changed while reading its byte range\");\n }\n bytesRead += result.bytesRead;\n }\n return new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\n },\n };\n } catch (error) {\n await handle.close();\n throw error;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async openWriter(): Promise<FileWriter> {\n await fsPromises.mkdir(pathModule.dirname(this.path), { recursive: true });\n const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;\n const handle = await fsPromises.open(temporary, \"wx\");\n let closed = false;\n return {\n write: async (data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n await writeNodeFileHandle(handle, data);\n },\n writeAt: async (offset, data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n assertFileOffset(offset);\n await writeNodeFileHandle(handle, data, offset);\n },\n commit: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rename(temporary, this.path);\n }\n closed = true;\n },\n abort: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rm(temporary, { force: true });\n }\n closed = true;\n },\n };\n }\n}\n\n/** @internal Completes writes even when the Node file handle reports a short write. */\nexport async function writeNodeFileHandle(\n handle: Pick<fsPromises.FileHandle, \"write\">,\n data: Uint8Array | string,\n position?: number,\n): Promise<void> {\n const buffer = Buffer.from(data);\n let written = 0;\n while (written < buffer.byteLength) {\n const result = await handle.write(\n buffer,\n written,\n buffer.byteLength - written,\n position === undefined ? null : position + written,\n );\n if (result.bytesWritten === 0) {\n throw new Error(\"File writer made no progress\");\n }\n written += result.bytesWritten;\n }\n}\n\nfunction assertFileRange(offset: number, length: number, size: number): void {\n assertFileOffset(offset);\n if (!Number.isSafeInteger(length) || length < 0) {\n throw new RangeError(\n \"File read length must be a non-negative safe integer\",\n );\n }\n if (offset > size || length > size - offset) {\n throw new RangeError(\"File read range exceeds the file size\");\n }\n}\n\nfunction assertFileOffset(offset: number): void {\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new RangeError(\"File offset must be a non-negative safe integer\");\n }\n}\n\nexport class NodeDirectory implements Directory {\n public readonly kind = \"directory\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"directory\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(public readonly path: string) {\n this.identity = encodeNodeResourceIdentity(\"directory\", path);\n this.name = pathModule.basename(path);\n }\n\n public async getFile(name: string): Promise<File | undefined> {\n assertChildName(name);\n const file = new NodeFile(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(file.path)).isFile() ? file : undefined;\n } catch {\n return undefined;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async getDirectory(name: string): Promise<Directory | undefined> {\n assertChildName(name);\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(directory.path)).isDirectory()\n ? directory\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n public async list(): Promise<ReadonlyArray<File | Directory>> {\n const entries = await fsPromises.readdir(this.path, {\n withFileTypes: true,\n });\n return entries.map((entry) =>\n entry.isDirectory()\n ? new NodeDirectory(pathModule.join(this.path, entry.name))\n : new NodeFile(pathModule.join(this.path, entry.name), entry.name),\n );\n }\n\n public async createFile(name: string): Promise<File> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const file = new NodeFile(pathModule.join(this.path, name));\n await fsPromises.writeFile(file.path, \"\", { flag: \"wx\" });\n return file;\n }\n\n public async createDirectory(name: string): Promise<Directory> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n await fsPromises.mkdir(directory.path);\n return directory;\n }\n\n public async remove(\n name: string,\n options?: { readonly recursive?: boolean },\n ): Promise<void> {\n assertChildName(name);\n await fsPromises.rm(pathModule.join(this.path, name), {\n force: true,\n recursive: options?.recursive === true,\n });\n }\n}\n\nfunction encodeNodeResourceIdentity(\n kind: \"directory\" | \"file\",\n path: string,\n): string {\n return `node-${kind}:${Buffer.from(pathModule.resolve(path), \"utf8\").toString(\"base64url\")}`;\n}\n\nfunction decodeNodeResourceIdentity(\n identity: string,\n kind: \"directory\" | \"file\",\n): string | undefined {\n const prefix = `node-${kind}:`;\n if (!identity.startsWith(prefix)) {\n // State created before opaque resource identities stored native paths.\n return pathModule.isAbsolute(identity) ? identity : undefined;\n }\n try {\n return Buffer.from(identity.slice(prefix.length), \"base64url\").toString(\n \"utf8\",\n );\n } catch {\n return undefined;\n }\n}\n\nexport function getNodeResourcePath(resource: File | Directory): string {\n const brandedPath = getBrandedNodeResourcePath(resource, resource.kind);\n if (brandedPath !== undefined) return brandedPath;\n if (\n typeof resource === \"object\" &&\n resource !== null &&\n \"path\" in resource &&\n typeof resource.path === \"string\"\n ) {\n return resource.path;\n }\n throw new TypeError(\"Expected a Node File or Directory resource\");\n}\n\nfunction assertChildName(name: string): void {\n if (\n name.length === 0 ||\n name === \".\" ||\n name === \"..\" ||\n pathModule.isAbsolute(name) ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\")\n ) {\n throw new TypeError(`Directory child must be a relative name: ${name}`);\n }\n}\n\nclass NodeDatabaseConnection implements HostDatabaseConnection {\n public constructor(private readonly database: sqlite3.Database) {}\n\n public async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.close((error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async execute(sql: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.exec(sql, (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async queryAll(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<readonly HostDatabaseRow[]> {\n return await new Promise((resolve, reject) => {\n this.database.all(sql, [...params], (error, rows: HostDatabaseRow[]) => {\n if (error) reject(error);\n else resolve(rows);\n });\n });\n }\n\n public async queryOne(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<HostDatabaseRow | undefined> {\n return await new Promise((resolve, reject) => {\n this.database.get(sql, [...params], (error, row: HostDatabaseRow) => {\n if (error) reject(error);\n else resolve(row);\n });\n });\n }\n\n public async run(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.run(sql, [...params], (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n}\n\nasync function openNodeDatabase(\n file: ReadonlyFile,\n options: HostDatabaseOpenOptions,\n): Promise<NodeDatabaseConnection> {\n const flags =\n (options.mode === \"readonly\"\n ? nodeSqlite3.OPEN_READONLY\n : nodeSqlite3.OPEN_READWRITE |\n (options.create ? nodeSqlite3.OPEN_CREATE : 0)) |\n nodeSqlite3.OPEN_FULLMUTEX;\n return new NodeDatabaseConnection(await openNativeNodeDatabase(file, flags));\n}\n\nasync function openNativeNodeDatabase(\n file: ReadonlyFile,\n flags: number,\n): Promise<sqlite3.Database> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node database adapter requires a NodeFile\");\n }\n return await new Promise((resolve, reject) => {\n const database = new nodeSqlite3.Database(path, flags, (error) => {\n if (error) reject(error);\n else resolve(database);\n });\n });\n}\n\nasync function openNodeZip(file: ReadonlyFile): Promise<HostZipReader> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node ZIP adapter requires a NodeFile\");\n }\n const zipFile = await new Promise<yauzl.ZipFile>((resolve, reject) => {\n yauzl.open(\n path,\n { autoClose: false, lazyEntries: true },\n (error, opened) => {\n if (error || opened === undefined)\n reject(error ?? new Error(\"Cannot open ZIP\"));\n else resolve(opened);\n },\n );\n });\n\n const entries = await new Promise<Map<string, yauzl.Entry>>(\n (resolve, reject) => {\n const discovered = new Map<string, yauzl.Entry>();\n const rejectAndClose = (error: unknown) => {\n zipFile.close();\n reject(\n error instanceof Error\n ? error\n : new Error(\"Cannot scan ZIP central directory\"),\n );\n };\n const resolveEntries = () => {\n zipFile.off(\"error\", rejectAndClose);\n resolve(discovered);\n };\n zipFile.on(\"entry\", (entry: yauzl.Entry) => {\n if (!entry.fileName.endsWith(\"/\")) {\n discovered.set(entry.fileName, entry);\n }\n zipFile.readEntry();\n });\n zipFile.once(\"error\", rejectAndClose);\n zipFile.once(\"end\", resolveEntries);\n zipFile.readEntry();\n },\n );\n\n let closed = false;\n return {\n close: () => {\n if (!closed) zipFile.close();\n closed = true;\n return Promise.resolve();\n },\n copyEntry: async (name, target) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return false;\n await copyNodeZipEntry(zipFile, entry, target);\n return true;\n },\n getEntrySize: (name) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n return Promise.resolve(entries.get(name)?.uncompressedSize);\n },\n listEntries: () => Promise.resolve([...entries.keys()]),\n readEntryRange: async (name, offset, length) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return undefined;\n return await readNodeZipEntryRange(zipFile, entry, offset, length);\n },\n readEntry: async (name) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return undefined;\n return await readNodeZipEntry(zipFile, entry);\n },\n };\n}\n\nasync function copyNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n target: File,\n): Promise<void> {\n const writer = await target.openWriter();\n try {\n const stream = await openNodeZipEntryStream(zipFile, entry);\n await writeNodeStream(stream, writer);\n await writer.commit();\n } catch (error) {\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function readNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n): Promise<Uint8Array> {\n return await collectNodeStream(await openNodeZipEntryStream(zipFile, entry));\n}\n\nasync function readNodeZipEntryRange(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n offset: number,\n length: number,\n): Promise<Uint8Array> {\n assertFileRange(offset, length, entry.uncompressedSize);\n if (length === 0) return new Uint8Array();\n if (entry.compressionMethod !== 0) {\n const content = await collectDecodedNodeStreamRange(\n await openNodeZipEntryStream(zipFile, entry),\n offset,\n length,\n );\n return new Uint8Array(\n content.buffer,\n content.byteOffset,\n content.byteLength,\n );\n }\n const content = await collectNodeStream(\n await openNodeZipEntryStream(zipFile, entry, {\n decompress: null,\n decrypt: null,\n end: offset + length,\n start: offset,\n }),\n );\n return new Uint8Array(content.buffer, content.byteOffset, content.byteLength);\n}\n\nasync function collectDecodedNodeStreamRange(\n input: NodeJS.ReadableStream,\n offset: number,\n length: number,\n): Promise<Buffer> {\n const chunks: Buffer[] = [];\n const end = offset + length;\n let position = 0;\n let collected = 0;\n for await (const value of input) {\n const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);\n const chunkEnd = position + chunk.byteLength;\n if (chunkEnd > offset && position < end) {\n const selected = chunk.subarray(\n Math.max(0, offset - position),\n Math.min(chunk.byteLength, end - position),\n );\n chunks.push(selected);\n collected += selected.byteLength;\n }\n position = chunkEnd;\n if (position >= end) break;\n }\n if (collected !== length) {\n throw new Error(\"ZIP entry changed while reading its byte range\");\n }\n return Buffer.concat(chunks, collected);\n}\n\nasync function openNodeZipEntryStream(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n options?: yauzl.ZipFileOptions,\n): Promise<NodeJS.ReadableStream> {\n return await new Promise<NodeJS.ReadableStream>((resolve, reject) => {\n const callback = (error: Error | null, opened: Readable) => {\n if (error || opened === undefined) {\n reject(error ?? new Error(`Cannot read ZIP entry: ${entry.fileName}`));\n } else {\n resolve(opened);\n }\n };\n if (options === undefined) zipFile.openReadStream(entry, callback);\n else zipFile.openReadStream(entry, options, callback);\n });\n}\n\nasync function writeNodeZip(\n file: File,\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Promise<void> {\n const zipFile = new yazl.ZipFile();\n const writer = await file.openWriter();\n const outputStream = zipFile.outputStream as Readable;\n const outputDone = writeNodeStream(outputStream, writer);\n const entryState = { cancelled: false, complete: false };\n let iterator:\n | Iterator<HostZipWriteEntry>\n | AsyncIterator<HostZipWriteEntry>\n | undefined;\n\n try {\n iterator = getNodeZipEntryIterator(entries);\n const entriesDone = addNodeZipEntries(zipFile, iterator, entryState);\n await Promise.race([entriesDone, outputDone]);\n if (!entryState.complete) {\n throw new Error(\"ZIP output ended before entry production completed\");\n }\n zipFile.end();\n await outputDone;\n await writer.commit();\n } catch (error) {\n entryState.cancelled = true;\n if (!entryState.complete && iterator !== undefined) {\n closeNodeZipEntryIterator(iterator);\n }\n if (!outputStream.destroyed) {\n outputStream.destroy(\n error instanceof Error ? error : new Error(\"Cannot write ZIP archive\"),\n );\n }\n await outputDone.catch(() => undefined);\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function addNodeZipEntries(\n zipFile: yazl.ZipFile,\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n state: { cancelled: boolean; complete: boolean },\n): Promise<void> {\n while (!state.cancelled) {\n const result = await iterator.next();\n if (state.cancelled) return;\n if (result.done) {\n state.complete = true;\n return;\n }\n if (\"file\" in result.value) {\n zipFile.addReadStream(\n createNodeFileReadStream(result.value.file),\n result.value.name,\n { compress: false },\n );\n } else if (\"data\" in result.value) {\n zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {\n compress: false,\n });\n } else {\n zipFile.addReadStream(\n createNodeRangeReadStream(result.value),\n result.value.name,\n { compress: false, size: result.value.size },\n );\n }\n }\n}\n\nfunction createNodeFileReadStream(file: ReadonlyFile): Readable {\n return Readable.from(\n (async function* () {\n const reader = await file.openReader();\n try {\n for (let offset = 0; offset < reader.size; ) {\n const chunk = await reader.read(\n offset,\n Math.min(64 * 1024, reader.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n } finally {\n await reader.close();\n }\n })(),\n );\n}\n\nfunction getBrandedNodeResourcePath(\n resource: unknown,\n kind: \"directory\" | \"file\",\n): string | undefined {\n if (typeof resource !== \"object\" || resource === null) return undefined;\n const candidate = resource as {\n readonly [NODE_RESOURCE_KIND]?: unknown;\n readonly path?: unknown;\n };\n return candidate[NODE_RESOURCE_KIND] === kind &&\n typeof candidate.path === \"string\"\n ? candidate.path\n : undefined;\n}\n\nfunction createNodeRangeReadStream(\n entry: Extract<HostZipWriteEntry, { readonly size: number }>,\n): Readable {\n return Readable.from(\n (async function* () {\n for (let offset = 0; offset < entry.size; ) {\n const chunk = await entry.read(\n offset,\n Math.min(64 * 1024, entry.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n })(),\n );\n}\n\nfunction getNodeZipEntryIterator(\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry> {\n const asyncIterator = (entries as AsyncIterable<HostZipWriteEntry>)[\n Symbol.asyncIterator\n ];\n return asyncIterator === undefined\n ? (entries as Iterable<HostZipWriteEntry>)[Symbol.iterator]()\n : asyncIterator.call(entries);\n}\n\nfunction closeNodeZipEntryIterator(\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n): void {\n if (iterator.return === undefined) return;\n try {\n void Promise.resolve(iterator.return()).catch(() => undefined);\n } catch {\n // Preserve the failure that caused iteration to stop.\n }\n}\n\nasync function writeNodeStream(\n input: NodeJS.ReadableStream,\n writer: FileWriter,\n): Promise<void> {\n await pipeline(\n input,\n new Writable({\n write: (chunk: Buffer, _encoding, callback) => {\n void writer.write(chunk).then(\n () => callback(),\n (error: unknown) =>\n callback(\n error instanceof Error\n ? error\n : new Error(\"Cannot stream ZIP archive\"),\n ),\n );\n },\n }),\n );\n}\n\nasync function collectNodeStream(\n input: NodeJS.ReadableStream,\n): Promise<Buffer> {\n return await new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n input.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n input.once(\"error\", reject);\n input.once(\"end\", () => resolve(Buffer.concat(chunks)));\n });\n}\n\nexport const nodeWikiGraphPlatform: WikiGraphPlatform = {\n asyncContext: {\n create: <T>() => new asyncHooks.AsyncLocalStorage<T>(),\n },\n database: { open: openNodeDatabase },\n lifecycle: {\n instanceId: `node-process:${nodeProcess.pid}`,\n isInstanceAlive: (instanceId) => {\n const match = /^node-process:(\\d+)$/u.exec(instanceId);\n if (match === null) return Promise.resolve(undefined);\n try {\n nodeProcess.kill(Number(match[1]), 0);\n return Promise.resolve(true);\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ESRCH\"\n ) {\n return Promise.resolve(false);\n }\n return Promise.resolve(true);\n }\n },\n },\n resources: {\n getDirectory: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n getFile: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"file\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeFile(path),\n );\n },\n resolveLegacyDirectory: (reference) => {\n const path = decodeNodeResourceIdentity(reference, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n },\n templates: {\n createEnvironment: (options) =>\n new Environment(new NodeTemplateLoader(), options),\n },\n zip: {\n open: openNodeZip,\n write: writeNodeZip,\n },\n};\n\nexport interface NodeWikiGraphPlatformOptions {\n readonly lifecycle?: HostLifecycleProvider;\n}\n\n/** Create the Node platform with an optional host-owned lifecycle identity. */\nexport function createNodeWikiGraphPlatform(\n options: NodeWikiGraphPlatformOptions = {},\n): WikiGraphPlatform {\n return options.lifecycle === undefined\n ? nodeWikiGraphPlatform\n : { ...nodeWikiGraphPlatform, lifecycle: options.lifecycle };\n}\n\nclass NodeTemplateLoader extends Loader {\n readonly #dataDirectory: string | undefined;\n\n public constructor(dataDirectory?: string) {\n super();\n this.#dataDirectory = dataDirectory;\n }\n\n public getSource(templateName: string): LoaderSource {\n const name = normalizeTemplateName(templateName);\n const filePath = pathModule.join(\n this.#dataDirectory ?? resolveNodeDataDirectory(),\n name,\n );\n return {\n noCache: false,\n path: name,\n src: fs.readFileSync(filePath, \"utf8\"),\n };\n }\n}\n\nexport function createNodeTemplateEnvironment(\n dataDirectory: string,\n options: {\n readonly autoescape?: boolean;\n readonly trimBlocks?: boolean;\n } = {},\n): Environment {\n return new Environment(new NodeTemplateLoader(dataDirectory), {\n autoescape: options.autoescape ?? true,\n trimBlocks: options.trimBlocks ?? true,\n });\n}\n\nfunction resolveNodeDataDirectory(): string {\n const injected = (globalThis as { __WIKIGRAPH_DATA_DIR__?: unknown })\n .__WIKIGRAPH_DATA_DIR__;\n if (typeof injected === \"string\" && injected !== \"\") return injected;\n let directory = nodeProcess.cwd();\n while (true) {\n for (const candidate of [\n pathModule.join(directory, \"data\"),\n pathModule.join(directory, \"packages\", \"core\", \"data\"),\n ]) {\n try {\n if (fs.statSync(candidate).isDirectory()) return candidate;\n } catch {\n // Keep looking toward the filesystem root.\n }\n }\n const parent = pathModule.dirname(directory);\n if (parent === directory)\n throw new Error(\"Could not locate data directory\");\n directory = parent;\n }\n}\n\nexport interface NodeWikiGraphStorageOptions {\n readonly documentStoreRoot: string;\n readonly libraryRoot: string;\n}\n\nexport function createNodeWikiGraphStorage(\n stateRootOrOptions: string | NodeWikiGraphStorageOptions = pathModule.join(\n os.homedir(),\n \".wikigraph\",\n ),\n): WikiGraphStorage {\n const libraryRoot =\n typeof stateRootOrOptions === \"string\"\n ? stateRootOrOptions\n : stateRootOrOptions.libraryRoot;\n const documentStoreRoot =\n typeof stateRootOrOptions === \"string\"\n ? pathModule.join(stateRootOrOptions, \"documents\")\n : stateRootOrOptions.documentStoreRoot;\n return {\n library: new NodeDirectory(libraryRoot),\n documentStore: new NodeDirectory(documentStoreRoot),\n };\n}\n\nexport function installNodeWikiGraphPlatform(stateRoot?: string): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n installWikiGraphStorage(createNodeWikiGraphStorage(stateRoot));\n}\n\nexport function ensureNodeWikiGraphPlatform(): void {\n try {\n getWikiGraphPlatform();\n } catch {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n }\n try {\n getWikiGraphStorage();\n } catch {\n installWikiGraphStorage(createNodeWikiGraphStorage());\n }\n}\n\nexport async function withNodeWikiGraphStorage<T>(\n stateRoot: string | undefined,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await withWikiGraphStorage(\n stateRoot === undefined ? undefined : createNodeWikiGraphStorage(stateRoot),\n operation,\n );\n}\n","import {\n installWikiGraphPlatform,\n withWikiGraphStorage,\n type WikiGraphPlatform,\n type WikiGraphStorage,\n} from \"wiki-graph-core/platform\";\n\nimport {\n ensureNodeWikiGraphPlatform,\n withNodeWikiGraphStorage,\n} from \"./node-platform.js\";\nimport {\n getWikiGraphSDKRuntimeContext,\n withWikiGraphSDKRuntimeContext,\n} from \"./runtime-context.js\";\n\ninterface WikiGraphSDKHostBase {\n /** Process-wide runtime services. Concurrent SDKs must use one compatible platform. */\n readonly platform?: WikiGraphPlatform;\n}\n\nexport type WikiGraphSDKHost = WikiGraphSDKHostBase &\n (\n | {\n /** Node state root for SDK configuration and other host-local state. */\n readonly stateDir: string;\n /** Storage roots scoped to this SDK instance or standalone operation. */\n readonly storage: WikiGraphStorage;\n }\n | {\n /** Node state root used by the default Node storage layout. */\n readonly stateDir?: string;\n readonly storage?: undefined;\n }\n );\n\nexport interface WikiGraphSDKHostOptions {\n readonly host?: WikiGraphSDKHost;\n readonly stateDir?: string;\n}\n\nexport function prepareWikiGraphSDKHost(host?: WikiGraphSDKHost): void {\n if (host?.platform === undefined) {\n ensureNodeWikiGraphPlatform();\n return;\n }\n installWikiGraphPlatform(host.platform);\n}\n\nexport function assertWikiGraphSDKHostOptions(\n options: WikiGraphSDKHostOptions,\n): void {\n if (\n options.host?.storage !== undefined &&\n options.host.stateDir === undefined\n ) {\n throw new TypeError(\n \"Wiki Graph SDK host.storage requires host.stateDir so SDK configuration cannot fall back to the default user state directory.\",\n );\n }\n if (\n options.stateDir !== undefined &&\n (options.host?.stateDir !== undefined ||\n options.host?.storage !== undefined)\n ) {\n throw new TypeError(\n \"Wiki Graph SDK host state/storage and top-level stateDir cannot be used together. Put the state directory in host.stateDir when providing host.storage.\",\n );\n }\n}\n\nexport async function withWikiGraphSDKHost<T>(\n options: WikiGraphSDKHostOptions,\n operation: () => Promise<T> | T,\n): Promise<T> {\n const current = getWikiGraphSDKRuntimeContext();\n const effective = {\n ...(options.host === undefined\n ? current.host === undefined\n ? {}\n : { host: current.host }\n : { host: options.host }),\n ...(options.stateDir === undefined\n ? current.stateDir === undefined\n ? {}\n : { stateDir: current.stateDir }\n : { stateDir: options.stateDir }),\n };\n assertWikiGraphSDKHostOptions(effective);\n prepareWikiGraphSDKHost(effective.host);\n const runWithContext = async (): Promise<T> =>\n await withWikiGraphSDKRuntimeContext(\n {\n ...current,\n ...(effective.host === undefined ? {} : { host: effective.host }),\n ...(effective.stateDir === undefined\n ? {}\n : { stateDir: effective.stateDir }),\n },\n operation,\n );\n if (effective.host?.storage !== undefined) {\n return await withWikiGraphStorage(effective.host.storage, runWithContext);\n }\n return await withNodeWikiGraphStorage(\n effective.host?.stateDir ?? effective.stateDir,\n runWithContext,\n );\n}\n","import { AsyncLocalStorage } from \"async_hooks\";\n\nimport type { WikiGraphSDKProviders } from \"./providers.js\";\nimport type { WikiGraphSDKHost } from \"./host.js\";\n\nexport type WikiGraphSDKEnvPolicy = \"development\" | \"production\";\n\nexport interface WikiGraphSDKRuntimeContext {\n readonly cwd: string;\n readonly env: NodeJS.ProcessEnv;\n readonly envPolicy: WikiGraphSDKEnvPolicy;\n readonly host?: WikiGraphSDKHost;\n readonly providers?: WikiGraphSDKProviders;\n readonly stateDir?: string | undefined;\n}\n\n/** Shared by independently bundled SDK entry points in the same process. */\nconst RUNTIME_CONTEXT_KEY = Symbol.for(\"wiki-graph-sdk.runtime-context.v1\");\nconst runtimeContext = getRuntimeContextStorage();\n\nfunction getRuntimeContextStorage(): AsyncLocalStorage<WikiGraphSDKRuntimeContext> {\n const runtimeGlobal = globalThis as unknown as Record<PropertyKey, unknown>;\n const existing = runtimeGlobal[RUNTIME_CONTEXT_KEY];\n if (existing !== undefined) {\n return existing as AsyncLocalStorage<WikiGraphSDKRuntimeContext>;\n }\n\n const storage = new AsyncLocalStorage<WikiGraphSDKRuntimeContext>();\n Object.defineProperty(runtimeGlobal, RUNTIME_CONTEXT_KEY, {\n configurable: false,\n enumerable: false,\n value: storage,\n writable: false,\n });\n return storage;\n}\n\nexport async function withWikiGraphSDKRuntimeContext<T>(\n context: WikiGraphSDKRuntimeContext,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await runtimeContext.run(context, operation);\n}\n\nexport function getWikiGraphSDKRuntimeContext(): WikiGraphSDKRuntimeContext {\n return (\n runtimeContext.getStore() ?? {\n cwd: process.cwd(),\n env: process.env,\n envPolicy: \"production\",\n providers: {},\n }\n );\n}\n\nexport function getWikiGraphSDKStateDir(): string | undefined {\n const context = getWikiGraphSDKRuntimeContext();\n return context.host?.stateDir ?? context.stateDir;\n}\n\nexport function getWikiGraphSDKProviders(): WikiGraphSDKProviders {\n return getWikiGraphSDKRuntimeContext().providers ?? {};\n}\n","import { realpath, stat } from \"fs/promises\";\nimport { basename, dirname, isAbsolute, join, relative, resolve } from \"path\";\n\nimport {\n formatLocatedWikiGraphUri,\n formatWikiGraphLibraryUri,\n listWikiGraphLibraries,\n listWikiGraphLibraryArchives,\n parseLocatedWikiGraphUri,\n parseWikiGraphLibraryUri,\n resolveWikiGraphLibrary,\n resolveWikiGraphLibraryArchiveFile,\n type ParsedWikiGraphLibraryUri,\n type QueryIndexScope,\n type File,\n} from \"wiki-graph-core\";\n\nimport { getNodeResourcePath, NodeFile } from \"../node-platform.js\";\nimport { resolveWikiGraphRuntimePath } from \"../runtime-path.js\";\n\nexport type WikiGraphArchiveTarget =\n | {\n readonly kind: \"standalone\";\n readonly objectUri?: string;\n readonly path: string;\n }\n | {\n readonly kind: \"library\";\n readonly uri: string;\n };\n\nexport interface WikiGraphArchiveLocation {\n readonly archiveFile: File;\n readonly archiveKey: string;\n /** Logical archive locator. Never contains a managed archive's physical path. */\n readonly archivePath: string;\n readonly indexScope: QueryIndexScope;\n readonly libraryArchiveTarget?: ParsedWikiGraphLibraryUri;\n readonly locatedUri: string;\n readonly publicArchiveUri?: string;\n readonly target: WikiGraphArchiveTarget;\n}\n\nexport class WikiGraphArchiveOwnershipError extends Error {\n public readonly code = \"WIKI_GRAPH_ARCHIVE_OWNERSHIP_MISMATCH\";\n\n public constructor(message: string) {\n super(message);\n this.name = \"WikiGraphArchiveOwnershipError\";\n }\n}\n\nexport async function resolveWikiGraphArchiveLocation(\n target: WikiGraphArchiveTarget,\n): Promise<WikiGraphArchiveLocation> {\n if (target.kind === \"standalone\") {\n return await resolveStandaloneLocation(target);\n }\n return await resolveLibraryLocation(target);\n}\n\nexport async function assertStandaloneWikiGraphArchivePath(\n inputPath: string,\n): Promise<string> {\n const path = resolveWikiGraphRuntimePath(inputPath);\n const candidate = await canonicalPath(path);\n const candidateIdentity = await readFileIdentity(path);\n const libraries = await listWikiGraphLibraries();\n const matches = await findMatchingMembers(\n libraries,\n candidate,\n candidateIdentity,\n );\n if (matches.length > 0) {\n const match = requireUnambiguousManagedMatch(path, matches);\n throw new WikiGraphArchiveOwnershipError(\n `Standalone archive path belongs to registered library ${formatWikiGraphLibraryUri(\n match.library.isDefault ? undefined : match.library.publicId,\n )}: ${path}. Use the library UUID URI ${match.archive.uri} instead.`,\n );\n }\n for (const library of libraries) {\n const rootPath = getNodeResourcePath(library.folder);\n const root = await canonicalPath(rootPath);\n if (!isWithin(root, candidate)) continue;\n throw new WikiGraphArchiveOwnershipError(\n `Standalone archive path belongs to registered library ${formatWikiGraphLibraryUri(\n library.isDefault ? undefined : library.publicId,\n )}: ${path}. Scan the library, then address the archive by its library UUID URI.`,\n );\n }\n return path;\n}\n\nexport function archiveTargetFromLogicalLocator(\n locator: string,\n objectUri?: string,\n): WikiGraphArchiveTarget {\n if (locator.startsWith(\"wikg://lib/\")) {\n return { kind: \"library\", uri: withObjectUri(locator, objectUri) };\n }\n return {\n kind: \"standalone\",\n path: locator,\n ...(objectUri === undefined ? {} : { objectUri }),\n };\n}\n\nexport async function resolveWikiGraphArchiveTarget(\n file: File,\n): Promise<WikiGraphArchiveTarget> {\n const path = getNodeResourcePath(file);\n const candidate = await canonicalPath(path);\n const candidateIdentity = await readFileIdentity(path);\n const matches = await findMatchingMembers(\n await listWikiGraphLibraries(),\n candidate,\n candidateIdentity,\n );\n if (matches.length > 0) {\n const match = requireUnambiguousManagedMatch(path, matches);\n return { kind: \"library\", uri: match.archive.uri };\n }\n return { kind: \"standalone\", path: getNodeResourcePath(file) };\n}\n\nasync function resolveStandaloneLocation(\n target: Extract<WikiGraphArchiveTarget, { readonly kind: \"standalone\" }>,\n): Promise<WikiGraphArchiveLocation> {\n if (target.path.startsWith(\"wikg://lib/\")) {\n throw new WikiGraphArchiveOwnershipError(\n `A library archive URI cannot be used as a standalone path: ${target.path}`,\n );\n }\n const path = await assertStandaloneWikiGraphArchivePath(target.path);\n const normalized: WikiGraphArchiveTarget = {\n kind: \"standalone\",\n path,\n ...(target.objectUri === undefined ? {} : { objectUri: target.objectUri }),\n };\n return {\n archiveFile: new NodeFile(path),\n archiveKey: path,\n archivePath: path,\n indexScope: { archiveKey: path, archivePath: path, kind: \"archive-index\" },\n locatedUri: formatLocatedWikiGraphUri(path, target.objectUri),\n target: normalized,\n };\n}\n\nasync function resolveLibraryLocation(\n target: Extract<WikiGraphArchiveTarget, { readonly kind: \"library\" }>,\n): Promise<WikiGraphArchiveLocation> {\n const parsedLocated = parseLocatedWikiGraphUri(target.uri);\n const archiveUri = parsedLocated.archivePath ?? target.uri;\n const parsed = parseWikiGraphLibraryUri(archiveUri);\n if (parsed?.kind !== \"archive\") {\n throw new WikiGraphArchiveOwnershipError(\n `Library archive target must be a UUID archive URI: ${target.uri}`,\n );\n }\n // Resolving the library first distinguishes a missing membership database\n // from an ordinary file path and prevents path fallback.\n await resolveWikiGraphLibrary(parsed);\n const archiveFile = await resolveWikiGraphLibraryArchiveFile(archiveUri);\n const normalized: WikiGraphArchiveTarget = {\n kind: \"library\",\n uri: target.uri,\n };\n return {\n archiveFile,\n archiveKey: archiveUri,\n archivePath: archiveUri,\n indexScope: {\n archiveKey: archiveUri,\n archivePath: archiveUri,\n kind: \"archive-index\",\n },\n libraryArchiveTarget: parsed,\n locatedUri: target.uri,\n publicArchiveUri: archiveUri,\n target: normalized,\n };\n}\n\nfunction withObjectUri(archiveLocator: string, objectUri?: string): string {\n if (objectUri === undefined) return archiveLocator;\n const path = objectUri.replace(/^wikg:\\/\\//u, \"\");\n return `${archiveLocator.replace(/\\/$/u, \"\")}/${path}`;\n}\n\nasync function canonicalPath(path: string): Promise<string> {\n try {\n return await realpath(path);\n } catch {\n const absolute = resolve(path);\n const parent = dirname(absolute);\n return parent === absolute\n ? absolute\n : join(await canonicalPath(parent), basename(absolute));\n }\n}\n\nfunction isWithin(root: string, candidate: string): boolean {\n const child = relative(root, candidate);\n return child === \"\" || (!child.startsWith(\"..\") && !isAbsolute(child));\n}\n\ntype ListedLibrary = Awaited<ReturnType<typeof listWikiGraphLibraries>>[number];\ntype ListedArchive = Awaited<\n ReturnType<typeof listWikiGraphLibraryArchives>\n>[number];\n\ninterface ManagedArchiveMatch {\n readonly archive: ListedArchive;\n readonly library: ListedLibrary;\n readonly memberPath: string;\n}\n\nasync function findMatchingMembers(\n libraries: Awaited<ReturnType<typeof listWikiGraphLibraries>>,\n candidate: string,\n candidateIdentity?: string,\n): Promise<readonly ManagedArchiveMatch[]> {\n const members: ManagedArchiveMatch[] = [];\n for (const library of libraries) {\n const archives = await listWikiGraphLibraryArchives({\n isDefault: library.isDefault,\n kind: \"scope\",\n ...(library.isDefault ? {} : { publicId: library.publicId }),\n });\n for (const archive of archives) {\n if (archive.file === undefined) continue;\n members.push({\n archive,\n library,\n memberPath: getNodeResourcePath(archive.file),\n });\n }\n }\n\n const exact: ManagedArchiveMatch[] = [];\n for (const member of members) {\n if ((await canonicalPath(member.memberPath)) === candidate) {\n exact.push(member);\n }\n }\n if (exact.length > 0 || candidateIdentity === undefined) return exact;\n\n const identityMatches: ManagedArchiveMatch[] = [];\n for (const member of members) {\n if ((await readFileIdentity(member.memberPath)) === candidateIdentity) {\n identityMatches.push(member);\n }\n }\n return identityMatches;\n}\n\nfunction requireUnambiguousManagedMatch(\n path: string,\n matches: readonly ManagedArchiveMatch[],\n): ManagedArchiveMatch {\n if (matches.length === 1) return matches[0]!;\n throw new WikiGraphArchiveOwnershipError(\n `Archive file identity is ambiguous across managed archives: ${path}. Use an explicit library UUID URI (${matches\n .map((match) => match.archive.uri)\n .join(\", \")}).`,\n );\n}\n\nasync function readFileIdentity(path: string): Promise<string | undefined> {\n try {\n const value = await stat(path);\n return `${value.dev}:${value.ino}`;\n } catch {\n return undefined;\n }\n}\n","import { homedir } from \"os\";\nimport { isAbsolute, resolve } from \"path\";\n\nimport { getWikiGraphSDKRuntimeContext } from \"./runtime-context.js\";\n\nexport function resolveWikiGraphRuntimePath(path: string): string {\n const context = getWikiGraphSDKRuntimeContext();\n const environmentHome = context.env.HOME?.trim();\n const home =\n environmentHome === undefined || environmentHome === \"\"\n ? homedir()\n : environmentHome;\n if (path === \"~\") return home;\n if (path.startsWith(\"~/\")) return resolve(home, path.slice(2));\n return isAbsolute(path) ? path : resolve(context.cwd, path);\n}\n","import {\n WikiGraphArchiveFile,\n writeWikiGraphLibraryArchive,\n type DirectoryDocument,\n type File,\n} from \"wiki-graph-core\";\n\nimport type { WikiGraphArchiveLocation } from \"./target.js\";\n\nexport interface WriteWikiGraphArchiveLocationOptions {\n readonly invalidateContinuationCursors?: boolean;\n readonly onIndexSyncError?: (error: unknown) => void;\n readonly refreshLibraryIndex?: boolean;\n readonly searchIndexWritebackPolicy?: \"archive\" | \"cache\";\n}\n\nexport async function writeWikiGraphArchiveLocation<T>(\n location: WikiGraphArchiveLocation,\n operation: (document: DirectoryDocument) => Promise<T> | T,\n options: WriteWikiGraphArchiveLocationOptions = {},\n): Promise<T> {\n const cacheOnly = options.searchIndexWritebackPolicy === \"cache\";\n const write = async (archiveFile: File = location.archiveFile) =>\n await new WikiGraphArchiveFile(archiveFile).write(operation, {\n ...(cacheOnly\n ? {}\n : { derivedStateKeys: [location.archiveKey, location.archivePath] }),\n ...(options.invalidateContinuationCursors === undefined\n ? {}\n : {\n invalidateContinuationCursors:\n options.invalidateContinuationCursors,\n }),\n ...(options.searchIndexWritebackPolicy === undefined\n ? {}\n : { searchIndexWritebackPolicy: options.searchIndexWritebackPolicy }),\n });\n\n if (\n location.libraryArchiveTarget === undefined ||\n cacheOnly ||\n options.refreshLibraryIndex === false\n ) {\n return await write();\n }\n return await writeWikiGraphLibraryArchive({\n additionalDerivedStateKeys: [location.archiveKey, location.archivePath],\n ...(options.invalidateContinuationCursors === undefined\n ? {}\n : {\n invalidateContinuationCursors: options.invalidateContinuationCursors,\n }),\n ...(options.onIndexSyncError === undefined\n ? {}\n : { onIndexSyncError: options.onIndexSyncError }),\n operation: async (archiveFile) => await write(archiveFile),\n target: location.libraryArchiveTarget,\n });\n}\n"],"mappings":"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","names":["import_wiki_graph_core","process","resolve","content","import_platform","import_promises","import_path","import_wiki_graph_core","import_worker","runCoreBuildJobWorker"]}
|
package/dist/worker.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { ChapterJobInputOptions, BuildJobWorkerOptions } from 'wiki-graph-core/worker';
|
|
2
2
|
export { BuildJob, BuildJobExecutionContext, BuildJobProgressReporter, BuildJobWorkerOptions, ChapterJobInputOptions, LocalChapterJobFileExecutorOptions, applyChapterJobArtifactFile, createLocalChapterJobFileExecutor, writeChapterJobInputFile } from 'wiki-graph-core/worker';
|
|
3
|
+
import { W as WikiGraphSDKHost } from './host-IbqJ8WSV.js';
|
|
3
4
|
import { W as WikiGraphArchiveTarget } from './target-CZ7elwmj.js';
|
|
5
|
+
import 'wiki-graph-core/platform';
|
|
4
6
|
|
|
5
7
|
declare const CHAPTER_JOB_KINDS: readonly ["index-embedding-source", "index-embedding-summary", "index-fts", "knowledge-graph", "reading-graph", "reading-summary"];
|
|
6
8
|
type ChapterJobKind = (typeof CHAPTER_JOB_KINDS)[number];
|
|
@@ -170,23 +172,26 @@ interface WikiGraphJobSnapshotResult extends WikiGraphJobSnapshotInput {
|
|
|
170
172
|
readonly revision: number;
|
|
171
173
|
}
|
|
172
174
|
interface ExtractWikiGraphJobSnapshotsOptions {
|
|
175
|
+
readonly host?: WikiGraphSDKHost;
|
|
173
176
|
readonly onSnapshot?: (snapshot: WikiGraphJobSnapshotResult) => void | Promise<void>;
|
|
174
177
|
readonly requests: readonly WikiGraphJobSnapshotInput[];
|
|
175
178
|
readonly signal?: AbortSignal;
|
|
176
|
-
readonly stateDir
|
|
179
|
+
readonly stateDir?: string;
|
|
177
180
|
readonly wikgPath: string;
|
|
178
181
|
}
|
|
179
182
|
declare function extractWikiGraphJobSnapshots(options: ExtractWikiGraphJobSnapshotsOptions): Promise<readonly WikiGraphJobSnapshotResult[]>;
|
|
180
183
|
interface ApplyWikiGraphJobArtifactsOptions {
|
|
181
184
|
readonly archive: WikiGraphArchiveTarget;
|
|
182
185
|
readonly artifacts: AsyncIterable<WikiGraphJobArtifactInput>;
|
|
186
|
+
readonly host?: WikiGraphSDKHost;
|
|
183
187
|
readonly signal?: AbortSignal;
|
|
184
|
-
readonly stateDir
|
|
188
|
+
readonly stateDir?: string;
|
|
185
189
|
}
|
|
186
190
|
declare function applyWikiGraphJobArtifacts(options: ApplyWikiGraphJobArtifactsOptions): Promise<{
|
|
187
191
|
readonly applied: number;
|
|
188
192
|
}>;
|
|
189
193
|
interface WikiGraphBuildJobWorkerOptions extends BuildJobWorkerOptions {
|
|
194
|
+
readonly host?: WikiGraphSDKHost;
|
|
190
195
|
/** Wiki Graph state root. Defaults to `~/.wikigraph`. */
|
|
191
196
|
readonly stateDir?: string;
|
|
192
197
|
}
|