@oversk7/pi-web-dsh-style 1.3.2 → 1.3.4

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 (187) hide show
  1. package/README.md +10 -2
  2. package/THIRD_PARTY_NOTICES.md +32 -3
  3. package/package.json +4 -1
  4. package/server.ts +234 -21
  5. package/sse-channel.ts +37 -1
  6. package/web/app.css +9 -1
  7. package/web/app.js +96 -25
  8. package/web/assets/fonts/KaTeX_AMS-Regular.ttf +0 -0
  9. package/web/assets/fonts/KaTeX_AMS-Regular.woff +0 -0
  10. package/web/assets/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  11. package/web/assets/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  12. package/web/assets/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  13. package/web/assets/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  14. package/web/assets/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  15. package/web/assets/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  16. package/web/assets/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  17. package/web/assets/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  18. package/web/assets/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  19. package/web/assets/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  20. package/web/assets/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  21. package/web/assets/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  22. package/web/assets/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  23. package/web/assets/fonts/KaTeX_Main-Bold.ttf +0 -0
  24. package/web/assets/fonts/KaTeX_Main-Bold.woff +0 -0
  25. package/web/assets/fonts/KaTeX_Main-Bold.woff2 +0 -0
  26. package/web/assets/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  27. package/web/assets/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  28. package/web/assets/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  29. package/web/assets/fonts/KaTeX_Main-Italic.ttf +0 -0
  30. package/web/assets/fonts/KaTeX_Main-Italic.woff +0 -0
  31. package/web/assets/fonts/KaTeX_Main-Italic.woff2 +0 -0
  32. package/web/assets/fonts/KaTeX_Main-Regular.ttf +0 -0
  33. package/web/assets/fonts/KaTeX_Main-Regular.woff +0 -0
  34. package/web/assets/fonts/KaTeX_Main-Regular.woff2 +0 -0
  35. package/web/assets/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  36. package/web/assets/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  37. package/web/assets/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  38. package/web/assets/fonts/KaTeX_Math-Italic.ttf +0 -0
  39. package/web/assets/fonts/KaTeX_Math-Italic.woff +0 -0
  40. package/web/assets/fonts/KaTeX_Math-Italic.woff2 +0 -0
  41. package/web/assets/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  42. package/web/assets/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  43. package/web/assets/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  44. package/web/assets/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  45. package/web/assets/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  46. package/web/assets/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  47. package/web/assets/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  48. package/web/assets/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  49. package/web/assets/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  50. package/web/assets/fonts/KaTeX_Script-Regular.ttf +0 -0
  51. package/web/assets/fonts/KaTeX_Script-Regular.woff +0 -0
  52. package/web/assets/fonts/KaTeX_Script-Regular.woff2 +0 -0
  53. package/web/assets/fonts/KaTeX_Size1-Regular.ttf +0 -0
  54. package/web/assets/fonts/KaTeX_Size1-Regular.woff +0 -0
  55. package/web/assets/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  56. package/web/assets/fonts/KaTeX_Size2-Regular.ttf +0 -0
  57. package/web/assets/fonts/KaTeX_Size2-Regular.woff +0 -0
  58. package/web/assets/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  59. package/web/assets/fonts/KaTeX_Size3-Regular.ttf +0 -0
  60. package/web/assets/fonts/KaTeX_Size3-Regular.woff +0 -0
  61. package/web/assets/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  62. package/web/assets/fonts/KaTeX_Size4-Regular.ttf +0 -0
  63. package/web/assets/fonts/KaTeX_Size4-Regular.woff +0 -0
  64. package/web/assets/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  65. package/web/assets/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  66. package/web/assets/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  67. package/web/assets/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  68. package/web/assets/katex.min.css +1 -0
  69. package/web/assets/markdown.LICENSE.txt +78 -0
  70. package/web/assets/markdown.js +536 -21
  71. package/web/assets/mermaid/chunks/abnfDiagram-YUKMZFIV-FZYDJU67.js +1 -0
  72. package/web/assets/mermaid/chunks/architecture-WOLXFQ4H-BZVX64AA.js +1 -0
  73. package/web/assets/mermaid/chunks/architectureDiagram-47P4ROYG-2BMC2Z7S.js +36 -0
  74. package/web/assets/mermaid/chunks/blockDiagram-E7TT5TSB-FH6ZULKF.js +140 -0
  75. package/web/assets/mermaid/chunks/c4Diagram-CRA5TL53-OG62EAHM.js +38 -0
  76. package/web/assets/mermaid/chunks/chunk-22D53RF2.js +2 -0
  77. package/web/assets/mermaid/chunks/chunk-25KVF5ZE.js +1 -0
  78. package/web/assets/mermaid/chunks/chunk-4HYFSIZT.js +1 -0
  79. package/web/assets/mermaid/chunks/chunk-4W4OQ3QY.js +1 -0
  80. package/web/assets/mermaid/chunks/chunk-5TQRX2ND.js +1 -0
  81. package/web/assets/mermaid/chunks/chunk-64OFLKGX.js +322 -0
  82. package/web/assets/mermaid/chunks/chunk-64OFLKGX.js.LEGAL.txt +17 -0
  83. package/web/assets/mermaid/chunks/chunk-6UFWKTSA.js +1 -0
  84. package/web/assets/mermaid/chunks/chunk-6ZAAIG6Q.js +10 -0
  85. package/web/assets/mermaid/chunks/chunk-76QEHT4T.js +1 -0
  86. package/web/assets/mermaid/chunks/chunk-A7665WVC.js +1 -0
  87. package/web/assets/mermaid/chunks/chunk-AECJS4LP.js +130 -0
  88. package/web/assets/mermaid/chunks/chunk-AECJS4LP.js.LEGAL.txt +5 -0
  89. package/web/assets/mermaid/chunks/chunk-ATQQWCXO.js +2 -0
  90. package/web/assets/mermaid/chunks/chunk-DQVO43GU.js +1 -0
  91. package/web/assets/mermaid/chunks/chunk-DSKRGV6V.js +1 -0
  92. package/web/assets/mermaid/chunks/chunk-EIBFAW37.js +1 -0
  93. package/web/assets/mermaid/chunks/chunk-FBC3PYSO.js +1 -0
  94. package/web/assets/mermaid/chunks/chunk-FQ5IIL54.js +88 -0
  95. package/web/assets/mermaid/chunks/chunk-GZYY6JMP.js +1 -0
  96. package/web/assets/mermaid/chunks/chunk-HIGPS4L2.js +1 -0
  97. package/web/assets/mermaid/chunks/chunk-HP75Y56I.js +2 -0
  98. package/web/assets/mermaid/chunks/chunk-JRAHLUQM.js +32 -0
  99. package/web/assets/mermaid/chunks/chunk-KNYDPLLK.js +1 -0
  100. package/web/assets/mermaid/chunks/chunk-L465623K.js +136 -0
  101. package/web/assets/mermaid/chunks/chunk-L7BMR7WL.js +1 -0
  102. package/web/assets/mermaid/chunks/chunk-LLGPMHB6.js +1 -0
  103. package/web/assets/mermaid/chunks/chunk-NBH7YOBD.js +15 -0
  104. package/web/assets/mermaid/chunks/chunk-NCOVM3YF.js +1 -0
  105. package/web/assets/mermaid/chunks/chunk-PHKIAKHS.js +1 -0
  106. package/web/assets/mermaid/chunks/chunk-PM2IFX5O.js +1 -0
  107. package/web/assets/mermaid/chunks/chunk-PN62QGJW.js +72 -0
  108. package/web/assets/mermaid/chunks/chunk-QHMFFOZZ.js +1 -0
  109. package/web/assets/mermaid/chunks/chunk-QQZBUVKZ.js +1 -0
  110. package/web/assets/mermaid/chunks/chunk-RV7WQMNL.js +1 -0
  111. package/web/assets/mermaid/chunks/chunk-STBOPOHX.js +1 -0
  112. package/web/assets/mermaid/chunks/chunk-T3FZWEYV.js +1 -0
  113. package/web/assets/mermaid/chunks/chunk-TMMWB6NQ.js +1 -0
  114. package/web/assets/mermaid/chunks/chunk-TPW5CADB.js +1 -0
  115. package/web/assets/mermaid/chunks/chunk-TSOLLCID.js +2 -0
  116. package/web/assets/mermaid/chunks/chunk-TWGPYWIY.js +1 -0
  117. package/web/assets/mermaid/chunks/chunk-WGMEMLED.js +1 -0
  118. package/web/assets/mermaid/chunks/chunk-XC2LKMMW.js +1 -0
  119. package/web/assets/mermaid/chunks/chunk-XHVVPFJ5.js +1 -0
  120. package/web/assets/mermaid/chunks/chunk-YIN5CSIF.js +2 -0
  121. package/web/assets/mermaid/chunks/chunk-YIN5CSIF.js.LEGAL.txt +12 -0
  122. package/web/assets/mermaid/chunks/chunk-YORIST7Z.js +1 -0
  123. package/web/assets/mermaid/chunks/chunk-YPXVLPXW.js +3 -0
  124. package/web/assets/mermaid/chunks/chunk-Z4WODCD2.js +213 -0
  125. package/web/assets/mermaid/chunks/chunk-ZAERIUBF.js +1 -0
  126. package/web/assets/mermaid/chunks/chunk-ZDOBOOWG.js +62 -0
  127. package/web/assets/mermaid/chunks/classDiagram-v2-K4WV4PDN-HXQD675C.js +217 -0
  128. package/web/assets/mermaid/chunks/cose-bilkent-JH36ORCC-3VHNHM7I.js +1 -0
  129. package/web/assets/mermaid/chunks/cynefin-EF2NZ3EQ-ZO5PPXJG.js +1 -0
  130. package/web/assets/mermaid/chunks/cynefinDiagram-3GCD6N5R-LFWDWE4E.js +62 -0
  131. package/web/assets/mermaid/chunks/dagre-W4DXFKR2-SDBBVBGG.js +4 -0
  132. package/web/assets/mermaid/chunks/diagram-2UJZ2QOL-YCKW3WNJ.js +200 -0
  133. package/web/assets/mermaid/chunks/diagram-OVF4WLC6-62NNPE34.js +24 -0
  134. package/web/assets/mermaid/chunks/diagram-PFPMY2P6-7RR2GTZ5.js +30 -0
  135. package/web/assets/mermaid/chunks/diagram-UMYRVEAY-Q4I25SMR.js +24 -0
  136. package/web/assets/mermaid/chunks/diagram-YEKJPTXX-VNUTOPRK.js +41 -0
  137. package/web/assets/mermaid/chunks/diagram-ZIFT7M5P-KALXX5CE.js +3 -0
  138. package/web/assets/mermaid/chunks/ebnfDiagram-VR2GEFS7-WIFBISHL.js +1 -0
  139. package/web/assets/mermaid/chunks/elk-IJKZMXRS-LGG232IL.js +27 -0
  140. package/web/assets/mermaid/chunks/erDiagram-O2IAPWRE-KWX2J2TX.js +99 -0
  141. package/web/assets/mermaid/chunks/eventmodeling-K75KTNOO-3JNV4VSP.js +1 -0
  142. package/web/assets/mermaid/chunks/flowDiagram-OXPTDLAJ-CUMOBDC3.js +1 -0
  143. package/web/assets/mermaid/chunks/ganttDiagram-R7TSEDQI-GCS3MRFX.js +292 -0
  144. package/web/assets/mermaid/chunks/gitGraph-VSP46ZUC-HSAXKLAG.js +1 -0
  145. package/web/assets/mermaid/chunks/gitGraphDiagram-XJZIOB7I-FB763ROZ.js +106 -0
  146. package/web/assets/mermaid/chunks/info-OHQRW6UA-C4R2B34T.js +1 -0
  147. package/web/assets/mermaid/chunks/infoDiagram-5W2HQ5XZ-XCQU5T5D.js +2 -0
  148. package/web/assets/mermaid/chunks/ishikawaDiagram-K3B6WC7H-UWYT66G7.js +70 -0
  149. package/web/assets/mermaid/chunks/journeyDiagram-COXZFDF6-DOW66RYW.js +139 -0
  150. package/web/assets/mermaid/chunks/kanban-definition-P3RFRI5V-K55BXDLO.js +89 -0
  151. package/web/assets/mermaid/chunks/katex-5AUD5AJN.js +257 -0
  152. package/web/assets/mermaid/chunks/mindmap-definition-LZFPQGKD-WG3FIZ5U.js +96 -0
  153. package/web/assets/mermaid/chunks/packet-JDAUHWVQ-SFUSDIUN.js +1 -0
  154. package/web/assets/mermaid/chunks/pegDiagram-BGZESJAR-MQOH3WII.js +1 -0
  155. package/web/assets/mermaid/chunks/pie-XZMESJXO-M76QC4CD.js +1 -0
  156. package/web/assets/mermaid/chunks/pieDiagram-CAPJLFHJ-V3WNR4Y2.js +39 -0
  157. package/web/assets/mermaid/chunks/quadrantDiagram-GDMTTRAM-DJLTATHS.js +7 -0
  158. package/web/assets/mermaid/chunks/radar-ABXABTNO-HSBJ6SSD.js +1 -0
  159. package/web/assets/mermaid/chunks/railroad-I3PHUGI6-4QJMJ7LG.js +1 -0
  160. package/web/assets/mermaid/chunks/railroad-abnf-LNEFI6M7-ZLNZ5ZRH.js +1 -0
  161. package/web/assets/mermaid/chunks/railroad-ebnf-DWYD2UWJ-EBV6ZOUW.js +1 -0
  162. package/web/assets/mermaid/chunks/railroad-peg-JR7BVNR7-X3E47TO7.js +1 -0
  163. package/web/assets/mermaid/chunks/railroadDiagram-SM67HX2B-ZHEERYJS.js +1 -0
  164. package/web/assets/mermaid/chunks/requirementDiagram-X7JNWC4A-TVHJNPPI.js +84 -0
  165. package/web/assets/mermaid/chunks/sankeyDiagram-UM26HJRW-FXHWY3MM.js +40 -0
  166. package/web/assets/mermaid/chunks/sequenceDiagram-ZO4K6R2Y-OP7DCVPK.js +169 -0
  167. package/web/assets/mermaid/chunks/sizeCapture-INFHLROL-2GUJIKNX.js +1 -0
  168. package/web/assets/mermaid/chunks/stateDiagram-v2-TBUQTH76-R26D6XHK.js +291 -0
  169. package/web/assets/mermaid/chunks/swimlanes-N4OXWK64-FPGACWHE.js +1 -0
  170. package/web/assets/mermaid/chunks/swimlanesDiagram-K3J5GTZL-YMNX34Q2.js +8 -0
  171. package/web/assets/mermaid/chunks/timeline-definition-YOQAKGHF-R2U2UR4K.js +120 -0
  172. package/web/assets/mermaid/chunks/treeView-D4JQ5SDB-3BQHZUCI.js +1 -0
  173. package/web/assets/mermaid/chunks/treemap-SAJKECNS-6NJPJ5NM.js +1 -0
  174. package/web/assets/mermaid/chunks/usecaseDiagram-VIAY4XPW-BCEIGXDX.js +370 -0
  175. package/web/assets/mermaid/chunks/vennDiagram-BLWOH2XV-DOV5W2IV.js +34 -0
  176. package/web/assets/mermaid/chunks/wardley-7MLQ67FV-ITOM4KQ2.js +1 -0
  177. package/web/assets/mermaid/chunks/wardleyDiagram-YMQ3BMBF-CGJ7AG4L.js +78 -0
  178. package/web/assets/mermaid/chunks/xychartDiagram-TAQBALBS-2MTP7IBV.js +7 -0
  179. package/web/assets/mermaid/mermaid.js +11 -0
  180. package/web/assets/mermaid/mermaid.js.LEGAL.txt +7 -0
  181. package/web/index.html +1 -0
  182. package/web/markdown-diagrams.js +147 -0
  183. package/web/markdown.ts +41 -2
  184. package/web/session-sync.d.ts +12 -0
  185. package/web/session-sync.js +105 -0
  186. package/web/slash-commands.js +1 -0
  187. package/web/themes.css +46 -0
package/web/app.js CHANGED
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
 
3
3
  import { markdown as renderMarkdown } from "./assets/markdown.js";
4
+ import { observeMarkdownDiagrams } from "./markdown-diagrams.js";
5
+ import { applySessionPatches } from "./session-sync.js";
6
+
7
+ observeMarkdownDiagrams();
4
8
  import { webSlashCommands, unsupportedSlashCommands, parseSlashCommand } from "./slash-commands.js";
5
9
  import { getLanguage, setLanguage, t, translateUi, observeUi } from "./i18n.js";
6
10
 
@@ -17,6 +21,8 @@ const S = {
17
21
  currentWorkspaceId: null,
18
22
  currentSessionId: null,
19
23
  snapshots: new Map(),
24
+ loadedSessions: new Set(),
25
+ sessionOpens: new Map(),
20
26
  newSessionSnapshot: null,
21
27
  newSessionPreferenceWorkspaceId: null,
22
28
  collapsed: new Set(),
@@ -105,8 +111,8 @@ async function api(path, options = {}) {
105
111
  return data;
106
112
  }
107
113
 
108
- function post(path, body) {
109
- return api(path, { method: "POST", body: JSON.stringify(body || {}) });
114
+ function post(path, body, options = {}) {
115
+ return api(path, { ...options, method: "POST", body: JSON.stringify(body || {}) });
110
116
  }
111
117
 
112
118
  function timeLabel(iso) {
@@ -437,7 +443,6 @@ function usesMobileFilePreview() {
437
443
 
438
444
  function updateViewport() {
439
445
  const viewport = window.visualViewport;
440
- if (viewport && viewport.scale !== 1) return;
441
446
  document.documentElement.style.setProperty("--pi-viewport-height", `${viewport?.height || window.innerHeight}px`);
442
447
  document.documentElement.style.setProperty("--pi-viewport-top", `${viewport?.offsetTop || 0}px`);
443
448
  }
@@ -1454,6 +1459,7 @@ function renderActive() {
1454
1459
  }
1455
1460
 
1456
1461
  function renderConversation() {
1462
+ syncEventSubscription();
1457
1463
  const mount = $("#conversationMount");
1458
1464
  if (!mount) return;
1459
1465
  const previousInput = $("#composerInput");
@@ -3125,7 +3131,14 @@ async function openSession(id, opts = {}) {
3125
3131
  if (!opts.skipRemember) rememberCurrentDraft();
3126
3132
  const generation = ++S.openGeneration;
3127
3133
  S.currentSessionId = id;
3128
- S.loadingSession = opts.initialSnapshot ? null : id;
3134
+ if (opts.initialSnapshot) {
3135
+ S.snapshots.set(id, opts.initialSnapshot);
3136
+ S.loadedSessions.add(id);
3137
+ }
3138
+ const before = S.snapshots.get(id);
3139
+ const cached = S.loadedSessions.has(id) && before?.session?.id === id && !before.error;
3140
+ S.loadingSession = cached ? null : id;
3141
+ if (before?.session?.workspaceId) S.currentWorkspaceId = before.session.workspaceId;
3129
3142
  if (!opts.silent) {
3130
3143
  const key = draftKey(id);
3131
3144
  const savedDraft = S.drafts.get(key) || "";
@@ -3140,14 +3153,24 @@ async function openSession(id, opts = {}) {
3140
3153
  }
3141
3154
  renderSidebar();
3142
3155
  renderConversation();
3156
+ let request = S.sessionOpens.get(id);
3143
3157
  try {
3144
- const data = opts.initialSnapshot ?? await post(`/api/sessions/${encodeURIComponent(id)}/open`);
3145
- S.snapshots.set(id, data);
3158
+ if (!opts.initialSnapshot && !request) {
3159
+ const promise = post(`/api/sessions/${encodeURIComponent(id)}/open`, {}, { signal: AbortSignal.timeout(15_000) })
3160
+ .finally(() => { S.sessionOpens.delete(id); });
3161
+ request = { promise, snapshot: before };
3162
+ S.sessionOpens.set(id, request);
3163
+ }
3164
+ const data = opts.initialSnapshot ?? await request.promise;
3165
+ if (S.snapshots.get(id) === (opts.initialSnapshot ? before : request.snapshot)) S.snapshots.set(id, data);
3166
+ S.loadedSessions.add(id);
3146
3167
  if (generation !== S.openGeneration) return;
3147
3168
  const ws = data.session?.workspaceId;
3148
3169
  if (ws) S.currentWorkspaceId = ws;
3149
3170
  } catch (error) {
3150
- S.snapshots.set(id, { ...snapshotFor(id), session: { id, title: "会话", status: "error" }, error: String(error) });
3171
+ if (!cached && S.snapshots.get(id) === (request ? request.snapshot : before)) {
3172
+ S.snapshots.set(id, { ...snapshotFor(id), session: { id, title: "会话", status: "error" }, error: String(error) });
3173
+ }
3151
3174
  } finally {
3152
3175
  if (generation === S.openGeneration) {
3153
3176
  S.loadingSession = null;
@@ -4867,6 +4890,7 @@ async function onClick(ev) {
4867
4890
  ];
4868
4891
  await Promise.all(orphanedAttachments.map((attachment) => deleteAttachment(attachment.id)));
4869
4892
  S.snapshots.delete(sessionId);
4893
+ S.loadedSessions.delete(sessionId);
4870
4894
  S.drafts.delete(sessionDraftKey);
4871
4895
  S.failedDrafts.delete(sessionId);
4872
4896
  S.attachmentDrafts.delete(sessionDraftKey);
@@ -5122,7 +5146,8 @@ let loginPromise;
5122
5146
 
5123
5147
  function requireLogin() {
5124
5148
  if (loginPromise) return loginPromise;
5125
- eventSource?.close();
5149
+ let authenticated = false;
5150
+ disconnectEvents();
5126
5151
  loginPromise = (async () => {
5127
5152
  let { passwordConfigured } = await api("/api/auth");
5128
5153
  const dialog = el(`<div class="pi-loginBackdrop">
@@ -5161,6 +5186,7 @@ function requireLogin() {
5161
5186
  input.value = "";
5162
5187
  dialog.remove();
5163
5188
  root.inert = false;
5189
+ authenticated = true;
5164
5190
  resolve();
5165
5191
  } catch (error) {
5166
5192
  message.textContent = error.message || String(error);
@@ -5170,8 +5196,10 @@ function requireLogin() {
5170
5196
  }
5171
5197
  };
5172
5198
  });
5173
- if (eventSource) connectEvents();
5174
- })().finally(() => { loginPromise = null; });
5199
+ })().finally(() => {
5200
+ loginPromise = null;
5201
+ if (authenticated && !document.hidden) connectEvents();
5202
+ });
5175
5203
  return loginPromise;
5176
5204
  }
5177
5205
 
@@ -5180,6 +5208,17 @@ let eventWatchdog;
5180
5208
  let lastEventAt = 0;
5181
5209
  let resyncPending;
5182
5210
 
5211
+ function disconnectEvents() {
5212
+ eventSource?.close();
5213
+ eventSource = null;
5214
+ clearInterval(eventWatchdog);
5215
+ }
5216
+
5217
+ function syncEventSubscription() {
5218
+ if (document.hidden || !eventSource || loginPromise) return;
5219
+ if (eventSource.sessionId !== (S.currentSessionId || null)) connectEvents(false);
5220
+ }
5221
+
5183
5222
  async function resyncAfterReconnect() {
5184
5223
  if (resyncPending) return resyncPending;
5185
5224
  resyncPending = (async () => {
@@ -5198,7 +5237,7 @@ async function resyncAfterReconnect() {
5198
5237
  const data = await api(`/api/sessions/${encodeURIComponent(id)}/open`, {
5199
5238
  method: "POST", body: "{}", signal: AbortSignal.timeout(15_000),
5200
5239
  });
5201
- if (S.snapshots.get(id) === before) S.snapshots.set(id, data);
5240
+ if (id === S.currentSessionId && generation === S.openGeneration && S.snapshots.get(id) === before) S.snapshots.set(id, data);
5202
5241
  } else if (id && generation === S.openGeneration) {
5203
5242
  rememberCurrentDraft();
5204
5243
  ++S.openGeneration;
@@ -5213,21 +5252,31 @@ async function resyncAfterReconnect() {
5213
5252
  return resyncPending;
5214
5253
  }
5215
5254
 
5216
- function connectEvents() {
5217
- eventSource?.close();
5218
- const es = new EventSource("/api/events");
5255
+ function connectEvents(resync = true) {
5256
+ disconnectEvents();
5257
+ if (document.hidden || loginPromise) return;
5258
+ const sessionId = S.currentSessionId || null;
5259
+ const query = sessionId ? `?sessionId=${encodeURIComponent(sessionId)}` : "";
5260
+ const es = new EventSource(`/api/events${query}`);
5261
+ es.sessionId = sessionId;
5219
5262
  eventSource = es;
5263
+ let streamedSnapshot;
5264
+ let streamRevision = 0;
5265
+ let opened = false;
5220
5266
  lastEventAt = Date.now();
5221
- clearInterval(eventWatchdog);
5222
5267
  // Heartbeats arrive every 25s, including when the model is idle. Some mobile
5223
5268
  // networks leave a dead stream open without notifying EventSource.
5224
5269
  eventWatchdog = setInterval(() => {
5225
- if (document.hidden || loginPromise || eventSource !== es) return;
5270
+ if (eventSource !== es || document.hidden || loginPromise) return;
5226
5271
  if (Date.now() - lastEventAt > 60_000) connectEvents();
5227
5272
  }, 5_000);
5228
5273
  es.onopen = () => {
5274
+ if (eventSource !== es) return;
5275
+ streamedSnapshot = undefined;
5276
+ streamRevision = 0;
5229
5277
  lastEventAt = Date.now();
5230
- void resyncAfterReconnect();
5278
+ if (resync || opened) void resyncAfterReconnect();
5279
+ opened = true;
5231
5280
  };
5232
5281
  es.onmessage = (ev) => {
5233
5282
  if (eventSource !== es) return;
@@ -5263,11 +5312,30 @@ function connectEvents() {
5263
5312
  }
5264
5313
  return;
5265
5314
  }
5266
- if (event.type === "snapshot") {
5267
- if (!event.sessionId) return;
5268
- S.snapshots.set(event.sessionId, { ...snapshotFor(event.sessionId), ...event });
5315
+ if (event.type === "snapshot" || event.type === "session_patch") {
5316
+ if (!event.sessionId || event.sessionId !== es.sessionId || event.sessionId !== S.currentSessionId) return;
5317
+ if (event.type === "snapshot") {
5318
+ const { revision, ...snapshot } = event;
5319
+ streamedSnapshot = snapshot;
5320
+ streamRevision = revision;
5321
+ } else {
5322
+ if (!streamedSnapshot || event.baseRevision !== streamRevision || event.revision !== streamRevision + 1) {
5323
+ connectEvents(false);
5324
+ return;
5325
+ }
5326
+ try {
5327
+ streamedSnapshot = applySessionPatches(streamedSnapshot, event.patches);
5328
+ } catch {
5329
+ connectEvents(false);
5330
+ return;
5331
+ }
5332
+ streamRevision = event.revision;
5333
+ }
5334
+ S.snapshots.set(event.sessionId, { ...snapshotFor(event.sessionId), error: undefined, ...streamedSnapshot });
5269
5335
  const current = event.sessionId === S.currentSessionId;
5270
- queueRender(false, { sidebar: false, conversation: current, overlay: current });
5336
+ // Settings do not depend on session snapshots. Rebuilding the panel on
5337
+ // every streamed chunk replaces controls between pointerdown and click.
5338
+ queueRender(false, { sidebar: false, conversation: current, overlay: false });
5271
5339
  return;
5272
5340
  }
5273
5341
  if (event.type === "workspaces") {
@@ -5290,21 +5358,24 @@ function connectEvents() {
5290
5358
  }
5291
5359
  }
5292
5360
  if (unchanged && !conversationChanged) return;
5293
- queueRender(false, { sidebar: true, conversation: conversationChanged, overlay: conversationChanged });
5361
+ queueRender(false, { sidebar: true, conversation: conversationChanged, overlay: false });
5294
5362
  }
5295
5363
  } catch {
5296
5364
  // ignore malformed event
5297
5365
  }
5298
5366
  };
5299
- es.onerror = () => { void resyncAfterReconnect(); };
5367
+ es.onerror = () => {
5368
+ if (eventSource === es && !document.hidden) void resyncAfterReconnect();
5369
+ };
5300
5370
  }
5301
5371
 
5302
5372
  window.addEventListener("resize", () => { updateViewport(); applyFrameLayout(); });
5303
5373
  window.visualViewport?.addEventListener("resize", updateViewport);
5304
5374
  window.visualViewport?.addEventListener("scroll", updateViewport);
5305
- window.addEventListener("online", () => { if (eventSource && !loginPromise) connectEvents(); });
5375
+ window.addEventListener("online", () => { if (!document.hidden && !loginPromise) connectEvents(); });
5306
5376
  document.addEventListener("visibilitychange", () => {
5307
- if (!document.hidden && eventSource && !loginPromise) connectEvents();
5377
+ if (document.hidden) disconnectEvents();
5378
+ else if (!loginPromise) connectEvents();
5308
5379
  });
5309
5380
  setLanguage(getLanguage());
5310
5381
  observeUi();
@@ -0,0 +1 @@
1
+ @font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,math,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.19.0"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.katex-newline{display:block}.katex .katex-base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .katex-base,.katex .katex-strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .katex-vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .katex-thinbox{display:inline-flex;flex-direction:row;max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .katex-hdashline,.katex .katex-hline,.katex .katex-overline .overline-line,.katex .katex-rule,.katex .katex-underline .underline-line,.katex .mfrac .frac-line{min-height:1px}.katex .mspace{display:inline-block}.katex .katex-smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.katex-inner,.katex .llap>.katex-inner,.katex .rlap>.katex-inner{position:absolute}.katex .clap>.katex-fix,.katex .llap>.katex-fix,.katex .rlap>.katex-fix{display:inline-block}.katex .llap>.katex-inner{right:0}.katex .clap>.katex-inner,.katex .rlap>.katex-inner{left:0}.katex .clap>.katex-inner>span{margin-left:-50%;margin-right:50%}.katex .katex-rule{border:0 solid;display:inline-block;position:relative}.katex .katex-hline,.katex .katex-overline .overline-line,.katex .katex-underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .katex-hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.katex-root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .katex-sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .katex-sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .katex-sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .katex-sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .katex-sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .katex-sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .katex-sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .katex-sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .katex-sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .katex-sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .katex-sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .katex-sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .katex-sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .katex-sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .katex-sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .katex-sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .katex-sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .katex-sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .katex-sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .katex-sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .katex-sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .katex-sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .katex-sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .katex-sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .katex-sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .katex-sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .katex-sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .katex-sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .katex-sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .katex-sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .katex-sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .katex-sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .katex-sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .katex-sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .katex-sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .katex-sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .katex-sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .katex-sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .katex-sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .katex-sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .katex-sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .katex-sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .katex-sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .katex-sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .katex-sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .katex-sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .katex-sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .katex-sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .katex-sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .katex-sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .katex-sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .katex-sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .katex-sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .katex-sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .katex-sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .katex-sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .katex-sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .katex-sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .katex-sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .katex-sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .katex-sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .katex-sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .katex-sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .katex-sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .katex-sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .katex-sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .katex-sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .katex-sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .katex-sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .katex-sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .katex-sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .katex-sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .katex-sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .katex-sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .katex-sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .katex-sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .katex-sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .katex-sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .katex-sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .katex-sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .katex-sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .katex-sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .katex-sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .katex-sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .katex-sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .katex-sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .katex-sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .katex-sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .katex-sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .katex-sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .katex-sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .katex-sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .katex-sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .katex-sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .katex-sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .katex-sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .katex-sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .katex-sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .katex-sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .katex-sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .katex-sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .katex-sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .katex-sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .katex-sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .katex-sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .katex-sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .katex-sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .katex-sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .katex-sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .katex-sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .katex-sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .katex-sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .katex-sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .katex-sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .katex-sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .katex-sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .katex-sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .katex-sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .katex-sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .katex-sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .katex-sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .katex-accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .katex-accent .accent-body{position:relative}.katex .katex-accent .accent-body:not(.accent-full){width:0}.katex .katex-overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .katex-stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .katex-stretchy:after,.katex .katex-stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .katex-sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .reflectbox{display:inline-block;transform:scaleX(-1)}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.katex-tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.katex-tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}
@@ -198,3 +198,81 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
198
198
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
199
199
  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
200
200
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
201
+
202
+
203
+ ---
204
+
205
+ katex
206
+ The MIT License (MIT)
207
+
208
+ Copyright (c) 2013-2020 Khan Academy and other contributors
209
+
210
+ Permission is hereby granted, free of charge, to any person obtaining a copy
211
+ of this software and associated documentation files (the "Software"), to deal
212
+ in the Software without restriction, including without limitation the rights
213
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
214
+ copies of the Software, and to permit persons to whom the Software is
215
+ furnished to do so, subject to the following conditions:
216
+
217
+ The above copyright notice and this permission notice shall be included in all
218
+ copies or substantial portions of the Software.
219
+
220
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
221
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
222
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
223
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
224
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
225
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
226
+ SOFTWARE.
227
+
228
+
229
+ ---
230
+
231
+ markdown-it-texmath
232
+ MIT License
233
+
234
+ Copyright (c) 2013-17 Stefan Goessner
235
+
236
+ Permission is hereby granted, free of charge, to any person obtaining a copy
237
+ of this software and associated documentation files (the "Software"), to deal
238
+ in the Software without restriction, including without limitation the rights
239
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
240
+ copies of the Software, and to permit persons to whom the Software is
241
+ furnished to do so, subject to the following conditions:
242
+
243
+ The above copyright notice and this permission notice shall be included in all
244
+ copies or substantial portions of the Software.
245
+
246
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
247
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
248
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
249
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
250
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
251
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
252
+ SOFTWARE.
253
+
254
+
255
+ ---
256
+
257
+ mermaid
258
+ The MIT License (MIT)
259
+
260
+ Copyright (c) 2014 - 2022 Knut Sveidqvist
261
+
262
+ Permission is hereby granted, free of charge, to any person obtaining a copy
263
+ of this software and associated documentation files (the "Software"), to deal
264
+ in the Software without restriction, including without limitation the rights
265
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
266
+ copies of the Software, and to permit persons to whom the Software is
267
+ furnished to do so, subject to the following conditions:
268
+
269
+ The above copyright notice and this permission notice shall be included in all
270
+ copies or substantial portions of the Software.
271
+
272
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
273
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
274
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
275
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
276
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
277
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
278
+ SOFTWARE.