@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.
- package/dist/chart-client/assets/index-CXWFhknu.css +1 -0
- package/dist/chart-client/index.html +2 -2
- package/dist/client/assets/{index-BqiDfvZi.js → index-BQi0ccnm.js} +38 -38
- package/dist/client/assets/index-BxHD8tLY.css +32 -0
- package/dist/client/index.html +2 -2
- package/dist/council-client/assets/index-K5s7bSOk.css +1 -0
- package/dist/council-client/index.html +2 -2
- package/dist/deck-client/assets/{_baseUniq-C6w7kg8x.js → _baseUniq-Dc3nUqjn.js} +1 -1
- package/dist/deck-client/assets/{arc-Cx9pT3Nn.js → arc-Pk4Hg5AC.js} +1 -1
- package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-BITSj3vA.js → architectureDiagram-Q4EWVU46-ClHfwBM_.js} +1 -1
- package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-BehOFuwh.js → blockDiagram-DXYQGD6D-byyj3c2H.js} +1 -1
- package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-BZTYM4na.js → c4Diagram-AHTNJAMY-DAIz-EzX.js} +1 -1
- package/dist/deck-client/assets/channel-CrtYAG0j.js +1 -0
- package/dist/deck-client/assets/{chunk-4BX2VUAB-CCUx5CTd.js → chunk-4BX2VUAB-D9ILfgjn.js} +1 -1
- package/dist/deck-client/assets/{chunk-4TB4RGXK-UDZXXga6.js → chunk-4TB4RGXK-D5-01wU-.js} +1 -1
- package/dist/deck-client/assets/{chunk-55IACEB6-CfcU6PIW.js → chunk-55IACEB6-BQsygkyC.js} +1 -1
- package/dist/deck-client/assets/{chunk-EDXVE4YY-BK6F5Fof.js → chunk-EDXVE4YY-BEQCd4L_.js} +1 -1
- package/dist/deck-client/assets/{chunk-FMBD7UC4-C-2idlFB.js → chunk-FMBD7UC4-D347YT2V.js} +1 -1
- package/dist/deck-client/assets/{chunk-OYMX7WX6-D6hBkYLP.js → chunk-OYMX7WX6-CN_JK0dw.js} +1 -1
- package/dist/deck-client/assets/{chunk-QZHKN3VN-DixNpysA.js → chunk-QZHKN3VN-Bt2J1da-.js} +1 -1
- package/dist/deck-client/assets/{chunk-YZCP3GAM-Cd3pNBtQ.js → chunk-YZCP3GAM-CyG1EIPO.js} +1 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-C6PSTf3r.js +1 -0
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-C6PSTf3r.js +1 -0
- package/dist/deck-client/assets/clone-00e5l4vU.js +1 -0
- package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-OF3JWdEt.js → cose-bilkent-S5V4N54A-pidjvoDW.js} +1 -1
- package/dist/deck-client/assets/{dagre-KV5264BT-Bqu-qcv4.js → dagre-KV5264BT-B7y7oCcY.js} +1 -1
- package/dist/deck-client/assets/{diagram-5BDNPKRD--0eHmUBS.js → diagram-5BDNPKRD-CCuv-nL4.js} +1 -1
- package/dist/deck-client/assets/{diagram-G4DWMVQ6-nss6oL20.js → diagram-G4DWMVQ6-UNm_Nh5Y.js} +1 -1
- package/dist/deck-client/assets/{diagram-MMDJMWI5-D_gSGnLR.js → diagram-MMDJMWI5-ozJ1XX_Q.js} +1 -1
- package/dist/deck-client/assets/{diagram-TYMM5635-BIt-P6Pk.js → diagram-TYMM5635-DbGkQand.js} +1 -1
- package/dist/deck-client/assets/{erDiagram-SMLLAGMA-Bi-E4KQm.js → erDiagram-SMLLAGMA-CyyS0CgV.js} +1 -1
- package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-DMJCvLMA.js → flowDiagram-DWJPFMVM-B5-cES0d.js} +1 -1
- package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-C3xgEoPD.js → ganttDiagram-T4ZO3ILL-8uB-aHPV.js} +1 -1
- package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-CD0BEGAW.js → gitGraphDiagram-UUTBAWPF-B3kn9oxf.js} +1 -1
- package/dist/deck-client/assets/{graph-Dtsd9Jwe.js → graph-48RwtCOC.js} +1 -1
- package/dist/deck-client/assets/{index-TFX8vtTG.js → index-B_IK1EJu.js} +1 -1
- package/dist/deck-client/assets/index-CvIV2mXs.css +1 -0
- package/dist/deck-client/assets/{infoDiagram-42DDH7IO-7IcQYqe_.js → infoDiagram-42DDH7IO-DG1xrRXV.js} +1 -1
- package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-DsCEbx3u.js → ishikawaDiagram-UXIWVN3A-vHZT8oXQ.js} +1 -1
- package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-1mP2JwCk.js → journeyDiagram-VCZTEJTY-BAAi_YhC.js} +1 -1
- package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-vT0Xrqh9.js → kanban-definition-6JOO6SKY-CfNP3Cu6.js} +1 -1
- package/dist/deck-client/assets/{layout-Cw4rS2pn.js → layout-DIXGbv3Y.js} +1 -1
- package/dist/deck-client/assets/{linear-CzOjL-Ih.js → linear-C9PVcQFx.js} +1 -1
- package/dist/deck-client/assets/{mermaid.core-DYi3A-qK.js → mermaid.core-w8AQRITb.js} +4 -4
- package/dist/deck-client/assets/{min-DstloRoL.js → min-B0k-NaRG.js} +1 -1
- package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-D-cCX2d2.js → mindmap-definition-QFDTVHPH-F3oNoTMv.js} +1 -1
- package/dist/deck-client/assets/{pieDiagram-DEJITSTG-BqW2NTmy.js → pieDiagram-DEJITSTG-tsvvDV0T.js} +1 -1
- package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-DbJoWA8f.js → quadrantDiagram-34T5L4WZ-UwD6L8ht.js} +1 -1
- package/dist/deck-client/assets/{requirementDiagram-MS252O5E-DQrUiz_d.js → requirementDiagram-MS252O5E-De7hY7i9.js} +1 -1
- package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-kB7PZc3g.js → sankeyDiagram-XADWPNL6-BAo56uzq.js} +1 -1
- package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-CpyVu1TN.js → sequenceDiagram-FGHM5R23-DBQe60Jv.js} +1 -1
- package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-CjqQcnty.js → stateDiagram-FHFEXIEX-CcRfAns5.js} +1 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CpnNRLqf.js +1 -0
- package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-B2PAO9bk.js → timeline-definition-GMOUNBTQ-BlMy5lUr.js} +1 -1
- package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-C0G3ItCr.js → vennDiagram-DHZGUBPP-CiVqs92J.js} +1 -1
- package/dist/deck-client/assets/{wardley-RL74JXVD-B0TVaOmp.js → wardley-RL74JXVD-C19dhJoR.js} +1 -1
- package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-B-qtbNZe.js → wardleyDiagram-NUSXRM2D-s_zVaEmu.js} +1 -1
- package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-41kcBoBE.js → xychartDiagram-5P7HB3ND-DShsSL-Z.js} +1 -1
- package/dist/deck-client/index.html +2 -2
- package/dist/server/cli.js +472 -360
- package/dist/server/init-entry.js +40 -11
- package/dist/server/radar-docker-init-entry.js +34 -11
- package/dist/server/rover-entry.js +515 -130
- package/package.json +1 -1
- package/scaffolds/ls-marketplace/plugins/kit/skills/ship/SKILL.md +24 -18
- package/dist/chart-client/assets/index-DOKsFe5i.css +0 -1
- package/dist/client/assets/index-Mewz-s77.css +0 -32
- package/dist/council-client/assets/index-o_3y7Z0J.css +0 -1
- package/dist/deck-client/assets/channel-Cw2WDt9a.js +0 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-JLUXVCUr.js +0 -1
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-JLUXVCUr.js +0 -1
- package/dist/deck-client/assets/clone-H0XCnSb6.js +0 -1
- package/dist/deck-client/assets/index-C6YxyZay.css +0 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-tfMSn8xx.js +0 -1
- /package/dist/chart-client/assets/{index-DJQYgFcp.js → index-B7lPHV9b.js} +0 -0
- /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
|
|
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 (
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
|
1224
|
-
services: services.map((s) => ({ name: s.name, label:
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
|
864
|
-
services: services.map((s) => ({ name: s.name, label:
|
|
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)) {
|