nexus-agents 2.48.0 → 2.52.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-UXRR7M6E.js → chunk-B6AFGOS5.js} +724 -696
- package/dist/chunk-B6AFGOS5.js.map +1 -0
- package/dist/{chunk-KC3NUWZT.js → chunk-CYTWXE7N.js} +54 -2
- package/dist/chunk-CYTWXE7N.js.map +1 -0
- package/dist/{chunk-CH722DBX.js → chunk-DUF6MXMY.js} +2 -2
- package/dist/{chunk-E24JT23A.js → chunk-O6GZH7GZ.js} +3 -3
- package/dist/chunk-O6GZH7GZ.js.map +1 -0
- package/dist/{chunk-M53BBBCB.js → chunk-QGM2CANY.js} +3 -3
- package/dist/cli.js +23 -9
- package/dist/cli.js.map +1 -1
- package/dist/{consensus-vote-N5RRFYER.js → consensus-vote-VFTADRFB.js} +2 -2
- package/dist/index.d.ts +366 -323
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/{issue-triage-VLP2PXR6.js → issue-triage-2YK6NOJD.js} +2 -2
- package/dist/{setup-command-PLGFVKLM.js → setup-command-OETFAZUF.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-E24JT23A.js.map +0 -1
- package/dist/chunk-KC3NUWZT.js.map +0 -1
- package/dist/chunk-UXRR7M6E.js.map +0 -1
- /package/dist/{chunk-CH722DBX.js.map → chunk-DUF6MXMY.js.map} +0 -0
- /package/dist/{chunk-M53BBBCB.js.map → chunk-QGM2CANY.js.map} +0 -0
- /package/dist/{consensus-vote-N5RRFYER.js.map → consensus-vote-VFTADRFB.js.map} +0 -0
- /package/dist/{issue-triage-VLP2PXR6.js.map → issue-triage-2YK6NOJD.js.map} +0 -0
- /package/dist/{setup-command-PLGFVKLM.js.map → setup-command-OETFAZUF.js.map} +0 -0
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
ClaudeAdapter,
|
|
7
7
|
DEFAULT_RELEVANCE_CONFIG,
|
|
8
|
+
EventTopics,
|
|
8
9
|
NOOP_NOTIFIER,
|
|
9
10
|
RateLimiter,
|
|
10
11
|
createDefaultRateLimiter,
|
|
@@ -26,7 +27,7 @@ import {
|
|
|
26
27
|
withAccessPolicy,
|
|
27
28
|
withProgressHeartbeat,
|
|
28
29
|
wrapToolWithTimeout
|
|
29
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-CYTWXE7N.js";
|
|
30
31
|
import {
|
|
31
32
|
REGISTRY_PATH,
|
|
32
33
|
getProjectRoot,
|
|
@@ -40,7 +41,7 @@ import {
|
|
|
40
41
|
import {
|
|
41
42
|
IssueTriage,
|
|
42
43
|
sanitizeInput
|
|
43
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-O6GZH7GZ.js";
|
|
44
45
|
import {
|
|
45
46
|
generateSecurityPlan
|
|
46
47
|
} from "./chunk-YRPOXUXI.js";
|
|
@@ -66,7 +67,7 @@ import {
|
|
|
66
67
|
import {
|
|
67
68
|
DEFAULT_TASK_TTL_MS,
|
|
68
69
|
clampTaskTtl
|
|
69
|
-
} from "./chunk-
|
|
70
|
+
} from "./chunk-QGM2CANY.js";
|
|
70
71
|
import {
|
|
71
72
|
createSessionMemory
|
|
72
73
|
} from "./chunk-ULDKSIS7.js";
|
|
@@ -823,16 +824,16 @@ function classifyEnvKeys(nexusKeys, env) {
|
|
|
823
824
|
}
|
|
824
825
|
return { knownRecord, unknownVars };
|
|
825
826
|
}
|
|
826
|
-
function logValidationWarnings(
|
|
827
|
+
function logValidationWarnings(logger55, unknownVars, invalidVars) {
|
|
827
828
|
for (const u of unknownVars) {
|
|
828
829
|
const hint = u.suggestion !== null ? ` (did you mean ${u.suggestion}?)` : "";
|
|
829
|
-
|
|
830
|
+
logger55.warn(`Unknown environment variable: ${u.name}${hint}`);
|
|
830
831
|
}
|
|
831
832
|
for (const inv of invalidVars) {
|
|
832
|
-
|
|
833
|
+
logger55.warn(`Invalid environment variable ${inv.name}="${inv.value}": ${inv.error}`);
|
|
833
834
|
}
|
|
834
835
|
}
|
|
835
|
-
function validateNexusEnv(
|
|
836
|
+
function validateNexusEnv(logger55) {
|
|
836
837
|
const nexusKeys = Object.keys(process.env).filter((k) => k.startsWith("NEXUS_"));
|
|
837
838
|
const { knownRecord, unknownVars } = classifyEnvKeys(nexusKeys, process.env);
|
|
838
839
|
const invalidVars = [];
|
|
@@ -847,8 +848,8 @@ function validateNexusEnv(logger54) {
|
|
|
847
848
|
});
|
|
848
849
|
}
|
|
849
850
|
}
|
|
850
|
-
if (
|
|
851
|
-
logValidationWarnings(
|
|
851
|
+
if (logger55 !== void 0) {
|
|
852
|
+
logValidationWarnings(logger55, unknownVars, invalidVars);
|
|
852
853
|
}
|
|
853
854
|
return { unknownVars, invalidVars };
|
|
854
855
|
}
|
|
@@ -871,7 +872,7 @@ var AvailabilityCache = class {
|
|
|
871
872
|
get(modelId) {
|
|
872
873
|
const entry = this.cache.get(modelId);
|
|
873
874
|
if (entry === void 0) return void 0;
|
|
874
|
-
if (
|
|
875
|
+
if (getTimeProvider().now() - entry.checkedAt > this.ttlMs) {
|
|
875
876
|
this.cache.delete(modelId);
|
|
876
877
|
return void 0;
|
|
877
878
|
}
|
|
@@ -893,7 +894,7 @@ var AvailabilityCache = class {
|
|
|
893
894
|
modelId,
|
|
894
895
|
available: false,
|
|
895
896
|
latencyMs: 0,
|
|
896
|
-
checkedAt:
|
|
897
|
+
checkedAt: getTimeProvider().now(),
|
|
897
898
|
error
|
|
898
899
|
});
|
|
899
900
|
}
|
|
@@ -903,7 +904,7 @@ var AvailabilityCache = class {
|
|
|
903
904
|
modelId,
|
|
904
905
|
available: true,
|
|
905
906
|
latencyMs,
|
|
906
|
-
checkedAt:
|
|
907
|
+
checkedAt: getTimeProvider().now()
|
|
907
908
|
});
|
|
908
909
|
}
|
|
909
910
|
/** Check if a model is known-unavailable (cached and not expired). */
|
|
@@ -1724,8 +1725,8 @@ function deepMerge(target, source) {
|
|
|
1724
1725
|
}
|
|
1725
1726
|
return result;
|
|
1726
1727
|
}
|
|
1727
|
-
function loadDefaultConfig(
|
|
1728
|
-
|
|
1728
|
+
function loadDefaultConfig(logger55) {
|
|
1729
|
+
logger55.debug("No config file found, using defaults");
|
|
1729
1730
|
const validated = AppConfigSchema.safeParse(defaultConfig);
|
|
1730
1731
|
if (!validated.success) {
|
|
1731
1732
|
return err(
|
|
@@ -1741,7 +1742,7 @@ function loadDefaultConfig(logger54) {
|
|
|
1741
1742
|
warnings: ["No config file found, using default configuration"]
|
|
1742
1743
|
});
|
|
1743
1744
|
}
|
|
1744
|
-
function readAndParseConfig(configPath, mergeDefaults,
|
|
1745
|
+
function readAndParseConfig(configPath, mergeDefaults, logger55) {
|
|
1745
1746
|
let content;
|
|
1746
1747
|
try {
|
|
1747
1748
|
content = readFileSync(configPath, "utf-8");
|
|
@@ -1758,7 +1759,7 @@ function readAndParseConfig(configPath, mergeDefaults, logger54) {
|
|
|
1758
1759
|
const parseResult2 = parseYaml(content);
|
|
1759
1760
|
if (!parseResult2.ok) return err(parseResult2.error);
|
|
1760
1761
|
if (mergeDefaults && typeof parseResult2.value === "object" && parseResult2.value !== null) {
|
|
1761
|
-
|
|
1762
|
+
logger55.debug("Merged config with defaults");
|
|
1762
1763
|
return ok(
|
|
1763
1764
|
deepMerge(
|
|
1764
1765
|
defaultConfig,
|
|
@@ -1768,7 +1769,7 @@ function readAndParseConfig(configPath, mergeDefaults, logger54) {
|
|
|
1768
1769
|
}
|
|
1769
1770
|
return ok(parseResult2.value);
|
|
1770
1771
|
}
|
|
1771
|
-
function validateConfig(configData, configPath,
|
|
1772
|
+
function validateConfig(configData, configPath, logger55) {
|
|
1772
1773
|
const validation = AppConfigSchema.safeParse(configData);
|
|
1773
1774
|
if (!validation.success) {
|
|
1774
1775
|
const issues = formatZodIssuesAsArray(validation.error);
|
|
@@ -1777,12 +1778,12 @@ function validateConfig(configData, configPath, logger54) {
|
|
|
1777
1778
|
${issues.join("\n")}`, "VALIDATION_ERROR")
|
|
1778
1779
|
);
|
|
1779
1780
|
}
|
|
1780
|
-
|
|
1781
|
+
logger55.info("Configuration loaded successfully", { configPath });
|
|
1781
1782
|
return ok({ config: validation.data, configPath, usingDefaults: false, warnings: [] });
|
|
1782
1783
|
}
|
|
1783
1784
|
function loadConfig(options = {}) {
|
|
1784
1785
|
const { configPath: explicitPath, cwd = process.cwd(), mergeDefaults = true } = options;
|
|
1785
|
-
const
|
|
1786
|
+
const logger55 = options.logger ?? createLogger({ component: "ConfigLoader" });
|
|
1786
1787
|
let configPath;
|
|
1787
1788
|
if (explicitPath !== void 0) {
|
|
1788
1789
|
const validation = validatePath(explicitPath, cwd);
|
|
@@ -1791,10 +1792,10 @@ function loadConfig(options = {}) {
|
|
|
1791
1792
|
} else {
|
|
1792
1793
|
configPath = findConfigPath(cwd);
|
|
1793
1794
|
}
|
|
1794
|
-
if (configPath === void 0) return loadDefaultConfig(
|
|
1795
|
-
const parseResult2 = readAndParseConfig(configPath, mergeDefaults,
|
|
1795
|
+
if (configPath === void 0) return loadDefaultConfig(logger55);
|
|
1796
|
+
const parseResult2 = readAndParseConfig(configPath, mergeDefaults, logger55);
|
|
1796
1797
|
if (!parseResult2.ok) return err(parseResult2.error);
|
|
1797
|
-
return validateConfig(parseResult2.value, configPath,
|
|
1798
|
+
return validateConfig(parseResult2.value, configPath, logger55);
|
|
1798
1799
|
}
|
|
1799
1800
|
var loadedConfig;
|
|
1800
1801
|
function getConfig(options) {
|
|
@@ -2726,12 +2727,12 @@ function removeItemsDirectly(items, targetTokens, manager) {
|
|
|
2726
2727
|
};
|
|
2727
2728
|
}
|
|
2728
2729
|
async function summarizeAndRemoveItems(options) {
|
|
2729
|
-
const { items, targetTokens, manager, adapter, logger:
|
|
2730
|
+
const { items, targetTokens, manager, adapter, logger: logger55, customPrompt } = options;
|
|
2730
2731
|
const content = items.map((item) => item.content).join("\n\n---\n\n");
|
|
2731
2732
|
const prompt = customPrompt ?? SLIDING_WINDOW_PROMPT;
|
|
2732
2733
|
const summaryResult = await generateSummary(content, prompt, adapter);
|
|
2733
2734
|
if (!summaryResult.ok) {
|
|
2734
|
-
|
|
2735
|
+
logger55.warn("Summarization failed, removing items without summary");
|
|
2735
2736
|
return removeItemsDirectly(items, targetTokens, manager);
|
|
2736
2737
|
}
|
|
2737
2738
|
let tokensFreed = 0;
|
|
@@ -2744,7 +2745,7 @@ async function summarizeAndRemoveItems(options) {
|
|
|
2744
2745
|
if (summaryAddResult.item !== void 0) {
|
|
2745
2746
|
tokensFreed -= summaryAddResult.tokenCount;
|
|
2746
2747
|
}
|
|
2747
|
-
|
|
2748
|
+
logger55.info("Summarization pruning completed", {
|
|
2748
2749
|
summarizedItems: items.length,
|
|
2749
2750
|
tokensFreed,
|
|
2750
2751
|
targetReached: tokensFreed >= targetTokens
|
|
@@ -2802,7 +2803,7 @@ function scoreByPriorityWeightedAge(candidates) {
|
|
|
2802
2803
|
return scores.map((s) => s.item);
|
|
2803
2804
|
}
|
|
2804
2805
|
function removeItemsToTarget(options) {
|
|
2805
|
-
const { sortedItems, targetTokens, categories, manager, minItemsPerCategory, logger:
|
|
2806
|
+
const { sortedItems, targetTokens, categories, manager, minItemsPerCategory, logger: logger55 } = options;
|
|
2806
2807
|
const categoryRemaining = /* @__PURE__ */ new Map();
|
|
2807
2808
|
for (const category of categories) {
|
|
2808
2809
|
categoryRemaining.set(category, manager.getByCategory(category).length);
|
|
@@ -2819,7 +2820,7 @@ function removeItemsToTarget(options) {
|
|
|
2819
2820
|
categoryRemaining.set(item.category, remaining - 1);
|
|
2820
2821
|
}
|
|
2821
2822
|
const targetReached = tokensFreed >= targetTokens;
|
|
2822
|
-
|
|
2823
|
+
logger55.info("Pruning completed", {
|
|
2823
2824
|
itemsRemoved: removedItems.length,
|
|
2824
2825
|
tokensFreed,
|
|
2825
2826
|
targetTokens,
|
|
@@ -3284,7 +3285,7 @@ function generateBudgetWarning(utilizationPercent, tokensUsed, budgetLimit, scop
|
|
|
3284
3285
|
scope
|
|
3285
3286
|
};
|
|
3286
3287
|
}
|
|
3287
|
-
function logBudgetWarning(warning,
|
|
3288
|
+
function logBudgetWarning(warning, logger55) {
|
|
3288
3289
|
const context = {
|
|
3289
3290
|
scope: warning.scope,
|
|
3290
3291
|
usagePercent: Math.round(warning.usagePercent),
|
|
@@ -3293,13 +3294,13 @@ function logBudgetWarning(warning, logger54) {
|
|
|
3293
3294
|
};
|
|
3294
3295
|
switch (warning.level) {
|
|
3295
3296
|
case "critical":
|
|
3296
|
-
|
|
3297
|
+
logger55.warn(warning.message, context);
|
|
3297
3298
|
break;
|
|
3298
3299
|
case "warning":
|
|
3299
|
-
|
|
3300
|
+
logger55.warn(warning.message, context);
|
|
3300
3301
|
break;
|
|
3301
3302
|
case "info":
|
|
3302
|
-
|
|
3303
|
+
logger55.info(warning.message, context);
|
|
3303
3304
|
break;
|
|
3304
3305
|
}
|
|
3305
3306
|
}
|
|
@@ -3355,8 +3356,8 @@ function createHardModeResult(params) {
|
|
|
3355
3356
|
)
|
|
3356
3357
|
};
|
|
3357
3358
|
}
|
|
3358
|
-
function logWarnModeExceeded(params,
|
|
3359
|
-
|
|
3359
|
+
function logWarnModeExceeded(params, logger55) {
|
|
3360
|
+
logger55.warn("Token budget would be exceeded (warn mode - continuing)", {
|
|
3360
3361
|
exceedsSession: params.exceedsSession,
|
|
3361
3362
|
exceedsTask: params.exceedsTask,
|
|
3362
3363
|
estimatedTokens: params.estimatedTokens,
|
|
@@ -3385,9 +3386,9 @@ var TokenBudgetTracker = class {
|
|
|
3385
3386
|
* @param config - Token budget configuration
|
|
3386
3387
|
* @param logger - Optional logger instance
|
|
3387
3388
|
*/
|
|
3388
|
-
constructor(config = {},
|
|
3389
|
+
constructor(config = {}, logger55) {
|
|
3389
3390
|
this.config = { ...DEFAULT_TOKEN_BUDGET_CONFIG, ...config };
|
|
3390
|
-
this.logger =
|
|
3391
|
+
this.logger = logger55 ?? createLogger({ component: "token-budget-tracker" });
|
|
3391
3392
|
}
|
|
3392
3393
|
/**
|
|
3393
3394
|
* Check if an operation is within budget.
|
|
@@ -3540,7 +3541,7 @@ var TokenBudgetTracker = class {
|
|
|
3540
3541
|
|
|
3541
3542
|
// src/agents/base-agent-state-helpers.ts
|
|
3542
3543
|
function performLegacyStateTransition(params) {
|
|
3543
|
-
const { stateMachine, logger:
|
|
3544
|
+
const { stateMachine, logger: logger55, newState } = params;
|
|
3544
3545
|
const currentState = stateMachine.state;
|
|
3545
3546
|
if (newState === "error") {
|
|
3546
3547
|
stateMachine.forceError({ reason: "setState called with error" });
|
|
@@ -3550,7 +3551,7 @@ function performLegacyStateTransition(params) {
|
|
|
3550
3551
|
if (event !== void 0 && stateMachine.canTransition(event)) {
|
|
3551
3552
|
const result = stateMachine.transition(event);
|
|
3552
3553
|
if (!result.ok) {
|
|
3553
|
-
|
|
3554
|
+
logger55.warn("State transition failed", {
|
|
3554
3555
|
from: currentState,
|
|
3555
3556
|
to: newState,
|
|
3556
3557
|
event,
|
|
@@ -3558,7 +3559,7 @@ function performLegacyStateTransition(params) {
|
|
|
3558
3559
|
});
|
|
3559
3560
|
}
|
|
3560
3561
|
} else if (currentState !== newState) {
|
|
3561
|
-
|
|
3562
|
+
logger55.debug("Unmapped state change (legacy)", { from: currentState, to: newState });
|
|
3562
3563
|
}
|
|
3563
3564
|
}
|
|
3564
3565
|
|
|
@@ -3714,7 +3715,7 @@ function getAgentStateKey(agentId) {
|
|
|
3714
3715
|
}
|
|
3715
3716
|
|
|
3716
3717
|
// src/agents/memory-operations.ts
|
|
3717
|
-
async function persistMemoryState(backend, state,
|
|
3718
|
+
async function persistMemoryState(backend, state, logger55) {
|
|
3718
3719
|
const key = getAgentStateKey(state.agentId);
|
|
3719
3720
|
const metadata = {
|
|
3720
3721
|
importance: MemoryImportance.HIGH,
|
|
@@ -3726,12 +3727,12 @@ async function persistMemoryState(backend, state, logger54) {
|
|
|
3726
3727
|
};
|
|
3727
3728
|
const result = await backend.store(key, updatedState, metadata);
|
|
3728
3729
|
if (!result.ok) {
|
|
3729
|
-
|
|
3730
|
+
logger55.error("Failed to persist agent memory state", result.error, { agentId: state.agentId });
|
|
3730
3731
|
return err(
|
|
3731
3732
|
new AgentMemoryError("Failed to persist memory state", { error: result.error.message })
|
|
3732
3733
|
);
|
|
3733
3734
|
}
|
|
3734
|
-
|
|
3735
|
+
logger55.debug("Persisted agent memory state", {
|
|
3735
3736
|
agentId: state.agentId,
|
|
3736
3737
|
learningsCount: state.taskLearnings.length,
|
|
3737
3738
|
patternsCount: state.executionPatterns.length,
|
|
@@ -3739,16 +3740,16 @@ async function persistMemoryState(backend, state, logger54) {
|
|
|
3739
3740
|
});
|
|
3740
3741
|
return ok(void 0);
|
|
3741
3742
|
}
|
|
3742
|
-
async function loadMemoryState(backend, agentId, role,
|
|
3743
|
+
async function loadMemoryState(backend, agentId, role, logger55) {
|
|
3743
3744
|
const key = getAgentStateKey(agentId);
|
|
3744
3745
|
const result = await backend.retrieve(key);
|
|
3745
3746
|
if (!result.ok) {
|
|
3746
|
-
|
|
3747
|
+
logger55.debug("No existing memory state found, creating fresh state", { agentId });
|
|
3747
3748
|
return ok(createInitialMemoryState(agentId, role));
|
|
3748
3749
|
}
|
|
3749
3750
|
const loaded = result.value;
|
|
3750
3751
|
if (loaded === null || typeof loaded !== "object") {
|
|
3751
|
-
|
|
3752
|
+
logger55.warn("Invalid memory state format, creating fresh state", { agentId });
|
|
3752
3753
|
return ok(createInitialMemoryState(agentId, role));
|
|
3753
3754
|
}
|
|
3754
3755
|
const state = {
|
|
@@ -3759,7 +3760,7 @@ async function loadMemoryState(backend, agentId, role, logger54) {
|
|
|
3759
3760
|
executionPatterns: Array.isArray(loaded.executionPatterns) ? loaded.executionPatterns : [],
|
|
3760
3761
|
errorResolutions: Array.isArray(loaded.errorResolutions) ? loaded.errorResolutions : []
|
|
3761
3762
|
};
|
|
3762
|
-
|
|
3763
|
+
logger55.debug("Loaded agent memory state", {
|
|
3763
3764
|
agentId,
|
|
3764
3765
|
learningsCount: state.taskLearnings.length,
|
|
3765
3766
|
patternsCount: state.executionPatterns.length,
|
|
@@ -3767,13 +3768,13 @@ async function loadMemoryState(backend, agentId, role, logger54) {
|
|
|
3767
3768
|
});
|
|
3768
3769
|
return ok(state);
|
|
3769
3770
|
}
|
|
3770
|
-
async function loadRelevantTypedMemories(typedMemory, role, limit,
|
|
3771
|
+
async function loadRelevantTypedMemories(typedMemory, role, limit, logger55) {
|
|
3771
3772
|
const result = await typedMemory.filterByRelevance(role, limit);
|
|
3772
3773
|
if (!result.ok) {
|
|
3773
|
-
|
|
3774
|
+
logger55.warn("Failed to load relevant typed memories", { role, error: result.error.message });
|
|
3774
3775
|
return result;
|
|
3775
3776
|
}
|
|
3776
|
-
|
|
3777
|
+
logger55.debug("Loaded relevant typed memories", {
|
|
3777
3778
|
role,
|
|
3778
3779
|
count: result.value.length,
|
|
3779
3780
|
types: [...new Set(result.value.map((e) => e.type))]
|
|
@@ -3887,10 +3888,10 @@ function initializeMemoryInfrastructure(options) {
|
|
|
3887
3888
|
|
|
3888
3889
|
// src/agents/base-agent-constructor-helpers.ts
|
|
3889
3890
|
function setupStateMachine(params) {
|
|
3890
|
-
const { agentId, logger:
|
|
3891
|
+
const { agentId, logger: logger55, eventBus, options } = params;
|
|
3891
3892
|
const stateMachine = new AgentStateMachine(options);
|
|
3892
3893
|
stateMachine.onStateChange((transition) => {
|
|
3893
|
-
|
|
3894
|
+
logger55.debug("State transition", {
|
|
3894
3895
|
from: transition.from,
|
|
3895
3896
|
to: transition.to,
|
|
3896
3897
|
event: transition.event
|
|
@@ -3904,9 +3905,9 @@ function setupStateMachine(params) {
|
|
|
3904
3905
|
return stateMachine;
|
|
3905
3906
|
}
|
|
3906
3907
|
function initializeInfrastructure(params) {
|
|
3907
|
-
const { agentId, role, logger:
|
|
3908
|
+
const { agentId, role, logger: logger55, adapter, pruningConfig, memoryConfig } = params;
|
|
3908
3909
|
const pruningOpts = {
|
|
3909
|
-
logger:
|
|
3910
|
+
logger: logger55,
|
|
3910
3911
|
...pruningConfig !== void 0 ? { config: pruningConfig } : {},
|
|
3911
3912
|
...adapter !== void 0 ? { adapter } : {}
|
|
3912
3913
|
};
|
|
@@ -3914,7 +3915,7 @@ function initializeInfrastructure(params) {
|
|
|
3914
3915
|
const memoryOpts = {
|
|
3915
3916
|
agentId,
|
|
3916
3917
|
role,
|
|
3917
|
-
logger:
|
|
3918
|
+
logger: logger55,
|
|
3918
3919
|
...memoryConfig !== void 0 ? { config: memoryConfig } : {}
|
|
3919
3920
|
};
|
|
3920
3921
|
const memory = initializeMemoryInfrastructure(memoryOpts);
|
|
@@ -4146,14 +4147,14 @@ function transformTaskError(error, agentId, taskId) {
|
|
|
4146
4147
|
return new AgentError(`Task execution failed: ${message}`, opts);
|
|
4147
4148
|
}
|
|
4148
4149
|
function finalizeTaskSuccess(params) {
|
|
4149
|
-
const { task, result, startTime, stateMachine, budgetTracker, logger:
|
|
4150
|
+
const { task, result, startTime, stateMachine, budgetTracker, logger: logger55 } = params;
|
|
4150
4151
|
const durationMs = getTimeProvider().now() - startTime;
|
|
4151
4152
|
if (stateMachine.state === "thinking") {
|
|
4152
4153
|
stateMachine.transition("plan_completed", { taskId: task.id });
|
|
4153
4154
|
}
|
|
4154
4155
|
stateMachine.transition("task_completed", { taskId: task.id, durationMs });
|
|
4155
4156
|
const budgetStats = budgetTracker.endTask();
|
|
4156
|
-
|
|
4157
|
+
logger55.info("Task completed", {
|
|
4157
4158
|
taskId: task.id,
|
|
4158
4159
|
durationMs,
|
|
4159
4160
|
tokensUsed: result.metadata.tokensUsed,
|
|
@@ -4181,7 +4182,7 @@ function recordFailedTaskError(params) {
|
|
|
4181
4182
|
});
|
|
4182
4183
|
}
|
|
4183
4184
|
async function persistMemoryAfterTask(params) {
|
|
4184
|
-
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, task, startTime, logger:
|
|
4185
|
+
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, task, startTime, logger: logger55 } = params;
|
|
4185
4186
|
if (!memoryEnabled || memoryState === null) {
|
|
4186
4187
|
return memoryState;
|
|
4187
4188
|
}
|
|
@@ -4196,9 +4197,9 @@ async function persistMemoryAfterTask(params) {
|
|
|
4196
4197
|
successRate
|
|
4197
4198
|
});
|
|
4198
4199
|
if (memoryBackend !== void 0) {
|
|
4199
|
-
await persistMemoryState(memoryBackend, updatedState,
|
|
4200
|
+
await persistMemoryState(memoryBackend, updatedState, logger55);
|
|
4200
4201
|
}
|
|
4201
|
-
|
|
4202
|
+
logger55.debug("Memory persisted after task completion", {
|
|
4202
4203
|
taskId: task.id,
|
|
4203
4204
|
durationMs
|
|
4204
4205
|
});
|
|
@@ -4209,15 +4210,15 @@ function categorizeTaskType(description) {
|
|
|
4209
4210
|
return categorizeTaskByKeywords(desc);
|
|
4210
4211
|
}
|
|
4211
4212
|
async function persistMemoryOnCleanup(params) {
|
|
4212
|
-
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, logger:
|
|
4213
|
+
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, logger: logger55 } = params;
|
|
4213
4214
|
if (!memoryEnabled || memoryBackend === void 0 || memoryState === null) {
|
|
4214
4215
|
return;
|
|
4215
4216
|
}
|
|
4216
4217
|
if (persistenceMode === "none") {
|
|
4217
4218
|
return;
|
|
4218
4219
|
}
|
|
4219
|
-
await persistMemoryState(memoryBackend, memoryState,
|
|
4220
|
-
|
|
4220
|
+
await persistMemoryState(memoryBackend, memoryState, logger55);
|
|
4221
|
+
logger55.debug("Memory state persisted during cleanup");
|
|
4221
4222
|
}
|
|
4222
4223
|
|
|
4223
4224
|
// src/agents/base-agent-execute-flow.ts
|
|
@@ -4343,14 +4344,14 @@ function createInitialPruningMetrics() {
|
|
|
4343
4344
|
|
|
4344
4345
|
// src/agents/base-agent-memory-ops.ts
|
|
4345
4346
|
async function flushMemoryState(params) {
|
|
4346
|
-
const { memoryEnabled, memoryBackend, memoryState, logger:
|
|
4347
|
+
const { memoryEnabled, memoryBackend, memoryState, logger: logger55 } = params;
|
|
4347
4348
|
if (!memoryEnabled) {
|
|
4348
4349
|
return ok(void 0);
|
|
4349
4350
|
}
|
|
4350
4351
|
if (memoryBackend === void 0 || memoryState === null) {
|
|
4351
4352
|
return ok(void 0);
|
|
4352
4353
|
}
|
|
4353
|
-
return persistMemoryState(memoryBackend, memoryState,
|
|
4354
|
+
return persistMemoryState(memoryBackend, memoryState, logger55);
|
|
4354
4355
|
}
|
|
4355
4356
|
function recordLearningToState(params) {
|
|
4356
4357
|
const { memoryEnabled, memoryState, learning } = params;
|
|
@@ -5605,13 +5606,13 @@ function shouldFinalize(pattern, participants, results, votes, reviews) {
|
|
|
5605
5606
|
|
|
5606
5607
|
// src/agents/collaboration/collaboration-session-helpers.ts
|
|
5607
5608
|
var MAX_EVENT_LISTENERS = 50;
|
|
5608
|
-
function emitEventToListeners(listeners, event,
|
|
5609
|
+
function emitEventToListeners(listeners, event, logger55) {
|
|
5609
5610
|
for (const listener of listeners) {
|
|
5610
5611
|
try {
|
|
5611
5612
|
listener(event);
|
|
5612
5613
|
} catch (e) {
|
|
5613
5614
|
const errorObj = e instanceof Error ? e : new Error(String(e));
|
|
5614
|
-
|
|
5615
|
+
logger55.error("Event listener error", errorObj, { eventType: event.type });
|
|
5615
5616
|
}
|
|
5616
5617
|
}
|
|
5617
5618
|
}
|
|
@@ -9284,9 +9285,9 @@ var DEFAULT_WAVE_CONFIG = {
|
|
|
9284
9285
|
var WaveScheduler = class {
|
|
9285
9286
|
config;
|
|
9286
9287
|
logger;
|
|
9287
|
-
constructor(config = {},
|
|
9288
|
+
constructor(config = {}, logger55) {
|
|
9288
9289
|
this.config = { ...DEFAULT_WAVE_CONFIG, ...config };
|
|
9289
|
-
this.logger =
|
|
9290
|
+
this.logger = logger55 ?? createLogger({ component: "wave-scheduler" });
|
|
9290
9291
|
}
|
|
9291
9292
|
/**
|
|
9292
9293
|
* Execute tasks in waves respecting dependencies and concurrency limits.
|
|
@@ -9520,8 +9521,8 @@ function chunkByDirectory(files, basePath) {
|
|
|
9520
9521
|
items
|
|
9521
9522
|
}));
|
|
9522
9523
|
}
|
|
9523
|
-
function createWaveScheduler(config = {},
|
|
9524
|
-
return new WaveScheduler(config,
|
|
9524
|
+
function createWaveScheduler(config = {}, logger55) {
|
|
9525
|
+
return new WaveScheduler(config, logger55);
|
|
9525
9526
|
}
|
|
9526
9527
|
|
|
9527
9528
|
// src/agents/experts/expert-types.ts
|
|
@@ -14335,57 +14336,6 @@ var logger4 = createLogger({ component: "self-debug-protocol" });
|
|
|
14335
14336
|
// src/agents/collaboration/ast-fixer.ts
|
|
14336
14337
|
import { Project, SyntaxKind, Node } from "ts-morph";
|
|
14337
14338
|
|
|
14338
|
-
// src/agents/collaboration/event-bus-topics.ts
|
|
14339
|
-
var EventTopics = {
|
|
14340
|
-
// Session events
|
|
14341
|
-
SESSION_CREATED: "session.created",
|
|
14342
|
-
SESSION_STATUS_CHANGED: "session.status_changed",
|
|
14343
|
-
SESSION_PARTICIPANT_JOINED: "session.participant_joined",
|
|
14344
|
-
SESSION_RESULT_SUBMITTED: "session.result_submitted",
|
|
14345
|
-
SESSION_FINALIZED: "session.finalized",
|
|
14346
|
-
SESSION_ALL: "session.*",
|
|
14347
|
-
// Message events
|
|
14348
|
-
MESSAGE_SENT: "message.sent",
|
|
14349
|
-
MESSAGE_RECEIVED: "message.received",
|
|
14350
|
-
MESSAGE_ALL: "message.*",
|
|
14351
|
-
// Agent events
|
|
14352
|
-
AGENT_TASK_DELEGATED: "agent.task_delegated",
|
|
14353
|
-
AGENT_RESULT_BROADCAST: "agent.result_broadcast",
|
|
14354
|
-
AGENT_ALL: "agent.*",
|
|
14355
|
-
// Consensus events
|
|
14356
|
-
CONSENSUS_VOTE_REQUESTED: "consensus.vote_requested",
|
|
14357
|
-
CONSENSUS_VOTE_CAST: "consensus.vote_cast",
|
|
14358
|
-
CONSENSUS_REACHED: "consensus.reached",
|
|
14359
|
-
CONSENSUS_ALL: "consensus.*",
|
|
14360
|
-
// Protocol events
|
|
14361
|
-
PROTOCOL_STARTED: "protocol.started",
|
|
14362
|
-
PROTOCOL_ITERATION: "protocol.iteration",
|
|
14363
|
-
PROTOCOL_COMPLETED: "protocol.completed",
|
|
14364
|
-
PROTOCOL_ALL: "protocol.*",
|
|
14365
|
-
// Aegean phase events (Issue #216)
|
|
14366
|
-
AEGEAN_ROUND_STARTED: "protocol.aegean.round_started",
|
|
14367
|
-
AEGEAN_VOTE_COLLECTED: "protocol.aegean.vote_collected",
|
|
14368
|
-
AEGEAN_QUORUM_DETECTED: "protocol.aegean.quorum_detected",
|
|
14369
|
-
AEGEAN_ALL: "protocol.aegean.*",
|
|
14370
|
-
// Reflexion phase events (Issue #216)
|
|
14371
|
-
REFLEXION_CRITIQUE_STARTED: "protocol.reflexion.critique_started",
|
|
14372
|
-
REFLEXION_CRITIQUE_COMPLETED: "protocol.reflexion.critique_completed",
|
|
14373
|
-
REFLEXION_SYNTHESIS: "protocol.reflexion.synthesis",
|
|
14374
|
-
REFLEXION_ALL: "protocol.reflexion.*",
|
|
14375
|
-
// Trinity phase events (Issue #216)
|
|
14376
|
-
TRINITY_PHASE_STARTED: "protocol.trinity.phase_started",
|
|
14377
|
-
TRINITY_PHASE_COMPLETED: "protocol.trinity.phase_completed",
|
|
14378
|
-
TRINITY_ALL: "protocol.trinity.*",
|
|
14379
|
-
// Byzantine detection events (Issue #218)
|
|
14380
|
-
BYZANTINE_WEIGHT_UPDATED: "byzantine.weight_updated",
|
|
14381
|
-
BYZANTINE_PATTERN_DETECTED: "byzantine.pattern_detected",
|
|
14382
|
-
BYZANTINE_AGENT_FLAGGED: "byzantine.agent_flagged",
|
|
14383
|
-
BYZANTINE_COLLUSION_SUSPECTED: "byzantine.collusion_suspected",
|
|
14384
|
-
BYZANTINE_ALL: "byzantine.*",
|
|
14385
|
-
// Wildcard
|
|
14386
|
-
ALL: "*"
|
|
14387
|
-
};
|
|
14388
|
-
|
|
14389
14339
|
// src/agents/collaboration/agent-message-router-types.ts
|
|
14390
14340
|
var DEFAULT_ROUTER_CONFIG = {
|
|
14391
14341
|
timeoutMs: AGENT_ROUTER_TIMEOUTS.defaultMs,
|
|
@@ -14863,9 +14813,9 @@ var SkillLibrary = class {
|
|
|
14863
14813
|
config;
|
|
14864
14814
|
logger;
|
|
14865
14815
|
store;
|
|
14866
|
-
constructor(config = {},
|
|
14816
|
+
constructor(config = {}, logger55) {
|
|
14867
14817
|
this.config = { ...DEFAULT_SKILL_LIBRARY_CONFIG2, ...config };
|
|
14868
|
-
this.logger =
|
|
14818
|
+
this.logger = logger55 ?? createLogger({ component: "SkillLibrary" });
|
|
14869
14819
|
this.store = {
|
|
14870
14820
|
skills: /* @__PURE__ */ new Map(),
|
|
14871
14821
|
executions: /* @__PURE__ */ new Map(),
|
|
@@ -15140,8 +15090,8 @@ var SkillLibrary = class {
|
|
|
15140
15090
|
return scored.sort((a, b) => b.score - a.score).map((s) => s.skill);
|
|
15141
15091
|
}
|
|
15142
15092
|
};
|
|
15143
|
-
function createSkillLibrary(config,
|
|
15144
|
-
return new SkillLibrary(config,
|
|
15093
|
+
function createSkillLibrary(config, logger55) {
|
|
15094
|
+
return new SkillLibrary(config, logger55);
|
|
15145
15095
|
}
|
|
15146
15096
|
|
|
15147
15097
|
// src/agents/skills/skill-composer.ts
|
|
@@ -15156,10 +15106,10 @@ var SkillComposer = class {
|
|
|
15156
15106
|
config;
|
|
15157
15107
|
logger;
|
|
15158
15108
|
library;
|
|
15159
|
-
constructor(library, config = {},
|
|
15109
|
+
constructor(library, config = {}, logger55) {
|
|
15160
15110
|
this.library = library;
|
|
15161
15111
|
this.config = { ...DEFAULT_COMPOSER_CONFIG, ...config };
|
|
15162
|
-
this.logger =
|
|
15112
|
+
this.logger = logger55 ?? createLogger({ component: "SkillComposer" });
|
|
15163
15113
|
}
|
|
15164
15114
|
/**
|
|
15165
15115
|
* Creates a composition plan for a task.
|
|
@@ -15389,8 +15339,8 @@ var SkillComposer = class {
|
|
|
15389
15339
|
return errors;
|
|
15390
15340
|
}
|
|
15391
15341
|
};
|
|
15392
|
-
function createSkillComposer(library, config,
|
|
15393
|
-
return new SkillComposer(library, config,
|
|
15342
|
+
function createSkillComposer(library, config, logger55) {
|
|
15343
|
+
return new SkillComposer(library, config, logger55);
|
|
15394
15344
|
}
|
|
15395
15345
|
|
|
15396
15346
|
// src/agents/skills/skill-dependency-graph-helpers.ts
|
|
@@ -16085,10 +16035,10 @@ var SkillLoader = class {
|
|
|
16085
16035
|
library;
|
|
16086
16036
|
logger;
|
|
16087
16037
|
mappingIndex;
|
|
16088
|
-
constructor(library, config,
|
|
16038
|
+
constructor(library, config, logger55) {
|
|
16089
16039
|
this.library = library;
|
|
16090
16040
|
this.config = { ...DEFAULT_SKILL_LOADER_CONFIG, ...config };
|
|
16091
|
-
this.logger =
|
|
16041
|
+
this.logger = logger55 ?? createLogger({ component: "SkillLoader" });
|
|
16092
16042
|
this.mappingIndex = /* @__PURE__ */ new Map();
|
|
16093
16043
|
for (const mapping of this.config.mappings) {
|
|
16094
16044
|
this.mappingIndex.set(mapping.role, mapping);
|
|
@@ -16311,8 +16261,8 @@ var SkillLoader = class {
|
|
|
16311
16261
|
return ok(orderResult.value);
|
|
16312
16262
|
}
|
|
16313
16263
|
};
|
|
16314
|
-
function createSkillLoader(library, config,
|
|
16315
|
-
return new SkillLoader(library, config,
|
|
16264
|
+
function createSkillLoader(library, config, logger55) {
|
|
16265
|
+
return new SkillLoader(library, config, logger55);
|
|
16316
16266
|
}
|
|
16317
16267
|
|
|
16318
16268
|
// src/agents/skills/external-pack-loader.ts
|
|
@@ -16374,13 +16324,13 @@ function validateManifest(raw, packName, source) {
|
|
|
16374
16324
|
}
|
|
16375
16325
|
return ok(parseResult2.data);
|
|
16376
16326
|
}
|
|
16377
|
-
async function loadExternalPack(packSource,
|
|
16327
|
+
async function loadExternalPack(packSource, logger55) {
|
|
16378
16328
|
const { name, source, enabled } = packSource;
|
|
16379
16329
|
if (!enabled) {
|
|
16380
|
-
|
|
16330
|
+
logger55.debug("Skipping disabled external pack", { name, source });
|
|
16381
16331
|
return ok({ packName: name, skillCount: 0, skills: [] });
|
|
16382
16332
|
}
|
|
16383
|
-
|
|
16333
|
+
logger55.info("Loading external skill pack", { name, source });
|
|
16384
16334
|
try {
|
|
16385
16335
|
const importPath = await resolveImportPath(source);
|
|
16386
16336
|
const module = await import(importPath);
|
|
@@ -16390,7 +16340,7 @@ async function loadExternalPack(packSource, logger54) {
|
|
|
16390
16340
|
return validationResult;
|
|
16391
16341
|
}
|
|
16392
16342
|
const manifest = validationResult.value;
|
|
16393
|
-
|
|
16343
|
+
logger55.info("External pack loaded successfully", {
|
|
16394
16344
|
name: manifest.name,
|
|
16395
16345
|
version: manifest.version,
|
|
16396
16346
|
skillCount: manifest.skills.length
|
|
@@ -16411,22 +16361,22 @@ async function loadExternalPack(packSource, logger54) {
|
|
|
16411
16361
|
);
|
|
16412
16362
|
}
|
|
16413
16363
|
}
|
|
16414
|
-
async function loadAllExternalPacks(packs,
|
|
16364
|
+
async function loadAllExternalPacks(packs, logger55) {
|
|
16415
16365
|
const loaded = [];
|
|
16416
16366
|
const errors = [];
|
|
16417
16367
|
for (const pack of packs) {
|
|
16418
|
-
const result = await loadExternalPack(pack,
|
|
16368
|
+
const result = await loadExternalPack(pack, logger55);
|
|
16419
16369
|
if (result.ok) {
|
|
16420
16370
|
loaded.push(result.value);
|
|
16421
16371
|
} else {
|
|
16422
16372
|
errors.push(result.error);
|
|
16423
|
-
|
|
16373
|
+
logger55.warn("Failed to load external pack", {
|
|
16424
16374
|
name: pack.name,
|
|
16425
16375
|
error: result.error.message
|
|
16426
16376
|
});
|
|
16427
16377
|
}
|
|
16428
16378
|
}
|
|
16429
|
-
|
|
16379
|
+
logger55.info("External pack loading complete", {
|
|
16430
16380
|
loaded: loaded.length,
|
|
16431
16381
|
errors: errors.length,
|
|
16432
16382
|
totalSkills: loaded.reduce((sum, r) => sum + r.skillCount, 0)
|
|
@@ -16888,9 +16838,9 @@ var SicaVersionManager = class {
|
|
|
16888
16838
|
versions;
|
|
16889
16839
|
events;
|
|
16890
16840
|
activeVersionId;
|
|
16891
|
-
constructor(config = {},
|
|
16841
|
+
constructor(config = {}, logger55) {
|
|
16892
16842
|
this.config = { ...DEFAULT_SICA_CONFIG2, ...config };
|
|
16893
|
-
this.logger =
|
|
16843
|
+
this.logger = logger55 ?? createLogger({ component: "SicaVersionManager" });
|
|
16894
16844
|
this.versions = /* @__PURE__ */ new Map();
|
|
16895
16845
|
this.events = [];
|
|
16896
16846
|
this.activeVersionId = null;
|
|
@@ -21310,9 +21260,9 @@ var TemplateRegistry = class {
|
|
|
21310
21260
|
await this.ensureInitialized();
|
|
21311
21261
|
const { templates, errors } = await loadTemplatesFromDirectory(directoryPath);
|
|
21312
21262
|
if (errors.length > 0) {
|
|
21313
|
-
const
|
|
21263
|
+
const logger55 = createLogger({ component: "TemplateRegistry" });
|
|
21314
21264
|
for (const error of errors) {
|
|
21315
|
-
|
|
21265
|
+
logger55.warn("Template loading warning", { error: error.message });
|
|
21316
21266
|
}
|
|
21317
21267
|
}
|
|
21318
21268
|
let loadedCount = 0;
|
|
@@ -21324,8 +21274,8 @@ var TemplateRegistry = class {
|
|
|
21324
21274
|
loadedCount++;
|
|
21325
21275
|
}
|
|
21326
21276
|
} catch (regError) {
|
|
21327
|
-
const
|
|
21328
|
-
|
|
21277
|
+
const logger55 = createLogger({ component: "TemplateRegistry" });
|
|
21278
|
+
logger55.warn("Template registration failed", {
|
|
21329
21279
|
template: definition.name,
|
|
21330
21280
|
error: regError instanceof Error ? regError.message : String(regError)
|
|
21331
21281
|
});
|
|
@@ -22174,11 +22124,11 @@ var BudgetCircuitError = class extends NexusError {
|
|
|
22174
22124
|
|
|
22175
22125
|
// src/workflows/budget-circuit-breaker.ts
|
|
22176
22126
|
var BudgetCircuitBreaker = class {
|
|
22177
|
-
constructor(maxTokens, config,
|
|
22127
|
+
constructor(maxTokens, config, logger55) {
|
|
22178
22128
|
this.maxTokens = maxTokens;
|
|
22179
22129
|
this.config = { ...DEFAULT_BUDGET_CIRCUIT_CONFIG, ...config };
|
|
22180
22130
|
this.lastStateChange = getTimeProvider().now();
|
|
22181
|
-
this.logger =
|
|
22131
|
+
this.logger = logger55 ?? createLogger({ component: "budget-circuit-breaker" });
|
|
22182
22132
|
}
|
|
22183
22133
|
state = "closed";
|
|
22184
22134
|
lastStateChange;
|
|
@@ -22488,10 +22438,10 @@ function createSkippedResult() {
|
|
|
22488
22438
|
circuitState: "closed"
|
|
22489
22439
|
};
|
|
22490
22440
|
}
|
|
22491
|
-
function logEnforcementResult(
|
|
22441
|
+
function logEnforcementResult(logger55, stepId, result, currentUsagePercent) {
|
|
22492
22442
|
const usagePercent = Math.round(currentUsagePercent * 100);
|
|
22493
22443
|
if (!result.allowed) {
|
|
22494
|
-
|
|
22444
|
+
logger55.warn("Budget enforcement blocked step", {
|
|
22495
22445
|
stepId,
|
|
22496
22446
|
reason: result.reason,
|
|
22497
22447
|
circuitState: result.circuitState,
|
|
@@ -22501,14 +22451,14 @@ function logEnforcementResult(logger54, stepId, result, currentUsagePercent) {
|
|
|
22501
22451
|
return;
|
|
22502
22452
|
}
|
|
22503
22453
|
if (result.warning !== void 0) {
|
|
22504
|
-
|
|
22454
|
+
logger55.warn("Budget enforcement warning", {
|
|
22505
22455
|
stepId,
|
|
22506
22456
|
warning: result.warning,
|
|
22507
22457
|
currentUsage: usagePercent
|
|
22508
22458
|
});
|
|
22509
22459
|
return;
|
|
22510
22460
|
}
|
|
22511
|
-
|
|
22461
|
+
logger55.debug("Budget enforcement passed for step", {
|
|
22512
22462
|
stepId,
|
|
22513
22463
|
currentUsage: usagePercent,
|
|
22514
22464
|
allocatedTokens: result.allocatedTokens
|
|
@@ -22544,15 +22494,15 @@ function buildFinalOutput(stepResults) {
|
|
|
22544
22494
|
}
|
|
22545
22495
|
|
|
22546
22496
|
// src/workflows/workflow-engine-execution.ts
|
|
22547
|
-
function createContextManagerForWorkflow(config, workflow,
|
|
22497
|
+
function createContextManagerForWorkflow(config, workflow, logger55) {
|
|
22548
22498
|
if (config.contextManagerConfig === void 0) return void 0;
|
|
22549
22499
|
const budget = workflow.defaultBudget ?? config.defaultBudget;
|
|
22550
|
-
return new ContextManager({ ...config.contextManagerConfig, budget, logger:
|
|
22500
|
+
return new ContextManager({ ...config.contextManagerConfig, budget, logger: logger55 });
|
|
22551
22501
|
}
|
|
22552
|
-
function createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config,
|
|
22502
|
+
function createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config, logger55) {
|
|
22553
22503
|
const budgetConfig = {
|
|
22554
22504
|
engineDefaultBudget: config.defaultBudget,
|
|
22555
|
-
logger:
|
|
22505
|
+
logger: logger55
|
|
22556
22506
|
};
|
|
22557
22507
|
if (workflow.defaultBudget !== void 0) {
|
|
22558
22508
|
budgetConfig.workflowDefaultBudget = workflow.defaultBudget;
|
|
@@ -22587,12 +22537,12 @@ function applyInputDefaults(workflow, inputs) {
|
|
|
22587
22537
|
return merged;
|
|
22588
22538
|
}
|
|
22589
22539
|
function initializeExecution(params) {
|
|
22590
|
-
const { workflow, inputs, config, logger:
|
|
22540
|
+
const { workflow, inputs, config, logger: logger55 } = params;
|
|
22591
22541
|
const executionId = generateUUID();
|
|
22592
22542
|
const startTime = getTimeProvider().now();
|
|
22593
22543
|
const resolvedInputs = applyInputDefaults(workflow, inputs);
|
|
22594
|
-
const contextManager = createContextManagerForWorkflow(config, workflow,
|
|
22595
|
-
const budgetCircuitBreaker = config.enableBudgetEnforcement ? createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config,
|
|
22544
|
+
const contextManager = createContextManagerForWorkflow(config, workflow, logger55);
|
|
22545
|
+
const budgetCircuitBreaker = config.enableBudgetEnforcement ? createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config, logger55) : void 0;
|
|
22596
22546
|
const context = {
|
|
22597
22547
|
workflowId: workflow.name,
|
|
22598
22548
|
executionId,
|
|
@@ -22612,7 +22562,7 @@ function initializeExecution(params) {
|
|
|
22612
22562
|
startTime
|
|
22613
22563
|
};
|
|
22614
22564
|
if (contextManager !== void 0) {
|
|
22615
|
-
|
|
22565
|
+
logger55.debug("Context manager initialized for workflow execution", {
|
|
22616
22566
|
executionId,
|
|
22617
22567
|
workflowName: workflow.name,
|
|
22618
22568
|
budget: workflow.defaultBudget ?? config.defaultBudget
|
|
@@ -22621,10 +22571,10 @@ function initializeExecution(params) {
|
|
|
22621
22571
|
return { executionId, context, startTime, execution };
|
|
22622
22572
|
}
|
|
22623
22573
|
function enforceStepBudgets(options) {
|
|
22624
|
-
const { steps, context, workflow, totalSteps, config, logger:
|
|
22574
|
+
const { steps, context, workflow, totalSteps, config, logger: logger55 } = options;
|
|
22625
22575
|
const budgetConfig = {
|
|
22626
22576
|
engineDefaultBudget: config.defaultBudget,
|
|
22627
|
-
logger:
|
|
22577
|
+
logger: logger55
|
|
22628
22578
|
};
|
|
22629
22579
|
if (workflow.defaultBudget !== void 0) {
|
|
22630
22580
|
budgetConfig.workflowDefaultBudget = workflow.defaultBudget;
|
|
@@ -22909,29 +22859,29 @@ function createExpertFactoryWithAdapter(adapter) {
|
|
|
22909
22859
|
};
|
|
22910
22860
|
return new ExpertFactoryAdapter(factoryWrapper);
|
|
22911
22861
|
}
|
|
22912
|
-
function adaptLoggerForStepExecutor(
|
|
22862
|
+
function adaptLoggerForStepExecutor(logger55) {
|
|
22913
22863
|
return {
|
|
22914
22864
|
debug: (message, data) => {
|
|
22915
|
-
|
|
22865
|
+
logger55.debug(message, data);
|
|
22916
22866
|
},
|
|
22917
22867
|
info: (message, data) => {
|
|
22918
|
-
|
|
22868
|
+
logger55.info(message, data);
|
|
22919
22869
|
},
|
|
22920
22870
|
warn: (message, data) => {
|
|
22921
|
-
|
|
22871
|
+
logger55.warn(message, data);
|
|
22922
22872
|
},
|
|
22923
22873
|
error: (message, data) => {
|
|
22924
22874
|
if (data !== void 0) {
|
|
22925
22875
|
const errorContext = { ...data };
|
|
22926
|
-
|
|
22876
|
+
logger55.error(message, void 0, errorContext);
|
|
22927
22877
|
} else {
|
|
22928
|
-
|
|
22878
|
+
logger55.error(message);
|
|
22929
22879
|
}
|
|
22930
22880
|
}
|
|
22931
22881
|
};
|
|
22932
22882
|
}
|
|
22933
|
-
function createRealStepExecutorCallback(expertFactory,
|
|
22934
|
-
const adaptedLogger = adaptLoggerForStepExecutor(
|
|
22883
|
+
function createRealStepExecutorCallback(expertFactory, logger55, workflowId) {
|
|
22884
|
+
const adaptedLogger = adaptLoggerForStepExecutor(logger55);
|
|
22935
22885
|
const executor = createStepExecutor({ expertFactory, logger: adaptedLogger });
|
|
22936
22886
|
return async (step, ctx) => {
|
|
22937
22887
|
const startTime = getTimeProvider().now();
|
|
@@ -22947,7 +22897,7 @@ function createRealStepExecutorCallback(expertFactory, logger54, workflowId) {
|
|
|
22947
22897
|
}
|
|
22948
22898
|
const result = await executor.execute(step, workflowCtx);
|
|
22949
22899
|
if (!result.ok) {
|
|
22950
|
-
|
|
22900
|
+
logger55.warn("Step execution failed", {
|
|
22951
22901
|
stepId: step.id,
|
|
22952
22902
|
error: result.error.message
|
|
22953
22903
|
});
|
|
@@ -23007,10 +22957,10 @@ function adaptExecutionPlan(plannerPlan) {
|
|
|
23007
22957
|
}));
|
|
23008
22958
|
return { phases };
|
|
23009
22959
|
}
|
|
23010
|
-
function createMockStepExecutor(
|
|
22960
|
+
function createMockStepExecutor(logger55) {
|
|
23011
22961
|
return (step, _ctx) => {
|
|
23012
22962
|
const startTime = getTimeProvider().now();
|
|
23013
|
-
|
|
22963
|
+
logger55.debug("Executing step (mock)", {
|
|
23014
22964
|
stepId: step.id,
|
|
23015
22965
|
agent: step.agent,
|
|
23016
22966
|
action: step.action
|
|
@@ -23019,16 +22969,16 @@ function createMockStepExecutor(logger54) {
|
|
|
23019
22969
|
};
|
|
23020
22970
|
}
|
|
23021
22971
|
function resolveStepExecutor(options) {
|
|
23022
|
-
const { logger:
|
|
22972
|
+
const { logger: logger55, expertFactory, workflowId, useMockExecutor } = options;
|
|
23023
22973
|
if (useMockExecutor === true) {
|
|
23024
|
-
|
|
22974
|
+
logger55.warn(
|
|
23025
22975
|
"useMockExecutor enabled; workflow steps will return mock results (NOT RECOMMENDED)"
|
|
23026
22976
|
);
|
|
23027
|
-
return createMockStepExecutor(
|
|
22977
|
+
return createMockStepExecutor(logger55);
|
|
23028
22978
|
}
|
|
23029
22979
|
if (expertFactory !== void 0 && workflowId !== void 0) {
|
|
23030
|
-
|
|
23031
|
-
return createRealStepExecutorCallback(expertFactory,
|
|
22980
|
+
logger55.info("Using real StepExecutor with ExpertFactory", { workflowId });
|
|
22981
|
+
return createRealStepExecutorCallback(expertFactory, logger55, workflowId);
|
|
23032
22982
|
}
|
|
23033
22983
|
if (expertFactory !== void 0 && workflowId === void 0) {
|
|
23034
22984
|
throw new WorkflowExecutionUnavailableError("expertFactory provided but workflowId missing");
|
|
@@ -23039,9 +22989,9 @@ function resolveStepExecutor(options) {
|
|
|
23039
22989
|
}
|
|
23040
22990
|
function createExecutePhase(options) {
|
|
23041
22991
|
const stepExecutor = resolveStepExecutor(options);
|
|
23042
|
-
const { logger:
|
|
22992
|
+
const { logger: logger55 } = options;
|
|
23043
22993
|
return async (steps, context, executionOptions) => {
|
|
23044
|
-
|
|
22994
|
+
logger55.debug("Executing phase", {
|
|
23045
22995
|
stepCount: steps.length,
|
|
23046
22996
|
executionId: context.executionId,
|
|
23047
22997
|
maxConcurrency: executionOptions.maxConcurrency
|
|
@@ -23092,26 +23042,26 @@ function createAdaptedExecutionPlan() {
|
|
|
23092
23042
|
return ok(adaptExecutionPlan(planResult.value));
|
|
23093
23043
|
};
|
|
23094
23044
|
}
|
|
23095
|
-
function resolveExpertFactory(config,
|
|
23045
|
+
function resolveExpertFactory(config, logger55) {
|
|
23096
23046
|
if (config?.expertFactory !== void 0) {
|
|
23097
23047
|
return config.expertFactory;
|
|
23098
23048
|
}
|
|
23099
23049
|
if (config?.modelAdapter !== void 0) {
|
|
23100
|
-
|
|
23050
|
+
logger55.info("Created ExpertFactory with provided model adapter");
|
|
23101
23051
|
return createExpertFactoryWithAdapter(config.modelAdapter);
|
|
23102
23052
|
}
|
|
23103
23053
|
return void 0;
|
|
23104
23054
|
}
|
|
23105
23055
|
function createWorkflowEngineDeps(config) {
|
|
23106
|
-
const
|
|
23056
|
+
const logger55 = config?.logger ?? createLogger({ component: "WorkflowEngine" });
|
|
23107
23057
|
const builtInTemplates = config?.builtInTemplates ?? cachedBuiltInTemplates ?? /* @__PURE__ */ new Map();
|
|
23108
|
-
const expertFactory = resolveExpertFactory(config,
|
|
23058
|
+
const expertFactory = resolveExpertFactory(config, logger55);
|
|
23109
23059
|
return {
|
|
23110
23060
|
parseWorkflow: createParseWorkflow(),
|
|
23111
23061
|
loadWorkflowFile: createLoadWorkflowFile(),
|
|
23112
23062
|
createExecutionPlan: createAdaptedExecutionPlan(),
|
|
23113
23063
|
executePhase: createExecutePhase({
|
|
23114
|
-
logger:
|
|
23064
|
+
logger: logger55,
|
|
23115
23065
|
expertFactory,
|
|
23116
23066
|
workflowId: "default",
|
|
23117
23067
|
useMockExecutor: config?.useMockExecutor
|
|
@@ -23142,32 +23092,32 @@ async function createInitializedWorkflowEngine(config) {
|
|
|
23142
23092
|
function shouldSkipAdapterDetection(config) {
|
|
23143
23093
|
return config?.modelAdapter !== void 0 || config?.expertFactory !== void 0 || config?.useMockExecutor === true;
|
|
23144
23094
|
}
|
|
23145
|
-
function tryAutoDetectAdapter(
|
|
23095
|
+
function tryAutoDetectAdapter(logger55) {
|
|
23146
23096
|
try {
|
|
23147
|
-
|
|
23148
|
-
const registry = getGlobalRegistry({ logger:
|
|
23097
|
+
logger55.info("Auto-detecting model adapter for workflow execution");
|
|
23098
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
23149
23099
|
const adapter = registry.getDefault();
|
|
23150
|
-
|
|
23100
|
+
logger55.info("Using unified registry default adapter");
|
|
23151
23101
|
return adapter;
|
|
23152
23102
|
} catch (error) {
|
|
23153
23103
|
const message = getErrorMessage(error);
|
|
23154
|
-
|
|
23104
|
+
logger55.warn("No model adapter available, using mock executor", { error: message });
|
|
23155
23105
|
return void 0;
|
|
23156
23106
|
}
|
|
23157
23107
|
}
|
|
23158
23108
|
function createWorkflowEngineDepsAsync(config) {
|
|
23159
|
-
const
|
|
23109
|
+
const logger55 = config?.logger ?? createLogger({ component: "WorkflowEngine" });
|
|
23160
23110
|
if (shouldSkipAdapterDetection(config)) {
|
|
23161
|
-
|
|
23111
|
+
logger55.debug("Skipping adapter detection - using provided config");
|
|
23162
23112
|
return Promise.resolve(createWorkflowEngineDeps(config));
|
|
23163
23113
|
}
|
|
23164
|
-
const adapter = tryAutoDetectAdapter(
|
|
23114
|
+
const adapter = tryAutoDetectAdapter(logger55);
|
|
23165
23115
|
if (adapter !== void 0) {
|
|
23166
|
-
return Promise.resolve(createWorkflowEngineDeps({ ...config, modelAdapter: adapter, logger:
|
|
23116
|
+
return Promise.resolve(createWorkflowEngineDeps({ ...config, modelAdapter: adapter, logger: logger55 }));
|
|
23167
23117
|
}
|
|
23168
23118
|
if (config?.useMockExecutor === true) {
|
|
23169
|
-
|
|
23170
|
-
return Promise.resolve(createWorkflowEngineDeps({ ...config, useMockExecutor: true, logger:
|
|
23119
|
+
logger55.warn("Using mock executor as explicitly configured (no real adapter available)");
|
|
23120
|
+
return Promise.resolve(createWorkflowEngineDeps({ ...config, useMockExecutor: true, logger: logger55 }));
|
|
23171
23121
|
}
|
|
23172
23122
|
return Promise.reject(
|
|
23173
23123
|
new WorkflowExecutionUnavailableError(
|
|
@@ -23249,23 +23199,23 @@ function createToolLogger(parentLogger, toolName, requestId) {
|
|
|
23249
23199
|
}
|
|
23250
23200
|
return parentLogger.child(context);
|
|
23251
23201
|
}
|
|
23252
|
-
function logToolStart(
|
|
23253
|
-
|
|
23202
|
+
function logToolStart(logger55, toolName, args) {
|
|
23203
|
+
logger55.info("Tool execution started", {
|
|
23254
23204
|
tool: toolName,
|
|
23255
23205
|
hasArgs: args !== void 0,
|
|
23256
23206
|
argKeys: args !== void 0 ? Object.keys(args) : []
|
|
23257
23207
|
});
|
|
23258
23208
|
}
|
|
23259
|
-
function logToolSuccess(
|
|
23260
|
-
|
|
23209
|
+
function logToolSuccess(logger55, toolName, durationMs, resultInfo) {
|
|
23210
|
+
logger55.info("Tool execution completed", {
|
|
23261
23211
|
tool: toolName,
|
|
23262
23212
|
durationMs,
|
|
23263
23213
|
success: true,
|
|
23264
23214
|
...resultInfo
|
|
23265
23215
|
});
|
|
23266
23216
|
}
|
|
23267
|
-
function logToolError(
|
|
23268
|
-
|
|
23217
|
+
function logToolError(logger55, toolName, error, durationMs) {
|
|
23218
|
+
logger55.error("Tool execution failed", error, {
|
|
23269
23219
|
tool: toolName,
|
|
23270
23220
|
durationMs,
|
|
23271
23221
|
success: false,
|
|
@@ -23278,8 +23228,8 @@ function createTimer() {
|
|
|
23278
23228
|
elapsed: () => getTimeProvider().now() - startTime
|
|
23279
23229
|
};
|
|
23280
23230
|
}
|
|
23281
|
-
function withLogging(toolName, handler2,
|
|
23282
|
-
const toolLogger = createToolLogger(
|
|
23231
|
+
function withLogging(toolName, handler2, logger55) {
|
|
23232
|
+
const toolLogger = createToolLogger(logger55, toolName);
|
|
23283
23233
|
return async (args) => {
|
|
23284
23234
|
const timer = createTimer();
|
|
23285
23235
|
logToolStart(toolLogger, toolName, args);
|
|
@@ -23365,9 +23315,9 @@ var AuthHandler = class {
|
|
|
23365
23315
|
config;
|
|
23366
23316
|
logger;
|
|
23367
23317
|
storedToken;
|
|
23368
|
-
constructor(config,
|
|
23318
|
+
constructor(config, logger55) {
|
|
23369
23319
|
this.config = resolveAuthConfig(config);
|
|
23370
|
-
this.logger =
|
|
23320
|
+
this.logger = logger55 ?? createLogger({ component: "AuthHandler" });
|
|
23371
23321
|
if (this.config.enabled) this.loadToken();
|
|
23372
23322
|
}
|
|
23373
23323
|
/**
|
|
@@ -23466,22 +23416,22 @@ var AuthHandler = class {
|
|
|
23466
23416
|
};
|
|
23467
23417
|
|
|
23468
23418
|
// src/mcp/middleware/tool-error-handler.ts
|
|
23469
|
-
function toolErrorResponse(prefix, error,
|
|
23419
|
+
function toolErrorResponse(prefix, error, logger55) {
|
|
23470
23420
|
const message = getErrorMessage(error);
|
|
23471
|
-
if (
|
|
23421
|
+
if (logger55 !== void 0) {
|
|
23472
23422
|
const errorObj = error instanceof Error ? error : new Error(message);
|
|
23473
|
-
|
|
23423
|
+
logger55.error(prefix, errorObj);
|
|
23474
23424
|
}
|
|
23475
23425
|
return {
|
|
23476
23426
|
isError: true,
|
|
23477
23427
|
content: [{ type: "text", text: `${prefix}: ${message}` }]
|
|
23478
23428
|
};
|
|
23479
23429
|
}
|
|
23480
|
-
async function withToolError(prefix,
|
|
23430
|
+
async function withToolError(prefix, logger55, fn) {
|
|
23481
23431
|
try {
|
|
23482
23432
|
return await fn();
|
|
23483
23433
|
} catch (error) {
|
|
23484
|
-
return toolErrorResponse(prefix, error,
|
|
23434
|
+
return toolErrorResponse(prefix, error, logger55);
|
|
23485
23435
|
}
|
|
23486
23436
|
}
|
|
23487
23437
|
|
|
@@ -25961,47 +25911,47 @@ function createSubscriptions(eventBus, subs, handler2) {
|
|
|
25961
25911
|
}
|
|
25962
25912
|
return subscriptions;
|
|
25963
25913
|
}
|
|
25964
|
-
function createCleanupFunction(subscriptions, eventBus,
|
|
25914
|
+
function createCleanupFunction(subscriptions, eventBus, logger55) {
|
|
25965
25915
|
return () => {
|
|
25966
|
-
|
|
25916
|
+
logger55.debug("Cleaning up EventBus bridge subscriptions");
|
|
25967
25917
|
for (const sub of subscriptions) {
|
|
25968
25918
|
sub.unsubscribe();
|
|
25969
25919
|
}
|
|
25970
|
-
|
|
25920
|
+
logger55.info("EventBus bridge cleanup complete", {
|
|
25971
25921
|
unsubscribedCount: subscriptions.length,
|
|
25972
25922
|
finalStats: eventBus.getStats()
|
|
25973
25923
|
});
|
|
25974
25924
|
};
|
|
25975
25925
|
}
|
|
25976
|
-
function initializeEventBusBridge(observer,
|
|
25926
|
+
function initializeEventBusBridge(observer, logger55, config) {
|
|
25977
25927
|
const mergedConfig = mergeConfig2(config);
|
|
25978
25928
|
if (!mergedConfig.enabled) {
|
|
25979
|
-
|
|
25929
|
+
logger55.debug("EventBus bridge disabled by configuration");
|
|
25980
25930
|
return { initialized: false, subscriptionCount: 0, cleanup: () => {
|
|
25981
25931
|
} };
|
|
25982
25932
|
}
|
|
25983
25933
|
const eventBus = getGlobalEventBus({ maxHistorySize: mergedConfig.maxHistorySize });
|
|
25984
25934
|
const logConfig = mergedConfig.logging;
|
|
25985
|
-
|
|
25935
|
+
logger55.info("Initializing EventBus bridge for MCP server", {
|
|
25986
25936
|
maxHistorySize: mergedConfig.maxHistorySize,
|
|
25987
25937
|
subscriptions: mergedConfig.subscriptions
|
|
25988
25938
|
});
|
|
25989
25939
|
const handler2 = (event) => {
|
|
25990
|
-
handleEvent(event, observer,
|
|
25940
|
+
handleEvent(event, observer, logger55, logConfig);
|
|
25991
25941
|
};
|
|
25992
25942
|
const subscriptions = createSubscriptions(eventBus, mergedConfig.subscriptions, handler2);
|
|
25993
|
-
|
|
25943
|
+
logger55.info("EventBus bridge initialized", {
|
|
25994
25944
|
subscriptionCount: subscriptions.length,
|
|
25995
25945
|
eventBusStats: eventBus.getStats()
|
|
25996
25946
|
});
|
|
25997
|
-
const cleanup = createCleanupFunction(subscriptions, eventBus,
|
|
25947
|
+
const cleanup = createCleanupFunction(subscriptions, eventBus, logger55);
|
|
25998
25948
|
return {
|
|
25999
25949
|
initialized: true,
|
|
26000
25950
|
subscriptionCount: subscriptions.length,
|
|
26001
25951
|
cleanup
|
|
26002
25952
|
};
|
|
26003
25953
|
}
|
|
26004
|
-
function handleEvent(event, observer,
|
|
25954
|
+
function handleEvent(event, observer, logger55, logConfig) {
|
|
26005
25955
|
const isImportant = IMPORTANT_TOPICS.has(event.topic);
|
|
26006
25956
|
const logLevel = isImportant ? logConfig.importantEventLevel : logConfig.frequentEventLevel;
|
|
26007
25957
|
const logContext = {
|
|
@@ -26012,9 +25962,9 @@ function handleEvent(event, observer, logger54, logConfig) {
|
|
|
26012
25962
|
timestamp: event.timestamp
|
|
26013
25963
|
};
|
|
26014
25964
|
if (logLevel === "info") {
|
|
26015
|
-
|
|
25965
|
+
logger55.info(`EventBus: ${event.topic}`, logContext);
|
|
26016
25966
|
} else {
|
|
26017
|
-
|
|
25967
|
+
logger55.debug(`EventBus: ${event.topic}`, logContext);
|
|
26018
25968
|
}
|
|
26019
25969
|
recordEventToObserver(event, observer);
|
|
26020
25970
|
}
|
|
@@ -26192,19 +26142,19 @@ var PROMPT_DEFINITIONS = [
|
|
|
26192
26142
|
];
|
|
26193
26143
|
|
|
26194
26144
|
// src/mcp/prompts/index.ts
|
|
26195
|
-
function registerPrompts(server,
|
|
26145
|
+
function registerPrompts(server, logger55) {
|
|
26196
26146
|
const registered = [];
|
|
26197
26147
|
for (const definition of PROMPT_DEFINITIONS) {
|
|
26198
|
-
registerSinglePrompt(server, definition,
|
|
26148
|
+
registerSinglePrompt(server, definition, logger55);
|
|
26199
26149
|
registered.push(definition.name);
|
|
26200
26150
|
}
|
|
26201
|
-
|
|
26151
|
+
logger55.info("Prompt templates registered", {
|
|
26202
26152
|
count: registered.length,
|
|
26203
26153
|
prompts: registered
|
|
26204
26154
|
});
|
|
26205
26155
|
return { prompts: registered };
|
|
26206
26156
|
}
|
|
26207
|
-
function registerSinglePrompt(server, definition,
|
|
26157
|
+
function registerSinglePrompt(server, definition, logger55) {
|
|
26208
26158
|
server.registerPrompt(
|
|
26209
26159
|
definition.name,
|
|
26210
26160
|
{
|
|
@@ -26212,7 +26162,7 @@ function registerSinglePrompt(server, definition, logger54) {
|
|
|
26212
26162
|
argsSchema: definition.argsSchema
|
|
26213
26163
|
},
|
|
26214
26164
|
(args) => {
|
|
26215
|
-
|
|
26165
|
+
logger55.debug("Prompt requested", { prompt: definition.name });
|
|
26216
26166
|
const messages = definition.buildMessages(args);
|
|
26217
26167
|
return {
|
|
26218
26168
|
description: definition.description,
|
|
@@ -26252,7 +26202,7 @@ function buildModelsPayload() {
|
|
|
26252
26202
|
}))
|
|
26253
26203
|
};
|
|
26254
26204
|
}
|
|
26255
|
-
function registerModelsResource(server,
|
|
26205
|
+
function registerModelsResource(server, logger55) {
|
|
26256
26206
|
server.registerResource(
|
|
26257
26207
|
MODELS_RESOURCE_NAME,
|
|
26258
26208
|
MODELS_RESOURCE_URI,
|
|
@@ -26261,7 +26211,7 @@ function registerModelsResource(server, logger54) {
|
|
|
26261
26211
|
mimeType: "application/json"
|
|
26262
26212
|
},
|
|
26263
26213
|
() => {
|
|
26264
|
-
|
|
26214
|
+
logger55.debug("Reading models resource");
|
|
26265
26215
|
const payload = buildModelsPayload();
|
|
26266
26216
|
return {
|
|
26267
26217
|
contents: [
|
|
@@ -26274,7 +26224,7 @@ function registerModelsResource(server, logger54) {
|
|
|
26274
26224
|
};
|
|
26275
26225
|
}
|
|
26276
26226
|
);
|
|
26277
|
-
|
|
26227
|
+
logger55.info("Registered models resource", { uri: MODELS_RESOURCE_URI });
|
|
26278
26228
|
}
|
|
26279
26229
|
|
|
26280
26230
|
// src/indexer/research-index/research-index-base-types.ts
|
|
@@ -27065,10 +27015,10 @@ ${topicLines}
|
|
|
27065
27015
|
// src/mcp/resources/research-resource.ts
|
|
27066
27016
|
var RESEARCH_RESOURCE_URI = "nexus://research/papers";
|
|
27067
27017
|
var RESEARCH_RESOURCE_NAME = "research-papers";
|
|
27068
|
-
function buildResearchPayload(
|
|
27018
|
+
function buildResearchPayload(logger55) {
|
|
27069
27019
|
const result = parseRegistry();
|
|
27070
27020
|
if (!result.ok) {
|
|
27071
|
-
|
|
27021
|
+
logger55.debug("Research registry not available", {
|
|
27072
27022
|
error: result.error.message
|
|
27073
27023
|
});
|
|
27074
27024
|
return {
|
|
@@ -27102,7 +27052,7 @@ function buildResearchPayload(logger54) {
|
|
|
27102
27052
|
stats: index.stats
|
|
27103
27053
|
};
|
|
27104
27054
|
}
|
|
27105
|
-
function registerResearchResource(server,
|
|
27055
|
+
function registerResearchResource(server, logger55) {
|
|
27106
27056
|
server.registerResource(
|
|
27107
27057
|
RESEARCH_RESOURCE_NAME,
|
|
27108
27058
|
RESEARCH_RESOURCE_URI,
|
|
@@ -27111,9 +27061,9 @@ function registerResearchResource(server, logger54) {
|
|
|
27111
27061
|
mimeType: "application/json"
|
|
27112
27062
|
},
|
|
27113
27063
|
() => {
|
|
27114
|
-
|
|
27064
|
+
logger55.debug("Reading research resource");
|
|
27115
27065
|
try {
|
|
27116
|
-
const payload = buildResearchPayload(
|
|
27066
|
+
const payload = buildResearchPayload(logger55);
|
|
27117
27067
|
return {
|
|
27118
27068
|
contents: [
|
|
27119
27069
|
{
|
|
@@ -27124,7 +27074,7 @@ function registerResearchResource(server, logger54) {
|
|
|
27124
27074
|
]
|
|
27125
27075
|
};
|
|
27126
27076
|
} catch (error) {
|
|
27127
|
-
|
|
27077
|
+
logger55.warn("Failed to build research payload", {
|
|
27128
27078
|
error: getErrorMessage(error)
|
|
27129
27079
|
});
|
|
27130
27080
|
return {
|
|
@@ -27139,7 +27089,7 @@ function registerResearchResource(server, logger54) {
|
|
|
27139
27089
|
}
|
|
27140
27090
|
}
|
|
27141
27091
|
);
|
|
27142
|
-
|
|
27092
|
+
logger55.info("Registered research resource", { uri: RESEARCH_RESOURCE_URI });
|
|
27143
27093
|
}
|
|
27144
27094
|
|
|
27145
27095
|
// src/mcp/tools/create-expert.ts
|
|
@@ -27240,29 +27190,29 @@ var ROLE_TO_TASK_CATEGORY = {
|
|
|
27240
27190
|
pm_expert: "planning",
|
|
27241
27191
|
ux_expert: "planning"
|
|
27242
27192
|
};
|
|
27243
|
-
function resolveAdapterForModelPreference(modelPreference, fallbackAdapter,
|
|
27244
|
-
const registry = getGlobalRegistry({ logger:
|
|
27193
|
+
function resolveAdapterForModelPreference(modelPreference, fallbackAdapter, logger55) {
|
|
27194
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
27245
27195
|
const adapter = registry.getAdapterForModel(modelPreference);
|
|
27246
27196
|
if (adapter === registry.getDefault() && fallbackAdapter !== void 0) {
|
|
27247
|
-
|
|
27197
|
+
logger55.debug("Model preference not in registry, using fallback adapter", { modelPreference });
|
|
27248
27198
|
return fallbackAdapter;
|
|
27249
27199
|
}
|
|
27250
|
-
|
|
27200
|
+
logger55.info("Routing expert to CLI for model preference", { modelPreference });
|
|
27251
27201
|
return adapter;
|
|
27252
27202
|
}
|
|
27253
|
-
function resolveAdapterForRole(role, fallbackAdapter,
|
|
27203
|
+
function resolveAdapterForRole(role, fallbackAdapter, logger55) {
|
|
27254
27204
|
const category = ROLE_TO_TASK_CATEGORY[role];
|
|
27255
27205
|
if (category === void 0) return fallbackAdapter;
|
|
27256
|
-
const registry = getGlobalRegistry({ logger:
|
|
27206
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
27257
27207
|
const adapter = registry.getAdapter(category);
|
|
27258
|
-
|
|
27208
|
+
logger55.info("Auto-routing expert to specialized CLI", {
|
|
27259
27209
|
role,
|
|
27260
27210
|
category,
|
|
27261
27211
|
preferredCli: registry.getRouting(category)?.primaryCli
|
|
27262
27212
|
});
|
|
27263
27213
|
return adapter;
|
|
27264
27214
|
}
|
|
27265
|
-
function getExpertFallbackChain(role, excludeCli,
|
|
27215
|
+
function getExpertFallbackChain(role, excludeCli, logger55) {
|
|
27266
27216
|
const category = ROLE_TO_TASK_CATEGORY[role];
|
|
27267
27217
|
if (category === void 0) return [];
|
|
27268
27218
|
const bucketType = CATEGORY_TO_FALLBACK_TYPE[category];
|
|
@@ -27271,7 +27221,7 @@ function getExpertFallbackChain(role, excludeCli, logger54) {
|
|
|
27271
27221
|
bucketType
|
|
27272
27222
|
);
|
|
27273
27223
|
const filtered = chain.filter((cli) => cli !== excludeCli);
|
|
27274
|
-
|
|
27224
|
+
logger55.debug("Expert fallback chain resolved", { role, category, excludeCli, chain: filtered });
|
|
27275
27225
|
return [...filtered];
|
|
27276
27226
|
}
|
|
27277
27227
|
|
|
@@ -27315,7 +27265,7 @@ function recordExpertOutcome(role, success, durationMs, error) {
|
|
|
27315
27265
|
const store = getOutcomeStore();
|
|
27316
27266
|
const errorMsg = error ?? "expert creation failed";
|
|
27317
27267
|
store.append({
|
|
27318
|
-
id: `expert-${String(
|
|
27268
|
+
id: `expert-${String(getTimeProvider().now())}-${getRandomProvider().random().toString(36).slice(2, 8)}`,
|
|
27319
27269
|
cli: DEFAULT_CLI,
|
|
27320
27270
|
category: resolveCategory(role),
|
|
27321
27271
|
model: "expert",
|
|
@@ -27377,16 +27327,16 @@ function buildResponse(expert) {
|
|
|
27377
27327
|
};
|
|
27378
27328
|
}
|
|
27379
27329
|
function createExpertFromFactory(deps, expertType, modelPreference, role) {
|
|
27380
|
-
const
|
|
27330
|
+
const logger55 = deps.logger ?? createLogger({ tool: "create_expert" });
|
|
27381
27331
|
const options = {};
|
|
27382
27332
|
if (modelPreference !== void 0) {
|
|
27383
27333
|
options.modelOverrides = { modelId: modelPreference };
|
|
27384
27334
|
}
|
|
27385
27335
|
let adapter;
|
|
27386
27336
|
if (modelPreference !== void 0) {
|
|
27387
|
-
adapter = resolveAdapterForModelPreference(modelPreference, deps.modelAdapter,
|
|
27337
|
+
adapter = resolveAdapterForModelPreference(modelPreference, deps.modelAdapter, logger55);
|
|
27388
27338
|
} else if (role !== void 0) {
|
|
27389
|
-
adapter = resolveAdapterForRole(role, deps.modelAdapter,
|
|
27339
|
+
adapter = resolveAdapterForRole(role, deps.modelAdapter, logger55);
|
|
27390
27340
|
} else {
|
|
27391
27341
|
adapter = deps.modelAdapter;
|
|
27392
27342
|
}
|
|
@@ -27457,7 +27407,7 @@ function createCreateExpertHandler(deps) {
|
|
|
27457
27407
|
};
|
|
27458
27408
|
}
|
|
27459
27409
|
function registerCreateExpertTool(server, deps) {
|
|
27460
|
-
const
|
|
27410
|
+
const logger55 = deps.logger ?? createLogger({ tool: "create_expert" });
|
|
27461
27411
|
const toolSchema = {
|
|
27462
27412
|
role: z56.enum([
|
|
27463
27413
|
"code_expert",
|
|
@@ -27477,23 +27427,23 @@ function registerCreateExpertTool(server, deps) {
|
|
|
27477
27427
|
const secureHandler = createSecureHandler(createCreateExpertHandler(deps), {
|
|
27478
27428
|
toolName: "create_expert",
|
|
27479
27429
|
rateLimiter: deps.rateLimiter,
|
|
27480
|
-
logger:
|
|
27430
|
+
logger: logger55
|
|
27481
27431
|
});
|
|
27482
27432
|
const timeoutMs = getToolTimeout("create_expert", deps.security);
|
|
27483
|
-
const wrappedHandler = wrapToolWithTimeout("create_expert", secureHandler, { timeoutMs, logger:
|
|
27433
|
+
const wrappedHandler = wrapToolWithTimeout("create_expert", secureHandler, { timeoutMs, logger: logger55 });
|
|
27484
27434
|
server.registerTool(
|
|
27485
27435
|
"create_expert",
|
|
27486
27436
|
{ description, inputSchema: toolSchema },
|
|
27487
27437
|
toSdkCallback(wrappedHandler)
|
|
27488
27438
|
);
|
|
27489
|
-
|
|
27439
|
+
logger55.info("Registered create_expert tool with secure handler and timeout protection");
|
|
27490
27440
|
}
|
|
27491
|
-
function createDefaultDeps(rateLimiter,
|
|
27441
|
+
function createDefaultDeps(rateLimiter, logger55) {
|
|
27492
27442
|
return {
|
|
27493
27443
|
expertFactory: ExpertFactory,
|
|
27494
27444
|
expertRegistry: /* @__PURE__ */ new Map(),
|
|
27495
27445
|
rateLimiter,
|
|
27496
|
-
...
|
|
27446
|
+
...logger55 !== void 0 ? { logger: logger55 } : {}
|
|
27497
27447
|
};
|
|
27498
27448
|
}
|
|
27499
27449
|
function getAvailableRoles() {
|
|
@@ -27528,7 +27478,7 @@ function buildExpertsPayload() {
|
|
|
27528
27478
|
experts
|
|
27529
27479
|
};
|
|
27530
27480
|
}
|
|
27531
|
-
function registerExpertsResource(server,
|
|
27481
|
+
function registerExpertsResource(server, logger55) {
|
|
27532
27482
|
server.registerResource(
|
|
27533
27483
|
EXPERTS_RESOURCE_NAME,
|
|
27534
27484
|
EXPERTS_RESOURCE_URI,
|
|
@@ -27537,7 +27487,7 @@ function registerExpertsResource(server, logger54) {
|
|
|
27537
27487
|
mimeType: "application/json"
|
|
27538
27488
|
},
|
|
27539
27489
|
() => {
|
|
27540
|
-
|
|
27490
|
+
logger55.debug("Reading experts resource");
|
|
27541
27491
|
const payload = buildExpertsPayload();
|
|
27542
27492
|
return {
|
|
27543
27493
|
contents: [
|
|
@@ -27550,12 +27500,12 @@ function registerExpertsResource(server, logger54) {
|
|
|
27550
27500
|
};
|
|
27551
27501
|
}
|
|
27552
27502
|
);
|
|
27553
|
-
|
|
27503
|
+
logger55.info("Registered experts resource", { uri: EXPERTS_RESOURCE_URI });
|
|
27554
27504
|
}
|
|
27555
27505
|
|
|
27556
27506
|
// src/mcp/resources/index.ts
|
|
27557
|
-
function registerResources(server,
|
|
27558
|
-
const log3 =
|
|
27507
|
+
function registerResources(server, logger55) {
|
|
27508
|
+
const log3 = logger55 ?? createLogger({ component: "mcp-resources" });
|
|
27559
27509
|
log3.info("Registering MCP resources");
|
|
27560
27510
|
registerModelsResource(server, log3);
|
|
27561
27511
|
registerResearchResource(server, log3);
|
|
@@ -27669,11 +27619,11 @@ function validateWorkflowInputs(workflow, inputs) {
|
|
|
27669
27619
|
};
|
|
27670
27620
|
}
|
|
27671
27621
|
async function loadWorkflowFromPath(deps, filePath) {
|
|
27672
|
-
const { workflowEngine, logger:
|
|
27622
|
+
const { workflowEngine, logger: logger55 } = deps;
|
|
27673
27623
|
const allowedDirs = getAllowedWorkflowDirs(deps);
|
|
27674
27624
|
const pathValidation = validateWorkflowPath(filePath, allowedDirs);
|
|
27675
27625
|
if (!pathValidation.ok) {
|
|
27676
|
-
|
|
27626
|
+
logger55?.warn("Workflow path validation failed", {
|
|
27677
27627
|
path: filePath,
|
|
27678
27628
|
error: pathValidation.error.message
|
|
27679
27629
|
});
|
|
@@ -27692,8 +27642,8 @@ async function loadWorkflowFromPath(deps, filePath) {
|
|
|
27692
27642
|
return result;
|
|
27693
27643
|
}
|
|
27694
27644
|
async function loadWorkflowFromName(deps, name) {
|
|
27695
|
-
const { workflowEngine, logger:
|
|
27696
|
-
|
|
27645
|
+
const { workflowEngine, logger: logger55 } = deps;
|
|
27646
|
+
logger55?.debug("Looking up built-in template", { name });
|
|
27697
27647
|
const templates = await workflowEngine.listTemplates();
|
|
27698
27648
|
const found = templates.find((t) => t.name === name);
|
|
27699
27649
|
if (found === void 0) {
|
|
@@ -27717,9 +27667,9 @@ async function loadWorkflowFromName(deps, name) {
|
|
|
27717
27667
|
return { ok: true, value: definition };
|
|
27718
27668
|
}
|
|
27719
27669
|
async function loadWorkflow(deps, template) {
|
|
27720
|
-
const { logger:
|
|
27670
|
+
const { logger: logger55 } = deps;
|
|
27721
27671
|
if (isFilePath(template)) {
|
|
27722
|
-
|
|
27672
|
+
logger55?.debug("Loading workflow from file", { path: template });
|
|
27723
27673
|
return loadWorkflowFromPath(deps, template);
|
|
27724
27674
|
}
|
|
27725
27675
|
return loadWorkflowFromName(deps, template);
|
|
@@ -27766,15 +27716,15 @@ function formatValidationErrors(validation) {
|
|
|
27766
27716
|
|
|
27767
27717
|
// src/mcp/tools/run-workflow.ts
|
|
27768
27718
|
async function executeWorkflow(deps, workflow, inputs) {
|
|
27769
|
-
const { workflowEngine, logger:
|
|
27770
|
-
|
|
27719
|
+
const { workflowEngine, logger: logger55 } = deps;
|
|
27720
|
+
logger55?.info("Executing workflow", {
|
|
27771
27721
|
workflowName: workflow.name,
|
|
27772
27722
|
inputCount: Object.keys(inputs).length
|
|
27773
27723
|
});
|
|
27774
27724
|
const startTime = getTimeProvider().now();
|
|
27775
27725
|
const result = await workflowEngine.execute(workflow, inputs);
|
|
27776
27726
|
if (!result.ok) {
|
|
27777
|
-
|
|
27727
|
+
logger55?.error("Workflow execution failed", result.error, {
|
|
27778
27728
|
workflowName: workflow.name
|
|
27779
27729
|
});
|
|
27780
27730
|
return {
|
|
@@ -27783,7 +27733,7 @@ async function executeWorkflow(deps, workflow, inputs) {
|
|
|
27783
27733
|
};
|
|
27784
27734
|
}
|
|
27785
27735
|
const workflowResult = result.value;
|
|
27786
|
-
|
|
27736
|
+
logger55?.info("Workflow completed", {
|
|
27787
27737
|
workflowName: workflow.name,
|
|
27788
27738
|
durationMs: getTimeProvider().now() - startTime,
|
|
27789
27739
|
stepCount: workflowResult.stepResults.length
|
|
@@ -27896,16 +27846,16 @@ function createRunWorkflowHandler(deps) {
|
|
|
27896
27846
|
};
|
|
27897
27847
|
}
|
|
27898
27848
|
function registerRunWorkflowTool(server, deps) {
|
|
27899
|
-
const
|
|
27849
|
+
const logger55 = deps.logger ?? createLogger({ tool: "run_workflow" });
|
|
27900
27850
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
27901
27851
|
const depsWithNotifier = { ...deps, notifier };
|
|
27902
27852
|
const secureHandler = createSecureHandler(createRunWorkflowHandler(depsWithNotifier), {
|
|
27903
27853
|
toolName: "run_workflow",
|
|
27904
27854
|
rateLimiter: deps.rateLimiter,
|
|
27905
|
-
logger:
|
|
27855
|
+
logger: logger55
|
|
27906
27856
|
});
|
|
27907
27857
|
const timeoutMs = getToolTimeout("run_workflow", deps.security);
|
|
27908
|
-
const wrappedHandler = wrapToolWithTimeout("run_workflow", secureHandler, { timeoutMs, logger:
|
|
27858
|
+
const wrappedHandler = wrapToolWithTimeout("run_workflow", secureHandler, { timeoutMs, logger: logger55 });
|
|
27909
27859
|
server.registerTool(
|
|
27910
27860
|
"run_workflow",
|
|
27911
27861
|
{
|
|
@@ -27914,7 +27864,7 @@ function registerRunWorkflowTool(server, deps) {
|
|
|
27914
27864
|
},
|
|
27915
27865
|
toSdkCallback(wrappedHandler)
|
|
27916
27866
|
);
|
|
27917
|
-
|
|
27867
|
+
logger55.info("Registered run_workflow tool with secure handler and timeout protection");
|
|
27918
27868
|
}
|
|
27919
27869
|
|
|
27920
27870
|
// src/orchestration/graph/graph-types.ts
|
|
@@ -30078,8 +30028,8 @@ var OrchestratorAdapter = class {
|
|
|
30078
30028
|
history = [];
|
|
30079
30029
|
logger;
|
|
30080
30030
|
agent = null;
|
|
30081
|
-
constructor(
|
|
30082
|
-
this.logger =
|
|
30031
|
+
constructor(logger55) {
|
|
30032
|
+
this.logger = logger55 ?? createLogger({ component: "OrchestratorAdapter" });
|
|
30083
30033
|
}
|
|
30084
30034
|
setOrchestrator(agent) {
|
|
30085
30035
|
this.agent = agent;
|
|
@@ -30219,10 +30169,10 @@ var WorkflowOrchestratorAdapter = class {
|
|
|
30219
30169
|
logger;
|
|
30220
30170
|
executions = /* @__PURE__ */ new Map();
|
|
30221
30171
|
history = [];
|
|
30222
|
-
constructor(engine,
|
|
30172
|
+
constructor(engine, logger55) {
|
|
30223
30173
|
this.id = `workflow-${randomUUID10().slice(0, 8)}`;
|
|
30224
30174
|
this.engine = engine;
|
|
30225
|
-
this.logger =
|
|
30175
|
+
this.logger = logger55 ?? createLogger({ component: "WorkflowOrchestratorAdapter" });
|
|
30226
30176
|
}
|
|
30227
30177
|
async execute(definition, inputs, _options) {
|
|
30228
30178
|
if (definition.type !== "workflow") {
|
|
@@ -30414,22 +30364,22 @@ var OrchestratorFactory = class {
|
|
|
30414
30364
|
}
|
|
30415
30365
|
};
|
|
30416
30366
|
async function createOrchestratorFactory(config) {
|
|
30417
|
-
const
|
|
30418
|
-
|
|
30367
|
+
const logger55 = config?.logger ?? createLogger({ component: "OrchestratorFactory" });
|
|
30368
|
+
logger55.info("Initializing OrchestratorFactory");
|
|
30419
30369
|
let workflowEngine;
|
|
30420
30370
|
try {
|
|
30421
30371
|
const workflowConfig = {
|
|
30422
30372
|
...config?.workflowConfig,
|
|
30423
|
-
logger:
|
|
30373
|
+
logger: logger55
|
|
30424
30374
|
};
|
|
30425
30375
|
if (config?.modelAdapter !== void 0) {
|
|
30426
30376
|
workflowConfig.modelAdapter = config.modelAdapter;
|
|
30427
30377
|
}
|
|
30428
30378
|
workflowEngine = await createProductionWorkflowEngine(workflowConfig);
|
|
30429
|
-
|
|
30379
|
+
logger55.info("WorkflowEngine initialized");
|
|
30430
30380
|
} catch (error) {
|
|
30431
30381
|
const message = getErrorMessage(error);
|
|
30432
|
-
|
|
30382
|
+
logger55.warn("WorkflowEngine initialization failed, workflow orchestration unavailable", {
|
|
30433
30383
|
error: message
|
|
30434
30384
|
});
|
|
30435
30385
|
}
|
|
@@ -30440,12 +30390,12 @@ async function createOrchestratorFactory(config) {
|
|
|
30440
30390
|
var MAX_OUTCOMES2 = 200;
|
|
30441
30391
|
var AMBIGUITY_THRESHOLD = 0.7;
|
|
30442
30392
|
function createWorkflowRouter(options) {
|
|
30443
|
-
const
|
|
30444
|
-
const analyzer = options?.analyzer ?? createSharedTaskAnalyzer({ logger:
|
|
30393
|
+
const logger55 = options?.logger ?? createLogger({ component: "WorkflowRouter" });
|
|
30394
|
+
const analyzer = options?.analyzer ?? createSharedTaskAnalyzer({ logger: logger55 });
|
|
30445
30395
|
const outcomes = [];
|
|
30446
30396
|
return {
|
|
30447
30397
|
route(signals, routerOpts) {
|
|
30448
|
-
return routeTask(signals, analyzer,
|
|
30398
|
+
return routeTask(signals, analyzer, logger55, routerOpts);
|
|
30449
30399
|
},
|
|
30450
30400
|
recordOutcome(outcome) {
|
|
30451
30401
|
recordPatternOutcome(outcomes, outcome);
|
|
@@ -30487,7 +30437,7 @@ function buildDecision(input) {
|
|
|
30487
30437
|
}
|
|
30488
30438
|
return base;
|
|
30489
30439
|
}
|
|
30490
|
-
function routeTask(signals, analyzer,
|
|
30440
|
+
function routeTask(signals, analyzer, logger55, _opts) {
|
|
30491
30441
|
const analysis = analyzer.analyze(signals.description);
|
|
30492
30442
|
const enriched = enrichSignals(signals, analysis);
|
|
30493
30443
|
const matchedRules = [];
|
|
@@ -30497,7 +30447,7 @@ function routeTask(signals, analyzer, logger54, _opts) {
|
|
|
30497
30447
|
if (result !== void 0) {
|
|
30498
30448
|
matchedRules.push(rule.name);
|
|
30499
30449
|
collectAlternatives(alternatives, result.pattern);
|
|
30500
|
-
|
|
30450
|
+
logger55.info("Workflow pattern selected", {
|
|
30501
30451
|
pattern: result.pattern,
|
|
30502
30452
|
rule: rule.name,
|
|
30503
30453
|
confidence: result.confidence,
|
|
@@ -30507,7 +30457,7 @@ function routeTask(signals, analyzer, logger54, _opts) {
|
|
|
30507
30457
|
return buildDecision({ result, matchedRules, alternatives, analysis });
|
|
30508
30458
|
}
|
|
30509
30459
|
}
|
|
30510
|
-
|
|
30460
|
+
logger55.info("Using fallback pattern", { pattern: "graph", taskType: analysis.taskType });
|
|
30511
30461
|
const fallback = {
|
|
30512
30462
|
pattern: "graph",
|
|
30513
30463
|
reasoning: "No specific rule matched \u2014 using Graph DAG as the most general pattern",
|
|
@@ -30794,11 +30744,11 @@ function createMockTechLead() {
|
|
|
30794
30744
|
var globalSicaConfig;
|
|
30795
30745
|
var sicaEnabled = false;
|
|
30796
30746
|
function initializeSica(options) {
|
|
30797
|
-
const { sicaConfig, logger:
|
|
30747
|
+
const { sicaConfig, logger: logger55 } = options;
|
|
30798
30748
|
if (sicaConfig?.enabled !== true) {
|
|
30799
30749
|
sicaEnabled = false;
|
|
30800
30750
|
globalSicaConfig = void 0;
|
|
30801
|
-
|
|
30751
|
+
logger55.info("SICA self-improvement disabled by configuration");
|
|
30802
30752
|
return {
|
|
30803
30753
|
enabled: false,
|
|
30804
30754
|
reason: sicaConfig?.enabled === false ? "disabled in config" : "not enabled (opt-in feature)"
|
|
@@ -30806,7 +30756,7 @@ function initializeSica(options) {
|
|
|
30806
30756
|
}
|
|
30807
30757
|
sicaEnabled = true;
|
|
30808
30758
|
globalSicaConfig = sicaConfig;
|
|
30809
|
-
|
|
30759
|
+
logger55.info("SICA self-improvement enabled", {
|
|
30810
30760
|
improvementThreshold: sicaConfig.improvementThreshold,
|
|
30811
30761
|
maxActiveVersions: sicaConfig.maxActiveVersions,
|
|
30812
30762
|
cooldownMs: sicaConfig.improvementCooldownMs
|
|
@@ -30824,18 +30774,18 @@ function getSicaConfig() {
|
|
|
30824
30774
|
}
|
|
30825
30775
|
|
|
30826
30776
|
// src/mcp/tools/orchestrate-sica.ts
|
|
30827
|
-
function createOrchestratorWithSica(
|
|
30828
|
-
const orchestrator = new Orchestrator({ logger:
|
|
30777
|
+
function createOrchestratorWithSica(logger55, adapter) {
|
|
30778
|
+
const orchestrator = new Orchestrator({ logger: logger55, ...adapter !== void 0 ? { adapter } : {} });
|
|
30829
30779
|
if (!isSicaEnabled()) {
|
|
30830
|
-
|
|
30780
|
+
logger55.debug("SICA not enabled, using plain orchestrator");
|
|
30831
30781
|
return orchestrator;
|
|
30832
30782
|
}
|
|
30833
30783
|
const sicaConfig = getSicaConfig();
|
|
30834
30784
|
if (sicaConfig === void 0) {
|
|
30835
|
-
|
|
30785
|
+
logger55.debug("SICA config unavailable, using plain orchestrator");
|
|
30836
30786
|
return orchestrator;
|
|
30837
30787
|
}
|
|
30838
|
-
|
|
30788
|
+
logger55.info("Creating SICA-wrapped orchestrator", {
|
|
30839
30789
|
improvementThreshold: sicaConfig.improvementThreshold,
|
|
30840
30790
|
maxActiveVersions: sicaConfig.maxActiveVersions
|
|
30841
30791
|
});
|
|
@@ -30855,9 +30805,9 @@ function createOrchestratorWithSica(logger54, adapter) {
|
|
|
30855
30805
|
improvementCooldownMs: sicaConfig.improvementCooldownMs,
|
|
30856
30806
|
enableObservability: sicaConfig.enableObservability
|
|
30857
30807
|
},
|
|
30858
|
-
logger:
|
|
30808
|
+
logger: logger55
|
|
30859
30809
|
});
|
|
30860
|
-
return createSicaOrchestratorAdapter(sicaAgent,
|
|
30810
|
+
return createSicaOrchestratorAdapter(sicaAgent, logger55);
|
|
30861
30811
|
}
|
|
30862
30812
|
function createSicaOrchestratorAdapter(sicaAgent, _logger) {
|
|
30863
30813
|
return {
|
|
@@ -30913,7 +30863,7 @@ var PersistedCatalogSchema = z62.object({
|
|
|
30913
30863
|
function getCatalogPath() {
|
|
30914
30864
|
return path4.join(os2.homedir(), CATALOG_DIR, CATALOG_FILE);
|
|
30915
30865
|
}
|
|
30916
|
-
function loadPersistedCatalog(
|
|
30866
|
+
function loadPersistedCatalog(logger55) {
|
|
30917
30867
|
const filePath = getCatalogPath();
|
|
30918
30868
|
try {
|
|
30919
30869
|
if (!fs4.existsSync(filePath)) return [];
|
|
@@ -30921,21 +30871,21 @@ function loadPersistedCatalog(logger54) {
|
|
|
30921
30871
|
const parsed = JSON.parse(content);
|
|
30922
30872
|
const result = PersistedCatalogSchema.safeParse(parsed);
|
|
30923
30873
|
if (!result.success) {
|
|
30924
|
-
|
|
30874
|
+
logger55.warn("Invalid pending catalog file, starting fresh", {
|
|
30925
30875
|
errors: result.error.issues.map((i) => i.message)
|
|
30926
30876
|
});
|
|
30927
30877
|
return [];
|
|
30928
30878
|
}
|
|
30929
30879
|
return result.data.references;
|
|
30930
30880
|
} catch (error) {
|
|
30931
|
-
|
|
30881
|
+
logger55.debug("Could not load pending catalog, starting fresh", {
|
|
30932
30882
|
error: getErrorMessage(error),
|
|
30933
30883
|
filePath
|
|
30934
30884
|
});
|
|
30935
30885
|
return [];
|
|
30936
30886
|
}
|
|
30937
30887
|
}
|
|
30938
|
-
function savePersistedCatalog(references,
|
|
30888
|
+
function savePersistedCatalog(references, logger55) {
|
|
30939
30889
|
const dirPath = path4.join(os2.homedir(), CATALOG_DIR);
|
|
30940
30890
|
const filePath = getCatalogPath();
|
|
30941
30891
|
const tempPath = `${filePath}.tmp.${String(process.pid)}`;
|
|
@@ -30957,7 +30907,7 @@ function savePersistedCatalog(references, logger54) {
|
|
|
30957
30907
|
} catch {
|
|
30958
30908
|
}
|
|
30959
30909
|
const message = getErrorMessage(error);
|
|
30960
|
-
|
|
30910
|
+
logger55.warn("Failed to persist pending catalog", { error: message });
|
|
30961
30911
|
}
|
|
30962
30912
|
}
|
|
30963
30913
|
var ARXIV_PATTERN = /\b(\d{4}\.\d{4,5})\b/g;
|
|
@@ -30967,8 +30917,8 @@ var ResearchAutoCatalog = class _ResearchAutoCatalog {
|
|
|
30967
30917
|
pendingReferences = [];
|
|
30968
30918
|
/** Maximum pending references to hold in memory. */
|
|
30969
30919
|
static MAX_PENDING = 100;
|
|
30970
|
-
constructor(
|
|
30971
|
-
this.logger =
|
|
30920
|
+
constructor(logger55) {
|
|
30921
|
+
this.logger = logger55 ?? createLogger({ component: "research-auto-catalog" });
|
|
30972
30922
|
const persisted = loadPersistedCatalog(this.logger);
|
|
30973
30923
|
if (persisted.length > 0) {
|
|
30974
30924
|
this.pendingReferences.push(...persisted.slice(0, _ResearchAutoCatalog.MAX_PENDING));
|
|
@@ -31123,8 +31073,8 @@ var ResearchAutoCatalog = class _ResearchAutoCatalog {
|
|
|
31123
31073
|
}
|
|
31124
31074
|
};
|
|
31125
31075
|
var autoCatalogInstance;
|
|
31126
|
-
function getAutoCatalog(
|
|
31127
|
-
autoCatalogInstance ??= new ResearchAutoCatalog(
|
|
31076
|
+
function getAutoCatalog(logger55) {
|
|
31077
|
+
autoCatalogInstance ??= new ResearchAutoCatalog(logger55);
|
|
31128
31078
|
return autoCatalogInstance;
|
|
31129
31079
|
}
|
|
31130
31080
|
|
|
@@ -31314,10 +31264,15 @@ function assignDependencyAwareWaves(entries) {
|
|
|
31314
31264
|
}
|
|
31315
31265
|
}
|
|
31316
31266
|
}
|
|
31317
|
-
return entries.map((entry) =>
|
|
31318
|
-
|
|
31319
|
-
|
|
31320
|
-
|
|
31267
|
+
return entries.map((entry) => {
|
|
31268
|
+
const deps = EXPERT_DEPENDENCIES[entry.role];
|
|
31269
|
+
const presentDeps = deps?.filter((d) => roleToWave.has(d)) ?? [];
|
|
31270
|
+
return {
|
|
31271
|
+
...entry,
|
|
31272
|
+
wave: roleToWave.get(entry.role) ?? entry.wave,
|
|
31273
|
+
...presentDeps.length > 0 ? { dependsOn: presentDeps } : {}
|
|
31274
|
+
};
|
|
31275
|
+
});
|
|
31321
31276
|
}
|
|
31322
31277
|
function mapHintToRole(hint) {
|
|
31323
31278
|
const lower = hint.toLowerCase();
|
|
@@ -32896,12 +32851,12 @@ function computeExpertReliability() {
|
|
|
32896
32851
|
}
|
|
32897
32852
|
return reliability;
|
|
32898
32853
|
}
|
|
32899
|
-
function computeAgentPlan(task,
|
|
32854
|
+
function computeAgentPlan(task, logger55) {
|
|
32900
32855
|
try {
|
|
32901
32856
|
const analyzer = new SharedTaskAnalyzer();
|
|
32902
32857
|
const analysis = analyzer.analyze(task);
|
|
32903
32858
|
if (analysis.complexity === "simple") {
|
|
32904
|
-
|
|
32859
|
+
logger55.debug("Skipping AOrchestra planning for simple task", {
|
|
32905
32860
|
taskType: analysis.taskType
|
|
32906
32861
|
});
|
|
32907
32862
|
return void 0;
|
|
@@ -32913,9 +32868,9 @@ function computeAgentPlan(task, logger54) {
|
|
|
32913
32868
|
if (rate < 0.5) excludedExperts.push({ role, rate: Math.round(rate * 100) / 100 });
|
|
32914
32869
|
}
|
|
32915
32870
|
if (excludedExperts.length > 0) {
|
|
32916
|
-
|
|
32871
|
+
logger55.warn("Experts excluded by reliability filter", { excludedExperts });
|
|
32917
32872
|
}
|
|
32918
|
-
|
|
32873
|
+
logger55.info("AOrchestra plan", {
|
|
32919
32874
|
experts: plan.totalExperts,
|
|
32920
32875
|
taskType: plan.taskType,
|
|
32921
32876
|
complexity: plan.complexity,
|
|
@@ -32923,7 +32878,7 @@ function computeAgentPlan(task, logger54) {
|
|
|
32923
32878
|
});
|
|
32924
32879
|
return plan;
|
|
32925
32880
|
} catch (planError) {
|
|
32926
|
-
|
|
32881
|
+
logger55.warn("AOrchestra planning failed", {
|
|
32927
32882
|
error: getErrorMessage(planError)
|
|
32928
32883
|
});
|
|
32929
32884
|
return void 0;
|
|
@@ -32993,7 +32948,7 @@ async function executeOnAdapter(opts) {
|
|
|
32993
32948
|
}
|
|
32994
32949
|
}
|
|
32995
32950
|
function createWorkerExecutor(config) {
|
|
32996
|
-
const { taskDescription, modelAdapter, logger:
|
|
32951
|
+
const { taskDescription, modelAdapter, logger: logger55, learnings, perWorkerRouting } = config;
|
|
32997
32952
|
const effectiveFallbackCli = modelAdapter.providerId;
|
|
32998
32953
|
return async (entry, priorWaveResults) => {
|
|
32999
32954
|
const workerStartMs = getTimeProvider().now();
|
|
@@ -33002,7 +32957,7 @@ function createWorkerExecutor(config) {
|
|
|
33002
32957
|
modelAdapter,
|
|
33003
32958
|
effectiveFallbackCli,
|
|
33004
32959
|
perWorkerRouting === true,
|
|
33005
|
-
|
|
32960
|
+
logger55
|
|
33006
32961
|
);
|
|
33007
32962
|
return executeOnAdapter({
|
|
33008
32963
|
entry,
|
|
@@ -33176,15 +33131,15 @@ function prepareBudgetedEntries(plan, maxCalls, log3) {
|
|
|
33176
33131
|
return entries;
|
|
33177
33132
|
}
|
|
33178
33133
|
async function executeWorkerDispatch(options) {
|
|
33179
|
-
const { agentPlan, taskDescription, modelAdapter, logger:
|
|
33134
|
+
const { agentPlan, taskDescription, modelAdapter, logger: logger55, maxConcurrency } = options;
|
|
33180
33135
|
const maxCalls = resolveMaxWorkerCalls(options.maxWorkerCalls);
|
|
33181
33136
|
const startMs = getTimeProvider().now();
|
|
33182
|
-
const entries = prepareBudgetedEntries(agentPlan, maxCalls,
|
|
33137
|
+
const entries = prepareBudgetedEntries(agentPlan, maxCalls, logger55);
|
|
33183
33138
|
const qualityGate = options.qualityGate === false ? void 0 : options.qualityGate;
|
|
33184
33139
|
const executorConfig = {
|
|
33185
33140
|
taskDescription,
|
|
33186
33141
|
modelAdapter,
|
|
33187
|
-
logger:
|
|
33142
|
+
logger: logger55,
|
|
33188
33143
|
...options.learnings !== void 0 ? { learnings: options.learnings } : {},
|
|
33189
33144
|
...options.perWorkerRouting !== void 0 ? { perWorkerRouting: options.perWorkerRouting } : {}
|
|
33190
33145
|
};
|
|
@@ -33205,8 +33160,8 @@ async function executeWorkerDispatch(options) {
|
|
|
33205
33160
|
};
|
|
33206
33161
|
await runSynthesisPhase(state, options, maxCalls);
|
|
33207
33162
|
const refined = await runRefinementPhase(state, entries, options, maxCalls);
|
|
33208
|
-
const base = buildDispatchResult(state.results, startMs,
|
|
33209
|
-
logDispatchInsights(state.results,
|
|
33163
|
+
const base = buildDispatchResult(state.results, startMs, logger55, state.totalModelCalls);
|
|
33164
|
+
logDispatchInsights(state.results, logger55);
|
|
33210
33165
|
return {
|
|
33211
33166
|
...base,
|
|
33212
33167
|
...refined ? { refined: true } : {},
|
|
@@ -33247,7 +33202,7 @@ function recordWorkerOutcomes(results, taskDescription) {
|
|
|
33247
33202
|
const success = r.status === "success";
|
|
33248
33203
|
const cli = r.resolvedCli ?? fallbackCli;
|
|
33249
33204
|
store.append({
|
|
33250
|
-
id: `worker-${r.role}-${String(
|
|
33205
|
+
id: `worker-${r.role}-${String(getTimeProvider().now())}-${getRandomProvider().random().toString(36).slice(2, 6)}`,
|
|
33251
33206
|
cli,
|
|
33252
33207
|
category,
|
|
33253
33208
|
model: `worker-${r.role}`,
|
|
@@ -33264,18 +33219,18 @@ function recordWorkerOutcomes(results, taskDescription) {
|
|
|
33264
33219
|
});
|
|
33265
33220
|
}
|
|
33266
33221
|
}
|
|
33267
|
-
function buildDispatchResult(results, startMs,
|
|
33222
|
+
function buildDispatchResult(results, startMs, logger55, totalModelCalls) {
|
|
33268
33223
|
const successCount = results.filter((r) => r.status === "success").length;
|
|
33269
33224
|
const errorCount = results.filter((r) => r.status === "error").length;
|
|
33270
33225
|
const conflicts = detectConflicts(results);
|
|
33271
33226
|
if (conflicts.length > 0) {
|
|
33272
|
-
|
|
33227
|
+
logger55.warn("Worker output conflicts detected \u2014 human review recommended", {
|
|
33273
33228
|
conflictCount: conflicts.length,
|
|
33274
33229
|
files: conflicts.map((c) => c.filePath)
|
|
33275
33230
|
});
|
|
33276
33231
|
}
|
|
33277
33232
|
const durationMs = getTimeProvider().now() - startMs;
|
|
33278
|
-
|
|
33233
|
+
logger55.info("Worker dispatch complete", {
|
|
33279
33234
|
totalWorkers: results.length,
|
|
33280
33235
|
successCount,
|
|
33281
33236
|
errorCount,
|
|
@@ -33334,7 +33289,7 @@ var ReflectionCache = class {
|
|
|
33334
33289
|
const key = this.normalize(query);
|
|
33335
33290
|
const entry = this.entries.get(key);
|
|
33336
33291
|
if (entry === void 0) return void 0;
|
|
33337
|
-
if (
|
|
33292
|
+
if (getTimeProvider().now() - entry.timestamp > this.ttlMs) {
|
|
33338
33293
|
this.entries.delete(key);
|
|
33339
33294
|
return void 0;
|
|
33340
33295
|
}
|
|
@@ -33349,7 +33304,7 @@ var ReflectionCache = class {
|
|
|
33349
33304
|
const oldest = this.entries.keys().next();
|
|
33350
33305
|
if (oldest.done !== true) this.entries.delete(oldest.value);
|
|
33351
33306
|
}
|
|
33352
|
-
this.entries.set(key, { criteria, timestamp:
|
|
33307
|
+
this.entries.set(key, { criteria, timestamp: getTimeProvider().now() });
|
|
33353
33308
|
}
|
|
33354
33309
|
get size() {
|
|
33355
33310
|
return this.entries.size;
|
|
@@ -33665,11 +33620,12 @@ var TaskAccessPolicySchema = z64.object({
|
|
|
33665
33620
|
});
|
|
33666
33621
|
|
|
33667
33622
|
// src/security/access-constraint-deriver/config.ts
|
|
33623
|
+
var DEFAULT_ACCESS_POLICY_MODE = "audit";
|
|
33668
33624
|
function resolveAccessPolicyMode(env = process.env) {
|
|
33669
33625
|
const raw = env["NEXUS_ACCESS_POLICY_MODE"];
|
|
33670
|
-
if (typeof raw !== "string" || raw.length === 0) return
|
|
33626
|
+
if (typeof raw !== "string" || raw.length === 0) return DEFAULT_ACCESS_POLICY_MODE;
|
|
33671
33627
|
const parsed = AccessPolicyModeSchema.safeParse(raw.toLowerCase());
|
|
33672
|
-
return parsed.success ? parsed.data :
|
|
33628
|
+
return parsed.success ? parsed.data : DEFAULT_ACCESS_POLICY_MODE;
|
|
33673
33629
|
}
|
|
33674
33630
|
|
|
33675
33631
|
// src/security/access-constraint-deriver/deriver.ts
|
|
@@ -34343,11 +34299,11 @@ function buildOutputFromOrchestratorResult(taskId, orchResult, durationMs, routi
|
|
|
34343
34299
|
}
|
|
34344
34300
|
};
|
|
34345
34301
|
}
|
|
34346
|
-
function createOrchestratorFromDeps(deps,
|
|
34302
|
+
function createOrchestratorFromDeps(deps, logger55, orchestratorType) {
|
|
34347
34303
|
if (deps.orchestrator !== void 0) return deps.orchestrator;
|
|
34348
|
-
const techLead = deps.techLead ?? createOrchestratorWithSica(
|
|
34304
|
+
const techLead = deps.techLead ?? createOrchestratorWithSica(logger55, deps.modelAdapter);
|
|
34349
34305
|
const factory = new OrchestratorFactory({
|
|
34350
|
-
logger:
|
|
34306
|
+
logger: logger55,
|
|
34351
34307
|
techLead
|
|
34352
34308
|
});
|
|
34353
34309
|
return factory.create(orchestratorType ?? "tech_lead");
|
|
@@ -34381,7 +34337,7 @@ function recordToOutcomeStore(taskDescription, success, durationMs, opts) {
|
|
|
34381
34337
|
const cli = opts?.actualCli ?? match?.primaryCli ?? DEFAULT_CLI;
|
|
34382
34338
|
const category = match?.category ?? "exploration";
|
|
34383
34339
|
getOutcomeStore().append({
|
|
34384
|
-
id: `orch-${String(
|
|
34340
|
+
id: `orch-${String(getTimeProvider().now())}-${getRandomProvider().random().toString(36).slice(2, 8)}`,
|
|
34385
34341
|
cli,
|
|
34386
34342
|
category,
|
|
34387
34343
|
model: "orchestrator",
|
|
@@ -34461,16 +34417,16 @@ function recordOrchestrationError(errorMessage, taskDescription, durationMs) {
|
|
|
34461
34417
|
}
|
|
34462
34418
|
}
|
|
34463
34419
|
function routeAndPrepare(input, deps, router) {
|
|
34464
|
-
const
|
|
34465
|
-
const workflowRouter = router ?? createWorkflowRouter({ logger:
|
|
34420
|
+
const logger55 = deps.logger ?? createLogger({ tool: "orchestrate" });
|
|
34421
|
+
const workflowRouter = router ?? createWorkflowRouter({ logger: logger55 });
|
|
34466
34422
|
const decision = workflowRouter.route({ description: input.task });
|
|
34467
34423
|
const orchType = mapPatternToOrchestratorType(decision.pattern);
|
|
34468
|
-
|
|
34424
|
+
logger55.info("Workflow pattern selected", {
|
|
34469
34425
|
pattern: decision.pattern,
|
|
34470
34426
|
orchestratorType: orchType
|
|
34471
34427
|
});
|
|
34472
|
-
const orchestrator = createOrchestratorFromDeps(deps,
|
|
34473
|
-
return { workflowRouter, decision, orchestrator, logger:
|
|
34428
|
+
const orchestrator = createOrchestratorFromDeps(deps, logger55, orchType);
|
|
34429
|
+
return { workflowRouter, decision, orchestrator, logger: logger55 };
|
|
34474
34430
|
}
|
|
34475
34431
|
function buildRoutingInfo(decision) {
|
|
34476
34432
|
return {
|
|
@@ -34489,10 +34445,10 @@ function recordRouterOutcome(workflowRouter, decision, success, durationMs) {
|
|
|
34489
34445
|
timestamp: getTimeProvider().now()
|
|
34490
34446
|
});
|
|
34491
34447
|
}
|
|
34492
|
-
function handleOrchestrationException(error, taskId, task,
|
|
34448
|
+
function handleOrchestrationException(error, taskId, task, logger55) {
|
|
34493
34449
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
34494
34450
|
const cause = error instanceof Error ? error : void 0;
|
|
34495
|
-
|
|
34451
|
+
logger55.error("Orchestration exception", cause, { taskId });
|
|
34496
34452
|
recordOrchestrationError(message, task);
|
|
34497
34453
|
return err(
|
|
34498
34454
|
new OrchestrationError(
|
|
@@ -34501,13 +34457,13 @@ function handleOrchestrationException(error, taskId, task, logger54) {
|
|
|
34501
34457
|
)
|
|
34502
34458
|
);
|
|
34503
34459
|
}
|
|
34504
|
-
function startHeartbeatTracking(label,
|
|
34460
|
+
function startHeartbeatTracking(label, logger55) {
|
|
34505
34461
|
const monitor = getHeartbeatMonitor();
|
|
34506
34462
|
const sessionId = monitor.startSession(label);
|
|
34507
34463
|
const timer = setInterval(() => {
|
|
34508
34464
|
monitor.heartbeat(sessionId);
|
|
34509
34465
|
if (monitor.isStalled(sessionId)) {
|
|
34510
|
-
|
|
34466
|
+
logger55.warn("Orchestration session stalled", { label, sessionId });
|
|
34511
34467
|
}
|
|
34512
34468
|
}, HEARTBEAT_TIMEOUTS.heartbeatIntervalMs);
|
|
34513
34469
|
return {
|
|
@@ -34579,7 +34535,7 @@ function handleOrchestratorSuccess(ctx) {
|
|
|
34579
34535
|
return ok(output2);
|
|
34580
34536
|
}
|
|
34581
34537
|
async function executeOrchestration(input, deps, router) {
|
|
34582
|
-
const { workflowRouter, decision, orchestrator, logger:
|
|
34538
|
+
const { workflowRouter, decision, orchestrator, logger: logger55 } = routeAndPrepare(input, deps, router);
|
|
34583
34539
|
const taskId = generateTaskId();
|
|
34584
34540
|
const startTime = getTimeProvider().now();
|
|
34585
34541
|
const fastResult = trySimpleTaskFastPath({
|
|
@@ -34588,15 +34544,15 @@ async function executeOrchestration(input, deps, router) {
|
|
|
34588
34544
|
decision,
|
|
34589
34545
|
workflowRouter,
|
|
34590
34546
|
startTime,
|
|
34591
|
-
logger:
|
|
34547
|
+
logger: logger55
|
|
34592
34548
|
});
|
|
34593
34549
|
if (fastResult !== void 0) return fastResult;
|
|
34594
|
-
|
|
34595
|
-
recordTaskStateInit(taskId, input.task,
|
|
34550
|
+
logger55.info("Starting orchestration", { taskId, taskLength: input.task.length });
|
|
34551
|
+
recordTaskStateInit(taskId, input.task, logger55);
|
|
34596
34552
|
const task = await createTaskFromInput(input, taskId);
|
|
34597
34553
|
const definition = { type: "task", task };
|
|
34598
|
-
const hb = startHeartbeatTracking(`orchestrate-${taskId}`,
|
|
34599
|
-
const policy = await deriveOrchestratePolicy(input.task, deps,
|
|
34554
|
+
const hb = startHeartbeatTracking(`orchestrate-${taskId}`, logger55);
|
|
34555
|
+
const policy = await deriveOrchestratePolicy(input.task, deps, logger55);
|
|
34600
34556
|
try {
|
|
34601
34557
|
return await runOrchestratorWithStateTracking({
|
|
34602
34558
|
taskId,
|
|
@@ -34607,23 +34563,23 @@ async function executeOrchestration(input, deps, router) {
|
|
|
34607
34563
|
decision,
|
|
34608
34564
|
workflowRouter,
|
|
34609
34565
|
startTime,
|
|
34610
|
-
logger:
|
|
34566
|
+
logger: logger55
|
|
34611
34567
|
});
|
|
34612
34568
|
} catch (error) {
|
|
34613
|
-
recordTaskStateBlocker(taskId, error instanceof Error ? error.message : String(error),
|
|
34614
|
-
recordTaskStateStage(taskId, "blocked",
|
|
34615
|
-
return handleOrchestrationException(error, taskId, input.task,
|
|
34569
|
+
recordTaskStateBlocker(taskId, error instanceof Error ? error.message : String(error), logger55);
|
|
34570
|
+
recordTaskStateStage(taskId, "blocked", logger55);
|
|
34571
|
+
return handleOrchestrationException(error, taskId, input.task, logger55);
|
|
34616
34572
|
} finally {
|
|
34617
34573
|
hb.cleanup();
|
|
34618
34574
|
}
|
|
34619
34575
|
}
|
|
34620
34576
|
async function runOrchestratorWithStateTracking(params) {
|
|
34621
|
-
const { taskId, taskInput, definition, orchestrator, policy, logger:
|
|
34622
|
-
recordTaskStateStage(taskId, "executing",
|
|
34577
|
+
const { taskId, taskInput, definition, orchestrator, policy, logger: logger55 } = params;
|
|
34578
|
+
recordTaskStateStage(taskId, "executing", logger55);
|
|
34623
34579
|
const result = await withAccessPolicy(policy, () => orchestrator.execute(definition, {}));
|
|
34624
34580
|
if (!result.ok) {
|
|
34625
|
-
recordTaskStateBlocker(taskId, result.error.message,
|
|
34626
|
-
recordTaskStateStage(taskId, "blocked",
|
|
34581
|
+
recordTaskStateBlocker(taskId, result.error.message, logger55);
|
|
34582
|
+
recordTaskStateStage(taskId, "blocked", logger55);
|
|
34627
34583
|
return handleOrchestratorFailure({
|
|
34628
34584
|
error: result.error,
|
|
34629
34585
|
taskId,
|
|
@@ -34631,10 +34587,10 @@ async function runOrchestratorWithStateTracking(params) {
|
|
|
34631
34587
|
decision: params.decision,
|
|
34632
34588
|
workflowRouter: params.workflowRouter,
|
|
34633
34589
|
startTime: params.startTime,
|
|
34634
|
-
logger:
|
|
34590
|
+
logger: logger55
|
|
34635
34591
|
});
|
|
34636
34592
|
}
|
|
34637
|
-
recordTaskStateStage(taskId, "complete",
|
|
34593
|
+
recordTaskStateStage(taskId, "complete", logger55);
|
|
34638
34594
|
return handleOrchestratorSuccess({
|
|
34639
34595
|
orchResult: result.value,
|
|
34640
34596
|
taskId,
|
|
@@ -34642,15 +34598,18 @@ async function runOrchestratorWithStateTracking(params) {
|
|
|
34642
34598
|
decision: params.decision,
|
|
34643
34599
|
workflowRouter: params.workflowRouter,
|
|
34644
34600
|
startTime: params.startTime,
|
|
34645
|
-
logger:
|
|
34601
|
+
logger: logger55
|
|
34646
34602
|
});
|
|
34647
34603
|
}
|
|
34648
34604
|
function isTaskStateEnabled() {
|
|
34649
|
-
|
|
34605
|
+
const raw = process.env["NEXUS_TASK_STATE_ENABLED"];
|
|
34606
|
+
if (raw === void 0 || raw === "") return true;
|
|
34607
|
+
const normalized = raw.toLowerCase();
|
|
34608
|
+
return normalized !== "0" && normalized !== "false";
|
|
34650
34609
|
}
|
|
34651
|
-
function recordTaskStateInit(taskId, taskText,
|
|
34610
|
+
function recordTaskStateInit(taskId, taskText, logger55) {
|
|
34652
34611
|
if (!isTaskStateEnabled()) return;
|
|
34653
|
-
const now = (
|
|
34612
|
+
const now = getTimeProvider().nowIso();
|
|
34654
34613
|
const initial = {
|
|
34655
34614
|
taskId,
|
|
34656
34615
|
stage: "planning",
|
|
@@ -34661,36 +34620,36 @@ function recordTaskStateInit(taskId, taskText, logger54) {
|
|
|
34661
34620
|
};
|
|
34662
34621
|
const result = initTaskState(initial);
|
|
34663
34622
|
if (!result.ok) {
|
|
34664
|
-
|
|
34623
|
+
logger55.warn("task-state: init failed, continuing", {
|
|
34665
34624
|
taskId,
|
|
34666
34625
|
error: result.error.message,
|
|
34667
34626
|
taskLength: taskText.length
|
|
34668
34627
|
});
|
|
34669
34628
|
}
|
|
34670
34629
|
}
|
|
34671
|
-
function recordTaskStateStage(taskId, stage,
|
|
34630
|
+
function recordTaskStateStage(taskId, stage, logger55) {
|
|
34672
34631
|
if (!isTaskStateEnabled()) return;
|
|
34673
|
-
const result = updateStage(taskId, stage, (
|
|
34632
|
+
const result = updateStage(taskId, stage, getTimeProvider().nowIso());
|
|
34674
34633
|
if (!result.ok) {
|
|
34675
|
-
|
|
34634
|
+
logger55.warn("task-state: stage update failed", {
|
|
34676
34635
|
taskId,
|
|
34677
34636
|
stage,
|
|
34678
34637
|
error: result.error.message
|
|
34679
34638
|
});
|
|
34680
34639
|
}
|
|
34681
34640
|
}
|
|
34682
|
-
function recordTaskStateBlocker(taskId, blocker,
|
|
34641
|
+
function recordTaskStateBlocker(taskId, blocker, logger55) {
|
|
34683
34642
|
if (!isTaskStateEnabled()) return;
|
|
34684
|
-
const ts = (
|
|
34643
|
+
const ts = getTimeProvider().nowIso();
|
|
34685
34644
|
const result = appendBlocker(taskId, { ts, blocker });
|
|
34686
34645
|
if (!result.ok) {
|
|
34687
|
-
|
|
34646
|
+
logger55.warn("task-state: blocker record failed", {
|
|
34688
34647
|
taskId,
|
|
34689
34648
|
error: result.error.message
|
|
34690
34649
|
});
|
|
34691
34650
|
}
|
|
34692
34651
|
}
|
|
34693
|
-
async function deriveOrchestratePolicy(taskText, deps,
|
|
34652
|
+
async function deriveOrchestratePolicy(taskText, deps, logger55) {
|
|
34694
34653
|
const mode = resolveAccessPolicyMode();
|
|
34695
34654
|
try {
|
|
34696
34655
|
const opts = {
|
|
@@ -34700,7 +34659,7 @@ async function deriveOrchestratePolicy(taskText, deps, logger54) {
|
|
|
34700
34659
|
};
|
|
34701
34660
|
const policy = await deriveAccessPolicy(taskText, opts);
|
|
34702
34661
|
if (mode !== "off") {
|
|
34703
|
-
|
|
34662
|
+
logger55.info("access-policy: derived", {
|
|
34704
34663
|
mode,
|
|
34705
34664
|
source: policy.source,
|
|
34706
34665
|
allowedToolsWildcard: policy.allowedTools === "*"
|
|
@@ -34708,7 +34667,7 @@ async function deriveOrchestratePolicy(taskText, deps, logger54) {
|
|
|
34708
34667
|
}
|
|
34709
34668
|
return policy;
|
|
34710
34669
|
} catch (error) {
|
|
34711
|
-
|
|
34670
|
+
logger55.warn("access-policy: derivation failed, falling back to off", {
|
|
34712
34671
|
error: getErrorMessage(error)
|
|
34713
34672
|
});
|
|
34714
34673
|
return {
|
|
@@ -34716,21 +34675,21 @@ async function deriveOrchestratePolicy(taskText, deps, logger54) {
|
|
|
34716
34675
|
allowedPathPatterns: [],
|
|
34717
34676
|
allowedOperations: "*",
|
|
34718
34677
|
objectiveHash: "derivation-failed",
|
|
34719
|
-
derivedAt: (
|
|
34678
|
+
derivedAt: getTimeProvider().nowIso(),
|
|
34720
34679
|
source: "bypass",
|
|
34721
34680
|
mode: "off"
|
|
34722
34681
|
};
|
|
34723
34682
|
}
|
|
34724
34683
|
}
|
|
34725
|
-
function instrumentV2Orchestrate(input,
|
|
34684
|
+
function instrumentV2Orchestrate(input, logger55) {
|
|
34726
34685
|
const tc = orchestrateInputToTaskContract(input);
|
|
34727
34686
|
void executeOrchestratePipeline(tc).then((m) => {
|
|
34728
|
-
|
|
34687
|
+
logger55.info("V2 orchestrate pipeline", { ...m });
|
|
34729
34688
|
}).catch((error) => {
|
|
34730
|
-
|
|
34689
|
+
logger55.debug("V2 orchestrate pipeline failed", { error: getErrorMessage(error) });
|
|
34731
34690
|
});
|
|
34732
34691
|
}
|
|
34733
|
-
async function tryWorkerDispatch(agentPlan, task, deps,
|
|
34692
|
+
async function tryWorkerDispatch(agentPlan, task, deps, logger55, notifier) {
|
|
34734
34693
|
const adapter = deps.modelAdapter;
|
|
34735
34694
|
if (agentPlan === void 0 || !isWorkerDispatchEnabled() || adapter === void 0) {
|
|
34736
34695
|
return void 0;
|
|
@@ -34743,14 +34702,14 @@ async function tryWorkerDispatch(agentPlan, task, deps, logger54, notifier) {
|
|
|
34743
34702
|
agentPlan,
|
|
34744
34703
|
taskDescription: task,
|
|
34745
34704
|
modelAdapter: adapter,
|
|
34746
|
-
logger:
|
|
34705
|
+
logger: logger55,
|
|
34747
34706
|
synthesize: true,
|
|
34748
34707
|
refine: true,
|
|
34749
34708
|
perWorkerRouting: true
|
|
34750
34709
|
})
|
|
34751
34710
|
);
|
|
34752
34711
|
} catch (dispatchError) {
|
|
34753
|
-
|
|
34712
|
+
logger55.warn("Worker dispatch failed, continuing with standard orchestration", {
|
|
34754
34713
|
error: dispatchError instanceof Error ? dispatchError.message : String(dispatchError)
|
|
34755
34714
|
});
|
|
34756
34715
|
return void 0;
|
|
@@ -34823,7 +34782,7 @@ function createOrchestrateHandler(deps) {
|
|
|
34823
34782
|
};
|
|
34824
34783
|
}
|
|
34825
34784
|
function registerOrchestrateTool(server, deps) {
|
|
34826
|
-
const
|
|
34785
|
+
const logger55 = deps.logger ?? createLogger({ tool: "orchestrate" });
|
|
34827
34786
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
34828
34787
|
const depsWithNotifier = { ...deps, notifier };
|
|
34829
34788
|
const description = "Orchestrate a task by analyzing it, breaking it into subtasks if needed, and coordinating expert agents";
|
|
@@ -34831,18 +34790,18 @@ function registerOrchestrateTool(server, deps) {
|
|
|
34831
34790
|
toolName: "orchestrate",
|
|
34832
34791
|
securityTier: "user-facing",
|
|
34833
34792
|
rateLimiter: deps.rateLimiter,
|
|
34834
|
-
logger:
|
|
34793
|
+
logger: logger55
|
|
34835
34794
|
});
|
|
34836
34795
|
const wrappedHandler = wrapToolWithTimeout("orchestrate", secureHandler, {
|
|
34837
34796
|
timeoutMs: MCP_TIMEOUTS.perTool["orchestrate"] ?? MCP_TIMEOUTS.defaultMs,
|
|
34838
|
-
logger:
|
|
34797
|
+
logger: logger55
|
|
34839
34798
|
});
|
|
34840
34799
|
server.registerTool(
|
|
34841
34800
|
"orchestrate",
|
|
34842
34801
|
{ description, inputSchema: ORCHESTRATE_TOOL_SCHEMA },
|
|
34843
34802
|
toSdkCallback(wrappedHandler)
|
|
34844
34803
|
);
|
|
34845
|
-
|
|
34804
|
+
logger55.info("Registered orchestrate tool with secure handler and timeout protection");
|
|
34846
34805
|
}
|
|
34847
34806
|
|
|
34848
34807
|
// src/mcp/tools/delegate-to-model-types.ts
|
|
@@ -35185,21 +35144,21 @@ function mapCompositeDecisionToOutput(decision, estimatedTokens) {
|
|
|
35185
35144
|
}))
|
|
35186
35145
|
};
|
|
35187
35146
|
}
|
|
35188
|
-
async function routeViaCompositeRouter(task, router, feedbackIntegration,
|
|
35147
|
+
async function routeViaCompositeRouter(task, router, feedbackIntegration, logger55) {
|
|
35189
35148
|
const result = await router.route({ content: task });
|
|
35190
35149
|
if (!result.ok) {
|
|
35191
|
-
|
|
35150
|
+
logger55.warn("CompositeRouter routing failed", { error: result.error.message });
|
|
35192
35151
|
return null;
|
|
35193
35152
|
}
|
|
35194
35153
|
const decision = result.value;
|
|
35195
35154
|
let routingId;
|
|
35196
35155
|
if (feedbackIntegration) {
|
|
35197
35156
|
routingId = feedbackIntegration.recordRoutingDecision(decision);
|
|
35198
|
-
|
|
35157
|
+
logger55.debug("Recorded routing decision", { routingId, cliName: decision.cliName });
|
|
35199
35158
|
}
|
|
35200
35159
|
return { decision, routingId, feedbackIntegration };
|
|
35201
35160
|
}
|
|
35202
|
-
function recordRoutingOutcome(result, durationMs,
|
|
35161
|
+
function recordRoutingOutcome(result, durationMs, logger55) {
|
|
35203
35162
|
if (result.routingId === void 0 || result.feedbackIntegration === void 0) return;
|
|
35204
35163
|
try {
|
|
35205
35164
|
const topsisScore = result.decision.topsisScore ?? 0;
|
|
@@ -35212,13 +35171,13 @@ function recordRoutingOutcome(result, durationMs, logger54) {
|
|
|
35212
35171
|
tokenUsage: 0
|
|
35213
35172
|
// delegate-to-model is a recommendation, not execution
|
|
35214
35173
|
});
|
|
35215
|
-
|
|
35174
|
+
logger55.debug("Recorded routing outcome", {
|
|
35216
35175
|
routingId: result.routingId,
|
|
35217
35176
|
topsisScore,
|
|
35218
35177
|
success: topsisScore >= TOPSIS_CONFIDENCE_THRESHOLD
|
|
35219
35178
|
});
|
|
35220
35179
|
} catch (error) {
|
|
35221
|
-
|
|
35180
|
+
logger55.warn("Failed to record routing outcome", { error: getErrorMessage(error) });
|
|
35222
35181
|
}
|
|
35223
35182
|
}
|
|
35224
35183
|
|
|
@@ -35239,9 +35198,9 @@ function classifyWithGovernance(toolName, params, overrides) {
|
|
|
35239
35198
|
const promotionReason = promoted ? buildPromotionReason(domain, params) : null;
|
|
35240
35199
|
return { tier, promoted, domain, votingThreshold, promotionReason };
|
|
35241
35200
|
}
|
|
35242
|
-
function auditGovernancePromotion(classification, toolName,
|
|
35201
|
+
function auditGovernancePromotion(classification, toolName, logger55) {
|
|
35243
35202
|
if (!classification.promoted) return;
|
|
35244
|
-
const log3 =
|
|
35203
|
+
const log3 = logger55 ?? createLogger({ component: "governance" });
|
|
35245
35204
|
log3.warn("Governance promotion", {
|
|
35246
35205
|
tool: toolName,
|
|
35247
35206
|
domain: classification.domain,
|
|
@@ -35323,7 +35282,7 @@ function recordToOutcomeStore2(task, model, startMs, governance) {
|
|
|
35323
35282
|
qualitySignals.push(`governance:${governance.domain}`);
|
|
35324
35283
|
}
|
|
35325
35284
|
getOutcomeStore().append({
|
|
35326
|
-
id: `del-${String(
|
|
35285
|
+
id: `del-${String(getTimeProvider().now())}-${getRandomProvider().random().toString(36).slice(2, 8)}`,
|
|
35327
35286
|
cli,
|
|
35328
35287
|
category: match?.category ?? "exploration",
|
|
35329
35288
|
model,
|
|
@@ -35340,9 +35299,9 @@ function recordToOutcomeStore2(task, model, startMs, governance) {
|
|
|
35340
35299
|
});
|
|
35341
35300
|
}
|
|
35342
35301
|
}
|
|
35343
|
-
function classifyDelegateGovernance(input,
|
|
35302
|
+
function classifyDelegateGovernance(input, logger55) {
|
|
35344
35303
|
const classification = classifyWithGovernance("delegate_to_model", { task: input.task });
|
|
35345
|
-
auditGovernancePromotion(classification, "delegate_to_model",
|
|
35304
|
+
auditGovernancePromotion(classification, "delegate_to_model", logger55);
|
|
35346
35305
|
return classification;
|
|
35347
35306
|
}
|
|
35348
35307
|
function enrichWithGovernance(output2, governance) {
|
|
@@ -35356,10 +35315,10 @@ function enrichWithGovernance(output2, governance) {
|
|
|
35356
35315
|
}
|
|
35357
35316
|
};
|
|
35358
35317
|
}
|
|
35359
|
-
function instrumentV2Pipeline(input,
|
|
35318
|
+
function instrumentV2Pipeline(input, logger55) {
|
|
35360
35319
|
const tc = delegateInputToTaskContract(input);
|
|
35361
35320
|
void executeDelegatePipeline(tc).then((m) => {
|
|
35362
|
-
|
|
35321
|
+
logger55.info("V2 delegate pipeline", { ...m });
|
|
35363
35322
|
});
|
|
35364
35323
|
}
|
|
35365
35324
|
function notifyAndRecord(opts) {
|
|
@@ -35433,18 +35392,18 @@ function createDelegateHandler(deps) {
|
|
|
35433
35392
|
};
|
|
35434
35393
|
}
|
|
35435
35394
|
function registerDelegateToModelTool(server, deps) {
|
|
35436
|
-
const
|
|
35395
|
+
const logger55 = deps.logger ?? createLogger({ tool: "delegate_to_model" });
|
|
35437
35396
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
35438
35397
|
const depsWithNotifier = { ...deps, notifier };
|
|
35439
35398
|
const secureHandler = createSecureHandler(createDelegateHandler(depsWithNotifier), {
|
|
35440
35399
|
toolName: "delegate_to_model",
|
|
35441
35400
|
rateLimiter: deps.rateLimiter,
|
|
35442
|
-
logger:
|
|
35401
|
+
logger: logger55
|
|
35443
35402
|
});
|
|
35444
35403
|
const timeoutMs = getToolTimeout("delegate_to_model", deps.security);
|
|
35445
35404
|
const wrappedHandler = wrapToolWithTimeout("delegate_to_model", secureHandler, {
|
|
35446
35405
|
timeoutMs,
|
|
35447
|
-
logger:
|
|
35406
|
+
logger: logger55
|
|
35448
35407
|
});
|
|
35449
35408
|
server.registerTool(
|
|
35450
35409
|
"delegate_to_model",
|
|
@@ -35455,7 +35414,7 @@ function registerDelegateToModelTool(server, deps) {
|
|
|
35455
35414
|
},
|
|
35456
35415
|
toSdkCallback(wrappedHandler)
|
|
35457
35416
|
);
|
|
35458
|
-
|
|
35417
|
+
logger55.info("Registered delegate_to_model tool with secure handler and timeout protection");
|
|
35459
35418
|
}
|
|
35460
35419
|
|
|
35461
35420
|
// src/mcp/tools/run-graph-workflow-multicli-templates.ts
|
|
@@ -36394,7 +36353,7 @@ function listExpertsHandler(args, ctx) {
|
|
|
36394
36353
|
return Promise.resolve(toolSuccessStructured(data));
|
|
36395
36354
|
}
|
|
36396
36355
|
function registerListExpertsTool(server, deps) {
|
|
36397
|
-
const
|
|
36356
|
+
const logger55 = deps.logger ?? createLogger({ tool: "list_experts" });
|
|
36398
36357
|
const toolSchema = {
|
|
36399
36358
|
format: z68.enum(["full", "names"]).optional().describe("Output format: full (with details) or names (just role names)")
|
|
36400
36359
|
};
|
|
@@ -36402,10 +36361,10 @@ function registerListExpertsTool(server, deps) {
|
|
|
36402
36361
|
const secureHandler = createSecureHandler(listExpertsHandler, {
|
|
36403
36362
|
toolName: "list_experts",
|
|
36404
36363
|
rateLimiter: deps.rateLimiter,
|
|
36405
|
-
logger:
|
|
36364
|
+
logger: logger55
|
|
36406
36365
|
});
|
|
36407
36366
|
const timeoutMs = getToolTimeout("list_experts", deps.security);
|
|
36408
|
-
const wrappedHandler = wrapToolWithTimeout("list_experts", secureHandler, { timeoutMs, logger:
|
|
36367
|
+
const wrappedHandler = wrapToolWithTimeout("list_experts", secureHandler, { timeoutMs, logger: logger55 });
|
|
36409
36368
|
const outputSchema = {
|
|
36410
36369
|
experts: z68.array(
|
|
36411
36370
|
z68.object({
|
|
@@ -36422,7 +36381,7 @@ function registerListExpertsTool(server, deps) {
|
|
|
36422
36381
|
{ description, inputSchema: toolSchema, outputSchema },
|
|
36423
36382
|
toSdkCallback(wrappedHandler)
|
|
36424
36383
|
);
|
|
36425
|
-
|
|
36384
|
+
logger55.info("Registered list_experts tool with secure handler and timeout protection");
|
|
36426
36385
|
}
|
|
36427
36386
|
|
|
36428
36387
|
// src/mcp/tools/list-workflows.ts
|
|
@@ -36478,7 +36437,7 @@ function createListWorkflowsHandler(workflowEngine) {
|
|
|
36478
36437
|
};
|
|
36479
36438
|
}
|
|
36480
36439
|
function registerListWorkflowsTool(server, deps) {
|
|
36481
|
-
const
|
|
36440
|
+
const logger55 = deps.logger ?? createLogger({ tool: "list_workflows" });
|
|
36482
36441
|
const toolSchema = {
|
|
36483
36442
|
category: z69.string().optional().describe("Filter by category (e.g., development, security)"),
|
|
36484
36443
|
format: z69.enum(["full", "names"]).optional().describe("Output format: full (with details) or names (just template names)")
|
|
@@ -36487,13 +36446,13 @@ function registerListWorkflowsTool(server, deps) {
|
|
|
36487
36446
|
const secureHandler = createSecureHandler(createListWorkflowsHandler(deps.workflowEngine), {
|
|
36488
36447
|
toolName: "list_workflows",
|
|
36489
36448
|
rateLimiter: deps.rateLimiter,
|
|
36490
|
-
logger:
|
|
36449
|
+
logger: logger55
|
|
36491
36450
|
});
|
|
36492
36451
|
const timeoutMs = deps.security?.timeout?.defaultTimeoutMs;
|
|
36493
36452
|
const wrappedHandler = wrapToolWithTimeout(
|
|
36494
36453
|
"list_workflows",
|
|
36495
36454
|
secureHandler,
|
|
36496
|
-
timeoutMs !== void 0 ? { timeoutMs, logger:
|
|
36455
|
+
timeoutMs !== void 0 ? { timeoutMs, logger: logger55 } : { logger: logger55 }
|
|
36497
36456
|
);
|
|
36498
36457
|
const outputSchema = {
|
|
36499
36458
|
workflows: z69.array(
|
|
@@ -36512,7 +36471,7 @@ function registerListWorkflowsTool(server, deps) {
|
|
|
36512
36471
|
{ description, inputSchema: toolSchema, outputSchema },
|
|
36513
36472
|
toSdkCallback(wrappedHandler)
|
|
36514
36473
|
);
|
|
36515
|
-
|
|
36474
|
+
logger55.info("Registered list_workflows tool with secure handler and timeout protection");
|
|
36516
36475
|
}
|
|
36517
36476
|
|
|
36518
36477
|
// src/mcp/tools/execute-expert.ts
|
|
@@ -36540,7 +36499,7 @@ function recordExpertOutcome2(opts) {
|
|
|
36540
36499
|
try {
|
|
36541
36500
|
const match = detectTaskCategory(opts.task);
|
|
36542
36501
|
getOutcomeStore().append({
|
|
36543
|
-
id: `exp-${String(
|
|
36502
|
+
id: `exp-${String(getTimeProvider().now())}-${getRandomProvider().random().toString(36).slice(2, 8)}`,
|
|
36544
36503
|
cli: match?.primaryCli ?? DEFAULT_CLI,
|
|
36545
36504
|
category: resolveExpertCategory(opts),
|
|
36546
36505
|
model: opts.model ?? "expert",
|
|
@@ -36596,12 +36555,12 @@ function recordExpertError2(expertId, role, errorMessage) {
|
|
|
36596
36555
|
});
|
|
36597
36556
|
}
|
|
36598
36557
|
}
|
|
36599
|
-
function autoCatalogScan(output2, expertId,
|
|
36558
|
+
function autoCatalogScan(output2, expertId, logger55) {
|
|
36600
36559
|
try {
|
|
36601
36560
|
const catalog = getAutoCatalog();
|
|
36602
36561
|
catalog.scanAndRecord(output2, "execute_expert");
|
|
36603
36562
|
} catch (error) {
|
|
36604
|
-
|
|
36563
|
+
logger55?.debug("Best-effort auto-catalog scan failed", {
|
|
36605
36564
|
error: getErrorMessage(error),
|
|
36606
36565
|
expertId
|
|
36607
36566
|
});
|
|
@@ -36659,11 +36618,11 @@ function computeExpertContextUtilization(observation, threshold = DEFAULT_CONTEX
|
|
|
36659
36618
|
threshold
|
|
36660
36619
|
};
|
|
36661
36620
|
}
|
|
36662
|
-
function observeExpertContext(observation,
|
|
36621
|
+
function observeExpertContext(observation, logger55, threshold = resolveContextWarnThreshold()) {
|
|
36663
36622
|
try {
|
|
36664
36623
|
const util = computeExpertContextUtilization(observation, threshold);
|
|
36665
36624
|
if (util.warned) {
|
|
36666
|
-
|
|
36625
|
+
logger55?.warn("context_warning", {
|
|
36667
36626
|
event: "context_warning",
|
|
36668
36627
|
expertId: observation.expertId,
|
|
36669
36628
|
role: observation.role,
|
|
@@ -36676,7 +36635,7 @@ function observeExpertContext(observation, logger54, threshold = resolveContextW
|
|
|
36676
36635
|
taskLength: observation.taskDescription.length
|
|
36677
36636
|
});
|
|
36678
36637
|
} else {
|
|
36679
|
-
|
|
36638
|
+
logger55?.debug("context_utilization", {
|
|
36680
36639
|
event: "context_utilization",
|
|
36681
36640
|
expertId: observation.expertId,
|
|
36682
36641
|
role: observation.role,
|
|
@@ -36764,7 +36723,7 @@ function buildSuccessResponse(params) {
|
|
|
36764
36723
|
}
|
|
36765
36724
|
return response;
|
|
36766
36725
|
}
|
|
36767
|
-
function observeExpertContextIfOk(result, expert, task, durationMs,
|
|
36726
|
+
function observeExpertContextIfOk(result, expert, task, durationMs, logger55) {
|
|
36768
36727
|
if (!result.ok) return;
|
|
36769
36728
|
const expertModelId = expert.expertConfig.modelPreference?.modelId;
|
|
36770
36729
|
const observation = {
|
|
@@ -36775,9 +36734,9 @@ function observeExpertContextIfOk(result, expert, task, durationMs, logger54) {
|
|
|
36775
36734
|
taskDescription: task.description,
|
|
36776
36735
|
durationMs
|
|
36777
36736
|
};
|
|
36778
|
-
observeExpertContext(observation,
|
|
36737
|
+
observeExpertContext(observation, logger55);
|
|
36779
36738
|
}
|
|
36780
|
-
async function deriveExpertAccessPolicy(task,
|
|
36739
|
+
async function deriveExpertAccessPolicy(task, logger55) {
|
|
36781
36740
|
const mode = resolveAccessPolicyMode();
|
|
36782
36741
|
try {
|
|
36783
36742
|
const policy = await deriveAccessPolicy(task.description, {
|
|
@@ -36785,14 +36744,14 @@ async function deriveExpertAccessPolicy(task, logger54) {
|
|
|
36785
36744
|
trustTier: "1"
|
|
36786
36745
|
});
|
|
36787
36746
|
if (mode !== "off") {
|
|
36788
|
-
|
|
36747
|
+
logger55?.info("access-policy: derived (expert)", {
|
|
36789
36748
|
mode,
|
|
36790
36749
|
source: policy.source
|
|
36791
36750
|
});
|
|
36792
36751
|
}
|
|
36793
36752
|
return policy;
|
|
36794
36753
|
} catch (error) {
|
|
36795
|
-
|
|
36754
|
+
logger55?.warn("access-policy: derivation failed, falling back to off (expert)", {
|
|
36796
36755
|
error: getErrorMessage(error)
|
|
36797
36756
|
});
|
|
36798
36757
|
return {
|
|
@@ -36800,7 +36759,7 @@ async function deriveExpertAccessPolicy(task, logger54) {
|
|
|
36800
36759
|
allowedPathPatterns: [],
|
|
36801
36760
|
allowedOperations: "*",
|
|
36802
36761
|
objectiveHash: "derivation-failed",
|
|
36803
|
-
derivedAt: (
|
|
36762
|
+
derivedAt: getTimeProvider().nowIso(),
|
|
36804
36763
|
source: "bypass",
|
|
36805
36764
|
mode: "off"
|
|
36806
36765
|
};
|
|
@@ -36838,11 +36797,11 @@ function isExpertDegraded(role) {
|
|
|
36838
36797
|
}
|
|
36839
36798
|
return consecutive >= DEGRADATION_CONSECUTIVE_THRESHOLD;
|
|
36840
36799
|
}
|
|
36841
|
-
async function tryExpertFallback(expert, task,
|
|
36800
|
+
async function tryExpertFallback(expert, task, logger55) {
|
|
36842
36801
|
const roleKey = `${expert.role}_expert`;
|
|
36843
36802
|
const category = ROLE_TO_TASK_CATEGORY[roleKey];
|
|
36844
36803
|
if (category === void 0) return void 0;
|
|
36845
|
-
const effectiveLogger =
|
|
36804
|
+
const effectiveLogger = logger55 ?? createLogger({ tool: "execute_expert" });
|
|
36846
36805
|
const registry = getGlobalRegistry({ logger: effectiveLogger });
|
|
36847
36806
|
const routing = registry.getRouting(category);
|
|
36848
36807
|
const primaryCli = routing?.primaryCli ?? "unknown";
|
|
@@ -36851,7 +36810,7 @@ async function tryExpertFallback(expert, task, logger54) {
|
|
|
36851
36810
|
const fallbackCli = chain[0];
|
|
36852
36811
|
if (fallbackCli === void 0) return void 0;
|
|
36853
36812
|
const fallbackAdapter = registry.getAdapterForCli(fallbackCli);
|
|
36854
|
-
|
|
36813
|
+
logger55?.info("Retrying expert with fallback CLI", { role: expert.role, fallbackCli });
|
|
36855
36814
|
const fallbackResult = createExpert(expert.expertConfig, { adapter: fallbackAdapter });
|
|
36856
36815
|
if (!fallbackResult.ok) return void 0;
|
|
36857
36816
|
const result = await fallbackResult.value.execute(task);
|
|
@@ -36869,7 +36828,7 @@ async function tryExpertFallback(expert, task, logger54) {
|
|
|
36869
36828
|
};
|
|
36870
36829
|
}
|
|
36871
36830
|
async function classifyExpertResult(opts) {
|
|
36872
|
-
const { result, expert, task, args, durationMs, logger:
|
|
36831
|
+
const { result, expert, task, args, durationMs, logger: logger55 } = opts;
|
|
36873
36832
|
const modelId = expert.expertConfig.modelPreference?.modelId;
|
|
36874
36833
|
const info = {
|
|
36875
36834
|
expertId: args.expertId,
|
|
@@ -36878,19 +36837,19 @@ async function classifyExpertResult(opts) {
|
|
|
36878
36837
|
};
|
|
36879
36838
|
if (!result.ok) {
|
|
36880
36839
|
if (isRateLimitFailure(result.error.message)) {
|
|
36881
|
-
const fallback = await tryExpertFallback(expert, task,
|
|
36840
|
+
const fallback = await tryExpertFallback(expert, task, logger55);
|
|
36882
36841
|
if (fallback !== void 0) return fallback;
|
|
36883
36842
|
}
|
|
36884
|
-
|
|
36843
|
+
logger55?.warn("Expert execution failed", {
|
|
36885
36844
|
expertId: args.expertId,
|
|
36886
36845
|
error: result.error.message
|
|
36887
36846
|
});
|
|
36888
36847
|
return handleExpertFailure(args.task, info, result.error.message, durationMs);
|
|
36889
36848
|
}
|
|
36890
|
-
|
|
36849
|
+
logger55?.info("Expert execution completed", { expertId: args.expertId, durationMs });
|
|
36891
36850
|
handleExpertSuccess(args.task, info, durationMs);
|
|
36892
36851
|
if (typeof result.value.output === "string") {
|
|
36893
|
-
autoCatalogScan(result.value.output, args.expertId,
|
|
36852
|
+
autoCatalogScan(result.value.output, args.expertId, logger55);
|
|
36894
36853
|
}
|
|
36895
36854
|
return {
|
|
36896
36855
|
ok: true,
|
|
@@ -36978,7 +36937,7 @@ var EXECUTE_EXPERT_TOOL_SCHEMA = {
|
|
|
36978
36937
|
context: z70.record(z70.string(), z70.unknown()).optional().describe("Additional context metadata for the task"),
|
|
36979
36938
|
timeoutMs: z70.number().int().min(EXPERT_TIMEOUT_FLOOR_MS).max(9e5).optional().describe("Optional timeout in ms (120s-900s). Overrides auto-detected timeout.")
|
|
36980
36939
|
};
|
|
36981
|
-
function createTaskHandler(deps,
|
|
36940
|
+
function createTaskHandler(deps, logger55) {
|
|
36982
36941
|
const notifier = deps.notifier ?? NOOP_NOTIFIER;
|
|
36983
36942
|
return {
|
|
36984
36943
|
createTask: (args, extra) => {
|
|
@@ -36990,7 +36949,7 @@ function createTaskHandler(deps, logger54) {
|
|
|
36990
36949
|
const { taskStore } = extra;
|
|
36991
36950
|
const ttl = clampTaskTtl(DEFAULT_TASK_TTL_MS);
|
|
36992
36951
|
const taskPromise = taskStore.createTask({ ttl, pollInterval: 5e3 }).then((task) => {
|
|
36993
|
-
|
|
36952
|
+
logger55.info("Task created for execute_expert", {
|
|
36994
36953
|
taskId: task.taskId,
|
|
36995
36954
|
expertId: validatedArgs.expertId
|
|
36996
36955
|
});
|
|
@@ -37015,7 +36974,7 @@ function createTaskHandler(deps, logger54) {
|
|
|
37015
36974
|
}
|
|
37016
36975
|
async function runBackgroundExpertTask(opts) {
|
|
37017
36976
|
const { deps, args, taskId, taskStore, notifier } = opts;
|
|
37018
|
-
const
|
|
36977
|
+
const logger55 = deps.logger ?? createLogger({ tool: "execute_expert" });
|
|
37019
36978
|
try {
|
|
37020
36979
|
notifier.info("execute_expert", {
|
|
37021
36980
|
event: "expert_start",
|
|
@@ -37045,13 +37004,13 @@ async function runBackgroundExpertTask(opts) {
|
|
|
37045
37004
|
});
|
|
37046
37005
|
} catch (error) {
|
|
37047
37006
|
const message = getErrorMessage(error);
|
|
37048
|
-
|
|
37007
|
+
logger55.warn("Background expert task failed", { taskId, error: message });
|
|
37049
37008
|
try {
|
|
37050
37009
|
await taskStore.storeTaskResult(taskId, "failed", {
|
|
37051
37010
|
...toolError(`Expert execution error: ${message}`)
|
|
37052
37011
|
});
|
|
37053
37012
|
} catch (storeError) {
|
|
37054
|
-
|
|
37013
|
+
logger55.warn("Failed to store task failure result", {
|
|
37055
37014
|
taskId,
|
|
37056
37015
|
error: getErrorMessage(storeError)
|
|
37057
37016
|
});
|
|
@@ -37059,7 +37018,7 @@ async function runBackgroundExpertTask(opts) {
|
|
|
37059
37018
|
}
|
|
37060
37019
|
}
|
|
37061
37020
|
function registerExecuteExpertTool(server, deps) {
|
|
37062
|
-
const
|
|
37021
|
+
const logger55 = deps.logger ?? createLogger({ tool: "execute_expert" });
|
|
37063
37022
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
37064
37023
|
const depsWithNotifier = { ...deps, notifier };
|
|
37065
37024
|
const description = "Execute a task using a previously created expert agent. Returns the expert analysis including output, confidence, and token usage.";
|
|
@@ -37070,9 +37029,9 @@ function registerExecuteExpertTool(server, deps) {
|
|
|
37070
37029
|
inputSchema: EXECUTE_EXPERT_TOOL_SCHEMA,
|
|
37071
37030
|
execution: { taskSupport: "optional" }
|
|
37072
37031
|
},
|
|
37073
|
-
createTaskHandler(depsWithNotifier,
|
|
37032
|
+
createTaskHandler(depsWithNotifier, logger55)
|
|
37074
37033
|
);
|
|
37075
|
-
|
|
37034
|
+
logger55.info("Registered execute_expert tool with MCP Tasks support (taskSupport: optional)");
|
|
37076
37035
|
}
|
|
37077
37036
|
|
|
37078
37037
|
// src/mcp/tools/research-query.ts
|
|
@@ -38416,15 +38375,15 @@ function createResearchQueryHandler(deps) {
|
|
|
38416
38375
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
38417
38376
|
}
|
|
38418
38377
|
ctx.logger.debug("Executing research query", { action: validationResult.data.action });
|
|
38419
|
-
const
|
|
38420
|
-
return withToolError("Research query failed",
|
|
38378
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_query" });
|
|
38379
|
+
return withToolError("Research query failed", logger55, async () => {
|
|
38421
38380
|
const result = await executeQuery(validationResult.data);
|
|
38422
38381
|
return toolSuccess(JSON.stringify(result, null, 2));
|
|
38423
38382
|
});
|
|
38424
38383
|
};
|
|
38425
38384
|
}
|
|
38426
38385
|
function registerResearchQueryTool(server, deps) {
|
|
38427
|
-
const
|
|
38386
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_query" });
|
|
38428
38387
|
const toolSchema = {
|
|
38429
38388
|
action: z73.enum(["status", "overlap", "stats", "search"]).describe("Query action: status, overlap, stats, or search"),
|
|
38430
38389
|
techniqueId: z73.string().optional().describe("Technique ID for status/overlap queries"),
|
|
@@ -38436,19 +38395,19 @@ function registerResearchQueryTool(server, deps) {
|
|
|
38436
38395
|
const secureHandler = createSecureHandler(createResearchQueryHandler(deps), {
|
|
38437
38396
|
toolName: "research_query",
|
|
38438
38397
|
rateLimiter: deps.rateLimiter,
|
|
38439
|
-
logger:
|
|
38398
|
+
logger: logger55
|
|
38440
38399
|
});
|
|
38441
38400
|
const timeoutMs = getToolTimeout("research_query", deps.security);
|
|
38442
38401
|
const wrappedHandler = wrapToolWithTimeout("research_query", secureHandler, {
|
|
38443
38402
|
timeoutMs,
|
|
38444
|
-
logger:
|
|
38403
|
+
logger: logger55
|
|
38445
38404
|
});
|
|
38446
38405
|
server.registerTool(
|
|
38447
38406
|
"research_query",
|
|
38448
38407
|
{ description, inputSchema: toolSchema },
|
|
38449
38408
|
toSdkCallback(wrappedHandler)
|
|
38450
38409
|
);
|
|
38451
|
-
|
|
38410
|
+
logger55.info("Registered research_query tool with secure handler and timeout protection");
|
|
38452
38411
|
}
|
|
38453
38412
|
|
|
38454
38413
|
// src/mcp/tools/research-add.ts
|
|
@@ -38459,7 +38418,7 @@ var ResearchAddInputSchema = z74.object({
|
|
|
38459
38418
|
priority: z74.enum(["P1", "P2", "P3", "P4"]).optional().describe("Priority level for the paper"),
|
|
38460
38419
|
dryRun: z74.boolean().optional().default(false).describe("Preview what would be added without persisting")
|
|
38461
38420
|
});
|
|
38462
|
-
async function executeResearchAdd(input,
|
|
38421
|
+
async function executeResearchAdd(input, logger55) {
|
|
38463
38422
|
const exists = await paperExists(input.arxivId);
|
|
38464
38423
|
if (exists) {
|
|
38465
38424
|
return {
|
|
@@ -38478,7 +38437,7 @@ async function executeResearchAdd(input, logger54) {
|
|
|
38478
38437
|
});
|
|
38479
38438
|
if (result.success && !input.dryRun) {
|
|
38480
38439
|
try {
|
|
38481
|
-
const memory = getToolMemory(
|
|
38440
|
+
const memory = getToolMemory(logger55);
|
|
38482
38441
|
memory.recordLearning({
|
|
38483
38442
|
pattern: `Added paper: ${result.title} (${result.paperId})`,
|
|
38484
38443
|
context: `topic=${input.topic ?? "general"}, priority=${input.priority ?? "unset"}`,
|
|
@@ -38486,7 +38445,7 @@ async function executeResearchAdd(input, logger54) {
|
|
|
38486
38445
|
source: "research_add"
|
|
38487
38446
|
});
|
|
38488
38447
|
} catch {
|
|
38489
|
-
|
|
38448
|
+
logger55.debug("Failed to record learning in session memory");
|
|
38490
38449
|
}
|
|
38491
38450
|
}
|
|
38492
38451
|
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 +38464,9 @@ function createResearchAddHandler(deps) {
|
|
|
38505
38464
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
38506
38465
|
}
|
|
38507
38466
|
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,
|
|
38467
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add" });
|
|
38468
|
+
return withToolError("Failed to add paper", logger55, async () => {
|
|
38469
|
+
const result = await executeResearchAdd(validationResult.data, logger55);
|
|
38511
38470
|
if (!result.success) {
|
|
38512
38471
|
return toolError(result.message);
|
|
38513
38472
|
}
|
|
@@ -38516,7 +38475,7 @@ function createResearchAddHandler(deps) {
|
|
|
38516
38475
|
};
|
|
38517
38476
|
}
|
|
38518
38477
|
function registerResearchAddTool(server, deps) {
|
|
38519
|
-
const
|
|
38478
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add" });
|
|
38520
38479
|
const toolSchema = {
|
|
38521
38480
|
arxivId: z74.string().regex(/^\d{4}\.\d{4,5}$/).describe('arXiv paper ID (e.g., "2401.12345")'),
|
|
38522
38481
|
topic: z74.string().optional().describe("Research topic to categorize the paper under"),
|
|
@@ -38527,19 +38486,19 @@ function registerResearchAddTool(server, deps) {
|
|
|
38527
38486
|
const secureHandler = createSecureHandler(createResearchAddHandler(deps), {
|
|
38528
38487
|
toolName: "research_add",
|
|
38529
38488
|
rateLimiter: deps.rateLimiter,
|
|
38530
|
-
logger:
|
|
38489
|
+
logger: logger55
|
|
38531
38490
|
});
|
|
38532
38491
|
const timeoutMs = getToolTimeout("research_add", deps.security);
|
|
38533
38492
|
const wrappedHandler = wrapToolWithTimeout("research_add", secureHandler, {
|
|
38534
38493
|
timeoutMs,
|
|
38535
|
-
logger:
|
|
38494
|
+
logger: logger55
|
|
38536
38495
|
});
|
|
38537
38496
|
server.registerTool(
|
|
38538
38497
|
"research_add",
|
|
38539
38498
|
{ description, inputSchema: toolSchema },
|
|
38540
38499
|
toSdkCallback(wrappedHandler)
|
|
38541
38500
|
);
|
|
38542
|
-
|
|
38501
|
+
logger55.info("Registered research_add tool with secure handler and timeout protection");
|
|
38543
38502
|
}
|
|
38544
38503
|
|
|
38545
38504
|
// src/mcp/tools/research-add-source.ts
|
|
@@ -38616,9 +38575,9 @@ function buildResponse2(params) {
|
|
|
38616
38575
|
dryRun: params.dryRun
|
|
38617
38576
|
};
|
|
38618
38577
|
}
|
|
38619
|
-
function recordAddSourceLearning(
|
|
38578
|
+
function recordAddSourceLearning(logger55, name, sourceId, type, qualityScore) {
|
|
38620
38579
|
try {
|
|
38621
|
-
const memory = getToolMemory(
|
|
38580
|
+
const memory = getToolMemory(logger55);
|
|
38622
38581
|
memory.recordLearning({
|
|
38623
38582
|
pattern: `Added source: ${name} (${sourceId})`,
|
|
38624
38583
|
context: `type=${type}, quality=${String(qualityScore)}`,
|
|
@@ -38626,7 +38585,7 @@ function recordAddSourceLearning(logger54, name, sourceId, type, qualityScore) {
|
|
|
38626
38585
|
source: "research_add_source"
|
|
38627
38586
|
});
|
|
38628
38587
|
} catch {
|
|
38629
|
-
|
|
38588
|
+
logger55.debug("Failed to record learning in session memory");
|
|
38630
38589
|
}
|
|
38631
38590
|
}
|
|
38632
38591
|
function prepareSource(input) {
|
|
@@ -38634,7 +38593,7 @@ function prepareSource(input) {
|
|
|
38634
38593
|
const score = computeSourceQualityScore(entry);
|
|
38635
38594
|
return { entry, score };
|
|
38636
38595
|
}
|
|
38637
|
-
async function executeResearchAddSource(input,
|
|
38596
|
+
async function executeResearchAddSource(input, logger55) {
|
|
38638
38597
|
const sourceId = generateSourceId(input.url);
|
|
38639
38598
|
const exists = await sourceExistsInRegistry(input.url);
|
|
38640
38599
|
if (exists) {
|
|
@@ -38669,8 +38628,8 @@ async function executeResearchAddSource(input, logger54) {
|
|
|
38669
38628
|
dryRun: false
|
|
38670
38629
|
});
|
|
38671
38630
|
}
|
|
38672
|
-
recordAddSourceLearning(
|
|
38673
|
-
|
|
38631
|
+
recordAddSourceLearning(logger55, input.name, sourceId, input.type, score);
|
|
38632
|
+
logger55.info("Added research source", { sourceId, name: input.name, qualityScore: score });
|
|
38674
38633
|
return buildResponse2({
|
|
38675
38634
|
success: true,
|
|
38676
38635
|
sourceId,
|
|
@@ -38687,9 +38646,9 @@ function createResearchAddSourceHandler(deps) {
|
|
|
38687
38646
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
38688
38647
|
}
|
|
38689
38648
|
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,
|
|
38649
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add_source" });
|
|
38650
|
+
return withToolError("Failed to add source", logger55, async () => {
|
|
38651
|
+
const result = await executeResearchAddSource(validationResult.data, logger55);
|
|
38693
38652
|
if (!result.success) {
|
|
38694
38653
|
return toolError(result.message);
|
|
38695
38654
|
}
|
|
@@ -38698,7 +38657,7 @@ function createResearchAddSourceHandler(deps) {
|
|
|
38698
38657
|
};
|
|
38699
38658
|
}
|
|
38700
38659
|
function registerResearchAddSourceTool(server, deps) {
|
|
38701
|
-
const
|
|
38660
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add_source" });
|
|
38702
38661
|
const toolSchema = {
|
|
38703
38662
|
url: z75.string().min(1).describe("Source URL"),
|
|
38704
38663
|
name: z75.string().min(1).describe("Display name"),
|
|
@@ -38723,12 +38682,12 @@ function registerResearchAddSourceTool(server, deps) {
|
|
|
38723
38682
|
toolName: "research_add_source",
|
|
38724
38683
|
securityTier: "external",
|
|
38725
38684
|
rateLimiter: deps.rateLimiter,
|
|
38726
|
-
logger:
|
|
38685
|
+
logger: logger55
|
|
38727
38686
|
});
|
|
38728
38687
|
const timeoutMs = getToolTimeout("research_add_source", deps.security);
|
|
38729
38688
|
const wrappedHandler = wrapToolWithTimeout("research_add_source", secureHandler, {
|
|
38730
38689
|
timeoutMs,
|
|
38731
|
-
logger:
|
|
38690
|
+
logger: logger55
|
|
38732
38691
|
});
|
|
38733
38692
|
server.registerTool(
|
|
38734
38693
|
"research_add_source",
|
|
@@ -38781,7 +38740,7 @@ function toDiscoveredItems(sources) {
|
|
|
38781
38740
|
discoveredAt: s.discoveredAt
|
|
38782
38741
|
}));
|
|
38783
38742
|
}
|
|
38784
|
-
async function discoverFromExtendedSource(source, topic, maxResults,
|
|
38743
|
+
async function discoverFromExtendedSource(source, topic, maxResults, logger55, sinceDate) {
|
|
38785
38744
|
let result;
|
|
38786
38745
|
switch (source) {
|
|
38787
38746
|
case "google_ai":
|
|
@@ -38809,7 +38768,7 @@ async function discoverFromExtendedSource(source, topic, maxResults, logger54, s
|
|
|
38809
38768
|
return { items: [], failed: true };
|
|
38810
38769
|
}
|
|
38811
38770
|
if (!result.ok) {
|
|
38812
|
-
|
|
38771
|
+
logger55.warn(`${source} discovery failed`, {
|
|
38813
38772
|
source,
|
|
38814
38773
|
errorCode: result.error.code,
|
|
38815
38774
|
error: result.error.message
|
|
@@ -38849,24 +38808,24 @@ function markExistingItems(items, existingIds) {
|
|
|
38849
38808
|
}
|
|
38850
38809
|
var ARXIV_ORG_SOURCES = /* @__PURE__ */ new Set(["google_ai", "meta_fair", "microsoft", "deepmind"]);
|
|
38851
38810
|
var INDEPENDENT_SOURCES = ["semantic_scholar", "papers_with_code", "openalex"];
|
|
38852
|
-
async function queryExtendedSource(src, input,
|
|
38811
|
+
async function queryExtendedSource(src, input, logger55, acc) {
|
|
38853
38812
|
acc.sources.push(src);
|
|
38854
38813
|
try {
|
|
38855
38814
|
const result = await discoverFromExtendedSource(
|
|
38856
38815
|
src,
|
|
38857
38816
|
input.topic,
|
|
38858
38817
|
input.maxResults,
|
|
38859
|
-
|
|
38818
|
+
logger55,
|
|
38860
38819
|
input.sinceDate
|
|
38861
38820
|
);
|
|
38862
38821
|
if (result.failed) acc.failedSources.push(src);
|
|
38863
38822
|
acc.items = acc.items.concat(result.items);
|
|
38864
38823
|
} catch (error) {
|
|
38865
38824
|
acc.failedSources.push(src);
|
|
38866
|
-
|
|
38825
|
+
logger55.warn("Source discovery failed", { source: src, error: getErrorMessage(error) });
|
|
38867
38826
|
}
|
|
38868
38827
|
}
|
|
38869
|
-
async function queryAllSources(input,
|
|
38828
|
+
async function queryAllSources(input, logger55) {
|
|
38870
38829
|
const acc = { sources: [], failedSources: [], items: [] };
|
|
38871
38830
|
const isAll = input.source === "all";
|
|
38872
38831
|
const shouldQuery = (src) => isAll || input.source === src;
|
|
@@ -38876,11 +38835,11 @@ async function queryAllSources(input, logger54) {
|
|
|
38876
38835
|
if (r.ok) acc.items = acc.items.concat(toDiscoveredItems(r.value));
|
|
38877
38836
|
else {
|
|
38878
38837
|
acc.failedSources.push("arxiv");
|
|
38879
|
-
|
|
38838
|
+
logger55.warn("arxiv discovery failed", { error: r.error.message });
|
|
38880
38839
|
}
|
|
38881
38840
|
}
|
|
38882
38841
|
for (const src of ARXIV_ORG_SOURCES) {
|
|
38883
|
-
if (!isAll && input.source === src) await queryExtendedSource(src, input,
|
|
38842
|
+
if (!isAll && input.source === src) await queryExtendedSource(src, input, logger55, acc);
|
|
38884
38843
|
}
|
|
38885
38844
|
if (shouldQuery("github")) {
|
|
38886
38845
|
acc.sources.push("github");
|
|
@@ -38888,15 +38847,15 @@ async function queryAllSources(input, logger54) {
|
|
|
38888
38847
|
if (r.ok) acc.items = acc.items.concat(toDiscoveredItems(r.value));
|
|
38889
38848
|
else {
|
|
38890
38849
|
acc.failedSources.push("github");
|
|
38891
|
-
|
|
38850
|
+
logger55.warn("github discovery failed", { error: r.error.message });
|
|
38892
38851
|
}
|
|
38893
38852
|
}
|
|
38894
38853
|
for (const src of INDEPENDENT_SOURCES) {
|
|
38895
|
-
if (shouldQuery(src)) await queryExtendedSource(src, input,
|
|
38854
|
+
if (shouldQuery(src)) await queryExtendedSource(src, input, logger55, acc);
|
|
38896
38855
|
}
|
|
38897
38856
|
return acc;
|
|
38898
38857
|
}
|
|
38899
|
-
async function executeDiscovery(rawInput,
|
|
38858
|
+
async function executeDiscovery(rawInput, logger55) {
|
|
38900
38859
|
const input = {
|
|
38901
38860
|
...rawInput,
|
|
38902
38861
|
topic: normalizeTopicToCanonical(rawInput.topic)
|
|
@@ -38906,7 +38865,7 @@ async function executeDiscovery(rawInput, logger54) {
|
|
|
38906
38865
|
sources: sourcesToQuery,
|
|
38907
38866
|
failedSources,
|
|
38908
38867
|
items: allItems
|
|
38909
|
-
} = await queryAllSources(input,
|
|
38868
|
+
} = await queryAllSources(input, logger55);
|
|
38910
38869
|
markExistingItems(allItems, existingIds);
|
|
38911
38870
|
const totalFound = allItems.length;
|
|
38912
38871
|
const inRegistry = allItems.filter((i) => i.alreadyInRegistry).length;
|
|
@@ -38918,7 +38877,7 @@ async function executeDiscovery(rawInput, logger54) {
|
|
|
38918
38877
|
).slice(0, input.maxResults);
|
|
38919
38878
|
const filteredOut = totalFound - inRegistry - relevantItems.length;
|
|
38920
38879
|
if (filteredOut > 0) {
|
|
38921
|
-
|
|
38880
|
+
logger55.debug("Filtered out irrelevant results", {
|
|
38922
38881
|
threshold,
|
|
38923
38882
|
filteredOut,
|
|
38924
38883
|
remaining: relevantItems.length
|
|
@@ -38966,7 +38925,7 @@ function recordDiscoveryOutcome(success, durationMs, errorMsg) {
|
|
|
38966
38925
|
}
|
|
38967
38926
|
const store = getOutcomeStore();
|
|
38968
38927
|
store.append({
|
|
38969
|
-
id: `research-discover-${String(
|
|
38928
|
+
id: `research-discover-${String(getTimeProvider().now())}-${getRandomProvider().random().toString(36).slice(2, 8)}`,
|
|
38970
38929
|
cli: DEFAULT_CLI,
|
|
38971
38930
|
category: "research",
|
|
38972
38931
|
model: "research-discover",
|
|
@@ -38998,10 +38957,10 @@ function createResearchDiscoverHandler(deps) {
|
|
|
38998
38957
|
topic: validationResult.data.topic,
|
|
38999
38958
|
source: validationResult.data.source
|
|
39000
38959
|
});
|
|
39001
|
-
const
|
|
38960
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_discover" });
|
|
39002
38961
|
const startMs = Date.now();
|
|
39003
|
-
const response = await withToolError("Discovery failed",
|
|
39004
|
-
const result = await executeDiscovery(validationResult.data,
|
|
38962
|
+
const response = await withToolError("Discovery failed", logger55, async () => {
|
|
38963
|
+
const result = await executeDiscovery(validationResult.data, logger55);
|
|
39005
38964
|
recordDiscoverySuccess(result.topic, result.newItems, result.sourcesQueried);
|
|
39006
38965
|
return toolSuccess(JSON.stringify(result, null, 2));
|
|
39007
38966
|
});
|
|
@@ -39016,7 +38975,7 @@ function createResearchDiscoverHandler(deps) {
|
|
|
39016
38975
|
};
|
|
39017
38976
|
}
|
|
39018
38977
|
function registerResearchDiscoverTool(server, deps) {
|
|
39019
|
-
const
|
|
38978
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_discover" });
|
|
39020
38979
|
const toolSchema = {
|
|
39021
38980
|
topic: z76.string().min(1).max(200).describe("Research topic to search for"),
|
|
39022
38981
|
source: z76.enum([
|
|
@@ -39039,19 +38998,19 @@ function registerResearchDiscoverTool(server, deps) {
|
|
|
39039
38998
|
const secureHandler = createSecureHandler(createResearchDiscoverHandler(deps), {
|
|
39040
38999
|
toolName: "research_discover",
|
|
39041
39000
|
rateLimiter: deps.rateLimiter,
|
|
39042
|
-
logger:
|
|
39001
|
+
logger: logger55
|
|
39043
39002
|
});
|
|
39044
39003
|
const timeoutMs = getToolTimeout("research_discover", deps.security);
|
|
39045
39004
|
const wrappedHandler = wrapToolWithTimeout("research_discover", secureHandler, {
|
|
39046
39005
|
timeoutMs,
|
|
39047
|
-
logger:
|
|
39006
|
+
logger: logger55
|
|
39048
39007
|
});
|
|
39049
39008
|
server.registerTool(
|
|
39050
39009
|
"research_discover",
|
|
39051
39010
|
{ description, inputSchema: toolSchema },
|
|
39052
39011
|
toSdkCallback(wrappedHandler)
|
|
39053
39012
|
);
|
|
39054
|
-
|
|
39013
|
+
logger55.info("Registered research_discover tool with secure handler and timeout protection");
|
|
39055
39014
|
}
|
|
39056
39015
|
|
|
39057
39016
|
// src/mcp/tools/research-analyze.ts
|
|
@@ -39292,15 +39251,15 @@ function createResearchAnalyzeHandler(deps) {
|
|
|
39292
39251
|
ctx.logger.debug("Analyzing research registry", {
|
|
39293
39252
|
focus: validationResult.data.focus
|
|
39294
39253
|
});
|
|
39295
|
-
const
|
|
39296
|
-
return withToolError("Analysis failed",
|
|
39254
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_analyze" });
|
|
39255
|
+
return withToolError("Analysis failed", logger55, async () => {
|
|
39297
39256
|
const result = await executeAnalysis(validationResult.data);
|
|
39298
39257
|
return toolSuccess(JSON.stringify(result, null, 2));
|
|
39299
39258
|
});
|
|
39300
39259
|
};
|
|
39301
39260
|
}
|
|
39302
39261
|
function registerResearchAnalyzeTool(server, deps) {
|
|
39303
|
-
const
|
|
39262
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_analyze" });
|
|
39304
39263
|
const toolSchema = {
|
|
39305
39264
|
focus: z77.enum(["gaps", "trends", "priorities", "stale", "coverage"]).describe("Analysis focus area"),
|
|
39306
39265
|
topic: z77.string().optional().describe("Optional topic filter")
|
|
@@ -39309,19 +39268,19 @@ function registerResearchAnalyzeTool(server, deps) {
|
|
|
39309
39268
|
const secureHandler = createSecureHandler(createResearchAnalyzeHandler(deps), {
|
|
39310
39269
|
toolName: "research_analyze",
|
|
39311
39270
|
rateLimiter: deps.rateLimiter,
|
|
39312
|
-
logger:
|
|
39271
|
+
logger: logger55
|
|
39313
39272
|
});
|
|
39314
39273
|
const timeoutMs = getToolTimeout("research_analyze", deps.security);
|
|
39315
39274
|
const wrappedHandler = wrapToolWithTimeout("research_analyze", secureHandler, {
|
|
39316
39275
|
timeoutMs,
|
|
39317
|
-
logger:
|
|
39276
|
+
logger: logger55
|
|
39318
39277
|
});
|
|
39319
39278
|
server.registerTool(
|
|
39320
39279
|
"research_analyze",
|
|
39321
39280
|
{ description, inputSchema: toolSchema },
|
|
39322
39281
|
toSdkCallback(wrappedHandler)
|
|
39323
39282
|
);
|
|
39324
|
-
|
|
39283
|
+
logger55.info("Registered research_analyze tool with secure handler and timeout protection");
|
|
39325
39284
|
}
|
|
39326
39285
|
|
|
39327
39286
|
// src/mcp/tools/research-catalog-review.ts
|
|
@@ -39344,7 +39303,7 @@ function handleList() {
|
|
|
39344
39303
|
data: { pending, count: pending.length }
|
|
39345
39304
|
};
|
|
39346
39305
|
}
|
|
39347
|
-
async function approveArxivRef(identifier, topic, shouldCreateIssue,
|
|
39306
|
+
async function approveArxivRef(identifier, topic, shouldCreateIssue, logger55) {
|
|
39348
39307
|
const catalog = getAutoCatalog();
|
|
39349
39308
|
const exists = await paperExists(identifier);
|
|
39350
39309
|
if (exists) {
|
|
@@ -39356,7 +39315,7 @@ async function approveArxivRef(identifier, topic, shouldCreateIssue, logger54) {
|
|
|
39356
39315
|
if (!result.success) {
|
|
39357
39316
|
return { action: "approve", success: false, message: `Failed: ${result.message}` };
|
|
39358
39317
|
}
|
|
39359
|
-
|
|
39318
|
+
logger55.info("Approved paper", { paperId: result.paperId });
|
|
39360
39319
|
if (shouldCreateIssue) {
|
|
39361
39320
|
const body = formatResearchIssueBody([
|
|
39362
39321
|
{
|
|
@@ -39380,11 +39339,11 @@ async function approveArxivRef(identifier, topic, shouldCreateIssue, logger54) {
|
|
|
39380
39339
|
data: { ...result, issueUrl: issueResult.value.url }
|
|
39381
39340
|
};
|
|
39382
39341
|
}
|
|
39383
|
-
|
|
39342
|
+
logger55.warn("Issue creation failed after approve", { error: issueResult.error.message });
|
|
39384
39343
|
}
|
|
39385
39344
|
return { action: "approve", success: true, message: `Added: ${result.title}`, data: result };
|
|
39386
39345
|
}
|
|
39387
|
-
async function handleApprove(input,
|
|
39346
|
+
async function handleApprove(input, logger55) {
|
|
39388
39347
|
if (input.identifier === void 0 || input.identifier === "") {
|
|
39389
39348
|
return { action: "approve", success: false, message: "identifier is required" };
|
|
39390
39349
|
}
|
|
@@ -39398,7 +39357,7 @@ async function handleApprove(input, logger54) {
|
|
|
39398
39357
|
};
|
|
39399
39358
|
}
|
|
39400
39359
|
if (ref.type === "arxiv") {
|
|
39401
|
-
return approveArxivRef(ref.identifier, input.topic, input.createIssue,
|
|
39360
|
+
return approveArxivRef(ref.identifier, input.topic, input.createIssue, logger55);
|
|
39402
39361
|
}
|
|
39403
39362
|
catalog.markReviewed(ref.identifier);
|
|
39404
39363
|
return { action: "approve", success: true, message: `Reviewed: ${ref.identifier}` };
|
|
@@ -39429,12 +39388,12 @@ function handleFlush() {
|
|
|
39429
39388
|
message: `Flushed ${String(count)} references from catalog`
|
|
39430
39389
|
};
|
|
39431
39390
|
}
|
|
39432
|
-
async function executeCatalogReview(input,
|
|
39391
|
+
async function executeCatalogReview(input, logger55) {
|
|
39433
39392
|
switch (input.action) {
|
|
39434
39393
|
case "list":
|
|
39435
39394
|
return handleList();
|
|
39436
39395
|
case "approve":
|
|
39437
|
-
return handleApprove(input,
|
|
39396
|
+
return handleApprove(input, logger55);
|
|
39438
39397
|
case "dismiss":
|
|
39439
39398
|
return handleDismiss(input);
|
|
39440
39399
|
case "flush":
|
|
@@ -39448,9 +39407,9 @@ function createCatalogReviewHandler(deps) {
|
|
|
39448
39407
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
39449
39408
|
}
|
|
39450
39409
|
ctx.logger.debug("Catalog review", { action: validationResult.data.action });
|
|
39451
|
-
const
|
|
39452
|
-
return withToolError("Catalog review failed",
|
|
39453
|
-
const result = await executeCatalogReview(validationResult.data,
|
|
39410
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_catalog_review" });
|
|
39411
|
+
return withToolError("Catalog review failed", logger55, async () => {
|
|
39412
|
+
const result = await executeCatalogReview(validationResult.data, logger55);
|
|
39454
39413
|
if (!result.success) {
|
|
39455
39414
|
return toolError(result.message);
|
|
39456
39415
|
}
|
|
@@ -39459,7 +39418,7 @@ function createCatalogReviewHandler(deps) {
|
|
|
39459
39418
|
};
|
|
39460
39419
|
}
|
|
39461
39420
|
function registerResearchCatalogReviewTool(server, deps) {
|
|
39462
|
-
const
|
|
39421
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_catalog_review" });
|
|
39463
39422
|
const toolSchema = {
|
|
39464
39423
|
action: z78.enum(["list", "approve", "dismiss", "flush"]).describe("Action to perform on cataloged references"),
|
|
39465
39424
|
identifier: z78.string().optional().describe("Reference identifier for approve/dismiss"),
|
|
@@ -39470,19 +39429,19 @@ function registerResearchCatalogReviewTool(server, deps) {
|
|
|
39470
39429
|
const secureHandler = createSecureHandler(createCatalogReviewHandler(deps), {
|
|
39471
39430
|
toolName: "research_catalog_review",
|
|
39472
39431
|
rateLimiter: deps.rateLimiter,
|
|
39473
|
-
logger:
|
|
39432
|
+
logger: logger55
|
|
39474
39433
|
});
|
|
39475
39434
|
const timeoutMs = getToolTimeout("research_catalog_review", deps.security);
|
|
39476
39435
|
const wrappedHandler = wrapToolWithTimeout("research_catalog_review", secureHandler, {
|
|
39477
39436
|
timeoutMs,
|
|
39478
|
-
logger:
|
|
39437
|
+
logger: logger55
|
|
39479
39438
|
});
|
|
39480
39439
|
server.registerTool(
|
|
39481
39440
|
"research_catalog_review",
|
|
39482
39441
|
{ description, inputSchema: toolSchema },
|
|
39483
39442
|
toSdkCallback(wrappedHandler)
|
|
39484
39443
|
);
|
|
39485
|
-
|
|
39444
|
+
logger55.info("Registered research_catalog_review tool");
|
|
39486
39445
|
}
|
|
39487
39446
|
|
|
39488
39447
|
// src/mcp/tools/research-synthesize.ts
|
|
@@ -39496,8 +39455,8 @@ function createResearchSynthesizeHandler(deps) {
|
|
|
39496
39455
|
if (!validationResult.success) {
|
|
39497
39456
|
return toolError(`Validation error: ${formatZodError(validationResult.error)}`);
|
|
39498
39457
|
}
|
|
39499
|
-
const
|
|
39500
|
-
return withToolError("Synthesis failed",
|
|
39458
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_synthesize" });
|
|
39459
|
+
return withToolError("Synthesis failed", logger55, async () => {
|
|
39501
39460
|
const result = await synthesizeResearch(validationResult.data.topic);
|
|
39502
39461
|
if (!result.ok) {
|
|
39503
39462
|
return toolError(`Synthesis failed: ${result.error.message}`);
|
|
@@ -39507,7 +39466,7 @@ function createResearchSynthesizeHandler(deps) {
|
|
|
39507
39466
|
};
|
|
39508
39467
|
}
|
|
39509
39468
|
function registerResearchSynthesizeTool(server, deps) {
|
|
39510
|
-
const
|
|
39469
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_synthesize" });
|
|
39511
39470
|
const toolSchema = {
|
|
39512
39471
|
topic: z79.string().optional().describe("Optional topic filter for single-cluster synthesis")
|
|
39513
39472
|
};
|
|
@@ -39515,19 +39474,19 @@ function registerResearchSynthesizeTool(server, deps) {
|
|
|
39515
39474
|
const secureHandler = createSecureHandler(createResearchSynthesizeHandler(deps), {
|
|
39516
39475
|
toolName: "research_synthesize",
|
|
39517
39476
|
rateLimiter: deps.rateLimiter,
|
|
39518
|
-
logger:
|
|
39477
|
+
logger: logger55
|
|
39519
39478
|
});
|
|
39520
39479
|
const timeoutMs = getToolTimeout("research_synthesize", deps.security);
|
|
39521
39480
|
const wrappedHandler = wrapToolWithTimeout("research_synthesize", secureHandler, {
|
|
39522
39481
|
timeoutMs,
|
|
39523
|
-
logger:
|
|
39482
|
+
logger: logger55
|
|
39524
39483
|
});
|
|
39525
39484
|
server.registerTool(
|
|
39526
39485
|
"research_synthesize",
|
|
39527
39486
|
{ description, inputSchema: toolSchema },
|
|
39528
39487
|
toSdkCallback(wrappedHandler)
|
|
39529
39488
|
);
|
|
39530
|
-
|
|
39489
|
+
logger55.info("Registered research_synthesize tool");
|
|
39531
39490
|
}
|
|
39532
39491
|
|
|
39533
39492
|
// src/mcp/tools/issue-triage-tool.ts
|
|
@@ -39581,7 +39540,7 @@ function createIssueTriageHandler(_deps) {
|
|
|
39581
39540
|
};
|
|
39582
39541
|
}
|
|
39583
39542
|
function registerIssueTriageTool(server, deps) {
|
|
39584
|
-
const
|
|
39543
|
+
const logger55 = deps.logger ?? createLogger({ tool: "issue_triage" });
|
|
39585
39544
|
const toolSchema = {
|
|
39586
39545
|
issueUrl: z80.string().min(1).describe("GitHub issue URL (e.g., https://github.com/owner/repo/issues/123)"),
|
|
39587
39546
|
dryRun: z80.boolean().optional().default(true).describe("Read-only mode (default: true)")
|
|
@@ -39591,19 +39550,19 @@ function registerIssueTriageTool(server, deps) {
|
|
|
39591
39550
|
toolName: "issue_triage",
|
|
39592
39551
|
securityTier: "external",
|
|
39593
39552
|
rateLimiter: deps.rateLimiter,
|
|
39594
|
-
logger:
|
|
39553
|
+
logger: logger55
|
|
39595
39554
|
});
|
|
39596
39555
|
const timeoutMs = getToolTimeout("issue_triage", deps.security);
|
|
39597
39556
|
const wrappedHandler = wrapToolWithTimeout("issue_triage", secureHandler, {
|
|
39598
39557
|
timeoutMs,
|
|
39599
|
-
logger:
|
|
39558
|
+
logger: logger55
|
|
39600
39559
|
});
|
|
39601
39560
|
server.registerTool(
|
|
39602
39561
|
"issue_triage",
|
|
39603
39562
|
{ description, inputSchema: toolSchema },
|
|
39604
39563
|
toSdkCallback(wrappedHandler)
|
|
39605
39564
|
);
|
|
39606
|
-
|
|
39565
|
+
logger55.info("Registered issue_triage tool with secure handler and timeout protection");
|
|
39607
39566
|
}
|
|
39608
39567
|
var triageLogger = createLogger({ tool: "issue-triage" });
|
|
39609
39568
|
function recordTriageSuccess(category, confidence, durationMs) {
|
|
@@ -39636,7 +39595,7 @@ function recordTriageOutcome(success, durationMs, errorMsg) {
|
|
|
39636
39595
|
}
|
|
39637
39596
|
const store = getOutcomeStore();
|
|
39638
39597
|
store.append({
|
|
39639
|
-
id: `triage-${String(
|
|
39598
|
+
id: `triage-${String(getTimeProvider().now())}-${getRandomProvider().random().toString(36).slice(2, 8)}`,
|
|
39640
39599
|
cli: DEFAULT_CLI,
|
|
39641
39600
|
category: "planning",
|
|
39642
39601
|
model: "issue-triage",
|
|
@@ -39840,7 +39799,7 @@ function createEventCollector(events, enableAuditTrail) {
|
|
|
39840
39799
|
auditBridge?.(event);
|
|
39841
39800
|
};
|
|
39842
39801
|
}
|
|
39843
|
-
async function handleRunGraphWorkflow(input,
|
|
39802
|
+
async function handleRunGraphWorkflow(input, logger55) {
|
|
39844
39803
|
const startTime = getTimeProvider().now();
|
|
39845
39804
|
const resolved = resolveGraph(input.workflow, startTime);
|
|
39846
39805
|
if (!resolved.ok) return resolved.error;
|
|
@@ -39848,7 +39807,7 @@ async function handleRunGraphWorkflow(input, logger54) {
|
|
|
39848
39807
|
const checkpointStore = input.enableCheckpointing ? createCheckpointStore() : void 0;
|
|
39849
39808
|
const onEvent = createEventCollector(events, input.enableAuditTrail);
|
|
39850
39809
|
const executionId = `graph-${input.workflow}-${String(Date.now())}`;
|
|
39851
|
-
|
|
39810
|
+
logger55.info("Executing graph workflow", {
|
|
39852
39811
|
workflow: input.workflow,
|
|
39853
39812
|
executionId,
|
|
39854
39813
|
checkpointing: input.enableCheckpointing,
|
|
@@ -39891,7 +39850,7 @@ var GRAPH_WORKFLOW_SCHEMA = {
|
|
|
39891
39850
|
enableCheckpointing: z81.boolean().optional().describe("Enable checkpoint saving"),
|
|
39892
39851
|
enableAuditTrail: z81.boolean().optional().describe("Enable audit trail logging")
|
|
39893
39852
|
};
|
|
39894
|
-
function createGraphWorkflowHandler(
|
|
39853
|
+
function createGraphWorkflowHandler(logger55, notifier) {
|
|
39895
39854
|
return async (args, _ctx) => {
|
|
39896
39855
|
const parsed = RunGraphWorkflowInputSchema.safeParse(args);
|
|
39897
39856
|
if (!parsed.success) {
|
|
@@ -39904,7 +39863,7 @@ function createGraphWorkflowHandler(logger54, notifier) {
|
|
|
39904
39863
|
event: "graph_workflow_start",
|
|
39905
39864
|
workflow: parsed.data.workflow
|
|
39906
39865
|
});
|
|
39907
|
-
const result = await handleRunGraphWorkflow(parsed.data,
|
|
39866
|
+
const result = await handleRunGraphWorkflow(parsed.data, logger55);
|
|
39908
39867
|
const succeeded = result.status === "completed";
|
|
39909
39868
|
notifier.info("run_graph_workflow", {
|
|
39910
39869
|
event: succeeded ? "graph_workflow_complete" : "graph_workflow_failed",
|
|
@@ -39918,22 +39877,22 @@ function createGraphWorkflowHandler(logger54, notifier) {
|
|
|
39918
39877
|
};
|
|
39919
39878
|
}
|
|
39920
39879
|
function registerRunGraphWorkflowTool(server, deps) {
|
|
39921
|
-
const
|
|
39880
|
+
const logger55 = deps.logger ?? createLogger({ tool: "run_graph_workflow" });
|
|
39922
39881
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
39923
|
-
const handler2 = createGraphWorkflowHandler(
|
|
39882
|
+
const handler2 = createGraphWorkflowHandler(logger55, notifier);
|
|
39924
39883
|
const secureHandler = createSecureHandler(handler2, {
|
|
39925
39884
|
toolName: "run_graph_workflow",
|
|
39926
39885
|
rateLimiter: deps.rateLimiter,
|
|
39927
|
-
logger:
|
|
39886
|
+
logger: logger55
|
|
39928
39887
|
});
|
|
39929
39888
|
const timeoutMs = getToolTimeout("run_graph_workflow", deps.security);
|
|
39930
|
-
const wrapped = wrapToolWithTimeout("run_graph_workflow", secureHandler, { timeoutMs, logger:
|
|
39889
|
+
const wrapped = wrapToolWithTimeout("run_graph_workflow", secureHandler, { timeoutMs, logger: logger55 });
|
|
39931
39890
|
server.registerTool(
|
|
39932
39891
|
"run_graph_workflow",
|
|
39933
39892
|
{ description: GRAPH_WORKFLOW_DESCRIPTION, inputSchema: GRAPH_WORKFLOW_SCHEMA },
|
|
39934
39893
|
toSdkCallback(wrapped)
|
|
39935
39894
|
);
|
|
39936
|
-
|
|
39895
|
+
logger55.info("Registered run_graph_workflow tool");
|
|
39937
39896
|
}
|
|
39938
39897
|
function toEventSummary(event) {
|
|
39939
39898
|
const hasNodeId = "nodeId" in event;
|
|
@@ -40012,7 +39971,7 @@ function recordGraphWorkflowResult(result) {
|
|
|
40012
39971
|
try {
|
|
40013
39972
|
const store = getOutcomeStore();
|
|
40014
39973
|
store.append({
|
|
40015
|
-
id: `graph-${String(
|
|
39974
|
+
id: `graph-${String(getTimeProvider().now())}-${getRandomProvider().random().toString(36).slice(2, 8)}`,
|
|
40016
39975
|
cli: DEFAULT_CLI,
|
|
40017
39976
|
category: workflowToCategory(result.workflow),
|
|
40018
39977
|
model: "graph-workflow",
|
|
@@ -40485,7 +40444,7 @@ var ExecuteSpecInputSchema = z82.object({
|
|
|
40485
40444
|
spec: z82.string().min(1).max(5e4).describe("Markdown specification to execute"),
|
|
40486
40445
|
dryRun: z82.boolean().optional().default(false).describe("Parse and decompose only")
|
|
40487
40446
|
});
|
|
40488
|
-
function createDryRunResponse(input,
|
|
40447
|
+
function createDryRunResponse(input, logger55) {
|
|
40489
40448
|
const parseResult2 = parseSpec(input.spec);
|
|
40490
40449
|
if (!parseResult2.ok) {
|
|
40491
40450
|
return toolError(`Parse error: ${parseResult2.error.message}`);
|
|
@@ -40494,14 +40453,14 @@ function createDryRunResponse(input, logger54) {
|
|
|
40494
40453
|
if (!dagResult.ok) {
|
|
40495
40454
|
return toolError(`Decompose error: ${dagResult.error.message}`);
|
|
40496
40455
|
}
|
|
40497
|
-
|
|
40456
|
+
logger55.info("Dry run completed", {
|
|
40498
40457
|
title: parseResult2.value.title,
|
|
40499
40458
|
nodes: dagResult.value.nodes.length
|
|
40500
40459
|
});
|
|
40501
40460
|
const output2 = { mode: "dry_run", spec: parseResult2.value, dag: dagResult.value };
|
|
40502
40461
|
return toolSuccess(JSON.stringify(output2, null, 2));
|
|
40503
40462
|
}
|
|
40504
|
-
async function createFullResponse(input,
|
|
40463
|
+
async function createFullResponse(input, logger55) {
|
|
40505
40464
|
const startMs = Date.now();
|
|
40506
40465
|
const result = await executeSpec(input.spec);
|
|
40507
40466
|
const durationMs = Date.now() - startMs;
|
|
@@ -40511,7 +40470,7 @@ async function createFullResponse(input, logger54) {
|
|
|
40511
40470
|
}
|
|
40512
40471
|
const analysis = analyzeFailures(result.value);
|
|
40513
40472
|
const satisfaction = result.value.validation.satisfaction;
|
|
40514
|
-
|
|
40473
|
+
logger55.info("Spec execution completed", {
|
|
40515
40474
|
satisfaction,
|
|
40516
40475
|
passed: analysis.ok ? analysis.value.passed : false
|
|
40517
40476
|
});
|
|
@@ -40525,24 +40484,24 @@ async function createFullResponse(input, logger54) {
|
|
|
40525
40484
|
return toolSuccess(JSON.stringify(output2, null, 2));
|
|
40526
40485
|
}
|
|
40527
40486
|
function registerExecuteSpecTool(server, deps) {
|
|
40528
|
-
const
|
|
40487
|
+
const logger55 = deps.logger ?? createLogger({ tool: "execute_spec" });
|
|
40529
40488
|
const handler2 = async (args, _ctx) => {
|
|
40530
40489
|
const parsed = ExecuteSpecInputSchema.safeParse(args);
|
|
40531
40490
|
if (!parsed.success) {
|
|
40532
40491
|
return toolError(`Invalid input: ${formatZodError(parsed.error)}`);
|
|
40533
40492
|
}
|
|
40534
40493
|
if (parsed.data.dryRun) {
|
|
40535
|
-
return createDryRunResponse(parsed.data,
|
|
40494
|
+
return createDryRunResponse(parsed.data, logger55);
|
|
40536
40495
|
}
|
|
40537
|
-
return createFullResponse(parsed.data,
|
|
40496
|
+
return createFullResponse(parsed.data, logger55);
|
|
40538
40497
|
};
|
|
40539
40498
|
const secureHandler = createSecureHandler(handler2, {
|
|
40540
40499
|
toolName: "execute_spec",
|
|
40541
40500
|
rateLimiter: deps.rateLimiter,
|
|
40542
|
-
logger:
|
|
40501
|
+
logger: logger55
|
|
40543
40502
|
});
|
|
40544
40503
|
const timeoutMs = getToolTimeout("execute_spec", deps.security);
|
|
40545
|
-
const wrapped = wrapToolWithTimeout("execute_spec", secureHandler, { timeoutMs, logger:
|
|
40504
|
+
const wrapped = wrapToolWithTimeout("execute_spec", secureHandler, { timeoutMs, logger: logger55 });
|
|
40546
40505
|
const toolSchema = {
|
|
40547
40506
|
spec: z82.string().min(1).max(5e4).describe(
|
|
40548
40507
|
'Markdown specification to execute. Must contain "## Requirements" and "## Acceptance Criteria" sections.'
|
|
@@ -40555,7 +40514,7 @@ function registerExecuteSpecTool(server, deps) {
|
|
|
40555
40514
|
{ description, inputSchema: toolSchema },
|
|
40556
40515
|
toSdkCallback(wrapped)
|
|
40557
40516
|
);
|
|
40558
|
-
|
|
40517
|
+
logger55.info("Registered execute_spec tool");
|
|
40559
40518
|
}
|
|
40560
40519
|
var specLogger = createLogger({ tool: "execute-spec" });
|
|
40561
40520
|
function recordSpecSuccess(satisfaction, durationMs) {
|
|
@@ -40588,7 +40547,7 @@ function recordSpecOutcome(success, durationMs, stage) {
|
|
|
40588
40547
|
}
|
|
40589
40548
|
const store = getOutcomeStore();
|
|
40590
40549
|
store.append({
|
|
40591
|
-
id: `spec-${String(
|
|
40550
|
+
id: `spec-${String(getTimeProvider().now())}-${getRandomProvider().random().toString(36).slice(2, 8)}`,
|
|
40592
40551
|
cli: DEFAULT_CLI,
|
|
40593
40552
|
category: "code_generation",
|
|
40594
40553
|
model: "spec-executor",
|
|
@@ -40617,29 +40576,29 @@ var MemoryQueryInputSchema = z83.object({
|
|
|
40617
40576
|
});
|
|
40618
40577
|
var reflectionCache;
|
|
40619
40578
|
var reflectionAdapter;
|
|
40620
|
-
function getReflectiveRetriever(
|
|
40579
|
+
function getReflectiveRetriever(logger55) {
|
|
40621
40580
|
const enabled = isReflectiveMemoryEnabled();
|
|
40622
40581
|
const shadow = isReflectiveShadowMode();
|
|
40623
40582
|
if (!enabled && !shadow) return void 0;
|
|
40624
40583
|
if (reflectionAdapter === void 0) {
|
|
40625
40584
|
try {
|
|
40626
|
-
const registry = getGlobalRegistry({ logger:
|
|
40585
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
40627
40586
|
reflectionAdapter = registry.getDefault();
|
|
40628
40587
|
} catch {
|
|
40629
|
-
|
|
40588
|
+
logger55.warn("No adapter for reflection, using keyword retrieval");
|
|
40630
40589
|
return void 0;
|
|
40631
40590
|
}
|
|
40632
40591
|
}
|
|
40633
40592
|
reflectionCache ??= new ReflectionCache();
|
|
40634
40593
|
return new ReflectiveRetriever({
|
|
40635
40594
|
adapter: reflectionAdapter,
|
|
40636
|
-
logger:
|
|
40595
|
+
logger: logger55,
|
|
40637
40596
|
shadowMode: shadow,
|
|
40638
40597
|
cache: reflectionCache
|
|
40639
40598
|
});
|
|
40640
40599
|
}
|
|
40641
|
-
async function resolveReflection(query,
|
|
40642
|
-
const retriever = getReflectiveRetriever(
|
|
40600
|
+
async function resolveReflection(query, logger55) {
|
|
40601
|
+
const retriever = getReflectiveRetriever(logger55);
|
|
40643
40602
|
if (retriever === void 0) return { effectiveQuery: query };
|
|
40644
40603
|
const reflection = await retriever.enhance(query);
|
|
40645
40604
|
const reflected = reflection.reflected;
|
|
@@ -40651,14 +40610,14 @@ async function resolveReflection(query, logger54) {
|
|
|
40651
40610
|
reflection
|
|
40652
40611
|
};
|
|
40653
40612
|
}
|
|
40654
|
-
async function executeMemoryQuery(input,
|
|
40613
|
+
async function executeMemoryQuery(input, logger55) {
|
|
40655
40614
|
const toolMemory = getToolMemory();
|
|
40656
40615
|
const { effectiveQuery, expandedQuery, reflection } = await resolveReflection(
|
|
40657
40616
|
input.query,
|
|
40658
|
-
|
|
40617
|
+
logger55
|
|
40659
40618
|
);
|
|
40660
40619
|
const results = await toolMemory.queryBySource(input.source, effectiveQuery, input.limit);
|
|
40661
|
-
|
|
40620
|
+
logger55.debug("Memory query executed", {
|
|
40662
40621
|
query: input.query,
|
|
40663
40622
|
effectiveQuery: effectiveQuery !== input.query ? effectiveQuery : void 0,
|
|
40664
40623
|
resultCount: results.length,
|
|
@@ -40685,7 +40644,7 @@ async function memoryQueryHandler(args, ctx) {
|
|
|
40685
40644
|
});
|
|
40686
40645
|
}
|
|
40687
40646
|
function registerMemoryQueryTool(server, deps) {
|
|
40688
|
-
const
|
|
40647
|
+
const logger55 = deps.logger ?? createLogger({ tool: "memory_query" });
|
|
40689
40648
|
const toolSchema = {
|
|
40690
40649
|
query: z83.string().min(1).max(500).describe("Search query to match against memory contents"),
|
|
40691
40650
|
limit: z83.number().int().min(1).max(50).optional().describe("Maximum results to return (default: 10, max: 50)"),
|
|
@@ -40695,16 +40654,16 @@ function registerMemoryQueryTool(server, deps) {
|
|
|
40695
40654
|
const secureHandler = createSecureHandler(memoryQueryHandler, {
|
|
40696
40655
|
toolName: "memory_query",
|
|
40697
40656
|
rateLimiter: deps.rateLimiter,
|
|
40698
|
-
logger:
|
|
40657
|
+
logger: logger55
|
|
40699
40658
|
});
|
|
40700
40659
|
const timeoutMs = getToolTimeout("memory_query", deps.security);
|
|
40701
|
-
const wrappedHandler = wrapToolWithTimeout("memory_query", secureHandler, { timeoutMs, logger:
|
|
40660
|
+
const wrappedHandler = wrapToolWithTimeout("memory_query", secureHandler, { timeoutMs, logger: logger55 });
|
|
40702
40661
|
server.registerTool(
|
|
40703
40662
|
"memory_query",
|
|
40704
40663
|
{ description, inputSchema: toolSchema },
|
|
40705
40664
|
toSdkCallback(wrappedHandler)
|
|
40706
40665
|
);
|
|
40707
|
-
|
|
40666
|
+
logger55.info("Registered memory_query tool");
|
|
40708
40667
|
}
|
|
40709
40668
|
|
|
40710
40669
|
// src/mcp/tools/memory-stats.ts
|
|
@@ -40712,7 +40671,7 @@ import { z as z84 } from "zod";
|
|
|
40712
40671
|
var MemoryStatsInputSchema = z84.object({
|
|
40713
40672
|
includeDecay: z84.boolean().optional().default(true).describe("Include decay statistics (default: true)")
|
|
40714
40673
|
});
|
|
40715
|
-
async function collectMemoryStats(input,
|
|
40674
|
+
async function collectMemoryStats(input, logger55) {
|
|
40716
40675
|
const toolMemory = getToolMemory();
|
|
40717
40676
|
const sessionStats = {
|
|
40718
40677
|
learningsCount: 0,
|
|
@@ -40749,7 +40708,7 @@ async function collectMemoryStats(input, logger54) {
|
|
|
40749
40708
|
mobimem: toolMemory.isMobiMemAvailable(),
|
|
40750
40709
|
decay: toolMemory.isDecayManagerAvailable()
|
|
40751
40710
|
};
|
|
40752
|
-
|
|
40711
|
+
logger55.debug("Memory stats collected", { backends });
|
|
40753
40712
|
return {
|
|
40754
40713
|
backends,
|
|
40755
40714
|
session: sessionStats,
|
|
@@ -40771,7 +40730,7 @@ async function memoryStatsHandler(args, ctx) {
|
|
|
40771
40730
|
});
|
|
40772
40731
|
}
|
|
40773
40732
|
function registerMemoryStatsTool(server, deps) {
|
|
40774
|
-
const
|
|
40733
|
+
const logger55 = deps.logger ?? createLogger({ tool: "memory_stats" });
|
|
40775
40734
|
const toolSchema = {
|
|
40776
40735
|
includeDecay: z84.boolean().optional().describe("Include decay statistics (default: true)")
|
|
40777
40736
|
};
|
|
@@ -40779,16 +40738,16 @@ function registerMemoryStatsTool(server, deps) {
|
|
|
40779
40738
|
const secureHandler = createSecureHandler(memoryStatsHandler, {
|
|
40780
40739
|
toolName: "memory_stats",
|
|
40781
40740
|
rateLimiter: deps.rateLimiter,
|
|
40782
|
-
logger:
|
|
40741
|
+
logger: logger55
|
|
40783
40742
|
});
|
|
40784
40743
|
const timeoutMs = getToolTimeout("memory_stats", deps.security);
|
|
40785
|
-
const wrappedHandler = wrapToolWithTimeout("memory_stats", secureHandler, { timeoutMs, logger:
|
|
40744
|
+
const wrappedHandler = wrapToolWithTimeout("memory_stats", secureHandler, { timeoutMs, logger: logger55 });
|
|
40786
40745
|
server.registerTool(
|
|
40787
40746
|
"memory_stats",
|
|
40788
40747
|
{ description, inputSchema: toolSchema },
|
|
40789
40748
|
toSdkCallback(wrappedHandler)
|
|
40790
40749
|
);
|
|
40791
|
-
|
|
40750
|
+
logger55.info("Registered memory_stats tool");
|
|
40792
40751
|
}
|
|
40793
40752
|
|
|
40794
40753
|
// src/mcp/tools/memory-write.ts
|
|
@@ -40877,12 +40836,12 @@ function isDuplicateWrite(key, content) {
|
|
|
40877
40836
|
recentWriteKeys.set(cacheKey, (/* @__PURE__ */ new Date()).toISOString());
|
|
40878
40837
|
return false;
|
|
40879
40838
|
}
|
|
40880
|
-
async function executeMemoryWrite(input,
|
|
40839
|
+
async function executeMemoryWrite(input, logger55) {
|
|
40881
40840
|
if (isDuplicateWrite(input.key, input.content)) {
|
|
40882
|
-
|
|
40841
|
+
logger55.debug("Skipping duplicate memory write", { key: input.key, backend: input.backend });
|
|
40883
40842
|
return { success: true, backend: input.backend, key: input.key, deduplicated: true };
|
|
40884
40843
|
}
|
|
40885
|
-
|
|
40844
|
+
logger55.debug("Writing to memory", {
|
|
40886
40845
|
backend: input.backend,
|
|
40887
40846
|
key: input.key,
|
|
40888
40847
|
contentLength: input.content.length
|
|
@@ -40914,7 +40873,7 @@ async function memoryWriteHandler(args, ctx) {
|
|
|
40914
40873
|
});
|
|
40915
40874
|
}
|
|
40916
40875
|
function registerMemoryWriteTool(server, deps) {
|
|
40917
|
-
const
|
|
40876
|
+
const logger55 = deps.logger ?? createLogger({ tool: "memory_write" });
|
|
40918
40877
|
const toolSchema = {
|
|
40919
40878
|
key: z85.string().min(1).max(200).describe("Memory identifier or subject"),
|
|
40920
40879
|
content: z85.string().min(1).max(5e3).describe("Memory content to store"),
|
|
@@ -40928,16 +40887,16 @@ function registerMemoryWriteTool(server, deps) {
|
|
|
40928
40887
|
const secureHandler = createSecureHandler(memoryWriteHandler, {
|
|
40929
40888
|
toolName: "memory_write",
|
|
40930
40889
|
rateLimiter: deps.rateLimiter,
|
|
40931
|
-
logger:
|
|
40890
|
+
logger: logger55
|
|
40932
40891
|
});
|
|
40933
40892
|
const timeoutMs = getToolTimeout("memory_write", deps.security);
|
|
40934
|
-
const wrappedHandler = wrapToolWithTimeout("memory_write", secureHandler, { timeoutMs, logger:
|
|
40893
|
+
const wrappedHandler = wrapToolWithTimeout("memory_write", secureHandler, { timeoutMs, logger: logger55 });
|
|
40935
40894
|
server.registerTool(
|
|
40936
40895
|
"memory_write",
|
|
40937
40896
|
{ description, inputSchema: toolSchema },
|
|
40938
40897
|
toSdkCallback(wrappedHandler)
|
|
40939
40898
|
);
|
|
40940
|
-
|
|
40899
|
+
logger55.info("Registered memory_write tool");
|
|
40941
40900
|
}
|
|
40942
40901
|
|
|
40943
40902
|
// src/mcp/tools/weather-report-tool.ts
|
|
@@ -40982,7 +40941,7 @@ function weatherReportHandler(args, ctx) {
|
|
|
40982
40941
|
}
|
|
40983
40942
|
}
|
|
40984
40943
|
function registerWeatherReportTool(server, deps) {
|
|
40985
|
-
const
|
|
40944
|
+
const logger55 = deps.logger ?? createLogger({ tool: "weather_report" });
|
|
40986
40945
|
const toolSchema = {
|
|
40987
40946
|
cli: z86.enum(["claude", "gemini", "codex", "opencode"]).optional().describe("Filter by CLI"),
|
|
40988
40947
|
category: z86.enum([
|
|
@@ -41003,19 +40962,19 @@ function registerWeatherReportTool(server, deps) {
|
|
|
41003
40962
|
const secureHandler = createSecureHandler(weatherReportHandler, {
|
|
41004
40963
|
toolName: "weather_report",
|
|
41005
40964
|
rateLimiter: deps.rateLimiter,
|
|
41006
|
-
logger:
|
|
40965
|
+
logger: logger55
|
|
41007
40966
|
});
|
|
41008
40967
|
const timeoutMs = getToolTimeout("weather_report", deps.security);
|
|
41009
40968
|
const wrappedHandler = wrapToolWithTimeout("weather_report", secureHandler, {
|
|
41010
40969
|
timeoutMs,
|
|
41011
|
-
logger:
|
|
40970
|
+
logger: logger55
|
|
41012
40971
|
});
|
|
41013
40972
|
server.registerTool(
|
|
41014
40973
|
"weather_report",
|
|
41015
40974
|
{ description, inputSchema: toolSchema },
|
|
41016
40975
|
toSdkCallback(wrappedHandler)
|
|
41017
40976
|
);
|
|
41018
|
-
|
|
40977
|
+
logger55.info("Registered weather_report tool");
|
|
41019
40978
|
}
|
|
41020
40979
|
|
|
41021
40980
|
// src/mcp/tools/registry-import-types.ts
|
|
@@ -41133,7 +41092,7 @@ function registryImportHandler(args, ctx) {
|
|
|
41133
41092
|
}
|
|
41134
41093
|
}
|
|
41135
41094
|
function registerRegistryImportTool(server, deps) {
|
|
41136
|
-
const
|
|
41095
|
+
const logger55 = deps.logger ?? createLogger({ tool: "registry_import" });
|
|
41137
41096
|
const toolSchema = {
|
|
41138
41097
|
provider: z88.enum(["anthropic", "google", "openai"]).describe("Model provider (anthropic, google, openai)"),
|
|
41139
41098
|
modelId: z88.string().min(1).describe("Provider model identifier"),
|
|
@@ -41143,19 +41102,19 @@ function registerRegistryImportTool(server, deps) {
|
|
|
41143
41102
|
const secureHandler = createSecureHandler(registryImportHandler, {
|
|
41144
41103
|
toolName: "registry_import",
|
|
41145
41104
|
rateLimiter: deps.rateLimiter,
|
|
41146
|
-
logger:
|
|
41105
|
+
logger: logger55
|
|
41147
41106
|
});
|
|
41148
41107
|
const timeoutMs = getToolTimeout("registry_import", deps.security);
|
|
41149
41108
|
const wrappedHandler = wrapToolWithTimeout("registry_import", secureHandler, {
|
|
41150
41109
|
timeoutMs,
|
|
41151
|
-
logger:
|
|
41110
|
+
logger: logger55
|
|
41152
41111
|
});
|
|
41153
41112
|
server.registerTool(
|
|
41154
41113
|
"registry_import",
|
|
41155
41114
|
{ description, inputSchema: toolSchema },
|
|
41156
41115
|
toSdkCallback(wrappedHandler)
|
|
41157
41116
|
);
|
|
41158
|
-
|
|
41117
|
+
logger55.info("Registered registry_import tool");
|
|
41159
41118
|
}
|
|
41160
41119
|
|
|
41161
41120
|
// src/mcp/tools/repo-analyze-types.ts
|
|
@@ -41185,7 +41144,7 @@ async function repoAnalyzeHandler(args, ctx) {
|
|
|
41185
41144
|
}
|
|
41186
41145
|
}
|
|
41187
41146
|
function registerRepoAnalyzeTool(server, deps) {
|
|
41188
|
-
const
|
|
41147
|
+
const logger55 = deps.logger ?? createLogger({ tool: "repo_analyze" });
|
|
41189
41148
|
const toolSchema = {
|
|
41190
41149
|
repo: z90.string().min(1).describe('GitHub repository in "owner/name" format or full URL'),
|
|
41191
41150
|
depth: z90.enum(["shallow", "deep"]).optional().describe("Analysis depth: shallow (tree + README) or deep")
|
|
@@ -41194,19 +41153,19 @@ function registerRepoAnalyzeTool(server, deps) {
|
|
|
41194
41153
|
const secureHandler = createSecureHandler(repoAnalyzeHandler, {
|
|
41195
41154
|
toolName: "repo_analyze",
|
|
41196
41155
|
rateLimiter: deps.rateLimiter,
|
|
41197
|
-
logger:
|
|
41156
|
+
logger: logger55
|
|
41198
41157
|
});
|
|
41199
41158
|
const timeoutMs = getToolTimeout("repo_analyze", deps.security);
|
|
41200
41159
|
const wrappedHandler = wrapToolWithTimeout("repo_analyze", secureHandler, {
|
|
41201
41160
|
timeoutMs,
|
|
41202
|
-
logger:
|
|
41161
|
+
logger: logger55
|
|
41203
41162
|
});
|
|
41204
41163
|
server.registerTool(
|
|
41205
41164
|
"repo_analyze",
|
|
41206
41165
|
{ description, inputSchema: toolSchema },
|
|
41207
41166
|
toSdkCallback(wrappedHandler)
|
|
41208
41167
|
);
|
|
41209
|
-
|
|
41168
|
+
logger55.info("Registered repo_analyze tool");
|
|
41210
41169
|
}
|
|
41211
41170
|
|
|
41212
41171
|
// src/mcp/tools/repo-security-plan-types.ts
|
|
@@ -41235,7 +41194,7 @@ async function handler(args, ctx) {
|
|
|
41235
41194
|
}
|
|
41236
41195
|
}
|
|
41237
41196
|
function registerRepoSecurityPlanTool(server, deps) {
|
|
41238
|
-
const
|
|
41197
|
+
const logger55 = deps.logger ?? createLogger({ tool: "repo_security_plan" });
|
|
41239
41198
|
const toolSchema = {
|
|
41240
41199
|
repo: z92.string().min(1).describe('GitHub repository in "owner/name" format or full URL'),
|
|
41241
41200
|
categories: z92.array(z92.string().max(50)).max(10).optional().describe('Filter to specific categories (e.g., ["sast", "sca", "secrets"])'),
|
|
@@ -41245,19 +41204,19 @@ function registerRepoSecurityPlanTool(server, deps) {
|
|
|
41245
41204
|
const secureHandler = createSecureHandler(handler, {
|
|
41246
41205
|
toolName: "repo_security_plan",
|
|
41247
41206
|
rateLimiter: deps.rateLimiter,
|
|
41248
|
-
logger:
|
|
41207
|
+
logger: logger55
|
|
41249
41208
|
});
|
|
41250
41209
|
const timeoutMs = getToolTimeout("repo_security_plan", deps.security);
|
|
41251
41210
|
const wrappedHandler = wrapToolWithTimeout("repo_security_plan", secureHandler, {
|
|
41252
41211
|
timeoutMs,
|
|
41253
|
-
logger:
|
|
41212
|
+
logger: logger55
|
|
41254
41213
|
});
|
|
41255
41214
|
server.registerTool(
|
|
41256
41215
|
"repo_security_plan",
|
|
41257
41216
|
{ description, inputSchema: toolSchema },
|
|
41258
41217
|
toSdkCallback(wrappedHandler)
|
|
41259
41218
|
);
|
|
41260
|
-
|
|
41219
|
+
logger55.info("Registered repo_security_plan tool");
|
|
41261
41220
|
}
|
|
41262
41221
|
|
|
41263
41222
|
// src/mcp/tools/search-codebase-tool.ts
|
|
@@ -41338,7 +41297,7 @@ ${output2}`);
|
|
|
41338
41297
|
}
|
|
41339
41298
|
}
|
|
41340
41299
|
function registerSearchCodebaseTool(server, deps) {
|
|
41341
|
-
const
|
|
41300
|
+
const logger55 = deps.logger ?? createLogger({ tool: "search_codebase" });
|
|
41342
41301
|
const toolSchema = {
|
|
41343
41302
|
query: z93.string().min(1).max(200).describe("Search query or file path"),
|
|
41344
41303
|
directory: z93.string().max(500).optional().describe("Directory to index"),
|
|
@@ -41349,16 +41308,16 @@ function registerSearchCodebaseTool(server, deps) {
|
|
|
41349
41308
|
const secureHandler = createSecureHandler(searchCodebaseHandler, {
|
|
41350
41309
|
toolName: "search_codebase",
|
|
41351
41310
|
rateLimiter: deps.rateLimiter,
|
|
41352
|
-
logger:
|
|
41311
|
+
logger: logger55
|
|
41353
41312
|
});
|
|
41354
41313
|
const timeoutMs = getToolTimeout("search_codebase", deps.security);
|
|
41355
|
-
const wrapped = wrapToolWithTimeout("search_codebase", secureHandler, { timeoutMs, logger:
|
|
41314
|
+
const wrapped = wrapToolWithTimeout("search_codebase", secureHandler, { timeoutMs, logger: logger55 });
|
|
41356
41315
|
server.registerTool(
|
|
41357
41316
|
"search_codebase",
|
|
41358
41317
|
{ description, inputSchema: toolSchema },
|
|
41359
41318
|
toSdkCallback(wrapped)
|
|
41360
41319
|
);
|
|
41361
|
-
|
|
41320
|
+
logger55.info("Registered search_codebase tool");
|
|
41362
41321
|
}
|
|
41363
41322
|
|
|
41364
41323
|
// src/mcp/tools/extract-symbols-tool.ts
|
|
@@ -41416,7 +41375,7 @@ async function extractSymbolsHandler(args, ctx) {
|
|
|
41416
41375
|
}
|
|
41417
41376
|
}
|
|
41418
41377
|
function registerExtractSymbolsTool(server, deps) {
|
|
41419
|
-
const
|
|
41378
|
+
const logger55 = deps.logger ?? createLogger({ tool: "extract_symbols" });
|
|
41420
41379
|
const toolSchema = {
|
|
41421
41380
|
filePath: z94.string().min(1).max(500).describe("Path to TypeScript/JavaScript file"),
|
|
41422
41381
|
mode: z94.enum(["index", "full"]).optional().describe("index (default): names+lines. full: includes source text")
|
|
@@ -41425,19 +41384,19 @@ function registerExtractSymbolsTool(server, deps) {
|
|
|
41425
41384
|
const secureHandler = createSecureHandler(extractSymbolsHandler, {
|
|
41426
41385
|
toolName: "extract_symbols",
|
|
41427
41386
|
rateLimiter: deps.rateLimiter,
|
|
41428
|
-
logger:
|
|
41387
|
+
logger: logger55
|
|
41429
41388
|
});
|
|
41430
41389
|
const timeoutMs = getToolTimeout("extract_symbols", deps.security);
|
|
41431
41390
|
const wrapped = wrapToolWithTimeout("extract_symbols", secureHandler, {
|
|
41432
41391
|
timeoutMs,
|
|
41433
|
-
logger:
|
|
41392
|
+
logger: logger55
|
|
41434
41393
|
});
|
|
41435
41394
|
server.registerTool(
|
|
41436
41395
|
"extract_symbols",
|
|
41437
41396
|
{ description, inputSchema: toolSchema },
|
|
41438
41397
|
toSdkCallback(wrapped)
|
|
41439
41398
|
);
|
|
41440
|
-
|
|
41399
|
+
logger55.info("Registered extract_symbols tool");
|
|
41441
41400
|
}
|
|
41442
41401
|
|
|
41443
41402
|
// src/mcp/tools/query-trace-tool.ts
|
|
@@ -41535,7 +41494,7 @@ function queryTraceHandler(args, ctx) {
|
|
|
41535
41494
|
});
|
|
41536
41495
|
}
|
|
41537
41496
|
function registerQueryTraceTool(server, deps) {
|
|
41538
|
-
const
|
|
41497
|
+
const logger55 = deps.logger ?? createLogger({ tool: "query_trace" });
|
|
41539
41498
|
const toolSchema = {
|
|
41540
41499
|
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
41500
|
eventType: z95.string().max(100).regex(/^[a-zA-Z0-9._-]+$/).optional().describe("Filter by event type (e.g., model.called)"),
|
|
@@ -41545,16 +41504,16 @@ function registerQueryTraceTool(server, deps) {
|
|
|
41545
41504
|
const secureHandler = createSecureHandler(queryTraceHandler, {
|
|
41546
41505
|
toolName: "query_trace",
|
|
41547
41506
|
rateLimiter: deps.rateLimiter,
|
|
41548
|
-
logger:
|
|
41507
|
+
logger: logger55
|
|
41549
41508
|
});
|
|
41550
41509
|
const timeoutMs = getToolTimeout("query_trace", deps.security);
|
|
41551
|
-
const wrappedHandler = wrapToolWithTimeout("query_trace", secureHandler, { timeoutMs, logger:
|
|
41510
|
+
const wrappedHandler = wrapToolWithTimeout("query_trace", secureHandler, { timeoutMs, logger: logger55 });
|
|
41552
41511
|
server.registerTool(
|
|
41553
41512
|
"query_trace",
|
|
41554
41513
|
{ description, inputSchema: toolSchema },
|
|
41555
41514
|
toSdkCallback(wrappedHandler)
|
|
41556
41515
|
);
|
|
41557
|
-
|
|
41516
|
+
logger55.info("Registered query_trace tool");
|
|
41558
41517
|
}
|
|
41559
41518
|
|
|
41560
41519
|
// src/pipeline/stage-types.ts
|
|
@@ -41942,7 +41901,7 @@ async function tryIssueTriage(task) {
|
|
|
41942
41901
|
try {
|
|
41943
41902
|
const issueMatch = task.match(/github\.com\/([^/]+\/[^/]+)\/issues\/(\d+)/);
|
|
41944
41903
|
if (issueMatch === null) return null;
|
|
41945
|
-
const { createIssueTriage } = await import("./issue-triage-
|
|
41904
|
+
const { createIssueTriage } = await import("./issue-triage-2YK6NOJD.js");
|
|
41946
41905
|
const triage = createIssueTriage();
|
|
41947
41906
|
const owner = issueMatch[1] ?? "";
|
|
41948
41907
|
const num = issueMatch[2] ?? "";
|
|
@@ -42973,7 +42932,7 @@ ${contextBlock}`;
|
|
|
42973
42932
|
const strategy = config.votingStrategy ?? "higher_order";
|
|
42974
42933
|
await postProgress(config, "Vote", `Running consensus with ${strategy} strategy...`);
|
|
42975
42934
|
try {
|
|
42976
|
-
const { executeVoting } = await import("./consensus-vote-
|
|
42935
|
+
const { executeVoting } = await import("./consensus-vote-VFTADRFB.js");
|
|
42977
42936
|
const votingResult = await executeVoting(
|
|
42978
42937
|
{
|
|
42979
42938
|
proposal: plan.slice(0, 4e3),
|
|
@@ -44017,7 +43976,7 @@ function queryTaskStateHandler(args, ctx) {
|
|
|
44017
43976
|
return Promise.resolve(toolSuccess(JSON.stringify(response, null, 2)));
|
|
44018
43977
|
}
|
|
44019
43978
|
function registerQueryTaskStateTool(server, deps) {
|
|
44020
|
-
const
|
|
43979
|
+
const logger55 = deps.logger ?? createLogger({ tool: "query_task_state" });
|
|
44021
43980
|
const toolSchema = {
|
|
44022
43981
|
taskId: z100.string().min(1).max(128).describe("Task ID whose structured state log should be read")
|
|
44023
43982
|
};
|
|
@@ -44025,19 +43984,19 @@ function registerQueryTaskStateTool(server, deps) {
|
|
|
44025
43984
|
const secureHandler = createSecureHandler(queryTaskStateHandler, {
|
|
44026
43985
|
toolName: "query_task_state",
|
|
44027
43986
|
rateLimiter: deps.rateLimiter,
|
|
44028
|
-
logger:
|
|
43987
|
+
logger: logger55
|
|
44029
43988
|
});
|
|
44030
43989
|
const timeoutMs = getToolTimeout("query_task_state", deps.security);
|
|
44031
43990
|
const wrappedHandler = wrapToolWithTimeout("query_task_state", secureHandler, {
|
|
44032
43991
|
timeoutMs,
|
|
44033
|
-
logger:
|
|
43992
|
+
logger: logger55
|
|
44034
43993
|
});
|
|
44035
43994
|
server.registerTool(
|
|
44036
43995
|
"query_task_state",
|
|
44037
43996
|
{ description, inputSchema: toolSchema },
|
|
44038
43997
|
toSdkCallback(wrappedHandler)
|
|
44039
43998
|
);
|
|
44040
|
-
|
|
43999
|
+
logger55.info("Registered query_task_state tool");
|
|
44041
44000
|
}
|
|
44042
44001
|
|
|
44043
44002
|
// src/mcp/tools/pipeline-tool.ts
|
|
@@ -44521,9 +44480,9 @@ function wrapWithObservability(toolName, cb, eventBus) {
|
|
|
44521
44480
|
|
|
44522
44481
|
// src/mcp/tools/index.ts
|
|
44523
44482
|
function registerTools(server, options) {
|
|
44524
|
-
const
|
|
44525
|
-
const rateLimiter = options?.rateLimiter ?? createDefaultRateLimiter("mcp-tools",
|
|
44526
|
-
|
|
44483
|
+
const logger55 = options?.logger ?? createMcpLogger({ component: "tools" });
|
|
44484
|
+
const rateLimiter = options?.rateLimiter ?? createDefaultRateLimiter("mcp-tools", logger55);
|
|
44485
|
+
logger55.info("Tool registration infrastructure initialized");
|
|
44527
44486
|
void server;
|
|
44528
44487
|
return {
|
|
44529
44488
|
tools: [
|
|
@@ -44559,7 +44518,7 @@ function registerTools(server, options) {
|
|
|
44559
44518
|
"run_dev_pipeline",
|
|
44560
44519
|
"run_pipeline"
|
|
44561
44520
|
],
|
|
44562
|
-
logger:
|
|
44521
|
+
logger: logger55,
|
|
44563
44522
|
rateLimiter
|
|
44564
44523
|
};
|
|
44565
44524
|
}
|
|
@@ -44572,32 +44531,32 @@ var TIER_NAMES = {
|
|
|
44572
44531
|
};
|
|
44573
44532
|
function createGateway(config = {}) {
|
|
44574
44533
|
const enabled = config.enabled !== false;
|
|
44575
|
-
const
|
|
44534
|
+
const logger55 = config.logger ?? createLogger({ component: "gateway" });
|
|
44576
44535
|
const overrides = config.tierOverrides;
|
|
44577
44536
|
return {
|
|
44578
44537
|
enabled,
|
|
44579
44538
|
wrapTool(toolName, handler2) {
|
|
44580
44539
|
if (!enabled) return handler2;
|
|
44581
|
-
return createGatewayHandler(toolName, handler2,
|
|
44540
|
+
return createGatewayHandler(toolName, handler2, logger55, overrides);
|
|
44582
44541
|
}
|
|
44583
44542
|
};
|
|
44584
44543
|
}
|
|
44585
|
-
function createGatewayHandler(toolName, handler2,
|
|
44544
|
+
function createGatewayHandler(toolName, handler2, logger55, overrides) {
|
|
44586
44545
|
return async (args) => {
|
|
44587
44546
|
const params = asRecord2(args);
|
|
44588
44547
|
const tier = classifyRequestTier(toolName, params, overrides);
|
|
44589
44548
|
const tierName = TIER_NAMES[tier];
|
|
44590
44549
|
const startMs = getTimeProvider().now();
|
|
44591
|
-
|
|
44550
|
+
logger55.debug("Gateway dispatch", { tool: toolName, tier, tierName });
|
|
44592
44551
|
try {
|
|
44593
44552
|
const result = await handler2(args);
|
|
44594
44553
|
const durationMs = getTimeProvider().now() - startMs;
|
|
44595
44554
|
const success = result.isError !== true;
|
|
44596
44555
|
const entry = { tool: toolName, tier, tierName, durationMs, success };
|
|
44597
44556
|
if (success) {
|
|
44598
|
-
|
|
44557
|
+
logger55.info("Gateway completed", { ...entry });
|
|
44599
44558
|
} else {
|
|
44600
|
-
|
|
44559
|
+
logger55.warn("Gateway completed with error", { ...entry });
|
|
44601
44560
|
}
|
|
44602
44561
|
return result;
|
|
44603
44562
|
} catch (error) {
|
|
@@ -44609,7 +44568,7 @@ function createGatewayHandler(toolName, handler2, logger54, overrides) {
|
|
|
44609
44568
|
durationMs,
|
|
44610
44569
|
success: false
|
|
44611
44570
|
};
|
|
44612
|
-
|
|
44571
|
+
logger55.error("Gateway handler threw", error instanceof Error ? error : void 0, {
|
|
44613
44572
|
...entry
|
|
44614
44573
|
});
|
|
44615
44574
|
throw error;
|
|
@@ -47042,7 +47001,7 @@ var FileAuditStorage = class _FileAuditStorage {
|
|
|
47042
47001
|
* @param logger - Optional logger instance
|
|
47043
47002
|
* @returns Result with FileAuditStorage or SecurityError
|
|
47044
47003
|
*/
|
|
47045
|
-
static create(config,
|
|
47004
|
+
static create(config, logger55) {
|
|
47046
47005
|
const validation = config.allowedRoot !== void 0 ? validateLogDir(config.logDir, config.allowedRoot) : validateLogDirBasic(config.logDir);
|
|
47047
47006
|
if (!validation.ok) {
|
|
47048
47007
|
return { ok: false, error: validation.error };
|
|
@@ -47051,7 +47010,7 @@ var FileAuditStorage = class _FileAuditStorage {
|
|
|
47051
47010
|
...config,
|
|
47052
47011
|
logDir: validation.value
|
|
47053
47012
|
};
|
|
47054
|
-
return { ok: true, value: new _FileAuditStorage(validatedConfig,
|
|
47013
|
+
return { ok: true, value: new _FileAuditStorage(validatedConfig, logger55, true) };
|
|
47055
47014
|
}
|
|
47056
47015
|
/**
|
|
47057
47016
|
* Constructor for FileAuditStorage.
|
|
@@ -47064,8 +47023,8 @@ var FileAuditStorage = class _FileAuditStorage {
|
|
|
47064
47023
|
* @param skipValidation - Internal flag, set by create() after validation
|
|
47065
47024
|
* @throws SecurityError if path validation fails and skipValidation is false
|
|
47066
47025
|
*/
|
|
47067
|
-
constructor(config,
|
|
47068
|
-
this.logger =
|
|
47026
|
+
constructor(config, logger55, skipValidation = false) {
|
|
47027
|
+
this.logger = logger55 ?? createLogger({ component: "FileAuditStorage" });
|
|
47069
47028
|
if (!skipValidation) {
|
|
47070
47029
|
const validation = validateLogDirBasic(config.logDir);
|
|
47071
47030
|
if (!validation.ok) {
|
|
@@ -47246,13 +47205,13 @@ var AuditLogger = class {
|
|
|
47246
47205
|
flushTimer = null;
|
|
47247
47206
|
flushIntervalMs;
|
|
47248
47207
|
closed = false;
|
|
47249
|
-
constructor(config, storage,
|
|
47208
|
+
constructor(config, storage, logger55) {
|
|
47250
47209
|
const validated = AuditLogConfigSchema.safeParse(config);
|
|
47251
47210
|
if (!validated.success) {
|
|
47252
47211
|
const issues = validated.error.issues.map((i) => i.path.join(".") + ": " + i.message).join("; ");
|
|
47253
47212
|
throw new AuditError("Invalid AuditLogConfig: " + issues);
|
|
47254
47213
|
}
|
|
47255
|
-
this.logger =
|
|
47214
|
+
this.logger = logger55 ?? createLogger({ component: "AuditLogger" });
|
|
47256
47215
|
this.enableHashChain = validated.data.enableHashChain;
|
|
47257
47216
|
this.minSeverity = validated.data.minSeverity;
|
|
47258
47217
|
this.categories = validated.data.categories;
|
|
@@ -47425,8 +47384,8 @@ var AuditLogger = class {
|
|
|
47425
47384
|
this.logger.info("AuditLogger closed");
|
|
47426
47385
|
}
|
|
47427
47386
|
};
|
|
47428
|
-
function createAuditLogger(config, storage,
|
|
47429
|
-
return new AuditLogger(config, storage,
|
|
47387
|
+
function createAuditLogger(config, storage, logger55) {
|
|
47388
|
+
return new AuditLogger(config, storage, logger55);
|
|
47430
47389
|
}
|
|
47431
47390
|
|
|
47432
47391
|
// src/security/sandbox/sandbox-types.ts
|
|
@@ -49824,6 +49783,73 @@ function createMockExecutor(responses) {
|
|
|
49824
49783
|
};
|
|
49825
49784
|
}
|
|
49826
49785
|
|
|
49786
|
+
// src/swe-bench/harness-verify-adapter.ts
|
|
49787
|
+
var logger51 = createLogger({ component: "harness-verify-adapter" });
|
|
49788
|
+
function translateEvaluationResult(result) {
|
|
49789
|
+
const stderr = buildStderr(result);
|
|
49790
|
+
const stdout = buildStdout(result);
|
|
49791
|
+
return {
|
|
49792
|
+
passed: result.resolved,
|
|
49793
|
+
stderr,
|
|
49794
|
+
stdout
|
|
49795
|
+
};
|
|
49796
|
+
}
|
|
49797
|
+
function buildStderr(result) {
|
|
49798
|
+
if (!result.patchApplied) {
|
|
49799
|
+
return `patch does not apply: ${result.patchError ?? "unknown error"}`;
|
|
49800
|
+
}
|
|
49801
|
+
if (result.status === "timeout") {
|
|
49802
|
+
return `Test run timed out after ${String(result.durationMs)}ms`;
|
|
49803
|
+
}
|
|
49804
|
+
if (result.status === "error") {
|
|
49805
|
+
return `Runtime error during evaluation: ${result.patchError ?? "unknown"}`;
|
|
49806
|
+
}
|
|
49807
|
+
const failed = result.testResults.filter((t) => t.status === "failed");
|
|
49808
|
+
if (failed.length === 0) return "";
|
|
49809
|
+
const lines = failed.slice(0, 20).map((t) => `FAILED ${t.testName}${t.errorMessage !== void 0 ? `: ${t.errorMessage}` : ""}`);
|
|
49810
|
+
return lines.join("\n");
|
|
49811
|
+
}
|
|
49812
|
+
function buildStdout(result) {
|
|
49813
|
+
const summary = [
|
|
49814
|
+
`Instance: ${result.instanceId}`,
|
|
49815
|
+
`Status: ${result.status}`,
|
|
49816
|
+
`Patch applied: ${String(result.patchApplied)}`,
|
|
49817
|
+
`Tests: ${String(result.testsPassed)}/${String(result.testsTotal)} passed`,
|
|
49818
|
+
`Duration: ${String(result.durationMs)}ms`
|
|
49819
|
+
];
|
|
49820
|
+
if (result.testsFailed > 0) summary.push(`Failed: ${String(result.testsFailed)}`);
|
|
49821
|
+
return summary.join("\n");
|
|
49822
|
+
}
|
|
49823
|
+
var HarnessVerifyAdapter = class {
|
|
49824
|
+
constructor(harness, modelNameOrPath, evalConfig) {
|
|
49825
|
+
this.harness = harness;
|
|
49826
|
+
this.modelNameOrPath = modelNameOrPath;
|
|
49827
|
+
this.evalConfig = evalConfig;
|
|
49828
|
+
}
|
|
49829
|
+
async verify(instance2, patch, _workDir) {
|
|
49830
|
+
const prediction = {
|
|
49831
|
+
instance_id: instance2.instance_id,
|
|
49832
|
+
model_name_or_path: this.modelNameOrPath,
|
|
49833
|
+
model_patch: patch
|
|
49834
|
+
};
|
|
49835
|
+
try {
|
|
49836
|
+
const result = await this.harness.evaluateInstance(prediction, this.evalConfig);
|
|
49837
|
+
return translateEvaluationResult(result);
|
|
49838
|
+
} catch (cause) {
|
|
49839
|
+
const msg = cause instanceof Error ? cause.message : String(cause);
|
|
49840
|
+
logger51.warn("Harness verify failed, treating as unresolved", {
|
|
49841
|
+
instanceId: instance2.instance_id,
|
|
49842
|
+
error: msg
|
|
49843
|
+
});
|
|
49844
|
+
return {
|
|
49845
|
+
passed: false,
|
|
49846
|
+
stderr: `Harness evaluation failed: ${msg}`,
|
|
49847
|
+
stdout: ""
|
|
49848
|
+
};
|
|
49849
|
+
}
|
|
49850
|
+
}
|
|
49851
|
+
};
|
|
49852
|
+
|
|
49827
49853
|
// src/swe-bench/nexus-agent-executor.ts
|
|
49828
49854
|
var EXECUTOR_DEFAULTS = {
|
|
49829
49855
|
modelId: getCliModelName(getDefaultModelForCli("claude")),
|
|
@@ -50841,8 +50867,8 @@ async function safeExec(command, timeoutMs = COMMAND_TIMEOUT_MS) {
|
|
|
50841
50867
|
function bytesToGB(bytes) {
|
|
50842
50868
|
return (bytes / BYTES_PER_GB).toFixed(1);
|
|
50843
50869
|
}
|
|
50844
|
-
async function validatePython(
|
|
50845
|
-
const log3 =
|
|
50870
|
+
async function validatePython(logger55) {
|
|
50871
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50846
50872
|
const pythonCommands = ["python3", "python3.11", "python3.10", "python"];
|
|
50847
50873
|
for (const cmd of pythonCommands) {
|
|
50848
50874
|
const result = await safeExec(`${cmd} --version`);
|
|
@@ -50866,8 +50892,8 @@ async function validatePython(logger54) {
|
|
|
50866
50892
|
log3.warn("No compatible Python found (need 3.10 or 3.11)");
|
|
50867
50893
|
return { available: false };
|
|
50868
50894
|
}
|
|
50869
|
-
async function validateSwebench(
|
|
50870
|
-
const log3 =
|
|
50895
|
+
async function validateSwebench(logger55) {
|
|
50896
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50871
50897
|
const result = await safeExec('python3 -c "import swebench; print(swebench.__version__)"');
|
|
50872
50898
|
const importVersion = result?.stdout.trim();
|
|
50873
50899
|
if (importVersion !== void 0 && importVersion !== "") {
|
|
@@ -50887,8 +50913,8 @@ async function validateSwebench(logger54) {
|
|
|
50887
50913
|
log3.warn("swebench package not found");
|
|
50888
50914
|
return { installed: false };
|
|
50889
50915
|
}
|
|
50890
|
-
async function validateDocker(
|
|
50891
|
-
const log3 =
|
|
50916
|
+
async function validateDocker(logger55) {
|
|
50917
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50892
50918
|
const versionResult = await safeExec('docker version --format "{{.Server.Version}}"');
|
|
50893
50919
|
if (!versionResult) {
|
|
50894
50920
|
log3.warn("Docker not available or daemon not running");
|
|
@@ -50911,8 +50937,8 @@ async function validateDocker(logger54) {
|
|
|
50911
50937
|
log3.warn("Docker daemon not running");
|
|
50912
50938
|
return { running: false };
|
|
50913
50939
|
}
|
|
50914
|
-
async function validateDiskSpace(
|
|
50915
|
-
const log3 =
|
|
50940
|
+
async function validateDiskSpace(logger55) {
|
|
50941
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50916
50942
|
const result = await safeExec("df -B1 . | tail -1");
|
|
50917
50943
|
if (!result) {
|
|
50918
50944
|
log3.warn("Could not determine disk space");
|
|
@@ -50963,8 +50989,8 @@ function collectWarnings(diskSpace) {
|
|
|
50963
50989
|
}
|
|
50964
50990
|
|
|
50965
50991
|
// src/swe-bench/environment-validator.ts
|
|
50966
|
-
async function validateEnvironment(
|
|
50967
|
-
const log3 =
|
|
50992
|
+
async function validateEnvironment(logger55) {
|
|
50993
|
+
const log3 = logger55 ?? createLogger({ component: "environment-validator" });
|
|
50968
50994
|
log3.info("Validating SWE-bench environment");
|
|
50969
50995
|
const [python, swebench, docker, diskSpace] = await Promise.all([
|
|
50970
50996
|
validatePython(log3),
|
|
@@ -51092,7 +51118,7 @@ function mapResolutionStatus(raw) {
|
|
|
51092
51118
|
import { exec as exec2 } from "child_process";
|
|
51093
51119
|
import { promisify as promisify6 } from "util";
|
|
51094
51120
|
var execAsync2 = promisify6(exec2);
|
|
51095
|
-
async function getSwebenchVersion(
|
|
51121
|
+
async function getSwebenchVersion(logger55) {
|
|
51096
51122
|
try {
|
|
51097
51123
|
const result = await execAsync2(
|
|
51098
51124
|
`${PYTHON_COMMAND} -c "import swebench; print(swebench.__version__)"`,
|
|
@@ -51100,15 +51126,15 @@ async function getSwebenchVersion(logger54) {
|
|
|
51100
51126
|
);
|
|
51101
51127
|
const version = result.stdout.trim();
|
|
51102
51128
|
if (version) {
|
|
51103
|
-
|
|
51129
|
+
logger55?.debug("swebench version detected", { version });
|
|
51104
51130
|
return version;
|
|
51105
51131
|
}
|
|
51106
51132
|
} catch (err2) {
|
|
51107
|
-
|
|
51133
|
+
logger55?.debug("Failed to get swebench version", { error: String(err2) });
|
|
51108
51134
|
}
|
|
51109
51135
|
return null;
|
|
51110
51136
|
}
|
|
51111
|
-
async function getPythonVersion(
|
|
51137
|
+
async function getPythonVersion(logger55) {
|
|
51112
51138
|
try {
|
|
51113
51139
|
const result = await execAsync2(`${PYTHON_COMMAND} --version`, {
|
|
51114
51140
|
timeout: QUICK_COMMAND_TIMEOUT_MS,
|
|
@@ -51116,15 +51142,15 @@ async function getPythonVersion(logger54) {
|
|
|
51116
51142
|
});
|
|
51117
51143
|
const match = result.stdout.trim().match(/Python\s+(\d+\.\d+\.\d+)/);
|
|
51118
51144
|
if (match?.[1] !== void 0) {
|
|
51119
|
-
|
|
51145
|
+
logger55?.debug("Python version detected", { version: match[1] });
|
|
51120
51146
|
return match[1];
|
|
51121
51147
|
}
|
|
51122
51148
|
} catch (err2) {
|
|
51123
|
-
|
|
51149
|
+
logger55?.debug("Failed to get Python version", { error: String(err2) });
|
|
51124
51150
|
}
|
|
51125
51151
|
return null;
|
|
51126
51152
|
}
|
|
51127
|
-
async function getDockerVersion(
|
|
51153
|
+
async function getDockerVersion(logger55) {
|
|
51128
51154
|
try {
|
|
51129
51155
|
const result = await execAsync2('docker version --format "{{.Server.Version}}"', {
|
|
51130
51156
|
timeout: QUICK_COMMAND_TIMEOUT_MS,
|
|
@@ -51132,27 +51158,27 @@ async function getDockerVersion(logger54) {
|
|
|
51132
51158
|
});
|
|
51133
51159
|
const version = result.stdout.trim();
|
|
51134
51160
|
if (version) {
|
|
51135
|
-
|
|
51161
|
+
logger55?.debug("Docker version detected", { version });
|
|
51136
51162
|
return version;
|
|
51137
51163
|
}
|
|
51138
51164
|
} catch (err2) {
|
|
51139
|
-
|
|
51165
|
+
logger55?.debug("Failed to get Docker version", { error: String(err2) });
|
|
51140
51166
|
}
|
|
51141
51167
|
return null;
|
|
51142
51168
|
}
|
|
51143
51169
|
|
|
51144
51170
|
// src/swe-bench/harness-output-parsing.ts
|
|
51145
51171
|
import * as fs12 from "fs/promises";
|
|
51146
|
-
function parseHarnessOutput(output2,
|
|
51172
|
+
function parseHarnessOutput(output2, logger55) {
|
|
51147
51173
|
try {
|
|
51148
51174
|
const parsed = JSON.parse(output2);
|
|
51149
51175
|
if (!isValidHarnessOutput(parsed)) {
|
|
51150
|
-
|
|
51176
|
+
logger55?.warn("Invalid harness output structure");
|
|
51151
51177
|
return null;
|
|
51152
51178
|
}
|
|
51153
51179
|
return parsed;
|
|
51154
51180
|
} catch (err2) {
|
|
51155
|
-
|
|
51181
|
+
logger55?.warn("Failed to parse harness output", { error: String(err2) });
|
|
51156
51182
|
return null;
|
|
51157
51183
|
}
|
|
51158
51184
|
}
|
|
@@ -51161,12 +51187,12 @@ function isValidHarnessOutput(obj) {
|
|
|
51161
51187
|
const o = obj;
|
|
51162
51188
|
return typeof o.run_id === "string" && typeof o.dataset_name === "string" && typeof o.model_name_or_path === "string" && Array.isArray(o.instance_results);
|
|
51163
51189
|
}
|
|
51164
|
-
async function parseHarnessLogFile(logPath,
|
|
51190
|
+
async function parseHarnessLogFile(logPath, logger55) {
|
|
51165
51191
|
try {
|
|
51166
51192
|
const content = await fs12.readFile(logPath, "utf-8");
|
|
51167
|
-
return parseHarnessOutput(content,
|
|
51193
|
+
return parseHarnessOutput(content, logger55);
|
|
51168
51194
|
} catch (err2) {
|
|
51169
|
-
|
|
51195
|
+
logger55?.warn("Failed to read harness log file", { logPath, error: String(err2) });
|
|
51170
51196
|
return null;
|
|
51171
51197
|
}
|
|
51172
51198
|
}
|
|
@@ -51286,7 +51312,7 @@ function countValidPredictions(content) {
|
|
|
51286
51312
|
const lines = content.trim().split("\n").filter(Boolean);
|
|
51287
51313
|
return lines.filter(isValidPredictionLine).length;
|
|
51288
51314
|
}
|
|
51289
|
-
async function validatePredictionsFile(predictionsPath,
|
|
51315
|
+
async function validatePredictionsFile(predictionsPath, logger55) {
|
|
51290
51316
|
try {
|
|
51291
51317
|
const stat5 = await fs13.stat(predictionsPath);
|
|
51292
51318
|
if (!stat5.isFile()) {
|
|
@@ -51297,19 +51323,19 @@ async function validatePredictionsFile(predictionsPath, logger54) {
|
|
|
51297
51323
|
if (validCount === 0) {
|
|
51298
51324
|
return { valid: false, lineCount: 0, error: "No valid predictions found" };
|
|
51299
51325
|
}
|
|
51300
|
-
|
|
51326
|
+
logger55?.debug("Predictions file validated", { lineCount: validCount, path: predictionsPath });
|
|
51301
51327
|
return { valid: true, lineCount: validCount };
|
|
51302
51328
|
} catch (err2) {
|
|
51303
51329
|
const errorMsg = err2 instanceof Error ? err2.message : String(err2);
|
|
51304
51330
|
return { valid: false, lineCount: 0, error: errorMsg };
|
|
51305
51331
|
}
|
|
51306
51332
|
}
|
|
51307
|
-
async function ensureOutputDir(outputDir,
|
|
51333
|
+
async function ensureOutputDir(outputDir, logger55) {
|
|
51308
51334
|
try {
|
|
51309
51335
|
await fs13.mkdir(outputDir, { recursive: true });
|
|
51310
|
-
|
|
51336
|
+
logger55?.debug("Output directory ensured", { path: outputDir });
|
|
51311
51337
|
} catch (err2) {
|
|
51312
|
-
|
|
51338
|
+
logger55?.warn("Failed to create output directory", { path: outputDir, error: String(err2) });
|
|
51313
51339
|
throw new HarnessExecutorError(
|
|
51314
51340
|
`Failed to create output directory: ${outputDir}`,
|
|
51315
51341
|
"EXECUTION_FAILED",
|
|
@@ -51317,10 +51343,10 @@ async function ensureOutputDir(outputDir, logger54) {
|
|
|
51317
51343
|
);
|
|
51318
51344
|
}
|
|
51319
51345
|
}
|
|
51320
|
-
function spawnHarnessProcess(config,
|
|
51346
|
+
function spawnHarnessProcess(config, logger55) {
|
|
51321
51347
|
const args = [HARNESS_SCRIPT.split(" ")[0] ?? "-m", ...HARNESS_SCRIPT.split(" ").slice(1)];
|
|
51322
51348
|
args.push(...buildHarnessArgs(config));
|
|
51323
|
-
|
|
51349
|
+
logger55?.info("Spawning harness process", { command: PYTHON_COMMAND, args });
|
|
51324
51350
|
const proc = spawn(PYTHON_COMMAND, args, {
|
|
51325
51351
|
stdio: ["ignore", "pipe", "pipe"],
|
|
51326
51352
|
env: { ...process.env }
|
|
@@ -51408,20 +51434,20 @@ function handleProcessClose(options) {
|
|
|
51408
51434
|
}
|
|
51409
51435
|
});
|
|
51410
51436
|
}
|
|
51411
|
-
async function handleProcessExitAsync(code, config, stderr,
|
|
51437
|
+
async function handleProcessExitAsync(code, config, stderr, logger55) {
|
|
51412
51438
|
if (code !== 0) {
|
|
51413
|
-
|
|
51439
|
+
logger55.error("Harness process failed", new Error(stderr), { exitCode: code });
|
|
51414
51440
|
throw new HarnessExecutorError(
|
|
51415
51441
|
`Harness process exited with code ${String(code)}`,
|
|
51416
51442
|
"EXECUTION_FAILED"
|
|
51417
51443
|
);
|
|
51418
51444
|
}
|
|
51419
|
-
return parseResultsFile(config,
|
|
51445
|
+
return parseResultsFile(config, logger55);
|
|
51420
51446
|
}
|
|
51421
|
-
async function parseResultsFile(config,
|
|
51447
|
+
async function parseResultsFile(config, logger55) {
|
|
51422
51448
|
const resultsPath = getResultsFilePath(config);
|
|
51423
|
-
|
|
51424
|
-
const rawOutput = await parseHarnessLogFile(resultsPath,
|
|
51449
|
+
logger55.info("Parsing results file", { path: resultsPath });
|
|
51450
|
+
const rawOutput = await parseHarnessLogFile(resultsPath, logger55);
|
|
51425
51451
|
if (rawOutput === null) {
|
|
51426
51452
|
throw new HarnessExecutorError(`Failed to parse results from: ${resultsPath}`, "PARSE_ERROR");
|
|
51427
51453
|
}
|
|
@@ -51479,8 +51505,8 @@ var HarnessExecutor = class {
|
|
|
51479
51505
|
logger;
|
|
51480
51506
|
currentProcess = null;
|
|
51481
51507
|
isCancelled = false;
|
|
51482
|
-
constructor(
|
|
51483
|
-
this.logger =
|
|
51508
|
+
constructor(logger55) {
|
|
51509
|
+
this.logger = logger55 ?? createLogger({ component: "harness-executor" });
|
|
51484
51510
|
}
|
|
51485
51511
|
/**
|
|
51486
51512
|
* Validates that the environment is ready for harness execution.
|
|
@@ -51632,11 +51658,11 @@ var HarnessExecutor = class {
|
|
|
51632
51658
|
};
|
|
51633
51659
|
|
|
51634
51660
|
// src/swe-bench/harness-executor-factory.ts
|
|
51635
|
-
function createHarnessExecutor(
|
|
51636
|
-
return new HarnessExecutor(
|
|
51661
|
+
function createHarnessExecutor(logger55) {
|
|
51662
|
+
return new HarnessExecutor(logger55);
|
|
51637
51663
|
}
|
|
51638
|
-
async function createValidatedExecutor(
|
|
51639
|
-
const executor = createHarnessExecutor(
|
|
51664
|
+
async function createValidatedExecutor(logger55) {
|
|
51665
|
+
const executor = createHarnessExecutor(logger55);
|
|
51640
51666
|
const validation = await executor.validate();
|
|
51641
51667
|
return { executor, validation };
|
|
51642
51668
|
}
|
|
@@ -51756,8 +51782,8 @@ var EvaluationHarness = class {
|
|
|
51756
51782
|
logger;
|
|
51757
51783
|
executor;
|
|
51758
51784
|
isCancelled = false;
|
|
51759
|
-
constructor(
|
|
51760
|
-
this.logger =
|
|
51785
|
+
constructor(logger55) {
|
|
51786
|
+
this.logger = logger55 ?? createLogger({ component: "evaluation-harness" });
|
|
51761
51787
|
this.executor = createHarnessExecutor(this.logger);
|
|
51762
51788
|
}
|
|
51763
51789
|
/**
|
|
@@ -51917,11 +51943,11 @@ var EvaluationHarness = class {
|
|
|
51917
51943
|
return returnValue;
|
|
51918
51944
|
}
|
|
51919
51945
|
};
|
|
51920
|
-
function createEvaluationHarness(
|
|
51921
|
-
return new EvaluationHarness(
|
|
51946
|
+
function createEvaluationHarness(logger55) {
|
|
51947
|
+
return new EvaluationHarness(logger55);
|
|
51922
51948
|
}
|
|
51923
|
-
async function createValidatedHarness(
|
|
51924
|
-
const harness = createEvaluationHarness(
|
|
51949
|
+
async function createValidatedHarness(logger55) {
|
|
51950
|
+
const harness = createEvaluationHarness(logger55);
|
|
51925
51951
|
const validation = await harness.validate();
|
|
51926
51952
|
if (!validation.ready) {
|
|
51927
51953
|
return err(
|
|
@@ -52176,9 +52202,9 @@ function handlePatchError(err2, options) {
|
|
|
52176
52202
|
backupCreated: options.createBackup && !options.dryRun
|
|
52177
52203
|
};
|
|
52178
52204
|
}
|
|
52179
|
-
async function executePatch(patchPath, options, reverse,
|
|
52205
|
+
async function executePatch(patchPath, options, reverse, logger55) {
|
|
52180
52206
|
const args = buildPatchArgs(patchPath, options, reverse);
|
|
52181
|
-
|
|
52207
|
+
logger55.debug("Executing patch command", { args, cwd: options.workDir });
|
|
52182
52208
|
try {
|
|
52183
52209
|
const { stdout, stderr } = await execFileAsync5("patch", args, {
|
|
52184
52210
|
cwd: options.workDir,
|
|
@@ -52210,8 +52236,8 @@ ${stderr}`.trim();
|
|
|
52210
52236
|
// src/swe-bench/patch-applicator.ts
|
|
52211
52237
|
var PatchApplicator = class {
|
|
52212
52238
|
logger;
|
|
52213
|
-
constructor(
|
|
52214
|
-
this.logger =
|
|
52239
|
+
constructor(logger55) {
|
|
52240
|
+
this.logger = logger55 ?? createLogger({ component: "patch-applicator" });
|
|
52215
52241
|
}
|
|
52216
52242
|
/**
|
|
52217
52243
|
* Validates a patch without applying it.
|
|
@@ -52287,8 +52313,8 @@ var PatchApplicator = class {
|
|
|
52287
52313
|
};
|
|
52288
52314
|
}
|
|
52289
52315
|
};
|
|
52290
|
-
function createPatchApplicator(
|
|
52291
|
-
return new PatchApplicator(
|
|
52316
|
+
function createPatchApplicator(logger55) {
|
|
52317
|
+
return new PatchApplicator(logger55);
|
|
52292
52318
|
}
|
|
52293
52319
|
function validatePatch(patch) {
|
|
52294
52320
|
return parsePatch(patch);
|
|
@@ -52487,9 +52513,9 @@ function attachOutputCapture(proc, maxOutputBytes) {
|
|
|
52487
52513
|
};
|
|
52488
52514
|
}
|
|
52489
52515
|
function executeInDocker(options) {
|
|
52490
|
-
const { command, config, startTime, state, createCancelledResult: createCancelledResult2, handleTestError, logger:
|
|
52516
|
+
const { command, config, startTime, state, createCancelledResult: createCancelledResult2, handleTestError, logger: logger55 } = options;
|
|
52491
52517
|
const image = config.dockerImage ?? "python:3.11-slim";
|
|
52492
|
-
|
|
52518
|
+
logger55.debug("Executing tests in Docker", { image, command });
|
|
52493
52519
|
const dockerArgs = buildDockerArgs(command, config, image);
|
|
52494
52520
|
return new Promise((resolve18) => {
|
|
52495
52521
|
const proc = spawn2("docker", dockerArgs, {
|
|
@@ -52546,8 +52572,8 @@ var TestRunner = class {
|
|
|
52546
52572
|
currentProcess: null,
|
|
52547
52573
|
isCancelled: false
|
|
52548
52574
|
};
|
|
52549
|
-
constructor(
|
|
52550
|
-
this.logger =
|
|
52575
|
+
constructor(logger55) {
|
|
52576
|
+
this.logger = logger55 ?? createLogger({ component: "test-runner" });
|
|
52551
52577
|
}
|
|
52552
52578
|
/**
|
|
52553
52579
|
* Detects the test framework used by the repository.
|
|
@@ -52768,8 +52794,8 @@ ${stderr}`.trim();
|
|
|
52768
52794
|
};
|
|
52769
52795
|
}
|
|
52770
52796
|
};
|
|
52771
|
-
function createTestRunner(
|
|
52772
|
-
return new TestRunner(
|
|
52797
|
+
function createTestRunner(logger55) {
|
|
52798
|
+
return new TestRunner(logger55);
|
|
52773
52799
|
}
|
|
52774
52800
|
async function runTests(workDir, options) {
|
|
52775
52801
|
const runner = createTestRunner();
|
|
@@ -53078,8 +53104,8 @@ function identifyWeaknesses(result, competitors) {
|
|
|
53078
53104
|
// src/swe-bench/report-generator.ts
|
|
53079
53105
|
var ReportGenerator = class {
|
|
53080
53106
|
logger;
|
|
53081
|
-
constructor(
|
|
53082
|
-
this.logger =
|
|
53107
|
+
constructor(logger55) {
|
|
53108
|
+
this.logger = logger55 ?? createLogger({ component: "report-generator" });
|
|
53083
53109
|
}
|
|
53084
53110
|
/**
|
|
53085
53111
|
* Generates a full evaluation report.
|
|
@@ -53342,8 +53368,8 @@ var ReportGenerator = class {
|
|
|
53342
53368
|
};
|
|
53343
53369
|
}
|
|
53344
53370
|
};
|
|
53345
|
-
function createReportGenerator(
|
|
53346
|
-
return new ReportGenerator(
|
|
53371
|
+
function createReportGenerator(logger55) {
|
|
53372
|
+
return new ReportGenerator(logger55);
|
|
53347
53373
|
}
|
|
53348
53374
|
async function generateReport(result, config, competitors) {
|
|
53349
53375
|
const generator = createReportGenerator();
|
|
@@ -53490,7 +53516,7 @@ var TraceLogger = class {
|
|
|
53490
53516
|
};
|
|
53491
53517
|
|
|
53492
53518
|
// src/pipeline/event-bus-bridge.ts
|
|
53493
|
-
var
|
|
53519
|
+
var logger52 = createLogger({ component: "EventBusBridge" });
|
|
53494
53520
|
function toV1Topic(prefix, event) {
|
|
53495
53521
|
return `${prefix}.${event.type}`;
|
|
53496
53522
|
}
|
|
@@ -53522,10 +53548,10 @@ function createEventBusBridge(options) {
|
|
|
53522
53548
|
forwardCount++;
|
|
53523
53549
|
} catch (error) {
|
|
53524
53550
|
const msg = getErrorMessage(error);
|
|
53525
|
-
|
|
53551
|
+
logger52.warn("Failed to forward pipeline event", { type: event.type, error: msg });
|
|
53526
53552
|
}
|
|
53527
53553
|
});
|
|
53528
|
-
|
|
53554
|
+
logger52.info("EventBus bridge initialized", { prefix });
|
|
53529
53555
|
return {
|
|
53530
53556
|
forwarded: () => forwardCount,
|
|
53531
53557
|
dispose: unsub
|
|
@@ -53533,7 +53559,7 @@ function createEventBusBridge(options) {
|
|
|
53533
53559
|
}
|
|
53534
53560
|
|
|
53535
53561
|
// src/adapters/stdin-lifecycle.ts
|
|
53536
|
-
var
|
|
53562
|
+
var logger53 = createLogger({ component: "StdinLifecycleMonitor" });
|
|
53537
53563
|
var StdinLifecycleMonitor = class {
|
|
53538
53564
|
callbacks = /* @__PURE__ */ new Set();
|
|
53539
53565
|
started = false;
|
|
@@ -53558,7 +53584,7 @@ var StdinLifecycleMonitor = class {
|
|
|
53558
53584
|
try {
|
|
53559
53585
|
await cb();
|
|
53560
53586
|
} catch (error) {
|
|
53561
|
-
|
|
53587
|
+
logger53.warn("Stdin shutdown callback failed", { error: String(error) });
|
|
53562
53588
|
}
|
|
53563
53589
|
}
|
|
53564
53590
|
}
|
|
@@ -53572,7 +53598,7 @@ function getStdinLifecycleMonitor() {
|
|
|
53572
53598
|
// src/pipeline/task-tracker.ts
|
|
53573
53599
|
import * as fs18 from "fs";
|
|
53574
53600
|
import * as path19 from "path";
|
|
53575
|
-
var
|
|
53601
|
+
var logger54 = createLogger({ component: "task-tracker" });
|
|
53576
53602
|
async function exec4(cmd, args, timeout = 15e3) {
|
|
53577
53603
|
const { execFile: execFile6 } = await import("child_process");
|
|
53578
53604
|
const { promisify: promisify9 } = await import("util");
|
|
@@ -53598,7 +53624,7 @@ var GitHubTaskTracker = class {
|
|
|
53598
53624
|
const result = await provider.createIssue(title, body, this.config.labels);
|
|
53599
53625
|
if (!result.ok) throw new Error("Failed to create issue");
|
|
53600
53626
|
const id = String(result.value.number);
|
|
53601
|
-
|
|
53627
|
+
logger54.info("Created GitHub issue via SCM provider", { id });
|
|
53602
53628
|
return { id, title, status: "open", url: result.value.url };
|
|
53603
53629
|
}
|
|
53604
53630
|
async updateStatus(taskId, status) {
|
|
@@ -53626,7 +53652,7 @@ var GitLabTaskTracker = class {
|
|
|
53626
53652
|
);
|
|
53627
53653
|
const match = /\/(\d+)$/.exec(url);
|
|
53628
53654
|
const id = match?.[1] ?? url;
|
|
53629
|
-
|
|
53655
|
+
logger54.info("Created GitLab issue", { id, url });
|
|
53630
53656
|
return { id, title, status: "open", url };
|
|
53631
53657
|
}
|
|
53632
53658
|
async updateStatus(taskId, status) {
|
|
@@ -54332,6 +54358,8 @@ export {
|
|
|
54332
54358
|
AgentRunnerError,
|
|
54333
54359
|
runAgentOnInstance,
|
|
54334
54360
|
createMockExecutor,
|
|
54361
|
+
translateEvaluationResult,
|
|
54362
|
+
HarnessVerifyAdapter,
|
|
54335
54363
|
NexusAgentExecutor,
|
|
54336
54364
|
createNexusExecutorFromEnv,
|
|
54337
54365
|
CliAgentExecutor,
|
|
@@ -54427,4 +54455,4 @@ export {
|
|
|
54427
54455
|
detectBackend,
|
|
54428
54456
|
createTaskTracker
|
|
54429
54457
|
};
|
|
54430
|
-
//# sourceMappingURL=chunk-
|
|
54458
|
+
//# sourceMappingURL=chunk-B6AFGOS5.js.map
|