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.
Files changed (365) hide show
  1. package/diagnostics.mjs +141 -0
  2. package/dist/compute.worker-j5ahIpF-.js +1 -0
  3. package/dist/graph.worker-DG6iGCB9.js +1 -0
  4. package/dist/index.html +2314 -0
  5. package/flatten-guide.md +248 -0
  6. package/index.html +12 -0
  7. package/package.json +38 -0
  8. package/src/App.orig.tsx +204 -0
  9. package/src/App.orig1.tsx +27 -0
  10. package/src/App.orig2.tsx +25 -0
  11. package/src/App.tsx +3 -0
  12. package/src/BaseApp.tsx +18 -0
  13. package/src/INTEGRATION_LEDGER.md +22 -0
  14. package/src/PERSIST_CANARY.orig.txt +1 -0
  15. package/src/PERSIST_CANARY.txt +1 -0
  16. package/src/REGRESSION_LEDGER.md +651 -0
  17. package/src/TEMPLATE_PIPELINE_AUDIT.md +208 -0
  18. package/src/WILLIAMS_PERSONA_GUIDE.md +62 -0
  19. package/src/chat/VeritasChat.tsx +69 -0
  20. package/src/chat/synthesis.ts +31 -0
  21. package/src/chat/tier.ts +45 -0
  22. package/src/components/AdaptersPage.orig.tsx +99 -0
  23. package/src/components/AdaptersPage.tsx +3 -0
  24. package/src/components/AdversarialPanel.tsx +136 -0
  25. package/src/components/AnchorBaselinePanel.tsx +75 -0
  26. package/src/components/AnswerPanel.tsx +60 -0
  27. package/src/components/ArtifactPanel.tsx +43 -0
  28. package/src/components/ChatApp.orig.tsx +1582 -0
  29. package/src/components/ChatApp.orig1.tsx +722 -0
  30. package/src/components/ChatApp.tsx +95 -0
  31. package/src/components/ChatAugmentPanels.tsx +73 -0
  32. package/src/components/CitationLedgerPanel.tsx +313 -0
  33. package/src/components/ComputeSandboxPanel.tsx +130 -0
  34. package/src/components/ConfigPanel.tsx +110 -0
  35. package/src/components/ControlPlanePage.tsx +195 -0
  36. package/src/components/CreativeTreeLifePage.tsx +234 -0
  37. package/src/components/CreativeTreeOfLifePanel.tsx +149 -0
  38. package/src/components/DebugTracePanel.tsx +137 -0
  39. package/src/components/DeepReasoningTrace.tsx +48 -0
  40. package/src/components/EntitySheetPanel.tsx +51 -0
  41. package/src/components/FailureModesPanel.tsx +104 -0
  42. package/src/components/GBSDashboard.tsx +239 -0
  43. package/src/components/GraphView.tsx +116 -0
  44. package/src/components/HUD.tsx +125 -0
  45. package/src/components/HypothesisPanel.tsx +67 -0
  46. package/src/components/InnovationGenomeEngine.tsx +792 -0
  47. package/src/components/InnovationPersonaGuide.tsx +348 -0
  48. package/src/components/InnovationPersonaPanel.tsx +289 -0
  49. package/src/components/LiveResourceHUD.tsx +109 -0
  50. package/src/components/LongWriterPanel.tsx +112 -0
  51. package/src/components/MainPipelineV10Bridge.tsx +72 -0
  52. package/src/components/MarkdownLite.tsx +63 -0
  53. package/src/components/MemoryInspector.tsx +38 -0
  54. package/src/components/MemoryMonitor.tsx +52 -0
  55. package/src/components/MemoryStressPanel.tsx +176 -0
  56. package/src/components/ModulesPage.tsx +171 -0
  57. package/src/components/PipelineDebugConsole.orig.tsx +1856 -0
  58. package/src/components/PipelineDebugConsole.tsx +3 -0
  59. package/src/components/PreFlightHUD.tsx +67 -0
  60. package/src/components/PrismaFetchTracePanel.tsx +87 -0
  61. package/src/components/ReportOSPanel.tsx +165 -0
  62. package/src/components/ResourceEstimatorPage.tsx +327 -0
  63. package/src/components/RichText.tsx +181 -0
  64. package/src/components/SagaOsPanel.tsx +605 -0
  65. package/src/components/SagaOsReference.tsx +421 -0
  66. package/src/components/SagaOsV2Panel.tsx +594 -0
  67. package/src/components/SagaStyleTab.tsx +382 -0
  68. package/src/components/SageBlueprintPanel.tsx +416 -0
  69. package/src/components/SharedChatInput.tsx +77 -0
  70. package/src/components/StatFinancePanel.tsx +190 -0
  71. package/src/components/StylePersonaPanel.tsx +128 -0
  72. package/src/components/TemplatesPage.tsx +300 -0
  73. package/src/components/TestPanel.tsx +63 -0
  74. package/src/components/TraceLog.tsx +89 -0
  75. package/src/components/V15CalibrationAugment.tsx +1134 -0
  76. package/src/components/V15CalibrationDialog.tsx +1871 -0
  77. package/src/components/V15Overlay.orig.tsx +120 -0
  78. package/src/components/V15Overlay.tsx +4 -0
  79. package/src/components/V15OverlayWrapper.tsx +362 -0
  80. package/src/components/V15Toggle.tsx +34 -0
  81. package/src/console/DiagnosticRecoveryPanel.tsx +358 -0
  82. package/src/console/EngineeringConsole.tsx +103 -0
  83. package/src/console/FictionSystemPanels.tsx +882 -0
  84. package/src/console/InspectorPanels.tsx +254 -0
  85. package/src/console/ManuscriptGraderPanel.tsx +182 -0
  86. package/src/console/RecursiveReviserPanel.tsx +245 -0
  87. package/src/console/SeedControlPanel.tsx +135 -0
  88. package/src/console/StoryControllerPanel.tsx +443 -0
  89. package/src/console/engineBridge.ts +258 -0
  90. package/src/console/gemini.ts +106 -0
  91. package/src/console/grading.ts +250 -0
  92. package/src/console/util.ts +45 -0
  93. package/src/fiction/continuity.ts +372 -0
  94. package/src/fiction/crash-protection.ts +111 -0
  95. package/src/fiction/diagnostics.ts +208 -0
  96. package/src/fiction/diff.ts +74 -0
  97. package/src/fiction/entity-state-machine.ts +214 -0
  98. package/src/fiction/nive-engine.ts +404 -0
  99. package/src/fiction/pipeline-selftest.ts +132 -0
  100. package/src/fiction/seed-control.ts +193 -0
  101. package/src/fiction/story-engine.ts +326 -0
  102. package/src/fiction/types.ts +68 -0
  103. package/src/flatten-guide.md +379 -0
  104. package/src/index.css +14 -0
  105. package/src/index.orig.css +13 -0
  106. package/src/lib/academic-sources.base.ts +188 -0
  107. package/src/lib/academic-sources.orig.ts +28 -0
  108. package/src/lib/academic-sources.ts +10 -0
  109. package/src/lib/advanced-math.ts +119 -0
  110. package/src/lib/adversarial-engine.base.ts +409 -0
  111. package/src/lib/adversarial-engine.ts +82 -0
  112. package/src/lib/ai-revision.ts +623 -0
  113. package/src/lib/app-state.tsx +426 -0
  114. package/src/lib/artifact-registry.ts +97 -0
  115. package/src/lib/artifacts.ts +180 -0
  116. package/src/lib/atlas-dr.ts +167 -0
  117. package/src/lib/browser-mtls.ts +127 -0
  118. package/src/lib/browser-queue.ts +221 -0
  119. package/src/lib/browser-search-scraper.base.ts +382 -0
  120. package/src/lib/browser-search-scraper.orig.ts +90 -0
  121. package/src/lib/browser-search-scraper.ts +10 -0
  122. package/src/lib/calc-interceptor.ts +82 -0
  123. package/src/lib/citation-lane-tap.ts +78 -0
  124. package/src/lib/citation-ledger-store.ts +369 -0
  125. package/src/lib/citation-ledger.ts +203 -0
  126. package/src/lib/compute-sandbox.ts +215 -0
  127. package/src/lib/compute.worker.ts +153 -0
  128. package/src/lib/connectors/gemini.ts +120 -0
  129. package/src/lib/connectors/jina.ts +233 -0
  130. package/src/lib/connectors/marketdata.ts +51 -0
  131. package/src/lib/connectors/prismafetch.base.ts +175 -0
  132. package/src/lib/connectors/prismafetch.ts +1 -0
  133. package/src/lib/connectors/serpapi.ts +65 -0
  134. package/src/lib/connectors/wikidata.ts +44 -0
  135. package/src/lib/constraints.ts +331 -0
  136. package/src/lib/continuation-detector.base.ts +153 -0
  137. package/src/lib/continuation-detector.ts +48 -0
  138. package/src/lib/contradraft.ts +168 -0
  139. package/src/lib/cors-proxy.ts +120 -0
  140. package/src/lib/coverage.ts +81 -0
  141. package/src/lib/debug/architecture-prescription.ts +556 -0
  142. package/src/lib/debug/covea-repair.ts +543 -0
  143. package/src/lib/debug/helios-ground.ts +319 -0
  144. package/src/lib/debug/intent-decomposer.ts +281 -0
  145. package/src/lib/debug/intent-lattice.ts +349 -0
  146. package/src/lib/debug/pipeline-diagnosis.ts +1149 -0
  147. package/src/lib/debug/pipeline-trace-bus.ts +424 -0
  148. package/src/lib/debug/prompt-forge.ts +678 -0
  149. package/src/lib/debug/repair-sites.ts +513 -0
  150. package/src/lib/debug/research-phase.ts +266 -0
  151. package/src/lib/debug/retrieval-context.ts +76 -0
  152. package/src/lib/debug/retrieval-hardener.ts +142 -0
  153. package/src/lib/debug/scraper-debug-runner.ts +576 -0
  154. package/src/lib/debug/scraper-forensics.ts +418 -0
  155. package/src/lib/debug/scraper-lane-roadmap.ts +136 -0
  156. package/src/lib/debug/self-test.ts +415 -0
  157. package/src/lib/debug/step-attribution.ts +211 -0
  158. package/src/lib/debug/template-rubric.ts +301 -0
  159. package/src/lib/debug/unified-innovation.ts +126 -0
  160. package/src/lib/debug/veritas-hybrid-scraper.ts +335 -0
  161. package/src/lib/defense-registry.ts +104 -0
  162. package/src/lib/defenses.ts +162 -0
  163. package/src/lib/deterministic-citation-ledger.ts +174 -0
  164. package/src/lib/elo-registry.base.ts +117 -0
  165. package/src/lib/elo-registry.ts +1 -0
  166. package/src/lib/entity-resolver.ts +291 -0
  167. package/src/lib/failure-modes.ts +267 -0
  168. package/src/lib/feature-registry.ts +69 -0
  169. package/src/lib/flaw-registry.ts +143 -0
  170. package/src/lib/flaws/_template.ts +52 -0
  171. package/src/lib/flaws/builtins.ts +63 -0
  172. package/src/lib/flaws/finance.ts +169 -0
  173. package/src/lib/flaws/fixers.ts +10 -0
  174. package/src/lib/flaws/index.ts +32 -0
  175. package/src/lib/flaws/legal.ts +157 -0
  176. package/src/lib/flaws/medical.ts +188 -0
  177. package/src/lib/flaws/original-defenses-pack.ts +81 -0
  178. package/src/lib/flaws/sample-declarative-pack.json +38 -0
  179. package/src/lib/flaws/selftest.ts +201 -0
  180. package/src/lib/flaws/software-extended.ts +125 -0
  181. package/src/lib/flaws/software-rn-webgl.ts +182 -0
  182. package/src/lib/flaws/statistics-advanced.ts +46 -0
  183. package/src/lib/flaws/statistics.ts +61 -0
  184. package/src/lib/gbse/config.ts +20 -0
  185. package/src/lib/gbse/engine.ts +226 -0
  186. package/src/lib/gbse/graph.ts +118 -0
  187. package/src/lib/gbse/graph.worker.ts +21 -0
  188. package/src/lib/gbse/tests.ts +117 -0
  189. package/src/lib/gbse/tiers.ts +65 -0
  190. package/src/lib/gbse/types.ts +94 -0
  191. package/src/lib/innovation-genome-engine-v2.orig.ts +1001 -0
  192. package/src/lib/innovation-genome-engine-v2.ts +3 -0
  193. package/src/lib/innovation-genome-engine.orig.ts +330 -0
  194. package/src/lib/innovation-genome-engine.ts +3 -0
  195. package/src/lib/innovation-genome-v10.orig.ts +314 -0
  196. package/src/lib/innovation-genome-v10.ts +2 -0
  197. package/src/lib/innovation-genome-v3.orig.ts +2015 -0
  198. package/src/lib/innovation-genome-v3.ts +2 -0
  199. package/src/lib/innovation-genome-v4.orig.ts +1959 -0
  200. package/src/lib/innovation-genome-v4.ts +2 -0
  201. package/src/lib/innovation-genome-v5.orig.ts +1210 -0
  202. package/src/lib/innovation-genome-v5.ts +2 -0
  203. package/src/lib/innovation-genome-v7.orig.ts +2549 -0
  204. package/src/lib/innovation-genome-v7.ts +2 -0
  205. package/src/lib/innovation-genome-v8.orig.ts +1485 -0
  206. package/src/lib/innovation-genome-v8.ts +2 -0
  207. package/src/lib/innovation-genome-v9.orig.ts +643 -0
  208. package/src/lib/innovation-genome-v9.ts +2 -0
  209. package/src/lib/jina.base.ts +293 -0
  210. package/src/lib/jina.ts +1 -0
  211. package/src/lib/live-telemetry.ts +61 -0
  212. package/src/lib/longwriter.ts +84 -0
  213. package/src/lib/manuscript-grade-v2.ts +298 -0
  214. package/src/lib/memory-governor.ts +173 -0
  215. package/src/lib/memory-stress-tests.ts +248 -0
  216. package/src/lib/model-intelligence.ts +48 -0
  217. package/src/lib/model-rotator.ts +75 -0
  218. package/src/lib/models.orig.ts +513 -0
  219. package/src/lib/models.ts +151 -0
  220. package/src/lib/n-deep.base.ts +592 -0
  221. package/src/lib/n-deep.ts +51 -0
  222. package/src/lib/nih-simulator.ts +56 -0
  223. package/src/lib/nih-vulnerability-fixes.ts +460 -0
  224. package/src/lib/omega-templates.base.ts +294 -0
  225. package/src/lib/omega-templates.ts +225 -0
  226. package/src/lib/omni-nexus.ts +64 -0
  227. package/src/lib/oracle-adapters.ts +67 -0
  228. package/src/lib/oracle-registry.ts +163 -0
  229. package/src/lib/orchestrator.ts +357 -0
  230. package/src/lib/output-boundary.ts +235 -0
  231. package/src/lib/overrides/vite-native-chaos-harness.ts +154 -0
  232. package/src/lib/overrides/vite-native-contract-plane.ts +245 -0
  233. package/src/lib/overrides/vite-native-doctor-plane.ts +208 -0
  234. package/src/lib/overrides/vite-native-knowledge-store.ts +267 -0
  235. package/src/lib/overrides/vite-native-policy-plane.ts +190 -0
  236. package/src/lib/overrides/vite-native-replay-plane.ts +197 -0
  237. package/src/lib/overrides/vite-native-runtime-plane.ts +106 -0
  238. package/src/lib/overrides/vite-native-scraper.ts +848 -0
  239. package/src/lib/overrides/vite-native-selftest-functional.ts +217 -0
  240. package/src/lib/overrides/vite-native-selftest.ts +183 -0
  241. package/src/lib/overrides/vite-native-snapshot-plane.ts +123 -0
  242. package/src/lib/philosophy-toolkit.ts +75 -0
  243. package/src/lib/pipeline.orig.ts +659 -0
  244. package/src/lib/pipeline.ts +42 -0
  245. package/src/lib/precache.ts +128 -0
  246. package/src/lib/py-sandbox.ts +205 -0
  247. package/src/lib/quality-score.ts +96 -0
  248. package/src/lib/quant-engine.ts +231 -0
  249. package/src/lib/quant-lib.ts +80 -0
  250. package/src/lib/reportos.ts +175 -0
  251. package/src/lib/research-os.ts +306 -0
  252. package/src/lib/resource-estimator.ts +114 -0
  253. package/src/lib/rpm-governor.ts +93 -0
  254. package/src/lib/runtime-estimator.ts +135 -0
  255. package/src/lib/sage/empty-space-v6.ts +560 -0
  256. package/src/lib/sage/empty-space-v7.ts +222 -0
  257. package/src/lib/sage/empty-space.ts +733 -0
  258. package/src/lib/sage/engine.ts +786 -0
  259. package/src/lib/sage/index.ts +17 -0
  260. package/src/lib/sage/judge.ts +246 -0
  261. package/src/lib/sage/prng.ts +53 -0
  262. package/src/lib/sage/reality-grounding.ts +380 -0
  263. package/src/lib/sage/repetition.ts +151 -0
  264. package/src/lib/sage/saga-os-v2-engines.ts +1870 -0
  265. package/src/lib/sage/saga-os-v2.ts +274 -0
  266. package/src/lib/sage/saga-os-v3-core.ts +1491 -0
  267. package/src/lib/sage/saga-os-v3-release.ts +739 -0
  268. package/src/lib/sage/saga-os-v4-aureate.ts +1161 -0
  269. package/src/lib/sage/saga-os-v4.ts +212 -0
  270. package/src/lib/sage/saga-os-v5.ts +205 -0
  271. package/src/lib/sage/saga-os-v6.ts +346 -0
  272. package/src/lib/sage/saga-os-v7.ts +314 -0
  273. package/src/lib/sage/saga-os-v8.ts +505 -0
  274. package/src/lib/sage/saga-os.ts +329 -0
  275. package/src/lib/sage/taxonomy.ts +403 -0
  276. package/src/lib/sage/unified-roll.ts +524 -0
  277. package/src/lib/sage/worked-sketches.ts +44 -0
  278. package/src/lib/sage.ts +166 -0
  279. package/src/lib/scraper-debug-bus.ts +53 -0
  280. package/src/lib/scraper-enhanced.orig.ts +153 -0
  281. package/src/lib/scraper-enhanced.ts +10 -0
  282. package/src/lib/scraper-hardener.base.orig.ts +155 -0
  283. package/src/lib/scraper-hardener.base.ts +317 -0
  284. package/src/lib/scraper-hardener.ts +1 -0
  285. package/src/lib/scraper-palisade/palisade-adjudicator.orig.ts +419 -0
  286. package/src/lib/scraper-palisade/palisade-adjudicator.ts +13 -0
  287. package/src/lib/scraper-vnext/arbiter-omega.orig.ts +688 -0
  288. package/src/lib/scraper-vnext/arbiter-omega.ts +13 -0
  289. package/src/lib/scraper-vnext/canonical-portfolio-augments.ts +479 -0
  290. package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.orig.ts +1529 -0
  291. package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.ts +13 -0
  292. package/src/lib/scraper-vnext/conclave-omega.ts +1830 -0
  293. package/src/lib/scraper-vnext/content-extractor-v2.ts +226 -0
  294. package/src/lib/scraper-vnext/diagnostics-suite.ts +36 -0
  295. package/src/lib/scraper-vnext/epistemic-packer.ts +97 -0
  296. package/src/lib/scraper-vnext/fusion-v2.ts +65 -0
  297. package/src/lib/scraper-vnext/hydra-reader.orig.ts +1216 -0
  298. package/src/lib/scraper-vnext/hydra-reader.ts +13 -0
  299. package/src/lib/scraper-vnext/native-scraper-browser-vnext.orig.ts +91 -0
  300. package/src/lib/scraper-vnext/native-scraper-browser-vnext.ts +13 -0
  301. package/src/lib/scraper-vnext/nexus-consensus.orig.ts +905 -0
  302. package/src/lib/scraper-vnext/nexus-consensus.ts +13 -0
  303. package/src/lib/scraper-vnext/portfolio-consensus-adjudicator.ts +804 -0
  304. package/src/lib/scraper-vnext/portfolio-consensus-memory.ts +377 -0
  305. package/src/lib/scraper-vnext/portfolio-terminal-governor.ts +548 -0
  306. package/src/lib/scraper-vnext/query-strategist.orig.ts +224 -0
  307. package/src/lib/scraper-vnext/query-strategist.ts +423 -0
  308. package/src/lib/scraper-vnext/retrieval-accelerator.ts +708 -0
  309. package/src/lib/scraper-vnext/retrieval-audit-augments.ts +477 -0
  310. package/src/lib/scraper-vnext/retrieval-control-plane.ts +904 -0
  311. package/src/lib/scraper-vnext/retrieval-policy-augments.ts +358 -0
  312. package/src/lib/scraper-vnext/safe-fetch-v2.ts +157 -0
  313. package/src/lib/scraper-vnext/sentinel-omega.ts +56 -0
  314. package/src/lib/scraper-vnext/sentinel-orchestrator.ts +69 -0
  315. package/src/lib/scraper-vnext/sibyl-oracle.orig.ts +413 -0
  316. package/src/lib/scraper-vnext/sibyl-oracle.ts +13 -0
  317. package/src/lib/scraper-vnext/smart-read-v2.ts +55 -0
  318. package/src/lib/scraper-vnext/spa-rescue-bridge.ts +608 -0
  319. package/src/lib/scraper-vnext/strata-engine.orig.ts +2666 -0
  320. package/src/lib/scraper-vnext/strata-engine.ts +13 -0
  321. package/src/lib/scraper-vnext/structured-source-adapter.orig.ts +369 -0
  322. package/src/lib/scraper-vnext/structured-source-adapter.ts +34 -0
  323. package/src/lib/scraper-vnext/terminal-complete.ts +224 -0
  324. package/src/lib/scraper-vnext/terminal-final.ts +277 -0
  325. package/src/lib/scraper-vnext/terminal-saturation.ts +345 -0
  326. package/src/lib/scraper-vnext/terminal-wire.ts +425 -0
  327. package/src/lib/scraper-vnext/vanguard-titanium.orig.ts +467 -0
  328. package/src/lib/scraper-vnext/vanguard-titanium.ts +17 -0
  329. package/src/lib/search-cache.ts +138 -0
  330. package/src/lib/sloop-runner.base.ts +223 -0
  331. package/src/lib/sloop-runner.ts +104 -0
  332. package/src/lib/sloop.ts +114 -0
  333. package/src/lib/small-model-adapters.ts +82 -0
  334. package/src/lib/sscp.ts +86 -0
  335. package/src/lib/system-map.ts +54 -0
  336. package/src/lib/uni-node.ts +86 -0
  337. package/src/lib/universal-rigor-guard.ts +433 -0
  338. package/src/lib/v15-gate-testbed.ts +274 -0
  339. package/src/lib/v15-gemini.base.ts +89 -0
  340. package/src/lib/v15-gemini.ts +1 -0
  341. package/src/lib/v15-grounding.orig.ts +241 -0
  342. package/src/lib/v15-grounding.ts +79 -0
  343. package/src/lib/v15-pipeline.base.ts +769 -0
  344. package/src/lib/v15-pipeline.orig.ts +1154 -0
  345. package/src/lib/v15-pipeline.ts +674 -0
  346. package/src/lib/v15-questions.ts +64 -0
  347. package/src/lib/v15-rate-limiter.orig.ts +91 -0
  348. package/src/lib/v15-rate-limiter.ts +48 -0
  349. package/src/lib/v15-state.base.ts +87 -0
  350. package/src/lib/v15-state.ts +28 -0
  351. package/src/lib/visual-table-generator.tsx +207 -0
  352. package/src/lib/wasm-runtime.ts +133 -0
  353. package/src/lib/williams-persona-guide.ts +265 -0
  354. package/src/lib/williams-style.base.ts +464 -0
  355. package/src/lib/williams-style.ts +59 -0
  356. package/src/lib/worker-pool.ts +96 -0
  357. package/src/lib/writing-tiers.ts +125 -0
  358. package/src/main.orig.tsx +10 -0
  359. package/src/main.tsx +10 -0
  360. package/src/utils/cn.orig.ts +6 -0
  361. package/src/utils/cn.ts +6 -0
  362. package/src/vite-env.d.ts +1 -0
  363. package/tsconfig.json +31 -0
  364. package/unify.mjs +537 -0
  365. package/vite.config.ts +18 -0
@@ -0,0 +1,239 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { ConfigPanel } from "./ConfigPanel";
3
+ import { HypothesisPanel } from "./HypothesisPanel";
4
+ import { TraceLog } from "./TraceLog";
5
+ import { HUD } from "./HUD";
6
+ import { GraphView } from "./GraphView";
7
+ import { AnswerPanel } from "./AnswerPanel";
8
+ import { TestPanel } from "./TestPanel";
9
+ import { FailureModesPanel } from "./FailureModesPanel";
10
+ import { ReportOSPanel } from "./ReportOSPanel";
11
+ import { LiveResourceHUD } from "./LiveResourceHUD";
12
+ import type { GeminiModel } from "../lib/connectors/gemini";
13
+ import { runResearch, type ApiKeys as OrchKeys, type SearchProvider, type TraceEvt } from "../lib/orchestrator";
14
+ import type { BeliefState } from "../lib/gbse/types";
15
+ import type { RelevanceGraph } from "../lib/gbse/graph";
16
+ import { useAppState } from "../lib/app-state";
17
+ import { extractConstraints, summarizeConstraints } from "../lib/constraints";
18
+ import { TIERS } from "../lib/gbse/tiers";
19
+
20
+ const EXAMPLES = [
21
+ "Is a heat pump lower-carbon than a gas furnace in a cold climate?",
22
+ "Does intermittent fasting cause meaningful weight loss in healthy adults?",
23
+ "Is Rust faster than Go for I/O-bound network services?",
24
+ "What are the key failure modes of lithium-ion battery packs at scale?",
25
+ ];
26
+
27
+ export function GBSDashboard() {
28
+ const app = useAppState();
29
+ const keys = app.keys;
30
+
31
+ const [hypothesisModel, setHypothesisModel] = useState<GeminiModel>("gemini-2.5-flash");
32
+ const [scoringModel, setScoringModel] = useState<GeminiModel>("gemini-2.5-flash-lite");
33
+ const [searchProvider, setSearchProvider] = useState<SearchProvider>("jina");
34
+ const [useJinaRerank, setUseJinaRerank] = useState(true);
35
+ const [tier, setTier] = useState<number | "auto">("auto");
36
+
37
+ const orchKeys: OrchKeys = {
38
+ gemini: keys.gemini,
39
+ jina: keys.jina,
40
+ serpapi: keys.serpapi,
41
+ serpapiProxy: keys.serpapiProxy,
42
+ };
43
+
44
+ const [running, setRunning] = useState(false);
45
+ const [events, setEvents] = useState<TraceEvt[]>([]);
46
+ const [state, setState] = useState<BeliefState | null>(null);
47
+ const [graph, setGraph] = useState<RelevanceGraph | null>(null);
48
+ const [answer, setAnswer] = useState("");
49
+ const [totalTokens, setTotalTokens] = useState(0);
50
+ const [actualTier, setActualTier] = useState<number | null>(null);
51
+ const [startMs, setStartMs] = useState(0);
52
+ const [elapsedMs, setElapsedMs] = useState(0);
53
+ const [error, setError] = useState<string | null>(null);
54
+ const abortRef = useRef<AbortController | null>(null);
55
+
56
+ useEffect(() => {
57
+ if (!running) return;
58
+ const id = window.setInterval(() => setElapsedMs(Date.now() - startMs), 200);
59
+ return () => window.clearInterval(id);
60
+ }, [running, startMs]);
61
+
62
+ const constraints = app.input.trim() ? extractConstraints(app.input) : null;
63
+ const tierSpec = actualTier !== null ? TIERS[actualTier] : null;
64
+
65
+ // Prefer this page's own run; otherwise show the shared belief state/graph
66
+ // produced by the legacy Bayesian engine on the LAST chat input (real data).
67
+ const liveState = state ?? app.beliefState;
68
+ const liveGraph = graph ?? app.relevanceGraph;
69
+
70
+ async function handleRun() {
71
+ if (!keys.gemini) { setError("Gemini API key required (set in Chat → Keys)."); return; }
72
+ if (!app.input.trim()) { setError("Enter a query in the shared input above."); return; }
73
+ setError(null); setEvents([]); setState(null); setGraph(null);
74
+ setAnswer(""); setTotalTokens(0); setActualTier(null);
75
+ setRunning(true); setStartMs(Date.now()); setElapsedMs(0);
76
+ app.pushDebugEvent("GBSE dashboard run started");
77
+ const controller = new AbortController();
78
+ abortRef.current = controller;
79
+ try {
80
+ const result = await runResearch({
81
+ query: app.input, keys: orchKeys, hypothesisModel, scoringModel,
82
+ searchProvider, useJinaRerank,
83
+ tierOverride: tier === "auto" ? undefined : tier,
84
+ signal: controller.signal,
85
+ onEvent: (e) => {
86
+ setEvents(prev => [...prev, e]);
87
+ app.pushDebugEvent(`[GBSE] [${e.phase}] ${e.message}`);
88
+ if (e.phase === "tier" && e.data && typeof e.data === "object" && "tier" in e.data) {
89
+ setActualTier((e.data as { tier: number }).tier);
90
+ }
91
+ },
92
+ onState: (s, g, toks) => {
93
+ setState({ ...s, hyps: { ...s.hyps } });
94
+ setGraph(g);
95
+ setTotalTokens(toks);
96
+ },
97
+ });
98
+ setState(result.state); setGraph(result.graph);
99
+ setAnswer(result.finalAnswer); setTotalTokens(result.totalTokens);
100
+ setActualTier(result.tier);
101
+ app.setLastRun({
102
+ query: app.input, model: hypothesisModel as unknown as import("../lib/models").ModelId,
103
+ finalAnswer: result.finalAnswer, totalTokens: result.totalTokens,
104
+ elapsedMs: Date.now() - startMs, sources: result.graph?.nodes.size ?? 0,
105
+ verifiedClaims: 0, totalClaims: Object.keys(result.state.hyps).length,
106
+ constraints: constraints ?? undefined, startedAt: startMs, finishedAt: Date.now(),
107
+ });
108
+ app.pushDebugEvent(`GBSE run complete — ${Object.keys(result.state.hyps).length} hypotheses`);
109
+ } catch (err) {
110
+ const msg = err instanceof Error ? err.message : String(err);
111
+ setError(msg);
112
+ setEvents(prev => [...prev, { ts: Date.now(), phase: "error", level: "error", message: msg }]);
113
+ } finally { setRunning(false); }
114
+ }
115
+
116
+ return (
117
+ <div className="bg-zinc-50 pb-10">
118
+ <div className="mx-auto max-w-7xl space-y-4 px-4 py-5">
119
+ {/* Header */}
120
+ <div className="rounded-2xl border border-zinc-200 bg-white p-5 shadow-sm">
121
+ <div className="flex flex-wrap items-center justify-between gap-3">
122
+ <div>
123
+ <div className="text-xs font-bold uppercase tracking-[0.2em] text-indigo-600">Advanced Dashboard</div>
124
+ <h1 className="mt-0.5 text-xl font-bold text-zinc-900">GBSE — Bayesian Belief Search Engine</h1>
125
+ <p className="mt-1 text-sm text-zinc-500">Log-odds · Wald SPRT · Signed Personalized PageRank · Hypothesis pruning</p>
126
+ </div>
127
+ {tierSpec && (
128
+ <div className="rounded-xl border border-indigo-200 bg-indigo-50 px-4 py-2 text-center">
129
+ <div className="text-[10px] font-bold uppercase tracking-wider text-indigo-500">Active tier</div>
130
+ <div className="font-mono text-lg font-bold text-indigo-900">{tierSpec.name}</div>
131
+ <div className="text-[10px] text-indigo-600">{(tierSpec.forecastCoverage * 100).toFixed(0)}% coverage · {(tierSpec.maxTokens / 1000).toFixed(0)}K tokens</div>
132
+ </div>
133
+ )}
134
+ </div>
135
+ </div>
136
+
137
+ <ConfigPanel
138
+ hypothesisModel={hypothesisModel} setHypothesisModel={setHypothesisModel}
139
+ scoringModel={scoringModel} setScoringModel={setScoringModel}
140
+ searchProvider={searchProvider} setSearchProvider={setSearchProvider}
141
+ useJinaRerank={useJinaRerank} setUseJinaRerank={setUseJinaRerank}
142
+ tier={tier} setTier={setTier}
143
+ />
144
+
145
+ {/* Shared query input */}
146
+ <div className="rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm">
147
+ <div className="flex flex-wrap items-center justify-between gap-2 mb-2">
148
+ <label className="text-xs font-bold uppercase tracking-wider text-zinc-500">Research query (shared across all pages)</label>
149
+ {constraints && (
150
+ <span className="rounded-full border border-indigo-100 bg-indigo-50 px-2 py-0.5 font-mono text-[10px] text-indigo-800">
151
+ constraints: {summarizeConstraints(constraints)}
152
+ </span>
153
+ )}
154
+ </div>
155
+ <textarea
156
+ value={app.input}
157
+ onChange={e => app.setInput(e.target.value)}
158
+ rows={2}
159
+ className="w-full resize-none rounded-xl border border-zinc-300 bg-white px-4 py-2.5 text-sm text-zinc-900 outline-none focus:border-indigo-500"
160
+ placeholder="Query is shared with Chat tab. Edits here appear there and vice versa."
161
+ />
162
+ <div className="mt-2 flex flex-wrap items-center gap-2">
163
+ <button onClick={handleRun} disabled={running || !app.input.trim()}
164
+ className="rounded-xl bg-emerald-600 px-5 py-2.5 text-sm font-bold text-white hover:bg-emerald-700 disabled:opacity-40 disabled:cursor-not-allowed">
165
+ {running ? "Running…" : "Run Bayesian Search"}
166
+ </button>
167
+ {running && (
168
+ <button onClick={() => { abortRef.current?.abort(); setRunning(false); }}
169
+ className="rounded-xl border border-zinc-300 px-4 py-2.5 text-sm text-zinc-700 hover:bg-zinc-100">
170
+ Stop
171
+ </button>
172
+ )}
173
+ <div className="flex flex-wrap gap-1">
174
+ {EXAMPLES.map(q => (
175
+ <button key={q} onClick={() => app.setInput(q)} disabled={running}
176
+ className="rounded-lg border border-zinc-200 px-2 py-1 text-[11px] text-zinc-600 hover:bg-zinc-100 disabled:opacity-40">
177
+ {q.slice(0, 38)}…
178
+ </button>
179
+ ))}
180
+ </div>
181
+ </div>
182
+ {error && <div className="mt-2 rounded-xl border border-rose-200 bg-rose-50 px-3 py-2 text-sm text-rose-800">{error}</div>}
183
+ </div>
184
+
185
+ {/* Live Resource HUD */}
186
+ <LiveResourceHUD />
187
+
188
+ {/* AEGIS-PHI HUD */}
189
+ <div className="grid md:grid-cols-2 gap-4">
190
+ <HUD state={liveState} tier={actualTier} totalTokens={totalTokens}
191
+ graphNodes={liveGraph?.nodes.size ?? 0} graphEdges={liveGraph?.edges.length ?? 0}
192
+ elapsedMs={elapsedMs} running={running} />
193
+ <LiveResourceHUD />
194
+ </div>
195
+
196
+ {/* Coverage bar */}
197
+ {tierSpec && (
198
+ <div className="rounded-2xl border border-zinc-200 bg-white p-4 shadow-sm">
199
+ <div className="flex items-center justify-between mb-2">
200
+ <span className="text-sm font-bold text-zinc-900">Forecast coverage</span>
201
+ <span className="font-mono text-sm font-bold text-indigo-700">{(tierSpec.forecastCoverage * 100).toFixed(0)}%</span>
202
+ </div>
203
+ <div className="h-3 w-full overflow-hidden rounded-full bg-zinc-100">
204
+ <div className="h-full bg-gradient-to-r from-sky-400 to-indigo-500 rounded-full transition-all duration-1000"
205
+ style={{ width: `${tierSpec.forecastCoverage * 100}%` }} />
206
+ </div>
207
+ <div className="mt-1 flex justify-between text-[10px] text-zinc-400">
208
+ <span>0% (no coverage)</span>
209
+ <span>Residual: ~{(100 - tierSpec.forecastCoverage * 100).toFixed(0)}% (paywalled/post-cutoff)</span>
210
+ <span>100%</span>
211
+ </div>
212
+ </div>
213
+ )}
214
+
215
+ {/* Hypotheses + Trace */}
216
+ <div className="grid gap-4 lg:grid-cols-2">
217
+ <HypothesisPanel state={liveState} />
218
+ <div className="flex flex-col" style={{ minHeight: 420 }}>
219
+ <TraceLog events={events} title="GBSE reasoning trace" />
220
+ </div>
221
+ </div>
222
+
223
+ {/* Graph */}
224
+ <GraphView graph={liveGraph} />
225
+
226
+ {/* ReportOS v3 calculation engines + verification gates */}
227
+ <ReportOSPanel />
228
+
229
+ {/* Answer + Tests */}
230
+ <div className="grid gap-4 lg:grid-cols-[2fr_1fr]">
231
+ <AnswerPanel answer={answer || (app.beliefState ? app.lastRun?.finalAnswer ?? "" : "")} state={liveState} />
232
+ <TestPanel />
233
+ </div>
234
+
235
+ <FailureModesPanel />
236
+ </div>
237
+ </div>
238
+ );
239
+ }
@@ -0,0 +1,116 @@
1
+ import { useMemo, useState, useEffect } from "react";
2
+ import * as Comlink from "comlink";
3
+ import type { RelevanceGraph } from "../lib/gbse/graph";
4
+
5
+ interface Pos { x: number; y: number; }
6
+
7
+ export function GraphView({ graph, queryNid = "__query__" }: { graph: RelevanceGraph | null; queryNid?: string }) {
8
+ const [ranked, setRanked] = useState<Array<{ nid: string; label: string; score: number }>>([]);
9
+
10
+ useEffect(() => {
11
+ if (!graph || graph.nodes.size === 0) return;
12
+ const worker = new Worker(new URL("../lib/gbse/graph.worker.ts", import.meta.url));
13
+ const api = Comlink.wrap<any>(worker);
14
+
15
+ const nodes = Array.from(graph.nodes.values());
16
+ const edges = graph.edges;
17
+
18
+ api.calculateRelevance(nodes, edges, graph.cfg, queryNid).then((r: any) => {
19
+ setRanked(r);
20
+ worker.terminate();
21
+ });
22
+ }, [graph, queryNid]);
23
+
24
+ const layout = useMemo(() => {
25
+ if (!ranked || ranked.length === 0) return null;
26
+ const scoreMap = new Map(ranked.map((r) => [r.nid, r.score]));
27
+ const W = 720, H = 360, cx = W / 2, cy = H / 2;
28
+ const positions = new Map<string, Pos>();
29
+ positions.set(queryNid, { x: cx, y: cy });
30
+
31
+ const others = ranked.filter((r) => r.nid !== queryNid);
32
+ const hyps = others.filter((r) => r.nid.startsWith("H"));
33
+ const entities = others.filter((r) => r.nid.startsWith("E:"));
34
+ const sources = others.filter((r) => r.nid.startsWith("S:"));
35
+ const misc = others.filter(r => !r.nid.startsWith("H") && !r.nid.startsWith("E:") && !r.nid.startsWith("S:") && r.nid !== queryNid);
36
+
37
+ function ring(items: typeof ranked, radius: number, phase = 0) {
38
+ items.forEach((it, i) => {
39
+ const a = phase + (2 * Math.PI * i) / Math.max(items.length, 1);
40
+ positions.set(it.nid, { x: cx + radius * Math.cos(a), y: cy + radius * Math.sin(a) });
41
+ });
42
+ }
43
+ ring(hyps, 95);
44
+ ring(entities, 138, Math.PI / 7);
45
+ ring(sources, 168, Math.PI / 4);
46
+ ring(misc, 178, Math.PI / 3);
47
+ return { positions, scoreMap, W, H };
48
+ }, [ranked, queryNid]);
49
+
50
+ if (!graph || !layout) {
51
+ return (
52
+ <div className="flex h-56 items-center justify-center rounded-2xl border border-zinc-200 bg-white text-sm text-zinc-400 shadow-sm">
53
+ Signed Personalized PageRank graph appears once hypotheses are seeded.
54
+ </div>
55
+ );
56
+ }
57
+
58
+ const { positions, scoreMap, W, H } = layout;
59
+ return (
60
+ <div className="rounded-2xl border border-zinc-200 bg-white shadow-sm overflow-hidden">
61
+ <div className="border-b border-zinc-200 px-4 py-2.5 flex items-center justify-between">
62
+ <span className="text-sm font-bold text-zinc-900">Signed PPR — relevance graph</span>
63
+ <span className="text-[11px] text-zinc-500">{graph.nodes.size} nodes · {graph.edges.length} edges</span>
64
+ </div>
65
+ <div className="overflow-x-auto bg-zinc-50/50 p-2">
66
+ <svg viewBox={`0 0 ${W} ${H}`} className="h-[360px] w-full">
67
+ <defs>
68
+ <marker id="ap" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="5" markerHeight="5" orient="auto">
69
+ <path d="M0,0 L10,5 L0,10 z" fill="#10b981" />
70
+ </marker>
71
+ <marker id="an" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="5" markerHeight="5" orient="auto">
72
+ <path d="M0,0 L10,5 L0,10 z" fill="#f43f5e" />
73
+ </marker>
74
+ </defs>
75
+ {graph.edges.map((e, i) => {
76
+ const a = positions.get(e.src);
77
+ const b = positions.get(e.dst);
78
+ if (!a || !b) return null;
79
+ const pos = e.signedWeight >= 0;
80
+ const w = Math.max(0.5, Math.min(3, Math.abs(e.signedWeight) * 2.5));
81
+ return (
82
+ <line key={i} x1={a.x} y1={a.y} x2={b.x} y2={b.y}
83
+ stroke={pos ? "#10b981" : "#f43f5e"} strokeOpacity={0.45} strokeWidth={w}
84
+ markerEnd={pos ? "url(#ap)" : "url(#an)"} />
85
+ );
86
+ })}
87
+ {[...positions.entries()].map(([nid, p]) => {
88
+ const score = scoreMap.get(nid) ?? 0;
89
+ const node = graph.nodes.get(nid);
90
+ const isQ = nid === queryNid;
91
+ const isH = nid.startsWith("H");
92
+ const isE = nid.startsWith("E:");
93
+ const r = isQ ? 20 : 7 + 11 * score;
94
+ const fill = isQ ? "#6366f1" : isH ? "#0ea5e9" : isE ? "#a78bfa" : "#94a3b8";
95
+ return (
96
+ <g key={nid}>
97
+ <circle cx={p.x} cy={p.y} r={r} fill={fill} fillOpacity={0.88} stroke="#fff" strokeWidth={1.5} />
98
+ <text x={p.x} y={p.y + r + 10} textAnchor="middle" fill="#374151" fontSize={9} fontFamily="ui-monospace,monospace">
99
+ {(node?.label ?? nid).slice(0, 24)}
100
+ </text>
101
+ </g>
102
+ );
103
+ })}
104
+ </svg>
105
+ </div>
106
+ <div className="flex flex-wrap gap-4 border-t border-zinc-100 px-4 py-2 text-[11px] text-zinc-500">
107
+ <span><span className="inline-block h-2 w-2 rounded-full bg-indigo-500 mr-1" />query</span>
108
+ <span><span className="inline-block h-2 w-2 rounded-full bg-sky-500 mr-1" />hypothesis</span>
109
+ <span><span className="inline-block h-2 w-2 rounded-full bg-violet-400 mr-1" />entity</span>
110
+ <span><span className="inline-block h-2 w-2 rounded-full bg-slate-400 mr-1" />source</span>
111
+ <span><span className="inline-block h-0.5 w-4 bg-emerald-400 align-middle mr-1" />support</span>
112
+ <span><span className="inline-block h-0.5 w-4 bg-rose-400 align-middle mr-1" />refute</span>
113
+ </div>
114
+ </div>
115
+ );
116
+ }
@@ -0,0 +1,125 @@
1
+ import { useAppState } from "../lib/app-state";
2
+ import { TIERS } from "../lib/gbse/tiers";
3
+ import { shortHash } from "../lib/sscp";
4
+ import { posterior as calcPosterior } from "../lib/gbse/engine";
5
+ import type { BeliefState } from "../lib/gbse/types";
6
+
7
+ interface Props {
8
+ state?: BeliefState | null;
9
+ tier?: number | null;
10
+ totalTokens?: number;
11
+ graphNodes?: number;
12
+ graphEdges?: number;
13
+ elapsedMs?: number;
14
+ running?: boolean;
15
+ className?: string;
16
+ }
17
+
18
+ /**
19
+ * AEGIS-PHI Engine HUD
20
+ * Fully wired to REAL live telemetry from the shared app state.
21
+ * No mock data. Values update in real-time as pipeline stages advance.
22
+ */
23
+ export function HUD(props: Props) {
24
+ const { telemetry: t, sscpReceipt, lastRun } = useAppState();
25
+
26
+ // Bayesian metrics from local state if provided (Dashboard), else from telemetry
27
+ const state = props.state ?? null;
28
+ const post = state ? calcPosterior(state) : {};
29
+ const ranked = Object.entries(post).sort((a, b) => b[1] - a[1]);
30
+ const leaderP = ranked[0]?.[1] ?? 0;
31
+
32
+ const tier = props.tier ?? lastRun?.tier ?? t.tier;
33
+ const spec = tier !== null && tier !== undefined ? TIERS[tier] : null;
34
+
35
+ // Real measured values
36
+ const elapsed = props.elapsedMs ?? t.elapsedMs;
37
+ const totalTokens = props.totalTokens ?? (t.tokensIn + t.tokensOut);
38
+ const tools = t.toolCalls;
39
+ const sources = t.sources;
40
+
41
+ // Progress & Status
42
+ const running = props.running ?? t.running;
43
+ const status = running ? "RUNNING" : (t.phase === "complete" ? "SEALED" : "IDLE");
44
+ const statusColor = running
45
+ ? "text-sky-700 bg-sky-50 border-sky-200"
46
+ : (t.phase === "complete" ? "text-emerald-700 bg-emerald-50 border-emerald-200" : "text-zinc-500 bg-zinc-50 border-zinc-200");
47
+
48
+ const progress = Math.min(100, (t.pipelineStage / 7) * 100);
49
+
50
+ function Stat({ label, value, sub, accent }: { label: string; value: string; sub?: string; accent?: boolean }) {
51
+ return (
52
+ <div className="rounded-xl border border-zinc-200 bg-white px-3 py-2 shadow-sm transition-all duration-300">
53
+ <div className="text-[10px] font-bold uppercase tracking-[0.1em] text-zinc-400">{label}</div>
54
+ <div className={`mt-0.5 font-mono text-base font-bold ${accent ? "text-indigo-700" : "text-zinc-900"}`}>{value}</div>
55
+ {sub && <div className="mt-0.5 text-[10px] text-zinc-500 truncate" title={sub}>{sub}</div>}
56
+ </div>
57
+ );
58
+ }
59
+
60
+ return (
61
+ <div className={`rounded-2xl border border-zinc-200 bg-zinc-50/80 p-4 shadow-sm backdrop-blur-sm ${props.className ?? ""}`}>
62
+ <div className="mb-3 flex items-center justify-between">
63
+ <div className="flex items-center gap-2">
64
+ <div className="grid h-5 w-5 place-items-center rounded bg-zinc-900 font-bold text-[10px] text-white">Φ</div>
65
+ <span className="text-sm font-bold text-zinc-900 tracking-tight">AEGIS-PHI Engine HUD</span>
66
+ </div>
67
+ <span className={`rounded-full border px-2.5 py-0.5 text-[10px] font-bold ${statusColor}`}>{status}</span>
68
+ </div>
69
+
70
+ <div className="grid grid-cols-2 gap-2 sm:grid-cols-4 lg:grid-cols-8">
71
+ <Stat label="Time" value={`${(elapsed / 1000).toFixed(1)}s`} sub={spec ? `cap ${spec.maxSeconds}s` : "real-time"} accent={running} />
72
+ <Stat label="Tokens" value={fmtNum(totalTokens)} sub={`${fmtNum(t.tokensIn)} in / ${fmtNum(t.tokensOut)} out`} />
73
+ <Stat label="Tools" value={String(tools)} sub={`${t.searchCalls} search · ${t.modelCalls} model`} />
74
+ <Stat label="Sources" value={String(sources)} sub="verified docs" />
75
+ <Stat label="Hypotheses" value={String(state ? Object.keys(state.hyps).length : t.hypotheses)} sub="active paths" />
76
+ <Stat label={state ? "Leader P" : "Claims"} value={state ? leaderP.toFixed(3) : `${t.claimsVerified}/${t.claimsTotal}`} sub={state ? "posterior" : "grounded"} accent={state ? leaderP > 0.7 : t.claimsVerified > 0} />
77
+ <Stat label="Coverage" value={t.measuredCoverage === null ? "—" : `${(t.measuredCoverage * 100).toFixed(0)}%`} sub={t.measuredCoverage === null ? "not measured" : `${t.coverageNumerator}/${t.coverageDenominator} facets`} accent={t.measuredCoverage !== null && t.measuredCoverage > 0.7} />
78
+ <Stat label="SSCP Seal" value={sscpReceipt ? shortHash(sscpReceipt.stateRootHash) : "—"} sub={sscpReceipt ? "SHA-256 Merkle" : "pending seal"} accent={!!sscpReceipt} />
79
+ </div>
80
+
81
+ <div className="mt-4 flex items-center gap-4">
82
+ <div className="flex-1">
83
+ <div className="mb-1 flex items-center justify-between text-[10px] font-bold uppercase tracking-wider text-zinc-400">
84
+ <span>Pipeline Execution Trace</span>
85
+ <span>Stage {t.pipelineStage}/7 ({progress.toFixed(0)}%)</span>
86
+ </div>
87
+ <div className="h-1.5 w-full overflow-hidden rounded-full bg-zinc-200">
88
+ <div
89
+ className={`h-full transition-all duration-700 ease-out ${running ? "bg-indigo-600 shadow-[0_0_8px_rgba(79,70,229,0.4)]" : "bg-emerald-500"}`}
90
+ style={{ width: `${progress}%` }}
91
+ />
92
+ </div>
93
+ </div>
94
+ <div className="hidden shrink-0 items-center gap-3 border-l border-zinc-200 pl-4 sm:flex">
95
+ <Indicator label="Injection" ok={t.injectionsBlocked === 0} warn={t.injectionsBlocked > 0} />
96
+ <Indicator label="Sanitizer" ok={t.sanitizerStrips === 0} warn={t.sanitizerStrips > 0} />
97
+ <Indicator label="Anchor" ok={t.anchorCoverage !== null && t.anchorCoverage > 0.5} warn={t.anchorCoverage !== null && t.anchorCoverage <= 0.5} off={t.anchorCoverage === null} />
98
+ </div>
99
+ </div>
100
+
101
+ {running && (
102
+ <div className="mt-3 flex items-center gap-2 border-t border-zinc-200/50 pt-2 text-[11px] text-zinc-600 italic">
103
+ <span className="h-1.5 w-1.5 animate-pulse rounded-full bg-sky-500" />
104
+ Active Reasoning Trace: {t.phase}
105
+ </div>
106
+ )}
107
+ </div>
108
+ );
109
+ }
110
+
111
+ function Indicator({ label, warn, off }: { label: string; ok: boolean; warn?: boolean; off?: boolean }) {
112
+ const color = off ? "bg-zinc-300" : warn ? "bg-amber-400" : "bg-emerald-500";
113
+ return (
114
+ <div className="flex items-center gap-1.5">
115
+ <div className={`h-1.5 w-1.5 rounded-full ${color}`} />
116
+ <span className="text-[10px] font-bold uppercase tracking-wider text-zinc-500">{label}</span>
117
+ </div>
118
+ );
119
+ }
120
+
121
+ function fmtNum(n: number): string {
122
+ if (n >= 1000000) return (n/1000000).toFixed(1) + "M";
123
+ if (n >= 1000) return (n/1000).toFixed(1) + "K";
124
+ return String(n);
125
+ }
@@ -0,0 +1,67 @@
1
+ import type { BeliefState } from "../lib/gbse/types";
2
+ import { entropy, posterior, countSupportingSources } from "../lib/gbse/engine";
3
+
4
+ export function HypothesisPanel({ state }: { state: BeliefState | null }) {
5
+ if (!state) {
6
+ return (
7
+ <div className="rounded-2xl border border-zinc-200 bg-white p-6 shadow-sm text-center text-sm text-zinc-400">
8
+ No belief state yet. Run a Bayesian search to see hypothesis tracking.
9
+ </div>
10
+ );
11
+ }
12
+ const post = posterior(state);
13
+ const sorted = Object.entries(post).sort((a, b) => b[1] - a[1]);
14
+ const ent = entropy(state);
15
+
16
+ return (
17
+ <div className="rounded-2xl border border-zinc-200 bg-white shadow-sm overflow-hidden">
18
+ <div className="flex items-center justify-between border-b border-zinc-200 px-4 py-2.5">
19
+ <span className="text-sm font-bold text-zinc-900">Hypotheses (posterior)</span>
20
+ <div className="flex items-center gap-3 text-[11px] text-zinc-500">
21
+ <span>entropy <span className="font-mono font-bold text-zinc-800">{ent.toFixed(3)}</span></span>
22
+ <span>{sorted.length} living</span>
23
+ </div>
24
+ </div>
25
+ <div className="divide-y divide-zinc-100 max-h-96 overflow-y-auto">
26
+ {sorted.map(([hid, p]) => {
27
+ const h = state.hyps[hid];
28
+ const isWinner = state.committed === hid;
29
+ const supportCount = countSupportingSources(h);
30
+ const refuteCount = h.evidence.filter(e => e.verdict === "refute").length;
31
+ const silentCount = h.evidence.filter(e => e.verdict === "silent").length;
32
+ return (
33
+ <div key={hid} className={`p-3 ${isWinner ? "bg-emerald-50/70" : ""}`}>
34
+ <div className="mb-1.5 flex items-center justify-between gap-2">
35
+ <div className="flex items-center gap-1.5">
36
+ {isWinner && <span className="text-emerald-600 font-bold">✓</span>}
37
+ <span className="font-mono text-[10px] text-zinc-400">{hid}</span>
38
+ {!h.alive && !isWinner && <span className="rounded bg-zinc-100 px-1 text-[9px] text-zinc-500">PRUNED</span>}
39
+ </div>
40
+ <div className="flex items-center gap-2">
41
+ <span className="font-mono text-xs font-bold text-zinc-700">{(p * 100).toFixed(1)}%</span>
42
+ <span className="font-mono text-[10px] text-zinc-400">logw={h.logw.toFixed(2)}</span>
43
+ </div>
44
+ </div>
45
+ <div className={`text-sm mb-2 ${h.alive ? "text-zinc-900" : "text-zinc-400 line-through"}`}>{h.text}</div>
46
+ <div className="h-1.5 w-full overflow-hidden rounded-full bg-zinc-100">
47
+ <div
48
+ className={`h-full rounded-full transition-all duration-700 ${isWinner ? "bg-emerald-500" : "bg-sky-500"}`}
49
+ style={{ width: `${Math.max(2, p * 100)}%` }}
50
+ />
51
+ </div>
52
+ <div className="mt-2 flex flex-wrap gap-3 text-[10px] text-zinc-500">
53
+ <span title="distinct supporting sources" className="text-emerald-700 font-semibold">↑ {supportCount} support</span>
54
+ <span className="text-rose-700">↓ {refuteCount} refute</span>
55
+ {silentCount > 0 && <span>· {silentCount} silent</span>}
56
+ <span className="font-mono">{h.spentTokens.toLocaleString()} tok</span>
57
+ <span className={`font-mono ${h.anchorVerdict === "support" ? "text-emerald-600" : h.anchorVerdict === "refute" ? "text-rose-600" : "text-zinc-400"}`}>
58
+ anchor:{h.anchorVerdict}
59
+ </span>
60
+ </div>
61
+ </div>
62
+ );
63
+ })}
64
+ </div>
65
+ </div>
66
+ );
67
+ }