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.
- package/README.md +11 -9
- package/dist/chunk-41q0saz0.js +73 -0
- package/dist/chunk-42nqtx5r.js +22 -0
- package/dist/{chunk-wb10efyq.js → chunk-445cevpm.js} +1 -1
- package/dist/{chunk-jgd38rna.js → chunk-47ff1d1t.js} +206 -178
- package/dist/chunk-5qf1grkk.js +220 -0
- package/dist/{chunk-4h7pkkzr.js → chunk-7mn38n4f.js} +3 -3
- package/dist/{chunk-zehwx009.js → chunk-7wj0jh3t.js} +1 -1
- package/dist/{chunk-5791mb0b.js → chunk-agq4tn9r.js} +47 -23
- package/dist/{chunk-c5p9xkd8.js → chunk-aqj9wfmb.js} +3 -3
- package/dist/{chunk-cx8k63by.js → chunk-g3ahp7b9.js} +12 -1
- package/dist/chunk-gg2dcqbg.js +458 -0
- package/dist/{chunk-73efzaf1.js → chunk-jeqsdcj1.js} +30 -13
- package/dist/{chunk-czj9nfrz.js → chunk-ksfxqd8s.js} +500 -41
- package/dist/{chunk-p978qj9m.js → chunk-mnmqyq7d.js} +565 -39
- package/dist/{chunk-4sepcfpy.js → chunk-np4jd070.js} +155 -3
- package/dist/{chunk-v414b5pp.js → chunk-nppgxh6c.js} +2 -2
- package/dist/chunk-nq57fdnq.js +106 -0
- package/dist/{chunk-sygeb9qb.js → chunk-pqe7q1s7.js} +1 -1
- package/dist/{chunk-w2m9xkks.js → chunk-t5abqsva.js} +199 -72
- package/dist/{chunk-8gywfw5n.js → chunk-t91zt5f0.js} +2 -51
- package/dist/{chunk-vax4zspw.js → chunk-vqkb70d7.js} +3 -3
- package/dist/chunk-vx7dy07y.js +26 -0
- package/dist/pinomad.js +19 -12
- package/package.json +2 -1
- package/web/assets/astro-DOly5024.js +1 -0
- package/web/assets/c-BIGW1oBm.js +1 -0
- package/web/assets/core-DnpzcQzs.js +4 -0
- package/web/assets/cpp-DddhVWhK.js +1 -0
- package/web/assets/csharp-B_TYUkTI.js +1 -0
- package/web/assets/css-Z72CF80r.js +1 -0
- package/web/assets/dart-CtKP3W-j.js +1 -0
- package/web/assets/diff-D97Zzqfu.js +1 -0
- package/web/assets/dockerfile-BcOcwvcX.js +1 -0
- package/web/assets/elixir-DkJLSxtU.js +1 -0
- package/web/assets/engine-javascript-BHPwbUfN.js +141 -0
- package/web/assets/engine-oniguruma-CQjQPVHy.js +1 -0
- package/web/assets/fish-BvzEVeQv.js +1 -0
- package/web/assets/go-C27-OAKa.js +1 -0
- package/web/assets/graphql-ChdNCCLP.js +1 -0
- package/web/assets/haskell-Df6bDoY_.js +1 -0
- package/web/assets/hcl-BWvSN4gD.js +1 -0
- package/web/assets/highlighted-diff-Dn5ifsvK.js +175 -0
- package/web/assets/highlights-DnHv6NBM.js +4 -0
- package/web/assets/highlights-themes-CUdrlZk3.js +1 -0
- package/web/assets/html-BlS82ilI.js +1 -0
- package/web/assets/{index-DoyHMPwf.css → index-BV0ecolo.css} +1 -1
- package/web/assets/index-DNsTTgPE.js +396 -0
- package/web/assets/ini-BEwlwnbL.js +1 -0
- package/web/assets/java-CylS5w8V.js +1 -0
- package/web/assets/javascript-wDzz0qaB.js +1 -0
- package/web/assets/json-Cp-IABpG.js +1 -0
- package/web/assets/jsonc-Des-eS-w.js +1 -0
- package/web/assets/jsx-g9-lgVsj.js +1 -0
- package/web/assets/kotlin-BdnUsdx6.js +1 -0
- package/web/assets/less-B1dDrJ26.js +1 -0
- package/web/assets/lua-BaeVxFsk.js +1 -0
- package/web/assets/make-CHLpvVh8.js +1 -0
- package/web/assets/markdown-Cvjx9yec.js +1 -0
- package/web/assets/nix-CwoSXNpI.js +1 -0
- package/web/assets/objective-c-DXmwc3jG.js +1 -0
- package/web/assets/php-DoruYMF0.js +1 -0
- package/web/assets/pierre-dark-CyvmCCZW.js +1 -0
- package/web/assets/pierre-dark-VKo95ZgA.js +1 -0
- package/web/assets/pierre-light-480U9XYS.js +1 -0
- package/web/assets/pierre-light-BVSW-Xev.js +1 -0
- package/web/assets/postcss-DnzrXTVv.js +1 -0
- package/web/assets/powershell-Dd0kTxKP.js +1 -0
- package/web/assets/prisma-Vru482bI.js +1 -0
- package/web/assets/proto-C7zT0LnQ.js +1 -0
- package/web/assets/python-B6aJPvgy.js +1 -0
- package/web/assets/ruby-B43yHlf9.js +1 -0
- package/web/assets/rust-DPvrY3IQ.js +1 -0
- package/web/assets/scala-CqE71os6.js +1 -0
- package/web/assets/scss-Cw6XMfVs.js +1 -0
- package/web/assets/shellscript-Yzrsuije.js +1 -0
- package/web/assets/shiki-BuPP5HCg.js +2 -0
- package/web/assets/shiki-langs-FJk0v0Ga.js +2 -0
- package/web/assets/shiki-wasm-CgFRq91U.js +1 -0
- package/web/assets/sql-DkvoVjww.js +1 -0
- package/web/assets/stream-tokenizer-Bl6bisIa.js +4 -0
- package/web/assets/svelte-DoIXUgJc.js +1 -0
- package/web/assets/swift-C2oV4EkX.js +1 -0
- package/web/assets/terraform-BETggiCN.js +1 -0
- package/web/assets/theming-themes-BL_CC-Mm.js +1 -0
- package/web/assets/toml-vGWfd6FD.js +1 -0
- package/web/assets/tsx-COt5Ahok.js +1 -0
- package/web/assets/typescript-BPQ3VLAy.js +1 -0
- package/web/assets/vue-CwSeJimo.js +1 -0
- package/web/assets/xml-sdJ4AIDG.js +1 -0
- package/web/assets/xterm-view-6GBZ9nXN.css +32 -0
- package/web/assets/xterm-view-ZsuzJb2C.js +38 -0
- package/web/assets/yaml-Buea-lGh.js +1 -0
- package/web/assets/zig-VOosw3JB.js +1 -0
- package/web/index.html +2 -2
- package/dist/chunk-bhtx2c8a.js +0 -16
- package/dist/chunk-c05g401k.js +0 -170
- 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-
|
|
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
|
|
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 ===
|
|
88
|
+
if (arg === flag) {
|
|
89
89
|
i += 1;
|
|
90
90
|
continue;
|
|
91
91
|
}
|
|
92
|
-
if (arg.startsWith(
|
|
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(/"/g, '"').replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">").replace(/&/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
|
-
|
|
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
|
-
|
|
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
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
}
|
|
419
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
4
|
-
import"./chunk-
|
|
3
|
+
} from "./chunk-np4jd070.js";
|
|
4
|
+
import"./chunk-47ff1d1t.js";
|
|
5
5
|
import {
|
|
6
6
|
isLoopbackUrl
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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>
|
|
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.
|
|
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};
|