@inspectr/mcplab 1.29.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 +24 -3
- 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/connection-test-routes.d.ts +8 -0
- package/dist/app-server/connection-test-routes.d.ts.map +1 -0
- package/dist/app-server/connection-test-routes.js +34 -0
- package/dist/app-server/connection-test-routes.js.map +1 -0
- package/dist/app-server/decision-routes.d.ts +8 -0
- package/dist/app-server/decision-routes.d.ts.map +1 -0
- package/dist/app-server/decision-routes.js +27 -0
- package/dist/app-server/decision-routes.js.map +1 -0
- 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/live-tests.d.ts +2 -5
- package/dist/app-server/live-tests.d.ts.map +1 -1
- package/dist/app-server/live-tests.js +21 -8
- package/dist/app-server/live-tests.js.map +1 -1
- 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/provider-models.d.ts +1 -6
- package/dist/app-server/provider-models.d.ts.map +1 -1
- package/dist/app-server/provider-models.js +11 -12
- package/dist/app-server/provider-models.js.map +1 -1
- package/dist/app-server/request-origin.d.ts +6 -0
- package/dist/app-server/request-origin.d.ts.map +1 -0
- package/dist/app-server/request-origin.js +61 -0
- package/dist/app-server/request-origin.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 +0 -2
- package/dist/app-server/router.d.ts.map +1 -1
- package/dist/app-server/router.js +69 -71
- package/dist/app-server/router.js.map +1 -1
- package/dist/app-server/run-queue-executor.d.ts +2 -14
- package/dist/app-server/run-queue-executor.d.ts.map +1 -1
- package/dist/app-server/run-queue-executor.js +7 -16
- package/dist/app-server/run-queue-executor.js.map +1 -1
- package/dist/app-server/runs-routes.d.ts.map +1 -1
- package/dist/app-server/runs-routes.js +16 -15
- 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 +3 -7
- package/dist/app-server/settings-store.d.ts.map +1 -1
- package/dist/app-server/settings-store.js +35 -20
- 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 +3 -4
- package/dist/app-server/types.d.ts.map +1 -1
- package/dist/cli.js +6 -6
- package/dist/cli.js.map +1 -1
- package/package.json +10 -4
- package/dist/app/assets/index-256LN2cO.css +0 -2
- package/dist/app/assets/index-DVIaEnjQ.js +0 -243
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { ASSISTANT_TOOL_TIMEOUT_MESSAGE, ASSISTANT_TOOL_TIMEOUT_MS, withTimeout } from './assistant-common.js';
|
|
2
|
+
export const MCP_CONTEXT_TOOL_NAMES = [
|
|
3
|
+
'list_mcp_resources',
|
|
4
|
+
'read_mcp_resource',
|
|
5
|
+
'list_mcp_prompts',
|
|
6
|
+
'get_mcp_prompt'
|
|
7
|
+
];
|
|
8
|
+
const MAX_LISTED_ITEMS = 200;
|
|
9
|
+
const READ_ONLY = { readOnly: true };
|
|
10
|
+
/**
|
|
11
|
+
* Read-only tools that let an assistant use the server's own resources (documents, schemas)
|
|
12
|
+
* and prompt templates as context. Only features a server advertises are offered.
|
|
13
|
+
*/
|
|
14
|
+
export function createMcpContextTools(mcp, servers) {
|
|
15
|
+
const tools = [];
|
|
16
|
+
const serverField = (names) => ({
|
|
17
|
+
type: 'string',
|
|
18
|
+
enum: names,
|
|
19
|
+
description: 'MCP server name'
|
|
20
|
+
});
|
|
21
|
+
const pick = (requested, available) => {
|
|
22
|
+
if (requested === undefined)
|
|
23
|
+
return available;
|
|
24
|
+
if (typeof requested === 'string' && available.includes(requested))
|
|
25
|
+
return [requested];
|
|
26
|
+
throw new Error(`Unknown server '${String(requested)}'. Choose one of: ${available.join(', ')}`);
|
|
27
|
+
};
|
|
28
|
+
if (servers.resources.length) {
|
|
29
|
+
tools.push({
|
|
30
|
+
name: 'list_mcp_resources',
|
|
31
|
+
server: 'mcp',
|
|
32
|
+
tool: 'list_mcp_resources',
|
|
33
|
+
display: { title: 'List MCP resources', hints: READ_ONLY },
|
|
34
|
+
description: 'List the resources (documents, schemas, reference data) the selected MCP servers expose. Read relevant ones before proposing scenario changes.',
|
|
35
|
+
inputSchema: {
|
|
36
|
+
type: 'object',
|
|
37
|
+
properties: { server: serverField(servers.resources) },
|
|
38
|
+
additionalProperties: false
|
|
39
|
+
},
|
|
40
|
+
execute: async (args, signal) => {
|
|
41
|
+
const listed = [];
|
|
42
|
+
for (const server of pick(argument(args, 'server'), servers.resources))
|
|
43
|
+
for (const resource of await mcp.listResources(server, signal))
|
|
44
|
+
listed.push({ server, ...resource });
|
|
45
|
+
return { resources: listed.slice(0, MAX_LISTED_ITEMS), total: listed.length };
|
|
46
|
+
}
|
|
47
|
+
}, {
|
|
48
|
+
name: 'read_mcp_resource',
|
|
49
|
+
server: 'mcp',
|
|
50
|
+
tool: 'read_mcp_resource',
|
|
51
|
+
display: { title: 'Read MCP resource', hints: READ_ONLY },
|
|
52
|
+
description: 'Read one MCP resource by URI. Binary content is reported by type and size only.',
|
|
53
|
+
inputSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: { server: serverField(servers.resources), uri: { type: 'string' } },
|
|
56
|
+
required: ['server', 'uri'],
|
|
57
|
+
additionalProperties: false
|
|
58
|
+
},
|
|
59
|
+
execute: async (args, signal) => {
|
|
60
|
+
const [server] = pick(argument(args, 'server'), servers.resources);
|
|
61
|
+
const uri = argument(args, 'uri');
|
|
62
|
+
if (typeof uri !== 'string' || !uri)
|
|
63
|
+
throw new Error('uri is required');
|
|
64
|
+
return { server, contents: await mcp.readResource(server, uri, signal) };
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (servers.prompts.length) {
|
|
69
|
+
tools.push({
|
|
70
|
+
name: 'list_mcp_prompts',
|
|
71
|
+
server: 'mcp',
|
|
72
|
+
tool: 'list_mcp_prompts',
|
|
73
|
+
display: { title: 'List MCP prompts', hints: READ_ONLY },
|
|
74
|
+
description: 'List the prompt templates the selected MCP servers provide. They show how the server expects to be used.',
|
|
75
|
+
inputSchema: {
|
|
76
|
+
type: 'object',
|
|
77
|
+
properties: { server: serverField(servers.prompts) },
|
|
78
|
+
additionalProperties: false
|
|
79
|
+
},
|
|
80
|
+
execute: async (args, signal) => {
|
|
81
|
+
const listed = [];
|
|
82
|
+
for (const server of pick(argument(args, 'server'), servers.prompts))
|
|
83
|
+
for (const prompt of await mcp.listPrompts(server, signal))
|
|
84
|
+
listed.push({ server, ...prompt });
|
|
85
|
+
return { prompts: listed.slice(0, MAX_LISTED_ITEMS), total: listed.length };
|
|
86
|
+
}
|
|
87
|
+
}, {
|
|
88
|
+
name: 'get_mcp_prompt',
|
|
89
|
+
server: 'mcp',
|
|
90
|
+
tool: 'get_mcp_prompt',
|
|
91
|
+
display: { title: 'Get MCP prompt', hints: READ_ONLY },
|
|
92
|
+
description: 'Get one MCP prompt template, filled in with the given arguments.',
|
|
93
|
+
inputSchema: {
|
|
94
|
+
type: 'object',
|
|
95
|
+
properties: {
|
|
96
|
+
server: serverField(servers.prompts),
|
|
97
|
+
name: { type: 'string' },
|
|
98
|
+
arguments: { type: 'object', additionalProperties: { type: 'string' } }
|
|
99
|
+
},
|
|
100
|
+
required: ['server', 'name'],
|
|
101
|
+
additionalProperties: false
|
|
102
|
+
},
|
|
103
|
+
execute: async (args, signal) => {
|
|
104
|
+
const [server] = pick(argument(args, 'server'), servers.prompts);
|
|
105
|
+
const name = argument(args, 'name');
|
|
106
|
+
if (typeof name !== 'string' || !name)
|
|
107
|
+
throw new Error('name is required');
|
|
108
|
+
const promptArgs = argument(args, 'arguments');
|
|
109
|
+
return {
|
|
110
|
+
server,
|
|
111
|
+
...(await mcp.getPrompt(server, name, promptArgs && typeof promptArgs === 'object'
|
|
112
|
+
? promptArgs
|
|
113
|
+
: undefined, signal))
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return tools.map((tool) => ({
|
|
119
|
+
...tool,
|
|
120
|
+
execute: (args, signal) => withToolTimeout(signal, (bounded) => tool.execute(args, bounded))
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
/** Prompt guidance for the context tools that are actually available. */
|
|
124
|
+
export function mcpContextToolGuidance(servers) {
|
|
125
|
+
const lines = [];
|
|
126
|
+
if (servers.resources.length)
|
|
127
|
+
lines.push(`MCP resources are available from: ${servers.resources.join(', ')}. Use list_mcp_resources and read_mcp_resource to read the server's own documentation, schemas or reference data before proposing prompts, Checks or Value Capture Rules.`);
|
|
128
|
+
if (servers.prompts.length)
|
|
129
|
+
lines.push(`MCP prompt templates are available from: ${servers.prompts.join(', ')}. Use list_mcp_prompts and get_mcp_prompt to see how the server expects to be used; they are good starting points for scenario prompts.`);
|
|
130
|
+
return lines;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* One limit covers the whole call, across every page and server, like other assistant tools.
|
|
134
|
+
* On timeout or completion the MCP requests still in flight are aborted, not left running.
|
|
135
|
+
*/
|
|
136
|
+
async function withToolTimeout(signal, run) {
|
|
137
|
+
const stop = new AbortController();
|
|
138
|
+
const requestSignal = signal ? AbortSignal.any([signal, stop.signal]) : stop.signal;
|
|
139
|
+
try {
|
|
140
|
+
return await withTimeout(() => run(requestSignal), ASSISTANT_TOOL_TIMEOUT_MS, ASSISTANT_TOOL_TIMEOUT_MESSAGE, signal);
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
stop.abort();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function argument(args, key) {
|
|
147
|
+
return args && typeof args === 'object' ? args[key] : undefined;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=assistant-mcp-context-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-mcp-context-tools.js","sourceRoot":"","sources":["../../src/app-server/assistant-mcp-context-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
2
|
+
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
3
|
+
import { type AgentMiddleware } from 'langchain';
|
|
4
|
+
import type { AssistantRuntimeDefinition } from './assistant-runtime-contract.js';
|
|
5
|
+
export interface AssistantChatModelOptions {
|
|
6
|
+
/** Attached to every model instance so streamed tokens reach the runtime exactly once. */
|
|
7
|
+
callbacks: BaseCallbackHandler[];
|
|
8
|
+
/** Compatibility retries are only safe before any text has been shown to the user. */
|
|
9
|
+
hasStreamedText(): boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface AssistantChatModelSetup {
|
|
12
|
+
model: BaseChatModel;
|
|
13
|
+
middleware: AgentMiddleware[];
|
|
14
|
+
}
|
|
15
|
+
export type AssistantChatModelFactory = (definition: AssistantRuntimeDefinition, options: AssistantChatModelOptions) => AssistantChatModelSetup | Promise<AssistantChatModelSetup>;
|
|
16
|
+
/**
|
|
17
|
+
* Production models: MCPlab provider configuration on standard LangChain chat models. The
|
|
18
|
+
* concrete model is chosen per call by middleware, so missing credentials surface on the first
|
|
19
|
+
* message (as before) and provider compatibility fallbacks stay out of the agent loop.
|
|
20
|
+
*/
|
|
21
|
+
export declare const createAssistantChatModel: AssistantChatModelFactory;
|
|
22
|
+
/** The OpenAI models that reason, matching @langchain/openai's own check. */
|
|
23
|
+
export declare function isOpenAIReasoningModel(model: string): boolean;
|
|
24
|
+
//# sourceMappingURL=assistant-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-model.d.ts","sourceRoot":"","sources":["../../src/app-server/assistant-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAE5E,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAanE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAElF,MAAM,WAAW,yBAAyB;IACxC,0FAA0F;IAC1F,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,sFAAsF;IACtF,eAAe,IAAI,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,UAAU,EAAE,0BAA0B,EACtC,OAAO,EAAE,yBAAyB,KAC/B,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAUhE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,yBAGrC,CAAC;AAgFH,6EAA6E;AAC7E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO7D"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
2
|
+
import { createMiddleware } from 'langchain';
|
|
3
|
+
import { AgentConnectionError, anthropicModelCandidates, isAbortError, isModelNotFound, isUnsupportedTemperatureError, resolveAzureFoundryConnection, resolveAzureOpenAIDeployment, DEFAULT_ANTHROPIC_MAX_TOKENS, DEFAULT_AZURE_OPENAI_API_VERSION } from '@inspectr/mcplab-core';
|
|
4
|
+
/**
|
|
5
|
+
* Production models: MCPlab provider configuration on standard LangChain chat models. The
|
|
6
|
+
* concrete model is chosen per call by middleware, so missing credentials surface on the first
|
|
7
|
+
* message (as before) and provider compatibility fallbacks stay out of the agent loop.
|
|
8
|
+
*/
|
|
9
|
+
export const createAssistantChatModel = (definition, options) => ({
|
|
10
|
+
model: new UnresolvedAssistantChatModel(),
|
|
11
|
+
middleware: [providerModelMiddleware(definition.agent, options)]
|
|
12
|
+
});
|
|
13
|
+
function providerModelMiddleware(agent, options) {
|
|
14
|
+
const cache = new Map();
|
|
15
|
+
const modelFor = (variant) => {
|
|
16
|
+
const key = JSON.stringify(variant);
|
|
17
|
+
let model = cache.get(key);
|
|
18
|
+
if (!model) {
|
|
19
|
+
model = buildChatModel(agent, variant, options.callbacks);
|
|
20
|
+
model.catch(() => cache.delete(key));
|
|
21
|
+
cache.set(key, model);
|
|
22
|
+
}
|
|
23
|
+
return model;
|
|
24
|
+
};
|
|
25
|
+
const anthropicCandidates = agent.provider === 'anthropic' ? anthropicModelCandidates(agent.model) : [];
|
|
26
|
+
return createMiddleware({
|
|
27
|
+
name: 'McplabProviderModel',
|
|
28
|
+
wrapModelCall: async (request, handler) => {
|
|
29
|
+
let variant = {
|
|
30
|
+
...(anthropicCandidates.length ? { anthropicModel: anthropicCandidates[0] } : {}),
|
|
31
|
+
...(agent.provider === 'openai' && isOpenAIReasoningModel(agent.model)
|
|
32
|
+
? { openaiReasoning: true }
|
|
33
|
+
: {}),
|
|
34
|
+
azureTokenField: 'max_completion_tokens',
|
|
35
|
+
includeTemperature: typeof agent.temperature === 'number'
|
|
36
|
+
};
|
|
37
|
+
for (;;) {
|
|
38
|
+
const model = await modelFor(variant);
|
|
39
|
+
try {
|
|
40
|
+
return await handler({ ...request, model });
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (isAbortError(error) || options.hasStreamedText())
|
|
44
|
+
throw error;
|
|
45
|
+
const next = nextVariant(agent, variant, error, anthropicCandidates);
|
|
46
|
+
if (!next)
|
|
47
|
+
throw error;
|
|
48
|
+
variant = next;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function nextVariant(agent, variant, error, anthropicCandidates) {
|
|
55
|
+
// Some models (reasoning models, newer Claude models) reject temperature outright.
|
|
56
|
+
if (variant.includeTemperature && isUnsupportedTemperatureError(error))
|
|
57
|
+
return { ...variant, includeTemperature: false };
|
|
58
|
+
if (agent.provider === 'anthropic') {
|
|
59
|
+
if (!isAnthropicModelNotFound(error))
|
|
60
|
+
return undefined;
|
|
61
|
+
const index = anthropicCandidates.indexOf(variant.anthropicModel ?? '');
|
|
62
|
+
const anthropicModel = anthropicCandidates[index + 1];
|
|
63
|
+
if (!anthropicModel)
|
|
64
|
+
throw anthropicModelNotFound(agent.model, anthropicCandidates);
|
|
65
|
+
return { ...variant, anthropicModel };
|
|
66
|
+
}
|
|
67
|
+
if (agent.provider === 'openai') {
|
|
68
|
+
const message = errorMessage(error).toLowerCase();
|
|
69
|
+
// Fall back to Chat Completions if a model rejects the reasoning settings.
|
|
70
|
+
return variant.openaiReasoning &&
|
|
71
|
+
message.includes('reasoning') &&
|
|
72
|
+
(message.includes('not supported') || message.includes('unsupported'))
|
|
73
|
+
? { ...variant, openaiReasoning: false }
|
|
74
|
+
: undefined;
|
|
75
|
+
}
|
|
76
|
+
if (agent.provider !== 'azure_openai' && agent.provider !== 'azure_foundry')
|
|
77
|
+
return undefined;
|
|
78
|
+
const message = errorMessage(error).toLowerCase();
|
|
79
|
+
if (variant.azureTokenField === 'max_completion_tokens' &&
|
|
80
|
+
agent.max_tokens !== undefined &&
|
|
81
|
+
message.includes('max_completion_tokens') &&
|
|
82
|
+
message.includes('not supported'))
|
|
83
|
+
return { ...variant, azureTokenField: 'max_tokens' };
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
/** The OpenAI models that reason, matching @langchain/openai's own check. */
|
|
87
|
+
export function isOpenAIReasoningModel(model) {
|
|
88
|
+
const name = model.trim();
|
|
89
|
+
return (/^o\d/.test(name) ||
|
|
90
|
+
(name.startsWith('gpt-5') && !name.startsWith('gpt-5-chat')) ||
|
|
91
|
+
(name.startsWith('gpt-6') && !name.startsWith('gpt-6-chat')));
|
|
92
|
+
}
|
|
93
|
+
async function buildChatModel(agent, variant, callbacks) {
|
|
94
|
+
if (agent.provider === 'openai') {
|
|
95
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
96
|
+
if (!apiKey)
|
|
97
|
+
throw new AgentConnectionError('missing_credentials', 'Missing OPENAI_API_KEY');
|
|
98
|
+
if (variant.openaiReasoning) {
|
|
99
|
+
const { ChatOpenAIResponses } = await import('@langchain/openai');
|
|
100
|
+
return new ChatOpenAIResponses({
|
|
101
|
+
apiKey,
|
|
102
|
+
model: agent.model,
|
|
103
|
+
temperature: variant.includeTemperature ? agent.temperature : undefined,
|
|
104
|
+
maxTokens: agent.max_tokens,
|
|
105
|
+
maxRetries: 0,
|
|
106
|
+
configuration: { maxRetries: 0 },
|
|
107
|
+
callbacks,
|
|
108
|
+
reasoning: { summary: 'auto' },
|
|
109
|
+
// Keep responses out of OpenAI storage; reasoning is replayed encrypted between calls.
|
|
110
|
+
zdrEnabled: true,
|
|
111
|
+
modelKwargs: { include: ['reasoning.encrypted_content'] }
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const { ChatOpenAICompletions } = await import('@langchain/openai');
|
|
115
|
+
return new ChatOpenAICompletions({
|
|
116
|
+
apiKey,
|
|
117
|
+
model: agent.model,
|
|
118
|
+
temperature: variant.includeTemperature ? agent.temperature : undefined,
|
|
119
|
+
maxTokens: agent.max_tokens,
|
|
120
|
+
maxRetries: 0,
|
|
121
|
+
configuration: { maxRetries: 0 },
|
|
122
|
+
callbacks
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (agent.provider === 'anthropic') {
|
|
126
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
127
|
+
if (!apiKey)
|
|
128
|
+
throw new AgentConnectionError('missing_credentials', 'Missing ANTHROPIC_API_KEY');
|
|
129
|
+
const { ChatAnthropic } = await import('@langchain/anthropic');
|
|
130
|
+
return new ChatAnthropic({
|
|
131
|
+
apiKey,
|
|
132
|
+
model: variant.anthropicModel ?? agent.model,
|
|
133
|
+
temperature: variant.includeTemperature ? agent.temperature : undefined,
|
|
134
|
+
maxTokens: agent.max_tokens ?? DEFAULT_ANTHROPIC_MAX_TOKENS,
|
|
135
|
+
maxRetries: 0,
|
|
136
|
+
clientOptions: { maxRetries: 0 },
|
|
137
|
+
callbacks
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (agent.provider === 'azure_openai') {
|
|
141
|
+
const apiKey = process.env.AZURE_OPENAI_API_KEY;
|
|
142
|
+
const endpoint = process.env.AZURE_OPENAI_ENDPOINT;
|
|
143
|
+
const deployment = resolveAzureOpenAIDeployment(agent.model);
|
|
144
|
+
if (!apiKey)
|
|
145
|
+
throw new AgentConnectionError('missing_credentials', 'Missing AZURE_OPENAI_API_KEY');
|
|
146
|
+
if (!endpoint)
|
|
147
|
+
throw new AgentConnectionError('missing_credentials', 'Missing AZURE_OPENAI_ENDPOINT');
|
|
148
|
+
if (!deployment)
|
|
149
|
+
throw new AgentConnectionError('deployment', 'Missing AZURE_OPENAI_DEPLOYMENT');
|
|
150
|
+
return buildAzureModel({
|
|
151
|
+
apiKey,
|
|
152
|
+
baseURL: `${endpoint.replace(/\/$/, '')}/openai/deployments/${deployment}`,
|
|
153
|
+
apiVersion: process.env.AZURE_OPENAI_API_VERSION ?? DEFAULT_AZURE_OPENAI_API_VERSION,
|
|
154
|
+
model: deployment,
|
|
155
|
+
agent,
|
|
156
|
+
variant,
|
|
157
|
+
callbacks
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
if (agent.provider === 'azure_foundry') {
|
|
161
|
+
const deployment = agent.model.trim();
|
|
162
|
+
if (!deployment)
|
|
163
|
+
throw new Error('Azure Foundry requires a deployment name for this agent.');
|
|
164
|
+
const connection = resolveAzureFoundryConnection();
|
|
165
|
+
return buildAzureModel({
|
|
166
|
+
apiKey: connection.apiKey,
|
|
167
|
+
baseURL: `${connection.endpoint}/openai/v1`,
|
|
168
|
+
model: deployment,
|
|
169
|
+
agent,
|
|
170
|
+
variant,
|
|
171
|
+
callbacks
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
throw new Error(`Unsupported provider: ${agent.provider}`);
|
|
175
|
+
}
|
|
176
|
+
async function buildAzureModel(params) {
|
|
177
|
+
const { ChatOpenAICompletions } = await import('@langchain/openai');
|
|
178
|
+
const tokenField = params.variant.azureTokenField;
|
|
179
|
+
// Azure deployments are sent max_completion_tokens first, regardless of model naming.
|
|
180
|
+
class AzureAssistantChatOpenAI extends ChatOpenAICompletions {
|
|
181
|
+
invocationParams(options, extra) {
|
|
182
|
+
const invocation = super.invocationParams(options, extra);
|
|
183
|
+
if (typeof this.maxTokens === 'number') {
|
|
184
|
+
delete invocation.max_tokens;
|
|
185
|
+
delete invocation.max_completion_tokens;
|
|
186
|
+
invocation[tokenField] = this.maxTokens;
|
|
187
|
+
}
|
|
188
|
+
return invocation;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return new AzureAssistantChatOpenAI({
|
|
192
|
+
apiKey: params.apiKey,
|
|
193
|
+
model: params.model,
|
|
194
|
+
temperature: params.variant.includeTemperature ? params.agent.temperature : undefined,
|
|
195
|
+
maxTokens: params.agent.max_tokens,
|
|
196
|
+
maxRetries: 0,
|
|
197
|
+
configuration: {
|
|
198
|
+
baseURL: params.baseURL,
|
|
199
|
+
defaultQuery: params.apiVersion ? { 'api-version': params.apiVersion } : undefined,
|
|
200
|
+
maxRetries: 0
|
|
201
|
+
},
|
|
202
|
+
callbacks: params.callbacks
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
/** Placeholder required by createAgent; the provider middleware always supplies the real model. */
|
|
206
|
+
class UnresolvedAssistantChatModel extends BaseChatModel {
|
|
207
|
+
constructor() {
|
|
208
|
+
super({});
|
|
209
|
+
}
|
|
210
|
+
_llmType() {
|
|
211
|
+
return 'mcplab-unresolved';
|
|
212
|
+
}
|
|
213
|
+
bindTools() {
|
|
214
|
+
return this;
|
|
215
|
+
}
|
|
216
|
+
async _generate() {
|
|
217
|
+
throw new Error('Assistant model was not resolved by the provider middleware');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function errorMessage(error) {
|
|
221
|
+
return error instanceof Error ? error.message : String(error);
|
|
222
|
+
}
|
|
223
|
+
function isRecord(value) {
|
|
224
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
225
|
+
}
|
|
226
|
+
function isAnthropicModelNotFound(error) {
|
|
227
|
+
if (!isModelNotFound(error) || !isRecord(error))
|
|
228
|
+
return false;
|
|
229
|
+
let payload = error.error;
|
|
230
|
+
while (isRecord(payload)) {
|
|
231
|
+
if (typeof payload.message === 'string' && /\bmodel\b/i.test(payload.message))
|
|
232
|
+
return true;
|
|
233
|
+
payload = payload.error;
|
|
234
|
+
}
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
function anthropicModelNotFound(model, candidates) {
|
|
238
|
+
return new Error(`Anthropic model not found: '${model}' (tried: ${candidates.join(', ')}). Your API key is authenticated, but this model is not enabled/available for that Anthropic account. Update the agent model in Manage Agents/Config Editor to one your account can access.`);
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=assistant-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-model.js","sourceRoot":"","sources":["../../src/app-server/assistant-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AssistantKind, AssistantRuntimeEvent, AssistantRuntimeMessage, AssistantRuntimeResponse, AssistantRuntimeSnapshot, AssistantToolCallDecision, AssistantToolHints, LlmAgentConfig, ResultAssistantRuntimeContext, ScenarioAssistantRuntimeContext, ScenarioAssistantSuggestionBundle } from '@inspectr/mcplab-core';
|
|
2
|
+
/**
|
|
3
|
+
* The server-side assistant runtime boundary. Only the CLI implements and consumes it; the
|
|
4
|
+
* browser-facing transport types (snapshots, events, decisions) stay in core.
|
|
5
|
+
*/
|
|
6
|
+
export interface AssistantRuntimeDefinition {
|
|
7
|
+
assistant: AssistantKind;
|
|
8
|
+
agent: LlmAgentConfig;
|
|
9
|
+
context: ScenarioAssistantRuntimeContext | ResultAssistantRuntimeContext;
|
|
10
|
+
getSystemPrompt(): string;
|
|
11
|
+
tools: AssistantRuntimeTool[];
|
|
12
|
+
initialMessages?: AssistantRuntimeMessage[];
|
|
13
|
+
approvalPolicy(toolName: string): 'automatic' | 'approval_required' | 'local';
|
|
14
|
+
onEvent?(event: AssistantRuntimeEvent): void;
|
|
15
|
+
dispose?(): Promise<void> | void;
|
|
16
|
+
}
|
|
17
|
+
export interface AssistantRuntimeTool {
|
|
18
|
+
name: string;
|
|
19
|
+
server: string;
|
|
20
|
+
tool: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
inputSchema?: unknown;
|
|
23
|
+
/** How the call is presented to the user; never sent to the model. */
|
|
24
|
+
display?: AssistantToolDisplay;
|
|
25
|
+
execute(arguments_: unknown, signal?: AbortSignal): Promise<unknown>;
|
|
26
|
+
extractProposal?(result: unknown): ScenarioAssistantSuggestionBundle | undefined;
|
|
27
|
+
}
|
|
28
|
+
export interface AssistantToolDisplay {
|
|
29
|
+
title?: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
hints?: AssistantToolHints;
|
|
32
|
+
}
|
|
33
|
+
export interface AssistantRuntimeSession {
|
|
34
|
+
/** A supplied turnId also identifies the user message. Reusing an accepted ID is a conflict. */
|
|
35
|
+
sendMessage(message: string, signal?: AbortSignal, turnId?: string): Promise<AssistantRuntimeResponse>;
|
|
36
|
+
resolveToolCalls(decisions: AssistantToolCallDecision[], signal?: AbortSignal): Promise<AssistantRuntimeResponse>;
|
|
37
|
+
getSnapshot(): AssistantRuntimeSnapshot;
|
|
38
|
+
/** Idempotent for completed or unknown IDs, and never cancels a different in-flight turn. */
|
|
39
|
+
cancel(turnId: string): Promise<void>;
|
|
40
|
+
isBusy?(): boolean;
|
|
41
|
+
dispose(): Promise<void> | void;
|
|
42
|
+
}
|
|
43
|
+
export interface AssistantRuntimeFactory {
|
|
44
|
+
create(definition: AssistantRuntimeDefinition): Promise<AssistantRuntimeSession>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=assistant-runtime-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-runtime-contract.d.ts","sourceRoot":"","sources":["../../src/app-server/assistant-runtime-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,cAAc,EACd,6BAA6B,EAC7B,+BAA+B,EAC/B,iCAAiC,EAClC,MAAM,uBAAuB,CAAC;AAE/B;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,aAAa,CAAC;IACzB,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,+BAA+B,GAAG,6BAA6B,CAAC;IACzE,eAAe,IAAI,MAAM,CAAC;IAC1B,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC5C,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,mBAAmB,GAAG,OAAO,CAAC;IAC9E,OAAO,CAAC,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC7C,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sEAAsE;IACtE,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,eAAe,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,iCAAiC,GAAG,SAAS,CAAC;CAClF;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,gGAAgG;IAChG,WAAW,CACT,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACrC,gBAAgB,CACd,SAAS,EAAE,yBAAyB,EAAE,EACtC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACrC,WAAW,IAAI,wBAAwB,CAAC;IACxC,6FAA6F;IAC7F,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,OAAO,CAAC;IACnB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,UAAU,EAAE,0BAA0B,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAClF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-runtime-contract.js","sourceRoot":"","sources":["../../src/app-server/assistant-runtime-contract.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AssistantRuntimeToolCall, AssistantToolCallDecision, ScenarioAssistantSuggestionBundle } from '@inspectr/mcplab-core';
|
|
2
|
+
export declare const MAX_ASSISTANT_MODEL_CALLS = 25;
|
|
3
|
+
/** How tool approval works, as the model should understand it. */
|
|
4
|
+
export declare const APPROVAL_GUIDANCE = "Read-only tools run immediately. Tools that can change something wait for the user to approve, edit or deny each call; a denied call returns a denial you should respect.";
|
|
5
|
+
export declare class AssistantTurnBudgetExceededError extends Error {
|
|
6
|
+
readonly statusCode = 422;
|
|
7
|
+
constructor();
|
|
8
|
+
}
|
|
9
|
+
export declare class AssistantToolDecisionConflictError extends Error {
|
|
10
|
+
readonly statusCode = 409;
|
|
11
|
+
constructor();
|
|
12
|
+
}
|
|
13
|
+
export declare function mergeAssistantSuggestions(bundles: ScenarioAssistantSuggestionBundle[]): ScenarioAssistantSuggestionBundle | undefined;
|
|
14
|
+
export declare function uniqueToolCallId(requestedId: string | undefined, usedIds: Set<string>): string;
|
|
15
|
+
/** Validates a whole decision batch before anything runs; any stale or repeated call is a 409. */
|
|
16
|
+
export declare function validateToolCallDecisions(decisions: AssistantToolCallDecision[], pending: AssistantRuntimeToolCall[]): {
|
|
17
|
+
decision: AssistantToolCallDecision;
|
|
18
|
+
call: AssistantRuntimeToolCall;
|
|
19
|
+
}[];
|
|
20
|
+
/** Tool results reach the model, and the UI, as at most 4,000 characters. */
|
|
21
|
+
export declare function resultPreview(content: string): string;
|
|
22
|
+
//# sourceMappingURL=assistant-runtime-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-runtime-policy.d.ts","sourceRoot":"","sources":["../../src/app-server/assistant-runtime-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EACzB,iCAAiC,EAClC,MAAM,uBAAuB,CAAC;AAG/B,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,8KAC+I,CAAC;AAE9K,qBAAa,gCAAiC,SAAQ,KAAK;IACzD,QAAQ,CAAC,UAAU,OAAO;IAE1B,cAGC;CACF;AAED,qBAAa,kCAAmC,SAAQ,KAAK;IAC3D,QAAQ,CAAC,UAAU,OAAO;IAE1B,cAGC;CACF;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,iCAAiC,EAAE,GAC3C,iCAAiC,GAAG,SAAS,CAU/C;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAS9F;AAED,kGAAkG;AAClG,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,yBAAyB,EAAE,EACtC,OAAO,EAAE,wBAAwB,EAAE;;;IAepC;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQrD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { truncateJson } from './assistant-common.js';
|
|
3
|
+
export const MAX_ASSISTANT_MODEL_CALLS = 25;
|
|
4
|
+
/** How tool approval works, as the model should understand it. */
|
|
5
|
+
export const APPROVAL_GUIDANCE = 'Read-only tools run immediately. Tools that can change something wait for the user to approve, edit or deny each call; a denied call returns a denial you should respect.';
|
|
6
|
+
export class AssistantTurnBudgetExceededError extends Error {
|
|
7
|
+
statusCode = 422;
|
|
8
|
+
constructor() {
|
|
9
|
+
super('Assistant reached its 25 model-call limit. Start a new message to continue.');
|
|
10
|
+
this.name = 'AssistantTurnBudgetExceededError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class AssistantToolDecisionConflictError extends Error {
|
|
14
|
+
statusCode = 409;
|
|
15
|
+
constructor() {
|
|
16
|
+
super('One or more tool calls are no longer pending');
|
|
17
|
+
this.name = 'AssistantToolDecisionConflictError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function mergeAssistantSuggestions(bundles) {
|
|
21
|
+
if (!bundles.length)
|
|
22
|
+
return undefined;
|
|
23
|
+
const merged = {};
|
|
24
|
+
for (const bundle of bundles) {
|
|
25
|
+
if (bundle.prompt)
|
|
26
|
+
merged.prompt = bundle.prompt;
|
|
27
|
+
if (bundle.evalRules)
|
|
28
|
+
merged.evalRules = bundle.evalRules;
|
|
29
|
+
if (bundle.extractRules)
|
|
30
|
+
merged.extractRules = bundle.extractRules;
|
|
31
|
+
if (bundle.notes?.length)
|
|
32
|
+
merged.notes = [...(merged.notes ?? []), ...bundle.notes];
|
|
33
|
+
}
|
|
34
|
+
return merged;
|
|
35
|
+
}
|
|
36
|
+
export function uniqueToolCallId(requestedId, usedIds) {
|
|
37
|
+
let id = requestedId?.trim();
|
|
38
|
+
if (!id || usedIds.has(id)) {
|
|
39
|
+
do {
|
|
40
|
+
id = `tool-${randomUUID()}`;
|
|
41
|
+
} while (usedIds.has(id));
|
|
42
|
+
}
|
|
43
|
+
usedIds.add(id);
|
|
44
|
+
return id;
|
|
45
|
+
}
|
|
46
|
+
/** Validates a whole decision batch before anything runs; any stale or repeated call is a 409. */
|
|
47
|
+
export function validateToolCallDecisions(decisions, pending) {
|
|
48
|
+
const seen = new Set();
|
|
49
|
+
return decisions.map((decision) => {
|
|
50
|
+
const call = pending.find((candidate) => candidate.id === decision.toolCallId);
|
|
51
|
+
if ((decision.decision !== 'approve' && decision.decision !== 'deny') ||
|
|
52
|
+
seen.has(decision.toolCallId) ||
|
|
53
|
+
!call ||
|
|
54
|
+
call.status !== 'pending')
|
|
55
|
+
throw new AssistantToolDecisionConflictError();
|
|
56
|
+
seen.add(decision.toolCallId);
|
|
57
|
+
return { decision, call };
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/** Tool results reach the model, and the UI, as at most 4,000 characters. */
|
|
61
|
+
export function resultPreview(content) {
|
|
62
|
+
let value;
|
|
63
|
+
try {
|
|
64
|
+
value = JSON.parse(content);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
value = content;
|
|
68
|
+
}
|
|
69
|
+
return truncateJson(value, 4000);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=assistant-runtime-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-runtime-policy.js","sourceRoot":"","sources":["../../src/app-server/assistant-runtime-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AssistantRuntimeEvent } from '@inspectr/mcplab-core';
|
|
2
|
+
import type { AssistantRuntimeDefinition, AssistantRuntimeFactory, AssistantRuntimeSession } from './assistant-runtime-contract.js';
|
|
3
|
+
export declare class AssistantSessionBusyError extends Error {
|
|
4
|
+
readonly statusCode = 409;
|
|
5
|
+
constructor();
|
|
6
|
+
}
|
|
7
|
+
export declare function setupAssistantRuntimeSession<TSession extends object>(params: {
|
|
8
|
+
session: TSession;
|
|
9
|
+
prepare(emitInitialEvent: (event: AssistantRuntimeEvent) => void): Promise<AssistantRuntimeDefinition>;
|
|
10
|
+
disposeSetup(): Promise<void>;
|
|
11
|
+
factory: AssistantRuntimeFactory;
|
|
12
|
+
initialEvents?: AssistantRuntimeEvent[];
|
|
13
|
+
onEvent(event: AssistantRuntimeEvent, session: TSession & {
|
|
14
|
+
runtime: AssistantRuntimeSession;
|
|
15
|
+
}): void;
|
|
16
|
+
onActivity(session: TSession & {
|
|
17
|
+
runtime: AssistantRuntimeSession;
|
|
18
|
+
}): void;
|
|
19
|
+
}): Promise<TSession & {
|
|
20
|
+
runtime: AssistantRuntimeSession;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function createAssistantRuntimeService(factory: AssistantRuntimeFactory, definition: AssistantRuntimeDefinition, onActivity?: () => void): Promise<AssistantRuntimeSession>;
|
|
23
|
+
//# sourceMappingURL=assistant-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistant-service.d.ts","sourceRoot":"","sources":["../../src/app-server/assistant-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,iCAAiC,CAAC;AAEzC,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,UAAU,OAAO;IAE1B,cAGC;CACF;AAED,wBAAsB,4BAA4B,CAAC,QAAQ,SAAS,MAAM,EAAE,MAAM,EAAE;IAClF,OAAO,EAAE,QAAQ,CAAC;IAClB,OAAO,CACL,gBAAgB,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GACvD,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACvC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,EAAE,uBAAuB,CAAC;IACjC,aAAa,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACxC,OAAO,CACL,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,QAAQ,GAAG;QAAE,OAAO,EAAE,uBAAuB,CAAA;KAAE,GACvD,IAAI,CAAC;IACR,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG;QAAE,OAAO,EAAE,uBAAuB,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5E,GAAG,OAAO,CAAC,QAAQ,GAAG;IAAE,OAAO,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAsB3D;AAED,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,0BAA0B,EACtC,UAAU,CAAC,EAAE,MAAM,IAAI,GACtB,OAAO,CAAC,uBAAuB,CAAC,CA4JlC"}
|