@fapost/jig-ui 0.1.0-next.1 → 0.1.0-next.10

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/dist/args.js CHANGED
@@ -10,6 +10,7 @@ export function parseCliArgs(argv) {
10
10
  allowPositionals: false,
11
11
  options: {
12
12
  port: { type: 'string' },
13
+ 'no-open': { type: 'boolean' },
13
14
  help: { type: 'boolean', short: 'h' },
14
15
  version: { type: 'boolean', short: 'v' },
15
16
  },
@@ -22,11 +23,12 @@ export function parseCliArgs(argv) {
22
23
  return { kind: 'help' };
23
24
  if (values.version)
24
25
  return { kind: 'version' };
26
+ const open = !values['no-open'];
25
27
  if (values.port === undefined)
26
- return { kind: 'run', port: DEFAULT_PORT };
28
+ return { kind: 'run', port: DEFAULT_PORT, open };
27
29
  const port = /^\d+$/.test(values.port) ? Number(values.port) : Number.NaN;
28
30
  if (!Number.isInteger(port) || port < 1 || port > 65535) {
29
31
  return { kind: 'error', message: `Invalid --port value: ${values.port}. Use a number from 1 to 65535.` };
30
32
  }
31
- return { kind: 'run', port };
33
+ return { kind: 'run', port, open };
32
34
  }
@@ -0,0 +1,23 @@
1
+ const COLUMNS = [
2
+ { id: 'backlog', title: 'Backlog' },
3
+ { id: 'in-progress', title: 'In progress' },
4
+ { id: 'needs-you', title: 'Needs you' },
5
+ { id: 'paused', title: 'Paused' },
6
+ { id: 'ready', title: 'Ready' },
7
+ ];
8
+ /** Where a task stands, from Jig's state alone; the first rule that fits wins. */
9
+ export function columnOf(task) {
10
+ if (task.paused)
11
+ return 'paused';
12
+ if (!task.started)
13
+ return 'backlog';
14
+ if (task.gate === 'waiting' || task.gate === 'changed' || task.autopilot === 'stopped')
15
+ return 'needs-you';
16
+ if (task.status === 'ready')
17
+ return 'ready';
18
+ return 'in-progress';
19
+ }
20
+ /** The board: every column, in a fixed order, its cards in the order Jig listed them. Computed on every read, never stored. */
21
+ export function columns(tasks) {
22
+ return COLUMNS.map((c) => ({ ...c, cards: tasks.filter((t) => columnOf(t) === c.id) }));
23
+ }
@@ -0,0 +1,46 @@
1
+ import { timingSafeEqual } from 'node:crypto';
2
+ import { getCookie, setCookie } from 'hono/cookie';
3
+ import { cookieName } from '../registry/instance.js';
4
+ /** Refuses requests whose `Host` or `Origin` is not this server's own loopback address. */
5
+ export function localOnly(port) {
6
+ const hosts = new Set([`127.0.0.1:${port}`, `localhost:${port}`]);
7
+ const origins = new Set([`http://127.0.0.1:${port}`, `http://localhost:${port}`]);
8
+ return async (c, next) => {
9
+ const host = c.req.header('host');
10
+ const origin = c.req.header('origin');
11
+ if (host === undefined || !hosts.has(host.toLowerCase())) {
12
+ return c.text('Forbidden', 403);
13
+ }
14
+ if (origin !== undefined && !origins.has(origin.toLowerCase())) {
15
+ return c.text('Forbidden', 403);
16
+ }
17
+ await next();
18
+ };
19
+ }
20
+ function sameSecret(given, token) {
21
+ if (given === undefined)
22
+ return false;
23
+ const a = Buffer.from(given);
24
+ const b = Buffer.from(token);
25
+ return a.length === b.length && timingSafeEqual(a, b);
26
+ }
27
+ /**
28
+ * The per-start token: `/?token=` swaps it for a cookie and redirects to `/`, and every `/api/*`
29
+ * request without that cookie is refused. Static files need no token; they carry no data.
30
+ */
31
+ export function tokenAccess({ port, token }) {
32
+ const cookie = cookieName(port);
33
+ return async (c, next) => {
34
+ const path = c.req.path;
35
+ if (path === '/' && c.req.query('token') !== undefined) {
36
+ if (!sameSecret(c.req.query('token'), token))
37
+ return c.text('Forbidden', 403);
38
+ setCookie(c, cookie, token, { httpOnly: true, sameSite: 'Strict', path: '/' });
39
+ return c.redirect('/', 302);
40
+ }
41
+ if ((path === '/api' || path.startsWith('/api/')) && !sameSecret(getCookie(c, cookie), token)) {
42
+ return c.json({ error: 'unauthorized' }, 401);
43
+ }
44
+ await next();
45
+ };
46
+ }
package/dist/http/app.js CHANGED
@@ -1,5 +1,12 @@
1
- import { readFileSync } from 'node:fs';
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { isAbsolute, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { serveStatic } from '@hono/node-server/serve-static';
2
6
  import { Hono } from 'hono';
7
+ import { columns } from '../board/columns.js';
8
+ import { RegistryUnreadable } from '../source/project-source.js';
9
+ import { localOnly, tokenAccess } from './access.js';
3
10
  /**
4
11
  * Reads the version from the package's own package.json. The relative path is the same from
5
12
  * `server/http/` (tests) and `dist/http/` (published), as both sit two levels below the root.
@@ -9,37 +16,59 @@ export function readPackageVersion() {
9
16
  const pkg = JSON.parse(readFileSync(url, 'utf8'));
10
17
  return pkg.version;
11
18
  }
12
- /** Refuses requests whose `Host` or `Origin` is not this server's own loopback address. */
13
- export function localOnly(port) {
14
- const hosts = new Set([`127.0.0.1:${port}`, `localhost:${port}`]);
15
- const origins = new Set([`http://127.0.0.1:${port}`, `http://localhost:${port}`]);
16
- return async (c, next) => {
17
- const host = c.req.header('host');
18
- const origin = c.req.header('origin');
19
- if (host === undefined || !hosts.has(host.toLowerCase())) {
20
- return c.text('Forbidden', 403);
21
- }
22
- if (origin !== undefined && !origins.has(origin.toLowerCase())) {
23
- return c.text('Forbidden', 403);
24
- }
25
- await next();
26
- };
19
+ /** The built page: `dist/web`, next to `dist/http` where this file runs when published. */
20
+ export const DEFAULT_WEB_ROOT = fileURLToPath(new URL('../web', import.meta.url));
21
+ const refuse = (c, status, code, message) => c.json({ error: { code, message } }, status);
22
+ /** The path the person typed, absolute; `~/` stands for their home. */
23
+ function absolute(path) {
24
+ if (typeof path !== 'string')
25
+ return undefined;
26
+ const expanded = path.trim().replace(/^~(?=$|[\\/])/, homedir());
27
+ return isAbsolute(expanded) ? expanded : undefined;
27
28
  }
28
- export function createApp({ port, version = readPackageVersion() }) {
29
+ export function createApp({ port, token, source, version = readPackageVersion(), webRoot = DEFAULT_WEB_ROOT }) {
29
30
  const app = new Hono();
30
31
  app.use(localOnly(port));
31
- app.get('/', (c) => c.html(`<!doctype html>
32
- <html lang="en">
33
- <head>
34
- <meta charset="utf-8" />
35
- <meta name="viewport" content="width=device-width, initial-scale=1" />
36
- <title>Jig UI</title>
37
- </head>
38
- <body>
39
- <h1>Jig UI &mdash; not built yet</h1>
40
- <p>Version ${version}</p>
41
- </body>
42
- </html>
43
- `));
32
+ app.use(tokenAccess({ port, token }));
33
+ app.onError((error, c) => {
34
+ if (error instanceof RegistryUnreadable)
35
+ return refuse(c, 500, 'registry-unreadable', error.message);
36
+ console.error(error);
37
+ return c.text('Internal Server Error', 500);
38
+ });
39
+ app.get('/api/instance', (c) => c.json({ version }));
40
+ app.get('/api/workspace', async (c) => c.json({ projects: await source.workspace() }));
41
+ app.get('/api/projects/:id/board', async (c) => {
42
+ const id = c.req.param('id');
43
+ const read = await source.tasks(id);
44
+ if (read === undefined)
45
+ return refuse(c, 404, 'not-connected', 'No connected project has this id.');
46
+ if (read.state !== 'ready')
47
+ return c.json({ board: read });
48
+ return c.json({ board: { id, state: 'ready', columns: columns(read.tasks), finished: read.finished } });
49
+ });
50
+ app.post('/api/projects', async (c) => {
51
+ const body = await c.req.json().catch(() => undefined);
52
+ const path = absolute(body?.path);
53
+ if (path === undefined)
54
+ return refuse(c, 422, 'usage', 'Give the absolute path of a project.');
55
+ const result = await source.connect(path);
56
+ if ('code' in result)
57
+ return refuse(c, 422, result.code, result.message);
58
+ return c.json({ project: result.project }, result.created ? 201 : 200);
59
+ });
60
+ app.delete('/api/projects/:id', async (c) => {
61
+ if (!(await source.disconnect(c.req.param('id')))) {
62
+ return refuse(c, 404, 'not-connected', 'No connected project has this id.');
63
+ }
64
+ return c.body(null, 204);
65
+ });
66
+ app.all('/api/*', (c) => c.json({ error: 'not found' }, 404));
67
+ if (existsSync(join(webRoot, 'index.html'))) {
68
+ app.use('/*', serveStatic({ root: webRoot }));
69
+ }
70
+ else {
71
+ app.get('/', (c) => c.text('The page is not built. Run npm run build.', 503));
72
+ }
44
73
  return app;
45
74
  }
@@ -0,0 +1,160 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ const run = promisify(execFile);
6
+ /** The oldest Jig whose reads Jig UI understands: 0.29.0 is the first that prints JSON. */
7
+ export const MIN_JIG_VERSION = '0.29.0';
8
+ const SCRIPT = join('.ai', 'scripts', 'jig');
9
+ const TIMEOUT_MS = 10_000;
10
+ /**
11
+ * The bash that runs `.ai/scripts/jig`. On Windows it is Git's, found next to git itself
12
+ * (`<git>/mingw64/libexec/git-core` → `<git>/bin/bash.exe`): a `bash` on PATH may be WSL's.
13
+ */
14
+ async function bash(platform) {
15
+ if (platform !== 'win32')
16
+ return 'bash';
17
+ const { stdout } = await run('git', ['--exec-path'], { timeout: TIMEOUT_MS });
18
+ return resolve(stdout.trim(), '..', '..', '..', 'bin', 'bash.exe');
19
+ }
20
+ /** Runs the project's own Jig in its main checkout, without a shell. */
21
+ async function jig(root, args, platform) {
22
+ const { stdout } = await run(await bash(platform), [SCRIPT, ...args], { cwd: root, timeout: TIMEOUT_MS });
23
+ return stdout;
24
+ }
25
+ /**
26
+ * The project's Jig version, `undefined` when the checkout has no Jig. Throws when Jig is there but
27
+ * does not answer with a version.
28
+ */
29
+ export async function jigVersion(root, platform = process.platform) {
30
+ if (!existsSync(join(root, SCRIPT)))
31
+ return undefined;
32
+ const match = /^jig (\d+\.\d+\.\d+)\b/.exec((await jig(root, ['--version'], platform)).trim());
33
+ if (!match?.[1])
34
+ throw new Error('jig --version did not print a version');
35
+ return match[1];
36
+ }
37
+ /** Why a JSON read was refused: Jig's failure code (`failed` for one this Jig UI does not know, or a shape it cannot read). */
38
+ export class JigRefusal extends Error {
39
+ code;
40
+ constructor(code) {
41
+ super(`jig refused: ${code}`);
42
+ this.code = code;
43
+ }
44
+ }
45
+ const CODES = new Set(['usage', 'not-a-repository', 'not-initialised', 'failed']);
46
+ /** Jig answered in a shape this Jig UI does not read: a Jig newer than the contract its tests pin. */
47
+ export class JigShapeError extends Error {
48
+ constructor() {
49
+ super('jig answered in a shape this Jig UI does not read');
50
+ }
51
+ }
52
+ const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
53
+ const isString = (v) => typeof v === 'string';
54
+ const isNullableString = (v) => v === null || typeof v === 'string';
55
+ /**
56
+ * Runs a `--json` read and returns its `data` and the clone's revision. Jig's refusal throws
57
+ * JigRefusal, as does output that is no JSON at all (a crash); an envelope of another shape throws
58
+ * JigShapeError.
59
+ */
60
+ async function readJson(root, args, platform) {
61
+ let stdout;
62
+ try {
63
+ stdout = await jig(root, [...args, '--json'], platform);
64
+ }
65
+ catch (error) {
66
+ // A refusal is an envelope too, printed before the non-zero exit.
67
+ stdout = error.stdout ?? '';
68
+ }
69
+ let envelope;
70
+ try {
71
+ envelope = JSON.parse(stdout);
72
+ }
73
+ catch {
74
+ throw new JigRefusal('failed');
75
+ }
76
+ if (!isObject(envelope) || envelope.schema !== 1 || typeof envelope.revision !== 'number')
77
+ throw new JigShapeError();
78
+ if (isObject(envelope.error)) {
79
+ const code = envelope.error.code;
80
+ throw new JigRefusal(isString(code) && CODES.has(code) ? code : 'failed');
81
+ }
82
+ if (!isObject(envelope.data))
83
+ throw new JigShapeError();
84
+ return { revision: envelope.revision, data: envelope.data };
85
+ }
86
+ const isAttention = (v) => isObject(v) &&
87
+ isString(v.kind) &&
88
+ isObject(v.subject) &&
89
+ isString(v.subject.type) &&
90
+ isNullableString(v.subject.id) &&
91
+ Array.isArray(v.tasks) &&
92
+ v.tasks.every(isString) &&
93
+ isString(v.title) &&
94
+ isNullableString(v.detail) &&
95
+ isString(v.todo) &&
96
+ isNullableString(v.url);
97
+ /** What needs the person in a project, most urgent first, and whether the pull request facts behind it may be missing. */
98
+ export async function readStatus(root, platform = process.platform) {
99
+ const { revision, data } = await readJson(root, ['status'], platform);
100
+ const { attention, housekeeping } = data;
101
+ if (!Array.isArray(attention) || !attention.every(isAttention))
102
+ throw new JigShapeError();
103
+ if (housekeeping !== null && !(isObject(housekeeping) && typeof housekeeping.stale === 'boolean'))
104
+ throw new JigShapeError();
105
+ return {
106
+ revision,
107
+ attention: attention.map(({ kind, subject, tasks, title, detail, todo, url }) => ({
108
+ kind,
109
+ subject: { type: subject.type, id: subject.id },
110
+ tasks: [...tasks],
111
+ title,
112
+ detail,
113
+ todo,
114
+ url,
115
+ })),
116
+ housekeepingStale: housekeeping?.stale === true,
117
+ };
118
+ }
119
+ const STATUSES = new Set(['active', 'ready', 'consolidated', 'abandoned']);
120
+ const isNullableState = (v) => v === null || (isObject(v) && isString(v.state));
121
+ const isPullRequest = (v) => v === null || (isObject(v) && isString(v.url) && isNullableString(v.state) && isNullableString(v.ci));
122
+ const isTaskRow = (v) => isObject(v) &&
123
+ isString(v.id) &&
124
+ isNullableString(v.class) &&
125
+ isString(v.status) &&
126
+ STATUSES.has(v.status) &&
127
+ isNullableString(v.goal) &&
128
+ typeof v.paused === 'boolean' &&
129
+ isNullableString(v.branch) &&
130
+ isNullableState(v.gate) &&
131
+ isNullableState(v.autopilot) &&
132
+ isPullRequest(v.pull_request);
133
+ /** The project's live tasks (`jig task list --json`) and how many finished ones it left out. */
134
+ export async function readTasks(root, platform = process.platform) {
135
+ const { revision, data } = await readJson(root, ['task', 'list'], platform);
136
+ if (!Array.isArray(data.tasks) || !data.tasks.every(isTaskRow) || typeof data.hidden !== 'number')
137
+ throw new JigShapeError();
138
+ const tasks = data.tasks.map(({ id, class: cls, status, goal, paused, branch, gate, autopilot, pull_request: pr }) => ({
139
+ id,
140
+ class: cls,
141
+ status,
142
+ goal,
143
+ paused,
144
+ branch,
145
+ gate: gate && { state: gate.state },
146
+ autopilot: autopilot && { state: autopilot.state },
147
+ pullRequest: pr && { url: pr.url, state: pr.state, ci: pr.ci },
148
+ }));
149
+ return { revision, tasks, hidden: data.hidden };
150
+ }
151
+ /** True when `version` is at least the minimum Jig UI reads. */
152
+ export function supports(version, minimum = MIN_JIG_VERSION) {
153
+ const a = version.split('.').map(Number);
154
+ const b = minimum.split('.').map(Number);
155
+ for (let i = 0; i < 3; i++) {
156
+ if ((a[i] ?? 0) !== (b[i] ?? 0))
157
+ return (a[i] ?? 0) > (b[i] ?? 0);
158
+ }
159
+ return true;
160
+ }
package/dist/main.js CHANGED
@@ -1,11 +1,19 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { homedir } from 'node:os';
3
+ import { setTimeout as delay } from 'node:timers/promises';
1
4
  import { serve } from '@hono/node-server';
2
- import { parseCliArgs } from './args.js';
5
+ import { DEFAULT_PORT, parseCliArgs } from './args.js';
3
6
  import { createApp, readPackageVersion } from './http/app.js';
7
+ import { openBrowser } from './open-browser.js';
8
+ import { configDir } from './registry/config-dir.js';
9
+ import { probeInstance, readInstance, removeInstance, writeInstance } from './registry/instance.js';
10
+ import { localSource } from './source/local.js';
4
11
  const HOST = '127.0.0.1';
5
12
  const HELP = `Usage: jig-ui [options]
6
13
 
7
14
  Options:
8
15
  --port <n> Port to listen on (default 4870)
16
+ --no-open Print the link instead of opening the browser
9
17
  -v, --version Print the version and exit
10
18
  -h, --help Print this help and exit
11
19
  `;
@@ -13,7 +21,28 @@ function fail(message) {
13
21
  console.error(message);
14
22
  process.exit(1);
15
23
  }
16
- export function main() {
24
+ const link = ({ port, token }) => `http://${HOST}:${port}/?token=${token}`;
25
+ async function show(info, open, dir) {
26
+ console.log(`Open it at ${link(info)}`);
27
+ if (open && !(await openBrowser(link(info), dir)))
28
+ console.log('Could not open a browser; open the link above.');
29
+ }
30
+ /** The instance recorded in the config directory, if it still answers with its token. */
31
+ async function runningInstance(dir) {
32
+ const info = await readInstance(dir);
33
+ return info && (await probeInstance(info)) ? info : undefined;
34
+ }
35
+ /** After losing the port: the winner writes its file only once it listens, so give it a moment. */
36
+ async function winnerOfRace(dir) {
37
+ for (let attempt = 0; attempt < 5; attempt++) {
38
+ const winner = await runningInstance(dir);
39
+ if (winner)
40
+ return winner;
41
+ await delay(200);
42
+ }
43
+ return undefined;
44
+ }
45
+ export async function main() {
17
46
  const command = parseCliArgs(process.argv.slice(2));
18
47
  if (command.kind === 'error')
19
48
  fail(command.message);
@@ -25,22 +54,45 @@ export function main() {
25
54
  console.log(readPackageVersion());
26
55
  return;
27
56
  }
28
- const { port } = command;
57
+ const { port, open } = command;
58
+ const dir = configDir(process.env, process.platform, homedir());
59
+ const running = await runningInstance(dir);
60
+ if (running) {
61
+ console.log(`Jig UI is already running on port ${running.port}.`);
62
+ // ponytail: a --port equal to the default is indistinguishable from no flag; no note then.
63
+ if (port !== running.port && port !== DEFAULT_PORT)
64
+ console.log(`--port ${port} is ignored.`);
65
+ await show(running, open, dir);
66
+ return;
67
+ }
29
68
  const version = readPackageVersion();
30
- const server = serve({ fetch: createApp({ port, version }).fetch, hostname: HOST, port }, () => {
31
- console.log(`Jig UI ${version} is running at http://${HOST}:${port}/`);
32
- console.log('Press Ctrl+C to stop.');
69
+ const token = randomBytes(32).toString('base64url');
70
+ const server = serve({ fetch: createApp({ port, token, source: localSource(dir), version }).fetch, hostname: HOST, port }, () => {
71
+ void (async () => {
72
+ await writeInstance(dir, { port, token, pid: process.pid, version });
73
+ console.log(`Jig UI ${version} is running at http://${HOST}:${port}/`);
74
+ await show({ port, token }, open, dir);
75
+ console.log('Press Ctrl+C to stop.');
76
+ })().catch((error) => fail(`Could not start: ${error instanceof Error ? error.message : String(error)}`));
33
77
  });
34
78
  server.on('error', (error) => {
35
- if (error.code === 'EADDRINUSE') {
36
- fail(`Port ${port} is already in use. Stop the other process or choose another port with --port.`);
37
- }
38
- fail(`Could not start the server: ${error.message}`);
79
+ if (error.code !== 'EADDRINUSE')
80
+ fail(`Could not start the server: ${error.message}`);
81
+ // Two starts at once: the one that lost the port opens the one that won.
82
+ void winnerOfRace(dir).then(async (winner) => {
83
+ if (!winner)
84
+ fail(`Port ${port} is already in use. Stop the other process or choose another port with --port.`);
85
+ console.log(`Jig UI is already running on port ${winner.port}.`);
86
+ await show(winner, open, dir);
87
+ process.exit(0);
88
+ });
39
89
  });
40
90
  const shutdown = () => {
41
- server.close(() => process.exit(0));
42
- if ('closeAllConnections' in server)
43
- server.closeAllConnections();
91
+ void removeInstance(dir, token).finally(() => {
92
+ server.close(() => process.exit(0));
93
+ if ('closeAllConnections' in server)
94
+ server.closeAllConnections();
95
+ });
44
96
  };
45
97
  process.on('SIGINT', shutdown);
46
98
  process.on('SIGTERM', shutdown);
@@ -0,0 +1,47 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { OPEN_FILE, writeConfigFile } from './registry/instance.js';
3
+ /** The system command that opens a file in the default browser. */
4
+ export function browserCommand(platform, file) {
5
+ if (platform === 'darwin')
6
+ return { cmd: 'open', args: [file] };
7
+ if (platform === 'win32')
8
+ return { cmd: 'explorer.exe', args: [file] };
9
+ return { cmd: 'xdg-open', args: [file] };
10
+ }
11
+ /** A page that sends the browser on to `url`; the token travels in the file, not in a process's arguments. */
12
+ export function redirectPage(url) {
13
+ const json = JSON.stringify(url).replace(/</g, '\\u003c');
14
+ const attr = url.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
15
+ return `<!doctype html>
16
+ <html lang="en">
17
+ <head>
18
+ <meta charset="utf-8" />
19
+ <meta http-equiv="refresh" content="0; url=${attr}" />
20
+ <title>Jig UI</title>
21
+ <script>location.replace(${json});</script>
22
+ </head>
23
+ <body><a href="${attr}">Open Jig UI</a></body>
24
+ </html>
25
+ `;
26
+ }
27
+ /**
28
+ * Opens `url` in the default browser through a redirect file, because `ps` shows every user the
29
+ * arguments of a process, and the url carries the token. The file lives in the config directory
30
+ * and is not removed here: a second start exits at once, maybe before the browser read it; the
31
+ * instance removes it when it stops. Resolves false when no browser could be started; the caller
32
+ * prints the link instead.
33
+ */
34
+ export async function openBrowser(url, dir, platform = process.platform) {
35
+ let file;
36
+ try {
37
+ file = await writeConfigFile(dir, OPEN_FILE, redirectPage(url));
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ const { cmd, args } = browserCommand(platform, file);
43
+ return new Promise((resolve) => {
44
+ // explorer.exe exits with 1 even when it opened the file, so on Windows only a spawn error counts.
45
+ execFile(cmd, args, (error) => resolve(!error || (platform === 'win32' && typeof error.code === 'number')));
46
+ });
47
+ }
@@ -0,0 +1,10 @@
1
+ import { posix, win32 } from 'node:path';
2
+ /**
3
+ * Jig UI's config directory, following each system's convention: `%APPDATA%\jig-ui` on Windows,
4
+ * else `$XDG_CONFIG_HOME/jig-ui`, else `~/.config/jig-ui`. Pure: the caller passes the environment.
5
+ */
6
+ export function configDir(env, platform, home) {
7
+ if (platform === 'win32')
8
+ return win32.join(env.APPDATA || win32.join(home, 'AppData', 'Roaming'), 'jig-ui');
9
+ return posix.join(env.XDG_CONFIG_HOME || posix.join(home, '.config'), 'jig-ui');
10
+ }
@@ -0,0 +1,50 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ const FILE = 'instance.json';
5
+ /** The page that sends the browser on to the instance; it carries the token, so it lives here too. */
6
+ export const OPEN_FILE = 'open.html';
7
+ /** The cookie that carries the token; named by port, as browsers do not separate cookies by port. */
8
+ export const cookieName = (port) => `jig-ui-${port}`;
9
+ export async function readInstance(dir) {
10
+ try {
11
+ const info = JSON.parse(await readFile(join(dir, FILE), 'utf8'));
12
+ if (typeof info.port !== 'number' || typeof info.token !== 'string')
13
+ return undefined;
14
+ return info;
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ }
20
+ /** Writes a file of the config directory atomically (temp file, then rename), readable only by the user. */
21
+ export async function writeConfigFile(dir, name, content) {
22
+ await mkdir(dir, { recursive: true, mode: 0o700 });
23
+ const temp = join(dir, `${name}.${randomBytes(6).toString('hex')}.tmp`);
24
+ await writeFile(temp, content, { mode: 0o600 });
25
+ await rename(temp, join(dir, name));
26
+ return join(dir, name);
27
+ }
28
+ export async function writeInstance(dir, info) {
29
+ await writeConfigFile(dir, FILE, `${JSON.stringify(info, null, 2)}\n`);
30
+ }
31
+ /** Removes the files only while they are still ours: an instance started after us may have replaced them. */
32
+ export async function removeInstance(dir, token) {
33
+ if ((await readInstance(dir))?.token !== token)
34
+ return;
35
+ await rm(join(dir, OPEN_FILE), { force: true });
36
+ await rm(join(dir, FILE), { force: true });
37
+ }
38
+ /** True when an instance answers on its port with its token; a crash leaves the file behind. */
39
+ export async function probeInstance(info, timeoutMs = 1000) {
40
+ try {
41
+ const res = await fetch(`http://127.0.0.1:${info.port}/api/instance`, {
42
+ headers: { cookie: `${cookieName(info.port)}=${info.token}` },
43
+ signal: AbortSignal.timeout(timeoutMs),
44
+ });
45
+ return res.ok;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
@@ -0,0 +1,78 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { basename, join } from 'node:path';
3
+ import { writeConfigFile } from './instance.js';
4
+ const FILE = 'projects.json';
5
+ /** The registry file exists but cannot be read; it is never overwritten then, so the list is not lost. */
6
+ export class RegistryUnreadable extends Error {
7
+ constructor() {
8
+ super(`${FILE} in Jig UI's config directory cannot be read; fix or remove it.`);
9
+ }
10
+ }
11
+ const isProject = (p) => typeof p === 'object' && p !== null && typeof p.id === 'string' && typeof p.path === 'string';
12
+ /** The connected projects in the order they were connected; none when there is no registry yet. */
13
+ export async function readProjects(dir) {
14
+ let text;
15
+ try {
16
+ text = await readFile(join(dir, FILE), 'utf8');
17
+ }
18
+ catch (error) {
19
+ if (error.code === 'ENOENT')
20
+ return [];
21
+ throw new RegistryUnreadable();
22
+ }
23
+ try {
24
+ const { projects } = JSON.parse(text);
25
+ if (Array.isArray(projects) && projects.every(isProject))
26
+ return projects;
27
+ }
28
+ catch {
29
+ // falls through
30
+ }
31
+ throw new RegistryUnreadable();
32
+ }
33
+ /** The id for a checkout: its directory name as a slug, with `-2`, `-3`… when that is taken. */
34
+ export function slugFor(root, taken) {
35
+ const base = basename(root)
36
+ .normalize('NFKD')
37
+ .replace(/[̀-ͯ]/g, '')
38
+ .toLowerCase()
39
+ .replace(/[^a-z0-9]+/g, '-')
40
+ .replace(/^-+|-+$/g, '') || 'project';
41
+ let id = base;
42
+ for (let n = 2; taken.has(id); n++)
43
+ id = `${base}-${n}`;
44
+ return id;
45
+ }
46
+ // One instance is the only writer; this chain keeps its own requests from overlapping.
47
+ let writes = Promise.resolve();
48
+ function serialized(change) {
49
+ const next = writes.then(change, change);
50
+ writes = next.catch(() => undefined);
51
+ return next;
52
+ }
53
+ async function save(dir, projects) {
54
+ await writeConfigFile(dir, FILE, `${JSON.stringify({ projects }, null, 2)}\n`);
55
+ }
56
+ /** Connects the checkout at `root`; a checkout already connected keeps its id. */
57
+ export function addProject(dir, root) {
58
+ return serialized(async () => {
59
+ const projects = await readProjects(dir);
60
+ const existing = projects.find((p) => p.path === root);
61
+ if (existing)
62
+ return { project: existing, created: false };
63
+ const project = { id: slugFor(root, new Set(projects.map((p) => p.id))), path: root };
64
+ await save(dir, [...projects, project]);
65
+ return { project, created: true };
66
+ });
67
+ }
68
+ /** Disconnects a project; false when no project has that id. Nothing in the project is touched. */
69
+ export function removeProject(dir, id) {
70
+ return serialized(async () => {
71
+ const projects = await readProjects(dir);
72
+ const rest = projects.filter((p) => p.id !== id);
73
+ if (rest.length === projects.length)
74
+ return false;
75
+ await save(dir, rest);
76
+ return true;
77
+ });
78
+ }
@@ -0,0 +1,25 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { realpath } from 'node:fs/promises';
3
+ import { promisify } from 'node:util';
4
+ const run = promisify(execFile);
5
+ /**
6
+ * Where `path` sits in git: a clone's main checkout (its root, even from a subdirectory), a
7
+ * worktree, or nothing git knows. Only a worktree has a git directory of its own beside the
8
+ * clone's common one; a submodule or a `--separate-git-dir` clone has one directory for both.
9
+ */
10
+ export async function mainCheckout(path) {
11
+ let stdout;
12
+ try {
13
+ ({ stdout } = await run('git', ['rev-parse', '--path-format=absolute', '--show-toplevel', '--git-dir', '--git-common-dir'], {
14
+ cwd: path,
15
+ timeout: 10_000,
16
+ }));
17
+ }
18
+ catch {
19
+ return { kind: 'not-a-repository' };
20
+ }
21
+ const [top, own, common] = stdout.trim().split(/\r?\n/);
22
+ if (!top || !own || !common)
23
+ return { kind: 'not-a-repository' };
24
+ return (await realpath(own)) === (await realpath(common)) ? { kind: 'main', root: await realpath(top) } : { kind: 'worktree' };
25
+ }
@@ -0,0 +1,116 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { JigRefusal, JigShapeError, jigVersion, MIN_JIG_VERSION, readStatus, readTasks, supports } from '../jig/client.js';
3
+ import { addProject, readProjects, removeProject } from '../registry/projects.js';
4
+ import { mainCheckout } from './checkout.js';
5
+ /** Jig's version in the checkout: `null` when Jig is there but names no version Jig UI can read. */
6
+ async function version(root) {
7
+ try {
8
+ return await jigVersion(root);
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ /** The main checkout `path` names, or why it cannot be connected. A Jig below the minimum can. */
15
+ async function connectable(path) {
16
+ const checkout = await mainCheckout(path);
17
+ if (checkout.kind === 'not-a-repository') {
18
+ return { code: 'not-a-repository', message: 'This is not a directory inside a git repository.' };
19
+ }
20
+ if (checkout.kind === 'worktree') {
21
+ return { code: 'worktree', message: "This is a worktree. Connect its clone's main checkout instead." };
22
+ }
23
+ if ((await version(checkout.root)) === undefined) {
24
+ return { code: 'no-jig', message: 'There is no Jig in this repository. Run jig init in it first.' };
25
+ }
26
+ return { root: checkout.root };
27
+ }
28
+ function count(tasks) {
29
+ return {
30
+ active: tasks.filter((t) => t.status === 'active' && !t.paused).length,
31
+ paused: tasks.filter((t) => t.paused).length,
32
+ ready: tasks.filter((t) => t.status === 'ready' && !t.paused).length,
33
+ };
34
+ }
35
+ /**
36
+ * Runs `read` on a connected project whose Jig Jig UI reads; a project gone, below the minimum, or
37
+ * refusing the read comes back as its state instead.
38
+ */
39
+ async function reading({ id, path }, read) {
40
+ if (!existsSync(path))
41
+ return { id, state: 'unavailable', reason: 'missing' };
42
+ const v = await version(path);
43
+ if (v === undefined)
44
+ return { id, state: 'unavailable', reason: 'no-jig' };
45
+ if (v === null || !supports(v))
46
+ return { id, state: 'unsupported', jigVersion: v, minimum: MIN_JIG_VERSION };
47
+ try {
48
+ return await read(path, v);
49
+ }
50
+ catch (error) {
51
+ if (error instanceof JigShapeError)
52
+ return { id, state: 'incompatible', jigVersion: v };
53
+ // Only the code goes on: Jig's message may name a path.
54
+ return { id, state: 'unreadable', code: error instanceof JigRefusal ? error.code : 'failed' };
55
+ }
56
+ }
57
+ function view(project) {
58
+ return reading(project, async (root, jigVersion) => {
59
+ const [status, { tasks }] = await Promise.all([readStatus(root), readTasks(root)]);
60
+ return {
61
+ id: project.id,
62
+ state: 'ready',
63
+ jigVersion,
64
+ counts: count(tasks),
65
+ attention: status.attention,
66
+ housekeepingStale: status.housekeepingStale,
67
+ };
68
+ });
69
+ }
70
+ function tasksOf(project) {
71
+ return reading(project, async (root) => {
72
+ const { tasks, hidden } = await readTasks(root);
73
+ return {
74
+ state: 'ready',
75
+ // Jig's live list holds active and ready tasks only.
76
+ tasks: tasks.flatMap((t) => t.status === 'active' || t.status === 'ready'
77
+ ? [
78
+ {
79
+ id: t.id,
80
+ class: t.class,
81
+ status: t.status,
82
+ goal: t.goal,
83
+ paused: t.paused,
84
+ started: t.branch !== null,
85
+ gate: t.gate?.state ?? null,
86
+ autopilot: t.autopilot?.state ?? null,
87
+ pullRequest: t.pullRequest,
88
+ },
89
+ ]
90
+ : []),
91
+ finished: hidden,
92
+ };
93
+ });
94
+ }
95
+ /** The local adapter: the registry in the config directory, and Jig run in each main checkout. */
96
+ export function localSource(configDir) {
97
+ return {
98
+ async workspace() {
99
+ return Promise.all((await readProjects(configDir)).map(view));
100
+ },
101
+ async connect(path) {
102
+ const found = await connectable(path);
103
+ if ('code' in found)
104
+ return found;
105
+ const { project, created } = await addProject(configDir, found.root);
106
+ return { project: await view(project), created };
107
+ },
108
+ async tasks(id) {
109
+ const project = (await readProjects(configDir)).find((p) => p.id === id);
110
+ return project && tasksOf(project);
111
+ },
112
+ disconnect(id) {
113
+ return removeProject(configDir, id);
114
+ },
115
+ };
116
+ }
@@ -0,0 +1 @@
1
+ export { RegistryUnreadable } from '../registry/projects.js';
@@ -0,0 +1 @@
1
+ .columns[data-v-cee70b73]{grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));align-items:start;gap:1rem;display:grid}ul[data-v-cee70b73]{padding:0;list-style:none}li[data-v-cee70b73]{border:1px solid;border-radius:.25rem;margin-bottom:.5rem;padding:.5rem}.goal[data-v-cee70b73]{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}
@@ -0,0 +1,2 @@
1
+ (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>x(e)===`[object Map]`,p=e=>x(e)===`[object Set]`,m=e=>x(e)===`[object Date]`,h=e=>typeof e==`function`,g=e=>typeof e==`string`,_=e=>typeof e==`symbol`,v=e=>typeof e==`object`&&!!e,y=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),b=Object.prototype.toString,x=e=>b.call(e),S=e=>x(e).slice(8,-1),C=e=>x(e)===`[object Object]`,w=e=>g(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,ee=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),te=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ne=/-\w/g,T=te(e=>e.replace(ne,e=>e.slice(1).toUpperCase())),re=/\B([A-Z])/g,E=te(e=>e.replace(re,`-$1`).toLowerCase()),ie=te(e=>e.charAt(0).toUpperCase()+e.slice(1)),ae=te(e=>e?`on${ie(e)}`:``),D=(e,t)=>!Object.is(e,t),oe=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},O=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},se=e=>{let t=parseFloat(e);return isNaN(t)?e:t},ce,le=()=>ce||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};function ue(e){if(d(e)){let t={};for(let n=0;n<e.length;n++){let r=e[n],i=g(r)?me(r):ue(r);if(i)for(let e in i)t[e]=i[e]}return t}if(g(e)||v(e))return e}var de=/;(?![^(]*\))/g,fe=/:([^]+)/,pe=/"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g;function me(e){let t={};return e.replace(pe,e=>e.startsWith(`/*`)?``:e).split(de).forEach(e=>{if(e){let n=e.split(fe);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function k(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;n<e.length;n++){let r=k(e[n]);r&&(t+=r+` `)}else if(v(e))for(let n in e)e[n]&&(t+=n+` `);return t.trim()}var he=e(`itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,playsinline,readonly`);function ge(e){return!!e||e===``}function _e(e,t,n){if(e.length!==t.length)return!1;let r=!0;for(let i=0;r&&i<e.length;i++)r=xe(e[i],t[i],n);return r}function ve(e,t,n){if(e.size!==t.size)return!1;let r=Array.from(t),i=new Uint8Array(r.length);for(let t of e){let e=-1;for(let a=0;a<r.length;a++)if(!i[a]&&xe(t,r[a],n)){e=a;break}if(e<0)return!1;i[e]=1}return!0}function ye(e,t,n){let r=f(e),i=f(t);if(r||i||(r=p(e),i=p(t),r||i))return r&&i?ve(e,t,n):!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let r in e){let i=e.hasOwnProperty(r),a=t.hasOwnProperty(r);if(i&&!a||!i&&a||!xe(e[r],t[r],n))return!1}return String(e)===String(t)}function be(e,t,n,r){n||=[new Map,new Map];let[i,a]=n;if(i.has(e)||a.has(t))return i.get(e)===t&&a.get(t)===e;i.set(e,t),a.set(t,e);let o=r(e,t,n);return i.delete(e),a.delete(t),o}function xe(e,t,n){if(e===t)return!0;let r=m(e),i=m(t);return r||i?r&&i?e.getTime()===t.getTime():!1:(r=_(e),i=_(t),r||i?e===t:(r=d(e),i=d(t),r||i?r&&i?be(e,t,n,_e):!1:(r=v(e),i=v(t),r||i?!r||!i?!1:be(e,t,n,ye):String(e)===String(t))))}var Se=e=>!!(e&&e.__v_isRef===!0),A=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?Se(e)?A(e.value):JSON.stringify(e,Ce,2):String(e),Ce=(e,t)=>Se(t)?Ce(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[we(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>we(e))}:_(t)?we(t):v(t)&&!d(t)&&!C(t)?String(t):t,we=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,j,Te=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&j&&(j.active?(this.parent=j,this.index=(j.scopes||(j.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,t;if(this.scopes){let n=this.scopes.slice();for(e=0,t=n.length;e<t;e++)n[e].pause()}for(e=0,t=this.effects.length;e<t;e++)this.effects[e].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let e,t;if(this.scopes){let n=this.scopes.slice();for(e=0,t=n.length;e<t;e++)n[e].resume()}let n=this.effects.slice();for(e=0,t=n.length;e<t;e++)n[e].resume()}}run(e){if(this._active){let t=j;try{return j=this,e()}finally{j=t}}}on(){++this._on===1&&(this.prevScope=j,j=this)}off(){if(this._on>0&&--this._on===0){if(j===this)j=this.prevScope;else{let e=j;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(this.effects.length=0,t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.cleanups.length=0,this.scopes){let e=this.scopes.slice();for(t=0,n=e.length;t<n;t++)e[t].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!e){let e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.parent=void 0}}};function Ee(){return j}var M,De=new WeakSet,Oe=class{constructor(e){this.fn=e,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,j&&(j.active?j.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,De.has(this)&&(De.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Me(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,We(this),Fe(this);let e=M,t=N;M=this,N=!0;try{return this.fn()}finally{Ie(this),M=e,N=t,this.flags&=-3}}stop(){if(this.flags&1){for(let e=this.deps;e;e=e.nextDep)ze(e);this.deps=this.depsTail=void 0,We(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?De.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Le(this)&&this.run()}get dirty(){return Le(this)}},ke=0,Ae,je;function Me(e,t=!1){e.flags|=8,t?(e.next=je,je=e):(e.next=Ae,Ae=e)}function Ne(){ke++}function Pe(){if(--ke>0)return;if(je){let e=je;for(je=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;Ae;){let t=Ae;for(Ae=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(t){e||=t}t=n}}if(e)throw e}function Fe(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ie(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),ze(r),Be(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Le(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Re(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Re(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ge)||(e.globalVersion=Ge,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Le(e))))return;e.flags|=2;let t=e.dep,n=M,r=N;M=e,N=!0;try{Fe(e);let n=e.fn(e._value);(t.version===0||D(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{M=n,N=r,Ie(e),e.flags&=-3}}function ze(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)ze(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Be(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var N=!0,Ve=[];function He(){Ve.push(N),N=!1}function Ue(){let e=Ve.pop();N=e===void 0||e}function We(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=M;M=void 0;try{t()}finally{M=e}}}var Ge=0,Ke=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},qe=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!M||!N||M===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==M)t=this.activeLink=new Ke(M,this),M.deps?(t.prevDep=M.depsTail,M.depsTail.nextDep=t,M.depsTail=t):M.deps=M.depsTail=t,Je(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=M.depsTail,t.nextDep=void 0,M.depsTail.nextDep=t,M.depsTail=t,M.deps===t&&(M.deps=e)}return t}trigger(e){this.version++,Ge++,this.notify(e)}notify(e){Ne();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{Pe()}}};function Je(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)Je(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var Ye=new WeakMap,Xe=Symbol(``),Ze=Symbol(``),Qe=Symbol(``);function P(e,t,n){if(N&&M){let t=Ye.get(e);t||Ye.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new qe),r.map=t,r.key=n),r.track()}}function $e(e,t,n,r,i,a){let o=Ye.get(e);if(!o){Ge++;return}let s=e=>{e&&e.trigger()};if(Ne(),t===`clear`)o.forEach(s);else{let i=d(e),a=i&&w(n);if(i&&n===`length`){let e=Number(r);o.forEach((t,n)=>{(n===`length`||n===Qe||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(Qe)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Xe)),f(e)&&s(o.get(Ze)));break;case`delete`:i||(s(o.get(Xe)),f(e)&&s(o.get(Ze)));break;case`set`:f(e)&&s(o.get(Xe))}}Pe()}function et(e){let t=I(e);return t===e||(P(t,`iterate`,Qe),F(e))?t:zt(e)?Rt(e)?t.map(e=>Ht(L(e))):t.map(Ht):t.map(L)}function tt(e){return P(e=I(e),`iterate`,Qe),e}function nt(e,t){return zt(e)?Ht(Rt(e)?L(t):t):L(t)}var rt={__proto__:null,[Symbol.iterator](){return it(this,Symbol.iterator,e=>nt(this,e))},concat(...e){return et(this).concat(...e.map(e=>d(e)?et(e):e))},entries(){return it(this,`entries`,e=>(e[1]=nt(this,e[1]),e))},every(e,t){return st(this,`every`,e,t,void 0,arguments)},filter(e,t){return st(this,`filter`,e,t,e=>e.map(e=>nt(this,e)),arguments)},find(e,t){return st(this,`find`,e,t,e=>nt(this,e),arguments)},findIndex(e,t){return st(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return st(this,`findLast`,e,t,e=>nt(this,e),arguments)},findLastIndex(e,t){return st(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return st(this,`forEach`,e,t,void 0,arguments)},includes(...e){return lt(this,`includes`,e)},indexOf(...e){return lt(this,`indexOf`,e)},join(e){return et(this).join(e)},lastIndexOf(...e){return lt(this,`lastIndexOf`,e)},map(e,t){return st(this,`map`,e,t,void 0,arguments)},pop(){return ut(this,`pop`)},push(...e){return ut(this,`push`,e)},reduce(e,...t){return ct(this,`reduce`,e,t)},reduceRight(e,...t){return ct(this,`reduceRight`,e,t)},shift(){return ut(this,`shift`)},some(e,t){return st(this,`some`,e,t,void 0,arguments)},splice(...e){return ut(this,`splice`,e)},toReversed(){return et(this).toReversed()},toSorted(e){return et(this).toSorted(e)},toSpliced(...e){return et(this).toSpliced(...e)},unshift(...e){return ut(this,`unshift`,e)},values(){return it(this,`values`,e=>nt(this,e))}};function it(e,t,n){let r=tt(e),i=r[t],a=i.call(r);if(r!==e&&!F(e)){if(a[Symbol.toStringTag]===`Array Iterator`){let e=Object.create(Object.getPrototypeOf(a));return e.next=()=>at(a.next(),n),i!==ot[t]&&Object.defineProperties(e,{return:{get(){let e=a.return;return typeof e==`function`?e.bind(a):e}},throw:{get(){let e=a.throw;return typeof e==`function`?e.bind(a):e}}}),e}a._next=a.next,a.next=()=>at(a._next(),n)}return a}function at(e,t){return e.done||(e.value=t(e.value)),e}var ot=Array.prototype;function st(e,t,n,r,i,a){let o=tt(e),s=o!==e&&!F(e),c=o[t];if(c!==ot[t]){let t=c.apply(e,a);return s?L(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,nt(e,t),r,e)}:n.length>2&&(l=function(t,r){return n.call(this,t,r,e)}));let u=c.call(o,l,r);return s&&i?i(u):u}function ct(e,t,n,r){let i=tt(e),a=i!==e&&!F(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=nt(e,t)),n.call(this,t,nt(e,r),i,e)}):n.length>3&&(o=function(t,r,i){return n.call(this,t,r,i,e)}));let c=i[t](o,...r);return s?nt(e,c):c}function lt(e,t,n){let r=I(e);P(r,`iterate`,Qe);let i=r[t](...n);return(i===-1||i===!1)&&Bt(n[0])?(n[0]=I(n[0]),r[t](...n)):i}function ut(e,t,n=[]){He(),Ne();let r=I(e)[t].apply(e,n);return Pe(),Ue(),r}var dt=e(`__proto__,__v_isRef,__isVue`),ft=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function pt(e){_(e)||(e=String(e));let t=I(this);return P(t,`has`,e),t.hasOwnProperty(e)}var mt=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(t===`__v_skip`)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(t===`__v_isReactive`)return!r;if(t===`__v_isReadonly`)return r;if(t===`__v_isShallow`)return i;if(t===`__v_raw`)return n===(r?i?Mt:jt:i?At:kt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=rt[t]))return e;if(t===`hasOwnProperty`)return pt}let o=Reflect.get(e,t,R(e)?e:n);if((_(t)?ft.has(t):dt(t))||(r||P(e,`get`,t),i))return o;if(R(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?It(e):e}return v(o)?r?It(o):Pt(o):o}},ht=class extends mt{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],a=d(e)&&w(t);if(!this._isShallow){let e=zt(i);if(!F(n)&&!zt(n)&&(i=I(i),n=I(n)),!a&&R(i)&&!R(n))return e||(i.value=n),!0}let o=a?Number(t)<e.length:u(e,t),s=Reflect.set(e,t,n,R(e)?e:r);return e===I(r)&&s&&(o?D(n,i)&&$e(e,`set`,t,n,i):$e(e,`add`,t,n)),s}deleteProperty(e,t){let n=u(e,t),r=e[t],i=Reflect.deleteProperty(e,t);return i&&n&&$e(e,`delete`,t,void 0,r),i}has(e,t){let n=Reflect.has(e,t);return(!_(t)||!ft.has(t))&&P(e,`has`,t),n}ownKeys(e){return P(e,`iterate`,d(e)?`length`:Xe),Reflect.ownKeys(e)}},gt=class extends mt{constructor(e=!1){super(!0,e)}set(e,t){return!0}deleteProperty(e,t){return!0}},_t=new ht,vt=new gt,yt=new ht(!0),bt=e=>e,xt=e=>Reflect.getPrototypeOf(e);function St(e,t,n){return function(...r){let i=this.__v_raw,a=I(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?bt:t?Ht:L;return!t&&P(a,`iterate`,l?Ze:Xe),s(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:c?[d(e[0]),d(e[1])]:d(e),done:t}}})}}function Ct(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function wt(e,t){let n={get(n){let r=this.__v_raw,i=I(r),a=I(n);e||(D(n,a)&&P(i,`get`,n),P(i,`get`,a));let{has:o}=xt(i),s=t?bt:e?Ht:L;if(o.call(i,n))return s(r.get(n));if(o.call(i,a))return s(r.get(a));r!==i&&r.get(n)},get size(){let t=this.__v_raw;return!e&&P(I(t),`iterate`,Xe),t.size},has(t){let n=this.__v_raw,r=I(n),i=I(t);return e||(D(t,i)&&P(r,`has`,t),P(r,`has`,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,a=i.__v_raw,o=I(a),s=t?bt:e?Ht:L;return!e&&P(o,`iterate`,Xe),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:Ct(`add`),set:Ct(`set`),delete:Ct(`delete`),clear:Ct(`clear`)}:{add(e){let n=I(this),r=xt(n),i=I(e),a=!t&&!F(e)&&!zt(e)?i:e;return r.has.call(n,a)||D(e,a)&&r.has.call(n,e)||D(i,a)&&r.has.call(n,i)||(n.add(a),$e(n,`add`,a,a)),this},set(e,n){!t&&!F(n)&&!zt(n)&&(n=I(n));let r=I(this),{has:i,get:a}=xt(r),o=i.call(r,e);o||=(e=I(e),i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?D(n,s)&&$e(r,`set`,e,n,s):$e(r,`add`,e,n),this},delete(e){let t=I(this),{has:n,get:r}=xt(t),i=n.call(t,e);i||=(e=I(e),n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&$e(t,`delete`,e,void 0,a),o},clear(){let e=I(this),t=e.size!==0,n=e.clear();return t&&$e(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=St(r,e,t)}),n}function Tt(e,t){let n=wt(e,t);return(r,i,a)=>i===`__v_isReactive`?!e:i===`__v_isReadonly`?e:i===`__v_isShallow`?t:i===`__v_raw`?r:Reflect.get(u(n,i)&&i in r?n:r,i,a)}var Et={get:Tt(!1,!1)},Dt={get:Tt(!1,!0)},Ot={get:Tt(!0,!1)},kt=new WeakMap,At=new WeakMap,jt=new WeakMap,Mt=new WeakMap;function Nt(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function Pt(e){return zt(e)?e:Lt(e,!1,_t,Et,kt)}function Ft(e){return Lt(e,!1,yt,Dt,At)}function It(e){return Lt(e,!0,vt,Ot,jt)}function Lt(e,t,n,r,i){if(!v(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let a=i.get(e);if(a)return a;let o=Nt(S(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function Rt(e){return zt(e)?Rt(e.__v_raw):!!(e&&e.__v_isReactive)}function zt(e){return!!(e&&e.__v_isReadonly)}function F(e){return!!(e&&e.__v_isShallow)}function Bt(e){return e?!!e.__v_raw:!1}function I(e){let t=e&&e.__v_raw;return t?I(t):e}function Vt(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&O(e,`__v_skip`,!0),e}var L=e=>v(e)?Pt(e):e,Ht=e=>v(e)?It(e):e;function R(e){return e?e.__v_isRef===!0:!1}function Ut(e){return Wt(e,!1)}function Wt(e,t){return R(e)?e:new Gt(e,t)}var Gt=class{constructor(e,t){this.dep=new qe,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:I(e),this._value=t?e:L(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||F(e)||zt(e);e=n?e:I(e),D(e,t)&&(this._rawValue=e,this._value=n?e:L(e),this.dep.trigger())}};function Kt(e){return R(e)?e.value:e}var qt={get:(e,t,n)=>t===`__v_raw`?e:Kt(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return R(i)&&!R(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Jt(e){return Rt(e)?e:new Proxy(e,qt)}var Yt=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new qe(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ge-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&M!==this)return Me(this,!0),!0}get value(){let e=this.dep.track();return Re(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function Xt(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new Yt(r,i,n)}var Zt={},Qt=new WeakMap,$t=void 0;function en(e,t=!1,n=$t){if(n){let t=Qt.get(n);t||Qt.set(n,t=[]),t.push(e)}}function tn(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:F(e)||o===!1||o===0?nn(e,1):nn(e),m,g,_,v,y=!1,b=!1;if(R(e)?(g=()=>e.value,y=F(e)):Rt(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>Rt(e)||F(e)),g=()=>e.map(e=>{if(R(e))return e.value;if(Rt(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){He();try{_()}finally{Ue()}}let t=$t;$t=m;try{return f?f(e,3,[v]):e(v)}finally{$t=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>nn(e(),t)}let x=Ee(),S=()=>{m.stop(),x&&x.active&&c(x.effects,m)};if(s&&n){let e=n;n=(...t)=>{try{return e(...t)}finally{S()}}}let C=b?Array(e.length).fill(Zt):Zt,w=e=>{if(m.flags&1&&(m.dirty||e)){if(n){let t=m.run();if(e||o||y||(b?t.some((e,t)=>D(e,C[t])):D(t,C))){let e=$t;He();try{_&&_(),$t=m;let e=[t,C===Zt?void 0:b&&C[0]===Zt?[]:C,v];C=t,f?f(n,3,e):n(...e)}finally{$t=e,Ue()}}}else m.run()}};return u&&u(w),m=new Oe(g),m.scheduler=l?()=>l(w,!1):w,v=e=>en(e,!1,m),_=m.onStop=()=>{let e=Qt.get(m);if(e){if(f)f(e,4);else for(let t of e)t();Qt.delete(m)}},n?a?w(!0):C=m.run():l?l(w.bind(null,!0),!0):m.run(),S.pause=m.pause.bind(m),S.resume=m.resume.bind(m),S.stop=S,S}function nn(e,t=1/0,n){if(t<=0||!v(e)||e.__v_skip||(n||=new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,R(e))nn(e.value,t,n);else if(d(e))for(let r=0;r<e.length;r++)nn(e[r],t,n);else if(p(e)||f(e))e.forEach(e=>{nn(e,t,n)});else if(C(e)){for(let r in e)nn(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&nn(e[r],t,n)}return e}function rn(e,t,n,r){try{return r?e(...r):e()}catch(e){an(e,t,n)}}function z(e,t,n,r){if(h(e)){let i=rn(e,t,n,r);return i&&y(i)&&i.catch(e=>{an(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a<e.length;a++)i.push(z(e[a],t,n,r));return i}}function an(e,n,r,i=!0){let a=n?n.vnode:null,{errorHandler:o,throwUnhandledErrorInProduction:s}=n&&n.appContext.config||t;if(n){let t=n.parent,i=n.proxy,a=`https://vuejs.org/error-reference/#runtime-${r}`;for(;t;){let n=t.ec;if(n){for(let t=0;t<n.length;t++)if(n[t](e,i,a)===!1)return}t=t.parent}if(o){He(),rn(o,null,10,[e,i,a]),Ue();return}}on(e,r,a,i,s)}function on(e,t,n,r=!0,i=!1){if(i)throw e;console.error(e)}var B=[],V=-1,sn=[],cn=null,ln=0,un=Promise.resolve(),dn=null;function fn(e){let t=dn||un;return e?t.then(this?e.bind(this):e):t}function pn(e){let t=V+1,n=B.length;for(;t<n;){let r=t+n>>>1,i=B[r],a=xn(i);a<e||a===e&&i.flags&2?t=r+1:n=r}return t}function mn(e){if(!(e.flags&1)){let t=xn(e),n=B[B.length-1];!n||!(e.flags&2)&&t>=xn(n)?B.push(e):B.splice(pn(t),0,e),e.flags|=1,hn()}}function hn(){dn||=un.then(Sn)}function gn(e){if(!d(e))cn&&e.id===-1?cn.splice(ln+1,0,e):e.flags&1||(sn.push(e),e.flags|=1);else for(let t=0;t<e.length;t++)sn.push(e[t]);hn()}function _n(e,t,n,r=V+1){for(;r<B.length;r++){let n=B[r];if(n&&n.flags&2){if(e&&n.id!==e.uid||t!==void 0&&!(n.id>=t))continue;B.splice(r,1),r=e?r-1:V,n.flags&4&&(n.flags&=-2),n(),n.flags&4||(n.flags&=-2)}}}function vn(e,t,n=0){if(sn.length){let e=sn,r=0;if(t){e=[];for(let i=0;i<sn.length;i++){let a=sn[i];(a.i===void 0?t.has(a):!a.i||a.i.uid<n)?sn[r++]=a:e.push(a)}}let i=[...new Set(e)].sort((e,t)=>xn(e)-xn(t));if(sn.length=r,cn){for(let e=0;e<i.length;e++)cn.push(i[e]);return}for(cn=i,ln=0;ln<cn.length;ln++){let e=cn[ln];e.flags&4&&(e.flags&=-2),e.flags&8||e(),e.flags&=-2}cn=null,ln=0}}var yn=!1;function bn(e,t){if(yn){e();return}let n=t===void 0?void 0:new Set(sn);e(),yn=!0;try{_n(void 0,t),vn(void 0,n,t)}finally{yn=!1}}var xn=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Sn(e){try{for(V=0;V<B.length;V++){let e=B[V];e&&!(e.flags&8)&&(e.flags&4&&(e.flags&=-2),rn(e,e.i,e.i?15:14),e.flags&4||(e.flags&=-2))}}finally{for(;V<B.length;V++){let e=B[V];e&&(e.flags&=-2)}V=-1,B.length=0,vn(e),dn=null,(B.length||sn.length)&&Sn(e)}}var H=null,Cn=null;function wn(e){let t=H;return H=e,Cn=e&&e.type.__scopeId||null,t}function Tn(e,t=H,n){if(!t||e._n)return e;let r=(...n)=>{r._d&&Mi(-1);let i=wn(t),a=ki.length,o;try{o=e(...n)}finally{for(let e=ki.length;e>a;e--)Ai();wn(i),r._d&&Mi(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function En(e,n){if(H===null)return e;let r=da(H),i=e.dirs||=[];for(let e=0;e<n.length;e++){let[a,o,s,c=t]=n[e];a&&(h(a)&&(a={mounted:a,updated:a}),a.deep&&nn(o),i.push({dir:a,instance:r,value:o,oldValue:void 0,arg:s,modifiers:c}))}return e}function Dn(e,t,n,r){let i=e.dirs,a=t&&t.dirs;for(let o=0;o<i.length;o++){let s=i[o];a&&(s.oldValue=a[o].value);let c=s.dir[r];c&&(He(),z(c,n,8,[e.el,s,e,t]),Ue())}}function On(e,t){if($){let n=$.provides,r=$.parent&&$.parent.provides;r===n&&(n=$.provides=Object.create(r)),n[e]=t}}function kn(e,t,n=!1){let r=Qi();if(r||Lr){let i=Lr?Lr._context.provides:r?r.parent==null||r.ce?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides:void 0;if(i&&e in i)return i[e];if(arguments.length>1)return n&&h(t)?t.call(r&&r.proxy):t}}var An=Symbol.for(`v-scx`),jn=()=>kn(An);function Mn(e,t,n){return Nn(e,t,n)}function Nn(e,n,i=t){let{immediate:a,deep:o,flush:c,once:l}=i,u=s({},i),d=n&&a||!n&&c!==`post`,f;if(ia){if(c===`sync`){let e=jn();f=e.__watcherHandles||=[]}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=$;u.call=(e,t,n)=>z(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{e.i=p,W(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():mn(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=tn(e,n,u);return ia&&(f?f.push(h):d&&h()),h}function Pn(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?Fn(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=ta(this),s=Nn(i,a.bind(r),n);return o(),s}function Fn(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}var In=Symbol(`_vte`),Ln=e=>e.__isTeleport,Rn=Symbol(`_leaveCb`);function zn(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==K){t=n;break}}return t}function Bn(e){if(!Xn(e))return Ln(e.type)&&e.children?zn(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&h(n.default))return n.default()}}function Vn(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let n=e.component.subTree;Vn(Ln(n.type)&&Bn(n)||n,t)}else if(e.shapeFlag&128)e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback);else if(e.transition=t,e.type===G&&d(e.children)){let n=Wr(e.children,!1);n&&Vn(n,t)}}function Hn(e){if(e.component)return Hn(e.component.subTree);if(e.type===G){let t=d(e.children)&&Wr(e.children,!1);return t?Hn(t):void 0}if(e.type!==K)return e}function Un(e,t){return h(e)?s({name:e.name},t,{setup:e}):e}function Wn(e){e.ids=[e.ids[0]+e.ids[2]+++`-`,0,0]}function Gn(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}var Kn=new WeakMap;function qn(e,n,r,a,o=!1){if(d(e)){e.forEach((e,t)=>qn(e,n&&(d(n)?n[t]:n),r,a,o));return}if(Yn(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&qn(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?da(a.component):a.el,l=o?null:s,{i:f,r:p}=e,m=n&&n.r,_=f.refs===t?f.refs={}:f.refs,v=f.setupState,y=I(v),b=v===t?i:e=>!Gn(_,e)&&u(y,e),x=(e,t)=>!(t&&Gn(_,t));if(m!=null&&m!==p){if(Jn(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(R(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))rn(p,f,12,[l,_]);else{let t=g(p),n=R(p);if(t||n){let i=()=>{if(e.f){let n=t?b(p)?v[p]:_[p]:x(p)||!e.k?p.value:_[e.k];if(o)d(n)&&c(n,s);else if(d(n))n.includes(s)||n.push(s);else if(t)_[p]=[s],b(p)&&(v[p]=_[p]);else{let t=[s];x(p,e.k)&&(p.value=t),e.k&&(_[e.k]=t)}}else t?(_[p]=l,b(p)&&(v[p]=l)):n&&(x(p,e.k)&&(p.value=l),e.k&&(_[e.k]=l))};if(l){let t=()=>{i(),Kn.delete(e)};t.id=-1,Kn.set(e,t),W(t,r)}else Jn(e),i()}}}function Jn(e){let t=Kn.get(e);t&&(t.flags|=8,Kn.delete(e))}le().requestIdleCallback,le().cancelIdleCallback;var Yn=e=>!!e.type.__asyncLoader,Xn=e=>e.type.__isKeepAlive;function Zn(e,t){$n(e,`a`,t)}function Qn(e,t){$n(e,`da`,t)}function $n(e,t,n=$){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if(tr(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Xn(e.parent.vnode)&&er(r,t,n,e),e=e.parent}}function er(e,t,n,r){let i=tr(t,e,r,!0);cr(()=>{c(r[t],i)},n)}function tr(e,t,n=$,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{He();let i=ta(n),a=z(t,n,e,r);return i(),Ue(),a};return r?i.unshift(a):i.push(a),a}}var nr=e=>(t,n=$)=>{(!ia||e===`sp`)&&tr(e,(...e)=>t(...e),n)},rr=nr(`bm`),ir=nr(`m`),ar=nr(`bu`),or=nr(`u`),sr=nr(`bum`),cr=nr(`um`),lr=nr(`sp`),ur=nr(`rtg`),dr=nr(`rtc`);function fr(e,t=$){tr(`ec`,e,t)}var pr=Symbol.for(`v-ndc`);function mr(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&Rt(e),r=!1,s=!1;n&&(r=!F(e),s=zt(e),e=tt(e)),i=Array(e.length);for(let n=0,o=e.length;n<o;n++)i[n]=t(r?s?Ht(L(e[n])):L(e[n]):e[n],n,void 0,a&&a[n])}else if(typeof e==`number`){if(!Number.isInteger(e)||e<0)i=[];else{i=Array(e);for(let n=0;n<e;n++)i[n]=t(n+1,n,void 0,a&&a[n])}}else if(v(e)){if(e[Symbol.iterator])i=Array.from(e,(e,n)=>t(e,n,void 0,a&&a[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,o=n.length;r<o;r++){let o=n[r];i[r]=t(e[o],o,r,a&&a[r])}}}else i=[];return n&&(n[r]=i),i}var hr=e=>e?ra(e)?da(e):hr(e.parent):null,gr=s(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>hr(e.parent),$root:e=>hr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Tr(e),$forceUpdate:e=>e.f||=()=>{mn(e.update)},$nextTick:e=>e.n||=fn.bind(e.proxy),$watch:e=>Pn.bind(e)}),_r=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),vr={get({_:e},n){if(n===`__v_skip`)return!0;let{ctx:r,setupState:i,data:a,props:o,accessCache:s,type:c,appContext:l}=e;if(n[0]!==`$`){let e=s[n];if(e!==void 0)switch(e){case 1:return i[n];case 2:return a[n];case 4:return r[n];case 3:return o[n]}else if(_r(i,n))return s[n]=1,i[n];else if(a!==t&&u(a,n))return s[n]=2,a[n];else if(u(o,n))return s[n]=3,o[n];else if(r!==t&&u(r,n))return s[n]=4,r[n];else br&&(s[n]=0)}let d=gr[n],f,p;if(d)return n===`$attrs`&&P(e.attrs,`get`,``),d(e);if((f=c.__cssModules)&&(f=f[n]))return f;if(r!==t&&u(r,n))return s[n]=4,r[n];if(p=l.config.globalProperties,u(p,n))return p[n]},set({_:e},n,r){let{data:i,setupState:a,ctx:o}=e;return _r(a,n)?(a[n]=r,!0):i!==t&&u(i,n)?(i[n]=r,!0):u(e.props,n)||n[0]===`$`&&n.slice(1)in e?!1:(o[n]=r,!0)},has({_:{data:e,setupState:n,accessCache:r,ctx:i,appContext:a,props:o,type:s}},c){let l;return!!(r[c]||e!==t&&c[0]!==`$`&&u(e,c)||_r(n,c)||u(o,c)||u(i,c)||u(gr,c)||u(a.config.globalProperties,c)||(l=s.__cssModules)&&l[c])},defineProperty(e,t,n){return n.get==null?u(n,`value`)&&this.set(e,t,n.value,null):e._.accessCache[t]=0,Reflect.defineProperty(e,t,n)}};function yr(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var br=!0;function xr(e){let t=Tr(e),n=e.proxy,i=e.ctx;br=!1,t.beforeCreate&&Cr(t.beforeCreate,e,`bc`);let{data:a,computed:o,methods:s,watch:c,provide:l,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:g,updated:_,activated:y,deactivated:b,beforeDestroy:x,beforeUnmount:S,destroyed:C,unmounted:w,render:ee,renderTracked:te,renderTriggered:ne,errorCaptured:T,serverPrefetch:re,expose:E,inheritAttrs:ie,components:ae,directives:D,filters:oe}=t;if(u&&Sr(u,i,null),s)for(let e in s){let t=s[e];h(t)&&(i[e]=t.bind(n))}if(a){let t=a.call(n,n);v(t)&&(e.data=Pt(t))}if(br=!0,o)for(let e in o){let t=o[e],a=pa({get:h(t)?t.bind(n,n):h(t.get)?t.get.bind(n,n):r,set:!h(t)&&h(t.set)?t.set.bind(n):r});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(c)for(let e in c)wr(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{On(t,e[t])})}f&&Cr(f,e,`c`);function O(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(O(rr,p),O(ir,m),O(ar,g),O(or,_),O(Zn,y),O(Qn,b),O(fr,T),O(dr,te),O(ur,ne),O(sr,S),O(cr,w),O(lr,re),d(E)){if(E.length){let t=e.exposed||={};E.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||={}}ee&&e.render===r&&(e.render=ee),ie!=null&&(e.inheritAttrs=ie),ae&&(e.components=ae),D&&(e.directives=D),re&&Wn(e)}function Sr(e,t,n=r){d(e)&&(e=Ar(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?kn(r.from||n,r.default,!0):kn(r.from||n):kn(r),R(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function Cr(e,t,n){z(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function wr(e,t,n,r){let i=r.includes(`.`)?Fn(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&Mn(i,n)}else if(h(e))Mn(i,e.bind(n));else if(v(e)){if(d(e))e.forEach(e=>wr(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&Mn(i,r,e)}}}function Tr(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t),c;return s?c=s:!i.length&&!n&&!r?c=t:(c={},i.length&&i.forEach(e=>Er(c,e,o,!0)),Er(c,t,o)),v(t)&&a.set(t,c),c}function Er(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&Er(e,a,n,!0),i&&i.forEach(t=>Er(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=Dr[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var Dr={data:Or,props:Mr,emits:Mr,methods:jr,computed:jr,beforeCreate:U,created:U,beforeMount:U,mounted:U,beforeUpdate:U,updated:U,beforeDestroy:U,beforeUnmount:U,destroyed:U,unmounted:U,activated:U,deactivated:U,errorCaptured:U,serverPrefetch:U,components:jr,directives:jr,watch:Nr,provide:Or,inject:kr};function Or(e,t){return t?e?function(){return s(h(e)?e.call(this,this):e,h(t)?t.call(this,this):t)}:t:e}function kr(e,t){return jr(Ar(e),Ar(t))}function Ar(e){if(d(e)){let t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function U(e,t){return e?[...new Set([].concat(e,t))]:t}function jr(e,t){return e?s(Object.create(null),e,t):t}function Mr(e,t){return e?d(e)&&d(t)?[...new Set([...e,...t])]:s(Object.create(null),yr(e),yr(t??{})):t}function Nr(e,t){if(!e)return t;if(!t)return e;let n=s(Object.create(null),e);for(let r in t)n[r]=U(e[r],t[r]);return n}function Pr(){return{app:null,config:{isNativeTag:i,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}var Fr=0;function Ir(e,t){return function(n,r=null){h(n)||(n=s({},n)),r!=null&&!v(r)&&(r=null);let i=Pr(),a=new WeakSet,o=[],c=!1,l=i.app={_uid:Fr++,_component:n,_props:r,_container:null,_context:i,_instance:null,version:ma,get config(){return i.config},set config(e){},use(e,...t){return a.has(e)||(e&&h(e.install)?(a.add(e),e.install(l,...t)):h(e)&&(a.add(e),e(l,...t))),l},mixin(e){return i.mixins.includes(e)||i.mixins.push(e),l},component(e,t){return t?(i.components[e]=t,l):i.components[e]},directive(e,t){return t?(i.directives[e]=t,l):i.directives[e]},mount(a,o,s){if(!c){let u=l._ceVNode||zi(n,r);return u.appContext=i,s===!0?s=`svg`:s===!1&&(s=void 0),o&&t?t(u,a):e(u,a,s),c=!0,l._container=a,a.__vue_app__=l,da(u.component)}},onUnmount(e){o.push(e)},unmount(){c&&(z(o,l._instance,16),e(null,l._container),delete l._container.__vue_app__)},provide(e,t){return i.provides[e]=t,l},runWithContext(e){let t=Lr;Lr=l;try{return e()}finally{Lr=t}}};return l}}var Lr=null,Rr=(e,t)=>t===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${T(t)}Modifiers`]||e[`${E(t)}Modifiers`];function zr(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&Rr(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>g(e)?e.trim():e)),s.number&&(a=a.map(se)));let c,l=i[c=ae(n)]||i[c=ae(T(n))];!l&&o&&(l=i[c=ae(E(n))]),l&&z(l,e,6,a);let u=i[c+`Once`];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,z(u,e,6,a)}}var Br=new WeakMap;function Vr(e,t,n=!1){let r=n?Br:t.emitsCache,i=r.get(e);if(i!==void 0)return i;let a=e.emits,o={},c=!1;if(!h(e)){let r=e=>{let n=Vr(e,t,!0);n&&(c=!0,s(o,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return!a&&!c?(v(e)&&r.set(e,null),null):(d(a)?a.forEach(e=>o[e]=null):s(o,a),v(e)&&r.set(e,o),o)}function Hr(e,t){return!e||!a(t)?!1:(t=t.slice(2),t=t===`Once`?t:t.replace(/Once$/,``),u(e,t[0].toLowerCase()+t.slice(1))||u(e,E(t))||u(e,t))}function Ur(e){let{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[a],slots:s,attrs:c,emit:l,render:u,renderCache:d,props:f,data:p,setupState:m,ctx:h,inheritAttrs:g}=e,_=wn(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=Ui(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=Ui(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:Gr(c)}}catch(t){ki.length=0,an(t,e,1),v=zi(K)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=Kr(y,a)),b=Hi(b,y,!1,!0))}return n.dirs&&(b=Hi(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&Vn(Ln(b.type)&&Bn(b)||b,n.transition),v=b,wn(_),v}function Wr(e,t=!0){let n;for(let t=0;t<e.length;t++){let r=e[t];if(Fi(r)){if(r.type!==K||r.children===`v-if`){if(n)return;n=r}}else return}return n}var Gr=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||={})[n]=e[n]);return t},Kr=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function qr(e,t,n){let{props:r,children:i,component:a}=e,{props:o,children:s,patchFlag:c}=t,l=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Jr(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;t<e.length;t++){let n=e[t];if(Yr(o,r,n)&&!Hr(l,n))return!0}}}else return(i||s)&&(!s||!s.$stable)?!0:r===o?!1:r?!o||Jr(r,o,l):!!o;return!1}function Jr(e,t,n){let r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let i=0;i<r.length;i++){let a=r[i];if(!u(e,a)||Yr(t,e,a)&&!Hr(n,a))return!0}return!1}function Yr(e,t,n){let r=e[n],i=t[n];return n===`style`&&v(r)&&v(i)?!xe(r,i):r!==i}function Xr({vnode:e,parent:t,suspense:n},r){for(;t;){let n=t.subTree;if(n.suspense&&n.suspense.activeBranch===e&&(n.suspense.vnode.el=n.el=r,e=n),n===e)(e=t.vnode).el=r,t=t.parent;else break}n&&n.activeBranch===e&&(n.vnode.el=r)}var Zr={},Qr=()=>Object.create(Zr),$r=e=>Object.getPrototypeOf(e)===Zr;function ei(e,t,n,r=!1){let i={},a=Qr();e.propsDefaults=Object.create(null),ni(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);e.props=n?r?i:Ft(i):e.type.props?i:a,e.attrs=a}function ti(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=I(i),[c]=e.propsOptions,l=!1;if((r||o>0)&&!(o&16)){if(o&8){let n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let o=n[r];if(Hr(e.emitsOptions,o))continue;let d=t[o];if(c){if(u(a,o))d!==a[o]&&(a[o]=d,l=!0);else{let t=T(o);i[t]=ri(c,s,t,d,e,!1)}}else d!==a[o]&&(a[o]=d,l=!0)}}}else{ni(e,t,i,a)&&(l=!0);let r;for(let a in s)(!t||!u(t,a)&&((r=E(a))===a||!u(t,r)))&&(c?n&&(n[a]!==void 0||n[r]!==void 0)&&(i[a]=ri(c,s,a,void 0,e,!0)):delete i[a]);if(a!==s)for(let e in a)(!t||!u(t,e))&&(delete a[e],l=!0)}l&&$e(e.attrs,`set`,``)}function ni(e,n,r,i){let[a,o]=e.propsOptions,s=!1,c;if(n)for(let t in n){if(ee(t))continue;let l=n[t],d;a&&u(a,d=T(t))?!o||!o.includes(d)?r[d]=l:(c||={})[d]=l:Hr(e.emitsOptions,t)||(!(t in i)||l!==i[t])&&(i[t]=l,s=!0)}if(o){let n=I(r),i=c||t;for(let t=0;t<o.length;t++){let s=o[t];r[s]=ri(a,n,s,i[s],e,!u(i,s))}}return s}function ri(e,t,n,r,i,a){let o=e[n];if(o!=null){let e=u(o,`default`);if(e&&r===void 0){let e=o.default;if(o.type!==Function&&!o.skipFactory&&h(e)){let{propsDefaults:a}=i;if(n in a)r=a[n];else{let o=ta(i);r=a[n]=e.call(null,t),o()}}else r=e;i.ce&&i.ce._setProp(n,r)}o[0]&&(a&&!e?r=!1:o[1]&&(r===``||r===E(n))&&(r=!0))}return r}var ii=new WeakMap;function ai(e,r,i=!1){let a=i?ii:r.propsCache,o=a.get(e);if(o)return o;let c=e.props,l={},f=[],p=!1;if(!h(e)){let t=e=>{p=!0;let[t,n]=ai(e,r,!0);s(l,t),n&&f.push(...n)};!i&&r.mixins.length&&r.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!c&&!p)return v(e)&&a.set(e,n),n;if(d(c))for(let e=0;e<c.length;e++){let n=T(c[e]);oi(n)&&(l[n]=t)}else if(c)for(let e in c){let t=T(e);if(oi(t)){let n=c[e],r=l[t]=d(n)||h(n)?{type:n}:s({},n),i=r.type,a=!1,o=!0;if(d(i))for(let e=0;e<i.length;++e){let t=i[e],n=h(t)&&t.name;if(n===`Boolean`){a=!0;break}n===`String`&&(o=!1)}else a=h(i)&&i.name===`Boolean`;r[0]=a,r[1]=o,(a||u(r,`default`))&&f.push(t)}}let m=[l,f];return v(e)&&a.set(e,m),m}function oi(e){return e[0]!==`$`&&!ee(e)}var si=e=>e===`_`||e===`_ctx`||e===`$stable`,ci=e=>d(e)?e.map(Ui):[Ui(e)],li=(e,t,n)=>{if(t._n)return t;let r=Tn((...e)=>ci(t(...e)),n);return r._c=!1,r},ui=(e,t,n)=>{let r=e._ctx;for(let n in e){if(si(n))continue;let i=e[n];if(h(i))t[n]=li(n,i,r);else if(i!=null){let e=ci(i);t[n]=()=>e}}},di=(e,t)=>{let n=ci(t);e.slots.default=()=>n},fi=(e,t,n)=>{for(let r in t)(n||!si(r))&&(e[r]=t[r])},pi=(e,t,n)=>{let r=e.slots=Qr();if(e.vnode.shapeFlag&32){let e=t._;e?(fi(r,t,n),n&&O(r,`_`,e,!0)):ui(t,r)}else t&&di(e,t)},mi=(e,n,r)=>{let{vnode:i,slots:a}=e,o=!0,s=t;if(i.shapeFlag&32){let e=n._;e?r&&e===1?o=!1:fi(a,n,r):(o=!n.$stable,ui(n,a)),s=n}else n&&(di(e,n),s={default:1});if(o)for(let e in a)!si(e)&&s[e]==null&&delete a[e]},W=Ei;function hi(e){return gi(e)}function gi(e,i){let a=le();a.__VUE__=!0;let{insert:o,remove:s,patchProp:c,createElement:l,createText:u,createComment:d,setText:f,setElementText:p,parentNode:m,nextSibling:h,setScopeId:g=r,insertStaticContent:_}=e,v=(e,t,r,i=null,a=null,o=null,s=void 0,c=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!Ii(e,t)&&(i=ye(e),k(e,a,o,!0),e=null),t.patchFlag===-2&&(l=!1,t.dynamicChildren=null),t.dynamicChildren&&e&&e.dynamicChildren&&e.dynamicChildren.hasOnce&&(t.dynamicChildren===n&&(t.dynamicChildren=[]),t.dynamicChildren.hasOnce=!0);let{type:u,ref:d,shapeFlag:f}=t;switch(u){case Di:y(e,t,r,i);break;case K:b(e,t,r,i);break;case Oi:e??x(t,r,i,s);break;case G:ae(e,t,r,i,a,o,s,c,l);break;default:f&1?w(e,t,r,i,a,o,s,c,l):f&6?D(e,t,r,i,a,o,s,c,l):(f&64||f&128)&&u.process(e,t,r,i,a,o,s,c,l,xe)}d!=null&&a?qn(d,e&&e.ref,o,t||e,!t):d==null&&e&&e.ref!=null&&qn(e.ref,null,o,e,!0)},y=(e,t,n,r)=>{if(e==null)o(t.el=u(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},b=(e,t,n,r)=>{e==null?o(t.el=d(t.children||``),n,r):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},S=({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=h(e),o(e,n,r),e=i;o(t,n,r)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)},w=(e,t,n,r,i,a,o,s,c)=>{if(t.type===`svg`?o=`svg`:t.type===`math`&&(o=`mathml`),e==null)te(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),re(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},te=(e,t,n,r,i,a,s,u)=>{let d,f,{props:m,shapeFlag:h,transition:g,dirs:_}=e;if(d=e.el=l(e.type,a,m&&m.is,m),h&8?p(d,e.children):h&16&&T(e.children,d,null,r,i,_i(e,a),s,u),_&&Dn(e,null,r,`created`),ne(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!ee(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&qi(f,r,e)}_&&Dn(e,null,r,`beforeMount`);let v=yi(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&W(()=>{try{f&&qi(f,r,e),v&&g.enter(d),_&&Dn(e,null,r,`mounted`)}finally{}},i)},ne=(e,t,n,r,i)=>{if(n&&g(e,n),r)for(let t=0;t<r.length;t++)g(e,r[t]);if(i){let n=i.subTree;if(t===n||Ti(n.type)&&(n.ssContent===t||n.ssFallback===t)){let t=i.vnode;ne(e,t,t.scopeId,t.slotScopeIds,i.parent)}}},T=(e,t,n,r,i,a,o,s,c=0)=>{for(let l=c;l<e.length;l++){let c=e[l]=s?Wi(e[l]):Ui(e[l]);v(null,c,t,n,r,i,a,o,s)}},re=(e,n,r,i,a,o,s)=>{let l=n.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:f}=n;u|=e.patchFlag&16;let m=e.props||t,h=n.props||t,g;if(r&&vi(r,!1),(g=h.onVnodeBeforeUpdate)&&qi(g,r,n,e),f&&Dn(n,e,r,`beforeUpdate`),r&&vi(r,!0),d&&(!e.dynamicChildren||e.dynamicChildren.length!==d.length)&&(u=0,s=!1,d=null),(m.innerHTML&&h.innerHTML==null||m.textContent&&h.textContent==null)&&p(l,``),d?E(e.dynamicChildren,d,l,r,i,_i(n,a),o):s||de(e,n,l,null,r,i,_i(n,a),o,!1),u>0){if(u&16)ie(l,m,h,r,a);else if(u&2&&m.class!==h.class&&c(l,`class`,null,h.class,a),u&4&&c(l,`style`,m.style,h.style,a),u&8){let e=n.dynamicProps;for(let t=0;t<e.length;t++){let n=e[t],i=m[n],o=h[n];(o!==i||n===`value`)&&c(l,n,i,o,a,r)}}u&1&&e.children!==n.children&&p(l,n.children)}else!s&&d==null&&ie(l,m,h,r,a);((g=h.onVnodeUpdated)||f)&&W(()=>{g&&qi(g,r,n,e),f&&Dn(n,e,r,`updated`)},i)},E=(e,t,n,r,i,a,o)=>{for(let s=0;s<t.length;s++){let c=e[s],l=t[s],u=c.el||wi(c),d=u&&(c.type===G||!Ii(c,l)||c.shapeFlag&198)?m(u):n;v(c,l,d,null,r,i,a,o,!0)}},ie=(e,n,r,i,a)=>{if(n!==r){if(n!==t)for(let t in n)!ee(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(ee(t))continue;let o=r[t],s=n[t];o!==s&&t!==`value`&&c(e,t,s,o,a,i)}`value`in r&&c(e,`value`,n.value,r.value,a)}},ae=(e,t,n,r,i,a,s,c,l)=>{let d=t.el=e?e.el:u(``),f=t.anchor=e?e.anchor:u(``),{patchFlag:p,dynamicChildren:m,slotScopeIds:h}=t;h&&(c=c?c.concat(h):h),e==null?(o(d,n,r),o(f,n,r),T(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(E(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&bi(e,t,!0)):de(e,t,n,f,i,a,s,c,l)},D=(e,t,n,r,i,a,o,s,c)=>{t.slotScopeIds=s,e==null?t.shapeFlag&512?i.ctx.activate(t,n,r,o,c):O(t,n,r,i,a,o,c):se(e,t,c)},O=(e,t,n,r,i,a,o)=>{let s=e.component=Zi(e,r,i);if(Xn(e)&&(s.ctx.renderer=xe),aa(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,ce,o,a),!e.el){let r=s.subTree=zi(K);b(null,r,t,n),e.placeholder=r.el}}else ce(s,e,t,n,i,a,o)},se=(e,t,n)=>{let r=t.component=e.component;if(qr(e,t,n)){if(r.asyncDep&&!r.asyncResolved){t.el=e.el,t.placeholder=e.placeholder,ue(r,t,n);return}r.next=t,r.update()}else t.el=e.el,t.placeholder=e.placeholder,r.vnode=t},ce=(e,t,n,r,i,a,o)=>{let s=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{let n=Si(e);if(n){t&&(t.el=c.el,ue(e,t,o)),n.asyncDep.then(()=>{W(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;vi(e,!1),t?(t.el=c.el,ue(e,t,o)):t=c,n&&oe(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&qi(d,s,t,c),vi(e,!0);let f=Ur(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),ye(p),e,i,a),t.el=f.el,u===null&&Xr(e,f.el),r&&W(r,i),(d=t.props&&t.props.onVnodeUpdated)&&W(()=>qi(d,s,t,c),i)}else{let o,{el:s,props:c}=t,{bm:l,m:u,parent:d,root:f,type:p}=e,m=Yn(t);if(vi(e,!1),l&&oe(l),!m&&(o=c&&c.onVnodeBeforeMount)&&qi(o,d,t),vi(e,!0),s&&A){let t=()=>{e.subTree=Ur(e),A(s,e.subTree,e,i,null)};m&&p.__asyncHydrate?p.__asyncHydrate(s,e,t):t()}else{f.ce&&f.ce._hasShadowRoot()&&f.ce._injectChildStyle(p,e.parent?e.parent.type:void 0);let o=e.subTree=Ur(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&W(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;W(()=>qi(o,d,e),i)}(t.shapeFlag&256||d&&Yn(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&W(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new Oe(s);e.scope.off();let l=e.update=c.run.bind(c),u=e.job=c.runIfDirty.bind(c);u.i=e,u.id=e.uid,c.scheduler=()=>mn(u),vi(e,!0),l()},ue=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,ti(e,t.props,r,n),mi(e,t.children,n),He(),_n(e),Ue()},de=(e,t,n,r,i,a,o,s,c=!1)=>{let l=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:m}=t;if(f>0){if(f&128){pe(l,d,n,r,i,a,o,s,c);return}if(f&256){fe(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&ve(l,i,a),d!==l&&p(n,d)):u&16?m&16?pe(l,d,n,r,i,a,o,s,c):ve(l,i,a,!0):(u&8&&p(n,``),m&16&&T(d,n,r,i,a,o,s,c))},fe=(e,t,r,i,a,o,s,c,l)=>{e||=n,t||=n;let u=e.length,d=t.length,f=Math.min(u,d),p=0;for(;p<f;p++){let n=t[p]=l?Wi(t[p]):Ui(t[p]);v(e[p],n,r,null,a,o,s,c,l)}u>d?ve(e,a,o,!0,!1,f):T(t,r,i,a,o,s,c,l,f)},pe=(e,t,r,i,a,o,s,c,l)=>{let u=0,d=t.length,f=e.length-1,p=d-1;for(;u<=f&&u<=p;){let n=e[u],i=t[u]=l?Wi(t[u]):Ui(t[u]);if(Ii(n,i))v(n,i,r,null,a,o,s,c,l);else break;u++}for(;u<=f&&u<=p;){let n=e[f],i=t[p]=l?Wi(t[p]):Ui(t[p]);if(Ii(n,i))v(n,i,r,null,a,o,s,c,l);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,n=e<d?t[e].el:i;for(;u<=p;)v(null,t[u]=l?Wi(t[u]):Ui(t[u]),r,n,a,o,s,c,l),u++}}else if(u>p)for(;u<=f;)k(e[u],a,o,!0),u++;else{let m=u,h=u,g=new Map;for(u=h;u<=p;u++){let e=t[u]=l?Wi(t[u]):Ui(t[u]);e.key!=null&&g.set(e.key,u)}let _,y=0,b=p-h+1,x=!1,S=0,C=Array(b);for(u=0;u<b;u++)C[u]=0;for(u=m;u<=f;u++){let n=e[u];if(y>=b){k(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&Ii(n,t[_])){i=_;break}i===void 0?k(n,a,o,!0):(C[i-h]=u+1,i>=S?S=i:x=!0,v(n,t[i],r,null,a,o,s,c,l),y++)}let w=x?xi(C):n;for(_=w.length-1,u=b-1;u>=0;u--){let e=h+u,n=t[e],f=t[e+1],p=e+1<d?f.el||wi(f):i;C[u]===0?v(null,n,r,p,a,o,s,c,l):x&&(_<0||u!==w[_]?me(n,r,p,2):_--)}}},me=(e,t,n,r,i=null)=>{let{el:a,type:c,transition:l,children:u,shapeFlag:d}=e;if(d&6)me(e.component.subTree,t,n,r);else if(d&128)e.suspense.move(t,n,r);else if(d&64)c.move(e,t,n,xe);else if(c===G){o(a,t,n);for(let e=0;e<u.length;e++)me(u[e],t,n,r);o(e.anchor,t,n)}else if(c===Oi)S(e,t,n);else if(r!==2&&d&1&&l){if(r===0)l.persisted&&!a[Rn]?o(a,t,n):(l.beforeEnter(a),o(a,t,n),W(()=>l.enter(a),i));else{let{leave:r,delayLeave:i,afterLeave:c}=l,u=()=>{e.ctx.isUnmounted?s(a):o(a,t,n)},d=()=>{let e=a._isLeaving||!!a[Rn];a._isLeaving&&a[Rn](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}}else o(a,t,n)},k=(e,t,n,r=!1,i=!1)=>{let{type:a,props:o,ref:s,children:c,dynamicChildren:l,shapeFlag:u,patchFlag:d,dirs:f,cacheIndex:p,memo:m}=e;if((d===-2||l&&l.hasOnce)&&(i=!1),s!=null&&(He(),qn(s,null,n,e,!0),Ue()),p!=null&&(!e.ctx||e.ctx===t)&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!Yn(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&qi(_,t,e),u&6)_e(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Dn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,xe,r):l&&!l.hasOnce&&(a!==G||d>0&&d&64)?ve(l,t,n,!1,!0):(a===G&&d&384||!i&&u&16)&&ve(c,t,n),r&&he(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&W(()=>{_&&qi(_,t,e),h&&Dn(e,null,t,`unmounted`),v&&(e.el=null)},n)},he=e=>{let{type:t,el:n,anchor:r,transition:i}=e,a=t===G;if(a&&!i){ge(n,r);return}if(t===Oi){C(e),i&&!i.persisted&&i.afterLeave&&i.afterLeave();return}let o=a?Hn(e):e,c=()=>{a?m(n)&&ge(n,r):s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(o&&o.shapeFlag&1&&i&&!i.persisted){let{leave:e,delayLeave:t}=i,n=o.el,r=()=>e(n,c);t?t(n,c,r):r()}else c()},ge=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},_e=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;Ci(c),Ci(l),r&&oe(r),i.stop(),a?(a.flags|=8,k(o,e,t,n)):e.vnode.el&&o&&(o.transition=e.vnode.transition,k(o,e,t,n)),s&&W(s,t),W(()=>{e.isUnmounted=!0},t)},ve=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o<e.length;o++)k(e[o],t,n,r,i)},ye=e=>{if(e.shapeFlag&6)return ye(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[In];return n?h(n):t},be=(e,t,n)=>{bn(()=>{e==null?t._vnode&&k(t._vnode,null,null,!0):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e},e&&t._vnode?void 0:e&&e.component?e.component.uid:Xi())},xe={p:v,um:k,m:me,r:he,mt:O,mc:T,pc:de,pbc:E,n:ye,o:e},Se,A;return i&&([Se,A]=i(xe)),{render:be,hydrate:Se,createApp:Ir(be,Se)}}function _i({type:e,props:t},n){return n===`svg`&&e===`foreignObject`||n===`mathml`&&e===`annotation-xml`&&t&&t.encoding&&t.encoding.includes(`html`)?void 0:n}function vi({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function yi(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function bi(e,t,n=!1){let r=e.children,i=t.children;if(d(r)&&d(i))for(let e=0;e<r.length;e++){let t=r[e],a=i[e];a.shapeFlag&1&&!a.dynamicChildren&&((a.patchFlag<=0||a.patchFlag===32)&&(a=i[e]=Wi(i[e]),a.el=t.el),!n&&a.patchFlag!==-2&&bi(t,a)),a.type===Di&&(a.patchFlag===-1&&(a=i[e]=Wi(a)),a.el=t.el),a.type===K&&!a.el&&(a.el=t.el)}}function xi(e){let t=e.slice(),n=[0],r,i,a,o,s,c=e.length;for(r=0;r<c;r++){let c=e[r];if(c!==0){if(i=n[n.length-1],e[i]<c){t[r]=i,n.push(r);continue}for(a=0,o=n.length-1;a<o;)s=a+o>>1,e[n[s]]<c?a=s+1:o=s;c<e[n[a]]&&(a>0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,o=n[a-1];a-->0;)n[a]=o,o=t[o];return n}function Si(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Si(t)}function Ci(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function wi(e){if(e.placeholder)return e.placeholder;let t=e.component;return t?wi(t.subTree):null}var Ti=e=>e.__isSuspense;function Ei(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):gn(e)}var G=Symbol.for(`v-fgt`),Di=Symbol.for(`v-txt`),K=Symbol.for(`v-cmt`),Oi=Symbol.for(`v-stc`),ki=[],q=null;function J(e=!1){ki.push(q=e?null:[])}function Ai(){ki.pop(),q=ki[ki.length-1]||null}var ji=1;function Mi(e,t=!1){ji+=e,e<0&&q&&t&&(q.hasOnce=!0)}function Ni(e){return e.dynamicChildren=ji>0?q||n:null,Ai(),ji>0&&q&&q.push(e),e}function Y(e,t,n,r,i,a){return Ni(X(e,t,n,r,i,a,!0))}function Pi(e,t,n,r,i){return Ni(zi(e,t,n,r,i,!0))}function Fi(e){return e?e.__v_isVNode===!0:!1}function Ii(e,t){return e.type===t.type&&e.key===t.key}var Li=({key:e})=>e??null,Ri=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:g(e)||R(e)||h(e)?{i:H,r:e,k:t,f:!!n}:e);function X(e,t=null,n=null,r=0,i=null,a=e===G?0:1,o=!1,s=!1){let c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Li(t),ref:t&&Ri(t),scopeId:Cn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:H};return s?(Gi(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=g(n)?8:16),ji>0&&!o&&q&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&q.push(c),c}var zi=Bi;function Bi(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===pr)&&(e=K),Fi(e)){let r=Hi(e,t,!0);return n&&Gi(r,n),ji>0&&!a&&q&&(r.shapeFlag&6?q[q.indexOf(e)]=r:q.push(r)),r.patchFlag=-2,r}if(fa(e)&&(e=e.__vccOpts),t){t=Vi(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=k(e)),v(n)&&(Bt(n)&&!d(n)&&(n=s({},n)),t.style=ue(n))}let o=g(e)?1:Ti(e)?128:Ln(e)?64:v(e)?4:h(e)?2:0;return X(e,t,n,r,i,o,a,!0)}function Vi(e){return e?Bt(e)||$r(e)?s({},e):e:null}function Hi(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?Ki(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Li(l),ref:t&&t.ref?n&&a?d(a)?a.concat(Ri(t)):[a,Ri(t)]:Ri(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==G?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Hi(e.ssContent),ssFallback:e.ssFallback&&Hi(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return c&&r&&Vn(u,c.clone(u)),u}function Z(e=` `,t=0){return zi(Di,null,e,t)}function Q(e=``,t=!1){return t?(J(),Pi(K,null,e)):zi(K,null,e)}function Ui(e){return e==null||typeof e==`boolean`?zi(K):d(e)?zi(G,null,e.slice()):Fi(e)?Wi(e):zi(Di,null,String(e))}function Wi(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Hi(e)}function Gi(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(d(t))n=16;else if(typeof t==`object`){if(r&65){let n=t.default;n&&(n._c&&(n._d=!1),Gi(e,n()),n._c&&(n._d=!0));return}{n=32;let r=t._;!r&&!$r(t)?t._ctx=H:r===3&&H&&(H.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}}else if(h(t)){if(r&65){Gi(e,{default:t});return}t={default:t,_ctx:H},n=32}else t=String(t),r&64?(n=16,t=[Z(t)]):n=8;e.children=t,e.shapeFlag|=n}function Ki(...e){let t={};for(let n=0;n<e.length;n++){let r=e[n];for(let e in r)if(e===`class`)t.class!==r.class&&(t.class=k([t.class,r.class]));else if(e===`style`)t.style=ue([t.style,r.style]);else if(a(e)){let n=t[e],i=r[e];i&&n!==i&&!(d(n)&&n.includes(i))?t[e]=n?[].concat(n,i):i:i==null&&n==null&&!o(e)&&(t[e]=i)}else e!==``&&(t[e]=r[e])}return t}function qi(e,t,n,r=null){z(e,t,7,[n,r])}var Ji=Pr(),Yi=0;function Xi(){return Yi}function Zi(e,n,r){let i=e.type,a=(n?n.appContext:e.appContext)||Ji,o={uid:Yi++,vnode:e,type:i,parent:n,appContext:a,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Te(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:n?n.provides:Object.create(a.provides),ids:n?n.ids:[``,0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ai(i,a),emitsOptions:Vr(i,a),emit:null,emitted:null,propsDefaults:t,inheritAttrs:i.inheritAttrs,ctx:t,data:t,props:t,attrs:t,slots:t,refs:t,setupState:t,setupContext:null,suspense:r,suspenseId:r?r.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return o.ctx={_:o},o.root=n?n.root:o,o.emit=zr.bind(null,o),e.ce&&e.ce(o),o}var $=null,Qi=()=>$||H,$i,ea;{let e=le(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};$i=t(`__VUE_INSTANCE_SETTERS__`,e=>$=e),ea=t(`__VUE_SSR_SETTERS__`,e=>ia=e)}var ta=e=>{let t=$;return $i(e),e.scope.on(),()=>{e.scope.off(),$i(t)}},na=()=>{$&&$.scope.off(),$i(null)};function ra(e){return e.vnode.shapeFlag&4}var ia=!1;function aa(e,t=!1,n=!1){t&&ea(t);let{props:r,children:i}=e.vnode,a=ra(e);ei(e,r,a,t),pi(e,i,n||t);let o=a?oa(e,t):void 0;return t&&ea(!1),o}function oa(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,vr);let{setup:r}=n;if(r){He();let n=e.setupContext=r.length>1?ua(e):null,i=ta(e),a=rn(r,e,0,[e.props,n]),o=y(a);if(Ue(),i(),(o||e.sp)&&!Yn(e)&&Wn(e),o){if(a.then(na,na),t)return a.then(n=>{ea(!0);try{sa(e,n,t)}finally{ea(!1)}}).catch(t=>{an(t,e,0)});e.asyncDep=a}else sa(e,a,t)}else ca(e,t)}function sa(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=Jt(t)),ca(e,n)}function ca(e,t,n){let i=e.type;e.render||=i.render||r;{let t=ta(e);He();try{xr(e)}finally{Ue(),t()}}}var la={get(e,t){return P(e,`get`,``),e[t]}};function ua(e){return{attrs:new Proxy(e.attrs,la),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function da(e){return e.exposed?e.exposeProxy||=new Proxy(Jt(Vt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in gr)return gr[n](e)},has(e,t){return t in e||t in gr}}):e.proxy}function fa(e){return h(e)&&`__vccOpts`in e}var pa=(e,t)=>Xt(e,t,ia),ma=`3.5.44`,ha=void 0,ga=typeof window<`u`&&window.trustedTypes;if(ga)try{ha=ga.createPolicy(`vue`,{createHTML:e=>e})}catch{}var _a=ha?e=>ha.createHTML(e):e=>e,va=`http://www.w3.org/2000/svg`,ya=`http://www.w3.org/1998/Math/MathML`,ba=typeof document<`u`?document:null,xa=ba&&ba.createElement(`template`),Sa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?ba.createElementNS(va,e):t===`mathml`?ba.createElementNS(ya,e):n?ba.createElement(e,{is:n}):ba.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>ba.createTextNode(e),createComment:e=>ba.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ba.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==a&&(i=i.nextSibling););else{xa.innerHTML=_a(r===`svg`?`<svg>${e}</svg>`:r===`mathml`?`<math>${e}</math>`:e);let i=xa.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ca=Symbol(`_vtc`);function wa(e,t,n){let r=e[Ca];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var Ta=Symbol(`_vod`),Ea=Symbol(`_vsh`),Da=Symbol(``),Oa=/(?:^|;)\s*display\s*:/;function ka(e,t,n){let r=e.style,i=g(n),a=!1;if(n&&!i){if(t){if(g(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??ja(r,t,``)}else for(let e in t)n[e]??ja(r,e,``)}for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?ja(r,i,``):Fa(e,i,!g(t)&&t?t[i]:void 0,o)||ja(r,i,o)}}else if(i){if(t!==n){let e=r[Da];e&&(n+=`;`+e),r.cssText=n,a=Oa.test(n)}}else t&&e.removeAttribute(`style`);Ta in e&&((!i||t!==n)&&(e[Ta]=a?r.display:``),e[Ea]&&(r.display=`none`))}var Aa=/\s*!important$/;function ja(e,t,n){if(d(n))n.forEach(n=>ja(e,t,n));else if(n??=``,t.startsWith(`--`))Aa.test(n)?e.setProperty(t,n.replace(Aa,``),`important`):e.setProperty(t,n);else{let r=Pa(e,t);Aa.test(n)?e.setProperty(E(r),n.replace(Aa,``),`important`):e[r]=n}}var Ma=[`Webkit`,`Moz`,`ms`],Na={};function Pa(e,t){let n=Na[t];if(n)return n;let r=T(t);if(r!==`filter`&&r in e)return Na[t]=r;r=ie(r);for(let n=0;n<Ma.length;n++){let i=Ma[n]+r;if(i in e)return Na[t]=i}return t}function Fa(e,t,n,r){return e.tagName===`TEXTAREA`&&(t===`width`||t===`height`)&&g(r)&&n===r}var Ia=`http://www.w3.org/1999/xlink`;function La(e,t,n,r,i,a=he(t)){r&&t.startsWith(`xlink:`)?n==null?e.removeAttributeNS(Ia,t.slice(6,t.length)):e.setAttributeNS(Ia,t,n):n==null||a&&!ge(n)?e.removeAttribute(t):e.setAttribute(t,a?``:_(n)?String(n):n)}function Ra(e,t,n,r,i){if(t===`innerHTML`||t===`textContent`){n!=null&&(e[t]=t===`innerHTML`?_a(n):n);return}let a=e.tagName;if(t===`value`&&a!==`PROGRESS`&&!a.includes(`-`)){let r=a===`OPTION`?e.getAttribute(`value`)||``:e.value,i=n==null?e.type===`checkbox`?`on`:``:String(n);(r!==i||!(`_value`in e))&&(e.value=i),n??e.removeAttribute(t),e._value=n;return}let o=!1;if(n===``||n==null){let r=typeof e[t];r===`boolean`?n=ge(n):n==null&&r===`string`?(n=``,o=!0):r===`number`&&(n=0,o=!0)}try{e[t]=n}catch{}o&&e.removeAttribute(i||t)}function za(e,t,n,r){e.addEventListener(t,n,r)}function Ba(e,t,n,r){e.removeEventListener(t,n,r)}var Va=Symbol(`_vei`);function Ha(e,t,n,r,i=null){let a=e[Va]||(e[Va]={}),o=a[t];if(r&&o)o.value=r;else{let[n,s]=Ga(t);r?za(e,n,a[t]=Ya(r,i),s):o&&(Ba(e,n,o,s),a[t]=void 0)}}var Ua=/(Once|Passive|Capture)$/,Wa=/^on:?(?:Once|Passive|Capture)$/;function Ga(e){let t,n;for(;(n=e.match(Ua))&&!Wa.test(e);)t||={},e=e.slice(0,e.length-n[1].length),t[n[1].toLowerCase()]=!0;return[e[2]===`:`?e.slice(3):E(e.slice(2)),t]}var Ka=0,qa=Promise.resolve(),Ja=()=>Ka||=(qa.then(()=>Ka=0),Date.now());function Ya(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;let r=n.value;if(d(r)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let i=r.slice(),a=[e];for(let n=0;n<i.length&&!e._stopped;n++){let e=i[n];e&&z(e,t,5,a)}}else z(r,t,5,[e])};return n.value=e,n.attached=Ja(),n}var Xa=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Za=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?wa(e,r,c):t===`style`?ka(e,n,r):a(t)?o(t)||Ha(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),1):t[0]===`^`?(t=t.slice(1),0):Qa(e,t,r,c))?(Ra(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&La(e,t,r,c,s,t!==`value`)):e._isVueCE&&($a(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?Ra(e,T(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),La(e,t,r,c))};function Qa(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&Xa(t)&&h(n));if(t===`spellcheck`||t===`draggable`||t===`translate`||t===`autocorrect`||t===`sandbox`&&e.tagName===`IFRAME`||t===`form`||t===`list`&&e.tagName===`INPUT`||t===`type`&&e.tagName===`TEXTAREA`)return!1;if(t===`width`||t===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return Xa(t)&&g(n)?!1:t in e}function $a(e,t){let n=e._def.props;if(!n)return!1;let r=T(t);return Array.isArray(n)?n.some(e=>T(e)===r):Object.keys(n).some(e=>T(e)===r)}var eo=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return d(t)?e=>oe(t,e):t};function to(e){e.target.composing=!0}function no(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var ro=Symbol(`_assign`),io=Symbol(`_initialValue`);function ao(e,t,n){return t&&(e=e.trim()),n&&(e=se(e)),e}var oo={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e.parentNode&&(e.type===`text`?e[io]=e.defaultValue.replace(/[\r\n]/g,``):e.type===`textarea`&&(e[io]=e.defaultValue.replace(/\r\n?/g,`
2
+ `))),e[ro]=eo(i);let a=r||i.props&&i.props.type===`number`;za(e,t?`change`:`input`,t=>{t.target.composing||e[ro](ao(e.value,n,a))}),(n||a)&&za(e,`change`,()=>{e.value=ao(e.value,n,a)}),t||(za(e,`compositionstart`,to),za(e,`compositionend`,no),za(e,`change`,no))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let i=t??``,a=e[io];delete e[io],a!==void 0&&(e.type===`text`||e.type===`textarea`)&&e.value!==a?e[ro](ao(e.value,n,r)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[ro]=eo(o),e.composing)return;let s=(a||e.type===`number`)&&!/^0\d/.test(e.value)?se(e.value):e.value,c=t??``;if(s===c)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&e.type!==`range`&&(r&&t===n||i&&e.value.trim()===c)||(e.value=c)}},so=[`ctrl`,`shift`,`alt`,`meta`],co={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>`button`in e&&e.button!==0,middle:e=>`button`in e&&e.button!==1,right:e=>`button`in e&&e.button!==2,exact:(e,t)=>so.some(n=>e[`${n}Key`]&&!t.includes(n))},lo=(e,t)=>{if(!e)return e;let n=e._withMods||={},r=t.join(`.`);return n[r]||(n[r]=((n,...r)=>{for(let e=0;e<t.length;e++){let r=co[t[e]];if(r&&r(n,t))return}return e(n,...r)}))},uo=s({patchProp:Za},Sa),fo;function po(){return fo||=hi(uo)}var mo=((...e)=>{let t=po().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=go(e);if(!r)return;let i=t._component;!h(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent=``);let a=n(r,!1,ho(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t});function ho(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function go(e){return g(e)?document.querySelector(e):e}var _o=Ut();async function vo(e,t){try{let n=await fetch(e,t);if(n.status===401)_o.value={kind:`session-ended`};else if(n.status===500){let{error:e}=await n.json();_o.value={kind:`registry-unreadable`,message:e.message}}else return n}catch{_o.value={kind:`not-running`}}}function yo(e){return e.state===`ready`?`Jig ${e.jigVersion}`:e.state===`unsupported`?`${e.jigVersion?`Jig ${e.jigVersion}`:`A Jig of unknown version`} — Jig UI needs ${e.minimum} or later. Run jig upgrade in the project.`:e.state===`incompatible`?`Jig ${e.jigVersion} answers in a form this Jig UI does not read. Update Jig UI: npx @fapost/jig-ui@latest.`:e.state===`unreadable`?`Jig could not be read (${e.code}). It is tried again on the next load.`:e.reason===`missing`?`The project directory is not there any more.`:`There is no Jig in the project any more.`}var bo=e=>e?.startsWith(`https://`)?e:void 0,xo={key:0},So={key:1,role:`alert`},Co={key:2},wo={class:`columns`},To=[`aria-labelledby`],Eo=[`id`],Do={key:0},Oo={key:1,class:`goal`},ko={key:2},Ao=[`href`],jo={key:0},Mo=((e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n})(Un({__name:`Board`,props:{id:{}},setup(e){let t=e,n=Ut();ir(async()=>{let e=await vo(`/api/projects/${encodeURIComponent(t.id)}/board`);e&&(n.value=e.status===404?`not-connected`:(await e.json()).board)});let r=e=>e.pullRequest!==null&&!e.paused&&e.gate!==`waiting`&&e.gate!==`changed`&&e.autopilot!==`stopped`;function i(e){if(e.gate===`waiting`)return`Design waits at its gate`;if(e.gate===`changed`)return`Design changed after approval`;if(e.autopilot===`stopped`)return`Autopilot stopped with a question`;if(!e.paused){if(e.pullRequest){let t=e.pullRequest.ci&&e.pullRequest.ci!==`none`?`, CI ${e.pullRequest.ci}`:``;return`Pull request ${e.pullRequest.state??`opened`}${t}`}return e.status===`ready`?`No pull request yet`:e.autopilot===`on`?`On autopilot`:void 0}}return(t,a)=>(J(),Y(G,null,[a[1]||=X(`p`,null,[X(`a`,{href:`#/`},`← All projects`)],-1),X(`h2`,null,A(e.id),1),n.value===void 0?(J(),Y(`p`,xo,`Reading the board…`)):n.value===`not-connected`?(J(),Y(`p`,So,`No connected project is called `+A(e.id)+`.`,1)):n.value.state===`ready`?(J(),Y(G,{key:3},[X(`div`,wo,[(J(!0),Y(G,null,mr(n.value.columns,e=>(J(),Y(`section`,{key:e.id,"aria-labelledby":`column-${e.id}`},[X(`h3`,{id:`column-${e.id}`},A(e.title)+` (`+A(e.cards.length)+`)`,9,Eo),X(`ul`,null,[(J(!0),Y(G,null,mr(e.cards,e=>(J(),Y(`li`,{key:e.id},[X(`strong`,null,A(e.id),1),a[0]||=Z(),e.class?(J(),Y(`span`,Do,A(e.class),1)):Q(``,!0),e.goal?(J(),Y(`p`,Oo,A(e.goal),1)):Q(``,!0),i(e)?(J(),Y(`p`,ko,[Z(A(i(e))+` `,1),e.pullRequest&&r(e)&&Kt(bo)(e.pullRequest.url)?(J(),Y(`a`,{key:0,href:Kt(bo)(e.pullRequest.url),target:`_blank`,rel:`noopener noreferrer`},`Open`,8,Ao)):Q(``,!0)])):Q(``,!0)]))),128))])],8,To))),128))]),n.value.finished>0?(J(),Y(`p`,jo,A(n.value.finished)+` finished `+A(n.value.finished===1?`task is`:`tasks are`)+` not shown.`,1)):Q(``,!0)],64)):(J(),Y(`p`,Co,A(Kt(yo)(n.value)),1))],64))}}),[[`__scopeId`,`data-v-cee70b73`]]),No={key:0},Po={key:1},Fo=[`aria-labelledby`],Io=[`id`],Lo=[`href`],Ro={key:0},zo=[`aria-label`],Bo={key:0},Vo={key:1},Ho=[`href`],Uo={key:2},Wo=[`onClick`],Go=[`aria-invalid`],Ko=[`disabled`],qo={key:0,id:`connect-refusal`,role:`alert`},Jo=Un({__name:`Workspace`,setup(e){let t=Ut(),n=Ut(``),r=Ut(),i=Ut(!1);async function a(){let e=await vo(`/api/workspace`);e&&(t.value=(await e.json()).projects)}async function o(){i.value=!0,r.value=void 0;let e=await vo(`/api/projects`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({path:n.value})});i.value=!1,e&&(e.ok?(n.value=``,await a()):r.value=(await e.json()).error.message)}async function s(e){await vo(`/api/projects/${encodeURIComponent(e)}`,{method:`DELETE`})&&await a()}return ir(a),(e,a)=>(J(),Y(G,null,[t.value===void 0?(J(),Y(`p`,No,`Reading projects…`)):t.value.length===0?(J(),Y(`p`,Po,`No projects yet. Paste the path of a project's main checkout below.`)):(J(!0),Y(G,{key:2},mr(t.value,e=>(J(),Y(`article`,{key:e.id,"aria-labelledby":`project-${e.id}`},[X(`h2`,{id:`project-${e.id}`},A(e.id),9,Io),X(`p`,null,A(Kt(yo)(e)),1),e.state===`ready`?(J(),Y(G,{key:0},[X(`p`,null,[Z(A(e.counts.active)+` active · `+A(e.counts.paused)+` paused · `+A(e.counts.ready)+` ready · `,1),X(`a`,{href:`#/projects/${encodeURIComponent(e.id)}`},`Open board`,8,Lo)]),e.attention.length===0?(J(),Y(`p`,Ro,`Nothing needs you here.`)):(J(),Y(`ul`,{key:1,"aria-label":`What needs you in ${e.id}`},[(J(!0),Y(G,null,mr(e.attention,(e,t)=>(J(),Y(`li`,{key:t},[X(`strong`,null,A(e.title),1),e.subject.id?(J(),Y(`span`,Bo,` — `+A(e.subject.id),1)):Q(``,!0),e.detail?(J(),Y(`span`,Vo,` (`+A(e.detail)+`)`,1)):Q(``,!0),a[1]||=X(`br`,null,null,-1),Z(` `+A(e.todo)+` `,1),Kt(bo)(e.url)?(J(),Y(`a`,{key:2,href:Kt(bo)(e.url),target:`_blank`,rel:`noopener noreferrer`},A(e.kind.startsWith(`pull-request`)?`Open pull request`:`Open link`),9,Ho)):Q(``,!0)]))),128))],8,zo)),e.housekeepingStale?(J(),Y(`p`,Uo,[...a[2]||=[Z(` Pull request facts may be out of date: run `,-1),X(`code`,null,`jig housekeeping`,-1),Z(` in the project. `,-1)]])):Q(``,!0)],64)):Q(``,!0),X(`button`,{type:`button`,onClick:t=>s(e.id)},`Disconnect`,8,Wo)],8,Fo))),128)),X(`form`,{onSubmit:lo(o,[`prevent`])},[a[3]||=X(`label`,{for:`project-path`},`Project path`,-1),En(X(`input`,{id:`project-path`,"onUpdate:modelValue":a[0]||=e=>n.value=e,required:``,placeholder:`/path/to/project`,"aria-invalid":r.value!==void 0,"aria-describedby":`connect-refusal`},null,8,Go),[[oo,n.value]]),X(`button`,{type:`submit`,disabled:i.value},A(i.value?`Connecting…`:`Connect`),9,Ko),r.value?(J(),Y(`p`,qo,A(r.value),1)):Q(``,!0)],32)],64))}}),Yo={key:0,role:`alert`},Xo={key:1,role:`alert`},Zo={key:2,role:`alert`};mo(Un({__name:`App`,setup(e){let t=Ut(),n=Ut(location.hash),r=()=>n.value=location.hash,i=pa(()=>{let e=/^#\/projects\/([^/]+)$/.exec(n.value);try{return e?.[1]?decodeURIComponent(e[1]):void 0}catch{return}});return ir(async()=>{addEventListener(`hashchange`,r);let e=await vo(`/api/instance`);e&&(t.value=(await e.json()).version)}),cr(()=>removeEventListener(`hashchange`,r)),(e,n)=>(J(),Y(`main`,null,[Kt(_o)?.kind===`registry-unreadable`?(J(),Y(`p`,Yo,A(Kt(_o).message),1)):Kt(_o)?.kind===`session-ended`?(J(),Y(`p`,Xo,[...n[0]||=[Z(` This page's session has ended. Run `,-1),X(`code`,null,`npx @fapost/jig-ui`,-1),Z(` again to reopen it. `,-1)]])):Kt(_o)?.kind===`not-running`?(J(),Y(`p`,Zo,[...n[1]||=[Z(`Jig UI is not running. Start it with `,-1),X(`code`,null,`npx @fapost/jig-ui`,-1),Z(`.`,-1)]])):(J(),Y(G,{key:3},[X(`h1`,null,`Jig UI `+A(t.value),1),i.value?(J(),Pi(Mo,{id:i.value,key:i.value},null,8,[`id`])):(J(),Pi(Jo,{key:1}))],64))]))}})).mount(`#app`);
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Jig UI</title>
7
+ <script type="module" crossorigin src="/assets/index-ClfKhY74.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-BNFnIc1J.css">
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ </body>
13
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fapost/jig-ui",
3
- "version": "0.1.0-next.1",
3
+ "version": "0.1.0-next.10",
4
4
  "description": "A local web interface for Jig, the agent SDLC framework.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -21,8 +21,10 @@
21
21
  "url": "git+https://github.com/fapost-lab/jig-ui.git"
22
22
  },
23
23
  "scripts": {
24
- "build": "tsc -p tsconfig.build.json",
25
- "typecheck": "tsc --noEmit",
24
+ "build": "tsc -p tsconfig.build.json && vite build",
25
+ "start": "npm run build && node dist/cli.js",
26
+ "dev": "npm run build && (tsc -p tsconfig.build.json --watch --preserveWatchOutput & vite build --watch & node --watch dist/cli.js --no-open)",
27
+ "typecheck": "tsc --noEmit && vue-tsc --noEmit -p web/tsconfig.json",
26
28
  "test": "vitest run"
27
29
  },
28
30
  "dependencies": {
@@ -31,7 +33,11 @@
31
33
  },
32
34
  "devDependencies": {
33
35
  "@types/node": "^24.19.2",
34
- "typescript": "^7.0.2",
35
- "vitest": "^5.0.4"
36
+ "@vitejs/plugin-vue": "^6.0.10",
37
+ "typescript": "^6.0.3",
38
+ "vite": "^8.3.4",
39
+ "vitest": "^5.0.4",
40
+ "vue": "^3.5.44",
41
+ "vue-tsc": "^3.3.13"
36
42
  }
37
43
  }