2sagaco48 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/diagnostics.mjs +141 -0
- package/dist/compute.worker-j5ahIpF-.js +1 -0
- package/dist/graph.worker-DG6iGCB9.js +1 -0
- package/dist/index.html +2314 -0
- package/flatten-guide.md +248 -0
- package/index.html +12 -0
- package/package.json +38 -0
- package/src/App.orig.tsx +204 -0
- package/src/App.orig1.tsx +27 -0
- package/src/App.orig2.tsx +25 -0
- package/src/App.tsx +3 -0
- package/src/BaseApp.tsx +18 -0
- package/src/INTEGRATION_LEDGER.md +22 -0
- package/src/PERSIST_CANARY.orig.txt +1 -0
- package/src/PERSIST_CANARY.txt +1 -0
- package/src/REGRESSION_LEDGER.md +651 -0
- package/src/TEMPLATE_PIPELINE_AUDIT.md +208 -0
- package/src/WILLIAMS_PERSONA_GUIDE.md +62 -0
- package/src/chat/VeritasChat.tsx +69 -0
- package/src/chat/synthesis.ts +31 -0
- package/src/chat/tier.ts +45 -0
- package/src/components/AdaptersPage.orig.tsx +99 -0
- package/src/components/AdaptersPage.tsx +3 -0
- package/src/components/AdversarialPanel.tsx +136 -0
- package/src/components/AnchorBaselinePanel.tsx +75 -0
- package/src/components/AnswerPanel.tsx +60 -0
- package/src/components/ArtifactPanel.tsx +43 -0
- package/src/components/ChatApp.orig.tsx +1582 -0
- package/src/components/ChatApp.orig1.tsx +722 -0
- package/src/components/ChatApp.tsx +95 -0
- package/src/components/ChatAugmentPanels.tsx +73 -0
- package/src/components/CitationLedgerPanel.tsx +313 -0
- package/src/components/ComputeSandboxPanel.tsx +130 -0
- package/src/components/ConfigPanel.tsx +110 -0
- package/src/components/ControlPlanePage.tsx +195 -0
- package/src/components/CreativeTreeLifePage.tsx +234 -0
- package/src/components/CreativeTreeOfLifePanel.tsx +149 -0
- package/src/components/DebugTracePanel.tsx +137 -0
- package/src/components/DeepReasoningTrace.tsx +48 -0
- package/src/components/EntitySheetPanel.tsx +51 -0
- package/src/components/FailureModesPanel.tsx +104 -0
- package/src/components/GBSDashboard.tsx +239 -0
- package/src/components/GraphView.tsx +116 -0
- package/src/components/HUD.tsx +125 -0
- package/src/components/HypothesisPanel.tsx +67 -0
- package/src/components/InnovationGenomeEngine.tsx +792 -0
- package/src/components/InnovationPersonaGuide.tsx +348 -0
- package/src/components/InnovationPersonaPanel.tsx +289 -0
- package/src/components/LiveResourceHUD.tsx +109 -0
- package/src/components/LongWriterPanel.tsx +112 -0
- package/src/components/MainPipelineV10Bridge.tsx +72 -0
- package/src/components/MarkdownLite.tsx +63 -0
- package/src/components/MemoryInspector.tsx +38 -0
- package/src/components/MemoryMonitor.tsx +52 -0
- package/src/components/MemoryStressPanel.tsx +176 -0
- package/src/components/ModulesPage.tsx +171 -0
- package/src/components/PipelineDebugConsole.orig.tsx +1856 -0
- package/src/components/PipelineDebugConsole.tsx +3 -0
- package/src/components/PreFlightHUD.tsx +67 -0
- package/src/components/PrismaFetchTracePanel.tsx +87 -0
- package/src/components/ReportOSPanel.tsx +165 -0
- package/src/components/ResourceEstimatorPage.tsx +327 -0
- package/src/components/RichText.tsx +181 -0
- package/src/components/SagaOsPanel.tsx +605 -0
- package/src/components/SagaOsReference.tsx +421 -0
- package/src/components/SagaOsV2Panel.tsx +594 -0
- package/src/components/SagaStyleTab.tsx +382 -0
- package/src/components/SageBlueprintPanel.tsx +416 -0
- package/src/components/SharedChatInput.tsx +77 -0
- package/src/components/StatFinancePanel.tsx +190 -0
- package/src/components/StylePersonaPanel.tsx +128 -0
- package/src/components/TemplatesPage.tsx +300 -0
- package/src/components/TestPanel.tsx +63 -0
- package/src/components/TraceLog.tsx +89 -0
- package/src/components/V15CalibrationAugment.tsx +1134 -0
- package/src/components/V15CalibrationDialog.tsx +1871 -0
- package/src/components/V15Overlay.orig.tsx +120 -0
- package/src/components/V15Overlay.tsx +4 -0
- package/src/components/V15OverlayWrapper.tsx +362 -0
- package/src/components/V15Toggle.tsx +34 -0
- package/src/console/DiagnosticRecoveryPanel.tsx +358 -0
- package/src/console/EngineeringConsole.tsx +103 -0
- package/src/console/FictionSystemPanels.tsx +882 -0
- package/src/console/InspectorPanels.tsx +254 -0
- package/src/console/ManuscriptGraderPanel.tsx +182 -0
- package/src/console/RecursiveReviserPanel.tsx +245 -0
- package/src/console/SeedControlPanel.tsx +135 -0
- package/src/console/StoryControllerPanel.tsx +443 -0
- package/src/console/engineBridge.ts +258 -0
- package/src/console/gemini.ts +106 -0
- package/src/console/grading.ts +250 -0
- package/src/console/util.ts +45 -0
- package/src/fiction/continuity.ts +372 -0
- package/src/fiction/crash-protection.ts +111 -0
- package/src/fiction/diagnostics.ts +208 -0
- package/src/fiction/diff.ts +74 -0
- package/src/fiction/entity-state-machine.ts +214 -0
- package/src/fiction/nive-engine.ts +404 -0
- package/src/fiction/pipeline-selftest.ts +132 -0
- package/src/fiction/seed-control.ts +193 -0
- package/src/fiction/story-engine.ts +326 -0
- package/src/fiction/types.ts +68 -0
- package/src/flatten-guide.md +379 -0
- package/src/index.css +14 -0
- package/src/index.orig.css +13 -0
- package/src/lib/academic-sources.base.ts +188 -0
- package/src/lib/academic-sources.orig.ts +28 -0
- package/src/lib/academic-sources.ts +10 -0
- package/src/lib/advanced-math.ts +119 -0
- package/src/lib/adversarial-engine.base.ts +409 -0
- package/src/lib/adversarial-engine.ts +82 -0
- package/src/lib/ai-revision.ts +623 -0
- package/src/lib/app-state.tsx +426 -0
- package/src/lib/artifact-registry.ts +97 -0
- package/src/lib/artifacts.ts +180 -0
- package/src/lib/atlas-dr.ts +167 -0
- package/src/lib/browser-mtls.ts +127 -0
- package/src/lib/browser-queue.ts +221 -0
- package/src/lib/browser-search-scraper.base.ts +382 -0
- package/src/lib/browser-search-scraper.orig.ts +90 -0
- package/src/lib/browser-search-scraper.ts +10 -0
- package/src/lib/calc-interceptor.ts +82 -0
- package/src/lib/citation-lane-tap.ts +78 -0
- package/src/lib/citation-ledger-store.ts +369 -0
- package/src/lib/citation-ledger.ts +203 -0
- package/src/lib/compute-sandbox.ts +215 -0
- package/src/lib/compute.worker.ts +153 -0
- package/src/lib/connectors/gemini.ts +120 -0
- package/src/lib/connectors/jina.ts +233 -0
- package/src/lib/connectors/marketdata.ts +51 -0
- package/src/lib/connectors/prismafetch.base.ts +175 -0
- package/src/lib/connectors/prismafetch.ts +1 -0
- package/src/lib/connectors/serpapi.ts +65 -0
- package/src/lib/connectors/wikidata.ts +44 -0
- package/src/lib/constraints.ts +331 -0
- package/src/lib/continuation-detector.base.ts +153 -0
- package/src/lib/continuation-detector.ts +48 -0
- package/src/lib/contradraft.ts +168 -0
- package/src/lib/cors-proxy.ts +120 -0
- package/src/lib/coverage.ts +81 -0
- package/src/lib/debug/architecture-prescription.ts +556 -0
- package/src/lib/debug/covea-repair.ts +543 -0
- package/src/lib/debug/helios-ground.ts +319 -0
- package/src/lib/debug/intent-decomposer.ts +281 -0
- package/src/lib/debug/intent-lattice.ts +349 -0
- package/src/lib/debug/pipeline-diagnosis.ts +1149 -0
- package/src/lib/debug/pipeline-trace-bus.ts +424 -0
- package/src/lib/debug/prompt-forge.ts +678 -0
- package/src/lib/debug/repair-sites.ts +513 -0
- package/src/lib/debug/research-phase.ts +266 -0
- package/src/lib/debug/retrieval-context.ts +76 -0
- package/src/lib/debug/retrieval-hardener.ts +142 -0
- package/src/lib/debug/scraper-debug-runner.ts +576 -0
- package/src/lib/debug/scraper-forensics.ts +418 -0
- package/src/lib/debug/scraper-lane-roadmap.ts +136 -0
- package/src/lib/debug/self-test.ts +415 -0
- package/src/lib/debug/step-attribution.ts +211 -0
- package/src/lib/debug/template-rubric.ts +301 -0
- package/src/lib/debug/unified-innovation.ts +126 -0
- package/src/lib/debug/veritas-hybrid-scraper.ts +335 -0
- package/src/lib/defense-registry.ts +104 -0
- package/src/lib/defenses.ts +162 -0
- package/src/lib/deterministic-citation-ledger.ts +174 -0
- package/src/lib/elo-registry.base.ts +117 -0
- package/src/lib/elo-registry.ts +1 -0
- package/src/lib/entity-resolver.ts +291 -0
- package/src/lib/failure-modes.ts +267 -0
- package/src/lib/feature-registry.ts +69 -0
- package/src/lib/flaw-registry.ts +143 -0
- package/src/lib/flaws/_template.ts +52 -0
- package/src/lib/flaws/builtins.ts +63 -0
- package/src/lib/flaws/finance.ts +169 -0
- package/src/lib/flaws/fixers.ts +10 -0
- package/src/lib/flaws/index.ts +32 -0
- package/src/lib/flaws/legal.ts +157 -0
- package/src/lib/flaws/medical.ts +188 -0
- package/src/lib/flaws/original-defenses-pack.ts +81 -0
- package/src/lib/flaws/sample-declarative-pack.json +38 -0
- package/src/lib/flaws/selftest.ts +201 -0
- package/src/lib/flaws/software-extended.ts +125 -0
- package/src/lib/flaws/software-rn-webgl.ts +182 -0
- package/src/lib/flaws/statistics-advanced.ts +46 -0
- package/src/lib/flaws/statistics.ts +61 -0
- package/src/lib/gbse/config.ts +20 -0
- package/src/lib/gbse/engine.ts +226 -0
- package/src/lib/gbse/graph.ts +118 -0
- package/src/lib/gbse/graph.worker.ts +21 -0
- package/src/lib/gbse/tests.ts +117 -0
- package/src/lib/gbse/tiers.ts +65 -0
- package/src/lib/gbse/types.ts +94 -0
- package/src/lib/innovation-genome-engine-v2.orig.ts +1001 -0
- package/src/lib/innovation-genome-engine-v2.ts +3 -0
- package/src/lib/innovation-genome-engine.orig.ts +330 -0
- package/src/lib/innovation-genome-engine.ts +3 -0
- package/src/lib/innovation-genome-v10.orig.ts +314 -0
- package/src/lib/innovation-genome-v10.ts +2 -0
- package/src/lib/innovation-genome-v3.orig.ts +2015 -0
- package/src/lib/innovation-genome-v3.ts +2 -0
- package/src/lib/innovation-genome-v4.orig.ts +1959 -0
- package/src/lib/innovation-genome-v4.ts +2 -0
- package/src/lib/innovation-genome-v5.orig.ts +1210 -0
- package/src/lib/innovation-genome-v5.ts +2 -0
- package/src/lib/innovation-genome-v7.orig.ts +2549 -0
- package/src/lib/innovation-genome-v7.ts +2 -0
- package/src/lib/innovation-genome-v8.orig.ts +1485 -0
- package/src/lib/innovation-genome-v8.ts +2 -0
- package/src/lib/innovation-genome-v9.orig.ts +643 -0
- package/src/lib/innovation-genome-v9.ts +2 -0
- package/src/lib/jina.base.ts +293 -0
- package/src/lib/jina.ts +1 -0
- package/src/lib/live-telemetry.ts +61 -0
- package/src/lib/longwriter.ts +84 -0
- package/src/lib/manuscript-grade-v2.ts +298 -0
- package/src/lib/memory-governor.ts +173 -0
- package/src/lib/memory-stress-tests.ts +248 -0
- package/src/lib/model-intelligence.ts +48 -0
- package/src/lib/model-rotator.ts +75 -0
- package/src/lib/models.orig.ts +513 -0
- package/src/lib/models.ts +151 -0
- package/src/lib/n-deep.base.ts +592 -0
- package/src/lib/n-deep.ts +51 -0
- package/src/lib/nih-simulator.ts +56 -0
- package/src/lib/nih-vulnerability-fixes.ts +460 -0
- package/src/lib/omega-templates.base.ts +294 -0
- package/src/lib/omega-templates.ts +225 -0
- package/src/lib/omni-nexus.ts +64 -0
- package/src/lib/oracle-adapters.ts +67 -0
- package/src/lib/oracle-registry.ts +163 -0
- package/src/lib/orchestrator.ts +357 -0
- package/src/lib/output-boundary.ts +235 -0
- package/src/lib/overrides/vite-native-chaos-harness.ts +154 -0
- package/src/lib/overrides/vite-native-contract-plane.ts +245 -0
- package/src/lib/overrides/vite-native-doctor-plane.ts +208 -0
- package/src/lib/overrides/vite-native-knowledge-store.ts +267 -0
- package/src/lib/overrides/vite-native-policy-plane.ts +190 -0
- package/src/lib/overrides/vite-native-replay-plane.ts +197 -0
- package/src/lib/overrides/vite-native-runtime-plane.ts +106 -0
- package/src/lib/overrides/vite-native-scraper.ts +848 -0
- package/src/lib/overrides/vite-native-selftest-functional.ts +217 -0
- package/src/lib/overrides/vite-native-selftest.ts +183 -0
- package/src/lib/overrides/vite-native-snapshot-plane.ts +123 -0
- package/src/lib/philosophy-toolkit.ts +75 -0
- package/src/lib/pipeline.orig.ts +659 -0
- package/src/lib/pipeline.ts +42 -0
- package/src/lib/precache.ts +128 -0
- package/src/lib/py-sandbox.ts +205 -0
- package/src/lib/quality-score.ts +96 -0
- package/src/lib/quant-engine.ts +231 -0
- package/src/lib/quant-lib.ts +80 -0
- package/src/lib/reportos.ts +175 -0
- package/src/lib/research-os.ts +306 -0
- package/src/lib/resource-estimator.ts +114 -0
- package/src/lib/rpm-governor.ts +93 -0
- package/src/lib/runtime-estimator.ts +135 -0
- package/src/lib/sage/empty-space-v6.ts +560 -0
- package/src/lib/sage/empty-space-v7.ts +222 -0
- package/src/lib/sage/empty-space.ts +733 -0
- package/src/lib/sage/engine.ts +786 -0
- package/src/lib/sage/index.ts +17 -0
- package/src/lib/sage/judge.ts +246 -0
- package/src/lib/sage/prng.ts +53 -0
- package/src/lib/sage/reality-grounding.ts +380 -0
- package/src/lib/sage/repetition.ts +151 -0
- package/src/lib/sage/saga-os-v2-engines.ts +1870 -0
- package/src/lib/sage/saga-os-v2.ts +274 -0
- package/src/lib/sage/saga-os-v3-core.ts +1491 -0
- package/src/lib/sage/saga-os-v3-release.ts +739 -0
- package/src/lib/sage/saga-os-v4-aureate.ts +1161 -0
- package/src/lib/sage/saga-os-v4.ts +212 -0
- package/src/lib/sage/saga-os-v5.ts +205 -0
- package/src/lib/sage/saga-os-v6.ts +346 -0
- package/src/lib/sage/saga-os-v7.ts +314 -0
- package/src/lib/sage/saga-os-v8.ts +505 -0
- package/src/lib/sage/saga-os.ts +329 -0
- package/src/lib/sage/taxonomy.ts +403 -0
- package/src/lib/sage/unified-roll.ts +524 -0
- package/src/lib/sage/worked-sketches.ts +44 -0
- package/src/lib/sage.ts +166 -0
- package/src/lib/scraper-debug-bus.ts +53 -0
- package/src/lib/scraper-enhanced.orig.ts +153 -0
- package/src/lib/scraper-enhanced.ts +10 -0
- package/src/lib/scraper-hardener.base.orig.ts +155 -0
- package/src/lib/scraper-hardener.base.ts +317 -0
- package/src/lib/scraper-hardener.ts +1 -0
- package/src/lib/scraper-palisade/palisade-adjudicator.orig.ts +419 -0
- package/src/lib/scraper-palisade/palisade-adjudicator.ts +13 -0
- package/src/lib/scraper-vnext/arbiter-omega.orig.ts +688 -0
- package/src/lib/scraper-vnext/arbiter-omega.ts +13 -0
- package/src/lib/scraper-vnext/canonical-portfolio-augments.ts +479 -0
- package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.orig.ts +1529 -0
- package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.ts +13 -0
- package/src/lib/scraper-vnext/conclave-omega.ts +1830 -0
- package/src/lib/scraper-vnext/content-extractor-v2.ts +226 -0
- package/src/lib/scraper-vnext/diagnostics-suite.ts +36 -0
- package/src/lib/scraper-vnext/epistemic-packer.ts +97 -0
- package/src/lib/scraper-vnext/fusion-v2.ts +65 -0
- package/src/lib/scraper-vnext/hydra-reader.orig.ts +1216 -0
- package/src/lib/scraper-vnext/hydra-reader.ts +13 -0
- package/src/lib/scraper-vnext/native-scraper-browser-vnext.orig.ts +91 -0
- package/src/lib/scraper-vnext/native-scraper-browser-vnext.ts +13 -0
- package/src/lib/scraper-vnext/nexus-consensus.orig.ts +905 -0
- package/src/lib/scraper-vnext/nexus-consensus.ts +13 -0
- package/src/lib/scraper-vnext/portfolio-consensus-adjudicator.ts +804 -0
- package/src/lib/scraper-vnext/portfolio-consensus-memory.ts +377 -0
- package/src/lib/scraper-vnext/portfolio-terminal-governor.ts +548 -0
- package/src/lib/scraper-vnext/query-strategist.orig.ts +224 -0
- package/src/lib/scraper-vnext/query-strategist.ts +423 -0
- package/src/lib/scraper-vnext/retrieval-accelerator.ts +708 -0
- package/src/lib/scraper-vnext/retrieval-audit-augments.ts +477 -0
- package/src/lib/scraper-vnext/retrieval-control-plane.ts +904 -0
- package/src/lib/scraper-vnext/retrieval-policy-augments.ts +358 -0
- package/src/lib/scraper-vnext/safe-fetch-v2.ts +157 -0
- package/src/lib/scraper-vnext/sentinel-omega.ts +56 -0
- package/src/lib/scraper-vnext/sentinel-orchestrator.ts +69 -0
- package/src/lib/scraper-vnext/sibyl-oracle.orig.ts +413 -0
- package/src/lib/scraper-vnext/sibyl-oracle.ts +13 -0
- package/src/lib/scraper-vnext/smart-read-v2.ts +55 -0
- package/src/lib/scraper-vnext/spa-rescue-bridge.ts +608 -0
- package/src/lib/scraper-vnext/strata-engine.orig.ts +2666 -0
- package/src/lib/scraper-vnext/strata-engine.ts +13 -0
- package/src/lib/scraper-vnext/structured-source-adapter.orig.ts +369 -0
- package/src/lib/scraper-vnext/structured-source-adapter.ts +34 -0
- package/src/lib/scraper-vnext/terminal-complete.ts +224 -0
- package/src/lib/scraper-vnext/terminal-final.ts +277 -0
- package/src/lib/scraper-vnext/terminal-saturation.ts +345 -0
- package/src/lib/scraper-vnext/terminal-wire.ts +425 -0
- package/src/lib/scraper-vnext/vanguard-titanium.orig.ts +467 -0
- package/src/lib/scraper-vnext/vanguard-titanium.ts +17 -0
- package/src/lib/search-cache.ts +138 -0
- package/src/lib/sloop-runner.base.ts +223 -0
- package/src/lib/sloop-runner.ts +104 -0
- package/src/lib/sloop.ts +114 -0
- package/src/lib/small-model-adapters.ts +82 -0
- package/src/lib/sscp.ts +86 -0
- package/src/lib/system-map.ts +54 -0
- package/src/lib/uni-node.ts +86 -0
- package/src/lib/universal-rigor-guard.ts +433 -0
- package/src/lib/v15-gate-testbed.ts +274 -0
- package/src/lib/v15-gemini.base.ts +89 -0
- package/src/lib/v15-gemini.ts +1 -0
- package/src/lib/v15-grounding.orig.ts +241 -0
- package/src/lib/v15-grounding.ts +79 -0
- package/src/lib/v15-pipeline.base.ts +769 -0
- package/src/lib/v15-pipeline.orig.ts +1154 -0
- package/src/lib/v15-pipeline.ts +674 -0
- package/src/lib/v15-questions.ts +64 -0
- package/src/lib/v15-rate-limiter.orig.ts +91 -0
- package/src/lib/v15-rate-limiter.ts +48 -0
- package/src/lib/v15-state.base.ts +87 -0
- package/src/lib/v15-state.ts +28 -0
- package/src/lib/visual-table-generator.tsx +207 -0
- package/src/lib/wasm-runtime.ts +133 -0
- package/src/lib/williams-persona-guide.ts +265 -0
- package/src/lib/williams-style.base.ts +464 -0
- package/src/lib/williams-style.ts +59 -0
- package/src/lib/worker-pool.ts +96 -0
- package/src/lib/writing-tiers.ts +125 -0
- package/src/main.orig.tsx +10 -0
- package/src/main.tsx +10 -0
- package/src/utils/cn.orig.ts +6 -0
- package/src/utils/cn.ts +6 -0
- package/src/vite-env.d.ts +1 -0
- package/tsconfig.json +31 -0
- package/unify.mjs +537 -0
- package/vite.config.ts +18 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vite-native-replay-plane.ts — L3: Traffic Logging & Deterministic Diffing
|
|
3
|
+
* Zero-dependency: node:* only.
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
8
|
+
import { join, dirname } from 'node:path';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = dirname(__filename);
|
|
13
|
+
|
|
14
|
+
let DatabaseSync: any = null;
|
|
15
|
+
let dbAvailable = false;
|
|
16
|
+
try {
|
|
17
|
+
const anyProc: any = globalThis.process as any;
|
|
18
|
+
if (anyProc && typeof anyProc.getBuiltinModule === 'function') {
|
|
19
|
+
const mod = anyProc.getBuiltinModule('node:sqlite');
|
|
20
|
+
if (mod?.DatabaseSync) { DatabaseSync = mod.DatabaseSync; dbAvailable = true; }
|
|
21
|
+
}
|
|
22
|
+
} catch {}
|
|
23
|
+
if (!dbAvailable) {
|
|
24
|
+
try {
|
|
25
|
+
const req = createRequire(import.meta.url);
|
|
26
|
+
({ DatabaseSync } = req('node:sqlite'));
|
|
27
|
+
dbAvailable = !!DatabaseSync;
|
|
28
|
+
} catch { dbAvailable = false; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const AUDIT_DIR = join(__dirname, '..', '..', '..', 'src', 'audit');
|
|
32
|
+
const DB_PATH = join(AUDIT_DIR, 'knowledge.db');
|
|
33
|
+
|
|
34
|
+
let db: any = null;
|
|
35
|
+
|
|
36
|
+
function ensureDb(): boolean {
|
|
37
|
+
if (db) return true;
|
|
38
|
+
if (!dbAvailable) return false;
|
|
39
|
+
try {
|
|
40
|
+
if (!existsSync(AUDIT_DIR)) mkdirSync(AUDIT_DIR, { recursive: true });
|
|
41
|
+
db = new DatabaseSync(DB_PATH);
|
|
42
|
+
db.exec('PRAGMA journal_mode = WAL;');
|
|
43
|
+
db.exec('PRAGMA synchronous = NORMAL;');
|
|
44
|
+
db.exec('PRAGMA busy_timeout = 3000;');
|
|
45
|
+
db.exec(`
|
|
46
|
+
CREATE TABLE IF NOT EXISTS replay_log (
|
|
47
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
48
|
+
route TEXT NOT NULL,
|
|
49
|
+
requestJson TEXT NOT NULL,
|
|
50
|
+
responseJson TEXT NOT NULL,
|
|
51
|
+
statusCode INTEGER NOT NULL,
|
|
52
|
+
ok INTEGER NOT NULL,
|
|
53
|
+
durationMs REAL NOT NULL,
|
|
54
|
+
ts INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
`);
|
|
57
|
+
// Indices for fast querying — prevents table scans on rolling cap deletion
|
|
58
|
+
db.exec(`
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_replay_route ON replay_log(route);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_replay_ts ON replay_log(ts);
|
|
61
|
+
`);
|
|
62
|
+
return true;
|
|
63
|
+
} catch (e: any) {
|
|
64
|
+
console.warn('[replay-plane] DB init failed:', e?.message);
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const ROLLING_CAP = 5000;
|
|
70
|
+
const TRIM_COUNT = 1000;
|
|
71
|
+
|
|
72
|
+
function safeStringify(obj: unknown): string {
|
|
73
|
+
try {
|
|
74
|
+
// Guard against BigInt and circular references
|
|
75
|
+
return JSON.stringify(obj, (_k, v) => {
|
|
76
|
+
if (typeof v === 'bigint') return v.toString() + 'n';
|
|
77
|
+
return v;
|
|
78
|
+
});
|
|
79
|
+
} catch {
|
|
80
|
+
return JSON.stringify({ error: 'Unstringifiable object' });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface ReplayEntry {
|
|
85
|
+
id?: number;
|
|
86
|
+
route: string;
|
|
87
|
+
requestJson: string;
|
|
88
|
+
responseJson: string;
|
|
89
|
+
statusCode: number;
|
|
90
|
+
ok: boolean;
|
|
91
|
+
durationMs: number;
|
|
92
|
+
ts: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function recordReplay(entry: Omit<ReplayEntry, 'id' | 'ts'>): boolean {
|
|
96
|
+
if (!ensureDb()) return false;
|
|
97
|
+
try {
|
|
98
|
+
db.prepare(`
|
|
99
|
+
INSERT INTO replay_log (route, requestJson, responseJson, statusCode, ok, durationMs, ts)
|
|
100
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
101
|
+
`).run(
|
|
102
|
+
entry.route,
|
|
103
|
+
entry.requestJson,
|
|
104
|
+
entry.responseJson,
|
|
105
|
+
entry.statusCode,
|
|
106
|
+
entry.ok ? 1 : 0,
|
|
107
|
+
entry.durationMs,
|
|
108
|
+
Date.now(),
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
// Rolling cap enforcement
|
|
112
|
+
// Hand-trace: If table has 5001 rows after insert:
|
|
113
|
+
// SELECT COUNT(*) returns 5001 > 5000
|
|
114
|
+
// DELETE WHERE id IN (SELECT id FROM replay_log ORDER BY ts ASC LIMIT 1000)
|
|
115
|
+
// Deletes the 1000 oldest entries by timestamp (index on ts makes this efficient)
|
|
116
|
+
const count = (db.prepare(`SELECT COUNT(*) as c FROM replay_log`).get() as any)?.c ?? 0;
|
|
117
|
+
if (count > ROLLING_CAP) {
|
|
118
|
+
db.prepare(`
|
|
119
|
+
DELETE FROM replay_log WHERE id IN (
|
|
120
|
+
SELECT id FROM replay_log ORDER BY ts ASC LIMIT ${TRIM_COUNT}
|
|
121
|
+
)
|
|
122
|
+
`).run();
|
|
123
|
+
}
|
|
124
|
+
return true;
|
|
125
|
+
} catch { return false; }
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function getReplayLog(route?: string, limit = 50): ReplayEntry[] {
|
|
129
|
+
if (!ensureDb()) return [];
|
|
130
|
+
try {
|
|
131
|
+
if (route) {
|
|
132
|
+
return db.prepare(`SELECT * FROM replay_log WHERE route = ? ORDER BY ts DESC LIMIT ?`).all(route, limit) as ReplayEntry[];
|
|
133
|
+
}
|
|
134
|
+
return db.prepare(`SELECT * FROM replay_log ORDER BY ts DESC LIMIT ?`).all(limit) as ReplayEntry[];
|
|
135
|
+
} catch { return []; }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ── Deterministic Diffing ─────────────────────────────────────────────────
|
|
139
|
+
// Hand-trace: stored = {a:1, b:2}, current = {b:2, a:1}
|
|
140
|
+
// JSON.stringify({a:1,b:2}) = '{"a":1,"b":2}'
|
|
141
|
+
// JSON.stringify({b:2,a:1}) = '{"b":2,"a":1}'
|
|
142
|
+
// SHA-256 of both are DIFFERENT — key order matters in standard JSON.stringify
|
|
143
|
+
// => hashMatch = false, structuralDrift contains analysis
|
|
144
|
+
export interface ReplayDiff {
|
|
145
|
+
storedHash: string;
|
|
146
|
+
currentHash: string;
|
|
147
|
+
hashMatch: boolean;
|
|
148
|
+
addedKeys: string[];
|
|
149
|
+
removedKeys: string[];
|
|
150
|
+
statusDrift: boolean;
|
|
151
|
+
structuralDrift: boolean;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function summarizeReplayDiff(stored: unknown, current: unknown): ReplayDiff {
|
|
155
|
+
const storedStr = safeStringify(stored);
|
|
156
|
+
const currentStr = safeStringify(current);
|
|
157
|
+
const storedHash = createHash('sha256').update(storedStr).digest('hex');
|
|
158
|
+
const currentHash = createHash('sha256').update(currentStr).digest('hex');
|
|
159
|
+
const hashMatch = storedHash === currentHash;
|
|
160
|
+
|
|
161
|
+
let addedKeys: string[] = [];
|
|
162
|
+
let removedKeys: string[] = [];
|
|
163
|
+
let statusDrift = false;
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
if (typeof stored === 'object' && stored && typeof current === 'object' && current) {
|
|
167
|
+
const storedKeys = new Set(Object.keys(stored as object));
|
|
168
|
+
const currentKeys = new Set(Object.keys(current as object));
|
|
169
|
+
addedKeys = [...currentKeys].filter(k => !storedKeys.has(k));
|
|
170
|
+
removedKeys = [...storedKeys].filter(k => !currentKeys.has(k));
|
|
171
|
+
const s = stored as any;
|
|
172
|
+
const c = current as any;
|
|
173
|
+
if (s.statusCode !== undefined && c.statusCode !== undefined) {
|
|
174
|
+
statusDrift = s.statusCode !== c.statusCode;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
} catch {}
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
storedHash,
|
|
181
|
+
currentHash,
|
|
182
|
+
hashMatch,
|
|
183
|
+
addedKeys,
|
|
184
|
+
removedKeys,
|
|
185
|
+
statusDrift,
|
|
186
|
+
structuralDrift: addedKeys.length > 0 || removedKeys.length > 0 || statusDrift,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function getReplayStats(): { totalEntries: number; routes: string[] } {
|
|
191
|
+
if (!ensureDb()) return { totalEntries: 0, routes: [] };
|
|
192
|
+
try {
|
|
193
|
+
const total = (db.prepare(`SELECT COUNT(*) as c FROM replay_log`).get() as any)?.c ?? 0;
|
|
194
|
+
const routes = (db.prepare(`SELECT DISTINCT route FROM replay_log ORDER BY route`).all() as Array<{route:string}>).map(r => r.route);
|
|
195
|
+
return { totalEntries: total, routes };
|
|
196
|
+
} catch { return { totalEntries: 0, routes: [] }; }
|
|
197
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vite-native-runtime-plane.ts — L2: Telemetry & Event Loop Governor
|
|
3
|
+
* Monitor Node.js event loop lag and memory usage to shed load during high stress.
|
|
4
|
+
* Zero-dependency: node:perf_hooks, node:diagnostics_channel only.
|
|
5
|
+
*/
|
|
6
|
+
import { monitorEventLoopDelay } from 'node:perf_hooks';
|
|
7
|
+
import diagnosticsChannel from 'node:diagnostics_channel';
|
|
8
|
+
|
|
9
|
+
export type PressureLevel = 'ok' | 'warm' | 'hot';
|
|
10
|
+
|
|
11
|
+
export interface RuntimeEvent {
|
|
12
|
+
kind: string;
|
|
13
|
+
ts: number;
|
|
14
|
+
durationMs?: number;
|
|
15
|
+
meta?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface RuntimeStats {
|
|
19
|
+
pressure: PressureLevel;
|
|
20
|
+
eventLoopMeanMs: number;
|
|
21
|
+
eventLoopMaxMs: number;
|
|
22
|
+
rssBytes: number;
|
|
23
|
+
heapUsedBytes: number;
|
|
24
|
+
recentEventCount: number;
|
|
25
|
+
uptime: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ── Event Loop Governor ───────────────────────────────────────────────────
|
|
29
|
+
const lag = monitorEventLoopDelay({ resolution: 20 });
|
|
30
|
+
lag.enable();
|
|
31
|
+
|
|
32
|
+
// Reset timer every 60s — MUST .unref() to avoid zombie process
|
|
33
|
+
const lagResetTimer = setInterval(() => {
|
|
34
|
+
try { lag.reset(); } catch {}
|
|
35
|
+
}, 60_000);
|
|
36
|
+
(lagResetTimer as any).unref?.();
|
|
37
|
+
|
|
38
|
+
// ── Rolling Event Buffer — O(1) amortized ────────────────────────────────
|
|
39
|
+
// Hand-trace: After 505 emitRuntimeEvent calls:
|
|
40
|
+
// recentEvents.length reaches 501 after push
|
|
41
|
+
// splice(0, 501 - 500) = splice(0, 1)
|
|
42
|
+
// start=0, deleteCount=1
|
|
43
|
+
// Result: exactly MAX_EVENTS=500 elements remain
|
|
44
|
+
const recentEvents: RuntimeEvent[] = [];
|
|
45
|
+
const MAX_EVENTS = 500;
|
|
46
|
+
|
|
47
|
+
// Diagnostics channel for inter-module pub/sub
|
|
48
|
+
const channel = diagnosticsChannel.channel('vite-native-scraper.runtime');
|
|
49
|
+
|
|
50
|
+
// ── Pressure Calculation (exact thresholds) ───────────────────────────────
|
|
51
|
+
export function getRuntimeStats(): RuntimeStats {
|
|
52
|
+
// Guard against NaN/Infinity if lag not yet ticked
|
|
53
|
+
const meanMs = Number((lag as any).mean ?? 0) / 1e6 || 0;
|
|
54
|
+
const maxMs = Number((lag as any).max ?? 0) / 1e6 || 0;
|
|
55
|
+
const mem = process.memoryUsage();
|
|
56
|
+
|
|
57
|
+
// Hand-trace: rss=1073741825 (1GB+1byte)
|
|
58
|
+
// maxMs > 250 = depends on lag
|
|
59
|
+
// mem.rss > 1_073_741_824 = true (1073741825 > 1073741824)
|
|
60
|
+
// => pressure = 'hot'
|
|
61
|
+
const pressure: PressureLevel =
|
|
62
|
+
(maxMs > 250 || mem.rss > 1_073_741_824) ? 'hot' :
|
|
63
|
+
(maxMs > 80 || mem.rss > 536_870_912) ? 'warm' :
|
|
64
|
+
'ok';
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
pressure,
|
|
68
|
+
eventLoopMeanMs: Math.round(meanMs * 100) / 100,
|
|
69
|
+
eventLoopMaxMs: Math.round(maxMs * 100) / 100,
|
|
70
|
+
rssBytes: mem.rss,
|
|
71
|
+
heapUsedBytes: mem.heapUsed,
|
|
72
|
+
recentEventCount: recentEvents.length,
|
|
73
|
+
uptime: Math.floor(process.uptime()),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function getPressure(): PressureLevel {
|
|
78
|
+
return getRuntimeStats().pressure;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ── Load shedding decisions ───────────────────────────────────────────────
|
|
82
|
+
export function shouldDeferBackgroundWork(kind: 'prefetch' | 'rag' | 'cleanup' | string): boolean {
|
|
83
|
+
const { pressure } = getRuntimeStats();
|
|
84
|
+
if (pressure === 'hot') return true;
|
|
85
|
+
if (pressure === 'warm' && (kind === 'prefetch' || kind === 'rag')) return true;
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ── Event emission ────────────────────────────────────────────────────────
|
|
90
|
+
export function emitRuntimeEvent(ev: RuntimeEvent): void {
|
|
91
|
+
recentEvents.push(ev);
|
|
92
|
+
// MUST use splice, NOT shift() in a loop — avoids O(N) re-indexing
|
|
93
|
+
if (recentEvents.length > MAX_EVENTS) {
|
|
94
|
+
recentEvents.splice(0, recentEvents.length - MAX_EVENTS);
|
|
95
|
+
}
|
|
96
|
+
// Publish to diagnostics channel if subscribers exist
|
|
97
|
+
if (channel.hasSubscribers) channel.publish(ev);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function getRecentEvents(limit = 100): RuntimeEvent[] {
|
|
101
|
+
return recentEvents.slice(-Math.min(limit, MAX_EVENTS));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function clearEvents(): void {
|
|
105
|
+
recentEvents.splice(0, recentEvents.length);
|
|
106
|
+
}
|