@wix/pathgrade 1.0.23 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/sdk/agent.js CHANGED
@@ -19,6 +19,7 @@ import { cleanDebugRuns, DEFAULT_DEBUG_RETAIN_RUNS, prepareManagedDebugRun, } fr
19
19
  import { collectOpenCodeMcpToolNames, validateOpenCodeDeclaration } from '../agents/opencode/contract.js';
20
20
  import { collectSensitiveEnvValues } from '../tool-event-results.js';
21
21
  import { compileMcpMockApprovalSession, } from './mcp-mock-approvals.js';
22
+ import { createAskUserHandler } from './ask-bus/handler.js';
22
23
  /**
23
24
  * Test-only injection point: override the sink used by the next emitter
24
25
  * built inside `createAgent`. Pass `null` to restore the default (stderr).
@@ -196,10 +197,17 @@ class AgentImpl {
196
197
  throw new Error('prompt() can only be called once per agent');
197
198
  }
198
199
  const ms = this.createSession(this.resolveTimeoutSec('prompt'));
200
+ const askUser = createAskUserHandler({
201
+ reactions: [],
202
+ onUnmatchedAskUser: 'decline',
203
+ firedOnce: new Set(),
204
+ });
205
+ const unsubscribeAskUser = ms.askBus.onAsk(askUser.handler);
199
206
  try {
200
207
  return await this.executeLoggedTurn(ms, message, 1, 'agent_start');
201
208
  }
202
209
  finally {
210
+ unsubscribeAskUser();
203
211
  await ms.dispose?.();
204
212
  }
205
213
  }
@@ -1,4 +1,4 @@
1
- import { extractSkillsFromLog } from '../tool-events.js';
1
+ import { extractSkillsFromLog, extractToolEventsFromLog } from '../tool-events.js';
2
2
  import { getRuntime } from './eval-runtime.js';
3
3
  import { emitEvalResult } from './result-capture.js';
4
4
  import { runJudgePipeline } from './judge-pipeline.js';
@@ -34,9 +34,7 @@ export class EvalScorerError extends Error {
34
34
  function makeEvaluateAgent() {
35
35
  const conversationAttributed = new WeakSet();
36
36
  return async function evaluateAgent(agent, scorers, opts) {
37
- const toolEvents = agent.log
38
- .filter((e) => e.type === 'tool_event' && e.tool_event)
39
- .map((e) => e.tool_event);
37
+ const toolEvents = extractToolEventsFromLog(agent.log);
40
38
  const ctx = {
41
39
  workspace: agent.workspace,
42
40
  log: agent.log,
@@ -14,6 +14,7 @@ export { runScorer } from './run-scorer.js';
14
14
  export { previewReactions } from './reaction-preview.js';
15
15
  export { setRuntime, resetRuntime } from './eval-runtime.js';
16
16
  export { DEFAULT_COPY_IGNORE } from '../providers/copy-filter.js';
17
+ export { extractToolEventsFromLog } from '../tool-events.js';
17
18
  export { createAskBus, requireAskBusForLiveBatches, AskBusTimeoutError } from './ask-bus/bus.js';
18
19
  export { toAskUserToolEvent } from './ask-bus/projection.js';
19
20
  export type { AskUserToolEvent, AskUserToolEventArguments, AskUserToolEventQuestionArgument, } from './ask-bus/projection.js';
package/dist/sdk/index.js CHANGED
@@ -14,6 +14,7 @@ export { runScorer } from './run-scorer.js';
14
14
  export { previewReactions } from './reaction-preview.js';
15
15
  export { setRuntime, resetRuntime } from './eval-runtime.js';
16
16
  export { DEFAULT_COPY_IGNORE } from '../providers/copy-filter.js';
17
+ export { extractToolEventsFromLog } from '../tool-events.js';
17
18
  export { createAskBus, requireAskBusForLiveBatches, AskBusTimeoutError } from './ask-bus/bus.js';
18
19
  export { toAskUserToolEvent } from './ask-bus/projection.js';
19
20
  export { buildAskBatchLogEntries } from './agent-result-log.js';
@@ -44,6 +44,8 @@ export interface ExpectedMcpToolCall {
44
44
  serverName?: string;
45
45
  toolName?: string;
46
46
  status?: string;
47
+ invocation?: McpInvocationResult['invocation'];
48
+ outcome?: McpInvocationResult['outcome'];
47
49
  argumentsContaining?: Record<string, unknown>;
48
50
  }
49
51
  export interface McpStartupStatusEvidence {
@@ -127,6 +127,17 @@ function matchesMcpToolCall(call, expected) {
127
127
  return false;
128
128
  if (expected.status !== undefined && call.status !== expected.status)
129
129
  return false;
130
+ if (expected.invocation !== undefined || expected.outcome !== undefined) {
131
+ const invocation = getMcpInvocation(call.event);
132
+ if (!invocation)
133
+ return false;
134
+ if (invocation.serverName !== call.serverName || invocation.toolName !== call.toolName)
135
+ return false;
136
+ if (expected.invocation !== undefined && invocation.invocation !== expected.invocation)
137
+ return false;
138
+ if (expected.outcome !== undefined && invocation.outcome !== expected.outcome)
139
+ return false;
140
+ }
130
141
  if (expected.argumentsContaining && !containsArguments(call.arguments, expected.argumentsContaining)) {
131
142
  return false;
132
143
  }
@@ -1,11 +1,10 @@
1
+ import { extractToolEventsFromLog } from '../tool-events.js';
1
2
  import { sanitizePersistenceValue } from '../tool-event-results.js';
2
3
  import fs from 'fs-extra';
3
4
  export const RUN_SNAPSHOT_VERSION = 2;
4
5
  export function buildRunSnapshot(params) {
5
6
  const { agent, messages, log, conversationResult, workspace, timestamp } = params;
6
- const toolEvents = log
7
- .filter((entry) => entry.type === 'tool_event' && entry.tool_event)
8
- .map((entry) => entry.tool_event);
7
+ const toolEvents = extractToolEventsFromLog(log);
9
8
  return sanitizePersistenceValue({
10
9
  version: agent === 'opencode' ? 2 : 1,
11
10
  timestamp: timestamp ?? new Date().toISOString(),
@@ -59,6 +59,11 @@ export declare function extractSkillsFromLog(log: ReadonlyArray<{
59
59
  type: string;
60
60
  tool_event?: ToolEvent;
61
61
  }>): string[];
62
+ /** Extract normalized tool events from a session log. */
63
+ export declare function extractToolEventsFromLog(log: ReadonlyArray<{
64
+ type: string;
65
+ tool_event?: ToolEvent;
66
+ }>): ToolEvent[];
62
67
  /**
63
68
  * Extract deduplicated skill names from tool events that have action 'use_skill'.
64
69
  */
@@ -93,10 +93,13 @@ export function buildSummary(action, toolName, args) {
93
93
  * Filters for tool_event entries, then delegates to extractSkillsFromToolEvents.
94
94
  */
95
95
  export function extractSkillsFromLog(log) {
96
- const toolEvents = log
96
+ return extractSkillsFromToolEvents(extractToolEventsFromLog(log));
97
+ }
98
+ /** Extract normalized tool events from a session log. */
99
+ export function extractToolEventsFromLog(log) {
100
+ return log
97
101
  .filter((e) => e.type === 'tool_event' && e.tool_event != null)
98
102
  .map((e) => e.tool_event);
99
- return extractSkillsFromToolEvents(toolEvents);
100
103
  }
101
104
  /**
102
105
  * Extract deduplicated skill names from tool events that have action 'use_skill'.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/pathgrade",
3
- "version": "1.0.23",
3
+ "version": "1.0.25",
4
4
  "packageManager": "yarn@4.12.0",
5
5
  "description": "Evaluate whether AI agents discover and use your skills correctly",
6
6
  "exports": {
@@ -140,5 +140,5 @@
140
140
  "typescript": "^5.9.3",
141
141
  "zod": "4.3.6"
142
142
  },
143
- "falconPackageHash": "0debc4519da71de54bc8ca58c57f1ddbf0899cc2b06cbf908371e1e8"
143
+ "falconPackageHash": "b936e0a54540b195856329c07c81e71818b9e4de30b90e768e9058d6"
144
144
  }