@inspectr/mcplab 1.25.0 → 1.25.1

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.
Files changed (54) hide show
  1. package/dist/app/assets/index-BRTMTqcR.js +258 -0
  2. package/dist/app/index.html +1 -1
  3. package/dist/app-server/copilotkit-telemetry.d.ts +6 -0
  4. package/dist/app-server/copilotkit-telemetry.d.ts.map +1 -0
  5. package/dist/app-server/copilotkit-telemetry.js +8 -0
  6. package/dist/app-server/copilotkit-telemetry.js.map +1 -0
  7. package/dist/app-server/dev-mcp.d.ts +2 -5
  8. package/dist/app-server/global-copilot-domain.d.ts +30 -0
  9. package/dist/app-server/global-copilot-domain.d.ts.map +1 -0
  10. package/dist/app-server/global-copilot-domain.js +106 -0
  11. package/dist/app-server/global-copilot-domain.js.map +1 -0
  12. package/dist/app-server/global-copilot-mastra-route.d.ts +2 -0
  13. package/dist/app-server/global-copilot-mastra-route.d.ts.map +1 -0
  14. package/dist/app-server/global-copilot-mastra-route.js +5 -0
  15. package/dist/app-server/global-copilot-mastra-route.js.map +1 -0
  16. package/dist/app-server/global-copilot-mastra-runtime.d.ts +9 -0
  17. package/dist/app-server/global-copilot-mastra-runtime.d.ts.map +1 -0
  18. package/dist/app-server/global-copilot-mastra-runtime.js +61 -0
  19. package/dist/app-server/global-copilot-mastra-runtime.js.map +1 -0
  20. package/dist/app-server/global-copilot-mastra-storage.d.ts +8 -0
  21. package/dist/app-server/global-copilot-mastra-storage.d.ts.map +1 -0
  22. package/dist/app-server/global-copilot-mastra-storage.js +26 -0
  23. package/dist/app-server/global-copilot-mastra-storage.js.map +1 -0
  24. package/dist/app-server/global-copilot-mastra-threads.d.ts +5 -0
  25. package/dist/app-server/global-copilot-mastra-threads.d.ts.map +1 -0
  26. package/dist/app-server/global-copilot-mastra-threads.js +21 -0
  27. package/dist/app-server/global-copilot-mastra-threads.js.map +1 -0
  28. package/dist/app-server/global-copilot-mastra-tools.d.ts +50 -0
  29. package/dist/app-server/global-copilot-mastra-tools.d.ts.map +1 -0
  30. package/dist/app-server/global-copilot-mastra-tools.js +175 -0
  31. package/dist/app-server/global-copilot-mastra-tools.js.map +1 -0
  32. package/dist/app-server/global-copilot-mastra.d.ts +44 -0
  33. package/dist/app-server/global-copilot-mastra.d.ts.map +1 -0
  34. package/dist/app-server/global-copilot-mastra.js +198 -0
  35. package/dist/app-server/global-copilot-mastra.js.map +1 -0
  36. package/dist/app-server/global-copilot-memory.d.ts +70 -0
  37. package/dist/app-server/global-copilot-memory.d.ts.map +1 -0
  38. package/dist/app-server/global-copilot-memory.js +119 -0
  39. package/dist/app-server/global-copilot-memory.js.map +1 -0
  40. package/dist/app-server/global-copilot-threads.d.ts +14 -0
  41. package/dist/app-server/global-copilot-threads.d.ts.map +1 -0
  42. package/dist/app-server/global-copilot-threads.js +74 -0
  43. package/dist/app-server/global-copilot-threads.js.map +1 -0
  44. package/dist/app-server/oauth-debugger-domain.d.ts +183 -203
  45. package/dist/app-server/oauth-debugger-domain.d.ts.map +1 -1
  46. package/dist/app-server/oauth-debugger-domain.js +40 -21
  47. package/dist/app-server/oauth-debugger-domain.js.map +1 -1
  48. package/dist/app-server/result-assistant-domain.d.ts +65 -81
  49. package/dist/app-server/scenario-assistant-domain.d.ts +127 -153
  50. package/dist/app-server/settings-store.d.ts +4 -4
  51. package/dist/app-server/store-utils.d.ts +1 -1
  52. package/dist/app-server/types.d.ts +25 -25
  53. package/package.json +1 -1
  54. package/dist/app/assets/index-DgUUu84k.js +0 -258
@@ -16,7 +16,7 @@
16
16
  <meta name="twitter:card" content="summary_large_image" />
17
17
  <meta name="twitter:site" content="@Inspectr" />
18
18
  <meta name="twitter:image" content="" />
19
- <script type="module" crossorigin src="/assets/index-DgUUu84k.js"></script>
19
+ <script type="module" crossorigin src="/assets/index-BRTMTqcR.js"></script>
20
20
  <link rel="stylesheet" crossorigin href="/assets/index-ICO1prXk.css">
21
21
  </head>
22
22
 
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCPLab is a local-only application. Configure this before importing
3
+ * CopilotKit so its module-level telemetry client starts disabled.
4
+ */
5
+ export declare function configureLocalCopilotKitTelemetry(): void;
6
+ //# sourceMappingURL=copilotkit-telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilotkit-telemetry.d.ts","sourceRoot":"","sources":["../../src/app-server/copilotkit-telemetry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iCAAiC,IAAI,IAAI,CAExD"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * MCPLab is a local-only application. Configure this before importing
3
+ * CopilotKit so its module-level telemetry client starts disabled.
4
+ */
5
+ export function configureLocalCopilotKitTelemetry() {
6
+ process.env.COPILOTKIT_TELEMETRY_DISABLED ??= 'true';
7
+ }
8
+ //# sourceMappingURL=copilotkit-telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilotkit-telemetry.js","sourceRoot":"","sources":["../../src/app-server/copilotkit-telemetry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iCAAiC;IAC/C,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,MAAM,CAAC;AACvD,CAAC"}
@@ -1,6 +1,3 @@
1
1
  import type { DevMcpServerRuntime } from './types.js';
2
- export declare function maybeStartDevMcpServer(
3
- workspaceRoot: string,
4
- devMode: boolean
5
- ): Promise<DevMcpServerRuntime | null>;
6
- //# sourceMappingURL=dev-mcp.d.ts.map
2
+ export declare function maybeStartDevMcpServer(workspaceRoot: string, devMode: boolean): Promise<DevMcpServerRuntime | null>;
3
+ //# sourceMappingURL=dev-mcp.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { readLibraries } from './libraries-store.js';
2
+ export declare const GLOBAL_COPILOT_NAVIGATION_TARGETS: readonly ["/", "/mcp-evaluations", "/run", "/results", "/compare", "/tool-analysis", "/tool-analysis-results", "/oauth-debugger", "/libraries/servers", "/libraries/agents", "/libraries/test-cases", "/settings"];
3
+ export declare const GLOBAL_COPILOT_AUTOMATIC_READ_TOOL_BATCH_SIZE = 5;
4
+ export declare function globalCopilotMcplabToolPolicy(name: string): {
5
+ expose: boolean;
6
+ automatic: boolean;
7
+ };
8
+ export declare function selectGlobalCopilotAgentName(params: {
9
+ globalCopilotAgentName?: string;
10
+ scenarioAssistantAgentName?: string;
11
+ agentNames: string[];
12
+ }): string | undefined;
13
+ export declare function globalCopilotSystemPrompt(context: unknown): string;
14
+ export declare function localMcplabMcpUrl(): string;
15
+ export declare function globalCopilotExternalServers(libraries: ReturnType<typeof readLibraries>, activeTestCaseId: string | undefined, scenarioEditor?: {
16
+ scenarios?: Array<{
17
+ serverIds?: string[];
18
+ mcp_servers?: unknown[];
19
+ servers?: unknown[];
20
+ }>;
21
+ }): Record<string, {
22
+ transport: 'http';
23
+ url: string;
24
+ headers?: Record<string, string>;
25
+ auth?: unknown;
26
+ }>;
27
+ export declare function globalCopilotMcpToolErrorMessage(result: unknown): string | undefined;
28
+ /** Prefer the server's structured MCP payload so metadata is not hidden in the protocol envelope. */
29
+ export declare function globalCopilotMcpToolPayload(result: unknown): unknown;
30
+ //# sourceMappingURL=global-copilot-domain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-domain.d.ts","sourceRoot":"","sources":["../../src/app-server/global-copilot-domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,eAAO,MAAM,iCAAiC,oNAapC,CAAC;AAEX,eAAO,MAAM,6CAA6C,IAAI,CAAC;AAa/D,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB,CAMA;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,GAAG,MAAM,GAAG,SAAS,CAKrB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAgBlE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,EAC3C,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,cAAc,CAAC,EAAE;IACf,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;CAC3F,GACA,MAAM,CACP,MAAM,EACN;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CACrF,CAsBA;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAiBpF;AAED,qGAAqG;AACrG,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAIpE"}
@@ -0,0 +1,106 @@
1
+ import { isResultAssistantAutoApprovedTool } from './result-assistant-tools.js';
2
+ export const GLOBAL_COPILOT_NAVIGATION_TARGETS = [
3
+ '/',
4
+ '/mcp-evaluations',
5
+ '/run',
6
+ '/results',
7
+ '/compare',
8
+ '/tool-analysis',
9
+ '/tool-analysis-results',
10
+ '/oauth-debugger',
11
+ '/libraries/servers',
12
+ '/libraries/agents',
13
+ '/libraries/test-cases',
14
+ '/settings'
15
+ ];
16
+ export const GLOBAL_COPILOT_AUTOMATIC_READ_TOOL_BATCH_SIZE = 5;
17
+ const GLOBAL_COPILOT_AUTOMATIC_MCP_TOOLS = new Set([
18
+ 'mcplab_validate_config',
19
+ 'mcplab_list_evaluation_configs',
20
+ 'mcplab_generate_scenario_entry',
21
+ 'mcplab_generate_agent_entry',
22
+ 'mcplab_generate_server_entry'
23
+ ]);
24
+ const GLOBAL_COPILOT_CONFIRMED_MCP_TOOLS = new Set([
25
+ 'mcplab_write_markdown_report',
26
+ 'mcplab_create_evaluation_config'
27
+ ]);
28
+ export function globalCopilotMcplabToolPolicy(name) {
29
+ if (isResultAssistantAutoApprovedTool(name) || GLOBAL_COPILOT_AUTOMATIC_MCP_TOOLS.has(name)) {
30
+ return { expose: true, automatic: true };
31
+ }
32
+ if (GLOBAL_COPILOT_CONFIRMED_MCP_TOOLS.has(name))
33
+ return { expose: true, automatic: false };
34
+ return { expose: false, automatic: false };
35
+ }
36
+ export function selectGlobalCopilotAgentName(params) {
37
+ const candidates = [params.globalCopilotAgentName, params.scenarioAssistantAgentName];
38
+ return (candidates.find((name) => name && params.agentNames.includes(name)) ?? params.agentNames[0]);
39
+ }
40
+ export function globalCopilotSystemPrompt(context) {
41
+ return [
42
+ 'You are the MCPLab Global Copilot.',
43
+ 'Help users analyze evaluation results and author or improve MCP test cases.',
44
+ 'You can navigate the MCPLab interface using available frontend actions.',
45
+ 'The Current application context is authoritative page state supplied by the app. When it names a currentView or page filters, answer directly from that context; do not say you cannot see the screen.',
46
+ 'Only navigate when the user explicitly asks to go, navigate, open, take them, switch to a view, or to show the Test Cases, MCP Servers, Agents, Tool Analysis, or OAuth Debugger view. Before calling open_test_case, always call mcplab_get_library_item with kind "test_cases" and the exact ID; never open a generated draft that has not been saved. Use open_result_detail with a run ID when the user explicitly asks to open one specific result; otherwise use navigate_to_view for supported views. For “open the last/latest evaluation run”, first call mcplab_list_runs to identify the run ID, then call open_result_detail. Do not use mcplab_build_app_link. For analysis questions, use MCP tools to answer instead of navigating.',
47
+ 'When the current context contains resultsFilter, call mcplab_list_runs with its ISO bounds before analyzing the current Results view.',
48
+ 'When the current context identifies the MCP Evaluations view and the user asks which evaluations are shown, call mcplab_list_evaluation_configs using its suiteFilter (without the suite: prefix), searchQuery, sortBy, and sortDirection before answering.',
49
+ 'When scenarioEditor context is present, act as a Scenario Authoring Assistant. Use the current prompt, Checks, Value Capture Rules, server IDs, and available agent IDs as authoritative. Use exact evalRules shapes: required_tool/forbidden_tool use {type,value}, tool_sequence uses {type,sequence:string[]}, response_contains/response_regex and other text assertions use {type,value}, JSONPath assertions use {type,path,equals?}, and agent_check uses {type,label,prompt}. Use MCP tools to inspect live behavior when useful, and propose structured edits through propose_scenario_changes so the user can selectively apply Prompt, Checks, and Value Capture Rules; do not call apply_scenario_patch directly after analysis unless the user explicitly asks for an immediate complete replacement. For requests to "Run prompt", "preview", "test this scenario", or perform a one-shot run, use the confirmation-required preview_scenario frontend action with a valid agent ID from the provided agents list; do not require an evaluation config and do not use queue_evaluation_by_config for these requests. Only apply edits through the confirmation-required apply_scenario_patch frontend action, preserving the scenarioId and changing only the requested fields.',
50
+ 'For an explicit request to run an evaluation, use queue_evaluation_by_config with the exact configId and optional agentIds, scenarioIds, runsPerScenario, serverOverrideAll, scenarioServerOverrides, and runNote. It is confirmation-required and uses the existing app OAuth preflight and queue lifecycle; use queue_evaluation_run only for the page-selected Run Evaluation state. Do not use mcplab_run_eval: that MCP tool is reserved for external MCP clients.',
51
+ 'When the user asks to create a Test Case, draft it first with mcplab_generate_scenario_entry, then request propose_new_scenario with the complete prompt, existing library server IDs from the current context (never the display alias "mcplab" unless it is listed), evalRules, and extractRules so the user can review before creation. Do not give manual filesystem instructions or call mcplab_create_test_case; that MCP tool is for external MCP clients. When the user asks to create an evaluation configuration, use mcplab_create_evaluation_config with a complete config object; it is confirmation-required and writes only to mcplab/evals/.',
52
+ 'Never claim that a write, evaluation run, or tool analysis job happened until its confirmed action succeeds.',
53
+ 'Use concise, practical answers.',
54
+ `Current application context: ${JSON.stringify(context ?? {})}`
55
+ ].join('\n');
56
+ }
57
+ export function localMcplabMcpUrl() {
58
+ const host = process.env.MCP_HOST || '127.0.0.1';
59
+ const port = process.env.MCP_PORT || '3011';
60
+ return `http://${host}:${port}${process.env.MCP_PATH || '/mcp'}`;
61
+ }
62
+ export function globalCopilotExternalServers(libraries, activeTestCaseId, scenarioEditor) {
63
+ const scenario = activeTestCaseId
64
+ ? libraries.scenarios.find((item) => item.id === activeTestCaseId)
65
+ : undefined;
66
+ const editorEntries = (scenarioEditor?.scenarios ?? []).flatMap((item) => item.mcp_servers ?? item.servers ?? item.serverIds?.map((ref) => ({ ref })) ?? []);
67
+ const entries = [
68
+ ...(scenario
69
+ ? scenario.mcp_servers ?? (scenario.servers ?? []).map((ref) => ({ ref }))
70
+ : []),
71
+ ...editorEntries
72
+ ];
73
+ return entries.reduce((servers, entry) => {
74
+ if (entry?.ref && libraries.servers[entry.ref])
75
+ servers[entry.ref] = libraries.servers[entry.ref];
76
+ else if (entry?.id && entry.transport === 'http' && entry.url) {
77
+ const { id, ...config } = entry;
78
+ servers[id] = config;
79
+ }
80
+ return servers;
81
+ }, {});
82
+ }
83
+ export function globalCopilotMcpToolErrorMessage(result) {
84
+ if (!result || typeof result !== 'object' || !result.isError) {
85
+ return undefined;
86
+ }
87
+ const text = result.content;
88
+ if (!Array.isArray(text))
89
+ return 'The MCP tool reported an error.';
90
+ const messages = text
91
+ .filter((item) => Boolean(item) &&
92
+ typeof item === 'object' &&
93
+ item.type === 'text' &&
94
+ typeof item.text === 'string')
95
+ .map((item) => item.text.trim())
96
+ .filter(Boolean);
97
+ return messages.join('\n') || 'The MCP tool reported an error.';
98
+ }
99
+ /** Prefer the server's structured MCP payload so metadata is not hidden in the protocol envelope. */
100
+ export function globalCopilotMcpToolPayload(result) {
101
+ if (!result || typeof result !== 'object' || Array.isArray(result))
102
+ return result;
103
+ const structuredContent = result.structuredContent;
104
+ return structuredContent === undefined ? result : structuredContent;
105
+ }
106
+ //# sourceMappingURL=global-copilot-domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-domain.js","sourceRoot":"","sources":["../../src/app-server/global-copilot-domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function isGlobalCopilotMastraRoute(pathname: string): boolean;
2
+ //# sourceMappingURL=global-copilot-mastra-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-mastra-route.d.ts","sourceRoot":"","sources":["../../src/app-server/global-copilot-mastra-route.ts"],"names":[],"mappings":"AAEA,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpE"}
@@ -0,0 +1,5 @@
1
+ const mastraRuntimePath = '/api/global-copilot/mastra';
2
+ export function isGlobalCopilotMastraRoute(pathname) {
3
+ return pathname === mastraRuntimePath || pathname.startsWith(`${mastraRuntimePath}/`);
4
+ }
5
+ //# sourceMappingURL=global-copilot-mastra-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-mastra-route.js","sourceRoot":"","sources":["../../src/app-server/global-copilot-mastra-route.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAEvD,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IACzD,OAAO,QAAQ,KAAK,iBAAiB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,iBAAiB,GAAG,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { AppSettings } from './types.js';
3
+ /**
4
+ * AG-UI endpoint for the new runtime. The legacy `/api/global-copilot/run`
5
+ * handler remains untouched during the one-release rollback window.
6
+ */
7
+ export declare function createGlobalCopilotMastraNodeHandler(settings: AppSettings): import("@copilotkit/runtime/v2/node").NodeFetchHandler;
8
+ export declare function handleGlobalCopilotMastra(req: IncomingMessage, res: ServerResponse, settings: AppSettings): Promise<void>;
9
+ //# sourceMappingURL=global-copilot-mastra-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-mastra-runtime.d.ts","sourceRoot":"","sources":["../../src/app-server/global-copilot-mastra-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAcjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAuB9C;;;GAGG;AACH,wBAAgB,oCAAoC,CAAC,QAAQ,EAAE,WAAW,0DA6BzE;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,61 @@
1
+ import { Mastra } from '@mastra/core';
2
+ import { getLocalAgents } from '@ag-ui/mastra';
3
+ import { CopilotRuntime, createCopilotRuntimeHandler } from '@copilotkit/runtime/v2';
4
+ import { createCopilotNodeHandler } from '@copilotkit/runtime/v2/node';
5
+ import { readLibraries } from './libraries-store.js';
6
+ import { selectGlobalCopilotAgentName } from './global-copilot-domain.js';
7
+ import { createGlobalCopilotMastraAgent } from './global-copilot-mastra.js';
8
+ import { createGlobalCopilotMastraMemory } from './global-copilot-mastra-storage.js';
9
+ import { createGlobalCopilotMastraTools } from './global-copilot-mastra-tools.js';
10
+ import { ensureGlobalCopilotMastraThread, globalCopilotThreadIdFromRequest } from './global-copilot-mastra-threads.js';
11
+ const runtimes = new Map();
12
+ const toolRuntimes = new Map();
13
+ function memoryFor(workspaceRoot) {
14
+ let runtime = runtimes.get(workspaceRoot);
15
+ if (!runtime) {
16
+ runtime = createGlobalCopilotMastraMemory(workspaceRoot);
17
+ runtimes.set(workspaceRoot, runtime);
18
+ }
19
+ return runtime;
20
+ }
21
+ async function toolsFor(workspaceRoot) {
22
+ let runtime = toolRuntimes.get(workspaceRoot);
23
+ if (!runtime) {
24
+ runtime = await createGlobalCopilotMastraTools();
25
+ toolRuntimes.set(workspaceRoot, runtime);
26
+ }
27
+ return runtime;
28
+ }
29
+ /**
30
+ * AG-UI endpoint for the new runtime. The legacy `/api/global-copilot/run`
31
+ * handler remains untouched during the one-release rollback window.
32
+ */
33
+ export function createGlobalCopilotMastraNodeHandler(settings) {
34
+ const runtime = new CopilotRuntime({
35
+ agents: async ({ request }) => {
36
+ const libraries = readLibraries(settings.librariesDir);
37
+ const agentName = selectGlobalCopilotAgentName({
38
+ globalCopilotAgentName: settings.globalCopilotAgentName,
39
+ scenarioAssistantAgentName: settings.scenarioAssistantAgentName,
40
+ agentNames: Object.keys(libraries.agents)
41
+ });
42
+ const config = agentName ? libraries.agents[agentName] : undefined;
43
+ if (!config)
44
+ throw new Error('No Global Copilot agent is configured.');
45
+ const local = memoryFor(settings.workspaceRoot);
46
+ const internalTools = await toolsFor(settings.workspaceRoot);
47
+ const agent = createGlobalCopilotMastraAgent(config, local.memory, internalTools.tools);
48
+ const mastra = new Mastra({
49
+ agents: { [agent.id]: agent },
50
+ storage: local.storage
51
+ });
52
+ await ensureGlobalCopilotMastraThread(local.memory, settings.workspaceRoot, await globalCopilotThreadIdFromRequest(request));
53
+ return getLocalAgents({ mastra, resourceId: settings.workspaceRoot });
54
+ }
55
+ });
56
+ return createCopilotNodeHandler(createCopilotRuntimeHandler({ runtime, basePath: '/api/global-copilot/mastra' }));
57
+ }
58
+ export async function handleGlobalCopilotMastra(req, res, settings) {
59
+ return createGlobalCopilotMastraNodeHandler(settings)(req, res);
60
+ }
61
+ //# sourceMappingURL=global-copilot-mastra-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-mastra-runtime.js","sourceRoot":"","sources":["../../src/app-server/global-copilot-mastra-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { LibSQLStore } from '@mastra/libsql';
2
+ import { Memory } from '@mastra/memory';
3
+ export declare function globalCopilotMastraDatabasePath(workspaceRoot: string): string;
4
+ export declare function createGlobalCopilotMastraMemory(workspaceRoot: string): {
5
+ storage: LibSQLStore;
6
+ memory: Memory;
7
+ };
8
+ //# sourceMappingURL=global-copilot-mastra-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-mastra-storage.d.ts","sourceRoot":"","sources":["../../src/app-server/global-copilot-mastra-storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,wBAAgB,+BAA+B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,+BAA+B,CAAC,aAAa,EAAE,MAAM,GAAG;IACtE,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,CAiBA"}
@@ -0,0 +1,26 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { LibSQLStore } from '@mastra/libsql';
4
+ import { Memory } from '@mastra/memory';
5
+ export function globalCopilotMastraDatabasePath(workspaceRoot) {
6
+ return join(workspaceRoot, '.mastra', 'copilot.db');
7
+ }
8
+ export function createGlobalCopilotMastraMemory(workspaceRoot) {
9
+ const databasePath = globalCopilotMastraDatabasePath(workspaceRoot);
10
+ mkdirSync(join(workspaceRoot, '.mastra'), { recursive: true });
11
+ const storage = new LibSQLStore({
12
+ id: 'mcplab-global-copilot',
13
+ url: `file:${databasePath}`,
14
+ retention: {
15
+ observability: { traces: { maxAge: '30d' } }
16
+ }
17
+ });
18
+ return {
19
+ storage,
20
+ memory: new Memory({
21
+ storage,
22
+ options: { lastMessages: 50 }
23
+ })
24
+ };
25
+ }
26
+ //# sourceMappingURL=global-copilot-mastra-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-mastra-storage.js","sourceRoot":"","sources":["../../src/app-server/global-copilot-mastra-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,UAAU,+BAA+B,CAAC,aAAqB;IACnE,OAAO,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,aAAqB;IAInE,MAAM,YAAY,GAAG,+BAA+B,CAAC,aAAa,CAAC,CAAC;IACpE,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;QAC9B,EAAE,EAAE,uBAAuB;QAC3B,GAAG,EAAE,QAAQ,YAAY,EAAE;QAC3B,SAAS,EAAE;YACT,aAAa,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;SAC7C;KACK,CAAC,CAAC;IACV,OAAO;QACL,OAAO;QACP,MAAM,EAAE,IAAI,MAAM,CAAC;YACjB,OAAO;YACP,OAAO,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;SAC9B,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Memory } from '@mastra/memory';
2
+ /** Ensure the client-generated AG-UI thread exists before Mastra recalls it. */
3
+ export declare function ensureGlobalCopilotMastraThread(memory: Memory, resourceId: string, threadId: string | undefined): Promise<void>;
4
+ export declare function globalCopilotThreadIdFromRequest(request: Request): Promise<string | undefined>;
5
+ //# sourceMappingURL=global-copilot-mastra-threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-mastra-threads.d.ts","sourceRoot":"","sources":["../../src/app-server/global-copilot-mastra-threads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,gFAAgF;AAChF,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,gCAAgC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQpG"}
@@ -0,0 +1,21 @@
1
+ /** Ensure the client-generated AG-UI thread exists before Mastra recalls it. */
2
+ export async function ensureGlobalCopilotMastraThread(memory, resourceId, threadId) {
3
+ if (!threadId)
4
+ return;
5
+ const existing = await memory.getThreadById({ threadId, resourceId });
6
+ if (existing)
7
+ return;
8
+ await memory.createThread({ threadId, resourceId, title: 'New conversation' });
9
+ }
10
+ export async function globalCopilotThreadIdFromRequest(request) {
11
+ if (request.method !== 'POST')
12
+ return undefined;
13
+ try {
14
+ const body = (await request.clone().json());
15
+ return typeof body.threadId === 'string' && body.threadId ? body.threadId : undefined;
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ }
21
+ //# sourceMappingURL=global-copilot-mastra-threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-mastra-threads.js","sourceRoot":"","sources":["../../src/app-server/global-copilot-mastra-threads.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,MAAc,EACd,UAAkB,EAClB,QAA4B;IAE5B,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IACtE,IAAI,QAAQ;QAAE,OAAO;IACrB,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,OAAgB;IACrE,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAA2B,CAAC;QACtE,OAAO,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { McpClientManager, type ServerConfig, type ToolDef } from '@inspectr/mcplab-core';
2
+ import type { AppSettings } from './types.js';
3
+ export type GlobalCopilotReadBudget = {
4
+ used: number;
5
+ batchSize: number;
6
+ };
7
+ type GlobalCopilotApprovalMode = 'automatic' | 'confirmation';
8
+ export type GlobalCopilotMcpManager = Pick<McpClientManager, 'connectAll' | 'listTools' | 'callTool' | 'disconnectAll'>;
9
+ export declare class GlobalCopilotMcpConnectionPool {
10
+ private readonly manager;
11
+ private readonly connected;
12
+ constructor(manager?: GlobalCopilotMcpManager);
13
+ private configKey;
14
+ ensureConnected(serverName: string, server: ServerConfig): Promise<void>;
15
+ listTools(serverName: string, server: ServerConfig): Promise<ToolDef[]>;
16
+ callTool(serverName: string, server: ServerConfig, toolName: string, arguments_: Record<string, unknown>): Promise<unknown>;
17
+ close(): Promise<void>;
18
+ }
19
+ export declare function createGlobalCopilotMcpTool(params: {
20
+ definition: ToolDef;
21
+ serverName: string;
22
+ toolName: string;
23
+ approval: GlobalCopilotApprovalMode;
24
+ budget: GlobalCopilotReadBudget;
25
+ execute: (arguments_: Record<string, unknown>) => Promise<unknown>;
26
+ }): import("@mastra/core/tools").Tool<any, unknown, {
27
+ kind: "continue_reading" | "mcp_tool_approval";
28
+ serverName: string;
29
+ toolName: string;
30
+ arguments: Record<string, unknown>;
31
+ batchSize?: number | undefined;
32
+ }, {
33
+ approved: boolean;
34
+ }, import("@mastra/core/tools").ToolExecutionContext<{
35
+ kind: "continue_reading" | "mcp_tool_approval";
36
+ serverName: string;
37
+ toolName: string;
38
+ arguments: Record<string, unknown>;
39
+ batchSize?: number | undefined;
40
+ }, {
41
+ approved: boolean;
42
+ }, unknown>, string, unknown>;
43
+ export declare function buildGlobalCopilotMastraTools(params: {
44
+ settings: AppSettings;
45
+ context: any;
46
+ budget?: GlobalCopilotReadBudget;
47
+ pool?: GlobalCopilotMcpConnectionPool;
48
+ }): Promise<Record<string, ReturnType<typeof createGlobalCopilotMcpTool>>>;
49
+ export {};
50
+ //# sourceMappingURL=global-copilot-mastra-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-copilot-mastra-tools.d.ts","sourceRoot":"","sources":["../../src/app-server/global-copilot-mastra-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,OAAO,EACb,MAAM,uBAAuB,CAAC;AAa/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,yBAAyB,GAAG,WAAW,GAAG,cAAc,CAAC;AAE9D,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,gBAAgB,EAChB,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,eAAe,CAC1D,CAAC;AAEF,qBAAa,8BAA8B;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAE3C,OAAO,GAAE,uBAAgD;IAIrE,OAAO,CAAC,SAAS;IAIX,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAKvE,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,OAAO,CAAC;IAKb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B;AAgBD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE;;;;;;;;;;;;;;;;8BAkCA;AAuDD,wBAAsB,6BAA6B,CAAC,MAAM,EAAE;IAC1D,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,IAAI,CAAC,EAAE,8BAA8B,CAAC;CACvC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC,CAuDzE"}
@@ -0,0 +1,175 @@
1
+ import { McpClientManager } from '@inspectr/mcplab-core';
2
+ import { createTool } from '@mastra/core/tools';
3
+ import { jsonSchema } from '@mastra/schema-compat';
4
+ import { z } from 'zod';
5
+ import { makeAssistantToolPublicName, truncateJson } from './assistant-common.js';
6
+ import { globalCopilotExternalServers, globalCopilotMcplabToolPolicy, globalCopilotMcpToolErrorMessage, globalCopilotMcpToolPayload, localMcplabMcpUrl } from './global-copilot-domain.js';
7
+ import { readLibraries } from './libraries-store.js';
8
+ export class GlobalCopilotMcpConnectionPool {
9
+ manager;
10
+ connected = new Map();
11
+ constructor(manager = new McpClientManager()) {
12
+ this.manager = manager;
13
+ }
14
+ configKey(server) {
15
+ return JSON.stringify(server);
16
+ }
17
+ async ensureConnected(serverName, server) {
18
+ const key = this.configKey(server);
19
+ if (this.connected.get(serverName) === key)
20
+ return;
21
+ await this.manager.connectAll({ [serverName]: server });
22
+ this.connected.set(serverName, key);
23
+ }
24
+ async listTools(serverName, server) {
25
+ await this.ensureConnected(serverName, server);
26
+ return this.manager.listTools(serverName);
27
+ }
28
+ async callTool(serverName, server, toolName, arguments_) {
29
+ await this.ensureConnected(serverName, server);
30
+ return this.manager.callTool(serverName, toolName, arguments_);
31
+ }
32
+ async close() {
33
+ this.connected.clear();
34
+ await this.manager.disconnectAll().catch(() => undefined);
35
+ }
36
+ }
37
+ const approvalResumeSchema = z
38
+ .object({ approved: z.boolean() })
39
+ .strict();
40
+ const approvalSuspendSchema = z
41
+ .object({
42
+ kind: z.enum(['continue_reading', 'mcp_tool_approval']),
43
+ serverName: z.string(),
44
+ toolName: z.string(),
45
+ arguments: z.record(z.unknown()),
46
+ batchSize: z.number().int().positive().optional()
47
+ })
48
+ .strict();
49
+ export function createGlobalCopilotMcpTool(params) {
50
+ return createTool({
51
+ id: params.definition.name,
52
+ description: params.definition.description ?? '',
53
+ inputSchema: jsonSchema(params.definition.inputSchema),
54
+ suspendSchema: approvalSuspendSchema,
55
+ resumeSchema: approvalResumeSchema,
56
+ execute: async (arguments_, context) => {
57
+ const resumeData = context?.agent?.resumeData;
58
+ if (resumeData && !resumeData.approved) {
59
+ return { approved: false, reason: 'Denied by user.' };
60
+ }
61
+ const readBudgetExhausted = params.approval === 'automatic' && params.budget.used >= params.budget.batchSize;
62
+ const needsApproval = params.approval === 'confirmation' || readBudgetExhausted;
63
+ if (needsApproval && !resumeData) {
64
+ await context?.agent?.suspend({
65
+ kind: readBudgetExhausted ? 'continue_reading' : 'mcp_tool_approval',
66
+ serverName: params.serverName,
67
+ toolName: params.toolName,
68
+ arguments: arguments_ ?? {},
69
+ ...(readBudgetExhausted ? { batchSize: params.budget.batchSize } : {})
70
+ });
71
+ return { suspended: true };
72
+ }
73
+ if (params.approval === 'automatic') {
74
+ if (readBudgetExhausted)
75
+ params.budget.used = 0;
76
+ params.budget.used += 1;
77
+ }
78
+ return params.execute(arguments_ ?? {});
79
+ }
80
+ });
81
+ }
82
+ async function discoverServerTools(serverName, server, pool) {
83
+ if (pool)
84
+ return pool.listTools(serverName, server);
85
+ const mcp = new McpClientManager();
86
+ try {
87
+ await mcp.connectAll({ [serverName]: server });
88
+ return await mcp.listTools(serverName);
89
+ }
90
+ finally {
91
+ await mcp.disconnectAll().catch(() => undefined);
92
+ }
93
+ }
94
+ async function executeRevalidatedMcpTool(params) {
95
+ if (params.pool) {
96
+ const known = (await params.pool.listTools(params.serverName, params.server)).some((tool) => tool.name === params.toolName);
97
+ if (!known)
98
+ throw new Error(`MCP tool '${params.toolName}' is no longer available.`);
99
+ const result = await params.pool.callTool(params.serverName, params.server, params.toolName, params.arguments_);
100
+ const toolError = globalCopilotMcpToolErrorMessage(result);
101
+ if (toolError)
102
+ throw new Error(toolError);
103
+ return truncateJson(globalCopilotMcpToolPayload(result), 4000);
104
+ }
105
+ const mcp = new McpClientManager();
106
+ try {
107
+ await mcp.connectAll({ [params.serverName]: params.server });
108
+ const known = (await mcp.listTools(params.serverName)).some((tool) => tool.name === params.toolName);
109
+ if (!known)
110
+ throw new Error(`MCP tool '${params.toolName}' is no longer available.`);
111
+ const result = await mcp.callTool(params.serverName, params.toolName, params.arguments_);
112
+ const toolError = globalCopilotMcpToolErrorMessage(result);
113
+ if (toolError)
114
+ throw new Error(toolError);
115
+ return truncateJson(globalCopilotMcpToolPayload(result), 4000);
116
+ }
117
+ finally {
118
+ await mcp.disconnectAll().catch(() => undefined);
119
+ }
120
+ }
121
+ export async function buildGlobalCopilotMastraTools(params) {
122
+ const libraries = readLibraries(params.settings.librariesDir);
123
+ const activeTestCaseId = typeof params.context?.activeTestCaseId === 'string'
124
+ ? params.context.activeTestCaseId
125
+ : undefined;
126
+ const scenarioEditor = params.context?.scenarioEditor;
127
+ const servers = {
128
+ mcplab: { transport: 'http', url: localMcplabMcpUrl() },
129
+ ...globalCopilotExternalServers(libraries, activeTestCaseId, scenarioEditor)
130
+ };
131
+ const usedNames = new Set();
132
+ const budget = params.budget ?? { used: 0, batchSize: 5 };
133
+ const tools = {};
134
+ for (const [serverName, server] of Object.entries(servers)) {
135
+ let definitions;
136
+ try {
137
+ definitions = await discoverServerTools(serverName, server, params.pool);
138
+ }
139
+ catch {
140
+ continue;
141
+ }
142
+ for (const definition of definitions) {
143
+ const policy = serverName === 'mcplab'
144
+ ? globalCopilotMcplabToolPolicy(definition.name)
145
+ : { expose: true, automatic: false };
146
+ if (!policy.expose)
147
+ continue;
148
+ const publicName = makeAssistantToolPublicName(serverName, definition.name, usedNames);
149
+ tools[publicName] = createGlobalCopilotMcpTool({
150
+ definition: {
151
+ ...definition,
152
+ name: publicName,
153
+ ...(serverName === 'mcplab'
154
+ ? {}
155
+ : {
156
+ description: `${definition.description ?? ''}\n[External MCP server: requires confirmation before every call.]`.trim()
157
+ })
158
+ },
159
+ serverName,
160
+ toolName: definition.name,
161
+ approval: policy.automatic ? 'automatic' : 'confirmation',
162
+ budget,
163
+ execute: (arguments_) => executeRevalidatedMcpTool({
164
+ serverName,
165
+ server,
166
+ toolName: definition.name,
167
+ arguments_: arguments_,
168
+ pool: params.pool
169
+ })
170
+ });
171
+ }
172
+ }
173
+ return tools;
174
+ }
175
+ //# sourceMappingURL=global-copilot-mastra-tools.js.map