@mavea/mavea 1.0.7
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/CHANGELOG.md +159 -0
- package/DISCLAIMER.md +16 -0
- package/LICENSE +75 -0
- package/PRIVACY.md +127 -0
- package/README.md +248 -0
- package/SECURITY.md +72 -0
- package/SUPPORT.md +13 -0
- package/TERMS.md +122 -0
- package/THIRD-PARTY.txt +639 -0
- package/TRADEMARKS.md +15 -0
- package/bin/mavea.mjs +1079 -0
- package/dist/.vite/manifest.json +4261 -0
- package/dist/_headers +52 -0
- package/dist/assets/AppCommandPalette-DUMSp3rd.js +1 -0
- package/dist/assets/AtlasView-B5fkQhO6.css +1 -0
- package/dist/assets/AtlasView-Dl2fssaG.js +1 -0
- package/dist/assets/BlockEmpty-CLtVQf6c.js +1 -0
- package/dist/assets/BriefingPlayer-DO205Qkh.js +1 -0
- package/dist/assets/BriefingPlayer-TpFZB77N.css +1 -0
- package/dist/assets/CanvasSkeleton-BZZPCuRZ.js +2 -0
- package/dist/assets/CanvasSkeleton-iy6DBvde.css +1 -0
- package/dist/assets/CardEditor-BY1bZiV6.css +1 -0
- package/dist/assets/CardEditor-DzJXb0G7.js +1 -0
- package/dist/assets/CheckLogRail-F4AlgAcc.css +1 -0
- package/dist/assets/CheckLogRail-wUfby67Z.js +1 -0
- package/dist/assets/CodeOutput-Kh6ldxQz.js +97 -0
- package/dist/assets/CommandPalette-Bb-eErih.css +1 -0
- package/dist/assets/CommandPalette-Kl00mMZm.js +1 -0
- package/dist/assets/CourseLessonReader-COmTQdSK.css +1 -0
- package/dist/assets/CourseLessonReader-MBHoknUz.js +2 -0
- package/dist/assets/CourseRail-CUa7uIGG.css +1 -0
- package/dist/assets/CourseRail-q6x5cCpW.js +1 -0
- package/dist/assets/CoursesApp-v89OVJvg.js +2 -0
- package/dist/assets/CrossExamPanel-CZ0ShGma.css +1 -0
- package/dist/assets/CrossExamPanel-DH04p6VS.js +1 -0
- package/dist/assets/DashPresent-BYXbPuGj.js +1 -0
- package/dist/assets/DashPresent-DQYcgp-W.css +1 -0
- package/dist/assets/DashboardDetail-B50ZkeVK.js +2 -0
- package/dist/assets/DashboardLoopRuntime-CFXPx3v_.js +1 -0
- package/dist/assets/DashboardOverview-C-FdGWM5.js +1 -0
- package/dist/assets/DashboardSettings-Dmw6JTbI.js +1 -0
- package/dist/assets/DashboardsApp-Dx-EsaPW.css +1 -0
- package/dist/assets/DashboardsApp-JSY_bVfi.js +2 -0
- package/dist/assets/DeepZoomApp-BFNwli7l.js +37 -0
- package/dist/assets/DeepZoomApp-fRXCJHHZ.css +1 -0
- package/dist/assets/DelegatePanel-BK7rEhIc.js +26 -0
- package/dist/assets/DelegatePanel-_9RZiLHM.css +1 -0
- package/dist/assets/DemoGallery-BPtVG7_y.js +1 -0
- package/dist/assets/DropSelect-DUhdQSta.js +1 -0
- package/dist/assets/ExportModal-D4WpAg2c.css +1 -0
- package/dist/assets/ExportModal-D65cGyj_.js +2 -0
- package/dist/assets/ExtractionPreview-Iwfg2Ogl.js +18 -0
- package/dist/assets/FallbackCard-B489rTd9.js +1 -0
- package/dist/assets/FallbackCard-D_6ps1xA.css +1 -0
- package/dist/assets/FeatureUseNotice-CWt7gOwS.css +1 -0
- package/dist/assets/FeatureUseNotice-DPtQ0OGb.js +1 -0
- package/dist/assets/FlagshipCTA-BXntKhxb.js +1 -0
- package/dist/assets/FlagshipCommandPalette-BDJfasI-.js +1 -0
- package/dist/assets/FlagshipShowcase-DJ8Gxk_G.js +1 -0
- package/dist/assets/FlashcardsApp-CLNo4WX7.js +1 -0
- package/dist/assets/ForecastPanel-Da2ZBUrE.css +1 -0
- package/dist/assets/ForecastPanel-PBO2-dgS.js +1 -0
- package/dist/assets/GalleryApp-B1CB3_81.css +1 -0
- package/dist/assets/GalleryApp-DM03CMRy.js +1 -0
- package/dist/assets/HonestByDesign-Dqyth6nW.js +1 -0
- package/dist/assets/HowItWorks-C0zosIvq.js +1 -0
- package/dist/assets/LegalApp-DZBdExTy.js +1 -0
- package/dist/assets/LegalMarkdownDocument-CSZhRG5r.js +3 -0
- package/dist/assets/LegalPageShell-C_HottbD.css +1 -0
- package/dist/assets/LegalPageShell-DTeXqWyc.js +1 -0
- package/dist/assets/LeverPanel-DhpJY76O.css +1 -0
- package/dist/assets/LeverPanel-aZfhtVJX.js +1 -0
- package/dist/assets/Library-D2XGNXz7.js +1 -0
- package/dist/assets/Library-DmrtHjUf.css +1 -0
- package/dist/assets/LibraryOverlay-B2WQSgwr.js +1 -0
- package/dist/assets/LibraryOverlay-CnKWDMG_.css +1 -0
- package/dist/assets/LiveApp-B9zwXlGC.js +61 -0
- package/dist/assets/LiveApp-BVZGpJ1S.css +1 -0
- package/dist/assets/LiveSettings-CmgrMqvK.css +1 -0
- package/dist/assets/LiveSettings-D9OcWlm6.js +6 -0
- package/dist/assets/MindMapViewerDrawer-YYyZqmAd.js +1 -0
- package/dist/assets/MindShape-Ca3MXEgK.css +1 -0
- package/dist/assets/MindShape-mTlN5mPZ.js +1 -0
- package/dist/assets/Orb-B0NEVfqL.js +1 -0
- package/dist/assets/PinToDashboard-_kIOHs0k.js +1 -0
- package/dist/assets/PlanReview-33V8GTNB.js +1 -0
- package/dist/assets/Presence-CzLJIeSD.js +1 -0
- package/dist/assets/PresentationDeck-BDoGecxr.js +1 -0
- package/dist/assets/PrismApp-PfBTFhMF.js +2 -0
- package/dist/assets/PrismAskController-DBoxQSJR.css +1 -0
- package/dist/assets/PrismAskController-DbQDrlU9.js +37 -0
- package/dist/assets/PrismBriefingPlayer-1fvlfLR8.js +2 -0
- package/dist/assets/PrismOverlay-B7lEspdu.js +131 -0
- package/dist/assets/PrismOverlay-BTfAicBt.css +1 -0
- package/dist/assets/PrivacyApp-CR4lRs0L.js +128 -0
- package/dist/assets/Quiz-CUwtekfu.js +1 -0
- package/dist/assets/Recap-DCiiWNiV.css +1 -0
- package/dist/assets/Recap-H5fhj5Tc.js +1 -0
- package/dist/assets/ReelJelly-3jSVsJsy.js +1 -0
- package/dist/assets/RehearsalPanel-BCU615wg.css +1 -0
- package/dist/assets/RehearsalPanel-BVgjrOPg.js +6 -0
- package/dist/assets/ReplayCard-BpYO5vX-.js +2 -0
- package/dist/assets/ReplayOverlay-DXmVdeIr.js +1 -0
- package/dist/assets/RewindOverlay-BusfWeFq.js +1 -0
- package/dist/assets/RewindOverlay-C92qgvmi.css +1 -0
- package/dist/assets/RippleApp-9KrJPYgN.js +2 -0
- package/dist/assets/RippleAskController-BNAUoIW0.css +1 -0
- package/dist/assets/RippleAskController-CO9wE7hU.js +34 -0
- package/dist/assets/RippleOverlay-DMHLbfh8.js +6 -0
- package/dist/assets/RippleOverlay-_iiZsQVZ.css +1 -0
- package/dist/assets/SeeDontRead-C389viue.js +1 -0
- package/dist/assets/ShareModal-C8S7ySls.css +1 -0
- package/dist/assets/ShareModal-ClnEkudw.js +32 -0
- package/dist/assets/ShipCascade-BUtwvQoW.js +1 -0
- package/dist/assets/ShipCascade-CyFnrlET.css +1 -0
- package/dist/assets/ShipCourse-B7lG6DYW.js +1 -0
- package/dist/assets/ShipCourse-DcT7PUSm.css +1 -0
- package/dist/assets/ShipGate-BVZfCllb.css +1 -0
- package/dist/assets/ShipGate-BYYu9WVq.js +2 -0
- package/dist/assets/ShipHotspots-Bj2CovtT.js +1 -0
- package/dist/assets/ShipHotspots-CLOMutPv.css +1 -0
- package/dist/assets/ShipIncident-BUHvFFiC.css +1 -0
- package/dist/assets/ShipIncident-DcmindmE.js +2 -0
- package/dist/assets/ShipMigration-BznCskNg.css +1 -0
- package/dist/assets/ShipMigration-s0hVjDQl.js +1 -0
- package/dist/assets/ShipOnboarding-BC9Vxkpa.css +1 -0
- package/dist/assets/ShipOnboarding-ekbHL7OH.js +1 -0
- package/dist/assets/ShipRead-BVNgQT6L.js +1 -0
- package/dist/assets/ShipRollout-BdUQzMyP.js +1 -0
- package/dist/assets/ShipRollout-CqeObx5b.css +1 -0
- package/dist/assets/ShipSuggestions-B6fKYh8L.js +1 -0
- package/dist/assets/ShipSuggestions-BKRvk5Mj.css +1 -0
- package/dist/assets/ShipWorkspace-3D3Rrs1p.js +2 -0
- package/dist/assets/ShipWorkspace-D6XQpGEN.css +1 -0
- package/dist/assets/SignatureLoop-C60r8Wm5.js +1 -0
- package/dist/assets/SrsReview-BoaYb6XN.js +1 -0
- package/dist/assets/SrsReview-DmGdGxT0.css +1 -0
- package/dist/assets/SynthesisApp-vJ2Jq0Qe.js +2 -0
- package/dist/assets/SynthesisOverlay-CkERphvG.js +66 -0
- package/dist/assets/TermsApp-C70tW6m6.js +123 -0
- package/dist/assets/TopicCanvas-CT0eSj2M.js +2 -0
- package/dist/assets/TopicCanvas-D2Nax9II.css +1 -0
- package/dist/assets/TourPrism-BvucSkcs.js +1 -0
- package/dist/assets/TrackerTile-CasZNmt4.js +2 -0
- package/dist/assets/TwoSurfaces-C90X7Aj5.js +1 -0
- package/dist/assets/UnderstoodPanel-CHPD2Ttj.js +1 -0
- package/dist/assets/UnderstoodPanel-Q6GX1TFq.css +1 -0
- package/dist/assets/WhyMachineOverlay-BZk3PVTl.css +1 -0
- package/dist/assets/WhyMachineOverlay-CB0_n6Sy.js +1 -0
- package/dist/assets/WowFeatures-Ci_H5QYX.js +1 -0
- package/dist/assets/ZoomDeck-B2SjNwY7.css +1 -0
- package/dist/assets/ZoomDeck-BQHO79ZU.js +1 -0
- package/dist/assets/__vite-browser-external-BufR4LQa.js +1 -0
- package/dist/assets/ai-Ba4lZJ9Y.js +12 -0
- package/dist/assets/alternateFinishes-DZ-rkpkX.js +494 -0
- package/dist/assets/annotationAuto-B0nihA4F.js +1 -0
- package/dist/assets/annotationReel-BcU9Q0Sw.js +1 -0
- package/dist/assets/annotations-D2K9A5GB.js +1 -0
- package/dist/assets/backup-c-Btapzp.js +1 -0
- package/dist/assets/blockLabel-DAqaHKy3.js +1 -0
- package/dist/assets/c-DWGmR78Y.js +1 -0
- package/dist/assets/c-SSSlmE39.js +1 -0
- package/dist/assets/cache-BumECILO.js +1 -0
- package/dist/assets/canvas-QTEIiK23.js +1 -0
- package/dist/assets/catalog-BHjl-1uH.js +2 -0
- package/dist/assets/catalog-Dqaq2YFd.js +1 -0
- package/dist/assets/cfo.generated-Bjl5OGay.js +1 -0
- package/dist/assets/chapters-BiUsDClQ.js +1 -0
- package/dist/assets/charts1-EOoxU_K3.js +1 -0
- package/dist/assets/charts2-tyUiQPff.js +1 -0
- package/dist/assets/chunk-BVpWp9h4.js +1 -0
- package/dist/assets/citation-BcvmjKS8.js +1 -0
- package/dist/assets/code-CpjYCNS8.js +8 -0
- package/dist/assets/codeContext-0UMRSGRr.js +5 -0
- package/dist/assets/colors-D49Req-e.js +1 -0
- package/dist/assets/compose-BJ9EfcQS.js +3 -0
- package/dist/assets/contentVault-DzTYWcbD.js +1 -0
- package/dist/assets/core-DEFyprhs.js +1 -0
- package/dist/assets/corpus.generated-oX9uU93S.js +11 -0
- package/dist/assets/courseSeed-CZdNBTTs.js +1 -0
- package/dist/assets/courseStore-DfafnL-9.js +1 -0
- package/dist/assets/courses-BkH1ntDL.css +1 -0
- package/dist/assets/cpp-BGdv8dzs.js +1 -0
- package/dist/assets/cpp-CNAAXZl-.js +1 -0
- package/dist/assets/csharp-oqKa8noW.js +1 -0
- package/dist/assets/css-CdtkT07m.js +1 -0
- package/dist/assets/css-LbU1hoFO.js +1 -0
- package/dist/assets/dag-C3Xx8pOD.js +2 -0
- package/dist/assets/dashboardEvents-DR9d_c74.js +2 -0
- package/dist/assets/dashboards-rcWxdoXI.css +1 -0
- package/dist/assets/deckLine-NBd3MyGT.js +1 -0
- package/dist/assets/demoPaletteItems-NPCSaSU6.js +1 -0
- package/dist/assets/dev.generated-DYgVxL_4.js +73 -0
- package/dist/assets/diagrams-CaSfjT4I.js +1 -0
- package/dist/assets/diff-woXpYk--.js +1 -0
- package/dist/assets/display-OvC57CMc.js +9 -0
- package/dist/assets/dist-BFx3nZg4.js +2785 -0
- package/dist/assets/dist-xRGLOZwv.js +14 -0
- package/dist/assets/docs-B2aDtm5K.js +1 -0
- package/dist/assets/everyday-CoZa4kDZ.js +1 -0
- package/dist/assets/explode-WBykfhqW.js +13 -0
- package/dist/assets/extractNumbers-CuhagRkd.js +1 -0
- package/dist/assets/facts-BBTt3ImG.js +1 -0
- package/dist/assets/finance-Bxn_Q1p0.js +1 -0
- package/dist/assets/fit-0HxU-rtB.js +1 -0
- package/dist/assets/fitText-CDFmCQzl.js +1 -0
- package/dist/assets/flows-BL81J7yN.js +1 -0
- package/dist/assets/format-DlZTyeMy.js +1 -0
- package/dist/assets/format-hc2QOoIu.js +1 -0
- package/dist/assets/forms-DeoXOxdD.js +1 -0
- package/dist/assets/generate-8odaTyr4.js +17 -0
- package/dist/assets/generateBeats-b64CL54v.js +1 -0
- package/dist/assets/generateCourse-Cj_-vDWu.js +28 -0
- package/dist/assets/generateLive-D4B30fnF.js +52 -0
- package/dist/assets/geometry-DXAbnb0J.js +1 -0
- package/dist/assets/gesture-DabMpPcq.js +2 -0
- package/dist/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/assets/githubBrowser-DywfDeYx.js +1 -0
- package/dist/assets/githubToken-DtcLYqwm.js +11 -0
- package/dist/assets/go-rLFTqkRN.js +1 -0
- package/dist/assets/homeTarget-BgWKI_E1.js +1 -0
- package/dist/assets/html-BcACZWSP.js +1 -0
- package/dist/assets/html-DDNsd9lV.js +1 -0
- package/dist/assets/http-CJCtjYpA.js +2 -0
- package/dist/assets/icons-CHVz6kv_.js +1 -0
- package/dist/assets/index-CepQEz75.css +1 -0
- package/dist/assets/index-y8GL67bB.js +22 -0
- package/dist/assets/index.es-CRLiWwiA.js +5 -0
- package/dist/assets/info-CiqHR5cs.js +1 -0
- package/dist/assets/java-BtIQNnN0.js +1 -0
- package/dist/assets/java-DxlWrXwe.js +1 -0
- package/dist/assets/javascript-BzbQS41l.js +1 -0
- package/dist/assets/javascript-Yelw-5ZN.js +1 -0
- package/dist/assets/json-B0N3XRZU.js +1 -0
- package/dist/assets/json-B88Oqtu5.js +1 -0
- package/dist/assets/json-CaljABEy.js +1 -0
- package/dist/assets/jspdf.es.min-C-Pf79px.js +79 -0
- package/dist/assets/jsx-D3KKoC5L.js +1 -0
- package/dist/assets/jsx-hEbJ82HF.js +1 -0
- package/dist/assets/jsx-runtime-DaSxXjOY.js +1 -0
- package/dist/assets/katex-BMCG0xok.js +257 -0
- package/dist/assets/keyVault-DEsNh9FR.js +1 -0
- package/dist/assets/kokoro-D4GKpSL0.js +1 -0
- package/dist/assets/kotlin-DhhofPvG.js +1 -0
- package/dist/assets/layout-BFQOzXtG.js +1 -0
- package/dist/assets/layout-CkO0Psde.js +1 -0
- package/dist/assets/lazyRetry-D50B1UMY.js +1 -0
- package/dist/assets/leaflet-src-C_xhOQY7.js +1 -0
- package/dist/assets/learn-DVfqN-nf.js +1 -0
- package/dist/assets/lib-DMAxsZKm.css +1 -0
- package/dist/assets/lib-VFqp6Y3w.js +1 -0
- package/dist/assets/links--u_phi0x.js +1 -0
- package/dist/assets/liveSchema-CJ49PX5R.js +98 -0
- package/dist/assets/markdown-BYOwaDjH.js +1 -0
- package/dist/assets/mastery-BPjxP0fN.js +4 -0
- package/dist/assets/media-CsrUl279.js +43 -0
- package/dist/assets/model-BE0UHu1w.js +27 -0
- package/dist/assets/motion-S0NRruNj.js +1 -0
- package/dist/assets/nav-Czm-NzPV.js +1 -0
- package/dist/assets/neighborhoods-C-1Tjr1r.js +1 -0
- package/dist/assets/notes-A9t4jdfx.css +1 -0
- package/dist/assets/notes-lROPCorS.js +1 -0
- package/dist/assets/notify-Bz4wuE4T.js +1 -0
- package/dist/assets/now-C9-UAzTC.js +1 -0
- package/dist/assets/number-DXgzss0v.js +1 -0
- package/dist/assets/officeDoc-B6nEhNp4.js +3 -0
- package/dist/assets/openchemlib-nMLMmg26.js +23 -0
- package/dist/assets/overlays-JxbHtA2o.js +1 -0
- package/dist/assets/owners-FXDGInVq.js +2 -0
- package/dist/assets/pageVisibility-BxUVsw7Z.js +1 -0
- package/dist/assets/pdf-Df7PCH7q.js +11 -0
- package/dist/assets/pdf.worker.min-yatZIOMy.mjs +21 -0
- package/dist/assets/penStrokes-9Q_l7NTt.js +1 -0
- package/dist/assets/perfProbe-COAp9PAa.js +1 -0
- package/dist/assets/php-CYrBA5iX.js +1 -0
- package/dist/assets/pickers-B4-3HOR8.js +1 -0
- package/dist/assets/pin-Bya3BL_a.css +1 -0
- package/dist/assets/pin-CXSuPJYL.js +1 -0
- package/dist/assets/planTracker-7AMCQPNx.js +1 -0
- package/dist/assets/portal-DMw7C32j.js +1 -0
- package/dist/assets/pptxgen.es-CvTILmV9.js +115 -0
- package/dist/assets/predictions-CYS7Vo39.js +1 -0
- package/dist/assets/prewarm--whjQhWJ.js +1 -0
- package/dist/assets/prism-app-CXYElq8-.css +1 -0
- package/dist/assets/prism.generated-BhbHDHR6.js +41 -0
- package/dist/assets/prismExtract.worker-Cws9K1NG.js +13 -0
- package/dist/assets/prismGround.worker-CIvKqxm2.js +1 -0
- package/dist/assets/prismLayout.worker-CZO2CY7B.js +1 -0
- package/dist/assets/providers-wzm7E8Pa.js +1 -0
- package/dist/assets/purify.es-adlwq8Pz.js +3 -0
- package/dist/assets/python-gzcpVVnB.js +1 -0
- package/dist/assets/queue-DHeyJ32F.css +1 -0
- package/dist/assets/queue-J4h7E3uc.js +1 -0
- package/dist/assets/quietHours-BvcsBKKK.js +1 -0
- package/dist/assets/react-BQSORdFI.js +1 -0
- package/dist/assets/reference-sJzyMiL4.js +1 -0
- package/dist/assets/registry-1GuPBfQK.js +1 -0
- package/dist/assets/registry-2GJZ46M8.css +1 -0
- package/dist/assets/registry-2v0jlh5Q.js +2 -0
- package/dist/assets/registry-B8DStMJk.js +1 -0
- package/dist/assets/registry-B940W2j5.js +1 -0
- package/dist/assets/registry-BAoRB8rd.css +1 -0
- package/dist/assets/registry-BPvIPLke.js +1 -0
- package/dist/assets/registry-BVHiKEwE.css +1 -0
- package/dist/assets/registry-BcZXBr3y.css +1 -0
- package/dist/assets/registry-BffpZK5w.js +1 -0
- package/dist/assets/registry-BgGeRiDA.js +2 -0
- package/dist/assets/registry-Buq5uuCv.js +1 -0
- package/dist/assets/registry-BzNLfje1.css +1 -0
- package/dist/assets/registry-C3ezxLR3.css +1 -0
- package/dist/assets/registry-CAusoyBh.js +1 -0
- package/dist/assets/registry-CEVrY72Z.js +1 -0
- package/dist/assets/registry-CKjKq6ct.js +1 -0
- package/dist/assets/registry-CNgybLQv.css +1 -0
- package/dist/assets/registry-CRM7y8QT.css +1 -0
- package/dist/assets/registry-CRisz4Ca.css +1 -0
- package/dist/assets/registry-Cg7qUZPS.js +1 -0
- package/dist/assets/registry-Cix-yqch.js +1 -0
- package/dist/assets/registry-CtbuZWYz.css +1 -0
- package/dist/assets/registry-DCI_BeFJ.js +5 -0
- package/dist/assets/registry-DDLSYDVA.js +1 -0
- package/dist/assets/registry-DI1wSG1Y.js +1 -0
- package/dist/assets/registry-DJinB5ye.js +2 -0
- package/dist/assets/registry-DUvXX_d0.js +1 -0
- package/dist/assets/registry-DVzLacl_.css +1 -0
- package/dist/assets/registry-DWcNVyI2.css +1 -0
- package/dist/assets/registry-D_URPoL4.js +1 -0
- package/dist/assets/registry-Dkc7hN5T.js +1 -0
- package/dist/assets/registry-DmQlNN3y.js +1 -0
- package/dist/assets/registry-DpaaVbmL.css +1 -0
- package/dist/assets/registry-Dpb8EXHn.js +49 -0
- package/dist/assets/registry-Dru0JcTa.css +1 -0
- package/dist/assets/registry-DujBAgn_.js +1 -0
- package/dist/assets/registry-Dye5m3qt.css +1 -0
- package/dist/assets/registry-GeSy4i7R.css +1 -0
- package/dist/assets/registry-QcULZpdE.js +4 -0
- package/dist/assets/registry-T3i2Q9SI.css +1 -0
- package/dist/assets/registry-UFIuwh3i.css +1 -0
- package/dist/assets/registry-Xzq_Rpmm.css +1 -0
- package/dist/assets/registry-ZOWzhOHk.css +1 -0
- package/dist/assets/registry-aIH-Im5Y.css +1 -0
- package/dist/assets/registry-aazwkBJp.js +1 -0
- package/dist/assets/registry-ei6fIgBT.css +1 -0
- package/dist/assets/registry-types-DMuK0vJ6.js +1 -0
- package/dist/assets/registry-upbw6pyj.css +1 -0
- package/dist/assets/registry-zRPjWNl5.js +1 -0
- package/dist/assets/relate-A9ZeaaAI.js +1 -0
- package/dist/assets/richText-BkxJhl9N.js +1 -0
- package/dist/assets/ruby-BhrksQMt.js +1 -0
- package/dist/assets/run-BYP2YlZT.js +23 -0
- package/dist/assets/run-C_0B_41W.js +21 -0
- package/dist/assets/run-DSVvshaB.js +21 -0
- package/dist/assets/rust-Cfkwpbl8.js +1 -0
- package/dist/assets/safeCssColor-di93BXgG.js +1 -0
- package/dist/assets/safeImageUrl-CUkucDUu.js +1 -0
- package/dist/assets/scale-Bcgfo6Hp.js +1 -0
- package/dist/assets/screen-DLR7p_yP.js +1 -0
- package/dist/assets/search-DnjHupRf.js +1 -0
- package/dist/assets/seed-b1xc0dj2.js +1 -0
- package/dist/assets/shapes-RqjqC0ay.js +1 -0
- package/dist/assets/shard000-DM_rqD7W.js +1 -0
- package/dist/assets/shard001-gQEQs7_F.js +1 -0
- package/dist/assets/shard002-DbDas-W-.js +1 -0
- package/dist/assets/shard003-DxMszG4_.js +1 -0
- package/dist/assets/shard004-DZMpLBw1.js +1 -0
- package/dist/assets/shard005-DLVkh9IH.js +1 -0
- package/dist/assets/shard006-B6efKHov.js +1 -0
- package/dist/assets/shard007-AFdZLe38.js +1 -0
- package/dist/assets/shard008-LbSBzwRx.js +1 -0
- package/dist/assets/shard009-D_6-SUDb.js +1 -0
- package/dist/assets/shard010-DbOj-uZW.js +1 -0
- package/dist/assets/shard011-BYSz7EEW.js +1 -0
- package/dist/assets/shard012-B5Ypj7OV.js +1 -0
- package/dist/assets/shard013-BtsliNIe.js +1 -0
- package/dist/assets/shard014-15sjmk68.js +1 -0
- package/dist/assets/shard015-nnXrqru_.js +1 -0
- package/dist/assets/shard016-BayXFE13.js +1 -0
- package/dist/assets/shard017-Cy4cGexs.js +1 -0
- package/dist/assets/shard018-aO-BYJ8H.js +1 -0
- package/dist/assets/shard019-gxaTeA3I.js +1 -0
- package/dist/assets/shard020-BibJdMI0.js +1 -0
- package/dist/assets/shard021-2FE-tze4.js +1 -0
- package/dist/assets/shard022-IXiyG-JK.js +1 -0
- package/dist/assets/shard023-314F6NJS.js +1 -0
- package/dist/assets/shard024-cN5rpQ_X.js +1 -0
- package/dist/assets/shard025-KKTaXOGE.js +1 -0
- package/dist/assets/shard026-C2Dkd1t6.js +1 -0
- package/dist/assets/shard027-Xy-8x9As.js +1 -0
- package/dist/assets/shard028-Bul-klUj.js +1 -0
- package/dist/assets/shard029-BbRSUcUZ.js +1 -0
- package/dist/assets/shard030-GYllsFVC.js +1 -0
- package/dist/assets/shard031-DMigeiyn.js +1 -0
- package/dist/assets/shard032-CcvmzK0l.js +1 -0
- package/dist/assets/shard033-11AU702M.js +1 -0
- package/dist/assets/shard034-Bx3urxjM.js +1 -0
- package/dist/assets/shard035-DBdEeyCt.js +1 -0
- package/dist/assets/shard036-vYgoRBqS.js +1 -0
- package/dist/assets/shard037-DP4MMw91.js +1 -0
- package/dist/assets/shard038-ffxsv7d6.js +1 -0
- package/dist/assets/shard039-C1JHHNp9.js +1 -0
- package/dist/assets/shard040-JbVvCSO_.js +1 -0
- package/dist/assets/shard041-5L_eFwGx.js +1 -0
- package/dist/assets/shard042-C9nsGL79.js +1 -0
- package/dist/assets/shard043-Dx_9HSKI.js +1 -0
- package/dist/assets/shard044-B3QQNC4A.js +1 -0
- package/dist/assets/shard045-B7z0WHO6.js +1 -0
- package/dist/assets/shard046-D1yDablJ.js +1 -0
- package/dist/assets/shard047-DJi3AgeT.js +1 -0
- package/dist/assets/shard048-D_2ipfUr.js +1 -0
- package/dist/assets/shard049-1aGgWZdd.js +1 -0
- package/dist/assets/shard050-Bjwa0Og4.js +1 -0
- package/dist/assets/shard051-Cx_GAk3v.js +1 -0
- package/dist/assets/shard052-LaeOD3V5.js +1 -0
- package/dist/assets/shard053-D-da7Foj.js +1 -0
- package/dist/assets/shard054-CM8eSRQk.js +1 -0
- package/dist/assets/shard055-QRpDl4Vs.js +1 -0
- package/dist/assets/shard056-DkY7CQm3.js +1 -0
- package/dist/assets/shard057-BVCgf7o0.js +1 -0
- package/dist/assets/shard058-93aGtdrX.js +1 -0
- package/dist/assets/shard059-rJE9X1_I.js +1 -0
- package/dist/assets/shard060-Lu_hfl1r.js +1 -0
- package/dist/assets/shard061-C9A8iNiq.js +1 -0
- package/dist/assets/shard062-BBIpEYZO.js +1 -0
- package/dist/assets/shard063-C_uen3Ub.js +1 -0
- package/dist/assets/shard064-DAHUsHST.js +1 -0
- package/dist/assets/shard065-C2edvdvh.js +1 -0
- package/dist/assets/shard066-DFcuVhZm.js +1 -0
- package/dist/assets/shard067-BN8DM8JZ.js +1 -0
- package/dist/assets/shard068-i464K77p.js +1 -0
- package/dist/assets/shard069-Dm9m2a5U.js +1 -0
- package/dist/assets/shard070-BPVvR8GH.js +1 -0
- package/dist/assets/shard071-Bal_0d9L.js +1 -0
- package/dist/assets/shard072-CBQu62kt.js +1 -0
- package/dist/assets/shard073-D5BRae0w.js +1 -0
- package/dist/assets/shard074-DtFvcBnZ.js +1 -0
- package/dist/assets/share-QHGHNDhQ.js +1 -0
- package/dist/assets/shellscript-BiGZg9Om.js +1 -0
- package/dist/assets/shellscript-CqHdAlCp.js +1 -0
- package/dist/assets/shikiHighlight-DUCYbsJ2.js +153 -0
- package/dist/assets/sourceHost-BV3t2XDb.js +1 -0
- package/dist/assets/speed-DwPw9KSv.js +1 -0
- package/dist/assets/spokenText-D4zPX9JY.js +1 -0
- package/dist/assets/sql-0Qcw9ht3.js +1 -0
- package/dist/assets/sql-CP0rg-5b.js +1 -0
- package/dist/assets/src-DbgF7cRH.js +2 -0
- package/dist/assets/stats-BeP5Bws0.js +1 -0
- package/dist/assets/status-BY02LIJt.js +1 -0
- package/dist/assets/stepDriver-DwjFet6U.js +1 -0
- package/dist/assets/store-4JNNn732.js +1 -0
- package/dist/assets/store-BFC7DZcg.js +1 -0
- package/dist/assets/store-BFrJaSxJ.js +1 -0
- package/dist/assets/store-DXmC_fP2.js +0 -0
- package/dist/assets/store-DgG0C1Qx.js +1 -0
- package/dist/assets/streamParse-DRgMHWye.js +2 -0
- package/dist/assets/student.generated-DS_acPaJ.js +1 -0
- package/dist/assets/swift-DonLKvLd.js +1 -0
- package/dist/assets/tables-Dzd3rTqG.js +1 -0
- package/dist/assets/time-BHTmJR1s.js +1 -0
- package/dist/assets/toast-BBNs2h3L.js +1 -0
- package/dist/assets/toml-CcmNWLt0.js +1 -0
- package/dist/assets/traveler.generated-Beun9X7y.js +1 -0
- package/dist/assets/tsx-5f3ulCja.js +1 -0
- package/dist/assets/tsx-BOvsFOI6.js +1 -0
- package/dist/assets/typeof-B5XbjTb1.js +1 -0
- package/dist/assets/typescript-Utq2Cl8c.js +1 -0
- package/dist/assets/typescript-j_1H8WHN.js +1 -0
- package/dist/assets/useDashboardLoop-B6ByHWoE.js +5 -0
- package/dist/assets/useFocusTrap-DbfG6zbM.js +1 -0
- package/dist/assets/useLiveConfig-X9Wxh90k.js +1 -0
- package/dist/assets/useSpatialCanvas-DogK9457.js +1 -0
- package/dist/assets/useSpotlightWalk-rMbmNBKK.js +1 -0
- package/dist/assets/useSrsCards-CagZefwX.js +1 -0
- package/dist/assets/useStudy-Bflreq2a.js +1 -0
- package/dist/assets/useTimeout-BRYvu2jQ.js +1 -0
- package/dist/assets/useValidatedImage-D2fhA198.js +1 -0
- package/dist/assets/useZoomGesture-CYc3tf2z.js +1 -0
- package/dist/assets/verbatim-CBMzUDlf.js +1 -0
- package/dist/assets/worker-BbLKfGzm.js +2 -0
- package/dist/assets/xml-WY0zc4PG.js +1 -0
- package/dist/assets/yaml-CxbubiML.js +1 -0
- package/dist/assets/yaml-DijMHRDA.js +1 -0
- package/dist/demo-assets/CREDITS.md +40 -0
- package/dist/demo-assets/images/basalt-cliffs.jpg +0 -0
- package/dist/demo-assets/images/capelinhos.jpg +0 -0
- package/dist/demo-assets/images/cliff-fields.jpg +0 -0
- package/dist/demo-assets/images/crater-panorama.jpg +0 -0
- package/dist/demo-assets/images/furnas-lake.jpg +0 -0
- package/dist/demo-assets/images/green-coast.jpg +0 -0
- package/dist/demo-assets/images/overcast-coast.jpg +0 -0
- package/dist/demo-assets/images/patchwork-fields.jpg +0 -0
- package/dist/demo-assets/images/ponta-delgada.jpg +0 -0
- package/dist/demo-assets/images/sete-cidades.jpg +0 -0
- package/dist/demo-assets/images/slide-placeholder-light.svg +9 -0
- package/dist/demo-assets/images/slide-placeholder.svg +9 -0
- package/dist/demo-assets/images/village-street.jpg +0 -0
- package/dist/demo-assets/pdf/cfd-primer.pdf +0 -0
- package/dist/demo-assets/video/azores-film.mp4 +0 -0
- package/dist/favicon.svg +19 -0
- package/dist/fonts/LICENSE.txt +34 -0
- package/dist/fonts/archivo-var-latin.woff2 +0 -0
- package/dist/fonts/bodoni-moda-400-italic-latin.woff2 +0 -0
- package/dist/fonts/bodoni-moda-var-latin.woff2 +0 -0
- package/dist/fonts/eb-garamond-var-italic-latin.woff2 +0 -0
- package/dist/fonts/eb-garamond-var-latin.woff2 +0 -0
- package/dist/fonts/export/families/archivo.css +12 -0
- package/dist/fonts/export/families/bodoni-moda.css +23 -0
- package/dist/fonts/export/families/eb-garamond.css +22 -0
- package/dist/fonts/export/families/ibm-plex-sans.css +12 -0
- package/dist/fonts/export/families/instrument-serif.css +22 -0
- package/dist/fonts/export/families/jetbrains-mono.css +12 -0
- package/dist/fonts/export/families/libre-franklin.css +12 -0
- package/dist/fonts/export/families/lora.css +22 -0
- package/dist/fonts/export/families/source-serif-4.css +12 -0
- package/dist/fonts/export/families/space-grotesk.css +12 -0
- package/dist/fonts/export/families/spectral.css +52 -0
- package/dist/fonts/fonts.css +141 -0
- package/dist/fonts/hanken-grotesk-var-latin.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-var-latin.woff2 +0 -0
- package/dist/fonts/instrument-serif-400-italic-latin.woff2 +0 -0
- package/dist/fonts/instrument-serif-400-latin.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-var-latin.woff2 +0 -0
- package/dist/fonts/libre-franklin-var-latin.woff2 +0 -0
- package/dist/fonts/lora-var-italic-latin.woff2 +0 -0
- package/dist/fonts/lora-var-latin.woff2 +0 -0
- package/dist/fonts/newsreader-var-italic-latin.woff2 +0 -0
- package/dist/fonts/newsreader-var-latin.woff2 +0 -0
- package/dist/fonts/plex-mono-400-latin.woff2 +0 -0
- package/dist/fonts/plex-mono-500-latin.woff2 +0 -0
- package/dist/fonts/plex-mono-600-latin.woff2 +0 -0
- package/dist/fonts/source-serif-4-var-latin.woff2 +0 -0
- package/dist/fonts/space-grotesk-var-latin.woff2 +0 -0
- package/dist/fonts/spectral-400-italic-latin.woff2 +0 -0
- package/dist/fonts/spectral-400-latin.woff2 +0 -0
- package/dist/fonts/spectral-500-italic-latin.woff2 +0 -0
- package/dist/fonts/spectral-500-latin.woff2 +0 -0
- package/dist/fonts/spectral-600-latin.woff2 +0 -0
- package/dist/index.html +117 -0
- package/dist/legal/DISCLAIMER.md +16 -0
- package/dist/legal/LICENSE.txt +75 -0
- package/dist/legal/PRIVACY.md +127 -0
- package/dist/legal/SECURITY.md +72 -0
- package/dist/legal/SUPPORT.md +13 -0
- package/dist/legal/TERMS.md +122 -0
- package/dist/legal/THIRD-PARTY.txt +639 -0
- package/dist/legal/TRADEMARKS.md +15 -0
- package/dist/ort-wasm-simd-threaded.mjs +59 -0
- package/dist/sw.js +30 -0
- package/dist/vad.worklet.bundle.min.js +1 -0
- package/docker-compose.yml +33 -0
- package/gateway/README.md +99 -0
- package/gateway/actions-gateway.mjs +537 -0
- package/gateway/connectors.d.mts +27 -0
- package/gateway/connectors.mjs +463 -0
- package/gateway/guard.mjs +110 -0
- package/gateway/tokenStore.mjs +134 -0
- package/package.json +143 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={pr:{repo:`acme/auth-service`,number:`#482`,branch:`feat/short-lived-tokens`,base:`main`,added:142,removed:38,files:7,title:`Short-lived access tokens + refresh rotation`,summary:`It cuts access-token lifetime to 15 minutes and adds refresh-token rotation, so a stolen token expires fast while real sessions stay alive by quietly refreshing. The web client absorbs the change — users never see a logout.`,risks:[{level:`breaks`,text:`src/api/guard.ts:21 calls validateToken the old way — it throws at runtime on every guarded route.`},{level:`watch`,text:`Two changed paths have no test — the route guard and the token reaper.`},{level:`watch`,text:`Rotation isn’t atomic — concurrent refreshes can double-rotate a session.`}],p0Ways:1,readScope:`Read from the diff: 7 files across 4 areas, plus the in-repo callers a search found.`},nodes:[{id:`pr`,label:`auth-service`,sub:`THIS PR`,type:`pr`,status:`affected`,scope:`in-pr`},{id:`auth`,label:`src/auth`,sub:`4 files`,type:`module`,status:`affected`,scope:`in-pr`,owner:`@acme/auth-team`,contract:`Issues and verifies tokens; this PR reshapes validateToken and adds rotation.`,problem:`The new validateToken(opts) signature is the source of the breaking call below.`,fix:`Land the new signature with every in-repo caller updated in the same change.`},{id:`api`,label:`src/api`,sub:`1 file`,type:`module`,status:`breaks`,scope:`in-pr`,owner:`@acme/platform-team`,contract:`The route guard verifies every protected request via validateToken.`,problem:`guard.ts:21 still calls validateToken without opts — a runtime TypeError on each route.`,fix:`Pass the new VerifyOpts (or make it required so the build catches missing callers).`},{id:`web`,label:`src/web`,sub:`1 file`,type:`client`,status:`safe`,scope:`in-pr`,owner:`@acme/web-team`,contract:`The fetch wrapper retries once on a 401 by refreshing.`,problem:`Already updated in this PR — auto-refresh absorbs the shorter TTL, no visible logout.`,fix:`No action; this caller is ready.`},{id:`mig`,label:`migrations`,sub:`0042.sql`,type:`datastore`,status:`migration`,scope:`in-pr`,contract:`Adds an index for refresh-token lookups and a token_version column.`,problem:`A NOT NULL add rewrites the table — on a large table that can lock writes.`,fix:`Run it expand/contract; confirm the real row count before running on prod.`},{id:`tests`,label:`tests`,sub:`1 file`,type:`module`,status:`untested`,scope:`in-pr`,contract:`Covers the rotation happy path.`,problem:`The guard and reaper paths this PR changed are not covered.`,fix:`Add a test that exercises guard.ts with the new signature.`}],edges:[{from:`pr`,to:`api`,verb:`calls`,status:`breaks`,breaking:!0},{from:`pr`,to:`auth`,verb:`changes`,status:`affected`},{from:`pr`,to:`mig`,verb:`migrates`,status:`migration`},{from:`pr`,to:`web`,verb:`refreshes`,status:`safe`},{from:`pr`,to:`tests`,verb:`covers`,status:`untested`}],changes:[{id:`ttl`,subsystem:`AUTH`,file:`src/config.ts:12`,kind:`config`,risk:`watch`,title:`Access-token TTL cut to 15m`,intent:`It shrinks the window a stolen access token stays valid — from an hour down to fifteen minutes.`,why:`Short tokens are only safe if clients can silently refresh — so this change only makes sense alongside the new rotation flow.`,diff:{file:`src/config.ts`,add:1,del:1,lines:[{t:`del`,c:`ACCESS_TTL = 60 * 60`},{t:`add`,c:`ACCESS_TTL = 15 * 60`}]},blastRadius:[`web`],blastFiles:2,blastOutside:0,links:[{name:`fetch wrapper`,ref:`src/web/api.ts:130`,scope:`in-pr`,status:`updated`}],risks:[{level:`watch`,text:`For one TTL window after deploy, tokens minted as v1 are still live.`}]},{id:`sig`,subsystem:`AUTH`,file:`src/auth/token.ts:42`,kind:`interface`,risk:`breaks`,title:`validateToken() signature changed`,intent:`It adds a VerifyOpts argument so callers can pass a clock and an audience — the rotation flow needs the clock-skew tolerance.`,why:`Old call-sites still compile because opts is optional — which is exactly the trap: they pass undefined and fail at runtime, not at build.`,diff:{file:`src/auth/token.ts`,add:1,del:1,lines:[{t:`del`,c:`validateToken(t: string)`},{t:`add`,c:`validateToken(t: string, opts: VerifyOpts)`}]},blastRadius:[`api`,`auth`],blastFiles:3,blastOutside:0,symbols:[`validateToken`],links:[{name:`route guard`,ref:`src/api/guard.ts:21`,scope:`in-pr`,status:`breaks`},{name:`refreshSession()`,ref:`src/auth/session.ts:88`,scope:`in-pr`,status:`updated`},{name:`token reaper job`,ref:`src/jobs/reaper.ts:14`,scope:`in-pr`,status:`untested`}],risks:[{level:`breaks`,text:`guard.ts:21 still passes the old shape — throws a TypeError on the first request.`}]},{id:`refresh`,subsystem:`AUTH`,file:`src/auth/refresh.ts:1`,kind:`behavior`,risk:`watch`,title:`Refresh-token rotation added`,intent:`It issues a fresh refresh token on every use and revokes the old one — the core mechanism that lets short access tokens stay usable.`,why:`This is the heart of the PR. Everything else — the shorter TTL, the client retry, the new index — exists to support it.`,diff:{file:`src/auth/refresh.ts`,add:2,del:0,lines:[{t:`add`,c:`export async function rotateRefresh(session) {`},{t:`ctx`,c:` const next = await mint(session.user)`},{t:`add`,c:` await revoke(session.refresh)`},{t:`ctx`,c:` return next`},{t:`ctx`,c:`}`}]},blastRadius:[`auth`,`mig`],blastFiles:3,blastOutside:0,symbols:[`rotateRefresh`],links:[{name:`refreshSession()`,ref:`src/auth/session.ts:88`,scope:`in-pr`,status:`updated`}],risks:[{level:`watch`,text:`Not atomic — two concurrent refreshes can double-rotate and orphan a token.`}]},{id:`del`,subsystem:`AUTH`,file:`src/auth/legacy.ts`,kind:`breaking`,risk:`breaks`,title:`Removed parseLegacyJWT()`,intent:`It deletes the pre-2023 token parser, now that the new format is the only one issued.`,why:`Dead on the issue path — but a search finds the reaper still imports it, and that caller is in this repo.`,diff:{file:`src/auth/legacy.ts`,add:0,del:3,lines:[{t:`del`,c:`export function parseLegacyJWT(token) {`},{t:`del`,c:` // ...decodes v1 tokens`},{t:`del`,c:`}`}]},blastRadius:[`auth`],blastFiles:2,blastOutside:0,symbols:[`parseLegacyJWT`],links:[{name:`token reaper job`,ref:`src/jobs/reaper.ts:14`,scope:`in-pr`,status:`breaks`}],risks:[{level:`breaks`,text:`reaper.ts:14 imports parseLegacyJWT — its build breaks the moment this lands.`}]},{id:`mw`,subsystem:`API`,file:`src/api/guard.ts:21`,kind:`behavior`,risk:`breaks`,title:`Route guard now awaits validateToken`,intent:`It makes the protected-route guard async so it can verify tokens through the new path.`,why:`Wires the guard into the new verifier — but was never updated for the new signature, so it calls it the old way.`,diff:{file:`src/api/guard.ts`,add:1,del:1,lines:[{t:`del`,c:`const ok = checkToken(tok)`},{t:`add`,c:`const ok = await validateToken(tok) // no opts`}]},blastRadius:[`api`],blastFiles:2,blastOutside:0,links:[{name:`all protected routes`,ref:`src/api/routes/*`,scope:`in-pr`,status:`affected`}],risks:[{level:`breaks`,text:`Calls validateToken without opts — breaks at runtime on every guarded route.`},{level:`watch`,text:`No test covers this path.`}]},{id:`idx`,subsystem:`DATA`,file:`migrations/0042.sql:1`,kind:`perf`,risk:`watch`,title:`Index + token_version on refresh_tokens`,intent:`It indexes the refresh-token table and adds a token_version column for rotation.`,why:`Rotation reads refresh_tokens on every request — without the index it’s a full scan; the column tracks the rotation generation.`,diff:{file:`migrations/0042.sql`,add:3,del:0,lines:[{t:`add`,c:`CREATE INDEX CONCURRENTLY idx_refresh_user ON refresh_tokens(user_id);`},{t:`add`,c:`ALTER TABLE refresh_tokens`},{t:`add`,c:` ADD COLUMN token_version INT NOT NULL DEFAULT 0;`}]},blastRadius:[`mig`],blastFiles:1,blastOutside:0,links:[],risks:[{level:`watch`,text:`The NOT NULL add rewrites the table — fine when small, a write-lock when large. Row count isn’t in the diff.`}]},{id:`client`,subsystem:`WEB`,file:`src/web/api.ts:130`,kind:`behavior`,risk:`safe`,title:`Web client auto-refreshes on 401`,intent:`It transparently refreshes and retries once when a request comes back 401 — so the shorter TTL is invisible to users.`,why:`This is what keeps the 15-minute token from causing surprise logouts — the UX half of the security change.`,diff:{file:`src/web/api.ts`,add:4,del:0,lines:[{t:`add`,c:`if (res.status === 401) {`},{t:`add`,c:` await refresh()`},{t:`add`,c:` return retry(req)`},{t:`add`,c:`}`}]},blastRadius:[`web`],blastFiles:1,blastOutside:0,links:[],risks:[{level:`watch`,text:`No backoff — a persistently-401 request could retry-loop.`}]},{id:`test`,subsystem:`TESTS`,file:`tests/refresh.test.ts:1`,kind:`test`,risk:`safe`,title:`Refresh-flow tests added`,intent:`It covers the happy path of token rotation with new assertions.`,why:`Good coverage on rotation itself — but the guard and reaper paths it touches are still untested.`,diff:{file:`tests/refresh.test.ts`,add:3,del:0,lines:[{t:`add`,c:`describe('rotateRefresh', () => {`},{t:`add`,c:` it('mints and revokes', ...)`},{t:`add`,c:`})`}]},blastRadius:[],blastFiles:1,blastOutside:0,links:[],risks:[{level:`watch`,text:`guard.ts and reaper paths remain uncovered.`}]}],cascades:[{trigger:`validateToken() gets a new arg`,triggerRef:{ref:`src/auth/token.ts:42`,evidence:`verified`},hops:[{label:`src/api/guard.ts:21 still calls the old shape`,context:`IN-REPO CALLER · found by search`,severity:`breaks`},{label:`every guarded route 500s`,context:`EFFECT · at runtime, not at build`,severity:`breaks`}],incident:`Protected routes fail on the first request after deploy`,incidentSeverity:`P0`,caughtBeforeMerge:`Update guard.ts to the new signature (or make opts required) before merge.`},{trigger:`delete parseLegacyJWT()`,triggerRef:{ref:`src/auth/legacy.ts`,evidence:`verified`},hops:[{label:`src/jobs/reaper.ts:14 imports it`,context:`IN-REPO CALLER · found by search`,severity:`breaks`},{label:`the reaper job fails to build`,context:`EFFECT · token cleanup stops`,severity:`watch`}],incident:`The token-reaper job breaks`,incidentSeverity:`P2`,caughtBeforeMerge:`Migrate the reaper off parseLegacyJWT in the same change.`}],migration:{file:`migrations/0042.sql`,sql:[`ALTER TABLE refresh_tokens`,` ADD COLUMN token_version INT NOT NULL DEFAULT 0;`],rows:`unknown`,lockCost:`depends on the table size — a NOT NULL add rewrites every row under a lock`,expand:[{title:`Add it nullable`,detail:`ADD COLUMN token_version INT — instant, no rewrite, no lock.`},{title:`Backfill in batches`,detail:`Fill existing rows off-peak so replicas keep up.`},{title:`Then set NOT NULL`,detail:`A fast validate once every row is populated.`}],note:`The real row count and lock time aren’t in the diff — confirm them against the table before running on prod.`},rollout:[{order:1,team:`STEP 1`,deploy:`Run the migration (expand)`,note:`Add token_version nullable + backfill, or create the index CONCURRENTLY. No write lock.`},{order:2,team:`STEP 2`,deploy:`Fix the in-repo callers`,note:`Update guard.ts to the new validateToken signature and migrate the reaper off parseLegacyJWT.`},{order:3,team:`STEP 3`,deploy:`Ship auth + web together`,note:`New tokens + the client auto-refresh go live in the same release; tighten the column to NOT NULL after.`,trap:!0}],workTypes:[{type:`security`,label:`Security`,blurb:`Tightening auth, rotating a secret, scoping a permission.`,surfaces:`who in this repo still holds the old token or scope.`},{type:`feature`,label:`Feature work`,blurb:`A new endpoint, field, or function on the surface.`,surfaces:`the in-repo callers you didn’t update.`},{type:`fix`,label:`Bug fix`,blurb:`The “tiny,” obviously-safe one-line fix.`,surfaces:`the callers that quietly relied on the old behaviour.`},{type:`refactor`,label:`Refactor`,blurb:`Rename, move, or delete something shared.`,surfaces:`every in-repo reference a search can find.`},{type:`migration`,label:`Migration`,blurb:`A schema or data change.`,surfaces:`the lock the SQL implies — and what the diff can’t tell you (the row count).`},{type:`dependency`,label:`Dependency bump`,blurb:`Upgrade a library or pin.`,surfaces:`the bumped packages and what changed between versions.`}],hotspots:[],suggestions:[{id:`race`,category:`CONCURRENCY`,title:`Did you consider two refreshes racing?`,gist:`rotateRefresh() mints then revokes with no lock — concurrent refreshes can double-rotate.`,why:`mint() and revoke() are separate writes. Two clients refreshing the same session within milliseconds can both mint before either revokes — orphaning a valid token and breaking single-use rotation.`,evidence:`src/auth/refresh.ts:1 (no transaction) · src/auth/session.ts:88 (two callers)`,fix:`Wrap mint + revoke in one transaction, or take a row lock on session.id.`},{id:`compat`,category:`COMPATIBILITY`,title:`Did you think about the v1 / v2 token overlap?`,gist:`For one TTL window after deploy, tokens minted as v1 are still live — does v2 accept them?`,why:`You shorten the TTL and change validateToken in the same PR. For ~15 minutes after deploy, in-flight v1 tokens are still valid. If validateToken(v2) rejects the old claim shape, active sessions 401 mid-request until they refresh — a self-inflicted spike at rollout.`,evidence:`src/config.ts:12 (TTL → 15m) · src/auth/token.ts:42 (new shape) · no dual-accept path in the diff`,fix:`Accept both claim shapes for one TTL window, then drop v1 behind a flag.`},{id:`obs`,category:`OBSERVABILITY`,title:`Did you add a signal for any of this?`,gist:`You changed the auth hot path but the diff adds no metric or alert on refresh-failure rate.`,why:`If anything above goes wrong, the first signal will be user reports, not a dashboard. A principal-level rollout ships the metric before the change so the blast is visible in seconds.`,evidence:`no new counters in src/auth/refresh.ts / src/api/guard.ts in this diff`,fix:`Emit refresh_success / refresh_fail + p95 and alert on the fail rate before enabling.`},{id:`cost`,category:`DATA`,title:`Did you think about write amplification?`,gist:`Rotating on every request turns reads into writes on refresh_tokens — growth and cleanup?`,why:`Every authed request now writes refresh_tokens. That is sustained write load and unbounded row growth unless old tokens are reaped — and the reaper is exactly what this PR is about to break.`,evidence:`src/auth/refresh.ts (write per call) · migrations/0042.sql (index, not a TTL) · reaper untested`,fix:`Confirm the reaper covers rotated tokens; consider a TTL or partition on the table.`}],suppressedNits:12,modules:[{id:`auth`,name:`src/auth`,purpose:`Tokens, sessions, rotation — the security core.`,entry:`src/auth/token.ts`,owner:`@acme/auth-team`,health:`~4 files`,explain:`Issues and verifies tokens, runs refresh/rotation, enforces scopes. The most security-sensitive area — a change here ripples to every route that calls it. Start with token.ts, then session.ts.`,startHere:[`src/auth/token.ts`,`src/auth/session.ts`,`src/auth/refresh.ts`],depends:[`migrations`],usedBy:[`src/api`,`src/web`]},{id:`api`,name:`src/api`,purpose:`HTTP routes + the auth guard — the front door.`,entry:`src/api/guard.ts`,owner:`@acme/platform-team`,health:`~1 file in this PR`,explain:`Every request passes the guard, which verifies the token before the route runs. Routes stay thin: validate, call into a module, shape the response.`,startHere:[`src/api/guard.ts`,`src/api/routes`],depends:[`src/auth`],usedBy:[`src/web`]},{id:`web`,name:`src/web`,purpose:`The browser client + fetch wrapper.`,entry:`src/web/api.ts`,owner:`@acme/web-team`,health:`~1 file in this PR`,explain:`Talks to the API and transparently refreshes on a 401, so a short token TTL is invisible to users. The retry/refresh logic lives in the fetch wrapper.`,startHere:[`src/web/api.ts`],depends:[`src/api`],usedBy:[]},{id:`mig`,name:`migrations`,purpose:`Schema changes, run in order.`,entry:`migrations/0042.sql`,owner:`@acme/data-team`,health:`SQL files`,explain:`Plain SQL migrations applied in sequence. Schema changes on big tables use expand/contract — add nullable, backfill, then tighten — to avoid a write lock.`,startHere:[`migrations/0042.sql`],depends:[],usedBy:[`src/auth`]}],onboarding:{firstWeek:[{team:`AUTH`,title:`How a token is verified`,sub:`The heart of the service.`,file:`src/auth/token.ts`},{team:`API`,title:`The guard`,sub:`How every route is protected.`,file:`src/api/guard.ts`},{team:`AUTH`,title:`Rotation`,sub:`How short tokens stay usable.`,file:`src/auth/refresh.ts`},{team:`WEB`,title:`The client`,sub:`How a 401 becomes a refresh.`,file:`src/web/api.ts`}],requestLife:[`src/api/guard.ts`,`src/auth/token.ts`,`route handler`,`src/web/api.ts (on 401 → refresh)`]},courses:[{title:`Get oriented`,subtitle:`Run it, read the shape, find the front door.`,level:`beginner`,lessons:[{title:`The big picture`,minutes:15,goal:`Know what auth-service does and how its four areas fit together.`,explainFor:{newgrad:`auth-service is the part of the system that answers “who is this request, and are they allowed?”. It has four areas: src/auth (makes and checks tokens), src/api (the routes, with a guard in front of them), src/web (the browser client), and migrations (database changes). A “token” is just a signed string the client sends to prove who it is. Start in src/auth/token.ts — that’s where a token is created and checked.`,working:`Four areas: src/auth owns token mint/verify/rotation, src/api is the HTTP surface fronted by a guard that calls into auth, src/web is the client, migrations are the schema. The dependency arrow runs api → auth → migrations. token.ts is the centre of gravity.`,principal:`Single service, four areas, one inbound trust boundary: the guard in src/api delegates all verification to src/auth. Everything else (rotation, the migration, the client retry) hangs off that one boundary — so a change to validateToken’s contract is a change to the whole surface.`},read:[`README.md`,`src/auth/token.ts`],concepts:[`Access vs refresh tokens`,`The guard → module → response shape`],checkpoint:{question:`Name the four areas and what each is for.`,answer:`src/auth — tokens, sessions, rotation; src/api — HTTP routes + the auth guard; src/web — the browser client + fetch wrapper; migrations — ordered SQL schema changes.`}},{title:`Follow a request`,minutes:20,goal:`Trace one request from the guard to a response.`,explainFor:{newgrad:`Every protected request hits the guard first (src/api/guard.ts). The guard takes the token off the request and calls validateToken (in src/auth/token.ts). If the token is good, the real route runs; if not, the request is rejected before anything else happens. Read guard.ts top-to-bottom, then jump to validateToken to see what “good” means.`,working:`guard.ts pulls the bearer token, awaits validateToken, and short-circuits on failure. validateToken decodes + checks signature/expiry/audience. The route handler only runs past the guard. This is the one choke point worth knowing cold.`,principal:`The guard is the only place verification happens — there’s no second check downstream. That’s good (one place to reason about) and risky (one place to get wrong): a guard that fails open, or calls validateToken incorrectly, exposes every route at once.`},read:[`src/api/guard.ts`,`src/auth/token.ts`],concepts:[`How the guard verifies a token`,`Where validateToken is called`],caution:`The guard is the ONLY place a token is verified — there is no second check downstream. That makes it easy to reason about, but it also means a guard that fails open, or calls validateToken wrong, exposes every protected route at once. Treat any change to guard.ts as a change to the whole surface.`,checkpoint:{question:`Where would a bad token be rejected?`,answer:`In src/api/guard.ts — it awaits validateToken and returns/throws before the route handler runs, so a bad token never reaches your code.`}}],quiz:[{question:`Which single file verifies every protected request?`,answer:`src/api/guard.ts — it reads the bearer token and awaits validateToken first.`},{question:`Access token vs refresh token — what is each for?`,answer:`The access token is short-lived and sent on every request; the refresh token is long-lived and exchanged for a fresh access token when it expires.`},{question:`If a token fails validation, where does the request stop?`,answer:`At the guard — the route handler never runs, so bad tokens never reach app code.`}]},{title:`Build a feature`,subtitle:`The token lifecycle, a guarded route, and the test for it.`,level:`intermediate`,lessons:[{title:`The token lifecycle`,minutes:25,goal:`Understand minting, verifying, and rotating a token.`,explainFor:{newgrad:`A token is created (“minted”) when you log in, checked (“verified”) on every request, and — new in this change — “rotated”: each time you use a refresh token, you get a brand-new one and the old one stops working. That’s what lets the short 15-minute token be safe: if one leaks, it’s useless in minutes. See mint/verify in token.ts and the new rotateRefresh in refresh.ts.`,working:`mint() issues access+refresh; validateToken(t, opts) checks them with a clock/audience; rotateRefresh() mints a new refresh and revokes the old (single-use). opts exists so verification can tolerate clock skew and pin an audience — which is why the signature had to change.`,principal:`Rotation makes refresh tokens single-use, which bounds replay to one window — but only if mint+revoke is atomic. The opts arg is the real API change: it’s optional, so every caller still compiles while silently passing undefined. That’s the trap this whole PR turns on.`},read:[`src/auth/token.ts`,`src/auth/refresh.ts`,`src/auth/session.ts`],concepts:[`Rotation: mint then revoke`,`Why opts (clock/audience) exists`],caution:`validateToken’s new opts arg is OPTIONAL, so every existing caller still compiles while silently passing undefined — then throws at runtime. The cause-and-effect: a “safe-looking” signature change becomes a prod 500 because the type system never flags the gap. Make opts required if you want the compiler to catch the missing callers.`,checkpoint:{question:`Why must a caller pass VerifyOpts now?`,answer:`validateToken(t, opts) uses opts for clock-skew tolerance and audience pinning. opts is optional so old callers still compile — but they pass undefined and fail at runtime, which is exactly the bug in guard.ts.`}},{title:`Add a guarded route`,minutes:25,goal:`Wire a new protected endpoint through the guard.`,explainFor:{newgrad:`To add a protected endpoint, you put it behind the guard and let the guard do the token check for you — you don’t verify tokens yourself. The one thing to get right: the guard now calls validateToken with an extra argument (opts). Copy the correct call; don’t call validateToken the old one-argument way.`,working:`Mount the route behind guard.ts; the guard awaits validateToken(tok, opts) and your handler runs only on success. The current guard.ts:21 calls it without opts — copy the new signature, don’t the broken line.`,principal:`The guard is shared, so getting the call wrong breaks every route, not just yours. Prefer making opts required at the type level so the compiler catches a missing caller instead of a runtime TypeError in prod.`},read:[`src/api/guard.ts`,`src/api/routes`],concepts:[`async guard`,`Calling validateToken correctly`],checkpoint:{question:`What breaks if you forget the opts argument?`,answer:`validateToken throws at runtime (a TypeError) on the first request — and because the guard fronts every protected route, all of them 500 at once. The build won’t catch it because opts is optional.`}},{title:`Cover it with a test`,minutes:20,goal:`Add a test that exercises the new path.`,explainFor:{newgrad:`A test runs your code with fake inputs and checks the result, so a future change can’t silently break it. The existing tests cover rotation but NOT the guard or the reaper — the two paths this change actually breaks. Add a test that calls the guard with the new token shape.`,working:`tests/refresh.test.ts covers rotateRefresh’s happy path. The guard and reaper paths are uncovered — add a guard test that asserts validateToken is called with opts and rejects a bad token.`,principal:`The coverage gap is exactly on the risky paths (guard, reaper). A test there is the cheapest insurance against the runtime break; without it, the first signal is a 500 in prod, not a red CI.`},read:[`tests/refresh.test.ts`],concepts:[`Testing the rotation happy path`,`The untested guard/reaper paths`],checkpoint:{question:`Which changed paths still have no test?`,answer:`The route guard (src/api/guard.ts) and the token reaper (src/jobs/reaper.ts) — both changed by this PR, neither covered.`}}],quiz:[{question:`What does rotateRefresh() do, and why does it make a 15-minute token safe?`,answer:`It mints a new refresh token and revokes the old one (single-use), so a leaked token is useless within one short window.`},{question:`Why does old code that calls validateToken(t) still compile but break?`,answer:`The new opts argument is optional, so callers compile passing undefined — then throw a runtime TypeError on the first request.`},{question:`Where do you wire a new protected route, and what must you copy?`,answer:`Behind src/api/guard.ts; copy the new validateToken(tok, opts) call — not the old one-argument line.`}]},{title:`Go deep`,subtitle:`The design, the failure modes, the migration strategy.`,level:`expert`,lessons:[{title:`Rotation atomicity`,minutes:30,goal:`See why mint-then-revoke can race, and how to make it safe.`,explainFor:{newgrad:`rotateRefresh does two separate database writes: it creates a new token, then deletes the old one. If two requests for the same session arrive at almost the same time, both can create a new token before either deletes the old — leaving two valid tokens and breaking the “single-use” promise. The fix is to do both writes together so they can’t interleave.`,working:`mint() then revoke() are two writes with a gap. Concurrent refreshes on one session can both mint before either revokes — orphaning a token and defeating single-use rotation. Wrap them in one transaction or take a row lock on session.id.`,principal:`It’s a classic read-modify-write race on a hot row. Under real concurrency it WILL happen; the blast is silent (an extra live token, not an error). Options: one transaction, a SELECT … FOR UPDATE on the session, or a version column + compare-and-swap. The token_version column this migration adds is the hook for the CAS approach.`},read:[`src/auth/refresh.ts`,`src/auth/session.ts`],concepts:[`Non-atomic writes`,`Row locks / single transaction`],caution:`This race is SILENT — the blast is an extra valid token, not an error or a log line — so it never shows up in testing and only bites under real concurrency, where it WILL happen. Don’t ship rotation without making mint+revoke atomic (one transaction, SELECT … FOR UPDATE, or the token_version CAS this migration sets up).`,checkpoint:{question:`Sketch two concurrent refreshes that orphan a token.`,answer:`R1 mints T2; R2 (same session, overlapping) reads the old refresh and mints T3; R1 revokes the old; R2 revokes the old (already gone). Now T2 and T3 are both valid — single-use is broken.`}},{title:`The migration strategy`,minutes:25,goal:`Understand expand/contract and why a NOT NULL add is risky at scale.`,explainFor:{newgrad:`Adding a column that can’t be empty (NOT NULL) forces the database to fill in every existing row, which on a big table can lock it and block other writes for a while. The safe pattern is “expand/contract”: first add the column allowing empty values (instant), fill it in slowly in the background, then finally require it. The diff can’t tell you the table size — you have to check.`,working:`ALTER TABLE … ADD COLUMN NOT NULL DEFAULT rewrites every row under a lock. Expand/contract: add nullable (instant), backfill in batches off-peak, then SET NOT NULL (a fast validate). Confirm the real row count before running.`,principal:`The lock cost is a function of table size, which is NOT in the diff — so the honest read is “verify before running.” At scale, also watch replica lag during the backfill and prefer CREATE INDEX CONCURRENTLY (already used here) to avoid a build-time lock.`},read:[`migrations/0042.sql`],concepts:[`Table-rewrite locks`,`Expand → backfill → contract`],checkpoint:{question:`Why add the column nullable first?`,answer:`A nullable ADD COLUMN is a metadata-only change — instant, no row rewrite, no lock. You then backfill in batches and only tighten to NOT NULL once every row has a value, avoiding the table-rewrite lock.`}},{title:`Failure modes + the missing signal`,minutes:25,goal:`Find what would break on rollout and what you can’t see today.`,explainFor:{newgrad:`Two things can go wrong at deploy time. First, for ~15 minutes after shipping, tokens made the old way are still floating around — if the new code rejects them, users get logged out. Second, there’s no metric for “how often is refresh failing?”, so if something breaks, you’ll hear it from users, not a dashboard. Look at guard.ts and refresh.ts and notice there’s no counter being emitted.`,working:`v1/v2 overlap: in-flight old tokens are valid for one TTL window; if validateToken(v2) rejects the old shape, you get a self-inflicted 401 spike at rollout. And there’s no refresh_success/refresh_fail metric in the diff — no early-warning signal.`,principal:`Sequence the rollout to dual-accept claim shapes for one TTL window, then drop v1 behind a flag. The deeper gap is observability: changing the auth hot path with no new signal means MTTD is “user reports.” Ship the metric + alert before enabling, and decide explicitly whether the guard fails open or closed when validation is unavailable.`},read:[`src/api/guard.ts`,`src/auth/refresh.ts`],concepts:[`v1/v2 token overlap`,`No refresh-failure metric in the diff`],checkpoint:{question:`What metric would catch a bad rollout in seconds?`,answer:`A refresh-failure rate (refresh_fail / refresh_total) plus the guard’s 401/5xx rate, alerted on a threshold — so a spike shows on a dashboard immediately instead of arriving as support tickets.`}}],quiz:[{question:`Why can mint-then-revoke leave two valid refresh tokens?`,answer:`They are two writes with a gap; two concurrent refreshes on one session can both mint before either revokes. Make them atomic — one transaction or a row lock on session.id.`},{question:`Why add a NOT NULL column nullable-first on a large table?`,answer:`A NOT NULL add rewrites every row under a lock; expand/contract (add nullable → backfill in batches → SET NOT NULL) avoids the table-rewrite lock.`},{question:`What is the most dangerous thing the diff CAN’T show you here?`,answer:`There is no refresh-failure metric — changing the auth hot path with no signal means the first sign of a bad rollout is user reports, not a dashboard. Ship the metric + alert before enabling.`}]}],gate:{decision:`block`,shipSafe:!1,unackedP0:1,requires:[],deployOrder:`enforced`,conditions:[{id:`guard`,label:`route guard updated to the new signature`,status:`failed`,actor:`agent`},{id:`reaper`,label:`reaper migrated off parseLegacyJWT`,status:`pending`,actor:`agent`},{id:`mig`,label:`migration run as expand/contract in a window`,status:`pending`,actor:`human`},{id:`test`,label:`a test covers the guard path`,status:`pending`,actor:`human`}],rationale:`A breaking in-repo caller gates this change: src/api/guard.ts:21 calls validateToken the old way and throws at runtime, and the reaper imports a function this PR deletes. Fix both callers (and run the migration expand/contract) before merge.`},incident:{symptom:`5xx on every protected route after the auth deploy`,severity:`P0`,chain:[{label:`Every guarded route 500s`,context:`NOW · since the deploy`},{label:`src/api/guard.ts:21 calls validateToken the old way`,context:`in-repo caller`},{label:`src/auth/token.ts:42 changed validateToken’s signature`,context:`this PR`}],rootCause:`The new validateToken(opts) shipped while guard.ts still calls it without opts — a TypeError at runtime on every protected route. A missed in-repo caller, not bad logic.`,rollback:[`Revert the auth deploy (or hotfix guard.ts to pass the new opts).`,`Confirm protected routes return to 200 before standing down.`],whoToWake:[{name:`Owner of src/auth`,team:`src/auth`,why:`changed validateToken — check CODEOWNERS / git blame`},{name:`Owner of src/api`,team:`src/api`,why:`owns the guard that calls it`}],timeline:[{time:`deploy`,label:`auth-service #482 (short-lived tokens) goes out`},{time:`+1 min`,label:`guarded routes start returning 500`},{time:`now`,label:`Ripple traces it to the missed guard.ts caller`}],evidence:`Grounded in the diff + the in-repo caller search. Connect deploys/traces to confirm the exact deploy time.`},provenance:{source:`github`,example:!0,notes:[`A worked example of a GitHub-connected analysis — built from a PR’s diff, file contents, the in-repo callers a search finds, and CODEOWNERS for who owns what.`,`It shows only what GitHub gives us: no production traffic, no cross-repo services, no incident history — those need connectors Ripple doesn’t have.`,`Connect a repo or paste a diff to run Ripple on a real change.`]}};export{e as SEED_SHIP};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./chunk-BVpWp9h4.js";import{n as t}from"./http-CJCtjYpA.js";import{t as n}from"./providers-wzm7E8Pa.js";import{n as r,t as i}from"./contentVault-DzTYWcbD.js";function a(e,t){let n=0;for(let r=0;r<e.length;r++)n+=e[r]*t[r];return n}function o(e){return e!=null&&a(e,e)>1e-6}function s(e,t){let n=[],r=null;for(let i=0;i<e.length;i++){let s=t?.[i]??null,c=o(s),l;if(i===0)l=!0;else if(!c||r===null)l=e[i].mode===`replace`;else{let t=Math.sqrt(a(r,r)),n=t>0?a(s,r)/t:0;l=n<.16?!0:n<.4?e[i].mode===`replace`:!1}if(n.push(l),l)r=c?Float32Array.from(s):null;else if(c)if(r===null)r=Float32Array.from(s);else for(let e=0;e<s.length;e++)r[e]+=s[e]}return n}var c=null,l=!1,u=!1,d=0,f=new Map;function p(){if(!(c||u)){if(typeof Worker>`u`){u=!0;return}try{c=new Worker(new URL(`/assets/worker-BbLKfGzm.js`,``+import.meta.url),{type:`module`}),c.onmessage=e=>{let t=e.data;if(t.type===`ready`)l=!0;else if(t.type===`error`)u=!0,m();else if(t.type===`result`){let e=f.get(t.id);f.delete(t.id),e?.kind===`fit`&&e.resolve(t.fits)}else if(t.type===`embedded`){let e=f.get(t.id);f.delete(t.id),e?.kind===`embed`&&e.resolve(t.vec.length?t.vec:null)}},c.onerror=()=>{u=!0,m()},c.postMessage({type:`init`,base:g,modelId:te})}catch{u=!0}}}function m(){for(let e of f.values())e.resolve(null);f.clear();try{c?.terminate()}catch{}c=null,l=!1}function h(e,t=80){if(p(),!l||!c)return Promise.resolve(null);let n=++d;return new Promise(r=>{let i=setTimeout(()=>{f.delete(n),r(null)},t);f.set(n,{kind:`fit`,resolve:e=>{clearTimeout(i),r(e?new Map(e):null)}}),c.postMessage({type:`fit`,id:n,query:e})})}function ee(e,t=80){if(p(),!l||!c)return Promise.resolve(null);let n=++d;return new Promise(r=>{let i=setTimeout(()=>{f.delete(n),r(null)},t);f.set(n,{kind:`embed`,resolve:e=>{clearTimeout(i),r(e)}}),c.postMessage({type:`embed`,id:n,text:e})})}var te=`minishlab/potion-base-8M`,g=`/semantic/`,ne=new Set(`the.a.an.and.or.but.of.to.in.on.for.is.are.was.were.be.been.am.as.at.by.it.its.this.that.these.those.with.your.you.my.mine.me.we.us.our.they.them.their.he.she.his.her.do.does.did.has.have.had.will.would.can.could.should.about.from.into.if.then.so.than.too.very.just.also.what.when.where.who.why.how.which.not.no.yes.up.out.over`.split(`.`));function re(e){return(e.toLowerCase().match(/[a-z0-9]+/g)??[]).filter(e=>e.length>=2&&!ne.has(e))}function _(e){return new Set(re(e))}function ie(e,t){if(!e.size||!t.size)return 0;let n=0;for(let r of e)t.has(r)&&(n+=1);return n/(e.size+t.size-n)}function v(e,t){if(!e.size)return 0;let n=0;for(let r of e)t.has(r)&&(n+=1);return n/e.size}var y=`mavea-live-memory-v3`,ae=`mavea-live-memory-v2`,oe=`mavea-live-memory-v1`,b=`mavea-live-memory`,x=50,S=20,C=400,w=200,T=/^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)*$/,se=.5,E={"model-inferred":0,"web-grounded":1,"ink-correction":2,"user-stated":3,"user-edit":3},ce=new Set([`user-stated`,`user-edit`,`ink-correction`,`web-grounded`]);function le(e){return ce.has(e??`model-inferred`)}function ue(e,t){return E[t]>E[e]?t:e}var D={nodes:[],updatedAt:0},O=null,k=0;function A(){try{let e=globalThis.crypto;if(e?.randomUUID)return e.randomUUID()}catch{}return k+=1,`mn-${k.toString(36)}-${Math.floor(Math.random()*1e9).toString(36)}`}function j(e){return e.replace(/\s+/g,` `).trim().slice(0,C)}function M(e){return e.toLowerCase().trim().replace(/\s+/g,`.`)}var de=new Set(Object.keys(E));function N(e){return typeof e==`string`&&de.has(e)}function P(e){if(!Array.isArray(e))return;let t=e.filter(e=>typeof e==`string`&&e.length>0).slice(0,12);return t.length?t:void 0}function fe(e){return e===`tight`||e===`standard`||e===`deep`}function F(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}function I(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.concept==`string`?M(t.concept):``;if(!n||!T.test(n))return null;let r=typeof t.body==`string`?j(t.body):``;return r?{id:typeof t.id==`string`&&t.id?t.id:A(),concept:n,body:r,updatedAt:typeof t.updatedAt==`number`&&Number.isFinite(t.updatedAt)?t.updatedAt:0,kind:t.kind===`procedural`?`procedural`:`semantic`,source:N(t.source)?t.source:`model-inferred`,state:t.state===`archived`?`archived`:`active`,prevBody:typeof t.prevBody==`string`?j(t.prevBody):void 0,turnId:typeof t.turnId==`string`?t.turnId:void 0,quote:typeof t.quote==`string`?t.quote.replace(/\s+/g,` `).trim().slice(0,w):void 0,uses:F(t.uses)??0,prefer:P(t.prefer),avoid:P(t.avoid),depth:fe(t.depth)?t.depth:void 0,verify:typeof t.verify==`boolean`?t.verify:void 0,wins:F(t.wins),losses:F(t.losses)}:null}function L(){try{if(typeof localStorage>`u`)return null;let e=localStorage.getItem(oe);if(!e)return null;let t=JSON.parse(e),n=Array.isArray(t.facts)?t.facts.map(e=>{if(e&&typeof e==`object`){let t=e;return typeof t.text==`string`?t.text.trim():``}return``}).filter(e=>e.length>0):[];if(!n.length)return null;let r=I({concept:`profile`,body:n.join(`. `),source:`model-inferred`});return r?{nodes:[r],updatedAt:0}:null}catch{return null}}function R(){try{if(typeof localStorage>`u`)return null;let e=localStorage.getItem(ae);if(!e)return null;let t=JSON.parse(e),n=Array.isArray(t.nodes)?t.nodes.map(I).filter(e=>e!==null):[];return n.length?{nodes:n.slice(-50),updatedAt:typeof t.updatedAt==`number`?t.updatedAt:0}:null}catch{return null}}var z=!1,B=0;function V(e){let t=e??{};return{nodes:(Array.isArray(t.nodes)?t.nodes.map(I).filter(e=>e!==null):[]).slice(-50),updatedAt:typeof t.updatedAt==`number`?t.updatedAt:0}}async function H(e){let t=++B;try{if(typeof localStorage>`u`)return;let n=await r(e);if(t!==B)return;localStorage.setItem(y,n)}catch{}}function pe(){try{if(typeof localStorage>`u`)return{...D};let e=localStorage.getItem(y);if(!e)return R()??L()??{...D};let t=V(JSON.parse(e));return t.nodes.length&&H(t),t}catch{return{...D}}}async function me(){try{if(typeof localStorage>`u`)return;let e=localStorage.getItem(y);if(!e)return;try{JSON.parse(e);return}catch{}let t=V(await i(e));if(z)return;O=t,z=!0,typeof window<`u`&&typeof CustomEvent==`function`&&window.dispatchEvent(new CustomEvent(b,{detail:{nodes:t.nodes,changed:[]}}))}catch{}}me();function U(){return O||(O=pe(),O)}function W(e,t){O=e,z=!0,H(e);try{typeof window<`u`&&typeof CustomEvent==`function`&&window.dispatchEvent(new CustomEvent(b,{detail:{nodes:e.nodes,changed:t}}))}catch{}}function G(e){if(e.length<=x)return e;let t=(e,t)=>t.updatedAt-e.updatedAt,n=e.filter(e=>e.kind===`procedural`).sort(t),r=e.filter(e=>e.kind!==`procedural`).sort(t),i=n.slice(0,S),a=r.slice(0,x-i.length),o=Math.max(0,x-i.length-a.length),s=n.slice(S,S+o);return[...i,...s,...a]}function he(){return[...U().nodes].sort((e,t)=>t.updatedAt-e.updatedAt)}function ge(e){let t=e.map(I).filter(e=>e!==null);if(!t.length)return 0;let n=new Map(U().nodes.map(e=>[e.id,e]));for(let e of t){let t=n.get(e.id);(!t||e.updatedAt>=t.updatedAt)&&n.set(e.id,e)}return W({nodes:G([...n.values()]),updatedAt:Date.now()},t),t.length}function _e(e,t={}){let n=U(),r=t.now??Date.now(),i=[],a=!1,o=[...n.nodes];for(let t of e){let e=M(t.concept);if(!e||!T.test(e))continue;let n=j(t.body),s=N(t.source)?t.source:`model-inferred`,c=t.kind===`procedural`?`procedural`:`semantic`,l=t.quote?t.quote.replace(/\s+/g,` `).trim().slice(0,w):void 0,u=o.findIndex(t=>t.concept===e&&t.state!==`archived`);if(u<0){if(!n)continue;let u={id:A(),concept:e,body:n,updatedAt:r,kind:c,source:s,state:`active`,turnId:t.turnId,quote:l,uses:0,prefer:t.prefer,avoid:t.avoid,depth:t.depth,verify:t.verify,wins:t.outcome===`win`?1:void 0,losses:t.outcome===`loss`?1:void 0};o.push(u),i.push(u),a=!0;continue}let d=o[u],f={...d},p=!1,m=!1;c===`procedural`&&f.kind!==`procedural`&&(f.kind=`procedural`,m=!0),t.prefer&&(f.prefer=Array.from(new Set([...d.prefer??[],...t.prefer])).slice(0,12),m=!0),t.avoid&&(f.avoid=Array.from(new Set([...d.avoid??[],...t.avoid])).slice(0,12),m=!0),t.depth&&t.depth!==d.depth&&(f.depth=t.depth,m=!0),typeof t.verify==`boolean`&&t.verify!==d.verify&&(f.verify=t.verify,m=!0),t.outcome===`win`?(f.wins=(d.wins??0)+1,m=!0):t.outcome===`loss`&&(f.losses=(d.losses??0)+1,m=!0),n&&n!==d.body&&(ie(_(d.body),_(n))>=se?f.uses=(d.uses??0)+1:(f.prevBody=d.body,f.uses=0),f.body=n,l&&(f.quote=l),t.turnId&&(f.turnId=t.turnId),p=!0,m=!0);let h=ue(d.source??`model-inferred`,s);h!==(d.source??`model-inferred`)&&(f.source=h,m=!0),m&&(f.updatedAt=r,o[u]=f,a=!0,p&&i.push(f))}return a?(o=G(o),W({nodes:o,updatedAt:r},i),i):[]}function ve(e,t){let n=U(),r=j(t);if(!r)return;let i=!1,a=n.nodes.map(t=>t.id===e?(i=!0,{...t,prevBody:t.body===r?t.prevBody:t.body,body:r,source:`user-edit`,updatedAt:Date.now()}):t);i&&W({nodes:a,updatedAt:Date.now()},[])}function ye(e){let t=U(),n=t.nodes.filter(t=>t.id!==e);n.length!==t.nodes.length&&W({nodes:n,updatedAt:Date.now()},[])}function be(){W({nodes:[],updatedAt:Date.now()},[])}var xe=/\b(poems?|haikus?|limericks?|sonnets?|ballads?|rhymes?|riddles?|puns?|jokes?|knock[- ]?knock|tongue[- ]?twisters?|lullab(?:y|ies)|raps?)\b/i,Se=/\b(write|compose|make(?:\s+me|\s+up)?|tell(?:\s+me)?\s+(?:a|an)|sing|invent|create|generate|come up with)\b[^.?!]{0,40}\b(story|stories|song|lyrics?|tale|fable|fiction|script|screenplay|verse|jingle)\b/i;function Ce(e){let t=e.toLowerCase();return xe.test(t)||Se.test(t)}var we=e=>!Ce(e),Te=/\b(just (?:tell me|give me|the answer)|in one line|one[- ]liner|in a (?:sentence|word|line)|in a few words|brief(?:ly)?|tl;?dr|short (?:version|answer)|keep it (?:short|brief)|quick (?:answer|version|recap|rundown|summary)|in short|the short version|bottom line|in a nutshell|the gist)\b/,Ee=/\b(tell me about|explain|overview|how (?:do|does|to|can|is|are|did|would|should)|why|guide|walk\s?(?:me\s)?through|break\s?down|breakdown|deep\s?dive|everything|compare|comparison|versus|vs\.?|pros and cons|plan|itinerary|roadmap|review|analy[sz]e|dashboard|trends?|history of|all about|summary of)\b/,K=/\b(teach (?:me|us)|help me (?:understand|learn|grasp|wrap my head around)|walk me through|crash course|get (?:me |us )?up to speed|bring me up to speed|from scratch|(?:the )?(?:basics|fundamentals|essentials|core concepts|key concepts) of|study (?:for|guide|plan)|prep(?:are)? (?:me |us )?for (?:my |an? |the |our )?(?:\w+ )?(?:interview|exam|test|quiz|midterm|final|cert\w*)|(?:interview|exam) prep|tutorial|lesson on|learn (?:about |how )?[a-z]+)\b/,De=[/^[\s\d().,+\-*/^%×÷=]+\??$/,/\bwhat(?:'s| is| are| was)?\s*[\d().,\s+\-*/^%×÷]+\s*\??$/,/\b(calculate|compute|solve)\b/,/\b\d+(?:\.\d+)?\s*%\s*of\s+\d/,/\bconvert\b/,/\bhow many\s+\w+\s+(?:in|are in|per)\b/,/\b\d+\s*[a-z]+\s+(?:in|to)\s+[a-z]+\b/,/\b(define|definition of)\b/,/\bwhat does\s+.+\s+mean\b/,/\bcapital of\b/];function Oe(e){let t=e.toLowerCase().trim();if(!t)return`rich`;let n=Te.test(t);return K.test(t)||Ee.test(t)?n?`brief`:`rich`:De.some(e=>e.test(t))?`lean`:n?`brief`:`rich`}function ke(e){return K.test(e.toLowerCase())}var Ae=/\b(deriv\w*|prove|proof|theorem|integral|derivative|equation|algebra|calculus|optimi[sz]e|trade-?offs?|step[-\s]?by[-\s]?step|reason\w* through|figure out|work out|why (?:does|is|are|do)|analy[sz]e|compare\b.*\bvs\b|root cause|debug|diagnose|strategy|plan\b.*\b(?:budget|trip|itinerary|migration))\b/;function q(e){return Ae.test(e.toLowerCase())}function je(e,t){return e===`lean`?`minimal`:t?`low`:`minimal`}var J=[`minimal`,`low`,`medium`,`high`];function Me(e,t){let n=J.indexOf(e);return J[Math.min(J.length-1,Math.max(0,n+t))]}function Ne(e,t,n=`fast`){let r=q(t);return e===`lean`&&!r?`minimal`:Me(je(e,r),n===`thorough`?2:+(n===`balanced`))}var Pe=.1,Fe=.3,Ie=.75;function Le(e,t,n){return t.creative?Ie:e===`lean`||q(n)||t.troubleshoot?Pe:Fe}var Y=140,X=320;function Re(e,t){if(e.length<=t)return e;let n=e.slice(0,t-1),r=[...n.matchAll(/[.!?](?=\s|$)/g)].at(-1);if(r&&r.index!==void 0&&r.index>t*.3)return n.slice(0,r.index+1);let i=n.lastIndexOf(` `);return(i>t*.6?n.slice(0,i):n).trimEnd()+`…`}function ze(e,t){let n=t===`lean`||t===`brief`?Y:X;return Re(e.trim(),n)}function Z(e){return e===`lean`||e===`brief`?Y:X}var Be=`OUTPUT ORDER — emit the "narration" field FIRST in the JSON, before "title", "sub", and "blocks", and write it as complete sentences. It is spoken aloud the moment it streams, so it must lead.`;function Ve(e){return e===`lean`||e===`brief`?`SPOKEN LINE ("narration") — keep it to ONE short sentence (≈${Z(e)} characters). Right to the point.`:`SPOKEN LINE ("narration") — at most two or three short sentences (≈${Z(`rich`)} characters), like a person talking. The visuals carry the detail; never narrate the whole canvas.`}var He=e({checkLiveReady:()=>Q}),Ue=2500;async function Q(e,r={}){let i=n(e.provider).probe(e).catch(()=>({ok:!1,model:!1})),a=r.tts===!1?Promise.resolve(!1):(async()=>{try{return(await t(`/tts/health`,{method:`GET`},Ue)).ok}catch{return!1}})(),[{ok:o,model:s,statusCode:c},l]=await Promise.all([i,a]);return{llm:o,tts:l,model:s,statusCode:c}}var We=[{key:`decision`,test:/\b(should i|should we|worth it|is it worth|which (?:one|should|is better)|do i (?:need|have to)|ought i|better to|or should i)\b/},{key:`comparison`,test:/\b(vs\.?|versus|compare\w*|comparison|pros and cons|trade-?offs?|better than|which is better)\b/},{key:`risk`,test:/\b(risk\w*|danger\w*|downside|what could go wrong|threat\w*|is it safe|safe to|consequenc\w*|backfire|red flags?|pitfalls?)\b/},{key:`planning`,test:/\b(roadmap|schedule|timeline|milestone\w*|strateg\w*|prepare for|get ready|launch|plan (?:to|for|a|my|out)|over the next \d+|in \d+ (?:weeks?|months?|days?))\b/},{key:`troubleshoot`,test:/\b(troubleshoot|debug|not working|isn'?t working|won'?t \w+|broken|\berror\b|\bbug\b|fix\b|stopped working|fail(?:s|ing|ed)?|why (?:is|does|won'?t|isn'?t|can'?t))\b/},{key:`learning`,test:/\b(explain|how does|how do .* work|what is|what are|teach me|help me understand|learn\b|tell me about|why does|the difference between|concept of|crash course|walk me through|for (?:my|an?|the|our) (?:\w+ )?(?:interview|exam|test|midterm|final)|study for)\b/},{key:`creative`,test:/\b(brainstorm|ideas? for|come up with|imagine|invent|design a|creative|name (?:my|a|some|ideas)|suggest (?:some )?\w+ (?:names|ideas))\b/},{key:`whatIf`,test:/\b(what (?:if|happens if|would happen)|if i (?:do|don'?t|take|stay|leave|wait)|either way|both (?:paths|options|ways)|play(?:ed)? out|scenario\w*|down the road|in (?:each|both) cases?|stay or (?:go|leave|take)|futures?\b)\b/},{key:`reflection`,test:/\b(my (?:friend|partner|relationship|boyfriend|girlfriend|marriage|spouse|boss|family|mom|dad|kid)|feel(?:ing)?\b|emotionally|am i (?:wrong|right|overreacting|the problem)|should i feel|drain(?:s|ing|ed)?|toxic|healthy (?:relationship|friendship)|cope\b|burn(?:t|ed)?\s?out|overwhelm\w*|anxious|lonely)\b/},{key:`highStakes`,test:/\b(quit (?:my|the|this) (?:job|career)|get married|getting married|divorce|buy a (?:house|home)|mortgage|life savings|career change|drop out|move (?:abroad|across|countr|to another)|surgery|diagnos\w*|lawsuit|\bsue\b|custody|life-?changing)\b/},{key:`serious`,test:/\b(grief|grieving|death|dying|depress\w*|suicid\w*|self-?harm|abuse|trauma|addiction|crisis|terminal|miscarriage)\b/}],Ge=[{domain:`health`,test:/\b(health\w*|symptom\w*|doctor|medic\w*|diagnos\w*|disease|surgery|mental health|therap\w*|depress\w*|anxiety)\b/},{domain:`legal`,test:/\b(legal|lawyer|attorney|lawsuit|\bsue\b|court|custody|rights\b|contract\b)\b/},{domain:`money`,test:/\b(money|budget|invest\w*|savings|\bdebt\b|loan|mortgage|finance\w*|retire\w*|taxe?s?\b|salary)\b/},{domain:`career`,test:/\b(job\b|career|\bwork\b|boss|promotion|freelanc\w*|resume|interview|fired|laid off|quit)\b/},{domain:`relationship`,test:/\b(relationship|friend\w*|partner|boyfriend|girlfriend|marriage|spouse|dating|breakup|family)\b/},{domain:`travel`,test:/\b(travel|trip|vacation|flight|hotel|itinerary|destination|visit\b)\b/},{domain:`tech`,test:/\b(code|coding|software|\bapp\b|\bapi\b|database|server|deploy|programming|website|algorithm)\b/},{domain:`learning`,test:/\b(study|course|exam|tutorial|homework|\bclass\b|lesson|curriculum)\b/}];function Ke(e){if(!e)return``;for(let t=e.length-1;t>=0;t--)if(e[t].role===`user`)return e[t].content;return``}function qe(e,t){let n=e.toLowerCase(),r=Ke(t).toLowerCase(),i=r?`${n} ${r}`:n,a={decision:!1,comparison:!1,risk:!1,planning:!1,troubleshoot:!1,learning:!1,creative:!1,whatIf:!1,reflection:!1,highStakes:!1,serious:!1};for(let e of We)e.test.test(i)&&(a[e.key]=!0);(a.highStakes||a.reflection)&&(a.serious=!0);for(let e of Ge)if(e.test.test(i)){a.domain=e.domain;break}return a}function Je(e){let t=new Set;return e.decision&&t.add(`decide`),e.comparison&&(t.add(`compare`),t.add(`decide`)),e.risk&&t.add(`decide`),e.planning&&(t.add(`plan`),t.add(`howto`)),e.troubleshoot&&(t.add(`howto`),t.add(`explain`)),e.learning&&(t.add(`explain`),t.add(`reference`)),e.creative&&t.add(`draft`),e.whatIf&&t.add(`decide`),e.reflection&&(t.add(`reflect`),t.add(`comfort`)),[...t]}var $=[{shape:`composition`,weight:1,test:/\b(budget|allocat\w*|split|breakdown|where\s+(?:\w+\s+)?(?:my\s+|the\s+)?(?:money|time|spend\w*|budget)|(?:money|time|spend\w*)\s+goes?|portion|share|mix|composition|makeup|made up of|percent\w*|proportion|divid\w*)\b/},{shape:`series`,weight:1,test:/\b(trend\w*|over time|growth|history|historical|month\w*|week\w*|dai\w*|quarter\w*|year\w*|forecast|projection|trajectory|since|past \d+)\b/},{shape:`comparison`,weight:1,test:/\b(vs\.?|versus|compare\w*|comparison|better|which (?:one|should|is)|either|or should|pros and cons|trade-?offs?|options?|best|top \d+|worth it|should i (?:buy|get|pick|choose|use)|recommend\w*)\b/},{shape:`ranking`,weight:1,test:/\b(rank\w*|leaderboard|top \d+|best|worst|most|least|highest|lowest|fastest|biggest|smallest|standings)\b/},{shape:`status`,weight:1,test:/\b(progress|on track|readiness|ready|status|health\w*|complete\w*|how (?:far|close)|goal|target|score|rating|grade)\b/},{shape:`sequence`,weight:1,test:/\b(steps?|how (?:do|to)|process|guide|walk\s?through|plan|schedule|roadmap|sequence|order|first.*then|itinerary|timeline)\b/},{shape:`flow`,weight:.8,test:/\b(funnel|pipeline|workflow|conversion|stages?|flow|drop-?off|state\s?machine|feedback\s?loops?|decision\s?tree|control\s?flow)\b/},{shape:`geo`,weight:1,test:/\b(map|where is|near\w*|location|route|directions?|cities|country|countries|region|travel|trip|drive)\b/},{shape:`list`,weight:.8,test:/\b(list|tips?|checklist|things to|ways to|ideas|reasons|items|bullet\w*)\b/},{shape:`distribution`,weight:1,test:/\b(distribution|spread|histogram|range|variance|outliers?|percentile|frequency|how (?:often|spread))\b/},{shape:`relationship`,weight:1,test:/\b(correlat\w*|relationship between|scatter|vs.*axis|impact of|affect\w*|driver\w*)\b/},{shape:`structure`,weight:1,test:/\b(molecul\w*|chemical structure|molecular structure|skeletal (?:formula|structure)|lewis structure|smiles|functional group|benzene)\b/},{shape:`tabular`,weight:.9,test:/\b(table|rows?|columns?|spreadsheet|records|dataset|grid of|matrix)\b/},{shape:`media`,weight:1,test:/\b(image\w*|photos?|gallery|pictures?|visual\w*|video|watch|before and after|screenshot)\b/},{shape:`text`,weight:.8,test:/\b(quote\w*|testimonial\w*|said|opinions?|reviews?|feedback|explain|defin\w*|definition|what is|tell me about|meaning of|translate\w*|vocabulary)\b/},{shape:`code`,weight:1.1,test:/\b(code|coding|programming|software|function|algorithm\w*|recursi\w*|data structures?|linked lists?|binary (?:tree|search)|hash\s?(?:map|table)|big-?o|time complexity|syntax|compil\w*|debug\w*|refactor\w*|regex|sql|snippet|pseudo\s?code|api)\b/},{shape:`scalar`,weight:.7,test:/\b(how (?:many|much)|number of|total|count|metric|stat\w*|kpi|figure)\b/},{shape:`keyvalue`,weight:.7,test:/\b(stats|metrics|numbers|key figures|at a glance|summary of|overview)\b/},{shape:`selection`,weight:.9,test:/\b(choose|pick|select|decide|configure|settings|sign\s?up|form|filter|adjust|set up)\b/},{shape:`hierarchy`,weight:.9,test:/\b(hierarch\w*|tree|nested|org\s?chart|structure of|breakdown of .* into|parent|sub-?categor\w*)\b/}],Ye=[{test:/\b(pdf|white\s?paper|the paper|the document|the report|the contract|the article|the spec|the manual|the filing|the brief|full text|read (?:it|the\b))\b/,types:[`pdfreader`,`docview`]},{test:/\b(images?|photos?|pictures?|gallery|pics?|snapshots?)\b/,types:[`gallery`]},{test:/\b(maps?|where is|located|directions?|on a map|near (?:the|downtown|campus)|walking distance|walkable|nearby|neighborhood|what'?s around|close to (?:downtown|the))\b/,types:[`geomap`]},{test:/\b(code|snippet|implementation|source code|pseudo\s?code)\b/,types:[`codeblock`]},{test:/\b(dialogue\w*|a scene\b|conversation between|exchange between|speakers?|write a (?:script|scene|transcript))\b/,types:[`dialogue`]},{test:/\b(defin\w*|etymology\b|what does .{1,30} mean|look up\b|vocabulary\b|word for\b)\b/,types:[`dictionary`]},{test:/\b(variant\w*|alternativ\w*|\d+ (?:version\w*|option\w*|draft\w*)|rewrit\w*|different (?:tone\w*|style\w*|version\w*))\b/,types:[`variants`]},{test:/\b(translat\w+|in (?:french|spanish|japanese|german|chinese|portuguese|italian|korean|arabic|russian|hindi|dutch|swedish|polish|turkish|vietnamese|thai|hebrew|greek|latin)|from (?:english|spanish|french|japanese|german|chinese) (?:to|into))\b/,types:[`translation`]},{test:/\b(rank (?:the )?top \d+|top \d+ (?:ranked|ranking)|leaderboard\b|ranked list\b|best \d+ .{1,30} rank\w*)\b/,types:[`bracketbar`]},{test:/\b(?:as|in|into) (?:a |an )?(?:data )?table\b|\b(?:make|build|draw|create|show|give|put|render|format)\b(?:[\w\s]{0,12})?\btable\b|\btabular\b|\bspreadsheet\b/,types:[`datatable`]},{test:/\b(?:draw|make|show|give|create|build)\b(?:[\w\s]{0,12})?\b(?:flow\s?chart|flow\s?diagram|diagram)\b|\bdiagram (?:this|it|of|the)\b|\bflow\s?chart\b|\bas an? [\w\s]{0,20}?diagram\b|\bstate\s?machine\b/,types:[`diagramflow`]},{test:/\b(?:as|make|draw|show|give|build|on)\b(?:[\w\s]{0,12})?\btime\s?line\b|\btime\s?line of\b/,types:[`timeline`]},{test:/\bcheck\s?list\b/,types:[`checklist`]},{test:/\bstep[-\s]?by[-\s]?step\b|\b(?:numbered|ordered) steps\b|\bwalk me through (?:the )?steps\b/,types:[`howtosteps`,`checklist`]},{test:/\bcompare\b|\bcomparison\b|\b\w+ (?:vs\.?|versus) \w+\b|\bdifference between\b|\bside[-\s]?by[-\s]?side\b/,types:[`compare`]},{test:/\bquiz\b|\btest me on\b|\bpractice questions\b/,types:[`quiz`]},{test:/\bflash\s?cards?\b/,types:[`flashcard`]},{test:/\b(recipe\b|how to (?:make|cook|bake) |step\w*-?by\w*-?step .{0,20}(?:recipe|cook)|(?:dinner|lunch|breakfast|dessert|cookie|pasta|chicken|beef|vegan|gluten.free) recipe\b)\b/,types:[`recipecard`]},{test:/\b(workout plan|training plan|exercise plan|gym (?:program|plan|routine)|fitness (?:plan|program|routine)|sets? and reps?|push.?pull.?legs?|strength (?:program|plan)|build muscle (?:plan|program)|weekly (?:workout|training|gym) (?:plan|program|schedule))\b/,types:[`workoutplan`]},{test:/\b(macro(?:nutrient)?s?\b|(?:calorie|nutrition(?:al)?) (?:breakdown|facts?|info|content)|grams? of (?:protein|carbs?|fat)|protein.*carb\w*.*fat|caloric breakdown)\b/,types:[`macrobreakdown`]},{test:/\b(medication (?:schedule|reminder|timing)|dosing schedule|pill (?:schedule|reminder)|when (?:to|should i|do i) take .{0,30}(?:pill\w*|drug|medication|meds?|tablet\w*|dose\w*)|what time .{0,20}(?:take|dose) .{0,20}(?:pill\w*|medication|meds?)|drug dosage (?:schedule|timing))\b/,types:[`medicationschedule`]},{test:/\b(chord diagram|guitar chord\b|(?:how to (?:play|finger)|fingering for) .{0,20}chord|barre chord|power chord|open chord|chord shape\w*)\b/,types:[`chorddiagram`]},{test:/\b((?:baby|child|toddler|infant) (?:milestone\w*|developmental? milestone\w*)|developmental? milestone\w*|\d+[- ]month[- ]old milestone\w*|\d+[- ]year[- ]old milestone\w*|when (?:should|do) (?:babies|kids|toddlers|infants)\b)\b/,types:[`developmentmilestone`]},{test:/\b(argument map\b|arguments? (?:for and against\b|supporting and opposing)|philosophical argument\b|claim(?:s?) (?:and|with) (?:evidence|support\w*|objection\w*)|debate the (?:claim|motion|topic)\b|case for and against\b)\b/,types:[`argumentmap`]},{test:/\b((?:soccer|football|basketball|baseball|tennis) (?:formation\b|lineup\b|position\w*|play diagram|tactic\w*)|4-3-3\b|4-4-2\b|3-5-2\b|4-2-3-1\b|3-4-3\b|defensive (?:shift\b|formation\b)|starting (?:eleven\b|xi\b|lineup\b))\b/,types:[`sportspitch`]},{test:/\b(floor\s?plan\b|room layout\b|apartment layout\b|(?:house|home|office) (?:layout\b|floor plan)|room arrangement\b|furniture layout\b)\b/,types:[`floorplan`]},{test:/\b(medical (?:history|timeline|chronolog\w*)|clinical (?:history|course|timeline)|patient (?:history|chronolog\w*)|diagnosis timeline\b|treatment (?:history|timeline)|symptom (?:progression|history|chronolog\w*))\b/,types:[`clinicaltimeline`]},{test:/\b(research (?:finding\w*|result\w*|summary|paper summary)|what (?:does|did) (?:the research|studies|the study|the science) (?:say|show|find|reveal)\b|scientific (?:consensus|evidence|finding\w*)|meta-?analysis\b|randomized (?:controlled )?trial\b|clinical (?:evidence|finding\w*|trial\w*))\b/,types:[`researchsummary`]},{test:/\b(hourly itinerary|hour.?by.?hour|itinerary (?:for|of)\b|trip itinerary|travel itinerary|daily itinerary|day.?by.?day (?:plan|schedule|itinerary)|morning (?:to|through) (?:evening|night)|full day (?:plan|schedule|itinerary)|schedule (?:for|of) (?:my |a |the )?(?:trip|day|visit))\b/,types:[`agenda`]}];function Xe(e){let t=e.toLowerCase(),n=[];for(let e of Ye)e.test.test(t)&&n.push(...e.types);return[...new Set(n)]}var Ze={datatable:`a data table`,diagramflow:`a flow diagram`,timeline:`a timeline`,codeblock:`a code block`,geomap:`a map`,gallery:`an image gallery`,pdfreader:`the document`,docview:`the document`,checklist:`a checklist`,howtosteps:`a step-by-step`,compare:`a side-by-side comparison`,quiz:`a quiz`,flashcard:`flashcards`,dictionary:`a definition`,recipecard:`a recipe`,dialogue:`a scripted dialogue`,variants:`variations`,translation:`a translation`,bracketbar:`a ranking`};function Qe(e){return Ze[e]??`a ${e}`}function $e(e){return e.length?`FORMAT REQUEST — the user explicitly asked for their answer in a specific FORM: ${[...new Set(e.map(Qe))].join(`, `)}. Make that the LEAD block (position 0 or 1), built fully and completely; the rest of the canvas supports it. Never answer in a different shape than the one they named.`:``}function et(e){if(!e)return``;for(let t=e.length-1;t>=0;t--)if(e[t].role===`user`)return e[t].content;return``}function tt(e,t){let n=e.toLowerCase(),r=et(t).toLowerCase(),i={};for(let e of $){let t=0;e.test.test(n)&&(t+=e.weight),r&&e.test.test(r)&&(t+=e.weight*.4),t>0&&(i[e.shape]=(i[e.shape]??0)+t)}return i}export{s as A,le as C,ee as D,_ as E,h as O,ge as S,v as T,b as _,Je as a,be as b,Be as c,Ve as d,Le as f,we as g,ke as h,qe as i,p as k,ze as l,Oe as m,tt as n,Q as o,Ne as p,$e as r,He as s,Xe as t,Z as u,ye as v,_e as w,he as x,ve as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={reasoning:{blurb:`Step-by-step reasoning with expandable detail.`,optional:[`icon`,`iconColor`,`conclusion`,`footer`],itemShapes:[{prop:`steps`,text:`label`,textAliases:[`name`,`title`,`step`]}]},toolcalls:{blurb:`Tool invocations with request/response payloads.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`calls`,text:`name`,textAliases:[`label`,`title`,`tool`]}],propHints:{"calls[].status":`'ok'|'error'|'pending'`}},agenttrace:{blurb:`Agent decision tree with scores and chosen branches.`,optional:[`icon`,`iconColor`,`footer`]},modelcompare:{blurb:`Compare responses from multiple models with diff highlight.`,optional:[`icon`,`iconColor`,`prompt`,`footer`],itemShapes:[{prop:`outputs`,text:`model`,textAliases:[`name`,`label`,`title`]}]},tokenstream:{blurb:`Token stream with confidence heatmap and alternatives.`,optional:[`icon`,`iconColor`,`prefix`,`footer`]},retrieval:{blurb:`Search/RAG retrieval results — ranked source chunks each with a relevance score, illustrating how a system retrieves context. Never for a generic ranked list of items — use leaderboard or list.`,optional:[`icon`,`iconColor`,`query`,`footer`],itemShapes:[{prop:`chunks`,text:`snippet`,textAliases:[`text`,`content`,`body`,`label`]}]},whatchanged:{blurb:`Before/after comparison with unified diff view.`,optional:[`icon`,`iconColor`,`beforeLabel`,`afterLabel`,`footer`],propHints:{"diff[].t":`'add'|'del'|'ctx'`}},routing:{blurb:`Routing decision with choice branches and scores.`,optional:[`icon`,`iconColor`,`query`,`classifier`,`footer`],itemShapes:[{prop:`choices`,text:`label`,textAliases:[`name`,`title`,`text`]}]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={embedmap:{blurb:`2D embedding scatter plot with cluster visualization.`,optional:[`icon`,`iconColor`,`footer`]},calibration:{blurb:`Calibration curve with predicted vs actual reliability.`,optional:[`icon`,`iconColor`,`color`,`ece`,`footer`]},httpexchange:{blurb:`HTTP request/response inspector — a sequence of exchanges, each a method badge, URL, status pill colored by class, latency, and optional request/response body preview.`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`exchanges`,text:`url`,textAliases:[`path`,`endpoint`,`name`]}],propHints:{"exchanges[].method":`'GET'|'POST'|'PUT'|'PATCH'|'DELETE'`,"exchanges[].status":`numeric HTTP status code, e.g. 200, 404, 503`}},trainingcurve:{blurb:`ML model training-curve panel: loss curves (train + validation) in the top panel and accuracy curves in the bottom, both against epoch index. Marks the best-val-loss epoch. Reveals overfitting when train and val curves diverge. Use for showing neural-network training progress, diagnosing overfitting/underfitting, comparing learning-rate schedules.`,optional:[`title`,`icon`,`iconColor`,`valLoss`,`trainAcc`,`valAcc`,`footer`],propHints:{epochs:`array of epoch indices (or auto 1..N if omitted)`,trainLoss:`training loss per epoch`,valLoss:`validation loss per epoch`,trainAcc:`training accuracy per epoch (0–1)`,valAcc:`validation accuracy per epoch (0–1)`}},treemap:{blurb:`Nested hierarchical data as proportional rectangles; shows part-to-whole at multiple levels.`,optional:[`icon`,`iconColor`,`unit`,`footer`]},sunburst:{blurb:`Radial hierarchy; nested rings show multiple levels from center outward.`,optional:[`icon`,`iconColor`,`unit`,`footer`]},sankey:{blurb:`Flow diagram showing how quantities move between layered stages; reveals bottlenecks and splits.`,optional:[`icon`,`iconColor`,`unit`,`footer`]},network:{blurb:`Graph of interconnected entities with circle or grid layout; shows topology and clusters.`,optional:[`icon`,`iconColor`,`layout`,`footer`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={radar:{blurb:`Multi-axis comparison of one or more series; highlights strengths and gaps across dimensions.`,optional:[`icon`,`iconColor`,`max`,`footer`],stringItems:[`axes`]},waterfall:{blurb:`Cascading bars showing incremental change; bridges starting value to ending total.`,optional:[`icon`,`iconColor`,`unit`,`footer`]},funnel:{blurb:`Progressive narrowing through stages where each stage is a SUBSET of the one above — conversion/retention drop-off (signups → trials → paid). Never for a plain ranked list or unrelated categories — use leaderboard or bars.`,optional:[`icon`,`iconColor`,`unit`,`footer`]},histogram:{blurb:`Frequency distribution; bin-based view with optional reference marker (mean, median, etc).`,optional:[`icon`,`iconColor`,`unit`,`color`,`marker`,`markerLabel`,`footer`]},boxplot:{blurb:`Quartile-based summary (min/Q1/median/Q3/max + outliers) per group; compares spread and skew.`,optional:[`icon`,`iconColor`,`unit`,`domain`,`footer`]},streamgraph:{blurb:`Stacked flow over time; smooth curves reveal how composition evolves and peaks shift.`,optional:[`icon`,`iconColor`,`unit`,`footer`],stringItems:[`ticks`]},correlationheatmap:{blurb:`Numeric correlation matrix (Pearson/Spearman/etc.) between N variables, diverging color by strength and sign — red for negative, presence-blue for positive, neutral near zero. For pairwise relationships across many variables at once, not a single x-vs-y scatter.`,optional:[`icon`,`iconColor`,`footer`],stringItems:[`variables`],propHints:{variables:`ordered variable names, same order on both axes`,matrix:`square N×N array, matrix[i][j] = correlation of variables[i] with variables[j], each in [-1, 1]`}},bcgmatrix:{blurb:`BCG growth-share matrix: a portfolio of products or business units scattered by market growth (y) vs. relative market share (x), split into Star/Question-Mark/Cash-Cow/Dog by the portfolio median. Bubble size carries revenue when given. Use for product-portfolio strategy, investment prioritization across business lines, "which bets to double down on vs. divest".`,optional:[`icon`,`iconColor`,`unit`,`footer`],itemShapes:[{prop:`items`,text:`label`,textAliases:[`name`,`title`,`product`]}],propHints:{"items[].growth":`market growth rate in percent, e.g. 18 for +18% YoY; can be negative`,"items[].share":`relative market share vs. the category leader, e.g. 1.4 = 1.4x the #2 player`,"items[].revenue":`optional — sizes the bubble; omit and every bubble matches`,"items[].note":`optional one-line context shown on hover`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={flowchord:{blurb:`Circular relationship/flow diagram: named entities ring the perimeter, and flows between them draw as arced ribbons sized by value — like a Sankey bent into a circle. Reads two-way movement between the SAME nodes (a gain and a loss) cleanly, which a layered Sankey cannot. Use for trade/migration between regions, budget movement between departments, account movement between tiers, traffic between services.`,optional:[`icon`,`iconColor`,`unit`,`footer`],itemShapes:[{prop:`nodes`,text:`label`,textAliases:[`name`,`title`,`id`]}],propHints:{"nodes[].id":`a short stable key, referenced by flows[].from/to`,"nodes[].label":`the display name shown on the ring`,"flows[].from":`a nodes[].id — the flow's source`,"flows[].to":`a nodes[].id — the flow's destination`,"flows[].value":`numeric flow size; ribbon width scales with it`}},venn:{blurb:`Two or three overlapping circles; unique versus shared, with counts.`,optional:[`icon`,`iconColor`,`overlaps`,`footer`]},quadrant:{blurb:`2×2 matrix — SWOT, Eisenhower, impact-effort; plots items by position in four labeled quadrants.`,optional:[`icon`,`iconColor`,`xLabel`,`yLabel`,`topRight`,`topLeft`,`bottomLeft`,`bottomRight`,`footer`],itemShapes:[{prop:`items`,text:`label`,textAliases:[`name`,`title`,`text`],requiredFields:[`quadrant`]}],propHints:{"items[].quadrant":`'topRight'|'topLeft'|'bottomRight'|'bottomLeft'`}},piedonut:{blurb:`Pie or donut chart split; each slice is a named portion with value and optional label.`,optional:[`icon`,`iconColor`,`unit`,`hole`,`centerValue`,`centerLabel`,`footer`],itemShapes:[{prop:`slices`,text:`label`,textAliases:[`name`,`category`,`segment`]}]},distributioncurve:{blurb:`Smooth bell curve with mean/±σ bands; shades a highlight region under the curve.`,optional:[`icon`,`iconColor`,`kind`,`mean`,`sd`,`points`,`shadeFrom`,`shadeBetween`,`markers`,`unit`,`footer`],propHints:{kind:`'normal'|'custom'`,"markers[].color":`optional accent for marker line`}},latencydist:{blurb:`Latency distribution histogram with p50/p90/p95/p99 markers and an SLO threshold line that turns red when the p99 tail breaches it — the classic latency-vs-SLO view for an API or dashboard.`,optional:[`icon`,`iconColor`,`unit`,`p50`,`p90`,`p95`,`p99`,`slo`,`sloLabel`,`caption`,`footer`],propHints:{unit:`latency unit, usually 'ms' (default) or 's'`,sloLabel:`short label for the SLO line, e.g. 'SLO 200ms'`,iconColor:`var(--presence)|var(--insight)|var(--warning)`}},captable:{blurb:`Startup capitalization table: a stacked ownership bar over a ledger of holders (founders, ESOP, investors) with share counts and fully-diluted %. FD% is computed from shares when not given.`,optional:[`icon`,`iconColor`,`totalShares`,`caption`,`footer`],itemShapes:[{prop:`holders`,text:`name`,textAliases:[`holder`,`label`,`who`,`investor`]}],propHints:{"holders[].class":`share class, e.g. 'Common', 'Preferred Seed', 'Series A', 'Options'`,"holders[].fdPct":`fully-diluted percent (0..100); omit to derive from shares`,totalShares:`fully-diluted total for the % base; defaults to the sum of holder shares`}},lifewheel:{blurb:`Wheel-of-life radial self-assessment: one spoke per life domain rated 0–10, a filled polygon whose roundness shows balance vs imbalance, and the felt score on each spoke. Reads how full and how even a life is at a glance.`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`domains`,text:`label`,textAliases:[`name`,`area`,`domain`]}],propHints:{"domains[].score":`felt rating 0..10 (clamped on render)`,"domains[].note":`optional one-line reflection shown on hover`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={violinplot:{blurb:`Mirrored kernel-density estimate (KDE) per group with an embedded box plot — reveals full distribution shape, modes, and spread across multiple groups in one view. Better than a boxplot when the shape matters (bimodal, skewed). Each group is a {label, values, color?} object.`,optional:[`title`,`icon`,`iconColor`,`showBox`,`unit`,`footer`],propHints:{"groups[].values":`raw numeric array — at least 5 values per group`,"groups[].color":`optional CSS variable, e.g. var(--presence)`,"groups[].label":`group name shown on the axis`,showBox:`overlay embedded box plot, default true`}},stemleafplot:{blurb:`Classic stem-and-leaf display — preserves exact data values while showing distribution shape in monospace. Optional back-to-back layout for side-by-side group comparison. Best for small integer datasets (n < 100). leafUnit adjusts which digit is the leaf.`,optional:[`title`,`icon`,`iconColor`,`title2`,`values2`,`leafUnit`,`footer`],propHints:{values:`numeric array (integers work best)`,leafUnit:`each leaf represents this unit; default 1 (ones digit)`,title2:`label for the second dataset in back-to-back mode`,values2:`optional second dataset for back-to-back comparison`}},tamsam:{blurb:`TAM/SAM/SOM concentric ring chart: nested circles sized by market value, labelled with the acronym and dollar amount. Use for market-sizing decks, startup pitch slides, and investor materials where you need to show total addressable market vs. serviceable addressable vs. serviceable obtainable.`,optional:[`title`,`icon`,`iconColor`,`footer`],propHints:{"markets[]":`{label, value, unit?} — outermost ring first (TAM → SAM → SOM)`,"markets[].label":`e.g. "TAM", "SAM", "SOM"`,"markets[].value":`numeric market size`,"markets[].unit":`optional suffix — "B" for billions, "T" for trillions`}},slopegraph:{blurb:`Before-and-after change lines with labels — shows trajectory or shift per category.`,optional:[`icon`,`iconColor`,`unit`,`beforeLabel`,`afterLabel`,`footer`]},dumbbell:{blurb:`Paired dots with connector bars — compare ranges or intervals across categories.`,optional:[`icon`,`iconColor`,`unit`,`startLabel`,`endLabel`,`startColor`,`endColor`,`domain`,`footer`]},lollipop:{blurb:`Stem-and-circle bars — cleaner bar chart alternative for ranked values.`,optional:[`icon`,`iconColor`,`unit`,`footer`],itemShapes:[{prop:`rows`,text:`label`}],propHints:{"rows[].value":`a REAL number this row ranks by — required, never omit or leave non-numeric. If the items have no true magnitude to rank by (e.g. a plain checklist of categories), pick a checklist-shaped block instead of lollipop`,"rows[].sub":`optional short annotation shown on hover next to the value`}},bulletchart:{blurb:`Actual vs a defined TARGET with qualitative bands — a performance gauge with context (revenue vs quota, latency vs SLA). Never for a plain category comparison with no target — use bars.`,optional:[`icon`,`iconColor`,`footer`]},candlestick:{blurb:`OHLC candles over time — requires a real open/high/low/close per period (stock/crypto/commodity prices). Never for a generic time series with a single value per point — use chart.`,optional:[`icon`,`iconColor`,`unit`,`footer`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={gantt:{blurb:`Project schedule: task bars spanning DATE RANGES on a timeline, with completion and dependencies. Never for a single-point event timeline or a status list — use timeline or statustimeline.`,optional:[`icon`,`iconColor`,`footer`],stringItems:[`cols`]},bubble:{blurb:`Scatter plot with size and color — multivariate relationship explorer.`,optional:[`icon`,`iconColor`,`xLabel`,`yLabel`,`xDomain`,`yDomain`,`footer`]},arearange:{blurb:`Line with confidence band — forecast or range trend over time.`,optional:[`icon`,`iconColor`,`unit`,`color`,`footer`]},waffle:{blurb:`10x10 grid of squares — composition breakdown or percentage at a glance.`,optional:[`icon`,`iconColor`,`footer`]},groupedbars:{blurb:`Clustered bars by group — compare multiple series side-by-side.`,optional:[`icon`,`iconColor`,`unit`,`footer`],stringItems:[`groups`]},bridge:{blurb:`Waterfall bridge explaining why a number changed — a start, a sequence of signed +/- contributions, and an end, each step floating from the running total. For "what moved revenue/cost/score". Use bars for a plain comparison with no start→end story.`,optional:[`icon`,`iconColor`,`unit`,`prefix`,`footer`],itemShapes:[{prop:`steps`,text:`label`}]},calheat:{blurb:`GitHub-style activity calendar: daily intensity over weeks (streaks and gaps).`,optional:[`icon`,`iconColor`,`color`,`weekdays`,`legend`,`footer`],stringItems:[`weekdays`]},bump:{blurb:`Rank-over-time lines; crossings show where things overtake each other.`,optional:[`icon`,`iconColor`,`footer`],stringItems:[`periods`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={marimekko:{blurb:`Mosaic: column width is the total, height is the share — magnitude and mix at once.`,optional:[`icon`,`iconColor`,`unit`,`footer`]},plot:{blurb:`Cartesian plot of functions/curves on an x/y plane; axes through origin, gridlines, markers.`,optional:[`icon`,`iconColor`,`xLabel`,`yLabel`,`xDomain`,`yDomain`,`markers`,`origin`,`footer`]},dualaxis:{blurb:`Two y-axes over the same x (e.g. revenue + margin); bars on left, line on right.`,optional:[`icon`,`iconColor`,`footer`],stringItems:[`categories`],propHints:{"bar.unit":`e.g. "$" or "units"`,"line.unit":`e.g. "%" or "bps"`}},scatterregression:{blurb:`Scatter plot with an OLS regression line, R² annotation, and optional point labels.`,optional:[`icon`,`iconColor`,`xLabel`,`yLabel`,`color`,`fit`,`footer`]},dotplot:{blurb:`A stacked-dot plot where each observation becomes one dot above a number line. Shows distribution shape, clusters, and outliers. Ideal for small datasets (≤ 30 values).`,optional:[`label`,`color`,`note`,`sub`],propHints:{values:`raw numeric observations, e.g. [12, 15, 15, 18, 22]`,label:`x-axis label, e.g. "Test score"`}},controlchart:{blurb:`A Shewhart process-control chart with upper/lower control limits and a center line. Out-of-control points are highlighted. Use for manufacturing quality, service metrics, or any process monitored over time.`,optional:[`icon`,`iconColor`,`yLabel`,`note`,`sub`],propHints:{"points[].label":`sample label, e.g. "Week 1"`,"points[].value":`measured value for that sample`,ucl:`upper control limit (mean + 3σ)`,lcl:`lower control limit (mean − 3σ)`,centerLine:`process mean`}},areaplot:{blurb:`Cartesian plot that shades a region — area under a curve to the x-axis or between two curves, with optional Riemann/trapezoid rectangles and the area value labeled. The integral/AUC visual: calculus areas, probability mass under a pdf, consumer/producer surplus, work under an F–x curve.`,optional:[`icon`,`iconColor`,`xLabel`,`yLabel`,`xDomain`,`yDomain`,`shade`,`rects`,`areaLabel`,`showArea`,`origin`,`footer`],itemShapes:[{prop:`curves`,textAliases:[`name`,`title`]}],propHints:{"curves[].points":`sampled points [{x,y}] in data coords (sample finely, e.g. ~30+ pts, for a smooth fill)`,shade:`{ from: 'axis' | curveIndex, to: topCurveIndex, x0?, x1? } — 'axis' fills down to y=0; x0/x1 are the integration limits (default = the curves' sampled span)`,rects:`{ n: number, rule: 'left'|'right'|'mid'|'trap' } — draws Riemann/trapezoid rectangles over the region and prints the estimate`,areaLabel:`override the area badge (e.g. an exact symbolic value); omit to show the computed integral`,origin:`true (default) draws axes through (0,0) when in range; false = edge axes`}},supplydemand:{blurb:`The economics supply×demand diagram: an upward supply line and downward demand line on price(y)×quantity(x) axes, the equilibrium marked P*/Q*, optional shaded consumer/producer surplus, and an optional shift of one curve (faded original + arrow). Pick it for market equilibrium, price controls, taxes, and comparative-statics questions.`,optional:[`icon`,`iconColor`,`shift`,`region`,`qMax`,`pMax`,`priceLabel`,`quantityLabel`,`pricePrefix`,`showEquilibrium`,`footer`],propHints:{supply:`the supply line as { intercept, slope } where P = intercept + slope·Q with slope > 0 (e.g. { intercept: 2, slope: 0.5 }), OR { points: [{q,p},{q,p}] }`,demand:`the demand line as { intercept, slope } where P = intercept + slope·Q with slope < 0 (e.g. { intercept: 14, slope: -0.7 }), OR { points: [{q,p},{q,p}] }`,"shift.curve":`'supply'|'demand' — which curve moves`,"shift.to":`the curve’s new position, same shape as supply/demand ({intercept,slope} or {points})`,region:`'consumer'|'producer'|'none' — shade the surplus triangle at equilibrium`,pricePrefix:`currency symbol on every price, e.g. '$'`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={bigo:{blurb:`Big-O growth chart: operations vs input size n, the canonical complexity curves (O(1), O(log n), O(n), O(n log n), O(n^2), O(2^n)) drawn together so the exponential visibly dwarfs the rest. Pick for "how fast does X grow" / comparing algorithm complexities; highlight one class or annotate "this algorithm" on a curve.`,optional:[`icon`,`iconColor`,`classes`,`maxN`,`highlight`,`algorithm`,`xLabel`,`yLabel`,`footer`],propHints:{classes:`subset of 'o-1'|'o-logn'|'o-n'|'o-nlogn'|'o-n2'|'o-2n' (drawn slow->fast; default all six)`,highlight:`one of 'o-1'|'o-logn'|'o-n'|'o-nlogn'|'o-n2'|'o-2n'`,maxN:`integer largest input size on x-axis, 2..64 (default 16)`,algorithm:`{ name: string, complexity: 'o-1'|'o-logn'|'o-n'|'o-nlogn'|'o-n2'|'o-2n' }`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},errorbars:{blurb:`Group means with their uncertainty — each group a point (or bar) plus a confidence-interval whisker (mean ± ci, or explicit low/high). The #1 inferential-statistics graphic for comparing groups, and the standard way to report lab/experiment results. Use over plain bars whenever the spread or overlap of the estimates is the point.`,optional:[`icon`,`iconColor`,`unit`,`yLabel`,`bars`,`reference`,`bracket`,`footer`],itemShapes:[{prop:`groups`,text:`label`,textAliases:[`name`,`group`]}],propHints:{"groups[].label":`group name, e.g. "Placebo"`,"groups[].mean":`the group mean / central estimate (the point or bar height)`,"groups[].ci":`symmetric half-width of the interval (drawn as mean ± ci)`,"groups[].low":`explicit lower interval bound (use low + high for asymmetric CIs instead of ci)`,"groups[].high":`explicit upper interval bound (pair with low)`,"groups[].color":`var(--presence)|var(--insight)|var(--warning)|var(--danger)`,bars:`true draws a bar from the baseline to each mean behind the whisker; false (default) = points`,reference:`{ value: number, label?: string } — a horizontal target/baseline line`,bracket:`{ from: number, to: number, label: string } — significance annotation between two groups by index, e.g. { from: 0, to: 2, label: "p < 0.001" }`}},eratimeline:{blurb:`Comparative multi-track timeline on ONE shared time axis: several parallel lanes (regions, fields, people), each with era BANDS (start→end spans) and point events, so synchronous history lines up vertically. For "what was happening in X vs Y at the same time", overlapping eras, side-by-side project/era comparison. Times are signed years (negative = BCE). Use gantt for a project schedule with dependencies; timeline for a single sequence of dated points.`,optional:[`icon`,`iconColor`,`min`,`max`,`footer`],itemShapes:[{prop:`tracks`,text:`label`,children:{prop:`spans`,text:`label`}}],propHints:{"tracks[].spans[].start":`signed year, negative = BCE (e.g. -509 for 509 BCE, 1492 for 1492 CE)`,"tracks[].spans[].end":`signed year >= start`,"tracks[].events[].at":`signed year of a single-moment event`,color:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},payoffdiagram:{blurb:`Options / derivatives payoff diagram: profit-and-loss (y) vs the underlying price at expiration (x). The kinked payoff line is computed from the position legs (call/put × long/short × strike × premium), with breakeven prices marked where P/L crosses zero, profit (green) vs loss (red) zones shaded, a zero reference line, and max profit / max loss (incl. "unlimited") derived. Pick for a single call/put, a spread, a straddle, a collar — any options strategy P&L.`,optional:[`icon`,`iconColor`,`priceMin`,`priceMax`,`pricePrefix`,`underlyingLabel`,`pnlLabel`,`spot`,`footer`],itemShapes:[{prop:`legs`}],propHints:{legs:`the position's legs: [{ type: 'call'|'put', position: 'long'|'short', strike: number, premium: number, qty?: number }] — payoff is summed across legs, so the curve bends at every strike`,"legs[].type":`'call' | 'put'`,"legs[].position":`'long' (bought, pays premium) | 'short' (written, collects premium)`,priceMin:`visible price-axis lower bound; auto-fit around the strikes when omitted`,priceMax:`visible price-axis upper bound; auto-fit around the strikes when omitted`,pricePrefix:`currency symbol on prices and P/L, e.g. '$' (default '$')`,spot:`today's underlying price; drawn as a vertical guide`}},phasediagram:{blurb:`A pressure–temperature phase diagram: temperature (x) vs pressure (y), with the solid / liquid / gas (and optional supercritical-fluid) regions separated by phase-boundary curves (sublimation, fusion, vaporization), the triple point and critical point marked and labelled. Pick it for chemistry / thermodynamics / materials questions about states of matter, phase transitions, sublimation, melting/boiling under pressure — and water’s famous negative-slope fusion line (ice melts under pressure), which the boundary points can express directly.`,optional:[`icon`,`iconColor`,`triplePoint`,`criticalPoint`,`regions`,`tLabel`,`pLabel`,`tUnit`,`pUnit`,`tDomain`,`pDomain`,`footer`],itemShapes:[{prop:`boundaries`,text:`label`},{prop:`regions`,text:`label`}],propHints:{"boundaries[].kind":`'sublimation' (solid⇌gas) | 'fusion' (solid⇌liquid) | 'vaporization' (liquid⇌gas)`,"boundaries[].points":`sampled points [{t,p}] in data coords (temperature, pressure) along the curve; sample finely. Fusion can have NEGATIVE slope (e.g. water) — just supply points trending left as pressure rises.`,"boundaries[].color":`var(--presence)|var(--insight)|var(--warning)|var(--danger)|var(--line-strong)`,triplePoint:`{ t, p } — where all three phases coexist (e.g. water: {t:273.16, p:0.006} in K/atm)`,criticalPoint:`{ t, p } — where the liquid⇌gas boundary ends and the supercritical fluid begins (e.g. water: {t:647.1, p:218} in K/atm)`,"regions[]":`{ t, p, phase, label, color?, anchor? } — a label placed inside an area; phase is 'solid'|'liquid'|'gas'|'supercritical' (drives the tint), anchor is 'start'|'middle'|'end'`,tUnit:`temperature unit, e.g. 'K' or '°C'`,pUnit:`pressure unit, e.g. 'atm', 'kPa', 'bar'`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},indifferencecurve:{blurb:`The microeconomics indifference-curve map: good X (x) vs good Y (y), a family of convex, downward-sloping indifference curves (further from the origin = more utility, labelled U₁ < U₂ < U₃), with an optional budget line and the optimal consumption bundle marked where the budget line is tangent to the highest reachable curve. Pick it for consumer choice / utility theory, MRS = price-ratio tangency, and how a price or income change moves the optimum.`,optional:[`icon`,`iconColor`,`budget`,`optimal`,`xLabel`,`yLabel`,`xMax`,`yMax`,`footer`],itemShapes:[{prop:`curves`,textAliases:[`name`,`title`]}],propHints:{"curves[].points":`sampled points [{x,y}] left→right tracing ONE convex, downward-sloping curve (sample finely, ~8+ pts); higher-utility curves bow further from the origin and must NOT cross a lower one`,"curves[].label":`utility level, e.g. "U₁" (lowest) … "U₃" (highest)`,budget:`the budget line as { intercept, slope } where Y = intercept + slope·X with slope < 0 (intercept = income ÷ price of Y, slope = −price of X ÷ price of Y), OR { points: [{x,y},{x,y}] }`,optimal:`{ x, y, label? } the optimal bundle (tangency of the budget line with the highest reachable curve); make (x,y) an exact sampled point on that curve to highlight it`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},breakeven:{blurb:`The cost-volume-profit (break-even) chart: a revenue line and a total-cost line on units(x) x money(y) axes that cross at the break-even volume, with the loss region (left of the crossing) shaded and the profit region (right) shaded. Computed entirely from fixed cost, price per unit, and variable cost per unit — it derives break-even units = fixed / (price - cost) and the per-unit contribution margin. Pick it for pricing, profitability, and "how many do we need to sell" questions.`,optional:[`title`,`icon`,`iconColor`,`maxUnits`,`unit`,`currency`,`caption`,`footer`],propHints:{fixedCost:`total fixed cost that does not change with volume (rent, salaries, tooling)`,pricePerUnit:`revenue earned per unit sold`,costPerUnit:`variable cost per unit produced; must be < pricePerUnit for a finite break-even`,maxUnits:`right end of the units axis; auto-fits to ~2x the break-even volume when omitted`,unit:`unit noun on the x-axis + readouts, e.g. 'units'|'subscriptions'|'seats'`,currency:`currency symbol prefixing every money value (default '$')`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},burnrunway:{blurb:`Cash balance + monthly burn rate chart with projected runway: a dual-axis view pairing the declining cash curve against the per-month burn bars. A runway horizon line and read-out show exactly how many months remain. Use for startup financials, seed-round planning, "how long does our cash last", and fundraising readiness discussions.`,optional:[`title`,`icon`,`iconColor`,`initialCash`,`runwayMonths`,`currency`,`footer`],itemShapes:[{prop:`months`,text:`label`,textAliases:[`month`,`period`,`name`]}],propHints:{months:`array of monthly data — each has label (e.g. "Jan 25"), burn (monthly spend), and optional balance (if omitted, computed as running total)`,initialCash:`opening cash balance in the same units as burn (e.g. 1_200_000 for $1.2M); inferred from the first balance when omitted`,currency:`currency symbol prefix shown on all cash figures; default "$"`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={loaddiagram:{blurb:`A structural-engineering beam load diagram with its matched shear V(x) and bending-moment M(x) plots — three panels stacked on one shared position axis (distance along the beam), so a support, a load, the shear it produces, and the resulting moment all line up vertically. The top panel draws the beam with supports (pin/roller/fixed) and applied loads (point arrows, distributed bands); the V and M panels plot the supplied series with the peaks (Vmax, Mmax) marked. For statics, mechanics of materials, and structural-analysis explanations. Plots the V/M series it is given (it does not solve the statics); supply them alongside the loads.`,optional:[`icon`,`iconColor`,`unit`,`shear`,`moment`,`caption`,`footer`],itemShapes:[{prop:`supports`},{prop:`loads`,text:`label`},{prop:`shear`},{prop:`moment`}],propHints:{span:`total beam length; sets the shared distance axis [0, span]`,"supports[].at":`position along the span (0 … span) where the support sits`,"supports[].kind":`'pin'|'roller'|'fixed' (default 'pin')`,"loads[].kind":`'point' (concentrated force) | 'udl' (uniformly distributed load over [at, to])`,"loads[].at":`the load's position (point) or its start (udl)`,"loads[].to":`the udl's end position; required for kind 'udl', ignored for 'point'`,"loads[].mag":`a point load's force, or a udl's intensity per unit length`,"loads[].label":`caption drawn by the load, e.g. 'P = 12 kN' or 'w = 4 kN/m'`,unit:`force unit suffix on labels + read-outs, e.g. 'kN', 'lbf'`,shear:`the shear diagram V(x) as a sampled series [{x, v}] left→right (plotted, not computed) — include the jumps at point loads and the endpoints`,moment:`the bending-moment diagram M(x) as a sampled series [{x, m}] left→right (plotted, not computed) — sample finely enough to show its curvature`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},ecgstrip:{blurb:`A physiologic ECG rhythm strip on the classic pink graticule (1 mm small squares grouped into 5 mm large squares). The P-QRS-T waveform is drawn from a sampled trace (normalized -1..2, baseline 0, R-wave peak near 2); when no samples are given a normal sinus beat is synthesized and repeated at rateBpm, so the strip stays honest to the stated rate. PR/QRS/QT interval brackets and abnormality pins (PVC, ST elevation…) are placed by millisecond and the rate + rhythm read out above. For cardiology, vitals, and clinical-teaching explanations. Plots the trace it is given — it never invents a measurement.`,optional:[`title`,`icon`,`iconColor`,`samples`,`rateBpm`,`rhythm`,`intervals`,`abnormalities`,`gridMs`,`caption`,`footer`],itemShapes:[{prop:`intervals`,text:`label`},{prop:`abnormalities`,text:`label`}],propHints:{samples:`the waveform as numbers, one per gridMs, normalized -1..2 (0 = baseline, ~2 = R-wave peak); omit to synthesize a normal sinus beat at rateBpm`,rateBpm:`heart rate in beats per minute; drives synthesized beat spacing + the rate read-out`,rhythm:`rhythm interpretation shown beside the rate, e.g. 'Normal sinus rhythm'`,"intervals[].label":`segment measured, e.g. 'PR', 'QRS', 'QT'`,"intervals[].fromMs":`interval start, in ms from the strip's left edge`,"intervals[].toMs":`interval end, in ms (>= fromMs)`,"abnormalities[].atMs":`time of the finding, in ms from the strip's left edge`,"abnormalities[].label":`short caption pinned above the trace, e.g. 'PVC'`,gridMs:`ms represented by one small (1 mm) grid square (default 40, paper standard)`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},vitalstrip:{blurb:`A multi-channel patient-monitor panel. Each channel (HR, BP, SpO₂, RR, temp…) stacks a mini trend line with its normal-range band shaded behind it and a big current read-out; any value falling outside the channel’s normal range is flagged (the row glows, the value turns red). The trend geometry, the band, and the out-of-range detection are all computed from the supplied series + range — it plots the numbers it is given and never fabricates a reading. For bedside monitoring, triage, and clinical explanations.`,optional:[`title`,`icon`,`iconColor`,`windowLabel`,`caption`,`footer`],itemShapes:[{prop:`channels`,text:`label`}],propHints:{"channels[].label":`channel name, e.g. 'HR', 'SpO₂', 'RR'`,"channels[].unit":`unit suffix on the read-out, e.g. 'bpm', '%', '°C'`,"channels[].series":`the trend samples as numbers, oldest → newest (left → right)`,"channels[].current":`the headline current value; defaults to the last sample when omitted`,"channels[].normal":`the channel’s normal range as [low, high]; the band is shaded and excursions flagged`,"channels[].color":`var(--presence)|var(--insight)|var(--warning)|var(--danger)`,windowLabel:`the time window the trends cover, e.g. 'last 30 min'`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},growthcurve:{blurb:`A pediatric percentile growth chart. Reference percentile curves (p3 … p97) fan out over an age axis; the child’s measured points are plotted on top and each landing is tracked to a percentile by interpolating the fan AT that exact age, so the standing read-out is computed, never invented. The median curve is emphasised and the outer band tinted. Both the reference curves and the child’s track come from the data (real-data-only). For pediatrics, well-child visits, and growth-monitoring explanations.`,optional:[`title`,`icon`,`iconColor`,`unit`,`ageUnit`,`caption`,`footer`],propHints:{metric:`'weight'|'height'|'head' — drives the default y-axis title`,unit:`value-axis unit suffix, e.g. 'kg', 'cm', 'lb'`,ageUnit:`age-axis unit noun, e.g. 'months', 'years' (default 'months')`,"percentiles[].p":`the percentile this curve represents, e.g. 3, 15, 50, 85, 97`,"percentiles[].points":`the curve as {age, value} samples, ascending in age`,"plotted[].age":`the child’s age at this measurement, on the same scale as the curves`,"plotted[].value":`the measured weight / height / head circumference`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},sleepcycle:{blurb:`A one-night hypnogram. Sleep stages (Awake / REM / Light / Deep) on a categorical depth axis are traced as a stepped line across the hours of the night; REM spans are highlighted, bedtime and wake are marked, and the cycle count is reported. The step geometry, the time axis, the per-stage time totals, and the cycle count are all computed from the supplied spans — it plots the sleep architecture it is given and never fabricates a stage. For sleep science, sleep-tracker read-outs, and clinical explanations.`,optional:[`title`,`icon`,`iconColor`,`bedtime`,`wake`,`cycles`,`caption`,`footer`],itemShapes:[{prop:`stages`,text:`stage`,closedVocab:!0}],propHints:{"stages[].stage":`'awake'|'rem'|'light'|'deep'`,"stages[].fromMin":`start of the span, in minutes from lights-out (= 0)`,"stages[].toMin":`end of the span, in minutes (>= fromMin)`,bedtime:`clock label for lights-out under the left edge, e.g. '11:00 PM'`,wake:`clock label for waking under the right edge, e.g. '7:00 AM'`,cycles:`number of completed sleep cycles; inferred from REM bouts when omitted`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},seasonband:{blurb:`A 12-month seasonal calendar band. Each row (a crop, a flower, a fish) shows its active WINDOWS across a fixed Jan→Dec grid — in-season / planting / harvest / peak / bloom spans — with an optional "now" marker pinning today's month. Every x-position is computed from the month numbers (1=Jan…12=Dec); it never invents a month. For "what's in season when", planting/harvest calendars, bloom schedules, and any annually-recurring availability. Use gantt for a dated one-off project schedule, eratimeline for multi-year history.`,optional:[`title`,`icon`,`iconColor`,`nowMonth`,`caption`,`footer`],itemShapes:[{prop:`rows`,text:`label`}],propHints:{"rows[].windows[].from":`first active month, inclusive (1 = Jan … 12 = Dec)`,"rows[].windows[].to":`last active month, inclusive (>= from)`,"rows[].windows[].kind":`'peak'|'available'|'planting'|'harvest'|'bloom' (default 'available')`,nowMonth:`highlight today's month with a vertical marker, 1 (Jan) … 12 (Dec)`,iconColor:`var(--presence)|var(--insight)|var(--warning)|var(--danger)`}},roccurve:{blurb:`ROC (Receiver Operating Characteristic) curve: TPR vs FPR at each decision threshold, with the chance diagonal, shaded AUC area, and a draggable operating-point marker. Compare multiple classifiers or diagnostic tests on the same axes. The model supplies the (fpr, tpr) point cloud and AUC; dragging explores trade-offs without fabricating data. Use for classifier evaluation, diagnostic test sensitivity/specificity, model selection.`,optional:[`title`,`icon`,`iconColor`,`operatingPoint`,`xLabel`,`yLabel`,`caption`,`footer`],itemShapes:[{prop:`curves`,text:`name`,textAliases:[`label`,`model`,`classifier`]}],propHints:{"curves[].name":`classifier or model name shown in the legend`,"curves[].points":`array of { fpr, tpr, threshold? } in ascending fpr order`,"curves[].auc":`area under curve 0-1 (model-supplied, not recomputed)`,operatingPoint:`0-based index into the first curve points for the initial marker position`}},surfaceplot:{blurb:`Scalar field z = f(x,y) rendered as a 2-D heatmap with optional marching-squares contour isolines (mode "contour", default), a flat heatmap without isolines (mode "filled"), or an oblique 3-D projection (mode "surface3d"). Color ramp goes from insight (low) through presence (mid) to warning (high). Use for multivariable calculus (gradient fields, saddle points, Lagrange multipliers), heat distribution, probability density surfaces, and topographic elevation. The model supplies a row-major grid of z-values; all geometry is computed.`,optional:[`mode`,`levels`,`xLabel`,`yLabel`,`zLabel`,`zRange`,`caption`],propHints:{grid:`2-D number[][] row-major array of z-values; grid[0] is the top row`,mode:`"contour" (default) | "filled" | "surface3d"`,levels:`number of contour threshold bands (default 6)`,zRange:`[min, max] override; omit to auto-compute from grid`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={gradientdescent:{blurb:`A loss surface — contour isolines over a 2-D grid of (x, y, z) samples — with an optimizer's actual descent path traced over it as a drawn-on trail with step markers. Use for gradient descent, learning-rate/convergence intuition, and optimization landscapes (saddle points, local minima, ravines). The model supplies both the real loss grid and the real visited points; no curve is fitted or fabricated.`,optional:[`title`,`icon`,`iconColor`,`learningRate`,`footer`],propHints:{contour:`row-major 2-D array of { x, y, z } loss samples — a rectilinear mesh, grid[0] is the top row`,path:`array of { x, y, step } — the optimizer's actual visited points, in step order`,learningRate:`the optimizer's step size, shown as a caption`}},biasvariance:{blurb:`The canonical bias-variance tradeoff diagram: training error falling and test error forming a U-shape as model complexity rises, with an optional shaded "sweet spot" band at the best-generalizing complexity. Use for overfitting/underfitting intuition, model-selection and regularization discussions, and explaining the complexity/generalization tradeoff. Three parallel arrays plot straight through — nothing is curve-fit.`,optional:[`title`,`icon`,`iconColor`,`sweetSpot`,`footer`],propHints:{complexity:`ascending model-complexity x-values, one per sample`,trainError:`training error at each complexity level, same length as complexity`,testError:`held-out/test error at each complexity level, same length as complexity`,sweetSpot:`complexity value to shade as the best-generalizing point, if known`}},timeseriesdecomposition:{blurb:`STL-style time series decomposition: observed, trend, seasonal, and residual plotted as four small panels stacked on one shared x-axis, each with its own y-scale so a small seasonal/residual swing stays readable next to a much larger observed series. Use for forecasting explainers, seasonality analysis, and anomaly discussions (residual spikes). All four series are the caller's real numbers — nothing is filtered or smoothed here.`,optional:[`title`,`icon`,`iconColor`,`footer`],stringItems:[`dates`],propHints:{dates:`x-axis labels, one per sample (only shown under the bottom panel)`,observed:`the raw series`,trend:`the long-run trend component, same length as dates`,seasonal:`the repeating seasonal component, same length as dates`,residual:`what's left after removing trend and seasonal — the noise/anomaly component`}},precisionrecallcurve:{blurb:`Precision-recall curve for classifier evaluation: precision (y) vs recall (x) across decision thresholds, with a shaded area-under-curve fill. Unlike ROC there is no chance-diagonal (a PR curve's no-skill baseline depends on class prevalence, which this component is never given, so none is drawn). Prefer this over ROC on imbalanced classes, where ROC can look misleadingly good. Compare multiple classifiers on the same axes; an optional average-precision badge summarizes the primary curve.`,optional:[`title`,`icon`,`iconColor`,`avgPrecision`,`footer`],itemShapes:[{prop:`curves`,text:`label`,textAliases:[`name`,`model`,`classifier`]}],propHints:{"curves[].label":`classifier or model name shown in the legend`,"curves[].points":`array of { precision, recall, threshold? } — any order, sorted by recall to draw`,avgPrecision:`area under the PR curve, 0-1 (model-supplied, not recomputed) — shown as an AP badge`}},chromatogram:{blurb:"An HPLC/GC chromatography readout: detector signal over retention time with each eluting peak apex labeled (RT, compound, area%) and its real integrated region shaded between the valleys either side of it. Give `trace` for the full baseline; without it, only the peak results table renders — never a fabricated baseline shape. Use for analytical chemistry, purity checks, and separation science.",optional:[`icon`,`iconColor`,`method`,`trace`,`footer`],propHints:{method:`instrument/method line, e.g. "HPLC · C18, 1.0 mL/min, 254 nm"`,"trace[].t":`retention time, in minutes unless stated otherwise`,"trace[].signal":`detector response (mAU or counts) at that time`,"peaks[].rt":`retention time of the peak apex`,"peaks[].label":`compound identity, e.g. "Caffeine"`,"peaks[].areaPct":`percent of total integrated area, 0-100`,"peaks[].height":`peak height in detector units`}},stressstraincurve:{blurb:"A material's engineering stress-strain diagram, plotted straight from the tensile-test curve. When `yieldPoint` is given, the elastic region (up to yield) is shaded and a Young's-modulus slope is computed from the curve's own first sample and the yield point. Yield/ultimate-tensile/fracture points are each independently optional and called out with a labeled leader line. Use for materials science, mechanical engineering, and manufacturing QA — never for a curve the model hasn't actually sampled.",optional:[`icon`,`iconColor`,`yieldPoint`,`ultimatePoint`,`fracturePoint`,`footer`],propHints:{"curve[].strain":`engineering strain, dimensionless (e.g. 0.02 = 2%)`,"curve[].stress":`engineering stress, in the material's own unit (MPa unless stated otherwise)`,yieldPoint:`{ strain, stress } where plastic deformation begins`,ultimatePoint:`{ strain, stress } at the curve peak — ultimate tensile strength`,fracturePoint:`{ strain, stress } where the sample actually broke`}},gatingplot:{blurb:`A flow-cytometry gating plot: the raw event point-cloud on linear or log axes, with translucent gate boundaries (ellipse or polygon) drawn over the populations they enclose, each labeled with its name and percent-of-parent. Click a gate or its legend chip to isolate that population. Use for immunology, cell biology, and clinical flow-cytometry panels — never invents a gate boundary the model wasn't given.`,optional:[`icon`,`iconColor`,`xScale`,`yScale`,`gates`,`footer`],itemShapes:[{prop:`gates`,text:`name`,textAliases:[`label`,`population`,`gateName`]}],propHints:{xScale:`'linear' (default) | 'log' — fluorescence channels commonly need log`,yScale:`'linear' (default) | 'log'`,"points[].gate":"0-based index into `gates` this event was assigned to; omit for ungated","gates[].shape":`'ellipse' | 'polygon'`,"gates[].region":`ellipse: exactly [[cx,cy],[rx,ry]] (center, then radii). polygon: 3+ [x,y] vertices in order.`,"gates[].pctOfParent":`percent of the parent population this gate captures, 0-100`}},gellane:{blurb:`A gel electrophoresis lane readout: vertical sample lanes on a gel backdrop with blurred bands positioned by migration distance and shaded by intensity, plus an optional size ladder with tick labels. Use for molecular biology (DNA/RNA gels, Western blots, PCR product checks) — band position and darkness come straight from the data, nothing is fit or estimated.`,optional:[`icon`,`iconColor`,`ladder`,`footer`],itemShapes:[{prop:`lanes`,text:`label`,textAliases:[`name`,`sample`],children:{prop:`bands`}}],propHints:{"lanes[].bands[].pos":`0-1 migration distance from the well; 0 = top (well), 1 = bottom (dye front)`,"lanes[].bands[].intensity":`0-1 band darkness/brightness`,"lanes[].bands[].sizeLabel":`size shown beside the band, e.g. "480 bp" or "42 kDa"`,ladder:`{ unit: "bp"|"kDa", marks: [...] } — a standard ladder lane drawn first, any mark order`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={flightchart:{blurb:`A media flight/budget chart: channels as horizontal lanes, each flight a bar across the timeline sized and labeled by spend, with a total-spend readout. Use for marketing/ad campaign planning across channels — never for a project schedule with dependencies, use gantt.`,optional:[`icon`,`iconColor`,`totalBudget`,`currency`,`footer`],itemShapes:[{prop:`channels`,text:`name`,textAliases:[`label`,`channel`]},{prop:`flights`,text:`channel`,textAliases:[`lane`,`name`]}],propHints:{"flights[].start":`0-based period index the flight starts in`,"flights[].span":`how many periods the flight runs, minimum 1`,"flights[].budget":`spend for that one flight`,currency:`ISO 4217 code, e.g. "USD" — defaults to USD`}},paybandchart:{blurb:`An HR compensation band: a role’s min–mid–max range as a bullet-style track, with named offers/incumbents plotted inside it. A marker flagged as an equity-watch case (compression, off-cycle exception) gets a distinct accent. Use for comp bands, offer positioning, pay-equity review — never for a plain min/max range with no named people on it.`,optional:[`icon`,`iconColor`,`currency`,`footer`],itemShapes:[{prop:`markers`,text:`name`,textAliases:[`label`,`person`,`employee`]}],propHints:{"markers[].value":`that person/offer’s comp, same unit as min/mid/max`,"markers[].flag":`true marks it an equity-watch case, drawn with the warning accent`,currency:`ISO 4217 code, e.g. "USD" — defaults to USD`}},linebalance:{blurb:`A manufacturing line-balance/takt chart: one bar per station’s real cycle time, with a dashed takt-time reference line spanning every bar. Any station whose cycle time clears takt flips to the warning tint and is labeled a bottleneck. Use for assembly-line balancing, station-by-station throughput — never for a generic time series, use chart.`,optional:[`icon`,`iconColor`,`unit`,`footer`],itemShapes:[{prop:`stations`,text:`name`,textAliases:[`label`,`station`]}],propHints:{takt:`takt time — the pace demand sets, same unit as every station’s cycleTime`,"stations[].cycleTime":`that station’s measured cycle time`,"stations[].bottleneck":`true forces the bottleneck tint even if under takt`}},epicurve:{blurb:`An epidemiological epi curve: case counts per period, stacked and colored by diagnostic classification (confirmed/probable/suspected), with an optional dashed alert-threshold line and dotted vertical markers for named interventions/events. Use for outbreak surveillance over time — never for a single running total, use chart.`,optional:[`icon`,`iconColor`,`threshold`,`phases`,`footer`],itemShapes:[{prop:`cases`,text:`period`,textAliases:[`label`,`week`,`date`,`time`]},{prop:`phases`,text:`label`,textAliases:[`name`,`event`]}],propHints:{"cases[].classification":`'confirmed' | 'probable' | 'suspected' — omit for unclassified`,threshold:`{ value, label } — drawn as a dashed reference line`,"phases[].period":`must match one of cases[].period; a non-matching phase is dropped`}},pareto:{blurb:`An 80/20 Pareto chart: bars sorted descending by frequency/value, with a cumulative-percent line on a dual right axis and an 80% guide line. The bars carrying the line up to that guide are highlighted. Use to find the vital few causes behind most of an effect — never for data with no meaningful "which few matter most" read, use bars.`,optional:[`icon`,`iconColor`,`cumulative`,`unit`,`footer`],itemShapes:[{prop:`bars`,text:`label`,textAliases:[`name`,`category`,`reason`,`cause`]}]},populationpyramid:{blurb:`A demographic population pyramid: mirrored horizontal bars from a shared center axis, one row per age band, both sides sharing one scale so bar length is comparable across the whole chart. Use for age/sex population structure — never for a plain two-series comparison with no natural left/right split, use dumbbell.`,optional:[`icon`,`iconColor`,`unit`,`footer`],itemShapes:[{prop:`bands`,text:`label`,textAliases:[`age`,`group`,`range`]}],propHints:{leftLabel:`header over the left bars, e.g. "Male"`,rightLabel:`header over the right bars, e.g. "Female"`,"bands[].left":`the left side's real count for that age band`,"bands[].right":`the right side's real count for that age band`}},parallelcoordinates:{blurb:`A parallel-coordinates plot: one vertical axis per variable, each observation drawn as a line connecting its own position on every axis, each axis normalized to its own real min/max. Hover a line or its legend chip to isolate it. Use to compare several options/observations across MANY variables at once — never for just two variables, use scatterregression.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`axes`,text:`key`,textAliases:[`id`,`field`,`name`]},{prop:`lines`,text:`label`,textAliases:[`name`,`series`]}],propHints:{"axes[].label":`display name for the axis; falls back to its key when omitted`,"axes[].domain":`optional fixed [min,max]; omit to normalize from the real data`,"lines[].values":`object keyed by each axes[].key — a missing key just skips that axis`}},scatterplotmatrix:{blurb:`A scatterplot matrix (pairs plot): an NxN grid of small scatter plots, one per pair of variables, sharing each variable’s own real min/max whether it lands on a row or a column. Diagonal cells show the variable name instead of plotting it against itself. Use to eyeball correlations across MANY variables at once — never for just two, use scatterregression.`,optional:[`icon`,`iconColor`,`color`,`footer`],stringItems:[`vars`],propHints:{vars:`the variable names, in display order — every row/column of the grid`,rows:`one object per real observation, keyed by each name in vars to its numeric value`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={pictogramchart:{blurb:`A true icon-array (isotype) chart: the same 100-glyph grid as waffle, but each cell renders the category’s own icon instead of a plain color square, with a "1 glyph = N units" key. Use when the units being counted have a natural real-world glyph (people, votes, days, vehicles) — for a plain percentage breakdown with no meaningful per-unit icon, use waffle instead.`,optional:[`icon`,`iconColor`,`unitValue`,`footer`],itemShapes:[{prop:`categories`,text:`label`,textAliases:[`name`,`category`]}],propHints:{"categories[].icon":`an existing icon key, e.g. "sun"|"rain"|"walk"|"bus"|"car" — invalid keys fall back to a default glyph`,unitValue:`real units per glyph; omit to auto-fit the whole chart under 100 glyphs`}},qqplot:{blurb:`Quantile-quantile plot: sorts sample values and plots them against the theoretical quantiles of a reference distribution (default normal). The IQR-based reference line is drawn automatically. Points that hug the line indicate a good distributional fit; systematic deviations reveal skewness, heavy tails, or multimodality. Use for normality testing, residual diagnostics, and distribution comparison in statistics courses and data analysis.`,optional:[`distribution`,`xlabel`,`ylabel`],propHints:{values:`raw numeric sample data array — the component sorts and computes quantiles`,distribution:`"normal" (default, only option currently supported)`}},samplingdistribution:{blurb:`Central Limit Theorem demonstration — three linked panels: population histogram (top-left), a single sample dot strip (top-right), and the sampling distribution of sample means (bottom) with theoretical N(μ, σ²/n) overlay. Deterministic simulation (no Math.random) for stable renders.`,optional:[`title`,`icon`,`iconColor`,`population`,`sampleSize`,`numSamples`,`footer`],propHints:{"population.shape":`'uniform' | 'skewed' | 'bimodal' — default skewed`,sampleSize:`n per sample, default 30`,numSamples:`number of simulated samples, default 200`}},hrdiagram:{blurb:`A Hertzsprung–Russell diagram: stars on an inverted log temperature axis (hot O/B stars left, cool K/M right) against log luminosity in solar units, with spectral-class letters, soft bands for the main sequence / giants / supergiants / white dwarfs, and the Sun as a fixed reference at 5772 K, 1 L☉. Use for stellar classification and stellar evolution. Never for a generic two-variable scatter — use scatterregression.`,optional:[`icon`,`iconColor`,`showRegions`,`highlight`,`footer`],itemShapes:[{prop:`stars`,text:`name`,textAliases:[`label`,`star`]}],propHints:{"stars[].tempK":`surface temperature in Kelvin — must be > 0 (the axis is logarithmic)`,"stars[].luminosity":`luminosity in SOLAR units (Sun = 1), e.g. Betelgeuse ~126000, Proxima ~0.0017 — must be > 0`,"stars[].stage":`'main-sequence' | 'giant' | 'supergiant' | 'white-dwarf' — sizes and tints the dot; omit when unknown`,highlight:`name of ONE star (matching stars[].name) to ring and label persistently`,showRegions:`default true — the soft population bands carry most of the teaching value`}},ternaryplot:{blurb:`A ternary (barycentric) plot: three-part compositions inside an equilateral triangle, each point normalized by its own a+b+c sum so any raw scale works, with 20% gridlines parallel to every edge and optional translucent zone polygons (soil-texture classes, alloy phases, color mixes). Use when every observation is a three-component mixture of a whole. Never for a single part-to-whole breakdown — use piedonut.`,optional:[`icon`,`iconColor`,`zones`,`unit`,`footer`],itemShapes:[{prop:`points`,text:`label`,textAliases:[`name`,`sample`]},{prop:`zones`,text:`label`,textAliases:[`name`,`class`],children:{prop:`vertices`}}],propHints:{axes:`{ a, b, c } corner labels — a is the TOP apex, b bottom-left, c bottom-right`,"points[].a":`that point's amount of component a (same for b/c) — any scale; each point is normalized by its own a+b+c sum`,"zones[].vertices":`3+ {a,b,c} corners of a region polygon, normalized like points`,unit:`unit the raw values are in, e.g. "%" — appended to the corner labels`}},parliamentseats:{blurb:`A hemicycle parliament chart: one dot per seat packed into concentric arc rows, parties filling contiguous wedges left to right in array order, with a majority marker at the top-center aisle, a big center total, and clickable legend chips that isolate a party. Use for legislature/council/committee seat counts — real WHOLE seat numbers. Never for part-to-whole percentages — use piedonut/waffle.`,optional:[`icon`,`iconColor`,`totalLabel`,`footer`],itemShapes:[{prop:`parties`,text:`name`,textAliases:[`label`,`party`]}],propHints:{"parties[].seats":`whole number of seats won — a count, never a percentage`,totalLabel:`label under the big center total, defaults to "seats"`}},componentapi:{blurb:`A typed prop/contract reference — every prop of a component or function as a tidy table of name, type, required, default, and description.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`props`,text:`name`,textAliases:[`prop`,`param`,`key`]}],propHints:{component:`the component or function name, e.g. "<Button>" or "fetchUser()"`,"props[].type":`the type signature, e.g. "string"|"() => void"|"'sm'|'md'|'lg'"`,"props[].required":`true if the prop must be supplied (marked in the table)`,"props[].default":`the default value shown verbatim when the prop is omitted`}},stacktrace:{blurb:`A formatted error + call stack — error type, message, per-frame file/line/context, root cause, and a plain-language fix.`,optional:[`icon`,`iconColor`,`frames`,`cause`,`fix`,`footer`],itemShapes:[{prop:`frames`,text:`file`,textAliases:[`filename`,`path`,`module`]}],propHints:{errorType:`e.g. "TypeError"|"ValueError"|"ReferenceError"`,"frames[].isUser":`true for app code, false for library/runtime frames`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={syntaxbreakdown:{blurb:`Annotated code — each line explained in plain English, with per-token labels for keywords, types, and operators.`,optional:[`icon`,`iconColor`,`summary`,`runnable`,`footer`],itemShapes:[{prop:`lines`,text:`code`,textAliases:[`line`,`source`,`text`]}],propHints:{"lines[].tokens[].kind":`'keyword'|'type'|'value'|'operator'|'identifier'|'comment'|'other'`,runnable:`true ONLY when every line together forms one complete dependency-free JavaScript/TypeScript snippet; fragments and code needing imports/DOM/server globals must omit it`}},codewalk:{blurb:`A step-by-step algorithm walkthrough — numbered steps each with a title, code snippet, and plain-English explanation.`,optional:[`icon`,`iconColor`,`algorithm`,`footer`],itemShapes:[{prop:`steps`,text:`title`,textAliases:[`name`,`heading`,`label`]}]},terminal:{blurb:`A realistic terminal session — prompt-prefixed commands with color-coded stdout/stderr and a final exit-code badge. Use for "run this", CLI/git/npm/docker walkthroughs.`,optional:[`title`,`icon`,`iconColor`,`prompt`,`exitCode`,`caption`,`footer`],itemShapes:[{prop:`lines`,text:`text`,textAliases:[`line`,`content`,`command`]}],propHints:{"lines[].kind":`'command'|'stdout'|'stderr'|'comment' (defaults to stdout)`,prompt:`the shell prompt shown before commands, e.g. "~/app %"`}},logstream:{blurb:`A severity-coded log feed — timestamp, level pill, source tag, message, with per-level volume chips you can filter by. Use for log analysis, incidents, and observability.`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`entries`,text:`message`,textAliases:[`msg`,`text`,`line`]}],propHints:{"entries[].level":`'trace'|'debug'|'info'|'warn'|'error'|'fatal'`}},gitgraph:{blurb:"A git commit graph — branch lanes, merges, tags, and HEAD drawn like `git log --graph`. Use for explaining history, branching strategy, and merges.",optional:[`title`,`icon`,`iconColor`,`branches`,`caption`,`footer`],itemShapes:[{prop:`commits`,text:`message`,textAliases:[`subject`,`msg`,`title`]}],stringItems:[`branches`],propHints:{commits:`newest first (top); each needs id, message, branch`,"commits[].parents":`parent commit id(s) — two parents render as a merge`,"commits[].head":`true marks the current HEAD`}},queryplan:{blurb:`A database EXPLAIN plan as an indented operation tree — each node with rows, cost, and time, and the bottleneck flagged. Use for "why is this query slow".`,optional:[`title`,`icon`,`iconColor`,`sql`,`caption`,`footer`],itemShapes:[{prop:`nodes`,text:`op`,textAliases:[`operation`,`node`,`name`]}],propHints:{"nodes[].depth":`indent level, 0 = root; emit nodes in pre-order`,"nodes[].slow":`true on the bottleneck node`}},flamegraph:{blurb:`A CPU flame graph — width is time/samples, depth is the call stack, with the hot path highlighted. Use for profiling and "where is the time going".`,optional:[`title`,`icon`,`iconColor`,`unit`,`caption`,`footer`],itemShapes:[{prop:`frames`,text:`name`,textAliases:[`fn`,`function`,`label`]}],propHints:{frames:`DFS pre-order: a frame is immediately followed by its children; a parent value ≥ the sum of its children`,"frames[].depth":`stack depth, 0 = root`,"frames[].hot":`true marks the hot path`}},regexscope:{blurb:`A regular-expression explainer — the pattern broken into labeled, color-coded tokens, plus test strings with matched runs highlighted. Use for "explain this regex".`,optional:[`title`,`icon`,`iconColor`,`flags`,`samples`,`caption`,`footer`],itemShapes:[{prop:`parts`,text:`label`,textAliases:[`meaning`,`desc`,`explanation`]},{prop:`samples`,children:{prop:`segments`,text:`text`}}],propHints:{"parts[].kind":`'literal'|'class'|'quantifier'|'group'|'anchor'|'escape'|'other'`,"samples[].segments[].match":`true marks a matched run (highlighted)`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={sequencealign:{blurb:`A DNA/RNA/protein sequence alignment — stacked monospace reads with a pinned label column, gaps shown as dashes, optional per-column mismatch tinting, and a majority-consensus row computed from the real reads. Use for comparing reads, mutations/indels, or homologous sequences.`,optional:[`icon`,`iconColor`,`consensus`,`highlightMismatches`,`footer`],itemShapes:[{prop:`sequences`,text:`chars`,textAliases:[`sequence`,`seq`,`bases`,`residues`]}],propHints:{kind:`'dna'|'rna'|'protein' — which alphabet the reads use`,"sequences[].label":`a short read/sample/species name shown at the left of its row`,"sequences[].chars":`the aligned sequence itself; use '-' for a gap, same length across reads`,consensus:'any short label (e.g. "Consensus") to show a majority-vote row — the symbols shown are always computed from `sequences`, never taken from this string',highlightMismatches:`true tints any column where the reads disagree`}},voicestyle:{blurb:`Captures the user's personal writing voice as style-trait chips, then lands a before→after — the same line in a flat generic voice vs rewritten in the user's own voice (the rewrite is the emphasised payoff). For 'learn my voice / make it sound like me'.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`traits`,text:`trait`,textAliases:[`name`,`label`,`style`]}],propHints:{sample:`{ generic: string, inYourVoice: string } — the SAME line, generic vs in-the-user's-voice`,"traits[].example":`optional short snippet showing the trait in action`,iconColor:`var(--presence)|var(--insight)|var(--warning)`}},messagedraft:{blurb:`A polished email or message draft with subject, recipient, body, and tone chip — ready to copy and send.`,optional:[`icon`,`iconColor`,`to`,`from`,`greeting`,`closing`,`signature`,`tone`,`footer`],propHints:{tone:`'formal'|'casual'|'friendly'|'professional'|'apologetic'|'assertive'`,iconColor:`var(--presence)|var(--insight)|var(--warning)`}},chatthread:{blurb:"A realistic chat bubble thread — existing text messages or IM-style conversation, rendered as user/assistant speech bubbles with names and timestamps. For a scripted theatrical exchange between named characters, use `dialogue` instead.",optional:[`icon`,`iconColor`,`participants`,`footer`],itemShapes:[{prop:`messages`,text:`text`,textAliases:[`content`,`body`,`message`],requiredFields:[`role`]}],propHints:{"messages[].status":`'sent'|'delivered'|'read'|'error'`,"messages[].role":`'user'|'assistant'|'system'|'other'`}},dialogue:{blurb:`A script-style exchange between two named characters — teacher/student, interviewer/candidate, doctor/patient — alternating spoken lines with optional context header. Use for any "write a dialogue/conversation between X and Y" ask.`,optional:[`icon`,`iconColor`,`context`,`footer`],itemShapes:[{prop:`lines`,text:`text`,textAliases:[`content`,`dialogue`,`line`]}]},variants:{blurb:`Multiple text variants of the same message — three email rewrites with different tones, A/B subject lines, formal vs casual alternatives — each numbered with a label and optional note. Use whenever the ask is "write N versions/variants/alternatives of …".`,optional:[`icon`,`iconColor`,`prompt`,`footer`],itemShapes:[{prop:`variants`,text:`text`,textAliases:[`content`,`body`,`value`]}]},verse:{blurb:`A poem, song lyrics, or any stanza-structured literary text — with per-line indent, stanza labels, and form note.`,optional:[`icon`,`iconColor`,`form`,`footer`]},slidedeck:{blurb:`A presentation outline — one card per slide with title, bullets, speaker notes, and layout hint.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`slides`,text:`title`,textAliases:[`name`,`heading`,`label`]}],propHints:{"slides[].layout":`'title'|'content'|'quote'|'image'`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={screenplay:{blurb:`A scene typed in industry-standard screenplay format — sluglines (INT./EXT.), action, centred character cues, parentheticals, indented dialogue, and right-aligned transitions, in monospace. Use for any "write a screenplay/script scene" or "format this as a screenplay" ask.`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`elements`,text:`text`,textAliases:[`line`,`content`]}],propHints:{"elements[].kind":`'slug'|'action'|'character'|'parenthetical'|'dialogue'|'transition'`}},socialpost:{blurb:`A platform post preview — avatar, handle, and body rendered as X/LinkedIn/Instagram/Threads chrome, with a live character-count readout against that platform's limit. Use for "draft a tweet/post" or "write my LinkedIn update".`,optional:[`icon`,`iconColor`,`displayName`,`avatarInitial`,`timestamp`,`media`,`footer`],itemShapes:[{prop:`media`,text:`alt`,textAliases:[`caption`,`description`,`label`]}],propHints:{platform:`'x'|'linkedin'|'instagram'|'threads'|'generic'`,timestamp:`short relative or absolute label, e.g. '2h' or 'Jul 2'`,iconColor:`var(--presence)|var(--insight)|var(--warning)`}},insight:{blurb:`A headline number with optional delta and confidence — the primary insight unit.`,optional:[`summary`,`stat`,`delta`,`deltaDir`,`conf`,`sources`]},chart:{blurb:`Time-series trend chart with multiple series, areas, and optional axes.`,optional:[`unit`,`footer`,`conf`]},breakdown:{blurb:`A split of parts with percentages, values, tags, and heat indicators.`,optional:[`icon`,`iconColor`,`conf`]},timeline:{blurb:`Ordered steps or events with times, tags, and colors.`,optional:[`eyebrow`,`title`,`footer`]},list:{blurb:`A title with bullet points, tips, or plain-text items.`,optional:[`icon`,`iconColor`]},compare:{blurb:`Side-by-side options scored against criteria with a pick state and recommendation.`,optional:[`eyebrow`,`recommendation`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={ring:{blurb:`Concentric rings showing completion, health, or multi-metric progress.`,optional:[`icon`,`iconColor`,`footer`]},bars:{blurb:`Vertical bars with optional goal line and heat indicators.`,optional:[`icon`,`iconColor`,`unit`,`goal`,`goalLabel`,`footer`,`conf`]},stack:{blurb:`A horizontal bar split into colored segments with labels and totals.`,optional:[`icon`,`iconColor`,`total`,`footer`,`conf`]},scatter:{blurb:`X/Y point cloud with optional domains, trend line, and heat.`,optional:[`icon`,`iconColor`,`xLabel`,`yLabel`,`xDomain`,`yDomain`,`trend`,`footer`]},heat:{blurb:`A 2D grid of heat-colored cells with row/column headers and optional marks.`,optional:[`icon`,`iconColor`,`cols`,`levelColor`,`legend`,`footer`]},flow:{blurb:`A process or funnel with sequential steps, subtitles, and colors.`,optional:[`icon`,`iconColor`,`footer`]},web:{blurb:`Search results with titles, domains, excerpts, and optional live refresh.`,optional:[`title`,`live`,`footer`]},gallery:{blurb:`A grid of images with captions, tags, and optional headers.`,optional:[`title`,`eyebrow`,`footer`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={codemap:{blurb:`A central concept with related code nodes, notes, and heat.`,optional:[`title`,`footer`]},diff:{blurb:`A code diff with add/del counts and highlighted lines.`,optional:[`title`,`footer`]},checks:{blurb:`Test or validation results with pass/fail/skip status and notes.`,optional:[`title`,`summary`,`footer`]},donut:{blurb:`A pie or donut split into colored wedges with percentages.`,optional:[`icon`,`iconColor`,`size`,`thickness`,`footer`,`conf`]},gauge:{blurb:`A radial dial showing progress, NPS, or readiness with optional driver text.`,optional:[`icon`,`iconColor`,`max`,`size`,`color`,`band`,`driver`,`footer`,`conf`]},scoreboard:{blurb:`Sports game scores with away/home teams, status, and heat.`,optional:[`title`,`icon`,`iconColor`,`footer`]},standings:{blurb:`A league table with team, record, and games-behind columns.`,optional:[`title`,`icon`,`iconColor`,`footer`]},pipeline:{blurb:`A deal funnel or stage breakdown with volumes and optional metrics.`,optional:[`title`,`icon`,`iconColor`,`headline`,`sub`,`unit`,`suffix`,`footer`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={kpi:{blurb:`A grid of labeled stat cards (facts, metrics, values).`,optional:[`icon`,`iconColor`,`cols`,`footer`,`conf`],propHints:{"kpis[].trend":`'up'|'down'|'flat'|'none'`,"kpis[].status":`'good'|'warn'|'bad'|'neutral'`}},quotes:{blurb:`Customer testimonials or quotes with attribution and tone.`,optional:[`title`,`icon`,`iconColor`,`footer`]},checklist:{blurb:`A progress checklist with done/doing/todo items.`,optional:[`title`,`icon`,`iconColor`,`footer`]},understand:{blurb:`Cited learning points that users can correct, with confidence.`,optional:[`title`,`conf`,`footer`]},schema:{blurb:`An ER diagram showing entities, fields, and relationships.`,optional:[`title`,`relations`,`footer`]},screenmap:{blurb:`Wireframe thumbnails of generated screens (dashboard, table, detail, etc).`,optional:[`title`,`footer`]},buildprog:{blurb:`Build or creation steps with status and explanatory subtitles.`,optional:[`title`,`footer`]},preview:{blurb:`A live, clickable app the AI built—shows dashboard, table, board, and activity views.`,optional:[`seededFrom`,`groupColumns`,`pipelineLabel`,`agg`,`createdNote`,`activities`,`footer`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={diagramflow:{blurb:`Freeform diagram for processes, state machines, feedback loops, concept maps. nodes:[{id,label,sub?,kind?}], edges:[{from,to,label?,dashed?}] referencing node ids; layout:cycle|layered|free.`,optional:[`icon`,`iconColor`,`layout`,`footer`],propHints:{layout:`'cycle'|'layered'|'free'`,"nodes[].kind":`'default'|'start'|'accent'|'good'|'warn'|'muted' (drives the node's color)`,"edges[].kind":`'default'|'accent'|'good'|'warn'|'muted' (drives the link's color)`}},composite:{blurb:`Compose a NEW layout from 2+ existing blocks side by side when nothing single fits. regions:[{block:{type,props}, span?(1-12)}] — each block is any other type (chart, kpi, compare, …).`,optional:[`icon`,`iconColor`,`footer`]},sequencediagram:{blurb:`UML-style sequence diagram; actors exchange labelled messages with optional return arrows.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`actors`,text:`label`,textAliases:[`name`,`participant`,`title`]}],propHints:{"messages[].reply":`true for a dashed return arrow`,"messages[].self":`true for a self-call loop`}},statemachine:{blurb:`Directed-graph state machine; nodes are states, edges are transitions with trigger labels.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`states`,text:`label`,textAliases:[`name`,`state`,`title`]}],propHints:{"states[].start":`true to mark the entry state`,"states[].final":`true to mark an accepting/terminal state`}},erdiagram:{blurb:`Entity-relationship diagram; tables as boxes with typed fields, lines show cardinality.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`entities`,text:`label`,textAliases:[`name`,`table`,`entity`]}],propHints:{"entities[].fields[].key":`'pk'|'fk'`,"relationships[].fromCard":`'1'|'many'`,"relationships[].toCard":`'1'|'many'`}},circuitdiagram:{blurb:`Schematic circuit diagram with resistors, capacitors, voltage sources, and wire routing.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`components`,text:`label`,textAliases:[`name`,`id`,`value`]}],propHints:{"components[].kind":`'battery'|'resistor'|'capacitor'|'bulb'|'switch'|'ground'|'node'`,"components[].x":`position 0..100 on the canvas`,"components[].y":`position 0..100 on the canvas`}},controlblockdiagram:{blurb:`A control-systems block diagram: transfer-function blocks as labeled rectangles joined by directional signal wires, with a summing junction drawn as a small +/- circle. Blocks auto-place left-to-right by graph order when x/y are omitted; a wire marked feedback routes as a rectangular loop back to an earlier block. Use for "draw the PID control loop", "block diagram of a thermostat", closed-loop transfer functions, feedback-control coursework.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`blocks`,text:`label`,textAliases:[`name`,`id`]}],propHints:{"blocks[].kind":`'block'|'sum' — 'block' is a labeled transfer-function rectangle, 'sum' is a summing junction`,"blocks[].x":`optional position 0..100; omit both x and y to auto-place left-to-right`,"blocks[].y":`optional position 0..100; omit both x and y to auto-place left-to-right`,"wires[].sign":"'plus'|'minus' — only meaningful when the wire's `to` is a sum block; default plus","wires[].feedback":`true to route this wire as a rectangular loop back to an earlier block, instead of a straight line`}},fiveforces:{blurb:`Porter's Five Forces: a central Industry Rivalry hub with four satellite forces (new entrants, suppliers, buyers, substitutes) ringed around it; connector thickness and color track each force's rated strength. Use for a competitive-strategy analysis, "should we enter this market", an industry-structure teardown.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`forces`,text:`label`,textAliases:[`name`,`force`,`title`]}],propHints:{"forces[].id":`'rivalry'|'newEntrants'|'suppliers'|'buyers'|'substitutes' — exactly one of each`,"forces[].strength":`'low'|'medium'|'high'`,"forces[].note":`a short line of supporting context, shown under the label`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={fivewhychain:{blurb:`A 5-Whys root-cause chain: a problem card, then a vertical stack of why→answer cards drilling one level deeper each step, ending on an accent-highlighted root cause. Use for an incident postmortem, a root-cause investigation, "why did this actually happen".`,optional:[`icon`,`iconColor`,`rootCause`,`footer`],itemShapes:[{prop:`whys`,text:`answer`,textAliases:[`text`,`reason`,`because`]}],propHints:{"whys[].question":`the "why" question this step asks, e.g. "Why did the build fail?"`,rootCause:`an explicit closing statement appended as its own card; omit to highlight the last why instead`}},sysarchdiagram:{blurb:`A system-design whiteboard diagram: each node kind is a distinct SHAPE, not just a color — database is a cylinder, queue is a stacked rectangle, cache is a rounded diamond, loadbalancer is a hexagon; client/service/gateway/cdn share a rounded-rectangle silhouette told apart by a small inline icon. Auto-laid-out left-to-right by the edge graph. Use for "draw the system architecture", "whiteboard this design", a load-balanced web service, a CQRS/event pipeline, a CDN-fronted API, system-design-interview walkthroughs.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`nodes`,text:`label`,textAliases:[`name`,`id`]}],propHints:{"nodes[].kind":`'client'|'loadbalancer'|'service'|'database'|'cache'|'queue'|'gateway'|'cdn'`,"nodes[].sub":`optional second line — an instance count, a tech name, a region`,"edges[].label":`what the connection does, e.g. "writes", "cache-aside"`,"edges[].protocol":`the wire protocol, e.g. "HTTPS", "gRPC", "TCP:5432"`}},datapipeline:{blurb:`An ETL/data-pipeline lineage diagram: offline batch data flow from a source through transform steps to a sink or intermediate store, each drawn as a distinct shape — source is a rounded rectangle with an inbound-arrow glyph, transform is a hexagon, sink/store share a database-cylinder silhouette told apart by a small icon. Auto-laid-out left-to-right by the edge graph. Distinct from sysarchdiagram (a live request/response service architecture) — this is where data comes from and what happens to it on the way to rest. Use for "draw the ETL pipeline", "how does data flow from raw logs to the feature store", a training-data pipeline, an ELT/batch-ingestion diagram.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`stages`,text:`label`,textAliases:[`name`,`id`]}],propHints:{"stages[].kind":`'source'|'transform'|'sink'|'store'`,"stages[].sub":`optional second line — a tech name, a cadence, a row count`,"edges[].label":`what happens on this hop, e.g. "dedup", "join labels", "batch insert"`}},threatmodel:{blurb:`A STRIDE cybersecurity threat model: dashed trust-boundary rects host labeled asset chips (process/datastore/external-entity), a small marker on each threatened asset is red for an open threat and muted for a mitigated one, and a full threat register lists every entry below. Use for a system security review, "what could go wrong with this design", an architecture threat-model writeup.`,optional:[`icon`,`iconColor`,`boundaries`,`footer`],itemShapes:[{prop:`assets`,text:`name`,textAliases:[`label`,`title`]},{prop:`boundaries`,text:`label`,textAliases:[`name`,`title`]}],propHints:{"assets[].kind":`'process'|'datastore'|'external-entity'`,"boundaries[].contains":`asset ids hosted inside this trust boundary`,"threats[].assetId":`the id of the asset this threat targets`,"threats[].stride":`'spoofing'|'tampering'|'repudiation'|'info-disclosure'|'dos'|'elevation'`,"threats[].status":`'mitigated'|'open' — missing/unrecognized reads as open`}},foodweb:{blurb:`An ecological food web: organisms sit in horizontal tier bands (lowest trophic level at the bottom), joined by curved arrows from prey to predator. Distinct from pyramidtiers (an abstract biomass/energy pyramid with no individual organisms) — this is the actual who-eats-whom graph. Use for a food chain / food web diagram, an ecosystem teardown, "what eats what here".`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`organisms`,text:`label`,textAliases:[`name`,`species`]}],stringItems:[`tiers`],propHints:{tiers:`tier names, lowest trophic level first, e.g. ["Producers", "Primary consumers", "Apex predators"]`,"organisms[].tier":`index into tiers, 0 = lowest`,"links[].from":`prey organism id — the arrow starts here`,"links[].to":`predator organism id — the arrow points here`}},recursiontree:{blurb:`A call-stack / recursion tree: a single root call fans out into its own recursive children (n-ary, tidy top-down layout, never overlapping). Each node shows its call signature; once resolved, a small corner badge shows the returned value. Classic use: naive recursive fibonacci, factorial, the call tree behind a memo table.`,optional:[`icon`,`iconColor`,`footer`],propHints:{"root.call":`the call signature, e.g. "fib(4)"`,"root.result":`the value this call returned, once resolved; omit while still open`,"root.children":`this call's own recursive calls, in call order; omit/empty for a base case`}},primefactortree:{blurb:`A prime-factorization tree: a non-prime number splits into its factors, recursively, until every leaf is prime (a prime leaf gets a colored ring); tidy top-down layout, never overlapping. The full factorization line under the tree is computed from the leaves themselves. Use for teaching factor trees, "factor this number", a number-theory walkthrough.`,optional:[`icon`,`iconColor`,`footer`],propHints:{nodes:`a one-element array holding the root PrimeFactorNode: { value, isPrime, children? }`,"nodes[].children":`this non-prime value's factor pair (or more); omit/empty once value is prime`}},nnarchitecture:{blurb:`A layered neural-network diagram: one column of nodes per layer, edges drawn only between adjacent layers (dense or a lighter sparse band). A wide layer is capped at a readable visual maximum with a "+N more" indicator rather than one dot per unit. An optional single-unit highlight traces what feeds it and what it feeds forward. Use for "draw a 3-layer MLP", "what does this network architecture look like", explaining forward pass and layer width.`,optional:[`icon`,`iconColor`,`connections`,`highlight`,`footer`],itemShapes:[{prop:`layers`,text:`name`,textAliases:[`label`,`id`]}],propHints:{"layers[].units":`unit count for that layer; very wide layers are capped visually, never rendered one dot per unit`,"layers[].activation":`e.g. "ReLU", "softmax" — shown under the layer`,connections:`'dense'|'sparse' — dense connects every visible node to every next-layer node, sparse a lighter local band. Default dense.`,"highlight.layer":`0-based index into layers`,"highlight.unit":`0-based index into that layer's units`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={synthesisroute:{blurb:`A multi-step chemical synthesis route: compound nodes auto-laid-out left-to-right by graph rank, supporting real branching — several precursors converging into one product, or one intermediate fanning out into several targets — which a single linear reaction-mechanism block cannot express. Each arrow carries its reagents/conditions above and a yield percentage below; a retrosynthetic disconnection (direction retro) draws as a dashed hollow arrow. Use for a total-synthesis route, a convergent synthesis, retrosynthetic analysis.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`nodes`,text:`label`,textAliases:[`name`,`compound`,`formula`]}],propHints:{"nodes[].label":`compound name or formula; plain text (SVG), use unicode subscripts like "C₆H₆" rather than HTML markup`,"nodes[].smiles":`optional SMILES string, shown as a small line under the label`,"nodes[].role":`'start'|'intermediate'|'target'`,"edges[].reagents":`reagent(s) driving this step, e.g. "PhMgBr" — shown above the arrow`,"edges[].conditions":`e.g. "THF, 0°C" — shown above the arrow alongside reagents`,"edges[].yieldPct":`isolated yield for this step, 0..100 — shown below the arrow`,"edges[].direction":`'forward'|'retro' — retro draws a dashed hollow arrow FROM the target TO its precursor (a retrosynthetic disconnection); from/to follow that reasoning direction, the reverse of a forward precursor→product step. Default forward.`}},plasmidmap:{blurb:`A circular plasmid vector map: the backbone is a ring where base position maps to angle (0 bp at 12 o'clock, clockwise); genes/promoters/terminators/markers draw as colored arcs along their bp span with an optional strand arrow, restriction sites are radial tick+enzyme-name marks, and the origin of replication gets a distinct marker. Use for a cloning vector, an expression plasmid, "map this plasmid", restriction-digest planning.`,optional:[`icon`,`iconColor`,`origin`,`footer`],itemShapes:[{prop:`features`,text:`name`},{prop:`sites`,text:`name`,textAliases:[`enzyme`]}],propHints:{sizeBp:`total plasmid length in base pairs`,"features[].startBp":`base-pair position this feature starts at, 0..sizeBp`,"features[].endBp":`base-pair position this feature ends at; wraps if it crosses bp 0`,"features[].kind":`'gene'|'promoter'|'terminator'|'marker'`,"features[].strand":`'plus'|'minus' — draws a small directional arrowhead; omit for none`,"sites[].posBp":`base-pair position of the restriction site`,"sites[].cutsOnce":`true for a unique (single-cut) site`,"origin.posBp":`base-pair position of the origin of replication`}},argumentmap:{blurb:`An argument map — a central claim with supporting premises, objections, and qualifiers. Use for "analyze this argument", "pros and cons", policy debates, or Socratic dialogue.`,optional:[`icon`,`iconColor`,`verdict`,`footer`],itemShapes:[{prop:`premises`,text:`text`,textAliases:[`premise`,`point`,`reason`]}],propHints:{"premises[].type":`"support"|"objection"|"qualifier"`}},toulmin:{blurb:`A Toulmin argument diagram — the six roles of a full argument: Claim, Grounds (evidence), Warrant (the link), Backing (support for the warrant), Qualifier (degree of certainty), Rebuttal (the exception). Use for "break this argument down with the Toulmin model", "what are the grounds and warrant here?". Reads Grounds → Warrant/Backing → (Qualifier) Claim, with the Rebuttal branching off. Prefer over argumentmap only when the ask names the Toulmin roles.`,optional:[`title`,`icon`,`iconColor`,`backing`,`qualifier`,`rebuttal`,`footer`],propHints:{claim:`the conclusion the argument tries to establish`,grounds:`the data / evidence the claim rests on`,warrant:`the general principle linking the grounds to the claim ("since …")`,backing:`optional support for the warrant itself ("on account of …")`,qualifier:`optional degree of certainty, e.g. "presumably", "almost certainly"`,rebuttal:`optional condition under which the claim would NOT hold ("unless …")`}},castmap:{blurb:`A character / relationship map — people (or entities) as nodes on a ring, joined by typed, labeled edges (ally, rival, family, love, mentor, betrays). Use for a novel or show cast, factions and alliances, an org or stakeholder web. Unlike a plain network, the edge KIND drives the color and factions tint and cluster the nodes.`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`nodes`,text:`name`,textAliases:[`label`,`character`,`person`]}],propHints:{"nodes[].id":`stable id the links reference`,"nodes[].role":`optional one-line role/title under the name, e.g. "protagonist"`,"nodes[].faction":`optional group/side name; same-faction nodes share a tint and cluster on the ring`,"links[].kind":`'ally'|'rival'|'family'|'love'|'mentor'|'betrays'|'other' (drives the edge color; mentor/betrays are drawn directed)`,"links[].label":`optional short relationship word drawn on the edge, e.g. "married", "rivals"`,links:`from/to reference node ids; an edge to a missing id is dropped`}},probabilitytree:{blurb:`A branching probability tree for sequential events. Shows each branch with its probability and computed leaf outcomes. Use for genetics, decision analysis, conditional probability, and Bayesian reasoning.`,optional:[`icon`,`iconColor`,`note`],propHints:{"branches[].label":`first-level event label, e.g. "Heads"`,"branches[].prob":`probability 0–1, e.g. 0.5`,"branches[].children":`array of {label, prob, outcome?} leaf nodes`}},datastructure:{blurb:`CS data-structure diagram: arrays/linked lists/stacks/queues as cells, or a binary tree/BST/heap laid out from the data. Pick for "show me a BST", "how a queue works", algorithm walkthroughs.`,optional:[`icon`,`iconColor`,`cells`,`nodes`,`level`,`pointers`,`highlight`,`footer`],itemShapes:[{prop:`nodes`,text:`value`,textAliases:[`val`,`key`,`label`]}],propHints:{kind:`'array'|'linkedlist'|'stack'|'queue'|'tree'|'bst'|'heap'`,cells:`ordered values for linear kinds; stack index 0 = bottom, queue index 0 = front`,"nodes[]":`{id, value, left?, right?} for tree/bst/heap; left/right reference child ids`,level:`level-order array form of a binary tree (2i+1 / 2i+2 are children; null = hole)`,"pointers[]":`{index, label} markers above array cells, e.g. {index:2,label:"i"}`,highlight:`index (linear) or node id (tree) of the element to spotlight`}},causationchain:{blurb:`A causation chain — multiple causes → a central event → multiple consequences, read left→right, with short-term vs long-term grouping and connectors weighted by strength. Use for the causes & effects of a historical event/war/revolution, root-cause analysis, or policy impact. Unlike a generic node/edge flow graph, this is specifically the cause→event→effect shape.`,optional:[`icon`,`iconColor`,`causesLabel`,`consequencesLabel`,`footer`],itemShapes:[{prop:`causes`,text:`label`,textAliases:[`cause`,`factor`,`driver`,`name`]},{prop:`consequences`,text:`label`,textAliases:[`consequence`,`effect`,`result`,`name`]}],propHints:{"event.label":`the pivotal central event everything points to / flows from`,"causes[].weight":`relative strength 0..1 (thicker, more opaque connector); default 0.5`,"causes[].term":`"short"|"long" — short- vs long-term horizon; omit if unclassified`,"consequences[].weight":`relative strength 0..1; default 0.5`,"consequences[].term":`"short"|"long"; omit if unclassified`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={protocolstack:{blurb:`Layered network/protocol stack (OSI / TCP-IP) beside a packet-encapsulation view; layers carry protocol chips, headers nest around the payload.`,optional:[`title`,`icon`,`iconColor`,`packet`,`caption`,`footer`],itemShapes:[{prop:`layers`,text:`name`,textAliases:[`label`,`layer`,`title`]},{prop:`packet`,text:`header`,textAliases:[`label`,`name`,`segment`]}],propHints:{layers:`top of the array = top of the model (Application); last = link/physical`,"layers[].protocols":`array of protocol/standard names rendered as chips, e.g. ["HTTP","DNS"]`,packet:`encapsulation headers, OUTERMOST first → innermost payload last, e.g. Ethernet, IP, TCP, HTTP, Data`,"packet[].layer":`matches a layers[].name so hovering a band lights its header`}},wiringdiagram:{blurb:`Residential/automotive one-line wiring diagram drawn with real trade symbols (breaker, switch, 3-way, GFCI, outlet, light, panel); wires are color-coded by conductor (hot/neutral/ground/traveler) with gauge labels. Auto-laid out on a grid when x/y are omitted. Use for wiring a circuit, a 3-way switch loop, a GFCI-protected outlet, a service-panel one-line.`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`nodes`,text:`label`,textAliases:[`name`,`id`,`device`]}],propHints:{"nodes[].kind":`'breaker'|'switch'|'switch3way'|'outlet'|'gfci'|'light'|'panel'|'motor'|'ground'|'junction'`,"nodes[].x":`optional position 0..100 on the canvas; omit to auto-grid`,"nodes[].y":`optional position 0..100 on the canvas; omit to auto-grid`,"wires[].conductor":`'hot'|'neutral'|'ground'|'traveler' — colors the run (default 'hot')`,"wires[].gauge":`wire gauge label, e.g. "12 AWG"`}},pipingschematic:{blurb:`P&ID-lite piping/HVAC/hydraulic flow schematic; standard process glyphs (tank, pump, valve, heater, filter, instrument, fitting) joined by routed lines with optional flow-direction arrows and line-size labels. Auto-laid out on a grid when coords are absent. Use for a heating loop, a pump-and-filter circuit, a closed-loop HVAC diagram.`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`components`,text:`label`,textAliases:[`name`,`id`,`tag`]}],propHints:{"components[].kind":`'pipe'|'valve'|'pump'|'tank'|'heater'|'filter'|'fitting'|'sensor'`,"components[].x":`optional position 0..100; omit to auto-grid`,"components[].y":`optional position 0..100; omit to auto-grid`,"lines[].flow":"true to draw a flow-direction arrowhead toward `to`","lines[].size":`line-size label, e.g. "DN50" or 2 inch`}},logicgates:{blurb:`Digital-logic circuit of standard gate symbols (AND/OR/NOT/NAND/NOR/XOR/XNOR) wired input to output; signal values are shown on wires (green=1, muted=0) and an optional adjacent truth table highlights the live input row. Gate outputs are evaluated from the inputs. Use for a half-adder, a multiplexer from gates, explaining XOR/NAND.`,optional:[`title`,`icon`,`iconColor`,`output`,`truth`,`caption`,`footer`],itemShapes:[{prop:`inputs`,text:`label`,textAliases:[`name`,`id`,`signal`]}],propHints:{"inputs[].value":`0|1 — current logic level on this input (default 0)`,"gates[].kind":`'AND'|'OR'|'NOT'|'NAND'|'NOR'|'XOR'|'XNOR'`,"gates[].inputs":`array of source ids (each an input id or another gate id)`,"output.from":`the gate or input id wired to the output pin`,truth:`optional rows: { row:[0,1,...] in inputs order, out:0|1 }`}},algorithmtrace:{blurb:`Interactive step-through of an algorithm over an array; a prev/next stepper recolors highlighted/compared/swapped cells and draws labeled pointer carets (i, j, lo, hi) under cells with a per-step caption. Use for tracing bubble sort, binary search, two-pointer walks, an algorithm walkthrough.`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`steps`,text:`caption`,textAliases:[`label`,`description`,`note`]}],propHints:{values:`the array the algorithm runs over (numbers or short strings)`,complexity:`'o-1'|'o-logn'|'o-n'|'o-nlogn'|'o-n2'|'o-2n' — time-complexity badge shown next to the title`,"steps[].highlight":`array of 0-based indices to emphasize (the active window)`,"steps[].compare":`array of indices being compared this step`,"steps[].swapped":`array of indices swapped this step`,"steps[].pointer":`object of named pointers to the index they sit under, e.g. { i: 2, j: 3, lo: 0, hi: 6 }`}},dptable:{blurb:`A 2-D dynamic-programming memoization table with interactive step-through: each step highlights the cell being computed (presence tint) and its recurrence dependencies (insight tint). Use for LCS, edit distance, knapsack, coin change — any DP problem where seeing the table fill in is the "aha" moment. The model supplies rows/cols/cells (the full grid) plus an optional recurrence formula and ordered steps. Never for a plain data table (use datatable).`,optional:[`title`,`icon`,`iconColor`,`recurrence`,`steps`,`highlight`,`path`,`footer`],itemShapes:[{prop:`steps`,text:`caption`,textAliases:[`label`,`description`]}],stringItems:[`rows`,`cols`],propHints:{rows:`row header labels, e.g. ["", "A", "B", "C"] — include a corner sentinel as needed`,cols:`column header labels, e.g. ["", "0", "1", "2", "3"]`,cells:`2-D array cells[row][col]; null = unfilled. Provide the fully-filled final grid.`,recurrence:`recurrence formula shown above the table, e.g. "dp[i][j] = dp[i-1][j-1]+1"`,"steps[].current":`[row, col] 0-based index of the cell being computed (presence tint)`,"steps[].deps":`array of [row, col] pairs this step reads from (insight tint)`,"steps[].caption":`what is happening at this step`}},cyclewheel:{blurb:`An illustrated closed loop — 3-8 stages spaced evenly around a ring, each an icon + label + short caption, joined by curved arrows that flow one into the next and back to the first. Use for the water cycle, a butterfly/cell life cycle, the carbon/nitrogen/rock cycle, a product or feedback loop. Unlike a one-directional flow, the loop closes back to the start.`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`stages`,text:`label`,textAliases:[`name`,`stage`,`phase`,`step`]}],propHints:{stages:`in loop order; the last stage arcs back to the first (3-8 read best)`,"stages[].caption":`optional one-line gloss of what happens at this stage`,"stages[].icon":`optional glyph key, e.g. 'sun'|'cloud'|'rain'|'globe'; falls back to a numbered token`}},hashtable:{blurb:`A hash table with separate-chaining collision resolution: a vertical bucket array on the left, horizontal linked-list chains extending right from each non-empty bucket, with the hash function label above. Use for "how does a hash map work", collision walkthroughs, load-factor discussions. The component auto-hashes keys unless an explicit bucket index is given. Never for a plain key-value list.`,optional:[`title`,`icon`,`iconColor`,`hashFn`,`highlight`,`footer`],propHints:{size:`number of buckets in the table, e.g. 7 (capped at 8 visually)`,entries:`key-value pairs: [{ key, value?, bucket? }]`,hashFn:`display label for the hash function, e.g. "h(k) = k mod 7"`,highlight:`the key to spotlight (presence accent) in its chain`,"entries[].bucket":`optional explicit 0-based bucket index; otherwise auto-computed`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={trie:{blurb:`A prefix tree (trie) drawn from a list of words: each edge carries its character, end-of-word nodes get a double ring, and an optional highlight word traces the full insertion path from root to leaf in the presence accent. Use for "how does autocomplete work", "show a prefix tree for these words", trie algorithm interview walkthroughs. Never for a binary tree — use binarytree for that.`,optional:[`title`,`icon`,`iconColor`,`highlight`,`footer`],stringItems:[`words`],propHints:{words:`words to insert into the trie (max ~10 short words for readability)`,highlight:`the word whose path from root to leaf to trace in the presence accent`}},graphtrace:{blurb:`Interactive BFS/DFS step-through on a graph: nodes colour-coded by traversal state — current (presence), frontier/queue (warning), visited (muted), unvisited (default) — with Prev/Next controls and a live queue/stack panel. Use for "walk me through BFS", "show DFS step by step". Never for a static graph — use network; for array-algorithm step-throughs use algorithmtrace.`,optional:[`title`,`icon`,`iconColor`,`algorithm`,`footer`],itemShapes:[{prop:`nodes`,text:`label`,textAliases:[`id`,`name`]}],propHints:{"nodes[]":`{ id, label?, x?, y? } — x/y in 0..100 units; omit to auto-ring`,"edges[]":`{ from, to, weight?, directed? }`,"steps[]":`{ caption, current?, visited?, frontier? } — ids of nodes in each state`,algorithm:`'bfs' (default, shows Queue:) or 'dfs' (shows Stack:)`}},binarytree:{blurb:`A binary tree with optional interactive step-through traversal: nodes are laid out via inorder x-position + depth y (tidy-tree geometry, never overlapping). An optional steps array drives a Prev/Next stepper that re-colours nodes — visiting (presence), visited (muted), found (insight) — and shows a BFS queue / DFS stack plus an accumulating traversal result. Use for "trace BST search", "show inorder/preorder traversal", "walk me through BFS on a tree", heap diagrams, and FAANG tree interview walkthroughs. Never for a general graph — use graphtrace; for a node-link diagram use datastructure.`,optional:[`title`,`icon`,`iconColor`,`steps`,`caption`,`footer`],propHints:{nodes:`{ id, value, left?, right? } — left/right are node ids; order does not matter`,root:`id of the root node`,"steps[].states":`map of node id → "default"|"visiting"|"visited"|"found"|"highlight"`,"steps[].frontier":`queue or stack contents at this step (node value labels)`,"steps[].result":`accumulated traversal result so far (node value labels)`,"steps[].caption":`what is happening in this step`}},sortingviz:{blurb:`Animated bar-chart sorting visualizer: each step carries a full array snapshot so bars change height and colour at every algorithm step — compared (warning), swapped (insight), sorted (presence), pivot (danger for quicksort). Play/pause + 3 speed levels; comparison + swap counters. Use for "show bubble sort", "walk me through merge sort", "compare sorting algorithms". Never for a static array (use algorithmtrace).`,optional:[`title`,`icon`,`iconColor`,`complexity`,`footer`],itemShapes:[{prop:`steps`,text:`caption`,textAliases:[`label`,`description`]}],propHints:{algorithm:`human-readable algorithm name, e.g. "Bubble Sort" or "Quick Sort"`,complexity:`'o-1'|'o-logn'|'o-n'|'o-nlogn'|'o-n2'|'o-2n' — shown as a badge`,values:`initial array (used when steps is empty for static display)`,"steps[].values":`full array snapshot at this step (drives bar heights)`,"steps[].compared":`indices being compared (warning accent)`,"steps[].swapped":`indices just swapped (insight accent)`,"steps[].sorted":`indices confirmed in final position (presence, permanent)`,"steps[].pivot":`pivot index for quicksort (danger accent)`}},gridtrace:{blurb:`A 2-D grid visualizer for BFS/DFS, flood-fill, and grid-DP problems. Each step carries a full grid snapshot where every cell is coloured by state: empty (white), wall (dark), start (presence), end (insight), current (presence bright), queued/in-queue (warning), visited (muted), path (insight). Optional value labels show distances or costs. Play/pause + 3 speeds. Use for "BFS shortest path on a grid", "island counting", "flood fill", "word search", "rotting oranges", any grid-based FAANG interview problem. Never for a general graph without a grid structure (use graphtrace).`,optional:[`title`,`icon`,`iconColor`,`algorithm`,`rows`,`cols`,`footer`],itemShapes:[{prop:`steps`,text:`caption`,textAliases:[`label`,`description`]}],propHints:{algorithm:`algorithm label shown in badge, e.g. "BFS", "DFS", "Flood Fill"`,"steps[].grid":`2-D array (rows × cols) of {state, value?} — state is one of: empty|wall|start|end|current|queued|visited|path`,"steps[].grid[r][c].state":`'empty'|'wall'|'start'|'end'|'current'|'queued'|'visited'|'path'`,"steps[].grid[r][c].value":`optional label (distance, cost, character, 0/1)`}},tournamentbracket:{blurb:`A single-elimination tournament bracket: one column per round, joined by SVG elbow connectors — every matchup's position is computed from its round + slot (never authored), so it self-centers automatically as rounds advance. A decided matchup bolds and tints the winner's name and mutes the loser's; an open slot shows "TBD", a walkover shows "BYE". Use for "show the bracket", playoff brackets, single-elimination sports/esports draws, and elimination-style debate or business-case competitions. SHIPS SINGLE-ELIMINATION ONLY this pass — \`double\` is a reserved prop for a future losers-bracket rendering; setting it true only labels the view, it does NOT draw a losers bracket, so never promise one from it. Never for a round-robin or league table — use standings or leaderboard for that.`,optional:[`icon`,`iconColor`,`double`,`footer`],stringItems:[`rounds`],propHints:{rounds:`round names in order, e.g. ["Round of 16", "Quarterfinal", "Semifinal", "Final"]`,"matchups[].round":`0-based index into rounds — which column this matchup sits in`,"matchups[].slot":`0-based position within the round, top to bottom`,"matchups[].a":`first competitor; omit for a not-yet-decided slot`,"matchups[].b":`second competitor; omit for a bye or not-yet-decided slot`,"matchups[].winner":`"a" or "b" once the matchup is decided; omit while pending`,double:`reserved for a future losers-bracket view — leave false; setting it true does not render one`}},prooftree:{blurb:`A Gentzen-style natural-deduction proof tree: premises stack above an inference bar with the rule name at its right, the conclusion sits below, and a bracketed leaf like "[P]" renders as a discharged assumption. Built from a FLAT steps list — each step cites the ids it is inferred from — and the tree assembles and centres itself. Use for propositional/predicate-logic derivations, "prove Q ∧ R from these premises", natural-deduction or sequent-calculus homework. Never for geometry statements/reasons proofs — use twocolumnproof.`,optional:[`icon`,`iconColor`,`conclusionId`,`footer`],itemShapes:[{prop:`steps`,text:`statement`,textAliases:[`text`,`formula`,`sequent`]}],propHints:{"steps[].id":`stable id other steps cite in their from lists`,"steps[].statement":`the formula this line asserts, e.g. "P → Q"; wrap a discharged assumption in square brackets, e.g. "[P]"`,"steps[].rule":`the inference rule shown at the bar, e.g. '∧I', '→E', 'MP', 'RAA'`,"steps[].from":`ids of the premise steps this line follows from; omit for a leaf premise/assumption`,conclusionId:`id of the final conclusion; defaults to the step no other step cites`}},fishbone:{blurb:`An Ishikawa fishbone cause-effect diagram: the effect sits in a head box at the right of a horizontal spine, category ribs alternate above and below at ~60°, and each rib carries its causes as short twigs. Categories are whatever the analysis used — the classic 6M set or any custom grouping, up to 8 ribs. Use for "why does this defect keep happening", a quality-control teardown, a project retro on a recurring failure. Never for a linear why chain — use fivewhychain. Never for a MECE breakdown tree — use issuetree.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`categories`,text:`label`,textAliases:[`name`,`category`,`title`]}],propHints:{effect:`the problem/outcome under investigation, shown in the head box at the right`,"categories[].causes":`array of short cause phrases drawn as twigs off the rib, most prominent first (2-5 read best)`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={classdiagram:{blurb:`A UML class diagram: class boxes with the three standard compartments (name with an italic «stereotype», fields, methods), auto-layered so parents sit above their subclasses, joined with proper UML arrowheads — hollow triangle for inheritance (dashed when implements), filled diamond for composition, hollow diamond for aggregation, dashed open arrow for dependency, plain line for association. Use for "diagram these classes", OOP design teaching, design-pattern structure (Strategy, Observer), refactoring discussions. Never for database tables and relationships — use erdiagram.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`classes`,text:`name`,textAliases:[`label`,`class`,`title`]}],propHints:{"classes[].name":`the class name — also the key relations reference in from/to`,"classes[].stereotype":`'interface' | 'abstract' | 'enum' — omit for a concrete class`,"classes[].fields":`field lines as plain strings, e.g. "+ radius: number"`,"classes[].methods":`method lines as plain strings, e.g. "+ area(): number"`,"relations[].kind":`'inheritance' | 'implements' | 'composition' | 'aggregation' | 'association' | 'dependency'`,"relations[].from":`the child/client class for inheritance, implements, and dependency; the WHOLE (diamond end) for composition/aggregation`,"relations[].to":`the parent for inheritance/implements (triangle end), the part for composition/aggregation, the supplier for dependency`,"relations[].label":`optional short caption at the line midpoint, e.g. a multiplicity`}},avatar:{blurb:`User avatar with name, initials, or image; clickable to cycle size and presence status.`,optional:[`icon`,`iconColor`,`name`,`src`,`glyph`,`initials`,`size`,`status`,`ring`,`color`,`role`,`footer`],propHints:{status:`'online'|'away'|'busy'|'offline' (presence dot)`,size:`'sm'|'md'|'lg'`}},avatargroup:{blurb:`Overlapping stack of avatars with +N overflow; hover to see all members.`,optional:[`icon`,`iconColor`,`max`,`size`,`caption`,`footer`],itemShapes:[{prop:`members`,text:`name`,textAliases:[`label`,`title`]}],propHints:{"members[].status":`'online'|'away'|'busy'|'offline'`}},badgeset:{blurb:`Short status/label badges in soft/outline/dot/solid variants with an optional count notification (statuses, tags, counts). Never for key→value facts — use deflist or kpi.`,optional:[`icon`,`iconColor`,`countIcon`,`count`,`countColor`,`footer`],itemShapes:[{prop:`badges`,text:`label`,textAliases:[`name`,`text`,`title`]}],propHints:{"badges[].variant":`'solid'|'soft'|'outline'|'dot'`}},chipset:{blurb:`Selectable and removable tags with icons or avatars; single or multi-select.`,optional:[`icon`,`iconColor`,`mode`,`summary`,`color`,`footer`],itemShapes:[{prop:`chips`,text:`label`,textAliases:[`name`,`text`,`title`]}]},kbd:{blurb:`Actual KEYBOARD shortcuts shown as key-caps (⌘K, Ctrl+C) with hover highlight. Never for generic key→value facts or labels — use deflist or kpi.`,optional:[`icon`,`iconColor`,`active`,`color`,`footer`],itemShapes:[{prop:`shortcuts`,text:`label`,textAliases:[`name`,`title`,`action`]}]},codeblock:{blurb:'Real syntax-highlighted code. Put the raw source in `code` (one string, with real newlines) and the language in `lang` (e.g. "ts", "python", "rust") — we highlight it. Do NOT pre-tokenize or escape it.',optional:[`icon`,`iconColor`,`lang`,`filename`,`lines`,`lineNumbers`,`highlight`,`runnable`,`footer`],propHints:{runnable:`true ONLY for a complete dependency-free JavaScript/TypeScript snippet that needs no imports, DOM/browser APIs, server globals, credentials, or omitted setup; otherwise omit (default false)`}},banner:{blurb:`Full-width banner alert or promo with tone, action button, and dismiss.`,optional:[`icon`,`iconColor`,`tone`,`bannerIcon`,`detail`,`action`,`dismissible`,`footer`],propHints:{tone:`'info'|'success'|'warning'|'promo' (also sets the default banner icon)`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={toaststack:{blurb:`Stacked toast notifications with auto-dismiss and a push button to cycle through a pool.`,optional:[`icon`,`iconColor`,`pool`,`duration`,`pushLabel`,`footer`],itemShapes:[{prop:`toasts`,text:`title`,textAliases:[`label`,`name`,`heading`]}],propHints:{"toasts[].kind":`'success'|'error'|'info'|'warning'`}},spinner:{blurb:`Animated spinners, indeterminate bar, and loading button; click to toggle state.`,optional:[`icon`,`iconColor`,`caption`,`buttonLabel`,`loadingLabel`,`color`,`footer`]},notification:{blurb:`Notification list with avatars, time-ago stamps, unread dots, and mark-all-read action.`,optional:[`icon`,`iconColor`,`markAllLabel`,`footer`],itemShapes:[{prop:`items`,text:`title`,textAliases:[`label`,`name`,`heading`,`text`]}]},eligibilitycheck:{blurb:`Rules judged against MY situation: each requirement gets a met / not-met / needs-info verdict vs the user’s stated facts, the specific gap named and how to confirm it, then an honest "likely qualify / do not yet / depends" overall and a "verify with the official source" caveat. For "do I qualify for X" (grants, loans, programs, roles); a checklist only lists items to tick, this weighs each rule against real facts.`,optional:[`icon`,`iconColor`,`overall`,`caveat`,`footer`],itemShapes:[{prop:`requirements`,text:`rule`,textAliases:[`requirement`,`criterion`,`label`,`text`]}],propHints:{"requirements[].status":`'pass'|'fail'|'needs-info' — pass only when the stated facts clearly meet it, needs-info when a required fact is unknown`,"requirements[].detail":`how this rule was judged against the situation, citing the stated fact`,"requirements[].fix":`for a fail: what would make it qualify; for needs-info: how to confirm the missing fact`,overall:`'likely'|'not-yet'|'depends' — use 'depends' whenever any rule is needs-info`,caveat:`a "verify with the official source" reminder — this is guidance, not an official ruling`}},evidencetrace:{blurb:`The raw records behind a claim or number — the headline claim up top, then the literal underlying data enumerated verbatim (real quotes/rows/tickets), each with its source and timing, plus an honest provenance line ("12 of 240 customers"). The "how do you KNOW that — show me" surface; renders only real given records, never invented ones. Pick over sourcelist (ranked links, not the data itself) or citationchain (a nested claim tree).`,optional:[`icon`,`iconColor`,`summary`,`caveat`,`footer`],itemShapes:[{prop:`items`,text:`text`,textAliases:[`quote`,`record`,`row`,`label`]}],propHints:{claim:`the one claim or number these records back, e.g. "Onboarding is the top churn driver"`,summary:`short count/provenance of the records, e.g. "12 of 240 customers" or "from 18 support tickets"`,"items[].source":`where the record came from, e.g. "ticket #4821" | "Survey Q3" | "ledger row 14"`,caveat:`an honest limitation of this evidence, e.g. "self-reported; not a representative sample"`}},reviewsynth:{blurb:`Distills MANY real customer reviews into an aggregate rating + 5→1 star distribution, then a what-people-love vs complaints split (each theme with rough frequency + one verbatim quote) and the single biggest dealbreaker. For "what do reviews say about X"; use worthit for one reviewer’s verdict, proscons for the model’s own ledger. Themes and quotes must come from real reviews only.`,optional:[`icon`,`iconColor`,`rating`,`count`,`distribution`,`loves`,`complaints`,`dealbreaker`,`footer`],itemShapes:[{prop:`loves`,text:`theme`,textAliases:[`label`,`name`,`title`]},{prop:`complaints`,text:`theme`,textAliases:[`label`,`name`,`title`]}],propHints:{distribution:`star counts as [5★, 4★, 3★, 2★, 1★]`,"loves[].freq":`rough frequency across reviews, e.g. "62% mention" or "common"`,"complaints[].freq":`rough frequency across reviews, e.g. "1 in 4" or "occasional"`,"loves[].quote":`one verbatim quote from a real review`,"complaints[].quote":`one verbatim quote from a real review`}},annotateddoc:{blurb:`Prose with highlighted passages and margin notes (hover/click marks to reveal)`,optional:[`icon`,`iconColor`,`docName`,`footer`],stringItems:[`paragraphs`]},redline:{blurb:`Tracked changes with tabs to view tracked/final/original copy`,optional:[`icon`,`iconColor`,`docName`,`footer`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={citationchain:{blurb:`Claim to source to evidence as an expandable tree with strength indicators`,optional:[`icon`,`iconColor`,`footer`],propHints:{"root.strength":`'strong'|'partial'|'weak'`}},factcheck:{blurb:`Claims with verdicts, confidence scores, and expandable sources/details`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`claims`,text:`claim`,textAliases:[`text`,`statement`,`label`]}],propHints:{"claims[].verdict":`'true'|'partly'|'false'|'unverified'`}},confidencemeter:{blurb:`Confidence breakdown by segments with hover tooltips on supporting basis`,optional:[`icon`,`iconColor`,`claim`,`overall`,`footer`],itemShapes:[{prop:`segments`,text:`label`,textAliases:[`name`,`title`]}],propHints:{"segments[].band":`'strong'|'partial'|'weak'|'none'`}},highlightsnippet:{blurb:`Quoted source excerpt with highlighted phrase and toggle button`,optional:[`icon`,`iconColor`,`source`,`locator`,`color`,`footer`]},annotcallouts:{blurb:`Numbered pins on a surface schematic (click pins to read callout notes)`,optional:[`icon`,`iconColor`,`caption`,`ratio`,`footer`]},sourcelist:{blurb:`Ranked sources with relevance sorting and expandable snippets`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`sources`,text:`titleText`,textAliases:[`title`,`label`,`name`]}]},claimgrid:{blurb:`Claims by evidence grid with check/cross/partial cells and hover tooltips`,optional:[`icon`,`iconColor`,`footer`],stringItems:[`columns`],propHints:{"rows[].cells[].state":`'yes'|'no'|'partial'|'na'`}},docoutline:{blurb:`Collapsible document outline with section jumping and progress indicator`,optional:[`icon`,`iconColor`,`docName`,`activeIndex`,`footer`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={docview:{blurb:`PDF/page-style document viewer with in-document spotlight—focus one passage while the rest dims.`,optional:[`icon`,`iconColor`,`source`,`page`,`note`,`footer`],propHints:{"blocks[].kind":`'h1'|'h2'|'p'|'caption'|'eq'`}},pdfreader:{blurb:`Scrollable multi-page PDF reader with live page counter—browse the full document.`,optional:[`icon`,`iconColor`,`source`,`file`,`footer`],propHints:{"pages[].blocks[].kind":`'h1'|'h2'|'p'|'caption'|'eq'`}},diffviewer:{blurb:`Side-by-side or inline diff view; added lines green, removed red, context grey.`,optional:[`icon`,`iconColor`,`leftLabel`,`rightLabel`,`split`,`footer`],itemShapes:[{prop:`lines`,text:`text`,textAliases:[`content`,`line`,`code`]}],propHints:{"lines[].kind":`'add'|'del'|'ctx'`}},clinicaltimeline:{blurb:`A health/medical event timeline — symptoms, diagnoses, treatments, tests, and results in chronological order. Use for patient history, care coordination, or health-journey asks.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`events`,text:`label`,textAliases:[`event`,`entry`,`note`]}],propHints:{"events[].type":`"symptom"|"diagnosis"|"treatment"|"test"|"result"|"visit"`}},researchsummary:{blurb:`A structured research/study summary — question, method, key findings, conclusion, and limitations. Use for academic papers, scientific studies, clinical research, or any "what does the research say about X" ask.`,optional:[`icon`,`iconColor`,`method`,`sampleSize`,`limitations`,`source`,`year`,`footer`],stringItems:[`findings`],propHints:{question:`the core research question or hypothesis`,method:`study design, e.g. "randomized controlled trial", "meta-analysis"`,sampleSize:`e.g. "n = 1,200 adults"`}},hypothesiscard:{blurb:'A formal null/alternative hypothesis statement (H0 vs H1) for a significance test, with an optional pass/fail verdict once the test has run. Use for statistics write-ups, A/B tests, or any "state the hypothesis" ask — distinct from researchsummary, whose `question` field is loose free text rather than formal H0/H1.',optional:[`title`,`icon`,`iconColor`,`direction`,`alpha`,`variables`,`rejected`,`footer`],propHints:{h0:`the null hypothesis, stated precisely, e.g. "There is no difference in mean recovery time between the two treatments."`,h1:`the alternative hypothesis, e.g. "Treatment B reduces mean recovery time versus Treatment A."`,direction:`"two-tailed"|"greater"|"less"`,alpha:`the significance threshold the test was run against, e.g. 0.05`,"variables.iv":`the manipulated/predictor variable, e.g. "dosage (mg)"`,"variables.dv":`the measured/outcome variable, e.g. "systolic blood pressure"`,rejected:`true once a test has actually run and rejected the null (evidence supports H1); false = failed to reject; omit while just stating the hypotheses`}},paralleltext:{blurb:`Two or more texts aligned line-by-line in parallel columns (original vs translations), with per-line notes and divergence highlights`,optional:[`title`,`icon`,`iconColor`,`caption`,`footer`],itemShapes:[{prop:`columns`,text:`label`,textAliases:[`name`,`title`,`heading`]},{prop:`rows`,text:`note`}],propHints:{"columns[].lang":`short language/script tag, e.g. 'la' | 'Old English' | 'fr'`,"rows[].cells":`one string per column, index-aligned to columns (column 0 = source)`,"rows[].diverge":`true when the renderings meaningfully differ on this line (adds a subtle highlight)`}},resume:{blurb:`A formatted CV — name/title letterhead, then Experience, Education, and Skills as labeled sections, most recent role first. Use for 'my resume', 'my CV', or 'my work history'; not for a single-job cover letter or a bio.`,optional:[`title`,`icon`,`iconColor`,`contact`,`summary`,`education`,`skills`,`footer`],itemShapes:[{prop:`experience`,text:`role`,textAliases:[`title`,`position`,`jobTitle`]},{prop:`education`,text:`school`,textAliases:[`institution`,`university`,`college`]}],stringItems:[`contact`,`skills`],propHints:{"experience[].start":`e.g. "2019" or "Jan 2019"`,"experience[].end":`omit, or leave blank, for a current role — renders as "Present"`,"education[].credential":`e.g. "B.S. Computer Science" or "M.B.A."`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={changelog:{blurb:`Versioned release notes — one section per version (version + date), each entry badge-tagged added/changed/fixed/removed/deprecated/security. Use for 'what changed in vX', a product's release history, or a changelog file; not for a single unversioned list of updates (use takeaways or a timeline instead).`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`versions`,text:`version`,textAliases:[`name`,`label`,`tag`],children:{prop:`entries`,text:`text`,textAliases:[`label`,`description`,`note`]}}],propHints:{"versions[].version":`e.g. "v2.4.0" — keep the same style across every version in the list`,"entries[].kind":`'added'|'changed'|'fixed'|'removed'|'deprecated'|'security'`}},lessonplan:{blurb:`A teacher's lesson plan — subject/grade/duration, learning Objectives, Materials, a numbered Procedure with per-step minute budgets, and an Assessment. Use for 'plan a lesson on X' or 'build a class for Y'; not for a student's own study schedule (use planner or timeline).`,optional:[`icon`,`iconColor`,`subject`,`gradeLevel`,`duration`,`materials`,`assessment`,`footer`],itemShapes:[{prop:`procedure`,text:`step`,textAliases:[`title`,`label`,`activity`]}],stringItems:[`objectives`,`materials`],propHints:{duration:`overall class length, e.g. "50 min" — derived from the procedure minutes if omitted`,"procedure[].minutes":`time budget for that step, in minutes — omit rather than guess`}},casebrief:{blurb:`A legal case brief — Parties, Facts, Issue, Holding, and Reasoning as labeled sections, with the reporter citation as a caption under the title. Use for 'brief this case' or summarizing a court opinion; not for a contract review (use docview) or a general legal Q&A.`,optional:[`icon`,`iconColor`,`citation`,`footer`],propHints:{citation:`reporter citation, e.g. "410 U.S. 113 (1973)" — omit if unknown, never invent one`,holding:`the court's actual ruling, stated as one plain sentence`}},patentclaimchart:{blurb:`A patent claim chart — the claim's own numbered elements down the rows, prior art or an accused product across the columns, each intersection marked disclosed / not-disclosed / disputed with the supporting quote on hover. Use for patent infringement/invalidity analysis or licensing diligence; not for a general claims-vs-evidence grid (use claimgrid).`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`claimElements`,text:`text`,textAliases:[`label`,`claim`,`limitation`,`description`]}],stringItems:[`references`],propHints:{"claimElements[].id":`the claim's own element number/letter, e.g. "1.1" or "[a]" — omit only if truly unnumbered`,"cells[][].state":`'disclosed'|'not-disclosed'|'disputed', one verdict per element × reference pairing (cells[elementIndex][referenceIndex])`,"cells[][].quote":`the supporting passage from that reference — omit for not-disclosed cells, never invent one`}},storystructure:{blurb:`A journalism inverted-pyramid draft — the lede and nut graf called out in a highlighted block up top, body paragraphs in reading order below, and secondary background held behind a collapsible toggle. Use for 'draft this as a news story' or 'write it inverted-pyramid style'; not for a general article/blog draft (use pullquote, casestudy, or plain prose).`,optional:[`icon`,`iconColor`,`background`,`wordCountBudget`,`wordCount`,`footer`],stringItems:[`body`,`background`],propHints:{lede:`the opening sentence — the single most newsworthy fact, stated first, not buried`,nutGraf:`the paragraph right after the lede supplying the essential who/what/why/so-what`,wordCount:`the draft's actual word count — derived from lede+nutGraf+body if omitted`}},vetpatientchart:{blurb:`A veterinary patient chart — the signalment (species/breed/sex/age/weight) as identity chips atop a vitals strip and the active problem list. Use for 'my dog's checkup', 'vet visit summary', or any single-visit animal chart; not for a treatment history over time (use clinicaltimeline).`,optional:[`icon`,`iconColor`,`breed`,`sex`,`ageYears`,`weightKg`,`vitals`,`problems`,`footer`],itemShapes:[{prop:`vitals`,text:`label`,textAliases:[`name`,`vital`,`metric`]}],stringItems:[`problems`],propHints:{"vitals[].value":`most readings are numeric ("101.5"); a few are qualitative ("Pink", "CRT <2s") — give whichever the real reading is`,"vitals[].abnormal":`true only when the reading is genuinely outside normal for this patient — never guess`}},scoutingreport:{blurb:`A sports opponent scouting report — the opponent's tendencies as a prose list, per-matchup notes, and the key players to game-plan around. Use for 'scout our next opponent' or pre-game prep; not for a live in-game recap (use scoreboard, statustimeline, or a gameday-style narrative).`,optional:[`icon`,`iconColor`,`matchupNotes`,`keyPlayers`,`footer`],itemShapes:[{prop:`matchupNotes`,text:`note`,textAliases:[`detail`,`text`,`description`]},{prop:`keyPlayers`,text:`name`,textAliases:[`player`,`who`]}],stringItems:[`tendencies`],propHints:{"matchupNotes[].label":`the matchup dimension this note covers, e.g. "Pace", "3-point defense"`,"keyPlayers[].role":`position/role, e.g. "PG", "closer", "left tackle"`}},allocatepeople:{blurb:`Split tasks or chores fairly among NAMED people — one column per person with their tasks and a load bar that makes an uneven split obvious. Use for "divide the chores between us", roommate rotas, group-project work, or on-call duty.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`assignments`,text:`task`,textAliases:[`chore`,`duty`,`job`,`item`,`label`]}],stringItems:[`people`],propHints:{people:`array of person names, e.g. ["Sam", "Alex", "Jordan"]`,"assignments[].who":"a person — should match one of the `people` names","assignments[].weight":`effort this task carries, 1 (light) to 5 (heavy); optional, defaults to 1`}}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={forecast:{blurb:`A multi-day weather or prediction grid — icon, hi/lo, condition, precipitation per day — with location and timestamp.`,optional:[`icon`,`iconColor`,`location`,`unit`,`asOf`,`summary`,`footer`],itemShapes:[{prop:`days`,text:`condition`,textAliases:[`weather`,`forecast`,`summary`,`label`]}],propHints:{unit:`'F'|'C'`,"days[].icon":`'sun'|'cloud'|'rain'|'snow'|'storm'|'fog'|'partly-cloudy'`}},agenda:{blurb:`A schedule, itinerary, or meeting agenda — time-ordered items with locations, durations, and notes.`,optional:[`icon`,`iconColor`,`date`,`footer`],itemShapes:[{prop:`items`,text:`title`,textAliases:[`name`,`label`,`task`,`event`]}],propHints:{"items[].time":`"9:00 AM" | "14:30" — start time for this item`,"items[].duration":`"45 min" | "2 hours" — how long the item lasts`,"items[].location":`"Museum of Fine Arts" — place name or address`,"items[].note":`"Book tickets in advance" — tip, note, or detail`,"items[].done":`true|false`}},picks:{blurb:`A curated ranked recommendation list — products, books, places — each with tagline, reasoning, price, rating, and a badge.`,optional:[`icon`,`iconColor`,`category`,`footer`],itemShapes:[{prop:`items`,text:`name`,textAliases:[`title`,`label`,`product`]}]},timezones:{blurb:`World-clock comparison — cities, UTC offsets, and local times shown side-by-side; home timezone highlighted.`,optional:[`icon`,`iconColor`,`baseTime`,`footer`],itemShapes:[{prop:`rows`,text:`city`,textAliases:[`name`,`label`,`location`]}]},transitroute:{blurb:`A turn-by-turn transit or driving route — mode icons, instructions, line names, and a total time summary.`,optional:[`icon`,`iconColor`,`totalTime`,`totalDistance`,`footer`],itemShapes:[{prop:`steps`,text:`instruction`,textAliases:[`description`,`text`,`step`]}],propHints:{"steps[].mode":`'walk'|'bus'|'subway'|'train'|'bike'|'car'|'ferry'`}},amortization:{blurb:`A loan or mortgage amortization table — per-period principal/interest split with a running balance that pays DOWN to zero. Never for a generic financial table or budget — use datatable.`,optional:[`icon`,`iconColor`,`footer`],itemShapes:[{prop:`rows`,text:`period`,textAliases:[`label`,`month`,`year`]}]},receipt:{blurb:`An itemized PURCHASE receipt — money only: line items with quantity and price, subtotal, tax, and a currency grand total. Never for workouts, schedules, or generic item lists with non-money "totals" (use workoutplan for exercises, agenda for plans, checklist/datatable otherwise).`,optional:[`icon`,`iconColor`,`merchant`,`date`,`subtotal`,`tax`,`footer`],itemShapes:[{prop:`lines`,text:`item`,textAliases:[`name`,`description`,`label`]}]},settleup:{blurb:`Group expense split — who paid what, who owes who, and the minimum transfers to settle up.`,optional:[`icon`,`iconColor`,`people`,`expenses`,`footer`],itemShapes:[{prop:`settlements`,text:`from`,textAliases:[`payer`,`name`]}],stringItems:[`people`]}};export{e as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={bracketbar:{blurb:`Numbered leaderboard bars — top-N ranked items each with a score and optional badge. Use for "rank the top N …", best/worst lists, poll results, popularity rankings.`,optional:[`icon`,`iconColor`,`metric`,`footer`],itemShapes:[{prop:`items`,text:`label`,textAliases:[`name`,`title`]}]},recipecard:{blurb:`A cooking recipe card — ingredients with quantities, numbered steps, and pro tips. Use for any "how do I make X" or "recipe for Y" ask.`,optional:[`icon`,`iconColor`,`servings`,`prepTime`,`cookTime`,`difficulty`,`tips`,`footer`],itemShapes:[{prop:`ingredients`,text:`name`,textAliases:[`ingredient`,`item`]}],stringItems:[`steps`,`tips`],propHints:{difficulty:`"easy"|"medium"|"hard"`,"ingredients[].qty":`amount, e.g. "2", "¼ cup", "a pinch"`}},workoutplan:{blurb:`A structured workout plan with sessions, exercises, sets, reps, and rest periods. Use for any "gym plan", "workout routine", or "training program" ask.`,optional:[`icon`,`iconColor`,`goal`,`weeks`,`footer`],propHints:{"sessions[].exercises[].reps":`"10–12"|"to failure"|"30 sec"`,"sessions[].exercises[].rest":`"60 sec"|"90 sec"|"2 min"`}},medicationschedule:{blurb:`A medication schedule — drug names, doses, dosing times, and instructions. Use for medication tracking, prescription management, or post-surgery care asks.`,optional:[`icon`,`iconColor`,`startDate`,`footer`],itemShapes:[{prop:`medications`,text:`name`,textAliases:[`drug`,`medication`,`med`]}],propHints:{"medications[].times":`array of time strings, e.g. ["8:00 AM", "8:00 PM"]`,"medications[].withFood":`true if the medication must be taken with food`}},macrobreakdown:{blurb:`Nutritional macros — calorie headline, protein/carbs/fat/fiber split with a stacked bar, and optional per-item breakdown. Use for any nutrition, diet, or food content ask.`,optional:[`icon`,`iconColor`,`fiber`,`items`,`footer`],itemShapes:[{prop:`items`,text:`label`,textAliases:[`food`,`name`,`ingredient`]}]},plangrid:{blurb:`A forward days×slots planning grid — meal plan, study schedule, habit tracker, weekly routine. One cell per slot per column; free slots show empty. Distinct from agenda (one day) and calheat (past streaks).`,optional:[`icon`,`iconColor`,`summary`,`caption`,`footer`],itemShapes:[{prop:`rows`,text:`slot`,textAliases:[`label`,`name`,`row`],children:{prop:`cells`,text:`label`,textAliases:[`name`,`title`,`text`]}}],stringItems:[`columns`,`summary`],propHints:{columns:`the grid columns, e.g. ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"] or ["Week 1","Week 2"]`,"rows[].cells[].col":"must match one of the `columns` strings (case-insensitive); omit a column for a free slot","rows[].cells[].accent":`'var(--presence)'|'var(--insight)'|'var(--warning)'`}},budgetallocator:{blurb:`A forward envelope / zero-based budget — income at the top, category bars, and a live "left to allocate" (or "over by") meter. Use to BUILD a budget or allocate a pot; for splitting a PAST total use breakdown/donut.`,optional:[`icon`,`iconColor`,`unit`,`incomeLabel`,`caption`,`footer`],itemShapes:[{prop:`envelopes`,text:`label`,textAliases:[`name`,`category`]}],propHints:{income:`the total pot to allocate, a number (e.g. 4200)`,"envelopes[].amount":`amount assigned, a number in the same unit as income`,"envelopes[].group":`'fixed'|'flexible'|'savings'`,"envelopes[].accent":`'var(--presence)'|'var(--insight)'|'var(--warning)'`,unit:`currency prefix, e.g. '$' (default), '£', '€'`}},howtosteps:{blurb:`A hands-on how-to / procedure — prep meta (time, difficulty), an optional safety warning, the tools needed, then numbered steps each with detail, a caution, a tip, and a "done when" check. For physical/practical how-tos (repairs, setup, DIY); use recipecard for cooking, processflow for abstract flows.`,optional:[`icon`,`iconColor`,`time`,`difficulty`,`warning`,`tools`,`footer`],itemShapes:[{prop:`steps`,text:`action`,textAliases:[`step`,`instruction`,`text`,`title`]}],stringItems:[`tools`],propHints:{difficulty:`'easy'|'medium'|'hard'`,warning:`a one-line safety warning shown prominently at the top, e.g. "Switch off the power first"`,tools:`array of tools/materials needed, e.g. ["Phillips screwdriver","plunger","bucket"]`}}};export{e as D};
|