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,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type C โ unified fiction-engine panel.
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* Renders from the SAME `unifiedRoll(seed)` object that `@/lib/sage`'s
|
|
5
|
+
* `compileCompactChapterPrompt` override compiles the prompt from. Display and
|
|
6
|
+
* output therefore cannot diverge โ the panel is not a parallel description of
|
|
7
|
+
* the story, it is a view of the exact record the model receives.
|
|
8
|
+
*
|
|
9
|
+
* Also hosts the REALITY GROUNDING control, which is the one user input in the
|
|
10
|
+
* fiction pipeline that is deliberately NOT seeded.
|
|
11
|
+
*/
|
|
12
|
+
import { useMemo, useState, useCallback, useEffect } from "react";
|
|
13
|
+
import { rollSage } from '@/lib/sage/engine.ts';
|
|
14
|
+
import { getRealityAudits } from "@/lib/sage";
|
|
15
|
+
import { unifiedRoll, type ArchetypeEntry } from "@/lib/sage/unified-roll";
|
|
16
|
+
import {
|
|
17
|
+
REALITY_LEVELS, loadRealityLevel, saveRealityLevel, realityLevel,
|
|
18
|
+
} from "@/lib/sage/reality-grounding";
|
|
19
|
+
import {
|
|
20
|
+
STYLE_PACK_DELTAS, loadStylePack, saveStylePack,
|
|
21
|
+
type StylePackId, type StyleGenome,
|
|
22
|
+
} from "@/lib/sage/saga-os-v4-aureate";
|
|
23
|
+
|
|
24
|
+
// โโ atoms โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
25
|
+
const TONE: Record<string, string> = {
|
|
26
|
+
zinc: "bg-zinc-100 text-zinc-700 border-zinc-200",
|
|
27
|
+
indigo: "bg-indigo-50 text-indigo-700 border-indigo-200",
|
|
28
|
+
violet: "bg-violet-50 text-violet-700 border-violet-200",
|
|
29
|
+
emerald: "bg-emerald-50 text-emerald-700 border-emerald-200",
|
|
30
|
+
amber: "bg-amber-50 text-amber-800 border-amber-200",
|
|
31
|
+
rose: "bg-rose-50 text-rose-700 border-rose-200",
|
|
32
|
+
sky: "bg-sky-50 text-sky-700 border-sky-200",
|
|
33
|
+
teal: "bg-teal-50 text-teal-700 border-teal-200",
|
|
34
|
+
fuchsia: "bg-fuchsia-50 text-fuchsia-700 border-fuchsia-200",
|
|
35
|
+
};
|
|
36
|
+
function Pill({ children, tone = "zinc", title }: { children: React.ReactNode; tone?: string; title?: string }) {
|
|
37
|
+
return <span title={title} className={`inline-flex items-center rounded-md border px-1.5 py-0.5 text-[10px] font-semibold ${TONE[tone] ?? TONE.zinc}`}>{children}</span>;
|
|
38
|
+
}
|
|
39
|
+
function Head({ icon, title, right }: { icon: string; title: string; right?: React.ReactNode }) {
|
|
40
|
+
return (
|
|
41
|
+
<div className="flex items-center gap-2 border-b border-zinc-100 pb-1">
|
|
42
|
+
<span className="text-sm">{icon}</span>
|
|
43
|
+
<span className="text-[11px] font-bold uppercase tracking-wider text-zinc-700">{title}</span>
|
|
44
|
+
{right != null && <span className="ml-auto text-[10px] text-zinc-400">{right}</span>}
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const SOURCE_TONE: Record<ArchetypeEntry["source"], string> = {
|
|
50
|
+
SAGE: "indigo", "SAGA-v2": "violet", "SAGA-v3": "amber", "SAGA-v4": "rose", "EMPTY-SPACE": "fuchsia",
|
|
51
|
+
ONOMASTRATA: "teal", REALITY: "emerald",
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// โโ reality control โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
55
|
+
function RealityControl({ value, onChange }: { value: number; onChange: (v: number) => void }) {
|
|
56
|
+
const L = realityLevel(value);
|
|
57
|
+
return (
|
|
58
|
+
<div className="rounded-lg border-2 border-emerald-200 bg-white p-2.5">
|
|
59
|
+
<Head icon="๐" title="Reality grounding" right="HARD CONSTRAINT ยท outranks genre & tone" />
|
|
60
|
+
<div className="mt-2">
|
|
61
|
+
<input
|
|
62
|
+
type="range" min={0} max={6} step={1} value={value}
|
|
63
|
+
onChange={(e) => onChange(Number(e.target.value))}
|
|
64
|
+
className="w-full accent-emerald-600"
|
|
65
|
+
aria-label="Reality grounding level"
|
|
66
|
+
/>
|
|
67
|
+
<div className="mt-0.5 flex justify-between">
|
|
68
|
+
{REALITY_LEVELS.map((lv) => (
|
|
69
|
+
<button
|
|
70
|
+
key={lv.id} onClick={() => onChange(lv.id)}
|
|
71
|
+
className={`text-[8.5px] leading-tight ${lv.id === value ? "font-bold text-emerald-700" : "text-zinc-400 hover:text-zinc-600"}`}
|
|
72
|
+
style={{ width: `${100 / 7}%` }}
|
|
73
|
+
title={lv.blurb}
|
|
74
|
+
>
|
|
75
|
+
{lv.short}
|
|
76
|
+
</button>
|
|
77
|
+
))}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
<div className="mt-1.5 rounded border border-emerald-100 bg-emerald-50/60 p-2">
|
|
81
|
+
<div className="flex flex-wrap items-center gap-1">
|
|
82
|
+
<Pill tone={L.accent}>L{L.id} ยท {L.label}</Pill>
|
|
83
|
+
<span className="text-[10px] text-zinc-500">{L.blurb}</span>
|
|
84
|
+
</div>
|
|
85
|
+
<div className="mt-1 grid gap-x-3 gap-y-0.5 text-[10px] sm:grid-cols-2">
|
|
86
|
+
<div><b className="text-zinc-500">Causality:</b> {L.causality}</div>
|
|
87
|
+
<div><b className="text-zinc-500">Detail floor:</b> {L.sensoryFloor}</div>
|
|
88
|
+
<div><b className="text-zinc-500">Register:</b> {L.register}</div>
|
|
89
|
+
<div><b className="text-zinc-500">Budgets:</b> โค{L.figurativePer100w}/100w figurative ยท โฅ{L.specificityPer1000w}/1000w specifics</div>
|
|
90
|
+
</div>
|
|
91
|
+
<div className="mt-1 grid gap-1 sm:grid-cols-2">
|
|
92
|
+
<div>
|
|
93
|
+
<div className="text-[9px] font-bold uppercase tracking-widest text-emerald-700">Permitted</div>
|
|
94
|
+
<ul className="ml-3 list-disc text-[10px] text-zinc-600">{L.permit.map((x) => <li key={x}>{x}</li>)}</ul>
|
|
95
|
+
</div>
|
|
96
|
+
<div>
|
|
97
|
+
<div className="text-[9px] font-bold uppercase tracking-widest text-rose-700">Forbidden</div>
|
|
98
|
+
<ul className="ml-3 list-disc text-[10px] text-zinc-600">{L.forbid.map((x) => <li key={x}>{x}</li>)}</ul>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// โโ live conformance readout โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
107
|
+
function RealityConformance() {
|
|
108
|
+
const [n, setN] = useState(0);
|
|
109
|
+
useEffect(() => { const t = window.setInterval(() => setN((x) => x + 1), 1500); return () => window.clearInterval(t); }, []);
|
|
110
|
+
const audits = useMemo(() => getRealityAudits(), [n]);
|
|
111
|
+
if (!audits.length) {
|
|
112
|
+
return (
|
|
113
|
+
<div className="rounded-lg border border-zinc-200 bg-white p-2.5 opacity-60">
|
|
114
|
+
<Head icon="๐ฌ" title="Reality conformance" right="no chapters generated yet" />
|
|
115
|
+
<div className="mt-1 text-[10px] text-zinc-500">
|
|
116
|
+
Runs automatically on every generated chapter. Results appear here after a fiction run.
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
const avg = audits.reduce((a, x) => a + x.report.score, 0) / audits.length;
|
|
122
|
+
return (
|
|
123
|
+
<div className="rounded-lg border border-zinc-200 bg-white p-2.5">
|
|
124
|
+
<Head icon="๐ฌ" title="Reality conformance" right={`${audits.length} chapter(s) ยท avg ${(avg * 100).toFixed(0)}%`} />
|
|
125
|
+
<div className="mt-1 space-y-0.5">
|
|
126
|
+
{audits.slice(-8).map((a) => (
|
|
127
|
+
<div key={a.chapter} className="flex items-center gap-1.5">
|
|
128
|
+
<span className="w-14 shrink-0 text-[10px] text-zinc-500">ch{a.chapter} L{a.level}</span>
|
|
129
|
+
<div className="h-1.5 flex-1 rounded-full bg-zinc-100">
|
|
130
|
+
<div className="h-full rounded-full" style={{ width: `${Math.round(a.report.score * 100)}%`, backgroundColor: `hsl(${Math.round(a.report.score * 120)},55%,50%)` }} />
|
|
131
|
+
</div>
|
|
132
|
+
<span className="w-9 text-right font-mono text-[10px] text-zinc-600">{(a.report.score * 100).toFixed(0)}%</span>
|
|
133
|
+
{a.report.failCount > 0 && <Pill tone="rose">{a.report.failCount} fail</Pill>}
|
|
134
|
+
</div>
|
|
135
|
+
))}
|
|
136
|
+
</div>
|
|
137
|
+
{audits.length > 0 && (
|
|
138
|
+
<ul className="ml-3 mt-1 list-disc text-[9.5px] text-zinc-500">
|
|
139
|
+
{audits[audits.length - 1].report.findings.filter((f) => f.severity !== "pass").slice(0, 4)
|
|
140
|
+
.map((f) => <li key={f.rule}><b>{f.severity.toUpperCase()}</b> {f.rule}: {f.detail}</li>)}
|
|
141
|
+
</ul>
|
|
142
|
+
)}
|
|
143
|
+
<div className="mt-1 text-[9px] italic text-zinc-400">{audits[audits.length - 1].report.method}</div>
|
|
144
|
+
</div>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// โโ style control (v4 AUREATE) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
149
|
+
/**
|
|
150
|
+
* The style pack is the SECOND non-seeded user lever in the fiction pipeline
|
|
151
|
+
* (the first is the reality level). It lives here, beside the reality slider,
|
|
152
|
+
* because this panel sits inside the fiction engine where the writer works โ
|
|
153
|
+
* not only in the Studio. Writing it re-rolls `unifiedRoll`, which rewrites the
|
|
154
|
+
* AUREATE block in the actual chapter prompt.
|
|
155
|
+
*/
|
|
156
|
+
function StyleControl({ value, onChange, genome }: {
|
|
157
|
+
value: StylePackId | null; onChange: (v: StylePackId | null) => void; genome: StyleGenome;
|
|
158
|
+
}) {
|
|
159
|
+
const packs = Object.keys(STYLE_PACK_DELTAS) as StylePackId[];
|
|
160
|
+
return (
|
|
161
|
+
<div className="rounded-lg border-2 border-violet-200 bg-white p-2.5">
|
|
162
|
+
<Head icon="โ" title="Prose style (AUREATE v4)" right="rewrites the style contract in the prompt" />
|
|
163
|
+
<div className="mt-1.5 flex flex-wrap gap-1">
|
|
164
|
+
<button
|
|
165
|
+
onClick={() => onChange(null)}
|
|
166
|
+
className={`rounded px-2 py-1 text-[10px] font-semibold ${value === null ? "bg-violet-600 text-white" : "bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`}
|
|
167
|
+
title="Use the genre's own style defaults with no pack overlay"
|
|
168
|
+
>
|
|
169
|
+
genre defaults
|
|
170
|
+
</button>
|
|
171
|
+
{packs.map((p) => (
|
|
172
|
+
<button
|
|
173
|
+
key={p} onClick={() => onChange(p)} title={STYLE_PACK_DELTAS[p].note}
|
|
174
|
+
className={`rounded px-2 py-1 text-[10px] font-semibold ${value === p ? "bg-violet-600 text-white" : "bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`}
|
|
175
|
+
>
|
|
176
|
+
{p.replace("STYLEPACK-", "")}
|
|
177
|
+
</button>
|
|
178
|
+
))}
|
|
179
|
+
</div>
|
|
180
|
+
<div className="mt-1.5 rounded border border-violet-100 bg-violet-50/60 p-2">
|
|
181
|
+
<div className="flex flex-wrap items-center gap-1">
|
|
182
|
+
<Pill tone="violet">{genome.proseMode}</Pill>
|
|
183
|
+
<Pill tone="teal">focal {genome.focalDistance}</Pill>
|
|
184
|
+
{value && <Pill tone="indigo">{value.replace("STYLEPACK-", "")}</Pill>}
|
|
185
|
+
<span className="text-[10px] text-zinc-500">
|
|
186
|
+
{value ? STYLE_PACK_DELTAS[value].note : "genre-derived genotype; no pack overlay"}
|
|
187
|
+
</span>
|
|
188
|
+
</div>
|
|
189
|
+
<div className="mt-1 grid grid-cols-2 gap-x-3 gap-y-0.5 sm:grid-cols-3">
|
|
190
|
+
{([["clarity", genome.clarityLevel], ["ornament", genome.ornamentLevel], ["music", genome.sentenceMusic],
|
|
191
|
+
["syntax", genome.syntacticComplexity], ["concrete", genome.concreteness], ["compression", genome.compression]] as const).map(([k, v]) => (
|
|
192
|
+
<div key={k} className="flex items-center gap-1">
|
|
193
|
+
<span className="w-[68px] shrink-0 text-right text-[9px] text-zinc-500">{k}</span>
|
|
194
|
+
<div className="h-1 flex-1 rounded-full bg-zinc-200">
|
|
195
|
+
<div className="h-full rounded-full" style={{ width: `${Math.round(v * 100)}%`, backgroundColor: `hsl(${Math.round(v * 120)},55%,50%)` }} />
|
|
196
|
+
</div>
|
|
197
|
+
<span className="w-6 text-right font-mono text-[9px] text-zinc-500">{Math.round(v * 100)}</span>
|
|
198
|
+
</div>
|
|
199
|
+
))}
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// โโ main โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
207
|
+
export function SageBlueprintPanel({ seed }: { seed: number }) {
|
|
208
|
+
const [reality, setReality] = useState<number>(() => loadRealityLevel());
|
|
209
|
+
const [stylePack, setStylePack] = useState<StylePackId | null>(() => loadStylePack());
|
|
210
|
+
const [tab, setTab] = useState<"story" | "archetypes" | "structure" | "prompt">("story");
|
|
211
|
+
const [showAll, setShowAll] = useState(false);
|
|
212
|
+
// Re-read the runner's settings periodically so the panel tracks changes the
|
|
213
|
+
// user makes in the packaged controls (scale / chapters / words / macro).
|
|
214
|
+
const [tick, setTick] = useState(0);
|
|
215
|
+
useEffect(() => {
|
|
216
|
+
const t = window.setInterval(() => setTick((n) => n + 1), 1200);
|
|
217
|
+
return () => window.clearInterval(t);
|
|
218
|
+
}, []);
|
|
219
|
+
|
|
220
|
+
useEffect(() => { saveRealityLevel(reality); }, [reality]);
|
|
221
|
+
|
|
222
|
+
const onReality = useCallback((v: number) => { setReality(v); saveRealityLevel(v); }, []);
|
|
223
|
+
const onStylePack = useCallback((v: StylePackId | null) => { setStylePack(v); saveStylePack(v); }, []);
|
|
224
|
+
|
|
225
|
+
// The packaged fiction runner rolls its blueprint from the SAME localStorage
|
|
226
|
+
// settings, so we must read them too. Rolling with the seed alone produced a
|
|
227
|
+
// different blueprint (chapter count / macro change the PRNG stream), which
|
|
228
|
+
// is exactly the display-vs-prompt divergence this panel exists to prevent.
|
|
229
|
+
const roll = useMemo(() => {
|
|
230
|
+
const ls = (k: string, d: string) => { try { return localStorage.getItem(k) ?? d; } catch { return d; } };
|
|
231
|
+
try {
|
|
232
|
+
const bp = rollSage({
|
|
233
|
+
seed,
|
|
234
|
+
cadenceSeed: Number(ls("veritas.sage.cadenceSeed.v1", "")) || seed,
|
|
235
|
+
lengthId: (ls("veritas.sage.scale.v2", "novel") as never),
|
|
236
|
+
chapters: Number(ls("veritas.sage.chapters.v2", "")) || undefined,
|
|
237
|
+
wordsPerChapter: Number(ls("veritas.sage.wordsPerChapter.v2", "")) || undefined,
|
|
238
|
+
forceMacroId: ls("veritas.sage.macro.v2", "") || undefined,
|
|
239
|
+
});
|
|
240
|
+
return unifiedRoll({ seed, blueprint: bp, realityLevel: reality });
|
|
241
|
+
} catch { return null; }
|
|
242
|
+
}, [seed, reality, stylePack, tick]);
|
|
243
|
+
|
|
244
|
+
if (!roll) {
|
|
245
|
+
return <div className="rounded-lg border border-amber-200 bg-amber-50 p-2 text-[11px] text-amber-800">
|
|
246
|
+
Unified roll unavailable for seed {seed}.
|
|
247
|
+
</div>;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const { blueprint: bp, archetypes, reality: L, kallos, run, spec, contributions, world, cast } = roll;
|
|
251
|
+
const totalWords = bp.chapters.reduce((a, c) => a + c.targetWords, 0);
|
|
252
|
+
const shown = showAll ? archetypes.entries : archetypes.entries.slice(0, 14);
|
|
253
|
+
|
|
254
|
+
return (
|
|
255
|
+
<div className="space-y-2 text-xs">
|
|
256
|
+
{/* header */}
|
|
257
|
+
<div className="flex flex-wrap items-center gap-2">
|
|
258
|
+
<div className="text-sm font-bold text-zinc-900">
|
|
259
|
+
SAGE Fable: <span className="text-indigo-700">{bp.macro.name}</span>
|
|
260
|
+
</div>
|
|
261
|
+
<Pill tone="violet">{bp.rarityTier} ({bp.rarityPercent.toFixed(1)}%)</Pill>
|
|
262
|
+
<Pill tone={L.accent}>L{L.id} {L.short}</Pill>
|
|
263
|
+
<span className="ml-auto font-mono text-[10px] text-zinc-400">
|
|
264
|
+
unified seed {roll.seed} โ SAGE ยท GRID ยท KALLOS ยท REALITY ยท STYLE
|
|
265
|
+
</span>
|
|
266
|
+
</div>
|
|
267
|
+
|
|
268
|
+
{/* reality control โ always visible, it is the primary user lever */}
|
|
269
|
+
<RealityControl value={reality} onChange={onReality} />
|
|
270
|
+
|
|
271
|
+
{/* style control โ the second non-seeded user lever (v4 AUREATE) */}
|
|
272
|
+
<StyleControl value={stylePack} onChange={onStylePack} genome={roll.styleGenome} />
|
|
273
|
+
|
|
274
|
+
{/* tabs */}
|
|
275
|
+
<div className="flex flex-wrap gap-1">
|
|
276
|
+
{([["story", "๐ Story"], ["archetypes", `๐ฏ Archetype set (${archetypes.entries.length})`],
|
|
277
|
+
["structure", "๐งฌ Structure"], ["prompt", "๐ค Prompt sent"]] as const).map(([id, label]) => (
|
|
278
|
+
<button key={id} onClick={() => setTab(id)}
|
|
279
|
+
className={`rounded-md px-2 py-1 text-[11px] font-semibold ${tab === id ? "bg-indigo-600 text-white" : "bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`}>
|
|
280
|
+
{label}
|
|
281
|
+
</button>
|
|
282
|
+
))}
|
|
283
|
+
</div>
|
|
284
|
+
|
|
285
|
+
{tab === "story" && (
|
|
286
|
+
<div className="space-y-2">
|
|
287
|
+
<div className="rounded-lg border border-zinc-200 bg-white p-2.5">
|
|
288
|
+
<div className="text-[10px] font-bold uppercase tracking-widest text-zinc-400">Working title</div>
|
|
289
|
+
<div className="text-sm font-semibold text-zinc-900">{bp.titleHint}</div>
|
|
290
|
+
<div className="mt-1 text-[10px] font-bold uppercase tracking-widest text-zinc-400">Premise</div>
|
|
291
|
+
<div className="text-[11px] italic text-zinc-700">{bp.premise}</div>
|
|
292
|
+
<div className="mt-1 text-[10px] font-bold uppercase tracking-widest text-zinc-400">Dramatic question</div>
|
|
293
|
+
<div className="text-[11px] text-zinc-700">{bp.dramaticQuestion}</div>
|
|
294
|
+
</div>
|
|
295
|
+
<div className="grid grid-cols-2 gap-x-3 gap-y-1 rounded-lg border border-zinc-200 bg-white p-2.5 sm:grid-cols-3">
|
|
296
|
+
{([["Theme", bp.theme, "indigo"], ["POV", bp.pov, "sky"], ["Conflict", bp.conflictAxis, "rose"],
|
|
297
|
+
["Tone", bp.tone, "amber"], ["Ending", bp.ending, "emerald"], ["Genre", `${spec.family}/${spec.leaf}`, "violet"],
|
|
298
|
+
["Length", `${bp.chapters.length}ch ยท ~${totalWords.toLocaleString()}w`, "zinc"],
|
|
299
|
+
["Pattern", run.pattern, "violet"], ["KALLOS", kallos.composite.toFixed(1), "teal"]] as const).map(([k, v, t]) => (
|
|
300
|
+
<div key={k} className="flex items-baseline gap-1.5">
|
|
301
|
+
<span className="shrink-0 text-[10px] font-bold uppercase tracking-wider text-zinc-400">{k}</span>
|
|
302
|
+
<Pill tone={t}>{v}</Pill>
|
|
303
|
+
</div>
|
|
304
|
+
))}
|
|
305
|
+
</div>
|
|
306
|
+
<div className="rounded-lg border border-zinc-200 bg-white p-2.5">
|
|
307
|
+
<Head icon="๐บ" title="World" right={`${world.length} places ยท ${cast.cast.length} cast`} />
|
|
308
|
+
<div className="mt-1 flex flex-wrap gap-1">
|
|
309
|
+
{world.map((p) => <Pill key={p.settingId} tone="teal" title={`${p.residents.length} residents`}>{p.label}</Pill>)}
|
|
310
|
+
</div>
|
|
311
|
+
<div className="mt-1 flex flex-wrap gap-1">
|
|
312
|
+
{cast.cast.map((c) => <Pill key={c.id} tone={c.kind === "institution" ? "amber" : "indigo"}>{c.name}</Pill>)}
|
|
313
|
+
</div>
|
|
314
|
+
</div>
|
|
315
|
+
</div>
|
|
316
|
+
)}
|
|
317
|
+
|
|
318
|
+
{tab === "archetypes" && (
|
|
319
|
+
<div className="rounded-lg border border-zinc-200 bg-white p-2.5">
|
|
320
|
+
<Head icon="๐ฏ" title="Canonical archetype set" right="this exact list is injected into every chapter prompt" />
|
|
321
|
+
<div className="mt-1 flex flex-wrap gap-1">
|
|
322
|
+
{Object.entries(archetypes.bySource).map(([s, n]) => (
|
|
323
|
+
<Pill key={s} tone={SOURCE_TONE[s as ArchetypeEntry["source"]] ?? "zinc"}>{s} ร {n}</Pill>
|
|
324
|
+
))}
|
|
325
|
+
</div>
|
|
326
|
+
<div className="mt-1.5 max-h-[420px] overflow-y-auto">
|
|
327
|
+
<table className="w-full text-[10px]">
|
|
328
|
+
<tbody>
|
|
329
|
+
{shown.map((e) => (
|
|
330
|
+
<tr key={e.slot} className="border-b border-zinc-50 align-top last:border-0">
|
|
331
|
+
<td className="w-24 py-1 pr-1 font-mono text-[9px] text-zinc-400">{e.slot}</td>
|
|
332
|
+
<td className="w-16 py-1 pr-1">
|
|
333
|
+
<Pill tone={SOURCE_TONE[e.source]}>{e.source}</Pill>
|
|
334
|
+
</td>
|
|
335
|
+
<td className="py-1">
|
|
336
|
+
<div className="font-semibold text-zinc-800">{e.label}: {e.value}</div>
|
|
337
|
+
{e.note && <div className="text-[9.5px] text-zinc-500">{e.note}</div>}
|
|
338
|
+
</td>
|
|
339
|
+
</tr>
|
|
340
|
+
))}
|
|
341
|
+
</tbody>
|
|
342
|
+
</table>
|
|
343
|
+
</div>
|
|
344
|
+
{archetypes.entries.length > 14 && (
|
|
345
|
+
<button onClick={() => setShowAll(!showAll)} className="mt-1 text-[10px] font-semibold text-indigo-600">
|
|
346
|
+
{showAll ? "โด collapse" : `โพ show all ${archetypes.entries.length}`}
|
|
347
|
+
</button>
|
|
348
|
+
)}
|
|
349
|
+
</div>
|
|
350
|
+
)}
|
|
351
|
+
|
|
352
|
+
{tab === "structure" && (
|
|
353
|
+
<div className="space-y-2">
|
|
354
|
+
<div className="rounded-lg border border-zinc-200 bg-white p-2.5">
|
|
355
|
+
<Head icon="๐" title="Pipeline contributions" right="grey = not contributing to this run" />
|
|
356
|
+
<div className="mt-1 space-y-0.5">
|
|
357
|
+
{contributions.map((c) => (
|
|
358
|
+
<div key={c.system} className={`flex items-start gap-1.5 border-b border-zinc-50 py-0.5 last:border-0 ${c.active ? "" : "opacity-40"}`}>
|
|
359
|
+
<span className={c.active ? "text-emerald-600" : "text-zinc-400"}>{c.active ? "โ" : "โ"}</span>
|
|
360
|
+
<span className="w-36 shrink-0 text-[10px] font-semibold text-zinc-700">{c.system}</span>
|
|
361
|
+
<span className="text-[10px] text-zinc-500">{c.detail}</span>
|
|
362
|
+
</div>
|
|
363
|
+
))}
|
|
364
|
+
</div>
|
|
365
|
+
</div>
|
|
366
|
+
<div className="rounded-lg border border-zinc-200 bg-white p-2.5">
|
|
367
|
+
<Head icon="โจ" title="KALLOS pillars" right={`composite ${kallos.composite.toFixed(1)} / 100`} />
|
|
368
|
+
<div className="mt-1 space-y-0.5">
|
|
369
|
+
{kallos.pillars.map((p) => (
|
|
370
|
+
<div key={p.key} className={`flex items-center gap-1.5 ${p.measured ? "" : "opacity-40"}`}>
|
|
371
|
+
<span className="w-[120px] shrink-0 truncate text-right text-[10px] text-zinc-500" title={p.label}>{p.label}</span>
|
|
372
|
+
<div className="h-1.5 flex-1 rounded-full bg-zinc-100">
|
|
373
|
+
<div className="h-full rounded-full" style={{ width: `${Math.round(p.score * 100)}%`, backgroundColor: `hsl(${Math.round(p.score * 120)},55%,50%)` }} />
|
|
374
|
+
</div>
|
|
375
|
+
<span className="w-8 text-right font-mono text-[10px] text-zinc-600">{(p.score * 100).toFixed(0)}%</span>
|
|
376
|
+
{!p.measured && <span className="text-[9px] text-zinc-400">LOW-N</span>}
|
|
377
|
+
</div>
|
|
378
|
+
))}
|
|
379
|
+
</div>
|
|
380
|
+
<div className="mt-1 text-[9px] italic text-zinc-400">{kallos.caveat}</div>
|
|
381
|
+
</div>
|
|
382
|
+
<RealityConformance />
|
|
383
|
+
<div className="rounded-lg border border-zinc-200 bg-white p-2.5">
|
|
384
|
+
<Head icon="๐งฌ" title="Genesis grid" right={`${run.ticks.length} ticks โ ${run.pattern}`} />
|
|
385
|
+
<div className="mt-1 flex items-end gap-[2px]" style={{ height: 36 }}>
|
|
386
|
+
{run.ticks.map((t) => {
|
|
387
|
+
const maxPop = Math.max(...run.ticks.map((x) => x.population), 1);
|
|
388
|
+
return <div key={t.t} className="flex-1 rounded-t" title={`t=${t.t} live ${t.activeCount} ยท +${t.births.length}/โ${t.deaths.length}`}
|
|
389
|
+
style={{ height: Math.max(2, Math.round((t.activeCount / maxPop) * 32)), backgroundColor: `hsl(${Math.round((t.intensity / 100) * 120)},60%,55%)` }} />;
|
|
390
|
+
})}
|
|
391
|
+
</div>
|
|
392
|
+
<div className="mt-1 flex flex-wrap gap-1">
|
|
393
|
+
{run.plan.chapters.map((c) => <Pill key={c.index} tone="zinc">{c.index}:{c.dominantStakes ?? "โ"}</Pill>)}
|
|
394
|
+
</div>
|
|
395
|
+
<div className="mt-1 text-[10px] text-zinc-500">
|
|
396
|
+
{run.patternDetail} โ required ending family <b>{run.endingFamily}</b>. {roll.modal.verdict}
|
|
397
|
+
</div>
|
|
398
|
+
</div>
|
|
399
|
+
</div>
|
|
400
|
+
)}
|
|
401
|
+
|
|
402
|
+
{tab === "prompt" && (
|
|
403
|
+
<div className="rounded-lg border border-violet-200 bg-violet-50/40 p-2.5">
|
|
404
|
+
<Head icon="๐ค" title="Directive appended to every chapter prompt" right={`${roll.directive.length.toLocaleString()} chars`} />
|
|
405
|
+
<pre className="mt-1 max-h-[460px] overflow-auto whitespace-pre-wrap font-mono text-[9.5px] leading-snug text-violet-950">
|
|
406
|
+
{roll.directive}
|
|
407
|
+
</pre>
|
|
408
|
+
<div className="mt-1 text-[9px] italic text-violet-700">
|
|
409
|
+
This is appended by the <code>@/lib/sage</code> override of <code>compileCompactChapterPrompt</code>,
|
|
410
|
+
the function the packaged fiction runner calls for every chapter. What you read here is what the model receives.
|
|
411
|
+
</div>
|
|
412
|
+
</div>
|
|
413
|
+
)}
|
|
414
|
+
</div>
|
|
415
|
+
);
|
|
416
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// A single chat input rendered at the app shell level. Same input text
|
|
2
|
+
// everywhere; submitting it routes the user to the chat tab and runs the
|
|
3
|
+
// pipeline. All pages share this state via AppStateContext.
|
|
4
|
+
|
|
5
|
+
import { useEffect, useRef } from "react";
|
|
6
|
+
import { useAppState } from "../lib/app-state";
|
|
7
|
+
import { extractConstraints, summarizeConstraints } from "../lib/constraints";
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
onSubmit: () => void;
|
|
11
|
+
/** Optional: hide the run button (e.g., on non-chat pages where submit is the global one). */
|
|
12
|
+
hideRunHint?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function SharedChatInput({ onSubmit, hideRunHint }: Props) {
|
|
16
|
+
const { input, setInput, busyState, model } = useAppState();
|
|
17
|
+
const taRef = useRef<HTMLTextAreaElement>(null);
|
|
18
|
+
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (taRef.current) {
|
|
21
|
+
taRef.current.style.height = "auto";
|
|
22
|
+
taRef.current.style.height = `${Math.min(taRef.current.scrollHeight, 160)}px`;
|
|
23
|
+
}
|
|
24
|
+
}, [input]);
|
|
25
|
+
|
|
26
|
+
// Live preview of detected hard constraints โ the user can SEE what the
|
|
27
|
+
// model will be forced to respect before they submit.
|
|
28
|
+
const constraints = input.trim() ? extractConstraints(input) : null;
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<div className="rounded-2xl border border-zinc-200 bg-white p-3 shadow-sm">
|
|
32
|
+
<form
|
|
33
|
+
onSubmit={(e) => {
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
if (input.trim() && !busyState) onSubmit();
|
|
36
|
+
}}
|
|
37
|
+
className="flex gap-2.5"
|
|
38
|
+
>
|
|
39
|
+
<textarea
|
|
40
|
+
ref={taRef}
|
|
41
|
+
value={input}
|
|
42
|
+
onChange={(e) => setInput(e.target.value)}
|
|
43
|
+
onKeyDown={(e) => {
|
|
44
|
+
if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
if (input.trim() && !busyState) onSubmit();
|
|
47
|
+
}
|
|
48
|
+
}}
|
|
49
|
+
placeholder="Ask a question. Time horizons, tickers, and format hints become deterministic constraints..."
|
|
50
|
+
rows={1}
|
|
51
|
+
className="min-h-[44px] flex-1 resize-none rounded-lg border border-zinc-300 bg-white px-3.5 py-2.5 text-sm text-zinc-900 placeholder-zinc-400 outline-none focus:border-indigo-500"
|
|
52
|
+
/>
|
|
53
|
+
<button
|
|
54
|
+
type="submit"
|
|
55
|
+
disabled={!input.trim() || busyState !== null}
|
|
56
|
+
className="self-end whitespace-nowrap rounded-lg bg-zinc-900 px-4 py-2.5 text-xs font-semibold text-white transition-colors hover:bg-zinc-800 disabled:cursor-not-allowed disabled:opacity-30"
|
|
57
|
+
>
|
|
58
|
+
{busyState ? "Working..." : "Ground & Answer"}
|
|
59
|
+
</button>
|
|
60
|
+
</form>
|
|
61
|
+
<div className="mt-2 flex flex-wrap items-center gap-2 text-[11px] text-zinc-500">
|
|
62
|
+
{!hideRunHint && <span>โโฉ to send ยท model: <span className="font-mono text-zinc-700">{model}</span></span>}
|
|
63
|
+
{constraints && (
|
|
64
|
+
<span className="rounded-full border border-indigo-100 bg-indigo-50 px-2 py-0.5 font-mono text-[10px] text-indigo-800">
|
|
65
|
+
constraints โ {summarizeConstraints(constraints)}
|
|
66
|
+
</span>
|
|
67
|
+
)}
|
|
68
|
+
{busyState && (
|
|
69
|
+
<span className="inline-flex items-center gap-1.5 rounded-full border border-amber-200 bg-amber-50 px-2 py-0.5 font-mono text-[10px] text-amber-800">
|
|
70
|
+
<span className="inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-amber-500" />
|
|
71
|
+
{busyState}
|
|
72
|
+
</span>
|
|
73
|
+
)}
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
}
|