@inspectr/mcplab 1.28.5 → 1.29.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.
Files changed (162) hide show
  1. package/README.md +52 -5
  2. package/dist/app/assets/index-256LN2cO.css +2 -0
  3. package/dist/app/assets/index-DVIaEnjQ.js +243 -0
  4. package/dist/app/assets/sse-queue-worker-Iwmqd2oW.js +1 -0
  5. package/dist/app/index.html +2 -2
  6. package/dist/app-server/app-context.d.ts +75 -115
  7. package/dist/app-server/app-context.d.ts.map +1 -1
  8. package/dist/app-server/app-dist.d.ts +3 -3
  9. package/dist/app-server/app-dist.js.map +1 -1
  10. package/dist/app-server/app-run-artifacts.d.ts +4 -0
  11. package/dist/app-server/app-run-artifacts.d.ts.map +1 -0
  12. package/dist/app-server/app-run-artifacts.js +66 -0
  13. package/dist/app-server/app-run-artifacts.js.map +1 -0
  14. package/dist/app-server/assistant-common.d.ts +27 -37
  15. package/dist/app-server/assistant-common.d.ts.map +1 -1
  16. package/dist/app-server/assistant-common.js +110 -1
  17. package/dist/app-server/assistant-common.js.map +1 -1
  18. package/dist/app-server/assistant-events.d.ts +8 -28
  19. package/dist/app-server/browser-launch.d.ts +3 -3
  20. package/dist/app-server/browser-launch.js.map +1 -1
  21. package/dist/app-server/browser-provider-learning.d.ts +26 -0
  22. package/dist/app-server/browser-provider-learning.d.ts.map +1 -0
  23. package/dist/app-server/browser-provider-learning.js +353 -0
  24. package/dist/app-server/browser-provider-learning.js.map +1 -0
  25. package/dist/app-server/config-store.d.ts +13 -21
  26. package/dist/app-server/dev-mcp.d.ts +2 -5
  27. package/dist/app-server/evals-routes.d.ts +8 -18
  28. package/dist/app-server/evaluation-group-results.d.ts +11 -0
  29. package/dist/app-server/evaluation-group-results.d.ts.map +1 -0
  30. package/dist/app-server/evaluation-group-results.js +46 -0
  31. package/dist/app-server/evaluation-group-results.js.map +1 -0
  32. package/dist/app-server/evaluation-journal-projection.d.ts +9 -0
  33. package/dist/app-server/evaluation-journal-projection.d.ts.map +1 -0
  34. package/dist/app-server/evaluation-journal-projection.js +76 -0
  35. package/dist/app-server/evaluation-journal-projection.js.map +1 -0
  36. package/dist/app-server/evaluation-journal-writer.d.ts +23 -0
  37. package/dist/app-server/evaluation-journal-writer.d.ts.map +1 -0
  38. package/dist/app-server/evaluation-journal-writer.js +41 -0
  39. package/dist/app-server/evaluation-journal-writer.js.map +1 -0
  40. package/dist/app-server/evaluation-result-projection.d.ts +12 -0
  41. package/dist/app-server/evaluation-result-projection.d.ts.map +1 -0
  42. package/dist/app-server/evaluation-result-projection.js +107 -0
  43. package/dist/app-server/evaluation-result-projection.js.map +1 -0
  44. package/dist/app-server/execution-journal.d.ts +13 -0
  45. package/dist/app-server/execution-journal.d.ts.map +1 -0
  46. package/dist/app-server/execution-journal.js +39 -0
  47. package/dist/app-server/execution-journal.js.map +1 -0
  48. package/dist/app-server/http.d.ts +1 -1
  49. package/dist/app-server/index.d.ts +1 -1
  50. package/dist/app-server/inspectr-session-manager.d.ts +45 -0
  51. package/dist/app-server/inspectr-session-manager.d.ts.map +1 -0
  52. package/dist/app-server/inspectr-session-manager.js +203 -0
  53. package/dist/app-server/inspectr-session-manager.js.map +1 -0
  54. package/dist/app-server/jobs.d.ts +6 -9
  55. package/dist/app-server/libraries-store.d.ts +26 -10
  56. package/dist/app-server/libraries-store.d.ts.map +1 -1
  57. package/dist/app-server/libraries-store.js +130 -3
  58. package/dist/app-server/libraries-store.js.map +1 -1
  59. package/dist/app-server/live-tests-routes.d.ts +17 -0
  60. package/dist/app-server/live-tests-routes.d.ts.map +1 -0
  61. package/dist/app-server/live-tests-routes.js +82 -0
  62. package/dist/app-server/live-tests-routes.js.map +1 -0
  63. package/dist/app-server/live-tests.d.ts +81 -0
  64. package/dist/app-server/live-tests.d.ts.map +1 -0
  65. package/dist/app-server/live-tests.js +272 -0
  66. package/dist/app-server/live-tests.js.map +1 -0
  67. package/dist/app-server/markdown-reports.d.ts +7 -7
  68. package/dist/app-server/oauth-debugger-domain.d.ts +183 -207
  69. package/dist/app-server/oauth-debugger-domain.js.map +1 -1
  70. package/dist/app-server/oauth-debugger.d.ts +10 -17
  71. package/dist/app-server/oauth-debugger.js +1 -1
  72. package/dist/app-server/oauth-debugger.js.map +1 -1
  73. package/dist/app-server/oauth-runtime-domain.d.ts +42 -53
  74. package/dist/app-server/oauth-runtime-domain.js.map +1 -1
  75. package/dist/app-server/oauth-runtime-routes.d.ts +12 -12
  76. package/dist/app-server/oauth-session-manager.d.ts +44 -50
  77. package/dist/app-server/oauth-session-manager.d.ts.map +1 -1
  78. package/dist/app-server/oauth-session-manager.js.map +1 -1
  79. package/dist/app-server/provider-models.d.ts +5 -5
  80. package/dist/app-server/result-assistant-domain.d.ts +66 -82
  81. package/dist/app-server/result-assistant-domain.d.ts.map +1 -1
  82. package/dist/app-server/result-assistant-domain.js.map +1 -1
  83. package/dist/app-server/result-assistant-tools.d.ts +5 -5
  84. package/dist/app-server/result-assistant.d.ts +9 -21
  85. package/dist/app-server/result-assistant.js.map +1 -1
  86. package/dist/app-server/router.d.ts +9 -1
  87. package/dist/app-server/router.d.ts.map +1 -1
  88. package/dist/app-server/router.js +328 -10
  89. package/dist/app-server/router.js.map +1 -1
  90. package/dist/app-server/rover-connection.d.ts +48 -0
  91. package/dist/app-server/rover-connection.d.ts.map +1 -0
  92. package/dist/app-server/rover-connection.js +172 -0
  93. package/dist/app-server/rover-connection.js.map +1 -0
  94. package/dist/app-server/run-agent-selection.d.ts +2 -5
  95. package/dist/app-server/run-queue-domain.d.ts +89 -65
  96. package/dist/app-server/run-queue-domain.d.ts.map +1 -1
  97. package/dist/app-server/run-queue-domain.js +723 -9
  98. package/dist/app-server/run-queue-domain.js.map +1 -1
  99. package/dist/app-server/run-queue-events.d.ts +3 -10
  100. package/dist/app-server/run-queue-events.d.ts.map +1 -1
  101. package/dist/app-server/run-queue-events.js +114 -14
  102. package/dist/app-server/run-queue-events.js.map +1 -1
  103. package/dist/app-server/run-queue-executor.d.ts +33 -47
  104. package/dist/app-server/run-queue-executor.d.ts.map +1 -1
  105. package/dist/app-server/run-queue-executor.js +85 -15
  106. package/dist/app-server/run-queue-executor.js.map +1 -1
  107. package/dist/app-server/run-queue-state.d.ts +81 -47
  108. package/dist/app-server/run-queue-state.d.ts.map +1 -1
  109. package/dist/app-server/run-queue-state.js.map +1 -1
  110. package/dist/app-server/runs-routes.d.ts +13 -35
  111. package/dist/app-server/runs-routes.d.ts.map +1 -1
  112. package/dist/app-server/runs-routes.js +182 -16
  113. package/dist/app-server/runs-routes.js.map +1 -1
  114. package/dist/app-server/runs-routes.test-helpers.d.ts +42 -38
  115. package/dist/app-server/runs-routes.test-helpers.d.ts.map +1 -1
  116. package/dist/app-server/runs-routes.test-helpers.js +4 -1
  117. package/dist/app-server/runs-routes.test-helpers.js.map +1 -1
  118. package/dist/app-server/runs-store.d.ts +60 -43
  119. package/dist/app-server/runs-store.d.ts.map +1 -1
  120. package/dist/app-server/runs-store.js +157 -70
  121. package/dist/app-server/runs-store.js.map +1 -1
  122. package/dist/app-server/scenario-assistant-domain.d.ts +131 -157
  123. package/dist/app-server/scenario-assistant-domain.d.ts.map +1 -1
  124. package/dist/app-server/scenario-assistant-domain.js +7 -15
  125. package/dist/app-server/scenario-assistant-domain.js.map +1 -1
  126. package/dist/app-server/scenario-assistant.d.ts +10 -26
  127. package/dist/app-server/scenario-assistant.js.map +1 -1
  128. package/dist/app-server/settings-store.d.ts +4 -4
  129. package/dist/app-server/static-serving.d.ts +7 -13
  130. package/dist/app-server/store-utils.d.ts +1 -1
  131. package/dist/app-server/tool-analysis-domain.d.ts +167 -183
  132. package/dist/app-server/tool-analysis-domain.d.ts.map +1 -1
  133. package/dist/app-server/tool-analysis-domain.js +2 -59
  134. package/dist/app-server/tool-analysis-domain.js.map +1 -1
  135. package/dist/app-server/tool-analysis-storage.d.ts +20 -34
  136. package/dist/app-server/tool-analysis.d.ts +10 -19
  137. package/dist/app-server/types.d.ts +25 -25
  138. package/dist/app-server/version-info.d.ts +6 -6
  139. package/dist/app-server/version-info.js.map +1 -1
  140. package/dist/app-server/workspace-paths.d.ts +2 -1
  141. package/dist/app-server/workspace-paths.d.ts.map +1 -1
  142. package/dist/app-server/workspace-paths.js +5 -1
  143. package/dist/app-server/workspace-paths.js.map +1 -1
  144. package/dist/cli-branding.d.ts +1 -1
  145. package/dist/cli-branding.js.map +1 -1
  146. package/dist/cli.d.ts +1 -1
  147. package/dist/cli.js +1 -1
  148. package/dist/cli.js.map +1 -1
  149. package/dist/eval-config-files.d.ts +5 -8
  150. package/dist/interactive-helpers.d.ts +11 -15
  151. package/dist/migrate-utils.d.ts +1 -1
  152. package/dist/results/context.d.ts +1 -1
  153. package/dist/results/format.d.ts +7 -14
  154. package/dist/results/indexer.d.ts +2 -9
  155. package/dist/results/search.d.ts +1 -1
  156. package/dist/results/types.d.ts +2 -11
  157. package/dist/run-interactive.d.ts +21 -23
  158. package/dist/test-results-fixture.d.ts +4 -4
  159. package/package.json +8 -6
  160. package/dist/app/assets/index-Bxq-wlTN.css +0 -1
  161. package/dist/app/assets/index-j_NpCqyK.js +0 -258
  162. package/dist/app/assets/sse-queue-worker-BMo6aPaB.js +0 -1
@@ -1,35 +1,15 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
2
  import { type SseEvent } from './jobs.js';
3
- export type AssistantSseEventType =
4
- | 'session_started'
5
- | 'turn_started'
6
- | 'tool_call_requested'
7
- | 'tool_call_approved'
8
- | 'tool_call_denied'
9
- | 'tool_call_resolved'
10
- | 'assistant_message_completed'
11
- | 'session_warning'
12
- | 'session_error'
13
- | 'session_finished';
3
+ export type AssistantSseEventType = 'session_started' | 'turn_started' | 'tool_call_requested' | 'tool_call_approved' | 'tool_call_denied' | 'tool_call_resolved' | 'assistant_message_completed' | 'session_warning' | 'session_error' | 'session_finished';
14
4
  export type AssistantSseEvent = SseEvent & {
15
- type: AssistantSseEventType;
5
+ type: AssistantSseEventType;
16
6
  };
17
7
  export interface AssistantSseSessionState {
18
- events: AssistantSseEvent[];
19
- clients: Set<ServerResponse>;
8
+ events: AssistantSseEvent[];
9
+ clients: Set<ServerResponse>;
20
10
  }
21
- export declare function createAssistantSseEvent(
22
- type: AssistantSseEventType,
23
- payload: Record<string, unknown>
24
- ): AssistantSseEvent;
25
- export declare function broadcastAssistantSseEvent(
26
- session: AssistantSseSessionState,
27
- event: AssistantSseEvent
28
- ): void;
29
- export declare function serveAssistantSseStream(
30
- req: IncomingMessage,
31
- res: ServerResponse,
32
- session: AssistantSseSessionState
33
- ): void;
11
+ export declare function createAssistantSseEvent(type: AssistantSseEventType, payload: Record<string, unknown>): AssistantSseEvent;
12
+ export declare function broadcastAssistantSseEvent(session: AssistantSseSessionState, event: AssistantSseEvent): void;
13
+ export declare function serveAssistantSseStream(req: IncomingMessage, res: ServerResponse, session: AssistantSseSessionState): void;
34
14
  export declare function endAssistantSseClients(session: AssistantSseSessionState): void;
35
- //# sourceMappingURL=assistant-events.d.ts.map
15
+ //# sourceMappingURL=assistant-events.d.ts.map
@@ -1,8 +1,8 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  interface BrowserLaunchDeps {
3
- platform?: NodeJS.Platform;
4
- spawn?: typeof spawn;
3
+ platform?: NodeJS.Platform;
4
+ spawn?: typeof spawn;
5
5
  }
6
6
  export declare function startBrowser(url: string, deps?: BrowserLaunchDeps): void;
7
7
  export {};
8
- //# sourceMappingURL=browser-launch.d.ts.map
8
+ //# sourceMappingURL=browser-launch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-launch.js","sourceRoot":"","sources":["../../src/app-server/browser-launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAO3C,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,OAA0B,EAAE;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IACnC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACnE,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACjF,OAAO;IACT,CAAC;IACD,MAAM,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"browser-launch.js","sourceRoot":"","sources":["../../src/app-server/browser-launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAO3C,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,IAAI,GAAsB,EAAE;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IACnC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACnE,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACjF,OAAO;IACT,CAAC;IACD,MAAM,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AACzE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type BrowserProviderProfile, type LlmAgentConfig } from '@inspectr/mcplab-core';
2
+ export interface BrowserProviderLearningTraceInput {
3
+ evidenceVersion?: unknown;
4
+ observedGeneration?: unknown;
5
+ selectorValidation?: unknown;
6
+ newConversationEvidence?: unknown;
7
+ events?: unknown;
8
+ }
9
+ export interface BrowserProviderProposal {
10
+ profile: BrowserProviderProfile;
11
+ rationale: string[];
12
+ warnings: string[];
13
+ validated: true;
14
+ }
15
+ export declare function sanitizeBrowserProviderProposalDiagnostics(value: unknown): {
16
+ rationale: string[];
17
+ warnings: string[];
18
+ };
19
+ export declare function sanitizeBrowserProviderLearningTrace(value: BrowserProviderLearningTraceInput): Record<string, unknown>;
20
+ export declare function parseBrowserProviderProposal(text: string, trace?: BrowserProviderLearningTraceInput): BrowserProviderProposal;
21
+ export declare function proposeBrowserProviderProfile(params: {
22
+ agent: LlmAgentConfig;
23
+ profile: BrowserProviderProfile;
24
+ trace: BrowserProviderLearningTraceInput;
25
+ }): Promise<BrowserProviderProposal>;
26
+ //# sourceMappingURL=browser-provider-learning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-provider-learning.d.ts","sourceRoot":"","sources":["../../src/app-server/browser-provider-learning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AASzF,MAAM,WAAW,iCAAiC;IAChD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,sBAAsB,CAAC;IAChC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,wBAAgB,0CAA0C,CAAC,KAAK,EAAE,OAAO,GAAG;IAC1E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAUA;AAED,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,iCAAiC,GACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2MzB;AAkGD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,iCAAiC,GACxC,uBAAuB,CA4CzB;AAED,wBAAsB,6BAA6B,CAAC,MAAM,EAAE;IAC1D,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,sBAAsB,CAAC;IAChC,KAAK,EAAE,iCAAiC,CAAC;CAC1C,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAmCnC"}
@@ -0,0 +1,353 @@
1
+ import { validateBrowserProviderProfile } from '@inspectr/mcplab-core';
2
+ import { chatWithJsonRetry, extractJsonValuesFromAssistantText, parseJsonFromAssistantText } from './assistant-common.js';
3
+ export function sanitizeBrowserProviderProposalDiagnostics(value) {
4
+ const source = value && typeof value === 'object' ? value : {};
5
+ const strings = (candidate) => Array.isArray(candidate)
6
+ ? candidate
7
+ .filter((item) => typeof item === 'string')
8
+ .map((item) => item.slice(0, 500))
9
+ .slice(0, 8)
10
+ : [];
11
+ return { rationale: strings(source.rationale), warnings: strings(source.warnings) };
12
+ }
13
+ export function sanitizeBrowserProviderLearningTrace(value) {
14
+ const object = (candidate) => candidate && typeof candidate === 'object' && !Array.isArray(candidate)
15
+ ? candidate
16
+ : null;
17
+ const short = (candidate, limit = 200) => typeof candidate === 'string' ? candidate.slice(0, limit) : undefined;
18
+ const count = (candidate) => typeof candidate === 'number' && Number.isFinite(candidate) && candidate >= 0
19
+ ? candidate
20
+ : undefined;
21
+ const safeLocator = (candidate) => {
22
+ const segments = object(candidate)?.segments;
23
+ return Array.isArray(segments) &&
24
+ segments.length > 0 &&
25
+ segments.length <= 8 &&
26
+ segments.every((item) => typeof item === 'string')
27
+ ? { segments: segments.map((item) => String(item).slice(0, 500)) }
28
+ : undefined;
29
+ };
30
+ const safeSelectedElement = (candidate) => {
31
+ const item = object(candidate);
32
+ if (!item)
33
+ return undefined;
34
+ const locator = safeLocator(item.locator);
35
+ if (!locator)
36
+ return undefined;
37
+ const attributes = object(item.attributes);
38
+ const evaluations = object(item.selectorEvaluations);
39
+ return {
40
+ locator,
41
+ selectors: Array.isArray(item.selectors)
42
+ ? item.selectors
43
+ .filter((selector) => typeof selector === 'string')
44
+ .slice(0, 12)
45
+ .map((selector) => selector.slice(0, 500))
46
+ : [],
47
+ visible: item.visible === true,
48
+ textLength: count(item.textLength) ?? 0,
49
+ ...(typeof item.changedFromBaseline === 'boolean'
50
+ ? { changedFromBaseline: item.changedFromBaseline }
51
+ : {}),
52
+ ...(typeof item.changedAfterSubmission === 'boolean'
53
+ ? { changedAfterSubmission: item.changedAfterSubmission }
54
+ : {}),
55
+ ...(typeof item.absentAtSubmission === 'boolean'
56
+ ? { absentAtSubmission: item.absentAtSubmission }
57
+ : {}),
58
+ ...(typeof item.candidateScore === 'number' && Number.isFinite(item.candidateScore)
59
+ ? { candidateScore: item.candidateScore }
60
+ : {}),
61
+ ...(attributes
62
+ ? {
63
+ attributes: Object.fromEntries(['role', 'ariaLabel', 'ariaBusy', 'testId', 'dataTest', 'authorRole'].flatMap((key) => short(attributes[key]) === undefined ? [] : [[key, short(attributes[key])]]))
64
+ }
65
+ : {}),
66
+ ...(evaluations
67
+ ? {
68
+ selectorEvaluations: Object.fromEntries(Object.entries(evaluations)
69
+ .slice(0, 12)
70
+ .flatMap(([selector, raw]) => {
71
+ const entry = object(raw);
72
+ return entry
73
+ ? [
74
+ [
75
+ selector.slice(0, 500),
76
+ {
77
+ matchCount: count(entry.matchCount) ?? 0,
78
+ nonAssistantCount: count(entry.nonAssistantCount) ?? 0
79
+ }
80
+ ]
81
+ ]
82
+ : [];
83
+ }))
84
+ }
85
+ : {})
86
+ };
87
+ };
88
+ const events = Array.isArray(value.events)
89
+ ? value.events.slice(-32).map((event) => {
90
+ if (!event || typeof event !== 'object')
91
+ return null;
92
+ const source = event;
93
+ const selected = object(source.selectedElements);
94
+ return {
95
+ phase: typeof source.phase === 'string' ? source.phase : undefined,
96
+ at: typeof source.at === 'string' ? source.at : undefined,
97
+ ...(typeof source.workingActive === 'boolean'
98
+ ? { workingActive: source.workingActive }
99
+ : {}),
100
+ ...(selected
101
+ ? {
102
+ selectedElements: Object.fromEntries(['composer', 'submit', 'assistant', 'generating', 'working', 'idle'].flatMap((role) => {
103
+ const element = safeSelectedElement(selected[role]);
104
+ return element ? [[role, element]] : [];
105
+ }))
106
+ }
107
+ : {}),
108
+ candidateCount: typeof source.candidateCount === 'number' ? source.candidateCount : undefined,
109
+ changedCandidateCount: typeof source.changedCandidateCount === 'number'
110
+ ? source.changedCandidateCount
111
+ : undefined,
112
+ visibleControlCount: typeof source.visibleControlCount === 'number' ? source.visibleControlCount : undefined,
113
+ disabledControlCount: typeof source.disabledControlCount === 'number'
114
+ ? source.disabledControlCount
115
+ : undefined,
116
+ selectedCandidate: source.selectedCandidate && typeof source.selectedCandidate === 'object'
117
+ ? (() => {
118
+ const candidate = source.selectedCandidate;
119
+ return {
120
+ tagName: typeof candidate.tagName === 'string' ? candidate.tagName : undefined,
121
+ testId: typeof candidate.testId === 'string' ? candidate.testId : undefined,
122
+ textLength: typeof candidate.textLength === 'number' ? candidate.textLength : undefined
123
+ };
124
+ })()
125
+ : undefined,
126
+ textHash: typeof source.textHash === 'string' ? source.textHash : undefined,
127
+ snapshot: Array.isArray(source.snapshot)
128
+ ? source.snapshot.slice(-64).flatMap((node) => {
129
+ if (!node || typeof node !== 'object')
130
+ return [];
131
+ const item = node;
132
+ if (typeof item.selector !== 'string' || typeof item.tagName !== 'string')
133
+ return [];
134
+ return [
135
+ {
136
+ selector: item.selector.slice(0, 500),
137
+ tagName: item.tagName.slice(0, 80),
138
+ ...(typeof item.role === 'string' ? { role: item.role.slice(0, 80) } : {}),
139
+ ...(typeof item.ariaLabel === 'string'
140
+ ? { ariaLabel: item.ariaLabel.slice(0, 200) }
141
+ : {}),
142
+ ...(typeof item.testId === 'string'
143
+ ? { testId: item.testId.slice(0, 200) }
144
+ : {}),
145
+ visible: item.visible === true,
146
+ disabled: item.disabled === true,
147
+ textLength: typeof item.textLength === 'number' ? item.textLength : 0
148
+ }
149
+ ];
150
+ })
151
+ : undefined
152
+ };
153
+ })
154
+ : [];
155
+ return {
156
+ ...(value.evidenceVersion === 1 ? { evidenceVersion: 1 } : {}),
157
+ observedGeneration: value.observedGeneration === true,
158
+ selectorValidation: Object.fromEntries(['composer', 'submit', 'assistant'].flatMap((role) => {
159
+ const entry = object(object(value.selectorValidation)?.[role]);
160
+ return entry
161
+ ? [
162
+ [
163
+ role,
164
+ {
165
+ valid: entry.valid === true,
166
+ matchCount: count(entry.matchCount) ?? 0,
167
+ visible: entry.visible === true
168
+ }
169
+ ]
170
+ ]
171
+ : [];
172
+ })),
173
+ ...(object(value.newConversationEvidence)
174
+ ? (() => {
175
+ const evidence = object(value.newConversationEvidence);
176
+ const controlLocator = safeLocator(evidence.controlLocator);
177
+ return controlLocator &&
178
+ ['url-changed', 'assistant-count-reduced'].includes(String(evidence.signal))
179
+ ? {
180
+ newConversationEvidence: {
181
+ controlLocator,
182
+ controlSelectors: Array.isArray(evidence.controlSelectors)
183
+ ? evidence.controlSelectors
184
+ .filter((selector) => typeof selector === 'string')
185
+ .slice(0, 12)
186
+ .map((selector) => selector.slice(0, 500))
187
+ : [],
188
+ signal: evidence.signal,
189
+ beforeAssistantCount: count(evidence.beforeAssistantCount) ?? 0,
190
+ afterAssistantCount: count(evidence.afterAssistantCount) ?? 0
191
+ }
192
+ }
193
+ : {};
194
+ })()
195
+ : {}),
196
+ events
197
+ };
198
+ }
199
+ function validateWorkingLocatorEvidence(profile, trace) {
200
+ const events = Array.isArray(trace.events)
201
+ ? trace.events.filter((event) => Boolean(event && typeof event === 'object' && !Array.isArray(event)))
202
+ : [];
203
+ const submittedIndex = events.findIndex((event) => event.phase === 'submitted');
204
+ const postSubmissionEvents = events.slice(submittedIndex >= 0 ? submittedIndex + 1 : 0);
205
+ const workingEvents = postSubmissionEvents.filter((event) => event.workingActive === true);
206
+ const finalEvent = [...events].reverse().find((event) => event.phase === 'final');
207
+ if (workingEvents.length === 0) {
208
+ if (trace.observedGeneration === true && profile.completion.workingLocator) {
209
+ throw new Error('Working locator evidence is incomplete: no active working event was observed.');
210
+ }
211
+ return { profile, warnings: [] };
212
+ }
213
+ if (!finalEvent || finalEvent.workingActive !== false) {
214
+ throw new Error('Working locator evidence is incomplete: the final event is still active.');
215
+ }
216
+ if (!profile.completion.workingLocator) {
217
+ throw new Error('Working locator evidence is incomplete: the proposal omitted the working locator.');
218
+ }
219
+ const proposedSegments = profile.completion.workingLocator.segments;
220
+ const selectedWorking = workingEvents
221
+ .map((event) => {
222
+ const selected = event.selectedElements;
223
+ if (!selected || typeof selected !== 'object' || Array.isArray(selected))
224
+ return null;
225
+ const working = selected.working;
226
+ return working && typeof working === 'object' && !Array.isArray(working)
227
+ ? working
228
+ : null;
229
+ })
230
+ .filter((working) => working !== null);
231
+ const observedSelectors = selectedWorking.flatMap((working) => [
232
+ ...(Array.isArray(working.selectors)
233
+ ? working.selectors.filter((selector) => typeof selector === 'string')
234
+ : []),
235
+ ...(working.locator &&
236
+ typeof working.locator === 'object' &&
237
+ !Array.isArray(working.locator) &&
238
+ Array.isArray(working.locator.segments)
239
+ ? working.locator.segments.filter((segment) => typeof segment === 'string')
240
+ : [])
241
+ ]);
242
+ const observed = new Set(observedSelectors);
243
+ const proposedIsObserved = proposedSegments.every((segment) => {
244
+ if (observed.has(segment))
245
+ return true;
246
+ const parts = segment.match(/\[[^\]]+\]/g) ?? [];
247
+ return (parts.length > 0 &&
248
+ parts.every((part) => observedSelectors.some((selector) => selector.includes(part))));
249
+ });
250
+ if (proposedIsObserved && !proposedSegments.some((segment) => /aria-busy\s*=/.test(segment))) {
251
+ const transientSelector = observedSelectors.find((selector) => /aria-busy\s*=/.test(selector));
252
+ const baseSelector = proposedSegments.find((segment) => observed.has(segment));
253
+ if (transientSelector && baseSelector && !baseSelector.includes('aria-busy')) {
254
+ const condition = transientSelector.match(/\[[^\]]*aria-busy\s*=\s*["'][^"']+["'][^\]]*\]/i)?.[0];
255
+ if (condition) {
256
+ const narrowed = `${baseSelector}${condition}`;
257
+ return {
258
+ profile: {
259
+ ...profile,
260
+ completion: {
261
+ ...profile.completion,
262
+ workingLocator: { segments: [narrowed] }
263
+ }
264
+ },
265
+ warnings: [
266
+ 'The working locator was narrowed to preserve the observed transient aria-busy state.'
267
+ ]
268
+ };
269
+ }
270
+ }
271
+ }
272
+ if (!proposedIsObserved) {
273
+ throw new Error('Working locator evidence is incomplete: the selector was not observed while working.');
274
+ }
275
+ return { profile, warnings: [] };
276
+ }
277
+ export function parseBrowserProviderProposal(text, trace) {
278
+ const validateProposal = (value) => {
279
+ const parsed = value && typeof value === 'object' && !Array.isArray(value)
280
+ ? value
281
+ : {};
282
+ const rawProfile = parsed.profile ?? parsed;
283
+ const parsedProfile = validateBrowserProviderProfile(rawProfile);
284
+ const rationale = Array.isArray(parsed.rationale)
285
+ ? parsed.rationale.filter((value) => typeof value === 'string').slice(0, 8)
286
+ : [];
287
+ const warnings = Array.isArray(parsed.warnings)
288
+ ? parsed.warnings.filter((value) => typeof value === 'string').slice(0, 8)
289
+ : [];
290
+ const validated = trace
291
+ ? validateWorkingLocatorEvidence(parsedProfile, trace)
292
+ : { profile: parsedProfile, warnings: [] };
293
+ warnings.push(...validated.warnings);
294
+ return {
295
+ profile: validated.profile,
296
+ rationale,
297
+ warnings: warnings.slice(0, 8),
298
+ validated: true
299
+ };
300
+ };
301
+ const candidates = extractJsonValuesFromAssistantText(text);
302
+ const proposals = candidates.filter((value) => value &&
303
+ typeof value === 'object' &&
304
+ !Array.isArray(value) &&
305
+ (Object.hasOwn(value, 'profile') || Object.hasOwn(value, 'schemaVersion')));
306
+ // A final proposal supersedes quoted profiles. Its validation failure must trigger a retry,
307
+ // rather than silently returning the earlier quote or a nested profile without warnings.
308
+ if (proposals.length > 0)
309
+ return validateProposal(proposals.at(-1));
310
+ for (const candidate of candidates.reverse()) {
311
+ try {
312
+ return validateProposal(candidate);
313
+ }
314
+ catch {
315
+ // Retain support for unwrapped profiles and unrelated JSON snippets.
316
+ }
317
+ }
318
+ return parseJsonFromAssistantText(text, validateProposal);
319
+ }
320
+ export async function proposeBrowserProviderProfile(params) {
321
+ const messages = [
322
+ {
323
+ role: 'user',
324
+ content: [
325
+ 'Review this browser-provider learning trace and propose a corrected profile.',
326
+ 'Only change selectors or completion settings when supported by the observed lifecycle.',
327
+ 'Treat workingActive as temporal evidence. A working locator must be active after submission and inactive in the final event.',
328
+ 'Preserve transient attribute conditions such as [aria-busy="true"]. Never broaden a working locator to a persistent response container.',
329
+ 'Return one JSON object with profile, rationale (string array), and warnings (string array).',
330
+ 'Never add executable scripts, URLs outside the existing origin, or raw response content.',
331
+ `Current profile:\n${JSON.stringify(params.profile)}`,
332
+ `Observed trace:\n${JSON.stringify(sanitizeBrowserProviderLearningTrace(params.trace))}`
333
+ ].join('\n\n')
334
+ }
335
+ ];
336
+ const response = await chatWithJsonRetry({
337
+ agent: params.agent,
338
+ messages,
339
+ tools: [],
340
+ system: 'You are a browser automation profile reviewer. Preserve the existing profile shape and identity. Selectors must be CSS selectors observed in the trace. A generation selector must represent an active generating state, an idle selector must represent an enabled completion state, and a working selector must describe the transient working state rather than a persistent response container.',
341
+ parse: (text) => parseBrowserProviderProposal(text, params.trace),
342
+ toolCallFallbackText: () => 'Return the validated browser provider profile JSON.',
343
+ invalidJsonRetryPrompt: 'Your previous response was not a valid browser provider proposal. Return ONLY one JSON object with profile (the complete browser provider profile), rationale (string array), and warnings (string array). Preserve the observed lifecycle constraints and existing profile identity.'
344
+ });
345
+ if ('type' in response)
346
+ throw new Error('The provider proposal model returned a tool request.');
347
+ if (params.profile.newConversation?.confirmation === 'context-change' &&
348
+ response.profile.newConversation?.action === 'click') {
349
+ response.profile.newConversation.confirmation = 'context-change';
350
+ }
351
+ return response;
352
+ }
353
+ //# sourceMappingURL=browser-provider-learning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-provider-learning.js","sourceRoot":"","sources":["../../src/app-server/browser-provider-learning.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,17 @@
1
1
  import type { SourceEvalConfig } from '@inspectr/mcplab-core';
2
2
  export interface ConfigRecord {
3
- id: string;
4
- name: string;
5
- path: string;
6
- relativePath: string;
7
- suitePath: string;
8
- mtime: string;
9
- hash: string;
10
- config: SourceEvalConfig;
11
- error?: string;
12
- warnings?: string[];
3
+ id: string;
4
+ name: string;
5
+ path: string;
6
+ relativePath: string;
7
+ suitePath: string;
8
+ mtime: string;
9
+ hash: string;
10
+ config: SourceEvalConfig;
11
+ error?: string;
12
+ warnings?: string[];
13
13
  }
14
- export declare function readConfigRecord(
15
- absPath: string,
16
- evalsDir: string,
17
- bundleRoot?: string
18
- ): ConfigRecord;
19
- export declare function readConfigRecordOrInvalid(
20
- absPath: string,
21
- evalsDir: string,
22
- bundleRoot?: string
23
- ): ConfigRecord;
14
+ export declare function readConfigRecord(absPath: string, evalsDir: string, bundleRoot?: string): ConfigRecord;
15
+ export declare function readConfigRecordOrInvalid(absPath: string, evalsDir: string, bundleRoot?: string): ConfigRecord;
24
16
  export declare function listConfigs(evalsDir: string, bundleRoot?: string): ConfigRecord[];
25
- //# sourceMappingURL=config-store.d.ts.map
17
+ //# sourceMappingURL=config-store.d.ts.map
@@ -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
@@ -1,22 +1,12 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
2
  import type { AppRouteDeps, AppRouteRequestContext } from './app-context.js';
3
- export type EvalsRouteDeps = Pick<
4
- AppRouteDeps,
5
- | 'parseBody'
6
- | 'asJson'
7
- | 'listConfigs'
8
- | 'safeFileName'
9
- | 'ensureInsideRoot'
10
- | 'decodeEvalId'
11
- | 'readConfigRecord'
12
- | 'readConfigRecordOrInvalid'
13
- >;
3
+ export type EvalsRouteDeps = Pick<AppRouteDeps, 'parseBody' | 'asJson' | 'listConfigs' | 'safeFileName' | 'ensureInsideRoot' | 'decodeEvalId' | 'readConfigRecord' | 'readConfigRecordOrInvalid'>;
14
4
  export declare function handleEvalsRoutes(params: {
15
- req: IncomingMessage;
16
- res: ServerResponse;
17
- pathname: string;
18
- method: string;
19
- settings: AppRouteRequestContext['settings'];
20
- deps: EvalsRouteDeps;
5
+ req: IncomingMessage;
6
+ res: ServerResponse;
7
+ pathname: string;
8
+ method: string;
9
+ settings: AppRouteRequestContext['settings'];
10
+ deps: EvalsRouteDeps;
21
11
  }): Promise<boolean>;
22
- //# sourceMappingURL=evals-routes.d.ts.map
12
+ //# sourceMappingURL=evals-routes.d.ts.map
@@ -0,0 +1,11 @@
1
+ import type { ResultsJson } from '@inspectr/mcplab-core';
2
+ /** Combine persisted child runs into a read-only parent result representation. */
3
+ export declare function aggregateEvaluationGroupResults(params: {
4
+ groupId: string;
5
+ runId: string;
6
+ children: ResultsJson[];
7
+ evaluationName?: string;
8
+ failedChildren?: number;
9
+ stoppedChildren?: number;
10
+ }): ResultsJson;
11
+ //# sourceMappingURL=evaluation-group-results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluation-group-results.d.ts","sourceRoot":"","sources":["../../src/app-server/evaluation-group-results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,uBAAuB,CAAC;AAErE,kFAAkF;AAClF,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,WAAW,CAyCd"}
@@ -0,0 +1,46 @@
1
+ /** Combine persisted child runs into a read-only parent result representation. */
2
+ export function aggregateEvaluationGroupResults(params) {
3
+ const children = params.children;
4
+ const totalRuns = children.reduce((sum, result) => sum + result.summary.total_runs, 0);
5
+ const totalScenarios = children.reduce((sum, result) => sum + result.summary.total_scenarios, 0);
6
+ const weighted = (field) => {
7
+ if (totalRuns === 0)
8
+ return null;
9
+ const values = children.map((result) => result.summary[field]);
10
+ if (field === 'avg_tool_latency_ms' && values.some((value) => value === null))
11
+ return null;
12
+ return children.reduce((sum, result) => sum + (result.summary[field] ?? 0) * result.summary.total_runs, 0) / totalRuns;
13
+ };
14
+ const outcomes = { passed: 0, failed: params.failedChildren ?? 0, incomplete: 0, error: params.stoppedChildren ?? 0 };
15
+ for (const result of children) {
16
+ for (const outcome of Object.keys(outcomes)) {
17
+ outcomes[outcome] += result.summary.outcomes?.[outcome] ?? 0;
18
+ }
19
+ }
20
+ return {
21
+ metadata: {
22
+ run_id: params.runId,
23
+ timestamp: new Date().toISOString(),
24
+ config_hash: children[0]?.metadata.config_hash ?? params.groupId,
25
+ cli_version: children[0]?.metadata.cli_version ?? 'unknown',
26
+ mcp_server_versions: {},
27
+ execution_client: 'mixed',
28
+ config_name: params.evaluationName || `Evaluation group ${params.groupId}`,
29
+ run_note: params.evaluationName ? `Combined evaluation: ${params.evaluationName}` : `Evaluation group ${params.groupId}`,
30
+ rerun_agents: children.flatMap((result) => result.metadata.rerun_agents ?? []),
31
+ child_run_ids: children.map((result) => result.metadata.run_id),
32
+ evaluation_group_id: children[0]?.metadata.evaluation_group_id ?? params.groupId,
33
+ evaluation_run_id: params.runId
34
+ },
35
+ summary: {
36
+ total_scenarios: totalScenarios,
37
+ total_runs: totalRuns,
38
+ pass_rate: totalRuns === 0 ? 0 : outcomes.passed / totalRuns,
39
+ avg_tool_calls_per_run: weighted('avg_tool_calls_per_run') ?? 0,
40
+ avg_tool_latency_ms: weighted('avg_tool_latency_ms'),
41
+ outcomes
42
+ },
43
+ scenarios: children.flatMap((result) => result.scenarios)
44
+ };
45
+ }
46
+ //# sourceMappingURL=evaluation-group-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluation-group-results.js","sourceRoot":"","sources":["../../src/app-server/evaluation-group-results.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ResultsJson } from '@inspectr/mcplab-core';
2
+ export declare function projectEvaluationJournal(params: {
3
+ runsDir: string;
4
+ evaluationRunId: string;
5
+ evaluationName?: string;
6
+ runNote?: string;
7
+ executionStatus?: 'stopped';
8
+ }): ResultsJson | null;
9
+ //# sourceMappingURL=evaluation-journal-projection.d.ts.map