Live dispatch smoke against the Turbopack dev server (master's ask, 2026-09-19) caught two things unit tests cannot - they run unbundled: - Bundling pdfjs-dist broke its node fake-worker: the chunk-relative pdf.worker.mjs import 404s inside .next/dev/server/chunks. Fix: serverExternalPackages + tracing includes for legacy/ + standard_fonts/ (next.config.ts - a clearly-marked seam, same precedent as bcdcd51; the standalone output now ships the worker and font files, verified). - Real-world PDFs warned about missing standardFontDataUrl (non-embedded standard fonts silently fall back) and flooded the log with JBIG2 warnings on scanned files. Fix: standardFontsDir() + verbosity 0 in both the node ops and the headless canvas shim. Verified live end-to-end on GEB (802pp, text layer): teacher dispatch, 12-step read with vision renders, brief with accurate page citations, wake turn folding the resolution (Chapter IX, pp. 268-270) into the lesson. Scanned/DRM Polya correctly refuses to fabricate citations.
53 lines
2.5 KiB
TypeScript
53 lines
2.5 KiB
TypeScript
import type { NextConfig } from "next";
|
|
|
|
const nextConfig: NextConfig = {
|
|
// Desktop target (Electron wrapper, 2026-09-17): standalone output = a
|
|
// self-contained .next/standalone/server.js the Electron shell spawns
|
|
// on 127.0.0.1. Harmless for plain web deploys (extra build output).
|
|
// The manual copies the docs require — public/ and .next/static — are
|
|
// done by scripts/build-server.mjs.
|
|
output: "standalone",
|
|
// SAFETY (empirically verified 2026-09-17): without this, output file
|
|
// tracing sweeps the repo's real data/ — chat records, graph ledgers —
|
|
// INTO the standalone bundle. A shipped desktop app would carry the
|
|
// developer's session data inside it.
|
|
outputFileTracingExcludes: {
|
|
"*": ["data/**/*"],
|
|
},
|
|
// Empirically verified gaps (2026-09-17 standalone smoke): the tracer
|
|
// misses JSON loaded via `import ... with { type: "json" }` attributes —
|
|
// pi-ai's provider catalog (39 JSON files) vanished from the trace and
|
|
// the server 500s on module load. Include the whole data dirs of the
|
|
// runtime-loaded engine packages.
|
|
// pdfjs-dist (sources v0 live smoke, 2026-09-19): its legacy build loads
|
|
// the node fake worker (pdf.worker.mjs) and our standard_fonts dir via
|
|
// runtime-resolved paths — invisible to the tracer. Bundling (without
|
|
// serverExternalPackages below) additionally breaks the worker's
|
|
// import.meta.url resolution inside .next/dev chunks — the live smoke
|
|
// caught it; unit tests run unbundled and never see it.
|
|
outputFileTracingIncludes: {
|
|
"*": [
|
|
"node_modules/pdfjs-dist/legacy/**/*",
|
|
"node_modules/pdfjs-dist/standard_fonts/**/*",
|
|
"node_modules/@earendil-works/pi-ai/dist/providers/data/**/*",
|
|
"node_modules/@earendil-works/pi-agent-core/dist/**/*.json",
|
|
// onnxruntime-node: the .node binding was traced, but its
|
|
// sibling dylib (libonnxruntime.*.dylib, dlopen'd via @rpath)
|
|
// was not — dlopen fails at module load.
|
|
"node_modules/onnxruntime-node/bin/**/*",
|
|
],
|
|
},
|
|
// Framework-free core lives in src/ (plain TS, imported by routes and CLI alike).
|
|
// The pi engine must stay external: its providers are runtime-loaded Node
|
|
// code (undici streams, catalog data) that breaks when bundled into routes.
|
|
// transformers.js (embeddings) is runtime-loaded ONNX — same reason as
|
|
// the pi engine: bundling onnxruntime-node breaks route builds.
|
|
serverExternalPackages: [
|
|
"@earendil-works/pi-ai",
|
|
"@earendil-works/pi-agent-core",
|
|
"@huggingface/transformers",
|
|
"pdfjs-dist", // sources v0: bundling breaks its node fake-worker path
|
|
],
|
|
};
|
|
|
|
export default nextConfig; |