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.
Files changed (128) hide show
  1. package/dist/cli/install/index.js +93 -33
  2. package/dist/cli/install/systemdUnits.js +1 -1
  3. package/dist/cli/installInfo.js +15 -0
  4. package/dist/cli/menu.js +66 -0
  5. package/dist/cli/systemd.js +24 -0
  6. package/dist/cli/update.js +30 -1
  7. package/package.json +1 -1
  8. package/web-dist/.next/BUILD_ID +1 -1
  9. package/web-dist/.next/build-manifest.json +3 -3
  10. package/web-dist/.next/server/app/_global-error.html +1 -1
  11. package/web-dist/.next/server/app/_global-error.rsc +1 -1
  12. package/web-dist/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  13. package/web-dist/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/web-dist/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  15. package/web-dist/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/web-dist/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/web-dist/.next/server/app/_not-found.html +1 -1
  18. package/web-dist/.next/server/app/_not-found.rsc +1 -1
  19. package/web-dist/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  20. package/web-dist/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  21. package/web-dist/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  22. package/web-dist/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/web-dist/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  24. package/web-dist/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  25. package/web-dist/.next/server/app/account.html +1 -1
  26. package/web-dist/.next/server/app/account.rsc +1 -1
  27. package/web-dist/.next/server/app/account.segments/_full.segment.rsc +1 -1
  28. package/web-dist/.next/server/app/account.segments/_head.segment.rsc +1 -1
  29. package/web-dist/.next/server/app/account.segments/_index.segment.rsc +1 -1
  30. package/web-dist/.next/server/app/account.segments/_tree.segment.rsc +1 -1
  31. package/web-dist/.next/server/app/account.segments/account/__PAGE__.segment.rsc +1 -1
  32. package/web-dist/.next/server/app/account.segments/account.segment.rsc +1 -1
  33. package/web-dist/.next/server/app/dash.html +1 -1
  34. package/web-dist/.next/server/app/dash.rsc +1 -1
  35. package/web-dist/.next/server/app/dash.segments/_full.segment.rsc +1 -1
  36. package/web-dist/.next/server/app/dash.segments/_head.segment.rsc +1 -1
  37. package/web-dist/.next/server/app/dash.segments/_index.segment.rsc +1 -1
  38. package/web-dist/.next/server/app/dash.segments/_tree.segment.rsc +1 -1
  39. package/web-dist/.next/server/app/dash.segments/dash/__PAGE__.segment.rsc +1 -1
  40. package/web-dist/.next/server/app/dash.segments/dash.segment.rsc +1 -1
  41. package/web-dist/.next/server/app/escalations.html +1 -1
  42. package/web-dist/.next/server/app/escalations.rsc +1 -1
  43. package/web-dist/.next/server/app/escalations.segments/_full.segment.rsc +1 -1
  44. package/web-dist/.next/server/app/escalations.segments/_head.segment.rsc +1 -1
  45. package/web-dist/.next/server/app/escalations.segments/_index.segment.rsc +1 -1
  46. package/web-dist/.next/server/app/escalations.segments/_tree.segment.rsc +1 -1
  47. package/web-dist/.next/server/app/escalations.segments/escalations/__PAGE__.segment.rsc +1 -1
  48. package/web-dist/.next/server/app/escalations.segments/escalations.segment.rsc +1 -1
  49. package/web-dist/.next/server/app/index.html +1 -1
  50. package/web-dist/.next/server/app/index.rsc +1 -1
  51. package/web-dist/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  52. package/web-dist/.next/server/app/index.segments/_full.segment.rsc +1 -1
  53. package/web-dist/.next/server/app/index.segments/_head.segment.rsc +1 -1
  54. package/web-dist/.next/server/app/index.segments/_index.segment.rsc +1 -1
  55. package/web-dist/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  56. package/web-dist/.next/server/app/kanban.html +1 -1
  57. package/web-dist/.next/server/app/kanban.rsc +1 -1
  58. package/web-dist/.next/server/app/kanban.segments/_full.segment.rsc +1 -1
  59. package/web-dist/.next/server/app/kanban.segments/_head.segment.rsc +1 -1
  60. package/web-dist/.next/server/app/kanban.segments/_index.segment.rsc +1 -1
  61. package/web-dist/.next/server/app/kanban.segments/_tree.segment.rsc +1 -1
  62. package/web-dist/.next/server/app/kanban.segments/kanban/__PAGE__.segment.rsc +1 -1
  63. package/web-dist/.next/server/app/kanban.segments/kanban.segment.rsc +1 -1
  64. package/web-dist/.next/server/app/onboarding.html +1 -1
  65. package/web-dist/.next/server/app/onboarding.rsc +1 -1
  66. package/web-dist/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
  67. package/web-dist/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
  68. package/web-dist/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
  69. package/web-dist/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
  70. package/web-dist/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
  71. package/web-dist/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
  72. package/web-dist/.next/server/app/projects.html +1 -1
  73. package/web-dist/.next/server/app/projects.rsc +1 -1
  74. package/web-dist/.next/server/app/projects.segments/_full.segment.rsc +1 -1
  75. package/web-dist/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  76. package/web-dist/.next/server/app/projects.segments/_index.segment.rsc +1 -1
  77. package/web-dist/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
  78. package/web-dist/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +1 -1
  79. package/web-dist/.next/server/app/projects.segments/projects.segment.rsc +1 -1
  80. package/web-dist/.next/server/app/sessions.html +1 -1
  81. package/web-dist/.next/server/app/sessions.rsc +1 -1
  82. package/web-dist/.next/server/app/sessions.segments/_full.segment.rsc +1 -1
  83. package/web-dist/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  84. package/web-dist/.next/server/app/sessions.segments/_index.segment.rsc +1 -1
  85. package/web-dist/.next/server/app/sessions.segments/_tree.segment.rsc +1 -1
  86. package/web-dist/.next/server/app/sessions.segments/sessions/__PAGE__.segment.rsc +1 -1
  87. package/web-dist/.next/server/app/sessions.segments/sessions.segment.rsc +1 -1
  88. package/web-dist/.next/server/app/settings.html +1 -1
  89. package/web-dist/.next/server/app/settings.rsc +1 -1
  90. package/web-dist/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  91. package/web-dist/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  92. package/web-dist/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  93. package/web-dist/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  94. package/web-dist/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  95. package/web-dist/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  96. package/web-dist/.next/server/app/tasks.html +1 -1
  97. package/web-dist/.next/server/app/tasks.rsc +1 -1
  98. package/web-dist/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  99. package/web-dist/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  100. package/web-dist/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  101. package/web-dist/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  102. package/web-dist/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  103. package/web-dist/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  104. package/web-dist/.next/server/app/timeline.html +1 -1
  105. package/web-dist/.next/server/app/timeline.rsc +1 -1
  106. package/web-dist/.next/server/app/timeline.segments/_full.segment.rsc +1 -1
  107. package/web-dist/.next/server/app/timeline.segments/_head.segment.rsc +1 -1
  108. package/web-dist/.next/server/app/timeline.segments/_index.segment.rsc +1 -1
  109. package/web-dist/.next/server/app/timeline.segments/_tree.segment.rsc +1 -1
  110. package/web-dist/.next/server/app/timeline.segments/timeline/__PAGE__.segment.rsc +1 -1
  111. package/web-dist/.next/server/app/timeline.segments/timeline.segment.rsc +1 -1
  112. package/web-dist/.next/server/app/users.html +1 -1
  113. package/web-dist/.next/server/app/users.rsc +1 -1
  114. package/web-dist/.next/server/app/users.segments/_full.segment.rsc +1 -1
  115. package/web-dist/.next/server/app/users.segments/_head.segment.rsc +1 -1
  116. package/web-dist/.next/server/app/users.segments/_index.segment.rsc +1 -1
  117. package/web-dist/.next/server/app/users.segments/_tree.segment.rsc +1 -1
  118. package/web-dist/.next/server/app/users.segments/users/__PAGE__.segment.rsc +1 -1
  119. package/web-dist/.next/server/app/users.segments/users.segment.rsc +1 -1
  120. package/web-dist/.next/server/chunks/[root-of-the-server]__0bvp8h1._.js +1 -1
  121. package/web-dist/.next/server/chunks/[root-of-the-server]__1dgbigm._.js +1 -1
  122. package/web-dist/.next/server/chunks/[root-of-the-server]__1wxxtv8._.js +1 -1
  123. package/web-dist/.next/server/middleware-build-manifest.js +3 -3
  124. package/web-dist/.next/server/pages/404.html +1 -1
  125. package/web-dist/.next/server/pages/500.html +1 -1
  126. /package/web-dist/.next/static/{5UmD3aQxR5MeUIuIvjKvT → -uzOOlExTv_eTD0OFDRq_}/_buildManifest.js +0 -0
  127. /package/web-dist/.next/static/{5UmD3aQxR5MeUIuIvjKvT → -uzOOlExTv_eTD0OFDRq_}/_clientMiddlewareManifest.js +0 -0
  128. /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 (plan.domain) {
189
+ if (d.mode === 'domain' && d.domain) {
178
190
  const kind = await step('Configuring reverse proxy', async () => {
179
- const k = await resolveProxy(r, plan.proxyPreference);
180
- await configureVhost(r, k, plan.domain);
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 (plan.tls) {
198
+ if (d.tls) {
187
199
  try {
188
- await step('Requesting HTTPS certificate', () => obtainTls(r, kind, plan.domain, plan.email));
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
- domain,
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
- async function chooseProxy(r) {
276
- const domain = await p.text({
277
- message: 'Domain for the web UI (blank to skip the reverse proxy and serve on localhost only)',
278
- placeholder: 'orca.example.com',
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 web = plan.domain
309
- ? `${plan.proxyPreference} ${plan.domain}${plan.tls ? ' + HTTPS (Let’s Encrypt)' : ' (HTTP only)'}`
310
- : `localhost only — http://127.0.0.1:${WEB_PORT} (no reverse proxy)`;
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 proxy = await chooseProxy(r);
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, ...proxy, admin: null };
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.domain ? (tls ? `https://${plan.domain}` : `http://${plan.domain}`) : `http://127.0.0.1:${WEB_PORT}`;
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=127.0.0.1
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
+ }
@@ -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 () => { await execFileAsync('npm', ['install', '-g', 'orcasynth@latest']); });
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orcasynth",
3
- "version": "1.2.2",
3
+ "version": "1.3.1",
4
4
  "description": "ORCA — an autonomous coding-agent orchestrator with an autopilot overseer, daemon API and web UI. Install globally and run `orca`.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1 +1 @@
1
- 5UmD3aQxR5MeUIuIvjKvT
1
+ -uzOOlExTv_eTD0OFDRq_
@@ -7,9 +7,9 @@
7
7
  "static/chunks/0cz1d0mv5g_q7.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/5UmD3aQxR5MeUIuIvjKvT/_buildManifest.js",
11
- "static/5UmD3aQxR5MeUIuIvjKvT/_ssgManifest.js",
12
- "static/5UmD3aQxR5MeUIuIvjKvT/_clientMiddlewareManifest.js"
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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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\":\"5UmD3aQxR5MeUIuIvjKvT\"}\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>
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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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":"5UmD3aQxR5MeUIuIvjKvT"}
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":"5UmD3aQxR5MeUIuIvjKvT"}
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":"5UmD3aQxR5MeUIuIvjKvT"}
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":"5UmD3aQxR5MeUIuIvjKvT"}
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":"5UmD3aQxR5MeUIuIvjKvT"}
5
+ 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"-uzOOlExTv_eTD0OFDRq_"}