@oversk7/pi-web-dsh-style 0.1.0-alpha.1

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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/THIRD_PARTY_NOTICES.md +90 -0
  4. package/abort-session.ts +150 -0
  5. package/attachment-store.ts +161 -0
  6. package/file-preview.ts +94 -0
  7. package/index.ts +177 -0
  8. package/local-session.ts +190 -0
  9. package/package.json +70 -0
  10. package/pi-rpc.ts +253 -0
  11. package/server.ts +3060 -0
  12. package/sse-channel.ts +72 -0
  13. package/state-store.ts +64 -0
  14. package/transcript.ts +328 -0
  15. package/web/app.css +535 -0
  16. package/web/app.js +4228 -0
  17. package/web/assets/fonts/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  18. package/web/assets/fonts/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  19. package/web/assets/fonts/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  20. package/web/assets/fonts/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  21. package/web/assets/fonts/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  22. package/web/assets/fonts/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  23. package/web/assets/fonts/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  24. package/web/assets/fonts/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  25. package/web/assets/fonts/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  26. package/web/assets/fonts/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  27. package/web/assets/fonts/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  28. package/web/assets/fonts/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  29. package/web/assets/fonts/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  30. package/web/assets/fonts/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  31. package/web/assets/fonts/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  32. package/web/assets/fonts/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  33. package/web/assets/fonts/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  34. package/web/assets/fonts/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  35. package/web/assets/fonts/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  36. package/web/assets/fonts/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  37. package/web/assets/fonts/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  38. package/web/assets/fonts/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  39. package/web/assets/fonts/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  40. package/web/assets/fonts/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  41. package/web/assets/fonts/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  42. package/web/assets/fonts/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  43. package/web/assets/fonts/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  44. package/web/assets/fonts/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  45. package/web/assets/fonts/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  46. package/web/assets/fonts/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  47. package/web/assets/fonts/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  48. package/web/assets/fonts/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  49. package/web/assets/fonts/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  50. package/web/assets/fonts/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  51. package/web/assets/fonts/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  52. package/web/assets/fonts/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  53. package/web/assets/fonts/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  54. package/web/assets/fonts/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  55. package/web/assets/fonts/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  56. package/web/assets/fonts/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  57. package/web/assets/fonts/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  58. package/web/assets/fonts/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  59. package/web/assets/fonts/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  60. package/web/assets/fonts/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  61. package/web/assets/fonts/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  62. package/web/assets/fonts/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  63. package/web/assets/fonts/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  64. package/web/assets/fonts/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  65. package/web/assets/fonts/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  66. package/web/assets/fonts/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  67. package/web/assets/fonts/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  68. package/web/assets/fonts/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  69. package/web/assets/fonts/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  70. package/web/assets/fonts/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  71. package/web/assets/fonts/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  72. package/web/assets/fonts/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  73. package/web/assets/fonts/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  74. package/web/assets/fonts/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  75. package/web/assets/fonts/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  76. package/web/favicon.svg +4 -0
  77. package/web/index.html +25 -0
  78. package/web/manifest.webmanifest +9 -0
  79. package/windows-clipboard.ts +81 -0
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
2
+ <rect width="50" height="50" rx="12" fill="#3964fe"/>
3
+ <text x="25" y="34" text-anchor="middle" font-family="Georgia, 'Times New Roman', serif" font-size="30" font-weight="700" fill="#fff">π</text>
4
+ </svg>
package/web/index.html ADDED
@@ -0,0 +1,25 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="color-scheme" content="light dark" />
7
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
8
+ <link rel="manifest" href="/manifest.webmanifest" />
9
+ <title>Pi Web</title>
10
+ <link rel="stylesheet" href="/app.css" />
11
+ </head>
12
+ <body>
13
+ <script>
14
+ (() => {
15
+ const preference = localStorage.getItem("pi-web-theme") || "system";
16
+ const systemDark = preference === "system" && matchMedia("(prefers-color-scheme: dark)").matches;
17
+ const dark = preference === "dark" || systemDark;
18
+ document.documentElement.style.colorScheme = dark ? "dark" : "light";
19
+ document.body.toggleAttribute("data-ds-dark-theme", dark);
20
+ })();
21
+ </script>
22
+ <div id="root"></div>
23
+ <script type="module" src="/app.js"></script>
24
+ </body>
25
+ </html>
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "/",
3
+ "name": "Pi Web",
4
+ "short_name": "Pi Web",
5
+ "start_url": "/",
6
+ "scope": "/",
7
+ "display": "fullscreen",
8
+ "icons": [{ "src": "/favicon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" }]
9
+ }
@@ -0,0 +1,81 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { readFile, unlink } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+
7
+ const POWERSHELL_TIMEOUT_MS = 8_000;
8
+
9
+ function quotePowerShell(value: string): string {
10
+ return `'${value.replaceAll("'", "''")}'`;
11
+ }
12
+
13
+ function runPowerShell(script: string): Promise<number> {
14
+ return new Promise((resolve, reject) => {
15
+ const command = process.env.PI_WEB_POWERSHELL || "powershell.exe";
16
+ const child = spawn(command, ["-NoLogo", "-NoProfile", "-NonInteractive", "-STA", "-Command", script], {
17
+ stdio: ["ignore", "ignore", "pipe"],
18
+ windowsHide: true,
19
+ });
20
+ let stderr = "";
21
+ const timer = setTimeout(() => child.kill(), POWERSHELL_TIMEOUT_MS);
22
+ timer.unref();
23
+ child.stderr.on("data", (chunk: Buffer) => {
24
+ if (stderr.length < 16_384) stderr += chunk.toString("utf8");
25
+ });
26
+ child.on("error", (error) => {
27
+ clearTimeout(timer);
28
+ reject(new Error(`Unable to start Windows PowerShell for clipboard access: ${error.message}`));
29
+ });
30
+ child.on("close", (code, signal) => {
31
+ clearTimeout(timer);
32
+ if (signal) return reject(new Error("Windows clipboard access timed out"));
33
+ if (code === 0 || code === 3) return resolve(code);
34
+ reject(new Error(stderr.trim() || `Windows clipboard access failed with exit code ${code}`));
35
+ });
36
+ });
37
+ }
38
+
39
+ async function readClipboardFile(scriptBody: (path: string) => string): Promise<Uint8Array | null> {
40
+ if (process.platform !== "win32") throw new Error("pi-web clipboard paste currently supports Windows only");
41
+ const path = join(tmpdir(), `pi-web-clipboard-read-${randomUUID()}`);
42
+ try {
43
+ const code = await runPowerShell(scriptBody(path));
44
+ if (code === 3) return null;
45
+ const bytes = await readFile(path);
46
+ return bytes.length > 0 ? new Uint8Array(bytes) : null;
47
+ } finally {
48
+ await unlink(path).catch(() => {});
49
+ }
50
+ }
51
+
52
+ export function extensionForImageMimeType(mimeType: string): string | null {
53
+ switch (mimeType.split(";", 1)[0].trim().toLowerCase()) {
54
+ case "image/png": return "png";
55
+ case "image/jpeg": return "jpg";
56
+ case "image/webp": return "webp";
57
+ case "image/gif": return "gif";
58
+ default: return null;
59
+ }
60
+ }
61
+
62
+ export async function readClipboardImage(): Promise<{ bytes: Uint8Array; mimeType: string } | null> {
63
+ const bytes = await readClipboardFile((path) => [
64
+ "Add-Type -AssemblyName System.Windows.Forms",
65
+ "Add-Type -AssemblyName System.Drawing",
66
+ "$image = [System.Windows.Forms.Clipboard]::GetImage()",
67
+ "if ($null -eq $image) { exit 3 }",
68
+ `try { $image.Save(${quotePowerShell(path)}, [System.Drawing.Imaging.ImageFormat]::Png) } finally { $image.Dispose() }`,
69
+ ].join("; "));
70
+ return bytes ? { bytes, mimeType: "image/png" } : null;
71
+ }
72
+
73
+ export async function readClipboardText(): Promise<string | null> {
74
+ const bytes = await readClipboardFile((path) => [
75
+ "Add-Type -AssemblyName System.Windows.Forms",
76
+ "$text = [System.Windows.Forms.Clipboard]::GetText([System.Windows.Forms.TextDataFormat]::UnicodeText)",
77
+ "if ([string]::IsNullOrEmpty($text)) { exit 3 }",
78
+ `[System.IO.File]::WriteAllText(${quotePowerShell(path)}, $text, [System.Text.UTF8Encoding]::new($false))`,
79
+ ].join("; "));
80
+ return bytes ? Buffer.from(bytes).toString("utf8") : null;
81
+ }