openportal 0.1.2 → 0.1.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.
package/README.md ADDED
@@ -0,0 +1,113 @@
1
+ # OpenCode Portal
2
+
3
+ ![banner](https://raw.githubusercontent.com/hosenur/portal/main/banner.png)
4
+
5
+ > **Disclaimer**: This is a **personal project** and is **not related** to [https://github.com/sst/opencode](https://github.com/sst/opencode) or the SST team. This portal is a personal-built interface for interacting with OpenCode instances.
6
+
7
+ A web-based UI for [OpenCode](https://opencode.ai), the AI coding agent. This portal provides a browser interface to interact with OpenCode sessions, view messages, and chat with the AI assistant.
8
+
9
+ ## Quick Start
10
+
11
+ ### Using npx (Recommended)
12
+
13
+ The easiest way to run OpenCode Portal is using npx:
14
+
15
+ ```bash
16
+ # Navigate to your project directory
17
+ cd /path/to/your/project
18
+
19
+ # Run OpenCode Portal
20
+ npx openportal
21
+ ```
22
+
23
+ This will:
24
+
25
+ - Start the OpenCode server on port 4000
26
+ - Start the web UI on port 3000
27
+ - Open your browser automatically
28
+
29
+ ### Installation
30
+
31
+ You can also install globally:
32
+
33
+ ```bash
34
+ npm install -g openportal
35
+
36
+ # Then run in any project directory
37
+ openportal
38
+ ```
39
+
40
+ ## CLI Options
41
+
42
+ ```bash
43
+ openportal [options]
44
+
45
+ Options:
46
+ -V, --version output the version number
47
+ -p, --port <port> Port for web UI (default: "3000")
48
+ --opencode-port <port> Port for OpenCode server (default: "4000")
49
+ -d, --directory <path> Working directory for OpenCode
50
+ --no-browser Do not open browser automatically
51
+ --skip-opencode-check Skip OpenCode installation check
52
+ -h, --help display help for command
53
+ ```
54
+
55
+ ### Examples
56
+
57
+ ```bash
58
+ # Use custom ports
59
+ openportal --port 8080 --opencode-port 5000
60
+
61
+ # Don't open browser
62
+ openportal --no-browser
63
+
64
+ # Specify a different project directory
65
+ openportal -d /path/to/other/project
66
+ ```
67
+
68
+ ## Prerequisites
69
+
70
+ OpenCode must be installed on your system. Install it using one of these methods:
71
+
72
+ ```bash
73
+ # Using curl (macOS/Linux)
74
+ curl -fsSL https://opencode.ai/install | bash
75
+
76
+ # Using npm
77
+ npm install -g opencode
78
+
79
+ # Using Homebrew (macOS)
80
+ brew install sst/tap/opencode
81
+ ```
82
+
83
+ ## Features
84
+
85
+ OpenCode Portal provides:
86
+
87
+ - Session management (create, view, delete sessions)
88
+ - Real-time chat interface with the AI assistant
89
+ - File mention support (`@filename` to reference files)
90
+ - Model selection
91
+ - Dark/light theme support
92
+ - Mobile-first responsive design
93
+
94
+ ## Why This Project?
95
+
96
+ OpenCode comes with its own official web UI, but it has some limitations:
97
+
98
+ - Not mobile responsive
99
+ - Limited mobile experience
100
+
101
+ This project provides a mobile-first, responsive interface for interacting with OpenCode instances remotely.
102
+
103
+ ## Use Case
104
+
105
+ This portal is designed for remote access to your OpenCode instance. Deploy it on a VPS alongside OpenCode, then use [Tailscale](https://tailscale.com) (or similar VPN) to securely connect from your mobile device or any other machine.
106
+
107
+ ```
108
+ [Your Phone] ---(Tailscale)---> [VPS running Portal + OpenCode]
109
+ ```
110
+
111
+ ## License
112
+
113
+ MIT
package/dist/cli.js CHANGED
@@ -1,11 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
- import { resolve } from "node:path";
3
+ import { resolve, dirname } from "node:path";
4
4
  import { cwd } from "node:process";
5
+ import { readFileSync } from "node:fs";
6
+ import { fileURLToPath } from "node:url";
5
7
  import { logSuccess, logError, logInfo, setupShutdownHandlers, killAllProcesses, openBrowser, isPortAvailable, colors, } from "./utils.js";
6
8
  import { checkOpencodeInstalled, startOpencodeServer, stopOpencodeServer, printInstallInstructions, } from "./opencode.js";
7
9
  import { startWebServer, stopWebServer } from "./server.js";
8
- const version = "0.1.0";
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ const packageJson = JSON.parse(readFileSync(resolve(__dirname, "..", "package.json"), "utf-8"));
13
+ const version = packageJson.version;
9
14
  async function main() {
10
15
  const program = new Command();
11
16
  program
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiB9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAkBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiE9B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAKtD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiB9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAmBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiE9B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAKtD"}
package/dist/server.js CHANGED
@@ -7,6 +7,7 @@ const __filename = fileURLToPath(import.meta.url);
7
7
  const __dirname = dirname(__filename);
8
8
  function findWebDirectory() {
9
9
  const possiblePaths = [
10
+ resolve(__dirname, "..", "web", "apps", "web"),
10
11
  resolve(__dirname, "..", "web"),
11
12
  resolve(__dirname, "..", "..", "web"),
12
13
  resolve(__dirname, "..", "..", "..", "apps", "web", ".next", "standalone"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openportal",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "CLI to run OpenCode Portal - a web UI for OpenCode AI coding agent",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +1 @@
1
- XI6khKkj1If5Kb4-eJQ2z
1
+ 2AHkk-zsVTx40cm88r7SY
@@ -48,8 +48,8 @@
48
48
  "devFiles": [],
49
49
  "polyfillFiles": [],
50
50
  "lowPriorityFiles": [
51
- "static/XI6khKkj1If5Kb4-eJQ2z/_ssgManifest.js",
52
- "static/XI6khKkj1If5Kb4-eJQ2z/_buildManifest.js"
51
+ "static/2AHkk-zsVTx40cm88r7SY/_ssgManifest.js",
52
+ "static/2AHkk-zsVTx40cm88r7SY/_buildManifest.js"
53
53
  ],
54
54
  "rootMainFiles": []
55
55
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/3f78b6f3f4b66f36.js" defer=""></script><script src="/_next/static/chunks/turbopack-92c911b9efda2756.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_ssgManifest.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_buildManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"XI6khKkj1If5Kb4-eJQ2z","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/3f78b6f3f4b66f36.js" defer=""></script><script src="/_next/static/chunks/turbopack-92c911b9efda2756.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_ssgManifest.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_buildManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"2AHkk-zsVTx40cm88r7SY","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/3f78b6f3f4b66f36.js" defer=""></script><script src="/_next/static/chunks/turbopack-92c911b9efda2756.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_ssgManifest.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_buildManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"XI6khKkj1If5Kb4-eJQ2z","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/3f78b6f3f4b66f36.js" defer=""></script><script src="/_next/static/chunks/turbopack-92c911b9efda2756.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_ssgManifest.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_buildManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"2AHkk-zsVTx40cm88r7SY","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="preload" href="/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="preload" href="/_next/static/chunks/f9cf9aa757605a0d.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><link rel="stylesheet" href="/_next/static/chunks/f9cf9aa757605a0d.css" data-n-p=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/665a1ec483189124.js" defer=""></script><script src="/_next/static/chunks/d8f0ad36e12f0fbf.js" defer=""></script><script src="/_next/static/chunks/9865709466b09f79.js" defer=""></script><script src="/_next/static/chunks/turbopack-d5098189d63fd7b8.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_ssgManifest.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_buildManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"XI6khKkj1If5Kb4-eJQ2z","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="preload" href="/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="preload" href="/_next/static/chunks/f9cf9aa757605a0d.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><link rel="stylesheet" href="/_next/static/chunks/f9cf9aa757605a0d.css" data-n-p=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/665a1ec483189124.js" defer=""></script><script src="/_next/static/chunks/d8f0ad36e12f0fbf.js" defer=""></script><script src="/_next/static/chunks/9865709466b09f79.js" defer=""></script><script src="/_next/static/chunks/turbopack-d5098189d63fd7b8.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_ssgManifest.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_buildManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"2AHkk-zsVTx40cm88r7SY","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="preload" href="/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="preload" href="/_next/static/chunks/f9cf9aa757605a0d.css" as="style"/><link rel="preload" href="/_next/static/chunks/17cfb1b2ce0f096d.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><link rel="stylesheet" href="/_next/static/chunks/f9cf9aa757605a0d.css" data-n-p=""/><link rel="stylesheet" href="/_next/static/chunks/17cfb1b2ce0f096d.css" data-n-p=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/c59e89dc54c3cae8.js" defer=""></script><script src="/_next/static/chunks/d8f0ad36e12f0fbf.js" defer=""></script><script src="/_next/static/chunks/3ffbbca8f4333a24.js" defer=""></script><script src="/_next/static/chunks/9865709466b09f79.js" defer=""></script><script src="/_next/static/chunks/turbopack-26af71e419c11487.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_buildManifest.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_ssgManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/session/[id]","query":{},"buildId":"XI6khKkj1If5Kb4-eJQ2z","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="preload" href="/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="preload" href="/_next/static/chunks/f9cf9aa757605a0d.css" as="style"/><link rel="preload" href="/_next/static/chunks/17cfb1b2ce0f096d.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><link rel="stylesheet" href="/_next/static/chunks/f9cf9aa757605a0d.css" data-n-p=""/><link rel="stylesheet" href="/_next/static/chunks/17cfb1b2ce0f096d.css" data-n-p=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/c59e89dc54c3cae8.js" defer=""></script><script src="/_next/static/chunks/d8f0ad36e12f0fbf.js" defer=""></script><script src="/_next/static/chunks/3ffbbca8f4333a24.js" defer=""></script><script src="/_next/static/chunks/9865709466b09f79.js" defer=""></script><script src="/_next/static/chunks/turbopack-26af71e419c11487.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_buildManifest.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_ssgManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/session/[id]","query":{},"buildId":"2AHkk-zsVTx40cm88r7SY","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="preload" href="/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="preload" href="/_next/static/chunks/f9cf9aa757605a0d.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><link rel="stylesheet" href="/_next/static/chunks/f9cf9aa757605a0d.css" data-n-p=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/9bd4272b69f6c6f2.js" defer=""></script><script src="/_next/static/chunks/52b90bc1740162c2.js" defer=""></script><script src="/_next/static/chunks/turbopack-8e653f3ad3a8ed18.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_ssgManifest.js" defer=""></script><script src="/_next/static/XI6khKkj1If5Kb4-eJQ2z/_buildManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/settings","query":{},"buildId":"XI6khKkj1If5Kb4-eJQ2z","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="preload" href="/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/chunks/4147ffc67a7b837c.css" as="style"/><link rel="preload" href="/_next/static/chunks/f9cf9aa757605a0d.css" as="style"/><link rel="stylesheet" href="/_next/static/chunks/4147ffc67a7b837c.css" data-n-g=""/><link rel="stylesheet" href="/_next/static/chunks/f9cf9aa757605a0d.css" data-n-p=""/><noscript data-n-css=""></noscript><script src="/_next/static/chunks/b107f5f34a4187e4.js" defer=""></script><script src="/_next/static/chunks/bd15146d1618bdbf.js" defer=""></script><script src="/_next/static/chunks/8f80b41262ef70b6.js" defer=""></script><script src="/_next/static/chunks/fee6d0ada00c967a.js" defer=""></script><script src="/_next/static/chunks/57a81fb69ac0c6be.js" defer=""></script><script src="/_next/static/chunks/turbopack-4ad0df7330c00c8d.js" defer=""></script><script src="/_next/static/chunks/9bd4272b69f6c6f2.js" defer=""></script><script src="/_next/static/chunks/52b90bc1740162c2.js" defer=""></script><script src="/_next/static/chunks/turbopack-8e653f3ad3a8ed18.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_ssgManifest.js" defer=""></script><script src="/_next/static/2AHkk-zsVTx40cm88r7SY/_buildManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","intentui-theme","system",null,["light","dark"],null,true,true)</script><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/settings","query":{},"buildId":"2AHkk-zsVTx40cm88r7SY","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>