@bitcobblers/wod-wiki-tools 0.36.2134 → 0.36.2135

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 (55) hide show
  1. package/dist/bin/wod.cjs +274 -69
  2. package/dist/bin/wod.cjs.map +1 -1
  3. package/dist/bin/wod.mjs +5 -14
  4. package/dist/bin/wod.mjs.map +1 -1
  5. package/dist/{chunk-EUQWEX6Z.mjs → chunk-CYKNTEGY.mjs} +3 -3
  6. package/dist/chunk-CYKNTEGY.mjs.map +1 -0
  7. package/dist/{compiler-KT6P3AC6.mjs → chunk-FZKXOYMJ.mjs} +4 -5
  8. package/dist/chunk-FZKXOYMJ.mjs.map +1 -0
  9. package/dist/{chunk-32FASQP5.mjs → chunk-MA6BBTWC.mjs} +54 -12
  10. package/dist/chunk-MA6BBTWC.mjs.map +1 -0
  11. package/dist/{chunk-B3QJYJVI.mjs → chunk-OTJAPVT2.mjs} +217 -52
  12. package/dist/chunk-OTJAPVT2.mjs.map +1 -0
  13. package/dist/{chunk-K3GZZFAC.mjs → chunk-V23POHG2.mjs} +10 -9
  14. package/dist/chunk-V23POHG2.mjs.map +1 -0
  15. package/dist/compiler-CTPLIZJK.mjs +9 -0
  16. package/dist/compiler-CTPLIZJK.mjs.map +1 -0
  17. package/dist/index.cjs +274 -58
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +3 -1
  20. package/dist/index.d.ts +3 -1
  21. package/dist/index.mjs +5 -4
  22. package/dist/server/app.cjs +7 -6
  23. package/dist/server/app.cjs.map +1 -1
  24. package/dist/server/app.mjs +1 -1
  25. package/dist/server-JXECWS4A.mjs +11 -0
  26. package/dist/{server-3TJZDKQC.mjs.map → server-JXECWS4A.mjs.map} +1 -1
  27. package/dist/web/playground/assets/main-Bod1taHc.js +188 -0
  28. package/dist/web/playground/assets/{statementBuilderFlow-DXlHS86r.js → statementBuilderFlow-CCaLco1R.js} +2 -2
  29. package/dist/web/playground/assets/{vendor-codemirror-BtJgoBjf.js → vendor-codemirror-C41SFn-r.js} +2 -2
  30. package/dist/web/playground/assets/vendor-g-NJOjvC.js +198 -0
  31. package/dist/web/playground/index.html +3 -3
  32. package/dist/web/playground/seed/core/chunks/canvas.2d3e2e0e.json +1 -0
  33. package/dist/web/playground/seed/core/manifest.json +7 -7
  34. package/dist/web/playground/seed/core/report.html +11 -11
  35. package/dist/web/server/assets/main-DtiBHHer.js +187 -0
  36. package/dist/web/server/assets/{statementBuilderFlow-CXugzTXB.js → statementBuilderFlow-MCfILbWE.js} +2 -2
  37. package/dist/web/server/assets/{vendor-codemirror-BtJgoBjf.js → vendor-codemirror-C41SFn-r.js} +2 -2
  38. package/dist/web/server/assets/vendor-g-NJOjvC.js +198 -0
  39. package/dist/web/server/index.html +3 -3
  40. package/dist/web/server/seed/core/chunks/canvas.2d3e2e0e.json +1 -0
  41. package/dist/web/server/seed/core/manifest.json +7 -7
  42. package/dist/web/server/seed/core/report.html +11 -11
  43. package/package.json +6 -8
  44. package/dist/chunk-32FASQP5.mjs.map +0 -1
  45. package/dist/chunk-B3QJYJVI.mjs.map +0 -1
  46. package/dist/chunk-EUQWEX6Z.mjs.map +0 -1
  47. package/dist/chunk-K3GZZFAC.mjs.map +0 -1
  48. package/dist/compiler-KT6P3AC6.mjs.map +0 -1
  49. package/dist/server-3TJZDKQC.mjs +0 -11
  50. package/dist/web/playground/assets/main-Bj_mxNMk.js +0 -212
  51. package/dist/web/playground/assets/vendor-BlJqgFME.js +0 -201
  52. package/dist/web/playground/seed/core/chunks/canvas.054cd7db.json +0 -1
  53. package/dist/web/server/assets/main-CfAVkURA.js +0 -211
  54. package/dist/web/server/assets/vendor-BlJqgFME.js +0 -201
  55. package/dist/web/server/seed/core/chunks/canvas.054cd7db.json +0 -1
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "schema": 8,
3
3
  "version": 1,
4
- "versionLabel": "eb473ba-dirty",
5
- "commit": "eb473ba9f899e00c32ae48e1c6ef57baf0e15da4",
4
+ "versionLabel": "6ca4956-dirty",
5
+ "commit": "6ca4956a6a0b692cfb9945a5cac03a68cc4746d5",
6
6
  "dirty": true,
7
- "builtAt": "2026-10-15T01:21:10.638Z",
7
+ "builtAt": "2026-10-16T00:57:36.414Z",
8
8
  "chunks": [
9
9
  {
10
10
  "id": "canvas",
11
- "path": "chunks/canvas.054cd7db.json",
12
- "sha256": "054cd7db0b15641caba8e101a19da419e93b92185084c3b96ce6686cbc991249",
13
- "bytes": 267699,
14
- "count": 87
11
+ "path": "chunks/canvas.2d3e2e0e.json",
12
+ "sha256": "2d3e2e0e0cc1b026e5b191711a681b90eb45f2a53884f4512f9942e2385fefce",
13
+ "bytes": 269508,
14
+ "count": 88
15
15
  },
16
16
  {
17
17
  "id": "template",
@@ -17,25 +17,25 @@
17
17
  <h1>Seed build report</h1>
18
18
  <h2>Version</h2>
19
19
  <dl>
20
- <dt>version</dt><dd>1 <code>eb473ba-dirty</code> <strong style="color:#b45309">(dirty working tree — not reproducible from <code>eb473ba9f899e00c32ae48e1c6ef57baf0e15da4</code>)</strong></dd>
21
- <dt>commit</dt><dd><code>eb473ba9f899e00c32ae48e1c6ef57baf0e15da4</code></dd>
22
- <dt>built at</dt><dd>2026-10-15T01:21:10.638Z</dd>
20
+ <dt>version</dt><dd>1 <code>6ca4956-dirty</code> <strong style="color:#b45309">(dirty working tree — not reproducible from <code>6ca4956a6a0b692cfb9945a5cac03a68cc4746d5</code>)</strong></dd>
21
+ <dt>commit</dt><dd><code>6ca4956a6a0b692cfb9945a5cac03a68cc4746d5</code></dd>
22
+ <dt>built at</dt><dd>2026-10-16T00:57:36.414Z</dd>
23
23
  <dt>schema</dt><dd>v8</dd>
24
24
  </dl>
25
25
  <h2>Benchmarks</h2>
26
26
  <dl>
27
- <dt>total</dt><dd>459 ms</dd>
28
- <dt>corpus scan + partition</dt><dd>2 ms (87 files)</dd>
29
- <dt>block-index derivation</dt><dd>263 ms</dd>
30
- <dt>block syntax gate</dt><dd>36 ms</dd>
31
- <dt>block-efforts derivation</dt><dd>51 ms</dd>
32
- <dt>chunk writes</dt><dd>11 ms</dd>
27
+ <dt>total</dt><dd>216 ms</dd>
28
+ <dt>corpus scan + partition</dt><dd>1 ms (88 files)</dd>
29
+ <dt>block-index derivation</dt><dd>108 ms</dd>
30
+ <dt>block syntax gate</dt><dd>17 ms</dd>
31
+ <dt>block-efforts derivation</dt><dd>25 ms</dd>
32
+ <dt>chunk writes</dt><dd>6 ms</dd>
33
33
  </dl>
34
- <h2>Chunks (2, 262 KB total)</h2>
34
+ <h2>Chunks (2, 264 KB total)</h2>
35
35
  <table>
36
36
  <thead><tr><th>id</th><th>kind</th><th>rows</th><th>size</th><th>sha256</th></tr></thead>
37
37
  <tbody>
38
- <tr><td>canvas</td><td>notes</td><td>87</td><td>261.4 KB</td><td><code>054cd7db</code></td></tr>
38
+ <tr><td>canvas</td><td>notes</td><td>88</td><td>263.2 KB</td><td><code>2d3e2e0e</code></td></tr>
39
39
  <tr><td>template</td><td>notes</td><td>1</td><td>0.8 KB</td><td><code>e5e0e82d</code></td></tr>
40
40
  </tbody>
41
41
  </table>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitcobblers/wod-wiki-tools",
3
- "version": "0.36.2134",
3
+ "version": "0.36.2135",
4
4
  "description": "CLI tools and server runner for Whiteboard Language & WQL engine",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -12,13 +12,11 @@
12
12
  },
13
13
  "exports": {
14
14
  ".": {
15
- "bun": "./src/index.ts",
16
15
  "types": "./dist/index.d.ts",
17
16
  "import": "./dist/index.mjs",
18
17
  "require": "./dist/index.cjs"
19
18
  },
20
19
  "./server": {
21
- "bun": "./src/server/app.ts",
22
20
  "types": "./dist/server/app.d.ts",
23
21
  "import": "./dist/server/app.mjs",
24
22
  "require": "./dist/server/app.cjs"
@@ -31,11 +29,11 @@
31
29
  "access": "public"
32
30
  },
33
31
  "dependencies": {
34
- "@bitcobblers/wod-wiki-core": "^0.36.2134",
35
- "@bitcobblers/wod-wiki-engine": "^0.36.2134",
36
- "@bitcobblers/wod-wiki-lang": "^0.36.2134",
37
- "@bitcobblers/wod-wiki-storage": "^0.36.2134",
38
- "@bitcobblers/wod-wiki-wql": "^0.36.2134",
32
+ "@bitcobblers/wod-wiki-core": "^0.36.2135",
33
+ "@bitcobblers/wod-wiki-engine": "^0.36.2135",
34
+ "@bitcobblers/wod-wiki-lang": "^0.36.2135",
35
+ "@bitcobblers/wod-wiki-storage": "^0.36.2135",
36
+ "@bitcobblers/wod-wiki-wql": "^0.36.2135",
39
37
  "@libsql/client": "^0.18.0"
40
38
  },
41
39
  "scripts": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/server.ts"],"names":["dist"],"mappings":"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","file":"chunk-32FASQP5.mjs","sourcesContent":["/**\n * server.ts — `wod server` (alias `serve`) / `wod playground` (Bun-only front\n * door).\n *\n * Serves the packaged engine stack: the shared fetch handler shipped in this\n * package (the same code the Docker image serves) plus the frontend build\n * packaged under the engine's dist/web/ — no repository checkout, no runtime\n * build.\n *\n * server probes the configured database first (never creates schema —\n * that's `wod init`), then serves API + SPA.\n * playground serves the browser-storage SPA build and never opens a database\n * (every /api request answers 404).\n *\n * Retains the event loop until SIGINT/SIGTERM; shutdown drains in-flight\n * requests before closing the database.\n */\n\nimport { openCliDb, nodeFs, nodePath } from './db';\nimport type { CliDatabaseConfig } from './config';\nimport type { CliDb } from './db';\nimport { createHandler } from '../server/app';\ntype WriteOut = (text: string) => void;\n\nexport type CliServerMode = 'server' | 'playground';\n\nexport interface CliServerOptions {\n /** Resolved database configuration. REQUIRED for 'server'; ignored — never\n * opened or validated — for 'playground'. */\n database?: CliDatabaseConfig;\n host?: string;\n port?: string;\n /** Explicit dist directory (flag or PLAYGROUND_DIST); must already exist. */\n dist?: string;\n /** Merged CLI environment (process env + .env). */\n env: Record<string, string | undefined>;\n}\n\ninterface BunServerLike { stop(): Promise<void> }\ninterface BunGlobalLike { serve(options: { port: number; hostname: string; fetch: (request: Request) => Promise<Response> }): BunServerLike }\n\nfunction bun(): BunGlobalLike {\n // Bun-specific global, absent from the ambient TS lib shapes on purpose\n // (engine stays Node-compilable); the access chain is proven at runtime.\n const b = (globalThis as { Bun?: BunGlobalLike }).Bun;\n if (!b) {\n throw new Error('wod server/playground requires the Bun runtime (https://bun.sh)');\n }\n return b;\n}\n\n/**\n * This module's directory, robust across shipped layouts: ESM via\n * import.meta.url (works under node and Bun; esbuild shims it in CJS too) and\n * Bun's import.meta.dir. ESM code splitting may relocate this module to a\n * chunk at dist/ root, so never assume dist/cli.\n */\nfunction moduleDir(): string {\n const p = nodePath();\n const meta: { dir?: unknown; url?: unknown } = import.meta; // Bun adds `dir`; the TS lib knows neither.\n if (typeof meta.dir === 'string') return p.resolve(meta.dir);\n if (typeof meta.url === 'string' && meta.url.startsWith('file:')) {\n return p.resolve(p.dirname(decodeURIComponent(new URL('.', meta.url).pathname)));\n }\n throw new Error('wod server/playground: cannot determine the installed engine module directory');\n}\n\n/**\n * The installed engine package root: nearest enclosing package.json belonging\n * to this package, walking up from the executing module (dist/cli, a split\n * chunk at dist/ root, dist/bin, or src/cli in a checkout).\n */\nfunction engineRoot(): string {\n const p = nodePath();\n const fs = nodeFs();\n for (let dir = moduleDir(); ; dir = p.dirname(dir)) {\n try {\n if (JSON.parse(fs.readFileSync(p.resolve(dir, 'package.json'), 'utf8')).name === '@bitcobblers/wod-wiki-tools') return dir;\n } catch { /* no manifest here — keep walking */ }\n const parent = p.dirname(dir);\n if (parent === dir) break;\n }\n throw new Error('wod server/playground: cannot locate the installed @bitcobblers/wod-wiki-tools package');\n}\n\n/**\n * Resolve the frontend dist directory. The packaged default lives inside the\n * installed engine module (dist/web/server or dist/web/playground); an\n * explicit --dist/PLAYGROUND_DIST is cwd-relative and must already contain a\n * built SPA (index.html). Nothing is built at runtime.\n */\nfunction resolveDist(mode: CliServerMode, options: CliServerOptions): string {\n const p = nodePath();\n const explicit = options.dist?.trim() || options.env.PLAYGROUND_DIST?.trim() || undefined;\n if (explicit) {\n const dist = p.resolve(explicit); // cwd-relative override\n if (!nodeFs().existsSync(p.resolve(dist, 'index.html'))) {\n throw new Error(\n `wod ${mode}: no built frontend (index.html) at ${dist} — --dist/PLAYGROUND_DIST must `\n + 'point at an already-built directory (the CLI never builds frontends at runtime)',\n );\n }\n return dist;\n }\n const dist = p.resolve(engineRoot(), 'dist', 'web', mode === 'playground' ? 'playground' : 'server');\n if (!nodeFs().existsSync(p.resolve(dist, 'index.html'))) {\n throw new Error(\n `wod ${mode}: packaged frontend missing — expected ${dist}/index.html. `\n + 'Reinstall @bitcobblers/wod-wiki-tools (bun add @bitcobblers/wod-wiki-tools), '\n + 'or rebuild the release assets from a checkout (bun run build:cli) and reinstall the package.',\n );\n }\n return dist;\n}\n\n/** Validate bind address first: flag > HOST/PORT env > loopback:3000. */\nfunction resolveBind(mode: CliServerMode, options: CliServerOptions): { host: string; port: number } {\n const host = options.host?.trim() || options.env.HOST?.trim() || '127.0.0.1';\n const rawPort = options.port?.trim() || options.env.PORT?.trim() || '3000';\n const port = Number(rawPort);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`wod ${mode}: invalid port ${JSON.stringify(rawPort)} (need integer 1..65535)`);\n }\n return { host, port };\n}\n\n/**\n * Start the shared server for `wod server` / `wod playground`. Throws on any\n * startup failure; on success it never returns until SIGINT/SIGTERM (drain,\n * close database, exit 0).\n */\nexport async function runCliServer(\n mode: CliServerMode,\n options: CliServerOptions,\n writeOut: WriteOut,\n): Promise<void> {\n const runtime = bun(); // Fail before any side effect when not under Bun.\n const { host, port } = resolveBind(mode, options); // Validate bind before opening anything.\n\n // Server probes the database BEFORE binding a socket: a missing/uninitialized\n // database refuses with `wod init` guidance.\n let db: CliDb | undefined;\n let dbLabel = 'no database';\n if (mode === 'server') {\n const database = options.database; // hoisted so the guard's narrowing sticks\n if (!database) {\n throw new Error('wod server: no database configuration resolved — this is a runner bug (expected resolveDatabaseConfig output)');\n }\n try {\n db = await openCliDb(database, { initialize: false });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n throw new Error(`wod server: database not ready — run \\`wod init\\` first. ${message}`, { cause: e });\n }\n dbLabel = db.path;\n }\n\n let server: BunServerLike;\n try {\n const dist = resolveDist(mode, options);\n // Bundled server handler\n const handler = createHandler(db?.db ?? null, { playgroundDist: dist });\n // Playground: no database exists to close — createHandler(null) answers\n server = runtime.serve({ port, hostname: host, fetch: handler });\n if (mode === 'server') {\n writeOut(`wod server: http://${host}:${port} — ${dbLabel} · dist ${dist}`);\n } else {\n writeOut(`wod playground: http://${host}:${port} — in-browser storage (no database) · dist ${dist}`);\n }\n } catch (e) {\n if (db) await db.close(); // never leak the probe connection when startup fails\n throw e;\n }\n\n let closing = false;\n const shutdown = async (): Promise<void> => {\n if (closing) process.exit(0); // second signal forces the exit\n closing = true;\n try {\n await server.stop();\n } finally {\n if (db) await db.close();\n process.exit(0);\n }\n };\n process.on('SIGINT', () => { void shutdown(); });\n process.on('SIGTERM', () => { void shutdown(); });\n\n // Park until a signal handler exits the process.\n await new Promise<never>(() => {});\n}\n"]}