@dotobokuri/fleet-console 1.5.1 → 1.5.3
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/cli-bin.mjs +297 -6
- package/dist/cli.mjs +297 -6
- package/dist/client/assets/{_baseUniq-Cj5iZsnm.js → _baseUniq-D0ScniwI.js} +1 -1
- package/dist/client/assets/{arc-Jbxpc55P.js → arc-BVncG7ke.js} +1 -1
- package/dist/client/assets/{architectureDiagram-Q4EWVU46-C2AL37ZH.js → architectureDiagram-Q4EWVU46-ClShr277.js} +1 -1
- package/dist/client/assets/{blockDiagram-DXYQGD6D-Z33MGAR0.js → blockDiagram-DXYQGD6D-CrivdCAG.js} +1 -1
- package/dist/client/assets/{c4Diagram-AHTNJAMY-DTyyZjbr.js → c4Diagram-AHTNJAMY-B7PCIQAH.js} +1 -1
- package/dist/client/assets/channel-BQxlgV4A.js +1 -0
- package/dist/client/assets/{chunk-4BX2VUAB-MhU_yYsg.js → chunk-4BX2VUAB-DXeu-dM9.js} +1 -1
- package/dist/client/assets/{chunk-4TB4RGXK-rush3WYT.js → chunk-4TB4RGXK-BLl_OCcS.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-2q7GyaDY.js → chunk-55IACEB6-Dw15rh74.js} +1 -1
- package/dist/client/assets/{chunk-EDXVE4YY-BNJul5Gb.js → chunk-EDXVE4YY-D-RaYxb6.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-RLF-A4M2.js → chunk-FMBD7UC4-BURzGCgv.js} +1 -1
- package/dist/client/assets/{chunk-OYMX7WX6-O3WaO8eP.js → chunk-OYMX7WX6-RlVYpHiY.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-VmMF7Q4N.js → chunk-QZHKN3VN-Cwh5KNNT.js} +1 -1
- package/dist/client/assets/{chunk-YZCP3GAM-Bh6gYhu2.js → chunk-YZCP3GAM-CiQn7QhX.js} +1 -1
- package/dist/client/assets/classDiagram-6PBFFD2Q-DKVGUl6t.js +1 -0
- package/dist/client/assets/classDiagram-v2-HSJHXN6E-DKVGUl6t.js +1 -0
- package/dist/client/assets/clone-BWF9pDhJ.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-D3DS835d.js → cose-bilkent-S5V4N54A-BjrkHodW.js} +1 -1
- package/dist/client/assets/{dagre-KV5264BT-Ciubq0vM.js → dagre-KV5264BT-C2l7dBaN.js} +1 -1
- package/dist/client/assets/{diagram-5BDNPKRD-BZZIvHWa.js → diagram-5BDNPKRD-DLbWU7o6.js} +1 -1
- package/dist/client/assets/{diagram-G4DWMVQ6-BtXUzyHa.js → diagram-G4DWMVQ6-CHa3wC_6.js} +1 -1
- package/dist/client/assets/{diagram-MMDJMWI5-DCUsuoWB.js → diagram-MMDJMWI5-unre4XlN.js} +1 -1
- package/dist/client/assets/{diagram-TYMM5635-B4qobpfh.js → diagram-TYMM5635-Cdt0vfut.js} +1 -1
- package/dist/client/assets/{erDiagram-SMLLAGMA-By9AUj2W.js → erDiagram-SMLLAGMA-BYzXAxxJ.js} +1 -1
- package/dist/client/assets/{flowDiagram-DWJPFMVM-BwnN5h7R.js → flowDiagram-DWJPFMVM-CNV2iyQR.js} +1 -1
- package/dist/client/assets/{ganttDiagram-T4ZO3ILL-CXKwXiMU.js → ganttDiagram-T4ZO3ILL-DThuKZ5c.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-UUTBAWPF-DNT5RSum.js → gitGraphDiagram-UUTBAWPF-aQ8ynpC0.js} +1 -1
- package/dist/client/assets/{graph-CjPVI8l2.js → graph-C8-VhfUV.js} +1 -1
- package/dist/client/assets/{index-BULfWUw5.js → index-BWz6DiTE.js} +150 -150
- package/dist/client/assets/index-DyIWJOIv.css +1 -0
- package/dist/client/assets/{infoDiagram-42DDH7IO-U_AT1-iD.js → infoDiagram-42DDH7IO-Do5t0VWS.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-Qex4lNxT.js → ishikawaDiagram-UXIWVN3A-DIe1b4HJ.js} +1 -1
- package/dist/client/assets/{journeyDiagram-VCZTEJTY-DzQ-n2Dr.js → journeyDiagram-VCZTEJTY-BwHcjLfa.js} +1 -1
- package/dist/client/assets/{kanban-definition-6JOO6SKY-Nca0w4w_.js → kanban-definition-6JOO6SKY-B-zHtqTS.js} +1 -1
- package/dist/client/assets/{layout-CSAtztCW.js → layout-CtVjuQFw.js} +1 -1
- package/dist/client/assets/{linear-DCMai7XD.js → linear-rOcX3Xk5.js} +1 -1
- package/dist/client/assets/{mermaid.core-DgeiljBl.js → mermaid.core-BJTjy7aS.js} +4 -4
- package/dist/client/assets/{min-CXx0Defw.js → min-BUMqT8iZ.js} +1 -1
- package/dist/client/assets/{mindmap-definition-QFDTVHPH-3eAEbAuc.js → mindmap-definition-QFDTVHPH-DW7Wysk_.js} +1 -1
- package/dist/client/assets/{pieDiagram-DEJITSTG-QzP0SY9Q.js → pieDiagram-DEJITSTG-DY0ruViO.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-34T5L4WZ-BESlSjcj.js → quadrantDiagram-34T5L4WZ-CCEy2zsl.js} +1 -1
- package/dist/client/assets/{requirementDiagram-MS252O5E-C_Epj4-C.js → requirementDiagram-MS252O5E-D6PFLt6T.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-XADWPNL6-Djw1Duzy.js → sankeyDiagram-XADWPNL6-B07GNfPe.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-FGHM5R23-Dx1GQsBc.js → sequenceDiagram-FGHM5R23-CdYYCcr6.js} +1 -1
- package/dist/client/assets/{stateDiagram-FHFEXIEX-CFbPjyzN.js → stateDiagram-FHFEXIEX-DC3oywwW.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-D0vnD8Cl.js +1 -0
- package/dist/client/assets/{timeline-definition-GMOUNBTQ-eL6NFeHV.js → timeline-definition-GMOUNBTQ-D85mj2bC.js} +1 -1
- package/dist/client/assets/{vennDiagram-DHZGUBPP-DWTRRBRv.js → vennDiagram-DHZGUBPP-Co2lMv4A.js} +1 -1
- package/dist/client/assets/{wardley-RL74JXVD-lzn8v7--.js → wardley-RL74JXVD-3QSiNklf.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-NUSXRM2D-CeSqsVbB.js → wardleyDiagram-NUSXRM2D-CHETmdOb.js} +1 -1
- package/dist/client/assets/{xychartDiagram-5P7HB3ND-CVYHXTp8.js → xychartDiagram-5P7HB3ND-ByAvOHKb.js} +1 -1
- package/dist/client/index.html +2 -2
- package/package.json +1 -1
- package/dist/client/assets/channel-C7CS_KI3.js +0 -1
- package/dist/client/assets/classDiagram-6PBFFD2Q-DNK0Ad4c.js +0 -1
- package/dist/client/assets/classDiagram-v2-HSJHXN6E-DNK0Ad4c.js +0 -1
- package/dist/client/assets/clone-DOhXj8NM.js +0 -1
- package/dist/client/assets/index-B2Ok0q13.css +0 -1
- package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-CqOKCF9r.js +0 -1
package/dist/cli-bin.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { execFile, spawn, execSync } from 'child_process';
|
|
3
3
|
import * as fs4 from 'fs';
|
|
4
|
-
import fs4__default, { realpathSync, lstatSync } from 'fs';
|
|
4
|
+
import fs4__default, { existsSync, realpathSync, lstatSync } from 'fs';
|
|
5
5
|
import * as path9 from 'path';
|
|
6
6
|
import path9__default, { join, resolve, relative, dirname } from 'path';
|
|
7
7
|
import process4 from 'process';
|
|
@@ -21349,6 +21349,75 @@ function assertNoAuthorizationHeader(config2) {
|
|
|
21349
21349
|
throw new Error(`Builtin external MCP server "${config2.name}" must not define headers.`);
|
|
21350
21350
|
}
|
|
21351
21351
|
}
|
|
21352
|
+
var DEFAULT_WINDOWS_PATHEXT = ".COM;.EXE;.BAT;.CMD";
|
|
21353
|
+
var WINDOWS_PATH_SEPARATOR = ";";
|
|
21354
|
+
var WINDOWS_SHIM_EXTENSIONS = /* @__PURE__ */ new Set([".cmd", ".bat"]);
|
|
21355
|
+
var CMD_EXPANSION_SENSITIVE_PATTERN = /[%^]/;
|
|
21356
|
+
function resolvePathBinary(command2, env, options = {}) {
|
|
21357
|
+
const platform = options.platform ?? process.platform;
|
|
21358
|
+
const isWindows2 = platform === "win32";
|
|
21359
|
+
const pathValue = isWindows2 ? env.Path ?? env.PATH ?? "" : env.PATH ?? "";
|
|
21360
|
+
const pathExts = isWindows2 ? parsePathExt(env.PATHEXT) : [""];
|
|
21361
|
+
const resolved = findOnPath(command2, pathValue, pathExts, platform);
|
|
21362
|
+
return resolved ? wrapWindowsShim(resolved, env, platform) : void 0;
|
|
21363
|
+
}
|
|
21364
|
+
function wrapWindowsShim(resolved, env, platform) {
|
|
21365
|
+
if (platform !== "win32" || !WINDOWS_SHIM_EXTENSIONS.has(path9__default.extname(resolved).toLowerCase())) {
|
|
21366
|
+
return { bin: resolved, prefixArgs: [] };
|
|
21367
|
+
}
|
|
21368
|
+
rejectCmdExpansionSensitiveShim(resolved);
|
|
21369
|
+
return {
|
|
21370
|
+
bin: env.ComSpec ?? "cmd.exe",
|
|
21371
|
+
prefixArgs: ["/d", "/s", "/c", "call", forceWindowsArgQuoting(resolved)]
|
|
21372
|
+
};
|
|
21373
|
+
}
|
|
21374
|
+
function rejectCmdExpansionSensitiveShim(resolved) {
|
|
21375
|
+
if (CMD_EXPANSION_SENSITIVE_PATTERN.test(resolved)) {
|
|
21376
|
+
throw new Error(`Refusing to run Windows shim path with cmd.exe expansion-sensitive characters (% or ^): ${resolved}`);
|
|
21377
|
+
}
|
|
21378
|
+
}
|
|
21379
|
+
function forceWindowsArgQuoting(value) {
|
|
21380
|
+
return `${value} `;
|
|
21381
|
+
}
|
|
21382
|
+
function findOnPath(bin, pathValue, pathExts, platform) {
|
|
21383
|
+
const pathSeparator = platform === "win32" ? WINDOWS_PATH_SEPARATOR : path9__default.delimiter;
|
|
21384
|
+
if (hasPathSeparator(bin, platform) || path9__default.isAbsolute(bin)) {
|
|
21385
|
+
return resolveWithExtensions(bin, pathExts, platform);
|
|
21386
|
+
}
|
|
21387
|
+
for (const entry of pathValue.split(pathSeparator)) {
|
|
21388
|
+
const searchDir = entry.length === 0 ? "." : entry;
|
|
21389
|
+
const candidate = resolveWithExtensions(path9__default.join(searchDir, bin), pathExts, platform);
|
|
21390
|
+
if (candidate) {
|
|
21391
|
+
return candidate;
|
|
21392
|
+
}
|
|
21393
|
+
}
|
|
21394
|
+
return void 0;
|
|
21395
|
+
}
|
|
21396
|
+
function resolveWithExtensions(candidate, pathExts, platform) {
|
|
21397
|
+
if (platform !== "win32" || path9__default.extname(candidate).length > 0) {
|
|
21398
|
+
return existsSync(candidate) ? candidate : void 0;
|
|
21399
|
+
}
|
|
21400
|
+
for (const ext of pathExts) {
|
|
21401
|
+
if (ext.length === 0) {
|
|
21402
|
+
continue;
|
|
21403
|
+
}
|
|
21404
|
+
const withExt = `${candidate}${ext}`;
|
|
21405
|
+
if (existsSync(withExt)) {
|
|
21406
|
+
return withExt;
|
|
21407
|
+
}
|
|
21408
|
+
}
|
|
21409
|
+
return existsSync(candidate) ? candidate : void 0;
|
|
21410
|
+
}
|
|
21411
|
+
function hasPathSeparator(value, platform) {
|
|
21412
|
+
if (value.includes("/")) {
|
|
21413
|
+
return true;
|
|
21414
|
+
}
|
|
21415
|
+
return platform === "win32" && value.includes("\\");
|
|
21416
|
+
}
|
|
21417
|
+
function parsePathExt(pathExt) {
|
|
21418
|
+
const raw = pathExt && pathExt.trim().length > 0 ? pathExt : DEFAULT_WINDOWS_PATHEXT;
|
|
21419
|
+
return raw.split(WINDOWS_PATH_SEPARATOR).map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
21420
|
+
}
|
|
21352
21421
|
var DEAD_SESSION_PATTERNS = [
|
|
21353
21422
|
/session not found/i,
|
|
21354
21423
|
/unknown session/i,
|
|
@@ -22060,6 +22129,146 @@ async function disconnect(poolKey) {
|
|
|
22060
22129
|
async function executeWithPool(opts) {
|
|
22061
22130
|
return engineExecuteWithPool(opts);
|
|
22062
22131
|
}
|
|
22132
|
+
var NPM_REGISTRY_BASE_URL = "https://registry.npmjs.org/";
|
|
22133
|
+
var REGISTRY_TIMEOUT_MS = 3e3;
|
|
22134
|
+
var MAX_REGISTRY_RESPONSE_BYTES = 1024 * 1024;
|
|
22135
|
+
var VERSION_PATTERN = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;
|
|
22136
|
+
async function fetchLatestVersion(packageName, channel) {
|
|
22137
|
+
const controller = new AbortController();
|
|
22138
|
+
const timer = setTimeout(() => controller.abort(), REGISTRY_TIMEOUT_MS);
|
|
22139
|
+
timer.unref?.();
|
|
22140
|
+
try {
|
|
22141
|
+
const response = await fetch(`${NPM_REGISTRY_BASE_URL}${encodeNpmPackageName(packageName)}`, {
|
|
22142
|
+
headers: {
|
|
22143
|
+
Accept: "application/vnd.npm.install-v1+json"
|
|
22144
|
+
},
|
|
22145
|
+
signal: controller.signal
|
|
22146
|
+
});
|
|
22147
|
+
if (!response.ok) {
|
|
22148
|
+
return void 0;
|
|
22149
|
+
}
|
|
22150
|
+
const metadata = await readJsonWithByteLimit(response, controller);
|
|
22151
|
+
if (metadata === void 0) {
|
|
22152
|
+
return void 0;
|
|
22153
|
+
}
|
|
22154
|
+
const latest = metadata["dist-tags"]?.[channel ?? "latest"];
|
|
22155
|
+
return typeof latest === "string" && latest.length > 0 ? latest : void 0;
|
|
22156
|
+
} catch {
|
|
22157
|
+
return void 0;
|
|
22158
|
+
} finally {
|
|
22159
|
+
clearTimeout(timer);
|
|
22160
|
+
}
|
|
22161
|
+
}
|
|
22162
|
+
function isVersionGreater(left, right) {
|
|
22163
|
+
const leftVersion = parseVersion(left);
|
|
22164
|
+
const rightVersion = parseVersion(right);
|
|
22165
|
+
if (leftVersion === void 0 || rightVersion === void 0) {
|
|
22166
|
+
return false;
|
|
22167
|
+
}
|
|
22168
|
+
return compareVersions(leftVersion, rightVersion) > 0;
|
|
22169
|
+
}
|
|
22170
|
+
function encodeNpmPackageName(packageName) {
|
|
22171
|
+
if (!packageName.startsWith("@")) {
|
|
22172
|
+
return encodeURIComponent(packageName);
|
|
22173
|
+
}
|
|
22174
|
+
const separatorIndex = packageName.indexOf("/");
|
|
22175
|
+
if (separatorIndex === -1) {
|
|
22176
|
+
return encodeURIComponent(packageName);
|
|
22177
|
+
}
|
|
22178
|
+
const scope = packageName.slice(1, separatorIndex);
|
|
22179
|
+
const name = packageName.slice(separatorIndex + 1);
|
|
22180
|
+
return `@${encodeURIComponent(scope)}%2f${encodeURIComponent(name)}`;
|
|
22181
|
+
}
|
|
22182
|
+
async function readJsonWithByteLimit(response, controller) {
|
|
22183
|
+
const body = response.body;
|
|
22184
|
+
if (body === null) {
|
|
22185
|
+
return void 0;
|
|
22186
|
+
}
|
|
22187
|
+
const reader = body.getReader();
|
|
22188
|
+
const chunks = [];
|
|
22189
|
+
let totalBytes = 0;
|
|
22190
|
+
try {
|
|
22191
|
+
while (true) {
|
|
22192
|
+
const { done, value } = await reader.read();
|
|
22193
|
+
if (done) {
|
|
22194
|
+
break;
|
|
22195
|
+
}
|
|
22196
|
+
totalBytes += value.byteLength;
|
|
22197
|
+
if (totalBytes > MAX_REGISTRY_RESPONSE_BYTES) {
|
|
22198
|
+
controller.abort();
|
|
22199
|
+
return void 0;
|
|
22200
|
+
}
|
|
22201
|
+
chunks.push(value);
|
|
22202
|
+
}
|
|
22203
|
+
return JSON.parse(new TextDecoder().decode(joinChunks(chunks, totalBytes)));
|
|
22204
|
+
} catch {
|
|
22205
|
+
return void 0;
|
|
22206
|
+
} finally {
|
|
22207
|
+
reader.releaseLock();
|
|
22208
|
+
}
|
|
22209
|
+
}
|
|
22210
|
+
function joinChunks(chunks, totalBytes) {
|
|
22211
|
+
const joined = new Uint8Array(totalBytes);
|
|
22212
|
+
let offset = 0;
|
|
22213
|
+
for (const chunk of chunks) {
|
|
22214
|
+
joined.set(chunk, offset);
|
|
22215
|
+
offset += chunk.byteLength;
|
|
22216
|
+
}
|
|
22217
|
+
return joined;
|
|
22218
|
+
}
|
|
22219
|
+
function parseVersion(version2) {
|
|
22220
|
+
const match = VERSION_PATTERN.exec(version2.trim());
|
|
22221
|
+
if (match === null) {
|
|
22222
|
+
return void 0;
|
|
22223
|
+
}
|
|
22224
|
+
return {
|
|
22225
|
+
major: Number(match[1]),
|
|
22226
|
+
minor: Number(match[2]),
|
|
22227
|
+
patch: Number(match[3]),
|
|
22228
|
+
pre: match[4]?.split(".") ?? []
|
|
22229
|
+
};
|
|
22230
|
+
}
|
|
22231
|
+
function compareVersions(left, right) {
|
|
22232
|
+
const base = compareNumbers(left.major, right.major) || compareNumbers(left.minor, right.minor) || compareNumbers(left.patch, right.patch);
|
|
22233
|
+
if (base !== 0) {
|
|
22234
|
+
return base;
|
|
22235
|
+
}
|
|
22236
|
+
if (left.pre.length === 0 || right.pre.length === 0) {
|
|
22237
|
+
return compareNumbers(right.pre.length, left.pre.length);
|
|
22238
|
+
}
|
|
22239
|
+
for (let index = 0; index < Math.max(left.pre.length, right.pre.length); index += 1) {
|
|
22240
|
+
const leftPart = left.pre[index];
|
|
22241
|
+
const rightPart = right.pre[index];
|
|
22242
|
+
if (leftPart === void 0 || rightPart === void 0) {
|
|
22243
|
+
return compareNumbers(left.pre.length, right.pre.length);
|
|
22244
|
+
}
|
|
22245
|
+
const compared = comparePrereleasePart(leftPart, rightPart);
|
|
22246
|
+
if (compared !== 0) {
|
|
22247
|
+
return compared;
|
|
22248
|
+
}
|
|
22249
|
+
}
|
|
22250
|
+
return 0;
|
|
22251
|
+
}
|
|
22252
|
+
function comparePrereleasePart(left, right) {
|
|
22253
|
+
const leftNumber = parseNumericPart(left);
|
|
22254
|
+
const rightNumber = parseNumericPart(right);
|
|
22255
|
+
if (leftNumber !== void 0 && rightNumber !== void 0) {
|
|
22256
|
+
return compareNumbers(leftNumber, rightNumber);
|
|
22257
|
+
}
|
|
22258
|
+
if (leftNumber !== void 0) {
|
|
22259
|
+
return -1;
|
|
22260
|
+
}
|
|
22261
|
+
if (rightNumber !== void 0) {
|
|
22262
|
+
return 1;
|
|
22263
|
+
}
|
|
22264
|
+
return left.localeCompare(right);
|
|
22265
|
+
}
|
|
22266
|
+
function parseNumericPart(value) {
|
|
22267
|
+
return /^\d+$/.test(value) ? Number(value) : void 0;
|
|
22268
|
+
}
|
|
22269
|
+
function compareNumbers(left, right) {
|
|
22270
|
+
return left === right ? 0 : left > right ? 1 : -1;
|
|
22271
|
+
}
|
|
22063
22272
|
var SECURE_DIR_MODE = 448;
|
|
22064
22273
|
var SECURE_FILE_MODE = 384;
|
|
22065
22274
|
var NOFOLLOW_FLAG = fs4.constants.O_NOFOLLOW ?? 0;
|
|
@@ -34209,16 +34418,25 @@ function createDefaultTerminalLaunchResolver(deps = {}) {
|
|
|
34209
34418
|
const execPath = deps.execPath ?? process4.execPath;
|
|
34210
34419
|
const homedir2 = deps.homedir ?? DEFAULT_TERMINAL_CWD_FALLBACK;
|
|
34211
34420
|
const exists = deps.exists ?? fs4__default.existsSync;
|
|
34421
|
+
const platform = deps.platform ?? process4.platform;
|
|
34212
34422
|
const release = deps.release ?? readFleetConsoleRelease();
|
|
34213
34423
|
return (selectedCwd, context) => {
|
|
34214
34424
|
const cwd = selectedCwd || baseCwd || homedir2();
|
|
34215
34425
|
if (context?.kind === "shell") {
|
|
34216
|
-
|
|
34426
|
+
const shell = resolveWindowsLaunchBinary(resolveUserShell(env, platform), [], env, platform, "user shell");
|
|
34427
|
+
return { bin: shell.bin, args: shell.args, cwd, env: buildShellLaunchEnv(env) };
|
|
34217
34428
|
}
|
|
34218
34429
|
const launchEnv = buildLaunchEnv(env, cwd, context?.sessionId);
|
|
34219
34430
|
const override = parseTerminalCommand(env.FLEET_TERMINAL_CMD);
|
|
34220
34431
|
if (override) {
|
|
34221
|
-
|
|
34432
|
+
const resolvedOverride = resolveWindowsLaunchBinary(
|
|
34433
|
+
override.bin,
|
|
34434
|
+
override.args,
|
|
34435
|
+
env,
|
|
34436
|
+
platform,
|
|
34437
|
+
"FLEET_TERMINAL_CMD"
|
|
34438
|
+
);
|
|
34439
|
+
return { ...resolvedOverride, cwd, env: launchEnv };
|
|
34222
34440
|
}
|
|
34223
34441
|
if (release.channel === "local") {
|
|
34224
34442
|
const localCli = resolveSiblingFleetCliEntry(release.packageRoot, exists);
|
|
@@ -34229,7 +34447,14 @@ function createDefaultTerminalLaunchResolver(deps = {}) {
|
|
|
34229
34447
|
}
|
|
34230
34448
|
return { bin: execPath, args: [localCli, ...FLEET_HEADLESS_NATIVE_FLAGS], cwd, env: launchEnv };
|
|
34231
34449
|
}
|
|
34232
|
-
|
|
34450
|
+
const stableFleet = resolveWindowsLaunchBinary(
|
|
34451
|
+
"fleet",
|
|
34452
|
+
[...FLEET_HEADLESS_NATIVE_FLAGS],
|
|
34453
|
+
env,
|
|
34454
|
+
platform,
|
|
34455
|
+
"fleet stable terminal binary"
|
|
34456
|
+
);
|
|
34457
|
+
return { ...stableFleet, cwd, env: launchEnv };
|
|
34233
34458
|
};
|
|
34234
34459
|
}
|
|
34235
34460
|
function startTerminalShell(launch, size) {
|
|
@@ -34242,11 +34467,21 @@ function startTerminalShell(launch, size) {
|
|
|
34242
34467
|
name: TERMINAL_TERM
|
|
34243
34468
|
});
|
|
34244
34469
|
}
|
|
34245
|
-
function resolveUserShell(env) {
|
|
34470
|
+
function resolveUserShell(env, platform) {
|
|
34246
34471
|
if (env.SHELL) return env.SHELL;
|
|
34247
|
-
if (
|
|
34472
|
+
if (platform === "win32") return env.ComSpec || "powershell.exe";
|
|
34248
34473
|
return "/bin/bash";
|
|
34249
34474
|
}
|
|
34475
|
+
function resolveWindowsLaunchBinary(bin, args, env, platform, label) {
|
|
34476
|
+
if (platform !== "win32") {
|
|
34477
|
+
return { bin, args };
|
|
34478
|
+
}
|
|
34479
|
+
const resolved = resolvePathBinary(bin, env, { platform });
|
|
34480
|
+
if (!resolved) {
|
|
34481
|
+
throw new Error(`${label} "${bin}" was not found on PATH; provide an absolute path or install it before launching a terminal session.`);
|
|
34482
|
+
}
|
|
34483
|
+
return { bin: resolved.bin, args: [...resolved.prefixArgs, ...args] };
|
|
34484
|
+
}
|
|
34250
34485
|
function resolveSiblingFleetCliEntry(consolePackageRoot, exists = fs4__default.existsSync) {
|
|
34251
34486
|
const candidate = expectedSiblingFleetCliEntry(consolePackageRoot);
|
|
34252
34487
|
return exists(candidate) ? candidate : null;
|
|
@@ -34508,6 +34743,59 @@ var TheaterRegistry = class {
|
|
|
34508
34743
|
}
|
|
34509
34744
|
};
|
|
34510
34745
|
|
|
34746
|
+
// src/update-check.ts
|
|
34747
|
+
var FLEET_CONSOLE_PACKAGE_NAME = "@dotobokuri/fleet-console";
|
|
34748
|
+
var UPDATE_CHECK_TTL_MS = 60 * 60 * 1e3;
|
|
34749
|
+
var NO_UPDATE_STATUS = { updateAvailable: false };
|
|
34750
|
+
function createConsoleUpdateCheckService(deps = {}) {
|
|
34751
|
+
const readRelease = deps.readRelease ?? readFleetConsoleRelease;
|
|
34752
|
+
const fetchLatest = deps.fetchLatest ?? fetchLatestVersion;
|
|
34753
|
+
const isGreater = deps.isGreater ?? isVersionGreater;
|
|
34754
|
+
const now = deps.now ?? Date.now;
|
|
34755
|
+
const ttlMs = deps.ttlMs ?? UPDATE_CHECK_TTL_MS;
|
|
34756
|
+
let cached2 = null;
|
|
34757
|
+
let inFlight = null;
|
|
34758
|
+
const getStatus = () => {
|
|
34759
|
+
const current = cached2;
|
|
34760
|
+
if (current && now() - current.checkedAt < ttlMs) {
|
|
34761
|
+
return current.status;
|
|
34762
|
+
}
|
|
34763
|
+
void refresh();
|
|
34764
|
+
return current?.status ?? NO_UPDATE_STATUS;
|
|
34765
|
+
};
|
|
34766
|
+
const refresh = async () => {
|
|
34767
|
+
const current = cached2;
|
|
34768
|
+
if (current && now() - current.checkedAt < ttlMs) {
|
|
34769
|
+
return current.status;
|
|
34770
|
+
}
|
|
34771
|
+
if (inFlight) {
|
|
34772
|
+
return inFlight;
|
|
34773
|
+
}
|
|
34774
|
+
inFlight = resolveUpdateStatus().then((status) => {
|
|
34775
|
+
cached2 = { status, checkedAt: now() };
|
|
34776
|
+
return status;
|
|
34777
|
+
}).catch(() => {
|
|
34778
|
+
cached2 = { status: NO_UPDATE_STATUS, checkedAt: now() };
|
|
34779
|
+
return NO_UPDATE_STATUS;
|
|
34780
|
+
}).finally(() => {
|
|
34781
|
+
inFlight = null;
|
|
34782
|
+
});
|
|
34783
|
+
return inFlight;
|
|
34784
|
+
};
|
|
34785
|
+
const resolveUpdateStatus = async () => {
|
|
34786
|
+
const release = readRelease();
|
|
34787
|
+
if (release.channel === "local") {
|
|
34788
|
+
return NO_UPDATE_STATUS;
|
|
34789
|
+
}
|
|
34790
|
+
const latestVersion = await fetchLatest(FLEET_CONSOLE_PACKAGE_NAME);
|
|
34791
|
+
if (!latestVersion || !isGreater(latestVersion, release.version)) {
|
|
34792
|
+
return NO_UPDATE_STATUS;
|
|
34793
|
+
}
|
|
34794
|
+
return { updateAvailable: true, latestVersion };
|
|
34795
|
+
};
|
|
34796
|
+
return { getStatus, refresh };
|
|
34797
|
+
}
|
|
34798
|
+
|
|
34511
34799
|
// src/server.ts
|
|
34512
34800
|
var DEFAULT_HOST = "127.0.0.1";
|
|
34513
34801
|
var DEFAULT_PORT = 0;
|
|
@@ -34524,6 +34812,7 @@ function createConsoleServer(deps = {}) {
|
|
|
34524
34812
|
registerDefaultCarriers(carrierRegistry);
|
|
34525
34813
|
const lock = createConsoleLock({ hostname: () => host });
|
|
34526
34814
|
const observability = createConsoleObservabilityStore();
|
|
34815
|
+
const updateCheck = deps.updateCheck ?? createConsoleUpdateCheckService();
|
|
34527
34816
|
const theaters = new TheaterRegistry();
|
|
34528
34817
|
const terminalTickets = createTerminalTicketRegistry();
|
|
34529
34818
|
const folderGrants = createFolderGrantStore();
|
|
@@ -34891,6 +35180,7 @@ function createConsoleServer(deps = {}) {
|
|
|
34891
35180
|
jobs: observability.listWorkspaces().reduce((count, workspace) => count + observability.listJobs(workspace.tenantId).length, 0),
|
|
34892
35181
|
version: version2,
|
|
34893
35182
|
channel,
|
|
35183
|
+
...updateCheck.getStatus(),
|
|
34894
35184
|
port: lockHandle?.payload.port ?? port,
|
|
34895
35185
|
wikiServerStatus: resolveWikiServerStatus(theaterId)
|
|
34896
35186
|
};
|
|
@@ -35007,6 +35297,7 @@ function createConsoleServer(deps = {}) {
|
|
|
35007
35297
|
});
|
|
35008
35298
|
});
|
|
35009
35299
|
if (!activeEndpoint) throw new Error("Console endpoint unavailable");
|
|
35300
|
+
void updateCheck.refresh();
|
|
35010
35301
|
return activeEndpoint;
|
|
35011
35302
|
},
|
|
35012
35303
|
async stop() {
|