@defai.digital/automatosx 11.2.5 → 11.2.7
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/README.md +1 -1
- package/dist/index.js +546 -465
- package/dist/mcp/index.js +243 -173
- package/examples/providers/README.md +58 -169
- package/package.json +1 -1
- package/CHANGELOG.md +0 -41
- package/CODE_OF_CONDUCT.md +0 -133
- package/CONTRIBUTING.md +0 -427
- package/FAQ.md +0 -895
- package/TROUBLESHOOTING.md +0 -972
- package/templates/providers/README.md +0 -117
- /package/examples/{claude → providers/claude}/CLAUDE_INTEGRATION.md +0 -0
- /package/examples/{claude → providers/claude}/mcp/automatosx.json +0 -0
- /package/examples/{codex → providers/codex}/CODEX_INTEGRATION.md +0 -0
- /package/examples/{codex → providers/codex}/README.md +0 -0
- /package/examples/{codex → providers/codex}/usage-examples.ts +0 -0
- /package/examples/{gemini → providers/gemini}/GEMINI_INTEGRATION.md +0 -0
- /package/examples/{gemini → providers/gemini}/README.md +0 -0
- /package/examples/{integrations → providers}/openai-codex-example.ts +0 -0
- /package/{templates → examples}/specs/enterprise.yaml.mustache +0 -0
- /package/{templates → examples}/specs/government.yaml.mustache +0 -0
- /package/{templates → examples}/specs/minimal.yaml.mustache +0 -0
- /package/examples/{templates → workflows}/analyst.yaml +0 -0
- /package/examples/{templates → workflows}/assistant.yaml +0 -0
- /package/examples/{templates → workflows}/basic-agent.yaml +0 -0
- /package/examples/{templates → workflows}/code-reviewer.yaml +0 -0
- /package/examples/{templates → workflows}/debugger.yaml +0 -0
- /package/examples/{templates → workflows}/designer.yaml +0 -0
- /package/examples/{templates → workflows}/developer.yaml +0 -0
- /package/examples/{templates → workflows}/fullstack-developer.yaml +0 -0
- /package/examples/{templates → workflows}/qa-specialist.yaml +0 -0
package/dist/mcp/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import * as path4 from 'path';
|
|
3
|
-
import path4__default, { dirname, join, extname as extname$1, basename, resolve, isAbsolute, sep, parse, delimiter } from 'path';
|
|
3
|
+
import path4__default, { dirname, join, extname as extname$1, basename, resolve, relative, isAbsolute, sep, parse, delimiter } from 'path';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import { mkdir, appendFile, readFile, readdir, writeFile, rename, unlink, copyFile, access, stat, realpath } from 'fs/promises';
|
|
6
6
|
import { existsSync, readFileSync, promises, mkdirSync, createWriteStream, writeFileSync, unlinkSync, constants } from 'fs';
|
|
@@ -86,7 +86,7 @@ function setLogLevel(level) {
|
|
|
86
86
|
}
|
|
87
87
|
var LOG_LEVELS, COLORS, SENSITIVE_KEYS, SimpleLogger, logger;
|
|
88
88
|
var init_logger = __esm({
|
|
89
|
-
"src/
|
|
89
|
+
"src/shared/logging/logger.ts"() {
|
|
90
90
|
init_esm_shims();
|
|
91
91
|
LOG_LEVELS = {
|
|
92
92
|
trace: 0,
|
|
@@ -258,7 +258,7 @@ ${JSON.stringify(entry.context, null, 2)}`;
|
|
|
258
258
|
}
|
|
259
259
|
});
|
|
260
260
|
|
|
261
|
-
// src/
|
|
261
|
+
// src/shared/errors/errors.ts
|
|
262
262
|
function toBaseError(error) {
|
|
263
263
|
if (error instanceof BaseError) {
|
|
264
264
|
return error;
|
|
@@ -279,7 +279,7 @@ function toBaseError(error) {
|
|
|
279
279
|
}
|
|
280
280
|
var BaseError, ConfigError, ProviderError;
|
|
281
281
|
var init_errors = __esm({
|
|
282
|
-
"src/
|
|
282
|
+
"src/shared/errors/errors.ts"() {
|
|
283
283
|
init_esm_shims();
|
|
284
284
|
BaseError = class extends Error {
|
|
285
285
|
code;
|
|
@@ -568,7 +568,7 @@ var init_errors = __esm({
|
|
|
568
568
|
}
|
|
569
569
|
});
|
|
570
570
|
|
|
571
|
-
// src/
|
|
571
|
+
// src/shared/process/process-manager.ts
|
|
572
572
|
var process_manager_exports = {};
|
|
573
573
|
__export(process_manager_exports, {
|
|
574
574
|
installExitHandlers: () => installExitHandlers,
|
|
@@ -618,7 +618,7 @@ function installExitHandlers() {
|
|
|
618
618
|
}
|
|
619
619
|
var ProcessManager, processManager, exitHandlersInstalled, exitInProgress;
|
|
620
620
|
var init_process_manager = __esm({
|
|
621
|
-
"src/
|
|
621
|
+
"src/shared/process/process-manager.ts"() {
|
|
622
622
|
init_esm_shims();
|
|
623
623
|
init_logger();
|
|
624
624
|
ProcessManager = class {
|
|
@@ -690,7 +690,7 @@ var init_process_manager = __esm({
|
|
|
690
690
|
if (child.killed || child.exitCode !== null) {
|
|
691
691
|
continue;
|
|
692
692
|
}
|
|
693
|
-
killPromises.push(new Promise((
|
|
693
|
+
killPromises.push(new Promise((resolve5) => {
|
|
694
694
|
let mainTimeoutId = null;
|
|
695
695
|
let fallbackTimeoutId = null;
|
|
696
696
|
let resolved = false;
|
|
@@ -705,7 +705,7 @@ var init_process_manager = __esm({
|
|
|
705
705
|
}
|
|
706
706
|
if (!resolved) {
|
|
707
707
|
resolved = true;
|
|
708
|
-
|
|
708
|
+
resolve5();
|
|
709
709
|
}
|
|
710
710
|
};
|
|
711
711
|
child.once("exit", () => {
|
|
@@ -730,8 +730,8 @@ var init_process_manager = __esm({
|
|
|
730
730
|
try {
|
|
731
731
|
await Promise.race([
|
|
732
732
|
Promise.all(killPromises),
|
|
733
|
-
new Promise((
|
|
734
|
-
finalTimeoutId = setTimeout(
|
|
733
|
+
new Promise((resolve5) => {
|
|
734
|
+
finalTimeoutId = setTimeout(resolve5, timeout);
|
|
735
735
|
})
|
|
736
736
|
]);
|
|
737
737
|
} finally {
|
|
@@ -782,8 +782,8 @@ var init_process_manager = __esm({
|
|
|
782
782
|
}
|
|
783
783
|
});
|
|
784
784
|
var DEFAULT_OPTIONS, DatabaseFactory;
|
|
785
|
-
var
|
|
786
|
-
"src/
|
|
785
|
+
var init_factory = __esm({
|
|
786
|
+
"src/core/database/factory.ts"() {
|
|
787
787
|
init_esm_shims();
|
|
788
788
|
init_logger();
|
|
789
789
|
DEFAULT_OPTIONS = {
|
|
@@ -966,7 +966,7 @@ var init_workspace_indexer = __esm({
|
|
|
966
966
|
"src/core/workspace-indexer.ts"() {
|
|
967
967
|
init_esm_shims();
|
|
968
968
|
init_logger();
|
|
969
|
-
|
|
969
|
+
init_factory();
|
|
970
970
|
DEFAULT_IGNORE_PATTERNS = [
|
|
971
971
|
"node_modules/**",
|
|
972
972
|
".git/**",
|
|
@@ -1487,10 +1487,10 @@ var init_workspace_indexer = __esm({
|
|
|
1487
1487
|
}
|
|
1488
1488
|
});
|
|
1489
1489
|
|
|
1490
|
-
// src/
|
|
1490
|
+
// src/shared/logging/verbosity-manager.ts
|
|
1491
1491
|
var VerbosityManager;
|
|
1492
1492
|
var init_verbosity_manager = __esm({
|
|
1493
|
-
"src/
|
|
1493
|
+
"src/shared/logging/verbosity-manager.ts"() {
|
|
1494
1494
|
init_esm_shims();
|
|
1495
1495
|
VerbosityManager = class _VerbosityManager {
|
|
1496
1496
|
static instance = null;
|
|
@@ -1810,7 +1810,7 @@ var init_provider_schemas = __esm({
|
|
|
1810
1810
|
});
|
|
1811
1811
|
var StreamingProgressParser;
|
|
1812
1812
|
var init_streaming_progress_parser = __esm({
|
|
1813
|
-
"src/
|
|
1813
|
+
"src/shared/process/streaming-progress-parser.ts"() {
|
|
1814
1814
|
init_esm_shims();
|
|
1815
1815
|
StreamingProgressParser = class {
|
|
1816
1816
|
spinner = null;
|
|
@@ -2320,7 +2320,8 @@ var init_base_provider = __esm({
|
|
|
2320
2320
|
try {
|
|
2321
2321
|
const cliCommand = this.getCLICommand();
|
|
2322
2322
|
const cliArgs = await this.getCLIArgs();
|
|
2323
|
-
const
|
|
2323
|
+
const escapedArgs = cliArgs.map((arg) => this.escapeShellArg(arg));
|
|
2324
|
+
const argsString = escapedArgs.length > 0 ? escapedArgs.join(" ") + " " : "";
|
|
2324
2325
|
const escapedPrompt = this.escapeShellArg(prompt);
|
|
2325
2326
|
const fullCommand = `${cliCommand} ${argsString}${escapedPrompt}`;
|
|
2326
2327
|
const commandLength = fullCommand.length;
|
|
@@ -2363,7 +2364,7 @@ var init_base_provider = __esm({
|
|
|
2363
2364
|
* @returns Promise resolving to stdout and stderr
|
|
2364
2365
|
*/
|
|
2365
2366
|
async executeWithSpawn(command, cliCommand) {
|
|
2366
|
-
return new Promise((
|
|
2367
|
+
return new Promise((resolve5, reject) => {
|
|
2367
2368
|
const child = spawn(command, [], {
|
|
2368
2369
|
shell: true,
|
|
2369
2370
|
// Auto-detects: cmd.exe on Windows, /bin/sh on Unix
|
|
@@ -2462,11 +2463,16 @@ var init_base_provider = __esm({
|
|
|
2462
2463
|
if (stderr) {
|
|
2463
2464
|
logger.debug(`${cliCommand} CLI stderr output`, { stderr: stderr.trim() });
|
|
2464
2465
|
}
|
|
2465
|
-
if (code === 0 || code === null) {
|
|
2466
|
+
if ((code === 0 || code === null) && !signal) {
|
|
2466
2467
|
if (progressParser) {
|
|
2467
2468
|
progressParser.succeed(`${cliCommand} completed successfully`);
|
|
2468
2469
|
}
|
|
2469
|
-
|
|
2470
|
+
resolve5({ stdout, stderr });
|
|
2471
|
+
} else if (signal) {
|
|
2472
|
+
if (progressParser) {
|
|
2473
|
+
progressParser.fail(`${cliCommand} killed by signal ${signal}`);
|
|
2474
|
+
}
|
|
2475
|
+
reject(new Error(`${cliCommand} CLI killed by signal ${signal}. stderr: ${stderr || "none"}`));
|
|
2470
2476
|
} else {
|
|
2471
2477
|
if (progressParser) {
|
|
2472
2478
|
progressParser.fail(`${cliCommand} failed with code ${code}`);
|
|
@@ -2516,7 +2522,7 @@ var init_base_provider = __esm({
|
|
|
2516
2522
|
* @returns Promise resolving to stdout and stderr
|
|
2517
2523
|
*/
|
|
2518
2524
|
async executeWithStdin(cliCommand, cliArgs, prompt) {
|
|
2519
|
-
return new Promise((
|
|
2525
|
+
return new Promise((resolve5, reject) => {
|
|
2520
2526
|
const commandArgs = cliArgs ? cliArgs.split(" ").filter(Boolean) : [];
|
|
2521
2527
|
logger.debug(`Executing ${cliCommand} CLI with stdin`, {
|
|
2522
2528
|
command: cliCommand,
|
|
@@ -2629,7 +2635,7 @@ var init_base_provider = __esm({
|
|
|
2629
2635
|
if (progressParser) {
|
|
2630
2636
|
progressParser.succeed(`${cliCommand} completed successfully`);
|
|
2631
2637
|
}
|
|
2632
|
-
|
|
2638
|
+
resolve5({ stdout, stderr });
|
|
2633
2639
|
} else {
|
|
2634
2640
|
if (progressParser) {
|
|
2635
2641
|
progressParser.fail(`${cliCommand} failed with code ${code}`);
|
|
@@ -2752,6 +2758,10 @@ ${fullPrompt}
|
|
|
2752
2758
|
errors: responseValidation.error.issues,
|
|
2753
2759
|
response
|
|
2754
2760
|
});
|
|
2761
|
+
throw new ProviderError(
|
|
2762
|
+
`Provider returned invalid response structure: ${responseValidation.error.issues.map((i) => i.message).join(", ")}`,
|
|
2763
|
+
"E1305" /* PROVIDER_EXEC_ERROR */
|
|
2764
|
+
);
|
|
2755
2765
|
}
|
|
2756
2766
|
return response;
|
|
2757
2767
|
} catch (error) {
|
|
@@ -3381,7 +3391,7 @@ var init_cli_wrapper = __esm({
|
|
|
3381
3391
|
* Spawn codex process
|
|
3382
3392
|
*/
|
|
3383
3393
|
async spawnProcess(args2, prompt, timeout) {
|
|
3384
|
-
return new Promise((
|
|
3394
|
+
return new Promise((resolve5, reject) => {
|
|
3385
3395
|
let stdout = "";
|
|
3386
3396
|
let stderr = "";
|
|
3387
3397
|
let hasTimedOut = false;
|
|
@@ -3438,7 +3448,7 @@ var init_cli_wrapper = __esm({
|
|
|
3438
3448
|
return;
|
|
3439
3449
|
}
|
|
3440
3450
|
if (code === 0) {
|
|
3441
|
-
|
|
3451
|
+
resolve5({ stdout, stderr, exitCode: code });
|
|
3442
3452
|
} else {
|
|
3443
3453
|
reject(
|
|
3444
3454
|
new CodexError(
|
|
@@ -3471,7 +3481,7 @@ var init_cli_wrapper = __esm({
|
|
|
3471
3481
|
* Spawn codex process with streaming support
|
|
3472
3482
|
*/
|
|
3473
3483
|
async spawnProcessWithStreaming(args2, prompt, timeout, renderer) {
|
|
3474
|
-
return new Promise((
|
|
3484
|
+
return new Promise((resolve5, reject) => {
|
|
3475
3485
|
let stdout = "";
|
|
3476
3486
|
let stderr = "";
|
|
3477
3487
|
let hasTimedOut = false;
|
|
@@ -3541,7 +3551,7 @@ var init_cli_wrapper = __esm({
|
|
|
3541
3551
|
if (renderer) {
|
|
3542
3552
|
renderer.succeed("Execution complete");
|
|
3543
3553
|
}
|
|
3544
|
-
|
|
3554
|
+
resolve5({ stdout, stderr, exitCode: code });
|
|
3545
3555
|
} else {
|
|
3546
3556
|
if (renderer) {
|
|
3547
3557
|
renderer.fail(`Process exited with code ${code}`);
|
|
@@ -4008,14 +4018,14 @@ init_esm_shims();
|
|
|
4008
4018
|
// src/mcp/server.ts
|
|
4009
4019
|
init_esm_shims();
|
|
4010
4020
|
|
|
4011
|
-
// src/
|
|
4021
|
+
// src/shared/helpers/version.ts
|
|
4012
4022
|
init_esm_shims();
|
|
4013
4023
|
var __dirname$1 = dirname(fileURLToPath(import.meta.url));
|
|
4014
4024
|
function getVersion() {
|
|
4015
4025
|
try {
|
|
4016
4026
|
const possiblePaths = [
|
|
4017
|
-
join(__dirname$1, "
|
|
4018
|
-
// From src/
|
|
4027
|
+
join(__dirname$1, "../../../package.json"),
|
|
4028
|
+
// From src/shared/helpers
|
|
4019
4029
|
join(__dirname$1, "../package.json")
|
|
4020
4030
|
// From dist
|
|
4021
4031
|
];
|
|
@@ -4043,10 +4053,10 @@ var MCP_PROTOCOL_VERSION = "2024-11-05";
|
|
|
4043
4053
|
// src/mcp/server.ts
|
|
4044
4054
|
init_logger();
|
|
4045
4055
|
|
|
4046
|
-
// src/core/config.ts
|
|
4056
|
+
// src/core/config/loader.ts
|
|
4047
4057
|
init_esm_shims();
|
|
4048
4058
|
|
|
4049
|
-
// src/
|
|
4059
|
+
// src/shared/validation/path-utils.ts
|
|
4050
4060
|
init_esm_shims();
|
|
4051
4061
|
function normalizePath(filePath) {
|
|
4052
4062
|
if (!filePath) return filePath;
|
|
@@ -4444,11 +4454,11 @@ var DEFAULT_CONFIG = {
|
|
|
4444
4454
|
}
|
|
4445
4455
|
};
|
|
4446
4456
|
|
|
4447
|
-
// src/core/config.ts
|
|
4457
|
+
// src/core/config/loader.ts
|
|
4448
4458
|
init_errors();
|
|
4449
4459
|
init_logger();
|
|
4450
4460
|
|
|
4451
|
-
// src/
|
|
4461
|
+
// src/shared/helpers/deep-merge.ts
|
|
4452
4462
|
init_esm_shims();
|
|
4453
4463
|
function deepMerge(defaults, user) {
|
|
4454
4464
|
if (user === null || user === void 0) {
|
|
@@ -4588,7 +4598,7 @@ function isNonNegativeInteger(value) {
|
|
|
4588
4598
|
return typeof value === "number" && Number.isInteger(value) && value >= 0;
|
|
4589
4599
|
}
|
|
4590
4600
|
|
|
4591
|
-
// src/core/cache.ts
|
|
4601
|
+
// src/core/cache/cache.ts
|
|
4592
4602
|
init_esm_shims();
|
|
4593
4603
|
init_logger();
|
|
4594
4604
|
var TTLCache = class {
|
|
@@ -4873,7 +4883,7 @@ var TTLCache = class {
|
|
|
4873
4883
|
}
|
|
4874
4884
|
};
|
|
4875
4885
|
|
|
4876
|
-
// src/
|
|
4886
|
+
// src/shared/helpers/resource-calculator.ts
|
|
4877
4887
|
init_esm_shims();
|
|
4878
4888
|
function getSystemResources() {
|
|
4879
4889
|
const totalMemory = os2.totalmem();
|
|
@@ -4915,13 +4925,13 @@ function calculateMaxConcurrentAgents(staticLimit) {
|
|
|
4915
4925
|
};
|
|
4916
4926
|
}
|
|
4917
4927
|
|
|
4918
|
-
// src/config
|
|
4928
|
+
// src/core/config/generated.ts
|
|
4919
4929
|
init_esm_shims();
|
|
4920
4930
|
var PRECOMPILED_CONFIG = {
|
|
4921
4931
|
"providers": {
|
|
4922
4932
|
"claude-code": {
|
|
4923
4933
|
"enabled": true,
|
|
4924
|
-
"priority":
|
|
4934
|
+
"priority": 1,
|
|
4925
4935
|
"timeout": 27e5,
|
|
4926
4936
|
"command": "claude",
|
|
4927
4937
|
"healthCheck": {
|
|
@@ -4981,7 +4991,7 @@ var PRECOMPILED_CONFIG = {
|
|
|
4981
4991
|
},
|
|
4982
4992
|
"openai": {
|
|
4983
4993
|
"enabled": true,
|
|
4984
|
-
"priority":
|
|
4994
|
+
"priority": 3,
|
|
4985
4995
|
"timeout": 27e5,
|
|
4986
4996
|
"command": "codex",
|
|
4987
4997
|
"healthCheck": {
|
|
@@ -5219,10 +5229,10 @@ var PRECOMPILED_CONFIG = {
|
|
|
5219
5229
|
"enableFreeTierPrioritization": true,
|
|
5220
5230
|
"enableWorkloadAwareRouting": true
|
|
5221
5231
|
},
|
|
5222
|
-
"version": "11.2.
|
|
5232
|
+
"version": "11.2.7"
|
|
5223
5233
|
};
|
|
5224
5234
|
|
|
5225
|
-
// src/core/config
|
|
5235
|
+
// src/core/config/schemas.ts
|
|
5226
5236
|
init_esm_shims();
|
|
5227
5237
|
z.enum([
|
|
5228
5238
|
"claude",
|
|
@@ -5523,7 +5533,7 @@ function safeValidateConfig(config) {
|
|
|
5523
5533
|
}
|
|
5524
5534
|
automatosXConfigSchema.partial().passthrough();
|
|
5525
5535
|
|
|
5526
|
-
// src/core/config.ts
|
|
5536
|
+
// src/core/config/loader.ts
|
|
5527
5537
|
var configCache = new TTLCache({
|
|
5528
5538
|
ttl: 6e4,
|
|
5529
5539
|
// 60 seconds
|
|
@@ -5557,7 +5567,7 @@ async function loadConfigUncached(projectDir) {
|
|
|
5557
5567
|
logger.warn("\u26A0\uFE0F DEPRECATED: automatosx.config.{yaml,json} is deprecated.");
|
|
5558
5568
|
logger.warn(" Please rename to ax.config.{yaml,json} for future compatibility.");
|
|
5559
5569
|
logger.warn(" Migration: mv automatosx.config.json ax.config.json");
|
|
5560
|
-
logger.warn(" Support will be removed in
|
|
5570
|
+
logger.warn(" Support will be removed in a future version.");
|
|
5561
5571
|
}
|
|
5562
5572
|
return await loadConfigFile(configPath);
|
|
5563
5573
|
}
|
|
@@ -6052,7 +6062,7 @@ function validateConfig(config) {
|
|
|
6052
6062
|
return errors;
|
|
6053
6063
|
}
|
|
6054
6064
|
|
|
6055
|
-
// src/core/router.ts
|
|
6065
|
+
// src/core/router/router.ts
|
|
6056
6066
|
init_esm_shims();
|
|
6057
6067
|
init_logger();
|
|
6058
6068
|
init_errors();
|
|
@@ -6061,7 +6071,7 @@ init_errors();
|
|
|
6061
6071
|
init_esm_shims();
|
|
6062
6072
|
init_logger();
|
|
6063
6073
|
|
|
6064
|
-
// src/
|
|
6074
|
+
// src/shared/validation/path-resolver.ts
|
|
6065
6075
|
init_esm_shims();
|
|
6066
6076
|
|
|
6067
6077
|
// src/types/path.ts
|
|
@@ -6074,7 +6084,7 @@ var PathError = class extends Error {
|
|
|
6074
6084
|
}
|
|
6075
6085
|
};
|
|
6076
6086
|
|
|
6077
|
-
// src/
|
|
6087
|
+
// src/shared/validation/path-resolver.ts
|
|
6078
6088
|
function isWindowsPath(path5) {
|
|
6079
6089
|
return /^[a-zA-Z]:[/\\]/.test(path5);
|
|
6080
6090
|
}
|
|
@@ -6614,7 +6624,7 @@ async function getProviderLimitManager(stateDirectory) {
|
|
|
6614
6624
|
return ProviderLimitManager.getInstance(stateDirectory);
|
|
6615
6625
|
}
|
|
6616
6626
|
|
|
6617
|
-
// src/
|
|
6627
|
+
// src/shared/profiling/performance-markers.ts
|
|
6618
6628
|
init_esm_shims();
|
|
6619
6629
|
init_logger();
|
|
6620
6630
|
var PERFORMANCE_THRESHOLDS = {
|
|
@@ -6768,7 +6778,7 @@ var PerformanceTimer = class {
|
|
|
6768
6778
|
}
|
|
6769
6779
|
};
|
|
6770
6780
|
|
|
6771
|
-
// src/core/routing-strategy.ts
|
|
6781
|
+
// src/core/router/routing-strategy.ts
|
|
6772
6782
|
init_esm_shims();
|
|
6773
6783
|
|
|
6774
6784
|
// src/types/routing.ts
|
|
@@ -6845,7 +6855,7 @@ var ROUTING_STRATEGIES = {
|
|
|
6845
6855
|
init_esm_shims();
|
|
6846
6856
|
init_logger();
|
|
6847
6857
|
|
|
6848
|
-
// src/
|
|
6858
|
+
// src/shared/helpers/statistics.ts
|
|
6849
6859
|
init_esm_shims();
|
|
6850
6860
|
function getPercentileIndex(length, percentile) {
|
|
6851
6861
|
if (length === 0) {
|
|
@@ -7291,7 +7301,7 @@ function getProviderMetricsTracker() {
|
|
|
7291
7301
|
return globalMetricsTracker;
|
|
7292
7302
|
}
|
|
7293
7303
|
|
|
7294
|
-
// src/core/routing-strategy.ts
|
|
7304
|
+
// src/core/router/routing-strategy.ts
|
|
7295
7305
|
init_logger();
|
|
7296
7306
|
var RoutingStrategyManager = class extends EventEmitter {
|
|
7297
7307
|
strategy;
|
|
@@ -7574,7 +7584,7 @@ function getRoutingStrategyManager(config) {
|
|
|
7574
7584
|
return globalRoutingStrategy;
|
|
7575
7585
|
}
|
|
7576
7586
|
|
|
7577
|
-
// src/core/circuit-breaker.ts
|
|
7587
|
+
// src/core/router/circuit-breaker.ts
|
|
7578
7588
|
init_esm_shims();
|
|
7579
7589
|
init_logger();
|
|
7580
7590
|
var DEFAULT_CONFIG2 = {
|
|
@@ -7737,7 +7747,7 @@ var CircuitBreaker = class {
|
|
|
7737
7747
|
}
|
|
7738
7748
|
};
|
|
7739
7749
|
|
|
7740
|
-
// src/core/router
|
|
7750
|
+
// src/core/router/trace-logger.ts
|
|
7741
7751
|
init_esm_shims();
|
|
7742
7752
|
init_logger();
|
|
7743
7753
|
var RouterTraceLogger = class {
|
|
@@ -8109,7 +8119,7 @@ async function getProviderSession(workspacePath) {
|
|
|
8109
8119
|
return providerSessionInstances.get(path5);
|
|
8110
8120
|
}
|
|
8111
8121
|
|
|
8112
|
-
// src/core/router.ts
|
|
8122
|
+
// src/core/router/router.ts
|
|
8113
8123
|
var Router = class {
|
|
8114
8124
|
providers;
|
|
8115
8125
|
fallbackEnabled;
|
|
@@ -8289,23 +8299,29 @@ var Router = class {
|
|
|
8289
8299
|
const isCircuitOpen = this.circuitBreaker.isOpen(provider.name);
|
|
8290
8300
|
healthMultipliers.set(provider.name, isCircuitOpen ? 0.5 : 1);
|
|
8291
8301
|
}
|
|
8292
|
-
|
|
8293
|
-
|
|
8294
|
-
|
|
8295
|
-
|
|
8296
|
-
|
|
8297
|
-
|
|
8298
|
-
|
|
8299
|
-
|
|
8300
|
-
|
|
8301
|
-
|
|
8302
|
-
|
|
8303
|
-
|
|
8304
|
-
|
|
8305
|
-
|
|
8306
|
-
|
|
8307
|
-
|
|
8308
|
-
|
|
8302
|
+
try {
|
|
8303
|
+
const scores = await getProviderMetricsTracker().getAllScores(
|
|
8304
|
+
providerNames,
|
|
8305
|
+
strategyManager.getWeights(),
|
|
8306
|
+
healthMultipliers
|
|
8307
|
+
);
|
|
8308
|
+
if (scores.length > 0) {
|
|
8309
|
+
const scoreMap = new Map(scores.map((s) => [s.provider, s.totalScore]));
|
|
8310
|
+
const originalOrder = providersToTry.map((p) => p.name);
|
|
8311
|
+
providersToTry = [...providersToTry].sort((a, b) => {
|
|
8312
|
+
const scoreA = scoreMap.get(a.name) ?? 0;
|
|
8313
|
+
const scoreB = scoreMap.get(b.name) ?? 0;
|
|
8314
|
+
return scoreB - scoreA;
|
|
8315
|
+
});
|
|
8316
|
+
logger.debug("Provider order after multi-factor routing", {
|
|
8317
|
+
original: originalOrder,
|
|
8318
|
+
reordered: providersToTry.map((p) => p.name),
|
|
8319
|
+
scores: Object.fromEntries(scoreMap)
|
|
8320
|
+
});
|
|
8321
|
+
}
|
|
8322
|
+
} catch (scoringError) {
|
|
8323
|
+
logger.warn("Multi-factor scoring failed, using priority order", {
|
|
8324
|
+
error: scoringError.message
|
|
8309
8325
|
});
|
|
8310
8326
|
}
|
|
8311
8327
|
}
|
|
@@ -8913,10 +8929,10 @@ Run 'ax doctor' to diagnose provider setup.` : "";
|
|
|
8913
8929
|
}
|
|
8914
8930
|
};
|
|
8915
8931
|
|
|
8916
|
-
// src/core/lazy-
|
|
8932
|
+
// src/core/memory/lazy-manager.ts
|
|
8917
8933
|
init_esm_shims();
|
|
8918
8934
|
|
|
8919
|
-
// src/core/memory
|
|
8935
|
+
// src/core/memory/manager.ts
|
|
8920
8936
|
init_esm_shims();
|
|
8921
8937
|
|
|
8922
8938
|
// src/types/memory.ts
|
|
@@ -8930,11 +8946,11 @@ var MemoryError = class extends Error {
|
|
|
8930
8946
|
}
|
|
8931
8947
|
};
|
|
8932
8948
|
|
|
8933
|
-
// src/core/memory
|
|
8949
|
+
// src/core/memory/manager.ts
|
|
8934
8950
|
init_logger();
|
|
8935
|
-
|
|
8951
|
+
init_factory();
|
|
8936
8952
|
|
|
8937
|
-
// src/core/memory
|
|
8953
|
+
// src/core/memory/schemas.ts
|
|
8938
8954
|
init_esm_shims();
|
|
8939
8955
|
var MemoryMetadataSchema = z.object({
|
|
8940
8956
|
type: z.string().min(1).max(100),
|
|
@@ -9210,7 +9226,7 @@ var MemoryCleanupStrategies = class {
|
|
|
9210
9226
|
}
|
|
9211
9227
|
};
|
|
9212
9228
|
|
|
9213
|
-
// src/core/memory
|
|
9229
|
+
// src/core/memory/manager.ts
|
|
9214
9230
|
var MemoryManager = class _MemoryManager {
|
|
9215
9231
|
// v5.6.18: Performance optimization - Static regex for FTS5 query sanitization
|
|
9216
9232
|
// Moving these to class-level constants reduces 90% sanitization time
|
|
@@ -10183,8 +10199,11 @@ var MemoryManager = class _MemoryManager {
|
|
|
10183
10199
|
}
|
|
10184
10200
|
const tempPath = `${this.config.dbPath}.restore.tmp`;
|
|
10185
10201
|
const srcDb = new Database2(srcPath, { readonly: true });
|
|
10186
|
-
|
|
10187
|
-
|
|
10202
|
+
try {
|
|
10203
|
+
await srcDb.backup(tempPath);
|
|
10204
|
+
} finally {
|
|
10205
|
+
srcDb.close();
|
|
10206
|
+
}
|
|
10188
10207
|
try {
|
|
10189
10208
|
const tempDb = new Database2(tempPath, { readonly: true });
|
|
10190
10209
|
tempDb.prepare("SELECT COUNT(*) FROM memory_entries").get();
|
|
@@ -10467,7 +10486,7 @@ var MemoryManager = class _MemoryManager {
|
|
|
10467
10486
|
}
|
|
10468
10487
|
};
|
|
10469
10488
|
|
|
10470
|
-
// src/core/lazy-
|
|
10489
|
+
// src/core/memory/lazy-manager.ts
|
|
10471
10490
|
init_logger();
|
|
10472
10491
|
var LazyMemoryManager = class {
|
|
10473
10492
|
manager;
|
|
@@ -10673,7 +10692,7 @@ var LazyMemoryManager = class {
|
|
|
10673
10692
|
}
|
|
10674
10693
|
};
|
|
10675
10694
|
|
|
10676
|
-
// src/core/session
|
|
10695
|
+
// src/core/session/manager.ts
|
|
10677
10696
|
init_esm_shims();
|
|
10678
10697
|
|
|
10679
10698
|
// src/types/orchestration.ts
|
|
@@ -10696,10 +10715,10 @@ var SessionError = class extends Error {
|
|
|
10696
10715
|
}
|
|
10697
10716
|
};
|
|
10698
10717
|
|
|
10699
|
-
// src/core/session
|
|
10718
|
+
// src/core/session/manager.ts
|
|
10700
10719
|
init_logger();
|
|
10701
10720
|
|
|
10702
|
-
// src/core/session
|
|
10721
|
+
// src/core/session/schemas.ts
|
|
10703
10722
|
init_esm_shims();
|
|
10704
10723
|
var SessionTaskInfoSchema = z.object({
|
|
10705
10724
|
id: z.string().min(1).max(200),
|
|
@@ -10742,7 +10761,7 @@ z.object({
|
|
|
10742
10761
|
offset: z.number().int().nonnegative().optional()
|
|
10743
10762
|
}).strict();
|
|
10744
10763
|
|
|
10745
|
-
// src/core/session
|
|
10764
|
+
// src/core/session/manager.ts
|
|
10746
10765
|
var SessionManager = class _SessionManager {
|
|
10747
10766
|
/** Active sessions (in-memory, keyed by session ID) */
|
|
10748
10767
|
activeSessions = /* @__PURE__ */ new Map();
|
|
@@ -12935,17 +12954,30 @@ function safeValidateAgentProfile(profile) {
|
|
|
12935
12954
|
}
|
|
12936
12955
|
agentProfileSchema.partial();
|
|
12937
12956
|
|
|
12938
|
-
// src/
|
|
12939
|
-
|
|
12940
|
-
var
|
|
12941
|
-
function getPackageRoot() {
|
|
12942
|
-
|
|
12943
|
-
|
|
12944
|
-
|
|
12945
|
-
|
|
12946
|
-
|
|
12957
|
+
// src/shared/helpers/package-root.ts
|
|
12958
|
+
init_esm_shims();
|
|
12959
|
+
var cachedPackageRoot = null;
|
|
12960
|
+
function getPackageRoot(startDir) {
|
|
12961
|
+
if (cachedPackageRoot && !startDir) {
|
|
12962
|
+
return cachedPackageRoot;
|
|
12963
|
+
}
|
|
12964
|
+
const __filename2 = fileURLToPath(import.meta.url);
|
|
12965
|
+
const __dirname3 = dirname(__filename2);
|
|
12966
|
+
let current = startDir || __dirname3;
|
|
12967
|
+
const root = "/";
|
|
12968
|
+
while (current !== root) {
|
|
12969
|
+
if (existsSync(join(current, "package.json"))) {
|
|
12970
|
+
{
|
|
12971
|
+
cachedPackageRoot = current;
|
|
12972
|
+
}
|
|
12973
|
+
return current;
|
|
12974
|
+
}
|
|
12975
|
+
current = dirname(current);
|
|
12947
12976
|
}
|
|
12977
|
+
return startDir || __dirname3;
|
|
12948
12978
|
}
|
|
12979
|
+
|
|
12980
|
+
// src/agents/profile-loader.ts
|
|
12949
12981
|
var ProfileLoader = class {
|
|
12950
12982
|
profilesDir;
|
|
12951
12983
|
fallbackProfilesDir;
|
|
@@ -13629,23 +13661,13 @@ var ProfileLoader = class {
|
|
|
13629
13661
|
// src/agents/abilities-manager.ts
|
|
13630
13662
|
init_esm_shims();
|
|
13631
13663
|
init_logger();
|
|
13632
|
-
var __filename3 = fileURLToPath(import.meta.url);
|
|
13633
|
-
var __dirname4 = dirname(__filename3);
|
|
13634
|
-
function getPackageRoot2() {
|
|
13635
|
-
const currentDir = __dirname4;
|
|
13636
|
-
if (currentDir.includes("/dist")) {
|
|
13637
|
-
return join(currentDir, "..");
|
|
13638
|
-
} else {
|
|
13639
|
-
return join(currentDir, "../..");
|
|
13640
|
-
}
|
|
13641
|
-
}
|
|
13642
13664
|
var AbilitiesManager = class {
|
|
13643
13665
|
abilitiesDir;
|
|
13644
13666
|
fallbackAbilitiesDir;
|
|
13645
13667
|
cache;
|
|
13646
13668
|
constructor(abilitiesDir, fallbackAbilitiesDir) {
|
|
13647
13669
|
this.abilitiesDir = abilitiesDir;
|
|
13648
|
-
this.fallbackAbilitiesDir = fallbackAbilitiesDir || join(
|
|
13670
|
+
this.fallbackAbilitiesDir = fallbackAbilitiesDir || join(getPackageRoot(), "examples/abilities");
|
|
13649
13671
|
this.cache = new TTLCache({
|
|
13650
13672
|
maxEntries: 50,
|
|
13651
13673
|
ttl: 6e5,
|
|
@@ -13930,9 +13952,10 @@ var TeamManager = class {
|
|
|
13930
13952
|
}
|
|
13931
13953
|
};
|
|
13932
13954
|
|
|
13933
|
-
// src/core/
|
|
13955
|
+
// src/core/session/context-store.ts
|
|
13934
13956
|
init_esm_shims();
|
|
13935
13957
|
init_logger();
|
|
13958
|
+
var VALID_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
13936
13959
|
var ConversationContextStore = class {
|
|
13937
13960
|
storePath;
|
|
13938
13961
|
maxEntries;
|
|
@@ -13942,6 +13965,33 @@ var ConversationContextStore = class {
|
|
|
13942
13965
|
this.maxEntries = options.maxEntries ?? 100;
|
|
13943
13966
|
this.ttlMs = options.ttlMs ?? 24 * 60 * 60 * 1e3;
|
|
13944
13967
|
}
|
|
13968
|
+
/**
|
|
13969
|
+
* Validate and sanitize context ID to prevent path traversal attacks
|
|
13970
|
+
*
|
|
13971
|
+
* SECURITY: This is critical to prevent path traversal vulnerabilities.
|
|
13972
|
+
* A malicious ID like "../../.ssh/id_rsa" could read/write/delete files
|
|
13973
|
+
* outside the context store directory.
|
|
13974
|
+
*
|
|
13975
|
+
* @param id - Context ID to validate
|
|
13976
|
+
* @returns Sanitized file path within storePath
|
|
13977
|
+
* @throws Error if ID is invalid or path escapes storePath
|
|
13978
|
+
*/
|
|
13979
|
+
validateAndResolvePath(id) {
|
|
13980
|
+
if (!VALID_ID_PATTERN.test(id)) {
|
|
13981
|
+
throw new Error(
|
|
13982
|
+
`Invalid context ID: "${id}". IDs must be 1-64 characters, alphanumeric with underscores/hyphens only.`
|
|
13983
|
+
);
|
|
13984
|
+
}
|
|
13985
|
+
const filePath = join(this.storePath, `${id}.json`);
|
|
13986
|
+
const resolvedPath = resolve(filePath);
|
|
13987
|
+
const resolvedStorePath = resolve(this.storePath);
|
|
13988
|
+
const relativePath = relative(resolvedStorePath, resolvedPath);
|
|
13989
|
+
if (relativePath.startsWith("..") || relativePath.includes("/..") || relativePath.includes("\\..")) {
|
|
13990
|
+
logger.error("[ContextStore] Path traversal attempt blocked", { id, resolvedPath });
|
|
13991
|
+
throw new Error(`Security violation: context ID "${id}" would escape store directory`);
|
|
13992
|
+
}
|
|
13993
|
+
return resolvedPath;
|
|
13994
|
+
}
|
|
13945
13995
|
/**
|
|
13946
13996
|
* Initialize store (create directory if needed)
|
|
13947
13997
|
*/
|
|
@@ -13959,7 +14009,7 @@ var ConversationContextStore = class {
|
|
|
13959
14009
|
*/
|
|
13960
14010
|
async save(context) {
|
|
13961
14011
|
await this.initialize();
|
|
13962
|
-
const filePath =
|
|
14012
|
+
const filePath = this.validateAndResolvePath(context.id);
|
|
13963
14013
|
const data = JSON.stringify(context, null, 2);
|
|
13964
14014
|
try {
|
|
13965
14015
|
await writeFile(filePath, data, "utf-8");
|
|
@@ -13978,7 +14028,7 @@ var ConversationContextStore = class {
|
|
|
13978
14028
|
* Get conversation context by ID
|
|
13979
14029
|
*/
|
|
13980
14030
|
async get(id) {
|
|
13981
|
-
const filePath =
|
|
14031
|
+
const filePath = this.validateAndResolvePath(id);
|
|
13982
14032
|
try {
|
|
13983
14033
|
const data = await readFile(filePath, "utf-8");
|
|
13984
14034
|
const context = JSON.parse(data);
|
|
@@ -14032,7 +14082,7 @@ var ConversationContextStore = class {
|
|
|
14032
14082
|
* Delete context entry
|
|
14033
14083
|
*/
|
|
14034
14084
|
async delete(id) {
|
|
14035
|
-
const filePath =
|
|
14085
|
+
const filePath = this.validateAndResolvePath(id);
|
|
14036
14086
|
try {
|
|
14037
14087
|
await unlink(filePath);
|
|
14038
14088
|
logger.info("[ContextStore] Context deleted", { id });
|
|
@@ -14725,7 +14775,7 @@ var TimeoutManager = class {
|
|
|
14725
14775
|
}
|
|
14726
14776
|
};
|
|
14727
14777
|
|
|
14728
|
-
// src/
|
|
14778
|
+
// src/shared/validation/timeout-validator.ts
|
|
14729
14779
|
init_esm_shims();
|
|
14730
14780
|
init_errors();
|
|
14731
14781
|
var MIN_WARNING_THRESHOLD2 = 0.5;
|
|
@@ -14798,7 +14848,7 @@ function validateAndBuildTimeoutConfig(executionConfig) {
|
|
|
14798
14848
|
return config;
|
|
14799
14849
|
}
|
|
14800
14850
|
|
|
14801
|
-
// src/
|
|
14851
|
+
// src/shared/errors/error-formatter.ts
|
|
14802
14852
|
init_esm_shims();
|
|
14803
14853
|
init_errors();
|
|
14804
14854
|
function formatError(error, options = {}) {
|
|
@@ -16466,7 +16516,7 @@ ${context.task}`;
|
|
|
16466
16516
|
* @param signal - Optional AbortSignal to cancel the sleep
|
|
16467
16517
|
*/
|
|
16468
16518
|
sleep(ms, signal) {
|
|
16469
|
-
return new Promise((
|
|
16519
|
+
return new Promise((resolve5, reject) => {
|
|
16470
16520
|
if (signal?.aborted) {
|
|
16471
16521
|
reject(new Error("Sleep cancelled"));
|
|
16472
16522
|
return;
|
|
@@ -16476,7 +16526,7 @@ ${context.task}`;
|
|
|
16476
16526
|
if (abortHandler && signal) {
|
|
16477
16527
|
signal.removeEventListener("abort", abortHandler);
|
|
16478
16528
|
}
|
|
16479
|
-
|
|
16529
|
+
resolve5();
|
|
16480
16530
|
}, ms);
|
|
16481
16531
|
if (signal) {
|
|
16482
16532
|
abortHandler = () => {
|
|
@@ -17894,10 +17944,10 @@ var McpClient = class extends EventEmitter {
|
|
|
17894
17944
|
return;
|
|
17895
17945
|
}
|
|
17896
17946
|
if (this.state.status === "connecting") {
|
|
17897
|
-
return new Promise((
|
|
17947
|
+
return new Promise((resolve5, reject) => {
|
|
17898
17948
|
const onConnected = () => {
|
|
17899
17949
|
this.off("error", onError);
|
|
17900
|
-
|
|
17950
|
+
resolve5();
|
|
17901
17951
|
};
|
|
17902
17952
|
const onError = (err) => {
|
|
17903
17953
|
this.off("connected", onConnected);
|
|
@@ -18064,14 +18114,14 @@ var McpClient = class extends EventEmitter {
|
|
|
18064
18114
|
method,
|
|
18065
18115
|
params
|
|
18066
18116
|
};
|
|
18067
|
-
return new Promise((
|
|
18117
|
+
return new Promise((resolve5, reject) => {
|
|
18068
18118
|
const timeoutMs = timeout ?? this.config.timeout;
|
|
18069
18119
|
const timeoutHandle = setTimeout(() => {
|
|
18070
18120
|
this.pendingRequests.delete(id);
|
|
18071
18121
|
reject(new Error(`Request timed out after ${timeoutMs}ms: ${method}`));
|
|
18072
18122
|
}, timeoutMs);
|
|
18073
18123
|
this.pendingRequests.set(id, {
|
|
18074
|
-
resolve:
|
|
18124
|
+
resolve: resolve5,
|
|
18075
18125
|
reject,
|
|
18076
18126
|
timeout: timeoutHandle
|
|
18077
18127
|
});
|
|
@@ -18529,15 +18579,15 @@ var McpClientPool = class extends EventEmitter {
|
|
|
18529
18579
|
}
|
|
18530
18580
|
}
|
|
18531
18581
|
async waitForConnection(provider, pool) {
|
|
18532
|
-
return new Promise((
|
|
18582
|
+
return new Promise((resolve5, reject) => {
|
|
18533
18583
|
const timeout = setTimeout(() => {
|
|
18534
|
-
const index = pool.waitQueue.findIndex((w) => w.resolve ===
|
|
18584
|
+
const index = pool.waitQueue.findIndex((w) => w.resolve === resolve5);
|
|
18535
18585
|
if (index !== -1) {
|
|
18536
18586
|
pool.waitQueue.splice(index, 1);
|
|
18537
18587
|
}
|
|
18538
18588
|
reject(new ConnectionTimeoutError(provider, this.config.acquireTimeoutMs));
|
|
18539
18589
|
}, this.config.acquireTimeoutMs);
|
|
18540
|
-
pool.waitQueue.push({ resolve:
|
|
18590
|
+
pool.waitQueue.push({ resolve: resolve5, reject, timeout });
|
|
18541
18591
|
logger.debug("[MCP Pool] Waiting for connection", {
|
|
18542
18592
|
provider,
|
|
18543
18593
|
queuePosition: pool.waitQueue.length
|
|
@@ -20014,6 +20064,8 @@ var McpServer = class _McpServer {
|
|
|
20014
20064
|
initializationPromise = null;
|
|
20015
20065
|
initializationMutex = new Mutex();
|
|
20016
20066
|
// BUG FIX (v9.0.1): Prevent concurrent initialization
|
|
20067
|
+
stdinMutex = new Mutex();
|
|
20068
|
+
// BUG FIX: Prevent race conditions in stdin message processing
|
|
20017
20069
|
version;
|
|
20018
20070
|
ajv;
|
|
20019
20071
|
compiledValidators = /* @__PURE__ */ new Map();
|
|
@@ -20389,7 +20441,15 @@ var McpServer = class _McpServer {
|
|
|
20389
20441
|
* v10.5.0: Capture clientInfo for Smart Routing
|
|
20390
20442
|
*/
|
|
20391
20443
|
async handleInitialize(request, id) {
|
|
20392
|
-
const clientInfo = request.params
|
|
20444
|
+
const clientInfo = request.params?.clientInfo;
|
|
20445
|
+
if (!clientInfo || typeof clientInfo.name !== "string" || typeof clientInfo.version !== "string") {
|
|
20446
|
+
logger.warn("[MCP Server] Invalid initialize request: missing or invalid clientInfo", {
|
|
20447
|
+
hasParams: !!request.params,
|
|
20448
|
+
hasClientInfo: !!clientInfo,
|
|
20449
|
+
clientInfo
|
|
20450
|
+
});
|
|
20451
|
+
return this.createErrorResponse(id, -32600 /* InvalidRequest */, "Invalid initialize request: clientInfo with name and version is required");
|
|
20452
|
+
}
|
|
20393
20453
|
logger.info("[MCP Server] Initialize request received (fast handshake mode)", { clientInfo });
|
|
20394
20454
|
this.session = {
|
|
20395
20455
|
clientInfo: {
|
|
@@ -20515,67 +20575,77 @@ ${json}`;
|
|
|
20515
20575
|
logger.info("[MCP Server] Starting stdio JSON-RPC server...");
|
|
20516
20576
|
let buffer = "";
|
|
20517
20577
|
let contentLength = null;
|
|
20518
|
-
process.stdin.on("data",
|
|
20519
|
-
|
|
20520
|
-
|
|
20521
|
-
|
|
20522
|
-
|
|
20523
|
-
|
|
20524
|
-
|
|
20525
|
-
|
|
20526
|
-
|
|
20527
|
-
|
|
20528
|
-
|
|
20529
|
-
|
|
20530
|
-
|
|
20531
|
-
iterations
|
|
20532
|
-
|
|
20533
|
-
|
|
20534
|
-
|
|
20535
|
-
|
|
20536
|
-
|
|
20537
|
-
|
|
20538
|
-
const
|
|
20539
|
-
|
|
20540
|
-
|
|
20541
|
-
|
|
20542
|
-
|
|
20543
|
-
|
|
20544
|
-
|
|
20545
|
-
|
|
20578
|
+
process.stdin.on("data", (chunk) => {
|
|
20579
|
+
void this.stdinMutex.runExclusive(async () => {
|
|
20580
|
+
buffer += chunk.toString("utf-8");
|
|
20581
|
+
if (buffer.length > STDIO_MAX_BUFFER_SIZE) {
|
|
20582
|
+
logger.error("[MCP Server] Buffer size exceeded maximum", {
|
|
20583
|
+
bufferSize: buffer.length,
|
|
20584
|
+
maxSize: STDIO_MAX_BUFFER_SIZE
|
|
20585
|
+
});
|
|
20586
|
+
buffer = "";
|
|
20587
|
+
contentLength = null;
|
|
20588
|
+
return;
|
|
20589
|
+
}
|
|
20590
|
+
let iterations = 0;
|
|
20591
|
+
while (iterations < STDIO_MAX_ITERATIONS) {
|
|
20592
|
+
iterations++;
|
|
20593
|
+
if (contentLength === null) {
|
|
20594
|
+
const delimiter2 = buffer.includes("\r\n\r\n") ? "\r\n\r\n" : buffer.includes("\n\n") ? "\n\n" : null;
|
|
20595
|
+
if (!delimiter2) break;
|
|
20596
|
+
const headerEndIndex = buffer.indexOf(delimiter2);
|
|
20597
|
+
const headerBlock = buffer.slice(0, headerEndIndex);
|
|
20598
|
+
for (const line of headerBlock.split(delimiter2 === "\r\n\r\n" ? "\r\n" : "\n")) {
|
|
20599
|
+
const [key, value] = line.split(":", 2).map((s) => s.trim());
|
|
20600
|
+
if (key && key.toLowerCase() === "content-length" && value) {
|
|
20601
|
+
contentLength = parseInt(value, 10);
|
|
20602
|
+
if (isNaN(contentLength) || contentLength <= 0 || contentLength > STDIO_MAX_MESSAGE_SIZE) {
|
|
20603
|
+
logger.error("[MCP Server] Invalid Content-Length", { contentLength });
|
|
20604
|
+
this.writeResponse({
|
|
20605
|
+
jsonrpc: "2.0",
|
|
20606
|
+
id: null,
|
|
20607
|
+
error: {
|
|
20608
|
+
code: -32600 /* InvalidRequest */,
|
|
20609
|
+
message: `Invalid Content-Length: ${contentLength}`
|
|
20610
|
+
}
|
|
20611
|
+
});
|
|
20612
|
+
buffer = buffer.slice(headerEndIndex + delimiter2.length);
|
|
20613
|
+
contentLength = null;
|
|
20614
|
+
continue;
|
|
20615
|
+
}
|
|
20546
20616
|
}
|
|
20547
20617
|
}
|
|
20548
|
-
|
|
20549
|
-
|
|
20550
|
-
|
|
20618
|
+
if (contentLength === null) {
|
|
20619
|
+
logger.error("[MCP Server] No Content-Length header found");
|
|
20620
|
+
buffer = buffer.slice(headerEndIndex + delimiter2.length);
|
|
20621
|
+
continue;
|
|
20622
|
+
}
|
|
20551
20623
|
buffer = buffer.slice(headerEndIndex + delimiter2.length);
|
|
20552
|
-
continue;
|
|
20553
20624
|
}
|
|
20554
|
-
|
|
20555
|
-
|
|
20556
|
-
|
|
20557
|
-
|
|
20558
|
-
|
|
20559
|
-
|
|
20560
|
-
|
|
20561
|
-
|
|
20562
|
-
|
|
20563
|
-
|
|
20564
|
-
|
|
20565
|
-
|
|
20566
|
-
|
|
20625
|
+
if (Buffer.byteLength(buffer, "utf-8") < contentLength) break;
|
|
20626
|
+
const messageBuffer = Buffer.from(buffer, "utf-8");
|
|
20627
|
+
const jsonMessage = messageBuffer.slice(0, contentLength).toString("utf-8");
|
|
20628
|
+
buffer = messageBuffer.slice(contentLength).toString("utf-8");
|
|
20629
|
+
contentLength = null;
|
|
20630
|
+
try {
|
|
20631
|
+
const request = JSON.parse(jsonMessage);
|
|
20632
|
+
logger.debug("[MCP Server] Request received", { method: request.method, id: request.id });
|
|
20633
|
+
const response = await this.handleRequest(request);
|
|
20634
|
+
if (request.id !== void 0 && request.id !== null) {
|
|
20635
|
+
this.writeResponse(response);
|
|
20636
|
+
}
|
|
20637
|
+
} catch (error) {
|
|
20638
|
+
logger.error("[MCP Server] Failed to parse or handle request", { jsonMessage, error });
|
|
20639
|
+
this.writeResponse({ jsonrpc: "2.0", id: null, error: { code: -32700 /* ParseError */, message: "Parse error: Invalid JSON" } });
|
|
20567
20640
|
}
|
|
20568
|
-
} catch (error) {
|
|
20569
|
-
logger.error("[MCP Server] Failed to parse or handle request", { jsonMessage, error });
|
|
20570
|
-
this.writeResponse({ jsonrpc: "2.0", id: null, error: { code: -32700 /* ParseError */, message: "Parse error: Invalid JSON" } });
|
|
20571
20641
|
}
|
|
20572
|
-
|
|
20573
|
-
|
|
20574
|
-
|
|
20575
|
-
|
|
20576
|
-
|
|
20577
|
-
}
|
|
20578
|
-
}
|
|
20642
|
+
if (iterations >= STDIO_MAX_ITERATIONS) {
|
|
20643
|
+
logger.warn("[MCP Server] Maximum iterations reached in message processing", {
|
|
20644
|
+
iterations,
|
|
20645
|
+
bufferSize: buffer.length
|
|
20646
|
+
});
|
|
20647
|
+
}
|
|
20648
|
+
});
|
|
20579
20649
|
});
|
|
20580
20650
|
const shutdown = (reason) => {
|
|
20581
20651
|
logger.info(`[MCP Server] ${reason}`);
|