@launchsecure/launch-kit 0.0.43 → 0.0.44
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.
|
@@ -519,11 +519,13 @@ function coerceEntry(raw, index) {
|
|
|
519
519
|
if (r.args !== void 0 && (!Array.isArray(r.args) || r.args.some((a) => typeof a !== "string"))) {
|
|
520
520
|
throw new Error(`[launch-kit-services] entry #${index}: args must be a string[]`);
|
|
521
521
|
}
|
|
522
|
+
const skipSpawn = r.skipSpawn === true || r.bin === "";
|
|
522
523
|
return {
|
|
523
524
|
name: r.name,
|
|
524
525
|
port: r.port,
|
|
525
526
|
bin: r.bin,
|
|
526
|
-
args: r.args ?? []
|
|
527
|
+
args: r.args ?? [],
|
|
528
|
+
skipSpawn
|
|
527
529
|
};
|
|
528
530
|
}
|
|
529
531
|
function validate(services) {
|
|
@@ -547,6 +549,9 @@ function validate(services) {
|
|
|
547
549
|
throw new Error(`[launch-kit-services] duplicate port ${s.port} (services must each listen on a unique port)`);
|
|
548
550
|
}
|
|
549
551
|
seenPorts.add(s.port);
|
|
552
|
+
if (!s.skipSpawn && s.bin === "") {
|
|
553
|
+
throw new Error(`[launch-kit-services] service "${s.name}" has an empty bin but is not ingress-only (skipSpawn) \u2014 nothing to spawn`);
|
|
554
|
+
}
|
|
550
555
|
}
|
|
551
556
|
return services;
|
|
552
557
|
}
|
|
@@ -707,7 +712,7 @@ async function fetchConnectorToken(input, tunnelId) {
|
|
|
707
712
|
async function setIngressConfig(input, tunnelId) {
|
|
708
713
|
const ingress = input.services.map((s) => ({
|
|
709
714
|
hostname: `${serviceLabel(s)}.${input.zone.name}`,
|
|
710
|
-
service: `http://
|
|
715
|
+
service: `http://127.0.0.1:${s.port}`
|
|
711
716
|
}));
|
|
712
717
|
ingress.push({ service: "http_status:404" });
|
|
713
718
|
const res = await cf({
|
|
@@ -190,11 +190,13 @@ function coerceEntry(raw, index) {
|
|
|
190
190
|
if (r.args !== void 0 && (!Array.isArray(r.args) || r.args.some((a) => typeof a !== "string"))) {
|
|
191
191
|
throw new Error(`[launch-kit-services] entry #${index}: args must be a string[]`);
|
|
192
192
|
}
|
|
193
|
+
const skipSpawn = r.skipSpawn === true || r.bin === "";
|
|
193
194
|
return {
|
|
194
195
|
name: r.name,
|
|
195
196
|
port: r.port,
|
|
196
197
|
bin: r.bin,
|
|
197
|
-
args: r.args ?? []
|
|
198
|
+
args: r.args ?? [],
|
|
199
|
+
skipSpawn
|
|
198
200
|
};
|
|
199
201
|
}
|
|
200
202
|
function validate(services) {
|
|
@@ -218,6 +220,9 @@ function validate(services) {
|
|
|
218
220
|
throw new Error(`[launch-kit-services] duplicate port ${s.port} (services must each listen on a unique port)`);
|
|
219
221
|
}
|
|
220
222
|
seenPorts.add(s.port);
|
|
223
|
+
if (!s.skipSpawn && s.bin === "") {
|
|
224
|
+
throw new Error(`[launch-kit-services] service "${s.name}" has an empty bin but is not ingress-only (skipSpawn) \u2014 nothing to spawn`);
|
|
225
|
+
}
|
|
221
226
|
}
|
|
222
227
|
return services;
|
|
223
228
|
}
|
|
@@ -363,7 +368,7 @@ async function fetchConnectorToken(input, tunnelId) {
|
|
|
363
368
|
async function setIngressConfig(input, tunnelId) {
|
|
364
369
|
const ingress = input.services.map((s) => ({
|
|
365
370
|
hostname: `${serviceLabel(s)}.${input.zone.name}`,
|
|
366
|
-
service: `http://
|
|
371
|
+
service: `http://127.0.0.1:${s.port}`
|
|
367
372
|
}));
|
|
368
373
|
ingress.push({ service: "http_status:404" });
|
|
369
374
|
const res = await cf({
|
|
@@ -138,7 +138,7 @@ async function fetchConnectorToken(input, tunnelId) {
|
|
|
138
138
|
async function setIngressConfig(input, tunnelId) {
|
|
139
139
|
const ingress = input.services.map((s) => ({
|
|
140
140
|
hostname: `${serviceLabel(s)}.${input.zone.name}`,
|
|
141
|
-
service: `http://
|
|
141
|
+
service: `http://127.0.0.1:${s.port}`
|
|
142
142
|
}));
|
|
143
143
|
ingress.push({ service: "http_status:404" });
|
|
144
144
|
const res = await cf({
|
|
@@ -610,7 +610,7 @@ var require_package = __commonJS({
|
|
|
610
610
|
"package.json"(exports2, module2) {
|
|
611
611
|
module2.exports = {
|
|
612
612
|
name: "@launchsecure/launch-kit",
|
|
613
|
-
version: "0.0.
|
|
613
|
+
version: "0.0.44",
|
|
614
614
|
description: "LaunchSecure toolkit \u2014 launch-sequencer (pipeline runner + terminal bridge), launch-radar (feedback webhook receiver), launch-chart (project graph MCP), launch-deck (visual playground MCP), launch-kit-beacon (feedback Web Component), launch-recall (file-watcher backup). launch-pod is the container image these run inside.",
|
|
615
615
|
license: "MIT",
|
|
616
616
|
author: "LaunchSecure - AutomateWithUs",
|
|
@@ -751,7 +751,11 @@ function cog(transform) {
|
|
|
751
751
|
function dish(transform) {
|
|
752
752
|
return `<g transform="${transform}" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 10a7.31 7.31 0 0 0 10 10Z" fill="currentColor"/><path d="m9 15 3-3" fill="none"/><path d="M17 13a6 6 0 0 0-6-6" fill="none"/><path d="M21 13A10 10 0 0 0 11 3" fill="none"/></g>`;
|
|
753
753
|
}
|
|
754
|
-
function roverMark(size, bg) {
|
|
754
|
+
function roverMark(size, bg, variant = "mini") {
|
|
755
|
+
if (variant === "full") {
|
|
756
|
+
const h2 = Math.round(size * 300 / 420);
|
|
757
|
+
return `<svg width="${size}" height="${h2}" viewBox="-60 0 420 300" fill="none" xmlns="http://www.w3.org/2000/svg" style="overflow:visible">` + armClaw(6, "translate(0,10)") + armClaw(6, "translate(320,10) scale(-1,1)") + `<g fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"><path d="M140 127 H180"/><path d="M160 127 V160"/></g><g fill="currentColor"><circle cx="140" cy="127" r="8"/><circle cx="160" cy="127" r="8"/><circle cx="180" cy="127" r="8"/></g><g fill="${bg}"><circle cx="140" cy="127" r="3"/><circle cx="160" cy="127" r="3"/><circle cx="180" cy="127" r="3"/></g><g transform="translate(40.6,70) scale(3.7)" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12 7 2"/><path d="m7 12 5-10"/><path d="m12 12 5-10"/><path d="m17 12 5-10"/><path d="M7.3 1.3h15"/><path d="M4.5 7h15"/><path d="M1.7 12.7h15"/><path d="M12 16v6"/></g><rect x="230" y="146" width="6" height="21" fill="currentColor"/>` + dish("translate(200,66) scale(4)") + `<path fill="currentColor" d="M61.95 148.09 L258.05 165.91 Q270 167 270 179 L270 228 Q270 240 258 240 L62 240 Q50 240 50 228 L50 159 Q50 147 61.95 148.09 Z"/><path fill="none" stroke="${bg}" stroke-width="6" stroke-linecap="round" d="M60 157.95 L260 176.13"/><g fill="${bg}"><circle cx="50" cy="240" r="44"/><circle cx="160" cy="240" r="44"/><circle cx="270" cy="240" r="44"/></g><g fill="currentColor"><circle cx="50" cy="240" r="38"/><circle cx="160" cy="240" r="38"/><circle cx="270" cy="240" r="38"/></g><g fill="none" stroke="${bg}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${cog("translate(32,222) scale(1.5)")}${cog("translate(142,222) scale(1.5)")}${cog("translate(252,222) scale(1.5)")}</g></svg>`;
|
|
758
|
+
}
|
|
755
759
|
const h = Math.round(size * 195 / 190);
|
|
756
760
|
return `<svg width="${size}" height="${h}" viewBox="25 0 190 195" fill="none" xmlns="http://www.w3.org/2000/svg" style="overflow:visible">` + armClaw(7, "translate(46.5,-6.6) scale(0.55)") + armClaw(7, "translate(193.5,-6.6) scale(-0.55,0.55)") + `<rect x="112" y="46" width="5" height="22" fill="currentColor"/>` + dish("translate(92.4,4.4) scale(2.3)") + `<path fill="currentColor" d="M84.15 65 L155.85 71.9 Q166.8 72.95 166.8 83.95 L166.8 119.55 Q166.8 130.55 155.8 130.55 L84.2 130.55 Q73.2 130.55 73.2 119.55 L73.2 74.95 Q73.2 63.95 84.15 65 Z"/><path fill="none" stroke="${bg}" stroke-width="3" stroke-linecap="round" d="M85 73 L155 80"/><g fill="${bg}"><circle cx="73" cy="131" r="29"/><circle cx="167" cy="131" r="29"/></g><g fill="currentColor"><circle cx="73" cy="131" r="24"/><circle cx="167" cy="131" r="24"/></g><g fill="none" stroke="${bg}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${cog("translate(59.8,117.8) scale(1.1)")}${cog("translate(153.8,117.8) scale(1.1)")}</g></svg>`;
|
|
757
761
|
}
|
|
@@ -793,7 +797,7 @@ function renderDashboard(state, pods) {
|
|
|
793
797
|
const runtime = state.defaultRuntime ?? "docker";
|
|
794
798
|
const roverName = state.name ?? shortId(state.roverId);
|
|
795
799
|
const body = pods.length === 0 ? `<div class="empty">
|
|
796
|
-
<div class="emptyicon" style="color:${C.primary}">${roverMark(
|
|
800
|
+
<div class="emptyicon" style="color:${C.primary}">${roverMark(104, C.card, "full")}</div>
|
|
797
801
|
<div class="big">No pods running</div>
|
|
798
802
|
<p class="muted">This rover is up and connected, but isn't handling any pods yet.</p>
|
|
799
803
|
<a class="btn" href="${esc(ls)}" target="_blank" rel="noopener">Launch a project in LaunchSecure \u2192</a>
|
|
@@ -1001,11 +1005,13 @@ function coerceEntry(raw, index) {
|
|
|
1001
1005
|
if (r.args !== void 0 && (!Array.isArray(r.args) || r.args.some((a) => typeof a !== "string"))) {
|
|
1002
1006
|
throw new Error(`[launch-kit-services] entry #${index}: args must be a string[]`);
|
|
1003
1007
|
}
|
|
1008
|
+
const skipSpawn = r.skipSpawn === true || r.bin === "";
|
|
1004
1009
|
return {
|
|
1005
1010
|
name: r.name,
|
|
1006
1011
|
port: r.port,
|
|
1007
1012
|
bin: r.bin,
|
|
1008
|
-
args: r.args ?? []
|
|
1013
|
+
args: r.args ?? [],
|
|
1014
|
+
skipSpawn
|
|
1009
1015
|
};
|
|
1010
1016
|
}
|
|
1011
1017
|
function validate(services) {
|
|
@@ -1029,6 +1035,9 @@ function validate(services) {
|
|
|
1029
1035
|
throw new Error(`[launch-kit-services] duplicate port ${s.port} (services must each listen on a unique port)`);
|
|
1030
1036
|
}
|
|
1031
1037
|
seenPorts.add(s.port);
|
|
1038
|
+
if (!s.skipSpawn && s.bin === "") {
|
|
1039
|
+
throw new Error(`[launch-kit-services] service "${s.name}" has an empty bin but is not ingress-only (skipSpawn) \u2014 nothing to spawn`);
|
|
1040
|
+
}
|
|
1032
1041
|
}
|
|
1033
1042
|
return services;
|
|
1034
1043
|
}
|
|
@@ -1582,7 +1591,7 @@ function buildPodEnv(state, spec, root, services) {
|
|
|
1582
1591
|
return env;
|
|
1583
1592
|
}
|
|
1584
1593
|
function servicesToEntries(services) {
|
|
1585
|
-
return services.map((s) => ({ name: s.name, port: s.port, bin: s.bin, args: s.args }));
|
|
1594
|
+
return services.map((s) => ({ name: s.name, port: s.port, bin: s.bin, args: s.args, skipSpawn: s.skipSpawn }));
|
|
1586
1595
|
}
|
|
1587
1596
|
function ensurePodDirs(root) {
|
|
1588
1597
|
const workspace = (0, import_node_path6.join)(root, "workspace");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@launchsecure/launch-kit",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.44",
|
|
4
4
|
"description": "LaunchSecure toolkit — launch-sequencer (pipeline runner + terminal bridge), launch-radar (feedback webhook receiver), launch-chart (project graph MCP), launch-deck (visual playground MCP), launch-kit-beacon (feedback Web Component), launch-recall (file-watcher backup). launch-pod is the container image these run inside.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "LaunchSecure - AutomateWithUs",
|