@inspectr/mcplab 1.30.0 → 1.31.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/README.md +2 -2
- package/dist/app/assets/index-Cwogc_kk.js +267 -0
- package/dist/app/assets/index-D5OYchKq.css +2 -0
- package/dist/app/index.html +2 -2
- package/dist/app-server/app-context.d.ts +6 -22
- package/dist/app-server/app-context.d.ts.map +1 -1
- package/dist/app-server/assistant-agent.d.ts +10 -0
- package/dist/app-server/assistant-agent.d.ts.map +1 -0
- package/dist/app-server/assistant-agent.js +29 -0
- package/dist/app-server/assistant-agent.js.map +1 -0
- package/dist/app-server/assistant-common.d.ts +7 -34
- package/dist/app-server/assistant-common.d.ts.map +1 -1
- package/dist/app-server/assistant-common.js +33 -194
- package/dist/app-server/assistant-common.js.map +1 -1
- package/dist/app-server/assistant-events.d.ts +10 -6
- package/dist/app-server/assistant-events.d.ts.map +1 -1
- package/dist/app-server/assistant-events.js +23 -11
- package/dist/app-server/assistant-events.js.map +1 -1
- package/dist/app-server/assistant-graph-nodes.d.ts +226 -0
- package/dist/app-server/assistant-graph-nodes.d.ts.map +1 -0
- package/dist/app-server/assistant-graph-nodes.js +365 -0
- package/dist/app-server/assistant-graph-nodes.js.map +1 -0
- package/dist/app-server/assistant-graph-state.d.ts +64 -0
- package/dist/app-server/assistant-graph-state.d.ts.map +1 -0
- package/dist/app-server/assistant-graph-state.js +137 -0
- package/dist/app-server/assistant-graph-state.js.map +1 -0
- package/dist/app-server/assistant-mcp-context-tools.d.ts +17 -0
- package/dist/app-server/assistant-mcp-context-tools.d.ts.map +1 -0
- package/dist/app-server/assistant-mcp-context-tools.js +149 -0
- package/dist/app-server/assistant-mcp-context-tools.js.map +1 -0
- package/dist/app-server/assistant-model.d.ts +24 -0
- package/dist/app-server/assistant-model.d.ts.map +1 -0
- package/dist/app-server/assistant-model.js +240 -0
- package/dist/app-server/assistant-model.js.map +1 -0
- package/dist/app-server/assistant-runtime-contract.d.ts +46 -0
- package/dist/app-server/assistant-runtime-contract.d.ts.map +1 -0
- package/dist/app-server/assistant-runtime-contract.js +2 -0
- package/dist/app-server/assistant-runtime-contract.js.map +1 -0
- package/dist/app-server/assistant-runtime-policy.d.ts +22 -0
- package/dist/app-server/assistant-runtime-policy.d.ts.map +1 -0
- package/dist/app-server/assistant-runtime-policy.js +71 -0
- package/dist/app-server/assistant-runtime-policy.js.map +1 -0
- package/dist/app-server/assistant-service.d.ts +23 -0
- package/dist/app-server/assistant-service.d.ts.map +1 -0
- package/dist/app-server/assistant-service.js +185 -0
- package/dist/app-server/assistant-service.js.map +1 -0
- package/dist/app-server/assistant-session-routes.d.ts +25 -0
- package/dist/app-server/assistant-session-routes.d.ts.map +1 -0
- package/dist/app-server/assistant-session-routes.js +210 -0
- package/dist/app-server/assistant-session-routes.js.map +1 -0
- package/dist/app-server/assistant-tracing.d.ts +5 -0
- package/dist/app-server/assistant-tracing.d.ts.map +1 -0
- package/dist/app-server/assistant-tracing.js +30 -0
- package/dist/app-server/assistant-tracing.js.map +1 -0
- package/dist/app-server/browser-provider-learning.js +1 -1
- package/dist/app-server/browser-provider-learning.js.map +1 -1
- package/dist/app-server/langchain-assistant-runtime.d.ts +11 -0
- package/dist/app-server/langchain-assistant-runtime.d.ts.map +1 -0
- package/dist/app-server/langchain-assistant-runtime.js +852 -0
- package/dist/app-server/langchain-assistant-runtime.js.map +1 -0
- package/dist/app-server/one-shot-json.d.ts +26 -0
- package/dist/app-server/one-shot-json.d.ts.map +1 -0
- package/dist/app-server/one-shot-json.js +168 -0
- package/dist/app-server/one-shot-json.js.map +1 -0
- package/dist/app-server/result-assistant-domain.d.ts +46 -48
- package/dist/app-server/result-assistant-domain.d.ts.map +1 -1
- package/dist/app-server/result-assistant-domain.js +148 -133
- package/dist/app-server/result-assistant-domain.js.map +1 -1
- package/dist/app-server/result-assistant.d.ts +2 -2
- package/dist/app-server/result-assistant.d.ts.map +1 -1
- package/dist/app-server/result-assistant.js +43 -311
- package/dist/app-server/result-assistant.js.map +1 -1
- package/dist/app-server/router.d.ts.map +1 -1
- package/dist/app-server/router.js +14 -16
- package/dist/app-server/router.js.map +1 -1
- package/dist/app-server/runs-routes.js +1 -1
- package/dist/app-server/runs-routes.js.map +1 -1
- package/dist/app-server/scenario-assistant-domain.d.ts +43 -136
- package/dist/app-server/scenario-assistant-domain.d.ts.map +1 -1
- package/dist/app-server/scenario-assistant-domain.js +377 -215
- package/dist/app-server/scenario-assistant-domain.js.map +1 -1
- package/dist/app-server/scenario-assistant.d.ts +3 -3
- package/dist/app-server/scenario-assistant.d.ts.map +1 -1
- package/dist/app-server/scenario-assistant.js +52 -406
- package/dist/app-server/scenario-assistant.js.map +1 -1
- package/dist/app-server/settings-store.d.ts.map +1 -1
- package/dist/app-server/settings-store.js +2 -5
- package/dist/app-server/settings-store.js.map +1 -1
- package/dist/app-server/tool-analysis-domain.d.ts +1 -1
- package/dist/app-server/tool-analysis-domain.d.ts.map +1 -1
- package/dist/app-server/tool-analysis-domain.js +5 -4
- package/dist/app-server/tool-analysis-domain.js.map +1 -1
- package/dist/app-server/types.d.ts +1 -1
- package/dist/app-server/types.d.ts.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/package.json +10 -4
- package/dist/app/assets/index-8I9ZyPIK.js +0 -243
- package/dist/app/assets/index-jX7LoIQP.css +0 -2
|
@@ -1,18 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { McpClientManager } from '@inspectr/mcplab-core';
|
|
2
|
+
import { ASSISTANT_TOOL_TIMEOUT_MESSAGE, assistantToolDisplay, ASSISTANT_TOOL_TIMEOUT_MS, cleanupSessionsByTtl, makeAssistantToolPublicName, touchSession, truncateJson, withTimeout } from './assistant-common.js';
|
|
3
3
|
import { endAssistantSseClients } from './assistant-events.js';
|
|
4
|
-
import {
|
|
4
|
+
import { setupAssistantRuntimeSession } from './assistant-service.js';
|
|
5
|
+
import { isResultAssistantAllowedTool, isResultAssistantAutoApprovedTool } from './result-assistant-tools.js';
|
|
6
|
+
import { APPROVAL_GUIDANCE } from './assistant-runtime-policy.js';
|
|
7
|
+
function createResultAssistantResources(agentConfig, resultSummary, referenceReportsForRun) {
|
|
8
|
+
return {
|
|
9
|
+
agentConfig,
|
|
10
|
+
mcp: new McpClientManager(),
|
|
11
|
+
tools: [],
|
|
12
|
+
toolPublicMap: new Map(),
|
|
13
|
+
resultSummary,
|
|
14
|
+
referenceReportsForRun
|
|
15
|
+
};
|
|
16
|
+
}
|
|
5
17
|
const RESULT_ASSISTANT_SESSION_TTL_MS = 30 * 60 * 1000;
|
|
6
|
-
const RESULT_ASSISTANT_TOOL_RESULT_PREVIEW_CHARS = 4000;
|
|
7
|
-
const RESULT_ASSISTANT_MAX_PENDING_TOOL_CALLS = 3;
|
|
8
18
|
const RESULT_ASSISTANT_MCP_SERVER_NAME = 'mcplab';
|
|
19
|
+
// The hard TTL also aborts work in abandoned sessions; active operations refresh lastTouchedAt.
|
|
9
20
|
export function cleanupResultAssistantSessions(sessions, now = Date.now()) {
|
|
10
|
-
cleanupSessionsByTtl(sessions, RESULT_ASSISTANT_SESSION_TTL_MS, now,
|
|
21
|
+
cleanupSessionsByTtl(sessions, RESULT_ASSISTANT_SESSION_TTL_MS, now, (session) => {
|
|
22
|
+
void Promise.resolve(session.runtime.dispose()).catch(() => { });
|
|
23
|
+
endAssistantSseClients(session);
|
|
24
|
+
});
|
|
11
25
|
}
|
|
12
26
|
export function touchResultAssistantSession(session) {
|
|
13
27
|
touchSession(session);
|
|
14
28
|
}
|
|
15
29
|
export function resultAssistantSessionView(session) {
|
|
30
|
+
const runtimeSnapshot = session.runtime.getSnapshot();
|
|
16
31
|
return {
|
|
17
32
|
id: session.id,
|
|
18
33
|
scope: session.scope,
|
|
@@ -20,119 +35,139 @@ export function resultAssistantSessionView(session) {
|
|
|
20
35
|
createdAt: new Date(session.createdAt).toISOString(),
|
|
21
36
|
updatedAt: new Date(session.lastTouchedAt).toISOString(),
|
|
22
37
|
selectedAssistantAgentName: session.selectedAssistantAgentName,
|
|
23
|
-
model: session.
|
|
24
|
-
provider: session.
|
|
25
|
-
|
|
26
|
-
|
|
38
|
+
model: session.model,
|
|
39
|
+
provider: session.provider,
|
|
40
|
+
toolsLoaded: session.toolsLoaded,
|
|
41
|
+
toolServers: session.toolServers,
|
|
42
|
+
revision: runtimeSnapshot.revision,
|
|
43
|
+
messages: runtimeSnapshot.messages,
|
|
44
|
+
pendingToolCalls: runtimeSnapshot.pendingToolCalls,
|
|
45
|
+
activeTurnId: runtimeSnapshot.activeTurnId,
|
|
46
|
+
streamingMessage: runtimeSnapshot.streamingMessage
|
|
27
47
|
};
|
|
28
48
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
const discovered = await session.mcp.listTools(RESULT_ASSISTANT_MCP_SERVER_NAME);
|
|
37
|
-
const usedNames = new Set();
|
|
38
|
-
for (const tool of discovered) {
|
|
39
|
-
if (!isResultAssistantAllowedTool(tool.name))
|
|
40
|
-
continue;
|
|
41
|
-
const publicName = makeAssistantToolPublicName(RESULT_ASSISTANT_MCP_SERVER_NAME, tool.name, usedNames);
|
|
42
|
-
session.toolPublicMap.set(publicName, {
|
|
43
|
-
server: RESULT_ASSISTANT_MCP_SERVER_NAME,
|
|
44
|
-
tool: tool.name
|
|
45
|
-
});
|
|
46
|
-
session.tools.push({
|
|
47
|
-
...tool,
|
|
48
|
-
name: publicName,
|
|
49
|
-
description: `${tool.description ?? ''}\n[server=${RESULT_ASSISTANT_MCP_SERVER_NAME} tool=${tool.name}]`.trim()
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
export async function continueResultAssistantTurn(session, signal) {
|
|
54
|
-
const pendingCount = session.pendingToolCalls.filter((c) => c.status === 'pending').length;
|
|
55
|
-
if (pendingCount > RESULT_ASSISTANT_MAX_PENDING_TOOL_CALLS) {
|
|
56
|
-
throw new Error('Result Assistant exceeded maximum pending tool calls for this turn');
|
|
57
|
-
}
|
|
58
|
-
const modelOutput = await resultAssistantChatModel(session, signal);
|
|
59
|
-
throwIfAborted(signal);
|
|
60
|
-
if (modelOutput.type === 'tool_call_request') {
|
|
61
|
-
const requested = modelOutput.toolCall;
|
|
62
|
-
const mapping = session.toolPublicMap.get(requested.name);
|
|
63
|
-
if (!mapping) {
|
|
64
|
-
throw new Error(`Result Assistant requested unknown tool '${requested.name}'. Available tools: ${session.tools.map((t) => t.name).join(', ')}`);
|
|
65
|
-
}
|
|
66
|
-
const pending = {
|
|
67
|
-
id: newAssistantEntityId('ratc'),
|
|
68
|
-
server: mapping.server,
|
|
69
|
-
tool: mapping.tool,
|
|
70
|
-
publicToolName: requested.name,
|
|
71
|
-
arguments: requested.arguments ?? {},
|
|
72
|
-
status: 'pending',
|
|
73
|
-
createdAt: new Date().toISOString()
|
|
74
|
-
};
|
|
75
|
-
const toolRequestText = `I need to call '${formatAssistantToolName(pending.publicToolName)}' to help with this request.`;
|
|
76
|
-
throwIfAborted(signal);
|
|
77
|
-
session.pendingToolCalls.push(pending);
|
|
78
|
-
session.chatMessages.push({
|
|
79
|
-
id: newAssistantEntityId('msg'),
|
|
80
|
-
role: 'assistant',
|
|
81
|
-
text: toolRequestText,
|
|
82
|
-
createdAt: new Date().toISOString(),
|
|
83
|
-
pendingToolCallId: pending.id,
|
|
84
|
-
toolRequestServer: pending.server,
|
|
85
|
-
toolRequestName: pending.tool,
|
|
86
|
-
toolRequestPublicName: pending.publicToolName
|
|
87
|
-
});
|
|
88
|
-
session.llmMessages.push({
|
|
89
|
-
role: 'assistant',
|
|
90
|
-
content: toolRequestText,
|
|
91
|
-
tool_calls: [{ id: pending.id, name: pending.publicToolName, arguments: pending.arguments }]
|
|
92
|
-
});
|
|
93
|
-
touchResultAssistantSession(session);
|
|
94
|
-
return {
|
|
95
|
-
session: resultAssistantSessionView(session),
|
|
96
|
-
response: { type: 'tool_call_request', text: toolRequestText, pendingToolCall: pending }
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
session.chatMessages.push({
|
|
100
|
-
id: newAssistantEntityId('msg'),
|
|
101
|
-
role: 'assistant',
|
|
102
|
-
text: modelOutput.text,
|
|
103
|
-
createdAt: new Date().toISOString()
|
|
104
|
-
});
|
|
105
|
-
session.llmMessages.push({ role: 'assistant', content: modelOutput.text });
|
|
106
|
-
touchResultAssistantSession(session);
|
|
49
|
+
function createResultAssistantSetup(session, agentConfig, resultSummary, referenceReportsForRun, refreshReports) {
|
|
50
|
+
const state = createResultAssistantResources(agentConfig, resultSummary, referenceReportsForRun);
|
|
51
|
+
let disposePromise;
|
|
52
|
+
const dispose = () => {
|
|
53
|
+
disposePromise ??= Promise.resolve().then(() => state.mcp.disconnectAll());
|
|
54
|
+
return disposePromise;
|
|
55
|
+
};
|
|
107
56
|
return {
|
|
108
|
-
|
|
109
|
-
|
|
57
|
+
dispose,
|
|
58
|
+
async preload(mcpServerUrl) {
|
|
59
|
+
await state.mcp.connectAll({
|
|
60
|
+
[RESULT_ASSISTANT_MCP_SERVER_NAME]: { transport: 'http', url: mcpServerUrl }
|
|
61
|
+
});
|
|
62
|
+
const discovered = await state.mcp.listTools(RESULT_ASSISTANT_MCP_SERVER_NAME);
|
|
63
|
+
const usedNames = new Set();
|
|
64
|
+
for (const tool of discovered) {
|
|
65
|
+
if (!isResultAssistantAllowedTool(tool.name))
|
|
66
|
+
continue;
|
|
67
|
+
const publicName = makeAssistantToolPublicName(RESULT_ASSISTANT_MCP_SERVER_NAME, tool.name, usedNames);
|
|
68
|
+
state.toolPublicMap.set(publicName, {
|
|
69
|
+
server: RESULT_ASSISTANT_MCP_SERVER_NAME,
|
|
70
|
+
tool: tool.name,
|
|
71
|
+
display: assistantToolDisplay(tool)
|
|
72
|
+
});
|
|
73
|
+
state.tools.push({
|
|
74
|
+
...tool,
|
|
75
|
+
name: publicName,
|
|
76
|
+
description: `${tool.description ?? ''}\n[server=${RESULT_ASSISTANT_MCP_SERVER_NAME} tool=${tool.name}]`.trim()
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
session.toolsLoaded = state.tools.length;
|
|
80
|
+
session.toolServers = Array.from(new Set(state.tools.map((tool) => tool.name.split('__')[0])));
|
|
81
|
+
},
|
|
82
|
+
createRuntimeDefinition() {
|
|
83
|
+
return {
|
|
84
|
+
assistant: 'result',
|
|
85
|
+
agent: state.agentConfig,
|
|
86
|
+
context: {
|
|
87
|
+
scope: session.scope,
|
|
88
|
+
runId: session.runId,
|
|
89
|
+
resultSummary: state.resultSummary,
|
|
90
|
+
referenceReportsForRun: state.referenceReportsForRun
|
|
91
|
+
},
|
|
92
|
+
initialMessages: session.initialMessages,
|
|
93
|
+
dispose,
|
|
94
|
+
getSystemPrompt: () => resultAssistantSystemPrompt(session, state),
|
|
95
|
+
tools: state.tools.map((tool) => {
|
|
96
|
+
const mapping = state.toolPublicMap.get(tool.name);
|
|
97
|
+
return {
|
|
98
|
+
name: tool.name,
|
|
99
|
+
server: mapping.server,
|
|
100
|
+
tool: mapping.tool,
|
|
101
|
+
description: tool.description,
|
|
102
|
+
inputSchema: tool.inputSchema,
|
|
103
|
+
display: mapping.display,
|
|
104
|
+
execute: async (arguments_, signal) => {
|
|
105
|
+
const result = await withTimeout(() => state.mcp.callTool(mapping.server, mapping.tool, arguments_, { signal }), ASSISTANT_TOOL_TIMEOUT_MS, ASSISTANT_TOOL_TIMEOUT_MESSAGE, signal);
|
|
106
|
+
if (mapping.tool === 'mcplab_write_markdown_report' && session.scope === 'run') {
|
|
107
|
+
state.referenceReportsForRun = refreshReports();
|
|
108
|
+
state.systemPromptCache = undefined;
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}),
|
|
114
|
+
approvalPolicy: (name) => {
|
|
115
|
+
const rawName = state.toolPublicMap.get(name)?.tool;
|
|
116
|
+
if (!rawName)
|
|
117
|
+
return 'approval_required';
|
|
118
|
+
return isResultAssistantAllowedTool(rawName) && isResultAssistantAutoApprovedTool(rawName)
|
|
119
|
+
? 'automatic'
|
|
120
|
+
: 'approval_required';
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
110
124
|
};
|
|
111
125
|
}
|
|
112
|
-
export async function
|
|
113
|
-
const
|
|
114
|
-
return
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
126
|
+
export async function setupResultAssistantSession(params) {
|
|
127
|
+
const setup = createResultAssistantSetup(params.session, params.agentConfig, params.resultSummary, params.referenceReportsForRun, params.refreshReports);
|
|
128
|
+
return setupAssistantRuntimeSession({
|
|
129
|
+
session: params.session,
|
|
130
|
+
factory: params.assistantRuntimeFactory,
|
|
131
|
+
disposeSetup: setup.dispose,
|
|
132
|
+
prepare: async (emitInitialEvent) => {
|
|
133
|
+
try {
|
|
134
|
+
await setup.preload(params.mcpServerUrl);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
138
|
+
params.session.initialMessages.push({
|
|
139
|
+
id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
140
|
+
role: 'system',
|
|
141
|
+
text: `Warning: could not preload MCPLab MCP tools: ${message}`,
|
|
142
|
+
createdAt: new Date().toISOString()
|
|
143
|
+
});
|
|
144
|
+
emitInitialEvent({
|
|
145
|
+
type: 'session_warning',
|
|
146
|
+
ts: new Date().toISOString(),
|
|
147
|
+
payload: { warning: message }
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return setup.createRuntimeDefinition();
|
|
151
|
+
},
|
|
152
|
+
onEvent: params.onEvent,
|
|
153
|
+
onActivity: params.onActivity
|
|
154
|
+
});
|
|
120
155
|
}
|
|
121
|
-
function resultAssistantSystemPrompt(session) {
|
|
122
|
-
if (
|
|
123
|
-
return
|
|
156
|
+
function resultAssistantSystemPrompt(session, state) {
|
|
157
|
+
if (state.systemPromptCache)
|
|
158
|
+
return state.systemPromptCache;
|
|
124
159
|
const scenarioLimit = 30;
|
|
125
|
-
const totalScenarioCount =
|
|
160
|
+
const totalScenarioCount = state.resultSummary?.scenarios.length ?? 0;
|
|
126
161
|
const omittedScenarioCount = Math.max(0, totalScenarioCount - scenarioLimit);
|
|
127
|
-
const scenarioSummaries =
|
|
162
|
+
const scenarioSummaries = state.resultSummary?.scenarios.slice(0, scenarioLimit).map((sc) => ({
|
|
128
163
|
scenario_id: sc.scenario_id,
|
|
129
164
|
agent: sc.agent,
|
|
130
165
|
pass_rate: sc.pass_rate,
|
|
131
166
|
run_count: sc.runs.length,
|
|
132
167
|
sample_failures: sc.runs.flatMap((r) => r.failures).slice(0, 5)
|
|
133
168
|
})) ?? [];
|
|
134
|
-
const toolLines =
|
|
135
|
-
const mapping =
|
|
169
|
+
const toolLines = state.tools.map((tool) => {
|
|
170
|
+
const mapping = state.toolPublicMap.get(tool.name);
|
|
136
171
|
const schemaText = tool.inputSchema ? truncateJson(tool.inputSchema, 500) : '{}';
|
|
137
172
|
return `- ${tool.name} (server=${mapping?.server ?? 'unknown'}, tool=${mapping?.tool ?? tool.name}) schema=${schemaText}`;
|
|
138
173
|
});
|
|
@@ -142,7 +177,7 @@ function resultAssistantSystemPrompt(session) {
|
|
|
142
177
|
'Be concise and practical.',
|
|
143
178
|
'You may call MCPLab MCP tools for grounded follow-up actions (e.g. write a markdown report) when useful, but only when it improves the answer.',
|
|
144
179
|
'Tool selection policy: prefer search_* tools first for retrieval; fall back to list_* tools when the query is unknown, broad, or full coverage is required.',
|
|
145
|
-
|
|
180
|
+
APPROVAL_GUIDANCE,
|
|
146
181
|
'Respond in plain text. If you need to call a tool, use the available tools directly.',
|
|
147
182
|
session.scope === 'all_runs'
|
|
148
183
|
? 'Scope: all historical runs. Use mcplab_results_search for broad retrieval, mcplab_results_context for focused excerpts, and mcplab_read_run_artifact only for raw fallback reads.'
|
|
@@ -152,16 +187,16 @@ function resultAssistantSystemPrompt(session) {
|
|
|
152
187
|
session.scope === 'all_runs'
|
|
153
188
|
? 'Run result context: none preloaded. You can inspect any run from history using available tools.'
|
|
154
189
|
: `Run result context: ${JSON.stringify({
|
|
155
|
-
run_id:
|
|
156
|
-
timestamp:
|
|
157
|
-
run_note:
|
|
158
|
-
config_hash:
|
|
159
|
-
summary:
|
|
190
|
+
run_id: state.resultSummary?.metadata.run_id,
|
|
191
|
+
timestamp: state.resultSummary?.metadata.timestamp,
|
|
192
|
+
run_note: state.resultSummary?.metadata.run_note ?? null,
|
|
193
|
+
config_hash: state.resultSummary?.metadata.config_hash,
|
|
194
|
+
summary: state.resultSummary?.summary,
|
|
160
195
|
scenario_count_total: totalScenarioCount,
|
|
161
196
|
scenario_count_included: scenarioSummaries.length,
|
|
162
197
|
scenario_count_omitted: omittedScenarioCount,
|
|
163
198
|
scenarios: scenarioSummaries,
|
|
164
|
-
linked_custom_reports:
|
|
199
|
+
linked_custom_reports: state.referenceReportsForRun.slice(0, 20)
|
|
165
200
|
})}`,
|
|
166
201
|
session.scope === 'all_runs'
|
|
167
202
|
? 'For custom markdown reports across runs, use mcplab_search_markdown_reports (no query needed for full listing, or filter by run_id/name). Then read selected files with mcplab_read_markdown_report.'
|
|
@@ -170,27 +205,7 @@ function resultAssistantSystemPrompt(session) {
|
|
|
170
205
|
? `Available MCPLab MCP tools:\n${toolLines.join('\n')}`
|
|
171
206
|
: 'No MCPLab MCP tools available.'
|
|
172
207
|
].join('\n');
|
|
173
|
-
|
|
208
|
+
state.systemPromptCache = prompt;
|
|
174
209
|
return prompt;
|
|
175
210
|
}
|
|
176
|
-
async function resultAssistantChatModel(session, signal) {
|
|
177
|
-
const response = await chatWithAgent({
|
|
178
|
-
agent: session.agentConfig,
|
|
179
|
-
messages: session.llmMessages,
|
|
180
|
-
tools: session.tools,
|
|
181
|
-
system: resultAssistantSystemPrompt(session),
|
|
182
|
-
signal
|
|
183
|
-
});
|
|
184
|
-
if (response.tool_calls && response.tool_calls.length > 0) {
|
|
185
|
-
const [first] = response.tool_calls;
|
|
186
|
-
const baseText = response.content?.trim() ||
|
|
187
|
-
`I need to call '${formatAssistantToolName(first.name)}' to help with this request.`;
|
|
188
|
-
return {
|
|
189
|
-
type: 'tool_call_request',
|
|
190
|
-
text: baseText,
|
|
191
|
-
toolCall: { name: first.name, arguments: first.arguments ?? {} }
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
return { type: 'assistant_message', text: response.content?.trim() ?? '' };
|
|
195
|
-
}
|
|
196
211
|
//# sourceMappingURL=result-assistant-domain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-assistant-domain.js","sourceRoot":"","sources":["../../src/app-server/result-assistant-domain.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"result-assistant-domain.js","sourceRoot":"","sources":["../../src/app-server/result-assistant-domain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
2
|
import type { AppRouteDeps, AppRouteRequestContext } from './app-context.js';
|
|
3
|
-
import type
|
|
4
|
-
export type ResultAssistantRouteDeps = Pick<AppRouteDeps, 'parseBody' | 'asJson' | 'getRunResults' | 'readLibraries' | 'pickDefaultAssistantAgentName' | 'resolveAssistantAgentFromLibraries' | '
|
|
3
|
+
import { type ResultAssistantSession } from './result-assistant-domain.js';
|
|
4
|
+
export type ResultAssistantRouteDeps = Pick<AppRouteDeps, 'parseBody' | 'asJson' | 'getRunResults' | 'readLibraries' | 'pickDefaultAssistantAgentName' | 'resolveAssistantAgentFromLibraries' | 'assistantRuntimeFactory'>;
|
|
5
5
|
export declare function handleResultAssistantRoutes(params: {
|
|
6
6
|
req: IncomingMessage;
|
|
7
7
|
res: ServerResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-assistant.d.ts","sourceRoot":"","sources":["../../src/app-server/result-assistant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"result-assistant.d.ts","sourceRoot":"","sources":["../../src/app-server/result-assistant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjE,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAGL,KAAK,sBAAsB,EAE5B,MAAM,8BAA8B,CAAC;AActC,MAAM,MAAM,wBAAwB,GAAG,IAAI,CACzC,YAAY,EACV,WAAW,GACX,QAAQ,GACR,eAAe,GACf,eAAe,GACf,+BAA+B,GAC/B,oCAAoC,GACpC,yBAAyB,CAC5B,CAAC;AAEF,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,EAAE,cAAc,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC7C,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAC7D,IAAI,EAAE,wBAAwB,CAAC;CAChC,GAAG,OAAO,CAAC,OAAO,CAAC,CAgHnB"}
|