@launchsecure/launch-kit 0.0.44 → 0.0.46

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 (76) hide show
  1. package/dist/chart-client/assets/index-CXWFhknu.css +1 -0
  2. package/dist/chart-client/index.html +2 -2
  3. package/dist/client/assets/{index-BqiDfvZi.js → index-BQi0ccnm.js} +38 -38
  4. package/dist/client/assets/index-BxHD8tLY.css +32 -0
  5. package/dist/client/index.html +2 -2
  6. package/dist/council-client/assets/index-K5s7bSOk.css +1 -0
  7. package/dist/council-client/index.html +2 -2
  8. package/dist/deck-client/assets/{_baseUniq-C6w7kg8x.js → _baseUniq-Dc3nUqjn.js} +1 -1
  9. package/dist/deck-client/assets/{arc-Cx9pT3Nn.js → arc-Pk4Hg5AC.js} +1 -1
  10. package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-BITSj3vA.js → architectureDiagram-Q4EWVU46-ClHfwBM_.js} +1 -1
  11. package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-BehOFuwh.js → blockDiagram-DXYQGD6D-byyj3c2H.js} +1 -1
  12. package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-BZTYM4na.js → c4Diagram-AHTNJAMY-DAIz-EzX.js} +1 -1
  13. package/dist/deck-client/assets/channel-CrtYAG0j.js +1 -0
  14. package/dist/deck-client/assets/{chunk-4BX2VUAB-CCUx5CTd.js → chunk-4BX2VUAB-D9ILfgjn.js} +1 -1
  15. package/dist/deck-client/assets/{chunk-4TB4RGXK-UDZXXga6.js → chunk-4TB4RGXK-D5-01wU-.js} +1 -1
  16. package/dist/deck-client/assets/{chunk-55IACEB6-CfcU6PIW.js → chunk-55IACEB6-BQsygkyC.js} +1 -1
  17. package/dist/deck-client/assets/{chunk-EDXVE4YY-BK6F5Fof.js → chunk-EDXVE4YY-BEQCd4L_.js} +1 -1
  18. package/dist/deck-client/assets/{chunk-FMBD7UC4-C-2idlFB.js → chunk-FMBD7UC4-D347YT2V.js} +1 -1
  19. package/dist/deck-client/assets/{chunk-OYMX7WX6-D6hBkYLP.js → chunk-OYMX7WX6-CN_JK0dw.js} +1 -1
  20. package/dist/deck-client/assets/{chunk-QZHKN3VN-DixNpysA.js → chunk-QZHKN3VN-Bt2J1da-.js} +1 -1
  21. package/dist/deck-client/assets/{chunk-YZCP3GAM-Cd3pNBtQ.js → chunk-YZCP3GAM-CyG1EIPO.js} +1 -1
  22. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-C6PSTf3r.js +1 -0
  23. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-C6PSTf3r.js +1 -0
  24. package/dist/deck-client/assets/clone-00e5l4vU.js +1 -0
  25. package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-OF3JWdEt.js → cose-bilkent-S5V4N54A-pidjvoDW.js} +1 -1
  26. package/dist/deck-client/assets/{dagre-KV5264BT-Bqu-qcv4.js → dagre-KV5264BT-B7y7oCcY.js} +1 -1
  27. package/dist/deck-client/assets/{diagram-5BDNPKRD--0eHmUBS.js → diagram-5BDNPKRD-CCuv-nL4.js} +1 -1
  28. package/dist/deck-client/assets/{diagram-G4DWMVQ6-nss6oL20.js → diagram-G4DWMVQ6-UNm_Nh5Y.js} +1 -1
  29. package/dist/deck-client/assets/{diagram-MMDJMWI5-D_gSGnLR.js → diagram-MMDJMWI5-ozJ1XX_Q.js} +1 -1
  30. package/dist/deck-client/assets/{diagram-TYMM5635-BIt-P6Pk.js → diagram-TYMM5635-DbGkQand.js} +1 -1
  31. package/dist/deck-client/assets/{erDiagram-SMLLAGMA-Bi-E4KQm.js → erDiagram-SMLLAGMA-CyyS0CgV.js} +1 -1
  32. package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-DMJCvLMA.js → flowDiagram-DWJPFMVM-B5-cES0d.js} +1 -1
  33. package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-C3xgEoPD.js → ganttDiagram-T4ZO3ILL-8uB-aHPV.js} +1 -1
  34. package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-CD0BEGAW.js → gitGraphDiagram-UUTBAWPF-B3kn9oxf.js} +1 -1
  35. package/dist/deck-client/assets/{graph-Dtsd9Jwe.js → graph-48RwtCOC.js} +1 -1
  36. package/dist/deck-client/assets/{index-TFX8vtTG.js → index-B_IK1EJu.js} +1 -1
  37. package/dist/deck-client/assets/index-CvIV2mXs.css +1 -0
  38. package/dist/deck-client/assets/{infoDiagram-42DDH7IO-7IcQYqe_.js → infoDiagram-42DDH7IO-DG1xrRXV.js} +1 -1
  39. package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-DsCEbx3u.js → ishikawaDiagram-UXIWVN3A-vHZT8oXQ.js} +1 -1
  40. package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-1mP2JwCk.js → journeyDiagram-VCZTEJTY-BAAi_YhC.js} +1 -1
  41. package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-vT0Xrqh9.js → kanban-definition-6JOO6SKY-CfNP3Cu6.js} +1 -1
  42. package/dist/deck-client/assets/{layout-Cw4rS2pn.js → layout-DIXGbv3Y.js} +1 -1
  43. package/dist/deck-client/assets/{linear-CzOjL-Ih.js → linear-C9PVcQFx.js} +1 -1
  44. package/dist/deck-client/assets/{mermaid.core-DYi3A-qK.js → mermaid.core-w8AQRITb.js} +4 -4
  45. package/dist/deck-client/assets/{min-DstloRoL.js → min-B0k-NaRG.js} +1 -1
  46. package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-D-cCX2d2.js → mindmap-definition-QFDTVHPH-F3oNoTMv.js} +1 -1
  47. package/dist/deck-client/assets/{pieDiagram-DEJITSTG-BqW2NTmy.js → pieDiagram-DEJITSTG-tsvvDV0T.js} +1 -1
  48. package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-DbJoWA8f.js → quadrantDiagram-34T5L4WZ-UwD6L8ht.js} +1 -1
  49. package/dist/deck-client/assets/{requirementDiagram-MS252O5E-DQrUiz_d.js → requirementDiagram-MS252O5E-De7hY7i9.js} +1 -1
  50. package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-kB7PZc3g.js → sankeyDiagram-XADWPNL6-BAo56uzq.js} +1 -1
  51. package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-CpyVu1TN.js → sequenceDiagram-FGHM5R23-DBQe60Jv.js} +1 -1
  52. package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-CjqQcnty.js → stateDiagram-FHFEXIEX-CcRfAns5.js} +1 -1
  53. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CpnNRLqf.js +1 -0
  54. package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-B2PAO9bk.js → timeline-definition-GMOUNBTQ-BlMy5lUr.js} +1 -1
  55. package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-C0G3ItCr.js → vennDiagram-DHZGUBPP-CiVqs92J.js} +1 -1
  56. package/dist/deck-client/assets/{wardley-RL74JXVD-B0TVaOmp.js → wardley-RL74JXVD-C19dhJoR.js} +1 -1
  57. package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-B-qtbNZe.js → wardleyDiagram-NUSXRM2D-s_zVaEmu.js} +1 -1
  58. package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-41kcBoBE.js → xychartDiagram-5P7HB3ND-DShsSL-Z.js} +1 -1
  59. package/dist/deck-client/index.html +2 -2
  60. package/dist/server/cli.js +472 -360
  61. package/dist/server/init-entry.js +40 -11
  62. package/dist/server/radar-docker-init-entry.js +34 -11
  63. package/dist/server/rover-entry.js +515 -130
  64. package/package.json +1 -1
  65. package/scaffolds/ls-marketplace/plugins/kit/skills/ship/SKILL.md +24 -18
  66. package/dist/chart-client/assets/index-DOKsFe5i.css +0 -1
  67. package/dist/client/assets/index-Mewz-s77.css +0 -32
  68. package/dist/council-client/assets/index-o_3y7Z0J.css +0 -1
  69. package/dist/deck-client/assets/channel-Cw2WDt9a.js +0 -1
  70. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-JLUXVCUr.js +0 -1
  71. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-JLUXVCUr.js +0 -1
  72. package/dist/deck-client/assets/clone-H0XCnSb6.js +0 -1
  73. package/dist/deck-client/assets/index-C6YxyZay.css +0 -1
  74. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-tfMSn8xx.js +0 -1
  75. /package/dist/chart-client/assets/{index-DJQYgFcp.js → index-B7lPHV9b.js} +0 -0
  76. /package/dist/council-client/assets/{index-Wn06apTg.js → index-B04u6r-y.js} +0 -0
@@ -519,14 +519,14 @@ 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 === "";
523
- return {
522
+ const spec = {
524
523
  name: r.name,
525
524
  port: r.port,
526
525
  bin: r.bin,
527
- args: r.args ?? [],
528
- skipSpawn
526
+ args: r.args ?? []
529
527
  };
528
+ if (r.skipSpawn === true || r.bin === "") spec.skipSpawn = true;
529
+ return spec;
530
530
  }
531
531
  function validate(services) {
532
532
  if (services.length === 0) {
@@ -973,6 +973,27 @@ var init_cf_access = __esm({
973
973
  }
974
974
  });
975
975
 
976
+ // src/server/rover/runtime/hostnames.ts
977
+ function slugLabel(projectSlug) {
978
+ return projectSlug.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
979
+ }
980
+ function roverToken(roverId) {
981
+ let h = 2166136261;
982
+ for (let i = 0; i < roverId.length; i++) {
983
+ h ^= roverId.charCodeAt(i);
984
+ h = Math.imul(h, 16777619);
985
+ }
986
+ return ((h >>> 0) % 2176782336).toString(36).padStart(6, "0");
987
+ }
988
+ function serviceLabel2(projectSlug, serviceName, roverId) {
989
+ return `${serviceName}-${slugLabel(projectSlug)}-${roverToken(roverId)}`;
990
+ }
991
+ var init_hostnames = __esm({
992
+ "src/server/rover/runtime/hostnames.ts"() {
993
+ "use strict";
994
+ }
995
+ });
996
+
976
997
  // src/server/radar/registration.ts
977
998
  var RECEIVER_PATH;
978
999
  var init_registration = __esm({
@@ -1097,10 +1118,16 @@ function setupClaudeCredentials() {
1097
1118
  const claudeDir = (0, import_node_path4.join)(home, ".claude");
1098
1119
  (0, import_node_fs4.mkdirSync)(claudeDir, { recursive: true });
1099
1120
  const credsPath = (0, import_node_path4.join)(claudeDir, ".credentials.json");
1100
- if (hasUsableCredentials(credsPath)) {
1121
+ if (process.env.CLAUDE_CODE_OAUTH_TOKEN) {
1122
+ console.log("[entrypoint] CLAUDE_CODE_OAUTH_TOKEN present \u2014 using long-lived token; skipping ~/.claude/.credentials.json seed");
1123
+ } else if (hasUsableCredentials(credsPath)) {
1101
1124
  console.log("[entrypoint] ~/.claude/.credentials.json already present \u2014 leaving Claude Code's own (refreshed) credentials intact");
1102
1125
  } else {
1103
- const decoded = Buffer.from(requireEnv("CLAUDE_CREDENTIALS_B64"), "base64").toString("utf8");
1126
+ const blob = process.env.CLAUDE_CREDENTIALS_B64;
1127
+ if (!blob) {
1128
+ fail2("ERROR: no Claude credential \u2014 set CLAUDE_CODE_OAUTH_TOKEN (preferred, from `claude setup-token`) or CLAUDE_CREDENTIALS_B64");
1129
+ }
1130
+ const decoded = Buffer.from(blob, "base64").toString("utf8");
1104
1131
  (0, import_node_fs4.writeFileSync)(credsPath, decoded);
1105
1132
  (0, import_node_fs4.chmodSync)(credsPath, 384);
1106
1133
  console.log("[entrypoint] seeded ~/.claude/.credentials.json from CLAUDE_CREDENTIALS_B64");
@@ -1207,21 +1234,22 @@ async function maybeProvisionIngress(bundle, services, projectSlug) {
1207
1234
  fail2(`[entrypoint] cloudflare token covers ${zones.length} zones (${zones.map((z) => z.name).join(", ")}) \u2014 set LAUNCHKIT_CF_BASE_DOMAIN to pick one.`);
1208
1235
  }
1209
1236
  const stateFile = (0, import_node_path4.join)(POD_WS, ".launchpod", "launch-kit-tunnel.json");
1210
- const slugLabel = projectSlug.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
1237
+ const roverId = requireEnv("LS_ROVER_ID");
1211
1238
  const DNS_LABEL_RE = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
1212
1239
  for (const s of services) {
1213
- const label = `${slugLabel}-${s.name}`;
1240
+ const label = serviceLabel2(projectSlug, s.name, roverId);
1214
1241
  if (!DNS_LABEL_RE.test(label)) {
1215
1242
  fail2(`[entrypoint] hostname label "${label}" (${label.length} chars) is not a valid DNS label \u2014 must be 1\u201363 chars of [a-z0-9-] with no leading/trailing hyphen. Shorten the project slug ("${projectSlug}") or the service name ("${s.name}").`);
1216
1243
  }
1217
1244
  }
1218
- console.log(`[entrypoint] provisioning CF named tunnel \u2014 name=launch-kit-${projectSlug} zone=${chosen.name} services=${services.map((s) => `${slugLabel}-${s.name}`).join(",")}`);
1245
+ const tunnelName = `launch-kit-${projectSlug}-${roverToken(roverId)}`;
1246
+ console.log(`[entrypoint] provisioning CF named tunnel \u2014 name=${tunnelName} zone=${chosen.name} services=${services.map((s) => serviceLabel2(projectSlug, s.name, roverId)).join(",")}`);
1219
1247
  const result = await provisionIngress({
1220
1248
  apiToken: token,
1221
1249
  accountId,
1222
1250
  zone: chosen,
1223
- tunnelName: `launch-kit-${projectSlug}`,
1224
- services: services.map((s) => ({ name: s.name, label: `${slugLabel}-${s.name}`, port: s.port })),
1251
+ tunnelName,
1252
+ services: services.map((s) => ({ name: s.name, label: serviceLabel2(projectSlug, s.name, roverId), port: s.port })),
1225
1253
  stateFile
1226
1254
  });
1227
1255
  for (const [name, fqdn] of Object.entries(result.hostnames)) {
@@ -1438,6 +1466,7 @@ var init_radar_docker_init_entry = __esm({
1438
1466
  init_launch_kit_services();
1439
1467
  init_cf_ingress();
1440
1468
  init_cf_access();
1469
+ init_hostnames();
1441
1470
  init_registration();
1442
1471
  REQUIRED_ENV = [
1443
1472
  "LS_PAT",
@@ -190,14 +190,14 @@ 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 === "";
194
- return {
193
+ const spec = {
195
194
  name: r.name,
196
195
  port: r.port,
197
196
  bin: r.bin,
198
- args: r.args ?? [],
199
- skipSpawn
197
+ args: r.args ?? []
200
198
  };
199
+ if (r.skipSpawn === true || r.bin === "") spec.skipSpawn = true;
200
+ return spec;
201
201
  }
202
202
  function validate(services) {
203
203
  if (services.length === 0) {
@@ -613,6 +613,22 @@ async function provisionAccess(input) {
613
613
  return { idpId, authDomain, appIds };
614
614
  }
615
615
 
616
+ // src/server/rover/runtime/hostnames.ts
617
+ function slugLabel(projectSlug) {
618
+ return projectSlug.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
619
+ }
620
+ function roverToken(roverId) {
621
+ let h = 2166136261;
622
+ for (let i = 0; i < roverId.length; i++) {
623
+ h ^= roverId.charCodeAt(i);
624
+ h = Math.imul(h, 16777619);
625
+ }
626
+ return ((h >>> 0) % 2176782336).toString(36).padStart(6, "0");
627
+ }
628
+ function serviceLabel2(projectSlug, serviceName, roverId) {
629
+ return `${serviceName}-${slugLabel(projectSlug)}-${roverToken(roverId)}`;
630
+ }
631
+
616
632
  // src/server/radar/registration.ts
617
633
  var RECEIVER_PATH = "/api/radar/ingest";
618
634
 
@@ -737,10 +753,16 @@ function setupClaudeCredentials() {
737
753
  const claudeDir = (0, import_node_path4.join)(home, ".claude");
738
754
  (0, import_node_fs4.mkdirSync)(claudeDir, { recursive: true });
739
755
  const credsPath = (0, import_node_path4.join)(claudeDir, ".credentials.json");
740
- if (hasUsableCredentials(credsPath)) {
756
+ if (process.env.CLAUDE_CODE_OAUTH_TOKEN) {
757
+ console.log("[entrypoint] CLAUDE_CODE_OAUTH_TOKEN present \u2014 using long-lived token; skipping ~/.claude/.credentials.json seed");
758
+ } else if (hasUsableCredentials(credsPath)) {
741
759
  console.log("[entrypoint] ~/.claude/.credentials.json already present \u2014 leaving Claude Code's own (refreshed) credentials intact");
742
760
  } else {
743
- const decoded = Buffer.from(requireEnv("CLAUDE_CREDENTIALS_B64"), "base64").toString("utf8");
761
+ const blob = process.env.CLAUDE_CREDENTIALS_B64;
762
+ if (!blob) {
763
+ fail2("ERROR: no Claude credential \u2014 set CLAUDE_CODE_OAUTH_TOKEN (preferred, from `claude setup-token`) or CLAUDE_CREDENTIALS_B64");
764
+ }
765
+ const decoded = Buffer.from(blob, "base64").toString("utf8");
744
766
  (0, import_node_fs4.writeFileSync)(credsPath, decoded);
745
767
  (0, import_node_fs4.chmodSync)(credsPath, 384);
746
768
  console.log("[entrypoint] seeded ~/.claude/.credentials.json from CLAUDE_CREDENTIALS_B64");
@@ -847,21 +869,22 @@ async function maybeProvisionIngress(bundle, services, projectSlug) {
847
869
  fail2(`[entrypoint] cloudflare token covers ${zones.length} zones (${zones.map((z) => z.name).join(", ")}) \u2014 set LAUNCHKIT_CF_BASE_DOMAIN to pick one.`);
848
870
  }
849
871
  const stateFile = (0, import_node_path4.join)(POD_WS, ".launchpod", "launch-kit-tunnel.json");
850
- const slugLabel = projectSlug.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
872
+ const roverId = requireEnv("LS_ROVER_ID");
851
873
  const DNS_LABEL_RE = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
852
874
  for (const s of services) {
853
- const label = `${slugLabel}-${s.name}`;
875
+ const label = serviceLabel2(projectSlug, s.name, roverId);
854
876
  if (!DNS_LABEL_RE.test(label)) {
855
877
  fail2(`[entrypoint] hostname label "${label}" (${label.length} chars) is not a valid DNS label \u2014 must be 1\u201363 chars of [a-z0-9-] with no leading/trailing hyphen. Shorten the project slug ("${projectSlug}") or the service name ("${s.name}").`);
856
878
  }
857
879
  }
858
- console.log(`[entrypoint] provisioning CF named tunnel \u2014 name=launch-kit-${projectSlug} zone=${chosen.name} services=${services.map((s) => `${slugLabel}-${s.name}`).join(",")}`);
880
+ const tunnelName = `launch-kit-${projectSlug}-${roverToken(roverId)}`;
881
+ console.log(`[entrypoint] provisioning CF named tunnel \u2014 name=${tunnelName} zone=${chosen.name} services=${services.map((s) => serviceLabel2(projectSlug, s.name, roverId)).join(",")}`);
859
882
  const result = await provisionIngress({
860
883
  apiToken: token,
861
884
  accountId,
862
885
  zone: chosen,
863
- tunnelName: `launch-kit-${projectSlug}`,
864
- services: services.map((s) => ({ name: s.name, label: `${slugLabel}-${s.name}`, port: s.port })),
886
+ tunnelName,
887
+ services: services.map((s) => ({ name: s.name, label: serviceLabel2(projectSlug, s.name, roverId), port: s.port })),
865
888
  stateFile
866
889
  });
867
890
  for (const [name, fqdn] of Object.entries(result.hostnames)) {