wiki-graph-sdk 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/archives.cjs +241 -29
  2. package/dist/archives.cjs.map +1 -1
  3. package/dist/archives.d.ts +1 -1
  4. package/dist/archives.js +245 -29
  5. package/dist/archives.js.map +1 -1
  6. package/dist/conversions.cjs +64 -28
  7. package/dist/conversions.cjs.map +1 -1
  8. package/dist/conversions.js +64 -28
  9. package/dist/conversions.js.map +1 -1
  10. package/dist/default-worker.cjs +64 -28
  11. package/dist/default-worker.cjs.map +1 -1
  12. package/dist/default-worker.js +64 -28
  13. package/dist/default-worker.js.map +1 -1
  14. package/dist/embedding.cjs +64 -28
  15. package/dist/embedding.cjs.map +1 -1
  16. package/dist/embedding.js +64 -28
  17. package/dist/embedding.js.map +1 -1
  18. package/dist/gc.cjs +64 -28
  19. package/dist/gc.cjs.map +1 -1
  20. package/dist/gc.js +64 -28
  21. package/dist/gc.js.map +1 -1
  22. package/dist/{index-DQzLAnjf.d.ts → index-4YX4dv6Y.d.ts} +38 -2
  23. package/dist/index.cjs +244 -32
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.ts +3 -3
  26. package/dist/index.js +248 -32
  27. package/dist/index.js.map +1 -1
  28. package/dist/local-config.cjs +64 -28
  29. package/dist/local-config.cjs.map +1 -1
  30. package/dist/local-config.js +64 -28
  31. package/dist/local-config.js.map +1 -1
  32. package/dist/maintenance.cjs +64 -28
  33. package/dist/maintenance.cjs.map +1 -1
  34. package/dist/maintenance.js +64 -28
  35. package/dist/maintenance.js.map +1 -1
  36. package/dist/node-platform.cjs +64 -28
  37. package/dist/node-platform.cjs.map +1 -1
  38. package/dist/node-platform.js +64 -28
  39. package/dist/node-platform.js.map +1 -1
  40. package/dist/runtime-config.cjs +64 -28
  41. package/dist/runtime-config.cjs.map +1 -1
  42. package/dist/runtime-config.js +64 -28
  43. package/dist/runtime-config.js.map +1 -1
  44. package/dist/stage.cjs +64 -28
  45. package/dist/stage.cjs.map +1 -1
  46. package/dist/stage.js +64 -28
  47. package/dist/stage.js.map +1 -1
  48. package/dist/worker.cjs +64 -28
  49. package/dist/worker.cjs.map +1 -1
  50. package/dist/worker.js +64 -28
  51. package/dist/worker.js.map +1 -1
  52. package/package.json +2 -2
@@ -103,7 +103,7 @@ var NodeFile = class {
103
103
  }
104
104
  path;
105
105
  async getPhysicalIdentity() {
106
- const value = await fsPromises.stat(this.path).catch((error) => {
106
+ const value = await fsPromises.stat(toNodeFilesystemPath(this.path)).catch((error) => {
107
107
  if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
108
108
  return void 0;
109
109
  throw error;
@@ -116,7 +116,7 @@ var NodeFile = class {
116
116
  identity;
117
117
  name;
118
118
  async openReader() {
119
- const handle = await fsPromises.open(this.path, "r");
119
+ const handle = await fsPromises.open(toNodeFilesystemPath(this.path), "r");
120
120
  let closed = false;
121
121
  try {
122
122
  const stats = await handle.stat();
@@ -156,7 +156,7 @@ var NodeFile = class {
156
156
  }
157
157
  async getLastModified() {
158
158
  try {
159
- return (await fsPromises.stat(this.path)).mtimeMs;
159
+ return (await fsPromises.stat(toNodeFilesystemPath(this.path))).mtimeMs;
160
160
  } catch (error) {
161
161
  if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
162
162
  return void 0;
@@ -165,9 +165,14 @@ var NodeFile = class {
165
165
  }
166
166
  }
167
167
  async openWriter() {
168
- await fsPromises.mkdir(pathModule.dirname(this.path), { recursive: true });
168
+ await fsPromises.mkdir(
169
+ toNodeFilesystemPath(pathModule.dirname(this.path)),
170
+ {
171
+ recursive: true
172
+ }
173
+ );
169
174
  const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;
170
- const handle = await fsPromises.open(temporary, "wx");
175
+ const handle = await fsPromises.open(toNodeFilesystemPath(temporary), "wx");
171
176
  let closed = false;
172
177
  return {
173
178
  write: async (data) => {
@@ -182,14 +187,17 @@ var NodeFile = class {
182
187
  commit: async () => {
183
188
  if (!closed) {
184
189
  await handle.close();
185
- await fsPromises.rename(temporary, this.path);
190
+ await fsPromises.rename(
191
+ toNodeFilesystemPath(temporary),
192
+ toNodeFilesystemPath(this.path)
193
+ );
186
194
  }
187
195
  closed = true;
188
196
  },
189
197
  abort: async () => {
190
198
  if (!closed) {
191
199
  await handle.close();
192
- await fsPromises.rm(temporary, { force: true });
200
+ await fsPromises.rm(toNodeFilesystemPath(temporary), { force: true });
193
201
  }
194
202
  closed = true;
195
203
  }
@@ -236,7 +244,7 @@ var NodeDirectory = class _NodeDirectory {
236
244
  }
237
245
  path;
238
246
  async getPhysicalIdentity() {
239
- const value = await fsPromises.stat(this.path).catch((error) => {
247
+ const value = await fsPromises.stat(toNodeFilesystemPath(this.path)).catch((error) => {
240
248
  if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
241
249
  return void 0;
242
250
  throw error;
@@ -252,7 +260,7 @@ var NodeDirectory = class _NodeDirectory {
252
260
  assertChildName(name);
253
261
  const file = new NodeFile(pathModule.join(this.path, name));
254
262
  try {
255
- return (await fsPromises.stat(file.path)).isFile() ? file : void 0;
263
+ return (await fsPromises.stat(toNodeFilesystemPath(file.path))).isFile() ? file : void 0;
256
264
  } catch (error) {
257
265
  if (typeof error === "object" && error !== null && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR"))
258
266
  return void 0;
@@ -261,7 +269,7 @@ var NodeDirectory = class _NodeDirectory {
261
269
  }
262
270
  async getLastModified() {
263
271
  try {
264
- return (await fsPromises.stat(this.path)).mtimeMs;
272
+ return (await fsPromises.stat(toNodeFilesystemPath(this.path))).mtimeMs;
265
273
  } catch (error) {
266
274
  if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
267
275
  return void 0;
@@ -273,7 +281,7 @@ var NodeDirectory = class _NodeDirectory {
273
281
  assertChildName(name);
274
282
  const directory = new _NodeDirectory(pathModule.join(this.path, name));
275
283
  try {
276
- return (await fsPromises.stat(directory.path)).isDirectory() ? directory : void 0;
284
+ return (await fsPromises.stat(toNodeFilesystemPath(directory.path))).isDirectory() ? directory : void 0;
277
285
  } catch (error) {
278
286
  if (typeof error === "object" && error !== null && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR"))
279
287
  return void 0;
@@ -281,7 +289,7 @@ var NodeDirectory = class _NodeDirectory {
281
289
  }
282
290
  }
283
291
  async list() {
284
- const entries = await fsPromises.readdir(this.path, {
292
+ const entries = await fsPromises.readdir(toNodeFilesystemPath(this.path), {
285
293
  withFileTypes: true
286
294
  });
287
295
  return entries.map(
@@ -290,26 +298,45 @@ var NodeDirectory = class _NodeDirectory {
290
298
  }
291
299
  async createFile(name) {
292
300
  assertChildName(name);
293
- await fsPromises.mkdir(this.path, { recursive: true });
301
+ await fsPromises.mkdir(toNodeFilesystemPath(this.path), {
302
+ recursive: true
303
+ });
294
304
  const file = new NodeFile(pathModule.join(this.path, name));
295
- await fsPromises.writeFile(file.path, "", { flag: "wx" });
305
+ await fsPromises.writeFile(toNodeFilesystemPath(file.path), "", {
306
+ flag: "wx"
307
+ });
296
308
  return file;
297
309
  }
298
310
  async createDirectory(name) {
299
311
  assertChildName(name);
300
- await fsPromises.mkdir(this.path, { recursive: true });
312
+ await fsPromises.mkdir(toNodeFilesystemPath(this.path), {
313
+ recursive: true
314
+ });
301
315
  const directory = new _NodeDirectory(pathModule.join(this.path, name));
302
- await fsPromises.mkdir(directory.path);
316
+ await fsPromises.mkdir(toNodeFilesystemPath(directory.path));
303
317
  return directory;
304
318
  }
305
319
  async remove(name, options) {
306
320
  assertChildName(name);
307
- await fsPromises.rm(pathModule.join(this.path, name), {
308
- force: true,
309
- recursive: options?.recursive === true
310
- });
321
+ await fsPromises.rm(
322
+ toNodeFilesystemPath(pathModule.join(this.path, name)),
323
+ {
324
+ force: true,
325
+ recursive: options?.recursive === true
326
+ }
327
+ );
311
328
  }
312
329
  };
330
+ function toNodeFilesystemPath(path) {
331
+ if (nodeProcess.platform !== "win32" || path.startsWith("\\\\?\\")) {
332
+ return path;
333
+ }
334
+ const absolute = pathModule.resolve(path);
335
+ if (absolute.startsWith("\\\\")) {
336
+ return `\\\\?\\UNC\\${absolute.slice(2)}`;
337
+ }
338
+ return `\\\\?\\${absolute}`;
339
+ }
313
340
  function encodeNodeResourceIdentity(kind, path) {
314
341
  return `node-${kind}:${Buffer.from(pathModule.resolve(path), "utf8").toString("base64url")}`;
315
342
  }
@@ -387,10 +414,14 @@ async function openNativeNodeDatabase(file, flags) {
387
414
  throw new TypeError("The Node database adapter requires a NodeFile");
388
415
  }
389
416
  return await new Promise((resolve2, reject) => {
390
- const database = new nodeSqlite3.Database(path, flags, (error) => {
391
- if (error) reject(error);
392
- else resolve2(database);
393
- });
417
+ const database = new nodeSqlite3.Database(
418
+ toNodeFilesystemPath(path),
419
+ flags,
420
+ (error) => {
421
+ if (error) reject(error);
422
+ else resolve2(database);
423
+ }
424
+ );
394
425
  });
395
426
  }
396
427
  async function openNodeZip(file, options = {}) {
@@ -398,7 +429,7 @@ async function openNodeZip(file, options = {}) {
398
429
  if (path === void 0) {
399
430
  throw new TypeError("The Node ZIP adapter requires a NodeFile");
400
431
  }
401
- const handle = await fsPromises.open(path, "r");
432
+ const handle = await fsPromises.open(toNodeFilesystemPath(path), "r");
402
433
  let size;
403
434
  try {
404
435
  size = (await handle.stat()).size;
@@ -713,6 +744,11 @@ async function writeNodeZip(file, entries) {
713
744
  }
714
745
  }
715
746
  async function addNodeZipEntries(zipFile, iterator, state) {
747
+ const stableZipOptions = {
748
+ compress: false,
749
+ forceDosTimestamp: true,
750
+ mtime: new Date(1980, 0, 2)
751
+ };
716
752
  while (!state.cancelled) {
717
753
  const result = await iterator.next();
718
754
  if (state.cancelled) return;
@@ -724,17 +760,17 @@ async function addNodeZipEntries(zipFile, iterator, state) {
724
760
  zipFile.addReadStream(
725
761
  createNodeFileReadStream(result.value.file),
726
762
  result.value.name,
727
- { compress: false }
763
+ stableZipOptions
728
764
  );
729
765
  } else if ("data" in result.value) {
730
766
  zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {
731
- compress: false
767
+ ...stableZipOptions
732
768
  });
733
769
  } else {
734
770
  zipFile.addReadStream(
735
771
  createNodeRangeReadStream(result.value),
736
772
  result.value.name,
737
- { compress: false, size: result.value.size }
773
+ { ...stableZipOptions, size: result.value.size }
738
774
  );
739
775
  }
740
776
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/local-config.ts","../src/runtime-context.ts","../src/node-platform.ts"],"sourcesContent":["import { openSharedStateDatabase } from \"wiki-graph-core\";\nimport { getWikiGraphSDKStateDir } from \"./runtime-context.js\";\nimport { NodeFile } from \"./node-platform.js\";\nimport { mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport type { Database } from \"wiki-graph-core\";\n\nexport const LOCAL_CONFIG_SECTIONS = [\n \"concurrent\",\n \"embeddings\",\n \"llm\",\n \"wikimedia\",\n \"wikispine\",\n] as const;\n\nexport type LocalConfigSection = (typeof LOCAL_CONFIG_SECTIONS)[number];\n\nexport type LocalConfigObject = Readonly<Record<string, unknown>>;\n\nconst LOCAL_CONFIG_SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS config_sections (\n section TEXT PRIMARY KEY,\n value_json TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n);\n`;\n\nexport async function readLocalConfigSection(\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n return await readLocalConfigSectionInDatabase(database, section);\n });\n}\n\nexport async function replaceLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): Promise<LocalConfigObject> {\n const normalized = validateLocalConfigSection(section, value);\n\n return await withLocalConfigDatabase(async (database) => {\n await writeLocalConfigSectionInDatabase(database, section, normalized);\n return normalized;\n });\n}\n\nexport async function putLocalConfigValue(\n section: LocalConfigSection,\n key: string,\n value: unknown,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n const current = await readLocalConfigSectionInDatabase(database, section);\n const next = validateLocalConfigSection(section, {\n ...current,\n [normalizeLocalConfigKey(section, key)]: value,\n });\n\n await writeLocalConfigSectionInDatabase(database, section, next);\n return next;\n });\n}\n\nexport async function deleteLocalConfigValue(\n section: LocalConfigSection,\n key: string,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n const current = await readLocalConfigSectionInDatabase(database, section);\n const normalizedKey = normalizeLocalConfigKey(section, key);\n const { [normalizedKey]: _removed, ...nextInput } = current;\n const next = validateLocalConfigSection(section, nextInput);\n\n await writeLocalConfigSectionInDatabase(database, section, next);\n return next;\n });\n}\n\nexport async function clearLocalConfigSection(\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n return await replaceLocalConfigSection(section, {});\n}\n\nexport function parseLocalConfigSection(\n value: string | undefined,\n): LocalConfigSection | undefined {\n if (value === \"embedding\") {\n return \"embeddings\";\n }\n\n return LOCAL_CONFIG_SECTIONS.find((section) => section === value);\n}\n\nexport function maskLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): LocalConfigObject {\n if (\n (section !== \"llm\" &&\n section !== \"embeddings\" &&\n section !== \"wikimedia\" &&\n section !== \"wikispine\") ||\n (value.apiKey === undefined && value.token === undefined)\n ) {\n return value;\n }\n\n return {\n ...value,\n ...(value.apiKey === undefined ? {} : { apiKey: \"****\" }),\n ...(value.token === undefined ? {} : { token: \"****\" }),\n };\n}\n\nexport function normalizeLocalConfigKey(\n section: LocalConfigSection,\n key: string,\n): string {\n const normalized = key.trim();\n\n if (normalized === \"\") {\n throw new Error(\"Config key cannot be empty.\");\n }\n\n if (section === \"llm\" || section === \"embeddings\") {\n switch (normalized) {\n case \"api-key\":\n return \"apiKey\";\n case \"base-url\":\n return \"baseURL\";\n default:\n return normalized;\n }\n }\n return normalized;\n}\n\nexport function validateLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): LocalConfigObject {\n switch (section) {\n case \"embeddings\":\n return validateEmbeddingsConfig(value);\n case \"llm\":\n return validateLLMConfig(value);\n case \"concurrent\":\n return validateConcurrentConfig(value);\n case \"wikimedia\":\n return validateWikimediaConfig(value);\n case \"wikispine\":\n return validateWikispineConfig(value);\n }\n}\n\nasync function withLocalConfigDatabase<T>(\n operation: (database: Database) => Promise<T>,\n): Promise<T> {\n const stateDir = getWikiGraphSDKStateDir() ?? join(homedir(), \".wikigraph\");\n await mkdir(stateDir, { recursive: true });\n const database = await openSharedStateDatabase(\n new NodeFile(join(stateDir, \"core.sqlite\")),\n LOCAL_CONFIG_SCHEMA_SQL,\n );\n\n try {\n return await operation(database);\n } finally {\n await database.close();\n }\n}\n\nasync function readLocalConfigSectionInDatabase(\n database: Database,\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n const value = await database.queryOne(\n \"SELECT value_json FROM config_sections WHERE section = ?\",\n [section],\n (row) => String(row.value_json),\n );\n\n return value === undefined ? {} : parseSectionJSON(section, value);\n}\n\nasync function writeLocalConfigSectionInDatabase(\n database: Database,\n section: LocalConfigSection,\n value: LocalConfigObject,\n): Promise<void> {\n await database.run(\n `\nINSERT INTO config_sections (section, value_json, updated_at)\nVALUES (?, ?, ?)\nON CONFLICT(section) DO UPDATE SET\n value_json = excluded.value_json,\n updated_at = excluded.updated_at\n`,\n [section, JSON.stringify(value), Date.now()],\n );\n}\n\nfunction parseSectionJSON(\n section: LocalConfigSection,\n value: string,\n): LocalConfigObject {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n throw new Error(\n `Invalid local config JSON for ${section}: ${formatError(error)}`,\n );\n }\n\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\n `Invalid local config section ${section}: expected object.`,\n );\n }\n\n return validateLocalConfigSection(section, parsed as LocalConfigObject);\n}\n\nfunction validateEmbeddingsConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\n \"apiKey\",\n \"baseURL\",\n \"dimensions\",\n \"model\",\n \"name\",\n \"provider\",\n ]);\n const allowedProviders = new Set([\"openai\", \"openai-compatible\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown embeddings config key: ${key}`);\n }\n if (key === \"dimensions\") {\n const parsed =\n typeof entry === \"number\"\n ? entry\n : typeof entry === \"string\"\n ? Number(entry)\n : NaN;\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"embeddings.dimensions must be a positive integer.\");\n }\n next[key] = parsed;\n continue;\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`embeddings.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown embeddings.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateLLMConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\n \"apiKey\",\n \"baseURL\",\n \"model\",\n \"name\",\n \"provider\",\n ]);\n const allowedProviders = new Set([\n \"anthropic\",\n \"google\",\n \"openai\",\n \"openai-compatible\",\n ]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown llm config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`llm.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown llm.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateConcurrentConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\"job\", \"request\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown concurrent config key: ${key}`);\n }\n const parsed =\n typeof entry === \"number\"\n ? entry\n : typeof entry === \"string\"\n ? Number(entry)\n : NaN;\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`concurrent.${key} must be a positive integer.`);\n }\n next[key] = parsed;\n }\n\n return next;\n}\n\nfunction validateWikispineConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\"endpoint\", \"provider\", \"token\"]);\n const allowedProviders = new Set([\"cli\", \"fetch\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown wikispine config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`wikispine.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown wikispine.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateWikimediaConfig(value: LocalConfigObject): LocalConfigObject {\n return validateEndpointConfig(\"wikimedia\", value);\n}\n\nfunction validateEndpointConfig(\n section: \"wikimedia\",\n value: LocalConfigObject,\n): LocalConfigObject {\n const allowedKeys = new Set([\"endpoint\", \"token\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown ${section} config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`${section}.${key} must be a non-empty string.`);\n }\n next[key] = entry.trim();\n }\n\n return next;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\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","/* 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 async getPhysicalIdentity(): Promise<string | undefined> {\n const value = await fsPromises.stat(this.path).catch((error: unknown) => {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n });\n if (value === undefined) return undefined;\n return `${value.dev}:${value.ino}`;\n }\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 async getPhysicalIdentity(): Promise<string | undefined> {\n const value = await fsPromises.stat(this.path).catch((error: unknown) => {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n });\n if (value === undefined) return undefined;\n return `${value.dev}:${value.ino}`;\n }\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 (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n return undefined;\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 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 (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n return undefined;\n throw error;\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(\n file: ReadonlyFile,\n options: { readonly entryNameMode?: \"raw\" | \"normalized\" } = {},\n): 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 handle = await fsPromises.open(path, \"r\");\n let size: number;\n try {\n size = (await handle.stat()).size;\n } catch (error) {\n await handle.close();\n throw error;\n }\n const open = () =>\n new Promise<yauzl.ZipFile>((resolve, reject) => {\n yauzl.fromRandomAccessReader(\n new NodeZipSource(handle),\n size,\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 // Validate the ZIP envelope without enumerating its entries. Keep the same\n // file descriptor across lookups, even if the path is replaced meanwhile.\n try {\n (await open()).close();\n } catch (error) {\n await handle.close();\n throw error;\n }\n let closed = false;\n let pending: Promise<unknown> = Promise.resolve();\n let closing: Promise<void> | undefined;\n const run = <T>(\n operation: (zip: yauzl.ZipFile) => Promise<T>,\n ): Promise<T> => {\n if (closed)\n return Promise.reject(new Error(\"Cannot read a closed ZIP archive\"));\n const result = pending.then(async () => {\n const zip = await open();\n try {\n return await operation(zip);\n } finally {\n zip.close();\n }\n });\n pending = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n const withEntry = <T>(\n name: string,\n operation: (\n zip: yauzl.ZipFile,\n entry: yauzl.Entry | undefined,\n ) => Promise<T>,\n ) =>\n run(async (zip) => {\n let exact: yauzl.Entry | undefined;\n let alias: yauzl.Entry | undefined;\n let aliasCollision = false;\n // Retain only matches, not a directory index. Scan through the end so\n // duplicate raw names keep their existing last-entry-wins behavior.\n await scanNodeZip(zip, (entry) => {\n if (entry.fileName === name) exact = entry;\n if (normalizeNodeZipName(entry.fileName) === name) {\n if (alias !== undefined && alias.fileName !== entry.fileName)\n aliasCollision = true;\n alias = entry;\n }\n });\n if (\n (exact === undefined || options.entryNameMode === \"normalized\") &&\n aliasCollision\n ) {\n // The former Map ordered aliases by the first occurrence of each raw\n // name, but used its last duplicate's contents. Resolve this uncommon\n // ambiguity with rescans instead of retaining a set of all raw names.\n let bestPosition = -1;\n const candidates = await open();\n try {\n await scanNodeZip(candidates, async (entry) => {\n if (normalizeNodeZipName(entry.fileName) !== name) return;\n const probe = await open();\n let position = 0;\n try {\n await scanNodeZip(probe, (candidate) => {\n if (candidate.fileName === entry.fileName) return false;\n position++;\n });\n } finally {\n probe.close();\n }\n if (position >= bestPosition) {\n bestPosition = position;\n alias = entry;\n }\n });\n return await operation(candidates, alias);\n } finally {\n candidates.close();\n }\n }\n return await operation(\n zip,\n options.entryNameMode === \"normalized\" ? alias : (exact ?? alias),\n );\n });\n return {\n close: () => {\n closed = true;\n closing ??= pending.then(() => handle.close());\n return closing;\n },\n copyEntry: (name, target) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return false;\n await copyNodeZipEntry(zip, entry, target);\n return true;\n }),\n getEntrySize: (name) =>\n withEntry(name, (_zip, entry) =>\n Promise.resolve(entry?.uncompressedSize),\n ),\n listEntries: () =>\n run(async (zip) => {\n const names = new Set<string>();\n await scanNodeZip(zip, (entry) => {\n names.add(entry.fileName);\n });\n return [...names];\n }),\n readEntryRange: (name, offset, length) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return undefined;\n return await readNodeZipEntryRange(zip, entry, offset, length);\n }),\n readEntry: (name) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return undefined;\n return await readNodeZipEntry(zip, entry);\n }),\n };\n}\n\n/** yauzl owns ZIP parsing; this source only provides positioned file reads. */\nclass NodeZipSource extends yauzl.RandomAccessReader {\n public constructor(private readonly handle: fsPromises.FileHandle) {\n super();\n }\n public override read(\n buffer: Buffer,\n offset: number,\n length: number,\n position: number,\n callback: (error: Error | null) => void,\n ): void {\n // Central-directory reads are small. Avoid creating a stream pipeline for\n // each header; yauzl still owns parsing and requests the exact byte range.\n const read = (written: number): void => {\n if (written === length) {\n callback(null);\n return;\n }\n fs.read(\n this.handle.fd,\n buffer,\n offset + written,\n length - written,\n position + written,\n (error, bytesRead) => {\n if (error) callback(error);\n else if (bytesRead === 0)\n callback(new Error(\"Unexpected end of ZIP file\"));\n else read(written + bytesRead);\n },\n );\n };\n read(0);\n }\n public override _readStreamForRange(start: number, end: number): Readable {\n const handle = this.handle;\n return Readable.from(\n (async function* () {\n for (let position = start; position < end; ) {\n const buffer = Buffer.allocUnsafe(\n Math.min(64 * 1024, end - position),\n );\n const { bytesRead } = await handle.read(\n buffer,\n 0,\n buffer.length,\n position,\n );\n if (bytesRead === 0) return;\n position += bytesRead;\n yield buffer.subarray(0, bytesRead);\n }\n })(),\n );\n }\n}\n\nfunction normalizeNodeZipName(name: string): string | undefined {\n const normalized = name\n .replaceAll(\"\\\\\", \"/\")\n .trim()\n .split(\"/\")\n .filter((part) => part !== \"\" && part !== \".\")\n .join(\"/\");\n return normalized.split(\"/\").includes(\"..\") ? undefined : normalized;\n}\n\nasync function scanNodeZip(\n zip: yauzl.ZipFile,\n visit: (entry: yauzl.Entry) => void | boolean | Promise<void | boolean>,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n zip.off(\"entry\", onEntry);\n zip.off(\"end\", onEnd);\n zip.off(\"error\", onError);\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onEnd = () => {\n cleanup();\n resolve();\n };\n const onEntry = (entry: yauzl.Entry) => {\n void Promise.resolve()\n .then(() => (entry.fileName.endsWith(\"/\") ? undefined : visit(entry)))\n .then((keepReading) => {\n if (keepReading === false) onEnd();\n else zip.readEntry();\n })\n .catch((error: unknown) =>\n onError(\n error instanceof Error\n ? error\n : new Error(\"Cannot scan ZIP\", { cause: error }),\n ),\n );\n };\n zip.on(\"entry\", onEntry);\n zip.once(\"end\", onEnd);\n zip.once(\"error\", onError);\n zip.readEntry();\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"],"mappings":"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","names":["process","resolve","open","read","content","import_promises"]}
1
+ {"version":3,"sources":["../src/local-config.ts","../src/runtime-context.ts","../src/node-platform.ts"],"sourcesContent":["import { openSharedStateDatabase } from \"wiki-graph-core\";\nimport { getWikiGraphSDKStateDir } from \"./runtime-context.js\";\nimport { NodeFile } from \"./node-platform.js\";\nimport { mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport type { Database } from \"wiki-graph-core\";\n\nexport const LOCAL_CONFIG_SECTIONS = [\n \"concurrent\",\n \"embeddings\",\n \"llm\",\n \"wikimedia\",\n \"wikispine\",\n] as const;\n\nexport type LocalConfigSection = (typeof LOCAL_CONFIG_SECTIONS)[number];\n\nexport type LocalConfigObject = Readonly<Record<string, unknown>>;\n\nconst LOCAL_CONFIG_SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS config_sections (\n section TEXT PRIMARY KEY,\n value_json TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n);\n`;\n\nexport async function readLocalConfigSection(\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n return await readLocalConfigSectionInDatabase(database, section);\n });\n}\n\nexport async function replaceLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): Promise<LocalConfigObject> {\n const normalized = validateLocalConfigSection(section, value);\n\n return await withLocalConfigDatabase(async (database) => {\n await writeLocalConfigSectionInDatabase(database, section, normalized);\n return normalized;\n });\n}\n\nexport async function putLocalConfigValue(\n section: LocalConfigSection,\n key: string,\n value: unknown,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n const current = await readLocalConfigSectionInDatabase(database, section);\n const next = validateLocalConfigSection(section, {\n ...current,\n [normalizeLocalConfigKey(section, key)]: value,\n });\n\n await writeLocalConfigSectionInDatabase(database, section, next);\n return next;\n });\n}\n\nexport async function deleteLocalConfigValue(\n section: LocalConfigSection,\n key: string,\n): Promise<LocalConfigObject> {\n return await withLocalConfigDatabase(async (database) => {\n const current = await readLocalConfigSectionInDatabase(database, section);\n const normalizedKey = normalizeLocalConfigKey(section, key);\n const { [normalizedKey]: _removed, ...nextInput } = current;\n const next = validateLocalConfigSection(section, nextInput);\n\n await writeLocalConfigSectionInDatabase(database, section, next);\n return next;\n });\n}\n\nexport async function clearLocalConfigSection(\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n return await replaceLocalConfigSection(section, {});\n}\n\nexport function parseLocalConfigSection(\n value: string | undefined,\n): LocalConfigSection | undefined {\n if (value === \"embedding\") {\n return \"embeddings\";\n }\n\n return LOCAL_CONFIG_SECTIONS.find((section) => section === value);\n}\n\nexport function maskLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): LocalConfigObject {\n if (\n (section !== \"llm\" &&\n section !== \"embeddings\" &&\n section !== \"wikimedia\" &&\n section !== \"wikispine\") ||\n (value.apiKey === undefined && value.token === undefined)\n ) {\n return value;\n }\n\n return {\n ...value,\n ...(value.apiKey === undefined ? {} : { apiKey: \"****\" }),\n ...(value.token === undefined ? {} : { token: \"****\" }),\n };\n}\n\nexport function normalizeLocalConfigKey(\n section: LocalConfigSection,\n key: string,\n): string {\n const normalized = key.trim();\n\n if (normalized === \"\") {\n throw new Error(\"Config key cannot be empty.\");\n }\n\n if (section === \"llm\" || section === \"embeddings\") {\n switch (normalized) {\n case \"api-key\":\n return \"apiKey\";\n case \"base-url\":\n return \"baseURL\";\n default:\n return normalized;\n }\n }\n return normalized;\n}\n\nexport function validateLocalConfigSection(\n section: LocalConfigSection,\n value: LocalConfigObject,\n): LocalConfigObject {\n switch (section) {\n case \"embeddings\":\n return validateEmbeddingsConfig(value);\n case \"llm\":\n return validateLLMConfig(value);\n case \"concurrent\":\n return validateConcurrentConfig(value);\n case \"wikimedia\":\n return validateWikimediaConfig(value);\n case \"wikispine\":\n return validateWikispineConfig(value);\n }\n}\n\nasync function withLocalConfigDatabase<T>(\n operation: (database: Database) => Promise<T>,\n): Promise<T> {\n const stateDir = getWikiGraphSDKStateDir() ?? join(homedir(), \".wikigraph\");\n await mkdir(stateDir, { recursive: true });\n const database = await openSharedStateDatabase(\n new NodeFile(join(stateDir, \"core.sqlite\")),\n LOCAL_CONFIG_SCHEMA_SQL,\n );\n\n try {\n return await operation(database);\n } finally {\n await database.close();\n }\n}\n\nasync function readLocalConfigSectionInDatabase(\n database: Database,\n section: LocalConfigSection,\n): Promise<LocalConfigObject> {\n const value = await database.queryOne(\n \"SELECT value_json FROM config_sections WHERE section = ?\",\n [section],\n (row) => String(row.value_json),\n );\n\n return value === undefined ? {} : parseSectionJSON(section, value);\n}\n\nasync function writeLocalConfigSectionInDatabase(\n database: Database,\n section: LocalConfigSection,\n value: LocalConfigObject,\n): Promise<void> {\n await database.run(\n `\nINSERT INTO config_sections (section, value_json, updated_at)\nVALUES (?, ?, ?)\nON CONFLICT(section) DO UPDATE SET\n value_json = excluded.value_json,\n updated_at = excluded.updated_at\n`,\n [section, JSON.stringify(value), Date.now()],\n );\n}\n\nfunction parseSectionJSON(\n section: LocalConfigSection,\n value: string,\n): LocalConfigObject {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n throw new Error(\n `Invalid local config JSON for ${section}: ${formatError(error)}`,\n );\n }\n\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\n `Invalid local config section ${section}: expected object.`,\n );\n }\n\n return validateLocalConfigSection(section, parsed as LocalConfigObject);\n}\n\nfunction validateEmbeddingsConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\n \"apiKey\",\n \"baseURL\",\n \"dimensions\",\n \"model\",\n \"name\",\n \"provider\",\n ]);\n const allowedProviders = new Set([\"openai\", \"openai-compatible\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown embeddings config key: ${key}`);\n }\n if (key === \"dimensions\") {\n const parsed =\n typeof entry === \"number\"\n ? entry\n : typeof entry === \"string\"\n ? Number(entry)\n : NaN;\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"embeddings.dimensions must be a positive integer.\");\n }\n next[key] = parsed;\n continue;\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`embeddings.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown embeddings.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateLLMConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\n \"apiKey\",\n \"baseURL\",\n \"model\",\n \"name\",\n \"provider\",\n ]);\n const allowedProviders = new Set([\n \"anthropic\",\n \"google\",\n \"openai\",\n \"openai-compatible\",\n ]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown llm config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`llm.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown llm.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateConcurrentConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\"job\", \"request\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown concurrent config key: ${key}`);\n }\n const parsed =\n typeof entry === \"number\"\n ? entry\n : typeof entry === \"string\"\n ? Number(entry)\n : NaN;\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`concurrent.${key} must be a positive integer.`);\n }\n next[key] = parsed;\n }\n\n return next;\n}\n\nfunction validateWikispineConfig(value: LocalConfigObject): LocalConfigObject {\n const allowedKeys = new Set([\"endpoint\", \"provider\", \"token\"]);\n const allowedProviders = new Set([\"cli\", \"fetch\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown wikispine config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`wikispine.${key} must be a non-empty string.`);\n }\n const normalized = entry.trim();\n\n if (key === \"provider\" && !allowedProviders.has(normalized)) {\n throw new Error(`Unknown wikispine.provider: ${normalized}`);\n }\n\n next[key] = normalized;\n }\n\n return next;\n}\n\nfunction validateWikimediaConfig(value: LocalConfigObject): LocalConfigObject {\n return validateEndpointConfig(\"wikimedia\", value);\n}\n\nfunction validateEndpointConfig(\n section: \"wikimedia\",\n value: LocalConfigObject,\n): LocalConfigObject {\n const allowedKeys = new Set([\"endpoint\", \"token\"]);\n const next: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n if (!allowedKeys.has(key)) {\n throw new Error(`Unknown ${section} config key: ${key}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`${section}.${key} must be a non-empty string.`);\n }\n next[key] = entry.trim();\n }\n\n return next;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\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","/* 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 async getPhysicalIdentity(): Promise<string | undefined> {\n const value = await fsPromises\n .stat(toNodeFilesystemPath(this.path))\n .catch((error: unknown) => {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n });\n if (value === undefined) return undefined;\n return `${value.dev}:${value.ino}`;\n }\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(toNodeFilesystemPath(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(toNodeFilesystemPath(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(\n toNodeFilesystemPath(pathModule.dirname(this.path)),\n {\n recursive: true,\n },\n );\n const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;\n const handle = await fsPromises.open(toNodeFilesystemPath(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(\n toNodeFilesystemPath(temporary),\n toNodeFilesystemPath(this.path),\n );\n }\n closed = true;\n },\n abort: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rm(toNodeFilesystemPath(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 async getPhysicalIdentity(): Promise<string | undefined> {\n const value = await fsPromises\n .stat(toNodeFilesystemPath(this.path))\n .catch((error: unknown) => {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n });\n if (value === undefined) return undefined;\n return `${value.dev}:${value.ino}`;\n }\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(toNodeFilesystemPath(file.path))).isFile()\n ? file\n : undefined;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n return undefined;\n throw error;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(toNodeFilesystemPath(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 (\n await fsPromises.stat(toNodeFilesystemPath(directory.path))\n ).isDirectory()\n ? directory\n : undefined;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n return undefined;\n throw error;\n }\n }\n\n public async list(): Promise<ReadonlyArray<File | Directory>> {\n const entries = await fsPromises.readdir(toNodeFilesystemPath(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(toNodeFilesystemPath(this.path), {\n recursive: true,\n });\n const file = new NodeFile(pathModule.join(this.path, name));\n await fsPromises.writeFile(toNodeFilesystemPath(file.path), \"\", {\n flag: \"wx\",\n });\n return file;\n }\n\n public async createDirectory(name: string): Promise<Directory> {\n assertChildName(name);\n await fsPromises.mkdir(toNodeFilesystemPath(this.path), {\n recursive: true,\n });\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n await fsPromises.mkdir(toNodeFilesystemPath(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(\n toNodeFilesystemPath(pathModule.join(this.path, name)),\n {\n force: true,\n recursive: options?.recursive === true,\n },\n );\n }\n}\n\nfunction toNodeFilesystemPath(path: string): string {\n if (nodeProcess.platform !== \"win32\" || path.startsWith(\"\\\\\\\\?\\\\\")) {\n return path;\n }\n const absolute = pathModule.resolve(path);\n if (absolute.startsWith(\"\\\\\\\\\")) {\n return `\\\\\\\\?\\\\UNC\\\\${absolute.slice(2)}`;\n }\n return `\\\\\\\\?\\\\${absolute}`;\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(\n toNodeFilesystemPath(path),\n flags,\n (error) => {\n if (error) reject(error);\n else resolve(database);\n },\n );\n });\n}\n\nasync function openNodeZip(\n file: ReadonlyFile,\n options: { readonly entryNameMode?: \"raw\" | \"normalized\" } = {},\n): 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 handle = await fsPromises.open(toNodeFilesystemPath(path), \"r\");\n let size: number;\n try {\n size = (await handle.stat()).size;\n } catch (error) {\n await handle.close();\n throw error;\n }\n const open = () =>\n new Promise<yauzl.ZipFile>((resolve, reject) => {\n yauzl.fromRandomAccessReader(\n new NodeZipSource(handle),\n size,\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 // Validate the ZIP envelope without enumerating its entries. Keep the same\n // file descriptor across lookups, even if the path is replaced meanwhile.\n try {\n (await open()).close();\n } catch (error) {\n await handle.close();\n throw error;\n }\n let closed = false;\n let pending: Promise<unknown> = Promise.resolve();\n let closing: Promise<void> | undefined;\n const run = <T>(\n operation: (zip: yauzl.ZipFile) => Promise<T>,\n ): Promise<T> => {\n if (closed)\n return Promise.reject(new Error(\"Cannot read a closed ZIP archive\"));\n const result = pending.then(async () => {\n const zip = await open();\n try {\n return await operation(zip);\n } finally {\n zip.close();\n }\n });\n pending = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n const withEntry = <T>(\n name: string,\n operation: (\n zip: yauzl.ZipFile,\n entry: yauzl.Entry | undefined,\n ) => Promise<T>,\n ) =>\n run(async (zip) => {\n let exact: yauzl.Entry | undefined;\n let alias: yauzl.Entry | undefined;\n let aliasCollision = false;\n // Retain only matches, not a directory index. Scan through the end so\n // duplicate raw names keep their existing last-entry-wins behavior.\n await scanNodeZip(zip, (entry) => {\n if (entry.fileName === name) exact = entry;\n if (normalizeNodeZipName(entry.fileName) === name) {\n if (alias !== undefined && alias.fileName !== entry.fileName)\n aliasCollision = true;\n alias = entry;\n }\n });\n if (\n (exact === undefined || options.entryNameMode === \"normalized\") &&\n aliasCollision\n ) {\n // The former Map ordered aliases by the first occurrence of each raw\n // name, but used its last duplicate's contents. Resolve this uncommon\n // ambiguity with rescans instead of retaining a set of all raw names.\n let bestPosition = -1;\n const candidates = await open();\n try {\n await scanNodeZip(candidates, async (entry) => {\n if (normalizeNodeZipName(entry.fileName) !== name) return;\n const probe = await open();\n let position = 0;\n try {\n await scanNodeZip(probe, (candidate) => {\n if (candidate.fileName === entry.fileName) return false;\n position++;\n });\n } finally {\n probe.close();\n }\n if (position >= bestPosition) {\n bestPosition = position;\n alias = entry;\n }\n });\n return await operation(candidates, alias);\n } finally {\n candidates.close();\n }\n }\n return await operation(\n zip,\n options.entryNameMode === \"normalized\" ? alias : (exact ?? alias),\n );\n });\n return {\n close: () => {\n closed = true;\n closing ??= pending.then(() => handle.close());\n return closing;\n },\n copyEntry: (name, target) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return false;\n await copyNodeZipEntry(zip, entry, target);\n return true;\n }),\n getEntrySize: (name) =>\n withEntry(name, (_zip, entry) =>\n Promise.resolve(entry?.uncompressedSize),\n ),\n listEntries: () =>\n run(async (zip) => {\n const names = new Set<string>();\n await scanNodeZip(zip, (entry) => {\n names.add(entry.fileName);\n });\n return [...names];\n }),\n readEntryRange: (name, offset, length) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return undefined;\n return await readNodeZipEntryRange(zip, entry, offset, length);\n }),\n readEntry: (name) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return undefined;\n return await readNodeZipEntry(zip, entry);\n }),\n };\n}\n\n/** yauzl owns ZIP parsing; this source only provides positioned file reads. */\nclass NodeZipSource extends yauzl.RandomAccessReader {\n public constructor(private readonly handle: fsPromises.FileHandle) {\n super();\n }\n public override read(\n buffer: Buffer,\n offset: number,\n length: number,\n position: number,\n callback: (error: Error | null) => void,\n ): void {\n // Central-directory reads are small. Avoid creating a stream pipeline for\n // each header; yauzl still owns parsing and requests the exact byte range.\n const read = (written: number): void => {\n if (written === length) {\n callback(null);\n return;\n }\n fs.read(\n this.handle.fd,\n buffer,\n offset + written,\n length - written,\n position + written,\n (error, bytesRead) => {\n if (error) callback(error);\n else if (bytesRead === 0)\n callback(new Error(\"Unexpected end of ZIP file\"));\n else read(written + bytesRead);\n },\n );\n };\n read(0);\n }\n public override _readStreamForRange(start: number, end: number): Readable {\n const handle = this.handle;\n return Readable.from(\n (async function* () {\n for (let position = start; position < end; ) {\n const buffer = Buffer.allocUnsafe(\n Math.min(64 * 1024, end - position),\n );\n const { bytesRead } = await handle.read(\n buffer,\n 0,\n buffer.length,\n position,\n );\n if (bytesRead === 0) return;\n position += bytesRead;\n yield buffer.subarray(0, bytesRead);\n }\n })(),\n );\n }\n}\n\nfunction normalizeNodeZipName(name: string): string | undefined {\n const normalized = name\n .replaceAll(\"\\\\\", \"/\")\n .trim()\n .split(\"/\")\n .filter((part) => part !== \"\" && part !== \".\")\n .join(\"/\");\n return normalized.split(\"/\").includes(\"..\") ? undefined : normalized;\n}\n\nasync function scanNodeZip(\n zip: yauzl.ZipFile,\n visit: (entry: yauzl.Entry) => void | boolean | Promise<void | boolean>,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n zip.off(\"entry\", onEntry);\n zip.off(\"end\", onEnd);\n zip.off(\"error\", onError);\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onEnd = () => {\n cleanup();\n resolve();\n };\n const onEntry = (entry: yauzl.Entry) => {\n void Promise.resolve()\n .then(() => (entry.fileName.endsWith(\"/\") ? undefined : visit(entry)))\n .then((keepReading) => {\n if (keepReading === false) onEnd();\n else zip.readEntry();\n })\n .catch((error: unknown) =>\n onError(\n error instanceof Error\n ? error\n : new Error(\"Cannot scan ZIP\", { cause: error }),\n ),\n );\n };\n zip.on(\"entry\", onEntry);\n zip.once(\"end\", onEnd);\n zip.once(\"error\", onError);\n zip.readEntry();\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 const stableZipOptions = {\n compress: false,\n forceDosTimestamp: true,\n mtime: new Date(1980, 0, 2),\n } as const;\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 stableZipOptions,\n );\n } else if (\"data\" in result.value) {\n zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {\n ...stableZipOptions,\n });\n } else {\n zipFile.addReadStream(\n createNodeRangeReadStream(result.value),\n result.value.name,\n { ...stableZipOptions, 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"],"mappings":"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","names":["process","resolve","open","read","content","import_promises"]}