@launchsecure/launch-kit 0.0.25 → 0.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +50 -0
  2. package/dist/beacon/beacon.mjs +1016 -0
  3. package/dist/beacon/beacon.mjs.map +1 -0
  4. package/dist/beacon/beacon.umd.js +87 -0
  5. package/dist/beacon/beacon.umd.js.map +1 -0
  6. package/dist/beacon/index-DAIDnjfR.mjs +513 -0
  7. package/dist/beacon/index-DAIDnjfR.mjs.map +1 -0
  8. package/dist/beacon/types/capture/element.d.ts +3 -0
  9. package/dist/beacon/types/capture/element.d.ts.map +1 -0
  10. package/dist/beacon/types/capture/framework.d.ts +3 -0
  11. package/dist/beacon/types/capture/framework.d.ts.map +1 -0
  12. package/dist/beacon/types/capture/metadata.d.ts +3 -0
  13. package/dist/beacon/types/capture/metadata.d.ts.map +1 -0
  14. package/dist/beacon/types/capture/overlay.d.ts +7 -0
  15. package/dist/beacon/types/capture/overlay.d.ts.map +1 -0
  16. package/dist/beacon/types/capture/picker.d.ts +12 -0
  17. package/dist/beacon/types/capture/picker.d.ts.map +1 -0
  18. package/dist/beacon/types/capture/screenshot.d.ts +7 -0
  19. package/dist/beacon/types/capture/screenshot.d.ts.map +1 -0
  20. package/dist/beacon/types/capture/selector.d.ts +2 -0
  21. package/dist/beacon/types/capture/selector.d.ts.map +1 -0
  22. package/dist/beacon/types/element.d.ts +50 -0
  23. package/dist/beacon/types/element.d.ts.map +1 -0
  24. package/dist/beacon/types/index.d.ts +4 -0
  25. package/dist/beacon/types/index.d.ts.map +1 -0
  26. package/dist/beacon/types/transport/submit.d.ts +3 -0
  27. package/dist/beacon/types/transport/submit.d.ts.map +1 -0
  28. package/dist/beacon/types/types.d.ts +88 -0
  29. package/dist/beacon/types/types.d.ts.map +1 -0
  30. package/dist/beacon/types/ui/button.d.ts +2 -0
  31. package/dist/beacon/types/ui/button.d.ts.map +1 -0
  32. package/dist/beacon/types/ui/drawer.d.ts +31 -0
  33. package/dist/beacon/types/ui/drawer.d.ts.map +1 -0
  34. package/dist/beacon/types/ui/icons.d.ts +9 -0
  35. package/dist/beacon/types/ui/icons.d.ts.map +1 -0
  36. package/dist/beacon/types/ui/pick-mode-overlay.d.ts +25 -0
  37. package/dist/beacon/types/ui/pick-mode-overlay.d.ts.map +1 -0
  38. package/dist/beacon/types/ui/pin-popover.d.ts +14 -0
  39. package/dist/beacon/types/ui/pin-popover.d.ts.map +1 -0
  40. package/dist/chart-client/assets/{index-C8ANseEa.js → index-Bk1hawjD.js} +63 -58
  41. package/dist/chart-client/assets/index-DpaGa3bY.css +1 -0
  42. package/dist/chart-client/index.html +2 -2
  43. package/dist/client/assets/index-Bfel4OQ5.css +32 -0
  44. package/dist/client/assets/{index-Ds9UP_cj.js → index-eC-WuUWB.js} +58 -58
  45. package/dist/client/index.html +2 -2
  46. package/dist/council-client/assets/{index-Dc41S-R2.js → index-Cs_MVXHf.js} +14 -14
  47. package/dist/council-client/assets/index-P5kMsT5a.css +1 -0
  48. package/dist/council-client/index.html +2 -2
  49. package/dist/deck-client/assets/{_baseUniq-2gclQXo7.js → _baseUniq-C2xT_eYu.js} +1 -1
  50. package/dist/deck-client/assets/{arc-DcMY5Wm0.js → arc-CmVL9pGd.js} +1 -1
  51. package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-B8iirmmJ.js → architectureDiagram-Q4EWVU46-BSFgdjve.js} +1 -1
  52. package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-B4JBLjmJ.js → blockDiagram-DXYQGD6D-DuLzscvP.js} +1 -1
  53. package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-CojrJAk8.js → c4Diagram-AHTNJAMY-CfCJB8eY.js} +1 -1
  54. package/dist/deck-client/assets/channel-B4aNO8ZB.js +1 -0
  55. package/dist/deck-client/assets/{chunk-4BX2VUAB-Bmb_BMDo.js → chunk-4BX2VUAB-DxmLYTWZ.js} +1 -1
  56. package/dist/deck-client/assets/{chunk-4TB4RGXK-CumBy8qe.js → chunk-4TB4RGXK-CCnf7GFE.js} +1 -1
  57. package/dist/deck-client/assets/{chunk-55IACEB6-Ka8Hb1wD.js → chunk-55IACEB6-Db9DApcj.js} +1 -1
  58. package/dist/deck-client/assets/{chunk-EDXVE4YY-B3sIPiQo.js → chunk-EDXVE4YY-DmYDq8ZI.js} +1 -1
  59. package/dist/deck-client/assets/{chunk-FMBD7UC4-C1tYkaqu.js → chunk-FMBD7UC4-BGhUlF20.js} +1 -1
  60. package/dist/deck-client/assets/{chunk-OYMX7WX6-D7Wacbky.js → chunk-OYMX7WX6-CpEnicQZ.js} +1 -1
  61. package/dist/deck-client/assets/{chunk-QZHKN3VN-ChXI0vO3.js → chunk-QZHKN3VN-Doa7LKwf.js} +1 -1
  62. package/dist/deck-client/assets/{chunk-YZCP3GAM-BXhiqf8u.js → chunk-YZCP3GAM-CpkIlH6V.js} +1 -1
  63. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-BHTI0yWz.js +1 -0
  64. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-BHTI0yWz.js +1 -0
  65. package/dist/deck-client/assets/clone-HduFm7qU.js +1 -0
  66. package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-Bqp3p68D.js → cose-bilkent-S5V4N54A-Bkh8Bfcb.js} +1 -1
  67. package/dist/deck-client/assets/{dagre-KV5264BT-BS-rtyhZ.js → dagre-KV5264BT-Bp0XpTgH.js} +1 -1
  68. package/dist/deck-client/assets/{diagram-5BDNPKRD-BIrj9YGI.js → diagram-5BDNPKRD-ZHiyGYPQ.js} +1 -1
  69. package/dist/deck-client/assets/{diagram-G4DWMVQ6-noHWPIg4.js → diagram-G4DWMVQ6-BW-Q8_H5.js} +1 -1
  70. package/dist/deck-client/assets/{diagram-MMDJMWI5-C2qHxvqV.js → diagram-MMDJMWI5-6I3LTafu.js} +1 -1
  71. package/dist/deck-client/assets/{diagram-TYMM5635-BytnGQr-.js → diagram-TYMM5635-CyM5YK28.js} +1 -1
  72. package/dist/deck-client/assets/{erDiagram-SMLLAGMA-BfK5m2YQ.js → erDiagram-SMLLAGMA-CjNxVJHk.js} +1 -1
  73. package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-Cq925G1Z.js → flowDiagram-DWJPFMVM-BDQHuAJR.js} +1 -1
  74. package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-DhhHPAmj.js → ganttDiagram-T4ZO3ILL-B7MnkpbP.js} +1 -1
  75. package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-B3Lc0h9q.js → gitGraphDiagram-UUTBAWPF-C9dZAcYD.js} +1 -1
  76. package/dist/deck-client/assets/{graph-RTawgVWm.js → graph-CjdBnzUy.js} +1 -1
  77. package/dist/deck-client/assets/{index-BfIfJXmS.js → index-DeIVPW63.js} +68 -68
  78. package/dist/deck-client/assets/index-LKZDAS9S.css +1 -0
  79. package/dist/deck-client/assets/{infoDiagram-42DDH7IO-BlR584kX.js → infoDiagram-42DDH7IO-C7d3iRC3.js} +1 -1
  80. package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-DygKoNGY.js → ishikawaDiagram-UXIWVN3A-BcYGKj09.js} +1 -1
  81. package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-BnaiYp9N.js → journeyDiagram-VCZTEJTY-DqFlRrOL.js} +1 -1
  82. package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-BQBUBzJC.js → kanban-definition-6JOO6SKY-BJhPp1NR.js} +1 -1
  83. package/dist/deck-client/assets/{layout-DeZ8HI1T.js → layout-DIeS6GvK.js} +1 -1
  84. package/dist/deck-client/assets/{linear-C6roLi_9.js → linear-He_yJy5H.js} +1 -1
  85. package/dist/deck-client/assets/{min-CbUksbuI.js → min-DQ6Kx06t.js} +1 -1
  86. package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-iNxV62yN.js → mindmap-definition-QFDTVHPH-sQ62L8T2.js} +1 -1
  87. package/dist/deck-client/assets/{pieDiagram-DEJITSTG-DHVA0jaG.js → pieDiagram-DEJITSTG-BqCWmU2K.js} +1 -1
  88. package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-DBeKKLUQ.js → quadrantDiagram-34T5L4WZ-rQ1TJOoe.js} +1 -1
  89. package/dist/deck-client/assets/{requirementDiagram-MS252O5E-CBwITx7p.js → requirementDiagram-MS252O5E-BO2MPBOM.js} +1 -1
  90. package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-BtE-1YTU.js → sankeyDiagram-XADWPNL6-BgsHEVex.js} +1 -1
  91. package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-DN96yPP2.js → sequenceDiagram-FGHM5R23-B3j1yMLU.js} +1 -1
  92. package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-VUkKC2uJ.js → stateDiagram-FHFEXIEX-C8jFlZou.js} +1 -1
  93. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-BoqepHW0.js +1 -0
  94. package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-oUeZhRns.js → timeline-definition-GMOUNBTQ-tM-qo4Zk.js} +1 -1
  95. package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-D87fK90n.js → vennDiagram-DHZGUBPP-B0-6kOEu.js} +1 -1
  96. package/dist/deck-client/assets/wardley-RL74JXVD-HpBk07P-.js +162 -0
  97. package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-Ca_i0QRA.js → wardleyDiagram-NUSXRM2D-BkA1NLDE.js} +1 -1
  98. package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-CUOJVIvq.js → xychartDiagram-5P7HB3ND-CEKGSuI-.js} +1 -1
  99. package/dist/deck-client/index.html +2 -2
  100. package/dist/server/chart-serve.js +990 -116
  101. package/dist/server/cli.js +28413 -6982
  102. package/dist/server/council-entry.js +0 -0
  103. package/dist/server/deck-mcp-entry.js +332 -3
  104. package/dist/server/deck-serve.js +288 -0
  105. package/dist/server/fb-wizard.js +0 -0
  106. package/dist/server/graph/queries/classify.scm +8 -0
  107. package/dist/server/graph/queries/exports.scm +7 -0
  108. package/dist/server/graph-mcp-entry.js +1639 -197
  109. package/dist/server/recall-entry.js +1112 -0
  110. package/package.json +47 -21
  111. package/dist/chart-client/assets/index--120d9P9.css +0 -1
  112. package/dist/client/assets/index-Bf8zdL3x.css +0 -32
  113. package/dist/council-client/assets/index-CofZh7pS.css +0 -1
  114. package/dist/deck-client/assets/channel-ERh5jKXV.js +0 -1
  115. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-CMi1Gaev.js +0 -1
  116. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-CMi1Gaev.js +0 -1
  117. package/dist/deck-client/assets/clone-DfWhlD4X.js +0 -1
  118. package/dist/deck-client/assets/index-765AIQ9z.css +0 -1
  119. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CA0IjulK.js +0 -1
  120. package/dist/deck-client/assets/wardley-RL74JXVD-DYbYcpDp.js +0 -162
  121. package/dist/server/deck-server/deck-mcp-entry.js +0 -1789
  122. package/dist/server/deck-server/deck-serve.js +0 -1275
  123. package/dist/server/server/chart-serve.js +0 -4643
  124. package/dist/server/server/cli.js +0 -13360
  125. package/dist/server/server/fb-wizard.js +0 -136
  126. package/dist/server/server/graph-mcp-entry.js +0 -6776
@@ -881,6 +881,271 @@ function contractToMarkdown(contract) {
881
881
  return md;
882
882
  }
883
883
 
884
+ // src/server/rich-html-render.ts
885
+ var WIRED_CDN = "https://unpkg.com/wired-elements?module";
886
+ var REVEAL_VER = "5.1.0";
887
+ var REVEAL_CSS = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/dist/reveal.css`;
888
+ var REVEAL_THEME = (t) => `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/dist/theme/${t === "dark" ? "black" : "white"}.css`;
889
+ var REVEAL_JS = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/dist/reveal.js`;
890
+ var REVEAL_MD = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/plugin/markdown/markdown.js`;
891
+ var REVEAL_HL = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/plugin/highlight/highlight.js`;
892
+ var REVEAL_NOTES = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/plugin/notes/notes.js`;
893
+ function renderRichHtml(opts) {
894
+ const theme = opts.theme ?? "light";
895
+ const title = escapeHtml(opts.title ?? "LaunchDeck");
896
+ if (opts.framework === "wired") {
897
+ return renderWired(opts.content, theme, title);
898
+ }
899
+ if (opts.framework === "reveal") {
900
+ return renderReveal(opts.content, theme, title);
901
+ }
902
+ return opts.content;
903
+ }
904
+ function themeResolverScript(initial) {
905
+ return `<script>
906
+ (function () {
907
+ function applyTheme(t) {
908
+ if (t !== 'light' && t !== 'dark') return;
909
+ var prev = document.documentElement.dataset.theme;
910
+ document.documentElement.dataset.theme = t;
911
+ if (prev !== t) {
912
+ document.dispatchEvent(new CustomEvent('deck-theme', { detail: t }));
913
+ }
914
+ }
915
+ // 1) initial preference: URL > prefers-color-scheme (standalone) > baked-in default
916
+ var url = new URL(window.location.href);
917
+ var fromUrl = url.searchParams.get('theme');
918
+ if (fromUrl === 'light' || fromUrl === 'dark') {
919
+ applyTheme(fromUrl);
920
+ } else if (window.parent === window) {
921
+ var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
922
+ applyTheme(prefersDark ? 'dark' : 'light');
923
+ } else {
924
+ applyTheme(${JSON.stringify(initial)});
925
+ }
926
+ // 2) live updates from parent deck
927
+ window.addEventListener('message', function (e) {
928
+ if (e.data && e.data.type === 'deck-theme') applyTheme(e.data.theme);
929
+ });
930
+ // 3) tell parent we are ready so it can push the current theme back
931
+ if (window.parent !== window) {
932
+ window.parent.postMessage({ type: 'deck-iframe-ready' }, '*');
933
+ }
934
+ })();
935
+ </script>`;
936
+ }
937
+ function renderWired(body, initialTheme, title) {
938
+ const LIGHT = { bg: "#ffffff", fg: "#18181b", accent: "#7c3aed", cardBg: "#ffffff" };
939
+ const DARK = { bg: "#0e0e10", fg: "#e4e4e7", accent: "#a78bfa", cardBg: "#1a1a1d" };
940
+ const wiredVarsBlock = (vars) => `
941
+ --wired-card-background-fill: ${vars.cardBg};
942
+ --wired-button-color: ${vars.fg};
943
+ --wired-combo-popup-bg: ${vars.cardBg};
944
+ --wired-progress-color: ${vars.accent};
945
+ --wired-progress-label-background: ${vars.cardBg};
946
+ --wired-progress-label-color: ${vars.fg};
947
+ `;
948
+ return `<!DOCTYPE html>
949
+ <html lang="en" data-theme="${initialTheme}">
950
+ <head>
951
+ <meta charset="utf-8">
952
+ <meta name="viewport" content="width=device-width, initial-scale=1">
953
+ <title>${title}</title>
954
+ <script type="module" src="${WIRED_CDN}"></script>
955
+ <link href="https://fonts.googleapis.com/css2?family=Gloria+Hallelujah&family=DM+Sans:wght@400;600;700&display=swap" rel="stylesheet">
956
+ <style>
957
+ *, *::before, *::after { box-sizing: border-box; }
958
+ html, body {
959
+ margin: 0;
960
+ min-height: 100%;
961
+ font-family: 'Gloria Hallelujah', 'DM Sans', system-ui, sans-serif;
962
+ background: var(--page-bg);
963
+ color: var(--page-fg);
964
+ transition: background 0.15s, color 0.15s;
965
+ }
966
+ body { padding: 24px; }
967
+ h1, h2, h3, h4 { font-family: 'Gloria Hallelujah', cursive; margin: 0.5em 0; color: var(--page-fg); }
968
+ a { color: var(--page-accent); }
969
+ .row { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; margin: 8px 0; }
970
+ .col { display: flex; flex-direction: column; gap: 12px; align-items: stretch; }
971
+ .card { padding: 16px; }
972
+
973
+ /* Light theme */
974
+ :root[data-theme="light"] {
975
+ --page-bg: ${LIGHT.bg};
976
+ --page-fg: ${LIGHT.fg};
977
+ --page-accent: ${LIGHT.accent};
978
+ ${wiredVarsBlock(LIGHT)}
979
+ }
980
+
981
+ /* Dark theme */
982
+ :root[data-theme="dark"] {
983
+ --page-bg: ${DARK.bg};
984
+ --page-fg: ${DARK.fg};
985
+ --page-accent: ${DARK.accent};
986
+ ${wiredVarsBlock(DARK)}
987
+ }
988
+
989
+ /* Hosts: text color inherits via component "color: inherit" rules.
990
+ Transparent background lets the page bg show through where the
991
+ rough.js rectangle leaves space. */
992
+ wired-button, wired-card, wired-checkbox, wired-radio, wired-toggle,
993
+ wired-input, wired-textarea, wired-search-input, wired-combo, wired-item,
994
+ wired-listbox, wired-link, wired-tabs, wired-tab, wired-fab,
995
+ wired-icon-button, wired-divider, wired-progress, wired-slider,
996
+ wired-calendar, wired-dialog {
997
+ color: var(--page-fg);
998
+ background: transparent;
999
+ }
1000
+ </style>
1001
+ </head>
1002
+ <body>
1003
+ ${body}
1004
+ ${themeResolverScript(initialTheme)}
1005
+ <script type="module">
1006
+ // wired-input / wired-textarea / wired-search-input render their native
1007
+ // <input>/<textarea> INSIDE shadow DOM. Outer CSS cannot reach those, and
1008
+ // the native control has appearance:auto which the UA repaints over any
1009
+ // "background: transparent" rule. We must set inline styles directly on
1010
+ // the inner element with !important.
1011
+ //
1012
+ // We register one applier per theme. Re-runs when theme changes or new
1013
+ // nodes are added so the page reacts live to the deck sun/moon toggle.
1014
+ const FG = { light: ${JSON.stringify(LIGHT.fg)}, dark: ${JSON.stringify(DARK.fg)} };
1015
+ const TAGS = ['wired-input', 'wired-textarea', 'wired-search-input'];
1016
+ const DARK_PROPS = [
1017
+ 'appearance', '-webkit-appearance',
1018
+ 'background', 'background-color',
1019
+ 'color', '-webkit-text-fill-color', 'caret-color',
1020
+ 'border', 'outline',
1021
+ ];
1022
+
1023
+ function applyDark(node) {
1024
+ const s = node.style;
1025
+ s.setProperty('appearance', 'none', 'important');
1026
+ s.setProperty('-webkit-appearance', 'none', 'important');
1027
+ s.setProperty('background', 'transparent', 'important');
1028
+ s.setProperty('background-color', 'transparent', 'important');
1029
+ s.setProperty('color', FG.dark, 'important');
1030
+ s.setProperty('-webkit-text-fill-color', FG.dark, 'important');
1031
+ s.setProperty('caret-color', FG.dark, 'important');
1032
+ s.setProperty('border', 'none', 'important');
1033
+ s.setProperty('outline', 'none', 'important');
1034
+ }
1035
+
1036
+ function applyLight(node) {
1037
+ DARK_PROPS.forEach((p) => node.style.removeProperty(p));
1038
+ }
1039
+
1040
+ function placeholderStyle(host, theme) {
1041
+ const existing = host.shadowRoot.querySelector('style[data-deck-theme]');
1042
+ if (existing) existing.remove();
1043
+ if (theme !== 'dark') return;
1044
+ const style = document.createElement('style');
1045
+ style.dataset.deckTheme = '1';
1046
+ style.textContent =
1047
+ '::placeholder{color:' + FG.dark + '99 !important;' +
1048
+ '-webkit-text-fill-color:' + FG.dark + '99 !important;}';
1049
+ host.shadowRoot.appendChild(style);
1050
+ }
1051
+
1052
+ function sweepOnce() {
1053
+ const theme = document.documentElement.dataset.theme;
1054
+ for (const tag of TAGS) {
1055
+ for (const host of document.querySelectorAll(tag)) {
1056
+ if (!host.shadowRoot) continue;
1057
+ const inner = host.shadowRoot.querySelector('input, textarea');
1058
+ if (!inner) continue;
1059
+ if (theme === 'dark') applyDark(inner);
1060
+ else applyLight(inner);
1061
+ placeholderStyle(host, theme);
1062
+ }
1063
+ }
1064
+ }
1065
+
1066
+ // Initial + late-upgrade catch (CDN script loads async).
1067
+ sweepOnce();
1068
+ let elapsed = 0;
1069
+ function tick() {
1070
+ sweepOnce();
1071
+ elapsed += 100;
1072
+ if (elapsed < 3000) setTimeout(tick, 100);
1073
+ }
1074
+ setTimeout(tick, 100);
1075
+
1076
+ // Re-sweep on theme change.
1077
+ document.addEventListener('deck-theme', sweepOnce);
1078
+ // Re-sweep when new nodes are added.
1079
+ new MutationObserver(sweepOnce).observe(document.body, { subtree: true, childList: true });
1080
+
1081
+ // whenDefined fires when each tag is registered \u2014 allSettled-style, never hangs.
1082
+ TAGS.forEach((tag) => {
1083
+ customElements.whenDefined(tag).then(sweepOnce).catch(() => {});
1084
+ });
1085
+ </script>
1086
+ </body>
1087
+ </html>`;
1088
+ }
1089
+ function renderReveal(content, initialTheme, title) {
1090
+ const slides = content.includes("<section") ? content : content.split(/\n\s*---\s*\n/).map((md) => `<section data-markdown><textarea data-template>
1091
+ ${md.trim()}
1092
+ </textarea></section>`).join("\n");
1093
+ return `<!DOCTYPE html>
1094
+ <html lang="en" data-theme="${initialTheme}">
1095
+ <head>
1096
+ <meta charset="utf-8">
1097
+ <meta name="viewport" content="width=device-width, initial-scale=1">
1098
+ <title>${title}</title>
1099
+ <link rel="stylesheet" href="${REVEAL_CSS}">
1100
+ <link id="reveal-theme-light" rel="stylesheet" href="${REVEAL_THEME("light")}" ${initialTheme === "dark" ? "disabled" : ""}>
1101
+ <link id="reveal-theme-dark" rel="stylesheet" href="${REVEAL_THEME("dark")}" ${initialTheme === "dark" ? "" : "disabled"}>
1102
+ <style>
1103
+ html, body { margin: 0; height: 100%; }
1104
+ .reveal .slides { text-align: left; }
1105
+ .reveal .slides section { padding: 0 32px; }
1106
+ </style>
1107
+ </head>
1108
+ <body>
1109
+ <div class="reveal">
1110
+ <div class="slides">
1111
+ ${slides}
1112
+ </div>
1113
+ </div>
1114
+ <script src="${REVEAL_JS}"></script>
1115
+ <script src="${REVEAL_MD}"></script>
1116
+ <script src="${REVEAL_HL}"></script>
1117
+ <script src="${REVEAL_NOTES}"></script>
1118
+ <script>
1119
+ Reveal.initialize({
1120
+ hash: true,
1121
+ slideNumber: 'c/t',
1122
+ controls: true,
1123
+ progress: true,
1124
+ transition: 'slide',
1125
+ plugins: [RevealMarkdown, RevealHighlight, RevealNotes],
1126
+ });
1127
+ // React to theme changes: flip which stylesheet is enabled.
1128
+ function syncRevealTheme() {
1129
+ var dark = document.documentElement.dataset.theme === 'dark';
1130
+ var lightLink = document.getElementById('reveal-theme-light');
1131
+ var darkLink = document.getElementById('reveal-theme-dark');
1132
+ if (lightLink) lightLink.disabled = dark;
1133
+ if (darkLink) darkLink.disabled = !dark;
1134
+ }
1135
+ document.addEventListener('deck-theme', syncRevealTheme);
1136
+ syncRevealTheme();
1137
+ </script>
1138
+ ${themeResolverScript(initialTheme)}
1139
+ </body>
1140
+ </html>`;
1141
+ }
1142
+ function escapeHtml(s) {
1143
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
1144
+ }
1145
+ function slugify(label) {
1146
+ return label.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "block";
1147
+ }
1148
+
884
1149
  // src/server/deck-serve.ts
885
1150
  var DEFAULT_PORT = 52829;
886
1151
  var MAX_PORT_SCAN = 3;
@@ -1063,6 +1328,29 @@ async function startDeckServer(opts = {}) {
1063
1328
  console.error("Failed to generate blast radius HTML:", err);
1064
1329
  }
1065
1330
  }
1331
+ if (block.type === "rich-html" && block.content) {
1332
+ try {
1333
+ const html = renderRichHtml({
1334
+ framework: block.framework ?? "raw",
1335
+ content: block.content,
1336
+ theme: block.theme,
1337
+ title: block.label
1338
+ });
1339
+ const sessionEncoded = encodeURIComponent(body.session);
1340
+ const baseUrl = `/deck-files/${sessionEncoded}`;
1341
+ const filename = `${slugify(block.label)}.html`;
1342
+ const dir = import_node_path3.default.join(cwd, ".launchsecure", "deck-files", body.session);
1343
+ import_node_fs3.default.mkdirSync(dir, { recursive: true });
1344
+ import_node_fs3.default.writeFileSync(import_node_path3.default.join(dir, filename), html);
1345
+ block.type = "iframe";
1346
+ block.src = `${baseUrl}/${filename}`;
1347
+ delete block.content;
1348
+ delete block.framework;
1349
+ delete block.theme;
1350
+ } catch (err) {
1351
+ console.error("Failed to generate rich-html:", err);
1352
+ }
1353
+ }
1066
1354
  }
1067
1355
  broadcastToClients({
1068
1356
  type: "session",
File without changes
@@ -40,6 +40,14 @@
40
40
  name: (identifier) @http_export_fn
41
41
  (#match? @http_export_fn "^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)$")))
42
42
 
43
+ ; export const { GET, POST } = handlers (Auth.js v5 / NextAuth pattern)
44
+ (export_statement
45
+ declaration: (lexical_declaration
46
+ (variable_declarator
47
+ name: (object_pattern
48
+ (shorthand_property_identifier_pattern) @http_export
49
+ (#match? @http_export "^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)$")))))
50
+
43
51
  ; Detect Next.js Server Action directive: 'use server' at file top.
44
52
  ; Tree-sitter represents the directive as an expression_statement whose only
45
53
  ; child is a string literal — and it must be at program level.
@@ -31,6 +31,13 @@
31
31
  (variable_declarator
32
32
  name: (identifier) @export.named.const)))
33
33
 
34
+ ; export const { Foo, Bar } = ... (destructured re-export — Auth.js v5 pattern)
35
+ (export_statement
36
+ declaration: (lexical_declaration
37
+ (variable_declarator
38
+ name: (object_pattern
39
+ (shorthand_property_identifier_pattern) @export.named.const))))
40
+
34
41
  ; export type Foo = ...
35
42
  (export_statement
36
43
  declaration: (type_alias_declaration