2sagaco48 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/diagnostics.mjs +141 -0
- package/dist/compute.worker-j5ahIpF-.js +1 -0
- package/dist/graph.worker-DG6iGCB9.js +1 -0
- package/dist/index.html +2314 -0
- package/flatten-guide.md +248 -0
- package/index.html +12 -0
- package/package.json +38 -0
- package/src/App.orig.tsx +204 -0
- package/src/App.orig1.tsx +27 -0
- package/src/App.orig2.tsx +25 -0
- package/src/App.tsx +3 -0
- package/src/BaseApp.tsx +18 -0
- package/src/INTEGRATION_LEDGER.md +22 -0
- package/src/PERSIST_CANARY.orig.txt +1 -0
- package/src/PERSIST_CANARY.txt +1 -0
- package/src/REGRESSION_LEDGER.md +651 -0
- package/src/TEMPLATE_PIPELINE_AUDIT.md +208 -0
- package/src/WILLIAMS_PERSONA_GUIDE.md +62 -0
- package/src/chat/VeritasChat.tsx +69 -0
- package/src/chat/synthesis.ts +31 -0
- package/src/chat/tier.ts +45 -0
- package/src/components/AdaptersPage.orig.tsx +99 -0
- package/src/components/AdaptersPage.tsx +3 -0
- package/src/components/AdversarialPanel.tsx +136 -0
- package/src/components/AnchorBaselinePanel.tsx +75 -0
- package/src/components/AnswerPanel.tsx +60 -0
- package/src/components/ArtifactPanel.tsx +43 -0
- package/src/components/ChatApp.orig.tsx +1582 -0
- package/src/components/ChatApp.orig1.tsx +722 -0
- package/src/components/ChatApp.tsx +95 -0
- package/src/components/ChatAugmentPanels.tsx +73 -0
- package/src/components/CitationLedgerPanel.tsx +313 -0
- package/src/components/ComputeSandboxPanel.tsx +130 -0
- package/src/components/ConfigPanel.tsx +110 -0
- package/src/components/ControlPlanePage.tsx +195 -0
- package/src/components/CreativeTreeLifePage.tsx +234 -0
- package/src/components/CreativeTreeOfLifePanel.tsx +149 -0
- package/src/components/DebugTracePanel.tsx +137 -0
- package/src/components/DeepReasoningTrace.tsx +48 -0
- package/src/components/EntitySheetPanel.tsx +51 -0
- package/src/components/FailureModesPanel.tsx +104 -0
- package/src/components/GBSDashboard.tsx +239 -0
- package/src/components/GraphView.tsx +116 -0
- package/src/components/HUD.tsx +125 -0
- package/src/components/HypothesisPanel.tsx +67 -0
- package/src/components/InnovationGenomeEngine.tsx +792 -0
- package/src/components/InnovationPersonaGuide.tsx +348 -0
- package/src/components/InnovationPersonaPanel.tsx +289 -0
- package/src/components/LiveResourceHUD.tsx +109 -0
- package/src/components/LongWriterPanel.tsx +112 -0
- package/src/components/MainPipelineV10Bridge.tsx +72 -0
- package/src/components/MarkdownLite.tsx +63 -0
- package/src/components/MemoryInspector.tsx +38 -0
- package/src/components/MemoryMonitor.tsx +52 -0
- package/src/components/MemoryStressPanel.tsx +176 -0
- package/src/components/ModulesPage.tsx +171 -0
- package/src/components/PipelineDebugConsole.orig.tsx +1856 -0
- package/src/components/PipelineDebugConsole.tsx +3 -0
- package/src/components/PreFlightHUD.tsx +67 -0
- package/src/components/PrismaFetchTracePanel.tsx +87 -0
- package/src/components/ReportOSPanel.tsx +165 -0
- package/src/components/ResourceEstimatorPage.tsx +327 -0
- package/src/components/RichText.tsx +181 -0
- package/src/components/SagaOsPanel.tsx +605 -0
- package/src/components/SagaOsReference.tsx +421 -0
- package/src/components/SagaOsV2Panel.tsx +594 -0
- package/src/components/SagaStyleTab.tsx +382 -0
- package/src/components/SageBlueprintPanel.tsx +416 -0
- package/src/components/SharedChatInput.tsx +77 -0
- package/src/components/StatFinancePanel.tsx +190 -0
- package/src/components/StylePersonaPanel.tsx +128 -0
- package/src/components/TemplatesPage.tsx +300 -0
- package/src/components/TestPanel.tsx +63 -0
- package/src/components/TraceLog.tsx +89 -0
- package/src/components/V15CalibrationAugment.tsx +1134 -0
- package/src/components/V15CalibrationDialog.tsx +1871 -0
- package/src/components/V15Overlay.orig.tsx +120 -0
- package/src/components/V15Overlay.tsx +4 -0
- package/src/components/V15OverlayWrapper.tsx +362 -0
- package/src/components/V15Toggle.tsx +34 -0
- package/src/console/DiagnosticRecoveryPanel.tsx +358 -0
- package/src/console/EngineeringConsole.tsx +103 -0
- package/src/console/FictionSystemPanels.tsx +882 -0
- package/src/console/InspectorPanels.tsx +254 -0
- package/src/console/ManuscriptGraderPanel.tsx +182 -0
- package/src/console/RecursiveReviserPanel.tsx +245 -0
- package/src/console/SeedControlPanel.tsx +135 -0
- package/src/console/StoryControllerPanel.tsx +443 -0
- package/src/console/engineBridge.ts +258 -0
- package/src/console/gemini.ts +106 -0
- package/src/console/grading.ts +250 -0
- package/src/console/util.ts +45 -0
- package/src/fiction/continuity.ts +372 -0
- package/src/fiction/crash-protection.ts +111 -0
- package/src/fiction/diagnostics.ts +208 -0
- package/src/fiction/diff.ts +74 -0
- package/src/fiction/entity-state-machine.ts +214 -0
- package/src/fiction/nive-engine.ts +404 -0
- package/src/fiction/pipeline-selftest.ts +132 -0
- package/src/fiction/seed-control.ts +193 -0
- package/src/fiction/story-engine.ts +326 -0
- package/src/fiction/types.ts +68 -0
- package/src/flatten-guide.md +379 -0
- package/src/index.css +14 -0
- package/src/index.orig.css +13 -0
- package/src/lib/academic-sources.base.ts +188 -0
- package/src/lib/academic-sources.orig.ts +28 -0
- package/src/lib/academic-sources.ts +10 -0
- package/src/lib/advanced-math.ts +119 -0
- package/src/lib/adversarial-engine.base.ts +409 -0
- package/src/lib/adversarial-engine.ts +82 -0
- package/src/lib/ai-revision.ts +623 -0
- package/src/lib/app-state.tsx +426 -0
- package/src/lib/artifact-registry.ts +97 -0
- package/src/lib/artifacts.ts +180 -0
- package/src/lib/atlas-dr.ts +167 -0
- package/src/lib/browser-mtls.ts +127 -0
- package/src/lib/browser-queue.ts +221 -0
- package/src/lib/browser-search-scraper.base.ts +382 -0
- package/src/lib/browser-search-scraper.orig.ts +90 -0
- package/src/lib/browser-search-scraper.ts +10 -0
- package/src/lib/calc-interceptor.ts +82 -0
- package/src/lib/citation-lane-tap.ts +78 -0
- package/src/lib/citation-ledger-store.ts +369 -0
- package/src/lib/citation-ledger.ts +203 -0
- package/src/lib/compute-sandbox.ts +215 -0
- package/src/lib/compute.worker.ts +153 -0
- package/src/lib/connectors/gemini.ts +120 -0
- package/src/lib/connectors/jina.ts +233 -0
- package/src/lib/connectors/marketdata.ts +51 -0
- package/src/lib/connectors/prismafetch.base.ts +175 -0
- package/src/lib/connectors/prismafetch.ts +1 -0
- package/src/lib/connectors/serpapi.ts +65 -0
- package/src/lib/connectors/wikidata.ts +44 -0
- package/src/lib/constraints.ts +331 -0
- package/src/lib/continuation-detector.base.ts +153 -0
- package/src/lib/continuation-detector.ts +48 -0
- package/src/lib/contradraft.ts +168 -0
- package/src/lib/cors-proxy.ts +120 -0
- package/src/lib/coverage.ts +81 -0
- package/src/lib/debug/architecture-prescription.ts +556 -0
- package/src/lib/debug/covea-repair.ts +543 -0
- package/src/lib/debug/helios-ground.ts +319 -0
- package/src/lib/debug/intent-decomposer.ts +281 -0
- package/src/lib/debug/intent-lattice.ts +349 -0
- package/src/lib/debug/pipeline-diagnosis.ts +1149 -0
- package/src/lib/debug/pipeline-trace-bus.ts +424 -0
- package/src/lib/debug/prompt-forge.ts +678 -0
- package/src/lib/debug/repair-sites.ts +513 -0
- package/src/lib/debug/research-phase.ts +266 -0
- package/src/lib/debug/retrieval-context.ts +76 -0
- package/src/lib/debug/retrieval-hardener.ts +142 -0
- package/src/lib/debug/scraper-debug-runner.ts +576 -0
- package/src/lib/debug/scraper-forensics.ts +418 -0
- package/src/lib/debug/scraper-lane-roadmap.ts +136 -0
- package/src/lib/debug/self-test.ts +415 -0
- package/src/lib/debug/step-attribution.ts +211 -0
- package/src/lib/debug/template-rubric.ts +301 -0
- package/src/lib/debug/unified-innovation.ts +126 -0
- package/src/lib/debug/veritas-hybrid-scraper.ts +335 -0
- package/src/lib/defense-registry.ts +104 -0
- package/src/lib/defenses.ts +162 -0
- package/src/lib/deterministic-citation-ledger.ts +174 -0
- package/src/lib/elo-registry.base.ts +117 -0
- package/src/lib/elo-registry.ts +1 -0
- package/src/lib/entity-resolver.ts +291 -0
- package/src/lib/failure-modes.ts +267 -0
- package/src/lib/feature-registry.ts +69 -0
- package/src/lib/flaw-registry.ts +143 -0
- package/src/lib/flaws/_template.ts +52 -0
- package/src/lib/flaws/builtins.ts +63 -0
- package/src/lib/flaws/finance.ts +169 -0
- package/src/lib/flaws/fixers.ts +10 -0
- package/src/lib/flaws/index.ts +32 -0
- package/src/lib/flaws/legal.ts +157 -0
- package/src/lib/flaws/medical.ts +188 -0
- package/src/lib/flaws/original-defenses-pack.ts +81 -0
- package/src/lib/flaws/sample-declarative-pack.json +38 -0
- package/src/lib/flaws/selftest.ts +201 -0
- package/src/lib/flaws/software-extended.ts +125 -0
- package/src/lib/flaws/software-rn-webgl.ts +182 -0
- package/src/lib/flaws/statistics-advanced.ts +46 -0
- package/src/lib/flaws/statistics.ts +61 -0
- package/src/lib/gbse/config.ts +20 -0
- package/src/lib/gbse/engine.ts +226 -0
- package/src/lib/gbse/graph.ts +118 -0
- package/src/lib/gbse/graph.worker.ts +21 -0
- package/src/lib/gbse/tests.ts +117 -0
- package/src/lib/gbse/tiers.ts +65 -0
- package/src/lib/gbse/types.ts +94 -0
- package/src/lib/innovation-genome-engine-v2.orig.ts +1001 -0
- package/src/lib/innovation-genome-engine-v2.ts +3 -0
- package/src/lib/innovation-genome-engine.orig.ts +330 -0
- package/src/lib/innovation-genome-engine.ts +3 -0
- package/src/lib/innovation-genome-v10.orig.ts +314 -0
- package/src/lib/innovation-genome-v10.ts +2 -0
- package/src/lib/innovation-genome-v3.orig.ts +2015 -0
- package/src/lib/innovation-genome-v3.ts +2 -0
- package/src/lib/innovation-genome-v4.orig.ts +1959 -0
- package/src/lib/innovation-genome-v4.ts +2 -0
- package/src/lib/innovation-genome-v5.orig.ts +1210 -0
- package/src/lib/innovation-genome-v5.ts +2 -0
- package/src/lib/innovation-genome-v7.orig.ts +2549 -0
- package/src/lib/innovation-genome-v7.ts +2 -0
- package/src/lib/innovation-genome-v8.orig.ts +1485 -0
- package/src/lib/innovation-genome-v8.ts +2 -0
- package/src/lib/innovation-genome-v9.orig.ts +643 -0
- package/src/lib/innovation-genome-v9.ts +2 -0
- package/src/lib/jina.base.ts +293 -0
- package/src/lib/jina.ts +1 -0
- package/src/lib/live-telemetry.ts +61 -0
- package/src/lib/longwriter.ts +84 -0
- package/src/lib/manuscript-grade-v2.ts +298 -0
- package/src/lib/memory-governor.ts +173 -0
- package/src/lib/memory-stress-tests.ts +248 -0
- package/src/lib/model-intelligence.ts +48 -0
- package/src/lib/model-rotator.ts +75 -0
- package/src/lib/models.orig.ts +513 -0
- package/src/lib/models.ts +151 -0
- package/src/lib/n-deep.base.ts +592 -0
- package/src/lib/n-deep.ts +51 -0
- package/src/lib/nih-simulator.ts +56 -0
- package/src/lib/nih-vulnerability-fixes.ts +460 -0
- package/src/lib/omega-templates.base.ts +294 -0
- package/src/lib/omega-templates.ts +225 -0
- package/src/lib/omni-nexus.ts +64 -0
- package/src/lib/oracle-adapters.ts +67 -0
- package/src/lib/oracle-registry.ts +163 -0
- package/src/lib/orchestrator.ts +357 -0
- package/src/lib/output-boundary.ts +235 -0
- package/src/lib/overrides/vite-native-chaos-harness.ts +154 -0
- package/src/lib/overrides/vite-native-contract-plane.ts +245 -0
- package/src/lib/overrides/vite-native-doctor-plane.ts +208 -0
- package/src/lib/overrides/vite-native-knowledge-store.ts +267 -0
- package/src/lib/overrides/vite-native-policy-plane.ts +190 -0
- package/src/lib/overrides/vite-native-replay-plane.ts +197 -0
- package/src/lib/overrides/vite-native-runtime-plane.ts +106 -0
- package/src/lib/overrides/vite-native-scraper.ts +848 -0
- package/src/lib/overrides/vite-native-selftest-functional.ts +217 -0
- package/src/lib/overrides/vite-native-selftest.ts +183 -0
- package/src/lib/overrides/vite-native-snapshot-plane.ts +123 -0
- package/src/lib/philosophy-toolkit.ts +75 -0
- package/src/lib/pipeline.orig.ts +659 -0
- package/src/lib/pipeline.ts +42 -0
- package/src/lib/precache.ts +128 -0
- package/src/lib/py-sandbox.ts +205 -0
- package/src/lib/quality-score.ts +96 -0
- package/src/lib/quant-engine.ts +231 -0
- package/src/lib/quant-lib.ts +80 -0
- package/src/lib/reportos.ts +175 -0
- package/src/lib/research-os.ts +306 -0
- package/src/lib/resource-estimator.ts +114 -0
- package/src/lib/rpm-governor.ts +93 -0
- package/src/lib/runtime-estimator.ts +135 -0
- package/src/lib/sage/empty-space-v6.ts +560 -0
- package/src/lib/sage/empty-space-v7.ts +222 -0
- package/src/lib/sage/empty-space.ts +733 -0
- package/src/lib/sage/engine.ts +786 -0
- package/src/lib/sage/index.ts +17 -0
- package/src/lib/sage/judge.ts +246 -0
- package/src/lib/sage/prng.ts +53 -0
- package/src/lib/sage/reality-grounding.ts +380 -0
- package/src/lib/sage/repetition.ts +151 -0
- package/src/lib/sage/saga-os-v2-engines.ts +1870 -0
- package/src/lib/sage/saga-os-v2.ts +274 -0
- package/src/lib/sage/saga-os-v3-core.ts +1491 -0
- package/src/lib/sage/saga-os-v3-release.ts +739 -0
- package/src/lib/sage/saga-os-v4-aureate.ts +1161 -0
- package/src/lib/sage/saga-os-v4.ts +212 -0
- package/src/lib/sage/saga-os-v5.ts +205 -0
- package/src/lib/sage/saga-os-v6.ts +346 -0
- package/src/lib/sage/saga-os-v7.ts +314 -0
- package/src/lib/sage/saga-os-v8.ts +505 -0
- package/src/lib/sage/saga-os.ts +329 -0
- package/src/lib/sage/taxonomy.ts +403 -0
- package/src/lib/sage/unified-roll.ts +524 -0
- package/src/lib/sage/worked-sketches.ts +44 -0
- package/src/lib/sage.ts +166 -0
- package/src/lib/scraper-debug-bus.ts +53 -0
- package/src/lib/scraper-enhanced.orig.ts +153 -0
- package/src/lib/scraper-enhanced.ts +10 -0
- package/src/lib/scraper-hardener.base.orig.ts +155 -0
- package/src/lib/scraper-hardener.base.ts +317 -0
- package/src/lib/scraper-hardener.ts +1 -0
- package/src/lib/scraper-palisade/palisade-adjudicator.orig.ts +419 -0
- package/src/lib/scraper-palisade/palisade-adjudicator.ts +13 -0
- package/src/lib/scraper-vnext/arbiter-omega.orig.ts +688 -0
- package/src/lib/scraper-vnext/arbiter-omega.ts +13 -0
- package/src/lib/scraper-vnext/canonical-portfolio-augments.ts +479 -0
- package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.orig.ts +1529 -0
- package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.ts +13 -0
- package/src/lib/scraper-vnext/conclave-omega.ts +1830 -0
- package/src/lib/scraper-vnext/content-extractor-v2.ts +226 -0
- package/src/lib/scraper-vnext/diagnostics-suite.ts +36 -0
- package/src/lib/scraper-vnext/epistemic-packer.ts +97 -0
- package/src/lib/scraper-vnext/fusion-v2.ts +65 -0
- package/src/lib/scraper-vnext/hydra-reader.orig.ts +1216 -0
- package/src/lib/scraper-vnext/hydra-reader.ts +13 -0
- package/src/lib/scraper-vnext/native-scraper-browser-vnext.orig.ts +91 -0
- package/src/lib/scraper-vnext/native-scraper-browser-vnext.ts +13 -0
- package/src/lib/scraper-vnext/nexus-consensus.orig.ts +905 -0
- package/src/lib/scraper-vnext/nexus-consensus.ts +13 -0
- package/src/lib/scraper-vnext/portfolio-consensus-adjudicator.ts +804 -0
- package/src/lib/scraper-vnext/portfolio-consensus-memory.ts +377 -0
- package/src/lib/scraper-vnext/portfolio-terminal-governor.ts +548 -0
- package/src/lib/scraper-vnext/query-strategist.orig.ts +224 -0
- package/src/lib/scraper-vnext/query-strategist.ts +423 -0
- package/src/lib/scraper-vnext/retrieval-accelerator.ts +708 -0
- package/src/lib/scraper-vnext/retrieval-audit-augments.ts +477 -0
- package/src/lib/scraper-vnext/retrieval-control-plane.ts +904 -0
- package/src/lib/scraper-vnext/retrieval-policy-augments.ts +358 -0
- package/src/lib/scraper-vnext/safe-fetch-v2.ts +157 -0
- package/src/lib/scraper-vnext/sentinel-omega.ts +56 -0
- package/src/lib/scraper-vnext/sentinel-orchestrator.ts +69 -0
- package/src/lib/scraper-vnext/sibyl-oracle.orig.ts +413 -0
- package/src/lib/scraper-vnext/sibyl-oracle.ts +13 -0
- package/src/lib/scraper-vnext/smart-read-v2.ts +55 -0
- package/src/lib/scraper-vnext/spa-rescue-bridge.ts +608 -0
- package/src/lib/scraper-vnext/strata-engine.orig.ts +2666 -0
- package/src/lib/scraper-vnext/strata-engine.ts +13 -0
- package/src/lib/scraper-vnext/structured-source-adapter.orig.ts +369 -0
- package/src/lib/scraper-vnext/structured-source-adapter.ts +34 -0
- package/src/lib/scraper-vnext/terminal-complete.ts +224 -0
- package/src/lib/scraper-vnext/terminal-final.ts +277 -0
- package/src/lib/scraper-vnext/terminal-saturation.ts +345 -0
- package/src/lib/scraper-vnext/terminal-wire.ts +425 -0
- package/src/lib/scraper-vnext/vanguard-titanium.orig.ts +467 -0
- package/src/lib/scraper-vnext/vanguard-titanium.ts +17 -0
- package/src/lib/search-cache.ts +138 -0
- package/src/lib/sloop-runner.base.ts +223 -0
- package/src/lib/sloop-runner.ts +104 -0
- package/src/lib/sloop.ts +114 -0
- package/src/lib/small-model-adapters.ts +82 -0
- package/src/lib/sscp.ts +86 -0
- package/src/lib/system-map.ts +54 -0
- package/src/lib/uni-node.ts +86 -0
- package/src/lib/universal-rigor-guard.ts +433 -0
- package/src/lib/v15-gate-testbed.ts +274 -0
- package/src/lib/v15-gemini.base.ts +89 -0
- package/src/lib/v15-gemini.ts +1 -0
- package/src/lib/v15-grounding.orig.ts +241 -0
- package/src/lib/v15-grounding.ts +79 -0
- package/src/lib/v15-pipeline.base.ts +769 -0
- package/src/lib/v15-pipeline.orig.ts +1154 -0
- package/src/lib/v15-pipeline.ts +674 -0
- package/src/lib/v15-questions.ts +64 -0
- package/src/lib/v15-rate-limiter.orig.ts +91 -0
- package/src/lib/v15-rate-limiter.ts +48 -0
- package/src/lib/v15-state.base.ts +87 -0
- package/src/lib/v15-state.ts +28 -0
- package/src/lib/visual-table-generator.tsx +207 -0
- package/src/lib/wasm-runtime.ts +133 -0
- package/src/lib/williams-persona-guide.ts +265 -0
- package/src/lib/williams-style.base.ts +464 -0
- package/src/lib/williams-style.ts +59 -0
- package/src/lib/worker-pool.ts +96 -0
- package/src/lib/writing-tiers.ts +125 -0
- package/src/main.orig.tsx +10 -0
- package/src/main.tsx +10 -0
- package/src/utils/cn.orig.ts +6 -0
- package/src/utils/cn.ts +6 -0
- package/src/vite-env.d.ts +1 -0
- package/tsconfig.json +31 -0
- package/unify.mjs +537 -0
- package/vite.config.ts +18 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { useAppState } from "../lib/app-state";
|
|
2
|
+
import { TIERS } from "../lib/gbse/tiers";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Live Resource HUD — StarCraft style real-time resource monitor.
|
|
6
|
+
* Shows est vs act for Time, Tokens, Tools, Paths, States.
|
|
7
|
+
*/
|
|
8
|
+
export function LiveResourceHUD() {
|
|
9
|
+
const { telemetry, lastRun } = useAppState();
|
|
10
|
+
|
|
11
|
+
const tier = lastRun?.tier ?? telemetry.tier;
|
|
12
|
+
const spec = tier !== null && tier !== undefined ? TIERS[tier] : null;
|
|
13
|
+
|
|
14
|
+
// Pre-flight estimates
|
|
15
|
+
const estTime = spec?.maxSeconds ?? 0;
|
|
16
|
+
const estTokens = spec?.maxTokens ?? 0;
|
|
17
|
+
const estTools = spec?.evidenceProbes ?? 0;
|
|
18
|
+
const estPaths = spec?.hypothesisCount ?? 0;
|
|
19
|
+
|
|
20
|
+
// Live actuals
|
|
21
|
+
const actTime = telemetry.elapsedMs / 1000;
|
|
22
|
+
const actTokens = telemetry.tokensIn + telemetry.tokensOut;
|
|
23
|
+
const actTools = telemetry.toolCalls;
|
|
24
|
+
const actPaths = telemetry.hypotheses;
|
|
25
|
+
|
|
26
|
+
const isRunning = telemetry.running;
|
|
27
|
+
|
|
28
|
+
function Diff({ act, est, unit = "", lowerIsBetter = true }: { act: number; est: number; unit?: string; lowerIsBetter?: boolean }) {
|
|
29
|
+
const delta = act - est;
|
|
30
|
+
if (est === 0) return <span className="text-zinc-400">0{unit}</span>;
|
|
31
|
+
const isWarn = lowerIsBetter ? delta > 0 : delta < 0;
|
|
32
|
+
return (
|
|
33
|
+
<span className={isWarn ? "text-amber-600" : "text-emerald-600"}>
|
|
34
|
+
{delta > 0 ? "+" : ""}{delta.toFixed(0)}{unit}
|
|
35
|
+
</span>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<div className="rounded-2xl border border-zinc-800 bg-zinc-950 p-4 font-mono text-[11px] leading-tight text-emerald-400 shadow-2xl">
|
|
41
|
+
<div className="flex items-center justify-between mb-3 border-b border-zinc-800 pb-2">
|
|
42
|
+
<div className="flex items-center gap-2">
|
|
43
|
+
<span className="text-zinc-500 font-bold uppercase tracking-widest">AEGIS-PHI ::</span>
|
|
44
|
+
<span className="text-white font-bold">{spec?.name ?? "IDLE"}</span>
|
|
45
|
+
<span className="text-zinc-500 font-bold">::</span>
|
|
46
|
+
<span className={isRunning ? "text-sky-400 animate-pulse" : "text-zinc-600"}>
|
|
47
|
+
{isRunning ? "LIVE" : "IDLE"}
|
|
48
|
+
</span>
|
|
49
|
+
</div>
|
|
50
|
+
<div className="text-zinc-500">{actTime.toFixed(1)}s</div>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div className="grid gap-x-6 gap-y-1">
|
|
54
|
+
<div className="grid grid-cols-[80px_1fr_1fr_1fr] border-b border-zinc-900 pb-1">
|
|
55
|
+
<span className="text-zinc-500 font-bold">METRIC</span>
|
|
56
|
+
<span className="text-zinc-500 text-right uppercase">EST</span>
|
|
57
|
+
<span className="text-zinc-500 text-right uppercase">ACT</span>
|
|
58
|
+
<span className="text-zinc-500 text-right uppercase">Δ</span>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div className="grid grid-cols-[80px_1fr_1fr_1fr]">
|
|
62
|
+
<span className="text-emerald-300">TIME</span>
|
|
63
|
+
<span className="text-right">{estTime}s</span>
|
|
64
|
+
<span className="text-right text-white">{actTime.toFixed(1)}s</span>
|
|
65
|
+
<span className="text-right"><Diff act={actTime} est={estTime} unit="s" /></span>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div className="grid grid-cols-[80px_1fr_1fr_1fr]">
|
|
69
|
+
<span className="text-emerald-300">TOKENS</span>
|
|
70
|
+
<span className="text-right">{(estTokens/1000).toFixed(0)}K</span>
|
|
71
|
+
<span className="text-right text-white">{(actTokens/1000).toFixed(1)}K</span>
|
|
72
|
+
<span className="text-right"><Diff act={actTokens} est={estTokens} /></span>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<div className="grid grid-cols-[80px_1fr_1fr_1fr]">
|
|
76
|
+
<span className="text-emerald-300">TOOLS</span>
|
|
77
|
+
<span className="text-right">{estTools}</span>
|
|
78
|
+
<span className="text-right text-white">{actTools}</span>
|
|
79
|
+
<span className="text-right"><Diff act={actTools} est={estTools} /></span>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<div className="grid grid-cols-[80px_1fr_1fr_1fr]">
|
|
83
|
+
<span className="text-emerald-300">PATHS</span>
|
|
84
|
+
<span className="text-right">{estPaths}</span>
|
|
85
|
+
<span className="text-right text-white">{actPaths}</span>
|
|
86
|
+
<span className="text-right"><Diff act={actPaths} est={estPaths} lowerIsBetter={false} /></span>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<div className="grid grid-cols-[80px_1fr_1fr_1fr]">
|
|
90
|
+
<span className="text-emerald-300">STATES</span>
|
|
91
|
+
<span className="text-right">{estPaths * 3}</span>
|
|
92
|
+
<span className="text-right text-white">{telemetry.claimsTotal}</span>
|
|
93
|
+
<span className="text-right"><Diff act={telemetry.claimsTotal} est={estPaths * 3} lowerIsBetter={false} /></span>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
<div className="mt-4 flex items-center justify-between border-t border-zinc-900 pt-2 text-zinc-500">
|
|
98
|
+
<div className="flex gap-4">
|
|
99
|
+
<span>SOURCES <span className="text-white">{telemetry.sources}</span></span>
|
|
100
|
+
<span>CLAIMS <span className="text-white">{telemetry.claimsVerified}</span></span>
|
|
101
|
+
</div>
|
|
102
|
+
<div className="flex items-center gap-2">
|
|
103
|
+
<span>VERDICT</span>
|
|
104
|
+
<span className={lastRun ? "text-emerald-500" : "text-zinc-700"}>{lastRun ? "SEALED" : "PENDING"}</span>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { useState, useMemo, useCallback } from "react";
|
|
2
|
+
import { generateLongWriterPlan, type LongWriterPlan } from "../lib/longwriter";
|
|
3
|
+
import { getWorkerPool } from "../lib/worker-pool";
|
|
4
|
+
import { useAppState } from "../lib/app-state";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* LongWriter UI — StarCraft style report decomposition.
|
|
8
|
+
* Allows small models to plan and draft massive papers.
|
|
9
|
+
*/
|
|
10
|
+
export function LongWriterPanel() {
|
|
11
|
+
const { input } = useAppState();
|
|
12
|
+
const [targetWords, setTargetWords] = useState(2500);
|
|
13
|
+
const [executing, setExecuting] = useState(false);
|
|
14
|
+
const [results, setResults] = useState<any>(null);
|
|
15
|
+
|
|
16
|
+
const plan: LongWriterPlan = useMemo(() =>
|
|
17
|
+
generateLongWriterPlan(input || "Deep Research Objective", targetWords),
|
|
18
|
+
[input, targetWords]
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
const executePlan = useCallback(async () => {
|
|
22
|
+
setExecuting(true);
|
|
23
|
+
try {
|
|
24
|
+
const pool = getWorkerPool();
|
|
25
|
+
// Execute each section in parallel (simplified for demo)
|
|
26
|
+
const tasks = plan.sections.map((section) => ({
|
|
27
|
+
id: crypto.randomUUID(),
|
|
28
|
+
type: "compute" as const,
|
|
29
|
+
payload: { fn: "sandbox", args: [`print("Section: ${section.title}")`] },
|
|
30
|
+
}));
|
|
31
|
+
const results = await pool.enqueueAll(tasks);
|
|
32
|
+
setResults(results);
|
|
33
|
+
} catch (error: any) {
|
|
34
|
+
setResults({ error: error.message });
|
|
35
|
+
} finally {
|
|
36
|
+
setExecuting(false);
|
|
37
|
+
}
|
|
38
|
+
}, [plan]);
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<div className="rounded-2xl border border-zinc-200 bg-white shadow-sm overflow-hidden">
|
|
42
|
+
<div className="border-b border-zinc-200 px-4 py-3 flex items-center justify-between bg-zinc-50">
|
|
43
|
+
<span className="text-sm font-bold text-zinc-900 uppercase tracking-widest">Module D.2 — SLOOP LongWriter</span>
|
|
44
|
+
<span className="text-[10px] font-mono text-zinc-400">assembly pipeline</span>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div className="p-4 space-y-4">
|
|
48
|
+
<div className="grid gap-4 sm:grid-cols-2">
|
|
49
|
+
<label className="block">
|
|
50
|
+
<span className="text-[10px] font-bold text-zinc-400 uppercase">Target Word Count</span>
|
|
51
|
+
<input type="number" value={targetWords} step={500} onChange={e => setTargetWords(Number(e.target.value))}
|
|
52
|
+
className="mt-1 w-full rounded-lg border border-zinc-200 bg-zinc-50 px-3 py-1.5 text-sm font-mono" />
|
|
53
|
+
</label>
|
|
54
|
+
<div className="rounded-xl border border-indigo-100 bg-indigo-50 p-3">
|
|
55
|
+
<div className="text-[10px] uppercase text-indigo-400 font-bold mb-1">Planned Context Sessions</div>
|
|
56
|
+
<div className="text-lg font-mono font-bold text-indigo-700">{plan.sections.length} sessions</div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<button onClick={executePlan} disabled={executing} className="w-full rounded-lg bg-zinc-900 px-4 py-2 text-xs font-bold text-white hover:bg-zinc-800 disabled:opacity-50">
|
|
61
|
+
{executing ? "Executing Plan..." : "Execute LongWriter Plan"}
|
|
62
|
+
</button>
|
|
63
|
+
|
|
64
|
+
<div className="space-y-2">
|
|
65
|
+
<div className="text-[10px] font-bold uppercase tracking-wider text-zinc-400">Pipeline Assembly order</div>
|
|
66
|
+
{plan.sections.map((s, i) => (
|
|
67
|
+
<div key={s.id} className="group relative flex gap-3 rounded-xl border border-zinc-100 bg-white p-3 hover:border-indigo-200 hover:bg-indigo-50/30 transition-all">
|
|
68
|
+
<div className="font-mono text-xs text-zinc-300 group-hover:text-indigo-300">{String(i + 1).padStart(2, '0')}</div>
|
|
69
|
+
<div className="flex-1">
|
|
70
|
+
<div className="flex items-center justify-between">
|
|
71
|
+
<span className="text-sm font-bold text-zinc-800">{s.title}</span>
|
|
72
|
+
<span className="font-mono text-[10px] text-zinc-400">{s.targetWords} words</span>
|
|
73
|
+
</div>
|
|
74
|
+
<div className="mt-1 flex flex-wrap gap-1">
|
|
75
|
+
{s.requiredPoints.map(p => (
|
|
76
|
+
<span key={p} className="rounded bg-zinc-100 px-1.5 py-0.5 text-[9px] text-zinc-500 font-medium">✓ {p}</span>
|
|
77
|
+
))}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
))}
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
{results && (
|
|
85
|
+
<div className="rounded-xl border border-emerald-100 bg-emerald-50 p-3 text-xs text-emerald-900 leading-relaxed">
|
|
86
|
+
<div className="font-bold mb-2">Execution Results:</div>
|
|
87
|
+
{Array.isArray(results) ? (
|
|
88
|
+
<div className="space-y-1">
|
|
89
|
+
{results.map((r, i) => (
|
|
90
|
+
<div key={i} className="flex items-center gap-2">
|
|
91
|
+
<span className={`h-2 w-2 rounded-full ${r.success ? "bg-emerald-500" : "bg-rose-500"}`} />
|
|
92
|
+
<span>Section {i + 1}: {r.success ? "Completed" : "Failed"}</span>
|
|
93
|
+
{r.error && <span className="text-rose-600"> — {r.error}</span>}
|
|
94
|
+
</div>
|
|
95
|
+
))}
|
|
96
|
+
</div>
|
|
97
|
+
) : (
|
|
98
|
+
<div className="text-rose-600">Error: {results.error}</div>
|
|
99
|
+
)}
|
|
100
|
+
</div>
|
|
101
|
+
)}
|
|
102
|
+
|
|
103
|
+
<div className="rounded-xl border border-zinc-200 bg-zinc-50 p-3 text-xs text-zinc-700 leading-relaxed">
|
|
104
|
+
<div className="font-bold mb-2">Assembly Log:</div>
|
|
105
|
+
<div>Decomposing "{input.slice(0, 40)}..."</div>
|
|
106
|
+
<div>Budgeting {targetWords} words across {plan.sections.length} sessions</div>
|
|
107
|
+
<div>Context threading enabled (Virtual Context p=0.85)</div>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { buildV10DiscoveryContext } from "@/lib/innovation-genome-v10";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Main ChatApp imports its pipeline relatively inside the immutable package,
|
|
6
|
+
* bypassing workspace seams. This capture bridge injects V10 context at the
|
|
7
|
+
* actual form boundary, then restores visible user text after package handler
|
|
8
|
+
* has captured the augmented value. No package file is edited.
|
|
9
|
+
*/
|
|
10
|
+
export function MainPipelineV10Bridge() {
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const bypass = new WeakSet<HTMLFormElement>();
|
|
13
|
+
|
|
14
|
+
const findChatForm = (target: EventTarget | null): { form: HTMLFormElement; textarea: HTMLTextAreaElement } | null => {
|
|
15
|
+
const element = target instanceof Element ? target : null;
|
|
16
|
+
const form = (element?.closest("form") ?? null) as HTMLFormElement | null;
|
|
17
|
+
if (!form) return null;
|
|
18
|
+
const button = form.querySelector('button[type="submit"]');
|
|
19
|
+
const label = button?.textContent ?? "";
|
|
20
|
+
if (!/Ground & Answer|Deep Answer/.test(label)) return null;
|
|
21
|
+
const textarea = form.querySelector("textarea") as HTMLTextAreaElement | null;
|
|
22
|
+
return textarea ? { form, textarea } : null;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const setReactValue = (textarea: HTMLTextAreaElement, value: string) => {
|
|
26
|
+
const setter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, "value")?.set;
|
|
27
|
+
setter?.call(textarea, value);
|
|
28
|
+
textarea.dispatchEvent(new Event("input", { bubbles: true }));
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const augment = (form: HTMLFormElement, textarea: HTMLTextAreaElement, event: Event) => {
|
|
32
|
+
if (bypass.has(form)) {
|
|
33
|
+
bypass.delete(form);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const original = textarea.value.trim();
|
|
37
|
+
if (!original || original.includes("## V10 CREATIVE TREE OF LIFE")) return;
|
|
38
|
+
event.preventDefault();
|
|
39
|
+
event.stopImmediatePropagation();
|
|
40
|
+
const context = buildV10DiscoveryContext(original, "research");
|
|
41
|
+
const augmented = `${original}\n\n${context.directive}`;
|
|
42
|
+
setReactValue(textarea, augmented);
|
|
43
|
+
(window as any)._VERITAS_V10_MAIN_DISCOVERY = context;
|
|
44
|
+
window.dispatchEvent(new CustomEvent("veritas:v10-main-discovery", { detail: context }));
|
|
45
|
+
window.setTimeout(() => {
|
|
46
|
+
bypass.add(form);
|
|
47
|
+
form.requestSubmit();
|
|
48
|
+
// Package submit closure has captured augmented render state; restore UI.
|
|
49
|
+
window.setTimeout(() => setReactValue(textarea, original), 50);
|
|
50
|
+
}, 0);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const onSubmit = (event: SubmitEvent) => {
|
|
54
|
+
const found = findChatForm(event.target);
|
|
55
|
+
if (found) augment(found.form, found.textarea, event);
|
|
56
|
+
};
|
|
57
|
+
const onKeyDown = (event: KeyboardEvent) => {
|
|
58
|
+
if (event.key !== "Enter" || !(event.ctrlKey || event.metaKey)) return;
|
|
59
|
+
const found = findChatForm(event.target);
|
|
60
|
+
if (found) augment(found.form, found.textarea, event);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
document.addEventListener("submit", onSubmit, true);
|
|
64
|
+
document.addEventListener("keydown", onKeyDown, true);
|
|
65
|
+
return () => {
|
|
66
|
+
document.removeEventListener("submit", onSubmit, true);
|
|
67
|
+
document.removeEventListener("keydown", onKeyDown, true);
|
|
68
|
+
};
|
|
69
|
+
}, []);
|
|
70
|
+
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
/** Lightweight safe Markdown-ish renderer for assistant prose.
|
|
4
|
+
* Supports bold, headings, bullets, numbered lists, and simple pipe tables.
|
|
5
|
+
* This avoids showing raw markdown as plain text while keeping implementation
|
|
6
|
+
* dependency-free and safe (no HTML injection).
|
|
7
|
+
*/
|
|
8
|
+
export function MarkdownLite({ text, user = false }: { text: string; user?: boolean }) {
|
|
9
|
+
if (user) return <div className="whitespace-pre-wrap text-sm leading-relaxed text-white">{text}</div>;
|
|
10
|
+
const lines = text.split(/\r?\n/);
|
|
11
|
+
const blocks: ReactNode[] = [];
|
|
12
|
+
let i = 0;
|
|
13
|
+
while (i < lines.length) {
|
|
14
|
+
const line = lines[i];
|
|
15
|
+
if (!line.trim()) { i++; continue; }
|
|
16
|
+
if (/^\|.*\|$/.test(line) && i + 1 < lines.length && /^\|\s*:?-+/.test(lines[i + 1])) {
|
|
17
|
+
const header = splitRow(line);
|
|
18
|
+
i += 2;
|
|
19
|
+
const rows: string[][] = [];
|
|
20
|
+
while (i < lines.length && /^\|.*\|$/.test(lines[i])) rows.push(splitRow(lines[i++]));
|
|
21
|
+
blocks.push(<Table key={blocks.length} header={header} rows={rows} />);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (/^#{1,4}\s+/.test(line)) {
|
|
25
|
+
const level = line.match(/^#+/)![0].length;
|
|
26
|
+
const content = line.replace(/^#{1,4}\s+/, "");
|
|
27
|
+
blocks.push(<Heading key={blocks.length} level={level} text={content} />);
|
|
28
|
+
i++; continue;
|
|
29
|
+
}
|
|
30
|
+
if (/^\s*[-*]\s+/.test(line)) {
|
|
31
|
+
const items: string[] = [];
|
|
32
|
+
while (i < lines.length && /^\s*[-*]\s+/.test(lines[i])) items.push(lines[i++].replace(/^\s*[-*]\s+/, ""));
|
|
33
|
+
blocks.push(<ul key={blocks.length} className="my-2 list-disc space-y-1 pl-5 text-sm text-zinc-900">{items.map((x, j) => <li key={j}>{inline(x)}</li>)}</ul>);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (/^\s*\d+\.\s+/.test(line)) {
|
|
37
|
+
const items: string[] = [];
|
|
38
|
+
while (i < lines.length && /^\s*\d+\.\s+/.test(lines[i])) items.push(lines[i++].replace(/^\s*\d+\.\s+/, ""));
|
|
39
|
+
blocks.push(<ol key={blocks.length} className="my-2 list-decimal space-y-1 pl-5 text-sm text-zinc-900">{items.map((x, j) => <li key={j}>{inline(x)}</li>)}</ol>);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const paras: string[] = [line]; i++;
|
|
43
|
+
while (i < lines.length && lines[i].trim() && !/^\|.*\|$/.test(lines[i]) && !/^#{1,4}\s+/.test(lines[i]) && !/^\s*[-*]\s+/.test(lines[i]) && !/^\s*\d+\.\s+/.test(lines[i])) paras.push(lines[i++]);
|
|
44
|
+
blocks.push(<p key={blocks.length} className="my-2 text-sm leading-relaxed text-zinc-900">{inline(paras.join(" "))}</p>);
|
|
45
|
+
}
|
|
46
|
+
return <div className="space-y-1">{blocks}</div>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function inline(s: string): ReactNode[] {
|
|
50
|
+
const parts = s.split(/(\*\*[^*]+\*\*)/g);
|
|
51
|
+
return parts.map((p, i) => p.startsWith("**") && p.endsWith("**") ? <strong key={i}>{p.slice(2, -2)}</strong> : p);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function Heading({ level, text }: { level: number; text: string }) {
|
|
55
|
+
const cls = level <= 2 ? "mt-3 text-base font-bold text-zinc-950" : "mt-3 text-sm font-bold text-zinc-900";
|
|
56
|
+
return <div className={cls}>{inline(text)}</div>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function splitRow(s: string): string[] { return s.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map(x => x.trim()); }
|
|
60
|
+
|
|
61
|
+
function Table({ header, rows }: { header: string[]; rows: string[][] }) {
|
|
62
|
+
return <div className="my-3 overflow-x-auto rounded-xl border border-zinc-200"><table className="w-full text-sm"><thead className="bg-zinc-50"><tr>{header.map((h, i) => <th key={i} className="px-3 py-2 text-left font-bold text-zinc-700">{inline(h)}</th>)}</tr></thead><tbody className="divide-y divide-zinc-100">{rows.map((r, i) => <tr key={i}>{header.map((_, j) => <td key={j} className="px-3 py-2 text-zinc-900">{inline(r[j] ?? "")}</td>)}</tr>)}</tbody></table></div>;
|
|
63
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useAppState } from "../lib/app-state";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Unified Memory Inspector — Surfaces the persistent context
|
|
5
|
+
* shared between all pages and pipeline runs.
|
|
6
|
+
*/
|
|
7
|
+
export function MemoryInspector() {
|
|
8
|
+
const { memory, debugEvents } = useAppState();
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<div className="rounded-2xl border border-zinc-200 bg-white shadow-sm overflow-hidden">
|
|
12
|
+
<div className="border-b border-zinc-200 px-4 py-2.5 flex items-center justify-between bg-zinc-50">
|
|
13
|
+
<span className="text-sm font-bold text-zinc-900">Unified Memory Inspector</span>
|
|
14
|
+
<span className="text-[10px] font-mono text-zinc-400">persistent store</span>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div className="grid md:grid-cols-2 divide-x divide-zinc-100">
|
|
18
|
+
<div className="p-4">
|
|
19
|
+
<div className="text-[10px] font-bold uppercase tracking-wider text-zinc-400 mb-2">KV Store (State)</div>
|
|
20
|
+
<pre className="max-h-64 overflow-auto rounded-xl bg-zinc-950 p-4 font-mono text-xs text-emerald-400 leading-relaxed shadow-inner">
|
|
21
|
+
{JSON.stringify(memory, null, 2)}
|
|
22
|
+
</pre>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div className="p-4">
|
|
26
|
+
<div className="text-[10px] font-bold uppercase tracking-wider text-zinc-400 mb-2">Execution Events (Ephemeral)</div>
|
|
27
|
+
<div className="max-h-64 overflow-auto rounded-xl bg-zinc-900 p-4 font-mono text-[11px] leading-relaxed text-zinc-300">
|
|
28
|
+
{debugEvents.length === 0 ? (
|
|
29
|
+
<div className="text-zinc-600 italic">No events recorded in this session.</div>
|
|
30
|
+
) : (
|
|
31
|
+
debugEvents.map((e, i) => <div key={i} className="mb-0.5 border-b border-zinc-800 pb-0.5 last:border-0">{e}</div>)
|
|
32
|
+
)}
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { useAppState } from "../lib/app-state";
|
|
3
|
+
import { readMemoryReport, safeNDeepPasses, type MemoryReport } from "../lib/memory-governor";
|
|
4
|
+
|
|
5
|
+
export function MemoryMonitor() {
|
|
6
|
+
const [report, setReport] = useState<MemoryReport>(() => readMemoryReport(0));
|
|
7
|
+
const { messages, debugEvents, reasoningTrace } = useAppState();
|
|
8
|
+
|
|
9
|
+
// Cheap retained-state estimate. Do not JSON.stringify the full state here;
|
|
10
|
+
// long SLOOP/N-Deep runs make that allocation the browser-freeze trigger.
|
|
11
|
+
const approxStateMB = useMemo(() => {
|
|
12
|
+
let bytes = 0;
|
|
13
|
+
for (const m of messages) {
|
|
14
|
+
bytes += (m.content?.length ?? 0) * 2;
|
|
15
|
+
for (const tr of m.toolResults ?? []) bytes += ((tr.content?.length ?? 0) + (tr.title?.length ?? 0) + (tr.url?.length ?? 0)) * 2;
|
|
16
|
+
bytes += (m.claims?.length ?? 0) * 64;
|
|
17
|
+
bytes += (m.pipelineTrace?.length ?? 0) * 32;
|
|
18
|
+
}
|
|
19
|
+
for (const e of debugEvents) bytes += e.length * 2;
|
|
20
|
+
bytes += reasoningTrace.length * 128;
|
|
21
|
+
return Math.round((bytes / 1048576) * 10) / 10;
|
|
22
|
+
}, [messages, debugEvents, reasoningTrace]);
|
|
23
|
+
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const id = setInterval(() => setReport(readMemoryReport(approxStateMB)), 2000);
|
|
26
|
+
return () => clearInterval(id);
|
|
27
|
+
}, [approxStateMB]);
|
|
28
|
+
|
|
29
|
+
const effectivePct = Math.round(report.pressure * 100);
|
|
30
|
+
const tone = report.level === "critical" ? "text-rose-600" : report.level === "warn" ? "text-amber-600" : report.level === "elevated" ? "text-amber-500" : "text-emerald-600";
|
|
31
|
+
const barColor = report.level === "critical" ? "bg-rose-500" : report.level === "warn" ? "bg-amber-500" : report.level === "elevated" ? "bg-amber-400" : "bg-emerald-500";
|
|
32
|
+
const label = report.heapAvailable ? `${report.usedMB}MB / ~${report.softLimitMB}MB safe` : `state~${approxStateMB}MB / ~${report.softLimitMB}MB safe`;
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<div
|
|
36
|
+
className="inline-flex items-center gap-1.5 text-[10px] font-mono"
|
|
37
|
+
title={`Heap ${report.usedMB}MB / ${report.softLimitMB}MB safe; raw ${report.limitMB}MB; state ~${approxStateMB}MB; pressure ${report.level}`}
|
|
38
|
+
suppressHydrationWarning
|
|
39
|
+
>
|
|
40
|
+
<span className={`font-bold ${tone}`}>{label}</span>
|
|
41
|
+
<div className="h-1.5 w-16 rounded-full bg-zinc-200 overflow-hidden">
|
|
42
|
+
<div className={`h-full rounded-full ${barColor}`} style={{ width: `${Math.min(100, effectivePct)}%` }} />
|
|
43
|
+
</div>
|
|
44
|
+
{report.level === "critical" && <span className="text-rose-500 font-bold animate-pulse">OOM risk</span>}
|
|
45
|
+
{report.level === "warn" && <span className="text-amber-500 font-bold animate-pulse">high mem</span>}
|
|
46
|
+
</div>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function getSafeNDeepCap(requested: number, sourceChars = 0): number {
|
|
51
|
+
return safeNDeepPasses(requested, sourceChars, readMemoryReport(0));
|
|
52
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { useMemo, useState } from "react";
|
|
2
|
+
import { useAppState } from "../lib/app-state";
|
|
3
|
+
import { readMemoryReport, safeClusterWidth, safeNDeepPasses, safeSloopPages, settleHeap } from "../lib/memory-governor";
|
|
4
|
+
import { runStressTestAdvanced, type StressTestReport } from "../lib/memory-stress-tests";
|
|
5
|
+
import { estimateRuntime, runtimeEstimatorSmoke } from "../lib/runtime-estimator";
|
|
6
|
+
import { intelligenceOf, MODEL_INTELLIGENCE } from "../lib/model-intelligence";
|
|
7
|
+
|
|
8
|
+
// User's reported failing config — exposed as a one-click diagnostic button.
|
|
9
|
+
const REQUESTED_CONFIG = { sloopPages: 8, clusterWidth: 8, nDeepPasses: 4 };
|
|
10
|
+
|
|
11
|
+
export function MemoryStressPanel() {
|
|
12
|
+
const { settings, setSetting, pushDebugEvent, model } = useAppState();
|
|
13
|
+
const [report, setReport] = useState<StressTestReport | null>(null);
|
|
14
|
+
const [running, setRunning] = useState(false);
|
|
15
|
+
|
|
16
|
+
const [testConfig, setTestConfig] = useState({
|
|
17
|
+
sloopPages: settings.sloopPages,
|
|
18
|
+
nDeepPasses: settings.nDeepMaxPasses,
|
|
19
|
+
clusterWidth: settings.clusterSize,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const coreIntel = intelligenceOf(model);
|
|
23
|
+
const topModel = (Object.entries(MODEL_INTELLIGENCE) as [string, number][])
|
|
24
|
+
.sort((a, b) => b[1] - a[1])[0];
|
|
25
|
+
|
|
26
|
+
const memReport = readMemoryReport(0);
|
|
27
|
+
|
|
28
|
+
const estimate = useMemo(() => estimateRuntime({
|
|
29
|
+
sources: 18,
|
|
30
|
+
hypotheses: 4,
|
|
31
|
+
deepResearch: true,
|
|
32
|
+
forceSloop: true,
|
|
33
|
+
sloopPages: testConfig.sloopPages,
|
|
34
|
+
clusterWidth: testConfig.clusterWidth,
|
|
35
|
+
nDeepPasses: testConfig.nDeepPasses,
|
|
36
|
+
modelFamily: coreIntel >= 85 ? "gemini-fast" : coreIntel >= 75 ? "gemma-31b" : "other",
|
|
37
|
+
}), [testConfig, coreIntel]);
|
|
38
|
+
|
|
39
|
+
const requestedEstimate = useMemo(() => estimateRuntime({
|
|
40
|
+
sources: 18, hypotheses: 4, deepResearch: true, forceSloop: true,
|
|
41
|
+
sloopPages: REQUESTED_CONFIG.sloopPages,
|
|
42
|
+
clusterWidth: REQUESTED_CONFIG.clusterWidth,
|
|
43
|
+
nDeepPasses: REQUESTED_CONFIG.nDeepPasses,
|
|
44
|
+
modelFamily: "gemma-31b",
|
|
45
|
+
}), []);
|
|
46
|
+
|
|
47
|
+
const smoke = useMemo(() => {
|
|
48
|
+
try { return runtimeEstimatorSmoke(); } catch (e) { return null; }
|
|
49
|
+
}, []);
|
|
50
|
+
|
|
51
|
+
async function runWith(cfg: { sloopPages: number; clusterWidth: number; nDeepPasses: number; label?: string }) {
|
|
52
|
+
setRunning(true);
|
|
53
|
+
setReport(null);
|
|
54
|
+
pushDebugEvent(`[MemStress] starting ${cfg.label ?? "custom"} test (pages=${cfg.sloopPages} cluster=${cfg.clusterWidth} nDeep=${cfg.nDeepPasses})`);
|
|
55
|
+
try {
|
|
56
|
+
const r = await runStressTestAdvanced(cfg);
|
|
57
|
+
setReport(r);
|
|
58
|
+
pushDebugEvent(`[MemStress] complete: ${r.passed ? "PASS" : "FAIL"} peak=${r.peakMB}MB duration=${r.durationMs}ms`);
|
|
59
|
+
await settleHeap(20);
|
|
60
|
+
} finally {
|
|
61
|
+
setRunning(false);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const safeCluster = safeClusterWidth(testConfig.clusterWidth);
|
|
66
|
+
const safePages = safeSloopPages(testConfig.sloopPages);
|
|
67
|
+
const safePasses = safeNDeepPasses(testConfig.nDeepPasses);
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<div className="rounded-2xl border border-zinc-200 bg-white p-5 shadow-sm space-y-4">
|
|
71
|
+
<div>
|
|
72
|
+
<div className="text-xs font-bold uppercase tracking-[0.2em] text-rose-600">Memory Stress Test</div>
|
|
73
|
+
<div className="mt-1 text-sm font-bold">Find your real max research configuration</div>
|
|
74
|
+
<div className="text-xs text-zinc-500">Runs deterministic in-browser workloads that mimic SLOOP / N-Deep / Cluster memory patterns. Test passes only if heap stays below 92% pressure throughout.</div>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div className="grid grid-cols-3 gap-3 text-xs">
|
|
78
|
+
<label className="flex flex-col gap-1">
|
|
79
|
+
<span className="text-zinc-600">SLOOP pages</span>
|
|
80
|
+
<input type="number" min={1} max={16} className="rounded border px-2 py-1 font-mono" value={testConfig.sloopPages}
|
|
81
|
+
onChange={e => setTestConfig(p => ({ ...p, sloopPages: Math.max(1, Math.min(16, parseInt(e.target.value) || 8)) }))} />
|
|
82
|
+
</label>
|
|
83
|
+
<label className="flex flex-col gap-1">
|
|
84
|
+
<span className="text-zinc-600">N-Deep passes</span>
|
|
85
|
+
<input type="number" min={1} max={12} className="rounded border px-2 py-1 font-mono" value={testConfig.nDeepPasses}
|
|
86
|
+
onChange={e => setTestConfig(p => ({ ...p, nDeepPasses: Math.max(1, Math.min(12, parseInt(e.target.value) || 4)) }))} />
|
|
87
|
+
</label>
|
|
88
|
+
<label className="flex flex-col gap-1">
|
|
89
|
+
<span className="text-zinc-600">Cluster width</span>
|
|
90
|
+
<input type="number" min={1} max={20} className="rounded border px-2 py-1 font-mono" value={testConfig.clusterWidth}
|
|
91
|
+
onChange={e => setTestConfig(p => ({ ...p, clusterWidth: Math.max(1, Math.min(20, parseInt(e.target.value) || 8)) }))} />
|
|
92
|
+
</label>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
<div className="flex flex-wrap items-center gap-2">
|
|
96
|
+
<button
|
|
97
|
+
onClick={() => runWith({ ...testConfig, label: "custom" })}
|
|
98
|
+
disabled={running}
|
|
99
|
+
className="rounded-lg bg-zinc-900 px-3 py-1.5 text-xs font-semibold text-white disabled:opacity-50"
|
|
100
|
+
>
|
|
101
|
+
{running ? "Running..." : "Run Custom Test"}
|
|
102
|
+
</button>
|
|
103
|
+
<button
|
|
104
|
+
onClick={() => runWith({ ...REQUESTED_CONFIG, label: "requested" })}
|
|
105
|
+
disabled={running}
|
|
106
|
+
className="rounded-lg border border-rose-200 bg-rose-50 px-3 py-1.5 text-xs font-bold text-rose-700 hover:bg-rose-100 disabled:opacity-50"
|
|
107
|
+
title="SLOOP 8 · Cluster 8 · N-Deep 4 — the configuration that crashed in 5/6 field tests"
|
|
108
|
+
>
|
|
109
|
+
Run requested config (SLOOP 8 · Cluster 8 · N-Deep 4)
|
|
110
|
+
</button>
|
|
111
|
+
<button onClick={() => {
|
|
112
|
+
setSetting("sloopPages", testConfig.sloopPages);
|
|
113
|
+
setSetting("nDeepMaxPasses", testConfig.nDeepPasses);
|
|
114
|
+
setSetting("clusterSize", testConfig.clusterWidth);
|
|
115
|
+
pushDebugEvent("[MemStress] applied config to settings");
|
|
116
|
+
}} className="rounded-lg border px-3 py-1.5 text-xs">Apply to Settings</button>
|
|
117
|
+
<div className="ml-auto text-[10px] font-mono text-zinc-500">
|
|
118
|
+
live: {memReport.usedMB}MB / ~{memReport.softLimitMB}MB · {memReport.level}
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
<div className="grid grid-cols-2 gap-3 text-xs">
|
|
123
|
+
<div className="rounded-xl border border-zinc-200 bg-zinc-50 p-3">
|
|
124
|
+
<div className="font-semibold text-zinc-900">Estimated runtime — current config</div>
|
|
125
|
+
<div className="mt-1 font-mono font-bold">~{estimate.estimatedSeconds}s · {estimate.llmCalls} LLM calls</div>
|
|
126
|
+
{estimate.breakdown && (
|
|
127
|
+
<div className="mt-2 space-y-0.5 font-mono text-[10px] text-zinc-600">
|
|
128
|
+
{estimate.breakdown.map(s => <div key={s.step}>{s.step}: {s.seconds.toFixed(0)}s</div>)}
|
|
129
|
+
</div>
|
|
130
|
+
)}
|
|
131
|
+
<div className="mt-2 pt-2 border-t border-zinc-200 text-[10px]">
|
|
132
|
+
Governor safe caps → Pages: {safePages} / Passes: {safePasses} / Cluster: {safeCluster}
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
<div className="rounded-xl border border-zinc-200 bg-zinc-50 p-3">
|
|
136
|
+
<div className="font-semibold text-zinc-900">Requested-config estimator</div>
|
|
137
|
+
<div className="mt-1 font-mono font-bold">SLOOP 8 · Cluster 8 · N-Deep 4 → ~{requestedEstimate.estimatedSeconds}s</div>
|
|
138
|
+
{smoke && <div className="mt-2 text-[10px] text-emerald-700">✓ Deterministic estimator smoke check passed</div>}
|
|
139
|
+
<div className="mt-2 pt-2 border-t border-zinc-200 text-[10px]">
|
|
140
|
+
<span className="font-bold">Intelligence:</span> {model} = {coreIntel}/100<br />
|
|
141
|
+
Top: {topModel?.[0]} ({topModel?.[1]}/100)<br />
|
|
142
|
+
<span className="text-zinc-500">N-Deep ties broken by Arena rank.</span>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
{report && (
|
|
148
|
+
<div className="space-y-3">
|
|
149
|
+
<div className={`rounded-xl border p-3 text-sm font-semibold ${report.passed ? "border-emerald-200 bg-emerald-50 text-emerald-800" : "border-rose-200 bg-rose-50 text-rose-800"}`}>
|
|
150
|
+
{report.passed ? "PASS — configuration stayed under the 92% pressure ceiling." : "FAIL — the requested configuration risks OOM on this device."}
|
|
151
|
+
<span className="ml-2 font-mono text-xs">peak {report.peakMB}MB · {report.durationMs}ms</span>
|
|
152
|
+
{report.recommendedConfig && (
|
|
153
|
+
<div className="mt-1 text-xs">
|
|
154
|
+
Suggested safe config: SLOOP {report.recommendedConfig.sloopPages} · Cluster {report.recommendedConfig.clusterWidth} · N-Deep {report.recommendedConfig.nDeepPasses}
|
|
155
|
+
</div>
|
|
156
|
+
)}
|
|
157
|
+
</div>
|
|
158
|
+
<div className="grid gap-2 sm:grid-cols-2">
|
|
159
|
+
{report.steps.map(step => (
|
|
160
|
+
<div key={step.name} className={`rounded-lg border p-3 text-xs ${step.ok ? "border-emerald-200 bg-emerald-50/50" : "border-rose-200 bg-rose-50/50"}`}>
|
|
161
|
+
<div className="font-semibold text-zinc-900">{step.name}</div>
|
|
162
|
+
<div className="mt-1 font-mono text-zinc-700">{step.details}</div>
|
|
163
|
+
<div className="mt-1 font-mono text-zinc-500">
|
|
164
|
+
pressure {(step.pressureBefore * 100).toFixed(0)}% → {(step.pressureAfter * 100).toFixed(0)}% · {step.ms.toFixed(0)}ms
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
))}
|
|
168
|
+
</div>
|
|
169
|
+
<div className="rounded-lg border border-zinc-200 bg-zinc-50 p-2 text-[11px] font-mono text-zinc-600">
|
|
170
|
+
start {report.startReport.usedMB}MB / {report.startReport.limitMB}MB → end {report.endReport.usedMB}MB / {report.endReport.limitMB}MB ({(report.endReport.pressure * 100).toFixed(0)}% pressure)
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
)}
|
|
174
|
+
</div>
|
|
175
|
+
);
|
|
176
|
+
}
|