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,13 @@
1
+ export * from "./strata-engine.orig";
2
+
3
+ import { strataCollect as packageCollect } from "./strata-engine.orig";
4
+ import { filterRelevantSourcesAny, hardenRetrievalQuery } from "@/lib/debug/retrieval-hardener";
5
+
6
+ export async function strataCollect(...args: Parameters<typeof packageCollect>): Promise<Awaited<ReturnType<typeof packageCollect>>> {
7
+ const [query, opts] = args;
8
+ const h = hardenRetrievalQuery(String(query), "general");
9
+ const result: any = await packageCollect(h.query, opts);
10
+ const gate = filterRelevantSourcesAny(Array.isArray(result?.sources) ? result.sources : [], h.alternatives);
11
+ try { opts?.onDebug?.(`workspace-relevance-gate: strata accepted ${gate.accepted.length}, rejected ${gate.rejected.length}`); } catch {}
12
+ return { ...result, sources: gate.accepted, ok: !!result?.ok && gate.accepted.length >= 2 };
13
+ }
@@ -0,0 +1,369 @@
1
+ /**
2
+ * structured-source-adapter.ts
3
+ * ============================================================================
4
+ * ADDITIVE — composes over canonical retrieval-policy-augments.ts +
5
+ * retrieval-control-plane.ts without modifying any existing file.
6
+ */
7
+
8
+ import type { CrawlPayload, ScheduleContext, RetrievalPolicy } from "./retrieval-control-plane";
9
+
10
+ // ═══════════════════════════════════════════════════════════════════════════
11
+ // TYPES
12
+ // ═══════════════════════════════════════════════════════════════════════════
13
+
14
+ export type StructuredSourceKind =
15
+ | "openalex"
16
+ | "crossref"
17
+ | "semantic-scholar"
18
+ | "pubmed"
19
+ | "arxiv"
20
+ | "wikipedia"
21
+ | "internet-archive"
22
+ | "rss-atom"
23
+ | "partial-spa"
24
+ | "none";
25
+
26
+ export interface StructuredItem {
27
+ kind: StructuredSourceKind;
28
+ title: string;
29
+ abstract?: string;
30
+ authors?: string[];
31
+ publishedDate?: string;
32
+ doi?: string;
33
+ externalUrl?: string;
34
+ openAccessUrl?: string;
35
+ citationCount?: number;
36
+ pageContent: string;
37
+ markdown: string;
38
+ metadata: Record<string, string | number | boolean | undefined>;
39
+ confidence: number;
40
+ }
41
+
42
+ export interface StructuredQueryResult {
43
+ kind: StructuredSourceKind;
44
+ items: StructuredItem[];
45
+ apiUrl: string;
46
+ totalAvailable?: number;
47
+ }
48
+
49
+ export interface StructuredAdapterOptions {
50
+ signal?: AbortSignal;
51
+ limitPerSource?: number;
52
+ sources?: StructuredSourceKind[];
53
+ openAlexApiKey?: string;
54
+ deduplicate?: boolean;
55
+ }
56
+
57
+ // ═══════════════════════════════════════════════════════════════════════════
58
+ // DOMAIN ROUTING
59
+ // ═══════════════════════════════════════════════════════════════════════════
60
+
61
+ const STRUCTURED_DOMAINS: Record<string, StructuredSourceKind> = {
62
+ "arxiv.org": "arxiv",
63
+ "export.arxiv.org": "arxiv",
64
+ "openalex.org": "openalex",
65
+ "api.openalex.org": "openalex",
66
+ "crossref.org": "crossref",
67
+ "api.crossref.org": "crossref",
68
+ "doi.org": "crossref",
69
+ "semanticscholar.org": "semantic-scholar",
70
+ "api.semanticscholar.org": "semantic-scholar",
71
+ "pubmed.ncbi.nlm.nih.gov": "pubmed",
72
+ "ncbi.nlm.nih.gov": "pubmed",
73
+ "eutils.ncbi.nlm.nih.gov": "pubmed",
74
+ "en.wikipedia.org": "wikipedia",
75
+ "wikipedia.org": "wikipedia",
76
+ "archive.org": "internet-archive",
77
+ "scholar.archive.org": "internet-archive",
78
+ };
79
+
80
+ function hostOf(url: string): string {
81
+ try { return new URL(url).hostname.toLowerCase().replace(/^www\./, ""); }
82
+ catch { return ""; }
83
+ }
84
+
85
+ export function detectStructuredSource(url: string): StructuredSourceKind {
86
+ const host = hostOf(url);
87
+ if (STRUCTURED_DOMAINS[host]) return STRUCTURED_DOMAINS[host];
88
+ for (const [suffix, kind] of Object.entries(STRUCTURED_DOMAINS)) {
89
+ if (host.endsWith("." + suffix)) return kind;
90
+ }
91
+ return "none";
92
+ }
93
+
94
+ // ═══════════════════════════════════════════════════════════════════════════
95
+ // POLITE-FETCH
96
+ // ═══════════════════════════════════════════════════════════════════════════
97
+
98
+ const API_LAST_CALL = new Map<string, number>();
99
+ const API_MIN_INTERVAL_MS = 1_000;
100
+
101
+ async function politeFetch(url: string, signal?: AbortSignal, accept = "application/json"): Promise<Response | null> {
102
+ const apiHost = hostOf(url);
103
+ const last = API_LAST_CALL.get(apiHost) ?? 0;
104
+ const wait = Math.max(0, last + API_MIN_INTERVAL_MS - Date.now());
105
+ if (wait > 0) await new Promise<void>((r) => setTimeout(r, wait));
106
+ API_LAST_CALL.set(apiHost, Date.now());
107
+ try {
108
+ const res = await fetch(url, {
109
+ signal,
110
+ credentials: "omit",
111
+ referrerPolicy: "no-referrer",
112
+ headers: { Accept: accept },
113
+ });
114
+ return res.ok ? res : null;
115
+ } catch { return null; }
116
+ }
117
+
118
+ async function politeJson<T>(url: string, signal?: AbortSignal): Promise<T | null> {
119
+ const res = await politeFetch(url, signal, "application/json");
120
+ if (!res) return null;
121
+ try { return (await res.json()) as T; } catch { return null; }
122
+ }
123
+
124
+ // ═══════════════════════════════════════════════════════════════════════════
125
+ // TEXT BUILDERS
126
+ // ═══════════════════════════════════════════════════════════════════════════
127
+
128
+ function safeString(v: unknown, fallback = ""): string {
129
+ if (v == null) return fallback;
130
+ if (typeof v === "string") return v.trim();
131
+ if (typeof v === "number") return String(v);
132
+ if (Array.isArray(v)) return v.map((x) => safeString(x)).join(", ");
133
+ return fallback;
134
+ }
135
+
136
+ function buildPageContent(item: Omit<StructuredItem, "pageContent" | "markdown">): string {
137
+ const lines: string[] = [];
138
+ if (item.title) lines.push(`# ${item.title}`);
139
+ if (item.authors?.length) lines.push(`Authors: ${item.authors.slice(0, 6).join(", ")}`);
140
+ if (item.publishedDate) lines.push(`Published: ${item.publishedDate}`);
141
+ if (item.doi) lines.push(`DOI: https://doi.org/${item.doi}`);
142
+ if (item.externalUrl) lines.push(`URL: ${item.externalUrl}`);
143
+ if (item.openAccessUrl && item.openAccessUrl !== item.externalUrl) {
144
+ lines.push(`Open Access: ${item.openAccessUrl}`);
145
+ }
146
+ if (item.citationCount != null) lines.push(`Citations: ${item.citationCount}`);
147
+ if (item.abstract) lines.push(`\n## Abstract\n\n${item.abstract}`);
148
+ return lines.join("\n").trim();
149
+ }
150
+
151
+ function makeItem(
152
+ kind: StructuredSourceKind,
153
+ partial: Omit<StructuredItem, "pageContent" | "markdown" | "kind" | "confidence">,
154
+ confidence = 0.85,
155
+ ): StructuredItem {
156
+ const full = { ...partial, kind, confidence, pageContent: "", markdown: "" } as StructuredItem;
157
+ full.pageContent = buildPageContent(full);
158
+ full.markdown = full.pageContent;
159
+ return full;
160
+ }
161
+
162
+ // ═══════════════════════════════════════════════════════════════════════════
163
+ // ADAPTERS
164
+ // ═══════════════════════════════════════════════════════════════════════════
165
+
166
+ export async function queryCrossref(query: string, opts?: { signal?: AbortSignal; limit?: number }): Promise<StructuredQueryResult> {
167
+ const limit = Math.min(opts?.limit ?? 8, 20);
168
+ const url = `https://api.crossref.org/works?query=${encodeURIComponent(query)}&rows=${limit}&mailto=oss-rcp@example.com`;
169
+ const data = await politeJson<{ message?: { items?: any[]; "total-results"?: number } }>(url, opts?.signal);
170
+ if (!data?.message?.items) return { kind: "crossref", items: [], apiUrl: url };
171
+ const items = data.message.items.map((w) => makeItem("crossref", {
172
+ title: (w.title ?? ["Untitled"])[0],
173
+ abstract: w.abstract ? w.abstract.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim() : undefined,
174
+ authors: (w.author ?? []).map((a: any) => [a.given, a.family].filter(Boolean).join(" ")),
175
+ publishedDate: (w["published-print"] ?? w["published-online"])?.["date-parts"]?.[0]?.filter(Boolean).join("-"),
176
+ doi: w.DOI,
177
+ externalUrl: w.URL ?? (w.DOI ? `https://doi.org/${w.DOI}` : undefined),
178
+ citationCount: w["is-referenced-by-count"],
179
+ metadata: { doi: w.DOI, citations: w["is-referenced-by-count"] },
180
+ }));
181
+ return { kind: "crossref", items, apiUrl: url, totalAvailable: data.message["total-results"] };
182
+ }
183
+
184
+ export async function querySemanticScholar(query: string, opts?: { signal?: AbortSignal; limit?: number }): Promise<StructuredQueryResult> {
185
+ const limit = Math.min(opts?.limit ?? 8, 20);
186
+ const fields = "paperId,title,abstract,year,authors,externalIds,openAccessPdf,citationCount,url";
187
+ const url = `https://api.semanticscholar.org/graph/v1/paper/search?query=${encodeURIComponent(query)}&limit=${limit}&fields=${fields}`;
188
+ const data = await politeJson<{ data?: any[]; total?: number }>(url, opts?.signal);
189
+ if (!data?.data) return { kind: "semantic-scholar", items: [], apiUrl: url };
190
+ const items = data.data.map((p) => makeItem("semantic-scholar", {
191
+ title: p.title ?? "Untitled",
192
+ abstract: p.abstract,
193
+ authors: (p.authors ?? []).map((a: any) => a.name ?? "").filter(Boolean),
194
+ publishedDate: p.year ? String(p.year) : undefined,
195
+ doi: p.externalIds?.DOI,
196
+ externalUrl: p.url ?? (p.externalIds?.DOI ? `https://doi.org/${p.externalIds.DOI}` : undefined),
197
+ openAccessUrl: p.openAccessPdf?.url,
198
+ citationCount: p.citationCount,
199
+ metadata: { paperId: p.paperId, arxivId: p.externalIds?.ArXiv },
200
+ }));
201
+ return { kind: "semantic-scholar", items, apiUrl: url, totalAvailable: data.total };
202
+ }
203
+
204
+ export function invertedIndexToText(inv: Record<string, number[]> | undefined): string {
205
+ if (!inv) return "";
206
+ const words: string[] = [];
207
+ for (const [word, positions] of Object.entries(inv)) {
208
+ for (const p of positions) if (p < 10_000) words[p] = word;
209
+ }
210
+ return words.filter(Boolean).join(" ");
211
+ }
212
+
213
+ export async function queryOpenAlex(query: string, opts?: { signal?: AbortSignal; limit?: number; apiKey?: string }): Promise<StructuredQueryResult> {
214
+ if (!opts?.apiKey) return { kind: "openalex", items: [], apiUrl: "" };
215
+ const limit = Math.min(opts.limit ?? 8, 25);
216
+ const fields = "id,title,doi,publication_date,authorships,abstract_inverted_index,best_oa_location,cited_by_count";
217
+ const url = `https://api.openalex.org/works?search=${encodeURIComponent(query)}&per-page=${limit}&select=${fields}&api_key=${encodeURIComponent(opts.apiKey)}`;
218
+ const data = await politeJson<{ results?: any[]; meta?: { count?: number } }>(url, opts.signal);
219
+ if (!data?.results) return { kind: "openalex", items: [], apiUrl: url };
220
+ const items = data.results.map((w) => {
221
+ const oaUrl = w.best_oa_location?.pdf_url ?? w.best_oa_location?.landing_page_url;
222
+ return makeItem("openalex", {
223
+ title: w.title ?? "Untitled",
224
+ abstract: invertedIndexToText(w.abstract_inverted_index) || undefined,
225
+ authors: (w.authorships ?? []).map((a: any) => a.author?.display_name ?? "").filter(Boolean),
226
+ publishedDate: w.publication_date,
227
+ doi: w.doi?.replace(/^https?:\/\/doi\.org\//, ""),
228
+ externalUrl: w.doi ?? w.id,
229
+ openAccessUrl: oaUrl,
230
+ citationCount: w.cited_by_count,
231
+ metadata: { openalexId: w.id, hasOA: !!oaUrl },
232
+ }, 0.90);
233
+ });
234
+ return { kind: "openalex", items, apiUrl: url, totalAvailable: data.meta?.count };
235
+ }
236
+
237
+ export async function queryPubMed(query: string, opts?: { signal?: AbortSignal; limit?: number }): Promise<StructuredQueryResult> {
238
+ const limit = Math.min(opts?.limit ?? 8, 20);
239
+ const esearchUrl = `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=${encodeURIComponent(query)}&retmax=${limit}&retmode=json`;
240
+ const esearch = await politeJson<{ esearchresult?: { idlist?: string[]; count?: string } }>(esearchUrl, opts?.signal);
241
+ const ids = esearch?.esearchresult?.idlist ?? [];
242
+ if (!ids.length) return { kind: "pubmed", items: [], apiUrl: esearchUrl };
243
+ const esummaryUrl = `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=${ids.join(",")}&retmode=json`;
244
+ const summary = await politeJson<{ result?: Record<string, any> }>(esummaryUrl, opts?.signal);
245
+ const result = summary?.result ?? {};
246
+ const items = ids.flatMap((id) => {
247
+ const s = result[id]; if (!s) return [];
248
+ return [makeItem("pubmed", {
249
+ title: s.title ?? "Untitled",
250
+ authors: (s.authors ?? []).map((a: any) => a.name ?? "").filter(Boolean),
251
+ publishedDate: (s.sortpubdate ?? s.epubdate)?.split(" ")[0],
252
+ doi: s.elocationid?.startsWith("doi: ") ? s.elocationid.slice(5) : undefined,
253
+ externalUrl: `https://pubmed.ncbi.nlm.nih.gov/${id}/`,
254
+ metadata: { pmid: id, journal: s.fulljournalname },
255
+ })];
256
+ });
257
+ return { kind: "pubmed", items, apiUrl: esearchUrl, totalAvailable: esearch?.esearchresult?.count ? Number(esearch.esearchresult.count) : undefined };
258
+ }
259
+
260
+ export async function queryArXiv(query: string, opts?: { signal?: AbortSignal; limit?: number }): Promise<StructuredQueryResult> {
261
+ const limit = Math.min(opts?.limit ?? 8, 20);
262
+ const url = `https://export.arxiv.org/api/query?search_query=all:${encodeURIComponent(query)}&max_results=${limit}`;
263
+ const res = await politeFetch(url, opts?.signal, "application/atom+xml,application/xml");
264
+ if (!res) return { kind: "arxiv", items: [], apiUrl: url };
265
+ const xml = await res.text(); if (typeof DOMParser === "undefined") return { kind: "arxiv", items: [], apiUrl: url };
266
+ let doc: Document; try { doc = new DOMParser().parseFromString(xml, "application/xml"); } catch { return { kind: "arxiv", items: [], apiUrl: url }; }
267
+ const ns = "http://www.w3.org/2005/Atom";
268
+ const entries = Array.from(doc.getElementsByTagNameNS(ns, "entry"));
269
+ const items = entries.map((e) => {
270
+ const get = (tag: string) => e.getElementsByTagNameNS(ns, tag)[0]?.textContent?.trim() ?? "";
271
+ const links = Array.from(e.getElementsByTagNameNS(ns, "link"));
272
+ const pdfLink = links.find((l) => l.getAttribute("title") === "pdf")?.getAttribute("href") ?? "";
273
+ const absLink = links.find((l) => l.getAttribute("rel") === "alternate")?.getAttribute("href") ?? "";
274
+ const authors = Array.from(e.getElementsByTagNameNS(ns, "author")).map((a) => a.getElementsByTagNameNS(ns, "name")[0]?.textContent?.trim() ?? "").filter(Boolean);
275
+ const arXivId = get("id").split("/abs/").pop() ?? "";
276
+ return makeItem("arxiv", { title: get("title").replace(/\s+/g, " "), abstract: get("summary").replace(/\s+/g, " "), authors: authors.length ? authors : undefined, publishedDate: get("published").slice(0, 10), externalUrl: absLink || (arXivId ? `https://arxiv.org/abs/${arXivId}` : undefined), openAccessUrl: pdfLink || (arXivId ? `https://arxiv.org/pdf/${arXivId}` : undefined), metadata: { arxivId: arXivId } });
277
+ });
278
+ return { kind: "arxiv", items, apiUrl: url };
279
+ }
280
+
281
+ export async function queryWikipedia(query: string, opts?: { signal?: AbortSignal; limit?: number }): Promise<StructuredQueryResult> {
282
+ const limit = Math.min(opts?.limit ?? 5, 10);
283
+ const searchUrl = `https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch=${encodeURIComponent(query)}&srlimit=${limit}&srprop=snippet&format=json&origin=*`;
284
+ const data = await politeJson<{ query?: { search?: any[] } }>(searchUrl, opts?.signal);
285
+ if (!data?.query?.search) return { kind: "wikipedia", items: [], apiUrl: searchUrl };
286
+ const items = await Promise.all(data.query.search.map(async (s) => {
287
+ const extractUrl = `https://en.wikipedia.org/w/api.php?action=query&titles=${encodeURIComponent(s.title ?? "")}&prop=extracts&exintro&explaintext&exsentences=10&format=json&origin=*`;
288
+ const ext = await politeJson<{ query?: { pages?: Record<string, any> } }>(extractUrl, opts?.signal);
289
+ const page = Object.values(ext?.query?.pages ?? {})[0] as any;
290
+ return makeItem("wikipedia", { title: s.title ?? "Untitled", abstract: page?.extract || (s.snippet ?? "").replace(/<[^>]+>/g, ""), externalUrl: page?.canonicalurl ?? `https://en.wikipedia.org/wiki/${encodeURIComponent(s.title ?? "")}`, metadata: { pageid: s.pageid } }, 0.80);
291
+ }));
292
+ return { kind: "wikipedia", items, apiUrl: searchUrl };
293
+ }
294
+
295
+ export async function queryInternetArchive(query: string, opts?: { signal?: AbortSignal; limit?: number }): Promise<StructuredQueryResult> {
296
+ const limit = Math.min(opts?.limit ?? 8, 25);
297
+ const url = `https://scholar.archive.org/search?q=${encodeURIComponent(query)}&limit=${limit}&format=json`;
298
+ const data = await politeJson<{ results?: any[]; count_found?: number }>(url, opts?.signal);
299
+ if (!data?.results) return { kind: "internet-archive", items: [], apiUrl: url };
300
+ const items = data.results.map((r) => {
301
+ const b = r.biblio ?? {};
302
+ return makeItem("internet-archive", { title: b.title ?? "Untitled", abstract: r.abstracts?.[0]?.body, authors: b.contributor_raw?.filter(Boolean), publishedDate: b.release_year ? String(b.release_year) : undefined, doi: b.doi, externalUrl: b.release_url ?? (b.doi ? `https://doi.org/${b.doi}` : undefined), metadata: { key: r.key } }, 0.82);
303
+ });
304
+ return { kind: "internet-archive", items, apiUrl: url, totalAvailable: data.count_found };
305
+ }
306
+
307
+ export function extractSpaStructuredData(html: string, sourceUrl: string): StructuredItem | null {
308
+ if (typeof DOMParser === "undefined") return null;
309
+ let doc: Document; try { const safe = html.replace(/<script\b(?![^>]*type=["']application\/ld\+json["'])[^>]*>[\s\S]*?<\/script>/gi, " ").replace(/<style[^>]*>[\s\S]*?<\/style>/gi, " "); doc = new DOMParser().parseFromString(safe, "text/html"); } catch { return null; }
310
+ const ldScripts = Array.from(doc.querySelectorAll('script[type="application/ld+json"]'));
311
+ for (const script of ldScripts) {
312
+ try {
313
+ const data = JSON.parse(script.textContent ?? ""); const items = Array.isArray(data) ? data : [data];
314
+ for (const d of items) {
315
+ const type = safeString(d["@type"]).toLowerCase(); if (!["article", "newsarticle", "blogposting", "scholarlyarticle", "webpage"].some((t) => type.includes(t))) continue;
316
+ const title = safeString(d.headline ?? d.name), abstract = safeString(d.description ?? d.abstract ?? d.articleBody).slice(0, 2000);
317
+ const authorRaw = d.author, authors: string[] = [];
318
+ if (Array.isArray(authorRaw)) for (const a of authorRaw) authors.push(safeString(typeof a === "object" ? a?.name ?? a : a));
319
+ else if (authorRaw) authors.push(safeString(typeof authorRaw === "object" ? authorRaw?.name ?? authorRaw : authorRaw));
320
+ if (!title && !abstract) continue;
321
+ return makeItem("partial-spa", { title: title || "Untitled", abstract: abstract || undefined, authors: authors.filter(Boolean), publishedDate: safeString(d.datePublished ?? d.dateCreated), externalUrl: safeString(d.url ?? d.mainEntityOfPage?.["@id"] ?? sourceUrl), doi: safeString(d.sameAs).includes("doi.org") ? safeString(d.sameAs).split("doi.org/")[1] : undefined, metadata: { schemaType: d["@type"], sourceUrl } }, 0.55);
322
+ }
323
+ } catch {}
324
+ }
325
+ const og: Record<string, string> = {}; doc.querySelectorAll("meta[property]").forEach(m => { const p = m.getAttribute("property")||""; if(p.startsWith("og:")) og[p.slice(3)] = m.getAttribute("content")||""; });
326
+ if (og.title || og.description) return makeItem("partial-spa", { title: og.title || doc.querySelector("title")?.textContent?.trim() || "Untitled", abstract: og.description, publishedDate: og["article:published_time"] || undefined, externalUrl: og.url || sourceUrl, metadata: { og_site_name: og.site_name, sourceUrl } }, 0.40);
327
+ return null;
328
+ }
329
+
330
+ export async function structuredSearch(query: string, opts?: StructuredAdapterOptions): Promise<{ items: StructuredItem[]; totalFound: number; queriedSources: StructuredSourceKind[] }> {
331
+ const sources = opts?.sources ?? ["crossref", "semantic-scholar", "arxiv", "pubmed", "wikipedia", "internet-archive"];
332
+ const limit = opts?.limitPerSource ?? 6; const runners: Array<Promise<StructuredQueryResult>> = [];
333
+ if (sources.includes("crossref")) runners.push(queryCrossref(query, { signal: opts?.signal, limit }));
334
+ if (sources.includes("semantic-scholar")) runners.push(querySemanticScholar(query, { signal: opts?.signal, limit }));
335
+ if (sources.includes("arxiv")) runners.push(queryArXiv(query, { signal: opts?.signal, limit }));
336
+ if (sources.includes("pubmed")) runners.push(queryPubMed(query, { signal: opts?.signal, limit }));
337
+ if (sources.includes("wikipedia")) runners.push(queryWikipedia(query, { signal: opts?.signal, limit }));
338
+ if (sources.includes("internet-archive")) runners.push(queryInternetArchive(query, { signal: opts?.signal, limit }));
339
+ if (sources.includes("openalex") && opts?.openAlexApiKey) runners.push(queryOpenAlex(query, { signal: opts?.signal, limit, apiKey: opts.openAlexApiKey }));
340
+ const settled = await Promise.allSettled(runners), seen = new Set<string>(), all: StructuredItem[] = [], queried: StructuredSourceKind[] = [];
341
+ for (const r of settled) { if (r.status !== "fulfilled") continue; queried.push(r.value.kind); for (const item of r.value.items) { const key = item.doi ?? item.externalUrl; if (key && !seen.has(key)) { seen.add(key); all.push(item); } } }
342
+ return { items: all, totalFound: all.length, queriedSources: queried };
343
+ }
344
+
345
+ export function withStructuredSourceInterception<T>(reader: (url: string, ctx: ScheduleContext, policy: RetrievalPolicy) => Promise<CrawlPayload<T>>, adapterOpts?: Pick<StructuredAdapterOptions, "signal" | "openAlexApiKey">): (url: string, ctx: ScheduleContext, policy: RetrievalPolicy) => Promise<CrawlPayload<T>> {
346
+ return async (url, ctx, policy) => {
347
+ const kind = detectStructuredSource(url);
348
+ if (kind !== "none") {
349
+ const item = await resolveStructuredUrl(url, kind, ctx.signal ?? adapterOpts?.signal, adapterOpts?.openAlexApiKey);
350
+ if (item && item.pageContent.length >= 80) return { value: item as unknown as T, text: item.pageContent, markdown: item.markdown, contentType: "text/markdown", canonicalUrl: item.externalUrl ?? url, bytesRead: item.pageContent.length };
351
+ }
352
+ return await reader(url, ctx, policy);
353
+ };
354
+ }
355
+
356
+ async function resolveStructuredUrl(url: string, kind: StructuredSourceKind, signal?: AbortSignal, openAlexApiKey?: string): Promise<StructuredItem | null> {
357
+ try {
358
+ switch (kind) {
359
+ case "arxiv": { const id = new URL(url).pathname.replace(/^\/(?:abs|pdf|html)\//, "").replace(/v\d+$/, ""); return id ? (await queryArXiv(`id:${id}`, { signal, limit: 1 })).items[0] || null : null; }
360
+ case "pubmed": { const pmid = url.match(/\/(\d+)\/?(?:\?|$)/)?.[1]; return pmid ? (await queryPubMed(pmid, { signal, limit: 1 })).items[0] || null : null; }
361
+ case "crossref": { const doi = url.match(/doi\.org\/(.+)$/)?.[1]; return doi ? (await queryCrossref(doi, { signal, limit: 1 })).items[0] || null : null; }
362
+ case "openalex": return openAlexApiKey ? (await queryOpenAlex(url, { signal, limit: 1, apiKey: openAlexApiKey })).items[0] || null : null;
363
+ case "semantic-scholar": return (await querySemanticScholar(url, { signal, limit: 1 })).items[0] || null;
364
+ case "wikipedia": { const title = decodeURIComponent(new URL(url).pathname.replace(/^\/wiki\//, "")); return (await queryWikipedia(title, { signal, limit: 1 })).items[0] || null; }
365
+ case "internet-archive": return (await queryInternetArchive(url, { signal, limit: 1 })).items[0] || null;
366
+ default: return null;
367
+ }
368
+ } catch { return null; }
369
+ }
@@ -0,0 +1,34 @@
1
+ /** Alias-reachable T0 structured search wrapper. */
2
+ export * from "./structured-source-adapter.orig";
3
+
4
+ import { structuredSearch as packageStructuredSearch } from "./structured-source-adapter.orig";
5
+ import { dedupeSources, filterRelevantSourcesAny, hardenRetrievalQuery } from "@/lib/debug/retrieval-hardener";
6
+
7
+ type StructuredOpts = Parameters<typeof packageStructuredSearch>[1];
8
+ type StructuredResult = Awaited<ReturnType<typeof packageStructuredSearch>>;
9
+
10
+ export async function structuredSearch(query: string, opts?: StructuredOpts): Promise<StructuredResult> {
11
+ const hardened = hardenRetrievalQuery(query, "general");
12
+ const selected = hardened.alternatives.slice(0, 3);
13
+ const results = await Promise.all(
14
+ selected.map((q) => packageStructuredSearch(q.q, opts).catch(() => ({ items: [], totalFound: 0, queriedSources: [] } as StructuredResult)))
15
+ );
16
+ const allItems = dedupeSources(results.flatMap((r) => r.items));
17
+ // Accept if coherent with ANY dispatched facet query; reject only if all say drift.
18
+ const accepted = filterRelevantSourcesAny(allItems, selected, 0.2).accepted;
19
+ return {
20
+ items: accepted,
21
+ totalFound: results.reduce((n, r) => n + Number(r.totalFound ?? 0), 0),
22
+ queriedSources: [...new Set(results.flatMap((r) => r.queriedSources))],
23
+ } as StructuredResult;
24
+ }
25
+
26
+
27
+ // [unify.mjs] Explicit type re-exports for Rollup resolution
28
+ export type { StructuredItem } from "./structured-source-adapter.orig";
29
+
30
+
31
+ // [unify.mjs] Emergency mocks for symbols lost from package/wrapper
32
+ export function buildAmpCacheUrl(url: string): string { return "https://cdn.ampproject.org/c/s/" + url.replace(/^https?:\/\//, ""); }
33
+ export async function fetchViaAmpCache(url: string, init?: any): Promise<Response> { return fetch(buildAmpCacheUrl(url), init); }
34
+ export async function wrappedStructuredChallengeReader(url: string): Promise<any> { return { url, content: "", title: "Fallback" }; }
@@ -0,0 +1,224 @@
1
+ /**
2
+ * terminal-complete.ts
3
+ * ============================================================================
4
+ * FINAL TERMINAL SYNTHESIS
5
+ *
6
+ * Chain:
7
+ * canonical-portfolio-orchestrator.ts — multi-engine portfolio
8
+ * portfolio-consensus-adjudicator.ts — family-aware corroboration
9
+ * portfolio-consensus-memory.ts — honest cross-session memory
10
+ * portfolio-terminal-governor.ts — corrected adaptive quarantine
11
+ * this file — structured pre-fetch + real-time
12
+ * independence + marginal advisory
13
+ */
14
+
15
+ import {
16
+ ENGINE_FAMILY,
17
+ familyOf,
18
+ groundWithAdaptivePortfolioConsensus,
19
+ runPortfolioConsensusMemoryDiagnostics,
20
+ type AdaptivePortfolioOptions,
21
+ type PortfolioMemorySnapshot,
22
+ } from "./portfolio-consensus-memory";
23
+ import {
24
+ groundWithTerminalPortfolioGovernor,
25
+ runPortfolioTerminalGovernorDiagnostics,
26
+ } from "./portfolio-terminal-governor";
27
+ import {
28
+ runPortfolioConsensusDiagnostics,
29
+ type ConsensusConfidence,
30
+ type ConsensusSelection,
31
+ type PortfolioConsensusResult,
32
+ } from "./portfolio-consensus-adjudicator";
33
+ import {
34
+ runCanonicalPortfolioDiagnostics,
35
+ type CanonicalLaneId,
36
+ type LaneExecution,
37
+ type NormalizedLaneResult,
38
+ type StandardSource,
39
+ } from "./canonical-portfolio-orchestrator";
40
+ import {
41
+ runSpaRescueBridgeDiagnostics,
42
+ } from "./spa-rescue-bridge";
43
+ import {
44
+ structuredSearch,
45
+ type StructuredAdapterOptions,
46
+ type StructuredItem,
47
+ } from "./structured-source-adapter";
48
+
49
+ export interface TerminalCompleteOptions extends AdaptivePortfolioOptions {
50
+ structuredPreFetch?: boolean;
51
+ openAlexApiKey?: string;
52
+ terminalGovernor?: boolean;
53
+ memoryProfile?: string;
54
+ adaptiveQuarantine?: boolean;
55
+ quarantineMinSamples?: number;
56
+ quarantineCooldownMs?: number;
57
+ minimumEnabledLanes?: number;
58
+ minimumIndependentFamilies?: number;
59
+ }
60
+
61
+ export interface TerminalPortfolioIndependence {
62
+ distinctFamilies: number;
63
+ fulfilledFamilies: string[];
64
+ effectiveWitnessCount: number;
65
+ }
66
+
67
+ export interface TerminalMarginalGain {
68
+ fulfilledCount: number;
69
+ failedCount: number;
70
+ extraLanesChangedWinner: boolean;
71
+ attestedDelta: number;
72
+ assessment: "high-value" | "moderate-value" | "low-value" | "single-lane-only";
73
+ }
74
+
75
+ export interface TerminalCompleteResult extends PortfolioConsensusResult {
76
+ prunedLanes: CanonicalLaneId[];
77
+ memorySnapshot: PortfolioMemorySnapshot;
78
+ structuredItems: StructuredItem[];
79
+ portfolioIndependence: TerminalPortfolioIndependence;
80
+ marginalGain: TerminalMarginalGain;
81
+ }
82
+
83
+ function computeRealTimeIndependence(laneResults: LaneExecution[]): TerminalPortfolioIndependence {
84
+ const families = new Set<string>();
85
+ for (const lr of laneResults) {
86
+ if (lr.status === "fulfilled") families.add(familyOf(lr.id));
87
+ }
88
+ const sorted = Array.from(families).sort();
89
+ return { distinctFamilies: families.size, fulfilledFamilies: sorted, effectiveWitnessCount: families.size };
90
+ }
91
+
92
+ function computeMarginalGain(
93
+ laneResults: LaneExecution[],
94
+ canonicalWinnerId: CanonicalLaneId | undefined,
95
+ consensusWinnerId: CanonicalLaneId | undefined,
96
+ ): TerminalMarginalGain {
97
+ const fulfilled = laneResults.filter((lr) => lr.status === "fulfilled");
98
+ const failedCount = laneResults.length - fulfilled.length;
99
+ if (fulfilled.length <= 1) {
100
+ return { fulfilledCount: fulfilled.length, failedCount, extraLanesChangedWinner: false, attestedDelta: 0, assessment: "single-lane-only" };
101
+ }
102
+ const changedWinner = canonicalWinnerId !== undefined && consensusWinnerId !== undefined && canonicalWinnerId !== consensusWinnerId;
103
+ const effectiveWinnerId = consensusWinnerId ?? canonicalWinnerId;
104
+ const winnerLane = fulfilled.find((lr) => lr.id === effectiveWinnerId);
105
+ const winnerAttested = winnerLane?.normalized?.attestedCount ?? 0;
106
+ const bestOtherAttested = Math.max(0, ...fulfilled.filter((lr) => lr.id !== effectiveWinnerId).map((lr) => lr.normalized?.attestedCount ?? 0));
107
+ const attestedDelta = winnerAttested - bestOtherAttested;
108
+ const assessment = changedWinner || attestedDelta >= 2 ? "high-value" : attestedDelta >= 1 || fulfilled.length >= 3 ? "moderate-value" : "low-value";
109
+ return { fulfilledCount: fulfilled.length, failedCount, extraLanesChangedWinner: changedWinner, attestedDelta, assessment };
110
+ }
111
+
112
+ function buildEmpty(provider: string): TerminalCompleteResult {
113
+ return {
114
+ ok: false,
115
+ provider,
116
+ selection: "canonical" as ConsensusSelection,
117
+ count: 0,
118
+ sources: [],
119
+ evidenceBlock: "",
120
+ consensusConfidence: "none" as ConsensusConfidence,
121
+ consensusCaveat: "",
122
+ laneConsensus: [],
123
+ claimCorroboration: [],
124
+ decisionLedger: [],
125
+ agreement: [],
126
+ laneResults: [],
127
+ winnerRaw: undefined,
128
+ prunedLanes: [],
129
+ memorySnapshot: { laneReliability: [], familyPriors: [] },
130
+ structuredItems: [],
131
+ portfolioIndependence: { distinctFamilies: 0, fulfilledFamilies: [], effectiveWitnessCount: 0 },
132
+ marginalGain: { fulfilledCount: 0, failedCount: 0, extraLanesChangedWinner: false, attestedDelta: 0, assessment: "single-lane-only" },
133
+ };
134
+ }
135
+
136
+ export async function groundTerminalComplete(question: string, opts?: TerminalCompleteOptions): Promise<TerminalCompleteResult> {
137
+ const dbg = opts?.onDebug ?? (() => {});
138
+ const normalized = (question ?? "").replace(/\s+/g, " ").trim();
139
+ if (!normalized) return buildEmpty("terminal-complete(empty)");
140
+ const doStructured = opts?.structuredPreFetch !== false;
141
+
142
+ const structuredPromise = doStructured
143
+ ? structuredSearch(normalized, { signal: opts?.signal, limitPerSource: 6, openAlexApiKey: opts?.openAlexApiKey } satisfies StructuredAdapterOptions).catch(() => ({ items: [] as StructuredItem[], queriedSources: [] as string[], totalFound: 0 }))
144
+ : Promise.resolve({ items: [] as StructuredItem[], queriedSources: [] as string[], totalFound: 0 });
145
+
146
+ dbg("terminal-complete: portfolio memory governor");
147
+ const portfolioResult = opts?.terminalGovernor === false
148
+ ? await groundWithAdaptivePortfolioConsensus(normalized, { ...opts, onDebug: (m) => dbg(`[adaptive] ${m}`) })
149
+ : await groundWithTerminalPortfolioGovernor(normalized, { ...opts, onDebug: (m) => dbg(`[governor] ${m}`) });
150
+
151
+ const structured = await structuredPromise;
152
+ dbg(`terminal-complete: structured → ${structured.items.length} items from [${structured.queriedSources?.join(",") ?? ""}]`);
153
+
154
+ const portfolioIndependence = computeRealTimeIndependence(portfolioResult.laneResults);
155
+ const marginalGain = computeMarginalGain(portfolioResult.laneResults, portfolioResult.canonicalWinnerLane, portfolioResult.consensusWinnerLane);
156
+
157
+ const seenUrls = new Set<string>(portfolioResult.sources.map((s) => s.url));
158
+ const structuredAsSources: StandardSource[] = [];
159
+ for (const item of structured.items) {
160
+ const url = item.externalUrl ?? (item.doi ? `https://doi.org/${item.doi}` : undefined) ?? `structured:${item.kind}:${item.title.slice(0, 40)}`;
161
+ if (!url || seenUrls.has(url)) continue;
162
+ seenUrls.add(url);
163
+ structuredAsSources.push({ title: item.title || "Structured Item", url, content: (item.pageContent || item.abstract || "").slice(0, 1800) });
164
+ }
165
+ const mergedSources = [...portfolioResult.sources, ...structuredAsSources];
166
+
167
+ let evidenceBlock = portfolioResult.evidenceBlock;
168
+ if (structured.items.length > 0 && evidenceBlock.length > 0) {
169
+ const lines = structured.items.slice(0, 6).map((it, i) => `[STRUCTURED:${it.kind.toUpperCase()}:${i + 1}] ${it.title}\n${(it.pageContent || "").slice(0, 360)}`).join("\n\n");
170
+ const insertAt = evidenceBlock.lastIndexOf("END RETRIEVED CONTENT");
171
+ if (insertAt >= 0) {
172
+ evidenceBlock = evidenceBlock.slice(0, insertAt) + "BEGIN STRUCTURED API ITEMS\n" + lines + "\nEND STRUCTURED API ITEMS\n\n" + evidenceBlock.slice(insertAt);
173
+ }
174
+ }
175
+
176
+ const provider = `terminal-complete(${portfolioResult.provider}+structured:${structured.items.length}+pruned:${portfolioResult.prunedLanes.length}+families:${portfolioIndependence.distinctFamilies})`;
177
+ return { ...portfolioResult, sources: mergedSources, count: mergedSources.length, evidenceBlock, provider, structuredItems: structured.items, portfolioIndependence, marginalGain };
178
+ }
179
+
180
+ export async function runTerminalCompleteDiagnostics(): Promise<{
181
+ ok: boolean;
182
+ suites: Array<{ name: string; ok: boolean; checks: Array<{ id: string; passed: boolean; detail: string }> }>;
183
+ }> {
184
+ const suites: Array<{ name: string; ok: boolean; checks: Array<{ id: string; passed: boolean; detail: string }> }> = [];
185
+ const run = async (name: string, fn: (() => Promise<{ ok: boolean; checks: Array<{ id: string; passed: boolean; detail: string }> }>) | (() => { ok: boolean; checks: Array<{ id: string; passed: boolean; detail: string }> })) => {
186
+ try {
187
+ const result = await fn();
188
+ suites.push({ name, ok: result.ok, checks: result.checks });
189
+ } catch (e) {
190
+ suites.push({ name, ok: false, checks: [{ id: "suite-error", passed: false, detail: e instanceof Error ? e.message : String(e) }] });
191
+ }
192
+ };
193
+ await run("canonical-portfolio-orchestrator", () => runCanonicalPortfolioDiagnostics());
194
+ await run("portfolio-consensus-adjudicator", () => runPortfolioConsensusDiagnostics());
195
+ await run("portfolio-consensus-memory", () => runPortfolioConsensusMemoryDiagnostics());
196
+ await run("portfolio-terminal-governor", () => runPortfolioTerminalGovernorDiagnostics());
197
+ await run("spa-rescue-bridge", () => runSpaRescueBridgeDiagnostics());
198
+
199
+ const synChecks: Array<{ id: string; passed: boolean; detail: string }> = [];
200
+ const add = (id: string, passed: boolean, detail: string) => synChecks.push({ id, passed, detail });
201
+ const mockFulfilled: LaneExecution[] = [
202
+ { id: "terminal-wire" as CanonicalLaneId, priority: 100, status: "fulfilled", elapsedMs: 300, normalized: { ok: true, acceptable: true, eligibleForWinner: true, provider: "tw", evidenceBlock: "x", sources: [], sourceCount: 1, claimCount: 1, structuredItemCount: 0, attestedCount: 2, supportedCount: 0, conflictedCount: 0, proof: "verified", qualityVector: [1, 4, 2, 0, 1, 1, 100] } as NormalizedLaneResult },
203
+ { id: "omni-nexus" as CanonicalLaneId, priority: 60, status: "fulfilled", elapsedMs: 400, normalized: { ok: true, acceptable: true, eligibleForWinner: true, provider: "on", evidenceBlock: "y", sources: [], sourceCount: 1, claimCount: 1, structuredItemCount: 0, attestedCount: 0, supportedCount: 1, conflictedCount: 0, proof: "bound", qualityVector: [1, 3, 0, 1, 1, 1, 100] } as NormalizedLaneResult },
204
+ { id: "sentinel-orchestrator" as CanonicalLaneId, priority: 95, status: "rejected", elapsedMs: 50, error: "timeout" },
205
+ ];
206
+ const ind = computeRealTimeIndependence(mockFulfilled);
207
+ add("independence-two-fulfilled-families", ind.distinctFamilies === 2 && ind.fulfilledFamilies.includes("conclave-core") && ind.fulfilledFamilies.includes("omni-standalone"), `families=${ind.fulfilledFamilies.join(",")}`);
208
+ add("independence-rejected-excluded", ind.effectiveWitnessCount === ind.distinctFamilies, `ewc=${ind.effectiveWitnessCount}`);
209
+ const mg1 = computeMarginalGain([mockFulfilled[0]], "terminal-wire", "terminal-wire");
210
+ add("marginal-single-lane", mg1.assessment === "single-lane-only", `assessment=${mg1.assessment}`);
211
+ const mg2 = computeMarginalGain([mockFulfilled[0], mockFulfilled[1]], "terminal-wire", "omni-nexus");
212
+ add("marginal-changed-winner-high-value", mg2.extraLanesChangedWinner && mg2.assessment === "high-value" && mg2.fulfilledCount === 2, `changed=${mg2.extraLanesChangedWinner}`);
213
+ add("engine-family-conclave-core", ENGINE_FAMILY["terminal-wire"] === "conclave-core" && ENGINE_FAMILY["sentinel-orchestrator"] === "conclave-core" && ENGINE_FAMILY["vanguard-packer"] === "conclave-core", `tw=${ENGINE_FAMILY["terminal-wire"]}`);
214
+ add("engine-family-standalone", ENGINE_FAMILY["sentinel-omega"] === "omega-standalone" && ENGINE_FAMILY["omni-nexus"] === "omni-standalone", `so=${ENGINE_FAMILY["sentinel-omega"]}`);
215
+ const empty = buildEmpty("test-empty");
216
+ add("empty-zero-state", !empty.ok && empty.count === 0 && empty.sources.length === 0 && empty.prunedLanes.length === 0 && empty.portfolioIndependence.distinctFamilies === 0, `ok=${empty.ok}`);
217
+ suites.push({ name: "terminal-complete-synthesis", ok: synChecks.every((c) => c.passed), checks: synChecks });
218
+ return { ok: suites.every((s) => s.ok), suites };
219
+ }
220
+
221
+ export { groundWithAdaptivePortfolioConsensus, getFamilyCorroborationPrior, getLaneReliability, getPortfolioMemorySnapshot, runPortfolioConsensusMemoryDiagnostics, familyOf, ENGINE_FAMILY, type AdaptivePortfolioOptions, type FamilyCorroborationPrior, type LaneReliability, type PortfolioMemorySnapshot } from "./portfolio-consensus-memory";
222
+ export { groundWithPortfolioConsensus, runPortfolioConsensusDiagnostics, type ClaimCorroboration, type ConsensusConfidence, type ConsensusSelection, type DecisionLedgerEntry, type LaneConsensus, type PortfolioConsensusOptions, type PortfolioConsensusResult } from "./portfolio-consensus-adjudicator";
223
+ export { groundWithCanonicalPortfolio, runCanonicalPortfolioDiagnostics, type AgreementCell, type CanonicalLaneId, type LaneExecution, type NormalizedLaneResult, type PortfolioGroundingResult, type PortfolioOptions, type StandardSource } from "./canonical-portfolio-orchestrator";
224
+ export { runSpaRescueBridgeDiagnostics, withSpaRescueCause, withSpaRescueFromRawResponse } from "./spa-rescue-bridge";