pinomad 0.10.0 → 0.12.0

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 (98) hide show
  1. package/README.md +11 -9
  2. package/dist/chunk-41q0saz0.js +73 -0
  3. package/dist/chunk-42nqtx5r.js +22 -0
  4. package/dist/{chunk-wb10efyq.js → chunk-445cevpm.js} +1 -1
  5. package/dist/{chunk-jgd38rna.js → chunk-47ff1d1t.js} +206 -178
  6. package/dist/chunk-5qf1grkk.js +220 -0
  7. package/dist/{chunk-4h7pkkzr.js → chunk-7mn38n4f.js} +3 -3
  8. package/dist/{chunk-zehwx009.js → chunk-7wj0jh3t.js} +1 -1
  9. package/dist/{chunk-5791mb0b.js → chunk-agq4tn9r.js} +47 -23
  10. package/dist/{chunk-c5p9xkd8.js → chunk-aqj9wfmb.js} +3 -3
  11. package/dist/{chunk-cx8k63by.js → chunk-g3ahp7b9.js} +12 -1
  12. package/dist/chunk-gg2dcqbg.js +458 -0
  13. package/dist/{chunk-73efzaf1.js → chunk-jeqsdcj1.js} +30 -13
  14. package/dist/{chunk-czj9nfrz.js → chunk-ksfxqd8s.js} +500 -41
  15. package/dist/{chunk-p978qj9m.js → chunk-mnmqyq7d.js} +565 -39
  16. package/dist/{chunk-4sepcfpy.js → chunk-np4jd070.js} +155 -3
  17. package/dist/{chunk-v414b5pp.js → chunk-nppgxh6c.js} +2 -2
  18. package/dist/chunk-nq57fdnq.js +106 -0
  19. package/dist/{chunk-sygeb9qb.js → chunk-pqe7q1s7.js} +1 -1
  20. package/dist/{chunk-w2m9xkks.js → chunk-t5abqsva.js} +199 -72
  21. package/dist/{chunk-8gywfw5n.js → chunk-t91zt5f0.js} +2 -51
  22. package/dist/{chunk-vax4zspw.js → chunk-vqkb70d7.js} +3 -3
  23. package/dist/chunk-vx7dy07y.js +26 -0
  24. package/dist/pinomad.js +19 -12
  25. package/package.json +2 -1
  26. package/web/assets/astro-DOly5024.js +1 -0
  27. package/web/assets/c-BIGW1oBm.js +1 -0
  28. package/web/assets/core-DnpzcQzs.js +4 -0
  29. package/web/assets/cpp-DddhVWhK.js +1 -0
  30. package/web/assets/csharp-B_TYUkTI.js +1 -0
  31. package/web/assets/css-Z72CF80r.js +1 -0
  32. package/web/assets/dart-CtKP3W-j.js +1 -0
  33. package/web/assets/diff-D97Zzqfu.js +1 -0
  34. package/web/assets/dockerfile-BcOcwvcX.js +1 -0
  35. package/web/assets/elixir-DkJLSxtU.js +1 -0
  36. package/web/assets/engine-javascript-BHPwbUfN.js +141 -0
  37. package/web/assets/engine-oniguruma-CQjQPVHy.js +1 -0
  38. package/web/assets/fish-BvzEVeQv.js +1 -0
  39. package/web/assets/go-C27-OAKa.js +1 -0
  40. package/web/assets/graphql-ChdNCCLP.js +1 -0
  41. package/web/assets/haskell-Df6bDoY_.js +1 -0
  42. package/web/assets/hcl-BWvSN4gD.js +1 -0
  43. package/web/assets/highlighted-diff-Dn5ifsvK.js +175 -0
  44. package/web/assets/highlights-DnHv6NBM.js +4 -0
  45. package/web/assets/highlights-themes-CUdrlZk3.js +1 -0
  46. package/web/assets/html-BlS82ilI.js +1 -0
  47. package/web/assets/{index-DoyHMPwf.css → index-BV0ecolo.css} +1 -1
  48. package/web/assets/index-DNsTTgPE.js +396 -0
  49. package/web/assets/ini-BEwlwnbL.js +1 -0
  50. package/web/assets/java-CylS5w8V.js +1 -0
  51. package/web/assets/javascript-wDzz0qaB.js +1 -0
  52. package/web/assets/json-Cp-IABpG.js +1 -0
  53. package/web/assets/jsonc-Des-eS-w.js +1 -0
  54. package/web/assets/jsx-g9-lgVsj.js +1 -0
  55. package/web/assets/kotlin-BdnUsdx6.js +1 -0
  56. package/web/assets/less-B1dDrJ26.js +1 -0
  57. package/web/assets/lua-BaeVxFsk.js +1 -0
  58. package/web/assets/make-CHLpvVh8.js +1 -0
  59. package/web/assets/markdown-Cvjx9yec.js +1 -0
  60. package/web/assets/nix-CwoSXNpI.js +1 -0
  61. package/web/assets/objective-c-DXmwc3jG.js +1 -0
  62. package/web/assets/php-DoruYMF0.js +1 -0
  63. package/web/assets/pierre-dark-CyvmCCZW.js +1 -0
  64. package/web/assets/pierre-dark-VKo95ZgA.js +1 -0
  65. package/web/assets/pierre-light-480U9XYS.js +1 -0
  66. package/web/assets/pierre-light-BVSW-Xev.js +1 -0
  67. package/web/assets/postcss-DnzrXTVv.js +1 -0
  68. package/web/assets/powershell-Dd0kTxKP.js +1 -0
  69. package/web/assets/prisma-Vru482bI.js +1 -0
  70. package/web/assets/proto-C7zT0LnQ.js +1 -0
  71. package/web/assets/python-B6aJPvgy.js +1 -0
  72. package/web/assets/ruby-B43yHlf9.js +1 -0
  73. package/web/assets/rust-DPvrY3IQ.js +1 -0
  74. package/web/assets/scala-CqE71os6.js +1 -0
  75. package/web/assets/scss-Cw6XMfVs.js +1 -0
  76. package/web/assets/shellscript-Yzrsuije.js +1 -0
  77. package/web/assets/shiki-BuPP5HCg.js +2 -0
  78. package/web/assets/shiki-langs-FJk0v0Ga.js +2 -0
  79. package/web/assets/shiki-wasm-CgFRq91U.js +1 -0
  80. package/web/assets/sql-DkvoVjww.js +1 -0
  81. package/web/assets/stream-tokenizer-Bl6bisIa.js +4 -0
  82. package/web/assets/svelte-DoIXUgJc.js +1 -0
  83. package/web/assets/swift-C2oV4EkX.js +1 -0
  84. package/web/assets/terraform-BETggiCN.js +1 -0
  85. package/web/assets/theming-themes-BL_CC-Mm.js +1 -0
  86. package/web/assets/toml-vGWfd6FD.js +1 -0
  87. package/web/assets/tsx-COt5Ahok.js +1 -0
  88. package/web/assets/typescript-BPQ3VLAy.js +1 -0
  89. package/web/assets/vue-CwSeJimo.js +1 -0
  90. package/web/assets/xml-sdJ4AIDG.js +1 -0
  91. package/web/assets/xterm-view-6GBZ9nXN.css +32 -0
  92. package/web/assets/xterm-view-ZsuzJb2C.js +38 -0
  93. package/web/assets/yaml-Buea-lGh.js +1 -0
  94. package/web/assets/zig-VOosw3JB.js +1 -0
  95. package/web/index.html +2 -2
  96. package/dist/chunk-bhtx2c8a.js +0 -16
  97. package/dist/chunk-c05g401k.js +0 -170
  98. package/web/assets/index-BdBjP1qJ.js +0 -395
@@ -1,19 +1,19 @@
1
- import {
2
- isParseArgsError
3
- } from "./chunk-kzbzacz9.js";
4
- import {
5
- commandHint,
6
- hostEntry,
7
- packagedVersion
8
- } from "./chunk-zehwx009.js";
9
1
  import {
10
2
  ProtocolMismatchError,
11
3
  connectRemoteDurable
12
- } from "./chunk-4sepcfpy.js";
4
+ } from "./chunk-np4jd070.js";
5
+ import {
6
+ isParseArgsError
7
+ } from "./chunk-kzbzacz9.js";
13
8
  import {
14
9
  DEFAULT_DATA_DIR,
15
10
  hostAddress
16
11
  } from "./chunk-ngf1zatm.js";
12
+ import {
13
+ commandHint,
14
+ hostEntry,
15
+ packagedVersion
16
+ } from "./chunk-7wj0jh3t.js";
17
17
 
18
18
  // apps/host/src/cli/service.ts
19
19
  import { execFile as execFile2 } from "node:child_process";
@@ -81,20 +81,21 @@ function argValue(args, flag) {
81
81
  }
82
82
  return value;
83
83
  }
84
- function withoutRelayArgs(args) {
84
+ function withoutArg(args, flag) {
85
85
  const out = [];
86
86
  for (let i = 0;i < args.length; i += 1) {
87
87
  const arg = args[i];
88
- if (arg === "--relay") {
88
+ if (arg === flag) {
89
89
  i += 1;
90
90
  continue;
91
91
  }
92
- if (arg.startsWith("--relay="))
92
+ if (arg.startsWith(`${flag}=`))
93
93
  continue;
94
94
  out.push(arg);
95
95
  }
96
96
  return out;
97
97
  }
98
+ var withoutRelayArgs = (args) => withoutArg(args, "--relay");
98
99
  var unescapeExec = (value) => value.replace(/\\(.)/g, "$1");
99
100
  var unspecify = (value) => value.replace(/%%/g, "%").replace(/\$\$/g, "$");
100
101
  var xmlUnescape = (value) => value.replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
@@ -244,6 +245,55 @@ import { homedir, userInfo } from "node:os";
244
245
  import { dirname, join as join2 } from "node:path";
245
246
  import { promisify } from "node:util";
246
247
  var run = promisify(execFile);
248
+ var NOT_INSTALLED = { installed: false, stopped: false, running: false, detail: "not installed" };
249
+ function launchdDisabled(printed) {
250
+ const value = /^\s*"pinomad\.host" => (\w+)\s*$/m.exec(printed)?.[1];
251
+ return value === "disabled" || value === "true";
252
+ }
253
+ function launchdState(disabled, printed) {
254
+ if (printed === undefined) {
255
+ return disabled ? { installed: true, stopped: true, running: false, detail: "stopped" } : { installed: true, stopped: false, running: false, detail: "not loaded" };
256
+ }
257
+ const field = (name) => printed.match(new RegExp(`^\\s*${name} = (.+)$`, "m"))?.[1];
258
+ const state = field("state") ?? "unknown";
259
+ const pid = field("pid");
260
+ const exit = field("last exit code");
261
+ return {
262
+ installed: true,
263
+ stopped: false,
264
+ running: state === "running" && pid !== undefined,
265
+ ...pid === undefined ? {} : { pid: Number(pid) },
266
+ detail: [
267
+ state,
268
+ ...pid === undefined ? [] : [`pid ${pid}`],
269
+ ...exit === undefined || exit === "0" || exit === "(never exited)" ? [] : [`last exit ${exit}`],
270
+ ...disabled ? ["turned off but still loaded"] : []
271
+ ].join(", ")
272
+ };
273
+ }
274
+ function systemdState(shown) {
275
+ const fields = Object.fromEntries(shown.trim().split(`
276
+ `).map((line) => line.split("=", 2)));
277
+ if (fields.LoadState === "not-found")
278
+ return NOT_INSTALLED;
279
+ const pid = Number(fields.MainPID ?? "0");
280
+ const active = fields.ActiveState === "active";
281
+ const done = fields.ActiveState === "inactive" || fields.ActiveState === "failed";
282
+ if (fields.UnitFileState === "disabled" && done)
283
+ return { installed: true, stopped: true, running: false, detail: "stopped" };
284
+ return {
285
+ installed: true,
286
+ stopped: false,
287
+ running: active && pid > 0,
288
+ ...pid > 0 ? { pid } : {},
289
+ detail: [
290
+ fields.ActiveState ?? "unknown",
291
+ fields.SubState ?? "",
292
+ ...pid > 0 ? [`pid ${pid}`] : [],
293
+ ...fields.ExecMainStatus === undefined || fields.ExecMainStatus === "0" ? [] : [`last exit ${fields.ExecMainStatus}`]
294
+ ].filter((part) => part !== "").join(", ")
295
+ };
296
+ }
247
297
  var launchd = {
248
298
  async install(spec) {
249
299
  await mkdir(join2(spec.dataDir, "logs"), { recursive: true });
@@ -252,6 +302,7 @@ var launchd = {
252
302
  await writeFile(path, launchdPlist(spec));
253
303
  const domain = `gui/${process.getuid()}/pinomad.host`;
254
304
  await run("launchctl", ["bootout", domain]).catch(() => {});
305
+ await run("launchctl", ["enable", domain]);
255
306
  await run("launchctl", ["bootstrap", `gui/${process.getuid()}`, path]);
256
307
  return path;
257
308
  },
@@ -262,26 +313,27 @@ var launchd = {
262
313
  async restart() {
263
314
  await run("launchctl", ["kickstart", "-k", `gui/${process.getuid()}/pinomad.host`]);
264
315
  },
316
+ async start() {
317
+ const domain = `gui/${process.getuid()}/pinomad.host`;
318
+ await run("launchctl", ["enable", domain]);
319
+ if (await run("launchctl", ["print", domain]).then(() => true, () => false))
320
+ return;
321
+ await run("launchctl", ["bootstrap", `gui/${process.getuid()}`, launchdPlistPath(homedir())]);
322
+ },
323
+ async stop() {
324
+ const domain = `gui/${process.getuid()}/pinomad.host`;
325
+ await run("launchctl", ["disable", domain]);
326
+ await run("launchctl", ["bootout", domain]).catch(() => {});
327
+ },
265
328
  async state() {
329
+ const defined = await readFile(launchdPlistPath(homedir())).then(() => true, () => false);
330
+ if (!defined)
331
+ return NOT_INSTALLED;
332
+ const disabled = await run("launchctl", ["print-disabled", `gui/${process.getuid()}`]).then(({ stdout }) => launchdDisabled(stdout), () => false);
266
333
  const printed = await run("launchctl", ["print", `gui/${process.getuid()}/pinomad.host`]).then(({ stdout }) => stdout, () => {
267
334
  return;
268
335
  });
269
- if (printed === undefined)
270
- return { installed: false, running: false, detail: "not installed" };
271
- const field = (name) => printed.match(new RegExp(`^\\s*${name} = (.+)$`, "m"))?.[1];
272
- const state = field("state") ?? "unknown";
273
- const pid = field("pid");
274
- const exit = field("last exit code");
275
- return {
276
- installed: true,
277
- running: state === "running" && pid !== undefined,
278
- ...pid === undefined ? {} : { pid: Number(pid) },
279
- detail: [
280
- state,
281
- ...pid === undefined ? [] : [`pid ${pid}`],
282
- ...exit === undefined || exit === "0" || exit === "(never exited)" ? [] : [`last exit ${exit}`]
283
- ].join(", ")
284
- };
336
+ return launchdState(disabled, printed);
285
337
  },
286
338
  async logs(dataDir, lines, follow) {
287
339
  const file = join2(dataDir, "logs", "host.log");
@@ -327,34 +379,23 @@ var systemd = {
327
379
  async restart() {
328
380
  await run("systemctl", ["--user", "restart", "pinomad.service"]);
329
381
  },
382
+ async start() {
383
+ await run("systemctl", ["--user", "enable", "--now", "pinomad.service"]);
384
+ },
385
+ async stop() {
386
+ await run("systemctl", ["--user", "disable", "--now", "pinomad.service"]);
387
+ },
330
388
  async state() {
331
389
  const shown = await run("systemctl", [
332
390
  "--user",
333
391
  "show",
334
392
  "pinomad.service",
335
393
  "-p",
336
- "LoadState,ActiveState,SubState,MainPID,ExecMainStatus"
394
+ "LoadState,ActiveState,SubState,MainPID,ExecMainStatus,UnitFileState"
337
395
  ]).then(({ stdout }) => stdout, () => {
338
396
  return;
339
397
  });
340
- if (shown === undefined)
341
- return { installed: false, running: false, detail: "not installed" };
342
- const fields = Object.fromEntries(shown.trim().split(`
343
- `).map((line) => line.split("=", 2)));
344
- if (fields.LoadState === "not-found")
345
- return { installed: false, running: false, detail: "not installed" };
346
- const pid = Number(fields.MainPID ?? "0");
347
- return {
348
- installed: true,
349
- running: fields.ActiveState === "active" && pid > 0,
350
- ...pid > 0 ? { pid } : {},
351
- detail: [
352
- fields.ActiveState ?? "unknown",
353
- fields.SubState ?? "",
354
- ...pid > 0 ? [`pid ${pid}`] : [],
355
- ...fields.ExecMainStatus === undefined || fields.ExecMainStatus === "0" ? [] : [`last exit ${fields.ExecMainStatus}`]
356
- ].filter((part) => part !== "").join(", ")
357
- };
398
+ return shown === undefined ? NOT_INSTALLED : systemdState(shown);
358
399
  },
359
400
  async logs(_dataDir, lines, follow) {
360
401
  const journal = spawn("journalctl", ["--user", "-u", "pinomad.service", "-n", String(lines), ...follow ? ["-f"] : []], {
@@ -409,15 +450,81 @@ async function install(argv) {
409
450
  console.log(`data dir: ${spec.dataDir}`);
410
451
  console.log(`browser link: ${commandHint("link")} pairing QR: ${commandHint("pair")}`);
411
452
  }
412
- async function status(argv) {
413
- const state = await serviceManager().state();
414
- console.log(`service: ${state.installed ? state.detail : "not installed"}`);
415
- if (packagedVersion === undefined) {
416
- const head = await run2("git", ["rev-parse", "--short", "HEAD"], { cwd: repoRoot }).then(({ stdout }) => stdout.trim(), () => "unknown");
417
- console.log(`checkout: ${head}`);
418
- } else {
419
- console.log(`version: ${packagedVersion}`);
453
+ async function waitUntilIdle(address, connect, log) {
454
+ try {
455
+ const remote = await connect(address.url, address.token);
456
+ await waitForIdle(remote, (tasks) => {
457
+ log("waiting for running tasks to finish (Ctrl-C to cancel)");
458
+ for (const task of Object.values(tasks.tasks)) {
459
+ log(` ${task.kind} in conversation ${task.conversationId}`);
460
+ }
461
+ });
462
+ remote.close();
463
+ } catch {}
464
+ }
465
+ async function stopService({
466
+ force,
467
+ argv,
468
+ manager = serviceManager(),
469
+ connect = connectToHost,
470
+ log = (line) => console.log(line),
471
+ logError = (line) => console.error(line)
472
+ }) {
473
+ const state = await manager.state();
474
+ if (!state.installed) {
475
+ log(`service not installed (${commandHint("service")} install)`);
476
+ return 1;
477
+ }
478
+ if (state.stopped) {
479
+ log("already stopped");
480
+ return 0;
481
+ }
482
+ if (!force) {
483
+ const spec = argv.length === 0 ? await manager.read() : undefined;
484
+ const port = spec === undefined ? undefined : argValue(spec.hostArgs, "--port");
485
+ const flags = spec === undefined ? argv : ["--data-dir", spec.dataDir, ...port === undefined ? [] : ["--url", `ws://127.0.0.1:${port}`]];
486
+ const address = await hostAddress(flags).catch((error) => {
487
+ if (isParseArgsError(error))
488
+ throw error;
489
+ return;
490
+ });
491
+ if (address !== undefined)
492
+ await waitUntilIdle(address, connect, log);
493
+ }
494
+ const holdInterrupt = () => {};
495
+ process.on("SIGINT", holdInterrupt);
496
+ try {
497
+ await manager.stop();
498
+ } finally {
499
+ process.off("SIGINT", holdInterrupt);
500
+ }
501
+ const after = await manager.state();
502
+ if (!after.stopped) {
503
+ logError(`the host is still running (${after.detail}); run \`${commandHint("service")} stop\` again`);
504
+ return 1;
505
+ }
506
+ log(`stopped; it stays off, also after a restart, until \`${commandHint("service")} start\``);
507
+ return 0;
508
+ }
509
+ async function startService({
510
+ manager = serviceManager(),
511
+ log = (line) => console.log(line)
512
+ } = {}) {
513
+ if (!(await manager.state()).installed) {
514
+ log(`service not installed (${commandHint("service")} install)`);
515
+ return 1;
420
516
  }
517
+ await manager.start();
518
+ log("started");
519
+ return 0;
520
+ }
521
+ async function versionLine() {
522
+ if (packagedVersion !== undefined)
523
+ return `version: ${packagedVersion}`;
524
+ const head = await run2("git", ["rev-parse", "--short", "HEAD"], { cwd: repoRoot }).then(({ stdout }) => stdout.trim(), () => "unknown");
525
+ return `checkout: ${head}`;
526
+ }
527
+ async function reachabilityLine(argv) {
421
528
  try {
422
529
  const { url, token } = await hostAddress(argv);
423
530
  const remote = await connectToHost(url, token);
@@ -425,13 +532,30 @@ async function status(argv) {
425
532
  await remote.controller.toggleTasks();
426
533
  const tasks = remote.view.current().tasks;
427
534
  const count = tasks === undefined ? 0 : Object.keys(tasks.tasks).length;
428
- console.log(`host: reachable at ${url}, ${count} live task${count === 1 ? "" : "s"}`);
429
535
  remote.close();
536
+ return `host: reachable at ${url}, ${count} live task${count === 1 ? "" : "s"}`;
430
537
  } catch (error) {
431
538
  if (isParseArgsError(error))
432
539
  throw error;
433
- console.log(`host: unreachable (${message(error)})`);
540
+ return `host: unreachable (${message(error)})`;
541
+ }
542
+ }
543
+ var serviceStatusJson = (state) => JSON.stringify({
544
+ installed: state.installed,
545
+ stopped: state.stopped,
546
+ running: state.running,
547
+ ...state.pid === undefined ? {} : { pid: state.pid },
548
+ detail: state.detail
549
+ });
550
+ async function status(argv) {
551
+ const state = await serviceManager().state();
552
+ if (argv.includes("--json")) {
553
+ console.log(serviceStatusJson(state));
554
+ return;
434
555
  }
556
+ console.log(`service: ${state.installed ? state.detail : "not installed"}`);
557
+ console.log(await versionLine());
558
+ console.log(await reachabilityLine(argv));
435
559
  }
436
560
  async function restartService({
437
561
  force,
@@ -442,27 +566,22 @@ async function restartService({
442
566
  pollTimeoutMs = 30000,
443
567
  pollDelayMs = 500
444
568
  }) {
445
- if (!(await manager.state()).installed) {
569
+ const state = await manager.state();
570
+ if (!state.installed) {
446
571
  console.log(`service not installed (${commandHint("service")} install)`);
447
572
  return 1;
448
573
  }
574
+ if (state.stopped && restart === undefined) {
575
+ console.log(`service stopped (${commandHint("service")} start)`);
576
+ return 1;
577
+ }
449
578
  const address = await hostAddress(argv).catch((error) => {
450
579
  if (isParseArgsError(error))
451
580
  throw error;
452
581
  return;
453
582
  });
454
- if (!force && address !== undefined) {
455
- try {
456
- const remote = await connect(address.url, address.token);
457
- await waitForIdle(remote, (tasks) => {
458
- console.log("waiting for running tasks to finish (Ctrl-C to cancel)");
459
- for (const task of Object.values(tasks.tasks)) {
460
- console.log(` ${task.kind} in conversation ${task.conversationId}`);
461
- }
462
- });
463
- remote.close();
464
- } catch {}
465
- }
583
+ if (!force && address !== undefined)
584
+ await waitUntilIdle(address, connect, (line) => console.log(line));
466
585
  await (restart?.() ?? manager.restart());
467
586
  if (address === undefined) {
468
587
  console.log("restart requested (host address unknown; not polling)");
@@ -520,11 +639,19 @@ async function main(argv) {
520
639
  process.exitCode = await restartService({ force, argv: args.filter((arg) => arg !== "--force") });
521
640
  break;
522
641
  }
642
+ case "stop": {
643
+ const force = args.includes("--force");
644
+ process.exitCode = await stopService({ force, argv: args.filter((arg) => arg !== "--force") });
645
+ break;
646
+ }
647
+ case "start":
648
+ process.exitCode = await startService();
649
+ break;
523
650
  case "logs":
524
651
  await logs(args);
525
652
  break;
526
653
  default:
527
- console.error(`usage: ${commandHint("service")} install|uninstall|status|restart|logs`);
654
+ console.error(`usage: ${commandHint("service")} install|uninstall|status|restart|stop|start|logs`);
528
655
  process.exitCode = 1;
529
656
  }
530
657
  } catch (error) {
@@ -536,4 +663,4 @@ async function main(argv) {
536
663
  }
537
664
  if (false) {}
538
665
 
539
- export { installSpec, argValue, withoutRelayArgs, serviceManager, restartService, main };
666
+ export { installSpec, argValue, withoutArg, withoutRelayArgs, serviceManager, stopService, startService, versionLine, reachabilityLine, serviceStatusJson, restartService, main };
@@ -3,7 +3,7 @@ import {
3
3
  generateKeyPair,
4
4
  keyPairFromPrivate,
5
5
  toBase64Url
6
- } from "./chunk-sygeb9qb.js";
6
+ } from "./chunk-pqe7q1s7.js";
7
7
 
8
8
  // apps/host/src/devices.ts
9
9
  import { link, readFile, unlink, writeFile } from "node:fs/promises";
@@ -140,53 +140,4 @@ function pairingOffers(ttlMs = 5 * 60 * 1000) {
140
140
  };
141
141
  }
142
142
 
143
- // apps/host/src/server-config.ts
144
- import { randomBytes as randomBytes2 } from "node:crypto";
145
- import { readFile as readFile2, rename, rm, writeFile as writeFile2 } from "node:fs/promises";
146
- import { join as join2 } from "node:path";
147
- var SERVER_CONFIG_FILE = "server.json";
148
- var normalizeOrigin = (origin) => origin.replace(/\/+$/, "");
149
- async function readServerConfig(dataDir) {
150
- let text;
151
- try {
152
- text = await readFile2(join2(dataDir, SERVER_CONFIG_FILE), "utf8");
153
- } catch (error) {
154
- if (error.code === "ENOENT")
155
- return;
156
- throw error;
157
- }
158
- let value;
159
- try {
160
- value = JSON.parse(text);
161
- } catch {
162
- throw new Error(`${join2(dataDir, SERVER_CONFIG_FILE)} is not valid JSON — delete it or run \`pinomad leave\``);
163
- }
164
- const origin = value?.origin;
165
- if (typeof origin !== "string" || origin.trim() === "") {
166
- throw new Error(`${join2(dataDir, SERVER_CONFIG_FILE)} is missing a string "origin"`);
167
- }
168
- const binding = value.binding;
169
- return {
170
- origin,
171
- ...typeof binding === "string" && binding !== "" ? { binding } : {}
172
- };
173
- }
174
- async function writeServerConfig(dataDir, config) {
175
- const path = join2(dataDir, SERVER_CONFIG_FILE);
176
- const tmp = `${path}.tmp-${process.pid}`;
177
- await writeFile2(tmp, `${JSON.stringify({ origin: normalizeOrigin(config.origin), binding: randomBytes2(16).toString("base64url") })}
178
- `, { mode: 384 });
179
- await rename(tmp, path);
180
- }
181
- var removeServerConfig = (dataDir) => rm(join2(dataDir, SERVER_CONFIG_FILE), { force: true });
182
- async function readServerBinding(dataDir) {
183
- return (await readServerConfig(dataDir))?.binding;
184
- }
185
- function resolveRelayOrigin(flag, config) {
186
- if (flag !== undefined && config !== undefined && normalizeOrigin(flag) !== normalizeOrigin(config.origin)) {
187
- throw new Error(`--relay ${flag} disagrees with ${SERVER_CONFIG_FILE} (${config.origin}) — remove one`);
188
- }
189
- return flag ?? config?.origin;
190
- }
191
-
192
- export { DevicesDoc, ensureDevices, RevocationsDoc, admitDevice, loadHostKey, loadRelayKey, pairingOffers, normalizeOrigin, readServerConfig, writeServerConfig, removeServerConfig, readServerBinding, resolveRelayOrigin };
143
+ export { DevicesDoc, ensureDevices, RevocationsDoc, admitDevice, loadHostKey, loadRelayKey, pairingOffers };
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  connectRemoteDurable
3
- } from "./chunk-4sepcfpy.js";
4
- import"./chunk-jgd38rna.js";
3
+ } from "./chunk-np4jd070.js";
4
+ import"./chunk-47ff1d1t.js";
5
5
  import {
6
6
  isLoopbackUrl
7
- } from "./chunk-sygeb9qb.js";
7
+ } from "./chunk-pqe7q1s7.js";
8
8
  import {
9
9
  hostAddress
10
10
  } from "./chunk-ngf1zatm.js";
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ main,
4
+ reachabilityLine,
5
+ restartService,
6
+ serviceStatusJson,
7
+ startService,
8
+ stopService,
9
+ versionLine
10
+ } from "./chunk-t5abqsva.js";
11
+ import"./chunk-np4jd070.js";
12
+ import"./chunk-kzbzacz9.js";
13
+ import"./chunk-47ff1d1t.js";
14
+ import"./chunk-pqe7q1s7.js";
15
+ import"./chunk-ngf1zatm.js";
16
+ import"./chunk-7wj0jh3t.js";
17
+ import"./chunk-df32avw6.js";
18
+ export {
19
+ versionLine,
20
+ stopService,
21
+ startService,
22
+ serviceStatusJson,
23
+ restartService,
24
+ reachabilityLine,
25
+ main
26
+ };
package/dist/pinomad.js CHANGED
@@ -5,27 +5,34 @@ import {
5
5
  } from "./chunk-kzbzacz9.js";
6
6
  import {
7
7
  packagedVersion
8
- } from "./chunk-zehwx009.js";
8
+ } from "./chunk-7wj0jh3t.js";
9
9
  import {
10
10
  __require
11
11
  } from "./chunk-df32avw6.js";
12
12
 
13
13
  // apps/cli/src/pinomad.ts
14
14
  var COMMANDS = {
15
- host: () => import("./chunk-czj9nfrz.js"),
16
- server: () => import("./chunk-p978qj9m.js"),
17
- relay: () => import("./chunk-p978qj9m.js"),
18
- service: () => import("./chunk-bhtx2c8a.js"),
19
- upgrade: () => import("./chunk-73efzaf1.js"),
20
- link: () => import("./chunk-c5p9xkd8.js"),
21
- pair: () => import("./chunk-vax4zspw.js"),
22
- join: () => import("./chunk-c05g401k.js"),
23
- leave: () => import("./chunk-5791mb0b.js")
15
+ up: () => import("./chunk-5qf1grkk.js"),
16
+ status: () => import("./chunk-41q0saz0.js"),
17
+ host: () => import("./chunk-ksfxqd8s.js"),
18
+ server: () => import("./chunk-mnmqyq7d.js"),
19
+ relay: () => import("./chunk-mnmqyq7d.js"),
20
+ service: () => import("./chunk-vx7dy07y.js"),
21
+ upgrade: () => import("./chunk-jeqsdcj1.js"),
22
+ link: () => import("./chunk-aqj9wfmb.js"),
23
+ pair: () => import("./chunk-vqkb70d7.js"),
24
+ join: () => import("./chunk-42nqtx5r.js"),
25
+ leave: () => import("./chunk-agq4tn9r.js")
24
26
  };
25
27
  var USAGE = `pinomad — PiNomad host, server, and utilities
26
28
 
27
29
  usage: pinomad <command> [args…]
28
30
 
31
+ up [--server] [--lan] [--yes] set this host up: account, LAN, service
32
+ up --origin URL --remote-port N server to join (app.pinomad.si), LAN port (7422)
33
+ up --no-server|--no-lan [--data-dir D] turn a path off; with no flags, up asks
34
+ up --code join by a printed code (e.g. from another device), not this browser
35
+ status [--data-dir D] joined server and account, LAN, service, host
29
36
  host [--data-dir DIR] [--port 7420] [--project DIR]… run the host in the foreground
30
37
  host --remote-port PORT [--public-url URL] remote access, LAN (ADR-0008)
31
38
  host --relay URL remote access via relay (ADR-0015)
@@ -33,11 +40,11 @@ usage: pinomad <command> [args…]
33
40
  server --public-origin O [--data-dir D] [--trust-proxy] run the server
34
41
  server passwd [--data-dir D] [--user U] reset an account's password (stdin)
35
42
  relay … old name of server
36
- service install|uninstall|status|restart|logs user-level host service
43
+ service install|uninstall|status|restart|stop|start|logs user-level host service
37
44
  upgrade [--force] [address flags] upgrade the package and restart the service
38
45
  link [--data-dir D|--url U …] print the browser link
39
46
  pair [--data-dir D|--url U …] print a pairing QR
40
- join <origin> <token> [--data-dir D] join this host to a server account
47
+ join <origin> [token] [--code] [--data-dir D] join this host to a server account
41
48
  leave [--data-dir D] leave the server account
42
49
  --version, -v print the version
43
50
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinomad",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "description": "PiNomad — self-hosted coding agent: host, relay, and web client in one package",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -26,6 +26,7 @@
26
26
  "@earendil-works/pi-coding-agent": "1.4.0",
27
27
  "@earendil-works/pi-durable": "1.4.0",
28
28
  "@earendil-works/pi-mcp": "1.4.0",
29
+ "@lydell/node-pty": "1.2.0-beta.18",
29
30
  "@noble/curves": "2.4.0",
30
31
  "diff": "8.0.4",
31
32
  "node-datachannel": "0.33.4",
@@ -0,0 +1 @@
1
+ import e from"./json-Cp-IABpG.js";import t from"./javascript-wDzz0qaB.js";import r from"./typescript-BPQ3VLAy.js";import a from"./css-Z72CF80r.js";import{p as n}from"./postcss-DnzrXTVv.js";import s from"./tsx-COt5Ahok.js";const i=Object.freeze(JSON.parse(`{"displayName":"Astro","fileTypes":["astro"],"injections":{"L:(meta.script.astro) (meta.lang.js | meta.lang.javascript | meta.lang.partytown | meta.lang.node) - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.js","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.js"}]}]},"L:(meta.script.astro) (meta.lang.json) - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.json","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.json"}]}]},"L:(meta.script.astro) (meta.lang.ts | meta.lang.typescript) - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.ts","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.ts"}]}]},"L:meta.script.astro - meta.lang - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.js","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.js"}]}]},"L:meta.style.astro - meta.lang - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.css","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.css"}]}]},"L:meta.style.astro meta.lang.css - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.css","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.css"}]}]},"L:meta.style.astro meta.lang.less - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.css.less","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.css.less"}]}]},"L:meta.style.astro meta.lang.postcss - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.css.postcss","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.css.postcss"}]}]},"L:meta.style.astro meta.lang.sass - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.sass","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.sass"}]}]},"L:meta.style.astro meta.lang.scss - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.css.scss","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.css.scss"}]}]},"L:meta.style.astro meta.lang.stylus - (meta source)":{"patterns":[{"begin":"(?<=>)(?!</)","contentName":"source.stylus","end":"(?=</)","name":"meta.embedded.block.astro","patterns":[{"include":"source.stylus"}]}]}},"name":"astro","patterns":[{"include":"#scope"},{"include":"#frontmatter"},{"include":"#text"}],"repository":{"attribute-literal":{"begin":"(\`)","end":"\\\\1","name":"string.template.astro","patterns":[{"include":"source.tsx#template-substitution-element"},{"include":"source.tsx#string-character-escape"}]},"attributes":{"patterns":[{"include":"#attributes-events"},{"include":"#attributes-keyvalue"},{"include":"#attributes-interpolated"}]},"attributes-events":{"begin":"(on(s(croll|t(orage|alled)|u(spend|bmit)|e(curitypolicyviolation|ek(ing|ed)|lect))|hashchange|c(hange|o(ntextmenu|py)|u(t|echange)|l(ick|ose)|an(cel|play(through)?))|t(imeupdate|oggle)|in(put|valid)|o((?:n|ff)line)|d(urationchange|r(op|ag(start|over|e(n(ter|d)|xit)|leave)?)|blclick)|un(handledrejection|load)|p(opstate|lay(ing)?|a(ste|use|ge(show|hide))|rogress)|e(nded|rror|mptied)|volumechange|key(down|up|press)|focus|w(heel|aiting)|l(oad(start|e(nd|d((?:|meta)data)))?|anguagechange)|a(uxclick|fterprint|bort)|r(e(s(ize|et)|jectionhandled)|atechange)|m(ouse(o(ut|ver)|down|up|enter|leave|move)|essage(error)?)|b(efore(unload|print)|lur)))(?![-:\\\\\\\\w])","beginCaptures":{"0":{"patterns":[{"match":".*","name":"entity.other.attribute-name.astro"}]}},"end":"(?=\\\\s*+[^=\\\\s])","name":"meta.attribute.$1.astro","patterns":[{"begin":"=","beginCaptures":{"0":{"name":"punctuation.separator.key-value.astro"}},"end":"(?<=[^=\\\\s])(?!\\\\s*=)|(?=/?>)","patterns":[{"include":"#interpolation"},{"include":"#attribute-literal"},{"begin":"(?=[^/<=>\`\\\\s]|/(?!>))","end":"(?!\\\\G)","name":"meta.embedded.line.js","patterns":[{"captures":{"0":{"name":"source.js"},"1":{"patterns":[{"include":"source.js"}]}},"match":"(([^\\"'/<=>\`\\\\s]|/(?!>))+)","name":"string.unquoted.astro"},{"begin":"(\\")","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.astro"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.string.end.astro"}},"name":"string.quoted.astro","patterns":[{"captures":{"0":{"patterns":[{"include":"source.js"}]}},"match":"([^\\\\n\\"/]|/(?![*/]))+"},{"begin":"//","beginCaptures":{"0":{"name":"punctuation.definition.comment.js"}},"end":"(?=\\")|\\\\n","name":"comment.line.double-slash.js"},{"begin":"/\\\\*","beginCaptures":{"0":{"name":"punctuation.definition.comment.begin.js"}},"end":"(?=\\")|\\\\*/","endCaptures":{"0":{"name":"punctuation.definition.comment.end.js"}},"name":"comment.block.js"}]},{"begin":"(')","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.astro"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.string.end.astro"}},"name":"string.quoted.astro","patterns":[{"captures":{"0":{"patterns":[{"include":"source.js"}]}},"match":"([^\\\\n'/]|/(?![*/]))+"},{"begin":"//","beginCaptures":{"0":{"name":"punctuation.definition.comment.js"}},"end":"(?=')|\\\\n","name":"comment.line.double-slash.js"},{"begin":"/\\\\*","beginCaptures":{"0":{"name":"punctuation.definition.comment.begin.js"}},"end":"(?=')|\\\\*/","endCaptures":{"0":{"name":"punctuation.definition.comment.end.js"}},"name":"comment.block.js"}]}]}]}]},"attributes-interpolated":{"begin":"(?<![:=])\\\\s*(\\\\{)","contentName":"meta.embedded.expression.astro source.tsx","end":"(})","patterns":[{"include":"source.tsx"}]},"attributes-keyvalue":{"begin":"([$@_[:alpha:]][-$.:_[:alnum:]]*)","beginCaptures":{"0":{"patterns":[{"match":".*","name":"entity.other.attribute-name.astro"}]}},"end":"(?=\\\\s*+[^=\\\\s])","name":"meta.attribute.$1.astro","patterns":[{"begin":"=","beginCaptures":{"0":{"name":"punctuation.separator.key-value.astro"}},"end":"(?<=[^=\\\\s])(?!\\\\s*=)|(?=/?>)","patterns":[{"include":"#attributes-value"}]}]},"attributes-value":{"patterns":[{"include":"#interpolation"},{"match":"([^\\"'/<=>\`\\\\s]|/(?!>))+","name":"string.unquoted.astro"},{"begin":"([\\"'])","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.astro"}},"end":"\\\\1","endCaptures":{"0":{"name":"punctuation.definition.string.end.astro"}},"name":"string.quoted.astro"},{"include":"#attribute-literal"}]},"comments":{"begin":"<!--","captures":{"0":{"name":"punctuation.definition.comment.astro"}},"end":"-->","name":"comment.block.astro","patterns":[{"match":"\\\\G-?>|<!--(?!>)|<!-(?=-->)|--!>","name":"invalid.illegal.characters-not-allowed-here.astro"}]},"entities":{"patterns":[{"captures":{"1":{"name":"punctuation.definition.entity.astro"},"912":{"name":"punctuation.definition.entity.astro"}},"match":"(&)(?=[A-Za-z])((a(s(ymp(eq)?|cr|t)|n(d(slope|[dv]|and)?|g(s(t|ph)|zarr|e|le|rt(vb(d)?)?|msd(a([a-h]))?)?)|c(y|irc|d|ute|E)?|tilde|o(pf|gon)|uml|p(id|os|prox(eq)?|[Ee]|acir)?|elig|f(r)?|w((?:con|)int)|l(pha|e(ph|fsym))|acute|ring|grave|m(p|a(cr|lg))|breve)|A(s(sign|cr)|nd|MP|c(y|irc)|tilde|o(pf|gon)|uml|pplyFunction|fr|Elig|lpha|acute|ring|grave|macr|breve))|(B(scr|cy|opf|umpeq|e(cause|ta|rnoullis)|fr|a(ckslash|r(v|wed))|reve)|b(s(cr|im(e)?|ol(hsub|b)?|emi)|n(ot|e(quiv)?)|c(y|ong)|ig(s(tar|qcup)|c(irc|up|ap)|triangle(down|up)|o(times|dot|plus)|uplus|vee|wedge)|o(t(tom)?|pf|wtie|x(h([DUdu])?|times|H([DUdu])?|d([LRlr])|u([LRlr])|plus|D([LRlr])|v([HLRhlr])?|U([LRlr])|V([HLRhlr])?|minus|box))|Not|dquo|u(ll(et)?|mp(e(q)?|E)?)|prime|e(caus(e)?|t(h|ween|a)|psi|rnou|mptyv)|karow|fr|l(ock|k(1([24])|34)|a(nk|ck(square|triangle(down|left|right)?|lozenge)))|a(ck(sim(eq)?|cong|prime|epsilon)|r(vee|wed(ge)?))|r(eve|vbar)|brk(tbrk)?))|(c(s(cr|u(p(e)?|b(e)?))|h(cy|i|eck(mark)?)|ylcty|c(irc|ups(sm)?|edil|a(ps|ron))|tdot|ir(scir|c(eq|le(d(R|circ|S|dash|ast)|arrow(left|right)))?|e|fnint|E|mid)?|o(n(int|g(dot)?)|p(y(sr)?|f|rod)|lon(e(q)?)?|m(p(fn|le(xes|ment))?|ma(t)?))|dot|u(darr([lr])|p(s|c([au]p)|or|dot|brcap)?|e(sc|pr)|vee|wed|larr(p)?|r(vearrow(left|right)|ly(eq(succ|prec)|vee|wedge)|arr(m)?|ren))|e(nt(erdot)?|dil|mptyv)|fr|w((?:con|)int)|lubs(uit)?|a(cute|p(s|c([au]p)|dot|and|brcup)?|r(on|et))|r(oss|arr))|C(scr|hi|c(irc|onint|edil|aron)|ircle(Minus|Times|Dot|Plus)|Hcy|o(n(tourIntegral|int|gruent)|unterClockwiseContourIntegral|p(f|roduct)|lon(e)?)|dot|up(Cap)?|OPY|e(nterDot|dilla)|fr|lo(seCurly((?:Double|)Quote)|ckwiseContourIntegral)|a(yleys|cute|p(italDifferentialD)?)|ross))|(d(s(c([ry])|trok|ol)|har([lr])|c(y|aron)|t(dot|ri(f)?)|i(sin|e|v(ide(ontimes)?|onx)?|am(s|ond(suit)?)?|gamma)|Har|z(cy|igrarr)|o(t(square|plus|eq(dot)?|minus)?|ublebarwedge|pf|wn(harpoon(left|right)|downarrows|arrow)|llar)|d(otseq|a(rr|gger))?|u(har|arr)|jcy|e(lta|g|mptyv)|f(isht|r)|wangle|lc(orn|rop)|a(sh(v)?|leth|rr|gger)|r(c(orn|rop)|bkarow)|b(karow|lac)|Arr)|D(s(cr|trok)|c(y|aron)|Scy|i(fferentialD|a(critical(Grave|Tilde|Do(t|ubleAcute)|Acute)|mond))|o(t(Dot|Equal)?|uble(Right(Tee|Arrow)|ContourIntegral|Do(t|wnArrow)|Up((?:Down|)Arrow)|VerticalBar|L(ong(RightArrow|Left((?:Right|)Arrow))|eft(RightArrow|Tee|Arrow)))|pf|wn(Right(TeeVector|Vector(Bar)?)|Breve|Tee(Arrow)?|arrow|Left(RightVector|TeeVector|Vector(Bar)?)|Arrow(Bar|UpArrow)?))|Zcy|el(ta)?|D(otrahd)?|Jcy|fr|a(shv|rr|gger)))|(e(s(cr|im|dot)|n(sp|g)|c(y|ir(c)?|olon|aron)|t([ah])|o(pf|gon)|dot|u(ro|ml)|p(si(v|lon)?|lus|ar(sl)?)|e|D(D??ot)|q(s(im|lant(less|gtr))|c(irc|olon)|u(iv(DD)?|est|als)|vparsl)|f(Dot|r)|l(s(dot)?|inters|l)?|a(ster|cute)|r(Dot|arr)|g(s(dot)?|rave)?|x(cl|ist|p(onentiale|ectation))|m(sp(1([34]))?|pty(set|v)?|acr))|E(s(cr|im)|c(y|irc|aron)|ta|o(pf|gon)|NG|dot|uml|TH|psilon|qu(ilibrium|al(Tilde)?)|fr|lement|acute|grave|x(ists|ponentialE)|m(pty((?:|Very)SmallSquare)|acr)))|(f(scr|nof|cy|ilig|o(pf|r(k(v)?|all))|jlig|partint|emale|f(ilig|l(l??ig)|r)|l(tns|lig|at)|allingdotseq|r(own|a(sl|c(1([2-68])|78|2([35])|3([458])|45|5([68])))))|F(scr|cy|illed((?:|Very)SmallSquare)|o(uriertrf|pf|rAll)|fr))|(G(scr|c(y|irc|edil)|t|opf|dot|T|Jcy|fr|amma(d)?|reater(Greater|SlantEqual|Tilde|Equal(Less)?|FullEqual|Less)|g|breve)|g(s(cr|im([el])?)|n(sim|e(q(q)?)?|E|ap(prox)?)|c(y|irc)|t(c(c|ir)|dot|quest|lPar|r(sim|dot|eq(q?less)|less|a(pprox|rr)))?|imel|opf|dot|jcy|e(s(cc|dot(o(l)?)?|l(es)?)?|q(slant|q)?|l)?|v(nE|ertneqq)|fr|E(l)?|l([Eaj])?|a(cute|p|mma(d)?)|rave|g(g)?|breve))|(h(s(cr|trok|lash)|y(phen|bull)|circ|o(ok((?:lef|righ)tarrow)|pf|arr|rbar|mtht)|e(llip|arts(uit)?|rcon)|ks([ew]arow)|fr|a(irsp|lf|r(dcy|r(cir|w)?)|milt)|bar|Arr)|H(s(cr|trok)|circ|ilbertSpace|o(pf|rizontalLine)|ump(DownHump|Equal)|fr|a(cek|t)|ARDcy))|(i(s(cr|in(s(v)?|dot|[Ev])?)|n(care|t(cal|prod|e(rcal|gers)|larhk)?|odot|fin(tie)?)?|c(y|irc)?|t(ilde)?|i(nfin|i(i??nt)|ota)?|o(cy|ta|pf|gon)|u(kcy|ml)|jlig|prod|e(cy|xcl)|quest|f([fr])|acute|grave|m(of|ped|a(cr|th|g(part|e|line))))|I(scr|n(t(e(rsection|gral))?|visible(Comma|Times))|c(y|irc)|tilde|o(ta|pf|gon)|dot|u(kcy|ml)|Ocy|Jlig|fr|Ecy|acute|grave|m(plies|a(cr|ginaryI))?))|(j(s(cr|ercy)|c(y|irc)|opf|ukcy|fr|math)|J(s(cr|ercy)|c(y|irc)|opf|ukcy|fr))|(k(scr|hcy|c(y|edil)|opf|jcy|fr|appa(v)?|green)|K(scr|c(y|edil)|Hcy|opf|Jcy|fr|appa))|(l(s(h|cr|trok|im([eg])?|q(uo(r)?|b)|aquo)|h(ar(d|u(l)?)|blk)|n(sim|e(q(q)?)?|E|ap(prox)?)|c(y|ub|e(d??il)|aron)|Barr|t(hree|c(c|ir)|imes|dot|quest|larr|r(i([ef])?|Par))?|Har|o(ng(left((?:|right)arrow)|rightarrow|mapsto)|times|z(enge|f)?|oparrow(left|right)|p(f|lus|ar)|w(ast|bar)|a(ng|rr)|brk)|d(sh|ca|quo(r)?|r((?:d|us)har))|ur((?:ds|u)har)|jcy|par(lt)?|e(s(s(sim|dot|eq(q?gtr)|approx|gtr)|cc|dot(o(r)?)?|g(es)?)?|q(slant|q)?|ft(harpoon(down|up)|threetimes|leftarrows|arrow(tail)?|right(squigarrow|harpoons|arrow(s)?))|g)?|v(nE|ertneqq)|f(isht|loor|r)|E(g)?|l(hard|corner|tri|arr)?|a(ng(d|le)?|cute|t(e(s)?|ail)?|p|emptyv|quo|rr(sim|hk|tl|pl|fs|lp|b(fs)?)?|gran|mbda)|r(har(d)?|corner|tri|arr|m)|g(E)?|m(idot|oust(ache)?)|b(arr|r(k(sl([du])|e)|ac([ek]))|brk)|A(tail|arr|rr))|L(s(h|cr|trok)|c(y|edil|aron)|t|o(ng(RightArrow|left((?:|right)arrow)|rightarrow|Left((?:Right|)Arrow))|pf|wer((?:Righ|Lef)tArrow))|T|e(ss(Greater|SlantEqual|Tilde|EqualGreater|FullEqual|Less)|ft(Right(Vector|Arrow)|Ceiling|T(ee(Vector|Arrow)?|riangle(Bar|Equal)?)|Do(ubleBracket|wn(TeeVector|Vector(Bar)?))|Up(TeeVector|DownVector|Vector(Bar)?)|Vector(Bar)?|arrow|rightarrow|Floor|A(ngleBracket|rrow(RightArrow|Bar)?)))|Jcy|fr|l(eftarrow)?|a(ng|cute|placetrf|rr|mbda)|midot))|(M(scr|cy|inusPlus|opf|u|e(diumSpace|llintrf)|fr|ap)|m(s(cr|tpos)|ho|nplus|c(y|omma)|i(nus(d(u)?|b)?|cro|d(cir|dot|ast)?)|o(dels|pf)|dash|u((?:lti|)map)?|p|easuredangle|DDot|fr|l(cp|dr)|a(cr|p(sto(down|up|left)?)?|l(t(ese)?|e)|rker)))|(n(s(hort(parallel|mid)|c(cue|[er])?|im(e(q)?)?|u(cc(eq)?|p(set(eq(q)?)?|[Ee])?|b(set(eq(q)?)?|[Ee])?)|par|qsu([bp]e)|mid)|Rightarrow|h(par|arr|Arr)|G(t(v)?|g)|c(y|ong(dot)?|up|edil|a(p|ron))|t(ilde|lg|riangle(left(eq)?|right(eq)?)|gl)|i(s(d)?|v)?|o(t(ni(v([abc]))?|in(dot|v([abc])|E)?)?|pf)|dash|u(m(sp|ero)?)?|jcy|p(olint|ar(sl|t|allel)?|r(cue|e(c(eq)?)?)?)|e(s(im|ear)|dot|quiv|ar(hk|r(ow)?)|xist(s)?|Arr)?|v(sim|infin|Harr|dash|Dash|l(t(rie)?|e|Arr)|ap|r(trie|Arr)|g([et]))|fr|w(near|ar(hk|r(ow)?)|Arr)|V([Dd]ash)|l(sim|t(ri(e)?)?|dr|e(s(s)?|q(slant|q)?|ft((?:|right)arrow))?|E|arr|Arr)|a(ng|cute|tur(al(s)?)?|p(id|os|prox|E)?|bla)|r(tri(e)?|ightarrow|arr([cw])?|Arr)|g(sim|t(r)?|e(s|q(slant|q)?)?|E)|mid|L(t(v)?|eft((?:|right)arrow)|l)|b(sp|ump(e)?))|N(scr|c(y|edil|aron)|tilde|o(nBreakingSpace|Break|t(R(ightTriangle(Bar|Equal)?|everseElement)|Greater(Greater|SlantEqual|Tilde|Equal|FullEqual|Less)?|S(u(cceeds(SlantEqual|Tilde|Equal)?|perset(Equal)?|bset(Equal)?)|quareSu(perset(Equal)?|bset(Equal)?))|Hump(DownHump|Equal)|Nested(GreaterGreater|LessLess)|C(ongruent|upCap)|Tilde(Tilde|Equal|FullEqual)?|DoubleVerticalBar|Precedes((?:Slant|)Equal)?|E(qual(Tilde)?|lement|xists)|VerticalBar|Le(ss(Greater|SlantEqual|Tilde|Equal|Less)?|ftTriangle(Bar|Equal)?))?|pf)|u|e(sted(GreaterGreater|LessLess)|wLine|gative(MediumSpace|Thi((?:n|ck)Space)|VeryThinSpace))|Jcy|fr|acute))|(o(s(cr|ol|lash)|h(m|bar)|c(y|ir(c)?)|ti(lde|mes(as)?)|S|int|opf|d(sold|iv|ot|ash|blac)|uml|p(erp|lus|ar)|elig|vbar|f(cir|r)|l(c(ir|ross)|t|ine|arr)|a(st|cute)|r(slope|igof|or|d(er(of)?|[fm])?|v|arr)?|g(t|on|rave)|m(i(nus|cron|d)|ega|acr))|O(s(cr|lash)|c(y|irc)|ti(lde|mes)|opf|dblac|uml|penCurly((?:Double|)Quote)|ver(B(ar|rac(e|ket))|Parenthesis)|fr|Elig|acute|r|grave|m(icron|ega|acr)))|(p(s(cr|i)|h(i(v)?|one|mmat)|cy|i(tchfork|v)?|o(intint|und|pf)|uncsp|er(cnt|tenk|iod|p|mil)|fr|l(us(sim|cir|two|d([ou])|e|acir|mn|b)?|an(ck(h)?|kv))|ar(s(im|l)|t|a(llel)?)?|r(sim|n(sim|E|ap)|cue|ime(s)?|o(d|p(to)?|f(surf|line|alar))|urel|e(c(sim|n(sim|eqq|approx)|curlyeq|eq|approx)?)?|E|ap)?|m)|P(s(cr|i)|hi|cy|i|o(incareplane|pf)|fr|lusMinus|artialD|r(ime|o(duct|portion(al)?)|ecedes(SlantEqual|Tilde|Equal)?)?))|(q(scr|int|opf|u(ot|est(eq)?|at(int|ernions))|prime|fr)|Q(scr|opf|UOT|fr))|(R(s(h|cr)|ho|c(y|edil|aron)|Barr|ight(Ceiling|T(ee(Vector|Arrow)?|riangle(Bar|Equal)?)|Do(ubleBracket|wn(TeeVector|Vector(Bar)?))|Up(TeeVector|DownVector|Vector(Bar)?)|Vector(Bar)?|arrow|Floor|A(ngleBracket|rrow(Bar|LeftArrow)?))|o(undImplies|pf)|uleDelayed|e(verse(UpEquilibrium|E(quilibrium|lement)))?|fr|EG|a(ng|cute|rr(tl)?)|rightarrow)|r(s(h|cr|q(uo(r)?|b)|aquo)|h(o(v)?|ar(d|u(l)?))|nmid|c(y|ub|e(d??il)|aron)|Barr|t(hree|imes|ri([ef]|ltri)?)|i(singdotseq|ng|ght(squigarrow|harpoon(down|up)|threetimes|left(harpoons|arrows)|arrow(tail)?|rightarrows))|Har|o(times|p(f|lus|ar)|a(ng|rr)|brk)|d(sh|ca|quo(r)?|ldhar)|uluhar|p(polint|ar(gt)?)|e(ct|al(s|ine|part)?|g)|f(isht|loor|r)|l(har|arr|m)|a(ng([de]|le)?|c(ute|e)|t(io(nals)?|ail)|dic|emptyv|quo|rr(sim|hk|c|tl|pl|fs|w|lp|ap|b(fs)?)?)|rarr|x|moust(ache)?|b(arr|r(k(sl([du])|e)|ac([ek]))|brk)|A(tail|arr|rr)))|(s(s(cr|tarf|etmn|mile)|h(y|c(hcy|y)|ort(parallel|mid)|arp)|c(sim|y|n(sim|E|ap)|cue|irc|polint|e(dil)?|E|a(p|ron))?|t(ar(f)?|r(ns|aight(phi|epsilon)))|i(gma([fv])?|m(ne|dot|plus|e(q)?|l(E)?|rarr|g(E)?)?)|zlig|o(pf|ftcy|l(b(ar)?)?)|dot([be])?|u(ng|cc(sim|n(sim|eqq|approx)|curlyeq|eq|approx)?|p(s(im|u([bp])|et(neq(q)?|eq(q)?)?)|hs(ol|ub)|1|n([Ee])|2|d(sub|ot)|3|plus|e(dot)?|E|larr|mult)?|m|b(s(im|u([bp])|et(neq(q)?|eq(q)?)?)|n([Ee])|dot|plus|e(dot)?|E|rarr|mult)?)|pa(des(uit)?|r)|e(swar|ct|tm(n|inus)|ar(hk|r(ow)?)|xt|mi|Arr)|q(su(p(set(eq)?|e)?|b(set(eq)?|e)?)|c(up(s)?|ap(s)?)|u(f|ar([ef]))?)|fr(own)?|w(nwar|ar(hk|r(ow)?)|Arr)|larr|acute|rarr|m(t(e(s)?)?|i(d|le)|eparsl|a(shp|llsetminus))|bquo)|S(scr|hort((?:Right|Down|Up|Left)Arrow)|c(y|irc|edil|aron)?|tar|igma|H(cy|CHcy)|opf|u(c(hThat|ceeds(SlantEqual|Tilde|Equal)?)|p(set|erset(Equal)?)?|m|b(set(Equal)?)?)|OFTcy|q(uare(Su(perset(Equal)?|bset(Equal)?)|Intersection|Union)?|rt)|fr|acute|mallCircle))|(t(s(hcy|c([ry])|trok)|h(i(nsp|ck(sim|approx))|orn|e(ta(sym|v)?|re(4|fore))|k(sim|ap))|c(y|edil|aron)|i(nt|lde|mes(d|b(ar)?)?)|o(sa|p(cir|f(ork)?|bot)?|ea)|dot|prime|elrec|fr|w(ixt|ohead((?:lef|righ)tarrow))|a(u|rget)|r(i(sb|time|dot|plus|e|angle(down|q|left(eq)?|right(eq)?)?|minus)|pezium|ade)|brk)|T(s(cr|trok)|RADE|h(i((?:n|ck)Space)|e(ta|refore))|c(y|edil|aron)|S(H??cy)|ilde(Tilde|Equal|FullEqual)?|HORN|opf|fr|a([bu])|ripleDot))|(u(scr|h(ar([lr])|blk)|c(y|irc)|t(ilde|dot|ri(f)?)|Har|o(pf|gon)|d(har|arr|blac)|u(arr|ml)|p(si(h|lon)?|harpoon(left|right)|downarrow|uparrows|lus|arrow)|f(isht|r)|wangle|l(c(orn(er)?|rop)|tri)|a(cute|rr)|r(c(orn(er)?|rop)|tri|ing)|grave|m(l|acr)|br(cy|eve)|Arr)|U(scr|n(ion(Plus)?|der(B(ar|rac(e|ket))|Parenthesis))|c(y|irc)|tilde|o(pf|gon)|dblac|uml|p(si(lon)?|downarrow|Tee(Arrow)?|per((?:Righ|Lef)tArrow)|DownArrow|Equilibrium|arrow|Arrow(Bar|DownArrow)?)|fr|a(cute|rr(ocir)?)|ring|grave|macr|br(cy|eve)))|(v(s(cr|u(pn([Ee])|bn([Ee])))|nsu([bp])|cy|Bar(v)?|zigzag|opf|dash|prop|e(e(eq|bar)?|llip|r(t|bar))|Dash|fr|ltri|a(ngrt|r(s(igma|u(psetneq(q)?|bsetneq(q)?))|nothing|t(heta|riangle(left|right))|p(hi|i|ropto)|epsilon|kappa|r(ho)?))|rtri|Arr)|V(scr|cy|opf|dash(l)?|e(e|r(yThinSpace|t(ical(Bar|Separator|Tilde|Line))?|bar))|Dash|vdash|fr|bar))|(w(scr|circ|opf|p|e(ierp|d(ge(q)?|bar))|fr|r(eath)?)|W(scr|circ|opf|edge|fr))|(X(scr|i|opf|fr)|x(s(cr|qcup)|h([Aa]rr)|nis|c(irc|up|ap)|i|o(time|dot|p(f|lus))|dtri|u(tri|plus)|vee|fr|wedge|l([Aa]rr)|r([Aa]rr)|map))|(y(scr|c(y|irc)|icy|opf|u(cy|ml)|en|fr|ac(y|ute))|Y(scr|c(y|irc)|opf|uml|Icy|Ucy|fr|acute|Acy))|(z(scr|hcy|c(y|aron)|igrarr|opf|dot|e(ta|etrf)|fr|w(n?j)|acute)|Z(scr|c(y|aron)|Hcy|opf|dot|e(ta|roWidthSpace)|fr|acute)))(;)","name":"constant.character.entity.named.$2.astro"},{"captures":{"1":{"name":"punctuation.definition.entity.astro"},"3":{"name":"punctuation.definition.entity.astro"}},"match":"(&)#[0-9]+(;)","name":"constant.character.entity.numeric.decimal.astro"},{"captures":{"1":{"name":"punctuation.definition.entity.astro"},"3":{"name":"punctuation.definition.entity.astro"}},"match":"(&)#[Xx]\\\\h+(;)","name":"constant.character.entity.numeric.hexadecimal.astro"},{"match":"&(?=[0-9A-Za-z]+;)","name":"invalid.illegal.ambiguous-ampersand.astro"}]},"frontmatter":{"begin":"\\\\A(-{3})\\\\s*$","beginCaptures":{"1":{"name":"comment"}},"contentName":"source.ts","end":"(^|\\\\G)(-{3})|\\\\.{3}\\\\s*$","endCaptures":{"2":{"name":"comment"}},"patterns":[{"include":"source.ts"}]},"interpolation":{"patterns":[{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.section.embedded.begin.astro"}},"contentName":"meta.embedded.expression.astro source.tsx","end":"}","endCaptures":{"0":{"name":"punctuation.section.embedded.end.astro"}},"patterns":[{"begin":"\\\\G\\\\s*(?=\\\\{)","end":"(?<=})","patterns":[{"include":"source.tsx#object-literal"}]},{"include":"source.tsx"}]}]},"scope":{"patterns":[{"include":"#comments"},{"include":"#tags"},{"include":"#interpolation"},{"include":"#entities"}]},"tags":{"patterns":[{"include":"#tags-raw"},{"include":"#tags-lang"},{"include":"#tags-void"},{"include":"#tags-general-end"},{"include":"#tags-general-start"}]},"tags-end-node":{"captures":{"1":{"name":"meta.tag.end.astro punctuation.definition.tag.begin.astro"},"2":{"name":"meta.tag.end.astro","patterns":[{"include":"#tags-name"}]},"3":{"name":"meta.tag.end.astro punctuation.definition.tag.end.astro"},"4":{"name":"meta.tag.start.astro punctuation.definition.tag.end.astro"}},"match":"(</)(.*?)\\\\s*(>)|(/>)"},"tags-general-end":{"begin":"(</)([^/>\\\\s]*)","beginCaptures":{"1":{"name":"meta.tag.end.astro punctuation.definition.tag.begin.astro"},"2":{"name":"meta.tag.end.astro","patterns":[{"include":"#tags-name"}]}},"end":"(>)","endCaptures":{"1":{"name":"meta.tag.end.astro punctuation.definition.tag.end.astro"}},"name":"meta.scope.tag.$2.astro"},"tags-general-start":{"begin":"(<)([^/>\\\\s]*)","beginCaptures":{"0":{"patterns":[{"include":"#tags-start-node"}]}},"end":"(/?>)","endCaptures":{"1":{"name":"meta.tag.start.astro punctuation.definition.tag.end.astro"}},"name":"meta.scope.tag.$2.astro","patterns":[{"include":"#tags-start-attributes"}]},"tags-lang":{"begin":"<(s(?:cript|tyle))","beginCaptures":{"0":{"patterns":[{"include":"#tags-start-node"}]}},"end":"</\\\\1\\\\s*>|/>","endCaptures":{"0":{"patterns":[{"include":"#tags-end-node"}]}},"name":"meta.scope.tag.$1.astro meta.$1.astro","patterns":[{"begin":"\\\\G(?=\\\\s*[^>]*?(type|lang)\\\\s*=\\\\s*([\\"']?)(?:text/)?(application/ld\\\\+json)\\\\2)","end":"(?=</|/>)","name":"meta.lang.json.astro","patterns":[{"include":"#tags-lang-start-attributes"}]},{"begin":"\\\\G(?=\\\\s*[^>]*?(type|lang)\\\\s*=\\\\s*([\\"']?)(module)\\\\2)","end":"(?=</|/>)","name":"meta.lang.javascript.astro","patterns":[{"include":"#tags-lang-start-attributes"}]},{"begin":"\\\\G(?=\\\\s*[^>]*?(type|lang)\\\\s*=\\\\s*([\\"']?)(?:text/|application/)?([+/\\\\w]+)\\\\2)","end":"(?=</|/>)","name":"meta.lang.$3.astro","patterns":[{"include":"#tags-lang-start-attributes"}]},{"include":"#tags-lang-start-attributes"}]},"tags-lang-start-attributes":{"begin":"\\\\G","end":"(?=/>)|>","endCaptures":{"0":{"name":"punctuation.definition.tag.end.astro"}},"name":"meta.tag.start.astro","patterns":[{"include":"#attributes"}]},"tags-name":{"patterns":[{"match":"[A-Z][0-9A-Z_a-z]*","name":"support.class.component.astro"},{"match":"[a-z][0-:\\\\w]*-[-0-:\\\\w]*","name":"meta.tag.custom.astro entity.name.tag.astro"},{"match":"[a-z][-0-:\\\\w]*","name":"entity.name.tag.astro"}]},"tags-raw":{"begin":"<([^!/<>?\\\\s]+)(?=[^>]+is:raw).*?","beginCaptures":{"0":{"patterns":[{"include":"#tags-start-node"}]}},"contentName":"source.unknown","end":"</\\\\1\\\\s*>|/>","endCaptures":{"0":{"patterns":[{"include":"#tags-end-node"}]}},"name":"meta.scope.tag.$1.astro meta.raw.astro","patterns":[{"include":"#tags-lang-start-attributes"}]},"tags-start-attributes":{"begin":"\\\\G","end":"(?=/?>)","name":"meta.tag.start.astro","patterns":[{"include":"#attributes"}]},"tags-start-node":{"captures":{"1":{"name":"punctuation.definition.tag.begin.astro"},"2":{"patterns":[{"include":"#tags-name"}]}},"match":"(<)([^/>\\\\s]*)","name":"meta.tag.start.astro"},"tags-void":{"begin":"(<)(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)(?=\\\\s|/?>)","beginCaptures":{"1":{"name":"punctuation.definition.tag.begin.astro"},"2":{"name":"entity.name.tag.astro"}},"end":"/?>","endCaptures":{"0":{"name":"punctuation.definition.tag.begin.astro"}},"name":"meta.tag.void.astro","patterns":[{"include":"#attributes"}]},"text":{"patterns":[{"begin":"(?<=^|---|[>}])","end":"(?=[<{]|$)","name":"text.astro","patterns":[{"include":"#entities"}]}]}},"scopeName":"source.astro","embeddedLangs":["json","javascript","typescript","css","postcss","tsx"],"embeddedLangsLazy":["sass","scss","stylus","less"]}`)),m=[...e,...t,...r,...a,...n,...s,i];export{m as default};