agentsmesh 0.12.0 → 0.14.0
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/CHANGELOG.md +18 -0
- package/README.md +20 -4
- package/dist/canonical.js +89 -36
- package/dist/canonical.js.map +1 -1
- package/dist/cli.js +152 -126
- package/dist/engine.js +111 -58
- package/dist/engine.js.map +1 -1
- package/dist/index.js +111 -58
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/engine.js
CHANGED
|
@@ -1385,12 +1385,12 @@ function topLevelDotfilePrefixes(descriptor19) {
|
|
|
1385
1385
|
...layouts.flatMap((l) => l.managedOutputs?.dirs ?? []),
|
|
1386
1386
|
...layouts.flatMap((l) => l.managedOutputs?.files ?? [])
|
|
1387
1387
|
];
|
|
1388
|
-
const
|
|
1388
|
+
const out2 = /* @__PURE__ */ new Set();
|
|
1389
1389
|
for (const candidate of candidates) {
|
|
1390
1390
|
const top = candidate.split("/")[0];
|
|
1391
|
-
if (top && top.startsWith(".") && top.length > 1)
|
|
1391
|
+
if (top && top.startsWith(".") && top.length > 1) out2.add(`${top}/`);
|
|
1392
1392
|
}
|
|
1393
|
-
return
|
|
1393
|
+
return out2;
|
|
1394
1394
|
}
|
|
1395
1395
|
function buildDefaultRootRelativePrefixes() {
|
|
1396
1396
|
const set = /* @__PURE__ */ new Set([".agentsmesh/"]);
|
|
@@ -2133,12 +2133,12 @@ async function readExistingServers(path) {
|
|
|
2133
2133
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return {};
|
|
2134
2134
|
const raw = parsed.mcpServers;
|
|
2135
2135
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return {};
|
|
2136
|
-
const
|
|
2136
|
+
const out2 = {};
|
|
2137
2137
|
for (const [name, value] of Object.entries(raw)) {
|
|
2138
2138
|
if (!value || typeof value !== "object" || Array.isArray(value)) continue;
|
|
2139
|
-
|
|
2139
|
+
out2[name] = value;
|
|
2140
2140
|
}
|
|
2141
|
-
return
|
|
2141
|
+
return out2;
|
|
2142
2142
|
}
|
|
2143
2143
|
var init_mcp_merge = __esm({
|
|
2144
2144
|
"src/targets/import/mcp-merge.ts"() {
|
|
@@ -2421,13 +2421,13 @@ function parseMcpJson(content) {
|
|
|
2421
2421
|
if (!parsed || typeof parsed !== "object") return {};
|
|
2422
2422
|
const raw = parsed.mcpServers;
|
|
2423
2423
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return {};
|
|
2424
|
-
const
|
|
2424
|
+
const out2 = {};
|
|
2425
2425
|
for (const [name, value] of Object.entries(raw)) {
|
|
2426
2426
|
if (!value || typeof value !== "object" || Array.isArray(value)) continue;
|
|
2427
2427
|
const server = value;
|
|
2428
2428
|
const description = typeof server.description === "string" ? server.description : void 0;
|
|
2429
2429
|
if (typeof server.command === "string") {
|
|
2430
|
-
|
|
2430
|
+
out2[name] = {
|
|
2431
2431
|
type: typeof server.type === "string" ? server.type : "stdio",
|
|
2432
2432
|
command: server.command,
|
|
2433
2433
|
args: toStringArray5(server.args),
|
|
@@ -2437,7 +2437,7 @@ function parseMcpJson(content) {
|
|
|
2437
2437
|
continue;
|
|
2438
2438
|
}
|
|
2439
2439
|
if (typeof server.url === "string") {
|
|
2440
|
-
|
|
2440
|
+
out2[name] = {
|
|
2441
2441
|
type: typeof server.type === "string" ? server.type : "http",
|
|
2442
2442
|
url: server.url,
|
|
2443
2443
|
headers: toStringRecord(server.headers),
|
|
@@ -2446,7 +2446,7 @@ function parseMcpJson(content) {
|
|
|
2446
2446
|
};
|
|
2447
2447
|
}
|
|
2448
2448
|
}
|
|
2449
|
-
return
|
|
2449
|
+
return out2;
|
|
2450
2450
|
}
|
|
2451
2451
|
async function runMcpJson(spec, sources, projectRoot, fromTool) {
|
|
2452
2452
|
if (!spec.canonicalFilename) {
|
|
@@ -10737,18 +10737,18 @@ function generateRules11(canonical) {
|
|
|
10737
10737
|
return outputs;
|
|
10738
10738
|
}
|
|
10739
10739
|
function toJunieMcpServer(server) {
|
|
10740
|
-
const
|
|
10741
|
-
if (server.description)
|
|
10742
|
-
if (server.type !== "stdio")
|
|
10740
|
+
const out2 = {};
|
|
10741
|
+
if (server.description) out2.description = server.description;
|
|
10742
|
+
if (server.type !== "stdio") out2.type = server.type;
|
|
10743
10743
|
if (isStdioMcpServer(server)) {
|
|
10744
|
-
|
|
10745
|
-
|
|
10744
|
+
out2.command = server.command;
|
|
10745
|
+
out2.args = server.args;
|
|
10746
10746
|
} else {
|
|
10747
|
-
|
|
10748
|
-
if (Object.keys(server.headers).length > 0)
|
|
10747
|
+
out2.url = server.url;
|
|
10748
|
+
if (Object.keys(server.headers).length > 0) out2.headers = server.headers;
|
|
10749
10749
|
}
|
|
10750
|
-
if (Object.keys(server.env).length > 0)
|
|
10751
|
-
return
|
|
10750
|
+
if (Object.keys(server.env).length > 0) out2.env = server.env;
|
|
10751
|
+
return out2;
|
|
10752
10752
|
}
|
|
10753
10753
|
function generateMcp7(canonical) {
|
|
10754
10754
|
if (!canonical.mcp || Object.keys(canonical.mcp.mcpServers).length === 0) return [];
|
|
@@ -12217,11 +12217,11 @@ var init_generator17 = __esm({
|
|
|
12217
12217
|
});
|
|
12218
12218
|
function toStringRecord2(value) {
|
|
12219
12219
|
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
12220
|
-
const
|
|
12220
|
+
const out2 = {};
|
|
12221
12221
|
for (const [k, v] of Object.entries(value)) {
|
|
12222
|
-
if (typeof v === "string")
|
|
12222
|
+
if (typeof v === "string") out2[k] = v;
|
|
12223
12223
|
}
|
|
12224
|
-
return
|
|
12224
|
+
return out2;
|
|
12225
12225
|
}
|
|
12226
12226
|
function parseOpenCodeMcp(content) {
|
|
12227
12227
|
let parsed;
|
|
@@ -12233,12 +12233,12 @@ function parseOpenCodeMcp(content) {
|
|
|
12233
12233
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return {};
|
|
12234
12234
|
const raw = parsed.mcp;
|
|
12235
12235
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return {};
|
|
12236
|
-
const
|
|
12236
|
+
const out2 = {};
|
|
12237
12237
|
for (const [name, value] of Object.entries(raw)) {
|
|
12238
12238
|
if (!value || typeof value !== "object" || Array.isArray(value)) continue;
|
|
12239
12239
|
const entry = value;
|
|
12240
12240
|
if (typeof entry.url === "string") {
|
|
12241
|
-
|
|
12241
|
+
out2[name] = {
|
|
12242
12242
|
type: "url",
|
|
12243
12243
|
url: entry.url,
|
|
12244
12244
|
headers: toStringRecord2(entry.headers),
|
|
@@ -12252,7 +12252,7 @@ function parseOpenCodeMcp(content) {
|
|
|
12252
12252
|
const command = cmdArr[0];
|
|
12253
12253
|
if (command === void 0) continue;
|
|
12254
12254
|
const args = cmdArr.slice(1);
|
|
12255
|
-
|
|
12255
|
+
out2[name] = {
|
|
12256
12256
|
type: "stdio",
|
|
12257
12257
|
command,
|
|
12258
12258
|
args,
|
|
@@ -12261,7 +12261,7 @@ function parseOpenCodeMcp(content) {
|
|
|
12261
12261
|
};
|
|
12262
12262
|
}
|
|
12263
12263
|
}
|
|
12264
|
-
return
|
|
12264
|
+
return out2;
|
|
12265
12265
|
}
|
|
12266
12266
|
async function importMcp4(projectRoot, scope, results) {
|
|
12267
12267
|
const configFile = scope === "global" ? OPENCODE_GLOBAL_CONFIG_FILE : OPENCODE_CONFIG_FILE;
|
|
@@ -15219,13 +15219,13 @@ function resolveGeneratedOutputPath(target19, path, scope) {
|
|
|
15219
15219
|
resolvedPath = layout.rewriteGeneratedPath ? layout.rewriteGeneratedPath(path) : path;
|
|
15220
15220
|
return resolvedPath;
|
|
15221
15221
|
}
|
|
15222
|
-
async function emitGeneratedOutput(results, target19,
|
|
15223
|
-
const resolvedPath = resolveGeneratedOutputPath(target19,
|
|
15222
|
+
async function emitGeneratedOutput(results, target19, out2, projectRoot, scope, options) {
|
|
15223
|
+
const resolvedPath = resolveGeneratedOutputPath(target19, out2.path, scope);
|
|
15224
15224
|
if (resolvedPath === null) return null;
|
|
15225
15225
|
const existing = await readFileSafe(join(projectRoot, resolvedPath));
|
|
15226
15226
|
const pendingIdx = results.findIndex((r) => r.path === resolvedPath && r.target === target19);
|
|
15227
15227
|
const pendingResult = pendingIdx >= 0 ? results[pendingIdx] : void 0;
|
|
15228
|
-
const content = options?.mergeContent?.(existing, pendingResult,
|
|
15228
|
+
const content = options?.mergeContent?.(existing, pendingResult, out2.content, resolvedPath) ?? out2.content;
|
|
15229
15229
|
if (pendingIdx >= 0) {
|
|
15230
15230
|
results.splice(pendingIdx, 1);
|
|
15231
15231
|
}
|
|
@@ -15251,8 +15251,8 @@ async function generateFeature(results, targets, canonical, projectRoot, enabled
|
|
|
15251
15251
|
const gen = getGen(target19);
|
|
15252
15252
|
if (!gen) continue;
|
|
15253
15253
|
const ctx = featureContext(target19, feature, scope);
|
|
15254
|
-
for (const
|
|
15255
|
-
const resolvedPath = await emitGeneratedOutput(results, target19,
|
|
15254
|
+
for (const out2 of gen(canonical, ctx)) {
|
|
15255
|
+
const resolvedPath = await emitGeneratedOutput(results, target19, out2, projectRoot, scope);
|
|
15256
15256
|
if (resolvedPath === null) continue;
|
|
15257
15257
|
const layout = getTargetLayout(target19, scope);
|
|
15258
15258
|
if (layout?.mirrorGlobalPath) {
|
|
@@ -15263,9 +15263,9 @@ async function generateFeature(results, targets, canonical, projectRoot, enabled
|
|
|
15263
15263
|
results.push({
|
|
15264
15264
|
target: target19,
|
|
15265
15265
|
path: mirrorPath,
|
|
15266
|
-
content:
|
|
15266
|
+
content: out2.content,
|
|
15267
15267
|
currentContent: existingMirror ?? void 0,
|
|
15268
|
-
status: computeStatus6(existingMirror,
|
|
15268
|
+
status: computeStatus6(existingMirror, out2.content)
|
|
15269
15269
|
});
|
|
15270
15270
|
}
|
|
15271
15271
|
}
|
|
@@ -15316,8 +15316,8 @@ async function generatePermissionsFeature(results, targets, canonical, projectRo
|
|
|
15316
15316
|
for (const target19 of targets) {
|
|
15317
15317
|
const gen = resolveTargetFeatureGenerator(target19, "permissions", void 0, scope) ?? getDescriptor(target19)?.generators.generatePermissions;
|
|
15318
15318
|
if (!gen) continue;
|
|
15319
|
-
for (const
|
|
15320
|
-
await emitGeneratedOutput(results, target19,
|
|
15319
|
+
for (const out2 of gen(canonical)) {
|
|
15320
|
+
await emitGeneratedOutput(results, target19, out2, projectRoot, scope, {
|
|
15321
15321
|
mergeContent: (existing, pending, newContent, resolvedPath) => mergeOutputContent(target19, existing, pending, newContent, resolvedPath)
|
|
15322
15322
|
});
|
|
15323
15323
|
}
|
|
@@ -15334,8 +15334,8 @@ async function generateHooksFeature(results, targets, canonical, projectRoot, sc
|
|
|
15334
15334
|
if (post) {
|
|
15335
15335
|
outputs = [...await post(projectRoot, canonical, outputs)];
|
|
15336
15336
|
}
|
|
15337
|
-
for (const
|
|
15338
|
-
await emitGeneratedOutput(results, target19,
|
|
15337
|
+
for (const out2 of outputs) {
|
|
15338
|
+
await emitGeneratedOutput(results, target19, out2, projectRoot, scope, {
|
|
15339
15339
|
mergeContent: (existing, pending, newContent, resolvedPath) => mergeOutputContent(target19, existing, pending, newContent, resolvedPath)
|
|
15340
15340
|
});
|
|
15341
15341
|
}
|
|
@@ -15348,8 +15348,8 @@ async function generateScopedSettingsFeature(results, targets, canonical, projec
|
|
|
15348
15348
|
if (!emit) continue;
|
|
15349
15349
|
const outputs = emit(canonical, scope);
|
|
15350
15350
|
if (outputs.length === 0) continue;
|
|
15351
|
-
for (const
|
|
15352
|
-
await emitGeneratedOutput(results, target19,
|
|
15351
|
+
for (const out2 of outputs) {
|
|
15352
|
+
await emitGeneratedOutput(results, target19, out2, projectRoot, scope, {
|
|
15353
15353
|
mergeContent: (existing, pending, newContent, resolvedPath) => mergeOutputContent(target19, existing, pending, newContent, resolvedPath)
|
|
15354
15354
|
});
|
|
15355
15355
|
}
|
|
@@ -15479,6 +15479,11 @@ var C = {
|
|
|
15479
15479
|
cyan: "\x1B[36m",
|
|
15480
15480
|
reset: "\x1B[0m"
|
|
15481
15481
|
};
|
|
15482
|
+
function out(text) {
|
|
15483
|
+
{
|
|
15484
|
+
process.stdout.write(text);
|
|
15485
|
+
}
|
|
15486
|
+
}
|
|
15482
15487
|
function noColor() {
|
|
15483
15488
|
return process.env.NO_COLOR !== void 0 && process.env.NO_COLOR !== "";
|
|
15484
15489
|
}
|
|
@@ -15491,7 +15496,7 @@ function pad(str, width) {
|
|
|
15491
15496
|
}
|
|
15492
15497
|
var logger = {
|
|
15493
15498
|
info(msg) {
|
|
15494
|
-
|
|
15499
|
+
out(c(C.cyan, msg) + "\n");
|
|
15495
15500
|
},
|
|
15496
15501
|
warn(msg) {
|
|
15497
15502
|
process.stderr.write(c(C.yellow, "\u26A0 ") + msg + "\n");
|
|
@@ -15500,11 +15505,11 @@ var logger = {
|
|
|
15500
15505
|
process.stderr.write(c(C.red, "\u2717 ") + msg + "\n");
|
|
15501
15506
|
},
|
|
15502
15507
|
success(msg) {
|
|
15503
|
-
|
|
15508
|
+
out(c(C.green, "\u2713 ") + msg + "\n");
|
|
15504
15509
|
},
|
|
15505
15510
|
debug(msg) {
|
|
15506
15511
|
if (process.env.AGENTSMESH_DEBUG === "1") {
|
|
15507
|
-
|
|
15512
|
+
out(c(C.cyan, "[debug] ") + msg + "\n");
|
|
15508
15513
|
}
|
|
15509
15514
|
},
|
|
15510
15515
|
table(rows) {
|
|
@@ -15520,13 +15525,13 @@ var logger = {
|
|
|
15520
15525
|
widths[j] = max;
|
|
15521
15526
|
}
|
|
15522
15527
|
const border = "+" + widths.map((w) => "-".repeat(w + 2)).join("+") + "+";
|
|
15523
|
-
|
|
15528
|
+
out(border + "\n");
|
|
15524
15529
|
for (let i = 0; i < rows.length; i++) {
|
|
15525
15530
|
const row = rows[i];
|
|
15526
15531
|
const line = "| " + row.map((cell, j) => pad(cell, widths[j])).join(" | ") + " |";
|
|
15527
|
-
|
|
15532
|
+
out(line + "\n");
|
|
15528
15533
|
}
|
|
15529
|
-
|
|
15534
|
+
out(border + "\n");
|
|
15530
15535
|
}
|
|
15531
15536
|
};
|
|
15532
15537
|
|
|
@@ -16412,12 +16417,60 @@ function parseServer(raw) {
|
|
|
16412
16417
|
env
|
|
16413
16418
|
};
|
|
16414
16419
|
}
|
|
16420
|
+
function stripJsonComments(text) {
|
|
16421
|
+
let result = "";
|
|
16422
|
+
let i = 0;
|
|
16423
|
+
const len = text.length;
|
|
16424
|
+
while (i < len) {
|
|
16425
|
+
const ch = text[i];
|
|
16426
|
+
if (ch === '"') {
|
|
16427
|
+
result += ch;
|
|
16428
|
+
i++;
|
|
16429
|
+
while (i < len) {
|
|
16430
|
+
const sc = text[i];
|
|
16431
|
+
result += sc;
|
|
16432
|
+
if (sc === "\\") {
|
|
16433
|
+
i++;
|
|
16434
|
+
if (i < len) {
|
|
16435
|
+
result += text[i];
|
|
16436
|
+
}
|
|
16437
|
+
} else if (sc === '"') {
|
|
16438
|
+
break;
|
|
16439
|
+
}
|
|
16440
|
+
i++;
|
|
16441
|
+
}
|
|
16442
|
+
i++;
|
|
16443
|
+
continue;
|
|
16444
|
+
}
|
|
16445
|
+
if (ch === "/" && text[i + 1] === "*") {
|
|
16446
|
+
i += 2;
|
|
16447
|
+
while (i < len) {
|
|
16448
|
+
if (text[i] === "*" && text[i + 1] === "/") {
|
|
16449
|
+
i += 2;
|
|
16450
|
+
break;
|
|
16451
|
+
}
|
|
16452
|
+
i++;
|
|
16453
|
+
}
|
|
16454
|
+
continue;
|
|
16455
|
+
}
|
|
16456
|
+
if (ch === "/" && text[i + 1] === "/") {
|
|
16457
|
+
i += 2;
|
|
16458
|
+
while (i < len && text[i] !== "\n") {
|
|
16459
|
+
i++;
|
|
16460
|
+
}
|
|
16461
|
+
continue;
|
|
16462
|
+
}
|
|
16463
|
+
result += ch;
|
|
16464
|
+
i++;
|
|
16465
|
+
}
|
|
16466
|
+
return result;
|
|
16467
|
+
}
|
|
16415
16468
|
async function parseMcp(mcpPath) {
|
|
16416
16469
|
const content = await readFileSafe(mcpPath);
|
|
16417
16470
|
if (!content) return null;
|
|
16418
16471
|
let parsed;
|
|
16419
16472
|
try {
|
|
16420
|
-
parsed = JSON.parse(content);
|
|
16473
|
+
parsed = JSON.parse(stripJsonComments(content));
|
|
16421
16474
|
} catch {
|
|
16422
16475
|
return null;
|
|
16423
16476
|
}
|
|
@@ -16619,14 +16672,14 @@ function mergeHooks(base, overlay) {
|
|
|
16619
16672
|
}
|
|
16620
16673
|
function mergeIgnore(base, overlay) {
|
|
16621
16674
|
const seen = new Set(base);
|
|
16622
|
-
const
|
|
16675
|
+
const out2 = [...base];
|
|
16623
16676
|
for (const p of overlay) {
|
|
16624
16677
|
if (!seen.has(p)) {
|
|
16625
16678
|
seen.add(p);
|
|
16626
|
-
|
|
16679
|
+
out2.push(p);
|
|
16627
16680
|
}
|
|
16628
16681
|
}
|
|
16629
|
-
return
|
|
16682
|
+
return out2;
|
|
16630
16683
|
}
|
|
16631
16684
|
|
|
16632
16685
|
// src/config/resolve/native-format-detector.ts
|
|
@@ -17337,13 +17390,13 @@ var PROBES = [
|
|
|
17337
17390
|
];
|
|
17338
17391
|
function lintSilentFeatureDrops(input) {
|
|
17339
17392
|
const enabled = new Set(input.enabledFeatures);
|
|
17340
|
-
const
|
|
17393
|
+
const out2 = [];
|
|
17341
17394
|
for (const probe of PROBES) {
|
|
17342
17395
|
if (!enabled.has(probe.featureFlag)) continue;
|
|
17343
17396
|
if (!probe.hasContent(input.canonical)) continue;
|
|
17344
17397
|
const cap2 = normalizeCapabilityValue(input.capabilities[probe.capabilityKey]);
|
|
17345
17398
|
if (cap2.level !== "none") continue;
|
|
17346
|
-
|
|
17399
|
+
out2.push(
|
|
17347
17400
|
createWarning(
|
|
17348
17401
|
probe.file,
|
|
17349
17402
|
input.target,
|
|
@@ -17351,7 +17404,7 @@ function lintSilentFeatureDrops(input) {
|
|
|
17351
17404
|
)
|
|
17352
17405
|
);
|
|
17353
17406
|
}
|
|
17354
|
-
return
|
|
17407
|
+
return out2;
|
|
17355
17408
|
}
|
|
17356
17409
|
|
|
17357
17410
|
// src/core/lint/shared/hook-script-references.ts
|
|
@@ -17366,14 +17419,14 @@ function lintHookScriptReferences(input) {
|
|
|
17366
17419
|
if (input.hasScriptProjection) return [];
|
|
17367
17420
|
const hooks = input.canonical.hooks;
|
|
17368
17421
|
if (!hooks) return [];
|
|
17369
|
-
const
|
|
17422
|
+
const out2 = [];
|
|
17370
17423
|
for (const entries of Object.values(hooks)) {
|
|
17371
17424
|
if (!Array.isArray(entries)) continue;
|
|
17372
17425
|
for (const entry of entries) {
|
|
17373
17426
|
if (typeof entry?.command !== "string") continue;
|
|
17374
17427
|
const token = extractScriptToken(entry.command);
|
|
17375
17428
|
if (!token) continue;
|
|
17376
|
-
|
|
17429
|
+
out2.push(
|
|
17377
17430
|
createWarning(
|
|
17378
17431
|
".agentsmesh/hooks.yaml",
|
|
17379
17432
|
input.target,
|
|
@@ -17382,19 +17435,19 @@ function lintHookScriptReferences(input) {
|
|
|
17382
17435
|
);
|
|
17383
17436
|
}
|
|
17384
17437
|
}
|
|
17385
|
-
return
|
|
17438
|
+
return out2;
|
|
17386
17439
|
}
|
|
17387
17440
|
|
|
17388
17441
|
// src/core/lint/shared/rule-scope-inversion.ts
|
|
17389
17442
|
init_helpers();
|
|
17390
17443
|
function lintRuleScopeInversion(input) {
|
|
17391
17444
|
if (input.preservesManualActivation) return [];
|
|
17392
|
-
const
|
|
17445
|
+
const out2 = [];
|
|
17393
17446
|
for (const rule of input.canonical.rules) {
|
|
17394
17447
|
if (rule.root) continue;
|
|
17395
17448
|
if (rule.trigger !== "manual") continue;
|
|
17396
17449
|
if (rule.targets.length > 0 && !rule.targets.includes(input.target)) continue;
|
|
17397
|
-
|
|
17450
|
+
out2.push(
|
|
17398
17451
|
createWarning(
|
|
17399
17452
|
rule.source,
|
|
17400
17453
|
input.target,
|
|
@@ -17402,7 +17455,7 @@ function lintRuleScopeInversion(input) {
|
|
|
17402
17455
|
)
|
|
17403
17456
|
);
|
|
17404
17457
|
}
|
|
17405
|
-
return
|
|
17458
|
+
return out2;
|
|
17406
17459
|
}
|
|
17407
17460
|
|
|
17408
17461
|
// src/core/lint/linter.ts
|