nexus-agents 2.47.0 → 2.50.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/dist/{chunk-ZGKZIEUM.js → chunk-APQJV46Q.js} +867 -626
- package/dist/chunk-APQJV46Q.js.map +1 -0
- package/dist/{chunk-HCFJ7NMT.js → chunk-H3A7KK6X.js} +2 -2
- package/dist/{chunk-3YYS74BL.js → chunk-NAN7IILE.js} +3 -3
- package/dist/cli.js +3 -3
- package/dist/index.d.ts +391 -323
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/{setup-command-CRBMRREJ.js → setup-command-SALY236Y.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-ZGKZIEUM.js.map +0 -1
- /package/dist/{chunk-HCFJ7NMT.js.map → chunk-H3A7KK6X.js.map} +0 -0
- /package/dist/{chunk-3YYS74BL.js.map → chunk-NAN7IILE.js.map} +0 -0
- /package/dist/{setup-command-CRBMRREJ.js.map → setup-command-SALY236Y.js.map} +0 -0
|
@@ -66,7 +66,7 @@ import {
|
|
|
66
66
|
import {
|
|
67
67
|
DEFAULT_TASK_TTL_MS,
|
|
68
68
|
clampTaskTtl
|
|
69
|
-
} from "./chunk-
|
|
69
|
+
} from "./chunk-NAN7IILE.js";
|
|
70
70
|
import {
|
|
71
71
|
createSessionMemory
|
|
72
72
|
} from "./chunk-ULDKSIS7.js";
|
|
@@ -823,16 +823,16 @@ function classifyEnvKeys(nexusKeys, env) {
|
|
|
823
823
|
}
|
|
824
824
|
return { knownRecord, unknownVars };
|
|
825
825
|
}
|
|
826
|
-
function logValidationWarnings(
|
|
826
|
+
function logValidationWarnings(logger55, unknownVars, invalidVars) {
|
|
827
827
|
for (const u of unknownVars) {
|
|
828
828
|
const hint = u.suggestion !== null ? ` (did you mean ${u.suggestion}?)` : "";
|
|
829
|
-
|
|
829
|
+
logger55.warn(`Unknown environment variable: ${u.name}${hint}`);
|
|
830
830
|
}
|
|
831
831
|
for (const inv of invalidVars) {
|
|
832
|
-
|
|
832
|
+
logger55.warn(`Invalid environment variable ${inv.name}="${inv.value}": ${inv.error}`);
|
|
833
833
|
}
|
|
834
834
|
}
|
|
835
|
-
function validateNexusEnv(
|
|
835
|
+
function validateNexusEnv(logger55) {
|
|
836
836
|
const nexusKeys = Object.keys(process.env).filter((k) => k.startsWith("NEXUS_"));
|
|
837
837
|
const { knownRecord, unknownVars } = classifyEnvKeys(nexusKeys, process.env);
|
|
838
838
|
const invalidVars = [];
|
|
@@ -847,8 +847,8 @@ function validateNexusEnv(logger54) {
|
|
|
847
847
|
});
|
|
848
848
|
}
|
|
849
849
|
}
|
|
850
|
-
if (
|
|
851
|
-
logValidationWarnings(
|
|
850
|
+
if (logger55 !== void 0) {
|
|
851
|
+
logValidationWarnings(logger55, unknownVars, invalidVars);
|
|
852
852
|
}
|
|
853
853
|
return { unknownVars, invalidVars };
|
|
854
854
|
}
|
|
@@ -1724,8 +1724,8 @@ function deepMerge(target, source) {
|
|
|
1724
1724
|
}
|
|
1725
1725
|
return result;
|
|
1726
1726
|
}
|
|
1727
|
-
function loadDefaultConfig(
|
|
1728
|
-
|
|
1727
|
+
function loadDefaultConfig(logger55) {
|
|
1728
|
+
logger55.debug("No config file found, using defaults");
|
|
1729
1729
|
const validated = AppConfigSchema.safeParse(defaultConfig);
|
|
1730
1730
|
if (!validated.success) {
|
|
1731
1731
|
return err(
|
|
@@ -1741,7 +1741,7 @@ function loadDefaultConfig(logger54) {
|
|
|
1741
1741
|
warnings: ["No config file found, using default configuration"]
|
|
1742
1742
|
});
|
|
1743
1743
|
}
|
|
1744
|
-
function readAndParseConfig(configPath, mergeDefaults,
|
|
1744
|
+
function readAndParseConfig(configPath, mergeDefaults, logger55) {
|
|
1745
1745
|
let content;
|
|
1746
1746
|
try {
|
|
1747
1747
|
content = readFileSync(configPath, "utf-8");
|
|
@@ -1758,7 +1758,7 @@ function readAndParseConfig(configPath, mergeDefaults, logger54) {
|
|
|
1758
1758
|
const parseResult2 = parseYaml(content);
|
|
1759
1759
|
if (!parseResult2.ok) return err(parseResult2.error);
|
|
1760
1760
|
if (mergeDefaults && typeof parseResult2.value === "object" && parseResult2.value !== null) {
|
|
1761
|
-
|
|
1761
|
+
logger55.debug("Merged config with defaults");
|
|
1762
1762
|
return ok(
|
|
1763
1763
|
deepMerge(
|
|
1764
1764
|
defaultConfig,
|
|
@@ -1768,7 +1768,7 @@ function readAndParseConfig(configPath, mergeDefaults, logger54) {
|
|
|
1768
1768
|
}
|
|
1769
1769
|
return ok(parseResult2.value);
|
|
1770
1770
|
}
|
|
1771
|
-
function validateConfig(configData, configPath,
|
|
1771
|
+
function validateConfig(configData, configPath, logger55) {
|
|
1772
1772
|
const validation = AppConfigSchema.safeParse(configData);
|
|
1773
1773
|
if (!validation.success) {
|
|
1774
1774
|
const issues = formatZodIssuesAsArray(validation.error);
|
|
@@ -1777,12 +1777,12 @@ function validateConfig(configData, configPath, logger54) {
|
|
|
1777
1777
|
${issues.join("\n")}`, "VALIDATION_ERROR")
|
|
1778
1778
|
);
|
|
1779
1779
|
}
|
|
1780
|
-
|
|
1780
|
+
logger55.info("Configuration loaded successfully", { configPath });
|
|
1781
1781
|
return ok({ config: validation.data, configPath, usingDefaults: false, warnings: [] });
|
|
1782
1782
|
}
|
|
1783
1783
|
function loadConfig(options = {}) {
|
|
1784
1784
|
const { configPath: explicitPath, cwd = process.cwd(), mergeDefaults = true } = options;
|
|
1785
|
-
const
|
|
1785
|
+
const logger55 = options.logger ?? createLogger({ component: "ConfigLoader" });
|
|
1786
1786
|
let configPath;
|
|
1787
1787
|
if (explicitPath !== void 0) {
|
|
1788
1788
|
const validation = validatePath(explicitPath, cwd);
|
|
@@ -1791,10 +1791,10 @@ function loadConfig(options = {}) {
|
|
|
1791
1791
|
} else {
|
|
1792
1792
|
configPath = findConfigPath(cwd);
|
|
1793
1793
|
}
|
|
1794
|
-
if (configPath === void 0) return loadDefaultConfig(
|
|
1795
|
-
const parseResult2 = readAndParseConfig(configPath, mergeDefaults,
|
|
1794
|
+
if (configPath === void 0) return loadDefaultConfig(logger55);
|
|
1795
|
+
const parseResult2 = readAndParseConfig(configPath, mergeDefaults, logger55);
|
|
1796
1796
|
if (!parseResult2.ok) return err(parseResult2.error);
|
|
1797
|
-
return validateConfig(parseResult2.value, configPath,
|
|
1797
|
+
return validateConfig(parseResult2.value, configPath, logger55);
|
|
1798
1798
|
}
|
|
1799
1799
|
var loadedConfig;
|
|
1800
1800
|
function getConfig(options) {
|
|
@@ -2726,12 +2726,12 @@ function removeItemsDirectly(items, targetTokens, manager) {
|
|
|
2726
2726
|
};
|
|
2727
2727
|
}
|
|
2728
2728
|
async function summarizeAndRemoveItems(options) {
|
|
2729
|
-
const { items, targetTokens, manager, adapter, logger:
|
|
2729
|
+
const { items, targetTokens, manager, adapter, logger: logger55, customPrompt } = options;
|
|
2730
2730
|
const content = items.map((item) => item.content).join("\n\n---\n\n");
|
|
2731
2731
|
const prompt = customPrompt ?? SLIDING_WINDOW_PROMPT;
|
|
2732
2732
|
const summaryResult = await generateSummary(content, prompt, adapter);
|
|
2733
2733
|
if (!summaryResult.ok) {
|
|
2734
|
-
|
|
2734
|
+
logger55.warn("Summarization failed, removing items without summary");
|
|
2735
2735
|
return removeItemsDirectly(items, targetTokens, manager);
|
|
2736
2736
|
}
|
|
2737
2737
|
let tokensFreed = 0;
|
|
@@ -2744,7 +2744,7 @@ async function summarizeAndRemoveItems(options) {
|
|
|
2744
2744
|
if (summaryAddResult.item !== void 0) {
|
|
2745
2745
|
tokensFreed -= summaryAddResult.tokenCount;
|
|
2746
2746
|
}
|
|
2747
|
-
|
|
2747
|
+
logger55.info("Summarization pruning completed", {
|
|
2748
2748
|
summarizedItems: items.length,
|
|
2749
2749
|
tokensFreed,
|
|
2750
2750
|
targetReached: tokensFreed >= targetTokens
|
|
@@ -2802,7 +2802,7 @@ function scoreByPriorityWeightedAge(candidates) {
|
|
|
2802
2802
|
return scores.map((s) => s.item);
|
|
2803
2803
|
}
|
|
2804
2804
|
function removeItemsToTarget(options) {
|
|
2805
|
-
const { sortedItems, targetTokens, categories, manager, minItemsPerCategory, logger:
|
|
2805
|
+
const { sortedItems, targetTokens, categories, manager, minItemsPerCategory, logger: logger55 } = options;
|
|
2806
2806
|
const categoryRemaining = /* @__PURE__ */ new Map();
|
|
2807
2807
|
for (const category of categories) {
|
|
2808
2808
|
categoryRemaining.set(category, manager.getByCategory(category).length);
|
|
@@ -2819,7 +2819,7 @@ function removeItemsToTarget(options) {
|
|
|
2819
2819
|
categoryRemaining.set(item.category, remaining - 1);
|
|
2820
2820
|
}
|
|
2821
2821
|
const targetReached = tokensFreed >= targetTokens;
|
|
2822
|
-
|
|
2822
|
+
logger55.info("Pruning completed", {
|
|
2823
2823
|
itemsRemoved: removedItems.length,
|
|
2824
2824
|
tokensFreed,
|
|
2825
2825
|
targetTokens,
|
|
@@ -3284,7 +3284,7 @@ function generateBudgetWarning(utilizationPercent, tokensUsed, budgetLimit, scop
|
|
|
3284
3284
|
scope
|
|
3285
3285
|
};
|
|
3286
3286
|
}
|
|
3287
|
-
function logBudgetWarning(warning,
|
|
3287
|
+
function logBudgetWarning(warning, logger55) {
|
|
3288
3288
|
const context = {
|
|
3289
3289
|
scope: warning.scope,
|
|
3290
3290
|
usagePercent: Math.round(warning.usagePercent),
|
|
@@ -3293,13 +3293,13 @@ function logBudgetWarning(warning, logger54) {
|
|
|
3293
3293
|
};
|
|
3294
3294
|
switch (warning.level) {
|
|
3295
3295
|
case "critical":
|
|
3296
|
-
|
|
3296
|
+
logger55.warn(warning.message, context);
|
|
3297
3297
|
break;
|
|
3298
3298
|
case "warning":
|
|
3299
|
-
|
|
3299
|
+
logger55.warn(warning.message, context);
|
|
3300
3300
|
break;
|
|
3301
3301
|
case "info":
|
|
3302
|
-
|
|
3302
|
+
logger55.info(warning.message, context);
|
|
3303
3303
|
break;
|
|
3304
3304
|
}
|
|
3305
3305
|
}
|
|
@@ -3355,8 +3355,8 @@ function createHardModeResult(params) {
|
|
|
3355
3355
|
)
|
|
3356
3356
|
};
|
|
3357
3357
|
}
|
|
3358
|
-
function logWarnModeExceeded(params,
|
|
3359
|
-
|
|
3358
|
+
function logWarnModeExceeded(params, logger55) {
|
|
3359
|
+
logger55.warn("Token budget would be exceeded (warn mode - continuing)", {
|
|
3360
3360
|
exceedsSession: params.exceedsSession,
|
|
3361
3361
|
exceedsTask: params.exceedsTask,
|
|
3362
3362
|
estimatedTokens: params.estimatedTokens,
|
|
@@ -3385,9 +3385,9 @@ var TokenBudgetTracker = class {
|
|
|
3385
3385
|
* @param config - Token budget configuration
|
|
3386
3386
|
* @param logger - Optional logger instance
|
|
3387
3387
|
*/
|
|
3388
|
-
constructor(config = {},
|
|
3388
|
+
constructor(config = {}, logger55) {
|
|
3389
3389
|
this.config = { ...DEFAULT_TOKEN_BUDGET_CONFIG, ...config };
|
|
3390
|
-
this.logger =
|
|
3390
|
+
this.logger = logger55 ?? createLogger({ component: "token-budget-tracker" });
|
|
3391
3391
|
}
|
|
3392
3392
|
/**
|
|
3393
3393
|
* Check if an operation is within budget.
|
|
@@ -3540,7 +3540,7 @@ var TokenBudgetTracker = class {
|
|
|
3540
3540
|
|
|
3541
3541
|
// src/agents/base-agent-state-helpers.ts
|
|
3542
3542
|
function performLegacyStateTransition(params) {
|
|
3543
|
-
const { stateMachine, logger:
|
|
3543
|
+
const { stateMachine, logger: logger55, newState } = params;
|
|
3544
3544
|
const currentState = stateMachine.state;
|
|
3545
3545
|
if (newState === "error") {
|
|
3546
3546
|
stateMachine.forceError({ reason: "setState called with error" });
|
|
@@ -3550,7 +3550,7 @@ function performLegacyStateTransition(params) {
|
|
|
3550
3550
|
if (event !== void 0 && stateMachine.canTransition(event)) {
|
|
3551
3551
|
const result = stateMachine.transition(event);
|
|
3552
3552
|
if (!result.ok) {
|
|
3553
|
-
|
|
3553
|
+
logger55.warn("State transition failed", {
|
|
3554
3554
|
from: currentState,
|
|
3555
3555
|
to: newState,
|
|
3556
3556
|
event,
|
|
@@ -3558,7 +3558,7 @@ function performLegacyStateTransition(params) {
|
|
|
3558
3558
|
});
|
|
3559
3559
|
}
|
|
3560
3560
|
} else if (currentState !== newState) {
|
|
3561
|
-
|
|
3561
|
+
logger55.debug("Unmapped state change (legacy)", { from: currentState, to: newState });
|
|
3562
3562
|
}
|
|
3563
3563
|
}
|
|
3564
3564
|
|
|
@@ -3714,7 +3714,7 @@ function getAgentStateKey(agentId) {
|
|
|
3714
3714
|
}
|
|
3715
3715
|
|
|
3716
3716
|
// src/agents/memory-operations.ts
|
|
3717
|
-
async function persistMemoryState(backend, state,
|
|
3717
|
+
async function persistMemoryState(backend, state, logger55) {
|
|
3718
3718
|
const key = getAgentStateKey(state.agentId);
|
|
3719
3719
|
const metadata = {
|
|
3720
3720
|
importance: MemoryImportance.HIGH,
|
|
@@ -3726,12 +3726,12 @@ async function persistMemoryState(backend, state, logger54) {
|
|
|
3726
3726
|
};
|
|
3727
3727
|
const result = await backend.store(key, updatedState, metadata);
|
|
3728
3728
|
if (!result.ok) {
|
|
3729
|
-
|
|
3729
|
+
logger55.error("Failed to persist agent memory state", result.error, { agentId: state.agentId });
|
|
3730
3730
|
return err(
|
|
3731
3731
|
new AgentMemoryError("Failed to persist memory state", { error: result.error.message })
|
|
3732
3732
|
);
|
|
3733
3733
|
}
|
|
3734
|
-
|
|
3734
|
+
logger55.debug("Persisted agent memory state", {
|
|
3735
3735
|
agentId: state.agentId,
|
|
3736
3736
|
learningsCount: state.taskLearnings.length,
|
|
3737
3737
|
patternsCount: state.executionPatterns.length,
|
|
@@ -3739,16 +3739,16 @@ async function persistMemoryState(backend, state, logger54) {
|
|
|
3739
3739
|
});
|
|
3740
3740
|
return ok(void 0);
|
|
3741
3741
|
}
|
|
3742
|
-
async function loadMemoryState(backend, agentId, role,
|
|
3742
|
+
async function loadMemoryState(backend, agentId, role, logger55) {
|
|
3743
3743
|
const key = getAgentStateKey(agentId);
|
|
3744
3744
|
const result = await backend.retrieve(key);
|
|
3745
3745
|
if (!result.ok) {
|
|
3746
|
-
|
|
3746
|
+
logger55.debug("No existing memory state found, creating fresh state", { agentId });
|
|
3747
3747
|
return ok(createInitialMemoryState(agentId, role));
|
|
3748
3748
|
}
|
|
3749
3749
|
const loaded = result.value;
|
|
3750
3750
|
if (loaded === null || typeof loaded !== "object") {
|
|
3751
|
-
|
|
3751
|
+
logger55.warn("Invalid memory state format, creating fresh state", { agentId });
|
|
3752
3752
|
return ok(createInitialMemoryState(agentId, role));
|
|
3753
3753
|
}
|
|
3754
3754
|
const state = {
|
|
@@ -3759,7 +3759,7 @@ async function loadMemoryState(backend, agentId, role, logger54) {
|
|
|
3759
3759
|
executionPatterns: Array.isArray(loaded.executionPatterns) ? loaded.executionPatterns : [],
|
|
3760
3760
|
errorResolutions: Array.isArray(loaded.errorResolutions) ? loaded.errorResolutions : []
|
|
3761
3761
|
};
|
|
3762
|
-
|
|
3762
|
+
logger55.debug("Loaded agent memory state", {
|
|
3763
3763
|
agentId,
|
|
3764
3764
|
learningsCount: state.taskLearnings.length,
|
|
3765
3765
|
patternsCount: state.executionPatterns.length,
|
|
@@ -3767,13 +3767,13 @@ async function loadMemoryState(backend, agentId, role, logger54) {
|
|
|
3767
3767
|
});
|
|
3768
3768
|
return ok(state);
|
|
3769
3769
|
}
|
|
3770
|
-
async function loadRelevantTypedMemories(typedMemory, role, limit,
|
|
3770
|
+
async function loadRelevantTypedMemories(typedMemory, role, limit, logger55) {
|
|
3771
3771
|
const result = await typedMemory.filterByRelevance(role, limit);
|
|
3772
3772
|
if (!result.ok) {
|
|
3773
|
-
|
|
3773
|
+
logger55.warn("Failed to load relevant typed memories", { role, error: result.error.message });
|
|
3774
3774
|
return result;
|
|
3775
3775
|
}
|
|
3776
|
-
|
|
3776
|
+
logger55.debug("Loaded relevant typed memories", {
|
|
3777
3777
|
role,
|
|
3778
3778
|
count: result.value.length,
|
|
3779
3779
|
types: [...new Set(result.value.map((e) => e.type))]
|
|
@@ -3887,10 +3887,10 @@ function initializeMemoryInfrastructure(options) {
|
|
|
3887
3887
|
|
|
3888
3888
|
// src/agents/base-agent-constructor-helpers.ts
|
|
3889
3889
|
function setupStateMachine(params) {
|
|
3890
|
-
const { agentId, logger:
|
|
3890
|
+
const { agentId, logger: logger55, eventBus, options } = params;
|
|
3891
3891
|
const stateMachine = new AgentStateMachine(options);
|
|
3892
3892
|
stateMachine.onStateChange((transition) => {
|
|
3893
|
-
|
|
3893
|
+
logger55.debug("State transition", {
|
|
3894
3894
|
from: transition.from,
|
|
3895
3895
|
to: transition.to,
|
|
3896
3896
|
event: transition.event
|
|
@@ -3904,9 +3904,9 @@ function setupStateMachine(params) {
|
|
|
3904
3904
|
return stateMachine;
|
|
3905
3905
|
}
|
|
3906
3906
|
function initializeInfrastructure(params) {
|
|
3907
|
-
const { agentId, role, logger:
|
|
3907
|
+
const { agentId, role, logger: logger55, adapter, pruningConfig, memoryConfig } = params;
|
|
3908
3908
|
const pruningOpts = {
|
|
3909
|
-
logger:
|
|
3909
|
+
logger: logger55,
|
|
3910
3910
|
...pruningConfig !== void 0 ? { config: pruningConfig } : {},
|
|
3911
3911
|
...adapter !== void 0 ? { adapter } : {}
|
|
3912
3912
|
};
|
|
@@ -3914,7 +3914,7 @@ function initializeInfrastructure(params) {
|
|
|
3914
3914
|
const memoryOpts = {
|
|
3915
3915
|
agentId,
|
|
3916
3916
|
role,
|
|
3917
|
-
logger:
|
|
3917
|
+
logger: logger55,
|
|
3918
3918
|
...memoryConfig !== void 0 ? { config: memoryConfig } : {}
|
|
3919
3919
|
};
|
|
3920
3920
|
const memory = initializeMemoryInfrastructure(memoryOpts);
|
|
@@ -4146,14 +4146,14 @@ function transformTaskError(error, agentId, taskId) {
|
|
|
4146
4146
|
return new AgentError(`Task execution failed: ${message}`, opts);
|
|
4147
4147
|
}
|
|
4148
4148
|
function finalizeTaskSuccess(params) {
|
|
4149
|
-
const { task, result, startTime, stateMachine, budgetTracker, logger:
|
|
4149
|
+
const { task, result, startTime, stateMachine, budgetTracker, logger: logger55 } = params;
|
|
4150
4150
|
const durationMs = getTimeProvider().now() - startTime;
|
|
4151
4151
|
if (stateMachine.state === "thinking") {
|
|
4152
4152
|
stateMachine.transition("plan_completed", { taskId: task.id });
|
|
4153
4153
|
}
|
|
4154
4154
|
stateMachine.transition("task_completed", { taskId: task.id, durationMs });
|
|
4155
4155
|
const budgetStats = budgetTracker.endTask();
|
|
4156
|
-
|
|
4156
|
+
logger55.info("Task completed", {
|
|
4157
4157
|
taskId: task.id,
|
|
4158
4158
|
durationMs,
|
|
4159
4159
|
tokensUsed: result.metadata.tokensUsed,
|
|
@@ -4181,7 +4181,7 @@ function recordFailedTaskError(params) {
|
|
|
4181
4181
|
});
|
|
4182
4182
|
}
|
|
4183
4183
|
async function persistMemoryAfterTask(params) {
|
|
4184
|
-
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, task, startTime, logger:
|
|
4184
|
+
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, task, startTime, logger: logger55 } = params;
|
|
4185
4185
|
if (!memoryEnabled || memoryState === null) {
|
|
4186
4186
|
return memoryState;
|
|
4187
4187
|
}
|
|
@@ -4196,9 +4196,9 @@ async function persistMemoryAfterTask(params) {
|
|
|
4196
4196
|
successRate
|
|
4197
4197
|
});
|
|
4198
4198
|
if (memoryBackend !== void 0) {
|
|
4199
|
-
await persistMemoryState(memoryBackend, updatedState,
|
|
4199
|
+
await persistMemoryState(memoryBackend, updatedState, logger55);
|
|
4200
4200
|
}
|
|
4201
|
-
|
|
4201
|
+
logger55.debug("Memory persisted after task completion", {
|
|
4202
4202
|
taskId: task.id,
|
|
4203
4203
|
durationMs
|
|
4204
4204
|
});
|
|
@@ -4209,15 +4209,15 @@ function categorizeTaskType(description) {
|
|
|
4209
4209
|
return categorizeTaskByKeywords(desc);
|
|
4210
4210
|
}
|
|
4211
4211
|
async function persistMemoryOnCleanup(params) {
|
|
4212
|
-
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, logger:
|
|
4212
|
+
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, logger: logger55 } = params;
|
|
4213
4213
|
if (!memoryEnabled || memoryBackend === void 0 || memoryState === null) {
|
|
4214
4214
|
return;
|
|
4215
4215
|
}
|
|
4216
4216
|
if (persistenceMode === "none") {
|
|
4217
4217
|
return;
|
|
4218
4218
|
}
|
|
4219
|
-
await persistMemoryState(memoryBackend, memoryState,
|
|
4220
|
-
|
|
4219
|
+
await persistMemoryState(memoryBackend, memoryState, logger55);
|
|
4220
|
+
logger55.debug("Memory state persisted during cleanup");
|
|
4221
4221
|
}
|
|
4222
4222
|
|
|
4223
4223
|
// src/agents/base-agent-execute-flow.ts
|
|
@@ -4343,14 +4343,14 @@ function createInitialPruningMetrics() {
|
|
|
4343
4343
|
|
|
4344
4344
|
// src/agents/base-agent-memory-ops.ts
|
|
4345
4345
|
async function flushMemoryState(params) {
|
|
4346
|
-
const { memoryEnabled, memoryBackend, memoryState, logger:
|
|
4346
|
+
const { memoryEnabled, memoryBackend, memoryState, logger: logger55 } = params;
|
|
4347
4347
|
if (!memoryEnabled) {
|
|
4348
4348
|
return ok(void 0);
|
|
4349
4349
|
}
|
|
4350
4350
|
if (memoryBackend === void 0 || memoryState === null) {
|
|
4351
4351
|
return ok(void 0);
|
|
4352
4352
|
}
|
|
4353
|
-
return persistMemoryState(memoryBackend, memoryState,
|
|
4353
|
+
return persistMemoryState(memoryBackend, memoryState, logger55);
|
|
4354
4354
|
}
|
|
4355
4355
|
function recordLearningToState(params) {
|
|
4356
4356
|
const { memoryEnabled, memoryState, learning } = params;
|
|
@@ -5605,13 +5605,13 @@ function shouldFinalize(pattern, participants, results, votes, reviews) {
|
|
|
5605
5605
|
|
|
5606
5606
|
// src/agents/collaboration/collaboration-session-helpers.ts
|
|
5607
5607
|
var MAX_EVENT_LISTENERS = 50;
|
|
5608
|
-
function emitEventToListeners(listeners, event,
|
|
5608
|
+
function emitEventToListeners(listeners, event, logger55) {
|
|
5609
5609
|
for (const listener of listeners) {
|
|
5610
5610
|
try {
|
|
5611
5611
|
listener(event);
|
|
5612
5612
|
} catch (e) {
|
|
5613
5613
|
const errorObj = e instanceof Error ? e : new Error(String(e));
|
|
5614
|
-
|
|
5614
|
+
logger55.error("Event listener error", errorObj, { eventType: event.type });
|
|
5615
5615
|
}
|
|
5616
5616
|
}
|
|
5617
5617
|
}
|
|
@@ -9284,9 +9284,9 @@ var DEFAULT_WAVE_CONFIG = {
|
|
|
9284
9284
|
var WaveScheduler = class {
|
|
9285
9285
|
config;
|
|
9286
9286
|
logger;
|
|
9287
|
-
constructor(config = {},
|
|
9287
|
+
constructor(config = {}, logger55) {
|
|
9288
9288
|
this.config = { ...DEFAULT_WAVE_CONFIG, ...config };
|
|
9289
|
-
this.logger =
|
|
9289
|
+
this.logger = logger55 ?? createLogger({ component: "wave-scheduler" });
|
|
9290
9290
|
}
|
|
9291
9291
|
/**
|
|
9292
9292
|
* Execute tasks in waves respecting dependencies and concurrency limits.
|
|
@@ -9520,8 +9520,8 @@ function chunkByDirectory(files, basePath) {
|
|
|
9520
9520
|
items
|
|
9521
9521
|
}));
|
|
9522
9522
|
}
|
|
9523
|
-
function createWaveScheduler(config = {},
|
|
9524
|
-
return new WaveScheduler(config,
|
|
9523
|
+
function createWaveScheduler(config = {}, logger55) {
|
|
9524
|
+
return new WaveScheduler(config, logger55);
|
|
9525
9525
|
}
|
|
9526
9526
|
|
|
9527
9527
|
// src/agents/experts/expert-types.ts
|
|
@@ -14863,9 +14863,9 @@ var SkillLibrary = class {
|
|
|
14863
14863
|
config;
|
|
14864
14864
|
logger;
|
|
14865
14865
|
store;
|
|
14866
|
-
constructor(config = {},
|
|
14866
|
+
constructor(config = {}, logger55) {
|
|
14867
14867
|
this.config = { ...DEFAULT_SKILL_LIBRARY_CONFIG2, ...config };
|
|
14868
|
-
this.logger =
|
|
14868
|
+
this.logger = logger55 ?? createLogger({ component: "SkillLibrary" });
|
|
14869
14869
|
this.store = {
|
|
14870
14870
|
skills: /* @__PURE__ */ new Map(),
|
|
14871
14871
|
executions: /* @__PURE__ */ new Map(),
|
|
@@ -15140,8 +15140,8 @@ var SkillLibrary = class {
|
|
|
15140
15140
|
return scored.sort((a, b) => b.score - a.score).map((s) => s.skill);
|
|
15141
15141
|
}
|
|
15142
15142
|
};
|
|
15143
|
-
function createSkillLibrary(config,
|
|
15144
|
-
return new SkillLibrary(config,
|
|
15143
|
+
function createSkillLibrary(config, logger55) {
|
|
15144
|
+
return new SkillLibrary(config, logger55);
|
|
15145
15145
|
}
|
|
15146
15146
|
|
|
15147
15147
|
// src/agents/skills/skill-composer.ts
|
|
@@ -15156,10 +15156,10 @@ var SkillComposer = class {
|
|
|
15156
15156
|
config;
|
|
15157
15157
|
logger;
|
|
15158
15158
|
library;
|
|
15159
|
-
constructor(library, config = {},
|
|
15159
|
+
constructor(library, config = {}, logger55) {
|
|
15160
15160
|
this.library = library;
|
|
15161
15161
|
this.config = { ...DEFAULT_COMPOSER_CONFIG, ...config };
|
|
15162
|
-
this.logger =
|
|
15162
|
+
this.logger = logger55 ?? createLogger({ component: "SkillComposer" });
|
|
15163
15163
|
}
|
|
15164
15164
|
/**
|
|
15165
15165
|
* Creates a composition plan for a task.
|
|
@@ -15389,8 +15389,8 @@ var SkillComposer = class {
|
|
|
15389
15389
|
return errors;
|
|
15390
15390
|
}
|
|
15391
15391
|
};
|
|
15392
|
-
function createSkillComposer(library, config,
|
|
15393
|
-
return new SkillComposer(library, config,
|
|
15392
|
+
function createSkillComposer(library, config, logger55) {
|
|
15393
|
+
return new SkillComposer(library, config, logger55);
|
|
15394
15394
|
}
|
|
15395
15395
|
|
|
15396
15396
|
// src/agents/skills/skill-dependency-graph-helpers.ts
|
|
@@ -16085,10 +16085,10 @@ var SkillLoader = class {
|
|
|
16085
16085
|
library;
|
|
16086
16086
|
logger;
|
|
16087
16087
|
mappingIndex;
|
|
16088
|
-
constructor(library, config,
|
|
16088
|
+
constructor(library, config, logger55) {
|
|
16089
16089
|
this.library = library;
|
|
16090
16090
|
this.config = { ...DEFAULT_SKILL_LOADER_CONFIG, ...config };
|
|
16091
|
-
this.logger =
|
|
16091
|
+
this.logger = logger55 ?? createLogger({ component: "SkillLoader" });
|
|
16092
16092
|
this.mappingIndex = /* @__PURE__ */ new Map();
|
|
16093
16093
|
for (const mapping of this.config.mappings) {
|
|
16094
16094
|
this.mappingIndex.set(mapping.role, mapping);
|
|
@@ -16311,8 +16311,8 @@ var SkillLoader = class {
|
|
|
16311
16311
|
return ok(orderResult.value);
|
|
16312
16312
|
}
|
|
16313
16313
|
};
|
|
16314
|
-
function createSkillLoader(library, config,
|
|
16315
|
-
return new SkillLoader(library, config,
|
|
16314
|
+
function createSkillLoader(library, config, logger55) {
|
|
16315
|
+
return new SkillLoader(library, config, logger55);
|
|
16316
16316
|
}
|
|
16317
16317
|
|
|
16318
16318
|
// src/agents/skills/external-pack-loader.ts
|
|
@@ -16374,13 +16374,13 @@ function validateManifest(raw, packName, source) {
|
|
|
16374
16374
|
}
|
|
16375
16375
|
return ok(parseResult2.data);
|
|
16376
16376
|
}
|
|
16377
|
-
async function loadExternalPack(packSource,
|
|
16377
|
+
async function loadExternalPack(packSource, logger55) {
|
|
16378
16378
|
const { name, source, enabled } = packSource;
|
|
16379
16379
|
if (!enabled) {
|
|
16380
|
-
|
|
16380
|
+
logger55.debug("Skipping disabled external pack", { name, source });
|
|
16381
16381
|
return ok({ packName: name, skillCount: 0, skills: [] });
|
|
16382
16382
|
}
|
|
16383
|
-
|
|
16383
|
+
logger55.info("Loading external skill pack", { name, source });
|
|
16384
16384
|
try {
|
|
16385
16385
|
const importPath = await resolveImportPath(source);
|
|
16386
16386
|
const module = await import(importPath);
|
|
@@ -16390,7 +16390,7 @@ async function loadExternalPack(packSource, logger54) {
|
|
|
16390
16390
|
return validationResult;
|
|
16391
16391
|
}
|
|
16392
16392
|
const manifest = validationResult.value;
|
|
16393
|
-
|
|
16393
|
+
logger55.info("External pack loaded successfully", {
|
|
16394
16394
|
name: manifest.name,
|
|
16395
16395
|
version: manifest.version,
|
|
16396
16396
|
skillCount: manifest.skills.length
|
|
@@ -16411,22 +16411,22 @@ async function loadExternalPack(packSource, logger54) {
|
|
|
16411
16411
|
);
|
|
16412
16412
|
}
|
|
16413
16413
|
}
|
|
16414
|
-
async function loadAllExternalPacks(packs,
|
|
16414
|
+
async function loadAllExternalPacks(packs, logger55) {
|
|
16415
16415
|
const loaded = [];
|
|
16416
16416
|
const errors = [];
|
|
16417
16417
|
for (const pack of packs) {
|
|
16418
|
-
const result = await loadExternalPack(pack,
|
|
16418
|
+
const result = await loadExternalPack(pack, logger55);
|
|
16419
16419
|
if (result.ok) {
|
|
16420
16420
|
loaded.push(result.value);
|
|
16421
16421
|
} else {
|
|
16422
16422
|
errors.push(result.error);
|
|
16423
|
-
|
|
16423
|
+
logger55.warn("Failed to load external pack", {
|
|
16424
16424
|
name: pack.name,
|
|
16425
16425
|
error: result.error.message
|
|
16426
16426
|
});
|
|
16427
16427
|
}
|
|
16428
16428
|
}
|
|
16429
|
-
|
|
16429
|
+
logger55.info("External pack loading complete", {
|
|
16430
16430
|
loaded: loaded.length,
|
|
16431
16431
|
errors: errors.length,
|
|
16432
16432
|
totalSkills: loaded.reduce((sum, r) => sum + r.skillCount, 0)
|
|
@@ -16888,9 +16888,9 @@ var SicaVersionManager = class {
|
|
|
16888
16888
|
versions;
|
|
16889
16889
|
events;
|
|
16890
16890
|
activeVersionId;
|
|
16891
|
-
constructor(config = {},
|
|
16891
|
+
constructor(config = {}, logger55) {
|
|
16892
16892
|
this.config = { ...DEFAULT_SICA_CONFIG2, ...config };
|
|
16893
|
-
this.logger =
|
|
16893
|
+
this.logger = logger55 ?? createLogger({ component: "SicaVersionManager" });
|
|
16894
16894
|
this.versions = /* @__PURE__ */ new Map();
|
|
16895
16895
|
this.events = [];
|
|
16896
16896
|
this.activeVersionId = null;
|
|
@@ -21310,9 +21310,9 @@ var TemplateRegistry = class {
|
|
|
21310
21310
|
await this.ensureInitialized();
|
|
21311
21311
|
const { templates, errors } = await loadTemplatesFromDirectory(directoryPath);
|
|
21312
21312
|
if (errors.length > 0) {
|
|
21313
|
-
const
|
|
21313
|
+
const logger55 = createLogger({ component: "TemplateRegistry" });
|
|
21314
21314
|
for (const error of errors) {
|
|
21315
|
-
|
|
21315
|
+
logger55.warn("Template loading warning", { error: error.message });
|
|
21316
21316
|
}
|
|
21317
21317
|
}
|
|
21318
21318
|
let loadedCount = 0;
|
|
@@ -21324,8 +21324,8 @@ var TemplateRegistry = class {
|
|
|
21324
21324
|
loadedCount++;
|
|
21325
21325
|
}
|
|
21326
21326
|
} catch (regError) {
|
|
21327
|
-
const
|
|
21328
|
-
|
|
21327
|
+
const logger55 = createLogger({ component: "TemplateRegistry" });
|
|
21328
|
+
logger55.warn("Template registration failed", {
|
|
21329
21329
|
template: definition.name,
|
|
21330
21330
|
error: regError instanceof Error ? regError.message : String(regError)
|
|
21331
21331
|
});
|
|
@@ -22174,11 +22174,11 @@ var BudgetCircuitError = class extends NexusError {
|
|
|
22174
22174
|
|
|
22175
22175
|
// src/workflows/budget-circuit-breaker.ts
|
|
22176
22176
|
var BudgetCircuitBreaker = class {
|
|
22177
|
-
constructor(maxTokens, config,
|
|
22177
|
+
constructor(maxTokens, config, logger55) {
|
|
22178
22178
|
this.maxTokens = maxTokens;
|
|
22179
22179
|
this.config = { ...DEFAULT_BUDGET_CIRCUIT_CONFIG, ...config };
|
|
22180
22180
|
this.lastStateChange = getTimeProvider().now();
|
|
22181
|
-
this.logger =
|
|
22181
|
+
this.logger = logger55 ?? createLogger({ component: "budget-circuit-breaker" });
|
|
22182
22182
|
}
|
|
22183
22183
|
state = "closed";
|
|
22184
22184
|
lastStateChange;
|
|
@@ -22488,10 +22488,10 @@ function createSkippedResult() {
|
|
|
22488
22488
|
circuitState: "closed"
|
|
22489
22489
|
};
|
|
22490
22490
|
}
|
|
22491
|
-
function logEnforcementResult(
|
|
22491
|
+
function logEnforcementResult(logger55, stepId, result, currentUsagePercent) {
|
|
22492
22492
|
const usagePercent = Math.round(currentUsagePercent * 100);
|
|
22493
22493
|
if (!result.allowed) {
|
|
22494
|
-
|
|
22494
|
+
logger55.warn("Budget enforcement blocked step", {
|
|
22495
22495
|
stepId,
|
|
22496
22496
|
reason: result.reason,
|
|
22497
22497
|
circuitState: result.circuitState,
|
|
@@ -22501,14 +22501,14 @@ function logEnforcementResult(logger54, stepId, result, currentUsagePercent) {
|
|
|
22501
22501
|
return;
|
|
22502
22502
|
}
|
|
22503
22503
|
if (result.warning !== void 0) {
|
|
22504
|
-
|
|
22504
|
+
logger55.warn("Budget enforcement warning", {
|
|
22505
22505
|
stepId,
|
|
22506
22506
|
warning: result.warning,
|
|
22507
22507
|
currentUsage: usagePercent
|
|
22508
22508
|
});
|
|
22509
22509
|
return;
|
|
22510
22510
|
}
|
|
22511
|
-
|
|
22511
|
+
logger55.debug("Budget enforcement passed for step", {
|
|
22512
22512
|
stepId,
|
|
22513
22513
|
currentUsage: usagePercent,
|
|
22514
22514
|
allocatedTokens: result.allocatedTokens
|
|
@@ -22544,15 +22544,15 @@ function buildFinalOutput(stepResults) {
|
|
|
22544
22544
|
}
|
|
22545
22545
|
|
|
22546
22546
|
// src/workflows/workflow-engine-execution.ts
|
|
22547
|
-
function createContextManagerForWorkflow(config, workflow,
|
|
22547
|
+
function createContextManagerForWorkflow(config, workflow, logger55) {
|
|
22548
22548
|
if (config.contextManagerConfig === void 0) return void 0;
|
|
22549
22549
|
const budget = workflow.defaultBudget ?? config.defaultBudget;
|
|
22550
|
-
return new ContextManager({ ...config.contextManagerConfig, budget, logger:
|
|
22550
|
+
return new ContextManager({ ...config.contextManagerConfig, budget, logger: logger55 });
|
|
22551
22551
|
}
|
|
22552
|
-
function createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config,
|
|
22552
|
+
function createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config, logger55) {
|
|
22553
22553
|
const budgetConfig = {
|
|
22554
22554
|
engineDefaultBudget: config.defaultBudget,
|
|
22555
|
-
logger:
|
|
22555
|
+
logger: logger55
|
|
22556
22556
|
};
|
|
22557
22557
|
if (workflow.defaultBudget !== void 0) {
|
|
22558
22558
|
budgetConfig.workflowDefaultBudget = workflow.defaultBudget;
|
|
@@ -22587,12 +22587,12 @@ function applyInputDefaults(workflow, inputs) {
|
|
|
22587
22587
|
return merged;
|
|
22588
22588
|
}
|
|
22589
22589
|
function initializeExecution(params) {
|
|
22590
|
-
const { workflow, inputs, config, logger:
|
|
22590
|
+
const { workflow, inputs, config, logger: logger55 } = params;
|
|
22591
22591
|
const executionId = generateUUID();
|
|
22592
22592
|
const startTime = getTimeProvider().now();
|
|
22593
22593
|
const resolvedInputs = applyInputDefaults(workflow, inputs);
|
|
22594
|
-
const contextManager = createContextManagerForWorkflow(config, workflow,
|
|
22595
|
-
const budgetCircuitBreaker = config.enableBudgetEnforcement ? createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config,
|
|
22594
|
+
const contextManager = createContextManagerForWorkflow(config, workflow, logger55);
|
|
22595
|
+
const budgetCircuitBreaker = config.enableBudgetEnforcement ? createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config, logger55) : void 0;
|
|
22596
22596
|
const context = {
|
|
22597
22597
|
workflowId: workflow.name,
|
|
22598
22598
|
executionId,
|
|
@@ -22612,7 +22612,7 @@ function initializeExecution(params) {
|
|
|
22612
22612
|
startTime
|
|
22613
22613
|
};
|
|
22614
22614
|
if (contextManager !== void 0) {
|
|
22615
|
-
|
|
22615
|
+
logger55.debug("Context manager initialized for workflow execution", {
|
|
22616
22616
|
executionId,
|
|
22617
22617
|
workflowName: workflow.name,
|
|
22618
22618
|
budget: workflow.defaultBudget ?? config.defaultBudget
|
|
@@ -22621,10 +22621,10 @@ function initializeExecution(params) {
|
|
|
22621
22621
|
return { executionId, context, startTime, execution };
|
|
22622
22622
|
}
|
|
22623
22623
|
function enforceStepBudgets(options) {
|
|
22624
|
-
const { steps, context, workflow, totalSteps, config, logger:
|
|
22624
|
+
const { steps, context, workflow, totalSteps, config, logger: logger55 } = options;
|
|
22625
22625
|
const budgetConfig = {
|
|
22626
22626
|
engineDefaultBudget: config.defaultBudget,
|
|
22627
|
-
logger:
|
|
22627
|
+
logger: logger55
|
|
22628
22628
|
};
|
|
22629
22629
|
if (workflow.defaultBudget !== void 0) {
|
|
22630
22630
|
budgetConfig.workflowDefaultBudget = workflow.defaultBudget;
|
|
@@ -22909,29 +22909,29 @@ function createExpertFactoryWithAdapter(adapter) {
|
|
|
22909
22909
|
};
|
|
22910
22910
|
return new ExpertFactoryAdapter(factoryWrapper);
|
|
22911
22911
|
}
|
|
22912
|
-
function adaptLoggerForStepExecutor(
|
|
22912
|
+
function adaptLoggerForStepExecutor(logger55) {
|
|
22913
22913
|
return {
|
|
22914
22914
|
debug: (message, data) => {
|
|
22915
|
-
|
|
22915
|
+
logger55.debug(message, data);
|
|
22916
22916
|
},
|
|
22917
22917
|
info: (message, data) => {
|
|
22918
|
-
|
|
22918
|
+
logger55.info(message, data);
|
|
22919
22919
|
},
|
|
22920
22920
|
warn: (message, data) => {
|
|
22921
|
-
|
|
22921
|
+
logger55.warn(message, data);
|
|
22922
22922
|
},
|
|
22923
22923
|
error: (message, data) => {
|
|
22924
22924
|
if (data !== void 0) {
|
|
22925
22925
|
const errorContext = { ...data };
|
|
22926
|
-
|
|
22926
|
+
logger55.error(message, void 0, errorContext);
|
|
22927
22927
|
} else {
|
|
22928
|
-
|
|
22928
|
+
logger55.error(message);
|
|
22929
22929
|
}
|
|
22930
22930
|
}
|
|
22931
22931
|
};
|
|
22932
22932
|
}
|
|
22933
|
-
function createRealStepExecutorCallback(expertFactory,
|
|
22934
|
-
const adaptedLogger = adaptLoggerForStepExecutor(
|
|
22933
|
+
function createRealStepExecutorCallback(expertFactory, logger55, workflowId) {
|
|
22934
|
+
const adaptedLogger = adaptLoggerForStepExecutor(logger55);
|
|
22935
22935
|
const executor = createStepExecutor({ expertFactory, logger: adaptedLogger });
|
|
22936
22936
|
return async (step, ctx) => {
|
|
22937
22937
|
const startTime = getTimeProvider().now();
|
|
@@ -22947,7 +22947,7 @@ function createRealStepExecutorCallback(expertFactory, logger54, workflowId) {
|
|
|
22947
22947
|
}
|
|
22948
22948
|
const result = await executor.execute(step, workflowCtx);
|
|
22949
22949
|
if (!result.ok) {
|
|
22950
|
-
|
|
22950
|
+
logger55.warn("Step execution failed", {
|
|
22951
22951
|
stepId: step.id,
|
|
22952
22952
|
error: result.error.message
|
|
22953
22953
|
});
|
|
@@ -23007,10 +23007,10 @@ function adaptExecutionPlan(plannerPlan) {
|
|
|
23007
23007
|
}));
|
|
23008
23008
|
return { phases };
|
|
23009
23009
|
}
|
|
23010
|
-
function createMockStepExecutor(
|
|
23010
|
+
function createMockStepExecutor(logger55) {
|
|
23011
23011
|
return (step, _ctx) => {
|
|
23012
23012
|
const startTime = getTimeProvider().now();
|
|
23013
|
-
|
|
23013
|
+
logger55.debug("Executing step (mock)", {
|
|
23014
23014
|
stepId: step.id,
|
|
23015
23015
|
agent: step.agent,
|
|
23016
23016
|
action: step.action
|
|
@@ -23019,16 +23019,16 @@ function createMockStepExecutor(logger54) {
|
|
|
23019
23019
|
};
|
|
23020
23020
|
}
|
|
23021
23021
|
function resolveStepExecutor(options) {
|
|
23022
|
-
const { logger:
|
|
23022
|
+
const { logger: logger55, expertFactory, workflowId, useMockExecutor } = options;
|
|
23023
23023
|
if (useMockExecutor === true) {
|
|
23024
|
-
|
|
23024
|
+
logger55.warn(
|
|
23025
23025
|
"useMockExecutor enabled; workflow steps will return mock results (NOT RECOMMENDED)"
|
|
23026
23026
|
);
|
|
23027
|
-
return createMockStepExecutor(
|
|
23027
|
+
return createMockStepExecutor(logger55);
|
|
23028
23028
|
}
|
|
23029
23029
|
if (expertFactory !== void 0 && workflowId !== void 0) {
|
|
23030
|
-
|
|
23031
|
-
return createRealStepExecutorCallback(expertFactory,
|
|
23030
|
+
logger55.info("Using real StepExecutor with ExpertFactory", { workflowId });
|
|
23031
|
+
return createRealStepExecutorCallback(expertFactory, logger55, workflowId);
|
|
23032
23032
|
}
|
|
23033
23033
|
if (expertFactory !== void 0 && workflowId === void 0) {
|
|
23034
23034
|
throw new WorkflowExecutionUnavailableError("expertFactory provided but workflowId missing");
|
|
@@ -23039,9 +23039,9 @@ function resolveStepExecutor(options) {
|
|
|
23039
23039
|
}
|
|
23040
23040
|
function createExecutePhase(options) {
|
|
23041
23041
|
const stepExecutor = resolveStepExecutor(options);
|
|
23042
|
-
const { logger:
|
|
23042
|
+
const { logger: logger55 } = options;
|
|
23043
23043
|
return async (steps, context, executionOptions) => {
|
|
23044
|
-
|
|
23044
|
+
logger55.debug("Executing phase", {
|
|
23045
23045
|
stepCount: steps.length,
|
|
23046
23046
|
executionId: context.executionId,
|
|
23047
23047
|
maxConcurrency: executionOptions.maxConcurrency
|
|
@@ -23092,26 +23092,26 @@ function createAdaptedExecutionPlan() {
|
|
|
23092
23092
|
return ok(adaptExecutionPlan(planResult.value));
|
|
23093
23093
|
};
|
|
23094
23094
|
}
|
|
23095
|
-
function resolveExpertFactory(config,
|
|
23095
|
+
function resolveExpertFactory(config, logger55) {
|
|
23096
23096
|
if (config?.expertFactory !== void 0) {
|
|
23097
23097
|
return config.expertFactory;
|
|
23098
23098
|
}
|
|
23099
23099
|
if (config?.modelAdapter !== void 0) {
|
|
23100
|
-
|
|
23100
|
+
logger55.info("Created ExpertFactory with provided model adapter");
|
|
23101
23101
|
return createExpertFactoryWithAdapter(config.modelAdapter);
|
|
23102
23102
|
}
|
|
23103
23103
|
return void 0;
|
|
23104
23104
|
}
|
|
23105
23105
|
function createWorkflowEngineDeps(config) {
|
|
23106
|
-
const
|
|
23106
|
+
const logger55 = config?.logger ?? createLogger({ component: "WorkflowEngine" });
|
|
23107
23107
|
const builtInTemplates = config?.builtInTemplates ?? cachedBuiltInTemplates ?? /* @__PURE__ */ new Map();
|
|
23108
|
-
const expertFactory = resolveExpertFactory(config,
|
|
23108
|
+
const expertFactory = resolveExpertFactory(config, logger55);
|
|
23109
23109
|
return {
|
|
23110
23110
|
parseWorkflow: createParseWorkflow(),
|
|
23111
23111
|
loadWorkflowFile: createLoadWorkflowFile(),
|
|
23112
23112
|
createExecutionPlan: createAdaptedExecutionPlan(),
|
|
23113
23113
|
executePhase: createExecutePhase({
|
|
23114
|
-
logger:
|
|
23114
|
+
logger: logger55,
|
|
23115
23115
|
expertFactory,
|
|
23116
23116
|
workflowId: "default",
|
|
23117
23117
|
useMockExecutor: config?.useMockExecutor
|
|
@@ -23142,32 +23142,32 @@ async function createInitializedWorkflowEngine(config) {
|
|
|
23142
23142
|
function shouldSkipAdapterDetection(config) {
|
|
23143
23143
|
return config?.modelAdapter !== void 0 || config?.expertFactory !== void 0 || config?.useMockExecutor === true;
|
|
23144
23144
|
}
|
|
23145
|
-
function tryAutoDetectAdapter(
|
|
23145
|
+
function tryAutoDetectAdapter(logger55) {
|
|
23146
23146
|
try {
|
|
23147
|
-
|
|
23148
|
-
const registry = getGlobalRegistry({ logger:
|
|
23147
|
+
logger55.info("Auto-detecting model adapter for workflow execution");
|
|
23148
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
23149
23149
|
const adapter = registry.getDefault();
|
|
23150
|
-
|
|
23150
|
+
logger55.info("Using unified registry default adapter");
|
|
23151
23151
|
return adapter;
|
|
23152
23152
|
} catch (error) {
|
|
23153
23153
|
const message = getErrorMessage(error);
|
|
23154
|
-
|
|
23154
|
+
logger55.warn("No model adapter available, using mock executor", { error: message });
|
|
23155
23155
|
return void 0;
|
|
23156
23156
|
}
|
|
23157
23157
|
}
|
|
23158
23158
|
function createWorkflowEngineDepsAsync(config) {
|
|
23159
|
-
const
|
|
23159
|
+
const logger55 = config?.logger ?? createLogger({ component: "WorkflowEngine" });
|
|
23160
23160
|
if (shouldSkipAdapterDetection(config)) {
|
|
23161
|
-
|
|
23161
|
+
logger55.debug("Skipping adapter detection - using provided config");
|
|
23162
23162
|
return Promise.resolve(createWorkflowEngineDeps(config));
|
|
23163
23163
|
}
|
|
23164
|
-
const adapter = tryAutoDetectAdapter(
|
|
23164
|
+
const adapter = tryAutoDetectAdapter(logger55);
|
|
23165
23165
|
if (adapter !== void 0) {
|
|
23166
|
-
return Promise.resolve(createWorkflowEngineDeps({ ...config, modelAdapter: adapter, logger:
|
|
23166
|
+
return Promise.resolve(createWorkflowEngineDeps({ ...config, modelAdapter: adapter, logger: logger55 }));
|
|
23167
23167
|
}
|
|
23168
23168
|
if (config?.useMockExecutor === true) {
|
|
23169
|
-
|
|
23170
|
-
return Promise.resolve(createWorkflowEngineDeps({ ...config, useMockExecutor: true, logger:
|
|
23169
|
+
logger55.warn("Using mock executor as explicitly configured (no real adapter available)");
|
|
23170
|
+
return Promise.resolve(createWorkflowEngineDeps({ ...config, useMockExecutor: true, logger: logger55 }));
|
|
23171
23171
|
}
|
|
23172
23172
|
return Promise.reject(
|
|
23173
23173
|
new WorkflowExecutionUnavailableError(
|
|
@@ -23249,23 +23249,23 @@ function createToolLogger(parentLogger, toolName, requestId) {
|
|
|
23249
23249
|
}
|
|
23250
23250
|
return parentLogger.child(context);
|
|
23251
23251
|
}
|
|
23252
|
-
function logToolStart(
|
|
23253
|
-
|
|
23252
|
+
function logToolStart(logger55, toolName, args) {
|
|
23253
|
+
logger55.info("Tool execution started", {
|
|
23254
23254
|
tool: toolName,
|
|
23255
23255
|
hasArgs: args !== void 0,
|
|
23256
23256
|
argKeys: args !== void 0 ? Object.keys(args) : []
|
|
23257
23257
|
});
|
|
23258
23258
|
}
|
|
23259
|
-
function logToolSuccess(
|
|
23260
|
-
|
|
23259
|
+
function logToolSuccess(logger55, toolName, durationMs, resultInfo) {
|
|
23260
|
+
logger55.info("Tool execution completed", {
|
|
23261
23261
|
tool: toolName,
|
|
23262
23262
|
durationMs,
|
|
23263
23263
|
success: true,
|
|
23264
23264
|
...resultInfo
|
|
23265
23265
|
});
|
|
23266
23266
|
}
|
|
23267
|
-
function logToolError(
|
|
23268
|
-
|
|
23267
|
+
function logToolError(logger55, toolName, error, durationMs) {
|
|
23268
|
+
logger55.error("Tool execution failed", error, {
|
|
23269
23269
|
tool: toolName,
|
|
23270
23270
|
durationMs,
|
|
23271
23271
|
success: false,
|
|
@@ -23278,8 +23278,8 @@ function createTimer() {
|
|
|
23278
23278
|
elapsed: () => getTimeProvider().now() - startTime
|
|
23279
23279
|
};
|
|
23280
23280
|
}
|
|
23281
|
-
function withLogging(toolName, handler2,
|
|
23282
|
-
const toolLogger = createToolLogger(
|
|
23281
|
+
function withLogging(toolName, handler2, logger55) {
|
|
23282
|
+
const toolLogger = createToolLogger(logger55, toolName);
|
|
23283
23283
|
return async (args) => {
|
|
23284
23284
|
const timer = createTimer();
|
|
23285
23285
|
logToolStart(toolLogger, toolName, args);
|
|
@@ -23365,9 +23365,9 @@ var AuthHandler = class {
|
|
|
23365
23365
|
config;
|
|
23366
23366
|
logger;
|
|
23367
23367
|
storedToken;
|
|
23368
|
-
constructor(config,
|
|
23368
|
+
constructor(config, logger55) {
|
|
23369
23369
|
this.config = resolveAuthConfig(config);
|
|
23370
|
-
this.logger =
|
|
23370
|
+
this.logger = logger55 ?? createLogger({ component: "AuthHandler" });
|
|
23371
23371
|
if (this.config.enabled) this.loadToken();
|
|
23372
23372
|
}
|
|
23373
23373
|
/**
|
|
@@ -23466,22 +23466,22 @@ var AuthHandler = class {
|
|
|
23466
23466
|
};
|
|
23467
23467
|
|
|
23468
23468
|
// src/mcp/middleware/tool-error-handler.ts
|
|
23469
|
-
function toolErrorResponse(prefix, error,
|
|
23469
|
+
function toolErrorResponse(prefix, error, logger55) {
|
|
23470
23470
|
const message = getErrorMessage(error);
|
|
23471
|
-
if (
|
|
23471
|
+
if (logger55 !== void 0) {
|
|
23472
23472
|
const errorObj = error instanceof Error ? error : new Error(message);
|
|
23473
|
-
|
|
23473
|
+
logger55.error(prefix, errorObj);
|
|
23474
23474
|
}
|
|
23475
23475
|
return {
|
|
23476
23476
|
isError: true,
|
|
23477
23477
|
content: [{ type: "text", text: `${prefix}: ${message}` }]
|
|
23478
23478
|
};
|
|
23479
23479
|
}
|
|
23480
|
-
async function withToolError(prefix,
|
|
23480
|
+
async function withToolError(prefix, logger55, fn) {
|
|
23481
23481
|
try {
|
|
23482
23482
|
return await fn();
|
|
23483
23483
|
} catch (error) {
|
|
23484
|
-
return toolErrorResponse(prefix, error,
|
|
23484
|
+
return toolErrorResponse(prefix, error, logger55);
|
|
23485
23485
|
}
|
|
23486
23486
|
}
|
|
23487
23487
|
|
|
@@ -25961,47 +25961,47 @@ function createSubscriptions(eventBus, subs, handler2) {
|
|
|
25961
25961
|
}
|
|
25962
25962
|
return subscriptions;
|
|
25963
25963
|
}
|
|
25964
|
-
function createCleanupFunction(subscriptions, eventBus,
|
|
25964
|
+
function createCleanupFunction(subscriptions, eventBus, logger55) {
|
|
25965
25965
|
return () => {
|
|
25966
|
-
|
|
25966
|
+
logger55.debug("Cleaning up EventBus bridge subscriptions");
|
|
25967
25967
|
for (const sub of subscriptions) {
|
|
25968
25968
|
sub.unsubscribe();
|
|
25969
25969
|
}
|
|
25970
|
-
|
|
25970
|
+
logger55.info("EventBus bridge cleanup complete", {
|
|
25971
25971
|
unsubscribedCount: subscriptions.length,
|
|
25972
25972
|
finalStats: eventBus.getStats()
|
|
25973
25973
|
});
|
|
25974
25974
|
};
|
|
25975
25975
|
}
|
|
25976
|
-
function initializeEventBusBridge(observer,
|
|
25976
|
+
function initializeEventBusBridge(observer, logger55, config) {
|
|
25977
25977
|
const mergedConfig = mergeConfig2(config);
|
|
25978
25978
|
if (!mergedConfig.enabled) {
|
|
25979
|
-
|
|
25979
|
+
logger55.debug("EventBus bridge disabled by configuration");
|
|
25980
25980
|
return { initialized: false, subscriptionCount: 0, cleanup: () => {
|
|
25981
25981
|
} };
|
|
25982
25982
|
}
|
|
25983
25983
|
const eventBus = getGlobalEventBus({ maxHistorySize: mergedConfig.maxHistorySize });
|
|
25984
25984
|
const logConfig = mergedConfig.logging;
|
|
25985
|
-
|
|
25985
|
+
logger55.info("Initializing EventBus bridge for MCP server", {
|
|
25986
25986
|
maxHistorySize: mergedConfig.maxHistorySize,
|
|
25987
25987
|
subscriptions: mergedConfig.subscriptions
|
|
25988
25988
|
});
|
|
25989
25989
|
const handler2 = (event) => {
|
|
25990
|
-
handleEvent(event, observer,
|
|
25990
|
+
handleEvent(event, observer, logger55, logConfig);
|
|
25991
25991
|
};
|
|
25992
25992
|
const subscriptions = createSubscriptions(eventBus, mergedConfig.subscriptions, handler2);
|
|
25993
|
-
|
|
25993
|
+
logger55.info("EventBus bridge initialized", {
|
|
25994
25994
|
subscriptionCount: subscriptions.length,
|
|
25995
25995
|
eventBusStats: eventBus.getStats()
|
|
25996
25996
|
});
|
|
25997
|
-
const cleanup = createCleanupFunction(subscriptions, eventBus,
|
|
25997
|
+
const cleanup = createCleanupFunction(subscriptions, eventBus, logger55);
|
|
25998
25998
|
return {
|
|
25999
25999
|
initialized: true,
|
|
26000
26000
|
subscriptionCount: subscriptions.length,
|
|
26001
26001
|
cleanup
|
|
26002
26002
|
};
|
|
26003
26003
|
}
|
|
26004
|
-
function handleEvent(event, observer,
|
|
26004
|
+
function handleEvent(event, observer, logger55, logConfig) {
|
|
26005
26005
|
const isImportant = IMPORTANT_TOPICS.has(event.topic);
|
|
26006
26006
|
const logLevel = isImportant ? logConfig.importantEventLevel : logConfig.frequentEventLevel;
|
|
26007
26007
|
const logContext = {
|
|
@@ -26012,9 +26012,9 @@ function handleEvent(event, observer, logger54, logConfig) {
|
|
|
26012
26012
|
timestamp: event.timestamp
|
|
26013
26013
|
};
|
|
26014
26014
|
if (logLevel === "info") {
|
|
26015
|
-
|
|
26015
|
+
logger55.info(`EventBus: ${event.topic}`, logContext);
|
|
26016
26016
|
} else {
|
|
26017
|
-
|
|
26017
|
+
logger55.debug(`EventBus: ${event.topic}`, logContext);
|
|
26018
26018
|
}
|
|
26019
26019
|
recordEventToObserver(event, observer);
|
|
26020
26020
|
}
|
|
@@ -26192,19 +26192,19 @@ var PROMPT_DEFINITIONS = [
|
|
|
26192
26192
|
];
|
|
26193
26193
|
|
|
26194
26194
|
// src/mcp/prompts/index.ts
|
|
26195
|
-
function registerPrompts(server,
|
|
26195
|
+
function registerPrompts(server, logger55) {
|
|
26196
26196
|
const registered = [];
|
|
26197
26197
|
for (const definition of PROMPT_DEFINITIONS) {
|
|
26198
|
-
registerSinglePrompt(server, definition,
|
|
26198
|
+
registerSinglePrompt(server, definition, logger55);
|
|
26199
26199
|
registered.push(definition.name);
|
|
26200
26200
|
}
|
|
26201
|
-
|
|
26201
|
+
logger55.info("Prompt templates registered", {
|
|
26202
26202
|
count: registered.length,
|
|
26203
26203
|
prompts: registered
|
|
26204
26204
|
});
|
|
26205
26205
|
return { prompts: registered };
|
|
26206
26206
|
}
|
|
26207
|
-
function registerSinglePrompt(server, definition,
|
|
26207
|
+
function registerSinglePrompt(server, definition, logger55) {
|
|
26208
26208
|
server.registerPrompt(
|
|
26209
26209
|
definition.name,
|
|
26210
26210
|
{
|
|
@@ -26212,7 +26212,7 @@ function registerSinglePrompt(server, definition, logger54) {
|
|
|
26212
26212
|
argsSchema: definition.argsSchema
|
|
26213
26213
|
},
|
|
26214
26214
|
(args) => {
|
|
26215
|
-
|
|
26215
|
+
logger55.debug("Prompt requested", { prompt: definition.name });
|
|
26216
26216
|
const messages = definition.buildMessages(args);
|
|
26217
26217
|
return {
|
|
26218
26218
|
description: definition.description,
|
|
@@ -26252,7 +26252,7 @@ function buildModelsPayload() {
|
|
|
26252
26252
|
}))
|
|
26253
26253
|
};
|
|
26254
26254
|
}
|
|
26255
|
-
function registerModelsResource(server,
|
|
26255
|
+
function registerModelsResource(server, logger55) {
|
|
26256
26256
|
server.registerResource(
|
|
26257
26257
|
MODELS_RESOURCE_NAME,
|
|
26258
26258
|
MODELS_RESOURCE_URI,
|
|
@@ -26261,7 +26261,7 @@ function registerModelsResource(server, logger54) {
|
|
|
26261
26261
|
mimeType: "application/json"
|
|
26262
26262
|
},
|
|
26263
26263
|
() => {
|
|
26264
|
-
|
|
26264
|
+
logger55.debug("Reading models resource");
|
|
26265
26265
|
const payload = buildModelsPayload();
|
|
26266
26266
|
return {
|
|
26267
26267
|
contents: [
|
|
@@ -26274,7 +26274,7 @@ function registerModelsResource(server, logger54) {
|
|
|
26274
26274
|
};
|
|
26275
26275
|
}
|
|
26276
26276
|
);
|
|
26277
|
-
|
|
26277
|
+
logger55.info("Registered models resource", { uri: MODELS_RESOURCE_URI });
|
|
26278
26278
|
}
|
|
26279
26279
|
|
|
26280
26280
|
// src/indexer/research-index/research-index-base-types.ts
|
|
@@ -27065,10 +27065,10 @@ ${topicLines}
|
|
|
27065
27065
|
// src/mcp/resources/research-resource.ts
|
|
27066
27066
|
var RESEARCH_RESOURCE_URI = "nexus://research/papers";
|
|
27067
27067
|
var RESEARCH_RESOURCE_NAME = "research-papers";
|
|
27068
|
-
function buildResearchPayload(
|
|
27068
|
+
function buildResearchPayload(logger55) {
|
|
27069
27069
|
const result = parseRegistry();
|
|
27070
27070
|
if (!result.ok) {
|
|
27071
|
-
|
|
27071
|
+
logger55.debug("Research registry not available", {
|
|
27072
27072
|
error: result.error.message
|
|
27073
27073
|
});
|
|
27074
27074
|
return {
|
|
@@ -27102,7 +27102,7 @@ function buildResearchPayload(logger54) {
|
|
|
27102
27102
|
stats: index.stats
|
|
27103
27103
|
};
|
|
27104
27104
|
}
|
|
27105
|
-
function registerResearchResource(server,
|
|
27105
|
+
function registerResearchResource(server, logger55) {
|
|
27106
27106
|
server.registerResource(
|
|
27107
27107
|
RESEARCH_RESOURCE_NAME,
|
|
27108
27108
|
RESEARCH_RESOURCE_URI,
|
|
@@ -27111,9 +27111,9 @@ function registerResearchResource(server, logger54) {
|
|
|
27111
27111
|
mimeType: "application/json"
|
|
27112
27112
|
},
|
|
27113
27113
|
() => {
|
|
27114
|
-
|
|
27114
|
+
logger55.debug("Reading research resource");
|
|
27115
27115
|
try {
|
|
27116
|
-
const payload = buildResearchPayload(
|
|
27116
|
+
const payload = buildResearchPayload(logger55);
|
|
27117
27117
|
return {
|
|
27118
27118
|
contents: [
|
|
27119
27119
|
{
|
|
@@ -27124,7 +27124,7 @@ function registerResearchResource(server, logger54) {
|
|
|
27124
27124
|
]
|
|
27125
27125
|
};
|
|
27126
27126
|
} catch (error) {
|
|
27127
|
-
|
|
27127
|
+
logger55.warn("Failed to build research payload", {
|
|
27128
27128
|
error: getErrorMessage(error)
|
|
27129
27129
|
});
|
|
27130
27130
|
return {
|
|
@@ -27139,7 +27139,7 @@ function registerResearchResource(server, logger54) {
|
|
|
27139
27139
|
}
|
|
27140
27140
|
}
|
|
27141
27141
|
);
|
|
27142
|
-
|
|
27142
|
+
logger55.info("Registered research resource", { uri: RESEARCH_RESOURCE_URI });
|
|
27143
27143
|
}
|
|
27144
27144
|
|
|
27145
27145
|
// src/mcp/tools/create-expert.ts
|
|
@@ -27240,29 +27240,29 @@ var ROLE_TO_TASK_CATEGORY = {
|
|
|
27240
27240
|
pm_expert: "planning",
|
|
27241
27241
|
ux_expert: "planning"
|
|
27242
27242
|
};
|
|
27243
|
-
function resolveAdapterForModelPreference(modelPreference, fallbackAdapter,
|
|
27244
|
-
const registry = getGlobalRegistry({ logger:
|
|
27243
|
+
function resolveAdapterForModelPreference(modelPreference, fallbackAdapter, logger55) {
|
|
27244
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
27245
27245
|
const adapter = registry.getAdapterForModel(modelPreference);
|
|
27246
27246
|
if (adapter === registry.getDefault() && fallbackAdapter !== void 0) {
|
|
27247
|
-
|
|
27247
|
+
logger55.debug("Model preference not in registry, using fallback adapter", { modelPreference });
|
|
27248
27248
|
return fallbackAdapter;
|
|
27249
27249
|
}
|
|
27250
|
-
|
|
27250
|
+
logger55.info("Routing expert to CLI for model preference", { modelPreference });
|
|
27251
27251
|
return adapter;
|
|
27252
27252
|
}
|
|
27253
|
-
function resolveAdapterForRole(role, fallbackAdapter,
|
|
27253
|
+
function resolveAdapterForRole(role, fallbackAdapter, logger55) {
|
|
27254
27254
|
const category = ROLE_TO_TASK_CATEGORY[role];
|
|
27255
27255
|
if (category === void 0) return fallbackAdapter;
|
|
27256
|
-
const registry = getGlobalRegistry({ logger:
|
|
27256
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
27257
27257
|
const adapter = registry.getAdapter(category);
|
|
27258
|
-
|
|
27258
|
+
logger55.info("Auto-routing expert to specialized CLI", {
|
|
27259
27259
|
role,
|
|
27260
27260
|
category,
|
|
27261
27261
|
preferredCli: registry.getRouting(category)?.primaryCli
|
|
27262
27262
|
});
|
|
27263
27263
|
return adapter;
|
|
27264
27264
|
}
|
|
27265
|
-
function getExpertFallbackChain(role, excludeCli,
|
|
27265
|
+
function getExpertFallbackChain(role, excludeCli, logger55) {
|
|
27266
27266
|
const category = ROLE_TO_TASK_CATEGORY[role];
|
|
27267
27267
|
if (category === void 0) return [];
|
|
27268
27268
|
const bucketType = CATEGORY_TO_FALLBACK_TYPE[category];
|
|
@@ -27271,7 +27271,7 @@ function getExpertFallbackChain(role, excludeCli, logger54) {
|
|
|
27271
27271
|
bucketType
|
|
27272
27272
|
);
|
|
27273
27273
|
const filtered = chain.filter((cli) => cli !== excludeCli);
|
|
27274
|
-
|
|
27274
|
+
logger55.debug("Expert fallback chain resolved", { role, category, excludeCli, chain: filtered });
|
|
27275
27275
|
return [...filtered];
|
|
27276
27276
|
}
|
|
27277
27277
|
|
|
@@ -27377,16 +27377,16 @@ function buildResponse(expert) {
|
|
|
27377
27377
|
};
|
|
27378
27378
|
}
|
|
27379
27379
|
function createExpertFromFactory(deps, expertType, modelPreference, role) {
|
|
27380
|
-
const
|
|
27380
|
+
const logger55 = deps.logger ?? createLogger({ tool: "create_expert" });
|
|
27381
27381
|
const options = {};
|
|
27382
27382
|
if (modelPreference !== void 0) {
|
|
27383
27383
|
options.modelOverrides = { modelId: modelPreference };
|
|
27384
27384
|
}
|
|
27385
27385
|
let adapter;
|
|
27386
27386
|
if (modelPreference !== void 0) {
|
|
27387
|
-
adapter = resolveAdapterForModelPreference(modelPreference, deps.modelAdapter,
|
|
27387
|
+
adapter = resolveAdapterForModelPreference(modelPreference, deps.modelAdapter, logger55);
|
|
27388
27388
|
} else if (role !== void 0) {
|
|
27389
|
-
adapter = resolveAdapterForRole(role, deps.modelAdapter,
|
|
27389
|
+
adapter = resolveAdapterForRole(role, deps.modelAdapter, logger55);
|
|
27390
27390
|
} else {
|
|
27391
27391
|
adapter = deps.modelAdapter;
|
|
27392
27392
|
}
|
|
@@ -27457,7 +27457,7 @@ function createCreateExpertHandler(deps) {
|
|
|
27457
27457
|
};
|
|
27458
27458
|
}
|
|
27459
27459
|
function registerCreateExpertTool(server, deps) {
|
|
27460
|
-
const
|
|
27460
|
+
const logger55 = deps.logger ?? createLogger({ tool: "create_expert" });
|
|
27461
27461
|
const toolSchema = {
|
|
27462
27462
|
role: z56.enum([
|
|
27463
27463
|
"code_expert",
|
|
@@ -27477,23 +27477,23 @@ function registerCreateExpertTool(server, deps) {
|
|
|
27477
27477
|
const secureHandler = createSecureHandler(createCreateExpertHandler(deps), {
|
|
27478
27478
|
toolName: "create_expert",
|
|
27479
27479
|
rateLimiter: deps.rateLimiter,
|
|
27480
|
-
logger:
|
|
27480
|
+
logger: logger55
|
|
27481
27481
|
});
|
|
27482
27482
|
const timeoutMs = getToolTimeout("create_expert", deps.security);
|
|
27483
|
-
const wrappedHandler = wrapToolWithTimeout("create_expert", secureHandler, { timeoutMs, logger:
|
|
27483
|
+
const wrappedHandler = wrapToolWithTimeout("create_expert", secureHandler, { timeoutMs, logger: logger55 });
|
|
27484
27484
|
server.registerTool(
|
|
27485
27485
|
"create_expert",
|
|
27486
27486
|
{ description, inputSchema: toolSchema },
|
|
27487
27487
|
toSdkCallback(wrappedHandler)
|
|
27488
27488
|
);
|
|
27489
|
-
|
|
27489
|
+
logger55.info("Registered create_expert tool with secure handler and timeout protection");
|
|
27490
27490
|
}
|
|
27491
|
-
function createDefaultDeps(rateLimiter,
|
|
27491
|
+
function createDefaultDeps(rateLimiter, logger55) {
|
|
27492
27492
|
return {
|
|
27493
27493
|
expertFactory: ExpertFactory,
|
|
27494
27494
|
expertRegistry: /* @__PURE__ */ new Map(),
|
|
27495
27495
|
rateLimiter,
|
|
27496
|
-
...
|
|
27496
|
+
...logger55 !== void 0 ? { logger: logger55 } : {}
|
|
27497
27497
|
};
|
|
27498
27498
|
}
|
|
27499
27499
|
function getAvailableRoles() {
|
|
@@ -27528,7 +27528,7 @@ function buildExpertsPayload() {
|
|
|
27528
27528
|
experts
|
|
27529
27529
|
};
|
|
27530
27530
|
}
|
|
27531
|
-
function registerExpertsResource(server,
|
|
27531
|
+
function registerExpertsResource(server, logger55) {
|
|
27532
27532
|
server.registerResource(
|
|
27533
27533
|
EXPERTS_RESOURCE_NAME,
|
|
27534
27534
|
EXPERTS_RESOURCE_URI,
|
|
@@ -27537,7 +27537,7 @@ function registerExpertsResource(server, logger54) {
|
|
|
27537
27537
|
mimeType: "application/json"
|
|
27538
27538
|
},
|
|
27539
27539
|
() => {
|
|
27540
|
-
|
|
27540
|
+
logger55.debug("Reading experts resource");
|
|
27541
27541
|
const payload = buildExpertsPayload();
|
|
27542
27542
|
return {
|
|
27543
27543
|
contents: [
|
|
@@ -27550,12 +27550,12 @@ function registerExpertsResource(server, logger54) {
|
|
|
27550
27550
|
};
|
|
27551
27551
|
}
|
|
27552
27552
|
);
|
|
27553
|
-
|
|
27553
|
+
logger55.info("Registered experts resource", { uri: EXPERTS_RESOURCE_URI });
|
|
27554
27554
|
}
|
|
27555
27555
|
|
|
27556
27556
|
// src/mcp/resources/index.ts
|
|
27557
|
-
function registerResources(server,
|
|
27558
|
-
const log3 =
|
|
27557
|
+
function registerResources(server, logger55) {
|
|
27558
|
+
const log3 = logger55 ?? createLogger({ component: "mcp-resources" });
|
|
27559
27559
|
log3.info("Registering MCP resources");
|
|
27560
27560
|
registerModelsResource(server, log3);
|
|
27561
27561
|
registerResearchResource(server, log3);
|
|
@@ -27669,11 +27669,11 @@ function validateWorkflowInputs(workflow, inputs) {
|
|
|
27669
27669
|
};
|
|
27670
27670
|
}
|
|
27671
27671
|
async function loadWorkflowFromPath(deps, filePath) {
|
|
27672
|
-
const { workflowEngine, logger:
|
|
27672
|
+
const { workflowEngine, logger: logger55 } = deps;
|
|
27673
27673
|
const allowedDirs = getAllowedWorkflowDirs(deps);
|
|
27674
27674
|
const pathValidation = validateWorkflowPath(filePath, allowedDirs);
|
|
27675
27675
|
if (!pathValidation.ok) {
|
|
27676
|
-
|
|
27676
|
+
logger55?.warn("Workflow path validation failed", {
|
|
27677
27677
|
path: filePath,
|
|
27678
27678
|
error: pathValidation.error.message
|
|
27679
27679
|
});
|
|
@@ -27692,8 +27692,8 @@ async function loadWorkflowFromPath(deps, filePath) {
|
|
|
27692
27692
|
return result;
|
|
27693
27693
|
}
|
|
27694
27694
|
async function loadWorkflowFromName(deps, name) {
|
|
27695
|
-
const { workflowEngine, logger:
|
|
27696
|
-
|
|
27695
|
+
const { workflowEngine, logger: logger55 } = deps;
|
|
27696
|
+
logger55?.debug("Looking up built-in template", { name });
|
|
27697
27697
|
const templates = await workflowEngine.listTemplates();
|
|
27698
27698
|
const found = templates.find((t) => t.name === name);
|
|
27699
27699
|
if (found === void 0) {
|
|
@@ -27717,9 +27717,9 @@ async function loadWorkflowFromName(deps, name) {
|
|
|
27717
27717
|
return { ok: true, value: definition };
|
|
27718
27718
|
}
|
|
27719
27719
|
async function loadWorkflow(deps, template) {
|
|
27720
|
-
const { logger:
|
|
27720
|
+
const { logger: logger55 } = deps;
|
|
27721
27721
|
if (isFilePath(template)) {
|
|
27722
|
-
|
|
27722
|
+
logger55?.debug("Loading workflow from file", { path: template });
|
|
27723
27723
|
return loadWorkflowFromPath(deps, template);
|
|
27724
27724
|
}
|
|
27725
27725
|
return loadWorkflowFromName(deps, template);
|
|
@@ -27766,15 +27766,15 @@ function formatValidationErrors(validation) {
|
|
|
27766
27766
|
|
|
27767
27767
|
// src/mcp/tools/run-workflow.ts
|
|
27768
27768
|
async function executeWorkflow(deps, workflow, inputs) {
|
|
27769
|
-
const { workflowEngine, logger:
|
|
27770
|
-
|
|
27769
|
+
const { workflowEngine, logger: logger55 } = deps;
|
|
27770
|
+
logger55?.info("Executing workflow", {
|
|
27771
27771
|
workflowName: workflow.name,
|
|
27772
27772
|
inputCount: Object.keys(inputs).length
|
|
27773
27773
|
});
|
|
27774
27774
|
const startTime = getTimeProvider().now();
|
|
27775
27775
|
const result = await workflowEngine.execute(workflow, inputs);
|
|
27776
27776
|
if (!result.ok) {
|
|
27777
|
-
|
|
27777
|
+
logger55?.error("Workflow execution failed", result.error, {
|
|
27778
27778
|
workflowName: workflow.name
|
|
27779
27779
|
});
|
|
27780
27780
|
return {
|
|
@@ -27783,7 +27783,7 @@ async function executeWorkflow(deps, workflow, inputs) {
|
|
|
27783
27783
|
};
|
|
27784
27784
|
}
|
|
27785
27785
|
const workflowResult = result.value;
|
|
27786
|
-
|
|
27786
|
+
logger55?.info("Workflow completed", {
|
|
27787
27787
|
workflowName: workflow.name,
|
|
27788
27788
|
durationMs: getTimeProvider().now() - startTime,
|
|
27789
27789
|
stepCount: workflowResult.stepResults.length
|
|
@@ -27896,16 +27896,16 @@ function createRunWorkflowHandler(deps) {
|
|
|
27896
27896
|
};
|
|
27897
27897
|
}
|
|
27898
27898
|
function registerRunWorkflowTool(server, deps) {
|
|
27899
|
-
const
|
|
27899
|
+
const logger55 = deps.logger ?? createLogger({ tool: "run_workflow" });
|
|
27900
27900
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
27901
27901
|
const depsWithNotifier = { ...deps, notifier };
|
|
27902
27902
|
const secureHandler = createSecureHandler(createRunWorkflowHandler(depsWithNotifier), {
|
|
27903
27903
|
toolName: "run_workflow",
|
|
27904
27904
|
rateLimiter: deps.rateLimiter,
|
|
27905
|
-
logger:
|
|
27905
|
+
logger: logger55
|
|
27906
27906
|
});
|
|
27907
27907
|
const timeoutMs = getToolTimeout("run_workflow", deps.security);
|
|
27908
|
-
const wrappedHandler = wrapToolWithTimeout("run_workflow", secureHandler, { timeoutMs, logger:
|
|
27908
|
+
const wrappedHandler = wrapToolWithTimeout("run_workflow", secureHandler, { timeoutMs, logger: logger55 });
|
|
27909
27909
|
server.registerTool(
|
|
27910
27910
|
"run_workflow",
|
|
27911
27911
|
{
|
|
@@ -27914,7 +27914,7 @@ function registerRunWorkflowTool(server, deps) {
|
|
|
27914
27914
|
},
|
|
27915
27915
|
toSdkCallback(wrappedHandler)
|
|
27916
27916
|
);
|
|
27917
|
-
|
|
27917
|
+
logger55.info("Registered run_workflow tool with secure handler and timeout protection");
|
|
27918
27918
|
}
|
|
27919
27919
|
|
|
27920
27920
|
// src/orchestration/graph/graph-types.ts
|
|
@@ -30078,8 +30078,8 @@ var OrchestratorAdapter = class {
|
|
|
30078
30078
|
history = [];
|
|
30079
30079
|
logger;
|
|
30080
30080
|
agent = null;
|
|
30081
|
-
constructor(
|
|
30082
|
-
this.logger =
|
|
30081
|
+
constructor(logger55) {
|
|
30082
|
+
this.logger = logger55 ?? createLogger({ component: "OrchestratorAdapter" });
|
|
30083
30083
|
}
|
|
30084
30084
|
setOrchestrator(agent) {
|
|
30085
30085
|
this.agent = agent;
|
|
@@ -30219,10 +30219,10 @@ var WorkflowOrchestratorAdapter = class {
|
|
|
30219
30219
|
logger;
|
|
30220
30220
|
executions = /* @__PURE__ */ new Map();
|
|
30221
30221
|
history = [];
|
|
30222
|
-
constructor(engine,
|
|
30222
|
+
constructor(engine, logger55) {
|
|
30223
30223
|
this.id = `workflow-${randomUUID10().slice(0, 8)}`;
|
|
30224
30224
|
this.engine = engine;
|
|
30225
|
-
this.logger =
|
|
30225
|
+
this.logger = logger55 ?? createLogger({ component: "WorkflowOrchestratorAdapter" });
|
|
30226
30226
|
}
|
|
30227
30227
|
async execute(definition, inputs, _options) {
|
|
30228
30228
|
if (definition.type !== "workflow") {
|
|
@@ -30414,22 +30414,22 @@ var OrchestratorFactory = class {
|
|
|
30414
30414
|
}
|
|
30415
30415
|
};
|
|
30416
30416
|
async function createOrchestratorFactory(config) {
|
|
30417
|
-
const
|
|
30418
|
-
|
|
30417
|
+
const logger55 = config?.logger ?? createLogger({ component: "OrchestratorFactory" });
|
|
30418
|
+
logger55.info("Initializing OrchestratorFactory");
|
|
30419
30419
|
let workflowEngine;
|
|
30420
30420
|
try {
|
|
30421
30421
|
const workflowConfig = {
|
|
30422
30422
|
...config?.workflowConfig,
|
|
30423
|
-
logger:
|
|
30423
|
+
logger: logger55
|
|
30424
30424
|
};
|
|
30425
30425
|
if (config?.modelAdapter !== void 0) {
|
|
30426
30426
|
workflowConfig.modelAdapter = config.modelAdapter;
|
|
30427
30427
|
}
|
|
30428
30428
|
workflowEngine = await createProductionWorkflowEngine(workflowConfig);
|
|
30429
|
-
|
|
30429
|
+
logger55.info("WorkflowEngine initialized");
|
|
30430
30430
|
} catch (error) {
|
|
30431
30431
|
const message = getErrorMessage(error);
|
|
30432
|
-
|
|
30432
|
+
logger55.warn("WorkflowEngine initialization failed, workflow orchestration unavailable", {
|
|
30433
30433
|
error: message
|
|
30434
30434
|
});
|
|
30435
30435
|
}
|
|
@@ -30440,12 +30440,12 @@ async function createOrchestratorFactory(config) {
|
|
|
30440
30440
|
var MAX_OUTCOMES2 = 200;
|
|
30441
30441
|
var AMBIGUITY_THRESHOLD = 0.7;
|
|
30442
30442
|
function createWorkflowRouter(options) {
|
|
30443
|
-
const
|
|
30444
|
-
const analyzer = options?.analyzer ?? createSharedTaskAnalyzer({ logger:
|
|
30443
|
+
const logger55 = options?.logger ?? createLogger({ component: "WorkflowRouter" });
|
|
30444
|
+
const analyzer = options?.analyzer ?? createSharedTaskAnalyzer({ logger: logger55 });
|
|
30445
30445
|
const outcomes = [];
|
|
30446
30446
|
return {
|
|
30447
30447
|
route(signals, routerOpts) {
|
|
30448
|
-
return routeTask(signals, analyzer,
|
|
30448
|
+
return routeTask(signals, analyzer, logger55, routerOpts);
|
|
30449
30449
|
},
|
|
30450
30450
|
recordOutcome(outcome) {
|
|
30451
30451
|
recordPatternOutcome(outcomes, outcome);
|
|
@@ -30487,7 +30487,7 @@ function buildDecision(input) {
|
|
|
30487
30487
|
}
|
|
30488
30488
|
return base;
|
|
30489
30489
|
}
|
|
30490
|
-
function routeTask(signals, analyzer,
|
|
30490
|
+
function routeTask(signals, analyzer, logger55, _opts) {
|
|
30491
30491
|
const analysis = analyzer.analyze(signals.description);
|
|
30492
30492
|
const enriched = enrichSignals(signals, analysis);
|
|
30493
30493
|
const matchedRules = [];
|
|
@@ -30497,7 +30497,7 @@ function routeTask(signals, analyzer, logger54, _opts) {
|
|
|
30497
30497
|
if (result !== void 0) {
|
|
30498
30498
|
matchedRules.push(rule.name);
|
|
30499
30499
|
collectAlternatives(alternatives, result.pattern);
|
|
30500
|
-
|
|
30500
|
+
logger55.info("Workflow pattern selected", {
|
|
30501
30501
|
pattern: result.pattern,
|
|
30502
30502
|
rule: rule.name,
|
|
30503
30503
|
confidence: result.confidence,
|
|
@@ -30507,7 +30507,7 @@ function routeTask(signals, analyzer, logger54, _opts) {
|
|
|
30507
30507
|
return buildDecision({ result, matchedRules, alternatives, analysis });
|
|
30508
30508
|
}
|
|
30509
30509
|
}
|
|
30510
|
-
|
|
30510
|
+
logger55.info("Using fallback pattern", { pattern: "graph", taskType: analysis.taskType });
|
|
30511
30511
|
const fallback = {
|
|
30512
30512
|
pattern: "graph",
|
|
30513
30513
|
reasoning: "No specific rule matched \u2014 using Graph DAG as the most general pattern",
|
|
@@ -30794,11 +30794,11 @@ function createMockTechLead() {
|
|
|
30794
30794
|
var globalSicaConfig;
|
|
30795
30795
|
var sicaEnabled = false;
|
|
30796
30796
|
function initializeSica(options) {
|
|
30797
|
-
const { sicaConfig, logger:
|
|
30797
|
+
const { sicaConfig, logger: logger55 } = options;
|
|
30798
30798
|
if (sicaConfig?.enabled !== true) {
|
|
30799
30799
|
sicaEnabled = false;
|
|
30800
30800
|
globalSicaConfig = void 0;
|
|
30801
|
-
|
|
30801
|
+
logger55.info("SICA self-improvement disabled by configuration");
|
|
30802
30802
|
return {
|
|
30803
30803
|
enabled: false,
|
|
30804
30804
|
reason: sicaConfig?.enabled === false ? "disabled in config" : "not enabled (opt-in feature)"
|
|
@@ -30806,7 +30806,7 @@ function initializeSica(options) {
|
|
|
30806
30806
|
}
|
|
30807
30807
|
sicaEnabled = true;
|
|
30808
30808
|
globalSicaConfig = sicaConfig;
|
|
30809
|
-
|
|
30809
|
+
logger55.info("SICA self-improvement enabled", {
|
|
30810
30810
|
improvementThreshold: sicaConfig.improvementThreshold,
|
|
30811
30811
|
maxActiveVersions: sicaConfig.maxActiveVersions,
|
|
30812
30812
|
cooldownMs: sicaConfig.improvementCooldownMs
|
|
@@ -30824,18 +30824,18 @@ function getSicaConfig() {
|
|
|
30824
30824
|
}
|
|
30825
30825
|
|
|
30826
30826
|
// src/mcp/tools/orchestrate-sica.ts
|
|
30827
|
-
function createOrchestratorWithSica(
|
|
30828
|
-
const orchestrator = new Orchestrator({ logger:
|
|
30827
|
+
function createOrchestratorWithSica(logger55, adapter) {
|
|
30828
|
+
const orchestrator = new Orchestrator({ logger: logger55, ...adapter !== void 0 ? { adapter } : {} });
|
|
30829
30829
|
if (!isSicaEnabled()) {
|
|
30830
|
-
|
|
30830
|
+
logger55.debug("SICA not enabled, using plain orchestrator");
|
|
30831
30831
|
return orchestrator;
|
|
30832
30832
|
}
|
|
30833
30833
|
const sicaConfig = getSicaConfig();
|
|
30834
30834
|
if (sicaConfig === void 0) {
|
|
30835
|
-
|
|
30835
|
+
logger55.debug("SICA config unavailable, using plain orchestrator");
|
|
30836
30836
|
return orchestrator;
|
|
30837
30837
|
}
|
|
30838
|
-
|
|
30838
|
+
logger55.info("Creating SICA-wrapped orchestrator", {
|
|
30839
30839
|
improvementThreshold: sicaConfig.improvementThreshold,
|
|
30840
30840
|
maxActiveVersions: sicaConfig.maxActiveVersions
|
|
30841
30841
|
});
|
|
@@ -30855,9 +30855,9 @@ function createOrchestratorWithSica(logger54, adapter) {
|
|
|
30855
30855
|
improvementCooldownMs: sicaConfig.improvementCooldownMs,
|
|
30856
30856
|
enableObservability: sicaConfig.enableObservability
|
|
30857
30857
|
},
|
|
30858
|
-
logger:
|
|
30858
|
+
logger: logger55
|
|
30859
30859
|
});
|
|
30860
|
-
return createSicaOrchestratorAdapter(sicaAgent,
|
|
30860
|
+
return createSicaOrchestratorAdapter(sicaAgent, logger55);
|
|
30861
30861
|
}
|
|
30862
30862
|
function createSicaOrchestratorAdapter(sicaAgent, _logger) {
|
|
30863
30863
|
return {
|
|
@@ -30913,7 +30913,7 @@ var PersistedCatalogSchema = z62.object({
|
|
|
30913
30913
|
function getCatalogPath() {
|
|
30914
30914
|
return path4.join(os2.homedir(), CATALOG_DIR, CATALOG_FILE);
|
|
30915
30915
|
}
|
|
30916
|
-
function loadPersistedCatalog(
|
|
30916
|
+
function loadPersistedCatalog(logger55) {
|
|
30917
30917
|
const filePath = getCatalogPath();
|
|
30918
30918
|
try {
|
|
30919
30919
|
if (!fs4.existsSync(filePath)) return [];
|
|
@@ -30921,21 +30921,21 @@ function loadPersistedCatalog(logger54) {
|
|
|
30921
30921
|
const parsed = JSON.parse(content);
|
|
30922
30922
|
const result = PersistedCatalogSchema.safeParse(parsed);
|
|
30923
30923
|
if (!result.success) {
|
|
30924
|
-
|
|
30924
|
+
logger55.warn("Invalid pending catalog file, starting fresh", {
|
|
30925
30925
|
errors: result.error.issues.map((i) => i.message)
|
|
30926
30926
|
});
|
|
30927
30927
|
return [];
|
|
30928
30928
|
}
|
|
30929
30929
|
return result.data.references;
|
|
30930
30930
|
} catch (error) {
|
|
30931
|
-
|
|
30931
|
+
logger55.debug("Could not load pending catalog, starting fresh", {
|
|
30932
30932
|
error: getErrorMessage(error),
|
|
30933
30933
|
filePath
|
|
30934
30934
|
});
|
|
30935
30935
|
return [];
|
|
30936
30936
|
}
|
|
30937
30937
|
}
|
|
30938
|
-
function savePersistedCatalog(references,
|
|
30938
|
+
function savePersistedCatalog(references, logger55) {
|
|
30939
30939
|
const dirPath = path4.join(os2.homedir(), CATALOG_DIR);
|
|
30940
30940
|
const filePath = getCatalogPath();
|
|
30941
30941
|
const tempPath = `${filePath}.tmp.${String(process.pid)}`;
|
|
@@ -30957,7 +30957,7 @@ function savePersistedCatalog(references, logger54) {
|
|
|
30957
30957
|
} catch {
|
|
30958
30958
|
}
|
|
30959
30959
|
const message = getErrorMessage(error);
|
|
30960
|
-
|
|
30960
|
+
logger55.warn("Failed to persist pending catalog", { error: message });
|
|
30961
30961
|
}
|
|
30962
30962
|
}
|
|
30963
30963
|
var ARXIV_PATTERN = /\b(\d{4}\.\d{4,5})\b/g;
|
|
@@ -30967,8 +30967,8 @@ var ResearchAutoCatalog = class _ResearchAutoCatalog {
|
|
|
30967
30967
|
pendingReferences = [];
|
|
30968
30968
|
/** Maximum pending references to hold in memory. */
|
|
30969
30969
|
static MAX_PENDING = 100;
|
|
30970
|
-
constructor(
|
|
30971
|
-
this.logger =
|
|
30970
|
+
constructor(logger55) {
|
|
30971
|
+
this.logger = logger55 ?? createLogger({ component: "research-auto-catalog" });
|
|
30972
30972
|
const persisted = loadPersistedCatalog(this.logger);
|
|
30973
30973
|
if (persisted.length > 0) {
|
|
30974
30974
|
this.pendingReferences.push(...persisted.slice(0, _ResearchAutoCatalog.MAX_PENDING));
|
|
@@ -31123,8 +31123,8 @@ var ResearchAutoCatalog = class _ResearchAutoCatalog {
|
|
|
31123
31123
|
}
|
|
31124
31124
|
};
|
|
31125
31125
|
var autoCatalogInstance;
|
|
31126
|
-
function getAutoCatalog(
|
|
31127
|
-
autoCatalogInstance ??= new ResearchAutoCatalog(
|
|
31126
|
+
function getAutoCatalog(logger55) {
|
|
31127
|
+
autoCatalogInstance ??= new ResearchAutoCatalog(logger55);
|
|
31128
31128
|
return autoCatalogInstance;
|
|
31129
31129
|
}
|
|
31130
31130
|
|
|
@@ -31314,10 +31314,15 @@ function assignDependencyAwareWaves(entries) {
|
|
|
31314
31314
|
}
|
|
31315
31315
|
}
|
|
31316
31316
|
}
|
|
31317
|
-
return entries.map((entry) =>
|
|
31318
|
-
|
|
31319
|
-
|
|
31320
|
-
|
|
31317
|
+
return entries.map((entry) => {
|
|
31318
|
+
const deps = EXPERT_DEPENDENCIES[entry.role];
|
|
31319
|
+
const presentDeps = deps?.filter((d) => roleToWave.has(d)) ?? [];
|
|
31320
|
+
return {
|
|
31321
|
+
...entry,
|
|
31322
|
+
wave: roleToWave.get(entry.role) ?? entry.wave,
|
|
31323
|
+
...presentDeps.length > 0 ? { dependsOn: presentDeps } : {}
|
|
31324
|
+
};
|
|
31325
|
+
});
|
|
31321
31326
|
}
|
|
31322
31327
|
function mapHintToRole(hint) {
|
|
31323
31328
|
const lower = hint.toLowerCase();
|
|
@@ -32896,12 +32901,12 @@ function computeExpertReliability() {
|
|
|
32896
32901
|
}
|
|
32897
32902
|
return reliability;
|
|
32898
32903
|
}
|
|
32899
|
-
function computeAgentPlan(task,
|
|
32904
|
+
function computeAgentPlan(task, logger55) {
|
|
32900
32905
|
try {
|
|
32901
32906
|
const analyzer = new SharedTaskAnalyzer();
|
|
32902
32907
|
const analysis = analyzer.analyze(task);
|
|
32903
32908
|
if (analysis.complexity === "simple") {
|
|
32904
|
-
|
|
32909
|
+
logger55.debug("Skipping AOrchestra planning for simple task", {
|
|
32905
32910
|
taskType: analysis.taskType
|
|
32906
32911
|
});
|
|
32907
32912
|
return void 0;
|
|
@@ -32913,9 +32918,9 @@ function computeAgentPlan(task, logger54) {
|
|
|
32913
32918
|
if (rate < 0.5) excludedExperts.push({ role, rate: Math.round(rate * 100) / 100 });
|
|
32914
32919
|
}
|
|
32915
32920
|
if (excludedExperts.length > 0) {
|
|
32916
|
-
|
|
32921
|
+
logger55.warn("Experts excluded by reliability filter", { excludedExperts });
|
|
32917
32922
|
}
|
|
32918
|
-
|
|
32923
|
+
logger55.info("AOrchestra plan", {
|
|
32919
32924
|
experts: plan.totalExperts,
|
|
32920
32925
|
taskType: plan.taskType,
|
|
32921
32926
|
complexity: plan.complexity,
|
|
@@ -32923,7 +32928,7 @@ function computeAgentPlan(task, logger54) {
|
|
|
32923
32928
|
});
|
|
32924
32929
|
return plan;
|
|
32925
32930
|
} catch (planError) {
|
|
32926
|
-
|
|
32931
|
+
logger55.warn("AOrchestra planning failed", {
|
|
32927
32932
|
error: getErrorMessage(planError)
|
|
32928
32933
|
});
|
|
32929
32934
|
return void 0;
|
|
@@ -32993,7 +32998,7 @@ async function executeOnAdapter(opts) {
|
|
|
32993
32998
|
}
|
|
32994
32999
|
}
|
|
32995
33000
|
function createWorkerExecutor(config) {
|
|
32996
|
-
const { taskDescription, modelAdapter, logger:
|
|
33001
|
+
const { taskDescription, modelAdapter, logger: logger55, learnings, perWorkerRouting } = config;
|
|
32997
33002
|
const effectiveFallbackCli = modelAdapter.providerId;
|
|
32998
33003
|
return async (entry, priorWaveResults) => {
|
|
32999
33004
|
const workerStartMs = getTimeProvider().now();
|
|
@@ -33002,7 +33007,7 @@ function createWorkerExecutor(config) {
|
|
|
33002
33007
|
modelAdapter,
|
|
33003
33008
|
effectiveFallbackCli,
|
|
33004
33009
|
perWorkerRouting === true,
|
|
33005
|
-
|
|
33010
|
+
logger55
|
|
33006
33011
|
);
|
|
33007
33012
|
return executeOnAdapter({
|
|
33008
33013
|
entry,
|
|
@@ -33176,15 +33181,15 @@ function prepareBudgetedEntries(plan, maxCalls, log3) {
|
|
|
33176
33181
|
return entries;
|
|
33177
33182
|
}
|
|
33178
33183
|
async function executeWorkerDispatch(options) {
|
|
33179
|
-
const { agentPlan, taskDescription, modelAdapter, logger:
|
|
33184
|
+
const { agentPlan, taskDescription, modelAdapter, logger: logger55, maxConcurrency } = options;
|
|
33180
33185
|
const maxCalls = resolveMaxWorkerCalls(options.maxWorkerCalls);
|
|
33181
33186
|
const startMs = getTimeProvider().now();
|
|
33182
|
-
const entries = prepareBudgetedEntries(agentPlan, maxCalls,
|
|
33187
|
+
const entries = prepareBudgetedEntries(agentPlan, maxCalls, logger55);
|
|
33183
33188
|
const qualityGate = options.qualityGate === false ? void 0 : options.qualityGate;
|
|
33184
33189
|
const executorConfig = {
|
|
33185
33190
|
taskDescription,
|
|
33186
33191
|
modelAdapter,
|
|
33187
|
-
logger:
|
|
33192
|
+
logger: logger55,
|
|
33188
33193
|
...options.learnings !== void 0 ? { learnings: options.learnings } : {},
|
|
33189
33194
|
...options.perWorkerRouting !== void 0 ? { perWorkerRouting: options.perWorkerRouting } : {}
|
|
33190
33195
|
};
|
|
@@ -33205,8 +33210,8 @@ async function executeWorkerDispatch(options) {
|
|
|
33205
33210
|
};
|
|
33206
33211
|
await runSynthesisPhase(state, options, maxCalls);
|
|
33207
33212
|
const refined = await runRefinementPhase(state, entries, options, maxCalls);
|
|
33208
|
-
const base = buildDispatchResult(state.results, startMs,
|
|
33209
|
-
logDispatchInsights(state.results,
|
|
33213
|
+
const base = buildDispatchResult(state.results, startMs, logger55, state.totalModelCalls);
|
|
33214
|
+
logDispatchInsights(state.results, logger55);
|
|
33210
33215
|
return {
|
|
33211
33216
|
...base,
|
|
33212
33217
|
...refined ? { refined: true } : {},
|
|
@@ -33264,18 +33269,18 @@ function recordWorkerOutcomes(results, taskDescription) {
|
|
|
33264
33269
|
});
|
|
33265
33270
|
}
|
|
33266
33271
|
}
|
|
33267
|
-
function buildDispatchResult(results, startMs,
|
|
33272
|
+
function buildDispatchResult(results, startMs, logger55, totalModelCalls) {
|
|
33268
33273
|
const successCount = results.filter((r) => r.status === "success").length;
|
|
33269
33274
|
const errorCount = results.filter((r) => r.status === "error").length;
|
|
33270
33275
|
const conflicts = detectConflicts(results);
|
|
33271
33276
|
if (conflicts.length > 0) {
|
|
33272
|
-
|
|
33277
|
+
logger55.warn("Worker output conflicts detected \u2014 human review recommended", {
|
|
33273
33278
|
conflictCount: conflicts.length,
|
|
33274
33279
|
files: conflicts.map((c) => c.filePath)
|
|
33275
33280
|
});
|
|
33276
33281
|
}
|
|
33277
33282
|
const durationMs = getTimeProvider().now() - startMs;
|
|
33278
|
-
|
|
33283
|
+
logger55.info("Worker dispatch complete", {
|
|
33279
33284
|
totalWorkers: results.length,
|
|
33280
33285
|
successCount,
|
|
33281
33286
|
errorCount,
|
|
@@ -34343,11 +34348,11 @@ function buildOutputFromOrchestratorResult(taskId, orchResult, durationMs, routi
|
|
|
34343
34348
|
}
|
|
34344
34349
|
};
|
|
34345
34350
|
}
|
|
34346
|
-
function createOrchestratorFromDeps(deps,
|
|
34351
|
+
function createOrchestratorFromDeps(deps, logger55, orchestratorType) {
|
|
34347
34352
|
if (deps.orchestrator !== void 0) return deps.orchestrator;
|
|
34348
|
-
const techLead = deps.techLead ?? createOrchestratorWithSica(
|
|
34353
|
+
const techLead = deps.techLead ?? createOrchestratorWithSica(logger55, deps.modelAdapter);
|
|
34349
34354
|
const factory = new OrchestratorFactory({
|
|
34350
|
-
logger:
|
|
34355
|
+
logger: logger55,
|
|
34351
34356
|
techLead
|
|
34352
34357
|
});
|
|
34353
34358
|
return factory.create(orchestratorType ?? "tech_lead");
|
|
@@ -34461,16 +34466,16 @@ function recordOrchestrationError(errorMessage, taskDescription, durationMs) {
|
|
|
34461
34466
|
}
|
|
34462
34467
|
}
|
|
34463
34468
|
function routeAndPrepare(input, deps, router) {
|
|
34464
|
-
const
|
|
34465
|
-
const workflowRouter = router ?? createWorkflowRouter({ logger:
|
|
34469
|
+
const logger55 = deps.logger ?? createLogger({ tool: "orchestrate" });
|
|
34470
|
+
const workflowRouter = router ?? createWorkflowRouter({ logger: logger55 });
|
|
34466
34471
|
const decision = workflowRouter.route({ description: input.task });
|
|
34467
34472
|
const orchType = mapPatternToOrchestratorType(decision.pattern);
|
|
34468
|
-
|
|
34473
|
+
logger55.info("Workflow pattern selected", {
|
|
34469
34474
|
pattern: decision.pattern,
|
|
34470
34475
|
orchestratorType: orchType
|
|
34471
34476
|
});
|
|
34472
|
-
const orchestrator = createOrchestratorFromDeps(deps,
|
|
34473
|
-
return { workflowRouter, decision, orchestrator, logger:
|
|
34477
|
+
const orchestrator = createOrchestratorFromDeps(deps, logger55, orchType);
|
|
34478
|
+
return { workflowRouter, decision, orchestrator, logger: logger55 };
|
|
34474
34479
|
}
|
|
34475
34480
|
function buildRoutingInfo(decision) {
|
|
34476
34481
|
return {
|
|
@@ -34489,10 +34494,10 @@ function recordRouterOutcome(workflowRouter, decision, success, durationMs) {
|
|
|
34489
34494
|
timestamp: getTimeProvider().now()
|
|
34490
34495
|
});
|
|
34491
34496
|
}
|
|
34492
|
-
function handleOrchestrationException(error, taskId, task,
|
|
34497
|
+
function handleOrchestrationException(error, taskId, task, logger55) {
|
|
34493
34498
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
34494
34499
|
const cause = error instanceof Error ? error : void 0;
|
|
34495
|
-
|
|
34500
|
+
logger55.error("Orchestration exception", cause, { taskId });
|
|
34496
34501
|
recordOrchestrationError(message, task);
|
|
34497
34502
|
return err(
|
|
34498
34503
|
new OrchestrationError(
|
|
@@ -34501,13 +34506,13 @@ function handleOrchestrationException(error, taskId, task, logger54) {
|
|
|
34501
34506
|
)
|
|
34502
34507
|
);
|
|
34503
34508
|
}
|
|
34504
|
-
function startHeartbeatTracking(label,
|
|
34509
|
+
function startHeartbeatTracking(label, logger55) {
|
|
34505
34510
|
const monitor = getHeartbeatMonitor();
|
|
34506
34511
|
const sessionId = monitor.startSession(label);
|
|
34507
34512
|
const timer = setInterval(() => {
|
|
34508
34513
|
monitor.heartbeat(sessionId);
|
|
34509
34514
|
if (monitor.isStalled(sessionId)) {
|
|
34510
|
-
|
|
34515
|
+
logger55.warn("Orchestration session stalled", { label, sessionId });
|
|
34511
34516
|
}
|
|
34512
34517
|
}, HEARTBEAT_TIMEOUTS.heartbeatIntervalMs);
|
|
34513
34518
|
return {
|
|
@@ -34579,7 +34584,7 @@ function handleOrchestratorSuccess(ctx) {
|
|
|
34579
34584
|
return ok(output2);
|
|
34580
34585
|
}
|
|
34581
34586
|
async function executeOrchestration(input, deps, router) {
|
|
34582
|
-
const { workflowRouter, decision, orchestrator, logger:
|
|
34587
|
+
const { workflowRouter, decision, orchestrator, logger: logger55 } = routeAndPrepare(input, deps, router);
|
|
34583
34588
|
const taskId = generateTaskId();
|
|
34584
34589
|
const startTime = getTimeProvider().now();
|
|
34585
34590
|
const fastResult = trySimpleTaskFastPath({
|
|
@@ -34588,15 +34593,15 @@ async function executeOrchestration(input, deps, router) {
|
|
|
34588
34593
|
decision,
|
|
34589
34594
|
workflowRouter,
|
|
34590
34595
|
startTime,
|
|
34591
|
-
logger:
|
|
34596
|
+
logger: logger55
|
|
34592
34597
|
});
|
|
34593
34598
|
if (fastResult !== void 0) return fastResult;
|
|
34594
|
-
|
|
34595
|
-
recordTaskStateInit(taskId, input.task,
|
|
34599
|
+
logger55.info("Starting orchestration", { taskId, taskLength: input.task.length });
|
|
34600
|
+
recordTaskStateInit(taskId, input.task, logger55);
|
|
34596
34601
|
const task = await createTaskFromInput(input, taskId);
|
|
34597
34602
|
const definition = { type: "task", task };
|
|
34598
|
-
const hb = startHeartbeatTracking(`orchestrate-${taskId}`,
|
|
34599
|
-
const policy = await deriveOrchestratePolicy(input.task, deps,
|
|
34603
|
+
const hb = startHeartbeatTracking(`orchestrate-${taskId}`, logger55);
|
|
34604
|
+
const policy = await deriveOrchestratePolicy(input.task, deps, logger55);
|
|
34600
34605
|
try {
|
|
34601
34606
|
return await runOrchestratorWithStateTracking({
|
|
34602
34607
|
taskId,
|
|
@@ -34607,23 +34612,23 @@ async function executeOrchestration(input, deps, router) {
|
|
|
34607
34612
|
decision,
|
|
34608
34613
|
workflowRouter,
|
|
34609
34614
|
startTime,
|
|
34610
|
-
logger:
|
|
34615
|
+
logger: logger55
|
|
34611
34616
|
});
|
|
34612
34617
|
} catch (error) {
|
|
34613
|
-
recordTaskStateBlocker(taskId, error instanceof Error ? error.message : String(error),
|
|
34614
|
-
recordTaskStateStage(taskId, "blocked",
|
|
34615
|
-
return handleOrchestrationException(error, taskId, input.task,
|
|
34618
|
+
recordTaskStateBlocker(taskId, error instanceof Error ? error.message : String(error), logger55);
|
|
34619
|
+
recordTaskStateStage(taskId, "blocked", logger55);
|
|
34620
|
+
return handleOrchestrationException(error, taskId, input.task, logger55);
|
|
34616
34621
|
} finally {
|
|
34617
34622
|
hb.cleanup();
|
|
34618
34623
|
}
|
|
34619
34624
|
}
|
|
34620
34625
|
async function runOrchestratorWithStateTracking(params) {
|
|
34621
|
-
const { taskId, taskInput, definition, orchestrator, policy, logger:
|
|
34622
|
-
recordTaskStateStage(taskId, "executing",
|
|
34626
|
+
const { taskId, taskInput, definition, orchestrator, policy, logger: logger55 } = params;
|
|
34627
|
+
recordTaskStateStage(taskId, "executing", logger55);
|
|
34623
34628
|
const result = await withAccessPolicy(policy, () => orchestrator.execute(definition, {}));
|
|
34624
34629
|
if (!result.ok) {
|
|
34625
|
-
recordTaskStateBlocker(taskId, result.error.message,
|
|
34626
|
-
recordTaskStateStage(taskId, "blocked",
|
|
34630
|
+
recordTaskStateBlocker(taskId, result.error.message, logger55);
|
|
34631
|
+
recordTaskStateStage(taskId, "blocked", logger55);
|
|
34627
34632
|
return handleOrchestratorFailure({
|
|
34628
34633
|
error: result.error,
|
|
34629
34634
|
taskId,
|
|
@@ -34631,10 +34636,10 @@ async function runOrchestratorWithStateTracking(params) {
|
|
|
34631
34636
|
decision: params.decision,
|
|
34632
34637
|
workflowRouter: params.workflowRouter,
|
|
34633
34638
|
startTime: params.startTime,
|
|
34634
|
-
logger:
|
|
34639
|
+
logger: logger55
|
|
34635
34640
|
});
|
|
34636
34641
|
}
|
|
34637
|
-
recordTaskStateStage(taskId, "complete",
|
|
34642
|
+
recordTaskStateStage(taskId, "complete", logger55);
|
|
34638
34643
|
return handleOrchestratorSuccess({
|
|
34639
34644
|
orchResult: result.value,
|
|
34640
34645
|
taskId,
|
|
@@ -34642,13 +34647,13 @@ async function runOrchestratorWithStateTracking(params) {
|
|
|
34642
34647
|
decision: params.decision,
|
|
34643
34648
|
workflowRouter: params.workflowRouter,
|
|
34644
34649
|
startTime: params.startTime,
|
|
34645
|
-
logger:
|
|
34650
|
+
logger: logger55
|
|
34646
34651
|
});
|
|
34647
34652
|
}
|
|
34648
34653
|
function isTaskStateEnabled() {
|
|
34649
34654
|
return process.env["NEXUS_TASK_STATE_ENABLED"] === "1";
|
|
34650
34655
|
}
|
|
34651
|
-
function recordTaskStateInit(taskId, taskText,
|
|
34656
|
+
function recordTaskStateInit(taskId, taskText, logger55) {
|
|
34652
34657
|
if (!isTaskStateEnabled()) return;
|
|
34653
34658
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
34654
34659
|
const initial = {
|
|
@@ -34661,36 +34666,36 @@ function recordTaskStateInit(taskId, taskText, logger54) {
|
|
|
34661
34666
|
};
|
|
34662
34667
|
const result = initTaskState(initial);
|
|
34663
34668
|
if (!result.ok) {
|
|
34664
|
-
|
|
34669
|
+
logger55.warn("task-state: init failed, continuing", {
|
|
34665
34670
|
taskId,
|
|
34666
34671
|
error: result.error.message,
|
|
34667
34672
|
taskLength: taskText.length
|
|
34668
34673
|
});
|
|
34669
34674
|
}
|
|
34670
34675
|
}
|
|
34671
|
-
function recordTaskStateStage(taskId, stage,
|
|
34676
|
+
function recordTaskStateStage(taskId, stage, logger55) {
|
|
34672
34677
|
if (!isTaskStateEnabled()) return;
|
|
34673
34678
|
const result = updateStage(taskId, stage, (/* @__PURE__ */ new Date()).toISOString());
|
|
34674
34679
|
if (!result.ok) {
|
|
34675
|
-
|
|
34680
|
+
logger55.warn("task-state: stage update failed", {
|
|
34676
34681
|
taskId,
|
|
34677
34682
|
stage,
|
|
34678
34683
|
error: result.error.message
|
|
34679
34684
|
});
|
|
34680
34685
|
}
|
|
34681
34686
|
}
|
|
34682
|
-
function recordTaskStateBlocker(taskId, blocker,
|
|
34687
|
+
function recordTaskStateBlocker(taskId, blocker, logger55) {
|
|
34683
34688
|
if (!isTaskStateEnabled()) return;
|
|
34684
34689
|
const ts = (/* @__PURE__ */ new Date()).toISOString();
|
|
34685
34690
|
const result = appendBlocker(taskId, { ts, blocker });
|
|
34686
34691
|
if (!result.ok) {
|
|
34687
|
-
|
|
34692
|
+
logger55.warn("task-state: blocker record failed", {
|
|
34688
34693
|
taskId,
|
|
34689
34694
|
error: result.error.message
|
|
34690
34695
|
});
|
|
34691
34696
|
}
|
|
34692
34697
|
}
|
|
34693
|
-
async function deriveOrchestratePolicy(taskText, deps,
|
|
34698
|
+
async function deriveOrchestratePolicy(taskText, deps, logger55) {
|
|
34694
34699
|
const mode = resolveAccessPolicyMode();
|
|
34695
34700
|
try {
|
|
34696
34701
|
const opts = {
|
|
@@ -34700,7 +34705,7 @@ async function deriveOrchestratePolicy(taskText, deps, logger54) {
|
|
|
34700
34705
|
};
|
|
34701
34706
|
const policy = await deriveAccessPolicy(taskText, opts);
|
|
34702
34707
|
if (mode !== "off") {
|
|
34703
|
-
|
|
34708
|
+
logger55.info("access-policy: derived", {
|
|
34704
34709
|
mode,
|
|
34705
34710
|
source: policy.source,
|
|
34706
34711
|
allowedToolsWildcard: policy.allowedTools === "*"
|
|
@@ -34708,7 +34713,7 @@ async function deriveOrchestratePolicy(taskText, deps, logger54) {
|
|
|
34708
34713
|
}
|
|
34709
34714
|
return policy;
|
|
34710
34715
|
} catch (error) {
|
|
34711
|
-
|
|
34716
|
+
logger55.warn("access-policy: derivation failed, falling back to off", {
|
|
34712
34717
|
error: getErrorMessage(error)
|
|
34713
34718
|
});
|
|
34714
34719
|
return {
|
|
@@ -34722,15 +34727,15 @@ async function deriveOrchestratePolicy(taskText, deps, logger54) {
|
|
|
34722
34727
|
};
|
|
34723
34728
|
}
|
|
34724
34729
|
}
|
|
34725
|
-
function instrumentV2Orchestrate(input,
|
|
34730
|
+
function instrumentV2Orchestrate(input, logger55) {
|
|
34726
34731
|
const tc = orchestrateInputToTaskContract(input);
|
|
34727
34732
|
void executeOrchestratePipeline(tc).then((m) => {
|
|
34728
|
-
|
|
34733
|
+
logger55.info("V2 orchestrate pipeline", { ...m });
|
|
34729
34734
|
}).catch((error) => {
|
|
34730
|
-
|
|
34735
|
+
logger55.debug("V2 orchestrate pipeline failed", { error: getErrorMessage(error) });
|
|
34731
34736
|
});
|
|
34732
34737
|
}
|
|
34733
|
-
async function tryWorkerDispatch(agentPlan, task, deps,
|
|
34738
|
+
async function tryWorkerDispatch(agentPlan, task, deps, logger55, notifier) {
|
|
34734
34739
|
const adapter = deps.modelAdapter;
|
|
34735
34740
|
if (agentPlan === void 0 || !isWorkerDispatchEnabled() || adapter === void 0) {
|
|
34736
34741
|
return void 0;
|
|
@@ -34743,14 +34748,14 @@ async function tryWorkerDispatch(agentPlan, task, deps, logger54, notifier) {
|
|
|
34743
34748
|
agentPlan,
|
|
34744
34749
|
taskDescription: task,
|
|
34745
34750
|
modelAdapter: adapter,
|
|
34746
|
-
logger:
|
|
34751
|
+
logger: logger55,
|
|
34747
34752
|
synthesize: true,
|
|
34748
34753
|
refine: true,
|
|
34749
34754
|
perWorkerRouting: true
|
|
34750
34755
|
})
|
|
34751
34756
|
);
|
|
34752
34757
|
} catch (dispatchError) {
|
|
34753
|
-
|
|
34758
|
+
logger55.warn("Worker dispatch failed, continuing with standard orchestration", {
|
|
34754
34759
|
error: dispatchError instanceof Error ? dispatchError.message : String(dispatchError)
|
|
34755
34760
|
});
|
|
34756
34761
|
return void 0;
|
|
@@ -34823,7 +34828,7 @@ function createOrchestrateHandler(deps) {
|
|
|
34823
34828
|
};
|
|
34824
34829
|
}
|
|
34825
34830
|
function registerOrchestrateTool(server, deps) {
|
|
34826
|
-
const
|
|
34831
|
+
const logger55 = deps.logger ?? createLogger({ tool: "orchestrate" });
|
|
34827
34832
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
34828
34833
|
const depsWithNotifier = { ...deps, notifier };
|
|
34829
34834
|
const description = "Orchestrate a task by analyzing it, breaking it into subtasks if needed, and coordinating expert agents";
|
|
@@ -34831,18 +34836,18 @@ function registerOrchestrateTool(server, deps) {
|
|
|
34831
34836
|
toolName: "orchestrate",
|
|
34832
34837
|
securityTier: "user-facing",
|
|
34833
34838
|
rateLimiter: deps.rateLimiter,
|
|
34834
|
-
logger:
|
|
34839
|
+
logger: logger55
|
|
34835
34840
|
});
|
|
34836
34841
|
const wrappedHandler = wrapToolWithTimeout("orchestrate", secureHandler, {
|
|
34837
34842
|
timeoutMs: MCP_TIMEOUTS.perTool["orchestrate"] ?? MCP_TIMEOUTS.defaultMs,
|
|
34838
|
-
logger:
|
|
34843
|
+
logger: logger55
|
|
34839
34844
|
});
|
|
34840
34845
|
server.registerTool(
|
|
34841
34846
|
"orchestrate",
|
|
34842
34847
|
{ description, inputSchema: ORCHESTRATE_TOOL_SCHEMA },
|
|
34843
34848
|
toSdkCallback(wrappedHandler)
|
|
34844
34849
|
);
|
|
34845
|
-
|
|
34850
|
+
logger55.info("Registered orchestrate tool with secure handler and timeout protection");
|
|
34846
34851
|
}
|
|
34847
34852
|
|
|
34848
34853
|
// src/mcp/tools/delegate-to-model-types.ts
|
|
@@ -35185,21 +35190,21 @@ function mapCompositeDecisionToOutput(decision, estimatedTokens) {
|
|
|
35185
35190
|
}))
|
|
35186
35191
|
};
|
|
35187
35192
|
}
|
|
35188
|
-
async function routeViaCompositeRouter(task, router, feedbackIntegration,
|
|
35193
|
+
async function routeViaCompositeRouter(task, router, feedbackIntegration, logger55) {
|
|
35189
35194
|
const result = await router.route({ content: task });
|
|
35190
35195
|
if (!result.ok) {
|
|
35191
|
-
|
|
35196
|
+
logger55.warn("CompositeRouter routing failed", { error: result.error.message });
|
|
35192
35197
|
return null;
|
|
35193
35198
|
}
|
|
35194
35199
|
const decision = result.value;
|
|
35195
35200
|
let routingId;
|
|
35196
35201
|
if (feedbackIntegration) {
|
|
35197
35202
|
routingId = feedbackIntegration.recordRoutingDecision(decision);
|
|
35198
|
-
|
|
35203
|
+
logger55.debug("Recorded routing decision", { routingId, cliName: decision.cliName });
|
|
35199
35204
|
}
|
|
35200
35205
|
return { decision, routingId, feedbackIntegration };
|
|
35201
35206
|
}
|
|
35202
|
-
function recordRoutingOutcome(result, durationMs,
|
|
35207
|
+
function recordRoutingOutcome(result, durationMs, logger55) {
|
|
35203
35208
|
if (result.routingId === void 0 || result.feedbackIntegration === void 0) return;
|
|
35204
35209
|
try {
|
|
35205
35210
|
const topsisScore = result.decision.topsisScore ?? 0;
|
|
@@ -35212,13 +35217,13 @@ function recordRoutingOutcome(result, durationMs, logger54) {
|
|
|
35212
35217
|
tokenUsage: 0
|
|
35213
35218
|
// delegate-to-model is a recommendation, not execution
|
|
35214
35219
|
});
|
|
35215
|
-
|
|
35220
|
+
logger55.debug("Recorded routing outcome", {
|
|
35216
35221
|
routingId: result.routingId,
|
|
35217
35222
|
topsisScore,
|
|
35218
35223
|
success: topsisScore >= TOPSIS_CONFIDENCE_THRESHOLD
|
|
35219
35224
|
});
|
|
35220
35225
|
} catch (error) {
|
|
35221
|
-
|
|
35226
|
+
logger55.warn("Failed to record routing outcome", { error: getErrorMessage(error) });
|
|
35222
35227
|
}
|
|
35223
35228
|
}
|
|
35224
35229
|
|
|
@@ -35239,9 +35244,9 @@ function classifyWithGovernance(toolName, params, overrides) {
|
|
|
35239
35244
|
const promotionReason = promoted ? buildPromotionReason(domain, params) : null;
|
|
35240
35245
|
return { tier, promoted, domain, votingThreshold, promotionReason };
|
|
35241
35246
|
}
|
|
35242
|
-
function auditGovernancePromotion(classification, toolName,
|
|
35247
|
+
function auditGovernancePromotion(classification, toolName, logger55) {
|
|
35243
35248
|
if (!classification.promoted) return;
|
|
35244
|
-
const log3 =
|
|
35249
|
+
const log3 = logger55 ?? createLogger({ component: "governance" });
|
|
35245
35250
|
log3.warn("Governance promotion", {
|
|
35246
35251
|
tool: toolName,
|
|
35247
35252
|
domain: classification.domain,
|
|
@@ -35340,9 +35345,9 @@ function recordToOutcomeStore2(task, model, startMs, governance) {
|
|
|
35340
35345
|
});
|
|
35341
35346
|
}
|
|
35342
35347
|
}
|
|
35343
|
-
function classifyDelegateGovernance(input,
|
|
35348
|
+
function classifyDelegateGovernance(input, logger55) {
|
|
35344
35349
|
const classification = classifyWithGovernance("delegate_to_model", { task: input.task });
|
|
35345
|
-
auditGovernancePromotion(classification, "delegate_to_model",
|
|
35350
|
+
auditGovernancePromotion(classification, "delegate_to_model", logger55);
|
|
35346
35351
|
return classification;
|
|
35347
35352
|
}
|
|
35348
35353
|
function enrichWithGovernance(output2, governance) {
|
|
@@ -35356,10 +35361,10 @@ function enrichWithGovernance(output2, governance) {
|
|
|
35356
35361
|
}
|
|
35357
35362
|
};
|
|
35358
35363
|
}
|
|
35359
|
-
function instrumentV2Pipeline(input,
|
|
35364
|
+
function instrumentV2Pipeline(input, logger55) {
|
|
35360
35365
|
const tc = delegateInputToTaskContract(input);
|
|
35361
35366
|
void executeDelegatePipeline(tc).then((m) => {
|
|
35362
|
-
|
|
35367
|
+
logger55.info("V2 delegate pipeline", { ...m });
|
|
35363
35368
|
});
|
|
35364
35369
|
}
|
|
35365
35370
|
function notifyAndRecord(opts) {
|
|
@@ -35433,18 +35438,18 @@ function createDelegateHandler(deps) {
|
|
|
35433
35438
|
};
|
|
35434
35439
|
}
|
|
35435
35440
|
function registerDelegateToModelTool(server, deps) {
|
|
35436
|
-
const
|
|
35441
|
+
const logger55 = deps.logger ?? createLogger({ tool: "delegate_to_model" });
|
|
35437
35442
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
35438
35443
|
const depsWithNotifier = { ...deps, notifier };
|
|
35439
35444
|
const secureHandler = createSecureHandler(createDelegateHandler(depsWithNotifier), {
|
|
35440
35445
|
toolName: "delegate_to_model",
|
|
35441
35446
|
rateLimiter: deps.rateLimiter,
|
|
35442
|
-
logger:
|
|
35447
|
+
logger: logger55
|
|
35443
35448
|
});
|
|
35444
35449
|
const timeoutMs = getToolTimeout("delegate_to_model", deps.security);
|
|
35445
35450
|
const wrappedHandler = wrapToolWithTimeout("delegate_to_model", secureHandler, {
|
|
35446
35451
|
timeoutMs,
|
|
35447
|
-
logger:
|
|
35452
|
+
logger: logger55
|
|
35448
35453
|
});
|
|
35449
35454
|
server.registerTool(
|
|
35450
35455
|
"delegate_to_model",
|
|
@@ -35455,7 +35460,7 @@ function registerDelegateToModelTool(server, deps) {
|
|
|
35455
35460
|
},
|
|
35456
35461
|
toSdkCallback(wrappedHandler)
|
|
35457
35462
|
);
|
|
35458
|
-
|
|
35463
|
+
logger55.info("Registered delegate_to_model tool with secure handler and timeout protection");
|
|
35459
35464
|
}
|
|
35460
35465
|
|
|
35461
35466
|
// src/mcp/tools/run-graph-workflow-multicli-templates.ts
|
|
@@ -36394,7 +36399,7 @@ function listExpertsHandler(args, ctx) {
|
|
|
36394
36399
|
return Promise.resolve(toolSuccessStructured(data));
|
|
36395
36400
|
}
|
|
36396
36401
|
function registerListExpertsTool(server, deps) {
|
|
36397
|
-
const
|
|
36402
|
+
const logger55 = deps.logger ?? createLogger({ tool: "list_experts" });
|
|
36398
36403
|
const toolSchema = {
|
|
36399
36404
|
format: z68.enum(["full", "names"]).optional().describe("Output format: full (with details) or names (just role names)")
|
|
36400
36405
|
};
|
|
@@ -36402,10 +36407,10 @@ function registerListExpertsTool(server, deps) {
|
|
|
36402
36407
|
const secureHandler = createSecureHandler(listExpertsHandler, {
|
|
36403
36408
|
toolName: "list_experts",
|
|
36404
36409
|
rateLimiter: deps.rateLimiter,
|
|
36405
|
-
logger:
|
|
36410
|
+
logger: logger55
|
|
36406
36411
|
});
|
|
36407
36412
|
const timeoutMs = getToolTimeout("list_experts", deps.security);
|
|
36408
|
-
const wrappedHandler = wrapToolWithTimeout("list_experts", secureHandler, { timeoutMs, logger:
|
|
36413
|
+
const wrappedHandler = wrapToolWithTimeout("list_experts", secureHandler, { timeoutMs, logger: logger55 });
|
|
36409
36414
|
const outputSchema = {
|
|
36410
36415
|
experts: z68.array(
|
|
36411
36416
|
z68.object({
|
|
@@ -36422,7 +36427,7 @@ function registerListExpertsTool(server, deps) {
|
|
|
36422
36427
|
{ description, inputSchema: toolSchema, outputSchema },
|
|
36423
36428
|
toSdkCallback(wrappedHandler)
|
|
36424
36429
|
);
|
|
36425
|
-
|
|
36430
|
+
logger55.info("Registered list_experts tool with secure handler and timeout protection");
|
|
36426
36431
|
}
|
|
36427
36432
|
|
|
36428
36433
|
// src/mcp/tools/list-workflows.ts
|
|
@@ -36478,7 +36483,7 @@ function createListWorkflowsHandler(workflowEngine) {
|
|
|
36478
36483
|
};
|
|
36479
36484
|
}
|
|
36480
36485
|
function registerListWorkflowsTool(server, deps) {
|
|
36481
|
-
const
|
|
36486
|
+
const logger55 = deps.logger ?? createLogger({ tool: "list_workflows" });
|
|
36482
36487
|
const toolSchema = {
|
|
36483
36488
|
category: z69.string().optional().describe("Filter by category (e.g., development, security)"),
|
|
36484
36489
|
format: z69.enum(["full", "names"]).optional().describe("Output format: full (with details) or names (just template names)")
|
|
@@ -36487,13 +36492,13 @@ function registerListWorkflowsTool(server, deps) {
|
|
|
36487
36492
|
const secureHandler = createSecureHandler(createListWorkflowsHandler(deps.workflowEngine), {
|
|
36488
36493
|
toolName: "list_workflows",
|
|
36489
36494
|
rateLimiter: deps.rateLimiter,
|
|
36490
|
-
logger:
|
|
36495
|
+
logger: logger55
|
|
36491
36496
|
});
|
|
36492
36497
|
const timeoutMs = deps.security?.timeout?.defaultTimeoutMs;
|
|
36493
36498
|
const wrappedHandler = wrapToolWithTimeout(
|
|
36494
36499
|
"list_workflows",
|
|
36495
36500
|
secureHandler,
|
|
36496
|
-
timeoutMs !== void 0 ? { timeoutMs, logger:
|
|
36501
|
+
timeoutMs !== void 0 ? { timeoutMs, logger: logger55 } : { logger: logger55 }
|
|
36497
36502
|
);
|
|
36498
36503
|
const outputSchema = {
|
|
36499
36504
|
workflows: z69.array(
|
|
@@ -36512,7 +36517,7 @@ function registerListWorkflowsTool(server, deps) {
|
|
|
36512
36517
|
{ description, inputSchema: toolSchema, outputSchema },
|
|
36513
36518
|
toSdkCallback(wrappedHandler)
|
|
36514
36519
|
);
|
|
36515
|
-
|
|
36520
|
+
logger55.info("Registered list_workflows tool with secure handler and timeout protection");
|
|
36516
36521
|
}
|
|
36517
36522
|
|
|
36518
36523
|
// src/mcp/tools/execute-expert.ts
|
|
@@ -36596,12 +36601,12 @@ function recordExpertError2(expertId, role, errorMessage) {
|
|
|
36596
36601
|
});
|
|
36597
36602
|
}
|
|
36598
36603
|
}
|
|
36599
|
-
function autoCatalogScan(output2, expertId,
|
|
36604
|
+
function autoCatalogScan(output2, expertId, logger55) {
|
|
36600
36605
|
try {
|
|
36601
36606
|
const catalog = getAutoCatalog();
|
|
36602
36607
|
catalog.scanAndRecord(output2, "execute_expert");
|
|
36603
36608
|
} catch (error) {
|
|
36604
|
-
|
|
36609
|
+
logger55?.debug("Best-effort auto-catalog scan failed", {
|
|
36605
36610
|
error: getErrorMessage(error),
|
|
36606
36611
|
expertId
|
|
36607
36612
|
});
|
|
@@ -36659,11 +36664,11 @@ function computeExpertContextUtilization(observation, threshold = DEFAULT_CONTEX
|
|
|
36659
36664
|
threshold
|
|
36660
36665
|
};
|
|
36661
36666
|
}
|
|
36662
|
-
function observeExpertContext(observation,
|
|
36667
|
+
function observeExpertContext(observation, logger55, threshold = resolveContextWarnThreshold()) {
|
|
36663
36668
|
try {
|
|
36664
36669
|
const util = computeExpertContextUtilization(observation, threshold);
|
|
36665
36670
|
if (util.warned) {
|
|
36666
|
-
|
|
36671
|
+
logger55?.warn("context_warning", {
|
|
36667
36672
|
event: "context_warning",
|
|
36668
36673
|
expertId: observation.expertId,
|
|
36669
36674
|
role: observation.role,
|
|
@@ -36676,7 +36681,7 @@ function observeExpertContext(observation, logger54, threshold = resolveContextW
|
|
|
36676
36681
|
taskLength: observation.taskDescription.length
|
|
36677
36682
|
});
|
|
36678
36683
|
} else {
|
|
36679
|
-
|
|
36684
|
+
logger55?.debug("context_utilization", {
|
|
36680
36685
|
event: "context_utilization",
|
|
36681
36686
|
expertId: observation.expertId,
|
|
36682
36687
|
role: observation.role,
|
|
@@ -36764,7 +36769,7 @@ function buildSuccessResponse(params) {
|
|
|
36764
36769
|
}
|
|
36765
36770
|
return response;
|
|
36766
36771
|
}
|
|
36767
|
-
function observeExpertContextIfOk(result, expert, task, durationMs,
|
|
36772
|
+
function observeExpertContextIfOk(result, expert, task, durationMs, logger55) {
|
|
36768
36773
|
if (!result.ok) return;
|
|
36769
36774
|
const expertModelId = expert.expertConfig.modelPreference?.modelId;
|
|
36770
36775
|
const observation = {
|
|
@@ -36775,9 +36780,9 @@ function observeExpertContextIfOk(result, expert, task, durationMs, logger54) {
|
|
|
36775
36780
|
taskDescription: task.description,
|
|
36776
36781
|
durationMs
|
|
36777
36782
|
};
|
|
36778
|
-
observeExpertContext(observation,
|
|
36783
|
+
observeExpertContext(observation, logger55);
|
|
36779
36784
|
}
|
|
36780
|
-
async function deriveExpertAccessPolicy(task,
|
|
36785
|
+
async function deriveExpertAccessPolicy(task, logger55) {
|
|
36781
36786
|
const mode = resolveAccessPolicyMode();
|
|
36782
36787
|
try {
|
|
36783
36788
|
const policy = await deriveAccessPolicy(task.description, {
|
|
@@ -36785,14 +36790,14 @@ async function deriveExpertAccessPolicy(task, logger54) {
|
|
|
36785
36790
|
trustTier: "1"
|
|
36786
36791
|
});
|
|
36787
36792
|
if (mode !== "off") {
|
|
36788
|
-
|
|
36793
|
+
logger55?.info("access-policy: derived (expert)", {
|
|
36789
36794
|
mode,
|
|
36790
36795
|
source: policy.source
|
|
36791
36796
|
});
|
|
36792
36797
|
}
|
|
36793
36798
|
return policy;
|
|
36794
36799
|
} catch (error) {
|
|
36795
|
-
|
|
36800
|
+
logger55?.warn("access-policy: derivation failed, falling back to off (expert)", {
|
|
36796
36801
|
error: getErrorMessage(error)
|
|
36797
36802
|
});
|
|
36798
36803
|
return {
|
|
@@ -36838,11 +36843,11 @@ function isExpertDegraded(role) {
|
|
|
36838
36843
|
}
|
|
36839
36844
|
return consecutive >= DEGRADATION_CONSECUTIVE_THRESHOLD;
|
|
36840
36845
|
}
|
|
36841
|
-
async function tryExpertFallback(expert, task,
|
|
36846
|
+
async function tryExpertFallback(expert, task, logger55) {
|
|
36842
36847
|
const roleKey = `${expert.role}_expert`;
|
|
36843
36848
|
const category = ROLE_TO_TASK_CATEGORY[roleKey];
|
|
36844
36849
|
if (category === void 0) return void 0;
|
|
36845
|
-
const effectiveLogger =
|
|
36850
|
+
const effectiveLogger = logger55 ?? createLogger({ tool: "execute_expert" });
|
|
36846
36851
|
const registry = getGlobalRegistry({ logger: effectiveLogger });
|
|
36847
36852
|
const routing = registry.getRouting(category);
|
|
36848
36853
|
const primaryCli = routing?.primaryCli ?? "unknown";
|
|
@@ -36851,7 +36856,7 @@ async function tryExpertFallback(expert, task, logger54) {
|
|
|
36851
36856
|
const fallbackCli = chain[0];
|
|
36852
36857
|
if (fallbackCli === void 0) return void 0;
|
|
36853
36858
|
const fallbackAdapter = registry.getAdapterForCli(fallbackCli);
|
|
36854
|
-
|
|
36859
|
+
logger55?.info("Retrying expert with fallback CLI", { role: expert.role, fallbackCli });
|
|
36855
36860
|
const fallbackResult = createExpert(expert.expertConfig, { adapter: fallbackAdapter });
|
|
36856
36861
|
if (!fallbackResult.ok) return void 0;
|
|
36857
36862
|
const result = await fallbackResult.value.execute(task);
|
|
@@ -36869,7 +36874,7 @@ async function tryExpertFallback(expert, task, logger54) {
|
|
|
36869
36874
|
};
|
|
36870
36875
|
}
|
|
36871
36876
|
async function classifyExpertResult(opts) {
|
|
36872
|
-
const { result, expert, task, args, durationMs, logger:
|
|
36877
|
+
const { result, expert, task, args, durationMs, logger: logger55 } = opts;
|
|
36873
36878
|
const modelId = expert.expertConfig.modelPreference?.modelId;
|
|
36874
36879
|
const info = {
|
|
36875
36880
|
expertId: args.expertId,
|
|
@@ -36878,19 +36883,19 @@ async function classifyExpertResult(opts) {
|
|
|
36878
36883
|
};
|
|
36879
36884
|
if (!result.ok) {
|
|
36880
36885
|
if (isRateLimitFailure(result.error.message)) {
|
|
36881
|
-
const fallback = await tryExpertFallback(expert, task,
|
|
36886
|
+
const fallback = await tryExpertFallback(expert, task, logger55);
|
|
36882
36887
|
if (fallback !== void 0) return fallback;
|
|
36883
36888
|
}
|
|
36884
|
-
|
|
36889
|
+
logger55?.warn("Expert execution failed", {
|
|
36885
36890
|
expertId: args.expertId,
|
|
36886
36891
|
error: result.error.message
|
|
36887
36892
|
});
|
|
36888
36893
|
return handleExpertFailure(args.task, info, result.error.message, durationMs);
|
|
36889
36894
|
}
|
|
36890
|
-
|
|
36895
|
+
logger55?.info("Expert execution completed", { expertId: args.expertId, durationMs });
|
|
36891
36896
|
handleExpertSuccess(args.task, info, durationMs);
|
|
36892
36897
|
if (typeof result.value.output === "string") {
|
|
36893
|
-
autoCatalogScan(result.value.output, args.expertId,
|
|
36898
|
+
autoCatalogScan(result.value.output, args.expertId, logger55);
|
|
36894
36899
|
}
|
|
36895
36900
|
return {
|
|
36896
36901
|
ok: true,
|
|
@@ -36978,7 +36983,7 @@ var EXECUTE_EXPERT_TOOL_SCHEMA = {
|
|
|
36978
36983
|
context: z70.record(z70.string(), z70.unknown()).optional().describe("Additional context metadata for the task"),
|
|
36979
36984
|
timeoutMs: z70.number().int().min(EXPERT_TIMEOUT_FLOOR_MS).max(9e5).optional().describe("Optional timeout in ms (120s-900s). Overrides auto-detected timeout.")
|
|
36980
36985
|
};
|
|
36981
|
-
function createTaskHandler(deps,
|
|
36986
|
+
function createTaskHandler(deps, logger55) {
|
|
36982
36987
|
const notifier = deps.notifier ?? NOOP_NOTIFIER;
|
|
36983
36988
|
return {
|
|
36984
36989
|
createTask: (args, extra) => {
|
|
@@ -36990,7 +36995,7 @@ function createTaskHandler(deps, logger54) {
|
|
|
36990
36995
|
const { taskStore } = extra;
|
|
36991
36996
|
const ttl = clampTaskTtl(DEFAULT_TASK_TTL_MS);
|
|
36992
36997
|
const taskPromise = taskStore.createTask({ ttl, pollInterval: 5e3 }).then((task) => {
|
|
36993
|
-
|
|
36998
|
+
logger55.info("Task created for execute_expert", {
|
|
36994
36999
|
taskId: task.taskId,
|
|
36995
37000
|
expertId: validatedArgs.expertId
|
|
36996
37001
|
});
|
|
@@ -37015,7 +37020,7 @@ function createTaskHandler(deps, logger54) {
|
|
|
37015
37020
|
}
|
|
37016
37021
|
async function runBackgroundExpertTask(opts) {
|
|
37017
37022
|
const { deps, args, taskId, taskStore, notifier } = opts;
|
|
37018
|
-
const
|
|
37023
|
+
const logger55 = deps.logger ?? createLogger({ tool: "execute_expert" });
|
|
37019
37024
|
try {
|
|
37020
37025
|
notifier.info("execute_expert", {
|
|
37021
37026
|
event: "expert_start",
|
|
@@ -37045,13 +37050,13 @@ async function runBackgroundExpertTask(opts) {
|
|
|
37045
37050
|
});
|
|
37046
37051
|
} catch (error) {
|
|
37047
37052
|
const message = getErrorMessage(error);
|
|
37048
|
-
|
|
37053
|
+
logger55.warn("Background expert task failed", { taskId, error: message });
|
|
37049
37054
|
try {
|
|
37050
37055
|
await taskStore.storeTaskResult(taskId, "failed", {
|
|
37051
37056
|
...toolError(`Expert execution error: ${message}`)
|
|
37052
37057
|
});
|
|
37053
37058
|
} catch (storeError) {
|
|
37054
|
-
|
|
37059
|
+
logger55.warn("Failed to store task failure result", {
|
|
37055
37060
|
taskId,
|
|
37056
37061
|
error: getErrorMessage(storeError)
|
|
37057
37062
|
});
|
|
@@ -37059,7 +37064,7 @@ async function runBackgroundExpertTask(opts) {
|
|
|
37059
37064
|
}
|
|
37060
37065
|
}
|
|
37061
37066
|
function registerExecuteExpertTool(server, deps) {
|
|
37062
|
-
const
|
|
37067
|
+
const logger55 = deps.logger ?? createLogger({ tool: "execute_expert" });
|
|
37063
37068
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
37064
37069
|
const depsWithNotifier = { ...deps, notifier };
|
|
37065
37070
|
const description = "Execute a task using a previously created expert agent. Returns the expert analysis including output, confidence, and token usage.";
|
|
@@ -37070,9 +37075,9 @@ function registerExecuteExpertTool(server, deps) {
|
|
|
37070
37075
|
inputSchema: EXECUTE_EXPERT_TOOL_SCHEMA,
|
|
37071
37076
|
execution: { taskSupport: "optional" }
|
|
37072
37077
|
},
|
|
37073
|
-
createTaskHandler(depsWithNotifier,
|
|
37078
|
+
createTaskHandler(depsWithNotifier, logger55)
|
|
37074
37079
|
);
|
|
37075
|
-
|
|
37080
|
+
logger55.info("Registered execute_expert tool with MCP Tasks support (taskSupport: optional)");
|
|
37076
37081
|
}
|
|
37077
37082
|
|
|
37078
37083
|
// src/mcp/tools/research-query.ts
|
|
@@ -38416,15 +38421,15 @@ function createResearchQueryHandler(deps) {
|
|
|
38416
38421
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
38417
38422
|
}
|
|
38418
38423
|
ctx.logger.debug("Executing research query", { action: validationResult.data.action });
|
|
38419
|
-
const
|
|
38420
|
-
return withToolError("Research query failed",
|
|
38424
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_query" });
|
|
38425
|
+
return withToolError("Research query failed", logger55, async () => {
|
|
38421
38426
|
const result = await executeQuery(validationResult.data);
|
|
38422
38427
|
return toolSuccess(JSON.stringify(result, null, 2));
|
|
38423
38428
|
});
|
|
38424
38429
|
};
|
|
38425
38430
|
}
|
|
38426
38431
|
function registerResearchQueryTool(server, deps) {
|
|
38427
|
-
const
|
|
38432
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_query" });
|
|
38428
38433
|
const toolSchema = {
|
|
38429
38434
|
action: z73.enum(["status", "overlap", "stats", "search"]).describe("Query action: status, overlap, stats, or search"),
|
|
38430
38435
|
techniqueId: z73.string().optional().describe("Technique ID for status/overlap queries"),
|
|
@@ -38436,19 +38441,19 @@ function registerResearchQueryTool(server, deps) {
|
|
|
38436
38441
|
const secureHandler = createSecureHandler(createResearchQueryHandler(deps), {
|
|
38437
38442
|
toolName: "research_query",
|
|
38438
38443
|
rateLimiter: deps.rateLimiter,
|
|
38439
|
-
logger:
|
|
38444
|
+
logger: logger55
|
|
38440
38445
|
});
|
|
38441
38446
|
const timeoutMs = getToolTimeout("research_query", deps.security);
|
|
38442
38447
|
const wrappedHandler = wrapToolWithTimeout("research_query", secureHandler, {
|
|
38443
38448
|
timeoutMs,
|
|
38444
|
-
logger:
|
|
38449
|
+
logger: logger55
|
|
38445
38450
|
});
|
|
38446
38451
|
server.registerTool(
|
|
38447
38452
|
"research_query",
|
|
38448
38453
|
{ description, inputSchema: toolSchema },
|
|
38449
38454
|
toSdkCallback(wrappedHandler)
|
|
38450
38455
|
);
|
|
38451
|
-
|
|
38456
|
+
logger55.info("Registered research_query tool with secure handler and timeout protection");
|
|
38452
38457
|
}
|
|
38453
38458
|
|
|
38454
38459
|
// src/mcp/tools/research-add.ts
|
|
@@ -38459,7 +38464,7 @@ var ResearchAddInputSchema = z74.object({
|
|
|
38459
38464
|
priority: z74.enum(["P1", "P2", "P3", "P4"]).optional().describe("Priority level for the paper"),
|
|
38460
38465
|
dryRun: z74.boolean().optional().default(false).describe("Preview what would be added without persisting")
|
|
38461
38466
|
});
|
|
38462
|
-
async function executeResearchAdd(input,
|
|
38467
|
+
async function executeResearchAdd(input, logger55) {
|
|
38463
38468
|
const exists = await paperExists(input.arxivId);
|
|
38464
38469
|
if (exists) {
|
|
38465
38470
|
return {
|
|
@@ -38478,7 +38483,7 @@ async function executeResearchAdd(input, logger54) {
|
|
|
38478
38483
|
});
|
|
38479
38484
|
if (result.success && !input.dryRun) {
|
|
38480
38485
|
try {
|
|
38481
|
-
const memory = getToolMemory(
|
|
38486
|
+
const memory = getToolMemory(logger55);
|
|
38482
38487
|
memory.recordLearning({
|
|
38483
38488
|
pattern: `Added paper: ${result.title} (${result.paperId})`,
|
|
38484
38489
|
context: `topic=${input.topic ?? "general"}, priority=${input.priority ?? "unset"}`,
|
|
@@ -38486,7 +38491,7 @@ async function executeResearchAdd(input, logger54) {
|
|
|
38486
38491
|
source: "research_add"
|
|
38487
38492
|
});
|
|
38488
38493
|
} catch {
|
|
38489
|
-
|
|
38494
|
+
logger55.debug("Failed to record learning in session memory");
|
|
38490
38495
|
}
|
|
38491
38496
|
}
|
|
38492
38497
|
const qualityNote = result.success && !input.dryRun ? " [evidence_tier=low \u2014 arXiv preprint, no citation data yet. Run backfill-research-quality.ts to enrich.]" : "";
|
|
@@ -38505,9 +38510,9 @@ function createResearchAddHandler(deps) {
|
|
|
38505
38510
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
38506
38511
|
}
|
|
38507
38512
|
ctx.logger.debug("Adding research paper", { arxivId: validationResult.data.arxivId });
|
|
38508
|
-
const
|
|
38509
|
-
return withToolError("Failed to add paper",
|
|
38510
|
-
const result = await executeResearchAdd(validationResult.data,
|
|
38513
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add" });
|
|
38514
|
+
return withToolError("Failed to add paper", logger55, async () => {
|
|
38515
|
+
const result = await executeResearchAdd(validationResult.data, logger55);
|
|
38511
38516
|
if (!result.success) {
|
|
38512
38517
|
return toolError(result.message);
|
|
38513
38518
|
}
|
|
@@ -38516,7 +38521,7 @@ function createResearchAddHandler(deps) {
|
|
|
38516
38521
|
};
|
|
38517
38522
|
}
|
|
38518
38523
|
function registerResearchAddTool(server, deps) {
|
|
38519
|
-
const
|
|
38524
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add" });
|
|
38520
38525
|
const toolSchema = {
|
|
38521
38526
|
arxivId: z74.string().regex(/^\d{4}\.\d{4,5}$/).describe('arXiv paper ID (e.g., "2401.12345")'),
|
|
38522
38527
|
topic: z74.string().optional().describe("Research topic to categorize the paper under"),
|
|
@@ -38527,19 +38532,19 @@ function registerResearchAddTool(server, deps) {
|
|
|
38527
38532
|
const secureHandler = createSecureHandler(createResearchAddHandler(deps), {
|
|
38528
38533
|
toolName: "research_add",
|
|
38529
38534
|
rateLimiter: deps.rateLimiter,
|
|
38530
|
-
logger:
|
|
38535
|
+
logger: logger55
|
|
38531
38536
|
});
|
|
38532
38537
|
const timeoutMs = getToolTimeout("research_add", deps.security);
|
|
38533
38538
|
const wrappedHandler = wrapToolWithTimeout("research_add", secureHandler, {
|
|
38534
38539
|
timeoutMs,
|
|
38535
|
-
logger:
|
|
38540
|
+
logger: logger55
|
|
38536
38541
|
});
|
|
38537
38542
|
server.registerTool(
|
|
38538
38543
|
"research_add",
|
|
38539
38544
|
{ description, inputSchema: toolSchema },
|
|
38540
38545
|
toSdkCallback(wrappedHandler)
|
|
38541
38546
|
);
|
|
38542
|
-
|
|
38547
|
+
logger55.info("Registered research_add tool with secure handler and timeout protection");
|
|
38543
38548
|
}
|
|
38544
38549
|
|
|
38545
38550
|
// src/mcp/tools/research-add-source.ts
|
|
@@ -38616,9 +38621,9 @@ function buildResponse2(params) {
|
|
|
38616
38621
|
dryRun: params.dryRun
|
|
38617
38622
|
};
|
|
38618
38623
|
}
|
|
38619
|
-
function recordAddSourceLearning(
|
|
38624
|
+
function recordAddSourceLearning(logger55, name, sourceId, type, qualityScore) {
|
|
38620
38625
|
try {
|
|
38621
|
-
const memory = getToolMemory(
|
|
38626
|
+
const memory = getToolMemory(logger55);
|
|
38622
38627
|
memory.recordLearning({
|
|
38623
38628
|
pattern: `Added source: ${name} (${sourceId})`,
|
|
38624
38629
|
context: `type=${type}, quality=${String(qualityScore)}`,
|
|
@@ -38626,7 +38631,7 @@ function recordAddSourceLearning(logger54, name, sourceId, type, qualityScore) {
|
|
|
38626
38631
|
source: "research_add_source"
|
|
38627
38632
|
});
|
|
38628
38633
|
} catch {
|
|
38629
|
-
|
|
38634
|
+
logger55.debug("Failed to record learning in session memory");
|
|
38630
38635
|
}
|
|
38631
38636
|
}
|
|
38632
38637
|
function prepareSource(input) {
|
|
@@ -38634,7 +38639,7 @@ function prepareSource(input) {
|
|
|
38634
38639
|
const score = computeSourceQualityScore(entry);
|
|
38635
38640
|
return { entry, score };
|
|
38636
38641
|
}
|
|
38637
|
-
async function executeResearchAddSource(input,
|
|
38642
|
+
async function executeResearchAddSource(input, logger55) {
|
|
38638
38643
|
const sourceId = generateSourceId(input.url);
|
|
38639
38644
|
const exists = await sourceExistsInRegistry(input.url);
|
|
38640
38645
|
if (exists) {
|
|
@@ -38669,8 +38674,8 @@ async function executeResearchAddSource(input, logger54) {
|
|
|
38669
38674
|
dryRun: false
|
|
38670
38675
|
});
|
|
38671
38676
|
}
|
|
38672
|
-
recordAddSourceLearning(
|
|
38673
|
-
|
|
38677
|
+
recordAddSourceLearning(logger55, input.name, sourceId, input.type, score);
|
|
38678
|
+
logger55.info("Added research source", { sourceId, name: input.name, qualityScore: score });
|
|
38674
38679
|
return buildResponse2({
|
|
38675
38680
|
success: true,
|
|
38676
38681
|
sourceId,
|
|
@@ -38687,9 +38692,9 @@ function createResearchAddSourceHandler(deps) {
|
|
|
38687
38692
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
38688
38693
|
}
|
|
38689
38694
|
ctx.logger.debug("Adding research source", { url: validationResult.data.url });
|
|
38690
|
-
const
|
|
38691
|
-
return withToolError("Failed to add source",
|
|
38692
|
-
const result = await executeResearchAddSource(validationResult.data,
|
|
38695
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add_source" });
|
|
38696
|
+
return withToolError("Failed to add source", logger55, async () => {
|
|
38697
|
+
const result = await executeResearchAddSource(validationResult.data, logger55);
|
|
38693
38698
|
if (!result.success) {
|
|
38694
38699
|
return toolError(result.message);
|
|
38695
38700
|
}
|
|
@@ -38698,7 +38703,7 @@ function createResearchAddSourceHandler(deps) {
|
|
|
38698
38703
|
};
|
|
38699
38704
|
}
|
|
38700
38705
|
function registerResearchAddSourceTool(server, deps) {
|
|
38701
|
-
const
|
|
38706
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add_source" });
|
|
38702
38707
|
const toolSchema = {
|
|
38703
38708
|
url: z75.string().min(1).describe("Source URL"),
|
|
38704
38709
|
name: z75.string().min(1).describe("Display name"),
|
|
@@ -38723,12 +38728,12 @@ function registerResearchAddSourceTool(server, deps) {
|
|
|
38723
38728
|
toolName: "research_add_source",
|
|
38724
38729
|
securityTier: "external",
|
|
38725
38730
|
rateLimiter: deps.rateLimiter,
|
|
38726
|
-
logger:
|
|
38731
|
+
logger: logger55
|
|
38727
38732
|
});
|
|
38728
38733
|
const timeoutMs = getToolTimeout("research_add_source", deps.security);
|
|
38729
38734
|
const wrappedHandler = wrapToolWithTimeout("research_add_source", secureHandler, {
|
|
38730
38735
|
timeoutMs,
|
|
38731
|
-
logger:
|
|
38736
|
+
logger: logger55
|
|
38732
38737
|
});
|
|
38733
38738
|
server.registerTool(
|
|
38734
38739
|
"research_add_source",
|
|
@@ -38781,7 +38786,7 @@ function toDiscoveredItems(sources) {
|
|
|
38781
38786
|
discoveredAt: s.discoveredAt
|
|
38782
38787
|
}));
|
|
38783
38788
|
}
|
|
38784
|
-
async function discoverFromExtendedSource(source, topic, maxResults,
|
|
38789
|
+
async function discoverFromExtendedSource(source, topic, maxResults, logger55, sinceDate) {
|
|
38785
38790
|
let result;
|
|
38786
38791
|
switch (source) {
|
|
38787
38792
|
case "google_ai":
|
|
@@ -38809,7 +38814,7 @@ async function discoverFromExtendedSource(source, topic, maxResults, logger54, s
|
|
|
38809
38814
|
return { items: [], failed: true };
|
|
38810
38815
|
}
|
|
38811
38816
|
if (!result.ok) {
|
|
38812
|
-
|
|
38817
|
+
logger55.warn(`${source} discovery failed`, {
|
|
38813
38818
|
source,
|
|
38814
38819
|
errorCode: result.error.code,
|
|
38815
38820
|
error: result.error.message
|
|
@@ -38849,24 +38854,24 @@ function markExistingItems(items, existingIds) {
|
|
|
38849
38854
|
}
|
|
38850
38855
|
var ARXIV_ORG_SOURCES = /* @__PURE__ */ new Set(["google_ai", "meta_fair", "microsoft", "deepmind"]);
|
|
38851
38856
|
var INDEPENDENT_SOURCES = ["semantic_scholar", "papers_with_code", "openalex"];
|
|
38852
|
-
async function queryExtendedSource(src, input,
|
|
38857
|
+
async function queryExtendedSource(src, input, logger55, acc) {
|
|
38853
38858
|
acc.sources.push(src);
|
|
38854
38859
|
try {
|
|
38855
38860
|
const result = await discoverFromExtendedSource(
|
|
38856
38861
|
src,
|
|
38857
38862
|
input.topic,
|
|
38858
38863
|
input.maxResults,
|
|
38859
|
-
|
|
38864
|
+
logger55,
|
|
38860
38865
|
input.sinceDate
|
|
38861
38866
|
);
|
|
38862
38867
|
if (result.failed) acc.failedSources.push(src);
|
|
38863
38868
|
acc.items = acc.items.concat(result.items);
|
|
38864
38869
|
} catch (error) {
|
|
38865
38870
|
acc.failedSources.push(src);
|
|
38866
|
-
|
|
38871
|
+
logger55.warn("Source discovery failed", { source: src, error: getErrorMessage(error) });
|
|
38867
38872
|
}
|
|
38868
38873
|
}
|
|
38869
|
-
async function queryAllSources(input,
|
|
38874
|
+
async function queryAllSources(input, logger55) {
|
|
38870
38875
|
const acc = { sources: [], failedSources: [], items: [] };
|
|
38871
38876
|
const isAll = input.source === "all";
|
|
38872
38877
|
const shouldQuery = (src) => isAll || input.source === src;
|
|
@@ -38876,11 +38881,11 @@ async function queryAllSources(input, logger54) {
|
|
|
38876
38881
|
if (r.ok) acc.items = acc.items.concat(toDiscoveredItems(r.value));
|
|
38877
38882
|
else {
|
|
38878
38883
|
acc.failedSources.push("arxiv");
|
|
38879
|
-
|
|
38884
|
+
logger55.warn("arxiv discovery failed", { error: r.error.message });
|
|
38880
38885
|
}
|
|
38881
38886
|
}
|
|
38882
38887
|
for (const src of ARXIV_ORG_SOURCES) {
|
|
38883
|
-
if (!isAll && input.source === src) await queryExtendedSource(src, input,
|
|
38888
|
+
if (!isAll && input.source === src) await queryExtendedSource(src, input, logger55, acc);
|
|
38884
38889
|
}
|
|
38885
38890
|
if (shouldQuery("github")) {
|
|
38886
38891
|
acc.sources.push("github");
|
|
@@ -38888,15 +38893,15 @@ async function queryAllSources(input, logger54) {
|
|
|
38888
38893
|
if (r.ok) acc.items = acc.items.concat(toDiscoveredItems(r.value));
|
|
38889
38894
|
else {
|
|
38890
38895
|
acc.failedSources.push("github");
|
|
38891
|
-
|
|
38896
|
+
logger55.warn("github discovery failed", { error: r.error.message });
|
|
38892
38897
|
}
|
|
38893
38898
|
}
|
|
38894
38899
|
for (const src of INDEPENDENT_SOURCES) {
|
|
38895
|
-
if (shouldQuery(src)) await queryExtendedSource(src, input,
|
|
38900
|
+
if (shouldQuery(src)) await queryExtendedSource(src, input, logger55, acc);
|
|
38896
38901
|
}
|
|
38897
38902
|
return acc;
|
|
38898
38903
|
}
|
|
38899
|
-
async function executeDiscovery(rawInput,
|
|
38904
|
+
async function executeDiscovery(rawInput, logger55) {
|
|
38900
38905
|
const input = {
|
|
38901
38906
|
...rawInput,
|
|
38902
38907
|
topic: normalizeTopicToCanonical(rawInput.topic)
|
|
@@ -38906,7 +38911,7 @@ async function executeDiscovery(rawInput, logger54) {
|
|
|
38906
38911
|
sources: sourcesToQuery,
|
|
38907
38912
|
failedSources,
|
|
38908
38913
|
items: allItems
|
|
38909
|
-
} = await queryAllSources(input,
|
|
38914
|
+
} = await queryAllSources(input, logger55);
|
|
38910
38915
|
markExistingItems(allItems, existingIds);
|
|
38911
38916
|
const totalFound = allItems.length;
|
|
38912
38917
|
const inRegistry = allItems.filter((i) => i.alreadyInRegistry).length;
|
|
@@ -38918,7 +38923,7 @@ async function executeDiscovery(rawInput, logger54) {
|
|
|
38918
38923
|
).slice(0, input.maxResults);
|
|
38919
38924
|
const filteredOut = totalFound - inRegistry - relevantItems.length;
|
|
38920
38925
|
if (filteredOut > 0) {
|
|
38921
|
-
|
|
38926
|
+
logger55.debug("Filtered out irrelevant results", {
|
|
38922
38927
|
threshold,
|
|
38923
38928
|
filteredOut,
|
|
38924
38929
|
remaining: relevantItems.length
|
|
@@ -38998,10 +39003,10 @@ function createResearchDiscoverHandler(deps) {
|
|
|
38998
39003
|
topic: validationResult.data.topic,
|
|
38999
39004
|
source: validationResult.data.source
|
|
39000
39005
|
});
|
|
39001
|
-
const
|
|
39006
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_discover" });
|
|
39002
39007
|
const startMs = Date.now();
|
|
39003
|
-
const response = await withToolError("Discovery failed",
|
|
39004
|
-
const result = await executeDiscovery(validationResult.data,
|
|
39008
|
+
const response = await withToolError("Discovery failed", logger55, async () => {
|
|
39009
|
+
const result = await executeDiscovery(validationResult.data, logger55);
|
|
39005
39010
|
recordDiscoverySuccess(result.topic, result.newItems, result.sourcesQueried);
|
|
39006
39011
|
return toolSuccess(JSON.stringify(result, null, 2));
|
|
39007
39012
|
});
|
|
@@ -39016,7 +39021,7 @@ function createResearchDiscoverHandler(deps) {
|
|
|
39016
39021
|
};
|
|
39017
39022
|
}
|
|
39018
39023
|
function registerResearchDiscoverTool(server, deps) {
|
|
39019
|
-
const
|
|
39024
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_discover" });
|
|
39020
39025
|
const toolSchema = {
|
|
39021
39026
|
topic: z76.string().min(1).max(200).describe("Research topic to search for"),
|
|
39022
39027
|
source: z76.enum([
|
|
@@ -39039,19 +39044,19 @@ function registerResearchDiscoverTool(server, deps) {
|
|
|
39039
39044
|
const secureHandler = createSecureHandler(createResearchDiscoverHandler(deps), {
|
|
39040
39045
|
toolName: "research_discover",
|
|
39041
39046
|
rateLimiter: deps.rateLimiter,
|
|
39042
|
-
logger:
|
|
39047
|
+
logger: logger55
|
|
39043
39048
|
});
|
|
39044
39049
|
const timeoutMs = getToolTimeout("research_discover", deps.security);
|
|
39045
39050
|
const wrappedHandler = wrapToolWithTimeout("research_discover", secureHandler, {
|
|
39046
39051
|
timeoutMs,
|
|
39047
|
-
logger:
|
|
39052
|
+
logger: logger55
|
|
39048
39053
|
});
|
|
39049
39054
|
server.registerTool(
|
|
39050
39055
|
"research_discover",
|
|
39051
39056
|
{ description, inputSchema: toolSchema },
|
|
39052
39057
|
toSdkCallback(wrappedHandler)
|
|
39053
39058
|
);
|
|
39054
|
-
|
|
39059
|
+
logger55.info("Registered research_discover tool with secure handler and timeout protection");
|
|
39055
39060
|
}
|
|
39056
39061
|
|
|
39057
39062
|
// src/mcp/tools/research-analyze.ts
|
|
@@ -39292,15 +39297,15 @@ function createResearchAnalyzeHandler(deps) {
|
|
|
39292
39297
|
ctx.logger.debug("Analyzing research registry", {
|
|
39293
39298
|
focus: validationResult.data.focus
|
|
39294
39299
|
});
|
|
39295
|
-
const
|
|
39296
|
-
return withToolError("Analysis failed",
|
|
39300
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_analyze" });
|
|
39301
|
+
return withToolError("Analysis failed", logger55, async () => {
|
|
39297
39302
|
const result = await executeAnalysis(validationResult.data);
|
|
39298
39303
|
return toolSuccess(JSON.stringify(result, null, 2));
|
|
39299
39304
|
});
|
|
39300
39305
|
};
|
|
39301
39306
|
}
|
|
39302
39307
|
function registerResearchAnalyzeTool(server, deps) {
|
|
39303
|
-
const
|
|
39308
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_analyze" });
|
|
39304
39309
|
const toolSchema = {
|
|
39305
39310
|
focus: z77.enum(["gaps", "trends", "priorities", "stale", "coverage"]).describe("Analysis focus area"),
|
|
39306
39311
|
topic: z77.string().optional().describe("Optional topic filter")
|
|
@@ -39309,19 +39314,19 @@ function registerResearchAnalyzeTool(server, deps) {
|
|
|
39309
39314
|
const secureHandler = createSecureHandler(createResearchAnalyzeHandler(deps), {
|
|
39310
39315
|
toolName: "research_analyze",
|
|
39311
39316
|
rateLimiter: deps.rateLimiter,
|
|
39312
|
-
logger:
|
|
39317
|
+
logger: logger55
|
|
39313
39318
|
});
|
|
39314
39319
|
const timeoutMs = getToolTimeout("research_analyze", deps.security);
|
|
39315
39320
|
const wrappedHandler = wrapToolWithTimeout("research_analyze", secureHandler, {
|
|
39316
39321
|
timeoutMs,
|
|
39317
|
-
logger:
|
|
39322
|
+
logger: logger55
|
|
39318
39323
|
});
|
|
39319
39324
|
server.registerTool(
|
|
39320
39325
|
"research_analyze",
|
|
39321
39326
|
{ description, inputSchema: toolSchema },
|
|
39322
39327
|
toSdkCallback(wrappedHandler)
|
|
39323
39328
|
);
|
|
39324
|
-
|
|
39329
|
+
logger55.info("Registered research_analyze tool with secure handler and timeout protection");
|
|
39325
39330
|
}
|
|
39326
39331
|
|
|
39327
39332
|
// src/mcp/tools/research-catalog-review.ts
|
|
@@ -39344,7 +39349,7 @@ function handleList() {
|
|
|
39344
39349
|
data: { pending, count: pending.length }
|
|
39345
39350
|
};
|
|
39346
39351
|
}
|
|
39347
|
-
async function approveArxivRef(identifier, topic, shouldCreateIssue,
|
|
39352
|
+
async function approveArxivRef(identifier, topic, shouldCreateIssue, logger55) {
|
|
39348
39353
|
const catalog = getAutoCatalog();
|
|
39349
39354
|
const exists = await paperExists(identifier);
|
|
39350
39355
|
if (exists) {
|
|
@@ -39356,7 +39361,7 @@ async function approveArxivRef(identifier, topic, shouldCreateIssue, logger54) {
|
|
|
39356
39361
|
if (!result.success) {
|
|
39357
39362
|
return { action: "approve", success: false, message: `Failed: ${result.message}` };
|
|
39358
39363
|
}
|
|
39359
|
-
|
|
39364
|
+
logger55.info("Approved paper", { paperId: result.paperId });
|
|
39360
39365
|
if (shouldCreateIssue) {
|
|
39361
39366
|
const body = formatResearchIssueBody([
|
|
39362
39367
|
{
|
|
@@ -39380,11 +39385,11 @@ async function approveArxivRef(identifier, topic, shouldCreateIssue, logger54) {
|
|
|
39380
39385
|
data: { ...result, issueUrl: issueResult.value.url }
|
|
39381
39386
|
};
|
|
39382
39387
|
}
|
|
39383
|
-
|
|
39388
|
+
logger55.warn("Issue creation failed after approve", { error: issueResult.error.message });
|
|
39384
39389
|
}
|
|
39385
39390
|
return { action: "approve", success: true, message: `Added: ${result.title}`, data: result };
|
|
39386
39391
|
}
|
|
39387
|
-
async function handleApprove(input,
|
|
39392
|
+
async function handleApprove(input, logger55) {
|
|
39388
39393
|
if (input.identifier === void 0 || input.identifier === "") {
|
|
39389
39394
|
return { action: "approve", success: false, message: "identifier is required" };
|
|
39390
39395
|
}
|
|
@@ -39398,7 +39403,7 @@ async function handleApprove(input, logger54) {
|
|
|
39398
39403
|
};
|
|
39399
39404
|
}
|
|
39400
39405
|
if (ref.type === "arxiv") {
|
|
39401
|
-
return approveArxivRef(ref.identifier, input.topic, input.createIssue,
|
|
39406
|
+
return approveArxivRef(ref.identifier, input.topic, input.createIssue, logger55);
|
|
39402
39407
|
}
|
|
39403
39408
|
catalog.markReviewed(ref.identifier);
|
|
39404
39409
|
return { action: "approve", success: true, message: `Reviewed: ${ref.identifier}` };
|
|
@@ -39429,12 +39434,12 @@ function handleFlush() {
|
|
|
39429
39434
|
message: `Flushed ${String(count)} references from catalog`
|
|
39430
39435
|
};
|
|
39431
39436
|
}
|
|
39432
|
-
async function executeCatalogReview(input,
|
|
39437
|
+
async function executeCatalogReview(input, logger55) {
|
|
39433
39438
|
switch (input.action) {
|
|
39434
39439
|
case "list":
|
|
39435
39440
|
return handleList();
|
|
39436
39441
|
case "approve":
|
|
39437
|
-
return handleApprove(input,
|
|
39442
|
+
return handleApprove(input, logger55);
|
|
39438
39443
|
case "dismiss":
|
|
39439
39444
|
return handleDismiss(input);
|
|
39440
39445
|
case "flush":
|
|
@@ -39448,9 +39453,9 @@ function createCatalogReviewHandler(deps) {
|
|
|
39448
39453
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
39449
39454
|
}
|
|
39450
39455
|
ctx.logger.debug("Catalog review", { action: validationResult.data.action });
|
|
39451
|
-
const
|
|
39452
|
-
return withToolError("Catalog review failed",
|
|
39453
|
-
const result = await executeCatalogReview(validationResult.data,
|
|
39456
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_catalog_review" });
|
|
39457
|
+
return withToolError("Catalog review failed", logger55, async () => {
|
|
39458
|
+
const result = await executeCatalogReview(validationResult.data, logger55);
|
|
39454
39459
|
if (!result.success) {
|
|
39455
39460
|
return toolError(result.message);
|
|
39456
39461
|
}
|
|
@@ -39459,7 +39464,7 @@ function createCatalogReviewHandler(deps) {
|
|
|
39459
39464
|
};
|
|
39460
39465
|
}
|
|
39461
39466
|
function registerResearchCatalogReviewTool(server, deps) {
|
|
39462
|
-
const
|
|
39467
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_catalog_review" });
|
|
39463
39468
|
const toolSchema = {
|
|
39464
39469
|
action: z78.enum(["list", "approve", "dismiss", "flush"]).describe("Action to perform on cataloged references"),
|
|
39465
39470
|
identifier: z78.string().optional().describe("Reference identifier for approve/dismiss"),
|
|
@@ -39470,19 +39475,19 @@ function registerResearchCatalogReviewTool(server, deps) {
|
|
|
39470
39475
|
const secureHandler = createSecureHandler(createCatalogReviewHandler(deps), {
|
|
39471
39476
|
toolName: "research_catalog_review",
|
|
39472
39477
|
rateLimiter: deps.rateLimiter,
|
|
39473
|
-
logger:
|
|
39478
|
+
logger: logger55
|
|
39474
39479
|
});
|
|
39475
39480
|
const timeoutMs = getToolTimeout("research_catalog_review", deps.security);
|
|
39476
39481
|
const wrappedHandler = wrapToolWithTimeout("research_catalog_review", secureHandler, {
|
|
39477
39482
|
timeoutMs,
|
|
39478
|
-
logger:
|
|
39483
|
+
logger: logger55
|
|
39479
39484
|
});
|
|
39480
39485
|
server.registerTool(
|
|
39481
39486
|
"research_catalog_review",
|
|
39482
39487
|
{ description, inputSchema: toolSchema },
|
|
39483
39488
|
toSdkCallback(wrappedHandler)
|
|
39484
39489
|
);
|
|
39485
|
-
|
|
39490
|
+
logger55.info("Registered research_catalog_review tool");
|
|
39486
39491
|
}
|
|
39487
39492
|
|
|
39488
39493
|
// src/mcp/tools/research-synthesize.ts
|
|
@@ -39496,8 +39501,8 @@ function createResearchSynthesizeHandler(deps) {
|
|
|
39496
39501
|
if (!validationResult.success) {
|
|
39497
39502
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
39498
39503
|
}
|
|
39499
|
-
const
|
|
39500
|
-
return withToolError("Synthesis failed",
|
|
39504
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_synthesize" });
|
|
39505
|
+
return withToolError("Synthesis failed", logger55, async () => {
|
|
39501
39506
|
const result = await synthesizeResearch(validationResult.data.topic);
|
|
39502
39507
|
if (!result.ok) {
|
|
39503
39508
|
return toolError(`Synthesis failed: ${result.error.message}`);
|
|
@@ -39507,7 +39512,7 @@ function createResearchSynthesizeHandler(deps) {
|
|
|
39507
39512
|
};
|
|
39508
39513
|
}
|
|
39509
39514
|
function registerResearchSynthesizeTool(server, deps) {
|
|
39510
|
-
const
|
|
39515
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_synthesize" });
|
|
39511
39516
|
const toolSchema = {
|
|
39512
39517
|
topic: z79.string().optional().describe("Optional topic filter for single-cluster synthesis")
|
|
39513
39518
|
};
|
|
@@ -39515,19 +39520,19 @@ function registerResearchSynthesizeTool(server, deps) {
|
|
|
39515
39520
|
const secureHandler = createSecureHandler(createResearchSynthesizeHandler(deps), {
|
|
39516
39521
|
toolName: "research_synthesize",
|
|
39517
39522
|
rateLimiter: deps.rateLimiter,
|
|
39518
|
-
logger:
|
|
39523
|
+
logger: logger55
|
|
39519
39524
|
});
|
|
39520
39525
|
const timeoutMs = getToolTimeout("research_synthesize", deps.security);
|
|
39521
39526
|
const wrappedHandler = wrapToolWithTimeout("research_synthesize", secureHandler, {
|
|
39522
39527
|
timeoutMs,
|
|
39523
|
-
logger:
|
|
39528
|
+
logger: logger55
|
|
39524
39529
|
});
|
|
39525
39530
|
server.registerTool(
|
|
39526
39531
|
"research_synthesize",
|
|
39527
39532
|
{ description, inputSchema: toolSchema },
|
|
39528
39533
|
toSdkCallback(wrappedHandler)
|
|
39529
39534
|
);
|
|
39530
|
-
|
|
39535
|
+
logger55.info("Registered research_synthesize tool");
|
|
39531
39536
|
}
|
|
39532
39537
|
|
|
39533
39538
|
// src/mcp/tools/issue-triage-tool.ts
|
|
@@ -39581,7 +39586,7 @@ function createIssueTriageHandler(_deps) {
|
|
|
39581
39586
|
};
|
|
39582
39587
|
}
|
|
39583
39588
|
function registerIssueTriageTool(server, deps) {
|
|
39584
|
-
const
|
|
39589
|
+
const logger55 = deps.logger ?? createLogger({ tool: "issue_triage" });
|
|
39585
39590
|
const toolSchema = {
|
|
39586
39591
|
issueUrl: z80.string().min(1).describe("GitHub issue URL (e.g., https://github.com/owner/repo/issues/123)"),
|
|
39587
39592
|
dryRun: z80.boolean().optional().default(true).describe("Read-only mode (default: true)")
|
|
@@ -39591,19 +39596,19 @@ function registerIssueTriageTool(server, deps) {
|
|
|
39591
39596
|
toolName: "issue_triage",
|
|
39592
39597
|
securityTier: "external",
|
|
39593
39598
|
rateLimiter: deps.rateLimiter,
|
|
39594
|
-
logger:
|
|
39599
|
+
logger: logger55
|
|
39595
39600
|
});
|
|
39596
39601
|
const timeoutMs = getToolTimeout("issue_triage", deps.security);
|
|
39597
39602
|
const wrappedHandler = wrapToolWithTimeout("issue_triage", secureHandler, {
|
|
39598
39603
|
timeoutMs,
|
|
39599
|
-
logger:
|
|
39604
|
+
logger: logger55
|
|
39600
39605
|
});
|
|
39601
39606
|
server.registerTool(
|
|
39602
39607
|
"issue_triage",
|
|
39603
39608
|
{ description, inputSchema: toolSchema },
|
|
39604
39609
|
toSdkCallback(wrappedHandler)
|
|
39605
39610
|
);
|
|
39606
|
-
|
|
39611
|
+
logger55.info("Registered issue_triage tool with secure handler and timeout protection");
|
|
39607
39612
|
}
|
|
39608
39613
|
var triageLogger = createLogger({ tool: "issue-triage" });
|
|
39609
39614
|
function recordTriageSuccess(category, confidence, durationMs) {
|
|
@@ -39840,7 +39845,7 @@ function createEventCollector(events, enableAuditTrail) {
|
|
|
39840
39845
|
auditBridge?.(event);
|
|
39841
39846
|
};
|
|
39842
39847
|
}
|
|
39843
|
-
async function handleRunGraphWorkflow(input,
|
|
39848
|
+
async function handleRunGraphWorkflow(input, logger55) {
|
|
39844
39849
|
const startTime = getTimeProvider().now();
|
|
39845
39850
|
const resolved = resolveGraph(input.workflow, startTime);
|
|
39846
39851
|
if (!resolved.ok) return resolved.error;
|
|
@@ -39848,7 +39853,7 @@ async function handleRunGraphWorkflow(input, logger54) {
|
|
|
39848
39853
|
const checkpointStore = input.enableCheckpointing ? createCheckpointStore() : void 0;
|
|
39849
39854
|
const onEvent = createEventCollector(events, input.enableAuditTrail);
|
|
39850
39855
|
const executionId = `graph-${input.workflow}-${String(Date.now())}`;
|
|
39851
|
-
|
|
39856
|
+
logger55.info("Executing graph workflow", {
|
|
39852
39857
|
workflow: input.workflow,
|
|
39853
39858
|
executionId,
|
|
39854
39859
|
checkpointing: input.enableCheckpointing,
|
|
@@ -39891,7 +39896,7 @@ var GRAPH_WORKFLOW_SCHEMA = {
|
|
|
39891
39896
|
enableCheckpointing: z81.boolean().optional().describe("Enable checkpoint saving"),
|
|
39892
39897
|
enableAuditTrail: z81.boolean().optional().describe("Enable audit trail logging")
|
|
39893
39898
|
};
|
|
39894
|
-
function createGraphWorkflowHandler(
|
|
39899
|
+
function createGraphWorkflowHandler(logger55, notifier) {
|
|
39895
39900
|
return async (args, _ctx) => {
|
|
39896
39901
|
const parsed = RunGraphWorkflowInputSchema.safeParse(args);
|
|
39897
39902
|
if (!parsed.success) {
|
|
@@ -39904,7 +39909,7 @@ function createGraphWorkflowHandler(logger54, notifier) {
|
|
|
39904
39909
|
event: "graph_workflow_start",
|
|
39905
39910
|
workflow: parsed.data.workflow
|
|
39906
39911
|
});
|
|
39907
|
-
const result = await handleRunGraphWorkflow(parsed.data,
|
|
39912
|
+
const result = await handleRunGraphWorkflow(parsed.data, logger55);
|
|
39908
39913
|
const succeeded = result.status === "completed";
|
|
39909
39914
|
notifier.info("run_graph_workflow", {
|
|
39910
39915
|
event: succeeded ? "graph_workflow_complete" : "graph_workflow_failed",
|
|
@@ -39918,22 +39923,22 @@ function createGraphWorkflowHandler(logger54, notifier) {
|
|
|
39918
39923
|
};
|
|
39919
39924
|
}
|
|
39920
39925
|
function registerRunGraphWorkflowTool(server, deps) {
|
|
39921
|
-
const
|
|
39926
|
+
const logger55 = deps.logger ?? createLogger({ tool: "run_graph_workflow" });
|
|
39922
39927
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
39923
|
-
const handler2 = createGraphWorkflowHandler(
|
|
39928
|
+
const handler2 = createGraphWorkflowHandler(logger55, notifier);
|
|
39924
39929
|
const secureHandler = createSecureHandler(handler2, {
|
|
39925
39930
|
toolName: "run_graph_workflow",
|
|
39926
39931
|
rateLimiter: deps.rateLimiter,
|
|
39927
|
-
logger:
|
|
39932
|
+
logger: logger55
|
|
39928
39933
|
});
|
|
39929
39934
|
const timeoutMs = getToolTimeout("run_graph_workflow", deps.security);
|
|
39930
|
-
const wrapped = wrapToolWithTimeout("run_graph_workflow", secureHandler, { timeoutMs, logger:
|
|
39935
|
+
const wrapped = wrapToolWithTimeout("run_graph_workflow", secureHandler, { timeoutMs, logger: logger55 });
|
|
39931
39936
|
server.registerTool(
|
|
39932
39937
|
"run_graph_workflow",
|
|
39933
39938
|
{ description: GRAPH_WORKFLOW_DESCRIPTION, inputSchema: GRAPH_WORKFLOW_SCHEMA },
|
|
39934
39939
|
toSdkCallback(wrapped)
|
|
39935
39940
|
);
|
|
39936
|
-
|
|
39941
|
+
logger55.info("Registered run_graph_workflow tool");
|
|
39937
39942
|
}
|
|
39938
39943
|
function toEventSummary(event) {
|
|
39939
39944
|
const hasNodeId = "nodeId" in event;
|
|
@@ -40485,7 +40490,7 @@ var ExecuteSpecInputSchema = z82.object({
|
|
|
40485
40490
|
spec: z82.string().min(1).max(5e4).describe("Markdown specification to execute"),
|
|
40486
40491
|
dryRun: z82.boolean().optional().default(false).describe("Parse and decompose only")
|
|
40487
40492
|
});
|
|
40488
|
-
function createDryRunResponse(input,
|
|
40493
|
+
function createDryRunResponse(input, logger55) {
|
|
40489
40494
|
const parseResult2 = parseSpec(input.spec);
|
|
40490
40495
|
if (!parseResult2.ok) {
|
|
40491
40496
|
return toolError(`Parse error: ${parseResult2.error.message}`);
|
|
@@ -40494,14 +40499,14 @@ function createDryRunResponse(input, logger54) {
|
|
|
40494
40499
|
if (!dagResult.ok) {
|
|
40495
40500
|
return toolError(`Decompose error: ${dagResult.error.message}`);
|
|
40496
40501
|
}
|
|
40497
|
-
|
|
40502
|
+
logger55.info("Dry run completed", {
|
|
40498
40503
|
title: parseResult2.value.title,
|
|
40499
40504
|
nodes: dagResult.value.nodes.length
|
|
40500
40505
|
});
|
|
40501
40506
|
const output2 = { mode: "dry_run", spec: parseResult2.value, dag: dagResult.value };
|
|
40502
40507
|
return toolSuccess(JSON.stringify(output2, null, 2));
|
|
40503
40508
|
}
|
|
40504
|
-
async function createFullResponse(input,
|
|
40509
|
+
async function createFullResponse(input, logger55) {
|
|
40505
40510
|
const startMs = Date.now();
|
|
40506
40511
|
const result = await executeSpec(input.spec);
|
|
40507
40512
|
const durationMs = Date.now() - startMs;
|
|
@@ -40511,7 +40516,7 @@ async function createFullResponse(input, logger54) {
|
|
|
40511
40516
|
}
|
|
40512
40517
|
const analysis = analyzeFailures(result.value);
|
|
40513
40518
|
const satisfaction = result.value.validation.satisfaction;
|
|
40514
|
-
|
|
40519
|
+
logger55.info("Spec execution completed", {
|
|
40515
40520
|
satisfaction,
|
|
40516
40521
|
passed: analysis.ok ? analysis.value.passed : false
|
|
40517
40522
|
});
|
|
@@ -40525,24 +40530,24 @@ async function createFullResponse(input, logger54) {
|
|
|
40525
40530
|
return toolSuccess(JSON.stringify(output2, null, 2));
|
|
40526
40531
|
}
|
|
40527
40532
|
function registerExecuteSpecTool(server, deps) {
|
|
40528
|
-
const
|
|
40533
|
+
const logger55 = deps.logger ?? createLogger({ tool: "execute_spec" });
|
|
40529
40534
|
const handler2 = async (args, _ctx) => {
|
|
40530
40535
|
const parsed = ExecuteSpecInputSchema.safeParse(args);
|
|
40531
40536
|
if (!parsed.success) {
|
|
40532
40537
|
return toolError(`Invalid input: ${formatZodError(parsed.error)}`);
|
|
40533
40538
|
}
|
|
40534
40539
|
if (parsed.data.dryRun) {
|
|
40535
|
-
return createDryRunResponse(parsed.data,
|
|
40540
|
+
return createDryRunResponse(parsed.data, logger55);
|
|
40536
40541
|
}
|
|
40537
|
-
return createFullResponse(parsed.data,
|
|
40542
|
+
return createFullResponse(parsed.data, logger55);
|
|
40538
40543
|
};
|
|
40539
40544
|
const secureHandler = createSecureHandler(handler2, {
|
|
40540
40545
|
toolName: "execute_spec",
|
|
40541
40546
|
rateLimiter: deps.rateLimiter,
|
|
40542
|
-
logger:
|
|
40547
|
+
logger: logger55
|
|
40543
40548
|
});
|
|
40544
40549
|
const timeoutMs = getToolTimeout("execute_spec", deps.security);
|
|
40545
|
-
const wrapped = wrapToolWithTimeout("execute_spec", secureHandler, { timeoutMs, logger:
|
|
40550
|
+
const wrapped = wrapToolWithTimeout("execute_spec", secureHandler, { timeoutMs, logger: logger55 });
|
|
40546
40551
|
const toolSchema = {
|
|
40547
40552
|
spec: z82.string().min(1).max(5e4).describe(
|
|
40548
40553
|
'Markdown specification to execute. Must contain "## Requirements" and "## Acceptance Criteria" sections.'
|
|
@@ -40555,7 +40560,7 @@ function registerExecuteSpecTool(server, deps) {
|
|
|
40555
40560
|
{ description, inputSchema: toolSchema },
|
|
40556
40561
|
toSdkCallback(wrapped)
|
|
40557
40562
|
);
|
|
40558
|
-
|
|
40563
|
+
logger55.info("Registered execute_spec tool");
|
|
40559
40564
|
}
|
|
40560
40565
|
var specLogger = createLogger({ tool: "execute-spec" });
|
|
40561
40566
|
function recordSpecSuccess(satisfaction, durationMs) {
|
|
@@ -40617,29 +40622,29 @@ var MemoryQueryInputSchema = z83.object({
|
|
|
40617
40622
|
});
|
|
40618
40623
|
var reflectionCache;
|
|
40619
40624
|
var reflectionAdapter;
|
|
40620
|
-
function getReflectiveRetriever(
|
|
40625
|
+
function getReflectiveRetriever(logger55) {
|
|
40621
40626
|
const enabled = isReflectiveMemoryEnabled();
|
|
40622
40627
|
const shadow = isReflectiveShadowMode();
|
|
40623
40628
|
if (!enabled && !shadow) return void 0;
|
|
40624
40629
|
if (reflectionAdapter === void 0) {
|
|
40625
40630
|
try {
|
|
40626
|
-
const registry = getGlobalRegistry({ logger:
|
|
40631
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
40627
40632
|
reflectionAdapter = registry.getDefault();
|
|
40628
40633
|
} catch {
|
|
40629
|
-
|
|
40634
|
+
logger55.warn("No adapter for reflection, using keyword retrieval");
|
|
40630
40635
|
return void 0;
|
|
40631
40636
|
}
|
|
40632
40637
|
}
|
|
40633
40638
|
reflectionCache ??= new ReflectionCache();
|
|
40634
40639
|
return new ReflectiveRetriever({
|
|
40635
40640
|
adapter: reflectionAdapter,
|
|
40636
|
-
logger:
|
|
40641
|
+
logger: logger55,
|
|
40637
40642
|
shadowMode: shadow,
|
|
40638
40643
|
cache: reflectionCache
|
|
40639
40644
|
});
|
|
40640
40645
|
}
|
|
40641
|
-
async function resolveReflection(query,
|
|
40642
|
-
const retriever = getReflectiveRetriever(
|
|
40646
|
+
async function resolveReflection(query, logger55) {
|
|
40647
|
+
const retriever = getReflectiveRetriever(logger55);
|
|
40643
40648
|
if (retriever === void 0) return { effectiveQuery: query };
|
|
40644
40649
|
const reflection = await retriever.enhance(query);
|
|
40645
40650
|
const reflected = reflection.reflected;
|
|
@@ -40651,14 +40656,14 @@ async function resolveReflection(query, logger54) {
|
|
|
40651
40656
|
reflection
|
|
40652
40657
|
};
|
|
40653
40658
|
}
|
|
40654
|
-
async function executeMemoryQuery(input,
|
|
40659
|
+
async function executeMemoryQuery(input, logger55) {
|
|
40655
40660
|
const toolMemory = getToolMemory();
|
|
40656
40661
|
const { effectiveQuery, expandedQuery, reflection } = await resolveReflection(
|
|
40657
40662
|
input.query,
|
|
40658
|
-
|
|
40663
|
+
logger55
|
|
40659
40664
|
);
|
|
40660
40665
|
const results = await toolMemory.queryBySource(input.source, effectiveQuery, input.limit);
|
|
40661
|
-
|
|
40666
|
+
logger55.debug("Memory query executed", {
|
|
40662
40667
|
query: input.query,
|
|
40663
40668
|
effectiveQuery: effectiveQuery !== input.query ? effectiveQuery : void 0,
|
|
40664
40669
|
resultCount: results.length,
|
|
@@ -40685,7 +40690,7 @@ async function memoryQueryHandler(args, ctx) {
|
|
|
40685
40690
|
});
|
|
40686
40691
|
}
|
|
40687
40692
|
function registerMemoryQueryTool(server, deps) {
|
|
40688
|
-
const
|
|
40693
|
+
const logger55 = deps.logger ?? createLogger({ tool: "memory_query" });
|
|
40689
40694
|
const toolSchema = {
|
|
40690
40695
|
query: z83.string().min(1).max(500).describe("Search query to match against memory contents"),
|
|
40691
40696
|
limit: z83.number().int().min(1).max(50).optional().describe("Maximum results to return (default: 10, max: 50)"),
|
|
@@ -40695,16 +40700,16 @@ function registerMemoryQueryTool(server, deps) {
|
|
|
40695
40700
|
const secureHandler = createSecureHandler(memoryQueryHandler, {
|
|
40696
40701
|
toolName: "memory_query",
|
|
40697
40702
|
rateLimiter: deps.rateLimiter,
|
|
40698
|
-
logger:
|
|
40703
|
+
logger: logger55
|
|
40699
40704
|
});
|
|
40700
40705
|
const timeoutMs = getToolTimeout("memory_query", deps.security);
|
|
40701
|
-
const wrappedHandler = wrapToolWithTimeout("memory_query", secureHandler, { timeoutMs, logger:
|
|
40706
|
+
const wrappedHandler = wrapToolWithTimeout("memory_query", secureHandler, { timeoutMs, logger: logger55 });
|
|
40702
40707
|
server.registerTool(
|
|
40703
40708
|
"memory_query",
|
|
40704
40709
|
{ description, inputSchema: toolSchema },
|
|
40705
40710
|
toSdkCallback(wrappedHandler)
|
|
40706
40711
|
);
|
|
40707
|
-
|
|
40712
|
+
logger55.info("Registered memory_query tool");
|
|
40708
40713
|
}
|
|
40709
40714
|
|
|
40710
40715
|
// src/mcp/tools/memory-stats.ts
|
|
@@ -40712,7 +40717,7 @@ import { z as z84 } from "zod";
|
|
|
40712
40717
|
var MemoryStatsInputSchema = z84.object({
|
|
40713
40718
|
includeDecay: z84.boolean().optional().default(true).describe("Include decay statistics (default: true)")
|
|
40714
40719
|
});
|
|
40715
|
-
async function collectMemoryStats(input,
|
|
40720
|
+
async function collectMemoryStats(input, logger55) {
|
|
40716
40721
|
const toolMemory = getToolMemory();
|
|
40717
40722
|
const sessionStats = {
|
|
40718
40723
|
learningsCount: 0,
|
|
@@ -40749,7 +40754,7 @@ async function collectMemoryStats(input, logger54) {
|
|
|
40749
40754
|
mobimem: toolMemory.isMobiMemAvailable(),
|
|
40750
40755
|
decay: toolMemory.isDecayManagerAvailable()
|
|
40751
40756
|
};
|
|
40752
|
-
|
|
40757
|
+
logger55.debug("Memory stats collected", { backends });
|
|
40753
40758
|
return {
|
|
40754
40759
|
backends,
|
|
40755
40760
|
session: sessionStats,
|
|
@@ -40771,7 +40776,7 @@ async function memoryStatsHandler(args, ctx) {
|
|
|
40771
40776
|
});
|
|
40772
40777
|
}
|
|
40773
40778
|
function registerMemoryStatsTool(server, deps) {
|
|
40774
|
-
const
|
|
40779
|
+
const logger55 = deps.logger ?? createLogger({ tool: "memory_stats" });
|
|
40775
40780
|
const toolSchema = {
|
|
40776
40781
|
includeDecay: z84.boolean().optional().describe("Include decay statistics (default: true)")
|
|
40777
40782
|
};
|
|
@@ -40779,16 +40784,16 @@ function registerMemoryStatsTool(server, deps) {
|
|
|
40779
40784
|
const secureHandler = createSecureHandler(memoryStatsHandler, {
|
|
40780
40785
|
toolName: "memory_stats",
|
|
40781
40786
|
rateLimiter: deps.rateLimiter,
|
|
40782
|
-
logger:
|
|
40787
|
+
logger: logger55
|
|
40783
40788
|
});
|
|
40784
40789
|
const timeoutMs = getToolTimeout("memory_stats", deps.security);
|
|
40785
|
-
const wrappedHandler = wrapToolWithTimeout("memory_stats", secureHandler, { timeoutMs, logger:
|
|
40790
|
+
const wrappedHandler = wrapToolWithTimeout("memory_stats", secureHandler, { timeoutMs, logger: logger55 });
|
|
40786
40791
|
server.registerTool(
|
|
40787
40792
|
"memory_stats",
|
|
40788
40793
|
{ description, inputSchema: toolSchema },
|
|
40789
40794
|
toSdkCallback(wrappedHandler)
|
|
40790
40795
|
);
|
|
40791
|
-
|
|
40796
|
+
logger55.info("Registered memory_stats tool");
|
|
40792
40797
|
}
|
|
40793
40798
|
|
|
40794
40799
|
// src/mcp/tools/memory-write.ts
|
|
@@ -40877,12 +40882,12 @@ function isDuplicateWrite(key, content) {
|
|
|
40877
40882
|
recentWriteKeys.set(cacheKey, (/* @__PURE__ */ new Date()).toISOString());
|
|
40878
40883
|
return false;
|
|
40879
40884
|
}
|
|
40880
|
-
async function executeMemoryWrite(input,
|
|
40885
|
+
async function executeMemoryWrite(input, logger55) {
|
|
40881
40886
|
if (isDuplicateWrite(input.key, input.content)) {
|
|
40882
|
-
|
|
40887
|
+
logger55.debug("Skipping duplicate memory write", { key: input.key, backend: input.backend });
|
|
40883
40888
|
return { success: true, backend: input.backend, key: input.key, deduplicated: true };
|
|
40884
40889
|
}
|
|
40885
|
-
|
|
40890
|
+
logger55.debug("Writing to memory", {
|
|
40886
40891
|
backend: input.backend,
|
|
40887
40892
|
key: input.key,
|
|
40888
40893
|
contentLength: input.content.length
|
|
@@ -40914,7 +40919,7 @@ async function memoryWriteHandler(args, ctx) {
|
|
|
40914
40919
|
});
|
|
40915
40920
|
}
|
|
40916
40921
|
function registerMemoryWriteTool(server, deps) {
|
|
40917
|
-
const
|
|
40922
|
+
const logger55 = deps.logger ?? createLogger({ tool: "memory_write" });
|
|
40918
40923
|
const toolSchema = {
|
|
40919
40924
|
key: z85.string().min(1).max(200).describe("Memory identifier or subject"),
|
|
40920
40925
|
content: z85.string().min(1).max(5e3).describe("Memory content to store"),
|
|
@@ -40928,16 +40933,16 @@ function registerMemoryWriteTool(server, deps) {
|
|
|
40928
40933
|
const secureHandler = createSecureHandler(memoryWriteHandler, {
|
|
40929
40934
|
toolName: "memory_write",
|
|
40930
40935
|
rateLimiter: deps.rateLimiter,
|
|
40931
|
-
logger:
|
|
40936
|
+
logger: logger55
|
|
40932
40937
|
});
|
|
40933
40938
|
const timeoutMs = getToolTimeout("memory_write", deps.security);
|
|
40934
|
-
const wrappedHandler = wrapToolWithTimeout("memory_write", secureHandler, { timeoutMs, logger:
|
|
40939
|
+
const wrappedHandler = wrapToolWithTimeout("memory_write", secureHandler, { timeoutMs, logger: logger55 });
|
|
40935
40940
|
server.registerTool(
|
|
40936
40941
|
"memory_write",
|
|
40937
40942
|
{ description, inputSchema: toolSchema },
|
|
40938
40943
|
toSdkCallback(wrappedHandler)
|
|
40939
40944
|
);
|
|
40940
|
-
|
|
40945
|
+
logger55.info("Registered memory_write tool");
|
|
40941
40946
|
}
|
|
40942
40947
|
|
|
40943
40948
|
// src/mcp/tools/weather-report-tool.ts
|
|
@@ -40982,7 +40987,7 @@ function weatherReportHandler(args, ctx) {
|
|
|
40982
40987
|
}
|
|
40983
40988
|
}
|
|
40984
40989
|
function registerWeatherReportTool(server, deps) {
|
|
40985
|
-
const
|
|
40990
|
+
const logger55 = deps.logger ?? createLogger({ tool: "weather_report" });
|
|
40986
40991
|
const toolSchema = {
|
|
40987
40992
|
cli: z86.enum(["claude", "gemini", "codex", "opencode"]).optional().describe("Filter by CLI"),
|
|
40988
40993
|
category: z86.enum([
|
|
@@ -41003,19 +41008,19 @@ function registerWeatherReportTool(server, deps) {
|
|
|
41003
41008
|
const secureHandler = createSecureHandler(weatherReportHandler, {
|
|
41004
41009
|
toolName: "weather_report",
|
|
41005
41010
|
rateLimiter: deps.rateLimiter,
|
|
41006
|
-
logger:
|
|
41011
|
+
logger: logger55
|
|
41007
41012
|
});
|
|
41008
41013
|
const timeoutMs = getToolTimeout("weather_report", deps.security);
|
|
41009
41014
|
const wrappedHandler = wrapToolWithTimeout("weather_report", secureHandler, {
|
|
41010
41015
|
timeoutMs,
|
|
41011
|
-
logger:
|
|
41016
|
+
logger: logger55
|
|
41012
41017
|
});
|
|
41013
41018
|
server.registerTool(
|
|
41014
41019
|
"weather_report",
|
|
41015
41020
|
{ description, inputSchema: toolSchema },
|
|
41016
41021
|
toSdkCallback(wrappedHandler)
|
|
41017
41022
|
);
|
|
41018
|
-
|
|
41023
|
+
logger55.info("Registered weather_report tool");
|
|
41019
41024
|
}
|
|
41020
41025
|
|
|
41021
41026
|
// src/mcp/tools/registry-import-types.ts
|
|
@@ -41133,7 +41138,7 @@ function registryImportHandler(args, ctx) {
|
|
|
41133
41138
|
}
|
|
41134
41139
|
}
|
|
41135
41140
|
function registerRegistryImportTool(server, deps) {
|
|
41136
|
-
const
|
|
41141
|
+
const logger55 = deps.logger ?? createLogger({ tool: "registry_import" });
|
|
41137
41142
|
const toolSchema = {
|
|
41138
41143
|
provider: z88.enum(["anthropic", "google", "openai"]).describe("Model provider (anthropic, google, openai)"),
|
|
41139
41144
|
modelId: z88.string().min(1).describe("Provider model identifier"),
|
|
@@ -41143,19 +41148,19 @@ function registerRegistryImportTool(server, deps) {
|
|
|
41143
41148
|
const secureHandler = createSecureHandler(registryImportHandler, {
|
|
41144
41149
|
toolName: "registry_import",
|
|
41145
41150
|
rateLimiter: deps.rateLimiter,
|
|
41146
|
-
logger:
|
|
41151
|
+
logger: logger55
|
|
41147
41152
|
});
|
|
41148
41153
|
const timeoutMs = getToolTimeout("registry_import", deps.security);
|
|
41149
41154
|
const wrappedHandler = wrapToolWithTimeout("registry_import", secureHandler, {
|
|
41150
41155
|
timeoutMs,
|
|
41151
|
-
logger:
|
|
41156
|
+
logger: logger55
|
|
41152
41157
|
});
|
|
41153
41158
|
server.registerTool(
|
|
41154
41159
|
"registry_import",
|
|
41155
41160
|
{ description, inputSchema: toolSchema },
|
|
41156
41161
|
toSdkCallback(wrappedHandler)
|
|
41157
41162
|
);
|
|
41158
|
-
|
|
41163
|
+
logger55.info("Registered registry_import tool");
|
|
41159
41164
|
}
|
|
41160
41165
|
|
|
41161
41166
|
// src/mcp/tools/repo-analyze-types.ts
|
|
@@ -41185,7 +41190,7 @@ async function repoAnalyzeHandler(args, ctx) {
|
|
|
41185
41190
|
}
|
|
41186
41191
|
}
|
|
41187
41192
|
function registerRepoAnalyzeTool(server, deps) {
|
|
41188
|
-
const
|
|
41193
|
+
const logger55 = deps.logger ?? createLogger({ tool: "repo_analyze" });
|
|
41189
41194
|
const toolSchema = {
|
|
41190
41195
|
repo: z90.string().min(1).describe('GitHub repository in "owner/name" format or full URL'),
|
|
41191
41196
|
depth: z90.enum(["shallow", "deep"]).optional().describe("Analysis depth: shallow (tree + README) or deep")
|
|
@@ -41194,19 +41199,19 @@ function registerRepoAnalyzeTool(server, deps) {
|
|
|
41194
41199
|
const secureHandler = createSecureHandler(repoAnalyzeHandler, {
|
|
41195
41200
|
toolName: "repo_analyze",
|
|
41196
41201
|
rateLimiter: deps.rateLimiter,
|
|
41197
|
-
logger:
|
|
41202
|
+
logger: logger55
|
|
41198
41203
|
});
|
|
41199
41204
|
const timeoutMs = getToolTimeout("repo_analyze", deps.security);
|
|
41200
41205
|
const wrappedHandler = wrapToolWithTimeout("repo_analyze", secureHandler, {
|
|
41201
41206
|
timeoutMs,
|
|
41202
|
-
logger:
|
|
41207
|
+
logger: logger55
|
|
41203
41208
|
});
|
|
41204
41209
|
server.registerTool(
|
|
41205
41210
|
"repo_analyze",
|
|
41206
41211
|
{ description, inputSchema: toolSchema },
|
|
41207
41212
|
toSdkCallback(wrappedHandler)
|
|
41208
41213
|
);
|
|
41209
|
-
|
|
41214
|
+
logger55.info("Registered repo_analyze tool");
|
|
41210
41215
|
}
|
|
41211
41216
|
|
|
41212
41217
|
// src/mcp/tools/repo-security-plan-types.ts
|
|
@@ -41235,7 +41240,7 @@ async function handler(args, ctx) {
|
|
|
41235
41240
|
}
|
|
41236
41241
|
}
|
|
41237
41242
|
function registerRepoSecurityPlanTool(server, deps) {
|
|
41238
|
-
const
|
|
41243
|
+
const logger55 = deps.logger ?? createLogger({ tool: "repo_security_plan" });
|
|
41239
41244
|
const toolSchema = {
|
|
41240
41245
|
repo: z92.string().min(1).describe('GitHub repository in "owner/name" format or full URL'),
|
|
41241
41246
|
categories: z92.array(z92.string().max(50)).max(10).optional().describe('Filter to specific categories (e.g., ["sast", "sca", "secrets"])'),
|
|
@@ -41245,19 +41250,19 @@ function registerRepoSecurityPlanTool(server, deps) {
|
|
|
41245
41250
|
const secureHandler = createSecureHandler(handler, {
|
|
41246
41251
|
toolName: "repo_security_plan",
|
|
41247
41252
|
rateLimiter: deps.rateLimiter,
|
|
41248
|
-
logger:
|
|
41253
|
+
logger: logger55
|
|
41249
41254
|
});
|
|
41250
41255
|
const timeoutMs = getToolTimeout("repo_security_plan", deps.security);
|
|
41251
41256
|
const wrappedHandler = wrapToolWithTimeout("repo_security_plan", secureHandler, {
|
|
41252
41257
|
timeoutMs,
|
|
41253
|
-
logger:
|
|
41258
|
+
logger: logger55
|
|
41254
41259
|
});
|
|
41255
41260
|
server.registerTool(
|
|
41256
41261
|
"repo_security_plan",
|
|
41257
41262
|
{ description, inputSchema: toolSchema },
|
|
41258
41263
|
toSdkCallback(wrappedHandler)
|
|
41259
41264
|
);
|
|
41260
|
-
|
|
41265
|
+
logger55.info("Registered repo_security_plan tool");
|
|
41261
41266
|
}
|
|
41262
41267
|
|
|
41263
41268
|
// src/mcp/tools/search-codebase-tool.ts
|
|
@@ -41338,7 +41343,7 @@ ${output2}`);
|
|
|
41338
41343
|
}
|
|
41339
41344
|
}
|
|
41340
41345
|
function registerSearchCodebaseTool(server, deps) {
|
|
41341
|
-
const
|
|
41346
|
+
const logger55 = deps.logger ?? createLogger({ tool: "search_codebase" });
|
|
41342
41347
|
const toolSchema = {
|
|
41343
41348
|
query: z93.string().min(1).max(200).describe("Search query or file path"),
|
|
41344
41349
|
directory: z93.string().max(500).optional().describe("Directory to index"),
|
|
@@ -41349,16 +41354,16 @@ function registerSearchCodebaseTool(server, deps) {
|
|
|
41349
41354
|
const secureHandler = createSecureHandler(searchCodebaseHandler, {
|
|
41350
41355
|
toolName: "search_codebase",
|
|
41351
41356
|
rateLimiter: deps.rateLimiter,
|
|
41352
|
-
logger:
|
|
41357
|
+
logger: logger55
|
|
41353
41358
|
});
|
|
41354
41359
|
const timeoutMs = getToolTimeout("search_codebase", deps.security);
|
|
41355
|
-
const wrapped = wrapToolWithTimeout("search_codebase", secureHandler, { timeoutMs, logger:
|
|
41360
|
+
const wrapped = wrapToolWithTimeout("search_codebase", secureHandler, { timeoutMs, logger: logger55 });
|
|
41356
41361
|
server.registerTool(
|
|
41357
41362
|
"search_codebase",
|
|
41358
41363
|
{ description, inputSchema: toolSchema },
|
|
41359
41364
|
toSdkCallback(wrapped)
|
|
41360
41365
|
);
|
|
41361
|
-
|
|
41366
|
+
logger55.info("Registered search_codebase tool");
|
|
41362
41367
|
}
|
|
41363
41368
|
|
|
41364
41369
|
// src/mcp/tools/extract-symbols-tool.ts
|
|
@@ -41416,7 +41421,7 @@ async function extractSymbolsHandler(args, ctx) {
|
|
|
41416
41421
|
}
|
|
41417
41422
|
}
|
|
41418
41423
|
function registerExtractSymbolsTool(server, deps) {
|
|
41419
|
-
const
|
|
41424
|
+
const logger55 = deps.logger ?? createLogger({ tool: "extract_symbols" });
|
|
41420
41425
|
const toolSchema = {
|
|
41421
41426
|
filePath: z94.string().min(1).max(500).describe("Path to TypeScript/JavaScript file"),
|
|
41422
41427
|
mode: z94.enum(["index", "full"]).optional().describe("index (default): names+lines. full: includes source text")
|
|
@@ -41425,19 +41430,19 @@ function registerExtractSymbolsTool(server, deps) {
|
|
|
41425
41430
|
const secureHandler = createSecureHandler(extractSymbolsHandler, {
|
|
41426
41431
|
toolName: "extract_symbols",
|
|
41427
41432
|
rateLimiter: deps.rateLimiter,
|
|
41428
|
-
logger:
|
|
41433
|
+
logger: logger55
|
|
41429
41434
|
});
|
|
41430
41435
|
const timeoutMs = getToolTimeout("extract_symbols", deps.security);
|
|
41431
41436
|
const wrapped = wrapToolWithTimeout("extract_symbols", secureHandler, {
|
|
41432
41437
|
timeoutMs,
|
|
41433
|
-
logger:
|
|
41438
|
+
logger: logger55
|
|
41434
41439
|
});
|
|
41435
41440
|
server.registerTool(
|
|
41436
41441
|
"extract_symbols",
|
|
41437
41442
|
{ description, inputSchema: toolSchema },
|
|
41438
41443
|
toSdkCallback(wrapped)
|
|
41439
41444
|
);
|
|
41440
|
-
|
|
41445
|
+
logger55.info("Registered extract_symbols tool");
|
|
41441
41446
|
}
|
|
41442
41447
|
|
|
41443
41448
|
// src/mcp/tools/query-trace-tool.ts
|
|
@@ -41535,7 +41540,7 @@ function queryTraceHandler(args, ctx) {
|
|
|
41535
41540
|
});
|
|
41536
41541
|
}
|
|
41537
41542
|
function registerQueryTraceTool(server, deps) {
|
|
41538
|
-
const
|
|
41543
|
+
const logger55 = deps.logger ?? createLogger({ tool: "query_trace" });
|
|
41539
41544
|
const toolSchema = {
|
|
41540
41545
|
runId: z95.string().min(1).max(128).regex(/^[a-zA-Z0-9_-]+$/, "runId must be alphanumeric, hyphens, or underscores").describe("Run ID to query traces for"),
|
|
41541
41546
|
eventType: z95.string().max(100).regex(/^[a-zA-Z0-9._-]+$/).optional().describe("Filter by event type (e.g., model.called)"),
|
|
@@ -41545,16 +41550,16 @@ function registerQueryTraceTool(server, deps) {
|
|
|
41545
41550
|
const secureHandler = createSecureHandler(queryTraceHandler, {
|
|
41546
41551
|
toolName: "query_trace",
|
|
41547
41552
|
rateLimiter: deps.rateLimiter,
|
|
41548
|
-
logger:
|
|
41553
|
+
logger: logger55
|
|
41549
41554
|
});
|
|
41550
41555
|
const timeoutMs = getToolTimeout("query_trace", deps.security);
|
|
41551
|
-
const wrappedHandler = wrapToolWithTimeout("query_trace", secureHandler, { timeoutMs, logger:
|
|
41556
|
+
const wrappedHandler = wrapToolWithTimeout("query_trace", secureHandler, { timeoutMs, logger: logger55 });
|
|
41552
41557
|
server.registerTool(
|
|
41553
41558
|
"query_trace",
|
|
41554
41559
|
{ description, inputSchema: toolSchema },
|
|
41555
41560
|
toSdkCallback(wrappedHandler)
|
|
41556
41561
|
);
|
|
41557
|
-
|
|
41562
|
+
logger55.info("Registered query_trace tool");
|
|
41558
41563
|
}
|
|
41559
41564
|
|
|
41560
41565
|
// src/pipeline/stage-types.ts
|
|
@@ -44017,7 +44022,7 @@ function queryTaskStateHandler(args, ctx) {
|
|
|
44017
44022
|
return Promise.resolve(toolSuccess(JSON.stringify(response, null, 2)));
|
|
44018
44023
|
}
|
|
44019
44024
|
function registerQueryTaskStateTool(server, deps) {
|
|
44020
|
-
const
|
|
44025
|
+
const logger55 = deps.logger ?? createLogger({ tool: "query_task_state" });
|
|
44021
44026
|
const toolSchema = {
|
|
44022
44027
|
taskId: z100.string().min(1).max(128).describe("Task ID whose structured state log should be read")
|
|
44023
44028
|
};
|
|
@@ -44025,19 +44030,19 @@ function registerQueryTaskStateTool(server, deps) {
|
|
|
44025
44030
|
const secureHandler = createSecureHandler(queryTaskStateHandler, {
|
|
44026
44031
|
toolName: "query_task_state",
|
|
44027
44032
|
rateLimiter: deps.rateLimiter,
|
|
44028
|
-
logger:
|
|
44033
|
+
logger: logger55
|
|
44029
44034
|
});
|
|
44030
44035
|
const timeoutMs = getToolTimeout("query_task_state", deps.security);
|
|
44031
44036
|
const wrappedHandler = wrapToolWithTimeout("query_task_state", secureHandler, {
|
|
44032
44037
|
timeoutMs,
|
|
44033
|
-
logger:
|
|
44038
|
+
logger: logger55
|
|
44034
44039
|
});
|
|
44035
44040
|
server.registerTool(
|
|
44036
44041
|
"query_task_state",
|
|
44037
44042
|
{ description, inputSchema: toolSchema },
|
|
44038
44043
|
toSdkCallback(wrappedHandler)
|
|
44039
44044
|
);
|
|
44040
|
-
|
|
44045
|
+
logger55.info("Registered query_task_state tool");
|
|
44041
44046
|
}
|
|
44042
44047
|
|
|
44043
44048
|
// src/mcp/tools/pipeline-tool.ts
|
|
@@ -44521,9 +44526,9 @@ function wrapWithObservability(toolName, cb, eventBus) {
|
|
|
44521
44526
|
|
|
44522
44527
|
// src/mcp/tools/index.ts
|
|
44523
44528
|
function registerTools(server, options) {
|
|
44524
|
-
const
|
|
44525
|
-
const rateLimiter = options?.rateLimiter ?? createDefaultRateLimiter("mcp-tools",
|
|
44526
|
-
|
|
44529
|
+
const logger55 = options?.logger ?? createMcpLogger({ component: "tools" });
|
|
44530
|
+
const rateLimiter = options?.rateLimiter ?? createDefaultRateLimiter("mcp-tools", logger55);
|
|
44531
|
+
logger55.info("Tool registration infrastructure initialized");
|
|
44527
44532
|
void server;
|
|
44528
44533
|
return {
|
|
44529
44534
|
tools: [
|
|
@@ -44559,7 +44564,7 @@ function registerTools(server, options) {
|
|
|
44559
44564
|
"run_dev_pipeline",
|
|
44560
44565
|
"run_pipeline"
|
|
44561
44566
|
],
|
|
44562
|
-
logger:
|
|
44567
|
+
logger: logger55,
|
|
44563
44568
|
rateLimiter
|
|
44564
44569
|
};
|
|
44565
44570
|
}
|
|
@@ -44572,32 +44577,32 @@ var TIER_NAMES = {
|
|
|
44572
44577
|
};
|
|
44573
44578
|
function createGateway(config = {}) {
|
|
44574
44579
|
const enabled = config.enabled !== false;
|
|
44575
|
-
const
|
|
44580
|
+
const logger55 = config.logger ?? createLogger({ component: "gateway" });
|
|
44576
44581
|
const overrides = config.tierOverrides;
|
|
44577
44582
|
return {
|
|
44578
44583
|
enabled,
|
|
44579
44584
|
wrapTool(toolName, handler2) {
|
|
44580
44585
|
if (!enabled) return handler2;
|
|
44581
|
-
return createGatewayHandler(toolName, handler2,
|
|
44586
|
+
return createGatewayHandler(toolName, handler2, logger55, overrides);
|
|
44582
44587
|
}
|
|
44583
44588
|
};
|
|
44584
44589
|
}
|
|
44585
|
-
function createGatewayHandler(toolName, handler2,
|
|
44590
|
+
function createGatewayHandler(toolName, handler2, logger55, overrides) {
|
|
44586
44591
|
return async (args) => {
|
|
44587
44592
|
const params = asRecord2(args);
|
|
44588
44593
|
const tier = classifyRequestTier(toolName, params, overrides);
|
|
44589
44594
|
const tierName = TIER_NAMES[tier];
|
|
44590
44595
|
const startMs = getTimeProvider().now();
|
|
44591
|
-
|
|
44596
|
+
logger55.debug("Gateway dispatch", { tool: toolName, tier, tierName });
|
|
44592
44597
|
try {
|
|
44593
44598
|
const result = await handler2(args);
|
|
44594
44599
|
const durationMs = getTimeProvider().now() - startMs;
|
|
44595
44600
|
const success = result.isError !== true;
|
|
44596
44601
|
const entry = { tool: toolName, tier, tierName, durationMs, success };
|
|
44597
44602
|
if (success) {
|
|
44598
|
-
|
|
44603
|
+
logger55.info("Gateway completed", { ...entry });
|
|
44599
44604
|
} else {
|
|
44600
|
-
|
|
44605
|
+
logger55.warn("Gateway completed with error", { ...entry });
|
|
44601
44606
|
}
|
|
44602
44607
|
return result;
|
|
44603
44608
|
} catch (error) {
|
|
@@ -44609,7 +44614,7 @@ function createGatewayHandler(toolName, handler2, logger54, overrides) {
|
|
|
44609
44614
|
durationMs,
|
|
44610
44615
|
success: false
|
|
44611
44616
|
};
|
|
44612
|
-
|
|
44617
|
+
logger55.error("Gateway handler threw", error instanceof Error ? error : void 0, {
|
|
44613
44618
|
...entry
|
|
44614
44619
|
});
|
|
44615
44620
|
throw error;
|
|
@@ -47042,7 +47047,7 @@ var FileAuditStorage = class _FileAuditStorage {
|
|
|
47042
47047
|
* @param logger - Optional logger instance
|
|
47043
47048
|
* @returns Result with FileAuditStorage or SecurityError
|
|
47044
47049
|
*/
|
|
47045
|
-
static create(config,
|
|
47050
|
+
static create(config, logger55) {
|
|
47046
47051
|
const validation = config.allowedRoot !== void 0 ? validateLogDir(config.logDir, config.allowedRoot) : validateLogDirBasic(config.logDir);
|
|
47047
47052
|
if (!validation.ok) {
|
|
47048
47053
|
return { ok: false, error: validation.error };
|
|
@@ -47051,7 +47056,7 @@ var FileAuditStorage = class _FileAuditStorage {
|
|
|
47051
47056
|
...config,
|
|
47052
47057
|
logDir: validation.value
|
|
47053
47058
|
};
|
|
47054
|
-
return { ok: true, value: new _FileAuditStorage(validatedConfig,
|
|
47059
|
+
return { ok: true, value: new _FileAuditStorage(validatedConfig, logger55, true) };
|
|
47055
47060
|
}
|
|
47056
47061
|
/**
|
|
47057
47062
|
* Constructor for FileAuditStorage.
|
|
@@ -47064,8 +47069,8 @@ var FileAuditStorage = class _FileAuditStorage {
|
|
|
47064
47069
|
* @param skipValidation - Internal flag, set by create() after validation
|
|
47065
47070
|
* @throws SecurityError if path validation fails and skipValidation is false
|
|
47066
47071
|
*/
|
|
47067
|
-
constructor(config,
|
|
47068
|
-
this.logger =
|
|
47072
|
+
constructor(config, logger55, skipValidation = false) {
|
|
47073
|
+
this.logger = logger55 ?? createLogger({ component: "FileAuditStorage" });
|
|
47069
47074
|
if (!skipValidation) {
|
|
47070
47075
|
const validation = validateLogDirBasic(config.logDir);
|
|
47071
47076
|
if (!validation.ok) {
|
|
@@ -47246,13 +47251,13 @@ var AuditLogger = class {
|
|
|
47246
47251
|
flushTimer = null;
|
|
47247
47252
|
flushIntervalMs;
|
|
47248
47253
|
closed = false;
|
|
47249
|
-
constructor(config, storage,
|
|
47254
|
+
constructor(config, storage, logger55) {
|
|
47250
47255
|
const validated = AuditLogConfigSchema.safeParse(config);
|
|
47251
47256
|
if (!validated.success) {
|
|
47252
47257
|
const issues = validated.error.issues.map((i) => i.path.join(".") + ": " + i.message).join("; ");
|
|
47253
47258
|
throw new AuditError("Invalid AuditLogConfig: " + issues);
|
|
47254
47259
|
}
|
|
47255
|
-
this.logger =
|
|
47260
|
+
this.logger = logger55 ?? createLogger({ component: "AuditLogger" });
|
|
47256
47261
|
this.enableHashChain = validated.data.enableHashChain;
|
|
47257
47262
|
this.minSeverity = validated.data.minSeverity;
|
|
47258
47263
|
this.categories = validated.data.categories;
|
|
@@ -47425,8 +47430,8 @@ var AuditLogger = class {
|
|
|
47425
47430
|
this.logger.info("AuditLogger closed");
|
|
47426
47431
|
}
|
|
47427
47432
|
};
|
|
47428
|
-
function createAuditLogger(config, storage,
|
|
47429
|
-
return new AuditLogger(config, storage,
|
|
47433
|
+
function createAuditLogger(config, storage, logger55) {
|
|
47434
|
+
return new AuditLogger(config, storage, logger55);
|
|
47430
47435
|
}
|
|
47431
47436
|
|
|
47432
47437
|
// src/security/sandbox/sandbox-types.ts
|
|
@@ -49454,6 +49459,124 @@ function buildSuccessResult(instance2, patch, modelName, startTime, state) {
|
|
|
49454
49459
|
};
|
|
49455
49460
|
}
|
|
49456
49461
|
|
|
49462
|
+
// src/swe-bench/verify-loop.ts
|
|
49463
|
+
var DEFAULT_MAX_VERIFY_RETRIES = 2;
|
|
49464
|
+
var FAILURE_PATTERNS = [
|
|
49465
|
+
{
|
|
49466
|
+
category: "patch_not_applicable",
|
|
49467
|
+
regex: /patch .*?does not apply|hunk #\d+ FAILED|Reversed .*patch detected/i,
|
|
49468
|
+
summarizer: (m) => `Patch did not apply cleanly: ${m[0]}`
|
|
49469
|
+
},
|
|
49470
|
+
{
|
|
49471
|
+
category: "syntax_error",
|
|
49472
|
+
regex: /SyntaxError: (.*?)(?:\n|$)|IndentationError: (.*?)(?:\n|$)/,
|
|
49473
|
+
summarizer: (m) => `Syntax error in generated patch: ${m[1] ?? m[2] ?? m[0]}`.trim()
|
|
49474
|
+
},
|
|
49475
|
+
{
|
|
49476
|
+
category: "timeout",
|
|
49477
|
+
regex: /Timeout\b|timed out after \d+\s?s\b|TIMEOUT_EXCEEDED/i,
|
|
49478
|
+
summarizer: (m) => `Test run exceeded timeout: ${m[0]}`
|
|
49479
|
+
},
|
|
49480
|
+
{
|
|
49481
|
+
category: "missing_dependency",
|
|
49482
|
+
regex: /ModuleNotFoundError: No module named '([^']+)'|ImportError: cannot import name '([^']+)'|No module named "([^"]+)"/,
|
|
49483
|
+
summarizer: (m) => `Missing dependency: ${m[1] ?? m[2] ?? m[3] ?? "unknown"}. Patch may need an import.`
|
|
49484
|
+
},
|
|
49485
|
+
{
|
|
49486
|
+
category: "runtime_error",
|
|
49487
|
+
regex: /([A-Z][a-zA-Z]+Error): (.*?)(?:\n|$)/,
|
|
49488
|
+
summarizer: (m) => `Runtime error ${m[1] ?? ""}: ${m[2] ?? ""}`.trim()
|
|
49489
|
+
},
|
|
49490
|
+
{
|
|
49491
|
+
category: "test_failure",
|
|
49492
|
+
regex: /FAILED .*?::(\S+)|AssertionError|FAIL: (\S+)/,
|
|
49493
|
+
summarizer: (_m, stderr, stdout) => {
|
|
49494
|
+
const failed = extractFailedTests(stderr, stdout);
|
|
49495
|
+
return failed.length > 0 ? `Tests still failing: ${failed.slice(0, 5).join(", ")}` : "One or more tests failed after patch";
|
|
49496
|
+
}
|
|
49497
|
+
}
|
|
49498
|
+
];
|
|
49499
|
+
function classifyPatchFailure(stderr, stdout) {
|
|
49500
|
+
const haystack = `${stderr}
|
|
49501
|
+
${stdout}`;
|
|
49502
|
+
for (const pattern of FAILURE_PATTERNS) {
|
|
49503
|
+
const match = pattern.regex.exec(haystack);
|
|
49504
|
+
if (match !== null) {
|
|
49505
|
+
return {
|
|
49506
|
+
category: pattern.category,
|
|
49507
|
+
summary: pattern.summarizer(match, stderr, stdout),
|
|
49508
|
+
affectedTests: extractFailedTests(stderr, stdout)
|
|
49509
|
+
};
|
|
49510
|
+
}
|
|
49511
|
+
}
|
|
49512
|
+
return {
|
|
49513
|
+
category: "unknown",
|
|
49514
|
+
summary: haystack.trim().slice(0, 200) || "No failure details captured",
|
|
49515
|
+
affectedTests: extractFailedTests(stderr, stdout)
|
|
49516
|
+
};
|
|
49517
|
+
}
|
|
49518
|
+
function extractFailedTests(stderr, stdout) {
|
|
49519
|
+
const combined = `${stderr}
|
|
49520
|
+
${stdout}`;
|
|
49521
|
+
const results = /* @__PURE__ */ new Set();
|
|
49522
|
+
const pytestPattern = /FAILED (\S+::\S+)/g;
|
|
49523
|
+
let match;
|
|
49524
|
+
while ((match = pytestPattern.exec(combined)) !== null) {
|
|
49525
|
+
if (match[1] !== void 0) results.add(match[1]);
|
|
49526
|
+
}
|
|
49527
|
+
const unittestPattern = /FAIL: (\S+) \(/g;
|
|
49528
|
+
while ((match = unittestPattern.exec(combined)) !== null) {
|
|
49529
|
+
if (match[1] !== void 0) results.add(match[1]);
|
|
49530
|
+
}
|
|
49531
|
+
return Array.from(results);
|
|
49532
|
+
}
|
|
49533
|
+
var ALWAYS_RETRYABLE = /* @__PURE__ */ new Set([
|
|
49534
|
+
"patch_not_applicable",
|
|
49535
|
+
"syntax_error",
|
|
49536
|
+
"missing_dependency",
|
|
49537
|
+
"test_failure",
|
|
49538
|
+
"runtime_error",
|
|
49539
|
+
"incomplete_fix"
|
|
49540
|
+
]);
|
|
49541
|
+
var NEVER_RETRYABLE = /* @__PURE__ */ new Set(["timeout"]);
|
|
49542
|
+
function shouldRetry(category, iteration, maxRetries = DEFAULT_MAX_VERIFY_RETRIES) {
|
|
49543
|
+
if (iteration >= maxRetries) return false;
|
|
49544
|
+
if (NEVER_RETRYABLE.has(category)) return false;
|
|
49545
|
+
if (ALWAYS_RETRYABLE.has(category)) return true;
|
|
49546
|
+
return iteration < 1;
|
|
49547
|
+
}
|
|
49548
|
+
function buildRetryHint(classification, iteration, maxRetries = DEFAULT_MAX_VERIFY_RETRIES) {
|
|
49549
|
+
const header = `Verification attempt ${String(iteration + 1)}/${String(maxRetries + 1)} failed.`;
|
|
49550
|
+
const bodyLines = [
|
|
49551
|
+
header,
|
|
49552
|
+
`Category: ${classification.category}`,
|
|
49553
|
+
`Summary: ${classification.summary}`
|
|
49554
|
+
];
|
|
49555
|
+
if (classification.affectedTests.length > 0) {
|
|
49556
|
+
const count = String(classification.affectedTests.length);
|
|
49557
|
+
const names = classification.affectedTests.slice(0, 5).join(", ");
|
|
49558
|
+
const overflow = classification.affectedTests.length > 5 ? ", ..." : "";
|
|
49559
|
+
bodyLines.push(`Affected tests (${count}): ${names}${overflow}`);
|
|
49560
|
+
}
|
|
49561
|
+
bodyLines.push("Fix the root cause, not the symptom. Re-emit the full patch.");
|
|
49562
|
+
return bodyLines.join("\n");
|
|
49563
|
+
}
|
|
49564
|
+
function buildVerifyOutcome(params) {
|
|
49565
|
+
const maxRetries = params.maxRetries ?? DEFAULT_MAX_VERIFY_RETRIES;
|
|
49566
|
+
if (params.passed) {
|
|
49567
|
+
return { ok: true, iteration: params.iteration, willRetry: false };
|
|
49568
|
+
}
|
|
49569
|
+
const classification = classifyPatchFailure(params.stderr, params.stdout);
|
|
49570
|
+
const willRetry = shouldRetry(classification.category, params.iteration, maxRetries);
|
|
49571
|
+
return {
|
|
49572
|
+
ok: false,
|
|
49573
|
+
iteration: params.iteration,
|
|
49574
|
+
classification,
|
|
49575
|
+
retryHint: buildRetryHint(classification, params.iteration, maxRetries),
|
|
49576
|
+
willRetry
|
|
49577
|
+
};
|
|
49578
|
+
}
|
|
49579
|
+
|
|
49457
49580
|
// src/swe-bench/agent-runner.ts
|
|
49458
49581
|
async function runIteration(opts) {
|
|
49459
49582
|
const { executor, context, previousError, previousPatch, systemPromptOverride, contextSummary } = opts;
|
|
@@ -49558,7 +49681,10 @@ async function runAgentOnInstance(instance2, options) {
|
|
|
49558
49681
|
startTime,
|
|
49559
49682
|
onMessage,
|
|
49560
49683
|
systemPrompt: options.systemPrompt,
|
|
49561
|
-
iterationContext: createEmptyContext()
|
|
49684
|
+
iterationContext: createEmptyContext(),
|
|
49685
|
+
verifyAttempts: 0,
|
|
49686
|
+
...options.verifyAdapter !== void 0 ? { verifyAdapter: options.verifyAdapter } : {},
|
|
49687
|
+
...options.maxVerifyRetries !== void 0 ? { maxVerifyRetries: options.maxVerifyRetries } : {}
|
|
49562
49688
|
};
|
|
49563
49689
|
const result = await runIterationLoop(executor, context, state, loopOptions);
|
|
49564
49690
|
return { ok: true, value: result };
|
|
@@ -49609,6 +49735,54 @@ function buildDuplicateResult(instanceId, startTime, state, onMessage) {
|
|
|
49609
49735
|
onMessage?.("Duplicate patch detected, terminating early");
|
|
49610
49736
|
return buildFailedResult(instanceId, "Duplicate patch \u2014 agent is stuck", startTime, state);
|
|
49611
49737
|
}
|
|
49738
|
+
async function invokeVerifyAdapter(adapter, patch, context, options) {
|
|
49739
|
+
const { passed, stderr, stdout } = await adapter.verify(context.instance, patch, context.workDir);
|
|
49740
|
+
return buildVerifyOutcome({
|
|
49741
|
+
passed,
|
|
49742
|
+
iteration: options.verifyAttempts - 1,
|
|
49743
|
+
stderr,
|
|
49744
|
+
stdout,
|
|
49745
|
+
...options.maxVerifyRetries !== void 0 ? { maxRetries: options.maxVerifyRetries } : {}
|
|
49746
|
+
});
|
|
49747
|
+
}
|
|
49748
|
+
function applyVerifyRetry(outcome, state, onMessage) {
|
|
49749
|
+
const category = outcome.classification?.category ?? "unknown";
|
|
49750
|
+
onMessage?.(`Verify failed (${category}); retrying with hint`);
|
|
49751
|
+
state.lastError = outcome.retryHint ?? "Verification failed; re-emit the patch";
|
|
49752
|
+
state.lastPatch = state.finalPatch;
|
|
49753
|
+
state.finalPatch = void 0;
|
|
49754
|
+
}
|
|
49755
|
+
async function runPostPatchVerify(context, state, options) {
|
|
49756
|
+
const adapter = options.verifyAdapter;
|
|
49757
|
+
if (adapter === void 0 || state.finalPatch === void 0) return true;
|
|
49758
|
+
options.verifyAttempts += 1;
|
|
49759
|
+
options.onMessage?.(`Verifying patch (attempt ${String(options.verifyAttempts)})`);
|
|
49760
|
+
const outcome = await invokeVerifyAdapter(adapter, state.finalPatch, context, options);
|
|
49761
|
+
if (outcome.ok) return true;
|
|
49762
|
+
if (!outcome.willRetry) {
|
|
49763
|
+
const category = outcome.classification?.category ?? "unknown";
|
|
49764
|
+
options.onMessage?.(`Verify failed (${category}); no more retries`);
|
|
49765
|
+
return true;
|
|
49766
|
+
}
|
|
49767
|
+
applyVerifyRetry(outcome, state, options.onMessage);
|
|
49768
|
+
return false;
|
|
49769
|
+
}
|
|
49770
|
+
async function handleIterationDone(context, state, options, seenPatches) {
|
|
49771
|
+
if (isDuplicatePatch(state.finalPatch, seenPatches)) {
|
|
49772
|
+
state.finalPatch = void 0;
|
|
49773
|
+
return {
|
|
49774
|
+
result: buildDuplicateResult(
|
|
49775
|
+
context.instance.instance_id,
|
|
49776
|
+
options.startTime,
|
|
49777
|
+
state,
|
|
49778
|
+
options.onMessage
|
|
49779
|
+
)
|
|
49780
|
+
};
|
|
49781
|
+
}
|
|
49782
|
+
options.onMessage?.("Patch applies successfully");
|
|
49783
|
+
const verifyOk = await runPostPatchVerify(context, state, options);
|
|
49784
|
+
return verifyOk ? "break" : "continue";
|
|
49785
|
+
}
|
|
49612
49786
|
async function runIterationLoop(executor, context, state, options) {
|
|
49613
49787
|
const { config, startTime, onMessage } = options;
|
|
49614
49788
|
const seenPatches = /* @__PURE__ */ new Set();
|
|
@@ -49619,12 +49793,10 @@ async function runIterationLoop(executor, context, state, options) {
|
|
|
49619
49793
|
onMessage?.(`Iteration ${state.iterations.toString()}/${config.max_iterations.toString()}`);
|
|
49620
49794
|
const done = await executeOneIteration(executor, context, state, options);
|
|
49621
49795
|
if (done) {
|
|
49622
|
-
|
|
49623
|
-
|
|
49624
|
-
|
|
49625
|
-
|
|
49626
|
-
onMessage?.("Patch applies successfully");
|
|
49627
|
-
break;
|
|
49796
|
+
const control = await handleIterationDone(context, state, options, seenPatches);
|
|
49797
|
+
if (control === "break") break;
|
|
49798
|
+
if (control === "continue") continue;
|
|
49799
|
+
return control.result;
|
|
49628
49800
|
}
|
|
49629
49801
|
if (isDuplicatePatch(state.lastPatch, seenPatches)) {
|
|
49630
49802
|
return buildDuplicateResult(context.instance.instance_id, startTime, state, onMessage);
|
|
@@ -49657,6 +49829,73 @@ function createMockExecutor(responses) {
|
|
|
49657
49829
|
};
|
|
49658
49830
|
}
|
|
49659
49831
|
|
|
49832
|
+
// src/swe-bench/harness-verify-adapter.ts
|
|
49833
|
+
var logger51 = createLogger({ component: "harness-verify-adapter" });
|
|
49834
|
+
function translateEvaluationResult(result) {
|
|
49835
|
+
const stderr = buildStderr(result);
|
|
49836
|
+
const stdout = buildStdout(result);
|
|
49837
|
+
return {
|
|
49838
|
+
passed: result.resolved,
|
|
49839
|
+
stderr,
|
|
49840
|
+
stdout
|
|
49841
|
+
};
|
|
49842
|
+
}
|
|
49843
|
+
function buildStderr(result) {
|
|
49844
|
+
if (!result.patchApplied) {
|
|
49845
|
+
return `patch does not apply: ${result.patchError ?? "unknown error"}`;
|
|
49846
|
+
}
|
|
49847
|
+
if (result.status === "timeout") {
|
|
49848
|
+
return `Test run timed out after ${String(result.durationMs)}ms`;
|
|
49849
|
+
}
|
|
49850
|
+
if (result.status === "error") {
|
|
49851
|
+
return `Runtime error during evaluation: ${result.patchError ?? "unknown"}`;
|
|
49852
|
+
}
|
|
49853
|
+
const failed = result.testResults.filter((t) => t.status === "failed");
|
|
49854
|
+
if (failed.length === 0) return "";
|
|
49855
|
+
const lines = failed.slice(0, 20).map((t) => `FAILED ${t.testName}${t.errorMessage !== void 0 ? `: ${t.errorMessage}` : ""}`);
|
|
49856
|
+
return lines.join("\n");
|
|
49857
|
+
}
|
|
49858
|
+
function buildStdout(result) {
|
|
49859
|
+
const summary = [
|
|
49860
|
+
`Instance: ${result.instanceId}`,
|
|
49861
|
+
`Status: ${result.status}`,
|
|
49862
|
+
`Patch applied: ${String(result.patchApplied)}`,
|
|
49863
|
+
`Tests: ${String(result.testsPassed)}/${String(result.testsTotal)} passed`,
|
|
49864
|
+
`Duration: ${String(result.durationMs)}ms`
|
|
49865
|
+
];
|
|
49866
|
+
if (result.testsFailed > 0) summary.push(`Failed: ${String(result.testsFailed)}`);
|
|
49867
|
+
return summary.join("\n");
|
|
49868
|
+
}
|
|
49869
|
+
var HarnessVerifyAdapter = class {
|
|
49870
|
+
constructor(harness, modelNameOrPath, evalConfig) {
|
|
49871
|
+
this.harness = harness;
|
|
49872
|
+
this.modelNameOrPath = modelNameOrPath;
|
|
49873
|
+
this.evalConfig = evalConfig;
|
|
49874
|
+
}
|
|
49875
|
+
async verify(instance2, patch, _workDir) {
|
|
49876
|
+
const prediction = {
|
|
49877
|
+
instance_id: instance2.instance_id,
|
|
49878
|
+
model_name_or_path: this.modelNameOrPath,
|
|
49879
|
+
model_patch: patch
|
|
49880
|
+
};
|
|
49881
|
+
try {
|
|
49882
|
+
const result = await this.harness.evaluateInstance(prediction, this.evalConfig);
|
|
49883
|
+
return translateEvaluationResult(result);
|
|
49884
|
+
} catch (cause) {
|
|
49885
|
+
const msg = cause instanceof Error ? cause.message : String(cause);
|
|
49886
|
+
logger51.warn("Harness verify failed, treating as unresolved", {
|
|
49887
|
+
instanceId: instance2.instance_id,
|
|
49888
|
+
error: msg
|
|
49889
|
+
});
|
|
49890
|
+
return {
|
|
49891
|
+
passed: false,
|
|
49892
|
+
stderr: `Harness evaluation failed: ${msg}`,
|
|
49893
|
+
stdout: ""
|
|
49894
|
+
};
|
|
49895
|
+
}
|
|
49896
|
+
}
|
|
49897
|
+
};
|
|
49898
|
+
|
|
49660
49899
|
// src/swe-bench/nexus-agent-executor.ts
|
|
49661
49900
|
var EXECUTOR_DEFAULTS = {
|
|
49662
49901
|
modelId: getCliModelName(getDefaultModelForCli("claude")),
|
|
@@ -50674,8 +50913,8 @@ async function safeExec(command, timeoutMs = COMMAND_TIMEOUT_MS) {
|
|
|
50674
50913
|
function bytesToGB(bytes) {
|
|
50675
50914
|
return (bytes / BYTES_PER_GB).toFixed(1);
|
|
50676
50915
|
}
|
|
50677
|
-
async function validatePython(
|
|
50678
|
-
const log3 =
|
|
50916
|
+
async function validatePython(logger55) {
|
|
50917
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50679
50918
|
const pythonCommands = ["python3", "python3.11", "python3.10", "python"];
|
|
50680
50919
|
for (const cmd of pythonCommands) {
|
|
50681
50920
|
const result = await safeExec(`${cmd} --version`);
|
|
@@ -50699,8 +50938,8 @@ async function validatePython(logger54) {
|
|
|
50699
50938
|
log3.warn("No compatible Python found (need 3.10 or 3.11)");
|
|
50700
50939
|
return { available: false };
|
|
50701
50940
|
}
|
|
50702
|
-
async function validateSwebench(
|
|
50703
|
-
const log3 =
|
|
50941
|
+
async function validateSwebench(logger55) {
|
|
50942
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50704
50943
|
const result = await safeExec('python3 -c "import swebench; print(swebench.__version__)"');
|
|
50705
50944
|
const importVersion = result?.stdout.trim();
|
|
50706
50945
|
if (importVersion !== void 0 && importVersion !== "") {
|
|
@@ -50720,8 +50959,8 @@ async function validateSwebench(logger54) {
|
|
|
50720
50959
|
log3.warn("swebench package not found");
|
|
50721
50960
|
return { installed: false };
|
|
50722
50961
|
}
|
|
50723
|
-
async function validateDocker(
|
|
50724
|
-
const log3 =
|
|
50962
|
+
async function validateDocker(logger55) {
|
|
50963
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50725
50964
|
const versionResult = await safeExec('docker version --format "{{.Server.Version}}"');
|
|
50726
50965
|
if (!versionResult) {
|
|
50727
50966
|
log3.warn("Docker not available or daemon not running");
|
|
@@ -50744,8 +50983,8 @@ async function validateDocker(logger54) {
|
|
|
50744
50983
|
log3.warn("Docker daemon not running");
|
|
50745
50984
|
return { running: false };
|
|
50746
50985
|
}
|
|
50747
|
-
async function validateDiskSpace(
|
|
50748
|
-
const log3 =
|
|
50986
|
+
async function validateDiskSpace(logger55) {
|
|
50987
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50749
50988
|
const result = await safeExec("df -B1 . | tail -1");
|
|
50750
50989
|
if (!result) {
|
|
50751
50990
|
log3.warn("Could not determine disk space");
|
|
@@ -50796,8 +51035,8 @@ function collectWarnings(diskSpace) {
|
|
|
50796
51035
|
}
|
|
50797
51036
|
|
|
50798
51037
|
// src/swe-bench/environment-validator.ts
|
|
50799
|
-
async function validateEnvironment(
|
|
50800
|
-
const log3 =
|
|
51038
|
+
async function validateEnvironment(logger55) {
|
|
51039
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50801
51040
|
log3.info("Validating SWE-bench environment");
|
|
50802
51041
|
const [python, swebench, docker, diskSpace] = await Promise.all([
|
|
50803
51042
|
validatePython(log3),
|
|
@@ -50925,7 +51164,7 @@ function mapResolutionStatus(raw) {
|
|
|
50925
51164
|
import { exec as exec2 } from "child_process";
|
|
50926
51165
|
import { promisify as promisify6 } from "util";
|
|
50927
51166
|
var execAsync2 = promisify6(exec2);
|
|
50928
|
-
async function getSwebenchVersion(
|
|
51167
|
+
async function getSwebenchVersion(logger55) {
|
|
50929
51168
|
try {
|
|
50930
51169
|
const result = await execAsync2(
|
|
50931
51170
|
`${PYTHON_COMMAND} -c "import swebench; print(swebench.__version__)"`,
|
|
@@ -50933,15 +51172,15 @@ async function getSwebenchVersion(logger54) {
|
|
|
50933
51172
|
);
|
|
50934
51173
|
const version = result.stdout.trim();
|
|
50935
51174
|
if (version) {
|
|
50936
|
-
|
|
51175
|
+
logger55?.debug("swebench version detected", { version });
|
|
50937
51176
|
return version;
|
|
50938
51177
|
}
|
|
50939
51178
|
} catch (err2) {
|
|
50940
|
-
|
|
51179
|
+
logger55?.debug("Failed to get swebench version", { error: String(err2) });
|
|
50941
51180
|
}
|
|
50942
51181
|
return null;
|
|
50943
51182
|
}
|
|
50944
|
-
async function getPythonVersion(
|
|
51183
|
+
async function getPythonVersion(logger55) {
|
|
50945
51184
|
try {
|
|
50946
51185
|
const result = await execAsync2(`${PYTHON_COMMAND} --version`, {
|
|
50947
51186
|
timeout: QUICK_COMMAND_TIMEOUT_MS,
|
|
@@ -50949,15 +51188,15 @@ async function getPythonVersion(logger54) {
|
|
|
50949
51188
|
});
|
|
50950
51189
|
const match = result.stdout.trim().match(/Python\s+(\d+\.\d+\.\d+)/);
|
|
50951
51190
|
if (match?.[1] !== void 0) {
|
|
50952
|
-
|
|
51191
|
+
logger55?.debug("Python version detected", { version: match[1] });
|
|
50953
51192
|
return match[1];
|
|
50954
51193
|
}
|
|
50955
51194
|
} catch (err2) {
|
|
50956
|
-
|
|
51195
|
+
logger55?.debug("Failed to get Python version", { error: String(err2) });
|
|
50957
51196
|
}
|
|
50958
51197
|
return null;
|
|
50959
51198
|
}
|
|
50960
|
-
async function getDockerVersion(
|
|
51199
|
+
async function getDockerVersion(logger55) {
|
|
50961
51200
|
try {
|
|
50962
51201
|
const result = await execAsync2('docker version --format "{{.Server.Version}}"', {
|
|
50963
51202
|
timeout: QUICK_COMMAND_TIMEOUT_MS,
|
|
@@ -50965,27 +51204,27 @@ async function getDockerVersion(logger54) {
|
|
|
50965
51204
|
});
|
|
50966
51205
|
const version = result.stdout.trim();
|
|
50967
51206
|
if (version) {
|
|
50968
|
-
|
|
51207
|
+
logger55?.debug("Docker version detected", { version });
|
|
50969
51208
|
return version;
|
|
50970
51209
|
}
|
|
50971
51210
|
} catch (err2) {
|
|
50972
|
-
|
|
51211
|
+
logger55?.debug("Failed to get Docker version", { error: String(err2) });
|
|
50973
51212
|
}
|
|
50974
51213
|
return null;
|
|
50975
51214
|
}
|
|
50976
51215
|
|
|
50977
51216
|
// src/swe-bench/harness-output-parsing.ts
|
|
50978
51217
|
import * as fs12 from "fs/promises";
|
|
50979
|
-
function parseHarnessOutput(output2,
|
|
51218
|
+
function parseHarnessOutput(output2, logger55) {
|
|
50980
51219
|
try {
|
|
50981
51220
|
const parsed = JSON.parse(output2);
|
|
50982
51221
|
if (!isValidHarnessOutput(parsed)) {
|
|
50983
|
-
|
|
51222
|
+
logger55?.warn("Invalid harness output structure");
|
|
50984
51223
|
return null;
|
|
50985
51224
|
}
|
|
50986
51225
|
return parsed;
|
|
50987
51226
|
} catch (err2) {
|
|
50988
|
-
|
|
51227
|
+
logger55?.warn("Failed to parse harness output", { error: String(err2) });
|
|
50989
51228
|
return null;
|
|
50990
51229
|
}
|
|
50991
51230
|
}
|
|
@@ -50994,12 +51233,12 @@ function isValidHarnessOutput(obj) {
|
|
|
50994
51233
|
const o = obj;
|
|
50995
51234
|
return typeof o.run_id === "string" && typeof o.dataset_name === "string" && typeof o.model_name_or_path === "string" && Array.isArray(o.instance_results);
|
|
50996
51235
|
}
|
|
50997
|
-
async function parseHarnessLogFile(logPath,
|
|
51236
|
+
async function parseHarnessLogFile(logPath, logger55) {
|
|
50998
51237
|
try {
|
|
50999
51238
|
const content = await fs12.readFile(logPath, "utf-8");
|
|
51000
|
-
return parseHarnessOutput(content,
|
|
51239
|
+
return parseHarnessOutput(content, logger55);
|
|
51001
51240
|
} catch (err2) {
|
|
51002
|
-
|
|
51241
|
+
logger55?.warn("Failed to read harness log file", { logPath, error: String(err2) });
|
|
51003
51242
|
return null;
|
|
51004
51243
|
}
|
|
51005
51244
|
}
|
|
@@ -51119,7 +51358,7 @@ function countValidPredictions(content) {
|
|
|
51119
51358
|
const lines = content.trim().split("\n").filter(Boolean);
|
|
51120
51359
|
return lines.filter(isValidPredictionLine).length;
|
|
51121
51360
|
}
|
|
51122
|
-
async function validatePredictionsFile(predictionsPath,
|
|
51361
|
+
async function validatePredictionsFile(predictionsPath, logger55) {
|
|
51123
51362
|
try {
|
|
51124
51363
|
const stat5 = await fs13.stat(predictionsPath);
|
|
51125
51364
|
if (!stat5.isFile()) {
|
|
@@ -51130,19 +51369,19 @@ async function validatePredictionsFile(predictionsPath, logger54) {
|
|
|
51130
51369
|
if (validCount === 0) {
|
|
51131
51370
|
return { valid: false, lineCount: 0, error: "No valid predictions found" };
|
|
51132
51371
|
}
|
|
51133
|
-
|
|
51372
|
+
logger55?.debug("Predictions file validated", { lineCount: validCount, path: predictionsPath });
|
|
51134
51373
|
return { valid: true, lineCount: validCount };
|
|
51135
51374
|
} catch (err2) {
|
|
51136
51375
|
const errorMsg = err2 instanceof Error ? err2.message : String(err2);
|
|
51137
51376
|
return { valid: false, lineCount: 0, error: errorMsg };
|
|
51138
51377
|
}
|
|
51139
51378
|
}
|
|
51140
|
-
async function ensureOutputDir(outputDir,
|
|
51379
|
+
async function ensureOutputDir(outputDir, logger55) {
|
|
51141
51380
|
try {
|
|
51142
51381
|
await fs13.mkdir(outputDir, { recursive: true });
|
|
51143
|
-
|
|
51382
|
+
logger55?.debug("Output directory ensured", { path: outputDir });
|
|
51144
51383
|
} catch (err2) {
|
|
51145
|
-
|
|
51384
|
+
logger55?.warn("Failed to create output directory", { path: outputDir, error: String(err2) });
|
|
51146
51385
|
throw new HarnessExecutorError(
|
|
51147
51386
|
`Failed to create output directory: ${outputDir}`,
|
|
51148
51387
|
"EXECUTION_FAILED",
|
|
@@ -51150,10 +51389,10 @@ async function ensureOutputDir(outputDir, logger54) {
|
|
|
51150
51389
|
);
|
|
51151
51390
|
}
|
|
51152
51391
|
}
|
|
51153
|
-
function spawnHarnessProcess(config,
|
|
51392
|
+
function spawnHarnessProcess(config, logger55) {
|
|
51154
51393
|
const args = [HARNESS_SCRIPT.split(" ")[0] ?? "-m", ...HARNESS_SCRIPT.split(" ").slice(1)];
|
|
51155
51394
|
args.push(...buildHarnessArgs(config));
|
|
51156
|
-
|
|
51395
|
+
logger55?.info("Spawning harness process", { command: PYTHON_COMMAND, args });
|
|
51157
51396
|
const proc = spawn(PYTHON_COMMAND, args, {
|
|
51158
51397
|
stdio: ["ignore", "pipe", "pipe"],
|
|
51159
51398
|
env: { ...process.env }
|
|
@@ -51241,20 +51480,20 @@ function handleProcessClose(options) {
|
|
|
51241
51480
|
}
|
|
51242
51481
|
});
|
|
51243
51482
|
}
|
|
51244
|
-
async function handleProcessExitAsync(code, config, stderr,
|
|
51483
|
+
async function handleProcessExitAsync(code, config, stderr, logger55) {
|
|
51245
51484
|
if (code !== 0) {
|
|
51246
|
-
|
|
51485
|
+
logger55.error("Harness process failed", new Error(stderr), { exitCode: code });
|
|
51247
51486
|
throw new HarnessExecutorError(
|
|
51248
51487
|
`Harness process exited with code ${String(code)}`,
|
|
51249
51488
|
"EXECUTION_FAILED"
|
|
51250
51489
|
);
|
|
51251
51490
|
}
|
|
51252
|
-
return parseResultsFile(config,
|
|
51491
|
+
return parseResultsFile(config, logger55);
|
|
51253
51492
|
}
|
|
51254
|
-
async function parseResultsFile(config,
|
|
51493
|
+
async function parseResultsFile(config, logger55) {
|
|
51255
51494
|
const resultsPath = getResultsFilePath(config);
|
|
51256
|
-
|
|
51257
|
-
const rawOutput = await parseHarnessLogFile(resultsPath,
|
|
51495
|
+
logger55.info("Parsing results file", { path: resultsPath });
|
|
51496
|
+
const rawOutput = await parseHarnessLogFile(resultsPath, logger55);
|
|
51258
51497
|
if (rawOutput === null) {
|
|
51259
51498
|
throw new HarnessExecutorError(`Failed to parse results from: ${resultsPath}`, "PARSE_ERROR");
|
|
51260
51499
|
}
|
|
@@ -51312,8 +51551,8 @@ var HarnessExecutor = class {
|
|
|
51312
51551
|
logger;
|
|
51313
51552
|
currentProcess = null;
|
|
51314
51553
|
isCancelled = false;
|
|
51315
|
-
constructor(
|
|
51316
|
-
this.logger =
|
|
51554
|
+
constructor(logger55) {
|
|
51555
|
+
this.logger = logger55 ?? createLogger({ component: "harness-executor" });
|
|
51317
51556
|
}
|
|
51318
51557
|
/**
|
|
51319
51558
|
* Validates that the environment is ready for harness execution.
|
|
@@ -51465,11 +51704,11 @@ var HarnessExecutor = class {
|
|
|
51465
51704
|
};
|
|
51466
51705
|
|
|
51467
51706
|
// src/swe-bench/harness-executor-factory.ts
|
|
51468
|
-
function createHarnessExecutor(
|
|
51469
|
-
return new HarnessExecutor(
|
|
51707
|
+
function createHarnessExecutor(logger55) {
|
|
51708
|
+
return new HarnessExecutor(logger55);
|
|
51470
51709
|
}
|
|
51471
|
-
async function createValidatedExecutor(
|
|
51472
|
-
const executor = createHarnessExecutor(
|
|
51710
|
+
async function createValidatedExecutor(logger55) {
|
|
51711
|
+
const executor = createHarnessExecutor(logger55);
|
|
51473
51712
|
const validation = await executor.validate();
|
|
51474
51713
|
return { executor, validation };
|
|
51475
51714
|
}
|
|
@@ -51589,8 +51828,8 @@ var EvaluationHarness = class {
|
|
|
51589
51828
|
logger;
|
|
51590
51829
|
executor;
|
|
51591
51830
|
isCancelled = false;
|
|
51592
|
-
constructor(
|
|
51593
|
-
this.logger =
|
|
51831
|
+
constructor(logger55) {
|
|
51832
|
+
this.logger = logger55 ?? createLogger({ component: "evaluation-harness" });
|
|
51594
51833
|
this.executor = createHarnessExecutor(this.logger);
|
|
51595
51834
|
}
|
|
51596
51835
|
/**
|
|
@@ -51750,11 +51989,11 @@ var EvaluationHarness = class {
|
|
|
51750
51989
|
return returnValue;
|
|
51751
51990
|
}
|
|
51752
51991
|
};
|
|
51753
|
-
function createEvaluationHarness(
|
|
51754
|
-
return new EvaluationHarness(
|
|
51992
|
+
function createEvaluationHarness(logger55) {
|
|
51993
|
+
return new EvaluationHarness(logger55);
|
|
51755
51994
|
}
|
|
51756
|
-
async function createValidatedHarness(
|
|
51757
|
-
const harness = createEvaluationHarness(
|
|
51995
|
+
async function createValidatedHarness(logger55) {
|
|
51996
|
+
const harness = createEvaluationHarness(logger55);
|
|
51758
51997
|
const validation = await harness.validate();
|
|
51759
51998
|
if (!validation.ready) {
|
|
51760
51999
|
return err(
|
|
@@ -52009,9 +52248,9 @@ function handlePatchError(err2, options) {
|
|
|
52009
52248
|
backupCreated: options.createBackup && !options.dryRun
|
|
52010
52249
|
};
|
|
52011
52250
|
}
|
|
52012
|
-
async function executePatch(patchPath, options, reverse,
|
|
52251
|
+
async function executePatch(patchPath, options, reverse, logger55) {
|
|
52013
52252
|
const args = buildPatchArgs(patchPath, options, reverse);
|
|
52014
|
-
|
|
52253
|
+
logger55.debug("Executing patch command", { args, cwd: options.workDir });
|
|
52015
52254
|
try {
|
|
52016
52255
|
const { stdout, stderr } = await execFileAsync5("patch", args, {
|
|
52017
52256
|
cwd: options.workDir,
|
|
@@ -52043,8 +52282,8 @@ ${stderr}`.trim();
|
|
|
52043
52282
|
// src/swe-bench/patch-applicator.ts
|
|
52044
52283
|
var PatchApplicator = class {
|
|
52045
52284
|
logger;
|
|
52046
|
-
constructor(
|
|
52047
|
-
this.logger =
|
|
52285
|
+
constructor(logger55) {
|
|
52286
|
+
this.logger = logger55 ?? createLogger({ component: "patch-applicator" });
|
|
52048
52287
|
}
|
|
52049
52288
|
/**
|
|
52050
52289
|
* Validates a patch without applying it.
|
|
@@ -52120,8 +52359,8 @@ var PatchApplicator = class {
|
|
|
52120
52359
|
};
|
|
52121
52360
|
}
|
|
52122
52361
|
};
|
|
52123
|
-
function createPatchApplicator(
|
|
52124
|
-
return new PatchApplicator(
|
|
52362
|
+
function createPatchApplicator(logger55) {
|
|
52363
|
+
return new PatchApplicator(logger55);
|
|
52125
52364
|
}
|
|
52126
52365
|
function validatePatch(patch) {
|
|
52127
52366
|
return parsePatch(patch);
|
|
@@ -52320,9 +52559,9 @@ function attachOutputCapture(proc, maxOutputBytes) {
|
|
|
52320
52559
|
};
|
|
52321
52560
|
}
|
|
52322
52561
|
function executeInDocker(options) {
|
|
52323
|
-
const { command, config, startTime, state, createCancelledResult: createCancelledResult2, handleTestError, logger:
|
|
52562
|
+
const { command, config, startTime, state, createCancelledResult: createCancelledResult2, handleTestError, logger: logger55 } = options;
|
|
52324
52563
|
const image = config.dockerImage ?? "python:3.11-slim";
|
|
52325
|
-
|
|
52564
|
+
logger55.debug("Executing tests in Docker", { image, command });
|
|
52326
52565
|
const dockerArgs = buildDockerArgs(command, config, image);
|
|
52327
52566
|
return new Promise((resolve18) => {
|
|
52328
52567
|
const proc = spawn2("docker", dockerArgs, {
|
|
@@ -52379,8 +52618,8 @@ var TestRunner = class {
|
|
|
52379
52618
|
currentProcess: null,
|
|
52380
52619
|
isCancelled: false
|
|
52381
52620
|
};
|
|
52382
|
-
constructor(
|
|
52383
|
-
this.logger =
|
|
52621
|
+
constructor(logger55) {
|
|
52622
|
+
this.logger = logger55 ?? createLogger({ component: "test-runner" });
|
|
52384
52623
|
}
|
|
52385
52624
|
/**
|
|
52386
52625
|
* Detects the test framework used by the repository.
|
|
@@ -52601,8 +52840,8 @@ ${stderr}`.trim();
|
|
|
52601
52840
|
};
|
|
52602
52841
|
}
|
|
52603
52842
|
};
|
|
52604
|
-
function createTestRunner(
|
|
52605
|
-
return new TestRunner(
|
|
52843
|
+
function createTestRunner(logger55) {
|
|
52844
|
+
return new TestRunner(logger55);
|
|
52606
52845
|
}
|
|
52607
52846
|
async function runTests(workDir, options) {
|
|
52608
52847
|
const runner = createTestRunner();
|
|
@@ -52911,8 +53150,8 @@ function identifyWeaknesses(result, competitors) {
|
|
|
52911
53150
|
// src/swe-bench/report-generator.ts
|
|
52912
53151
|
var ReportGenerator = class {
|
|
52913
53152
|
logger;
|
|
52914
|
-
constructor(
|
|
52915
|
-
this.logger =
|
|
53153
|
+
constructor(logger55) {
|
|
53154
|
+
this.logger = logger55 ?? createLogger({ component: "report-generator" });
|
|
52916
53155
|
}
|
|
52917
53156
|
/**
|
|
52918
53157
|
* Generates a full evaluation report.
|
|
@@ -53175,8 +53414,8 @@ var ReportGenerator = class {
|
|
|
53175
53414
|
};
|
|
53176
53415
|
}
|
|
53177
53416
|
};
|
|
53178
|
-
function createReportGenerator(
|
|
53179
|
-
return new ReportGenerator(
|
|
53417
|
+
function createReportGenerator(logger55) {
|
|
53418
|
+
return new ReportGenerator(logger55);
|
|
53180
53419
|
}
|
|
53181
53420
|
async function generateReport(result, config, competitors) {
|
|
53182
53421
|
const generator = createReportGenerator();
|
|
@@ -53323,7 +53562,7 @@ var TraceLogger = class {
|
|
|
53323
53562
|
};
|
|
53324
53563
|
|
|
53325
53564
|
// src/pipeline/event-bus-bridge.ts
|
|
53326
|
-
var
|
|
53565
|
+
var logger52 = createLogger({ component: "EventBusBridge" });
|
|
53327
53566
|
function toV1Topic(prefix, event) {
|
|
53328
53567
|
return `${prefix}.${event.type}`;
|
|
53329
53568
|
}
|
|
@@ -53355,10 +53594,10 @@ function createEventBusBridge(options) {
|
|
|
53355
53594
|
forwardCount++;
|
|
53356
53595
|
} catch (error) {
|
|
53357
53596
|
const msg = getErrorMessage(error);
|
|
53358
|
-
|
|
53597
|
+
logger52.warn("Failed to forward pipeline event", { type: event.type, error: msg });
|
|
53359
53598
|
}
|
|
53360
53599
|
});
|
|
53361
|
-
|
|
53600
|
+
logger52.info("EventBus bridge initialized", { prefix });
|
|
53362
53601
|
return {
|
|
53363
53602
|
forwarded: () => forwardCount,
|
|
53364
53603
|
dispose: unsub
|
|
@@ -53366,7 +53605,7 @@ function createEventBusBridge(options) {
|
|
|
53366
53605
|
}
|
|
53367
53606
|
|
|
53368
53607
|
// src/adapters/stdin-lifecycle.ts
|
|
53369
|
-
var
|
|
53608
|
+
var logger53 = createLogger({ component: "StdinLifecycleMonitor" });
|
|
53370
53609
|
var StdinLifecycleMonitor = class {
|
|
53371
53610
|
callbacks = /* @__PURE__ */ new Set();
|
|
53372
53611
|
started = false;
|
|
@@ -53391,7 +53630,7 @@ var StdinLifecycleMonitor = class {
|
|
|
53391
53630
|
try {
|
|
53392
53631
|
await cb();
|
|
53393
53632
|
} catch (error) {
|
|
53394
|
-
|
|
53633
|
+
logger53.warn("Stdin shutdown callback failed", { error: String(error) });
|
|
53395
53634
|
}
|
|
53396
53635
|
}
|
|
53397
53636
|
}
|
|
@@ -53405,7 +53644,7 @@ function getStdinLifecycleMonitor() {
|
|
|
53405
53644
|
// src/pipeline/task-tracker.ts
|
|
53406
53645
|
import * as fs18 from "fs";
|
|
53407
53646
|
import * as path19 from "path";
|
|
53408
|
-
var
|
|
53647
|
+
var logger54 = createLogger({ component: "task-tracker" });
|
|
53409
53648
|
async function exec4(cmd, args, timeout = 15e3) {
|
|
53410
53649
|
const { execFile: execFile6 } = await import("child_process");
|
|
53411
53650
|
const { promisify: promisify9 } = await import("util");
|
|
@@ -53431,7 +53670,7 @@ var GitHubTaskTracker = class {
|
|
|
53431
53670
|
const result = await provider.createIssue(title, body, this.config.labels);
|
|
53432
53671
|
if (!result.ok) throw new Error("Failed to create issue");
|
|
53433
53672
|
const id = String(result.value.number);
|
|
53434
|
-
|
|
53673
|
+
logger54.info("Created GitHub issue via SCM provider", { id });
|
|
53435
53674
|
return { id, title, status: "open", url: result.value.url };
|
|
53436
53675
|
}
|
|
53437
53676
|
async updateStatus(taskId, status) {
|
|
@@ -53459,7 +53698,7 @@ var GitLabTaskTracker = class {
|
|
|
53459
53698
|
);
|
|
53460
53699
|
const match = /\/(\d+)$/.exec(url);
|
|
53461
53700
|
const id = match?.[1] ?? url;
|
|
53462
|
-
|
|
53701
|
+
logger54.info("Created GitLab issue", { id, url });
|
|
53463
53702
|
return { id, title, status: "open", url };
|
|
53464
53703
|
}
|
|
53465
53704
|
async updateStatus(taskId, status) {
|
|
@@ -54165,6 +54404,8 @@ export {
|
|
|
54165
54404
|
AgentRunnerError,
|
|
54166
54405
|
runAgentOnInstance,
|
|
54167
54406
|
createMockExecutor,
|
|
54407
|
+
translateEvaluationResult,
|
|
54408
|
+
HarnessVerifyAdapter,
|
|
54168
54409
|
NexusAgentExecutor,
|
|
54169
54410
|
createNexusExecutorFromEnv,
|
|
54170
54411
|
CliAgentExecutor,
|
|
@@ -54260,4 +54501,4 @@ export {
|
|
|
54260
54501
|
detectBackend,
|
|
54261
54502
|
createTaskTracker
|
|
54262
54503
|
};
|
|
54263
|
-
//# sourceMappingURL=chunk-
|
|
54504
|
+
//# sourceMappingURL=chunk-APQJV46Q.js.map
|