@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://localhost:${s.port}`
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://localhost:${s.port}`
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://localhost:${s.port}`
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.43",
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(56, C.card)}</div>
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.43",
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",