nexus-agents 2.88.1 → 2.89.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-OBWRC4SA.js → chunk-46AUVU6N.js} +2 -2
- package/dist/{chunk-VTVZRR5E.js → chunk-SCT26VWJ.js} +3 -3
- package/dist/{chunk-K5KMPKKG.js → chunk-WOGMMJUI.js} +877 -695
- package/dist/chunk-WOGMMJUI.js.map +1 -0
- package/dist/cli.js +3 -3
- package/dist/index.js +2 -2
- package/dist/{setup-command-UEOJEGTC.js → setup-command-UMBPSFIJ.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-K5KMPKKG.js.map +0 -1
- /package/dist/{chunk-OBWRC4SA.js.map → chunk-46AUVU6N.js.map} +0 -0
- /package/dist/{chunk-VTVZRR5E.js.map → chunk-SCT26VWJ.js.map} +0 -0
- /package/dist/{setup-command-UEOJEGTC.js.map → setup-command-UMBPSFIJ.js.map} +0 -0
|
@@ -82,7 +82,7 @@ import {
|
|
|
82
82
|
DEFAULT_TASK_TTL_MS,
|
|
83
83
|
DEFAULT_TOOL_RATE_LIMITS,
|
|
84
84
|
clampTaskTtl
|
|
85
|
-
} from "./chunk-
|
|
85
|
+
} from "./chunk-SCT26VWJ.js";
|
|
86
86
|
import {
|
|
87
87
|
getAvailabilityCache,
|
|
88
88
|
resolveFallback
|
|
@@ -1116,12 +1116,12 @@ function removeItemsDirectly(items, targetTokens, manager) {
|
|
|
1116
1116
|
};
|
|
1117
1117
|
}
|
|
1118
1118
|
async function summarizeAndRemoveItems(options) {
|
|
1119
|
-
const { items, targetTokens, manager, adapter, logger:
|
|
1119
|
+
const { items, targetTokens, manager, adapter, logger: logger55, customPrompt } = options;
|
|
1120
1120
|
const content = items.map((item) => item.content).join("\n\n---\n\n");
|
|
1121
1121
|
const prompt = customPrompt ?? SLIDING_WINDOW_PROMPT;
|
|
1122
1122
|
const summaryResult = await generateSummary(content, prompt, adapter);
|
|
1123
1123
|
if (!summaryResult.ok) {
|
|
1124
|
-
|
|
1124
|
+
logger55.warn("Summarization failed, removing items without summary");
|
|
1125
1125
|
return removeItemsDirectly(items, targetTokens, manager);
|
|
1126
1126
|
}
|
|
1127
1127
|
let tokensFreed = 0;
|
|
@@ -1134,7 +1134,7 @@ async function summarizeAndRemoveItems(options) {
|
|
|
1134
1134
|
if (summaryAddResult.item !== void 0) {
|
|
1135
1135
|
tokensFreed -= summaryAddResult.tokenCount;
|
|
1136
1136
|
}
|
|
1137
|
-
|
|
1137
|
+
logger55.info("Summarization pruning completed", {
|
|
1138
1138
|
summarizedItems: items.length,
|
|
1139
1139
|
tokensFreed,
|
|
1140
1140
|
targetReached: tokensFreed >= targetTokens
|
|
@@ -1192,7 +1192,7 @@ function scoreByPriorityWeightedAge(candidates) {
|
|
|
1192
1192
|
return scores.map((s) => s.item);
|
|
1193
1193
|
}
|
|
1194
1194
|
function removeItemsToTarget(options) {
|
|
1195
|
-
const { sortedItems, targetTokens, categories, manager, minItemsPerCategory, logger:
|
|
1195
|
+
const { sortedItems, targetTokens, categories, manager, minItemsPerCategory, logger: logger55 } = options;
|
|
1196
1196
|
const categoryRemaining = /* @__PURE__ */ new Map();
|
|
1197
1197
|
for (const category of categories) {
|
|
1198
1198
|
categoryRemaining.set(category, manager.getByCategory(category).length);
|
|
@@ -1209,7 +1209,7 @@ function removeItemsToTarget(options) {
|
|
|
1209
1209
|
categoryRemaining.set(item.category, remaining - 1);
|
|
1210
1210
|
}
|
|
1211
1211
|
const targetReached = tokensFreed >= targetTokens;
|
|
1212
|
-
|
|
1212
|
+
logger55.info("Pruning completed", {
|
|
1213
1213
|
itemsRemoved: removedItems.length,
|
|
1214
1214
|
tokensFreed,
|
|
1215
1215
|
targetTokens,
|
|
@@ -1672,7 +1672,7 @@ function generateBudgetWarning(utilizationPercent, tokensUsed, budgetLimit, scop
|
|
|
1672
1672
|
scope
|
|
1673
1673
|
};
|
|
1674
1674
|
}
|
|
1675
|
-
function logBudgetWarning(warning,
|
|
1675
|
+
function logBudgetWarning(warning, logger55) {
|
|
1676
1676
|
const context = {
|
|
1677
1677
|
scope: warning.scope,
|
|
1678
1678
|
usagePercent: Math.round(warning.usagePercent),
|
|
@@ -1681,13 +1681,13 @@ function logBudgetWarning(warning, logger54) {
|
|
|
1681
1681
|
};
|
|
1682
1682
|
switch (warning.level) {
|
|
1683
1683
|
case "critical":
|
|
1684
|
-
|
|
1684
|
+
logger55.warn(warning.message, context);
|
|
1685
1685
|
break;
|
|
1686
1686
|
case "warning":
|
|
1687
|
-
|
|
1687
|
+
logger55.warn(warning.message, context);
|
|
1688
1688
|
break;
|
|
1689
1689
|
case "info":
|
|
1690
|
-
|
|
1690
|
+
logger55.info(warning.message, context);
|
|
1691
1691
|
break;
|
|
1692
1692
|
}
|
|
1693
1693
|
}
|
|
@@ -1743,8 +1743,8 @@ function createHardModeResult(params) {
|
|
|
1743
1743
|
)
|
|
1744
1744
|
};
|
|
1745
1745
|
}
|
|
1746
|
-
function logWarnModeExceeded(params,
|
|
1747
|
-
|
|
1746
|
+
function logWarnModeExceeded(params, logger55) {
|
|
1747
|
+
logger55.warn("Token budget would be exceeded (warn mode - continuing)", {
|
|
1748
1748
|
exceedsSession: params.exceedsSession,
|
|
1749
1749
|
exceedsTask: params.exceedsTask,
|
|
1750
1750
|
estimatedTokens: params.estimatedTokens,
|
|
@@ -1773,9 +1773,9 @@ var TokenBudgetTracker = class {
|
|
|
1773
1773
|
* @param config - Token budget configuration
|
|
1774
1774
|
* @param logger - Optional logger instance
|
|
1775
1775
|
*/
|
|
1776
|
-
constructor(config = {},
|
|
1776
|
+
constructor(config = {}, logger55) {
|
|
1777
1777
|
this.config = { ...DEFAULT_TOKEN_BUDGET_CONFIG, ...config };
|
|
1778
|
-
this.logger =
|
|
1778
|
+
this.logger = logger55 ?? createLogger({ component: "token-budget-tracker" });
|
|
1779
1779
|
}
|
|
1780
1780
|
/**
|
|
1781
1781
|
* Check if an operation is within budget.
|
|
@@ -1928,7 +1928,7 @@ var TokenBudgetTracker = class {
|
|
|
1928
1928
|
|
|
1929
1929
|
// src/agents/base-agent-state-helpers.ts
|
|
1930
1930
|
function transitionToState(params) {
|
|
1931
|
-
const { stateMachine, logger:
|
|
1931
|
+
const { stateMachine, logger: logger55, newState } = params;
|
|
1932
1932
|
const currentState = stateMachine.state;
|
|
1933
1933
|
if (newState === "error") {
|
|
1934
1934
|
stateMachine.forceError({ reason: "transitionToState called with error" });
|
|
@@ -1938,7 +1938,7 @@ function transitionToState(params) {
|
|
|
1938
1938
|
if (event !== void 0 && stateMachine.canTransition(event)) {
|
|
1939
1939
|
const result = stateMachine.transition(event);
|
|
1940
1940
|
if (!result.ok) {
|
|
1941
|
-
|
|
1941
|
+
logger55.warn("State transition failed", {
|
|
1942
1942
|
from: currentState,
|
|
1943
1943
|
to: newState,
|
|
1944
1944
|
event,
|
|
@@ -1946,7 +1946,7 @@ function transitionToState(params) {
|
|
|
1946
1946
|
});
|
|
1947
1947
|
}
|
|
1948
1948
|
} else if (currentState !== newState) {
|
|
1949
|
-
|
|
1949
|
+
logger55.debug("Unmapped state change", { from: currentState, to: newState });
|
|
1950
1950
|
}
|
|
1951
1951
|
}
|
|
1952
1952
|
|
|
@@ -2102,7 +2102,7 @@ function getAgentStateKey(agentId) {
|
|
|
2102
2102
|
}
|
|
2103
2103
|
|
|
2104
2104
|
// src/agents/memory-operations.ts
|
|
2105
|
-
async function persistMemoryState(backend, state,
|
|
2105
|
+
async function persistMemoryState(backend, state, logger55) {
|
|
2106
2106
|
const key = getAgentStateKey(state.agentId);
|
|
2107
2107
|
const metadata = {
|
|
2108
2108
|
importance: MemoryImportance.HIGH,
|
|
@@ -2114,12 +2114,12 @@ async function persistMemoryState(backend, state, logger54) {
|
|
|
2114
2114
|
};
|
|
2115
2115
|
const result = await backend.store(key, updatedState, metadata);
|
|
2116
2116
|
if (!result.ok) {
|
|
2117
|
-
|
|
2117
|
+
logger55.error("Failed to persist agent memory state", result.error, { agentId: state.agentId });
|
|
2118
2118
|
return err(
|
|
2119
2119
|
new AgentMemoryError("Failed to persist memory state", { error: result.error.message })
|
|
2120
2120
|
);
|
|
2121
2121
|
}
|
|
2122
|
-
|
|
2122
|
+
logger55.debug("Persisted agent memory state", {
|
|
2123
2123
|
agentId: state.agentId,
|
|
2124
2124
|
learningsCount: state.taskLearnings.length,
|
|
2125
2125
|
patternsCount: state.executionPatterns.length,
|
|
@@ -2127,16 +2127,16 @@ async function persistMemoryState(backend, state, logger54) {
|
|
|
2127
2127
|
});
|
|
2128
2128
|
return ok(void 0);
|
|
2129
2129
|
}
|
|
2130
|
-
async function loadMemoryState(backend, agentId, role,
|
|
2130
|
+
async function loadMemoryState(backend, agentId, role, logger55) {
|
|
2131
2131
|
const key = getAgentStateKey(agentId);
|
|
2132
2132
|
const result = await backend.retrieve(key);
|
|
2133
2133
|
if (!result.ok) {
|
|
2134
|
-
|
|
2134
|
+
logger55.debug("No existing memory state found, creating fresh state", { agentId });
|
|
2135
2135
|
return ok(createInitialMemoryState(agentId, role));
|
|
2136
2136
|
}
|
|
2137
2137
|
const loaded = result.value;
|
|
2138
2138
|
if (loaded === null || typeof loaded !== "object") {
|
|
2139
|
-
|
|
2139
|
+
logger55.warn("Invalid memory state format, creating fresh state", { agentId });
|
|
2140
2140
|
return ok(createInitialMemoryState(agentId, role));
|
|
2141
2141
|
}
|
|
2142
2142
|
const state = {
|
|
@@ -2147,7 +2147,7 @@ async function loadMemoryState(backend, agentId, role, logger54) {
|
|
|
2147
2147
|
executionPatterns: Array.isArray(loaded.executionPatterns) ? loaded.executionPatterns : [],
|
|
2148
2148
|
errorResolutions: Array.isArray(loaded.errorResolutions) ? loaded.errorResolutions : []
|
|
2149
2149
|
};
|
|
2150
|
-
|
|
2150
|
+
logger55.debug("Loaded agent memory state", {
|
|
2151
2151
|
agentId,
|
|
2152
2152
|
learningsCount: state.taskLearnings.length,
|
|
2153
2153
|
patternsCount: state.executionPatterns.length,
|
|
@@ -2155,13 +2155,13 @@ async function loadMemoryState(backend, agentId, role, logger54) {
|
|
|
2155
2155
|
});
|
|
2156
2156
|
return ok(state);
|
|
2157
2157
|
}
|
|
2158
|
-
async function loadRelevantTypedMemories(typedMemory, role, limit,
|
|
2158
|
+
async function loadRelevantTypedMemories(typedMemory, role, limit, logger55) {
|
|
2159
2159
|
const result = await typedMemory.filterByRelevance(role, limit);
|
|
2160
2160
|
if (!result.ok) {
|
|
2161
|
-
|
|
2161
|
+
logger55.warn("Failed to load relevant typed memories", { role, error: result.error.message });
|
|
2162
2162
|
return result;
|
|
2163
2163
|
}
|
|
2164
|
-
|
|
2164
|
+
logger55.debug("Loaded relevant typed memories", {
|
|
2165
2165
|
role,
|
|
2166
2166
|
count: result.value.length,
|
|
2167
2167
|
types: [...new Set(result.value.map((e) => e.type))]
|
|
@@ -2275,10 +2275,10 @@ function initializeMemoryInfrastructure(options) {
|
|
|
2275
2275
|
|
|
2276
2276
|
// src/agents/base-agent-constructor-helpers.ts
|
|
2277
2277
|
function setupStateMachine(params) {
|
|
2278
|
-
const { agentId, logger:
|
|
2278
|
+
const { agentId, logger: logger55, eventBus, options } = params;
|
|
2279
2279
|
const stateMachine = new AgentStateMachine(options);
|
|
2280
2280
|
stateMachine.onStateChange((transition) => {
|
|
2281
|
-
|
|
2281
|
+
logger55.debug("State transition", {
|
|
2282
2282
|
from: transition.from,
|
|
2283
2283
|
to: transition.to,
|
|
2284
2284
|
event: transition.event
|
|
@@ -2292,9 +2292,9 @@ function setupStateMachine(params) {
|
|
|
2292
2292
|
return stateMachine;
|
|
2293
2293
|
}
|
|
2294
2294
|
function initializeInfrastructure(params) {
|
|
2295
|
-
const { agentId, role, logger:
|
|
2295
|
+
const { agentId, role, logger: logger55, adapter, pruningConfig, memoryConfig } = params;
|
|
2296
2296
|
const pruningOpts = {
|
|
2297
|
-
logger:
|
|
2297
|
+
logger: logger55,
|
|
2298
2298
|
...pruningConfig !== void 0 ? { config: pruningConfig } : {},
|
|
2299
2299
|
...adapter !== void 0 ? { adapter } : {}
|
|
2300
2300
|
};
|
|
@@ -2302,7 +2302,7 @@ function initializeInfrastructure(params) {
|
|
|
2302
2302
|
const memoryOpts = {
|
|
2303
2303
|
agentId,
|
|
2304
2304
|
role,
|
|
2305
|
-
logger:
|
|
2305
|
+
logger: logger55,
|
|
2306
2306
|
...memoryConfig !== void 0 ? { config: memoryConfig } : {}
|
|
2307
2307
|
};
|
|
2308
2308
|
const memory = initializeMemoryInfrastructure(memoryOpts);
|
|
@@ -2534,14 +2534,14 @@ function transformTaskError(error, agentId, taskId) {
|
|
|
2534
2534
|
return new AgentError(`Task execution failed: ${message}`, opts);
|
|
2535
2535
|
}
|
|
2536
2536
|
function finalizeTaskSuccess(params) {
|
|
2537
|
-
const { task, result, startTime, stateMachine, budgetTracker, logger:
|
|
2537
|
+
const { task, result, startTime, stateMachine, budgetTracker, logger: logger55 } = params;
|
|
2538
2538
|
const durationMs = getTimeProvider().now() - startTime;
|
|
2539
2539
|
if (stateMachine.state === "thinking") {
|
|
2540
2540
|
stateMachine.transition("plan_completed", { taskId: task.id });
|
|
2541
2541
|
}
|
|
2542
2542
|
stateMachine.transition("task_completed", { taskId: task.id, durationMs });
|
|
2543
2543
|
const budgetStats = budgetTracker.endTask();
|
|
2544
|
-
|
|
2544
|
+
logger55.info("Task completed", {
|
|
2545
2545
|
taskId: task.id,
|
|
2546
2546
|
durationMs,
|
|
2547
2547
|
tokensUsed: result.metadata.tokensUsed,
|
|
@@ -2569,7 +2569,7 @@ function recordFailedTaskError(params) {
|
|
|
2569
2569
|
});
|
|
2570
2570
|
}
|
|
2571
2571
|
async function persistMemoryAfterTask(params) {
|
|
2572
|
-
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, task, startTime, logger:
|
|
2572
|
+
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, task, startTime, logger: logger55 } = params;
|
|
2573
2573
|
if (!memoryEnabled || memoryState === null) {
|
|
2574
2574
|
return memoryState;
|
|
2575
2575
|
}
|
|
@@ -2584,9 +2584,9 @@ async function persistMemoryAfterTask(params) {
|
|
|
2584
2584
|
successRate
|
|
2585
2585
|
});
|
|
2586
2586
|
if (memoryBackend !== void 0) {
|
|
2587
|
-
await persistMemoryState(memoryBackend, updatedState,
|
|
2587
|
+
await persistMemoryState(memoryBackend, updatedState, logger55);
|
|
2588
2588
|
}
|
|
2589
|
-
|
|
2589
|
+
logger55.debug("Memory persisted after task completion", {
|
|
2590
2590
|
taskId: task.id,
|
|
2591
2591
|
durationMs
|
|
2592
2592
|
});
|
|
@@ -2597,15 +2597,15 @@ function categorizeTaskType(description2) {
|
|
|
2597
2597
|
return categorizeTaskByKeywords(desc);
|
|
2598
2598
|
}
|
|
2599
2599
|
async function persistMemoryOnCleanup(params) {
|
|
2600
|
-
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, logger:
|
|
2600
|
+
const { memoryEnabled, memoryBackend, memoryState, persistenceMode, logger: logger55 } = params;
|
|
2601
2601
|
if (!memoryEnabled || memoryBackend === void 0 || memoryState === null) {
|
|
2602
2602
|
return;
|
|
2603
2603
|
}
|
|
2604
2604
|
if (persistenceMode === "none") {
|
|
2605
2605
|
return;
|
|
2606
2606
|
}
|
|
2607
|
-
await persistMemoryState(memoryBackend, memoryState,
|
|
2608
|
-
|
|
2607
|
+
await persistMemoryState(memoryBackend, memoryState, logger55);
|
|
2608
|
+
logger55.debug("Memory state persisted during cleanup");
|
|
2609
2609
|
}
|
|
2610
2610
|
|
|
2611
2611
|
// src/agents/base-agent-execute-flow.ts
|
|
@@ -2748,14 +2748,14 @@ function createInitialPruningMetrics() {
|
|
|
2748
2748
|
|
|
2749
2749
|
// src/agents/base-agent-memory-ops.ts
|
|
2750
2750
|
async function flushMemoryState(params) {
|
|
2751
|
-
const { memoryEnabled, memoryBackend, memoryState, logger:
|
|
2751
|
+
const { memoryEnabled, memoryBackend, memoryState, logger: logger55 } = params;
|
|
2752
2752
|
if (!memoryEnabled) {
|
|
2753
2753
|
return ok(void 0);
|
|
2754
2754
|
}
|
|
2755
2755
|
if (memoryBackend === void 0 || memoryState === null) {
|
|
2756
2756
|
return ok(void 0);
|
|
2757
2757
|
}
|
|
2758
|
-
return persistMemoryState(memoryBackend, memoryState,
|
|
2758
|
+
return persistMemoryState(memoryBackend, memoryState, logger55);
|
|
2759
2759
|
}
|
|
2760
2760
|
function recordLearningToState(params) {
|
|
2761
2761
|
const { memoryEnabled, memoryState, learning } = params;
|
|
@@ -4018,13 +4018,13 @@ function shouldFinalize(pattern, participants, results, votes, reviews) {
|
|
|
4018
4018
|
|
|
4019
4019
|
// src/agents/collaboration/collaboration-session-helpers.ts
|
|
4020
4020
|
var MAX_EVENT_LISTENERS = 50;
|
|
4021
|
-
function emitEventToListeners(listeners, event,
|
|
4021
|
+
function emitEventToListeners(listeners, event, logger55) {
|
|
4022
4022
|
for (const listener of listeners) {
|
|
4023
4023
|
try {
|
|
4024
4024
|
listener(event);
|
|
4025
4025
|
} catch (e) {
|
|
4026
4026
|
const errorObj = e instanceof Error ? e : new Error(String(e));
|
|
4027
|
-
|
|
4027
|
+
logger55.error("Event listener error", errorObj, { eventType: event.type });
|
|
4028
4028
|
}
|
|
4029
4029
|
}
|
|
4030
4030
|
}
|
|
@@ -7699,9 +7699,9 @@ var DEFAULT_WAVE_CONFIG = {
|
|
|
7699
7699
|
var WaveScheduler = class {
|
|
7700
7700
|
config;
|
|
7701
7701
|
logger;
|
|
7702
|
-
constructor(config = {},
|
|
7702
|
+
constructor(config = {}, logger55) {
|
|
7703
7703
|
this.config = { ...DEFAULT_WAVE_CONFIG, ...config };
|
|
7704
|
-
this.logger =
|
|
7704
|
+
this.logger = logger55 ?? createLogger({ component: "wave-scheduler" });
|
|
7705
7705
|
}
|
|
7706
7706
|
/**
|
|
7707
7707
|
* Execute tasks in waves respecting dependencies and concurrency limits.
|
|
@@ -7935,8 +7935,8 @@ function chunkByDirectory(files, basePath) {
|
|
|
7935
7935
|
items
|
|
7936
7936
|
}));
|
|
7937
7937
|
}
|
|
7938
|
-
function createWaveScheduler(config = {},
|
|
7939
|
-
return new WaveScheduler(config,
|
|
7938
|
+
function createWaveScheduler(config = {}, logger55) {
|
|
7939
|
+
return new WaveScheduler(config, logger55);
|
|
7940
7940
|
}
|
|
7941
7941
|
|
|
7942
7942
|
// src/agents/experts/expert-types.ts
|
|
@@ -12797,9 +12797,9 @@ var SkillLibrary = class {
|
|
|
12797
12797
|
config;
|
|
12798
12798
|
logger;
|
|
12799
12799
|
store;
|
|
12800
|
-
constructor(config = {},
|
|
12800
|
+
constructor(config = {}, logger55) {
|
|
12801
12801
|
this.config = { ...DEFAULT_SKILL_LIBRARY_CONFIG, ...config };
|
|
12802
|
-
this.logger =
|
|
12802
|
+
this.logger = logger55 ?? createLogger({ component: "SkillLibrary" });
|
|
12803
12803
|
this.store = {
|
|
12804
12804
|
skills: /* @__PURE__ */ new Map(),
|
|
12805
12805
|
executions: /* @__PURE__ */ new Map(),
|
|
@@ -13117,8 +13117,8 @@ var SkillLibrary = class {
|
|
|
13117
13117
|
return scored.sort((a, b) => b.score - a.score).map((s) => s.skill);
|
|
13118
13118
|
}
|
|
13119
13119
|
};
|
|
13120
|
-
function createSkillLibrary(config,
|
|
13121
|
-
return new SkillLibrary(config,
|
|
13120
|
+
function createSkillLibrary(config, logger55) {
|
|
13121
|
+
return new SkillLibrary(config, logger55);
|
|
13122
13122
|
}
|
|
13123
13123
|
|
|
13124
13124
|
// src/agents/skills/skill-composer.ts
|
|
@@ -13133,10 +13133,10 @@ var SkillComposer = class {
|
|
|
13133
13133
|
config;
|
|
13134
13134
|
logger;
|
|
13135
13135
|
library;
|
|
13136
|
-
constructor(library, config = {},
|
|
13136
|
+
constructor(library, config = {}, logger55) {
|
|
13137
13137
|
this.library = library;
|
|
13138
13138
|
this.config = { ...DEFAULT_COMPOSER_CONFIG, ...config };
|
|
13139
|
-
this.logger =
|
|
13139
|
+
this.logger = logger55 ?? createLogger({ component: "SkillComposer" });
|
|
13140
13140
|
}
|
|
13141
13141
|
/**
|
|
13142
13142
|
* Creates a composition plan for a task.
|
|
@@ -13366,8 +13366,8 @@ var SkillComposer = class {
|
|
|
13366
13366
|
return errors;
|
|
13367
13367
|
}
|
|
13368
13368
|
};
|
|
13369
|
-
function createSkillComposer(library, config,
|
|
13370
|
-
return new SkillComposer(library, config,
|
|
13369
|
+
function createSkillComposer(library, config, logger55) {
|
|
13370
|
+
return new SkillComposer(library, config, logger55);
|
|
13371
13371
|
}
|
|
13372
13372
|
|
|
13373
13373
|
// src/agents/skills/skill-dependency-graph-helpers.ts
|
|
@@ -14062,10 +14062,10 @@ var SkillLoader = class {
|
|
|
14062
14062
|
library;
|
|
14063
14063
|
logger;
|
|
14064
14064
|
mappingIndex;
|
|
14065
|
-
constructor(library, config,
|
|
14065
|
+
constructor(library, config, logger55) {
|
|
14066
14066
|
this.library = library;
|
|
14067
14067
|
this.config = { ...DEFAULT_SKILL_LOADER_CONFIG, ...config };
|
|
14068
|
-
this.logger =
|
|
14068
|
+
this.logger = logger55 ?? createLogger({ component: "SkillLoader" });
|
|
14069
14069
|
this.mappingIndex = /* @__PURE__ */ new Map();
|
|
14070
14070
|
for (const mapping of this.config.mappings) {
|
|
14071
14071
|
this.mappingIndex.set(mapping.role, mapping);
|
|
@@ -14288,8 +14288,8 @@ var SkillLoader = class {
|
|
|
14288
14288
|
return ok(orderResult.value);
|
|
14289
14289
|
}
|
|
14290
14290
|
};
|
|
14291
|
-
function createSkillLoader(library, config,
|
|
14292
|
-
return new SkillLoader(library, config,
|
|
14291
|
+
function createSkillLoader(library, config, logger55) {
|
|
14292
|
+
return new SkillLoader(library, config, logger55);
|
|
14293
14293
|
}
|
|
14294
14294
|
|
|
14295
14295
|
// src/agents/skills/external-pack-loader.ts
|
|
@@ -14351,13 +14351,13 @@ function validateManifest(raw, packName, source) {
|
|
|
14351
14351
|
}
|
|
14352
14352
|
return ok(parseResult2.data);
|
|
14353
14353
|
}
|
|
14354
|
-
async function loadExternalPack(packSource,
|
|
14354
|
+
async function loadExternalPack(packSource, logger55) {
|
|
14355
14355
|
const { name, source, enabled } = packSource;
|
|
14356
14356
|
if (!enabled) {
|
|
14357
|
-
|
|
14357
|
+
logger55.debug("Skipping disabled external pack", { name, source });
|
|
14358
14358
|
return ok({ packName: name, skillCount: 0, skills: [] });
|
|
14359
14359
|
}
|
|
14360
|
-
|
|
14360
|
+
logger55.info("Loading external skill pack", { name, source });
|
|
14361
14361
|
try {
|
|
14362
14362
|
const importPath = await resolveImportPath(source);
|
|
14363
14363
|
const module = await import(importPath);
|
|
@@ -14367,7 +14367,7 @@ async function loadExternalPack(packSource, logger54) {
|
|
|
14367
14367
|
return validationResult;
|
|
14368
14368
|
}
|
|
14369
14369
|
const manifest = validationResult.value;
|
|
14370
|
-
|
|
14370
|
+
logger55.info("External pack loaded successfully", {
|
|
14371
14371
|
name: manifest.name,
|
|
14372
14372
|
version: manifest.version,
|
|
14373
14373
|
skillCount: manifest.skills.length
|
|
@@ -14388,22 +14388,22 @@ async function loadExternalPack(packSource, logger54) {
|
|
|
14388
14388
|
);
|
|
14389
14389
|
}
|
|
14390
14390
|
}
|
|
14391
|
-
async function loadAllExternalPacks(packs,
|
|
14391
|
+
async function loadAllExternalPacks(packs, logger55) {
|
|
14392
14392
|
const loaded = [];
|
|
14393
14393
|
const errors = [];
|
|
14394
14394
|
for (const pack of packs) {
|
|
14395
|
-
const result = await loadExternalPack(pack,
|
|
14395
|
+
const result = await loadExternalPack(pack, logger55);
|
|
14396
14396
|
if (result.ok) {
|
|
14397
14397
|
loaded.push(result.value);
|
|
14398
14398
|
} else {
|
|
14399
14399
|
errors.push(result.error);
|
|
14400
|
-
|
|
14400
|
+
logger55.warn("Failed to load external pack", {
|
|
14401
14401
|
name: pack.name,
|
|
14402
14402
|
error: result.error.message
|
|
14403
14403
|
});
|
|
14404
14404
|
}
|
|
14405
14405
|
}
|
|
14406
|
-
|
|
14406
|
+
logger55.info("External pack loading complete", {
|
|
14407
14407
|
loaded: loaded.length,
|
|
14408
14408
|
errors: errors.length,
|
|
14409
14409
|
totalSkills: loaded.reduce((sum, r) => sum + r.skillCount, 0)
|
|
@@ -15311,9 +15311,9 @@ var SicaVersionManager = class {
|
|
|
15311
15311
|
versions;
|
|
15312
15312
|
events;
|
|
15313
15313
|
activeVersionId;
|
|
15314
|
-
constructor(config = {},
|
|
15314
|
+
constructor(config = {}, logger55) {
|
|
15315
15315
|
this.config = { ...DEFAULT_SICA_CONFIG, ...config };
|
|
15316
|
-
this.logger =
|
|
15316
|
+
this.logger = logger55 ?? createLogger({ component: "SicaVersionManager" });
|
|
15317
15317
|
this.versions = /* @__PURE__ */ new Map();
|
|
15318
15318
|
this.events = [];
|
|
15319
15319
|
this.activeVersionId = null;
|
|
@@ -19722,9 +19722,9 @@ var TemplateRegistry = class {
|
|
|
19722
19722
|
await this.ensureInitialized();
|
|
19723
19723
|
const { templates, errors } = await loadTemplatesFromDirectory(directoryPath);
|
|
19724
19724
|
if (errors.length > 0) {
|
|
19725
|
-
const
|
|
19725
|
+
const logger55 = createLogger({ component: "TemplateRegistry" });
|
|
19726
19726
|
for (const error of errors) {
|
|
19727
|
-
|
|
19727
|
+
logger55.warn("Template loading warning", { error: error.message });
|
|
19728
19728
|
}
|
|
19729
19729
|
}
|
|
19730
19730
|
let loadedCount = 0;
|
|
@@ -19736,8 +19736,8 @@ var TemplateRegistry = class {
|
|
|
19736
19736
|
loadedCount++;
|
|
19737
19737
|
}
|
|
19738
19738
|
} catch (regError) {
|
|
19739
|
-
const
|
|
19740
|
-
|
|
19739
|
+
const logger55 = createLogger({ component: "TemplateRegistry" });
|
|
19740
|
+
logger55.warn("Template registration failed", {
|
|
19741
19741
|
template: definition.name,
|
|
19742
19742
|
error: regError instanceof Error ? regError.message : String(regError)
|
|
19743
19743
|
});
|
|
@@ -20589,11 +20589,11 @@ var BudgetCircuitError = class extends NexusError {
|
|
|
20589
20589
|
|
|
20590
20590
|
// src/workflows/budget-circuit-breaker.ts
|
|
20591
20591
|
var BudgetCircuitBreaker = class {
|
|
20592
|
-
constructor(maxTokens, config,
|
|
20592
|
+
constructor(maxTokens, config, logger55) {
|
|
20593
20593
|
this.maxTokens = maxTokens;
|
|
20594
20594
|
this.config = { ...DEFAULT_BUDGET_CIRCUIT_CONFIG, ...config };
|
|
20595
20595
|
this.lastStateChange = getTimeProvider().now();
|
|
20596
|
-
this.logger =
|
|
20596
|
+
this.logger = logger55 ?? createLogger({ component: "budget-circuit-breaker" });
|
|
20597
20597
|
}
|
|
20598
20598
|
state = "closed";
|
|
20599
20599
|
lastStateChange;
|
|
@@ -20903,10 +20903,10 @@ function createSkippedResult() {
|
|
|
20903
20903
|
circuitState: "closed"
|
|
20904
20904
|
};
|
|
20905
20905
|
}
|
|
20906
|
-
function logEnforcementResult(
|
|
20906
|
+
function logEnforcementResult(logger55, stepId, result, currentUsagePercent) {
|
|
20907
20907
|
const usagePercent = Math.round(currentUsagePercent * 100);
|
|
20908
20908
|
if (!result.allowed) {
|
|
20909
|
-
|
|
20909
|
+
logger55.warn("Budget enforcement blocked step", {
|
|
20910
20910
|
stepId,
|
|
20911
20911
|
reason: result.reason,
|
|
20912
20912
|
circuitState: result.circuitState,
|
|
@@ -20916,14 +20916,14 @@ function logEnforcementResult(logger54, stepId, result, currentUsagePercent) {
|
|
|
20916
20916
|
return;
|
|
20917
20917
|
}
|
|
20918
20918
|
if (result.warning !== void 0) {
|
|
20919
|
-
|
|
20919
|
+
logger55.warn("Budget enforcement warning", {
|
|
20920
20920
|
stepId,
|
|
20921
20921
|
warning: result.warning,
|
|
20922
20922
|
currentUsage: usagePercent
|
|
20923
20923
|
});
|
|
20924
20924
|
return;
|
|
20925
20925
|
}
|
|
20926
|
-
|
|
20926
|
+
logger55.debug("Budget enforcement passed for step", {
|
|
20927
20927
|
stepId,
|
|
20928
20928
|
currentUsage: usagePercent,
|
|
20929
20929
|
allocatedTokens: result.allocatedTokens
|
|
@@ -20959,15 +20959,15 @@ function buildFinalOutput(stepResults) {
|
|
|
20959
20959
|
}
|
|
20960
20960
|
|
|
20961
20961
|
// src/workflows/workflow-engine-execution.ts
|
|
20962
|
-
function createContextManagerForWorkflow(config, workflow,
|
|
20962
|
+
function createContextManagerForWorkflow(config, workflow, logger55) {
|
|
20963
20963
|
if (config.contextManagerConfig === void 0) return void 0;
|
|
20964
20964
|
const budget = workflow.defaultBudget ?? config.defaultBudget;
|
|
20965
|
-
return new ContextManager({ ...config.contextManagerConfig, budget, logger:
|
|
20965
|
+
return new ContextManager({ ...config.contextManagerConfig, budget, logger: logger55 });
|
|
20966
20966
|
}
|
|
20967
|
-
function createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config,
|
|
20967
|
+
function createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config, logger55) {
|
|
20968
20968
|
const budgetConfig = {
|
|
20969
20969
|
engineDefaultBudget: config.defaultBudget,
|
|
20970
|
-
logger:
|
|
20970
|
+
logger: logger55
|
|
20971
20971
|
};
|
|
20972
20972
|
if (workflow.defaultBudget !== void 0) {
|
|
20973
20973
|
budgetConfig.workflowDefaultBudget = workflow.defaultBudget;
|
|
@@ -21002,12 +21002,12 @@ function applyInputDefaults(workflow, inputs) {
|
|
|
21002
21002
|
return merged;
|
|
21003
21003
|
}
|
|
21004
21004
|
function initializeExecution(params) {
|
|
21005
|
-
const { workflow, inputs, config, logger:
|
|
21005
|
+
const { workflow, inputs, config, logger: logger55 } = params;
|
|
21006
21006
|
const executionId = generateUUID();
|
|
21007
21007
|
const startTime = getTimeProvider().now();
|
|
21008
21008
|
const resolvedInputs = applyInputDefaults(workflow, inputs);
|
|
21009
|
-
const contextManager = createContextManagerForWorkflow(config, workflow,
|
|
21010
|
-
const budgetCircuitBreaker = config.enableBudgetEnforcement ? createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config,
|
|
21009
|
+
const contextManager = createContextManagerForWorkflow(config, workflow, logger55);
|
|
21010
|
+
const budgetCircuitBreaker = config.enableBudgetEnforcement ? createBudgetCircuitBreakerForWorkflow(contextManager, workflow, config, logger55) : void 0;
|
|
21011
21011
|
const context = {
|
|
21012
21012
|
workflowId: workflow.name,
|
|
21013
21013
|
executionId,
|
|
@@ -21027,7 +21027,7 @@ function initializeExecution(params) {
|
|
|
21027
21027
|
startTime
|
|
21028
21028
|
};
|
|
21029
21029
|
if (contextManager !== void 0) {
|
|
21030
|
-
|
|
21030
|
+
logger55.debug("Context manager initialized for workflow execution", {
|
|
21031
21031
|
executionId,
|
|
21032
21032
|
workflowName: workflow.name,
|
|
21033
21033
|
budget: workflow.defaultBudget ?? config.defaultBudget
|
|
@@ -21036,10 +21036,10 @@ function initializeExecution(params) {
|
|
|
21036
21036
|
return { executionId, context, startTime, execution };
|
|
21037
21037
|
}
|
|
21038
21038
|
function enforceStepBudgets(options) {
|
|
21039
|
-
const { steps, context, workflow, totalSteps, config, logger:
|
|
21039
|
+
const { steps, context, workflow, totalSteps, config, logger: logger55 } = options;
|
|
21040
21040
|
const budgetConfig = {
|
|
21041
21041
|
engineDefaultBudget: config.defaultBudget,
|
|
21042
|
-
logger:
|
|
21042
|
+
logger: logger55
|
|
21043
21043
|
};
|
|
21044
21044
|
if (workflow.defaultBudget !== void 0) {
|
|
21045
21045
|
budgetConfig.workflowDefaultBudget = workflow.defaultBudget;
|
|
@@ -21339,29 +21339,29 @@ function createExpertFactoryWithAdapter(adapter) {
|
|
|
21339
21339
|
};
|
|
21340
21340
|
return new ExpertFactoryAdapter(factoryWrapper);
|
|
21341
21341
|
}
|
|
21342
|
-
function adaptLoggerForStepExecutor(
|
|
21342
|
+
function adaptLoggerForStepExecutor(logger55) {
|
|
21343
21343
|
return {
|
|
21344
21344
|
debug: (message, data) => {
|
|
21345
|
-
|
|
21345
|
+
logger55.debug(message, data);
|
|
21346
21346
|
},
|
|
21347
21347
|
info: (message, data) => {
|
|
21348
|
-
|
|
21348
|
+
logger55.info(message, data);
|
|
21349
21349
|
},
|
|
21350
21350
|
warn: (message, data) => {
|
|
21351
|
-
|
|
21351
|
+
logger55.warn(message, data);
|
|
21352
21352
|
},
|
|
21353
21353
|
error: (message, data) => {
|
|
21354
21354
|
if (data !== void 0) {
|
|
21355
21355
|
const errorContext = { ...data };
|
|
21356
|
-
|
|
21356
|
+
logger55.error(message, void 0, errorContext);
|
|
21357
21357
|
} else {
|
|
21358
|
-
|
|
21358
|
+
logger55.error(message);
|
|
21359
21359
|
}
|
|
21360
21360
|
}
|
|
21361
21361
|
};
|
|
21362
21362
|
}
|
|
21363
|
-
function createRealStepExecutorCallback(expertFactory,
|
|
21364
|
-
const adaptedLogger = adaptLoggerForStepExecutor(
|
|
21363
|
+
function createRealStepExecutorCallback(expertFactory, logger55, workflowId) {
|
|
21364
|
+
const adaptedLogger = adaptLoggerForStepExecutor(logger55);
|
|
21365
21365
|
const executor = createStepExecutor({ expertFactory, logger: adaptedLogger });
|
|
21366
21366
|
return async (step, ctx) => {
|
|
21367
21367
|
const startTime = getTimeProvider().now();
|
|
@@ -21377,7 +21377,7 @@ function createRealStepExecutorCallback(expertFactory, logger54, workflowId) {
|
|
|
21377
21377
|
}
|
|
21378
21378
|
const result = await executor.execute(step, workflowCtx);
|
|
21379
21379
|
if (!result.ok) {
|
|
21380
|
-
|
|
21380
|
+
logger55.warn("Step execution failed", {
|
|
21381
21381
|
stepId: step.id,
|
|
21382
21382
|
error: result.error.message
|
|
21383
21383
|
});
|
|
@@ -21437,10 +21437,10 @@ function adaptExecutionPlan(plannerPlan) {
|
|
|
21437
21437
|
}));
|
|
21438
21438
|
return { phases };
|
|
21439
21439
|
}
|
|
21440
|
-
function createMockStepExecutor(
|
|
21440
|
+
function createMockStepExecutor(logger55) {
|
|
21441
21441
|
return (step, _ctx) => {
|
|
21442
21442
|
const startTime = getTimeProvider().now();
|
|
21443
|
-
|
|
21443
|
+
logger55.debug("Executing step (mock)", {
|
|
21444
21444
|
stepId: step.id,
|
|
21445
21445
|
agent: step.agent,
|
|
21446
21446
|
action: step.action
|
|
@@ -21449,16 +21449,16 @@ function createMockStepExecutor(logger54) {
|
|
|
21449
21449
|
};
|
|
21450
21450
|
}
|
|
21451
21451
|
function resolveStepExecutor(options) {
|
|
21452
|
-
const { logger:
|
|
21452
|
+
const { logger: logger55, expertFactory, workflowId, useMockExecutor } = options;
|
|
21453
21453
|
if (useMockExecutor === true) {
|
|
21454
|
-
|
|
21454
|
+
logger55.warn(
|
|
21455
21455
|
"useMockExecutor enabled; workflow steps will return mock results (NOT RECOMMENDED)"
|
|
21456
21456
|
);
|
|
21457
|
-
return createMockStepExecutor(
|
|
21457
|
+
return createMockStepExecutor(logger55);
|
|
21458
21458
|
}
|
|
21459
21459
|
if (expertFactory !== void 0 && workflowId !== void 0) {
|
|
21460
|
-
|
|
21461
|
-
return createRealStepExecutorCallback(expertFactory,
|
|
21460
|
+
logger55.info("Using real StepExecutor with ExpertFactory", { workflowId });
|
|
21461
|
+
return createRealStepExecutorCallback(expertFactory, logger55, workflowId);
|
|
21462
21462
|
}
|
|
21463
21463
|
if (expertFactory !== void 0 && workflowId === void 0) {
|
|
21464
21464
|
throw new WorkflowExecutionUnavailableError("expertFactory provided but workflowId missing");
|
|
@@ -21469,9 +21469,9 @@ function resolveStepExecutor(options) {
|
|
|
21469
21469
|
}
|
|
21470
21470
|
function createExecutePhase(options) {
|
|
21471
21471
|
const stepExecutor = resolveStepExecutor(options);
|
|
21472
|
-
const { logger:
|
|
21472
|
+
const { logger: logger55 } = options;
|
|
21473
21473
|
return async (steps, context, executionOptions) => {
|
|
21474
|
-
|
|
21474
|
+
logger55.debug("Executing phase", {
|
|
21475
21475
|
stepCount: steps.length,
|
|
21476
21476
|
executionId: context.executionId,
|
|
21477
21477
|
maxConcurrency: executionOptions.maxConcurrency
|
|
@@ -21522,26 +21522,26 @@ function createAdaptedExecutionPlan() {
|
|
|
21522
21522
|
return ok(adaptExecutionPlan(planResult.value));
|
|
21523
21523
|
};
|
|
21524
21524
|
}
|
|
21525
|
-
function resolveExpertFactory(config,
|
|
21525
|
+
function resolveExpertFactory(config, logger55) {
|
|
21526
21526
|
if (config?.expertFactory !== void 0) {
|
|
21527
21527
|
return config.expertFactory;
|
|
21528
21528
|
}
|
|
21529
21529
|
if (config?.modelAdapter !== void 0) {
|
|
21530
|
-
|
|
21530
|
+
logger55.info("Created ExpertFactory with provided model adapter");
|
|
21531
21531
|
return createExpertFactoryWithAdapter(config.modelAdapter);
|
|
21532
21532
|
}
|
|
21533
21533
|
return void 0;
|
|
21534
21534
|
}
|
|
21535
21535
|
function createWorkflowEngineDeps(config) {
|
|
21536
|
-
const
|
|
21536
|
+
const logger55 = config?.logger ?? createLogger({ component: "WorkflowEngine" });
|
|
21537
21537
|
const builtInTemplates = config?.builtInTemplates ?? cachedBuiltInTemplates ?? /* @__PURE__ */ new Map();
|
|
21538
|
-
const expertFactory = resolveExpertFactory(config,
|
|
21538
|
+
const expertFactory = resolveExpertFactory(config, logger55);
|
|
21539
21539
|
return {
|
|
21540
21540
|
parseWorkflow: createParseWorkflow(),
|
|
21541
21541
|
loadWorkflowFile: createLoadWorkflowFile(),
|
|
21542
21542
|
createExecutionPlan: createAdaptedExecutionPlan(),
|
|
21543
21543
|
executePhase: createExecutePhase({
|
|
21544
|
-
logger:
|
|
21544
|
+
logger: logger55,
|
|
21545
21545
|
expertFactory,
|
|
21546
21546
|
workflowId: "default",
|
|
21547
21547
|
useMockExecutor: config?.useMockExecutor
|
|
@@ -21572,32 +21572,32 @@ async function createInitializedWorkflowEngine(config) {
|
|
|
21572
21572
|
function shouldSkipAdapterDetection(config) {
|
|
21573
21573
|
return config?.modelAdapter !== void 0 || config?.expertFactory !== void 0 || config?.useMockExecutor === true;
|
|
21574
21574
|
}
|
|
21575
|
-
function tryAutoDetectAdapter(
|
|
21575
|
+
function tryAutoDetectAdapter(logger55) {
|
|
21576
21576
|
try {
|
|
21577
|
-
|
|
21578
|
-
const registry = getGlobalRegistry({ logger:
|
|
21577
|
+
logger55.info("Auto-detecting model adapter for workflow execution");
|
|
21578
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
21579
21579
|
const adapter = registry.getDefault();
|
|
21580
|
-
|
|
21580
|
+
logger55.info("Using unified registry default adapter");
|
|
21581
21581
|
return adapter;
|
|
21582
21582
|
} catch (error) {
|
|
21583
21583
|
const message = getErrorMessage(error);
|
|
21584
|
-
|
|
21584
|
+
logger55.warn("No model adapter available, using mock executor", { error: message });
|
|
21585
21585
|
return void 0;
|
|
21586
21586
|
}
|
|
21587
21587
|
}
|
|
21588
21588
|
function createWorkflowEngineDepsAsync(config) {
|
|
21589
|
-
const
|
|
21589
|
+
const logger55 = config?.logger ?? createLogger({ component: "WorkflowEngine" });
|
|
21590
21590
|
if (shouldSkipAdapterDetection(config)) {
|
|
21591
|
-
|
|
21591
|
+
logger55.debug("Skipping adapter detection - using provided config");
|
|
21592
21592
|
return Promise.resolve(createWorkflowEngineDeps(config));
|
|
21593
21593
|
}
|
|
21594
|
-
const adapter = tryAutoDetectAdapter(
|
|
21594
|
+
const adapter = tryAutoDetectAdapter(logger55);
|
|
21595
21595
|
if (adapter !== void 0) {
|
|
21596
|
-
return Promise.resolve(createWorkflowEngineDeps({ ...config, modelAdapter: adapter, logger:
|
|
21596
|
+
return Promise.resolve(createWorkflowEngineDeps({ ...config, modelAdapter: adapter, logger: logger55 }));
|
|
21597
21597
|
}
|
|
21598
21598
|
if (config?.useMockExecutor === true) {
|
|
21599
|
-
|
|
21600
|
-
return Promise.resolve(createWorkflowEngineDeps({ ...config, useMockExecutor: true, logger:
|
|
21599
|
+
logger55.warn("Using mock executor as explicitly configured (no real adapter available)");
|
|
21600
|
+
return Promise.resolve(createWorkflowEngineDeps({ ...config, useMockExecutor: true, logger: logger55 }));
|
|
21601
21601
|
}
|
|
21602
21602
|
return Promise.reject(
|
|
21603
21603
|
new WorkflowExecutionUnavailableError(
|
|
@@ -21679,23 +21679,23 @@ function createToolLogger(parentLogger, toolName, requestId) {
|
|
|
21679
21679
|
}
|
|
21680
21680
|
return parentLogger.child(context);
|
|
21681
21681
|
}
|
|
21682
|
-
function logToolStart(
|
|
21683
|
-
|
|
21682
|
+
function logToolStart(logger55, toolName, args) {
|
|
21683
|
+
logger55.info("Tool execution started", {
|
|
21684
21684
|
tool: toolName,
|
|
21685
21685
|
hasArgs: args !== void 0,
|
|
21686
21686
|
argKeys: args !== void 0 ? Object.keys(args) : []
|
|
21687
21687
|
});
|
|
21688
21688
|
}
|
|
21689
|
-
function logToolSuccess(
|
|
21690
|
-
|
|
21689
|
+
function logToolSuccess(logger55, toolName, durationMs, resultInfo) {
|
|
21690
|
+
logger55.info("Tool execution completed", {
|
|
21691
21691
|
tool: toolName,
|
|
21692
21692
|
durationMs,
|
|
21693
21693
|
success: true,
|
|
21694
21694
|
...resultInfo
|
|
21695
21695
|
});
|
|
21696
21696
|
}
|
|
21697
|
-
function logToolError(
|
|
21698
|
-
|
|
21697
|
+
function logToolError(logger55, toolName, error, durationMs) {
|
|
21698
|
+
logger55.error("Tool execution failed", error, {
|
|
21699
21699
|
tool: toolName,
|
|
21700
21700
|
durationMs,
|
|
21701
21701
|
success: false,
|
|
@@ -21708,8 +21708,8 @@ function createTimer() {
|
|
|
21708
21708
|
elapsed: () => getTimeProvider().now() - startTime
|
|
21709
21709
|
};
|
|
21710
21710
|
}
|
|
21711
|
-
function withLogging(toolName, handler3,
|
|
21712
|
-
const toolLogger = createToolLogger(
|
|
21711
|
+
function withLogging(toolName, handler3, logger55) {
|
|
21712
|
+
const toolLogger = createToolLogger(logger55, toolName);
|
|
21713
21713
|
return async (args) => {
|
|
21714
21714
|
const timer = createTimer();
|
|
21715
21715
|
logToolStart(toolLogger, toolName, args);
|
|
@@ -21794,9 +21794,9 @@ var AuthHandler = class {
|
|
|
21794
21794
|
config;
|
|
21795
21795
|
logger;
|
|
21796
21796
|
storedToken;
|
|
21797
|
-
constructor(config,
|
|
21797
|
+
constructor(config, logger55) {
|
|
21798
21798
|
this.config = resolveAuthConfig(config);
|
|
21799
|
-
this.logger =
|
|
21799
|
+
this.logger = logger55 ?? createLogger({ component: "AuthHandler" });
|
|
21800
21800
|
if (this.config.enabled) this.loadToken();
|
|
21801
21801
|
}
|
|
21802
21802
|
/**
|
|
@@ -21895,19 +21895,19 @@ var AuthHandler = class {
|
|
|
21895
21895
|
};
|
|
21896
21896
|
|
|
21897
21897
|
// src/mcp/middleware/tool-error-handler.ts
|
|
21898
|
-
function toolErrorResponse(prefix, error,
|
|
21898
|
+
function toolErrorResponse(prefix, error, logger55) {
|
|
21899
21899
|
const message = getErrorMessage(error);
|
|
21900
|
-
if (
|
|
21900
|
+
if (logger55 !== void 0) {
|
|
21901
21901
|
const errorObj = error instanceof Error ? error : new Error(message);
|
|
21902
|
-
|
|
21902
|
+
logger55.error(prefix, errorObj);
|
|
21903
21903
|
}
|
|
21904
21904
|
return toolStructuredError({ errorCategory: "internal", message: `${prefix}: ${message}` });
|
|
21905
21905
|
}
|
|
21906
|
-
async function withToolError(prefix,
|
|
21906
|
+
async function withToolError(prefix, logger55, fn) {
|
|
21907
21907
|
try {
|
|
21908
21908
|
return await fn();
|
|
21909
21909
|
} catch (error) {
|
|
21910
|
-
return toolErrorResponse(prefix, error,
|
|
21910
|
+
return toolErrorResponse(prefix, error, logger55);
|
|
21911
21911
|
}
|
|
21912
21912
|
}
|
|
21913
21913
|
|
|
@@ -24387,47 +24387,47 @@ function createSubscriptions(eventBus, subs, handler3) {
|
|
|
24387
24387
|
}
|
|
24388
24388
|
return subscriptions;
|
|
24389
24389
|
}
|
|
24390
|
-
function createCleanupFunction(subscriptions, eventBus,
|
|
24390
|
+
function createCleanupFunction(subscriptions, eventBus, logger55) {
|
|
24391
24391
|
return () => {
|
|
24392
|
-
|
|
24392
|
+
logger55.debug("Cleaning up EventBus bridge subscriptions");
|
|
24393
24393
|
for (const sub of subscriptions) {
|
|
24394
24394
|
sub.unsubscribe();
|
|
24395
24395
|
}
|
|
24396
|
-
|
|
24396
|
+
logger55.info("EventBus bridge cleanup complete", {
|
|
24397
24397
|
unsubscribedCount: subscriptions.length,
|
|
24398
24398
|
finalStats: eventBus.getStats()
|
|
24399
24399
|
});
|
|
24400
24400
|
};
|
|
24401
24401
|
}
|
|
24402
|
-
function initializeEventBusBridge(observer,
|
|
24402
|
+
function initializeEventBusBridge(observer, logger55, config) {
|
|
24403
24403
|
const mergedConfig = mergeConfig2(config);
|
|
24404
24404
|
if (!mergedConfig.enabled) {
|
|
24405
|
-
|
|
24405
|
+
logger55.debug("EventBus bridge disabled by configuration");
|
|
24406
24406
|
return { initialized: false, subscriptionCount: 0, cleanup: () => {
|
|
24407
24407
|
} };
|
|
24408
24408
|
}
|
|
24409
24409
|
const eventBus = getGlobalEventBus({ maxHistorySize: mergedConfig.maxHistorySize });
|
|
24410
24410
|
const logConfig = mergedConfig.logging;
|
|
24411
|
-
|
|
24411
|
+
logger55.info("Initializing EventBus bridge for MCP server", {
|
|
24412
24412
|
maxHistorySize: mergedConfig.maxHistorySize,
|
|
24413
24413
|
subscriptions: mergedConfig.subscriptions
|
|
24414
24414
|
});
|
|
24415
24415
|
const handler3 = (event) => {
|
|
24416
|
-
handleEvent(event, observer,
|
|
24416
|
+
handleEvent(event, observer, logger55, logConfig);
|
|
24417
24417
|
};
|
|
24418
24418
|
const subscriptions = createSubscriptions(eventBus, mergedConfig.subscriptions, handler3);
|
|
24419
|
-
|
|
24419
|
+
logger55.info("EventBus bridge initialized", {
|
|
24420
24420
|
subscriptionCount: subscriptions.length,
|
|
24421
24421
|
eventBusStats: eventBus.getStats()
|
|
24422
24422
|
});
|
|
24423
|
-
const cleanup = createCleanupFunction(subscriptions, eventBus,
|
|
24423
|
+
const cleanup = createCleanupFunction(subscriptions, eventBus, logger55);
|
|
24424
24424
|
return {
|
|
24425
24425
|
initialized: true,
|
|
24426
24426
|
subscriptionCount: subscriptions.length,
|
|
24427
24427
|
cleanup
|
|
24428
24428
|
};
|
|
24429
24429
|
}
|
|
24430
|
-
function handleEvent(event, observer,
|
|
24430
|
+
function handleEvent(event, observer, logger55, logConfig) {
|
|
24431
24431
|
const isImportant = IMPORTANT_TOPICS.has(event.topic);
|
|
24432
24432
|
const logLevel = isImportant ? logConfig.importantEventLevel : logConfig.frequentEventLevel;
|
|
24433
24433
|
const logContext = {
|
|
@@ -24438,9 +24438,9 @@ function handleEvent(event, observer, logger54, logConfig) {
|
|
|
24438
24438
|
timestamp: event.timestamp
|
|
24439
24439
|
};
|
|
24440
24440
|
if (logLevel === "info") {
|
|
24441
|
-
|
|
24441
|
+
logger55.info(`EventBus: ${event.topic}`, logContext);
|
|
24442
24442
|
} else {
|
|
24443
|
-
|
|
24443
|
+
logger55.debug(`EventBus: ${event.topic}`, logContext);
|
|
24444
24444
|
}
|
|
24445
24445
|
recordEventToObserver(event, observer);
|
|
24446
24446
|
}
|
|
@@ -24618,19 +24618,19 @@ var PROMPT_DEFINITIONS = [
|
|
|
24618
24618
|
];
|
|
24619
24619
|
|
|
24620
24620
|
// src/mcp/prompts/index.ts
|
|
24621
|
-
function registerPrompts(server,
|
|
24621
|
+
function registerPrompts(server, logger55) {
|
|
24622
24622
|
const registered = [];
|
|
24623
24623
|
for (const definition of PROMPT_DEFINITIONS) {
|
|
24624
|
-
registerSinglePrompt(server, definition,
|
|
24624
|
+
registerSinglePrompt(server, definition, logger55);
|
|
24625
24625
|
registered.push(definition.name);
|
|
24626
24626
|
}
|
|
24627
|
-
|
|
24627
|
+
logger55.info("Prompt templates registered", {
|
|
24628
24628
|
count: registered.length,
|
|
24629
24629
|
prompts: registered
|
|
24630
24630
|
});
|
|
24631
24631
|
return { prompts: registered };
|
|
24632
24632
|
}
|
|
24633
|
-
function registerSinglePrompt(server, definition,
|
|
24633
|
+
function registerSinglePrompt(server, definition, logger55) {
|
|
24634
24634
|
server.registerPrompt(
|
|
24635
24635
|
definition.name,
|
|
24636
24636
|
{
|
|
@@ -24638,7 +24638,7 @@ function registerSinglePrompt(server, definition, logger54) {
|
|
|
24638
24638
|
argsSchema: definition.argsSchema
|
|
24639
24639
|
},
|
|
24640
24640
|
(args) => {
|
|
24641
|
-
|
|
24641
|
+
logger55.debug("Prompt requested", { prompt: definition.name });
|
|
24642
24642
|
const messages = definition.buildMessages(args);
|
|
24643
24643
|
return {
|
|
24644
24644
|
description: definition.description,
|
|
@@ -24678,7 +24678,7 @@ function buildModelsPayload() {
|
|
|
24678
24678
|
}))
|
|
24679
24679
|
};
|
|
24680
24680
|
}
|
|
24681
|
-
function registerModelsResource(server,
|
|
24681
|
+
function registerModelsResource(server, logger55) {
|
|
24682
24682
|
server.registerResource(
|
|
24683
24683
|
MODELS_RESOURCE_NAME,
|
|
24684
24684
|
MODELS_RESOURCE_URI,
|
|
@@ -24687,7 +24687,7 @@ function registerModelsResource(server, logger54) {
|
|
|
24687
24687
|
mimeType: "application/json"
|
|
24688
24688
|
},
|
|
24689
24689
|
() => {
|
|
24690
|
-
|
|
24690
|
+
logger55.debug("Reading models resource");
|
|
24691
24691
|
const payload = buildModelsPayload();
|
|
24692
24692
|
return {
|
|
24693
24693
|
contents: [
|
|
@@ -24700,7 +24700,7 @@ function registerModelsResource(server, logger54) {
|
|
|
24700
24700
|
};
|
|
24701
24701
|
}
|
|
24702
24702
|
);
|
|
24703
|
-
|
|
24703
|
+
logger55.info("Registered models resource", { uri: MODELS_RESOURCE_URI });
|
|
24704
24704
|
}
|
|
24705
24705
|
|
|
24706
24706
|
// src/indexer/research-index/research-index-base-types.ts
|
|
@@ -25511,10 +25511,10 @@ ${topicLines}
|
|
|
25511
25511
|
// src/mcp/resources/research-resource.ts
|
|
25512
25512
|
var RESEARCH_RESOURCE_URI = "nexus://research/papers";
|
|
25513
25513
|
var RESEARCH_RESOURCE_NAME = "research-papers";
|
|
25514
|
-
function buildResearchPayload(
|
|
25514
|
+
function buildResearchPayload(logger55) {
|
|
25515
25515
|
const result = parseRegistry();
|
|
25516
25516
|
if (!result.ok) {
|
|
25517
|
-
|
|
25517
|
+
logger55.debug("Research registry not available", {
|
|
25518
25518
|
error: result.error.message
|
|
25519
25519
|
});
|
|
25520
25520
|
return {
|
|
@@ -25548,7 +25548,7 @@ function buildResearchPayload(logger54) {
|
|
|
25548
25548
|
stats: index.stats
|
|
25549
25549
|
};
|
|
25550
25550
|
}
|
|
25551
|
-
function registerResearchResource(server,
|
|
25551
|
+
function registerResearchResource(server, logger55) {
|
|
25552
25552
|
server.registerResource(
|
|
25553
25553
|
RESEARCH_RESOURCE_NAME,
|
|
25554
25554
|
RESEARCH_RESOURCE_URI,
|
|
@@ -25557,9 +25557,9 @@ function registerResearchResource(server, logger54) {
|
|
|
25557
25557
|
mimeType: "application/json"
|
|
25558
25558
|
},
|
|
25559
25559
|
() => {
|
|
25560
|
-
|
|
25560
|
+
logger55.debug("Reading research resource");
|
|
25561
25561
|
try {
|
|
25562
|
-
const payload = buildResearchPayload(
|
|
25562
|
+
const payload = buildResearchPayload(logger55);
|
|
25563
25563
|
return {
|
|
25564
25564
|
contents: [
|
|
25565
25565
|
{
|
|
@@ -25570,7 +25570,7 @@ function registerResearchResource(server, logger54) {
|
|
|
25570
25570
|
]
|
|
25571
25571
|
};
|
|
25572
25572
|
} catch (error) {
|
|
25573
|
-
|
|
25573
|
+
logger55.warn("Failed to build research payload", {
|
|
25574
25574
|
error: getErrorMessage(error)
|
|
25575
25575
|
});
|
|
25576
25576
|
return {
|
|
@@ -25585,7 +25585,7 @@ function registerResearchResource(server, logger54) {
|
|
|
25585
25585
|
}
|
|
25586
25586
|
}
|
|
25587
25587
|
);
|
|
25588
|
-
|
|
25588
|
+
logger55.info("Registered research resource", { uri: RESEARCH_RESOURCE_URI });
|
|
25589
25589
|
}
|
|
25590
25590
|
|
|
25591
25591
|
// src/mcp/tools/create-expert.ts
|
|
@@ -25686,29 +25686,29 @@ var ROLE_TO_TASK_CATEGORY = {
|
|
|
25686
25686
|
pm_expert: "planning",
|
|
25687
25687
|
ux_expert: "planning"
|
|
25688
25688
|
};
|
|
25689
|
-
function resolveAdapterForModelPreference(modelPreference, fallbackAdapter,
|
|
25690
|
-
const registry = getGlobalRegistry({ logger:
|
|
25689
|
+
function resolveAdapterForModelPreference(modelPreference, fallbackAdapter, logger55) {
|
|
25690
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
25691
25691
|
const adapter = registry.getAdapterForModel(modelPreference);
|
|
25692
25692
|
if (adapter === registry.getDefault() && fallbackAdapter !== void 0) {
|
|
25693
|
-
|
|
25693
|
+
logger55.debug("Model preference not in registry, using fallback adapter", { modelPreference });
|
|
25694
25694
|
return fallbackAdapter;
|
|
25695
25695
|
}
|
|
25696
|
-
|
|
25696
|
+
logger55.info("Routing expert to CLI for model preference", { modelPreference });
|
|
25697
25697
|
return adapter;
|
|
25698
25698
|
}
|
|
25699
|
-
function resolveAdapterForRole(role, fallbackAdapter,
|
|
25699
|
+
function resolveAdapterForRole(role, fallbackAdapter, logger55) {
|
|
25700
25700
|
const category = ROLE_TO_TASK_CATEGORY[role];
|
|
25701
25701
|
if (category === void 0) return fallbackAdapter;
|
|
25702
|
-
const registry = getGlobalRegistry({ logger:
|
|
25702
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
25703
25703
|
const adapter = registry.getAdapter(category);
|
|
25704
|
-
|
|
25704
|
+
logger55.info("Auto-routing expert to specialized CLI", {
|
|
25705
25705
|
role,
|
|
25706
25706
|
category,
|
|
25707
25707
|
preferredCli: registry.getRouting(category)?.primaryCli
|
|
25708
25708
|
});
|
|
25709
25709
|
return adapter;
|
|
25710
25710
|
}
|
|
25711
|
-
function getExpertFallbackChain(role, excludeCli,
|
|
25711
|
+
function getExpertFallbackChain(role, excludeCli, logger55) {
|
|
25712
25712
|
const category = ROLE_TO_TASK_CATEGORY[role];
|
|
25713
25713
|
if (category === void 0) return [];
|
|
25714
25714
|
const bucketType = CATEGORY_TO_FALLBACK_TYPE[category];
|
|
@@ -25717,7 +25717,7 @@ function getExpertFallbackChain(role, excludeCli, logger54) {
|
|
|
25717
25717
|
bucketType
|
|
25718
25718
|
);
|
|
25719
25719
|
const filtered = chain.filter((cli) => cli !== excludeCli);
|
|
25720
|
-
|
|
25720
|
+
logger55.debug("Expert fallback chain resolved", { role, category, excludeCli, chain: filtered });
|
|
25721
25721
|
return [...filtered];
|
|
25722
25722
|
}
|
|
25723
25723
|
|
|
@@ -25823,16 +25823,16 @@ function buildResponse(expert) {
|
|
|
25823
25823
|
};
|
|
25824
25824
|
}
|
|
25825
25825
|
function createExpertFromFactory(deps, expertType, modelPreference, role) {
|
|
25826
|
-
const
|
|
25826
|
+
const logger55 = deps.logger ?? createLogger({ tool: "create_expert" });
|
|
25827
25827
|
const options = {};
|
|
25828
25828
|
if (modelPreference !== void 0) {
|
|
25829
25829
|
options.modelOverrides = { modelId: modelPreference };
|
|
25830
25830
|
}
|
|
25831
25831
|
let adapter;
|
|
25832
25832
|
if (modelPreference !== void 0) {
|
|
25833
|
-
adapter = resolveAdapterForModelPreference(modelPreference, deps.modelAdapter,
|
|
25833
|
+
adapter = resolveAdapterForModelPreference(modelPreference, deps.modelAdapter, logger55);
|
|
25834
25834
|
} else if (role !== void 0) {
|
|
25835
|
-
adapter = resolveAdapterForRole(role, deps.modelAdapter,
|
|
25835
|
+
adapter = resolveAdapterForRole(role, deps.modelAdapter, logger55);
|
|
25836
25836
|
} else {
|
|
25837
25837
|
adapter = deps.modelAdapter;
|
|
25838
25838
|
}
|
|
@@ -25906,7 +25906,7 @@ function createCreateExpertHandler(deps) {
|
|
|
25906
25906
|
};
|
|
25907
25907
|
}
|
|
25908
25908
|
function registerCreateExpertTool(server, deps) {
|
|
25909
|
-
const
|
|
25909
|
+
const logger55 = deps.logger ?? createLogger({ tool: "create_expert" });
|
|
25910
25910
|
const toolSchema = {
|
|
25911
25911
|
role: z44.enum([
|
|
25912
25912
|
"code_expert",
|
|
@@ -25926,23 +25926,23 @@ function registerCreateExpertTool(server, deps) {
|
|
|
25926
25926
|
const secureHandler = createSecureHandler(createCreateExpertHandler(deps), {
|
|
25927
25927
|
toolName: "create_expert",
|
|
25928
25928
|
rateLimiter: deps.rateLimiter,
|
|
25929
|
-
logger:
|
|
25929
|
+
logger: logger55
|
|
25930
25930
|
});
|
|
25931
25931
|
const timeoutMs = getToolTimeout("create_expert", deps.security);
|
|
25932
|
-
const wrappedHandler = wrapToolWithTimeout("create_expert", secureHandler, { timeoutMs, logger:
|
|
25932
|
+
const wrappedHandler = wrapToolWithTimeout("create_expert", secureHandler, { timeoutMs, logger: logger55 });
|
|
25933
25933
|
server.registerTool(
|
|
25934
25934
|
"create_expert",
|
|
25935
25935
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("create_expert") },
|
|
25936
25936
|
toSdkCallback(wrappedHandler)
|
|
25937
25937
|
);
|
|
25938
|
-
|
|
25938
|
+
logger55.info("Registered create_expert tool with secure handler and timeout protection");
|
|
25939
25939
|
}
|
|
25940
|
-
function createDefaultDeps(rateLimiter,
|
|
25940
|
+
function createDefaultDeps(rateLimiter, logger55) {
|
|
25941
25941
|
return {
|
|
25942
25942
|
expertFactory: ExpertFactory,
|
|
25943
25943
|
expertRegistry: /* @__PURE__ */ new Map(),
|
|
25944
25944
|
rateLimiter,
|
|
25945
|
-
...
|
|
25945
|
+
...logger55 !== void 0 ? { logger: logger55 } : {}
|
|
25946
25946
|
};
|
|
25947
25947
|
}
|
|
25948
25948
|
function getAvailableRoles() {
|
|
@@ -25977,7 +25977,7 @@ function buildExpertsPayload() {
|
|
|
25977
25977
|
experts
|
|
25978
25978
|
};
|
|
25979
25979
|
}
|
|
25980
|
-
function registerExpertsResource(server,
|
|
25980
|
+
function registerExpertsResource(server, logger55) {
|
|
25981
25981
|
server.registerResource(
|
|
25982
25982
|
EXPERTS_RESOURCE_NAME,
|
|
25983
25983
|
EXPERTS_RESOURCE_URI,
|
|
@@ -25986,7 +25986,7 @@ function registerExpertsResource(server, logger54) {
|
|
|
25986
25986
|
mimeType: "application/json"
|
|
25987
25987
|
},
|
|
25988
25988
|
() => {
|
|
25989
|
-
|
|
25989
|
+
logger55.debug("Reading experts resource");
|
|
25990
25990
|
const payload = buildExpertsPayload();
|
|
25991
25991
|
return {
|
|
25992
25992
|
contents: [
|
|
@@ -25999,12 +25999,12 @@ function registerExpertsResource(server, logger54) {
|
|
|
25999
25999
|
};
|
|
26000
26000
|
}
|
|
26001
26001
|
);
|
|
26002
|
-
|
|
26002
|
+
logger55.info("Registered experts resource", { uri: EXPERTS_RESOURCE_URI });
|
|
26003
26003
|
}
|
|
26004
26004
|
|
|
26005
26005
|
// src/mcp/resources/index.ts
|
|
26006
|
-
function registerResources(server,
|
|
26007
|
-
const log =
|
|
26006
|
+
function registerResources(server, logger55) {
|
|
26007
|
+
const log = logger55 ?? createLogger({ component: "mcp-resources" });
|
|
26008
26008
|
log.info("Registering MCP resources");
|
|
26009
26009
|
registerModelsResource(server, log);
|
|
26010
26010
|
registerResearchResource(server, log);
|
|
@@ -26156,11 +26156,11 @@ function validateWorkflowInputs(workflow, inputs) {
|
|
|
26156
26156
|
};
|
|
26157
26157
|
}
|
|
26158
26158
|
async function loadWorkflowFromPath(deps, filePath) {
|
|
26159
|
-
const { workflowEngine, logger:
|
|
26159
|
+
const { workflowEngine, logger: logger55 } = deps;
|
|
26160
26160
|
const allowedDirs = getAllowedWorkflowDirs(deps);
|
|
26161
26161
|
const pathValidation = validateWorkflowPath(filePath, allowedDirs);
|
|
26162
26162
|
if (!pathValidation.ok) {
|
|
26163
|
-
|
|
26163
|
+
logger55?.warn("Workflow path validation failed", {
|
|
26164
26164
|
path: filePath,
|
|
26165
26165
|
error: pathValidation.error.message
|
|
26166
26166
|
});
|
|
@@ -26179,8 +26179,8 @@ async function loadWorkflowFromPath(deps, filePath) {
|
|
|
26179
26179
|
return result;
|
|
26180
26180
|
}
|
|
26181
26181
|
async function loadWorkflowFromName(deps, name) {
|
|
26182
|
-
const { workflowEngine, logger:
|
|
26183
|
-
|
|
26182
|
+
const { workflowEngine, logger: logger55 } = deps;
|
|
26183
|
+
logger55?.debug("Looking up built-in template", { name });
|
|
26184
26184
|
const templates = await workflowEngine.listTemplates();
|
|
26185
26185
|
const found = templates.find((t) => t.name === name);
|
|
26186
26186
|
if (found === void 0) {
|
|
@@ -26204,9 +26204,9 @@ async function loadWorkflowFromName(deps, name) {
|
|
|
26204
26204
|
return { ok: true, value: definition };
|
|
26205
26205
|
}
|
|
26206
26206
|
async function loadWorkflow(deps, template) {
|
|
26207
|
-
const { logger:
|
|
26207
|
+
const { logger: logger55 } = deps;
|
|
26208
26208
|
if (isFilePath(template)) {
|
|
26209
|
-
|
|
26209
|
+
logger55?.debug("Loading workflow from file", { path: template });
|
|
26210
26210
|
return loadWorkflowFromPath(deps, template);
|
|
26211
26211
|
}
|
|
26212
26212
|
return loadWorkflowFromName(deps, template);
|
|
@@ -26257,8 +26257,8 @@ function formatValidationErrors(validation) {
|
|
|
26257
26257
|
// src/mcp/tools/run-workflow.ts
|
|
26258
26258
|
import { randomUUID as randomUUID8 } from "crypto";
|
|
26259
26259
|
async function executeWorkflow(deps, workflow, inputs, options) {
|
|
26260
|
-
const { workflowEngine, logger:
|
|
26261
|
-
|
|
26260
|
+
const { workflowEngine, logger: logger55 } = deps;
|
|
26261
|
+
logger55?.info("Executing workflow", {
|
|
26262
26262
|
workflowName: workflow.name,
|
|
26263
26263
|
inputCount: Object.keys(inputs).length,
|
|
26264
26264
|
...options?.phaseTimeoutMs !== void 0 ? { phaseTimeoutMs: options.phaseTimeoutMs } : {}
|
|
@@ -26266,7 +26266,7 @@ async function executeWorkflow(deps, workflow, inputs, options) {
|
|
|
26266
26266
|
const startTime = getTimeProvider().now();
|
|
26267
26267
|
const result = options?.phaseTimeoutMs !== void 0 ? await workflowEngine.execute(workflow, inputs, { phaseTimeoutMs: options.phaseTimeoutMs }) : await workflowEngine.execute(workflow, inputs);
|
|
26268
26268
|
if (!result.ok) {
|
|
26269
|
-
|
|
26269
|
+
logger55?.error("Workflow execution failed", result.error, {
|
|
26270
26270
|
workflowName: workflow.name
|
|
26271
26271
|
});
|
|
26272
26272
|
return {
|
|
@@ -26275,7 +26275,7 @@ async function executeWorkflow(deps, workflow, inputs, options) {
|
|
|
26275
26275
|
};
|
|
26276
26276
|
}
|
|
26277
26277
|
const workflowResult = result.value;
|
|
26278
|
-
|
|
26278
|
+
logger55?.info("Workflow completed", {
|
|
26279
26279
|
workflowName: workflow.name,
|
|
26280
26280
|
durationMs: getTimeProvider().now() - startTime,
|
|
26281
26281
|
stepCount: workflowResult.stepResults.length
|
|
@@ -26481,16 +26481,16 @@ function createRunWorkflowHandler(deps) {
|
|
|
26481
26481
|
};
|
|
26482
26482
|
}
|
|
26483
26483
|
function registerRunWorkflowTool(server, deps) {
|
|
26484
|
-
const
|
|
26484
|
+
const logger55 = deps.logger ?? createLogger({ tool: "run_workflow" });
|
|
26485
26485
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
26486
26486
|
const depsWithNotifier = { ...deps, notifier };
|
|
26487
26487
|
const secureHandler = createSecureHandler(createRunWorkflowHandler(depsWithNotifier), {
|
|
26488
26488
|
toolName: "run_workflow",
|
|
26489
26489
|
rateLimiter: deps.rateLimiter,
|
|
26490
|
-
logger:
|
|
26490
|
+
logger: logger55
|
|
26491
26491
|
});
|
|
26492
26492
|
const timeoutMs = getToolTimeout("run_workflow", deps.security);
|
|
26493
|
-
const wrappedHandler = wrapToolWithTimeout("run_workflow", secureHandler, { timeoutMs, logger:
|
|
26493
|
+
const wrappedHandler = wrapToolWithTimeout("run_workflow", secureHandler, { timeoutMs, logger: logger55 });
|
|
26494
26494
|
server.registerTool(
|
|
26495
26495
|
"run_workflow",
|
|
26496
26496
|
{
|
|
@@ -26498,9 +26498,9 @@ function registerRunWorkflowTool(server, deps) {
|
|
|
26498
26498
|
inputSchema: toolInputSchema,
|
|
26499
26499
|
annotations: getToolAnnotations("run_workflow")
|
|
26500
26500
|
},
|
|
26501
|
-
toSdkCallbackWithBudgetCheck(wrappedHandler, "run_workflow", timeoutMs,
|
|
26501
|
+
toSdkCallbackWithBudgetCheck(wrappedHandler, "run_workflow", timeoutMs, logger55)
|
|
26502
26502
|
);
|
|
26503
|
-
|
|
26503
|
+
logger55.info("Registered run_workflow tool with secure handler and timeout protection");
|
|
26504
26504
|
}
|
|
26505
26505
|
|
|
26506
26506
|
// src/orchestration/graph/graph-types.ts
|
|
@@ -28818,8 +28818,8 @@ var OrchestratorAdapter = class {
|
|
|
28818
28818
|
history = [];
|
|
28819
28819
|
logger;
|
|
28820
28820
|
agent = null;
|
|
28821
|
-
constructor(
|
|
28822
|
-
this.logger =
|
|
28821
|
+
constructor(logger55) {
|
|
28822
|
+
this.logger = logger55 ?? createLogger({ component: "OrchestratorAdapter" });
|
|
28823
28823
|
}
|
|
28824
28824
|
setOrchestrator(agent) {
|
|
28825
28825
|
this.agent = agent;
|
|
@@ -28959,10 +28959,10 @@ var WorkflowOrchestratorAdapter = class {
|
|
|
28959
28959
|
logger;
|
|
28960
28960
|
executions = /* @__PURE__ */ new Map();
|
|
28961
28961
|
history = [];
|
|
28962
|
-
constructor(engine,
|
|
28962
|
+
constructor(engine, logger55) {
|
|
28963
28963
|
this.id = `workflow-${randomUUID10().slice(0, 8)}`;
|
|
28964
28964
|
this.engine = engine;
|
|
28965
|
-
this.logger =
|
|
28965
|
+
this.logger = logger55 ?? createLogger({ component: "WorkflowOrchestratorAdapter" });
|
|
28966
28966
|
}
|
|
28967
28967
|
async execute(definition, inputs, _options) {
|
|
28968
28968
|
if (definition.type !== "workflow") {
|
|
@@ -29154,22 +29154,22 @@ var OrchestratorFactory = class {
|
|
|
29154
29154
|
}
|
|
29155
29155
|
};
|
|
29156
29156
|
async function createOrchestratorFactory(config) {
|
|
29157
|
-
const
|
|
29158
|
-
|
|
29157
|
+
const logger55 = config?.logger ?? createLogger({ component: "OrchestratorFactory" });
|
|
29158
|
+
logger55.info("Initializing OrchestratorFactory");
|
|
29159
29159
|
let workflowEngine;
|
|
29160
29160
|
try {
|
|
29161
29161
|
const workflowConfig = {
|
|
29162
29162
|
...config?.workflowConfig,
|
|
29163
|
-
logger:
|
|
29163
|
+
logger: logger55
|
|
29164
29164
|
};
|
|
29165
29165
|
if (config?.modelAdapter !== void 0) {
|
|
29166
29166
|
workflowConfig.modelAdapter = config.modelAdapter;
|
|
29167
29167
|
}
|
|
29168
29168
|
workflowEngine = await createProductionWorkflowEngine(workflowConfig);
|
|
29169
|
-
|
|
29169
|
+
logger55.info("WorkflowEngine initialized");
|
|
29170
29170
|
} catch (error) {
|
|
29171
29171
|
const message = getErrorMessage(error);
|
|
29172
|
-
|
|
29172
|
+
logger55.warn("WorkflowEngine initialization failed, workflow orchestration unavailable", {
|
|
29173
29173
|
error: message
|
|
29174
29174
|
});
|
|
29175
29175
|
}
|
|
@@ -29180,12 +29180,12 @@ async function createOrchestratorFactory(config) {
|
|
|
29180
29180
|
var MAX_OUTCOMES2 = 200;
|
|
29181
29181
|
var AMBIGUITY_THRESHOLD = 0.7;
|
|
29182
29182
|
function createWorkflowRouter(options) {
|
|
29183
|
-
const
|
|
29184
|
-
const analyzer = options?.analyzer ?? createSharedTaskAnalyzer({ logger:
|
|
29183
|
+
const logger55 = options?.logger ?? createLogger({ component: "WorkflowRouter" });
|
|
29184
|
+
const analyzer = options?.analyzer ?? createSharedTaskAnalyzer({ logger: logger55 });
|
|
29185
29185
|
const outcomes = [];
|
|
29186
29186
|
return {
|
|
29187
29187
|
route(signals, routerOpts) {
|
|
29188
|
-
return routeTask(signals, analyzer,
|
|
29188
|
+
return routeTask(signals, analyzer, logger55, routerOpts);
|
|
29189
29189
|
},
|
|
29190
29190
|
recordOutcome(outcome) {
|
|
29191
29191
|
recordPatternOutcome(outcomes, outcome);
|
|
@@ -29227,7 +29227,7 @@ function buildDecision(input) {
|
|
|
29227
29227
|
}
|
|
29228
29228
|
return base;
|
|
29229
29229
|
}
|
|
29230
|
-
function routeTask(signals, analyzer,
|
|
29230
|
+
function routeTask(signals, analyzer, logger55, _opts) {
|
|
29231
29231
|
const analysis = analyzer.analyze(signals.description);
|
|
29232
29232
|
const enriched = enrichSignals(signals, analysis);
|
|
29233
29233
|
const matchedRules = [];
|
|
@@ -29237,7 +29237,7 @@ function routeTask(signals, analyzer, logger54, _opts) {
|
|
|
29237
29237
|
if (result !== void 0) {
|
|
29238
29238
|
matchedRules.push(rule.name);
|
|
29239
29239
|
collectAlternatives(alternatives, result.pattern);
|
|
29240
|
-
|
|
29240
|
+
logger55.info("Workflow pattern selected", {
|
|
29241
29241
|
pattern: result.pattern,
|
|
29242
29242
|
rule: rule.name,
|
|
29243
29243
|
confidence: result.confidence,
|
|
@@ -29247,7 +29247,7 @@ function routeTask(signals, analyzer, logger54, _opts) {
|
|
|
29247
29247
|
return buildDecision({ result, matchedRules, alternatives, analysis });
|
|
29248
29248
|
}
|
|
29249
29249
|
}
|
|
29250
|
-
|
|
29250
|
+
logger55.info("Using fallback pattern", { pattern: "graph", taskType: analysis.taskType });
|
|
29251
29251
|
const fallback = {
|
|
29252
29252
|
pattern: "graph",
|
|
29253
29253
|
reasoning: "No specific rule matched \u2014 using Graph DAG as the most general pattern",
|
|
@@ -29626,11 +29626,11 @@ function setAnalysis(snapshot, analysis) {
|
|
|
29626
29626
|
var globalSicaConfig;
|
|
29627
29627
|
var sicaEnabled = false;
|
|
29628
29628
|
function initializeSica(options) {
|
|
29629
|
-
const { sicaConfig, logger:
|
|
29629
|
+
const { sicaConfig, logger: logger55 } = options;
|
|
29630
29630
|
if (sicaConfig?.enabled !== true) {
|
|
29631
29631
|
sicaEnabled = false;
|
|
29632
29632
|
globalSicaConfig = void 0;
|
|
29633
|
-
|
|
29633
|
+
logger55.info("SICA self-improvement disabled by configuration");
|
|
29634
29634
|
return {
|
|
29635
29635
|
enabled: false,
|
|
29636
29636
|
reason: sicaConfig?.enabled === false ? "disabled in config" : "not enabled (opt-in feature)"
|
|
@@ -29638,7 +29638,7 @@ function initializeSica(options) {
|
|
|
29638
29638
|
}
|
|
29639
29639
|
sicaEnabled = true;
|
|
29640
29640
|
globalSicaConfig = sicaConfig;
|
|
29641
|
-
|
|
29641
|
+
logger55.info("SICA self-improvement enabled", {
|
|
29642
29642
|
improvementThreshold: sicaConfig.improvementThreshold,
|
|
29643
29643
|
maxActiveVersions: sicaConfig.maxActiveVersions,
|
|
29644
29644
|
cooldownMs: sicaConfig.improvementCooldownMs
|
|
@@ -29656,18 +29656,18 @@ function getSicaConfig() {
|
|
|
29656
29656
|
}
|
|
29657
29657
|
|
|
29658
29658
|
// src/mcp/tools/orchestrate-sica.ts
|
|
29659
|
-
function createOrchestratorWithSica(
|
|
29660
|
-
const orchestrator = new Orchestrator({ logger:
|
|
29659
|
+
function createOrchestratorWithSica(logger55, adapter) {
|
|
29660
|
+
const orchestrator = new Orchestrator({ logger: logger55, ...adapter !== void 0 ? { adapter } : {} });
|
|
29661
29661
|
if (!isSicaEnabled()) {
|
|
29662
|
-
|
|
29662
|
+
logger55.debug("SICA not enabled, using plain orchestrator");
|
|
29663
29663
|
return orchestrator;
|
|
29664
29664
|
}
|
|
29665
29665
|
const sicaConfig = getSicaConfig();
|
|
29666
29666
|
if (sicaConfig === void 0) {
|
|
29667
|
-
|
|
29667
|
+
logger55.debug("SICA config unavailable, using plain orchestrator");
|
|
29668
29668
|
return orchestrator;
|
|
29669
29669
|
}
|
|
29670
|
-
|
|
29670
|
+
logger55.info("Creating SICA-wrapped orchestrator", {
|
|
29671
29671
|
improvementThreshold: sicaConfig.improvementThreshold,
|
|
29672
29672
|
maxActiveVersions: sicaConfig.maxActiveVersions
|
|
29673
29673
|
});
|
|
@@ -29687,9 +29687,9 @@ function createOrchestratorWithSica(logger54, adapter) {
|
|
|
29687
29687
|
improvementCooldownMs: sicaConfig.improvementCooldownMs,
|
|
29688
29688
|
enableObservability: sicaConfig.enableObservability
|
|
29689
29689
|
},
|
|
29690
|
-
logger:
|
|
29690
|
+
logger: logger55
|
|
29691
29691
|
});
|
|
29692
|
-
return createSicaOrchestratorAdapter(sicaAgent,
|
|
29692
|
+
return createSicaOrchestratorAdapter(sicaAgent, logger55);
|
|
29693
29693
|
}
|
|
29694
29694
|
function createSicaOrchestratorAdapter(sicaAgent, _logger) {
|
|
29695
29695
|
return {
|
|
@@ -29743,7 +29743,7 @@ var PersistedCatalogSchema = z51.object({
|
|
|
29743
29743
|
function getCatalogPath() {
|
|
29744
29744
|
return nexusDataPath(CATALOG_SUBDIR, CATALOG_FILE);
|
|
29745
29745
|
}
|
|
29746
|
-
function loadPersistedCatalog(
|
|
29746
|
+
function loadPersistedCatalog(logger55) {
|
|
29747
29747
|
const filePath = getCatalogPath();
|
|
29748
29748
|
try {
|
|
29749
29749
|
if (!fs4.existsSync(filePath)) return [];
|
|
@@ -29751,21 +29751,21 @@ function loadPersistedCatalog(logger54) {
|
|
|
29751
29751
|
const parsed = JSON.parse(content);
|
|
29752
29752
|
const result = PersistedCatalogSchema.safeParse(parsed);
|
|
29753
29753
|
if (!result.success) {
|
|
29754
|
-
|
|
29754
|
+
logger55.warn("Invalid pending catalog file, starting fresh", {
|
|
29755
29755
|
errors: result.error.issues.map((i) => i.message)
|
|
29756
29756
|
});
|
|
29757
29757
|
return [];
|
|
29758
29758
|
}
|
|
29759
29759
|
return result.data.references;
|
|
29760
29760
|
} catch (error) {
|
|
29761
|
-
|
|
29761
|
+
logger55.debug("Could not load pending catalog, starting fresh", {
|
|
29762
29762
|
error: getErrorMessage(error),
|
|
29763
29763
|
filePath
|
|
29764
29764
|
});
|
|
29765
29765
|
return [];
|
|
29766
29766
|
}
|
|
29767
29767
|
}
|
|
29768
|
-
function savePersistedCatalog(references,
|
|
29768
|
+
function savePersistedCatalog(references, logger55) {
|
|
29769
29769
|
const dirPath = nexusDataPath(CATALOG_SUBDIR);
|
|
29770
29770
|
const filePath = getCatalogPath();
|
|
29771
29771
|
const tempPath = `${filePath}.tmp.${String(process.pid)}`;
|
|
@@ -29787,7 +29787,7 @@ function savePersistedCatalog(references, logger54) {
|
|
|
29787
29787
|
} catch {
|
|
29788
29788
|
}
|
|
29789
29789
|
const message = getErrorMessage(error);
|
|
29790
|
-
|
|
29790
|
+
logger55.warn("Failed to persist pending catalog", { error: message });
|
|
29791
29791
|
}
|
|
29792
29792
|
}
|
|
29793
29793
|
var ARXIV_PATTERN = /\b(\d{4}\.\d{4,5})\b/g;
|
|
@@ -29797,8 +29797,8 @@ var ResearchAutoCatalog = class _ResearchAutoCatalog {
|
|
|
29797
29797
|
pendingReferences = [];
|
|
29798
29798
|
/** Maximum pending references to hold in memory. */
|
|
29799
29799
|
static MAX_PENDING = 100;
|
|
29800
|
-
constructor(
|
|
29801
|
-
this.logger =
|
|
29800
|
+
constructor(logger55) {
|
|
29801
|
+
this.logger = logger55 ?? createLogger({ component: "research-auto-catalog" });
|
|
29802
29802
|
const persisted = loadPersistedCatalog(this.logger);
|
|
29803
29803
|
if (persisted.length > 0) {
|
|
29804
29804
|
this.pendingReferences.push(...persisted.slice(0, _ResearchAutoCatalog.MAX_PENDING));
|
|
@@ -29953,8 +29953,8 @@ var ResearchAutoCatalog = class _ResearchAutoCatalog {
|
|
|
29953
29953
|
}
|
|
29954
29954
|
};
|
|
29955
29955
|
var autoCatalogInstance;
|
|
29956
|
-
function getAutoCatalog(
|
|
29957
|
-
autoCatalogInstance ??= new ResearchAutoCatalog(
|
|
29956
|
+
function getAutoCatalog(logger55) {
|
|
29957
|
+
autoCatalogInstance ??= new ResearchAutoCatalog(logger55);
|
|
29958
29958
|
return autoCatalogInstance;
|
|
29959
29959
|
}
|
|
29960
29960
|
|
|
@@ -31761,12 +31761,12 @@ function computeExpertReliability() {
|
|
|
31761
31761
|
}
|
|
31762
31762
|
return reliability;
|
|
31763
31763
|
}
|
|
31764
|
-
function computeAgentPlan(task,
|
|
31764
|
+
function computeAgentPlan(task, logger55) {
|
|
31765
31765
|
try {
|
|
31766
31766
|
const analyzer = new SharedTaskAnalyzer();
|
|
31767
31767
|
const analysis = analyzer.analyze(task);
|
|
31768
31768
|
if (analysis.complexity === "simple") {
|
|
31769
|
-
|
|
31769
|
+
logger55.debug("Skipping AOrchestra planning for simple task", {
|
|
31770
31770
|
taskType: analysis.taskType
|
|
31771
31771
|
});
|
|
31772
31772
|
return void 0;
|
|
@@ -31778,9 +31778,9 @@ function computeAgentPlan(task, logger54) {
|
|
|
31778
31778
|
if (rate < 0.5) excludedExperts.push({ role, rate: Math.round(rate * 100) / 100 });
|
|
31779
31779
|
}
|
|
31780
31780
|
if (excludedExperts.length > 0) {
|
|
31781
|
-
|
|
31781
|
+
logger55.warn("Experts excluded by reliability filter", { excludedExperts });
|
|
31782
31782
|
}
|
|
31783
|
-
|
|
31783
|
+
logger55.info("AOrchestra plan", {
|
|
31784
31784
|
experts: plan.totalExperts,
|
|
31785
31785
|
taskType: plan.taskType,
|
|
31786
31786
|
complexity: plan.complexity,
|
|
@@ -31788,7 +31788,7 @@ function computeAgentPlan(task, logger54) {
|
|
|
31788
31788
|
});
|
|
31789
31789
|
return plan;
|
|
31790
31790
|
} catch (planError) {
|
|
31791
|
-
|
|
31791
|
+
logger55.warn("AOrchestra planning failed", {
|
|
31792
31792
|
error: getErrorMessage(planError)
|
|
31793
31793
|
});
|
|
31794
31794
|
return void 0;
|
|
@@ -31868,7 +31868,7 @@ async function executeOnAdapter(opts) {
|
|
|
31868
31868
|
}
|
|
31869
31869
|
}
|
|
31870
31870
|
function createWorkerExecutor(config) {
|
|
31871
|
-
const { taskDescription, modelAdapter, logger:
|
|
31871
|
+
const { taskDescription, modelAdapter, logger: logger55, learnings, perWorkerRouting } = config;
|
|
31872
31872
|
const effectiveFallbackCli = modelAdapter.providerId;
|
|
31873
31873
|
return async (entry, priorWaveResults, signal) => {
|
|
31874
31874
|
const workerStartMs = getTimeProvider().now();
|
|
@@ -31877,7 +31877,7 @@ function createWorkerExecutor(config) {
|
|
|
31877
31877
|
modelAdapter,
|
|
31878
31878
|
effectiveFallbackCli,
|
|
31879
31879
|
perWorkerRouting === true,
|
|
31880
|
-
|
|
31880
|
+
logger55
|
|
31881
31881
|
);
|
|
31882
31882
|
return executeOnAdapter({
|
|
31883
31883
|
entry,
|
|
@@ -32053,15 +32053,15 @@ function prepareBudgetedEntries(plan, maxCalls, log) {
|
|
|
32053
32053
|
return entries;
|
|
32054
32054
|
}
|
|
32055
32055
|
async function executeWorkerDispatch(options) {
|
|
32056
|
-
const { agentPlan, taskDescription, modelAdapter, logger:
|
|
32056
|
+
const { agentPlan, taskDescription, modelAdapter, logger: logger55, maxConcurrency } = options;
|
|
32057
32057
|
const maxCalls = resolveMaxWorkerCalls(options.maxWorkerCalls);
|
|
32058
32058
|
const startMs = getTimeProvider().now();
|
|
32059
|
-
const entries = prepareBudgetedEntries(agentPlan, maxCalls,
|
|
32059
|
+
const entries = prepareBudgetedEntries(agentPlan, maxCalls, logger55);
|
|
32060
32060
|
const qualityGate = options.qualityGate === false ? void 0 : options.qualityGate;
|
|
32061
32061
|
const executorConfig = {
|
|
32062
32062
|
taskDescription,
|
|
32063
32063
|
modelAdapter,
|
|
32064
|
-
logger:
|
|
32064
|
+
logger: logger55,
|
|
32065
32065
|
...options.learnings !== void 0 ? { learnings: options.learnings } : {},
|
|
32066
32066
|
...options.perWorkerRouting !== void 0 ? { perWorkerRouting: options.perWorkerRouting } : {}
|
|
32067
32067
|
};
|
|
@@ -32082,8 +32082,8 @@ async function executeWorkerDispatch(options) {
|
|
|
32082
32082
|
};
|
|
32083
32083
|
await runSynthesisPhase(state, options, maxCalls);
|
|
32084
32084
|
const refined = await runRefinementPhase(state, entries, options, maxCalls);
|
|
32085
|
-
const base = buildDispatchResult(state.results, startMs,
|
|
32086
|
-
logDispatchInsights(state.results,
|
|
32085
|
+
const base = buildDispatchResult(state.results, startMs, logger55, state.totalModelCalls);
|
|
32086
|
+
logDispatchInsights(state.results, logger55);
|
|
32087
32087
|
return {
|
|
32088
32088
|
...base,
|
|
32089
32089
|
...refined ? { refined: true } : {},
|
|
@@ -32141,18 +32141,18 @@ function recordWorkerOutcomes(results, taskDescription) {
|
|
|
32141
32141
|
});
|
|
32142
32142
|
}
|
|
32143
32143
|
}
|
|
32144
|
-
function buildDispatchResult(results, startMs,
|
|
32144
|
+
function buildDispatchResult(results, startMs, logger55, totalModelCalls) {
|
|
32145
32145
|
const successCount = results.filter((r) => r.status === "success").length;
|
|
32146
32146
|
const errorCount = results.filter((r) => r.status === "error").length;
|
|
32147
32147
|
const conflicts = detectConflicts(results);
|
|
32148
32148
|
if (conflicts.length > 0) {
|
|
32149
|
-
|
|
32149
|
+
logger55.warn("Worker output conflicts detected \u2014 human review recommended", {
|
|
32150
32150
|
conflictCount: conflicts.length,
|
|
32151
32151
|
files: conflicts.map((c) => c.filePath)
|
|
32152
32152
|
});
|
|
32153
32153
|
}
|
|
32154
32154
|
const durationMs = getTimeProvider().now() - startMs;
|
|
32155
|
-
|
|
32155
|
+
logger55.info("Worker dispatch complete", {
|
|
32156
32156
|
totalWorkers: results.length,
|
|
32157
32157
|
successCount,
|
|
32158
32158
|
errorCount,
|
|
@@ -32947,7 +32947,12 @@ var TaskStageSchema = z55.enum([
|
|
|
32947
32947
|
"executing",
|
|
32948
32948
|
"verifying",
|
|
32949
32949
|
"complete",
|
|
32950
|
-
"blocked"
|
|
32950
|
+
"blocked",
|
|
32951
|
+
// #3091 / epic #2631: terminal failure stage. Distinct from `blocked`
|
|
32952
|
+
// (recoverable, still in-flight) — `failed` is terminal and maps to the
|
|
32953
|
+
// job-result `failed` status. Added so async-mode writers can record a
|
|
32954
|
+
// failed run in StructuredTaskState instead of the Stage-1 sidecar.
|
|
32955
|
+
"failed"
|
|
32951
32956
|
]);
|
|
32952
32957
|
var TaskDecisionSchema = z55.object({
|
|
32953
32958
|
ts: z55.iso.datetime(),
|
|
@@ -32996,6 +33001,7 @@ var TaskCancellationSchema = z55.object({
|
|
|
32996
33001
|
/** Optional human-readable note carried back to the caller. */
|
|
32997
33002
|
reason: z55.string().max(1e3).optional()
|
|
32998
33003
|
});
|
|
33004
|
+
var TASK_RESULT_MAX_BYTES = 1048576;
|
|
32999
33005
|
var StructuredTaskStateSchema = z55.object({
|
|
33000
33006
|
taskId: z55.string().min(1),
|
|
33001
33007
|
stage: TaskStageSchema,
|
|
@@ -33048,6 +33054,15 @@ var StructuredTaskStateSchema = z55.object({
|
|
|
33048
33054
|
* second cancellation event).
|
|
33049
33055
|
*/
|
|
33050
33056
|
cancellation: TaskCancellationSchema.optional(),
|
|
33057
|
+
/**
|
|
33058
|
+
* Creation timestamp (#3090 / epic #2631). Set by the reducer to the
|
|
33059
|
+
* `init` entry's `ts` and never mutated thereafter — `updatedAt` advances
|
|
33060
|
+
* with each write, but `createdAt` is fixed. Job-result readers need the
|
|
33061
|
+
* original creation time; `updatedAt` alone can't supply it once any
|
|
33062
|
+
* transition has been recorded. Optional for backward-compat with
|
|
33063
|
+
* pre-#3090 logs (the reducer backfills it from the init entry).
|
|
33064
|
+
*/
|
|
33065
|
+
createdAt: z55.iso.datetime().optional(),
|
|
33051
33066
|
updatedAt: z55.iso.datetime()
|
|
33052
33067
|
});
|
|
33053
33068
|
var StructuredTaskLogEntrySchema = z55.discriminatedUnion("event", [
|
|
@@ -33170,6 +33185,31 @@ function appendBlocker(taskId, blocker, customDir) {
|
|
|
33170
33185
|
function updateStage(taskId, stage, ts, customDir) {
|
|
33171
33186
|
return appendLogEntry(taskId, { event: "stage", ts, stage }, customDir);
|
|
33172
33187
|
}
|
|
33188
|
+
function appendResult(taskId, result, ts, customDir) {
|
|
33189
|
+
let payload = result;
|
|
33190
|
+
let serialized;
|
|
33191
|
+
try {
|
|
33192
|
+
serialized = JSON.stringify(result ?? null);
|
|
33193
|
+
} catch (cause) {
|
|
33194
|
+
const e = cause instanceof Error ? cause : new Error(String(cause));
|
|
33195
|
+
return err(new Error(`Failed to serialize result for task ${taskId}: ${e.message}`));
|
|
33196
|
+
}
|
|
33197
|
+
const bytes = Buffer.byteLength(serialized, "utf-8");
|
|
33198
|
+
if (bytes > TASK_RESULT_MAX_BYTES) {
|
|
33199
|
+
payload = {
|
|
33200
|
+
truncated: true,
|
|
33201
|
+
originalBytes: bytes,
|
|
33202
|
+
maxBytes: TASK_RESULT_MAX_BYTES,
|
|
33203
|
+
note: "Result exceeded TASK_RESULT_MAX_BYTES \u2014 original dropped at write time."
|
|
33204
|
+
};
|
|
33205
|
+
logger30.warn("Task result truncated at write", {
|
|
33206
|
+
taskId,
|
|
33207
|
+
bytes,
|
|
33208
|
+
max: TASK_RESULT_MAX_BYTES
|
|
33209
|
+
});
|
|
33210
|
+
}
|
|
33211
|
+
return appendLogEntry(taskId, { event: "result", ts, result: payload }, customDir);
|
|
33212
|
+
}
|
|
33173
33213
|
function readTaskState(taskId, customDir) {
|
|
33174
33214
|
const idCheck = validateTaskId(taskId);
|
|
33175
33215
|
if (!idCheck.ok) return err(idCheck.error);
|
|
@@ -33220,7 +33260,11 @@ function reduceLogEntries(taskId, entries) {
|
|
|
33220
33260
|
...initState,
|
|
33221
33261
|
decisions: [...initState.decisions],
|
|
33222
33262
|
blockers: initState.blockers.map((b) => ({ ...b })),
|
|
33223
|
-
version: initState.version ?? 0
|
|
33263
|
+
version: initState.version ?? 0,
|
|
33264
|
+
// #3090: createdAt is fixed at the init entry's ts and never advances
|
|
33265
|
+
// (unlike updatedAt). Prefer an explicit createdAt on the init state,
|
|
33266
|
+
// else fall back to the init entry's ts.
|
|
33267
|
+
createdAt: initState.createdAt ?? init.ts
|
|
33224
33268
|
};
|
|
33225
33269
|
for (const entry of entries) {
|
|
33226
33270
|
if (entry === init) continue;
|
|
@@ -33319,7 +33363,6 @@ function applyLogEntry(state, entry) {
|
|
|
33319
33363
|
}
|
|
33320
33364
|
|
|
33321
33365
|
// src/mcp/tools/orchestrate.ts
|
|
33322
|
-
import { randomUUID as randomUUID11 } from "crypto";
|
|
33323
33366
|
function generateTaskId() {
|
|
33324
33367
|
const timestamp = getTimeProvider().now().toString(36);
|
|
33325
33368
|
const random = getRandomProvider().random().toString(36).substring(2, 8);
|
|
@@ -33415,10 +33458,10 @@ function buildOutputFromOrchestratorResult(taskId, orchResult, durationMs, routi
|
|
|
33415
33458
|
}
|
|
33416
33459
|
};
|
|
33417
33460
|
}
|
|
33418
|
-
function createOrchestratorFromDeps(deps,
|
|
33461
|
+
function createOrchestratorFromDeps(deps, logger55, orchestratorType) {
|
|
33419
33462
|
if (deps.orchestrator !== void 0) return deps.orchestrator;
|
|
33420
|
-
const techLead = createOrchestratorWithSica(
|
|
33421
|
-
const factory = new OrchestratorFactory({ logger:
|
|
33463
|
+
const techLead = createOrchestratorWithSica(logger55, deps.modelAdapter);
|
|
33464
|
+
const factory = new OrchestratorFactory({ logger: logger55, techLead });
|
|
33422
33465
|
return factory.create(orchestratorType ?? "orchestrator");
|
|
33423
33466
|
}
|
|
33424
33467
|
function createErrorOptions(taskId, cause) {
|
|
@@ -33530,16 +33573,16 @@ function recordOrchestrationError(errorMessage, taskDescription, durationMs) {
|
|
|
33530
33573
|
}
|
|
33531
33574
|
}
|
|
33532
33575
|
function routeAndPrepare(input, deps, router) {
|
|
33533
|
-
const
|
|
33534
|
-
const workflowRouter = router ?? createWorkflowRouter({ logger:
|
|
33576
|
+
const logger55 = deps.logger ?? createLogger({ tool: "orchestrate" });
|
|
33577
|
+
const workflowRouter = router ?? createWorkflowRouter({ logger: logger55 });
|
|
33535
33578
|
const decision = workflowRouter.route({ description: input.task });
|
|
33536
33579
|
const orchType = mapPatternToOrchestratorType(decision.pattern);
|
|
33537
|
-
|
|
33580
|
+
logger55.info("Workflow pattern selected", {
|
|
33538
33581
|
pattern: decision.pattern,
|
|
33539
33582
|
orchestratorType: orchType
|
|
33540
33583
|
});
|
|
33541
|
-
const orchestrator = createOrchestratorFromDeps(deps,
|
|
33542
|
-
return { workflowRouter, decision, orchestrator, logger:
|
|
33584
|
+
const orchestrator = createOrchestratorFromDeps(deps, logger55, orchType);
|
|
33585
|
+
return { workflowRouter, decision, orchestrator, logger: logger55 };
|
|
33543
33586
|
}
|
|
33544
33587
|
function buildRoutingInfo(decision) {
|
|
33545
33588
|
return {
|
|
@@ -33558,10 +33601,10 @@ function recordRouterOutcome(workflowRouter, decision, success, durationMs) {
|
|
|
33558
33601
|
timestamp: getTimeProvider().now()
|
|
33559
33602
|
});
|
|
33560
33603
|
}
|
|
33561
|
-
function handleOrchestrationException(error, taskId, task,
|
|
33604
|
+
function handleOrchestrationException(error, taskId, task, logger55) {
|
|
33562
33605
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
33563
33606
|
const cause = error instanceof Error ? error : void 0;
|
|
33564
|
-
|
|
33607
|
+
logger55.error("Orchestration exception", cause, { taskId });
|
|
33565
33608
|
recordOrchestrationError(message, task);
|
|
33566
33609
|
return err(
|
|
33567
33610
|
new OrchestrationError(
|
|
@@ -33570,13 +33613,13 @@ function handleOrchestrationException(error, taskId, task, logger54) {
|
|
|
33570
33613
|
)
|
|
33571
33614
|
);
|
|
33572
33615
|
}
|
|
33573
|
-
function startHeartbeatTracking(label,
|
|
33616
|
+
function startHeartbeatTracking(label, logger55) {
|
|
33574
33617
|
const monitor = getHeartbeatMonitor();
|
|
33575
33618
|
const sessionId = monitor.startSession(label);
|
|
33576
33619
|
const timer = setInterval(() => {
|
|
33577
33620
|
monitor.heartbeat(sessionId);
|
|
33578
33621
|
if (monitor.isStalled(sessionId)) {
|
|
33579
|
-
|
|
33622
|
+
logger55.warn("Orchestration session stalled", { label, sessionId });
|
|
33580
33623
|
}
|
|
33581
33624
|
}, HEARTBEAT_TIMEOUTS.heartbeatIntervalMs);
|
|
33582
33625
|
return {
|
|
@@ -33647,9 +33690,10 @@ function handleOrchestratorSuccess(ctx) {
|
|
|
33647
33690
|
});
|
|
33648
33691
|
return ok(output2);
|
|
33649
33692
|
}
|
|
33650
|
-
async function executeOrchestration(input, deps,
|
|
33651
|
-
const {
|
|
33652
|
-
const
|
|
33693
|
+
async function executeOrchestration(input, deps, opts = {}) {
|
|
33694
|
+
const { router, snapshot, trustTier, taskId: providedTaskId } = opts;
|
|
33695
|
+
const { workflowRouter, decision, orchestrator, logger: logger55 } = routeAndPrepare(input, deps, router);
|
|
33696
|
+
const taskId = providedTaskId ?? generateTaskId();
|
|
33653
33697
|
const startTime = getTimeProvider().now();
|
|
33654
33698
|
if (snapshot !== void 0) setRouting(snapshot, buildRoutingInfo(decision));
|
|
33655
33699
|
const fastResult = trySimpleTaskFastPath({
|
|
@@ -33658,18 +33702,18 @@ async function executeOrchestration(input, deps, router, snapshot, trustTier) {
|
|
|
33658
33702
|
decision,
|
|
33659
33703
|
workflowRouter,
|
|
33660
33704
|
startTime,
|
|
33661
|
-
logger:
|
|
33705
|
+
logger: logger55
|
|
33662
33706
|
});
|
|
33663
33707
|
if (fastResult !== void 0) {
|
|
33664
33708
|
if (snapshot !== void 0 && fastResult.ok) setAnalysis(snapshot, fastResult.value.analysis);
|
|
33665
33709
|
return fastResult;
|
|
33666
33710
|
}
|
|
33667
|
-
|
|
33668
|
-
recordTaskStateInit(taskId, input.task,
|
|
33711
|
+
logger55.info("Starting orchestration", { taskId, taskLength: input.task.length });
|
|
33712
|
+
recordTaskStateInit(taskId, input.task, logger55);
|
|
33669
33713
|
const task = await createTaskFromInput(input, taskId);
|
|
33670
33714
|
const definition = { type: "task", task };
|
|
33671
|
-
const hb = startHeartbeatTracking(`orchestrate-${taskId}`,
|
|
33672
|
-
const policy = await deriveOrchestratePolicy(input.task, deps,
|
|
33715
|
+
const hb = startHeartbeatTracking(`orchestrate-${taskId}`, logger55);
|
|
33716
|
+
const policy = await deriveOrchestratePolicy(input.task, deps, logger55, trustTier);
|
|
33673
33717
|
try {
|
|
33674
33718
|
return await runOrchestratorWithStateTracking({
|
|
33675
33719
|
taskId,
|
|
@@ -33680,23 +33724,23 @@ async function executeOrchestration(input, deps, router, snapshot, trustTier) {
|
|
|
33680
33724
|
decision,
|
|
33681
33725
|
workflowRouter,
|
|
33682
33726
|
startTime,
|
|
33683
|
-
logger:
|
|
33727
|
+
logger: logger55
|
|
33684
33728
|
});
|
|
33685
33729
|
} catch (error) {
|
|
33686
|
-
recordTaskStateBlocker(taskId, error instanceof Error ? error.message : String(error),
|
|
33687
|
-
recordTaskStateStage(taskId, "
|
|
33688
|
-
return handleOrchestrationException(error, taskId, input.task,
|
|
33730
|
+
recordTaskStateBlocker(taskId, error instanceof Error ? error.message : String(error), logger55);
|
|
33731
|
+
recordTaskStateStage(taskId, "failed", logger55);
|
|
33732
|
+
return handleOrchestrationException(error, taskId, input.task, logger55);
|
|
33689
33733
|
} finally {
|
|
33690
33734
|
hb.cleanup();
|
|
33691
33735
|
}
|
|
33692
33736
|
}
|
|
33693
33737
|
async function runOrchestratorWithStateTracking(params) {
|
|
33694
|
-
const { taskId, taskInput, definition, orchestrator, policy, logger:
|
|
33695
|
-
recordTaskStateStage(taskId, "executing",
|
|
33738
|
+
const { taskId, taskInput, definition, orchestrator, policy, logger: logger55 } = params;
|
|
33739
|
+
recordTaskStateStage(taskId, "executing", logger55);
|
|
33696
33740
|
const result = await withAccessPolicy(policy, () => orchestrator.execute(definition, {}));
|
|
33697
33741
|
if (!result.ok) {
|
|
33698
|
-
recordTaskStateBlocker(taskId, result.error.message,
|
|
33699
|
-
recordTaskStateStage(taskId, "
|
|
33742
|
+
recordTaskStateBlocker(taskId, result.error.message, logger55);
|
|
33743
|
+
recordTaskStateStage(taskId, "failed", logger55);
|
|
33700
33744
|
return handleOrchestratorFailure({
|
|
33701
33745
|
error: result.error,
|
|
33702
33746
|
taskId,
|
|
@@ -33704,10 +33748,10 @@ async function runOrchestratorWithStateTracking(params) {
|
|
|
33704
33748
|
decision: params.decision,
|
|
33705
33749
|
workflowRouter: params.workflowRouter,
|
|
33706
33750
|
startTime: params.startTime,
|
|
33707
|
-
logger:
|
|
33751
|
+
logger: logger55
|
|
33708
33752
|
});
|
|
33709
33753
|
}
|
|
33710
|
-
recordTaskStateStage(taskId, "complete",
|
|
33754
|
+
recordTaskStateStage(taskId, "complete", logger55);
|
|
33711
33755
|
return handleOrchestratorSuccess({
|
|
33712
33756
|
orchResult: result.value,
|
|
33713
33757
|
taskId,
|
|
@@ -33715,7 +33759,7 @@ async function runOrchestratorWithStateTracking(params) {
|
|
|
33715
33759
|
decision: params.decision,
|
|
33716
33760
|
workflowRouter: params.workflowRouter,
|
|
33717
33761
|
startTime: params.startTime,
|
|
33718
|
-
logger:
|
|
33762
|
+
logger: logger55
|
|
33719
33763
|
});
|
|
33720
33764
|
}
|
|
33721
33765
|
function isTaskStateEnabled() {
|
|
@@ -33724,7 +33768,7 @@ function isTaskStateEnabled() {
|
|
|
33724
33768
|
const normalized = raw.toLowerCase();
|
|
33725
33769
|
return normalized !== "0" && normalized !== "false";
|
|
33726
33770
|
}
|
|
33727
|
-
function recordTaskStateInit(taskId, taskText,
|
|
33771
|
+
function recordTaskStateInit(taskId, taskText, logger55) {
|
|
33728
33772
|
if (!isTaskStateEnabled()) return;
|
|
33729
33773
|
const now = getTimeProvider().nowIso();
|
|
33730
33774
|
const initial = {
|
|
@@ -33737,36 +33781,48 @@ function recordTaskStateInit(taskId, taskText, logger54) {
|
|
|
33737
33781
|
};
|
|
33738
33782
|
const result = initTaskState(initial);
|
|
33739
33783
|
if (!result.ok) {
|
|
33740
|
-
|
|
33784
|
+
logger55.warn("task-state: init failed, continuing", {
|
|
33741
33785
|
taskId,
|
|
33742
33786
|
error: result.error.message,
|
|
33743
33787
|
taskLength: taskText.length
|
|
33744
33788
|
});
|
|
33745
33789
|
}
|
|
33746
33790
|
}
|
|
33747
|
-
function recordTaskStateStage(taskId, stage,
|
|
33791
|
+
function recordTaskStateStage(taskId, stage, logger55) {
|
|
33748
33792
|
if (!isTaskStateEnabled()) return;
|
|
33749
33793
|
const result = updateStage(taskId, stage, getTimeProvider().nowIso());
|
|
33750
33794
|
if (!result.ok) {
|
|
33751
|
-
|
|
33795
|
+
logger55.warn("task-state: stage update failed", {
|
|
33752
33796
|
taskId,
|
|
33753
33797
|
stage,
|
|
33754
33798
|
error: result.error.message
|
|
33755
33799
|
});
|
|
33756
33800
|
}
|
|
33757
33801
|
}
|
|
33758
|
-
function recordTaskStateBlocker(taskId, blocker,
|
|
33802
|
+
function recordTaskStateBlocker(taskId, blocker, logger55) {
|
|
33759
33803
|
if (!isTaskStateEnabled()) return;
|
|
33760
33804
|
const ts = getTimeProvider().nowIso();
|
|
33761
33805
|
const result = appendBlocker(taskId, { ts, blocker });
|
|
33762
33806
|
if (!result.ok) {
|
|
33763
|
-
|
|
33807
|
+
logger55.warn("task-state: blocker record failed", {
|
|
33764
33808
|
taskId,
|
|
33765
33809
|
error: result.error.message
|
|
33766
33810
|
});
|
|
33767
33811
|
}
|
|
33768
33812
|
}
|
|
33769
|
-
|
|
33813
|
+
function recordTaskStateResult(taskId, result, logger55) {
|
|
33814
|
+
if (!isTaskStateEnabled()) return;
|
|
33815
|
+
const r = appendResult(taskId, result, getTimeProvider().nowIso());
|
|
33816
|
+
if (!r.ok) {
|
|
33817
|
+
logger55.warn("task-state: result record failed", { taskId, error: r.error.message });
|
|
33818
|
+
}
|
|
33819
|
+
}
|
|
33820
|
+
function recordTaskStateFailure(taskId, message, logger55) {
|
|
33821
|
+
if (!isTaskStateEnabled()) return;
|
|
33822
|
+
recordTaskStateBlocker(taskId, message, logger55);
|
|
33823
|
+
recordTaskStateStage(taskId, "failed", logger55);
|
|
33824
|
+
}
|
|
33825
|
+
async function deriveOrchestratePolicy(taskText, deps, logger55, trustTier) {
|
|
33770
33826
|
const mode = resolveAccessPolicyMode();
|
|
33771
33827
|
try {
|
|
33772
33828
|
const opts = {
|
|
@@ -33776,7 +33832,7 @@ async function deriveOrchestratePolicy(taskText, deps, logger54, trustTier) {
|
|
|
33776
33832
|
};
|
|
33777
33833
|
const policy = await deriveAccessPolicy(taskText, opts);
|
|
33778
33834
|
if (mode !== "off") {
|
|
33779
|
-
|
|
33835
|
+
logger55.info("access-policy: derived", {
|
|
33780
33836
|
mode,
|
|
33781
33837
|
source: policy.source,
|
|
33782
33838
|
allowedToolsWildcard: policy.allowedTools === "*"
|
|
@@ -33784,7 +33840,7 @@ async function deriveOrchestratePolicy(taskText, deps, logger54, trustTier) {
|
|
|
33784
33840
|
}
|
|
33785
33841
|
return policy;
|
|
33786
33842
|
} catch (error) {
|
|
33787
|
-
|
|
33843
|
+
logger55.warn("access-policy: derivation failed", {
|
|
33788
33844
|
mode,
|
|
33789
33845
|
error: getErrorMessage(error),
|
|
33790
33846
|
failClosed: mode === "enforce" || mode === "confirm_risky"
|
|
@@ -33811,22 +33867,22 @@ async function deriveOrchestratePolicy(taskText, deps, logger54, trustTier) {
|
|
|
33811
33867
|
};
|
|
33812
33868
|
}
|
|
33813
33869
|
}
|
|
33814
|
-
function instrumentV2Orchestrate(input,
|
|
33870
|
+
function instrumentV2Orchestrate(input, logger55, trustTier) {
|
|
33815
33871
|
const tc = orchestrateInputToTaskContract(input, trustTier !== void 0 ? { trustTier } : {});
|
|
33816
33872
|
void executeOrchestratePipeline(tc).then((m) => {
|
|
33817
|
-
|
|
33873
|
+
logger55.info("V2 orchestrate pipeline", { ...m });
|
|
33818
33874
|
}).catch((error) => {
|
|
33819
|
-
|
|
33875
|
+
logger55.debug("V2 orchestrate pipeline failed", { error: getErrorMessage(error) });
|
|
33820
33876
|
});
|
|
33821
33877
|
}
|
|
33822
|
-
async function tryWorkerDispatch(agentPlan, task, deps,
|
|
33878
|
+
async function tryWorkerDispatch(agentPlan, task, deps, logger55, notifier) {
|
|
33823
33879
|
const adapter = deps.modelAdapter;
|
|
33824
33880
|
if (agentPlan === void 0 || !isWorkerDispatchEnabled() || adapter === void 0) {
|
|
33825
33881
|
return void 0;
|
|
33826
33882
|
}
|
|
33827
33883
|
const abortSignal = abortSignalStorage.getStore();
|
|
33828
33884
|
if (abortSignal?.aborted === true) {
|
|
33829
|
-
|
|
33885
|
+
logger55.info("Worker dispatch aborted before start (client cancelled)");
|
|
33830
33886
|
return void 0;
|
|
33831
33887
|
}
|
|
33832
33888
|
try {
|
|
@@ -33837,14 +33893,14 @@ async function tryWorkerDispatch(agentPlan, task, deps, logger54, notifier) {
|
|
|
33837
33893
|
agentPlan,
|
|
33838
33894
|
taskDescription: task,
|
|
33839
33895
|
modelAdapter: adapter,
|
|
33840
|
-
logger:
|
|
33896
|
+
logger: logger55,
|
|
33841
33897
|
synthesize: true,
|
|
33842
33898
|
refine: true,
|
|
33843
33899
|
perWorkerRouting: true
|
|
33844
33900
|
})
|
|
33845
33901
|
);
|
|
33846
33902
|
} catch (dispatchError) {
|
|
33847
|
-
|
|
33903
|
+
logger55.warn("Worker dispatch failed, continuing with standard orchestration", {
|
|
33848
33904
|
error: dispatchError instanceof Error ? dispatchError.message : String(dispatchError)
|
|
33849
33905
|
});
|
|
33850
33906
|
return void 0;
|
|
@@ -33905,22 +33961,26 @@ function buildTimeoutOrchestrationResult(taskId, elapsedMs, reason, snapshot) {
|
|
|
33905
33961
|
return ok(output2);
|
|
33906
33962
|
}
|
|
33907
33963
|
async function executeOrchestrationWithDeadline(params) {
|
|
33908
|
-
const { input, deps, notifier, logger:
|
|
33964
|
+
const { input, deps, notifier, logger: logger55, trustTier, taskId } = params;
|
|
33909
33965
|
const overallDeadlineMs = getMcpSafeDeadlineMs(
|
|
33910
33966
|
MCP_TIMEOUTS.perTool["orchestrate"] ?? MCP_TIMEOUTS.defaultMs,
|
|
33911
33967
|
"orchestrate"
|
|
33912
33968
|
);
|
|
33913
|
-
const timeoutTaskId = generateTaskId();
|
|
33969
|
+
const timeoutTaskId = taskId ?? generateTaskId();
|
|
33914
33970
|
const snapshot = createOrchestrationStateSnapshot(getTimeProvider().now());
|
|
33915
33971
|
return raceAgainstDeadline(
|
|
33916
33972
|
withProgressHeartbeat(
|
|
33917
33973
|
"orchestrate",
|
|
33918
33974
|
notifier,
|
|
33919
|
-
() => executeOrchestration(input, deps,
|
|
33975
|
+
() => executeOrchestration(input, deps, {
|
|
33976
|
+
snapshot,
|
|
33977
|
+
...trustTier !== void 0 ? { trustTier } : {},
|
|
33978
|
+
...taskId !== void 0 ? { taskId } : {}
|
|
33979
|
+
})
|
|
33920
33980
|
),
|
|
33921
33981
|
overallDeadlineMs,
|
|
33922
33982
|
(elapsedMs) => {
|
|
33923
|
-
|
|
33983
|
+
logger55.warn("Orchestration overall deadline reached; returning partial result", {
|
|
33924
33984
|
overallDeadlineMs,
|
|
33925
33985
|
elapsedMs,
|
|
33926
33986
|
stage: snapshot.stage
|
|
@@ -33935,19 +33995,19 @@ async function executeOrchestrationWithDeadline(params) {
|
|
|
33935
33995
|
);
|
|
33936
33996
|
}
|
|
33937
33997
|
async function runOrchestratePipeline(params) {
|
|
33938
|
-
const { input, deps, notifier, logger:
|
|
33939
|
-
|
|
33998
|
+
const { input, deps, notifier, logger: logger55, trustTier, taskId } = params;
|
|
33999
|
+
logger55.debug("Starting orchestration", { taskLength: input.task.length });
|
|
33940
34000
|
notifier.info("orchestrate", { event: "orchestrate_start", taskLength: input.task.length });
|
|
33941
34001
|
const startMs = getTimeProvider().now();
|
|
33942
34002
|
const v2Config = resolveV2Config();
|
|
33943
|
-
if (v2Config.orchestrateEnabled) instrumentV2Orchestrate(input,
|
|
33944
|
-
await injectMemoryContextForOrchestrate(input,
|
|
33945
|
-
const agentPlan = v2Config.aorchestraEnabled ? computeAgentPlan(input.task,
|
|
34003
|
+
if (v2Config.orchestrateEnabled) instrumentV2Orchestrate(input, logger55, trustTier);
|
|
34004
|
+
await injectMemoryContextForOrchestrate(input, logger55);
|
|
34005
|
+
const agentPlan = v2Config.aorchestraEnabled ? computeAgentPlan(input.task, logger55) : void 0;
|
|
33946
34006
|
const workerDispatchResult = await tryWorkerDispatch(
|
|
33947
34007
|
agentPlan,
|
|
33948
34008
|
input.task,
|
|
33949
34009
|
deps,
|
|
33950
|
-
|
|
34010
|
+
logger55,
|
|
33951
34011
|
notifier
|
|
33952
34012
|
);
|
|
33953
34013
|
recordAndReflect(workerDispatchResult, input.task, deps);
|
|
@@ -33955,8 +34015,9 @@ async function runOrchestratePipeline(params) {
|
|
|
33955
34015
|
input,
|
|
33956
34016
|
deps,
|
|
33957
34017
|
notifier,
|
|
33958
|
-
logger:
|
|
33959
|
-
...trustTier !== void 0 ? { trustTier } : {}
|
|
34018
|
+
logger: logger55,
|
|
34019
|
+
...trustTier !== void 0 ? { trustTier } : {},
|
|
34020
|
+
...taskId !== void 0 ? { taskId } : {}
|
|
33960
34021
|
});
|
|
33961
34022
|
if (!result.ok) {
|
|
33962
34023
|
return toolStructuredError({
|
|
@@ -33971,15 +34032,15 @@ async function runOrchestratePipeline(params) {
|
|
|
33971
34032
|
});
|
|
33972
34033
|
return assembleOrchestrateOutput(result.value, agentPlan, workerDispatchResult);
|
|
33973
34034
|
}
|
|
33974
|
-
async function injectMemoryContextForOrchestrate(input,
|
|
34035
|
+
async function injectMemoryContextForOrchestrate(input, logger55) {
|
|
33975
34036
|
try {
|
|
33976
34037
|
const ctx = await getContextForTask({
|
|
33977
34038
|
task: input.task,
|
|
33978
34039
|
category: inferTaskCategory(input.task),
|
|
33979
|
-
logger:
|
|
34040
|
+
logger: logger55
|
|
33980
34041
|
});
|
|
33981
34042
|
const summary = summarizeContextForPrompt(ctx);
|
|
33982
|
-
|
|
34043
|
+
logger55.debug("orchestrate: unified memory context", {
|
|
33983
34044
|
beliefs: ctx.beliefs.length,
|
|
33984
34045
|
similarMemories: ctx.similarMemories.length,
|
|
33985
34046
|
recentLearnings: ctx.recentLearnings.length,
|
|
@@ -33992,7 +34053,7 @@ async function injectMemoryContextForOrchestrate(input, logger54) {
|
|
|
33992
34053
|
mutable.context = { ...mutable.context ?? {}, priorMemorySummary: summary };
|
|
33993
34054
|
}
|
|
33994
34055
|
} catch (error) {
|
|
33995
|
-
|
|
34056
|
+
logger55.debug("orchestrate: context retrieval failed", { error: getErrorMessage(error) });
|
|
33996
34057
|
}
|
|
33997
34058
|
}
|
|
33998
34059
|
function createOrchestrateHandler(deps) {
|
|
@@ -34055,7 +34116,11 @@ function dispatchAsyncOrchestrate(params) {
|
|
|
34055
34116
|
tool: "orchestrate",
|
|
34056
34117
|
idempotencyKey: params.input.idempotencyKey,
|
|
34057
34118
|
inputs: params.input,
|
|
34058
|
-
|
|
34119
|
+
// #3091: jobId === taskId. The async job's id IS the orchestration's
|
|
34120
|
+
// taskId, so get_job_result(jobId) resolves directly from the task-state
|
|
34121
|
+
// log (orch-<ts>-<rand>) under the Stage-2 reader. Replaces the former
|
|
34122
|
+
// opaque `job-orch-<uuid>` id.
|
|
34123
|
+
freshJobId: () => generateTaskId(),
|
|
34059
34124
|
replayEnvelope: buildReplayEnvelope,
|
|
34060
34125
|
collisionEnvelope: buildCollisionEnvelope
|
|
34061
34126
|
});
|
|
@@ -34088,6 +34153,7 @@ function recordPendingAndRegister(jobId, key, inputs) {
|
|
|
34088
34153
|
}
|
|
34089
34154
|
}
|
|
34090
34155
|
async function runOrchestrateInBackground(jobId, params) {
|
|
34156
|
+
const taskId = jobId;
|
|
34091
34157
|
try {
|
|
34092
34158
|
const result = await withDepthGuard(
|
|
34093
34159
|
"orchestrate",
|
|
@@ -34096,20 +34162,23 @@ async function runOrchestrateInBackground(jobId, params) {
|
|
|
34096
34162
|
deps: params.deps,
|
|
34097
34163
|
notifier: params.notifier,
|
|
34098
34164
|
logger: params.logger,
|
|
34165
|
+
taskId,
|
|
34099
34166
|
...params.trustTier !== void 0 ? { trustTier: params.trustTier } : {}
|
|
34100
34167
|
})
|
|
34101
34168
|
);
|
|
34102
34169
|
writeJobComplete(jobId, "orchestrate", result);
|
|
34170
|
+
recordTaskStateResult(taskId, result, params.logger);
|
|
34103
34171
|
} catch (err2) {
|
|
34104
34172
|
const errObj = err2 instanceof Error ? err2 : new Error(String(err2));
|
|
34105
34173
|
params.logger.error("Async orchestrate dispatch failed", errObj, { jobId });
|
|
34106
34174
|
writeJobFailed(jobId, "orchestrate", errObj.message);
|
|
34175
|
+
recordTaskStateFailure(taskId, errObj.message, params.logger);
|
|
34107
34176
|
} finally {
|
|
34108
34177
|
release("orchestrate");
|
|
34109
34178
|
}
|
|
34110
34179
|
}
|
|
34111
34180
|
function registerOrchestrateTool(server, deps) {
|
|
34112
|
-
const
|
|
34181
|
+
const logger55 = deps.logger ?? createLogger({ tool: "orchestrate" });
|
|
34113
34182
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
34114
34183
|
const depsWithNotifier = { ...deps, notifier };
|
|
34115
34184
|
const description2 = "Orchestrate a task by analyzing it, breaking it into subtasks if needed, and coordinating expert agents";
|
|
@@ -34117,12 +34186,12 @@ function registerOrchestrateTool(server, deps) {
|
|
|
34117
34186
|
toolName: "orchestrate",
|
|
34118
34187
|
securityTier: "user-facing",
|
|
34119
34188
|
rateLimiter: deps.rateLimiter,
|
|
34120
|
-
logger:
|
|
34189
|
+
logger: logger55
|
|
34121
34190
|
});
|
|
34122
34191
|
const configuredTimeoutMs = MCP_TIMEOUTS.perTool["orchestrate"] ?? MCP_TIMEOUTS.defaultMs;
|
|
34123
34192
|
const wrappedHandler = wrapToolWithTimeout("orchestrate", secureHandler, {
|
|
34124
34193
|
timeoutMs: configuredTimeoutMs,
|
|
34125
|
-
logger:
|
|
34194
|
+
logger: logger55
|
|
34126
34195
|
});
|
|
34127
34196
|
server.registerTool(
|
|
34128
34197
|
"orchestrate",
|
|
@@ -34131,9 +34200,9 @@ function registerOrchestrateTool(server, deps) {
|
|
|
34131
34200
|
inputSchema: ORCHESTRATE_TOOL_SCHEMA,
|
|
34132
34201
|
annotations: getToolAnnotations("orchestrate")
|
|
34133
34202
|
},
|
|
34134
|
-
toSdkCallbackWithBudgetCheck(wrappedHandler, "orchestrate", configuredTimeoutMs,
|
|
34203
|
+
toSdkCallbackWithBudgetCheck(wrappedHandler, "orchestrate", configuredTimeoutMs, logger55)
|
|
34135
34204
|
);
|
|
34136
|
-
|
|
34205
|
+
logger55.info("Registered orchestrate tool with secure handler and timeout protection");
|
|
34137
34206
|
}
|
|
34138
34207
|
|
|
34139
34208
|
// src/mcp/tools/delegate-to-model-types.ts
|
|
@@ -34496,21 +34565,21 @@ function mapCompositeDecisionToOutput(decision, estimatedTokens) {
|
|
|
34496
34565
|
}))
|
|
34497
34566
|
};
|
|
34498
34567
|
}
|
|
34499
|
-
async function routeViaCompositeRouter(task, router, feedbackIntegration,
|
|
34568
|
+
async function routeViaCompositeRouter(task, router, feedbackIntegration, logger55) {
|
|
34500
34569
|
const result = await router.route({ content: task });
|
|
34501
34570
|
if (!result.ok) {
|
|
34502
|
-
|
|
34571
|
+
logger55.warn("CompositeRouter routing failed", { error: result.error.message });
|
|
34503
34572
|
return null;
|
|
34504
34573
|
}
|
|
34505
34574
|
const decision = result.value;
|
|
34506
34575
|
let routingId;
|
|
34507
34576
|
if (feedbackIntegration) {
|
|
34508
34577
|
routingId = feedbackIntegration.recordRoutingDecision(decision);
|
|
34509
|
-
|
|
34578
|
+
logger55.debug("Recorded routing decision", { routingId, cliName: decision.cliName });
|
|
34510
34579
|
}
|
|
34511
34580
|
return { decision, routingId, feedbackIntegration };
|
|
34512
34581
|
}
|
|
34513
|
-
function recordRoutingOutcome(result, durationMs,
|
|
34582
|
+
function recordRoutingOutcome(result, durationMs, logger55) {
|
|
34514
34583
|
if (result.routingId === void 0 || result.feedbackIntegration === void 0) return;
|
|
34515
34584
|
try {
|
|
34516
34585
|
const topsisScore = result.decision.topsisScore ?? 0;
|
|
@@ -34523,13 +34592,13 @@ function recordRoutingOutcome(result, durationMs, logger54) {
|
|
|
34523
34592
|
tokenUsage: 0
|
|
34524
34593
|
// delegate-to-model is a recommendation, not execution
|
|
34525
34594
|
});
|
|
34526
|
-
|
|
34595
|
+
logger55.debug("Recorded routing outcome", {
|
|
34527
34596
|
routingId: result.routingId,
|
|
34528
34597
|
topsisScore,
|
|
34529
34598
|
success: topsisScore >= TOPSIS_CONFIDENCE_THRESHOLD
|
|
34530
34599
|
});
|
|
34531
34600
|
} catch (error) {
|
|
34532
|
-
|
|
34601
|
+
logger55.warn("Failed to record routing outcome", { error: getErrorMessage(error) });
|
|
34533
34602
|
}
|
|
34534
34603
|
}
|
|
34535
34604
|
|
|
@@ -34550,9 +34619,9 @@ function classifyWithGovernance(toolName, params, overrides) {
|
|
|
34550
34619
|
const promotionReason = promoted ? buildPromotionReason(domain, params) : null;
|
|
34551
34620
|
return { tier, promoted, domain, votingThreshold, promotionReason };
|
|
34552
34621
|
}
|
|
34553
|
-
function auditGovernancePromotion(classification, toolName,
|
|
34622
|
+
function auditGovernancePromotion(classification, toolName, logger55) {
|
|
34554
34623
|
if (!classification.promoted) return;
|
|
34555
|
-
const log =
|
|
34624
|
+
const log = logger55 ?? createLogger({ component: "governance" });
|
|
34556
34625
|
log.warn("Governance promotion", {
|
|
34557
34626
|
tool: toolName,
|
|
34558
34627
|
domain: classification.domain,
|
|
@@ -34623,9 +34692,9 @@ function recordToMemory(task, model, usedRouter) {
|
|
|
34623
34692
|
});
|
|
34624
34693
|
}
|
|
34625
34694
|
}
|
|
34626
|
-
function classifyDelegateGovernance(input,
|
|
34695
|
+
function classifyDelegateGovernance(input, logger55) {
|
|
34627
34696
|
const classification = classifyWithGovernance("delegate_to_model", { task: input.task });
|
|
34628
|
-
auditGovernancePromotion(classification, "delegate_to_model",
|
|
34697
|
+
auditGovernancePromotion(classification, "delegate_to_model", logger55);
|
|
34629
34698
|
return classification;
|
|
34630
34699
|
}
|
|
34631
34700
|
function enrichWithGovernance(output2, governance) {
|
|
@@ -34639,12 +34708,12 @@ function enrichWithGovernance(output2, governance) {
|
|
|
34639
34708
|
}
|
|
34640
34709
|
};
|
|
34641
34710
|
}
|
|
34642
|
-
function instrumentV2Pipeline(input,
|
|
34711
|
+
function instrumentV2Pipeline(input, logger55, trustTier) {
|
|
34643
34712
|
const tc = delegateInputToTaskContract(input, trustTier !== void 0 ? { trustTier } : {});
|
|
34644
34713
|
void executeDelegatePipeline(tc).then((m) => {
|
|
34645
|
-
|
|
34714
|
+
logger55.info("V2 delegate pipeline", { ...m });
|
|
34646
34715
|
}).catch((error) => {
|
|
34647
|
-
|
|
34716
|
+
logger55.warn("V2 delegate instrumentation failed", { error: getErrorMessage(error) });
|
|
34648
34717
|
});
|
|
34649
34718
|
}
|
|
34650
34719
|
function notifyAndRecord(opts) {
|
|
@@ -34720,18 +34789,18 @@ function createDelegateHandler(deps) {
|
|
|
34720
34789
|
};
|
|
34721
34790
|
}
|
|
34722
34791
|
function registerDelegateToModelTool(server, deps) {
|
|
34723
|
-
const
|
|
34792
|
+
const logger55 = deps.logger ?? createLogger({ tool: "delegate_to_model" });
|
|
34724
34793
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
34725
34794
|
const depsWithNotifier = { ...deps, notifier };
|
|
34726
34795
|
const secureHandler = createSecureHandler(createDelegateHandler(depsWithNotifier), {
|
|
34727
34796
|
toolName: "delegate_to_model",
|
|
34728
34797
|
rateLimiter: deps.rateLimiter,
|
|
34729
|
-
logger:
|
|
34798
|
+
logger: logger55
|
|
34730
34799
|
});
|
|
34731
34800
|
const timeoutMs = getToolTimeout("delegate_to_model", deps.security);
|
|
34732
34801
|
const wrappedHandler = wrapToolWithTimeout("delegate_to_model", secureHandler, {
|
|
34733
34802
|
timeoutMs,
|
|
34734
|
-
logger:
|
|
34803
|
+
logger: logger55
|
|
34735
34804
|
});
|
|
34736
34805
|
server.registerTool(
|
|
34737
34806
|
"delegate_to_model",
|
|
@@ -34743,7 +34812,7 @@ function registerDelegateToModelTool(server, deps) {
|
|
|
34743
34812
|
},
|
|
34744
34813
|
toSdkCallback(wrappedHandler)
|
|
34745
34814
|
);
|
|
34746
|
-
|
|
34815
|
+
logger55.info("Registered delegate_to_model tool with secure handler and timeout protection");
|
|
34747
34816
|
}
|
|
34748
34817
|
|
|
34749
34818
|
// src/mcp/tools/run-graph-workflow-multicli-templates.ts
|
|
@@ -35685,7 +35754,7 @@ function listExpertsHandler(args, ctx) {
|
|
|
35685
35754
|
return Promise.resolve(toolSuccessStructured(data));
|
|
35686
35755
|
}
|
|
35687
35756
|
function registerListExpertsTool(server, deps) {
|
|
35688
|
-
const
|
|
35757
|
+
const logger55 = deps.logger ?? createLogger({ tool: "list_experts" });
|
|
35689
35758
|
const toolSchema = {
|
|
35690
35759
|
format: z57.enum(["full", "names"]).optional().describe("Output format: full (with details) or names (just role names)")
|
|
35691
35760
|
};
|
|
@@ -35693,10 +35762,10 @@ function registerListExpertsTool(server, deps) {
|
|
|
35693
35762
|
const secureHandler = createSecureHandler(listExpertsHandler, {
|
|
35694
35763
|
toolName: "list_experts",
|
|
35695
35764
|
rateLimiter: deps.rateLimiter,
|
|
35696
|
-
logger:
|
|
35765
|
+
logger: logger55
|
|
35697
35766
|
});
|
|
35698
35767
|
const timeoutMs = getToolTimeout("list_experts", deps.security);
|
|
35699
|
-
const wrappedHandler = wrapToolWithTimeout("list_experts", secureHandler, { timeoutMs, logger:
|
|
35768
|
+
const wrappedHandler = wrapToolWithTimeout("list_experts", secureHandler, { timeoutMs, logger: logger55 });
|
|
35700
35769
|
const outputSchema = {
|
|
35701
35770
|
experts: z57.array(
|
|
35702
35771
|
z57.object({
|
|
@@ -35718,7 +35787,7 @@ function registerListExpertsTool(server, deps) {
|
|
|
35718
35787
|
},
|
|
35719
35788
|
toSdkCallback(wrappedHandler)
|
|
35720
35789
|
);
|
|
35721
|
-
|
|
35790
|
+
logger55.info("Registered list_experts tool with secure handler and timeout protection");
|
|
35722
35791
|
}
|
|
35723
35792
|
|
|
35724
35793
|
// src/mcp/tools/list-workflows.ts
|
|
@@ -35777,7 +35846,7 @@ function createListWorkflowsHandler(workflowEngine) {
|
|
|
35777
35846
|
};
|
|
35778
35847
|
}
|
|
35779
35848
|
function registerListWorkflowsTool(server, deps) {
|
|
35780
|
-
const
|
|
35849
|
+
const logger55 = deps.logger ?? createLogger({ tool: "list_workflows" });
|
|
35781
35850
|
const toolSchema = {
|
|
35782
35851
|
category: z58.string().optional().describe("Filter by category (e.g., development, security)"),
|
|
35783
35852
|
format: z58.enum(["full", "names"]).optional().describe("Output format: full (with details) or names (just template names)")
|
|
@@ -35786,13 +35855,13 @@ function registerListWorkflowsTool(server, deps) {
|
|
|
35786
35855
|
const secureHandler = createSecureHandler(createListWorkflowsHandler(deps.workflowEngine), {
|
|
35787
35856
|
toolName: "list_workflows",
|
|
35788
35857
|
rateLimiter: deps.rateLimiter,
|
|
35789
|
-
logger:
|
|
35858
|
+
logger: logger55
|
|
35790
35859
|
});
|
|
35791
35860
|
const timeoutMs = deps.security?.timeout?.defaultTimeoutMs;
|
|
35792
35861
|
const wrappedHandler = wrapToolWithTimeout(
|
|
35793
35862
|
"list_workflows",
|
|
35794
35863
|
secureHandler,
|
|
35795
|
-
timeoutMs !== void 0 ? { timeoutMs, logger:
|
|
35864
|
+
timeoutMs !== void 0 ? { timeoutMs, logger: logger55 } : { logger: logger55 }
|
|
35796
35865
|
);
|
|
35797
35866
|
const outputSchema = {
|
|
35798
35867
|
workflows: z58.array(
|
|
@@ -35816,7 +35885,7 @@ function registerListWorkflowsTool(server, deps) {
|
|
|
35816
35885
|
},
|
|
35817
35886
|
toSdkCallback(wrappedHandler)
|
|
35818
35887
|
);
|
|
35819
|
-
|
|
35888
|
+
logger55.info("Registered list_workflows tool with secure handler and timeout protection");
|
|
35820
35889
|
}
|
|
35821
35890
|
|
|
35822
35891
|
// src/mcp/tools/execute-expert.ts
|
|
@@ -35900,12 +35969,12 @@ function recordExpertError2(expertId, role, errorMessage) {
|
|
|
35900
35969
|
});
|
|
35901
35970
|
}
|
|
35902
35971
|
}
|
|
35903
|
-
function autoCatalogScan(output2, expertId,
|
|
35972
|
+
function autoCatalogScan(output2, expertId, logger55) {
|
|
35904
35973
|
try {
|
|
35905
35974
|
const catalog = getAutoCatalog();
|
|
35906
35975
|
catalog.scanAndRecord(output2, "execute_expert");
|
|
35907
35976
|
} catch (error) {
|
|
35908
|
-
|
|
35977
|
+
logger55?.debug("Best-effort auto-catalog scan failed", {
|
|
35909
35978
|
error: getErrorMessage(error),
|
|
35910
35979
|
expertId
|
|
35911
35980
|
});
|
|
@@ -35964,11 +36033,11 @@ function computeExpertContextUtilization(observation, threshold = DEFAULT_CONTEX
|
|
|
35964
36033
|
threshold
|
|
35965
36034
|
};
|
|
35966
36035
|
}
|
|
35967
|
-
function observeExpertContext(observation,
|
|
36036
|
+
function observeExpertContext(observation, logger55, threshold = resolveContextWarnThreshold()) {
|
|
35968
36037
|
try {
|
|
35969
36038
|
const util = computeExpertContextUtilization(observation, threshold);
|
|
35970
36039
|
if (util.warned) {
|
|
35971
|
-
|
|
36040
|
+
logger55?.warn("context_warning", {
|
|
35972
36041
|
event: "context_warning",
|
|
35973
36042
|
expertId: observation.expertId,
|
|
35974
36043
|
role: observation.role,
|
|
@@ -35981,7 +36050,7 @@ function observeExpertContext(observation, logger54, threshold = resolveContextW
|
|
|
35981
36050
|
taskLength: observation.taskDescription.length
|
|
35982
36051
|
});
|
|
35983
36052
|
} else {
|
|
35984
|
-
|
|
36053
|
+
logger55?.debug("context_utilization", {
|
|
35985
36054
|
event: "context_utilization",
|
|
35986
36055
|
expertId: observation.expertId,
|
|
35987
36056
|
role: observation.role,
|
|
@@ -36069,7 +36138,7 @@ function buildSuccessResponse(params) {
|
|
|
36069
36138
|
}
|
|
36070
36139
|
return response;
|
|
36071
36140
|
}
|
|
36072
|
-
function observeExpertContextIfOk(result, expert, task, durationMs,
|
|
36141
|
+
function observeExpertContextIfOk(result, expert, task, durationMs, logger55) {
|
|
36073
36142
|
if (!result.ok) return;
|
|
36074
36143
|
const expertModelId = expert.expertConfig.modelPreference?.modelId;
|
|
36075
36144
|
const observation = {
|
|
@@ -36080,9 +36149,9 @@ function observeExpertContextIfOk(result, expert, task, durationMs, logger54) {
|
|
|
36080
36149
|
taskDescription: task.description,
|
|
36081
36150
|
durationMs
|
|
36082
36151
|
};
|
|
36083
|
-
observeExpertContext(observation,
|
|
36152
|
+
observeExpertContext(observation, logger55);
|
|
36084
36153
|
}
|
|
36085
|
-
async function deriveExpertAccessPolicy(task,
|
|
36154
|
+
async function deriveExpertAccessPolicy(task, logger55, trustTier) {
|
|
36086
36155
|
const mode = resolveAccessPolicyMode();
|
|
36087
36156
|
try {
|
|
36088
36157
|
const policy = await deriveAccessPolicy(task.description, {
|
|
@@ -36090,14 +36159,14 @@ async function deriveExpertAccessPolicy(task, logger54, trustTier) {
|
|
|
36090
36159
|
trustTier: trustTier ?? "4"
|
|
36091
36160
|
});
|
|
36092
36161
|
if (mode !== "off") {
|
|
36093
|
-
|
|
36162
|
+
logger55?.info("access-policy: derived (expert)", {
|
|
36094
36163
|
mode,
|
|
36095
36164
|
source: policy.source
|
|
36096
36165
|
});
|
|
36097
36166
|
}
|
|
36098
36167
|
return policy;
|
|
36099
36168
|
} catch (error) {
|
|
36100
|
-
|
|
36169
|
+
logger55?.warn("access-policy: derivation failed (expert)", {
|
|
36101
36170
|
mode,
|
|
36102
36171
|
error: getErrorMessage(error),
|
|
36103
36172
|
failClosed: mode === "enforce" || mode === "confirm_risky"
|
|
@@ -36156,11 +36225,11 @@ function isExpertDegraded(role) {
|
|
|
36156
36225
|
}
|
|
36157
36226
|
return consecutive >= DEGRADATION_CONSECUTIVE_THRESHOLD;
|
|
36158
36227
|
}
|
|
36159
|
-
async function tryExpertFallback(expert, task,
|
|
36228
|
+
async function tryExpertFallback(expert, task, logger55) {
|
|
36160
36229
|
const roleKey = `${expert.role}_expert`;
|
|
36161
36230
|
const category = ROLE_TO_TASK_CATEGORY[roleKey];
|
|
36162
36231
|
if (category === void 0) return void 0;
|
|
36163
|
-
const effectiveLogger =
|
|
36232
|
+
const effectiveLogger = logger55 ?? createLogger({ tool: "execute_expert" });
|
|
36164
36233
|
const registry = getGlobalRegistry({ logger: effectiveLogger });
|
|
36165
36234
|
const routing = registry.getRouting(category);
|
|
36166
36235
|
const primaryCli = routing?.primaryCli ?? "unknown";
|
|
@@ -36169,7 +36238,7 @@ async function tryExpertFallback(expert, task, logger54) {
|
|
|
36169
36238
|
const fallbackCli = chain[0];
|
|
36170
36239
|
if (fallbackCli === void 0) return void 0;
|
|
36171
36240
|
const fallbackAdapter = registry.getAdapterForCli(fallbackCli);
|
|
36172
|
-
|
|
36241
|
+
logger55?.info("Retrying expert with fallback CLI", { role: expert.role, fallbackCli });
|
|
36173
36242
|
const fallbackResult = createExpert(expert.expertConfig, { adapter: fallbackAdapter });
|
|
36174
36243
|
if (!fallbackResult.ok) return void 0;
|
|
36175
36244
|
const fallbackStart = getTimeProvider().now();
|
|
@@ -36189,7 +36258,7 @@ async function tryExpertFallback(expert, task, logger54) {
|
|
|
36189
36258
|
};
|
|
36190
36259
|
}
|
|
36191
36260
|
async function classifyExpertResult(opts) {
|
|
36192
|
-
const { result, expert, task, args, durationMs, logger:
|
|
36261
|
+
const { result, expert, task, args, durationMs, logger: logger55 } = opts;
|
|
36193
36262
|
const modelId = expert.expertConfig.modelPreference?.modelId;
|
|
36194
36263
|
const info = {
|
|
36195
36264
|
expertId: args.expertId,
|
|
@@ -36198,19 +36267,19 @@ async function classifyExpertResult(opts) {
|
|
|
36198
36267
|
};
|
|
36199
36268
|
if (!result.ok) {
|
|
36200
36269
|
if (isRateLimitFailure(result.error.message)) {
|
|
36201
|
-
const fallback = await tryExpertFallback(expert, task,
|
|
36270
|
+
const fallback = await tryExpertFallback(expert, task, logger55);
|
|
36202
36271
|
if (fallback !== void 0) return fallback;
|
|
36203
36272
|
}
|
|
36204
|
-
|
|
36273
|
+
logger55?.warn("Expert execution failed", {
|
|
36205
36274
|
expertId: args.expertId,
|
|
36206
36275
|
error: result.error.message
|
|
36207
36276
|
});
|
|
36208
36277
|
return handleExpertFailure(args.task, info, result.error.message, durationMs);
|
|
36209
36278
|
}
|
|
36210
|
-
|
|
36279
|
+
logger55?.info("Expert execution completed", { expertId: args.expertId, durationMs });
|
|
36211
36280
|
handleExpertSuccess(args.task, info, durationMs);
|
|
36212
36281
|
if (typeof result.value.output === "string") {
|
|
36213
|
-
autoCatalogScan(result.value.output, args.expertId,
|
|
36282
|
+
autoCatalogScan(result.value.output, args.expertId, logger55);
|
|
36214
36283
|
}
|
|
36215
36284
|
return {
|
|
36216
36285
|
ok: true,
|
|
@@ -36298,7 +36367,7 @@ var EXECUTE_EXPERT_TOOL_SCHEMA = {
|
|
|
36298
36367
|
context: z59.record(z59.string(), z59.unknown()).optional().describe("Additional context metadata for the task"),
|
|
36299
36368
|
timeoutMs: z59.number().int().min(EXPERT_TIMEOUT_FLOOR_MS).max(EXPERT_TIMEOUTS.maxMs).optional().describe("Optional timeout in ms (120s-900s). Overrides auto-detected timeout.")
|
|
36300
36369
|
};
|
|
36301
|
-
function createTaskHandler(deps,
|
|
36370
|
+
function createTaskHandler(deps, logger55) {
|
|
36302
36371
|
const notifier = deps.notifier ?? NOOP_NOTIFIER;
|
|
36303
36372
|
return {
|
|
36304
36373
|
createTask: (args, extra) => {
|
|
@@ -36310,7 +36379,7 @@ function createTaskHandler(deps, logger54) {
|
|
|
36310
36379
|
const { taskStore } = extra;
|
|
36311
36380
|
const ttl = clampTaskTtl(DEFAULT_TASK_TTL_MS);
|
|
36312
36381
|
const taskPromise = taskStore.createTask({ ttl, pollInterval: 5e3 }).then((task) => {
|
|
36313
|
-
|
|
36382
|
+
logger55.info("Task created for execute_expert", {
|
|
36314
36383
|
taskId: task.taskId,
|
|
36315
36384
|
expertId: validatedArgs.expertId
|
|
36316
36385
|
});
|
|
@@ -36335,7 +36404,7 @@ function createTaskHandler(deps, logger54) {
|
|
|
36335
36404
|
}
|
|
36336
36405
|
async function runBackgroundExpertTask(opts) {
|
|
36337
36406
|
const { deps, args, taskId, taskStore, notifier } = opts;
|
|
36338
|
-
const
|
|
36407
|
+
const logger55 = deps.logger ?? createLogger({ tool: "execute_expert" });
|
|
36339
36408
|
try {
|
|
36340
36409
|
notifier.info("execute_expert", {
|
|
36341
36410
|
event: "expert_start",
|
|
@@ -36368,7 +36437,7 @@ async function runBackgroundExpertTask(opts) {
|
|
|
36368
36437
|
});
|
|
36369
36438
|
} catch (error) {
|
|
36370
36439
|
const message = getErrorMessage(error);
|
|
36371
|
-
|
|
36440
|
+
logger55.warn("Background expert task failed", { taskId, error: message });
|
|
36372
36441
|
try {
|
|
36373
36442
|
await taskStore.storeTaskResult(taskId, "failed", {
|
|
36374
36443
|
...toolStructuredError({
|
|
@@ -36377,7 +36446,7 @@ async function runBackgroundExpertTask(opts) {
|
|
|
36377
36446
|
})
|
|
36378
36447
|
});
|
|
36379
36448
|
} catch (storeError) {
|
|
36380
|
-
|
|
36449
|
+
logger55.warn("Failed to store task failure result", {
|
|
36381
36450
|
taskId,
|
|
36382
36451
|
error: getErrorMessage(storeError)
|
|
36383
36452
|
});
|
|
@@ -36385,7 +36454,7 @@ async function runBackgroundExpertTask(opts) {
|
|
|
36385
36454
|
}
|
|
36386
36455
|
}
|
|
36387
36456
|
function registerExecuteExpertTool(server, deps) {
|
|
36388
|
-
const
|
|
36457
|
+
const logger55 = deps.logger ?? createLogger({ tool: "execute_expert" });
|
|
36389
36458
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
36390
36459
|
const depsWithNotifier = { ...deps, notifier };
|
|
36391
36460
|
const description2 = "Run a task through an expert YOU PREVIOUSLY CREATED via `create_expert`. Requires the expertId returned by create_expert; not for ad-hoc execution. Returns the expert analysis including output, confidence, and token usage.";
|
|
@@ -36397,9 +36466,9 @@ function registerExecuteExpertTool(server, deps) {
|
|
|
36397
36466
|
execution: { taskSupport: "optional" },
|
|
36398
36467
|
annotations: getToolAnnotations("execute_expert")
|
|
36399
36468
|
},
|
|
36400
|
-
createTaskHandler(depsWithNotifier,
|
|
36469
|
+
createTaskHandler(depsWithNotifier, logger55)
|
|
36401
36470
|
);
|
|
36402
|
-
|
|
36471
|
+
logger55.info("Registered execute_expert tool with MCP Tasks support (taskSupport: optional)");
|
|
36403
36472
|
}
|
|
36404
36473
|
|
|
36405
36474
|
// src/mcp/tools/research-query.ts
|
|
@@ -37798,15 +37867,15 @@ function createResearchQueryHandler(deps) {
|
|
|
37798
37867
|
});
|
|
37799
37868
|
}
|
|
37800
37869
|
ctx.logger.debug("Executing research query", { action: validationResult.data.action });
|
|
37801
|
-
const
|
|
37802
|
-
return withToolError("Research query failed",
|
|
37870
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_query" });
|
|
37871
|
+
return withToolError("Research query failed", logger55, async () => {
|
|
37803
37872
|
const result = await executeQuery(validationResult.data);
|
|
37804
37873
|
return toolSuccessStructured(result);
|
|
37805
37874
|
});
|
|
37806
37875
|
};
|
|
37807
37876
|
}
|
|
37808
37877
|
function registerResearchQueryTool(server, deps) {
|
|
37809
|
-
const
|
|
37878
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_query" });
|
|
37810
37879
|
const toolSchema = {
|
|
37811
37880
|
action: z62.enum(["status", "overlap", "stats", "search"]).describe("Query action: status, overlap, stats, or search"),
|
|
37812
37881
|
techniqueId: z62.string().optional().describe("Technique ID for status/overlap queries"),
|
|
@@ -37818,12 +37887,12 @@ function registerResearchQueryTool(server, deps) {
|
|
|
37818
37887
|
const secureHandler = createSecureHandler(createResearchQueryHandler(deps), {
|
|
37819
37888
|
toolName: "research_query",
|
|
37820
37889
|
rateLimiter: deps.rateLimiter,
|
|
37821
|
-
logger:
|
|
37890
|
+
logger: logger55
|
|
37822
37891
|
});
|
|
37823
37892
|
const timeoutMs = getToolTimeout("research_query", deps.security);
|
|
37824
37893
|
const wrappedHandler = wrapToolWithTimeout("research_query", secureHandler, {
|
|
37825
37894
|
timeoutMs,
|
|
37826
|
-
logger:
|
|
37895
|
+
logger: logger55
|
|
37827
37896
|
});
|
|
37828
37897
|
const outputSchema = {
|
|
37829
37898
|
action: z62.string(),
|
|
@@ -37840,7 +37909,7 @@ function registerResearchQueryTool(server, deps) {
|
|
|
37840
37909
|
},
|
|
37841
37910
|
toSdkCallback(wrappedHandler)
|
|
37842
37911
|
);
|
|
37843
|
-
|
|
37912
|
+
logger55.info("Registered research_query tool with secure handler and timeout protection");
|
|
37844
37913
|
}
|
|
37845
37914
|
|
|
37846
37915
|
// src/mcp/tools/research-add.ts
|
|
@@ -37851,7 +37920,7 @@ var ResearchAddInputSchema = z63.object({
|
|
|
37851
37920
|
priority: z63.enum(["P1", "P2", "P3", "P4"]).optional().describe("Priority level for the paper"),
|
|
37852
37921
|
dryRun: z63.boolean().optional().default(false).describe("Preview what would be added without persisting")
|
|
37853
37922
|
});
|
|
37854
|
-
async function executeResearchAdd(input,
|
|
37923
|
+
async function executeResearchAdd(input, logger55) {
|
|
37855
37924
|
const exists = await paperExists(input.arxivId);
|
|
37856
37925
|
if (exists) {
|
|
37857
37926
|
return {
|
|
@@ -37871,7 +37940,7 @@ async function executeResearchAdd(input, logger54) {
|
|
|
37871
37940
|
});
|
|
37872
37941
|
if (result.success && !input.dryRun) {
|
|
37873
37942
|
try {
|
|
37874
|
-
const memory = getToolMemory(
|
|
37943
|
+
const memory = getToolMemory(logger55);
|
|
37875
37944
|
memory.recordLearning({
|
|
37876
37945
|
pattern: `Added paper: ${result.title} (${result.paperId})`,
|
|
37877
37946
|
context: `topic=${input.topic ?? "general"}, priority=${input.priority ?? "unset"}`,
|
|
@@ -37879,7 +37948,7 @@ async function executeResearchAdd(input, logger54) {
|
|
|
37879
37948
|
source: "research_add"
|
|
37880
37949
|
});
|
|
37881
37950
|
} catch {
|
|
37882
|
-
|
|
37951
|
+
logger55.debug("Failed to record learning in session memory");
|
|
37883
37952
|
}
|
|
37884
37953
|
}
|
|
37885
37954
|
const qualityNote = result.success && !input.dryRun ? " [evidence_tier=low \u2014 arXiv preprint, no citation data yet. Run backfill-research-quality.ts to enrich.]" : "";
|
|
@@ -37901,9 +37970,9 @@ function createResearchAddHandler(deps) {
|
|
|
37901
37970
|
});
|
|
37902
37971
|
}
|
|
37903
37972
|
ctx.logger.debug("Adding research paper", { arxivId: validationResult.data.arxivId });
|
|
37904
|
-
const
|
|
37905
|
-
return withToolError("Failed to add paper",
|
|
37906
|
-
const result = await executeResearchAdd(validationResult.data,
|
|
37973
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add" });
|
|
37974
|
+
return withToolError("Failed to add paper", logger55, async () => {
|
|
37975
|
+
const result = await executeResearchAdd(validationResult.data, logger55);
|
|
37907
37976
|
if (!result.success) {
|
|
37908
37977
|
return toolStructuredError({
|
|
37909
37978
|
errorCategory: result.errorCategory ?? "internal",
|
|
@@ -37915,7 +37984,7 @@ function createResearchAddHandler(deps) {
|
|
|
37915
37984
|
};
|
|
37916
37985
|
}
|
|
37917
37986
|
function registerResearchAddTool(server, deps) {
|
|
37918
|
-
const
|
|
37987
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add" });
|
|
37919
37988
|
const toolSchema = {
|
|
37920
37989
|
arxivId: z63.string().regex(/^\d{4}\.\d{4,5}$/).describe('arXiv paper ID (e.g., "2401.12345")'),
|
|
37921
37990
|
topic: z63.string().optional().describe("Research topic to categorize the paper under"),
|
|
@@ -37926,12 +37995,12 @@ function registerResearchAddTool(server, deps) {
|
|
|
37926
37995
|
const secureHandler = createSecureHandler(createResearchAddHandler(deps), {
|
|
37927
37996
|
toolName: "research_add",
|
|
37928
37997
|
rateLimiter: deps.rateLimiter,
|
|
37929
|
-
logger:
|
|
37998
|
+
logger: logger55
|
|
37930
37999
|
});
|
|
37931
38000
|
const timeoutMs = getToolTimeout("research_add", deps.security);
|
|
37932
38001
|
const wrappedHandler = wrapToolWithTimeout("research_add", secureHandler, {
|
|
37933
38002
|
timeoutMs,
|
|
37934
|
-
logger:
|
|
38003
|
+
logger: logger55
|
|
37935
38004
|
});
|
|
37936
38005
|
const outputSchema = {
|
|
37937
38006
|
success: z63.boolean(),
|
|
@@ -37950,7 +38019,7 @@ function registerResearchAddTool(server, deps) {
|
|
|
37950
38019
|
},
|
|
37951
38020
|
toSdkCallback(wrappedHandler)
|
|
37952
38021
|
);
|
|
37953
|
-
|
|
38022
|
+
logger55.info("Registered research_add tool with secure handler and timeout protection");
|
|
37954
38023
|
}
|
|
37955
38024
|
|
|
37956
38025
|
// src/mcp/tools/research-add-source.ts
|
|
@@ -38028,9 +38097,9 @@ function buildResponse2(params) {
|
|
|
38028
38097
|
...params.errorCategory !== void 0 ? { errorCategory: params.errorCategory } : {}
|
|
38029
38098
|
};
|
|
38030
38099
|
}
|
|
38031
|
-
function recordAddSourceLearning(
|
|
38100
|
+
function recordAddSourceLearning(logger55, name, sourceId, type, qualityScore) {
|
|
38032
38101
|
try {
|
|
38033
|
-
const memory = getToolMemory(
|
|
38102
|
+
const memory = getToolMemory(logger55);
|
|
38034
38103
|
memory.recordLearning({
|
|
38035
38104
|
pattern: `Added source: ${name} (${sourceId})`,
|
|
38036
38105
|
context: `type=${type}, quality=${String(qualityScore)}`,
|
|
@@ -38038,7 +38107,7 @@ function recordAddSourceLearning(logger54, name, sourceId, type, qualityScore) {
|
|
|
38038
38107
|
source: "research_add_source"
|
|
38039
38108
|
});
|
|
38040
38109
|
} catch {
|
|
38041
|
-
|
|
38110
|
+
logger55.debug("Failed to record learning in session memory");
|
|
38042
38111
|
}
|
|
38043
38112
|
}
|
|
38044
38113
|
function prepareSource(input) {
|
|
@@ -38046,7 +38115,7 @@ function prepareSource(input) {
|
|
|
38046
38115
|
const score = computeSourceQualityScore(entry);
|
|
38047
38116
|
return { entry, score };
|
|
38048
38117
|
}
|
|
38049
|
-
async function executeResearchAddSource(input,
|
|
38118
|
+
async function executeResearchAddSource(input, logger55) {
|
|
38050
38119
|
const sourceId = generateSourceId(input.url);
|
|
38051
38120
|
const exists = await sourceExistsInRegistry(input.url);
|
|
38052
38121
|
if (exists) {
|
|
@@ -38083,8 +38152,8 @@ async function executeResearchAddSource(input, logger54) {
|
|
|
38083
38152
|
errorCategory: "internal"
|
|
38084
38153
|
});
|
|
38085
38154
|
}
|
|
38086
|
-
recordAddSourceLearning(
|
|
38087
|
-
|
|
38155
|
+
recordAddSourceLearning(logger55, input.name, sourceId, input.type, score);
|
|
38156
|
+
logger55.info("Added research source", { sourceId, name: input.name, qualityScore: score });
|
|
38088
38157
|
return buildResponse2({
|
|
38089
38158
|
success: true,
|
|
38090
38159
|
sourceId,
|
|
@@ -38104,9 +38173,9 @@ function createResearchAddSourceHandler(deps) {
|
|
|
38104
38173
|
});
|
|
38105
38174
|
}
|
|
38106
38175
|
ctx.logger.debug("Adding research source", { url: validationResult.data.url });
|
|
38107
|
-
const
|
|
38108
|
-
return withToolError("Failed to add source",
|
|
38109
|
-
const result = await executeResearchAddSource(validationResult.data,
|
|
38176
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add_source" });
|
|
38177
|
+
return withToolError("Failed to add source", logger55, async () => {
|
|
38178
|
+
const result = await executeResearchAddSource(validationResult.data, logger55);
|
|
38110
38179
|
if (!result.success) {
|
|
38111
38180
|
return toolStructuredError({
|
|
38112
38181
|
errorCategory: result.errorCategory ?? "internal",
|
|
@@ -38118,7 +38187,7 @@ function createResearchAddSourceHandler(deps) {
|
|
|
38118
38187
|
};
|
|
38119
38188
|
}
|
|
38120
38189
|
function registerResearchAddSourceTool(server, deps) {
|
|
38121
|
-
const
|
|
38190
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_add_source" });
|
|
38122
38191
|
const toolSchema = {
|
|
38123
38192
|
url: z64.string().min(1).describe("Source URL"),
|
|
38124
38193
|
name: z64.string().min(1).describe("Display name"),
|
|
@@ -38143,12 +38212,12 @@ function registerResearchAddSourceTool(server, deps) {
|
|
|
38143
38212
|
toolName: "research_add_source",
|
|
38144
38213
|
securityTier: "external",
|
|
38145
38214
|
rateLimiter: deps.rateLimiter,
|
|
38146
|
-
logger:
|
|
38215
|
+
logger: logger55
|
|
38147
38216
|
});
|
|
38148
38217
|
const timeoutMs = getToolTimeout("research_add_source", deps.security);
|
|
38149
38218
|
const wrappedHandler = wrapToolWithTimeout("research_add_source", secureHandler, {
|
|
38150
38219
|
timeoutMs,
|
|
38151
|
-
logger:
|
|
38220
|
+
logger: logger55
|
|
38152
38221
|
});
|
|
38153
38222
|
server.registerTool(
|
|
38154
38223
|
"research_add_source",
|
|
@@ -38215,7 +38284,7 @@ function toDiscoveredItems(sources) {
|
|
|
38215
38284
|
discoveredAt: s.discoveredAt
|
|
38216
38285
|
}));
|
|
38217
38286
|
}
|
|
38218
|
-
async function discoverFromExtendedSource(source, topic, maxResults,
|
|
38287
|
+
async function discoverFromExtendedSource(source, topic, maxResults, logger55, sinceDate) {
|
|
38219
38288
|
let result;
|
|
38220
38289
|
switch (source) {
|
|
38221
38290
|
case "google_ai":
|
|
@@ -38243,7 +38312,7 @@ async function discoverFromExtendedSource(source, topic, maxResults, logger54, s
|
|
|
38243
38312
|
return { items: [], failed: true };
|
|
38244
38313
|
}
|
|
38245
38314
|
if (!result.ok) {
|
|
38246
|
-
|
|
38315
|
+
logger55.warn(`${source} discovery failed`, {
|
|
38247
38316
|
source,
|
|
38248
38317
|
errorCode: result.error.code,
|
|
38249
38318
|
error: result.error.message
|
|
@@ -38283,24 +38352,24 @@ function markExistingItems(items, existingIds) {
|
|
|
38283
38352
|
}
|
|
38284
38353
|
var ARXIV_ORG_SOURCES = /* @__PURE__ */ new Set(["google_ai", "meta_fair", "microsoft", "deepmind"]);
|
|
38285
38354
|
var INDEPENDENT_SOURCES = ["semantic_scholar", "papers_with_code", "openalex"];
|
|
38286
|
-
async function queryExtendedSource(src, input,
|
|
38355
|
+
async function queryExtendedSource(src, input, logger55, acc) {
|
|
38287
38356
|
acc.sources.push(src);
|
|
38288
38357
|
try {
|
|
38289
38358
|
const result = await discoverFromExtendedSource(
|
|
38290
38359
|
src,
|
|
38291
38360
|
input.topic,
|
|
38292
38361
|
input.maxResults,
|
|
38293
|
-
|
|
38362
|
+
logger55,
|
|
38294
38363
|
input.sinceDate
|
|
38295
38364
|
);
|
|
38296
38365
|
if (result.failed) acc.failedSources.push(src);
|
|
38297
38366
|
acc.items = acc.items.concat(result.items);
|
|
38298
38367
|
} catch (error) {
|
|
38299
38368
|
acc.failedSources.push(src);
|
|
38300
|
-
|
|
38369
|
+
logger55.warn("Source discovery failed", { source: src, error: getErrorMessage(error) });
|
|
38301
38370
|
}
|
|
38302
38371
|
}
|
|
38303
|
-
async function queryAllSources(input,
|
|
38372
|
+
async function queryAllSources(input, logger55) {
|
|
38304
38373
|
const acc = { sources: [], failedSources: [], items: [] };
|
|
38305
38374
|
const isAll = input.source === "all";
|
|
38306
38375
|
const shouldQuery = (src) => isAll || input.source === src;
|
|
@@ -38310,11 +38379,11 @@ async function queryAllSources(input, logger54) {
|
|
|
38310
38379
|
if (r.ok) acc.items = acc.items.concat(toDiscoveredItems(r.value));
|
|
38311
38380
|
else {
|
|
38312
38381
|
acc.failedSources.push("arxiv");
|
|
38313
|
-
|
|
38382
|
+
logger55.warn("arxiv discovery failed", { error: r.error.message });
|
|
38314
38383
|
}
|
|
38315
38384
|
}
|
|
38316
38385
|
for (const src of ARXIV_ORG_SOURCES) {
|
|
38317
|
-
if (!isAll && input.source === src) await queryExtendedSource(src, input,
|
|
38386
|
+
if (!isAll && input.source === src) await queryExtendedSource(src, input, logger55, acc);
|
|
38318
38387
|
}
|
|
38319
38388
|
if (shouldQuery("github")) {
|
|
38320
38389
|
acc.sources.push("github");
|
|
@@ -38322,15 +38391,15 @@ async function queryAllSources(input, logger54) {
|
|
|
38322
38391
|
if (r.ok) acc.items = acc.items.concat(toDiscoveredItems(r.value));
|
|
38323
38392
|
else {
|
|
38324
38393
|
acc.failedSources.push("github");
|
|
38325
|
-
|
|
38394
|
+
logger55.warn("github discovery failed", { error: r.error.message });
|
|
38326
38395
|
}
|
|
38327
38396
|
}
|
|
38328
38397
|
for (const src of INDEPENDENT_SOURCES) {
|
|
38329
|
-
if (shouldQuery(src)) await queryExtendedSource(src, input,
|
|
38398
|
+
if (shouldQuery(src)) await queryExtendedSource(src, input, logger55, acc);
|
|
38330
38399
|
}
|
|
38331
38400
|
return acc;
|
|
38332
38401
|
}
|
|
38333
|
-
async function executeDiscovery(rawInput,
|
|
38402
|
+
async function executeDiscovery(rawInput, logger55) {
|
|
38334
38403
|
const input = {
|
|
38335
38404
|
...rawInput,
|
|
38336
38405
|
topic: normalizeTopicToCanonical(rawInput.topic)
|
|
@@ -38340,7 +38409,7 @@ async function executeDiscovery(rawInput, logger54) {
|
|
|
38340
38409
|
sources: sourcesToQuery,
|
|
38341
38410
|
failedSources,
|
|
38342
38411
|
items: allItems
|
|
38343
|
-
} = await queryAllSources(input,
|
|
38412
|
+
} = await queryAllSources(input, logger55);
|
|
38344
38413
|
markExistingItems(allItems, existingIds);
|
|
38345
38414
|
const totalFound = allItems.length;
|
|
38346
38415
|
const inRegistry = allItems.filter((i) => i.alreadyInRegistry).length;
|
|
@@ -38352,7 +38421,7 @@ async function executeDiscovery(rawInput, logger54) {
|
|
|
38352
38421
|
).slice(0, input.maxResults);
|
|
38353
38422
|
const filteredOut = totalFound - inRegistry - relevantItems.length;
|
|
38354
38423
|
if (filteredOut > 0) {
|
|
38355
|
-
|
|
38424
|
+
logger55.debug("Filtered out irrelevant results", {
|
|
38356
38425
|
threshold,
|
|
38357
38426
|
filteredOut,
|
|
38358
38427
|
remaining: relevantItems.length
|
|
@@ -38437,10 +38506,10 @@ function createResearchDiscoverHandler(deps) {
|
|
|
38437
38506
|
topic: validationResult.data.topic,
|
|
38438
38507
|
source: validationResult.data.source
|
|
38439
38508
|
});
|
|
38440
|
-
const
|
|
38509
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_discover" });
|
|
38441
38510
|
const startMs = Date.now();
|
|
38442
|
-
const response = await withToolError("Discovery failed",
|
|
38443
|
-
const result = await executeDiscovery(validationResult.data,
|
|
38511
|
+
const response = await withToolError("Discovery failed", logger55, async () => {
|
|
38512
|
+
const result = await executeDiscovery(validationResult.data, logger55);
|
|
38444
38513
|
return toolSuccessStructured(result);
|
|
38445
38514
|
});
|
|
38446
38515
|
const durationMs = Date.now() - startMs;
|
|
@@ -38454,7 +38523,7 @@ function createResearchDiscoverHandler(deps) {
|
|
|
38454
38523
|
};
|
|
38455
38524
|
}
|
|
38456
38525
|
function registerResearchDiscoverTool(server, deps) {
|
|
38457
|
-
const
|
|
38526
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_discover" });
|
|
38458
38527
|
const toolSchema = {
|
|
38459
38528
|
topic: z65.string().min(1).max(200).describe("Research topic to search for"),
|
|
38460
38529
|
source: z65.enum([
|
|
@@ -38477,12 +38546,12 @@ function registerResearchDiscoverTool(server, deps) {
|
|
|
38477
38546
|
const secureHandler = createSecureHandler(createResearchDiscoverHandler(deps), {
|
|
38478
38547
|
toolName: "research_discover",
|
|
38479
38548
|
rateLimiter: deps.rateLimiter,
|
|
38480
|
-
logger:
|
|
38549
|
+
logger: logger55
|
|
38481
38550
|
});
|
|
38482
38551
|
const timeoutMs = getToolTimeout("research_discover", deps.security);
|
|
38483
38552
|
const wrappedHandler = wrapToolWithTimeout("research_discover", secureHandler, {
|
|
38484
38553
|
timeoutMs,
|
|
38485
|
-
logger:
|
|
38554
|
+
logger: logger55
|
|
38486
38555
|
});
|
|
38487
38556
|
server.registerTool(
|
|
38488
38557
|
"research_discover",
|
|
@@ -38494,7 +38563,7 @@ function registerResearchDiscoverTool(server, deps) {
|
|
|
38494
38563
|
},
|
|
38495
38564
|
toSdkCallback(wrappedHandler)
|
|
38496
38565
|
);
|
|
38497
|
-
|
|
38566
|
+
logger55.info("Registered research_discover tool with secure handler and timeout protection");
|
|
38498
38567
|
}
|
|
38499
38568
|
var RESEARCH_DISCOVER_OUTPUT_SCHEMA = {
|
|
38500
38569
|
topic: z65.string().optional(),
|
|
@@ -38748,15 +38817,15 @@ function createResearchAnalyzeHandler(deps) {
|
|
|
38748
38817
|
ctx.logger.debug("Analyzing research registry", {
|
|
38749
38818
|
focus: validationResult.data.focus
|
|
38750
38819
|
});
|
|
38751
|
-
const
|
|
38752
|
-
return withToolError("Analysis failed",
|
|
38820
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_analyze" });
|
|
38821
|
+
return withToolError("Analysis failed", logger55, async () => {
|
|
38753
38822
|
const result = await executeAnalysis(validationResult.data);
|
|
38754
38823
|
return toolSuccessStructured(result);
|
|
38755
38824
|
});
|
|
38756
38825
|
};
|
|
38757
38826
|
}
|
|
38758
38827
|
function registerResearchAnalyzeTool(server, deps) {
|
|
38759
|
-
const
|
|
38828
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_analyze" });
|
|
38760
38829
|
const toolSchema = {
|
|
38761
38830
|
focus: z66.enum(["gaps", "trends", "priorities", "stale", "coverage"]).describe("Analysis focus area"),
|
|
38762
38831
|
topic: z66.string().optional().describe("Optional topic filter")
|
|
@@ -38765,12 +38834,12 @@ function registerResearchAnalyzeTool(server, deps) {
|
|
|
38765
38834
|
const secureHandler = createSecureHandler(createResearchAnalyzeHandler(deps), {
|
|
38766
38835
|
toolName: "research_analyze",
|
|
38767
38836
|
rateLimiter: deps.rateLimiter,
|
|
38768
|
-
logger:
|
|
38837
|
+
logger: logger55
|
|
38769
38838
|
});
|
|
38770
38839
|
const timeoutMs = getToolTimeout("research_analyze", deps.security);
|
|
38771
38840
|
const wrappedHandler = wrapToolWithTimeout("research_analyze", secureHandler, {
|
|
38772
38841
|
timeoutMs,
|
|
38773
|
-
logger:
|
|
38842
|
+
logger: logger55
|
|
38774
38843
|
});
|
|
38775
38844
|
const outputSchema = {
|
|
38776
38845
|
focus: z66.string().optional(),
|
|
@@ -38788,7 +38857,7 @@ function registerResearchAnalyzeTool(server, deps) {
|
|
|
38788
38857
|
},
|
|
38789
38858
|
toSdkCallback(wrappedHandler)
|
|
38790
38859
|
);
|
|
38791
|
-
|
|
38860
|
+
logger55.info("Registered research_analyze tool with secure handler and timeout protection");
|
|
38792
38861
|
}
|
|
38793
38862
|
|
|
38794
38863
|
// src/mcp/tools/research-catalog-review.ts
|
|
@@ -38811,7 +38880,7 @@ function handleList() {
|
|
|
38811
38880
|
data: { pending, count: pending.length }
|
|
38812
38881
|
};
|
|
38813
38882
|
}
|
|
38814
|
-
async function approveArxivRef(identifier, topic, shouldCreateIssue,
|
|
38883
|
+
async function approveArxivRef(identifier, topic, shouldCreateIssue, logger55) {
|
|
38815
38884
|
const catalog = getAutoCatalog();
|
|
38816
38885
|
const exists = await paperExists(identifier);
|
|
38817
38886
|
if (exists) {
|
|
@@ -38823,7 +38892,7 @@ async function approveArxivRef(identifier, topic, shouldCreateIssue, logger54) {
|
|
|
38823
38892
|
if (!result.success) {
|
|
38824
38893
|
return { action: "approve", success: false, message: `Failed: ${result.message}` };
|
|
38825
38894
|
}
|
|
38826
|
-
|
|
38895
|
+
logger55.info("Approved paper", { paperId: result.paperId });
|
|
38827
38896
|
if (shouldCreateIssue) {
|
|
38828
38897
|
const body = formatResearchIssueBody([
|
|
38829
38898
|
{
|
|
@@ -38847,11 +38916,11 @@ async function approveArxivRef(identifier, topic, shouldCreateIssue, logger54) {
|
|
|
38847
38916
|
data: { ...result, issueUrl: issueResult.value.url }
|
|
38848
38917
|
};
|
|
38849
38918
|
}
|
|
38850
|
-
|
|
38919
|
+
logger55.warn("Issue creation failed after approve", { error: issueResult.error.message });
|
|
38851
38920
|
}
|
|
38852
38921
|
return { action: "approve", success: true, message: `Added: ${result.title}`, data: result };
|
|
38853
38922
|
}
|
|
38854
|
-
async function handleApprove(input,
|
|
38923
|
+
async function handleApprove(input, logger55) {
|
|
38855
38924
|
if (input.identifier === void 0 || input.identifier === "") {
|
|
38856
38925
|
return { action: "approve", success: false, message: "identifier is required" };
|
|
38857
38926
|
}
|
|
@@ -38865,7 +38934,7 @@ async function handleApprove(input, logger54) {
|
|
|
38865
38934
|
};
|
|
38866
38935
|
}
|
|
38867
38936
|
if (ref.type === "arxiv") {
|
|
38868
|
-
return approveArxivRef(ref.identifier, input.topic, input.createIssue,
|
|
38937
|
+
return approveArxivRef(ref.identifier, input.topic, input.createIssue, logger55);
|
|
38869
38938
|
}
|
|
38870
38939
|
catalog.markReviewed(ref.identifier);
|
|
38871
38940
|
return { action: "approve", success: true, message: `Reviewed: ${ref.identifier}` };
|
|
@@ -38896,12 +38965,12 @@ function handleFlush() {
|
|
|
38896
38965
|
message: `Flushed ${String(count)} references from catalog`
|
|
38897
38966
|
};
|
|
38898
38967
|
}
|
|
38899
|
-
async function executeCatalogReview(input,
|
|
38968
|
+
async function executeCatalogReview(input, logger55) {
|
|
38900
38969
|
switch (input.action) {
|
|
38901
38970
|
case "list":
|
|
38902
38971
|
return handleList();
|
|
38903
38972
|
case "approve":
|
|
38904
|
-
return handleApprove(input,
|
|
38973
|
+
return handleApprove(input, logger55);
|
|
38905
38974
|
case "dismiss":
|
|
38906
38975
|
return handleDismiss(input);
|
|
38907
38976
|
case "flush":
|
|
@@ -38918,9 +38987,9 @@ function createCatalogReviewHandler(deps) {
|
|
|
38918
38987
|
});
|
|
38919
38988
|
}
|
|
38920
38989
|
ctx.logger.debug("Catalog review", { action: validationResult.data.action });
|
|
38921
|
-
const
|
|
38922
|
-
return withToolError("Catalog review failed",
|
|
38923
|
-
const result = await executeCatalogReview(validationResult.data,
|
|
38990
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_catalog_review" });
|
|
38991
|
+
return withToolError("Catalog review failed", logger55, async () => {
|
|
38992
|
+
const result = await executeCatalogReview(validationResult.data, logger55);
|
|
38924
38993
|
if (!result.success) {
|
|
38925
38994
|
return toolStructuredError({ errorCategory: "validation", message: result.message });
|
|
38926
38995
|
}
|
|
@@ -38929,7 +38998,7 @@ function createCatalogReviewHandler(deps) {
|
|
|
38929
38998
|
};
|
|
38930
38999
|
}
|
|
38931
39000
|
function registerResearchCatalogReviewTool(server, deps) {
|
|
38932
|
-
const
|
|
39001
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_catalog_review" });
|
|
38933
39002
|
const toolSchema = {
|
|
38934
39003
|
action: z67.enum(["list", "approve", "dismiss", "flush"]).describe("Action to perform on cataloged references"),
|
|
38935
39004
|
identifier: z67.string().optional().describe("Reference identifier for approve/dismiss"),
|
|
@@ -38940,12 +39009,12 @@ function registerResearchCatalogReviewTool(server, deps) {
|
|
|
38940
39009
|
const secureHandler = createSecureHandler(createCatalogReviewHandler(deps), {
|
|
38941
39010
|
toolName: "research_catalog_review",
|
|
38942
39011
|
rateLimiter: deps.rateLimiter,
|
|
38943
|
-
logger:
|
|
39012
|
+
logger: logger55
|
|
38944
39013
|
});
|
|
38945
39014
|
const timeoutMs = getToolTimeout("research_catalog_review", deps.security);
|
|
38946
39015
|
const wrappedHandler = wrapToolWithTimeout("research_catalog_review", secureHandler, {
|
|
38947
39016
|
timeoutMs,
|
|
38948
|
-
logger:
|
|
39017
|
+
logger: logger55
|
|
38949
39018
|
});
|
|
38950
39019
|
const outputSchema = {
|
|
38951
39020
|
action: z67.string().optional(),
|
|
@@ -38963,7 +39032,7 @@ function registerResearchCatalogReviewTool(server, deps) {
|
|
|
38963
39032
|
},
|
|
38964
39033
|
toSdkCallback(wrappedHandler)
|
|
38965
39034
|
);
|
|
38966
|
-
|
|
39035
|
+
logger55.info("Registered research_catalog_review tool");
|
|
38967
39036
|
}
|
|
38968
39037
|
|
|
38969
39038
|
// src/mcp/tools/research-synthesize.ts
|
|
@@ -38980,8 +39049,8 @@ function createResearchSynthesizeHandler(deps) {
|
|
|
38980
39049
|
message: `Validation error: ${formatZodError(validationResult.error)}`
|
|
38981
39050
|
});
|
|
38982
39051
|
}
|
|
38983
|
-
const
|
|
38984
|
-
return withToolError("Synthesis failed",
|
|
39052
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_synthesize" });
|
|
39053
|
+
return withToolError("Synthesis failed", logger55, async () => {
|
|
38985
39054
|
const result = await synthesizeResearch(validationResult.data.topic);
|
|
38986
39055
|
if (!result.ok) {
|
|
38987
39056
|
return toolStructuredError({
|
|
@@ -38994,7 +39063,7 @@ function createResearchSynthesizeHandler(deps) {
|
|
|
38994
39063
|
};
|
|
38995
39064
|
}
|
|
38996
39065
|
function registerResearchSynthesizeTool(server, deps) {
|
|
38997
|
-
const
|
|
39066
|
+
const logger55 = deps.logger ?? createLogger({ tool: "research_synthesize" });
|
|
38998
39067
|
const toolSchema = {
|
|
38999
39068
|
topic: z68.string().optional().describe("Optional topic filter for single-cluster synthesis")
|
|
39000
39069
|
};
|
|
@@ -39002,12 +39071,12 @@ function registerResearchSynthesizeTool(server, deps) {
|
|
|
39002
39071
|
const secureHandler = createSecureHandler(createResearchSynthesizeHandler(deps), {
|
|
39003
39072
|
toolName: "research_synthesize",
|
|
39004
39073
|
rateLimiter: deps.rateLimiter,
|
|
39005
|
-
logger:
|
|
39074
|
+
logger: logger55
|
|
39006
39075
|
});
|
|
39007
39076
|
const timeoutMs = getToolTimeout("research_synthesize", deps.security);
|
|
39008
39077
|
const wrappedHandler = wrapToolWithTimeout("research_synthesize", secureHandler, {
|
|
39009
39078
|
timeoutMs,
|
|
39010
|
-
logger:
|
|
39079
|
+
logger: logger55
|
|
39011
39080
|
});
|
|
39012
39081
|
const outputSchema = {
|
|
39013
39082
|
clusters: z68.array(z68.unknown()).optional(),
|
|
@@ -39025,7 +39094,7 @@ function registerResearchSynthesizeTool(server, deps) {
|
|
|
39025
39094
|
},
|
|
39026
39095
|
toSdkCallback(wrappedHandler)
|
|
39027
39096
|
);
|
|
39028
|
-
|
|
39097
|
+
logger55.info("Registered research_synthesize tool");
|
|
39029
39098
|
}
|
|
39030
39099
|
|
|
39031
39100
|
// src/mcp/tools/issue-triage-tool.ts
|
|
@@ -39085,7 +39154,7 @@ function createIssueTriageHandler(_deps) {
|
|
|
39085
39154
|
};
|
|
39086
39155
|
}
|
|
39087
39156
|
function registerIssueTriageTool(server, deps) {
|
|
39088
|
-
const
|
|
39157
|
+
const logger55 = deps.logger ?? createLogger({ tool: "issue_triage" });
|
|
39089
39158
|
const toolSchema = {
|
|
39090
39159
|
issueUrl: z69.string().min(1).describe("GitHub issue URL (e.g., https://github.com/owner/repo/issues/123)"),
|
|
39091
39160
|
dryRun: z69.boolean().optional().default(true).describe("Read-only mode (default: true)")
|
|
@@ -39095,19 +39164,19 @@ function registerIssueTriageTool(server, deps) {
|
|
|
39095
39164
|
toolName: "issue_triage",
|
|
39096
39165
|
securityTier: "external",
|
|
39097
39166
|
rateLimiter: deps.rateLimiter,
|
|
39098
|
-
logger:
|
|
39167
|
+
logger: logger55
|
|
39099
39168
|
});
|
|
39100
39169
|
const timeoutMs = getToolTimeout("issue_triage", deps.security);
|
|
39101
39170
|
const wrappedHandler = wrapToolWithTimeout("issue_triage", secureHandler, {
|
|
39102
39171
|
timeoutMs,
|
|
39103
|
-
logger:
|
|
39172
|
+
logger: logger55
|
|
39104
39173
|
});
|
|
39105
39174
|
server.registerTool(
|
|
39106
39175
|
"issue_triage",
|
|
39107
39176
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("issue_triage") },
|
|
39108
39177
|
toSdkCallback(wrappedHandler)
|
|
39109
39178
|
);
|
|
39110
|
-
|
|
39179
|
+
logger55.info("Registered issue_triage tool with secure handler and timeout protection");
|
|
39111
39180
|
}
|
|
39112
39181
|
var triageLogger = createLogger({ tool: "issue-triage" });
|
|
39113
39182
|
function recordTriageSuccess(category, confidence, durationMs) {
|
|
@@ -39345,7 +39414,7 @@ function createEventCollector(events, enableAuditTrail) {
|
|
|
39345
39414
|
auditBridge?.(event);
|
|
39346
39415
|
};
|
|
39347
39416
|
}
|
|
39348
|
-
async function handleRunGraphWorkflow(input,
|
|
39417
|
+
async function handleRunGraphWorkflow(input, logger55) {
|
|
39349
39418
|
const startTime = getTimeProvider().now();
|
|
39350
39419
|
const resolved = resolveGraph(input.workflow, startTime);
|
|
39351
39420
|
if (!resolved.ok) return resolved.error;
|
|
@@ -39353,7 +39422,7 @@ async function handleRunGraphWorkflow(input, logger54) {
|
|
|
39353
39422
|
const checkpointStore = input.enableCheckpointing ? createCheckpointStore() : void 0;
|
|
39354
39423
|
const onEvent = createEventCollector(events, input.enableAuditTrail);
|
|
39355
39424
|
const executionId = `graph-${input.workflow}-${String(Date.now())}`;
|
|
39356
|
-
|
|
39425
|
+
logger55.info("Executing graph workflow", {
|
|
39357
39426
|
workflow: input.workflow,
|
|
39358
39427
|
executionId,
|
|
39359
39428
|
checkpointing: input.enableCheckpointing,
|
|
@@ -39396,7 +39465,7 @@ var GRAPH_WORKFLOW_SCHEMA = {
|
|
|
39396
39465
|
enableCheckpointing: z70.boolean().optional().describe("Enable checkpoint saving"),
|
|
39397
39466
|
enableAuditTrail: z70.boolean().optional().describe("Enable audit trail logging")
|
|
39398
39467
|
};
|
|
39399
|
-
function createGraphWorkflowHandler(
|
|
39468
|
+
function createGraphWorkflowHandler(logger55, notifier) {
|
|
39400
39469
|
return async (args, _ctx) => {
|
|
39401
39470
|
const parsed = RunGraphWorkflowInputSchema.safeParse(args);
|
|
39402
39471
|
if (!parsed.success) {
|
|
@@ -39412,7 +39481,7 @@ function createGraphWorkflowHandler(logger54, notifier) {
|
|
|
39412
39481
|
event: "graph_workflow_start",
|
|
39413
39482
|
workflow: parsed.data.workflow
|
|
39414
39483
|
});
|
|
39415
|
-
const result = await handleRunGraphWorkflow(parsed.data,
|
|
39484
|
+
const result = await handleRunGraphWorkflow(parsed.data, logger55);
|
|
39416
39485
|
const succeeded = result.status === "completed";
|
|
39417
39486
|
notifier.info("run_graph_workflow", {
|
|
39418
39487
|
event: succeeded ? "graph_workflow_complete" : "graph_workflow_failed",
|
|
@@ -39426,16 +39495,16 @@ function createGraphWorkflowHandler(logger54, notifier) {
|
|
|
39426
39495
|
};
|
|
39427
39496
|
}
|
|
39428
39497
|
function registerRunGraphWorkflowTool(server, deps) {
|
|
39429
|
-
const
|
|
39498
|
+
const logger55 = deps.logger ?? createLogger({ tool: "run_graph_workflow" });
|
|
39430
39499
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
39431
|
-
const handler3 = createGraphWorkflowHandler(
|
|
39500
|
+
const handler3 = createGraphWorkflowHandler(logger55, notifier);
|
|
39432
39501
|
const secureHandler = createSecureHandler(handler3, {
|
|
39433
39502
|
toolName: "run_graph_workflow",
|
|
39434
39503
|
rateLimiter: deps.rateLimiter,
|
|
39435
|
-
logger:
|
|
39504
|
+
logger: logger55
|
|
39436
39505
|
});
|
|
39437
39506
|
const timeoutMs = getToolTimeout("run_graph_workflow", deps.security);
|
|
39438
|
-
const wrapped = wrapToolWithTimeout("run_graph_workflow", secureHandler, { timeoutMs, logger:
|
|
39507
|
+
const wrapped = wrapToolWithTimeout("run_graph_workflow", secureHandler, { timeoutMs, logger: logger55 });
|
|
39439
39508
|
server.registerTool(
|
|
39440
39509
|
"run_graph_workflow",
|
|
39441
39510
|
{
|
|
@@ -39445,7 +39514,7 @@ function registerRunGraphWorkflowTool(server, deps) {
|
|
|
39445
39514
|
},
|
|
39446
39515
|
toSdkCallback(wrapped)
|
|
39447
39516
|
);
|
|
39448
|
-
|
|
39517
|
+
logger55.info("Registered run_graph_workflow tool");
|
|
39449
39518
|
}
|
|
39450
39519
|
function toEventSummary(event) {
|
|
39451
39520
|
const hasNodeId = "nodeId" in event;
|
|
@@ -39997,7 +40066,7 @@ var ExecuteSpecInputSchema = z71.object({
|
|
|
39997
40066
|
spec: z71.string().min(1).max(5e4).describe("Markdown specification to execute"),
|
|
39998
40067
|
dryRun: z71.boolean().optional().default(false).describe("Parse and decompose only")
|
|
39999
40068
|
});
|
|
40000
|
-
function createDryRunResponse(input,
|
|
40069
|
+
function createDryRunResponse(input, logger55) {
|
|
40001
40070
|
const parseResult2 = parseSpec(input.spec);
|
|
40002
40071
|
if (!parseResult2.ok) {
|
|
40003
40072
|
return toolStructuredError({
|
|
@@ -40012,14 +40081,14 @@ function createDryRunResponse(input, logger54) {
|
|
|
40012
40081
|
message: `Decompose error: ${dagResult.error.message}`
|
|
40013
40082
|
});
|
|
40014
40083
|
}
|
|
40015
|
-
|
|
40084
|
+
logger55.info("Dry run completed", {
|
|
40016
40085
|
title: parseResult2.value.title,
|
|
40017
40086
|
nodes: dagResult.value.nodes.length
|
|
40018
40087
|
});
|
|
40019
40088
|
const output2 = { mode: "dry_run", spec: parseResult2.value, dag: dagResult.value };
|
|
40020
40089
|
return toolSuccess(JSON.stringify(output2, null, 2));
|
|
40021
40090
|
}
|
|
40022
|
-
async function createFullResponse(input,
|
|
40091
|
+
async function createFullResponse(input, logger55) {
|
|
40023
40092
|
const startMs = Date.now();
|
|
40024
40093
|
const result = await executeSpec(input.spec);
|
|
40025
40094
|
const durationMs = Date.now() - startMs;
|
|
@@ -40032,7 +40101,7 @@ async function createFullResponse(input, logger54) {
|
|
|
40032
40101
|
}
|
|
40033
40102
|
const analysis = analyzeFailures(result.value);
|
|
40034
40103
|
const satisfaction = result.value.validation.satisfaction;
|
|
40035
|
-
|
|
40104
|
+
logger55.info("Spec execution completed", {
|
|
40036
40105
|
satisfaction,
|
|
40037
40106
|
passed: analysis.ok ? analysis.value.passed : false
|
|
40038
40107
|
});
|
|
@@ -40046,7 +40115,7 @@ async function createFullResponse(input, logger54) {
|
|
|
40046
40115
|
return toolSuccess(JSON.stringify(output2, null, 2));
|
|
40047
40116
|
}
|
|
40048
40117
|
function registerExecuteSpecTool(server, deps) {
|
|
40049
|
-
const
|
|
40118
|
+
const logger55 = deps.logger ?? createLogger({ tool: "execute_spec" });
|
|
40050
40119
|
const handler3 = async (args, _ctx) => {
|
|
40051
40120
|
const parsed = ExecuteSpecInputSchema.safeParse(args);
|
|
40052
40121
|
if (!parsed.success) {
|
|
@@ -40056,17 +40125,17 @@ function registerExecuteSpecTool(server, deps) {
|
|
|
40056
40125
|
});
|
|
40057
40126
|
}
|
|
40058
40127
|
if (parsed.data.dryRun) {
|
|
40059
|
-
return createDryRunResponse(parsed.data,
|
|
40128
|
+
return createDryRunResponse(parsed.data, logger55);
|
|
40060
40129
|
}
|
|
40061
|
-
return createFullResponse(parsed.data,
|
|
40130
|
+
return createFullResponse(parsed.data, logger55);
|
|
40062
40131
|
};
|
|
40063
40132
|
const secureHandler = createSecureHandler(handler3, {
|
|
40064
40133
|
toolName: "execute_spec",
|
|
40065
40134
|
rateLimiter: deps.rateLimiter,
|
|
40066
|
-
logger:
|
|
40135
|
+
logger: logger55
|
|
40067
40136
|
});
|
|
40068
40137
|
const timeoutMs = getToolTimeout("execute_spec", deps.security);
|
|
40069
|
-
const wrapped = wrapToolWithTimeout("execute_spec", secureHandler, { timeoutMs, logger:
|
|
40138
|
+
const wrapped = wrapToolWithTimeout("execute_spec", secureHandler, { timeoutMs, logger: logger55 });
|
|
40070
40139
|
const toolSchema = {
|
|
40071
40140
|
spec: z71.string().min(1).max(5e4).describe(
|
|
40072
40141
|
'Markdown specification to execute. Must contain "## Requirements" and "## Acceptance Criteria" sections.'
|
|
@@ -40079,7 +40148,7 @@ function registerExecuteSpecTool(server, deps) {
|
|
|
40079
40148
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("execute_spec") },
|
|
40080
40149
|
toSdkCallback(wrapped)
|
|
40081
40150
|
);
|
|
40082
|
-
|
|
40151
|
+
logger55.info("Registered execute_spec tool");
|
|
40083
40152
|
}
|
|
40084
40153
|
var specLogger = createLogger({ tool: "execute-spec" });
|
|
40085
40154
|
function recordSpecSuccess(satisfaction, durationMs) {
|
|
@@ -40141,29 +40210,29 @@ var MemoryQueryInputSchema = z72.object({
|
|
|
40141
40210
|
});
|
|
40142
40211
|
var reflectionCache;
|
|
40143
40212
|
var reflectionAdapter;
|
|
40144
|
-
function getReflectiveRetriever(
|
|
40213
|
+
function getReflectiveRetriever(logger55) {
|
|
40145
40214
|
const enabled = isReflectiveMemoryEnabled();
|
|
40146
40215
|
const shadow = isReflectiveShadowMode();
|
|
40147
40216
|
if (!enabled && !shadow) return void 0;
|
|
40148
40217
|
if (reflectionAdapter === void 0) {
|
|
40149
40218
|
try {
|
|
40150
|
-
const registry = getGlobalRegistry({ logger:
|
|
40219
|
+
const registry = getGlobalRegistry({ logger: logger55 });
|
|
40151
40220
|
reflectionAdapter = registry.getDefault();
|
|
40152
40221
|
} catch {
|
|
40153
|
-
|
|
40222
|
+
logger55.warn("No adapter for reflection, using keyword retrieval");
|
|
40154
40223
|
return void 0;
|
|
40155
40224
|
}
|
|
40156
40225
|
}
|
|
40157
40226
|
reflectionCache ??= new ReflectionCache();
|
|
40158
40227
|
return new ReflectiveRetriever({
|
|
40159
40228
|
adapter: reflectionAdapter,
|
|
40160
|
-
logger:
|
|
40229
|
+
logger: logger55,
|
|
40161
40230
|
shadowMode: shadow,
|
|
40162
40231
|
cache: reflectionCache
|
|
40163
40232
|
});
|
|
40164
40233
|
}
|
|
40165
|
-
async function resolveReflection(query,
|
|
40166
|
-
const retriever = getReflectiveRetriever(
|
|
40234
|
+
async function resolveReflection(query, logger55) {
|
|
40235
|
+
const retriever = getReflectiveRetriever(logger55);
|
|
40167
40236
|
if (retriever === void 0) return { effectiveQuery: query };
|
|
40168
40237
|
const reflection = await retriever.enhance(query);
|
|
40169
40238
|
const reflected = reflection.reflected;
|
|
@@ -40175,14 +40244,14 @@ async function resolveReflection(query, logger54) {
|
|
|
40175
40244
|
reflection
|
|
40176
40245
|
};
|
|
40177
40246
|
}
|
|
40178
|
-
async function executeMemoryQuery(input,
|
|
40247
|
+
async function executeMemoryQuery(input, logger55) {
|
|
40179
40248
|
const toolMemory = getToolMemory();
|
|
40180
40249
|
const { effectiveQuery, expandedQuery, reflection } = await resolveReflection(
|
|
40181
40250
|
input.query,
|
|
40182
|
-
|
|
40251
|
+
logger55
|
|
40183
40252
|
);
|
|
40184
40253
|
const results = await toolMemory.queryBySource(input.source, effectiveQuery, input.limit);
|
|
40185
|
-
|
|
40254
|
+
logger55.debug("Memory query executed", {
|
|
40186
40255
|
query: input.query,
|
|
40187
40256
|
effectiveQuery: effectiveQuery !== input.query ? effectiveQuery : void 0,
|
|
40188
40257
|
resultCount: results.length,
|
|
@@ -40212,7 +40281,7 @@ async function memoryQueryHandler(args, ctx) {
|
|
|
40212
40281
|
});
|
|
40213
40282
|
}
|
|
40214
40283
|
function registerMemoryQueryTool(server, deps) {
|
|
40215
|
-
const
|
|
40284
|
+
const logger55 = deps.logger ?? createLogger({ tool: "memory_query" });
|
|
40216
40285
|
const toolSchema = {
|
|
40217
40286
|
query: z72.string().min(1).max(500).describe("Search query to match against memory contents"),
|
|
40218
40287
|
limit: z72.number().int().min(1).max(50).optional().describe("Maximum results to return (default: 10, max: 50)"),
|
|
@@ -40222,10 +40291,10 @@ function registerMemoryQueryTool(server, deps) {
|
|
|
40222
40291
|
const secureHandler = createSecureHandler(memoryQueryHandler, {
|
|
40223
40292
|
toolName: "memory_query",
|
|
40224
40293
|
rateLimiter: deps.rateLimiter,
|
|
40225
|
-
logger:
|
|
40294
|
+
logger: logger55
|
|
40226
40295
|
});
|
|
40227
40296
|
const timeoutMs = getToolTimeout("memory_query", deps.security);
|
|
40228
|
-
const wrappedHandler = wrapToolWithTimeout("memory_query", secureHandler, { timeoutMs, logger:
|
|
40297
|
+
const wrappedHandler = wrapToolWithTimeout("memory_query", secureHandler, { timeoutMs, logger: logger55 });
|
|
40229
40298
|
const outputSchema = {
|
|
40230
40299
|
query: z72.string(),
|
|
40231
40300
|
expandedQuery: z72.string().optional(),
|
|
@@ -40243,7 +40312,7 @@ function registerMemoryQueryTool(server, deps) {
|
|
|
40243
40312
|
},
|
|
40244
40313
|
toSdkCallback(wrappedHandler)
|
|
40245
40314
|
);
|
|
40246
|
-
|
|
40315
|
+
logger55.info("Registered memory_query tool");
|
|
40247
40316
|
}
|
|
40248
40317
|
|
|
40249
40318
|
// src/mcp/tools/memory-stats.ts
|
|
@@ -40251,7 +40320,7 @@ import { z as z73 } from "zod";
|
|
|
40251
40320
|
var MemoryStatsInputSchema = z73.object({
|
|
40252
40321
|
includeDecay: z73.boolean().optional().default(true).describe("Include decay statistics (default: true)")
|
|
40253
40322
|
});
|
|
40254
|
-
async function collectMemoryStats(input,
|
|
40323
|
+
async function collectMemoryStats(input, logger55) {
|
|
40255
40324
|
const toolMemory = getToolMemory();
|
|
40256
40325
|
const sessionStats = {
|
|
40257
40326
|
learningsCount: 0,
|
|
@@ -40288,8 +40357,8 @@ async function collectMemoryStats(input, logger54) {
|
|
|
40288
40357
|
mobimem: toolMemory.isMobiMemAvailable(),
|
|
40289
40358
|
decay: toolMemory.isDecayManagerAvailable()
|
|
40290
40359
|
};
|
|
40291
|
-
const registry = await collectRegistryStats(
|
|
40292
|
-
|
|
40360
|
+
const registry = await collectRegistryStats(logger55);
|
|
40361
|
+
logger55.debug("Memory stats collected", { backends, registryDomains: registry.length });
|
|
40293
40362
|
return {
|
|
40294
40363
|
backends,
|
|
40295
40364
|
session: sessionStats,
|
|
@@ -40301,7 +40370,7 @@ async function collectMemoryStats(input, logger54) {
|
|
|
40301
40370
|
collectedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
40302
40371
|
};
|
|
40303
40372
|
}
|
|
40304
|
-
async function collectRegistryStats(
|
|
40373
|
+
async function collectRegistryStats(logger55) {
|
|
40305
40374
|
const registry = getMemoryRegistry();
|
|
40306
40375
|
const rows = [];
|
|
40307
40376
|
for (const domain of registry.domains()) {
|
|
@@ -40312,7 +40381,7 @@ async function collectRegistryStats(logger54) {
|
|
|
40312
40381
|
rows.push({ domain, count: s.count, error: null });
|
|
40313
40382
|
} catch (error) {
|
|
40314
40383
|
const message = error instanceof Error ? error.message : String(error);
|
|
40315
|
-
|
|
40384
|
+
logger55.debug("Registry domain stats failed", { domain, error: message });
|
|
40316
40385
|
rows.push({ domain, count: null, error: message });
|
|
40317
40386
|
}
|
|
40318
40387
|
}
|
|
@@ -40332,7 +40401,7 @@ async function memoryStatsHandler(args, ctx) {
|
|
|
40332
40401
|
});
|
|
40333
40402
|
}
|
|
40334
40403
|
function registerMemoryStatsTool(server, deps) {
|
|
40335
|
-
const
|
|
40404
|
+
const logger55 = deps.logger ?? createLogger({ tool: "memory_stats" });
|
|
40336
40405
|
const toolSchema = {
|
|
40337
40406
|
includeDecay: z73.boolean().optional().describe("Include decay statistics (default: true)")
|
|
40338
40407
|
};
|
|
@@ -40340,10 +40409,10 @@ function registerMemoryStatsTool(server, deps) {
|
|
|
40340
40409
|
const secureHandler = createSecureHandler(memoryStatsHandler, {
|
|
40341
40410
|
toolName: "memory_stats",
|
|
40342
40411
|
rateLimiter: deps.rateLimiter,
|
|
40343
|
-
logger:
|
|
40412
|
+
logger: logger55
|
|
40344
40413
|
});
|
|
40345
40414
|
const timeoutMs = getToolTimeout("memory_stats", deps.security);
|
|
40346
|
-
const wrappedHandler = wrapToolWithTimeout("memory_stats", secureHandler, { timeoutMs, logger:
|
|
40415
|
+
const wrappedHandler = wrapToolWithTimeout("memory_stats", secureHandler, { timeoutMs, logger: logger55 });
|
|
40347
40416
|
const outputSchema = {
|
|
40348
40417
|
backends: z73.unknown(),
|
|
40349
40418
|
session: z73.unknown().optional(),
|
|
@@ -40364,7 +40433,7 @@ function registerMemoryStatsTool(server, deps) {
|
|
|
40364
40433
|
},
|
|
40365
40434
|
toSdkCallback(wrappedHandler)
|
|
40366
40435
|
);
|
|
40367
|
-
|
|
40436
|
+
logger55.info("Registered memory_stats tool");
|
|
40368
40437
|
}
|
|
40369
40438
|
|
|
40370
40439
|
// src/mcp/tools/memory-write.ts
|
|
@@ -40534,12 +40603,12 @@ function isDuplicateWrite(key, content) {
|
|
|
40534
40603
|
recentWriteKeys.set(cacheKey, (/* @__PURE__ */ new Date()).toISOString());
|
|
40535
40604
|
return false;
|
|
40536
40605
|
}
|
|
40537
|
-
async function executeMemoryWrite(input,
|
|
40606
|
+
async function executeMemoryWrite(input, logger55) {
|
|
40538
40607
|
if (isDuplicateWrite(input.key, input.content)) {
|
|
40539
|
-
|
|
40608
|
+
logger55.debug("Skipping duplicate memory write", { key: input.key, backend: input.backend });
|
|
40540
40609
|
return { success: true, backend: input.backend, key: input.key, deduplicated: true };
|
|
40541
40610
|
}
|
|
40542
|
-
|
|
40611
|
+
logger55.debug("Writing to memory", {
|
|
40543
40612
|
backend: input.backend,
|
|
40544
40613
|
key: input.key,
|
|
40545
40614
|
contentLength: input.content.length
|
|
@@ -40577,7 +40646,7 @@ async function memoryWriteHandler(args, ctx) {
|
|
|
40577
40646
|
});
|
|
40578
40647
|
}
|
|
40579
40648
|
function registerMemoryWriteTool(server, deps) {
|
|
40580
|
-
const
|
|
40649
|
+
const logger55 = deps.logger ?? createLogger({ tool: "memory_write" });
|
|
40581
40650
|
const toolSchema = {
|
|
40582
40651
|
key: z74.string().min(1).max(200).describe("Memory identifier or subject"),
|
|
40583
40652
|
content: z74.string().min(1).max(5e3).describe("Memory content to store"),
|
|
@@ -40591,11 +40660,11 @@ function registerMemoryWriteTool(server, deps) {
|
|
|
40591
40660
|
const secureHandler = createSecureHandler(memoryWriteHandler, {
|
|
40592
40661
|
toolName: "memory_write",
|
|
40593
40662
|
rateLimiter: deps.rateLimiter,
|
|
40594
|
-
logger:
|
|
40663
|
+
logger: logger55
|
|
40595
40664
|
});
|
|
40596
40665
|
const guardedHandler = withPrerequisite("memory_write", secureHandler);
|
|
40597
40666
|
const timeoutMs = getToolTimeout("memory_write", deps.security);
|
|
40598
|
-
const wrappedHandler = wrapToolWithTimeout("memory_write", guardedHandler, { timeoutMs, logger:
|
|
40667
|
+
const wrappedHandler = wrapToolWithTimeout("memory_write", guardedHandler, { timeoutMs, logger: logger55 });
|
|
40599
40668
|
const outputSchema = {
|
|
40600
40669
|
success: z74.boolean(),
|
|
40601
40670
|
backend: z74.string(),
|
|
@@ -40613,7 +40682,7 @@ function registerMemoryWriteTool(server, deps) {
|
|
|
40613
40682
|
},
|
|
40614
40683
|
toSdkCallback(wrappedHandler)
|
|
40615
40684
|
);
|
|
40616
|
-
|
|
40685
|
+
logger55.info("Registered memory_write tool");
|
|
40617
40686
|
}
|
|
40618
40687
|
|
|
40619
40688
|
// src/mcp/tools/weather-report-tool.ts
|
|
@@ -40663,7 +40732,7 @@ function weatherReportHandler(args, ctx) {
|
|
|
40663
40732
|
}
|
|
40664
40733
|
}
|
|
40665
40734
|
function registerWeatherReportTool(server, deps) {
|
|
40666
|
-
const
|
|
40735
|
+
const logger55 = deps.logger ?? createLogger({ tool: "weather_report" });
|
|
40667
40736
|
const toolSchema = {
|
|
40668
40737
|
cli: z75.enum(["claude", "gemini", "codex", "opencode"]).optional().describe("Filter by CLI"),
|
|
40669
40738
|
category: z75.enum([
|
|
@@ -40684,19 +40753,19 @@ function registerWeatherReportTool(server, deps) {
|
|
|
40684
40753
|
const secureHandler = createSecureHandler(weatherReportHandler, {
|
|
40685
40754
|
toolName: "weather_report",
|
|
40686
40755
|
rateLimiter: deps.rateLimiter,
|
|
40687
|
-
logger:
|
|
40756
|
+
logger: logger55
|
|
40688
40757
|
});
|
|
40689
40758
|
const timeoutMs = getToolTimeout("weather_report", deps.security);
|
|
40690
40759
|
const wrappedHandler = wrapToolWithTimeout("weather_report", secureHandler, {
|
|
40691
40760
|
timeoutMs,
|
|
40692
|
-
logger:
|
|
40761
|
+
logger: logger55
|
|
40693
40762
|
});
|
|
40694
40763
|
server.registerTool(
|
|
40695
40764
|
"weather_report",
|
|
40696
40765
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("weather_report") },
|
|
40697
40766
|
toSdkCallback(wrappedHandler)
|
|
40698
40767
|
);
|
|
40699
|
-
|
|
40768
|
+
logger55.info("Registered weather_report tool");
|
|
40700
40769
|
}
|
|
40701
40770
|
|
|
40702
40771
|
// src/mcp/tools/registry-import-types.ts
|
|
@@ -40819,7 +40888,7 @@ function registryImportHandler(args, ctx) {
|
|
|
40819
40888
|
}
|
|
40820
40889
|
}
|
|
40821
40890
|
function registerRegistryImportTool(server, deps) {
|
|
40822
|
-
const
|
|
40891
|
+
const logger55 = deps.logger ?? createLogger({ tool: "registry_import" });
|
|
40823
40892
|
const toolSchema = {
|
|
40824
40893
|
provider: z77.enum(["anthropic", "google", "openai"]).describe("Model provider (anthropic, google, openai)"),
|
|
40825
40894
|
modelId: z77.string().min(1).describe("Provider model identifier"),
|
|
@@ -40829,20 +40898,20 @@ function registerRegistryImportTool(server, deps) {
|
|
|
40829
40898
|
const secureHandler = createSecureHandler(registryImportHandler, {
|
|
40830
40899
|
toolName: "registry_import",
|
|
40831
40900
|
rateLimiter: deps.rateLimiter,
|
|
40832
|
-
logger:
|
|
40901
|
+
logger: logger55
|
|
40833
40902
|
});
|
|
40834
40903
|
const guardedHandler = withPrerequisite("registry_import", secureHandler);
|
|
40835
40904
|
const timeoutMs = getToolTimeout("registry_import", deps.security);
|
|
40836
40905
|
const wrappedHandler = wrapToolWithTimeout("registry_import", guardedHandler, {
|
|
40837
40906
|
timeoutMs,
|
|
40838
|
-
logger:
|
|
40907
|
+
logger: logger55
|
|
40839
40908
|
});
|
|
40840
40909
|
server.registerTool(
|
|
40841
40910
|
"registry_import",
|
|
40842
40911
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("registry_import") },
|
|
40843
40912
|
toSdkCallback(wrappedHandler)
|
|
40844
40913
|
);
|
|
40845
|
-
|
|
40914
|
+
logger55.info("Registered registry_import tool");
|
|
40846
40915
|
}
|
|
40847
40916
|
|
|
40848
40917
|
// src/mcp/tools/repo-analyze-types.ts
|
|
@@ -40875,7 +40944,7 @@ async function repoAnalyzeHandler(args, ctx) {
|
|
|
40875
40944
|
}
|
|
40876
40945
|
}
|
|
40877
40946
|
function registerRepoAnalyzeTool(server, deps) {
|
|
40878
|
-
const
|
|
40947
|
+
const logger55 = deps.logger ?? createLogger({ tool: "repo_analyze" });
|
|
40879
40948
|
const toolSchema = {
|
|
40880
40949
|
repo: z79.string().min(1).describe('GitHub repository in "owner/name" format or full URL'),
|
|
40881
40950
|
depth: z79.enum(["shallow", "deep"]).optional().describe("Analysis depth: shallow (tree + README) or deep")
|
|
@@ -40884,19 +40953,19 @@ function registerRepoAnalyzeTool(server, deps) {
|
|
|
40884
40953
|
const secureHandler = createSecureHandler(repoAnalyzeHandler, {
|
|
40885
40954
|
toolName: "repo_analyze",
|
|
40886
40955
|
rateLimiter: deps.rateLimiter,
|
|
40887
|
-
logger:
|
|
40956
|
+
logger: logger55
|
|
40888
40957
|
});
|
|
40889
40958
|
const timeoutMs = getToolTimeout("repo_analyze", deps.security);
|
|
40890
40959
|
const wrappedHandler = wrapToolWithTimeout("repo_analyze", secureHandler, {
|
|
40891
40960
|
timeoutMs,
|
|
40892
|
-
logger:
|
|
40961
|
+
logger: logger55
|
|
40893
40962
|
});
|
|
40894
40963
|
server.registerTool(
|
|
40895
40964
|
"repo_analyze",
|
|
40896
40965
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("repo_analyze") },
|
|
40897
40966
|
toSdkCallback(wrappedHandler)
|
|
40898
40967
|
);
|
|
40899
|
-
|
|
40968
|
+
logger55.info("Registered repo_analyze tool");
|
|
40900
40969
|
}
|
|
40901
40970
|
|
|
40902
40971
|
// src/mcp/tools/repo-security-plan-types.ts
|
|
@@ -40928,7 +40997,7 @@ async function handler(args, ctx) {
|
|
|
40928
40997
|
}
|
|
40929
40998
|
}
|
|
40930
40999
|
function registerRepoSecurityPlanTool(server, deps) {
|
|
40931
|
-
const
|
|
41000
|
+
const logger55 = deps.logger ?? createLogger({ tool: "repo_security_plan" });
|
|
40932
41001
|
const toolSchema = {
|
|
40933
41002
|
repo: z81.string().min(1).describe('GitHub repository in "owner/name" format or full URL'),
|
|
40934
41003
|
categories: z81.array(z81.string().max(50)).max(10).optional().describe('Filter to specific categories (e.g., ["sast", "sca", "secrets"])'),
|
|
@@ -40938,19 +41007,19 @@ function registerRepoSecurityPlanTool(server, deps) {
|
|
|
40938
41007
|
const secureHandler = createSecureHandler(handler, {
|
|
40939
41008
|
toolName: "repo_security_plan",
|
|
40940
41009
|
rateLimiter: deps.rateLimiter,
|
|
40941
|
-
logger:
|
|
41010
|
+
logger: logger55
|
|
40942
41011
|
});
|
|
40943
41012
|
const timeoutMs = getToolTimeout("repo_security_plan", deps.security);
|
|
40944
41013
|
const wrappedHandler = wrapToolWithTimeout("repo_security_plan", secureHandler, {
|
|
40945
41014
|
timeoutMs,
|
|
40946
|
-
logger:
|
|
41015
|
+
logger: logger55
|
|
40947
41016
|
});
|
|
40948
41017
|
server.registerTool(
|
|
40949
41018
|
"repo_security_plan",
|
|
40950
41019
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("repo_security_plan") },
|
|
40951
41020
|
toSdkCallback(wrappedHandler)
|
|
40952
41021
|
);
|
|
40953
|
-
|
|
41022
|
+
logger55.info("Registered repo_security_plan tool");
|
|
40954
41023
|
}
|
|
40955
41024
|
|
|
40956
41025
|
// src/mcp/tools/search-codebase-tool.ts
|
|
@@ -41066,7 +41135,7 @@ ${output2}`);
|
|
|
41066
41135
|
}
|
|
41067
41136
|
}
|
|
41068
41137
|
function registerSearchCodebaseTool(server, deps) {
|
|
41069
|
-
const
|
|
41138
|
+
const logger55 = deps.logger ?? createLogger({ tool: "search_codebase" });
|
|
41070
41139
|
const toolSchema = {
|
|
41071
41140
|
query: z82.string().min(1).max(200).describe("Search query or file path"),
|
|
41072
41141
|
directory: z82.string().max(500).optional().describe("Directory to index"),
|
|
@@ -41077,16 +41146,16 @@ function registerSearchCodebaseTool(server, deps) {
|
|
|
41077
41146
|
const secureHandler = createSecureHandler(searchCodebaseHandler, {
|
|
41078
41147
|
toolName: "search_codebase",
|
|
41079
41148
|
rateLimiter: deps.rateLimiter,
|
|
41080
|
-
logger:
|
|
41149
|
+
logger: logger55
|
|
41081
41150
|
});
|
|
41082
41151
|
const timeoutMs = getToolTimeout("search_codebase", deps.security);
|
|
41083
|
-
const wrapped = wrapToolWithTimeout("search_codebase", secureHandler, { timeoutMs, logger:
|
|
41152
|
+
const wrapped = wrapToolWithTimeout("search_codebase", secureHandler, { timeoutMs, logger: logger55 });
|
|
41084
41153
|
server.registerTool(
|
|
41085
41154
|
"search_codebase",
|
|
41086
41155
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("search_codebase") },
|
|
41087
41156
|
toSdkCallback(wrapped)
|
|
41088
41157
|
);
|
|
41089
|
-
|
|
41158
|
+
logger55.info("Registered search_codebase tool");
|
|
41090
41159
|
}
|
|
41091
41160
|
|
|
41092
41161
|
// src/mcp/tools/extract-symbols-tool.ts
|
|
@@ -41153,7 +41222,7 @@ async function extractSymbolsHandler(args, ctx) {
|
|
|
41153
41222
|
}
|
|
41154
41223
|
}
|
|
41155
41224
|
function registerExtractSymbolsTool(server, deps) {
|
|
41156
|
-
const
|
|
41225
|
+
const logger55 = deps.logger ?? createLogger({ tool: "extract_symbols" });
|
|
41157
41226
|
const toolSchema = {
|
|
41158
41227
|
filePath: z83.string().min(1).max(500).describe("Path to TypeScript/JavaScript file"),
|
|
41159
41228
|
mode: z83.enum(["index", "full"]).optional().describe("index (default): names+lines. full: includes source text")
|
|
@@ -41162,19 +41231,19 @@ function registerExtractSymbolsTool(server, deps) {
|
|
|
41162
41231
|
const secureHandler = createSecureHandler(extractSymbolsHandler, {
|
|
41163
41232
|
toolName: "extract_symbols",
|
|
41164
41233
|
rateLimiter: deps.rateLimiter,
|
|
41165
|
-
logger:
|
|
41234
|
+
logger: logger55
|
|
41166
41235
|
});
|
|
41167
41236
|
const timeoutMs = getToolTimeout("extract_symbols", deps.security);
|
|
41168
41237
|
const wrapped = wrapToolWithTimeout("extract_symbols", secureHandler, {
|
|
41169
41238
|
timeoutMs,
|
|
41170
|
-
logger:
|
|
41239
|
+
logger: logger55
|
|
41171
41240
|
});
|
|
41172
41241
|
server.registerTool(
|
|
41173
41242
|
"extract_symbols",
|
|
41174
41243
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("extract_symbols") },
|
|
41175
41244
|
toSdkCallback(wrapped)
|
|
41176
41245
|
);
|
|
41177
|
-
|
|
41246
|
+
logger55.info("Registered extract_symbols tool");
|
|
41178
41247
|
}
|
|
41179
41248
|
|
|
41180
41249
|
// src/mcp/tools/query-trace-tool.ts
|
|
@@ -41287,7 +41356,7 @@ function queryTraceHandler(args, ctx) {
|
|
|
41287
41356
|
});
|
|
41288
41357
|
}
|
|
41289
41358
|
function registerQueryTraceTool(server, deps) {
|
|
41290
|
-
const
|
|
41359
|
+
const logger55 = deps.logger ?? createLogger({ tool: "query_trace" });
|
|
41291
41360
|
const toolSchema = {
|
|
41292
41361
|
runId: z84.string().min(1).max(128).regex(/^[a-zA-Z0-9_-]+$/, "runId must be alphanumeric, hyphens, or underscores").describe("Run ID to query traces for"),
|
|
41293
41362
|
eventType: z84.string().max(100).regex(/^[a-zA-Z0-9._-]+$/).optional().describe("Filter by event type (e.g., model.called)"),
|
|
@@ -41297,16 +41366,16 @@ function registerQueryTraceTool(server, deps) {
|
|
|
41297
41366
|
const secureHandler = createSecureHandler(queryTraceHandler, {
|
|
41298
41367
|
toolName: "query_trace",
|
|
41299
41368
|
rateLimiter: deps.rateLimiter,
|
|
41300
|
-
logger:
|
|
41369
|
+
logger: logger55
|
|
41301
41370
|
});
|
|
41302
41371
|
const timeoutMs = getToolTimeout("query_trace", deps.security);
|
|
41303
|
-
const wrappedHandler = wrapToolWithTimeout("query_trace", secureHandler, { timeoutMs, logger:
|
|
41372
|
+
const wrappedHandler = wrapToolWithTimeout("query_trace", secureHandler, { timeoutMs, logger: logger55 });
|
|
41304
41373
|
server.registerTool(
|
|
41305
41374
|
"query_trace",
|
|
41306
41375
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("query_trace") },
|
|
41307
41376
|
toSdkCallback(wrappedHandler)
|
|
41308
41377
|
);
|
|
41309
|
-
|
|
41378
|
+
logger55.info("Registered query_trace tool");
|
|
41310
41379
|
}
|
|
41311
41380
|
|
|
41312
41381
|
// src/audit/audit-types.ts
|
|
@@ -41610,7 +41679,7 @@ var FileAuditStorage = class _FileAuditStorage {
|
|
|
41610
41679
|
* @param logger - Optional logger instance
|
|
41611
41680
|
* @returns Result with FileAuditStorage or SecurityError
|
|
41612
41681
|
*/
|
|
41613
|
-
static create(config,
|
|
41682
|
+
static create(config, logger55) {
|
|
41614
41683
|
const validation = config.allowedRoot !== void 0 ? validateLogDir(config.logDir, config.allowedRoot) : validateLogDirBasic(config.logDir);
|
|
41615
41684
|
if (!validation.ok) {
|
|
41616
41685
|
return { ok: false, error: validation.error };
|
|
@@ -41619,7 +41688,7 @@ var FileAuditStorage = class _FileAuditStorage {
|
|
|
41619
41688
|
...config,
|
|
41620
41689
|
logDir: validation.value
|
|
41621
41690
|
};
|
|
41622
|
-
return { ok: true, value: new _FileAuditStorage(validatedConfig,
|
|
41691
|
+
return { ok: true, value: new _FileAuditStorage(validatedConfig, logger55, true) };
|
|
41623
41692
|
}
|
|
41624
41693
|
/**
|
|
41625
41694
|
* Constructor for FileAuditStorage.
|
|
@@ -41632,8 +41701,8 @@ var FileAuditStorage = class _FileAuditStorage {
|
|
|
41632
41701
|
* @param skipValidation - Internal flag, set by create() after validation
|
|
41633
41702
|
* @throws SecurityError if path validation fails and skipValidation is false
|
|
41634
41703
|
*/
|
|
41635
|
-
constructor(config,
|
|
41636
|
-
this.logger =
|
|
41704
|
+
constructor(config, logger55, skipValidation = false) {
|
|
41705
|
+
this.logger = logger55 ?? createLogger({ component: "FileAuditStorage" });
|
|
41637
41706
|
if (!skipValidation) {
|
|
41638
41707
|
const validation = validateLogDirBasic(config.logDir);
|
|
41639
41708
|
if (!validation.ok) {
|
|
@@ -41862,13 +41931,13 @@ var AuditLogger = class {
|
|
|
41862
41931
|
closed = false;
|
|
41863
41932
|
inFlightFlush = null;
|
|
41864
41933
|
droppedEventCount = 0;
|
|
41865
|
-
constructor(config, storage,
|
|
41934
|
+
constructor(config, storage, logger55) {
|
|
41866
41935
|
const validated = AuditLogConfigSchema.safeParse(config);
|
|
41867
41936
|
if (!validated.success) {
|
|
41868
41937
|
const issues = validated.error.issues.map((i) => i.path.join(".") + ": " + i.message).join("; ");
|
|
41869
41938
|
throw new AuditError("Invalid AuditLogConfig: " + issues);
|
|
41870
41939
|
}
|
|
41871
|
-
this.logger =
|
|
41940
|
+
this.logger = logger55 ?? createLogger({ component: "AuditLogger" });
|
|
41872
41941
|
this.enableHashChain = validated.data.enableHashChain;
|
|
41873
41942
|
this.minSeverity = validated.data.minSeverity;
|
|
41874
41943
|
this.categories = validated.data.categories;
|
|
@@ -42069,8 +42138,8 @@ var AuditLogger = class {
|
|
|
42069
42138
|
this.logger.info("AuditLogger closed");
|
|
42070
42139
|
}
|
|
42071
42140
|
};
|
|
42072
|
-
function createAuditLogger(config, storage,
|
|
42073
|
-
return new AuditLogger(config, storage,
|
|
42141
|
+
function createAuditLogger(config, storage, logger55) {
|
|
42142
|
+
return new AuditLogger(config, storage, logger55);
|
|
42074
42143
|
}
|
|
42075
42144
|
|
|
42076
42145
|
// src/pipeline/stage-types.ts
|
|
@@ -44758,15 +44827,15 @@ async function prReviewHandler(args, ctx) {
|
|
|
44758
44827
|
}
|
|
44759
44828
|
}
|
|
44760
44829
|
function registerPrReviewTool(server, deps) {
|
|
44761
|
-
const
|
|
44830
|
+
const logger55 = deps.logger ?? createLogger({ tool: "pr_review" });
|
|
44762
44831
|
const description2 = "Run multi-voter consensus review on a PR diff (#2233). 5 voters (architect, security, devex, catfish, scope_steward) each emit approve/request_changes/abstain with reasoning and citations. Reuses consensus_vote infra; experimental.";
|
|
44763
44832
|
const secureHandler = createSecureHandler(prReviewHandler, {
|
|
44764
44833
|
toolName: "pr_review",
|
|
44765
44834
|
rateLimiter: deps.rateLimiter,
|
|
44766
|
-
logger:
|
|
44835
|
+
logger: logger55
|
|
44767
44836
|
});
|
|
44768
44837
|
const timeoutMs = getToolTimeout("pr_review", deps.security);
|
|
44769
|
-
const wrappedHandler = wrapToolWithTimeout("pr_review", secureHandler, { timeoutMs, logger:
|
|
44838
|
+
const wrappedHandler = wrapToolWithTimeout("pr_review", secureHandler, { timeoutMs, logger: logger55 });
|
|
44770
44839
|
server.registerTool(
|
|
44771
44840
|
"pr_review",
|
|
44772
44841
|
{
|
|
@@ -44776,7 +44845,7 @@ function registerPrReviewTool(server, deps) {
|
|
|
44776
44845
|
},
|
|
44777
44846
|
toSdkCallback(wrappedHandler)
|
|
44778
44847
|
);
|
|
44779
|
-
|
|
44848
|
+
logger55.info("Registered pr_review tool");
|
|
44780
44849
|
}
|
|
44781
44850
|
|
|
44782
44851
|
// src/mcp/tools/survey-oss-landscape.ts
|
|
@@ -44837,7 +44906,7 @@ function parseCandidates(data) {
|
|
|
44837
44906
|
});
|
|
44838
44907
|
return { totalFound: data.total_count ?? candidates.length, candidates };
|
|
44839
44908
|
}
|
|
44840
|
-
async function fetchGithubCandidates(input,
|
|
44909
|
+
async function fetchGithubCandidates(input, logger55) {
|
|
44841
44910
|
const query = encodeURIComponent(buildGithubQuery(input));
|
|
44842
44911
|
const perPage = String(input.maxResults);
|
|
44843
44912
|
const url = `${GITHUB_SEARCH_BASE}?q=${query}&sort=stars&order=desc&per_page=${perPage}`;
|
|
@@ -44849,7 +44918,7 @@ async function fetchGithubCandidates(input, logger54) {
|
|
|
44849
44918
|
if (tokenResult.ok) {
|
|
44850
44919
|
headers["Authorization"] = `Bearer ${tokenResult.value.value}`;
|
|
44851
44920
|
} else {
|
|
44852
|
-
|
|
44921
|
+
logger55.debug("No GitHub token; using unauthenticated rate limit (60/hr)");
|
|
44853
44922
|
}
|
|
44854
44923
|
const fetchResult = await fetchSource({ url, source: "github", headers });
|
|
44855
44924
|
if (!fetchResult.ok) return fetchResult;
|
|
@@ -44880,12 +44949,12 @@ async function fetchGithubCandidates(input, logger54) {
|
|
|
44880
44949
|
}
|
|
44881
44950
|
return { ok: true, value: parseCandidates(parsed.data) };
|
|
44882
44951
|
}
|
|
44883
|
-
async function executeSurvey(input,
|
|
44952
|
+
async function executeSurvey(input, logger55) {
|
|
44884
44953
|
const sourcesQueried = ["github"];
|
|
44885
44954
|
const sourcesFailed = [];
|
|
44886
|
-
const githubResult = await fetchGithubCandidates(input,
|
|
44955
|
+
const githubResult = await fetchGithubCandidates(input, logger55);
|
|
44887
44956
|
if (!githubResult.ok) {
|
|
44888
|
-
|
|
44957
|
+
logger55.warn("GitHub source failed", {
|
|
44889
44958
|
code: githubResult.error.code,
|
|
44890
44959
|
message: githubResult.error.message
|
|
44891
44960
|
});
|
|
@@ -44915,13 +44984,13 @@ function createSurveyHandler(deps) {
|
|
|
44915
44984
|
message: `Validation error: ${formatZodError(validation.error)}`
|
|
44916
44985
|
});
|
|
44917
44986
|
}
|
|
44918
|
-
const
|
|
44987
|
+
const logger55 = deps.logger ?? createLogger({ tool: "survey_oss_landscape" });
|
|
44919
44988
|
ctx.logger.debug("Surveying OSS landscape", {
|
|
44920
44989
|
query: validation.data.query,
|
|
44921
44990
|
maxResults: validation.data.maxResults
|
|
44922
44991
|
});
|
|
44923
|
-
return withToolError("Survey failed",
|
|
44924
|
-
const result = await executeSurvey(validation.data,
|
|
44992
|
+
return withToolError("Survey failed", logger55, async () => {
|
|
44993
|
+
const result = await executeSurvey(validation.data, logger55);
|
|
44925
44994
|
return toolSuccessStructured(result);
|
|
44926
44995
|
});
|
|
44927
44996
|
};
|
|
@@ -44935,16 +45004,16 @@ var SURVEY_OUTPUT_SCHEMA = {
|
|
|
44935
45004
|
};
|
|
44936
45005
|
var SURVEY_DESCRIPTION = 'Transient OSS project search. Returns a ranked list of GitHub repositories with license, last-commit, star-count, and one-line description. Does NOT persist to the research registry \u2014 use `research_add_source` for that. Best for one-off engineering decisions like "what tools exist in this space?".';
|
|
44937
45006
|
function registerSurveyOssLandscapeTool(server, deps) {
|
|
44938
|
-
const
|
|
45007
|
+
const logger55 = deps.logger ?? createLogger({ tool: "survey_oss_landscape" });
|
|
44939
45008
|
const secureHandler = createSecureHandler(createSurveyHandler(deps), {
|
|
44940
45009
|
toolName: "survey_oss_landscape",
|
|
44941
45010
|
rateLimiter: deps.rateLimiter,
|
|
44942
|
-
logger:
|
|
45011
|
+
logger: logger55
|
|
44943
45012
|
});
|
|
44944
45013
|
const timeoutMs = getToolTimeout("survey_oss_landscape", deps.security);
|
|
44945
45014
|
const wrappedHandler = wrapToolWithTimeout("survey_oss_landscape", secureHandler, {
|
|
44946
45015
|
timeoutMs,
|
|
44947
|
-
logger:
|
|
45016
|
+
logger: logger55
|
|
44948
45017
|
});
|
|
44949
45018
|
server.registerTool(
|
|
44950
45019
|
"survey_oss_landscape",
|
|
@@ -44956,7 +45025,7 @@ function registerSurveyOssLandscapeTool(server, deps) {
|
|
|
44956
45025
|
},
|
|
44957
45026
|
toSdkCallback(wrappedHandler)
|
|
44958
45027
|
);
|
|
44959
|
-
|
|
45028
|
+
logger55.info("Registered survey_oss_landscape tool");
|
|
44960
45029
|
}
|
|
44961
45030
|
|
|
44962
45031
|
// src/mcp/tools/vendor-publishing-audit.ts
|
|
@@ -45057,9 +45126,9 @@ function createVendorPublishingAuditHandler(deps) {
|
|
|
45057
45126
|
message: `Validation error: ${formatZodError(validation.error)}`
|
|
45058
45127
|
});
|
|
45059
45128
|
}
|
|
45060
|
-
const
|
|
45129
|
+
const logger55 = deps.logger ?? createLogger({ tool: "vendor_publishing_audit" });
|
|
45061
45130
|
ctx.logger.debug("Vendor publishing audit", { vendor: validation.data.vendor });
|
|
45062
|
-
return withToolError("Vendor publishing audit failed",
|
|
45131
|
+
return withToolError("Vendor publishing audit failed", logger55, () => {
|
|
45063
45132
|
const result = lookupVendor(validation.data.vendor);
|
|
45064
45133
|
return Promise.resolve(toolSuccessStructured(result));
|
|
45065
45134
|
});
|
|
@@ -45083,16 +45152,16 @@ var VENDOR_PUBLISHING_OUTPUT_SCHEMA = {
|
|
|
45083
45152
|
};
|
|
45084
45153
|
var VENDOR_PUBLISHING_DESCRIPTION = "Look up a vendor's published-artifact signing infrastructure: GPG key fingerprints, SHA256SUMS URL pattern, signature shape (clearsigned / detached / detached-on-iso), release cadence, key rotation notes, and the vendor doc citation. Static lookup against a curated seed dataset; the vendor doc URL is the authoritative source. Returns `{known: false, knownVendors: [...]}` for vendors without a seed entry. v1 covers ubuntu, debian, fedora.";
|
|
45085
45154
|
function registerVendorPublishingAuditTool(server, deps) {
|
|
45086
|
-
const
|
|
45155
|
+
const logger55 = deps.logger ?? createLogger({ tool: "vendor_publishing_audit" });
|
|
45087
45156
|
const secureHandler = createSecureHandler(createVendorPublishingAuditHandler(deps), {
|
|
45088
45157
|
toolName: "vendor_publishing_audit",
|
|
45089
45158
|
rateLimiter: deps.rateLimiter,
|
|
45090
|
-
logger:
|
|
45159
|
+
logger: logger55
|
|
45091
45160
|
});
|
|
45092
45161
|
const timeoutMs = getToolTimeout("vendor_publishing_audit", deps.security);
|
|
45093
45162
|
const wrappedHandler = wrapToolWithTimeout("vendor_publishing_audit", secureHandler, {
|
|
45094
45163
|
timeoutMs,
|
|
45095
|
-
logger:
|
|
45164
|
+
logger: logger55
|
|
45096
45165
|
});
|
|
45097
45166
|
server.registerTool(
|
|
45098
45167
|
"vendor_publishing_audit",
|
|
@@ -45104,7 +45173,7 @@ function registerVendorPublishingAuditTool(server, deps) {
|
|
|
45104
45173
|
},
|
|
45105
45174
|
toSdkCallback(wrappedHandler)
|
|
45106
45175
|
);
|
|
45107
|
-
|
|
45176
|
+
logger55.info("Registered vendor_publishing_audit tool");
|
|
45108
45177
|
}
|
|
45109
45178
|
|
|
45110
45179
|
// src/mcp/tools/compare-data-feeds.ts
|
|
@@ -45290,12 +45359,12 @@ function createCompareDataFeedsHandler(deps) {
|
|
|
45290
45359
|
message: `Validation error: ${formatZodError(validation.error)}`
|
|
45291
45360
|
});
|
|
45292
45361
|
}
|
|
45293
|
-
const
|
|
45362
|
+
const logger55 = deps.logger ?? createLogger({ tool: "compare_data_feeds" });
|
|
45294
45363
|
ctx.logger.debug("Comparing data feeds", {
|
|
45295
45364
|
feedAPath: validation.data.feedAPath,
|
|
45296
45365
|
feedBPath: validation.data.feedBPath
|
|
45297
45366
|
});
|
|
45298
|
-
return withToolError("Compare data feeds failed",
|
|
45367
|
+
return withToolError("Compare data feeds failed", logger55, () => {
|
|
45299
45368
|
const result = executeCompare(validation.data);
|
|
45300
45369
|
return Promise.resolve(toolSuccessStructured(result));
|
|
45301
45370
|
});
|
|
@@ -45323,16 +45392,16 @@ var COMPARE_OUTPUT_SCHEMA = {
|
|
|
45323
45392
|
};
|
|
45324
45393
|
var COMPARE_DESCRIPTION = "Diff two upstream data feeds (YAML or JSON files) along coverage and per-field axes. Returns which entries exist in A, B, both, plus optional field-level diffs across matched entries. v1 takes file paths only (no URL fetch \u2014 that needs an SSRF design pass). Both feeds must be a top-level array OR a top-level object with exactly one array field.";
|
|
45325
45394
|
function registerCompareDataFeedsTool(server, deps) {
|
|
45326
|
-
const
|
|
45395
|
+
const logger55 = deps.logger ?? createLogger({ tool: "compare_data_feeds" });
|
|
45327
45396
|
const secureHandler = createSecureHandler(createCompareDataFeedsHandler(deps), {
|
|
45328
45397
|
toolName: "compare_data_feeds",
|
|
45329
45398
|
rateLimiter: deps.rateLimiter,
|
|
45330
|
-
logger:
|
|
45399
|
+
logger: logger55
|
|
45331
45400
|
});
|
|
45332
45401
|
const timeoutMs = getToolTimeout("compare_data_feeds", deps.security);
|
|
45333
45402
|
const wrappedHandler = wrapToolWithTimeout("compare_data_feeds", secureHandler, {
|
|
45334
45403
|
timeoutMs,
|
|
45335
|
-
logger:
|
|
45404
|
+
logger: logger55
|
|
45336
45405
|
});
|
|
45337
45406
|
server.registerTool(
|
|
45338
45407
|
"compare_data_feeds",
|
|
@@ -45344,7 +45413,7 @@ function registerCompareDataFeedsTool(server, deps) {
|
|
|
45344
45413
|
},
|
|
45345
45414
|
toSdkCallback(wrappedHandler)
|
|
45346
45415
|
);
|
|
45347
|
-
|
|
45416
|
+
logger55.info("Registered compare_data_feeds tool");
|
|
45348
45417
|
}
|
|
45349
45418
|
|
|
45350
45419
|
// src/mcp/tools/improvement-review.ts
|
|
@@ -45422,8 +45491,8 @@ function clamp2(score, max) {
|
|
|
45422
45491
|
var FitnessScoreCalculator = class {
|
|
45423
45492
|
logger;
|
|
45424
45493
|
checks = [];
|
|
45425
|
-
constructor(
|
|
45426
|
-
this.logger =
|
|
45494
|
+
constructor(logger55) {
|
|
45495
|
+
this.logger = logger55 ?? createLogger({ component: "FitnessScoreCalculator" });
|
|
45427
45496
|
this.registerDefaultChecks();
|
|
45428
45497
|
}
|
|
45429
45498
|
/** Register default fitness checks. */
|
|
@@ -45917,8 +45986,8 @@ var FitnessScoreCalculator = class {
|
|
|
45917
45986
|
return base;
|
|
45918
45987
|
}
|
|
45919
45988
|
};
|
|
45920
|
-
function createFitnessScoreCalculator(
|
|
45921
|
-
return new FitnessScoreCalculator(
|
|
45989
|
+
function createFitnessScoreCalculator(logger55) {
|
|
45990
|
+
return new FitnessScoreCalculator(logger55);
|
|
45922
45991
|
}
|
|
45923
45992
|
function calculateFitnessScore(version) {
|
|
45924
45993
|
const calculator = createFitnessScoreCalculator();
|
|
@@ -46166,20 +46235,20 @@ async function fileSignalsAsIssues(signals, ctx) {
|
|
|
46166
46235
|
return { issuesFiled, issuesSkipped };
|
|
46167
46236
|
}
|
|
46168
46237
|
async function runImprovementReview(input, deps = {}) {
|
|
46169
|
-
const
|
|
46238
|
+
const logger55 = deps.logger ?? createLogger({ component: "improvement_review" });
|
|
46170
46239
|
const { lookbackDays, fileIssues, minSampleSize, fitnessFloor } = input;
|
|
46171
46240
|
const now = Date.now();
|
|
46172
46241
|
const windowLabel = `${String(lookbackDays)}d`;
|
|
46173
46242
|
const allOutcomes = getOutcomeStore().query();
|
|
46174
46243
|
const windowed = filterByLookback(allOutcomes, lookbackDays, now);
|
|
46175
|
-
const audit = safeFitnessAudit(now, { logger:
|
|
46244
|
+
const audit = safeFitnessAudit(now, { logger: logger55 });
|
|
46176
46245
|
const signals = [
|
|
46177
46246
|
...detectCliPerformanceFloor(windowed, minSampleSize, windowLabel),
|
|
46178
46247
|
...detectFailureCategoryConcentration(windowed, windowLabel),
|
|
46179
46248
|
...detectFitnessSignals(audit, fitnessFloor)
|
|
46180
46249
|
];
|
|
46181
46250
|
signals.sort((a, b) => SEVERITY_ORDER3[a.severity] - SEVERITY_ORDER3[b.severity]);
|
|
46182
|
-
const { issuesFiled, issuesSkipped } = fileIssues ? await fileSignalsAsIssues(signals, { logger:
|
|
46251
|
+
const { issuesFiled, issuesSkipped } = fileIssues ? await fileSignalsAsIssues(signals, { logger: logger55 }) : { issuesFiled: [], issuesSkipped: [] };
|
|
46183
46252
|
return {
|
|
46184
46253
|
window: windowLabel,
|
|
46185
46254
|
totalOutcomes: windowed.length,
|
|
@@ -46209,17 +46278,17 @@ var TOOL_INPUT_SCHEMA = {
|
|
|
46209
46278
|
fitnessFloor: z95.number().int().min(0).max(100).optional().describe("Fitness score below this threshold triggers a tech-debt signal (default 90).")
|
|
46210
46279
|
};
|
|
46211
46280
|
function registerImprovementReviewTool(server, deps) {
|
|
46212
|
-
const
|
|
46281
|
+
const logger55 = deps.logger ?? createLogger({ tool: "improvement_review" });
|
|
46213
46282
|
const secureHandler = createSecureHandler(reviewHandler, {
|
|
46214
46283
|
toolName: "improvement_review",
|
|
46215
46284
|
rateLimiter: deps.rateLimiter,
|
|
46216
|
-
logger:
|
|
46285
|
+
logger: logger55
|
|
46217
46286
|
});
|
|
46218
46287
|
const guardedHandler = withPrerequisite("improvement_review", secureHandler);
|
|
46219
46288
|
const timeoutMs = getToolTimeout("improvement_review", deps.security);
|
|
46220
46289
|
const wrappedHandler = wrapToolWithTimeout("improvement_review", guardedHandler, {
|
|
46221
46290
|
timeoutMs,
|
|
46222
|
-
logger:
|
|
46291
|
+
logger: logger55
|
|
46223
46292
|
});
|
|
46224
46293
|
server.registerTool(
|
|
46225
46294
|
"improvement_review",
|
|
@@ -46230,7 +46299,7 @@ function registerImprovementReviewTool(server, deps) {
|
|
|
46230
46299
|
},
|
|
46231
46300
|
toSdkCallback(wrappedHandler)
|
|
46232
46301
|
);
|
|
46233
|
-
|
|
46302
|
+
logger55.info("Registered improvement_review tool");
|
|
46234
46303
|
}
|
|
46235
46304
|
|
|
46236
46305
|
// src/mcp/tools/query-task-state-tool.ts
|
|
@@ -46269,7 +46338,7 @@ function queryTaskStateHandler(args, ctx) {
|
|
|
46269
46338
|
return Promise.resolve(toolSuccess(JSON.stringify(response, null, 2)));
|
|
46270
46339
|
}
|
|
46271
46340
|
function registerQueryTaskStateTool(server, deps) {
|
|
46272
|
-
const
|
|
46341
|
+
const logger55 = deps.logger ?? createLogger({ tool: "query_task_state" });
|
|
46273
46342
|
const toolSchema = {
|
|
46274
46343
|
taskId: z96.string().min(1).max(128).describe("Task ID whose structured state log should be read")
|
|
46275
46344
|
};
|
|
@@ -46277,23 +46346,91 @@ function registerQueryTaskStateTool(server, deps) {
|
|
|
46277
46346
|
const secureHandler = createSecureHandler(queryTaskStateHandler, {
|
|
46278
46347
|
toolName: "query_task_state",
|
|
46279
46348
|
rateLimiter: deps.rateLimiter,
|
|
46280
|
-
logger:
|
|
46349
|
+
logger: logger55
|
|
46281
46350
|
});
|
|
46282
46351
|
const timeoutMs = getToolTimeout("query_task_state", deps.security);
|
|
46283
46352
|
const wrappedHandler = wrapToolWithTimeout("query_task_state", secureHandler, {
|
|
46284
46353
|
timeoutMs,
|
|
46285
|
-
logger:
|
|
46354
|
+
logger: logger55
|
|
46286
46355
|
});
|
|
46287
46356
|
server.registerTool(
|
|
46288
46357
|
"query_task_state",
|
|
46289
46358
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("query_task_state") },
|
|
46290
46359
|
toSdkCallback(wrappedHandler)
|
|
46291
46360
|
);
|
|
46292
|
-
|
|
46361
|
+
logger55.info("Registered query_task_state tool");
|
|
46293
46362
|
}
|
|
46294
46363
|
|
|
46295
46364
|
// src/mcp/tools/get-job-result-tool.ts
|
|
46296
46365
|
import { z as z97 } from "zod";
|
|
46366
|
+
|
|
46367
|
+
// src/mcp/jobs/task-state-source.ts
|
|
46368
|
+
var logger42 = createLogger({ component: "task-state-source" });
|
|
46369
|
+
var TOOL_NAME_BY_PREFIX = {
|
|
46370
|
+
orch: "orchestrate",
|
|
46371
|
+
rwf: "run_workflow",
|
|
46372
|
+
cv: "consensus_vote"
|
|
46373
|
+
};
|
|
46374
|
+
function toolNameFromJobId(jobId) {
|
|
46375
|
+
const dash = jobId.indexOf("-");
|
|
46376
|
+
const prefix = dash === -1 ? jobId : jobId.slice(0, dash);
|
|
46377
|
+
return TOOL_NAME_BY_PREFIX[prefix] ?? "unknown";
|
|
46378
|
+
}
|
|
46379
|
+
function statusFromState(state) {
|
|
46380
|
+
if (state.cancellation !== void 0) return "cancelled";
|
|
46381
|
+
if (state.stage === "complete") return "complete";
|
|
46382
|
+
if (state.stage === "failed") return "failed";
|
|
46383
|
+
return "pending";
|
|
46384
|
+
}
|
|
46385
|
+
function lastBlockerMessage(state) {
|
|
46386
|
+
const last = state.blockers.at(-1);
|
|
46387
|
+
return last?.blocker;
|
|
46388
|
+
}
|
|
46389
|
+
function jobResultFromTaskState(state, jobId) {
|
|
46390
|
+
const status = statusFromState(state);
|
|
46391
|
+
const isTerminal = status !== "pending";
|
|
46392
|
+
const createdAt = state.createdAt ?? state.updatedAt;
|
|
46393
|
+
const record = {
|
|
46394
|
+
v: 1,
|
|
46395
|
+
jobId,
|
|
46396
|
+
toolName: toolNameFromJobId(jobId),
|
|
46397
|
+
status,
|
|
46398
|
+
createdAt,
|
|
46399
|
+
...isTerminal ? { completedAt: state.updatedAt } : {}
|
|
46400
|
+
};
|
|
46401
|
+
if (status === "complete") {
|
|
46402
|
+
return { ...record, result: state.result };
|
|
46403
|
+
}
|
|
46404
|
+
if (status === "cancelled") {
|
|
46405
|
+
const reason = state.cancellation?.reason;
|
|
46406
|
+
return reason !== void 0 ? { ...record, error: reason } : record;
|
|
46407
|
+
}
|
|
46408
|
+
if (status === "failed") {
|
|
46409
|
+
const msg = lastBlockerMessage(state);
|
|
46410
|
+
return msg !== void 0 ? { ...record, error: msg } : record;
|
|
46411
|
+
}
|
|
46412
|
+
return record;
|
|
46413
|
+
}
|
|
46414
|
+
function readJobResultFromTaskState(jobId, customDir) {
|
|
46415
|
+
const stateResult = readTaskState(jobId, customDir);
|
|
46416
|
+
if (!stateResult.ok) return null;
|
|
46417
|
+
return jobResultFromTaskState(stateResult.value, jobId);
|
|
46418
|
+
}
|
|
46419
|
+
function isTaskStateJobSource() {
|
|
46420
|
+
return process.env["NEXUS_JOB_RESULT_SOURCE"]?.toLowerCase() === "task_state";
|
|
46421
|
+
}
|
|
46422
|
+
function resolveJobResult(jobId, customDir) {
|
|
46423
|
+
if (isTaskStateJobSource()) {
|
|
46424
|
+
const fromState = readJobResultFromTaskState(jobId, customDir);
|
|
46425
|
+
if (fromState !== null) {
|
|
46426
|
+
logger42.debug("Resolved job result from task-state", { jobId, status: fromState.status });
|
|
46427
|
+
return fromState;
|
|
46428
|
+
}
|
|
46429
|
+
}
|
|
46430
|
+
return readJobResult(jobId);
|
|
46431
|
+
}
|
|
46432
|
+
|
|
46433
|
+
// src/mcp/tools/get-job-result-tool.ts
|
|
46297
46434
|
var GetJobResultInputSchema = z97.object({
|
|
46298
46435
|
jobId: z97.string().min(1).max(128).describe('Job ID returned by orchestrate({ mode: "async" })')
|
|
46299
46436
|
});
|
|
@@ -46307,12 +46444,12 @@ function getJobResultHandler(args) {
|
|
|
46307
46444
|
})
|
|
46308
46445
|
);
|
|
46309
46446
|
}
|
|
46310
|
-
const record =
|
|
46447
|
+
const record = resolveJobResult(parsed.data.jobId);
|
|
46311
46448
|
if (record === null) {
|
|
46312
46449
|
const response2 = {
|
|
46313
46450
|
jobId: parsed.data.jobId,
|
|
46314
46451
|
found: false,
|
|
46315
|
-
errorMessage: "Unknown jobId, or the
|
|
46452
|
+
errorMessage: "Unknown jobId, or the result source is unreadable (corrupt / future schema). Re-check the jobId returned by the async-mode dispatch."
|
|
46316
46453
|
};
|
|
46317
46454
|
return Promise.resolve(toolSuccess(JSON.stringify(response2, null, 2)));
|
|
46318
46455
|
}
|
|
@@ -46324,7 +46461,7 @@ function getJobResultHandler(args) {
|
|
|
46324
46461
|
return Promise.resolve(toolSuccess(JSON.stringify(response, null, 2)));
|
|
46325
46462
|
}
|
|
46326
46463
|
function registerGetJobResultTool(server, deps) {
|
|
46327
|
-
const
|
|
46464
|
+
const logger55 = deps.logger ?? createLogger({ tool: "get_job_result" });
|
|
46328
46465
|
const toolSchema = {
|
|
46329
46466
|
jobId: z97.string().min(1).max(128).describe('Job ID returned by orchestrate({ mode: "async" })')
|
|
46330
46467
|
};
|
|
@@ -46332,19 +46469,19 @@ function registerGetJobResultTool(server, deps) {
|
|
|
46332
46469
|
const secureHandler = createSecureHandler(getJobResultHandler, {
|
|
46333
46470
|
toolName: "get_job_result",
|
|
46334
46471
|
rateLimiter: deps.rateLimiter,
|
|
46335
|
-
logger:
|
|
46472
|
+
logger: logger55
|
|
46336
46473
|
});
|
|
46337
46474
|
const timeoutMs = getToolTimeout("get_job_result", deps.security);
|
|
46338
46475
|
const wrappedHandler = wrapToolWithTimeout("get_job_result", secureHandler, {
|
|
46339
46476
|
timeoutMs,
|
|
46340
|
-
logger:
|
|
46477
|
+
logger: logger55
|
|
46341
46478
|
});
|
|
46342
46479
|
server.registerTool(
|
|
46343
46480
|
"get_job_result",
|
|
46344
46481
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("get_job_result") },
|
|
46345
46482
|
toSdkCallback(wrappedHandler)
|
|
46346
46483
|
);
|
|
46347
|
-
|
|
46484
|
+
logger55.info("Registered get_job_result tool");
|
|
46348
46485
|
}
|
|
46349
46486
|
|
|
46350
46487
|
// src/mcp/tools/list-jobs-tool.ts
|
|
@@ -46397,7 +46534,7 @@ function listJobsHandler(args) {
|
|
|
46397
46534
|
return Promise.resolve(toolSuccess(JSON.stringify(response, null, 2)));
|
|
46398
46535
|
}
|
|
46399
46536
|
function registerListJobsTool(server, deps) {
|
|
46400
|
-
const
|
|
46537
|
+
const logger55 = deps.logger ?? createLogger({ tool: "list_jobs" });
|
|
46401
46538
|
const toolSchema = {
|
|
46402
46539
|
toolName: z98.string().min(1).max(128).optional().describe("Filter to one tool (exact match)."),
|
|
46403
46540
|
status: JobStatusSchema.optional().describe(
|
|
@@ -46409,19 +46546,19 @@ function registerListJobsTool(server, deps) {
|
|
|
46409
46546
|
const secureHandler = createSecureHandler(listJobsHandler, {
|
|
46410
46547
|
toolName: "list_jobs",
|
|
46411
46548
|
rateLimiter: deps.rateLimiter,
|
|
46412
|
-
logger:
|
|
46549
|
+
logger: logger55
|
|
46413
46550
|
});
|
|
46414
46551
|
const timeoutMs = getToolTimeout("list_jobs", deps.security);
|
|
46415
46552
|
const wrappedHandler = wrapToolWithTimeout("list_jobs", secureHandler, {
|
|
46416
46553
|
timeoutMs,
|
|
46417
|
-
logger:
|
|
46554
|
+
logger: logger55
|
|
46418
46555
|
});
|
|
46419
46556
|
server.registerTool(
|
|
46420
46557
|
"list_jobs",
|
|
46421
46558
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("list_jobs") },
|
|
46422
46559
|
toSdkCallback(wrappedHandler)
|
|
46423
46560
|
);
|
|
46424
|
-
|
|
46561
|
+
logger55.info("Registered list_jobs tool");
|
|
46425
46562
|
}
|
|
46426
46563
|
|
|
46427
46564
|
// src/mcp/tools/cancel-job-tool.ts
|
|
@@ -46478,7 +46615,7 @@ function cancelJobHandler(args) {
|
|
|
46478
46615
|
return Promise.resolve(toolSuccess(JSON.stringify(response, null, 2)));
|
|
46479
46616
|
}
|
|
46480
46617
|
function registerCancelJobTool(server, deps) {
|
|
46481
|
-
const
|
|
46618
|
+
const logger55 = deps.logger ?? createLogger({ tool: "cancel_job" });
|
|
46482
46619
|
const toolSchema = {
|
|
46483
46620
|
jobId: z99.string().min(1).max(128).describe("Job ID returned by orchestrate / run_workflow / consensus_vote in async mode"),
|
|
46484
46621
|
reason: z99.string().max(1e3).optional().describe('Optional human-readable note (e.g. "user clicked cancel").')
|
|
@@ -46487,28 +46624,28 @@ function registerCancelJobTool(server, deps) {
|
|
|
46487
46624
|
const secureHandler = createSecureHandler(cancelJobHandler, {
|
|
46488
46625
|
toolName: "cancel_job",
|
|
46489
46626
|
rateLimiter: deps.rateLimiter,
|
|
46490
|
-
logger:
|
|
46627
|
+
logger: logger55
|
|
46491
46628
|
});
|
|
46492
46629
|
const timeoutMs = getToolTimeout("cancel_job", deps.security);
|
|
46493
46630
|
const wrappedHandler = wrapToolWithTimeout("cancel_job", secureHandler, {
|
|
46494
46631
|
timeoutMs,
|
|
46495
|
-
logger:
|
|
46632
|
+
logger: logger55
|
|
46496
46633
|
});
|
|
46497
46634
|
server.registerTool(
|
|
46498
46635
|
"cancel_job",
|
|
46499
46636
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("cancel_job") },
|
|
46500
46637
|
toSdkCallback(wrappedHandler)
|
|
46501
46638
|
);
|
|
46502
|
-
|
|
46639
|
+
logger55.info("Registered cancel_job tool");
|
|
46503
46640
|
}
|
|
46504
46641
|
|
|
46505
46642
|
// src/mcp/tools/ci-health-check-tool.ts
|
|
46506
46643
|
import { z as z101 } from "zod";
|
|
46507
46644
|
|
|
46508
46645
|
// src/mcp/tools/ci-health-log.ts
|
|
46509
|
-
import { appendFileSync as appendFileSync4, existsSync as existsSync12, readFileSync as readFileSync10, writeFileSync as writeFileSync3 } from "fs";
|
|
46646
|
+
import { appendFileSync as appendFileSync4, existsSync as existsSync12, readFileSync as readFileSync10, statSync as statSync3, writeFileSync as writeFileSync3 } from "fs";
|
|
46510
46647
|
import { z as z100 } from "zod";
|
|
46511
|
-
var
|
|
46648
|
+
var logger43 = createLogger({ component: "ci-health-log" });
|
|
46512
46649
|
var CiHealthEventSchema = z100.object({
|
|
46513
46650
|
v: z100.literal(1),
|
|
46514
46651
|
ts: z100.iso.datetime(),
|
|
@@ -46525,6 +46662,49 @@ var CiHealthEventSchema = z100.object({
|
|
|
46525
46662
|
function logFilePath() {
|
|
46526
46663
|
return nexusDataPathEnsure("ci-health", "events.jsonl");
|
|
46527
46664
|
}
|
|
46665
|
+
var DEFAULT_CI_HEALTH_MAX_BYTES = 2097152;
|
|
46666
|
+
function maxLogBytes() {
|
|
46667
|
+
const raw = process.env["NEXUS_CI_HEALTH_MAX_BYTES"];
|
|
46668
|
+
if (raw === void 0 || raw === "") return DEFAULT_CI_HEALTH_MAX_BYTES;
|
|
46669
|
+
const n = Number.parseInt(raw, 10);
|
|
46670
|
+
return Number.isFinite(n) && n > 0 ? n : DEFAULT_CI_HEALTH_MAX_BYTES;
|
|
46671
|
+
}
|
|
46672
|
+
function capLogSize(path14) {
|
|
46673
|
+
const max = maxLogBytes();
|
|
46674
|
+
let size;
|
|
46675
|
+
try {
|
|
46676
|
+
size = statSync3(path14).size;
|
|
46677
|
+
} catch {
|
|
46678
|
+
return;
|
|
46679
|
+
}
|
|
46680
|
+
if (size <= max) return;
|
|
46681
|
+
try {
|
|
46682
|
+
const lines = readFileSync10(path14, "utf-8").split("\n").filter((l) => l !== "");
|
|
46683
|
+
const kept = [];
|
|
46684
|
+
let bytes = 0;
|
|
46685
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
46686
|
+
const line = lines[i];
|
|
46687
|
+
const lineBytes = Buffer.byteLength(`${line}
|
|
46688
|
+
`, "utf-8");
|
|
46689
|
+
if (kept.length > 0 && bytes + lineBytes > max) break;
|
|
46690
|
+
kept.push(line);
|
|
46691
|
+
bytes += lineBytes;
|
|
46692
|
+
}
|
|
46693
|
+
kept.reverse();
|
|
46694
|
+
writeFileSync3(path14, kept.length > 0 ? `${kept.join("\n")}
|
|
46695
|
+
` : "");
|
|
46696
|
+
logger43.warn("ci-health log exceeded size cap \u2014 dropped oldest events", {
|
|
46697
|
+
maxBytes: max,
|
|
46698
|
+
previousBytes: size,
|
|
46699
|
+
droppedEvents: lines.length - kept.length,
|
|
46700
|
+
keptEvents: kept.length
|
|
46701
|
+
});
|
|
46702
|
+
} catch (err2) {
|
|
46703
|
+
logger43.warn("Failed to cap ci-health log size", {
|
|
46704
|
+
error: err2 instanceof Error ? err2.message : String(err2)
|
|
46705
|
+
});
|
|
46706
|
+
}
|
|
46707
|
+
}
|
|
46528
46708
|
function appendCiHealthEvent(event) {
|
|
46529
46709
|
const record = {
|
|
46530
46710
|
v: 1,
|
|
@@ -46532,10 +46712,12 @@ function appendCiHealthEvent(event) {
|
|
|
46532
46712
|
...event
|
|
46533
46713
|
};
|
|
46534
46714
|
try {
|
|
46535
|
-
|
|
46715
|
+
const path14 = logFilePath();
|
|
46716
|
+
appendFileSync4(path14, `${JSON.stringify(record)}
|
|
46536
46717
|
`);
|
|
46718
|
+
capLogSize(path14);
|
|
46537
46719
|
} catch (err2) {
|
|
46538
|
-
|
|
46720
|
+
logger43.warn("Failed to append ci-health event", {
|
|
46539
46721
|
error: err2 instanceof Error ? err2.message : String(err2)
|
|
46540
46722
|
});
|
|
46541
46723
|
}
|
|
@@ -46573,7 +46755,7 @@ function mapStatusPageStatus(raw) {
|
|
|
46573
46755
|
if (raw === "partial_outage" || raw === "major_outage") return "outage";
|
|
46574
46756
|
return "unknown";
|
|
46575
46757
|
}
|
|
46576
|
-
async function checkGithubStatus(
|
|
46758
|
+
async function checkGithubStatus(logger55) {
|
|
46577
46759
|
try {
|
|
46578
46760
|
const res = await fetch(STATUS_PAGE_URL, {
|
|
46579
46761
|
// 5s budget — status page is fast, hangs here are themselves a degraded signal.
|
|
@@ -46601,7 +46783,7 @@ async function checkGithubStatus(logger54) {
|
|
|
46601
46783
|
evidence: `GitHub Actions component reports: ${actions.status}`
|
|
46602
46784
|
};
|
|
46603
46785
|
} catch (err2) {
|
|
46604
|
-
|
|
46786
|
+
logger55.warn("Status page fetch failed", {
|
|
46605
46787
|
error: err2 instanceof Error ? err2.message : String(err2)
|
|
46606
46788
|
});
|
|
46607
46789
|
return {
|
|
@@ -46614,7 +46796,7 @@ async function checkGithubStatus(logger54) {
|
|
|
46614
46796
|
function countRecentRuns(runs, sinceMs) {
|
|
46615
46797
|
return runs.filter((r) => r.created_at !== void 0 && Date.parse(r.created_at) >= sinceMs).length;
|
|
46616
46798
|
}
|
|
46617
|
-
async function checkRepoActivity(repo, windowMinutes,
|
|
46799
|
+
async function checkRepoActivity(repo, windowMinutes, logger55) {
|
|
46618
46800
|
const sinceMs = Date.now() - windowMinutes * 6e4;
|
|
46619
46801
|
try {
|
|
46620
46802
|
const res = await fetch(`https://api.github.com/repos/${repo}/actions/runs?per_page=30`, {
|
|
@@ -46643,7 +46825,7 @@ async function checkRepoActivity(repo, windowMinutes, logger54) {
|
|
|
46643
46825
|
evidence: `${String(recentCount)} workflow run(s) in last ${String(windowMinutes)} min on ${repo}`
|
|
46644
46826
|
};
|
|
46645
46827
|
} catch (err2) {
|
|
46646
|
-
|
|
46828
|
+
logger55.warn("Repo activity check failed", {
|
|
46647
46829
|
repo,
|
|
46648
46830
|
error: err2 instanceof Error ? err2.message : String(err2)
|
|
46649
46831
|
});
|
|
@@ -46669,7 +46851,7 @@ function combineSignals(signals) {
|
|
|
46669
46851
|
}
|
|
46670
46852
|
return worst;
|
|
46671
46853
|
}
|
|
46672
|
-
async function ciHealthCheckHandler(args,
|
|
46854
|
+
async function ciHealthCheckHandler(args, logger55) {
|
|
46673
46855
|
const parsed = CiHealthCheckInputSchema.safeParse(args);
|
|
46674
46856
|
if (!parsed.success) {
|
|
46675
46857
|
return toolStructuredError({
|
|
@@ -46679,9 +46861,9 @@ async function ciHealthCheckHandler(args, logger54) {
|
|
|
46679
46861
|
}
|
|
46680
46862
|
const { repo, activityWindowMinutes } = parsed.data;
|
|
46681
46863
|
const signals = [];
|
|
46682
|
-
signals.push(await checkGithubStatus(
|
|
46864
|
+
signals.push(await checkGithubStatus(logger55));
|
|
46683
46865
|
if (repo !== void 0) {
|
|
46684
|
-
signals.push(await checkRepoActivity(repo, activityWindowMinutes,
|
|
46866
|
+
signals.push(await checkRepoActivity(repo, activityWindowMinutes, logger55));
|
|
46685
46867
|
}
|
|
46686
46868
|
const response = {
|
|
46687
46869
|
status: combineSignals(signals),
|
|
@@ -46695,20 +46877,20 @@ async function ciHealthCheckHandler(args, logger54) {
|
|
|
46695
46877
|
}
|
|
46696
46878
|
var DESCRIPTION = "Check CI infrastructure health before triggering / polling runs (#3076). Returns { status: healthy|degraded|outage|unknown, signals } composing GitHub status-page state + the configured repo's recent workflow-runs activity. Use BEFORE a long auto-merge wait to skip the wedge cycle when CI is broken org-wide. Read-only, idempotent, no network state mutated.";
|
|
46697
46879
|
function registerCiHealthCheckTool(server, deps) {
|
|
46698
|
-
const
|
|
46880
|
+
const logger55 = deps.logger ?? createLogger({ tool: "ci_health_check" });
|
|
46699
46881
|
const toolSchema = {
|
|
46700
46882
|
repo: z101.string().regex(/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/, "Must be owner/repo form").optional().describe("GitHub repo (owner/repo) to check for recent CI activity. Optional."),
|
|
46701
46883
|
activityWindowMinutes: z101.number().int().min(5).max(180).optional().describe("Recent-runs lookback window in minutes (5-180; default 30).")
|
|
46702
46884
|
};
|
|
46703
|
-
const secureHandler = createSecureHandler((args) => ciHealthCheckHandler(args,
|
|
46885
|
+
const secureHandler = createSecureHandler((args) => ciHealthCheckHandler(args, logger55), {
|
|
46704
46886
|
toolName: "ci_health_check",
|
|
46705
46887
|
rateLimiter: deps.rateLimiter,
|
|
46706
|
-
logger:
|
|
46888
|
+
logger: logger55
|
|
46707
46889
|
});
|
|
46708
46890
|
const timeoutMs = getToolTimeout("ci_health_check", deps.security);
|
|
46709
46891
|
const wrappedHandler = wrapToolWithTimeout("ci_health_check", secureHandler, {
|
|
46710
46892
|
timeoutMs,
|
|
46711
|
-
logger:
|
|
46893
|
+
logger: logger55
|
|
46712
46894
|
});
|
|
46713
46895
|
server.registerTool(
|
|
46714
46896
|
"ci_health_check",
|
|
@@ -46719,7 +46901,7 @@ function registerCiHealthCheckTool(server, deps) {
|
|
|
46719
46901
|
},
|
|
46720
46902
|
toSdkCallback(wrappedHandler)
|
|
46721
46903
|
);
|
|
46722
|
-
|
|
46904
|
+
logger55.info("Registered ci_health_check tool");
|
|
46723
46905
|
}
|
|
46724
46906
|
|
|
46725
46907
|
// src/mcp/tools/verify-audit-chain-tool.ts
|
|
@@ -46731,7 +46913,7 @@ var VerifyAuditChainInputSchema = z102.object({
|
|
|
46731
46913
|
"Filesystem path to the FileAuditStorage log directory. Tool reads all `audit-*.jsonl` files in lexicographic order and verifies the combined chain."
|
|
46732
46914
|
)
|
|
46733
46915
|
});
|
|
46734
|
-
async function loadAuditEvents(dir,
|
|
46916
|
+
async function loadAuditEvents(dir, logger55) {
|
|
46735
46917
|
const entries = await fs12.readdir(dir);
|
|
46736
46918
|
const auditFiles = entries.filter((name) => name.startsWith("audit-") && name.endsWith(".jsonl")).sort();
|
|
46737
46919
|
const events = [];
|
|
@@ -46742,7 +46924,7 @@ async function loadAuditEvents(dir, logger54) {
|
|
|
46742
46924
|
content = await fs12.readFile(fullPath, "utf-8");
|
|
46743
46925
|
} catch (cause) {
|
|
46744
46926
|
const msg = cause instanceof Error ? cause.message : String(cause);
|
|
46745
|
-
|
|
46927
|
+
logger55.warn("Skipping unreadable audit log file", { filename, error: msg });
|
|
46746
46928
|
continue;
|
|
46747
46929
|
}
|
|
46748
46930
|
for (const line of content.split("\n")) {
|
|
@@ -46753,14 +46935,14 @@ async function loadAuditEvents(dir, logger54) {
|
|
|
46753
46935
|
if (validated.success) {
|
|
46754
46936
|
events.push(validated.data);
|
|
46755
46937
|
} else {
|
|
46756
|
-
|
|
46938
|
+
logger55.warn("Skipping malformed audit event", {
|
|
46757
46939
|
filename,
|
|
46758
46940
|
error: validated.error.message
|
|
46759
46941
|
});
|
|
46760
46942
|
}
|
|
46761
46943
|
} catch (cause) {
|
|
46762
46944
|
const msg = cause instanceof Error ? cause.message : String(cause);
|
|
46763
|
-
|
|
46945
|
+
logger55.warn("Skipping unparseable audit event", { filename, error: msg });
|
|
46764
46946
|
}
|
|
46765
46947
|
}
|
|
46766
46948
|
}
|
|
@@ -46802,7 +46984,7 @@ async function handler2(args, ctx) {
|
|
|
46802
46984
|
return toolSuccess(JSON.stringify(response, null, 2));
|
|
46803
46985
|
}
|
|
46804
46986
|
function registerVerifyAuditChainTool(server, deps) {
|
|
46805
|
-
const
|
|
46987
|
+
const logger55 = deps.logger ?? createLogger({ tool: "verify_audit_chain" });
|
|
46806
46988
|
const toolSchema = {
|
|
46807
46989
|
logDir: z102.string().min(1).max(512).describe(
|
|
46808
46990
|
"Filesystem path to the FileAuditStorage log directory. Tool reads all `audit-*.jsonl` files and verifies the combined hash chain."
|
|
@@ -46812,19 +46994,19 @@ function registerVerifyAuditChainTool(server, deps) {
|
|
|
46812
46994
|
const secureHandler = createSecureHandler(handler2, {
|
|
46813
46995
|
toolName: "verify_audit_chain",
|
|
46814
46996
|
rateLimiter: deps.rateLimiter,
|
|
46815
|
-
logger:
|
|
46997
|
+
logger: logger55
|
|
46816
46998
|
});
|
|
46817
46999
|
const timeoutMs = getToolTimeout("verify_audit_chain", deps.security);
|
|
46818
47000
|
const wrappedHandler = wrapToolWithTimeout("verify_audit_chain", secureHandler, {
|
|
46819
47001
|
timeoutMs,
|
|
46820
|
-
logger:
|
|
47002
|
+
logger: logger55
|
|
46821
47003
|
});
|
|
46822
47004
|
server.registerTool(
|
|
46823
47005
|
"verify_audit_chain",
|
|
46824
47006
|
{ description: description2, inputSchema: toolSchema, annotations: getToolAnnotations("verify_audit_chain") },
|
|
46825
47007
|
toSdkCallback(wrappedHandler)
|
|
46826
47008
|
);
|
|
46827
|
-
|
|
47009
|
+
logger55.info("Registered verify_audit_chain tool");
|
|
46828
47010
|
}
|
|
46829
47011
|
|
|
46830
47012
|
// src/mcp/tools/pipeline-tool.ts
|
|
@@ -46903,7 +47085,7 @@ function selectStageRegistry(template, task, agentStages) {
|
|
|
46903
47085
|
return createDevStageRegistry(agentStages);
|
|
46904
47086
|
}
|
|
46905
47087
|
var RUN_PIPELINE_DESCRIPTION = `Single unified entry point for all pipeline templates (${listTemplateIds().join("/")}). Auto-detects template from task content or accepts an explicit override.`;
|
|
46906
|
-
async function runPipelineHandler(args,
|
|
47088
|
+
async function runPipelineHandler(args, logger55) {
|
|
46907
47089
|
const parsed = PipelineInputSchema.safeParse(args);
|
|
46908
47090
|
if (!parsed.success) {
|
|
46909
47091
|
return toolStructuredError({
|
|
@@ -46913,7 +47095,7 @@ async function runPipelineHandler(args, logger54) {
|
|
|
46913
47095
|
}
|
|
46914
47096
|
const input = parsed.data;
|
|
46915
47097
|
if (input.simulateVotes) {
|
|
46916
|
-
warnIfSimulatedOutsideTests("run_pipeline",
|
|
47098
|
+
warnIfSimulatedOutsideTests("run_pipeline", logger55);
|
|
46917
47099
|
}
|
|
46918
47100
|
try {
|
|
46919
47101
|
const task = await resolveTask(input.task, input.specFile);
|
|
@@ -46937,14 +47119,14 @@ async function runPipelineHandler(args, logger54) {
|
|
|
46937
47119
|
}
|
|
46938
47120
|
}
|
|
46939
47121
|
function registerPipelineTool(server, deps) {
|
|
46940
|
-
const
|
|
46941
|
-
const secureHandler = createSecureHandler((args) => runPipelineHandler(args,
|
|
47122
|
+
const logger55 = deps.logger ?? createLogger({ tool: "run_pipeline" });
|
|
47123
|
+
const secureHandler = createSecureHandler((args) => runPipelineHandler(args, logger55), {
|
|
46942
47124
|
toolName: "run_pipeline",
|
|
46943
47125
|
rateLimiter: deps.rateLimiter,
|
|
46944
|
-
logger:
|
|
47126
|
+
logger: logger55
|
|
46945
47127
|
});
|
|
46946
47128
|
const timeoutMs = getToolTimeout("run_pipeline", deps.security);
|
|
46947
|
-
const wrapped = wrapToolWithTimeout("run_pipeline", secureHandler, { timeoutMs, logger:
|
|
47129
|
+
const wrapped = wrapToolWithTimeout("run_pipeline", secureHandler, { timeoutMs, logger: logger55 });
|
|
46948
47130
|
server.registerTool(
|
|
46949
47131
|
"run_pipeline",
|
|
46950
47132
|
{
|
|
@@ -46954,7 +47136,7 @@ function registerPipelineTool(server, deps) {
|
|
|
46954
47136
|
},
|
|
46955
47137
|
toSdkCallback(wrapped)
|
|
46956
47138
|
);
|
|
46957
|
-
|
|
47139
|
+
logger55.info("Registered run_pipeline tool");
|
|
46958
47140
|
}
|
|
46959
47141
|
|
|
46960
47142
|
// src/mcp/tools/supply-chain-tradeoff-panel.ts
|
|
@@ -47209,17 +47391,17 @@ async function tradeoffPanelHandler(args, ctx) {
|
|
|
47209
47391
|
}
|
|
47210
47392
|
}
|
|
47211
47393
|
function registerSupplyChainTradeoffPanelTool(server, deps) {
|
|
47212
|
-
const
|
|
47394
|
+
const logger55 = deps.logger ?? createLogger({ tool: "supply_chain_tradeoff_panel" });
|
|
47213
47395
|
const description2 = "Run a structured per-axis tradeoff vote on an engineering proposal (#2294). Default axes: build_time_determinism / supply_chain_risk / update_cadence. Voters answer EACH axis independently; aggregator surfaces per-axis verdicts so legitimate tradeoffs are not masked by a single approve/reject.";
|
|
47214
47396
|
const secureHandler = createSecureHandler(tradeoffPanelHandler, {
|
|
47215
47397
|
toolName: "supply_chain_tradeoff_panel",
|
|
47216
47398
|
rateLimiter: deps.rateLimiter,
|
|
47217
|
-
logger:
|
|
47399
|
+
logger: logger55
|
|
47218
47400
|
});
|
|
47219
47401
|
const timeoutMs = getToolTimeout("supply_chain_tradeoff_panel", deps.security);
|
|
47220
47402
|
const wrappedHandler = wrapToolWithTimeout("supply_chain_tradeoff_panel", secureHandler, {
|
|
47221
47403
|
timeoutMs,
|
|
47222
|
-
logger:
|
|
47404
|
+
logger: logger55
|
|
47223
47405
|
});
|
|
47224
47406
|
server.registerTool(
|
|
47225
47407
|
"supply_chain_tradeoff_panel",
|
|
@@ -47230,7 +47412,7 @@ function registerSupplyChainTradeoffPanelTool(server, deps) {
|
|
|
47230
47412
|
},
|
|
47231
47413
|
toSdkCallback(wrappedHandler)
|
|
47232
47414
|
);
|
|
47233
|
-
|
|
47415
|
+
logger55.info("Registered supply_chain_tradeoff_panel tool");
|
|
47234
47416
|
}
|
|
47235
47417
|
|
|
47236
47418
|
// src/mcp/tools/tool-annotations.ts
|
|
@@ -47920,13 +48102,13 @@ var REGISTERED_TOOL_NAMES = [
|
|
|
47920
48102
|
"improvement_review"
|
|
47921
48103
|
];
|
|
47922
48104
|
function registerTools(server, options) {
|
|
47923
|
-
const
|
|
47924
|
-
const rateLimiter = options?.rateLimiter ?? createDefaultRateLimiter("mcp-tools",
|
|
47925
|
-
|
|
48105
|
+
const logger55 = options?.logger ?? createMcpLogger({ component: "tools" });
|
|
48106
|
+
const rateLimiter = options?.rateLimiter ?? createDefaultRateLimiter("mcp-tools", logger55);
|
|
48107
|
+
logger55.info("Tool registration infrastructure initialized");
|
|
47926
48108
|
void server;
|
|
47927
48109
|
return {
|
|
47928
48110
|
tools: [...REGISTERED_TOOL_NAMES],
|
|
47929
|
-
logger:
|
|
48111
|
+
logger: logger55,
|
|
47930
48112
|
rateLimiter
|
|
47931
48113
|
};
|
|
47932
48114
|
}
|
|
@@ -47939,32 +48121,32 @@ var TIER_NAMES = {
|
|
|
47939
48121
|
};
|
|
47940
48122
|
function createGateway(config = {}) {
|
|
47941
48123
|
const enabled = config.enabled !== false;
|
|
47942
|
-
const
|
|
48124
|
+
const logger55 = config.logger ?? createLogger({ component: "gateway" });
|
|
47943
48125
|
const overrides = config.tierOverrides;
|
|
47944
48126
|
return {
|
|
47945
48127
|
enabled,
|
|
47946
48128
|
wrapTool(toolName, handler3) {
|
|
47947
48129
|
if (!enabled) return handler3;
|
|
47948
|
-
return createGatewayHandler(toolName, handler3,
|
|
48130
|
+
return createGatewayHandler(toolName, handler3, logger55, overrides);
|
|
47949
48131
|
}
|
|
47950
48132
|
};
|
|
47951
48133
|
}
|
|
47952
|
-
function createGatewayHandler(toolName, handler3,
|
|
48134
|
+
function createGatewayHandler(toolName, handler3, logger55, overrides) {
|
|
47953
48135
|
return async (args) => {
|
|
47954
48136
|
const params = asRecord2(args);
|
|
47955
48137
|
const tier = classifyRequestTier(toolName, params, overrides);
|
|
47956
48138
|
const tierName = TIER_NAMES[tier];
|
|
47957
48139
|
const startMs = getTimeProvider().now();
|
|
47958
|
-
|
|
48140
|
+
logger55.debug("Gateway dispatch", { tool: toolName, tier, tierName });
|
|
47959
48141
|
try {
|
|
47960
48142
|
const result = await handler3(args);
|
|
47961
48143
|
const durationMs = getTimeProvider().now() - startMs;
|
|
47962
48144
|
const success = result.isError !== true;
|
|
47963
48145
|
const entry = { tool: toolName, tier, tierName, durationMs, success };
|
|
47964
48146
|
if (success) {
|
|
47965
|
-
|
|
48147
|
+
logger55.info("Gateway completed", { ...entry });
|
|
47966
48148
|
} else {
|
|
47967
|
-
|
|
48149
|
+
logger55.warn("Gateway completed with error", { ...entry });
|
|
47968
48150
|
}
|
|
47969
48151
|
return result;
|
|
47970
48152
|
} catch (error) {
|
|
@@ -47976,7 +48158,7 @@ function createGatewayHandler(toolName, handler3, logger54, overrides) {
|
|
|
47976
48158
|
durationMs,
|
|
47977
48159
|
success: false
|
|
47978
48160
|
};
|
|
47979
|
-
|
|
48161
|
+
logger55.error("Gateway handler threw", error instanceof Error ? error : void 0, {
|
|
47980
48162
|
...entry
|
|
47981
48163
|
});
|
|
47982
48164
|
throw error;
|
|
@@ -49111,7 +49293,7 @@ function analyzeTools(tools, config = {}) {
|
|
|
49111
49293
|
}
|
|
49112
49294
|
|
|
49113
49295
|
// src/cli-adapters/parsers/gemini-parser.ts
|
|
49114
|
-
var
|
|
49296
|
+
var logger44 = createLogger({ component: "gemini-parser" });
|
|
49115
49297
|
var GeminiResponseParser = class {
|
|
49116
49298
|
name = "gemini-parser";
|
|
49117
49299
|
supportedVersionRange = ">=0.20.0 <1.0.0";
|
|
@@ -49126,7 +49308,7 @@ var GeminiResponseParser = class {
|
|
|
49126
49308
|
}
|
|
49127
49309
|
return data;
|
|
49128
49310
|
} catch {
|
|
49129
|
-
|
|
49311
|
+
logger44.debug("Skipped malformed output line", { snippet: raw.slice(0, 100) });
|
|
49130
49312
|
return null;
|
|
49131
49313
|
}
|
|
49132
49314
|
}
|
|
@@ -49144,7 +49326,7 @@ var GeminiResponseParser = class {
|
|
|
49144
49326
|
}
|
|
49145
49327
|
return null;
|
|
49146
49328
|
} catch {
|
|
49147
|
-
|
|
49329
|
+
logger44.debug("Skipped malformed output line", { snippet: raw.slice(0, 100) });
|
|
49148
49330
|
return null;
|
|
49149
49331
|
}
|
|
49150
49332
|
}
|
|
@@ -49163,7 +49345,7 @@ var GeminiResponseParser = class {
|
|
|
49163
49345
|
if (models === null) return null;
|
|
49164
49346
|
return this.aggregateModelTokens(models);
|
|
49165
49347
|
} catch {
|
|
49166
|
-
|
|
49348
|
+
logger44.debug("Skipped malformed output line", { snippet: raw.slice(0, 100) });
|
|
49167
49349
|
return null;
|
|
49168
49350
|
}
|
|
49169
49351
|
}
|
|
@@ -49210,7 +49392,7 @@ var GeminiResponseParser = class {
|
|
|
49210
49392
|
}
|
|
49211
49393
|
return null;
|
|
49212
49394
|
} catch {
|
|
49213
|
-
|
|
49395
|
+
logger44.debug("Skipped malformed output line", { snippet: raw.slice(0, 100) });
|
|
49214
49396
|
return null;
|
|
49215
49397
|
}
|
|
49216
49398
|
}
|
|
@@ -49241,7 +49423,7 @@ var AgreementCascadeConfigSchema = z107.object({
|
|
|
49241
49423
|
});
|
|
49242
49424
|
|
|
49243
49425
|
// src/cli-adapters/agreement-cascade-router.ts
|
|
49244
|
-
var
|
|
49426
|
+
var logger45 = createLogger({ component: "agreement-cascade-router" });
|
|
49245
49427
|
|
|
49246
49428
|
// src/cli-adapters/task-classifier.ts
|
|
49247
49429
|
import { z as z108 } from "zod";
|
|
@@ -49266,7 +49448,7 @@ var ResponseCacheConfigSchema = z109.object({
|
|
|
49266
49448
|
|
|
49267
49449
|
// src/cli-adapters/response-cache-utils.ts
|
|
49268
49450
|
import { createHash as createHash4 } from "crypto";
|
|
49269
|
-
var
|
|
49451
|
+
var logger46 = createLogger({ component: "ResponseCacheUtils" });
|
|
49270
49452
|
|
|
49271
49453
|
// src/cli-adapters/unified-routing-types.ts
|
|
49272
49454
|
import { z as z110 } from "zod";
|
|
@@ -49365,7 +49547,7 @@ var FeedbackCollectorConfigSchema = z111.object({
|
|
|
49365
49547
|
});
|
|
49366
49548
|
|
|
49367
49549
|
// src/learning/outcome-feedback-helpers.ts
|
|
49368
|
-
import { randomUUID as
|
|
49550
|
+
import { randomUUID as randomUUID11 } from "crypto";
|
|
49369
49551
|
function countOutcomesByClass(outcomes) {
|
|
49370
49552
|
const counts = {
|
|
49371
49553
|
success: 0,
|
|
@@ -49418,7 +49600,7 @@ function generateRewardExplanation(outcome, reward) {
|
|
|
49418
49600
|
}
|
|
49419
49601
|
function createRoutingDecision(params) {
|
|
49420
49602
|
return {
|
|
49421
|
-
id:
|
|
49603
|
+
id: randomUUID11(),
|
|
49422
49604
|
timestamp: getTimeProvider().nowIso(),
|
|
49423
49605
|
...params
|
|
49424
49606
|
};
|
|
@@ -49431,7 +49613,7 @@ function createTaskOutcome(params) {
|
|
|
49431
49613
|
}
|
|
49432
49614
|
|
|
49433
49615
|
// src/learning/outcome-feedback.ts
|
|
49434
|
-
var
|
|
49616
|
+
var logger47 = createLogger({ component: "OutcomeFeedback" });
|
|
49435
49617
|
var OutcomeFeedbackCollector = class {
|
|
49436
49618
|
config;
|
|
49437
49619
|
pendingDecisions = /* @__PURE__ */ new Map();
|
|
@@ -49446,7 +49628,7 @@ var OutcomeFeedbackCollector = class {
|
|
|
49446
49628
|
...DEFAULT_FEEDBACK_COLLECTOR_CONFIG,
|
|
49447
49629
|
...config
|
|
49448
49630
|
});
|
|
49449
|
-
|
|
49631
|
+
logger47.info("OutcomeFeedbackCollector initialized", {
|
|
49450
49632
|
maxPendingDecisions: this.config.maxPendingDecisions,
|
|
49451
49633
|
enableAutoReward: this.config.enableAutoReward
|
|
49452
49634
|
});
|
|
@@ -49456,14 +49638,14 @@ var OutcomeFeedbackCollector = class {
|
|
|
49456
49638
|
*/
|
|
49457
49639
|
registerLinUCBBandit(bandit) {
|
|
49458
49640
|
this.linucbBandit = bandit;
|
|
49459
|
-
|
|
49641
|
+
logger47.debug("LinUCB bandit registered for feedback");
|
|
49460
49642
|
}
|
|
49461
49643
|
/**
|
|
49462
49644
|
* Register PreferenceRouter for direct feedback.
|
|
49463
49645
|
*/
|
|
49464
49646
|
registerPreferenceRouter(router) {
|
|
49465
49647
|
this.preferenceRouter = router;
|
|
49466
|
-
|
|
49648
|
+
logger47.debug("PreferenceRouter registered for feedback");
|
|
49467
49649
|
}
|
|
49468
49650
|
/**
|
|
49469
49651
|
* Subscribe to outcome processed events.
|
|
@@ -49487,7 +49669,7 @@ var OutcomeFeedbackCollector = class {
|
|
|
49487
49669
|
this.pendingDecisions.set(decision.traceId, decision);
|
|
49488
49670
|
this.decisionHistory.push(decision);
|
|
49489
49671
|
this.trimHistory();
|
|
49490
|
-
|
|
49672
|
+
logger47.debug("Routing decision recorded", {
|
|
49491
49673
|
id: decision.id,
|
|
49492
49674
|
traceId: decision.traceId,
|
|
49493
49675
|
routerType: decision.routerType,
|
|
@@ -49504,7 +49686,7 @@ var OutcomeFeedbackCollector = class {
|
|
|
49504
49686
|
this.feedbackToRouters(decision, outcome, reward);
|
|
49505
49687
|
this.notifyCallbacks(decision, outcome, reward);
|
|
49506
49688
|
}
|
|
49507
|
-
|
|
49689
|
+
logger47.debug("Outcome recorded", {
|
|
49508
49690
|
routingDecisionId: outcome.routingDecisionId,
|
|
49509
49691
|
outcomeClass: outcome.outcomeClass,
|
|
49510
49692
|
qualityScore: outcome.qualityScore
|
|
@@ -49513,7 +49695,7 @@ var OutcomeFeedbackCollector = class {
|
|
|
49513
49695
|
processOutcome(traceId, partialOutcome) {
|
|
49514
49696
|
const decision = this.pendingDecisions.get(traceId);
|
|
49515
49697
|
if (decision === void 0) {
|
|
49516
|
-
|
|
49698
|
+
logger47.warn("No pending decision found for trace", { traceId });
|
|
49517
49699
|
return;
|
|
49518
49700
|
}
|
|
49519
49701
|
const outcome = {
|
|
@@ -49576,7 +49758,7 @@ var OutcomeFeedbackCollector = class {
|
|
|
49576
49758
|
if (decisionTime < cutoff) {
|
|
49577
49759
|
this.pendingDecisions.delete(traceId);
|
|
49578
49760
|
cleared++;
|
|
49579
|
-
|
|
49761
|
+
logger47.debug("Expired pending decision cleared", {
|
|
49580
49762
|
id: decision.id,
|
|
49581
49763
|
traceId,
|
|
49582
49764
|
age: now - decisionTime
|
|
@@ -49598,7 +49780,7 @@ var OutcomeFeedbackCollector = class {
|
|
|
49598
49780
|
this.pendingDecisions.clear();
|
|
49599
49781
|
this.outcomes.length = 0;
|
|
49600
49782
|
this.decisionHistory.length = 0;
|
|
49601
|
-
|
|
49783
|
+
logger47.info("OutcomeFeedbackCollector reset");
|
|
49602
49784
|
}
|
|
49603
49785
|
feedbackToRouters(decision, outcome, reward) {
|
|
49604
49786
|
if (!this.config.enableAutoReward) return;
|
|
@@ -49609,7 +49791,7 @@ var OutcomeFeedbackCollector = class {
|
|
|
49609
49791
|
if (decision.routerType !== "linucb" || this.linucbBandit === void 0) return;
|
|
49610
49792
|
if (decision.armIndex === void 0 || decision.banditContext === void 0) return;
|
|
49611
49793
|
this.linucbBandit.update(decision.armIndex, decision.banditContext, reward.reward);
|
|
49612
|
-
|
|
49794
|
+
logger47.debug("LinUCB bandit updated", {
|
|
49613
49795
|
armIndex: decision.armIndex,
|
|
49614
49796
|
reward: reward.reward
|
|
49615
49797
|
});
|
|
@@ -49623,7 +49805,7 @@ var OutcomeFeedbackCollector = class {
|
|
|
49623
49805
|
decision.selectedTier === "strong" ? outcome.qualityScore : void 0,
|
|
49624
49806
|
decision.selectedTier === "weak" ? outcome.qualityScore : void 0
|
|
49625
49807
|
);
|
|
49626
|
-
|
|
49808
|
+
logger47.debug("PreferenceRouter updated", {
|
|
49627
49809
|
strongModelPreferred,
|
|
49628
49810
|
qualityScore: outcome.qualityScore
|
|
49629
49811
|
});
|
|
@@ -49634,7 +49816,7 @@ var OutcomeFeedbackCollector = class {
|
|
|
49634
49816
|
callback(decision, outcome, reward);
|
|
49635
49817
|
} catch (err2) {
|
|
49636
49818
|
const error = err2 instanceof Error ? err2 : new Error(String(err2));
|
|
49637
|
-
|
|
49819
|
+
logger47.error("Callback error", error);
|
|
49638
49820
|
}
|
|
49639
49821
|
}
|
|
49640
49822
|
}
|
|
@@ -49674,7 +49856,7 @@ var DEFAULT_FEEDBACK_INTEGRATION_CONFIG = {
|
|
|
49674
49856
|
};
|
|
49675
49857
|
|
|
49676
49858
|
// src/learning/feedback-integration.ts
|
|
49677
|
-
import { randomUUID as
|
|
49859
|
+
import { randomUUID as randomUUID12 } from "crypto";
|
|
49678
49860
|
var STEP_QUALITY_SCORING = {
|
|
49679
49861
|
/** Base score for successful steps. */
|
|
49680
49862
|
successBase: 0.8,
|
|
@@ -49750,8 +49932,8 @@ var FeedbackIntegration = class {
|
|
|
49750
49932
|
});
|
|
49751
49933
|
}
|
|
49752
49934
|
recordRoutingDecision(decision, traceId) {
|
|
49753
|
-
const id =
|
|
49754
|
-
const trace = traceId ??
|
|
49935
|
+
const id = randomUUID12();
|
|
49936
|
+
const trace = traceId ?? randomUUID12();
|
|
49755
49937
|
const now = getTimeProvider().now();
|
|
49756
49938
|
this.evictStaleEntriesThrottled(now);
|
|
49757
49939
|
if (this.decisionMap.size >= MAX_DECISION_MAP_SIZE) {
|
|
@@ -49824,7 +50006,7 @@ var FeedbackIntegration = class {
|
|
|
49824
50006
|
} = params;
|
|
49825
50007
|
const outcomeClass = this.determineOutcomeClass(success, qualityScore);
|
|
49826
50008
|
const completionRatio = success ? 1 : qualityScore / this.config.successQualityThreshold;
|
|
49827
|
-
const trace = traceId ??
|
|
50009
|
+
const trace = traceId ?? randomUUID12();
|
|
49828
50010
|
const outcome = {
|
|
49829
50011
|
routingDecisionId,
|
|
49830
50012
|
timestamp: getTimeProvider().nowIso(),
|
|
@@ -50427,7 +50609,7 @@ import { execFile as execFile4 } from "child_process";
|
|
|
50427
50609
|
import { promisify as promisify4 } from "util";
|
|
50428
50610
|
import { resolve as resolve17, normalize as normalize2, sep as sep10 } from "path";
|
|
50429
50611
|
var execFileAsync4 = promisify4(execFile4);
|
|
50430
|
-
var
|
|
50612
|
+
var logger48 = createLogger({ component: "sandbox-executor" });
|
|
50431
50613
|
function parseExecError(error) {
|
|
50432
50614
|
const execError = error;
|
|
50433
50615
|
const isTimeout = execError.killed === true;
|
|
@@ -50527,7 +50709,7 @@ var PolicySandboxExecutor = class {
|
|
|
50527
50709
|
const baseEnv = createMinimalEnv(options.cwd);
|
|
50528
50710
|
const sanitized = sanitizeEnvironment(process.env, policy.allowedEnvVars, options.env);
|
|
50529
50711
|
if (sanitized.blocked.length > 0 && this.config.logViolations) {
|
|
50530
|
-
|
|
50712
|
+
logger48.debug("Blocked environment variables", { blocked: sanitized.blocked });
|
|
50531
50713
|
}
|
|
50532
50714
|
return { ...baseEnv, ...sanitized.env };
|
|
50533
50715
|
}
|
|
@@ -50549,7 +50731,7 @@ var PolicySandboxExecutor = class {
|
|
|
50549
50731
|
* Creates a denied result when policy prevents execution.
|
|
50550
50732
|
*/
|
|
50551
50733
|
createDeniedResult(command, _args, evaluation, startTime) {
|
|
50552
|
-
|
|
50734
|
+
logger48.warn("Sandbox policy denied execution", {
|
|
50553
50735
|
command,
|
|
50554
50736
|
policy: evaluation.policyId,
|
|
50555
50737
|
reason: evaluation.reason
|
|
@@ -50570,7 +50752,7 @@ var PolicySandboxExecutor = class {
|
|
|
50570
50752
|
*/
|
|
50571
50753
|
createSuccessResult(command, _args, result, evaluation, startTime) {
|
|
50572
50754
|
const durationMs = getTimeProvider().now() - startTime;
|
|
50573
|
-
|
|
50755
|
+
logger48.debug("Sandbox execution succeeded", { command, durationMs });
|
|
50574
50756
|
return {
|
|
50575
50757
|
success: result.exitCode === 0,
|
|
50576
50758
|
exitCode: result.exitCode,
|
|
@@ -50610,9 +50792,9 @@ var PolicySandboxExecutor = class {
|
|
|
50610
50792
|
*/
|
|
50611
50793
|
logExecutionError(command, execError, durationMs) {
|
|
50612
50794
|
if (execError.isTimeout) {
|
|
50613
|
-
|
|
50795
|
+
logger48.warn("Sandbox execution timed out", { command, durationMs });
|
|
50614
50796
|
} else {
|
|
50615
|
-
|
|
50797
|
+
logger48.debug("Sandbox execution failed", {
|
|
50616
50798
|
command,
|
|
50617
50799
|
exitCode: execError.exitCode,
|
|
50618
50800
|
durationMs
|
|
@@ -50648,7 +50830,7 @@ var PolicySandboxExecutor = class {
|
|
|
50648
50830
|
*/
|
|
50649
50831
|
logViolations(command, evaluation) {
|
|
50650
50832
|
for (const violation of evaluation.violations) {
|
|
50651
|
-
|
|
50833
|
+
logger48.warn("Sandbox policy violation", {
|
|
50652
50834
|
command,
|
|
50653
50835
|
type: violation.type,
|
|
50654
50836
|
denied: violation.denied,
|
|
@@ -50663,7 +50845,7 @@ function createSandboxExecutor(config) {
|
|
|
50663
50845
|
}
|
|
50664
50846
|
|
|
50665
50847
|
// src/security/sandbox/sandbox-factory.ts
|
|
50666
|
-
var
|
|
50848
|
+
var logger49 = createLogger({ component: "sandbox-factory" });
|
|
50667
50849
|
var DEFAULT_OPTIONS3 = {
|
|
50668
50850
|
mode: "policy",
|
|
50669
50851
|
fallbackToPolicy: true
|
|
@@ -50685,7 +50867,7 @@ function createSandbox(options) {
|
|
|
50685
50867
|
}
|
|
50686
50868
|
}
|
|
50687
50869
|
function createNoneMode() {
|
|
50688
|
-
|
|
50870
|
+
logger49.warn('Creating sandbox in "none" mode - NO ISOLATION');
|
|
50689
50871
|
const executor = new PolicySandboxExecutor({
|
|
50690
50872
|
defaultPolicy: STANDARD_POLICY,
|
|
50691
50873
|
enforce: false,
|
|
@@ -50699,7 +50881,7 @@ function createNoneMode() {
|
|
|
50699
50881
|
};
|
|
50700
50882
|
}
|
|
50701
50883
|
function createPolicyMode(config) {
|
|
50702
|
-
|
|
50884
|
+
logger49.info('Creating sandbox in "policy" mode');
|
|
50703
50885
|
const executor = new PolicySandboxExecutor(config);
|
|
50704
50886
|
return {
|
|
50705
50887
|
executor,
|
|
@@ -50708,7 +50890,7 @@ function createPolicyMode(config) {
|
|
|
50708
50890
|
};
|
|
50709
50891
|
}
|
|
50710
50892
|
function createDeprecatedModeFallback(requestedMode, policyConfig) {
|
|
50711
|
-
|
|
50893
|
+
logger49.warn(`Sandbox mode "${requestedMode}" is no longer supported; using "policy" mode`, {
|
|
50712
50894
|
requestedMode,
|
|
50713
50895
|
actualMode: "policy",
|
|
50714
50896
|
reason: "In-process Docker/Deno executors were deleted in #2551. Use the OpenCode sandbox bootstrap for real isolation (NEXUS_SANDBOX environment variable, see docs/guides/SANDBOXED-USAGE.md)."
|
|
@@ -50723,7 +50905,7 @@ function createDeprecatedModeFallback(requestedMode, policyConfig) {
|
|
|
50723
50905
|
}
|
|
50724
50906
|
|
|
50725
50907
|
// src/security/sandbox/sandbox-manager.ts
|
|
50726
|
-
var
|
|
50908
|
+
var logger50 = createLogger({ component: "sandbox-manager" });
|
|
50727
50909
|
var DEFAULT_CONFIG5 = {
|
|
50728
50910
|
mode: "policy",
|
|
50729
50911
|
fallbackToPolicy: true,
|
|
@@ -50735,7 +50917,7 @@ var isInitialized = false;
|
|
|
50735
50917
|
var initWarning;
|
|
50736
50918
|
async function initializeSandbox(config) {
|
|
50737
50919
|
if (isInitialized && globalSandbox !== null) {
|
|
50738
|
-
|
|
50920
|
+
logger50.debug("Sandbox already initialized, skipping");
|
|
50739
50921
|
const baseResult = {
|
|
50740
50922
|
executor: globalSandbox,
|
|
50741
50923
|
actualMode,
|
|
@@ -50747,7 +50929,7 @@ async function initializeSandbox(config) {
|
|
|
50747
50929
|
return baseResult;
|
|
50748
50930
|
}
|
|
50749
50931
|
const finalConfig = { ...DEFAULT_CONFIG5, ...config };
|
|
50750
|
-
|
|
50932
|
+
logger50.info("Initializing sandbox", {
|
|
50751
50933
|
mode: finalConfig.mode,
|
|
50752
50934
|
fallbackToPolicy: finalConfig.fallbackToPolicy
|
|
50753
50935
|
});
|
|
@@ -50760,13 +50942,13 @@ async function initializeSandbox(config) {
|
|
|
50760
50942
|
isInitialized = true;
|
|
50761
50943
|
initWarning = result.warning;
|
|
50762
50944
|
if (result.usedFallback) {
|
|
50763
|
-
|
|
50945
|
+
logger50.warn("Sandbox initialized with fallback", {
|
|
50764
50946
|
requestedMode: finalConfig.mode,
|
|
50765
50947
|
actualMode: result.actualMode,
|
|
50766
50948
|
warning: result.warning
|
|
50767
50949
|
});
|
|
50768
50950
|
} else {
|
|
50769
|
-
|
|
50951
|
+
logger50.info("Sandbox initialized", {
|
|
50770
50952
|
mode: result.actualMode,
|
|
50771
50953
|
executor: result.executor.name
|
|
50772
50954
|
});
|
|
@@ -50778,7 +50960,7 @@ function getSandboxMode() {
|
|
|
50778
50960
|
}
|
|
50779
50961
|
|
|
50780
50962
|
// src/pipeline/feedback-subscriber.ts
|
|
50781
|
-
var
|
|
50963
|
+
var logger51 = createLogger({ component: "FeedbackSubscriber" });
|
|
50782
50964
|
var VALID_CLIS = new Set(CLI_NAMES);
|
|
50783
50965
|
function createFeedbackSubscriber(bus, store) {
|
|
50784
50966
|
return bus.subscribe({ type: ["model.called", "stage.failed"] }, (event) => {
|
|
@@ -50786,7 +50968,7 @@ function createFeedbackSubscriber(bus, store) {
|
|
|
50786
50968
|
handleEvent2(event, store);
|
|
50787
50969
|
} catch (error) {
|
|
50788
50970
|
const msg = getErrorMessage(error);
|
|
50789
|
-
|
|
50971
|
+
logger51.warn("Feedback subscriber error", { error: msg });
|
|
50790
50972
|
}
|
|
50791
50973
|
});
|
|
50792
50974
|
}
|
|
@@ -50843,12 +51025,12 @@ function normalizeCli(cli) {
|
|
|
50843
51025
|
if (VALID_CLIS.has(cli)) {
|
|
50844
51026
|
return cli;
|
|
50845
51027
|
}
|
|
50846
|
-
|
|
51028
|
+
logger51.warn("Unknown CLI in event", { cli });
|
|
50847
51029
|
return void 0;
|
|
50848
51030
|
}
|
|
50849
51031
|
|
|
50850
51032
|
// src/pipeline/event-bus-bridge.ts
|
|
50851
|
-
var
|
|
51033
|
+
var logger52 = createLogger({ component: "EventBusBridge" });
|
|
50852
51034
|
function toV1Topic(prefix, event) {
|
|
50853
51035
|
return `${prefix}.${event.type}`;
|
|
50854
51036
|
}
|
|
@@ -50880,10 +51062,10 @@ function createEventBusBridge(options) {
|
|
|
50880
51062
|
forwardCount++;
|
|
50881
51063
|
} catch (error) {
|
|
50882
51064
|
const msg = getErrorMessage(error);
|
|
50883
|
-
|
|
51065
|
+
logger52.warn("Failed to forward pipeline event", { type: event.type, error: msg });
|
|
50884
51066
|
}
|
|
50885
51067
|
});
|
|
50886
|
-
|
|
51068
|
+
logger52.info("EventBus bridge initialized", { prefix });
|
|
50887
51069
|
return {
|
|
50888
51070
|
forwarded: () => forwardCount,
|
|
50889
51071
|
dispose: unsub
|
|
@@ -50891,7 +51073,7 @@ function createEventBusBridge(options) {
|
|
|
50891
51073
|
}
|
|
50892
51074
|
|
|
50893
51075
|
// src/adapters/stdin-lifecycle.ts
|
|
50894
|
-
var
|
|
51076
|
+
var logger53 = createLogger({ component: "StdinLifecycleMonitor" });
|
|
50895
51077
|
var DEFAULT_PPID_POLL_MS = 3e4;
|
|
50896
51078
|
var StdinLifecycleMonitor = class {
|
|
50897
51079
|
callbacks = /* @__PURE__ */ new Set();
|
|
@@ -50941,7 +51123,7 @@ var StdinLifecycleMonitor = class {
|
|
|
50941
51123
|
clearInterval(this.ppidTimer);
|
|
50942
51124
|
this.ppidTimer = void 0;
|
|
50943
51125
|
}
|
|
50944
|
-
|
|
51126
|
+
logger53.warn("Parent process gone \u2014 shutting down MCP server", { reason });
|
|
50945
51127
|
await this.fireCallbacks();
|
|
50946
51128
|
}
|
|
50947
51129
|
async fireCallbacks() {
|
|
@@ -50949,7 +51131,7 @@ var StdinLifecycleMonitor = class {
|
|
|
50949
51131
|
try {
|
|
50950
51132
|
await cb();
|
|
50951
51133
|
} catch (error) {
|
|
50952
|
-
|
|
51134
|
+
logger53.warn("Stdin shutdown callback failed", { error: String(error) });
|
|
50953
51135
|
}
|
|
50954
51136
|
}
|
|
50955
51137
|
}
|
|
@@ -50963,7 +51145,7 @@ function getStdinLifecycleMonitor() {
|
|
|
50963
51145
|
// src/pipeline/task-tracker.ts
|
|
50964
51146
|
import * as fs14 from "fs";
|
|
50965
51147
|
import * as path13 from "path";
|
|
50966
|
-
var
|
|
51148
|
+
var logger54 = createLogger({ component: "task-tracker" });
|
|
50967
51149
|
async function exec(cmd, args, timeout = 15e3) {
|
|
50968
51150
|
const { execFile: execFile5 } = await import("child_process");
|
|
50969
51151
|
const { promisify: promisify5 } = await import("util");
|
|
@@ -50989,7 +51171,7 @@ var GitHubTaskTracker = class {
|
|
|
50989
51171
|
const result = await provider.createIssue(title, body, this.config.labels);
|
|
50990
51172
|
if (!result.ok) throw new Error("Failed to create issue");
|
|
50991
51173
|
const id = String(result.value.number);
|
|
50992
|
-
|
|
51174
|
+
logger54.info("Created GitHub issue via SCM provider", { id });
|
|
50993
51175
|
return { id, title, status: "open", url: result.value.url };
|
|
50994
51176
|
}
|
|
50995
51177
|
async updateStatus(taskId, status) {
|
|
@@ -51017,7 +51199,7 @@ var GitLabTaskTracker = class {
|
|
|
51017
51199
|
);
|
|
51018
51200
|
const match = /\/(\d+)$/.exec(url);
|
|
51019
51201
|
const id = match?.[1] ?? url;
|
|
51020
|
-
|
|
51202
|
+
logger54.info("Created GitLab issue", { id, url });
|
|
51021
51203
|
return { id, title, status: "open", url };
|
|
51022
51204
|
}
|
|
51023
51205
|
async updateStatus(taskId, status) {
|
|
@@ -51692,4 +51874,4 @@ export {
|
|
|
51692
51874
|
detectBackend,
|
|
51693
51875
|
createTaskTracker
|
|
51694
51876
|
};
|
|
51695
|
-
//# sourceMappingURL=chunk-
|
|
51877
|
+
//# sourceMappingURL=chunk-WOGMMJUI.js.map
|