@spikonado/sprocket 0.1.1 → 0.2.0-dev.051e9c8dfa5a8204d372daeb9919f576dbfc1bfa
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 +50 -38
- package/lib/launcher.js +6 -8
- package/package.json +8 -7
- package/targets.json +39 -0
- package/web/_app/immutable/assets/0.7UApui6t.css +2 -0
- package/web/_app/immutable/assets/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2 +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2 +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2 +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2 +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2 +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.CB9ihrfo.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2 +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2 +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2 +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2 +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff +0 -0
- package/web/_app/immutable/assets/ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2 +0 -0
- package/web/_app/immutable/chunks/4-desXp-.js +6 -0
- package/web/_app/immutable/chunks/A10QEI9N.js +1 -0
- package/web/_app/immutable/chunks/{DMqLQsth.js → B2QV2lSm.js} +1 -1
- package/web/_app/immutable/chunks/DWXDZqdt.js +2 -0
- package/web/_app/immutable/chunks/FcHFgdTk.js +1 -0
- package/web/_app/immutable/chunks/G9InG5jW.js +3 -0
- package/web/_app/immutable/chunks/eYQozHfV.js +1 -0
- package/web/_app/immutable/chunks/tDzg1Ybi.js +1 -0
- package/web/_app/immutable/entry/app.BTY6sYoq.js +2 -0
- package/web/_app/immutable/entry/start.CJ6kWeBu.js +1 -0
- package/web/_app/immutable/nodes/0.a2pYxQ7W.js +1 -0
- package/web/_app/immutable/nodes/1.eIJRwDOz.js +1 -0
- package/web/_app/immutable/nodes/2.B8sJcyvp.js +122 -0
- package/web/_app/immutable/nodes/3.D3YHZKP5.js +1 -0
- package/web/_app/immutable/nodes/4.4VHxV5Dt.js +1 -0
- package/web/_app/version.json +1 -1
- package/web/callback.html +24 -16
- package/web/index.html +21 -13
- package/web/pair.html +25 -17
- package/web/_app/immutable/assets/0.Cg3sj1M-.css +0 -2
- package/web/_app/immutable/chunks/BiY-aars.js +0 -1
- package/web/_app/immutable/chunks/Ci7cM3I3.js +0 -3
- package/web/_app/immutable/chunks/Cjit9prA.js +0 -1
- package/web/_app/immutable/chunks/CnOTGLIW.js +0 -1
- package/web/_app/immutable/chunks/D5Hn5yYF.js +0 -1
- package/web/_app/immutable/chunks/DDsCNwo5.js +0 -2
- package/web/_app/immutable/chunks/c70Wbtkw.js +0 -6
- package/web/_app/immutable/entry/app.OFC27iEP.js +0 -2
- package/web/_app/immutable/entry/start.Bi5HVoh8.js +0 -1
- package/web/_app/immutable/nodes/0.BFRbGFjE.js +0 -1
- package/web/_app/immutable/nodes/1.-rlIpXaz.js +0 -1
- package/web/_app/immutable/nodes/2.Pk4TME-2.js +0 -71
- package/web/_app/immutable/nodes/3.PAtj0N7v.js +0 -1
- package/web/_app/immutable/nodes/4.DwMnmut8.js +0 -1
package/README.md
CHANGED
|
@@ -2,40 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|
**Goal**: To make the world's best platform for developing hardware and software.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Here's what makes Sprocket special:
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- The only AI agent that can work on both <ins>hardware</ins> and <ins>software</ins>.
|
|
8
|
+
- Retrieves best-in-class <ins>context from the web</ins> for everything it does, so it stays <ins>incredibly reliable</ins>.
|
|
9
|
+
- <ins>Buys anything from any website</ins> when you ask, from hardware parts to SaaS subscriptions.
|
|
10
|
+
- Makes <ins>beautifully detailed schematics</ins>, creates your <ins>BOM</ins>, and writes <ins>assembly instructions</ins>.
|
|
11
|
+
|
|
12
|
+
[Sprocket Demo](https://www.youtube.com/watch?v=E8KWO3Vh9YU)
|
|
13
|
+
|
|
14
|
+
[](https://www.youtube.com/watch?v=E8KWO3Vh9YU)
|
|
8
15
|
|
|
9
16
|
## Using Sprocket
|
|
10
17
|
|
|
11
|
-
|
|
18
|
+
> [!NOTE]
|
|
19
|
+
> You can run Sprocket using any of the ways defined below with no impact on Sprocket's capabilities or performance.
|
|
20
|
+
> The desktop app may take more RAM than using Sprocket through your browser.
|
|
21
|
+
|
|
22
|
+
### Run without installing
|
|
12
23
|
|
|
13
24
|
```sh
|
|
14
|
-
npx @spikonado/sprocket
|
|
25
|
+
npx @spikonado/sprocket
|
|
15
26
|
```
|
|
16
27
|
|
|
17
|
-
|
|
28
|
+
The above runs Sprocket through your browser unless you have the desktop app installed.
|
|
18
29
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
sprocket
|
|
22
|
-
```
|
|
30
|
+
### Desktop App
|
|
31
|
+
|
|
32
|
+
Install it for your OS from the latest [GitHub Release Artifacts](https://github.com/spikonado/sprocket/releases) and run it.
|
|
23
33
|
|
|
24
|
-
|
|
34
|
+
### CLI
|
|
25
35
|
|
|
26
36
|
```sh
|
|
37
|
+
npm i -g @spikonado/sprocket
|
|
27
38
|
sprocket
|
|
28
39
|
```
|
|
29
40
|
|
|
30
|
-
|
|
41
|
+
The above runs Sprocket through your browser unless you have the desktop app installed.
|
|
31
42
|
|
|
32
|
-
To
|
|
43
|
+
To always open a tab in your browser when using Sprocket, use the `--web` flag:
|
|
33
44
|
|
|
34
45
|
```sh
|
|
35
46
|
sprocket --web
|
|
36
47
|
```
|
|
37
48
|
|
|
38
|
-
|
|
49
|
+
### Workspaces
|
|
50
|
+
|
|
51
|
+
Pass a directory to open or reconnect that workspace in a new thread:
|
|
39
52
|
|
|
40
53
|
```sh
|
|
41
54
|
sprocket .
|
|
@@ -43,28 +56,28 @@ sprocket --web ../my-robot
|
|
|
43
56
|
```
|
|
44
57
|
|
|
45
58
|
Sprocket remembers attached workspaces and local server sessions between launches.
|
|
46
|
-
|
|
47
|
-
Override
|
|
59
|
+
Local state lives in `$HOME/.sprocket` (or `%USERPROFILE%\.sprocket` on Windows when `HOME` is unset).
|
|
60
|
+
Override with `SPROCKET_DATA_DIR`.
|
|
48
61
|
|
|
49
|
-
## CLI reference
|
|
62
|
+
## Additional CLI reference
|
|
50
63
|
|
|
51
|
-
| Command
|
|
52
|
-
|
|
|
53
|
-
| `sprocket
|
|
54
|
-
| `sprocket --
|
|
55
|
-
| `sprocket serve` | Run the local server in the foreground without launching a client. |
|
|
56
|
-
| `sprocket serve --api-only` | Serve only `/api`; intended for development (see [Development](#development)). |
|
|
64
|
+
| Command | Behavior |
|
|
65
|
+
| --------------------------- | ------------------------------------------------------------------------------ |
|
|
66
|
+
| `sprocket serve` | Run the local server in the foreground without launching a client. |
|
|
67
|
+
| `sprocket serve --api-only` | Serve only `/api`; intended for development (see [Development](#development)). |
|
|
57
68
|
|
|
58
69
|
Run `sprocket --help` or `sprocket serve --help` for all options.
|
|
59
|
-
Common server overrides are also available as environment variables:
|
|
60
70
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
| `SPROCKET_DATA_DIR`
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
71
|
+
Common Sprocket server overrides are available as environment variables:
|
|
72
|
+
|
|
73
|
+
| Variable | Purpose |
|
|
74
|
+
| ----------------------------- | ------------------------------------------------------------------- |
|
|
75
|
+
| `SPROCKET_DATA_DIR` | Directory for pairing, sessions, and workspace state. |
|
|
76
|
+
| `SPROCKET_PORT` | Local server port; defaults to `17731` for installed use. |
|
|
77
|
+
| `SPROCKET_HOST` | Bind host; defaults to `127.0.0.1`. |
|
|
78
|
+
| `SPROCKET_DESKTOP_EXECUTABLE` | Full path to the desktop executable to be used by the Sprocket CLI. |
|
|
79
|
+
| `PUBLIC_CONVEX_URL` | Convex deployment used by the agent runtime. |
|
|
80
|
+
| `SPROCKET_STATIC_DIR` | Web build to serve instead of the bundled build. |
|
|
68
81
|
|
|
69
82
|
## Development
|
|
70
83
|
|
|
@@ -88,9 +101,7 @@ Start the browser development environment:
|
|
|
88
101
|
bun dev
|
|
89
102
|
```
|
|
90
103
|
|
|
91
|
-
After creating a convex deployment and configuring authkit following the instructions, configure the Convex deployment with the API key for each
|
|
92
|
-
|
|
93
|
-
Optional Amazon Bedrock fallback for OpenAI and Anthropic: set `AWS_BEARER_TOKEN_BEDROCK`, or `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`. `AWS_REGION` defaults to `us-east-1` (use a US Bedrock region; Anthropic fallback uses `us.` inference profiles).
|
|
104
|
+
After creating a convex deployment and configuring authkit following the instructions, configure the Convex deployment with the API key for each model provider you want to enable.
|
|
94
105
|
|
|
95
106
|
This runs Vite at `http://localhost:5173` and the Rust API at `http://127.0.0.1:7731`, with development state kept in `.sprocket-dev` inside the repository.
|
|
96
107
|
To develop against Electron instead, run:
|
|
@@ -108,17 +119,18 @@ bun run build
|
|
|
108
119
|
prek run -a
|
|
109
120
|
```
|
|
110
121
|
|
|
111
|
-
Create
|
|
122
|
+
Create a local Electron installer package with:
|
|
112
123
|
|
|
113
124
|
```sh
|
|
114
125
|
bun run build:release
|
|
115
126
|
```
|
|
116
127
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
The CLI bundle contains only the native `sprocket` executable and the static web files needed by `sprocket --web`; it does not contain Electron.
|
|
128
|
+
Artifacts are written to `apps/desktop/dist/` as `sprocket-desktop-*` (`.AppImage` / `.dmg` / `.exe` depending on the host OS).
|
|
129
|
+
Published installers come from GitHub Releases; the `sprocket` CLI is published separately on npm.
|
|
120
130
|
|
|
121
131
|
## Troubleshooting
|
|
122
132
|
|
|
123
133
|
- If `17731` is already occupied, set `SPROCKET_PORT` before launching.
|
|
124
|
-
- If the
|
|
134
|
+
- If `sprocket` opens the browser instead of the desktop app, install `sprocket-desktop` from [GitHub Releases](https://github.com/spikonado/sprocket/releases) onto `PATH`, or set `SPROCKET_DESKTOP_EXECUTABLE`.
|
|
135
|
+
- Unsigned macOS and Windows desktop builds may need a Gatekeeper / SmartScreen override the first time you open them.
|
|
136
|
+
- Contact [aarav@spikonado.com](mailto:aarav@spikonado.com) for help.
|
package/lib/launcher.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
|
-
import { accessSync, chmodSync, constants } from 'node:fs';
|
|
2
|
+
import { accessSync, chmodSync, constants, readFileSync } from 'node:fs';
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
|
|
7
7
|
const require = createRequire(import.meta.url);
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
[
|
|
13
|
-
|
|
14
|
-
['win32:x64', ['@spikonado/sprocket-win32-x64-msvc', 'sprocket.exe']]
|
|
15
|
-
]);
|
|
9
|
+
const TARGETS = JSON.parse(readFileSync(path.join(import.meta.dirname, '../targets.json'), 'utf8'));
|
|
10
|
+
|
|
11
|
+
const PLATFORM_PACKAGES = new Map(
|
|
12
|
+
TARGETS.map((target) => [`${target.os}:${target.cpu}`, [target.packageName, target.executable]])
|
|
13
|
+
);
|
|
16
14
|
|
|
17
15
|
export function nativePackage(platform = process.platform, arch = process.arch) {
|
|
18
16
|
return PLATFORM_PACKAGES.get(`${platform}:${arch}`);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spikonado/sprocket",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0-dev.051e9c8dfa5a8204d372daeb9919f576dbfc1bfa",
|
|
4
|
+
"description": "Agentic platform for streamlining hardware and software development",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"bin/",
|
|
12
12
|
"lib/",
|
|
13
|
+
"targets.json",
|
|
13
14
|
"web/"
|
|
14
15
|
],
|
|
15
16
|
"engines": {
|
|
@@ -28,10 +29,10 @@
|
|
|
28
29
|
"access": "public"
|
|
29
30
|
},
|
|
30
31
|
"optionalDependencies": {
|
|
31
|
-
"@spikonado/sprocket-linux-x64-gnu": "0.
|
|
32
|
-
"@spikonado/sprocket-linux-arm64-gnu": "0.
|
|
33
|
-
"@spikonado/sprocket-darwin-x64": "0.
|
|
34
|
-
"@spikonado/sprocket-darwin-arm64": "0.
|
|
35
|
-
"@spikonado/sprocket-win32-x64-msvc": "0.
|
|
32
|
+
"@spikonado/sprocket-linux-x64-gnu": "0.2.0-dev.051e9c8dfa5a8204d372daeb9919f576dbfc1bfa",
|
|
33
|
+
"@spikonado/sprocket-linux-arm64-gnu": "0.2.0-dev.051e9c8dfa5a8204d372daeb9919f576dbfc1bfa",
|
|
34
|
+
"@spikonado/sprocket-darwin-x64": "0.2.0-dev.051e9c8dfa5a8204d372daeb9919f576dbfc1bfa",
|
|
35
|
+
"@spikonado/sprocket-darwin-arm64": "0.2.0-dev.051e9c8dfa5a8204d372daeb9919f576dbfc1bfa",
|
|
36
|
+
"@spikonado/sprocket-win32-x64-msvc": "0.2.0-dev.051e9c8dfa5a8204d372daeb9919f576dbfc1bfa"
|
|
36
37
|
}
|
|
37
38
|
}
|
package/targets.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "linux-x64-gnu",
|
|
4
|
+
"packageName": "@spikonado/sprocket-linux-x64-gnu",
|
|
5
|
+
"os": "linux",
|
|
6
|
+
"cpu": "x64",
|
|
7
|
+
"libc": "glibc",
|
|
8
|
+
"executable": "sprocket"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "linux-arm64-gnu",
|
|
12
|
+
"packageName": "@spikonado/sprocket-linux-arm64-gnu",
|
|
13
|
+
"os": "linux",
|
|
14
|
+
"cpu": "arm64",
|
|
15
|
+
"libc": "glibc",
|
|
16
|
+
"executable": "sprocket"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "darwin-x64",
|
|
20
|
+
"packageName": "@spikonado/sprocket-darwin-x64",
|
|
21
|
+
"os": "darwin",
|
|
22
|
+
"cpu": "x64",
|
|
23
|
+
"executable": "sprocket"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "darwin-arm64",
|
|
27
|
+
"packageName": "@spikonado/sprocket-darwin-arm64",
|
|
28
|
+
"os": "darwin",
|
|
29
|
+
"cpu": "arm64",
|
|
30
|
+
"executable": "sprocket"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "win32-x64-msvc",
|
|
34
|
+
"packageName": "@spikonado/sprocket-win32-x64-msvc",
|
|
35
|
+
"os": "win32",
|
|
36
|
+
"cpu": "x64",
|
|
37
|
+
"executable": "sprocket.exe"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./dm-sans-latin-ext-400-normal.BtiwyxMk.woff2)format("woff2"),url(./dm-sans-latin-ext-400-normal.BjWJ59Pq.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./dm-sans-latin-400-normal.CW0RaeGs.woff2)format("woff2"),url(./dm-sans-latin-400-normal.BwCSEQnW.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./ibm-plex-sans-cyrillic-ext-wght-normal.d45eAU9y.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./ibm-plex-sans-cyrillic-wght-normal.BAAhND-U.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./ibm-plex-sans-greek-wght-normal.CmyJS8uq.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./ibm-plex-sans-vietnamese-wght-normal.Dg1JeJN0.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./ibm-plex-sans-latin-ext-wght-normal.CIII54If.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans Variable;font-style:normal;font-display:swap;font-weight:100 700;src:url(./ibm-plex-sans-latin-wght-normal.IvpUvPa2.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2)format("woff2"),url(./ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2)format("woff2"),url(./ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2)format("woff2"),url(./ibm-plex-mono-latin-400-normal.CvHOgSBP.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-cyrillic-ext-500-normal.BqneJy0T.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-ext-500-normal.BIfNGwUT.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-cyrillic-500-normal.Bq9vWWag.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-500-normal.Ael50iVv.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-vietnamese-500-normal.DZ4AoWbu.woff2)format("woff2"),url(./ibm-plex-mono-vietnamese-500-normal.C8zxqsMH.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-latin-ext-500-normal.CAhNIIs5.woff2)format("woff2"),url(./ibm-plex-mono-latin-ext-500-normal.CZ70TYgx.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-latin-500-normal.DSY6xOcd.woff2)format("woff2"),url(./ibm-plex-mono-latin-500-normal.CB9ihrfo.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@layer theme{:root,:host{--font-sans:"DM Sans", ui-sans-serif, system-ui, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, "Cascadia Code", "Segoe UI Mono", monospace;--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-800:oklch(43.2% .095 166.913);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-800:oklch(44.3% .11 240.79);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-950:oklch(27.1% .105 12.094);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--radius-2xl:1rem;--radius-3xl:1.5rem;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"DM Sans", ui-sans-serif, system-ui, sans-serif;--default-mono-font-family:"IBM Plex Mono", ui-monospace, "Cascadia Code", "Segoe UI Mono", monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border)}html{height:100%;overflow:hidden}body{background:var(--workspace-bg);height:100%;min-height:100vh;color:var(--foreground);font-family:var(--font-sans);font-feature-settings:"ss01" 1;margin:0;overflow:hidden}button,input,textarea{font:inherit}::selection{background:var(--selection);color:var(--foreground)}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-e-2{inset-inline-end:calc(var(--spacing) * 2)}.inset-e-24{inset-inline-end:calc(var(--spacing) * 24)}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.right-0{right:0}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-0{bottom:0}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-14{bottom:calc(var(--spacing) * 14)}.bottom-\[calc\(100\%\+0\.75rem\)\]{bottom:calc(100% + .75rem)}.bottom-full{bottom:100%}.left-0{left:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-100{z-index:100}.z-110{z-index:110}.z-200{z-index:200}.order-8842{order:8842}.-m-1{margin:calc(var(--spacing) * -1)}.mx-1{margin-inline:var(--spacing)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-5{margin-left:calc(var(--spacing) * 5)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content}.size-1{width:var(--spacing);height:var(--spacing)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-4\.5{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-5\.5{width:calc(var(--spacing) * 5.5);height:calc(var(--spacing) * 5.5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-64{height:calc(var(--spacing) * 64)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-24{max-height:calc(var(--spacing) * 24)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.max-h-\[min\(32rem\,70vh\)\]{max-height:min(32rem,70vh)}.max-h-full{max-height:100%}.min-h-0{min-height:0}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-17{min-height:calc(var(--spacing) * 17)}.min-h-33{min-height:calc(var(--spacing) * 33)}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-40{width:calc(var(--spacing) * 40)}.w-56{width:calc(var(--spacing) * 56)}.w-76{width:calc(var(--spacing) * 76)}.w-\[20rem\]{width:20rem}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-132{max-width:calc(var(--spacing) * 132)}.max-w-336{max-width:calc(var(--spacing) * 336)}.max-w-\[33rem\]{max-width:33rem}.max-w-\[48rem\]{max-width:48rem}.max-w-\[min\(20rem\,calc\(100\%-1\.5rem\)\)\]{max-width:min(20rem,100% - 1.5rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-36{min-width:calc(var(--spacing) * 36)}.min-w-\[15rem\]{min-width:15rem}.min-w-\[19rem\]{min-width:19rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-1{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.resize-none{resize:none}.grid-cols-\[292px_minmax\(0\,1fr\)\]{grid-template-columns:292px minmax(0,1fr)}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-0\.75{gap:calc(var(--spacing) * .75)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-1{row-gap:var(--spacing)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\[18px\]{border-radius:18px}.rounded-\[27px\]{border-radius:27px}.rounded-\[28px\]{border-radius:28px}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 6px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[var\(--hairline\)\]{border-color:var(--hairline)}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/25{border-color:color-mix(in oklab, var(--color-amber-500) 25%, transparent)}}.border-border,.border-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/25{border-color:color-mix(in oklab, var(--color-emerald-500) 25%, transparent)}}.border-foreground\/40{border-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.border-foreground\/40{border-color:color-mix(in oklab, var(--foreground) 40%, transparent)}}.border-hairline{border-color:var(--hairline)}.border-rose-500\/20{border-color:#ff235733}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/20{border-color:color-mix(in oklab, var(--color-rose-500) 20%, transparent)}}.border-rose-500\/60{border-color:#ff235799}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/60{border-color:color-mix(in oklab, var(--color-rose-500) 60%, transparent)}}.border-sky-500\/25{border-color:#00a5ef40}@supports (color:color-mix(in lab, red, red)){.border-sky-500\/25{border-color:color-mix(in oklab, var(--color-sky-500) 25%, transparent)}}.border-transparent{border-color:#0000}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.border-white\/15{border-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.border-t-foreground\/80{border-top-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.border-t-foreground\/80{border-top-color:color-mix(in oklab, var(--foreground) 80%, transparent)}}.bg-\[var\(--hairline\)\]{background-color:var(--hairline)}.bg-accent{background-color:var(--accent)}.bg-amber-300{background-color:var(--color-amber-300)}.bg-amber-400\/90{background-color:#fcbb00e6}@supports (color:color-mix(in lab, red, red)){.bg-amber-400\/90{background-color:color-mix(in oklab, var(--color-amber-400) 90%, transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-background,.bg-background\/90{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/90{background-color:color-mix(in oklab, var(--background) 90%, transparent)}}.bg-background\/92{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/92{background-color:color-mix(in oklab, var(--background) 92%, transparent)}}.bg-black\/65{background-color:#000000a6}@supports (color:color-mix(in lab, red, red)){.bg-black\/65{background-color:color-mix(in oklab, var(--color-black) 65%, transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.bg-black\/80{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.bg-card{background-color:var(--card)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-foreground\/25{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.bg-foreground\/25{background-color:color-mix(in oklab, var(--foreground) 25%, transparent)}}.bg-foreground\/28{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.bg-foreground\/28{background-color:color-mix(in oklab, var(--foreground) 28%, transparent)}}.bg-foreground\/70{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.bg-foreground\/70{background-color:color-mix(in oklab, var(--foreground) 70%, transparent)}}.bg-hover-fill{background-color:var(--hover-fill)}.bg-hover-fill-strong{background-color:var(--hover-fill-strong)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/40{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab, var(--muted-foreground) 40%, transparent)}}.bg-overlay{background-color:var(--overlay)}.bg-popover,.bg-popover\/96{background-color:var(--popover)}@supports (color:color-mix(in lab, red, red)){.bg-popover\/96{background-color:color-mix(in oklab, var(--popover) 96%, transparent)}}.bg-primary,.bg-primary\/90{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/90{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.bg-rose-400\/90{background-color:#ff667fe6}@supports (color:color-mix(in lab, red, red)){.bg-rose-400\/90{background-color:color-mix(in oklab, var(--color-rose-400) 90%, transparent)}}.bg-rose-500\/10{background-color:#ff23571a}@supports (color:color-mix(in lab, red, red)){.bg-rose-500\/10{background-color:color-mix(in oklab, var(--color-rose-500) 10%, transparent)}}.bg-rose-500\/90{background-color:#ff2357e6}@supports (color:color-mix(in lab, red, red)){.bg-rose-500\/90{background-color:color-mix(in oklab, var(--color-rose-500) 90%, transparent)}}.bg-rose-950\/80{background-color:#4d0218cc}@supports (color:color-mix(in lab, red, red)){.bg-rose-950\/80{background-color:color-mix(in oklab, var(--color-rose-950) 80%, transparent)}}.bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab, red, red)){.bg-sky-500\/10{background-color:color-mix(in oklab, var(--color-sky-500) 10%, transparent)}}.bg-surface,.bg-surface\/80{background-color:var(--surface)}@supports (color:color-mix(in lab, red, red)){.bg-surface\/80{background-color:color-mix(in oklab, var(--surface) 80%, transparent)}}.bg-tooltip{background-color:var(--tooltip-bg)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-px{padding:1px}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.ps-2{padding-inline-start:calc(var(--spacing) * 2)}.pe-28{padding-inline-end:calc(var(--spacing) * 28)}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-\[10vh\]{padding-top:10vh}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pr-\[20rem\]{padding-right:20rem}.pb-0{padding-bottom:0}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-14{padding-bottom:calc(var(--spacing) * 14)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-start{text-align:start}.font-brand{font-family:IBM Plex Sans Variable,ui-sans-serif,system-ui,sans-serif}.font-mono{font-family:IBM Plex Mono,ui-monospace,Cascadia Code,Segoe UI Mono,monospace}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.88rem\]{font-size:.88rem}.text-\[1\.5rem\]{font-size:1.5rem}.text-\[1\.15rem\]{font-size:1.15rem}.text-\[1\.35rem\]{font-size:1.35rem}.text-\[1rem\]{font-size:1rem}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.leading-3{--tw-leading:calc(var(--spacing) * 3);line-height:calc(var(--spacing) * 3)}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.tracking-\[-0\.03em\]{--tw-tracking:-.03em;letter-spacing:-.03em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.wrap-break-word{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#D97757\]{color:#d97757}.text-accent-strong{color:var(--accent-strong)}.text-amber-100{color:var(--color-amber-100)}.text-amber-400{color:var(--color-amber-400)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-800\/80{color:#953d00cc}@supports (color:color-mix(in lab, red, red)){.text-amber-800\/80{color:color-mix(in oklab, var(--color-amber-800) 80%, transparent)}}.text-background{color:var(--background)}.text-destructive{color:var(--destructive)}.text-emerald-800{color:var(--color-emerald-800)}.text-foreground{color:var(--foreground)}.text-muted-foreground,.text-muted-foreground\/80{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/80{color:color-mix(in oklab, var(--muted-foreground) 80%, transparent)}}.text-popover-foreground{color:var(--popover-foreground)}.text-primary-foreground{color:var(--primary-foreground)}.text-sky-800{color:var(--color-sky-800)}.text-tooltip-foreground{color:var(--tooltip-fg)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.decoration-foreground\/30{-webkit-text-decoration-color:var(--foreground);-webkit-text-decoration-color:var(--foreground);-webkit-text-decoration-color:var(--foreground);text-decoration-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.decoration-foreground\/30{-webkit-text-decoration-color:color-mix(in oklab, var(--foreground) 30%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--foreground) 30%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--foreground) 30%, transparent);text-decoration-color:color-mix(in oklab, var(--foreground) 30%, transparent)}}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-100{opacity:1}.shadow-\(--composer-shadow\){--tw-shadow:var(--composer-shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_18px_50px_-28px_oklch\(0\.2_0\.02_260\/0\.45\)\]{--tw-shadow:0 18px 50px -28px var(--tw-shadow-color,oklch(20% .02 260/.45));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--composer-shadow\)\]{--tw-shadow:var(--composer-shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-border{--tw-ring-color:var(--border)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-\[5px\]{--tw-blur:blur(5px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.\[animation-delay\:200ms\]{animation-delay:.2s}.\[animation-delay\:400ms\]{animation-delay:.4s}.\[overflow-anchor\:none\]{overflow-anchor:none}.group-focus-within\:opacity-100:is(:where(.group):focus-within *){opacity:1}.group-focus-within\/context\:visible:is(:where(.group\/context):focus-within *){visibility:visible}.group-focus-within\/context\:translate-y-0:is(:where(.group\/context):focus-within *){--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-focus-within\/context\:opacity-100:is(:where(.group\/context):focus-within *),.group-focus-within\/thread\:opacity-100:is(:where(.group\/thread):focus-within *){opacity:1}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/context\:visible:is(:where(.group\/context):hover *){visibility:visible}.group-hover\/context\:translate-y-0:is(:where(.group\/context):hover *){--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\/context\:opacity-100:is(:where(.group\/context):hover *),.group-hover\/thread\:opacity-100:is(:where(.group\/thread):hover *){opacity:1}}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.focus-within\:bg-muted:focus-within{background-color:var(--muted)}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-border:hover{border-color:var(--border)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.hover\:bg-foreground\/90:hover{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-foreground\/90:hover{background-color:color-mix(in oklab, var(--foreground) 90%, transparent)}}.hover\:bg-hover-fill:hover{background-color:var(--hover-fill)}.hover\:bg-hover-fill-strong:hover{background-color:var(--hover-fill-strong)}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-primary:hover{background-color:var(--primary)}.hover\:bg-rose-500:hover{background-color:var(--color-rose-500)}.hover\:bg-transparent:hover{background-color:#0000}.hover\:text-amber-900:hover{color:var(--color-amber-900)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-foreground:hover{-webkit-text-decoration-color:var(--foreground);-webkit-text-decoration-color:var(--foreground);-webkit-text-decoration-color:var(--foreground);text-decoration-color:var(--foreground)}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-ring:focus{border-color:var(--ring)}.focus\:opacity-100:focus,.focus-visible\:opacity-100:focus-visible{opacity:1}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring\/40:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 40%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:ring-ring\/60:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/60:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 60%, transparent)}}.focus-visible\:ring-white\/50:focus-visible{--tw-ring-color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-white\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.enabled\:cursor-pointer:enabled{cursor:pointer}@media (hover:hover){.enabled\:hover\:text-foreground:enabled:hover{color:var(--foreground)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (hover:hover){.disabled\:hover\:scale-100:disabled:hover{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.aria-disabled\:cursor-wait[aria-disabled=true]{cursor:wait}.aria-disabled\:opacity-60[aria-disabled=true]{opacity:.6}@media (width>=40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:block{display:block}.sm\:max-h-\[calc\(100dvh-6rem\)\]{max-height:calc(100dvh - 6rem)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-12{padding-block:calc(var(--spacing) * 12)}}.dark\:text-amber-200:where([data-theme=dark],[data-theme=dark] *){color:var(--color-amber-200)}.dark\:text-amber-200\/80:where([data-theme=dark],[data-theme=dark] *){color:#fee685cc}@supports (color:color-mix(in lab, red, red)){.dark\:text-amber-200\/80:where([data-theme=dark],[data-theme=dark] *){color:color-mix(in oklab, var(--color-amber-200) 80%, transparent)}}.dark\:text-amber-300:where([data-theme=dark],[data-theme=dark] *){color:var(--color-amber-300)}.dark\:text-emerald-200:where([data-theme=dark],[data-theme=dark] *){color:var(--color-emerald-200)}.dark\:text-sky-200:where([data-theme=dark],[data-theme=dark] *){color:var(--color-sky-200)}@media (hover:hover){.dark\:hover\:text-amber-100:where([data-theme=dark],[data-theme=dark] *):hover{color:var(--color-amber-100)}}.\[\&\:not\(\:has\(\*\)\)\]\:mt-0:not(:has(*)){margin-top:0}.\[\&\:not\(\:has\(\*\)\)\]\:hidden:not(:has(*)){display:none}}:root,[data-theme=light]{--background:oklch(95.5% .014 130);--foreground:oklch(18% .02 260);--surface:oklch(99% .004 130);--muted:oklch(93% .018 220);--muted-foreground:oklch(45% .03 250);--popover:oklch(99% .004 130);--popover-foreground:oklch(18% .02 260);--card:oklch(99% .004 130);--card-foreground:oklch(18% .02 260);--border:oklch(88% .012 130);--input:oklch(90% .01 130);--primary:oklch(18% .02 260);--primary-foreground:oklch(99% .004 130);--secondary:oklch(93% .01 130);--secondary-foreground:oklch(18% .02 260);--accent:oklch(72% .1 230);--accent-foreground:oklch(18% .02 260);--accent-strong:oklch(52% .16 250);--accent-soft:oklch(92% .04 230);--mark:oklch(93% .08 95);--destructive:oklch(58% .2 25);--destructive-foreground:oklch(99% .004 130);--ring:oklch(72% .08 230);--overlay:oklch(18% .02 260/.45);--panel:oklch(99% .004 130);--panel-elevated:oklch(97% .008 130);--hover-fill:oklch(18% .02 260/.05);--hover-fill-strong:oklch(18% .02 260/.08);--hairline:oklch(18% .02 260/.08);--composer-shell:linear-gradient(180deg, oklch(78% .08 230/.55), oklch(82% .06 230/.28));--composer-inner:linear-gradient(180deg, oklch(100% .002 100), oklch(98.5% .012 145));--composer-shadow:0 0 0 1px oklch(72% .1 230/.18), 0 18px 48px oklch(55% .08 230/.16);--user-bubble:linear-gradient(180deg, oklch(98% .02 230), oklch(95% .028 210));--user-bubble-border:oklch(55% .07 230/.2);--user-bubble-shadow:0 10px 28px -16px oklch(40% .05 250/.2);--transcript-fade:linear-gradient(180deg, oklch(95.5% .014 130/0), oklch(95.5% .014 130/.68) 48%, oklch(95.5% .014 130/.92));--workspace-bg:radial-gradient(ellipse 70% 50% at 90% 0%, oklch(72% .1 230/.16), transparent 58%), radial-gradient(ellipse 45% 40% at 0% 100%, oklch(72% .08 230/.08), transparent 55%), linear-gradient(180deg, oklch(97% .015 130) 0%, var(--background) 48%, var(--background) 100%);--sidebar-bg:linear-gradient(180deg, oklch(93.5% .018 200), oklch(90.5% .02 185));--sidebar-border:oklch(32% .04 250/.14);--tooltip-bg:oklch(22% .02 260);--tooltip-fg:oklch(96% .01 130);--radius:.9rem;--selection:oklch(92% .04 230);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}[data-theme=dark]{--background:oklch(15.5% .018 250);--foreground:oklch(94% .012 230);--surface:oklch(20% .02 250);--muted:oklch(24% .022 250);--muted-foreground:oklch(74% .02 230);--popover:oklch(19% .022 250);--popover-foreground:oklch(94% .012 230);--card:oklch(21% .022 250);--card-foreground:oklch(94% .012 230);--border:oklch(32% .03 250);--input:oklch(27% .025 250);--primary:oklch(72% .1 230);--primary-foreground:oklch(16% .02 250);--secondary:oklch(25% .02 250);--secondary-foreground:oklch(93% .01 80);--accent:oklch(72% .1 230);--accent-foreground:oklch(94% .012 230);--accent-strong:oklch(80% .11 230);--accent-soft:oklch(28% .045 230);--mark:oklch(45% .08 95);--destructive:oklch(62% .2 25);--destructive-foreground:oklch(99% .004 130);--ring:oklch(72% .1 230);--overlay:oklch(10% .02 250/.55);--panel:oklch(20% .02 250);--panel-elevated:oklch(26% .028 250);--hover-fill:oklch(75% .06 230/.1);--hover-fill-strong:oklch(75% .06 230/.16);--hairline:oklch(78% .05 230/.16);--composer-shell:linear-gradient(180deg, oklch(72% .08 230/.18), oklch(100% 0 0/.04));--composer-inner:linear-gradient(180deg, oklch(24% .024 250), oklch(20% .02 250));--composer-shadow:0 24px 64px oklch(8% .03 250/.45);--user-bubble:linear-gradient(180deg, oklch(30% .035 245), oklch(24% .03 250));--user-bubble-border:oklch(72% .08 230/.28);--user-bubble-shadow:0 12px 32px -16px oklch(8% .04 250/.7);--transcript-fade:linear-gradient(180deg, oklch(15.5% .018 250/0), oklch(15.5% .018 250/.7) 48%, oklch(15.5% .018 250/.94));--workspace-bg:radial-gradient(ellipse 80% 45% at 70% 0%, oklch(55% .08 230/.12), transparent 55%), linear-gradient(180deg, oklch(17.5% .022 250) 0%, oklch(14.5% .018 250) 100%);--sidebar-bg:linear-gradient(180deg, oklch(20% .016 250/.96), oklch(17% .014 250/.98));--sidebar-border:oklch(100% 0 0/.06);--tooltip-bg:oklch(22% .03 250);--tooltip-fg:oklch(94% .015 230);--radius:.9rem;--selection:oklch(72% .1 230/.28);--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}body:after{content:"";pointer-events:none;opacity:.018;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");background-repeat:repeat;background-size:256px 256px;position:fixed;inset:0}.hide-scrollbar{scrollbar-width:none}.hide-scrollbar::-webkit-scrollbar{display:none}.app-sidebar-panel{border-right:1px solid var(--sidebar-border);background:var(--sidebar-bg);min-height:0;overflow:hidden}.app-workspace-shell{background:var(--workspace-bg)}.composer-shell{background:var(--composer-shell)}.composer-inner{background:var(--composer-inner);box-shadow:var(--composer-shadow)}[data-theme=light] .composer-inner{border-color:#0000}.user-bubble{background-image:var(--user-bubble);border-color:var(--user-bubble-border);box-shadow:var(--user-bubble-shadow)}.transcript-fade{background-image:var(--transcript-fade)}.app-entry-shell{background-color:var(--background);background-image:radial-gradient(ellipse 70% 55% at 85% 15%, oklch(72% .1 230/.14), transparent 58%), radial-gradient(ellipse 50% 45% at 10% 85%, oklch(72% .1 230/.08), transparent 55%), linear-gradient(180deg, oklch(97% .01 130) 0%, var(--background) 42%, var(--background) 100%)}.app-entry-shell:before{content:"";pointer-events:none;background-image:linear-gradient(90deg,oklch(18% .02 260/.045) 1px,#0000 1px),linear-gradient(oklch(18% .02 260/.045) 1px,#0000 1px);background-size:56px 56px;position:absolute;inset:0;-webkit-mask-image:radial-gradient(75% 70% at 50% 45%,#000 20%,#0000 72%);mask-image:radial-gradient(75% 70% at 50% 45%,#000 20%,#0000 72%)}.chat-markdown{overflow-wrap:anywhere;word-break:break-word;min-width:0;font-size:.9375rem;line-height:1.9}.chat-markdown>:first-child{margin-top:0}.chat-markdown>:last-child{margin-bottom:0}.chat-markdown p,.chat-markdown ul,.chat-markdown ol,.chat-markdown blockquote,.chat-markdown pre,.chat-markdown table,.chat-markdown h1,.chat-markdown h2,.chat-markdown h3,.chat-markdown h4{margin:.8rem 0}.chat-markdown h1,.chat-markdown h2,.chat-markdown h3,.chat-markdown h4{letter-spacing:-.02em;color:var(--foreground);font-weight:600;line-height:1.35}.chat-markdown h1{font-size:1.5rem}.chat-markdown h2{font-size:1.25rem}.chat-markdown h3{font-size:1.1rem}.chat-markdown ul,.chat-markdown ol{padding-left:1.4rem}.chat-markdown ul{list-style:outside}.chat-markdown ol{list-style:decimal}.chat-markdown li+li{margin-top:.2rem}.chat-markdown a{color:var(--accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--accent-strong);-webkit-text-decoration-color:var(--accent-strong);-webkit-text-decoration-color:var(--accent-strong);text-decoration-color:var(--accent-strong)}@supports (color:color-mix(in lab, red, red)){.chat-markdown a{-webkit-text-decoration-color:color-mix(in oklab, var(--accent-strong) 45%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--accent-strong) 45%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--accent-strong) 45%, transparent);text-decoration-color:color-mix(in oklab, var(--accent-strong) 45%, transparent)}}.chat-markdown a{text-underline-offset:.16rem}.chat-markdown a:hover{opacity:.85}.chat-markdown blockquote{border-left:2px solid var(--border);color:var(--muted-foreground);padding-left:.9rem}.chat-markdown :not(pre)>code{border:1px solid var(--hairline);background:var(--muted);font-family:var(--font-mono);border-radius:.5rem;padding:.14rem .42rem;font-size:.8em}.chat-markdown pre{border:1px solid var(--hairline);background:var(--panel-elevated);border-radius:1rem;padding:.95rem 1rem;overflow-x:auto}[data-theme=light] .chat-markdown pre{background:var(--muted)}@supports (color:color-mix(in lab, red, red)){[data-theme=light] .chat-markdown pre{background:color-mix(in oklab, var(--muted) 55%, var(--surface))}}.chat-markdown pre code{font-family:var(--font-mono);background:0 0;padding:0;font-size:.82rem;line-height:1.7}.chat-markdown hr{border:0;border-top:1px solid var(--border);margin:1rem 0}.chat-markdown table{border-collapse:collapse;width:100%;font-size:.92em}.chat-markdown th,.chat-markdown td{border:1px solid var(--border);text-align:left;padding:.5rem .65rem}.chat-markdown th{background:var(--muted)}@supports (color:color-mix(in lab, red, red)){.chat-markdown th{background:color-mix(in oklab, var(--muted) 88%, var(--background))}}.chat-markdown th{font-weight:600}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{it as e,rt as t}from"./G9InG5jW.js";import"./tDzg1Ybi.js";var n=`localhost`;`${n}`;function r(e){let t=new URL(e);return t.hostname!==`127.0.0.1`&&t.hostname!==`[::1]`?null:(t.hostname=n,t.toString())}function i(e,t,n){return t||!n&&[`127.0.0.1`,`localhost`,`[::1]`].includes(e)}var a=Symbol.for(`functionName`),o=Symbol.for(`toReferencePath`);function s(e){return e[o]??null}function c(e){return e.startsWith(`function://`)}function l(e){let t;if(typeof e==`string`)t=c(e)?{functionHandle:e}:{name:e};else if(e[a])t={name:e[a]};else{let n=s(e);if(!n)throw Error(`${e} is not a functionReference`);t={reference:n}}return t}function u(e){let t=l(e);if(t.name===void 0)throw t.functionHandle===void 0?t.reference===void 0?Error(`Expected function reference like "api.file.func" or "internal.file.func", but received ${JSON.stringify(t)}`):Error(`Expected function reference in the current component like "api.file.func" or "internal.file.func", but received reference ${t.reference}`):Error(`Expected function reference like "api.file.func" or "internal.file.func", but received function handle ${t.functionHandle}`);if(typeof e==`string`)return e;let n=e[a];if(!n)throw Error(`${e} is not a functionReference`);return n}function ee(e=[]){return new Proxy({},{get(t,n){if(typeof n==`string`)return ee([...e,n]);if(n===a){if(e.length<2){let t=[`api`,...e].join(`.`);throw Error(`API path is expected to be of the form \`api.moduleName.functionName\`. Found: \`${t}\``)}let t=e.slice(0,-1).join(`/`),n=e[e.length-1];return n==="default"?t:t+`:`+n}if(n===Symbol.toStringTag)return`FunctionReference`}})}var te=ee();function ne(e,t){return new Proxy({},{get(n,r){if(typeof r==`string`)return ne(e,[...t,r]);if(r===o){if(t.length<1){let n=[e,...t].join(`.`);throw Error(`API path is expected to be of the form \`${e}.childComponent.functionName\`. Found: \`${n}\``)}return`_reference/childComponent/`+t.join(`/`)}}})}var re=()=>ne(`components`,[]),ie=e=>{throw TypeError(e)},ae=(e,t,n)=>t.has(e)||ie(`Cannot `+n),d=(e,t,n)=>(ae(e,t,`read from private field`),n?n.call(e):t.get(e)),f=(e,t,n)=>t.has(e)?ie(`Cannot add the same private member more than once`):t instanceof WeakSet?t.add(e):t.set(e,n),p=(e,t,n,r)=>(ae(e,t,`write to private field`),r?r.call(e,n):t.set(e,n),n),m=(e,t,n)=>(ae(e,t,`access private method`),n),oe=class extends Error{constructor(){super(...arguments),this.status=500,this.name=`NoClientIdProvidedException`,this.message=`Missing Client ID. Pass it to the constructor (createClient("client_01HXRMBQ9BJ3E7QSTQ9X2PHVB7"))`}};function se(e,t){if(!t.has(`code`))return!1;let{pathname:n}=window.location,r=new URL(e).pathname;return n===r||n===`${r}/`}function ce(){let e={};function t(t,n){e[t]=n}function n(t){return e[t]}function r(t){delete e[t]}function i(){e={}}return{setItem:t,getItem:n,removeItem:r,reset:i}}var h=ce();async function le(){let e=ue();return{codeVerifier:e,codeChallenge:await de(e)}}function ue(){return fe(crypto.getRandomValues(new Uint32Array(96)))}async function de(e){return fe(await pe(e))}function fe(e){return btoa(Array.from(new Uint8Array(e),e=>String.fromCharCode(e)).join(``)).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function pe(e){let t=new TextEncoder().encode(e);return crypto.subtle.digest(`SHA-256`,t)}function me(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=`=`.repeat((4-t.length%4)%4);return atob(t+n)}function he(e){let t=e.split(`.`);if(t.length!==3)throw Error(`Invalid JWT format`);try{return{header:JSON.parse(me(t[0])),payload:JSON.parse(me(t[1]))}}catch(e){throw Error(`Failed to decode JWT: ${e instanceof Error?e.message:String(e)}`)}}var g={codeVerifier:`workos:code-verifier`,user:`workos:user`,accessToken:`workos:access-token`,refreshToken:`workos:refresh-token`,expiresAt:`workos:expires-at`,authenticationMethod:`workos:authentication-method`};function _(e){return he(e).payload}function ge(e){return`${g.refreshToken}:${e}`}function _e(e,{devMode:t=!1,clientId:n}){let{user:r,accessToken:i,refreshToken:a,authenticationMethod:o}=e;h.setItem(g.user,r),h.setItem(g.accessToken,i),h.setItem(g.authenticationMethod,o),(t?window.localStorage:h).setItem(ge(n),a);let{exp:s,iat:c}=_(i),l=s-c,u=Date.now()+l*1e3;h.setItem(g.expiresAt,u)}function ve({devMode:e=!1,clientId:t}){h.removeItem(g.user),h.removeItem(g.accessToken),h.removeItem(g.authenticationMethod);let n=e?window.localStorage:h;n.removeItem(ge(t)),n.removeItem(g.refreshToken)}function ye({devMode:e=!1,clientId:t}){let n=e?window.localStorage:h,r=n.getItem(ge(t))??n.getItem(g.refreshToken);return typeof r==`string`?r:void 0}function be(e){let t=new URLSearchParams,n=Object.keys(e).sort();for(let r of n){let n=e[r];n&&t.append(r,n)}return t.toString()}var v=class extends Error{},y=class extends v{constructor(e,t={}){super(e,t.cause==null?void 0:{cause:t.cause}),this.name=`RefreshError`,this.status=t.status,this.error=t.error,this.isTransient=t.isTransient??!1}},xe=class extends v{},Se=class extends v{constructor(){super(...arguments),this.message=`No access token available`}},b=class extends y{constructor(e=`Timed out waiting to refresh the session.`,t){super(e,{cause:t?.cause,isTransient:!0}),this.name=`RefreshTimeoutError`}},Ce=class extends v{constructor(){super(...arguments),this.message=`SignOut() called without an active session. Provide a returnTo URL to redirect anyway.`}},we=class e{constructor(){this.locked=new Map,this.addToLocked=(e,t)=>{let n=this.locked.get(e);n===void 0?t===void 0?this.locked.set(e,[]):this.locked.set(e,[t]):t!==void 0&&(n.unshift(t),this.locked.set(e,n))},this.isLocked=e=>this.locked.has(e),this.lock=e=>new Promise((t,n)=>{this.isLocked(e)?this.addToLocked(e,t):(this.addToLocked(e),t())}),this.unlock=e=>{let t=this.locked.get(e);if(t===void 0||t.length===0){this.locked.delete(e);return}let n=t.pop();this.locked.set(e,t),n!==void 0&&setTimeout(n,0)}}static getInstance(){return e.instance===void 0&&(e.instance=new e),e.instance}};function x(){return we.getInstance()}var S=`browser-tabs-lock-key`,C={key:async e=>{throw Error(`Unsupported`)},getItem:async e=>{throw Error(`Unsupported`)},clear:async()=>window.localStorage.clear(),removeItem:async e=>{throw Error(`Unsupported`)},setItem:async(e,t)=>{throw Error(`Unsupported`)},keySync:e=>window.localStorage.key(e),getItemSync:e=>window.localStorage.getItem(e),clearSync:()=>window.localStorage.clear(),removeItemSync:e=>window.localStorage.removeItem(e),setItemSync:(e,t)=>window.localStorage.setItem(e,t)};function w(e){return new Promise(t=>setTimeout(t,e))}function T(e){let t=``;for(let n=0;n<e;n++){let e=Math.floor(Math.random()*61);t+=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz`[e]}return t}function Te(){return Date.now().toString()+T(15)}var Ee=class e{constructor(t){this.acquiredIatSet=new Set,this.storageHandler=void 0,this.id=Te(),this.acquireLock=this.acquireLock.bind(this),this.releaseLock=this.releaseLock.bind(this),this.releaseLock__private__=this.releaseLock__private__.bind(this),this.waitForSomethingToChange=this.waitForSomethingToChange.bind(this),this.refreshLockWhileAcquired=this.refreshLockWhileAcquired.bind(this),this.storageHandler=t,e.waiters===void 0&&(e.waiters=[])}async acquireLock(t,n=5e3){let r=Date.now()+T(4),i=Date.now()+n,a=`${S}-${t}`,o=this.storageHandler===void 0?C:this.storageHandler;for(;Date.now()<i;){if(await w(30),o.getItemSync(a)===null){let e=`${this.id}-${t}-${r}`;await w(Math.floor(Math.random()*25)),o.setItemSync(a,JSON.stringify({id:this.id,iat:r,timeoutKey:e,timeAcquired:Date.now(),timeRefreshed:Date.now()})),await w(30);let n=o.getItemSync(a);if(n!==null){let e=JSON.parse(n);if(e.id===this.id&&e.iat===r)return this.acquiredIatSet.add(r),this.refreshLockWhileAcquired(a,r),!0}}else e.lockCorrector(this.storageHandler===void 0?C:this.storageHandler),await this.waitForSomethingToChange(i);r=Date.now()+T(4)}return!1}async refreshLockWhileAcquired(e,t){setTimeout(async()=>{if(await x().lock(t),!this.acquiredIatSet.has(t)){x().unlock(t);return}let n=this.storageHandler===void 0?C:this.storageHandler,r=n.getItemSync(e);if(r!==null){let i=JSON.parse(r);i.timeRefreshed=Date.now(),n.setItemSync(e,JSON.stringify(i)),x().unlock(t)}else{x().unlock(t);return}this.refreshLockWhileAcquired(e,t)},1e3)}async waitForSomethingToChange(t){await new Promise(n=>{let r=!1,i=Date.now(),a=!1;function o(){if(a||=(window.removeEventListener(`storage`,o),e.removeFromWaiting(o),clearTimeout(s),!0),!r){r=!0;let e=50-(Date.now()-i);e>0?setTimeout(n,e):n(null)}}window.addEventListener(`storage`,o),e.addToWaiting(o);let s=setTimeout(o,Math.max(0,t-Date.now()))})}static addToWaiting(t){this.removeFromWaiting(t),e.waiters!==void 0&&e.waiters.push(t)}static removeFromWaiting(t){e.waiters!==void 0&&(e.waiters=e.waiters.filter(e=>e!==t))}static notifyWaiters(){e.waiters!==void 0&&[...e.waiters].forEach(e=>e())}async releaseLock(e){return await this.releaseLock__private__(e)}async releaseLock__private__(t){let n=this.storageHandler===void 0?C:this.storageHandler,r=`${S}-${t}`,i=n.getItemSync(r);if(i===null)return;let a=JSON.parse(i);a.id===this.id&&(await x().lock(a.iat),this.acquiredIatSet.delete(a.iat),n.removeItemSync(r),x().unlock(a.iat),e.notifyWaiters())}static lockCorrector(t){let n=Date.now()-5e3,r=t,i=[],a=0;for(;;){let e=r.keySync(a);if(e===null)break;i.push(e),a++}let o=!1;for(let e=0;e<i.length;e++){let t=i[e];if(t.includes(S)){let e=r.getItemSync(t);if(e!==null){let i=JSON.parse(e);(i.timeRefreshed===void 0&&i.timeAcquired<n||i.timeRefreshed!==void 0&&i.timeRefreshed<n)&&(r.removeItemSync(t),o=!0)}}}o&&e.notifyWaiters()}};Ee.waiters=void 0;var De=Ee,Oe=1e4;function ke(e,t,{timeout:n=Oe}={}){if(!e)throw TypeError(`lockName is required and must be a non-empty string.`);return`locks`in navigator?Ae(e,t,n):je(e,t,n)}async function Ae(e,t,n){try{return await navigator.locks.request(e,{signal:AbortSignal.timeout(n)},t)}catch(t){if(t instanceof DOMException)switch(t.name){case`TimeoutError`:case`AbortError`:throw new E(`AcquisitionTimeoutError`,e,`Native`)}throw t}}async function je(e,t,n){let r=new De;try{if(await r.acquireLock(e,n))return await t();throw new E(`AcquisitionTimeoutError`,e,`Vendor`)}finally{await r.releaseLock(e)}}var E=class extends Error{constructor(e,t,n){super(`Lock acquisition timed out for "${t}" (${n})`),this.name=e,this.lockName=t}},Me=e=>({object:e.object,id:e.id,email:e.email,emailVerified:e.email_verified,firstName:e.first_name,profilePictureUrl:e.profile_picture_url,lastName:e.last_name,lastSignInAt:e.last_sign_in_at,externalId:e.external_id,createdAt:e.created_at,updatedAt:e.updated_at}),Ne=e=>{let{user:t,organization_id:n,access_token:r,refresh_token:i,authentication_method:a,impersonator:o,...s}=e;return{user:Me(t),organizationId:n,accessToken:r,refreshToken:i,authenticationMethod:a,impersonator:o,...s}},Pe=`api.workos.com`,Fe=new Set([408,429,500,502,503,504]),D,O,k,Ie,Le,Re=class{constructor({clientId:e,hostname:t=Pe,port:n,https:r=!0}){f(this,k),f(this,D),f(this,O),p(this,D,`${r?`https`:`http`}://${t}${n?`:${n}`:``}`),p(this,O,e)}async authenticateWithRefreshToken({refreshToken:e,organizationId:t,useCookie:n}){let r=await m(this,k,Le).call(this,`/user_management/authenticate`,{useCookie:n,body:{client_id:d(this,O),grant_type:`refresh_token`,...!n&&{refresh_token:e},organization_id:t}});if(r.ok)return Ne(await r.json());let{status:i}=r,a=await m(this,k,Ie).call(this,r);throw new y(a.error_description,{status:i,error:a.error,isTransient:Fe.has(i)})}async authenticateWithCode({code:e,codeVerifier:t,useCookie:n}){let r=await m(this,k,Le).call(this,`/user_management/authenticate`,{useCookie:n,body:{code:e,client_id:d(this,O),grant_type:`authorization_code`,code_verifier:t}});if(r.ok)return Ne(await r.json());throw new xe((await r.json()).error_description)}getAuthorizationUrl({connectionId:e,context:t,domainHint:n,loginHint:r,organizationId:i,provider:a=`authkit`,redirectUri:o,state:s,screenHint:c,passwordResetToken:l,invitationToken:u,codeChallenge:ee,codeChallengeMethod:te}){if(!a&&!e&&!i)throw TypeError(`Incomplete arguments. Need to specify either a 'connectionId', 'organizationId', or 'provider'.`);if(a!==`authkit`&&c)throw TypeError(`'screenHint' is only supported for 'authkit' provider`);t&&console.warn("`context` is deprecated. We previously required initiate login endpoints to return the\n`context` query parameter when getting the authorization URL. This is no longer necessary.");let ne=be({connection_id:e,organization_id:i,domain_hint:n,login_hint:r,provider:a,client_id:d(this,O),redirect_uri:o,response_type:`code`,state:s,screen_hint:c,invitation_token:u,password_reset_token:l,code_challenge:ee,code_challenge_method:te});return`${d(this,D)}/user_management/authorize?${ne}`}getLogoutUrl({sessionId:e,returnTo:t}){let n=new URL(`/user_management/sessions/logout`,d(this,D));return n.searchParams.set(`session_id`,e),t&&n.searchParams.set(`return_to`,t),n}};D=new WeakMap,O=new WeakMap,k=new WeakSet,Ie=async function(e){try{return await e.json()}catch{return{}}},Le=function(e,{body:t,useCookie:n}){return fetch(new URL(e,d(this,D)),{method:`POST`,...n&&{credentials:`include`},headers:{Accept:`application/json, text/plain, */*`,"Content-Type":`application/json`},body:JSON.stringify(t)})};var ze=`workos_organization_id`;function A(e){return`workos-org-id:${e}`}var Be=`WORKOS_REFRESH_SESSION`;function Ve(e){let t=document.cookie.match(/(?:^|;\s*)workos-has-session=([^;]*)/);if(!t)return!1;let n=t[1];return n===`1`||n.split(`.`).includes(e)}var j,M,N,P,F,I,L,R,z,B,V,H,He,Ue,U,W,We,Ge,G,K,Ke,qe,Je,Ye=class{constructor(e,{apiHostname:t,https:n,port:r,redirectUri:i=window.origin,devMode:a=location.hostname===`localhost`||location.hostname===`127.0.0.1`,onBeforeAutoRefresh:o=()=>!document.hidden,onRedirectCallback:s=e=>{},onRefresh:c,onRefreshFailure:l,refreshBufferInterval:u=10}={}){if(f(this,H),f(this,j),f(this,M),f(this,N),f(this,P),f(this,F),f(this,I),f(this,L),f(this,R),f(this,z),f(this,B),f(this,V),!e)throw new oe;p(this,N,e),p(this,P,new Re({clientId:e,hostname:t,port:r,https:n})),p(this,I,a),p(this,F,i),p(this,j,{tag:`INITIAL`}),p(this,L,o),p(this,R,s),p(this,z,c),p(this,B,l),p(this,V,u)}async initialize(){if(d(this,j).tag!==`INITIAL`)return;let e=new URLSearchParams(window.location.search);if(se(d(this,F),e))await m(this,H,He).call(this);else if(Ve(d(this,N))||ye({devMode:d(this,I),clientId:d(this,N)}))try{await m(this,H,W).call(this),m(this,H,U).call(this)}catch{m(this,H,Ue).call(this)}}async getSignInUrl(e={}){return await m(this,H,G).call(this,{...e})}async getSignUpUrl(e={}){return await m(this,H,G).call(this,{...e,screenHint:`sign-up`})}async signIn(e={}){let t=await m(this,H,G).call(this,{...e});window.location.assign(t)}async signUp(e={}){let t=await m(this,H,G).call(this,{...e,screenHint:`sign-up`});window.location.assign(t)}signOut(e={navigate:!0}){let{navigate:t=!0,returnTo:n}=e,r=h.getItem(g.accessToken);if(typeof r!=`string`){if(t)throw new Ce;return Promise.reject(new Ce)}let{sid:i}=_(r),a=d(this,P).getLogoutUrl({sessionId:i,returnTo:n});if(a)if(ve({devMode:d(this,I),clientId:d(this,N)}),sessionStorage.removeItem(A(d(this,N))),sessionStorage.removeItem(ze),t)window.location.assign(a);else return new Promise(async e=>{fetch(a,{mode:`no-cors`,credentials:`include`}).catch(e=>{console.warn(`AuthKit: Failed to send logout request`,e)}).finally(e)})}async getAccessToken(e){if(e?.forceRefresh||m(this,H,Ge).call(this))try{await m(this,H,W).call(this)}catch(t){if(t instanceof b){let t=e?.forceRefresh?void 0:m(this,H,Ke).call(this);if(t)return t;try{await m(this,H,W).call(this)}catch(e){throw e instanceof b?e:e instanceof y?e.isTransient?e:new Se:e}}else if(t instanceof y){if(t.isTransient){let n=e?.forceRefresh?void 0:m(this,H,Ke).call(this);if(n)return n;throw t}throw new Se}else throw t}let t=m(this,H,K).call(this);if(!t)throw new Se;return t}getUser(){return h.getItem(g.user)||null}dispose(){clearTimeout(d(this,M)),h.reset()}async switchToOrganization({organizationId:e,signInOpts:t={}}){try{await m(this,H,W).call(this,{organizationId:e})}catch(n){if(n instanceof b)console.warn(`Couldn't switch organization: lock acquisition timed out.`);else if(n instanceof y){if(n.isTransient)throw n;this.signIn({...t,organizationId:e})}else throw n}}};j=new WeakMap,M=new WeakMap,N=new WeakMap,P=new WeakMap,F=new WeakMap,I=new WeakMap,L=new WeakMap,R=new WeakMap,z=new WeakMap,B=new WeakMap,V=new WeakMap,H=new WeakSet,He=async function(){if(d(this,j).tag!==`INITIAL`)return;let e=new URL(window.location.href),t=e.searchParams.get(`code`),n=e.searchParams.get(`state`),r;if(n)try{r=JSON.parse(n)}catch{console.warn("AuthKit: ignoring malformed `state` parameter")}let i=window.sessionStorage.getItem(g.codeVerifier);if(t)if(i)try{p(this,j,{tag:`AUTHENTICATING`,response:d(this,P).authenticateWithCode({code:t,codeVerifier:i,useCookie:d(this,H,qe)})});let e=await d(this,j).response;e&&(p(this,j,{tag:`AUTHENTICATED`}),m(this,H,U).call(this),_e(e,{devMode:d(this,I),clientId:d(this,N)}),m(this,H,Je).call(this,e),d(this,R).call(this,{state:r,...e}))}catch(e){p(this,j,{tag:`ERROR`}),console.error(e)}else p(this,j,{tag:`ERROR`}),console.error(`Couldn't exchange code.
|
|
2
|
+
|
|
3
|
+
An authorization_code was supplied for a login which did not originate at the application. This could happen for various reasons:
|
|
4
|
+
|
|
5
|
+
* This could have been an attempted Login CSRF attack. You were not affected.
|
|
6
|
+
* The developer may not have configured a Login Initiation endpoint.`);let a=new URL(window.location.toString());a.searchParams.delete(`code`),a.searchParams.delete(`state`),window.sessionStorage.removeItem(g.codeVerifier),window.history.replaceState({},``,a)},Ue=function(){d(this,j).tag===`AUTHENTICATED`&&m(this,H,U).call(this)},U=async function(){p(this,M,setTimeout(()=>{m(this,H,Ge).call(this)&&d(this,L).call(this)?m(this,H,W).call(this).catch(e=>{console.debug(e)}).finally(()=>m(this,H,U).call(this)):m(this,H,U).call(this)},1e3))},W=async function({organizationId:e}={}){if(d(this,j).tag===`AUTHENTICATING`){await d(this,j).response;return}let t=d(this,j);p(this,j,{tag:`AUTHENTICATING`,response:m(this,H,We).call(this,{organizationId:e,beginningState:t})}),await d(this,j).response},We=async function({organizationId:e,beginningState:t}){try{return await ke(Be,async()=>{if(e)sessionStorage.setItem(A(d(this,N)),e);else{let t=m(this,H,K).call(this);e=t?_(t)?.org_id:sessionStorage.getItem(A(d(this,N)))??sessionStorage.getItem(ze)??void 0}let t=await d(this,P).authenticateWithRefreshToken({refreshToken:ye({devMode:d(this,I),clientId:d(this,N)}),organizationId:e,useCookie:d(this,H,qe)});return p(this,j,{tag:`AUTHENTICATED`}),_e(t,{devMode:d(this,I),clientId:d(this,N)}),m(this,H,Je).call(this,t),t})}catch(e){throw e instanceof E&&e.name===`AcquisitionTimeoutError`?(console.warn(`Couldn't acquire refresh lock.`),p(this,j,t),new b(void 0,{cause:e})):(t.tag!==`INITIAL`&&console.debug(e),e instanceof y&&!e.isTransient?(ve({devMode:d(this,I),clientId:d(this,N)}),sessionStorage.removeItem(A(d(this,N))),sessionStorage.removeItem(ze),t.tag!==`INITIAL`&&d(this,B)&&d(this,B).call(this,{signIn:this.signIn.bind(this)}),p(this,j,{tag:`ERROR`})):p(this,j,{tag:`AUTHENTICATED`}),e)}},Ge=function(){switch(d(this,j).tag){case`INITIAL`:case`AUTHENTICATING`:return!0;case`ERROR`:return!1;case`AUTHENTICATED`:let e=h.getItem(g.accessToken),t=h.getItem(g.expiresAt);return!e||!t||t-d(this,V)*1e3<Date.now()}},G=async function({context:e,invitationToken:t,loginHint:n,organizationId:r,passwordResetToken:i,state:a,screenHint:o}){let{codeVerifier:s,codeChallenge:c}=await le();return window.sessionStorage.setItem(g.codeVerifier,s),d(this,P).getAuthorizationUrl({codeChallenge:c,codeChallengeMethod:`S256`,context:e,invitationToken:t,loginHint:n,organizationId:r,passwordResetToken:i,redirectUri:d(this,F),screenHint:o,state:a?JSON.stringify(a):void 0})},K=function(){return h.getItem(g.accessToken)},Ke=function(){let e=m(this,H,K).call(this),t=h.getItem(g.expiresAt);return e&&t&&t>Date.now()?e:void 0},qe=function(){return!d(this,I)},Je=async function(e){if(d(this,z)){let{refreshToken:t,...n}=e;d(this,z).call(this,n)}};async function Xe(e,t={}){let n=new Ye(e,t);return await n.initialize(),n}var Ze=te;re();var q=e({isLoading:!0,isReady:!1,isConfigured:!0,isWaitingForBrowserSignIn:!1,browserSignInUrl:null,user:null,error:null}),Qe=e(0),J=e(!1),$e=1500,et=3e5,tt=null,Y=null,nt=null,rt=!1,X=null,it=Promise.resolve();function at(){if(nt)return nt;throw Error(`Auth bootstrap is not initialized.`)}async function ot(){if(Y)return await Y;Y=at().query(Ze.authBootstrap.getClientConfig,{});try{return await Y}catch(e){throw Y=null,e}}async function st(){return(await ot()).workosClientId?.trim()||void 0}function ct(){let e=window.sprocketDesktopBridge;return!e?.getLocalBootstrap||!e.openExternal||!e.focusWindow?null:e}function lt(){return i(window.location.hostname,!1,!1)}async function Z(){return tt||=(async()=>{let e=await st();if(!e)return q.set({isLoading:!1,isReady:!0,isConfigured:!1,isWaitingForBrowserSignIn:!1,browserSignInUrl:null,user:null,error:null}),null;let t=null;try{return t=await Xe(e,{redirectUri:`${window.location.origin}/callback`,onRedirectCallback:()=>{window.location.replace(`/`)},onRefresh:()=>{q.update(e=>({...e,user:t?.getUser()??null,error:null}))},onRefreshFailure:()=>{q.update(e=>({...e,user:null,error:e.user&&!rt?`Session refresh failed. Sign in again.`:null}))}}),q.set({isLoading:!1,isReady:!0,isConfigured:!0,isWaitingForBrowserSignIn:!1,browserSignInUrl:null,user:t.getUser(),error:null}),t}catch(e){throw tt=null,e}})(),await tt}async function ut(e){nt=e,q.set({...t(q),isLoading:!0});try{let e=await Z();q.update(t=>t.isConfigured?{isLoading:!1,isReady:!0,isConfigured:!0,isWaitingForBrowserSignIn:!1,browserSignInUrl:null,user:e?.getUser()??null,error:null}:{...t,isLoading:!1,isReady:!0})}catch(e){q.update(t=>({...t,isLoading:!1,isReady:!0,isWaitingForBrowserSignIn:!1,browserSignInUrl:null,user:null,error:e instanceof Error?e.message:`Failed to initialize authentication.`}))}}function dt(e){try{let t=JSON.parse(e);return typeof t.nonce==`string`&&t.nonce.trim().length>0?t.nonce.trim():null}catch{return e.trim()||null}}async function ft(e){let t=await fetch(`/api/auth/desktop-login/start`,{method:`POST`,credentials:`include`,headers:{"content-type":`application/json`},body:JSON.stringify({state:e})});if(!t.ok){let e=await t.json().catch(()=>null);throw Error(e?.error??`Failed to start desktop sign-in.`)}}function Q(e){return X===e&&!e.abort.signal.aborted}function $(e){if(!Q(e))throw new DOMException(`Aborted`,`AbortError`)}async function pt(e){let t=it,n;it=new Promise(e=>{n=e}),await t;try{$(e),await ft(e.nonce),$(e)}finally{n()}}function mt(e){let t=e.desktopLoginCallbackUrl?.trim();if(t)return t.replace(/\/$/,``);let n;try{n=new URL(e.httpBaseUrl)}catch{throw Error(`Local server bootstrap URL is invalid.`)}return`http://127.0.0.1:${n.port||(n.protocol===`https:`?`443`:`80`)}/api/auth/desktop-login/callback`}async function ht(e,t){let n=Date.now();for(;!t.aborted;){if(Date.now()-n>et)throw Error(`Sign-in timed out. Try again.`);let r=await fetch(`/api/auth/desktop-login/result`,{credentials:`include`,signal:t});if(!r.ok){let e=await r.json().catch(()=>null);throw Error(e?.error??`Failed to check desktop sign-in status.`)}let i=await r.json();if(i.status===`failed`)throw Error(i.error||`Desktop sign-in failed.`);if(i.status===`complete`){if(dt(i.state)!==e)throw Error(`Desktop sign-in state mismatch.`);return{code:i.code,state:i.state}}await new Promise((e,n)=>{let r=setTimeout(()=>{t.removeEventListener(`abort`,i),e()},$e);function i(){clearTimeout(r),n(new DOMException(`Aborted`,`AbortError`))}t.addEventListener(`abort`,i,{once:!0})})}throw new DOMException(`Aborted`,`AbortError`)}async function gt(e,t){let n=ct();if(!n&&!lt())throw Error(`Loopback browser sign-in is unavailable.`);_t();let r={nonce:crypto.randomUUID(),abort:new AbortController};X=r,q.update(e=>({...e,isWaitingForBrowserSignIn:!0,browserSignInUrl:null,error:null}));try{let i=n?await n.getLocalBootstrap():{httpBaseUrl:window.location.origin};$(r);let a=mt(i);await pt(r),$(r);let o=await Xe(e,{redirectUri:a});$(r);let s={state:{nonce:r.nonce}},c=t===`signUp`?await o.getSignUpUrl(s):await o.getSignInUrl(s);if($(r),q.update(e=>({...e,browserSignInUrl:c})),$(r),n)n.openExternal(c).catch(e=>{if(!Q(r))return;let t=e instanceof Error?e.message.trim():``;q.update(e=>({...e,error:t||`Automatic browser open failed.`}))});else{let e=window.open(c,`_blank`);if(e)try{e.opener=null}catch{}else q.update(e=>({...e,error:`Your browser blocked the sign-in window.`}))}let l=await ht(r.nonce,r.abort.signal);if($(r),n)try{await n.focusWindow()}catch(e){Q(r)&&console.warn(`Failed to focus desktop window after sign-in`,e)}$(r);let u=new URL(`/callback`,window.location.origin);u.searchParams.set(`code`,l.code),u.searchParams.set(`state`,l.state),$(r),window.location.href=u.toString()}catch(e){if(X!==r)return;if(e instanceof DOMException&&e.name===`AbortError`){q.update(e=>({...e,isWaitingForBrowserSignIn:!1,browserSignInUrl:null,error:null}));return}q.update(t=>({...t,isWaitingForBrowserSignIn:!1,browserSignInUrl:null,error:e instanceof Error?e.message:`Failed to sign in with the browser.`}))}finally{X===r&&(X=null)}}function _t(){X?.abort.abort(),X=null}function vt(){let e=X,t=it;_t(),q.update(e=>({...e,isWaitingForBrowserSignIn:!1,browserSignInUrl:null,error:null})),e&&t.then(async()=>{await fetch(`/api/auth/desktop-login/cancel`,{method:`POST`,credentials:`include`,headers:{"content-type":`application/json`},body:JSON.stringify({state:e.nonce})})}).catch(()=>{})}function yt(){q.update(e=>!e.isWaitingForBrowserSignIn||e.error===null?e:{...e,error:null})}async function bt(e){let t=await Z();if(!t)return;let n=await st();if(n){if(ct()||lt()){await gt(n,e);return}if(e===`signUp`){await t.signUp();return}await t.signIn()}}async function xt(){await bt(`signIn`)}async function St(){await bt(`signUp`)}async function Ct(){let e=await Z();if(e){vt(),rt=!0,q.update(e=>({...e,isLoading:!0}));try{await e.signOut({navigate:!1,returnTo:window.location.origin}),J.set(!1),q.set({isLoading:!1,isReady:!0,isConfigured:!0,isWaitingForBrowserSignIn:!1,browserSignInUrl:null,user:null,error:null})}catch(e){q.update(t=>({...t,isLoading:!1,error:e instanceof Error?e.message:`Failed to sign out.`}))}finally{rt=!1}}}async function wt({forceRefreshToken:e=!1}={}){let t=await Z();if(!t)return null;try{return await t.getAccessToken({forceRefresh:e})}catch(e){if(e.name===`LoginRequiredError`)return q.update(e=>({...e,user:null})),null;throw e}}function Tt(e){return e.retryPending?e.isAuthenticated?{clearPending:!0,sawLoadingDuringRetry:e.sawLoadingDuringRetry}:e.isLoading?{clearPending:!1,sawLoadingDuringRetry:!0}:e.sawLoadingDuringRetry?{clearPending:!0,sawLoadingDuringRetry:!0}:{clearPending:!1,sawLoadingDuringRetry:!1}:{clearPending:!1,sawLoadingDuringRetry:!1}}async function Et(){q.update(e=>({...e,isLoading:!0,error:null})),J.set(!0);try{if(!await wt({forceRefreshToken:!0}))throw Error(`Your session has expired. Sign in again.`);Qe.update(e=>e+1),q.update(e=>({...e,isLoading:!1,error:null}))}catch(e){J.set(!1),q.update(t=>({...t,isLoading:!1,error:e instanceof Error?e.message:`Failed to refresh authentication.`}))}}export{J as a,ut as c,Ct as d,St as f,r as h,yt as i,Et as l,u as m,q as n,Qe as o,Ze as p,vt as r,wt as s,Tt as t,xt as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./FcHFgdTk.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(){return typeof window<`u`?window.location.origin:null}function t(e){if(typeof window>`u`)return null;let t=window.location.hash.startsWith(`#`)?window.location.hash.slice(1):window.location.hash;return new URLSearchParams(t).get(e)}function n(){return t(`token`)}function r(){return t(`workspace`)}function i(e){return`#${new URLSearchParams({workspace:e}).toString()}`}function a(){if(typeof window>`u`)return;let e=new URL(window.location.href);e.hash=``,window.history.replaceState(null,``,`${e.pathname}${e.search}`)}async function o(e,t){let n=await fetch(`${e}/api/auth/bootstrap`,{method:`POST`,headers:{"content-type":`application/json`},credentials:`include`,body:JSON.stringify({credential:t})});if(!n.ok){let e=await n.json().catch(()=>null);throw Error(e?.error??`Failed to authenticate with the Sprocket server.`)}}async function s(e){let t=await fetch(`${e}/api/auth/session`,{credentials:`include`});return t.ok?!!(await t.json()).authenticated:!1}async function c(e,t){if(await s(e))return;let r=n();if(r){await o(e,r),a();return}if(t?.pairingCredential){await o(e,t.pairingCredential);return}let i=await l(e);if(i?.pairingCredential){await o(e,i.pairingCredential);return}throw Error(`Pair with your Sprocket server to continue.`)}async function l(e){try{let t=await fetch(`${e}/api/auth/desktop-bootstrap`);return t.ok?await t.json():null}catch{return null}}async function u(e){return typeof window<`u`&&window.sprocketDesktopBridge?.getLocalBootstrap?await window.sprocketDesktopBridge.getLocalBootstrap():await l(e)}async function d(t){let n=t.headers.get(`content-type`)??``,r=await t.text();if(!n.includes(`application/json`)){let t=r.trim().slice(0,120);if(t.startsWith(`<!`)){let t=e();throw Error(t?`The Sprocket API at ${t} returned a web page instead of JSON. Make sure the server is running correctly.`:`The Sprocket API returned a web page instead of JSON. Make sure the server is running correctly.`)}throw Error(t.length>0?`Local API returned an unexpected response: ${t}`:`Local API returned an empty response.`)}return JSON.parse(r)}function f(e){async function t(t,n){let r=await fetch(`${e}${t}`,{...n,credentials:`include`,headers:{"content-type":`application/json`,...n?.headers??{}}});if(!r.ok)try{let e=await d(r);throw Error(e.error??`Local request failed (${r.status}).`)}catch(e){throw e instanceof Error&&e.message!==`Local request failed (${r.status}).`?e:Error(`Local request failed (${r.status}).`,{cause:e})}if(r.status!==204)return await d(r)}return{browseFilesystem:e=>t(`/api/workspace/browse`,{method:`POST`,body:JSON.stringify({partialPath:e.partialPath,...e.cwd?{cwd:e.cwd}:{}})}),resolveWorkspacePath:e=>t(`/api/workspace/resolve`,{method:`POST`,body:JSON.stringify({workspacePath:e.workspacePath,...e.createIfMissing?{createIfMissing:!0}:{}})}),
|
|
1
|
+
function e(){return typeof window<`u`?window.location.origin:null}function t(e){if(typeof window>`u`)return null;let t=window.location.hash.startsWith(`#`)?window.location.hash.slice(1):window.location.hash;return new URLSearchParams(t).get(e)}function n(){return t(`token`)}function r(){return t(`workspace`)}function i(e){return`#${new URLSearchParams({workspace:e}).toString()}`}function a(){if(typeof window>`u`)return;let e=new URL(window.location.href);e.hash=``,window.history.replaceState(null,``,`${e.pathname}${e.search}`)}async function o(e,t){let n=await fetch(`${e}/api/auth/bootstrap`,{method:`POST`,headers:{"content-type":`application/json`},credentials:`include`,body:JSON.stringify({credential:t})});if(!n.ok){let e=await n.json().catch(()=>null);throw Error(e?.error??`Failed to authenticate with the Sprocket server.`)}}async function s(e){let t=await fetch(`${e}/api/auth/session`,{credentials:`include`});return t.ok?!!(await t.json()).authenticated:!1}async function c(e,t){if(await s(e))return;let r=n();if(r){await o(e,r),a();return}if(t?.pairingCredential){await o(e,t.pairingCredential);return}let i=await l(e);if(i?.pairingCredential){await o(e,i.pairingCredential);return}throw Error(`Pair with your Sprocket server to continue.`)}async function l(e){try{let t=await fetch(`${e}/api/auth/desktop-bootstrap`);return t.ok?await t.json():null}catch{return null}}async function u(e){return typeof window<`u`&&window.sprocketDesktopBridge?.getLocalBootstrap?await window.sprocketDesktopBridge.getLocalBootstrap():await l(e)}async function d(t){let n=t.headers.get(`content-type`)??``,r=await t.text();if(!n.includes(`application/json`)){let t=r.trim().slice(0,120);if(t.startsWith(`<!`)){let t=e();throw Error(t?`The Sprocket API at ${t} returned a web page instead of JSON. Make sure the server is running correctly.`:`The Sprocket API returned a web page instead of JSON. Make sure the server is running correctly.`)}throw Error(t.length>0?`Local API returned an unexpected response: ${t}`:`Local API returned an empty response.`)}return JSON.parse(r)}function f(e){async function t(t,n){let r=await fetch(`${e}${t}`,{...n,credentials:`include`,headers:{"content-type":`application/json`,...n?.headers??{}}});if(!r.ok)try{let e=await d(r);throw Error(e.error??`Local request failed (${r.status}).`)}catch(e){throw e instanceof Error&&e.message!==`Local request failed (${r.status}).`?e:Error(`Local request failed (${r.status}).`,{cause:e})}if(r.status!==204)return await d(r)}return{browseFilesystem:e=>t(`/api/workspace/browse`,{method:`POST`,body:JSON.stringify({partialPath:e.partialPath,...e.cwd?{cwd:e.cwd}:{}})}),listWorkspaceSkills:e=>t(`/api/workspace/skills`,{method:`POST`,body:JSON.stringify({workspacePath:e.workspacePath})}),resolveWorkspacePath:e=>t(`/api/workspace/resolve`,{method:`POST`,body:JSON.stringify({workspacePath:e.workspacePath,...e.createIfMissing?{createIfMissing:!0}:{}})}),listProjectAttachments:()=>t(`/api/workspace/projects`),attachProject:e=>t(`/api/workspace/projects`,{method:`POST`,body:JSON.stringify(e)}),runAgent:e=>t(`/api/agent/run`,{method:`POST`,body:JSON.stringify(e)})}}async function p(){let t=e();if(!t)throw Error(`Unable to resolve the Sprocket server URL.`);return await c(t,await u(t)),f(t)}export{r as a,i as c,n as i,a as n,p as o,l as r,e as s,o as t};
|