@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.
Files changed (31) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +546 -465
  3. package/dist/mcp/index.js +243 -173
  4. package/examples/providers/README.md +58 -169
  5. package/package.json +1 -1
  6. package/CHANGELOG.md +0 -41
  7. package/CODE_OF_CONDUCT.md +0 -133
  8. package/CONTRIBUTING.md +0 -427
  9. package/FAQ.md +0 -895
  10. package/TROUBLESHOOTING.md +0 -972
  11. package/templates/providers/README.md +0 -117
  12. /package/examples/{claude → providers/claude}/CLAUDE_INTEGRATION.md +0 -0
  13. /package/examples/{claude → providers/claude}/mcp/automatosx.json +0 -0
  14. /package/examples/{codex → providers/codex}/CODEX_INTEGRATION.md +0 -0
  15. /package/examples/{codex → providers/codex}/README.md +0 -0
  16. /package/examples/{codex → providers/codex}/usage-examples.ts +0 -0
  17. /package/examples/{gemini → providers/gemini}/GEMINI_INTEGRATION.md +0 -0
  18. /package/examples/{gemini → providers/gemini}/README.md +0 -0
  19. /package/examples/{integrations → providers}/openai-codex-example.ts +0 -0
  20. /package/{templates → examples}/specs/enterprise.yaml.mustache +0 -0
  21. /package/{templates → examples}/specs/government.yaml.mustache +0 -0
  22. /package/{templates → examples}/specs/minimal.yaml.mustache +0 -0
  23. /package/examples/{templates → workflows}/analyst.yaml +0 -0
  24. /package/examples/{templates → workflows}/assistant.yaml +0 -0
  25. /package/examples/{templates → workflows}/basic-agent.yaml +0 -0
  26. /package/examples/{templates → workflows}/code-reviewer.yaml +0 -0
  27. /package/examples/{templates → workflows}/debugger.yaml +0 -0
  28. /package/examples/{templates → workflows}/designer.yaml +0 -0
  29. /package/examples/{templates → workflows}/developer.yaml +0 -0
  30. /package/examples/{templates → workflows}/fullstack-developer.yaml +0 -0
  31. /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/utils/logger.ts"() {
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/utils/errors.ts
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/utils/errors.ts"() {
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/utils/process-manager.ts
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/utils/process-manager.ts"() {
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((resolve4) => {
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
- resolve4();
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((resolve4) => {
734
- finalTimeoutId = setTimeout(resolve4, timeout);
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 init_db_factory = __esm({
786
- "src/utils/db-factory.ts"() {
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
- init_db_factory();
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/utils/verbosity-manager.ts
1490
+ // src/shared/logging/verbosity-manager.ts
1491
1491
  var VerbosityManager;
1492
1492
  var init_verbosity_manager = __esm({
1493
- "src/utils/verbosity-manager.ts"() {
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/utils/streaming-progress-parser.ts"() {
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 argsString = cliArgs.length > 0 ? cliArgs.join(" ") + " " : "";
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((resolve4, reject) => {
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
- resolve4({ stdout, stderr });
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((resolve4, reject) => {
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
- resolve4({ stdout, stderr });
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((resolve4, reject) => {
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
- resolve4({ stdout, stderr, exitCode: code });
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((resolve4, reject) => {
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
- resolve4({ stdout, stderr, exitCode: code });
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/utils/version.ts
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, "../../package.json"),
4018
- // From src/utils
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/utils/path-utils.ts
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/utils/deep-merge.ts
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/utils/resource-calculator.ts
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.generated.ts
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": 3,
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": 1,
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.5"
5232
+ "version": "11.2.7"
5223
5233
  };
5224
5234
 
5225
- // src/core/config-schemas.ts
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 v10.0.0.");
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/core/path-resolver.ts
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/core/path-resolver.ts
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/utils/performance-markers.ts
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/utils/statistics.ts
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-trace-logger.ts
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
- const scores = await getProviderMetricsTracker().getAllScores(
8293
- providerNames,
8294
- strategyManager.getWeights(),
8295
- healthMultipliers
8296
- );
8297
- if (scores.length > 0) {
8298
- const scoreMap = new Map(scores.map((s) => [s.provider, s.totalScore]));
8299
- const originalOrder = providersToTry.map((p) => p.name);
8300
- providersToTry = [...providersToTry].sort((a, b) => {
8301
- const scoreA = scoreMap.get(a.name) ?? 0;
8302
- const scoreB = scoreMap.get(b.name) ?? 0;
8303
- return scoreB - scoreA;
8304
- });
8305
- logger.debug("Provider order after multi-factor routing", {
8306
- original: originalOrder,
8307
- reordered: providersToTry.map((p) => p.name),
8308
- scores: Object.fromEntries(scoreMap)
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-memory-manager.ts
8932
+ // src/core/memory/lazy-manager.ts
8917
8933
  init_esm_shims();
8918
8934
 
8919
- // src/core/memory-manager.ts
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-manager.ts
8949
+ // src/core/memory/manager.ts
8934
8950
  init_logger();
8935
- init_db_factory();
8951
+ init_factory();
8936
8952
 
8937
- // src/core/memory-manager-schemas.ts
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-manager.ts
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
- await srcDb.backup(tempPath);
10187
- srcDb.close();
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-memory-manager.ts
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-manager.ts
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-manager.ts
10718
+ // src/core/session/manager.ts
10700
10719
  init_logger();
10701
10720
 
10702
- // src/core/session-manager-schemas.ts
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-manager.ts
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/agents/profile-loader.ts
12939
- var __filename2 = fileURLToPath(import.meta.url);
12940
- var __dirname3 = dirname(__filename2);
12941
- function getPackageRoot() {
12942
- const currentDir = __dirname3;
12943
- if (currentDir.includes("/dist")) {
12944
- return join(currentDir, "..");
12945
- } else {
12946
- return join(currentDir, "../..");
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(getPackageRoot2(), "examples/abilities");
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/conversation-context-store.ts
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 = join(this.storePath, `${context.id}.json`);
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 = join(this.storePath, `${id}.json`);
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 = join(this.storePath, `${id}.json`);
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/utils/timeout-validator.ts
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/utils/error-formatter.ts
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((resolve4, reject) => {
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
- resolve4();
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((resolve4, reject) => {
17947
+ return new Promise((resolve5, reject) => {
17898
17948
  const onConnected = () => {
17899
17949
  this.off("error", onError);
17900
- resolve4();
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((resolve4, reject) => {
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: resolve4,
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((resolve4, reject) => {
18582
+ return new Promise((resolve5, reject) => {
18533
18583
  const timeout = setTimeout(() => {
18534
- const index = pool.waitQueue.findIndex((w) => w.resolve === resolve4);
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: resolve4, reject, timeout });
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.clientInfo;
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", async (chunk) => {
20519
- buffer += chunk.toString("utf-8");
20520
- if (buffer.length > STDIO_MAX_BUFFER_SIZE) {
20521
- logger.error("[MCP Server] Buffer size exceeded maximum", {
20522
- bufferSize: buffer.length,
20523
- maxSize: STDIO_MAX_BUFFER_SIZE
20524
- });
20525
- buffer = "";
20526
- contentLength = null;
20527
- return;
20528
- }
20529
- let iterations = 0;
20530
- while (iterations < STDIO_MAX_ITERATIONS) {
20531
- iterations++;
20532
- if (contentLength === null) {
20533
- const delimiter2 = buffer.includes("\r\n\r\n") ? "\r\n\r\n" : buffer.includes("\n\n") ? "\n\n" : null;
20534
- if (!delimiter2) break;
20535
- const headerEndIndex = buffer.indexOf(delimiter2);
20536
- const headerBlock = buffer.slice(0, headerEndIndex);
20537
- for (const line of headerBlock.split(delimiter2 === "\r\n\r\n" ? "\r\n" : "\n")) {
20538
- const [key, value] = line.split(":", 2).map((s) => s.trim());
20539
- if (key && key.toLowerCase() === "content-length" && value) {
20540
- contentLength = parseInt(value, 10);
20541
- if (isNaN(contentLength) || contentLength <= 0 || contentLength > STDIO_MAX_MESSAGE_SIZE) {
20542
- logger.error("[MCP Server] Invalid Content-Length", { contentLength });
20543
- buffer = buffer.slice(headerEndIndex + delimiter2.length);
20544
- contentLength = null;
20545
- continue;
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
- if (contentLength === null) {
20550
- logger.error("[MCP Server] No Content-Length header found");
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
- buffer = buffer.slice(headerEndIndex + delimiter2.length);
20555
- }
20556
- if (Buffer.byteLength(buffer, "utf-8") < contentLength) break;
20557
- const messageBuffer = Buffer.from(buffer, "utf-8");
20558
- const jsonMessage = messageBuffer.slice(0, contentLength).toString("utf-8");
20559
- buffer = messageBuffer.slice(contentLength).toString("utf-8");
20560
- contentLength = null;
20561
- try {
20562
- const request = JSON.parse(jsonMessage);
20563
- logger.debug("[MCP Server] Request received", { method: request.method, id: request.id });
20564
- const response = await this.handleRequest(request);
20565
- if (request.id !== void 0 && request.id !== null) {
20566
- this.writeResponse(response);
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
- if (iterations >= STDIO_MAX_ITERATIONS) {
20574
- logger.warn("[MCP Server] Maximum iterations reached in message processing", {
20575
- iterations,
20576
- bufferSize: buffer.length
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}`);