orcasynth 1.2.2 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/install/index.js +93 -33
- package/dist/cli/install/systemdUnits.js +1 -1
- package/dist/cli/installInfo.js +15 -0
- package/dist/cli/menu.js +66 -0
- package/dist/cli/systemd.js +24 -0
- package/dist/cli/update.js +30 -1
- package/package.json +1 -1
- package/web-dist/.next/BUILD_ID +1 -1
- package/web-dist/.next/build-manifest.json +3 -3
- package/web-dist/.next/server/app/_global-error.html +1 -1
- package/web-dist/.next/server/app/_global-error.rsc +1 -1
- package/web-dist/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/_not-found.html +1 -1
- package/web-dist/.next/server/app/_not-found.rsc +1 -1
- package/web-dist/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web-dist/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/account.html +1 -1
- package/web-dist/.next/server/app/account.rsc +1 -1
- package/web-dist/.next/server/app/account.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/account.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/account.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/account.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/account.segments/account/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/account.segments/account.segment.rsc +1 -1
- package/web-dist/.next/server/app/dash.html +1 -1
- package/web-dist/.next/server/app/dash.rsc +1 -1
- package/web-dist/.next/server/app/dash.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/dash.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/dash.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/dash.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/dash.segments/dash/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/dash.segments/dash.segment.rsc +1 -1
- package/web-dist/.next/server/app/escalations.html +1 -1
- package/web-dist/.next/server/app/escalations.rsc +1 -1
- package/web-dist/.next/server/app/escalations.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/escalations.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/escalations.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/escalations.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/escalations.segments/escalations/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/escalations.segments/escalations.segment.rsc +1 -1
- package/web-dist/.next/server/app/index.html +1 -1
- package/web-dist/.next/server/app/index.rsc +1 -1
- package/web-dist/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/kanban.html +1 -1
- package/web-dist/.next/server/app/kanban.rsc +1 -1
- package/web-dist/.next/server/app/kanban.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/kanban.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/kanban.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/kanban.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/kanban.segments/kanban/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/kanban.segments/kanban.segment.rsc +1 -1
- package/web-dist/.next/server/app/onboarding.html +1 -1
- package/web-dist/.next/server/app/onboarding.rsc +1 -1
- package/web-dist/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
- package/web-dist/.next/server/app/projects.html +1 -1
- package/web-dist/.next/server/app/projects.rsc +1 -1
- package/web-dist/.next/server/app/projects.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/projects.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/projects.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/projects.segments/projects.segment.rsc +1 -1
- package/web-dist/.next/server/app/sessions.html +1 -1
- package/web-dist/.next/server/app/sessions.rsc +1 -1
- package/web-dist/.next/server/app/sessions.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/sessions.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/sessions.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/sessions.segments/sessions/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/sessions.segments/sessions.segment.rsc +1 -1
- package/web-dist/.next/server/app/settings.html +1 -1
- package/web-dist/.next/server/app/settings.rsc +1 -1
- package/web-dist/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/web-dist/.next/server/app/tasks.html +1 -1
- package/web-dist/.next/server/app/tasks.rsc +1 -1
- package/web-dist/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
- package/web-dist/.next/server/app/timeline.html +1 -1
- package/web-dist/.next/server/app/timeline.rsc +1 -1
- package/web-dist/.next/server/app/timeline.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/timeline.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/timeline.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/timeline.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/timeline.segments/timeline/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/timeline.segments/timeline.segment.rsc +1 -1
- package/web-dist/.next/server/app/users.html +1 -1
- package/web-dist/.next/server/app/users.rsc +1 -1
- package/web-dist/.next/server/app/users.segments/_full.segment.rsc +1 -1
- package/web-dist/.next/server/app/users.segments/_head.segment.rsc +1 -1
- package/web-dist/.next/server/app/users.segments/_index.segment.rsc +1 -1
- package/web-dist/.next/server/app/users.segments/_tree.segment.rsc +1 -1
- package/web-dist/.next/server/app/users.segments/users/__PAGE__.segment.rsc +1 -1
- package/web-dist/.next/server/app/users.segments/users.segment.rsc +1 -1
- package/web-dist/.next/server/chunks/[root-of-the-server]__0bvp8h1._.js +1 -1
- package/web-dist/.next/server/chunks/[root-of-the-server]__1dgbigm._.js +1 -1
- package/web-dist/.next/server/chunks/[root-of-the-server]__1wxxtv8._.js +1 -1
- package/web-dist/.next/server/middleware-build-manifest.js +3 -3
- package/web-dist/.next/server/pages/404.html +1 -1
- package/web-dist/.next/server/pages/500.html +1 -1
- /package/web-dist/.next/static/{5UmD3aQxR5MeUIuIvjKvT → -uzOOlExTv_eTD0OFDRq_}/_buildManifest.js +0 -0
- /package/web-dist/.next/static/{5UmD3aQxR5MeUIuIvjKvT → -uzOOlExTv_eTD0OFDRq_}/_clientMiddlewareManifest.js +0 -0
- /package/web-dist/.next/static/{5UmD3aQxR5MeUIuIvjKvT → -uzOOlExTv_eTD0OFDRq_}/_ssgManifest.js +0 -0
|
@@ -9,8 +9,19 @@ import { daemonUnit, webUnit } from './systemdUnits.js';
|
|
|
9
9
|
import { detectProxy, nginxVhost, apacheVhost, certbotCommand } from './proxy.js';
|
|
10
10
|
import { applySetup, buildSetupPlan, isFirstRun } from '../setup.js';
|
|
11
11
|
import { runSetupWizard } from '../setupWizard.js';
|
|
12
|
+
import { INSTALL_INFO_PATH, serializeInstallInfo } from '../installInfo.js';
|
|
12
13
|
const DAEMON_PORT = Number(process.env.ORCA_PORT ?? 4400);
|
|
13
14
|
const WEB_PORT = Number(process.env.ORCA_WEB_PORT ?? 4500);
|
|
15
|
+
/** Canonical public URL for a deployment, given whether TLS actually came up. */
|
|
16
|
+
function publicUrl(d, tlsOk) {
|
|
17
|
+
if (d.mode === 'domain')
|
|
18
|
+
return `${tlsOk ? 'https' : 'http'}://${d.host}`;
|
|
19
|
+
if (d.mode === 'ip')
|
|
20
|
+
return `http://${d.host}:${WEB_PORT}`;
|
|
21
|
+
return `http://localhost:${WEB_PORT}`;
|
|
22
|
+
}
|
|
23
|
+
const localhostDeploy = () => ({ mode: 'localhost', host: 'localhost', domain: null, proxyPreference: 'nginx', tls: false, email: null, webHost: '127.0.0.1' });
|
|
24
|
+
const ipDeploy = (host) => ({ mode: 'ip', host, domain: null, proxyPreference: 'nginx', tls: false, email: null, webHost: '0.0.0.0' });
|
|
14
25
|
// ── package + npm path resolution ────────────────────────────────────────────
|
|
15
26
|
/** Absolute paths into the globally-installed package — this file lives at
|
|
16
27
|
* <pkgRoot>/dist/cli/install/index.js, so the daemon entry and web bundle resolve relative to it. */
|
|
@@ -98,11 +109,11 @@ async function aptInstall(r, ...pkgs) {
|
|
|
98
109
|
await must(r, 'apt-get', ['install', '-y', ...pkgs]);
|
|
99
110
|
}
|
|
100
111
|
/** Write + enable the two systemd units and verify they came active. */
|
|
101
|
-
async function provisionSystemd(r, user, home) {
|
|
112
|
+
async function provisionSystemd(r, user, home, webHost) {
|
|
102
113
|
const { daemonEntry, webServer } = packagePaths();
|
|
103
114
|
const params = {
|
|
104
115
|
user, home, nodePath: process.execPath, daemonEntry, webServer,
|
|
105
|
-
npmGlobalBin: await npmGlobalBin(r), daemonPort: DAEMON_PORT, webPort: WEB_PORT,
|
|
116
|
+
npmGlobalBin: await npmGlobalBin(r), daemonPort: DAEMON_PORT, webPort: WEB_PORT, webHost,
|
|
106
117
|
};
|
|
107
118
|
// Ensure the data tree exists and is owned by the service user before first boot.
|
|
108
119
|
await must(r, 'mkdir', ['-p', join(home, '.config', 'orca', 'logs')]);
|
|
@@ -169,23 +180,24 @@ async function execute(r, plan) {
|
|
|
169
180
|
const { cmd, args } = installCommand({ id, bin: id, pkg: agentPkg(id) });
|
|
170
181
|
await step(`Installing ${id}`, () => must(r, cmd, args));
|
|
171
182
|
}
|
|
172
|
-
await step('Configuring systemd services', () => provisionSystemd(r, plan.user.username, home));
|
|
183
|
+
await step('Configuring systemd services', () => provisionSystemd(r, plan.user.username, home, plan.deploy.webHost));
|
|
173
184
|
const ready = await step('Waiting for the daemon', () => waitForDaemon());
|
|
174
185
|
if (!ready)
|
|
175
186
|
throw new Error('daemon did not become reachable — check: journalctl -u orca-daemon');
|
|
187
|
+
const d = plan.deploy;
|
|
176
188
|
let tlsOk = false;
|
|
177
|
-
if (
|
|
189
|
+
if (d.mode === 'domain' && d.domain) {
|
|
178
190
|
const kind = await step('Configuring reverse proxy', async () => {
|
|
179
|
-
const k = await resolveProxy(r,
|
|
180
|
-
await configureVhost(r, k,
|
|
191
|
+
const k = await resolveProxy(r, d.proxyPreference);
|
|
192
|
+
await configureVhost(r, k, d.domain);
|
|
181
193
|
return k;
|
|
182
194
|
});
|
|
183
195
|
// TLS is the last, optional, most failure-prone step (DNS not pointed yet, rate limits, IPs). A
|
|
184
196
|
// failure here must NOT abort the install — the site already serves over HTTP and the admin still
|
|
185
197
|
// needs creating — so we warn and carry on rather than throwing.
|
|
186
|
-
if (
|
|
198
|
+
if (d.tls) {
|
|
187
199
|
try {
|
|
188
|
-
await step('Requesting HTTPS certificate', () => obtainTls(r, kind,
|
|
200
|
+
await step('Requesting HTTPS certificate', () => obtainTls(r, kind, d.domain, d.email));
|
|
189
201
|
tlsOk = true;
|
|
190
202
|
}
|
|
191
203
|
catch (e) {
|
|
@@ -195,6 +207,10 @@ async function execute(r, plan) {
|
|
|
195
207
|
}
|
|
196
208
|
if (plan.admin)
|
|
197
209
|
await step('Creating admin + verifying login', () => provisionAdmin(plan.admin));
|
|
210
|
+
// Record the deployment so the launcher menu shows the right URL and drives systemd (not a 2nd daemon).
|
|
211
|
+
const info = { publicUrl: publicUrl(d, tlsOk), mode: d.mode, serviceUser: plan.user.username, daemonPort: DAEMON_PORT, webPort: WEB_PORT };
|
|
212
|
+
await must(r, 'mkdir', ['-p', '/etc/orca']);
|
|
213
|
+
await r.writeFile(INSTALL_INFO_PATH, serializeInstallInfo(info));
|
|
198
214
|
return { tls: tlsOk };
|
|
199
215
|
}
|
|
200
216
|
/** npm package for an agent CLI id (so the executor needn't carry the full AgentCli around). */
|
|
@@ -219,7 +235,6 @@ async function planFromArgs(r, args) {
|
|
|
219
235
|
const agents = !agentsRaw || agentsRaw === 'none' ? []
|
|
220
236
|
: agentsRaw === 'all' ? ['claude', 'opencode', 'codex']
|
|
221
237
|
: agentsRaw.split(',').map((s) => s.trim()).filter(Boolean);
|
|
222
|
-
const domain = flag(args, '--domain') ?? null;
|
|
223
238
|
const adminUser = flag(args, '--admin-user');
|
|
224
239
|
const adminPass = flag(args, '--admin-pass');
|
|
225
240
|
const admin = adminUser && adminPass
|
|
@@ -229,14 +244,33 @@ async function planFromArgs(r, args) {
|
|
|
229
244
|
installTmux: !args.includes('--no-tmux'),
|
|
230
245
|
user: { mode: exists ? 'existing' : 'create', username },
|
|
231
246
|
agents,
|
|
232
|
-
|
|
233
|
-
proxyPreference: flag(args, '--proxy') === 'apache' ? 'apache' : 'nginx',
|
|
234
|
-
// No HTTPS for a bare IP — Let's Encrypt refuses it.
|
|
235
|
-
tls: domain !== null && !isIpAddress(domain) && !args.includes('--no-tls'),
|
|
236
|
-
email: flag(args, '--email') ?? null,
|
|
247
|
+
deploy: deploymentFromArgs(args),
|
|
237
248
|
admin,
|
|
238
249
|
};
|
|
239
250
|
}
|
|
251
|
+
/** Resolve the deployment from flags. `--host <ip>` (or `--ip`) ⇒ direct port mode; a real `--domain`
|
|
252
|
+
* ⇒ domain+HTTPS; a `--domain` that is actually an IP is treated as direct port mode (Let's Encrypt
|
|
253
|
+
* can't certify an IP); nothing ⇒ localhost. */
|
|
254
|
+
function deploymentFromArgs(args) {
|
|
255
|
+
const host = flag(args, '--host');
|
|
256
|
+
const domain = flag(args, '--domain');
|
|
257
|
+
if (args.includes('--localhost'))
|
|
258
|
+
return localhostDeploy();
|
|
259
|
+
if (host)
|
|
260
|
+
return ipDeploy(host);
|
|
261
|
+
if (domain && isIpAddress(domain))
|
|
262
|
+
return ipDeploy(domain);
|
|
263
|
+
if (domain) {
|
|
264
|
+
return {
|
|
265
|
+
mode: 'domain', host: domain, domain,
|
|
266
|
+
proxyPreference: flag(args, '--proxy') === 'apache' ? 'apache' : 'nginx',
|
|
267
|
+
tls: !args.includes('--no-tls'),
|
|
268
|
+
email: flag(args, '--email') ?? null,
|
|
269
|
+
webHost: '127.0.0.1',
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
return localhostDeploy();
|
|
273
|
+
}
|
|
240
274
|
// ── interactive front-end ────────────────────────────────────────────────────
|
|
241
275
|
async function chooseServiceUser() {
|
|
242
276
|
const mode = await p.select({
|
|
@@ -272,14 +306,42 @@ async function chooseAgents(r, user) {
|
|
|
272
306
|
return [];
|
|
273
307
|
return pick;
|
|
274
308
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
309
|
+
/** Best-effort public IPv4 of this box, used as the default for the direct-port mode. Prefers the
|
|
310
|
+
* first global address from `hostname -I`; empty string when none can be determined. */
|
|
311
|
+
async function detectPublicIp(r) {
|
|
312
|
+
const res = await r.exec('hostname', ['-I']);
|
|
313
|
+
const first = res.stdout.trim().split(/\s+/).find((ip) => /^\d{1,3}(\.\d{1,3}){3}$/.test(ip) && !ip.startsWith('127.'));
|
|
314
|
+
return first ?? '';
|
|
315
|
+
}
|
|
316
|
+
async function chooseDeployment(r) {
|
|
317
|
+
const mode = await p.select({
|
|
318
|
+
message: 'How will you reach the ORCA web UI?',
|
|
319
|
+
options: [
|
|
320
|
+
{ value: 'domain', label: 'A domain name', hint: 'nginx + free HTTPS (Let’s Encrypt)' },
|
|
321
|
+
{ value: 'ip', label: 'This server’s IP, on a port', hint: `http://<ip>:${WEB_PORT} — no reverse proxy` },
|
|
322
|
+
{ value: 'localhost', label: 'Localhost only', hint: `http://localhost:${WEB_PORT}` },
|
|
323
|
+
],
|
|
279
324
|
});
|
|
325
|
+
bail(mode);
|
|
326
|
+
if (mode === 'localhost')
|
|
327
|
+
return localhostDeploy();
|
|
328
|
+
if (mode === 'ip') {
|
|
329
|
+
const guess = await detectPublicIp(r);
|
|
330
|
+
const host = await p.text({ message: 'Public IP / hostname to advertise', initialValue: guess, validate: (v) => ((v ?? '').trim() ? undefined : 'Required') });
|
|
331
|
+
bail(host);
|
|
332
|
+
p.log.info(`The web UI will listen on 0.0.0.0:${WEB_PORT} — make sure port ${WEB_PORT} is open in any firewall.`);
|
|
333
|
+
return ipDeploy(host.trim());
|
|
334
|
+
}
|
|
335
|
+
// domain
|
|
336
|
+
const domain = await p.text({ message: 'Domain name', placeholder: 'orca.example.com', validate: (v) => {
|
|
337
|
+
const t = (v ?? '').trim();
|
|
338
|
+
if (!t)
|
|
339
|
+
return 'Required';
|
|
340
|
+
if (isIpAddress(t))
|
|
341
|
+
return 'That’s an IP — pick the IP option instead (Let’s Encrypt needs a domain name)';
|
|
342
|
+
return undefined;
|
|
343
|
+
} });
|
|
280
344
|
bail(domain);
|
|
281
|
-
if (!domain.trim())
|
|
282
|
-
return { domain: null, proxyPreference: 'nginx', tls: false, email: null };
|
|
283
345
|
let proxyPreference = 'nginx';
|
|
284
346
|
if (!(await detectProxy(r))) {
|
|
285
347
|
const which = await p.select({
|
|
@@ -289,25 +351,23 @@ async function chooseProxy(r) {
|
|
|
289
351
|
bail(which);
|
|
290
352
|
proxyPreference = which;
|
|
291
353
|
}
|
|
292
|
-
// Let's Encrypt can't certify a bare IP, so don't even offer HTTPS for one — serve over HTTP.
|
|
293
|
-
if (isIpAddress(domain.trim())) {
|
|
294
|
-
p.log.info(`${domain.trim()} is an IP address — serving the UI over HTTP (Let's Encrypt requires a domain name).`);
|
|
295
|
-
return { domain: domain.trim(), proxyPreference, tls: false, email: null };
|
|
296
|
-
}
|
|
297
354
|
const wantTls = await p.confirm({ message: `Obtain a free HTTPS certificate for ${domain.trim()} via Let's Encrypt?` });
|
|
298
355
|
if (p.isCancel(wantTls) || !wantTls)
|
|
299
|
-
return { domain: domain.trim(), proxyPreference, tls: false, email: null };
|
|
356
|
+
return { mode: 'domain', host: domain.trim(), domain: domain.trim(), proxyPreference, tls: false, email: null, webHost: '127.0.0.1' };
|
|
300
357
|
const email = await p.text({ message: 'Email for renewal notices (blank to register without email)', placeholder: 'you@example.com' });
|
|
301
358
|
bail(email);
|
|
302
|
-
return { domain: domain.trim(), proxyPreference, tls: true, email: email.trim() || null };
|
|
359
|
+
return { mode: 'domain', host: domain.trim(), domain: domain.trim(), proxyPreference, tls: true, email: email.trim() || null, webHost: '127.0.0.1' };
|
|
303
360
|
}
|
|
304
361
|
// ── entry point ──────────────────────────────────────────────────────────────
|
|
305
362
|
/** Human recap of what the wizard is about to do — shown for confirmation before anything is touched. */
|
|
306
363
|
function planSummary(plan) {
|
|
307
364
|
const pad = (s) => s.padEnd(9);
|
|
308
|
-
const
|
|
309
|
-
|
|
310
|
-
|
|
365
|
+
const d = plan.deploy;
|
|
366
|
+
const web = d.mode === 'domain'
|
|
367
|
+
? `${d.proxyPreference} → ${d.domain}${d.tls ? ' + HTTPS (Let’s Encrypt)' : ' (HTTP only)'}`
|
|
368
|
+
: d.mode === 'ip'
|
|
369
|
+
? `http://${d.host}:${WEB_PORT} — direct, no reverse proxy`
|
|
370
|
+
: `localhost only — http://localhost:${WEB_PORT}`;
|
|
311
371
|
return [
|
|
312
372
|
`${pad('User')}${plan.user.mode === 'create' ? `create system user "${plan.user.username}"` : `existing user "${plan.user.username}"`}`,
|
|
313
373
|
`${pad('Agents')}${plan.agents.length ? plan.agents.join(', ') : 'none (install later)'}`,
|
|
@@ -345,9 +405,9 @@ export async function install(args = []) {
|
|
|
345
405
|
}
|
|
346
406
|
const user = await chooseServiceUser();
|
|
347
407
|
const agents = await chooseAgents(r, user.username);
|
|
348
|
-
const
|
|
408
|
+
const deploy = await chooseDeployment(r);
|
|
349
409
|
// Admin is created via the shared wizard AFTER the daemon is up, so collect it there instead.
|
|
350
|
-
plan = { installTmux, user, agents,
|
|
410
|
+
plan = { installTmux, user, agents, deploy, admin: null };
|
|
351
411
|
}
|
|
352
412
|
// Recap everything before touching the system — last chance to back out.
|
|
353
413
|
p.note(planSummary(plan), 'Install plan');
|
|
@@ -369,7 +429,7 @@ export async function install(args = []) {
|
|
|
369
429
|
await step('Verifying login', () => loginSmokeTest(creds.username, creds.password));
|
|
370
430
|
}
|
|
371
431
|
}
|
|
372
|
-
const url = plan.
|
|
432
|
+
const url = publicUrl(plan.deploy, tls);
|
|
373
433
|
const summary = [
|
|
374
434
|
`Open ${url}`,
|
|
375
435
|
adminUser ? `Sign in ${adminUser}` : 'Sign in create an admin in the web UI',
|
|
@@ -33,7 +33,7 @@ Wants=orca-daemon.service
|
|
|
33
33
|
Type=simple
|
|
34
34
|
User=${p.user}
|
|
35
35
|
Environment=PORT=${p.webPort}
|
|
36
|
-
Environment=HOSTNAME
|
|
36
|
+
Environment=HOSTNAME=${p.webHost}
|
|
37
37
|
Environment=ORCA_DAEMON_URL=http://127.0.0.1:${p.daemonPort}
|
|
38
38
|
Environment=ORCA_LOG_DIR=${p.home}/.config/orca/logs
|
|
39
39
|
Environment=PATH=${p.npmGlobalBin}:${BASE_PATH}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
/** System-wide so any user invoking `orca` (typically root) can read it, regardless of which user the
|
|
3
|
+
* services run as. */
|
|
4
|
+
export const INSTALL_INFO_PATH = '/etc/orca/install.json';
|
|
5
|
+
export function readInstallInfo(path = INSTALL_INFO_PATH) {
|
|
6
|
+
try {
|
|
7
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function serializeInstallInfo(info) {
|
|
14
|
+
return JSON.stringify(info, null, 2);
|
|
15
|
+
}
|
package/dist/cli/menu.js
CHANGED
|
@@ -4,6 +4,9 @@ import { status } from './launcher.js';
|
|
|
4
4
|
import { defaultLifecycleDeps, formatStatus, runLifecycle } from './commands.js';
|
|
5
5
|
import { isFirstRun } from './setup.js';
|
|
6
6
|
import { runSetupWizard } from './setupWizard.js';
|
|
7
|
+
import { readInstallInfo } from './installInfo.js';
|
|
8
|
+
import { update } from './update.js';
|
|
9
|
+
import { SERVICES, runCmd, systemctl, servicesActive } from './systemd.js';
|
|
7
10
|
const BASE = process.env.ORCA_URL ?? 'http://localhost:4400';
|
|
8
11
|
/** Open a URL in the user's default browser, cross-platform, fire-and-forget. */
|
|
9
12
|
function openUrl(url) {
|
|
@@ -14,8 +17,71 @@ function openUrl(url) {
|
|
|
14
17
|
}
|
|
15
18
|
catch { /* headless box — ignore */ }
|
|
16
19
|
}
|
|
20
|
+
/** Launcher menu for a systemd-provisioned box (`orca install`): drives the units via systemctl and
|
|
21
|
+
* shows the real public URL the operator chose — never spawns a second, port-conflicting daemon. */
|
|
22
|
+
async function systemdMenu(info, version) {
|
|
23
|
+
p.intro(`🐋 orcasynth v${version} · systemd`);
|
|
24
|
+
for (;;) {
|
|
25
|
+
const active = await servicesActive();
|
|
26
|
+
const state = active ? `● orca is running · ${info.publicUrl}` : '○ orca is stopped';
|
|
27
|
+
const action = await p.select({
|
|
28
|
+
message: state,
|
|
29
|
+
options: [
|
|
30
|
+
active ? { value: 'restart', label: 'Restart', hint: 'daemon + web' } : { value: 'start', label: 'Start', hint: 'daemon + web' },
|
|
31
|
+
...(active ? [{ value: 'stop', label: 'Stop' }] : []),
|
|
32
|
+
{ value: 'status', label: 'Status', hint: 'systemctl status' },
|
|
33
|
+
{ value: 'open', label: 'Open web UI', hint: info.publicUrl },
|
|
34
|
+
{ value: 'logs', label: 'Recent daemon logs' },
|
|
35
|
+
{ value: 'update', label: 'Update', hint: 'npm + restart services' },
|
|
36
|
+
{ value: 'exit', label: 'Exit' },
|
|
37
|
+
],
|
|
38
|
+
});
|
|
39
|
+
if (p.isCancel(action) || action === 'exit')
|
|
40
|
+
break;
|
|
41
|
+
if (action === 'open') {
|
|
42
|
+
openUrl(info.publicUrl);
|
|
43
|
+
p.log.success(`Opening ${info.publicUrl}`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (action === 'status') {
|
|
47
|
+
const r = await systemctl('status', '--no-pager', '-n', '0', ...SERVICES);
|
|
48
|
+
p.note(r.stdout.trim() || '(no output)', 'Status');
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (action === 'logs') {
|
|
52
|
+
const r = await runCmd('journalctl', ['-u', 'orca-daemon', '-n', '20', '--no-pager']);
|
|
53
|
+
p.note(r.stdout.trim() || '(no logs — try: journalctl -u orca-daemon)', 'orca-daemon');
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (action === 'update') {
|
|
57
|
+
const s = p.spinner();
|
|
58
|
+
s.start('Checking npm for a newer version…');
|
|
59
|
+
try {
|
|
60
|
+
// Shared updater: self-locating npm --prefix + systemd-aware restart (same path as `orca update`).
|
|
61
|
+
const r = await update(process.env, { current: version });
|
|
62
|
+
s.stop(r.updated ? `Updated ${r.from} → ${r.to} and restarted.` : `Already on the latest version (${r.to}).`);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
s.stop(`Update failed: ${e.message}`);
|
|
66
|
+
}
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
// start | stop | restart
|
|
70
|
+
const s = p.spinner();
|
|
71
|
+
s.start(`${action}…`);
|
|
72
|
+
const r = await systemctl(action, ...SERVICES);
|
|
73
|
+
s.stop(r.code === 0 ? `${action} ✓` : `${action} failed (code ${r.code})`);
|
|
74
|
+
}
|
|
75
|
+
p.outro('See you 🐋');
|
|
76
|
+
}
|
|
17
77
|
/** The interactive launcher menu shown when `orca` is run with no arguments in a terminal. */
|
|
18
78
|
export async function menu(env, version) {
|
|
79
|
+
// A box provisioned by `orca install` is systemd-managed — drive those units, don't spawn our own.
|
|
80
|
+
const info = readInstallInfo();
|
|
81
|
+
if (info) {
|
|
82
|
+
await systemdMenu(info, version);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
19
85
|
const deps = defaultLifecycleDeps(version);
|
|
20
86
|
p.intro(`🐋 orcasynth v${version}`);
|
|
21
87
|
for (;;) {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
/** The two units `orca install` provisions. Shared so the menu and the updater drive the same names. */
|
|
3
|
+
export const SERVICES = ['orca-daemon', 'orca-web'];
|
|
4
|
+
/** Run a command, resolving its exit code + stdout (never rejects). */
|
|
5
|
+
export function runCmd(cmd, args) {
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
execFile(cmd, args, (err, stdout) => {
|
|
8
|
+
const code = err && typeof err.code === 'number' ? err.code : err ? 1 : 0;
|
|
9
|
+
resolve({ code, stdout: stdout?.toString() ?? '' });
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/** systemctl, transparently via sudo when we aren't root (so a non-root operator — e.g. the services'
|
|
14
|
+
* own www-data with passwordless sudo — still manages the units). */
|
|
15
|
+
export function systemctl(...args) {
|
|
16
|
+
const asRoot = typeof process.getuid === 'function' && process.getuid() === 0;
|
|
17
|
+
return asRoot ? runCmd('systemctl', args) : runCmd('sudo', ['systemctl', ...args]);
|
|
18
|
+
}
|
|
19
|
+
/** Whether all ORCA units report active. */
|
|
20
|
+
export async function servicesActive() {
|
|
21
|
+
const r = await systemctl('is-active', ...SERVICES);
|
|
22
|
+
const states = r.stdout.trim().split('\n');
|
|
23
|
+
return states.length > 0 && states.every((s) => s.trim() === 'active');
|
|
24
|
+
}
|
package/dist/cli/update.js
CHANGED
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
import { execFile } from 'node:child_process';
|
|
2
2
|
import { promisify } from 'node:util';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { dirname, basename } from 'node:path';
|
|
3
5
|
import { isNewer } from './version.js';
|
|
4
6
|
import { start, stop } from './launcher.js';
|
|
7
|
+
import { readInstallInfo } from './installInfo.js';
|
|
8
|
+
import { SERVICES, systemctl } from './systemd.js';
|
|
5
9
|
const execFileAsync = promisify(execFile);
|
|
10
|
+
/** The npm `--prefix` this very binary lives under, so `orca update` reinstalls *itself* in place —
|
|
11
|
+
* no matter where it was globally installed (e.g. a www-data-owned prefix), and without the operator
|
|
12
|
+
* having to remember any `--prefix`. Returns null when run from a source checkout (no node_modules in
|
|
13
|
+
* the path), in which case we let npm use its default global prefix. */
|
|
14
|
+
function selfPrefix() {
|
|
15
|
+
const here = fileURLToPath(import.meta.url); // <prefix>[/lib]/node_modules/orcasynth/dist/cli/update.js
|
|
16
|
+
const idx = here.lastIndexOf('/node_modules/');
|
|
17
|
+
if (idx === -1)
|
|
18
|
+
return null;
|
|
19
|
+
let base = here.slice(0, idx); // <prefix>/lib (global, has lib/) OR <prefix> (prefix-style install)
|
|
20
|
+
if (basename(base) === 'lib')
|
|
21
|
+
base = dirname(base);
|
|
22
|
+
return base;
|
|
23
|
+
}
|
|
6
24
|
/** Latest published version of orcasynth from the npm registry. Uses the bare registry JSON endpoint
|
|
7
25
|
* (no npm spawn) so a version check is cheap and offline-tolerant (throws → caller reports it). */
|
|
8
26
|
async function checkLatest(fetchFn = fetch) {
|
|
@@ -22,9 +40,20 @@ export async function update(env, deps) {
|
|
|
22
40
|
const latest = await checkLatest(fetchFn);
|
|
23
41
|
if (!isNewer(latest, deps.current))
|
|
24
42
|
return { updated: false, from: deps.current, to: latest };
|
|
25
|
-
const install = deps.install ?? (async () => {
|
|
43
|
+
const install = deps.install ?? (async () => {
|
|
44
|
+
const prefix = selfPrefix();
|
|
45
|
+
await execFileAsync('npm', ['install', '-g', 'orcasynth@latest', ...(prefix ? ['--prefix', prefix] : [])]);
|
|
46
|
+
});
|
|
26
47
|
await install();
|
|
48
|
+
// A box provisioned by `orca install` is systemd-managed — restart those units (sudo when not root).
|
|
49
|
+
// A plain launcher install has no install.json — fall back to stop/start of our own spawned daemon.
|
|
27
50
|
const restart = deps.restart ?? (async (e) => {
|
|
51
|
+
if (readInstallInfo()) {
|
|
52
|
+
const r = await systemctl('restart', ...SERVICES);
|
|
53
|
+
if (r.code !== 0)
|
|
54
|
+
throw new Error(`systemctl restart failed (code ${r.code})`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
28
57
|
await stop(e);
|
|
29
58
|
await start(e, { version: latest });
|
|
30
59
|
});
|
package/package.json
CHANGED
package/web-dist/.next/BUILD_ID
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
-uzOOlExTv_eTD0OFDRq_
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
"static/chunks/0cz1d0mv5g_q7.js"
|
|
8
8
|
],
|
|
9
9
|
"lowPriorityFiles": [
|
|
10
|
-
"static/
|
|
11
|
-
"static/
|
|
12
|
-
"static/
|
|
10
|
+
"static/-uzOOlExTv_eTD0OFDRq_/_buildManifest.js",
|
|
11
|
+
"static/-uzOOlExTv_eTD0OFDRq_/_ssgManifest.js",
|
|
12
|
+
"static/-uzOOlExTv_eTD0OFDRq_/_clientMiddlewareManifest.js"
|
|
13
13
|
],
|
|
14
14
|
"rootMainFiles": [
|
|
15
15
|
"static/chunks/310vm2bl3xxpt.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/310vm2bl3xxpt.js"/><script src="/_next/static/chunks/17tpdgx22zl4v.js" async=""></script><script src="/_next/static/chunks/2nykiepra7i1k.js" async=""></script><script src="/_next/static/chunks/0n-zjr76qg7uq.js" async=""></script><script src="/_next/static/chunks/0paxexg6-m0de.js" async=""></script><script src="/_next/static/chunks/turbopack-2put530kkhy0n.js" async=""></script><script src="/_next/static/chunks/05-c3ty_6dwfk.js" async=""></script><script src="/_next/static/chunks/0c179dg4znere.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/310vm2bl3xxpt.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"
|
|
1
|
+
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/310vm2bl3xxpt.js"/><script src="/_next/static/chunks/17tpdgx22zl4v.js" async=""></script><script src="/_next/static/chunks/2nykiepra7i1k.js" async=""></script><script src="/_next/static/chunks/0n-zjr76qg7uq.js" async=""></script><script src="/_next/static/chunks/0paxexg6-m0de.js" async=""></script><script src="/_next/static/chunks/turbopack-2put530kkhy0n.js" async=""></script><script src="/_next/static/chunks/05-c3ty_6dwfk.js" async=""></script><script src="/_next/static/chunks/0c179dg4znere.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/310vm2bl3xxpt.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/0c179dg4znere.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"-uzOOlExTv_eTD0OFDRq_\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
8:I[97367,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"ViewportBoundary"]
|
|
7
7
|
a:I[97367,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"MetadataBoundary"]
|
|
8
8
|
c:I[68027,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"default",1]
|
|
9
|
-
0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"
|
|
9
|
+
0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"-uzOOlExTv_eTD0OFDRq_"}
|
|
10
10
|
d:[]
|
|
11
11
|
7:"$Wd"
|
|
12
12
|
9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[97367,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"OutletBoundary"]
|
|
3
3
|
3:"$Sreact.suspense"
|
|
4
|
-
0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"
|
|
4
|
+
0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"-uzOOlExTv_eTD0OFDRq_"}
|
|
5
5
|
4:null
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
8:I[97367,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"ViewportBoundary"]
|
|
7
7
|
a:I[97367,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"MetadataBoundary"]
|
|
8
8
|
c:I[68027,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"default",1]
|
|
9
|
-
0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"
|
|
9
|
+
0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],null]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"-uzOOlExTv_eTD0OFDRq_"}
|
|
10
10
|
d:[]
|
|
11
11
|
7:"$Wd"
|
|
12
12
|
9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
2:I[97367,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"ViewportBoundary"]
|
|
3
3
|
3:I[97367,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"MetadataBoundary"]
|
|
4
4
|
4:"$Sreact.suspense"
|
|
5
|
-
0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"
|
|
5
|
+
0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"-uzOOlExTv_eTD0OFDRq_"}
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
2:I[39756,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"default"]
|
|
3
3
|
3:I[37457,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/0c179dg4znere.js"],"default"]
|
|
4
4
|
4:[]
|
|
5
|
-
0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"
|
|
5
|
+
0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"-uzOOlExTv_eTD0OFDRq_"}
|