overlane 0.1.140 → 0.1.141
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/overlane.mjs +1885 -404
- package/package.json +1 -1
- package/plugins/claude/plugins/mvrx-harness/.claude-plugin/plugin.json +1 -1
- package/plugins/claude/plugins/mvrx-harness/scripts/harness-codemap.mjs +18 -18
- package/plugins/claude/plugins/mvrx-harness/scripts/harness-context.mjs +19 -19
- package/plugins/claude/plugins/mvrx-harness/scripts/harness-guard.mjs +12 -12
- package/plugins/claude/plugins/mvrx-harness/scripts/harness-intake.mjs +19 -19
- package/plugins/claude/plugins/mvrx-harness/scripts/harness-quota.mjs +17 -17
- package/plugins/claude/plugins/mvrx-harness/scripts/harness-statusline.mjs +13 -13
- package/plugins/claude/plugins/mvrx-harness/scripts/harness-stop.mjs +17 -17
- package/plugins/codex/plugins/mvrx-harness/.codex-plugin/plugin.json +1 -1
- package/plugins/codex/plugins/mvrx-harness/scripts/harness-codemap.mjs +18 -18
- package/plugins/codex/plugins/mvrx-harness/scripts/harness-context.mjs +19 -19
- package/plugins/codex/plugins/mvrx-harness/scripts/harness-guard.mjs +12 -12
- package/plugins/codex/plugins/mvrx-harness/scripts/harness-intake.mjs +19 -19
- package/plugins/codex/plugins/mvrx-harness/scripts/harness-quota.mjs +17 -17
- package/plugins/codex/plugins/mvrx-harness/scripts/harness-statusline.mjs +13 -13
- package/plugins/codex/plugins/mvrx-harness/scripts/harness-stop.mjs +17 -17
- package/plugins/release-manifest.json +23 -23
package/dist/overlane.mjs
CHANGED
|
@@ -288,14 +288,14 @@ function promiseAllObject(promisesObj) {
|
|
|
288
288
|
}
|
|
289
289
|
function randomString(length = 10) {
|
|
290
290
|
const chars = "abcdefghijklmnopqrstuvwxyz";
|
|
291
|
-
let
|
|
291
|
+
let str2 = "";
|
|
292
292
|
for (let i2 = 0; i2 < length; i2++) {
|
|
293
|
-
|
|
293
|
+
str2 += chars[Math.floor(Math.random() * chars.length)];
|
|
294
294
|
}
|
|
295
|
-
return
|
|
295
|
+
return str2;
|
|
296
296
|
}
|
|
297
|
-
function esc(
|
|
298
|
-
return JSON.stringify(
|
|
297
|
+
function esc(str2) {
|
|
298
|
+
return JSON.stringify(str2);
|
|
299
299
|
}
|
|
300
300
|
function slugify(input2) {
|
|
301
301
|
return input2.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
@@ -339,8 +339,8 @@ function numKeys(data) {
|
|
|
339
339
|
}
|
|
340
340
|
return keyCount;
|
|
341
341
|
}
|
|
342
|
-
function escapeRegex(
|
|
343
|
-
return
|
|
342
|
+
function escapeRegex(str2) {
|
|
343
|
+
return str2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
344
344
|
}
|
|
345
345
|
function clone(inst, def, params) {
|
|
346
346
|
const cl = new inst._zod.constr(def ?? inst._zod.def);
|
|
@@ -582,13 +582,13 @@ function getSizableOrigin(input2) {
|
|
|
582
582
|
return "file";
|
|
583
583
|
return "unknown";
|
|
584
584
|
}
|
|
585
|
-
function codePointLength(
|
|
586
|
-
const units =
|
|
587
|
-
if (!highSurrogate.test(
|
|
585
|
+
function codePointLength(str2) {
|
|
586
|
+
const units = str2.length;
|
|
587
|
+
if (!highSurrogate.test(str2))
|
|
588
588
|
return units;
|
|
589
589
|
let count = units;
|
|
590
590
|
for (let i2 = 0; i2 < units - 1; i2++) {
|
|
591
|
-
if ((
|
|
591
|
+
if ((str2.charCodeAt(i2) & 64512) === 55296 && (str2.charCodeAt(i2 + 1) & 64512) === 56320) {
|
|
592
592
|
count--;
|
|
593
593
|
i2++;
|
|
594
594
|
}
|
|
@@ -4545,7 +4545,7 @@ function isRef(value) {
|
|
|
4545
4545
|
function cloneIssues(issues) {
|
|
4546
4546
|
return issues.map((iss) => iss.path ? { ...iss, path: iss.path.slice() } : { ...iss });
|
|
4547
4547
|
}
|
|
4548
|
-
function isRecursive(inst, stack,
|
|
4548
|
+
function isRecursive(inst, stack, resolve20) {
|
|
4549
4549
|
const cached2 = recursive.get(inst);
|
|
4550
4550
|
if (cached2 !== void 0)
|
|
4551
4551
|
return cached2 ? PROVEN : NONE;
|
|
@@ -4555,7 +4555,7 @@ function isRecursive(inst, stack, resolve17) {
|
|
|
4555
4555
|
let result = NONE;
|
|
4556
4556
|
const check2 = (child) => {
|
|
4557
4557
|
if (result !== PROVEN && child?._zod) {
|
|
4558
|
-
const answer = isRecursive(child, stack,
|
|
4558
|
+
const answer = isRecursive(child, stack, resolve20);
|
|
4559
4559
|
if (answer > result)
|
|
4560
4560
|
result = answer;
|
|
4561
4561
|
}
|
|
@@ -4566,7 +4566,7 @@ function isRecursive(inst, stack, resolve17) {
|
|
|
4566
4566
|
const desc = Object.getOwnPropertyDescriptor(sh, key);
|
|
4567
4567
|
if (spread && !desc.enumerable)
|
|
4568
4568
|
continue;
|
|
4569
|
-
const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack,
|
|
4569
|
+
const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack, resolve20) : NONE;
|
|
4570
4570
|
if (child > answer)
|
|
4571
4571
|
answer = child;
|
|
4572
4572
|
}
|
|
@@ -4630,7 +4630,7 @@ function isRecursive(inst, stack, resolve17) {
|
|
|
4630
4630
|
break;
|
|
4631
4631
|
// `$ZodLazy` caches its inner on the def, so a resolved edge is followed exactly
|
|
4632
4632
|
case "lazy": {
|
|
4633
|
-
const inner = def._cachedInner ?? (
|
|
4633
|
+
const inner = def._cachedInner ?? (resolve20 ? inst._zod.innerType : void 0);
|
|
4634
4634
|
merge2(inner ? isRecursive(inner, stack, false) : ASSUMED);
|
|
4635
4635
|
break;
|
|
4636
4636
|
}
|
|
@@ -24440,13 +24440,13 @@ var init_git = __esm({
|
|
|
24440
24440
|
|
|
24441
24441
|
// ../contracts/src/ci.ts
|
|
24442
24442
|
function stripComment(text) {
|
|
24443
|
-
let
|
|
24443
|
+
let quote4 = null;
|
|
24444
24444
|
for (let i2 = 0; i2 < text.length; i2 += 1) {
|
|
24445
24445
|
const ch = text[i2];
|
|
24446
|
-
if (
|
|
24447
|
-
if (ch ===
|
|
24446
|
+
if (quote4 !== null) {
|
|
24447
|
+
if (ch === quote4) quote4 = null;
|
|
24448
24448
|
} else if (ch === '"' || ch === "'") {
|
|
24449
|
-
if (i2 === 0 || /[\s[,{:]/.test(text[i2 - 1] ?? " "))
|
|
24449
|
+
if (i2 === 0 || /[\s[,{:]/.test(text[i2 - 1] ?? " ")) quote4 = ch;
|
|
24450
24450
|
} else if (ch === "#" && (i2 === 0 || /\s/.test(text[i2 - 1] ?? ""))) {
|
|
24451
24451
|
return text.slice(0, i2);
|
|
24452
24452
|
}
|
|
@@ -24478,13 +24478,13 @@ function parseScalar(raw, line3) {
|
|
|
24478
24478
|
const inner = text.slice(1, -1);
|
|
24479
24479
|
const items = [];
|
|
24480
24480
|
let current2 = "";
|
|
24481
|
-
let
|
|
24481
|
+
let quote4 = null;
|
|
24482
24482
|
for (const ch of inner) {
|
|
24483
|
-
if (
|
|
24483
|
+
if (quote4 !== null) {
|
|
24484
24484
|
current2 += ch;
|
|
24485
|
-
if (ch ===
|
|
24485
|
+
if (ch === quote4) quote4 = null;
|
|
24486
24486
|
} else if (ch === '"' || ch === "'") {
|
|
24487
|
-
|
|
24487
|
+
quote4 = ch;
|
|
24488
24488
|
current2 += ch;
|
|
24489
24489
|
} else if (ch === ",") {
|
|
24490
24490
|
items.push(parseScalar(current2, line3));
|
|
@@ -27154,6 +27154,67 @@ var init_observability = __esm({
|
|
|
27154
27154
|
}
|
|
27155
27155
|
});
|
|
27156
27156
|
|
|
27157
|
+
// ../contracts/src/code-nav.ts
|
|
27158
|
+
var CodeNavFreshness, CodeNavMeta, CodeNavSymbol, CodeNavTextHit, CodeFindAnswer, CodeOutlineAnswer, CodeRefsAnswer, CodeSpanAnswer;
|
|
27159
|
+
var init_code_nav = __esm({
|
|
27160
|
+
"../contracts/src/code-nav.ts"() {
|
|
27161
|
+
"use strict";
|
|
27162
|
+
init_zod();
|
|
27163
|
+
CodeNavFreshness = external_exports.enum(["fresh", "partial", "stale", "unavailable"]);
|
|
27164
|
+
CodeNavMeta = external_exports.object({
|
|
27165
|
+
/** The commit the index describes; null with no index. */
|
|
27166
|
+
indexedCommit: external_exports.string().nullable(),
|
|
27167
|
+
/** The commit the caller asked about (the checkout's HEAD for the local source); null when unknown. */
|
|
27168
|
+
requestedCommit: external_exports.string().nullable(),
|
|
27169
|
+
coverage: external_exports.object({
|
|
27170
|
+
/** Files the index parsed. */
|
|
27171
|
+
files: external_exports.number().int().nonnegative(),
|
|
27172
|
+
symbols: external_exports.number().int().nonnegative(),
|
|
27173
|
+
/** Files that could not be parsed (unsupported language, too large). */
|
|
27174
|
+
uncovered: external_exports.number().int().nonnegative(),
|
|
27175
|
+
/** Files that differ between the indexed and the requested commit; their answers come from a pattern scan or are missing. */
|
|
27176
|
+
changedSinceIndex: external_exports.number().int().nonnegative()
|
|
27177
|
+
}).strict(),
|
|
27178
|
+
freshness: CodeNavFreshness,
|
|
27179
|
+
/** True when an empty or short answer may be missing results (stale, partial or uncovered files), as opposed to a certain "no match". */
|
|
27180
|
+
incomplete: external_exports.boolean(),
|
|
27181
|
+
notice: external_exports.string().optional()
|
|
27182
|
+
}).strict();
|
|
27183
|
+
CodeNavSymbol = external_exports.object({ kind: external_exports.string(), qualified: external_exports.string(), path: external_exports.string(), line: external_exports.number().int().positive(), endLine: external_exports.number().int().positive().optional() }).strict();
|
|
27184
|
+
CodeNavTextHit = external_exports.object({ path: external_exports.string(), line: external_exports.number().int().positive(), text: external_exports.string() }).strict();
|
|
27185
|
+
CodeFindAnswer = CodeNavMeta.extend({
|
|
27186
|
+
source: external_exports.enum(["index", "search"]),
|
|
27187
|
+
matches: external_exports.array(CodeNavSymbol),
|
|
27188
|
+
more: external_exports.boolean(),
|
|
27189
|
+
/** Literal-search lines, when the index could not answer. */
|
|
27190
|
+
lines: external_exports.array(CodeNavTextHit).optional()
|
|
27191
|
+
}).strict();
|
|
27192
|
+
CodeOutlineAnswer = CodeNavMeta.extend({
|
|
27193
|
+
path: external_exports.string(),
|
|
27194
|
+
source: external_exports.enum(["index", "pattern"]),
|
|
27195
|
+
symbols: external_exports.array(external_exports.object({ line: external_exports.number().int().positive(), kind: external_exports.string(), name: external_exports.string() }).strict())
|
|
27196
|
+
}).strict();
|
|
27197
|
+
CodeRefsAnswer = CodeNavMeta.extend({
|
|
27198
|
+
name: external_exports.string(),
|
|
27199
|
+
source: external_exports.enum(["index", "search"]),
|
|
27200
|
+
callers: external_exports.array(CodeNavSymbol),
|
|
27201
|
+
matches: external_exports.array(CodeNavTextHit),
|
|
27202
|
+
skippedImports: external_exports.number().int().nonnegative(),
|
|
27203
|
+
more: external_exports.number().int().nonnegative()
|
|
27204
|
+
}).strict();
|
|
27205
|
+
CodeSpanAnswer = CodeNavMeta.extend({
|
|
27206
|
+
found: external_exports.boolean(),
|
|
27207
|
+
path: external_exports.string(),
|
|
27208
|
+
kind: external_exports.string(),
|
|
27209
|
+
qualified: external_exports.string(),
|
|
27210
|
+
start: external_exports.number().int().nonnegative(),
|
|
27211
|
+
end: external_exports.number().int().nonnegative(),
|
|
27212
|
+
/** Other definitions of the same name, best first. */
|
|
27213
|
+
also: external_exports.array(CodeNavSymbol)
|
|
27214
|
+
}).strict();
|
|
27215
|
+
}
|
|
27216
|
+
});
|
|
27217
|
+
|
|
27157
27218
|
// ../contracts/src/index.ts
|
|
27158
27219
|
var init_src = __esm({
|
|
27159
27220
|
"../contracts/src/index.ts"() {
|
|
@@ -27205,6 +27266,7 @@ var init_src = __esm({
|
|
|
27205
27266
|
init_egress();
|
|
27206
27267
|
init_enterprise();
|
|
27207
27268
|
init_observability();
|
|
27269
|
+
init_code_nav();
|
|
27208
27270
|
}
|
|
27209
27271
|
});
|
|
27210
27272
|
|
|
@@ -28155,13 +28217,13 @@ var require_Collection = __commonJS({
|
|
|
28155
28217
|
var require_stringifyComment = __commonJS({
|
|
28156
28218
|
"../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/stringify/stringifyComment.js"(exports) {
|
|
28157
28219
|
"use strict";
|
|
28158
|
-
var stringifyComment = (
|
|
28220
|
+
var stringifyComment = (str2) => str2.replace(/^(?!$)(?: $)?/gm, "#");
|
|
28159
28221
|
function indentComment(comment, indent) {
|
|
28160
28222
|
if (/^\n+$/.test(comment))
|
|
28161
28223
|
return comment.substring(1);
|
|
28162
28224
|
return indent ? comment.replace(/^(?! *$)/gm, indent) : comment;
|
|
28163
28225
|
}
|
|
28164
|
-
var lineComment = (
|
|
28226
|
+
var lineComment = (str2, indent, comment) => str2.endsWith("\n") ? indentComment(comment, indent) : comment.includes("\n") ? "\n" + indentComment(comment, indent) : (str2.endsWith(" ") ? "" : " ") + comment;
|
|
28165
28227
|
exports.indentComment = indentComment;
|
|
28166
28228
|
exports.lineComment = lineComment;
|
|
28167
28229
|
exports.stringifyComment = stringifyComment;
|
|
@@ -28315,16 +28377,16 @@ var require_stringifyString = __commonJS({
|
|
|
28315
28377
|
lineWidth: ctx.options.lineWidth,
|
|
28316
28378
|
minContentWidth: ctx.options.minContentWidth
|
|
28317
28379
|
});
|
|
28318
|
-
var containsDocumentMarker = (
|
|
28319
|
-
function lineLengthOverLimit(
|
|
28380
|
+
var containsDocumentMarker = (str2) => /^(%|---|\.\.\.)/m.test(str2);
|
|
28381
|
+
function lineLengthOverLimit(str2, lineWidth, indentLength) {
|
|
28320
28382
|
if (!lineWidth || lineWidth < 0)
|
|
28321
28383
|
return false;
|
|
28322
28384
|
const limit = lineWidth - indentLength;
|
|
28323
|
-
const strLen =
|
|
28385
|
+
const strLen = str2.length;
|
|
28324
28386
|
if (strLen <= limit)
|
|
28325
28387
|
return false;
|
|
28326
28388
|
for (let i2 = 0, start2 = 0; i2 < strLen; ++i2) {
|
|
28327
|
-
if (
|
|
28389
|
+
if (str2[i2] === "\n") {
|
|
28328
28390
|
if (i2 - start2 > limit)
|
|
28329
28391
|
return true;
|
|
28330
28392
|
start2 = i2 + 1;
|
|
@@ -28341,11 +28403,11 @@ var require_stringifyString = __commonJS({
|
|
|
28341
28403
|
const { implicitKey } = ctx;
|
|
28342
28404
|
const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength;
|
|
28343
28405
|
const indent = ctx.indent || (containsDocumentMarker(value) ? " " : "");
|
|
28344
|
-
let
|
|
28406
|
+
let str2 = "";
|
|
28345
28407
|
let start2 = 0;
|
|
28346
28408
|
for (let i2 = 0, ch = json2[i2]; ch; ch = json2[++i2]) {
|
|
28347
28409
|
if (ch === " " && json2[i2 + 1] === "\\" && json2[i2 + 2] === "n") {
|
|
28348
|
-
|
|
28410
|
+
str2 += json2.slice(start2, i2) + "\\ ";
|
|
28349
28411
|
i2 += 1;
|
|
28350
28412
|
start2 = i2;
|
|
28351
28413
|
ch = "\\";
|
|
@@ -28354,38 +28416,38 @@ var require_stringifyString = __commonJS({
|
|
|
28354
28416
|
switch (json2[i2 + 1]) {
|
|
28355
28417
|
case "u":
|
|
28356
28418
|
{
|
|
28357
|
-
|
|
28419
|
+
str2 += json2.slice(start2, i2);
|
|
28358
28420
|
const code2 = json2.substr(i2 + 2, 4);
|
|
28359
28421
|
switch (code2) {
|
|
28360
28422
|
case "0000":
|
|
28361
|
-
|
|
28423
|
+
str2 += "\\0";
|
|
28362
28424
|
break;
|
|
28363
28425
|
case "0007":
|
|
28364
|
-
|
|
28426
|
+
str2 += "\\a";
|
|
28365
28427
|
break;
|
|
28366
28428
|
case "000b":
|
|
28367
|
-
|
|
28429
|
+
str2 += "\\v";
|
|
28368
28430
|
break;
|
|
28369
28431
|
case "001b":
|
|
28370
|
-
|
|
28432
|
+
str2 += "\\e";
|
|
28371
28433
|
break;
|
|
28372
28434
|
case "0085":
|
|
28373
|
-
|
|
28435
|
+
str2 += "\\N";
|
|
28374
28436
|
break;
|
|
28375
28437
|
case "00a0":
|
|
28376
|
-
|
|
28438
|
+
str2 += "\\_";
|
|
28377
28439
|
break;
|
|
28378
28440
|
case "2028":
|
|
28379
|
-
|
|
28441
|
+
str2 += "\\L";
|
|
28380
28442
|
break;
|
|
28381
28443
|
case "2029":
|
|
28382
|
-
|
|
28444
|
+
str2 += "\\P";
|
|
28383
28445
|
break;
|
|
28384
28446
|
default:
|
|
28385
28447
|
if (code2.substr(0, 2) === "00")
|
|
28386
|
-
|
|
28448
|
+
str2 += "\\x" + code2.substr(2);
|
|
28387
28449
|
else
|
|
28388
|
-
|
|
28450
|
+
str2 += json2.substr(i2, 6);
|
|
28389
28451
|
}
|
|
28390
28452
|
i2 += 5;
|
|
28391
28453
|
start2 = i2 + 1;
|
|
@@ -28395,14 +28457,14 @@ var require_stringifyString = __commonJS({
|
|
|
28395
28457
|
if (implicitKey || json2[i2 + 2] === '"' || json2.length < minMultiLineLength) {
|
|
28396
28458
|
i2 += 1;
|
|
28397
28459
|
} else {
|
|
28398
|
-
|
|
28460
|
+
str2 += json2.slice(start2, i2) + "\n\n";
|
|
28399
28461
|
while (json2[i2 + 2] === "\\" && json2[i2 + 3] === "n" && json2[i2 + 4] !== '"') {
|
|
28400
|
-
|
|
28462
|
+
str2 += "\n";
|
|
28401
28463
|
i2 += 2;
|
|
28402
28464
|
}
|
|
28403
|
-
|
|
28465
|
+
str2 += indent;
|
|
28404
28466
|
if (json2[i2 + 2] === " ")
|
|
28405
|
-
|
|
28467
|
+
str2 += "\\";
|
|
28406
28468
|
i2 += 1;
|
|
28407
28469
|
start2 = i2 + 1;
|
|
28408
28470
|
}
|
|
@@ -28411,8 +28473,8 @@ var require_stringifyString = __commonJS({
|
|
|
28411
28473
|
i2 += 1;
|
|
28412
28474
|
}
|
|
28413
28475
|
}
|
|
28414
|
-
|
|
28415
|
-
return implicitKey ?
|
|
28476
|
+
str2 = start2 ? str2 + json2.slice(start2) : json2;
|
|
28477
|
+
return implicitKey ? str2 : foldFlowLines.foldFlowLines(str2, indent, foldFlowLines.FOLD_QUOTED, getFoldOptions(ctx, false));
|
|
28416
28478
|
}
|
|
28417
28479
|
function singleQuotedString(value, ctx) {
|
|
28418
28480
|
if (ctx.options.singleQuote === false || ctx.implicitKey && value.includes("\n") || /[ \t]\n|\n[ \t]/.test(value))
|
|
@@ -28540,15 +28602,15 @@ ${indent}${start2}${value}${end}`;
|
|
|
28540
28602
|
return quotedString(value, ctx);
|
|
28541
28603
|
}
|
|
28542
28604
|
}
|
|
28543
|
-
const
|
|
28605
|
+
const str2 = value.replace(/\n+/g, `$&
|
|
28544
28606
|
${indent}`);
|
|
28545
28607
|
if (actualString) {
|
|
28546
|
-
const test = (tag) => tag.default && tag.tag !== "tag:yaml.org,2002:str" && tag.test?.test(
|
|
28608
|
+
const test = (tag) => tag.default && tag.tag !== "tag:yaml.org,2002:str" && tag.test?.test(str2);
|
|
28547
28609
|
const { compat, tags } = ctx.doc.schema;
|
|
28548
28610
|
if (tags.some(test) || compat?.some(test))
|
|
28549
28611
|
return quotedString(value, ctx);
|
|
28550
28612
|
}
|
|
28551
|
-
return implicitKey ?
|
|
28613
|
+
return implicitKey ? str2 : foldFlowLines.foldFlowLines(str2, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false));
|
|
28552
28614
|
}
|
|
28553
28615
|
function stringifyString(item, ctx, onComment, onChompKeep) {
|
|
28554
28616
|
const { implicitKey, inFlow } = ctx;
|
|
@@ -28700,11 +28762,11 @@ var require_stringify = __commonJS({
|
|
|
28700
28762
|
const props = stringifyProps(node2, tagObj, ctx);
|
|
28701
28763
|
if (props.length > 0)
|
|
28702
28764
|
ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1;
|
|
28703
|
-
const
|
|
28765
|
+
const str2 = typeof tagObj.stringify === "function" ? tagObj.stringify(node2, ctx, onComment, onChompKeep) : identity.isScalar(node2) ? stringifyString.stringifyString(node2, ctx, onComment, onChompKeep) : node2.toString(ctx, onComment, onChompKeep);
|
|
28704
28766
|
if (!props)
|
|
28705
|
-
return
|
|
28706
|
-
return identity.isScalar(node2) ||
|
|
28707
|
-
${ctx.indent}${
|
|
28767
|
+
return str2;
|
|
28768
|
+
return identity.isScalar(node2) || str2[0] === "{" || str2[0] === "[" ? `${props} ${str2}` : `${props}
|
|
28769
|
+
${ctx.indent}${str2}`;
|
|
28708
28770
|
}
|
|
28709
28771
|
exports.createStringifyContext = createStringifyContext;
|
|
28710
28772
|
exports.stringify = stringify2;
|
|
@@ -28739,8 +28801,8 @@ var require_stringifyPair = __commonJS({
|
|
|
28739
28801
|
});
|
|
28740
28802
|
let keyCommentDone = false;
|
|
28741
28803
|
let chompKeep = false;
|
|
28742
|
-
let
|
|
28743
|
-
if (!explicitKey && !ctx.inFlow &&
|
|
28804
|
+
let str2 = stringify2.stringify(key, ctx, () => keyCommentDone = true, () => chompKeep = true);
|
|
28805
|
+
if (!explicitKey && !ctx.inFlow && str2.length > 1024) {
|
|
28744
28806
|
if (simpleKeys)
|
|
28745
28807
|
throw new Error("With simple keys, single line scalar must not span more than 1024 characters");
|
|
28746
28808
|
explicitKey = true;
|
|
@@ -28749,27 +28811,27 @@ var require_stringifyPair = __commonJS({
|
|
|
28749
28811
|
if (allNullValues || value == null) {
|
|
28750
28812
|
if (keyCommentDone && onComment)
|
|
28751
28813
|
onComment();
|
|
28752
|
-
return
|
|
28814
|
+
return str2 === "" ? "?" : explicitKey ? `? ${str2}` : str2;
|
|
28753
28815
|
}
|
|
28754
28816
|
} else if (allNullValues && !simpleKeys || value == null && explicitKey) {
|
|
28755
|
-
|
|
28817
|
+
str2 = `? ${str2}`;
|
|
28756
28818
|
if (keyComment && !keyCommentDone) {
|
|
28757
|
-
|
|
28819
|
+
str2 += stringifyComment.lineComment(str2, ctx.indent, commentString(keyComment));
|
|
28758
28820
|
} else if (chompKeep && onChompKeep)
|
|
28759
28821
|
onChompKeep();
|
|
28760
|
-
return
|
|
28822
|
+
return str2;
|
|
28761
28823
|
}
|
|
28762
28824
|
if (keyCommentDone)
|
|
28763
28825
|
keyComment = null;
|
|
28764
28826
|
if (explicitKey) {
|
|
28765
28827
|
if (keyComment)
|
|
28766
|
-
|
|
28767
|
-
|
|
28828
|
+
str2 += stringifyComment.lineComment(str2, ctx.indent, commentString(keyComment));
|
|
28829
|
+
str2 = `? ${str2}
|
|
28768
28830
|
${indent}:`;
|
|
28769
28831
|
} else {
|
|
28770
|
-
|
|
28832
|
+
str2 = `${str2}:`;
|
|
28771
28833
|
if (keyComment)
|
|
28772
|
-
|
|
28834
|
+
str2 += stringifyComment.lineComment(str2, ctx.indent, commentString(keyComment));
|
|
28773
28835
|
}
|
|
28774
28836
|
let vsb, vcb, valueComment;
|
|
28775
28837
|
if (identity.isNode(value)) {
|
|
@@ -28785,7 +28847,7 @@ ${indent}:`;
|
|
|
28785
28847
|
}
|
|
28786
28848
|
ctx.implicitKey = false;
|
|
28787
28849
|
if (!explicitKey && !keyComment && identity.isScalar(value))
|
|
28788
|
-
ctx.indentAtStart =
|
|
28850
|
+
ctx.indentAtStart = str2.length + 1;
|
|
28789
28851
|
chompKeep = false;
|
|
28790
28852
|
if (!indentSeq && indentStep.length >= 2 && !ctx.inFlow && !explicitKey && identity.isSeq(value) && !value.flow && !value.tag && !value.anchor) {
|
|
28791
28853
|
ctx.indent = ctx.indent.substring(2);
|
|
@@ -28829,16 +28891,16 @@ ${ctx.indent}`;
|
|
|
28829
28891
|
} else if (valueStr === "" || valueStr[0] === "\n") {
|
|
28830
28892
|
ws = "";
|
|
28831
28893
|
}
|
|
28832
|
-
|
|
28894
|
+
str2 += ws + valueStr;
|
|
28833
28895
|
if (ctx.inFlow) {
|
|
28834
28896
|
if (valueCommentDone && onComment)
|
|
28835
28897
|
onComment();
|
|
28836
28898
|
} else if (valueComment && !valueCommentDone) {
|
|
28837
|
-
|
|
28899
|
+
str2 += stringifyComment.lineComment(str2, ctx.indent, commentString(valueComment));
|
|
28838
28900
|
} else if (chompKeep && onChompKeep) {
|
|
28839
28901
|
onChompKeep();
|
|
28840
28902
|
}
|
|
28841
|
-
return
|
|
28903
|
+
return str2;
|
|
28842
28904
|
}
|
|
28843
28905
|
exports.stringifyPair = stringifyPair;
|
|
28844
28906
|
}
|
|
@@ -29065,31 +29127,31 @@ var require_stringifyCollection = __commonJS({
|
|
|
29065
29127
|
}
|
|
29066
29128
|
}
|
|
29067
29129
|
chompKeep = false;
|
|
29068
|
-
let
|
|
29130
|
+
let str3 = stringify2.stringify(item, itemCtx, () => comment2 = null, () => chompKeep = true);
|
|
29069
29131
|
if (comment2)
|
|
29070
|
-
|
|
29132
|
+
str3 += stringifyComment.lineComment(str3, itemIndent, commentString(comment2));
|
|
29071
29133
|
if (chompKeep && comment2)
|
|
29072
29134
|
chompKeep = false;
|
|
29073
|
-
lines.push(blockItemPrefix +
|
|
29135
|
+
lines.push(blockItemPrefix + str3);
|
|
29074
29136
|
}
|
|
29075
|
-
let
|
|
29137
|
+
let str2;
|
|
29076
29138
|
if (lines.length === 0) {
|
|
29077
|
-
|
|
29139
|
+
str2 = flowChars.start + flowChars.end;
|
|
29078
29140
|
} else {
|
|
29079
|
-
|
|
29141
|
+
str2 = lines[0];
|
|
29080
29142
|
for (let i2 = 1; i2 < lines.length; ++i2) {
|
|
29081
29143
|
const line3 = lines[i2];
|
|
29082
|
-
|
|
29144
|
+
str2 += line3 ? `
|
|
29083
29145
|
${indent}${line3}` : "\n";
|
|
29084
29146
|
}
|
|
29085
29147
|
}
|
|
29086
29148
|
if (comment) {
|
|
29087
|
-
|
|
29149
|
+
str2 += "\n" + stringifyComment.indentComment(commentString(comment), indent);
|
|
29088
29150
|
if (onComment)
|
|
29089
29151
|
onComment();
|
|
29090
29152
|
} else if (chompKeep && onChompKeep)
|
|
29091
29153
|
onChompKeep();
|
|
29092
|
-
return
|
|
29154
|
+
return str2;
|
|
29093
29155
|
}
|
|
29094
29156
|
function stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) {
|
|
29095
29157
|
const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx;
|
|
@@ -29132,21 +29194,21 @@ ${indent}${line3}` : "\n";
|
|
|
29132
29194
|
}
|
|
29133
29195
|
if (comment)
|
|
29134
29196
|
reqNewline = true;
|
|
29135
|
-
let
|
|
29136
|
-
reqNewline || (reqNewline = lines.length > linesAtValue ||
|
|
29197
|
+
let str2 = stringify2.stringify(item, itemCtx, () => comment = null);
|
|
29198
|
+
reqNewline || (reqNewline = lines.length > linesAtValue || str2.includes("\n"));
|
|
29137
29199
|
if (i2 < items.length - 1) {
|
|
29138
|
-
|
|
29200
|
+
str2 += ",";
|
|
29139
29201
|
} else if (ctx.options.trailingComma) {
|
|
29140
29202
|
if (ctx.options.lineWidth > 0) {
|
|
29141
|
-
reqNewline || (reqNewline = lines.reduce((sum, line3) => sum + line3.length + 2, 2) + (
|
|
29203
|
+
reqNewline || (reqNewline = lines.reduce((sum, line3) => sum + line3.length + 2, 2) + (str2.length + 2) > ctx.options.lineWidth);
|
|
29142
29204
|
}
|
|
29143
29205
|
if (reqNewline) {
|
|
29144
|
-
|
|
29206
|
+
str2 += ",";
|
|
29145
29207
|
}
|
|
29146
29208
|
}
|
|
29147
29209
|
if (comment)
|
|
29148
|
-
|
|
29149
|
-
lines.push(
|
|
29210
|
+
str2 += stringifyComment.lineComment(str2, itemIndent, commentString(comment));
|
|
29211
|
+
lines.push(str2);
|
|
29150
29212
|
linesAtValue = lines.length;
|
|
29151
29213
|
}
|
|
29152
29214
|
const { start: start2, end } = flowChars;
|
|
@@ -29158,11 +29220,11 @@ ${indent}${line3}` : "\n";
|
|
|
29158
29220
|
reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth;
|
|
29159
29221
|
}
|
|
29160
29222
|
if (reqNewline) {
|
|
29161
|
-
let
|
|
29223
|
+
let str2 = start2;
|
|
29162
29224
|
for (const line3 of lines)
|
|
29163
|
-
|
|
29225
|
+
str2 += line3 ? `
|
|
29164
29226
|
${indentStep}${indent}${line3}` : "\n";
|
|
29165
|
-
return `${
|
|
29227
|
+
return `${str2}
|
|
29166
29228
|
${indent}${end}`;
|
|
29167
29229
|
} else {
|
|
29168
29230
|
return `${start2}${fcPadding}${lines.join(" ")}${fcPadding}${end}`;
|
|
@@ -29494,7 +29556,7 @@ var require_string = __commonJS({
|
|
|
29494
29556
|
identify: (value) => typeof value === "string",
|
|
29495
29557
|
default: true,
|
|
29496
29558
|
tag: "tag:yaml.org,2002:str",
|
|
29497
|
-
resolve: (
|
|
29559
|
+
resolve: (str2) => str2,
|
|
29498
29560
|
stringify(item, ctx, onComment, onChompKeep) {
|
|
29499
29561
|
ctx = Object.assign({ actualString: true }, ctx);
|
|
29500
29562
|
return stringifyString.stringifyString(item, ctx, onComment, onChompKeep);
|
|
@@ -29532,7 +29594,7 @@ var require_bool = __commonJS({
|
|
|
29532
29594
|
default: true,
|
|
29533
29595
|
tag: "tag:yaml.org,2002:bool",
|
|
29534
29596
|
test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,
|
|
29535
|
-
resolve: (
|
|
29597
|
+
resolve: (str2) => new Scalar.Scalar(str2[0] === "t" || str2[0] === "T"),
|
|
29536
29598
|
stringify({ source, value }, ctx) {
|
|
29537
29599
|
if (source && boolTag.test.test(source)) {
|
|
29538
29600
|
const sv = source[0] === "t" || source[0] === "T";
|
|
@@ -29584,7 +29646,7 @@ var require_float = __commonJS({
|
|
|
29584
29646
|
default: true,
|
|
29585
29647
|
tag: "tag:yaml.org,2002:float",
|
|
29586
29648
|
test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,
|
|
29587
|
-
resolve: (
|
|
29649
|
+
resolve: (str2) => str2.slice(-3).toLowerCase() === "nan" ? NaN : str2[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
|
|
29588
29650
|
stringify: stringifyNumber.stringifyNumber
|
|
29589
29651
|
};
|
|
29590
29652
|
var floatExp = {
|
|
@@ -29593,7 +29655,7 @@ var require_float = __commonJS({
|
|
|
29593
29655
|
tag: "tag:yaml.org,2002:float",
|
|
29594
29656
|
format: "EXP",
|
|
29595
29657
|
test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,
|
|
29596
|
-
resolve: (
|
|
29658
|
+
resolve: (str2) => parseFloat(str2),
|
|
29597
29659
|
stringify(node2) {
|
|
29598
29660
|
const num = Number(node2.value);
|
|
29599
29661
|
return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node2);
|
|
@@ -29604,11 +29666,11 @@ var require_float = __commonJS({
|
|
|
29604
29666
|
default: true,
|
|
29605
29667
|
tag: "tag:yaml.org,2002:float",
|
|
29606
29668
|
test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,
|
|
29607
|
-
resolve(
|
|
29608
|
-
const node2 = new Scalar.Scalar(parseFloat(
|
|
29609
|
-
const dot =
|
|
29610
|
-
if (dot !== -1 &&
|
|
29611
|
-
node2.minFractionDigits =
|
|
29669
|
+
resolve(str2) {
|
|
29670
|
+
const node2 = new Scalar.Scalar(parseFloat(str2));
|
|
29671
|
+
const dot = str2.indexOf(".");
|
|
29672
|
+
if (dot !== -1 && str2[str2.length - 1] === "0")
|
|
29673
|
+
node2.minFractionDigits = str2.length - dot - 1;
|
|
29612
29674
|
return node2;
|
|
29613
29675
|
},
|
|
29614
29676
|
stringify: stringifyNumber.stringifyNumber
|
|
@@ -29625,7 +29687,7 @@ var require_int = __commonJS({
|
|
|
29625
29687
|
"use strict";
|
|
29626
29688
|
var stringifyNumber = require_stringifyNumber();
|
|
29627
29689
|
var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
|
|
29628
|
-
var intResolve = (
|
|
29690
|
+
var intResolve = (str2, offset, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str2) : parseInt(str2.substring(offset), radix);
|
|
29629
29691
|
function intStringify(node2, radix, prefix) {
|
|
29630
29692
|
const { value } = node2;
|
|
29631
29693
|
if (intIdentify(value) && value >= 0)
|
|
@@ -29638,7 +29700,7 @@ var require_int = __commonJS({
|
|
|
29638
29700
|
tag: "tag:yaml.org,2002:int",
|
|
29639
29701
|
format: "OCT",
|
|
29640
29702
|
test: /^0o[0-7]+$/,
|
|
29641
|
-
resolve: (
|
|
29703
|
+
resolve: (str2, _onError, opt) => intResolve(str2, 2, 8, opt),
|
|
29642
29704
|
stringify: (node2) => intStringify(node2, 8, "0o")
|
|
29643
29705
|
};
|
|
29644
29706
|
var int2 = {
|
|
@@ -29646,7 +29708,7 @@ var require_int = __commonJS({
|
|
|
29646
29708
|
default: true,
|
|
29647
29709
|
tag: "tag:yaml.org,2002:int",
|
|
29648
29710
|
test: /^[-+]?[0-9]+$/,
|
|
29649
|
-
resolve: (
|
|
29711
|
+
resolve: (str2, _onError, opt) => intResolve(str2, 0, 10, opt),
|
|
29650
29712
|
stringify: stringifyNumber.stringifyNumber
|
|
29651
29713
|
};
|
|
29652
29714
|
var intHex = {
|
|
@@ -29655,7 +29717,7 @@ var require_int = __commonJS({
|
|
|
29655
29717
|
tag: "tag:yaml.org,2002:int",
|
|
29656
29718
|
format: "HEX",
|
|
29657
29719
|
test: /^0x[0-9a-fA-F]+$/,
|
|
29658
|
-
resolve: (
|
|
29720
|
+
resolve: (str2, _onError, opt) => intResolve(str2, 2, 16, opt),
|
|
29659
29721
|
stringify: (node2) => intStringify(node2, 16, "0x")
|
|
29660
29722
|
};
|
|
29661
29723
|
exports.int = int2;
|
|
@@ -29708,7 +29770,7 @@ var require_schema2 = __commonJS({
|
|
|
29708
29770
|
identify: (value) => typeof value === "string",
|
|
29709
29771
|
default: true,
|
|
29710
29772
|
tag: "tag:yaml.org,2002:str",
|
|
29711
|
-
resolve: (
|
|
29773
|
+
resolve: (str2) => str2,
|
|
29712
29774
|
stringify: stringifyJSON
|
|
29713
29775
|
},
|
|
29714
29776
|
{
|
|
@@ -29725,7 +29787,7 @@ var require_schema2 = __commonJS({
|
|
|
29725
29787
|
default: true,
|
|
29726
29788
|
tag: "tag:yaml.org,2002:bool",
|
|
29727
29789
|
test: /^true$|^false$/,
|
|
29728
|
-
resolve: (
|
|
29790
|
+
resolve: (str2) => str2 === "true",
|
|
29729
29791
|
stringify: stringifyJSON
|
|
29730
29792
|
},
|
|
29731
29793
|
{
|
|
@@ -29733,7 +29795,7 @@ var require_schema2 = __commonJS({
|
|
|
29733
29795
|
default: true,
|
|
29734
29796
|
tag: "tag:yaml.org,2002:int",
|
|
29735
29797
|
test: /^-?(?:0|[1-9][0-9]*)$/,
|
|
29736
|
-
resolve: (
|
|
29798
|
+
resolve: (str2, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str2) : parseInt(str2, 10),
|
|
29737
29799
|
stringify: ({ value }) => intIdentify(value) ? value.toString() : JSON.stringify(value)
|
|
29738
29800
|
},
|
|
29739
29801
|
{
|
|
@@ -29741,7 +29803,7 @@ var require_schema2 = __commonJS({
|
|
|
29741
29803
|
default: true,
|
|
29742
29804
|
tag: "tag:yaml.org,2002:float",
|
|
29743
29805
|
test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,
|
|
29744
|
-
resolve: (
|
|
29806
|
+
resolve: (str2) => parseFloat(str2),
|
|
29745
29807
|
stringify: stringifyJSON
|
|
29746
29808
|
}
|
|
29747
29809
|
];
|
|
@@ -29749,9 +29811,9 @@ var require_schema2 = __commonJS({
|
|
|
29749
29811
|
default: true,
|
|
29750
29812
|
tag: "",
|
|
29751
29813
|
test: /^/,
|
|
29752
|
-
resolve(
|
|
29753
|
-
onError(`Unresolved plain scalar ${JSON.stringify(
|
|
29754
|
-
return
|
|
29814
|
+
resolve(str2, onError) {
|
|
29815
|
+
onError(`Unresolved plain scalar ${JSON.stringify(str2)}`);
|
|
29816
|
+
return str2;
|
|
29755
29817
|
}
|
|
29756
29818
|
};
|
|
29757
29819
|
var schema = [map2.map, seq.seq].concat(jsonScalars, jsonError);
|
|
@@ -29783,10 +29845,10 @@ var require_binary = __commonJS({
|
|
|
29783
29845
|
if (typeof node_buffer.Buffer === "function") {
|
|
29784
29846
|
return node_buffer.Buffer.from(src, "base64");
|
|
29785
29847
|
} else if (typeof atob === "function") {
|
|
29786
|
-
const
|
|
29787
|
-
const buffer = new Uint8Array(
|
|
29788
|
-
for (let i2 = 0; i2 <
|
|
29789
|
-
buffer[i2] =
|
|
29848
|
+
const str2 = atob(src.replace(/[\n\r]/g, ""));
|
|
29849
|
+
const buffer = new Uint8Array(str2.length);
|
|
29850
|
+
for (let i2 = 0; i2 < str2.length; ++i2)
|
|
29851
|
+
buffer[i2] = str2.charCodeAt(i2);
|
|
29790
29852
|
return buffer;
|
|
29791
29853
|
} else {
|
|
29792
29854
|
onError("This environment does not support reading binary tags; either Buffer or atob is required");
|
|
@@ -29797,28 +29859,28 @@ var require_binary = __commonJS({
|
|
|
29797
29859
|
if (!value)
|
|
29798
29860
|
return "";
|
|
29799
29861
|
const buf = value;
|
|
29800
|
-
let
|
|
29862
|
+
let str2;
|
|
29801
29863
|
if (typeof node_buffer.Buffer === "function") {
|
|
29802
|
-
|
|
29864
|
+
str2 = buf instanceof node_buffer.Buffer ? buf.toString("base64") : node_buffer.Buffer.from(buf.buffer).toString("base64");
|
|
29803
29865
|
} else if (typeof btoa === "function") {
|
|
29804
29866
|
let s = "";
|
|
29805
29867
|
for (let i2 = 0; i2 < buf.length; ++i2)
|
|
29806
29868
|
s += String.fromCharCode(buf[i2]);
|
|
29807
|
-
|
|
29869
|
+
str2 = btoa(s);
|
|
29808
29870
|
} else {
|
|
29809
29871
|
throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required");
|
|
29810
29872
|
}
|
|
29811
29873
|
type ?? (type = Scalar.Scalar.BLOCK_LITERAL);
|
|
29812
29874
|
if (type !== Scalar.Scalar.QUOTE_DOUBLE) {
|
|
29813
29875
|
const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth);
|
|
29814
|
-
const n = Math.ceil(
|
|
29876
|
+
const n = Math.ceil(str2.length / lineWidth);
|
|
29815
29877
|
const lines = new Array(n);
|
|
29816
29878
|
for (let i2 = 0, o = 0; i2 < n; ++i2, o += lineWidth) {
|
|
29817
|
-
lines[i2] =
|
|
29879
|
+
lines[i2] = str2.substr(o, lineWidth);
|
|
29818
29880
|
}
|
|
29819
|
-
|
|
29881
|
+
str2 = lines.join(type === Scalar.Scalar.BLOCK_LITERAL ? "\n" : " ");
|
|
29820
29882
|
}
|
|
29821
|
-
return stringifyString.stringifyString({ comment, type, value:
|
|
29883
|
+
return stringifyString.stringifyString({ comment, type, value: str2 }, ctx, onComment, onChompKeep);
|
|
29822
29884
|
}
|
|
29823
29885
|
};
|
|
29824
29886
|
exports.binary = binary2;
|
|
@@ -30024,7 +30086,7 @@ var require_float2 = __commonJS({
|
|
|
30024
30086
|
default: true,
|
|
30025
30087
|
tag: "tag:yaml.org,2002:float",
|
|
30026
30088
|
test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,
|
|
30027
|
-
resolve: (
|
|
30089
|
+
resolve: (str2) => str2.slice(-3).toLowerCase() === "nan" ? NaN : str2[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
|
|
30028
30090
|
stringify: stringifyNumber.stringifyNumber
|
|
30029
30091
|
};
|
|
30030
30092
|
var floatExp = {
|
|
@@ -30033,7 +30095,7 @@ var require_float2 = __commonJS({
|
|
|
30033
30095
|
tag: "tag:yaml.org,2002:float",
|
|
30034
30096
|
format: "EXP",
|
|
30035
30097
|
test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,
|
|
30036
|
-
resolve: (
|
|
30098
|
+
resolve: (str2) => parseFloat(str2.replace(/_/g, "")),
|
|
30037
30099
|
stringify(node2) {
|
|
30038
30100
|
const num = Number(node2.value);
|
|
30039
30101
|
return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node2);
|
|
@@ -30044,11 +30106,11 @@ var require_float2 = __commonJS({
|
|
|
30044
30106
|
default: true,
|
|
30045
30107
|
tag: "tag:yaml.org,2002:float",
|
|
30046
30108
|
test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,
|
|
30047
|
-
resolve(
|
|
30048
|
-
const node2 = new Scalar.Scalar(parseFloat(
|
|
30049
|
-
const dot =
|
|
30109
|
+
resolve(str2) {
|
|
30110
|
+
const node2 = new Scalar.Scalar(parseFloat(str2.replace(/_/g, "")));
|
|
30111
|
+
const dot = str2.indexOf(".");
|
|
30050
30112
|
if (dot !== -1) {
|
|
30051
|
-
const f =
|
|
30113
|
+
const f = str2.substring(dot + 1).replace(/_/g, "");
|
|
30052
30114
|
if (f[f.length - 1] === "0")
|
|
30053
30115
|
node2.minFractionDigits = f.length;
|
|
30054
30116
|
}
|
|
@@ -30068,34 +30130,34 @@ var require_int2 = __commonJS({
|
|
|
30068
30130
|
"use strict";
|
|
30069
30131
|
var stringifyNumber = require_stringifyNumber();
|
|
30070
30132
|
var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
|
|
30071
|
-
function intResolve(
|
|
30072
|
-
const sign =
|
|
30133
|
+
function intResolve(str2, offset, radix, { intAsBigInt }) {
|
|
30134
|
+
const sign = str2[0];
|
|
30073
30135
|
if (sign === "-" || sign === "+")
|
|
30074
30136
|
offset += 1;
|
|
30075
|
-
|
|
30137
|
+
str2 = str2.substring(offset).replace(/_/g, "");
|
|
30076
30138
|
if (intAsBigInt) {
|
|
30077
30139
|
switch (radix) {
|
|
30078
30140
|
case 2:
|
|
30079
|
-
|
|
30141
|
+
str2 = `0b${str2}`;
|
|
30080
30142
|
break;
|
|
30081
30143
|
case 8:
|
|
30082
|
-
|
|
30144
|
+
str2 = `0o${str2}`;
|
|
30083
30145
|
break;
|
|
30084
30146
|
case 16:
|
|
30085
|
-
|
|
30147
|
+
str2 = `0x${str2}`;
|
|
30086
30148
|
break;
|
|
30087
30149
|
}
|
|
30088
|
-
const n2 = BigInt(
|
|
30150
|
+
const n2 = BigInt(str2);
|
|
30089
30151
|
return sign === "-" ? BigInt(-1) * n2 : n2;
|
|
30090
30152
|
}
|
|
30091
|
-
const n = parseInt(
|
|
30153
|
+
const n = parseInt(str2, radix);
|
|
30092
30154
|
return sign === "-" ? -1 * n : n;
|
|
30093
30155
|
}
|
|
30094
30156
|
function intStringify(node2, radix, prefix) {
|
|
30095
30157
|
const { value } = node2;
|
|
30096
30158
|
if (intIdentify(value)) {
|
|
30097
|
-
const
|
|
30098
|
-
return value < 0 ? "-" + prefix +
|
|
30159
|
+
const str2 = value.toString(radix);
|
|
30160
|
+
return value < 0 ? "-" + prefix + str2.substr(1) : prefix + str2;
|
|
30099
30161
|
}
|
|
30100
30162
|
return stringifyNumber.stringifyNumber(node2);
|
|
30101
30163
|
}
|
|
@@ -30105,7 +30167,7 @@ var require_int2 = __commonJS({
|
|
|
30105
30167
|
tag: "tag:yaml.org,2002:int",
|
|
30106
30168
|
format: "BIN",
|
|
30107
30169
|
test: /^[-+]?0b[0-1_]+$/,
|
|
30108
|
-
resolve: (
|
|
30170
|
+
resolve: (str2, _onError, opt) => intResolve(str2, 2, 2, opt),
|
|
30109
30171
|
stringify: (node2) => intStringify(node2, 2, "0b")
|
|
30110
30172
|
};
|
|
30111
30173
|
var intOct = {
|
|
@@ -30114,7 +30176,7 @@ var require_int2 = __commonJS({
|
|
|
30114
30176
|
tag: "tag:yaml.org,2002:int",
|
|
30115
30177
|
format: "OCT",
|
|
30116
30178
|
test: /^[-+]?0[0-7_]+$/,
|
|
30117
|
-
resolve: (
|
|
30179
|
+
resolve: (str2, _onError, opt) => intResolve(str2, 1, 8, opt),
|
|
30118
30180
|
stringify: (node2) => intStringify(node2, 8, "0")
|
|
30119
30181
|
};
|
|
30120
30182
|
var int2 = {
|
|
@@ -30122,7 +30184,7 @@ var require_int2 = __commonJS({
|
|
|
30122
30184
|
default: true,
|
|
30123
30185
|
tag: "tag:yaml.org,2002:int",
|
|
30124
30186
|
test: /^[-+]?[0-9][0-9_]*$/,
|
|
30125
|
-
resolve: (
|
|
30187
|
+
resolve: (str2, _onError, opt) => intResolve(str2, 0, 10, opt),
|
|
30126
30188
|
stringify: stringifyNumber.stringifyNumber
|
|
30127
30189
|
};
|
|
30128
30190
|
var intHex = {
|
|
@@ -30131,7 +30193,7 @@ var require_int2 = __commonJS({
|
|
|
30131
30193
|
tag: "tag:yaml.org,2002:int",
|
|
30132
30194
|
format: "HEX",
|
|
30133
30195
|
test: /^[-+]?0x[0-9a-fA-F_]+$/,
|
|
30134
|
-
resolve: (
|
|
30196
|
+
resolve: (str2, _onError, opt) => intResolve(str2, 2, 16, opt),
|
|
30135
30197
|
stringify: (node2) => intStringify(node2, 16, "0x")
|
|
30136
30198
|
};
|
|
30137
30199
|
exports.int = int2;
|
|
@@ -30235,9 +30297,9 @@ var require_timestamp = __commonJS({
|
|
|
30235
30297
|
"../../node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js"(exports) {
|
|
30236
30298
|
"use strict";
|
|
30237
30299
|
var stringifyNumber = require_stringifyNumber();
|
|
30238
|
-
function parseSexagesimal(
|
|
30239
|
-
const sign =
|
|
30240
|
-
const parts2 = sign === "-" || sign === "+" ?
|
|
30300
|
+
function parseSexagesimal(str2, asBigInt) {
|
|
30301
|
+
const sign = str2[0];
|
|
30302
|
+
const parts2 = sign === "-" || sign === "+" ? str2.substring(1) : str2;
|
|
30241
30303
|
const num = (n) => asBigInt ? BigInt(n) : Number(n);
|
|
30242
30304
|
const res = parts2.replace(/_/g, "").split(":").reduce((res2, p2) => res2 * num(60) + num(p2), num(0));
|
|
30243
30305
|
return sign === "-" ? num(-1) * res : res;
|
|
@@ -30274,7 +30336,7 @@ var require_timestamp = __commonJS({
|
|
|
30274
30336
|
tag: "tag:yaml.org,2002:int",
|
|
30275
30337
|
format: "TIME",
|
|
30276
30338
|
test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,
|
|
30277
|
-
resolve: (
|
|
30339
|
+
resolve: (str2, _onError, { intAsBigInt }) => parseSexagesimal(str2, intAsBigInt),
|
|
30278
30340
|
stringify: stringifySexagesimal
|
|
30279
30341
|
};
|
|
30280
30342
|
var floatTime = {
|
|
@@ -30283,7 +30345,7 @@ var require_timestamp = __commonJS({
|
|
|
30283
30345
|
tag: "tag:yaml.org,2002:float",
|
|
30284
30346
|
format: "TIME",
|
|
30285
30347
|
test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,
|
|
30286
|
-
resolve: (
|
|
30348
|
+
resolve: (str2) => parseSexagesimal(str2, false),
|
|
30287
30349
|
stringify: stringifySexagesimal
|
|
30288
30350
|
};
|
|
30289
30351
|
var timestamp = {
|
|
@@ -30294,8 +30356,8 @@ var require_timestamp = __commonJS({
|
|
|
30294
30356
|
// may be omitted altogether, resulting in a date format. In such a case, the time part is
|
|
30295
30357
|
// assumed to be 00:00:00Z (start of day, UTC).
|
|
30296
30358
|
test: RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),
|
|
30297
|
-
resolve(
|
|
30298
|
-
const match =
|
|
30359
|
+
resolve(str2) {
|
|
30360
|
+
const match = str2.match(timestamp.test);
|
|
30299
30361
|
if (!match)
|
|
30300
30362
|
throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");
|
|
30301
30363
|
const [, year, month, day, hour, minute, second] = match.map(Number);
|
|
@@ -33213,9 +33275,9 @@ var require_lexer = __commonJS({
|
|
|
33213
33275
|
}
|
|
33214
33276
|
}
|
|
33215
33277
|
*parseQuotedScalar() {
|
|
33216
|
-
const
|
|
33217
|
-
let end = this.buffer.indexOf(
|
|
33218
|
-
if (
|
|
33278
|
+
const quote4 = this.charAt(0);
|
|
33279
|
+
let end = this.buffer.indexOf(quote4, this.pos + 1);
|
|
33280
|
+
if (quote4 === "'") {
|
|
33219
33281
|
while (end !== -1 && this.buffer[end + 1] === "'")
|
|
33220
33282
|
end = this.buffer.indexOf("'", end + 2);
|
|
33221
33283
|
} else {
|
|
@@ -34539,25 +34601,25 @@ var require_dist = __commonJS({
|
|
|
34539
34601
|
});
|
|
34540
34602
|
|
|
34541
34603
|
// src/assets.ts
|
|
34542
|
-
import { basename as basename5, join as
|
|
34604
|
+
import { basename as basename5, join as join31, resolve as resolve17 } from "node:path";
|
|
34543
34605
|
import { fileURLToPath } from "node:url";
|
|
34544
34606
|
function packageRoot(env = process.env) {
|
|
34545
34607
|
const override = env["MVRX_PACKAGE_ROOT"];
|
|
34546
34608
|
if (override !== void 0 && override !== "") return override;
|
|
34547
|
-
return
|
|
34609
|
+
return resolve17(fileURLToPath(new URL(".", import.meta.url)), "..");
|
|
34548
34610
|
}
|
|
34549
34611
|
function assetDir(env = process.env) {
|
|
34550
34612
|
const override = env["MVRX_ASSET_DIR"];
|
|
34551
|
-
return override !== void 0 && override !== "" ? override :
|
|
34613
|
+
return override !== void 0 && override !== "" ? override : join31(packageRoot(env), "assets");
|
|
34552
34614
|
}
|
|
34553
34615
|
function assetFile(name2) {
|
|
34554
|
-
return
|
|
34616
|
+
return join31(assetDir(), basename5(name2));
|
|
34555
34617
|
}
|
|
34556
34618
|
var VERSION;
|
|
34557
34619
|
var init_assets = __esm({
|
|
34558
34620
|
"src/assets.ts"() {
|
|
34559
34621
|
"use strict";
|
|
34560
|
-
VERSION = true ? "0.1.
|
|
34622
|
+
VERSION = true ? "0.1.141" : "0.0.0-dev";
|
|
34561
34623
|
}
|
|
34562
34624
|
});
|
|
34563
34625
|
|
|
@@ -35799,10 +35861,10 @@ function parseTextFormatScalarValue(type, value) {
|
|
|
35799
35861
|
return parseInt(value, 10);
|
|
35800
35862
|
}
|
|
35801
35863
|
}
|
|
35802
|
-
function unescapeBytesDefaultValue(
|
|
35864
|
+
function unescapeBytesDefaultValue(str2) {
|
|
35803
35865
|
const b = [];
|
|
35804
35866
|
const input2 = {
|
|
35805
|
-
tail:
|
|
35867
|
+
tail: str2,
|
|
35806
35868
|
c: "",
|
|
35807
35869
|
next() {
|
|
35808
35870
|
if (this.tail.length == 0) {
|
|
@@ -35975,7 +36037,7 @@ function createFileRegistry(...args2) {
|
|
|
35975
36037
|
if (seen.has(protoFileName)) {
|
|
35976
36038
|
continue;
|
|
35977
36039
|
}
|
|
35978
|
-
const dep =
|
|
36040
|
+
const dep = resolve20(protoFileName);
|
|
35979
36041
|
if (!dep) {
|
|
35980
36042
|
throw new Error(`Unable to resolve ${protoFileName}, imported by ${file2.name}`);
|
|
35981
36043
|
}
|
|
@@ -35989,7 +36051,7 @@ function createFileRegistry(...args2) {
|
|
|
35989
36051
|
return deps.concat(...deps.map(recurseDeps));
|
|
35990
36052
|
};
|
|
35991
36053
|
const input2 = args2[0];
|
|
35992
|
-
const
|
|
36054
|
+
const resolve20 = args2[1];
|
|
35993
36055
|
const seen = /* @__PURE__ */ new Set();
|
|
35994
36056
|
for (const file2 of [input2, ...recurseDeps(input2)].reverse()) {
|
|
35995
36057
|
addFile(file2, registry2);
|
|
@@ -36573,7 +36635,7 @@ function findMapEntryFields(mapEntry) {
|
|
|
36573
36635
|
}
|
|
36574
36636
|
function isEnumOpen(desc) {
|
|
36575
36637
|
var _a3;
|
|
36576
|
-
return
|
|
36638
|
+
return OPEN2 == resolveFeature("enumType", {
|
|
36577
36639
|
proto: desc.proto,
|
|
36578
36640
|
parent: (_a3 = desc.parent) !== null && _a3 !== void 0 ? _a3 : desc.file
|
|
36579
36641
|
});
|
|
@@ -36619,7 +36681,7 @@ function assert2(condition, msg) {
|
|
|
36619
36681
|
throw new Error(msg);
|
|
36620
36682
|
}
|
|
36621
36683
|
}
|
|
36622
|
-
var EDITION_PROTO22, EDITION_PROTO32, EDITION_UNSTABLE, TYPE_STRING, TYPE_GROUP, TYPE_MESSAGE, TYPE_BYTES, TYPE_ENUM, LABEL_REPEATED, LABEL_REQUIRED, JS_STRING, IDEMPOTENCY_UNKNOWN, EXPLICIT, IMPLICIT2, LEGACY_REQUIRED, PACKED, DELIMITED,
|
|
36684
|
+
var EDITION_PROTO22, EDITION_PROTO32, EDITION_UNSTABLE, TYPE_STRING, TYPE_GROUP, TYPE_MESSAGE, TYPE_BYTES, TYPE_ENUM, LABEL_REPEATED, LABEL_REQUIRED, JS_STRING, IDEMPOTENCY_UNKNOWN, EXPLICIT, IMPLICIT2, LEGACY_REQUIRED, PACKED, DELIMITED, OPEN2, VERIFY, maximumEdition, featureDefaults;
|
|
36623
36685
|
var init_registry = __esm({
|
|
36624
36686
|
"../../node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/registry.js"() {
|
|
36625
36687
|
init_descriptors();
|
|
@@ -36645,7 +36707,7 @@ var init_registry = __esm({
|
|
|
36645
36707
|
LEGACY_REQUIRED = 3;
|
|
36646
36708
|
PACKED = 1;
|
|
36647
36709
|
DELIMITED = 2;
|
|
36648
|
-
|
|
36710
|
+
OPEN2 = 1;
|
|
36649
36711
|
VERIFY = 2;
|
|
36650
36712
|
maximumEdition = 1002;
|
|
36651
36713
|
featureDefaults = {
|
|
@@ -38402,13 +38464,13 @@ async function Module2(moduleArg = {}) {
|
|
|
38402
38464
|
}
|
|
38403
38465
|
readAsync = /* @__PURE__ */ __name(async (url2) => {
|
|
38404
38466
|
if (isFileURI(url2)) {
|
|
38405
|
-
return new Promise((
|
|
38467
|
+
return new Promise((resolve20, reject) => {
|
|
38406
38468
|
var xhr = new XMLHttpRequest();
|
|
38407
38469
|
xhr.open("GET", url2, true);
|
|
38408
38470
|
xhr.responseType = "arraybuffer";
|
|
38409
38471
|
xhr.onload = () => {
|
|
38410
38472
|
if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
|
|
38411
|
-
|
|
38473
|
+
resolve20(xhr.response);
|
|
38412
38474
|
return;
|
|
38413
38475
|
}
|
|
38414
38476
|
reject(xhr.status);
|
|
@@ -38604,9 +38666,9 @@ async function Module2(moduleArg = {}) {
|
|
|
38604
38666
|
__name(receiveInstantiationResult, "receiveInstantiationResult");
|
|
38605
38667
|
var info2 = getWasmImports();
|
|
38606
38668
|
if (Module["instantiateWasm"]) {
|
|
38607
|
-
return new Promise((
|
|
38669
|
+
return new Promise((resolve20, reject) => {
|
|
38608
38670
|
Module["instantiateWasm"](info2, (mod, inst) => {
|
|
38609
|
-
|
|
38671
|
+
resolve20(receiveInstance(mod, inst));
|
|
38610
38672
|
});
|
|
38611
38673
|
});
|
|
38612
38674
|
}
|
|
@@ -38677,16 +38739,16 @@ async function Module2(moduleArg = {}) {
|
|
|
38677
38739
|
if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
|
|
38678
38740
|
return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));
|
|
38679
38741
|
}
|
|
38680
|
-
var
|
|
38742
|
+
var str2 = "";
|
|
38681
38743
|
while (idx < endPtr) {
|
|
38682
38744
|
var u0 = heapOrArray[idx++];
|
|
38683
38745
|
if (!(u0 & 128)) {
|
|
38684
|
-
|
|
38746
|
+
str2 += String.fromCharCode(u0);
|
|
38685
38747
|
continue;
|
|
38686
38748
|
}
|
|
38687
38749
|
var u1 = heapOrArray[idx++] & 63;
|
|
38688
38750
|
if ((u0 & 224) == 192) {
|
|
38689
|
-
|
|
38751
|
+
str2 += String.fromCharCode((u0 & 31) << 6 | u1);
|
|
38690
38752
|
continue;
|
|
38691
38753
|
}
|
|
38692
38754
|
var u2 = heapOrArray[idx++] & 63;
|
|
@@ -38696,13 +38758,13 @@ async function Module2(moduleArg = {}) {
|
|
|
38696
38758
|
u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63;
|
|
38697
38759
|
}
|
|
38698
38760
|
if (u0 < 65536) {
|
|
38699
|
-
|
|
38761
|
+
str2 += String.fromCharCode(u0);
|
|
38700
38762
|
} else {
|
|
38701
38763
|
var ch = u0 - 65536;
|
|
38702
|
-
|
|
38764
|
+
str2 += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
|
|
38703
38765
|
}
|
|
38704
38766
|
}
|
|
38705
|
-
return
|
|
38767
|
+
return str2;
|
|
38706
38768
|
}, "UTF8ArrayToString");
|
|
38707
38769
|
var getDylinkMetadata = /* @__PURE__ */ __name((binary2) => {
|
|
38708
38770
|
var offset = 0;
|
|
@@ -39561,10 +39623,10 @@ async function Module2(moduleArg = {}) {
|
|
|
39561
39623
|
}
|
|
39562
39624
|
quit_(1, e2);
|
|
39563
39625
|
}, "handleException");
|
|
39564
|
-
var lengthBytesUTF8 = /* @__PURE__ */ __name((
|
|
39626
|
+
var lengthBytesUTF8 = /* @__PURE__ */ __name((str2) => {
|
|
39565
39627
|
var len = 0;
|
|
39566
|
-
for (var i2 = 0; i2 <
|
|
39567
|
-
var c2 =
|
|
39628
|
+
for (var i2 = 0; i2 < str2.length; ++i2) {
|
|
39629
|
+
var c2 = str2.charCodeAt(i2);
|
|
39568
39630
|
if (c2 <= 127) {
|
|
39569
39631
|
len++;
|
|
39570
39632
|
} else if (c2 <= 2047) {
|
|
@@ -39578,12 +39640,12 @@ async function Module2(moduleArg = {}) {
|
|
|
39578
39640
|
}
|
|
39579
39641
|
return len;
|
|
39580
39642
|
}, "lengthBytesUTF8");
|
|
39581
|
-
var stringToUTF8Array = /* @__PURE__ */ __name((
|
|
39643
|
+
var stringToUTF8Array = /* @__PURE__ */ __name((str2, heap, outIdx, maxBytesToWrite) => {
|
|
39582
39644
|
if (!(maxBytesToWrite > 0)) return 0;
|
|
39583
39645
|
var startIdx = outIdx;
|
|
39584
39646
|
var endIdx = outIdx + maxBytesToWrite - 1;
|
|
39585
|
-
for (var i2 = 0; i2 <
|
|
39586
|
-
var u =
|
|
39647
|
+
for (var i2 = 0; i2 < str2.length; ++i2) {
|
|
39648
|
+
var u = str2.codePointAt(i2);
|
|
39587
39649
|
if (u <= 127) {
|
|
39588
39650
|
if (outIdx >= endIdx) break;
|
|
39589
39651
|
heap[outIdx++] = u;
|
|
@@ -39608,30 +39670,30 @@ async function Module2(moduleArg = {}) {
|
|
|
39608
39670
|
heap[outIdx] = 0;
|
|
39609
39671
|
return outIdx - startIdx;
|
|
39610
39672
|
}, "stringToUTF8Array");
|
|
39611
|
-
var stringToUTF8 = /* @__PURE__ */ __name((
|
|
39673
|
+
var stringToUTF8 = /* @__PURE__ */ __name((str2, outPtr, maxBytesToWrite) => stringToUTF8Array(str2, HEAPU8, outPtr, maxBytesToWrite), "stringToUTF8");
|
|
39612
39674
|
var stackAlloc = /* @__PURE__ */ __name((sz) => __emscripten_stack_alloc(sz), "stackAlloc");
|
|
39613
|
-
var stringToUTF8OnStack = /* @__PURE__ */ __name((
|
|
39614
|
-
var size = lengthBytesUTF8(
|
|
39675
|
+
var stringToUTF8OnStack = /* @__PURE__ */ __name((str2) => {
|
|
39676
|
+
var size = lengthBytesUTF8(str2) + 1;
|
|
39615
39677
|
var ret = stackAlloc(size);
|
|
39616
|
-
stringToUTF8(
|
|
39678
|
+
stringToUTF8(str2, ret, size);
|
|
39617
39679
|
return ret;
|
|
39618
39680
|
}, "stringToUTF8OnStack");
|
|
39619
39681
|
var AsciiToString = /* @__PURE__ */ __name((ptr) => {
|
|
39620
|
-
var
|
|
39682
|
+
var str2 = "";
|
|
39621
39683
|
while (1) {
|
|
39622
39684
|
var ch = HEAPU8[ptr++];
|
|
39623
|
-
if (!ch) return
|
|
39624
|
-
|
|
39685
|
+
if (!ch) return str2;
|
|
39686
|
+
str2 += String.fromCharCode(ch);
|
|
39625
39687
|
}
|
|
39626
39688
|
}, "AsciiToString");
|
|
39627
|
-
var stringToUTF16 = /* @__PURE__ */ __name((
|
|
39689
|
+
var stringToUTF16 = /* @__PURE__ */ __name((str2, outPtr, maxBytesToWrite) => {
|
|
39628
39690
|
maxBytesToWrite ??= 2147483647;
|
|
39629
39691
|
if (maxBytesToWrite < 2) return 0;
|
|
39630
39692
|
maxBytesToWrite -= 2;
|
|
39631
39693
|
var startPtr = outPtr;
|
|
39632
|
-
var numCharsToWrite = maxBytesToWrite <
|
|
39694
|
+
var numCharsToWrite = maxBytesToWrite < str2.length * 2 ? maxBytesToWrite / 2 : str2.length;
|
|
39633
39695
|
for (var i2 = 0; i2 < numCharsToWrite; ++i2) {
|
|
39634
|
-
var codeUnit =
|
|
39696
|
+
var codeUnit = str2.charCodeAt(i2);
|
|
39635
39697
|
LE_HEAP_STORE_I16((outPtr >> 1) * 2, codeUnit);
|
|
39636
39698
|
outPtr += 2;
|
|
39637
39699
|
}
|
|
@@ -39939,8 +40001,8 @@ async function Module2(moduleArg = {}) {
|
|
|
39939
40001
|
if (runtimeInitialized) {
|
|
39940
40002
|
moduleRtn = Module;
|
|
39941
40003
|
} else {
|
|
39942
|
-
moduleRtn = new Promise((
|
|
39943
|
-
readyPromiseResolve =
|
|
40004
|
+
moduleRtn = new Promise((resolve20, reject) => {
|
|
40005
|
+
readyPromiseResolve = resolve20;
|
|
39944
40006
|
readyPromiseReject = reject;
|
|
39945
40007
|
});
|
|
39946
40008
|
}
|
|
@@ -42244,9 +42306,9 @@ function parserFor(language) {
|
|
|
42244
42306
|
if (!grammar) throw new Error(`no grammar for ${language}`);
|
|
42245
42307
|
cached2 = (async () => {
|
|
42246
42308
|
await ensureInit();
|
|
42247
|
-
const
|
|
42309
|
+
const loaded2 = await Language2.load(assetFile(grammar));
|
|
42248
42310
|
const parser = new Parser();
|
|
42249
|
-
parser.setLanguage(
|
|
42311
|
+
parser.setLanguage(loaded2);
|
|
42250
42312
|
return parser;
|
|
42251
42313
|
})();
|
|
42252
42314
|
parsers.set(language, cached2);
|
|
@@ -42483,10 +42545,10 @@ var init_treesitter = __esm({
|
|
|
42483
42545
|
});
|
|
42484
42546
|
|
|
42485
42547
|
// ../index-builder/src/snapshot.ts
|
|
42486
|
-
import { execFile } from "node:child_process";
|
|
42548
|
+
import { execFile as execFile2 } from "node:child_process";
|
|
42487
42549
|
import { createHash as createHash6 } from "node:crypto";
|
|
42488
42550
|
import { lstat, readFile as readFile4 } from "node:fs/promises";
|
|
42489
|
-
import { join as
|
|
42551
|
+
import { join as join32 } from "node:path";
|
|
42490
42552
|
import { promisify } from "node:util";
|
|
42491
42553
|
function shardKeyOf(shard) {
|
|
42492
42554
|
return `sha256:${sha256Hex2(Buffer.from(`${shard.path}\0${shard.contentHash}\0${shard.precision}`, "utf8"))}`;
|
|
@@ -42513,7 +42575,7 @@ async function mapLimit(items, limit, task) {
|
|
|
42513
42575
|
return results;
|
|
42514
42576
|
}
|
|
42515
42577
|
async function hashRegularFile(repoRoot, path) {
|
|
42516
|
-
const absolute =
|
|
42578
|
+
const absolute = join32(repoRoot, path);
|
|
42517
42579
|
try {
|
|
42518
42580
|
const stats = await lstat(absolute);
|
|
42519
42581
|
if (!stats.isFile()) return null;
|
|
@@ -42551,7 +42613,7 @@ async function buildSnapshot(options) {
|
|
|
42551
42613
|
const needParse = [...hashes.keys()].filter((path) => !byPath.has(path));
|
|
42552
42614
|
const parsed = await mapLimit(needParse, 8, async (path) => {
|
|
42553
42615
|
if (languageForPath(path) === null) return { path, shard: null };
|
|
42554
|
-
const bytes = await readFile4(
|
|
42616
|
+
const bytes = await readFile4(join32(options.repoRoot, path));
|
|
42555
42617
|
if (bytes.byteLength > MAX_PARSE_BYTES) return { path, shard: null };
|
|
42556
42618
|
const hash2 = `sha256:${sha256Hex2(bytes)}`;
|
|
42557
42619
|
if (hash2 !== hashes.get(path)) throw new Error(`${path} changed while the snapshot was being built`);
|
|
@@ -42588,7 +42650,7 @@ var init_snapshot = __esm({
|
|
|
42588
42650
|
init_languages();
|
|
42589
42651
|
init_scip();
|
|
42590
42652
|
init_treesitter();
|
|
42591
|
-
execFileAsync = promisify(
|
|
42653
|
+
execFileAsync = promisify(execFile2);
|
|
42592
42654
|
MAX_PARSE_BYTES = 2e6;
|
|
42593
42655
|
TREE_SITTER_INDEXER = { name: "web-tree-sitter", version: "0.27.0" };
|
|
42594
42656
|
}
|
|
@@ -42619,7 +42681,7 @@ async function uploadSnapshot(options) {
|
|
|
42619
42681
|
failure4 = error62 instanceof Error ? error62.message : String(error62);
|
|
42620
42682
|
if (attempt2 >= ATTEMPTS) throw new Error(`POST ${path} failed: ${failure4}`);
|
|
42621
42683
|
}
|
|
42622
|
-
await new Promise((
|
|
42684
|
+
await new Promise((resolve20) => setTimeout(resolve20, (options.retryDelayMs ?? 500) * attempt2));
|
|
42623
42685
|
}
|
|
42624
42686
|
};
|
|
42625
42687
|
const manifestPath = byProject ? codePaths.projectUploadManifest(tenantId, projectId ?? "") : codePaths.uploadManifest(tenantId, repository?.owner ?? "", repository?.name ?? "");
|
|
@@ -42716,14 +42778,14 @@ function idf(index, word) {
|
|
|
42716
42778
|
function isGeneric(index, word) {
|
|
42717
42779
|
return (index.words.get(word) ?? 0) >= Math.max(GENERIC_DF_FLOOR, index.wordDocs * GENERIC_DF_SHARE);
|
|
42718
42780
|
}
|
|
42719
|
-
function
|
|
42781
|
+
function isTestPath2(path) {
|
|
42720
42782
|
return /(^|\/)(tests?|__tests__|__mocks__|fixtures?|__fixtures__)\//.test(path) || /\.(test|spec)\.[cm]?[jt]sx?$/.test(path) || /(^|\/)[^/]*\.fixtures?\.[cm]?[jt]sx?$/.test(path);
|
|
42721
42783
|
}
|
|
42722
42784
|
function testFilter(task) {
|
|
42723
42785
|
if (/\b(tests?|specs?|fixtures?|testing|vitest|jest|mocks?)\b/i.test(task)) return () => true;
|
|
42724
42786
|
const lower = task.toLowerCase();
|
|
42725
42787
|
return (path) => {
|
|
42726
|
-
if (!
|
|
42788
|
+
if (!isTestPath2(path)) return true;
|
|
42727
42789
|
const file2 = (path.split("/").pop() ?? path).toLowerCase();
|
|
42728
42790
|
return lower.includes(file2) || lower.includes(file2.replace(/\.[cm]?[jt]sx?$/, ""));
|
|
42729
42791
|
};
|
|
@@ -43052,7 +43114,7 @@ async function buildRepoIndex(files) {
|
|
|
43052
43114
|
}
|
|
43053
43115
|
const heritage = /* @__PURE__ */ new Map();
|
|
43054
43116
|
const heirs = /* @__PURE__ */ new Map();
|
|
43055
|
-
const
|
|
43117
|
+
const resolve20 = (from, name2) => {
|
|
43056
43118
|
const visible = imports.get(from.path) ?? /* @__PURE__ */ new Set();
|
|
43057
43119
|
return (byName.get(baseName(name2)) ?? []).find((candidate) => candidate.path === from.path || reaches(visible, candidate.path));
|
|
43058
43120
|
};
|
|
@@ -43061,8 +43123,8 @@ async function buildRepoIndex(files) {
|
|
|
43061
43123
|
const stem2 = header.slice(header.indexOf(entry.name) + entry.name.length).replace(/^<[^>]*>/, "").replace(/\{.*$/, "");
|
|
43062
43124
|
const ext = /\bextends\s+([A-Za-z_$][\w$.]*)/.exec(stem2)?.[1];
|
|
43063
43125
|
const impl = /\bimplements\s+(.+)$/.exec(stem2)?.[1];
|
|
43064
|
-
const extendsIds = ext === void 0 ? [] : [
|
|
43065
|
-
const implementsIds = (impl === void 0 ? [] : impl.split(/,(?![^<]*>)/).map((part) =>
|
|
43126
|
+
const extendsIds = ext === void 0 ? [] : [resolve20(entry, ext)?.id].filter((value) => value !== void 0);
|
|
43127
|
+
const implementsIds = (impl === void 0 ? [] : impl.split(/,(?![^<]*>)/).map((part) => resolve20(entry, part.trim()))).filter((value) => value !== void 0).map((value) => value.id);
|
|
43066
43128
|
if (extendsIds.length === 0 && implementsIds.length === 0) continue;
|
|
43067
43129
|
heritage.set(id2, { extends: extendsIds, implements: implementsIds });
|
|
43068
43130
|
for (const target2 of extendsIds) heirs.set(target2, { extendedBy: [...heirs.get(target2)?.extendedBy ?? [], id2], implementedBy: heirs.get(target2)?.implementedBy ?? [] });
|
|
@@ -43088,9 +43150,9 @@ var init_context_map = __esm({
|
|
|
43088
43150
|
});
|
|
43089
43151
|
|
|
43090
43152
|
// ../index-builder/src/context-map-build.ts
|
|
43091
|
-
import { execFile as
|
|
43153
|
+
import { execFile as execFile3 } from "node:child_process";
|
|
43092
43154
|
import { mkdir as mkdir3, readFile as readFile5, writeFile as writeFile3 } from "node:fs/promises";
|
|
43093
|
-
import { dirname as
|
|
43155
|
+
import { dirname as dirname11, join as join33 } from "node:path";
|
|
43094
43156
|
import { promisify as promisify2 } from "node:util";
|
|
43095
43157
|
async function git5(root, args2) {
|
|
43096
43158
|
const { stdout } = await execFileAsync2("git", args2, { cwd: root, encoding: "utf8", maxBuffer: 256 * 1024 * 1024 });
|
|
@@ -43103,7 +43165,7 @@ async function buildArtifactsForCheckout(options) {
|
|
|
43103
43165
|
for (const path of tracked) {
|
|
43104
43166
|
if (languageForPath(path) === null) continue;
|
|
43105
43167
|
try {
|
|
43106
|
-
const bytes = await readFile5(
|
|
43168
|
+
const bytes = await readFile5(join33(options.root, path));
|
|
43107
43169
|
if (bytes.byteLength > MAX_PARSE_BYTES) {
|
|
43108
43170
|
uncovered += 1;
|
|
43109
43171
|
continue;
|
|
@@ -43127,15 +43189,15 @@ async function buildArtifactsForCheckout(options) {
|
|
|
43127
43189
|
return { digest, indexFile };
|
|
43128
43190
|
}
|
|
43129
43191
|
async function writeIndexFile(root, indexFile) {
|
|
43130
|
-
const path =
|
|
43131
|
-
await mkdir3(
|
|
43192
|
+
const path = join33(root, CODE_INDEX_PATH);
|
|
43193
|
+
await mkdir3(dirname11(path), { recursive: true });
|
|
43132
43194
|
await writeFile3(path, `${JSON.stringify(indexFile)}
|
|
43133
43195
|
`);
|
|
43134
43196
|
return path;
|
|
43135
43197
|
}
|
|
43136
43198
|
async function writeDigest(root, digest, out2) {
|
|
43137
|
-
const path = out2 ??
|
|
43138
|
-
await mkdir3(
|
|
43199
|
+
const path = out2 ?? join33(root, CODE_MAP_DIGEST_PATH);
|
|
43200
|
+
await mkdir3(dirname11(path), { recursive: true });
|
|
43139
43201
|
await writeFile3(path, `${JSON.stringify(digest)}
|
|
43140
43202
|
`);
|
|
43141
43203
|
return path;
|
|
@@ -43148,14 +43210,14 @@ var init_context_map_build = __esm({
|
|
|
43148
43210
|
init_context_map();
|
|
43149
43211
|
init_languages();
|
|
43150
43212
|
init_snapshot();
|
|
43151
|
-
execFileAsync2 = promisify2(
|
|
43213
|
+
execFileAsync2 = promisify2(execFile3);
|
|
43152
43214
|
}
|
|
43153
43215
|
});
|
|
43154
43216
|
|
|
43155
43217
|
// ../index-builder/src/run.ts
|
|
43156
|
-
import { execFile as
|
|
43218
|
+
import { execFile as execFile4 } from "node:child_process";
|
|
43157
43219
|
import { mkdir as mkdir4, readdir as readdir4, rm as rm2, writeFile as writeFile4 } from "node:fs/promises";
|
|
43158
|
-
import { join as
|
|
43220
|
+
import { join as join34, resolve as resolve18 } from "node:path";
|
|
43159
43221
|
import { parseArgs as parseArgs2 } from "node:util";
|
|
43160
43222
|
import { promisify as promisify3 } from "node:util";
|
|
43161
43223
|
async function git6(root, args2) {
|
|
@@ -43176,7 +43238,7 @@ async function repositoryFromRemote(root) {
|
|
|
43176
43238
|
}
|
|
43177
43239
|
}
|
|
43178
43240
|
async function snapshotFromArgs(values, env) {
|
|
43179
|
-
const root =
|
|
43241
|
+
const root = resolve18(typeof values["root"] === "string" ? values["root"] : process.cwd());
|
|
43180
43242
|
const projectId = typeof values["project"] === "string" ? values["project"] : void 0;
|
|
43181
43243
|
if (projectId !== void 0 && !ProjectId.safeParse(projectId).success) throw new UsageError2(`--project must be a project identifier, got "${projectId}"`);
|
|
43182
43244
|
const repoText = projectId !== void 0 ? typeof values["repo"] === "string" ? values["repo"] : void 0 : (typeof values["repo"] === "string" ? values["repo"] : void 0) ?? env["GITHUB_REPOSITORY"] ?? await repositoryFromRemote(root);
|
|
@@ -43188,7 +43250,7 @@ async function snapshotFromArgs(values, env) {
|
|
|
43188
43250
|
const scip = Array.isArray(values["scip"]) ? values["scip"] : [];
|
|
43189
43251
|
return buildSnapshot({
|
|
43190
43252
|
repoRoot: root,
|
|
43191
|
-
scipFiles: scip.map((file2) =>
|
|
43253
|
+
scipFiles: scip.map((file2) => resolve18(file2)),
|
|
43192
43254
|
tenantId: tenant,
|
|
43193
43255
|
...repoText ? { repository: parseRepository(repoText) } : {},
|
|
43194
43256
|
...projectId !== void 0 ? { projectId } : {},
|
|
@@ -43204,14 +43266,14 @@ async function runCli2(argv, env, out2 = console.log, err2 = console.error) {
|
|
|
43204
43266
|
const outDir = values.out;
|
|
43205
43267
|
if (!outDir) throw new UsageError2("build needs --out DIR");
|
|
43206
43268
|
const built = await snapshotFromArgs({ ...values, tenant: values.tenant ?? env["HARNESS_TENANT"] ?? "local" }, env);
|
|
43207
|
-
await writeSnapshot(
|
|
43208
|
-
out2(`built ${built.shards.length} shards (${built.uncovered.length} files uncovered) into ${
|
|
43269
|
+
await writeSnapshot(resolve18(outDir), built);
|
|
43270
|
+
out2(`built ${built.shards.length} shards (${built.uncovered.length} files uncovered) into ${resolve18(outDir)}`);
|
|
43209
43271
|
return 0;
|
|
43210
43272
|
}
|
|
43211
43273
|
if (command === "map") {
|
|
43212
|
-
const root =
|
|
43274
|
+
const root = resolve18(values.root ?? process.cwd());
|
|
43213
43275
|
const { digest, indexFile } = await buildArtifactsForCheckout({ root, ...values.task === void 0 ? {} : { task: values.task } });
|
|
43214
|
-
const path = await writeDigest(root, digest, values.out === void 0 ? void 0 :
|
|
43276
|
+
const path = await writeDigest(root, digest, values.out === void 0 ? void 0 : resolve18(values.out));
|
|
43215
43277
|
const indexPath = values.out === void 0 ? await writeIndexFile(root, indexFile) : null;
|
|
43216
43278
|
out2(`wrote the code map digest for ${digest.revision.commitSha.slice(0, 12)} (${digest.coverage.files} files, ${digest.coverage.symbols} symbols, ${digest.lines.length} lines) to ${path}${indexPath === null ? "" : `, and the ranking index to ${indexPath}`}`);
|
|
43217
43279
|
return 0;
|
|
@@ -43239,13 +43301,13 @@ ${USAGE}`);
|
|
|
43239
43301
|
}
|
|
43240
43302
|
}
|
|
43241
43303
|
async function writeSnapshot(dir, built) {
|
|
43242
|
-
await mkdir4(
|
|
43243
|
-
for (const name2 of await readdir4(
|
|
43244
|
-
await writeFile4(
|
|
43245
|
-
await writeFile4(
|
|
43304
|
+
await mkdir4(join34(dir, "shards"), { recursive: true });
|
|
43305
|
+
for (const name2 of await readdir4(join34(dir, "shards"))) await rm2(join34(dir, "shards", name2));
|
|
43306
|
+
await writeFile4(join34(dir, "manifest.json"), JSON.stringify(built.manifest, null, 2));
|
|
43307
|
+
await writeFile4(join34(dir, "uncovered.json"), JSON.stringify(built.uncovered, null, 2));
|
|
43246
43308
|
for (const shard of built.shards) {
|
|
43247
43309
|
const name2 = shardKeyOf(shard).slice("sha256:".length);
|
|
43248
|
-
await writeFile4(
|
|
43310
|
+
await writeFile4(join34(dir, "shards", `${name2}.json`), JSON.stringify(shard));
|
|
43249
43311
|
}
|
|
43250
43312
|
}
|
|
43251
43313
|
var execFileAsync3, USAGE, UsageError2, OPTIONS;
|
|
@@ -43257,7 +43319,7 @@ var init_run = __esm({
|
|
|
43257
43319
|
init_oidc();
|
|
43258
43320
|
init_snapshot();
|
|
43259
43321
|
init_upload();
|
|
43260
|
-
execFileAsync3 = promisify3(
|
|
43322
|
+
execFileAsync3 = promisify3(execFile4);
|
|
43261
43323
|
USAGE = `usage:
|
|
43262
43324
|
mvrx-index build --scip FILE [--scip FILE ...] --out DIR [--project ID | --repo owner/name] [--tenant ID] [--commit SHA] [--branch B] [--root DIR]
|
|
43263
43325
|
mvrx-index map [--root DIR] [--out FILE] [--task TEXT]
|
|
@@ -46851,14 +46913,14 @@ function inputRequiredRoundsExceededMessage(method, maxRounds) {
|
|
|
46851
46913
|
return `Multi-round-trip request '${method}' still required input after ${maxRounds} rounds (inputRequired.maxRounds)`;
|
|
46852
46914
|
}
|
|
46853
46915
|
function sleep2(ms, signal) {
|
|
46854
|
-
return new Promise((
|
|
46916
|
+
return new Promise((resolve20, reject) => {
|
|
46855
46917
|
if (signal?.aborted) {
|
|
46856
46918
|
reject(signal.reason instanceof SdkError ? signal.reason : new SdkError(SdkErrorCode.RequestTimeout, String(signal.reason)));
|
|
46857
46919
|
return;
|
|
46858
46920
|
}
|
|
46859
46921
|
const timer = setTimeout(() => {
|
|
46860
46922
|
signal?.removeEventListener("abort", onAbort);
|
|
46861
|
-
|
|
46923
|
+
resolve20();
|
|
46862
46924
|
}, ms);
|
|
46863
46925
|
const onAbort = () => {
|
|
46864
46926
|
clearTimeout(timer);
|
|
@@ -48654,7 +48716,7 @@ var init_src_CX2iR2pK = __esm({
|
|
|
48654
48716
|
const flowStartedAt = Date.now();
|
|
48655
48717
|
let onAbort;
|
|
48656
48718
|
let cleanupMessageId;
|
|
48657
|
-
return new Promise((
|
|
48719
|
+
return new Promise((resolve20, reject) => {
|
|
48658
48720
|
const earlyReject = (error62) => {
|
|
48659
48721
|
reject(error62);
|
|
48660
48722
|
};
|
|
@@ -48722,7 +48784,7 @@ var init_src_CX2iR2pK = __esm({
|
|
|
48722
48784
|
}
|
|
48723
48785
|
if (decoded.kind === "invalid") return reject(decoded.error);
|
|
48724
48786
|
if (decoded.kind === "input_required") {
|
|
48725
|
-
if (options?.allowInputRequired === true) return
|
|
48787
|
+
if (options?.allowInputRequired === true) return resolve20(manualInputRequiredValue(decoded));
|
|
48726
48788
|
const flow = {
|
|
48727
48789
|
codec: codec2,
|
|
48728
48790
|
request,
|
|
@@ -48734,11 +48796,11 @@ var init_src_CX2iR2pK = __esm({
|
|
|
48734
48796
|
params
|
|
48735
48797
|
}, resultSchema2, legOptions)
|
|
48736
48798
|
};
|
|
48737
|
-
return
|
|
48799
|
+
return resolve20(this._resolveNonCompleteResult(decoded, flow));
|
|
48738
48800
|
}
|
|
48739
48801
|
const result = decoded.result;
|
|
48740
48802
|
validateStandardSchema(resultSchema2, result).then((parseResult) => {
|
|
48741
|
-
if (parseResult.success)
|
|
48803
|
+
if (parseResult.success) resolve20(parseResult.data);
|
|
48742
48804
|
else reject(new SdkError(SdkErrorCode.InvalidResult, `Invalid result for ${request.method}: ${parseResult.error}`));
|
|
48743
48805
|
}, reject);
|
|
48744
48806
|
});
|
|
@@ -49044,7 +49106,7 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
49044
49106
|
}
|
|
49045
49107
|
exports._ = _;
|
|
49046
49108
|
const plus = new _Code("+");
|
|
49047
|
-
function
|
|
49109
|
+
function str2(strs, ...args2) {
|
|
49048
49110
|
const expr = [safeStringify(strs[0])];
|
|
49049
49111
|
let i2 = 0;
|
|
49050
49112
|
while (i2 < args2.length) {
|
|
@@ -49055,7 +49117,7 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
49055
49117
|
optimize(expr);
|
|
49056
49118
|
return new _Code(expr);
|
|
49057
49119
|
}
|
|
49058
|
-
exports.str =
|
|
49120
|
+
exports.str = str2;
|
|
49059
49121
|
function addCodeArg(code2, arg4) {
|
|
49060
49122
|
if (arg4 instanceof _Code) code2.push(...arg4._items);
|
|
49061
49123
|
else if (arg4 instanceof Name3) code2.push(arg4);
|
|
@@ -49088,7 +49150,7 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
49088
49150
|
if (typeof b == "string" && b[0] === '"' && !(a instanceof Name3)) return `"${a}${b.slice(1)}`;
|
|
49089
49151
|
}
|
|
49090
49152
|
function strConcat(c1, c2) {
|
|
49091
|
-
return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 :
|
|
49153
|
+
return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str2`${c1}${c2}`;
|
|
49092
49154
|
}
|
|
49093
49155
|
exports.strConcat = strConcat;
|
|
49094
49156
|
function interpolate(x) {
|
|
@@ -49967,21 +50029,21 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
49967
50029
|
return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`;
|
|
49968
50030
|
}
|
|
49969
50031
|
exports.schemaRefOrVal = schemaRefOrVal;
|
|
49970
|
-
function unescapeFragment(
|
|
49971
|
-
return unescapeJsonPointer(decodeURIComponent(
|
|
50032
|
+
function unescapeFragment(str2) {
|
|
50033
|
+
return unescapeJsonPointer(decodeURIComponent(str2));
|
|
49972
50034
|
}
|
|
49973
50035
|
exports.unescapeFragment = unescapeFragment;
|
|
49974
|
-
function escapeFragment(
|
|
49975
|
-
return encodeURIComponent(escapeJsonPointer(
|
|
50036
|
+
function escapeFragment(str2) {
|
|
50037
|
+
return encodeURIComponent(escapeJsonPointer(str2));
|
|
49976
50038
|
}
|
|
49977
50039
|
exports.escapeFragment = escapeFragment;
|
|
49978
|
-
function escapeJsonPointer(
|
|
49979
|
-
if (typeof
|
|
49980
|
-
return
|
|
50040
|
+
function escapeJsonPointer(str2) {
|
|
50041
|
+
if (typeof str2 == "number") return `${str2}`;
|
|
50042
|
+
return str2.replace(/~/g, "~0").replace(/\//g, "~1");
|
|
49981
50043
|
}
|
|
49982
50044
|
exports.escapeJsonPointer = escapeJsonPointer;
|
|
49983
|
-
function unescapeJsonPointer(
|
|
49984
|
-
return
|
|
50045
|
+
function unescapeJsonPointer(str2) {
|
|
50046
|
+
return str2.replace(/~1/g, "/").replace(/~0/g, "~");
|
|
49985
50047
|
}
|
|
49986
50048
|
exports.unescapeJsonPointer = unescapeJsonPointer;
|
|
49987
50049
|
function eachItem(xs, f) {
|
|
@@ -50867,8 +50929,8 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
50867
50929
|
post2(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
|
|
50868
50930
|
}
|
|
50869
50931
|
}
|
|
50870
|
-
function escapeJsonPtr(
|
|
50871
|
-
return
|
|
50932
|
+
function escapeJsonPtr(str2) {
|
|
50933
|
+
return str2.replace(/~/g, "~0").replace(/\//g, "~1");
|
|
50872
50934
|
}
|
|
50873
50935
|
}));
|
|
50874
50936
|
require_resolve = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
@@ -51554,7 +51616,7 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
51554
51616
|
ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref);
|
|
51555
51617
|
const schOrFunc = root.refs[ref];
|
|
51556
51618
|
if (schOrFunc) return schOrFunc;
|
|
51557
|
-
let _sch =
|
|
51619
|
+
let _sch = resolve20.call(this, root, ref);
|
|
51558
51620
|
if (_sch === void 0) {
|
|
51559
51621
|
const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref];
|
|
51560
51622
|
const { schemaId } = this.opts;
|
|
@@ -51580,7 +51642,7 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
51580
51642
|
function sameSchemaEnv(s1, s2) {
|
|
51581
51643
|
return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
|
|
51582
51644
|
}
|
|
51583
|
-
function
|
|
51645
|
+
function resolve20(root, ref) {
|
|
51584
51646
|
let sch;
|
|
51585
51647
|
while (typeof (sch = this.refs[ref]) == "string") ref = sch;
|
|
51586
51648
|
return sch || this.schemas[ref] || resolveSchema.call(this, root, ref);
|
|
@@ -51760,9 +51822,9 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
51760
51822
|
isIPV6: false
|
|
51761
51823
|
};
|
|
51762
51824
|
}
|
|
51763
|
-
function findToken3(
|
|
51825
|
+
function findToken3(str2, token) {
|
|
51764
51826
|
let ind = 0;
|
|
51765
|
-
for (let i2 = 0; i2 <
|
|
51827
|
+
for (let i2 = 0; i2 < str2.length; i2++) if (str2[i2] === token) ind++;
|
|
51766
51828
|
return ind;
|
|
51767
51829
|
}
|
|
51768
51830
|
function removeDotSegments(path) {
|
|
@@ -52030,47 +52092,47 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
52030
52092
|
else if (typeof uri === "object") uri = parse5(serialize(uri, options), options);
|
|
52031
52093
|
return uri;
|
|
52032
52094
|
}
|
|
52033
|
-
function
|
|
52095
|
+
function resolve20(baseURI, relativeURI, options) {
|
|
52034
52096
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
52035
52097
|
const resolved = resolveComponent(parse5(baseURI, schemelessOptions), parse5(relativeURI, schemelessOptions), schemelessOptions, true);
|
|
52036
52098
|
schemelessOptions.skipEscape = true;
|
|
52037
52099
|
return serialize(resolved, schemelessOptions);
|
|
52038
52100
|
}
|
|
52039
|
-
function resolveComponent(base5,
|
|
52101
|
+
function resolveComponent(base5, relative6, options, skipNormalization) {
|
|
52040
52102
|
const target2 = {};
|
|
52041
52103
|
if (!skipNormalization) {
|
|
52042
52104
|
base5 = parse5(serialize(base5, options), options);
|
|
52043
|
-
|
|
52105
|
+
relative6 = parse5(serialize(relative6, options), options);
|
|
52044
52106
|
}
|
|
52045
52107
|
options = options || {};
|
|
52046
|
-
if (!options.tolerant &&
|
|
52047
|
-
target2.scheme =
|
|
52048
|
-
target2.userinfo =
|
|
52049
|
-
target2.host =
|
|
52050
|
-
target2.port =
|
|
52051
|
-
target2.path = removeDotSegments(
|
|
52052
|
-
target2.query =
|
|
52108
|
+
if (!options.tolerant && relative6.scheme) {
|
|
52109
|
+
target2.scheme = relative6.scheme;
|
|
52110
|
+
target2.userinfo = relative6.userinfo;
|
|
52111
|
+
target2.host = relative6.host;
|
|
52112
|
+
target2.port = relative6.port;
|
|
52113
|
+
target2.path = removeDotSegments(relative6.path || "");
|
|
52114
|
+
target2.query = relative6.query;
|
|
52053
52115
|
} else {
|
|
52054
|
-
if (
|
|
52055
|
-
target2.userinfo =
|
|
52056
|
-
target2.host =
|
|
52057
|
-
target2.port =
|
|
52058
|
-
target2.path = removeDotSegments(
|
|
52059
|
-
target2.query =
|
|
52116
|
+
if (relative6.userinfo !== void 0 || relative6.host !== void 0 || relative6.port !== void 0) {
|
|
52117
|
+
target2.userinfo = relative6.userinfo;
|
|
52118
|
+
target2.host = relative6.host;
|
|
52119
|
+
target2.port = relative6.port;
|
|
52120
|
+
target2.path = removeDotSegments(relative6.path || "");
|
|
52121
|
+
target2.query = relative6.query;
|
|
52060
52122
|
} else {
|
|
52061
|
-
if (!
|
|
52123
|
+
if (!relative6.path) {
|
|
52062
52124
|
target2.path = base5.path;
|
|
52063
|
-
if (
|
|
52125
|
+
if (relative6.query !== void 0) target2.query = relative6.query;
|
|
52064
52126
|
else target2.query = base5.query;
|
|
52065
52127
|
} else {
|
|
52066
|
-
if (
|
|
52128
|
+
if (relative6.path[0] === "/") target2.path = removeDotSegments(relative6.path);
|
|
52067
52129
|
else {
|
|
52068
|
-
if ((base5.userinfo !== void 0 || base5.host !== void 0 || base5.port !== void 0) && !base5.path) target2.path = "/" +
|
|
52069
|
-
else if (!base5.path) target2.path =
|
|
52070
|
-
else target2.path = base5.path.slice(0, base5.path.lastIndexOf("/") + 1) +
|
|
52130
|
+
if ((base5.userinfo !== void 0 || base5.host !== void 0 || base5.port !== void 0) && !base5.path) target2.path = "/" + relative6.path;
|
|
52131
|
+
else if (!base5.path) target2.path = relative6.path;
|
|
52132
|
+
else target2.path = base5.path.slice(0, base5.path.lastIndexOf("/") + 1) + relative6.path;
|
|
52071
52133
|
target2.path = removeDotSegments(target2.path);
|
|
52072
52134
|
}
|
|
52073
|
-
target2.query =
|
|
52135
|
+
target2.query = relative6.query;
|
|
52074
52136
|
}
|
|
52075
52137
|
target2.userinfo = base5.userinfo;
|
|
52076
52138
|
target2.host = base5.host;
|
|
@@ -52078,7 +52140,7 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
52078
52140
|
}
|
|
52079
52141
|
target2.scheme = base5.scheme;
|
|
52080
52142
|
}
|
|
52081
|
-
target2.fragment =
|
|
52143
|
+
target2.fragment = relative6.fragment;
|
|
52082
52144
|
return target2;
|
|
52083
52145
|
}
|
|
52084
52146
|
function equal(uriA, uriB, options) {
|
|
@@ -52204,7 +52266,7 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
52204
52266
|
const fastUri = {
|
|
52205
52267
|
SCHEMES,
|
|
52206
52268
|
normalize,
|
|
52207
|
-
resolve:
|
|
52269
|
+
resolve: resolve20,
|
|
52208
52270
|
resolveComponent,
|
|
52209
52271
|
equal,
|
|
52210
52272
|
serialize,
|
|
@@ -52277,7 +52339,7 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
52277
52339
|
const util_1 = require_util();
|
|
52278
52340
|
const $dataRefSchema = require_data();
|
|
52279
52341
|
const uri_1 = require_uri();
|
|
52280
|
-
const defaultRegExp = (
|
|
52342
|
+
const defaultRegExp = (str2, flags2) => new RegExp(str2, flags2);
|
|
52281
52343
|
defaultRegExp.code = "new RegExp";
|
|
52282
52344
|
const META_IGNORE_OPTIONS = [
|
|
52283
52345
|
"removeAdditional",
|
|
@@ -52983,16 +53045,16 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
52983
53045
|
}));
|
|
52984
53046
|
require_ucs2length = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
52985
53047
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52986
|
-
function ucs2length(
|
|
52987
|
-
const len =
|
|
53048
|
+
function ucs2length(str2) {
|
|
53049
|
+
const len = str2.length;
|
|
52988
53050
|
let length = 0;
|
|
52989
53051
|
let pos = 0;
|
|
52990
53052
|
let value;
|
|
52991
53053
|
while (pos < len) {
|
|
52992
53054
|
length++;
|
|
52993
|
-
value =
|
|
53055
|
+
value = str2.charCodeAt(pos++);
|
|
52994
53056
|
if (value >= 55296 && value <= 56319 && pos < len) {
|
|
52995
|
-
value =
|
|
53057
|
+
value = str2.charCodeAt(pos);
|
|
52996
53058
|
if ((value & 64512) === 56320) pos++;
|
|
52997
53059
|
}
|
|
52998
53060
|
}
|
|
@@ -55703,8 +55765,8 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
55703
55765
|
30,
|
|
55704
55766
|
31
|
|
55705
55767
|
];
|
|
55706
|
-
function date5(
|
|
55707
|
-
const matches = DATE.exec(
|
|
55768
|
+
function date5(str2) {
|
|
55769
|
+
const matches = DATE.exec(str2);
|
|
55708
55770
|
if (!matches) return false;
|
|
55709
55771
|
const year = +matches[1];
|
|
55710
55772
|
const month = +matches[2];
|
|
@@ -55719,8 +55781,8 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
55719
55781
|
}
|
|
55720
55782
|
const TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i;
|
|
55721
55783
|
function getTime(strictTimeZone) {
|
|
55722
|
-
return function time3(
|
|
55723
|
-
const matches = TIME.exec(
|
|
55784
|
+
return function time3(str2) {
|
|
55785
|
+
const matches = TIME.exec(str2);
|
|
55724
55786
|
if (!matches) return false;
|
|
55725
55787
|
const hr = +matches[1];
|
|
55726
55788
|
const min = +matches[2];
|
|
@@ -55757,8 +55819,8 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
55757
55819
|
const DATE_TIME_SEPARATOR = /t|\s/i;
|
|
55758
55820
|
function getDateTime(strictTimeZone) {
|
|
55759
55821
|
const time3 = getTime(strictTimeZone);
|
|
55760
|
-
return function date_time(
|
|
55761
|
-
const dateTime =
|
|
55822
|
+
return function date_time(str2) {
|
|
55823
|
+
const dateTime = str2.split(DATE_TIME_SEPARATOR);
|
|
55762
55824
|
return dateTime.length === 2 && date5(dateTime[0]) && time3(dateTime[1]);
|
|
55763
55825
|
};
|
|
55764
55826
|
}
|
|
@@ -55779,13 +55841,13 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
55779
55841
|
}
|
|
55780
55842
|
const NOT_URI_FRAGMENT = /\/|:/;
|
|
55781
55843
|
const URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
|
|
55782
|
-
function uri(
|
|
55783
|
-
return NOT_URI_FRAGMENT.test(
|
|
55844
|
+
function uri(str2) {
|
|
55845
|
+
return NOT_URI_FRAGMENT.test(str2) && URI.test(str2);
|
|
55784
55846
|
}
|
|
55785
55847
|
const BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm;
|
|
55786
|
-
function byte(
|
|
55848
|
+
function byte(str2) {
|
|
55787
55849
|
BYTE.lastIndex = 0;
|
|
55788
|
-
return BYTE.test(
|
|
55850
|
+
return BYTE.test(str2);
|
|
55789
55851
|
}
|
|
55790
55852
|
const MIN_INT32 = -(2 ** 31);
|
|
55791
55853
|
const MAX_INT32 = 2 ** 31 - 1;
|
|
@@ -55799,10 +55861,10 @@ var init_ajvProvider_CEoC_sr = __esm({
|
|
|
55799
55861
|
return true;
|
|
55800
55862
|
}
|
|
55801
55863
|
const Z_ANCHOR = /[^\\]\\Z/;
|
|
55802
|
-
function regex(
|
|
55803
|
-
if (Z_ANCHOR.test(
|
|
55864
|
+
function regex(str2) {
|
|
55865
|
+
if (Z_ANCHOR.test(str2)) return false;
|
|
55804
55866
|
try {
|
|
55805
|
-
new RegExp(
|
|
55867
|
+
new RegExp(str2);
|
|
55806
55868
|
return true;
|
|
55807
55869
|
} catch (e2) {
|
|
55808
55870
|
return false;
|
|
@@ -57901,7 +57963,7 @@ var init_stdio = __esm({
|
|
|
57901
57963
|
}
|
|
57902
57964
|
send(message) {
|
|
57903
57965
|
if (this._closed) return Promise.reject(/* @__PURE__ */ new Error("StdioServerTransport is closed"));
|
|
57904
|
-
return new Promise((
|
|
57966
|
+
return new Promise((resolve20, reject) => {
|
|
57905
57967
|
const json2 = serializeMessage(message);
|
|
57906
57968
|
let settled = false;
|
|
57907
57969
|
const onError = (error62) => {
|
|
@@ -57916,14 +57978,14 @@ var init_stdio = __esm({
|
|
|
57916
57978
|
settled = true;
|
|
57917
57979
|
this._stdout.off("error", onError);
|
|
57918
57980
|
this._stdout.off("drain", onDrain);
|
|
57919
|
-
|
|
57981
|
+
resolve20();
|
|
57920
57982
|
};
|
|
57921
57983
|
this._stdout.once("error", onError);
|
|
57922
57984
|
if (this._stdout.write(json2)) {
|
|
57923
57985
|
if (settled) return;
|
|
57924
57986
|
settled = true;
|
|
57925
57987
|
this._stdout.off("error", onError);
|
|
57926
|
-
|
|
57988
|
+
resolve20();
|
|
57927
57989
|
} else if (!settled) this._stdout.once("drain", onDrain);
|
|
57928
57990
|
});
|
|
57929
57991
|
}
|
|
@@ -57977,14 +58039,14 @@ var init_stdio = __esm({
|
|
|
57977
58039
|
*/
|
|
57978
58040
|
async whenRequestsAnswered(timeoutMs) {
|
|
57979
58041
|
if (this._closed || this._pendingRequests.size === 0) return true;
|
|
57980
|
-
return await new Promise((
|
|
58042
|
+
return await new Promise((resolve20) => {
|
|
57981
58043
|
const waiter = () => {
|
|
57982
58044
|
clearTimeout(timer);
|
|
57983
|
-
|
|
58045
|
+
resolve20(true);
|
|
57984
58046
|
};
|
|
57985
58047
|
const timer = setTimeout(() => {
|
|
57986
58048
|
this._drainWaiters = this._drainWaiters.filter((pending) => pending !== waiter);
|
|
57987
|
-
|
|
58049
|
+
resolve20(false);
|
|
57988
58050
|
}, timeoutMs);
|
|
57989
58051
|
this._drainWaiters.push(waiter);
|
|
57990
58052
|
});
|
|
@@ -58091,8 +58153,8 @@ var init_cloud = __esm({
|
|
|
58091
58153
|
|
|
58092
58154
|
// ../code-shim/src/git.ts
|
|
58093
58155
|
import { execFileSync } from "node:child_process";
|
|
58094
|
-
import { existsSync as
|
|
58095
|
-
import { join as
|
|
58156
|
+
import { existsSync as existsSync14 } from "node:fs";
|
|
58157
|
+
import { join as join38 } from "node:path";
|
|
58096
58158
|
function git7(root, args2) {
|
|
58097
58159
|
try {
|
|
58098
58160
|
return execFileSync("git", args2, { cwd: root, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], maxBuffer: 64 * 1024 * 1024, timeout: 1e4 });
|
|
@@ -58154,7 +58216,7 @@ function readWorkingCopyState(root) {
|
|
|
58154
58216
|
const head = headCommit2(root);
|
|
58155
58217
|
const raw = git7(root, ["status", "--porcelain=v2", "-z", "--untracked-files=all"]);
|
|
58156
58218
|
if (raw === null) return { head, dirty: /* @__PURE__ */ new Set(), deleted: /* @__PURE__ */ new Set(), renamed: /* @__PURE__ */ new Map() };
|
|
58157
|
-
return { head, ...parseStatus(raw, (path) =>
|
|
58219
|
+
return { head, ...parseStatus(raw, (path) => existsSync14(join38(root, path))) };
|
|
58158
58220
|
}
|
|
58159
58221
|
var init_git2 = __esm({
|
|
58160
58222
|
"../code-shim/src/git.ts"() {
|
|
@@ -58163,18 +58225,18 @@ var init_git2 = __esm({
|
|
|
58163
58225
|
});
|
|
58164
58226
|
|
|
58165
58227
|
// ../code-shim/src/config.ts
|
|
58166
|
-
import { readFileSync as
|
|
58228
|
+
import { readFileSync as readFileSync21 } from "node:fs";
|
|
58167
58229
|
import { homedir as homedir2 } from "node:os";
|
|
58168
|
-
import { join as
|
|
58230
|
+
import { join as join39 } from "node:path";
|
|
58169
58231
|
function configDir(env) {
|
|
58170
|
-
const base5 = env["XDG_CONFIG_HOME"] ?? (process.platform === "win32" ? env["APPDATA"] : void 0) ??
|
|
58171
|
-
return
|
|
58232
|
+
const base5 = env["XDG_CONFIG_HOME"] ?? (process.platform === "win32" ? env["APPDATA"] : void 0) ?? join39(homedir2(), ".config");
|
|
58233
|
+
return join39(base5, "mvrx-harness");
|
|
58172
58234
|
}
|
|
58173
58235
|
function findToken2(env, serviceUrl, now) {
|
|
58174
58236
|
const fromEnv = env["HARNESS_TOKEN"];
|
|
58175
58237
|
if (fromEnv !== void 0 && fromEnv.length > 0) return fromEnv;
|
|
58176
58238
|
try {
|
|
58177
|
-
const file2 = JSON.parse(
|
|
58239
|
+
const file2 = JSON.parse(readFileSync21(join39(configDir(env), "credentials.json"), "utf8"));
|
|
58178
58240
|
const stored = file2[serviceUrl];
|
|
58179
58241
|
if (stored === void 0 || typeof stored.accessToken !== "string" || stored.accessToken.length === 0) return null;
|
|
58180
58242
|
if (typeof stored.expiresAt === "number" && stored.expiresAt <= now) return null;
|
|
@@ -58186,7 +58248,7 @@ function findToken2(env, serviceUrl, now) {
|
|
|
58186
58248
|
function resolveCloudConfig(root, env, now) {
|
|
58187
58249
|
let binding;
|
|
58188
58250
|
try {
|
|
58189
|
-
const parsed = ProjectBinding.safeParse(JSON.parse(
|
|
58251
|
+
const parsed = ProjectBinding.safeParse(JSON.parse(readFileSync21(join39(root, ".harness", "project.json"), "utf8")));
|
|
58190
58252
|
if (!parsed.success) return null;
|
|
58191
58253
|
binding = parsed.data;
|
|
58192
58254
|
} catch {
|
|
@@ -58208,11 +58270,11 @@ var init_config = __esm({
|
|
|
58208
58270
|
});
|
|
58209
58271
|
|
|
58210
58272
|
// ../code-shim/src/local.ts
|
|
58211
|
-
import { readFileSync as
|
|
58212
|
-
import { isAbsolute as isAbsolute2, relative as
|
|
58273
|
+
import { readFileSync as readFileSync22, statSync as statSync4 } from "node:fs";
|
|
58274
|
+
import { isAbsolute as isAbsolute2, relative as relative5, resolve as resolve19, sep as sep2 } from "node:path";
|
|
58213
58275
|
function resolveInside(root, path) {
|
|
58214
|
-
const absolute =
|
|
58215
|
-
const rel =
|
|
58276
|
+
const absolute = resolve19(root, path);
|
|
58277
|
+
const rel = relative5(root, absolute);
|
|
58216
58278
|
if (rel.length === 0 || rel.startsWith("..") || isAbsolute2(rel)) return null;
|
|
58217
58279
|
return absolute;
|
|
58218
58280
|
}
|
|
@@ -58317,7 +58379,7 @@ var init_local = __esm({
|
|
|
58317
58379
|
if (absolute === null || !this.supports(path)) return null;
|
|
58318
58380
|
let key;
|
|
58319
58381
|
try {
|
|
58320
|
-
const stat =
|
|
58382
|
+
const stat = statSync4(absolute);
|
|
58321
58383
|
if (!stat.isFile() || stat.size > MAX_PARSE_BYTES2) return null;
|
|
58322
58384
|
key = `${stat.mtimeMs}:${stat.size}`;
|
|
58323
58385
|
} catch {
|
|
@@ -58328,7 +58390,7 @@ var init_local = __esm({
|
|
|
58328
58390
|
let shard;
|
|
58329
58391
|
try {
|
|
58330
58392
|
this.parses += 1;
|
|
58331
|
-
shard = await this.parse(path,
|
|
58393
|
+
shard = await this.parse(path, readFileSync22(absolute, "utf8"));
|
|
58332
58394
|
} catch {
|
|
58333
58395
|
shard = null;
|
|
58334
58396
|
}
|
|
@@ -58340,7 +58402,7 @@ var init_local = __esm({
|
|
|
58340
58402
|
const absolute = resolveInside(this.root, path);
|
|
58341
58403
|
if (absolute === null) return null;
|
|
58342
58404
|
try {
|
|
58343
|
-
return
|
|
58405
|
+
return readFileSync22(absolute, "utf8");
|
|
58344
58406
|
} catch {
|
|
58345
58407
|
return null;
|
|
58346
58408
|
}
|
|
@@ -58350,7 +58412,7 @@ var init_local = __esm({
|
|
|
58350
58412
|
const absolute = resolveInside(this.root, path);
|
|
58351
58413
|
if (absolute === null) return void 0;
|
|
58352
58414
|
try {
|
|
58353
|
-
const lines =
|
|
58415
|
+
const lines = readFileSync22(absolute, "utf8").split("\n");
|
|
58354
58416
|
const start2 = range[0];
|
|
58355
58417
|
if (start2 >= lines.length) return void 0;
|
|
58356
58418
|
const end = Math.min(Math.max(range[2], start2), start2 + maxLines - 1, lines.length - 1);
|
|
@@ -58577,7 +58639,7 @@ var init_nav = __esm({
|
|
|
58577
58639
|
|
|
58578
58640
|
// ../code-shim/src/edit.ts
|
|
58579
58641
|
import { createHash as createHash8 } from "node:crypto";
|
|
58580
|
-
import { readFileSync as
|
|
58642
|
+
import { readFileSync as readFileSync23, writeFileSync as writeFileSync11 } from "node:fs";
|
|
58581
58643
|
function lineStarts(text) {
|
|
58582
58644
|
const starts = [0];
|
|
58583
58645
|
for (let i2 = 0; i2 < text.length; i2 += 1) if (text[i2] === "\n") starts.push(i2 + 1);
|
|
@@ -58618,7 +58680,7 @@ async function editSymbol(index, args2) {
|
|
|
58618
58680
|
if (!found.ok) return found;
|
|
58619
58681
|
const absolute = resolveInside(index.root, args2.path);
|
|
58620
58682
|
if (absolute === null) return { ok: false, reason: `path ${args2.path} is outside the repository` };
|
|
58621
|
-
const original =
|
|
58683
|
+
const original = readFileSync23(absolute, "utf8");
|
|
58622
58684
|
const starts = lineStarts(original);
|
|
58623
58685
|
const range = found.symbol.enclosingRange ?? found.symbol.range;
|
|
58624
58686
|
const from = offsetOf(starts, original, range[0], range[1]);
|
|
@@ -58685,7 +58747,7 @@ async function renameSymbol(deps, args2) {
|
|
|
58685
58747
|
if (absolute === null) return { ok: false, reason: `reference path ${path} is outside the repository` };
|
|
58686
58748
|
let text;
|
|
58687
58749
|
try {
|
|
58688
|
-
text =
|
|
58750
|
+
text = readFileSync23(absolute, "utf8");
|
|
58689
58751
|
} catch {
|
|
58690
58752
|
return { ok: false, reason: `cannot read ${path}` };
|
|
58691
58753
|
}
|
|
@@ -58962,6 +59024,7 @@ function defineCommand(definition) {
|
|
|
58962
59024
|
result: definition.result,
|
|
58963
59025
|
style: definition.style ?? "normal",
|
|
58964
59026
|
...definition.text === void 0 ? {} : { text: definition.text },
|
|
59027
|
+
...definition.textDefault === true ? { textDefault: true } : {},
|
|
58965
59028
|
handler: definition.handler
|
|
58966
59029
|
};
|
|
58967
59030
|
}
|
|
@@ -59509,12 +59572,12 @@ function parseKeyPath(source) {
|
|
|
59509
59572
|
const s = source.trim();
|
|
59510
59573
|
while (i2 < s.length) {
|
|
59511
59574
|
while (s[i2] === " " || s[i2] === " ") i2 += 1;
|
|
59512
|
-
const
|
|
59575
|
+
const quote4 = s[i2];
|
|
59513
59576
|
let part = "";
|
|
59514
|
-
if (
|
|
59577
|
+
if (quote4 === '"' || quote4 === "'") {
|
|
59515
59578
|
i2 += 1;
|
|
59516
|
-
while (i2 < s.length && s[i2] !==
|
|
59517
|
-
if (
|
|
59579
|
+
while (i2 < s.length && s[i2] !== quote4) {
|
|
59580
|
+
if (quote4 === '"' && s[i2] === "\\" && i2 + 1 < s.length) {
|
|
59518
59581
|
part += s[i2 + 1];
|
|
59519
59582
|
i2 += 2;
|
|
59520
59583
|
} else {
|
|
@@ -59522,7 +59585,7 @@ function parseKeyPath(source) {
|
|
|
59522
59585
|
i2 += 1;
|
|
59523
59586
|
}
|
|
59524
59587
|
}
|
|
59525
|
-
if (s[i2] !==
|
|
59588
|
+
if (s[i2] !== quote4) return null;
|
|
59526
59589
|
i2 += 1;
|
|
59527
59590
|
} else {
|
|
59528
59591
|
const start2 = i2;
|
|
@@ -59728,19 +59791,19 @@ function pkcePair() {
|
|
|
59728
59791
|
return { verifier, challenge: base64url3(createHash("sha256").update(verifier).digest()) };
|
|
59729
59792
|
}
|
|
59730
59793
|
function listen(server2, port) {
|
|
59731
|
-
return new Promise((
|
|
59794
|
+
return new Promise((resolve20, reject) => {
|
|
59732
59795
|
const onError = (error62) => reject(error62);
|
|
59733
59796
|
server2.once("error", onError);
|
|
59734
59797
|
server2.listen(port, "127.0.0.1", () => {
|
|
59735
59798
|
server2.off("error", onError);
|
|
59736
|
-
|
|
59799
|
+
resolve20();
|
|
59737
59800
|
});
|
|
59738
59801
|
});
|
|
59739
59802
|
}
|
|
59740
59803
|
async function startLoopback(preferredPort, state) {
|
|
59741
59804
|
let settle2;
|
|
59742
|
-
const code2 = new Promise((
|
|
59743
|
-
settle2 = { resolve:
|
|
59805
|
+
const code2 = new Promise((resolve20, reject) => {
|
|
59806
|
+
settle2 = { resolve: resolve20, reject };
|
|
59744
59807
|
});
|
|
59745
59808
|
code2.catch(() => void 0);
|
|
59746
59809
|
const server2 = createServer((request, response) => {
|
|
@@ -59894,13 +59957,13 @@ async function findToken(deps, serviceUrl) {
|
|
|
59894
59957
|
rememberSecret(fromEnv);
|
|
59895
59958
|
return { token: fromEnv, source: "environment" };
|
|
59896
59959
|
}
|
|
59897
|
-
const
|
|
59898
|
-
if (
|
|
59899
|
-
const { tokens } =
|
|
59960
|
+
const loaded2 = await loadTokens(deps, serviceUrl);
|
|
59961
|
+
if (loaded2 === null) return null;
|
|
59962
|
+
const { tokens } = loaded2;
|
|
59900
59963
|
rememberSecret(tokens.accessToken);
|
|
59901
59964
|
rememberSecret(tokens.refreshToken);
|
|
59902
59965
|
if (tokens.expiresAt === void 0 || deps.now() < tokens.expiresAt - EXPIRY_MARGIN_MS) {
|
|
59903
|
-
return { token: tokens.accessToken, source:
|
|
59966
|
+
return { token: tokens.accessToken, source: loaded2.store };
|
|
59904
59967
|
}
|
|
59905
59968
|
const renewed = await refresh(deps, serviceUrl, tokens);
|
|
59906
59969
|
if (renewed === null) return null;
|
|
@@ -60517,8 +60580,8 @@ function withTimeout(deps, ms) {
|
|
|
60517
60580
|
}
|
|
60518
60581
|
async function attempt(deps, ms, work) {
|
|
60519
60582
|
let timer;
|
|
60520
|
-
const deadline = new Promise((
|
|
60521
|
-
timer = setTimeout(() =>
|
|
60583
|
+
const deadline = new Promise((resolve20) => {
|
|
60584
|
+
timer = setTimeout(() => resolve20("unreachable"), ms);
|
|
60522
60585
|
});
|
|
60523
60586
|
try {
|
|
60524
60587
|
return await Promise.race([work(withTimeout(deps, ms)).catch((error62) => error62 instanceof ServiceError && error62.exit === EXIT.auth ? "unauthenticated" : "unreachable"), deadline]);
|
|
@@ -60557,16 +60620,16 @@ async function authStatus(deps, serviceFlag) {
|
|
|
60557
60620
|
how = "environment";
|
|
60558
60621
|
token = fromEnv;
|
|
60559
60622
|
} else {
|
|
60560
|
-
const
|
|
60561
|
-
if (
|
|
60562
|
-
how =
|
|
60563
|
-
token =
|
|
60564
|
-
rememberSecret(
|
|
60565
|
-
rememberSecret(
|
|
60566
|
-
canRefresh =
|
|
60567
|
-
if (
|
|
60568
|
-
expiresAt = new Date(
|
|
60569
|
-
expired = deps.now() >=
|
|
60623
|
+
const loaded2 = await loadTokens(deps, storeKey).catch(() => null);
|
|
60624
|
+
if (loaded2 !== null) {
|
|
60625
|
+
how = loaded2.store;
|
|
60626
|
+
token = loaded2.tokens.accessToken;
|
|
60627
|
+
rememberSecret(loaded2.tokens.accessToken);
|
|
60628
|
+
rememberSecret(loaded2.tokens.refreshToken);
|
|
60629
|
+
canRefresh = loaded2.tokens.refreshToken !== void 0;
|
|
60630
|
+
if (loaded2.tokens.expiresAt !== void 0) {
|
|
60631
|
+
expiresAt = new Date(loaded2.tokens.expiresAt).toISOString();
|
|
60632
|
+
expired = deps.now() >= loaded2.tokens.expiresAt;
|
|
60570
60633
|
}
|
|
60571
60634
|
}
|
|
60572
60635
|
}
|
|
@@ -63286,12 +63349,12 @@ async function buildContext(deps, version2) {
|
|
|
63286
63349
|
token = fromEnv;
|
|
63287
63350
|
how = "environment";
|
|
63288
63351
|
} else {
|
|
63289
|
-
const
|
|
63290
|
-
if (
|
|
63291
|
-
token =
|
|
63292
|
-
how =
|
|
63293
|
-
rememberSecret(
|
|
63294
|
-
if (
|
|
63352
|
+
const loaded2 = await loadTokens(deps, storeKey).catch(() => null);
|
|
63353
|
+
if (loaded2 !== null) {
|
|
63354
|
+
token = loaded2.tokens.accessToken;
|
|
63355
|
+
how = loaded2.store;
|
|
63356
|
+
rememberSecret(loaded2.tokens.refreshToken);
|
|
63357
|
+
if (loaded2.tokens.expiresAt !== void 0) expired = deps.now() >= loaded2.tokens.expiresAt;
|
|
63295
63358
|
}
|
|
63296
63359
|
}
|
|
63297
63360
|
rememberSecret(token);
|
|
@@ -63678,7 +63741,7 @@ async function post(deps, base5, path, body2) {
|
|
|
63678
63741
|
return { status: response.status, json: json2 };
|
|
63679
63742
|
}
|
|
63680
63743
|
function sleep(ms) {
|
|
63681
|
-
return new Promise((
|
|
63744
|
+
return new Promise((resolve20) => setTimeout(resolve20, ms));
|
|
63682
63745
|
}
|
|
63683
63746
|
async function deviceLogin(deps, service, options) {
|
|
63684
63747
|
const started = await post(deps, service, "/auth/device", {});
|
|
@@ -63836,14 +63899,14 @@ var authLogoutCommand = defineCommand({
|
|
|
63836
63899
|
);
|
|
63837
63900
|
}
|
|
63838
63901
|
const tokenEnvSet = (inv.deps.env["HARNESS_TOKEN"] ?? "") !== "";
|
|
63839
|
-
const
|
|
63902
|
+
const loaded2 = await loadTokens(inv.deps, target2.storeKey).catch(() => null);
|
|
63840
63903
|
let revoked = "not_needed";
|
|
63841
|
-
if (
|
|
63842
|
-
rememberSecret(
|
|
63904
|
+
if (loaded2 !== null && loaded2.tokens.accessToken.startsWith(SERVER_TOKEN_PREFIX)) {
|
|
63905
|
+
rememberSecret(loaded2.tokens.accessToken);
|
|
63843
63906
|
try {
|
|
63844
63907
|
const response = await inv.deps.fetch(`${target2.service}/v1/auth/logout`, {
|
|
63845
63908
|
method: "POST",
|
|
63846
|
-
headers: { authorization: `Bearer ${
|
|
63909
|
+
headers: { authorization: `Bearer ${loaded2.tokens.accessToken}`, accept: "application/json" },
|
|
63847
63910
|
signal: AbortSignal.timeout(LOGOUT_TIMEOUT_MS)
|
|
63848
63911
|
});
|
|
63849
63912
|
revoked = response.ok || response.status === 401 ? "server" : "unreachable";
|
|
@@ -63854,8 +63917,8 @@ var authLogoutCommand = defineCommand({
|
|
|
63854
63917
|
await deleteTokens(inv.deps, target2.storeKey);
|
|
63855
63918
|
if (revoked === "unreachable") warn(inv.deps, "The service could not be reached, so the session may stay valid there until it expires.");
|
|
63856
63919
|
if (tokenEnvSet) warn(inv.deps, "HARNESS_TOKEN is still set in this environment.");
|
|
63857
|
-
say(inv.deps,
|
|
63858
|
-
return { data: { signedOut:
|
|
63920
|
+
say(inv.deps, loaded2 === null ? "Nothing was stored; you were not signed in from this machine." : "Signed out.");
|
|
63921
|
+
return { data: { signedOut: loaded2 !== null, revoked, service: target2.service, tokenEnvSet, next: "overlane auth login" } };
|
|
63859
63922
|
}
|
|
63860
63923
|
});
|
|
63861
63924
|
var authTokenCommand = defineCommand({
|
|
@@ -67160,12 +67223,12 @@ init_zod();
|
|
|
67160
67223
|
init_src();
|
|
67161
67224
|
import { existsSync as existsSync5, lstatSync as lstatSync2, mkdirSync as mkdirSync8, readFileSync as readFileSync12, renameSync as renameSync5, writeFileSync as writeFileSync7 } from "node:fs";
|
|
67162
67225
|
import { dirname as dirname8, join as join21 } from "node:path";
|
|
67163
|
-
function readIfRegular(root,
|
|
67164
|
-
const full = join21(root,
|
|
67226
|
+
function readIfRegular(root, relative6, unsafe) {
|
|
67227
|
+
const full = join21(root, relative6);
|
|
67165
67228
|
if (!existsSync5(full) && !isLink(full)) return null;
|
|
67166
67229
|
const stat = lstatSync2(full);
|
|
67167
67230
|
if (stat.isSymbolicLink() || !stat.isFile()) {
|
|
67168
|
-
unsafe.push(
|
|
67231
|
+
unsafe.push(relative6);
|
|
67169
67232
|
return null;
|
|
67170
67233
|
}
|
|
67171
67234
|
return readFileSync12(full, "utf8");
|
|
@@ -71477,6 +71540,1420 @@ var observeCommands = [
|
|
|
71477
71540
|
observeRetentionPurgeCommand
|
|
71478
71541
|
];
|
|
71479
71542
|
|
|
71543
|
+
// ../cli/src/commands/code.ts
|
|
71544
|
+
init_src();
|
|
71545
|
+
init_zod();
|
|
71546
|
+
|
|
71547
|
+
// ../cli/src/token/brief.ts
|
|
71548
|
+
import { existsSync as existsSync9, readFileSync as readFileSync15 } from "node:fs";
|
|
71549
|
+
import { join as join26 } from "node:path";
|
|
71550
|
+
|
|
71551
|
+
// ../cli/src/token/ctx.ts
|
|
71552
|
+
import { execFile } from "node:child_process";
|
|
71553
|
+
import { existsSync as existsSync8 } from "node:fs";
|
|
71554
|
+
import { dirname as dirname10, join as join25, relative as relative2, resolve as resolve14 } from "node:path";
|
|
71555
|
+
var CoreError = class extends Error {
|
|
71556
|
+
exit;
|
|
71557
|
+
hint;
|
|
71558
|
+
code;
|
|
71559
|
+
constructor(message, options = {}) {
|
|
71560
|
+
super(message);
|
|
71561
|
+
this.exit = options.exit ?? 1;
|
|
71562
|
+
this.hint = options.hint;
|
|
71563
|
+
this.code = options.code ?? "failure";
|
|
71564
|
+
}
|
|
71565
|
+
};
|
|
71566
|
+
function nodeCtx(cwd, env = process.env, now = Date.now) {
|
|
71567
|
+
return {
|
|
71568
|
+
cwd,
|
|
71569
|
+
env,
|
|
71570
|
+
now,
|
|
71571
|
+
git: (args2, dir) => new Promise((done) => {
|
|
71572
|
+
execFile("git", [...args2], { cwd: dir ?? cwd, encoding: "utf8", maxBuffer: 64 * 1024 * 1024, env: { ...env } }, (error62, stdout, stderr) => {
|
|
71573
|
+
if (error62 === null) done({ code: 0, stdout, stderr });
|
|
71574
|
+
else done({ code: typeof error62.code === "number" ? error62.code : 127, stdout: stdout ?? "", stderr: stderr ?? error62.message });
|
|
71575
|
+
});
|
|
71576
|
+
})
|
|
71577
|
+
};
|
|
71578
|
+
}
|
|
71579
|
+
function findRoot(cwd) {
|
|
71580
|
+
let dir = resolve14(cwd);
|
|
71581
|
+
for (; ; ) {
|
|
71582
|
+
if (existsSync8(join25(dir, ".git")) || existsSync8(join25(dir, ".harness"))) return dir;
|
|
71583
|
+
const up = dirname10(dir);
|
|
71584
|
+
if (up === dir) return resolve14(cwd);
|
|
71585
|
+
dir = up;
|
|
71586
|
+
}
|
|
71587
|
+
}
|
|
71588
|
+
function shortPath(cwd, path) {
|
|
71589
|
+
const rel = relative2(cwd, path);
|
|
71590
|
+
return rel === "" || rel.startsWith("..") ? path : rel;
|
|
71591
|
+
}
|
|
71592
|
+
var sha7 = (sha) => sha.slice(0, 7);
|
|
71593
|
+
function clip(text, max) {
|
|
71594
|
+
const one = text.replace(/\s+/g, " ").trim();
|
|
71595
|
+
return one.length <= max ? one : `${one.slice(0, max - 1)}\u2026`;
|
|
71596
|
+
}
|
|
71597
|
+
|
|
71598
|
+
// ../cli/src/token/brief.ts
|
|
71599
|
+
var MAX_TASKS = 15;
|
|
71600
|
+
function parseGitBrief(status, subject) {
|
|
71601
|
+
let sha = "";
|
|
71602
|
+
let branch = "";
|
|
71603
|
+
let upstream = null;
|
|
71604
|
+
let ahead = 0;
|
|
71605
|
+
let behind = 0;
|
|
71606
|
+
let dirty2 = 0;
|
|
71607
|
+
for (const line3 of status.split("\n")) {
|
|
71608
|
+
if (line3.startsWith("# branch.oid ")) sha = line3.slice(13).trim();
|
|
71609
|
+
else if (line3.startsWith("# branch.head ")) branch = line3.slice(14).trim();
|
|
71610
|
+
else if (line3.startsWith("# branch.upstream ")) upstream = line3.slice(18).trim();
|
|
71611
|
+
else if (line3.startsWith("# branch.ab ")) {
|
|
71612
|
+
const m = line3.match(/\+(\d+) -(\d+)/);
|
|
71613
|
+
ahead = Number(m?.[1] ?? 0);
|
|
71614
|
+
behind = Number(m?.[2] ?? 0);
|
|
71615
|
+
} else if (line3 !== "" && !line3.startsWith("#")) dirty2 += 1;
|
|
71616
|
+
}
|
|
71617
|
+
if (sha === "") return null;
|
|
71618
|
+
return { branch: branch === "(detached)" ? "detached" : branch, sha: sha === "(initial)" ? "initial" : sha7(sha), upstream, ahead, behind, dirty: dirty2, subject: clip(subject, 100) };
|
|
71619
|
+
}
|
|
71620
|
+
function formatGitBrief(b) {
|
|
71621
|
+
const where2 = b.upstream === null ? "no upstream" : `ahead ${b.ahead} behind ${b.behind} of ${b.upstream}`;
|
|
71622
|
+
return `${b.branch} ${b.sha} ${where2}, ${b.dirty} dirty, last: ${b.subject === "" ? "(no commits)" : b.subject}`;
|
|
71623
|
+
}
|
|
71624
|
+
function openP0Lines(text) {
|
|
71625
|
+
return text.split("\n").filter((line3) => /^\s*- \[ \]\s+P0\b/.test(line3)).map((line3) => clip(line3.trim(), 160));
|
|
71626
|
+
}
|
|
71627
|
+
async function brief(ctx, input2) {
|
|
71628
|
+
const mode = input2.mode ?? "all";
|
|
71629
|
+
const root = findRoot(ctx.cwd);
|
|
71630
|
+
const data = {};
|
|
71631
|
+
const lines = [];
|
|
71632
|
+
if (mode === "git" || mode === "all") {
|
|
71633
|
+
const [status, log] = await Promise.all([ctx.git(["status", "--porcelain=v2", "--branch"], ctx.cwd), ctx.git(["log", "-1", "--format=%s"], ctx.cwd)]);
|
|
71634
|
+
const parsed = status.code === 0 ? parseGitBrief(status.stdout, log.code === 0 ? log.stdout.trim() : "") : null;
|
|
71635
|
+
data.git = parsed;
|
|
71636
|
+
lines.push(parsed === null ? "not a git repository" : formatGitBrief(parsed));
|
|
71637
|
+
}
|
|
71638
|
+
if (mode === "tasks" || mode === "all") {
|
|
71639
|
+
const file2 = join26(root, "TASKS.md");
|
|
71640
|
+
if (existsSync9(file2)) {
|
|
71641
|
+
const open2 = openP0Lines(readFileSync15(file2, "utf8"));
|
|
71642
|
+
data.tasks = { source: "TASKS.md", open: open2.slice(0, MAX_TASKS), more: Math.max(0, open2.length - MAX_TASKS) };
|
|
71643
|
+
lines.push(...open2.length === 0 ? ["no open P0 lines in TASKS.md"] : [`${open2.length} open P0:`, ...data.tasks.open], ...data.tasks.more > 0 ? [`+${data.tasks.more} more in TASKS.md`] : []);
|
|
71644
|
+
} else {
|
|
71645
|
+
data.tasks = { source: "none", open: [], more: 0 };
|
|
71646
|
+
lines.push("no TASKS.md here; for a connected project run: overlane task status");
|
|
71647
|
+
}
|
|
71648
|
+
}
|
|
71649
|
+
return { data, lines, exit: 0 };
|
|
71650
|
+
}
|
|
71651
|
+
|
|
71652
|
+
// ../cli/src/token/code.ts
|
|
71653
|
+
import { existsSync as existsSync11, readFileSync as readFileSync17, statSync as statSync2 } from "node:fs";
|
|
71654
|
+
import { join as join28, relative as relative3, resolve as resolve15 } from "node:path";
|
|
71655
|
+
|
|
71656
|
+
// ../cli/src/token/index-file.ts
|
|
71657
|
+
import { existsSync as existsSync10, readFileSync as readFileSync16 } from "node:fs";
|
|
71658
|
+
import { join as join27 } from "node:path";
|
|
71659
|
+
var INDEX_PATH = ".harness/code-index.json";
|
|
71660
|
+
var BUILD_INDEX_COMMAND = "node packages/index-builder/dist/mvrx-index.mjs map --root .";
|
|
71661
|
+
var LoadedIndex = class {
|
|
71662
|
+
constructor(sha, fileCount, uncovered, builtAt, rows, edges) {
|
|
71663
|
+
this.sha = sha;
|
|
71664
|
+
this.fileCount = fileCount;
|
|
71665
|
+
this.uncovered = uncovered;
|
|
71666
|
+
this.builtAt = builtAt;
|
|
71667
|
+
this.rows = rows;
|
|
71668
|
+
this.edges = edges;
|
|
71669
|
+
}
|
|
71670
|
+
sha;
|
|
71671
|
+
fileCount;
|
|
71672
|
+
uncovered;
|
|
71673
|
+
builtAt;
|
|
71674
|
+
rows;
|
|
71675
|
+
edges;
|
|
71676
|
+
cache = /* @__PURE__ */ new Map();
|
|
71677
|
+
files = /* @__PURE__ */ new Map();
|
|
71678
|
+
callerMap;
|
|
71679
|
+
get count() {
|
|
71680
|
+
return this.rows.length;
|
|
71681
|
+
}
|
|
71682
|
+
/** The symbol at a position (call edges and parents refer to positions). */
|
|
71683
|
+
symbol(i2) {
|
|
71684
|
+
const hit = this.cache.get(i2);
|
|
71685
|
+
if (hit !== void 0) return hit;
|
|
71686
|
+
const r = this.rows[i2];
|
|
71687
|
+
if (r === void 0) return void 0;
|
|
71688
|
+
const symbol2 = { i: i2, name: r[0], qualified: r[1], kind: r[2], path: r[3], line: r[4], parent: typeof r[5] === "number" ? r[5] : -1 };
|
|
71689
|
+
this.cache.set(i2, symbol2);
|
|
71690
|
+
return symbol2;
|
|
71691
|
+
}
|
|
71692
|
+
/** Every symbol whose row passes the test, in index order. */
|
|
71693
|
+
where(test) {
|
|
71694
|
+
const out2 = [];
|
|
71695
|
+
for (let i2 = 0; i2 < this.rows.length; i2 += 1) {
|
|
71696
|
+
const r = this.rows[i2];
|
|
71697
|
+
if (test(r[0], r[1], r)) out2.push(this.symbol(i2));
|
|
71698
|
+
}
|
|
71699
|
+
return out2;
|
|
71700
|
+
}
|
|
71701
|
+
named(name2) {
|
|
71702
|
+
return this.where((n) => n === name2);
|
|
71703
|
+
}
|
|
71704
|
+
/** Symbols of one file, sorted by line. */
|
|
71705
|
+
inFile(path) {
|
|
71706
|
+
let list2 = this.files.get(path);
|
|
71707
|
+
if (list2 === void 0) {
|
|
71708
|
+
list2 = this.where((_n, _q, r) => r[3] === path).sort((a, b) => a.line - b.line || a.i - b.i);
|
|
71709
|
+
this.files.set(path, list2);
|
|
71710
|
+
}
|
|
71711
|
+
return list2;
|
|
71712
|
+
}
|
|
71713
|
+
/** Positions of the symbols that call the one at `i`. */
|
|
71714
|
+
callersOf(i2) {
|
|
71715
|
+
if (this.callerMap === void 0) {
|
|
71716
|
+
const map2 = /* @__PURE__ */ new Map();
|
|
71717
|
+
for (const edge of this.edges) {
|
|
71718
|
+
const [from, ...to] = edge;
|
|
71719
|
+
if (from === void 0) continue;
|
|
71720
|
+
for (const target2 of to) {
|
|
71721
|
+
const list2 = map2.get(target2);
|
|
71722
|
+
if (list2 === void 0) map2.set(target2, [from]);
|
|
71723
|
+
else list2.push(from);
|
|
71724
|
+
}
|
|
71725
|
+
}
|
|
71726
|
+
this.callerMap = map2;
|
|
71727
|
+
}
|
|
71728
|
+
return this.callerMap.get(i2) ?? [];
|
|
71729
|
+
}
|
|
71730
|
+
};
|
|
71731
|
+
function parseIndex(text) {
|
|
71732
|
+
let raw;
|
|
71733
|
+
try {
|
|
71734
|
+
const cut = text.lastIndexOf(',"words":[');
|
|
71735
|
+
raw = JSON.parse(cut > 0 ? `${text.slice(0, cut)}}}` : text);
|
|
71736
|
+
} catch {
|
|
71737
|
+
try {
|
|
71738
|
+
raw = JSON.parse(text);
|
|
71739
|
+
} catch {
|
|
71740
|
+
return null;
|
|
71741
|
+
}
|
|
71742
|
+
}
|
|
71743
|
+
const rows = raw.index?.symbols;
|
|
71744
|
+
const sha = raw.revision?.commitSha;
|
|
71745
|
+
if (raw.schemaVersion !== "1" || !Array.isArray(rows) || typeof sha !== "string") return null;
|
|
71746
|
+
return new LoadedIndex(sha, raw.index?.files ?? 0, raw.uncovered ?? 0, raw.builtAt ?? "", rows, raw.index?.callees ?? []);
|
|
71747
|
+
}
|
|
71748
|
+
var loaded = /* @__PURE__ */ new WeakMap();
|
|
71749
|
+
function loadFreshIndex(ctx, root) {
|
|
71750
|
+
let pending = loaded.get(ctx);
|
|
71751
|
+
if (pending === void 0) {
|
|
71752
|
+
pending = loadFreshIndexUncached(ctx, root);
|
|
71753
|
+
loaded.set(ctx, pending);
|
|
71754
|
+
}
|
|
71755
|
+
return pending;
|
|
71756
|
+
}
|
|
71757
|
+
async function loadFreshIndexUncached(ctx, root) {
|
|
71758
|
+
const file2 = join27(root, INDEX_PATH);
|
|
71759
|
+
if (!existsSync10(file2)) return { state: "missing" };
|
|
71760
|
+
let text;
|
|
71761
|
+
try {
|
|
71762
|
+
text = readFileSync16(file2, "utf8");
|
|
71763
|
+
} catch {
|
|
71764
|
+
return { state: "missing" };
|
|
71765
|
+
}
|
|
71766
|
+
const index = parseIndex(text);
|
|
71767
|
+
if (index === null) return { state: "unusable", reason: "the index file is not a version 1 code index" };
|
|
71768
|
+
const [diff, untracked, head, count] = await Promise.all([
|
|
71769
|
+
ctx.git(["diff", "--name-only", index.sha], root),
|
|
71770
|
+
ctx.git(["ls-files", "--others", "--exclude-standard"], root),
|
|
71771
|
+
ctx.git(["rev-parse", "HEAD"], root),
|
|
71772
|
+
ctx.git(["rev-list", "--count", `${index.sha}..HEAD`], root)
|
|
71773
|
+
]);
|
|
71774
|
+
if (diff.code !== 0) return { state: "unusable", reason: `the index was built at ${index.sha.slice(0, 7)}, which this checkout does not have` };
|
|
71775
|
+
const changed = new Set([...diff.stdout.split("\n"), ...untracked.code === 0 ? untracked.stdout.split("\n") : []].filter((p2) => p2 !== "" && !p2.startsWith(".harness/")));
|
|
71776
|
+
return { state: "ready", index, headSha: head.code === 0 ? head.stdout.trim() : "", behind: count.code === 0 ? Number.parseInt(count.stdout.trim(), 10) || 0 : 0, changed };
|
|
71777
|
+
}
|
|
71778
|
+
|
|
71779
|
+
// ../cli/src/token/span.ts
|
|
71780
|
+
function nextSiblingLine(index, symbol2) {
|
|
71781
|
+
const list2 = index.inFile(symbol2.path);
|
|
71782
|
+
const inside = (candidate) => {
|
|
71783
|
+
let parent = candidate.parent;
|
|
71784
|
+
for (let hops = 0; parent >= 0 && hops < 64; hops += 1) {
|
|
71785
|
+
if (parent === symbol2.i) return true;
|
|
71786
|
+
parent = index.symbol(parent)?.parent ?? -1;
|
|
71787
|
+
}
|
|
71788
|
+
return false;
|
|
71789
|
+
};
|
|
71790
|
+
for (const candidate of list2) if (candidate.line > symbol2.line && !inside(candidate)) return candidate.line;
|
|
71791
|
+
return void 0;
|
|
71792
|
+
}
|
|
71793
|
+
var COMMENT_LINE = /^\s*(?:\/\/|\/\*|\*|#(?!\[)|--\s|"""|''')/;
|
|
71794
|
+
function trimBefore(lines, start2, nextStart) {
|
|
71795
|
+
let end = nextStart === void 0 ? lines.length : Math.min(nextStart - 1, lines.length);
|
|
71796
|
+
while (end > start2 && (lines[end - 1] ?? "").trim() === "") end -= 1;
|
|
71797
|
+
if (nextStart !== void 0) {
|
|
71798
|
+
let probe = end;
|
|
71799
|
+
while (probe > start2 && COMMENT_LINE.test(lines[probe - 1] ?? "")) probe -= 1;
|
|
71800
|
+
if (probe < end) end = probe;
|
|
71801
|
+
while (end > start2 && (lines[end - 1] ?? "").trim() === "") end -= 1;
|
|
71802
|
+
}
|
|
71803
|
+
return Math.max(start2, end);
|
|
71804
|
+
}
|
|
71805
|
+
var OPEN = /* @__PURE__ */ new Set(["{", "(", "["]);
|
|
71806
|
+
var CLOSE = /* @__PURE__ */ new Set(["}", ")", "]"]);
|
|
71807
|
+
function braceEnd(lines, start2, limit = lines.length) {
|
|
71808
|
+
let depth = 0;
|
|
71809
|
+
let opened = false;
|
|
71810
|
+
let block2 = false;
|
|
71811
|
+
let quote4 = "";
|
|
71812
|
+
const stop3 = Math.min(limit, lines.length);
|
|
71813
|
+
for (let n = start2; n <= stop3; n += 1) {
|
|
71814
|
+
const text = lines[n - 1] ?? "";
|
|
71815
|
+
let lastCode = "";
|
|
71816
|
+
for (let i2 = 0; i2 < text.length; i2 += 1) {
|
|
71817
|
+
const c2 = text[i2];
|
|
71818
|
+
const two = text.slice(i2, i2 + 2);
|
|
71819
|
+
if (block2) {
|
|
71820
|
+
if (two === "*/") {
|
|
71821
|
+
block2 = false;
|
|
71822
|
+
i2 += 1;
|
|
71823
|
+
}
|
|
71824
|
+
continue;
|
|
71825
|
+
}
|
|
71826
|
+
if (quote4 !== "") {
|
|
71827
|
+
if (c2 === "\\") i2 += 1;
|
|
71828
|
+
else if (c2 === quote4) quote4 = "";
|
|
71829
|
+
continue;
|
|
71830
|
+
}
|
|
71831
|
+
if (two === "//") break;
|
|
71832
|
+
if (two === "/*") {
|
|
71833
|
+
block2 = true;
|
|
71834
|
+
i2 += 1;
|
|
71835
|
+
continue;
|
|
71836
|
+
}
|
|
71837
|
+
if (c2 === '"' || c2 === "'" || c2 === "`") {
|
|
71838
|
+
quote4 = c2;
|
|
71839
|
+
lastCode = c2;
|
|
71840
|
+
continue;
|
|
71841
|
+
}
|
|
71842
|
+
if (OPEN.has(c2)) {
|
|
71843
|
+
depth += 1;
|
|
71844
|
+
opened = true;
|
|
71845
|
+
} else if (CLOSE.has(c2)) depth -= 1;
|
|
71846
|
+
if (c2.trim() !== "") lastCode = c2;
|
|
71847
|
+
}
|
|
71848
|
+
if (quote4 === '"' || quote4 === "'") quote4 = "";
|
|
71849
|
+
if (depth <= 0 && quote4 === "" && !block2) {
|
|
71850
|
+
const t2 = text.trim();
|
|
71851
|
+
if (opened || depth < 0) return n;
|
|
71852
|
+
if (t2 !== "" && !/[=,(&|?:+\-*/<>]$/.test(t2) && lastCode !== "" && !/^\s*(?:@|\/\/)/.test(text)) {
|
|
71853
|
+
const nextText = (lines[n] ?? "").trim();
|
|
71854
|
+
if (!/^[|&?:.]/.test(nextText) && !/^extends\b|^implements\b/.test(nextText)) return n;
|
|
71855
|
+
}
|
|
71856
|
+
}
|
|
71857
|
+
}
|
|
71858
|
+
return null;
|
|
71859
|
+
}
|
|
71860
|
+
function indentEnd(lines, start2) {
|
|
71861
|
+
const base5 = (lines[start2 - 1] ?? "").match(/^\s*/)?.[0].length ?? 0;
|
|
71862
|
+
let end = start2;
|
|
71863
|
+
for (let n = start2 + 1; n <= lines.length; n += 1) {
|
|
71864
|
+
const text = lines[n - 1] ?? "";
|
|
71865
|
+
if (text.trim() === "") continue;
|
|
71866
|
+
const indent = text.match(/^\s*/)?.[0].length ?? 0;
|
|
71867
|
+
if (indent <= base5 && !/^\s*[)\]}]/.test(text)) break;
|
|
71868
|
+
end = n;
|
|
71869
|
+
}
|
|
71870
|
+
return end;
|
|
71871
|
+
}
|
|
71872
|
+
function spanEnd(lines, start2, path, nextStart) {
|
|
71873
|
+
const upper = trimBefore(lines, start2, nextStart);
|
|
71874
|
+
const scanned = /\.(?:py|rb)$/.test(path) ? indentEnd(lines, start2) : braceEnd(lines, start2, nextStart === void 0 ? lines.length : Math.max(start2, nextStart - 1));
|
|
71875
|
+
return scanned !== null && scanned <= upper ? scanned : upper;
|
|
71876
|
+
}
|
|
71877
|
+
|
|
71878
|
+
// ../cli/src/token/code.ts
|
|
71879
|
+
var DEFAULT_FIND_LIMIT = 20;
|
|
71880
|
+
var DEFAULT_REFS_LIMIT = 30;
|
|
71881
|
+
var SHOW_CAP = 200;
|
|
71882
|
+
var GREP_LIMIT = 20;
|
|
71883
|
+
var SOURCE_FILE = /\.(?:[cm]?[jt]sx?|py|go|rs|java|rb|php|cs|kt|swift|astro|vue|svelte)$/;
|
|
71884
|
+
var DEF_WORDS = "function\\*?|class|interface|type|enum|const|let|var|def|fn|func|struct|trait|namespace|abstract class";
|
|
71885
|
+
var KIND_RANK = { function: 0, class: 1, interface: 2, type: 3, constant: 4, method: 5, variable: 6, namespace: 7, property: 9 };
|
|
71886
|
+
var GREP_EXCLUDES = [":(exclude)pnpm-lock.yaml", ":(exclude)*.lock", ":(exclude)evals/results"];
|
|
71887
|
+
var escapeRegex2 = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
71888
|
+
var isTestPath = (path) => /(?:^|\/)(?:tests?|__tests__|fixtures)\/|\.(?:test|spec)\.[a-z]+$/.test(path);
|
|
71889
|
+
function readLines(root, path) {
|
|
71890
|
+
try {
|
|
71891
|
+
const file2 = join28(root, path);
|
|
71892
|
+
if (statSync2(file2).size > 4 * 1024 * 1024) return null;
|
|
71893
|
+
return readFileSync17(file2, "utf8").split("\n");
|
|
71894
|
+
} catch {
|
|
71895
|
+
return null;
|
|
71896
|
+
}
|
|
71897
|
+
}
|
|
71898
|
+
function hitOf(symbol2) {
|
|
71899
|
+
return { kind: symbol2.kind, qualified: symbol2.qualified, path: symbol2.path, line: symbol2.line };
|
|
71900
|
+
}
|
|
71901
|
+
function rankHit(a, b) {
|
|
71902
|
+
return (KIND_RANK[a.kind] ?? 8) - (KIND_RANK[b.kind] ?? 8) || Number(isTestPath(a.path)) - Number(isTestPath(b.path)) || a.path.length - b.path.length || a.path.localeCompare(b.path) || a.line - b.line;
|
|
71903
|
+
}
|
|
71904
|
+
async function gitGrep(ctx, root, pattern, limit, extra = []) {
|
|
71905
|
+
const result = await ctx.git(["grep", "-n", "-w", "-I", "-F", "--no-color", ...extra, "-e", pattern, "--", ".", ...GREP_EXCLUDES], root);
|
|
71906
|
+
if (result.code > 1) return { hits: [], more: false, failed: true };
|
|
71907
|
+
const hits = [];
|
|
71908
|
+
let more = false;
|
|
71909
|
+
for (const raw of result.stdout.split("\n")) {
|
|
71910
|
+
const m = raw.match(/^(.*?):(\d+):(.*)$/);
|
|
71911
|
+
if (m === null) continue;
|
|
71912
|
+
if (hits.length >= limit) {
|
|
71913
|
+
more = true;
|
|
71914
|
+
break;
|
|
71915
|
+
}
|
|
71916
|
+
hits.push({ path: m[1], line: Number(m[2]), text: clip(m[3], 110) });
|
|
71917
|
+
}
|
|
71918
|
+
return { hits, more, failed: false };
|
|
71919
|
+
}
|
|
71920
|
+
function definitionRegex(name2) {
|
|
71921
|
+
const n = escapeRegex2(name2);
|
|
71922
|
+
return new RegExp(`^\\s*(?:export\\s+)?(?:default\\s+)?(?:declare\\s+)?(?:async\\s+)?(?:${DEF_WORDS})\\s+${n}(?![A-Za-z0-9_$])`);
|
|
71923
|
+
}
|
|
71924
|
+
var KIND_OF_WORD = { function: "function", class: "class", interface: "interface", type: "type", enum: "type", const: "constant", let: "variable", var: "variable", def: "function", fn: "function", func: "function", struct: "class", trait: "interface", namespace: "namespace" };
|
|
71925
|
+
function scanForDefinitions(root, files, name2) {
|
|
71926
|
+
const regex = definitionRegex(name2);
|
|
71927
|
+
const hits = [];
|
|
71928
|
+
for (const path of files) {
|
|
71929
|
+
if (!SOURCE_FILE.test(path)) continue;
|
|
71930
|
+
const lines = readLines(root, path);
|
|
71931
|
+
if (lines === null) continue;
|
|
71932
|
+
lines.forEach((text, i2) => {
|
|
71933
|
+
const m = text.match(regex);
|
|
71934
|
+
if (m === null) return;
|
|
71935
|
+
const word = (text.match(new RegExp(`(?:${DEF_WORDS})(?=\\s+${escapeRegex2(name2)})`))?.[0] ?? "const").replace("abstract ", "").replace("*", "");
|
|
71936
|
+
hits.push({ kind: KIND_OF_WORD[word] ?? "constant", qualified: name2, path, line: i2 + 1 });
|
|
71937
|
+
});
|
|
71938
|
+
}
|
|
71939
|
+
return hits;
|
|
71940
|
+
}
|
|
71941
|
+
function indexProblem(fresh) {
|
|
71942
|
+
if (fresh.state === "missing") return `no code index at .harness/code-index.json; build it with: ${BUILD_INDEX_COMMAND}`;
|
|
71943
|
+
if (fresh.state === "unusable") return `code index unusable (${fresh.reason}); rebuild with: ${BUILD_INDEX_COMMAND}`;
|
|
71944
|
+
return "";
|
|
71945
|
+
}
|
|
71946
|
+
function staleNote(fresh, scanned) {
|
|
71947
|
+
return `index ${sha7(fresh.index.sha)} is ${fresh.behind} commit${fresh.behind === 1 ? "" : "s"} behind HEAD; ${scanned} changed file${scanned === 1 ? "" : "s"} matched by pattern, not index`;
|
|
71948
|
+
}
|
|
71949
|
+
function matchName(index, name2) {
|
|
71950
|
+
const exactSet = name2.includes(".") ? index.where((_n, q) => q === name2 || q.endsWith(`.${name2}`)) : index.named(name2);
|
|
71951
|
+
if (exactSet.length > 0) return { exact: exactSet, near: [] };
|
|
71952
|
+
const lower = name2.toLowerCase();
|
|
71953
|
+
const ci = index.where((n, q) => n.toLowerCase() === lower || q.toLowerCase() === lower);
|
|
71954
|
+
if (ci.length > 0) return { exact: ci, near: [] };
|
|
71955
|
+
const near = lower.length >= 3 ? index.where((n) => n.toLowerCase().includes(lower)) : [];
|
|
71956
|
+
return { exact: [], near };
|
|
71957
|
+
}
|
|
71958
|
+
async function definitionsOf(ctx, root, name2, kind) {
|
|
71959
|
+
const fresh = await loadFreshIndex(ctx, root);
|
|
71960
|
+
if (fresh.state !== "ready") return { hits: [], symbols: [], fresh, notes: [indexProblem(fresh)], approximate: false };
|
|
71961
|
+
const { index, changed } = fresh;
|
|
71962
|
+
const { exact, near } = matchName(index, name2);
|
|
71963
|
+
const chosen = (exact.length > 0 ? exact : near).filter((s) => kind === void 0 || s.kind === kind);
|
|
71964
|
+
const trusted = chosen.filter((s) => !changed.has(s.path));
|
|
71965
|
+
const dropped = chosen.length - trusted.length;
|
|
71966
|
+
const changedList = [...changed].slice(0, 400);
|
|
71967
|
+
const scanned = changedList.length > 0 ? scanForDefinitions(root, changedList, name2).filter((h) => kind === void 0 || h.kind === kind) : [];
|
|
71968
|
+
const notes = [];
|
|
71969
|
+
if (dropped > 0 || scanned.length > 0) notes.push(staleNote(fresh, (/* @__PURE__ */ new Set([...scanned.map((h) => h.path), ...chosen.filter((s) => changed.has(s.path)).map((s) => s.path)])).size));
|
|
71970
|
+
if (exact.length === 0 && near.length > 0 && trusted.length > 0) notes.push(`no exact match for ${name2}; ${trusted.length} near match${trusted.length === 1 ? "" : "es"}`);
|
|
71971
|
+
const hits = [...trusted.map(hitOf), ...scanned].sort(rankHit);
|
|
71972
|
+
return { hits, symbols: trusted, fresh, notes, approximate: exact.length === 0 };
|
|
71973
|
+
}
|
|
71974
|
+
async function findCore(ctx, input2) {
|
|
71975
|
+
const root = findRoot(ctx.cwd);
|
|
71976
|
+
const limit = Math.max(1, input2.limit ?? DEFAULT_FIND_LIMIT);
|
|
71977
|
+
const defs = await definitionsOf(ctx, root, input2.name, input2.kind);
|
|
71978
|
+
if (defs.fresh.state !== "ready") {
|
|
71979
|
+
const grep = await gitGrep(ctx, root, input2.name, Math.min(limit, GREP_LIMIT));
|
|
71980
|
+
const notice2 = defs.notes[0] ?? "";
|
|
71981
|
+
const lines2 = [notice2, ...grep.hits.map((h) => `${h.path}:${h.line} ${h.text}`), ...grep.more ? [`more matches exist: narrow with overlane code find <name> --kind K or build the index`] : []];
|
|
71982
|
+
if (grep.hits.length === 0) return { data: { source: "search", matches: [], lines: [], more: false, notice: notice2 }, lines: [notice2, `none: no literal match for ${input2.name}`], exit: 4 };
|
|
71983
|
+
return { data: { source: "search", matches: [], lines: grep.hits, more: grep.more, notice: notice2 }, lines: lines2, exit: 0 };
|
|
71984
|
+
}
|
|
71985
|
+
const matches = defs.hits.slice(0, limit);
|
|
71986
|
+
const more = defs.hits.length > limit;
|
|
71987
|
+
const notice = defs.notes.join("; ");
|
|
71988
|
+
if (defs.hits.length === 0) {
|
|
71989
|
+
const grep = await gitGrep(ctx, root, input2.name, 5);
|
|
71990
|
+
const tail = grep.hits.length === 0 ? [] : [`no definition in the index; literal matches:`, ...grep.hits.map((h) => `${h.path}:${h.line} ${h.text}`)];
|
|
71991
|
+
return { data: { source: "index", matches: [], lines: grep.hits, more: false, notice }, lines: [...defs.notes, `none: no definition of ${input2.name}${input2.kind === void 0 ? "" : ` (kind ${input2.kind})`}`, ...tail], exit: 4 };
|
|
71992
|
+
}
|
|
71993
|
+
const lines = [...defs.notes, ...matches.map((h) => `${h.kind} ${h.qualified} ${h.path}:${h.line}`), ...more ? [`+${defs.hits.length - limit} more: overlane code find ${input2.name} --limit ${defs.hits.length}`] : []];
|
|
71994
|
+
return { data: { source: "index", matches, more, ...notice === "" ? {} : { notice } }, lines, exit: 0 };
|
|
71995
|
+
}
|
|
71996
|
+
var PATH_LINE = /^(.+):(\d+)$/;
|
|
71997
|
+
function numbered(lines, from, to) {
|
|
71998
|
+
const out2 = [];
|
|
71999
|
+
for (let n = from; n <= to; n += 1) out2.push(`${n} ${lines[n - 1] ?? ""}`);
|
|
72000
|
+
return out2;
|
|
72001
|
+
}
|
|
72002
|
+
function resolveFile(ctx, root, path) {
|
|
72003
|
+
for (const base5 of [root, ctx.cwd]) {
|
|
72004
|
+
const full = resolve15(base5, path);
|
|
72005
|
+
if (existsSync11(full) && statSync2(full).isFile()) return relative3(root, full);
|
|
72006
|
+
}
|
|
72007
|
+
return null;
|
|
72008
|
+
}
|
|
72009
|
+
function symbolAt(index, root, path, line3, lines) {
|
|
72010
|
+
const list2 = index.inFile(path).filter((s) => s.line <= line3);
|
|
72011
|
+
for (let k = list2.length - 1; k >= 0; k -= 1) {
|
|
72012
|
+
const symbol2 = list2[k];
|
|
72013
|
+
if (symbol2.kind === "property" && symbol2.line !== line3) continue;
|
|
72014
|
+
const end = spanEnd(lines, symbol2.line, path, nextSiblingLine(index, symbol2));
|
|
72015
|
+
if (end >= line3) return symbol2;
|
|
72016
|
+
}
|
|
72017
|
+
return void 0;
|
|
72018
|
+
}
|
|
72019
|
+
async function showCore(ctx, input2) {
|
|
72020
|
+
const root = findRoot(ctx.cwd);
|
|
72021
|
+
const context4 = Math.max(0, input2.context ?? 0);
|
|
72022
|
+
const cap = Math.max(1, input2.max ?? SHOW_CAP);
|
|
72023
|
+
let path;
|
|
72024
|
+
let start2 = 0;
|
|
72025
|
+
let kind = "text";
|
|
72026
|
+
let qualified = "";
|
|
72027
|
+
let also = [];
|
|
72028
|
+
const notes = [];
|
|
72029
|
+
let lines = null;
|
|
72030
|
+
let symbol2;
|
|
72031
|
+
let fresh;
|
|
72032
|
+
let nextStart;
|
|
72033
|
+
const pl = input2.target.match(PATH_LINE);
|
|
72034
|
+
const asFile = pl === null ? null : resolveFile(ctx, root, pl[1]);
|
|
72035
|
+
if (pl !== null && asFile !== null) {
|
|
72036
|
+
path = asFile;
|
|
72037
|
+
const wanted = Number(pl[2]);
|
|
72038
|
+
lines = readLines(root, path);
|
|
72039
|
+
if (lines === null) throw new CoreError(`cannot read ${path}`, { exit: 1 });
|
|
72040
|
+
if (wanted < 1 || wanted > lines.length) throw new CoreError(`${path} has ${lines.length} lines; ${wanted} is out of range`, { exit: 2, code: "usage" });
|
|
72041
|
+
fresh = await loadFreshIndex(ctx, root);
|
|
72042
|
+
if (fresh.state === "ready" && !fresh.changed.has(path)) {
|
|
72043
|
+
symbol2 = symbolAt(fresh.index, root, path, wanted, lines);
|
|
72044
|
+
if (symbol2 !== void 0) {
|
|
72045
|
+
start2 = symbol2.line;
|
|
72046
|
+
kind = symbol2.kind;
|
|
72047
|
+
qualified = symbol2.qualified;
|
|
72048
|
+
nextStart = nextSiblingLine(fresh.index, symbol2);
|
|
72049
|
+
}
|
|
72050
|
+
}
|
|
72051
|
+
if (symbol2 === void 0) {
|
|
72052
|
+
const found = enclosingDeclaration(lines, wanted, path);
|
|
72053
|
+
if (found !== void 0) {
|
|
72054
|
+
start2 = found.start;
|
|
72055
|
+
kind = found.kind;
|
|
72056
|
+
qualified = found.name;
|
|
72057
|
+
} else {
|
|
72058
|
+
notes.push(`no symbol at ${path}:${wanted}; showing lines around it`);
|
|
72059
|
+
start2 = Math.max(1, wanted - 10);
|
|
72060
|
+
const end2 = Math.min(lines.length, wanted + 10);
|
|
72061
|
+
return finishShow(path, "text", "", start2, end2, lines, context4, input2.from, cap, [], notes);
|
|
72062
|
+
}
|
|
72063
|
+
}
|
|
72064
|
+
} else {
|
|
72065
|
+
const defs = await definitionsOf(ctx, root, input2.target, input2.kind);
|
|
72066
|
+
fresh = defs.fresh;
|
|
72067
|
+
let hits = defs.hits;
|
|
72068
|
+
if (hits.length === 0 && defs.fresh.state !== "ready") {
|
|
72069
|
+
const grep = await ctx.git(["grep", "-n", "-I", "-E", "--no-color", "-e", `(${DEF_WORDS.replaceAll("\\*?", "")})[[:space:]]+${input2.target}([^A-Za-z0-9_$]|$)`, "--", ".", ...GREP_EXCLUDES], root);
|
|
72070
|
+
hits = grep.stdout.split("\n").map((raw) => raw.match(/^(.*?):(\d+):/)).filter((m) => m !== null).slice(0, 8).map((m) => ({ kind: "text", qualified: input2.target, path: m[1], line: Number(m[2]) })).sort(rankHit);
|
|
72071
|
+
notes.push(indexProblem(defs.fresh));
|
|
72072
|
+
} else notes.push(...defs.notes);
|
|
72073
|
+
const first = hits[0];
|
|
72074
|
+
if (first === void 0) return { data: { path: "", kind: "", qualified: input2.target, start: 0, end: 0, from: 0, to: 0, truncated: false, remaining: 0, text: [], also: [] }, lines: [...notes.filter((n) => n !== ""), `none: no definition of ${input2.target}`], exit: 4 };
|
|
72075
|
+
path = first.path;
|
|
72076
|
+
start2 = first.line;
|
|
72077
|
+
kind = first.kind;
|
|
72078
|
+
qualified = first.qualified;
|
|
72079
|
+
also = hits.slice(1, 5);
|
|
72080
|
+
lines = readLines(root, path);
|
|
72081
|
+
if (lines === null) throw new CoreError(`cannot read ${path}`, { exit: 1 });
|
|
72082
|
+
symbol2 = defs.symbols.find((s) => s.path === first.path && s.line === first.line);
|
|
72083
|
+
if (symbol2 !== void 0 && defs.fresh.state === "ready") nextStart = nextSiblingLine(defs.fresh.index, symbol2);
|
|
72084
|
+
}
|
|
72085
|
+
const end = spanEnd(lines, start2, path, nextStart);
|
|
72086
|
+
return finishShow(path, kind, qualified, start2, end, lines, context4, input2.from, cap, also, notes);
|
|
72087
|
+
}
|
|
72088
|
+
function enclosingDeclaration(lines, line3, path) {
|
|
72089
|
+
const any2 = new RegExp(`^\\s{0,2}(?:export\\s+)?(?:default\\s+)?(?:declare\\s+)?(?:async\\s+)?(${DEF_WORDS})\\s+([A-Za-z_$][\\w$]*)`);
|
|
72090
|
+
for (let n = line3; n >= 1 && line3 - n < 400; n -= 1) {
|
|
72091
|
+
const m = (lines[n - 1] ?? "").match(any2);
|
|
72092
|
+
if (m === null) continue;
|
|
72093
|
+
const end = spanEnd(lines, n, path, void 0);
|
|
72094
|
+
if (end >= line3) return { start: n, kind: KIND_OF_WORD[m[1].replace("*", "")] ?? "constant", name: m[2] };
|
|
72095
|
+
}
|
|
72096
|
+
return void 0;
|
|
72097
|
+
}
|
|
72098
|
+
function finishShow(path, kind, qualified, start2, end, lines, context4, fromOpt, cap, also, notes) {
|
|
72099
|
+
const first = Math.max(1, start2 - context4);
|
|
72100
|
+
const last = Math.min(lines.length, end + context4);
|
|
72101
|
+
const from = Math.min(Math.max(fromOpt ?? first, first), last);
|
|
72102
|
+
const to = Math.min(last, from + cap - 1);
|
|
72103
|
+
const remaining = last - to;
|
|
72104
|
+
const body2 = numbered(lines, from, to);
|
|
72105
|
+
const header = `${path}:${start2}-${end} ${kind}${qualified === "" ? "" : ` ${qualified}`}`;
|
|
72106
|
+
const hint = remaining > 0 ? [`... truncated, ${remaining} more lines: overlane code show ${path}:${start2} --from ${to + 1}`] : [];
|
|
72107
|
+
const alsoLine = also.length > 0 ? [`also: ${also.map((h) => `${h.path}:${h.line}`).join(" ")}`] : [];
|
|
72108
|
+
const noticeText = notes.filter((n) => n !== "").join("; ");
|
|
72109
|
+
return {
|
|
72110
|
+
data: { path, kind, qualified, start: start2, end, from, to, truncated: remaining > 0, remaining, text: body2, also, ...noticeText === "" ? {} : { notice: noticeText } },
|
|
72111
|
+
lines: [...notes.filter((n) => n !== ""), header, ...body2, ...hint, ...alsoLine],
|
|
72112
|
+
exit: 0
|
|
72113
|
+
};
|
|
72114
|
+
}
|
|
72115
|
+
async function outlineCore(ctx, input2) {
|
|
72116
|
+
const root = findRoot(ctx.cwd);
|
|
72117
|
+
const path = resolveFile(ctx, root, input2.path);
|
|
72118
|
+
if (path === null) return { data: { path: input2.path, source: "pattern", symbols: [] }, lines: [`none: no file ${input2.path}`], exit: 4 };
|
|
72119
|
+
const fresh = await loadFreshIndex(ctx, root);
|
|
72120
|
+
let symbols2 = [];
|
|
72121
|
+
let source = "pattern";
|
|
72122
|
+
let notice = "";
|
|
72123
|
+
if (fresh.state === "ready" && !fresh.changed.has(path) && fresh.index.inFile(path).length > 0) {
|
|
72124
|
+
source = "index";
|
|
72125
|
+
symbols2 = fresh.index.inFile(path).filter((s) => input2.all === true || s.kind !== "property").map((s) => ({ line: s.line, kind: s.kind, name: s.qualified }));
|
|
72126
|
+
} else {
|
|
72127
|
+
notice = fresh.state === "ready" ? fresh.changed.has(path) ? `${path} changed since index ${sha7(fresh.index.sha)}; outline by pattern` : `${path} is not in the index; outline by pattern` : indexProblem(fresh);
|
|
72128
|
+
const lines = readLines(root, path) ?? [];
|
|
72129
|
+
const any2 = new RegExp(`^(?:export\\s+)?(?:default\\s+)?(?:declare\\s+)?(?:async\\s+)?(${DEF_WORDS})\\s+([A-Za-z_$][\\w$]*)`);
|
|
72130
|
+
lines.forEach((text2, i2) => {
|
|
72131
|
+
const m = text2.match(any2);
|
|
72132
|
+
if (m !== null) symbols2.push({ line: i2 + 1, kind: KIND_OF_WORD[m[1].replace("*", "")] ?? "constant", name: m[2] });
|
|
72133
|
+
});
|
|
72134
|
+
}
|
|
72135
|
+
const text = symbols2.map((s) => `${s.line} ${s.kind} ${s.name}`);
|
|
72136
|
+
if (symbols2.length === 0) return { data: { path, source, symbols: symbols2, ...notice === "" ? {} : { notice } }, lines: [...notice === "" ? [] : [notice], `none: no symbols in ${path}`], exit: 4 };
|
|
72137
|
+
return { data: { path, source, symbols: symbols2, ...notice === "" ? {} : { notice } }, lines: [...notice === "" ? [] : [notice], ...text], exit: 0 };
|
|
72138
|
+
}
|
|
72139
|
+
async function refsCore(ctx, input2) {
|
|
72140
|
+
const root = findRoot(ctx.cwd);
|
|
72141
|
+
const limit = Math.max(1, input2.limit ?? DEFAULT_REFS_LIMIT);
|
|
72142
|
+
const defs = await definitionsOf(ctx, root, input2.name, void 0);
|
|
72143
|
+
const callers = [];
|
|
72144
|
+
const ends = /* @__PURE__ */ new Map();
|
|
72145
|
+
if (defs.fresh.state === "ready") {
|
|
72146
|
+
const { index, changed } = defs.fresh;
|
|
72147
|
+
const seen = /* @__PURE__ */ new Set();
|
|
72148
|
+
for (const symbol2 of defs.symbols) {
|
|
72149
|
+
for (const from of index.callersOf(symbol2.i)) {
|
|
72150
|
+
const caller = index.symbol(from);
|
|
72151
|
+
if (caller === void 0 || changed.has(caller.path) || seen.has(`${caller.path}:${caller.line}`)) continue;
|
|
72152
|
+
seen.add(`${caller.path}:${caller.line}`);
|
|
72153
|
+
ends.set(`${caller.path}:${caller.line}`, nextSiblingLine(index, caller) ?? Number.POSITIVE_INFINITY);
|
|
72154
|
+
callers.push({ kind: "caller", qualified: caller.qualified, path: caller.path, line: caller.line });
|
|
72155
|
+
}
|
|
72156
|
+
}
|
|
72157
|
+
callers.sort((a, b) => a.path.localeCompare(b.path) || a.line - b.line);
|
|
72158
|
+
}
|
|
72159
|
+
const defKeys = new Set(defs.hits.map((h) => `${h.path}:${h.line}`));
|
|
72160
|
+
const listed = new Set(callers.map((h) => `${h.path}:${h.line}`));
|
|
72161
|
+
const budget = Math.max(0, limit - Math.min(callers.length, limit));
|
|
72162
|
+
const grep = await gitGrep(ctx, root, input2.name, 400);
|
|
72163
|
+
let skippedImports = 0;
|
|
72164
|
+
const matches = [];
|
|
72165
|
+
let extra = 0;
|
|
72166
|
+
for (const hit of grep.hits) {
|
|
72167
|
+
const key = `${hit.path}:${hit.line}`;
|
|
72168
|
+
if (defKeys.has(key) || listed.has(key)) continue;
|
|
72169
|
+
if (/^(?:import\b|export\s+(?:type\s+)?\{[^}]*\}\s+from\b|from\s+\S+\s+import\b|const\s+\{[^}]*\}\s*=\s*require)/.test(hit.text)) {
|
|
72170
|
+
skippedImports += 1;
|
|
72171
|
+
continue;
|
|
72172
|
+
}
|
|
72173
|
+
if (matches.length < budget) matches.push(hit);
|
|
72174
|
+
else extra += 1;
|
|
72175
|
+
}
|
|
72176
|
+
const enclosing = (hit) => callers.find((c2) => c2.path === hit.path && c2.line <= hit.line && hit.line < (ends.get(`${c2.path}:${c2.line}`) ?? 0));
|
|
72177
|
+
const covered = /* @__PURE__ */ new Set();
|
|
72178
|
+
const named = matches.map((m) => {
|
|
72179
|
+
const c2 = enclosing(m);
|
|
72180
|
+
if (c2 !== void 0) covered.add(c2);
|
|
72181
|
+
return c2 === void 0 ? `${m.path}:${m.line} ${m.text}` : `${m.path}:${m.line} ${m.text} <- ${c2.qualified}`;
|
|
72182
|
+
});
|
|
72183
|
+
const shownCallers = callers.slice(0, limit);
|
|
72184
|
+
const more = Math.max(0, callers.length - shownCallers.length) + extra + (grep.more ? 1 : 0);
|
|
72185
|
+
const notice = [...defs.notes.filter((n) => n !== "" && !n.startsWith("no exact match")), ...defs.fresh.state === "ready" ? [] : [indexProblem(defs.fresh)]].join("; ");
|
|
72186
|
+
const lines = [
|
|
72187
|
+
...notice === "" ? [] : [notice],
|
|
72188
|
+
...shownCallers.filter((h) => !covered.has(h)).map((h) => `caller ${h.qualified} ${h.path}:${h.line}`),
|
|
72189
|
+
...named,
|
|
72190
|
+
...skippedImports > 0 ? [`(${skippedImports} import lines not shown)`] : [],
|
|
72191
|
+
...more > 0 ? [`+${more}${grep.more ? "+" : ""} more: overlane code refs ${input2.name} --limit ${limit * 3}`] : []
|
|
72192
|
+
];
|
|
72193
|
+
const data = { name: input2.name, source: defs.fresh.state === "ready" ? "index" : "search", callers: shownCallers, matches, skippedImports, more, ...notice === "" ? {} : { notice } };
|
|
72194
|
+
if (shownCallers.length === 0 && matches.length === 0) return { data, lines: [...notice === "" ? [] : [notice], `none: no references to ${input2.name}${skippedImports > 0 ? ` (${skippedImports} import lines only)` : ""}`], exit: 4 };
|
|
72195
|
+
return { data, lines, exit: 0 };
|
|
72196
|
+
}
|
|
72197
|
+
|
|
72198
|
+
// ../cli/src/token/source.ts
|
|
72199
|
+
async function navMeta(ctx) {
|
|
72200
|
+
const root = findRoot(ctx.cwd);
|
|
72201
|
+
const fresh = await loadFreshIndex(ctx, root);
|
|
72202
|
+
if (fresh.state === "ready") {
|
|
72203
|
+
const { index, changed, headSha } = fresh;
|
|
72204
|
+
const freshness = changed.size === 0 && headSha === index.sha ? "fresh" : "partial";
|
|
72205
|
+
return { indexedCommit: index.sha, requestedCommit: headSha === "" ? null : headSha, coverage: { files: index.fileCount, symbols: index.count, uncovered: index.uncovered, changedSinceIndex: changed.size }, freshness, incomplete: freshness !== "fresh" || index.uncovered > 0 };
|
|
72206
|
+
}
|
|
72207
|
+
const head = await ctx.git(["rev-parse", "HEAD"], root);
|
|
72208
|
+
return {
|
|
72209
|
+
indexedCommit: null,
|
|
72210
|
+
requestedCommit: head.code === 0 ? head.stdout.trim() : null,
|
|
72211
|
+
coverage: { files: 0, symbols: 0, uncovered: 0, changedSinceIndex: 0 },
|
|
72212
|
+
freshness: fresh.state === "missing" ? "unavailable" : "stale",
|
|
72213
|
+
incomplete: true
|
|
72214
|
+
};
|
|
72215
|
+
}
|
|
72216
|
+
async function withMeta(ctx, result) {
|
|
72217
|
+
const meta3 = await navMeta(ctx);
|
|
72218
|
+
return { ...result, data: { ...meta3, ...result.data } };
|
|
72219
|
+
}
|
|
72220
|
+
var codeFind = async (ctx, input2) => withMeta(ctx, await findCore(ctx, input2));
|
|
72221
|
+
var codeShow = async (ctx, input2) => withMeta(ctx, await showCore(ctx, input2));
|
|
72222
|
+
var codeOutline = async (ctx, input2) => withMeta(ctx, await outlineCore(ctx, input2));
|
|
72223
|
+
var codeRefs = async (ctx, input2) => withMeta(ctx, await refsCore(ctx, input2));
|
|
72224
|
+
|
|
72225
|
+
// ../cli/src/token/exec.ts
|
|
72226
|
+
import { spawn } from "node:child_process";
|
|
72227
|
+
import { createWriteStream, mkdirSync as mkdirSync10 } from "node:fs";
|
|
72228
|
+
import { join as join29 } from "node:path";
|
|
72229
|
+
|
|
72230
|
+
// ../cli/src/token/parsers.ts
|
|
72231
|
+
var ANSI = /\u001b\[[0-9;?]*[A-Za-z]/g;
|
|
72232
|
+
var stripAnsi = (text) => text.replace(ANSI, "");
|
|
72233
|
+
var MAX_FAILURES = 15;
|
|
72234
|
+
function groupByPackage(lines) {
|
|
72235
|
+
const known = /* @__PURE__ */ new Set();
|
|
72236
|
+
for (const line3 of lines) {
|
|
72237
|
+
const m = line3.match(/^(\S+ [\w:.-]+)\$ /);
|
|
72238
|
+
if (m !== null) known.add(m[1]);
|
|
72239
|
+
}
|
|
72240
|
+
if (known.size === 0) return { groups: /* @__PURE__ */ new Map([["", [...lines]]]), prefixed: false };
|
|
72241
|
+
const groups = /* @__PURE__ */ new Map();
|
|
72242
|
+
const push = (key, line3) => {
|
|
72243
|
+
const list2 = groups.get(key);
|
|
72244
|
+
if (list2 === void 0) groups.set(key, [line3]);
|
|
72245
|
+
else list2.push(line3);
|
|
72246
|
+
};
|
|
72247
|
+
for (const line3 of lines) {
|
|
72248
|
+
const start2 = line3.match(/^(\S+ [\w:.-]+)\$ (.*)$/);
|
|
72249
|
+
if (start2 !== null) {
|
|
72250
|
+
push(start2[1], `$ ${start2[2]}`);
|
|
72251
|
+
continue;
|
|
72252
|
+
}
|
|
72253
|
+
const colon = line3.indexOf(": ");
|
|
72254
|
+
const head = colon === -1 ? line3.endsWith(":") ? line3.slice(0, -1) : "" : line3.slice(0, colon);
|
|
72255
|
+
if (head !== "" && known.has(head)) push(head, colon === -1 ? "" : line3.slice(colon + 2));
|
|
72256
|
+
else push("", line3);
|
|
72257
|
+
}
|
|
72258
|
+
return { groups, prefixed: true };
|
|
72259
|
+
}
|
|
72260
|
+
var packageOf = (key) => key.split(" ")[0] ?? key;
|
|
72261
|
+
function parseCountLine(text) {
|
|
72262
|
+
const get = (word) => Number(text.match(new RegExp(`(\\d+) ${word}`))?.[1] ?? 0);
|
|
72263
|
+
return { failed: get("failed"), passed: get("passed"), skipped: get("skipped"), todo: get("todo"), total: Number(text.match(/\((\d+)\)/)?.[1] ?? 0) };
|
|
72264
|
+
}
|
|
72265
|
+
function parseVitestBlock(lines, packageName2) {
|
|
72266
|
+
const clean2 = lines.map(stripAnsi);
|
|
72267
|
+
const sawRun = clean2.some((l) => /^\s*RUN\s+v\d/.test(l));
|
|
72268
|
+
const filesLine = clean2.find((l) => /^\s*Test Files\s/.test(l));
|
|
72269
|
+
const testsLine = clean2.find((l) => /^\s*Tests\s/.test(l) && /\(\d+\)/.test(l));
|
|
72270
|
+
if (!sawRun && filesLine === void 0 && testsLine === void 0) return null;
|
|
72271
|
+
const counts2 = filesLine === void 0 && testsLine === void 0 ? null : {
|
|
72272
|
+
files: (() => {
|
|
72273
|
+
const c2 = parseCountLine(filesLine ?? "");
|
|
72274
|
+
return { failed: c2.failed, passed: c2.passed, skipped: c2.skipped, total: c2.total };
|
|
72275
|
+
})(),
|
|
72276
|
+
tests: parseCountLine(testsLine ?? "")
|
|
72277
|
+
};
|
|
72278
|
+
const failures = [];
|
|
72279
|
+
for (let i2 = 0; i2 < clean2.length; i2 += 1) {
|
|
72280
|
+
const m = clean2[i2].match(/^\s*FAIL\s+(.+?)\s*$/);
|
|
72281
|
+
if (m === null) continue;
|
|
72282
|
+
const block2 = [];
|
|
72283
|
+
for (let j = i2 + 1; j < clean2.length; j += 1) {
|
|
72284
|
+
const line3 = clean2[j];
|
|
72285
|
+
if (/^\s*FAIL\s/.test(line3) || /^\s*⎯{3,}/.test(line3)) break;
|
|
72286
|
+
block2.push(line3);
|
|
72287
|
+
}
|
|
72288
|
+
failures.push({ name: m[1], detail: assertionLines(block2) });
|
|
72289
|
+
}
|
|
72290
|
+
const unhandled = Number(clean2.join("\n").match(/caught (\d+) unhandled error/)?.[1] ?? 0);
|
|
72291
|
+
return { package: packageName2, counts: counts2, failures: dedupeFailures(failures), unhandled, unfinished: counts2 === null };
|
|
72292
|
+
}
|
|
72293
|
+
function dedupeFailures(list2) {
|
|
72294
|
+
const seen = /* @__PURE__ */ new Set();
|
|
72295
|
+
return list2.filter((f) => seen.has(f.name) ? false : (seen.add(f.name), true));
|
|
72296
|
+
}
|
|
72297
|
+
function assertionLines(block2) {
|
|
72298
|
+
const body2 = block2.map((l) => l.trimEnd()).filter((l) => l.trim() !== "");
|
|
72299
|
+
const message = body2[0];
|
|
72300
|
+
if (message === void 0) return [];
|
|
72301
|
+
const rest = body2.slice(1).filter((l) => !/^\s*[-+] (?:Expected|Received)\s*$/.test(l) && !/^\s*❯ /.test(l));
|
|
72302
|
+
const changed = rest.filter((l) => /^[-+] /.test(l));
|
|
72303
|
+
const more = changed.length > 0 ? changed : rest;
|
|
72304
|
+
return [message, ...more.slice(0, 2)].map((l) => clip(l, 200));
|
|
72305
|
+
}
|
|
72306
|
+
function parseVitest(output2) {
|
|
72307
|
+
const lines = stripAnsi(output2).split("\n");
|
|
72308
|
+
const { groups, prefixed: prefixed2 } = groupByPackage(lines);
|
|
72309
|
+
const packages = [];
|
|
72310
|
+
for (const [key, list2] of groups) {
|
|
72311
|
+
if (prefixed2 && key === "") continue;
|
|
72312
|
+
const name2 = prefixed2 ? packageOf(key) : list2.map((l) => l.match(/^\s*RUN\s+v[\d.]+\s+(.+)$/)?.[1]).find((p2) => p2 !== void 0)?.split("/").slice(-2).join("/") ?? "";
|
|
72313
|
+
const block2 = parseVitestBlock(list2, name2);
|
|
72314
|
+
if (block2 !== null) packages.push(block2);
|
|
72315
|
+
}
|
|
72316
|
+
if (packages.length === 0) return null;
|
|
72317
|
+
const out2 = [];
|
|
72318
|
+
let explains = false;
|
|
72319
|
+
let failedTests = 0;
|
|
72320
|
+
const tot = { filesPassed: 0, filesFailed: 0, passed: 0, failed: 0, skipped: 0 };
|
|
72321
|
+
for (const p2 of packages) {
|
|
72322
|
+
const label2 = p2.package === "" ? "tests" : p2.package;
|
|
72323
|
+
if (p2.counts === null) {
|
|
72324
|
+
out2.push(`${label2}: no summary printed (vitest did not finish)`);
|
|
72325
|
+
explains = true;
|
|
72326
|
+
} else {
|
|
72327
|
+
const c2 = p2.counts;
|
|
72328
|
+
tot.filesPassed += c2.files.passed;
|
|
72329
|
+
tot.filesFailed += c2.files.failed;
|
|
72330
|
+
tot.passed += c2.tests.passed;
|
|
72331
|
+
tot.failed += c2.tests.failed;
|
|
72332
|
+
tot.skipped += c2.tests.skipped;
|
|
72333
|
+
out2.push(`${label2}: files ${c2.files.passed} passed${c2.files.failed > 0 ? ` ${c2.files.failed} FAILED` : ""}${c2.files.skipped > 0 ? ` ${c2.files.skipped} skipped` : ""}; tests ${c2.tests.passed} passed${c2.tests.failed > 0 ? ` ${c2.tests.failed} FAILED` : ""}${c2.tests.skipped > 0 ? ` ${c2.tests.skipped} skipped` : ""}`);
|
|
72334
|
+
}
|
|
72335
|
+
if (p2.unhandled > 0) {
|
|
72336
|
+
out2.push(`${label2}: ${p2.unhandled} unhandled error${p2.unhandled === 1 ? "" : "s"}`);
|
|
72337
|
+
explains = true;
|
|
72338
|
+
}
|
|
72339
|
+
for (const f of p2.failures.slice(0, MAX_FAILURES)) {
|
|
72340
|
+
out2.push(`FAIL ${f.name}`, ...f.detail.map((d) => ` ${d}`));
|
|
72341
|
+
explains = true;
|
|
72342
|
+
}
|
|
72343
|
+
failedTests += p2.failures.length;
|
|
72344
|
+
if (p2.failures.length > MAX_FAILURES) out2.push(`+${p2.failures.length - MAX_FAILURES} more failing tests in the log`);
|
|
72345
|
+
}
|
|
72346
|
+
if (packages.length > 1) out2.push(`total: tests ${tot.passed} passed${tot.failed > 0 ? ` ${tot.failed} FAILED` : ""}${tot.skipped > 0 ? ` ${tot.skipped} skipped` : ""} in ${packages.length} packages`);
|
|
72347
|
+
return { kind: "vitest", lines: out2, explains, data: { packages, failedTests } };
|
|
72348
|
+
}
|
|
72349
|
+
var TSC_PLAIN = /^(.+?)\((\d+),(\d+)\): error (TS\d+): (.*)$/;
|
|
72350
|
+
var TSC_PRETTY = /^(.+?):(\d+):(\d+) - error (TS\d+): (.*)$/;
|
|
72351
|
+
var TSC_GLOBAL = /^error (TS\d+): (.*)$/;
|
|
72352
|
+
function parseTscErrors(output2) {
|
|
72353
|
+
const lines = stripAnsi(output2).split("\n");
|
|
72354
|
+
const { groups, prefixed: prefixed2 } = groupByPackage(lines);
|
|
72355
|
+
const errors = [];
|
|
72356
|
+
const seen = /* @__PURE__ */ new Set();
|
|
72357
|
+
for (const [key, list2] of groups) {
|
|
72358
|
+
const dir = prefixed2 && key !== "" ? packageOf(key) : "";
|
|
72359
|
+
for (const line3 of list2) {
|
|
72360
|
+
const m = line3.match(TSC_PLAIN) ?? line3.match(TSC_PRETTY);
|
|
72361
|
+
const g = m === null ? line3.match(TSC_GLOBAL) : null;
|
|
72362
|
+
let error62;
|
|
72363
|
+
if (m !== null) error62 = { file: dir === "" || m[1].startsWith("/") ? m[1] : `${dir}/${m[1]}`, line: Number(m[2]), code: m[4], message: clip(m[5], 200) };
|
|
72364
|
+
else if (g !== null) error62 = { file: dir, line: 0, code: g[1], message: clip(g[2], 200) };
|
|
72365
|
+
if (error62 === void 0) continue;
|
|
72366
|
+
const id2 = `${error62.file}:${error62.line}:${error62.code}:${error62.message}`;
|
|
72367
|
+
if (seen.has(id2)) continue;
|
|
72368
|
+
seen.add(id2);
|
|
72369
|
+
errors.push(error62);
|
|
72370
|
+
}
|
|
72371
|
+
}
|
|
72372
|
+
return errors;
|
|
72373
|
+
}
|
|
72374
|
+
function parseTsc(output2, commandHints) {
|
|
72375
|
+
const errors = parseTscErrors(output2);
|
|
72376
|
+
if (errors.length === 0) return commandHints ? { kind: "typecheck", lines: ["typecheck: 0 errors"], explains: false, data: { errors: 0 } } : null;
|
|
72377
|
+
const shown2 = errors.slice(0, 10);
|
|
72378
|
+
const lines = [`typecheck: ${errors.length} error${errors.length === 1 ? "" : "s"}`, ...shown2.map((e2) => `${e2.file}${e2.line > 0 ? `:${e2.line}` : ""} ${e2.code} ${e2.message}`)];
|
|
72379
|
+
if (errors.length > shown2.length) lines.push(`+${errors.length - shown2.length} more in the log`);
|
|
72380
|
+
return { kind: "typecheck", lines, explains: true, data: { errors: errors.length, first: shown2 } };
|
|
72381
|
+
}
|
|
72382
|
+
function parseBuildErrors(output2) {
|
|
72383
|
+
const lines = stripAnsi(output2).split("\n").map((l) => l.replace(/^\S+ [\w:.-]+: /, ""));
|
|
72384
|
+
const errors = [];
|
|
72385
|
+
for (let i2 = 0; i2 < lines.length; i2 += 1) {
|
|
72386
|
+
const line3 = lines[i2];
|
|
72387
|
+
const m = line3.match(/^\s*(?:✘\s*)?\[(?:ERROR|error)\]\s*(.*)$/);
|
|
72388
|
+
if (m === null) continue;
|
|
72389
|
+
let location;
|
|
72390
|
+
for (let j = i2 + 1; j < Math.min(lines.length, i2 + 6); j += 1) {
|
|
72391
|
+
const loc = lines[j].match(/^\s+([^\s:][^\s]*?:\d+:\d+):?\s*$/) ?? lines[j].match(/^\s+(?:file|File): (\S+)/);
|
|
72392
|
+
if (loc !== null) {
|
|
72393
|
+
location = loc[1];
|
|
72394
|
+
break;
|
|
72395
|
+
}
|
|
72396
|
+
if (/^\s*(?:✘\s*)?\[(?:ERROR|error|WARNING)\]/.test(lines[j])) break;
|
|
72397
|
+
}
|
|
72398
|
+
errors.push({ message: clip(m[1], 200), ...location === void 0 ? {} : { location } });
|
|
72399
|
+
}
|
|
72400
|
+
return errors;
|
|
72401
|
+
}
|
|
72402
|
+
function parseBuild(output2) {
|
|
72403
|
+
const errors = parseBuildErrors(output2);
|
|
72404
|
+
if (errors.length === 0) return null;
|
|
72405
|
+
const shown2 = errors.slice(0, 10);
|
|
72406
|
+
const lines = [`build: ${errors.length} error${errors.length === 1 ? "" : "s"}`, ...shown2.map((e2) => `${e2.message}${e2.location === void 0 ? "" : ` at ${e2.location}`}`)];
|
|
72407
|
+
if (errors.length > shown2.length) lines.push(`+${errors.length - shown2.length} more in the log`);
|
|
72408
|
+
return { kind: "build", lines, explains: true, data: { errors: errors.length, first: shown2 } };
|
|
72409
|
+
}
|
|
72410
|
+
function parseWranglerDeploy(output2) {
|
|
72411
|
+
const lines = stripAnsi(output2).split("\n").map((l) => l.replace(/^\S+ [\w:.-]+: /, ""));
|
|
72412
|
+
const deploys = [];
|
|
72413
|
+
let current2 = { worker: void 0, versionId: void 0, routes: [] };
|
|
72414
|
+
let afterTriggers = false;
|
|
72415
|
+
const flush = () => {
|
|
72416
|
+
if (current2.versionId !== void 0 || current2.routes.length > 0 || current2.worker !== void 0) deploys.push(current2);
|
|
72417
|
+
current2 = { worker: void 0, versionId: void 0, routes: [] };
|
|
72418
|
+
};
|
|
72419
|
+
for (const line3 of lines) {
|
|
72420
|
+
const up = line3.match(/^Uploaded (\S+)/);
|
|
72421
|
+
if (up !== null) {
|
|
72422
|
+
if (current2.versionId !== void 0) flush();
|
|
72423
|
+
current2.worker = up[1];
|
|
72424
|
+
}
|
|
72425
|
+
if (/^Deployed .* triggers/.test(line3) || /^Published .*/.test(line3)) {
|
|
72426
|
+
afterTriggers = true;
|
|
72427
|
+
current2.worker ??= line3.match(/^(?:Deployed|Published) (\S+)/)?.[1];
|
|
72428
|
+
continue;
|
|
72429
|
+
}
|
|
72430
|
+
const version2 = line3.match(/^Current Version ID:\s*(\S+)/);
|
|
72431
|
+
if (version2 !== null) {
|
|
72432
|
+
current2.versionId = version2[1];
|
|
72433
|
+
afterTriggers = false;
|
|
72434
|
+
flush();
|
|
72435
|
+
continue;
|
|
72436
|
+
}
|
|
72437
|
+
if (afterTriggers) {
|
|
72438
|
+
const route = line3.match(/^\s{2,}(\S.*?)\s*$/);
|
|
72439
|
+
if (route !== null) current2.routes.push(route[1]);
|
|
72440
|
+
else if (line3.trim() !== "") afterTriggers = false;
|
|
72441
|
+
}
|
|
72442
|
+
}
|
|
72443
|
+
flush();
|
|
72444
|
+
const errors = wranglerErrors(lines);
|
|
72445
|
+
if (deploys.length === 0 && errors.length === 0) return null;
|
|
72446
|
+
const out2 = [];
|
|
72447
|
+
for (const d of deploys) {
|
|
72448
|
+
out2.push(`deploy ${d.worker ?? "worker"} version ${d.versionId ?? "unknown"}`);
|
|
72449
|
+
for (const r of d.routes) out2.push(` ${r}`);
|
|
72450
|
+
}
|
|
72451
|
+
for (const e2 of errors) out2.push(`error ${e2}`);
|
|
72452
|
+
return { kind: "wrangler deploy", lines: out2, explains: errors.length > 0, data: { deploys, errors } };
|
|
72453
|
+
}
|
|
72454
|
+
function wranglerErrors(lines) {
|
|
72455
|
+
const errors = [];
|
|
72456
|
+
for (let i2 = 0; i2 < lines.length; i2 += 1) {
|
|
72457
|
+
const m = lines[i2].match(/^\s*✘\s*\[ERROR\]\s*(.*)$/);
|
|
72458
|
+
if (m === null) continue;
|
|
72459
|
+
let text = m[1];
|
|
72460
|
+
for (let j = i2 + 1; j < Math.min(lines.length, i2 + 5); j += 1) {
|
|
72461
|
+
const next = lines[j].trim();
|
|
72462
|
+
if (next === "") continue;
|
|
72463
|
+
if (/^✘|^▲|^If you think/.test(next)) break;
|
|
72464
|
+
if (text.length < 160) text += ` ${next}`;
|
|
72465
|
+
}
|
|
72466
|
+
errors.push(clip(text, 220));
|
|
72467
|
+
}
|
|
72468
|
+
return errors.slice(0, 10);
|
|
72469
|
+
}
|
|
72470
|
+
var BOOKMARK = /\b[0-9a-f]{8}-[0-9a-f]{8}-[0-9a-f]{8}-[0-9a-f]{32}\b/;
|
|
72471
|
+
function parseWranglerD1(output2) {
|
|
72472
|
+
const lines = stripAnsi(output2).split("\n");
|
|
72473
|
+
const bookmark = lines.map((l) => l.match(BOOKMARK)?.[0]).find((b) => b !== void 0);
|
|
72474
|
+
const applied = [];
|
|
72475
|
+
const failed = [];
|
|
72476
|
+
for (const line3 of lines) {
|
|
72477
|
+
const row = line3.match(/^[│|]\s*(\S+\.sql)\s*[│|]\s*(\S+)/);
|
|
72478
|
+
if (row === null) continue;
|
|
72479
|
+
if (/✅|ok|applied/i.test(row[2])) applied.push(row[1]);
|
|
72480
|
+
else if (/❌|fail/i.test(row[2])) failed.push(row[1]);
|
|
72481
|
+
}
|
|
72482
|
+
const none2 = lines.some((l) => /No migrations to apply/i.test(l));
|
|
72483
|
+
const errors = wranglerErrors(lines);
|
|
72484
|
+
if (bookmark === void 0 && applied.length === 0 && failed.length === 0 && !none2 && errors.length === 0) return null;
|
|
72485
|
+
const out2 = [];
|
|
72486
|
+
if (bookmark !== void 0) out2.push(`bookmark ${bookmark}`);
|
|
72487
|
+
if (applied.length > 0) out2.push(`migrations applied: ${applied.join(", ")}`);
|
|
72488
|
+
if (none2) out2.push("migrations: none to apply");
|
|
72489
|
+
if (failed.length > 0) out2.push(`migrations FAILED: ${failed.join(", ")}`);
|
|
72490
|
+
for (const e2 of errors) out2.push(`error ${e2}`);
|
|
72491
|
+
return { kind: "wrangler d1", lines: out2, explains: failed.length > 0 || errors.length > 0, data: { bookmark, applied, failed, errors } };
|
|
72492
|
+
}
|
|
72493
|
+
function parseGitPush(output2) {
|
|
72494
|
+
const lines = stripAnsi(output2).split("\n");
|
|
72495
|
+
const updates = [];
|
|
72496
|
+
const notes = [];
|
|
72497
|
+
for (const line3 of lines) {
|
|
72498
|
+
const m = line3.match(/^\s*([ +\-*!=])\s+(\[[^\]]+\]|\S+)\s+(\S+) -> (\S+)(?:\s+\((.*)\))?\s*$/);
|
|
72499
|
+
if (m !== null) {
|
|
72500
|
+
const flag = m[1];
|
|
72501
|
+
const what = m[2];
|
|
72502
|
+
const status = flag === "!" ? "rejected" : flag === "+" ? "forced" : flag === "-" ? "deleted" : flag === "=" ? "up-to-date" : what === "[new branch]" || what === "[new tag]" ? "new" : /\.\./.test(what) ? "updated" : "other";
|
|
72503
|
+
updates.push({ status, ref: m[4], detail: status === "rejected" ? m[5] ?? what : what });
|
|
72504
|
+
continue;
|
|
72505
|
+
}
|
|
72506
|
+
if (/^(?:remote: )?(?:error|fatal|hint): /.test(line3) || /^remote: .*(?:rejected|denied|protected|violation|GH\d+)/i.test(line3)) notes.push(clip(line3.replace(/^remote:\s*/, "remote: "), 200));
|
|
72507
|
+
}
|
|
72508
|
+
if (updates.length === 0 && notes.length === 0) return /Everything up-to-date/.test(output2) ? { kind: "git push", lines: ["push: everything up to date"], explains: false, data: { updates: [] } } : null;
|
|
72509
|
+
const out2 = updates.map((u) => u.status === "rejected" ? `push REJECTED ${u.ref} (${u.detail})` : `push ${u.status} ${u.ref}${u.status === "updated" || u.status === "forced" ? ` ${u.detail}` : ""}`);
|
|
72510
|
+
const rejected = updates.some((u) => u.status === "rejected") || notes.length > 0 && updates.every((u) => u.status !== "updated" && u.status !== "new");
|
|
72511
|
+
if (rejected) out2.push(...[...new Set(notes)].slice(0, 6));
|
|
72512
|
+
return { kind: "git push", lines: out2, explains: rejected, data: { updates, notes } };
|
|
72513
|
+
}
|
|
72514
|
+
function parsePnpmFailures(output2) {
|
|
72515
|
+
const lines = stripAnsi(output2).split("\n");
|
|
72516
|
+
const found = [];
|
|
72517
|
+
for (const line3 of lines) {
|
|
72518
|
+
const m = line3.match(/(ERR_PNPM_[A-Z_]+)/) ?? line3.match(/(\[ELIFECYCLE\].*)$/);
|
|
72519
|
+
if (m !== null && /Command failed|ELIFECYCLE|ERR_PNPM/.test(line3) && !/RECURSIVE_RUN_FIRST_FAIL/.test(line3)) found.push(clip(line3.replace(/^.*?(\[ELIFECYCLE\])/, "$1"), 200));
|
|
72520
|
+
}
|
|
72521
|
+
return [...new Set(found)].slice(0, 5);
|
|
72522
|
+
}
|
|
72523
|
+
function lastLines(output2, count) {
|
|
72524
|
+
const lines = stripAnsi(output2).split("\n");
|
|
72525
|
+
while (lines.length > 0 && lines.at(-1).trim() === "") lines.pop();
|
|
72526
|
+
return lines.slice(-count).map((l) => clip(l, 240));
|
|
72527
|
+
}
|
|
72528
|
+
var HINTS = {
|
|
72529
|
+
vitest: /\b(?:vitest|jest)\b|(?:pnpm|npm|yarn)(?:\s+-\S+(?:\s+\S+)?)*\s+(?:run\s+)?test\b/,
|
|
72530
|
+
tsc: /\btsc\b|\btypecheck\b/,
|
|
72531
|
+
build: /\besbuild\b|\bastro\s+build\b|\bvite\s+build\b|(?:pnpm|npm|yarn)(?:\s+-\S+(?:\s+\S+)?)*\s+(?:run\s+)?build\b/,
|
|
72532
|
+
deploy: /\bwrangler\b.*\b(?:deploy|publish|versions\s+upload)\b/,
|
|
72533
|
+
d1: /\bwrangler\b.*\bd1\b/,
|
|
72534
|
+
push: /\bgit\b.*\bpush\b/
|
|
72535
|
+
};
|
|
72536
|
+
function summarise(command, output2, exit) {
|
|
72537
|
+
const parts2 = [];
|
|
72538
|
+
const add = (part) => {
|
|
72539
|
+
if (part !== null) parts2.push(part);
|
|
72540
|
+
};
|
|
72541
|
+
add(parseVitest(output2));
|
|
72542
|
+
add(parseTsc(output2, HINTS.tsc.test(command) && !HINTS.vitest.test(command)));
|
|
72543
|
+
const wrangler = [parseWranglerDeploy(output2), parseWranglerD1(output2)];
|
|
72544
|
+
if (wrangler.every((w) => w === null)) add(parseBuild(output2));
|
|
72545
|
+
add(wrangler[0] ?? null);
|
|
72546
|
+
add(wrangler[1] ?? null);
|
|
72547
|
+
add(parseGitPush(output2));
|
|
72548
|
+
const lines = parts2.flatMap((p2) => p2.lines);
|
|
72549
|
+
const explained = parts2.some((p2) => p2.explains);
|
|
72550
|
+
if (exit !== 0) {
|
|
72551
|
+
const pnpm = parsePnpmFailures(output2);
|
|
72552
|
+
if (!explained) {
|
|
72553
|
+
lines.push(...pnpm, ...lastLines(output2, 20));
|
|
72554
|
+
} else if (pnpm.length > 0) {
|
|
72555
|
+
lines.push(...pnpm.filter((l) => /signal|SIGKILL|ERR_PNPM_(?!RECURSIVE)/.test(l)));
|
|
72556
|
+
}
|
|
72557
|
+
}
|
|
72558
|
+
return { kinds: parts2.map((p2) => p2.kind), lines, parts: parts2 };
|
|
72559
|
+
}
|
|
72560
|
+
|
|
72561
|
+
// ../cli/src/token/exec.ts
|
|
72562
|
+
var MAX_CAPTURE = 64 * 1024 * 1024;
|
|
72563
|
+
var SAFE_TOKEN = /^[A-Za-z0-9_@%+=:,./~-]+$/;
|
|
72564
|
+
var quote2 = (token) => SAFE_TOKEN.test(token) ? token : `'${token.replaceAll("'", "'\\''")}'`;
|
|
72565
|
+
function commandLine(tokens) {
|
|
72566
|
+
if (tokens.length === 1) return tokens[0];
|
|
72567
|
+
return tokens.map(quote2).join(" ");
|
|
72568
|
+
}
|
|
72569
|
+
function slugOf(name2, command) {
|
|
72570
|
+
const base5 = name2 ?? command.split(/\s+/).filter((w) => !w.startsWith("-")).slice(0, 3).join("-");
|
|
72571
|
+
const slug = base5.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 40);
|
|
72572
|
+
return slug === "" ? "run" : slug;
|
|
72573
|
+
}
|
|
72574
|
+
function utcStamp(ms) {
|
|
72575
|
+
return new Date(ms).toISOString().replace(/[-:]/g, "").replace(/\.\d+Z$/, "Z");
|
|
72576
|
+
}
|
|
72577
|
+
var formatSeconds = (ms) => `${(ms / 1e3).toFixed(1)}s`;
|
|
72578
|
+
async function execCommand(ctx, input2) {
|
|
72579
|
+
if (input2.tokens.length === 0 || input2.tokens.every((t2) => t2.trim() === "")) {
|
|
72580
|
+
throw new CoreError("exec needs a command after --", { exit: 2, code: "usage", hint: "overlane exec -- pnpm -r test" });
|
|
72581
|
+
}
|
|
72582
|
+
const command = commandLine(input2.tokens);
|
|
72583
|
+
const root = findRoot(ctx.cwd);
|
|
72584
|
+
const dir = join29(root, ".harness", "logs");
|
|
72585
|
+
mkdirSync10(dir, { recursive: true });
|
|
72586
|
+
const started = ctx.now();
|
|
72587
|
+
const logFile = join29(dir, `${utcStamp(started)}-${slugOf(input2.name, command)}.log`);
|
|
72588
|
+
const stream = createWriteStream(logFile);
|
|
72589
|
+
const chunks = [];
|
|
72590
|
+
let captured = 0;
|
|
72591
|
+
const outcome = await new Promise((done) => {
|
|
72592
|
+
const child = spawn(command, { shell: true, cwd: ctx.cwd, stdio: ["ignore", "pipe", "pipe"], env: { ...ctx.env } });
|
|
72593
|
+
const take = (chunk) => {
|
|
72594
|
+
stream.write(chunk);
|
|
72595
|
+
if (captured < MAX_CAPTURE) {
|
|
72596
|
+
chunks.push(chunk);
|
|
72597
|
+
captured += chunk.length;
|
|
72598
|
+
}
|
|
72599
|
+
};
|
|
72600
|
+
child.stdout.on("data", take);
|
|
72601
|
+
child.stderr.on("data", take);
|
|
72602
|
+
child.once("error", (error62) => {
|
|
72603
|
+
take(Buffer.from(`${error62.message}
|
|
72604
|
+
`));
|
|
72605
|
+
done({ code: 127 });
|
|
72606
|
+
});
|
|
72607
|
+
child.once("close", (code2, signal) => done({ code: code2 ?? (signal === null ? 1 : 128 + (signalNumber(signal) ?? 0)) }));
|
|
72608
|
+
});
|
|
72609
|
+
await new Promise((done) => stream.end(done));
|
|
72610
|
+
const elapsed = ctx.now() - started;
|
|
72611
|
+
const output2 = Buffer.concat(chunks).toString("utf8");
|
|
72612
|
+
const summary2 = summarise(command, output2, outcome.code);
|
|
72613
|
+
summary2.lines = summary2.lines.map(redact);
|
|
72614
|
+
const log = shortPath(ctx.cwd, logFile);
|
|
72615
|
+
const ok2 = outcome.code === 0;
|
|
72616
|
+
const status = `${ok2 ? "ok" : "FAIL"} exit=${outcome.code} ${formatSeconds(elapsed)} log=${log}`;
|
|
72617
|
+
const data = { ok: ok2, exit: outcome.code, seconds: Math.round(elapsed / 100) / 10, log, command: redact(command), kinds: summary2.kinds, summary: summary2.lines };
|
|
72618
|
+
return { data, lines: [status, ...summary2.lines], exit: outcome.code };
|
|
72619
|
+
}
|
|
72620
|
+
function signalNumber(signal) {
|
|
72621
|
+
const table2 = { SIGHUP: 1, SIGINT: 2, SIGQUIT: 3, SIGABRT: 6, SIGKILL: 9, SIGSEGV: 11, SIGPIPE: 13, SIGTERM: 15 };
|
|
72622
|
+
return table2[signal];
|
|
72623
|
+
}
|
|
72624
|
+
|
|
72625
|
+
// ../cli/src/token/ledger.ts
|
|
72626
|
+
import { existsSync as existsSync12, readFileSync as readFileSync18 } from "node:fs";
|
|
72627
|
+
import { join as join30, resolve as resolve16 } from "node:path";
|
|
72628
|
+
var LEDGER_PATH = ".harness/token-ledger.jsonl";
|
|
72629
|
+
var CATEGORY_RULES = [
|
|
72630
|
+
["wrangler", /\bwrangler\b/],
|
|
72631
|
+
["typecheck", /\btsc\b|\btypecheck\b/],
|
|
72632
|
+
["test", /\bvitest\b|\bjest\b|\bpytest\b|(?:pnpm|npm|yarn)(?:\s+-\S+(?:\s+\S+)?)*\s+(?:run\s+)?test\b|\bcargo\s+test\b|\bgo\s+test\b/],
|
|
72633
|
+
["build", /\besbuild\b|\bastro\s+build\b|\bvite\s+build\b|(?:pnpm|npm|yarn)(?:\s+-\S+(?:\s+\S+)?)*\s+(?:run\s+)?build\b|\bcargo\s+build\b/],
|
|
72634
|
+
["grep/sed/cat", /\bgit\s+grep\b/],
|
|
72635
|
+
["git", /^\s*(?:cd\s+\S+\s*&&\s*)?git\b/],
|
|
72636
|
+
["grep/sed/cat", /(?:^|[|;&(]\s*)(?:grep|egrep|fgrep|rg|ag|sed|awk|cat|head|tail|nl|less|find|ls|wc|bat)\b/],
|
|
72637
|
+
["git", /(?:^|[|;&(]\s*)git\b/],
|
|
72638
|
+
["curl", /(?:^|[|;&(]\s*)(?:curl|wget|http)\b/]
|
|
72639
|
+
];
|
|
72640
|
+
function categorise(tool, command) {
|
|
72641
|
+
if (tool === "Bash" || tool === "bash" || tool === "shell") {
|
|
72642
|
+
const text = (command ?? "").trim();
|
|
72643
|
+
for (const [name2, pattern] of CATEGORY_RULES) if (pattern.test(text)) return name2;
|
|
72644
|
+
return "other";
|
|
72645
|
+
}
|
|
72646
|
+
if (tool === "Grep" || tool === "Glob") return "grep/sed/cat";
|
|
72647
|
+
if (tool === "Read") return "read";
|
|
72648
|
+
if (tool.startsWith("mcp__")) return "mcp";
|
|
72649
|
+
return tool.toLowerCase();
|
|
72650
|
+
}
|
|
72651
|
+
var SUGGESTIONS = {
|
|
72652
|
+
"grep/sed/cat": "overlane code find <name> | code show <name|path:line> | code outline <path> | code refs <name>",
|
|
72653
|
+
read: "overlane code show <name|path:line> for one symbol; overlane code outline <path> for a file map",
|
|
72654
|
+
test: "overlane exec -- <command> (one status line, failures parsed, full log kept)",
|
|
72655
|
+
typecheck: "overlane exec -- <command> (error count and first 10 errors)",
|
|
72656
|
+
build: "overlane exec -- <command> (errors only)",
|
|
72657
|
+
wrangler: "overlane exec -- <command> (version id, routes, bookmark, migrations)",
|
|
72658
|
+
git: "overlane brief git (status and last commit in one line)",
|
|
72659
|
+
curl: "overlane exec --name <label> -- curl ... (summary on screen, body in the log)"
|
|
72660
|
+
};
|
|
72661
|
+
var tokensOf = (chars) => Math.round(chars / 4);
|
|
72662
|
+
function formatTokens(n) {
|
|
72663
|
+
if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;
|
|
72664
|
+
if (n >= 1e4) return `${Math.round(n / 1e3)}k`;
|
|
72665
|
+
return n.toLocaleString("en-US");
|
|
72666
|
+
}
|
|
72667
|
+
function parseSince(value, now) {
|
|
72668
|
+
const rel = value.match(/^(\d+)([mhdw])$/);
|
|
72669
|
+
if (rel !== null) return now - Number(rel[1]) * { m: 6e4, h: 36e5, d: 864e5, w: 6048e5 }[rel[2]];
|
|
72670
|
+
const date5 = Date.parse(value);
|
|
72671
|
+
if (Number.isNaN(date5)) throw new CoreError(`--since must be like 7d, 12h, 30m or a date; got "${value}"`, { exit: 2, code: "usage", hint: "overlane tokens report --since 7d" });
|
|
72672
|
+
return date5;
|
|
72673
|
+
}
|
|
72674
|
+
function readLedger(text) {
|
|
72675
|
+
const calls = [];
|
|
72676
|
+
let skipped = 0;
|
|
72677
|
+
for (const line3 of text.split("\n")) {
|
|
72678
|
+
if (line3.trim() === "") continue;
|
|
72679
|
+
try {
|
|
72680
|
+
const o = JSON.parse(line3);
|
|
72681
|
+
const tool = typeof o["tool"] === "string" ? o["tool"] : "";
|
|
72682
|
+
const command = typeof o["command"] === "string" ? o["command"] : void 0;
|
|
72683
|
+
const ts = typeof o["ts"] === "number" ? o["ts"] : typeof o["ts"] === "string" ? Date.parse(o["ts"]) : Number.NaN;
|
|
72684
|
+
if (tool === "" || Number.isNaN(ts)) {
|
|
72685
|
+
skipped += 1;
|
|
72686
|
+
continue;
|
|
72687
|
+
}
|
|
72688
|
+
const category = typeof o["category"] === "string" && o["category"] !== "" ? o["category"] : categorise(tool, command);
|
|
72689
|
+
calls.push({ ts, tool, category, inChars: Number(o["inChars"] ?? 0) || 0, outChars: Number(o["outChars"] ?? 0) || 0, ...command === void 0 ? {} : { command } });
|
|
72690
|
+
} catch {
|
|
72691
|
+
skipped += 1;
|
|
72692
|
+
}
|
|
72693
|
+
}
|
|
72694
|
+
return { calls, skipped };
|
|
72695
|
+
}
|
|
72696
|
+
function textOf2(content) {
|
|
72697
|
+
if (typeof content === "string") return content;
|
|
72698
|
+
if (Array.isArray(content)) return content.map((part) => typeof part === "string" ? part : typeof part.text === "string" ? part.text : "").join("");
|
|
72699
|
+
return "";
|
|
72700
|
+
}
|
|
72701
|
+
function readTranscript(text) {
|
|
72702
|
+
const pending = /* @__PURE__ */ new Map();
|
|
72703
|
+
const order = [];
|
|
72704
|
+
let skipped = 0;
|
|
72705
|
+
for (const line3 of text.split("\n")) {
|
|
72706
|
+
if (line3.trim() === "") continue;
|
|
72707
|
+
let entry;
|
|
72708
|
+
try {
|
|
72709
|
+
entry = JSON.parse(line3);
|
|
72710
|
+
} catch {
|
|
72711
|
+
skipped += 1;
|
|
72712
|
+
continue;
|
|
72713
|
+
}
|
|
72714
|
+
const content = entry.message?.content;
|
|
72715
|
+
if (!Array.isArray(content)) continue;
|
|
72716
|
+
const ts = typeof entry.timestamp === "string" ? Date.parse(entry.timestamp) : typeof entry.timestamp === "number" ? entry.timestamp : 0;
|
|
72717
|
+
for (const block2 of content) {
|
|
72718
|
+
if (block2["type"] === "tool_use" && typeof block2["id"] === "string" && typeof block2["name"] === "string") {
|
|
72719
|
+
const input2 = block2["input"] ?? {};
|
|
72720
|
+
const command = typeof input2["command"] === "string" ? input2["command"] : typeof input2["pattern"] === "string" ? String(input2["pattern"]) : typeof input2["file_path"] === "string" ? String(input2["file_path"]) : void 0;
|
|
72721
|
+
const call2 = { ts: Number.isNaN(ts) ? 0 : ts, tool: block2["name"], category: categorise(block2["name"], typeof input2["command"] === "string" ? input2["command"] : void 0), inChars: JSON.stringify(input2).length, outChars: 0, ...command === void 0 ? {} : { command } };
|
|
72722
|
+
pending.set(block2["id"], call2);
|
|
72723
|
+
order.push(call2);
|
|
72724
|
+
} else if (block2["type"] === "tool_result" && typeof block2["tool_use_id"] === "string") {
|
|
72725
|
+
const call2 = pending.get(block2["tool_use_id"]);
|
|
72726
|
+
if (call2 !== void 0) call2.outChars = textOf2(block2["content"]).length;
|
|
72727
|
+
}
|
|
72728
|
+
}
|
|
72729
|
+
}
|
|
72730
|
+
return { calls: order, skipped };
|
|
72731
|
+
}
|
|
72732
|
+
function buildReport(calls, top, source, since, skipped) {
|
|
72733
|
+
const byCategory = /* @__PURE__ */ new Map();
|
|
72734
|
+
for (const c2 of calls) {
|
|
72735
|
+
const row = byCategory.get(c2.category) ?? { calls: 0, inChars: 0, outChars: 0 };
|
|
72736
|
+
row.calls += 1;
|
|
72737
|
+
row.inChars += c2.inChars;
|
|
72738
|
+
row.outChars += c2.outChars;
|
|
72739
|
+
byCategory.set(c2.category, row);
|
|
72740
|
+
}
|
|
72741
|
+
const rows = [...byCategory].map(([category, r]) => {
|
|
72742
|
+
const tokens = tokensOf(r.inChars + r.outChars);
|
|
72743
|
+
return { category, calls: r.calls, inTokens: tokensOf(r.inChars), outTokens: tokensOf(r.outChars), tokens, avg: Math.round(tokens / r.calls), suggestion: SUGGESTIONS[category] ?? "" };
|
|
72744
|
+
});
|
|
72745
|
+
rows.sort((a, b) => b.tokens - a.tokens || a.category.localeCompare(b.category));
|
|
72746
|
+
return { source, since, calls: calls.length, tokens: rows.reduce((sum, r) => sum + r.tokens, 0), skipped, rows: rows.slice(0, top) };
|
|
72747
|
+
}
|
|
72748
|
+
function reportLines(report2) {
|
|
72749
|
+
const head = `${report2.calls} calls, ~${formatTokens(report2.tokens)} tokens${report2.since === null ? "" : ` since ${report2.since}`} (${report2.source}${report2.skipped > 0 ? `, ${report2.skipped} unreadable lines skipped` : ""})`;
|
|
72750
|
+
return [head, ...report2.rows.map((r) => `${r.category} ${r.calls} calls ~${formatTokens(r.tokens)} tok avg ${formatTokens(r.avg)}${r.suggestion === "" ? "" : ` -> ${r.suggestion}`}`)];
|
|
72751
|
+
}
|
|
72752
|
+
async function tokensReport(ctx, input2) {
|
|
72753
|
+
const root = findRoot(ctx.cwd);
|
|
72754
|
+
const top = Math.max(1, input2.top ?? 10);
|
|
72755
|
+
const cutoff = input2.since === void 0 ? null : parseSince(input2.since, ctx.now());
|
|
72756
|
+
let source;
|
|
72757
|
+
let read;
|
|
72758
|
+
if (input2.transcript !== void 0) {
|
|
72759
|
+
const file2 = resolve16(ctx.cwd, input2.transcript);
|
|
72760
|
+
if (!existsSync12(file2)) return { data: { source: input2.transcript, since: input2.since ?? null, calls: 0, tokens: 0, skipped: 0, rows: [] }, lines: [`none: no transcript at ${input2.transcript}`], exit: 4 };
|
|
72761
|
+
source = input2.transcript;
|
|
72762
|
+
read = readTranscript(readFileSync18(file2, "utf8"));
|
|
72763
|
+
} else {
|
|
72764
|
+
const file2 = join30(root, LEDGER_PATH);
|
|
72765
|
+
if (!existsSync12(file2)) {
|
|
72766
|
+
return { data: { source: LEDGER_PATH, since: input2.since ?? null, calls: 0, tokens: 0, skipped: 0, rows: [] }, lines: [`none: no ledger at ${LEDGER_PATH}; the tool-call hook writes it, or pass --transcript <path.jsonl>`], exit: 4 };
|
|
72767
|
+
}
|
|
72768
|
+
source = LEDGER_PATH;
|
|
72769
|
+
read = readLedger(readFileSync18(file2, "utf8"));
|
|
72770
|
+
}
|
|
72771
|
+
const calls = cutoff === null ? read.calls : read.calls.filter((c2) => c2.ts >= cutoff);
|
|
72772
|
+
const report2 = buildReport(calls, top, source, input2.since ?? null, read.skipped);
|
|
72773
|
+
if (calls.length === 0) return { data: report2, lines: [`none: no tool calls${input2.since === void 0 ? "" : ` since ${input2.since}`} in ${source}`], exit: 4 };
|
|
72774
|
+
return { data: report2, lines: reportLines(report2), exit: 0 };
|
|
72775
|
+
}
|
|
72776
|
+
|
|
72777
|
+
// ../cli/src/token/commands.ts
|
|
72778
|
+
function intFlag(values, name2, min = 0) {
|
|
72779
|
+
const raw = values[name2];
|
|
72780
|
+
if (typeof raw !== "string") return void 0;
|
|
72781
|
+
const n = Number(raw);
|
|
72782
|
+
if (!Number.isInteger(n) || n < min) throw new CoreError(`--${name2} must be a whole number of at least ${min}; got "${raw}"`, { exit: 2, code: "usage" });
|
|
72783
|
+
return n;
|
|
72784
|
+
}
|
|
72785
|
+
var str = (values, name2) => typeof values[name2] === "string" ? values[name2] : void 0;
|
|
72786
|
+
var NOTE = "Output is plain text, one fact per line; --json prints the same facts as JSON. Exit 4 when nothing matches.";
|
|
72787
|
+
var TOKEN_COMMANDS = [
|
|
72788
|
+
{
|
|
72789
|
+
path: ["code", "find"],
|
|
72790
|
+
summary: "Find where a symbol is defined: one line each, kind, qualified name, path:line",
|
|
72791
|
+
description: `Looks the name up in the local code index (.harness/code-index.json) and prints "kind qualified path:line", best match first, at most --limit lines (default 20). Entries in files that changed since the index was built are replaced by a pattern scan, and the output says so. With no index, or one this checkout does not have, it prints one line saying so and falls back to a bounded literal search (git grep -n -w, at most 20 lines). ${NOTE} Use this in place of grep for "where is X defined".`,
|
|
72792
|
+
args: [{ name: "name", required: true, description: "Symbol name, or a qualified name such as Class.method" }],
|
|
72793
|
+
flags: [
|
|
72794
|
+
{ name: "kind", type: "string", value: "KIND", description: "Only this kind: function, class, interface, type, constant, method, variable, property, namespace" },
|
|
72795
|
+
{ name: "limit", type: "string", value: "N", default: "20", description: "Most lines to print (default 20)" }
|
|
72796
|
+
],
|
|
72797
|
+
examples: ["overlane code find hashSecret", "overlane code find Registry --kind class --limit 5"],
|
|
72798
|
+
keywords: ["grep", "where is defined", "definition", "symbol", "find function", "find class", "locate", "code index", "navigate"],
|
|
72799
|
+
run: (ctx, v, p2) => codeFind(ctx, { name: p2[0], kind: str(v, "kind"), limit: intFlag(v, "limit", 1) })
|
|
72800
|
+
},
|
|
72801
|
+
{
|
|
72802
|
+
path: ["code", "show"],
|
|
72803
|
+
summary: "Print one symbol's source with line numbers, instead of cat or sed on a whole file",
|
|
72804
|
+
description: `Takes a symbol name or path:line and prints only that symbol's span: a header "path:start-end kind name", then numbered lines. The end comes from the next symbol in the file, tightened by a bracket scan (an indent scan for Python). Output is capped at 200 lines; a longer span ends with "truncated, N more lines: overlane code show path:line --from X". --context adds lines around the span. When a name has several definitions the best one is shown and the others are listed on an "also:" line. ${NOTE}`,
|
|
72805
|
+
args: [{ name: "target", required: true, description: "A symbol name, or path:line (any line inside the symbol)" }],
|
|
72806
|
+
flags: [
|
|
72807
|
+
{ name: "context", type: "string", value: "N", default: "0", description: "Extra lines before and after the span" },
|
|
72808
|
+
{ name: "from", type: "string", value: "LINE", description: "Start printing at this line (continue a truncated span)" },
|
|
72809
|
+
{ name: "max", type: "string", value: "N", default: "200", description: "Most lines to print (default 200)" },
|
|
72810
|
+
{ name: "kind", type: "string", value: "KIND", description: "When showing by name, only this kind" }
|
|
72811
|
+
],
|
|
72812
|
+
examples: ["overlane code show hashSecret", "overlane code show apps/api-worker/src/identity/store.ts:24 --context 3"],
|
|
72813
|
+
keywords: ["cat", "sed", "read function", "read file", "show source", "print symbol", "line range", "view code"],
|
|
72814
|
+
run: (ctx, v, p2) => codeShow(ctx, { target: p2[0], context: intFlag(v, "context", 0), from: intFlag(v, "from", 1), max: intFlag(v, "max", 1), kind: str(v, "kind") })
|
|
72815
|
+
},
|
|
72816
|
+
{
|
|
72817
|
+
path: ["code", "outline"],
|
|
72818
|
+
summary: "List a file's symbols, one per line: line, kind, name",
|
|
72819
|
+
description: `Prints "line kind name" for each symbol the code index holds for the file (properties are left out unless --all). A file that changed since the index was built, or is not in it, gets a pattern-based outline and a one-line note. ${NOTE}`,
|
|
72820
|
+
args: [{ name: "path", required: true, description: "File path, relative to the repository root or the current directory" }],
|
|
72821
|
+
flags: [{ name: "all", type: "boolean", description: "Also list properties and fields" }],
|
|
72822
|
+
examples: ["overlane code outline packages/cli/src/registry/run.ts"],
|
|
72823
|
+
keywords: ["file map", "list functions in file", "outline", "table of contents", "symbols in file"],
|
|
72824
|
+
run: (ctx, v, p2) => codeOutline(ctx, { path: p2[0], all: v["all"] === true })
|
|
72825
|
+
},
|
|
72826
|
+
{
|
|
72827
|
+
path: ["code", "refs"],
|
|
72828
|
+
summary: "List callers and other uses of a symbol: path:line plus the trimmed line",
|
|
72829
|
+
description: `Prints the callers the index records for the name ("caller qualified path:line"), then the literal git grep -n -w matches that are not already listed, as "path:line text". Definitions and import lines are not repeated (import lines are counted). At most --limit lines (default 30). ${NOTE}`,
|
|
72830
|
+
args: [{ name: "name", required: true, description: "Symbol name" }],
|
|
72831
|
+
flags: [{ name: "limit", type: "string", value: "N", default: "30", description: "Most lines to print (default 30)" }],
|
|
72832
|
+
examples: ["overlane code refs hashSecret", "overlane code refs createRegistry --limit 10"],
|
|
72833
|
+
keywords: ["who calls", "callers", "usages", "references", "find usages", "grep references"],
|
|
72834
|
+
run: (ctx, v, p2) => codeRefs(ctx, { name: p2[0], limit: intFlag(v, "limit", 1) })
|
|
72835
|
+
},
|
|
72836
|
+
{
|
|
72837
|
+
path: ["exec"],
|
|
72838
|
+
summary: "Run a command; keep the full output in a log and print a short status and parsed summary",
|
|
72839
|
+
description: `Runs the command after -- through the shell, streams nothing, saves stdout and stderr to .harness/logs/TIMESTAMP-NAME.log, and prints one line "ok|FAIL exit=N 12.3s log=PATH" followed by a summary parsed from the output: vitest (files and tests per package, each failing test with the first lines of its assertion), tsc (error count and the first 10 errors), esbuild and astro build errors, wrangler deploy (version id, routes, errors), wrangler d1 (bookmark, applied migrations), git push (ref updates or the rejection). A command it does not know prints nothing more on success and its last 20 lines on failure. The exit code is the command's. A failure always shows its cause; the full text is in the log.`,
|
|
72840
|
+
args: [{ name: "command", required: true, variadic: true, description: "The command and its arguments, after --" }],
|
|
72841
|
+
flags: [{ name: "name", type: "string", value: "NAME", description: "Label used in the log file name" }],
|
|
72842
|
+
examples: ["overlane exec -- pnpm -r test", "overlane exec --name typecheck -- pnpm -r typecheck", "overlane exec -- 'git push -u origin wip/unit'"],
|
|
72843
|
+
keywords: ["run tests", "run build", "typecheck", "wrangler deploy", "short output", "log to file", "quiet", "test summary", "git push"],
|
|
72844
|
+
run: (ctx, v, p2) => execCommand(ctx, { tokens: p2, name: str(v, "name") })
|
|
72845
|
+
},
|
|
72846
|
+
{
|
|
72847
|
+
path: ["brief"],
|
|
72848
|
+
summary: "Repository state in one line and the open P0 lines of TASKS.md",
|
|
72849
|
+
description: `git: "branch sha7 ahead N behind N of upstream, N dirty, last: subject" in one line, in place of git status and git log. tasks: the unticked "- [ ] P0" lines of TASKS.md cut to 160 characters (a repository without TASKS.md points at overlane task status). all (the default) prints both. Works offline.`,
|
|
72850
|
+
args: [{ name: "what", required: false, description: "git, tasks or all (default all)" }],
|
|
72851
|
+
flags: [],
|
|
72852
|
+
examples: ["overlane brief", "overlane brief git", "overlane brief tasks"],
|
|
72853
|
+
keywords: ["git status", "git log", "branch", "dirty", "last commit", "open tasks", "P0", "state of the repo"],
|
|
72854
|
+
run: (ctx, _v, p2) => {
|
|
72855
|
+
const mode = p2[0];
|
|
72856
|
+
if (mode !== void 0 && mode !== "git" && mode !== "tasks" && mode !== "all") throw new CoreError(`brief takes git, tasks or all; got "${mode}"`, { exit: 2, code: "usage", hint: "overlane brief git" });
|
|
72857
|
+
return brief(ctx, { mode });
|
|
72858
|
+
}
|
|
72859
|
+
},
|
|
72860
|
+
{
|
|
72861
|
+
path: ["tokens", "report"],
|
|
72862
|
+
summary: "Where tool-call tokens went, by category, with the terse command that replaces each",
|
|
72863
|
+
description: `Reads .harness/token-ledger.jsonl (one JSON object per tool call: ts, tool, category, inChars, outChars, command) or, with --transcript, a Claude Code transcript (tool_use and tool_result pairs, Bash calls categorised by command: test, typecheck, wrangler, build, git, grep/sed/cat, curl, other). Prints the top categories by estimated tokens (characters / 4) with calls, average and the suggested replacement: grep, cat and sed to overlane code find, show, outline and refs; test, typecheck, build and wrangler to overlane exec; git status and log to overlane brief git. ${NOTE}`,
|
|
72864
|
+
args: [],
|
|
72865
|
+
flags: [
|
|
72866
|
+
{ name: "since", type: "string", value: "WINDOW", description: "Only calls in this window: 7d, 12h, 30m, 2w or a date" },
|
|
72867
|
+
{ name: "top", type: "string", value: "N", default: "10", description: "Categories to print (default 10)" },
|
|
72868
|
+
{ name: "transcript", type: "string", value: "PATH", description: "Read a Claude Code transcript (.jsonl) instead of the ledger" }
|
|
72869
|
+
],
|
|
72870
|
+
examples: ["overlane tokens report --since 7d", "overlane tokens report --transcript ~/.claude/projects/x/session.jsonl --top 5"],
|
|
72871
|
+
keywords: ["token burn", "token usage", "cost", "tool output size", "what is expensive", "reduce tokens"],
|
|
72872
|
+
run: (ctx, v) => tokensReport(ctx, { since: str(v, "since"), top: intFlag(v, "top", 1), transcript: str(v, "transcript") })
|
|
72873
|
+
}
|
|
72874
|
+
];
|
|
72875
|
+
var LEAN_ROOTS = new Set(TOKEN_COMMANDS.map((c2) => c2.path[0]));
|
|
72876
|
+
|
|
72877
|
+
// ../cli/src/commands/token-lib.ts
|
|
72878
|
+
function tokenCommand(path, result, effect = "read") {
|
|
72879
|
+
const table2 = TOKEN_COMMANDS.find((c2) => c2.path.join(" ") === path.join(" "));
|
|
72880
|
+
if (table2 === void 0) throw new Error(`no token command ${path.join(" ")}`);
|
|
72881
|
+
return defineCommand({
|
|
72882
|
+
path: table2.path,
|
|
72883
|
+
summary: table2.summary,
|
|
72884
|
+
description: table2.description,
|
|
72885
|
+
args: table2.args,
|
|
72886
|
+
flags: table2.flags,
|
|
72887
|
+
examples: table2.examples,
|
|
72888
|
+
keywords: table2.keywords,
|
|
72889
|
+
effect,
|
|
72890
|
+
needsAuth: false,
|
|
72891
|
+
needsNetwork: false,
|
|
72892
|
+
textDefault: true,
|
|
72893
|
+
result,
|
|
72894
|
+
handler: async (inv) => {
|
|
72895
|
+
if (inv.dryRun) {
|
|
72896
|
+
const line3 = inv.positionals.join(" ");
|
|
72897
|
+
return planOutcome(inv.deps, dryRunPlan({ commands: [line3], writes: [{ path: ".harness/logs", action: "write", description: "the full output of the command, in a new log file" }] }));
|
|
72898
|
+
}
|
|
72899
|
+
const ctx = nodeCtx(inv.deps.paths.cwd, inv.deps.env, inv.deps.now);
|
|
72900
|
+
try {
|
|
72901
|
+
const out2 = await table2.run(ctx, inv.values, inv.positionals);
|
|
72902
|
+
for (const line3 of out2.lines) say(inv.deps, line3);
|
|
72903
|
+
return { data: out2.data, exit: out2.exit };
|
|
72904
|
+
} catch (error62) {
|
|
72905
|
+
if (error62 instanceof CoreError) throw new CliError(error62.message, { code: error62.code, exit: error62.exit, ...error62.hint === void 0 ? {} : { hint: error62.hint } });
|
|
72906
|
+
throw error62;
|
|
72907
|
+
}
|
|
72908
|
+
}
|
|
72909
|
+
});
|
|
72910
|
+
}
|
|
72911
|
+
|
|
72912
|
+
// ../cli/src/commands/code.ts
|
|
72913
|
+
var Show2 = CodeNavMeta.extend({
|
|
72914
|
+
path: external_exports.string(),
|
|
72915
|
+
kind: external_exports.string(),
|
|
72916
|
+
qualified: external_exports.string(),
|
|
72917
|
+
start: external_exports.number().int(),
|
|
72918
|
+
end: external_exports.number().int(),
|
|
72919
|
+
from: external_exports.number().int(),
|
|
72920
|
+
to: external_exports.number().int(),
|
|
72921
|
+
truncated: external_exports.boolean(),
|
|
72922
|
+
remaining: external_exports.number().int(),
|
|
72923
|
+
/** Numbered source lines, "N<TAB>text". */
|
|
72924
|
+
text: external_exports.array(external_exports.string()),
|
|
72925
|
+
also: external_exports.array(external_exports.object({ kind: external_exports.string(), qualified: external_exports.string(), path: external_exports.string(), line: external_exports.number().int() }).passthrough())
|
|
72926
|
+
}).passthrough();
|
|
72927
|
+
var codeCommands = [
|
|
72928
|
+
tokenCommand(["code", "find"], CodeFindAnswer.passthrough()),
|
|
72929
|
+
tokenCommand(["code", "show"], Show2),
|
|
72930
|
+
tokenCommand(["code", "outline"], CodeOutlineAnswer.passthrough()),
|
|
72931
|
+
tokenCommand(["code", "refs"], CodeRefsAnswer.passthrough())
|
|
72932
|
+
];
|
|
72933
|
+
|
|
72934
|
+
// ../cli/src/commands/exec.ts
|
|
72935
|
+
init_zod();
|
|
72936
|
+
var execCommands = [
|
|
72937
|
+
tokenCommand(
|
|
72938
|
+
["exec"],
|
|
72939
|
+
withDryRun(external_exports.object({ ok: external_exports.boolean(), exit: external_exports.number().int(), seconds: external_exports.number(), log: external_exports.string(), command: external_exports.string(), kinds: external_exports.array(external_exports.string()), summary: external_exports.array(external_exports.string()) }).strict()),
|
|
72940
|
+
"write"
|
|
72941
|
+
)
|
|
72942
|
+
];
|
|
72943
|
+
|
|
72944
|
+
// ../cli/src/commands/brief.ts
|
|
72945
|
+
init_zod();
|
|
72946
|
+
var Git = external_exports.object({ branch: external_exports.string(), sha: external_exports.string(), upstream: external_exports.string().nullable(), ahead: external_exports.number().int(), behind: external_exports.number().int(), dirty: external_exports.number().int(), subject: external_exports.string() }).strict();
|
|
72947
|
+
var Tasks = external_exports.object({ source: external_exports.enum(["TASKS.md", "none"]), open: external_exports.array(external_exports.string()), more: external_exports.number().int() }).strict();
|
|
72948
|
+
var briefCommands = [tokenCommand(["brief"], external_exports.object({ git: Git.nullable().optional(), tasks: Tasks.optional() }).strict())];
|
|
72949
|
+
|
|
72950
|
+
// ../cli/src/commands/tokens.ts
|
|
72951
|
+
init_zod();
|
|
72952
|
+
var Row = external_exports.object({ category: external_exports.string(), calls: external_exports.number().int(), inTokens: external_exports.number().int(), outTokens: external_exports.number().int(), tokens: external_exports.number().int(), avg: external_exports.number().int(), suggestion: external_exports.string() }).strict();
|
|
72953
|
+
var tokensCommands = [
|
|
72954
|
+
tokenCommand(["tokens", "report"], external_exports.object({ source: external_exports.string(), since: external_exports.string().nullable(), calls: external_exports.number().int(), tokens: external_exports.number().int(), skipped: external_exports.number().int(), rows: external_exports.array(Row) }).strict())
|
|
72955
|
+
];
|
|
72956
|
+
|
|
71480
72957
|
// ../cli/src/commands/index.ts
|
|
71481
72958
|
function coreCommands() {
|
|
71482
72959
|
return [
|
|
@@ -71516,7 +72993,11 @@ function coreCommands() {
|
|
|
71516
72993
|
...repoCommands,
|
|
71517
72994
|
...ciCommands,
|
|
71518
72995
|
...deployCommands,
|
|
71519
|
-
...enterpriseCommands
|
|
72996
|
+
...enterpriseCommands,
|
|
72997
|
+
...codeCommands,
|
|
72998
|
+
...execCommands,
|
|
72999
|
+
...briefCommands,
|
|
73000
|
+
...tokensCommands
|
|
71520
73001
|
];
|
|
71521
73002
|
}
|
|
71522
73003
|
function createRegistry(extra = []) {
|
|
@@ -71589,10 +73070,10 @@ function extractGlobals(argv) {
|
|
|
71589
73070
|
}
|
|
71590
73071
|
return out2;
|
|
71591
73072
|
}
|
|
71592
|
-
var
|
|
71593
|
-
function outputMode(globals, deps) {
|
|
73073
|
+
var quote3 = (token) => /^[A-Za-z0-9_@%+=:,./-]+$/.test(token) ? token : `'${token.replaceAll("'", "'\\''")}'`;
|
|
73074
|
+
function outputMode(globals, deps, textDefault) {
|
|
71594
73075
|
if (globals.json) return "json";
|
|
71595
|
-
if (globals.text) return "text";
|
|
73076
|
+
if (globals.text || textDefault) return "text";
|
|
71596
73077
|
return deps.stdoutIsTTY ?? deps.isTTY ? "text" : "json";
|
|
71597
73078
|
}
|
|
71598
73079
|
function printLines(deps, lines) {
|
|
@@ -71622,7 +73103,7 @@ function unknownCommand(registry2, tokens) {
|
|
|
71622
73103
|
const near = closestCommands(pool, tokens);
|
|
71623
73104
|
const first = near[0];
|
|
71624
73105
|
if (first === void 0) {
|
|
71625
|
-
return new UsageError(`unknown command "${typed}"; run \`overlane commands\` to list them or \`overlane search "<task>"\` to find one`, { code: "unknown_command", hint: `overlane search ${
|
|
73106
|
+
return new UsageError(`unknown command "${typed}"; run \`overlane commands\` to list them or \`overlane search "<task>"\` to find one`, { code: "unknown_command", hint: `overlane search ${quote3(typed)}` });
|
|
71626
73107
|
}
|
|
71627
73108
|
return new UsageError(`unknown command "${typed}"; did you mean: ${near.map((spec) => `overlane ${commandName(spec)}`).join(", ")}`, {
|
|
71628
73109
|
code: "unknown_command",
|
|
@@ -71641,7 +73122,7 @@ async function runCli(argv, deps, options) {
|
|
|
71641
73122
|
const { registry: registry2 } = options;
|
|
71642
73123
|
const version2 = options.version ?? "";
|
|
71643
73124
|
const globals = extractGlobals(argv);
|
|
71644
|
-
const mode = outputMode(globals, deps);
|
|
73125
|
+
const mode = outputMode(globals, deps, registry2.find(globals.tokens)?.spec.textDefault === true);
|
|
71645
73126
|
rememberSecret(deps.env["HARNESS_TOKEN"]);
|
|
71646
73127
|
const inner = mode === "json" ? { ...deps, stdout: globals.verbose ? (text) => deps.stderr(redact(text)) : () => void 0 } : deps;
|
|
71647
73128
|
const [first, ...more] = globals.tokens;
|
|
@@ -71669,7 +73150,7 @@ async function runCli(argv, deps, options) {
|
|
|
71669
73150
|
const parsed = spec.style === "passthrough" ? { values: {}, positionals: [] } : parseFor(spec, rest);
|
|
71670
73151
|
const safety = spec.style === "passthrough" ? safetyFlags(rest) : { dryRun: parsed.values["dry-run"] === true, force: parsed.values["force"] === true };
|
|
71671
73152
|
if (spec.effect === "destructive" && !safety.dryRun && !safety.force && !deps.isTTY) {
|
|
71672
|
-
const line3 = ["overlane", ...globals.tokens, "--force"].map(
|
|
73153
|
+
const line3 = ["overlane", ...globals.tokens, "--force"].map(quote3).join(" ");
|
|
71673
73154
|
throw new UsageError(`overlane ${commandName(spec)} is destructive and there is no terminal to confirm on; pass --force to proceed, or --dry-run to preview`, {
|
|
71674
73155
|
code: "force_required",
|
|
71675
73156
|
hint: line3
|
|
@@ -71737,37 +73218,37 @@ init_src2();
|
|
|
71737
73218
|
|
|
71738
73219
|
// src/data-dir.ts
|
|
71739
73220
|
import { homedir } from "node:os";
|
|
71740
|
-
import { join as
|
|
73221
|
+
import { join as join35 } from "node:path";
|
|
71741
73222
|
function dataDir(env = process.env, home = homedir()) {
|
|
71742
73223
|
const override = env["MVRX_DATA_DIR"];
|
|
71743
73224
|
if (override !== void 0 && override !== "") return override;
|
|
71744
|
-
const base5 = env["XDG_DATA_HOME"] ?? (process.platform === "win32" ? env["LOCALAPPDATA"] : void 0) ?? (process.platform === "darwin" ?
|
|
71745
|
-
return
|
|
73225
|
+
const base5 = env["XDG_DATA_HOME"] ?? (process.platform === "win32" ? env["LOCALAPPDATA"] : void 0) ?? (process.platform === "darwin" ? join35(home, "Library", "Application Support") : join35(home, ".local", "share"));
|
|
73226
|
+
return join35(base5, "mvrx-harness");
|
|
71746
73227
|
}
|
|
71747
73228
|
function marketplaceRoot(env = process.env, home = homedir()) {
|
|
71748
|
-
return
|
|
73229
|
+
return join35(dataDir(env, home), "marketplace");
|
|
71749
73230
|
}
|
|
71750
73231
|
|
|
71751
73232
|
// src/plugin.ts
|
|
71752
|
-
import { readFileSync as
|
|
71753
|
-
import { join as
|
|
73233
|
+
import { readFileSync as readFileSync20 } from "node:fs";
|
|
73234
|
+
import { join as join37 } from "node:path";
|
|
71754
73235
|
import { parseArgs as parseArgs3 } from "node:util";
|
|
71755
73236
|
|
|
71756
73237
|
// src/marketplace.ts
|
|
71757
73238
|
init_src();
|
|
71758
73239
|
import { createHash as createHash7 } from "node:crypto";
|
|
71759
|
-
import { cpSync, existsSync as
|
|
71760
|
-
import { dirname as
|
|
73240
|
+
import { cpSync, existsSync as existsSync13, mkdirSync as mkdirSync11, readdirSync as readdirSync3, readFileSync as readFileSync19, renameSync as renameSync7, rmSync as rmSync4, statSync as statSync3, writeFileSync as writeFileSync10 } from "node:fs";
|
|
73241
|
+
import { dirname as dirname12, join as join36, relative as relative4, sep } from "node:path";
|
|
71761
73242
|
var CLIENT_DIRS = ["claude", "codex"];
|
|
71762
73243
|
var EMBEDDED_MANIFEST = "release-manifest.json";
|
|
71763
|
-
var INSTALLED_MANIFEST =
|
|
73244
|
+
var INSTALLED_MANIFEST = join36(".release", "manifest.json");
|
|
71764
73245
|
var MarketplaceError = class extends Error {
|
|
71765
73246
|
};
|
|
71766
73247
|
function loadEmbedded(packageRoot2) {
|
|
71767
|
-
const dir =
|
|
71768
|
-
const path =
|
|
71769
|
-
if (!
|
|
71770
|
-
const parsed = ReleaseManifest.safeParse(JSON.parse(
|
|
73248
|
+
const dir = join36(packageRoot2, "plugins");
|
|
73249
|
+
const path = join36(dir, EMBEDDED_MANIFEST);
|
|
73250
|
+
if (!existsSync13(path)) throw new MarketplaceError(`this package has no embedded plugin release (${path} is missing)`);
|
|
73251
|
+
const parsed = ReleaseManifest.safeParse(JSON.parse(readFileSync19(path, "utf8")));
|
|
71771
73252
|
if (!parsed.success) throw new MarketplaceError(`the embedded release manifest is invalid: ${parsed.error.message}`);
|
|
71772
73253
|
return { dir, manifest: parsed.data };
|
|
71773
73254
|
}
|
|
@@ -71775,12 +73256,12 @@ function sha2562(data) {
|
|
|
71775
73256
|
return `sha256:${createHash7("sha256").update(data).digest("hex")}`;
|
|
71776
73257
|
}
|
|
71777
73258
|
function listFiles(root, dir = root) {
|
|
71778
|
-
if (!
|
|
73259
|
+
if (!existsSync13(dir)) return [];
|
|
71779
73260
|
const out2 = [];
|
|
71780
73261
|
for (const entry of readdirSync3(dir, { withFileTypes: true })) {
|
|
71781
|
-
const full =
|
|
73262
|
+
const full = join36(dir, entry.name);
|
|
71782
73263
|
if (entry.isDirectory()) out2.push(...listFiles(root, full));
|
|
71783
|
-
else out2.push(
|
|
73264
|
+
else out2.push(relative4(root, full).split(sep).join("/"));
|
|
71784
73265
|
}
|
|
71785
73266
|
return out2.sort();
|
|
71786
73267
|
}
|
|
@@ -71790,15 +73271,15 @@ async function verifyTree(treeRoot, manifest) {
|
|
|
71790
73271
|
if (recomputed !== manifest.digest) problems.push(`manifest digest ${manifest.digest} does not match its file list (${recomputed})`);
|
|
71791
73272
|
const listed = new Set(manifest.files.map((file2) => file2.path));
|
|
71792
73273
|
for (const file2 of manifest.files) {
|
|
71793
|
-
const path =
|
|
71794
|
-
if (!
|
|
73274
|
+
const path = join36(treeRoot, file2.path);
|
|
73275
|
+
if (!existsSync13(path)) {
|
|
71795
73276
|
problems.push(`missing: ${file2.path}`);
|
|
71796
73277
|
continue;
|
|
71797
73278
|
}
|
|
71798
|
-
if (sha2562(
|
|
73279
|
+
if (sha2562(readFileSync19(path)) !== file2.digest) problems.push(`modified: ${file2.path}`);
|
|
71799
73280
|
}
|
|
71800
73281
|
for (const client of CLIENT_DIRS) {
|
|
71801
|
-
for (const found of listFiles(
|
|
73282
|
+
for (const found of listFiles(join36(treeRoot, client))) {
|
|
71802
73283
|
if (!listed.has(`${client}/${found}`)) problems.push(`unlisted: ${client}/${found}`);
|
|
71803
73284
|
}
|
|
71804
73285
|
}
|
|
@@ -71806,7 +73287,7 @@ async function verifyTree(treeRoot, manifest) {
|
|
|
71806
73287
|
}
|
|
71807
73288
|
function readInstalledManifest(target2) {
|
|
71808
73289
|
try {
|
|
71809
|
-
const parsed = ReleaseManifest.safeParse(JSON.parse(
|
|
73290
|
+
const parsed = ReleaseManifest.safeParse(JSON.parse(readFileSync19(join36(target2, INSTALLED_MANIFEST), "utf8")));
|
|
71810
73291
|
return parsed.success ? parsed.data : null;
|
|
71811
73292
|
} catch {
|
|
71812
73293
|
return null;
|
|
@@ -71831,23 +73312,23 @@ async function syncMarketplace(embedded, target2) {
|
|
|
71831
73312
|
const staging = `${target2}.new-${process.pid}`;
|
|
71832
73313
|
const previous = `${target2}.old-${process.pid}`;
|
|
71833
73314
|
rmSync4(staging, { recursive: true, force: true });
|
|
71834
|
-
|
|
73315
|
+
mkdirSync11(staging, { recursive: true });
|
|
71835
73316
|
try {
|
|
71836
73317
|
for (const client of CLIENT_DIRS) {
|
|
71837
|
-
if (
|
|
73318
|
+
if (existsSync13(join36(embedded.dir, client))) cpSync(join36(embedded.dir, client), join36(staging, client), { recursive: true });
|
|
71838
73319
|
}
|
|
71839
|
-
|
|
71840
|
-
writeFileSync10(
|
|
73320
|
+
mkdirSync11(join36(staging, ".release"), { recursive: true });
|
|
73321
|
+
writeFileSync10(join36(staging, INSTALLED_MANIFEST), `${JSON.stringify(embedded.manifest, null, 2)}
|
|
71841
73322
|
`);
|
|
71842
73323
|
const after = await verifyTree(staging, embedded.manifest);
|
|
71843
73324
|
if (after.length > 0) throw new MarketplaceError(`the copied plugin files do not match the release manifest:
|
|
71844
73325
|
${after.join("\n ")}`);
|
|
71845
|
-
|
|
71846
|
-
if (
|
|
73326
|
+
mkdirSync11(dirname12(target2), { recursive: true });
|
|
73327
|
+
if (existsSync13(target2)) renameSync7(target2, previous);
|
|
71847
73328
|
try {
|
|
71848
73329
|
renameSync7(staging, target2);
|
|
71849
73330
|
} catch (error62) {
|
|
71850
|
-
if (
|
|
73331
|
+
if (existsSync13(previous)) renameSync7(previous, target2);
|
|
71851
73332
|
throw error62;
|
|
71852
73333
|
}
|
|
71853
73334
|
rmSync4(previous, { recursive: true, force: true });
|
|
@@ -71857,7 +73338,7 @@ async function syncMarketplace(embedded, target2) {
|
|
|
71857
73338
|
}
|
|
71858
73339
|
async function ensureMarketplace(embedded, target2) {
|
|
71859
73340
|
const installed = readInstalledManifest(target2);
|
|
71860
|
-
const present =
|
|
73341
|
+
const present = existsSync13(target2) && statSync3(target2).isDirectory();
|
|
71861
73342
|
if (installed !== null && present && !isNewer(embedded.manifest.version, installed.version)) return false;
|
|
71862
73343
|
await syncMarketplace(embedded, target2);
|
|
71863
73344
|
return true;
|
|
@@ -71869,8 +73350,8 @@ var PLUGIN_USAGE = ` overlane plugin install [--scope project|user] [--client c
|
|
|
71869
73350
|
var PluginUsageError = class extends Error {
|
|
71870
73351
|
};
|
|
71871
73352
|
function readNames(treeRoot, client) {
|
|
71872
|
-
const file2 = client === "claude" ?
|
|
71873
|
-
const parsed = JSON.parse(
|
|
73353
|
+
const file2 = client === "claude" ? join37(treeRoot, "claude", ".claude-plugin", "marketplace.json") : join37(treeRoot, "codex", ".agents", "plugins", "marketplace.json");
|
|
73354
|
+
const parsed = JSON.parse(readFileSync20(file2, "utf8"));
|
|
71874
73355
|
const record3 = parsed;
|
|
71875
73356
|
const plugin = record3.plugins?.[0]?.name;
|
|
71876
73357
|
if (typeof record3.name !== "string" || typeof plugin !== "string") throw new MarketplaceError(`${file2} names no marketplace or plugin`);
|
|
@@ -71916,7 +73397,7 @@ ${PLUGIN_USAGE}`);
|
|
|
71916
73397
|
const key = `${names.plugin}@${names.marketplace}`;
|
|
71917
73398
|
if (!await available(deps, client)) {
|
|
71918
73399
|
if (explicit !== void 0) {
|
|
71919
|
-
deps.stderr(`overlane: \`${client}\` was not found on PATH; the marketplace is at ${
|
|
73400
|
+
deps.stderr(`overlane: \`${client}\` was not found on PATH; the marketplace is at ${join37(root, client)}
|
|
71920
73401
|
`);
|
|
71921
73402
|
failed = true;
|
|
71922
73403
|
} else {
|
|
@@ -71928,7 +73409,7 @@ ${PLUGIN_USAGE}`);
|
|
|
71928
73409
|
ranAny = true;
|
|
71929
73410
|
deps.stdout(`${client}:
|
|
71930
73411
|
`);
|
|
71931
|
-
const dir =
|
|
73412
|
+
const dir = join37(root, client);
|
|
71932
73413
|
const steps = client === "claude" ? [
|
|
71933
73414
|
["claude", ["plugin", "marketplace", "add", dir, "--scope", scope]],
|
|
71934
73415
|
["claude", ["plugin", "marketplace", "update", names.marketplace]],
|
|
@@ -72094,13 +73575,13 @@ var pluginInstallCommand = defineCommand({
|
|
|
72094
73575
|
var packageCommands = [indexBuildCommand, indexUploadCommand, shimCommand, pluginInstallCommand];
|
|
72095
73576
|
|
|
72096
73577
|
// src/deps.ts
|
|
72097
|
-
import { execFile as
|
|
73578
|
+
import { execFile as execFile5, spawn as spawn2 } from "node:child_process";
|
|
72098
73579
|
import { homedir as homedir3 } from "node:os";
|
|
72099
|
-
import { join as
|
|
73580
|
+
import { join as join40 } from "node:path";
|
|
72100
73581
|
import { createInterface } from "node:readline/promises";
|
|
72101
73582
|
function exec(command, args2, options) {
|
|
72102
73583
|
return new Promise((resolveResult) => {
|
|
72103
|
-
|
|
73584
|
+
execFile5(command, [...args2], { cwd: options?.cwd, encoding: "utf8", maxBuffer: 16 * 1024 * 1024 }, (error62, stdout, stderr) => {
|
|
72104
73585
|
if (error62 === null) {
|
|
72105
73586
|
resolveResult({ code: 0, stdout, stderr });
|
|
72106
73587
|
} else if ("code" in error62 && typeof error62.code === "number") {
|
|
@@ -72125,7 +73606,7 @@ var noKeychain = {
|
|
|
72125
73606
|
function openBrowser(url2) {
|
|
72126
73607
|
const [command, args2] = process.platform === "darwin" ? ["open", [url2]] : process.platform === "win32" ? ["cmd", ["/c", "start", "", url2]] : ["xdg-open", [url2]];
|
|
72127
73608
|
return new Promise((resolveOpen, reject) => {
|
|
72128
|
-
const child =
|
|
73609
|
+
const child = spawn2(command, args2, { stdio: "ignore", detached: true });
|
|
72129
73610
|
child.once("error", reject);
|
|
72130
73611
|
child.once("spawn", () => {
|
|
72131
73612
|
child.unref();
|
|
@@ -72142,8 +73623,8 @@ async function confirm(question) {
|
|
|
72142
73623
|
}
|
|
72143
73624
|
}
|
|
72144
73625
|
function configDir2(env) {
|
|
72145
|
-
const base5 = env["XDG_CONFIG_HOME"] ?? (process.platform === "win32" ? env["APPDATA"] : void 0) ??
|
|
72146
|
-
return
|
|
73626
|
+
const base5 = env["XDG_CONFIG_HOME"] ?? (process.platform === "win32" ? env["APPDATA"] : void 0) ?? join40(homedir3(), ".config");
|
|
73627
|
+
return join40(base5, "mvrx-harness");
|
|
72147
73628
|
}
|
|
72148
73629
|
function createDeps2(env = process.env) {
|
|
72149
73630
|
return {
|