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,358 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import {
|
|
3
|
+
runDeterministicDiagnostics,
|
|
4
|
+
applyDeterministicAutoFixes,
|
|
5
|
+
type FullDiagnosticReport,
|
|
6
|
+
} from "../fiction/diagnostics";
|
|
7
|
+
import { NarrativeIntegrityEngine, type NIVEViolation } from "../fiction/nive-engine";
|
|
8
|
+
import { runFictionPipelineSelfTest, type SelfTestReport } from "../fiction/pipeline-selftest";
|
|
9
|
+
import { type ContinuityToggles } from "../fiction/types";
|
|
10
|
+
import { callGeminiResilient } from "./gemini";
|
|
11
|
+
import { copyText, cx } from "./util";
|
|
12
|
+
|
|
13
|
+
interface Props {
|
|
14
|
+
manuscript: string;
|
|
15
|
+
setManuscript: (s: string) => void;
|
|
16
|
+
toggles: ContinuityToggles;
|
|
17
|
+
setToggles: React.Dispatch<React.SetStateAction<ContinuityToggles>>;
|
|
18
|
+
apiKey: string;
|
|
19
|
+
modelPool: string[];
|
|
20
|
+
iframeRef: React.RefObject<HTMLIFrameElement | null>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function DiagnosticRecoveryPanel({
|
|
24
|
+
manuscript,
|
|
25
|
+
setManuscript,
|
|
26
|
+
toggles,
|
|
27
|
+
setToggles,
|
|
28
|
+
apiKey,
|
|
29
|
+
modelPool,
|
|
30
|
+
iframeRef,
|
|
31
|
+
}: Props) {
|
|
32
|
+
const [report, setReport] = useState<FullDiagnosticReport | null>(null);
|
|
33
|
+
const [niveViolations, setNiveViolations] = useState<NIVEViolation[]>([]);
|
|
34
|
+
const [niveScore, setNiveScore] = useState<number | null>(null);
|
|
35
|
+
const [autoFixLog, setAutoFixLog] = useState<string[]>([]);
|
|
36
|
+
const [llmDiag, setLlmDiag] = useState<string>("");
|
|
37
|
+
const [llmBusy, setLlmBusy] = useState(false);
|
|
38
|
+
const [resetMsg, setResetMsg] = useState("");
|
|
39
|
+
const [selfTest, setSelfTest] = useState<SelfTestReport | null>(null);
|
|
40
|
+
|
|
41
|
+
const handleScan = () => {
|
|
42
|
+
try {
|
|
43
|
+
// 1. Run basic deterministic diagnostics
|
|
44
|
+
setReport(runDeterministicDiagnostics(manuscript));
|
|
45
|
+
// 2. Run deep NIVE Tier-5 audit engine
|
|
46
|
+
const nive = new NarrativeIntegrityEngine(manuscript, "MS-ACTIVE", {
|
|
47
|
+
sentenceRange: [6, 28],
|
|
48
|
+
motifLimits: { truth: 6, cold: 6, vault: 6, refrigeratory: 3, borderland: 6 },
|
|
49
|
+
mortality: { Thurn: 1, Dorn: 8 },
|
|
50
|
+
});
|
|
51
|
+
const niveReport = nive.runAllAudits();
|
|
52
|
+
setNiveViolations(niveReport.violations);
|
|
53
|
+
setNiveScore(niveReport.cleanScore);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
// A scan crash must never break the panel; surface it as an empty result.
|
|
56
|
+
setNiveViolations([]);
|
|
57
|
+
setNiveScore(null);
|
|
58
|
+
setAutoFixLog([`Scan error (non-fatal): ${e instanceof Error ? e.message : String(e)}`]);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const handleAutoFix = () => {
|
|
63
|
+
try {
|
|
64
|
+
const { cleanedText, fixesApplied } = applyDeterministicAutoFixes(manuscript);
|
|
65
|
+
setManuscript(cleanedText);
|
|
66
|
+
setAutoFixLog(fixesApplied);
|
|
67
|
+
setReport(runDeterministicDiagnostics(cleanedText));
|
|
68
|
+
const nive = new NarrativeIntegrityEngine(cleanedText, "MS-ACTIVE");
|
|
69
|
+
const niveReport = nive.runAllAudits();
|
|
70
|
+
setNiveViolations(niveReport.violations);
|
|
71
|
+
setNiveScore(niveReport.cleanScore);
|
|
72
|
+
} catch (e) {
|
|
73
|
+
setAutoFixLog([`Auto-fix error (non-fatal): ${e instanceof Error ? e.message : String(e)}`]);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const handleLlmDiagnose = async () => {
|
|
78
|
+
if (!manuscript.trim() || !apiKey.trim() || llmBusy) return;
|
|
79
|
+
setLlmBusy(true);
|
|
80
|
+
setLlmDiag("");
|
|
81
|
+
try {
|
|
82
|
+
const prompt = [
|
|
83
|
+
"You are an expert narrative architect and literary diagnostic engineer.",
|
|
84
|
+
"Diagnose why this manuscript has low scores in Plot Architecture & Pacing and Character Voice.",
|
|
85
|
+
"Check specifically for: (1) Procedural deadlock / repetitive inspections, (2) Climax evasion / administrative anticlimax, (3) Lack of active antagonist pressure, (4) Invariant time windowing, (5) Sensor/instrument padding, (6) Character resurrection or sex/profession drift.",
|
|
86
|
+
"Provide 3-5 concrete, actionable prompt adjustments and code-level continuity recommendations.",
|
|
87
|
+
"",
|
|
88
|
+
"MANUSCRIPT EXCERPT:",
|
|
89
|
+
manuscript.slice(0, 12000),
|
|
90
|
+
].join("\n");
|
|
91
|
+
|
|
92
|
+
const res = await callGeminiResilient(modelPool, undefined, {
|
|
93
|
+
apiKey,
|
|
94
|
+
prompt,
|
|
95
|
+
temperature: 0.3,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
if (res.ok) {
|
|
99
|
+
setLlmDiag(res.text);
|
|
100
|
+
} else {
|
|
101
|
+
setLlmDiag(`Diagnostic call failed: ${res.error}`);
|
|
102
|
+
}
|
|
103
|
+
} finally {
|
|
104
|
+
setLlmBusy(false);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const handleEmergencyReset = () => {
|
|
109
|
+
try {
|
|
110
|
+
const frame = iframeRef.current;
|
|
111
|
+
if (frame?.contentWindow) {
|
|
112
|
+
try {
|
|
113
|
+
frame.contentWindow.sessionStorage.removeItem("veritas.busyState");
|
|
114
|
+
frame.contentWindow.localStorage.removeItem("veritas.busyLock");
|
|
115
|
+
} catch {}
|
|
116
|
+
}
|
|
117
|
+
window.sessionStorage.removeItem("veritas.busyState");
|
|
118
|
+
window.localStorage.removeItem("veritas.busyLock");
|
|
119
|
+
|
|
120
|
+
const unlockEvent = new CustomEvent("veritas:emergency-unblock", { detail: { time: Date.now() } });
|
|
121
|
+
window.dispatchEvent(unlockEvent);
|
|
122
|
+
frame?.contentWindow?.dispatchEvent(unlockEvent);
|
|
123
|
+
|
|
124
|
+
setResetMsg("✓ Emergency reset dispatched: cleared busy locks across iframe and parent window.");
|
|
125
|
+
setTimeout(() => setResetMsg(""), 6000);
|
|
126
|
+
} catch (e) {
|
|
127
|
+
setResetMsg(`Reset error: ${e instanceof Error ? e.message : String(e)}`);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const toggleList: { key: keyof ContinuityToggles; label: string; desc: string }[] = [
|
|
132
|
+
{ key: "enableFM02ContinueFrom", label: "FM-02 Continue-From Lock", desc: "Quotes exact closing sentence and forbids restarting the opening beat." },
|
|
133
|
+
{ key: "enableFM03AntiStasis", label: "FM-03 Anti-Stasis Vector", desc: "Requires physical/knowledge change vectors and bans repeating dominant inspection verbs." },
|
|
134
|
+
{ key: "enableFM04TruncationRecovery", label: "FM-04 Truncation Recovery", desc: "Detects unterminated sentences and triggers bounded same-chapter continuations." },
|
|
135
|
+
{ key: "enableFM05MotifCooldown", label: "FM-05 Motif Cooldown", desc: "Enforces phrase count ceiling; overused story-bible tags become a banned list." },
|
|
136
|
+
{ key: "enableFM06TitleNormalization", label: "FM-06 Title Normalization", desc: "Collapses 'The The Reckoning' and duplicate articles into clean grammar." },
|
|
137
|
+
{ key: "enableFM07ResidueStripping", label: "FM-07 Residue Stripping", desc: "Strips [Source N], [CHECKSUM], and harness error artifacts before committing prose." },
|
|
138
|
+
{ key: "enableFM08PovLock", label: "FM-08 POV Lock", desc: "Enforces point-of-view pronoun consistency against the frozen blueprint." },
|
|
139
|
+
{ key: "enableFM09ActLadder", label: "FM-09 Act Ladder Climax", desc: "Forbids administrative anticlimaxes and enforces real dramatic confrontations." },
|
|
140
|
+
{ key: "enableFM10TransitRules", label: "FM-10 Transit Rules", desc: "Enforces sensory travel duration and costs to prevent spatial teleportation." },
|
|
141
|
+
{ key: "enableFM11ConceptBudget", label: "FM-11 Concept Budget", desc: "Caps new worldbuilding jargon to at most 2 per chapter to prevent epistemic overload." },
|
|
142
|
+
{ key: "enableFM12BeatLedger", label: "FM-12 Beat Ledger", desc: "Prevents repeating identical relational beats (like cognitive handoffs) in consecutive scenes." },
|
|
143
|
+
{ key: "enableFM13ClockMonotonicity", label: "FM-13 Clock Monotonicity", desc: "Prevents temporal claustrophobia by enforcing monotonic forward movement of the macro-clock." },
|
|
144
|
+
{ key: "enableFM14MeasurementBudget", label: "FM-14 Sensor Budget", desc: "Caps numeric measurements (Hz, dB, millibars) to at most 6 per chapter." },
|
|
145
|
+
{ key: "enableFM15CurrencyBudget", label: "FM-15 Currency Budget", desc: "Caps coin/fee accounting to at most 2 per chapter, preventing bookkeeping stasis." },
|
|
146
|
+
{ key: "enableFM16IrreversibleLedger", label: "FM-16 Irreversible Ledger", desc: "Records permanent consequences (deaths, destroyed assets) and prevents zero-stakes resets." },
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
return (
|
|
150
|
+
<div className="space-y-4 text-[13px]">
|
|
151
|
+
{/* Recovery & Unblock section */}
|
|
152
|
+
<div className="rounded-xl border border-rose-300 bg-rose-50/60 p-3">
|
|
153
|
+
<div className="flex flex-wrap items-center justify-between gap-2">
|
|
154
|
+
<div>
|
|
155
|
+
<h4 className="font-bold text-rose-900">🚨 Runtime Pipeline Recovery & Unfreeze</h4>
|
|
156
|
+
<p className="text-[11px] text-rose-700">
|
|
157
|
+
If the main 'Ground & Answer' button is grayed out or a crashed generation left the engine in a frozen busy state, click below to immediately unblock.
|
|
158
|
+
</p>
|
|
159
|
+
</div>
|
|
160
|
+
<button
|
|
161
|
+
onClick={handleEmergencyReset}
|
|
162
|
+
className="rounded-lg bg-rose-700 px-3 py-1.5 text-xs font-bold text-white shadow-sm hover:bg-rose-800"
|
|
163
|
+
>
|
|
164
|
+
⚡ Unblock Chat & Reset Busy State
|
|
165
|
+
</button>
|
|
166
|
+
</div>
|
|
167
|
+
{resetMsg && <div className="mt-2 text-[11px] font-semibold text-rose-900">{resetMsg}</div>}
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
{/* Deterministic Scan & Auto-Fix */}
|
|
171
|
+
<div className="rounded-xl border border-zinc-200 bg-white p-3 shadow-sm">
|
|
172
|
+
<div className="flex flex-wrap items-center justify-between gap-2 border-b border-zinc-100 pb-2">
|
|
173
|
+
<div>
|
|
174
|
+
<h4 className="font-bold text-zinc-900">🔬 NIVE Tier-5 Narrative Integrity & Failure-Mode Scanner</h4>
|
|
175
|
+
<p className="text-[11px] text-zinc-500">
|
|
176
|
+
Deterministic verification against all 15 failure modes: character resurrection, ontological drift, prompt leaks, and stasis.
|
|
177
|
+
</p>
|
|
178
|
+
</div>
|
|
179
|
+
<div className="flex flex-wrap gap-2">
|
|
180
|
+
<button
|
|
181
|
+
onClick={handleScan}
|
|
182
|
+
disabled={!manuscript.trim()}
|
|
183
|
+
className="rounded-lg bg-teal-600 px-3 py-1 text-xs font-semibold text-white hover:bg-teal-700 disabled:opacity-40"
|
|
184
|
+
>
|
|
185
|
+
Scan Manuscript
|
|
186
|
+
</button>
|
|
187
|
+
<button
|
|
188
|
+
onClick={handleAutoFix}
|
|
189
|
+
disabled={!manuscript.trim()}
|
|
190
|
+
className="rounded-lg border border-teal-300 bg-teal-50 px-3 py-1 text-xs font-semibold text-teal-800 hover:bg-teal-100 disabled:opacity-40"
|
|
191
|
+
>
|
|
192
|
+
Apply Auto-Fixes
|
|
193
|
+
</button>
|
|
194
|
+
<button
|
|
195
|
+
onClick={() => setSelfTest(runFictionPipelineSelfTest(16))}
|
|
196
|
+
className="rounded-lg border border-indigo-300 bg-indigo-50 px-3 py-1 text-xs font-semibold text-indigo-800 hover:bg-indigo-100"
|
|
197
|
+
title="Pure deterministic proof that a full 16-chapter commit loop never stalls (no LLM, no network)"
|
|
198
|
+
>
|
|
199
|
+
▶ Pipeline Self-Test (16 ch)
|
|
200
|
+
</button>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
|
|
204
|
+
{autoFixLog.length > 0 && (
|
|
205
|
+
<div className="mt-2 rounded bg-emerald-50 p-2 text-[11px] text-emerald-800">
|
|
206
|
+
<div className="font-bold">Auto-Fixes Executed:</div>
|
|
207
|
+
<ul className="list-disc pl-4">
|
|
208
|
+
{autoFixLog.map((log, i) => (
|
|
209
|
+
<li key={i}>{log}</li>
|
|
210
|
+
))}
|
|
211
|
+
</ul>
|
|
212
|
+
</div>
|
|
213
|
+
)}
|
|
214
|
+
|
|
215
|
+
{selfTest && (
|
|
216
|
+
<div className={cx("mt-2 rounded border p-2 text-[11px]", selfTest.pass ? "border-emerald-300 bg-emerald-50 text-emerald-900" : "border-rose-300 bg-rose-50 text-rose-900")}>
|
|
217
|
+
<div className="font-bold">
|
|
218
|
+
Pipeline Self-Test: {selfTest.pass ? "PASS" : "FAIL"} ({selfTest.cases.filter((c) => c.pass).length}/{selfTest.cases.length})
|
|
219
|
+
</div>
|
|
220
|
+
<ul className="mt-1 max-h-40 space-y-0.5 overflow-y-auto font-mono text-[10px]">
|
|
221
|
+
{selfTest.cases.map((c, i) => (
|
|
222
|
+
<li key={i}>
|
|
223
|
+
{c.pass ? "✓" : "✗"} {c.name}
|
|
224
|
+
{c.detail ? ` — ${c.detail}` : ""}
|
|
225
|
+
</li>
|
|
226
|
+
))}
|
|
227
|
+
</ul>
|
|
228
|
+
</div>
|
|
229
|
+
)}
|
|
230
|
+
|
|
231
|
+
{report && (
|
|
232
|
+
<div className="mt-3 space-y-3">
|
|
233
|
+
<div className="grid grid-cols-4 gap-2 text-center text-xs">
|
|
234
|
+
<div className="rounded border border-zinc-100 bg-zinc-50 p-2">
|
|
235
|
+
<div className="text-[10px] uppercase text-zinc-400">NIVE Integrity</div>
|
|
236
|
+
<div className="text-base font-bold text-indigo-700">{niveScore !== null ? `${niveScore}/100` : "—"}</div>
|
|
237
|
+
</div>
|
|
238
|
+
<div className="rounded border border-zinc-100 bg-zinc-50 p-2">
|
|
239
|
+
<div className="text-[10px] uppercase text-zinc-400">Cleanliness</div>
|
|
240
|
+
<div className="text-base font-bold text-teal-700">{report.cleanlinessScore}/100</div>
|
|
241
|
+
</div>
|
|
242
|
+
<div className="rounded border border-zinc-100 bg-zinc-50 p-2">
|
|
243
|
+
<div className="text-[10px] uppercase text-zinc-400">Stasis Risk</div>
|
|
244
|
+
<div className={cx("text-base font-bold capitalize", report.stasisRisk === "high" ? "text-rose-600" : "text-emerald-700")}>
|
|
245
|
+
{report.stasisRisk}
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
<div className="rounded border border-zinc-100 bg-zinc-50 p-2">
|
|
249
|
+
<div className="text-[10px] uppercase text-zinc-400">Pacing Risk</div>
|
|
250
|
+
<div className={cx("text-base font-bold capitalize", report.pacingRisk === "high" ? "text-rose-600" : "text-emerald-700")}>
|
|
251
|
+
{report.pacingRisk}
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
|
|
256
|
+
{/* NIVE Violations List */}
|
|
257
|
+
{niveViolations.length > 0 && (
|
|
258
|
+
<div className="space-y-1.5 mt-2">
|
|
259
|
+
<div className="font-bold text-xs text-zinc-800">NIVE Programmatic Violations ({niveViolations.length}):</div>
|
|
260
|
+
{niveViolations.map((v, i) => (
|
|
261
|
+
<div key={i} className="rounded border border-rose-200 bg-rose-50/50 p-2 text-xs">
|
|
262
|
+
<div className="flex items-center gap-2">
|
|
263
|
+
<span className={cx("rounded px-1.5 py-0.5 text-[9px] font-bold uppercase", v.severity === "critical" ? "bg-rose-200 text-rose-900" : "bg-amber-200 text-amber-900")}>
|
|
264
|
+
{v.type}
|
|
265
|
+
</span>
|
|
266
|
+
{v.chapter && <span className="font-semibold text-zinc-700">Ch {v.chapter}</span>}
|
|
267
|
+
{v.chapters && <span className="font-semibold text-zinc-700">Ch {v.chapters.join(", ")}</span>}
|
|
268
|
+
</div>
|
|
269
|
+
<div className="mt-1 text-zinc-800">{v.message}</div>
|
|
270
|
+
{v.evidence && v.evidence.length > 0 && (
|
|
271
|
+
<div className="mt-0.5 text-[10px] text-zinc-500 font-mono">
|
|
272
|
+
Evidence: {v.evidence.join(" · ")}
|
|
273
|
+
</div>
|
|
274
|
+
)}
|
|
275
|
+
</div>
|
|
276
|
+
))}
|
|
277
|
+
</div>
|
|
278
|
+
)}
|
|
279
|
+
|
|
280
|
+
{report.findings.length === 0 && niveViolations.length === 0 ? (
|
|
281
|
+
<div className="rounded bg-emerald-50 p-2 text-center text-xs text-emerald-800">
|
|
282
|
+
✓ No critical structural defects or residue leaks detected in current manuscript.
|
|
283
|
+
</div>
|
|
284
|
+
) : null}
|
|
285
|
+
</div>
|
|
286
|
+
)}
|
|
287
|
+
</div>
|
|
288
|
+
|
|
289
|
+
{/* LLM Deep Narrative Diagnostic */}
|
|
290
|
+
<div className="rounded-xl border border-zinc-200 bg-white p-3 shadow-sm">
|
|
291
|
+
<div className="flex flex-wrap items-center justify-between gap-2 border-b border-zinc-100 pb-2">
|
|
292
|
+
<div>
|
|
293
|
+
<h4 className="font-bold text-zinc-900">🧠 LLM Deep Narrative Diagnosis</h4>
|
|
294
|
+
<p className="text-[11px] text-zinc-500">Prompt an LLM to evaluate plot pacing and character voice with fresh context.</p>
|
|
295
|
+
</div>
|
|
296
|
+
<button
|
|
297
|
+
onClick={handleLlmDiagnose}
|
|
298
|
+
disabled={!manuscript.trim() || !apiKey.trim() || llmBusy}
|
|
299
|
+
className="rounded-lg bg-indigo-600 px-3 py-1 text-xs font-semibold text-white hover:bg-indigo-700 disabled:opacity-40"
|
|
300
|
+
>
|
|
301
|
+
{llmBusy ? "Analyzing..." : "Run LLM Diagnostic"}
|
|
302
|
+
</button>
|
|
303
|
+
</div>
|
|
304
|
+
|
|
305
|
+
{llmDiag && (
|
|
306
|
+
<div className="mt-3">
|
|
307
|
+
<div className="flex items-center justify-between pb-1">
|
|
308
|
+
<span className="text-[11px] font-bold text-zinc-700">Diagnostic Assessment:</span>
|
|
309
|
+
<button
|
|
310
|
+
onClick={() => copyText(llmDiag)}
|
|
311
|
+
className="rounded border border-zinc-200 px-2 py-0.5 text-[10px] text-zinc-600 hover:bg-zinc-100"
|
|
312
|
+
>
|
|
313
|
+
Copy
|
|
314
|
+
</button>
|
|
315
|
+
</div>
|
|
316
|
+
<pre className="max-h-60 overflow-y-auto whitespace-pre-wrap rounded-lg bg-zinc-900 p-2.5 font-mono text-[10px] leading-relaxed text-zinc-100">
|
|
317
|
+
{llmDiag}
|
|
318
|
+
</pre>
|
|
319
|
+
</div>
|
|
320
|
+
)}
|
|
321
|
+
</div>
|
|
322
|
+
|
|
323
|
+
{/* Continuity Governor Feature Toggles */}
|
|
324
|
+
<div className="rounded-xl border border-zinc-200 bg-white p-3 shadow-sm">
|
|
325
|
+
<h4 className="font-bold text-zinc-900 mb-1">🎛️ Continuity Governor Feature Toggles</h4>
|
|
326
|
+
<p className="text-[11px] text-zinc-500 mb-3">
|
|
327
|
+
Enable or disable individual failure-mode rules. All features are additively layered into the chapter prompt.
|
|
328
|
+
</p>
|
|
329
|
+
|
|
330
|
+
<div className="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
|
331
|
+
{toggleList.map((t) => {
|
|
332
|
+
const isChecked = toggles[t.key];
|
|
333
|
+
return (
|
|
334
|
+
<label
|
|
335
|
+
key={t.key}
|
|
336
|
+
className={cx(
|
|
337
|
+
"flex items-start gap-2.5 rounded-lg border p-2 cursor-pointer transition-colors",
|
|
338
|
+
isChecked ? "border-teal-300 bg-teal-50/40" : "border-zinc-200 bg-zinc-50/30"
|
|
339
|
+
)}
|
|
340
|
+
>
|
|
341
|
+
<input
|
|
342
|
+
type="checkbox"
|
|
343
|
+
checked={isChecked}
|
|
344
|
+
onChange={(e) => setToggles((prev) => ({ ...prev, [t.key]: e.target.checked }))}
|
|
345
|
+
className="mt-0.5 h-4 w-4 rounded border-zinc-300 text-teal-600 focus:ring-teal-500"
|
|
346
|
+
/>
|
|
347
|
+
<div className="flex-1">
|
|
348
|
+
<div className="font-semibold text-zinc-800 text-xs">{t.label}</div>
|
|
349
|
+
<div className="text-[10px] text-zinc-500 leading-snug">{t.desc}</div>
|
|
350
|
+
</div>
|
|
351
|
+
</label>
|
|
352
|
+
);
|
|
353
|
+
})}
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
);
|
|
358
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { useEffect, useState, type RefObject } from "react";
|
|
2
|
+
import { assembleManuscript, getGeminiKey, type ManuscriptSource } from "./engineBridge";
|
|
3
|
+
import { cx } from "./util";
|
|
4
|
+
import { FictionSystemPanels } from "./FictionSystemPanels";
|
|
5
|
+
|
|
6
|
+
const SOURCE_LABEL: Record<ManuscriptSource, string> = {
|
|
7
|
+
"engine-messages": "engine chat history",
|
|
8
|
+
"engine-dom": "engine DOM (fallback)",
|
|
9
|
+
none: "not found",
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export function EngineeringConsole({ iframeRef }: { iframeRef: RefObject<HTMLIFrameElement | null> }) {
|
|
13
|
+
const [open, setOpen] = useState(false);
|
|
14
|
+
const [manuscript, setManuscript] = useState("");
|
|
15
|
+
const [source, setSource] = useState<ManuscriptSource>("none");
|
|
16
|
+
|
|
17
|
+
function loadFromEngine() {
|
|
18
|
+
const m = assembleManuscript(iframeRef.current);
|
|
19
|
+
setManuscript(m.text);
|
|
20
|
+
setSource(m.source);
|
|
21
|
+
// Touch the key store so first-load failures surface early; panels read keys live.
|
|
22
|
+
getGeminiKey(iframeRef.current);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (open && !manuscript) loadFromEngine();
|
|
27
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
28
|
+
}, [open]);
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<>
|
|
32
|
+
{/* Launcher */}
|
|
33
|
+
<button
|
|
34
|
+
onClick={() => setOpen((o) => !o)}
|
|
35
|
+
className="fixed bottom-4 right-4 z-[2147483000] flex items-center gap-2 rounded-full bg-zinc-900 px-4 py-2.5 text-[13px] font-semibold text-white shadow-lg ring-1 ring-black/10 hover:bg-zinc-800"
|
|
36
|
+
title="SAGA OS Studio — Fiction System Transparency"
|
|
37
|
+
>
|
|
38
|
+
<span>{"\u{1F9EA}"}</span>
|
|
39
|
+
<span className="hidden sm:inline">SAGA Console</span>
|
|
40
|
+
</button>
|
|
41
|
+
|
|
42
|
+
{/* Drawer */}
|
|
43
|
+
<div
|
|
44
|
+
className={cx(
|
|
45
|
+
"fixed inset-y-0 right-0 z-[2147482000] flex w-full max-w-[760px] flex-col bg-zinc-50 shadow-2xl ring-1 ring-black/10 transition-transform duration-200",
|
|
46
|
+
open ? "translate-x-0" : "translate-x-full",
|
|
47
|
+
)}
|
|
48
|
+
role="dialog"
|
|
49
|
+
aria-label="SAGA OS Studio Fiction System Transparency"
|
|
50
|
+
>
|
|
51
|
+
<header className="flex items-center justify-between border-b border-zinc-200 bg-white px-4 py-2.5">
|
|
52
|
+
<div>
|
|
53
|
+
<h2 className="text-[14px] font-bold text-zinc-900">SAGA OS Studio · Fiction System Transparency</h2>
|
|
54
|
+
<p className="text-[11px] text-zinc-500">Fiction Input · System Map & Runtime · Grade v2 · Recursive Revision</p>
|
|
55
|
+
</div>
|
|
56
|
+
<button onClick={() => setOpen(false)} className="rounded-lg px-2 py-1 text-zinc-400 hover:bg-zinc-100 hover:text-zinc-700">
|
|
57
|
+
{"\u2715"}
|
|
58
|
+
</button>
|
|
59
|
+
</header>
|
|
60
|
+
|
|
61
|
+
{/* Shared manuscript */}
|
|
62
|
+
<div className="space-y-2 border-b border-zinc-200 bg-white px-4 py-2.5">
|
|
63
|
+
<div className="flex flex-wrap items-center gap-2">
|
|
64
|
+
<button onClick={loadFromEngine} className="rounded-lg border border-teal-300 bg-teal-50 px-2.5 py-1 text-[12px] font-semibold text-teal-700 hover:bg-teal-100">
|
|
65
|
+
Load manuscript from engine
|
|
66
|
+
</button>
|
|
67
|
+
<button
|
|
68
|
+
onClick={() => {
|
|
69
|
+
const frame = iframeRef.current;
|
|
70
|
+
if (frame?.contentWindow) {
|
|
71
|
+
try {
|
|
72
|
+
frame.contentWindow.sessionStorage.removeItem("veritas.busyState");
|
|
73
|
+
frame.contentWindow.localStorage.removeItem("veritas.busyLock");
|
|
74
|
+
frame.contentWindow.location.reload();
|
|
75
|
+
} catch {}
|
|
76
|
+
}
|
|
77
|
+
loadFromEngine();
|
|
78
|
+
}}
|
|
79
|
+
className="rounded-lg border border-zinc-300 bg-zinc-50 px-2.5 py-1 text-[12px] font-semibold text-zinc-700 hover:bg-zinc-100"
|
|
80
|
+
title="Reload the engine iframe to immediately sync adopted texts and unfreeze buttons"
|
|
81
|
+
>
|
|
82
|
+
🔄 Reload Engine View
|
|
83
|
+
</button>
|
|
84
|
+
<span className="text-[11px] text-zinc-500">
|
|
85
|
+
source: <b>{SOURCE_LABEL[source]}</b> · {manuscript.length.toLocaleString()} chars
|
|
86
|
+
</span>
|
|
87
|
+
</div>
|
|
88
|
+
<textarea
|
|
89
|
+
value={manuscript}
|
|
90
|
+
onChange={(e) => setManuscript(e.target.value)}
|
|
91
|
+
placeholder="Full manuscript (whole book). Auto-loaded from the engine, or paste/edit here."
|
|
92
|
+
className="h-24 w-full resize-y rounded-lg border border-zinc-300 p-2 font-mono text-[11px] text-zinc-700"
|
|
93
|
+
/>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
{/* Canonical panels */}
|
|
97
|
+
<div className="flex-1 overflow-y-auto p-4">
|
|
98
|
+
<FictionSystemPanels iframeRef={iframeRef} manuscript={manuscript} setManuscript={setManuscript} />
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
</>
|
|
102
|
+
);
|
|
103
|
+
}
|